smuxi-1.1/0000775000175000017500000000000014011526504013316 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-IRC/0000775000175000017500000000000014011526503015551 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-IRC/LINGUAS0000664000175000017500000000014314011526464016602 0ustar00meebeymeebey00000000000000ca cs da de el en_GB es fa fi fr hr hu id it lt nb nl pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Engine-IRC/en_GB.po0000664000175000017500000002370514011526464017100 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2009 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # Ryan Smith-Evans , 2009. # msgid "" msgstr "" "Project-Id-Version: smuxi 0.6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-08-05 01:46+0200\n" "PO-Revision-Date: 2010-01-08 23:53+0100\n" "Last-Translator: Ryan Smith-Evans \n" "Language-Team: English (British)\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:221 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1425 msgid "away" msgstr "away" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:227 #, csharp-format msgid "lag: {0} seconds" msgstr "lag: {0} seconds" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:233 msgid "not connected" msgstr "not connected" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:301 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Connecting to {0} port {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:402 #, csharp-format msgid "Connection to {0} established" msgstr "Connection to {0} established" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:310 msgid "Logging in..." msgstr "Logging in..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:333 msgid "Connection failed!" msgstr "Connection failed!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:334 msgid "Connection failed! Reason: " msgstr "Connection failed! Reason: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:343 msgid "Disconnecting..." msgstr "Disconnecting..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:346 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Disconnecting from {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:351 #, csharp-format msgid "Disconnected from {0}" msgstr "Disconnected from {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:354 msgid "Connection closed" msgstr "Connection closed" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:359 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:416 msgid "Not connected" msgstr "Not connected" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:388 msgid "Reconnecting..." msgstr "Reconnecting..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:396 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconnecting to {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:410 msgid "Reconnect Error" msgstr "Reconnection Error" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:760 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager Commands" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:829 #, csharp-format msgid "Invalid port: {0}" msgstr "Invalid port: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:957 #, csharp-format msgid "Queuing joins: {0}" msgstr "Queuing joins: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:971 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Already joined to channel: {0}. Type /window {0} to switch to it." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1006 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Active joins: {0} - Queued joins: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1029 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1060 #, csharp-format msgid "Joining: {0}" msgstr "Joining: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1031 msgid "Remaining" msgstr "Remaining" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1036 #, csharp-format msgid "active joins: {0}" msgstr "active joins: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 #, csharp-format msgid "queued joins: {0}" msgstr "queued joins: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1412 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1414 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1416 msgid "Voice" msgstr "Voice" #. For translators: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1478 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Topic for {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1488 #, csharp-format msgid "No topic set for {0}" msgstr "No topic set for {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1582 msgid "ban" msgstr "ban" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1592 msgid "No bans in channel" msgstr "No bans in channel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1706 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Inviting {0} to {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1710 #, fuzzy, csharp-format msgid "{0} is already on {1}" msgstr "{0} is already on channel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1738 msgid "Users" msgstr "Users" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1789 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total of {0} users [{1} ops, {2} voices, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1932 msgid "Connection error! Reason: " msgstr "Connection error! Reason: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1942 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Not enough parameters for {0} command" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1952 msgid "Not connected to server" msgstr "Not connected to server" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2333 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: No such nick/channel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2459 #, csharp-format msgid "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "Increased send delay to {0}ms to avoid being flooded from the server again." #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2475 msgid "Nick" msgstr "Nick" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2486 msgid "is already in use" msgstr "is already in use" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2516 msgid "Cannot join to channel:" msgstr "Cannot join to channel:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2525 msgid "You are banned" msgstr "You are banned" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2635 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] requested CTCP {2} from {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2660 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING reply from {0}: {1} seconds" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2668 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} reply from {1}: {2}" #. For translators: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2915 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] has joined {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3051 #, csharp-format msgid "{0} [{1}] has left {2} [{3}]" msgstr "{0} [{1}] has left {2} [{3}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3070 #, csharp-format msgid "You were kicked from {0} by {1} [{2}]" msgstr "You were kicked from {0} by {1} [{2}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3078 #, csharp-format msgid "{0} was kicked from {1} by {2} [{3}]" msgstr "{0} was kicked from {1} by {2} [{3}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3096 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3142 #, csharp-format msgid "You're now known as {0}" msgstr "You're now known as {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3170 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} is now known as {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3227 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} changed the topic of {1} to: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3312 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Mode change [{0}] for user {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3329 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] by {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3366 #, csharp-format msgid "{0} [{1}] has quit [{2}]" msgstr "{0} [{1}] has quit [{2}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3487 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} is away: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3493 msgid "You are no longer marked as being away" msgstr "You are no longer marked as being away" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3499 msgid "You have been marked as being away" msgstr "You have been marked as being away" #~ msgid "Not connected!" #~ msgstr "Not connected!" #~ msgid "lag" #~ msgstr "lag" smuxi-1.1/po-Engine-IRC/cs.po0000664000175000017500000003036714011526464016535 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013 # Marek Černocký , 2016, 2017. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:44+0000\n" "PO-Revision-Date: 2017-11-05 13:09+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: čeština \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.7\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} vás zve do {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Přijmout pozvání (vstoupit do místnosti)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "pryč" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "zpoždění: {0} sekund" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "nepřipojen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Používá se proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Připojuje se k serveru {0} na portu {1}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Spojení se serverem {0} je navázáno" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Přihlašuje se…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Připojení selhalo!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Připojení selhalo! Příčina: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Poradit otevřením dotazů a odpovědí" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Odpojuje se…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Odpojuje se od serveru {0}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Odpojeno od serveru {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Spojení bylo ukončeno" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Nepřipojeno" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Opětovně se připojuje…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Opětovně se připojuje k serveru {0}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Chyba při opětovném připojování" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Uspáno na {0} milisekund" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Příkazy správce protokolu IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Neplatný port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Vstup se zařazuje do fronty: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Již jste v místnosti: {0}. Pro přepnutí na tuto místnost zadejte /window {0}." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktivní vstupy: {0} – Vstupy ve frontě: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Vstupuje se do místnosti: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Zbývající" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "aktivní vstupy: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "vstupy ve frontě: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "Operátor IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Majitel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Správce místnosti" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Operátor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Částečný operátor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Hlas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Téma pro místnost {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Místnost {0} nemá nastavené žádné téma" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "zákaz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "V místnosti nikdo nemá zákaz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "výjimka ze zákazů" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "V místnosti nejsou žádné výjimky ze zákazů" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "výjimka z pozvánek" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "V místnosti nejsou žádné výjimky z pozvánek" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Váš uživatelský režim je {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} je již v místnosti {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "{0} je zván do místnosti {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Uživatelé" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Celkem {0} uživatelů [{1} operátorů, {2} hlasových, {3} normálních]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Chyba spojení! Příčina: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pro příkaz {0} nebyl zadán dostatek parametrů" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Nepřipojeno k serveru" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Taková přezdívka/místnost neexistuje" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Aby nedošlo opět k zahlcení serveru, bylo zvýšeno zpoždění odesílání na {0} " "ms." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Přezdívka {0} se již používá" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Nelze vstoupit do místnosti:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Dostali jste zákaz" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] požádal o CTCP {2} od uživatele {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Odpověď CTCP PING od uživatele {0}: {1} s" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Odpověď CTCP {0} od uživatele {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] vstoupil do místnosti {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] opustil místnost {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Byli jste vykopnuti z místnosti {0} uživatelem {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} byl vykopnut z místnosti {1} uživatelem {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Nyní jste znám jako {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} je nyní znám jako {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} změnil téma {1} na: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Změna režimu [{0}] uživatele {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "režim/{0} [{1}] od uživatele {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] se odpojil" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Připojení k serveru {0} na portu {1} selhalo (pokus {2}); další pokus za {3} " "s…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} je pryč: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Nadále nebudete označován, že jste pryč" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Byl jste označen, že jste pryč" smuxi-1.1/po-Engine-IRC/zh_CN.po0000664000175000017500000002653214011526464017130 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2013-12-13 08:02+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} 邀请您加入 {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "接受邀请 (加入房间)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "离开" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "延后: {0} 秒" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "未连接" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "使用代理: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "正在连接到 {0} 端口 {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "到 {0} 的连接已建立" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "正在登录..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "连接失败!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "连接失败! 原因: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "正在断开连接..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "正在从 {0} 断开连接..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "已从 {0} 断开连接" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "连接已关闭" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "未连接" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "正在重新连接..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "正在重新连接到 {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "重新连接出错" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "睡眠 {0} 毫秒" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager 命令" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "端口无效: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "正等待加入: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "已经加入了频道: {0}。输入 /window {0} 切换过去。" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "已经加入: {0} - 等待加入: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "正在加入: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "剩余" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "已经加入: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "等待加入: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "IRC 版主" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "主人" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "超级版主" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "版主" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "版主" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "认证用户" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "{0} 的主题: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "{0} 尚未设定主题" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "封禁" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "频道内无被封禁用户" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "封禁例外" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "频道内无封禁例外用户" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "邀请例外" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "频道内无邀请例外用户" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "您的用户模式为 {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} 已在 {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "正在邀请 {0} 加入 {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "用户" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "总计 {0} 位用户 [{1} 位版主, {2} 位认证用户, {3} 位普通用户]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "连接出错! 原因: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "{0} 命令参数不足" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "未连接到服务器" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: 无此昵称/频道" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "发送延时已增加到 {0}ms 以避免再次被服务器挤出。" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "昵称 {0} 已被占用" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "无法加入频道:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "您已被封禁" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] 请求 CTCP {2} 来自 {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING 回复来自 {0}: {1} 秒" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} 回复来自 {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3207 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] 已加入 {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3349 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] 已离开 {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3374 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "您被 {1} 从 {0} 踢出" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3382 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} 被 {2} 从 {1} 踢出" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3432 #, csharp-format msgid "You're now known as {0}" msgstr "您现在的昵称为 {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3435 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} 现在的昵称为 {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3469 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} 将主题 {1} 改为: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3629 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "用户 {1} 模式更改 [{0}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3660 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "模式/{0} [{1}] by {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3696 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] 已退出" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3786 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "到 {0} 端口 {1} 的连接失败 (第 {2}次尝试), 将在 {3} 秒后重试..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3836 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} 离开: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3846 msgid "You are no longer marked as being away" msgstr "您不再被标为离开状态" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3856 msgid "You have been marked as being away" msgstr "您已被标为离开状态" smuxi-1.1/po-Engine-IRC/sk.po0000664000175000017500000002573514011526464016550 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2011-09-30 08:38+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:234 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} vás pozýva na {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1468 msgid "away" msgstr "preč" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:261 #, csharp-format msgid "lag: {0} seconds" msgstr "oneskorenie: {0} sekúnd" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:267 msgid "not connected" msgstr "nepripojené" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:337 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Pripája sa k {0} port {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:343 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:438 #, csharp-format msgid "Connection to {0} established" msgstr "Pripojenie k {0} nadviazané" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:346 msgid "Logging in..." msgstr "Prihlasovanie..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:369 msgid "Connection failed!" msgstr "Pripojenie zlyhalo!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:370 msgid "Connection failed! Reason: " msgstr "Pripojenie zlyhalo! Príčina: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 msgid "Disconnecting..." msgstr "Odpájanie..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:382 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Odpájanie od {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:387 #, csharp-format msgid "Disconnected from {0}" msgstr "Odpojené od {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:390 msgid "Connection closed" msgstr "Pripojenie zatvorené" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:395 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:452 msgid "Not connected" msgstr "Nepripojené" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:424 msgid "Reconnecting..." msgstr "Opätovné pripájanie..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:432 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Opätovné pripájanie k {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:446 msgid "Reconnect Error" msgstr "Chyba pri opätovnom pripojovaní" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:816 msgid "IrcProtocolManager Commands" msgstr "Príkazy správcu protokolu Irc" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:887 #, csharp-format msgid "Invalid port: {0}" msgstr "Neplatný port: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:997 #, csharp-format msgid "Queuing joins: {0}" msgstr "Zaraďovanie pripojenia do frontu: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1011 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Už ste pripojení na kanál: {0}. Pre prepnutie na tento kanál zadajte " "/window." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1046 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktívne pripojenia: {0} - Front s pripojeniami: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1069 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1100 #, csharp-format msgid "Joining: {0}" msgstr "Pripájanie: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1071 msgid "Remaining" msgstr "Ostávajúci" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1076 #, csharp-format msgid "active joins: {0}" msgstr "aktívne pripojenia: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1085 #, csharp-format msgid "queued joins: {0}" msgstr "front s pripojeniami: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1455 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1457 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1459 msgid "Voice" msgstr "Hlas" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1519 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Téma pre {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1524 #, csharp-format msgid "No topic set for {0}" msgstr "{0} nemá nastavenú tému" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1604 msgid "ban" msgstr "zákaz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1614 msgid "No bans in channel" msgstr "V kanále nie sú žiadne zákazy" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1726 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Pozvanie {0} do {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1730 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} je už na {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "Users" msgstr "Používatelia" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1797 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Celkom {0} používateľov [{1} opov, {2} hlasových, {3} normálnych]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1928 msgid "Connection error! Reason: " msgstr "Chyba spojenia! Príčina: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1938 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pre príkaz {0} nie je vložený dostatok parametrov" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1948 msgid "Not connected to server" msgstr "Nie je pripojené k serveru" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2156 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Neplatná prezývka/kanál" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2279 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Aby opäť nedošlo k zahlteniu servera, bolo zvýšené oneskorenie odoslania na " "{0} ms." #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2293 msgid "Nick" msgstr "Prezývka" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2303 msgid "is already in use" msgstr "sa už používa" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2329 msgid "Cannot join to channel:" msgstr "Nie je možné pripojiť na kanál:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2337 msgid "You are banned" msgstr "Dostali ste zákaz" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2413 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] požiadal o CTCP {2} od {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2438 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "odpoveď CTCP PING od {0}: {1} sekúnd" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2446 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} odpoveď od {1}: {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2643 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] sa pripojil {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2769 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] opustil {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2794 #, csharp-format msgid "You were kicked from {0} by {1} [{2}]" msgstr "Boli ste vykopnutí z {0} používateľom {1} [{2}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2802 #, csharp-format msgid "{0} was kicked from {1} by {2} [{3}]" msgstr "{0} bol vykopnutí z {1} používateľom {2} [{3}]" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2819 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2852 #, csharp-format msgid "You're now known as {0}" msgstr "Teraz ste známi ako {0}" #. TRANSLATOR: do NOT change the position of {0} or {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2857 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} je teraz známy ako {1}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2894 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} zmenil tému {1} na: {2}" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2970 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Zmena režimu [{0}] používateľa {1}" #. TRANSLATOR: do NOT change the position of {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "režim/{0} [{1}] od {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3017 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] ukončil" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3094 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Pripojenie k {0} port {1} zlyhalo (pokus č. {2}), opakovanie za {3} " "sekúnd..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3143 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} je preč: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3149 msgid "You are no longer marked as being away" msgstr "Nebudete viac označovaní, že ste preč" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3155 msgid "You have been marked as being away" msgstr "Boli ste označení, že ste preč" smuxi-1.1/po-Engine-IRC/el.po0000664000175000017500000003242514011526464016525 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:41+0000\n" "PO-Revision-Date: 2015-07-20 11:41+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "Ο {0} σας προσκαλεί στο {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "Αποδοχή πρόσκλησης (συμμετοχή στην αίθουσα)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "απών" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "καθυστέρηση: {0} δευτερόλεπτα" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "δε συνδέθηκε" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Χρήση διαμεσολαβητή: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Σύνδεση με το {0} θύρα {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "Επιτεύχθηκε η σύνδεση με το {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "Γίνεται σύνδεση..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "Αποτυχία σύνδεσης!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "Αποτυχία σύνδεσης! Αιτία: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "Αποσυνδέεται..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Αποσυνδέεται από το {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "Αποσυνδέθηκε από το {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "Η σύνδεση έκλεισε" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "Δεν συνδέθηκε" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "Επανασυνδέεται..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Επανασυνδέεται στο {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "Σφάλμα επανασύνδεσης" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Ύπνωση για {0} ms" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "Εντολές IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "Άκυρη θύρα: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "Συνδέσεις σε αναμονή: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Ήδη συνδεμένο με το κανάλι: {0}. Τύπος /παράθυρο {0} για εναλλαγή του." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Ενεργές συνδέσεις: {0} Συνδέσεις σε αναμονή: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "Σύνδεση με: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "Απομένουν" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "ενεργές συνδέσεις: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "συνδέσεις σε αναμονή: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "Χειριστής IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "Κάτοχος" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "Διαχειριστής καναλιού" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "Χειριστής" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "Ημιχειριστής" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "Φωνή" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Θέμα για {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "Δεν ορίστηκε θέμα για το {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "απαγόρευση" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "Χωρίς απαγορεύσεις στο κανάλι" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "εξαίρεση απαγόρευσης" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "Χωρίς εξαιρέσεις απαγόρευσης στο κανάλι" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "εξαίρεση πρόσκλησης" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "Χωρίς εξαιρέσεις πρόσκλησης στο κανάλι" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "Η κατάσταση χρήστη σας είναι {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "ο {0} είναι ήδη ενεργός στο {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Πρόσκληση του {0} στο {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "Χρήστες" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Σύνολο {0} χρηστών [{1} χειριστές, {2} φωνές, {3} κανονικοί]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "Σφάλμα σύνδεσης! Αιτία: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ανεπαρκείς παράμετροι στην εντολή {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "Δεν υπάρχει σύνδεση με τον διακομιστή" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Δεν υπάρχει τέτοιο ψευδώνυμο/κανάλι" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Αυξημένη καθυστέρηση αποστολής σε {0}ms προς αποφυγή κατακλυσμού του " "διακομιστή ξανά." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "Το ψευδώνυμο {0} χρησιμοποιείται ήδη" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "Αδύνατη η σύνδεση με το κανάλι:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "Είσαστε σε απαγόρευση" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] ζήτησε CTCP {2} απότον {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Απάντηση CTCP PING από {0}: {1} δευτερόλεπτα" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Απάντηση CTCP {0} από {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3210 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] έχει συνδεθεί με το {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3355 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "Ο {0} [{1}] έχει φύγει {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3380 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Έχετε διωχθεί από το {0} και τον {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3388 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "Ο {0} διώχτηκε από το {1} και τον {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3406 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3438 #, csharp-format msgid "You're now known as {0}" msgstr "Είσαστε τώρα γνωστός ως {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3441 #, csharp-format msgid "{0} is now known as {1}" msgstr "Ο {0} είναι τώρα γνωστός ως {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3475 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "Ο {0} άλλαξε το θέμα του {1} σε: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3635 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Αλλαγή κατάστασης [{0}] για τον χρήστη {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3666 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "κατάσταση/{0} [{1}] από {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3702 #, csharp-format msgid "{0} [{1}] has quit" msgstr "Ο {0} [{1}] έχει φύγει" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3801 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Σύνδεση με {0} θύρα {1} έχει αποτύχει (προσπάθεια {2}), νέα προσπάθεια σε " "{3} δευτερόλεπτα..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3851 #, csharp-format msgid "{0} is away: {1}" msgstr "Ο {0} είναι απών: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3861 msgid "You are no longer marked as being away" msgstr "Δεν είσαστε πια χαρακτηρισμένος ως απών" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3871 msgid "You have been marked as being away" msgstr "Έχετε σημείωθεί ως απών" smuxi-1.1/po-Engine-IRC/ro.po0000664000175000017500000003007514011526464016544 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:18+0000\n" "PO-Revision-Date: 2018-04-06 21:17+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 " "< 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} vă invită la {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Acceptați invitația (alăturare la cameră)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "absent" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "întârziere: {0} secunde" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "neconectat" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilizând proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Se conectează la {0} portul {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Conexiune la {0} stabilită" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Se autentifică..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Conexiunea a eșuat!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Conexiunea a eșuat! Motivul: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Deschide FAQ Smuxi pentru ajutor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Se deconectează..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Se deconectează de la {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Deconectat de la {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Conexiune închisă" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Neconectat" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Se reconectează..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Se reconectează la {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Eroare de reconectare" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Se doarme pentru {0} milisecunde" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Comenzi IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Port nevalid: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Se plasează în așteptare alăturările: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Sunteți deja alăturat canalului: {0}. Tastați /window {0} pentru a comuta " "la acesta." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Alăturări active: {0} - alăturări în așteptare: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Se alătură la: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Rămas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "alăturări active: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "alăturări în așteptare: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "Operator IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Deținător" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Admin canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Operator" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Operator pe jumătate" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voce" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Subiect pentru {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Niciun subiect stabilit pentru {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "blocare" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Nu sunt blocări în canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "excepție de la blocare" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Nu sunt excepții de blocare în canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "excepție de invitație" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Nu sunt excepții de invitație în canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Modul de utilizator este {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} este deja la {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Se invită {0} la {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Utilizatori" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total de {0} utilizatori [{1} operatori, {2} voci, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Eroare de conexiune! Motivul: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nu sunt suficienți parametri pentru comanda {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Nu este conectat la server" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: niciun astfel de pseudonim/canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "S-a mărit întârzierea de trimitere la {0}ms pentru a evita să fiți dat " "afară de pe server din nou." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Pseudonimul {0} este deja în uz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Nu se poate alătura la canalul:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Sunteți blocat" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] a cerut CTCP {2} de la {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Răspuns PING CTCP de la {0}: {1} secunde" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Răspuns CTCP {0} de la {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] s-a alăturat la {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] a plecat din {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Ați fost dat afară de la {0} de către {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} a fost dat afară de la {1} de către {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Sunteți cunoscut acum ca {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} este cunoscut acum ca {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} a modificat subiectul al {1} la: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Modificare de mod [{0}] pentru utilizatorul {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] de către {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] a ieșit" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Conexiunea la {0} portul {1} a eșuat (încercarea {2}), se reîncearcă în " "{3} secunde..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} este absent: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Nu mai sunteți marcat ca fiind absent" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Ați fost marcat ca fiind absent" smuxi-1.1/po-Engine-IRC/fi.po0000664000175000017500000002752614011526464016531 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2013-11-20 11:27+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} kutsuu sinut kanavalle {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "Hyväksy kutsu (liity kanavalle)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "poissa" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "viive {0} sekuntia" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "ei yhteydessä" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Käytetään välityspalvelinta: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Yhdistetään palvelimeen {0} porttiin {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "Yhteys palvelimeen {0} muodostettu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "Kirjaudutaan sisään..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "Yhteydenmuodostus epäonnistui!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "Yhteydenmuodostus epäonnistui! Syy:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "Katkaistaan..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Katkaistaan yhteyttä palvelimeen {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "Yhteys palvelimeen {0} katkaistu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "Yhteys katkaistu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "Ei yhdistetty" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "Yhdistetään uudelleen..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Yhdistetään uudelleen palvelimeen {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "Virhe uudelleenyhdistämisessä" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Nukutaan {0} millisekuntia" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager -komennot" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "Epäkelpo portti: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "Liittymisiä jonossa: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Kanava {0} on jo auki. Kirjoita /window {0} siirtyäksesi sinne." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktiivisia liittymisiä: {0} - Liittymisiä jonossa: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "Liitytään: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "Jäljellä" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "aktiivisia liittymisiä: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "liittymisiä jonossa: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "IRC-operaattori" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "Omistaja" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "KanavaHallinnoija" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "Operaattori" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "PuoliOperaattori" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "Ääni" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Aihe kanavalle {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "Ei aihetta kanavalle {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "Porttikielto" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "Ei porttikieltoja kanavalla" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "Porttikieltopoikkeus" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "Ei porttikieltopoikkeuksia kanavalla" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "kutsupoikkeus" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "Ei kutsupoikkeuksia kanavalla" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "Käyttäjätilasi on {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} on jo kanavalla {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Kutsutaan {0} kanavalle {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "Käyttäjät" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Yhteensä {0} käyttäjää [{1} operaattoria, {2} äänellistä, {3} normaalia]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "Yhteysvirhe! Syy:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ei tarpeeksi parametrejä komennolle {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "Ei yhdistettynä palvelimelle" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Ei tällaista käyttäjää/kanavaa" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "Korotettiin lähetysviivettä {0}ms jotta vältytään ylivuotokatkaisulta jatkossa." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "Käyttäjätunnus {0} on jo käytössä" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "Ei voi liittyä kanavalle:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "Sinulla on porttikielto" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] teki CTCP {2} -pyynnön {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING -vastaus käyttäjältä {0}: {1} sekuntia" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} -vastaus käyttäjältä {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3207 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] liittyi kanavalle {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3349 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] on poistunut kanavalta {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3374 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "{1} potkaisi sinut kanavalta {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3382 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} poistettiin kanavalta {1} käyttäjän {2} toimesta" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3432 #, csharp-format msgid "You're now known as {0}" msgstr "Sinut tunnetaan nyt nimellä {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3435 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} on nyt nimeltään {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3469 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} muutti kanavan {1} aiheeksi: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3629 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Tilan vaihto [{0}] käyttäjälle {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3660 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "tila/{0} [{1}] asettajana {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3696 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] lopetti" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3786 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "Yhteys palvelimeen {0} portti {1} on epäonnistunut (yritys {2}), yritetään uudelleen {3} sekunnin kuluttua..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3836 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} on poissa: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3846 msgid "You are no longer marked as being away" msgstr "Poissaolomerkintä poistettu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3856 msgid "You have been marked as being away" msgstr "Poissaolomerkintä päällä" smuxi-1.1/po-Engine-IRC/de.po0000664000175000017500000003024314011526464016511 0ustar00meebeymeebey00000000000000# German translation of smuxi-Engine-IRC. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2012-2013. # Mirco Bauer , 2013. # Mario Blättermann , 2016-2017. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:44+0000\n" "PO-Revision-Date: 2017-11-06 11:17+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.3\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} lädt Sie in {1} ein" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Einladung akzeptieren (Raum betreten)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "abwesend" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "Verzögerung: {0} Sekunden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "nicht verbunden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Proxy wird verwendet: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Verbindung zu {0} Port {1} …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Verbindung zu {0} wurde hergestellt" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Anmelden …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Verbindung ist fehlgeschlagen!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Verbindung ist fehlgeschlagen! Ursache: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Häufig gestellte Fragen zu Smuxi als Hilfe öffnen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Wird getrennt …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Trennung von {0} läuft …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Getrennt von {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Verbindung wurde geschlossen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Nicht verbunden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Wird erneut verbunden …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Wird erneut zu {0} verbunden …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Fehler beim Wiederverbinden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Für {0} Millisekunden wird gewartet" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager-Befehle" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Ungültiger Port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Beitritte werden in Warteschlange gestellt: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Kanal wurde bereits betreten: {0}. Geben Sie /window {0} ein, um dorthin zu " "wechseln." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktive Beitritte: {0} - Wartende Beitritte: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Wird betreten: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Verbleibend" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "Aktive Beitritte: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "Wartende Beitritte: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Besitzer" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Kanaladministrator" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Halb-Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voice" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Thema für {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Kein Thema für {0} gesetzt" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "Sperre" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Keine Sperren in diesem Kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "Sperrausnahme" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Keine Sperrausnahmen in diesem Kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "Einladungsausnahme" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Keine Einladungsausnahmen in diesem Kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Ihr Benutzermodus ist {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} ist bereits in {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "{0} wird in {1} eingeladen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Benutzer" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Insgesamt {0} Benutzer [{1} Ops, {2} Voices, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Verbindungsfehler! Grund: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nicht genügend Parameter für den Befehl {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Nicht mit Server verbunden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Kein solcher Spitzname/Kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Nachrichtenverzögerung auf {0} ms erhöht, um eine Überflutung des Servers zu " "verhindern." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Benutzername {0} wird bereits verwendet" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Beitreten zum Kanal nicht möglich:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Sie sind gesperrt" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] fragt CTCP {2} von {3} ab: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP-PING-Antwort von {0}: {1} Sekunden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP-{0}-Antwort von {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] hat {2} betreten" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] hat {2} verlassen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Sie wurden von {1} aus {0} hinausgeworfen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} wurde von {2} aus {1} hinausgeworfen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Sie sind nun bekannt als: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} ist nun bekannt als: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} hat das Thema des Kanals {1} geändert auf: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Modus für Benutzer {1} geändert [{0}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] von {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] hat beendet" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Die Verbindung {0} über Port {1} ist fehlgeschlagen (Versuch {2}), erneuter " "Versuch in {3} Sekunden …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} ist abwesend: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Sie sind nicht mehr als abwesend gekennzeichnet" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Sie sind als abwesend gekennzeichnet" smuxi-1.1/po-Engine-IRC/hu.po0000664000175000017500000003021314011526464016532 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015, 2018 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015, 2018. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:44+0000\n" "PO-Revision-Date: 2018-02-24 00:43+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} meghívta önt ide: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Meghívás elfogadása (belépés a szobába)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "távol" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "késleltetés: {0} másodperc" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "nincs kapcsolódva" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Proxy használata: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Kapcsolódás ide: {0} port: {1}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Kapcsolat létrehozva ezzel: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Bejelentkezés…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Kapcsolat meghiúsult!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Kapcsolat meghiúsult! Ok: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Smuxi GyIK megnyitása a súgóért" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Leválasztás…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Leválasztás innen: „{0}”…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Leválasztva innen: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Kapcsolat lezárva" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Nincs kapcsolódva" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Újrakapcsolódás…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Újrakapcsolódás ehhez: {0}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Újrakapcsolódási hiba" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Alvás {0} ezredmásodpercig" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager parancsok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Érvénytelen port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Csatlakozások sorba állítása: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Már csatlakozott a csatornához: {0}. Adja ki a /window {0} parancsot az " "átlépéshez." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktív csatlakozások: {0} - Sorba állított csatlakozások: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Csatlakozás: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Hátralévő" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "aktív csatlakozások: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "sorba állított csatlakozások: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Tulajdonos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "CsatAdmin" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "FélOp" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Hang" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Téma ehhez: {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Nincs téma beállítva ennél: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "kitiltás" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Nincsenek kitiltások a csatornán" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "kitiltás kivétel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Nincsenek kitiltás kivételek a csatornán" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "meghívás kivétel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Nincsenek meghívás kivételek a csatornán" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "A felhasználómódja: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} már ezen van: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "{0} meghívása ide: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Felhasználók" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Összesen {0} felhasználó [{1} op, {2} hang, {3} normál]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Kapcsolathiba! Ok: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nincs elég paraméter a következő parancshoz: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Nincs kapcsolódva a kiszolgálóhoz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Nincs ilyen becenév/csatorna" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Küldési késleltetés megnövelve {0} ezredmásodpercre annak elkerüléséhez, " "hogy a kiszolgáló ismét el legyen árasztva." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "A(z) {0} becenév már használatban van" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Nem lehet csatlakozni a csatornához:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Kitiltották" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] {2} CTCP parancsot kért tőle: {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING válasz tőle: {0}: {1} másodperc" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} válasz tőle: {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] csatlakozott ehhez: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] elhagyta ezt: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "{1} kirúgta önt innen: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{2} kirúgta őt: {0} innen: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Ön mostantól {0} néven ismert" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} mostantól {1} néven ismert" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} megváltoztatta a(z) {1} témáját erre: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Módváltoztatás [{0}] a következő felhasználónál: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mód/{0} [{1}] - {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] kilépett" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "A kapcsolódás ehhez: {0} port: {1} sikertelen ({2} kísérlet), újrapróbálás " "{3} másodperc múlva…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} távol: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Többé nincs távollévőként megjelölve" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Meg lett jelölve távollévőként" smuxi-1.1/po-Engine-IRC/ur.po0000664000175000017500000002222714011526464016552 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-11-30 04:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:234 #, csharp-format msgid "{0} invites you to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1468 msgid "away" msgstr "" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:261 #, csharp-format msgid "lag: {0} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:267 msgid "not connected" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:337 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:343 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:438 #, csharp-format msgid "Connection to {0} established" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:346 msgid "Logging in..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:369 msgid "Connection failed!" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:370 msgid "Connection failed! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 msgid "Disconnecting..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:382 #, csharp-format msgid "Disconnecting from {0}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:387 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:390 msgid "Connection closed" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:395 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:452 msgid "Not connected" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:424 msgid "Reconnecting..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:432 #, csharp-format msgid "Reconnecting to {0}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:446 msgid "Reconnect Error" msgstr "" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:816 msgid "IrcProtocolManager Commands" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:887 #, csharp-format msgid "Invalid port: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:997 #, csharp-format msgid "Queuing joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1011 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1046 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1069 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1100 #, csharp-format msgid "Joining: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1071 msgid "Remaining" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1076 #, csharp-format msgid "active joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1085 #, csharp-format msgid "queued joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1455 msgid "IRC Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1457 msgid "Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1459 msgid "Voice" msgstr "" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1519 #, csharp-format msgid "Topic for {0}: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1524 #, csharp-format msgid "No topic set for {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1604 msgid "ban" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1614 msgid "No bans in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1726 #, csharp-format msgid "Inviting {0} to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1730 #, csharp-format msgid "{0} is already on {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "Users" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1797 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1928 msgid "Connection error! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1938 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1948 msgid "Not connected to server" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2156 #, csharp-format msgid "{0}: No such nick/channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2279 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2293 msgid "Nick" msgstr "" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2303 msgid "is already in use" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2329 msgid "Cannot join to channel:" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2337 msgid "You are banned" msgstr "" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2413 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2438 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2446 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2643 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2769 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2794 #, csharp-format msgid "You were kicked from {0} by {1} [{2}]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2802 #, csharp-format msgid "{0} was kicked from {1} by {2} [{3}]" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2819 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2852 #, csharp-format msgid "You're now known as {0}" msgstr "" #. TRANSLATOR: do NOT change the position of {0} or {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2857 #, csharp-format msgid "{0} is now known as {1}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2894 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2970 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "" #. TRANSLATOR: do NOT change the position of {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3017 #, csharp-format msgid "{0} [{1}] has quit" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3094 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3143 #, csharp-format msgid "{0} is away: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3149 msgid "You are no longer marked as being away" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3155 msgid "You have been marked as being away" msgstr "" smuxi-1.1/po-Engine-IRC/fr.po0000664000175000017500000002767314011526464016545 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2013-11-20 11:27+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} vous invite sur {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "Accepter l'invitation (rejoindre le canal)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "parti" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "lag : {0} secondes" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "non connecté" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilisation du proxy {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Connexion au serveur {0}, sur le port {1} en cours..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "Connexion au serveur {0} établie" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "Enregistrement en cours..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "Connexion impossible !" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "Connexion impossible ! Raison :" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "Déconnexion en cours..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Déconnexion de {0} en cours..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "Déconnecté de {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "Connexion fermée" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "Non connecté" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "Reconnexion en cours..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconnexion à {0} en cours..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "Erreur à la reconnexion" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Mis en pause pendant {0} millisecondes" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "Commandes IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "Port invalide : {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "Mise des en attente des inscriptions en cours : {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Vous êtes déjà sur le canal: {0}. Utilisez /window {0} pour passer sur celui-ci." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Inscriptions en cours : {0} - Inscriptions en attente : {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "Raccordement : {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "Restant" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "raccordements actifs : {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "raccordements en attente : {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "Opérateur IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "Propriétaire" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "Administrateur de canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "Opérateur" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "Demi-opérateur" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "Voicé" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Sujet de {0} : {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "Pas de sujet sélectionné pour {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "ban" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "Aucun utilisateur banni sur le canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "exception de banissement" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "Pas d'exception de banissement sur le canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "exception d'invitation" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "Pas d'exception d'invitation sur le canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "Votre mode utilisateur est {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} est déjà sur {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Invitation de {0} par {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "Utilisateurs" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total de {0} utilisateurs, [{1} opérateur(s), {2} voicé(s), {3} normal(ux)]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "Erreur de connexion ! Raison :" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pas assez de paramètres pour la commande {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "Non connecté au serveur" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Impossible de trouver le surnom/canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "Augmentation du délai d'envoi jusqu'à {0}ms pour éviter d'être kické pour flooding du serveur encore une fois." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "Le pseudo {0} est déjà en cours d'utilisation" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "Impossible de rejoindre le canal :" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "Vous êtes banni" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] a fait une requête CTCP {2} de {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Réponse CTCP PING de {0} : {1} secondes" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Réponse CTCP {0} de {1} : {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3207 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] a rejoint {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3349 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] a quitté {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3374 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Vous avez été kické de {0} par {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3382 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} a été kické de {1} par {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3432 #, csharp-format msgid "You're now known as {0}" msgstr "Vous êtes maintenant connu en tant que {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3435 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} est maintenant connu en tant que {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3469 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} a changé le sujet de {1} en : {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3629 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Changement de mode [{0}] pour l'utilisateur {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3660 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] par {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3696 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] a quitté" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3786 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "La connexion vers {0}, port {1} a échoué (essai {2}), nouvel essai dans {3} secondes..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3836 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} est parti : {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3846 msgid "You are no longer marked as being away" msgstr "Vous êtes marqué comme étant revenu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3856 msgid "You have been marked as being away" msgstr "Vous avez été marqué comme étant parti" smuxi-1.1/po-Engine-IRC/sr.po0000664000175000017500000003227414011526464016553 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright © 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016–2018. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:44+0000\n" "PO-Revision-Date: 2018-02-24 09:01+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: српски \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Project-Style: gnome\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} вас позива у {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Прихвати позив (приступи соби)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "отсутан" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "кашњење: {0} секунде" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "нисте повезани" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Користим посредника: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Повезујем се на {0} прикључник {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Веза са {0} је успостављена" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Пријављујем се..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Повезивање није успело!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Повезивање није успело! Разлог: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Отворите ЧПП Смуксија за помоћ" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Прекидам везу..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Прекидам везу са {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Прекинута је веза са „{0}“" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Веза је затворена" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Нисам повезан" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Поново се повезујем..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Поново се повезујем са {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Грешка поновног повезивања" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Спаваћу {0} милисекунде" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Наредбе управника Ирц протокола" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Неисправан прикључник: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Заказујем приступе: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Већ сте приступили каналу: {0}. Укуцајте „/window {0}“ да се пребаците." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Радни приступи: {0} — Заказани приступи: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Приступам: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Преостало" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "радни приступ: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "заказани приступ: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "ИРЦ Оп" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Власник" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Админ канала" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Оп" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Полуоп" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Глас" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Тема за {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Није подешена тема за {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "забрана" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Нема забрана на каналу" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "изузетак забране" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Нема изузетака забрана на каналу" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "изузетак позива" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Нема изузетака позива на каналу" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Ваш кориснички режим је {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} је већ на {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Позивам {0} на {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Корисници" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Укупно {0} корисника [{1} оп-ја, {2} гласа, {3} обична]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Грешка везе! Разлог: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Нема довољно параметара за наредбу „{0}“" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Нисте повезани са сервером" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Нема таквог надимка/канала" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Повећао сам кашњење слања на {0} ms како бих избегао поновно одбацивање од " "стране сервера." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Надимак „{0}“ је већ у употреби" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Не могу да приступим каналу:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Добили сте забрану" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] је затражио ЦТЦП {2} од {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "ЦТЦП ПИНГ одговор са {0}: {1} секунде" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "ЦТЦП {0} одговор са {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] је приступио {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] је напустио {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "{1} вас је избацио са {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{2} је избацио {0} са {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Сада сте познати као {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} је сада познат као {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} је изменио тему од {1} у: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Промена режима [{0}] за корисника {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "режим/{0} [{1}] од {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] је изашао" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Повезивање на {0} прикључник {1} није успело (покушавам {2}), поново ћу " "покушати за {3} секунде..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} је одсутан: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Више нисте означени да сте одсутни" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Означени сте да сте одсутни" smuxi-1.1/po-Engine-IRC/sl.po0000664000175000017500000002367614011526464016553 0ustar00meebeymeebey00000000000000# 'smuxi/po-Engine-IRC/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:39+0000\n" "PO-Revision-Date: 2016-03-11 22:56+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 " "|| n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1771 msgid "away" msgstr "" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:380 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:387 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:401 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:542 #, csharp-format msgid "Connection to {0} established" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:410 msgid "Logging in..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:450 msgid "Connection failed!" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:454 msgid "Connection failed! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:467 msgid "Disconnecting..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:472 #, csharp-format msgid "Disconnecting from {0}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:485 msgid "Connection closed" msgstr "Povezava je zaprta" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:494 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:569 msgid "Not connected" msgstr "Ni povezave" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:528 msgid "Reconnecting..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:536 #, csharp-format msgid "Reconnecting to {0}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:555 msgid "Reconnect Error" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:949 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1034 msgid "IrcProtocolManager Commands" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1116 #, csharp-format msgid "Invalid port: {0}" msgstr "" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1211 #, csharp-format msgid "Queuing joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1232 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1266 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1290 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1320 #, csharp-format msgid "Joining: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1292 msgid "Remaining" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1297 #, csharp-format msgid "active joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1306 #, csharp-format msgid "queued joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1752 msgid "IRC Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1754 msgid "Owner" msgstr "Lastnik" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1756 msgid "ChanAdmin" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1758 msgid "Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1760 msgid "Halfop" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1762 msgid "Voice" msgstr "Glas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1825 #, csharp-format msgid "Topic for {0}: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1827 #, csharp-format msgid "No topic set for {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1992 msgid "ban" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2003 msgid "No bans in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2040 msgid "ban exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2051 msgid "No ban exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2088 msgid "invite exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2099 msgid "No invite exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2213 #, csharp-format msgid "Your user mode is {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2239 #, csharp-format msgid "{0} is already on {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2247 #, csharp-format msgid "Inviting {0} to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2270 msgid "Users" msgstr "Uporabniki" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2321 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2459 msgid "Connection error! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2471 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Not connected to server" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2724 #, csharp-format msgid "{0}: No such nick/channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2843 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2858 #, csharp-format msgid "Nick {0} is already in use" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2874 msgid "Cannot join to channel:" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2876 msgid "You are banned" msgstr "" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2986 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2995 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3246 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3391 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3416 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3424 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3474 #, csharp-format msgid "You're now known as {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3477 #, csharp-format msgid "{0} is now known as {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3511 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3671 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3702 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3738 #, csharp-format msgid "{0} [{1}] has quit" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3837 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3887 #, csharp-format msgid "{0} is away: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3897 msgid "You are no longer marked as being away" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3907 msgid "You have been marked as being away" msgstr "" smuxi-1.1/po-Engine-IRC/pl.po0000664000175000017500000003044214011526464016535 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2017 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # , 2012. # Piotr Drąg , 2015-2017. # Aviary.pl , 2015-2017. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-05 15:12+0100\n" "PO-Revision-Date: 2017-11-05 15:14+0100\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} zaprasza do pokoju {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Przyjmij zaproszenie (dołącz do pokoju)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "nieobecny" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "opóźnienie: {0} s" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "niepołączony" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Używanie pośrednika: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Łączenie z {0} przez port {1}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Połączono z {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Logowanie…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Połączenie się nie powiodło" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Połączenie się nie powiodło. Powód: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Otwórz najczęściej zadawane pytania o Smuxi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Rozłączanie…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Rozłączanie z {0}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Rozłączono z {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Zamknięto połączenie" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Niepołączony" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Ponowne łączenie…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Ponowne łączenie z {0}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Błąd podczas ponownego łączenia" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Oczekiwanie przez {0} ms" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Polecenia IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Nieprawidłowy port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "W kolejce: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Już dołączono do kanału: {0}. Wpisanie /window {0} przełączy na niego." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Dołączono do: {0} — w kolejce: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Dołączanie: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Pozostało" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "dołączono do: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "w kolejce: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "Operator IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Właściciel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Administrator kanału" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Operator" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Moderator" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voice" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Temat dla kanału {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Brak tematu dla kanału {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "ban" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Brak banów na kanale" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "wyjątek banu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Brak wyjątków banów na kanale" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "wyjątek zaproszenia" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Brak wyjątków zaproszenia na kanale" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Tryb użytkownika: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "Użytkownik {0} już jest w kanale {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Zapraszanie użytkownika {0} do kanału {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Użytkownicy" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" "Użytkownicy w kanale: {0} [operatorzy: {1}, użytkownicy z Voice: {2}, zwykli " "użytkownicy: {3}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Błąd połączenia. Powód: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Niewystarczająca liczba parametrów dla polecenia {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Nie połączono z serwerem" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: nie ma takiego pseudonimu/kanału" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Zwiększono opóźnienie wysyłania do {0} ms, aby uniknąć wyrzucenia z serwera " "za nadmierną liczbę wiadomości." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Pseudonim {0} jest już używany" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Nie można dołączyć do kanału:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Użytkownik został zbanowany" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "Użytkownik {0} [{1}] zażądał CTCP {2} od użytkownika {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Odpowiedź CTCP PING od użytkownika {0}: {1} s" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Odpowiedź CTCP {0} od użytkownika {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "Użytkownik {0} [{1}] dołączył do kanału {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "Użytkownik {0} [{1}] opuścił kanał {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Użytkownik został wyrzucony z kanału {0} przez użytkownika {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "Użytkownik {0} został wyrzucony z kanału {1} przez użytkownika {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Zmieniono pseudonim na {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "Użytkownik {0} zmienił pseudonim na {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "Użytkownik {0} zmienił temat kanału {1} na: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Zmiana trybu [{0}] użytkownika {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "tryb/{0} [{1}] przez {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "Użytkownik {0} [{1}] wyszedł" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Połączenie z {0} przez port {1} się nie powiodło (próba: {2}), ponowna próba " "połączenia za {3} s…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "Użytkownik {0} jest nieobecny: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Użytkownik nie jest już oznaczony jako nieobecny" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Użytkownik został oznaczony jako nieobecny" smuxi-1.1/po-Engine-IRC/id.po0000664000175000017500000002737414011526464016530 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:44+0000\n" "PO-Revision-Date: 2017-11-30 13:58+0700\n" "Last-Translator: Kukuh Syafaat \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} mengundang Anda ke {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Terima undangan (gabung kanal)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "pergi" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "ketinggalan: {0} seconds" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "tidak terhubung" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Menggunakan proksi: {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Menghubungkan ke {0} port {1} ..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Sambungan ke {0} mapan" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Masuk..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Koneksi gagal!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Koneksi gagal! Alasan:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Buka Smuxi FAQ (Pertanyaan yang Sering Diajukan) untuk bantuan" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Terputus..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Terputus dari {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Terputus dari {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Sambungan ditutup" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Tidak terhubung" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Menghubungkan kembali..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Menghubungkan kembali ke {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Hubungkan kembali Gagal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Tidur selama {0} milidetik" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Perintah IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Port tidak valid: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Antrian bergabung: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Sudah bergabung ke kanal: {0}. Ketik /window {0} untuk beralih ke sana." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktif bergabung: {0} - Antri bergabung: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Bergabung: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Sisa" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "aktif bergabung: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "antri bergabung: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Pemilik" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "ChanAdmin" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Halfop" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Suara" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Topik untuk {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Tidak ada topik yang ditetapkan untuk {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "pencekalan" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Tidak ada pencekalan di kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "pengecualian pencekalan" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Tidak ada pengecualian pencekalan di saluran" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "mengundang pengecualian" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Tidak ada pengecualian undangan di saluran" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Mode pengguna Anda adalah {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} sudah ada di {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Mengundang {0} ke {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Pengguna" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total {0} pengguna [{1} ops, {2} suara, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Kesalahan koneksi! Alasan: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Tidak cukup parameter untuk perintah {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Tidak terhubung ke peladen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Tidak ada nick/kanal seperti itu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "Meningkatnya jeda kirim ke {0}ms agar peladen tidak kebanjiran lagi." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Nick {0} sudah digunakan" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Tidak dapat bergabung ke kanal:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Anda dicekal" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] meminta CTCP {2} dari {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING membalas dari {0}: {1} detik" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} membalas dari {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] telah bergabung {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] telah meninggalkan {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Anda ditendang dari {0} oleh {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} ditendang dari {1} oleh {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Anda sekarang dikenal sebagai {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} sekarang dikenal sebagai {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} mengubah topik {1} menjadi: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Mode berubah [{0}] untuk pengguna {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] oleh {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] telah keluar" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Sambungan ke {0} port {1} telah gagal (coba {2}), coba lagi dalam {3} " "detik..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} sedang pergi: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Anda tidak lagi ditandai sebagai pergi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Anda telah ditandai sebagai pergi" smuxi-1.1/po-Engine-IRC/es.po0000664000175000017500000002760214011526464016535 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 # Ricardo A. Hermosilla Carrillo , 2012 # Daniel Mustieles , 2018. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2018-06-22 11:52+0200\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: es \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} te ha invitado a {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Aceptar invitación (entrar al canal)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "ausente" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "demora: {0} segundos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "no conectado" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilizando proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Conectando a {0} en el puerto {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Se estableció la conexión a {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Autenticando..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "¡Falló la conexión!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "¡Falló la conexión! Razón: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Abrir las P+F de Smuxi para obtener ayuda" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Desconectando..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Desconectando de {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Desconectado de {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Conexion terminada" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "No conectado" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Reconectando..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconectando a {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Error de reconexión" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Esperando {0} milisegundos" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Órdenes IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Puerto no válido: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Entradas enlistadas: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Ya estás dentro del canal: {0}. Escribe /window {0} para cambiar a él." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Entradas activas: {0} - Entradas enlistadas: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Entrando: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Restantes" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "entradas activas: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "entradas enlistadas: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Dueño" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "ChanAdmin" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "HalfOp" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Topic para {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "No hay topic fijado en {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "bloquear" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "No hay bloqueos en el canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "excepción a bloqueo" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "No hay excepciones en el canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "excepción de invitación" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "No ha excepciones de invitación en el canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Su modo de usuario es {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} ya se encuentra en {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Invitando {0} a {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Usuarios" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total de {0} usuarios [{1} ops, {2} voz, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "¡Error de conexión! Razón:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parámetros insuficientes para la orden {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "No conectado al servidor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: No existe nick/canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Se aumentó el retraso para los envíos en {0}ms para evitar inundar el " "servidor nuevamente." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Ya se está utilizando el nick {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "No se puede entrar al canal:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Estás bloqueado" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] solicitó CTCP {2} de {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING respuesta de {0}: {1} segundos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} respuesta de {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] entró a {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] ha dejado {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Ha sido expulsado de {0} por {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{2} expulsó a {0} de {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Ahora eres conocido como {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} es ahora conocido como {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} cambió el topic de {1} a: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Modo cambiado [{0}] para el usuario {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "modo/{0} [{1}] por {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] ha salido" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Falló la conexión a {0} en el puerto {1} ha fallado (intento {2}), " "reintentando en {3} segundos..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} está ausente: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Ya no se encuentra marcado como ausente" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Ha sido marcado como ausente" smuxi-1.1/po-Engine-IRC/Makefile.in.in0000664000175000017500000001577114011526464020244 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_ENGINE_IRC@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine-IRC/pt.po0000664000175000017500000002760414011526464016553 0ustar00meebeymeebey00000000000000# Translation of smuxi-engine-irc messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-engine-irc package. # Américo Monteiro , 2010, 2012. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi-engine-irc\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-24 01:20+0000\n" "PO-Revision-Date: 2015-11-17 08:24+0000\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} convida-o para {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Aceitar convite (juntar-se à sala)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1771 msgid "away" msgstr "longe" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "demora: {0} segundos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "não ligado" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:380 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "A usar o proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:387 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "A ligar a {0} porta {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:401 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:542 #, csharp-format msgid "Connection to {0} established" msgstr "Ligação a {0} estabelecida" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:410 msgid "Logging in..." msgstr "A iniciar sessão..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:450 msgid "Connection failed!" msgstr "Ligação falhada!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:454 msgid "Connection failed! Reason: " msgstr "Ligação falhada! Razão: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:467 msgid "Disconnecting..." msgstr "A desligar..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:472 #, csharp-format msgid "Disconnecting from {0}..." msgstr "A desligar de {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnected from {0}" msgstr "Desligado de {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:485 msgid "Connection closed" msgstr "Ligação fechada" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:494 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:569 msgid "Not connected" msgstr "Não ligado" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:528 msgid "Reconnecting..." msgstr "A religar..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:536 #, csharp-format msgid "Reconnecting to {0}..." msgstr "A religar a {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:555 msgid "Reconnect Error" msgstr "Erro ao religar" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:949 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Suspender por {0} milissegundos" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1034 msgid "IrcProtocolManager Commands" msgstr "Comandos do IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1116 #, csharp-format msgid "Invalid port: {0}" msgstr "Porta inválida: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1211 #, csharp-format msgid "Queuing joins: {0}" msgstr "A colocar entradas em fila de espera: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1232 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Já entrou no canal: {0}. Escreva /window {0} para mudar para lá." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1266 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Entradas ativas: {0} - entradas em fila de espera: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1290 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1320 #, csharp-format msgid "Joining: {0}" msgstr "A entrar em: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1292 msgid "Remaining" msgstr "Restante" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1297 #, csharp-format msgid "active joins: {0}" msgstr "entradas ativas: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1306 #, csharp-format msgid "queued joins: {0}" msgstr "entradas em fila de espera: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1752 msgid "IRC Op" msgstr "Operador de IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1754 msgid "Owner" msgstr "Proprietário" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1756 msgid "ChanAdmin" msgstr "Administrador de canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1758 msgid "Op" msgstr "Operador" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1760 msgid "Halfop" msgstr "Operador intermédio" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1762 msgid "Voice" msgstr "Voz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1825 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Tópico para {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1827 #, csharp-format msgid "No topic set for {0}" msgstr "Nenhum tópico definido para {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1992 msgid "ban" msgstr "banir" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2003 msgid "No bans in channel" msgstr "Ninguém banido no canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2040 msgid "ban exception" msgstr "exceção ao banimento" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2051 msgid "No ban exceptions in channel" msgstr "Sem exceções a banimentos no canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2088 msgid "invite exception" msgstr "exceção ao convite" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2099 msgid "No invite exceptions in channel" msgstr "Sem exceções a convites no canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2213 #, csharp-format msgid "Your user mode is {0}" msgstr "O seu modo de utilizador é {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2239 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} já está em {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2247 #, csharp-format msgid "Inviting {0} to {1}" msgstr "A convidar {0} para {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2270 msgid "Users" msgstr "Utilizadores" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2321 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total de {0} utilizadores [{1} ops, {2} vozes, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2459 msgid "Connection error! Reason: " msgstr "Erro de ligação! Razão: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2471 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parâmetros insuficientes para o comando {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Not connected to server" msgstr "Não ligado ao servidor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2724 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: não existe tal alcunha/canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2843 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Atraso de envio aumentado para {0}ms para evitar ser posto fora do servidor " "outra vez." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2858 #, csharp-format msgid "Nick {0} is already in use" msgstr "Alcunha {0} já está em uso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2874 msgid "Cannot join to channel:" msgstr "Não pode entrar no canal:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2876 msgid "You are banned" msgstr "Está banido" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] pediu CTCP {2} de {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2986 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "resposta CTCP PING de {0}: {1} segundos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2995 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} resposta de {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3246 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] entrou em {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3391 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] abandonou {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3416 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Foi expulso de {0} por {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3424 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} foi expulso de {1} por {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3474 #, csharp-format msgid "You're now known as {0}" msgstr "É agora conhecido como {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3477 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} é agora conhecido como {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3511 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} mudou o tópico de {1} para: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3671 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Alteração de modo [{0}] para o utilizador {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3702 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "modo/{0} [{1}] por {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3738 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] saiu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3837 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "A ligação a {0} na porta {1} falhou (tentativa {2}), a tentar de novo em {3} " "segundos..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3887 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} está longe: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3897 msgid "You are no longer marked as being away" msgstr "Já não está marcado como estando longe" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3907 msgid "You have been marked as being away" msgstr "Foi marcado como estando longe" #~ msgid "Nick" #~ msgstr "Alcunha" #~ msgid "Not connected!" #~ msgstr "Não ligado!" smuxi-1.1/po-Engine-IRC/it.po0000664000175000017500000002613314011526464016540 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # # David Paleino , 2008. # Vincenzo Campanella , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-engine-irc\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-09-11 09:37+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:234 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} ti ha invitato in {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1468 msgid "away" msgstr "assente" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:261 #, csharp-format msgid "lag: {0} seconds" msgstr "ritardo: {0} secondi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:267 msgid "not connected" msgstr "non connesso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:337 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Connessione a {0} porta {1} in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:343 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:438 #, csharp-format msgid "Connection to {0} established" msgstr "Connessione a {0} stabilita" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:346 msgid "Logging in..." msgstr "Accesso in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:369 msgid "Connection failed!" msgstr "Connessione non riuscita." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:370 msgid "Connection failed! Reason: " msgstr "La connessione non è riuscita. Motivo: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 msgid "Disconnecting..." msgstr "Disconnessione in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:382 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Disconnessione da {0} in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:387 #, csharp-format msgid "Disconnected from {0}" msgstr "Disconnesso da {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:390 msgid "Connection closed" msgstr "Connessione chiusa" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:395 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:452 msgid "Not connected" msgstr "Non connesso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:424 msgid "Reconnecting..." msgstr "Riconnessione in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:432 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Riconnessione a {0} in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:446 msgid "Reconnect Error" msgstr "Errore di riconnessione" # #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:816 msgid "IrcProtocolManager Commands" msgstr "Comandi di IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:887 #, csharp-format msgid "Invalid port: {0}" msgstr "Porta non valida: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:997 #, csharp-format msgid "Queuing joins: {0}" msgstr "Accodamento degli accessi a «{0}» in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1011 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Si è già nel canale: {0}. Digitare «/window» {0} per potervi accedere." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1046 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Accessi attivi: «{0}» - Accessi accodati: «{1}»" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1069 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1100 #, csharp-format msgid "Joining: {0}" msgstr "Accesso a «{0}» in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1071 msgid "Remaining" msgstr "Rimanente" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1076 #, csharp-format msgid "active joins: {0}" msgstr "accessi attivi: «{0}»" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1085 #, csharp-format msgid "queued joins: {0}" msgstr "accessi accodati: «{0}»" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1455 msgid "IRC Op" msgstr "Operatore IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1457 msgid "Op" msgstr "Operatore" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1459 msgid "Voice" msgstr "Dai la parola" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1519 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Argomento per {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1524 #, csharp-format msgid "No topic set for {0}" msgstr "Nessun argomento impostato per {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1604 msgid "ban" msgstr "allontana (ban)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1614 msgid "No bans in channel" msgstr "Nessun allontanamento (ban) nel canale" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1726 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Invito di {0} su {1} in corso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1730 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} è già nel canale {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "Users" msgstr "Utenti" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1797 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Totale di {0} utenti [{1} operatori, {2} voci, {3} normali]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1928 msgid "Connection error! Reason: " msgstr "Errore di connessione. Motivo: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1938 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Non sono stati forniti abbastanza parametri per il comando {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1948 msgid "Not connected to server" msgstr "Non connesso a un server" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2156 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: soprannome o canale inesistente" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2279 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Ritardo d'invio aumentato a {0} ms per evitare una nuova disconnessione dal " "server." #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2293 msgid "Nick" msgstr "Soprannome" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2303 msgid "is already in use" msgstr "è già in uso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2329 msgid "Cannot join to channel:" msgstr "Impossibile accedere al canale:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2337 msgid "You are banned" msgstr "Sei stato allontanato" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2413 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] ha richiesto CTCP {2} da {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2438 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Risposta CTCP PING da {0}: {1} secondi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2446 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Risposta CTCP {0} da {1}: {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2643 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] è entrato in {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2769 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] ha lasciato {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2794 #, csharp-format msgid "You were kicked from {0} by {1} [{2}]" msgstr "Sei stato espulso da {0} da {1} [{2}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2802 #, csharp-format msgid "{0} was kicked from {1} by {2} [{3}]" msgstr "{0} è stato espulso da {1} da {2} [{3}]" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2819 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2852 #, csharp-format msgid "You're now known as {0}" msgstr "Sei ora conosciuto come {0}" #. TRANSLATOR: do NOT change the position of {0} or {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2857 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} è ora conosciuto come {1}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2894 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} ha cambiato l'argomento di {1} in: {2}" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2970 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Cambio modalità [{0}] per l'utente {1}" #. TRANSLATOR: do NOT change the position of {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] di {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3017 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] si è disconnesso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3094 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "La connessione a {0} porta {1} non è riuscita (tentativo {2}), nuovo " "tentativo fra {3} secondi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3143 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} è assente: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3149 msgid "You are no longer marked as being away" msgstr "Non sei più segnato come assente" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3155 msgid "You have been marked as being away" msgstr "Sei stato segnato come assente" #~ msgid "Not connected!" #~ msgstr "Non connesso." smuxi-1.1/po-Engine-IRC/nl.po0000664000175000017500000002770314011526464016541 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Mirco Bauer , 2014. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2019-03-10 15:25+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} nodigt u uit in {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Uitnodiging aanvaarden (deelnemen aan ruimte)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "afwezig" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "vertraging: {0} seconden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "niet verbonden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Gebruikmakend van proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Verbinden met {0} poort {1}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Verbinding gemaakt met {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Aanmelden…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Verbinding mislukt!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Verbinden mislukt! Reden: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "VGV over Smuxi openen voor hulp" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Verbinding verbreken…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Verbinding met {0} verbreken…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Verbinding met {0} verbroken" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Verbinding gesloten" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Niet verbonden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Opnieuw verbinden…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Opnieuw verbinden met {0}…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Herverbindingsfout" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "{0} milliseconden wachten" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager-opdrachten" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Ongeldige poort: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Wachtende joins: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Reeds verbonden met kanaal: {0}. Typ /window {0} om er naar over te " "schakelen." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Actieve joins: {0} - wachtende joins: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Joining: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Overgebleven" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "actieve joins: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "wachtende joins: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Eigenaar" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "KanaalBeheerder" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Halfop" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Stem" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Onderwerp voor {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Geen onderwerp ingesteld voor {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "verbannen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Geen verbanningen in kanaal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "verbanningsuitzondering" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Geen verbanningsuitzonderingen in kanaal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "uitnodigingsuitzondering" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Geen uitnodigingsuitzonderingen in kanaal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Uw gebruikersmodus is {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} is al op {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "{0} uitnodigen in {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Gebruikers" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Totaal van {0} gebruikers [{1} beheerders, {2} stemmen, {3} normaal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Verbindingsfout! Reden: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Onvoldoende parameters voor opdracht {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Niet verbonden met server" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: geen bekend(e) schermnaam/kanaal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Verzendvertraging verhoogd naar {0}ms om te voorkomen dat we opnieuw van de " "server afraken." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Schermnaam {0} is reeds in gebruik" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Kan niet verbinden met kanaal:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "U bent verbannen" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] verzocht CTCP {2} van {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP-PING-antwoord van {0}: {1} seconden" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP-{0}-antwoord van {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] is verbonden met {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] heeft {2} verlaten" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "U bent door {1} uit {0} geschopt" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} is door {2} uit {1} geschopt" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "U staat nu bekend als {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} staat nu bekend als {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} heeft het onderwerp veranderd van {1} naar: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Moduswijziging [{0}] voor gebruiker {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "modus/{0} [{1}] door {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] is weg" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Verbinding met {0} poort {1} is mislukt (poging {2}), nieuwe poging over " "{3} seconden…" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} is afwezig: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "U bent niet langer gemarkeerd als afwezig" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "U bent gemarkeerd als afwezig" smuxi-1.1/po-Engine-IRC/ru.po0000664000175000017500000003220114011526464016543 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 # Yuri Myasoedov , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:39+0200\n" "PO-Revision-Date: 2017-09-19 09:04+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} пригласил вас на {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "Принять приглашение (присоединиться к чату)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "ушёл" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "задержка: {0} сек." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "не подключён" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Используется прокси: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Подключение к {0} на порт {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "Подключение к {0} установлено." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "Вход на сервер..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "Сбой подключения!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "Сбой подключения! Причина:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "Отключение..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Отключение от {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "Отключен от {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "Соединение закрыто" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "Нет соединения" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "Возобновление соединения..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Возобновление соединения с {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "Ошибка повторного подключения" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Ожидание {0} миллисекунд." #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "Команды IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "Неверный порт: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "Постановка присоединений в очередь: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Канал {0} уже подключен. Введите /window {0} чтобы переключиться на окно канала." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Активных присоединений: {0} - в очереди: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "Вход на канал: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "Осталось" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "Активных присоединений: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "Ожидающих присоединений: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "Оператор канала" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "Владелец канала" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "Администратор канала" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "Оператор" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "Полуоператор" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "Голос" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Тема канала {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "У канала {0} нет темы" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "бан" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "Нет банов на канале" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "Исключение для банов" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "Нет исключений для банов на канале" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "Исключения для приглашений" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "Нет исключений для приглашений на канал" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "Ваш режим пользователя = {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} уже на {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Приглашение {0} на {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "Пользователи" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Пользователей: {0} [операторов: {1}, разрешенных: {2}, обычных: {3}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "Ошибка подключения! Причина: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Для команды {0} недостаточно параметров" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "Не подключён к серверу" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Нет такого имени или канала" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "Увеличена задержка отправки на {0} милисекунд чтобы избежать забрасывания сервера." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "Никнейм {0} уже используется" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "Не удалось зайти на канал:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "Вы забанены" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] запросил CTCP {2} у {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Ответ CTCP PING от {0}: {1} сек." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Ответ CTCP {0} от {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3210 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] зашел на канал {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3355 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] вышел из канала {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3380 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Вы выгнаны с канала {0} пользователем {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3388 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} выгнан с канала {1} пользователем {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3406 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3438 #, csharp-format msgid "You're now known as {0}" msgstr "Ваше имя теперь {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3441 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} сменил имя на {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3475 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} изменил тему канала {1} на: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3635 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Изменен режим [{0}] для пользователя {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3666 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "режим/{0} [{1}] {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3702 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] покинул канал" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3801 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "Сбой при подключении к {0} к порту {1} (попытка {2}), повторное подключение через {3} секунд..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3851 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} отошел: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3861 msgid "You are no longer marked as being away" msgstr "Вы больше не отмечены как отошедший" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3871 msgid "You have been marked as being away" msgstr "Вы отмечены как отошедший" smuxi-1.1/po-Engine-IRC/nb.po0000664000175000017500000002306314011526464016522 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:20+0100\n" "PO-Revision-Date: 2012-07-25 08:25+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/smuxi/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:245 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} inviterer deg til {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:276 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1519 msgid "away" msgstr "ikke tilstede" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:282 #, csharp-format msgid "lag: {0} seconds" msgstr "forsinkelse: {0} sekunder." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:288 msgid "not connected" msgstr "ikke koblet til" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:351 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Kobler til {0} port {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:357 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:463 #, csharp-format msgid "Connection to {0} established" msgstr "kobling til {0} oprettet" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:360 msgid "Logging in..." msgstr "logger in..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:394 msgid "Connection failed!" msgstr "Tilkobling mislyktes!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:395 msgid "Connection failed! Reason: " msgstr "Tilkobling mislyktes! Årsak: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:404 msgid "Disconnecting..." msgstr "Kobler i fra..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Kobler i fra {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:412 #, csharp-format msgid "Disconnected from {0}" msgstr "Koblet i fra {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:415 msgid "Connection closed" msgstr "Tilkobling lukket." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:420 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:477 msgid "Not connected" msgstr "Ikke koblet til" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Reconnecting..." msgstr "Kobler til på nytt..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:457 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Kobler til {0} på nytt..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 msgid "Reconnect Error" msgstr "" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:875 msgid "IrcProtocolManager Commands" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:943 #, csharp-format msgid "Invalid port: {0}" msgstr "Ugyldig port: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1047 #, csharp-format msgid "Queuing joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1061 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1096 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1119 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1150 #, csharp-format msgid "Joining: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1121 msgid "Remaining" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1126 #, csharp-format msgid "active joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1135 #, csharp-format msgid "queued joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1506 msgid "IRC Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1508 msgid "Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1510 msgid "Voice" msgstr "" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1570 #, csharp-format msgid "Topic for {0}: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1575 #, csharp-format msgid "No topic set for {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1655 msgid "ban" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1665 msgid "No bans in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 #, csharp-format msgid "Inviting {0} to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 #, csharp-format msgid "{0} is already on {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1806 msgid "Users" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1979 msgid "Connection error! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1989 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1999 msgid "Not connected to server" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2261 #, csharp-format msgid "{0}: No such nick/channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2390 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2404 msgid "Nick" msgstr "" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2414 msgid "is already in use" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2424 msgid "Cannot join to channel:" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2432 msgid "You are banned" msgstr "" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2508 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2533 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2541 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2747 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2873 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2898 #, csharp-format msgid "You were kicked from {0} by {1} [{2}]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2906 #, csharp-format msgid "{0} was kicked from {1} by {2} [{3}]" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2956 #, csharp-format msgid "You're now known as {0}" msgstr "" #. TRANSLATOR: do NOT change the position of {0} or {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2961 #, csharp-format msgid "{0} is now known as {1}" msgstr "" #. TRANSLATOR: do NOT change the position of {0} and {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2998 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3075 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "" #. TRANSLATOR: do NOT change the position of {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3085 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3122 #, csharp-format msgid "{0} [{1}] has quit" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3199 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3248 #, csharp-format msgid "{0} is away: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3254 msgid "You are no longer marked as being away" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3260 msgid "You have been marked as being away" msgstr "" smuxi-1.1/po-Engine-IRC/lt.po0000664000175000017500000003012214011526464016534 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Andrius Bentkus , 2015 # Moo, 2014-2015 # Aurimas Černius , 2018. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2018-11-25 19:21+0200\n" "Last-Translator: Aurimas Černius \n" "Language-Team: Lietuvių \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Gtranslator 3.30.1\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} kviečia jus į {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Priimti kvietimą (užeiti į kambarį)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "pasitraukęs" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "delsa: {0} sekundžių" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "neprisijungta" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Naudojamas įgaliotasis serveris: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Jungiamasi prie {0} prievadas {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Užmegztas ryšys su {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Prisjungiama..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Prisijungimas nepavyko!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Prisijungimas nepavyko! Priežastis:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Atverti Smuxi DŪK" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Atsijungiama..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Atsijungiama nuo {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Atsijungta nuo {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Ryšys nutrauktas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Neprisijungta" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Jungiamasi iš naujo..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Iš naujo jungiamasi prie {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Jungimosi iš naujo Klaida" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Miegama {0} milisekundžių" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager komandos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Neteisingas prievadas: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Prisijungimai eilėje: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Jau prisijungta prie kanalo: {0}. Įveskite /window {0}, kad perjungtumėte į " "jį." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktyvūs prisijungimai: {0} - Prisijungimai eilėje: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Prisijungiama prie: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Liko" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "aktyvių prisijungimų: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "prisijungimų eilėje: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Operatorius" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Savininkas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Kanalo Administratorius" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Operatorius" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Pusiau operatorius" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Turi balso teisę" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Kanalo {0} tema: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "{0} nėra nustatytos temos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "banas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Kanale nėra ban'ų" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "ban'o išimtis" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Kanale nėra ban'o išimčių" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "pakvietimo išimtis" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Kanale nėra pakvietimo išimčių" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Jūsų vartotojo veiksena yra {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} jau yra kanale {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Kviečiama {0} į {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Vartotojai" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" "Viso {0} naudotojų [{1} operatorių, {2} turinčių balso teisę, {3} normalių]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Ryšio klaida! Priežastis: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Neužtenka parametrų {0} komandai" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Neprisijungta prie serverio" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Tokio slapyvardžio/kanalo nėra" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Siuntimo delsa buvo padidinta iki {0}ms, siekiant išvengti pakartotinio " "flood iš serverio." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Slapyvardis {0} jau yra naudojamas" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Nepavyko prisijungti prie kanalo:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Jūs esate užbaninti" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] užklausė CTCP {2} iš {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING atsakymas nuo {0}: {1} sekundžių" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} atsakymas nuo {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] prisijungė prie {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] paliko {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Jus iš {0} išmetė {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{2} išmetė {0} iš {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Jūs dabar žinomi kaip {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} yra dabar žinomas kaip {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} pakeitė kanalo {1} temą į: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Veiksenos pakeitimas [{0}] vartotojui {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "veiksena/{0} [{1}] pagal {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] atsijungė" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Prisijungimas prie {0} prievado {1} nepavyko ({2} bandymas), bandoma dar " "kartą po {3} sekundžių..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} yra pasitraukęs: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Jūs daugiau nesate pažymėti kaip atsitraukę" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Jūs esate pažymėti kaip atsitraukę" smuxi-1.1/po-Engine-IRC/POTFILES.in0000664000175000017500000000006314011526464017333 0ustar00meebeymeebey00000000000000src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs smuxi-1.1/po-Engine-IRC/POTFILES.skip0000664000175000017500000000047414011526464017701 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Engine-IRC/te.po0000664000175000017500000002303514011526464016532 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 16:59+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:250 #, csharp-format msgid "{0} invites you to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:266 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:294 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1740 msgid "away" msgstr "" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:300 #, csharp-format msgid "lag: {0} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:306 msgid "not connected" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:366 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:373 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:387 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:528 #, csharp-format msgid "Connection to {0} established" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:396 msgid "Logging in..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:436 msgid "Connection failed!" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:440 msgid "Connection failed! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Disconnecting..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:458 #, csharp-format msgid "Disconnecting from {0}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:465 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 msgid "Connection closed" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:480 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:555 msgid "Not connected" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:514 msgid "Reconnecting..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:522 #, csharp-format msgid "Reconnecting to {0}..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 msgid "Reconnect Error" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:933 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1018 msgid "IrcProtocolManager Commands" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1100 #, csharp-format msgid "Invalid port: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1193 #, csharp-format msgid "Queuing joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1213 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1247 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1271 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1301 #, csharp-format msgid "Joining: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1273 msgid "Remaining" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "active joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1287 #, csharp-format msgid "queued joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1721 msgid "IRC Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1723 msgid "Owner" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1725 msgid "ChanAdmin" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1727 msgid "Op" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1729 msgid "Halfop" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1731 msgid "Voice" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1794 #, csharp-format msgid "Topic for {0}: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1796 #, csharp-format msgid "No topic set for {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1961 msgid "ban" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1972 msgid "No bans in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2009 msgid "ban exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2020 msgid "No ban exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2057 msgid "invite exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2068 msgid "No invite exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2182 #, csharp-format msgid "Your user mode is {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2208 #, csharp-format msgid "{0} is already on {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2216 #, csharp-format msgid "Inviting {0} to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2239 msgid "Users" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2290 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2424 msgid "Connection error! Reason: " msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2436 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2445 msgid "Not connected to server" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2649 #, csharp-format msgid "{0}: No such nick/channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2768 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2783 #, csharp-format msgid "Nick {0} is already in use" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2799 msgid "Cannot join to channel:" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2801 msgid "You are banned" msgstr "" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2884 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2911 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2920 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3168 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3310 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3335 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3343 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3361 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3393 #, csharp-format msgid "You're now known as {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3396 #, csharp-format msgid "{0} is now known as {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3430 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3592 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3609 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3635 #, csharp-format msgid "{0} [{1}] has quit" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3712 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3762 #, csharp-format msgid "{0} is away: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3772 msgid "You are no longer marked as being away" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3782 msgid "You have been marked as being away" msgstr "" smuxi-1.1/po-Engine-IRC/ca.po0000664000175000017500000002704614011526464016513 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Xavi Ivars , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:39+0200\n" "PO-Revision-Date: 2017-10-27 13:57+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: Catalan (http://www.transifex.com/meebey/smuxi/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} us invita a {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "Accepta l'invitació (uneix-te)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "absent" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "retard: {0} segons" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "no esteu connectat" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilitzant servidor intermediari: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "S'està connectant a {0} al port {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "S'ha establert la connexió a {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "S'està iniciant sessió..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "Ha fallat la connexió!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "Ha fallat la connexió! Motiu:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "S'està desconnectant..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "S'està desconnectant de {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "S'ha desconnectat de {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "S'ha tancat la connexió" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "No esteu connectat" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "S'està tornant a connectar..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "S'està tornant a connectar a {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "Error al tornar a connectar" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "S'està aturant durant {0} milisegons " #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "Ordres del protocol IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "Port invàlid: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "S'estan afegint les unions a la cua: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Ja esteu a la sala {0}. Escriviu /window {0} per a canviar-hi." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Unions actives: {0} - Unions a la cua: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "Unint-se a: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "En cua:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "unions actives: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "unions a la cua: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "Operador d'IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "Propietari" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "Dóna veu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Títol de {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "No hi ha cap títol a {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "expulsa" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "No hi ha bandejaments en aquesta sala" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} ja està a {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "S'està invitant {0} a {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "Usuaris" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total de {0} usuaris [{1} operadors, {2} amb veus, {3} normals]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "Error de connexió! Motiu:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "No heu proporcionat prou paràmetres per a l'ordre {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "No esteu connectat al servidor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: No existeix aquest usuari o aquesta sala" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "S'ha incrementat el retard de l'enviament a {0}ms per evitar ser expulsat un altre cop pel control d'inundacions del servidor." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "No podeu unir-vos a la sala:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "Esteu bandejats" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] ha enviat una petició CTCP {2} a {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "Resposta a CTCP PING de {0}: {1} segons" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "Resposta a CTCP {0} de {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3210 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] s'ha unit a {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3355 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] ha deixat {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3380 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3388 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3406 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3438 #, csharp-format msgid "You're now known as {0}" msgstr "El vostre sobrenom ha canviat a {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3441 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} s'ha canviat el sobrenom per {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3475 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} ha canviat el títol de {1} a: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3635 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "S'ha canviat el mode [{0}] a l'usuari {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3666 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] per {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3702 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] ha sortit" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3801 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "La connexió a {0} utilitzant el port {1} ha fallat (intent {2}). Es tornarà a intentar en {3} segons..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3851 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} està absent: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3861 msgid "You are no longer marked as being away" msgstr "Ja no esteu marcat com a absent" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3871 msgid "You have been marked as being away" msgstr "Heu estat marcat com a absent" smuxi-1.1/po-Engine-IRC/sv.po0000664000175000017500000003012214011526464016545 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2013 # flugsio , 2011, 2012 # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2018-09-10 21:28+0200\n" "Last-Translator: Josef Andersson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.1.1\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} bjuder in dig till {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Acceptera inbjudan (anslut till rummet)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "borta" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "lagg: {0} sekunder" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "inte ansluten" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Använder proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Anluter till {0} port {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Anslutning till {0} upprättad" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Loggar in..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Anslutning misslyckades!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Anslutning misslyckades! Anledning: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Öppna Smuxis ”Frågor och svar” för hjälp" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Kopplar ner..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Kopplar ner från {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Anslutning till {0} nerkopplad" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Anslutning stängd" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Inte ansluten" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Återansluter..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Återansluter till {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Återanslutningsfel" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Väntar i {0} millisekunder" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Kommandon för IRC-protokollhanterare" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Felaktig port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Köar kanalanslutningar: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Redan ansluten till kanal {0}. Ange kommandot /window {0} för att byta till " "den." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktiva kanalanslutningar: {0} - Köade kanalanslutningar: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Ansluter till kanal: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Återstående" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "aktiva kanaler: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "köade kanaler: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Operatör" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Ägare" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "Kanaladministratör" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Operatör" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Halvoperatör" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voice" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Rubrik för {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Ingen rubrik satt för {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "utestäng" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Ingen är utestängd från kanalen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "undantag från utestängning" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Inga undantag från utestängning finns för kanalen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "undantag från inbjudningskrav" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Inga undantag för inbjudingar finns för kanalen" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Ditt användarläge är {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} är redan på {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Bjuder in {0} till {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Användare" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Totalt {0} användare [{1} operatörer, {2} voice, {3} vanliga]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Fel i anslutning! Anledning: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Inte tillräckligt med parametrar för kommandot {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Inte ansluten till server" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Användaren/kanalen finns inte" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Ökar väntetid med {0}ms för att undvika att bli utkastad från servern på " "grund av för snabbt hanterade kommandon." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Användarnamnet {0} är upptaget" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Kan inte ansluta till kanalen:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Du är utestängd" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] begärde CTCP {2} från {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING-svar från {0}: {1} sekunder" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0}-svar från {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] anslöt till {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] har lämnat {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Du sparkades från {0} av {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} blev sparkad från {1} av {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Du kallas numera {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} kallas numera {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} bytte rubrik för {1} till: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Ändrat användartillstånd [{0}] för användaren {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "användartillstånd/{0} [{1}] av {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] har avslutat" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Uppkoppling till {0} på port {1} har misslyckats (försök {2}), prövar igen " "om {3} sekunder..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} är borta: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Du är inte längre markerad som borta" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Du har markerats som borta" smuxi-1.1/po-Engine-IRC/tr.po0000664000175000017500000003012314011526464016543 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # zeugma , 2013 # Ş. Uzun , 2014-2015 # U, 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2019-01-08 12:01+0200\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/" "tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} sizi {1} sohbetine davet ediyor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Daveti kabul et (odaya katıl)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "uzakta" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "gecikme: {0} saniye" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "bağlantı yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "{0}:{1} vekil sunucusu kullanılıyor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "{0} port {1} ile bağlantı kuruluyor..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "{0} ile bağlantı kuruldu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Oturum açılıyor..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Bağlantı kurulamadı!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Bağlantı kurulamadı! Neden: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Yardım için Smuxi SSS sayfasını aç" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Bağlantı kesiliyor..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "{0} ile bağlantı kesiliyor..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "{0} ile bağlantı kesildi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Bağlantıya son verildi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Bağlantı yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Yeniden bağlantı kuruluyor..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "{0} ile yeniden bağlantı kuruluyor..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Yeniden Bağlantı Hatası" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "{0} milisaniyelik uyku" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "IrcProtokolYöneticisi Komutları" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Geçersiz port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Katılmalar sıraya alınıyor: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "{0} kanalına zaten katılmışsınız. Geçiş yapmak için /window {0} yazın." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Etkin katılımlar: {0} - Sıraya alınmış katılımlar: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Katılım gerçekleşiyor: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Kalan" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "etkin katılımlar: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "sıraya alınmış katılımlar: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Owner" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "ChanAdmin" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Halfop" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voice" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "{0} için konu: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "{0} için bir konu belirlenmemiş" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "yasaklama" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Kanalda yasaklama yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "yasak istisnası" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Kanalda yasak istisnası yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "davet istisnası" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Kanalda davet istisnası yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Kullanıcı modunuz {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} zaten {1} sohbetinde" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "{0} {1} sohbetine davet ediliyor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Kullanıcılar" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Toplam {0} kullanıcı [{1} op, {2} voice, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Bağlantı hatası! Neden: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "{0} komutu için yetersiz parametre" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Sunucuyla bağlantı yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0} şeklinde bir takma ad/kanal yok" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Sık iletim sebebiyle sunucudan yine atılmamak için gönderim geciktirmesi {0}" "ms olarak arttırıldı." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "{0} takma adı zaten kullanımda" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Kanala katılım gerçekleştirilemiyor:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Yasaklısınız" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] {3} ile CTCP {2} talep etti: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "{0} tarafından CTCP PING yanıtı : {1} saniye" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "{1} tarafından CTCP {0} yanıtı: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] {2} sohbetine katıldı" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] {2} sohbetinden ayrıldı" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "{1} tarafından {0} sohbetinden atıldınız" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} {2} tarafından {1} sohbetinden atıldı" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Artık {0} adını kullanıyorsunuz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} artık {1} adını kullanıyor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} {1} için konuyu değiştirdi: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "{1} kullanıcısı için mod [{0}] değişimi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "{2} tarafından mod/{0} [{1}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] çıktı" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "{0} port {1} ile bağlantı başarısız oldu ({2}. girişim), {3} saniye içinde " "yeniden denenecek..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} uzakta: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Artık uzakta olarak işaretli değilsiniz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Uzakta olarak işaretlendiniz" smuxi-1.1/po-Engine-IRC/pt_BR.po0000664000175000017500000002765414011526464017143 0ustar00meebeymeebey00000000000000# Brazilian Portuguese for smuxi-Engine-IRC # Copyright (C) 2017 THE smuxi'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Translators: # Leonardopf , 2013 # Rafael Fontenelle , 2016, 2017. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:44+0000\n" "PO-Revision-Date: 2017-12-12 06:19-0200\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 1.0.0-beta1\n" "X-Project-Style: gnome\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} está convidando você para {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Aceitar o convite (entrar na sala)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "ausente" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "Lag: {0} segundos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "não conectado" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Usando proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Conectando a {0} na porta {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Conexão com {0} estabelecida" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Autenticando..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Conexão falhou!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Conexão falhou! Motivo:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Abrir Smuxi FAQ por ajuda" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Desconectando..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Desconectando de {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Desconectado de {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Conexão encerrada" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Não conectado" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Reconectando..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconectando a {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Erro ao reconectar" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Esperando por {0} milissegundos" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Comandos de IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Porta inválida: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Enfileirando ingressos: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Já ingressou no canal: {0}. Digite /window {0} para mudar para ele." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Ingressos ativos: {0} - Ingressos enfileirados: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Ingressando: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Restando" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "ingressos ativos: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "ingressos enfileirados: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "Op de IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Dono" # Administração de canal #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "AdminCanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" # Semi operador #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "SemiOp" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voz" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Tópico para {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Sem tópico definido para {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "banido" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Sem banidos nesse canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "exceção para banido" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Nenhuma exceção para banidos no canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "exceção para convite" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Nenhuma exceção para convites no canal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Seu modo de usuário é {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} já está em {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Convidando {0} para {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Usuários" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Total de {0} usuários [{1} ops, {2} voz, {3} normal]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Erro de conexão! Motivo:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parâmetros insuficientes para o comando {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Não conectado ao servidor" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: apelido/canal inexistente" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "Aumentado delay para {0}ms para evitar flood no servidor." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Apelido {0} está já está em uso" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Não pode entrar no canal:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Você está banido" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] requisitou CTCP {2} de {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING resposta de {0}: {1} segundos" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} resposta de {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] entrou em {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] saiu de {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Você foi expulso de {0} por {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} foi expulso de {1} por {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Você é conhecido como {0} agora" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} é conhecido como {1} agora" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} mudou o tópico do canal {1} para {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Mudou modo [{0}] para usuário {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "Modo/{0} [{1}] por {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] Saiu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Conexão para {0} e porta {1} falhou (Tentativa {2}), tentando novamente em " "{3} segundos..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} está ausente: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Você não está mais marcado como ausente" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Você está marcado como ausente" smuxi-1.1/po-Engine-IRC/fa.po0000664000175000017500000002530014011526464016505 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Behrooz Amoozad , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:39+0200\n" "PO-Revision-Date: 2017-09-19 19:12+0000\n" "Last-Translator: Behrooz Amoozad \n" "Language-Team: Persian (http://www.transifex.com/meebey/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:255 #, csharp-format msgid "{0} invites you to {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:279 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:307 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1770 msgid "away" msgstr "" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:313 #, csharp-format msgid "lag: {0} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:319 msgid "not connected" msgstr "قطع" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:379 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:386 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "در حال اتصال به {0} درگاه {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:400 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:541 #, csharp-format msgid "Connection to {0} established" msgstr "ارتباط با {0} برقرار شد" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:409 msgid "Logging in..." msgstr "در حال ورود..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Connection failed!" msgstr "ارتباط با شکست مواجح شد!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:453 msgid "Connection failed! Reason: " msgstr "ارتباط با شکست مواجح شد! علت: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:466 msgid "Disconnecting..." msgstr "در حال قطع شدنثثث" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 #, csharp-format msgid "Disconnecting from {0}..." msgstr "در حال قطع شدن از {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:478 #, csharp-format msgid "Disconnected from {0}" msgstr "در حال قطع شدن از {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:484 msgid "Connection closed" msgstr "ارتباط بسته شد." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:493 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:568 msgid "Not connected" msgstr "قطع" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:527 msgid "Reconnecting..." msgstr "در حال اتصال دوباره..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 #, csharp-format msgid "Reconnecting to {0}..." msgstr "در حال اتصال دوباره به {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:554 msgid "Reconnect Error" msgstr "خطا در اتصال دوباره" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:948 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1033 msgid "IrcProtocolManager Commands" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1115 #, csharp-format msgid "Invalid port: {0}" msgstr "درگاه نادرست: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1210 #, csharp-format msgid "Queuing joins: {0}" msgstr "صفبندی اتصالات: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1231 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1265 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1289 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1319 #, csharp-format msgid "Joining: {0}" msgstr "در حال اتصال به {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1291 msgid "Remaining" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1296 #, csharp-format msgid "active joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1305 #, csharp-format msgid "queued joins: {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1751 msgid "IRC Op" msgstr "عملیات IRC" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1753 msgid "Owner" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1755 msgid "ChanAdmin" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1757 msgid "Op" msgstr "عملیات" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1759 msgid "Halfop" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1761 msgid "Voice" msgstr "صدا" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1824 #, csharp-format msgid "Topic for {0}: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1826 #, csharp-format msgid "No topic set for {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1991 msgid "ban" msgstr "تحریم" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2002 msgid "No bans in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2039 msgid "ban exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2050 msgid "No ban exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2087 msgid "invite exception" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2098 msgid "No invite exceptions in channel" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2212 #, csharp-format msgid "Your user mode is {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2238 #, csharp-format msgid "{0} is already on {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2246 #, csharp-format msgid "Inviting {0} to {1}" msgstr "در حال دعوت کردن از {0} به {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2269 msgid "Users" msgstr "کاربران" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2320 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2458 msgid "Connection error! Reason: " msgstr "خطا در ارتباط! علت:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2470 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "پارامتر ناکافی برای دستور {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2479 msgid "Not connected to server" msgstr "غیر متصل به سرویس دهنده {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2688 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: نام مستعار/نام کانال ناموجود" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2807 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2822 #, csharp-format msgid "Nick {0} is already in use" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2838 msgid "Cannot join to channel:" msgstr "ناتوان در ملحق شدن به کانال:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2840 msgid "You are banned" msgstr "شما محروم شده اید" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2950 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2959 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3210 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3355 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3380 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3388 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3406 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3438 #, csharp-format msgid "You're now known as {0}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3441 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} از این پس با نام {1} شناخته میشود." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3475 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3635 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3666 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3702 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] خارج شده است." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3801 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3851 #, csharp-format msgid "{0} is away: {1}" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3861 msgid "You are no longer marked as being away" msgstr "" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3871 msgid "You have been marked as being away" msgstr "" smuxi-1.1/po-Engine-IRC/da.po0000664000175000017500000002740514011526464016513 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-11 17:45+0000\n" "PO-Revision-Date: 2018-03-08 17:28+0100\n" "Last-Translator: Alan Mortensen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:256 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} inviterer dig til {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:280 msgid "Accept invite (join room)" msgstr "Accepter invitation (gå til rum)" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:308 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1792 msgid "away" msgstr "fraværende" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:314 #, csharp-format msgid "lag: {0} seconds" msgstr "lag: {0} sekunder" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:320 msgid "not connected" msgstr "ikke forbundet" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:377 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Bruger proxy: {0}:{1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:384 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Forbinder til {0} port {1} …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:398 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:549 #, csharp-format msgid "Connection to {0} established" msgstr "Forbindelse til {0} etableret" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 msgid "Logging in..." msgstr "Logger ind …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:447 msgid "Connection failed!" msgstr "Forbindelse mislykkedes!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:451 msgid "Connection failed! Reason: " msgstr "Forbindelse mislykkedes! Årsag: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:460 msgid "Open Smuxi FAQ for help" msgstr "Åbn OSS om Smuxi for at få hjælp" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:474 msgid "Disconnecting..." msgstr "Afbryder …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:479 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Afbryder fra {0} …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:486 #, csharp-format msgid "Disconnected from {0}" msgstr "Afbrudt fra {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:492 msgid "Connection closed" msgstr "Forbindelse lukket" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:501 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:576 msgid "Not connected" msgstr "Ikke forbundet" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:535 msgid "Reconnecting..." msgstr "Genforbinder …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:543 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Genforbinder til {0} …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:562 msgid "Reconnect Error" msgstr "Genforbindingsfejl" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:960 #, csharp-format msgid "Sleeping for {0} milliseconds" msgstr "Sover i {0} millisekunder" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1045 msgid "IrcProtocolManager Commands" msgstr "Kommandoer for IrcProtocolManager" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1128 #, csharp-format msgid "Invalid port: {0}" msgstr "Ugyldig port: {0}" #. TRANSLATOR: some IRC networks dislike too many joins in a #. short period and thus Smuxi throttles/queues them #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1223 #, csharp-format msgid "Queuing joins: {0}" msgstr "Sætter join sammen: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1244 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "Allerede tilsluttet til kanal: {0}. Tast /window {0} for at skifte." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1278 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktive join: {0} - Join i kø: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1302 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1332 #, csharp-format msgid "Joining: {0}" msgstr "Joiner: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1304 msgid "Remaining" msgstr "Tilbage" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1309 #, csharp-format msgid "active joins: {0}" msgstr "aktive join: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1318 #, csharp-format msgid "queued joins: {0}" msgstr "join i kø: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1773 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1775 msgid "Owner" msgstr "Ejer" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 msgid "ChanAdmin" msgstr "KanalAdm" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1779 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 msgid "Halfop" msgstr "Halfop" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1783 msgid "Voice" msgstr "Voice" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1846 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Emne for {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "No topic set for {0}" msgstr "Intet emne angivet for {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2013 msgid "ban" msgstr "giv karantæne" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2024 msgid "No bans in channel" msgstr "Ingen karantæner i kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2061 msgid "ban exception" msgstr "Karantæneundtagelse" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2072 msgid "No ban exceptions in channel" msgstr "Ingen karantæneundtagelser i kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2109 msgid "invite exception" msgstr "invitationsundtagelse" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2120 msgid "No invite exceptions in channel" msgstr "Ingen invitationsundtagelser i kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2234 #, csharp-format msgid "Your user mode is {0}" msgstr "Din brugertilstand er {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2260 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} er allerede på {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2268 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Inviterer {0} til {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2291 msgid "Users" msgstr "Brugere" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2342 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "I alt {0} brugere [{1} op'er, {2} voice'er, {3} normale]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2480 msgid "Connection error! Reason: " msgstr "Forbindelsesfejl! Årsag: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2492 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ikke nok parametre for {0} kommando" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2501 msgid "Not connected to server" msgstr "Ikke forbundet til server" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2745 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Intet sådan brugernavn/kanal" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2864 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Øgede forsinkelse for send til {0}ms for at undgå at blive oversvømmet på " "serveren igen." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2879 #, csharp-format msgid "Nick {0} is already in use" msgstr "Brugernavn {0} er allerede i brug" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2895 msgid "Cannot join to channel:" msgstr "Kan ikke slutte til kanal:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2897 msgid "You are banned" msgstr "Du har karantæne" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2980 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] anmod om CTCP {2} fra {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3007 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING svar fra {0}: {1} sekunder" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3016 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} svar fra {1}: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3268 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] har sluttet sig til {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3417 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] har forladt {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3442 #, csharp-format msgid "You were kicked from {0} by {1}" msgstr "Du blev smidt ud fra {0} af {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3450 #, csharp-format msgid "{0} was kicked from {1} by {2}" msgstr "{0} blev smidt ud fra {1} af {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3468 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3500 #, csharp-format msgid "You're now known as {0}" msgstr "Du er nu kendt som {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3503 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} er nu kendt som {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3537 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} ændrede emnet på {1} til: {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3697 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Tilstandsændring [{0}] for bruger {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3728 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "tilstand/{0} [{1}] af {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3764 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] er gået" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3863 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Forbindelse til {0} port {1} er mislykkedes (forsøg {2}), forsøger om {3} " "sekunder …" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3913 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} er fraværende: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3923 msgid "You are no longer marked as being away" msgstr "Du er ikke længere registreret som fraværende" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3933 msgid "You have been marked as being away" msgstr "Du er registreret som fraværende" smuxi-1.1/po-Engine-IRC/hr.po0000664000175000017500000002557014011526464016541 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:20+0100\n" "PO-Revision-Date: 2012-01-08 14:08+0000\n" "Last-Translator: Matias M. \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:245 #, csharp-format msgid "{0} invites you to {1}" msgstr "{0} vas poziva u {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:276 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1519 msgid "away" msgstr "odsutan" #. TRANSLATOR: {0} is the amount of seconds #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:282 #, csharp-format msgid "lag: {0} seconds" msgstr "zakašnjenje: {0} sekundi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:288 msgid "not connected" msgstr "nije povezano" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:351 #, csharp-format msgid "Connecting to {0} port {1}..." msgstr "Povezivanje sa {0} port {1}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:357 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:463 #, csharp-format msgid "Connection to {0} established" msgstr "Povezivanje sa {0} uspjelo" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:360 msgid "Logging in..." msgstr "Prijavljivanje..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:394 msgid "Connection failed!" msgstr "Povezivanje nije uspjelo!" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:395 msgid "Connection failed! Reason: " msgstr "Povezivanje nije uspjelo! Razlog: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:404 msgid "Disconnecting..." msgstr "Prekidanje veze..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:407 #, csharp-format msgid "Disconnecting from {0}..." msgstr "Prekidanje veze sa {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:412 #, csharp-format msgid "Disconnected from {0}" msgstr "Prekinuta veza sa {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:415 msgid "Connection closed" msgstr "Veza zatvorena" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:420 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:477 msgid "Not connected" msgstr "Bez povezanosti" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:449 msgid "Reconnecting..." msgstr "Ponovno povezivanje..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:457 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Ponovno povezivanje sa {0}..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:471 msgid "Reconnect Error" msgstr "Greška pri ponovnom povezivanju" #. TRANSLATOR: this line is used as label / category for a #. list of commands below #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:875 msgid "IrcProtocolManager Commands" msgstr "IrcProtocolManager naredbe" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:943 #, csharp-format msgid "Invalid port: {0}" msgstr "Nevažeći port: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1047 #, csharp-format msgid "Queuing joins: {0}" msgstr "Zaredano povezivanje: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1061 #, csharp-format msgid "Already joined to channel: {0}. Type /window {0} to switch to it." msgstr "" "Već ste povezani sa kanalom: {0}. Upišite /window {0} za prebacivanje." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1096 #, csharp-format msgid "Active joins: {0} - Queued joins: {1}" msgstr "Aktivne veze: {0} - Zaredani povezivanje: {1}" #. TRANSLATORS: final message will look like this: #. Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1119 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1150 #, csharp-format msgid "Joining: {0}" msgstr "Povezivanje: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1121 msgid "Remaining" msgstr "Preostalo" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1126 #, csharp-format msgid "active joins: {0}" msgstr "aktivnih veza: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1135 #, csharp-format msgid "queued joins: {0}" msgstr "zaredanih veza: {0}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1506 msgid "IRC Op" msgstr "IRC Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1508 msgid "Op" msgstr "Op" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1510 msgid "Voice" msgstr "Voice" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1570 #, csharp-format msgid "Topic for {0}: {1}" msgstr "Tema za {0}: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1575 #, csharp-format msgid "No topic set for {0}" msgstr "{0} nema zadanu temu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1655 msgid "ban" msgstr "zabrana" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1665 msgid "No bans in channel" msgstr "Nema zabrana u kanalu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1777 #, csharp-format msgid "Inviting {0} to {1}" msgstr "Pozivanje {0} u {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1781 #, csharp-format msgid "{0} is already on {1}" msgstr "{0} je već u {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1806 msgid "Users" msgstr "Korisnici" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1848 #, csharp-format msgid "Total of {0} users [{1} ops, {2} voices, {3} normal]" msgstr "Ukupno korisnika: {0} [Op: {1}, Voice: {2}, Uobičajeni: {3}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1979 msgid "Connection error! Reason: " msgstr "Greška pri povezivanju! Razlog: " #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1989 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nedovoljno parametara za {0} naredbu" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:1999 msgid "Not connected to server" msgstr "Bez povezanosti sa poslužiteljem" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2261 #, csharp-format msgid "{0}: No such nick/channel" msgstr "{0}: Nema takvog nadimka niti kanala" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2390 #, csharp-format msgid "" "Increased send delay to {0}ms to avoid being flooded off the server again." msgstr "" "Zakašnjenje pri slanju povećano na {0}ms kako bi se spriječilo floodanje " "poslužitelja." #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2404 msgid "Nick" msgstr "Nadimak" #. TRANSLATOR: the final line will look like this: #. -!- Nick {0} is already in use #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2414 msgid "is already in use" msgstr "je već u uporabi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2424 msgid "Cannot join to channel:" msgstr "Nemoguće povezivanje sa kanalom:" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2432 msgid "You are banned" msgstr "Prognani ste" #. TRANSLATOR: {0}: nickname, {1}: ident@host, #. {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter #. example: #. meebey [meebey@example.com] requested CTCP VERSION from meebey: #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2508 #, csharp-format msgid "{0} [{1}] requested CTCP {2} from {3}: {4}" msgstr "{0} [{1}] traži CTCP {2} od {3}: {4}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2533 #, csharp-format msgid "CTCP PING reply from {0}: {1} seconds" msgstr "CTCP PING odgovor od {0}: {1} sekundi" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2541 #, csharp-format msgid "CTCP {0} reply from {1}: {2}" msgstr "CTCP {0} odgovor od {1}: {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2747 #, csharp-format msgid "{0} [{1}] has joined {2}" msgstr "{0} [{1}] se pridružio {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2873 #, csharp-format msgid "{0} [{1}] has left {2}" msgstr "{0} [{1}] je napustio {2}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2898 #, csharp-format msgid "You were kicked from {0} by {1} [{2}]" msgstr "{1} vas je izbacio sa {0} [{2}]" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2906 #, csharp-format msgid "{0} was kicked from {1} by {2} [{3}]" msgstr "{1} je izbacio {0} sa {2} [{3}]" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2923 #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2956 #, csharp-format msgid "You're now known as {0}" msgstr "Od sada ste znani kao {0}" #. TRANSLATOR: do NOT change the position of {0} or {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2961 #, csharp-format msgid "{0} is now known as {1}" msgstr "{0} je sada znan kao {1}" #. TRANSLATOR: do NOT change the position of {0} and {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:2998 #, csharp-format msgid "{0} changed the topic of {1} to: {2}" msgstr "{0} je promijenio temu {1} u: {2}" #. TRANSLATOR: do NOT change the position of {1}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3075 #, csharp-format msgid "Mode change [{0}] for user {1}" msgstr "Promjena modusa [{0}] za korisnika {1}" #. TRANSLATOR: do NOT change the position of {2}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3085 #, csharp-format msgid "mode/{0} [{1}] by {2}" msgstr "mode/{0} [{1}] od strane {2}" #. TRANSLATOR: do NOT change the position of {0}! #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3122 #, csharp-format msgid "{0} [{1}] has quit" msgstr "{0} [{1}] je otišao" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3199 #, csharp-format msgid "" "Connection to {0} port {1} has failed (attempt {2}), retrying in {3} " "seconds..." msgstr "" "Veza sa {0} port {1} nije uspjela (pokušaj {2}), ponovno za {3} sekundi..." #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3248 #, csharp-format msgid "{0} is away: {1}" msgstr "{0} je odsutan: {1}" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3254 msgid "You are no longer marked as being away" msgstr "Više niste označeni kao odsutni" #: ../src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs:3260 msgid "You have been marked as being away" msgstr "Označeni ste kao odsutni" smuxi-1.1/aclocal.m40000664000175000017500000044507014011526470015172 0ustar00meebeymeebey00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 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_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) 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'.])]) # gettext.m4 serial 68 (gettext-0.19.8) dnl Copyright (C) 1995-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value '$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], []) # iconv.m4 serial 19 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2007-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, dnl Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif ]], [[int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; ]])], [am_cv_func_iconv_works=yes], , [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) test "$am_cv_func_iconv_works" = no || break done LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [m4_ifdef([gl_00GNULIB], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ]], [[]])], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) dnl Also substitute ICONV_CONST in the gnulib generated . m4_ifdef([gl_ICONV_H_DEFAULTS], [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) if test -n "$am_cv_proto_iconv_arg1"; then ICONV_CONST="const" fi ]) fi ]) # intlmacosx.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2004-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # lib-ld.m4 serial 6 dnl Copyright (C) 1996-2003, 2009-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid dnl collision with libtool.m4. dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi 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([acl_cv_path_LD], [if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_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 `"$acl_cv_path_LD" -v 2>&1 = 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) # lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. 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 ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl 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]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. 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 ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. 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 ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl 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 ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # po.m4 serial 24 (gettext-0.19) dnl Copyright (C) 1995-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.60]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AC_PROG_SED])dnl AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.19]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" tab=`printf '\t'` if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) # Copyright (C) 2002-2018 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. # 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.16' 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.16.1], [], [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.16.1])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-2018 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. # 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], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$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-2018 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. # 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", "OBJC", "OBJCXX", "UPC", or "GJC". # 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 m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" 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 10 /bin/sh. echo '/* dummy */' > 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], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) 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-2018 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # 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.65])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], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) 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], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [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([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). 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])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro 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 # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) 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-2018 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. # 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+set}" != 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-2018 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. # 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])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2018 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. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 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. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 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. # 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 is modern enough. # If it is, 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 --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 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. # _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])]) # Copyright (C) 1999-2018 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. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 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. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 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 if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done 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]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 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. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 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. # 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-2018 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. # _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-2018 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. # _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}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} 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([m4/expansions.m4]) m4_include([m4/intltool.m4]) m4_include([m4/mono.m4]) m4_include([m4/programs.m4]) smuxi-1.1/Makefile.include0000644000175000017500000001177211714013610016402 0ustar00meebeymeebey00000000000000VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__=, get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), -r:$(ref)))) build_references_ref += $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) build_references_ref += $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) EXTRA_DIST += $(build_sources) $(build_resx_files) $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) $(DATA_FILES) $(build_culture_res_files) CLEANFILES += $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) $(build_satellite_assembly_list) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) smuxi-1.1/compile0000755000175000017500000001632713367740426014721 0ustar00meebeymeebey00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: smuxi-1.1/po-Engine/0000775000175000017500000000000014011526502015135 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine/LINGUAS0000664000175000017500000000014314011526464016167 0ustar00meebeymeebey00000000000000ca cs da de el en_GB es fa fi fr hr hu id it lt nb nl pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Engine/en_GB.po0000664000175000017500000001115514011526464016461 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2009 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # Ryan Smith-Evans , 2009. # msgid "" msgstr "" "Project-Id-Version: smuxi 0.6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-08-05 01:46+0200\n" "PO-Revision-Date: 2010-01-08 23:46+0100\n" "Last-Translator: Ryan Smith-Evans \n" "Language-Team: English (British)\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine/FrontendManager.cs:223 msgid "No network connections" msgstr "No network connections" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:146 msgid "Not connected to server" msgstr "Not connected to server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:158 #: ../src/Engine/Session.cs:736 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Not enough parameters for {0} command" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:174 #, fuzzy, csharp-format msgid "Connected to {0}" msgstr "Not connected to server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:196 #, csharp-format msgid "Disconnected from {0}" msgstr "Disconnected from {0}" #: ../src/Engine/Session.cs:154 msgid "Welcome to Smuxi" msgstr "Welcome to Smuxi" #: ../src/Engine/Session.cs:160 msgid "Type /help to get a list of available commands." msgstr "Type /help to get a list of available commands." #: ../src/Engine/Session.cs:163 msgid "After you have made a connection the list of available commands changes. Use the /help command again to see the extended command list." msgstr "After you have made a connection the list of available commands changes. Use the /help command again to see the extended command list." #: ../src/Engine/Session.cs:216 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatic connect to {0} failed!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:407 msgid "Engine Commands" msgstr "Engine Commands" #: ../src/Engine/Session.cs:510 msgid "Connect failed!" msgstr "Connect failed!" #: ../src/Engine/Session.cs:540 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Disconnect failed. Could not find server: {0}" #: ../src/Engine/Session.cs:579 #, fuzzy msgid "Reconnect failed!" msgstr "Automatic connect to {0} failed!" #: ../src/Engine/Session.cs:598 msgid "Configuration reloaded" msgstr "Configuration reloaded" #: ../src/Engine/Session.cs:603 msgid "Configuration saved" msgstr "Configuration saved" #: ../src/Engine/Session.cs:607 msgid "Invalid parameter for config; use load or save" msgstr "Invalid parameter for config. Use load or save" #: ../src/Engine/Session.cs:637 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Invalid parameter for network. Use list, switch or close" #: ../src/Engine/Session.cs:648 msgid "Networks" msgstr "Networks" #: ../src/Engine/Session.cs:652 msgid "Type" msgstr "Type" #: ../src/Engine/Session.cs:653 msgid "Host" msgstr "Host" #: ../src/Engine/Session.cs:654 msgid "Port" msgstr "Port" #: ../src/Engine/Session.cs:676 #, csharp-format msgid "Network close failed - could not find network with host: {0}" msgstr "Network close failed. Could not find network with host: {0}" #: ../src/Engine/Session.cs:710 #, csharp-format msgid "Network switch failed - could not find network with host: {0}" msgstr "Network switch failed. Could not find network with host: {0}" #: ../src/Engine/Session.cs:725 msgid "Not connected to any network" msgstr "Not connected to any network" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1052 msgid "Connect failed." msgstr "Connection failed." #: ../src/Engine/Session.cs:1083 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "No protocol manager found for the protocol: {0}" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Username must not be empty." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Password must not be empty." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "User \"{0}\" doesn't exist." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "User \"{0}\" already exists." #~ msgid "Unknown protocol: {0}" #~ msgstr "Unknown protocol: {0}" smuxi-1.1/po-Engine/cs.po0000664000175000017500000002222414011526464016113 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013-2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:30+0200\n" "PO-Revision-Date: 2014-08-24 11:49+0000\n" "Last-Translator: RavuAlHemio \n" "Language-Team: Czech (http://www.transifex.com/projects/p/smuxi/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Žádná připojení k sítí" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimalizuje se: {0}…" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optimalizace {0} se nezdařila. Příčina: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "Vaše historie pokeců se stala kvůli chybě nedostupnou, ale odteď bude zase uložena." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} píše…" #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} přestal(a) psát…" #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} je pryč" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} je odpojen(a)" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} je připojen(a)" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "nepřipojen(a)" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Není připojeno k serveru" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pro příkaz {0} nebyl zadán dostatek parametrů" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Připojeno k {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Odpojeno od {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatické připojování k {0}…" #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatické připojení k {0} selhalo!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Příkazy výkonné části" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Připojení selhalo!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Odpojení selhalo – nepodařilo se najít server: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Opětovné připojení selhalo!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Nastavení bylo načteno" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Nastavení bylo uloženo" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Neplatný formát dvojice klíč/hodnota." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Neplatný klíč nastavení: „{0}“" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Nelze převést hodnotu nastavení: „{0}“ na typ: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "Neplatný klíč pro smazání z nastavení: „{0}“. Platné klíče ke smazání: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Vzor zprávy s ID: „{0}“ neexistuje." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Vzor zprávy s ID: „{0}“ smazán." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Neplatný parametr pro nastavení: použijte load, save, get nebo set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Neplatný parametr pro network; použijte list, switch nebo close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Připojené sítě:" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Síť" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Hostitel" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "žádné" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Dostupné sítě:" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Uzavření sítě selhalo – síť nenalezena: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Přepnutí sítě selhalo – síť nenalezena: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Není připojeno k žádné síti" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Nezdařilo se uložení historie pokecu. Vaše historie pokecu nebude uchována. Příčina: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Připojení selhalo." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Pro protokol nebyl nalezen žádný správce protokolu: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Vítejte ve Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Pro zobrazení seznamu dostupných příkazů napište /help." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Po zdařeném připojení se změní seznam dostupných příkazů. Pro zobrazení " "rozšířeného seznamu příkazů přepněte na záložku nového připojení a použijte " "znovu příkaz /help." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Uživatelské jméno nemůže být prázdné." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Heslo nemůže být prázdné." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Uživatel „{0}“ neexistuje." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Uživatel „{0}“ již existuje." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Síť nesmí být prázdná." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Název hostitelského serveru nesmí být prázdný." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Název hostitelského serveru obsahuje neplatné znaky (zalomení řádku)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Identifikace serveru „{0}“ již existuje." #: ../src/Engine/Chats/ChatModel.cs:109 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Nezdařilo se načtení historie pokecu. Vaše historie pokecu nebude uchována. Příčina: {0}" #: ../src/Engine/Chats/ChatModel.cs:311 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "Nezdařilo se otevření historie pokecu pro zápis. Vaše historie pokecu nebude uchována. Příčina: {0}" smuxi-1.1/po-Engine/zh_CN.po0000664000175000017500000002112414011526464016505 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2011-2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:30+0200\n" "PO-Revision-Date: 2014-03-17 08:12+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "无网络连接" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "正在优化: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "优化失败: {0}。原因: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "由于发生错误,您的聊天历史不再可用;但今后的聊天历史将会保留。" #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} 正在输入..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} 已停止输入..." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} 处于离开状态" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} 已下线" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} 已上线" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "未连接" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "未连接到服务器" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "{0} 命令参数不足" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "已连接到 {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "已从 {0} 断开连接" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "正在自动连接到 {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "自动连接 {0} 失败!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "引擎命令" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "连接失败!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "连接断开失败 - 找不到服务器: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "重新连接失败!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "配置已重新载入" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "配置已保存" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "键/值格式无效。" #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "配置键无效: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "无法转换配置键: '{0}' 目标类型: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "配置移除键无效: '{0}'。有效的移除键: MessagePatterns/{{ID}}。" #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "消息匹配规则 ID: '{0}' 不存在。" #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "消息匹配规则 ID: '{0}' 已移除。" #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "config 参数无效; 请使用 load、save、get 或 set。" #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "network 的参数无效; 使用 list、switch 或 close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "已连接网络" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "网络" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "协议" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "主机" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "端口" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "无" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "可用网络" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "网络关闭失败——无法找到网络: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "网络切换失败——无法找到网络: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "未连接到任何网络" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "无法写入聊天历史。您的聊天历史将不会保存。原因: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "连接失败。" #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "未找到该协议的协议管理器: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "欢迎来到 Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "输入 /help 获取可用命令列表。" #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "连接后可用命令列表将有所变化。请访问新打开的连接页面,再次使用 /help 命令查看扩展后的命令列表。" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "用户名不能为空。" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "密码不能为空。" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "用户 \"{0}\" 不存在。" #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "用户名 \"{0}\" 已存在。" #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "网络不能为空。" #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "服务器主机名不能为空。" #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "服务器主机名包含无效字符 (换行)。" #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "服务器 ID '{0}' 已存在。" #: ../src/Engine/Chats/ChatModel.cs:109 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "无法加载聊天历史。您的聊天历史将不会保留。原因: {0}" #: ../src/Engine/Chats/ChatModel.cs:311 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "聊天历史无法打开写入。您的聊天历史将不会保留。原因: {0}" smuxi-1.1/po-Engine/sk.po0000664000175000017500000001240114011526464016117 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2011-09-30 08:39+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../src/Engine/FrontendManager.cs:230 msgid "No network connections" msgstr "Žiadne pripojenia k sieti" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:161 msgid "Not connected to server" msgstr "Nie je pripojené k serveru" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:173 #: ../src/Engine/Session.cs:751 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pre príkaz {0} nie je vložený dostatok parametrov" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "Pripojené k {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:213 #, csharp-format msgid "Disconnected from {0}" msgstr "Odpojené od {0}" #: ../src/Engine/Session.cs:154 msgid "Welcome to Smuxi" msgstr "Vitajte v Smuxi" #: ../src/Engine/Session.cs:160 msgid "Type /help to get a list of available commands." msgstr "Pre zobrazenie zoznamu dostupných príkazov zadajte príkaz /help." #: ../src/Engine/Session.cs:163 msgid "" "After you have made a connection the list of available commands changes. Use" " the /help command again to see the extended command list." msgstr "" "Zoznam dostupných príkazov sa zmení po tom, ako sa prihlásite. Pre " "zobrazenie rozšíreného zoznamu dostupných príkazov znovu zadajte príkaz " "/help." #: ../src/Engine/Session.cs:216 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatické pripojenie k {0} zlyhalo!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:411 msgid "Engine Commands" msgstr "Príkazy enginu" #: ../src/Engine/Session.cs:514 msgid "Connect failed!" msgstr "Pripojenie zlyhalo!" #: ../src/Engine/Session.cs:544 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Odpojenie zlyhalo - nepodarilo sa nájsť server: {0}" #: ../src/Engine/Session.cs:583 msgid "Reconnect failed!" msgstr "Opätovné pripojenie zlyhalo!" #: ../src/Engine/Session.cs:602 msgid "Configuration reloaded" msgstr "Nastavenie znova načítané" #: ../src/Engine/Session.cs:607 msgid "Configuration saved" msgstr "Nastavenie uložené" #: ../src/Engine/Session.cs:611 msgid "Invalid parameter for config; use load or save" msgstr "Neplatný parameter pre config; zadajte load alebo save" #: ../src/Engine/Session.cs:641 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Neplatný parameter pre network; zadajte list, switch alebo close" #: ../src/Engine/Session.cs:652 msgid "Networks" msgstr "Siete" #: ../src/Engine/Session.cs:656 msgid "Type" msgstr "Typ" #: ../src/Engine/Session.cs:657 msgid "Host" msgstr "Hostiteľ" #: ../src/Engine/Session.cs:658 msgid "Port" msgstr "Port" #: ../src/Engine/Session.cs:680 #, csharp-format msgid "Network close failed - could not find network with host: {0}" msgstr "Uzatvorenie siete zlyhalo - nebolo možné nájsť hostiteľskú sieť: {0}" #: ../src/Engine/Session.cs:725 #, csharp-format msgid "Network switch failed - could not find network with host: {0}" msgstr "Sieťový uzol zlyhal - nebolo možné nájsť hostiteľskú sieť: {0}" #: ../src/Engine/Session.cs:740 msgid "Not connected to any network" msgstr "Nie je pripojené k žiadnej sieti" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1067 msgid "Connect failed." msgstr "Pripojenie zlyhalo." #: ../src/Engine/Session.cs:1098 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Pre protokol nebol nájdený žiadny správca protokolu: {0}" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Používateľské meno nemôže byť prázdne." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Heslo nemôže byť prázdne." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Používateľ \"{0}\" neexistuje." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Používateľ \"{0}\" existuje." #: ../src/Engine/Config/ServerListController.cs:131 msgid "Server hostname must not be empty." msgstr "Hostiteľský server nemôže byť prázdny." #: ../src/Engine/Config/ServerListController.cs:134 msgid "Server hostname contains invalid characters (newline)." msgstr "Hostiteľský server obsahuje neplatné znaky (nový riadok)." #: ../src/Engine/Config/ServerListController.cs:140 #, csharp-format msgid "Server '{0}' already exists." msgstr "Server '{0}' už existuje." smuxi-1.1/po-Engine/el.po0000664000175000017500000002644614011526464016120 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:40+0000\n" "PO-Revision-Date: 2015-07-20 16:09+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Χωρίς συνδέσεις δικτύου" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Βελτιστοποιείται: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Αποτυχία βελτιστοποίησης: {0}. Αιτία: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Το ιστορικό συνομιλιών δεν είναι πια διαθέσιμο λόγω ενός σφάλματος, αλλά θα " "διατηρηθεί από δω και πέρα." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "Ο {0} πληκτρολογεί..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "Ο {0} έχει σταματήσει να πληκτρολογεί..." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "Ο {0} είναι απών" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "Ο {0} είναι αποσυνδεδεμένος " #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "Ο {0} είναι συνδεμένος" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "δε συνδέθηκε" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Δεν υπάρχει σύνδεση με τον διακομιστή" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ανεπαρκείς παράμετροι για την εντολή {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Σύνδεση με το {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Αποσυνδέθηκε από το {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Αυτόματη σύνδεση με το {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Αποτυχία της αυτόματης σύνδεσης με το {0}!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Εντολές μηχανήματος" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Αποτυχία σύνδεσης!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Αποτυχία αποσύνδεσης - αδύνατη η εύρεση διακομιστή: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Αποτυχία επανασύνδεσης!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Η ρύθμιση επαναφορτώθηκε" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Η ρύθμιση αποθηκεύτηκε" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Άκυρη μορφή κλειδιού/τιμής." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Άκυρο κλειδί ρύθμισης: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Αδύνατη η μετατροπή τιμής ρύθμισης: '{0}' σε τύπο: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Άκυρο κλειδί αφαίρεσης ρύθμισης: '{0}'. Έγκυρα κλειδιά αφαίρεσης: " "MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Το μοτίβο μηνύματος με αναγνωριστικό: '{0}' δεν υπάρχει." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Το μοτίβο μηνύματος με αναγνωριστικό: '{0}' αφαιρέθηκε." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Άκυρη παράμετρος για ρύθμιση - χρησιμοποιήστε φόρτωση αποθήκευση, λήψη ή " "ορισμό." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Άκυρη παράμετρος για δίκτυο. Χρησιμοποιήστε κατάλογο, διακόπτη ή κλείσιμο." #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Συνδεμένα δίκτυα" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Δίκτυο" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Πρωτόκολλο" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Οικοδεσπότης" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Θύρα" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Kανένα" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Διαθέσιμα δίκτυα" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Αποτυχία κλεισίματος δικτύου - αδύνατη η εύρεση δικτύου: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Αποτυχία εναλλαγής δικτύου - αδύνατη η εύρεση δικτύου: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Δεν υπάρχει σύνδεση με κανένα δίκτυο" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Αποτυχία εγγραφής στο ιστορικό συνομιλιών. Το ιστορικό συνομιλιών δεν θα " "διατηρηθεί. Αιτία: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Αποτυχία σύνδεσης." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Δεν βρέθηκε κανένας διαχειριστής πρωτοκόλλου για το πρωτόκολλο!: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Καλωσορίσατε στο Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "" "Πληκτρολογήστε /help για να πάρετε έναν κατάλογο των διαθέσιμων εντολών." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Αφού έχετε κάνει μια σύνδεση ο κατάλογος των διαθέσιμων εντολών αλλάζει. " "Μεταβείτε στην πρόσφατη καρτέλα ανοιγμένη σύνδεση και χρησιμοποιήστε την " "εντολή /help ξανά για να δείτε τον επεκταμένο κατάλογο εντολών." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Ο όνομα χρήστη δεν πρέπει να είναι κενό." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Ο κωδικός πρόσβασης δεν πρέπει να είναι κενός." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Ο χρήστης \"{0}\" δεν υπάρχει." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Ο χρήστης \"{0}\" υπάρχει ήδη." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Το δίκτυο δεν πρέπει να είναι κενό." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Το όνομα οικοδεσπότη διακομιστή δεν πρέπει να είναι κενό." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" "Το όνομα οικοδεσπότη διακομιστή περιέχει άκυρους χαρακτήρες (νέα γραμμή)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Ο διακομιστής '{0}' υπάρχει ήδη." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Αποτυχία φόρτωσης του ιστορικού συνομιλιών. Το ιστορικό συνομιλιών δεν θα " "διατηρηθεί. Αιτία: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Αποτυχία ανοίγματος του ιστορικού συνομιλιών για εγγραφή. Το ιστορικό " "συνομιλιών δεν θα διατηρηθεί. Αιτία: {0}" smuxi-1.1/po-Engine/ro.po0000664000175000017500000002251414011526464016130 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:18+0000\n" "PO-Revision-Date: 2018-04-15 21:07+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Nu sunt conexiuni de rețea" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Se optimizează: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Nu s-a putut optimiza: {0}. Motivul: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Istoricul de discuție nu mai este disponibil din cauza unei erori dar va fi " "păstrat de acum înainte." #: ../src/Engine/Messages/MessageBuilder.cs:789 #, csharp-format msgid "{0} is typing..." msgstr "{0} tastează..." #: ../src/Engine/Messages/MessageBuilder.cs:795 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} nu mai tastează..." #: ../src/Engine/Messages/MessageBuilder.cs:840 #, csharp-format msgid "{0} is away" msgstr "{0} este absent" #: ../src/Engine/Messages/MessageBuilder.cs:846 #, csharp-format msgid "{0} is offline" msgstr "{0} nu este conectat" #: ../src/Engine/Messages/MessageBuilder.cs:852 #, csharp-format msgid "{0} is online" msgstr "{0} este conectat" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "neconectat" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Neconectat la server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1083 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nu sunt suficienți parametri pentru comanda {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Conectat la {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Deconectat de la {0}" #: ../src/Engine/Session.cs:213 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Se conectează automat la {0}..." #: ../src/Engine/Session.cs:248 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Conectarea automată la {0} a eșuat!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:521 msgid "Engine Commands" msgstr "Comenzi motor" #: ../src/Engine/Session.cs:650 msgid "Connect failed!" msgstr "Conectarea a eșuat!" #: ../src/Engine/Session.cs:673 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Deconectarea a eșuat - nu s-a putut găsi serverul: {0}" #: ../src/Engine/Session.cs:715 msgid "Reconnect failed!" msgstr "Reconectarea a eșuat!" #: ../src/Engine/Session.cs:739 msgid "Configuration reloaded" msgstr "Configurație reîncărcată" #: ../src/Engine/Session.cs:743 msgid "Configuration saved" msgstr "Configurație salvată" #: ../src/Engine/Session.cs:770 msgid "Invalid key/value format." msgstr "Format de cheie/valoare nevalid." #: ../src/Engine/Session.cs:794 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Cheie de configurare nevalidă: „{0}”" #: ../src/Engine/Session.cs:810 ../src/Engine/Session.cs:816 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Nu s-a putut converti valoarea de configurare: „{0}” la tipul: {1}" #: ../src/Engine/Session.cs:830 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Cheie de eliminare a configurării nevalidă: „{0}”. Chei de eliminare " "valide: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:843 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Modelul de mesaj cu ID-ul: „{0}” nu există." #: ../src/Engine/Session.cs:850 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Model de mesaj cu ID-ul: „{0}” eliminat." #: ../src/Engine/Session.cs:858 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Parametru nevalid pentru configurare; utilizați load, save, get sau set." #: ../src/Engine/Session.cs:935 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Parametru nevalid pentru rețea; utilizați list, switch, sau close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:965 msgid "Connected Networks" msgstr "Rețele conectate" #: ../src/Engine/Session.cs:970 ../src/Engine/Session.cs:994 msgid "Network" msgstr "Rețea" #: ../src/Engine/Session.cs:971 msgid "Protocol" msgstr "Protocol" #: ../src/Engine/Session.cs:972 msgid "Host" msgstr "Gazdă" #: ../src/Engine/Session.cs:973 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:979 ../src/Engine/Session.cs:1000 msgid "None" msgstr "Niciuna" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:986 msgid "Available Networks" msgstr "Rețele disponibile" #: ../src/Engine/Session.cs:1014 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Închiderea rețelei a eșuat - nu s-a putut găsi rețeaua: {0}" #: ../src/Engine/Session.cs:1058 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Comutarea rețelei a eșuat - nu s-a putut găsi rețeaua: {0}" #: ../src/Engine/Session.cs:1076 msgid "Not connected to any network" msgstr "Nu este conectat la nicio rețea" #: ../src/Engine/Session.cs:1333 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Nu s-a putut scrie istoricul discuției. Istoricul de discuție nu va fi " "păstrat. Motivul: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1563 msgid "Connect failed." msgstr "Conectarea a eșuat." #: ../src/Engine/Session.cs:1577 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nu s-a găsit un manager de protocol pentru protocolul: {0}" #: ../src/Engine/Session.cs:1916 msgid "Welcome to Smuxi" msgstr "Bine ați venit la Smuxi" #: ../src/Engine/Session.cs:1923 msgid "Type /help to get a list of available commands." msgstr "Tastați /help pentru a obține o listă de comenzi disponibile." #: ../src/Engine/Session.cs:1929 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "După ce ați creat o conexiune lista de comenzi disponibile se modifică. " "Navigați la tabul de conexiune deschis recent și utilizați comanda /help " "din nou pentru a consulta lista de comenzi extinsă." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Numele de utilizator nu trebuie să fie gol." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Parola nu trebuie să fie goală." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Utilizatorul „{0}” nu există." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Utilizatorul „{0}” există deja." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Rețeaua nu trebuie să fie goală." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Numele de gazdă al serverului nu trebuie să fie gol." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Numele de gazdă a serverului conține caractere nevalide (linie nouă)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "ID-ul de server „{0}” există deja." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Nu s-a putut încărca istoricul discuției. Istoricul de discuție nu va fi " "păstrat. Motivul: {0}" #: ../src/Engine/Chats/ChatModel.cs:344 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Nu s-a putut deschide istoricul discuției pentru scriere. Istoricul de " "discuție nu va fi păstrat. Motivul: {0}" smuxi-1.1/po-Engine/fi.po0000664000175000017500000002214314011526464016104 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:30+0200\n" "PO-Revision-Date: 2015-05-04 04:45+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Ei verkkoyhteyttä" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimoidaan: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optimointi epäonnistui: {0}. Syy: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "Viestihistoriasi ei ole saatavilla virheen vuoksi mutta se tallennetaan tästä eteenpäin." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} kirjoittaa..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} lopetti kirjoittamisen..." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} on poissa" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} on offline-tilassa" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} on linjoilla" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "ei yhteydessä" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Ei yhteyttä palvelimeen" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ei tarpeeksi parametrejä komennolle {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Yhdistetty kohteeseen {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Yhteys katkaistu kohteesta {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Yhdistetään automaattisesti kohteeseen {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automaattinen yhdistys palvelimeen {0} epäonnistui!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Moottorin komennot" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Yhdistäminen epäonnistui!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Yhteyden katkaisu epäonnistui - palvelinta {0} ei löydetty" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Uudelleenyhdistäminen epäonnistui!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Asetukset ladattu uudelleen" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Asetukset tallennettu" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Epäkelpo avain/arvo -muoto." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Epäkelpo asetusavain: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Ei voitu kääntää asetusavainarvoa: '{0}' tyyppiin: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "Epäkelpo valinnan poisto-avain: '{0}'. Kelvolliset poisto-avaimet: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Viestikuviota joka sisältää ID: '{0}' ei ole olemassa." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Viestikuvio ID: '{0}' poistettu." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Epäkelpo parametri asetuksille; käytä komentoja load, save get tai set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Epäkelpo parametri network:lle, käytä komentoja list, switch tai close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Yhdistetyt Verkot" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Verkko" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokolla" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Isäntä" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Portti" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Ei mitään" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Saatavilla olevat verkot" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Verkon sulkeminen epäonnistui - verkkoa ei löytynyt: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Verkon vaihtaminen epäonnistui - verkkoa ei löytynyt: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Ei yhdistettynä yhteenkään verkkoon" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Chat-historian tallennus epäonnistui. Chat-historiaasi ei säilötä. Syy: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Yhdistäminen epäonnistui." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Protokollan hallintaa ei löydetty protokollalle {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Tervetuloa Smuxiin" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Kirjoita /help saadaksesi listan käytössäolevista komennoista." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "Yhteydenmuodostuksen jälkeen lista käytettävistä komennoista muuttuu. Mene uuteen avautuneeseen yhteysvälilehteen ja käytä /help -komentoa nähdäksesi laajennetun komentolistauksen." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Käyttäjänimi ei saa olla tyhjä." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Salasana ei saa olla tyhjä." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Käyttäjää \"{0}\" ei ole olemassa." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Käyttäjä \"{0}\" on jo olemassa." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Verkko ei saa olla tyhjä." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Palvelimen isäntänimi ei saa olla tyhjä." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Palvelimen isäntänimi sisältää epäkelpoja merkkejä (rivinvaihto)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Palvelin ID:llä '{0}' on jo olemassa." #: ../src/Engine/Chats/ChatModel.cs:109 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Chat-historian lataaminen epäonnistui. Chat-historiaasi ei tallenneta. Syy: {0}" #: ../src/Engine/Chats/ChatModel.cs:311 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "Chat-historian avaaminen tallentamista varten epäonnistui. Chat-historiaasi ei tallenneta. Syy: {0}" smuxi-1.1/po-Engine/de.po0000664000175000017500000002274714011526464016110 0ustar00meebeymeebey00000000000000# German translation for smuxi-Engine. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2011-2013. # JB, 2014. # Mirco Bauer , 2013, 2015. # Wasilis Mandratzis-Walz, 2015. # Mario Blättermann , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:30+0200\n" "PO-Revision-Date: 2016-01-08 14:18+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Keine Netzwerkverbindungen" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Wird optimiert: {0} …" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optimierung fehlgeschlagen: {0}. Grund: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "Your chat history is no longer available because of an error but will be preserved from now on." msgstr "Ihr Gesprächsverlauf ist auf Grund eines Fehlers nicht mehr verfügbar, er wird aber von nun an vorgehalten." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} tippt …" #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} hat aufgehört zu tippen …" #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} ist abwesend" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} ist offline" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} ist online" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "Nicht verbunden" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Nicht mit dem Server verbunden" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nicht genügend Parameter für den Befehl {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Verbunden zu {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Getrennt von {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatische Verbindung zu {0} …" #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatische Verbindung zu {0} ist fehlgeschlagen!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Engine-Befehle" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Verbindung ist fehlgeschlagen!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Die Trennung ist fehlgeschlagen - Server {0} konnte nicht gefunden werden" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Wiederverbinden ist fehlgeschlagen!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Konfiguration wurde erneut geladen" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Konfiguration wurde gespeichert" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Ungültiges Schlüssel-/Wertformat." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Ungültiger Konfigurationsschlüssel: »{0}«" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Konfigurationswert konnte nicht umgewandelt werden: »{0}« zu {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "Ungültiger Schlüssel zum Entfernen: »{0}«. Gültige Schlüssel zum Entfernen: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Nachrichtenmuster mit ID: »{0}« ist nicht vorhanden." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Nachrichtenmuster mit ID: »{0}« wurde entfernt" #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Ungültiger Konfigurationsparameter; benutzen Sie load, save, get oder set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Ungültiger Parameter für »network«, verwenden Sie »list«, »switch« oder »close«" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Verbundene Netzwerke" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Netzwerk" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokoll" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Host" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Keines" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Verfügbare Netzwerke" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Schließen des Netzwerks fehlgeschlagen - Netzwerk konnte nicht gefunden werden: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Wechseln des Netzwerks fehlgeschlagen - Netzwerk konnte nicht gefunden werden: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Zu keinem Netzwerk verbunden" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "Failed to write to chat history. Your chat history will not be preserved. Reason: {0}" msgstr "Schreiben des Gesprächsverlaufs fehlgeschlagen. Ihr Gesprächsverlauf wird nicht vorgehalten. Grund: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Verbindung ist fehlgeschlagen." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Kein Protokoll-Manager gefunden für das Protokoll: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Willkommen bei Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Geben Sie /help ein, um eine Liste der verfügbaren Befehle zu erhalten." #: ../src/Engine/Session.cs:1909 msgid "After you have made a connection the list of available commands changes. Go to the newly opened connection tab and use the /help command again to see the extended command list." msgstr "Nachdem Sie eine Verbindung aufgebaut haben, verändert sich die Liste der verfügbaren Befehle. Gehen Sie zum neu geöffneten Verbindungsreiter und geben Sie den Befehl /help erneut ein, um die erweiterte Befehlsliste zu sehen." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Benutzername darf nicht leer sein." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Passwort darf nicht leer sein." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Benutzer »{0}« ist nicht vorhanden." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Benutzer »{0}« ist bereits vorhanden." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Netzwerk darf nicht leer sein." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Hostname des Servers darf nicht leer sein." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Hostname des Servers enthält unzulässige Zeichen (neue Zeile)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Die Server-ID »{0}« ist bereits vorhanden." #: ../src/Engine/Chats/ChatModel.cs:109 #, csharp-format msgid "Failed to load chat history. Your chat history will not be preserved. Reason: {0}" msgstr "Laden des Gesprächsverlaufs fehlgeschlagen. Ihr Gesprächsverlauf wird nicht vorgehalten. Grund: {0}" #: ../src/Engine/Chats/ChatModel.cs:311 #, csharp-format msgid "Failed to open chat history for writing. Your chat history will not be preserved. Reason: {0}" msgstr "Öffnen des Gesprächsverlaufs zum Schreiben fehlgeschlagen. Ihr Gesprächsverlauf wird nicht vorgehalten. Grund: {0}" smuxi-1.1/po-Engine/hu.po0000664000175000017500000002303514011526464016123 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 11:43+0000\n" "PO-Revision-Date: 2015-07-17 18:31+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Nincsenek hálózati kapcsolatok" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimalizálás: {0}…" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Az optimalizálás sikertelen: {0}. Ok: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "A csevegési előzmények egy hiba miatt nem érhetők el többé, de mostantól el " "lesznek mentve." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} gépel…" #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} abbahagyta a gépelést…" #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} távol van" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} nem érhető el" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} elérhető" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "nincs kapcsolódva" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Nincs kapcsolódva a kiszolgálóhoz" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nincs elég paraméter a következő parancshoz: {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Kapcsolódva ide: {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Leválasztva innen: {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatikus kapcsolódás ehhez: {0}…" #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Az automatikus kapcsolódás sikertelen ennél: {0}!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Motor parancsok" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Kapcsolódás sikertelen!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "A leválasztás sikertelen - nem található a kiszolgáló: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Újracsatlakozás sikertelen!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Beállítások újratöltve" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Beállítások elmentve" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Érvénytelen kulcs/érték formátum." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Érvénytelen beállítókulcs: „{0}”" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "" "Nem sikerült átalakítani a beállítás értékét: „{0}” erre a típusra: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Érvénytelen beállítás eltávolító kulcs: „{0}”. Érvényes eltávolító kulcsok: " "MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Az üzenetminta ezzel az azonosítóval: „{0}” nem létezik." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Az üzenetminta ezzel az azonosítóval: „{0}” eltávolítva." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Érvénytelen paraméter a beállításnál. Használjon load, save, get vagy set " "értéket." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Érvénytelen paraméter a hálózatnál. Használjon list, switch vagy close " "értéket." #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Kapcsolódott hálózatok" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Hálózat" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokoll" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Gép" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Nincs" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Elérhető hálózatok" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "A hálózat lezárása sikertelen - nem található a hálózat: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "A hálózat váltása sikertelen - nem található a hálózat: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Nincs kapcsolódva semmilyen hálózathoz sem" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Nem sikerült kiírni a csevegéselőzményeket. A csevegéselőzmények nem lesznek " "elmentve. Ok: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Kapcsolódás sikertelen." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nem található protokollkezelő a protokollhoz: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Üdvözli a Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "" "Adja ki a /help parancsot az elérhető parancsok listájának lekéréséhez." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "A kapcsolat kiépítése után az elérhető parancsok listája megváltozik. Menjen " "az újonnan megnyílt kapcsolat lapra, és használja ismét a /help parancsot a " "bővített parancslista megtekintéséhez." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "A felhasználónév nem lehet üres." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "A jelszó nem lehet üres." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "A(z) „{0}” felhasználó nem létezik." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "A(z) „{0}” felhasználó már létezik." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "A hálózat nem lehet üres." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "A kiszolgáló gépneve nem lehet üres." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "A kiszolgáló gépneve érvénytelen karaktereket tartalmaz (új sor)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "A(z) „{0}” kiszolgáló-azonosító már létezik." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Nem sikerült betölteni a csevegéselőzményeket. A csevegéselőzmények nem " "lesznek elmentve. Ok: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Nem sikerült megnyitni a csevegéselőzményeket íráshoz. A csevegéselőzmények " "nem lesznek elmentve. Ok: {0}" smuxi-1.1/po-Engine/ur.po0000664000175000017500000000770514011526464016143 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-11-30 04:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Engine/FrontendManager.cs:230 msgid "No network connections" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:161 msgid "Not connected to server" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:173 #: ../src/Engine/Session.cs:751 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:213 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine/Session.cs:154 msgid "Welcome to Smuxi" msgstr "" #: ../src/Engine/Session.cs:160 msgid "Type /help to get a list of available commands." msgstr "" #: ../src/Engine/Session.cs:163 msgid "" "After you have made a connection the list of available commands changes. Use" " the /help command again to see the extended command list." msgstr "" #: ../src/Engine/Session.cs:216 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:411 msgid "Engine Commands" msgstr "" #: ../src/Engine/Session.cs:514 msgid "Connect failed!" msgstr "" #: ../src/Engine/Session.cs:544 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "" #: ../src/Engine/Session.cs:583 msgid "Reconnect failed!" msgstr "" #: ../src/Engine/Session.cs:602 msgid "Configuration reloaded" msgstr "" #: ../src/Engine/Session.cs:607 msgid "Configuration saved" msgstr "" #: ../src/Engine/Session.cs:611 msgid "Invalid parameter for config; use load or save" msgstr "" #: ../src/Engine/Session.cs:641 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" #: ../src/Engine/Session.cs:652 msgid "Networks" msgstr "" #: ../src/Engine/Session.cs:656 msgid "Type" msgstr "" #: ../src/Engine/Session.cs:657 msgid "Host" msgstr "" #: ../src/Engine/Session.cs:658 msgid "Port" msgstr "" #: ../src/Engine/Session.cs:680 #, csharp-format msgid "Network close failed - could not find network with host: {0}" msgstr "" #: ../src/Engine/Session.cs:725 #, csharp-format msgid "Network switch failed - could not find network with host: {0}" msgstr "" #: ../src/Engine/Session.cs:740 msgid "Not connected to any network" msgstr "" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1067 msgid "Connect failed." msgstr "" #: ../src/Engine/Session.cs:1098 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "" #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "" #: ../src/Engine/Config/ServerListController.cs:131 msgid "Server hostname must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:134 msgid "Server hostname contains invalid characters (newline)." msgstr "" #: ../src/Engine/Config/ServerListController.cs:140 #, csharp-format msgid "Server '{0}' already exists." msgstr "" smuxi-1.1/po-Engine/fr.po0000664000175000017500000002232714011526464016121 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2011-2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:30+0200\n" "PO-Revision-Date: 2015-05-03 20:07+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Aucune connexion réseau" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimisation : {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Impossible d'optimiser : {0}. Raison : {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "Votre historique de conversation n'est plus disponible en raison d'une erreur mais il sera préservé à partir de maintenant." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} est en train de taper..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} a arrêté de taper.." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} est parti" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} est hors ligne" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} est en ligne" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "non connecté" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Pas de connexion au serveur" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pas assez d'arguments pour la commande {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Connecté à {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Deconnecté de {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Connexion automatique à {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Connexion automatique à {0} impossible !" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Commandes du moteur" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Connexion impossible !" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Déconnexion impossible : serveur \"{0}\" introuvable" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Reconnexion impossible !" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Configuration rechargée" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Configuration sauvegardée" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Format invalide de paire clé/valeur." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Clé de configuration incorrecte : '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Impossible de convertir la valeur de configuration '{0}' vers le type : {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "Clé de configuration à enlever incorrecte : '{0}'. Clés valides : MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Le pattern de message avec l'ID '{0}' n'existe pas." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Le pattern de message avec l'ID '{0}' a été retiré." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Paramètre invalide pour la configuration, utilisez \"save\", \"get\" ou \"save\"." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Paramètre invalide pour le réseau ; utilisez list, switch ou close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Réseaux connectés" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Réseau" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protocole" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Hôte" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Aucun" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Réseaux disponibles" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Impossible de fermer le réseau - impossible de trouver le réseau : {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Impossible de changer de réseau - impossible de trouver le réseau : {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Aucun réseau connecté" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Impossible d'écrire votre historique de discussion, celui-ci ne sera pas préservé. Raison : {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Connexion impossible." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Aucun gestionnaire de protocole trouvé pour le protocole : {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Bienvenue dans Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Tapez /help pour obtenir la liste des commandes disponibles." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "Apres s'être connecté, la liste des commandes disponibles change. Allez dans l'onglet de la nouvelle connexion et utilisez la commande /help pour voir la nouvelle liste étendue des commandes." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Le nom d'utilisateur ne peut pas être vide." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Le mot de passe ne peut pas être vide." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "L'utilisateur \"{0}\" n'existe pas." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "L'utilisateur \"{0}\" existe déjà." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Le réseau ne peut pas être vide." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Le nom d'hôte ne peut pas être vide." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Le nom d'hôte contient des caractères invalides." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "L'identifiant de serveur \"{0}\" existe déjà." #: ../src/Engine/Chats/ChatModel.cs:109 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Impossible de charger votre historique de discussion, celui-ci ne sera pas préservé. Raison : {0}" #: ../src/Engine/Chats/ChatModel.cs:311 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "Impossible d'ouvrir en écriture votre historique de discussion, celui-ci ne sera pas préservé. Raison : {0}" smuxi-1.1/po-Engine/sr.po0000664000175000017500000002566514011526464016146 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:40+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Нема мрежних веза" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Прилагођавам: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Нисам успео да прилагодим: {0}. Разлог: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Историјат вашег ћаскања није више доступан због грешке али ће бити сачуван " "од сада па надаље." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} пише..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} је престао да пише..." #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "{0} је одсутан" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "{0} је ван мреже" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "{0} је на мрежи" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "нисте повезани" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Нисте повезани са сервером" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Нема довољно параметара за наредбу „{0}“" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Повезани сте на „{0}“" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Прекинута је веза са „{0}“" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Сам се повезујем на „{0}“..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Самостално повезивање на „{0}“ није успело!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Наредбе погона" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Веза није успела!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Прекид везе није успео — не могу да нађем сервер: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Поновно повезивање није успело!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Подешавање је поново учитано" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Подешавање је сачувано" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Неисправан запис кључа/вредности." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Неисправан кључ подешавања: „{0}“" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Не могу да претворим вредност подешавања: „{0}“ у врсту: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Неисправан кључ уклањања подешавања: „{0}“. Исправни кључеви уклањања: " "Шаблони поруке/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Шаблон поруке са ИБ-ом: „{0}“ не постоји." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Шаблон поруке са ИБ-ом: „{0}“ је уклоњено." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Неисправан параметар за подешавање; користите „load“, „save“, „get“ или " "„set“." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Неисправан параметар за мрежу; користите „list“, „switch“, или „close“" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Повезане мреже" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Мрежа" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Протокол" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Домаћин" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Прикључник" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Ништа" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Доступне мреже" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Затварање мреже није успело — не могу наћи мрежу: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Пребацивање мреже није успело — не могу наћи мрежу: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Нисте повезани ни на једну мрежу" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Нисам успео да пишем у историјат ћаскања. Историјат вашег ћаскања неће бити " "причуван. Разлог: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Повезивање није успело." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Нисам нашао управника протокола за протокол: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Добро дошли у Смукси" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Упишите „/help“ да добијете списак доступних наредби." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Након што успоставите везу списак доступних наредби се промени. Идите на " "језичак нове отворене везе и још једном употребите наредбу „/help“ да видите " "проширени списак наредби." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Корисничко име не сме бити празно." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Лозинка не сме бити празна." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Корисник „{0}“ не постоји." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Корисник „{0}“ већ постоји." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Мрежа не сме бити празна." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Назив домаћина сервера не сме бити празан." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Назив домаћина сервера садржи неисправне знакове (нови ред)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "ИБ сервера „{0}“ већ постоји." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Нисам успео да учитам историјат ћаскања. Историјат вашег ћаскања неће бити " "причуван. Разлог: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Нисам успео да отворим историјат ћаскања за писање. Историјат вашег ћаскања " "неће бити причуван. Разлог: {0}" smuxi-1.1/po-Engine/sl.po0000664000175000017500000001613014011526464016123 0ustar00meebeymeebey00000000000000# 'smuxi/po-Engine/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:38+0000\n" "PO-Revision-Date: 2016-03-11 22:56+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "" #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "" #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "" #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "" #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Omrežje" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Gostitelj" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Vrata" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "brez" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "" #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "" #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "" #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "" #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "" #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" smuxi-1.1/po-Engine/pl.po0000664000175000017500000002313514011526464016123 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # , 2012. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:54+0200\n" "PO-Revision-Date: 2016-08-21 16:37+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Brak połączeń sieciowych" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optymalizowanie: {0}…" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optymalizacja się nie powiodła: {0}. Powód: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Historia rozmów nie jest już dostępna z powodu błędu, ale od teraz będzie " "zachowywana." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "Użytkownik {0} pisze…" #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "Użytkownik {0} przestał pisać…" #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "Użytkownik {0} jest nieobecny" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "Użytkownik {0} jest w trybie offline" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "Użytkownik {0} jest w trybie online" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "nie połączono" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Nie połączono z serwerem" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Za mało parametrów dla polecenia {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Połączono z {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Rozłączono z {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatyczne łączenie z {0}…" #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatyczne łączenie z {0} się nie powiodło" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Polecenia mechanizmu" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Połączenie się nie powiodło" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Rozłączenie się nie powiodło — nie można odnaleźć serwera: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Ponowne połączenie się nie powiodło" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Ponownie wczytano konfigurację" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Zapisano konfigurację" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Nieprawidłowy format klucz/wartość." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Nieprawidłowy klucz konfiguracji: „{0}”" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Nie można skonwertować wartości konfiguracji: „{0}” do typu: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Nieprawidłowy klucz usuwania konfiguracji: „{0}”. Prawidłowe klucze " "usuwania: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Wzór wiadomości o identyfikatorze: „{0}” nie istnieje." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Usunięto wzór wiadomości o identyfikatorze: „{0}”." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Nieprawidłowy parametr dla konfiguracji; można użyć „load” (wczytanie), " "„save” (zapisanie), „get” (pobranie) lub „set” (ustawienie)." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Nieprawidłowy parametr dla sieci; można użyć „list” (lista), " "„switch” (zmiana) lub „close” (zamknięcie)" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Połączone sieci" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Sieć" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokół" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Serwer" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Brak" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Dostępne sieci" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Zamknięcie sieci się nie powiodło — nie można odnaleźć sieci: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Zmiana sieci się nie powiodła — nie można odnaleźć sieci: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Nie połączono z żadną siecią" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Zapisanie historii rozmów się nie powiodło. Historia rozmów nie będzie " "zachowywana. Powód: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Połączenie się nie powiodło." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nie odnaleziono menedżera protokołu dla: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Witamy w programie Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Wpisanie /help wyświetli listę dostępnych poleceń." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Po połączeniu lista dostępnych poleceń się zmienia. Można przejść do nowo " "otwartej karty połączenia i użyć polecenia /help jeszcze raz, aby zobaczyć " "rozszerzoną listę poleceń." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Nazwa użytkownika nie może być pusta." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Hasło nie może być puste." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Użytkownik „{0}” nie istnieje." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Użytkownik „{0}” już istnieje." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Sieć nie może być pusta." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Adres serwera nie może być pusty." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Adres serwera zawiera nieprawidłowe znaki (znak nowego wiersza)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Identyfikator serwera „{0}” już istnieje." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Wczytanie historii rozmów się nie powiodło. Historia rozmów nie będzie " "zachowywana. Powód: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Otwarcie historii rozmów do zapisania się nie powiodło. Historia rozmów nie " "będzie zachowywana. Powód: {0}" smuxi-1.1/po-Engine/id.po0000664000175000017500000002222014011526464016076 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-01-17 20:01+0000\n" "PO-Revision-Date: 2017-04-20 11:26+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Tidak ada koneksi jaringan" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Mengoptimalkan: {0} ..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Gagal mengoptimalkan: {0}. Alasan: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Riwayat obrolan Anda tidak lagi tersedia karena kesalahan namun akan " "dipertahankan sejak sekarang." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} sedang mengetik..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} telah berhenti mengetik..." #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "{0} sedang pergi" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "{0} sedang luring" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "{0} sedang daring" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "tidak terhubung" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Tidak terhubung ke peladen" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Tidak cukup parameter untuk perintah {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Tersambung ke {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Terputus dari {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Sambungkan secara otomatis ke {0} ..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Sambungan otomatis ke {0} gagal!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Perintah Mesin" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Hubungkan gagal!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Putuskan sambungan gagal - tidak dapat menemukan peladen: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Hubungkan kembali gagal!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Konfigurasi dimuat ulang" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Konfigurasi disimpan" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Format kunci/nilai tidak valid" #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Kunci konfigurasi tidak valid: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Tidak dapat mengkonversi nilai konfigurasi: '{0}' untuk mengetik: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Kunci hapus aplikasi tidak valid: '{0}'. Kunci hapus yang valid: PolaPesan/" "{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Pola pesan dengan ID: '{0}' tidak ada." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Pola pesan dengan ID: '{0}' dihapus" #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Parameter tidak valid untuk konfigurasi; Gunakan load (muat), save " "(simpan), get (ambil) atau set (atur)." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Parameter tidak valid untuk jaringan; Gunakan list (daftar), switch " "(beralih), atau close (tutup)" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Jaringan Terhubung" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Jaringan" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Host" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Tak ada" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Jaringan yang Tersedia" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Tutup jaringan gagal - tidak dapat menemukan jaringan: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Beralih jaringan gagal - tidak dapat menemukan jaringan: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Tidak terhubung ke jaringan apapun" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Gagal menulis ke riwayat obrolan. Riwayat obrolan Anda tidak akan " "dipertahankan. Alasan: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Sambungan gagal." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "" "Tidak ada pengelola protokol yang ditemukan untuk protokol tersebut: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Selamat datang di Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Ketik /help untuk mendapatkan daftar perintah yang tersedia." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Setelah Anda membuat sambungan daftar perintah tersedia yang berubah. Pergi " "ke tab koneksi yang baru dibuka dan gunakan perintah /help lagi untuk " "melihat daftar perintah yang diperluas." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Nama pengguna tidak boleh kosong" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Kata sandi tidak boleh kosong" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Pengguna \"{0}\" tidak ada" #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Pengguna \"{0}\" sudah ada" #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Jaringan tidak boleh kosong" #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Nama host peladen tidak boleh kosong" #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Nama host peladen berisi karakter yang tidak valid (baris baru)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "ID peladen '{0}' sudah ada" #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Gagal memuat riwayat obrolan. Riwayat obrolan Anda tidak akan " "dipertahankan. Alasan: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Gagal membuka riwayat obrolan untuk menulis. Riwayat obrolan Anda tidak " "akan dipertahankan. Alasan: {0}" smuxi-1.1/po-Engine/es.po0000664000175000017500000002236614011526464016124 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013-2014 # Ricardo A. Hermosilla Carrillo , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:16+0000\n" "PO-Revision-Date: 2014-03-16 15:56+0000\n" "Last-Translator: Matías Bellone\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/" "es/)\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "No hay conexiones de red" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimizando: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Falló la optimización: {0}. Razón: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Su historial de chat no está disponible debido a un error, pero será " "preservado desde ahora en adelante." #: ../src/Engine/Messages/MessageBuilder.cs:789 #, csharp-format msgid "{0} is typing..." msgstr "{0} está escribiendo..." #: ../src/Engine/Messages/MessageBuilder.cs:795 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} dejó de escribir..." #: ../src/Engine/Messages/MessageBuilder.cs:840 #, csharp-format msgid "{0} is away" msgstr "{0} está ausente" #: ../src/Engine/Messages/MessageBuilder.cs:846 #, csharp-format msgid "{0} is offline" msgstr "{0} está desconectado" #: ../src/Engine/Messages/MessageBuilder.cs:852 #, csharp-format msgid "{0} is online" msgstr "{0} está conectado" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "sin conexión" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "No conectado al servidor" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1083 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parámetros insuficientes para la orden {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Conectado a {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Desconectado de {0}" #: ../src/Engine/Session.cs:213 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Conectando automáticamente a {0}..." #: ../src/Engine/Session.cs:248 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "¡Falló la conexión automática a {0}!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:521 msgid "Engine Commands" msgstr "Órdenes del motor" #: ../src/Engine/Session.cs:650 msgid "Connect failed!" msgstr "¡Falló la conexión!" #: ../src/Engine/Session.cs:673 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Falló la desconexión, no se encontró el servidor: {0}" #: ../src/Engine/Session.cs:715 msgid "Reconnect failed!" msgstr "¡Falló la reconexión!" #: ../src/Engine/Session.cs:739 msgid "Configuration reloaded" msgstr "Se recargó la configuración" #: ../src/Engine/Session.cs:743 msgid "Configuration saved" msgstr "Se guardó la configuración" #: ../src/Engine/Session.cs:770 msgid "Invalid key/value format." msgstr "Formato de clave/valor no válido." #: ../src/Engine/Session.cs:794 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Clave de configuración no válido: «{0}»" #: ../src/Engine/Session.cs:810 ../src/Engine/Session.cs:816 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Fallo al convertir el valor de configuración «{0}» al tipo {1}" #: ../src/Engine/Session.cs:830 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Clave de eliminación inválida en la configuración: «{0}». Claves de " "eliminación válidas: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:843 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "No existe un patrón de mensajes con ID «{0}»." #: ../src/Engine/Session.cs:850 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Se eliminó el patrón de mensaje con ID «{0}»." #: ../src/Engine/Session.cs:858 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Parámetro no válido para la configuración: utilice load, save, get o set." #: ../src/Engine/Session.cs:935 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Parámetro no válido para la red; utilice list, switch o close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:965 msgid "Connected Networks" msgstr "Redes conectadas" #: ../src/Engine/Session.cs:970 ../src/Engine/Session.cs:994 msgid "Network" msgstr "Red" #: ../src/Engine/Session.cs:971 msgid "Protocol" msgstr "Protocolo" #: ../src/Engine/Session.cs:972 msgid "Host" msgstr "Servidor" #: ../src/Engine/Session.cs:973 msgid "Port" msgstr "Puerto" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:979 ../src/Engine/Session.cs:1000 msgid "None" msgstr "Ninguna" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:986 msgid "Available Networks" msgstr "Redes disponibles" #: ../src/Engine/Session.cs:1014 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Falló el cierre de la red - no se pudo encontrar la red: {0}" #: ../src/Engine/Session.cs:1058 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Falló el cambio de red - no se pudo encontrar la red: {0}" #: ../src/Engine/Session.cs:1076 msgid "Not connected to any network" msgstr "No conectado a ninguna red" #: ../src/Engine/Session.cs:1333 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Falló la escritura de su historial de chat. Su historial no será preservado. " "Razón: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1563 msgid "Connect failed." msgstr "Falló la conexión." #: ../src/Engine/Session.cs:1577 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "No se encontró un gestor para el protocolo: {0}" #: ../src/Engine/Session.cs:1916 msgid "Welcome to Smuxi" msgstr "Bienvenido/a a Smuxi" #: ../src/Engine/Session.cs:1923 msgid "Type /help to get a list of available commands." msgstr "Escribe /help para obtener una lista de órdenes disponibles." #: ../src/Engine/Session.cs:1929 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Después de establecer una conexión, cambia la lista de órdenes disponibles. " "Diríjase a la pestaña de conexión recién establecida y utilice la orden /" "help para ver una lista extendida." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "El nombre de usuario no debe estar vacío" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "La contraseña no debe estar vacía" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "El usuario «{0}» no existe." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "El usuario «{0}» ya existe." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "La red no debe estar vacía." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "El dominio del servidor no debe estar vacío." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" "El dominio del servidor contiene caracteres no válidos (salto de línea)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "El ID de servidor «{0}» ya existe." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Falló la carga del historial de chat. Su historial no será preservado. " "Razón: {0}" #: ../src/Engine/Chats/ChatModel.cs:344 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Falló la apertura del historial de chat para escritura. Su historial no será " "preservado. Razón: {0}" smuxi-1.1/po-Engine/Makefile.in.in0000664000175000017500000001576514011526464017634 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_ENGINE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine/pt.po0000664000175000017500000002262314011526464016134 0ustar00meebeymeebey00000000000000# Translation of smuxi-engine messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-engine package. # Américo Monteiro , 2010. # Pedro Ribeiro , 2012. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi-engine\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-11-03 17:31+0000\n" "PO-Revision-Date: 2015-11-17 08:08+0000\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Nenhuma ligação à rede" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "A otimizar: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Falha ao otimizar: {0}. Razão: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "O seu histórico do chat já não está disponível devido a um erro mas será " "preservado a partir de agora." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} está a escrever..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} parou de escrever..." #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "{0} está ausente" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "{0} está offline" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "{0} está online" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "não ligado" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Não está ligado ao servidor" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parâmetros insuficientes para o comando {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Ligado a {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Desligado de {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "A ligar automaticamente a {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Falha na ligação automática a {0}!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Comandos do motor" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Ligação falhada!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Falha ao desligar - impossível encontrar o servidor: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Religação falhada!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Configuração recarregada" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Configuração gravada" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Formato de chave/valor inválido." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Chave de configuração inválida: \"{0}\"" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Impossível converter o valor de configuração: \"{0}\" para o tipo: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Chave de remoção de configuração inválida: \"{0}\". Chaves de remoção " "válidas: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Padrão de mensagem com ID: \"{0}\" não existe." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Padrão de mensagem com ID: \"{0}\" removido." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Parâmetro inválido para a configuração; use load, save, get ou set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Parâmetro inválido para rede; use list, switch, ou close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Redes ligadas" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Rede" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protocolo" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Máquina" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Porta" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Nenhuma" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Redes disponíveis" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Fecho de rede falhado - impossível encontrar a rede: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Troca de rede falhada - impossível encontrar a rede: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Não ligado a nenhuma rede" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Falhou a escrita do histórico do chat. O seu histórico de chat não será " "preservado. Razão: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Ligação falhada." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nenhum gestor de protocolo encontrado para o protocolo: {0}" # "Boas vindas" para evitar masculino/feminino. #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Boas vindas ao Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Escreva /help para obter uma lista dos comandos disponíveis." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Após fazer uma ligação, a lista de comandos disponíveis muda. Aceda ao " "separador da nova ligação e use o comando /help outra vez para ver a nova " "lista de comandos aumentada." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "O nome de utilizador não pode estar vazio." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "A senha não pode estar vazia." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "O utilizador \"{0}\" não existe." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "O utilizador \"{0}\" já existe." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "A rede não pode estar vazia." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "O nome de máquina do servidor não pode estar vazio." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" "O nome de máquina do servidor contém caracteres inválidos (nova linha)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "ID do servidor \"{0}\" já existe." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Falhou a leitura do histórico do chat. O seu histórico de chat não será " "preservado. Razão: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Falhou a escrita do histórico do chat. O seu histórico de chat não será " "preservado. Razão: {0}" smuxi-1.1/po-Engine/it.po0000664000175000017500000001263614011526464016130 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # # David Paleino , 2008. # Vincenzo Campanella , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-engine\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-09-11 09:33+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" # #: ../src/Engine/FrontendManager.cs:230 msgid "No network connections" msgstr "Nessuna connessione di rete" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:161 msgid "Not connected to server" msgstr "Non connesso a un server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:173 #: ../src/Engine/Session.cs:751 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Non sono stati forniti abbastanza parametri per il comando {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "Connesso a {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:213 #, csharp-format msgid "Disconnected from {0}" msgstr "Disconnesso da {0}" #: ../src/Engine/Session.cs:154 msgid "Welcome to Smuxi" msgstr "Benvenuti in Smuxi" #: ../src/Engine/Session.cs:160 msgid "Type /help to get a list of available commands." msgstr "Digitare «/help» per ottenere un elenco dei comandi disponibili." # #: ../src/Engine/Session.cs:163 msgid "" "After you have made a connection the list of available commands changes. Use " "the /help command again to see the extended command list." msgstr "" "Dopo aver effettuato una connessione, l'elenco dei comandi disponibili " "cambia. Usare nuovamente il comando «/help» per vedere l'elenco dei comandi " "estesi." #: ../src/Engine/Session.cs:216 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "La connessione automatica a {0} non è riuscita." # #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:411 msgid "Engine Commands" msgstr "Comandi del motore" #: ../src/Engine/Session.cs:514 msgid "Connect failed!" msgstr "La connessione non è riuscita." #: ../src/Engine/Session.cs:544 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "La disconnessione non è riuscita, impossibile trovare il server: {0}" #: ../src/Engine/Session.cs:583 msgid "Reconnect failed!" msgstr "La riconnessione non è riuscita." #: ../src/Engine/Session.cs:602 msgid "Configuration reloaded" msgstr "Configurazione ricaricata" #: ../src/Engine/Session.cs:607 msgid "Configuration saved" msgstr "Configurazione salvata" #: ../src/Engine/Session.cs:611 msgid "Invalid parameter for config; use load or save" msgstr "Parametro non valido per la configurazione, utilizzare «load» o «save»" #: ../src/Engine/Session.cs:641 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Parametro non valido per la rete, utilizzare «list», «switch» o «close»" #: ../src/Engine/Session.cs:652 msgid "Networks" msgstr "Reti" #: ../src/Engine/Session.cs:656 msgid "Type" msgstr "Tipo" #: ../src/Engine/Session.cs:657 msgid "Host" msgstr "Host" #: ../src/Engine/Session.cs:658 msgid "Port" msgstr "Porta" #: ../src/Engine/Session.cs:680 #, csharp-format msgid "Network close failed - could not find network with host: {0}" msgstr "" "La chiusura della rete non è riuscita, impossibile trovare la rete con " "l'host: {0}" #: ../src/Engine/Session.cs:725 #, csharp-format msgid "Network switch failed - could not find network with host: {0}" msgstr "" "Il cambio di rete non è riuscito, impossibile trovare la rete con l'host: {0}" #: ../src/Engine/Session.cs:740 msgid "Not connected to any network" msgstr "Non connesso ad alcuna rete" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1067 msgid "Connect failed." msgstr "La connessione non è riuscita." #: ../src/Engine/Session.cs:1098 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nessun gestore trovato per il protocollo: {0}" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Il nome utente non può essere vuoto." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "La password non può essere vuota." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "L'utente «{0}» non esiste." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "L'utente «{0}» esiste già." #: ../src/Engine/Config/ServerListController.cs:131 msgid "Server hostname must not be empty." msgstr "Il nome host del server non può essere vuoto." #: ../src/Engine/Config/ServerListController.cs:134 msgid "Server hostname contains invalid characters (newline)." msgstr "" "Il nome host del server contiene caratteri non validi (ritorno a capo)." #: ../src/Engine/Config/ServerListController.cs:140 #, csharp-format msgid "Server '{0}' already exists." msgstr "Il server «{0}» esiste già." #~ msgid "Unknown protocol: {0}" #~ msgstr "Protocollo sconosciuto: {0}" smuxi-1.1/po-Engine/nl.po0000664000175000017500000002255214011526464016123 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:16+0000\n" "PO-Revision-Date: 2019-03-10 14:55+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Geen netwerkverbindingen" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimaliseren: {0}…" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optimaliseren niet gelukt: {0}. Reden: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Uw chatgeschiedenis is niet langer beschikbaar vanwege een fout, maar zal " "vanaf nu weer bijgehouden worden." #: ../src/Engine/Messages/MessageBuilder.cs:789 #, csharp-format msgid "{0} is typing..." msgstr "{0} is aan het typen…" #: ../src/Engine/Messages/MessageBuilder.cs:795 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} is gestopt met typen…" #: ../src/Engine/Messages/MessageBuilder.cs:840 #, csharp-format msgid "{0} is away" msgstr "{0} is afwezig" #: ../src/Engine/Messages/MessageBuilder.cs:846 #, csharp-format msgid "{0} is offline" msgstr "{0} is offline" #: ../src/Engine/Messages/MessageBuilder.cs:852 #, csharp-format msgid "{0} is online" msgstr "{0} is online" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "niet verbonden" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Niet verbonden met server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1083 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "NIet genoeg parameters voor opdracht {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Verbonden met {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Verbinding met {0} verbroken" #: ../src/Engine/Session.cs:213 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatisch verbinden met {0}…" #: ../src/Engine/Session.cs:248 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatisch verbinden met {0} mislukt!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:521 msgid "Engine Commands" msgstr "Engine-opdrachten" #: ../src/Engine/Session.cs:650 msgid "Connect failed!" msgstr "Verbinden mislukt!" #: ../src/Engine/Session.cs:673 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Verbinding verbreken is mislukt - kon server niet vinden: {0}" #: ../src/Engine/Session.cs:715 msgid "Reconnect failed!" msgstr "Herverbinden mislukt!" #: ../src/Engine/Session.cs:739 msgid "Configuration reloaded" msgstr "Configuratie is herladen" #: ../src/Engine/Session.cs:743 msgid "Configuration saved" msgstr "Configuratie is opgeslagen" #: ../src/Engine/Session.cs:770 msgid "Invalid key/value format." msgstr "Ongeldig sleutel-/waarde-formaat." #: ../src/Engine/Session.cs:794 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Ongeldige configuratiesleutel: ‘{0}’" #: ../src/Engine/Session.cs:810 ../src/Engine/Session.cs:816 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Kon configuratiewaarde: ‘{0}’ niet omzetten naar type: {1}" #: ../src/Engine/Session.cs:830 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Ongeldige configuratieverwijderingssleutel: ‘{0}’. Geldige " "verwijderingssleutels: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:843 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Berichtpatroon met ID ‘{0}’ bestaat niet." #: ../src/Engine/Session.cs:850 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Berichtpatroon met ID ‘{0}’ verwijderd." #: ../src/Engine/Session.cs:858 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Ongeldige parameter voor configuratie; gebruik ‘load’ (laden), " "‘save’ (opslaan), ‘get’ (verkrijgen) of ‘set’ (instellen)." #: ../src/Engine/Session.cs:935 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Ongeldige parameter voor netwerk; gebruik ‘list’ (lijst), " "‘switch’ (omschakelen) of ‘close’ (sluiten)" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:965 msgid "Connected Networks" msgstr "Verbonden netwerken" #: ../src/Engine/Session.cs:970 ../src/Engine/Session.cs:994 msgid "Network" msgstr "Netwerk" #: ../src/Engine/Session.cs:971 msgid "Protocol" msgstr "Protocol" #: ../src/Engine/Session.cs:972 msgid "Host" msgstr "Host" #: ../src/Engine/Session.cs:973 msgid "Port" msgstr "Poort" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:979 ../src/Engine/Session.cs:1000 msgid "None" msgstr "Geen" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:986 msgid "Available Networks" msgstr "Beschikbare netwerken" #: ../src/Engine/Session.cs:1014 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Netwerksluiting mislukt - kon netwerk niet vinden: {0}" #: ../src/Engine/Session.cs:1058 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Netwerkomschakeling mislukt - kon netwerk niet vinden: {0}" #: ../src/Engine/Session.cs:1076 msgid "Not connected to any network" msgstr "Niet verbonden met een netwerk" #: ../src/Engine/Session.cs:1333 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Wegschrijven van chatgeschiedenis is mislukt. Uw chatgeschiedenis zal niet " "worden bijgehouden. Reden: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1563 msgid "Connect failed." msgstr "Verbinden mislukt." #: ../src/Engine/Session.cs:1577 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Geen protocolbeheerder gevonden voor protocol: {0}" #: ../src/Engine/Session.cs:1916 msgid "Welcome to Smuxi" msgstr "Welkom bij Smuxi" #: ../src/Engine/Session.cs:1923 msgid "Type /help to get a list of available commands." msgstr "Typ /help om een lijst met beschikbare opdrachten te krijgen." #: ../src/Engine/Session.cs:1929 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Na het maken van een verbinding zal de lijst met beschikbare opdrachten " "wijzigen. Ga naar het recentst geopende verbindingstabblad en gebruik de " "opdracht ‘/help’ opnieuw om de uitgebreide opdrachtenlijst te zien." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Gebruikersnaam mag niet leeg zijn." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Wachtwoord mag niet leeg zijn." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Gebruiker ‘{0}’ bestaat niet." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Gebruiker ‘{0}’ bestaat al." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Netwerk mag niet leeg zijn." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Servernaam mag niet leeg zijn." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Servernaam bevat ongeldige tekens (nieuwe regel)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Server-ID ‘{0}’ bestaat reeds." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Laden van chatgeschiedenis is mislukt. Uw chatgeschiedenis zal niet worden " "bijgehouden. Reden: {0}" #: ../src/Engine/Chats/ChatModel.cs:344 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Het openen van uw chatgeschiedenis om te schrijven is mislukt. Uw " "chatgeschiedenis zal niet worden bijgehouden. Reden: {0}" smuxi-1.1/po-Engine/ru.po0000664000175000017500000002535114011526464016140 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 # Yuri Myasoedov , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:37+0200\n" "PO-Revision-Date: 2017-09-19 09:12+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Нет сетевых соединений" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Оптимизация: {0}…" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Сбой оптимизации: {0}. Причина: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "Ваша история сообщений больше недоступна из-за ошибки, но будет сохраняться с этого момента." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} печатает..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} прекратил/а печатать" #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} отсутствует" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} не подключен" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} в сети" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "не подключен" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Нет подключения к серверу" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Недостаточно параметров для команды {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Подключён к {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Отключён от {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Автоматически соединяемся с {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Не удалось автоматически подключиться к {0}!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Команды ядра" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Сбой при подключении!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Сбой при разрыве подключения. Не удалось найти сервер: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Сбой при повторном подключении!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Настройки перезагружены" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Настройки сохранены" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Неправильный формат ключ/значение." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "{0} - неправильный ключ конфигурации" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Не получается преобразовать значение '{0}' к типу '{1}'" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "Неправльный config remove key: '{0}'. Правльные удаляющие ключи: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Образец сообщения с идентификатором '{0}' не существует." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Образец сообщения с идентификатором '{0}' удалён." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Недопустимый параметр конфигурации; используйте save, get или set" #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Недопустимый параметр для сети; используйте list, switch или close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Подключенные сети" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Сеть" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Протокол" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Сервер" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Порт" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Никаких" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Доступные сети" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Сбой при закрытии. Не удалось найти сеть: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Сбой при переключении. Не удалось найти сеть: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Нет подключения к сетям" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Сбой при выполнении записи истории сообщений. Ваша история сообщений не будет сохранена. Причина: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Сбой соединения." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Не найден обработчик протокола: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Добро пожаловать в Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Для получения списка команд введите /help" #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "Как только будет создано подключение, список доступных команд изменится. Перейдите на новую открытую вкладку и снова используйте команду /help, чтобы просмотреть расширенный список команд. " #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Требуется указать имя пользователя." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Требуется указать пароль." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Пользователя \"{0}\" не существует." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Пользователь \"{0}\" уже существует." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Необходимо указать сеть." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Требуется указать имя сервера." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Имя сервера содержит недопустимые символы или перенос строки." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Идентификатор сервера '{0}' уже существует." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Сбой при выполнении загрузки истории сообщений. Ваша история сообщений не будет сохранена. Причина: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "Сбой при выполнении открытия для записи истории сообщений. Ваша история сообщений не будет сохранена. Причина: {0}" smuxi-1.1/po-Engine/nb.po0000664000175000017500000001506714011526464016114 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2012-01-01 18:47+0100\n" "PO-Revision-Date: 2012-08-19 22:19+0000\n" "Last-Translator: Arianfaol \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/smuxi/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Engine/FrontendManager.cs:233 msgid "No network connections" msgstr "Ingen nettverkstilkoblinger" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:295 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimaliserer: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:313 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optimalisering mislyktes: {0}. Årsak: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:347 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "Chatloggen din er ikke lenger tilgjengelig på grunn av en feil, men vil bil lagret fra nå av." #: ../src/Engine/Protocols/ProtocolManagerBase.cs:170 msgid "Not connected to server" msgstr "Ikke koblet til server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:178 #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ikke nok parametere for kommando {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "Koblet til {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:207 #, csharp-format msgid "Disconnected from {0}" msgstr "Koblet i fra {0}" #: ../src/Engine/Session.cs:218 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatisk tilkobling til {0} mislyktes!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:416 msgid "Engine Commands" msgstr "Motorkommandoer" #: ../src/Engine/Session.cs:527 msgid "Connect failed!" msgstr "Tilkobling mislyktes!" #: ../src/Engine/Session.cs:550 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Frakobling mislyktes - kunne ikke finne server: {0}" #: ../src/Engine/Session.cs:589 msgid "Reconnect failed!" msgstr "Gjentilkobling mislyktes." #: ../src/Engine/Session.cs:608 msgid "Configuration reloaded" msgstr "Konfigurasjon lastet på nytt" #: ../src/Engine/Session.cs:613 msgid "Configuration saved" msgstr "Konfigurasjon lagret" #: ../src/Engine/Session.cs:617 msgid "Invalid parameter for config; use load or save" msgstr "Ugyldig parameter for config; bruk load eller save" #: ../src/Engine/Session.cs:676 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Ugyldig parameter for network; bruk list, switch, eller close" #: ../src/Engine/Session.cs:687 msgid "Networks" msgstr "Nettverk" #: ../src/Engine/Session.cs:691 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:692 msgid "Network" msgstr "Nettverk" #: ../src/Engine/Session.cs:693 msgid "Host" msgstr "Vert" #: ../src/Engine/Session.cs:694 msgid "Port" msgstr "Port" #: ../src/Engine/Session.cs:709 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Stenging av nettverk mislyktes - kunne ikke finne nettverk: {0}" #: ../src/Engine/Session.cs:748 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Bytte av nettverk mislyktes - kunne ikke finne nettverk: {0}" #: ../src/Engine/Session.cs:767 msgid "Not connected to any network" msgstr "Ikke koblet til noen nettverk" #: ../src/Engine/Session.cs:1013 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Kunne ikke skrive til Chatlogg. Chatloggen din vil ikke bli lagret. Årsak: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1185 msgid "Connect failed." msgstr "Tilkobling mislyktes." #: ../src/Engine/Session.cs:1216 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Ingen protokollbehandler funnet for protokollen: {0}" #: ../src/Engine/Session.cs:1448 msgid "Welcome to Smuxi" msgstr "Velkommen til Smuxi" #: ../src/Engine/Session.cs:1455 msgid "Type /help to get a list of available commands." msgstr "Skriv /help for å få en liste over tilgjengelige kommandoer." #: ../src/Engine/Session.cs:1461 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "Etter du har koblet til endrer listen med tilgjengelige kommandoer seg. Gå til den nyåpnede tilkoblingsarkfanen og bruk /help kommandoen om igjen for å se den utvidede kommandolisten." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Brukernavn kan ikke være tomt." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Passord kan ikke være tomt." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Bruker \"{0}\" eksisterer ikke." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Bruker \"{0}\" eksisterer allerede." #: ../src/Engine/Config/ServerListController.cs:131 msgid "Server hostname must not be empty." msgstr "Serververtsnavn kan ikke være tomt." #: ../src/Engine/Config/ServerListController.cs:134 msgid "Server hostname contains invalid characters (newline)." msgstr "Serververtsnavn inneholder ugyldige tegn (linjeskift)." #: ../src/Engine/Config/ServerListController.cs:140 #, csharp-format msgid "Server '{0}' already exists." msgstr "Server '{0}' eksisterer allerede" #: ../src/Engine/Chats/ChatModel.cs:105 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Kunne ikke laste chatlogg. Chatloggen din vil ikke bli lagret. Årsak: {0}" #: ../src/Engine/Chats/ChatModel.cs:290 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "Kunne ikke åpne chatlogg for skriving. Chatloggen din vil ikke bli lagret. Årsak: {0}" smuxi-1.1/po-Engine/lt.po0000664000175000017500000002255014011526464016127 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-08 14:32+0000\n" "PO-Revision-Date: 2016-01-08 20:34+0200\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/" "language/lt/)\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Nėra tinklo ryšių" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimizuojama: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Nepavyko optimizuoti: {0}. Priežastis: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Jūsų susirašinėjimų žurnalas dėl klaidos yra daugiau nepasiekiamas, tačiau " "nuo dabar bus vėl išsaugomas." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} rašo..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} nustojo rašyti..." #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "{0} yra pasitraukęs" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "{0} yra atsijungęs" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "{0} yra prisijungęs" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "neprisijungta" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Neprisijungta prie serverio" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nepakanka parametrų {0} komandai" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Prisijungta prie {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Atsijungta nuo {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatiškai jungiamasi prie {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatinis prisijungimas prie {0} nepavyko!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Modulio Komandos" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Prisijungimas nepavyko!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Atsijungimas nepavyko - nepavyko rasti serverio: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Prisijungimas iš naujo nepavyko!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Konfigūracija įkelta iš naujo" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Konfigūracija išsaugota" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Neteisingas rakto/reikšmės formatas." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Neteisingas konfigūracijos raktas: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Nepavyko konvertuoti konfigūracijos reikšmės: '{0}' į tipą: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Neteisingas konfigūracijos šalinimo raktas: '{0}'. Teisingi šalinimo raktai: " "MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Pranešimo šablono su ID: '{0}' nėra." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Pranešimo šablonas su ID: '{0}' pašalintas." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Neteisingas konfigūracijos parametras; naudokite load, save, get arba set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Neteisingas tinklo parametras; naudokite list, switch, arba close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Prijungti Tinklai" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Tinklas" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokolas" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Serveris" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Prievadas" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Nėra" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Prieinami Tinklai" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Tinklo uždarymas nepavyko - nepavyko rasti tinklo: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Tinklo perjungimas nepavyko - nepavyko rasti tinklo: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Neprisijungta prie jokio tinklo" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Nepavyko įrašyti susirašinėjimų žurnalo. Jūsų susirašinėjimų žurnalas nebus " "saugomas. Priežastis: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Prisijungimas nepavyko." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nerasta protokolų tvarkytuvė protokolui: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Sveiki atvykę į Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Norėdami gauti prieinamų komandų sąrašą, įrašykite /help." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Po jūsų prisijungimo, prieinamų komandų sąrašas pasikeičia. Pereikite į " "naujai atvertą kortelę ir vėl naudokite /help komandą, kad matytumėte " "išplėstą komandų sąrašą." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Vartotojo vardas negali būti tuščias." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Slaptažodis negali būti tuščias." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Naudotojo \"{0}\" nėra." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Naudotojas \"{0}\" jau yra." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Tinklas negali būti tuščias." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Serverio pagrindinio kompiuterio vardas negali būti tuščias." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" "Serverio pagrindinio kompiuterio varde yra neteisingų simbolių (nauja " "eilutė)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Serverio ID '{0}' jau yra." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Nepavyko įkelti susirašinėjimų žurnalo. Jūsų susirašinėjimų žurnalas nebus " "saugomas. Priežastis: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Nepavyko įrašymui atidaryti susirašinėjimų žurnalo. Jūsų susirašinėjimų " "žurnalas nebus saugomas. Priežastis: {0}" smuxi-1.1/po-Engine/POTFILES.in0000664000175000017500000000044514011526464016724 0ustar00meebeymeebey00000000000000src/Engine/FrontendManager.cs src/Engine/MessageBuffers/Db4oMessageBuffer.cs src/Engine/Messages/MessageBuilder.cs src/Engine/Protocols/ProtocolManagerBase.cs src/Engine/Session.cs src/Engine/Config/UserListController.cs src/Engine/Config/ServerListController.cs src/Engine/Chats/ChatModel.cs smuxi-1.1/po-Engine/POTFILES.skip0000664000175000017500000000054114011526464017261 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Engine/Config/ServerModel.cs src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Server/ lib/ smuxi-1.1/po-Engine/te.po0000664000175000017500000001456014011526464016122 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 16:58+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:295 #, csharp-format msgid "Optimizing: {0}..." msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:313 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:347 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:782 #, csharp-format msgid "{0} is typing..." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:788 #, csharp-format msgid "{0} has stopped typing..." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:831 #, csharp-format msgid "{0} is away" msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:837 #, csharp-format msgid "{0} is offline" msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:843 #, csharp-format msgid "{0} is online" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:170 msgid "Not connected to server" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:178 #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:219 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine/Session.cs:237 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "" #: ../src/Engine/Session.cs:268 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:471 msgid "Engine Commands" msgstr "" #: ../src/Engine/Session.cs:599 msgid "Connect failed!" msgstr "" #: ../src/Engine/Session.cs:622 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "" #: ../src/Engine/Session.cs:664 msgid "Reconnect failed!" msgstr "" #: ../src/Engine/Session.cs:688 msgid "Configuration reloaded" msgstr "" #: ../src/Engine/Session.cs:692 msgid "Configuration saved" msgstr "" #: ../src/Engine/Session.cs:723 msgid "Invalid key/value format." msgstr "" #: ../src/Engine/Session.cs:733 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "" #: ../src/Engine/Session.cs:743 ../src/Engine/Session.cs:749 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "" #: ../src/Engine/Session.cs:758 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" #: ../src/Engine/Session.cs:850 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:880 msgid "Connected Networks" msgstr "" #: ../src/Engine/Session.cs:885 ../src/Engine/Session.cs:909 msgid "Network" msgstr "" #: ../src/Engine/Session.cs:886 msgid "Protocol" msgstr "" #: ../src/Engine/Session.cs:887 msgid "Host" msgstr "" #: ../src/Engine/Session.cs:888 msgid "Port" msgstr "" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:894 ../src/Engine/Session.cs:915 msgid "None" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:901 msgid "Available Networks" msgstr "" #: ../src/Engine/Session.cs:929 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:973 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:991 msgid "Not connected to any network" msgstr "" #: ../src/Engine/Session.cs:1245 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1446 msgid "Connect failed." msgstr "" #: ../src/Engine/Session.cs:1460 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "" #: ../src/Engine/Session.cs:1734 msgid "Welcome to Smuxi" msgstr "" #: ../src/Engine/Session.cs:1741 msgid "Type /help to get a list of available commands." msgstr "" #: ../src/Engine/Session.cs:1747 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "" #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "" #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "" #: ../src/Engine/Chats/ChatModel.cs:108 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #: ../src/Engine/Chats/ChatModel.cs:305 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" smuxi-1.1/po-Engine/ca.po0000664000175000017500000002063714011526464016077 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Xavi Ivars , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:37+0200\n" "PO-Revision-Date: 2017-09-19 09:12+0000\n" "Last-Translator: Xavi Ivars \n" "Language-Team: Catalan (http://www.transifex.com/meebey/smuxi/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "No hi ha connexions de xarxa" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "S'està optimitzant: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "No s'ha pogut optimitzar:{0}. Motiu: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "La vostra història del xat no es troba disponible a causa d'un error, però es preservarà d'ara endavant." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} està escrivint..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} ha deixat d'escriure...." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} està absent" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} està desconnectat" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} està connectat" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "no està connectat" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "No esteu connectat al servidor." #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "No heu proporcionat suficients paràmetres per a l'ordre {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "S'ha connectat amb {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "S'ha desconnectat de {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "S'està connectant automàticament a {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "La connexió automàtica a {0} ha fallat." #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Ordres del motor" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "No s'ha pogut connectar!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Ha fallat la desconnexió - no s'ha pogut trobar el servidor: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "No s'ha pogut completar l'intent de reconnexió" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "S'ha tornat a carregar la connexió" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "S'ha desat la configuració" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "El format de clau/valor és invàlid." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "El valor de la clau de configuració és invàlida: «{0}»" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "No s'ha pogut convertir el valor de configuració «{0}» al tipus {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "" #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "" #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Paràmetre invàlid per a network; utilitzeu list, switch o close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Xarxes connectades" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Xarxa" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protocol" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Màquina" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Cap" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Xarxes disponibles" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "No esteu connectat a cap xarxa" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "No s'ha pogut escriure la història del xat. No es preservarà. Motiu: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "No s'ha pogut connectar." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "No s'ha trobat cap gestor de protocol per al protocol: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Us donem la benvinguda a l'Smuxi!" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Escriviu /help per a obtenir un llistat d'ordres disponibles." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "El nom d'usuari no pot estar buit." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "La contrasenya no pot ser buida." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "L'usuari «{0}» no existeix." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "L'usuari «{0}» ja existeix." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "La xarxa no pot estar buida." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "El nom del servidor no pot estar buit." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "El nom del servidor conté caràcters invàlids (salt de línia)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "" #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" smuxi-1.1/po-Engine/sv.po0000664000175000017500000002256714011526464016150 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2013-2014 # flugsio , 2011, 2012 # Martin Bagge , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-28 17:00+0000\n" "PO-Revision-Date: 2016-04-03 13:32+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Inga nätverksanslutningar" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimerar: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Misslyckades att optimera: {0}. Anledning: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Din chatthistorik är inte längre tillgänglig på grund av ett fel, men kommer " "att bibehållas från och med nu." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} skriver..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} har slutat skriva..." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} är borta" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} är inte ansluten" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} är ansluten" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "inte ansluten" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Inte ansluten till server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Inte tillräckligt med parametrar för kommandot {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Ansluten till {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Frånkopplad från {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Ansluter automatiskt till {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatisk anslutning till {0} misslyckades!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Kommandon för motorn" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Anslutning misslyckades!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Nedkoppling misslyckades - kunde inte hitta servern: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Återanslutning misslyckades!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Inställningarna laddades" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Inställningarna sparades" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Ogiltigt nyckel/värde-format." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Ogiltig konfigurationsnyckel: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Kunde inte konvertera konfigurationsvärdet: '{0}' till typen: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Ogiltig config remove key: '{0}'. Giltiga remove keys: MessagePatterns/" "{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Meddelandemönster med ID: '{0}' finns inte." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Meddelandemönster med ID: '{0}' borttagen." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Ogiltig parameter för inställningar; använd load, save, get eller set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Ogiltig parameter för nätverk; använd list, switch eller close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Anslutna nätverk" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Nätverk" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokoll" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Värd" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Ingen" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Tillgängliga nätverk" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Stängning av nätverk misslyckades - kunde inte hitta nätverket: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Byte av nätverk misslyckades - kunde inte hitta nätverket: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Inte ansluten till något nätverk" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Kunde inte spara chatthistorik. Din chatthistorik kommer inte att " "bibehållas. Anledning: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Anslutning misslyckades." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Ingen protokollshanterare funnen för protokollet: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Välkommen till Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Skriv /help för att visa en lista med tillgängliga kommandon." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Efter att du har kopplat upp dig så uppdateras listan med tillgängliga " "kommandon. Gå till den nyligen öppnade anslutningsfliken och använd " "kommandot /help igen för att se den utökade kommandolistan." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Användarnamnet får inte lämnas tomt." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Lösenordet får inte lämnas tomt." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Användaren \"{0}\" finns inte." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Användaren \"{0}\" finns redan." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Nätverk får inte lämnas tomt." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Servers värdnamn får inte lämnas tomt." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Serverns värdnamn innehåller ogiltiga tecken (ny rad)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Server ID '{0}' finns redan." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Kunde inte läsa in chatthistoriken. Din chatthistorik kommer inte att " "sparas. Anledning: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Kunde inte öppna chatthistoriken med skrivrättighet. Din chatthistorik " "kommer inte att sparas. Anledning: {0}" smuxi-1.1/po-Engine/tr.po0000664000175000017500000002231514011526464016134 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 # U, 2011 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:30+0200\n" "PO-Revision-Date: 2015-02-07 18:15+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Ağ bağlantısı yok" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "{0} en uygun duruma getiriliyor..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "{0} en uygun duruma getirilemedi. Neden: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "Sohbet geçmişiniz bir hata nedeniyle artık kullanılabilir değil ancak şu andan itibaren tutulacaktır." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} yazıyor..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} yazmayı bıraktı..." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} uzakta" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} çevrimdışı" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} çevrimiçi" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "bağlantı yok" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Sunucuyla bağlantı yok" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "{0} komutu için yetersiz parametre" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "{0} ile bağlantı kuruldu" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "{0} ile bağlantı kesildi" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "{0} ile kendiliğinden bağlantı kuruluyor..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "{0} ile kendiliğinden bağlantı başarısız oldu!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Motor Komutları" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Bağlantı başarısız oldu!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Bağlantı kesilmesi başarısız oldu - {0} sunucusu bulunamadı." #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Yeniden bağlantı başarısız oldu!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Yapılandırma yeniden yüklendi" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Yapılandırma kaydedildi" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Geçersiz anahtar/değer biçimi." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Geçersiz yapılandırma anahtarı: '{0}'" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "'{0}' yapılandırma değeri {1} türüne dönüştürülemedi" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "Geçersiz yapılandırma kaldırma anahtarı: '{0}'. Geçerli kaldırma anahtarları: MessagePatterns/{{Kimlik}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "'{0}' kimlikli ileti kalıbı mevcut değil." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "'{0}' kimlikli ileti kalıbı kaldırıldı." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Yapılandırma için geçersiz parametre; load, save, get ya da set parametrelerini kullanın." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Ağ için geçersiz parametre; list, switch ya da close parametrelerini kullanın" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Bağlantı Kurulmuş Ağlar" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Ağ" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Host" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Yok" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Kullanılabilir Ağlar" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Ağ sonlandırma başarısız oldu - {0} ağı bulunamadı" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Ağ değişimi başarısız oldu - {0} ağı bulunamadı" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Hiçbir ağla bağlantı yok" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Sohbet geçmişine yazım işlemi başarısız oldu. Sohbet geçmişiniz tutulmayacak. Neden: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Bağlantı başarısız oldu." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "{0} protokolü için bir protokol yönetici bulunamadı" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Smuxi'ye hoş geldiniz" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Kullanılabilir komutlar listesi için /help yazın." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "Bir bağlantı kurmanızın ardından kullanılabilir komutlar listesi değişecektir. Genişletilmiş komut listesini görmek için yeni açılmış bağlantı sekmesine gidin /help komutunu tekrar kullanın." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Kullanıcı adı boş bırakılamaz." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Parola boş bırakılamaz." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "\"{0}\" kullanıcısı mevcut değil." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "\"{0}\" kullanıcısı zaten mevcut." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Ağ boş bırakılamaz." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Sunucu host adı boş bırakılamaz." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Sunucu host adı geçersiz karakter içeriyor (yenisatır)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Sunucu kimliği '{0}' zaten mevcut." #: ../src/Engine/Chats/ChatModel.cs:109 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "Sohbet geçmişi yüklemesi başarısız oldu. Sohbet geçmişiniz tutulmayacak. Neden: {0}" #: ../src/Engine/Chats/ChatModel.cs:311 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "Yazım için sohbet geçmişinin açılması başarısız oldu. Sohbet geçmişiniz tutulmayacak. Neden: {0}" smuxi-1.1/po-Engine/pt_BR.po0000664000175000017500000002247414011526464016523 0ustar00meebeymeebey00000000000000# Brazilian Portuguese translation for smuxi-Engine # Copyright (C) 2016 THE smuxi-Engine'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Leonardopf , 2013. # Rafael Fontenelle , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:44+0000\n" "PO-Revision-Date: 2016-03-05 21:58-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Sem conexão de rede" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimizando: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Falha ao otimizar: {0}. Motivo: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Seu histórico de bate-papo não está mais disponível por causa de um erro, " "mas será preservado a partir de agora." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} está digitando..." #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} parou de digitar..." #: ../src/Engine/Messages/MessageBuilder.cs:820 #, csharp-format msgid "{0} is away" msgstr "{0} está ausente" #: ../src/Engine/Messages/MessageBuilder.cs:826 #, csharp-format msgid "{0} is offline" msgstr "{0} está desconectado" #: ../src/Engine/Messages/MessageBuilder.cs:832 #, csharp-format msgid "{0} is online" msgstr "{0} está conectado" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "não conectado" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Não conectado ao servidor" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parâmetros insfucientes para o comando {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Conectado a {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Desconectado de {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Conectando automaticamente a {0}..." #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Conexão automática a {0} falhou!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Comandos principais" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Conexão falhou!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Desconexão falhou - não foi possível encontrar servidor: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Reconexão falhou!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Configuração recarregada" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Configuração salva" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Formato chave/valor inválido." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Chave de configuração inválida: \"{0}\"" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "" "Não foi possível converter valor de configuração: \"{0}\" para o tipo: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Chave de remoção de configuração inválida: \"{0}\". Chaves de remoção " "válidas: MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Padrão de mensagem com ID: \"{0}\" não existe." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Padrão de mensagem com ID: \"{0}\" removido." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "Parâmetro inválido para configuração; use load, save, get ou set." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "Parâmetro invalido para rede: use list, switch ou close" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Redes conectadas" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Rede" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protocolo" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Servidor" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Porta" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Nenhuma" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Redes disponíveis" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Desconexão falhou - não foi possível encontrar rede: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Troca de rede falhou - não foi possível encontrar rede: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Não conectado a nenhuma rede" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Falha ao escrever o histórico de bate-papo. Seu histórico de bate-papo não " "será preservado. Motivo: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Conexão falhou." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Nenhum gerenciador de protocolo localizado para o protocolo: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Bem-vindo ao Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Digite /help para obter uma lista de comandos disponíveis." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Após você se conectar, a lista de comandos muda. Vá para a aba da nova " "conexão realizada e use o comando /help novamente para ver a lista de " "comandos estendida." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Nome de usuário não pode estar vazio." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Senha não pode estar vazia." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Usuário \"{0}\" não existe." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Usuário \"{0}\" já existe." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Rede não pode estar vazia." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Nome do servidor não pode estar vazio." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Nome do servidor contém caracteres inválidos (nova linha)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Servidor de ID \"{0}\" já existe." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Falha ao carregar histórico de bate-papo. Seu histórico de bate-papo não " "será preservado. Motivo: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Falha ao abrir histórico de bate-papo para escrita. Seu histórico de bate-" "papo não será preservado. Motivo: {0}" smuxi-1.1/po-Engine/fa.po0000664000175000017500000001455214011526464016101 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 16:58+0100\n" "PO-Revision-Date: 2013-12-05 18:50+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:295 #, csharp-format msgid "Optimizing: {0}..." msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:313 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:347 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:782 #, csharp-format msgid "{0} is typing..." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:788 #, csharp-format msgid "{0} has stopped typing..." msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:831 #, csharp-format msgid "{0} is away" msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:837 #, csharp-format msgid "{0} is offline" msgstr "" #: ../src/Engine/Messages/MessageBuilder.cs:843 #, csharp-format msgid "{0} is online" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:170 msgid "Not connected to server" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:178 #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:219 #, csharp-format msgid "Disconnected from {0}" msgstr "" #: ../src/Engine/Session.cs:237 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "" #: ../src/Engine/Session.cs:268 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:471 msgid "Engine Commands" msgstr "" #: ../src/Engine/Session.cs:599 msgid "Connect failed!" msgstr "" #: ../src/Engine/Session.cs:622 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "" #: ../src/Engine/Session.cs:664 msgid "Reconnect failed!" msgstr "" #: ../src/Engine/Session.cs:688 msgid "Configuration reloaded" msgstr "" #: ../src/Engine/Session.cs:692 msgid "Configuration saved" msgstr "" #: ../src/Engine/Session.cs:723 msgid "Invalid key/value format." msgstr "" #: ../src/Engine/Session.cs:733 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "" #: ../src/Engine/Session.cs:743 ../src/Engine/Session.cs:749 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "" #: ../src/Engine/Session.cs:758 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" #: ../src/Engine/Session.cs:850 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:880 msgid "Connected Networks" msgstr "" #: ../src/Engine/Session.cs:885 ../src/Engine/Session.cs:909 msgid "Network" msgstr "" #: ../src/Engine/Session.cs:886 msgid "Protocol" msgstr "" #: ../src/Engine/Session.cs:887 msgid "Host" msgstr "" #: ../src/Engine/Session.cs:888 msgid "Port" msgstr "" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:894 ../src/Engine/Session.cs:915 msgid "None" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:901 msgid "Available Networks" msgstr "" #: ../src/Engine/Session.cs:929 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:973 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "" #: ../src/Engine/Session.cs:991 msgid "Not connected to any network" msgstr "" #: ../src/Engine/Session.cs:1245 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1446 msgid "Connect failed." msgstr "" #: ../src/Engine/Session.cs:1460 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "" #: ../src/Engine/Session.cs:1734 msgid "Welcome to Smuxi" msgstr "" #: ../src/Engine/Session.cs:1741 msgid "Type /help to get a list of available commands." msgstr "" #: ../src/Engine/Session.cs:1747 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "" #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "" #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "" #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "" #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "" #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "" #: ../src/Engine/Chats/ChatModel.cs:108 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" #: ../src/Engine/Chats/ChatModel.cs:305 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" smuxi-1.1/po-Engine/da.po0000664000175000017500000002224414011526464016074 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2011-2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:23+0000\n" "PO-Revision-Date: 2014-11-27 14:26+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine/FrontendManager.cs:218 msgid "No network connections" msgstr "Ingen netværksforbindelser" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:263 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimerer: {0} …" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:281 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Kunne ikke optimere: {0}. Årsag: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:315 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Din chathistorik er ikke længere tilgængelig på grund af en fejl, men den " "vil blive gemt fremadrettet." #: ../src/Engine/Messages/MessageBuilder.cs:771 #, csharp-format msgid "{0} is typing..." msgstr "{0} taster …" #: ../src/Engine/Messages/MessageBuilder.cs:777 #, csharp-format msgid "{0} has stopped typing..." msgstr "{0} har stoppet indtastning …" #: ../src/Engine/Messages/MessageBuilder.cs:822 #, csharp-format msgid "{0} is away" msgstr "{0} er fraværende" #: ../src/Engine/Messages/MessageBuilder.cs:828 #, csharp-format msgid "{0} is offline" msgstr "{0} er frakoblet" #: ../src/Engine/Messages/MessageBuilder.cs:834 #, csharp-format msgid "{0} is online" msgstr "{0} er tilkoblet" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:162 msgid "not connected" msgstr "ikke forbundet" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:193 msgid "Not connected to server" msgstr "Ikke forbundet til server" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:201 #: ../src/Engine/Session.cs:1067 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ikke nok parametre for kommandoen {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:212 #, csharp-format msgid "Connected to {0}" msgstr "Forbundet til {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:242 #, csharp-format msgid "Disconnected from {0}" msgstr "Ikke længere forbundet til {0}" #: ../src/Engine/Session.cs:247 #, csharp-format msgid "Automatically connecting to {0}..." msgstr "Automatisk tilslutning til {0} …" #: ../src/Engine/Session.cs:278 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatisk tilslutning til {0} mislykkedes!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:505 msgid "Engine Commands" msgstr "Motorkommandoer" #: ../src/Engine/Session.cs:634 msgid "Connect failed!" msgstr "Tilslutning mislykkedes!" #: ../src/Engine/Session.cs:657 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Afbrydelse fejlede - kunne ikke finde server: {0}" #: ../src/Engine/Session.cs:699 msgid "Reconnect failed!" msgstr "Gentilslutning mislykkedes!" #: ../src/Engine/Session.cs:723 msgid "Configuration reloaded" msgstr "Konfiguration genindlæst" #: ../src/Engine/Session.cs:727 msgid "Configuration saved" msgstr "Konfiguration gemt" #: ../src/Engine/Session.cs:754 msgid "Invalid key/value format." msgstr "Ugyldigt nøgle/værdi-format." #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Invalid config key: '{0}'" msgstr "Ugyldig konfigurationsnøgle: »{0}«" #: ../src/Engine/Session.cs:794 ../src/Engine/Session.cs:800 #, csharp-format msgid "Could not convert config value: '{0}' to type: {1}" msgstr "Kunne ikke konvertere konfigurationsværdi: »{0}« til type: {1}" #: ../src/Engine/Session.cs:814 #, csharp-format msgid "" "Invalid config remove key: '{0}'. Valid remove keys: MessagePatterns/{{ID}}." msgstr "" "Ugyldig fjern nøgle-konfiguration: »{0}«. Gyldige fjern nøgler: " "MessagePatterns/{{ID}}." #: ../src/Engine/Session.cs:827 #, csharp-format msgid "Message pattern with ID: '{0}' does not exist." msgstr "Beskedmønster med ID: »{0}« findes ikke." #: ../src/Engine/Session.cs:834 #, csharp-format msgid "Message pattern with ID: '{0}' removed." msgstr "Beskedmønster med ID: »{0}« fjernet." #: ../src/Engine/Session.cs:842 msgid "Invalid parameter for config; use load, save, get or set." msgstr "" "Ugyldig parameter for konfiguration: brug load (indlæs), save (gem), get " "(hent) eller set (sæt)." #: ../src/Engine/Session.cs:919 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Ugyldigt parameter for netværk; brug list (vis), switch (skift) eller close " "(luk)" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:949 msgid "Connected Networks" msgstr "Forbundne netværk" #: ../src/Engine/Session.cs:954 ../src/Engine/Session.cs:978 msgid "Network" msgstr "Netværk" #: ../src/Engine/Session.cs:955 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:956 msgid "Host" msgstr "Vært" #: ../src/Engine/Session.cs:957 msgid "Port" msgstr "Port" #. TRANSLATOR: no connected networks #. TRANSLATOR: no available networks #: ../src/Engine/Session.cs:963 ../src/Engine/Session.cs:984 msgid "None" msgstr "Ingen" #. TRANSLATOR: this line is used as a label / category for a #. list of networks below #: ../src/Engine/Session.cs:970 msgid "Available Networks" msgstr "Tilgængelige netværk" #: ../src/Engine/Session.cs:998 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Lukning af netværk fejlede - kunne ikke finde netværk: {0}" #: ../src/Engine/Session.cs:1042 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Netværksomskifter fejlede - kunne ikke finde netværk: {0}" #: ../src/Engine/Session.cs:1060 msgid "Not connected to any network" msgstr "Ikke tilsluttet til noget netværk" #: ../src/Engine/Session.cs:1317 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Kunne ikke skrive chathistorik. Din chathistorik vil ikke blive gemt. Årsag: " "{0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1550 msgid "Connect failed." msgstr "Tilslutning mislykkedes." #: ../src/Engine/Session.cs:1564 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Ingen protokolhåndtering fundet til denne protokol: {0}" #: ../src/Engine/Session.cs:1896 msgid "Welcome to Smuxi" msgstr "Velkommen til Smuxi" #: ../src/Engine/Session.cs:1903 msgid "Type /help to get a list of available commands." msgstr "Tast /help for en liste over tilgængelige kommandoer." #: ../src/Engine/Session.cs:1909 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Efter du har foretaget en forbindelsen så ændres listen over tilgængelige " "kommandoer. Gå til det netop åbnede forbindelsesfaneblad og brug kommandoen /" "help igen for at se den udvidede kommandoliste." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Brugernavn må ikke være tomt." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Adgangskode må ikke være tom." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Bruger »{0}« findes ikke." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Bruger »{0}« findes allerede." #: ../src/Engine/Config/ServerListController.cs:118 msgid "Network must not be empty." msgstr "Netværk må ikke være tomt." #: ../src/Engine/Config/ServerListController.cs:138 msgid "Server hostname must not be empty." msgstr "Serverværtsnavn må ikke være tomt." #: ../src/Engine/Config/ServerListController.cs:141 msgid "Server hostname contains invalid characters (newline)." msgstr "Serverværtsnavn indeholder ugyldige tegn (nylinje)." #: ../src/Engine/Config/ServerListController.cs:148 #, csharp-format msgid "Server ID '{0}' already exists." msgstr "Server-id »{0}« findes allerede." #: ../src/Engine/Chats/ChatModel.cs:106 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Kunne ikke indlæse chathistorik. Din chathistorik vil ikke blive bevaret. " "Årsag: {0}" #: ../src/Engine/Chats/ChatModel.cs:322 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Kunne ikke åbne chathistorik for skrivning. Din chathistorik vil ikke blive " "bevaret. Årsag: {0}" smuxi-1.1/po-Engine/hr.po0000664000175000017500000001525114011526464016121 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2012-01-01 18:47+0100\n" "PO-Revision-Date: 2012-01-08 08:35+0000\n" "Last-Translator: Matias M. \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: ../src/Engine/FrontendManager.cs:233 msgid "No network connections" msgstr "Nema mrežnih veza" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:295 #, csharp-format msgid "Optimizing: {0}..." msgstr "Optimizacija: {0}..." #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:313 #, csharp-format msgid "Failed to optimize: {0}. Reason: {1}" msgstr "Optimizacija nije uspjela: {0}. Razlog: {1}" #: ../src/Engine/MessageBuffers/Db4oMessageBuffer.cs:347 msgid "" "Your chat history is no longer available because of an error but will be " "preserved from now on." msgstr "" "Vaša chat povijest više nije dostupna zbog pogreške no od sada nadalje će " "biti sačuvana." #: ../src/Engine/Protocols/ProtocolManagerBase.cs:170 msgid "Not connected to server" msgstr "Nema povezanosti sa poslužiteljem" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:178 #: ../src/Engine/Session.cs:778 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nema dovoljno parametara za {0} naredbu" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:189 #, csharp-format msgid "Connected to {0}" msgstr "Spojen na {0}" #: ../src/Engine/Protocols/ProtocolManagerBase.cs:207 #, csharp-format msgid "Disconnected from {0}" msgstr "Odspojeno sa {0}" #: ../src/Engine/Session.cs:218 #, csharp-format msgid "Automatic connect to {0} failed!" msgstr "Automatsko spajanje na {0} nije uspjelo!" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine/Session.cs:416 msgid "Engine Commands" msgstr "Naredbe jezgre" #: ../src/Engine/Session.cs:527 msgid "Connect failed!" msgstr "Spajanje nije uspjelo!" #: ../src/Engine/Session.cs:550 #, csharp-format msgid "Disconnect failed - could not find server: {0}" msgstr "Prekid veze nije uspio - nije moguće pronaći poslužitelj: {0}" #: ../src/Engine/Session.cs:589 msgid "Reconnect failed!" msgstr "Ponovno spajanje nije uspjelo!" #: ../src/Engine/Session.cs:608 msgid "Configuration reloaded" msgstr "Postavke ponovno učitane" #: ../src/Engine/Session.cs:613 msgid "Configuration saved" msgstr "Postavke pohranjene" #: ../src/Engine/Session.cs:617 msgid "Invalid parameter for config; use load or save" msgstr "Netočan parametar za postavke; upotrijebite load ili save naredbu" #: ../src/Engine/Session.cs:676 msgid "Invalid parameter for network; use list, switch, or close" msgstr "" "Netočan parametar za mrežu; upotrijebite list, switch ili close naredbu" #: ../src/Engine/Session.cs:687 msgid "Networks" msgstr "Mreže" #: ../src/Engine/Session.cs:691 msgid "Protocol" msgstr "Protokol" #: ../src/Engine/Session.cs:692 msgid "Network" msgstr "Mreža" #: ../src/Engine/Session.cs:693 msgid "Host" msgstr "Poslužitelj" #: ../src/Engine/Session.cs:694 msgid "Port" msgstr "Port" #: ../src/Engine/Session.cs:709 #, csharp-format msgid "Network close failed - could not find network: {0}" msgstr "Zatvaranje mreže nije uspjelo - mreža nije pronađena: {0}" #: ../src/Engine/Session.cs:748 #, csharp-format msgid "Network switch failed - could not find network: {0}" msgstr "Prebacivanje mreže nije uspjelo - mreža nije pronađena: {0}" #: ../src/Engine/Session.cs:767 msgid "Not connected to any network" msgstr "Nema povezanosti sa nijednom mrežom" #: ../src/Engine/Session.cs:1013 #, csharp-format msgid "" "Failed to write to chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Zapisivanje u chat povijest nije uspjelo. Vaša chat povijest neće biti " "sačuvana. Razlog: {0}" #. just in case the ProtocolManager is not setting the #. protocol chat #: ../src/Engine/Session.cs:1185 msgid "Connect failed." msgstr "Spajanje nije uspjelo." #: ../src/Engine/Session.cs:1216 #, csharp-format msgid "No protocol manager found for the protocol: {0}" msgstr "Za sljedeći protokol nema imenovanog upravitelja: {0}" #: ../src/Engine/Session.cs:1448 msgid "Welcome to Smuxi" msgstr "Smuxi vas pozdravlja" #: ../src/Engine/Session.cs:1455 msgid "Type /help to get a list of available commands." msgstr "Upišite /help za popis dostupnih naredbi." #: ../src/Engine/Session.cs:1461 msgid "" "After you have made a connection the list of available commands changes. Go " "to the newly opened connection tab and use the /help command again to see " "the extended command list." msgstr "" "Popis dostupnih naredbi se mijenja nakon spajanja. Odaberite novootvorenu " "karticu i upotrijebite /help naredbu za prikaz cjelokupnog popisa." #: ../src/Engine/Config/UserListController.cs:117 msgid "Username must not be empty." msgstr "Korisničko ime ne smije biti prazno." #: ../src/Engine/Config/UserListController.cs:127 msgid "Password must not be empty." msgstr "Lozinka ne smije biti prazna." #: ../src/Engine/Config/UserListController.cs:136 #, csharp-format msgid "User \"{0}\" doesn't exist." msgstr "Korisnik \"{0}\" ne postoji." #: ../src/Engine/Config/UserListController.cs:145 #, csharp-format msgid "User \"{0}\" already exists." msgstr "Korisnik \"{0}\" već postoji." #: ../src/Engine/Config/ServerListController.cs:131 msgid "Server hostname must not be empty." msgstr "Ime poslužitelja ne smije biti prazno." #: ../src/Engine/Config/ServerListController.cs:134 msgid "Server hostname contains invalid characters (newline)." msgstr "Ime poslužitelja sadrži nevažeće simbole (novi redak)." #: ../src/Engine/Config/ServerListController.cs:140 #, csharp-format msgid "Server '{0}' already exists." msgstr "Poslužitelj '{0}' već postoji." #: ../src/Engine/Chats/ChatModel.cs:105 #, csharp-format msgid "" "Failed to load chat history. Your chat history will not be preserved. " "Reason: {0}" msgstr "" "Učitavanje chat povijesti nije uspjelo. Vaša chat povijest neće biti " "sačuvana. Razlog: {0}" #: ../src/Engine/Chats/ChatModel.cs:290 #, csharp-format msgid "" "Failed to open chat history for writing. Your chat history will not be " "preserved. Reason: {0}" msgstr "" "Nije uspjelo otvaranje chat povijesti za zapis. Vaša chat povijest neće biti" " sačuvana. Razlog: {0}" smuxi-1.1/HACKING.md0000664000175000017500000000511614011467170014712 0ustar00meebeymeebey00000000000000Hacking HowTo ============= https://smuxi.im/documentation/hacking/ Git Commit Message Style ========================== http://chris.beams.io/posts/git-commit/ Coding Style ============ ```cs using System; using System.IO; using ThirdPartyNamespaces; using MyOwnNamespaces; namespace Smuxi.Frontend.Gnome { public class GroupChatView : ChatView { // fields before auto properties int f_SomeField; string f_AnotherField; public int SomeAutoProperty { get; set; } // properties before ctors public int SomeManualProperty { get { return f_SomeField; } set { f_SomeField = value; } } // events before ctors public event EventHandler StatusChanged; // ctors before methods public ChatView() { } public ChatView(int someParameter, string anotherParameter) : base(someParameter, anotherParameter) { SomeAutoProperty = someParameter; f_AnotherField = anotherParameter; } public void SomePublicMethod() { // avoid nesting if (f_SomeField != 0) { return; } DoSomething(); var res = MethodCallWithLotsOfParameterThatDontFitInASingleLine( f_SomeField, f_AnotherField, String.Format( "Some String with {0}", SomeAutoProperty ) ); switch (res) { case "Foo": // code of Foo case break; case "Bar": // code of Bar case break; } } // do not specify default access modifiers (private for methods) void DoSomething() { try { using (var hardStuff = GetSomethingHard()) { // this is too hard, can't deal with it } } catch (InvalidOperationException) { } // do not use if (!something) with a else case, instead do: if (something) { // something is true case } else { // something is false case } // fluent style var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendFormat("Test message"). ToMessage(); AddMessage(msg); } } } smuxi-1.1/po-Engine-JabbR/0000775000175000017500000000000014011526503016114 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-JabbR/LINGUAS0000664000175000017500000000011314011526464017142 0ustar00meebeymeebey00000000000000cs da de el es fa fi fr hu id lt nl oc pl pt pt_BR ro sl sr sv te tr zh_CN smuxi-1.1/po-Engine-JabbR/cs.po0000664000175000017500000000404114011526464017066 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Mirco Bauer , 2013 # RavuAlHemio , 2013 # Marek Černocký , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:45+0000\n" "PO-Revision-Date: 2016-03-17 07:43+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.7\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Příkazy JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Vstup do místnosti se nezdařil. Příčina: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Odeslání zprávy se nezdařilo. Příčina: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Připojení se nezdařilo! Příčina: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Připojuje se k serveru {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Opětovně se připojuje k serveru {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "nepřipojeno" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Nezdařilo se získat informace o pokecu. Příčina: {0}" smuxi-1.1/po-Engine-JabbR/zh_CN.po0000664000175000017500000000335714011526464017473 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2013-12-13 08:22+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR 命令" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "房间加入失败。原因: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "消息发送失败。原因: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "连接失败! 原因: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "正在连接到 {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "正在重新连接到 {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "未连接" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "检索聊天信息失败。原因: {0}" smuxi-1.1/po-Engine-JabbR/el.po0000664000175000017500000000421514011526464017064 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:41+0000\n" "PO-Revision-Date: 2015-07-19 13:03+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team.lists@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Εντολές JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Αποτυχία σύνδεσης με αίθουσα. Αιτία: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Αποτυχία αποστολής μηνύματος. Αιτία: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Αποτυχία σύνδεσης: Αιτία: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Συνδέεται με το {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Επανασυνδέεται με το {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "δεν συνδέθηκε" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Αποτυχία ανάκτησης πληροφοριών συνομιλίας. Αιτία:{0}" smuxi-1.1/po-Engine-JabbR/ro.po0000664000175000017500000000365714011526464017115 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:19+0000\n" "PO-Revision-Date: 2018-04-05 18:00+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > " "0 && n%100 < 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Comenzi JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Alăturarea la cameră a eșuat. Motivul: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Trimiterea mesajului a eșuat. Motivul: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Conexiunea a eșuat! Motivul: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Se conectează la {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Se reconectează la {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "neconectat" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "" "Obținerea informațiilor de discuție a eșuat. Motivul: {0}" smuxi-1.1/po-Engine-JabbR/fi.po0000664000175000017500000000345714011526464017071 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-05-03 12:51+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR-komennot" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Huoneeseen liittyminen epäonnistui. Syy: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Viestin lähetys epäonnistui. Syy: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Yhteys epäonnistui! Syy: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Yhdistetään kohteeseen {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Yhdistetään uudelleen kohteeseen {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "ei yhteydessä" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Keskustelutiedon haku epäonnistui. Syy: {0}" smuxi-1.1/po-Engine-JabbR/de.po0000664000175000017500000000370314011526464017055 0ustar00meebeymeebey00000000000000# German translation for smuxi-Engine-JabbR. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2013. # Mirco Bauer , 2013. # Mario Blättermann , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:00+0100\n" "PO-Revision-Date: 2016-01-08 14:29+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR-Befehle" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Betreten des Raums ist fehlgeschlagen. Grund: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Senden der Nachricht ist fehlgeschlagen. Grund: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Verbindung ist fehlgeschlagen! Ursache: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Verbindung zu {0} …" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:340 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Erneute Verbindung zu {0} …" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:433 msgid "not connected" msgstr "nicht verbunden" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:577 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Abfragen der Chat-Informationen ist fehlgeschlagen. Grund: {0}" smuxi-1.1/po-Engine-JabbR/hu.po0000664000175000017500000000360214011526464017077 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 11:44+0000\n" "PO-Revision-Date: 2015-07-17 19:06+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR parancsok" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "A szobához csatlakozás sikertelen. Ok: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Az üzenet küldése sikertelen. Ok: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Kapcsolat meghiúsult! Ok: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Kapcsolódás ehhez: {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Újrakapcsolódás ehhez: {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "nincs kapcsolódva" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "A csevegés-információk lekérése sikertelen. Ok: {0}" smuxi-1.1/po-Engine-JabbR/fr.po0000664000175000017500000000347014011526464017075 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2013-12-13 21:38+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Commandes JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Impossible de rejoindre le canal. Raison : {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Impossible d'envoyer le message. Raison : {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Connexion échouée ! Raison : {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Connexion à {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconnexion à {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "non connecté" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Récupération des informations de discussion échouée. Raison : {0}" smuxi-1.1/po-Engine-JabbR/sr.po0000664000175000017500000000430414011526464017107 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:41+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Наредбе ЈаббР-а" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Приступање соби није успело. Разлог: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Слање поруке није успело. Разлог: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Повезивање није успело! Разлог: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Повезујем се на {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Поново се повезујем са {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "нисте повезани" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Добављање података ћаскања није успело. Разлог: {0}" smuxi-1.1/po-Engine-JabbR/sl.po0000664000175000017500000000340714011526464017104 0ustar00meebeymeebey00000000000000# 'smuxi/po-Engine-JabbR/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:39+0000\n" "PO-Revision-Date: 2016-03-11 22:56+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n" "%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Ukazi JabbeR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "" smuxi-1.1/po-Engine-JabbR/pl.po0000664000175000017500000000361014011526464017075 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2015-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:52+0200\n" "PO-Revision-Date: 2016-08-21 16:41+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Polecenia JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Dołączenie do pokoju się nie powiodło. Powód: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Wysłanie wiadomości się nie powiodło. Powód: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Połączenie się nie powiodło. Powód: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Łączenie z {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Ponowne łączenie {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "niepołączony" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Pobranie informacji o rozmowie się nie powiodło. Powód: {0}" smuxi-1.1/po-Engine-JabbR/id.po0000664000175000017500000000346014011526464017061 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-01-17 20:02+0000\n" "PO-Revision-Date: 2017-04-20 13:31+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Perintah JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Bergabung ke kanal gagal. Alasan: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Mengirim pesan gagal. Alasan: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Koneksi gagal! Alasan: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Menghubungkan ke {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Menghubungkan kembali ke {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "tidak terhubung" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Mengambil informasi obrolan gagal. Alasan: {0}" smuxi-1.1/po-Engine-JabbR/es.po0000664000175000017500000000345114011526464017074 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 # Mirco Bauer , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2013-12-11 16:10+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Órdenes JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Falló la entrada al canal. Razón: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Falló el envío del mensaje. Razón: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "¡Falló la conexión! Razón: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Conectando a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconectando a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "no conectado" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Falló la obtención de información de chat. Razón: {0}" smuxi-1.1/po-Engine-JabbR/Makefile.in.in0000664000175000017500000001577314011526464020611 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_ENGINE_JABBR@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine-JabbR/pt.po0000664000175000017500000000364014011526464017110 0ustar00meebeymeebey00000000000000# Portuguese translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Tiago S. , 2015. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-31 02:20+0000\n" "PO-Revision-Date: 2015-11-17 08:26+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Comandos JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Falha aos juntar-se à sala. Razão: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Falha no envio da mensagem. Razão: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Falha na ligação! Razão: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "A ligar a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "A religar a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "não ligado" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Falha ao recolher informação do chat. Razão: {0}" smuxi-1.1/po-Engine-JabbR/nl.po0000664000175000017500000000360614011526464017100 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2019-03-10 15:01+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR-opdrachten" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Verbinden met ruimte mislukt. Reden: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Verzenden van bericht mislukt. Reden: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Verbinden mislukt! Reden: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Verbinden met {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Opnieuw verbinden met {0}…" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "niet verbonden" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Ophalen van chatinformatie mislukt. Reden: {0}" smuxi-1.1/po-Engine-JabbR/lt.po0000664000175000017500000000347314011526464017110 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2014-12-17 14:44+0000\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR Komandos" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Nepavyko užeiti į kambarį. Priežastis: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Nepavyko išsiųsti pranešimo. Priežastis: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Nepavyko prisijungti! Priežastis: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Jungiamasi prie {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Jungiamasi iš naujo prie {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "neprisijungta" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Nepavyko gauti pokalbio informacijos. Priežastis: {0}" smuxi-1.1/po-Engine-JabbR/oc.po0000664000175000017500000000365114011526464017070 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # Cédric Valmary (totenoc.eu) , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&k" "eywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:45+0000\n" "PO-Revision-Date: 2016-03-16 19:43+0200\n" "Last-Translator: Cédric Valmary (totenoc.eu) \n" "Language-Team: Tot En Òc\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Comandas JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Impossible de rejónher lo canal. Rason : {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Impossible de mandar lo messatge. Rason : {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Connexion fracassada ! Rason : {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Connexion a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconnexion a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "pas connectat" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Recuperacion de las informacions de discussion fracassada. Rason : {0}" smuxi-1.1/po-Engine-JabbR/POTFILES.in0000664000175000017500000000005114011526464017673 0ustar00meebeymeebey00000000000000src/Engine-JabbR/JabbrProtocolManager.cs smuxi-1.1/po-Engine-JabbR/POTFILES.skip0000664000175000017500000000047214011526464020242 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-Twitter/ src/Engine-XMPP/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Engine-JabbR/te.po0000664000175000017500000000277414011526464017104 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:00+0100\n" "PO-Revision-Date: 2013-12-11 16:07+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:340 #, csharp-format msgid "Reconnecting to {0}..." msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:433 msgid "not connected" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:577 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "" smuxi-1.1/po-Engine-JabbR/sv.po0000664000175000017500000000352414011526464017116 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Martin Bagge , 2013 # Mirco Bauer , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:00+0100\n" "PO-Revision-Date: 2013-12-11 16:10+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR-kommandon" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Anslutning till rum misslyckades. Anledning: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Meddelandet kunde inte skickas. Anledning: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Anslutning misslyckades! Anledning: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Ansluter till {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:340 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Återansluter till {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:433 msgid "not connected" msgstr "inte ansluten" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:577 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Hämtning av chattinformation misslyckades. Anledning: {0}" smuxi-1.1/po-Engine-JabbR/tr.po0000664000175000017500000000351514011526464017113 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-01-17 13:24+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR Komutları" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Odaya katılım başarısız oldu. Neden: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "İleti gönderimi başarısız oldu. Neden: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Bağlantı başarısız oldu! Neden: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "{0} ile bağlantı kuruluyor..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "{0} ile yeniden bağlantı kuruluyor..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "bağlantı yok" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Sohbet bilgisi geri getirilmesi başarısız oldu. Neden: {0}" smuxi-1.1/po-Engine-JabbR/pt_BR.po0000664000175000017500000000364414011526464017477 0ustar00meebeymeebey00000000000000# Brazilian Portuguese translation for Smuxi-Engine-JabbR. # Copyright (C) 2015 THE SMUXI'S COPYRIGHT HOLDER # This file is distributed under the same license as the SMUXI package. # # Translators: # Enrico Nicoletto , 2015. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-27 23:41+0000\n" "PO-Revision-Date: 2015-07-28 08:59-0300\n" "Last-Translator: Enrico Nicoletto \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.7.3\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "Comandos do JabbR" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Falha ao ingressar na sala. Motivo: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Falha ao enviar mensagem. Motivo: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Conexão falhou! Motivo: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Conectando a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Reconectando a {0}..." #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "desconectado" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Falha ao recuperar informações do bate-papo. Motivo: {0}" smuxi-1.1/po-Engine-JabbR/fa.po0000664000175000017500000000276614011526464017063 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:00+0100\n" "PO-Revision-Date: 2013-12-11 16:07+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:340 #, csharp-format msgid "Reconnecting to {0}..." msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:433 msgid "not connected" msgstr "" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:577 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "" smuxi-1.1/po-Engine-JabbR/da.po0000664000175000017500000000360214011526464017047 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2013 # Mirco Bauer , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:25+0000\n" "PO-Revision-Date: 2013-12-11 16:10+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:103 msgid "JabbR Commands" msgstr "JabbR-kommandoer" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:136 #, csharp-format msgid "Joining room failed. Reason: {0}" msgstr "Tilslutning til rum mislykkedes. Årsag: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:162 #, csharp-format msgid "Sending message failed. Reason: {0}" msgstr "Send besked mislykkedes. Årsag: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:230 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Forbindelse mislykkedes! Årsag: {0}" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:243 #, csharp-format msgid "Connecting to {0}..." msgstr "Forbinder til {0} …" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:354 #, csharp-format msgid "Reconnecting to {0}..." msgstr "Genforbinder til {0} …" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:447 msgid "not connected" msgstr "ikke forbundet" #: ../src/Engine-JabbR/JabbrProtocolManager.cs:607 #, csharp-format msgid "Retrieving chat information failed. Reason: {0}" msgstr "Hentning af chatinformation mislykkedes. Årsag: {0}" smuxi-1.1/src/0000775000175000017500000000000014011526502014103 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/0000775000175000017500000000000014011526501015307 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/MessageBuffers/0000775000175000017500000000000014011526501020210 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/MessageBuffers/SqliteMessageBuffer.cs0000664000175000017500000003030314011467170024444 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2014-2015 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Text; using System.Linq; using System.Collections.Generic; using Mono.Data.Sqlite; using ServiceStack.Text; using Smuxi.Engine.Dto; namespace Smuxi.Engine { public class SqliteMessageBuffer : MessageBufferBase { #if LOG4NET static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif string DBPath { get; set; } SqliteConnection Connection { get; set; } Int64 MessageCount { get; set; } public override int Count { get { var connection = Connection; if (connection == null) { return 0; } using (var cmd = connection.CreateCommand()) { cmd.CommandText = "SELECT COUNT(*) FROM Messages"; return (int) Convert.ChangeType(cmd.ExecuteScalar(), typeof(int)); } } } public override DateTime LastSeenMessage { get { var connection = Connection; if (connection == null) { return DateTime.MinValue; } using (var cmd = connection.CreateCommand()) { cmd.CommandText = "SELECT Value FROM Properties WHERE Key = 'LastSeenMessage'"; var value = cmd.ExecuteScalar(); if (value == null) { return DateTime.MinValue; } return DateTime.Parse((string) value).ToUniversalTime(); } } set { var connection = Connection; if (connection == null) { return; } using (var cmd = connection.CreateCommand()) { var sql = "INSERT OR REPLACE INTO Properties (Key, Value) " + "VALUES('LastSeenMessage', @timestamp)"; cmd.CommandText = sql; var param = cmd.CreateParameter(); param.ParameterName = "timestamp"; if (value.Kind == DateTimeKind.Unspecified) { // HACK: on Mono the DateTimeKind gets lost during // serialization of .NET remoting. When this happens we // store the timestamp in local time instead. Otherwise // the timezone offset will be applied _again_ leading // to incorrect values, see: // https://smuxi.im/issues/show/1058 param.Value = value.ToString("o"); } else { param.Value = value.ToUniversalTime().ToString("o"); } cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } } } public override DateTime LastSeenHighlight { get { var connection = Connection; if (connection == null) { return DateTime.MinValue; } using (var cmd = connection.CreateCommand()) { cmd.CommandText = "SELECT Value FROM Properties WHERE Key = 'LastSeenHighlight'"; var value = cmd.ExecuteScalar(); if (value == null) { return DateTime.MinValue; } return DateTime.Parse((string) value).ToUniversalTime(); } } set { var connection = Connection; if (connection == null) { return; } using (var cmd = connection.CreateCommand()) { var sql = "INSERT OR REPLACE INTO Properties (Key, Value) " + "VALUES('LastSeenHighlight', @timestamp)"; cmd.CommandText = sql; var param = cmd.CreateParameter(); param.ParameterName = "timestamp"; if (value.Kind == DateTimeKind.Unspecified) { // HACK: on Mono the DateTimeKind gets lost during // serialization of .NET remoting. When this happens we // store the timestamp in local time instead. Otherwise // the timezone offset will be applied _again_ leading // to incorrect values, see: // https://smuxi.im/issues/show/1058 param.Value = value.ToString("o"); } else { param.Value = value.ToUniversalTime().ToString("o"); } cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } } } public override MessageModel this[int offset] { get { return GetRange(offset, 1).First(); } set { throw new NotImplementedException(); } } public SqliteMessageBuffer(string sessionUsername, string protocol, string networkId, string chatId) : base(sessionUsername, protocol, networkId, chatId) { DBPath = GetBufferPath() + ".sqlite3"; Init(); } public SqliteMessageBuffer(string dbPath) { if (dbPath == null) { throw new ArgumentNullException("dbPath"); } DBPath = dbPath; Init(); } void Init() { Connection = new SqliteConnection( //extra double-quotes are needed to prevent conflicting connectionString chars in the path such as ',' "Data Source=\"" + DBPath + "\";" + // enable Write-Ahead-Log (WAL) "Journal Mode=WAL" ); Connection.Open(); using (var cmd = Connection.CreateCommand()) { var sql = "CREATE TABLE IF NOT EXISTS Messages (" + "ID INTEGER PRIMARY KEY," + "JSON TEXT" + ")"; cmd.CommandText = sql; cmd.ExecuteNonQuery(); } using (var cmd = Connection.CreateCommand()) { var sql = "CREATE TABLE IF NOT EXISTS Properties (" + "Key TEXT PRIMARY KEY," + "Value TEXT" + ")"; cmd.CommandText = sql; cmd.ExecuteNonQuery(); } MessageCount = Count; } public override void Add(MessageModel msg) { if (msg == null) { throw new ArgumentNullException("msg"); } if (MaxCapacity > 0 && MessageCount >= MaxCapacity) { RemoveAt(0); } var dto = new MessageDtoModelV2(msg); var json = JsonSerializer.SerializeToString(dto); using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "INSERT INTO Messages (JSON)" + " VALUES(@json)"; var param = cmd.CreateParameter(); param.ParameterName = "json"; param.Value = json; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } MessageCount++; } public override IList GetRange(int offset, int limit) { using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "SELECT JSON FROM Messages " + " ORDER BY ID " + " LIMIT @limit OFFSET @offset"; var param = cmd.CreateParameter(); param.ParameterName = "offset"; param.Value = offset.ToString(); cmd.Parameters.Add(param); param = cmd.CreateParameter(); param.ParameterName = "limit"; param.Value = limit.ToString(); cmd.Parameters.Add(param); using (var reader = cmd.ExecuteReader()) { var msgs = new List(limit); while (reader.Read()) { var json = (string) reader["JSON"]; var dto = JsonSerializer.DeserializeFromString(json); var msg = dto.ToMessage(); msgs.Add(msg); } return msgs; } } } public override void Clear() { using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "DELETE FROM Messages"; cmd.ExecuteNonQuery(); } } public override bool Contains(MessageModel item) { throw new NotImplementedException (); } public override bool Remove(MessageModel item) { throw new NotImplementedException (); } public override IEnumerator GetEnumerator() { using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "SELECT JSON FROM Messages"; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var json = (string) reader["JSON"]; var dto = JsonSerializer.DeserializeFromString(json); yield return dto.ToMessage(); } } } } public override int IndexOf(MessageModel item) { throw new NotImplementedException (); } public override void Insert(int index, MessageModel item) { throw new NotImplementedException (); } public override void RemoveAt(int offset) { int id = -1; using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "SELECT ID FROM Messages " + " ORDER BY ID " + " LIMIT 1 OFFSET @offset"; var param = cmd.CreateParameter(); param.ParameterName = "offset"; param.Value = offset; cmd.Parameters.Add(param); id = (int) Convert.ChangeType(cmd.ExecuteScalar(), typeof(int)); } using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "DELETE FROM Messages WHERE ID = @id"; var param = cmd.CreateParameter(); param.ParameterName = "id"; param.Value = id; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } } public override void Flush() { } public override void Dispose() { var connection = Connection; if (connection == null) { return; } Flush(); Connection = null; connection.Close(); connection.Dispose(); } } } smuxi-1.1/src/Engine/MessageBuffers/Db4oMessageBuffer.cs0000644000175000017500000005041512726351313024001 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Collections.Generic; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Diagnostic; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class Db4oMessageBuffer : MessageBufferBase { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif const string LibraryTextDomain = "smuxi-engine"; const int DefaultFlushInterval = 16; List f_Index; int FlushInterval { get; set; } int FlushCounter { get; set; } IObjectContainer Database { get; set; } string DatabaseFile { get; set; } bool IsEmptyDatabase { get; set; } bool AggressiveGC { get; set; } #if DB4O_8_0 IEmbeddedConfiguration DatabaseConfiguration { get; set; } #else IConfiguration DatabaseConfiguration { get; set; } #endif private List Index { get { InitIndex(); return f_Index; } } public override MessageModel this[int index] { get { var dbId = Index[index]; return GetMessage(dbId); } set { throw new NotImplementedException(); } } public override int Count { get { return Index.Count; } } public Db4oMessageBuffer(string sessionUsername, string protocol, string networkId, string chatId) : base(sessionUsername, protocol, networkId, chatId) { FlushInterval = DefaultFlushInterval; AggressiveGC = true; DatabaseFile = GetDatabaseFile(); InitDatabase(); } public Db4oMessageBuffer(string dbPath) { if (dbPath == null) { throw new ArgumentNullException("dbPath"); } FlushInterval = DefaultFlushInterval; DatabaseFile = dbPath; InitDatabase(); } ~Db4oMessageBuffer() { Dispose(false); } public override void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (Database == null) { return; } CloseDatabase(); Database = null; ResetIndex(); } public override void Add(MessageModel item) { if (item == null) { throw new ArgumentNullException("item"); } // make sure the index is initialized at this point else we will // load the 1st added item of db4o and end up with a duplicate here InitIndex(); if (MaxCapacity > 0 && Index.Count >= MaxCapacity) { RemoveAt(0); } // TODO: auto-flush every 60 seconds var dbMsg = new MessageModel(item); Database.Store(dbMsg); Database.Deactivate(dbMsg, 5); var dbId = Database.Ext().GetID(dbMsg); Index.Add(dbId); FlushCounter++; if (FlushCounter >= FlushInterval) { Flush(); } } public override void Clear() { foreach (var dbId in Index) { var dbMsg = Database.Ext().GetByID(dbId); Database.Delete(dbMsg); } ResetIndex(); } public override bool Contains(MessageModel item) { if (item == null) { throw new ArgumentNullException("item"); } // TODO: benchmark me! //return Database.Query().Contains(item); return IndexOf(item) != -1; } public override IEnumerator GetEnumerator() { foreach (var dbId in Index) { yield return GetMessage(dbId); } } public override int IndexOf(MessageModel item) { if (item == null) { throw new ArgumentNullException("item"); } var res = Database.QueryByExample(item); // return -1 if not found if (res.Count == 0) { return -1; } var dbMsg = (MessageModel) res[0]; var dbId = Database.Ext().GetID(dbMsg); return Index.IndexOf(dbId); } public override void Insert(int index, MessageModel item) { throw new NotSupportedException(); } public override void RemoveAt(int index) { if (index < 0 || index >= Index.Count) { throw new ArgumentOutOfRangeException("index"); } var dbId = Index[index]; Index.RemoveAt(index); var dbMsg = Database.Ext().GetByID(dbId); if (dbMsg == null) { #if LOG4NET Logger.Error( String.Format("RemoveAt(): Database.Ext().GetByID({0}) " + "with index {1} returned null!", dbId, index) ); #endif return; } Database.Delete(dbMsg); // TODO: auto-commit after some timeout } public override bool Remove(MessageModel item) { if (item == null) { throw new ArgumentNullException("item"); } if (!Contains(item)) { return false; } var dbId = Database.Ext().GetID(item); Index.Remove(dbId); Database.Delete(item); return true; } public override IList GetRange(int offset, int limit) { if (offset < 0) { throw new ArgumentException( "offset must be greater than or equal to 0.", "offset" ); } // Neither Count nor the Indexer have to be synchronized as the // messages might move from the buffer to the db4o index but that // doesn't change the Count neither affects the combined indexer // BUG?: but what about MaxCapacity which will remove oldest items // when new messages are added, our loop here would become // inconsistent! // Session.AddMessageToChat() and ChatModel.get_Messages lock()s // us though thus newly added messages are waiting for us to finish var bufferCount = Count; var rangeCount = Math.Min(bufferCount, limit); var range = new List(rangeCount); for (int i = offset; i < offset + limit && i < bufferCount; i++) { range.Add(this[i]); } return range; } public static int OptimizeAllBuffers(Db4oMessageBufferOptimizationTypes opts) { DateTime start = DateTime.UtcNow, stop; var dbPath = Platform.GetBuffersBasePath(); var dbFiles = Directory.GetFiles(dbPath, "*.db4o", SearchOption.AllDirectories); foreach (var dbFile in dbFiles) { #if LOG4NET Logger.Info(String.Format(_("Optimizing: {0}..."), dbFile)); #endif try { using (var buffer = new Db4oMessageBuffer(dbFile)) { buffer.AggressiveGC = false; if ((opts & Db4oMessageBufferOptimizationTypes.Defrag) != 0) { buffer.CloseDatabase(); buffer.DefragDatabase(); buffer.InitDatabase(); } if ((opts & Db4oMessageBufferOptimizationTypes.Index) != 0) { buffer.RebuildIndex(); } } } catch (Exception ex) { #if LOG4NET Logger.Debug("OptimizeAllBuffers(): Failed to optimize: " + dbFile + " Exception: ", ex); Logger.InfoFormat(_("Failed to optimize: {0}. Reason: {1}"), dbFile, ex.Message); #endif } } stop = DateTime.UtcNow; #if LOG4NET Logger.Debug( String.Format( "OptimizeAllBuffers(): optimizing buffers took: {0:0} second(s)", (stop - start).TotalSeconds ) ); #endif return dbFiles.Length; } private void InitDatabase() { ConfigureDatabase(); try { OpenDatabase(); } catch (Exception ex) { #if LOG4NET Logger.Error("InitDatabase(): failed to open message " + "database: " + DatabaseFile, ex); #endif FixDatabase(ex); // WORXNOWPLX OpenDatabase(); var builder = new MessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText( _("Your chat history is no longer available because of " + "an error but will be preserved from now on.") ); Add(builder.ToMessage()); } } void ConfigureDatabase() { #if DB4O_8_0 DatabaseConfiguration = Db4oEmbedded.NewConfiguration(); DatabaseConfiguration.Common.AllowVersionUpdates = true; DatabaseConfiguration.Common.ActivationDepth = 0; //DatabaseConfiguration.Common.Queries.EvaluationMode(QueryEvaluationMode.Lazy); DatabaseConfiguration.Common.WeakReferenceCollectionInterval = 60 * 1000; //DatabaseConfiguration.Common.Diagnostic.AddListener(new DiagnosticToConsole()); var msgConf = DatabaseConfiguration.Common.ObjectClass(typeof(MessageModel)); msgConf.CascadeOnActivate(true); msgConf.CascadeOnDelete(true); msgConf.Indexed(true); msgConf.ObjectField("f_TimeStamp").Indexed(true); #else DatabaseConfiguration = Db4oFactory.Configure(); DatabaseConfiguration.AllowVersionUpdates(true); DatabaseConfiguration.ObjectClass(typeof(MessageModel)). ObjectField("f_TimeStamp").Indexed(true); #endif } string GetDatabaseFile() { return String.Format("{0}.db4o", GetBufferPath()); } void OpenDatabase() { IsEmptyDatabase = !File.Exists(DatabaseFile); #if DB4O_8_0 Database = Db4oEmbedded.OpenFile(DatabaseConfiguration, DatabaseFile); #else Database = Db4oFactory.OpenFile(DatabaseConfiguration, DatabaseFile); #endif } void CloseDatabase() { if (Database.Ext().IsClosed()) { return; } Flush(); FlushIndex(); Database.Close(); Database.Dispose(); } void FixDatabase(Exception ex) { try { CloseDatabase(); } catch { } // do some sanity checks before we assume the database is // really broken if (!File.Exists(DatabaseFile)) { throw new FileNotFoundException(DatabaseFile); } try { using (File.OpenWrite(DatabaseFile)); } catch { throw; } var timestamp = DateTime.Now.ToString("s"); timestamp = timestamp.Replace("T", "_").Replace(":", "_"); var brokenDbFile = String.Format("{0}_{1}_broken", DatabaseFile, timestamp); var brokenLogFile = String.Format("{0}.log", brokenDbFile); File.WriteAllText(brokenLogFile, ex.ToString()); #if LOG4NET Logger.DebugFormat("FixDatabase(): moving broken database " + "from: {0} to: {1}", DatabaseFile, brokenDbFile); #endif File.Move(DatabaseFile, brokenDbFile); ConfigureDatabase(); } void DefragDatabase() { if (!File.Exists(DatabaseFile)) { return; } DateTime start = DateTime.UtcNow, stop; var backupFile = String.Format( "{0}.bak_{1}.{2}", DatabaseFile, Db4oVersion.Major, Db4oVersion.Minor ); var defragConfig = new DefragmentConfig( DatabaseFile, backupFile ); defragConfig.ForceBackupDelete(true); Defragment.Defrag(defragConfig); stop = DateTime.UtcNow; #if LOG4NET Logger.Debug( String.Format( "DefragDatabase(): defrag took: {0:0.0} ms", (stop - start).TotalMilliseconds ) ); #endif } MessageModel GetMessage(MessageModel dbMsg) { Database.Activate(dbMsg, 10); var msg = new MessageModel(dbMsg); Database.Deactivate(dbMsg, 10); return msg; } MessageModel GetMessage(Int64 dbId) { var dbMsg = (MessageModel) Database.Ext().GetByID(dbId); return GetMessage(dbMsg); } void InitIndex() { if (f_Index != null) { return; } if (IsEmptyDatabase) { #if LOG4NET Logger.Debug("InitIndex(): Creating initial index..."); #endif f_Index = new List(MaxCapacity); return; } var index = FetchIndex(); if (index == null) { #if LOG4NET Logger.Info("InitIndex(): No index found, building..."); #endif RebuildIndex(); return; } f_Index = index; } List FetchIndex() { DateTime start = DateTime.UtcNow, stop; var indexes = Database.Query>(); if (indexes.Count == 0) { return null; } if (indexes.Count > 1) { #if LOG4NET Logger.Warn( "FetchIndex(): found multiple indexes, dropping them..." ); #endif // we can't deal with multiple indexes, so drop them all foreach (var idx in indexes) { Database.Delete(idx); } Database.Commit(); return null; } var index = indexes[0]; Database.Activate(index, 10); var msgCount = Database.Query().Count; if (index.Count != msgCount) { #if LOG4NET Logger.Warn( String.Format( "FetchIndex(): index out of sync! index count: {0} " + "vs message count: {1}", index.Count, msgCount ) ); #endif Database.Delete(index); return null; } stop = DateTime.UtcNow; #if LOG4NET Logger.Debug( String.Format( "FetchIndex(): query, activation and validation took: " + "{0:0.00} ms, items: {1}", (stop - start).TotalMilliseconds, index.Count ) ); #endif return index; } List BuildIndex() { DateTime start = DateTime.UtcNow, stop; var query = Database.Query(); query.Constrain(typeof(MessageModel)); query.Descend("f_TimeStamp").OrderAscending(); var dbIndex = query.Execute(); stop = DateTime.UtcNow; #if LOG4NET Logger.Debug( String.Format( "BuildIndex(): query took: {0:0.00} ms, items: {1}", (stop - start).TotalMilliseconds, dbIndex.Count ) ); #endif start = DateTime.UtcNow; var indexCapacity = Math.Max(dbIndex.Count, MaxCapacity); var index = new List(indexCapacity); int purgeCounter = 0; int purgeInterval = 1000; foreach (var dbMsg in dbIndex) { var dbId = Database.Ext().GetID(dbMsg); index.Add(dbId); if (purgeCounter++ >= purgeInterval) { purgeCounter = 0; if (AggressiveGC) { Database.Ext().Purge(); } } } Database.Ext().Purge(); stop = DateTime.UtcNow; #if LOG4NET Logger.Debug( String.Format( "BuildIndex(): building index took: {0:0.00} ms", (stop - start).TotalMilliseconds ) ); #endif return index; } void RebuildIndex() { var indexes = Database.Query>(); if (indexes.Count > 0) { // we can't deal with multiple indexes, so drop them all foreach (var idx in indexes) { Database.Delete(idx); } Database.Commit(); } f_Index = BuildIndex(); FlushIndex(); } void ResetIndex() { f_Index = null; } void FlushIndex() { if (f_Index == null || f_Index.Count == 0) { // don't waste our time return; } DateTime start = DateTime.UtcNow, stop; Database.Store(f_Index); Database.Commit(); stop = DateTime.UtcNow; #if LOG4NET && MSGBUF_DEBUG Logger.Debug( String.Format( "FlushIndex(): flushing index with {0} items took: {1} ms", f_Index.Count, (stop - start).TotalMilliseconds ) ); #endif } public override void Flush() { var counter = FlushCounter; if (counter == 0) { // nothing to flush return; } DateTime start = DateTime.UtcNow, stop; FlushCounter = 0; Database.Commit(); stop = DateTime.UtcNow; #if LOG4NET && MSGBUF_DEBUG Logger.Debug( String.Format( "Flush(): flushing {0} items took: {1} ms", counter, (stop - start).TotalMilliseconds ) ); #endif } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } [Flags] public enum Db4oMessageBufferOptimizationTypes : ushort { None = ushort.MinValue, Defrag = 0x1, Index = 0x2, All = ushort.MaxValue } } smuxi-1.1/src/Engine/MessageBuffers/ListMessageBuffer.cs0000644000175000017500000000405612726351313024124 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2011, 2015 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine { [Serializable] public class ListMessageBuffer : List, IMessageBuffer { int f_MaxCapacity; public DateTime LastSeenMessage { get; set; } public DateTime LastSeenHighlight { get; set; } public int MaxCapacity { get { return f_MaxCapacity; } set { f_MaxCapacity = value; Capacity = f_MaxCapacity; } } public ListMessageBuffer() { } public new void Add(MessageModel item) { if (MaxCapacity > 0 && Count >= MaxCapacity) { RemoveAt(0); } base.Add(item); } IList IMessageBuffer.GetRange(int offset, int limit) { // clamp limit to count if (offset + limit > Count) { limit = Count - offset; } return base.GetRange(offset, limit); } public void Flush() { // NOOP } public void Dispose() { // NOOP } } } smuxi-1.1/src/Engine/MessageBuffers/MessageBufferBase.cs0000644000175000017500000001117312726351313024061 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011, 2012, 2014-2015 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Collections; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public abstract class MessageBufferBase : IMessageBuffer { protected string Protocol { get; set; } protected string NetworkID { get; set; } protected string ChatID { get; set; } protected string SessionUsername { get; set; } public int MaxCapacity { get; set; } public virtual DateTime LastSeenMessage { get; set; } public virtual DateTime LastSeenHighlight { get; set; } public bool IsReadOnly { get { return false; } } protected MessageBufferBase() { } protected MessageBufferBase(string sessionUsername, string protocol, string networkId, string chatId) { if (sessionUsername == null) { throw new ArgumentNullException("sessionUsername"); } if (protocol == null) { throw new ArgumentNullException("protocol"); } if (networkId == null) { throw new ArgumentNullException("networkId"); } if (chatId == null) { throw new ArgumentNullException("chatId"); } SessionUsername = sessionUsername; Protocol = protocol; NetworkID = networkId; ChatID = chatId; } public virtual IList GetRange(int offset, int limit) { if (offset < 0) { throw new ArgumentException( "offset must be greater than or equal to 0.", "offset" ); } var bufferCount = Count; var rangeCount = Math.Min(bufferCount, limit); var range = new List(rangeCount); for (int i = offset; i < offset + limit && i < bufferCount; i++) { range.Add(this[i]); } return range; } public virtual void CopyTo(MessageModel[] array, int arrayIndex) { if (array == null) { throw new ArgumentNullException("array"); } int i = arrayIndex; foreach (var msg in this) { array[i++] = msg; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } protected string GetBufferPath() { var path = Platform.GetBuffersPath(SessionUsername); var protocol = Protocol.ToLower(); var network = NetworkID.ToLower(); path = Path.Combine(path, protocol); if (network != protocol) { path = Path.Combine(path, network); } path = IOSecurity.GetFilteredPath(path); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var chatId = IOSecurity.GetFilteredFileName(ChatID.ToLower()); return Path.Combine(path, chatId); } public abstract int Count { get; } public abstract MessageModel this[int index] { get; set; } public abstract void Add(MessageModel item); public abstract void Clear(); public abstract bool Contains(MessageModel item); public abstract bool Remove(MessageModel item); public abstract IEnumerator GetEnumerator(); public abstract int IndexOf(MessageModel item); public abstract void Insert(int index, MessageModel item); public abstract void RemoveAt(int index); public abstract void Flush(); public abstract void Dispose(); } } smuxi-1.1/src/Engine/MessageBuffers/IMessageBuffer.cs0000644000175000017500000000240612726351313023376 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2012, 2015 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine { public interface IMessageBuffer : IList, IDisposable { IList GetRange(int offset, int limit); void Flush(); int MaxCapacity { get; set; } DateTime LastSeenMessage { get; set; } DateTime LastSeenHighlight { get; set; } } } smuxi-1.1/src/Engine/MessageBuffers/MessageBufferPersistencyType.cs0000644000175000017500000000203612726351313026357 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public enum MessageBufferPersistencyType { Volatile, Persistent, PersistentDb4o, PersistentSqlite } } smuxi-1.1/src/Engine/Hooks/0000775000175000017500000000000014011526501016372 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Hooks/Environments/0000775000175000017500000000000014011526501021061 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Hooks/Environments/ProtocolManagerHookEnvironment.cs0000644000175000017500000000327712726351313027571 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class ProtocolManagerHookEnvironment : HookEnvironment { public ProtocolManagerHookEnvironment(IProtocolManager protocolManager) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } this["PROTOCOL_MANAGER_PROTOCOL"] = protocolManager.Protocol; this["PROTOCOL_MANAGER_NETWORK"] = protocolManager.NetworkID; this["PROTOCOL_MANAGER_HOST"] = protocolManager.Host; this["PROTOCOL_MANAGER_PORT"] = protocolManager.Port.ToString(); if (protocolManager.Me != null) { this["PROTOCOL_MANAGER_ME_ID"] = protocolManager.Me.ID; } this["PROTOCOL_PRESENCE_STATUS"] = protocolManager.PresenceStatus.ToString(); } } } smuxi-1.1/src/Engine/Hooks/Environments/ChatHookEnvironment.cs0000644000175000017500000000241412257043746025353 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class ChatHookEnvironment : HookEnvironment { public ChatHookEnvironment(ChatModel chat) { if (chat == null) { throw new ArgumentNullException("chat"); } this["CHAT_ID"] = chat.ID; this["CHAT_NAME"] = chat.Name; this["CHAT_TYPE"] = chat.ChatType.ToString(); } } } smuxi-1.1/src/Engine/Hooks/Environments/CommandHookEnvironment.cs0000644000175000017500000000243112726351313026042 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class CommandHookEnvironment : HookEnvironment { public CommandHookEnvironment(CommandModel cmd) { if (cmd == null) { throw new ArgumentNullException("cmd"); } this["CMD"] = cmd.Command; this["CMD_PARAMETER"] = cmd.Parameter; this["CMD_CHARACTER"] = cmd.CommandCharacter; } } } smuxi-1.1/src/Engine/Hooks/Environments/HookEnvironment.cs0000644000175000017500000000205612257043746024555 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine { public class HookEnvironment : Dictionary { public HookEnvironment() { } } } smuxi-1.1/src/Engine/Hooks/Environments/MessageHookEnvironment.cs0000644000175000017500000000431512726351313026053 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class MessageHookEnvironment : HookEnvironment { static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0); public MessageHookEnvironment(MessageModel msg, string sender, string receiver) { if (msg == null) { throw new ArgumentNullException("msg"); } if (sender == null) { throw new ArgumentNullException("sender"); } if (receiver == null) { throw new ArgumentNullException("receiver"); } var nick = msg.GetNick(); var message = msg.ToString(); if (String.IsNullOrEmpty(nick)) { this["MSG"] = message; } else { this["MSG"] = message.Substring(nick.Length + 3); } this["MSG_TYPE"] = msg.MessageType.ToString(); var timestamp = (Int64) (msg .TimeStamp - UnixEpoch).TotalSeconds; this["MSG_TIMESTAMP_UNIX"] = timestamp.ToString(); this["MSG_TIMESTAMP_ISO_UTC"] = msg.TimeStamp.ToString("u").Replace('Z', ' ').TrimEnd(); this["MSG_TIMESTAMP_ISO_LOCAL"] = msg.TimeStamp.ToLocalTime().ToString("u").Replace('Z', ' ').TrimEnd(); this["SENDER"] = sender; this["RECEIVER"] = receiver; } } } smuxi-1.1/src/Engine/Hooks/Environments/PersonHookEnvironment.cs0000644000175000017500000000305412726351313025734 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2014 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class PersonHookEnvironment : HookEnvironment { public PersonHookEnvironment(PersonModel person) : this(null, person) { } public PersonHookEnvironment(string prefix, PersonModel person) { if (person == null) { throw new ArgumentNullException("person"); } this[prefix + "PERSON_ID"] = person.ID; this[prefix + "PERSON_IDENTITY_NAME"] = person.IdentityName; this[prefix + "PERSON_NETWORK_ID"] = person.NetworkID; this[prefix + "PERSON_NETWORK_PROTOCOL"] = person.NetworkProtocol; } } } smuxi-1.1/src/Engine/Hooks/Commands/0000775000175000017500000000000014011526501020133 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Hooks/Commands/HookCommand.cs0000644000175000017500000000214512257043746022700 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public abstract class HookCommand { public string CommandName { get; protected set; } protected HookCommand() { } public abstract void Run(string commandLine); } } smuxi-1.1/src/Engine/Hooks/Commands/ProtocolManagerHookCommand.cs0000644000175000017500000000345612726351313025714 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class ProtocolManagerHookCommand : HookCommand { IProtocolManager ProtocolManager { get; set; } ChatModel Chat { get; set; } string CommandCharacter { get; set; } public ProtocolManagerHookCommand(IProtocolManager protocolManager, ChatModel chat, string commandCharacter) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } ProtocolManager = protocolManager; Chat = chat; CommandCharacter = commandCharacter; CommandName = "ProtocolManager.Command"; } public override void Run(string commandLine) { var cmd = new CommandModel(null, Chat, CommandCharacter, commandLine); ProtocolManager.Command(cmd); } } } smuxi-1.1/src/Engine/Hooks/Commands/SessionHookCommand.cs0000644000175000017500000000327412257043746024250 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class SessionHookCommand : HookCommand { Session Session { get; set; } ChatModel Chat { get; set; } string CommandCharacter { get; set; } public SessionHookCommand(Session session, ChatModel chat, string commandCharacter) { if (session == null) { throw new ArgumentNullException("session"); } Session = session; Chat = chat; CommandCharacter = commandCharacter; CommandName = "Session.Command"; } public override void Run(string commandLine) { var cmd = new CommandModel(null, Chat, CommandCharacter, commandLine); Session.Command(cmd); } } } smuxi-1.1/src/Engine/Hooks/HookRunner.cs0000644000175000017500000001430512726351313021024 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Linq; using System.Text; using System.Collections.Generic; using SysDiag = System.Diagnostics; namespace Smuxi.Engine { public class HookRunner { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public Dictionary EnvironmentVariables { get; private set; } public List Environments { get; private set; } public List Commands { get; set; } public List Arguments { get; set; } List Hooks { get; set; } string[] PathElements { get; set; } string StateBasePath { get; set; } public bool HasHooks { get { return Hooks.Count > 0; } } public HookRunner(params string[] path) { if (path == null) { throw new ArgumentNullException("path"); } PathElements = path; EnvironmentVariables = new Dictionary(); Hooks = new List(); Environments = new List(); Commands = new List(); } public void Init() { var appData = Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ); StateBasePath = Path.Combine(appData, "smuxi"); StateBasePath = Path.Combine(StateBasePath, "hook-state"); foreach (var path in PathElements) { StateBasePath = Path.Combine(StateBasePath, path); } var hookPath = Path.Combine(appData, "smuxi"); hookPath = Path.Combine(hookPath, "hooks"); foreach (var path in PathElements) { hookPath = Path.Combine(hookPath, path); } if (!Directory.Exists(hookPath)) { return; } foreach (var file in Directory.GetFiles(hookPath).OrderBy(x => x)) { try { File.OpenRead(file).Close(); } catch (Exception ex) { #if LOG4NET Logger.Error("Init(): error opening " + file, ex); #endif continue; } Hooks.Add(file); } if (!HasHooks) { return; } var env = EnvironmentVariables; if (Engine.Version != null) { env.Add("ENGINE_VERSION", Engine.Version.ToString()); } foreach (var environment in Environments) { foreach (var entry in environment) { env.Add(entry.Key, entry.Value); } } } public void Run() { if (!HasHooks) { return; } foreach (var hook in Hooks) { RunHook(hook); } } void RunHook(string hookPath) { var hookFilename = Path.GetFileName(hookPath); var statePath = Path.Combine(StateBasePath, hookFilename); if (!Directory.Exists(statePath)) { Directory.CreateDirectory(statePath); } string hookArgs = null; if (Arguments != null && Arguments.Count > 0) { var args = new StringBuilder(256); foreach (var arg in Arguments) { // quote because of potential spaces and retarded Process API args.AppendFormat(@"""{0}"" ", arg); } // remove trailing space args.Length--; hookArgs = args.ToString(); } var startInfo = new SysDiag.ProcessStartInfo() { FileName = hookPath, Arguments = hookArgs, WorkingDirectory = statePath, UseShellExecute = false, RedirectStandardOutput = true }; // HACK: retarded API doesn't allow us to set the dictionary, // thus we have to copy all key/values into it var startEnv = startInfo.EnvironmentVariables; foreach (var entry in EnvironmentVariables) { startEnv.Add(String.Concat("SMUXI_", entry.Key), entry.Value); } #if LOG4NET Logger.Debug("Run(): executing " + hookPath); #endif var process = SysDiag.Process.Start(startInfo); while (!process.StandardOutput.EndOfStream) { var line = process.StandardOutput.ReadLine(); if (String.IsNullOrEmpty(line)) { continue; } try { // find matching hook command foreach (var cmd in Commands) { if (!line.StartsWith(cmd.CommandName + " ")) { continue; } var cmdLine = line.Substring(cmd.CommandName.Length + 1); cmd.Run(cmdLine); break; } } catch (Exception ex) { #if LOG4NET Logger.Error("Run(): error processing " + line, ex); #endif } } process.WaitForExit(); } } } smuxi-1.1/src/Engine/Messages/0000775000175000017500000000000014011526501017056 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Messages/MessageBuilder.cs0000664000175000017500000010563714011467170022322 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2017 Mirco Bauer // Copyright (c) 2013 Oliver Schneider // Copyright (c) 2016 Andres G. Aragoneses // // Full GPL License: // // 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 using System; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; using System.IO; using System.Xml; using System.Web; using Smuxi.Common; namespace Smuxi.Engine { public class MessageBuilder { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif static readonly string LibraryTextDomain = "smuxi-engine"; MessageModel Message { get; set; } public PersonModel Me { get; set; } public MessageBuilderSettings Settings { get; set; } public MessageType MessageType { get { return Message.MessageType; } set { Message.MessageType = value; } } public DateTime TimeStamp { get { return Message.TimeStamp; } set { Message.TimeStamp = value; } } public string ID { get { return Message.ID; } set { Message.ID = value; } } public bool IsEmpty { get { return Message.IsEmpty; } } public MessageBuilder() { Message = new MessageModel(); Settings = new MessageBuilderSettings(); } public MessageModel ToMessage() { Message.Compact(); return Message; } public virtual void ApplyConfig(UserConfig userConfig) { if (userConfig == null) { throw new ArgumentNullException("userConfig"); } Settings.ApplyConfig(userConfig); } public virtual MessageBuilder Append(MessagePartModel msgPart) { if (msgPart == null) { throw new ArgumentNullException("msgPart"); } Message.MessageParts.Add(msgPart); return this; } public virtual MessageBuilder Append(IEnumerable msgParts) { if (msgParts == null) { throw new ArgumentNullException("msgParts"); } foreach (var part in msgParts) { Append(part); } return this; } public virtual MessageBuilder Append(MessageModel msg) { if (msg == null) { throw new ArgumentNullException("msg"); } foreach (var part in msg.MessageParts) { Append(part); } return this; } public virtual TextMessagePartModel CreateText(TextMessagePartModel text) { if (text == null) { throw new ArgumentNullException("text"); } return new TextMessagePartModel(text); } public virtual TextMessagePartModel CreateText(string text, params object[] args) { if (text == null) { throw new ArgumentNullException("text"); } if (args != null && args.Length > 0) { text = String.Format(text, args); } return new TextMessagePartModel(text); } public virtual TextMessagePartModel CreateText() { return new TextMessagePartModel(); } public virtual MessageBuilder AppendText(TextMessagePartModel textPart) { return Append(textPart); } public MessageBuilder AppendText(IEnumerable text) { if (text == null) { throw new ArgumentNullException("text"); } foreach (var textPart in text) { AppendText(textPart); } return this; } public virtual MessageBuilder AppendText(string text, params object[] args) { text = text ?? String.Empty; if (text.Length == 0) { return this; } var textPart = CreateText(text, args); return AppendText(textPart); } public virtual TextMessagePartModel CreateSpace() { return CreateText(" "); } public MessageBuilder AppendSpace() { return AppendText(CreateSpace()); } public virtual TextMessagePartModel CreateEventPrefix() { return CreateText("-!- "); } public virtual MessageBuilder AppendEventPrefix() { MessageType = MessageType.Event; return AppendText(CreateEventPrefix()); } public virtual TextMessagePartModel CreateActionPrefix() { return CreateText(" * "); } public virtual MessageBuilder AppendActionPrefix() { return AppendText(CreateActionPrefix()); } public virtual UrlMessagePartModel CreateUrl(string url, string text) { if (url == null) { throw new ArgumentNullException("url"); } return new UrlMessagePartModel(url, text); } public UrlMessagePartModel CreateUrl(string url) { return CreateUrl(url, null); } public virtual MessageBuilder AppendUrl(string url, string text) { return Append(CreateUrl(url, text)); } public MessageBuilder AppendUrl(string url) { return AppendUrl(url, null); } public virtual IList CreateHeader(string text, params object[] args) { if (text == null) { throw new ArgumentNullException("text"); } var prefix = CreateText("["); var suffix = CreateText("]"); var headerText = CreateText(text, args); headerText.Bold = true; var header = new List(3); header.Add(prefix); header.Add(headerText); header.Add(suffix); return header; } public virtual MessageBuilder AppendHeader(string text, params object[] args) { text = text ?? String.Empty; return AppendText(CreateHeader(text, args)); } public virtual MessageBuilder AppendMessage(string msg) { return Append(ParsePatterns(CreateText(msg))); } public MessageBuilder AppendMessage(ContactModel sender, string msg) { if (sender != null) { AppendSenderPrefix(sender); } return AppendMessage(msg); } public virtual MessageBuilder AppendWarningText(string errorText, params object[] args) { var text = CreateText(errorText, args); text.Bold = true; return AppendText(text); } public virtual MessageBuilder AppendErrorText(string errorText, params object[] args) { var text = CreateText(errorText, args); text.ForegroundColor = new TextColor(255, 0, 0); text.Bold = true; text.IsHighlight = true; return AppendText(text); } public virtual TextMessagePartModel CreateIdendityName(ContactModel identity) { if (identity == null) { throw new ArgumentNullException("identity"); } if (!Settings.NickColors) { return CreateText(identity.IdentityName); } var identityName = CreateText(identity.IdentityNameColored); // don't clutter with the bg color identityName.BackgroundColor = TextColor.None; return identityName; } public virtual MessageBuilder AppendIdendityName(ContactModel identity, bool isHighlight) { if (identity == null) { throw new ArgumentNullException("identity"); } var identityName = CreateIdendityName(identity); identityName.IsHighlight = isHighlight; return AppendText(identityName); } public MessageBuilder AppendIdendityName(ContactModel identity) { return AppendIdendityName(identity, false); } public virtual IList CreateNick(ContactModel contact) { if (contact == null) { throw new ArgumentNullException("contact"); } var prefix = CreateText("<"); var suffix = CreateText(">"); var nick = CreateIdendityName(contact); if (Settings.NickColors) { // using bg colors for the nick texts are too intrusive, thus // map the bg color to the fg color of the surrounding tags var senderBgColor = contact.IdentityNameColored.BackgroundColor; if (senderBgColor != TextColor.None) { prefix.ForegroundColor = senderBgColor; suffix.ForegroundColor = senderBgColor; nick.BackgroundColor = TextColor.None; } } var senderMsg = new List(3); senderMsg.Add(prefix); senderMsg.Add(nick); senderMsg.Add(suffix); return senderMsg; } public virtual MessageBuilder AppendNick(ContactModel contact) { if (contact == null) { throw new ArgumentNullException("contact"); } return AppendText(CreateNick(contact)); } public virtual IList CreateSenderPrefix(ContactModel contact) { if (contact == null) { throw new ArgumentNullException("contact"); } var sender = CreateNick(contact); sender.Add(CreateSpace()); return sender; } public virtual MessageBuilder AppendSenderPrefix(ContactModel contact, bool isHighlight) { if (contact == null) { throw new ArgumentNullException("sender"); } var senderMsg = CreateSenderPrefix(contact); /* // 1st element is prefix // 3rdt element is prefix if (isHighlight) { // HACK: reset fg color of prefix and suffix so highlight color // will be applied instead senderMsg[0].ForegroundColor = TextColor.None; senderMsg[2].ForegroundColor = TextColor.None; } */ // 2nd element is the nick senderMsg[1].IsHighlight = isHighlight; foreach (var senderPart in senderMsg) { AppendText(senderPart); } return this; } public MessageBuilder AppendSenderPrefix(ContactModel sender) { return AppendSenderPrefix(sender, false); } public bool ContainsHighlight() { return ContainsHighlight(Message.ToString()); } public virtual bool ContainsHighlight(string text) { Regex regex; if (Me != null) { // First check to see if our current nick is in there. regex = new Regex( String.Format( "(^|\\W){0}($|\\W)", Regex.Escape(Me.IdentityName) ), RegexOptions.IgnoreCase ); if (regex.Match(text).Success) { return true; } } // go through the user's custom highlight words and check for them. foreach (string highLightWord in Settings.HighlightWords) { if (String.IsNullOrEmpty(highLightWord)) { continue; } if (highLightWord.StartsWith("/") && highLightWord.EndsWith("/")) { // This is a regex, so just build a regex out of the string. regex = new Regex( highLightWord.Substring(1, highLightWord.Length - 2), RegexOptions.IgnoreCase ); } else { // Plain text - make a regex that matches the word as long as it's separated properly. string regex_string = String.Format( "(^|\\W){0}($|\\W)", Regex.Escape(highLightWord) ); regex = new Regex(regex_string, RegexOptions.IgnoreCase); } if (regex.Match(text).Success) { return true; } } return false; } public virtual void MarkHighlights() { bool containsHighlight = false; foreach (var part in Message.MessageParts) { if (!(part is TextMessagePartModel)) { continue; } var textPart = (TextMessagePartModel) part; if (String.IsNullOrEmpty(textPart.Text)) { // URLs without a link name don't have text continue; } if (ContainsHighlight(textPart.Text)) { containsHighlight = true; } } if (!containsHighlight) { // nothing to do return; } MarkAsHighlight(); } public virtual void MarkHighlights(PersonModel sender) { if (sender != Me) { MarkHighlights(); } } public virtual void MarkAsHighlight() { // colorize the whole message foreach (MessagePartModel msgPart in Message.MessageParts) { if (!(msgPart is TextMessagePartModel)) { continue; } TextMessagePartModel textMsg = (TextMessagePartModel) msgPart; if (textMsg.ForegroundColor != null && textMsg.ForegroundColor != TextColor.None) { // HACK: don't overwrite colors as that would replace // nick-colors for example continue; } // HACK: we have to mark all parts as highlight else // ClearHighlights() has no chance to properly undo all // highlights textMsg.IsHighlight = true; textMsg.ForegroundColor = Settings.HighlightColor; } } public virtual void ClearHighlights() { foreach (var msgPart in Message.MessageParts) { if (!msgPart.IsHighlight || !(msgPart is TextMessagePartModel)) { continue; } var textMsg = (TextMessagePartModel) msgPart; textMsg.IsHighlight = false; textMsg.ForegroundColor = null; } return; } void ParseStyle(XmlNode style, TextMessagePartModel submodel) { if (style == null) return; var properties = style.InnerText.Split(';'); foreach (string property in properties) { var colonpos = property.IndexOf(':'); if (colonpos == -1) continue; string name = property.Substring(0, colonpos).Trim(); string value = property.Substring(colonpos+1).Trim(); switch (name) { case "background": value = value.Split(' ')[0]; submodel.BackgroundColor = TextColor.Parse(value); break; case "background-color": submodel.BackgroundColor = TextColor.Parse(value); break; case "color": submodel.ForegroundColor = TextColor.Parse(value); break; case "font-style": if (value == "normal") { submodel.Italic = false; } else if (value == "inherit") { } else { submodel.Italic = true; } break; case "font-weight": if (value == "normal") { submodel.Bold = false; } else if (value == "inherit") { } else { submodel.Bold = true; } break; case "text-decoration": { foreach (string val in value.Split(' ')) { if (val == "underline") { submodel.Underline = true; } } } break; case "font-family": case "font-size": case "text-align": case "margin-left": case "margin-right": default: // ignore formatting break; } } } void ParseHtml(XmlNode node, TextMessagePartModel model) { TextMessagePartModel submodel; string nodetype = node.Name.ToLower(); if (model is UrlMessagePartModel) { submodel = new UrlMessagePartModel(model); } else if (nodetype == "a") { submodel = new UrlMessagePartModel(model); (submodel as UrlMessagePartModel).Url = node.Attributes.GetNamedItem("href").Value; } else { submodel = new TextMessagePartModel(model); } switch (nodetype) { case "b": case "strong": submodel.Bold = true; break; case "i": case "em": submodel.Italic = true; break; case "u": submodel.Underline = true; break; default: break; } if (node.Attributes != null) { ParseStyle(node.Attributes.GetNamedItem("style"), submodel); } if (node.HasChildNodes) { foreach (XmlNode child in node.ChildNodes) { // clone this model TextMessagePartModel nextmodel; if (submodel is UrlMessagePartModel) { nextmodel = new UrlMessagePartModel(submodel); } else { nextmodel = new TextMessagePartModel(submodel); } ParseHtml(child, nextmodel); } } else { // final node if (nodetype == "br") { AppendText("\n"); } else if (nodetype == "img") { AppendUrl(node.Attributes.GetNamedItem("src").Value, "[image placeholder - UNIMPLEMENTED]"); } else { model.Text = HttpUtility.HtmlDecode(node.Value); AppendText(model); } } } public virtual MessageBuilder AppendHtmlMessage(string html) { html = NormalizeNewlines(html); XmlDocument doc = new XmlDocument(); try { // wrap in div to prevent messages beginning with text from failing "to be xml" doc.Load(new StringReader(""+html+"")); } catch (XmlException ex) { #if LOG4NET f_Logger.Error("AppendHtmlMessage(): error parsing html: " + html, ex); #endif AppendText(html); return this; } ParseHtml(doc, new TextMessagePartModel()); return this; } public virtual IList CreateFormat(string format, params object[] objs) { if (format == null) { throw new ArgumentNullException("format"); } if (objs == null) { throw new ArgumentNullException("objs"); } var parts = new List(); var assembling = new StringBuilder(format.Length); var inPlaceholder = false; for (int i = 0; i < format.Length; ++i) { char c = format[i]; char peek = (i < format.Length-1) ? format[i+1] : '\0'; if (c == '{') { if (peek == '{') { // escaped brace assembling.Append('{'); // skip the second brace too ++i; } else if (!inPlaceholder) { // we're parsing a placeholder here // first, append the currently assembled string parts.Add(CreateText(assembling.ToString())); // we will now assemble the placeholder text assembling.Length = 0; inPlaceholder = true; } else { // nested formatting?! throw new System.FormatException("nested formatting is forbidden"); } } else if (c == '}') { if (peek == '}') { // escaped brace assembling.Append('}'); // skip the second brace too ++i; } else if (inPlaceholder) { // substitute the placeholder var placeholderText = assembling.ToString(); uint placeholderInt; if (!uint.TryParse(placeholderText, out placeholderInt)) { // that's not even an integer... throw new System.FormatException("format placeholder must be an integer >= 0 in braces"); } if (placeholderInt >= objs.Length) { // placeholder out of bounds throw new System.FormatException("format placeholder number is greater than the array"); } var placeMe = objs[placeholderInt]; if (placeMe == null) { throw new System.FormatException("null object in objs array"); } else if (placeMe is String) { // append strings as-is parts.Add(CreateText((String) placeMe)); } else if (placeMe is ContactModel) { // append contacts as their identity names parts.Add(CreateIdendityName((ContactModel) placeMe)); } else if (placeMe is MessagePartModel) { // append the part verbatim parts.Add((MessagePartModel) placeMe); } else if (placeMe is MessageModel) { // append all parts of the message foreach (var part in ((MessageModel) placeMe).MessageParts) { parts.Add(part); } } else if (placeMe.GetType().IsValueType) { parts.Add(CreateText(placeMe.ToString())); } else { // no idea how to format this throw new System.FormatException("unknown object type to format: " + placeMe.GetType().ToString()); } // we are done with this placeholder assembling.Length = 0; inPlaceholder = false; } else { // closing brace without opening brace throw new System.FormatException("format placeholder closing brace without corresponding opening brace"); } } else { // simply append assembling.Append(c); } } // done parsing if (inPlaceholder) { // unterminated brace throw new System.FormatException("format placeholder opening brace without corresponding closing brace"); } if (assembling.Length > 0) { // bit of text at the end parts.Add(CreateText(assembling.ToString())); } return parts; } public virtual MessageBuilder AppendFormat(string format, params object[] objs) { foreach (var part in CreateFormat(format, objs)) { Append(part); } return this; } public virtual MessageBuilder AppendChatState(ContactModel contact, MessageType state) { switch (state) { case MessageType.ChatStateComposing: if (Message.IsEmpty) { AppendActionPrefix(); AppendFormat(_("{0} is typing..."), contact); } break; case MessageType.ChatStatePaused: if (Message.IsEmpty) { AppendActionPrefix(); AppendFormat(_("{0} has stopped typing..."), contact); } break; case MessageType.ChatStateReset: break; default: throw new ArgumentException("state is not a ChatState", "state"); } MessageType = state; return this; } protected static string NormalizeNewlines(string text) { if (text == null) { throw new ArgumentNullException("text"); } if (!text.Contains("\n")) { // nothing to normalize return text; } var normalized = new StringBuilder(text.Length); text = text.Replace("\r\n", "\n"); foreach (var textPart in text.Split('\n')) { var trimmed = textPart.TrimEnd(' '); if (trimmed.Length == 0) { // skip empty lines continue; } normalized.AppendFormat("{0} ", trimmed); } // remove trailing space if (normalized.Length > 0) { normalized.Length--; } return normalized.ToString(); } public virtual MessageBuilder AppendPresenceState(ContactModel contact, MessageType state) { switch (state) { case MessageType.PresenceStateAway: if (Message.IsEmpty) { AppendActionPrefix(); AppendFormat(_("{0} is away"), contact); } break; case MessageType.PresenceStateOffline: if (Message.IsEmpty) { AppendActionPrefix(); AppendFormat(_("{0} is offline"), contact); } break; case MessageType.PresenceStateOnline: if (Message.IsEmpty) { AppendActionPrefix(); AppendFormat(_("{0} is online"), contact); } break; default: throw new ArgumentException("state is not a PresenceState", "state"); } MessageType = state; return this; } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } public static IList ParsePatterns(TextMessagePartModel textPart, List patterns) { if (textPart == null) { throw new ArgumentNullException("textPart"); } if (patterns == null) { throw new ArgumentNullException("patterns"); } var msgParts = new List(); if (patterns.Count == 0) { // all patterns have been tried -> this text is PURE text msgParts.Add(textPart); return msgParts; } var remainingPatterns = new List(patterns); var pattern = remainingPatterns.First(); remainingPatterns.Remove(pattern); var match = pattern.MessagePartPattern.Match(textPart.Text); if (!match.Success) { // no matches in this MessagePart, try other smartlinks return ParsePatterns(textPart, remainingPatterns); } int lastindex = 0; do { var startDelimiterLength = 0; var regexDelimiterForStartOfPatternValue = match.Groups[MessageBuilderSettings.StartDelimiterGroupName]; if (regexDelimiterForStartOfPatternValue != null) { startDelimiterLength = regexDelimiterForStartOfPatternValue.Value.Length; } var endDelimiterLength = 0; var regexDelimiterForEndOfPatternValue = match.Groups[MessageBuilderSettings.EndDelimiterGroupName]; if (regexDelimiterForEndOfPatternValue != null) { endDelimiterLength = regexDelimiterForEndOfPatternValue.Value.Length; } var groupValues = match.Groups.Cast() // don't get the delimiter because it only determines // the start or end of pattern, which is not part of the pattern .Where(g => g != regexDelimiterForStartOfPatternValue && g != regexDelimiterForEndOfPatternValue) .Select(g => g.Value).ToArray(); string url; if (String.IsNullOrEmpty(pattern.LinkFormat)) { url = match.Value; url = url.Substring(0 + startDelimiterLength, url.Length - (startDelimiterLength - endDelimiterLength)); } else { url = String.Format(pattern.LinkFormat, groupValues); } string text; if (String.IsNullOrEmpty(pattern.TextFormat)) { text = match.Value; } else { text = String.Format(pattern.TextFormat, groupValues); } text = text.Substring(0 + startDelimiterLength, text.Length - (startDelimiterLength + endDelimiterLength)); if (lastindex != match.Index) { // there were some non-matching-chars before the match // copy that to a TextMessagePartModel var notMatchPart = new TextMessagePartModel(textPart); // only take the proper chunk of text notMatchPart.Text = textPart.Text.Substring(lastindex, match.Index + startDelimiterLength - lastindex); // and try other patterns on this part var parts = ParsePatterns(notMatchPart, remainingPatterns); foreach (var part in parts) { msgParts.Add(part); } } MessagePartModel msgPart; if (pattern.MessagePartType == typeof(UrlMessagePartModel)) { // no need to set URL and text if they are the same text = text == url ? null : text; msgPart = new UrlMessagePartModel(url, text); } else if (pattern.MessagePartType == typeof(ImageMessagePartModel)) { msgPart = new ImageMessagePartModel(url, text); } else { msgPart = new TextMessagePartModel(text); } msgParts.Add(msgPart); lastindex = match.Index + match.Length - endDelimiterLength; match = match.NextMatch(); } while (match.Success); if (lastindex != textPart.Text.Length) { // there were some non-matching-chars after the last match // copy TextMessagePartModel var notMatchPart = new TextMessagePartModel(textPart); // only take the proper chunk of text notMatchPart.Text = textPart.Text.Substring(lastindex); // and try other smartlinks on this part var parts = ParsePatterns(notMatchPart, remainingPatterns); foreach (var part in parts) { msgParts.Add(part); } } return msgParts; } public IEnumerable ParsePatterns(TextMessagePartModel part) { return ParsePatterns(part, Settings.Patterns); } } } smuxi-1.1/src/Engine/Messages/TextMessagePartModel.cs0000644000175000017500000002141512726351313023457 0ustar00meebeymeebey00000000000000/* * $Id: Config.cs 100 2005-08-07 14:54:22Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config.cs $ * $Rev: 100 $ * $Author: meebey $ * $Date: 2005-08-07 16:54:22 +0200 (Sun, 07 Aug 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] [DataContract] public class TextMessagePartModel : MessagePartModel { private TextColor f_ForegroundColor; private TextColor f_BackgroundColor; private bool f_Underline; private bool f_Bold; private bool f_Italic; private string f_Text; [DataMember] public override string Type { get { return "Text"; } } [DataMember] public TextColor ForegroundColor { get { return f_ForegroundColor; } set { if (value == null) { value = TextColor.None; } f_ForegroundColor = value; } } [DataMember] public TextColor BackgroundColor { get { return f_BackgroundColor; } set { if (value == null) { value = TextColor.None; } f_BackgroundColor = value; } } [DataMember] public bool Underline { get { return f_Underline; } set { f_Underline = value; } } [DataMember] public bool Bold { get { return f_Bold; } set { f_Bold = value; } } [DataMember] public bool Italic { get { return f_Italic; } set { f_Italic = value; } } [DataMember] public string Text { get { return f_Text; } set { f_Text = value; } } [IgnoreDataMember] public int Length { get { if (f_Text == null) { return 0; } return f_Text.Length; } } public TextMessagePartModel() : base() { f_ForegroundColor = new TextColor(); f_BackgroundColor = new TextColor(); } public TextMessagePartModel(string text) : this(null, null, false, false, false, text, false) { } public TextMessagePartModel(string text, bool highlight) : this(null, null, false, false, false, text, highlight) { } public TextMessagePartModel(TextColor fgColor, TextColor bgColor, bool underline, bool bold, bool italic, string text, bool highlight) : base(highlight) { if (fgColor != null) { f_ForegroundColor = fgColor; } else { f_ForegroundColor = TextColor.None; } if (bgColor != null) { f_BackgroundColor = bgColor; } else { f_BackgroundColor = TextColor.None; } f_Underline = underline; f_Bold = bold; f_Italic = italic; f_Text = text; } public TextMessagePartModel(TextColor fgColor, TextColor bgColor, bool underline, bool bold, bool italic, string text) : this(fgColor, bgColor, underline, bold, italic, text, false) { } public TextMessagePartModel(TextMessagePartModel msgPart) { if (msgPart == null) { throw new ArgumentNullException("msgPart"); } f_ForegroundColor = msgPart.ForegroundColor; f_BackgroundColor = msgPart.BackgroundColor; f_Underline = msgPart.Underline; f_Bold = msgPart.Bold; f_Italic = msgPart.Italic; f_Text = msgPart.Text; } public override string ToString() { return Text; } public override int GetHashCode() { int hash = base.GetHashCode(); hash ^= ForegroundColor.GetHashCode(); hash ^= BackgroundColor.GetHashCode(); hash ^= Underline.GetHashCode(); hash ^= Bold.GetHashCode(); hash ^= Italic.GetHashCode(); if (Text != null) { hash ^= Text.GetHashCode(); } return hash; } public override bool Equals(object obj) { if (!(obj is TextMessagePartModel)) { return false; } var textPart = (TextMessagePartModel) obj; return Equals(textPart); } public bool AttributesEquals(TextMessagePartModel textPart) { if ((object) textPart == null) { return false; } if (f_ForegroundColor != textPart.ForegroundColor) { return false; } if (f_BackgroundColor != textPart.BackgroundColor) { return false; } if (f_Underline != textPart.Underline) { return false; } if (f_Bold != textPart.Bold) { return false; } if (f_Italic != textPart.Italic) { return false; } return base.Equals(textPart); } public override bool Equals(MessagePartModel part) { var textPart = part as TextMessagePartModel; if ((object) textPart == null) { return false; } if (!AttributesEquals(textPart)) { return false; } if (f_Text != textPart.Text) { return false; } return base.Equals(textPart); } protected TextMessagePartModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { } protected override void SetObjectData(SerializationReader sr) { base.SetObjectData(sr); f_ForegroundColor = new TextColor(sr.ReadInt32()); f_BackgroundColor = new TextColor(sr.ReadInt32()); f_Underline = sr.ReadBoolean(); f_Bold = sr.ReadBoolean(); f_Italic = sr.ReadBoolean(); f_Text = sr.ReadString(); } protected override void GetObjectData(SerializationWriter sw) { base.GetObjectData(sw); sw.Write(f_ForegroundColor.Value); sw.Write(f_BackgroundColor.Value); sw.Write(f_Underline); sw.Write(f_Bold); sw.Write(f_Italic); sw.Write(f_Text); } public static bool operator ==(TextMessagePartModel a, TextMessagePartModel b) { if (System.Object.ReferenceEquals(a, b)) { return true; } if ((object) a == null || (object) b == null) { return false; } return a.Equals(b); } public static bool operator !=(TextMessagePartModel a, TextMessagePartModel b) { return !(a == b); } } } smuxi-1.1/src/Engine/Messages/MessagePartModel.cs0000644000175000017500000000713412726351313022614 0ustar00meebeymeebey00000000000000/* * $Id: Config.cs 100 2005-08-07 14:54:22Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config.cs $ * $Rev: 100 $ * $Author: meebey $ * $Date: 2005-08-07 16:54:22 +0200 (Sun, 07 Aug 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] [DataContract] public abstract class MessagePartModel : ISerializable { private bool f_IsHighlight; [DataMember] public abstract string Type { get; } [DataMember] public bool IsHighlight { get { return f_IsHighlight; } set { f_IsHighlight = value; } } protected MessagePartModel() { } protected MessagePartModel(bool highlight) { f_IsHighlight = highlight; } protected MessagePartModel(SerializationInfo info, StreamingContext ctx) { SerializationReader sr = SerializationReader.GetReader(info); SetObjectData(sr); } protected virtual void SetObjectData(SerializationReader sr) { f_IsHighlight = sr.ReadBoolean(); } protected virtual void GetObjectData(SerializationWriter sw) { sw.Write(f_IsHighlight); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { SerializationWriter sw = SerializationWriter.GetWriter(); GetObjectData(sw); sw.AddToInfo(info); } public override int GetHashCode() { return f_IsHighlight.GetHashCode(); } public override bool Equals(object obj) { if (!(obj is MessagePartModel)) { return false; } var part = (MessagePartModel) obj; return Equals(part); } public virtual bool Equals(MessagePartModel part) { if ((object) part == null) { return false; } if (f_IsHighlight != part.IsHighlight) { return false; } return true; } public static bool operator ==(MessagePartModel a, MessagePartModel b) { if (System.Object.ReferenceEquals(a, b)) { return true; } if ((object) a == null || (object) b == null) { return false; } return a.Equals(b); } public static bool operator !=(MessagePartModel a, MessagePartModel b) { return !(a == b); } } } smuxi-1.1/src/Engine/Messages/ImageMessagePartModel.cs0000664000175000017500000000755114011467170023562 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008, 2012, 2017 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using System.Text.RegularExpressions; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] [DataContract] public class ImageMessagePartModel : MessagePartModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private string f_ImageFileName; private string f_AlternativeText; [DataMember] public override string Type { get { return "Image"; } } [DataMember] public string ImageFileName { get { return f_ImageFileName; } set { f_ImageFileName = value; } } [DataMember] public string AlternativeText { get { return f_AlternativeText; } set { f_AlternativeText = value; } } public ImageMessagePartModel() { } public ImageMessagePartModel(string imageFileName, string alternativeText) { if (imageFileName == null) { throw new ArgumentNullException("imageFileName"); } f_ImageFileName = imageFileName; f_AlternativeText = alternativeText; } public ImageMessagePartModel(string imageFileName) : this(imageFileName, null) { } public override string ToString() { return AlternativeText; } protected ImageMessagePartModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { } protected override void SetObjectData(SerializationReader sr) { base.SetObjectData(sr); f_ImageFileName = sr.ReadString(); f_AlternativeText = sr.ReadString(); } protected override void GetObjectData(SerializationWriter sw) { base.GetObjectData(sw); sw.Write( f_ImageFileName); sw.Write( f_AlternativeText); } public override bool Equals(object obj) { if (!(obj is ImageMessagePartModel)) { return false; } var textPart = (ImageMessagePartModel) obj; return Equals(textPart); } public override bool Equals(MessagePartModel part) { var imagePart = part as ImageMessagePartModel; if ((object) imagePart == null) { return false; } if (f_ImageFileName != imagePart.ImageFileName) { return false; } if (f_AlternativeText != imagePart.AlternativeText) { return false; } return base.Equals(imagePart); } } } smuxi-1.1/src/Engine/Messages/MessageType.cs0000644000175000017500000000272612726351313021650 0ustar00meebeymeebey00000000000000/* * $Id: Config.cs 100 2005-08-07 14:54:22Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config.cs $ * $Rev: 100 $ * $Author: meebey $ * $Date: 2005-08-07 16:54:22 +0200 (Sun, 07 Aug 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; namespace Smuxi.Engine { [DataContract] public enum MessageType { Normal, Event, ChatStateComposing, ChatStatePaused, ChatStateReset, PresenceStateOffline, PresenceStateAway, PresenceStateOnline, ChatNameChanged, PersonChatPersonChanged } } smuxi-1.1/src/Engine/Messages/UrlMessagePartModel.cs0000644000175000017500000001042112726351313023270 0ustar00meebeymeebey00000000000000/* * $Id: Config.cs 100 2005-08-07 14:54:22Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config.cs $ * $Rev: 100 $ * $Author: meebey $ * $Date: 2005-08-07 16:54:22 +0200 (Sun, 07 Aug 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using System.Text.RegularExpressions; using Smuxi.Common; namespace Smuxi.Engine { [DataContract] public enum UrlProtocol { None, Unknown, Irc, Http, Https, Ftp, Ftps, Telnet, MailTo } [Serializable] [DataContract] public class UrlMessagePartModel : TextMessagePartModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private string _Url; [DataMember] public override string Type { get { return "URL"; } } [DataMember] public string Url { get { if (_Url == null) { return Text; } return _Url; } set { _Url = value; } } public UrlMessagePartModel() { } public UrlMessagePartModel(string url) : this(url, null) { } public UrlMessagePartModel(TextMessagePartModel model) : base(model) { if (model is UrlMessagePartModel) { _Url = (model as UrlMessagePartModel)._Url; } } public UrlMessagePartModel(string url, string text): base(text) { _Url = url; } protected UrlMessagePartModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { } protected override void SetObjectData(SerializationReader sr) { base.SetObjectData(sr); sr.ReadInt32(); _Url = sr.ReadString(); } protected override void GetObjectData(SerializationWriter sw) { base.GetObjectData(sw); sw.Write((Int32) UrlProtocol.Unknown); sw.Write(_Url); } public override string ToString() { if (Text == null) { return _Url; } else if (_Url == null) { return Text; } else if (Text == _Url) { return _Url; } else if (Text.Contains(_Url)) { return Text; } else { return "[" + _Url + " " + Text + "]"; } } public override bool Equals(object obj) { if (!(obj is UrlMessagePartModel)) { return false; } var urlPart = (UrlMessagePartModel) obj; return Equals(urlPart); } public override bool Equals(MessagePartModel part) { var urlPart = part as UrlMessagePartModel; if ((object) urlPart == null) { return false; } if (_Url != urlPart._Url) { return false; } return base.Equals(urlPart); } } } smuxi-1.1/src/Engine/Messages/FeedMessageBuilder.cs0000644000175000017500000000370212726351313023074 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Text; using System.Text.RegularExpressions; using Smuxi.Common; namespace Smuxi.Engine { public class FeedMessageBuilder : MessageBuilder { public FeedMessageBuilder() : base() { } public MessageBuilder Append(AtomEntry entry) { AppendEventPrefix(); AppendUrl(entry.Link[0].Url, entry.Title.Text); AppendText(" ({0})\n", entry.Published.ToShortDateString()); foreach (var content in entry.Content) { // TODO: convert HTML: to AppendHeader, and more // HACK: align with action prefix AppendText(" "); AppendMessage(HtmlToText(content.Text)); } return this; } string HtmlToText(string html) { html = NormalizeNewlines(html); // strip all HTML tags var text = Regex.Replace(html, "<[^>]+>", String.Empty); // strip leading and trailing whitespace text = text.Trim(); return text; } } } smuxi-1.1/src/Engine/Messages/Dto/0000775000175000017500000000000014011526501017604 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Messages/Dto/MessageDtoModelV1.cs0000664000175000017500000001265314011467170023373 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012, 2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine.Dto { public class MessageDtoModelV1 { public DateTime TimeStamp { get; set; } public List MessageParts { get; set; } public MessageType MessageType { get; set; } public MessageDtoModelV1() { MessageParts = new List(); } public MessageDtoModelV1(MessageModel msg) { if (msg == null) { throw new ArgumentNullException("msg"); } TimeStamp = msg.TimeStamp; MessageType = msg.MessageType; MessageParts = new List(msg.MessageParts.Count); foreach (var msgPart in msg.MessageParts) { var dtoPart = new MessagePartDtoModelV1(msgPart); MessageParts.Add(dtoPart); } } public virtual MessageModel ToMessage() { var msg = new MessageModel() { MessageType = this.MessageType, TimeStamp = this.TimeStamp }; foreach (var msgPart in MessageParts) { MessagePartModel part = null; switch (msgPart.Type) { case "Text": var textPart = new TextMessagePartModel() { ForegroundColor = msgPart.ForegroundColor, BackgroundColor = msgPart.BackgroundColor, Underline = msgPart.Underline, Bold = msgPart.Bold, Italic = msgPart.Italic, Text = msgPart.Text }; part = textPart; break; case "URL": var urlPart = new UrlMessagePartModel() { Url = msgPart.Url, Text = msgPart.Text }; part = urlPart; break; case "Image": var imagePart = new ImageMessagePartModel() { ImageFileName = msgPart.ImageFileName, AlternativeText = msgPart.AlternativeText }; part = imagePart; break; } if (part == null) { continue; } part.IsHighlight = msgPart.IsHighlight; msg.MessageParts.Add(part); } return msg; } } public class MessagePartDtoModelV1 { // MessagePartModel public string Type { get; set; } public bool IsHighlight { get; set; } // TextMessagePartModel public TextColor ForegroundColor { get; set; } public TextColor BackgroundColor { get; set; } public bool Underline { get; set; } public bool Bold { get; set; } public bool Italic { get; set; } public string Text { get; set; } // UrlMessagePartModel public string Url { get; set; } public UrlProtocol? Protocol { get; set; } // ImageMessagePartModel public string ImageFileName { get; set; } public string AlternativeText { get; set; } public MessagePartDtoModelV1() { } public MessagePartDtoModelV1(MessagePartModel part) { if (part == null) { throw new ArgumentNullException("part"); } IsHighlight = part.IsHighlight; if (part is TextMessagePartModel) { var textPart = (TextMessagePartModel) part; Type = "Text"; ForegroundColor = textPart.ForegroundColor; BackgroundColor = textPart.BackgroundColor; Underline = textPart.Underline; Bold = textPart.Bold; Italic = textPart.Italic; Text = textPart.Text; } if (part is UrlMessagePartModel) { var urlPart = (UrlMessagePartModel) part; Type = "URL"; Url = urlPart.Url; Text = urlPart.Text; } if (part is ImageMessagePartModel) { var imagePart = (ImageMessagePartModel) part; Type = "Image"; ImageFileName = imagePart.ImageFileName; AlternativeText = imagePart.AlternativeText; } } } } smuxi-1.1/src/Engine/Messages/Dto/MessageDtoModelV2.cs0000664000175000017500000000247614011467170023376 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2016 Andres G. Aragoneses // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine.Dto { public class MessageDtoModelV2 : MessageDtoModelV1 { public string ID { get; set; } public MessageDtoModelV2(MessageModel msg) : base(msg) { ID = msg.ID; } public override MessageModel ToMessage() { var msg = base.ToMessage(); msg.ID = ID; return msg; } } } smuxi-1.1/src/Engine/Messages/MessageModel.cs0000664000175000017500000002232214011467170021761 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2010 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] [DataContract] public class MessageModel : ISerializable { static readonly Regex NickRegex = new Regex("^<([^ ]+)> "); private DateTime f_TimeStamp; private IList f_MessageParts; private MessageType f_MessageType; [NonSerialized] private bool f_IsCompactable; [DataMember] public DateTime TimeStamp { get { return f_TimeStamp; } set { f_TimeStamp = value; } } [DataMember] public string ID { get; set; } [DataMember] public IList MessageParts { get { return f_MessageParts; } } [IgnoreDataMember] public bool IsEmpty { get { return f_MessageParts.Count == 0; } } [DataMember] public MessageType MessageType { get { return f_MessageType; } set { f_MessageType = value; } } [IgnoreDataMember] public bool IsCompactable { get { return f_IsCompactable; } set { f_IsCompactable = value; } } public MessageModel() { f_TimeStamp = DateTime.UtcNow; f_MessageParts = new List(); IsCompactable = true; } public MessageModel(string text, MessageType msgType) : this() { f_MessageParts.Add(new TextMessagePartModel(null, null, false, false, false, text)); f_MessageType = msgType; } public MessageModel(string text) : this(text, MessageType.Normal) { } public MessageModel(MessageModel msg) : this() { if (msg == null) { throw new ArgumentNullException("msg"); } var writer = SerializationWriter.GetWriter(); msg.GetObjectData(writer); var data = writer.GetData(); var reader = SerializationReader.GetReader(data); SetObjectData(reader); } protected MessageModel(SerializationInfo info, StreamingContext ctx) { SerializationReader sr = SerializationReader.GetReader(info); SetObjectData(sr); } protected virtual void SetObjectData(SerializationReader sr) { f_TimeStamp = sr.ReadDateTime(); f_MessageParts = sr.ReadList(); f_MessageType = (MessageType) sr.ReadInt32(); // backward compatibility with engines < 1.1 if (sr.PeekChar() != -1) { ID = sr.ReadString(); } } protected virtual void GetObjectData(SerializationWriter sw) { if (IsCompactable) { // OPT: compact all parts before serialization Compact(); } sw.Write(f_TimeStamp); sw.Write(f_MessageParts); sw.Write((Int32) f_MessageType); sw.Write(ID); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { SerializationWriter sw = SerializationWriter.GetWriter(); GetObjectData(sw); sw.AddToInfo(info); } public override string ToString() { // OPT: StringBuilder's default of 16 chars is way too short for // a regular message. A regular message should be around 128 to // 256 chars StringBuilder sb = new StringBuilder(256); foreach (MessagePartModel part in MessageParts) { sb.Append(part.ToString()); } return sb.ToString(); } public override int GetHashCode() { return f_TimeStamp.GetHashCode(); } public override bool Equals(object obj) { if (!(obj is MessageModel)) { return false; } var msg = (MessageModel) obj; return Equals(msg); } public bool Equals(MessageModel msg) { if ((object) msg == null) { return false; } // millisecond precision if (Math.Abs(f_TimeStamp.Subtract(msg.TimeStamp).TotalMilliseconds) > 1) { return false; } if (f_MessageType != msg.MessageType) { return false; } if (f_MessageParts.Count != msg.MessageParts.Count) { return false; } for (int i = 0; i < f_MessageParts.Count; i++) { if (f_MessageParts[i] != msg.MessageParts[i]) { return false; } } return true; } public void Compact() { // the idea is to glue each text part that has the same attributes // to a combined new one to reduce the number of parts as they are // expensive when serialized // nothing to glue if (MessageParts.Count <= 1) { return; } var parts = new List(MessageParts.Count); StringBuilder gluedText = null; bool dontMoveNext = false; var iter = MessageParts.GetEnumerator(); while (dontMoveNext || iter.MoveNext()) { dontMoveNext = false; var current = iter.Current; parts.Add(current); // we can only glue pure text (not URLs etc) if (current.GetType() != typeof(TextMessagePartModel)) { continue; } var currentText = (TextMessagePartModel) current; while (iter.MoveNext()) { var next = iter.Current; if (next.GetType() != typeof(TextMessagePartModel)) { parts.Add(next); break; } var nextText = (TextMessagePartModel) next; if (!currentText.AttributesEquals(nextText)) { // they aren't the same! no candidate for glueing :/ // but maybe the next part is dontMoveNext = true; break; } // glue time! if (gluedText == null) { // this is the first element of the gluing gluedText = new StringBuilder(256); gluedText.Append(currentText.Text); } gluedText.Append(nextText.Text); } if (gluedText != null) { currentText.Text = gluedText.ToString(); gluedText = null; } } f_MessageParts = parts; } public string GetNick() { // HACK: MessageModel doesn't contain a Sender/Origin property // yet, thus we have to retrieve the information from the // meesage itself // TODO: extend MessageModel with Origin property var msgText = ToString(); var match = NickRegex.Match(msgText); if (match.Success && match.Groups.Count >= 2) { return match.Groups[1].Value; } return null; } public static bool operator ==(MessageModel a, MessageModel b) { if (System.Object.ReferenceEquals(a, b)) { return true; } if ((object) a == null || (object) b == null) { return false; } return a.Equals(b); } public static bool operator !=(MessageModel a, MessageModel b) { return !(a == b); } } } smuxi-1.1/src/Engine/IFrontendUI.cs0000644000175000017500000000346611655545675020023 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ namespace Smuxi.Engine { public interface IFrontendUI { int Version { get; } void AddChat(ChatModel chat); void EnableChat(ChatModel chat); void DisableChat(ChatModel chat); void AddMessageToChat(ChatModel chat, MessageModel msg); void RemoveChat(ChatModel chat); void SyncChat(ChatModel chat); void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person); void UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson); void UpdateTopicInGroupChat(GroupChatModel groupChat, MessageModel topic); void RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person); void SetNetworkStatus(string status); void SetStatus(string status); // Presence? // File Transfer? } } smuxi-1.1/src/Engine/Protocols/0000775000175000017500000000000014011526501017273 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Protocols/ProtocolManagerInfoModel.cs0000644000175000017500000000403311655545675024541 0ustar00meebeymeebey00000000000000/* * $Id: CommandModel.cs 179 2007-04-21 15:01:29Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/CommandModel.cs $ * $Rev: 179 $ * $Author: meebey $ * $Date: 2007-04-21 17:01:29 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class ProtocolManagerInfoModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private string _Name; private string _Description; private string _Alias; public string Name { get { return _Name; } } public string Description { get { return _Description; } } public string Alias { get { return _Alias; } } public ProtocolManagerInfoModel(string name, string description, string alias) { _Name = name; _Description = description; _Alias = alias; } } } smuxi-1.1/src/Engine/Protocols/ProtocolManagerInfoAttribute.cs0000644000175000017500000000445411655545675025453 0ustar00meebeymeebey00000000000000/* * $Id: CommandModel.cs 179 2007-04-21 15:01:29Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/CommandModel.cs $ * $Rev: 179 $ * $Author: meebey $ * $Date: 2007-04-21 17:01:29 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Common; namespace Smuxi.Engine { public class ProtocolManagerInfoAttribute : Attribute { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private string _Name; private string _Description; private string _Alias; public string Name { get { return _Name; } set { _Name = value; } } public string Description { get { return _Description; } set { _Description = value; } } public string Alias { get { return _Alias; } set { _Alias = value; } } public ProtocolManagerInfoAttribute() { } public ProtocolManagerInfoAttribute(string name, string description, string alias) { _Name = name; _Description = description; _Alias = alias; } } } smuxi-1.1/src/Engine/Protocols/ProtocolManagerBase.cs0000644000175000017500000003674312726351313023534 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007-2014 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using SysDiag = System.Diagnostics; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public abstract class ProtocolManagerBase : PermanentRemoteObject, IProtocolManager { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-engine"; private Session _Session; private string _Host; private int _Port; private bool _IsConnected; private PresenceStatus _PresenceStatus; public PersonModel Me { get; protected set; } public event EventHandler Connected; public event EventHandler Disconnected; public event EventHandler MessageSent; public event EventHandler MessageReceived; public event EventHandler PresenceStatusChanged; public virtual string Host { get { return _Host; } protected set { _Host = value; } } public virtual int Port { get { return _Port; } protected set { _Port = value; } } public virtual bool IsConnected { get { return _IsConnected; } protected set { _IsConnected = value; } } public virtual PresenceStatus PresenceStatus { get { return _PresenceStatus; } set { SetPresenceStatus(value, null); } } public abstract string NetworkID { get; } public abstract string Protocol { get; } public abstract ChatModel Chat { get; } public virtual IList Chats { get { IList chats = new List(); lock (_Session.Chats) { foreach (ChatModel chat in _Session.Chats) { if (chat.ProtocolManager == this) { chats.Add(chat); } } } return chats; } } public virtual Session Session { get { return _Session; } } protected bool DebugProtocol { get { #if LOG4NET var repo = log4net.LogManager.GetRepository(); // info is higher than debug return repo.Threshold <= log4net.Core.Level.Debug; #else return false; #endif } } protected ProtocolManagerBase(Session session) { Trace.Call(session); if (session == null) { throw new ArgumentNullException("session"); } _Session = session; } public virtual void Dispose() { Trace.Call(); foreach (ChatModel chat in Chats) { _Session.RemoveChat(chat); } } public override string ToString() { string result; if (Chat == null) { result = NetworkID; } else { result = Chat.Name; } if (!IsConnected) { result += " (" + _("not connected") + ")"; } return result; } public abstract bool Command(CommandModel cmd); public abstract void Connect(FrontendManager fm, ServerModel server); public abstract void Reconnect(FrontendManager fm); public abstract void Disconnect(FrontendManager fm); public abstract IList FindGroupChats(GroupChatModel filter); public abstract void OpenChat(FrontendManager fm, ChatModel chat); public abstract void CloseChat(FrontendManager fm, ChatModel chat); public virtual void SetPresenceStatus(PresenceStatus status, string message) { var args = new PresenceStatusChangedEventArgs(_PresenceStatus, status, message); _PresenceStatus = status; if (args.OldStatus != args.NewStatus) { OnPresenceStatusChanged(args); } } protected void NotConnected(CommandModel cmd) { var msg = CreateMessageBuilder(); msg.AppendEventPrefix(); msg.AppendText(_("Not connected to server")); Session.AddMessageToFrontend(cmd, msg.ToMessage()); } protected void NotEnoughParameters(CommandModel cmd) { var msg = CreateMessageBuilder(); msg.AppendEventPrefix(); msg.AppendText(_("Not enough parameters for {0} command"), cmd.Command); Session.AddMessageToFrontend(cmd, msg.ToMessage()); } protected virtual void OnConnected(EventArgs e) { Trace.Call(e); var msg = CreateMessageBuilder(); msg.AppendEventPrefix(); msg.AppendText(_("Connected to {0}"), NetworkID); Session.AddMessageToChat(Chat, msg.ToMessage()); _PresenceStatus = PresenceStatus.Online; Session.UpdateNetworkStatus(); if (Connected != null) { Connected(this, e); } var hooks = new HookRunner("engine", "protocol-manager", "on-connected"); hooks.Environments.Add(new ChatHookEnvironment(Chat)); hooks.Environments.Add(new ProtocolManagerHookEnvironment(this)); var cmdChar = (string) Session.UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(Session, Chat, cmdChar)); hooks.Commands.Add(new ProtocolManagerHookCommand(this, Chat, cmdChar)); // show time hooks.Init(); hooks.Run(); } protected virtual void OnDisconnected(EventArgs e) { Trace.Call(e); var msg = CreateMessageBuilder(); msg.AppendEventPrefix(); msg.AppendText(_("Disconnected from {0}"), NetworkID); Session.AddMessageToChat(Chat, msg.ToMessage()); _PresenceStatus = PresenceStatus.Offline; Session.UpdateNetworkStatus(); if (Disconnected != null) { Disconnected(this, e); } var hooks = new HookRunner("engine", "protocol-manager", "on-disconnected"); hooks.Environments.Add(new ChatHookEnvironment(Chat)); hooks.Environments.Add(new ProtocolManagerHookEnvironment(this)); var cmdChar = (string) Session.UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(Session, Chat, cmdChar)); hooks.Commands.Add(new ProtocolManagerHookCommand(this, Chat, cmdChar)); // show time hooks.Init(); hooks.Run(); } protected virtual void OnMessageSent(MessageEventArgs e) { Trace.Call(e); if (MessageSent != null) { MessageSent(this, e); } var hooks = new HookRunner("engine", "protocol-manager", "on-message-sent"); hooks.Environments.Add(new ChatHookEnvironment(e.Chat)); var sender = e.Sender; if (String.IsNullOrEmpty(sender)) { sender = Me.ID; } hooks.Environments.Add(new MessageHookEnvironment(e.Message, sender, e.Receiver)); hooks.Environments.Add(new ProtocolManagerHookEnvironment(this)); var cmdChar = (string) Session.UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(Session, e.Chat, cmdChar)); hooks.Commands.Add(new ProtocolManagerHookCommand(this, e.Chat, cmdChar)); // show time hooks.Init(); hooks.Run(); } protected virtual void OnMessageReceived(MessageEventArgs e) { Trace.Call(e); if (MessageReceived != null) { MessageReceived(this, e); } var hooks = new HookRunner("engine", "protocol-manager", "on-message-received"); hooks.Environments.Add(new ChatHookEnvironment(e.Chat)); var receiver = e.Receiver; if (String.IsNullOrEmpty(receiver)) { receiver = Me.ID; } hooks.Environments.Add(new MessageHookEnvironment(e.Message, e.Sender, receiver)); hooks.Environments.Add(new ProtocolManagerHookEnvironment(this)); var cmdChar = (string) Session.UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(Session, e.Chat, cmdChar)); hooks.Commands.Add(new ProtocolManagerHookCommand(this, e.Chat, cmdChar)); // show time hooks.Init(); hooks.Run(); } protected virtual void OnPresenceStatusChanged(PresenceStatusChangedEventArgs e) { Trace.Call(e); if (PresenceStatusChanged != null) { PresenceStatusChanged(this, e); } var hooks = new HookRunner("engine", "protocol-manager", "on-presence-status-changed"); hooks.EnvironmentVariables.Add("PRESENCE_STATUS_CHANGED_OLD_STATUS", e.OldStatus.ToString()); hooks.EnvironmentVariables.Add("PRESENCE_STATUS_CHANGED_NEW_STATUS", e.NewStatus.ToString()); hooks.EnvironmentVariables.Add("PRESENCE_STATUS_CHANGED_NEW_MESSAGE", e.NewMessage); hooks.Environments.Add(new ProtocolManagerHookEnvironment(this)); var cmdChar = (string) Session.UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(Session, Chat, cmdChar)); hooks.Commands.Add(new ProtocolManagerHookCommand(this, Chat, cmdChar)); // show time hooks.Init(); hooks.Run(); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } protected ChatModel GetChat(string id, ChatType chatType) { return _Session.GetChat(id, chatType, this); } protected virtual T GetPerson(ChatModel chat, string personId) where T : PersonModel { if (personId == null) { throw new ArgumentNullException("personId"); } T person = null; if (chat is GroupChatModel) { var groupChat = (GroupChatModel) chat; person = (T) groupChat.GetPerson(personId); } else if (chat is PersonChatModel) { var personChat = (PersonChatModel) chat; if (personId == personChat.Person.ID) { person = (T) personChat.Person; } else if (personId == Me.ID) { person = (T) Me; } } return person; } protected MessageBuilder CreateMessageBuilder() { return CreateMessageBuilder(); } protected virtual T CreateMessageBuilder() where T : MessageBuilder, new() { var builder = new T(); builder.Me = Me; // copy settings so the caller can override settings without // changing the settings of the complete session builder.Settings = new MessageBuilderSettings(Session.MessageBuilderSettings); return builder; } protected virtual void DebugRead(string data) { if (data == null) { throw new ArgumentNullException("data"); } if (Chat == null) { return; } if (!DebugProtocol) { return; } var msgBuilder = CreateMessageBuilder(); msgBuilder.MessageType = MessageType.Event; // HACK: extra leading space to align with "-!- " // HACK: extra trailing space to align with "WRITE: " msgBuilder.AppendText(" READ: "); msgBuilder.AppendText(data); Session.AddMessageToChat(Chat, msgBuilder.ToMessage()); } protected virtual void DebugWrite(string data) { if (data == null) { throw new ArgumentNullException("data"); } if (Chat == null) { return; } if (!DebugProtocol) { return; } var msgBuilder = CreateMessageBuilder(); msgBuilder.MessageType = MessageType.Event; // HACK: extra leading space to align with "-!- " msgBuilder.AppendText(" WRITE: "); msgBuilder.AppendText(data); Session.AddMessageToChat(Chat, msgBuilder.ToMessage()); } } public class MessageEventArgs : EventArgs { public ChatModel Chat { get; protected set; } public MessageModel Message { get; protected set; } public string Sender { get; protected set; } public string Receiver { get; protected set; } public MessageEventArgs(ChatModel chat, MessageModel msg, string sender, string receiver) { Chat = chat; Message = msg; Sender = sender; Receiver = receiver; } } public class PresenceStatusChangedEventArgs : EventArgs { public PresenceStatus OldStatus { get; protected set; } public PresenceStatus NewStatus { get; protected set; } public string NewMessage { get; protected set; } public PresenceStatusChangedEventArgs(PresenceStatus oldStatus, PresenceStatus newStatus, string newMessage) { OldStatus = oldStatus; NewStatus = newStatus; NewMessage = newMessage; } } } smuxi-1.1/src/Engine/Protocols/IProtocolManager.cs0000644000175000017500000000432712726351313023043 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2008, 2010, 2011, 2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; namespace Smuxi.Engine { public interface IProtocolManager : IDisposable { Session Session { get; } string NetworkID { get; } string Protocol { get; } string Host { get; } int Port { get; } bool IsConnected { get; } PersonModel Me { get; } ChatModel Chat { get; } IList Chats { get; } PresenceStatus PresenceStatus { get; } void Connect(FrontendManager frontendManager, ServerModel server); void Disconnect(FrontendManager frontendManager); void Reconnect(FrontendManager frontendManager); bool Command(CommandModel command); string ToString(); event EventHandler Connected; event EventHandler Disconnected; IList FindGroupChats(GroupChatModel filter); void OpenChat(FrontendManager fm, ChatModel chat); void CloseChat(FrontendManager fm, ChatModel chat); void SetPresenceStatus(PresenceStatus status, string message); } } smuxi-1.1/src/Engine/Protocols/ProtocolManagerFactory.cs0000644000175000017500000001355312726351313024263 0ustar00meebeymeebey00000000000000/* * $Id: IrcProtocolManager.cs 149 2007-04-11 16:47:52Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/IrcProtocolManager.cs $ * $Rev: 149 $ * $Author: meebey $ * $Date: 2007-04-11 18:47:52 +0200 (Wed, 11 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public class ProtocolManagerFactory { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private IDictionary _ProtocolManagerTypes = new Dictionary(); public IList ProtocolManagerInfos { get { return new List(_ProtocolManagerTypes.Keys); } } public ProtocolManagerFactory() { } public void LoadProtocolManager(string filename) { Trace.Call(filename); Assembly asm = Assembly.LoadFile(filename); Type[] types; try { types = asm.GetTypes(); } catch (ReflectionTypeLoadException ex) { #if LOG4NET _Logger.WarnFormat( "LoadProtocolManager(): GetTypes() on {0} threw exceptions", filename ); foreach (var loaderEx in ex.LoaderExceptions) { _Logger.Warn( "LoadProtocolManager(): LoaderException: ", loaderEx ); _Logger.Warn( "LoadProtocolManager(): LoaderException.InnerException: ", loaderEx.InnerException ); } #endif types = ex.Types; } foreach (Type type in types) { if (type.IsAbstract) { continue; } Type foundType = null; Type[] interfaceTypes = type.GetInterfaces(); foreach (Type interfaceType in interfaceTypes) { if (interfaceType == typeof(IProtocolManager)) { #if LOG4NET _Logger.Debug("LoadProtocolManager(): found " + type); #endif foundType = type; break; } } if (foundType == null) { continue; } // let's get the info attribute object[] attrs = foundType.GetCustomAttributes(typeof(ProtocolManagerInfoAttribute), true); if (attrs == null || attrs.Length == 0) { throw new ArgumentException("Assembly contains IProtocolManager but misses ProtocolManagerInfoAttribute", "filename"); //continue; } ProtocolManagerInfoAttribute attr = (ProtocolManagerInfoAttribute) attrs[0]; ProtocolManagerInfoModel info = new ProtocolManagerInfoModel(attr.Name, attr.Description, attr.Alias); _ProtocolManagerTypes.Add(info, foundType); } } public void LoadAllProtocolManagers(string path) { Trace.Call(path); string[] filenames = Directory.GetFiles(path, "smuxi-engine*.dll"); foreach (string filename in filenames) { LoadProtocolManager(filename); } } public ProtocolManagerInfoModel GetProtocolManagerInfoByAlias(string alias) { foreach (ProtocolManagerInfoModel info in _ProtocolManagerTypes.Keys) { if (info.Alias.Equals(alias, StringComparison.InvariantCultureIgnoreCase) || info.Name.Equals(alias, StringComparison.InvariantCultureIgnoreCase)) { return info; } } return null; } public IList GetProtocols() { IList protocols = new List(); foreach (ProtocolManagerInfoModel info in _ProtocolManagerTypes.Keys) { if (!protocols.Contains(info.Name)) { protocols.Add(info.Name); } } return protocols; } public IProtocolManager CreateProtocolManager(ProtocolManagerInfoModel info, Session session) { if (info == null) { throw new ArgumentNullException("info"); } if (session == null) { throw new ArgumentNullException("session"); } Type type = _ProtocolManagerTypes[info]; return (IProtocolManager) Activator.CreateInstance(type, session); } } } smuxi-1.1/src/Engine/CommandModel.cs0000644000175000017500000001676712726351313020224 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using System.Runtime.Serialization; using Smuxi.Common; using System.Text.RegularExpressions; namespace Smuxi.Engine { [Serializable] public class CommandModel : ITraceable, ISerializable { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private string _Data; private string[] _DataArray; private string _Parameter; private bool _IsCommand; private string _CommandCharacter; private string _Command; private FrontendManager _FrontendManager; private ChatModel _Chat; public string Data { get { return _Data; } } public string[] DataArray { get { return _DataArray; } } public string Parameter { get { return _Parameter; } } public bool IsCommand { get { return _IsCommand; } } public string CommandCharacter { get { return _CommandCharacter; } } public string Command { get { return _Command; } } public FrontendManager FrontendManager { get { return _FrontendManager; } } public ChatModel Chat { get { return _Chat; } } public CommandModel(FrontendManager fm, ChatModel chat, string cmdChar, string data) { Trace.Call(fm, chat == null ? "(null)" : chat.GetType().ToString(), cmdChar, data); _Data = data; _CommandCharacter = cmdChar; _FrontendManager = fm; _Chat = chat; try { EnhancedParse(data); } catch (FormatException) { SimpleParse(data); } } public CommandModel(FrontendManager fm, ChatModel chat, string parameter) : this(fm, chat, "/", "/cmd " + parameter) { } protected CommandModel(SerializationInfo info, StreamingContext ctx) { SerializationReader sr = SerializationReader.GetReader(info); SetObjectData(sr); _FrontendManager = (FrontendManager) info.GetValue("_FrontendManager", typeof(FrontendManager)); _Chat = (ChatModel) info.GetValue("_Chat", typeof(ChatModel)); } protected virtual void SetObjectData(SerializationReader sr) { // FIXME: optimize this by re-parsing instead of deserializing _Data = sr.ReadString(); _DataArray = _Data.Split(new char[] {' '}); _Parameter = sr.ReadString(); _IsCommand = sr.ReadBoolean(); _CommandCharacter = sr.ReadString(); _Command = sr.ReadString(); //_FrontendManager = (FrontendManager) sr.ReadObject(); //_Chat = (ChatModel) sr.ReadObject(); } protected virtual void GetObjectData(SerializationWriter sw) { sw.Write(_Data); //sw.Write(_DataArray); sw.Write(_Parameter); sw.Write(_IsCommand); sw.Write(_CommandCharacter); sw.Write(_Command); //sw.WriteObject(_FrontendManager); //sw.WriteObject(_Chat); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { SerializationWriter sw = SerializationWriter.GetWriter(); GetObjectData(sw); sw.AddToInfo(info); info.AddValue("_FrontendManager", _FrontendManager); info.AddValue("_Chat", _Chat); } public string ToTraceString() { return _Data; } void EnhancedParse(string data) { string regex = Regex.Escape(_CommandCharacter); regex += "(?[a-z_-]+)"; // commands can only contain english keyboard letters string quoted_parameter = @"""(?[^""]*)"""; string normal_parameter = @"(?[^ ]+)"; string parameters = @"( +(" + quoted_parameter + "|" + normal_parameter + "))*"; regex += parameters + " *"; // may end with spaces regex = "^" + regex + "$"; // parse full string var match = Regex.Match(data, regex, RegexOptions.IgnoreCase); if (data.Contains(" ")) { _Parameter = data.Substring(data.IndexOf(' ') + 1); } else { _Parameter = ""; } if (match.Success) { _IsCommand = true; _Command = match.Groups["command"].Value; var list = new List(); list.Add(_CommandCharacter + _Command); foreach (Capture cap in match.Groups["parameters"].Captures) { list.Add(cap.Value); } _DataArray = list.ToArray(); } else { if (data.StartsWith(_CommandCharacter + _CommandCharacter)) { _Data = data.Substring(_CommandCharacter.Length); } else if (data.StartsWith(_CommandCharacter)) { throw new FormatException("command could not be parsed by command regex, regex must be broken"); } _DataArray = new string[1]; _DataArray[0] = _Data; } } void SimpleParse(string data) { _DataArray = data.Split(new char[] {' '}); _Parameter = String.Join(" ", _DataArray, 1, _DataArray.Length - 1); if (data.StartsWith(_CommandCharacter) && !data.StartsWith(_CommandCharacter + _CommandCharacter)) { _Command = (_DataArray [0].Length > _CommandCharacter.Length) ? _DataArray [0].Substring(_CommandCharacter.Length).ToLower() : String.Empty; } else if (data.StartsWith(_CommandCharacter + _CommandCharacter)) { _Data = data.Substring(_CommandCharacter.Length); _DataArray [0] = _DataArray [0].Substring(_CommandCharacter.Length); } } } } smuxi-1.1/src/Engine/TextColorContrast.cs0000644000175000017500000000211711700531605021301 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public enum TextColorContrast : int { None = 0, VeryLow = 10, Low = 20, Medium = 35, High = 50, VeryHigh = 60 } } smuxi-1.1/src/Engine/AssemblyInfo.cs0000644000175000017500000000244212726351313020241 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - engine")] [assembly: AssemblyCopyright("2005-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] [assembly: InternalsVisibleToAttribute("smuxi-engine-tests")] smuxi-1.1/src/Engine/TextColorTools.cs0000644000175000017500000002336612253423337020623 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using System.Globalization; using Smuxi.Common; namespace Smuxi.Engine { public static class TextColorTools { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static Dictionary f_BestContrastColors; static Dictionary> NearestColors { get; set; } static TextColorTools() { f_BestContrastColors = new Dictionary(1024); NearestColors = new Dictionary>(16); } public static TextColor GetBestTextColor(TextColor fgColor, TextColor bgColor) { return GetBestTextColor(fgColor, bgColor, TextColorContrast.Medium); } public static TextColor GetBestTextColor(TextColor fgColor, TextColor bgColor, TextColorContrast neededContrast) { if (fgColor == null) { throw new ArgumentNullException("fgColor"); } if (bgColor == null) { throw new ArgumentNullException("bgColor"); } TextColor bestColor; int key = fgColor.Value ^ bgColor.Value ^ (int) neededContrast; if (f_BestContrastColors.TryGetValue(key, out bestColor)) { return bestColor; } double brDiff = GetBritnessDifference(bgColor, TextColor.White); int modifier = 0; // for bright backgrounds we need to go from bright to dark colors // for better contrast and for dark backgrounds the opposite if (brDiff < 127) { // bright background modifier = -10; } else { // dark background modifier = 10; } double lastDifference = 0; bestColor = fgColor; int attempts = 1; while (true) { double difference = GetLuminanceDifference(bestColor, bgColor); double needed = ((int) neededContrast) / 10d; if (difference > needed) { break; } #if LOG4NET && COLOR_DEBUG f_Logger.Debug("GetBestTextColor(): color has bad contrast: " + bestColor + " difference: " + difference + " needed: " + needed); #endif // change the fg color int red = bestColor.Red + modifier; int green = bestColor.Green + modifier; int blue = bestColor.Blue + modifier; // cap to allowed values if (modifier > 0) { if (red > 255) { red = 255; } if (green > 255) { green = 255; } if (blue > 255) { blue = 255; } } else { if (red < 0) { red = 0; } if (green < 0) { green = 0; } if (blue < 0) { blue = 0; } } bestColor = new TextColor((byte) red, (byte) green, (byte) blue); // in case we found no good color if (bestColor == TextColor.White || bestColor == TextColor.Black) { break; } attempts++; } #if LOG4NET && COLOR_DEBUG f_Logger.Debug( String.Format( "GetBestTextColor(): found good contrast: {0}|{1}={2} " + "({3}) attempts: {4}", fgColor, bgColor, bestColor, neededContrast, attempts ) ); #endif f_BestContrastColors.Add(key, bestColor); return bestColor; } // algorithm ported from PHP to C# from: // http://www.splitbrain.org/blog/2008-09/18-calculating_color_contrast_with_php public static double GetLuminanceDifference(TextColor color1, TextColor color2) { double L1 = 0.2126d * Math.Pow(color1.Red / 255d, 2.2d) + 0.7152d * Math.Pow(color1.Green / 255d, 2.2d) + 0.0722d * Math.Pow(color1.Blue / 255d, 2.2d); double L2 = 0.2126d * Math.Pow(color2.Red / 255d, 2.2d) + 0.7152d * Math.Pow(color2.Green / 255d, 2.2d) + 0.0722d * Math.Pow(color2.Blue / 255d, 2.2d); if (L1 > L2) { return (L1 + 0.05d) / (L2 + 0.05d); } else { return (L2 + 0.05d) / (L1 + 0.05d); } } public static double GetBritnessDifference(TextColor color1, TextColor color2) { double br1 = (299d * color1.Red + 587d * color1.Green + 114d * color1.Blue) / 1000d; double br2 = (299d * color2.Red + 587d * color2.Green + 114d * color2.Blue) / 1000d; return Math.Abs(br1 - br2); } // algorithm ported from JavaScript to C# from: // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript internal static HslColor ToHSL(TextColor color) { var R = color.Red / 255d; var G = color.Green / 255d; var B = color.Blue / 255d; var max = Math.Max(Math.Max(R, G), B); var min = Math.Min(Math.Min(R, G), B); double H = 0d, S, L; var range = max + min; L = range / 2d; if (max == min) { S = 0d; // achromatic } else { var diff = max - min; S = L > 0.5d ? diff / (2 - diff) : diff / range; if (max == R) { H = (G - B) / diff + (G < B ? 6d : 0d); } else if (max == G) { H = (B - R) / diff + 2; } else if (max == B) { H = (R - G) / diff + 4; } H /= 6; } return new HslColor(H, S, L); } public static TextColor GetNearestColor(TextColor color, IEnumerable palette) { if (palette == null) { throw new ArgumentNullException("palette"); } TextColor nearestColor = null; Dictionary cache; if (NearestColors.TryGetValue(palette, out cache)) { if (cache.TryGetValue(color, out nearestColor)) { return nearestColor; } } else { cache = new Dictionary(1024); NearestColors.Add(palette, cache); } var hslColor1 = ToHSL(color); double nearestDifference = Double.MaxValue; foreach (var color2 in palette) { // compute the Euclidean distance between the two HSL colors // without root square as we only compare the values // see http://en.wikipedia.org/wiki/Color_difference#Delta_E var hslColor2 = ToHSL(color2); var H1 = hslColor1.Hue; var S1 = hslColor1.Saturation; var L1 = hslColor1.Lightness; var H2 = hslColor2.Hue; var S2 = hslColor2.Saturation; var L2 = hslColor2.Lightness; var Hdelta = H1 - H2; var Sdelta = S1 - S2; var Ldelta = L1 - L2; var deltaE = (Hdelta * Hdelta) + (Sdelta * Sdelta) + (Ldelta * Ldelta); if (deltaE < nearestDifference) { nearestDifference = deltaE; nearestColor = color2; } if (deltaE == 0d) { // found perfect match, can't get better than that break; } } cache.Add(color, nearestColor); return nearestColor; } internal class HslColor { public double Hue { get; set; } public double Saturation { get; set; } public double Lightness { get; set; } public HslColor(double H, double S, double L) { Hue = H; Saturation = S; Lightness = L; } } } } smuxi-1.1/src/Engine/FrontendManager.cs0000644000175000017500000003547212253423337020732 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2011 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections; using System.Collections.Generic; using System.Threading; using Smuxi.Common; namespace Smuxi.Engine { public delegate void SimpleDelegate(); public class FrontendManager : PermanentRemoteObject, IFrontendUI, IDisposable { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-engine"; private Session _Session; private IFrontendUI _UI; private ChatModel _CurrentChat; private IProtocolManager _CurrentProtocolManager; private bool _IsFrontendDisconnecting; private SimpleDelegate _ConfigChangedDelegate; private bool _IsFrontendSynced; private IList _SyncedChats = new List(); private TaskQueue f_TaskQueue; DateTime LastConfigChange; public int Version { get { return 0; } } public SimpleDelegate ConfigChangedDelegate { set { _ConfigChangedDelegate = value; } } public ChatModel CurrentChat { get { return _CurrentChat; } set { _CurrentChat = value; } } public IProtocolManager CurrentProtocolManager { get { return _CurrentProtocolManager; } set { _CurrentProtocolManager = value; } } public bool IsFrontendDisconnecting { get { return _IsFrontendDisconnecting; } set { _IsFrontendDisconnecting = value; } } public bool IsAlive { get { return !f_TaskQueue.Disposed; } } public FrontendManager(Session session, IFrontendUI ui) { Trace.Call(session, ui); if (session == null) { throw new ArgumentNullException("session"); } if (ui == null) { throw new ArgumentNullException("ui"); } _Session = session; _UI = ui; f_TaskQueue = new TaskQueue("FrontendManager"); f_TaskQueue.ExceptionEvent += OnTaskQueueExceptionEvent; f_TaskQueue.AbortedEvent += OnTaskQueueAbortedEvent; // register event for config invalidation _Session.Config.Changed += _OnConfigChanged; } ~FrontendManager() { Trace.Call(); Dispose(false); } public void Dispose() { Trace.Call(); Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { Trace.Call(disposing); if (disposing) { f_TaskQueue.Dispose(); _Session.Config.Changed -= _OnConfigChanged; } } public void Sync() { Trace.Call(); // sync current page List chats; lock (_Session.Chats) { _CurrentChat = _Session.Chats[0]; chats = new List(_Session.Chats); } // restore page positions if (_CurrentChat.Position != -1) { // looks like the positions were synced, sort it good chats.Sort( (a, b) => (a.Position.CompareTo(b.Position)) ); } // sync pages foreach (ChatModel chat in chats) { _AddChat(chat); } // sync current network manager (if any exists) IProtocolManager nm = _Session.FirstProtocolManager; if (nm != null) { CurrentProtocolManager = nm; } // sync content of pages foreach (ChatModel chat in chats) { _SyncChat(chat); } _IsFrontendSynced = true; _Session.CheckPresenceStatus(); } /// /// This method is thread safe. /// public void AddSyncedChat(ChatModel chatModel) { Trace.Call(chatModel); if (!chatModel.IsEnabled) { // The frontend synced a disabled chat, this means the content // was is not in a clean state and thus we need to ignore this // sync so that a "re-sync" will bring the chat into a clean // state again. If we would not do this a re-sync would be // ignored, see SyncChat() and // http://www.smuxi.org/issues/show/132 return; } // this method must be thread-safe as the frontend might sync // multiple chats at the same time lock (_SyncedChats) { _SyncedChats.Add(chatModel); } } public void NextProtocolManager() { Trace.Call(); CurrentProtocolManager = _Session.NextProtocolManager(CurrentProtocolManager); UpdateNetworkStatus(); } public void UpdateNetworkStatus() { if (CurrentProtocolManager != null) { SetNetworkStatus(CurrentProtocolManager.ToString()); } else { SetNetworkStatus(String.Format("({0})", _("No network connections"))); } } public void AddChat(ChatModel chat) { if (!IsSynced(chat) && _IsFrontendSynced) { _AddChat(chat); } } private void _AddChat(ChatModel chat) { f_TaskQueue.Queue(delegate { _UI.AddChat(chat); }); } [Obsolete("This method is deprecated, use AddMessageToChat(cmd.Chat, MessageModel) instead!")] public void AddTextToChat(ChatModel chat, string text) { AddMessageToChat(chat, new MessageModel(text)); } [Obsolete("This method is unsafe, use AddMessageToChat(cmd.Chat, MessageModel) instead!", true)] public void AddTextToCurrentChat(string text) { AddTextToChat(CurrentChat, text); } public void EnableChat(ChatModel chat) { f_TaskQueue.Queue(delegate { _UI.EnableChat(chat); }); } public void DisableChat(ChatModel chat) { lock (_SyncedChats) { _SyncedChats.Remove(chat); } f_TaskQueue.Queue(delegate { _UI.DisableChat(chat); }); } public void AddMessageToChat(ChatModel chat, MessageModel msg) { if (!IsSynced(chat)) { #if LOG4NET // too much logging noise //_Logger.Warn("AddMessageToChat(): chat: " + chat + " is not synced yet, ignoring call..."); #endif return; } // BUG: if the frontend is syncing this chat, he probably will lose // messages heres! _AddMessageToChat(chat, msg); } private void _AddMessageToChat(ChatModel chat, MessageModel msg) { f_TaskQueue.Queue(delegate { _UI.AddMessageToChat(chat, msg); }); } [Obsolete("This method is unsafe, use AddMessageToChat(cmd.Chat, msg) instead!", true)] public void AddMessageToCurrentChat(MessageModel msg) { AddMessageToChat(CurrentChat, msg); } public void RemoveChat(ChatModel chat) { lock (_SyncedChats) { _SyncedChats.Remove(chat); } // switch to next protocol manager if the current one was closed if (chat is ProtocolChatModel && chat.ProtocolManager == CurrentProtocolManager) { NextProtocolManager(); } f_TaskQueue.Queue(delegate { _UI.RemoveChat(chat); }); } public void SyncChat(ChatModel chat) { if (!IsSynced(chat) && _IsFrontendSynced) { _SyncChat(chat); } } private void _SyncChat(ChatModel chat) { f_TaskQueue.Queue(delegate { _UI.SyncChat(chat); }); } public void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person) { if (!IsSynced(groupChat)) { return; } _AddPersonToGroupChat(groupChat, person); } private void _AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person) { f_TaskQueue.Queue(delegate { _UI.AddPersonToGroupChat(groupChat, person); }); } public void UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { if (!IsSynced(groupChat)) { return; } _UpdatePersonInGroupChat(groupChat, oldPerson, newPerson); } private void _UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { f_TaskQueue.Queue(delegate { _UI.UpdatePersonInGroupChat(groupChat, oldPerson, newPerson); }); } public void UpdateTopicInGroupChat(GroupChatModel groupChat, MessageModel topic) { if (!IsSynced(groupChat)) { return; } _UpdateTopicInGroupChat(groupChat, topic); } private void _UpdateTopicInGroupChat(GroupChatModel groupChat, MessageModel topic) { f_TaskQueue.Queue(delegate { _UI.UpdateTopicInGroupChat(groupChat, topic); }); } public void RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person) { if (!IsSynced(groupChat)) { return; } _RemovePersonFromGroupChat(groupChat, person); } private void _RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person) { f_TaskQueue.Queue(delegate { _UI.RemovePersonFromGroupChat(groupChat, person); }); } public void SetNetworkStatus(string status) { f_TaskQueue.Queue(delegate { _UI.SetNetworkStatus(status); }); } public void SetStatus(string status) { f_TaskQueue.Queue(delegate { _UI.SetStatus(status); }); } private void _OnConfigChanged(object sender, EventArgs e) { Trace.Call(sender, e); // only push config changes once per 30 seconds if ((DateTime.UtcNow - LastConfigChange).TotalSeconds < 30) { return; } try { // DISABLED: delegate is not reliable enough, this needs to be // replaced with an IChatConfig API /* if (_ConfigChangedDelegate != null) { _ConfigChangedDelegate(); } */ } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif } LastConfigChange = DateTime.UtcNow; } /// /// This method is thread safe. /// bool IsSynced(ChatModel chatModel) { if (chatModel == null) { throw new ArgumentNullException("chatModel"); } lock (_SyncedChats) { return _SyncedChats.Contains(chatModel); } } protected virtual void OnTaskQueueExceptionEvent(object sender, TaskQueueExceptionEventArgs e) { Trace.Call(sender, e); if (e.Exception is System.Runtime.Remoting.RemotingException) { #if LOG4NET if (!_IsFrontendDisconnecting) { // we didn't expect this problem _Logger.Error("RemotingException in TaskQueue: ", e.Exception); _Logger.Error("Inner-Exception: ", e.Exception.InnerException); } #endif // TODO: setup a timer and wait up to 10 minutes to let // the frontend resume the session, after that timeout // clean it good } else { #if LOG4NET _Logger.Error("Exception in TaskQueue: ", e.Exception); _Logger.Error("Inner-Exception: ", e.Exception.InnerException); #endif } // no need to remove us from the Session here as // OnTaskQueueAbortedEvent will be raised after this and handle it } protected virtual void OnTaskQueueAbortedEvent(object sender, EventArgs e) { Trace.Call(sender, e); // we can't rely on the UI (proxy) object here, the connection is probably // gone and doesn't come back //_Session.DeregisterFrontendUI(_UI); // thus we can deregister the hardway (by using our instance) _Session.DeregisterFrontendManager(this); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } } smuxi-1.1/src/Engine/PresenceStatus.cs0000644000175000017500000000177011655545675020641 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public enum PresenceStatus { Unknown, Offline, Online, Away } } smuxi-1.1/src/Engine/Makefile.am0000664000175000017500000001175014011472672017360 0ustar00meebeymeebey00000000000000TARGET_DIR = $(top_builddir)/bin/$(PROFILE) EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ "-define:CONFIG_NINI" -define:DB4O,DB4O_8_0 ASSEMBLY = ../../bin/release/smuxi-engine.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/release/smuxi-common.dll BUILD_DIR = ../../bin/release SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize- -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET,CONFIG_NINI" -define:DB4O,DB4O_8_0 ASSEMBLY = ../../bin/debug/smuxi-engine.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/debug/smuxi-common.dll BUILD_DIR = ../../bin/debug SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif if BUNDLE_NINI_BLOB NINI_DLL_SOURCE=../../lib/Nini.dll NINI_REF_LIBS=-r:$(NINI_DLL_SOURCE) else NINI_REF_LIBS=$(NINI_LIBS) endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_COMMON_DLL) LINUX_PKGCONFIG = \ $(ENGINE_PC) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ CertificateValidator.cs \ CommandModel.cs \ Engine.cs \ FrontendManager.cs \ IFrontendUI.cs \ PermanentRemoteObject.cs \ PresenceStatus.cs \ Session.cs \ SessionManager.cs \ TextColor.cs \ TextColorContrast.cs \ TextColorPalettes.cs \ TextColorTools.cs \ MessageBuffers/Db4oMessageBuffer.cs \ MessageBuffers/IMessageBuffer.cs \ MessageBuffers/ListMessageBuffer.cs \ MessageBuffers/MessageBufferBase.cs \ MessageBuffers/MessageBufferPersistencyType.cs \ MessageBuffers/SqliteMessageBuffer.cs \ Messages/FeedMessageBuilder.cs \ Messages/MessageBuilder.cs \ Messages/MessageModel.cs \ Messages/MessagePartModel.cs \ Messages/TextMessagePartModel.cs \ Messages/UrlMessagePartModel.cs \ Messages/ImageMessagePartModel.cs \ Messages/MessageType.cs \ Messages/Dto/MessageDtoModelV1.cs \ Messages/Dto/MessageDtoModelV2.cs \ Chats/ChatType.cs \ Chats/ChatModel.cs \ Chats/GroupChatModel.cs \ Chats/PersonChatModel.cs \ Chats/SessionChatModel.cs \ Chats/ProtocolChatModel.cs \ Config/FrontendConfig.cs \ Config/NotificationAreaIconMode.cs \ Config/UserConfig.cs \ Config/Config.cs \ Config/ServerModel.cs \ Config/ServerListController.cs \ Config/UserListController.cs \ Config/FilterListController.cs \ Config/FilterModel.cs \ Config/ProxySettings.cs \ Config/ProxyType.cs \ Config/EntrySettings.cs \ Config/MessageBuilderSettings.cs \ Config/MessagePatternListController.cs \ Config/MessagePatternModel.cs \ Protocols/ProtocolManagerBase.cs \ Protocols/ProtocolManagerFactory.cs \ Protocols/ProtocolManagerInfoModel.cs \ Protocols/ProtocolManagerInfoAttribute.cs \ Protocols/IProtocolManager.cs \ Persons/PersonModel.cs \ Persons/ContactModel.cs \ Hooks/HookRunner.cs \ Hooks/Commands/HookCommand.cs \ Hooks/Commands/ProtocolManagerHookCommand.cs \ Hooks/Commands/SessionHookCommand.cs \ Hooks/Environments/ChatHookEnvironment.cs \ Hooks/Environments/CommandHookEnvironment.cs \ Hooks/Environments/HookEnvironment.cs \ Hooks/Environments/MessageHookEnvironment.cs \ Hooks/Environments/PersonHookEnvironment.cs \ Hooks/Environments/ProtocolManagerHookEnvironment.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-engine.pc.in REFERENCES = \ System \ System.Core \ System.Data \ System.Runtime.Remoting \ System.Runtime.Serialization \ System.Web \ System.Xml \ Mono.Posix \ Mono.Data.Sqlite \ $(NINI_REF_LIBS) \ $(LOG4NET_REF_LIBS) \ $(DB4O_LIBS) \ $(DB4O_INCLUDED_LIBS) DLL_REFERENCES = \ $(BUILD_DIR)/ServiceStack.Text.dll CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) include $(top_srcdir)/Makefile.include ENGINE_PC = $(BUILD_DIR)/smuxi-engine.pc SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-wrapper,ENGINE_PC,smuxi-engine.pc)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) if BUNDLE_NINI NINI_DLL = $(BUILD_DIR)/Nini.dll NINI_DLL_SOURCE = $(NINI_LIBS) PROGRAMFILES += $(NINI_DLL) $(eval $(call emit-deploy-target,NINI_DLL)) endif if BUNDLE_DB4O DB4O_INCLUDED_LIBS := $(foreach file, $(DB4O_FILES), $(TARGET_DIR)/$(file)) PROGRAMFILES += $(DB4O_INCLUDED_LIBS) endif $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) smuxi-1.1/src/Engine/Config/0000775000175000017500000000000014011526501016514 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Config/Config.cs0000664000175000017500000011154714011467170020267 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2015, 2017 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Collections; using System.Collections.Generic; using Mono.Unix.Native; #if CONFIG_NINI using Nini.Config; using Nini.Ini; #endif using Smuxi.Common; namespace Smuxi.Engine { public class Config : PermanentRemoteObject { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif //protected int m_PreferencesVersion = 0; #if CONFIG_GCONF private GConf.Client _GConf = new GConf.Client(); private string _GConfPrefix = "/apps/smuxi/"; #elif CONFIG_NINI protected string m_ConfigPath; protected IniDocument m_IniDocument; //protected IConfigSource m_IniConfigSource; //protected IConfig m_IniConfig; protected string m_IniFilename; #endif protected bool m_IsCleanConfig; protected Hashtable m_Preferences = Hashtable.Synchronized(new Hashtable()); public Version PreviousVersion { get; private set; } public Version CurrentVersion { get; private set; } public event EventHandler Changed; public object this[string key] { get { return m_Preferences[key]; } set { if (value == null) { #if LOG4NET _Logger.Error("Passed null to indexer with key: " + key + ", ignored."); #endif return; } var oldValue = m_Preferences[key]; m_Preferences[key] = value; // only raise event if the value changed if (!value.Equals(oldValue)) { if (Changed != null) { Changed(this, new ConfigChangedEventArgs(key, value)); } } } } public bool IsCleanConfig { get { return m_IsCleanConfig; } } public Config() { #if CONFIG_NINI m_ConfigPath = Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData), "smuxi"); if (!Directory.Exists(m_ConfigPath)) { Directory.CreateDirectory(m_ConfigPath); } m_IniFilename = Path.Combine(m_ConfigPath, "smuxi-engine.ini"); if (!File.Exists(m_IniFilename)) { #if LOG4NET _Logger.Debug("creating file: "+m_IniFilename); #endif File.Create(m_IniFilename).Close(); m_IsCleanConfig = true; } m_IniDocument = new IniDocument(m_IniFilename); //m_IniConfigSource = new IniConfigSource(m_IniFilename); #endif } protected T Get(string key, T defaultvalue) { #if CONFIG_DEBUG Trace.Call(key, defaultvalue); #endif string inisection = _IniGetSection(key); string inikey = _IniGetKey(key); IniSection section = m_IniDocument.Sections[inisection]; if ((section == null) || (!section.Contains(inikey))) { if (defaultvalue != null) { _Set(key, defaultvalue); } return defaultvalue; } else { // the section and key exist string strValue = section.GetValue(inikey); Type targetType = typeof(T); if (targetType == typeof(string)) { return (T)(object) strValue; } if (targetType == typeof(string[])) { return (T)(object) GetList(key); } if (targetType == typeof(MessageBufferPersistencyType)) { return (T) Enum.Parse(typeof(MessageBufferPersistencyType), strValue, true); } // handle empty booleans and integers if (targetType.IsValueType && String.IsNullOrEmpty(strValue)) { return default(T); } return (T) Convert.ChangeType(strValue, targetType); } } protected object Get(string key, object defaultvalue) { #if CONFIG_DEBUG Trace.Call(key, defaultvalue); #endif #if CONFIG_GCONF try { return _GConf.Get(_GConfPrefix+key); } catch (GConf.NoSuchKeyException) { if (defaultvalue != null) { _Set(key, defaultvalue); } return defaultvalue; } #elif CONFIG_NINI string inisection = _IniGetSection(key); string inikey = _IniGetKey(key); IniSection section = m_IniDocument.Sections[inisection]; if ((section == null) || (!section.Contains(inikey))) { if (defaultvalue != null) { _Set(key, defaultvalue); } return defaultvalue; } else { // the section and key exist return _Parse(section.GetValue(inikey)); } #endif } protected string[] GetList(string key) { string[] result = null; #if CONFIG_GCONF // Gconf# bug, it doesn't like empty string lists. result = (string[])Get(key, new string[] { String.Empty }); if (result.Length == 1 && result[0] == String.Empty) { // don't return workaround list, instead a clean empty list result = new string[] {}; } #elif CONFIG_NINI // Nini does not support native string lists, have to emulate them string result_str = Get(key, null); if (result_str != null) { if (result_str.Length > 0) { result = result_str.Split('|'); } else { result = new string[] {}; } } #endif return result; } private void _Set(string key, object valueobj) { #if CONFIG_DEBUG Trace.Call(key, valueobj); #endif #if CONFIG_GCONF _GConf.Set(_GConfPrefix+key, valueobj); #elif CONFIG_NINI string inisection = _IniGetSection(key); string inikey = _IniGetKey(key); IniSection section = m_IniDocument.Sections[inisection]; if (section == null) { m_IniDocument.Sections.Add(new IniSection(inisection)); section = m_IniDocument.Sections[inisection]; } if (valueobj is string[]) { // Nini does not support native string lists, have to emulate them section.Set(inikey, String.Join("|", (string[])valueobj)); } else { section.Set(inikey, valueobj.ToString()); } #endif } public void Load() { Trace.Call(); #if LOG4NET _Logger.Debug("Loading config"); #endif string prefix; // setting required default values prefix = "Server/"; Get(prefix+"BindAddress", "127.0.0.1"); Get(prefix+"Port", 7689); Get(prefix+"Channel", "TCP"); Get(prefix+"Formatter", "binary"); prefix = "Engine/"; var oldConfigVersion = Get(prefix+"ConfigVersion", null); if (!String.IsNullOrEmpty(oldConfigVersion)) { PreviousVersion = new Version(oldConfigVersion); } CurrentVersion = Engine.AssemblyVersion; Get(prefix+"ConfigVersion", CurrentVersion.ToString()); prefix = "Engine/Users/DEFAULT/Interface/"; Get(prefix+"ShowAdvancedSettings", false); Get(prefix+"ShowActivityCounter", true); prefix = "Engine/Users/DEFAULT/Interface/Notebook/"; Get(prefix+"TimestampFormat", "HH:mm"); Get(prefix+"TabPosition", "top"); Get(prefix+"BufferLines", 500); Get(prefix+"EngineBufferLines", 100); Get(prefix+"StripColors", false); Get(prefix+"StripFormattings", false); Get(prefix+"AutoSwitchPersonChats", false); Get(prefix+"AutoSwitchGroupChats", true); prefix = "Engine/Users/DEFAULT/Interface/Notebook/Tab/"; Get(prefix+"NoActivityColor", "#000000"); Get(prefix+"ActivityColor", "#0080FF"); Get(prefix+"EventColor", "#2020C0"); Get(prefix+"HighlightColor", "#E80000"); prefix = "Engine/Users/DEFAULT/Interface/Notebook/Channel/"; Get(prefix+"UserListPosition", "left"); Get(prefix+"TopicPosition", "top"); Get(prefix+"NickColors", true); prefix = "Engine/Users/DEFAULT/Interface/Chat/"; Get(prefix+"BackgroundColor", String.Empty); Get(prefix+"ForegroundColor", String.Empty); Get(prefix+"FontFamily", String.Empty); Get(prefix+"FontStyle", String.Empty); Get(prefix+"FontSize", 0); Get(prefix+"WrapMode", "Word"); Get(prefix+"Emojis", false); prefix = "Engine/Users/DEFAULT/Interface/Entry/"; Get(prefix+"CompletionCharacter", ":"); Get(prefix+"CommandCharacter", "/"); Get(prefix+"BashStyleCompletion", false); Get(prefix+"CommandHistorySize", 30); prefix = "Engine/Users/DEFAULT/Interface/Notification/"; Get(prefix+"NotificationAreaIconMode", "Never"); Get(prefix+"MessagingMenuEnabled", true); Get(prefix+"PopupsEnabled", true); prefix = "Engine/Users/DEFAULT/Sound/"; Get(prefix+"BeepOnHighlight", false); prefix = "Engine/Users/DEFAULT/Connection/"; Get(prefix+"Encoding", "ISO-8859-1"); Get(prefix+"AutoConvertUTF8", true); Get(prefix+"ProxyType", "System"); Get(prefix+"ProxyHostname", String.Empty); Get(prefix+"ProxyPort", -1); Get(prefix+"ProxyUsername", String.Empty); Get(prefix+"ProxyPassword", String.Empty); prefix = "Engine/Users/DEFAULT/Logging/"; Get(prefix+"Enabled", false); Get(prefix+"LogFilteredMessages", false); prefix = "Engine/Users/DEFAULT/MessageBuffer/"; Get(prefix+"PersistencyType", MessageBufferPersistencyType.PersistentSqlite.ToString()); prefix = "Engine/Users/DEFAULT/MessageBuffer/Volatile/"; Get(prefix+"MaxCapacity", 200); prefix = "Engine/Users/DEFAULT/MessageBuffer/Persistent/"; Get(prefix+"MaxCapacity", 50 * 1000); prefix = "Engine/Users/DEFAULT/Servers/"; Get(prefix + "Servers", new string[] { "IRC/irc.oftc.net", "IRC/irc.gimp.org", "IRC/irc.geekshed.net", "IRC/irc.efnet.org", "IRC/irc.ircnet.org", "IRC/irc.freenode.net" }); prefix = "Engine/Users/DEFAULT/Servers/IRC/irc.oftc.net/"; Get(prefix + "Hostname", "irc.oftc.net"); Get(prefix + "Port", 6667); Get(prefix + "Network", "OFTC"); Get(prefix + "Nickname", String.Empty); Get(prefix + "Realname", String.Empty); Get(prefix + "Username", String.Empty); Get(prefix + "Password", String.Empty); Get(prefix + "UseEncryption", false); Get(prefix + "ValidateServerCertificate", false); Get(prefix + "OnStartupConnect", true); Get(prefix + "OnConnectCommands", new string[] { "/join #smuxi", } ); prefix = "Engine/Users/DEFAULT/Servers/IRC/irc.gimp.org/"; Get(prefix + "Hostname", "irc.gimp.org"); Get(prefix + "Port", 6667); Get(prefix + "Network", "GIMPNet"); Get(prefix + "Nickname", String.Empty); Get(prefix + "Realname", String.Empty); Get(prefix + "Username", String.Empty); Get(prefix + "Password", String.Empty); Get(prefix + "UseEncryption", false); Get(prefix + "ValidateServerCertificate", false); prefix = "Engine/Users/DEFAULT/Servers/IRC/irc.geekshed.net/"; Get(prefix + "Hostname", "irc.geekshed.net"); Get(prefix + "Port", 6667); Get(prefix + "Network", "GeekShed"); Get(prefix + "Nickname", String.Empty); Get(prefix + "Realname", String.Empty); Get(prefix + "Username", String.Empty); Get(prefix + "Password", String.Empty); Get(prefix + "UseEncryption", false); Get(prefix + "ValidateServerCertificate", false); prefix = "Engine/Users/DEFAULT/Servers/IRC/irc.efnet.org/"; Get(prefix + "Hostname", "irc.efnet.org"); Get(prefix + "Port", 6667); Get(prefix + "Network", "EFnet"); Get(prefix + "Nickname", String.Empty); Get(prefix + "Realname", String.Empty); Get(prefix + "Username", String.Empty); Get(prefix + "Password", String.Empty); Get(prefix + "UseEncryption", false); Get(prefix + "ValidateServerCertificate", false); prefix = "Engine/Users/DEFAULT/Servers/IRC/irc.ircnet.org/"; Get(prefix + "Hostname", "irc.ircnet.org"); Get(prefix + "Port", 6667); Get(prefix + "Network", "IRCnet"); Get(prefix + "Nickname", String.Empty); Get(prefix + "Realname", String.Empty); Get(prefix + "Username", String.Empty); Get(prefix + "Password", String.Empty); Get(prefix + "UseEncryption", false); Get(prefix + "ValidateServerCertificate", false); prefix = "Engine/Users/DEFAULT/Servers/IRC/irc.freenode.net/"; Get(prefix + "Hostname", "irc.freenode.net"); Get(prefix + "Port", 6667); Get(prefix + "Network", "freenode"); Get(prefix + "Nickname", String.Empty); Get(prefix + "Realname", String.Empty); Get(prefix + "Username", String.Empty); Get(prefix + "Password", String.Empty); Get(prefix + "UseEncryption", false); Get(prefix + "ValidateServerCertificate", false); prefix = "Engine/Users/"; Get(prefix+"Users", new string[] { "local" }); /* prefix = "Engine/Users/local/"; Get(prefix+"Password", String.Empty); prefix = "Engine/Users/local/Servers/"; Get(prefix+"Servers", new string[] {}); */ prefix = "Server/"; LoadEntry(prefix+"Port", 7689); LoadEntry(prefix+"Formatter", "binary"); LoadEntry(prefix+"Channel", "TCP"); LoadEntry(prefix+"BindAddress", null); // loading defaults LoadAllEntries("Engine/Users/DEFAULT"); // are we upgrading from <= 1.0? if (String.IsNullOrEmpty(oldConfigVersion) || new Version(oldConfigVersion) < new Version(1, 0)) { // change default value to PersistentSqlite SetUserEntry("DEFAULT", "MessageBuffer/PersistencyType", MessageBufferPersistencyType.PersistentSqlite.ToString()); } prefix = "Engine/Users/"; string[] users = GetList(prefix+"Users"); m_Preferences[prefix + "Users"] = users; foreach (string user in users) { LoadUserEntry(user, "Password", "smuxi"); string[] startup_commands = GetList(prefix+user+"/OnStartupCommands"); if (startup_commands != null) { m_Preferences[prefix+user+"/OnStartupCommands"] = startup_commands; } else { m_Preferences[prefix+user+"/OnStartupCommands"] = new string[] {}; } string[] nick_list = GetList(prefix+user+"/Connection/Nicknames"); if (nick_list != null) { m_Preferences[prefix+user+"/Connection/Nicknames"] = nick_list; } else { string nick = Environment.UserName; // clean typical disallowed characters nick = nick.Replace(" ", String.Empty); if (String.IsNullOrEmpty(nick)) { nick = "Smuxi"; } m_Preferences[prefix+user+"/Connection/Nicknames"] = new string[] { nick }; } LoadUserEntry(user, "Connection/Username", String.Empty); string realname = null; try { string gecos = Mono.Unix.UnixUserInfo.GetRealUser().RealName; if (gecos == null) { gecos = String.Empty; } int pos = gecos.IndexOf(","); if (pos != -1) { realname = gecos.Substring(0, pos); } else { realname = gecos; } } catch (Exception ex) { #if LOG4NET _Logger.Warn("Load(): error getting realname from gecos (ignoring)", ex); #endif } if (String.IsNullOrEmpty(realname)) { realname = "Your Name"; } realname = "Your Name"; LoadUserEntry(user, "Connection/Realname", realname); LoadUserEntry(user, "Connection/Encoding", String.Empty); if (Get(prefix+user+"/Connection/AutoConvertUTF8", null) == null) { // upgrade path var enc = Get(prefix+user+"/Connection/Encoding", String.Empty); if (((enc == String.Empty) && (System.Text.Encoding.Default.WebName.ToUpper() == "UTF-8")) || (enc.ToUpper() == "UTF-8")) { this[prefix+user+"/Connection/Encoding"] = "ISO-8859-1"; this[prefix+user+"/Connection/AutoConvertUTF8"] = true; } } LoadUserEntry(user, "Connection/AutoConvertUTF8", true); LoadUserEntry(user, "Connection/ProxyType", "System"); LoadUserEntry(user, "Connection/ProxyHostname", String.Empty); LoadUserEntry(user, "Connection/ProxyPort", -1); LoadUserEntry(user, "Connection/ProxyUsername", null); LoadUserEntry(user, "Connection/ProxyPassword", null); string[] command_list = GetList(prefix+user+"/Connection/OnConnectCommands"); if (command_list != null) { m_Preferences[prefix+user+"/Connection/OnConnectCommands"] = command_list; } else { m_Preferences[prefix+user+"/Connection/OnConnectCommands"] = new string[] {}; } string[] highlight_words = GetList(prefix+user+"/Interface/Chat/HighlightWords"); if (highlight_words != null) { m_Preferences[prefix+user+"/Interface/Chat/HighlightWords"] = highlight_words; } else { m_Preferences[prefix+user+"/Interface/Chat/HighlightWords"] = new string[] {}; } LoadUserEntry(user, "Interface/ShowAdvancedSettings", null); LoadUserEntry(user, "Interface/ShowActivityCounter", null); LoadUserEntry(user, "Interface/Notebook/TimestampFormat", null); LoadUserEntry(user, "Interface/Notebook/TabPosition", null); LoadUserEntry(user, "Interface/Notebook/BufferLines", null); LoadUserEntry(user, "Interface/Notebook/EngineBufferLines", null); LoadUserEntry(user, "Interface/Notebook/StripColors", null); LoadUserEntry(user, "Interface/Notebook/StripFormattings", null); LoadUserEntry(user, "Interface/Notebook/AutoSwitchPersonChats", null); LoadUserEntry(user, "Interface/Notebook/AutoSwitchGroupChats", null); LoadUserEntry(user, "Interface/Notebook/Tab/NoActivityColor", null); LoadUserEntry(user, "Interface/Notebook/Tab/ActivityColor", null); LoadUserEntry(user, "Interface/Notebook/Tab/EventColor", null); LoadUserEntry(user, "Interface/Notebook/Tab/HighlightColor", null); LoadUserEntry(user, "Interface/Notebook/Channel/UserListPosition", null); LoadUserEntry(user, "Interface/Notebook/Channel/TopicPosition", null); LoadUserEntry(user, "Interface/Notebook/Channel/NickColors", null); LoadUserEntry(user, "Interface/Chat/ForegroundColor", null); LoadUserEntry(user, "Interface/Chat/BackgroundColor", null); LoadUserEntry(user, "Interface/Chat/FontFamily", null); LoadUserEntry(user, "Interface/Chat/FontStyle", null); LoadUserEntry(user, "Interface/Chat/FontSize", null); LoadUserEntry(user, "Interface/Chat/WrapMode", null); LoadUserEntry(user, "Interface/Chat/Emojis", null); LoadUserEntry(user, "Interface/Entry/CompletionCharacter", null); LoadUserEntry(user, "Interface/Entry/CommandCharacter", null); LoadUserEntry(user, "Interface/Entry/BashStyleCompletion", null); LoadUserEntry(user, "Interface/Entry/CommandHistorySize", null); LoadUserEntry(user, "Interface/Notification/NotificationAreaIconMode", null); LoadUserEntry(user, "Interface/Notification/MessagingMenuEnabled", null); LoadUserEntry(user, "Interface/Notification/PopupsEnabled", null); LoadUserEntry(user, "Sound/BeepOnHighlight", null); LoadUserEntry(user, "Logging/Enabled", null); LoadUserEntry(user, "Logging/LogFilteredMessages", null); var persistencyKey = "MessageBuffer/PersistencyType"; LoadUserEntry(user, persistencyKey , null); // are we upgrading from < 1.0? if (String.IsNullOrEmpty(oldConfigVersion) || new Version(oldConfigVersion) < new Version(1, 0)) { // migrate all users automatically to SQLite SetUserEntry(user, persistencyKey, MessageBufferPersistencyType.PersistentSqlite.ToString()); } LoadUserEntry(user, "MessageBuffer/Volatile/MaxCapacity", null); LoadUserEntry(user, "MessageBuffer/Persistent/MaxCapacity", null); string[] servers = null; string sprefix = prefix + user + "/Servers/"; servers = GetList(sprefix + "Servers"); if (servers == null) { // this user has no servers string dprefix = prefix + "DEFAULT/Servers/"; servers = GetList(dprefix + "Servers"); if (servers == null) { // no default servers, use empty list servers = new string[] {}; } else { // we have default servers, so lets copy them foreach (string server in servers) { LoadEntry(sprefix + server + "/Hostname", Get(dprefix + server + "/Hostname", null)); LoadEntry(sprefix + server + "/Port", Get(dprefix + server + "/Port", null)); LoadEntry(sprefix + server + "/Network", Get(dprefix + server + "/Network", null)); LoadEntry(sprefix + server + "/Encoding", Get(dprefix + server + "/Encoding", null)); LoadEntry(sprefix + server + "/AutoConvertUTF8", Get(dprefix + server + "/AutoConvertUTF8", null)); LoadEntry(sprefix + server + "/Nickname", Get(dprefix + server + "/Nickname", null)); LoadEntry(sprefix + server + "/Realname", Get(dprefix + server + "/Realname", null)); LoadEntry(sprefix + server + "/Username", Get(dprefix + server + "/Username", null)); LoadEntry(sprefix + server + "/Password", Get(dprefix + server + "/Password", null)); LoadEntry(sprefix + server + "/UseEncryption", Get(dprefix + server + "/UseEncryption", null)); LoadEntry(sprefix + server + "/ValidateServerCertificate", Get(dprefix + server + "/ValidateServerCertificate", null)); LoadEntry(sprefix + server + "/OnStartupConnect", Get(dprefix + server + "/OnStartupConnect", null)); LoadEntry(sprefix + server + "/OnConnectCommands", Get(dprefix + server + "/OnConnectCommands", null)); } } m_Preferences[sprefix + "Servers"] = servers; } else { // this user has servers m_Preferences[sprefix + "Servers"] = servers; } foreach (string server in servers) { sprefix = prefix + user + "/Servers/" + server + "/"; LoadEntry(sprefix+"Hostname", null); LoadEntry(sprefix+"Port", null); LoadEntry(sprefix+"Network", String.Empty); LoadEntry(sprefix+"Encoding", null); LoadEntry(sprefix+"AutoConvertUTF8", null); LoadEntry(sprefix+"Nickname", String.Empty); LoadEntry(sprefix+"Realname", String.Empty); LoadEntry(sprefix+"Username", String.Empty); LoadEntry(sprefix+"Password", String.Empty); LoadEntry(sprefix+"UseEncryption", false); LoadEntry(sprefix+"ValidateServerCertificate", false); LoadEntry(sprefix+"ClientCertificateFilename", String.Empty); LoadEntry(sprefix+"OnStartupConnect", false); string[] commands = GetList(sprefix + "OnConnectCommands"); if (commands == null) { commands = new string[] {}; m_Preferences[sprefix + "OnConnectCommands"] = new string[] {}; } else { m_Preferences[sprefix + "OnConnectCommands"] = commands; } // HACK: XMPP specific values LoadEntry(sprefix+"Resource", null); LoadEntry(sprefix+"PriorityAvailable", null); LoadEntry(sprefix+"PriorityAway", null); } string[] filters = null; string cprefix = "Filters/"; filters = GetList(prefix + user + "/" + cprefix + "Filters"); if (filters == null) { filters = new string[] {}; m_Preferences[prefix + user + "/" + cprefix + "Filters"] = new string[] {}; } else { m_Preferences[prefix + user + "/" + cprefix + "Filters"] = filters; } foreach (string filter in filters) { cprefix = "Filters/" + filter + "/"; LoadUserEntry(user, cprefix + "Protocol", null); LoadUserEntry(user, cprefix + "NetworkID", null); LoadUserEntry(user, cprefix + "ChatType", null); LoadUserEntry(user, cprefix + "ChatID", null); LoadUserEntry(user, cprefix + "MessageType", null); LoadUserEntry(user, cprefix + "MessagePattern", null); } string lprefix = "MessagePatterns/"; var linkKeys = GetList(prefix + user + "/" + lprefix + "MessagePatterns"); if (linkKeys == null) { linkKeys = new string[] {}; m_Preferences[prefix + user + "/" + lprefix + "MessagePatterns"] = new string[] {}; } else { m_Preferences[prefix + user + "/" + lprefix + "MessagePatterns"] = linkKeys; } foreach (var linkKey in linkKeys) { lprefix = "MessagePatterns/" + linkKey + "/"; LoadUserEntry(user, lprefix + "MessagePartPattern", String.Empty); LoadUserEntry(user, lprefix + "MessagePartType", String.Empty); LoadUserEntry(user, lprefix + "LinkFormat", String.Empty); LoadUserEntry(user, lprefix + "TextFormat", String.Empty); } } } public IDictionary GetAll() { lock (m_Preferences) { var dict = new Dictionary(m_Preferences.Count); foreach (DictionaryEntry entry in m_Preferences) { dict.Add((string) entry.Key, entry.Value); } return dict; } } public void SetAll(IEnumerable> settings) { if (settings == null) { throw new ArgumentNullException("settings"); } lock (m_Preferences) { foreach (var setting in settings) { this[setting.Key] = setting.Value; } } } public void Save() { Trace.Call(); #if LOG4NET _Logger.Debug("Saving config"); #endif // update values in backend foreach (string key in m_Preferences.Keys) { object obj = m_Preferences[key]; _Set(key, obj); } #if CONFIG_GCONF _GConf.SuggestSync(); #elif CONFIG_NINI // StreamWriter sr = File.CreateText(m_IniFilename); // m_IniDocument.Save(sr); m_IniDocument.Save(m_IniFilename); #endif } public void Remove(string key) { #if CONFIG_DEBUG Trace.Call(key); #endif bool isSection = false; if (key.EndsWith("/")) { isSection = true; ArrayList keys = new ArrayList(m_Preferences.Keys); foreach (string pkey in keys) { if (pkey.StartsWith(key)) { m_Preferences.Remove(pkey); } } } else { m_Preferences.Remove(key); } #if CONFIG_GCONF //_GConf. #elif CONFIG_NINI string iniSection = _IniGetSection(key); string iniKey = _IniGetKey(key); if (isSection) { m_IniDocument.Sections.Remove(iniSection); } else { if (m_IniDocument.Sections[key] == null) { return; } m_IniDocument.Sections[key].Remove(key); } #endif if (Changed != null) { Changed(this, new ConfigChangedEventArgs(key, null)); } } protected string GetUserKey(string user, string key) { var prefix = "Engine/Users/"; var ukey = prefix+user+"/"+key; return ukey; } [Obsolete] protected object GetUserEntry(string user, string key, object defaultvalue) { var ukey = GetUserKey(user, key); return Get(ukey, defaultvalue); } protected T GetUserEntry(string user, string key, T defaultvalue) { var ukey = GetUserKey(user, key); return Get(ukey, defaultvalue); } protected void SetUserEntry(string user, string key, object value) { #if CONFIG_DEBUG Trace.Call(user, key, value); #endif var ukey = GetUserKey(user, key); m_Preferences[ukey] = value; } protected void LoadUserEntry(string user, string key, object defaultvalue) { #if CONFIG_DEBUG Trace.Call(user, key, defaultvalue); #endif object obj; if (defaultvalue is string) { obj = GetUserEntry(user, key, (string) defaultvalue); } else if (defaultvalue is bool) { obj = GetUserEntry(user, key, (bool) defaultvalue); } else { obj = GetUserEntry(user, key, defaultvalue); } if (obj != null) { SetUserEntry(user, key, obj); } } protected void LoadEntry(string key, object defaultvalue) { #if CONFIG_DEBUG Trace.Call(key, defaultvalue); #endif object obj; if (defaultvalue is string) { obj = Get(key, (string) defaultvalue); } else { obj = Get(key, defaultvalue); } if (obj != null) { m_Preferences[key] = obj; } } protected void LoadAllEntries(string basepath) { Trace.Call(basepath); #if CONFIG_GCONF // TODO: GConf# has no way yet to get the sub-paths of a given path! // So we have to use Nini as primary config backend for now... #elif CONFIG_NINI foreach (DictionaryEntry dec in m_IniDocument.Sections) { IniSection inisection = (IniSection)dec.Value; if (inisection.Name.StartsWith(basepath)) { foreach (string key in inisection.GetKeys()) { m_Preferences[inisection.Name+"/"+key] = _Parse(inisection.GetValue(key)); } } } #endif } #if CONFIG_NINI private object _Parse(string data) { // since INI files are plain text, all data will be string, // must convert here when possible (via guessing) try { int number = Int32.Parse(data); return number; } catch (FormatException) { } try { bool boolean = Boolean.Parse(data); return boolean; } catch (FormatException) { } // no convert worked, let's leave it as string return data; } private string _IniGetKey(string key) { string[] keys = key.Split(new char[] {'/'}); // nothing but the last part string inikey = String.Join("/", keys, keys.Length - 1, 1); return inikey; } private string _IniGetSection(string key) { string[] keys = key.Split(new char[] {'/'}); // everything except the last part string inisection = String.Join("/", keys, 0, keys.Length - 1); return inisection; } #endif } public class ConfigChangedEventArgs : EventArgs { public string Key { get; private set; } public object Value { get; private set; } public ConfigChangedEventArgs(string key, object value) { Key = key; Value = value; } } } smuxi-1.1/src/Engine/Config/UserConfig.cs0000664000175000017500000002113014011467170021112 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2010-2011, 2013, 2015, 2017 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Remoting; using System.Collections; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public class UserConfig : PermanentRemoteObject, IEnumerable> { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private Config _Config; private string _UserPrefix; private string _DefaultPrefix = "Engine/Users/DEFAULT/"; private Hashtable _Cache; public FrontendConfig FrontendConfig { get; set; } public event EventHandler Changed; public bool IsCaching { get { return _Cache != null; } set { if (value) { _Cache = new Hashtable(); } else { _Cache = null; } } } /// /// This property is thread-safe. /// public object this[string key] { get { object obj = null; // allow engine config to be overriden by frontend config if (FrontendConfig != null) { obj = FrontendConfig[key]; if (obj != null) { return obj; } } if (IsCaching) { if (_Cache.Contains(key)) { return _Cache[key]; } } obj = _Config[_UserPrefix + key]; if (obj != null) { if (IsCaching) { _Cache[key] = obj; } return obj; } obj = _Config[_DefaultPrefix + key]; #if LOG4NET if (obj == null) { _Logger.Error("get_Item[]: default value is null for key: " + key); } #endif if (IsCaching) { _Cache[key] = obj; } return obj; } set { Set(key, value); } } public UserConfig(Config config, string username) { _Config = config; // HACK: The Changed event was introduced in 0.7.2, for backwards // compatibility with 0.7.x server we need to suppress remoting // exceptions here try { // we can't use events over remoting if (!RemotingServices.IsTransparentProxy(config)) { _Config.Changed += OnConfigChanged; } } catch (Exception ex) { #if LOG4NET _Logger.Warn( "UserConfig() registration of Config.Changed event failed, " + "ignoring for backwards compatibility with 0.7.x servers...", ex ); #endif } _UserPrefix = "Engine/Users/"+username+"/"; } public void ClearCache() { if (IsCaching) { #if LOG4NET _Logger.Debug("Clearing cache"); #endif _Cache.Clear(); } } void Set(string key, object value) { if (key == null) { throw new ArgumentNullException("key"); } if (value == null) { throw new ArgumentNullException("value"); } // ignore writing back overridden config keys if (FrontendConfig != null && FrontendConfig[key] != null) { return; } // TODO: make remoting calls after a timeout and batch the update _Config[_UserPrefix + key] = value; // update entry in cache if (IsCaching) { _Cache[key] = value; } } public void SetAll(IEnumerable> settings) { if (settings == null) { throw new ArgumentNullException("settings"); } var filteredSettings = new Dictionary(); foreach (var setting in settings) { // ignore writing back overridden settings in the frontend config if (FrontendConfig != null && FrontendConfig[setting.Key] != null) { continue; } filteredSettings.Add(setting.Key, setting.Value); // update entry in cache if (IsCaching) { _Cache[setting.Key] = setting.Value; } } // REMOTING CALL _Config.SetAll(filteredSettings); } public void Remove(string key) { _Config.Remove(_UserPrefix + key); if (!IsCaching) { return; } if (key.EndsWith("/")) { // invalidate all cache keys of this section var cachedKeys = new List(); foreach (string cacheKey in _Cache.Keys) { if (cacheKey.StartsWith(key)) { cachedKeys.Add(cacheKey); } } foreach (string cacheKey in cachedKeys) { _Cache.Remove(cacheKey); } } else { // deleting the single entry is enough _Cache.Remove(key); } } public void Save() { _Config.Save(); } public void SyncCache() { Trace.Call(); if (!IsCaching) { return; } var start = DateTime.UtcNow; var conf = _Config.GetAll(); var cache = Hashtable.Synchronized(new Hashtable(conf.Count)); foreach (var entry in conf) { if (!entry.Key.StartsWith(_UserPrefix)) { // no need to cache values of other users continue; } // remove user prefix from key var userKey = entry.Key.Substring(_UserPrefix.Length); cache.Add(userKey, entry.Value); } var stop = DateTime.UtcNow; #if LOG4NET _Logger.Debug( String.Format( "SyncCache(): syncing config took: {0:0.00} ms", (stop - start).TotalMilliseconds ) ); #endif _Cache = cache; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator> GetEnumerator() { foreach (var entry in _Config.GetAll()) { if (!entry.Key.StartsWith(_UserPrefix)) { continue; } // remove user prefix from key var userKey = entry.Key.Substring(_UserPrefix.Length); yield return new KeyValuePair(userKey, entry.Value); } } void OnConfigChanged(object sender, ConfigChangedEventArgs e) { if (Changed == null) { // no listeners return; } if (!e.Key.StartsWith(_UserPrefix)) { // setting for some other user has changed return; } var key = e.Key.Substring(_UserPrefix.Length); Changed(this, new ConfigChangedEventArgs(key, e.Value)); } } } smuxi-1.1/src/Engine/Config/NotificationAreaIconMode.cs0000644000175000017500000000240411655545675023726 0ustar00meebeymeebey00000000000000/* * $Id: FrontendConfig.cs 427 2008-09-27 23:50:51Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config/FrontendConfig.cs $ * $Rev: 427 $ * $Author: meebey $ * $Date: 2008-09-28 01:50:51 +0200 (Sun, 28 Sep 2008) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Engine { public enum NotificationAreaIconMode { Never, Always, Minimized, Closed } } smuxi-1.1/src/Engine/Config/ServerListController.cs0000644000175000017500000001666512250426634023236 0ustar00meebeymeebey00000000000000/* * $Id: PreferencesDialog.cs 142 2007-01-02 22:19:08Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/PreferencesDialog.cs $ * $Rev: 142 $ * $Author: meebey $ * $Date: 2007-01-02 23:19:08 +0100 (Tue, 02 Jan 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public class ServerListController { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-engine"; private UserConfig _UserConfig; public ServerListController(UserConfig userConfig) { if (userConfig == null) { throw new ArgumentNullException("userConfig"); } _UserConfig = userConfig; } public IList GetServerList() { // load user servers string[] servers = (string[]) _UserConfig["Servers/Servers"]; IList serverList = new List(); if (servers == null) { return serverList; } foreach (string server in servers) { string[] serverParts = server.Split(new char[] {'/'}); string protocol = serverParts[0]; string serverId = serverParts[1]; ServerModel ser = GetServer(protocol, serverId); if (ser == null) { #if LOG4NET _Logger.Error("GetServerList(): GetServer(" + protocol + ", " + serverId +") returned null! ignoring..."); #endif continue; } serverList.Add(ser); } return serverList; } public ServerModel GetServer(string protocol, string servername) { Trace.Call(protocol, servername); if (protocol == null) { throw new ArgumentNullException("protocol"); } if (servername == null) { throw new ArgumentNullException("servername"); } ServerModel server = new ServerModel(); try { server.Load(_UserConfig, protocol, servername); } catch (ArgumentException) { return null; } return server; } public IList GetNetworks() { Trace.Call(); IList networks = new List(); IList servers = GetServerList(); foreach (ServerModel server in servers) { if (!networks.Contains(server.Network)) { networks.Add(server.Network); } } return networks; } public ServerModel GetServerByNetwork(string network) { Trace.Call(network); if (network == null) { throw new ArgumentNullException("network"); } if (network.Trim().Length == 0) { throw new InvalidOperationException(_("Network must not be empty.")); } var servers = GetServerList(); foreach (var server in servers) { if (String.Compare(server.Network, network, true) == 0) { return server; } } return null; } public void AddServer(ServerModel server) { Trace.Call(server); if (server == null) { throw new ArgumentNullException("server"); } if (String.IsNullOrEmpty(server.Hostname)) { throw new InvalidOperationException(_("Server hostname must not be empty.")); } if (server.Hostname.Contains("\n")) { throw new InvalidOperationException(_("Server hostname contains invalid characters (newline).")); } var highestServerId = -1; foreach (var s in GetServerList()) { if (s.Protocol == server.Protocol && s.ServerID == server.ServerID) { throw new InvalidOperationException( String.Format(_("Server ID '{0}' already exists."), server.ServerID) ); } int id; if (Int32.TryParse(s.ServerID, out id) && id > highestServerId) { highestServerId = id; } } if (String.IsNullOrEmpty(server.ServerID)) { server.ServerID = (++highestServerId).ToString(); } server.Save(_UserConfig); string[] servers = (string[]) _UserConfig["Servers/Servers"]; if (servers == null) { servers = new string[] {}; } List serverList = new List(servers); serverList.Add(server.Protocol + "/" + server.ServerID); _UserConfig["Servers/Servers"] = serverList.ToArray(); } public void SetServer(ServerModel server) { Trace.Call(server); if (server == null) { throw new ArgumentNullException("server"); } server.Save(_UserConfig); } public void RemoveServer(string protocol, string servername) { Trace.Call(protocol, servername); if (protocol == null) { throw new ArgumentNullException("protocol"); } if (servername == null) { throw new ArgumentNullException("servername"); } string server = "Servers/" + protocol + "/" + servername + "/"; _UserConfig.Remove(server); string[] servers = (string[]) _UserConfig["Servers/Servers"]; if (servers == null) { servers = new string[] {}; } List serverList = new List(servers); int idx = serverList.IndexOf(protocol + "/" + servername); serverList.RemoveAt(idx); _UserConfig["Servers/Servers"] = serverList.ToArray(); } public void Save() { _UserConfig.Save(); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } } smuxi-1.1/src/Engine/Config/FilterModel.cs0000664000175000017500000000247114011467170021263 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2010, 2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Common; namespace Smuxi.Engine { public class FilterModel { public string Protocol { get; set; } public string NetworkID { get; set; } public string ChatID { get; set; } public ChatType? ChatType { get; set; } public MessageType? MessageType { get; set; } public string MessagePattern { get; set; } } } smuxi-1.1/src/Engine/Config/EntrySettings.cs0000644000175000017500000000372211700531605021672 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class EntrySettings { public string CommandCharacter { get; set; } public string CompletionCharacter { get; set; } public bool BashStyleCompletion { get; set; } public int CommandHistorySize { get; set; } public EntrySettings() { // internal defaults CommandCharacter = "/"; CompletionCharacter = ":"; BashStyleCompletion = false; CommandHistorySize = 30; } public void ApplyConfig(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } CommandCharacter = (string) config["Interface/Entry/CommandCharacter"]; CompletionCharacter = (string) config["Interface/Entry/CompletionCharacter"]; BashStyleCompletion = (bool) config["Interface/Entry/BashStyleCompletion"]; CommandHistorySize = (int) config["Interface/Entry/CommandHistorySize"]; } } } smuxi-1.1/src/Engine/Config/ProxyType.cs0000644000175000017500000000202111700531610021016 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public enum ProxyType { None, System, Http, Socks4, Socks4a, Socks5 } } smuxi-1.1/src/Engine/Config/MessagePatternListController.cs0000644000175000017500000001072312726351313024676 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2014 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Engine { public class MessagePatternListController { UserConfig UserConfig { get; set; } protected string[] PatternIDs { get { return (string[]) UserConfig["MessagePatterns/MessagePatterns"]; } set { UserConfig["MessagePatterns/MessagePatterns"] = value; } } public MessagePatternListController(UserConfig userConfig) { if (userConfig == null) { throw new ArgumentNullException("userConfig"); } UserConfig = userConfig; } public List GetList() { var keys = PatternIDs; var list = new List(keys.Length); if (keys == null) { return list; } foreach (var key in keys) { int parsedKey = Int32.Parse(key); var link = Get(parsedKey); if (link == null) { continue; } list.Add(link); } return list; } public MessagePatternModel Get(int id) { Trace.Call(id); string prefix = "MessagePatterns/" + id + "/"; if (UserConfig[prefix + "MessagePartPattern"] == null) { // link does not exist return null; } var link = new MessagePatternModel(id); link.Load(UserConfig); return link; } public int Add(MessagePatternModel link) { return Add(link, -1); } public int Add(MessagePatternModel link, int id) { Trace.Call(link, id); if (link == null) { throw new ArgumentNullException("link"); } string[] keys = PatternIDs; if (keys == null) { keys = new string[] {}; } int highestKey = 0; int newKey = id; if (id == -1) { foreach (string key in keys) { int parsedKey = Int32.Parse(key); if (parsedKey > highestKey) { highestKey = parsedKey; } } newKey = ++highestKey; } link.ID = newKey; link.Save(UserConfig); var keyList = new List(keys); keyList.Add(link.ID.ToString()); PatternIDs = keyList.ToArray(); return newKey; } public void Set(MessagePatternModel link) { Trace.Call(link); if (link == null) { throw new ArgumentNullException("link"); } link.Save(UserConfig); } public void Remove(int key) { Trace.Call(key); string section = "MessagePatterns/" + key + "/"; string[] keys = PatternIDs; if (keys == null) { keys = new string[] {}; } var keyList = new List(keys); int idx = keyList.IndexOf(key.ToString()); if (idx == -1) { // key not found return; } keyList.RemoveAt(idx); UserConfig.Remove(section); PatternIDs = keyList.ToArray(); } public void Save() { Trace.Call(); UserConfig.Save(); } } } smuxi-1.1/src/Engine/Config/ProxySettings.cs0000644000175000017500000001736412253423337021727 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Net; using System.Text.RegularExpressions; using System.Collections.Generic; namespace Smuxi.Engine { public class ProxySettings { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public ProxyType ProxyType { get; set; } public string ProxyHostname { get; set; } public int ProxyPort { get; set; } public string ProxyUsername { get; set; } public string ProxyPassword { get; set; } public IWebProxy SystemWebProxy { get; set; } public WebProxy DefaultWebProxy { get; set; } static ProxySettings() { try { WorkaroundNoProxyMonoBug(); } catch { } } public ProxySettings() { ProxyType = ProxyType.None; } public WebProxy GetWebProxy(Uri destination) { if (destination == null) { throw new ArgumentNullException("destination"); } if (SystemWebProxy == null && DefaultWebProxy == null) { #if LOG4NET f_Logger.DebugFormat("GetWebProxy(<{0}>): returning no proxy", destination); #endif // no proxy return null; } if (SystemWebProxy == null) { if (DefaultWebProxy.Address.Scheme.StartsWith("socks") && destination.Scheme.StartsWith("http")) { #if LOG4NET f_Logger.DebugFormat("GetWebProxy(<{0}>): ignoring " + "SOCKS proxy for HTTP destination: {1}", destination, DefaultWebProxy.Address); #endif return null; } #if LOG4NET f_Logger.DebugFormat("GetWebProxy(<{0}>): returning default proxy: {1}", destination, DefaultWebProxy.Address); #endif return DefaultWebProxy; } var proxyUri = SystemWebProxy.GetProxy(destination); if (proxyUri == destination) { #if LOG4NET f_Logger.DebugFormat("GetWebProxy(<{0}>): returning no proxy", destination); #endif // no proxy return null; } #if LOG4NET f_Logger.DebugFormat("GetWebProxy(<{0}>): returning system proxy: {1}", destination, proxyUri); #endif return new WebProxy(proxyUri); } public WebProxy GetWebProxy(string destination) { if (destination == null) { throw new ArgumentNullException("destination"); } return GetWebProxy(new Uri(destination)); } public void ApplyConfig(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } var proxyType = (string) config["Connection/ProxyType"]; ProxyType = (ProxyType) Enum.Parse(typeof(ProxyType), proxyType, true); ProxyHostname = (string) config["Connection/ProxyHostname"]; ProxyPort = (int) config["Connection/ProxyPort"]; ProxyUsername = (string) config["Connection/ProxyUsername"]; ProxyPassword = (string) config["Connection/ProxyPassword"]; switch (ProxyType) { case ProxyType.None: DefaultWebProxy = null; SystemWebProxy = null; break; case ProxyType.System: // TODO: add GNOME (gconf) support var no_proxy = Environment.GetEnvironmentVariable("no_proxy"); var proxy = WebRequest.GetSystemWebProxy(); if (!String.IsNullOrEmpty(no_proxy) && proxy is WebProxy) { var webProxy = (WebProxy) proxy; // BypassArrayList expects regexes while no_proxy // contains domains var bypassUriRegexes = new List(); foreach (var domain in no_proxy.Split(',')) { string domainRegex = null; if (domain.StartsWith(".")) { domainRegex = String.Format( @"^[a-z]+://(.+\.)?{0}", Regex.Escape(domain.Substring(1)) ); } else if (!Regex.IsMatch(domain, @"^[a-z]+://")) { domainRegex = String.Format( @"^[a-z]+://{0}", Regex.Escape(domain) ); } else { domainRegex = Regex.Escape(domain); } bypassUriRegexes.Add(domainRegex); } webProxy.BypassArrayList.AddRange(bypassUriRegexes); } DefaultWebProxy = null; SystemWebProxy = proxy; break; default: var uriBuilder = new UriBuilder(); uriBuilder.Scheme = ProxyType.ToString().ToLower(); uriBuilder.Host = ProxyHostname; uriBuilder.Port = ProxyPort; uriBuilder.UserName = ProxyUsername; uriBuilder.Password = ProxyPassword; var proxyUri = uriBuilder.ToString(); DefaultWebProxy = new WebProxy(proxyUri); SystemWebProxy = null; break; } } static void WorkaroundNoProxyMonoBug() { // HACK: workaround bug in Mono 2.10.8 throwing // ArgumentOutOfRangeException because it always tries to remove // *.local from the no_proxy envrionment variable, see: // https://www.smuxi.org/issues/show/873 var no_proxy = Environment.GetEnvironmentVariable("no_proxy"); if (no_proxy == null) { // nothing to workaround return; } try { WebRequest.GetSystemWebProxy(); } catch (ArgumentOutOfRangeException) { #if LOG4NET f_Logger.Debug("WorkaroundNoProxyMonoBug(): enabling no_proxy workaround..."); #endif if (!no_proxy.Contains("*.local")) { var no_proxy_with_local = no_proxy + ",*.local"; Environment.SetEnvironmentVariable("no_proxy", no_proxy_with_local); } } } } } smuxi-1.1/src/Engine/Config/ServerModel.cs0000664000175000017500000002522714011467170021310 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010, 2012-2014, 2017-2018 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class ServerModel : ISerializable { public bool UseEncryption { get; set; } public bool ValidateServerCertificate { get; set; } public string ClientCertificateFilename { get; set; } public string Protocol { get; set; } public string Hostname { get; set; } public int Port { get; set; } public string Network { get; set; } public string Nickname { get; set; } public string Realname { get; set; } public string Username { get; set; } public string Password { get; set; } public bool OnStartupConnect { get; set; } public IList OnConnectCommands { get; set; } public string ServerID { get; set; } protected string ConfigKeyPrefix { get { if (String.IsNullOrEmpty(Protocol)) { throw new ArgumentNullException("Protocol"); } if (String.IsNullOrEmpty(ServerID)) { throw new ArgumentNullException("ServerID"); } return "Servers/" + Protocol + "/" + ServerID + "/"; } } public ServerModel() { } public ServerModel(ServerModel server) { if (server == null) { throw new ArgumentNullException("server"); } UseEncryption = server.UseEncryption; ValidateServerCertificate = server.ValidateServerCertificate; ClientCertificateFilename = server.ClientCertificateFilename; Protocol = server.Protocol; Hostname = server.Hostname; Port = server.Port; Network = server.Network; Nickname = server.Nickname; Realname = server.Realname; Username = server.Username; Password = server.Password; OnStartupConnect = server.OnStartupConnect; OnConnectCommands = new List(server.OnConnectCommands); ServerID = server.ServerID; } protected ServerModel(SerializationInfo info, StreamingContext ctx) { Protocol = info.GetString("_Protocol"); Hostname = info.GetString("_Hostname"); Port = info.GetInt32("_Port"); Network = info.GetString("_Network"); Username = info.GetString("_Username"); Password = info.GetString("_Password"); OnStartupConnect = info.GetBoolean("_OnStartupConnect"); //ServerID = info.GetString("_ServerID"); bool foundServerID = false; bool foundEncryption = false; bool foundValidation = false; foreach(SerializationEntry e in info) { switch (e.Name) { case "_ServerID": ServerID = (string)e.Value; foundServerID = true; break; case "_Username": Username = (string) e.Value; break; case "_Nickname": Nickname = (string) e.Value; break; case "_Realname": Realname = (string) e.Value; break; // UseEncryption and ValidateServerCertificate were forgotten // when moving from autoserialization to manual serialization. // To prevent crashes when git users' updated engines receive a ServerModel // from an older git frontend, we manually check for the fields' existance case "k__BackingField": UseEncryption = (bool)e.Value; foundEncryption = true; break; case "k__BackingField": ValidateServerCertificate = (bool)e.Value; foundValidation = true; break; case "ClientCertificateFilename": ClientCertificateFilename = (string) e.Value; break; } } if (foundServerID == false) { // this is from an old frontend/engine that doesn't know about ServerID yet ServerID = Hostname; } if (!foundEncryption) { UseEncryption = false; } if (!foundValidation) { ValidateServerCertificate = false; } OnConnectCommands = (IList) info.GetValue( "_OnConnectCommands", typeof(IList) ); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { // HACK: skip ServerID if it has no value as it breaks older // ServerModel implementations that relied on automatic // serialization which was the case in < 0.8.11 if (ServerID != null) { info.AddValue("_ServerID", ServerID); } if (Nickname != null) { info.AddValue("_Nickname", Nickname); } if (Realname != null) { info.AddValue("_Realname", Realname); } // HACK: skip ClientCertificateFilename if it has no value as it // breaks older ServerModel implementations that relied on automatic // serialization which was the case in < 0.8.11 if (!String.IsNullOrEmpty(ClientCertificateFilename)) { info.AddValue("ClientCertificateFilename", ClientCertificateFilename); } info.AddValue("_Protocol", Protocol); info.AddValue("_Hostname", Hostname); info.AddValue("_Port", Port); info.AddValue("_Network", Network); info.AddValue("_Username", Username); info.AddValue("_Password", Password); info.AddValue("_OnStartupConnect", OnStartupConnect); info.AddValue("_OnConnectCommands", OnConnectCommands); // oddball names are necessary because the fields always were auto properties info.AddValue("k__BackingField", UseEncryption); info.AddValue("k__BackingField", ValidateServerCertificate); } public virtual void Load(UserConfig config, string protocol, string id) { if (config == null) { throw new ArgumentNullException("config"); } if (String.IsNullOrEmpty(protocol)) { throw new ArgumentNullException("protocol"); } if (String.IsNullOrEmpty(id)) { throw new ArgumentNullException("id"); } // don't use ConfigKeyPrefix, so exception guarantees can be kept string prefix = "Servers/" + protocol + "/" + id + "/"; if (config[prefix + "Hostname"] == null) { // server does not exist throw new ArgumentException("ServerID not found in config", id); } ServerID = id; Protocol = protocol; // now we have a valid ServerID and Protocol, ConfigKeyPrefix works Hostname = (string) config[ConfigKeyPrefix + "Hostname"]; Port = (int) config[ConfigKeyPrefix + "Port"]; Network = (string) config[ConfigKeyPrefix + "Network"]; Nickname = (string) config[ConfigKeyPrefix + "Nickname"]; Realname = (string) config[ConfigKeyPrefix + "Realname"]; Username = (string) config[ConfigKeyPrefix + "Username"]; Password = (string) config[ConfigKeyPrefix + "Password"]; UseEncryption = (bool) config[ConfigKeyPrefix + "UseEncryption"]; ValidateServerCertificate = (bool) config[ConfigKeyPrefix + "ValidateServerCertificate"]; ClientCertificateFilename = (string) config[ConfigKeyPrefix + "ClientCertificateFilename"]; if (config[ConfigKeyPrefix + "OnStartupConnect"] != null) { OnStartupConnect = (bool) config[ConfigKeyPrefix + "OnStartupConnect"]; } OnConnectCommands = config[ConfigKeyPrefix + "OnConnectCommands"] as IList; } public virtual void Save(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } config[ConfigKeyPrefix + "Hostname"] = Hostname; config[ConfigKeyPrefix + "Port"] = Port; config[ConfigKeyPrefix + "Network"] = Network; config[ConfigKeyPrefix + "Nickname"] = Nickname; config[ConfigKeyPrefix + "Realname"] = Realname; config[ConfigKeyPrefix + "Username"] = Username; config[ConfigKeyPrefix + "Password"] = Password; config[ConfigKeyPrefix + "UseEncryption"] = UseEncryption; config[ConfigKeyPrefix + "ValidateServerCertificate"] = ValidateServerCertificate; config[ConfigKeyPrefix + "ClientCertificateFilename"] = ClientCertificateFilename; config[ConfigKeyPrefix + "OnStartupConnect"] = OnStartupConnect; config[ConfigKeyPrefix + "OnConnectCommands"] = OnConnectCommands; } public override string ToString() { return String.Format("<{0}>", ToTraceString()); } public string ToTraceString() { return String.Format("{0}/{1}", Protocol, ServerID); } } } smuxi-1.1/src/Engine/Config/MessageBuilderSettings.cs0000664000175000017500000004765614011467170023507 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011, 2014-2017 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public class MessageBuilderSettings { static List BuiltinPatterns { get; set; } static MessagePatternModel EmojiMessagePattern { get; set; } public List UserPatterns { get; set; } public List Patterns { get; set; } public bool NickColors { get; set; } public bool StripFormattings { get; set; } public bool StripColors { get; set; } public TextColor HighlightColor { get; set; } public List HighlightWords { get; set; } public bool Emojis { get { return Patterns.Contains(EmojiMessagePattern); } set { if (value && !Emojis) { Patterns.Add(EmojiMessagePattern); } if (!value) { Patterns.Remove(EmojiMessagePattern); } } } static MessageBuilderSettings() { // OPT: this emoji regex is really long, around 27k characters var emojiRegexBuilder = new StringBuilder(32 * 1024); emojiRegexBuilder.Append(":("); foreach (var emojiShortname in Emojione.ShortnameToUnicodeMap.Keys) { emojiRegexBuilder.AppendFormat("{0}|", Regex.Escape(emojiShortname)); } // remove trailing | emojiRegexBuilder.Length--; emojiRegexBuilder.Append("):"); var emojiRegex = new Regex(emojiRegexBuilder.ToString(), RegexOptions.Compiled); EmojiMessagePattern = new MessagePatternModel(emojiRegex) { MessagePartType = typeof(ImageMessagePartModel), LinkFormat = "smuxi-emoji://{1}" }; BuiltinPatterns = new List(); InitBuiltinSmartLinks(); } public MessageBuilderSettings() { NickColors = true; // No need to lock BuiltinPatterns as List is thread-safe for // multiple readers as long as there is no writer at the same time. // BuiltinPatterns is only written once before the first instance // of MessageBuilderSettings is created via the static initializer. Patterns = new List(BuiltinPatterns); } public MessageBuilderSettings(MessageBuilderSettings settings) { if (settings == null) { throw new ArgumentNullException("settings"); } UserPatterns = new List(settings.UserPatterns); Patterns = new List(settings.Patterns); NickColors = settings.NickColors; StripFormattings = settings.StripFormattings; StripColors = settings.StripColors; HighlightColor = settings.HighlightColor; HighlightWords = settings.HighlightWords; } internal const string StartDelimiterGroupName = "DelimiterForStartOfPattern"; internal const string EndDelimiterGroupName = "DelimiterForEndOfPattern"; static void InitBuiltinSmartLinks() { string path_last_chars = @"a-zA-Z0-9#/%&@=\-_+;:~'"; string path_chars = path_last_chars + @"\(\)\[\]\{\}?!.,"; string domain_chars = @"[a-z0-9\-\p{L}]+"; string subdomain = domain_chars + @"\."; string common_tld = @"de|es|im|us|com|net|org|info|biz|gov|name|edu|onion|museum"; string any_tld = @"[a-z\p{L}]+"; string ip6 = @"(?:[0-9a-f]{0,4}:){1,7}[0-9a-f]{1,4}"; string quoted_ip6 = @"\[" + ip6 + @"\]"; string ip4 = @"(?:[0-9]{1,3}\.){3}[0-9]{1,3}"; string ip = "(?:" + ip4 + "|" + ip6 + "|" + quoted_ip6 + ")"; string domain = @"(?:(?:" + subdomain + ")+(?:" + any_tld + ")|localhost)"; string bare_host = @"[a-z]+"; string host = "(?:" + domain + "|" + bare_host + "|" + ip + ")"; string short_number = "[1-9][0-9]{0,4}"; string port = ":" + short_number; string user = "[a-z0-9._%+-]+@"; string host_port = host + "(?:" + port + ")?"; string user_host_port = "(?:" + user + ")?" + host_port; string user_domain = user + domain; string path = @"/(?:["+ path_chars +"]*["+ path_last_chars +"]+)?"; string protocol = @"[a-z][a-z0-9\-+]*://"; string protocol_user_host_port_path = protocol + user_host_port + "(?:" + path + ")?"; string start_delimiter = String.Format(@"(?<{0}>^|\s|\W)", StartDelimiterGroupName); string end_delimiter = String.Format(@"(?<{0}>$|\s|\W)", EndDelimiterGroupName); // facebook attachment var regex = new Regex( @"(<[1-9][0-9]* attachments?>) (http://www\.facebook\.com/messages/\?action=read&tid=[0-9a-f]+)", RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "{2}", TextFormat = "{1}", }); // protocol://user@domain:port/path regex = new Regex( protocol_user_host_port_path, RegexOptions.IgnoreCase | RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex)); // email regex = new Regex( @"(?:mailto:)?(" + user_domain + ")", RegexOptions.IgnoreCase | RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "mailto:{1}" }); // bitcoin address var bitcoin_address = @"[13][a-km-zA-HJ-NP-Z1-9]{25,34}"; var query = @"(\?[" + path_chars + @"]+)?"; var bitcoin_address_query = bitcoin_address + query; regex = new Regex( @"bitcoin:(" + bitcoin_address_query + @")", RegexOptions.IgnoreCase | RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "bitcoin:{1}" }); // bitcoin address (heuristical) regex = new Regex( start_delimiter + @"(" + bitcoin_address_query + @")" + end_delimiter, RegexOptions.IgnoreCase | RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "bitcoin:{1}" }); // bitcoin tx hash var bitcoin_tx_hash = @"[a-fA-F0-9]{64}"; regex = new Regex( start_delimiter + @"(" + bitcoin_tx_hash + @")" + end_delimiter, RegexOptions.IgnoreCase | RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "https://blockchain.info/tx/{1}" }); // addresses without protocol (heuristical) // include well known TLDs to prevent autogen.sh, configure.ac or // Gst.Buffer.Unref() from matching string heuristic_domain = @"(?:(?:" + subdomain + ")+(?:" + common_tld + ")|localhost)"; string heuristic_address = @"(" +heuristic_domain + ")(?:" + path + ")?" + end_delimiter; regex = new Regex( heuristic_address, RegexOptions.IgnoreCase | RegexOptions.Compiled ); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://{1}" }); // Smuxi bugtracker regex = new Regex(@"smuxi#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "https://smuxi.im/issues/show/{1}" }); // RFCs regex = new Regex(@"RFC[ -]?([0-9]+) (?:s\.|ss\.|sec\.|sect\.|section) ?([1-9][0-9.]*)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://tools.ietf.org/html/rfc{1}#section-{2}" }); regex = new Regex(@"RFC[ -]?([0-9]+) (?:p\.|pp\.|page) ?(" + short_number + ")", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://tools.ietf.org/html/rfc{1}#page-{2}" }); regex = new Regex(@"RFC[ -]?([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://www.ietf.org/rfc/rfc{1}.txt" }); // XEPs regex = new Regex(@"XEP[ -]?([0-9]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://xmpp.org/extensions/xep-{1}.html" }); // ISO regex = new Regex(@"ISO[ -]?([0-9]{4,5}(?:-[0-9]+)?(?::[0-9]{4})?)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://www.iso.org/iso/home/search.htm?qt={1}&published=on" }); // ECMA regex = new Regex(@"ECMA[ -]?([0-9]{1,4})", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://www.ecma-international.org/publications/standards/ECMA-{1}.htm" }); // IEEE: IEEE-1394b, IEEE 802.11, IEEE 802.1ap-2008, IEEE 802.1AEbn-2011 regex = new Regex(@"IEEE[ -]?([0-9]{1,4}(?:\.[0-9]{1,4})?(?:[a-z]{1,4})?(?:-[0-9]{4})?)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://odysseus.ieee.org/query.html?qt={1}&style=standard" }); // bugtracker prefixes are taken from: // http://en.opensuse.org/openSUSE:Packaging_Patches_guidelines#Current_set_of_abbreviations // boost bugtracker regex = new Regex(@"boost#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "https://svn.boost.org/trac/boost/ticket/{1}" }); // Claws bugtracker regex = new Regex(@"claws#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id={1}" }); // CVE list regex = new Regex(@"CVE-[0-9]{4}-[0-9]{4,}", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://cve.mitre.org/cgi-bin/cvename.cgi?name={0}" }); // CPAN bugtracker regex = new Regex(@"RT#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://rt.cpan.org/Public/Bug/Display.html?id={1}" }); // Debian bugtracker regex = new Regex(@"deb#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugs.debian.org/{1}" }); // Debian Security Advisories (DSA) regex = new Regex(@"DSA[ -]?([0-9]{4})(-[0-9]{1,2})?", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://www.debian.org/security/dsa-{1}" }); // openSUSE feature tracker regex = new Regex(@"fate#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://features.opensuse.org/{1}" }); // freedesktop bugtracker regex = new Regex(@"fdo#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugs.freedesktop.org/{1}" }); // GNU bugtracker regex = new Regex(@"gnu#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://debbugs.gnu.org/{1}" }); // GCC bugtracker regex = new Regex(@"gcc#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://gcc.gnu.org/bugzilla/show_bug.cgi?id={1}" }); // GNOME bugtracker regex = new Regex(@"bgo#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.gnome.org/{1}" }); // KDE bugtracker regex = new Regex(@"kde#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugs.kde.org/{1}" }); // kernel bugtracker regex = new Regex(@"bko#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.kernel.org/show_bug.cgi?id={1}" }); // launchpad bugtracker regex = new Regex(@"LP#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://launchpad.net/bugs/{1}" }); // Mozilla bugtracker regex = new Regex(@"bmo#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.mozilla.org/{1}" }); // Novell bugtracker regex = new Regex(@"bnc#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.novell.com/{1}" }); // Redhat bugtracker regex = new Regex(@"rh#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.redhat.com/{1}" }); // Samba bugtracker regex = new Regex(@"bso#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.samba.org/show_bug.cgi?id={1}" }); // sourceforge bugtracker regex = new Regex(@"sf#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://sf.net/support/tracker.php?aid={1}" }); // Xfce bugtracker regex = new Regex(@"bxo#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.xfce.org/show_bug.cgi?id={1}" }); // Xamarin bugtracker regex = new Regex(@"bxc#([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); BuiltinPatterns.Add(new MessagePatternModel(regex) { LinkFormat = "http://bugzilla.xamarin.com/show_bug.cgi?id={1}" }); // TODO: msgid -> http://mid.gmane.org/{1} // TODO: ISSN/ISBN // TODO: Path: / or X:\ // TODO: GPS -> Google Maps // TODO: IP -> Browser / Whois // TODO: Domain -> Browser / Whois // TODO: ANSI // TODO: maybe more on http://ikiwiki.info/shortcuts/ // TODO: JID } public void ApplyConfig(UserConfig userConfig) { if (userConfig == null) { throw new ArgumentNullException("userConfig"); } NickColors = (bool) userConfig["Interface/Notebook/Channel/NickColors"]; StripColors = (bool) userConfig["Interface/Notebook/StripColors"]; StripFormattings = (bool) userConfig["Interface/Notebook/StripFormattings"]; HighlightColor = TextColor.Parse( (string) userConfig["Interface/Notebook/Tab/HighlightColor"] ); HighlightWords = new List( (string[]) userConfig["Interface/Chat/HighlightWords"] ); var patternController = new MessagePatternListController(userConfig); var userPatterns = patternController.GetList(); var builtinPatterns = BuiltinPatterns; var patterns = new List(builtinPatterns.Count + userPatterns.Count); // No need to lock BuiltinPatterns as List is thread-safe for // multiple readers as long as there is no writer at the same time. // BuiltinPatterns is only written once before the first instance // of MessageBuilderSettings is created via the static initializer. patterns.AddRange(builtinPatterns); patterns.AddRange(userPatterns); Patterns = patterns; UserPatterns = userPatterns; // The Patterns property has to be initialized before we set the // Emojis property as it will modify the existing Patterns collection Emojis = (bool) userConfig["Interface/Chat/Emojis"]; } } } smuxi-1.1/src/Engine/Config/UserListController.cs0000644000175000017500000001140511655545675022710 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Clement Bourgeois // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public class UserListController { private static readonly string f_LibraryTextDomain = "smuxi-engine"; private Config f_Config; private string f_Prefix; public UserListController(Config config) { if (config == null) { throw new ArgumentNullException("config"); } f_Config = config; f_Prefix = "Engine/Users"; } public void AddUser(string username, string password) { if (username == null) { throw new ArgumentNullException("username"); } if (password == null) { throw new ArgumentNullException("password"); } CheckUsername(username); CheckPassword(password); CheckUserNotExists(username); List userList = GetUsers(); userList.Add(username); f_Config[f_Prefix + "/Users"] = userList.ToArray(); f_Config[f_Prefix + "/" + username + "/Password"] = password; } public void ModifyUser(string username, string password) { if (username == null) { throw new ArgumentNullException("username"); } if (password == null) { throw new ArgumentNullException("password"); } CheckUsername(username); CheckPassword(password); CheckUserExists(username); f_Config[f_Prefix + "/" + username + "/Password"] = password; } public void DeleteUser(string username) { if (username == null) { throw new ArgumentNullException("username"); } CheckUsername(username); CheckUserExists(username); List userList = GetUsers(); userList.Remove(username); f_Config[f_Prefix + "/Users"] = userList.ToArray(); f_Config.Remove(f_Prefix + "/" + username + "/"); } public bool UserExists(string username) { if (username == null) { throw new ArgumentNullException("username"); } List usersList = GetUsers(); return usersList.Contains(username); } public List GetUsers() { return new List((string[]) f_Config[f_Prefix + "/Users"]); } protected void CheckUsername(string username) { if (String.IsNullOrEmpty(username) || username.Trim().Length == 0) { throw new ApplicationException( String.Format(_("Username must not be empty."), username) ); } } protected void CheckPassword(string password) { if (String.IsNullOrEmpty(password) || password.Trim().Length == 0) { throw new ApplicationException( String.Format(_("Password must not be empty."), password) ); } } protected void CheckUserExists(string username) { if (!UserExists(username)) { throw new ApplicationException( String.Format(_("User \"{0}\" doesn't exist."), username) ); } } protected void CheckUserNotExists(string username) { if (UserExists(username)) { throw new ApplicationException( String.Format(_("User \"{0}\" already exists."), username) ); } } private static string _(string msg) { return LibraryCatalog.GetString(msg, f_LibraryTextDomain); } } } smuxi-1.1/src/Engine/Config/FilterListController.cs0000664000175000017500000001507714011467170023210 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2010, 2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Engine { public class FilterListController { UserConfig f_UserConfig; public FilterListController(UserConfig userConfig) { if (userConfig == null) { throw new ArgumentNullException("userConfig"); } f_UserConfig = userConfig; } public IDictionary GetFilterList() { string[] filterKeys = (string[]) f_UserConfig["Filters/Filters"]; var filters = new Dictionary(); if (filterKeys == null) { return filters; } foreach (string filterKey in filterKeys) { int key = Int32.Parse(filterKey); var filter = GetFilter(key); if (filter == null) { continue; } filters.Add(key, filter); } return filters; } public FilterModel GetFilter(int key) { Trace.Call(key); string prefix = "Filters/" + key + "/"; if (f_UserConfig[prefix + "MessagePattern"] == null) { // filter does not exist return null; } FilterModel filter = new FilterModel(); filter.Protocol = (string) f_UserConfig[prefix + "Protocol"]; filter.NetworkID = (string) f_UserConfig[prefix + "NetworkID"]; var chatType = (string) f_UserConfig[prefix + "ChatType"]; if (!String.IsNullOrEmpty(chatType)) { filter.ChatType = (ChatType) Enum.Parse( typeof(ChatType), chatType ); } filter.ChatID = (string) f_UserConfig[prefix + "ChatID"]; var msgType = (string) f_UserConfig[prefix + "MessageType"]; if (!String.IsNullOrEmpty(msgType)) { filter.MessageType = (MessageType) Enum.Parse( typeof(MessageType), msgType ); } filter.MessagePattern = (string) f_UserConfig[prefix + "MessagePattern"]; return filter; } public int AddFilter(FilterModel filter) { Trace.Call(filter); if (filter == null) { throw new ArgumentNullException("filter"); } string[] filterKeys = (string[]) f_UserConfig["Filters/Filters"]; if (filterKeys == null) { filterKeys = new string[] {}; } int highestKey = 0; foreach (string filterKey in filterKeys) { int key = Int32.Parse(filterKey); if (key > highestKey) { highestKey = key; } } int newKey = ++highestKey; string prefix = "Filters/" + newKey + "/"; f_UserConfig[prefix + "Protocol"] = filter.Protocol; f_UserConfig[prefix + "NetworkID"] = filter.NetworkID; if (filter.ChatType == null) { f_UserConfig[prefix + "ChatType"] = String.Empty; } else { f_UserConfig[prefix + "ChatType"] = filter.ChatType.ToString(); } f_UserConfig[prefix + "ChatID"] = filter.ChatID; if (filter.MessageType == null) { f_UserConfig[prefix + "MessageType"] = String.Empty; } else { f_UserConfig[prefix + "MessageType"] = filter.MessageType.ToString(); } f_UserConfig[prefix + "MessagePattern"] = filter.MessagePattern; List filterKeyList = new List(filterKeys); filterKeyList.Add(newKey.ToString()); f_UserConfig["Filters/Filters"] = filterKeyList.ToArray(); return newKey; } public void SetFilter(int key, FilterModel filter) { Trace.Call(key, filter); if (filter == null) { throw new ArgumentNullException("filter"); } string prefix = "Filters/" + key + "/"; f_UserConfig[prefix + "Protocol"] = filter.Protocol; f_UserConfig[prefix + "NetworkID"] = filter.NetworkID; if (filter.ChatType == null) { f_UserConfig[prefix + "ChatType"] = String.Empty; } else { f_UserConfig[prefix + "ChatType"] = filter.ChatType.ToString(); } f_UserConfig[prefix + "ChatID"] = filter.ChatID; if (filter.MessageType == null) { f_UserConfig[prefix + "MessageType"] = String.Empty; } else { f_UserConfig[prefix + "MessageType"] = filter.MessageType.ToString(); } f_UserConfig[prefix + "MessagePattern"] = filter.MessagePattern; } public void RemoveFilter(int key) { Trace.Call(key); string filterSection = "Filters/" + key + "/"; string[] filterKeys = (string[]) f_UserConfig["Filters/Filters"]; if (filterKeys == null) { filterKeys = new string[] {}; } List filterKeyList = new List(filterKeys); int idx = filterKeyList.IndexOf(key.ToString()); if (idx == -1) { // key not found return; } filterKeyList.RemoveAt(idx); f_UserConfig.Remove(filterSection); f_UserConfig["Filters/Filters"] = filterKeyList.ToArray(); } public void Save() { Trace.Call(); f_UserConfig.Save(); } } } smuxi-1.1/src/Engine/Config/MessagePatternModel.cs0000644000175000017500000001165712726351313022766 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Text.RegularExpressions; namespace Smuxi.Engine { public class MessagePatternModel { public int? ID { get; set; } public Regex MessagePartPattern { get; set; } public Type MessagePartType { get; set; } // what is linked to public string LinkFormat { get; set; } // what is displayed public string TextFormat { get; set; } protected string ConfigKeyPrefix { get { if (ID == null) { throw new ArgumentNullException("ID"); } return "MessagePatterns/" + ID + "/"; } } public MessagePatternModel(Regex pattern) { if (pattern == null) { throw new ArgumentNullException("pattern"); } MessagePartPattern = pattern; MessagePartType = typeof(UrlMessagePartModel); } public MessagePatternModel(int id) { ID = id; } public void Load(UserConfig config) { if (ID == null) { throw new InvalidOperationException("ID must not be null."); } Load(config, ID.Value); } public virtual void Load(UserConfig config, int id) { if (config == null) { throw new ArgumentNullException("config"); } // don't use ConfigKeyPrefix, so exception guarantees can be kept string prefix = "MessagePatterns/" + id + "/"; if (config[prefix + "MessagePartPattern"] == null) { // SmartLink does not exist throw new ArgumentException("MessagePattern ID not found in config", "id"); } ID = id; // now we have a valid ID, ConfigKeyPrefix works var messagePartPattern = (string) config[ConfigKeyPrefix + "MessagePartPattern"]; if (messagePartPattern.StartsWith("/") && messagePartPattern.EndsWith("/i")) { var regexPattern = messagePartPattern.Substring(1, messagePartPattern.Length - 3); MessagePartPattern = new Regex(regexPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); } else { MessagePartPattern = new Regex(messagePartPattern, RegexOptions.Compiled); } var messagePartType = (string) config[ConfigKeyPrefix + "MessagePartType"]; switch (messagePartType.ToLower()) { case "url": MessagePartType = typeof(UrlMessagePartModel); break; case "image": MessagePartType = typeof(ImageMessagePartModel); break; } LinkFormat = (string) config[ConfigKeyPrefix + "LinkFormat"]; TextFormat = (string) config[ConfigKeyPrefix + "TextFormat"]; } public virtual void Save(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } if (MessagePartPattern == null) { config[ConfigKeyPrefix + "MessagePartPattern"] = String.Empty; } else { config[ConfigKeyPrefix + "MessagePartPattern"] = MessagePartPattern.ToString(); } if (MessagePartType == typeof(ImageMessagePartModel)) { config[ConfigKeyPrefix + "MessagePartType"] = "Image"; } else if (MessagePartType == typeof(UrlMessagePartModel)) { config[ConfigKeyPrefix + "MessagePartType"] = "Url"; } else { config[ConfigKeyPrefix + "MessagePartType"] = String.Empty; } config[ConfigKeyPrefix + "LinkFormat"] = LinkFormat ?? String.Empty; config[ConfigKeyPrefix + "TextFormat"] = TextFormat ?? String.Empty; } public override string ToString() { return String.Format("<{0}>", ToTraceString()); } public string ToTraceString() { return String.Format("{0}", ID); } } } smuxi-1.1/src/Engine/Config/FrontendConfig.cs0000644000175000017500000001030512253423337021756 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; #if CONFIG_NINI using Nini.Ini; #endif namespace Smuxi.Engine { public class FrontendConfig : Config { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private string _Prefix; private string _UIName; public new object this[string key] { get { var value = base["Engine/" + key]; if (value != null) { return value; } return base[_Prefix+key]; } set { base[_Prefix+key] = value; } } public FrontendConfig(string uiName) : base() { _UIName = uiName; _Prefix = "Frontend/"; #if CONFIG_NINI m_IniFilename = m_ConfigPath+"/smuxi-frontend.ini"; if (!File.Exists(m_IniFilename)) { #if LOG4NET _Logger.Debug("creating file: "+m_IniFilename); #endif File.Create(m_IniFilename).Close(); m_IsCleanConfig = true; } m_IniDocument = new IniDocument(m_IniFilename); #endif } public new void Load() { string prefix; #if LOG4NET _Logger.Info("Loading config (FrontendConfig)"); #endif // setting required default values prefix = "Frontend/"; LoadEntry(prefix+"UseLowBandwidthMode", false); LoadEntry(prefix+"ShowMenuBar", true); LoadEntry(prefix+"ShowToolBar", true); LoadEntry(prefix+"ShowStatusBar", true); prefix = "Frontend/Engines/"; Get(prefix+"Engines", new string[] {}); Get(prefix+"Default", String.Empty); prefix = "Frontend/Engines/"; LoadEntry(prefix+"Default", String.Empty); string[] engines = GetList(prefix+"Engines"); m_Preferences[prefix+"Engines"] = engines; foreach (string engine in engines) { string eprefix = prefix+engine+"/"; LoadEntry(eprefix+"Username", String.Empty); LoadEntry(eprefix+"Password", String.Empty); LoadEntry(eprefix+"Hostname", String.Empty); LoadEntry(eprefix+"BindAddress", null); LoadEntry(eprefix+"Port", null); LoadEntry(eprefix+"Channel", null); LoadEntry(eprefix+"Formatter", null); LoadEntry(eprefix+"UseSshTunnel", false); LoadEntry(eprefix+"SshProgram", null); LoadEntry(eprefix+"SshParameters", null); LoadEntry(eprefix+"SshHostname", String.Empty); LoadEntry(eprefix+"SshPort", 22); LoadEntry(eprefix+"SshUsername", String.Empty); LoadEntry(eprefix+"SshPassword", String.Empty); LoadEntry(eprefix+"SshKeyfile", String.Empty); } LoadAllEntries("Frontend/"+_UIName); LoadAllEntries("Engine"); } public new void Remove(string key) { base.Remove(_Prefix+key); } } } smuxi-1.1/src/Engine/TextColorPalettes.cs0000644000175000017500000000377312253423337021304 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine { public static class TextColorPalettes { public static List LinuxConsole { get; set; } public static List Xterm { get; set; } static TextColorPalettes() { var hexColors = new string[] { "#000000", "#800000", "#008000", "#808000", "#000080", "#800080", "#008080", "#c0c0c0", "#808080", "#ff0000", "#00ff00", "#ffff00", "#0000ff", "#ff00ff", "#00ffff", "#ffffff" }; LinuxConsole = new List(16); foreach (var hexColor in hexColors) { LinuxConsole.Add(TextColor.Parse(hexColor)); } Xterm = new List(256); Xterm.AddRange(LinuxConsole); // TODO: add all xterm colors // http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html } } } smuxi-1.1/src/Engine/PermanentRemoteObject.cs0000644000175000017500000000324211655545675022121 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Remoting.Lifetime; namespace Smuxi.Engine { public abstract class PermanentRemoteObject : MarshalByRefObject { public override object InitializeLifetimeService() { // no, please, nooooo, don't kill us! // both ways will cause an infinitive lifetime for the object /* Console.WriteLine("InitializeLifetimeService()"); ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { Console.WriteLine("LeaseState.Initial!"); lease.InitialLeaseTime = TimeSpan.Zero; } return lease; */ return null; } } } smuxi-1.1/src/Engine/CertificateValidator.cs0000644000175000017500000000766012253423337021746 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public class CertificateValidator { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public List HostnameWhitelist { get; private set; } public List HashWhitelist { get; private set; } public CertificateValidator() { HostnameWhitelist = new List(); HashWhitelist = new List(); #if LOG4NET if (ServicePointManager.ServerCertificateValidationCallback != null) { Logger.Warn( "CertificateValidator.ctor(): overwriting existing " + "ServicePointManager.ServerCertificateValidationCallback" ); } #endif ServicePointManager.ServerCertificateValidationCallback = ValidateCertificate; } bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { Trace.Call(sender, "(X509Certificate)", chain, sslPolicyErrors); if (sslPolicyErrors == SslPolicyErrors.None) { return true; } var hash = certificate.GetCertHashString(); string hostname = null; if (sender is HttpWebRequest) { var request = (HttpWebRequest) sender; hostname = request.RequestUri.Host; } var certInfo = String.Format( "\n Subject: '{0}'" + "\n Issuer: '{1}'" + "\n Hash: '{2}'" + "\n Hostname: '{3}'", certificate.Subject, certificate.Issuer, hash, hostname ); lock (HashWhitelist) { if (HashWhitelist.Contains(hash)) { #if LOG4NET Logger.DebugFormat( "ValidateCertificate(): Validated certificate " + "via hash whitelist: {0}", certInfo ); #endif return true; } } if (hostname != null) { lock (HostnameWhitelist) { if (HostnameWhitelist.Contains(hostname)) { #if LOG4NET Logger.DebugFormat( "ValidateCertificate(): Validated certificate " + "via hostname whitelist: {0}", certInfo ); #endif return true; } } } #if LOG4NET Logger.ErrorFormat( "ValidateCertificate(): Validation failed: {0}" + "\n SslPolicyErrors: {1}", certInfo, sslPolicyErrors ); #endif return false; } } } smuxi-1.1/src/Engine/Persons/0000775000175000017500000000000014011526501016740 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Persons/PersonModel.cs0000644000175000017500000000621711700531605021525 0ustar00meebeymeebey00000000000000/* * $Id: NetworkType.cs 141 2006-12-31 02:09:01Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/NetworkType.cs $ * $Rev: 141 $ * $Author: meebey $ * $Date: 2006-12-31 03:09:01 +0100 (Sun, 31 Dec 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Remoting; using System.Runtime.Serialization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class PersonModel : ContactModel { private IProtocolManager _ProtocolManager; public IProtocolManager ProtocolManager { get { return _ProtocolManager; } } public PersonModel(string id, string displayName, string networkID, string networkProtocol, IProtocolManager protocolManager) : base(id, displayName, networkID, networkProtocol) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } _ProtocolManager = protocolManager; } protected PersonModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { if (info == null) { throw new ArgumentNullException("info"); } // TODO: we might optimize this away, causes 800 bytes per remoting call _ProtocolManager = (IProtocolManager) info.GetValue("_ProtocolManager", typeof(IProtocolManager)); } public override void GetObjectData(SerializationInfo info, StreamingContext ctx) { if (info == null) { throw new ArgumentNullException("info"); } base.GetObjectData(info, ctx); info.AddValue("_ProtocolManager", _ProtocolManager); } public override string ToTraceString() { if (_ProtocolManager == null || RemotingServices.IsTransparentProxy(_ProtocolManager)) { // avoids remoting call return base.ToTraceString(); } // REMOTING CALL return _ProtocolManager.ToString() + "/" + IdentityName; } } } smuxi-1.1/src/Engine/Persons/ContactModel.cs0000664000175000017500000001677314011467170021667 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007, 2010-2011, 2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Text; using System.Runtime.Serialization; using System.Security.Cryptography; using System.Threading; using System.Globalization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class ContactModel : ITraceable, ISerializable, IComparable, IComparable { private string _ID; private string _IdentityName; private string _NetworkID; private string _NetworkProtocol; private TextMessagePartModel _IdentityNameColored; object IdentityNameSyncRoot { get; set; } public string ID { get { return _ID; } } /// /// This property is thread safe. /// public string IdentityName { get { return _IdentityName; } set { lock (IdentityNameSyncRoot) { _IdentityName = value; _IdentityNameColored = null; } } } /// /// This property is thread safe. /// public TextMessagePartModel IdentityNameColored { get { if (_IdentityNameColored == null) { lock (IdentityNameSyncRoot) { _IdentityNameColored = GetColoredIdentityName( _IdentityName, null ); } } return _IdentityNameColored; } set { _IdentityNameColored = value; } } public string NetworkID { get { return _NetworkID; } } public string NetworkProtocol { get { return _NetworkProtocol; } } public ContactModel(string id, string identityName, string networkID, string networkProtocol) { Trace.Call(id, identityName, networkID, networkProtocol); if (id == null) { throw new ArgumentNullException("id"); } if (identityName == null) { throw new ArgumentNullException("identityName"); } if (networkID == null) { throw new ArgumentNullException("networkID"); } if (networkProtocol == null) { throw new ArgumentNullException("networkProtocol"); } _ID = id; _IdentityName = identityName; _NetworkID = networkID; _NetworkProtocol = networkProtocol; IdentityNameSyncRoot = new Object(); } protected ContactModel(SerializationInfo info, StreamingContext ctx) { if (info == null) { throw new ArgumentNullException("info"); } IdentityNameSyncRoot = new Object(); SerializationReader sr = SerializationReader.GetReader(info); SetObjectData(sr); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { if (info == null) { throw new ArgumentNullException("info"); } SerializationWriter sw = SerializationWriter.GetWriter(); GetObjectData(sw); sw.AddToInfo(info); } protected virtual void SetObjectData(SerializationReader sr) { if (sr == null) { throw new ArgumentNullException("sr"); } _ID = sr.ReadString(); _IdentityName = sr.ReadString(); _NetworkID = sr.ReadString(); _NetworkProtocol = sr.ReadString(); } protected virtual void GetObjectData(SerializationWriter sw) { if (sw == null) { throw new ArgumentNullException("sw"); } sw.Write(_ID); sw.Write(_IdentityName); sw.Write(_NetworkID); sw.Write(_NetworkProtocol); } protected virtual TextMessagePartModel GetColoredIdentityName( string idendityName, string normalized) { var name = new TextMessagePartModel(idendityName); if (normalized == null) { normalized = idendityName; } var crc = new Crc32(); crc.ComputeHash(Encoding.UTF8.GetBytes(normalized)); var hash = crc.CrcValue; var upper24 = hash >> 8; uint flippedHash = (hash >> 16) | (hash << 16); var flippedMergedHash = (flippedHash >> 8) ^ (flippedHash & 0xFFFFFFU); name.ForegroundColor = new TextColor(upper24); name.BackgroundColor = new TextColor(flippedMergedHash); return name; } public virtual string ToTraceString() { return _NetworkID + "/" + _IdentityName; } public virtual int CompareTo(ContactModel contact) { if (contact == null) { return 1; } return String.Compare(IdentityName, contact.IdentityName, true, CultureInfo.InvariantCulture); } int IComparable.CompareTo(object contact) { return CompareTo(contact as ContactModel); } public override bool Equals(object obj) { var value = obj as ContactModel; if (value == null) { return false; } return Equals(value); } public virtual bool Equals(ContactModel model) { if (model == null) { return false; } if (ID != model.ID) { return false; } if (NetworkID != model.NetworkID) { return false; } if (NetworkProtocol != model.NetworkProtocol) { return false; } return true; } public static bool operator ==(ContactModel a, ContactModel b) { if (System.Object.ReferenceEquals(a, b)) { return true; } if ((object) a == null || (object) b == null) { return false; } return a.Equals(b); } public static bool operator !=(ContactModel a, ContactModel b) { return !(a == b); } } } smuxi-1.1/src/Engine/Makefile.in0000664000175000017500000010564614011526471017376 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ @BUNDLE_NINI_TRUE@am__append_1 = $(NINI_DLL) @BUNDLE_DB4O_TRUE@am__append_2 = $(DB4O_INCLUDED_LIBS) subdir = src/Engine ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-engine.pc 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/smuxi-engine.pc.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ TARGET_DIR = $(top_builddir)/bin/$(PROFILE) EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize- -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET,CONFIG_NINI" -define:DB4O,DB4O_8_0 @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ "-define:CONFIG_NINI" -define:DB4O,DB4O_8_0 @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = library @ENABLE_RELEASE_TRUE@COMPILE_TARGET = library @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) @BUNDLE_NINI_BLOB_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @BUNDLE_NINI_TRUE@NINI_DLL_SOURCE = $(NINI_LIBS) @BUNDLE_NINI_BLOB_FALSE@NINI_REF_LIBS = $(NINI_LIBS) @BUNDLE_NINI_BLOB_TRUE@NINI_REF_LIBS = -r:$(NINI_DLL_SOURCE) AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = $(SMUXI_COMMON_DLL) $(am__append_1) $(am__append_2) LINUX_PKGCONFIG = \ $(ENGINE_PC) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ CertificateValidator.cs \ CommandModel.cs \ Engine.cs \ FrontendManager.cs \ IFrontendUI.cs \ PermanentRemoteObject.cs \ PresenceStatus.cs \ Session.cs \ SessionManager.cs \ TextColor.cs \ TextColorContrast.cs \ TextColorPalettes.cs \ TextColorTools.cs \ MessageBuffers/Db4oMessageBuffer.cs \ MessageBuffers/IMessageBuffer.cs \ MessageBuffers/ListMessageBuffer.cs \ MessageBuffers/MessageBufferBase.cs \ MessageBuffers/MessageBufferPersistencyType.cs \ MessageBuffers/SqliteMessageBuffer.cs \ Messages/FeedMessageBuilder.cs \ Messages/MessageBuilder.cs \ Messages/MessageModel.cs \ Messages/MessagePartModel.cs \ Messages/TextMessagePartModel.cs \ Messages/UrlMessagePartModel.cs \ Messages/ImageMessagePartModel.cs \ Messages/MessageType.cs \ Messages/Dto/MessageDtoModelV1.cs \ Messages/Dto/MessageDtoModelV2.cs \ Chats/ChatType.cs \ Chats/ChatModel.cs \ Chats/GroupChatModel.cs \ Chats/PersonChatModel.cs \ Chats/SessionChatModel.cs \ Chats/ProtocolChatModel.cs \ Config/FrontendConfig.cs \ Config/NotificationAreaIconMode.cs \ Config/UserConfig.cs \ Config/Config.cs \ Config/ServerModel.cs \ Config/ServerListController.cs \ Config/UserListController.cs \ Config/FilterListController.cs \ Config/FilterModel.cs \ Config/ProxySettings.cs \ Config/ProxyType.cs \ Config/EntrySettings.cs \ Config/MessageBuilderSettings.cs \ Config/MessagePatternListController.cs \ Config/MessagePatternModel.cs \ Protocols/ProtocolManagerBase.cs \ Protocols/ProtocolManagerFactory.cs \ Protocols/ProtocolManagerInfoModel.cs \ Protocols/ProtocolManagerInfoAttribute.cs \ Protocols/IProtocolManager.cs \ Persons/PersonModel.cs \ Persons/ContactModel.cs \ Hooks/HookRunner.cs \ Hooks/Commands/HookCommand.cs \ Hooks/Commands/ProtocolManagerHookCommand.cs \ Hooks/Commands/SessionHookCommand.cs \ Hooks/Environments/ChatHookEnvironment.cs \ Hooks/Environments/CommandHookEnvironment.cs \ Hooks/Environments/HookEnvironment.cs \ Hooks/Environments/MessageHookEnvironment.cs \ Hooks/Environments/PersonHookEnvironment.cs \ Hooks/Environments/ProtocolManagerHookEnvironment.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-engine.pc.in REFERENCES = \ System \ System.Core \ System.Data \ System.Runtime.Remoting \ System.Runtime.Serialization \ System.Web \ System.Xml \ Mono.Posix \ Mono.Data.Sqlite \ $(NINI_REF_LIBS) \ $(LOG4NET_REF_LIBS) \ $(DB4O_LIBS) \ $(DB4O_INCLUDED_LIBS) DLL_REFERENCES = \ $(BUILD_DIR)/ServiceStack.Text.dll CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) ENGINE_PC = $(BUILD_DIR)/smuxi-engine.pc SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll @BUNDLE_NINI_TRUE@NINI_DLL = $(BUILD_DIR)/Nini.dll @BUNDLE_DB4O_TRUE@DB4O_INCLUDED_LIBS := $(foreach file, $(DB4O_FILES), $(TARGET_DIR)/$(file)) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-engine.pc: $(top_builddir)/config.status $(srcdir)/smuxi-engine.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-wrapper,ENGINE_PC,smuxi-engine.pc)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) @BUNDLE_NINI_TRUE@$(eval $(call emit-deploy-target,NINI_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) # 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: smuxi-1.1/src/Engine/smuxi-engine.pc.in0000644000175000017500000000023011655545675020671 0ustar00meebeymeebey00000000000000Name: smuxi-engine Description: smuxi's engine library Version: @VERSION@ Requires: smuxi-common Libs: -r:@expanded_libdir@/@PACKAGE@/smuxi-engine.dll smuxi-1.1/src/Engine/TextColor.cs0000644000175000017500000001265612726351313017601 0ustar00meebeymeebey00000000000000/* * $Id: Config.cs 100 2005-08-07 14:54:22Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config.cs $ * $Rev: 100 $ * $Author: meebey $ * $Date: 2005-08-07 16:54:22 +0200 (Sun, 07 Aug 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using System.Globalization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] [DataContract] public class TextColor : ISerializable { public static readonly TextColor None = new TextColor(); public static readonly TextColor Black = new TextColor(0, 0, 0); public static readonly TextColor White = new TextColor(255, 255, 255); public static readonly TextColor Grey = new TextColor(128, 128, 128); private int f_Value; [DataMember] public int Value { get { return f_Value; } set { f_Value = value; } } [IgnoreDataMember] public string HexCode { get { return f_Value.ToString("X6"); } } [IgnoreDataMember] public byte Red { get { return (byte) ((f_Value & 0xFF0000) >> 16); } } [IgnoreDataMember] public byte Green { get { return (byte) ((f_Value & 0xFF00) >> 8); } } [IgnoreDataMember] public byte Blue { get { return (byte) (f_Value & 0xFF); } } public TextColor() { f_Value = -1; } public TextColor(int value) { f_Value = value; } [CLSCompliant(false)] public TextColor(uint value) { f_Value = checked((int) value); } public TextColor(byte red, byte green, byte blue) { f_Value = red << 16 | green << 8 | blue; } protected TextColor(SerializationInfo info, StreamingContext ctx) { SerializationReader sr = SerializationReader.GetReader(info); SetObjectData(sr); } protected virtual void SetObjectData(SerializationReader sr) { f_Value = sr.ReadInt32(); } protected virtual void GetObjectData(SerializationWriter sw) { sw.Write(f_Value); } public virtual void GetObjectData(SerializationInfo info, StreamingContext ctx) { SerializationWriter sw = SerializationWriter.GetWriter(); GetObjectData(sw); sw.AddToInfo(info); } public static TextColor Parse(string hexCode) { if (hexCode == null) { throw new ArgumentNullException("hexCode"); } if (hexCode.StartsWith("#")) { // remove leading "#" character hexCode = hexCode.Substring(1); } if (hexCode.Length != 6) { throw new ArgumentException("Hexcode value must be exact 6 characters long (without prefix).", "hexCode"); } int red = Int16.Parse(hexCode.Substring(0, 2), NumberStyles.HexNumber); int green = Int16.Parse(hexCode.Substring(2, 2), NumberStyles.HexNumber); int blue = Int16.Parse(hexCode.Substring(4, 2), NumberStyles.HexNumber); return new TextColor((byte) red, (byte) green, (byte) blue); } public override string ToString() { return String.Format("#{0}", HexCode); } public override bool Equals(object obj) { TextColor value = obj as TextColor; return Equals(value); } public bool Equals(TextColor value) { if ((object) value == null) { return false; } return f_Value == value.Value; } public override int GetHashCode() { return f_Value.GetHashCode(); } public static bool operator ==(TextColor x, TextColor y) { if (Object.ReferenceEquals(x, y)) { return true; } if (((object) x == null) || ((object) y == null)) { return false; } return x.Equals(y); } public static bool operator !=(TextColor x, TextColor y) { return !(x == y); } } } smuxi-1.1/src/Engine/SessionManager.cs0000664000175000017500000001076314011467170020571 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007, 2014-2016 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections; using Smuxi.Common; namespace Smuxi.Engine { public class SessionManager : PermanentRemoteObject { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private Hashtable _Sessions = Hashtable.Synchronized(new Hashtable()); private Config _Config; private ProtocolManagerFactory _ProtocolManagerFactory; public Version EngineAssemblyVersion { get; private set; } public Version EngineProtocolVersion { get; private set; } public Version EngineVersion { get { // HACK: since older frontend compare/check the engine version // for protocol compatibility we expose the protocol version // here instead for backwards compatibility return EngineProtocolVersion; } } public SessionManager(Config config, ProtocolManagerFactory protocolManagerFactory) { Trace.Call(config, protocolManagerFactory); if (config == null) { throw new ArgumentNullException("config"); } if (protocolManagerFactory == null) { throw new ArgumentNullException("protocolManagerFactory"); } _Config = config; _ProtocolManagerFactory = protocolManagerFactory; EngineAssemblyVersion = Engine.AssemblyVersion; EngineProtocolVersion = Engine.ProtocolVersion; string[] users = (string[])Engine.Config["Engine/Users/Users"]; if (users == null) { Console.WriteLine("No Engine/Users/*, aborting...\n"); Environment.Exit(1); } foreach (string user in users) { // skip local session if (user == "local") { continue; } #if LOG4NET _Logger.Debug("Creating Session for User "+user); #endif var session = new Session(_Config, _ProtocolManagerFactory, user); session.ExecuteOnStartupCommands(); session.ProcessAutoConnect(); _Sessions.Add(user, session); } } public Session Register(string username, string password, IFrontendUI ui) { Trace.Call(username, "XXX", ui); if (username == null) { throw new ArgumentNullException("username"); } if (password == null) { throw new ArgumentNullException("password"); } if (ui == null) { throw new ArgumentNullException("ui"); } string configPassword = (string)Engine.Config["Engine/Users/"+username+"/Password"]; if (configPassword == null || configPassword == String.Empty) { return null; } // calculate MD5 string from config password configPassword = MD5.FromString(configPassword); if (configPassword == password) { Session sess = (Session)_Sessions[username]; sess.RegisterFrontendUI(ui); return sess; } return null; } internal void Shutdown() { lock (_Sessions) { foreach (Session session in _Sessions.Values) { session.Shutdown(); } } } } } smuxi-1.1/src/Engine/Session.cs0000664000175000017500000023656414011467170017307 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Net; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.Collections.Generic; using System.Runtime.Remoting; using System.Threading; using Smuxi.Common; namespace Smuxi.Engine { public class Session : PermanentRemoteObject, IFrontendUI { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-engine"; public static CertificateValidator CertificateValidator { get; private set; } private int _Version = 0; private IDictionary _FrontendManagers; private IList _ProtocolManagers; private List _Chats; private SessionChatModel _SessionChat; private Config _Config; private string _Username; private ProtocolManagerFactory _ProtocolManagerFactory; private UserConfig _UserConfig; private FilterListController _FilterListController; private ICollection _Filters; Timer NewsFeedTimer { get; set; } List SeenNewsFeedIds { get; set; } DateTime NewsFeedLastModified { get; set; } TimeSpan NewsFeedUpdateInterval { get; set; } TimeSpan NewsFeedRetryInterval { get; set; } bool IsFirstNewsFeedEntry { get; set; } internal MessageBuilderSettings MessageBuilderSettings { get; private set; } public event EventHandler GroupChatPersonAdded; public event EventHandler GroupChatPersonRemoved; public event EventHandler GroupChatPersonUpdated; public event EventHandler EventMessage; public IList ProtocolManagers { get { return _ProtocolManagers; } } public IProtocolManager FirstProtocolManager { get { lock (_ProtocolManagers) { if (_ProtocolManagers.Count == 0) { return null; } else { return _ProtocolManagers[0]; } } } } public IList Chats { get { return _Chats; } } public SessionChatModel SessionChat { get { return _SessionChat; } } public int Version { get { return _Version; } } public Config Config { get { return _Config; } } public UserConfig UserConfig { get { return _UserConfig; } } public string Username { get { return _Username; } } public bool IsLocal { get { return _Username == "local"; } } internal ICollection Filters { get { return _Filters; } set { _Filters = value; } } static Session() { CertificateValidator = new CertificateValidator(); } public Session(Config config, ProtocolManagerFactory protocolManagerFactory, string username) { Trace.Call(config, protocolManagerFactory, username); if (config == null) { throw new ArgumentNullException("config"); } if (protocolManagerFactory == null) { throw new ArgumentNullException("protocolManagerFactory"); } if (username == null) { throw new ArgumentNullException("username"); } _Config = config; _ProtocolManagerFactory = protocolManagerFactory; _Username = username; _FrontendManagers = new Dictionary(); _ProtocolManagers = new List(); _UserConfig = new UserConfig(config, username); _UserConfig.Changed += OnUserConfigChanged; _FilterListController = new FilterListController(_UserConfig); _Filters = _FilterListController.GetFilterList().Values; MessageBuilderSettings = new MessageBuilderSettings(); MessageBuilderSettings.ApplyConfig(_UserConfig); _Chats = new List(); InitSessionChat(); SeenNewsFeedIds = new List(); NewsFeedUpdateInterval = TimeSpan.FromHours(12); NewsFeedRetryInterval = TimeSpan.FromMinutes(5); IsFirstNewsFeedEntry = true; NewsFeedTimer = new Timer(delegate { UpdateNewsFeed(); }, null, TimeSpan.Zero, NewsFeedUpdateInterval); } public void ExecuteOnStartupCommands() { foreach (string command in (string[]) _UserConfig["OnStartupCommands"]) { if (command.Length == 0) { continue; } var cd = new CommandModel(null, _SessionChat, (string)_UserConfig["Interface/Entry/CommandCharacter"], command); var handled = Command(cd); if (!handled) { #if LOG4NET f_Logger.Error("ExecuteOnStartupCommands(): command unknown: " + command); #endif var builder = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText("unknown command: {0}", command); AddMessageToChat(_SessionChat, builder.ToMessage(), true); } } } public void ProcessAutoConnect() { var serverCon = new ServerListController(_UserConfig); IList servers = serverCon.GetServerList(); foreach (ServerModel server in servers) { if (!server.OnStartupConnect) { continue; } var msg = String.Format( _("Automatically connecting to {0}..."), String.Format("{0}/{1} ({2}:{3})", server.Protocol, server.Network, server.Hostname, server.Port) ); #if LOG4NET f_Logger.Info(msg); #endif var builder = CreateMessageBuilder(). AppendEventPrefix(). AppendText(msg); AddMessageToChat(_SessionChat, builder.ToMessage(), true); var srv = server; // run connects in background threads as they block ThreadPool.QueueUserWorkItem(delegate { bool isError = false; try { IProtocolManager protocolManager = Connect(srv, null); // if the connect command was correct, we should be // able to get the chat model if (protocolManager.Chat == null) { isError = true; } } catch (Exception ex) { #if LOG4NET f_Logger.Error("ProcessAutoConnect(): Exception during "+ "automatic connect: ", ex); #endif isError = true; } if (isError) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText( _("Automatic connect to {0} failed!"), srv.Hostname + ":" + srv.Port ); AddMessageToChat(_SessionChat, builder.ToMessage(), true); } }); } } public IProtocolManager NextProtocolManager(IProtocolManager currentProtocolManager) { lock (_ProtocolManagers) { if (_ProtocolManagers.Count == 0) { return null; } int pos = 0; if (currentProtocolManager != null) { pos = _ProtocolManagers.IndexOf(currentProtocolManager); } if (pos < _ProtocolManagers.Count - 1) { pos++; } else { pos = 0; } return _ProtocolManagers[pos]; } } protected MessageBuilder CreateMessageBuilder() { var builder = new MessageBuilder(); // copy settings so the caller can override settings without // changing the settings of the complete session builder.Settings = new MessageBuilderSettings(MessageBuilderSettings); return builder; } public void RegisterFrontendUI(IFrontendUI ui) { Trace.Call(ui); if (ui == null) { throw new ArgumentNullException("ui"); } string uri = GetUri(ui); #if LOG4NET f_Logger.Debug("Registering UI with URI: " + uri); #endif // add the FrontendManager to the hashtable with an unique .NET remoting identifier FrontendManager fm = new FrontendManager(this, ui); lock (_FrontendManagers) { _FrontendManagers[uri] = fm; } } internal void DeregisterFrontendManager(FrontendManager fm) { Trace.Call(fm); if (fm == null) { throw new ArgumentNullException("fm"); } string key = null; lock (_FrontendManagers) { foreach (KeyValuePair kv in _FrontendManagers) { if (kv.Value == fm) { key = kv.Key; break; } } } if (key == null) { #if LOG4NET f_Logger.Debug("DeregisterFrontendManager(fm): could not find " + "frontend manager (probably already cleanly " + " deregistered), ignoring..."); #endif return; } lock (_FrontendManagers) { _FrontendManagers.Remove(key); } #if LOG4NET f_Logger.Debug("DeregisterFrontendUI(fm): disposing FrontendManager"); #endif fm.Dispose(); CheckPresenceStatus(); } public void DeregisterFrontendUI(IFrontendUI ui) { Trace.Call(ui); if (ui == null) { throw new ArgumentNullException("ui"); } string uri = GetUri(ui); #if LOG4NET f_Logger.Debug("DeregisterFrontendUI(ui): deregistering UI with URI: "+uri); #endif FrontendManager manager; lock (_FrontendManagers) { _FrontendManagers.TryGetValue(uri, out manager); _FrontendManagers.Remove(uri); } if (manager == null) { #if LOG4NET f_Logger.Error("DeregisterFrontendUI(ui): can't dispose as FrontendManager not found with URI: " + uri); #endif } else { #if LOG4NET f_Logger.Debug("DeregisterFrontendUI(ui): disposing FrontendManager with URI: " + uri); #endif manager.Dispose(); } CheckPresenceStatus(); } public FrontendManager GetFrontendManager(IFrontendUI ui) { Trace.Call(ui); if (ui == null) { throw new ArgumentNullException("ui"); } lock (_FrontendManagers) { return _FrontendManagers[GetUri(ui)]; } } private string GetUri(IFrontendUI ui) { if (ui == null) { throw new ArgumentNullException("ui"); } if (IsLocal) { return "local"; } return RemotingServices.GetObjectUri((MarshalByRefObject)ui); } public static bool IsLocalFrontend(IFrontendUI ui) { if (ui == null) { throw new ArgumentNullException("ui"); } return RemotingServices.GetObjectUri((MarshalByRefObject)ui) == null; } public ChatModel GetChat(string id, ChatType chatType, IProtocolManager networkManager) { if (id == null) { throw new ArgumentNullException("id"); } lock (_Chats) { foreach (ChatModel chat in _Chats) { if ((chat.ID.ToLower() == id.ToLower()) && (chat.ChatType == chatType) && (chat.ProtocolManager == networkManager)) { return chat; } } } return null; } public bool Command(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } bool handled = false; if (cd.IsCommand) { switch (cd.Command) { case "help": CommandHelp(cd); if (cd.Chat.ChatType == ChatType.Session) { handled = true; } break; case "server": case "connect": CommandConnect(cd); handled = true; break; case "disconnect": CommandDisconnect(cd); handled = true; break; case "reconnect": CommandReconnect(cd); handled = true; break; case "network": CommandNetwork(cd); handled = true; break; case "config": CommandConfig(cd); handled = true; break; case "shutdown": CommandShutdown(cd); handled = true; break; case "echo": CommandEcho(cd); handled = true; break; default: var filteredCmd = IOSecurity.GetFilteredPath(cd.Command); var hooks = new HookRunner("engine", "session", "command-" + filteredCmd); var pm = cd.Chat.ProtocolManager; hooks.Environments.Add(new CommandHookEnvironment(cd)); hooks.Environments.Add(new ChatHookEnvironment(cd.Chat)); if (pm != null) { hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm)); } var cmdChar = (string) UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(this, cd.Chat, cmdChar)); if (pm != null) { hooks.Commands.Add(new ProtocolManagerHookCommand(pm, cd.Chat, cmdChar)); } // show time hooks.Init(); if (hooks.HasHooks) { hooks.Run(); handled = true; } break; } } else { // normal text if (cd.Chat.ChatType == ChatType.Session && cd.FrontendManager != null && cd.FrontendManager.CurrentProtocolManager == null) { _NotConnected(cd); handled = true; } } return handled; } public void CommandHelp(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } var builder = CreateMessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of commands below builder.AppendHeader(_("Engine Commands")); AddMessageToFrontend(cd, builder.ToMessage()); string[] help = { "connect/server protocol [protocol-parameters]", "connect/server network", "disconnect [server]", "network list", "network close [network]", "network switch [network]", "config (save|load|list)", "config get key", "config set key=value", "config remove key", "shutdown" }; foreach (string line in help) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); AddMessageToFrontend(cd, builder.ToMessage()); } } public void CommandConnect(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } FrontendManager fm = cd.FrontendManager; MessageBuilder builder = null; string protocol = null; ServerModel server = null; // first lookup by network name if (cd.DataArray.Length == 2) { var network = cd.Parameter; var serverSettings = new ServerListController(UserConfig); server = serverSettings.GetServerByNetwork(network); if (server == null) { // HACK: simply assume the user meant irc if not specified // as Smuxi is still primarly an IRC client protocol = "irc"; string cmd = String.Format("{0}connect irc {1}", cd.CommandCharacter, cd.Parameter); cd = new CommandModel(fm, cd.Chat, cd.CommandCharacter, cmd); } } else if (cd.DataArray.Length >= 3) { protocol = cd.DataArray[1]; } else { _NotEnoughParameters(cd); return; } IProtocolManager protocolManager = null; // TODO: detect matching protocol managers, how to parse host and port // though in a protocol neutral ? /* foreach (IProtocolManager nm in _ProtocolManagers) { if (nm.Host == server && nm.Port == port) { // reuse network manager if (nm.IsConnected) { fm.AddTextToCurrentChat("-!- " + String.Format( _("Already connected to: {0}:{1}"), server, port)); return; } networkManager = nm; break; } } */ if (protocolManager == null && server == null) { try { protocolManager = CreateProtocolManager(protocol); lock (_ProtocolManagers) { _ProtocolManagers.Add(protocolManager); } } catch (ArgumentException ex) { if (ex.ParamName != "protocol") { throw; } // this is an unknown protocol error builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(ex.Message); AddMessageToFrontend(cd, builder.ToMessage()); return; } } // HACK: this is hacky as the Command parser of the protocol manager // will pass this command to it's connect method only if cd was // constructed correctly beginning with /connect // So make sure it's like it needs to be! if (cd.Command != "connect") { string cmd = String.Format("{0}connect {1}", cd.CommandCharacter, String.Join(" ", cd.DataArray, 1, cd.DataArray.Length - 1)); cd = new CommandModel(fm, cd.Chat, cd.CommandCharacter, cmd); } // run in background so it can't block the command queue ThreadPool.QueueUserWorkItem(delegate { try { if (protocolManager == null && server != null) { protocolManager = Connect(server, fm); } else { protocolManager.Command(cd); } // set this as current protocol manager // but only if there was none set (we might be on a chat for example) // or if this is the neutral "smuxi" tab if (fm.CurrentProtocolManager == null || (fm.CurrentChat != null && fm.CurrentChat.ChatType == ChatType.Session)) { fm.CurrentProtocolManager = protocolManager; fm.UpdateNetworkStatus(); } } catch (Exception ex) { #if LOG4NET f_Logger.Error("CommandConnect(): ", ex); #endif builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(_("Connect failed!")); fm.AddMessageToChat(cd.Chat, builder.ToMessage()); } }); } public void CommandDisconnect(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } FrontendManager fm = cd.FrontendManager; IProtocolManager victim = null; if (cd.DataArray.Length >= 2) { string server = cd.DataArray[1]; victim = GetProtocolManagerByHost(server); if (victim == null) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText( _("Disconnect failed - could not find server: {0}"), server ); AddMessageToFrontend(cd, builder.ToMessage()); return; } } else { victim = cd.Chat.ProtocolManager; } if (victim == null) { return; } victim.Disconnect(fm); victim.Dispose(); lock (_ProtocolManagers) { _ProtocolManagers.Remove(victim); } } public void CommandReconnect(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } var pm = cd.Chat.ProtocolManager; if (pm == null) { return; } ThreadPool.QueueUserWorkItem(delegate { try { pm.Reconnect(cd.FrontendManager); } catch (Exception ex) { #if LOG4NET f_Logger.Error("CommandReconnect(): ", ex); #endif var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(_("Reconnect failed!")); AddMessageToFrontend(cd, builder.ToMessage()); } }); } public void CommandConfig(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); var action = cd.DataArray[1].ToLower(); switch (action) { case "load": _Config.Load(); builder.AppendText(_("Configuration reloaded")); break; case "save": _Config.Save(); builder.AppendText(_("Configuration saved")); break; case "get": case "list": string key = null; if (action == "get" && cd.DataArray.Length >= 3) { key = cd.DataArray[2]; } foreach (var entry in _UserConfig.OrderBy(kvp => kvp.Key)) { if (key != null && entry.Key.IndexOf(key, StringComparison.InvariantCultureIgnoreCase) == -1) { continue; } builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText("{0} = {1}", entry.Key, entry.Value); AddMessageToFrontend(cd, builder.ToMessage()); } return; case "set": if (cd.DataArray.Length < 3) { _NotEnoughParameters(cd); return; } var setParam = String.Join(" ", cd.DataArray.Skip(2).ToArray()); if (!setParam.Contains("=")) { builder.AppendErrorText( _("Invalid key/value format.") ); AddMessageToFrontend(cd, builder.ToMessage()); return; } var setKey = setParam.Split('=')[0].Trim(); var setValue = String.Join( "=", setParam.Split('=').Skip(1).ToArray() ).Trim(); object oldValue = _UserConfig[setKey]; if (oldValue == null && setKey.StartsWith("MessagePatterns/")) { var id = setKey.Split('/')[1]; var parsedId = Int32.Parse(id); var msgPatternSettings = new MessagePatternListController(_UserConfig); var pattern = msgPatternSettings.Get(parsedId); if (pattern == null) { // pattern does not exist, create it with default values pattern = new MessagePatternModel(parsedId); msgPatternSettings.Add(pattern, parsedId); oldValue = _UserConfig[setKey]; } } if (oldValue == null) { builder.AppendErrorText( _("Invalid config key: '{0}'"), setKey ); AddMessageToFrontend(cd, builder.ToMessage()); return; } try { object newValue = Convert.ChangeType(setValue, oldValue.GetType()); _UserConfig[setKey] = newValue; builder.AppendText("{0} = {1}", setKey, newValue.ToString()); if (setKey.StartsWith("MessagePatterns/")) { MessageBuilderSettings.ApplyConfig(UserConfig); } } catch (InvalidCastException) { builder.AppendErrorText( _("Could not convert config value: '{0}' to type: {1}"), setValue, oldValue.GetType().Name ); } catch (FormatException) { builder.AppendErrorText( _("Could not convert config value: '{0}' to type: {1}"), setValue, oldValue.GetType().Name ); } break; case "remove": { if (cd.DataArray.Length < 3) { _NotEnoughParameters(cd); return; } var removeParam = cd.DataArray[2]; if (!removeParam.StartsWith("MessagePatterns/")) { builder.AppendErrorText( _("Invalid config remove key: '{0}'. Valid remove " + "keys: MessagePatterns/{{ID}}."), removeParam ); AddMessageToFrontend(cd, builder.ToMessage()); return; } var id = removeParam.Split('/')[1]; var parsedId = Int32.Parse(id); var patternController = new MessagePatternListController(_UserConfig); var pattern = patternController.Get(parsedId); if (pattern == null) { builder.AppendErrorText( _("Message pattern with ID: '{0}' does not exist."), id ); } else { patternController.Remove(parsedId); MessageBuilderSettings.ApplyConfig(UserConfig); builder.AppendText( _("Message pattern with ID: '{0}' removed."), id ); } break; } default: builder.AppendErrorText( _("Invalid parameter for config; use load, save, get or set.") ); break; } AddMessageToFrontend(cd, builder.ToMessage()); } public void CommandShutdown(CommandModel cmd) { Trace.Call(cmd); #if LOG4NET f_Logger.Info("Shutting down..."); #endif var frontendMgr = cmd != null ? cmd.FrontendManager : null; Shutdown(true, frontendMgr); if (IsLocal) { // allow the frontend to cleanly terminate return; } #if LOG4NET f_Logger.Debug("Terminating process..."); #endif Environment.Exit(0); } public void CommandEcho(CommandModel cmd) { Trace.Call(cmd); if (cmd == null) { throw new ArgumentNullException("cmd"); } var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(cmd.Parameter). ToMessage(); if (cmd.FrontendManager == null) { AddMessageToChat(cmd.Chat, msg, true); } else { cmd.FrontendManager.AddMessageToChat(cmd.Chat, msg); } } public void CommandNetwork(CommandModel cd) { Trace.Call(cd); if (cd == null) { throw new ArgumentNullException("cd"); } if (cd.DataArray.Length == 1) { // no parameter given, fallback to list _CommandNetworkList(cd); return; } if (cd.DataArray.Length >= 2) { switch (cd.DataArray[1].ToLower()) { case "list": _CommandNetworkList(cd); break; case "switch": _CommandNetworkSwitch(cd); break; case "close": _CommandNetworkClose(cd); break; default: var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Invalid parameter for network; use list, " + "switch, or close") ); AddMessageToFrontend(cd, builder.ToMessage()); break; } } else { _NotEnoughParameters(cd); } } private void _CommandNetworkList(CommandModel cmd) { var servers = new ServerListController(UserConfig); var availableNetworks = servers.GetNetworks(); var connectedNetworks = new List(); lock (_ProtocolManagers) { foreach (IProtocolManager pm in _ProtocolManagers) { if (pm.IsConnected) { connectedNetworks.Add(pm); if (!String.IsNullOrEmpty(pm.NetworkID)) { availableNetworks.Remove(pm.NetworkID); } } } } var msg = CreateMessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of networks below msg.AppendHeader(_("Connected Networks")); AddMessageToFrontend(cmd, msg.ToMessage()); foreach (var network in connectedNetworks) { msg = CreateMessageBuilder(); msg.AppendEventPrefix(); msg.AppendText("{0}: {1} ", _("Network"), network.NetworkID); msg.AppendText("{0}: {1} ", _("Protocol"), network.Protocol); msg.AppendText("{0}: {1} ", _("Host"), network.Host); msg.AppendText("{0}: {1}", _("Port"), network.Port); AddMessageToFrontend(cmd, msg.ToMessage()); } if (connectedNetworks.Count == 0) { msg = CreateMessageBuilder(); // TRANSLATOR: no connected networks msg.AppendEventPrefix().AppendText("<{0}>", _("None")); AddMessageToFrontend(cmd, msg.ToMessage()); } msg = CreateMessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of networks below msg.AppendHeader(_("Available Networks")); AddMessageToFrontend(cmd, msg.ToMessage()); foreach (var network in availableNetworks) { if (network == null || network.Trim().Length == 0) { continue; } msg = CreateMessageBuilder(); msg.AppendEventPrefix(); msg.AppendText("{0}: {1}", _("Network"), network); AddMessageToFrontend(cmd, msg.ToMessage()); } if (availableNetworks.Count == 0) { msg = CreateMessageBuilder(); // TRANSLATOR: no available networks msg.AppendEventPrefix().AppendText("<{0}>", _("None")); AddMessageToFrontend(cmd, msg.ToMessage()); } } private void _CommandNetworkClose(CommandModel cd) { IProtocolManager pm = null; if (cd.DataArray.Length >= 3) { // named protocol manager string network = cd.DataArray[2]; pm = GetProtocolManagerByNetwork(network); if (pm == null) { var builder = CreateMessageBuilder(); builder.AppendText(_("Network close failed - could not " + "find network: {0}"), network); AddMessageToFrontend(cd, builder.ToMessage()); return; } } else if (cd.DataArray.Length >= 2) { // network manager of chat pm = cd.Chat.ProtocolManager; } if (pm == null) { return; } // disconnect in background as could be blocking ThreadPool.QueueUserWorkItem(delegate { try { pm.Disconnect(cd.FrontendManager); pm.Dispose(); // Dispose() takes care of removing the chat from session (frontends) lock (_ProtocolManagers) { _ProtocolManagers.Remove(pm); } } catch (Exception ex) { #if LOG4NET f_Logger.Error("_CommandNetworkClose(): Exception", ex); #endif } }); } private void _CommandNetworkSwitch(CommandModel cd) { FrontendManager fm = cd.FrontendManager; if (fm == null) { _NotEnoughParameters(cd); return; } if (cd.DataArray.Length >= 3) { // named network manager string network = cd.DataArray[2]; var pm = GetProtocolManagerByNetwork(network); if (pm == null) { var builder = CreateMessageBuilder(); builder.AppendText(_("Network switch failed - could not " + "find network: {0}"), network); fm.AddMessageToChat(cd.Chat, builder.ToMessage()); return; } fm.CurrentProtocolManager = pm; fm.UpdateNetworkStatus(); } else if (cd.DataArray.Length >= 2) { // next network manager fm.NextProtocolManager(); } else { _NotEnoughParameters(cd); } } private void _NotConnected(CommandModel cd) { var builder = CreateMessageBuilder(); builder.AppendText(_("Not connected to any network")); AddMessageToFrontend(cd, builder.ToMessage()); } private void _NotEnoughParameters(CommandModel cd) { var builder = CreateMessageBuilder(); builder.AppendText(_("Not enough parameters for {0} command"), cd.Command); AddMessageToFrontend(cd, builder.ToMessage()); } public void UpdateNetworkStatus() { Trace.Call(); lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.UpdateNetworkStatus(); } } } public T CreateChat(string id, string name, IProtocolManager protocolManager) where T : ChatModel { Trace.Call(id, name, protocolManager); T chat; Type chatType = typeof(T); if (chatType == typeof(SessionChatModel)) { chat = (T) Activator.CreateInstance(chatType, id, name); } else if (chatType == typeof(PersonChatModel)) { throw new NotSupportedException( "PersonModel is not supported, use " + "Session.CreatePersionChat() instead" ); } else { chat = (T) Activator.CreateInstance(chatType, id, name, protocolManager); } chat.ApplyConfig(UserConfig); return chat; } public PersonChatModel CreatePersonChat(PersonModel person, IProtocolManager protocolManager) { Trace.Call(person, protocolManager); if (person == null) { throw new ArgumentNullException("person"); } return CreatePersonChat(person, person.ID, person.IdentityName, protocolManager); } public PersonChatModel CreatePersonChat(PersonModel person, string id, string name, IProtocolManager protocolManager) { Trace.Call(person, id, name, protocolManager); var chat = new PersonChatModel(person, id, name, protocolManager); chat.ApplyConfig(UserConfig); return chat; } public void AddChat(ChatModel chat) { Trace.Call(chat); if (chat == null) { throw new ArgumentNullException("chat"); } chat.Position = GetSortedChatPosition(chat); lock (_Chats) { _Chats.Add(chat); if (chat.Position == -1) { chat.Position = _Chats.IndexOf(chat); } else { MoveChat(chat, chat.Position); } } lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.AddChat(chat); } } } public void RemoveChat(ChatModel chat) { Trace.Call(chat); if (chat == null) { throw new ArgumentNullException("chat"); } lock (_Chats) { if (!_Chats.Remove(chat)) { #if LOG4NET f_Logger.Warn("RemoveChat(): _Chats.Remove(" + chat + ") failed, ignoring..."); #endif chat.Close(); return; } chat.Close(); // refresh chat positions foreach (var schat in _Chats) { schat.Position = _Chats.IndexOf(schat); } } lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.RemoveChat(chat); } } } public void EnableChat(ChatModel chat) { Trace.Call(chat); if (chat == null) { throw new ArgumentNullException("chat"); } chat.IsEnabled = true; lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.EnableChat(chat); } } } public void DisableChat(ChatModel chat) { Trace.Call(chat); if (chat == null) { throw new ArgumentNullException("chat"); } chat.IsEnabled = false; lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.DisableChat(chat); } } } public void SyncChat(ChatModel chat) { Trace.Call(chat); if (chat == null) { throw new ArgumentNullException("chat"); } lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.SyncChat(chat); } } } public void MoveChat(ChatModel chat, int newPosition) { Trace.Call(chat, newPosition); if (chat == null) { throw new ArgumentNullException("chat"); } lock (_Chats) { _Chats.Remove(chat); _Chats.Insert(newPosition, chat); foreach (var schat in _Chats) { schat.Position = _Chats.IndexOf(schat); } } } [Obsolete("This method is deprecated, use AddMessageToChat(ChatModel, MessageModel) instead!")] public void AddTextToChat(ChatModel chat, string text) { AddTextToChat(chat, text, false); } [Obsolete("This method is deprecated, use AddMessageToChat(ChatModel, MessageModel, bool) instead!")] public void AddTextToChat(ChatModel chat, string text, bool ignoreFilters) { if (chat == null) { throw new ArgumentNullException("chat"); } if (text == null) { throw new ArgumentNullException("text"); } AddMessageToChat(chat, new MessageModel(text), ignoreFilters); } public void AddMessageToChat(ChatModel chat, MessageModel msg) { AddMessageToChat(chat, msg, false); } public void AddMessageToChat(ChatModel chat, MessageModel msg, bool ignoreFilters) { if (chat == null) { throw new ArgumentNullException("chat"); } if (msg == null) { throw new ArgumentNullException("msg"); } bool isFiltered = !ignoreFilters && IsFilteredMessage(chat, msg); LogMessage(chat, msg, isFiltered); if (isFiltered) { return; } lock (chat.MessageBuffer) { try { chat.MessageBuffer.Add(msg); } catch (Exception ex) { #if LOG4NET Trace.Call(chat, msg, ignoreFilters); f_Logger.ErrorFormat( "AddMessageToChat({0}, {1}, {2}): " + "chat.MessageBuffer.Add() threw exception:", chat, msg, ignoreFilters ); f_Logger.Error("AddMessageToChat(): ", ex); #endif if (chat.MessageBuffer is Db4oMessageBuffer || chat.MessageBuffer is SqliteMessageBuffer) { #if LOG4NET f_Logger.Error( "AddMessageToChat(): " + "Falling back to volatile message buffer..." ); #endif chat.ResetMessageBuffer(); chat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText( _("Failed to write to chat history. " + "Your chat history will not be preserved. " + "Reason: {0}"), ex.Message ); chat.MessageBuffer.Add(builder.ToMessage()); chat.MessageBuffer.Add(msg); } } } lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.AddMessageToChat(chat, msg); } } if (msg.MessageType == MessageType.Event) { // on-event-message OnEventMessage( // at this point we no longer know who sent this nor to whom new EventMessageEventArgs(chat, msg, String.Empty, String.Empty) ); } } public void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person) { if (groupChat == null) { throw new ArgumentNullException("groupChat"); } if (person == null) { throw new ArgumentNullException("person"); } #if LOG4NET f_Logger.Debug("AddPersonToGroupChat() groupChat.Name: "+groupChat.Name+" person.IdentityName: "+person.IdentityName); #endif groupChat.UnsafePersons.Add(person.ID, person); lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.AddPersonToGroupChat(groupChat, person); } } OnGroupChatPersonAdded( new GroupChatPersonAddedEventArgs(groupChat, person) ); } public void UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { if (groupChat == null) { throw new ArgumentNullException("groupChat"); } if (oldPerson == null) { throw new ArgumentNullException("oldPerson"); } if (newPerson == null) { throw new ArgumentNullException("newPerson"); } #if LOG4NET f_Logger.Debug("UpdatePersonInGroupChat()" + " groupChat.Name: " + groupChat.Name + " oldPerson.IdentityName: " + oldPerson.IdentityName + " newPerson.IdentityName: " + newPerson.IdentityName); #endif // FIXME: do we have to lock groupChat.UnsafePersons here? // probably not, as long as the ProtocolManager who owns this chat // is only running one thread groupChat.UnsafePersons.Remove(oldPerson.ID); groupChat.UnsafePersons.Add(newPerson.ID, newPerson); lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.UpdatePersonInGroupChat(groupChat, oldPerson, newPerson); } } OnGroupChatPersonUpdated( new GroupChatPersonUpdatedEventArgs(groupChat, oldPerson, newPerson) ); } public void UpdateTopicInGroupChat(GroupChatModel groupChat, MessageModel topic) { if (groupChat == null) { throw new ArgumentNullException("groupChat"); } if (topic == null) { throw new ArgumentNullException("topic"); } #if LOG4NET f_Logger.Debug("UpdateTopicInGroupChat() groupChat.Name: " + groupChat.Name + " topic: " + topic.ToString()); #endif groupChat.Topic = topic; lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.UpdateTopicInGroupChat(groupChat, topic); } } } public void RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person) { if (groupChat == null) { throw new ArgumentNullException("groupChat"); } if (person == null) { throw new ArgumentNullException("person"); } #if LOG4NET f_Logger.Debug("RemovePersonFromGroupChat() groupChat.Name: " + groupChat.Name + " person.ID: "+person.ID); #endif groupChat.UnsafePersons.Remove(person.ID); lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.RemovePersonFromGroupChat(groupChat, person); } } OnGroupChatPersonRemoved( new GroupChatPersonRemovedEventArgs(groupChat, person) ); } public void SetNetworkStatus(string status) { if (status == null) { throw new ArgumentNullException("status"); } #if LOG4NET f_Logger.Debug("SetNetworkStatus() status: "+status); #endif lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.SetNetworkStatus(status); } } } public void SetStatus(string status) { if (status == null) { throw new ArgumentNullException("status"); } #if LOG4NET f_Logger.Debug("SetStatus() status: "+status); #endif lock (_FrontendManagers) { foreach (FrontendManager fm in _FrontendManagers.Values) { fm.SetStatus(status); } } } public IList GetSupportedProtocols() { return _ProtocolManagerFactory.GetProtocols(); } public IProtocolManager Connect(ServerModel server, FrontendManager frontendManager) { Trace.Call(server, frontendManager); if (server == null) { throw new ArgumentNullException("server"); } if (String.IsNullOrEmpty(server.Protocol)) { throw new ArgumentNullException("server.Protocol"); } IProtocolManager protocolManager = CreateProtocolManager( server.Protocol ); lock (_ProtocolManagers) { _ProtocolManagers.Add(protocolManager); } string password = null; // only pass non-empty passwords to Connect() if (!String.IsNullOrEmpty(server.Password)) { password = server.Password; } if (server.OnConnectCommands != null && server.OnConnectCommands.Count > 0) { protocolManager.Connected += delegate { ThreadPool.QueueUserWorkItem(delegate { try { foreach (string command in server.OnConnectCommands) { if (command.Length == 0) { continue; } try { var cd = new CommandModel( frontendManager, protocolManager.Chat, (string) _UserConfig["Interface/Entry/CommandCharacter"], command ); protocolManager.Command(cd); } catch (Exception ex) { #if LOG4NET f_Logger.Error("Connect(): Command in Connected event: Exception", ex); #endif var msg = CreateMessageBuilder(). AppendErrorText("Command '{0}' failed. Reason: {1} ({2})", command, ex.Message, ex.GetType()). ToMessage(); AddMessageToFrontend (frontendManager, protocolManager.Chat, msg); } } } catch (Exception ex) { #if LOG4NET f_Logger.Error("Connect(): Connected event: Exception", ex); #endif } }); }; } protocolManager.Connect(frontendManager, server); if (protocolManager.Chat == null) { // just in case the ProtocolManager is not setting the // protocol chat throw new ApplicationException(_("Connect failed.")); } return protocolManager; } private IProtocolManager CreateProtocolManager(string protocol) { ProtocolManagerInfoModel info = _ProtocolManagerFactory.GetProtocolManagerInfoByAlias(protocol); if (info == null) { if (_ProtocolManagerFactory.ProtocolManagerInfos.Count != 1) { throw new ArgumentException( String.Format( _("No protocol manager found for the protocol: {0}"), protocol ), "protocol" ); } // ok, we forgive the user not passing a valid protocol by // falling back to the only available protocol info = _ProtocolManagerFactory.ProtocolManagerInfos[0]; } return _ProtocolManagerFactory.CreateProtocolManager(info, this); } public void LogMessage(ChatModel chat, MessageModel msg, bool isFiltered) { if (chat == null) { throw new ArgumentNullException("chat"); } if (msg == null) { throw new ArgumentNullException("msg"); } if (!(bool) UserConfig["Logging/Enabled"]) { return; } if (isFiltered && !(bool) UserConfig["Logging/LogFilteredMessages"]) { return; } if (chat.ChatType == ChatType.Session || chat.ChatType == ChatType.Protocol) { return; } try { // HACK: twitter retrieves older messages and we don't want to // re-log those when the twitter connection is re-opened var protocol = chat.ProtocolManager.Protocol.ToLower(); if (protocol == "twitter") { return; } // don't log chatstates switch (msg.MessageType) { case MessageType.ChatStateComposing: case MessageType.ChatStatePaused: case MessageType.ChatStateReset: return; } using (var stream = File.AppendText(chat.LogFile)) { stream.WriteLine( String.Format( "[{0:yyyy-MM-dd HH:mm:ss}] {1}", msg.TimeStamp.ToLocalTime(), msg.ToString() ) ); } } catch (Exception ex) { #if LOG4NET f_Logger.Error("LogMessage(): logging error", ex); #endif } } public bool IsFilteredMessage(ChatModel chat, MessageModel msg) { if (chat == null) { throw new ArgumentNullException("chat"); } if (msg == null) { throw new ArgumentNullException("msg"); } return IsFilteredMessage(chat, msg.ToString(), msg.MessageType); } public bool IsFilteredMessage(ChatModel chat, string msg, MessageType msgType) { if (chat == null) { throw new ArgumentNullException("chat"); } if (msg == null) { throw new ArgumentNullException("msg"); } lock (_Filters) { foreach (var filter in _Filters) { if (!String.IsNullOrEmpty(filter.Protocol) && chat.ProtocolManager != null && filter.Protocol != chat.ProtocolManager.Protocol) { continue; } if (!String.IsNullOrEmpty(filter.NetworkID) && chat.ProtocolManager != null && String.Compare(filter.NetworkID, chat.ProtocolManager.NetworkID, StringComparison.OrdinalIgnoreCase) != 0) { continue; } if (filter.ChatType.HasValue && filter.ChatType != chat.ChatType) { continue; } if (!String.IsNullOrEmpty(filter.ChatID) && !Pattern.IsMatch(chat.ID, filter.ChatID)) { continue; } if (filter.MessageType.HasValue && filter.MessageType != msgType) { continue; } if (!String.IsNullOrEmpty(filter.MessagePattern)) { var pattern = filter.MessagePattern; if (!Pattern.ContainsPatternCharacters(pattern)) { // use globbing by default pattern = String.Format("*{0}*", pattern); } if (!Pattern.IsMatch(msg, pattern)) { continue; } } return true; } } return false; } public void AddMessageToFrontend(CommandModel cmd, MessageModel msg) { if (cmd == null) { throw new ArgumentNullException("cmd"); } AddMessageToFrontend(cmd.FrontendManager, cmd.Chat, msg); } public void AddMessageToFrontend(FrontendManager fm, ChatModel chat, MessageModel msg) { if (chat == null) { throw new ArgumentNullException("chat"); } if (msg == null) { throw new ArgumentNullException("msg"); } if (fm == null) { // fallback to session AddMessageToChat(chat, msg); } else { fm.AddMessageToChat(chat, msg); } } void OnUserConfigChanged(object sender, ConfigChangedEventArgs e) { if (e.Key.StartsWith("Filters/")) { #if LOG4NET f_Logger.Debug("OnUserConfigChanged(): refreshing filters"); #endif // referesh filters // TODO: use a timeout here to only refresh once in 1 second _Filters = _FilterListController.GetFilterList().Values; } if (e.Key == "Interface/Chat/HighlightWords") { MessageBuilderSettings.ApplyConfig(UserConfig); } if (e.Key == "Interface/Notebook/EngineBufferLines") { lock (_Chats) { foreach (var chat in _Chats) { chat.ApplyConfig(UserConfig); } } } } public void CheckPresenceStatus() { Trace.Call(); var newStatus = PresenceStatus.Unknown; var newMessage = String.Empty; lock (_FrontendManagers) { if (_FrontendManagers.Count == 0) { newStatus = PresenceStatus.Away; newMessage = "away from keyboard"; } else { newStatus = PresenceStatus.Online; } } if (newStatus == PresenceStatus.Unknown) { return; } UpdatePresenceStatus(newStatus, newMessage); } public void Shutdown() { Shutdown(false, null); } public void Shutdown(bool clean, FrontendManager frontendManager) { Trace.Call(clean, frontendManager); #if LOG4NET f_Logger.Debug("Shutdown(): flushing all message buffers"); #endif lock (_Chats) { foreach (var chat in _Chats) { try { chat.MessageBuffer.Flush(); } catch (Exception ex) { #if LOG4NET f_Logger.ErrorFormat( "Shutdown(): {0}.MessageBuffer.Flush() " + "failed, continuing with shutdown...", chat.ToString() ); f_Logger.Error("Shutdown(): Exception", ex); #endif } } } if (!clean) { return; } #if LOG4NET f_Logger.Debug("Shutdown(): disconnecting and disposing all protocol manangers"); #endif lock (_ProtocolManagers) { foreach (var protocolManager in _ProtocolManagers) { try { protocolManager.Disconnect(frontendManager); protocolManager.Dispose(); } catch (Exception ex) { #if LOG4NET f_Logger.ErrorFormat( "Shutdown(): {0}.Disconnect/Dispose() " + "failed, continuing with shutdown...", protocolManager.ToString() ); f_Logger.Error("Shutdown(): Exception", ex); #endif } } } } void UpdatePresenceStatus(PresenceStatus status, string message) { lock (_ProtocolManagers) { foreach (var manager in _ProtocolManagers) { manager.SetPresenceStatus(status, message); } } } IProtocolManager GetProtocolManagerByHost(string network) { lock (_ProtocolManagers) { foreach (var manager in _ProtocolManagers) { if (String.Compare(manager.Host, network, true) == 0) { return manager; } } } return null; } IProtocolManager GetProtocolManagerByNetwork(string network) { lock (_ProtocolManagers) { foreach (var manager in _ProtocolManagers) { if (String.Compare(manager.NetworkID, network, true) == 0) { return manager; } } } return null; } int GetSortedChatPosition(ChatModel chatModel) { int position = chatModel.Position; if (position != -1) { return position; } ChatType type = chatModel.ChatType; if (type != ChatType.Person && type != ChatType.Group) { return position; } // new group person and group chats behind their protocol chat IProtocolManager pm = chatModel.ProtocolManager; lock (_Chats) { foreach (var chat in _Chats) { if (chat.ChatType == ChatType.Protocol && chat.ProtocolManager == pm) { position = _Chats.IndexOf(chat) + 1; break; } } if (position == -1) { return position; } // now find the first chat with a different protocol manager foreach (var chat in _Chats.Skip(position)) { if (chat.ProtocolManager != pm) { return _Chats.IndexOf(chat); } } } // if there was no next protocol manager, simply append // the chat way to the end return -1; } void InitSessionChat() { _SessionChat = new SessionChatModel("smuxi", "Smuxi"); _Chats.Add(_SessionChat); var builder = CreateMessageBuilder(); var text = builder.CreateText(_("Welcome to Smuxi")); text.ForegroundColor = new TextColor(255, 0, 0); text.Bold = true; builder.AppendText(text); builder.AppendText(Environment.NewLine); text = builder.CreateText( _("Type /help to get a list of available commands.") ); text.Bold = true; builder.AppendText(text); builder.AppendText(Environment.NewLine); text = builder.CreateText(_("After you have made a connection " + "the list of available commands changes. Go to the newly " + "opened connection tab and use the /help command again to " + "see the extended command list.")); text.Bold = true; builder.AppendText(text); builder.AppendText(Environment.NewLine); AddMessageToChat(_SessionChat,builder.ToMessage()); } void UpdateNewsFeed() { Trace.Call(); try { var proxySettings = new ProxySettings(); proxySettings.ApplyConfig(UserConfig); var url = "http://news.smuxi.org/feed.php"; var req = WebRequest.Create(url); req.Proxy = proxySettings.GetWebProxy(url); if (req is HttpWebRequest) { var httpReq = (HttpWebRequest) req; httpReq.UserAgent = Engine.VersionString; if (NewsFeedLastModified != DateTime.MinValue) { httpReq.IfModifiedSince = NewsFeedLastModified; } } var res = req.GetResponse(); if (res is HttpWebResponse) { var httpRes = (HttpWebResponse) res; if (httpRes.StatusCode == HttpStatusCode.NotModified) { return; } NewsFeedLastModified = httpRes.LastModified; } var feed = AtomFeed.Load(res.GetResponseStream()); var sortedEntries = feed.Entry.OrderBy(x => x.Published); foreach (var entry in sortedEntries) { if (SeenNewsFeedIds.Contains(entry.Id)) { continue; } SeenNewsFeedIds.Add(entry.Id); var msg = new FeedMessageBuilder(); if (IsFirstNewsFeedEntry) { IsFirstNewsFeedEntry = false; msg.AppendText("\n"); msg.AppendHeader("Smuxi News"); msg.AppendText("\n"); } msg.Append(entry); if (!msg.IsEmpty) { msg.AppendText("\n"); AddMessageToChat(SessionChat, msg.ToMessage()); } } } catch (WebException ex) { switch (ex.Status) { case WebExceptionStatus.ConnectFailure: case WebExceptionStatus.ConnectionClosed: case WebExceptionStatus.Timeout: case WebExceptionStatus.ReceiveFailure: case WebExceptionStatus.NameResolutionFailure: case WebExceptionStatus.ProxyNameResolutionFailure: #if LOG4NET f_Logger.Warn( String.Format( "UpdateNewsFeed(): Temporarily issue " + "detected, retrying in {0} min...", NewsFeedRetryInterval.Minutes ), ex ); #endif NewsFeedTimer.Change(NewsFeedRetryInterval, NewsFeedUpdateInterval); break; } } catch (Exception ex) { #if LOG4NET f_Logger.Error("UpdateNewsFeed(): Exception, ignored...", ex); #endif } } protected virtual void OnGroupChatPersonAdded(GroupChatPersonAddedEventArgs e) { if (GroupChatPersonAdded != null) { GroupChatPersonAdded(this, e); } var pm = e.GroupChat.ProtocolManager; var hooks = new HookRunner("engine", "session", "on-group-chat-person-added"); hooks.Environments.Add(new ChatHookEnvironment(e.GroupChat)); if (pm != null) { hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm)); } hooks.Environments.Add(new PersonHookEnvironment(e.AddedPerson)); var cmdChar = (string) UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(this, e.GroupChat, cmdChar)); if (pm != null) { hooks.Commands.Add(new ProtocolManagerHookCommand(pm, e.GroupChat, cmdChar)); } // show time hooks.Init(); hooks.Run(); } protected virtual void OnGroupChatPersonRemoved(GroupChatPersonRemovedEventArgs e) { if (GroupChatPersonRemoved != null) { GroupChatPersonRemoved(this, e); } var pm = e.GroupChat.ProtocolManager; var hooks = new HookRunner("engine", "session", "on-group-chat-person-removed"); hooks.Environments.Add(new ChatHookEnvironment(e.GroupChat)); if (pm != null) { hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm)); } hooks.Environments.Add(new PersonHookEnvironment(e.RemovedPerson)); var cmdChar = (string) UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(this, e.GroupChat, cmdChar)); if (pm != null) { hooks.Commands.Add(new ProtocolManagerHookCommand(pm, e.GroupChat, cmdChar)); } // show time hooks.Init(); hooks.Run(); } protected virtual void OnGroupChatPersonUpdated(GroupChatPersonUpdatedEventArgs e) { if (GroupChatPersonUpdated != null) { GroupChatPersonUpdated(this, e); } var pm = e.GroupChat.ProtocolManager; var hooks = new HookRunner("engine", "session", "on-group-chat-person-updated"); hooks.Environments.Add(new ChatHookEnvironment(e.GroupChat)); if (pm != null) { hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm)); } hooks.Environments.Add(new PersonHookEnvironment("OLD_", e.OldPerson)); hooks.Environments.Add(new PersonHookEnvironment("NEW_", e.NewPerson)); var cmdChar = (string) UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(this, e.GroupChat, cmdChar)); if (pm != null) { hooks.Commands.Add(new ProtocolManagerHookCommand(pm, e.GroupChat, cmdChar)); } // show time hooks.Init(); hooks.Run(); } protected virtual void OnEventMessage(EventMessageEventArgs e) { if (EventMessage != null) { EventMessage(this, e); } var pm = e.Chat.ProtocolManager; var hooks = new HookRunner("engine", "session", "on-event-message"); hooks.Environments.Add(new ChatHookEnvironment(e.Chat)); if (pm != null) { hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm)); } hooks.Environments.Add(new MessageHookEnvironment(e.Message, e.Sender, e.Receiver)); var cmdChar = (string) UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(this, e.Chat, cmdChar)); if (pm != null) { hooks.Commands.Add(new ProtocolManagerHookCommand(pm, e.Chat, cmdChar)); } // show time hooks.Init(); hooks.Run(); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } public abstract class GroupChatEventArgs : EventArgs { public GroupChatModel GroupChat { get; protected set; } } public class GroupChatPersonAddedEventArgs : GroupChatEventArgs { public PersonModel AddedPerson { get; private set; } public GroupChatPersonAddedEventArgs(GroupChatModel groupChat, PersonModel addedPerson) { GroupChat = groupChat; AddedPerson = addedPerson; } } public class GroupChatPersonRemovedEventArgs : GroupChatEventArgs { public PersonModel RemovedPerson { get; private set; } public GroupChatPersonRemovedEventArgs(GroupChatModel groupChat, PersonModel removedPerson) { GroupChat = groupChat; RemovedPerson = removedPerson; } } public class GroupChatPersonUpdatedEventArgs : GroupChatEventArgs { public PersonModel OldPerson { get; private set; } public PersonModel NewPerson { get; private set; } public GroupChatPersonUpdatedEventArgs(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { GroupChat = groupChat; OldPerson = oldPerson; NewPerson = newPerson; } } public class EventMessageEventArgs : EventArgs { public ChatModel Chat { get; protected set; } public MessageModel Message { get; protected set; } public string Sender { get; protected set; } public string Receiver { get; protected set; } public EventMessageEventArgs(ChatModel chat, MessageModel msg, string sender, string receiver) { Chat = chat; Message = msg; Sender = sender; Receiver = receiver; } } } smuxi-1.1/src/Engine/Chats/0000775000175000017500000000000014011526501016351 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine/Chats/SessionChatModel.cs0000644000175000017500000000245711700531605022115 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008, 2011 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Engine { public class SessionChatModel : ChatModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public SessionChatModel(string id, string name) : base(id, name, ChatType.Session, null) { Position = 0; } } } smuxi-1.1/src/Engine/Chats/PersonChatModel.cs0000644000175000017500000000351212726351313021736 0ustar00meebeymeebey00000000000000/* * $Id: ChannelPage.cs 137 2006-11-06 18:49:57Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/ChannelPage.cs $ * $Rev: 137 $ * $Author: meebey $ * $Date: 2006-11-06 19:49:57 +0100 (Mon, 06 Nov 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Common; namespace Smuxi.Engine { public class PersonChatModel : ChatModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private PersonModel _Person; public PersonModel Person { get { return _Person; } set { _Person = value; } } public PersonChatModel(PersonModel person, string id, string name, IProtocolManager networkManager) : base(id, name, ChatType.Person, networkManager) { _Person = person; } } } smuxi-1.1/src/Engine/Chats/ProtocolChatModel.cs0000644000175000017500000000310111655545675022303 0ustar00meebeymeebey00000000000000/* * $Id: ChannelPage.cs 137 2006-11-06 18:49:57Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/ChannelPage.cs $ * $Rev: 137 $ * $Author: meebey $ * $Date: 2006-11-06 19:49:57 +0100 (Mon, 06 Nov 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Common; namespace Smuxi.Engine { public class ProtocolChatModel : ChatModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public ProtocolChatModel(string id, string name, IProtocolManager networkManager) : base(id, name, ChatType.Protocol, networkManager) { } } } smuxi-1.1/src/Engine/Chats/GroupChatModel.cs0000644000175000017500000001767411700531610021571 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2009, 2011 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using System.Collections.Specialized; using Smuxi.Common; namespace Smuxi.Engine { public class GroupChatModel : ChatModel { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif //private Hashtable _Persons = Hashtable.Synchronized(new Hashtable()); // shouldn't need threadsafe wrapper, only the "owning" IRC thread should write to it private Dictionary _Persons = new Dictionary(); private bool _IsSynced; // HACK: IRC specific? private MessageModel _Topic; private int _PersonCount = -1; public override bool IsEnabled { get { return base.IsEnabled; } internal set { base.IsEnabled = value; if (!value) { _Topic = null; _Persons.Clear(); _IsSynced = false; } } } public MessageModel Topic { get { return _Topic; } set { _Topic = value; } } // safe version public IDictionary Persons { get { // during cloning, someone could modify it and break the enumerator lock (_Persons) { // HACK: return null if the dictionary is empty as MS .NET // deserializer doesn't like the Mono one, see: // http://projects.qnetp.net/issues/show/198 if (_Persons.Count == 0) { return null; } return new Dictionary(_Persons, _Persons.Comparer); } } } // ProtocolManagers need access to this public IDictionary UnsafePersons { get { lock (_Persons) { return _Persons; } } } public IEqualityComparer UnsafePersonsComparer { get { lock (_Persons) { return _Persons.Comparer; } } set { if (value == null) { return; } lock (_Persons) { _Persons = new Dictionary(_Persons, value); } } } public int PersonCount { get { if (_PersonCount != -1) { return _PersonCount; } return _Persons.Count; } set { _PersonCount = value; } } public bool IsSynced { get { return _IsSynced; } set { _IsSynced = value; } } public GroupChatModel(string id, string name, IProtocolManager networkManager) : base(id, name, ChatType.Group, networkManager) { } public PersonModel GetPerson(string id) { if (id == null) { throw new ArgumentNullException("id"); } PersonModel personModel; _Persons.TryGetValue(id, out personModel); return personModel; } public PersonModel PersonLookup(string identityName) { Trace.Call(identityName); #if LOG4NET _Logger.Debug("PersonLookup(): GroupChatModel.Name: " + Name); #endif int identityNameLength = identityName.Length; // must use a safe version (copy) here of Users, public methods which can be used by a frontend (or many) var persons = Persons; if (persons == null) { return null; } foreach (PersonModel person in persons.Values) { if ((person.IdentityName.Length >= identityNameLength) && (person.IdentityName.Substring(0, identityNameLength).ToLower() == identityName.ToLower())) { #if LOG4NET _Logger.Debug("PersonLookup(): found: " + person.IdentityName); #endif return person; } } #if LOG4NET _Logger.Debug("PersonLookup() no matching identityName found"); #endif return null; } public IList PersonLookupAll(string identityName) { Trace.Call(identityName); //IList foundPersons = new List(); IList foundIdentityNames = new List(); int identityNameLength = identityName.Length; string longestIdentityName = String.Empty; // must use a copy here of Users, public method which can be used by a frontend (or many) var persons = Persons; if (persons == null) { return foundIdentityNames; } foreach (PersonModel person in persons.Values) { if ((person.IdentityName.Length >= identityNameLength) && (person.IdentityName.Substring(0, identityNameLength).ToLower() == identityName.ToLower())) { foundIdentityNames.Add(person.IdentityName); if (person.IdentityName.Length > longestIdentityName.Length) { longestIdentityName = person.IdentityName; } } } // guess the common part of the found nicknames string common_nick = identityName; bool match = true; while (match) { if (common_nick.Length >= longestIdentityName.Length) { break; } common_nick += longestIdentityName[common_nick.Length]; foreach (string name in foundIdentityNames) { if (!name.ToLower().StartsWith(common_nick.ToLower())) { common_nick = common_nick.Substring(0, common_nick.Length - 1); match = false; } } } if (foundIdentityNames.Count == 0) { #if LOG4NET _Logger.Debug("PersonLookupAll(): no matching identityName found"); #endif } else if (foundIdentityNames.Count == 1) { #if LOG4NET _Logger.Debug("PersonLookupAll(): found exact match: " + foundIdentityNames[0]); #endif } else { #if LOG4NET _Logger.Debug("PersonLookupAll(): found " + foundIdentityNames.Count + " matches"); #endif foundIdentityNames.Insert(0, common_nick); } return foundIdentityNames; } } } smuxi-1.1/src/Engine/Chats/ChatType.cs0000644000175000017500000000233011655545675020445 0ustar00meebeymeebey00000000000000/* * $Id: PageType.cs 149 2007-04-11 16:47:52Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/PageType.cs $ * $Rev: 149 $ * $Author: meebey $ * $Date: 2007-04-11 18:47:52 +0200 (Wed, 11 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ namespace Smuxi.Engine { public enum ChatType { Session, Protocol, Person, Group, } } smuxi-1.1/src/Engine/Chats/ChatModel.cs0000664000175000017500000003333513411450522020551 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2008, 2010-2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Collections; using System.Collections.Generic; using Smuxi.Common; namespace Smuxi.Engine { public abstract class ChatModel : PermanentRemoteObject, ITraceable { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif const string LibraryTextDomain = "smuxi-engine"; private string _ID; private string _Name; private ChatType _ChatType; private IProtocolManager _ProtocolManager; //private List _Messages = new List(); private bool _IsEnabled = true; private string _LogFile; // TODO: make persistent public int Position { get; set; } public IMessageBuffer MessageBuffer { get; private set; } public int MessagesSyncCount { get; set; } public string ID { get { return _ID; } } public string Name { get { return _Name; } set { _Name = value; } } public ChatType ChatType { get { return _ChatType; } } public IProtocolManager ProtocolManager { get { return _ProtocolManager; } } [Obsolete("Use ChatModel.MessageBuffer instead.")] public IList Messages { get { try { return GetSyncMessages(); } catch (Exception ex) { #if LOG4NET _Logger.Error( String.Format( "{0}.get_Messages(): " + "GetSyncMessages() threw exception!", this ), ex ); #endif if (!(MessageBuffer is ListMessageBuffer)) { #if LOG4NET _Logger.Error( String.Format( "{0}.get_Messages(): " + "Falling back to volatile message buffer...", this ) ); #endif ResetMessageBuffer(); InitMessageBuffer(MessageBufferPersistencyType.Volatile); var builder = new MessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText( _("Failed to load chat history. " + "Your chat history will not be preserved. " + "Reason: {0}"), ex.Message ); MessageBuffer.Add(builder.ToMessage()); return GetSyncMessages(); } throw; } } } public virtual bool IsEnabled { get { return _IsEnabled; } internal set { _IsEnabled = value; } } public DateTime LastSeenHighlight { get { if (MessageBuffer == null) { return DateTime.MinValue; } return MessageBuffer.LastSeenHighlight; } set { var msgBuffer = MessageBuffer; if (msgBuffer == null) { #if LOG4NET _Logger.ErrorFormat( "{0}.set_LastSeenHighlight(): MessageBuffer is null, " + "ignoring set call...", this ); #endif return; } msgBuffer.LastSeenHighlight = value; } } public DateTime LastSeenMessage { get { if (MessageBuffer == null) { return DateTime.MinValue; } return MessageBuffer.LastSeenMessage; } set { var msgBuffer = MessageBuffer; if (msgBuffer == null) { #if LOG4NET _Logger.ErrorFormat( "{0}.set_LastSeenMessage(): MessageBuffer is null, " + "ignoring set call...", this ); #endif return; } msgBuffer.LastSeenMessage = value; } } public string LogFile { get { if (_LogFile == null) { _LogFile = GetLogFile(); } return _LogFile; } } protected ChatModel(string id, string name, ChatType chatType, IProtocolManager networkManager) { _ID = id; _Name = name; _ChatType = chatType; _ProtocolManager = networkManager; Position = -1; if (ProtocolManager == null) { InitMessageBuffer(MessageBufferPersistencyType.Volatile); } } public override string ToString() { return String.Format("<{0}>", ToTraceString()); } public string ToTraceString() { string nm; if (_ProtocolManager == null) { nm = "(null)"; } else { nm = String.Format("{0}/{1}", _ProtocolManager.Protocol, _ProtocolManager.NetworkID ); } return nm + "/" + _Name; } public void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } MessagesSyncCount = (int) config["Interface/Notebook/EngineBufferLines"]; var enumStr = (string) config["MessageBuffer/PersistencyType"]; MessageBufferPersistencyType persistency; try { persistency = (MessageBufferPersistencyType) Enum.Parse( typeof(MessageBufferPersistencyType), enumStr, true ); } catch (ArgumentException ex) { #if LOG4NET _Logger.Error("ApplyConfig(): failed to parse " + "PersistencyType: " + enumStr, ex); #endif persistency = MessageBufferPersistencyType.Volatile; } InitMessageBuffer(persistency); string maxCapacityKey; if (persistency == MessageBufferPersistencyType.Volatile) { maxCapacityKey = "MessageBuffer/Volatile/MaxCapacity"; } else { maxCapacityKey = "MessageBuffer/Persistent/MaxCapacity"; } MessageBuffer.MaxCapacity = (int) config[maxCapacityKey]; } public void Close() { if (MessageBuffer != null) { MessageBuffer.Dispose(); } } private string GetLogFile() { if (_ProtocolManager == null) { return null; } var logPath = Platform.LogPath; var protocol = _ProtocolManager.Protocol.ToLower(); var network = _ProtocolManager.NetworkID.ToLower(); logPath = Path.Combine(logPath, protocol); if (network != protocol) { logPath = Path.Combine(logPath, network); } logPath = IOSecurity.GetFilteredPath(logPath); if (!Directory.Exists(logPath)) { Directory.CreateDirectory(logPath); } var chatId = IOSecurity.GetFilteredFileName(ID.ToLower()); logPath = Path.Combine(logPath, String.Format("{0}.log", chatId)); return logPath; } IList GetSyncMessages() { // during cloning, someone could modify it and break the enumerator lock (MessageBuffer) { if (MessageBuffer.Count == 0) { return new List(0); } if (MessagesSyncCount <= 0) { return new List(MessageBuffer); } else { var offset = MessageBuffer.Count - MessagesSyncCount; if (offset < 0) { offset = 0; } return MessageBuffer.GetRange(offset, MessagesSyncCount); } } } public void InitMessageBuffer(MessageBufferPersistencyType persistency) { Trace.Call(persistency); if (MessageBuffer != null) { return; } switch (persistency) { case MessageBufferPersistencyType.Volatile: MessageBuffer = new ListMessageBuffer(); break; case Smuxi.Engine.MessageBufferPersistencyType.PersistentDb4o: try { var start = DateTime.UtcNow; MessageBuffer = new Db4oMessageBuffer( ProtocolManager.Session.Username, ProtocolManager.Protocol, ProtocolManager.NetworkID, ID ); var stop = DateTime.UtcNow; #if LOG4NET _Logger.DebugFormat( "InitMessageBuffer(): initializing " + "Db4oMessageBuffer({0}, {1}, {2}, {3}) " + "took: {4:0.00} ms", ProtocolManager.Session.Username, ProtocolManager.Protocol, ProtocolManager.NetworkID, ID, (stop - start).TotalMilliseconds ); #endif } catch (Exception ex) { #if LOG4NET _Logger.Error( "InitMessageBuffer(): Db4oMessageBuffer() threw " + "exception, falling back to memory backend!", ex ); #endif MessageBuffer = new ListMessageBuffer(); var builder = new MessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText( _("Failed to open chat history for writing. " + "Your chat history will not be preserved. " + "Reason: {0}"), ex.Message ); MessageBuffer.Add(builder.ToMessage()); } break; case Smuxi.Engine.MessageBufferPersistencyType.Persistent: case Smuxi.Engine.MessageBufferPersistencyType.PersistentSqlite: { var start = DateTime.UtcNow; MessageBuffer = new SqliteMessageBuffer( ProtocolManager.Session.Username, ProtocolManager.Protocol, ProtocolManager.NetworkID, ID ); var stop = DateTime.UtcNow; #if LOG4NET _Logger.DebugFormat( "InitMessageBuffer(): initializing " + "SqliteMessageBuffer({0}, {1}, {2}, {3}) " + "took: {4:0.00} ms", ProtocolManager.Session.Username, ProtocolManager.Protocol, ProtocolManager.NetworkID, ID, (stop - start).TotalMilliseconds ); #endif } break; } } public void ResetMessageBuffer() { Trace.Call(); if (MessageBuffer == null) { // nothing to reset return; } lock (MessageBuffer) { try { MessageBuffer.Dispose(); } catch (Exception ex) { #if LOG4NET _Logger.Warn( "ResetMessageBuffer(): MessageBuffer.Dispose() " + "threw exception!", ex ); #endif } } MessageBuffer = null; } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } } smuxi-1.1/src/Engine/Engine.cs0000664000175000017500000001663714011467170017066 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2017 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Text; using System.Reflection; using Smuxi.Common; namespace Smuxi.Engine { public class Engine { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static bool _IsInitialized; private static string _VersionString; private static Config _Config; private static SessionManager _SessionManager; private static ProtocolManagerFactory _ProtocolManagerFactory; public static Version AssemblyVersion { get { var asm = Assembly.GetEntryAssembly(); if (asm == null) { asm = Assembly.GetAssembly(typeof(Engine)); } var asm_name = asm.GetName(false); return asm_name.Version; } } [Obsolete("Use AssemblyVersion or ProtocolVersion instead.")] public static Version Version { get { return AssemblyVersion; } } public static string VersionString { get { return _VersionString; } } public static Version ProtocolVersion { get { // major == compatibility // minor == features // in 0.11 added: // ServerModel.Nickname // ServerModel.Realname // in 0.12 added: // ChatModel.LastSeenMessage // in 0.13 added: // SessionManager.EngineAssemblyVersion // SessionManager.EngineProtocolVersion // in 0.14 added: // Config.SetAll() return new Version("0.14"); } } public static Config Config { get { return _Config; } } public static ProtocolManagerFactory ProtocolManagerFactory { get { return _ProtocolManagerFactory; } } public static SessionManager SessionManager { get { return _SessionManager; } } public static bool IsInitialized { get { return _IsInitialized; } } public static void Init() { if (_IsInitialized) { return; } _IsInitialized = true; var asm = Assembly.GetEntryAssembly(); if (asm == null) { asm = Assembly.GetAssembly(typeof(Engine)); } var asm_name = asm.GetName(false); var distVersion = Defines.DistVersion; if (!String.IsNullOrEmpty(distVersion)) { distVersion = String.Format(" ({0})", distVersion); } _VersionString = String.Format( "{0} {1}{2} - running on {3} {4}", Path.GetFileNameWithoutExtension(asm_name.Name), AssemblyVersion, distVersion, Platform.OperatingSystem, Platform.Architecture ); _Config = new Config(); _Config.Load(); // migration config settins from 1.0 or earlier to 1.1 if (_Config.PreviousVersion == null || _Config.PreviousVersion < new Version(1, 1)) { // migrate all existing IRC connections for Slack to the // SlackProtocolManager var users = (string[]) _Config["Engine/Users/Users"]; if (users != null) { foreach (var user in users) { var userConfig = new UserConfig(_Config, user); var serverController = new ServerListController(userConfig); var servers = serverController.GetServerList(); foreach (var server in servers) { if (server.Protocol != "IRC") { continue; } if (!server.Hostname.EndsWith(".irc.slack.com")) { continue; } #if LOG4NET f_Logger.InfoFormat( "Migrating Slack server '{0}' of user '{1}' " + "from IRC to Slack protocol manager", server, user ); #endif // this is Slack IRC bridge connection var migratedServer = new ServerModel(server); migratedServer.ServerID = null; migratedServer.Protocol = "Slack"; serverController.AddServer(migratedServer); // remove old Slack server with IRC as protocol serverController.RemoveServer(server.Protocol, server.ServerID); } } } _Config["Engine/ConfigVersion"] = _Config.CurrentVersion.ToString(); } _Config.Save(); string location = Path.GetDirectoryName(asm.Location); if (String.IsNullOrEmpty(location) && Environment.OSVersion.Platform == PlatformID.Unix) { // we are mkbundled var locationBuilder = new StringBuilder(8192); if (Mono.Unix.Native.Syscall.readlink("/proc/self/exe", locationBuilder) >= 0) { location = Path.GetDirectoryName(locationBuilder.ToString()); } } _ProtocolManagerFactory = new ProtocolManagerFactory(); _ProtocolManagerFactory.LoadAllProtocolManagers(location); } public static void InitSessionManager() { if (_SessionManager != null) { return; } if (_Config == null || _ProtocolManagerFactory == null) { throw new InvalidOperationException("Init() must be called first!"); } _SessionManager = new SessionManager(_Config, _ProtocolManagerFactory); } public static void Shutdown() { SessionManager.Shutdown(); Environment.Exit(0); } } } smuxi-1.1/src/Frontend/0000775000175000017500000000000014011526501015661 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend/IEntryView.cs0000644000175000017500000000242211655545675020303 0ustar00meebeymeebey00000000000000/* * $Id: AboutDialog.cs 122 2006-04-26 19:31:42Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AboutDialog.cs $ * $Rev: 122 $ * $Author: meebey $ * $Date: 2006-04-26 21:31:42 +0200 (Wed, 26 Apr 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Engine; namespace Smuxi.Frontend { public interface IEntryView { string Text { get; set; } } } smuxi-1.1/src/Frontend/LongestPrefixNickCompleter.cs0000644000175000017500000001147312250426634023476 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2013 Mirco Bauer * Copyright (c) 2013 Ondra Hosek * * Full GPL License: * * 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 */ using System; using System.Linq; using System.Collections.Generic; using Smuxi.Engine; namespace Smuxi.Frontend { /// /// Longest Common Prefix (bash-style) nick completer. /// /// /// When triggered, the nickname list is searched for all matching nicknames. /// When only one nickname is found, it is fully completed. When more than one /// nickname is found, the longest prefix common to all these nicknames is /// completed, and a list of the nicknames is output into the chat view. /// The user may then input additional characters to narrow down the search, /// then trigger completion anew. /// public class LongestPrefixNickCompleter : NickCompleter { protected static string LongestCommonPrefix(IList nicks) { string ret = null; if (nicks.Count == 0) { return ret; } foreach (string nick in nicks) { if (ret == null) { ret = nick; } else { while (!nick.StartsWith(ret, StringComparison.OrdinalIgnoreCase)) { // cut off one character at the end ret = ret.Substring(0, ret.Length - 1); } } } return ret; } public override void Complete(ref string entryLine, ref int cursorPosition, IChatView currentChatView) { // isolate the nick to complete int matchPosition; bool appendSpace, leadingAt; string matchMe = IsolateNickToComplete(entryLine, cursorPosition, out matchPosition, out appendSpace, out leadingAt); bool appendCompletionChar = (matchPosition == 0); int additionalSteps = 0; // find the matching nicknames var nicks = NicksMatchingPrefix(currentChatView.Participants, matchMe); if (nicks.Count == 0) { // no matches; do nothing return; } else if (nicks.Count == 1) { // bingo! string nick = nicks [0]; // suppress the completion character if we had an @ if (leadingAt) { appendCompletionChar = false; } // find the beginning and end of the string string prefix = entryLine.Substring(0, matchPosition); string suffix = entryLine.Substring(matchPosition + matchMe.Length); // append the completion character and a space, if requested if (appendSpace) { suffix = ' ' + suffix; ++additionalSteps; } if (appendCompletionChar) { suffix = CompletionChar + suffix; ++additionalSteps; } // assemble the line and move the cursor entryLine = prefix + nick + suffix; cursorPosition = matchPosition + nick.Length + additionalSteps; } else { // find the longest common prefix string lcp = LongestCommonPrefix(nicks); // assemble nickname string string nickString = string.Join(" ", nicks.ToArray()); // output the matched prefixes currentChatView.AddMessage( new MessageModel(String.Format("-!- {0}", nickString)) ); // extend to the longest match string prefix = entryLine.Substring(0, matchPosition); string suffix = entryLine.Substring(matchPosition + matchMe.Length); // assemble the line and move the cursor entryLine = prefix + lcp + suffix; cursorPosition = matchPosition + lcp.Length; } } } } smuxi-1.1/src/Frontend/AssemblyInfo.cs0000644000175000017500000000274012471207630020613 0ustar00meebeymeebey00000000000000/* * $Id: AssemblyInfo.cs 167 2007-04-17 21:17:37Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AssemblyInfo.cs $ * $Rev: 167 $ * $Author: meebey $ * $Date: 2007-04-17 23:17:37 +0200 (Tue, 17 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - frontend library")] [assembly: AssemblyCopyright("2005-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Frontend/SshTunnelManager.cs0000644000175000017500000005364412726351313021450 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text.RegularExpressions; using System.Reflection; using SysDiag = System.Diagnostics; using Smuxi.Common; namespace Smuxi.Frontend { public class SshTunnelManager : IDisposable { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string f_LibraryTextDomain = "smuxi-frontend"; private SysDiag.Process f_Process; private SysDiag.ProcessStartInfo f_ProcessStartInfo; private string f_Program; private string f_Parameters; private string f_Username; private string f_Password; private string f_Keyfile; private string f_Hostname; private int f_Port = -1; private string f_ForwardBindAddress; private int f_ForwardBindPort; private string f_ForwardHostName; private int f_ForwardHostPort; private string f_BackwardBindAddress; private int f_BackwardBindPort; private string f_BackwardHostName; private int f_BackwardHostPort; public SshTunnelManager(string program, string parameters, string username, string password, string keyfile, string hostname, int port, string forwardBindAddress, int forwardBindPort, string forwardHostName, int forwardHostPort, string backwardBindAddress, int backwardBindPort, string backwardHostName, int backwardHostPort) { Trace.Call(program, parameters, username, "XXX", keyfile, hostname, port, forwardBindAddress, forwardBindPort, forwardHostName, forwardHostPort, backwardBindAddress, backwardBindPort, backwardHostName, backwardHostPort); if (hostname == null) { throw new ArgumentNullException("hostname"); } if (forwardBindAddress == null) { throw new ArgumentNullException("forwardBindAddress"); } if (forwardHostName == null) { throw new ArgumentNullException("forwardHostName"); } if (backwardBindAddress == null) { throw new ArgumentNullException("backwardBindAddress"); } if (backwardHostName == null) { throw new ArgumentNullException("backwardHostName"); } f_Program = program; f_Parameters = parameters; f_Username = username; f_Password = password; f_Keyfile = keyfile; f_Hostname = hostname; f_Port = port; f_ForwardBindAddress = forwardBindAddress; f_ForwardBindPort = forwardBindPort; f_ForwardHostName = forwardHostName; f_ForwardHostPort = forwardHostPort; f_BackwardBindAddress = backwardBindAddress; f_BackwardBindPort = backwardBindPort; f_BackwardHostName = backwardHostName; f_BackwardHostPort = backwardHostPort; } ~SshTunnelManager() { Trace.Call(); Dispose(false); } public void Dispose() { Trace.Call(); Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { Trace.Call(disposing); if (f_Process != null) { f_Process.Dispose(); } } public void Setup() { Trace.Call(); if (String.IsNullOrEmpty(f_Program)) { // use plink by default if it's there var location = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); var plinkPath = Path.Combine(location, "plink.exe"); if (File.Exists(plinkPath)) { f_Program = plinkPath; } else { // TODO: find ssh f_Program = "/usr/bin/ssh"; } } if (!File.Exists(f_Program)) { throw new ApplicationException(_("SSH client application was not found: " + f_Program)); } if (f_Program.ToLower().EndsWith("putty.exe")) { throw new ApplicationException(_("SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)")); } bool isPutty = false; if (f_Program.ToLower().EndsWith("plink.exe")) { isPutty = true; } if (isPutty) { f_ProcessStartInfo = CreatePlinkProcessStartInfo(); } else { f_ProcessStartInfo = CreateOpenSshProcessStartInfo(); } // make sure the tunnel is killed when smuxi is quitting // BUG: this will not kill the tunnel if Smuxi was killed using a // process signal like SIGTERM! Not sure how to handle that case... System.AppDomain.CurrentDomain.ProcessExit += delegate { #if LOG4NET f_Logger.Debug("Setup(): our process is exiting, let's dispose!"); #endif Dispose(); }; } public void Connect() { Trace.Call(); #if LOG4NET f_Logger.Debug("Connect(): checking if local forward port is free..."); #endif using (TcpClient tcpClient = new TcpClient()) { try { tcpClient.Connect(f_ForwardBindAddress, f_ForwardBindPort); // the connect worked, panic! var msg = String.Format( _("The local SSH forwarding port {0} is already in " + "use. Is there an old SSH tunnel still active?"), f_ForwardBindPort ); throw new ApplicationException(msg); } catch (SocketException) { } } #if LOG4NET f_Logger.Debug("Connect(): setting up ssh tunnel using command: " + f_ProcessStartInfo.FileName + " " + f_ProcessStartInfo.Arguments); #endif f_Process = SysDiag.Process.Start(f_ProcessStartInfo); // lets assume the tunnel didn't fail yet as long as the process is // still running and keep checking if the port is ready during that bool forwardPortReady = false, backwardPortReady = false; while (!forwardPortReady || !backwardPortReady) { if (f_Process.HasExited) { string output = f_Process.StandardOutput.ReadToEnd(); string error = f_Process.StandardError.ReadToEnd(); string msg = String.Format( _("SSH tunnel setup failed (exit code: {0})\n\n" + "SSH program: {1}\n" + "SSH parameters: {2}\n\n" + "Program Error:\n" + "{3}\n" + "Program Output:\n" + "{4}\n"), f_Process.ExitCode, f_ProcessStartInfo.FileName, f_ProcessStartInfo.Arguments, error, output ); #if LOG4NET f_Logger.Error("Connect(): " + msg); #endif throw new ApplicationException(msg); } // check forward port using (TcpClient tcpClient = new TcpClient()) { try { tcpClient.Connect(f_ForwardBindAddress, f_ForwardBindPort); #if LOG4NET f_Logger.Debug("Connect(): ssh tunnel's forward port is ready"); #endif forwardPortReady = true; } catch (SocketException ex) { #if LOG4NET f_Logger.Debug("Connect(): ssh tunnel's forward port is not reading yet, retrying...", ex); #endif } } backwardPortReady = true; // we can't test the back-port as the .NET remoting channel // would need to be ready at this point, which isn't /* // check backward port using (TcpClient tcpClient = new TcpClient()) { try { tcpClient.Connect(f_BackwardBindAddress, f_BackwardBindPort); #if LOG4NET f_Logger.Debug("Connect(): ssh tunnel's backward port is ready"); #endif backwardPortReady = true; } catch (SocketException ex) { #if LOG4NET f_Logger.Debug("Connect(): ssh tunnel's backward port is not reading yet, retrying...", ex); #endif } } */ #if LOG4NET f_Logger.Info("Connect(): ssh tunnel is not ready yet, retrying..."); #endif System.Threading.Thread.Sleep(1000); } #if LOG4NET f_Logger.Info("Connect(): ssh tunnel is ready"); #endif } public void Disconnect() { Trace.Call(); if (f_Process != null && !f_Process.HasExited) { #if LOG4NET f_Logger.Debug("Disconnect(): killing ssh tunnel..."); #endif f_Process.Kill(); f_Process.WaitForExit(); #if LOG4NET f_Logger.Debug("Disconnect(): ssh tunnel exited"); #endif } } private SysDiag.ProcessStartInfo CreateOpenSshProcessStartInfo() { string sshArguments = String.Empty; Version sshVersion = GetOpenSshVersion(); // starting with OpenSSH version 4.4p1 we can use the // ExitOnForwardFailure option for detecting tunnel issues better // as the process will quit nicely, for more details see: // http://projects.qnetp.net/issues/show/145 // NOTE: the patch level is mapped to the micro component if (sshVersion >= new Version("4.4.1")) { // exit if the tunnel setup didn't work somehow sshArguments += " -o ExitOnForwardFailure=yes"; } // with OpenSSH 3.8 we can use the keep-alive feature of SSH that // will check the remote peer in defined intervals and kills the // tunnel if it reached the max value if (sshVersion >= new Version("3.8")) { // exit if the peer can't be reached for more than 90 seconds sshArguments += " -o ServerAliveInterval=30 -o ServerAliveCountMax=3"; } // run in the background (detach) // plink doesn't support this and we can't control the process this way! //sshArguments += " -f"; // don't execute a remote command sshArguments += " -N"; // HACK: force SSH to always flush the send buffer, as needed by // .NET Remoting just like the X11 protocol sshArguments += " -X"; if (!String.IsNullOrEmpty(f_Username)) { sshArguments += String.Format(" -l {0}", f_Username); } if (!String.IsNullOrEmpty(f_Password)) { // TODO: pass password, but how? } if (!String.IsNullOrEmpty(f_Keyfile)) { if (!File.Exists(f_Keyfile)) { throw new ApplicationException(_("SSH keyfile not found.")); } try { using (File.OpenRead(f_Keyfile)) {} } catch (Exception ex) { throw new ApplicationException( _("SSH keyfile could not be read."), ex ); } sshArguments += String.Format(" -i \"{0}\"", f_Keyfile); } if (f_Port != -1) { sshArguments += String.Format(" -p {0}", f_Port); } // ssh tunnel sshArguments += String.Format( " -L {0}:{1}:{2}:{3}", f_ForwardBindAddress, f_ForwardBindPort, f_ForwardHostName, f_ForwardHostPort ); // ssh back tunnel sshArguments += String.Format( " -R {0}:{1}:{2}:{3}", f_BackwardBindAddress, f_BackwardBindPort, f_BackwardHostName, f_BackwardHostPort ); // custom ssh parameters sshArguments += String.Format(" {0}", f_Parameters); // ssh host sshArguments += String.Format(" {0}", f_Hostname); SysDiag.ProcessStartInfo psi = new SysDiag.ProcessStartInfo(); psi.FileName = f_Program; psi.Arguments = sshArguments; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; return psi; } private Version GetOpenSshVersion() { SysDiag.ProcessStartInfo psi = new SysDiag.ProcessStartInfo(); psi.FileName = f_Program; psi.Arguments = "-V"; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; string error; string output; int exitCode; using (var process = SysDiag.Process.Start(psi)) { error = process.StandardError.ReadToEnd(); output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); exitCode = process.ExitCode; } string haystack; // we expect the version output on stderr if (error.Length > 0) { haystack = error; } else { haystack = output; } // OpenSSH_6.2p2 Debian-6, OpenSSL 1.0.1e 11 Feb 2013 // OpenSSH_6.2, OpenSSL 1.0.1c 10 May 2012 Match match = Regex.Match(haystack, @"OpenSSH[_\w](\d+).(\d+)(?:.(\d+))?"); if (match.Success) { string major, minor, micro; string version = null; if (match.Groups.Count >= 3) { major = match.Groups[1].Value; minor = match.Groups[2].Value; version = String.Format("{0}.{1}", major, minor); } if (match.Groups.Count >= 4) { micro = match.Groups[3].Value; version = String.Format("{0}.{1}", version, micro); } version = version.TrimEnd('.'); #if LOG4NET f_Logger.Debug("GetOpenSshVersion(): found version: " + version); #endif return new Version(version); } string msg = String.Format( _("OpenSSH version number not found (exit code: {0})\n\n" + "SSH program: {1}\n\n" + "Program Error:\n" + "{2}\n" + "Program Output:\n" + "{3}\n"), exitCode, f_Program, error, output ); #if LOG4NET f_Logger.Error("GetOpenSshVersion(): " + msg); #endif throw new ApplicationException(msg); } private SysDiag.ProcessStartInfo CreatePlinkProcessStartInfo() { string sshArguments = String.Empty; var sshVersion = GetPlinkVersionString(); // Smuxi by default ships Plink of Quest PuTTY which allows to // accept any fingerprint but does _not_ work with pagent thus we // need to also support the regular plink if the user wants // ssh key authentication instead if (sshVersion.EndsWith("_q1.129")) { // HACK: don't ask for SSH key fingerprints // this is nasty but plink.exe can't ask for fingerprint // confirmation and thus the connect would always fail sshArguments += " -auto_store_key_in_cache"; } // no interactive mode please sshArguments += " -batch"; // don't execute a remote command sshArguments += " -N"; // HACK: force SSH to always flush the send buffer, as needed by // .NET remoting just like the X11 protocol sshArguments += " -X"; if (String.IsNullOrEmpty(f_Username)) { throw new ApplicationException(_("PuTTY / Plink requires a username to be set.")); } sshArguments += String.Format(" -l {0}", f_Username); if (!String.IsNullOrEmpty(f_Password)) { sshArguments += String.Format(" -pw {0}", f_Password); } if (!String.IsNullOrEmpty(f_Keyfile)) { if (!File.Exists(f_Keyfile)) { throw new ApplicationException(_("SSH keyfile not found.")); } try { using (File.OpenRead(f_Keyfile)) {} } catch (Exception ex) { throw new ApplicationException( _("SSH keyfile could not be read."), ex ); } sshArguments += String.Format(" -i \"{0}\"", f_Keyfile); } if (f_Port != -1) { sshArguments += String.Format(" -P {0}", f_Port); } // ssh tunnel sshArguments += String.Format( " -L {0}:{1}:{2}:{3}", f_ForwardBindAddress, f_ForwardBindPort, f_ForwardHostName, f_ForwardHostPort ); // ssh back tunnel sshArguments += String.Format( " -R {0}:{1}:{2}:{3}", f_BackwardBindAddress, f_BackwardBindPort, f_BackwardHostName, f_BackwardHostPort ); // custom ssh parameters sshArguments += String.Format(" {0}", f_Parameters); // ssh host sshArguments += String.Format(" {0}", f_Hostname); SysDiag.ProcessStartInfo psi = new SysDiag.ProcessStartInfo(); psi.FileName = f_Program; psi.Arguments = sshArguments; psi.CreateNoWindow = true; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; return psi; } private string GetPlinkVersionString() { var startInfo = new SysDiag.ProcessStartInfo() { FileName = f_Program, Arguments = "-V", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; string error; string output; int exitCode; using (var process = SysDiag.Process.Start(startInfo)) { error = process.StandardError.ReadToEnd(); output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); exitCode = process.ExitCode; } Match match = Regex.Match(output, @"[0-9]+\.[0-9a-zA-Z_\.]+"); if (match.Success) { var version = match.Value; #if LOG4NET f_Logger.Debug("GetPlinkVersionString(): found version: " + version); #endif return version; } string msg = String.Format( _("Plink version number not found (exit code: {0})\n\n" + "SSH program: {1}\n\n" + "Program Error:\n" + "{2}\n" + "Program Output:\n" + "{3}\n"), exitCode, f_Program, error, output ); #if LOG4NET f_Logger.Error("GetPlinkVersionString(): " + msg); #endif throw new ApplicationException(msg); } private static string _(string msg) { return LibraryCatalog.GetString(msg, f_LibraryTextDomain); } } } smuxi-1.1/src/Frontend/ChatViewSyncManager.cs0000644000175000017500000002774212471207630022073 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011, 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Threading; using System.Runtime.Remoting; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend { public class ChatViewSyncManager { #if LOG4NET private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif ThreadPoolQueue WorkerQueue { set; get; } Dictionary SyncWaitQueue { set; get; } Dictionary SyncReleaseQueue { set; get; } public event EventHandler ChatAdded; public event EventHandler ChatSynced; public event EventHandler WorkerException; public ChatViewSyncManager() { WorkerQueue = new ThreadPoolQueue() { MaxWorkers = 4 }; SyncWaitQueue = new Dictionary(); SyncReleaseQueue = new Dictionary(); } public void Add(ChatModel chatModel) { Trace.Call(chatModel); if (chatModel == null) { throw new ArgumentNullException("chatModel"); } #if LOG4NET DateTime start = DateTime.UtcNow; #endif // REMOTING CALL 1 var chatId = chatModel.ID; // REMOTING CALL 2 var chatType = chatModel.ChatType; // REMOTING CALL 3 var chatPosition = chatModel.Position; // REMOTING CALL 4 IProtocolManager protocolManager = chatModel.ProtocolManager; Type protocolManagerType = null; if (protocolManager != null) { protocolManagerType = protocolManager.GetType(); } #if LOG4NET DateTime stop = DateTime.UtcNow; double duration = stop.Subtract(start).TotalMilliseconds; Logger.Debug("Add() done, syncing took: " + Math.Round(duration) + " ms"); #endif OnChatAdded(chatModel, chatId, chatType, chatPosition, protocolManager, protocolManagerType); } /// /// This method is thread safe. /// public void Remove(ChatModel chatModel) { Trace.Call(chatModel); if (chatModel == null) { throw new ArgumentNullException("chatModel"); } var chatKey = GetChatKey(chatModel); #if LOG4NET Logger.DebugFormat("Remove() <{0}> removing from release queue", chatKey); #endif lock (SyncReleaseQueue) { SyncReleaseQueue.Remove(chatKey); } } public void Sync(IChatView chatView) { Trace.Call(chatView); if (chatView == null) { throw new ArgumentNullException("chatView"); } #if LOG4NET DateTime start = DateTime.UtcNow; #endif chatView.Sync(); #if LOG4NET DateTime stop = DateTime.UtcNow; double duration = stop.Subtract(start).TotalMilliseconds; Logger.Debug("Sync() <" + chatView.ID + ">.Sync() done, " + " syncing took: " + Math.Round(duration) + " ms"); #endif OnChatSynced(chatView); } /// /// This method is thread safe. /// public void QueueAdd(ChatModel chatModel) { Trace.Call(chatModel); if (chatModel == null) { throw new ArgumentNullException("chatModel"); } var chatKey = GetChatKey(chatModel); lock (SyncWaitQueue) { SyncWaitQueue.Add(chatKey, new AutoResetEvent(false)); #if LOG4NET Logger.Debug("QueueAdd() <" + chatKey + "> created sync lock"); #endif } WorkerQueue.Enqueue(delegate { AddWorker(chatModel); }); } /// /// This method is thread safe. /// public void QueueSync(ChatModel chatModel) { Trace.Call(chatModel); if (chatModel == null) { throw new ArgumentNullException("chatModel"); } WorkerQueue.Enqueue(delegate { SyncWorker(chatModel); }); } /// /// This method is thread safe. /// public void ReleaseSync(IChatView chatView) { Trace.Call(chatView); if (chatView == null) { throw new ArgumentNullException("chatView"); } var chatKey = GetChatKey(chatView.ChatModel); #if LOG4NET Logger.Debug("ReleaseSync() <" + chatKey + "> releasing " + "<" + chatView.ID + ">"); #endif lock (SyncReleaseQueue) { SyncReleaseQueue.Add(chatKey, chatView); } AutoResetEvent syncWait = null; lock (SyncWaitQueue) { SyncWaitQueue.TryGetValue(chatKey, out syncWait); } if (syncWait == null) { #if LOG4NET Logger.Error("ReleaseSync(<" + chatView.ID + ">): failed to release " + "<" + chatKey + "> as syncWait is null!"); #endif return; } // release the sync worker syncWait.Set(); } public void Clear() { Trace.Call(); lock (SyncWaitQueue) lock (SyncReleaseQueue) { SyncWaitQueue.Clear(); SyncReleaseQueue.Clear(); } } object GetChatKey(ChatModel chatModel) { if (RemotingServices.IsTransparentProxy(chatModel)) { // HACK: we can't use ChatModel as Dictionary as it is // a remoting object return RemotingServices.GetObjectUri(chatModel); } return chatModel; } void AddWorker(ChatModel chatModel) { try { Add(chatModel); } catch (Exception ex) { #if LOG4NET Logger.Error("AddWorker(): Add() threw exception!" , ex); #endif if (WorkerException != null) { WorkerException( this, new WorkerExceptionEventArgs(chatModel, ex) ); } OnWorkerException(chatModel, ex); } } void SyncWorker(ChatModel chatModel) { try { var chatKey = GetChatKey(chatModel); AutoResetEvent syncWait = null; lock (SyncWaitQueue) { SyncWaitQueue.TryGetValue(chatKey, out syncWait); } if (syncWait != null) { #if LOG4NET Logger.Debug("SyncWorker() <" + chatKey + "> waiting for " + "sync lock release..."); #endif // This chat was queued by QueueAdd() thus we need to wait // till the ChatView is created and ready to be synced syncWait.WaitOne(); #if LOG4NET Logger.Debug("SyncWorker() <" + chatKey + "> " + "sync lock released"); #endif // no longer need the sync lock lock (SyncWaitQueue) { SyncWaitQueue.Remove(chatKey); } } IChatView chatView = null; lock (SyncReleaseQueue) { if (!SyncReleaseQueue.TryGetValue(chatKey, out chatView)) { #if LOG4NET Logger.Warn("SyncWorker(): chatView is null! " + "probably a reconnect, bailing out..."); #endif return; } // no longer need the release slot // BUG: this breaks re-syncing an existing chat! For that // reason the frontend _must_ notify us via Remove() if the // chat sync state is no longer needed //SyncReleaseQueue.Remove(chatKey); } Sync(chatView); } catch (Exception ex) { #if LOG4NET Logger.Error("SyncWorker(): Exception!", ex); #endif OnWorkerException(chatModel, ex); } } void OnChatAdded(ChatModel chatModel, string chatId, ChatType chatType, int chatPosition, IProtocolManager protocolManager, Type protocolManagerType) { if (ChatAdded != null) { ChatAdded(this, new ChatViewAddedEventArgs(chatModel, chatId, chatType, chatPosition, protocolManager, protocolManagerType)); } } void OnChatSynced(IChatView chatView) { if (ChatSynced != null) { ChatSynced(this, new ChatViewSyncedEventArgs(chatView)); } } void OnWorkerException(ChatModel chatModel, Exception ex) { if (WorkerException != null) { WorkerException( this, new WorkerExceptionEventArgs(chatModel, ex) ); } } } public class ChatViewAddedEventArgs : EventArgs { public ChatModel ChatModel { get; private set; } public string ChatID { get; private set; } public ChatType ChatType { get; private set; } public int ChatPosition { get; private set; } public IProtocolManager ProtocolManager { get; private set; } public Type ProtocolManagerType { get; private set; } public ChatViewAddedEventArgs(ChatModel chatModel, string chatId, ChatType chatType, int chatPosition, IProtocolManager protocolManager, Type protocolManagerType) { ChatModel = chatModel; ChatID = chatId; ChatType = chatType; ChatPosition = chatPosition; ProtocolManager = protocolManager; ProtocolManagerType = protocolManagerType; } } public class ChatViewSyncedEventArgs : EventArgs { public IChatView ChatView { get; private set; } public ChatViewSyncedEventArgs(IChatView chatView) { ChatView = chatView; } } public class WorkerExceptionEventArgs : EventArgs { public ChatModel ChatModel { get; private set; } public Exception Exception { get; private set; } public WorkerExceptionEventArgs(ChatModel chat, Exception ex) { ChatModel = chat; Exception = ex; } } } smuxi-1.1/src/Frontend/Makefile.am0000664000175000017500000000616514011472672017736 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-frontend.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/release/smuxi-engine.dll \ ../../bin/release/smuxi-common.dll BUILD_DIR = ../../bin/release SMUXI_ENGINE_DLL_MDB= NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-frontend.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-common.dll BUILD_DIR = ../../bin/debug SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_COMMON_DLL) LINUX_PKGCONFIG = \ $(FRONTEND_PC) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ ChatViewManagerBase.cs \ ChatViewSyncManager.cs \ IChatView.cs \ ChatViewInfoAttribute.cs \ IEntryView.cs \ EngineManager.cs \ SshTunnelManager.cs \ CommandManager.cs \ NickCompleter.cs \ LongestPrefixNickCompleter.cs \ TabCycleNickCompleter.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend.pc.in REFERENCES = \ System \ System.Core \ System.Runtime.Remoting \ Mono.Posix DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) include $(top_srcdir)/Makefile.include FRONTEND_PC = $(BUILD_DIR)/smuxi-frontend.pc LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-wrapper,FRONTEND_PC,smuxi-frontend.pc)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) smuxi-1.1/src/Frontend/NickCompleter.cs0000644000175000017500000001153112253423337020757 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2013 Mirco Bauer * Copyright (c) 2013 Ondra Hosek * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Engine; namespace Smuxi.Frontend { /// /// Automatically completes nicknames (e.g. when the user presses the Tab key). /// public abstract class NickCompleter { public string CompletionChar = ":"; /// /// Isolates the nickname that should be completed. /// /// The isolated nickname. /// The text currently typed into the input text box. /// The current location of the cursor in the input text box. /// Stores where the isolated nickname begins in the entered text. /// Whether to append a space when the nickname is completed. /// Whether the nickname started with a leading @ (which was stripped away). protected static string IsolateNickToComplete(string entryLine, int cursorPosition, out int nickBeginning, out bool appendSpace, out bool leadingAt) { string ret; int prev_space = entryLine.Substring(0, cursorPosition).LastIndexOf(' '); int next_space = entryLine.IndexOf(' ', cursorPosition); appendSpace = false; if (prev_space == -1 && next_space == -1) { // no spaces (the nick is the only thing) nickBeginning = 0; appendSpace = true; ret = entryLine; } else if (prev_space == -1) { nickBeginning = 0; ret = entryLine.Substring(0, next_space); } else if (next_space == -1) { nickBeginning = prev_space + 1; appendSpace = true; ret = entryLine.Substring(nickBeginning); } else { nickBeginning = prev_space + 1; ret = entryLine.Substring(prev_space + 1, next_space - prev_space - 1); } leadingAt = false; if (ret.StartsWith("@")) { leadingAt = true; ++nickBeginning; ret = ret.Substring(1); } return ret; } /// /// Returns a list containing only the nicknames matching the given prefix. /// /// /// The list of nicknames matching the given prefix. /// /// /// List of people to enumerate. The ordering will be taken over verbatim. /// /// Prefix of nicknames to return. protected static IList NicksMatchingPrefix(IList persons, string prefix) { var ret = new List(); string lowerPfx = prefix.ToLower(); foreach (PersonModel person in persons) { string nick = person.IdentityName; if (nick.ToLower().StartsWith(lowerPfx)) { ret.Add(nick); } } return ret; } /// /// Performs nickname tab completion on the specified input. /// /// The text currently typed into the input text box. /// /// The current location of the cursor in the input text box. Equal to the index of the /// character after the current cursor position. /// /// /// The current chat view. The list of participants is fetched from it; the completer may /// also append messages to the chat to provide further information. /// abstract public void Complete(ref string entryLine, ref int cursorPosition, IChatView currentChatView); } } smuxi-1.1/src/Frontend/ChatViewManagerBase.cs0000644000175000017500000001501712726351313022022 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007, 2010-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using System.Collections.Generic; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend { public abstract class ChatViewManagerBase { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private IDictionary _ChatViewTypes = new Dictionary(); public abstract IChatView ActiveChat { get; } protected ChatViewManagerBase() { } public abstract void AddChat(ChatModel chat); public abstract void RemoveChat(ChatModel chat); public abstract void EnableChat(ChatModel chat); public abstract void DisableChat(ChatModel chat); private Type _GetChatViewType(ChatType chatType, Type protocolManagerType) { // exact or any (null) match foreach (var info in _ChatViewTypes.Keys) { if (info.ChatType == chatType && info.ProtocolManagerType == protocolManagerType) { return _ChatViewTypes[info]; } } if (protocolManagerType != null) { // subclass only match foreach (var info in _ChatViewTypes.Keys) { if (info.ProtocolManagerType == null) { continue; } if (info.ChatType == chatType && protocolManagerType.IsSubclassOf(info.ProtocolManagerType)) { return _ChatViewTypes[info]; } } } return null; } [Obsolete("Use CreateChatView(ChatModel, ChatType, Type) instead.")] protected IChatView CreateChatView(ChatModel chat, params object[] parameters) { Trace.Call(chat, parameters); var protocolManagerType = chat.ProtocolManager == null ? null : chat.ProtocolManager.GetType(); // REMOTING CALL 1 + 2 return CreateChatView(chat, chat.ChatType, protocolManagerType, parameters); } protected IChatView CreateChatView(ChatModel chat, ChatType chatType, Type protocolManagerType, params object[] parameters) { Trace.Call(chat, chatType, protocolManagerType, parameters); Type type; type = _GetChatViewType(chatType, protocolManagerType); if (type == null) { type = _GetChatViewType(chatType, null); } if (type == null) { throw new ApplicationException("Unsupported ChatModel type: " + chat.GetType()); } object[] ctorParams; if (parameters != null && parameters.Length > 0) { ctorParams = new object[parameters.Length + 1]; ctorParams[0] = chat; parameters.CopyTo(ctorParams, 1); } else { ctorParams = new object[] {chat}; } return (IChatView) Activator.CreateInstance(type, ctorParams); } public void LoadAll(string path, string pattern) { Trace.Call(path, pattern); string[] filenames = Directory.GetFiles(path, pattern); foreach (string filename in filenames) { Load(filename); } } public void Load(string filename) { Trace.Call(filename); Load(Assembly.LoadFile(filename)); } public void Load(Assembly assembly) { Trace.Call(assembly); Type[] types = assembly.GetTypes(); foreach (Type type in types) { Type foundType = null; Type[] interfaceTypes = type.GetInterfaces(); foreach (Type interfaceType in interfaceTypes) { if (interfaceType == typeof(IChatView)) { #if LOG4NET _Logger.Debug("Load(): found " + type); #endif foundType = type; break; } } if (foundType == null) { continue; } // let's get the info attribute object[] attrs = foundType.GetCustomAttributes(typeof(ChatViewInfoAttribute), true); if (attrs == null || attrs.Length == 0) { continue; } foreach (ChatViewInfoAttribute attr in attrs) { #if LOG4NET _Logger.Debug("Load() found Attribute: " + attr + " in Type: " + foundType); #endif // HACK: MS .NET 2.0 finds the attribute 2 times?!? // this doesn't seem to be a bug in MS .NET but Mono // IrcGroupChatView : GroupChatView : ChatView // GroupChatView contains attributes which is found a second time // when IrcGroupChatView is scanned for attributes if (!_ChatViewTypes.ContainsKey(attr)) { _ChatViewTypes.Add(attr, foundType); } } } } } } smuxi-1.1/src/Frontend/ChatViewInfoAttribute.cs0000644000175000017500000000351212726351313022431 0ustar00meebeymeebey00000000000000/* * $Id: CommandModel.cs 179 2007-04-21 15:01:29Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/CommandModel.cs $ * $Rev: 179 $ * $Author: meebey $ * $Date: 2007-04-21 17:01:29 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Engine; namespace Smuxi.Frontend { [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class ChatViewInfoAttribute : Attribute { private ChatType _ChatType; private Type _ProtocolManagerType; public ChatType ChatType { get { return _ChatType; } set { _ChatType = value; } } public Type ProtocolManagerType { get { return _ProtocolManagerType; } set { _ProtocolManagerType = value; } } public ChatViewInfoAttribute() { } } } smuxi-1.1/src/Frontend/EngineManager.cs0000644000175000017500000003650112726351313020723 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008-2013, 2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Collections; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.Serialization.Formatters; using SysDiag = System.Diagnostics; //using Smuxi.Channels.Tcp; #if CHANNEL_TCPEX using TcpEx; #endif #if CHANNEL_BIRDIRTCP using DotNetRemotingCC.Channels.BidirectionalTCP; #endif using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend { public class EngineManager { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string f_LibraryTextDomain = "smuxi-frontend"; private SessionManager f_SessionManager; private FrontendConfig f_FrontendConfig; private IFrontendUI f_FrontendUI; private string f_Engine; private string f_EngineUrl; private UserConfig f_UserConfig; private Session f_Session; private SshTunnelManager f_SshTunnelManager; private string f_ChannelName; public Version EngineAssemblyVersion { get; private set; } public Version EngineProtocolVersion { get; private set; } public SessionManager SessionManager { get { return f_SessionManager; } } public string EngineUrl { get { return f_EngineUrl; } } public Session Session { get { return f_Session; } } public UserConfig UserConfig { get { return f_UserConfig; } } public EngineManager(FrontendConfig frontendConfig, IFrontendUI frontendUI) { Trace.Call(frontendConfig, frontendUI); if (frontendConfig == null) { throw new ArgumentNullException("frontendConfig"); } if (frontendUI == null) { throw new ArgumentNullException("frontendUI"); } f_FrontendConfig = frontendConfig; f_FrontendUI = frontendUI; } public void Connect(string engine) { Trace.Call(engine); if (engine == null) { throw new ArgumentNullException("engine"); } if (engine.Length == 0) { throw new ArgumentException(_("Engine must not be empty."), "engine"); } bool engineFound = false; foreach (var entry in (string[]) f_FrontendConfig["Engines/Engines"]) { if (entry == engine) { engineFound = true; break; } } if (!engineFound) { throw new ArgumentException(_("Engine does not exist."), "engine"); } f_Engine = engine; string username = (string) f_FrontendConfig["Engines/"+engine+"/Username"]; string password = (string) f_FrontendConfig["Engines/"+engine+"/Password"]; string hostname = (string) f_FrontendConfig["Engines/"+engine+"/Hostname"]; string bindAddress = (string) f_FrontendConfig["Engines/"+engine+"/BindAddress"]; int port = (int) f_FrontendConfig["Engines/"+engine+"/Port"]; //string formatter = (string) _FrontendConfig["Engines/"+engine+"/Formatter"]; string channel = (string) f_FrontendConfig["Engines/"+engine+"/Channel"]; // SSH tunnel support bool useSshTunnel = false; if (f_FrontendConfig["Engines/"+engine+"/UseSshTunnel"] != null) { useSshTunnel = (bool) f_FrontendConfig["Engines/"+engine+"/UseSshTunnel"]; } string sshProgram = (string) f_FrontendConfig["Engines/"+engine+"/SshProgram"]; string sshParameters = (string) f_FrontendConfig["Engines/"+engine+"/SshParameters"]; string sshHostname = (string) f_FrontendConfig["Engines/"+engine+"/SshHostname"]; int sshPort = -1; if (f_FrontendConfig["Engines/"+engine+"/SshPort"] != null) { sshPort = (int) f_FrontendConfig["Engines/"+engine+"/SshPort"]; } string sshUsername = (string) f_FrontendConfig["Engines/"+engine+"/SshUsername"]; string sshPassword = (string) f_FrontendConfig["Engines/"+engine+"/SshPassword"]; var sshKeyfile = (string) f_FrontendConfig["Engines/"+engine+"/SshKeyfile"]; // OPT: always use SSH compression (both openssh and plink support it) // this reduces the .NET remoting traffic by about 75% if (String.IsNullOrEmpty(sshParameters) || !sshParameters.Contains(" -C")) { sshParameters += " -C"; } // HACK: using SSH to connect to a smuxi-server that runs on // localhost makes no sense if (sshHostname == "localhost" || sshHostname == "127.0.0.1") { useSshTunnel = false; } int remotingPort = 0; if (useSshTunnel) { // find free remoting back-channel port TcpListener remotingPortListener = new TcpListener(IPAddress.Loopback, 0); remotingPortListener.Start(); remotingPort = ((IPEndPoint)remotingPortListener.LocalEndpoint).Port; // find free local forward port TcpListener localForwardListener = new TcpListener(IPAddress.Loopback, 0); localForwardListener.Start(); int localForwardPort = ((IPEndPoint)localForwardListener.LocalEndpoint).Port; // only stop the listeners after we got all ports we need // else it might re-use a port! remotingPortListener.Stop(); localForwardListener.Stop(); #if LOG4NET f_Logger.Debug("Connect(): found free local backward port (for remoting back-channel): " + remotingPort); f_Logger.Debug("Connect(): found free local forward port: " + localForwardPort); #endif // HACK: we can't use localForwardPort here as .NET remoting // will announce the server port in the server Session object // thus the client will try to reach it using the original // server port :( f_SshTunnelManager = new SshTunnelManager( sshProgram, sshParameters, sshUsername, sshPassword, sshKeyfile, sshHostname, sshPort, //"127.0.0.1", localForwardPort, "127.0.0.1", port, "127.0.0.1", port, "127.0.0.1", port, "127.0.0.1", remotingPort, "127.0.0.1", remotingPort ); f_SshTunnelManager.Setup(); f_SshTunnelManager.Connect(); // so we want to connect via the SSH tunnel now hostname = "127.0.0.1"; // HACK: see above //port = localForwardPort; // the smuxi-server has to connect to us via the SSH tunnel too bindAddress = "127.0.0.1"; } IDictionary props = new Hashtable(); // ugly remoting expects the port as string ;) props["port"] = remotingPort.ToString(); string connection_url = null; SessionManager sessm = null; switch (channel) { case "TCP": // Make sure the channel is really using our random // remotingPort. Already registered channel will for sure // not to that and thus the back-connection fails! if (f_ChannelName != null) { IChannel oldChannel = ChannelServices.GetChannel(f_ChannelName); if (oldChannel != null) { #if LOG4NET f_Logger.Debug("Connect(): found old remoting channel, unregistering..."); #endif ChannelServices.UnregisterChannel(oldChannel); } } // frontend -> engine BinaryClientFormatterSinkProvider cprovider = new BinaryClientFormatterSinkProvider(); // engine -> frontend (back-connection) BinaryServerFormatterSinkProvider sprovider = new BinaryServerFormatterSinkProvider(); // required for MS .NET 1.1 sprovider.TypeFilterLevel = TypeFilterLevel.Full; if (bindAddress != null) { props["machineName"] = bindAddress; } var tcpChannel = new TcpChannel(props, cprovider, sprovider); f_ChannelName = tcpChannel.ChannelName; ChannelServices.RegisterChannel(tcpChannel, false); // make sure the listen port of channel is ready before we // connect to the engine, as it will make a call back! while (true) { using (TcpClient tcpClient = new TcpClient()) { try { tcpClient.Connect(hostname, port); #if LOG4NET f_Logger.Debug("Connect(): listen port of remoting channel is ready"); #endif break; } catch (SocketException ex) { #if LOG4NET f_Logger.Debug("Connect(): listen port of remoting channel is not reading yet, retrying...", ex); #endif } System.Threading.Thread.Sleep(1000); } } connection_url = "tcp://"+hostname+":"+port+"/SessionManager"; #if LOG4NET f_Logger.Info("Connecting to: "+connection_url); #endif sessm = (SessionManager)Activator.GetObject(typeof(SessionManager), connection_url); break; #if CHANNEL_TCPEX case "TcpEx": //props.Remove("port"); //props["name"] = "tcpex"; connection_url = "tcpex://"+hostname+":"+port+"/SessionManager"; if (ChannelServices.GetChannel("ExtendedTcp") == null) { ChannelServices.RegisterChannel(new TcpExChannel(props, null, null)); } #if LOG4NET _Logger.Info("Connecting to: "+connection_url); #endif sessm = (SessionManager)Activator.GetObject(typeof(SessionManager), connection_url); break; #endif #if CHANNEL_BIRDIRTCP case "BirDirTcp": string ip = System.Net.Dns.Resolve(hostname).AddressList[0].ToString(); connection_url = "birdirtcp://"+ip+":"+port+"/SessionManager"; if (ChannelServices.GetChannel("birdirtcp") == null) { ChannelServices.RegisterChannel(new BidirTcpClientChannel()); } #if LOG4NET _Logger.Info("Connecting to: "+connection_url); #endif sessm = (SessionManager)Activator.GetObject(typeof(SessionManager), connection_url); break; #endif case "HTTP": connection_url = "http://"+hostname+":"+port+"/SessionManager"; if (ChannelServices.GetChannel("http") == null) { ChannelServices.RegisterChannel(new HttpChannel(), false); } #if LOG4NET f_Logger.Info("Connecting to: "+connection_url); #endif sessm = (SessionManager)Activator.GetObject(typeof(SessionManager), connection_url); break; default: throw new ApplicationException(String.Format( _("Unknown channel ({0}) - "+ "only the following channel types are supported:"), channel) + " HTTP TCP"); } f_SessionManager = sessm; f_EngineUrl = connection_url; f_Session = sessm.Register(username, MD5.FromString(password), f_FrontendUI); if (f_Session == null) { throw new ApplicationException(_("Registration with engine failed! "+ "The username and/or password were wrong - please verify them.")); } var engineVersion = sessm.EngineVersion; if (engineVersion >= new Version("0.13")) { EngineAssemblyVersion = sessm.EngineAssemblyVersion; EngineProtocolVersion = sessm.EngineProtocolVersion; } else { EngineAssemblyVersion = engineVersion; EngineProtocolVersion = engineVersion; } f_UserConfig = new UserConfig(f_Session.Config, username); f_UserConfig.IsCaching = true; f_UserConfig.FrontendConfig = f_FrontendConfig; } public void Reconnect() { Trace.Call(); Disconnect(); Connect(f_Engine); } public void Disconnect() { Trace.Call(); // HACK: the transparent proxy object is not automatically updating // changed channel data and thus will re-use the obsolete TCP port // for the next remoting back connection, thus we have to destroy // the proxy object here! RemotingServices.Disconnect((MarshalByRefObject) f_FrontendUI); if (f_SshTunnelManager != null) { f_SshTunnelManager.Disconnect(); f_SshTunnelManager.Dispose(); f_SshTunnelManager = null; } } private static string _(string msg) { return LibraryCatalog.GetString(msg, f_LibraryTextDomain); } } } smuxi-1.1/src/Frontend/CommandManager.cs0000664000175000017500000004543514011467170021102 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010, 2012-2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Linq; using System.Reflection; using System.Collections.Generic; using SysDiag = System.Diagnostics; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend { public delegate void CommandExceptionEventHandler(object sender, CommandExceptionEventArgs e); public class CommandExceptionEventArgs : EventArgs { public Exception Exception { get; private set;} public CommandExceptionEventArgs(Exception ex) { Exception = ex; } } public class CommandManager : IDisposable { #if LOG4NET static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif static readonly string f_LibraryTextDomain = "smuxi-frontend"; static string FrontendVersion { get; set; } Session f_Session; TaskQueue f_TaskQueue; TimeSpan f_LastCommandTimeSpan; public Version EngineProtocolVersion { get; set; } public TimeSpan LastCommandTimeSpan { get { return f_LastCommandTimeSpan; } } public event CommandExceptionEventHandler ExceptionEvent; static CommandManager() { var asm = Assembly.GetAssembly(typeof(CommandManager)); var asm_name = asm.GetName(false); FrontendVersion = asm_name.Version.ToString(); } public CommandManager(Session session) { if (session == null) { throw new ArgumentNullException("session"); } f_Session = session; f_TaskQueue = new TaskQueue("CommandManager"); f_TaskQueue.ExceptionEvent += OnTaskQueueExceptionEvent; f_TaskQueue.AbortedEvent += OnTaskQueueAbortedEvent; } ~CommandManager() { Trace.Call(); Dispose(false); } public void Dispose() { Trace.Call(); Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { Trace.Call(disposing); if (disposing) { f_TaskQueue.Dispose(); } } public void Execute(CommandModel cmd) { Trace.Call(cmd); if (cmd == null) { throw new ArgumentNullException("cmd"); } f_TaskQueue.Queue(delegate { try { DoExecute(cmd); } catch (Exception ex) { #if LOG4NET f_Logger.Error("Execute(): DoExecute() threw exception!", ex); #endif var msg = CreateMessageBuilder(). AppendErrorText("Command '{0}' failed. Reason: {1}", cmd.Command, ex.Message). ToMessage(); AddMessageToFrontend(cmd, msg); } }); } private void DoExecute(CommandModel cmd) { Trace.Call(cmd); var handled = false; if (cmd.IsCommand) { switch (cmd.Command) { case "exec": CommandExec(cmd); handled = true; break; case "echo": CommandEcho(cmd); handled = true; break; case "benchmark_message_builder": CommandBenchmarkMessageBuilder(cmd); handled = true; break; case "exception": throw new Exception("You asked for it."); } } if (handled) { // no need to send the command to the engine return; } DateTime start, stop; start = DateTime.UtcNow; // REMOTING CALL handled = f_Session.Command(cmd); IProtocolManager pm = null; if (!handled) { if (cmd.Chat is SessionChatModel && cmd.FrontendManager != null) { // REMOTING CALL pm = cmd.FrontendManager.CurrentProtocolManager; } else { // REMOTING CALL pm = cmd.Chat.ProtocolManager; } // we maybe have no network manager yet if (pm != null) { // REMOTING CALL handled = pm.Command(cmd); } else { handled = false; } } if (!handled) { // OPT TODO: the remoting calls in this code branch should be // avoided by checking if there are any frontend commands hooks // available or not var filteredCmd = IOSecurity.GetFilteredPath(cmd.Command); var hooks = new HookRunner("frontend", "command-manager", "command-" + filteredCmd); hooks.EnvironmentVariables.Add("FRONTEND_VERSION", FrontendVersion); hooks.Environments.Add(new CommandHookEnvironment(cmd)); // 3 REMOTING CALLS inside the ctor hooks.Environments.Add(new ChatHookEnvironment(cmd.Chat)); if (pm != null) { // 6-7 REMOTING CALLS inside the ctor hooks.Environments.Add(new ProtocolManagerHookEnvironment(pm)); } // REMOTING CALL var cmdChar = (string) f_Session.UserConfig["Interface/Entry/CommandCharacter"]; hooks.Commands.Add(new SessionHookCommand(f_Session, cmd.Chat, cmdChar)); if (pm != null) { hooks.Commands.Add(new ProtocolManagerHookCommand(pm, cmd.Chat, cmdChar)); } // show time hooks.Init(); if (hooks.HasHooks) { hooks.Run(); handled = true; } } if (!handled) { Unknown(cmd); } stop = DateTime.UtcNow; f_LastCommandTimeSpan = (stop - start); } private void CommandExec(CommandModel cmd) { Trace.Call(cmd); if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } var parameter = cmd.Parameter; var parameters = cmd.Parameter.Split(' '); var messageOutput = false; var executeOutput = false; if (parameters.Length > 0) { var shift = false; switch (parameters[0]) { case "-c": executeOutput = true; shift = true; break; case "-o": messageOutput = true; shift = true; break; } if (shift) { parameters = parameters.Skip(1).ToArray(); parameter = String.Join(" ", parameters); } } SysDiag.DataReceivedEventHandler handler = (sender, e) => { if (String.IsNullOrEmpty(e.Data)) { return; } // eat trailing newlines var output = e.Data.TrimEnd('\r', '\n'); if (executeOutput || messageOutput) { if (messageOutput && output.StartsWith(cmd.CommandCharacter)) { // escape command character output = String.Format("{0}{1}", cmd.CommandCharacter, output); } DoExecute(new CommandModel(cmd.FrontendManager, cmd.Chat, cmd.CommandCharacter, output)); } else { var msg = CreateMessageBuilder().AppendText(output).ToMessage(); AddMessageToFrontend(cmd, msg); } }; string file; string args = null; if (Environment.OSVersion.Platform == PlatformID.Unix) { file = "sh"; args = String.Format("-c \"{0}\"", parameter.Replace("\"", @"\""")); } else { file = parameters[1]; if (parameters.Length > 1) { args = String.Join(" ", parameters.Skip(1).ToArray()); } } var info = new SysDiag.ProcessStartInfo() { FileName = file, Arguments = args, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false }; using (var process = new SysDiag.Process()) { process.StartInfo = info; process.OutputDataReceived += handler; process.ErrorDataReceived += handler; try { process.Start(); process.StandardInput.Close(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); } catch (Exception ex) { #if LOG4NET f_Logger.Error(ex); #endif var command = info.FileName; if (!String.IsNullOrEmpty(info.Arguments)) { command += " " + info.Arguments; } var msg = CreateMessageBuilder(). AppendErrorText("Executing '{0}' failed with: {1}", command, ex.Message). ToMessage(); AddMessageToFrontend(cmd, msg); } } } private void CommandEcho(CommandModel cmd) { Trace.Call(cmd); var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(cmd.Parameter). ToMessage(); AddMessageToFrontend(cmd, msg); } public void CommandGenerateMessages(CommandModel cmd, IChatView chat) { Trace.Call(cmd, chat); var count = 0; Int32.TryParse(cmd.Parameter, out count); var builder = CreateMessageBuilder(); var sender = new ContactModel("msg-tester", "msg-tester", "test", "test"); builder.AppendMessage(sender, "time for a messsage generator command so I can test speed and memory usage"); var text = builder.CreateText(" *formatted text* "); text.Bold = true; builder.Append(text); builder.AppendUrl("https://www.smuxi.org/"); var msgs = new List(count); for (var i = 0; i < count; i++) { var msg = builder.ToMessage(); msgs.Add(msg); } DateTime start, stop; start = DateTime.UtcNow; foreach (var msg in msgs) { chat.AddMessage(msg); } stop = DateTime.UtcNow; builder = CreateMessageBuilder(); builder.AppendText( "IChatView.AddMessage(): count: {0} took: {1:0} ms avg: {2:0.00} ms", count, (stop - start).TotalMilliseconds, (stop - start).TotalMilliseconds / count ); chat.AddMessage(builder.ToMessage()); } public void CommandBenchmarkMessageBuilder(CommandModel cmd) { Trace.Call(cmd); var count = 1000; var showHelp = false; var appendMessage = false; var appendText = false; var appendEvent = false; var appendFormat = false; var toMessage = false; try { var opts = new NDesk.Options.OptionSet() { { "c|count=", v => count = Int32.Parse(v) }, { "m|append-message", v => appendMessage = true }, { "t|append-text", v => appendText = true }, { "e|append-event", v => appendEvent = true }, { "f|append-format", v => appendFormat = true }, { "T|to-message", v => toMessage = true }, }; opts.Add("h|?|help", x => { showHelp = true; var writer = new StringWriter(); opts.WriteOptionDescriptions(writer); AddMessageToFrontend( cmd, CreateMessageBuilder(). AppendHeader("{0} usage", cmd.Command). AppendText("\n"). AppendText("Parameters:\n"). AppendText(writer.ToString()). ToMessage() ); return; }); opts.Parse(cmd.Parameter.Split(' ')); if (showHelp) { return; } } catch (Exception ex) { AddMessageToFrontend( cmd, CreateMessageBuilder(). AppendErrorText("Invalid parameter: {0}", ex.Message). ToMessage() ); return; } DateTime start, stop; start = DateTime.UtcNow; MessageBuilder builder; for (var i = 0; i < count; i++) { builder = CreateMessageBuilder(); if (appendMessage) { builder.AppendMessage("This is message with a link to https://www.smuxi.org/."); } if (appendText) { builder.AppendText("This is message with just text."); } if (appendEvent) { builder.AppendEventPrefix(); } if (appendFormat) { builder.AppendFormat("{0} [{1}] has joined {2}", "meebey3", "~smuxi@31-18-115-252-dynip.superkabel.de", "#smuxi-devel"); } if (toMessage) { // NOTE: this would seem useless because we ignore the resulting msg, // but this is a benchmark method builder.ToMessage(); } } stop = DateTime.UtcNow; builder = CreateMessageBuilder(); builder.AppendText("MessageBuilder()."); if (appendMessage) { builder.AppendText("AppendMessage()."); } if (appendText) { builder.AppendText("AppendText()."); } if (appendEvent) { builder.AppendText("AppendEventPrefix()."); } if (appendFormat) { builder.AppendText("AppendFormat()."); } if (toMessage) { builder.AppendText("ToMessage()"); } builder.AppendText( " count: {1} took: {2:0} ms avg: {3:0.00} ms", cmd.Data, count, (stop - start).TotalMilliseconds, (stop - start).TotalMilliseconds / count ); AddMessageToFrontend(cmd, builder.ToMessage()); } private void Unknown(CommandModel cmd) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Unknown Command: {0}"), cmd.Command). ToMessage(); AddMessageToFrontend(cmd, msg); } void NotEnoughParameters(CommandModel cmd) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Not enough parameters for {0} command"), cmd.Command). ToMessage(); AddMessageToFrontend(cmd, msg); } MessageBuilder CreateMessageBuilder() { return new MessageBuilder(); } void AddMessageToFrontend(CommandModel cmd, MessageModel msg) { if (cmd == null) { throw new ArgumentNullException("cmd"); } if (msg == null) { throw new ArgumentNullException("msg"); } if (EngineProtocolVersion != null && EngineProtocolVersion >= new Version(0, 10)) { f_Session.AddMessageToFrontend(cmd, msg); } else { f_Session.AddMessageToChat(cmd.Chat, msg); } } protected virtual void OnTaskQueueExceptionEvent(object sender, TaskQueueExceptionEventArgs e) { Trace.Call(sender, e); #if LOG4NET f_Logger.Error("Exception in TaskQueue: ", e.Exception); f_Logger.Error("Inner-Exception: ", e.Exception.InnerException); #endif if (ExceptionEvent != null) { ExceptionEvent(this, new CommandExceptionEventArgs(e.Exception)); } } protected virtual void OnTaskQueueAbortedEvent(object sender, EventArgs e) { Trace.Call(sender, e); #if LOG4NET f_Logger.Debug("OnTaskQueueAbortedEvent(): task queue aborted!"); #endif } private static string _(string msg) { return LibraryCatalog.GetString(msg, f_LibraryTextDomain); } } } smuxi-1.1/src/Frontend/TabCycleNickCompleter.cs0000644000175000017500000001253412726351313022371 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2013 Mirco Bauer * Copyright (c) 2013 Ondra Hosek * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; namespace Smuxi.Frontend { /// /// Tab Cycle (irssi-style) nick completer. /// /// /// When triggered, the first nickname matching the input characters is /// completed. If triggered again at the same position, the match is /// replaced by the next nickname. /// public class TabCycleNickCompleter : NickCompleter { IList PreviousNicks { get; set; } int PreviousNickIndex { get; set; } int PreviousMatchPos { get; set; } int PreviousMatchLength { get; set; } int PreviousMatchCursorOffset { get; set; } // offset from match pos + match len IChatView PreviousChatView { get; set; } string InitialMatch { get; set; } public TabCycleNickCompleter() { PreviousNicks = null; PreviousNickIndex = -1; PreviousMatchPos = -1; PreviousMatchLength = -1; PreviousMatchCursorOffset = 0; PreviousChatView = null; InitialMatch = null; } public override void Complete(ref string entryLine, ref int cursorPosition, IChatView currentChatView) { // isolate the nick to complete int matchPosition; bool appendSpace, leadingAt; string matchMe = IsolateNickToComplete(entryLine, cursorPosition, out matchPosition, out appendSpace, out leadingAt); int rematchCursorPosition = PreviousMatchPos + PreviousMatchLength + PreviousMatchCursorOffset; if (PreviousNickIndex != -1 && currentChatView == PreviousChatView && cursorPosition == rematchCursorPosition && InitialMatch != null && (matchMe.Length == 0 || matchMe.StartsWith(InitialMatch))) { // re-match PreviousNickIndex = (PreviousNickIndex + 1) % PreviousNicks.Count; string nick = PreviousNicks [PreviousNickIndex]; string prefix = entryLine.Substring(0, PreviousMatchPos); string suffix = entryLine.Substring(PreviousMatchPos + PreviousMatchLength); PreviousMatchLength = nick.Length; entryLine = prefix + nick + suffix; cursorPosition = PreviousMatchPos + PreviousMatchLength + PreviousMatchCursorOffset; return; } // store this to check for re-matches InitialMatch = matchMe; // don't re-match even if the user moves the cursor back to the "correct" position PreviousNickIndex = -1; // don't complete empty strings if (matchMe.Length == 0) { return; } bool appendCompletionChar = (matchPosition == 0); int additionalSteps = 0; // find the matching nicknames IList nicks = NicksMatchingPrefix(currentChatView.Participants, matchMe); if (nicks.Count == 0) { // no matches; do nothing return; } else { // bingo! string nick = nicks [0]; // store the new values for the next completion PreviousNicks = nicks; PreviousNickIndex = 0; PreviousMatchPos = matchPosition; PreviousMatchLength = nick.Length; PreviousChatView = currentChatView; // suppress the completion character if we had an @ if (leadingAt) { appendCompletionChar = false; } // find the beginning and end of the string string prefix = entryLine.Substring(0, matchPosition); string suffix = entryLine.Substring(matchPosition + matchMe.Length); // append the completion character and a space, if requested if (appendSpace) { suffix = ' ' + suffix; ++additionalSteps; } if (appendCompletionChar) { suffix = CompletionChar + suffix; ++additionalSteps; } // assemble the line and move the cursor entryLine = prefix + nick + suffix; cursorPosition = matchPosition + nick.Length + additionalSteps; PreviousMatchCursorOffset = additionalSteps; } } } } smuxi-1.1/src/Frontend/Makefile.in0000664000175000017500000010216714011526472017744 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-frontend.pc 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/smuxi-frontend.pc.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = library @ENABLE_RELEASE_TRUE@COMPILE_TARGET = library @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_COMMON_DLL) LINUX_PKGCONFIG = \ $(FRONTEND_PC) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ ChatViewManagerBase.cs \ ChatViewSyncManager.cs \ IChatView.cs \ ChatViewInfoAttribute.cs \ IEntryView.cs \ EngineManager.cs \ SshTunnelManager.cs \ CommandManager.cs \ NickCompleter.cs \ LongestPrefixNickCompleter.cs \ TabCycleNickCompleter.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend.pc.in REFERENCES = \ System \ System.Core \ System.Runtime.Remoting \ Mono.Posix DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) FRONTEND_PC = $(BUILD_DIR)/smuxi-frontend.pc LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-frontend.pc: $(top_builddir)/config.status $(srcdir)/smuxi-frontend.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-wrapper,FRONTEND_PC,smuxi-frontend.pc)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) # 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: smuxi-1.1/src/Frontend/smuxi-frontend.pc.in0000644000175000017500000000021611655545675021621 0ustar00meebeymeebey00000000000000Name: smuxi-frontend Description: Frontend Version: @VERSION@ Requires: smuxi-engine Libs: -r:@expanded_libdir@/@PACKAGE@/smuxi-frontend.dll smuxi-1.1/src/Frontend/IChatView.cs0000644000175000017500000000320212250426634020037 0ustar00meebeymeebey00000000000000/* * $Id: AboutDialog.cs 122 2006-04-26 19:31:42Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AboutDialog.cs $ * $Rev: 122 $ * $Author: meebey $ * $Date: 2006-04-26 21:31:42 +0200 (Wed, 26 Apr 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Engine; namespace Smuxi.Frontend { public interface IChatView { ChatModel ChatModel { get; } string ID { get; } int Position { get; } IList Participants { get; } void Enable(); void Disable(); void Sync(); void Populate(); void ScrollUp(); void ScrollDown(); void ScrollToStart(); void ScrollToEnd(); void AddMessage(MessageModel msg); } } smuxi-1.1/src/Server/0000775000175000017500000000000014011526501015350 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Server/AssemblyInfo.cs0000644000175000017500000000241711655545675020324 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - server")] [assembly: AssemblyCopyright("2005-2008, 2010 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] #if LOG4NET // let log4net use .exe.config file [assembly: log4net.Config.XmlConfigurator] #endif smuxi-1.1/src/Server/smuxi-server.in0000664000175000017500000000136413411450522020357 0ustar00meebeymeebey00000000000000#!/bin/sh # workaround TLS/SSL negotiation caching issues of Mono, see: # https://smuxi.im/issues/show/802 MONO_TLS_SESSION_CACHE_TIMEOUT=0 export MONO_TLS_SESSION_CACHE_TIMEOUT # Mono >= 4 SEGVs with Boehm as GC during startup # see https://bugzilla.opensuse.org/show_bug.cgi?id=955080 if ! mono -V | grep -q -e "version [4-9]\."; then # HACK: forcibly disabled SGen, as it has a known SEGV bug related to the # Mono.Data.Sqlite binding that does not happen with the boehm GC, see: # https://smuxi.im/issues/show/1062 MONO_ENV_OPTIONS="$(echo $MONO_ENV_OPTIONS | sed s/--gc=sgen//)" MONO_ENV_OPTIONS="--gc=boehm $MONO_ENV_OPTIONS" export MONO_ENV_OPTIONS fi exec mono --debug "@expanded_libdir@/@PACKAGE@/smuxi-server.exe" "$@" smuxi-1.1/src/Server/Server.cs0000664000175000017500000001301014011467170017146 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Threading; using System.Collections; using System.Runtime.Remoting; using System.Runtime.Remoting.Lifetime; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.Remoting.Channels.Http; using System.Runtime.Serialization.Formatters; using Smuxi; using Mono.Unix; using Mono.Unix.Native; //using Smuxi.Channels.Tcp; #if CHANNEL_TCPEX using TcpEx; #endif namespace Smuxi.Server { public class Server { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static void Init(string[] args) { Engine.Engine.Init(); Engine.Engine.InitSessionManager(); string channel = (string)Engine.Engine.Config["Server/Channel"]; string formatter = (string)Engine.Engine.Config["Server/Formatter"]; string host = (string)Engine.Engine.Config["Server/Host"]; string bindAddress = (string)Engine.Engine.Config["Server/BindAddress"]; int port = (int)Engine.Engine.Config["Server/Port"]; IDictionary props = new Hashtable(); props["port"] = port.ToString(); if (host != null) { props["machineName"] = host; } if (bindAddress != null) { props["bindTo"] = bindAddress; } switch (channel) { case "TCP": props["name"] = "TcpChannel"; BinaryClientFormatterSinkProvider cprovider = new BinaryClientFormatterSinkProvider(); BinaryServerFormatterSinkProvider sprovider = new BinaryServerFormatterSinkProvider(); // required for MS .NET 1.1 sprovider.TypeFilterLevel = TypeFilterLevel.Full; #if LOG4NET _Logger.Debug("Registering TcpChannel port: "+props["port"]); #endif try { ChannelServices.RegisterChannel(new TcpChannel(props, cprovider, sprovider), false); } catch (System.Net.Sockets.SocketException ex) { Console.WriteLine("Could not register remoting channel on port {0} " + "(server already running on that port?) Error: " + ex.Message, port); Environment.Exit(1); } break; #if CHANNEL_TCPEX case "TcpEx": props["name"] = "TcpExChannel"; #if LOG4NET _Logger.Debug("Registering TcpExChannel port: "+props["port"]); #endif ChannelServices.RegisterChannel(new TcpExChannel(props, null, null), false); break; #endif case "HTTP": props["name"] = "HttpChannel"; #if LOG4NET _Logger.Debug("Registering HttpChannel port: "+props["port"]); #endif ChannelServices.RegisterChannel(new HttpChannel(props, null, null), false); break; default: Console.WriteLine("Unknown channel ("+channel+"), aborting..."); Environment.Exit(1); break; } // register the SessionManager for .NET remoting RemotingServices.Marshal(Engine.Engine.SessionManager, "SessionManager"); #if LOG4NET _Logger.Info("Spawned remoting server with channel: "+channel+" formatter: "+formatter+" port: "+port); #endif if ((Environment.OSVersion.Platform == PlatformID.Unix) || (Environment.OSVersion.Platform == PlatformID.MacOSX)) { // Register shutdown handlers #if LOG4NET _Logger.Info("Registering signal handlers"); #endif UnixSignal[] shutdown_signals = { new UnixSignal(Signum.SIGINT), new UnixSignal(Signum.SIGTERM), }; Thread signal_thread = new Thread(() => { var index = UnixSignal.WaitAny(shutdown_signals); #if LOG4NET _Logger.Info("Caught signal " + shutdown_signals[index].Signum.ToString() + ", shutting down"); #endif Engine.Engine.Shutdown(); }); signal_thread.Start(); } Thread.CurrentThread.Join(); #if LOG4NET _Logger.Info("Shutting down remoting server..."); #endif } } } smuxi-1.1/src/Server/Makefile.am0000664000175000017500000000640514011472672017422 0ustar00meebeymeebey00000000000000 EXTRA_DIST = $(man_MANS) man_MANS = smuxi-server.1 SERVER_EXE_CONFIG_SOURCE = smuxi-server.exe.config SERVER_EXE_CONFIG = $(BUILD_DIR)/smuxi-server.exe.config ASSEMBLY_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS += -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-server.exe ASSEMBLY_MDB = COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/release/smuxi-common.dll \ ../../bin/release/smuxi-engine.dll BUILD_DIR = ../../bin/release SMUXI_ENGINE_DLL_MDB= NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll TCPEXCHANNEL_DLL_SOURCE=../../lib/TcpExChannel.dll SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS += -noconfig -codepage:utf8 -warn:4 -optimize- -debug -define:DEBUG "-define:TRACE,DEBUG,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-server.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-engine.dll BUILD_DIR = ../../bin/debug SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll TCPEXCHANNEL_DLL_SOURCE=../../lib/TcpExChannel.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_COMMON_DLL) \ $(SERVER_EXE_CONFIG) BINARIES = \ $(SERVER) all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Main.cs \ Server.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-server.in \ $(SERVER_EXE_CONFIG_SOURCE) REFERENCES = \ System.Runtime.Remoting \ System \ Mono.Posix DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) include $(top_srcdir)/Makefile.include LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll SERVER = $(BUILD_DIR)/smuxi-server TCPEXCHANNEL_DLL = $(BUILD_DIR)/TcpExChannel.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-wrapper,SERVER,smuxi-server,x)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SERVER_EXE_CONFIG)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) smuxi-1.1/src/Server/Main.cs0000644000175000017500000003325312726351313016577 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2008, 2010, 2011, 2015 Mirco Bauer * Copyright (c) 2010 Clement Bourgeois * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using NDesk.Options; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Server { public class MainClass { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-server"; public static void Main(string[] args) { System.Threading.Thread.CurrentThread.Name = "Main"; #if LOG4NET // initialize log level log4net.Repository.ILoggerRepository repo = log4net.LogManager.GetRepository(); repo.Threshold = log4net.Core.Level.Error; #endif bool addUser = false; bool delUser = false; bool modUser = false; bool listUsers = false; bool debug = false; string optBuffers = null; string username = null; string password = null; InitLocale(); OptionSet parser = new OptionSet(); parser.Add( "add-user", _("Add user to Server"), delegate(string val) { addUser = true; CheckExclusiveParameters(addUser, modUser, delUser, listUsers); } ); parser.Add( "modify-user", _("Modify existing user of Server"), delegate(string val) { modUser = true; CheckExclusiveParameters(addUser, modUser, delUser, listUsers); } ); parser.Add( "delete-user", _("Delete user from Server"), delegate(string val) { delUser = true; CheckExclusiveParameters(addUser, modUser, delUser, listUsers); } ); parser.Add( "list-users", _("List all existing users of Server"), delegate(string val) { listUsers = true; CheckExclusiveParameters(addUser, modUser, delUser, listUsers); } ); parser.Add( "username=", _("User to create, modify or delete"), delegate(string val) { CheckUsernameParameter(val); username = val; } ); parser.Add( "password=", _("Password of the user when creating or modifying a user"), delegate(string val) { CheckPasswordParameter(val); password = val; } ); parser.Add( "d|debug", _("Enable debug output"), delegate (string v) { debug = true; } ); parser.Add( "optimize-message-buffers=", _("Optimize message buffers and exit " + "(valid values: none, defrag, index, all)"), delegate (string val) { if (String.IsNullOrEmpty(val)) { val = "all"; } CheckOptimizeMessageBuffersParameter(val); optBuffers = val; } ); parser.Add( "h|help", _("Show this help"), delegate(string val) { Console.WriteLine(_("Usage: smuxi-server [options]")); Console.WriteLine(); Console.WriteLine(_("Options:")); parser.WriteOptionDescriptions(Console.Out); Environment.Exit(0); } ); parser.Add( "version", _("Show version"), delegate(string val) { Engine.Engine.Init(); Console.WriteLine(Engine.Engine.VersionString); Environment.Exit(0); } ); parser.Add( "<>", delegate(string val) { throw new OptionException( String.Format( _("Unknown option: '{0}'"), val ), val ); } ); try { parser.Parse(args); #if LOG4NET if (debug) { repo.Threshold = log4net.Core.Level.Debug; } #endif if (optBuffers != null) { OptimizeMessageBuffers(optBuffers); } if (addUser || modUser) { CheckUsernameParameter(username); CheckPasswordParameter(password); } if (delUser) { CheckUsernameParameter(username); } ManageUser(addUser, delUser, modUser, listUsers, username, password); } catch (OptionException ex) { Console.Error.WriteLine(_("Command line error: {0}"), ex.Message); Environment.Exit(1); } try { Server.Init(args); } catch (Exception e) { #if LOG4NET _Logger.Fatal(e); #endif // rethrow the exception for console output throw; } } private static void InitLocale() { string appDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string localeDir = Path.Combine(appDir, "locale"); if (!Directory.Exists(localeDir)) { localeDir = Path.Combine(Defines.InstallPrefix, "share"); localeDir = Path.Combine(localeDir, "locale"); } LibraryCatalog.Init("smuxi-server", localeDir); #if LOG4NET _Logger.Debug("Using locale data from: " + localeDir); #endif } private static void CheckExclusiveParameters(params bool[] parameters) { int enabled = 0; foreach (bool parameter in parameters) { if (parameter) { enabled++; } } if (enabled <= 1 ) { return; } throw new OptionException( _("At most one of --add-user, --modify-user, and --delete-user " + "may be used at a time."), String.Empty ); } private static void CheckUsernameParameter(string username) { if (username == null) { throw new OptionException( _("You must specify a username with the --username option."), String.Empty ); } if (username.Trim().Length == 0) { throw new OptionException( _("Username must not be empty."), String.Empty ); } } private static void CheckPasswordParameter(string password) { if (password == null) { throw new OptionException( _("You must specify a password with the --password option."), String.Empty ); } if (password.Trim().Length == 0) { throw new OptionException( _("Password must not be empty."), String.Empty ); } } private static void CheckOptimizeMessageBuffersParameter(string opts) { try { ParseBufferOptimizationTypes(opts); } catch (Exception) { var validOpts = Enum.GetNames(typeof(Db4oMessageBufferOptimizationTypes)); // lower-case values for (int i = 0; i < validOpts.Length; i++) { validOpts[i] = validOpts[i].ToLower(); } var validValues = String.Join(", ", validOpts); throw new OptionException( String.Format( _("Invalid optimization value passed to " + "--optimize-message-buffer, valid values are: {0}"), validValues ), String.Empty ); } } private static void ManageUser(bool addUser, bool delUser, bool modUser, bool listUsers, string username, string password) { Config config = new Config(); UserListController controller = new UserListController(config); if (addUser) { config.Load(); controller.AddUser(username, password); config.Save(); Console.WriteLine( _("User \"{0}\" successfully added to server."), username ); Environment.Exit(0); } else if (modUser) { config.Load(); controller.ModifyUser(username, password); config.Save(); Console.WriteLine( _("User \"{0}\" successfully modified."), username ); Environment.Exit(0); } else if (delUser) { config.Load(); controller.DeleteUser(username); config.Save(); Console.WriteLine( _("User \"{0}\" successfully deleted from server."), username ); Environment.Exit(0); } else if (listUsers) { config.Load(); var users = controller.GetUsers(); Console.WriteLine(_("Users:")); foreach (var user in users) { if (user == "local") { // is not a real user and could cause confusion continue; } Console.WriteLine("\t{0}", user); } Environment.Exit(0); } } private static Db4oMessageBufferOptimizationTypes ParseBufferOptimizationTypes(string optString) { if (optString == null) { throw new ArgumentNullException("optString"); } var optList = optString.Split(' ', ','); var opts = Db4oMessageBufferOptimizationTypes.None; foreach (var optItem in optList) { var optEnum = (Db4oMessageBufferOptimizationTypes) Enum.Parse( typeof(Db4oMessageBufferOptimizationTypes), optItem, true ); opts |= optEnum; } return opts; } private static void OptimizeMessageBuffers(string optString) { var logRepo = log4net.LogManager.GetRepository(); var origThreshold = logRepo.Threshold; // don't spew errors of Db4oMessageBuffer if (origThreshold == log4net.Core.Level.Error) { logRepo.Threshold = log4net.Core.Level.Fatal; } try { var opts = ParseBufferOptimizationTypes(optString); if (opts == Db4oMessageBufferOptimizationTypes.None) { Environment.Exit(0); return; } var bufferCount = Db4oMessageBuffer.OptimizeAllBuffers(opts); Console.WriteLine( String.Format( _("Successfully optimized {0} message buffers."), bufferCount ) ); Environment.Exit(0); } catch (Exception ex) { string error = ex.Message; if (ex.InnerException != null) { // inner-exceptio is more useful for some reason... error = ex.InnerException.Message; } Console.WriteLine( String.Format( _("Failed to optimize message buffers: {0}"), error ) ); Environment.Exit(1); } logRepo.Threshold = origThreshold; } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } } smuxi-1.1/src/Server/Makefile.in0000664000175000017500000010612214011526472017426 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ @ENABLE_RELEASE_TRUE@am__append_1 = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@am__append_2 = -noconfig -codepage:utf8 -warn:4 -optimize- -debug -define:DEBUG "-define:TRACE,DEBUG,LOG4NET" subdir = src/Server ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-server 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)$(pkgappdir)" \ "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/smuxi-server.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(man_MANS) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) man_MANS = smuxi-server.1 SERVER_EXE_CONFIG_SOURCE = smuxi-server.exe.config SERVER_EXE_CONFIG = $(BUILD_DIR)/smuxi-server.exe.config ASSEMBLY_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ $(am__append_1) \ $(am__append_2) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-server.exe @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-server.exe @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = exe @ENABLE_RELEASE_TRUE@COMPILE_TARGET = exe @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@TCPEXCHANNEL_DLL_SOURCE = ../../lib/TcpExChannel.dll @ENABLE_RELEASE_TRUE@TCPEXCHANNEL_DLL_SOURCE = ../../lib/TcpExChannel.dll @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_COMMON_DLL) \ $(SERVER_EXE_CONFIG) BINARIES = \ $(SERVER) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Main.cs \ Server.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-server.in \ $(SERVER_EXE_CONFIG_SOURCE) REFERENCES = \ System.Runtime.Remoting \ System \ Mono.Posix DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY) $(ASSEMBLY).mdb \ $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll SERVER = $(BUILD_DIR)/smuxi-server TCPEXCHANNEL_DLL = $(BUILD_DIR)/TcpExChannel.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Server/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Server/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-server: $(top_builddir)/config.status $(srcdir)/smuxi-server.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-man1 \ install-pdf install-pdf-am install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man uninstall-man1 \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-wrapper,SERVER,smuxi-server,x)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SERVER_EXE_CONFIG)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) # 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: smuxi-1.1/src/Server/smuxi-server.10000644000175000017500000000406212726351313020113 0ustar00meebeymeebey00000000000000.Dd $Mdocdate: February 23 2014 $ .Dt smuxi-server 1 .Os .Sh NAME .Nm smuxi-server .Nd remote engine for Smuxi chat client .Sh SYNOPSIS .Nm smuxi-server .Op Fl dh .Op Fl \-add-user .Op Fl \-modify-user .Op Fl \-delete-user .Op Fl \-list-users .Op Fl \-username Ns = Ns Ar username .Op Fl \-password Ns = Ns Ar password .Op Fl \-optimize-message-buffers Ns = Ns Ar action .Sh DESCRIPTION .Nm is a remote engine for the Smuxi chat client. Multiple Smuxi frontends can connect and be kept in sync, and when none are connected, keeps track and stays connected to servers. .Pp Some options are mutually exclusive. When no special options are taken, the server will start normally. The options are as follows: .Bl -tag -width Ds .It Fl d , Fl \-debug Turn on debugging. Debug logs are sent to .Pa $XDG_DATA_HOME/smuxi/smuxi-server.log , and older logs are moved to the date of usage. .It Fl h , Fl \-help Show the arguments Smuxi takes. .It Fl \-version Show version information. .It Fl \-add-user Adds a user to the server. .It Fl \-delete-user Deletes a user from the server. .It Fl \-modify-user Changes a user's properties. .It Fl \-list-users Lists the users of the server. .It Fl \-username Ns = Ns Ar username When adding, deleting, or modifying a user, use that username. .It Fl \-password Ns = Ns Ar password When adding or modifying a user, use that password. .It Fl \-optimize-message-buffers Ns = Ns Ar action Optimizes the message buffers. Valid values are none, defrag, index, and all. .El .Sh FILES .Bl -tag -width -compact .It Pa $XDG_DATA_HOME/smuxi/share/smuxi-server.log smuxi debug log .It Pa $XDG_CONFIG_HOME/smuxi/smuxi-engine.ini smuxi engine config .El .Sh SIGNALS Smuxi will handle and catch these signals: .Bl -tag -width xxxxxxxx -compact .It SIGINT Gracefully exits the server. .It SIGTERM Gracefully exits the server. .El .Sh SEE ALSO .Xr smuxi-frontend-gnome 1 , .Xr smuxi-frontend-stfl 1 , .Xr smuxi-message-buffer 1 .Pp Website: https://smuxi.im/ .Sh AUTHOR/CREDITS Smuxi, including this server, was written by Mirco Bauer. .Pp This manpage was written by Calvin Buckley. smuxi-1.1/src/Server/smuxi-server.exe.config0000644000175000017500000000113711655545675022020 0ustar00meebeymeebey00000000000000
smuxi-1.1/src/smuxi-win32.nsis.in0000664000175000017500000005662113411450522017526 0ustar00meebeymeebey00000000000000############################################################################ # NSIS install script for Smuxi # # # # Copyright (C) 2009 Sebastian Schnur # # Copyright (C) 2009-2013 Mirco Bauer # # # # 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 # ############################################################################ ######################### # main install settings # ######################### # NSIS's zlib implementation is broken SetCompressor lzma !define PRODUCT_NAME "Smuxi" !define PRODUCT_VERSION "@VERSION@@DEV_VERSION_SUFFIX@" !define PRODUCT_PUBLISHER "Mirco Bauer " !define PRODUCT_WEB_SITE "https://smuxi.im" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\smuxi-frontend-gnome.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define DOTNET_VERSION "4.0" !define GTKSHARP_PRODUCT_GUID "{3CB70B01-4BC8-4C0F-B28F-7C6E33F913CC}" !define GTKSHARP_VERSION "2.12.22" !define MONO_VERSION "4.2" ############################ # MUI 1.67 compatible mode # ############################ !include "MUI.nsh" !include "WinVer.nsh" ; MUI Settings [please make the path relative] !define MUI_ABORTWARNING !define MUI_ICON "../images/icon.ico" !define MUI_UNICON "../images/icon.ico" ###################### # Language Selection # ###################### ; Language Selection Dialog Settings !define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" !define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" !define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" ################# # install pages # ################# ; Welcome page !insertmacro MUI_PAGE_WELCOME ; License page !define MUI_LICENSEPAGE_RADIOBUTTONS !insertmacro MUI_PAGE_LICENSE "../LICENSE" ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_TEXT "Run Smuxi" !define MUI_FINISHPAGE_RUN_FUNCTION "RunSmuxi" !insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_INSTFILES ################## # Language files # ################## !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Italian" ########################### # MUI end # ########################### Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "../smuxi-win32-setup.exe" InstallDir "$PROGRAMFILES\Smuxi" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails show ShowUnInstDetails show Function .onInit !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd ############ # Macros # ############ !macro CheckXPServicePack ${If} ${IsWinXP} goto CheckXP ${Else} goto CheckXPServicePackEnd ${EndIf} CheckXP: ${If} ${AtLeastServicePack} 2 DetailPrint "Found Windows XP Service Pack 2 or later" goto CheckXPServicePackEnd ${Else} DetailPrint "Found Windows XP without Service Pack 2." MessageBox MB_OK|MB_ICONEXCLAMATION "Smuxi requires Windows XP Service Pack 2 or later." IDOK Abort ${EndIf} Abort: Abort CheckXPServicePackEnd: !macroend !macro CheckGtkSharp GTKSHARP_REQ !define GTKSHARP_FILE "gtk-sharp-2.12.22.msi" !define GTKSHARP_BASE_URL "http://www.smuxi.org/jaws/data/files/" !define GTKSHARP_DOWNLOAD_URL "${GTKSHARP_BASE_URL}${GTKSHARP_FILE}" !define GTKSHARP_TEMP_FILE "$TEMP\${GTKSHARP_FILE}" DetailPrint "Checking your GTK# version..." Var /GLOBAL GTKSHARP_FOUND_VERSION # GTK# 2.12.20 uses a Xamarin key ReadRegStr $GTKSHARP_FOUND_VERSION HKLM \ "SOFTWARE\Xamarin\GtkSharp\Version" "" # GTK# 2.12.10 uses a Novell key ${If} $GTKSHARP_FOUND_VERSION == "" ReadRegStr $GTKSHARP_FOUND_VERSION HKLM \ "SOFTWARE\Novell\GtkSharp\Version" "" ${EndIf} ${VersionCompare} $GTKSHARP_FOUND_VERSION ${GTKSHARP_REQ} $R0 ${If} $GTKSHARP_FOUND_VERSION == "" goto InstallGtkSharpConfirmation ${ElseIf} $R0 == "0" DetailPrint "GTK# already installed" goto End ${ElseIf} $R0 == "1" DetailPrint "Newer GTK# already installed" goto End ${ElseIf} $R0 == "2" DetailPrint "Older GTK# found" goto InstallGtkSharpConfirmation ${EndIf} InstallGtkSharpConfirmation: MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ "Your GTK# version: $GTKSHARP_FOUND_VERSION $\nRequired Version: ${GTKSHARP_REQ} or greater.$\n$\nDownload GTK# from www.smuxi.org?" \ /SD IDYES IDYES InstallGtkSharp IDNO End goto GiveUp ;IDCANCEL InstallGtkSharp: SetOutPath "$TEMP" SetOverwrite on DetailPrint "Beginning download of GTK#..." NSISDL::download "${GTKSHARP_DOWNLOAD_URL}" "${GTKSHARP_TEMP_FILE}" Pop $0 ${If} $0 == "cancel" DetailPrint "Download failed." MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Download cancelled. Continue Installation?" \ IDYES End IDNO GiveUp ${ElseIf} $0 != "success" DetailPrint "Download failed." MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Download failed:$\n$0$\n$\nContinue Installation?" \ IDYES End IDNO GiveUp ${EndIf} DetailPrint "Download completed." DetailPrint "Pausing installation while downloaded GTK# installer runs." ${If} $GTKSHARP_FOUND_VERSION != "" DetailPrint "Beginning uninstall of old GTK#..." ExecWait 'msiexec /x "${GTKSHARP_PRODUCT_GUID}" /passive' $0 DetailPrint "Uninstall completed. Exit code = '$0'" ${EndIf} ExecWait 'msiexec /i "${GTKSHARP_TEMP_FILE}" /passive' $0 DetailPrint "Completed GTK# install. Exit code = '$0'. Removing GTK# installer." Delete "${GTKSHARP_TEMP_FILE}" DetailPrint "GTK# installer removed." # HACK: force reloading the PATH environment variable for the installer Var /GLOBAL PATH ReadRegStr $PATH HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", "$PATH")' # HACK: announce the PATH change to all other applications SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 goto End GiveUp: Abort "Installation cancelled by user." End: !macroend !macro CheckMono DetailPrint "Checking your Mono version..." Var /GLOBAL MONO_FOUND_VERSION ReadRegStr $MONO_FOUND_VERSION HKLM \ "SOFTWARE\Mono" "Version" Var /GLOBAL MONO_FOUND_INSTALLDIR ReadRegStr $MONO_FOUND_INSTALLDIR HKLM \ "SOFTWARE\Mono" "SdkInstallRoot" ${If} $MONO_FOUND_VERSION != "" DetailPrint "Found Mono $MONO_FOUND_VERSION in $MONO_FOUND_INSTALLDIR" ${EndIf} Var /GLOBAL MONO_EXE # WTF: StrCpy can't append and there is no other way to append a string to a # variable in NSIS StrCpy $MONO_EXE "$MONO_FOUND_INSTALLDIRbin\mono.exe" !macroend # DotNET and MSI version checking macro. # Written by AnarkiNet(AnarkiNet@gmail.com) originally, modified by eyal0 (for use in http://www.sourceforge.net/projects/itwister) # MSI check code based on http://www.codeproject.com/useritems/NSIS.asp # 2009-05-26 Mirco Bauer: updated DOTNET_URL location # Downloads the MSI version 3.1 and runs it if the user does not have the correct version. # Downloads and runs the Microsoft .NET Framework version 2.0 Redistributable and runs it if the user does not have the correct version. # To use, call the macro with a string: # Example: non real version numbers # !insertmacro CheckDotNET "2" # !insertmacro CheckDotNET "2.0.9" # (Version 2.0.9 is less than version 2.0.10.) # Example: latest real version number at time of writing # !insertmacro CheckDotNET "2.0.50727" # All register variables are saved and restored by CheckDotNet # No output !macro CheckDotNET DotNetReqVer # .NET 2.0 - 22 MB # http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe # .NET 2.0 SP2 - 24 MB # http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe # .NET 3.0 - 50 MB # http://go.microsoft.com/fwlink/?LinkId=70848 # .NET 3.5 - 197 MB # http://download.microsoft.com/download/6/0/f/60fc5854-3cb8-4892-b6db-bd4f42510f28/dotnetfx35.exe # .NET 3.5 Web Installer - 2.4 MB # http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe # .NET 3.5 SP1 - 231 MB # http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe # .NET 3.5 SP1 Web Installer - 3 MB / .NET 2.0 -> 3.5: 52 MB # http://download.microsoft.com/download/0/6/1/061F001C-8752-4600-A198-53214C69B51F/dotnetfx35setup.exe # .NET 4.0 Client Profile Web Installer - 1 MB # - .NET 3.5 SP1 -> 4.0: 43 MB # http://download.microsoft.com/download/7/B/6/7B629E05-399A-4A92-B5BC-484C74B5124B/dotNetFx40_Client_setup.exe # .NET 4.0 Full Web Installer - 1 MB # - .NET 3.5 SP1 -> 4.0: 54 MB # - .NET 4.0 Client Profile -> 4.0 Full: 15 MB # http://download.microsoft.com/download/1/B/E/1BE39E79-7E39-46A3-96FF-047F95396215/dotNetFx40_Full_setup.exe !define DOTNET_URL "http://download.microsoft.com/download/7/B/6/7B629E05-399A-4A92-B5BC-484C74B5124B/dotNetFx40_Client_setup.exe" !define MSI31_URL "http://download.microsoft.com/download/1/4/7/147ded26-931c-4daf-9095-ec7baf996f46/WindowsInstaller-KB893803-v2-x86.exe" DetailPrint "Checking your .NET Framework version..." ;callee register save Push $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 ;backup of installed ver Push $7 ;backup of DoNetReqVer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MSI ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetDLLVersion "$SYSDIR\msi.dll" $R0 $R1 IntOp $R2 $R0 / 0x00010000 ; $R2 now contains major version IntOp $R3 $R0 & 0x0000FFFF ; $R3 now contains minor version IntOp $R4 $R1 / 0x00010000 ; $R4 now contains release IntOp $R5 $R1 & 0x0000FFFF ; $R5 now contains build StrCpy $0 "$R2.$R3.$R4.$R5" ; $0 now contains string like "1.2.0.192" ${If} $R2 < '3' ;options SetOutPath "$TEMP" SetOverwrite on MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ "Your MSI version: $0 $\nRequired Version: 3 or greater.$\n$\nDownload MSI version from www.microsoft.com?" \ /SD IDYES IDYES DownloadMSI IDNO NewMSI goto GiveUpDotNET ;IDCANCEL ${Else} DetailPrint "MSI3.1 already installed" goto NewMSI ${EndIf} DownloadMSI: DetailPrint "Beginning download of MSI3.1." NSISDL::download ${MSI31_URL} "$TEMP\WindowsInstaller-KB893803-v2-x86.exe" DetailPrint "Completed download." Pop $0 ${If} $0 == "cancel" MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Download cancelled. Continue Installation?" \ IDYES NewMSI IDNO GiveUpDotNET ${ElseIf} $0 != "success" MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Download failed:$\n$0$\n$\nContinue Installation?" \ IDYES NewMSI IDNO GiveUpDotNET ${EndIf} DetailPrint "Pausing installation while downloaded MSI3.1 installer runs." ExecWait '$TEMP\WindowsInstaller-KB893803-v2-x86.exe /quiet /norestart' $0 DetailPrint "Completed MSI3.1 install/update. Exit code = '$0'. Removing MSI3.1 installer." Delete "$TEMP\WindowsInstaller-KB893803-v2-x86.exe" DetailPrint "MSI3.1 installer removed." goto NewMSI NewMSI: DetailPrint "MSI3.1 installation done. Proceeding with remainder of installation." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; NetFX ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; StrCpy $7 "${DotNetReqVer}" System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i r2r2) i .r1 ?u" ${If} $0 == 0 DetailPrint ".NET Framework not found, download is required for program to run." Goto NoDotNET ${EndIf} Var /GLOBAL NET35_INSTALL Var /GLOBAL NET35_SP Var /GLOBAL NET4_INSTALL ReadRegStr $NET35_INSTALL HKLM \ "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install" ReadRegStr $NET35_SP HKLM \ "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "SP" ReadRegStr $NET4_INSTALL HKLM \ "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Install" ${If} $NET4_INSTALL == "1" DetailPrint ".NET Framework Version 4.0 found" goto NewDotNET ${ElseIf} $NET35_INSTALL == "1" StrCpy $6 "$0" DetailPrint ".NET Framework Version found: 3.5, but is older than the required version: $7" goto OldDotNET ${Else} goto NoDotNET ${EndIf} NoDotNET: MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ ".NET Framework not installed.$\nRequired Version: $7 or greater.$\n$\nDownload .NET Framework $7 from www.microsoft.com?" \ /SD IDYES IDYES DownloadDotNET IDNO NewDotNET goto GiveUpDotNET ;IDCANCEL OldDotNET: MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ "Your .NET Framework version: $6 $\nRequired Version: $7 or greater.$\n$\nDownload .NET Framework $7 from www.microsoft.com?" \ /SD IDYES IDYES DownloadDotNET IDNO NewDotNET goto GiveUpDotNET ;IDCANCEL DownloadDotNET: DetailPrint "Beginning download of latest .NET Framework version." NSISDL::download ${DOTNET_URL} "$TEMP\dotnetfx.exe" DetailPrint "Completed download." Pop $0 ${If} $0 == "cancel" MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Download cancelled. Continue Installation?" \ IDYES NewDotNET IDNO GiveUpDotNET ${ElseIf} $0 != "success" MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Download failed:$\n$0$\n$\nContinue Installation?" \ IDYES NewDotNET IDNO GiveUpDotNET ${EndIf} DetailPrint "Pausing installation while downloaded .NET Framework installer runs." DetailPrint "" DetailPrint "!!! Depending on your internet bandwidth and computer performance" DetailPrint "!!! this can take a while (up to 10 minutes). Please be patient!" ExecWait '$TEMP\dotnetfx.exe /passive /norestart' DetailPrint "Completed .NET Framework install/update. Removing .NET Framework installer." Delete "$TEMP\dotnetfx.exe" DetailPrint ".NET Framework installer removed." goto NewDotNet GiveUpDotNET: Abort "Installation cancelled by user." NewDotNET: DetailPrint "Proceeding with remainder of installation." Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !macroend Function VersionCompare !define VersionCompare `!insertmacro VersionCompareCall` !macro VersionCompareCall _VER1 _VER2 _RESULT Push `${_VER1}` Push `${_VER2}` Call VersionCompare Pop ${_RESULT} !macroend Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 begin: StrCpy $2 -1 IntOp $2 $2 + 1 StrCpy $3 $0 1 $2 StrCmp $3 '' +2 StrCmp $3 '.' 0 -3 StrCpy $4 $0 $2 IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 StrCpy $2 -1 IntOp $2 $2 + 1 StrCpy $3 $1 1 $2 StrCmp $3 '' +2 StrCmp $3 '.' 0 -3 StrCpy $5 $1 $2 IntOp $2 $2 + 1 StrCpy $1 $1 '' $2 StrCmp $4$5 '' equal StrCpy $6 -1 IntOp $6 $6 + 1 StrCpy $3 $4 1 $6 StrCmp $3 '0' -2 StrCmp $3 '' 0 +2 StrCpy $4 0 StrCpy $7 -1 IntOp $7 $7 + 1 StrCpy $3 $5 1 $7 StrCmp $3 '0' -2 StrCmp $3 '' 0 +2 StrCpy $5 0 StrCmp $4 0 0 +2 StrCmp $5 0 begin newer2 StrCmp $5 0 newer1 IntCmp $6 $7 0 newer1 newer2 StrCpy $4 '1$4' StrCpy $5 '1$5' IntCmp $4 $5 begin newer2 newer1 equal: StrCpy $0 0 goto end newer1: StrCpy $0 1 goto end newer2: StrCpy $0 2 end: Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 FunctionEnd Function RunSmuxi ExecShell "" "$SMPROGRAMS\Smuxi\Smuxi.lnk" FunctionEnd ############ # Sections # ############ Section "Main" SEC01 !insertmacro CheckXPServicePack !insertmacro CheckDotNET "${DOTNET_VERSION}" !insertmacro CheckGtkSharp ${GTKSHARP_VERSION} !insertmacro CheckMono SetShellVarContext all SetOutPath "$INSTDIR" CreateDirectory "$SMPROGRAMS\Smuxi" CreateShortCut "$SMPROGRAMS\Smuxi\Smuxi.lnk" "$INSTDIR\smuxi-frontend-gnome.exe" CreateShortCut "$DESKTOP\Smuxi.lnk" "$INSTDIR\smuxi-frontend-gnome.exe" ${If} $MONO_FOUND_VERSION != "" CreateShortCut "$SMPROGRAMS\Smuxi\Smuxi (Mono).lnk" "$MONO_EXE" "$\"$INSTDIR\smuxi-frontend-gnome.exe$\"" "$INSTDIR\smuxi-frontend-gnome.exe" CreateShortCut "$DESKTOP\Smuxi (Mono).lnk" "$MONO_EXE" "$\"$INSTDIR\smuxi-frontend-gnome.exe$\"" "$INSTDIR\smuxi-frontend-gnome.exe" ${EndIf} # remove obsolete libraries for upgrades from Smuxi < 0.8.10.2 Delete "$INSTDIR\zlib1.dll" Delete "$INSTDIR\MonoPosixHelper.dll" SetOverwrite on File "../bin-win32/log4net.dll" File "../bin-win32/Meebey.SmartIrc4net.dll" File "../bin-win32/StarkSoftProxy.dll" File "../bin-win32/Mono.Data.Sqlite.dll" File "../bin-win32/sqlite3.dll" File "../bin-win32/Mono.Posix.dll" File "../bin-win32/Nini.dll" File "../bin-win32/Twitterizer2.dll" File "../bin-win32/Twitterizer2.Streaming.dll" File "../bin-win32/Newtonsoft.Json.dll" File "../bin-win32/agsxmpp.dll" File "../bin-win32/Db4objects.Db4o.dll" File "../bin-win32/ServiceStack.Text.dll" File "../bin-win32/ServiceStack.Interfaces.dll" File "../bin-win32/ServiceStack.Common.dll" File "../bin-win32/Microsoft.AspNet.SignalR.Client.dll" File "../bin-win32/JabbR.Client.dll" File "../bin-win32/smuxi-common.dll" File "../bin-win32/smuxi-engine-campfire.dll" File "../bin-win32/smuxi-engine-irc.dll" File "../bin-win32/smuxi-engine-jabbr.dll" File "../bin-win32/smuxi-engine-twitter.dll" File "../bin-win32/smuxi-engine-xmpp.dll" File "../bin-win32/smuxi-engine.dll" File "../bin-win32/smuxi-frontend-gnome-irc.dll" File "../bin-win32/smuxi-frontend-gnome-twitter.dll" File "../bin-win32/smuxi-frontend-gnome-xmpp.dll" File "../bin-win32/smuxi-frontend-gnome.exe" File "../bin-win32/smuxi-frontend-gnome.exe.config" File "../bin-win32/smuxi-frontend.dll" File "../bin-win32/smuxi-server.exe" File "../bin-win32/smuxi-server.exe.config" File "../bin-win32/plink.exe" File "../bin-win32/Fixedsys500c.ttf" File /nonfatal /r "../bin-win32/locale" File /nonfatal /r "../bin-win32/icons" IfFileExists "$FONTS/Fixedsys500c.ttf" SkipFont InstallFont SkipFont: DetailPrint "Fixed-Sys font already installed" goto MainEnd InstallFont: DetailPrint "Installing Fixed-Sys font..." CopyFiles "$INSTDIR\Fixedsys500c.ttf" "$FONTS" System::Call "GDI32::AddFontResourceA(t) i ('Fixedsys500c.ttf') .s" WriteRegStr "HKLM" "Software\Microsoft\Windows NT\CurrentVersion\Fonts" "Fixedsys TTF V5.00c (TrueType)" "Fixedsys500c.ttf" SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=5000 DetailPrint "Done." goto MainEnd MainEnd: SectionEnd Section -AdditionalIcons WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateShortCut "$SMPROGRAMS\Smuxi\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" CreateShortCut "$SMPROGRAMS\Smuxi\Uninstall.lnk" "$INSTDIR\uninst.exe" SectionEnd Section -Post WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\smuxi-frontend-gnome.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\smuxi-frontend-gnome.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" SectionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully uninstalled." FunctionEnd Function un.onInit !insertmacro MUI_UNGETLANGUAGE MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Do you want to unistall $(^Name) and all it's components?" IDYES +2 Abort FunctionEnd Section Uninstall SetShellVarContext all Delete "$INSTDIR\${PRODUCT_NAME}.url" Delete "$INSTDIR\uninst.exe" Delete "$INSTDIR\smuxi-server.exe.config" Delete "$INSTDIR\smuxi-server.exe" Delete "$INSTDIR\smuxi-server.log" Delete "$INSTDIR\smuxi-frontend.dll" Delete "$INSTDIR\smuxi-frontend-gnome.exe.config" Delete "$INSTDIR\smuxi-frontend-gnome.exe" Delete "$INSTDIR\smuxi-frontend-gnome.log" Delete "$INSTDIR\smuxi-frontend-gnome-irc.dll" Delete "$INSTDIR\smuxi-frontend-gnome-twitter.dll" Delete "$INSTDIR\smuxi-frontend-gnome-xmpp.dll" Delete "$INSTDIR\smuxi-engine.dll" Delete "$INSTDIR\smuxi-engine-campfire.dll" Delete "$INSTDIR\smuxi-engine-irc.dll" Delete "$INSTDIR\smuxi-engine-jabbr.dll" Delete "$INSTDIR\smuxi-engine-twitter.dll" Delete "$INSTDIR\smuxi-engine-xmpp.dll" Delete "$INSTDIR\smuxi-common.dll" Delete "$INSTDIR\Twitterizer2.dll" Delete "$INSTDIR\Newtonsoft.Json.dll" Delete "$INSTDIR\agsxmpp.dll" Delete "$INSTDIR\Db4objects.Db4o.dll" Delete "$INSTDIR\Nini.dll" Delete "$INSTDIR\Mono.Data.Sqlite.dll" Delete "$INSTDIR\sqlite3.dll" Delete "$INSTDIR\Mono.Posix.dll" Delete "$INSTDIR\Meebey.SmartIrc4net.dll" Delete "$INSTDIR\StarkSoftProxy.dll" Delete "$INSTDIR\ServiceStack.Text.dll" Delete "$INSTDIR\ServiceStack.Interfaces.dll" Delete "$INSTDIR\ServiceStack.Common.dll" Delete "$INSTDIR\Microsoft.AspNet.SignalR.Client.dll" Delete "$INSTDIR\JabbR.Client.dll" Delete "$INSTDIR\log4net.dll" Delete "$INSTDIR\plink.exe" Delete "$INSTDIR\Fixedsys500c.ttf" RMDir /r "$INSTDIR\locale" RMDir /r "$INSTDIR\icons" Delete "$DESKTOP\Smuxi.lnk" Delete "$DESKTOP\Smuxi (Mono).lnk" Delete "$SMPROGRAMS\Smuxi\Uninstall.lnk" Delete "$SMPROGRAMS\Smuxi\Website.lnk" Delete "$SMPROGRAMS\Smuxi\Smuxi.lnk" Delete "$SMPROGRAMS\Smuxi\Smuxi (Mono).lnk" RMDir "$SMPROGRAMS\Smuxi" RMDir "$INSTDIR" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_DIR_REGKEY}" SetAutoClose true SectionEnd smuxi-1.1/src/Common/0000775000175000017500000000000014011526500015331 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Common/IconCache.cs0000644000175000017500000002512112726351313017504 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2012 Mirco Bauer // Copyright (c) 2015 Carlos Martín Nieto // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; using System.Net; using System.Text.RegularExpressions; using System.Threading; using System.Collections.Generic; using System.Linq; using Smuxi.Common; namespace Smuxi.Common { public class IconCache { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public IWebProxy Proxy { get; set; } readonly string f_CachePath = Platform.CachePath; readonly string f_IconsPath; /// /// Try to get a cached icon /// /// true, if get icon is cached, false otherwise. /// The protocol of the channel or server /// Name of the icon, including file extension /// Path to the cached icon, if cached /// /// This method is thread safe /// public bool TryGetIcon(string protocol, string iconName, out string value) { var iconPath = Path.Combine(f_IconsPath, protocol); iconPath = Path.Combine(iconPath, iconName); var iconFile = new FileInfo(iconPath); if (iconFile.Exists && iconFile.Length > 0) { value = iconPath; return true; } value = null; return false; } void EnsureDirectoryExists(string path) { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } /// /// Download an image file into the cache /// /// The protocol of the channel or server /// Name of the image, including extension /// The url from which to download the image /// Function to call after downloading the image /// Function to call if an error happens (optional) /// /// This method is thread safe /// public void BeginDownloadFile(string protocol, string iconName, string fileUrl, Action onSuccess, Action onError) { EnqueueDownload(protocol, iconName, fileUrl, DownloadFileWorker, onSuccess, onError); } void DownloadFileWorker(string fileUrl, FileInfo imageFile) { Trace.Call(fileUrl, imageFile); // download to a randomly-named file so we don't conflict with a concurrent download var tempFile = new FileInfo(Path.Combine(imageFile.DirectoryName, Path.GetRandomFileName())); DownloadFileFromUrl(fileUrl, tempFile); // finally, rename atomically, giving up if someone beat us to downloading // this file try { tempFile.MoveTo(imageFile.FullName); } catch (IOException) { // someone beat us to downloading the image, simply remove the temp file tempFile.Delete(); } } void EnqueueDownload(string protocol, string iconName, string url, Action action, Action onSuccess, Action onError) { ThreadPool.QueueUserWorkItem(delegate { try { var protocolPath = Path.Combine(f_IconsPath, protocol); EnsureDirectoryExists(protocolPath); var iconPath = Path.Combine(protocolPath, iconName); var iconFile = new FileInfo(iconPath); action(url, iconFile); iconFile.Refresh(); if (!iconFile.Exists || iconFile.Length == 0) { return; } onSuccess(iconPath); } catch (Exception ex) { #if LOG4NET f_Logger.Error("IconCache: Exception", ex); #endif if (onError != null) { onError(ex); } } }); } void DownloadFileFromUrl(string url, FileInfo file) { var request = WebRequest.Create(url); request.Proxy = Proxy; if (request is HttpWebRequest) { var iconHttpRequest = (HttpWebRequest) request; if (file.Exists) { iconHttpRequest.IfModifiedSince = file.LastWriteTime; } } WebResponse response; try { response = request.GetResponse(); } catch (WebException ex) { if (ex.Response is HttpWebResponse) { var iconHttpResponse = (HttpWebResponse) ex.Response; if (iconHttpResponse.StatusCode == HttpStatusCode.NotModified) { // icon hasn't changed, nothing to do return; } } throw; } using (var fileStream = file.OpenWrite()) using (var httpStream = response.GetResponseStream()) { byte[] buffer = new byte[4096]; int read; while ((read = httpStream.Read(buffer, 0, buffer.Length)) > 0) { fileStream.Write(buffer, 0, read); } } } /// /// Download an icon into the cache. /// /// The download will happen in the background and onSuccess will be called /// when done. If there is an error during the download, an error will be /// logged and onSuccess will not be called. /// /// The callback will be called in the background thread. If you want to /// update the GUI, make sure you schedule code to run in the main thread. /// /// The protocol of the channel or server /// Name of the icon, including extension /// The url from which to download the icon /// Function to call after downloading the icon /// Function to call if an error happens (optinal) /// /// This method is thread safe /// public void BeginDownloadIcon(string protocol, string iconName, string websiteUrl, Action onSuccess, Action onError) { EnqueueDownload(protocol, iconName, websiteUrl, DownloadServerIcon, onSuccess, onError); } void DownloadServerIcon(string websiteUrl, FileInfo iconFile) { Trace.Call(websiteUrl, iconFile); var webClient = new WebClient(); webClient.Proxy = Proxy; var content = webClient.DownloadString(websiteUrl); var links = new List>(); foreach (Match linkMatch in Regex.Matches(content, @"]*?)/?>")) { var attributes = new Dictionary(); foreach (Match attrMatch in Regex.Matches(linkMatch.Value, @"([\w]+)[\s]*=[\s]*[""']([^""']*)[""'][\s]*")) { var key = attrMatch.Groups[1].Value; var value = attrMatch.Groups[2].Value; attributes.Add(key, value); } links.Add(attributes); } string faviconRel = null; foreach (var link in links) { var iconLink = false; foreach (var attribute in link) { if (attribute.Key != "rel" || !attribute.Value.Split(' ').Contains("icon")) { continue; } iconLink = true; break; } if (!iconLink) { continue; } foreach (var attribute in link) { if (attribute.Key != "href") { continue; } // yay, we have found the favicon in all this junk faviconRel = attribute.Value; break; } } string faviconUrl = null; if (String.IsNullOrEmpty(faviconRel)) { faviconRel = "/favicon.ico"; } faviconUrl = new Uri(new Uri(websiteUrl), faviconRel).ToString(); #if LOG4NET f_Logger.DebugFormat("DownloadServerIcon(): favicon URL: {0}", faviconUrl); #endif // save new or modified icon file DownloadFileFromUrl(faviconUrl, iconFile); } /// /// Initializes a new instance of the class. /// /// The kind of icons to cache (e.g. "server-icons", "emoji") public IconCache(string kind) { f_IconsPath = Path.Combine(f_CachePath, kind); EnsureDirectoryExists(f_IconsPath); } } } smuxi-1.1/src/Common/RateLimiter.cs0000644000175000017500000000525712726351313020121 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2014 Mirco Bauer // Copyright (c) 2014 Oliver Schneider // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Smuxi.Common { public class RateLimiter { TimeSpan TimeWindow { get; set; } int CallCounter { get; set; } int CallLimit { get; set; } DateTime FirstCall { get; set; } object SyncRoot { get; set; } public bool IsRateLimited { get { return IsAboveLimit && IsInWindow; } } bool IsAboveLimit { get { return CallLimit <= CallCounter; } } bool IsInWindow { get { return (DateTime.UtcNow - FirstCall) < TimeWindow; } } public RateLimiter(int callLimit, TimeSpan timeWindow) { if (callLimit <= 0) { throw new ArgumentException("callLimit must be greater than 0.", "callLimit"); } CallLimit = callLimit; TimeWindow = timeWindow; SyncRoot = new object(); } public static RateLimiter operator ++(RateLimiter l) { if (l.IsRateLimited) { throw new InvalidOperationException("IsRateLimited must not be true."); } lock (l.SyncRoot) { if (!l.IsInWindow) { l.CallCounter = 0; l.FirstCall = DateTime.UtcNow; } l.CallCounter++; } return l; } } } smuxi-1.1/src/Common/ThreadPoolQueue.cs0000664000175000017500000000537414011472672020751 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2011 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Threading; using System.Collections.Generic; namespace Smuxi.Common { public class ThreadPoolQueue { public int MaxWorkers { set; get; } Queue ActionQueue { set; get; } int ActiveWorkers; public ThreadPoolQueue() { MaxWorkers = Environment.ProcessorCount; ActionQueue = new Queue(); } /// /// This method is thread safe. /// public void Enqueue(Action action) { if (action == null) { throw new ArgumentNullException("action"); } lock (ActionQueue) { ActionQueue.Enqueue(action); } CheckQueue(); } void CheckQueue() { var action = Dequeue(); if (action == null) { return; } Interlocked.Increment(ref ActiveWorkers); ThreadPool.QueueUserWorkItem(delegate { try { action(); } finally { Interlocked.Decrement(ref ActiveWorkers); CheckQueue(); } }); } Action Dequeue() { lock (ActionQueue) { if (ActionQueue.Count == 0) { return null; } if (ActiveWorkers >= MaxWorkers) { return null; } return ActionQueue.Dequeue(); } } } } smuxi-1.1/src/Common/SingleApplicationInstance.cs0000644000175000017500000002665212726351313022774 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2015 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Threading; using System.Runtime.Remoting.Channels.Ipc; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.IO; #if MONO_UNIX using Mono.Unix; using Mono.Unix.Native; #endif namespace Smuxi.Common { public class SingleApplicationInstance : IDisposable where T : SingleApplicationInterface { public string Identifier { get; private set; } public bool IsFirstInstance { get; private set; } Mutex FirstInstanceMutex { get; set; } #if MONO_UNIX UnixFileInfo FirstInstanceFileInfo { get; set; } UnixStream FirstInstanceFileStream { get; set; } Thread UnixSignalThread { get; set; } #endif IChannel RemotingChannel { get; set; } string RemotingObjectName { get; set; } T f_FirstInstance; public T FirstInstance { get { if (f_FirstInstance == default(T)) { if (IsFirstInstance) { throw new InvalidOperationException("FirstInstance must be initialized first."); } else { ConnectToFirstInstance(); } } return f_FirstInstance; } set { if (value == null) { throw new ArgumentNullException("value"); } if (!IsFirstInstance) { throw new InvalidOperationException("FirstInstance must be initialized by the first instance."); } f_FirstInstance = value; ExposeFirstInstance(); } } public SingleApplicationInstance() { Identifier = typeof(T).Assembly.Location; // Mono's IPC does not like \ or / in the name // On MS .NET Local\ as a special and valid prefix! Identifier = Identifier.Replace("\\", "_").Replace("/", "_"); Init(); } public SingleApplicationInstance(string instanceIdentifier) { if (instanceIdentifier == null) { throw new ArgumentNullException("instanceIdentifier"); } Identifier = instanceIdentifier; Init(); } ~SingleApplicationInstance() { Dispose(false); } void Init() { RemotingObjectName = "SingleApplicationInstance"; // MS .NET on Windows -> named mutex // Mono on Windows -> named mutex // Mono w/ SHM on Linux -> named mutex // Mono w/o SHM on Linux -> file lock var platform = Environment.OSVersion.Platform; switch (platform) { case PlatformID.Win32NT: InitMutex(); break; case PlatformID.Unix: var has_shm = false; if (IsRunningOnMono()) { // we can only assume that named mutex are available if // MONO_ENABLE_SHM is set and MONO_DISABLE_SHM is unset var enable_shm = Environment.GetEnvironmentVariable("MONO_ENABLE_SHM"); var disalbe_shm = Environment.GetEnvironmentVariable("MONO_DISABLE_SHM"); has_shm = !String.IsNullOrEmpty(enable_shm) && String.IsNullOrEmpty(disalbe_shm); } if (has_shm) { InitMutex(); } else { InitFileLock(); } break; default: throw new NotSupportedException( String.Format( "Unknown/unsupported operating system: {0}", platform ) ); } } void InitMutex() { bool isFirstInstance; FirstInstanceMutex = new Mutex(true, Identifier, out isFirstInstance); IsFirstInstance = isFirstInstance; } #if MONO_UNIX string GetFileLockDirectory() { string lockDirRoot = null; var xdg_runtime_dir = Environment.GetEnvironmentVariable("XDG_RUNTIME_DIR"); if (!String.IsNullOrEmpty(xdg_runtime_dir)) { // XDG_RUNTIME_DIR (/run/user/$UID) is the preferred location as it // gets purged every reboot. Thus stalled file locks would // automatically go away after a reboot. lockDirRoot = xdg_runtime_dir; } else { // XDG_CACHE_HOME or ~/.cache is a good fallback if XDG_RUNTIME_DIR // is not available as other users can't write there. var xdg_cache_home = Environment.GetEnvironmentVariable("XDG_CACHE_HOME"); if (String.IsNullOrEmpty(xdg_cache_home)) { var home = Environment.GetEnvironmentVariable("HOME"); lockDirRoot = Path.Combine(home, ".cache"); } else { lockDirRoot = xdg_cache_home; } } // /tmp or /dev/shm? No, thanks! We can't use those as rendezvous point // as other users could easy break it. return Path.Combine(lockDirRoot, "SingleApplicationInstance"); } void InitFileLock() { var lockDirectory = GetFileLockDirectory(); if (!Directory.Exists(lockDirectory)) { Directory.CreateDirectory(lockDirectory); } var lockFile = Path.Combine(lockDirectory, Identifier); FirstInstanceFileInfo = new UnixFileInfo(lockFile); try { FirstInstanceFileStream = FirstInstanceFileInfo.Open( OpenFlags.O_CREAT | OpenFlags.O_EXCL, FilePermissions.S_IRWXU ); IsFirstInstance = true; } catch (Exception) { IsFirstInstance = false; } if (IsFirstInstance) { // managed shutdown AppDomain.CurrentDomain.ProcessExit += (sender, e) => { ReleaseFileLock(); }; // signal handlers UnixSignal[] shutdown_signals = { new UnixSignal(Signum.SIGINT), new UnixSignal(Signum.SIGTERM), }; UnixSignalThread = new Thread(() => { UnixSignal.WaitAny(shutdown_signals); ReleaseFileLock(); }); UnixSignalThread.IsBackground = true; UnixSignalThread.Start(); } } // this method is idempotent void ReleaseFileLock() { var lockFileInfo = FirstInstanceFileInfo; if (lockFileInfo == null) { return; } if (!IsFirstInstance) { return; } FirstInstanceFileInfo = null; if (!lockFileInfo.Exists) { return; } lockFileInfo.Delete(); } #else void InitFileLock() { throw new NotSupportedException("SingleApplicationInstance was built without MONO_UNIX support."); } #endif public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { var channel = RemotingChannel; if (channel != null) { RemotingChannel = null; ChannelServices.UnregisterChannel(channel); } var mutex = FirstInstanceMutex; if (mutex != null) { FirstInstanceMutex = null; if (IsFirstInstance && disposing) { // HACK: we are not allowed to release the mutex from a // thread that hasn't created it! Thus we only release // if Dispose() was called and not from the finalizer. mutex.ReleaseMutex(); } mutex.Close(); } #if MONO_UNIX var lockStream = FirstInstanceFileStream; if (lockStream != null) { FirstInstanceFileStream = null; lockStream.Close(); } ReleaseFileLock(); var signalThread = UnixSignalThread; if (signalThread != null) { UnixSignalThread = null; try { signalThread.Abort(); } catch { } } #endif } void ExposeFirstInstance() { RemotingServices.Marshal(FirstInstance, RemotingObjectName); RemotingChannel = new IpcChannel(Identifier); ChannelServices.RegisterChannel(RemotingChannel, false); } void ConnectToFirstInstance() { RemotingChannel = new IpcClientChannel(); ChannelServices.RegisterChannel(RemotingChannel, false); try { f_FirstInstance = (T) Activator.GetObject(typeof(T), "ipc://" + Identifier + "/" + RemotingObjectName); // HACK: we have to make a method call so we actually can tell // if the connection works or not var isAlive = f_FirstInstance.IsAlive; } catch (RemotingException ex) { #if MONO_UNIX if (FirstInstanceFileInfo == null) { // no idea what happened throw; } else { throw new RemotingException( "Remoting communication error with existing " + "application instance. Stalled file lock? (" + FirstInstanceFileInfo.FullName + ")", ex ); } #endif } } static bool IsRunningOnMono() { return Type.GetType("Mono.Runtime") != null; } } public class SingleApplicationInterface : MarshalByRefObject { public bool IsAlive { get { return true; } } } } smuxi-1.1/src/Common/Trace.cs0000644000175000017500000001672112726351313016734 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2005-2006 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Text; using System.Runtime.Remoting; using System.Reflection; using System.Collections; using System.Diagnostics; using SysTrace = System.Diagnostics.Trace; namespace Smuxi.Common { public sealed class Trace { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger("TRACE"); #else static Trace() { TextWriterTraceListener myWriter = new TextWriterTraceListener(Console.Out); SysTrace.Listeners.Add(myWriter); } #endif public static MethodBase GetMethodBase() { return new StackTrace(new StackFrame(1)).GetFrame(0).GetMethod(); } public static string GetStackTrace() { string line = null; StackTrace st = new StackTrace(); for (int i = st.FrameCount - 1; i >= 1 ; i--) { StackFrame sf = new StackFrame(); sf = st.GetFrame(i); MethodBase method = sf.GetMethod(); string methodname = method.DeclaringType + "." + method.Name; line += methodname + "()" + Environment.NewLine; } return line; } [Conditional("TRACE")] public static void CallFull(params object[] args) { MethodBase mb = new StackTrace(new StackFrame(1)).GetFrame(0).GetMethod(); string methodname = mb.DeclaringType.Name + "." + mb.Name; string line = GetStackTrace(); line += methodname + "(" + _Parameterize(mb, args) + ")"; #if LOG4NET _Logger.Debug(line); #else SysTrace.Write(line); #endif } [Conditional("TRACE")] public static void Call(params object[] args) { MethodBase mb = new StackTrace(new StackFrame(1)).GetFrame(0).GetMethod(); Call(mb, args); } [Conditional("TRACE")] public static void Call(MethodBase mb, params object[] args) { if (mb == null) { throw new ArgumentNullException("mb"); } StringBuilder line = new StringBuilder(); line.Append("["); line.Append(System.IO.Path.GetFileName(mb.DeclaringType.Assembly.Location)); line.Append("] "); line.Append(mb.DeclaringType.Name); line.Append("."); line.Append(mb.Name); line.Append("("); line.Append(_Parameterize(mb, args)); line.Append(")"); #if LOG4NET _Logger.Debug(line.ToString()); #else SysTrace.WriteLine(line.ToString()); #endif } private static string _Parameterize(MethodBase method, params object[] parameters) { ParameterInfo[] parameter_info = method.GetParameters(); if (parameter_info.Length == 0) { return String.Empty; } StringBuilder res = new StringBuilder(); for (int i = 0; i < parameter_info.Length; i++) { res.Append(parameter_info[i].Name).Append(" = "); if (parameters == null) { res.Append(_ParameterizeQuote(null)); } else if (parameters != null && parameters.Length > i) { res.Append(_ParameterizeQuote(parameters[i])); } else { // empty array res.Append("[]"); } res.Append(", "); } res.Remove(res.Length - 2, 2); return res.ToString(); } private static string _ParameterizeQuote(object obj) { if (obj == null) { return "(null)"; } // OPT: tracing over remote objects is too expensive! if (RemotingServices.IsTransparentProxy(obj)) { return obj.GetType().ToString(); } StringBuilder line = new StringBuilder(); if (obj is string) { line.Append("'").Append(obj).Append("'"); } else if (obj is ITraceable) { line.AppendFormat("<{0}>", ((ITraceable) obj).ToTraceString()); } else if (obj is IList) { line.Append("["); foreach (object val in (IList) obj) { if (val is IList || val is IDictionary) { line.Append(_ParameterizeQuote(val)); line.Append(", "); continue; } line.Append((val == null ? "(null)" : val.ToString())); line.Append(", "); } // remove last ", " if (line.Length > 1) { line.Remove(line.Length - 2, 2); } line.Append("]"); } else if (obj is IDictionary) { line.Append("{"); foreach (DictionaryEntry de in (IDictionary) obj) { if (de.Value is IList || de.Value is IDictionary) { line.Append(de.Key.ToString()); line.Append("="); line.Append(_ParameterizeQuote(de.Value)); line.Append(", "); continue; } line.Append(de.Key.ToString()); line.Append("="); line.Append((de.Value == null ? "(null)" : de.Value.ToString())); line.Append(", "); } if (line.Length > 1) { line.Remove(line.Length - 2, 2); } line.Append("}"); } else { line.Append(obj.ToString()); } return line.ToString(); } /* private static string Dump(Hashtable ht) { string line = null; line += "{"; foreach (DictionaryEntry de in (Hashtable)obj) { line += de.Key.ToString(); line += "="; line += (de.Value == null ? "(null)" : de.Value.ToString()); line += ", "; } line = line.Substring(0, line.Length - 2); line += "}"; return line; } */ } } smuxi-1.1/src/Common/Emojione.cs0000664000175000017500000000455114011467170017441 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2015 Carlos Martín Nieto // Copyright (c) 2017 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; namespace Smuxi.Common { public partial class Emojione { readonly static string BaseUri = "http://cdnjs.cloudflare.com/ajax/libs/emojione/2.2.7/assets/png/"; public static Dictionary ShortnameToUnicodeMap { get { return map; } } public static string ShortnameToUnicode(string shortName) { string val; if (map.TryGetValue(shortName, out val)) { return val; } return null; } public static string UnicodeToUrl(string unicode) { // the filename has to be lower case, otherwise it will HTTP 404 unicode = unicode.ToLowerInvariant(); return String.Format("{0}{1}.png", BaseUri, unicode); } public static string ShortnameToUri(string shortName) { var unicode = ShortnameToUnicode(shortName); if (String.IsNullOrEmpty(unicode)) { return null; } return UnicodeToUrl(unicode); } } } smuxi-1.1/src/Common/AtomFeed.cs0000644000175000017500000001021411700531610017340 0ustar00meebeymeebey00000000000000/* * Copyright (c) 2007 Carlos Martín Nieto * * This file is released under the terms of the GNU GPLv2 or later */ using System; using System.IO; using System.Text; using System.Xml.Serialization; namespace Smuxi.Common { [XmlType("feed")] public class AtomFeed { [XmlElement("link")] public AtomLink[] Link = null; [XmlElement("updated")] public DateTime UpdateTime = DateTime.MinValue; [XmlElement("modified")] public DateTime ModifyTime = DateTime.MinValue; [XmlElement("title")] public AtomText Title = null; [XmlElement("subtitle")] public string Subtitle = null; [XmlElement("author")] public AtomAuthor Author = null; [XmlElement("entry")] public AtomEntry[] Entry; private static XmlSerializer ser = new XmlSerializer(typeof(AtomFeed), "http://www.w3.org/2005/Atom"); public static AtomFeed LoadFromXml(string file) { try { FileStream fs = new FileStream(file, FileMode.Open); return (AtomFeed)ser.Deserialize(fs); } catch(FileNotFoundException){ Console.Error.WriteLine("Unable to open file"); return null; } } public static AtomFeed Load(StringReader sr) { return (AtomFeed)ser.Deserialize(sr); } public static AtomFeed Load(Stream stream) { return (AtomFeed) ser.Deserialize(stream); } public DateTime Modified { get { if(UpdateTime != DateTime.MinValue){ return UpdateTime; } else { return ModifyTime; } } } public DateTime Updated { get { return Modified; } } public AtomLink LinkByType(string type) { foreach(AtomLink link in Link){ if(link.Type == type){ return link; } } return null; } } [XmlType("author")] public class AtomAuthor { [XmlElement("name")] public string Name; [XmlElement("email")] public string Email; } [XmlType("link")] public class AtomLink { [XmlAttribute("href")] public string Url = null; [XmlAttribute("rel")] public string Rel = null; [XmlAttribute("type")] public string Type = null; } [XmlType("entry")] public class AtomEntry { [XmlElement("link")] public AtomLink[] Link = null; [XmlElement("published")] public DateTime Published; [XmlElement("updated")] public DateTime UpdateTime = DateTime.MinValue; [XmlElement("modified")] public DateTime ModifyTime = DateTime.MinValue; [XmlElement("title")] public AtomText Title; [XmlElement("author")] public AtomAuthor Author = null; [XmlElement("id")] public string Id; [XmlElement("content")] public AtomText[] Content; [XmlElement("summary")] public AtomText Summary; public DateTime Modified { get { if(UpdateTime != DateTime.MinValue){ return UpdateTime; } else { return ModifyTime; } } } public DateTime Updated { get { return Modified; } } public AtomLink LinkByType(string type) { foreach(AtomLink link in Link){ if(link.Type == type){ return link; } } return null; } public AtomText ContentByType(string type) { foreach(AtomText text in Content){ if(text.Type == type){ return text; } } return null; } } public class AtomText { [XmlText] public string Text = null; [XmlAttribute("type")] public string Type = null; } } smuxi-1.1/src/Common/Defines.cs0000664000175000017500000000453214011526477017256 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2008 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Smuxi.Common { public static class Defines { public const string GitBranch = "release/1.1"; public const string GitCommitHash = "b0476480"; private static readonly string f_InstallPrefix = "/usr/local"; private static readonly string f_DistVersion = "release/1.1/b0476480"; private static readonly string f_TwitterApiKey = "60QV2qQx9cS7y1BJDbgAA|2VgD6qQKddsF5HYQ0TrRgs3tFTnCwDONBmRlTmG658"; public static string InstallPrefix { get { return f_InstallPrefix; } } public static string TwitterApiKey { get { return f_TwitterApiKey; } } public static string GitVersion { get { if (String.IsNullOrEmpty(GitBranch) || String.IsNullOrEmpty(GitCommitHash)) { return String.Empty; } return String.Format("{0}/{1}", GitBranch, GitCommitHash); } } public static string DistVersion { get { return f_DistVersion; } } } } smuxi-1.1/src/Common/Pattern.cs0000644000175000017500000000622212726351313017306 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2010 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Text.RegularExpressions; namespace Smuxi.Common { public static class Pattern { public static bool IsMatch(string input, string pattern) { if (input == null) { throw new ArgumentNullException("input"); } if (pattern == null) { throw new ArgumentNullException("pattern"); } // regex matching if (pattern.StartsWith("/") && pattern.EndsWith("/")) { var regexPattern = pattern.Substring(1, pattern.Length - 2); return Regex.IsMatch(input, regexPattern); } // globbing if (pattern.Length == 0 && input.Length == 0) { return true; } if (pattern == "*") { return true; } if (pattern.StartsWith("*") && pattern.EndsWith("*")) { string globPattern = pattern.Substring(1, pattern.Length - 2); return input.Contains(globPattern); } if (pattern.StartsWith("*")) { string globPattern = pattern.Substring(1); return input.EndsWith(globPattern); } if (pattern.EndsWith("*")) { string globPattern = pattern.Substring(0, pattern.Length - 1); return input.StartsWith(globPattern); } // exact matching return input == pattern; } public static bool ContainsPatternCharacters(string input) { if (input == null) { throw new ArgumentNullException("input"); } if (input.Length == 0) { return false; } return input.StartsWith("*") || input.EndsWith("*") || (input.Length >= 2 && input.StartsWith("/") && input.EndsWith("/")); } } } smuxi-1.1/src/Common/AssemblyInfo.cs0000644000175000017500000000235511700531610020256 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - common library")] [assembly: AssemblyCopyright("2005-2011 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Common/Crc32.cs0000644000175000017500000001453512726351313016553 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2009. Tom Kaminski // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Security.Cryptography; namespace Smuxi.Common { public class Crc32 : HashAlgorithm { public const uint DefaultSeed = 0xffffffff; readonly static uint[] CrcTable = new uint[] { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; uint crcValue = 0; public override void Initialize() { crcValue = 0; } protected override void HashCore(byte[] buffer, int start, int length) { crcValue ^= DefaultSeed; unchecked { while (--length >= 0) { crcValue = CrcTable[(crcValue ^ buffer[start++]) & 0xFF] ^ (crcValue >> 8); } } crcValue ^= DefaultSeed; } protected override byte[] HashFinal() { this.HashValue = new byte[] { (byte)((crcValue >> 24) & 0xff), (byte)((crcValue >> 16) & 0xff), (byte)((crcValue >> 8) & 0xff), (byte)(crcValue & 0xff) }; return this.HashValue; } public uint CrcValue { get { return (uint)(((uint)HashValue[0] << 24) | (HashValue[1] << 16) | (HashValue[2] << 8) | HashValue[3]); } } public override int HashSize { get { return 32; } } } } smuxi-1.1/src/Common/TaskQueue.cs0000644000175000017500000001662112726351313017604 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2008 Alan McGovern // Copyright (c) 2008 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace Smuxi.Common { public delegate object TaskQueueJobHandler(); public delegate void TaskQueueTaskHandler(); public delegate bool TaskQueueTimeoutHandler(); public delegate void TaskQueueExceptionEventHandler(object sender, TaskQueueExceptionEventArgs e); public class TaskQueueExceptionEventArgs : EventArgs { Exception f_Exception; public Exception Exception { get { return f_Exception; } } public TaskQueueExceptionEventArgs(Exception ex) { f_Exception = ex; } } public class TaskQueue : IDisposable { private class DelegateTask { private ManualResetEvent handle; private object result; private TaskQueueJobHandler task; private Exception exception; public ManualResetEvent Handle { get { return handle; } set { handle = value; } } public object Result { get { return result; } } public Exception Exception { get { return exception; } } public DelegateTask(TaskQueueJobHandler task) { this.task = task; } public void Execute() { try { result = task(); } catch (Exception ex) { exception = ex; } if (handle != null) handle.Set(); } } bool disposed; AutoResetEvent handle = new AutoResetEvent(false); Queue tasks = new Queue(); Thread thread; string name; public TaskQueueExceptionEventHandler ExceptionEvent; public EventHandler AbortedEvent; public bool Disposed { get { return disposed; } } public TaskQueue(string name) { this.name = name; InitThread(); } ~TaskQueue() { Dispose(false); } void InitThread() { thread = new Thread(new ThreadStart(Loop)); thread.Name = name; thread.IsBackground = true; thread.Start(); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (disposed) return; disposed = true; // make sure the thread will notice the disposed state when // disposing or finalizing this object handle.Set(); } void Loop() { while (true) { DelegateTask task = null; lock (tasks) { if (tasks.Count > 0) task = tasks.Dequeue(); } if (task == null) { if (disposed) break; #if DISABLED // WARNING: if we are being disposed at _this_ point, there // are no new tasks added and we are waiting forever, then // we would leak this thread! The dispose check + break will // never happen, so we have to use a sane timeout here. // Checking every 60 seconds if we are disposed should be // reasonable. handle.WaitOne(60 * 1000); #endif // OPT: let Dispose() trigger the handle, but is this safe? handle.WaitOne(); } else { task.Execute(); if (task.Exception != null) { if (ExceptionEvent != null) { ExceptionEvent(this, new TaskQueueExceptionEventArgs(task.Exception)); } break; } } } if (AbortedEvent != null) { AbortedEvent(this, EventArgs.Empty); } } private void Queue(DelegateTask task) { lock (tasks) { tasks.Enqueue(task); handle.Set(); } } public void Queue(TaskQueueTaskHandler task) { Queue(new DelegateTask(delegate { task(); return null; })); } public void QueueWait(TaskQueueTaskHandler task) { QueueWait(delegate { task(); return null; }); } public object QueueWait(TaskQueueJobHandler task) { return QueueWait(new DelegateTask(task)); } private object QueueWait(DelegateTask t) { if (t.Handle != null) t.Handle.Reset(); else t.Handle = new ManualResetEvent(false); if (Thread.CurrentThread == thread) t.Execute(); else Queue(t); t.Handle.WaitOne(); t.Handle.Close(); return t.Result; } public void Reset(bool abortActiveTask) { if (abortActiveTask) { thread.Abort(); InitThread(); } lock (tasks) { tasks.Clear(); } } public void Reset() { Reset(false); } } } smuxi-1.1/src/Common/smuxi-common.pc.in0000644000175000017500000000017411655545675020746 0ustar00meebeymeebey00000000000000Name: smuxi-common Description: Common Version: @VERSION@ Requires: Libs: -r:@expanded_libdir@/@PACKAGE@/smuxi-common.dll smuxi-1.1/src/Common/MD5.cs0000644000175000017500000000341012726351313016252 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2005-2006 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Text; using System.Security.Cryptography; namespace Smuxi.Common { public class MD5 { public static string FromString(string cleartext) { MD5CryptoServiceProvider csp = new MD5CryptoServiceProvider(); byte[] md5bytes = csp.ComputeHash(Encoding.UTF8.GetBytes(cleartext)); StringBuilder md5text = new StringBuilder(); foreach (byte md5byte in md5bytes) { md5text.Append(md5byte.ToString("x2").ToLower()); } return md5text.ToString(); } } } smuxi-1.1/src/Common/SpecialFolderPatternConverter.cs0000644000175000017500000000322512726351313023633 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2012 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; #if LOG4NET namespace Smuxi.Common { public class SpecialFolderPatternConverter : log4net.Util.PatternConverter { protected override void Convert(TextWriter writer, object state) { var specialFolder = (Environment.SpecialFolder) Enum.Parse( typeof(Environment.SpecialFolder), Option, true ); writer.Write(Environment.GetFolderPath(specialFolder)); } } } #endifsmuxi-1.1/src/Common/Makefile.am0000664000175000017500000000610114011472672017375 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ "-define:NET_2_0,NDESK_OPTIONS,MONO_UNIX" ASSEMBLY = ../../bin/release/smuxi-common.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = ../../bin/release endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -debug -optimize+ "-define:DEBUG,TRACE,LOG4NET,NET_2_0,NDESK_OPTIONS,MONO_UNIX" ASSEMBLY = ../../bin/debug/smuxi-common.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = ../../bin/debug SMUXI_COMMON_DLL=$(ASSEMBLY) SMUXI_COMMON_DLL_SOURCE=$(ASSEMBLY) SMUXI_COMMON_DLL_MDB=$(ASSEMBLY_MDB) SMUXI_COMMON_DLL_MDB_SOURCE=$(ASSEMBLY_MDB) endif if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = LINUX_PKGCONFIG = \ $(COMMON_PC) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ AtomFeed.cs \ Crc32.cs \ Emojione.cs \ GeneratedEmojione.cs \ IconCache.cs \ IOSecurity.cs \ ITraceable.cs \ Trace.cs \ MD5.cs \ FastSerializer.cs \ LibraryCatalog.cs \ NDesk.Options.cs \ Defines.cs \ SpecialFolderPatternConverter.cs \ SingleApplicationInstance.cs \ TaskQueue.cs \ ThreadPoolQueue.cs \ Platform.cs \ RateLimiter.cs \ Pattern.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-common.pc.in REFERENCES = \ System \ System.Core \ System.Runtime.Remoting \ System.Xml \ Mono.Posix DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) include $(top_srcdir)/Makefile.include LOG4NET_DLL = $(BUILD_DIR)/log4net.dll COMMON_PC = $(BUILD_DIR)/smuxi-common.pc $(eval $(call emit-deploy-wrapper,COMMON_PC,smuxi-common.pc)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL_MDB)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) generate-emojione: wget -O $(top_srcdir)/lib/emoji_raw.json https://raw.githubusercontent.com/emojione/emojione/2.2.7/emoji.json json_pp < $(top_srcdir)/lib/emoji_raw.json > $(top_srcdir)/lib/emoji.json $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -r:System -r:System.Core -r:$(BUILD_DIR)/Newtonsoft.Json.dll -out:$(BUILD_DIR)/GenerateEmoji.exe -target:exe GenerateEmojione.cs mono --debug $(BUILD_DIR)/GenerateEmoji.exe $(top_srcdir)/lib/emoji.json GeneratedEmojione.cs smuxi-1.1/src/Common/IOSecurity.cs0000644000175000017500000000721112726351313017727 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2011 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; namespace Smuxi.Common { public static class IOSecurity { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static string GetFilteredPath(string path) { if (path == null) { throw new ArgumentNullException("path"); } if (path.Trim().Length == 0) { throw new ArgumentException("Argument must not be empty.", "path"); } if (path.IndexOfAny(Path.GetInvalidPathChars()) != -1) { #if LOG4NET f_Logger.Debug( "GetFilteredPath(): path: '" + path + "' contains invalid chars, removing them!" ); #endif // remove invalid chars foreach (char invalidChar in Path.GetInvalidPathChars()) { path = path.Replace(invalidChar.ToString(), String.Empty); } } return path; } public static string GetFilteredFileName(string fileName) { return GetFilteredFileName(fileName, true); } public static string GetFilteredFileName(string fileName, bool filterSpaces) { if (fileName == null) { throw new ArgumentNullException("fileName"); } if (fileName.Trim().Length == 0) { throw new ArgumentException("Argument must not be empty.", "fileName"); } if (filterSpaces) { fileName = fileName.Replace(" ", "_"); } if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) != -1) { #if LOG4NET f_Logger.Debug( "GetValidFilename(): filename: '" + fileName + "' contains " + "invalid chars, removing them!" ); #endif // remove invalid chars foreach (char invalidChar in Path.GetInvalidFileNameChars()) { fileName = fileName.Replace(invalidChar.ToString(), String.Empty); } } fileName = fileName.Replace("..", String.Empty); return fileName; } } } smuxi-1.1/src/Common/Defines.cs.in0000644000175000017500000000445512726351313017661 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2008 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Smuxi.Common { public static class Defines { public const string GitBranch = "@git_branch@"; public const string GitCommitHash = "@git_commit_hash@"; private static readonly string f_InstallPrefix = "@prefix@"; private static readonly string f_DistVersion = "@dist_version@"; private static readonly string f_TwitterApiKey = "@twitter_api_key@"; public static string InstallPrefix { get { return f_InstallPrefix; } } public static string TwitterApiKey { get { return f_TwitterApiKey; } } public static string GitVersion { get { if (String.IsNullOrEmpty(GitBranch) || String.IsNullOrEmpty(GitCommitHash)) { return String.Empty; } return String.Format("{0}/{1}", GitBranch, GitCommitHash); } } public static string DistVersion { get { return f_DistVersion; } } } } smuxi-1.1/src/Common/FastSerializer.cs0000644000175000017500000003741312726351313020626 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2007 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // FastSerializer.cs. Provides SerializationWriter and SerializationReader classes to help high speed serialization. // This short example shows how they're used: // // [Serializable] // public class TestObject : ISerializable { // Class must be ISerializable // public long x; // public string y; // // public void GetObjectData (SerializationInfo info, StreamingContext ctxt) { // Serialization method // SerializationWriter sw = SerializationWriter.GetWriter (); // Get a Writer // sw.Write(x); // Write fields // sw.Write(y); // ditto // sw.AddToInfo (info); // Add the Writer to info // } // // public TestObject (SerializationInfo info, StreamingContext ctxt) { // Deserialization .ctor // SerializationReader sr = SerializationReader.GetReader (info); // Get a Reader from info // x = sr.ReadInt64 (); // Read a field // y = sr.ReadInt64 (); // ditto // } // // } // // Author: Tim Haynes, May 2006. Use freely as you see fit. // Author: Mirco Bauer , Aug 2007. // Added .NET 1.1 support // Added BinaryFormatter optimization // Using "is" operator instead of switch on GetType() string. // Author: Mirco Bauer , Sep 2007 // Applied smuxi Coding-Standards using System; using System.IO; using System.Reflection; using System.Collections; #if NET_2_0 using System.Collections.Generic; #endif using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace Smuxi.Common { // Enum for the standard types handled by Read/WriteObject() internal enum ObjType : byte { Null = 0, Boolean, Byte, UInt16, UInt32, UInt64, SByte, Int16, Int32, Int64, Char, String, Single, Double, Decimal, DateTime, ByteArray, CharArray, Unknown } /// SerializationWriter. Extends BinaryWriter to add additional data types, /// handle null strings and simplify use with ISerializable. public class SerializationWriter : BinaryWriter { private static BinaryFormatter _BinaryFormatter = new BinaryFormatter(); private SerializationWriter(Stream s) : base(s) { } /// Static method to initialise the writer with a suitable MemoryStream. public static SerializationWriter GetWriter() { MemoryStream ms = new MemoryStream(1024); return new SerializationWriter(ms); } internal void Write(ObjType type) { Write((byte) type); } /// Writes a string to the buffer. Overrides the base implementation so it can cope with nulls public override void Write(string str) { if (str == null) { Write(ObjType.Null); return; } Write(ObjType.String); base.Write(str); } /// Writes a byte array to the buffer. Overrides the base implementation to /// send the length of the array which is needed when it is retrieved public override void Write(byte[] b) { WriteBytes(b); } public void WriteBytes(byte[] b) { if (b==null) { Write(-1); } else { int len = b.Length; Write(len); if (len>0) base.Write(b); } } /// Writes a char array to the buffer. Overrides the base implementation to /// sends the length of the array which is needed when it is read. public override void Write(char[] c) { if (c==null) { Write(-1); } else { int len = c.Length; Write(len); if (len>0) base.Write(c); } } /// Writes a DateTime to the buffer. public void Write(DateTime dt) { Write(dt.Ticks); } public void Write(ICollection c) { if (c == null) { Write(-1); return; } Write(c.Count); foreach (Object item in c) { WriteObject(item); } } public void Write(IDictionary d) { if (d == null) { Write(-1); return; } Write(d.Count); foreach (DictionaryEntry de in d) { WriteObject(de.Key); WriteObject(de.Value); } } #if NET_2_0 /// Writes a generic ICollection (such as an IList) to the buffer. public void Write (ICollection c) { if (c==null) { Write(-1); } else { Write(c.Count); foreach (T item in c) WriteObject (item); } } /// Writes a generic IDictionary to the buffer. public void Write (IDictionary d) { if (d==null) { Write(-1); } else { Write(d.Count); foreach (KeyValuePair kvp in d) { WriteObject (kvp.Key); WriteObject (kvp.Value); } } } #endif /// Writes an arbitrary object to the buffer. Useful where we have something of type "object" /// and don't know how to treat it. This works out the best method to use to write to the buffer. public void WriteObject(object obj) { if (obj == null) { Write(ObjType.Null); return; } if (obj is Boolean) { Write(ObjType.Boolean); Write((Boolean) obj); } else if (obj is Byte) { Write(ObjType.Byte); Write((Byte) obj); } else if (obj is UInt16) { Write(ObjType.UInt16); Write((ushort) obj); } else if (obj is UInt32) { Write(ObjType.UInt32); Write((uint) obj); } else if (obj is UInt64) { Write(ObjType.UInt64); Write((ulong) obj); } else if (obj is SByte) { Write(ObjType.SByte); Write((sbyte) obj); } else if (obj is Int16) { Write(ObjType.Int16); Write((short) obj); } else if (obj is Int32) { Write(ObjType.Int32); Write((int) obj); } else if (obj is Int64) { Write(ObjType.Int64); Write((long) obj); } else if (obj is Char) { Write(ObjType.Char); base.Write((char) obj); } else if (obj is String) { Write(ObjType.String); base.Write((string) obj); } else if (obj is Single) { Write(ObjType.Single); Write((float) obj); } else if (obj is Double) { Write(ObjType.Double); Write((double) obj); } else if (obj is Decimal) { Write(ObjType.Decimal); Write((decimal) obj); } else if (obj is DateTime) { Write(ObjType.DateTime); Write((DateTime) obj); } else if (obj is Byte[]) { Write(ObjType.ByteArray); base.Write((byte[]) obj); } else if (obj is Char[]) { Write(ObjType.CharArray); base.Write((char[]) obj); } else { Write(ObjType.Unknown); _BinaryFormatter.Serialize(BaseStream, obj); } } /// Adds the SerializationWriter buffer to the SerializationInfo at the end of GetObjectData(). public void AddToInfo(SerializationInfo info) { var b = GetData(); info.AddValue("X", b, typeof(byte[])); } public byte[] GetData() { return ((MemoryStream) BaseStream).ToArray(); } } /// SerializationReader. Extends BinaryReader to add additional data types, /// handle null strings and simplify use with ISerializable. public class SerializationReader : BinaryReader { private static BinaryFormatter _BinaryFormatter = new BinaryFormatter(); protected SerializationReader(Stream s) : base(s) { } internal ObjType ReadObjType() { return (ObjType) ReadByte(); } /// Static method to take a SerializationInfo object (an input to an ISerializable constructor) /// and produce a SerializationReader from which serialized objects can be read . public static SerializationReader GetReader(SerializationInfo info) { byte[] byteArray = (byte[]) info.GetValue("X", typeof(byte[])); MemoryStream ms = new MemoryStream(byteArray); return new SerializationReader(ms); } public static SerializationReader GetReader(byte[] data) { MemoryStream ms = new MemoryStream(data); return new SerializationReader(ms); } /// Reads a string from the buffer. Overrides the base implementation so it can cope with nulls. public override string ReadString() { ObjType t = ReadObjType(); if (t == ObjType.Null) { return null; } if (t == ObjType.String) { return base.ReadString(); } throw new SerializationException(); } /// Reads a byte array from the buffer, handling nulls and the array length. public byte[] ReadByteArray () { int len = ReadInt32 (); if (len>0) return ReadBytes (len); if (len<0) return null; return new byte[0]; } /// Reads a char array from the buffer, handling nulls and the array length. public char[] ReadCharArray () { int len = ReadInt32 (); if (len>0) return ReadChars (len); if (len<0) return null; return new char[0]; } /// Reads a DateTime from the buffer. public DateTime ReadDateTime() { return new DateTime(ReadInt64(), DateTimeKind.Utc); } public IList ReadList() { int count = ReadInt32(); if (count < 0) { return null; } IList list = new ArrayList(count); for (int i = 0; i < count; i++) { list.Add(ReadObject()); } return list; } public IDictionary ReadDictionary() { int count = ReadInt32(); if (count < 0) { return null; } // BUG: if the dictionary was not a hashtable or custom comparer were // used, we might get problems IDictionary dict = new Hashtable(count); for (int i = 0; i < count; i++) { dict.Add(ReadObject(), ReadObject()); } return dict; } #if NET_2_0 /// Reads a generic list from the buffer. public IList ReadList() { int count = ReadInt32(); if (count < 0) { return null; } IList list = new List(count); for (int i = 0; i Reads a generic Dictionary from the buffer. public IDictionary ReadDictionary() { int count = ReadInt32(); if (count < 0) { return null; } // BUG: if the dictionary was not a Dictionary or custom comparer were // used, we might get problems IDictionary dict = new Dictionary(count); for (int i = 0; i Reads an object which was added to the buffer by WriteObject. public object ReadObject() { ObjType t = (ObjType) ReadByte(); switch (t) { case ObjType.Null: return null; case ObjType.Boolean: return ReadBoolean(); case ObjType.Byte: return ReadByte(); case ObjType.UInt16: return ReadUInt16(); case ObjType.UInt32: return ReadUInt32(); case ObjType.UInt64: return ReadUInt64(); case ObjType.SByte: return ReadSByte(); case ObjType.Int16: return ReadInt16(); case ObjType.Int32: return ReadInt32(); case ObjType.Int64: return ReadInt64(); case ObjType.Char: return ReadChar(); case ObjType.String: return base.ReadString(); case ObjType.Single: return ReadSingle(); case ObjType.Double: return ReadDouble(); case ObjType.Decimal: return ReadDecimal(); case ObjType.DateTime: return ReadDateTime(); case ObjType.ByteArray: return ReadByteArray(); case ObjType.CharArray: return ReadCharArray(); case ObjType.Unknown: return _BinaryFormatter.Deserialize(BaseStream); default: throw new SerializationException(); } } } } smuxi-1.1/src/Common/Makefile.in0000664000175000017500000010203014011526471017401 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Common ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = Defines.cs smuxi-common.pc 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Defines.cs.in $(srcdir)/Makefile.in \ $(srcdir)/smuxi-common.pc.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -debug -optimize+ "-define:DEBUG,TRACE,LOG4NET,NET_2_0,NDESK_OPTIONS,MONO_UNIX" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ "-define:NET_2_0,NDESK_OPTIONS,MONO_UNIX" @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = library @ENABLE_RELEASE_TRUE@COMPILE_TARGET = library @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL = $(ASSEMBLY) @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = $(ASSEMBLY) @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_MDB = $(ASSEMBLY_MDB) @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_MDB_SOURCE = $(ASSEMBLY_MDB) @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = LINUX_PKGCONFIG = \ $(COMMON_PC) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ AtomFeed.cs \ Crc32.cs \ Emojione.cs \ GeneratedEmojione.cs \ IconCache.cs \ IOSecurity.cs \ ITraceable.cs \ Trace.cs \ MD5.cs \ FastSerializer.cs \ LibraryCatalog.cs \ NDesk.Options.cs \ Defines.cs \ SpecialFolderPatternConverter.cs \ SingleApplicationInstance.cs \ TaskQueue.cs \ ThreadPoolQueue.cs \ Platform.cs \ RateLimiter.cs \ Pattern.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-common.pc.in REFERENCES = \ System \ System.Core \ System.Runtime.Remoting \ System.Xml \ Mono.Posix DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) LOG4NET_DLL = $(BUILD_DIR)/log4net.dll COMMON_PC = $(BUILD_DIR)/smuxi-common.pc all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Common/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Common/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Defines.cs: $(top_builddir)/config.status $(srcdir)/Defines.cs.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ smuxi-common.pc: $(top_builddir)/config.status $(srcdir)/smuxi-common.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-wrapper,COMMON_PC,smuxi-common.pc)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL_MDB)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) generate-emojione: wget -O $(top_srcdir)/lib/emoji_raw.json https://raw.githubusercontent.com/emojione/emojione/2.2.7/emoji.json json_pp < $(top_srcdir)/lib/emoji_raw.json > $(top_srcdir)/lib/emoji.json $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -r:System -r:System.Core -r:$(BUILD_DIR)/Newtonsoft.Json.dll -out:$(BUILD_DIR)/GenerateEmoji.exe -target:exe GenerateEmojione.cs mono --debug $(BUILD_DIR)/GenerateEmoji.exe $(top_srcdir)/lib/emoji.json GeneratedEmojione.cs # 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: smuxi-1.1/src/Common/GeneratedEmojione.cs0000664000175000017500000021461614011467170021265 0ustar00meebeymeebey00000000000000 // This file is autogenerated using System; using System.Collections.Generic; namespace Smuxi.Common { public partial class Emojione { static readonly Dictionary map = new Dictionary () { { "100", "1F4AF" }, { "1234", "1F522" }, { "8ball", "1F3B1" }, { "a", "1F170" }, { "ab", "1F18E" }, { "abc", "1F524" }, { "abcd", "1F521" }, { "accept", "1F251" }, { "aerial_tramway", "1F6A1" }, { "airplane", "2708" }, { "airplane_arriving", "1F6EC" }, { "airplane_departure", "1F6EB" }, { "airplane_small", "1F6E9" }, { "small_airplane", "1F6E9" }, { "alarm_clock", "23F0" }, { "alembic", "2697" }, { "alien", "1F47D" }, { "ambulance", "1F691" }, { "amphora", "1F3FA" }, { "anchor", "2693" }, { "angel", "1F47C" }, { "angel_tone1", "1F47C-1F3FB" }, { "angel_tone2", "1F47C-1F3FC" }, { "angel_tone3", "1F47C-1F3FD" }, { "angel_tone4", "1F47C-1F3FE" }, { "angel_tone5", "1F47C-1F3FF" }, { "anger", "1F4A2" }, { "anger_right", "1F5EF" }, { "right_anger_bubble", "1F5EF" }, { "angry", "1F620" }, { "anguished", "1F627" }, { "ant", "1F41C" }, { "apple", "1F34E" }, { "aquarius", "2652" }, { "aries", "2648" }, { "arrow_backward", "25C0" }, { "arrow_double_down", "23EC" }, { "arrow_double_up", "23EB" }, { "arrow_down", "2B07" }, { "arrow_down_small", "1F53D" }, { "arrow_forward", "25B6" }, { "arrow_heading_down", "2935" }, { "arrow_heading_up", "2934" }, { "arrow_left", "2B05" }, { "arrow_lower_left", "2199" }, { "arrow_lower_right", "2198" }, { "arrow_right", "27A1" }, { "arrow_right_hook", "21AA" }, { "arrow_up", "2B06" }, { "arrow_up_down", "2195" }, { "arrow_up_small", "1F53C" }, { "arrow_upper_left", "2196" }, { "arrow_upper_right", "2197" }, { "arrows_clockwise", "1F503" }, { "arrows_counterclockwise", "1F504" }, { "art", "1F3A8" }, { "articulated_lorry", "1F69B" }, { "asterisk", "002A-20E3" }, { "keycap_asterisk", "002A-20E3" }, { "astonished", "1F632" }, { "athletic_shoe", "1F45F" }, { "atm", "1F3E7" }, { "atom", "269B" }, { "atom_symbol", "269B" }, { "avocado", "1F951" }, { "b", "1F171" }, { "baby", "1F476" }, { "baby_bottle", "1F37C" }, { "baby_chick", "1F424" }, { "baby_symbol", "1F6BC" }, { "baby_tone1", "1F476-1F3FB" }, { "baby_tone2", "1F476-1F3FC" }, { "baby_tone3", "1F476-1F3FD" }, { "baby_tone4", "1F476-1F3FE" }, { "baby_tone5", "1F476-1F3FF" }, { "back", "1F519" }, { "bacon", "1F953" }, { "badminton", "1F3F8" }, { "baggage_claim", "1F6C4" }, { "balloon", "1F388" }, { "ballot_box", "1F5F3" }, { "ballot_box_with_ballot", "1F5F3" }, { "ballot_box_with_check", "2611" }, { "bamboo", "1F38D" }, { "banana", "1F34C" }, { "bangbang", "203C" }, { "bank", "1F3E6" }, { "bar_chart", "1F4CA" }, { "barber", "1F488" }, { "baseball", "26BE" }, { "basketball", "1F3C0" }, { "basketball_player", "26F9" }, { "person_with_ball", "26F9" }, { "basketball_player_tone1", "26F9-1F3FB" }, { "person_with_ball_tone1", "26F9-1F3FB" }, { "basketball_player_tone2", "26F9-1F3FC" }, { "person_with_ball_tone2", "26F9-1F3FC" }, { "basketball_player_tone3", "26F9-1F3FD" }, { "person_with_ball_tone3", "26F9-1F3FD" }, { "basketball_player_tone4", "26F9-1F3FE" }, { "person_with_ball_tone4", "26F9-1F3FE" }, { "basketball_player_tone5", "26F9-1F3FF" }, { "person_with_ball_tone5", "26F9-1F3FF" }, { "bat", "1F987" }, { "bath", "1F6C0" }, { "bath_tone1", "1F6C0-1F3FB" }, { "bath_tone2", "1F6C0-1F3FC" }, { "bath_tone3", "1F6C0-1F3FD" }, { "bath_tone4", "1F6C0-1F3FE" }, { "bath_tone5", "1F6C0-1F3FF" }, { "bathtub", "1F6C1" }, { "battery", "1F50B" }, { "beach", "1F3D6" }, { "beach_with_umbrella", "1F3D6" }, { "beach_umbrella", "26F1" }, { "umbrella_on_ground", "26F1" }, { "bear", "1F43B" }, { "bed", "1F6CF" }, { "bee", "1F41D" }, { "beer", "1F37A" }, { "beers", "1F37B" }, { "beetle", "1F41E" }, { "beginner", "1F530" }, { "bell", "1F514" }, { "bellhop", "1F6CE" }, { "bellhop_bell", "1F6CE" }, { "bento", "1F371" }, { "bicyclist", "1F6B4" }, { "bicyclist_tone1", "1F6B4-1F3FB" }, { "bicyclist_tone2", "1F6B4-1F3FC" }, { "bicyclist_tone3", "1F6B4-1F3FD" }, { "bicyclist_tone4", "1F6B4-1F3FE" }, { "bicyclist_tone5", "1F6B4-1F3FF" }, { "bike", "1F6B2" }, { "bikini", "1F459" }, { "biohazard", "2623" }, { "biohazard_sign", "2623" }, { "bird", "1F426" }, { "birthday", "1F382" }, { "black_circle", "26AB" }, { "black_heart", "1F5A4" }, { "black_joker", "1F0CF" }, { "black_large_square", "2B1B" }, { "black_medium_small_square", "25FE" }, { "black_medium_square", "25FC" }, { "black_nib", "2712" }, { "black_small_square", "25AA" }, { "black_square_button", "1F532" }, { "blossom", "1F33C" }, { "blowfish", "1F421" }, { "blue_book", "1F4D8" }, { "blue_car", "1F699" }, { "blue_circle", "1F535" }, { "blue_heart", "1F499" }, { "blush", "1F60A" }, { "boar", "1F417" }, { "bomb", "1F4A3" }, { "book", "1F4D6" }, { "bookmark", "1F516" }, { "bookmark_tabs", "1F4D1" }, { "books", "1F4DA" }, { "boom", "1F4A5" }, { "boot", "1F462" }, { "bouquet", "1F490" }, { "bow", "1F647" }, { "bow_and_arrow", "1F3F9" }, { "archery", "1F3F9" }, { "bow_tone1", "1F647-1F3FB" }, { "bow_tone2", "1F647-1F3FC" }, { "bow_tone3", "1F647-1F3FD" }, { "bow_tone4", "1F647-1F3FE" }, { "bow_tone5", "1F647-1F3FF" }, { "bowling", "1F3B3" }, { "boxing_glove", "1F94A" }, { "boxing_gloves", "1F94A" }, { "boy", "1F466" }, { "boy_tone1", "1F466-1F3FB" }, { "boy_tone2", "1F466-1F3FC" }, { "boy_tone3", "1F466-1F3FD" }, { "boy_tone4", "1F466-1F3FE" }, { "boy_tone5", "1F466-1F3FF" }, { "bread", "1F35E" }, { "bride_with_veil", "1F470" }, { "bride_with_veil_tone1", "1F470-1F3FB" }, { "bride_with_veil_tone2", "1F470-1F3FC" }, { "bride_with_veil_tone3", "1F470-1F3FD" }, { "bride_with_veil_tone4", "1F470-1F3FE" }, { "bride_with_veil_tone5", "1F470-1F3FF" }, { "bridge_at_night", "1F309" }, { "briefcase", "1F4BC" }, { "broken_heart", "1F494" }, { "bug", "1F41B" }, { "bulb", "1F4A1" }, { "bullettrain_front", "1F685" }, { "bullettrain_side", "1F684" }, { "burrito", "1F32F" }, { "bus", "1F68C" }, { "busstop", "1F68F" }, { "bust_in_silhouette", "1F464" }, { "busts_in_silhouette", "1F465" }, { "butterfly", "1F98B" }, { "cactus", "1F335" }, { "cake", "1F370" }, { "calendar", "1F4C6" }, { "calendar_spiral", "1F5D3" }, { "spiral_calendar_pad", "1F5D3" }, { "call_me", "1F919" }, { "call_me_hand", "1F919" }, { "call_me_tone1", "1F919-1F3FB" }, { "call_me_hand_tone1", "1F919-1F3FB" }, { "call_me_tone2", "1F919-1F3FC" }, { "call_me_hand_tone2", "1F919-1F3FC" }, { "call_me_tone3", "1F919-1F3FD" }, { "call_me_hand_tone3", "1F919-1F3FD" }, { "call_me_tone4", "1F919-1F3FE" }, { "call_me_hand_tone4", "1F919-1F3FE" }, { "call_me_tone5", "1F919-1F3FF" }, { "call_me_hand_tone5", "1F919-1F3FF" }, { "calling", "1F4F2" }, { "camel", "1F42B" }, { "camera", "1F4F7" }, { "camera_with_flash", "1F4F8" }, { "camping", "1F3D5" }, { "cancer", "264B" }, { "candle", "1F56F" }, { "candy", "1F36C" }, { "canoe", "1F6F6" }, { "kayak", "1F6F6" }, { "capital_abcd", "1F520" }, { "capricorn", "2651" }, { "card_box", "1F5C3" }, { "card_file_box", "1F5C3" }, { "card_index", "1F4C7" }, { "carousel_horse", "1F3A0" }, { "carrot", "1F955" }, { "cartwheel", "1F938" }, { "person_doing_cartwheel", "1F938" }, { "cartwheel_tone1", "1F938-1F3FB" }, { "person_doing_cartwheel_tone1", "1F938-1F3FB" }, { "cartwheel_tone2", "1F938-1F3FC" }, { "person_doing_cartwheel_tone2", "1F938-1F3FC" }, { "cartwheel_tone3", "1F938-1F3FD" }, { "person_doing_cartwheel_tone3", "1F938-1F3FD" }, { "cartwheel_tone4", "1F938-1F3FE" }, { "person_doing_cartwheel_tone4", "1F938-1F3FE" }, { "cartwheel_tone5", "1F938-1F3FF" }, { "person_doing_cartwheel_tone5", "1F938-1F3FF" }, { "cat", "1F431" }, { "cat2", "1F408" }, { "cd", "1F4BF" }, { "chains", "26D3" }, { "champagne", "1F37E" }, { "bottle_with_popping_cork", "1F37E" }, { "champagne_glass", "1F942" }, { "clinking_glass", "1F942" }, { "chart", "1F4B9" }, { "chart_with_downwards_trend", "1F4C9" }, { "chart_with_upwards_trend", "1F4C8" }, { "checkered_flag", "1F3C1" }, { "cheese", "1F9C0" }, { "cheese_wedge", "1F9C0" }, { "cherries", "1F352" }, { "cherry_blossom", "1F338" }, { "chestnut", "1F330" }, { "chicken", "1F414" }, { "children_crossing", "1F6B8" }, { "chipmunk", "1F43F" }, { "chocolate_bar", "1F36B" }, { "christmas_tree", "1F384" }, { "church", "26EA" }, { "cinema", "1F3A6" }, { "circus_tent", "1F3AA" }, { "city_dusk", "1F306" }, { "city_sunset", "1F307" }, { "city_sunrise", "1F307" }, { "cityscape", "1F3D9" }, { "cl", "1F191" }, { "clap", "1F44F" }, { "clap_tone1", "1F44F-1F3FB" }, { "clap_tone2", "1F44F-1F3FC" }, { "clap_tone3", "1F44F-1F3FD" }, { "clap_tone4", "1F44F-1F3FE" }, { "clap_tone5", "1F44F-1F3FF" }, { "clapper", "1F3AC" }, { "classical_building", "1F3DB" }, { "clipboard", "1F4CB" }, { "clock", "1F570" }, { "mantlepiece_clock", "1F570" }, { "clock1", "1F550" }, { "clock10", "1F559" }, { "clock1030", "1F565" }, { "clock11", "1F55A" }, { "clock1130", "1F566" }, { "clock12", "1F55B" }, { "clock1230", "1F567" }, { "clock130", "1F55C" }, { "clock2", "1F551" }, { "clock230", "1F55D" }, { "clock3", "1F552" }, { "clock330", "1F55E" }, { "clock4", "1F553" }, { "clock430", "1F55F" }, { "clock5", "1F554" }, { "clock530", "1F560" }, { "clock6", "1F555" }, { "clock630", "1F561" }, { "clock7", "1F556" }, { "clock730", "1F562" }, { "clock8", "1F557" }, { "clock830", "1F563" }, { "clock9", "1F558" }, { "clock930", "1F564" }, { "closed_book", "1F4D5" }, { "closed_lock_with_key", "1F510" }, { "closed_umbrella", "1F302" }, { "cloud", "2601" }, { "cloud_lightning", "1F329" }, { "cloud_with_lightning", "1F329" }, { "cloud_rain", "1F327" }, { "cloud_with_rain", "1F327" }, { "cloud_snow", "1F328" }, { "cloud_with_snow", "1F328" }, { "cloud_tornado", "1F32A" }, { "cloud_with_tornado", "1F32A" }, { "clown", "1F921" }, { "clown_face", "1F921" }, { "clubs", "2663" }, { "cocktail", "1F378" }, { "coffee", "2615" }, { "coffin", "26B0" }, { "cold_sweat", "1F630" }, { "comet", "2604" }, { "compression", "1F5DC" }, { "computer", "1F4BB" }, { "confetti_ball", "1F38A" }, { "confounded", "1F616" }, { "confused", "1F615" }, { "congratulations", "3297" }, { "construction", "1F6A7" }, { "construction_site", "1F3D7" }, { "building_construction", "1F3D7" }, { "construction_worker", "1F477" }, { "construction_worker_tone1", "1F477-1F3FB" }, { "construction_worker_tone2", "1F477-1F3FC" }, { "construction_worker_tone3", "1F477-1F3FD" }, { "construction_worker_tone4", "1F477-1F3FE" }, { "construction_worker_tone5", "1F477-1F3FF" }, { "control_knobs", "1F39B" }, { "convenience_store", "1F3EA" }, { "cookie", "1F36A" }, { "cooking", "1F373" }, { "cool", "1F192" }, { "cop", "1F46E" }, { "cop_tone1", "1F46E-1F3FB" }, { "cop_tone2", "1F46E-1F3FC" }, { "cop_tone3", "1F46E-1F3FD" }, { "cop_tone4", "1F46E-1F3FE" }, { "cop_tone5", "1F46E-1F3FF" }, { "copyright", "00A9" }, { "corn", "1F33D" }, { "couch", "1F6CB" }, { "couch_and_lamp", "1F6CB" }, { "couple", "1F46B" }, { "couple_mm", "1F468-2764-1F468" }, { "couple_with_heart_mm", "1F468-2764-1F468" }, { "couple_with_heart", "1F491" }, { "couple_ww", "1F469-2764-1F469" }, { "couple_with_heart_ww", "1F469-2764-1F469" }, { "couplekiss", "1F48F" }, { "cow", "1F42E" }, { "cow2", "1F404" }, { "cowboy", "1F920" }, { "face_with_cowboy_hat", "1F920" }, { "crab", "1F980" }, { "crayon", "1F58D" }, { "lower_left_crayon", "1F58D" }, { "credit_card", "1F4B3" }, { "crescent_moon", "1F319" }, { "cricket", "1F3CF" }, { "cricket_bat_ball", "1F3CF" }, { "crocodile", "1F40A" }, { "croissant", "1F950" }, { "cross", "271D" }, { "latin_cross", "271D" }, { "crossed_flags", "1F38C" }, { "crossed_swords", "2694" }, { "crown", "1F451" }, { "cruise_ship", "1F6F3" }, { "passenger_ship", "1F6F3" }, { "cry", "1F622" }, { "crying_cat_face", "1F63F" }, { "crystal_ball", "1F52E" }, { "cucumber", "1F952" }, { "cupid", "1F498" }, { "curly_loop", "27B0" }, { "currency_exchange", "1F4B1" }, { "curry", "1F35B" }, { "custard", "1F36E" }, { "pudding", "1F36E" }, { "flan", "1F36E" }, { "customs", "1F6C3" }, { "cyclone", "1F300" }, { "dagger", "1F5E1" }, { "dagger_knife", "1F5E1" }, { "dancer", "1F483" }, { "dancer_tone1", "1F483-1F3FB" }, { "dancer_tone2", "1F483-1F3FC" }, { "dancer_tone3", "1F483-1F3FD" }, { "dancer_tone4", "1F483-1F3FE" }, { "dancer_tone5", "1F483-1F3FF" }, { "dancers", "1F46F" }, { "dango", "1F361" }, { "dark_sunglasses", "1F576" }, { "dart", "1F3AF" }, { "dash", "1F4A8" }, { "date", "1F4C5" }, { "deciduous_tree", "1F333" }, { "deer", "1F98C" }, { "department_store", "1F3EC" }, { "desert", "1F3DC" }, { "desktop", "1F5A5" }, { "desktop_computer", "1F5A5" }, { "diamond_shape_with_a_dot_inside", "1F4A0" }, { "diamonds", "2666" }, { "disappointed", "1F61E" }, { "disappointed_relieved", "1F625" }, { "dividers", "1F5C2" }, { "card_index_dividers", "1F5C2" }, { "dizzy", "1F4AB" }, { "dizzy_face", "1F635" }, { "do_not_litter", "1F6AF" }, { "dog", "1F436" }, { "dog2", "1F415" }, { "dollar", "1F4B5" }, { "dolls", "1F38E" }, { "dolphin", "1F42C" }, { "door", "1F6AA" }, { "doughnut", "1F369" }, { "dove", "1F54A" }, { "dove_of_peace", "1F54A" }, { "dragon", "1F409" }, { "dragon_face", "1F432" }, { "dress", "1F457" }, { "dromedary_camel", "1F42A" }, { "drooling_face", "1F924" }, { "drool", "1F924" }, { "droplet", "1F4A7" }, { "drum", "1F941" }, { "drum_with_drumsticks", "1F941" }, { "duck", "1F986" }, { "dvd", "1F4C0" }, { "eagle", "1F985" }, { "ear", "1F442" }, { "ear_of_rice", "1F33E" }, { "ear_tone1", "1F442-1F3FB" }, { "ear_tone2", "1F442-1F3FC" }, { "ear_tone3", "1F442-1F3FD" }, { "ear_tone4", "1F442-1F3FE" }, { "ear_tone5", "1F442-1F3FF" }, { "earth_africa", "1F30D" }, { "earth_americas", "1F30E" }, { "earth_asia", "1F30F" }, { "egg", "1F95A" }, { "eggplant", "1F346" }, { "eight", "0038-20E3" }, { "eight_pointed_black_star", "2734" }, { "eight_spoked_asterisk", "2733" }, { "eject", "23CF" }, { "eject_symbol", "23CF" }, { "electric_plug", "1F50C" }, { "elephant", "1F418" }, { "e-mail", "1F4E7" }, { "email", "1F4E7" }, { "end", "1F51A" }, { "envelope", "2709" }, { "envelope_with_arrow", "1F4E9" }, { "euro", "1F4B6" }, { "european_castle", "1F3F0" }, { "european_post_office", "1F3E4" }, { "evergreen_tree", "1F332" }, { "exclamation", "2757" }, { "expressionless", "1F611" }, { "eye", "1F441" }, { "eye_in_speech_bubble", "1F441-1F5E8" }, { "eyeglasses", "1F453" }, { "eyes", "1F440" }, { "face_palm", "1F926" }, { "facepalm", "1F926" }, { "face_palm_tone1", "1F926-1F3FB" }, { "facepalm_tone1", "1F926-1F3FB" }, { "face_palm_tone2", "1F926-1F3FC" }, { "facepalm_tone2", "1F926-1F3FC" }, { "face_palm_tone3", "1F926-1F3FD" }, { "facepalm_tone3", "1F926-1F3FD" }, { "face_palm_tone4", "1F926-1F3FE" }, { "facepalm_tone4", "1F926-1F3FE" }, { "face_palm_tone5", "1F926-1F3FF" }, { "facepalm_tone5", "1F926-1F3FF" }, { "factory", "1F3ED" }, { "fallen_leaf", "1F342" }, { "family", "1F46A" }, { "family_mmb", "1F468-1F468-1F466" }, { "family_mmbb", "1F468-1F468-1F466-1F466" }, { "family_mmg", "1F468-1F468-1F467" }, { "family_mmgb", "1F468-1F468-1F467-1F466" }, { "family_mmgg", "1F468-1F468-1F467-1F467" }, { "family_mwbb", "1F468-1F469-1F466-1F466" }, { "family_mwg", "1F468-1F469-1F467" }, { "family_mwgb", "1F468-1F469-1F467-1F466" }, { "family_mwgg", "1F468-1F469-1F467-1F467" }, { "family_wwb", "1F469-1F469-1F466" }, { "family_wwbb", "1F469-1F469-1F466-1F466" }, { "family_wwg", "1F469-1F469-1F467" }, { "family_wwgb", "1F469-1F469-1F467-1F466" }, { "family_wwgg", "1F469-1F469-1F467-1F467" }, { "fast_forward", "23E9" }, { "fax", "1F4E0" }, { "fearful", "1F628" }, { "feet", "1F43E" }, { "paw_prints", "1F43E" }, { "fencer", "1F93A" }, { "fencing", "1F93A" }, { "ferris_wheel", "1F3A1" }, { "ferry", "26F4" }, { "field_hockey", "1F3D1" }, { "file_cabinet", "1F5C4" }, { "file_folder", "1F4C1" }, { "film_frames", "1F39E" }, { "fingers_crossed", "1F91E" }, { "hand_with_index_and_middle_finger_crossed", "1F91E" }, { "fingers_crossed_tone1", "1F91E-1F3FB" }, { "hand_with_index_and_middle_fingers_crossed_tone1", "1F91E-1F3FB" }, { "fingers_crossed_tone2", "1F91E-1F3FC" }, { "hand_with_index_and_middle_fingers_crossed_tone2", "1F91E-1F3FC" }, { "fingers_crossed_tone3", "1F91E-1F3FD" }, { "hand_with_index_and_middle_fingers_crossed_tone3", "1F91E-1F3FD" }, { "fingers_crossed_tone4", "1F91E-1F3FE" }, { "hand_with_index_and_middle_fingers_crossed_tone4", "1F91E-1F3FE" }, { "fingers_crossed_tone5", "1F91E-1F3FF" }, { "hand_with_index_and_middle_fingers_crossed_tone5", "1F91E-1F3FF" }, { "fire", "1F525" }, { "flame", "1F525" }, { "fire_engine", "1F692" }, { "fireworks", "1F386" }, { "first_place", "1F947" }, { "first_place_medal", "1F947" }, { "first_quarter_moon", "1F313" }, { "first_quarter_moon_with_face", "1F31B" }, { "fish", "1F41F" }, { "fish_cake", "1F365" }, { "fishing_pole_and_fish", "1F3A3" }, { "fist", "270A" }, { "fist_tone1", "270A-1F3FB" }, { "fist_tone2", "270A-1F3FC" }, { "fist_tone3", "270A-1F3FD" }, { "fist_tone4", "270A-1F3FE" }, { "fist_tone5", "270A-1F3FF" }, { "five", "0035-20E3" }, { "flag_ac", "1F1E6-1F1E8" }, { "ac", "1F1E6-1F1E8" }, { "flag_ad", "1F1E6-1F1E9" }, { "ad", "1F1E6-1F1E9" }, { "flag_ae", "1F1E6-1F1EA" }, { "ae", "1F1E6-1F1EA" }, { "flag_af", "1F1E6-1F1EB" }, { "af", "1F1E6-1F1EB" }, { "flag_ag", "1F1E6-1F1EC" }, { "ag", "1F1E6-1F1EC" }, { "flag_ai", "1F1E6-1F1EE" }, { "ai", "1F1E6-1F1EE" }, { "flag_al", "1F1E6-1F1F1" }, { "al", "1F1E6-1F1F1" }, { "flag_am", "1F1E6-1F1F2" }, { "am", "1F1E6-1F1F2" }, { "flag_ao", "1F1E6-1F1F4" }, { "ao", "1F1E6-1F1F4" }, { "flag_aq", "1F1E6-1F1F6" }, { "aq", "1F1E6-1F1F6" }, { "flag_ar", "1F1E6-1F1F7" }, { "ar", "1F1E6-1F1F7" }, { "flag_as", "1F1E6-1F1F8" }, { "as", "1F1E6-1F1F8" }, { "flag_at", "1F1E6-1F1F9" }, { "at", "1F1E6-1F1F9" }, { "flag_au", "1F1E6-1F1FA" }, { "au", "1F1E6-1F1FA" }, { "flag_aw", "1F1E6-1F1FC" }, { "aw", "1F1E6-1F1FC" }, { "flag_ax", "1F1E6-1F1FD" }, { "ax", "1F1E6-1F1FD" }, { "flag_az", "1F1E6-1F1FF" }, { "az", "1F1E6-1F1FF" }, { "flag_ba", "1F1E7-1F1E6" }, { "ba", "1F1E7-1F1E6" }, { "flag_bb", "1F1E7-1F1E7" }, { "bb", "1F1E7-1F1E7" }, { "flag_bd", "1F1E7-1F1E9" }, { "bd", "1F1E7-1F1E9" }, { "flag_be", "1F1E7-1F1EA" }, { "be", "1F1E7-1F1EA" }, { "flag_bf", "1F1E7-1F1EB" }, { "bf", "1F1E7-1F1EB" }, { "flag_bg", "1F1E7-1F1EC" }, { "bg", "1F1E7-1F1EC" }, { "flag_bh", "1F1E7-1F1ED" }, { "bh", "1F1E7-1F1ED" }, { "flag_bi", "1F1E7-1F1EE" }, { "bi", "1F1E7-1F1EE" }, { "flag_bj", "1F1E7-1F1EF" }, { "bj", "1F1E7-1F1EF" }, { "flag_bl", "1F1E7-1F1F1" }, { "bl", "1F1E7-1F1F1" }, { "flag_black", "1F3F4" }, { "waving_black_flag", "1F3F4" }, { "flag_bm", "1F1E7-1F1F2" }, { "bm", "1F1E7-1F1F2" }, { "flag_bn", "1F1E7-1F1F3" }, { "bn", "1F1E7-1F1F3" }, { "flag_bo", "1F1E7-1F1F4" }, { "bo", "1F1E7-1F1F4" }, { "flag_bq", "1F1E7-1F1F6" }, { "bq", "1F1E7-1F1F6" }, { "flag_br", "1F1E7-1F1F7" }, { "br", "1F1E7-1F1F7" }, { "flag_bs", "1F1E7-1F1F8" }, { "bs", "1F1E7-1F1F8" }, { "flag_bt", "1F1E7-1F1F9" }, { "bt", "1F1E7-1F1F9" }, { "flag_bv", "1F1E7-1F1FB" }, { "bv", "1F1E7-1F1FB" }, { "flag_bw", "1F1E7-1F1FC" }, { "bw", "1F1E7-1F1FC" }, { "flag_by", "1F1E7-1F1FE" }, { "by", "1F1E7-1F1FE" }, { "flag_bz", "1F1E7-1F1FF" }, { "bz", "1F1E7-1F1FF" }, { "flag_ca", "1F1E8-1F1E6" }, { "ca", "1F1E8-1F1E6" }, { "flag_cc", "1F1E8-1F1E8" }, { "cc", "1F1E8-1F1E8" }, { "flag_cd", "1F1E8-1F1E9" }, { "congo", "1F1E8-1F1E9" }, { "flag_cf", "1F1E8-1F1EB" }, { "cf", "1F1E8-1F1EB" }, { "flag_cg", "1F1E8-1F1EC" }, { "cg", "1F1E8-1F1EC" }, { "flag_ch", "1F1E8-1F1ED" }, { "ch", "1F1E8-1F1ED" }, { "flag_ci", "1F1E8-1F1EE" }, { "ci", "1F1E8-1F1EE" }, { "flag_ck", "1F1E8-1F1F0" }, { "ck", "1F1E8-1F1F0" }, { "flag_cl", "1F1E8-1F1F1" }, { "chile", "1F1E8-1F1F1" }, { "flag_cm", "1F1E8-1F1F2" }, { "cm", "1F1E8-1F1F2" }, { "flag_cn", "1F1E8-1F1F3" }, { "cn", "1F1E8-1F1F3" }, { "flag_co", "1F1E8-1F1F4" }, { "co", "1F1E8-1F1F4" }, { "flag_cp", "1F1E8-1F1F5" }, { "cp", "1F1E8-1F1F5" }, { "flag_cr", "1F1E8-1F1F7" }, { "cr", "1F1E8-1F1F7" }, { "flag_cu", "1F1E8-1F1FA" }, { "cu", "1F1E8-1F1FA" }, { "flag_cv", "1F1E8-1F1FB" }, { "cv", "1F1E8-1F1FB" }, { "flag_cw", "1F1E8-1F1FC" }, { "cw", "1F1E8-1F1FC" }, { "flag_cx", "1F1E8-1F1FD" }, { "cx", "1F1E8-1F1FD" }, { "flag_cy", "1F1E8-1F1FE" }, { "cy", "1F1E8-1F1FE" }, { "flag_cz", "1F1E8-1F1FF" }, { "cz", "1F1E8-1F1FF" }, { "flag_de", "1F1E9-1F1EA" }, { "de", "1F1E9-1F1EA" }, { "flag_dg", "1F1E9-1F1EC" }, { "dg", "1F1E9-1F1EC" }, { "flag_dj", "1F1E9-1F1EF" }, { "dj", "1F1E9-1F1EF" }, { "flag_dk", "1F1E9-1F1F0" }, { "dk", "1F1E9-1F1F0" }, { "flag_dm", "1F1E9-1F1F2" }, { "dm", "1F1E9-1F1F2" }, { "flag_do", "1F1E9-1F1F4" }, { "do", "1F1E9-1F1F4" }, { "flag_dz", "1F1E9-1F1FF" }, { "dz", "1F1E9-1F1FF" }, { "flag_ea", "1F1EA-1F1E6" }, { "ea", "1F1EA-1F1E6" }, { "flag_ec", "1F1EA-1F1E8" }, { "ec", "1F1EA-1F1E8" }, { "flag_ee", "1F1EA-1F1EA" }, { "ee", "1F1EA-1F1EA" }, { "flag_eg", "1F1EA-1F1EC" }, { "eg", "1F1EA-1F1EC" }, { "flag_eh", "1F1EA-1F1ED" }, { "eh", "1F1EA-1F1ED" }, { "flag_er", "1F1EA-1F1F7" }, { "er", "1F1EA-1F1F7" }, { "flag_es", "1F1EA-1F1F8" }, { "es", "1F1EA-1F1F8" }, { "flag_et", "1F1EA-1F1F9" }, { "et", "1F1EA-1F1F9" }, { "flag_eu", "1F1EA-1F1FA" }, { "eu", "1F1EA-1F1FA" }, { "flag_fi", "1F1EB-1F1EE" }, { "fi", "1F1EB-1F1EE" }, { "flag_fj", "1F1EB-1F1EF" }, { "fj", "1F1EB-1F1EF" }, { "flag_fk", "1F1EB-1F1F0" }, { "fk", "1F1EB-1F1F0" }, { "flag_fm", "1F1EB-1F1F2" }, { "fm", "1F1EB-1F1F2" }, { "flag_fo", "1F1EB-1F1F4" }, { "fo", "1F1EB-1F1F4" }, { "flag_fr", "1F1EB-1F1F7" }, { "fr", "1F1EB-1F1F7" }, { "flag_ga", "1F1EC-1F1E6" }, { "ga", "1F1EC-1F1E6" }, { "flag_gb", "1F1EC-1F1E7" }, { "gb", "1F1EC-1F1E7" }, { "flag_gd", "1F1EC-1F1E9" }, { "gd", "1F1EC-1F1E9" }, { "flag_ge", "1F1EC-1F1EA" }, { "ge", "1F1EC-1F1EA" }, { "flag_gf", "1F1EC-1F1EB" }, { "gf", "1F1EC-1F1EB" }, { "flag_gg", "1F1EC-1F1EC" }, { "gg", "1F1EC-1F1EC" }, { "flag_gh", "1F1EC-1F1ED" }, { "gh", "1F1EC-1F1ED" }, { "flag_gi", "1F1EC-1F1EE" }, { "gi", "1F1EC-1F1EE" }, { "flag_gl", "1F1EC-1F1F1" }, { "gl", "1F1EC-1F1F1" }, { "flag_gm", "1F1EC-1F1F2" }, { "gm", "1F1EC-1F1F2" }, { "flag_gn", "1F1EC-1F1F3" }, { "gn", "1F1EC-1F1F3" }, { "flag_gp", "1F1EC-1F1F5" }, { "gp", "1F1EC-1F1F5" }, { "flag_gq", "1F1EC-1F1F6" }, { "gq", "1F1EC-1F1F6" }, { "flag_gr", "1F1EC-1F1F7" }, { "gr", "1F1EC-1F1F7" }, { "flag_gs", "1F1EC-1F1F8" }, { "gs", "1F1EC-1F1F8" }, { "flag_gt", "1F1EC-1F1F9" }, { "gt", "1F1EC-1F1F9" }, { "flag_gu", "1F1EC-1F1FA" }, { "gu", "1F1EC-1F1FA" }, { "flag_gw", "1F1EC-1F1FC" }, { "gw", "1F1EC-1F1FC" }, { "flag_gy", "1F1EC-1F1FE" }, { "gy", "1F1EC-1F1FE" }, { "flag_hk", "1F1ED-1F1F0" }, { "hk", "1F1ED-1F1F0" }, { "flag_hm", "1F1ED-1F1F2" }, { "hm", "1F1ED-1F1F2" }, { "flag_hn", "1F1ED-1F1F3" }, { "hn", "1F1ED-1F1F3" }, { "flag_hr", "1F1ED-1F1F7" }, { "hr", "1F1ED-1F1F7" }, { "flag_ht", "1F1ED-1F1F9" }, { "ht", "1F1ED-1F1F9" }, { "flag_hu", "1F1ED-1F1FA" }, { "hu", "1F1ED-1F1FA" }, { "flag_ic", "1F1EE-1F1E8" }, { "ic", "1F1EE-1F1E8" }, { "flag_id", "1F1EE-1F1E9" }, { "indonesia", "1F1EE-1F1E9" }, { "flag_ie", "1F1EE-1F1EA" }, { "ie", "1F1EE-1F1EA" }, { "flag_il", "1F1EE-1F1F1" }, { "il", "1F1EE-1F1F1" }, { "flag_im", "1F1EE-1F1F2" }, { "im", "1F1EE-1F1F2" }, { "flag_in", "1F1EE-1F1F3" }, { "in", "1F1EE-1F1F3" }, { "flag_io", "1F1EE-1F1F4" }, { "io", "1F1EE-1F1F4" }, { "flag_iq", "1F1EE-1F1F6" }, { "iq", "1F1EE-1F1F6" }, { "flag_ir", "1F1EE-1F1F7" }, { "ir", "1F1EE-1F1F7" }, { "flag_is", "1F1EE-1F1F8" }, { "is", "1F1EE-1F1F8" }, { "flag_it", "1F1EE-1F1F9" }, { "it", "1F1EE-1F1F9" }, { "flag_je", "1F1EF-1F1EA" }, { "je", "1F1EF-1F1EA" }, { "flag_jm", "1F1EF-1F1F2" }, { "jm", "1F1EF-1F1F2" }, { "flag_jo", "1F1EF-1F1F4" }, { "jo", "1F1EF-1F1F4" }, { "flag_jp", "1F1EF-1F1F5" }, { "jp", "1F1EF-1F1F5" }, { "flag_ke", "1F1F0-1F1EA" }, { "ke", "1F1F0-1F1EA" }, { "flag_kg", "1F1F0-1F1EC" }, { "kg", "1F1F0-1F1EC" }, { "flag_kh", "1F1F0-1F1ED" }, { "kh", "1F1F0-1F1ED" }, { "flag_ki", "1F1F0-1F1EE" }, { "ki", "1F1F0-1F1EE" }, { "flag_km", "1F1F0-1F1F2" }, { "km", "1F1F0-1F1F2" }, { "flag_kn", "1F1F0-1F1F3" }, { "kn", "1F1F0-1F1F3" }, { "flag_kp", "1F1F0-1F1F5" }, { "kp", "1F1F0-1F1F5" }, { "flag_kr", "1F1F0-1F1F7" }, { "kr", "1F1F0-1F1F7" }, { "flag_kw", "1F1F0-1F1FC" }, { "kw", "1F1F0-1F1FC" }, { "flag_ky", "1F1F0-1F1FE" }, { "ky", "1F1F0-1F1FE" }, { "flag_kz", "1F1F0-1F1FF" }, { "kz", "1F1F0-1F1FF" }, { "flag_la", "1F1F1-1F1E6" }, { "la", "1F1F1-1F1E6" }, { "flag_lb", "1F1F1-1F1E7" }, { "lb", "1F1F1-1F1E7" }, { "flag_lc", "1F1F1-1F1E8" }, { "lc", "1F1F1-1F1E8" }, { "flag_li", "1F1F1-1F1EE" }, { "li", "1F1F1-1F1EE" }, { "flag_lk", "1F1F1-1F1F0" }, { "lk", "1F1F1-1F1F0" }, { "flag_lr", "1F1F1-1F1F7" }, { "lr", "1F1F1-1F1F7" }, { "flag_ls", "1F1F1-1F1F8" }, { "ls", "1F1F1-1F1F8" }, { "flag_lt", "1F1F1-1F1F9" }, { "lt", "1F1F1-1F1F9" }, { "flag_lu", "1F1F1-1F1FA" }, { "lu", "1F1F1-1F1FA" }, { "flag_lv", "1F1F1-1F1FB" }, { "lv", "1F1F1-1F1FB" }, { "flag_ly", "1F1F1-1F1FE" }, { "ly", "1F1F1-1F1FE" }, { "flag_ma", "1F1F2-1F1E6" }, { "ma", "1F1F2-1F1E6" }, { "flag_mc", "1F1F2-1F1E8" }, { "mc", "1F1F2-1F1E8" }, { "flag_md", "1F1F2-1F1E9" }, { "md", "1F1F2-1F1E9" }, { "flag_me", "1F1F2-1F1EA" }, { "me", "1F1F2-1F1EA" }, { "flag_mf", "1F1F2-1F1EB" }, { "mf", "1F1F2-1F1EB" }, { "flag_mg", "1F1F2-1F1EC" }, { "mg", "1F1F2-1F1EC" }, { "flag_mh", "1F1F2-1F1ED" }, { "mh", "1F1F2-1F1ED" }, { "flag_mk", "1F1F2-1F1F0" }, { "mk", "1F1F2-1F1F0" }, { "flag_ml", "1F1F2-1F1F1" }, { "ml", "1F1F2-1F1F1" }, { "flag_mm", "1F1F2-1F1F2" }, { "mm", "1F1F2-1F1F2" }, { "flag_mn", "1F1F2-1F1F3" }, { "mn", "1F1F2-1F1F3" }, { "flag_mo", "1F1F2-1F1F4" }, { "mo", "1F1F2-1F1F4" }, { "flag_mp", "1F1F2-1F1F5" }, { "mp", "1F1F2-1F1F5" }, { "flag_mq", "1F1F2-1F1F6" }, { "mq", "1F1F2-1F1F6" }, { "flag_mr", "1F1F2-1F1F7" }, { "mr", "1F1F2-1F1F7" }, { "flag_ms", "1F1F2-1F1F8" }, { "ms", "1F1F2-1F1F8" }, { "flag_mt", "1F1F2-1F1F9" }, { "mt", "1F1F2-1F1F9" }, { "flag_mu", "1F1F2-1F1FA" }, { "mu", "1F1F2-1F1FA" }, { "flag_mv", "1F1F2-1F1FB" }, { "mv", "1F1F2-1F1FB" }, { "flag_mw", "1F1F2-1F1FC" }, { "mw", "1F1F2-1F1FC" }, { "flag_mx", "1F1F2-1F1FD" }, { "mx", "1F1F2-1F1FD" }, { "flag_my", "1F1F2-1F1FE" }, { "my", "1F1F2-1F1FE" }, { "flag_mz", "1F1F2-1F1FF" }, { "mz", "1F1F2-1F1FF" }, { "flag_na", "1F1F3-1F1E6" }, { "na", "1F1F3-1F1E6" }, { "flag_nc", "1F1F3-1F1E8" }, { "nc", "1F1F3-1F1E8" }, { "flag_ne", "1F1F3-1F1EA" }, { "ne", "1F1F3-1F1EA" }, { "flag_nf", "1F1F3-1F1EB" }, { "nf", "1F1F3-1F1EB" }, { "flag_ng", "1F1F3-1F1EC" }, { "nigeria", "1F1F3-1F1EC" }, { "flag_ni", "1F1F3-1F1EE" }, { "ni", "1F1F3-1F1EE" }, { "flag_nl", "1F1F3-1F1F1" }, { "nl", "1F1F3-1F1F1" }, { "flag_no", "1F1F3-1F1F4" }, { "no", "1F1F3-1F1F4" }, { "flag_np", "1F1F3-1F1F5" }, { "np", "1F1F3-1F1F5" }, { "flag_nr", "1F1F3-1F1F7" }, { "nr", "1F1F3-1F1F7" }, { "flag_nu", "1F1F3-1F1FA" }, { "nu", "1F1F3-1F1FA" }, { "flag_nz", "1F1F3-1F1FF" }, { "nz", "1F1F3-1F1FF" }, { "flag_om", "1F1F4-1F1F2" }, { "om", "1F1F4-1F1F2" }, { "flag_pa", "1F1F5-1F1E6" }, { "pa", "1F1F5-1F1E6" }, { "flag_pe", "1F1F5-1F1EA" }, { "pe", "1F1F5-1F1EA" }, { "flag_pf", "1F1F5-1F1EB" }, { "pf", "1F1F5-1F1EB" }, { "flag_pg", "1F1F5-1F1EC" }, { "pg", "1F1F5-1F1EC" }, { "flag_ph", "1F1F5-1F1ED" }, { "ph", "1F1F5-1F1ED" }, { "flag_pk", "1F1F5-1F1F0" }, { "pk", "1F1F5-1F1F0" }, { "flag_pl", "1F1F5-1F1F1" }, { "pl", "1F1F5-1F1F1" }, { "flag_pm", "1F1F5-1F1F2" }, { "pm", "1F1F5-1F1F2" }, { "flag_pn", "1F1F5-1F1F3" }, { "pn", "1F1F5-1F1F3" }, { "flag_pr", "1F1F5-1F1F7" }, { "pr", "1F1F5-1F1F7" }, { "flag_ps", "1F1F5-1F1F8" }, { "ps", "1F1F5-1F1F8" }, { "flag_pt", "1F1F5-1F1F9" }, { "pt", "1F1F5-1F1F9" }, { "flag_pw", "1F1F5-1F1FC" }, { "pw", "1F1F5-1F1FC" }, { "flag_py", "1F1F5-1F1FE" }, { "py", "1F1F5-1F1FE" }, { "flag_qa", "1F1F6-1F1E6" }, { "qa", "1F1F6-1F1E6" }, { "flag_re", "1F1F7-1F1EA" }, { "re", "1F1F7-1F1EA" }, { "flag_ro", "1F1F7-1F1F4" }, { "ro", "1F1F7-1F1F4" }, { "flag_rs", "1F1F7-1F1F8" }, { "rs", "1F1F7-1F1F8" }, { "flag_ru", "1F1F7-1F1FA" }, { "ru", "1F1F7-1F1FA" }, { "flag_rw", "1F1F7-1F1FC" }, { "rw", "1F1F7-1F1FC" }, { "flag_sa", "1F1F8-1F1E6" }, { "saudiarabia", "1F1F8-1F1E6" }, { "saudi", "1F1F8-1F1E6" }, { "flag_sb", "1F1F8-1F1E7" }, { "sb", "1F1F8-1F1E7" }, { "flag_sc", "1F1F8-1F1E8" }, { "sc", "1F1F8-1F1E8" }, { "flag_sd", "1F1F8-1F1E9" }, { "sd", "1F1F8-1F1E9" }, { "flag_se", "1F1F8-1F1EA" }, { "se", "1F1F8-1F1EA" }, { "flag_sg", "1F1F8-1F1EC" }, { "sg", "1F1F8-1F1EC" }, { "flag_sh", "1F1F8-1F1ED" }, { "sh", "1F1F8-1F1ED" }, { "flag_si", "1F1F8-1F1EE" }, { "si", "1F1F8-1F1EE" }, { "flag_sj", "1F1F8-1F1EF" }, { "sj", "1F1F8-1F1EF" }, { "flag_sk", "1F1F8-1F1F0" }, { "sk", "1F1F8-1F1F0" }, { "flag_sl", "1F1F8-1F1F1" }, { "sl", "1F1F8-1F1F1" }, { "flag_sm", "1F1F8-1F1F2" }, { "sm", "1F1F8-1F1F2" }, { "flag_sn", "1F1F8-1F1F3" }, { "sn", "1F1F8-1F1F3" }, { "flag_so", "1F1F8-1F1F4" }, { "so", "1F1F8-1F1F4" }, { "flag_sr", "1F1F8-1F1F7" }, { "sr", "1F1F8-1F1F7" }, { "flag_ss", "1F1F8-1F1F8" }, { "ss", "1F1F8-1F1F8" }, { "flag_st", "1F1F8-1F1F9" }, { "st", "1F1F8-1F1F9" }, { "flag_sv", "1F1F8-1F1FB" }, { "sv", "1F1F8-1F1FB" }, { "flag_sx", "1F1F8-1F1FD" }, { "sx", "1F1F8-1F1FD" }, { "flag_sy", "1F1F8-1F1FE" }, { "sy", "1F1F8-1F1FE" }, { "flag_sz", "1F1F8-1F1FF" }, { "sz", "1F1F8-1F1FF" }, { "flag_ta", "1F1F9-1F1E6" }, { "ta", "1F1F9-1F1E6" }, { "flag_tc", "1F1F9-1F1E8" }, { "tc", "1F1F9-1F1E8" }, { "flag_td", "1F1F9-1F1E9" }, { "td", "1F1F9-1F1E9" }, { "flag_tf", "1F1F9-1F1EB" }, { "tf", "1F1F9-1F1EB" }, { "flag_tg", "1F1F9-1F1EC" }, { "tg", "1F1F9-1F1EC" }, { "flag_th", "1F1F9-1F1ED" }, { "th", "1F1F9-1F1ED" }, { "flag_tj", "1F1F9-1F1EF" }, { "tj", "1F1F9-1F1EF" }, { "flag_tk", "1F1F9-1F1F0" }, { "tk", "1F1F9-1F1F0" }, { "flag_tl", "1F1F9-1F1F1" }, { "tl", "1F1F9-1F1F1" }, { "flag_tm", "1F1F9-1F1F2" }, { "turkmenistan", "1F1F9-1F1F2" }, { "flag_tn", "1F1F9-1F1F3" }, { "tn", "1F1F9-1F1F3" }, { "flag_to", "1F1F9-1F1F4" }, { "to", "1F1F9-1F1F4" }, { "flag_tr", "1F1F9-1F1F7" }, { "tr", "1F1F9-1F1F7" }, { "flag_tt", "1F1F9-1F1F9" }, { "tt", "1F1F9-1F1F9" }, { "flag_tv", "1F1F9-1F1FB" }, { "tuvalu", "1F1F9-1F1FB" }, { "flag_tw", "1F1F9-1F1FC" }, { "tw", "1F1F9-1F1FC" }, { "flag_tz", "1F1F9-1F1FF" }, { "tz", "1F1F9-1F1FF" }, { "flag_ua", "1F1FA-1F1E6" }, { "ua", "1F1FA-1F1E6" }, { "flag_ug", "1F1FA-1F1EC" }, { "ug", "1F1FA-1F1EC" }, { "flag_um", "1F1FA-1F1F2" }, { "um", "1F1FA-1F1F2" }, { "flag_us", "1F1FA-1F1F8" }, { "us", "1F1FA-1F1F8" }, { "flag_uy", "1F1FA-1F1FE" }, { "uy", "1F1FA-1F1FE" }, { "flag_uz", "1F1FA-1F1FF" }, { "uz", "1F1FA-1F1FF" }, { "flag_va", "1F1FB-1F1E6" }, { "va", "1F1FB-1F1E6" }, { "flag_vc", "1F1FB-1F1E8" }, { "vc", "1F1FB-1F1E8" }, { "flag_ve", "1F1FB-1F1EA" }, { "ve", "1F1FB-1F1EA" }, { "flag_vg", "1F1FB-1F1EC" }, { "vg", "1F1FB-1F1EC" }, { "flag_vi", "1F1FB-1F1EE" }, { "vi", "1F1FB-1F1EE" }, { "flag_vn", "1F1FB-1F1F3" }, { "vn", "1F1FB-1F1F3" }, { "flag_vu", "1F1FB-1F1FA" }, { "vu", "1F1FB-1F1FA" }, { "flag_wf", "1F1FC-1F1EB" }, { "wf", "1F1FC-1F1EB" }, { "flag_white", "1F3F3" }, { "waving_white_flag", "1F3F3" }, { "flag_ws", "1F1FC-1F1F8" }, { "ws", "1F1FC-1F1F8" }, { "flag_xk", "1F1FD-1F1F0" }, { "xk", "1F1FD-1F1F0" }, { "flag_ye", "1F1FE-1F1EA" }, { "ye", "1F1FE-1F1EA" }, { "flag_yt", "1F1FE-1F1F9" }, { "yt", "1F1FE-1F1F9" }, { "flag_za", "1F1FF-1F1E6" }, { "za", "1F1FF-1F1E6" }, { "flag_zm", "1F1FF-1F1F2" }, { "zm", "1F1FF-1F1F2" }, { "flag_zw", "1F1FF-1F1FC" }, { "zw", "1F1FF-1F1FC" }, { "flags", "1F38F" }, { "flashlight", "1F526" }, { "fleur-de-lis", "269C" }, { "floppy_disk", "1F4BE" }, { "flower_playing_cards", "1F3B4" }, { "flushed", "1F633" }, { "fog", "1F32B" }, { "foggy", "1F301" }, { "football", "1F3C8" }, { "footprints", "1F463" }, { "fork_and_knife", "1F374" }, { "fork_knife_plate", "1F37D" }, { "fork_and_knife_with_plate", "1F37D" }, { "fountain", "26F2" }, { "four", "0034-20E3" }, { "four_leaf_clover", "1F340" }, { "fox", "1F98A" }, { "fox_face", "1F98A" }, { "frame_photo", "1F5BC" }, { "frame_with_picture", "1F5BC" }, { "free", "1F193" }, { "french_bread", "1F956" }, { "baguette_bread", "1F956" }, { "fried_shrimp", "1F364" }, { "fries", "1F35F" }, { "frog", "1F438" }, { "frowning", "1F626" }, { "frowning2", "2639" }, { "white_frowning_face", "2639" }, { "fuelpump", "26FD" }, { "full_moon", "1F315" }, { "full_moon_with_face", "1F31D" }, { "game_die", "1F3B2" }, { "gear", "2699" }, { "gem", "1F48E" }, { "gemini", "264A" }, { "ghost", "1F47B" }, { "gift", "1F381" }, { "gift_heart", "1F49D" }, { "girl", "1F467" }, { "girl_tone1", "1F467-1F3FB" }, { "girl_tone2", "1F467-1F3FC" }, { "girl_tone3", "1F467-1F3FD" }, { "girl_tone4", "1F467-1F3FE" }, { "girl_tone5", "1F467-1F3FF" }, { "globe_with_meridians", "1F310" }, { "goal", "1F945" }, { "goal_net", "1F945" }, { "goat", "1F410" }, { "golf", "26F3" }, { "golfer", "1F3CC" }, { "gorilla", "1F98D" }, { "grapes", "1F347" }, { "green_apple", "1F34F" }, { "green_book", "1F4D7" }, { "green_heart", "1F49A" }, { "grey_exclamation", "2755" }, { "grey_question", "2754" }, { "grimacing", "1F62C" }, { "grin", "1F601" }, { "grinning", "1F600" }, { "guardsman", "1F482" }, { "guardsman_tone1", "1F482-1F3FB" }, { "guardsman_tone2", "1F482-1F3FC" }, { "guardsman_tone3", "1F482-1F3FD" }, { "guardsman_tone4", "1F482-1F3FE" }, { "guardsman_tone5", "1F482-1F3FF" }, { "guitar", "1F3B8" }, { "gun", "1F52B" }, { "haircut", "1F487" }, { "haircut_tone1", "1F487-1F3FB" }, { "haircut_tone2", "1F487-1F3FC" }, { "haircut_tone3", "1F487-1F3FD" }, { "haircut_tone4", "1F487-1F3FE" }, { "haircut_tone5", "1F487-1F3FF" }, { "hamburger", "1F354" }, { "hammer", "1F528" }, { "hammer_pick", "2692" }, { "hammer_and_pick", "2692" }, { "hamster", "1F439" }, { "hand_splayed", "1F590" }, { "raised_hand_with_fingers_splayed", "1F590" }, { "hand_splayed_tone1", "1F590-1F3FB" }, { "raised_hand_with_fingers_splayed_tone1", "1F590-1F3FB" }, { "hand_splayed_tone2", "1F590-1F3FC" }, { "raised_hand_with_fingers_splayed_tone2", "1F590-1F3FC" }, { "hand_splayed_tone3", "1F590-1F3FD" }, { "raised_hand_with_fingers_splayed_tone3", "1F590-1F3FD" }, { "hand_splayed_tone4", "1F590-1F3FE" }, { "raised_hand_with_fingers_splayed_tone4", "1F590-1F3FE" }, { "hand_splayed_tone5", "1F590-1F3FF" }, { "raised_hand_with_fingers_splayed_tone5", "1F590-1F3FF" }, { "handbag", "1F45C" }, { "handball", "1F93E" }, { "handball_tone1", "1F93E-1F3FB" }, { "handball_tone2", "1F93E-1F3FC" }, { "handball_tone3", "1F93E-1F3FD" }, { "handball_tone4", "1F93E-1F3FE" }, { "handball_tone5", "1F93E-1F3FF" }, { "handshake", "1F91D" }, { "shaking_hands", "1F91D" }, { "handshake_tone1", "1F91D-1F3FB" }, { "shaking_hands_tone1", "1F91D-1F3FB" }, { "handshake_tone2", "1F91D-1F3FC" }, { "shaking_hands_tone2", "1F91D-1F3FC" }, { "handshake_tone3", "1F91D-1F3FD" }, { "shaking_hands_tone3", "1F91D-1F3FD" }, { "handshake_tone4", "1F91D-1F3FE" }, { "shaking_hands_tone4", "1F91D-1F3FE" }, { "handshake_tone5", "1F91D-1F3FF" }, { "shaking_hands_tone5", "1F91D-1F3FF" }, { "hash", "0023-20E3" }, { "hatched_chick", "1F425" }, { "hatching_chick", "1F423" }, { "head_bandage", "1F915" }, { "face_with_head_bandage", "1F915" }, { "headphones", "1F3A7" }, { "hear_no_evil", "1F649" }, { "heart", "2764" }, { "heart_decoration", "1F49F" }, { "heart_exclamation", "2763" }, { "heavy_heart_exclamation_mark_ornament", "2763" }, { "heart_eyes", "1F60D" }, { "heart_eyes_cat", "1F63B" }, { "heartbeat", "1F493" }, { "heartpulse", "1F497" }, { "hearts", "2665" }, { "heavy_check_mark", "2714" }, { "heavy_division_sign", "2797" }, { "heavy_dollar_sign", "1F4B2" }, { "heavy_minus_sign", "2796" }, { "heavy_multiplication_x", "2716" }, { "heavy_plus_sign", "2795" }, { "helicopter", "1F681" }, { "helmet_with_cross", "26D1" }, { "helmet_with_white_cross", "26D1" }, { "herb", "1F33F" }, { "hibiscus", "1F33A" }, { "high_brightness", "1F506" }, { "high_heel", "1F460" }, { "hockey", "1F3D2" }, { "hole", "1F573" }, { "homes", "1F3D8" }, { "house_buildings", "1F3D8" }, { "honey_pot", "1F36F" }, { "horse", "1F434" }, { "horse_racing", "1F3C7" }, { "horse_racing_tone1", "1F3C7-1F3FB" }, { "horse_racing_tone2", "1F3C7-1F3FC" }, { "horse_racing_tone3", "1F3C7-1F3FD" }, { "horse_racing_tone4", "1F3C7-1F3FE" }, { "horse_racing_tone5", "1F3C7-1F3FF" }, { "hospital", "1F3E5" }, { "hot_pepper", "1F336" }, { "hotdog", "1F32D" }, { "hot_dog", "1F32D" }, { "hotel", "1F3E8" }, { "hotsprings", "2668" }, { "hourglass", "231B" }, { "hourglass_flowing_sand", "23F3" }, { "house", "1F3E0" }, { "house_abandoned", "1F3DA" }, { "derelict_house_building", "1F3DA" }, { "house_with_garden", "1F3E1" }, { "hugging", "1F917" }, { "hugging_face", "1F917" }, { "hushed", "1F62F" }, { "ice_cream", "1F368" }, { "ice_skate", "26F8" }, { "icecream", "1F366" }, { "id", "1F194" }, { "ideograph_advantage", "1F250" }, { "imp", "1F47F" }, { "inbox_tray", "1F4E5" }, { "incoming_envelope", "1F4E8" }, { "information_desk_person", "1F481" }, { "information_desk_person_tone1", "1F481-1F3FB" }, { "information_desk_person_tone2", "1F481-1F3FC" }, { "information_desk_person_tone3", "1F481-1F3FD" }, { "information_desk_person_tone4", "1F481-1F3FE" }, { "information_desk_person_tone5", "1F481-1F3FF" }, { "information_source", "2139" }, { "innocent", "1F607" }, { "interrobang", "2049" }, { "iphone", "1F4F1" }, { "island", "1F3DD" }, { "desert_island", "1F3DD" }, { "izakaya_lantern", "1F3EE" }, { "jack_o_lantern", "1F383" }, { "japan", "1F5FE" }, { "japanese_castle", "1F3EF" }, { "japanese_goblin", "1F47A" }, { "japanese_ogre", "1F479" }, { "jeans", "1F456" }, { "joy", "1F602" }, { "joy_cat", "1F639" }, { "joystick", "1F579" }, { "juggling", "1F939" }, { "juggler", "1F939" }, { "juggling_tone1", "1F939-1F3FB" }, { "juggler_tone1", "1F939-1F3FB" }, { "juggling_tone2", "1F939-1F3FC" }, { "juggler_tone2", "1F939-1F3FC" }, { "juggling_tone3", "1F939-1F3FD" }, { "juggler_tone3", "1F939-1F3FD" }, { "juggling_tone4", "1F939-1F3FE" }, { "juggler_tone4", "1F939-1F3FE" }, { "juggling_tone5", "1F939-1F3FF" }, { "juggler_tone5", "1F939-1F3FF" }, { "kaaba", "1F54B" }, { "key", "1F511" }, { "key2", "1F5DD" }, { "old_key", "1F5DD" }, { "keyboard", "2328" }, { "keycap_ten", "1F51F" }, { "kimono", "1F458" }, { "kiss", "1F48B" }, { "kiss_mm", "1F468-2764-1F48B-1F468" }, { "couplekiss_mm", "1F468-2764-1F48B-1F468" }, { "kiss_ww", "1F469-2764-1F48B-1F469" }, { "couplekiss_ww", "1F469-2764-1F48B-1F469" }, { "kissing", "1F617" }, { "kissing_cat", "1F63D" }, { "kissing_closed_eyes", "1F61A" }, { "kissing_heart", "1F618" }, { "kissing_smiling_eyes", "1F619" }, { "kiwi", "1F95D" }, { "kiwifruit", "1F95D" }, { "knife", "1F52A" }, { "koala", "1F428" }, { "koko", "1F201" }, { "label", "1F3F7" }, { "large_blue_diamond", "1F537" }, { "large_orange_diamond", "1F536" }, { "last_quarter_moon", "1F317" }, { "last_quarter_moon_with_face", "1F31C" }, { "laughing", "1F606" }, { "satisfied", "1F606" }, { "leaves", "1F343" }, { "ledger", "1F4D2" }, { "left_facing_fist", "1F91B" }, { "left_fist", "1F91B" }, { "left_facing_fist_tone1", "1F91B-1F3FB" }, { "left_fist_tone1", "1F91B-1F3FB" }, { "left_facing_fist_tone2", "1F91B-1F3FC" }, { "left_fist_tone2", "1F91B-1F3FC" }, { "left_facing_fist_tone3", "1F91B-1F3FD" }, { "left_fist_tone3", "1F91B-1F3FD" }, { "left_facing_fist_tone4", "1F91B-1F3FE" }, { "left_fist_tone4", "1F91B-1F3FE" }, { "left_facing_fist_tone5", "1F91B-1F3FF" }, { "left_fist_tone5", "1F91B-1F3FF" }, { "left_luggage", "1F6C5" }, { "left_right_arrow", "2194" }, { "leftwards_arrow_with_hook", "21A9" }, { "lemon", "1F34B" }, { "leo", "264C" }, { "leopard", "1F406" }, { "level_slider", "1F39A" }, { "levitate", "1F574" }, { "man_in_business_suit_levitating", "1F574" }, { "libra", "264E" }, { "lifter", "1F3CB" }, { "weight_lifter", "1F3CB" }, { "lifter_tone1", "1F3CB-1F3FB" }, { "weight_lifter_tone1", "1F3CB-1F3FB" }, { "lifter_tone2", "1F3CB-1F3FC" }, { "weight_lifter_tone2", "1F3CB-1F3FC" }, { "lifter_tone3", "1F3CB-1F3FD" }, { "weight_lifter_tone3", "1F3CB-1F3FD" }, { "lifter_tone4", "1F3CB-1F3FE" }, { "weight_lifter_tone4", "1F3CB-1F3FE" }, { "lifter_tone5", "1F3CB-1F3FF" }, { "weight_lifter_tone5", "1F3CB-1F3FF" }, { "light_rail", "1F688" }, { "link", "1F517" }, { "lion_face", "1F981" }, { "lion", "1F981" }, { "lips", "1F444" }, { "lipstick", "1F484" }, { "lizard", "1F98E" }, { "lock", "1F512" }, { "lock_with_ink_pen", "1F50F" }, { "lollipop", "1F36D" }, { "loop", "27BF" }, { "loud_sound", "1F50A" }, { "loudspeaker", "1F4E2" }, { "love_hotel", "1F3E9" }, { "love_letter", "1F48C" }, { "low_brightness", "1F505" }, { "lying_face", "1F925" }, { "liar", "1F925" }, { "m", "24C2" }, { "mag", "1F50D" }, { "mag_right", "1F50E" }, { "mahjong", "1F004" }, { "mailbox", "1F4EB" }, { "mailbox_closed", "1F4EA" }, { "mailbox_with_mail", "1F4EC" }, { "mailbox_with_no_mail", "1F4ED" }, { "man", "1F468" }, { "man_dancing", "1F57A" }, { "male_dancer", "1F57A" }, { "man_dancing_tone1", "1F57A-1F3FB" }, { "male_dancer_tone1", "1F57A-1F3FB" }, { "man_dancing_tone2", "1F57A-1F3FC" }, { "male_dancer_tone2", "1F57A-1F3FC" }, { "man_dancing_tone3", "1F57A-1F3FD" }, { "male_dancer_tone3", "1F57A-1F3FD" }, { "man_dancing_tone4", "1F57A-1F3FE" }, { "male_dancer_tone4", "1F57A-1F3FE" }, { "man_dancing_tone5", "1F57A-1F3FF" }, { "male_dancer_tone5", "1F57A-1F3FF" }, { "man_in_tuxedo", "1F935" }, { "man_in_tuxedo_tone1", "1F935-1F3FB" }, { "tuxedo_tone1", "1F935-1F3FB" }, { "man_in_tuxedo_tone2", "1F935-1F3FC" }, { "tuxedo_tone2", "1F935-1F3FC" }, { "man_in_tuxedo_tone3", "1F935-1F3FD" }, { "tuxedo_tone3", "1F935-1F3FD" }, { "man_in_tuxedo_tone4", "1F935-1F3FE" }, { "tuxedo_tone4", "1F935-1F3FE" }, { "man_in_tuxedo_tone5", "1F935-1F3FF" }, { "tuxedo_tone5", "1F935-1F3FF" }, { "man_tone1", "1F468-1F3FB" }, { "man_tone2", "1F468-1F3FC" }, { "man_tone3", "1F468-1F3FD" }, { "man_tone4", "1F468-1F3FE" }, { "man_tone5", "1F468-1F3FF" }, { "man_with_gua_pi_mao", "1F472" }, { "man_with_gua_pi_mao_tone1", "1F472-1F3FB" }, { "man_with_gua_pi_mao_tone2", "1F472-1F3FC" }, { "man_with_gua_pi_mao_tone3", "1F472-1F3FD" }, { "man_with_gua_pi_mao_tone4", "1F472-1F3FE" }, { "man_with_gua_pi_mao_tone5", "1F472-1F3FF" }, { "man_with_turban", "1F473" }, { "man_with_turban_tone1", "1F473-1F3FB" }, { "man_with_turban_tone2", "1F473-1F3FC" }, { "man_with_turban_tone3", "1F473-1F3FD" }, { "man_with_turban_tone4", "1F473-1F3FE" }, { "man_with_turban_tone5", "1F473-1F3FF" }, { "mans_shoe", "1F45E" }, { "map", "1F5FA" }, { "world_map", "1F5FA" }, { "maple_leaf", "1F341" }, { "martial_arts_uniform", "1F94B" }, { "karate_uniform", "1F94B" }, { "mask", "1F637" }, { "massage", "1F486" }, { "massage_tone1", "1F486-1F3FB" }, { "massage_tone2", "1F486-1F3FC" }, { "massage_tone3", "1F486-1F3FD" }, { "massage_tone4", "1F486-1F3FE" }, { "massage_tone5", "1F486-1F3FF" }, { "meat_on_bone", "1F356" }, { "medal", "1F3C5" }, { "sports_medal", "1F3C5" }, { "mega", "1F4E3" }, { "melon", "1F348" }, { "menorah", "1F54E" }, { "mens", "1F6B9" }, { "metal", "1F918" }, { "sign_of_the_horns", "1F918" }, { "metal_tone1", "1F918-1F3FB" }, { "sign_of_the_horns_tone1", "1F918-1F3FB" }, { "metal_tone2", "1F918-1F3FC" }, { "sign_of_the_horns_tone2", "1F918-1F3FC" }, { "metal_tone3", "1F918-1F3FD" }, { "sign_of_the_horns_tone3", "1F918-1F3FD" }, { "metal_tone4", "1F918-1F3FE" }, { "sign_of_the_horns_tone4", "1F918-1F3FE" }, { "metal_tone5", "1F918-1F3FF" }, { "sign_of_the_horns_tone5", "1F918-1F3FF" }, { "metro", "1F687" }, { "microphone", "1F3A4" }, { "microphone2", "1F399" }, { "studio_microphone", "1F399" }, { "microscope", "1F52C" }, { "middle_finger", "1F595" }, { "reversed_hand_with_middle_finger_extended", "1F595" }, { "middle_finger_tone1", "1F595-1F3FB" }, { "reversed_hand_with_middle_finger_extended_tone1", "1F595-1F3FB" }, { "middle_finger_tone2", "1F595-1F3FC" }, { "reversed_hand_with_middle_finger_extended_tone2", "1F595-1F3FC" }, { "middle_finger_tone3", "1F595-1F3FD" }, { "reversed_hand_with_middle_finger_extended_tone3", "1F595-1F3FD" }, { "middle_finger_tone4", "1F595-1F3FE" }, { "reversed_hand_with_middle_finger_extended_tone4", "1F595-1F3FE" }, { "middle_finger_tone5", "1F595-1F3FF" }, { "reversed_hand_with_middle_finger_extended_tone5", "1F595-1F3FF" }, { "military_medal", "1F396" }, { "milk", "1F95B" }, { "glass_of_milk", "1F95B" }, { "milky_way", "1F30C" }, { "minibus", "1F690" }, { "minidisc", "1F4BD" }, { "mobile_phone_off", "1F4F4" }, { "money_mouth", "1F911" }, { "money_mouth_face", "1F911" }, { "money_with_wings", "1F4B8" }, { "moneybag", "1F4B0" }, { "monkey", "1F412" }, { "monkey_face", "1F435" }, { "monorail", "1F69D" }, { "mortar_board", "1F393" }, { "mosque", "1F54C" }, { "motor_scooter", "1F6F5" }, { "motorbike", "1F6F5" }, { "motorboat", "1F6E5" }, { "motorcycle", "1F3CD" }, { "racing_motorcycle", "1F3CD" }, { "motorway", "1F6E3" }, { "mount_fuji", "1F5FB" }, { "mountain", "26F0" }, { "mountain_bicyclist", "1F6B5" }, { "mountain_bicyclist_tone1", "1F6B5-1F3FB" }, { "mountain_bicyclist_tone2", "1F6B5-1F3FC" }, { "mountain_bicyclist_tone3", "1F6B5-1F3FD" }, { "mountain_bicyclist_tone4", "1F6B5-1F3FE" }, { "mountain_bicyclist_tone5", "1F6B5-1F3FF" }, { "mountain_cableway", "1F6A0" }, { "mountain_railway", "1F69E" }, { "mountain_snow", "1F3D4" }, { "snow_capped_mountain", "1F3D4" }, { "mouse", "1F42D" }, { "mouse_three_button", "1F5B1" }, { "three_button_mouse", "1F5B1" }, { "mouse2", "1F401" }, { "movie_camera", "1F3A5" }, { "moyai", "1F5FF" }, { "mrs_claus", "1F936" }, { "mother_christmas", "1F936" }, { "mrs_claus_tone1", "1F936-1F3FB" }, { "mother_christmas_tone1", "1F936-1F3FB" }, { "mrs_claus_tone2", "1F936-1F3FC" }, { "mother_christmas_tone2", "1F936-1F3FC" }, { "mrs_claus_tone3", "1F936-1F3FD" }, { "mother_christmas_tone3", "1F936-1F3FD" }, { "mrs_claus_tone4", "1F936-1F3FE" }, { "mother_christmas_tone4", "1F936-1F3FE" }, { "mrs_claus_tone5", "1F936-1F3FF" }, { "mother_christmas_tone5", "1F936-1F3FF" }, { "muscle", "1F4AA" }, { "muscle_tone1", "1F4AA-1F3FB" }, { "muscle_tone2", "1F4AA-1F3FC" }, { "muscle_tone3", "1F4AA-1F3FD" }, { "muscle_tone4", "1F4AA-1F3FE" }, { "muscle_tone5", "1F4AA-1F3FF" }, { "mushroom", "1F344" }, { "musical_keyboard", "1F3B9" }, { "musical_note", "1F3B5" }, { "musical_score", "1F3BC" }, { "mute", "1F507" }, { "nail_care", "1F485" }, { "nail_care_tone1", "1F485-1F3FB" }, { "nail_care_tone2", "1F485-1F3FC" }, { "nail_care_tone3", "1F485-1F3FD" }, { "nail_care_tone4", "1F485-1F3FE" }, { "nail_care_tone5", "1F485-1F3FF" }, { "name_badge", "1F4DB" }, { "nauseated_face", "1F922" }, { "sick", "1F922" }, { "necktie", "1F454" }, { "negative_squared_cross_mark", "274E" }, { "nerd", "1F913" }, { "nerd_face", "1F913" }, { "neutral_face", "1F610" }, { "new", "1F195" }, { "new_moon", "1F311" }, { "new_moon_with_face", "1F31A" }, { "newspaper", "1F4F0" }, { "newspaper2", "1F5DE" }, { "rolled_up_newspaper", "1F5DE" }, { "ng", "1F196" }, { "night_with_stars", "1F303" }, { "nine", "0039-20E3" }, { "no_bell", "1F515" }, { "no_bicycles", "1F6B3" }, { "no_entry", "26D4" }, { "no_entry_sign", "1F6AB" }, { "no_good", "1F645" }, { "no_good_tone1", "1F645-1F3FB" }, { "no_good_tone2", "1F645-1F3FC" }, { "no_good_tone3", "1F645-1F3FD" }, { "no_good_tone4", "1F645-1F3FE" }, { "no_good_tone5", "1F645-1F3FF" }, { "no_mobile_phones", "1F4F5" }, { "no_mouth", "1F636" }, { "no_pedestrians", "1F6B7" }, { "no_smoking", "1F6AD" }, { "non-potable_water", "1F6B1" }, { "nose", "1F443" }, { "nose_tone1", "1F443-1F3FB" }, { "nose_tone2", "1F443-1F3FC" }, { "nose_tone3", "1F443-1F3FD" }, { "nose_tone4", "1F443-1F3FE" }, { "nose_tone5", "1F443-1F3FF" }, { "notebook", "1F4D3" }, { "notebook_with_decorative_cover", "1F4D4" }, { "notepad_spiral", "1F5D2" }, { "spiral_note_pad", "1F5D2" }, { "notes", "1F3B6" }, { "nut_and_bolt", "1F529" }, { "o", "2B55" }, { "o2", "1F17E" }, { "ocean", "1F30A" }, { "octagonal_sign", "1F6D1" }, { "stop_sign", "1F6D1" }, { "octopus", "1F419" }, { "oden", "1F362" }, { "office", "1F3E2" }, { "oil", "1F6E2" }, { "oil_drum", "1F6E2" }, { "ok", "1F197" }, { "ok_hand", "1F44C" }, { "ok_hand_tone1", "1F44C-1F3FB" }, { "ok_hand_tone2", "1F44C-1F3FC" }, { "ok_hand_tone3", "1F44C-1F3FD" }, { "ok_hand_tone4", "1F44C-1F3FE" }, { "ok_hand_tone5", "1F44C-1F3FF" }, { "ok_woman", "1F646" }, { "ok_woman_tone1", "1F646-1F3FB" }, { "ok_woman_tone2", "1F646-1F3FC" }, { "ok_woman_tone3", "1F646-1F3FD" }, { "ok_woman_tone4", "1F646-1F3FE" }, { "ok_woman_tone5", "1F646-1F3FF" }, { "older_man", "1F474" }, { "older_man_tone1", "1F474-1F3FB" }, { "older_man_tone2", "1F474-1F3FC" }, { "older_man_tone3", "1F474-1F3FD" }, { "older_man_tone4", "1F474-1F3FE" }, { "older_man_tone5", "1F474-1F3FF" }, { "older_woman", "1F475" }, { "grandma", "1F475" }, { "older_woman_tone1", "1F475-1F3FB" }, { "grandma_tone1", "1F475-1F3FB" }, { "older_woman_tone2", "1F475-1F3FC" }, { "grandma_tone2", "1F475-1F3FC" }, { "older_woman_tone3", "1F475-1F3FD" }, { "grandma_tone3", "1F475-1F3FD" }, { "older_woman_tone4", "1F475-1F3FE" }, { "grandma_tone4", "1F475-1F3FE" }, { "older_woman_tone5", "1F475-1F3FF" }, { "grandma_tone5", "1F475-1F3FF" }, { "om_symbol", "1F549" }, { "on", "1F51B" }, { "oncoming_automobile", "1F698" }, { "oncoming_bus", "1F68D" }, { "oncoming_police_car", "1F694" }, { "oncoming_taxi", "1F696" }, { "one", "0031-20E3" }, { "open_file_folder", "1F4C2" }, { "open_hands", "1F450" }, { "open_hands_tone1", "1F450-1F3FB" }, { "open_hands_tone2", "1F450-1F3FC" }, { "open_hands_tone3", "1F450-1F3FD" }, { "open_hands_tone4", "1F450-1F3FE" }, { "open_hands_tone5", "1F450-1F3FF" }, { "open_mouth", "1F62E" }, { "ophiuchus", "26CE" }, { "orange_book", "1F4D9" }, { "orthodox_cross", "2626" }, { "outbox_tray", "1F4E4" }, { "owl", "1F989" }, { "ox", "1F402" }, { "package", "1F4E6" }, { "page_facing_up", "1F4C4" }, { "page_with_curl", "1F4C3" }, { "pager", "1F4DF" }, { "paintbrush", "1F58C" }, { "lower_left_paintbrush", "1F58C" }, { "palm_tree", "1F334" }, { "pancakes", "1F95E" }, { "panda_face", "1F43C" }, { "paperclip", "1F4CE" }, { "paperclips", "1F587" }, { "linked_paperclips", "1F587" }, { "park", "1F3DE" }, { "national_park", "1F3DE" }, { "parking", "1F17F" }, { "part_alternation_mark", "303D" }, { "partly_sunny", "26C5" }, { "passport_control", "1F6C2" }, { "pause_button", "23F8" }, { "double_vertical_bar", "23F8" }, { "peace", "262E" }, { "peace_symbol", "262E" }, { "peach", "1F351" }, { "peanuts", "1F95C" }, { "shelled_peanut", "1F95C" }, { "pear", "1F350" }, { "pen_ballpoint", "1F58A" }, { "lower_left_ballpoint_pen", "1F58A" }, { "pen_fountain", "1F58B" }, { "lower_left_fountain_pen", "1F58B" }, { "pencil", "1F4DD" }, { "pencil2", "270F" }, { "penguin", "1F427" }, { "pensive", "1F614" }, { "performing_arts", "1F3AD" }, { "persevere", "1F623" }, { "person_frowning", "1F64D" }, { "person_frowning_tone1", "1F64D-1F3FB" }, { "person_frowning_tone2", "1F64D-1F3FC" }, { "person_frowning_tone3", "1F64D-1F3FD" }, { "person_frowning_tone4", "1F64D-1F3FE" }, { "person_frowning_tone5", "1F64D-1F3FF" }, { "person_with_blond_hair", "1F471" }, { "person_with_blond_hair_tone1", "1F471-1F3FB" }, { "person_with_blond_hair_tone2", "1F471-1F3FC" }, { "person_with_blond_hair_tone3", "1F471-1F3FD" }, { "person_with_blond_hair_tone4", "1F471-1F3FE" }, { "person_with_blond_hair_tone5", "1F471-1F3FF" }, { "person_with_pouting_face", "1F64E" }, { "person_with_pouting_face_tone1", "1F64E-1F3FB" }, { "person_with_pouting_face_tone2", "1F64E-1F3FC" }, { "person_with_pouting_face_tone3", "1F64E-1F3FD" }, { "person_with_pouting_face_tone4", "1F64E-1F3FE" }, { "person_with_pouting_face_tone5", "1F64E-1F3FF" }, { "pick", "26CF" }, { "pig", "1F437" }, { "pig_nose", "1F43D" }, { "pig2", "1F416" }, { "pill", "1F48A" }, { "pineapple", "1F34D" }, { "ping_pong", "1F3D3" }, { "table_tennis", "1F3D3" }, { "pisces", "2653" }, { "pizza", "1F355" }, { "place_of_worship", "1F6D0" }, { "worship_symbol", "1F6D0" }, { "play_pause", "23EF" }, { "point_down", "1F447" }, { "point_down_tone1", "1F447-1F3FB" }, { "point_down_tone2", "1F447-1F3FC" }, { "point_down_tone3", "1F447-1F3FD" }, { "point_down_tone4", "1F447-1F3FE" }, { "point_down_tone5", "1F447-1F3FF" }, { "point_left", "1F448" }, { "point_left_tone1", "1F448-1F3FB" }, { "point_left_tone2", "1F448-1F3FC" }, { "point_left_tone3", "1F448-1F3FD" }, { "point_left_tone4", "1F448-1F3FE" }, { "point_left_tone5", "1F448-1F3FF" }, { "point_right", "1F449" }, { "point_right_tone1", "1F449-1F3FB" }, { "point_right_tone2", "1F449-1F3FC" }, { "point_right_tone3", "1F449-1F3FD" }, { "point_right_tone4", "1F449-1F3FE" }, { "point_right_tone5", "1F449-1F3FF" }, { "point_up", "261D" }, { "point_up_2", "1F446" }, { "point_up_2_tone1", "1F446-1F3FB" }, { "point_up_2_tone2", "1F446-1F3FC" }, { "point_up_2_tone3", "1F446-1F3FD" }, { "point_up_2_tone4", "1F446-1F3FE" }, { "point_up_2_tone5", "1F446-1F3FF" }, { "point_up_tone1", "261D-1F3FB" }, { "point_up_tone2", "261D-1F3FC" }, { "point_up_tone3", "261D-1F3FD" }, { "point_up_tone4", "261D-1F3FE" }, { "point_up_tone5", "261D-1F3FF" }, { "police_car", "1F693" }, { "poodle", "1F429" }, { "poop", "1F4A9" }, { "shit", "1F4A9" }, { "hankey", "1F4A9" }, { "poo", "1F4A9" }, { "popcorn", "1F37F" }, { "post_office", "1F3E3" }, { "postal_horn", "1F4EF" }, { "postbox", "1F4EE" }, { "potable_water", "1F6B0" }, { "potato", "1F954" }, { "pouch", "1F45D" }, { "poultry_leg", "1F357" }, { "pound", "1F4B7" }, { "pouting_cat", "1F63E" }, { "pray", "1F64F" }, { "pray_tone1", "1F64F-1F3FB" }, { "pray_tone2", "1F64F-1F3FC" }, { "pray_tone3", "1F64F-1F3FD" }, { "pray_tone4", "1F64F-1F3FE" }, { "pray_tone5", "1F64F-1F3FF" }, { "prayer_beads", "1F4FF" }, { "pregnant_woman", "1F930" }, { "expecting_woman", "1F930" }, { "pregnant_woman_tone1", "1F930-1F3FB" }, { "expecting_woman_tone1", "1F930-1F3FB" }, { "pregnant_woman_tone2", "1F930-1F3FC" }, { "expecting_woman_tone2", "1F930-1F3FC" }, { "pregnant_woman_tone3", "1F930-1F3FD" }, { "expecting_woman_tone3", "1F930-1F3FD" }, { "pregnant_woman_tone4", "1F930-1F3FE" }, { "expecting_woman_tone4", "1F930-1F3FE" }, { "pregnant_woman_tone5", "1F930-1F3FF" }, { "expecting_woman_tone5", "1F930-1F3FF" }, { "prince", "1F934" }, { "prince_tone1", "1F934-1F3FB" }, { "prince_tone2", "1F934-1F3FC" }, { "prince_tone3", "1F934-1F3FD" }, { "prince_tone4", "1F934-1F3FE" }, { "prince_tone5", "1F934-1F3FF" }, { "princess", "1F478" }, { "princess_tone1", "1F478-1F3FB" }, { "princess_tone2", "1F478-1F3FC" }, { "princess_tone3", "1F478-1F3FD" }, { "princess_tone4", "1F478-1F3FE" }, { "princess_tone5", "1F478-1F3FF" }, { "printer", "1F5A8" }, { "projector", "1F4FD" }, { "film_projector", "1F4FD" }, { "punch", "1F44A" }, { "punch_tone1", "1F44A-1F3FB" }, { "punch_tone2", "1F44A-1F3FC" }, { "punch_tone3", "1F44A-1F3FD" }, { "punch_tone4", "1F44A-1F3FE" }, { "punch_tone5", "1F44A-1F3FF" }, { "purple_heart", "1F49C" }, { "purse", "1F45B" }, { "pushpin", "1F4CC" }, { "put_litter_in_its_place", "1F6AE" }, { "question", "2753" }, { "rabbit", "1F430" }, { "rabbit2", "1F407" }, { "race_car", "1F3CE" }, { "racing_car", "1F3CE" }, { "racehorse", "1F40E" }, { "radio", "1F4FB" }, { "radio_button", "1F518" }, { "radioactive", "2622" }, { "radioactive_sign", "2622" }, { "rage", "1F621" }, { "railway_car", "1F683" }, { "railway_track", "1F6E4" }, { "railroad_track", "1F6E4" }, { "rainbow", "1F308" }, { "rainbow_flag", "1F3F3-1F308" }, { "gay_pride_flag", "1F3F3-1F308" }, { "raised_back_of_hand", "1F91A" }, { "back_of_hand", "1F91A" }, { "raised_back_of_hand_tone1", "1F91A-1F3FB" }, { "back_of_hand_tone1", "1F91A-1F3FB" }, { "raised_back_of_hand_tone2", "1F91A-1F3FC" }, { "back_of_hand_tone2", "1F91A-1F3FC" }, { "raised_back_of_hand_tone3", "1F91A-1F3FD" }, { "back_of_hand_tone3", "1F91A-1F3FD" }, { "raised_back_of_hand_tone4", "1F91A-1F3FE" }, { "back_of_hand_tone4", "1F91A-1F3FE" }, { "raised_back_of_hand_tone5", "1F91A-1F3FF" }, { "back_of_hand_tone5", "1F91A-1F3FF" }, { "raised_hand", "270B" }, { "raised_hand_tone1", "270B-1F3FB" }, { "raised_hand_tone2", "270B-1F3FC" }, { "raised_hand_tone3", "270B-1F3FD" }, { "raised_hand_tone4", "270B-1F3FE" }, { "raised_hand_tone5", "270B-1F3FF" }, { "raised_hands", "1F64C" }, { "raised_hands_tone1", "1F64C-1F3FB" }, { "raised_hands_tone2", "1F64C-1F3FC" }, { "raised_hands_tone3", "1F64C-1F3FD" }, { "raised_hands_tone4", "1F64C-1F3FE" }, { "raised_hands_tone5", "1F64C-1F3FF" }, { "raising_hand", "1F64B" }, { "raising_hand_tone1", "1F64B-1F3FB" }, { "raising_hand_tone2", "1F64B-1F3FC" }, { "raising_hand_tone3", "1F64B-1F3FD" }, { "raising_hand_tone4", "1F64B-1F3FE" }, { "raising_hand_tone5", "1F64B-1F3FF" }, { "ram", "1F40F" }, { "ramen", "1F35C" }, { "rat", "1F400" }, { "record_button", "23FA" }, { "recycle", "267B" }, { "red_car", "1F697" }, { "red_circle", "1F534" }, { "regional_indicator_a", "1F1E6" }, { "regional_indicator_b", "1F1E7" }, { "regional_indicator_c", "1F1E8" }, { "regional_indicator_d", "1F1E9" }, { "regional_indicator_e", "1F1EA" }, { "regional_indicator_f", "1F1EB" }, { "regional_indicator_g", "1F1EC" }, { "regional_indicator_h", "1F1ED" }, { "regional_indicator_i", "1F1EE" }, { "regional_indicator_j", "1F1EF" }, { "regional_indicator_k", "1F1F0" }, { "regional_indicator_l", "1F1F1" }, { "regional_indicator_m", "1F1F2" }, { "regional_indicator_n", "1F1F3" }, { "regional_indicator_o", "1F1F4" }, { "regional_indicator_p", "1F1F5" }, { "regional_indicator_q", "1F1F6" }, { "regional_indicator_r", "1F1F7" }, { "regional_indicator_s", "1F1F8" }, { "regional_indicator_t", "1F1F9" }, { "regional_indicator_u", "1F1FA" }, { "regional_indicator_v", "1F1FB" }, { "regional_indicator_w", "1F1FC" }, { "regional_indicator_x", "1F1FD" }, { "regional_indicator_y", "1F1FE" }, { "regional_indicator_z", "1F1FF" }, { "registered", "00AE" }, { "relaxed", "263A" }, { "relieved", "1F60C" }, { "reminder_ribbon", "1F397" }, { "repeat", "1F501" }, { "repeat_one", "1F502" }, { "restroom", "1F6BB" }, { "revolving_hearts", "1F49E" }, { "rewind", "23EA" }, { "rhino", "1F98F" }, { "rhinoceros", "1F98F" }, { "ribbon", "1F380" }, { "rice", "1F35A" }, { "rice_ball", "1F359" }, { "rice_cracker", "1F358" }, { "rice_scene", "1F391" }, { "right_facing_fist", "1F91C" }, { "right_fist", "1F91C" }, { "right_facing_fist_tone1", "1F91C-1F3FB" }, { "right_fist_tone1", "1F91C-1F3FB" }, { "right_facing_fist_tone2", "1F91C-1F3FC" }, { "right_fist_tone2", "1F91C-1F3FC" }, { "right_facing_fist_tone3", "1F91C-1F3FD" }, { "right_fist_tone3", "1F91C-1F3FD" }, { "right_facing_fist_tone4", "1F91C-1F3FE" }, { "right_fist_tone4", "1F91C-1F3FE" }, { "right_facing_fist_tone5", "1F91C-1F3FF" }, { "right_fist_tone5", "1F91C-1F3FF" }, { "ring", "1F48D" }, { "robot", "1F916" }, { "robot_face", "1F916" }, { "rocket", "1F680" }, { "rofl", "1F923" }, { "rolling_on_the_floor_laughing", "1F923" }, { "roller_coaster", "1F3A2" }, { "rolling_eyes", "1F644" }, { "face_with_rolling_eyes", "1F644" }, { "rooster", "1F413" }, { "rose", "1F339" }, { "rosette", "1F3F5" }, { "rotating_light", "1F6A8" }, { "round_pushpin", "1F4CD" }, { "rowboat", "1F6A3" }, { "rowboat_tone1", "1F6A3-1F3FB" }, { "rowboat_tone2", "1F6A3-1F3FC" }, { "rowboat_tone3", "1F6A3-1F3FD" }, { "rowboat_tone4", "1F6A3-1F3FE" }, { "rowboat_tone5", "1F6A3-1F3FF" }, { "rugby_football", "1F3C9" }, { "runner", "1F3C3" }, { "runner_tone1", "1F3C3-1F3FB" }, { "runner_tone2", "1F3C3-1F3FC" }, { "runner_tone3", "1F3C3-1F3FD" }, { "runner_tone4", "1F3C3-1F3FE" }, { "runner_tone5", "1F3C3-1F3FF" }, { "running_shirt_with_sash", "1F3BD" }, { "sa", "1F202" }, { "sagittarius", "2650" }, { "sailboat", "26F5" }, { "sake", "1F376" }, { "salad", "1F957" }, { "green_salad", "1F957" }, { "sandal", "1F461" }, { "santa", "1F385" }, { "santa_tone1", "1F385-1F3FB" }, { "santa_tone2", "1F385-1F3FC" }, { "santa_tone3", "1F385-1F3FD" }, { "santa_tone4", "1F385-1F3FE" }, { "santa_tone5", "1F385-1F3FF" }, { "satellite", "1F4E1" }, { "satellite_orbital", "1F6F0" }, { "saxophone", "1F3B7" }, { "scales", "2696" }, { "school", "1F3EB" }, { "school_satchel", "1F392" }, { "scissors", "2702" }, { "scooter", "1F6F4" }, { "scorpion", "1F982" }, { "scorpius", "264F" }, { "scream", "1F631" }, { "scream_cat", "1F640" }, { "scroll", "1F4DC" }, { "seat", "1F4BA" }, { "second_place", "1F948" }, { "second_place_medal", "1F948" }, { "secret", "3299" }, { "see_no_evil", "1F648" }, { "seedling", "1F331" }, { "selfie", "1F933" }, { "selfie_tone1", "1F933-1F3FB" }, { "selfie_tone2", "1F933-1F3FC" }, { "selfie_tone3", "1F933-1F3FD" }, { "selfie_tone4", "1F933-1F3FE" }, { "selfie_tone5", "1F933-1F3FF" }, { "seven", "0037-20E3" }, { "shallow_pan_of_food", "1F958" }, { "paella", "1F958" }, { "shamrock", "2618" }, { "shark", "1F988" }, { "shaved_ice", "1F367" }, { "sheep", "1F411" }, { "shell", "1F41A" }, { "shield", "1F6E1" }, { "shinto_shrine", "26E9" }, { "ship", "1F6A2" }, { "shirt", "1F455" }, { "shopping_bags", "1F6CD" }, { "shopping_cart", "1F6D2" }, { "shopping_trolley", "1F6D2" }, { "shower", "1F6BF" }, { "shrimp", "1F990" }, { "shrug", "1F937" }, { "shrug_tone1", "1F937-1F3FB" }, { "shrug_tone2", "1F937-1F3FC" }, { "shrug_tone3", "1F937-1F3FD" }, { "shrug_tone4", "1F937-1F3FE" }, { "shrug_tone5", "1F937-1F3FF" }, { "signal_strength", "1F4F6" }, { "six", "0036-20E3" }, { "six_pointed_star", "1F52F" }, { "ski", "1F3BF" }, { "skier", "26F7" }, { "skull", "1F480" }, { "skeleton", "1F480" }, { "skull_crossbones", "2620" }, { "skull_and_crossbones", "2620" }, { "sleeping", "1F634" }, { "sleeping_accommodation", "1F6CC" }, { "sleepy", "1F62A" }, { "slight_frown", "1F641" }, { "slightly_frowning_face", "1F641" }, { "slight_smile", "1F642" }, { "slightly_smiling_face", "1F642" }, { "slot_machine", "1F3B0" }, { "small_blue_diamond", "1F539" }, { "small_orange_diamond", "1F538" }, { "small_red_triangle", "1F53A" }, { "small_red_triangle_down", "1F53B" }, { "smile", "1F604" }, { "smile_cat", "1F638" }, { "smiley", "1F603" }, { "smiley_cat", "1F63A" }, { "smiling_imp", "1F608" }, { "smirk", "1F60F" }, { "smirk_cat", "1F63C" }, { "smoking", "1F6AC" }, { "snail", "1F40C" }, { "snake", "1F40D" }, { "sneezing_face", "1F927" }, { "sneeze", "1F927" }, { "snowboarder", "1F3C2" }, { "snowflake", "2744" }, { "snowman", "26C4" }, { "snowman2", "2603" }, { "sob", "1F62D" }, { "soccer", "26BD" }, { "soon", "1F51C" }, { "sos", "1F198" }, { "sound", "1F509" }, { "space_invader", "1F47E" }, { "spades", "2660" }, { "spaghetti", "1F35D" }, { "sparkle", "2747" }, { "sparkler", "1F387" }, { "sparkles", "2728" }, { "sparkling_heart", "1F496" }, { "speak_no_evil", "1F64A" }, { "speaker", "1F508" }, { "speaking_head", "1F5E3" }, { "speaking_head_in_silhouette", "1F5E3" }, { "speech_balloon", "1F4AC" }, { "speech_left", "1F5E8" }, { "left_speech_bubble", "1F5E8" }, { "speedboat", "1F6A4" }, { "spider", "1F577" }, { "spider_web", "1F578" }, { "spoon", "1F944" }, { "spy", "1F575" }, { "sleuth_or_spy", "1F575" }, { "spy_tone1", "1F575-1F3FB" }, { "sleuth_or_spy_tone1", "1F575-1F3FB" }, { "spy_tone2", "1F575-1F3FC" }, { "sleuth_or_spy_tone2", "1F575-1F3FC" }, { "spy_tone3", "1F575-1F3FD" }, { "sleuth_or_spy_tone3", "1F575-1F3FD" }, { "spy_tone4", "1F575-1F3FE" }, { "sleuth_or_spy_tone4", "1F575-1F3FE" }, { "spy_tone5", "1F575-1F3FF" }, { "sleuth_or_spy_tone5", "1F575-1F3FF" }, { "squid", "1F991" }, { "stadium", "1F3DF" }, { "star", "2B50" }, { "star_and_crescent", "262A" }, { "star_of_david", "2721" }, { "star2", "1F31F" }, { "stars", "1F320" }, { "station", "1F689" }, { "statue_of_liberty", "1F5FD" }, { "steam_locomotive", "1F682" }, { "stew", "1F372" }, { "stop_button", "23F9" }, { "stopwatch", "23F1" }, { "straight_ruler", "1F4CF" }, { "strawberry", "1F353" }, { "stuck_out_tongue", "1F61B" }, { "stuck_out_tongue_closed_eyes", "1F61D" }, { "stuck_out_tongue_winking_eye", "1F61C" }, { "stuffed_flatbread", "1F959" }, { "stuffed_pita", "1F959" }, { "sun_with_face", "1F31E" }, { "sunflower", "1F33B" }, { "sunglasses", "1F60E" }, { "sunny", "2600" }, { "sunrise", "1F305" }, { "sunrise_over_mountains", "1F304" }, { "surfer", "1F3C4" }, { "surfer_tone1", "1F3C4-1F3FB" }, { "surfer_tone2", "1F3C4-1F3FC" }, { "surfer_tone3", "1F3C4-1F3FD" }, { "surfer_tone4", "1F3C4-1F3FE" }, { "surfer_tone5", "1F3C4-1F3FF" }, { "sushi", "1F363" }, { "suspension_railway", "1F69F" }, { "sweat", "1F613" }, { "sweat_drops", "1F4A6" }, { "sweat_smile", "1F605" }, { "sweet_potato", "1F360" }, { "swimmer", "1F3CA" }, { "swimmer_tone1", "1F3CA-1F3FB" }, { "swimmer_tone2", "1F3CA-1F3FC" }, { "swimmer_tone3", "1F3CA-1F3FD" }, { "swimmer_tone4", "1F3CA-1F3FE" }, { "swimmer_tone5", "1F3CA-1F3FF" }, { "symbols", "1F523" }, { "synagogue", "1F54D" }, { "syringe", "1F489" }, { "taco", "1F32E" }, { "tada", "1F389" }, { "tanabata_tree", "1F38B" }, { "tangerine", "1F34A" }, { "taurus", "2649" }, { "taxi", "1F695" }, { "tea", "1F375" }, { "telephone", "260E" }, { "telephone_receiver", "1F4DE" }, { "telescope", "1F52D" }, { "tennis", "1F3BE" }, { "tent", "26FA" }, { "thermometer", "1F321" }, { "thermometer_face", "1F912" }, { "face_with_thermometer", "1F912" }, { "thinking", "1F914" }, { "thinking_face", "1F914" }, { "third_place", "1F949" }, { "third_place_medal", "1F949" }, { "thought_balloon", "1F4AD" }, { "three", "0033-20E3" }, { "thumbsdown", "1F44E" }, { "-1", "1F44E" }, { "thumbdown", "1F44E" }, { "thumbsdown_tone1", "1F44E-1F3FB" }, { "-1_tone1", "1F44E-1F3FB" }, { "thumbdown_tone1", "1F44E-1F3FB" }, { "thumbsdown_tone2", "1F44E-1F3FC" }, { "-1_tone2", "1F44E-1F3FC" }, { "thumbdown_tone2", "1F44E-1F3FC" }, { "thumbsdown_tone3", "1F44E-1F3FD" }, { "-1_tone3", "1F44E-1F3FD" }, { "thumbdown_tone3", "1F44E-1F3FD" }, { "thumbsdown_tone4", "1F44E-1F3FE" }, { "-1_tone4", "1F44E-1F3FE" }, { "thumbdown_tone4", "1F44E-1F3FE" }, { "thumbsdown_tone5", "1F44E-1F3FF" }, { "-1_tone5", "1F44E-1F3FF" }, { "thumbdown_tone5", "1F44E-1F3FF" }, { "thumbsup", "1F44D" }, { "+1", "1F44D" }, { "thumbup", "1F44D" }, { "thumbsup_tone1", "1F44D-1F3FB" }, { "+1_tone1", "1F44D-1F3FB" }, { "thumbup_tone1", "1F44D-1F3FB" }, { "thumbsup_tone2", "1F44D-1F3FC" }, { "+1_tone2", "1F44D-1F3FC" }, { "thumbup_tone2", "1F44D-1F3FC" }, { "thumbsup_tone3", "1F44D-1F3FD" }, { "+1_tone3", "1F44D-1F3FD" }, { "thumbup_tone3", "1F44D-1F3FD" }, { "thumbsup_tone4", "1F44D-1F3FE" }, { "+1_tone4", "1F44D-1F3FE" }, { "thumbup_tone4", "1F44D-1F3FE" }, { "thumbsup_tone5", "1F44D-1F3FF" }, { "+1_tone5", "1F44D-1F3FF" }, { "thumbup_tone5", "1F44D-1F3FF" }, { "thunder_cloud_rain", "26C8" }, { "thunder_cloud_and_rain", "26C8" }, { "ticket", "1F3AB" }, { "tickets", "1F39F" }, { "admission_tickets", "1F39F" }, { "tiger", "1F42F" }, { "tiger2", "1F405" }, { "timer", "23F2" }, { "timer_clock", "23F2" }, { "tired_face", "1F62B" }, { "tm", "2122" }, { "toilet", "1F6BD" }, { "tokyo_tower", "1F5FC" }, { "tomato", "1F345" }, { "tone1", "1F3FB" }, { "tone2", "1F3FC" }, { "tone3", "1F3FD" }, { "tone4", "1F3FE" }, { "tone5", "1F3FF" }, { "tongue", "1F445" }, { "tools", "1F6E0" }, { "hammer_and_wrench", "1F6E0" }, { "top", "1F51D" }, { "tophat", "1F3A9" }, { "track_next", "23ED" }, { "next_track", "23ED" }, { "track_previous", "23EE" }, { "previous_track", "23EE" }, { "trackball", "1F5B2" }, { "tractor", "1F69C" }, { "traffic_light", "1F6A5" }, { "train", "1F68B" }, { "train2", "1F686" }, { "tram", "1F68A" }, { "triangular_flag_on_post", "1F6A9" }, { "triangular_ruler", "1F4D0" }, { "trident", "1F531" }, { "triumph", "1F624" }, { "trolleybus", "1F68E" }, { "trophy", "1F3C6" }, { "tropical_drink", "1F379" }, { "tropical_fish", "1F420" }, { "truck", "1F69A" }, { "trumpet", "1F3BA" }, { "tulip", "1F337" }, { "tumbler_glass", "1F943" }, { "whisky", "1F943" }, { "turkey", "1F983" }, { "turtle", "1F422" }, { "tv", "1F4FA" }, { "twisted_rightwards_arrows", "1F500" }, { "two", "0032-20E3" }, { "two_hearts", "1F495" }, { "two_men_holding_hands", "1F46C" }, { "two_women_holding_hands", "1F46D" }, { "u5272", "1F239" }, { "u5408", "1F234" }, { "u55b6", "1F23A" }, { "u6307", "1F22F" }, { "u6708", "1F237" }, { "u6709", "1F236" }, { "u6e80", "1F235" }, { "u7121", "1F21A" }, { "u7533", "1F238" }, { "u7981", "1F232" }, { "u7a7a", "1F233" }, { "umbrella", "2614" }, { "umbrella2", "2602" }, { "unamused", "1F612" }, { "underage", "1F51E" }, { "unicorn", "1F984" }, { "unicorn_face", "1F984" }, { "unlock", "1F513" }, { "up", "1F199" }, { "upside_down", "1F643" }, { "upside_down_face", "1F643" }, { "urn", "26B1" }, { "funeral_urn", "26B1" }, { "v", "270C" }, { "v_tone1", "270C-1F3FB" }, { "v_tone2", "270C-1F3FC" }, { "v_tone3", "270C-1F3FD" }, { "v_tone4", "270C-1F3FE" }, { "v_tone5", "270C-1F3FF" }, { "vertical_traffic_light", "1F6A6" }, { "vhs", "1F4FC" }, { "vibration_mode", "1F4F3" }, { "video_camera", "1F4F9" }, { "video_game", "1F3AE" }, { "violin", "1F3BB" }, { "virgo", "264D" }, { "volcano", "1F30B" }, { "volleyball", "1F3D0" }, { "vs", "1F19A" }, { "vulcan", "1F596" }, { "raised_hand_with_part_between_middle_and_ring_fingers", "1F596" }, { "vulcan_tone1", "1F596-1F3FB" }, { "raised_hand_with_part_between_middle_and_ring_fingers_tone1", "1F596-1F3FB" }, { "vulcan_tone2", "1F596-1F3FC" }, { "raised_hand_with_part_between_middle_and_ring_fingers_tone2", "1F596-1F3FC" }, { "vulcan_tone3", "1F596-1F3FD" }, { "raised_hand_with_part_between_middle_and_ring_fingers_tone3", "1F596-1F3FD" }, { "vulcan_tone4", "1F596-1F3FE" }, { "raised_hand_with_part_between_middle_and_ring_fingers_tone4", "1F596-1F3FE" }, { "vulcan_tone5", "1F596-1F3FF" }, { "raised_hand_with_part_between_middle_and_ring_fingers_tone5", "1F596-1F3FF" }, { "walking", "1F6B6" }, { "walking_tone1", "1F6B6-1F3FB" }, { "walking_tone2", "1F6B6-1F3FC" }, { "walking_tone3", "1F6B6-1F3FD" }, { "walking_tone4", "1F6B6-1F3FE" }, { "walking_tone5", "1F6B6-1F3FF" }, { "waning_crescent_moon", "1F318" }, { "waning_gibbous_moon", "1F316" }, { "warning", "26A0" }, { "wastebasket", "1F5D1" }, { "watch", "231A" }, { "water_buffalo", "1F403" }, { "water_polo", "1F93D" }, { "water_polo_tone1", "1F93D-1F3FB" }, { "water_polo_tone2", "1F93D-1F3FC" }, { "water_polo_tone3", "1F93D-1F3FD" }, { "water_polo_tone4", "1F93D-1F3FE" }, { "water_polo_tone5", "1F93D-1F3FF" }, { "watermelon", "1F349" }, { "wave", "1F44B" }, { "wave_tone1", "1F44B-1F3FB" }, { "wave_tone2", "1F44B-1F3FC" }, { "wave_tone3", "1F44B-1F3FD" }, { "wave_tone4", "1F44B-1F3FE" }, { "wave_tone5", "1F44B-1F3FF" }, { "wavy_dash", "3030" }, { "waxing_crescent_moon", "1F312" }, { "waxing_gibbous_moon", "1F314" }, { "wc", "1F6BE" }, { "weary", "1F629" }, { "wedding", "1F492" }, { "whale", "1F433" }, { "whale2", "1F40B" }, { "wheel_of_dharma", "2638" }, { "wheelchair", "267F" }, { "white_check_mark", "2705" }, { "white_circle", "26AA" }, { "white_flower", "1F4AE" }, { "white_large_square", "2B1C" }, { "white_medium_small_square", "25FD" }, { "white_medium_square", "25FB" }, { "white_small_square", "25AB" }, { "white_square_button", "1F533" }, { "white_sun_cloud", "1F325" }, { "white_sun_behind_cloud", "1F325" }, { "white_sun_rain_cloud", "1F326" }, { "white_sun_behind_cloud_with_rain", "1F326" }, { "white_sun_small_cloud", "1F324" }, { "white_sun_with_small_cloud", "1F324" }, { "wilted_rose", "1F940" }, { "wilted_flower", "1F940" }, { "wind_blowing_face", "1F32C" }, { "wind_chime", "1F390" }, { "wine_glass", "1F377" }, { "wink", "1F609" }, { "wolf", "1F43A" }, { "woman", "1F469" }, { "woman_tone1", "1F469-1F3FB" }, { "woman_tone2", "1F469-1F3FC" }, { "woman_tone3", "1F469-1F3FD" }, { "woman_tone4", "1F469-1F3FE" }, { "woman_tone5", "1F469-1F3FF" }, { "womans_clothes", "1F45A" }, { "womans_hat", "1F452" }, { "womens", "1F6BA" }, { "worried", "1F61F" }, { "wrench", "1F527" }, { "wrestlers", "1F93C" }, { "wrestling", "1F93C" }, { "wrestlers_tone1", "1F93C-1F3FB" }, { "wrestling_tone1", "1F93C-1F3FB" }, { "wrestlers_tone2", "1F93C-1F3FC" }, { "wrestling_tone2", "1F93C-1F3FC" }, { "wrestlers_tone3", "1F93C-1F3FD" }, { "wrestling_tone3", "1F93C-1F3FD" }, { "wrestlers_tone4", "1F93C-1F3FE" }, { "wrestling_tone4", "1F93C-1F3FE" }, { "wrestlers_tone5", "1F93C-1F3FF" }, { "wrestling_tone5", "1F93C-1F3FF" }, { "writing_hand", "270D" }, { "writing_hand_tone1", "270D-1F3FB" }, { "writing_hand_tone2", "270D-1F3FC" }, { "writing_hand_tone3", "270D-1F3FD" }, { "writing_hand_tone4", "270D-1F3FE" }, { "writing_hand_tone5", "270D-1F3FF" }, { "x", "274C" }, { "yellow_heart", "1F49B" }, { "yen", "1F4B4" }, { "yin_yang", "262F" }, { "yum", "1F60B" }, { "zap", "26A1" }, { "zero", "0030-20E3" }, { "zipper_mouth", "1F910" }, { "zipper_mouth_face", "1F910" }, { "zzz", "1F4A4" }, }; } } smuxi-1.1/src/Common/ITraceable.cs0000644000175000017500000000246012726351313017664 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2005-2006 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; namespace Smuxi.Common { public interface ITraceable { string ToTraceString(); } } smuxi-1.1/src/Common/Platform.cs0000664000175000017500000002141214011472672017456 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2010-2013, 2021 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.IO; using System.Text.RegularExpressions; using System.Diagnostics; namespace Smuxi.Common { public static class Platform { public static string OperatingSystem { get; private set; } public static bool IsWindows { get; private set; } public static bool IsMacOSX { get; private set; } public static bool IsLinux { get; private set; } public static bool IsMono { get; private set; } public static string Architecture { get { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { // x86 // AMD64 var arch = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"); if (!String.IsNullOrEmpty(arch)) { return arch; } arch = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); if (!String.IsNullOrEmpty(arch)) { return arch; } } // uname present? try { var pinfo = new ProcessStartInfo("uname"); pinfo.UseShellExecute = false; pinfo.RedirectStandardOutput = true; Process.Start(pinfo).WaitForExit(); } catch (Exception) { // no uname, fall back to pointer size return String.Format("{0}-bit", IntPtr.Size * 8); } // i386 // i686 // x86_64 var info = new ProcessStartInfo("uname", "-m"); info.UseShellExecute = false; info.RedirectStandardOutput = true; var process = Process.Start(info); process.WaitForExit(); if (process.ExitCode == 0) { return process.StandardOutput.ReadLine(); } return "Unknown"; } } public static string LogPath { get { var logPath = Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ); logPath = Path.Combine(logPath, "smuxi"); // FIXME: include session username logPath = Path.Combine(logPath, "logs"); return logPath; } } public static string CachePath { get { string cachePath = null; if (Environment.OSVersion.Platform == PlatformID.Win32NT) { cachePath = Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ); cachePath = Path.Combine(cachePath, "smuxi"); cachePath = Path.Combine(cachePath, "cache"); } else { var home = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var xdgCache = Environment.GetEnvironmentVariable("XDG_CACHE_HOME"); if (String.IsNullOrEmpty(xdgCache)) { xdgCache = Path.Combine(home, ".cache"); } cachePath = Path.Combine(xdgCache, "smuxi"); } if (!Directory.Exists(cachePath)) { Directory.CreateDirectory(cachePath); } return cachePath; } } static Platform() { OperatingSystem = GetOperatingSystem(); IsWindows = Environment.OSVersion.Platform == PlatformID.Win32NT; IsMacOSX = OperatingSystem == "Darwin"; // OS might return GNU/Linux or Linux IsLinux = OperatingSystem.Contains("Linux"); IsMono = Type.GetType("Mono.Runtime") != null; } public static string GetOperatingSystem() { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { return Environment.OSVersion.Platform.ToString(); } // uname present? try { var pinfo = new ProcessStartInfo("uname"); pinfo.UseShellExecute = false; pinfo.RedirectStandardOutput = true; pinfo.RedirectStandardError = true; Process.Start(pinfo).WaitForExit(); } catch (Exception) { // fall back to runtime detector return Environment.OSVersion.Platform.ToString(); } string os = null; // GNU/Linux // GNU/kFreeBSD // Cygwin var info = new ProcessStartInfo("uname", "-o"); info.UseShellExecute = false; info.RedirectStandardOutput = true; info.RedirectStandardError = true; var process = Process.Start(info); process.WaitForExit(); if (process.ExitCode == 0) { os = process.StandardOutput.ReadLine(); // HACK: if Cygwin was installed on Windows and is in PATH // we should not trust uname and ask the runtime instead if (os == "Cygwin") { return Environment.OSVersion.Platform.ToString(); } } if (String.IsNullOrEmpty(os)) { // not all operating systems support -o so lets fallback to -s // Linux // FreeBSD // Darwin info = new ProcessStartInfo("uname", "-s"); info.UseShellExecute = false; info.RedirectStandardOutput = true; info.RedirectStandardError = true; process = Process.Start(info); process.WaitForExit(); if (process.ExitCode == 0) { os = process.StandardOutput.ReadLine(); } } if (String.IsNullOrEmpty(os)) { return "Unknown"; } string distro = null; try { info = new ProcessStartInfo("lsb_release", "-i"); info.UseShellExecute = false; info.RedirectStandardOutput = true; info.RedirectStandardError = true; process = Process.Start(info); process.WaitForExit(); if (process.ExitCode == 0) { distro = process.StandardOutput.ReadLine(); var match = Regex.Match(distro, @"^Distributor ID:\s+(.+)"); if (match.Success && match.Groups.Count > 1) { distro = match.Groups[1].Value; } else { distro = null; } } } catch (Exception) { } if (String.IsNullOrEmpty(distro)) { return os; } return String.Format("{0} ({1})", os, distro); } public static string GetBuffersPath(string username) { var dbPath = GetBuffersBasePath(); dbPath = Path.Combine(dbPath, IOSecurity.GetFilteredPath(username)); return dbPath; } public static string GetBuffersBasePath() { var dbPath = Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ); dbPath = Path.Combine(dbPath, "smuxi"); dbPath = Path.Combine(dbPath, "buffers"); return dbPath; } } } smuxi-1.1/src/Common/LibraryCatalog.cs0000644000175000017500000000467312726351313020600 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Copyright (c) 2008 Mirco Bauer // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using Mono.Unix; namespace Smuxi.Common { public class LibraryCatalog { private static Object _SyncRoot = new Object(); private static string _TextDomain; private static string _LocaleDirectory; private static bool _IsInitialized; private LibraryCatalog() { } public static void Init(string textDomain, string localeDirectory) { _TextDomain = textDomain; _LocaleDirectory = localeDirectory; Catalog.Init(textDomain, localeDirectory); _IsInitialized = true; } public static string GetString(string s, string textDomain) { lock (_SyncRoot) { if (_IsInitialized) { Catalog.Init(textDomain, _LocaleDirectory); string msg = Catalog.GetString(s); Catalog.Init(_TextDomain, _LocaleDirectory); return msg; } return s; } } public static string GetString(string s) { // TODO: use text-domain registry for each calling assembly or class throw new NotImplementedException(); } } } smuxi-1.1/src/Common/NDesk.Options.cs0000644000175000017500000007674512726351313020350 0ustar00meebeymeebey00000000000000// This file is part of Smuxi and is licensed under the terms of MIT/X11 // // Authors: // Jonathan Pryor // // Copyright (C) 2008 Novell (http://www.novell.com) // // 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 AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // Compile With: // gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll // gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll // // The LINQ version just changes the implementation of // OptionSet.Parse(IEnumerable), and confers no semantic changes. // // A Getopt::Long-inspired option parsing library for C#. // // NDesk.Options.OptionSet is built upon a key/value table, where the // key is a option format string and the value is a delegate that is // invoked when the format string is matched. // // Option format strings: // Regex-like BNF Grammar: // name: .+ // type: [=:] // sep: ( [^{}]+ | '{' .+ '}' )? // aliases: ( name type sep ) ( '|' name type sep )* // // Each '|'-delimited name is an alias for the associated action. If the // format string ends in a '=', it has a required value. If the format // string ends in a ':', it has an optional value. If neither '=' or ':' // is present, no value is supported. `=' or `:' need only be defined on one // alias, but if they are provided on more than one they must be consistent. // // Each alias portion may also end with a "key/value separator", which is used // to split option values if the option accepts > 1 value. If not specified, // it defaults to '=' and ':'. If specified, it can be any character except // '{' and '}' OR the *string* between '{' and '}'. If no separator should be // used (i.e. the separate values should be distinct arguments), then "{}" // should be used as the separator. // // Options are extracted either from the current option by looking for // the option name followed by an '=' or ':', or is taken from the // following option IFF: // - The current option does not contain a '=' or a ':' // - The current option requires a value (i.e. not a Option type of ':') // // The `name' used in the option format string does NOT include any leading // option indicator, such as '-', '--', or '/'. All three of these are // permitted/required on any named option. // // Option bundling is permitted so long as: // - '-' is used to start the option group // - all of the bundled options are a single character // - at most one of the bundled options accepts a value, and the value // provided starts from the next character to the end of the string. // // This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' // as '-Dname=value'. // // Option processing is disabled by specifying "--". All options after "--" // are returned by OptionSet.Parse() unchanged and unprocessed. // // Unprocessed options are returned from OptionSet.Parse(). // // Examples: // int verbose = 0; // OptionSet p = new OptionSet () // .Add ("v", v => ++verbose) // .Add ("name=|value=", v => Console.WriteLine (v)); // p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); // // The above would parse the argument string array, and would invoke the // lambda expression three times, setting `verbose' to 3 when complete. // It would also print out "A" and "B" to standard output. // The returned array would contain the string "extra". // // C# 3.0 collection initializers are supported and encouraged: // var p = new OptionSet () { // { "h|?|help", v => ShowHelp () }, // }; // // System.ComponentModel.TypeConverter is also supported, allowing the use of // custom data types in the callback type; TypeConverter.ConvertFromString() // is used to convert the value option to an instance of the specified // type: // // var p = new OptionSet () { // { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, // }; // // Random other tidbits: // - Boolean options (those w/o '=' or ':' in the option format string) // are explicitly enabled if they are followed with '+', and explicitly // disabled if they are followed with '-': // string a = null; // var p = new OptionSet () { // { "a", s => a = s }, // }; // p.Parse (new string[]{"-a"}); // sets v != null // p.Parse (new string[]{"-a+"}); // sets v != null // p.Parse (new string[]{"-a-"}); // sets v == null // using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Globalization; using System.IO; using System.Runtime.Serialization; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; #if LINQ using System.Linq; #endif #if TEST using NDesk.Options; #endif #if NDESK_OPTIONS namespace NDesk.Options #else namespace Mono.Options #endif { public class OptionValueCollection : IList, IList { List values = new List (); OptionContext c; internal OptionValueCollection (OptionContext c) { this.c = c; } #region ICollection void ICollection.CopyTo (Array array, int index) {(values as ICollection).CopyTo (array, index);} bool ICollection.IsSynchronized {get {return (values as ICollection).IsSynchronized;}} object ICollection.SyncRoot {get {return (values as ICollection).SyncRoot;}} #endregion #region ICollection public void Add (string item) {values.Add (item);} public void Clear () {values.Clear ();} public bool Contains (string item) {return values.Contains (item);} public void CopyTo (string[] array, int arrayIndex) {values.CopyTo (array, arrayIndex);} public bool Remove (string item) {return values.Remove (item);} public int Count {get {return values.Count;}} public bool IsReadOnly {get {return false;}} #endregion #region IEnumerable IEnumerator IEnumerable.GetEnumerator () {return values.GetEnumerator ();} #endregion #region IEnumerable public IEnumerator GetEnumerator () {return values.GetEnumerator ();} #endregion #region IList int IList.Add (object value) {return (values as IList).Add (value);} bool IList.Contains (object value) {return (values as IList).Contains (value);} int IList.IndexOf (object value) {return (values as IList).IndexOf (value);} void IList.Insert (int index, object value) {(values as IList).Insert (index, value);} void IList.Remove (object value) {(values as IList).Remove (value);} void IList.RemoveAt (int index) {(values as IList).RemoveAt (index);} bool IList.IsFixedSize {get {return false;}} object IList.this [int index] {get {return this [index];} set {(values as IList)[index] = value;}} #endregion #region IList public int IndexOf (string item) {return values.IndexOf (item);} public void Insert (int index, string item) {values.Insert (index, item);} public void RemoveAt (int index) {values.RemoveAt (index);} private void AssertValid (int index) { if (c.Option == null) throw new InvalidOperationException ("OptionContext.Option is null."); if (index >= c.Option.MaxValueCount) throw new ArgumentOutOfRangeException ("index"); if (c.Option.OptionValueType == OptionValueType.Required && index >= values.Count) throw new OptionException (string.Format ( c.OptionSet.MessageLocalizer ("Missing required value for option '{0}'."), c.OptionName), c.OptionName); } public string this [int index] { get { AssertValid (index); return index >= values.Count ? null : values [index]; } set { values [index] = value; } } #endregion public List ToList () { return new List (values); } public string[] ToArray () { return values.ToArray (); } public override string ToString () { return string.Join (", ", values.ToArray ()); } } public class OptionContext { private Option option; private string name; private int index; private OptionSet set; private OptionValueCollection c; public OptionContext (OptionSet set) { this.set = set; this.c = new OptionValueCollection (this); } public Option Option { get {return option;} set {option = value;} } public string OptionName { get {return name;} set {name = value;} } public int OptionIndex { get {return index;} set {index = value;} } public OptionSet OptionSet { get {return set;} } public OptionValueCollection OptionValues { get {return c;} } } public enum OptionValueType { None, Optional, Required, } public abstract class Option { string prototype, description; string[] names; OptionValueType type; int count; string[] separators; protected Option (string prototype, string description) : this (prototype, description, 1) { } protected Option (string prototype, string description, int maxValueCount) { if (prototype == null) throw new ArgumentNullException ("prototype"); if (prototype.Length == 0) throw new ArgumentException ("Cannot be the empty string.", "prototype"); if (maxValueCount < 0) throw new ArgumentOutOfRangeException ("maxValueCount"); this.prototype = prototype; this.names = prototype.Split ('|'); this.description = description; this.count = maxValueCount; this.type = ParsePrototype (); if (this.count == 0 && type != OptionValueType.None) throw new ArgumentException ( "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + "OptionValueType.Optional.", "maxValueCount"); if (this.type == OptionValueType.None && maxValueCount > 1) throw new ArgumentException ( string.Format ("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), "maxValueCount"); if (Array.IndexOf (names, "<>") >= 0 && ((names.Length == 1 && this.type != OptionValueType.None) || (names.Length > 1 && this.MaxValueCount > 1))) throw new ArgumentException ( "The default option handler '<>' cannot require values.", "prototype"); } public string Prototype {get {return prototype;}} public string Description {get {return description;}} public OptionValueType OptionValueType {get {return type;}} public int MaxValueCount {get {return count;}} public string[] GetNames () { return (string[]) names.Clone (); } public string[] GetValueSeparators () { if (separators == null) return new string [0]; return (string[]) separators.Clone (); } protected static T Parse (string value, OptionContext c) { Type tt = typeof (T); bool nullable = tt.IsValueType && tt.IsGenericType && !tt.IsGenericTypeDefinition && tt.GetGenericTypeDefinition () == typeof (Nullable<>); Type targetType = nullable ? tt.GetGenericArguments () [0] : typeof (T); TypeConverter conv = TypeDescriptor.GetConverter (targetType); T t = default (T); try { if (value != null) t = (T) conv.ConvertFromString (value); } catch (Exception e) { throw new OptionException ( string.Format ( c.OptionSet.MessageLocalizer ("Could not convert string `{0}' to type {1} for option `{2}'."), value, targetType.Name, c.OptionName), c.OptionName, e); } return t; } internal string[] Names {get {return names;}} internal string[] ValueSeparators {get {return separators;}} static readonly char[] NameTerminator = new char[]{'=', ':'}; private OptionValueType ParsePrototype () { char type = '\0'; List seps = new List (); for (int i = 0; i < names.Length; ++i) { string name = names [i]; if (name.Length == 0) throw new ArgumentException ("Empty option names are not supported.", "prototype"); int end = name.IndexOfAny (NameTerminator); if (end == -1) continue; names [i] = name.Substring (0, end); if (type == '\0' || type == name [end]) type = name [end]; else throw new ArgumentException ( string.Format ("Conflicting option types: '{0}' vs. '{1}'.", type, name [end]), "prototype"); AddSeparators (name, end, seps); } if (type == '\0') return OptionValueType.None; if (count <= 1 && seps.Count != 0) throw new ArgumentException ( string.Format ("Cannot provide key/value separators for Options taking {0} value(s).", count), "prototype"); if (count > 1) { if (seps.Count == 0) this.separators = new string[]{":", "="}; else if (seps.Count == 1 && seps [0].Length == 0) this.separators = null; else this.separators = seps.ToArray (); } return type == '=' ? OptionValueType.Required : OptionValueType.Optional; } private static void AddSeparators (string name, int end, ICollection seps) { int start = -1; for (int i = end+1; i < name.Length; ++i) { switch (name [i]) { case '{': if (start != -1) throw new ArgumentException ( string.Format ("Ill-formed name/value separator found in \"{0}\".", name), "prototype"); start = i+1; break; case '}': if (start == -1) throw new ArgumentException ( string.Format ("Ill-formed name/value separator found in \"{0}\".", name), "prototype"); seps.Add (name.Substring (start, i-start)); start = -1; break; default: if (start == -1) seps.Add (name [i].ToString ()); break; } } if (start != -1) throw new ArgumentException ( string.Format ("Ill-formed name/value separator found in \"{0}\".", name), "prototype"); } public void Invoke (OptionContext c) { OnParseComplete (c); c.OptionName = null; c.Option = null; c.OptionValues.Clear (); } protected abstract void OnParseComplete (OptionContext c); public override string ToString () { return Prototype; } } [Serializable] public class OptionException : Exception { private string option; public OptionException () { } public OptionException (string message, string optionName) : base (message) { this.option = optionName; } public OptionException (string message, string optionName, Exception innerException) : base (message, innerException) { this.option = optionName; } protected OptionException (SerializationInfo info, StreamingContext context) : base (info, context) { this.option = info.GetString ("OptionName"); } public string OptionName { get {return this.option;} } [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)] public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("OptionName", option); } } public delegate void OptionAction (TKey key, TValue value); public class OptionSet : KeyedCollection { public OptionSet () : this (delegate (string f) {return f;}) { } public OptionSet (Converter localizer) { this.localizer = localizer; } Converter localizer; public Converter MessageLocalizer { get {return localizer;} } protected override string GetKeyForItem (Option item) { if (item == null) throw new ArgumentNullException ("option"); if (item.Names != null && item.Names.Length > 0) return item.Names [0]; // This should never happen, as it's invalid for Option to be // constructed w/o any names. throw new InvalidOperationException ("Option has no names!"); } [Obsolete ("Use KeyedCollection.this[string]")] protected Option GetOptionForName (string option) { if (option == null) throw new ArgumentNullException ("option"); try { return base [option]; } catch (KeyNotFoundException) { return null; } } protected override void InsertItem (int index, Option item) { base.InsertItem (index, item); AddImpl (item); } protected override void RemoveItem (int index) { base.RemoveItem (index); Option p = Items [index]; // KeyedCollection.RemoveItem() handles the 0th item for (int i = 1; i < p.Names.Length; ++i) { Dictionary.Remove (p.Names [i]); } } protected override void SetItem (int index, Option item) { base.SetItem (index, item); RemoveItem (index); AddImpl (item); } private void AddImpl (Option option) { if (option == null) throw new ArgumentNullException ("option"); List added = new List (option.Names.Length); try { // KeyedCollection.InsertItem/SetItem handle the 0th name. for (int i = 1; i < option.Names.Length; ++i) { Dictionary.Add (option.Names [i], option); added.Add (option.Names [i]); } } catch (Exception) { foreach (string name in added) Dictionary.Remove (name); throw; } } public new OptionSet Add (Option option) { base.Add (option); return this; } sealed class ActionOption : Option { Action action; public ActionOption (string prototype, string description, int count, Action action) : base (prototype, description, count) { if (action == null) throw new ArgumentNullException ("action"); this.action = action; } protected override void OnParseComplete (OptionContext c) { action (c.OptionValues); } } public OptionSet Add (string prototype, Action action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, Action action) { if (action == null) throw new ArgumentNullException ("action"); Option p = new ActionOption (prototype, description, 1, delegate (OptionValueCollection v) { action (v [0]); }); base.Add (p); return this; } public OptionSet Add (string prototype, OptionAction action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, OptionAction action) { if (action == null) throw new ArgumentNullException ("action"); Option p = new ActionOption (prototype, description, 2, delegate (OptionValueCollection v) {action (v [0], v [1]);}); base.Add (p); return this; } sealed class ActionOption : Option { Action action; public ActionOption (string prototype, string description, Action action) : base (prototype, description, 1) { if (action == null) throw new ArgumentNullException ("action"); this.action = action; } protected override void OnParseComplete (OptionContext c) { action (Parse (c.OptionValues [0], c)); } } sealed class ActionOption : Option { OptionAction action; public ActionOption (string prototype, string description, OptionAction action) : base (prototype, description, 2) { if (action == null) throw new ArgumentNullException ("action"); this.action = action; } protected override void OnParseComplete (OptionContext c) { action ( Parse (c.OptionValues [0], c), Parse (c.OptionValues [1], c)); } } public OptionSet Add (string prototype, Action action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, Action action) { return Add (new ActionOption (prototype, description, action)); } public OptionSet Add (string prototype, OptionAction action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, OptionAction action) { return Add (new ActionOption (prototype, description, action)); } protected virtual OptionContext CreateOptionContext () { return new OptionContext (this); } #if LINQ public List Parse (IEnumerable arguments) { bool process = true; OptionContext c = CreateOptionContext (); c.OptionIndex = -1; var def = GetOptionForName ("<>"); var unprocessed = from argument in arguments where ++c.OptionIndex >= 0 && (process || def != null) ? process ? argument == "--" ? (process = false) : !Parse (argument, c) ? def != null ? Unprocessed (null, def, c, argument) : true : false : def != null ? Unprocessed (null, def, c, argument) : true : true select argument; List r = unprocessed.ToList (); if (c.Option != null) c.Option.Invoke (c); return r; } #else public List Parse (IEnumerable arguments) { OptionContext c = CreateOptionContext (); c.OptionIndex = -1; bool process = true; List unprocessed = new List (); Option def = Contains ("<>") ? this ["<>"] : null; foreach (string argument in arguments) { ++c.OptionIndex; if (argument == "--") { process = false; continue; } if (!process) { Unprocessed (unprocessed, def, c, argument); continue; } if (!Parse (argument, c)) Unprocessed (unprocessed, def, c, argument); } if (c.Option != null) c.Option.Invoke (c); return unprocessed; } #endif private static bool Unprocessed (ICollection extra, Option def, OptionContext c, string argument) { if (def == null) { extra.Add (argument); return false; } c.OptionValues.Add (argument); c.Option = def; c.Option.Invoke (c); return false; } static readonly Regex ValueOption = new Regex ( @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); protected bool GetOptionParts (string argument, out string flag, out string name, out string sep, out string value) { if (argument == null) throw new ArgumentNullException ("argument"); flag = name = sep = value = null; Match m = ValueOption.Match (argument); if (!m.Success) { return false; } flag = m.Groups ["flag"].Value; name = m.Groups ["name"].Value; if (m.Groups ["sep"].Success && m.Groups ["value"].Success) { sep = m.Groups ["sep"].Value; value = m.Groups ["value"].Value; } return true; } protected virtual bool Parse (string argument, OptionContext c) { if (c.Option != null) { ParseValue (argument, c); return true; } string f, n, s, v; if (!GetOptionParts (argument, out f, out n, out s, out v)) return false; Option p; if (Contains (n)) { p = this [n]; c.OptionName = f + n; c.Option = p; switch (p.OptionValueType) { case OptionValueType.None: c.OptionValues.Add (n); c.Option.Invoke (c); break; case OptionValueType.Optional: case OptionValueType.Required: ParseValue (v, c); break; } return true; } // no match; is it a bool option? if (ParseBool (argument, n, c)) return true; // is it a bundled option? if (ParseBundledValue (f, string.Concat (n + s + v), c)) return true; return false; } private void ParseValue (string option, OptionContext c) { if (option != null) foreach (string o in c.Option.ValueSeparators != null ? option.Split (c.Option.ValueSeparators, StringSplitOptions.None) : new string[]{option}) { c.OptionValues.Add (o); } if (c.OptionValues.Count == c.Option.MaxValueCount || c.Option.OptionValueType == OptionValueType.Optional) c.Option.Invoke (c); else if (c.OptionValues.Count > c.Option.MaxValueCount) { throw new OptionException (localizer (string.Format ( "Error: Found {0} option values when expecting {1}.", c.OptionValues.Count, c.Option.MaxValueCount)), c.OptionName); } } private bool ParseBool (string option, string n, OptionContext c) { Option p; string rn; if (n.Length >= 1 && (n [n.Length-1] == '+' || n [n.Length-1] == '-') && Contains ((rn = n.Substring (0, n.Length-1)))) { p = this [rn]; string v = n [n.Length-1] == '+' ? option : null; c.OptionName = option; c.Option = p; c.OptionValues.Add (v); p.Invoke (c); return true; } return false; } private bool ParseBundledValue (string f, string n, OptionContext c) { if (f != "-") return false; for (int i = 0; i < n.Length; ++i) { Option p; string opt = f + n [i].ToString (); string rn = n [i].ToString (); if (!Contains (rn)) { if (i == 0) return false; throw new OptionException (string.Format (localizer ( "Cannot bundle unregistered option '{0}'."), opt), opt); } p = this [rn]; switch (p.OptionValueType) { case OptionValueType.None: Invoke (c, opt, n, p); break; case OptionValueType.Optional: case OptionValueType.Required: { string v = n.Substring (i+1); c.Option = p; c.OptionName = opt; ParseValue (v.Length != 0 ? v : null, c); return true; } default: throw new InvalidOperationException ("Unknown OptionValueType: " + p.OptionValueType); } } return true; } private static void Invoke (OptionContext c, string name, string value, Option option) { c.OptionName = name; c.Option = option; c.OptionValues.Add (value); option.Invoke (c); } private const int OptionWidth = 29; public void WriteOptionDescriptions (TextWriter o) { foreach (Option p in this) { int written = 0; if (!WriteOptionPrototype (o, p, ref written)) continue; if (written < OptionWidth) o.Write (new string (' ', OptionWidth - written)); else { o.WriteLine (); o.Write (new string (' ', OptionWidth)); } bool indent = false; string prefix = new string (' ', OptionWidth+2); foreach (string line in GetLines (localizer (GetDescription (p.Description)))) { if (indent) o.Write (prefix); o.WriteLine (line); indent = true; } } } bool WriteOptionPrototype (TextWriter o, Option p, ref int written) { string[] names = p.Names; int i = GetNextOptionIndex (names, 0); if (i == names.Length) return false; if (names [i].Length == 1) { Write (o, ref written, " -"); Write (o, ref written, names [0]); } else { Write (o, ref written, " --"); Write (o, ref written, names [0]); } for ( i = GetNextOptionIndex (names, i+1); i < names.Length; i = GetNextOptionIndex (names, i+1)) { Write (o, ref written, ", "); Write (o, ref written, names [i].Length == 1 ? "-" : "--"); Write (o, ref written, names [i]); } if (p.OptionValueType == OptionValueType.Optional || p.OptionValueType == OptionValueType.Required) { if (p.OptionValueType == OptionValueType.Optional) { Write (o, ref written, localizer ("[")); } Write (o, ref written, localizer ("=" + GetArgumentName (0, p.MaxValueCount, p.Description))); string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 ? p.ValueSeparators [0] : " "; for (int c = 1; c < p.MaxValueCount; ++c) { Write (o, ref written, localizer (sep + GetArgumentName (c, p.MaxValueCount, p.Description))); } if (p.OptionValueType == OptionValueType.Optional) { Write (o, ref written, localizer ("]")); } } return true; } static int GetNextOptionIndex (string[] names, int i) { while (i < names.Length && names [i] == "<>") { ++i; } return i; } static void Write (TextWriter o, ref int n, string s) { n += s.Length; o.Write (s); } private static string GetArgumentName (int index, int maxIndex, string description) { if (description == null) return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); string[] nameStart; if (maxIndex == 1) nameStart = new string[]{"{0:", "{"}; else nameStart = new string[]{"{" + index + ":"}; for (int i = 0; i < nameStart.Length; ++i) { int start, j = 0; do { start = description.IndexOf (nameStart [i], j); } while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false); if (start == -1) continue; int end = description.IndexOf ("}", start); if (end == -1) continue; return description.Substring (start + nameStart [i].Length, end - start - nameStart [i].Length); } return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); } private static string GetDescription (string description) { if (description == null) return string.Empty; StringBuilder sb = new StringBuilder (description.Length); int start = -1; for (int i = 0; i < description.Length; ++i) { switch (description [i]) { case '{': if (i == start) { sb.Append ('{'); start = -1; } else if (start < 0) start = i + 1; break; case '}': if (start < 0) { if ((i+1) == description.Length || description [i+1] != '}') throw new InvalidOperationException ("Invalid option description: " + description); ++i; sb.Append ("}"); } else { sb.Append (description.Substring (start, i - start)); start = -1; } break; case ':': if (start < 0) goto default; start = i + 1; break; default: if (start < 0) sb.Append (description [i]); break; } } return sb.ToString (); } private static IEnumerable GetLines (string description) { if (string.IsNullOrEmpty (description)) { yield return string.Empty; yield break; } int length = 80 - OptionWidth - 1; int start = 0, end; do { end = GetLineEnd (start, length, description); char c = description [end-1]; if (char.IsWhiteSpace (c)) --end; bool writeContinuation = end != description.Length && !IsEolChar (c); string line = description.Substring (start, end - start) + (writeContinuation ? "-" : ""); yield return line; start = end; if (char.IsWhiteSpace (c)) ++start; length = 80 - OptionWidth - 2 - 1; } while (end < description.Length); } private static bool IsEolChar (char c) { return !char.IsLetterOrDigit (c); } private static int GetLineEnd (int start, int length, string description) { int end = System.Math.Min (start + length, description.Length); int sep = -1; for (int i = start+1; i < end; ++i) { if (description [i] == '\n') return i+1; if (IsEolChar (description [i])) sep = i+1; } if (sep == -1 || end == description.Length) return end; return sep; } } } smuxi-1.1/src/Frontend-GNOME-IRC/0000775000175000017500000000000014011526501017137 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME-IRC/CtcpMenu.cs0000664000175000017500000001712013622524345021220 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010, 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Threading; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class CtcpMenu : Gtk.Menu { private static readonly string _LibraryTextDomain = "smuxi-frontend-gnome-irc"; IrcProtocolManager ProtocolManager { get; set; } ChatViewManager ChatViewManager { get; set; } IList Targets { get; set; } bool IsPopulated { get; set; } public CtcpMenu(IrcProtocolManager protocolManager, ChatViewManager chatViewManager, PersonModel target) : this(protocolManager, chatViewManager, new [] { target }) { } public CtcpMenu(IrcProtocolManager protocolManager, ChatViewManager chatViewManager, IList targets) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } if (targets == null) { throw new ArgumentNullException("targets"); } ProtocolManager = protocolManager; ChatViewManager = chatViewManager; Targets = targets; } protected override void OnShown() { Trace.Call(); if (!IsPopulated) { IsPopulated = true; Gtk.MenuItem item; item = new Gtk.MenuItem(_("Ping")); item.Activated += OnPingItemActivated; item.Show(); Append(item); item = new Gtk.MenuItem(_("Version")); item.Activated += OnVersionItemActivated; item.Show(); Append(item); item = new Gtk.MenuItem(_("Time")); item.Activated += OnTimeItemActivated; item.Show(); Append(item); item = new Gtk.MenuItem(_("Finger")); item.Activated += OnFingerItemActivated; item.Show(); Append(item); item = new Gtk.MenuItem(_("Userinfo")); item.Activated += OnUserinfoItemActivated; item.Show(); Append(item); } base.OnShown(); } void OnPingItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); var sourceChatModel = ChatViewManager.ActiveChat.ChatModel; foreach (PersonModel target in Targets) { var targetId = target.ID; ThreadPool.QueueUserWorkItem(delegate { try { ProtocolManager.CommandPing( new CommandModel( Frontend.FrontendManager, sourceChatModel, targetId ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnVersionItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); var sourceChatModel = ChatViewManager.ActiveChat.ChatModel; foreach (PersonModel target in Targets) { var targetId = target.ID; ThreadPool.QueueUserWorkItem(delegate { try { ProtocolManager.CommandVersion( new CommandModel( Frontend.FrontendManager, sourceChatModel, targetId ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnTimeItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); var sourceChatModel = ChatViewManager.ActiveChat.ChatModel; foreach (PersonModel target in Targets) { var targetId = target.ID; ThreadPool.QueueUserWorkItem(delegate { try { ProtocolManager.CommandTime( new CommandModel( Frontend.FrontendManager, sourceChatModel, targetId ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnFingerItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); var sourceChatModel = ChatViewManager.ActiveChat.ChatModel; foreach (PersonModel target in Targets) { var targetId = target.ID; ThreadPool.QueueUserWorkItem(delegate { try { ProtocolManager.CommandFinger( new CommandModel( Frontend.FrontendManager, sourceChatModel, targetId ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserinfoItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); var sourceChatModel = ChatViewManager.ActiveChat.ChatModel; foreach (PersonModel target in Targets) { var targetId = target.ID; ThreadPool.QueueUserWorkItem(delegate { try { ProtocolManager.CommandCtcp( new CommandModel( Frontend.FrontendManager, sourceChatModel, String.Format("{0} {1}", targetId, "USERINFO") ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } } smuxi-1.1/src/Frontend-GNOME-IRC/IrcGroupChatView.cs0000664000175000017500000003702113411450522022660 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2011, 2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Threading; using System.Collections.Generic; using System.Globalization; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Group, ProtocolManagerType = typeof(IrcProtocolManager))] public class IrcGroupChatView : GroupChatView { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-frontend-gnome-irc"; IrcProtocolManager IrcProtocolManager { get; set; } public IrcGroupChatView(GroupChatModel groupChat) : base(groupChat) { Trace.Call(groupChat); if (PersonTreeView != null) { Gtk.CellRendererText cellr = new Gtk.CellRendererText(); // HACK: for some reason GTK is giving the space of 2 chars which // we workaround using a char width of 0 cellr.WidthChars = 0; Gtk.TreeViewColumn column = new Gtk.TreeViewColumn(String.Empty, cellr); column.Spacing = 0; column.SortIndicator = false; column.Sizing = Gtk.TreeViewColumnSizing.GrowOnly; column.SetCellDataFunc(cellr, new Gtk.TreeCellDataFunc(RenderIrcGroupPersonMode)); PersonTreeView.AppendColumn(column); PersonTreeView.MoveColumnAfter(IdentityNameColumn, column); } } public override void Sync() { Trace.Call(); base.Sync(); IrcProtocolManager = (IrcProtocolManager) ProtocolManager; } void RenderIrcGroupPersonMode(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { var person = model.GetValue(iter, 0) as IrcGroupPersonModel; if (person == null) { #if LOG4NET _Logger.Error("_RenderIrcGroupPersonMode(): person == null"); #endif return; } string mode; if (person.IsOwner) { mode = "~"; } else if (person.IsChannelAdmin) { mode = "&"; } else if (person.IsOp) { mode = "@"; } else if (person.IsHalfop) { mode = "%"; } else if (person.IsVoice) { mode = "+"; } else { mode = String.Empty; } (cellr as Gtk.CellRendererText).Text = mode; } void OnUserListMenuOpActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } // do smart mode changes var nicks = new List(); foreach (var person in persons) { nicks.Add(person.ID); } ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandOp( new CommandModel( Frontend.FrontendManager, ChatModel, String.Join(" ", nicks.ToArray()) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void OnUserListMenuDeopActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } // do smart mode changes var nicks = new List(); foreach (var person in persons) { nicks.Add(person.ID); } ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandDeop( new CommandModel( Frontend.FrontendManager, ChatModel, String.Join(" ", nicks.ToArray()) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void OnUserListMenuVoiceActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } // do smart mode changes var nicks = new List(); foreach (var person in persons) { nicks.Add(person.ID); } ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandVoice( new CommandModel( Frontend.FrontendManager, ChatModel, String.Join(" ", nicks.ToArray()) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void OnUserListMenuDevoiceActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } // do smart mode changes var nicks = new List(); foreach (var person in persons) { nicks.Add(person.ID); } ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandDevoice( new CommandModel( Frontend.FrontendManager, ChatModel, String.Join(" ", nicks.ToArray()) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void OnUserListMenuKickActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandKick( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuKickBanActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandKickban( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuBanActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } // do smart mode changes var nicks = new List(); foreach (var person in persons) { nicks.Add(person.ID); } ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandBan( new CommandModel( Frontend.FrontendManager, ChatModel, String.Join(" ", nicks.ToArray()) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void OnUserListMenuUnbanActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } var nicks = new List(); foreach (var person in persons) { nicks.Add(person.ID); } ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandUnban( new CommandModel( Frontend.FrontendManager, ChatModel, String.Join(" ", nicks.ToArray()) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void OnUserListMenuQueryActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandMessageQuery( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuWhoisActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandWhoIs( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID + " " + per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } protected override void OnPersonMenuShown(object sender, EventArgs e) { Trace.Call(sender, e); foreach (var child in PersonMenu.Children) { PersonMenu.Remove(child); } base.OnPersonMenuShown(sender, e); Gtk.ImageMenuItem query_item = new Gtk.ImageMenuItem(_("Query")); query_item.Activated += OnUserListMenuQueryActivated; PersonMenu.Append(query_item); PersonMenu.Append(new Gtk.SeparatorMenuItem()); Gtk.ImageMenuItem op_item = new Gtk.ImageMenuItem(_("Op")); op_item.Activated += OnUserListMenuOpActivated; PersonMenu.Append(op_item); Gtk.ImageMenuItem deop_item = new Gtk.ImageMenuItem(_("Deop")); deop_item.Activated += OnUserListMenuDeopActivated; PersonMenu.Append(deop_item); Gtk.ImageMenuItem voice_item = new Gtk.ImageMenuItem(_("Voice")); voice_item.Activated += OnUserListMenuVoiceActivated; PersonMenu.Append(voice_item); Gtk.ImageMenuItem devoice_item = new Gtk.ImageMenuItem(_("Devoice")); devoice_item.Activated += OnUserListMenuDevoiceActivated; PersonMenu.Append(devoice_item); Gtk.ImageMenuItem kick_item = new Gtk.ImageMenuItem(_("Kick")); kick_item.Activated += OnUserListMenuKickActivated; PersonMenu.Append(kick_item); Gtk.ImageMenuItem kickban_item = new Gtk.ImageMenuItem(_("Kick + Ban")); kickban_item.Activated += OnUserListMenuKickBanActivated; PersonMenu.Append(kickban_item); Gtk.ImageMenuItem ban_item = new Gtk.ImageMenuItem(_("Ban")); ban_item.Activated += OnUserListMenuBanActivated; PersonMenu.Append(ban_item); Gtk.ImageMenuItem unban_item = new Gtk.ImageMenuItem(_("Unban")); unban_item.Activated += OnUserListMenuUnbanActivated; PersonMenu.Append(unban_item); PersonMenu.Append(new Gtk.SeparatorMenuItem()); Gtk.ImageMenuItem whois_item = new Gtk.ImageMenuItem(_("Whois")); whois_item.Activated += OnUserListMenuWhoisActivated; PersonMenu.Append(whois_item); Gtk.MenuItem ctcp_item = new Gtk.MenuItem(_("CTCP")); Gtk.Menu ctcp_menu = new CtcpMenu( IrcProtocolManager, Frontend.MainWindow.ChatViewManager, GetSelectedPersons() ); ctcp_item.Submenu = ctcp_menu; PersonMenu.Append(ctcp_item); Gtk.MenuItem invite_to_item = new Gtk.MenuItem(_("Invite to")); Gtk.Menu invite_to_menu_item = new InviteToMenu( IrcProtocolManager, Frontend.MainWindow.ChatViewManager, GetSelectedPersons() ); invite_to_item.Submenu = invite_to_menu_item; PersonMenu.Append(invite_to_item); PersonMenu.ShowAll(); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } } smuxi-1.1/src/Frontend-GNOME-IRC/AssemblyInfo.cs0000644000175000017500000000221312253423337022066 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - IRC support for GNOME frontend")] [assembly: AssemblyCopyright("2005-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/src/Frontend-GNOME-IRC/InviteToMenu.cs0000664000175000017500000001054113622524345022070 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010, 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Threading; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class InviteToMenu : Gtk.Menu { IrcProtocolManager ProtocolManager { get; set; } ChatViewManager ChatViewManager { get; set; } IList Invitees { get; set; } bool IsPopulated { get; set; } public InviteToMenu(IrcProtocolManager protocolManager, ChatViewManager chatViewManager, PersonModel invitee) : this(protocolManager, chatViewManager, new [] { invitee }) { } public InviteToMenu(IrcProtocolManager protocolManager, ChatViewManager chatViewManager, IList invitees) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } if (invitees == null) { throw new ArgumentNullException("invitees"); } ProtocolManager = protocolManager; ChatViewManager = chatViewManager; Invitees = invitees; } protected override void OnShown() { Trace.Call(); if (!IsPopulated) { IsPopulated = true; foreach (var chatView in ChatViewManager.Chats) { if (!(chatView is GroupChatView)) { // only invite to group chats continue; } if (chatView == ChatViewManager.ActiveChat) { // don't need to add current chat to invite list continue; } if (chatView.ProtocolManager != ProtocolManager) { // only add chats from current server continue; } var item = new Gtk.ImageMenuItem(chatView.Name); item.Image = new Gtk.Image(GroupChatView.IconPixbuf); // HACK: anonymous methods inside foreach loops needs this var chat = chatView; item.Activated += delegate { OnItemActivated(chat); }; item.Show(); Append(item); } } base.OnShown(); } void OnItemActivated(ChatView chat) { Trace.Call(chat); var inviteFromChatModel = ChatViewManager.ActiveChat.ChatModel; foreach (var invitee in Invitees) { var inviteeId = invitee.ID; ThreadPool.QueueUserWorkItem(delegate { try { ProtocolManager.CommandInvite( new CommandModel( Frontend.FrontendManager, inviteFromChatModel, String.Format("{0} {1}", inviteeId, chat.ID) ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } } } smuxi-1.1/src/Frontend-GNOME-IRC/Makefile.am0000664000175000017500000001155314011472672021211 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-frontend-gnome-irc.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/release/smuxi-common.dll \ ../../bin/release/smuxi-engine.dll \ ../../bin/release/smuxi-frontend-gnome.exe \ ../../bin/release/smuxi-engine-irc.dll \ ../../bin/release/smuxi-frontend.dll BUILD_DIR = ../../bin/release SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll MEEBEY_SMARTIRC4NET_DLL_SOURCE=../../lib/Meebey.SmartIrc4net.dll SMUXI_FRONTEND_GNOME_EXE_MDB= SMUXI_FRONTEND_DLL_SOURCE=../../bin/release/smuxi-frontend.dll SMUXI_ENGINE_IRC_DLL_SOURCE=../../bin/release/smuxi-engine-irc.dll SMUXI_ENGINE_IRC_DLL_MDB= SMUXI_ENGINE_DLL_MDB= SMUXI_FRONTEND_DLL_MDB= SMUXI_FRONTEND_GNOME_EXE_SOURCE=../../bin/release/smuxi-frontend-gnome.exe NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-frontend-gnome-irc.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-frontend-gnome.exe \ ../../bin/debug/smuxi-engine-irc.dll \ ../../bin/debug/smuxi-frontend.dll BUILD_DIR = ../../bin/debug SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll MEEBEY_SMARTIRC4NET_DLL_SOURCE=../../lib/Meebey.SmartIrc4net.dll SMUXI_FRONTEND_GNOME_EXE_MDB_SOURCE=../../bin/debug/smuxi-frontend-gnome.exe.mdb SMUXI_FRONTEND_GNOME_EXE_MDB=$(BUILD_DIR)/smuxi-frontend-gnome.exe.mdb SMUXI_FRONTEND_DLL_SOURCE=../../bin/debug/smuxi-frontend.dll SMUXI_ENGINE_IRC_DLL_SOURCE=../../bin/debug/smuxi-engine-irc.dll SMUXI_ENGINE_IRC_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine-irc.dll.mdb SMUXI_ENGINE_IRC_DLL_MDB=$(BUILD_DIR)/smuxi-engine-irc.dll.mdb SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb SMUXI_FRONTEND_DLL_MDB_SOURCE=../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB=$(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_GNOME_EXE_SOURCE=../../bin/debug/smuxi-frontend-gnome.exe NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll endif if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_COMMON_DLL) \ $(SMUXI_FRONTEND_GNOME_EXE_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_ENGINE_IRC_DLL) \ $(SMUXI_ENGINE_IRC_DLL_MDB) \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_GNOME_EXE) \ $(SMUXI_ENGINE_DLL) LINUX_PKGCONFIG = \ $(FRONTEND_GNOME_IRC_PC) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ IrcGroupChatView.cs \ IrcPersonChatView.cs \ InviteToMenu.cs \ CtcpMenu.cs DATA_FILES = RESOURCES = EXTRAS = REFERENCES = \ System \ Mono.Posix \ $(GTK_SHARP_20_LIBS) DLL_REFERENCES = \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) include $(top_srcdir)/Makefile.include SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll MEEBEY_SMARTIRC4NET_DLL = $(BUILD_DIR)/Meebey.SmartIrc4net.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_ENGINE_IRC_DLL = $(BUILD_DIR)/smuxi-engine-irc.dll SMUXI_FRONTEND_GNOME_EXE = $(BUILD_DIR)/smuxi-frontend-gnome.exe NINI_DLL = $(BUILD_DIR)/Nini.dll LOG4NET_DLL = $(BUILD_DIR)/log4net.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_IRC_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_IRC_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) smuxi-1.1/src/Frontend-GNOME-IRC/Makefile.in0000664000175000017500000010627214011526471021222 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-GNOME-IRC ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d 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)$(bindir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-frontend-gnome-irc.dll @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-frontend-gnome-irc.dll @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = library @ENABLE_RELEASE_TRUE@COMPILE_TARGET = library @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend-gnome.exe \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine-irc.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend-gnome.exe \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine-irc.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@MEEBEY_SMARTIRC4NET_DLL_SOURCE = ../../lib/Meebey.SmartIrc4net.dll @ENABLE_RELEASE_TRUE@MEEBEY_SMARTIRC4NET_DLL_SOURCE = ../../lib/Meebey.SmartIrc4net.dll @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_GNOME_EXE_MDB = $(BUILD_DIR)/smuxi-frontend-gnome.exe.mdb @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_GNOME_EXE_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_IRC_DLL_SOURCE = ../../bin/debug/smuxi-engine-irc.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_IRC_DLL_SOURCE = ../../bin/release/smuxi-engine-irc.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_IRC_DLL_MDB = $(BUILD_DIR)/smuxi-engine-irc.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_IRC_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB = $(BUILD_DIR)/smuxi-frontend.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_GNOME_EXE_SOURCE = ../../bin/debug/smuxi-frontend-gnome.exe @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_GNOME_EXE_SOURCE = ../../bin/release/smuxi-frontend-gnome.exe @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_GNOME_EXE_MDB_SOURCE = ../../bin/debug/smuxi-frontend-gnome.exe.mdb @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_IRC_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine-irc.dll.mdb @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB_SOURCE = ../../bin/debug/smuxi-frontend.dll.mdb @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_COMMON_DLL) \ $(SMUXI_FRONTEND_GNOME_EXE_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_ENGINE_IRC_DLL) \ $(SMUXI_ENGINE_IRC_DLL_MDB) \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_GNOME_EXE) \ $(SMUXI_ENGINE_DLL) LINUX_PKGCONFIG = \ $(FRONTEND_GNOME_IRC_PC) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ IrcGroupChatView.cs \ IrcPersonChatView.cs \ InviteToMenu.cs \ CtcpMenu.cs DATA_FILES = RESOURCES = EXTRAS = REFERENCES = \ System \ Mono.Posix \ $(GTK_SHARP_20_LIBS) DLL_REFERENCES = \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll MEEBEY_SMARTIRC4NET_DLL = $(BUILD_DIR)/Meebey.SmartIrc4net.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_ENGINE_IRC_DLL = $(BUILD_DIR)/smuxi-engine-irc.dll SMUXI_FRONTEND_GNOME_EXE = $(BUILD_DIR)/smuxi-frontend-gnome.exe NINI_DLL = $(BUILD_DIR)/Nini.dll LOG4NET_DLL = $(BUILD_DIR)/log4net.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-GNOME-IRC/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-GNOME-IRC/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_IRC_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_IRC_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_REF_LIBS) # 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: smuxi-1.1/src/Frontend-GNOME-IRC/IrcPersonChatView.cs0000644000175000017500000001111112726351313023026 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008, 2010-2011 Mirco Bauer * Copyright (c) 2013 Andrés G. Aragoneses * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using System.Threading; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Person, ProtocolManagerType = typeof(IrcProtocolManager))] public class IrcPersonChatView : PersonChatView { private static readonly string _LibraryTextDomain = "smuxi-frontend-gnome-irc"; IrcProtocolManager IrcProtocolManager; public IrcPersonChatView(PersonChatModel personChat) : base(personChat) { Trace.Call(personChat); OutputMessageTextView.PopulatePopup += OnOutputMessageTextViewPopulatePopup; } public override void Sync() { Trace.Call(); base.Sync(); IrcProtocolManager = (IrcProtocolManager) ProtocolManager; } protected override void OnTabMenuShown(object sender, EventArgs e) { base.OnTabMenuShown(sender, e); var stack = new Stack(); foreach (var menu_item in CreateContextMenuItems()) { stack.Push(menu_item); } TabMenu.Prepend(new Gtk.SeparatorMenuItem()); while (stack.Count != 0) { TabMenu.Prepend(stack.Pop()); } TabMenu.ShowAll(); } void OnOutputMessageTextViewPopulatePopup(object o, Gtk.PopulatePopupArgs args) { if (OutputMessageTextView.IsAtUrlTag) { return; } Gtk.Menu popup = args.Menu; popup.Append(new Gtk.SeparatorMenuItem()); foreach (var menu_item in CreateContextMenuItems()) { popup.Append(menu_item); } popup.ShowAll(); } IEnumerable CreateContextMenuItems() { if (IrcProtocolManager == null) { // we are not synced yet yield break; } Gtk.ImageMenuItem whois_item = new Gtk.ImageMenuItem(_("Whois")); whois_item.Activated += OnMenuWhoisItemActivated; yield return whois_item; Gtk.ImageMenuItem ctcp_item = new Gtk.ImageMenuItem(_("CTCP")); Gtk.Menu ctcp_menu_item = new CtcpMenu(IrcProtocolManager, Frontend.MainWindow.ChatViewManager, PersonModel); ctcp_item.Submenu = ctcp_menu_item; yield return ctcp_item; Gtk.ImageMenuItem invite_to_item = new Gtk.ImageMenuItem(_("Invite to")); Gtk.Menu invite_to_menu_item = new InviteToMenu(IrcProtocolManager, Frontend.MainWindow.ChatViewManager, PersonModel); invite_to_item.Submenu = invite_to_menu_item; yield return invite_to_item; } void OnMenuWhoisItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); ThreadPool.QueueUserWorkItem(delegate { try { IrcProtocolManager.CommandWhoIs( new CommandModel( Frontend.FrontendManager, ChatModel, ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } } } smuxi-1.1/src/Engine-MessageBuffer/0000775000175000017500000000000014011526501020023 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-MessageBuffer/AssemblyInfo.cs0000644000175000017500000000246612726351313022763 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2014 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - MessageBuffer tool")] [assembly: AssemblyCopyright("2014 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] // let log4net use .exe.config file [assembly: log4net.Config.XmlConfigurator] smuxi-1.1/src/Engine-MessageBuffer/smuxi-message-buffer.exe.config0000644000175000017500000000113712726351313026040 0ustar00meebeymeebey00000000000000
smuxi-1.1/src/Engine-MessageBuffer/Makefile.am0000664000175000017500000000261614011472672022075 0ustar00meebeymeebey00000000000000if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif TARGET_DIR = $(top_builddir)/bin/$(PROFILE) BIN_WRAPPER = smuxi-message-buffer ASSEMBLY_NAME = smuxi-message-buffer ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).exe ASSEMBLY_CONFIG_SOURCE = $(ASSEMBLY_FILENAME).config ASSEMBLY_CONFIG = $(TARGET_DIR)/$(ASSEMBLY_CONFIG_SOURCE) ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Main.cs REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/ServiceStack.Text.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) PROGRAMFILES = $(ASSEMBLY_CONFIG) BINARIES = $(BIN_WRAPPER) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(man_MANS) $(ASSEMBLY_CONFIG_SOURCE) CLEANFILES = \ $(PROGRAMFILES) \ $(BINARIES) \ $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb man_MANS = smuxi-message-buffer.1 include $(top_srcdir)/Makefile.include all: $(ASSEMBLY_TARGET) $(eval $(call emit-deploy-target,ASSEMBLY_CONFIG)) $(ASSEMBLY_TARGET): $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(MSG_BUFFER_COMPILER_FLAGS) $(build_references_ref) -target:exe -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) smuxi-1.1/src/Engine-MessageBuffer/smuxi-message-buffer.10000664000175000017500000000333514011467170024155 0ustar00meebeymeebey00000000000000.Dd $Mdocdate: March 6 2014 $ .Dt smuxi-message-buffer 1 .Os .Sh NAME .Nm smuxi-message-buffer .Nd converts and dumps Smuxi chat history .Sh SYNOPSIS .Nm smuxi-message-buffer .Op Fl dh convert .Op Fl \-source-format Ns = Ns Ar format .Op Fl \-destination-format Ns = Ns Ar format .Ar source-file(s)... .Ar destination-file .Nm smuxi-message-buffer .Op Fl dh cat .Op Fl \-format Ns = Ns Ar format .Ar source-file(s)... .Sh DESCRIPTION .Nm is a tool that manages the databases that Smuxi holds chat histories in. Currently, it can convert and dump databases. .Pp Similar to commands like .Xr git 1 , .Nm takes a command as the first parameter. These commands can be cat (dumps a JSON representation of the database to standard output) or convert. (changes the database from one format to another) Note that the destination file can be set to "-" or empty in the case of convert, in which case it will export to stdout. .Pp The following options can be used. Some options will depend on what command you're using. .Bl -tag -width Ds .It Fl d , Fl \-debug Turn on debugging. Debug logs are outputted on the console. .It Fl h , Fl \-help Show the arguments Smuxi takes. .It Fl \-source-format Ns = Ns Ar format .It Fl \-format Ns = Ns Ar format Manually specify a source format. Options include auto (figured out via filename), db4o, and sqlite. .It Fl \-destination-format Ns = Ns Ar format Manually specify a source destination, if converting. Options include auto (figured out via filename), db4o, and sqlite. .El .Sh SEE ALSO .Xr smuxi-frontend-gnome 1 , .Xr smuxi-frontend-stfl 1 , .Xr smuxi-server 1 .Pp Website: https://smuxi.im/ .Sh AUTHOR/CREDITS Smuxi, including this tool, was written by Mirco Bauer. .Pp This manpage was written by Calvin Buckley. smuxi-1.1/src/Engine-MessageBuffer/smuxi-message-buffer.in0000644000175000017500000000013112726351313024412 0ustar00meebeymeebey00000000000000#!/bin/sh exec mono --debug "@expanded_libdir@/@PACKAGE@/smuxi-message-buffer.exe" "$@" smuxi-1.1/src/Engine-MessageBuffer/Main.cs0000664000175000017500000003627114011467170021255 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2014, 2017 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Linq; using System.Reflection; using NDesk.Options; using ServiceStack.Text; using Smuxi.Common; using Smuxi.Engine.Dto; using System.Collections.Generic; namespace Smuxi.Engine { public class MainClass { static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); static readonly string LibraryTextDomain = "smuxi-message-buffer"; public static void Main(string[] args) { System.Threading.Thread.CurrentThread.Name = "Main"; // initialize log level log4net.Repository.ILoggerRepository repo = log4net.LogManager.GetRepository(); repo.Threshold = log4net.Core.Level.Error; InitLocale(); var debug = false; var parser = new OptionSet() { { "d|debug", _("Enable debug output"), val => { debug = true; } } }; parser.Add("h|help", _("Show this help"), val => { ShowUsage(parser); Environment.Exit(0); } ); try { var mainArgs = args.TakeWhile(x => x.StartsWith("-")); parser.Parse(mainArgs); if (debug) { repo.Threshold = log4net.Core.Level.Debug; } var action = args.Skip(mainArgs.Count()).FirstOrDefault(); if (String.IsNullOrEmpty(action)) { ShowUsage(parser); Environment.Exit(1); } var actionArgs = args.Skip(mainArgs.Count() + 1); switch (action.ToLower()) { case "cat": CatAction(action, actionArgs); break; case "convert": case "copy": case "cp": CopyAction(action, actionArgs); break; default: throw new OptionException( String.Format( _("Unknown action: '{0}'"), action ), "action" ); } } catch (OptionException ex) { Console.Error.WriteLine(_("Command line error: {0}"), ex.Message); Environment.Exit(1); } catch (Exception e) { Logger.Fatal(e); } } static void ShowUsage(OptionSet mainOptions) { Console.WriteLine(_("Usage: smuxi-message-buffer [options] action action-options")); Console.WriteLine(); Console.WriteLine(_("Actions:")); Console.WriteLine(" cat"); Console.WriteLine(" convert/copy/cp"); Console.WriteLine(); Console.WriteLine(_("Options:")); mainOptions.WriteOptionDescriptions(Console.Out); } static void CatAction(string action, IEnumerable args) { var dbFormat = ""; var parameters = new List(); var parser = new OptionSet() { { "format=", _("Database format (valid values: auto, db4o, sqlite)"), val => { if (val == "auto") { val = ""; } dbFormat = val; } }, { "<>", val => { if (!val.StartsWith("-")) { parameters.Add(val); return; } throw new OptionException( String.Format(_("Unknown {0} option: '{1}'"), action, val), val ); } } }; parser.Add("h|help", _("Show this help"), val => { Console.WriteLine( String.Format( _("Usage: smuxi-message-buffer {0} [action-options] db_path"), action ) ); Console.WriteLine(); Console.WriteLine(" db_path(s)... " + _("Database path(s)")); Console.WriteLine(); Console.WriteLine(_("Options:")); parser.WriteOptionDescriptions(Console.Out); Environment.Exit(0); } ); parser.Parse(args); if (parameters.Count < 1) { throw new OptionException( _("db_path is required"), action ); } var dbPaths = parameters.ToArray(); Copy(dbPaths, dbFormat, null, null); } static void CopyAction(string action, IEnumerable args) { var sourceFormat = ""; var destinationFormat = ""; var parameters = new List(); var parser = new OptionSet() { { "source-format=", _("Source format (valid values: auto, db4o, sqlite)"), val => { if (val == "auto") { val = ""; } sourceFormat = val; } }, { "destination-format=", _("Destination format (valid values: auto, db4o, sqlite)"), val => { if (val == "auto") { val = ""; } destinationFormat = val; } }, { "<>", val => { if (!val.StartsWith("-")) { parameters.Add(val); return; } throw new OptionException( String.Format(_("Unknown {0} option: '{1}'"), action, val), val ); } } }; parser.Add("h|help", _("Show this help"), val => { Console.WriteLine( String.Format( _("Usage: smuxi-message-buffer {0} [action-options] source_db(s)... destination_db"), action ) ); Console.WriteLine(); Console.WriteLine(" source_db(s)... " + _("Source file path(s)")); Console.WriteLine(" destination_db " + _("Destination file path or -/empty for stdout")); Console.WriteLine(); Console.WriteLine(_("Options:")); parser.WriteOptionDescriptions(Console.Out); Environment.Exit(0); } ); parser.Parse(args); if (parameters.Count < 2) { throw new OptionException( _("source_db and destination_db are required"), action ); } var sourceFiles = parameters.Take(parameters.Count - 1).ToArray(); var destinationFile = parameters.Last(); if (destinationFile == "-") { destinationFile = ""; } Copy(sourceFiles, sourceFormat, destinationFile, destinationFormat); } static void Copy(string sourceFile, string sourceFormat, string destinationFile, string destinationFormat) { if (String.IsNullOrEmpty(sourceFile)) { throw new ArgumentException(_("sourceFile must not be empty.")); } Copy(new string[] { sourceFile }, sourceFormat, destinationFile, destinationFormat); } static void Copy(string[] sourceFiles, string sourceFormat, string destinationFile, string destinationFormat) { if (sourceFiles == null || sourceFiles.Length == 0) { throw new ArgumentException(_("sourceFiles must not be empty.")); } var sourceBuffers = new List(); IMessageBuffer destinationBuffer = null; try { foreach (var sourceFile in sourceFiles) { var sourceBufferType = ParseMessageBufferType(sourceFile, sourceFormat); var sourceBuffer = CreateMessageBuffer(sourceFile, sourceBufferType); sourceBuffers.Add(sourceBuffer); } if (!String.IsNullOrEmpty(destinationFile)) { var destinationBufferType = ParseMessageBufferType(destinationFile, destinationFormat); destinationBuffer = CreateMessageBuffer(destinationFile, destinationBufferType); if (destinationBuffer.Count > 0) { throw new InvalidOperationException( String.Format( _("Destination database {0} must be empty!"), destinationFile ) ); } } // append all messages of all source buffers together in a lazy way IEnumerable concatenatedMessages = new List(0); sourceBuffers.ForEach(x => concatenatedMessages = concatenatedMessages.Concat(x) ); if (destinationBuffer == null) { // JSON pipe WriteMessagesToJson(concatenatedMessages, Console.Out); } else { foreach (var msg in concatenatedMessages) { destinationBuffer.Add(msg); } destinationBuffer.Flush(); } } finally { foreach (var sourceBuffer in sourceBuffers) { sourceBuffer.Dispose(); } if (destinationBuffer != null) { destinationBuffer.Dispose(); } } } static void WriteMessagesToJson(IEnumerable messages, TextWriter writer) { // OPT: if you are wondering why this code is handling the // serialization of JSON list manually instead of passing it as a // List in a single method call to JsonSerializer.SerializeToWriter(dtoMessages) // then this is because it would mean that all messages from the // source message buffer would need to be read completely into // memory before serializing it into JSON and then writing the result // of that to the console or file. Instead this is a read one message // from the message buffer, copy it to a DTO object, serialize that // one message to JSON and then write that single JSON object to the // target which is a TextWriter. writer.Write("["); bool first = true; foreach (var message in messages) { if (first) { first = false; } else { writer.Write(","); } var dtoMessage = new MessageDtoModelV1(message); JsonSerializer.SerializeToWriter(dtoMessage, writer); } writer.WriteLine("]"); writer.Flush(); } static MessageBufferType ParseMessageBufferType(string fileName, string type) { if (String.IsNullOrEmpty(type)) { if (fileName.EndsWith(".sqlite3")) { return MessageBufferType.Sqlite; } else if (fileName.EndsWith(".db4o")) { return MessageBufferType.Db4o; } else { throw new ArgumentException( String.Format( _("Unknown file format: '{0}'"), fileName ), "fileName" ); } } return (MessageBufferType) Enum.Parse(typeof(MessageBufferType), fileName, true); } static IMessageBuffer CreateMessageBuffer(string fileName, MessageBufferType bufferType) { switch (bufferType) { case MessageBufferType.Db4o: return new Db4oMessageBuffer(fileName); case MessageBufferType.Sqlite: return new SqliteMessageBuffer(fileName); default: throw new ArgumentException( String.Format( _("Unsupported buffer type: '{0}'"), bufferType ), "bufferType" ); } } static void InitLocale() { string appDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string localeDir = Path.Combine(appDir, "locale"); if (!Directory.Exists(localeDir)) { localeDir = Path.Combine(Defines.InstallPrefix, "share"); localeDir = Path.Combine(localeDir, "locale"); } LibraryCatalog.Init("smuxi-message-buffer", localeDir); Logger.Debug("Using locale data from: " + localeDir); } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } public enum MessageBufferType { None, Pipe, Db4o, Sqlite } } smuxi-1.1/src/Engine-MessageBuffer/Makefile.in0000664000175000017500000010722314011526471022103 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Engine-MessageBuffer ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-message-buffer 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)$(pkgappdir)" \ "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(pkgapp_DATA) $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-message-buffer.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) TARGET_DIR = $(top_builddir)/bin/$(PROFILE) BIN_WRAPPER = smuxi-message-buffer ASSEMBLY_NAME = smuxi-message-buffer ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).exe ASSEMBLY_CONFIG_SOURCE = $(ASSEMBLY_FILENAME).config ASSEMBLY_CONFIG = $(TARGET_DIR)/$(ASSEMBLY_CONFIG_SOURCE) ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Main.cs REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/ServiceStack.Text.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) PROGRAMFILES = $(ASSEMBLY_CONFIG) BINARIES = $(BIN_WRAPPER) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(man_MANS) $(ASSEMBLY_CONFIG_SOURCE) \ $(build_sources) $(build_resx_files) $(build_others_files) \ $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) $(DATA_FILES) \ $(build_culture_res_files) CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY_TARGET) \ $(ASSEMBLY_TARGET).mdb $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) \ $(build_resx_resources) $(build_satellite_assembly_list) pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb man_MANS = smuxi-message-buffer.1 VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine-MessageBuffer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine-MessageBuffer/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-message-buffer: $(top_builddir)/config.status $(srcdir)/smuxi-message-buffer.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man \ uninstall-pkgappDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-man1 \ install-pdf install-pdf-am install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man uninstall-man1 \ uninstall-pkgappDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) all: $(ASSEMBLY_TARGET) $(eval $(call emit-deploy-target,ASSEMBLY_CONFIG)) $(ASSEMBLY_TARGET): $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(MSG_BUFFER_COMPILER_FLAGS) $(build_references_ref) -target:exe -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) # 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: smuxi-1.1/src/Frontend-Curses/0000775000175000017500000000000014011526502017124 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-Curses/LogWidget.cs0000664000175000017500000000464214011467170021353 0ustar00meebeymeebey00000000000000/* * $Id: MainWindow.cs 192 2007-04-22 11:48:12Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/MainWindow.cs $ * $Rev: 192 $ * $Author: meebey $ * $Date: 2007-04-22 13:48:12 +0200 (Sun, 22 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Unix; using Mono.Terminal; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Curses { public class LogWidget : Widget { string [] messages = new string [80]; int head, tail; public LogWidget (int x, int y, int w, int h) : base (x, y, w, h) { //Fill = Fill.Horizontal | Fill.Vertical; AddText ("Started"); } public void AddText (string s) { messages [head] = s; head++; if (head == messages.Length) head = 0; if (head == tail) tail = (tail+1) % messages.Length; } public override void Redraw () { Mono.Terminal.Curses.attrset(ColorNormal); int i = 0; int l; int n = head > tail ? head-tail : (head + messages.Length) - tail; for (l = h-1; l >= 0 && n-- > 0; l--){ int item = head-1-i; if (item < 0) item = messages.Length+item; Move (y+l, x); int sl = messages [item].Length; if (sl < w){ Mono.Terminal.Curses.addstr (messages [item]); for (int fi = 0; fi < w-sl; fi++) Mono.Terminal.Curses.addch (' '); } else { Mono.Terminal.Curses.addstr (messages [item].Substring (0, sl)); } i++; } for (; l >= 0; l--) { Move (y+l, x); for (i = 0; i < w; i++) Mono.Terminal.Curses.addch (' '); } } } } smuxi-1.1/src/Frontend-Curses/AssemblyInfo.cs0000644000175000017500000000255411655545675022101 0ustar00meebeymeebey00000000000000/* * $Id: AssemblyInfo.cs 197 2007-06-12 00:57:23Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AssemblyInfo.cs $ * $Rev: 197 $ * $Author: meebey $ * $Date: 2007-06-12 02:57:23 +0200 (Tue, 12 Jun 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - Curses frontend")] [assembly: AssemblyCopyright("2007-2008 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/src/Frontend-Curses/Makefile.am0000664000175000017500000000725513411450522021172 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-frontend-curses.exe ASSEMBLY_MDB = COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/release/smuxi-frontend.dll \ ../../bin/release/smuxi-engine.dll \ ../../bin/release/smuxi-common.dll BUILD_DIR = ../../bin/release LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_MDB= NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll MONO_CURSES_DLL_SOURCE=../../lib/mono-curses/mono-curses.dll SMUXI_FRONTEND_DLL_MDB= SMUXI_FRONTEND_DLL_SOURCE=../../bin/release/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-frontend-curses.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-frontend.dll \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-common.dll BUILD_DIR = ../../bin/debug LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll MONO_CURSES_DLL_SOURCE=../../lib/mono-curses/mono-curses.dll SMUXI_FRONTEND_DLL_MDB_SOURCE=../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB=$(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_SOURCE=../../bin/debug/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(LOG4NET_DLL) \ $(SMUXI_ENGINE_DLL_MDB) \ $(NINI_DLL) \ $(SMUXI_ENGINE_DLL) \ $(MONO_CURSES_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) BINARIES = \ $(FRONTEND_CURSES) all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ Main.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Frontend.cs \ MainWindow.cs \ Entry.cs \ CursesUI.cs \ TextView.cs \ LogWidget.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend-curses.in REFERENCES = \ System \ Mono.Posix \ $(MONO_CURSES_LIBS) \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) include $(top_srcdir)/Makefile.include LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_CURSES = $(BUILD_DIR)/smuxi-frontend-curses MONO_CURSES_DLL = $(BUILD_DIR)/mono-curses.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-wrapper,FRONTEND_CURSES,frontend-smuxi-curses,x)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) smuxi-1.1/src/Frontend-Curses/Entry.cs0000644000175000017500000000672411655545675020612 0ustar00meebeymeebey00000000000000/* * $Id: MainWindow.cs 192 2007-04-22 11:48:12Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/MainWindow.cs $ * $Rev: 192 $ * $Author: meebey $ * $Date: 2007-04-22 13:48:12 +0200 (Sun, 22 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Unix; using Mono.Terminal; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Curses { public class Entry : Mono.Terminal.Entry { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public event EventHandler Activated; public Entry(int x, int y, int w, string s) : base(x, y, w, s) { } public override bool ProcessKey(int key) { Trace.Call(key); bool res = base.ProcessKey(key); if (key == 10) { OnActivated(EventArgs.Empty); } return res; } public virtual void OnActivated(EventArgs e) { ExecuteCommand(Text); if (Activated != null) { Activated(this, EventArgs.Empty); } Text = String.Empty; } public void ExecuteCommand(string cmd) { if (!(cmd.Length > 0)) { return; } bool handled = false; CommandModel cd = new CommandModel(Frontend.FrontendManager, null, (string)Frontend.UserConfig["Interface/Entry/CommandCharacter"], cmd); //handled = _Command(cd); if (!handled) { handled = Frontend.Session.Command(cd); } if (!handled) { // we may have no network manager yet Engine.IProtocolManager nm = Frontend.FrontendManager.CurrentProtocolManager; if (nm != null) { handled = nm.Command(cd); } else { handled = false; } } if (!handled) { _CommandUnknown(cd); } } private void _CommandUnknown(CommandModel cd) { cd.FrontendManager.AddTextToChat(cd.Chat, "-!- " + String.Format(Catalog.GetString( "Unknown Command: {0}"), cd.Command)); } } } smuxi-1.1/src/Frontend-Curses/smuxi-frontend-curses.in0000644000175000017500000000012211655545675023760 0ustar00meebeymeebey00000000000000#!/bin/sh exec mono "@expanded_libdir@/@PACKAGE@/smuxi-frontend-curses.exe" "$@" smuxi-1.1/src/Frontend-Curses/TextView.cs0000644000175000017500000000334211655545675021261 0ustar00meebeymeebey00000000000000/* * $Id: MainWindow.cs 192 2007-04-22 11:48:12Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/MainWindow.cs $ * $Rev: 192 $ * $Author: meebey $ * $Date: 2007-04-22 13:48:12 +0200 (Sun, 22 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Unix; using Mono.Terminal; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Curses { public class TextView : Container { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private int _CurrentLine; public TextView(int x, int y, int w, int h) : base(x, y, w, h) { } public void Add(string line) { Add(new Label(0, _CurrentLine++, line)); } } }smuxi-1.1/src/Frontend-Curses/Main.cs0000644000175000017500000000323311655545675020365 0ustar00meebeymeebey00000000000000/* * $Id: Main.cs 183 2007-04-21 15:14:23Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Main.cs $ * $Rev: 183 $ * $Author: meebey $ * $Date: 2007-04-21 17:14:23 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Frontend.Curses { public class MainClass { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static void Main(string[] args) { #if LOG4NET //log4net.Config.BasicConfigurator.Configure(); #endif try { Frontend.Init(args); } catch (Exception e) { #if LOG4NET _Logger.Fatal(e); #endif throw; } } } } smuxi-1.1/src/Frontend-Curses/CursesUI.cs0000644000175000017500000001054311655545675021205 0ustar00meebeymeebey00000000000000/* * $Id: TestUI.cs 179 2007-04-21 15:01:29Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-Test/TestUI.cs $ * $Rev: 179 $ * $Author: meebey $ * $Date: 2007-04-21 17:01:29 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Curses { public class CursesUI : PermanentRemoteObject, IFrontendUI { private int _Version = 0; private LogWidget _TextView; public int Version { get { return _Version; } } public CursesUI(LogWidget logWidget) { _TextView = logWidget; } public void AddChat(ChatModel page) { Trace.Call(page); //Console.WriteLine("New page: "+page.Name+ " type: "+page.ChatType); } public void AddMessageToChat(ChatModel page, MessageModel msg) { Trace.Call(page, msg); string finalMsg = String.Empty; foreach (MessagePartModel msgPart in msg.MessageParts) { // TODO: implement other types if (msgPart is TextMessagePartModel) { TextMessagePartModel fmsgti = (TextMessagePartModel) msgPart; finalMsg += fmsgti.Text; } } string timestamp; try { timestamp = msg.TimeStamp.ToLocalTime().ToString((string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"]); } catch (FormatException e) { timestamp = "Timestamp Format ERROR: " + e.Message; } finalMsg = timestamp + " " + page.Name + " " + finalMsg; //Console.WriteLine(finalMsg); _TextView.AddText(finalMsg); } public void RemoveChat(ChatModel page) { Trace.Call(page); //Console.WriteLine("Removed page: "+page.Name+" type: "+page.ChatType); } public void EnableChat(ChatModel page) { Trace.Call(page); } public void DisableChat(ChatModel page) { Trace.Call(page); } public void SyncChat(ChatModel page) { Trace.Call(page); //Console.WriteLine("Synced page: "+page.Name+" type: "+page.ChatType); // HACK: fake that we synced the chat, else we get no messages Frontend.FrontendManager.AddSyncedChat(page); } public void AddPersonToGroupChat(GroupChatModel cpage, PersonModel user) { Trace.Call(cpage, user); } public void UpdatePersonInGroupChat(GroupChatModel cpage, PersonModel olduser, PersonModel newuser) { Trace.Call(cpage, olduser, newuser); } public void UpdateTopicInGroupChat(GroupChatModel cpage, MessageModel topic) { Trace.Call(cpage, topic); //Console.WriteLine("Topic changed to: "+topic+ " on "+cpage.Name); } public void RemovePersonFromGroupChat(GroupChatModel cpage, PersonModel user) { Trace.Call(cpage, user); } public void SetNetworkStatus(string status) { Trace.Call(status); } public void SetStatus(string status) { Trace.Call(status); } } } smuxi-1.1/src/Frontend-Curses/MainWindow.cs0000644000175000017500000001157411655545675021564 0ustar00meebeymeebey00000000000000/* * $Id: MainWindow.cs 192 2007-04-22 11:48:12Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/MainWindow.cs $ * $Rev: 192 $ * $Author: meebey $ * $Date: 2007-04-22 13:48:12 +0200 (Sun, 22 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Unix; using Mono.Terminal; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Curses { public class MainWindow : Container { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private Label _NetworkStatusbar; private Label _Statusbar; private CursesUI _UI; private Entry _Entry; public CursesUI UI { get { return _UI; } } public Entry Entry { get { return _Entry; } } public MainWindow() : base(0, 0, Application.Cols, Application.Lines) { //Frame layout = new Frame(0,0, Application.Cols, Application.Lines, "smuxi"); //Add(layout); // menu Button fileButton = new Button(0, 0, "File"); fileButton.Clicked += delegate { Dialog dialog = new Dialog(40, 6, "File Menu"); Button quitButton = new Button(0, 0, "Quit"); quitButton.Clicked += delegate { Frontend.Quit(); }; dialog.AddButton(quitButton); Button closeButton = new Button(0, 0, "Close"); closeButton.Clicked += delegate { dialog.Running = false; dialog.Clear(); }; dialog.AddButton(closeButton); Application.Run(dialog); }; Add(fileButton); Button helpButton = new Button(10, 0, "Help"); helpButton.Clicked += delegate { Dialog dialog = new Dialog(30, 6, "Help Menu"); Button aboutButton = new Button(0, 0, "About"); aboutButton.Clicked += delegate { Dialog aboutDialog = new Dialog(70, 10, "About smuxi"); aboutDialog.Add(new Label(0, 0, "Smuxi")); aboutDialog.Add(new Label(0, 1, "Frontend: " + Frontend.UIName + " " + Frontend.Version)); aboutDialog.Add(new Label(0, 2, "Engine: " + Frontend.EngineVersion)); aboutDialog.Add(new Label(0, 4, "Copyright(C) 2005-2007 (C) Mirco Bauer ")); Button closeButton = new Button("Close"); closeButton.Clicked += delegate { aboutDialog.Running = false; aboutDialog.Clear(); }; aboutDialog.AddButton(closeButton); Application.Run(aboutDialog); }; dialog.AddButton(aboutButton); Button helpCloseButton = new Button(0, 0, "Close"); helpCloseButton.Clicked += delegate { dialog.Running = false; dialog.Clear(); }; dialog.AddButton(helpCloseButton); Application.Run(dialog); }; Add(helpButton); // output /* TextView textView = new TextView(0, 1, Application.Cols, Application.Lines -2); textView.Add("Hello World!"); textView.Add("Foo bar me!"); Add(textView); */ LogWidget log = new LogWidget(0, 1, Application.Cols, Application.Lines -2); Add(log); _UI = new CursesUI(log); // input Entry entry = new Entry(0, Application.Lines - 1, Application.Cols, String.Empty); Add(entry); _Entry = entry; // status } } } smuxi-1.1/src/Frontend-Curses/Makefile.in0000664000175000017500000010363414011526471021205 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-Curses ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-frontend-curses 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-frontend-curses.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-frontend-curses.exe @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-frontend-curses.exe @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = exe @ENABLE_RELEASE_TRUE@COMPILE_TARGET = exe @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_RELEASE_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@MONO_CURSES_DLL_SOURCE = ../../lib/mono-curses/mono-curses.dll @ENABLE_RELEASE_TRUE@MONO_CURSES_DLL_SOURCE = ../../lib/mono-curses/mono-curses.dll @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB = $(BUILD_DIR)/smuxi-frontend.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB_SOURCE = ../../bin/debug/smuxi-frontend.dll.mdb AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(LOG4NET_DLL) \ $(SMUXI_ENGINE_DLL_MDB) \ $(NINI_DLL) \ $(SMUXI_ENGINE_DLL) \ $(MONO_CURSES_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) BINARIES = \ $(FRONTEND_CURSES) FILES = \ Main.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Frontend.cs \ MainWindow.cs \ Entry.cs \ CursesUI.cs \ TextView.cs \ LogWidget.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend-curses.in REFERENCES = \ System \ Mono.Posix \ $(MONO_CURSES_LIBS) \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY) $(ASSEMBLY).mdb \ $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_CURSES = $(BUILD_DIR)/smuxi-frontend-curses MONO_CURSES_DLL = $(BUILD_DIR)/mono-curses.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-Curses/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-Curses/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-frontend-curses: $(top_builddir)/config.status $(srcdir)/smuxi-frontend-curses.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-wrapper,FRONTEND_CURSES,frontend-smuxi-curses,x)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) # 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: smuxi-1.1/src/Frontend-Curses/Frontend.cs0000664000175000017500000001643114011467170021244 0ustar00meebeymeebey00000000000000/* * $Id: Frontend.cs 192 2007-04-22 11:48:12Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Frontend.cs $ * $Rev: 192 $ * $Author: meebey $ * $Date: 2007-04-22 13:48:12 +0200 (Sun, 22 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Terminal; using Smuxi.Engine; namespace Smuxi.Frontend.Curses { public class Frontend { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _Name = "smuxi"; private static readonly string _UIName = "Curses"; private static Version _Version; private static string _VersionString; private static Version _EngineVersion; private static MainWindow _MainWindow; private static FrontendConfig _FrontendConfig; private static Session _Session; private static UserConfig _UserConfig; private static FrontendManager _FrontendManager; public static string Name { get { return _Name; } } public static string UIName { get { return _UIName; } } public static Version Version { get { return _Version; } } public static Version EngineVersion { get { return _EngineVersion; } set { _EngineVersion = value; } } public static string VersionString { get { return _VersionString; } } public static MainWindow MainWindow { get { return _MainWindow; } } public static Session Session { get { return _Session; } set { _Session = value; } } public static FrontendManager FrontendManager { get { return _FrontendManager; } } public static Config Config { get { return _Session.Config; } } public static UserConfig UserConfig { get { return _UserConfig; } set { _UserConfig = value; } } public static FrontendConfig FrontendConfig { get { return _FrontendConfig; } } public static void Init(string[] args) { System.Threading.Thread.CurrentThread.Name = "Main"; Assembly asm = Assembly.GetAssembly(typeof(Frontend)); AssemblyName asm_name = asm.GetName(false); AssemblyProductAttribute pr = (AssemblyProductAttribute)asm. GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0]; _Version = asm_name.Version; _VersionString = pr.Product + " - " + _UIName + " frontend " + _Version; #if LOG4NET _Logger.Info(_VersionString + " starting"); #endif Application.Init(false); _MainWindow = new MainWindow(); _FrontendConfig = new FrontendConfig(UIName); // loading and setting defaults _FrontendConfig.Load(); _FrontendConfig.Save(); if (_FrontendConfig.IsCleanConfig) { } else { if (((string)FrontendConfig["Engines/Default"]).Length == 0) { InitLocalEngine(); } else { // there is a default engine set, means we want a remote engine //new EngineManagerDialog(); InitLocalEngine(); } } Application.Timeout = 100; Application.Iteration += delegate { Application.Refresh (); }; Application.Run(_MainWindow); #if LOG4NET _Logger.Warn("Application.Run() returned!"); #endif } public static void InitLocalEngine() { Engine.Engine.Init(); _EngineVersion = Engine.Engine.Version; _Session = new Engine.Session(Engine.Engine.Config, Engine.Engine.ProtocolManagerFactory, "local"); _Session.ExecuteOnStartupCommands(); _Session.ProcessAutoConnect(); _Session.RegisterFrontendUI(_MainWindow.UI); _UserConfig = _Session.UserConfig; ConnectEngineToGUI(); } public static void ConnectEngineToGUI() { _FrontendManager = _Session.GetFrontendManager(_MainWindow.UI); _FrontendManager.Sync(); if (_UserConfig.IsCaching) { // when our UserConfig is cached, we need to invalidate the cache _FrontendManager.ConfigChangedDelegate = new SimpleDelegate(_UserConfig.ClearCache); } // make sure entry got attention :-P // BUG: MonoCurses //_MainWindow.Entry.HasFocus = true; } public static void DisconnectEngineFromGUI() { _FrontendManager.IsFrontendDisconnecting = true; //_Session.DeregisterFrontendUI(_MainWindow.UI); //_MainWindow.Hide(); //_MainWindow.Notebook.RemoveAllPages(); _FrontendManager = null; _Session = null; } public static void Quit() { Mono.Terminal.Curses.endwin(); Environment.Exit(0); if (_FrontendManager != null) { _FrontendManager.IsFrontendDisconnecting = true; } /* BUG: don't do this, the access to config is lost and the entry will throw an exception then. if (_FrontendManager != null) { DisconnectEngineFromGUI(); } */ } public static void ShowException(Exception ex) { Application.Error("Error occurred!", ex.ToString()); } } } smuxi-1.1/src/Frontend-GNOME/0000775000175000017500000000000014011526501016524 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/FindGroupChatDialog.cs0000644000175000017500000002221112726351313022674 0ustar00meebeymeebey00000000000000/* * $Id: MainWindow.cs 273 2008-07-12 17:00:51Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/MainWindow.cs $ * $Rev: 273 $ * $Author: meebey $ * $Date: 2008-07-12 19:00:51 +0200 (Sat, 12 Jul 2008) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Threading; using System.Collections.Generic; using Mono.Unix; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public partial class FindGroupChatDialog : Gtk.Dialog { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private IProtocolManager f_ProtocolManager; private Gtk.ListStore f_ListStore; private GroupChatModel f_GroupChatModel; private Thread f_FindThread; public GroupChatModel GroupChat { get { return f_GroupChatModel; } } public Gtk.Entry NameEntry { get { return f_NameEntry; } } public Gtk.Button FindButton { get { return f_FindButton; } } public FindGroupChatDialog(Gtk.Window parent, IProtocolManager protocolManager) : base(null, parent, Gtk.DialogFlags.DestroyWithParent) { Build(); f_ProtocolManager = protocolManager; int columnID = 0; Gtk.TreeViewColumn column; columnID++; column = f_TreeView.AppendColumn("#", new Gtk.CellRendererText(), "text", columnID); column.SortColumnId = columnID; columnID++; column = f_TreeView.AppendColumn(_("Name"), new Gtk.CellRendererText(), "text", columnID); column.SortColumnId = columnID; column.Resizable = true; columnID++; column = f_TreeView.AppendColumn(_("Topic"), new Gtk.CellRendererText(), "markup", columnID); column.SortColumnId = columnID; column.Resizable = true; f_ListStore = new Gtk.ListStore( typeof(GroupChatModel), typeof(int), // person count typeof(string), // name typeof(string) // topic pango markup ); f_TreeView.RowActivated += OnTreeViewRowActivated; f_TreeView.Selection.Changed += OnTreeViewSelectionChanged; f_TreeView.Model = f_ListStore; f_TreeView.SearchColumn = 2; // name } protected virtual void OnFindButtonClicked(object sender, System.EventArgs e) { Trace.Call(sender, e); try { string nameFilter = f_NameEntry.Text.Trim(); if (!(Frontend.EngineProtocolVersion >= new Version("0.8.1")) && String.IsNullOrEmpty(nameFilter)) { Gtk.MessageDialog md = new Gtk.MessageDialog( this, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, _("Searching for group chats without a filter is not " + "recommended. This may take a while, or may not " + "work at all.\n" + "Do you wish to continue?") ); int result = md.Run(); md.Destroy(); if (result != (int) Gtk.ResponseType.Yes) { return; } } f_ListStore.Clear(); CancelFindThread(); GroupChatModel filter = new GroupChatModel(null, nameFilter, null); f_FindThread = new Thread(new ThreadStart(delegate { try { Gtk.Application.Invoke(delegate { GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Watch); }); IList chats = f_ProtocolManager.FindGroupChats(filter); Gtk.Application.Invoke(delegate { Gdk.Color bgColor = f_TreeView.Style.Background(Gtk.StateType.Normal); foreach (GroupChatModel chat in chats) { f_ListStore.AppendValues( chat, chat.PersonCount, chat.Name, PangoTools.ToMarkup(chat.Topic, bgColor) ); } }); } catch (ThreadAbortException) { #if LOG4NET f_Logger.Debug("FindThread aborted"); #endif Thread.ResetAbort(); } catch (Exception ex) { Frontend.ShowError(this, _("Error while fetching the list of group chats from the server."), ex); } finally { Gtk.Application.Invoke(delegate { // if the dialog is gone the GdkWindow might be destroyed already if (GdkWindow != null) { GdkWindow.Cursor = null; } }); } })); f_FindThread.IsBackground = true; f_FindThread.Start(); } catch (Exception ex) { Frontend.ShowException(ex); } } private void CancelFindThread() { if (f_FindThread != null && f_FindThread.IsAlive) { try { #if LOG4NET f_Logger.Debug("Aborting FindThread..."); #endif f_FindThread.Abort(); } catch (Exception ex) { #if LOG4NET f_Logger.Error(ex); #endif } f_FindThread = null; GdkWindow.Cursor = null; } } protected virtual GroupChatModel GetCurrentGroupChat() { Trace.Call(); Gtk.TreeIter iter; if (!f_TreeView.Selection.GetSelected(out iter)) { return null; } return (GroupChatModel) f_ListStore.GetValue(iter, 0); } protected virtual void OnTreeViewRowActivated(object sender, Gtk.RowActivatedArgs e) { Trace.Call(sender, e); try { GroupChatModel chat = GetCurrentGroupChat(); if (chat == null) { return; } Respond(Gtk.ResponseType.Ok); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnTreeViewSelectionChanged(object sender, EventArgs e) { Trace.Call(sender, e); try { f_OKButton.Sensitive = GetCurrentGroupChat() != null; } catch (Exception ex) { Frontend.ShowException(ex); } } protected override void OnResponse(Gtk.ResponseType responseType) { Trace.Call(responseType); switch (responseType) { case Gtk.ResponseType.Ok: f_GroupChatModel = GetCurrentGroupChat(); break; case Gtk.ResponseType.Cancel: CancelFindThread(); break; } base.OnResponse(responseType); } protected virtual void OnNameEntryActivated(object sender, System.EventArgs e) { Trace.Call(sender, e); try { f_FindButton.Click(); } catch (Exception ex) { Frontend.ShowException(ex); } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/NotifyManager.cs0000644000175000017500000004455512726351313021641 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2013 Mirco Bauer // // Full GPL License: // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #if NOTIFY_SHARP using System; using System.IO; using System.Collections.Generic; using Notifications; using Gtk.Extensions; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class NotifyManager { #if LOG4NET private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static Gdk.Pixbuf PersonChatIconPixbuf { get; set; } private static string PersonChatIconName { get; set; } private static Gdk.Pixbuf GroupChatIconPixbuf { get; set; } private static string GroupChatIconName { get; set; } private static List Capabilites { get; set; } private static string SoundFile { get; set; } private static Version SpecificationVersion { get; set; } private static string ServerVendor { get; set; } private static string ServerName { get; set; } Dictionary Notifications { get; set; } MainWindow MainWindow { get; set; } ChatViewManager ChatViewManager { get; set; } Dictionary HighlightEventHandlers { get; set; } bool IsInitialized { get; set; } bool IsEnabled { get; set; } static NotifyManager() { // image size >= 128 pixels as per notify-osd guidelines: // https://wiki.ubuntu.com/NotificationDevelopmentGuidelines PersonChatIconPixbuf = Frontend.LoadIcon( "smuxi-person-chat", 256, "person-chat_256x256.png" ); GroupChatIconPixbuf = Frontend.LoadIcon( "smuxi-group-chat", 256, "group-chat_256x256.png" ); var partialPath = "share"; partialPath = Path.Combine(partialPath, "sounds"); partialPath = Path.Combine(partialPath, "freedesktop"); partialPath = Path.Combine(partialPath, "stereo"); partialPath = Path.Combine(partialPath, "message-new-instant.oga"); var soundFile = Path.Combine(Defines.InstallPrefix, partialPath); var sysSoundFile = Path.Combine("/usr", partialPath); if (File.Exists(soundFile)) { SoundFile = soundFile; } else if (File.Exists(sysSoundFile)) { // fallback to system-wide install SoundFile = sysSoundFile; } } public NotifyManager(MainWindow mainWindow, ChatViewManager chatViewManager) { Trace.Call(mainWindow, chatViewManager); if (mainWindow == null) { throw new ArgumentNullException("mainWindow"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } MainWindow = mainWindow; ChatViewManager = chatViewManager; Notifications = new Dictionary(); HighlightEventHandlers = new Dictionary (); try { Init(); } catch (Exception ex) { #if LOG4NET Logger.Error("NotifyManager(): initialization failed: ", ex); #endif } } public void Dispose() { Trace.Call(); } public void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } if (!IsInitialized) { return; } IsEnabled = (bool) userConfig["Interface/Notification/PopupsEnabled"]; } void Init() { Trace.Call(); Capabilites = new List(Global.Capabilities); var version = Global.ServerInformation.SpecVersion; try { SpecificationVersion = new Version(version); } catch (Exception ex) { #if LOG4NET Logger.Error("Init(): couldn't parse specification version: " + "'" + version + "'", ex); #endif } ServerVendor = Global.ServerInformation.Vendor; ServerName = Global.ServerInformation.Name; #if LOG4NET Logger.Debug( String.Format( "Init(): Name: '{0}' Vendor: '{1}' Version: '{2}' " + "SpecVersion: '{3}' Capabilities: '{4}'", Global.ServerInformation.Name, Global.ServerInformation.Vendor, Global.ServerInformation.Version, Global.ServerInformation.SpecVersion, String.Join(", ", Global.Capabilities) ) ); #endif // HACK: a bug in notification-daemon-xfce skips the reason field // in NotificationClosed which leads to an exception: // System.IndexOutOfRangeException: Array index is out of range. // at NDesk.DBus.MessageReader.MarshalUInt (byte*) // see: http://bugzilla.xfce.org/show_bug.cgi?id=5339 if (Global.ServerInformation.Name == "Notification Daemon" && Global.ServerInformation.Vendor == "Galago Project") { #if LOG4NET Logger.Warn("Init(): detected buggy Xfce notification daemon, " + "suppressing notifications..."); #endif return; } MainWindow.FocusInEvent += OnMainWindowFocusInEvent; MainWindow.Notebook.SwitchPage += OnMainWindowNotebookSwitchPage; ChatViewManager.ChatAdded += OnChatViewManagerChatAdded; ChatViewManager.ChatRemoved += OnChatViewManagerChatRemoved; IsInitialized = true; } void OnChatViewManagerChatAdded(object sender, ChatViewManagerChatAddedEventArgs e) { // we are only interested in highlights on person and group chats if (!(e.ChatView is PersonChatView) && !(e.ChatView is GroupChatView)) { return; } MessageTextViewMessageHighlightedEventHandler handler = delegate(object o, MessageTextViewMessageHighlightedEventArgs args) { OnChatViewMessageHighlighted(o, args, e.ChatView); }; e.ChatView.OutputMessageTextView.MessageHighlighted += handler; // keep a reference to the handler so we can cleanup it up later // in OnChatViewManagerChatRemoved() HighlightEventHandlers.Add(e.ChatView, handler); } void OnChatViewManagerChatRemoved(object sender, ChatViewManagerChatRemovedEventArgs e) { MessageTextViewMessageHighlightedEventHandler handler; if (!HighlightEventHandlers.TryGetValue(e.ChatView, out handler)) { return; } e.ChatView.OutputMessageTextView.MessageHighlighted -= handler; HighlightEventHandlers.Remove(e.ChatView); } void OnChatViewMessageHighlighted(object sender, MessageTextViewMessageHighlightedEventArgs e, ChatView chatView) { #if MSG_DEBUG Trace.Call(sender, e, chatView); #endif if (!IsEnabled || e.Message.TimeStamp <= chatView.SyncedLastSeenHighlight || (MainWindow.HasToplevelFocus && (ChatViewManager.CurrentChatView == chatView || MainWindow.ChatTreeView.IsVisible(chatView)))) { // no need to show a notification for: // - disabled chats // - seen highlights // - main window has focus and the chat is active or the chat // row is visible return; } try { ShowNotification(chatView, e.Message); } catch (Exception ex) { #if LOG4NET Logger.Error("OnChatViewMessageHighlighted(): " + "ShowNotification() threw exception", ex); #endif } } void ShowNotification(ChatView chatView, MessageModel msg) { Notification notification; if (!Capabilites.Contains("append") && Notifications.TryGetValue(chatView, out notification)) { // no support for append, update the existing notification notification.Body = GLib.Markup.EscapeText( msg.ToString() ); return; } notification = new Notification() { Summary = chatView.Name, Category = "im.received" }; notification.AddHint("desktop-entry", "smuxi-frontend-gnome"); if (Capabilites.Contains("body")) { // notify-osd doesn't like unknown tags when appending notification.Body = GLib.Markup.EscapeText( msg.ToString() ); } if (Capabilites.Contains("icon-static")) { Gdk.Pixbuf iconData = null; string iconName = null; if (chatView is PersonChatView) { iconData = PersonChatIconPixbuf; iconName = "smuxi-person-chat"; } else if (chatView is GroupChatView) { iconData = GroupChatIconPixbuf; iconName = "smuxi-group-chat"; } var theme = Gtk.IconTheme.Default; #if DISABLED // OPT: use icon path/name if we can, so the image (26K) is not // send over D-Bus. Especially with the gnome-shell this is a // serious performance issue, see: // https://bugzilla.gnome.org/show_bug.cgi?id=683829 if (iconName != null && theme.HasIcon(iconName)) { // HACK: use icon path instead of name as gnome-shell does // not support icon names correctly, see: // https://bugzilla.gnome.org/show_bug.cgi?id=665957 var iconInfo = theme.LookupIcon(iconName, 256, Gtk.IconLookupFlags.UseBuiltin); if (!String.IsNullOrEmpty(iconInfo.Filename) && File.Exists(iconInfo.Filename) && ServerVendor == "GNOME" && (ServerName == "Notification Daemon" || ServerName == "gnome-shell")) { // HACK: notification-daemon 0.7.5 seems to ignore // the image_path hint for some reason, thus we have to // rely on app_icon instead, see: // https://bugzilla.gnome.org/show_bug.cgi?id=684653 // HACK: gnome-shell 3.4.2 shows no notification at all // with image_path and stops responding to further // notifications which freezes Smuxi completely! notification.IconName = "file://" + iconInfo.Filename; } else if (!String.IsNullOrEmpty(iconInfo.Filename) && File.Exists(iconInfo.Filename) && SpecificationVersion >= new Version("1.1")) { // starting with DNS >= 1.1 we can use the image-path // hint instead of icon_data or app_icon var hintName = "image_path"; if (SpecificationVersion >= new Version("1.2")) { hintName = "image-path"; } notification.AddHint(hintName, "file://" + iconInfo.Filename); } else { // fallback to icon_data as defined in DNS 0.9 notification.Icon = iconData; } #endif if (Frontend.HasSystemIconTheme && iconName != null && theme.HasIcon(iconName)) { notification.IconName = iconName; } else if (iconName != null && theme.HasIcon(iconName)) { // icon wasn't in the system icon theme var iconInfo = theme.LookupIcon(iconName, 256, Gtk.IconLookupFlags.UseBuiltin); if (!String.IsNullOrEmpty(iconInfo.Filename) && File.Exists(iconInfo.Filename)) { notification.IconName = "file://" + iconInfo.Filename; } } else if (iconData != null) { // fallback to icon_data as the icon is not available in // the theme notification.Icon = iconData; } else { // fallback for non-group/person messages notification.IconName = "notification-message-im"; } } else { // fallback to generic icon notification.IconName = "notification-message-im"; } if (Capabilites.Contains("actions")) { notification.AddAction("show", _("Show"), delegate { try { MainWindow.PresentWithServerTime(); ChatViewManager.CurrentChatView = chatView; notification.Close(); } catch (Exception ex) { #if LOG4NET Logger.Error("OnChatViewMessageHighlighted() " + "notification.Show threw exception", ex); #endif } }); } if (Capabilites.Contains("append")) { notification.AddHint("append", String.Empty); } if (Capabilites.Contains("sound")) { // DNS 0.9 only supports sound-file which is a file path // http://www.galago-project.org/specs/notification/0.9/x344.html // DNS 1.1 supports sound-name which is an id, see: // http://people.canonical.com/~agateau/notifications-1.1/spec/ar01s08.html // http://0pointer.de/public/sound-naming-spec.html // LAMESPEC: We can't tell which of those are actually // supported by this version as hint are totally optional :/ // HACK: always pass both hints when possible notification.AddHint("sound-name", "message-new-instant"); if (SoundFile != null) { notification.AddHint("sound-file", SoundFile); } } notification.Closed += delegate { try { #if LOG4NET Logger.Debug("OnChatViewMessageHighlighted(): received " + "notification.Closed signal for: " + chatView.Name); #endif Notifications.Remove(chatView); } catch (Exception ex) { #if LOG4NET Logger.Error("OnChatViewMessageHighlighted(): " + "Exception in notification.Closed handler", ex); #endif } }; notification.Show(); if (!Notifications.ContainsKey(chatView)) { Notifications.Add(chatView, notification); } } void OnMainWindowFocusInEvent(object sender, Gtk.FocusInEventArgs e) { Trace.Call(sender, e); if (MainWindow.Notebook.IsBrowseModeEnabled) { return; } var currentChatView = ChatViewManager.CurrentChatView; if (currentChatView == null) { return; } DisposeNotification(currentChatView); } void OnMainWindowNotebookSwitchPage(object sender, Gtk.SwitchPageArgs e) { Trace.Call(sender, e); if (MainWindow.Notebook.IsBrowseModeEnabled) { return; } var currentChatView = ChatViewManager.CurrentChatView; if (currentChatView == null) { return; } DisposeNotification(currentChatView); } void DisposeNotification(ChatView chatView) { Notification notification; if (!Notifications.TryGetValue(chatView, out notification)) { return; } #if LOG4NET Logger.Debug("DisposeNotification(): disposing notification for: " + chatView.Name); #endif try { // don't try to close already closed notifications (timeout) if (notification.Id == 0) { #if LOG4NET Logger.Debug("DisposeNotification(): notification already " + "closed for: " + chatView.Name); #endif return; } notification.Close(); } catch (Exception ex) { #if LOG4NET Logger.Error("DisposeNotification(): " + "notification.Close() thew exception", ex); #endif } finally { Notifications.Remove(chatView); } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } #endif smuxi-1.1/src/Frontend-GNOME/Preferences/0000775000175000017500000000000014011526501020765 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Preferences/ServerListView.cs0000664000175000017500000002623114011467170024263 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2008, 2010, 2012-2013, 2016 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; #if GTK_SHARP_3 using TreeModel = Gtk.ITreeModel; #else using TreeModel = Gtk.TreeModel; #endif using UI = Gtk.Builder.ObjectAttribute; namespace Smuxi.Frontend.Gnome { public class ServerListView : Gtk.Bin { private ServerListController _Controller; private Gtk.Window _Parent; #region Widgets [UI("ServersTreeView")] private Gtk.TreeView _TreeView; private Gtk.TreeStore _TreeStore; [UI("EditServerToolButton")] Gtk.ToolButton _EditButton; [UI("RemoveServerToolButton")] Gtk.ToolButton _RemoveButton; #endregion public ServerListView(Gtk.Window parent) { Trace.Call(parent); if (parent == null) { throw new ArgumentNullException("parent"); } _Parent = parent; Build(); Init(); ShowAll(); } void Build() { global::Stetic.BinContainer.Attach(this); var builder = new Gtk.Builder(null, "ServerListWidget.ui", null); builder.Autoconnect(this); var box = (Gtk.Widget) builder.GetObject("ServerListBox"); Add(box); } void Init() { _Controller = new ServerListController(Frontend.UserConfig); _TreeView.AppendColumn(_("Protocol"), new Gtk.CellRendererText(), "text", 1); _TreeView.AppendColumn(_("Hostname"), new Gtk.CellRendererText(), "text", 2); _TreeStore = new Gtk.TreeStore(typeof(ServerModel), typeof(string), // protocol typeof(string) // hostname ); _TreeStore.SetSortColumnId(0, Gtk.SortType.Ascending); _TreeStore.SetSortFunc(0, SortTreeStore); _TreeView.RowActivated += OnTreeViewRowActivated; _TreeView.Selection.Changed += OnTreeViewSelectionChanged; _TreeView.Model = _TreeStore; } public virtual void Load() { Trace.Call(); _TreeStore.Clear(); // group servers by protocol Dictionary> protocols = new Dictionary>(); IList servers = _Controller.GetServerList(); foreach (ServerModel server in servers) { List protocolServers = null; protocols.TryGetValue(server.Protocol, out protocolServers); if (protocolServers == null) { protocolServers = new List(); protocols.Add(server.Protocol, protocolServers); } protocolServers.Add(server); } // add grouped servers to treeview foreach (KeyValuePair> pair in protocols) { Gtk.TreeIter parentIter = _TreeStore.AppendValues(null, pair.Key, String.Empty); foreach (ServerModel server in pair.Value) { // a server with an empty hostname has only one default/hardcoded // hostname, thus don't create a sub-node for it if (String.IsNullOrEmpty(server.Hostname)) { _TreeStore.SetValue(parentIter, 0, server); continue; } _TreeStore.AppendValues(parentIter, server, String.Empty, server.Hostname); } } _TreeView.ExpandAll(); } public virtual ServerModel GetCurrentServer() { Trace.Call(); Gtk.TreeIter iter; if (!_TreeView.Selection.GetSelected(out iter)) { return null; } return (ServerModel) _TreeStore.GetValue(iter, 0); } public virtual void Add() { Trace.Call(); var dialog = new ServerDialog(_Parent, null, Frontend.Session.GetSupportedProtocols(), _Controller.GetNetworks()); try { int res = dialog.Run(); ServerModel server = dialog.GetServer(); if (res != (int) Gtk.ResponseType.Ok) { return; } _Controller.AddServer(server); _Controller.Save(); // refresh view Load(); } finally { dialog.Destroy(); } } public virtual void Edit(ServerModel server) { Trace.Call(server); if (server == null) { throw new ArgumentNullException("server"); } var dialog = new ServerDialog(_Parent, server, Frontend.Session.GetSupportedProtocols(), _Controller.GetNetworks()); int res = dialog.Run(); server = dialog.GetServer(); dialog.Destroy(); if (res != (int) Gtk.ResponseType.Ok) { return; } _Controller.SetServer(server); _Controller.Save(); // refresh the view Load(); } public virtual void Remove(ServerModel server) { Trace.Call(server); if (server == null) { throw new ArgumentNullException("server"); } Gtk.MessageDialog md = new Gtk.MessageDialog(null, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, _("Are you sure you want to delete the selected server?")); int result = md.Run(); md.Destroy(); if (result != (int) Gtk.ResponseType.Yes) { return; } _Controller.RemoveServer(server.Protocol, server.ServerID); _Controller.Save(); // refresh the view Load(); } protected virtual void OnTreeViewSelectionChanged(object sender, EventArgs e) { Trace.Call(sender, e); try { if (GetCurrentServer() == null) { _EditButton.Sensitive = false; _RemoveButton.Sensitive = false; } else { _EditButton.Sensitive = true; _RemoveButton.Sensitive = true; } } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnAddButtonClicked(object sender, EventArgs e) { Trace.Call(sender, e); try { Add(); } catch (InvalidOperationException ex) { Frontend.ShowError(_Parent, _("Unable to add server: "), ex); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnEditButtonClicked(object sender, EventArgs e) { Trace.Call(sender, e); try { ServerModel server = GetCurrentServer(); if (server == null) { return; } Edit(server); } catch (ApplicationException ex) { Frontend.ShowError(_Parent, _("Unable to edit server: "), ex); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnRemoveButtonClicked(object sender, EventArgs e) { Trace.Call(sender, e); try { ServerModel server = GetCurrentServer(); if (server == null) { return; } Remove(server); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnTreeViewRowActivated(object sender, Gtk.RowActivatedArgs e) { Trace.Call(sender, e); try { ServerModel server = GetCurrentServer(); if (server == null) { return; } Edit(server); } catch (ApplicationException ex) { Frontend.ShowError(_Parent, _("Unable to edit server: "), ex); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual int SortTreeStore(TreeModel model, Gtk.TreeIter iter1, Gtk.TreeIter iter2) { var server1 = (ServerModel) model.GetValue(iter1, 0); var server2 = (ServerModel) model.GetValue(iter2, 0); // protocol nodes don't have a ServerModel if (server1 == null && server2 == null) { return 0; } if (server2 == null) { return 1; } if (server1 == null) { return -1; } var s1 = String.Format("{0}/{1}:{2} ({3})", server1.Protocol, server1.Hostname, server1.Port, server1.ServerID); var s2 = String.Format("{0}/{1}:{2} ({3})", server2.Protocol, server2.Hostname, server2.Port, server2.ServerID); return s1.CompareTo(s2); } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/StatusIconManager.cs0000664000175000017500000001743514011467170022462 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2011 Mirco Bauer // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { #if GTK_SHARP_2_10 public class StatusIconManager { Gtk.StatusIcon f_StatusIcon; MainWindow f_MainWindow; ChatViewManager f_ChatViewManager; NotificationAreaIconMode f_NotificationAreaIconMode; public StatusIconManager(MainWindow mainWindow, ChatViewManager chatViewManager) { if (mainWindow == null) { throw new ArgumentNullException("mainWindow"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } f_MainWindow = mainWindow; f_MainWindow.FocusInEvent += OnMainWindowFocusInEvent; f_MainWindow.Minimized += delegate { CheckMainWindowState(); }; f_MainWindow.Unminimized += delegate { CheckMainWindowState(); }; f_MainWindow.Hidden += delegate { CheckMainWindowState(); }; f_MainWindow.Shown += delegate { CheckMainWindowState(); }; f_ChatViewManager = chatViewManager; f_ChatViewManager.ChatAdded += OnChatViewManagerChatAdded; f_ChatViewManager.ChatRemoved += OnChatViewManagerChatRemoved; } public void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } string modeStr = (string) userConfig["Interface/Notification/NotificationAreaIconMode"]; f_NotificationAreaIconMode = (NotificationAreaIconMode) Enum.Parse( typeof(NotificationAreaIconMode), modeStr ); // initialize status icon for the first time if (f_NotificationAreaIconMode != NotificationAreaIconMode.Never && f_StatusIcon == null) { f_StatusIcon = new Gtk.StatusIcon(); if (Frontend.HasSystemIconTheme) { f_StatusIcon.IconName = Frontend.IconName; } else { f_StatusIcon.Pixbuf = Frontend.LoadIcon( Frontend.IconName, 256, "icon_256x256.png" ); } f_StatusIcon.Activate += OnStatusIconActivated; f_StatusIcon.PopupMenu += OnStatusIconPopupMenu; f_StatusIcon.Tooltip = "Smuxi"; } if (f_NotificationAreaIconMode == NotificationAreaIconMode.Never && !f_MainWindow.Visible) { // force window unhide as the user would not be able to bring // it back without a notification icon! f_MainWindow.Visible = true; } CheckMainWindowState(); } private void CheckMainWindowState() { Trace.Call(); if (f_StatusIcon == null) { return; } switch (f_NotificationAreaIconMode) { case NotificationAreaIconMode.Never: f_StatusIcon.Visible = false; break; case NotificationAreaIconMode.Always: f_StatusIcon.Visible = true; break; case NotificationAreaIconMode.Minimized: f_StatusIcon.Visible = f_MainWindow.IsMinimized; break; case NotificationAreaIconMode.Closed: f_StatusIcon.Visible = !f_MainWindow.Visible; break; } } private void OnStatusIconActivated(object sender, EventArgs e) { Trace.Call(sender, e); if (f_StatusIcon == null) { return; } try { if (f_StatusIcon.Blinking) { f_MainWindow.Present(); return; } // not everyone uses a window list applet thus we have to // restore from minimized state here, see: // http://projects.qnetp.net/issues/show/159 if (f_MainWindow.IsMinimized) { f_MainWindow.Present(); return; } f_MainWindow.Visible = !f_MainWindow.Visible; } catch (Exception ex) { Frontend.ShowException(ex); } } private void OnStatusIconPopupMenu(object sender, EventArgs e) { Trace.Call(sender, e); Gtk.Menu menu = new Gtk.Menu(); Gtk.ImageMenuItem preferencesItem = new Gtk.ImageMenuItem( Gtk.Stock.Preferences, null ); preferencesItem.Activated += delegate { try { var builder = new Gtk.Builder(null, "PreferencesDialog2.ui", null); var widget = (Gtk.Widget) builder.GetObject("PreferencesDialog"); var dialog = new PreferencesDialog(f_MainWindow, builder, widget.Handle); dialog.Show(); } catch (Exception ex) { Frontend.ShowException(ex); } }; menu.Add(preferencesItem); menu.Add(new Gtk.SeparatorMenuItem()); Gtk.ImageMenuItem quitItem = new Gtk.ImageMenuItem( Gtk.Stock.Quit, null ); quitItem.Activated += delegate { try { Frontend.Quit(); } catch (Exception ex) { Frontend.ShowException(ex); } }; menu.Add(quitItem); menu.ShowAll(); menu.Popup(); } private void OnMainWindowFocusInEvent(object sender, EventArgs e) { Trace.Call(sender, e); if (f_StatusIcon == null) { return; } f_StatusIcon.Blinking = false; } protected void OnChatViewManagerChatAdded(object sender, ChatViewManagerChatAddedEventArgs e) { e.ChatView.MessageHighlighted += OnChatViewMessageHighlighted; } protected void OnChatViewManagerChatRemoved(object sender, ChatViewManagerChatRemovedEventArgs e) { e.ChatView.MessageHighlighted -= OnChatViewMessageHighlighted; } private void OnChatViewMessageHighlighted(object sender, ChatViewMessageHighlightedEventArgs e) { #if MSG_DEBUG Trace.Call(sender, e); #endif if (f_StatusIcon == null) { return; } if (!f_MainWindow.HasToplevelFocus) { f_StatusIcon.Blinking = true; } } } #endif } smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.desktop0000664000175000017500000001410614011526501024206 0ustar00meebeymeebey00000000000000[Desktop Entry] Version=1.0 Name=Smuxi Name[ca]=Smuxi Name[cs]=Smuxi Name[da]=Smuxi Name[de]=Smuxi Name[el]=Smuxi Name[es]=Smuxi Name[fa]=Smuxi Name[fi]=Smuxi Name[fr]=Smuxi Name[hr]=Smuxi Name[hu]=Smuxi Name[id]=Smuxi Name[lt]=Smuxi Name[nl]=Smuxi Name[pl]=Smuxi Name[pt]=Smuxi Name[pt_BR]=Smuxi Name[ro]=Smuxi Name[ru]=Smuxi Name[sr]=Смукси Name[sv]=Smuxi Name[te]=స్మక్సి Name[tr]=Smuxi Name[zh_CN]=Smuxi GenericName=IRC Chat GenericName[ca]=_Xat a l'IRC GenericName[cs]=Pokec IRC GenericName[da]=IRC-chat GenericName[de]=IRC-Chat GenericName[el]=Συνομιλία IRC GenericName[es]=Chat IRC GenericName[fi]=IRC-keskustelu GenericName[fr]=Chat IRC GenericName[hr]=IRC Chat GenericName[hu]=IRC csevegés GenericName[id]=Obrolan IRC GenericName[it]=Chat IRC GenericName[lt]=IRC Pokalbis GenericName[nl]=IRC-chat GenericName[pl]=Rozmowy w sieci IRC GenericName[pt]=Chat de IRC GenericName[pt_BR]=Bate-papo IRC GenericName[ro]=Discuție IRC GenericName[ru]=IRC-чат GenericName[sk]=IRC Chat GenericName[sr]=Интернет ћаскање GenericName[sv]=IRC-chatt GenericName[tr]=IRC Sohbet GenericName[ur]=IRC Chat GenericName[zh_CN]=IRC 聊天 X-GNOME-FullName=Smuxi IRC Client X-GNOME-FullName[ca]=Client d'IRC Smuxi X-GNOME-FullName[cs]=Klient IRC Smuxi X-GNOME-FullName[da]=Smuxi — IRC-klient X-GNOME-FullName[de]=Smuxi - Chat-Client X-GNOME-FullName[el]=Πελάτης IRC Smuxi X-GNOME-FullName[es]=Cliente IRC Smuxi X-GNOME-FullName[fi]=Smuxi-IRC-asiakasohjelma X-GNOME-FullName[fr]=Client IRC Smuxi X-GNOME-FullName[hr]=Smuxi IRC klijent X-GNOME-FullName[hu]=Smuxi IRC-kliens X-GNOME-FullName[id]=Klien IRC Smuxi X-GNOME-FullName[it]=Client di IRC Smuxi X-GNOME-FullName[lt]=Smuxi IRC Kliento Programa X-GNOME-FullName[nl]=Smuxi-IRC-cliënt X-GNOME-FullName[pl]=Klient sieci IRC Smuxi X-GNOME-FullName[pt]=Cliente de IRC Smuxi X-GNOME-FullName[pt_BR]=Cliente IRC Smuxi X-GNOME-FullName[ro]=Client IRC Smuxi X-GNOME-FullName[ru]=IRC-клиент Smuxi X-GNOME-FullName[sk]=IRC klient Smuxi X-GNOME-FullName[sr]=Смукси клијент интернет ћаскања X-GNOME-FullName[sv]=Smuxi IRC-klient X-GNOME-FullName[tr]=Smuxi IRC İstemci X-GNOME-FullName[ur]=Smuxi IRC Client X-GNOME-FullName[zh_CN]=Smuxi IRC 客户端 Comment=Chat with other people on IRC Comment[ca]=Xategeu amb altres persones a l'IRC Comment[cs]=Pokecejte si s dalšími lidmi na IRC Comment[da]=Chat med andre via IRC Comment[de]=Mit anderen Leuten im IRC kommunizieren Comment[el]=Συνομιλία με άλλα άτομα στο IRC Comment[es]=Charla con otras personas en IRC Comment[fi]=Juttele muiden kanssa IRC:ssä Comment[fr]=Chatter sur IRC avec d'autres gens Comment[hr]=Chatajte sa drugim ljudima na IRCu Comment[hu]=Csevegés más emberekkel IRC csatornán Comment[id]=Mengobrol dengan orang lain di IRC Comment[it]=Chiacchiera con altre persone su IRC Comment[lt]=Kalbėkite su kitais žmonėmis per IRC Comment[nl]=Praat met andere mensen op IRC Comment[pl]=Rozmawianie w sieci IRC Comment[pt]=Conversar com outra pessoa no IRC Comment[pt_BR]=Converse com outras pessoas no IRC Comment[ro]=Discutați cu alte persoane pe IRC Comment[ru]=Разговор с людьми в сети IRC Comment[sk]=Rozprávajte sa s ostatnými ľuďmi na IRC Comment[sr]=Ћаскајте са другим људима на интернету Comment[sv]=Chatta med andra människor på IRC Comment[tr]=IRC'de başkalarıyla sohbet et Comment[ur]=Chat with other people on IRC Comment[zh_CN]=和 IRC 上的其他人聊天 Keywords=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[cs]=chat;pokec;diskuze;zprávy;rychlé správy;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabber; Keywords[da]=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;beskeder;meddelelser;samtale;snak; Keywords[de]=chat;messaging;sofortnachrichten;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[el]=συνομιλία;μηνύματα;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[es]=chat;mensajería;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[fi]=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;keskustelu;viestintä; Keywords[fr]=chat;méssagerie;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[hu]=csevegés;üzenetküldés;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[id]=obrol;perpesanan;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[lt]=pokalbiai;susirašinėjimai;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[nl]=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;berichten;gesprekken;babbelen;praten;spreken;klappen;kletsen; Keywords[pl]=rozmowa;rozmawianie;czat;czatowanie;chat;komunikator;wiadomość;wiadomości;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[pt]=chat;conversa;mensagens;instantâneas;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[pt_BR]=bate-papo;chat;mensagem;;instantânea;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[ro]=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;discuție;mesagerie; Keywords[ru]=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[sr]=ћаскање;дописивање;порука;им;гном;гтк;ирц;твитер;фејсбук;гразговор;иксмпп;џабер;кампфајер;џаббр; Keywords[sv]=chatt;meddelande;snabbmeddelande;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[tr]=chat;mesajlaşma;anında mesajlaşma;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Keywords[zh_CN]=聊天;通讯;chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Exec=smuxi-frontend-gnome Terminal=false Type=Application Categories=Network;GNOME;GTK;Chat;InstantMessaging;IRCClient; Icon=smuxi-frontend-gnome smuxi-1.1/src/Frontend-GNOME/NotImplementedMessageDialog.cs0000644000175000017500000000365711655545675024465 0ustar00meebeymeebey00000000000000/* * $Id: PreferencesDialog.cs 73 2005-06-27 12:42:06Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GtkGnome/PreferencesDialog.cs $ * $Rev: 73 $ * $Author: meebey $ * $Date: 2005-06-27 14:42:06 +0200 (Mon, 27 Jun 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Mono.Unix; using Smuxi; namespace Smuxi.Frontend.Gnome { public class NotImplementedMessageDialog : Gtk.MessageDialog { public NotImplementedMessageDialog(Gtk.Window parent) : base(parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Info, Gtk.ButtonsType.Close, _("Sorry, not implemented yet!")) { } public static void Show(Gtk.Window parent) { NotImplementedMessageDialog nimd = new NotImplementedMessageDialog(parent); nimd.Run(); nimd.Destroy(); } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Gtk.WindowExtensions.cs0000644000175000017500000000612212250426550023133 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Mirco Bauer // // 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 AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; using System.Runtime.InteropServices; namespace Gtk.Extensions { public static class WindowExtensions { static bool IsGdkX11Available = true; [DllImport("libgdk-x11-2.0.so.0")] static extern UInt32 gdk_x11_get_server_time(IntPtr gdkWindowHandle); public static void PresentWithServerTime(this Gtk.Window window) { if (window == null) { return; } var gdkWindow = window.GdkWindow; if (gdkWindow == null || !IsGdkX11Available) { window.Present(); return; } // HACK: disabled, see window.AddEvents() below /* if ((gdkWindow.Events & Gdk.EventMask.PropertyChangeMask) == 0) { // GDK_PROPERTY_CHANGE_MASK is not set thus we have to bail out // else gdk_x11_get_server_time() will hang! window.Present(); return; } */ // HACK: we can't obtain and check for GDK_PROPERTY_CHANGE_MASK as // gdk_window_x11_get_events() filters that mask, thus we have to // ignorantly set it using gtk_widget_add_events() else // gdk_x11_get_server_time() would hang if it wasn't set! window.AddEvents((int) Gdk.EventMask.PropertyChangeMask); try { // TODO: should we fallback to gdk_x11_display_get_user_time? var timestamp = gdk_x11_get_server_time(gdkWindow.Handle); window.PresentWithTime(timestamp); } catch (DllNotFoundException) { IsGdkX11Available = false; // no libgdk-x11 available (probably Mac OS X or Windows), thus // fallback to gtk_window_present() without a timestamp as they // don't require a timestamp to change the window focus window.Present(); } } } } smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.in0000664000175000017500000000273313411450522023150 0ustar00meebeymeebey00000000000000#!/bin/sh # workaround TLS/SSL negotiation caching issues of Mono, see: # https://smuxi.im/issues/show/802 MONO_TLS_SESSION_CACHE_TIMEOUT=0 export MONO_TLS_SESSION_CACHE_TIMEOUT # Mono >= 4 SEGVs with Boehm as GC during startup # see https://bugzilla.opensuse.org/show_bug.cgi?id=955080 if ! mono -V | grep -q -e "version [4-9]\."; then # HACK: forcibly disabled SGen, as it has a known SEGV bug related to the # Mono.Data.Sqlite binding that does not happen with the boehm GC, see: # https://smuxi.im/issues/show/1062 MONO_ENV_OPTIONS="$(echo $MONO_ENV_OPTIONS | sed s/--gc=sgen//)" MONO_ENV_OPTIONS="--gc=boehm $MONO_ENV_OPTIONS" export MONO_ENV_OPTIONS fi # Smuxi uses an IPC channel for the single application instance feature and it # also allows to pass links from commandline to an existing Smuxi instance. This # IPC channel must be private to the user that executes Smuxi, else other system # users could control the existing Smuxi instance. Mono doesn't support LOCAL\ # named pipes yet and thus we need to emulate the privateness to the user by # using a TMP directory that is only readable by the same user who started # Smuxi. This also workarounds the world-writable unix socket in /tmp issue of # Mono, see: https://smuxi.im/issues/show/1072 SMUXI_TMP=$HOME/.cache/smuxi/tmp if [ ! -d $SMUXI_TMP ]; then mkdir -p $SMUXI_TMP fi chmod 700 $SMUXI_TMP TMP=$SMUXI_TMP export TMP exec mono --debug "@expanded_libdir@/@PACKAGE@/smuxi-frontend-gnome.exe" "$@" smuxi-1.1/src/Frontend-GNOME/AssemblyInfo.cs0000644000175000017500000000233612253423337021461 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2009 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - GNOME frontend")] [assembly: AssemblyCopyright("2005-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] #if LOG4NET // let log4net use .exe.config file [assembly: log4net.Config.XmlConfigurator] #endif smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.10000644000175000017500000000307712726351313022710 0ustar00meebeymeebey00000000000000.Dd $Mdocdate: June 02 2015 $ .Dt smuxi-frontend-gnome 1 .Os .Sh NAME .Nm smuxi-frontend-gnome .Nd GNOME frontend for Smuxi chat client .Sh SYNOPSIS .Nm smuxi-frontend-gnome .Op Fl dh .Op Fl e Ar engine .Op Fl \-new-instance .Op Fl \-open Ar uri .Sh DESCRIPTION .Nm is a GNOME frontend for the Smuxi chat client, powered by the GTK# library. It can operate standalone or attached to a remote Smuxi engine. .Pp The options are as follows: .Bl -tag -width Ds .It Fl d , Fl \-debug Turn on debugging. Debug logs are sent to .Pa $XDG_DATA_HOME/smuxi/smuxi-frontend-gnome.log , and older logs are moved to the date of usage. .It Fl h , Fl \-help Show the arguments Smuxi takes. .It Fl e Ar engine , Fl \-engine Ar engine Connect to a remote engine. .It Fl \-new-instance Starts a new Smuxi instance and ignores any existing sessions.a .It Fl \-open Ar uri , Fl \-open-link Ar uri Opens a URL to an IRC channel, in the following form: .Ql irc://irc.example.com/examplechannel .El .Sh FILES .Bl -tag -width -compact .It Pa $XDG_DATA_HOME/smuxi/share/smuxi-frontend-gnome.log smuxi debug log .It Pa $XDG_CONFIG_HOME/smuxi/smuxi-engine.ini smuxi local engine config .It Pa $XDG_CONFIG_HOME/smuxi/smuxi-frontend.ini smuxi frontend configuration and remote engine list .El .Sh SEE ALSO .Xr smuxi-frontend-stfl 1 , .Xr smuxi-server 1 , .Xr smuxi-message-buffer 1 .Pp Website: https://smuxi.im/ .Sh AUTHOR/CREDITS Smuxi, including this frontend, was written by Mirco Bauer. Contributions to this frontend were also made by George Karavasilev and Oliver Schneider. .Pp This manpage was written by Calvin Buckley. smuxi-1.1/src/Frontend-GNOME/SplashScreenWindow.cs0000644000175000017500000000276711655545675022677 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Frontend.Gnome { public class SplashScreenWindow : Gtk.Window { public SplashScreenWindow() : base("Smuxi - Splashscreen") { Decorated = false; WindowPosition = Gtk.WindowPosition.Center; Add(new Gtk.Image(new Gdk.Pixbuf(null, "splashscreen.png"))); ShowAll(); // force GTK+ to draw us, regardless if we are in the glib/gtk main-loop while (Gtk.Application.EventsPending()) { Gtk.Application.RunIteration(); } } } } smuxi-1.1/src/Frontend-GNOME/Views/0000775000175000017500000000000014011526501017621 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Views/ChatTreeView.cs0000664000175000017500000004760714011472672022531 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013-2015 Mirco Bauer // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class ChatTreeView : Gtk.TreeView { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public Gtk.TreeStore TreeStore { get; private set; } ThemeSettings ThemeSettings { get; set; } Gtk.TreeViewColumn ActivityColumn { get; set; } int f_CurrentChatNumber; public ChatView CurrentChatView { get { Gtk.TreeIter iter; if (!Selection.GetSelected(out iter)) { return null; } return (ChatView) TreeStore.GetValue(iter, 0); } set { Gtk.TreeIter iter; if (value == null) { if (!TreeStore.GetIterFirst(out iter)) { // no chat views available; this can happen on shutdown return; } } else { if (!TryFindChatIter(value, out iter)) { #if LOG4NET f_Logger.ErrorFormat( "set_CurrentChatView(): TryFindChatIter({0}) " + "found no matching chat, ignoring...", value ); #endif return; } } var path = TreeStore.GetPath(iter); // we have to ensure we can make the new selection ExpandToPath(path); Selection.SelectPath(path); } } public int CurrentChatNumber { get { return f_CurrentChatNumber; } set { var path = GetPath(value); if (path == null) { return; } // we have to ensure we can make the new selection ExpandToPath(path); Selection.SelectPath(path); } } public ChatTreeView() { ThemeSettings = new ThemeSettings(); TreeStore = new Gtk.TreeStore(typeof(ChatView)); TreeStore.SetSortColumnId(0, Gtk.SortType.Ascending); TreeStore.SetSortFunc(0, SortTreeStore); Model = TreeStore; HeadersVisible = false; BorderWidth = 0; ShowExpanders = false; LevelIndentation = 12; Selection.Mode = Gtk.SelectionMode.Browse; Selection.Changed += (sender, e) => { Gtk.TreeIter iter; if (!Selection.GetSelected(out iter) && TreeStore.GetIterFirst(out iter)) { Selection.SelectIter(iter); return; } if (Gtk.TreeIter.Zero.Equals(iter)) { // no chat views available; this happens during shutdown return; } var path = TreeStore.GetPath(iter); f_CurrentChatNumber = GetRowNumber(path); }; var iconRenderer = new Gtk.CellRendererPixbuf(); var column = new Gtk.TreeViewColumn(null, iconRenderer); column.Spacing = 0; column.Sizing = Gtk.TreeViewColumnSizing.Autosize; column.SetCellDataFunc(iconRenderer, new Gtk.TreeCellDataFunc(RenderChatViewIcon)); AppendColumn(column); var cellRenderer = new Gtk.CellRendererText() { Ellipsize = Pango.EllipsizeMode.End }; column = new Gtk.TreeViewColumn(null, cellRenderer); column.Spacing = 0; column.Expand = true; column.Sizing = Gtk.TreeViewColumnSizing.Autosize; column.SetCellDataFunc(cellRenderer, new Gtk.TreeCellDataFunc(RenderChatViewName)); AppendColumn(column); cellRenderer = new Gtk.CellRendererText(); column = new Gtk.TreeViewColumn(null, cellRenderer); column.Spacing = 0; column.Alignment = 1; column.Sizing = Gtk.TreeViewColumnSizing.Autosize; column.SetCellDataFunc(cellRenderer, new Gtk.TreeCellDataFunc(RenderChatViewActivity)); AppendColumn(column); ActivityColumn = column; } public virtual void Append(ChatView chatView) { if (chatView == null) { throw new ArgumentNullException("chatView"); } if (chatView is SessionChatView || chatView is ProtocolChatView) { // top level chats TreeStore.AppendValues(chatView); ReparentOrphans(); if (TreeStore.IterNChildren() == 1) { // first node, usualy Smuxi chat CurrentChatView = chatView; } } else { // childs with parents, hopefully var parentIter = FindProtocolChatIter(chatView); if (TreeStore.IterIsValid(parentIter)) { TreeStore.AppendValues(parentIter, chatView); var path = TreeStore.GetPath(parentIter); ExpandRow(path, true); } else { // parent chat doesn't exist yet, thus it has to become // a top level chat for now and re-parent later TreeStore.AppendValues(chatView); } } } public virtual void Remove(ChatView chatView) { if (chatView == null) { throw new ArgumentNullException("chatView"); } Gtk.TreeIter iter; TryFindChatIter(chatView, out iter); if (!TreeStore.IterIsValid(iter)) { return; } TreeStore.Remove(ref iter); } public virtual void Render(ChatView chatView) { Trace.Call(chatView); if (chatView == null) { throw new ArgumentNullException("chatView"); } Gtk.TreeIter iter; TryFindChatIter(chatView, out iter); //var path = TreeStore.GetPath(iter); //TreeStore.EmitRowChanged(path, iter); // HACK: this emits row_changed _and_ sort_iter_changed and there is // no other public API in GTK+ to trigger a resort of a modified // value in the tree view :/ TreeStore.SetValue(iter, 0, chatView); } public virtual bool IsVisible(ChatView chatView) { if (chatView == null) { throw new ArgumentNullException("chatView"); } Gtk.TreePath visibleStart, visibleEnd; if (!GetVisibleRange(out visibleStart, out visibleEnd)) { return false; } Gtk.TreeIter chatIter; TryFindChatIter(chatView, out chatIter); var chatPath = TreeStore.GetPath(chatIter); // we ignore 0 on purpose, say if a few pixels of a row are returned // as visible by GetVisibleRange() that is not good enough for us return visibleStart.Compare(chatPath) <= 0 && visibleEnd.Compare(chatPath) >= 0; } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } ThemeSettings = new ThemeSettings(config); if (ThemeSettings.BackgroundColor == null) { ModifyBase(Gtk.StateType.Normal); } else { ModifyBase(Gtk.StateType.Normal, ThemeSettings.BackgroundColor.Value); } if (ThemeSettings.ForegroundColor == null) { ModifyText(Gtk.StateType.Normal); } else { ModifyText(Gtk.StateType.Normal, ThemeSettings.ForegroundColor.Value); } ModifyFont(ThemeSettings.FontDescription); ActivityColumn.Visible = (bool?) config["Interface/ShowActivityCounter"] ?? true; } protected virtual void RenderChatViewIcon(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { if (cellr == null) { throw new ArgumentNullException("cellr"); } if (model == null) { throw new ArgumentNullException("model"); } var chat = (ChatView) model.GetValue(iter, 0); var renderer = (Gtk.CellRendererPixbuf) cellr; switch (chat.TabImage.StorageType) { case Gtk.ImageType.Pixbuf: renderer.Pixbuf = chat.TabImage.Pixbuf; break; case Gtk.ImageType.Stock: renderer.StockId = chat.TabImage.Stock; break; default: renderer.Pixbuf = null; break; } } protected virtual void RenderChatViewName(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { if (cellr == null) { throw new ArgumentNullException("cellr"); } if (model == null) { throw new ArgumentNullException("model"); } var chat = (ChatView) model.GetValue(iter, 0); var renderer = (Gtk.CellRendererText) cellr; Gdk.Color color; if (chat.HighlightCount > 1) { color = ThemeSettings.HighlightColor; } else if (chat.HighlightCount == 1) { color = ThemeSettings.HighlightColor; } else if (chat.HasActivity) { color = ThemeSettings.ActivityColor; } else if (chat.HasEvent) { color = ThemeSettings.EventColor; } else { // no activity color = ThemeSettings.NoActivityColor; } var textColor = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(color), ColorConverter.GetTextColor( Gtk.Rc.GetStyle(this).Base(Gtk.StateType.Normal) ), TextColorContrast.High ); renderer.Markup = String.Format( "{1}", GLib.Markup.EscapeText(textColor.ToString()), GLib.Markup.EscapeText(chat.Name) ); } protected virtual void RenderChatViewActivity(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { if (cellr == null) { throw new ArgumentNullException("cellr"); } if (model == null) { throw new ArgumentNullException("model"); } var chat = (ChatView) model.GetValue(iter, 0); var renderer = (Gtk.CellRendererText) cellr; Gdk.Color color; string text = null; if (chat.HighlightCount >= 1) { color = ThemeSettings.HighlightColor; text = chat.HighlightCount.ToString(); } else if (chat.ActivityCount >= 1) { color = ThemeSettings.ActivityColor; text = chat.ActivityCount.ToString(); } else { // no highlight counter renderer.Markup = String.Empty; return; } if (text == null) { return; } var textColor = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(color), ColorConverter.GetTextColor( Gtk.Rc.GetStyle(this).Base(Gtk.StateType.Normal) ), TextColorContrast.High ); renderer.Markup = String.Format( "({1})", GLib.Markup.EscapeText(textColor.ToString()), GLib.Markup.EscapeText(text) ); } protected virtual int SortTreeStore(Gtk.TreeModel model, Gtk.TreeIter iter1, Gtk.TreeIter iter2) { var chat1 = (ChatView) model.GetValue(iter1, 0); var chat2 = (ChatView) model.GetValue(iter2, 0); // Smuxi is always the first item if (chat1 is SessionChatView && chat2 is SessionChatView) { return 0; } else if (chat1 is SessionChatView) { return -1; } else if (chat2 is SessionChatView) { return 1; } else if (chat1 is GroupChatView && chat2 is GroupChatView) { // let Name decide } else if (chat1 is GroupChatView) { return -1; } else if (chat2 is GroupChatView) { return 1; } return chat1.Name.CompareTo(chat2.Name); } protected override bool OnKeyPressEvent(Gdk.EventKey @event) { if ((@event.State & Gdk.ModifierType.Mod1Mask) != 0 || (@event.State & Gdk.ModifierType.ControlMask) != 0 || (@event.State & Gdk.ModifierType.ShiftMask) != 0) { // alt, ctrl or shift pushed, returning return base.OnKeyPressEvent(@event); } if (CurrentChatView is SessionChatView) { // no menu for Smuxi chat return base.OnKeyPressEvent(@event); } if (@event.Key == Gdk.Key.Menu && Selection.CountSelectedRows() > 0) { CurrentChatView.TabMenu.Popup(null, null, null, 0, @event.Time); return true; } return base.OnKeyPressEvent(@event); } protected override bool OnButtonReleaseEvent(Gdk.EventButton @event) { Trace.Call(@event); if (CurrentChatView is SessionChatView) { // no menu for Smuxi chat return base.OnButtonReleaseEvent(@event); } if (@event.Button == 3 && Selection.CountSelectedRows() > 0) { CurrentChatView.TabMenu.Popup(null, null, null, 0, @event.Time); return true; } return base.OnButtonReleaseEvent(@event); } void ReparentOrphans() { Gtk.TreeIter iter; Gtk.TreeIter parentIter = Gtk.TreeIter.Zero; TreeStore.GetIterFirst(out iter); do { var orphan = (ChatView) TreeStore.GetValue(iter, 0); if (orphan is SessionChatView || orphan is ProtocolChatView) { continue; } if (TreeStore.IterParent(out parentIter, iter)) { // already has an parent continue; } // no parent, let's find one! parentIter = FindProtocolChatIter(orphan); if (!TreeStore.IterIsValid(parentIter)) { continue; } // found a parent \o/ TreeStore.Remove(ref iter); TreeStore.AppendValues(parentIter, orphan); var parentPath = TreeStore.GetPath(parentIter); ExpandRow(parentPath, true); // reset iter to first as we changed the store and thus can't // continue the iteration TreeStore.GetIterFirst(out iter); } while (TreeStore.IterNext(ref iter)); } Gtk.TreeIter FindProtocolChatIter(ChatView child) { Gtk.TreeIter iter; Gtk.TreeIter parentIter = Gtk.TreeIter.Zero; TreeStore.GetIterFirst(out iter); do { var candidate = (ChatView) TreeStore.GetValue(iter, 0); if (!(candidate is ProtocolChatView) || candidate.ProtocolManager == null) { continue; } if (child.ProtocolManager != candidate.ProtocolManager) { continue; } parentIter = iter; break; } while (TreeStore.IterNext(ref iter)); return parentIter; } bool TryFindChatIter(ChatView view, out Gtk.TreeIter chatIter) { var found = false; var foundIter = Gtk.TreeIter.Zero; TreeStore.Foreach((model, path, iter) => { var candidate = (ChatView) model.GetValue(iter, 0); if (candidate == view) { foundIter = iter; found = true; return true; } return false; }); chatIter = foundIter; return found; } int GetRowNumber(Gtk.TreePath path) { Gtk.TreeIter iter; if (!TreeStore.GetIter(out iter, path)) { // invalid path return -1; } Gtk.TreeIter walkerIter; TreeStore.GetIterFirst(out walkerIter); var walker = TreeStore.GetPath(walkerIter); for (var i = 0; TreeStore.GetIter(out walkerIter, walker); i++) { if (walker.Compare(path) == 0) { return i; } if (TreeStore.IterHasChild(walkerIter)) { walker.Down(); } else { walker.Next(); if (!TreeStore.GetIter(out walkerIter, walker)) { // invalid path: reached last row walker.Up(); walker.Next(); } } } return -1; } Gtk.TreePath GetPath(int rowNumber) { Gtk.TreeIter iter; if (!TreeStore.GetIterFirst(out iter)) { return null; } var path = TreeStore.GetPath(iter); // TODO: clamp upper limit int i; for (i = 0; rowNumber >= 0 && i < rowNumber; i++) { TreeStore.GetIter(out iter, path); if (TreeStore.IterHasChild(iter)) { path.Down(); } else { path.Next(); TreeStore.GetIter(out iter, path); if (!TreeStore.IterIsValid(iter)) { // reached last row path.Up(); path.Next(); } } } return path; } } } smuxi-1.1/src/Frontend-GNOME/Views/Tags/0000775000175000017500000000000014011526501020517 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Views/Tags/PersonTag.cs0000644000175000017500000000274412726351313022765 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public class PersonTag : Gtk.TextTag { public string ID { get; private set; } public string IdentityName { get; private set; } public PersonTag(string id, string identityName) : base(null) { if (id == null) { throw new ArgumentNullException("id"); } if (identityName == null) { throw new ArgumentNullException("identityName"); } ID = id; IdentityName = identityName; } protected PersonTag(IntPtr handle) : base(handle) { } } } smuxi-1.1/src/Frontend-GNOME/Views/Tags/EmojiTag.cs0000644000175000017500000000272412726351313022560 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2015 Carlos Martín Nieto // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public class EmojiTag : Gtk.TextTag { public string Path { get; private set; } public Gtk.TextMark Mark { get; private set; } public EmojiTag(Gtk.TextMark mark, string path) : base(null) { if (mark == null) { throw new ArgumentNullException("mark"); } if (path == null) { throw new ArgumentNullException("path"); } Mark = mark; Path = path; } protected EmojiTag(IntPtr handle) : base(handle) { } } } smuxi-1.1/src/Frontend-GNOME/Views/Tags/LinkTag.cs0000644000175000017500000000240512726351313022406 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public class LinkTag : Gtk.TextTag { public Uri Link { get; set; } public LinkTag(Uri link) : base(null) { if (link == null) { throw new ArgumentNullException("link"); } Link = link; } protected LinkTag(IntPtr handle) : base(handle) { } } } smuxi-1.1/src/Frontend-GNOME/Views/MenuWidget.cs0000664000175000017500000005005114011467170022227 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012-2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Threading; using SysDiag = System.Diagnostics; using IgeMacIntegration; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { [System.ComponentModel.ToolboxItem(true)] public partial class MenuWidget : Gtk.Bin { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif new Gtk.Window Parent { get; set; } MainWindow MainWindow { get; set; } public JoinWidget JoinWidget { get; private set; } ChatViewManager ChatViewManager { get; set; } public bool CaretMode { get { return f_CaretModeAction.Active; } } public Gtk.MenuBar MenuBar { get { return f_MenuBar; } } public Gtk.ToggleAction ShowMenubarAction { get { return f_ShowMenubarAction; } } public Gtk.Action OpenLogAction { get { return f_OpenLogAction; } } public Gtk.Action OpenLogToolAction { get { return f_OpenLogToolAction; } } public Gtk.Action CloseChatAction { get { return f_CloseChatAction; } } public Gtk.Action FindGroupChatAction { get { return f_FindGroupChatAction; } } public MenuWidget(Gtk.Window parent, ChatViewManager chatViewManager) { if (parent == null) { throw new ArgumentNullException("parent"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } Parent = parent; MainWindow = parent as MainWindow; ChatViewManager = chatViewManager; Build(); // Smuxi Menu f_QuitAction.IconName = Gtk.Stock.Quit; // Chat f_JoinChatAction.IconName = Gtk.Stock.Open; f_FindGroupChatAction.IconName = Gtk.Stock.Find; f_OpenLogAction.IconName = Gtk.Stock.Open; f_CloseChatAction.IconName = Gtk.Stock.Close; // Engine f_AddRemoteEngineAction.IconName = Gtk.Stock.Add; f_SwitchRemoteEngineAction.IconName = Gtk.Stock.Refresh; // Toolbar f_ConnectToolAction.IconName = Gtk.Stock.Network; f_OpenLogToolAction.IconName = Gtk.Stock.Open; f_FindGroupChatToolAction.IconName = Gtk.Stock.Find; // disable the open log buttons initially as they will only be // enabled for chats that have a log file in // MainWindow.OnNotebookSwitchPage() f_OpenLogAction.Sensitive = false; f_OpenLogToolAction.Sensitive = false; f_MenuToolbar.ShowAll(); f_MenuToolbar.NoShowAll = true; f_MenuToolbar.Visible = (bool) Frontend.FrontendConfig["ShowToolBar"]; f_MenuBar.ShowAll(); f_MenuBar.NoShowAll = true; f_MenuBar.Visible = (bool) Frontend.FrontendConfig["ShowMenuBar"]; JoinWidget = new JoinWidget(); JoinWidget.NoShowAll = true; JoinWidget.Activated += OnJoinWidgetActivated; var joinToolItem = new Gtk.ToolItem(); joinToolItem.Add(JoinWidget); f_JoinToolbar.Add(joinToolItem); f_JoinToolbar.ShowAll(); f_JoinToolbar.NoShowAll = true; f_JoinToolbar.Visible = f_MenuToolbar.Visible; f_ShowMenubarAction.Active = (bool) Frontend.FrontendConfig["ShowMenuBar"]; f_ShowToolbarAction.Active = (bool) Frontend.FrontendConfig["ShowToolBar"]; f_ShowStatusbarAction.Active = (bool) Frontend.FrontendConfig["ShowStatusBar"]; if (Frontend.IsMacOSX) { try { IgeMacMenu.GlobalKeyHandlerEnabled = true; IgeMacMenu.MenuBar = f_MenuBar; f_ShowMenubarAction.Active = false; // no need for the menu bar as have the app menu f_ShowMenubarAction.Visible = false; var appGroup = IgeMacMenu.AddAppMenuGroup(); appGroup.AddMenuItem( (Gtk.MenuItem) f_AboutAction.CreateMenuItem(), _("About Smuxi") ); var prefItem = (Gtk.MenuItem) f_PreferencesAction.CreateMenuItem(); // TODO: add cmd+, accelerator appGroup.AddMenuItem(prefItem, _("Preferences")); IgeMacMenu.QuitMenuItem = (Gtk.MenuItem) f_QuitAction.CreateMenuItem(); // Smuxi menu is already shown as app menu f_SmuxiAction.Visible = false; // About item is already shown in app menu f_AboutAction.Visible = false; } catch (EntryPointNotFoundException ex) { f_Logger.Error("Failed to initialize mac menu integration, disabling mac menu integration", ex); } } } protected void OnAboutActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var dialog = new AboutDialog(Parent); dialog.Run(); dialog.Destroy(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnPreferencesActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var builder = new Gtk.Builder(null, "PreferencesDialog2.ui", null); var widget = (Gtk.Widget) builder.GetObject("PreferencesDialog"); var dialog = new PreferencesDialog(Parent, builder, widget.Handle); dialog.Show(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnQuitActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { Frontend.Quit(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnConnectActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var dialog = new QuickConnectDialog(Parent); dialog.Load(); int res = dialog.Run(); var server = dialog.Server; dialog.Destroy(); if (res != (int) Gtk.ResponseType.Ok) { return; } if (server == null) { #if LOG4NET f_Logger.Error("OnServerConnectButtonClicked(): server is null!"); return; #endif } // do connect as background task as it might take a while ThreadPool.QueueUserWorkItem(delegate { try { if (Frontend.EngineProtocolVersion < new Version(0, 8, 11)) { // HACK: Smuxi < 0.8.11 used auto serialization for // ServerModel and thus breaks on unknown fields, // which we skip by setting this to null, see: // ServerModel.GetObjectData() server.ServerID = null; server.Nickname = null; server.Realname = null; server.ClientCertificateFilename = null; } Frontend.Session.Connect(server, Frontend.FrontendManager); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } }); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnAddServerActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); ServerDialog dialog = null; try { var controller = new ServerListController(Frontend.UserConfig); dialog = new ServerDialog(Parent, null, Frontend.Session.GetSupportedProtocols(), controller.GetNetworks()); int res = dialog.Run(); ServerModel server = dialog.GetServer(); if (res != (int) Gtk.ResponseType.Ok) { return; } controller.AddServer(server); controller.Save(); // reload server list in join bar JoinWidget.InitNetworks(controller.GetNetworks()); } catch (InvalidOperationException ex) { Frontend.ShowError(Parent, _("Unable to add server: "), ex); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } finally { if (dialog != null) { dialog.Destroy(); } } } protected void OnManageServerActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var builder = new Gtk.Builder(null, "PreferencesDialog2.ui", null); var widget = (Gtk.Widget) builder.GetObject("PreferencesDialog"); var dialog = new PreferencesDialog(Parent, builder, widget.Handle); dialog.CurrentCategory = PreferencesDialog.Category.Servers; dialog.Show(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnJoinChatActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { if (!f_ShowToolbarAction.Active) { f_ShowToolbarAction.Activate(); } JoinWidget.HasFocus = true; } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnFindGroupChatActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { Frontend.OpenFindGroupChatWindow(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnClearAllActivityActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { ChatViewManager.ClearAllActivity(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnNextChatActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { ChatViewManager.CurrentChatNumber++; } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnPreviousChatActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { ChatViewManager.CurrentChatNumber--; } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnOpenLogActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var logFile = ChatViewManager.CurrentChatView.ChatModel.LogFile; ThreadPool.QueueUserWorkItem(delegate { try { SysDiag.Process.Start(logFile); } catch (Exception ex) { Frontend.ShowError(Parent, ex); } }); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnCloseChatActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { if (ChatViewManager.CurrentChatView != null) { ChatViewManager.CurrentChatView.Close(); } if (Frontend.IsMacOSX && ChatViewManager.Chats.Count == 1) { ChatViewManager.Minimize(); } } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnUseLocalEngineActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var dialog = new Gtk.MessageDialog( Parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, _("Switching to local engine will disconnect you from the current engine!\n"+ "Are you sure you want to do this?") ); int result = dialog.Run(); dialog.Destroy(); if ((Gtk.ResponseType)result == Gtk.ResponseType.Yes) { Frontend.DisconnectEngineFromGUI(); Frontend.InitLocalEngine(); Frontend.ConnectEngineToGUI(); } } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnAddRemoteEngineActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var assistant = new EngineAssistant( Parent, Frontend.FrontendConfig ); assistant.Cancel += delegate { assistant.Destroy(); }; assistant.Close += delegate { assistant.Destroy(); }; assistant.ShowAll(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnSwitchRemoteEngineActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var dialog = new Gtk.MessageDialog( Parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, _("Switching the remote engine will disconnect you from the current engine!\n"+ "Are you sure you want to do this?") ); int result = dialog.Run(); dialog.Destroy(); if ((Gtk.ResponseType)result == Gtk.ResponseType.Yes) { Frontend.DisconnectEngineFromGUI(); Frontend.ShowEngineManagerDialog(); } } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnCaretModeActionToggled(object sender, EventArgs e) { Trace.Call(sender, e); try { var caretMode = f_CaretModeAction.Active; foreach (var chatView in ChatViewManager.Chats) { chatView.OutputMessageTextView.CursorVisible = caretMode; } if (caretMode) { ChatViewManager.CurrentChatView.OutputMessageTextView.HasFocus = true; } else { MainWindow.Entry.HasFocus = true; } } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnBrowseModeActionToggled(object sender, EventArgs e) { Trace.Call(sender, e); try { var browseMode = f_BrowseModeAction.Active; MainWindow.Notebook.IsBrowseModeEnabled = browseMode; if (browseMode) { MainWindow.ChatTreeView.HasFocus = true; } else { MainWindow.Entry.HasFocus = true; } } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnShowMenubarActionToggled(object sender, EventArgs e) { Trace.Call(sender, e); try { var active = f_ShowMenubarAction.Active; f_MenuBar.Visible = active; Frontend.FrontendConfig["ShowMenuBar"] = active; Frontend.FrontendConfig.Save(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnShowToolbarActionToggled(object sender, EventArgs e) { Trace.Call(sender, e); try { var active = f_ShowToolbarAction.Active; f_MenuToolbar.Visible = active; // also hide/show join bar f_JoinToolbar.Visible = active; Frontend.FrontendConfig["ShowToolBar"] = active; Frontend.FrontendConfig.Save(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnShowStatusbarActionToggled(object sender, EventArgs e) { Trace.Call(sender, e); try { var active = f_ShowStatusbarAction.Active; MainWindow.ShowStatusbar = active; Frontend.FrontendConfig["ShowStatusBar"] = active; Frontend.FrontendConfig.Save(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected virtual void OnJoinWidgetActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var chatLink = JoinWidget.GetChatLink(); Frontend.OpenChatLink(chatLink); JoinWidget.Clear(); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnFullscreenActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { MainWindow.IsFullscreen = !MainWindow.IsFullscreen; } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } protected void OnWebsiteActionActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { Frontend.OpenLink(new Uri("https://smuxi.im/")); } catch (Exception ex) { Frontend.ShowException(Parent, ex); } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/JoinWidget.cs0000644000175000017500000001625212726351313022227 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012-2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; using System.Runtime.InteropServices; namespace Smuxi.Frontend.Gnome { [System.ComponentModel.ToolboxItem(true)] public partial class JoinWidget : Gtk.Bin { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private const string ActiveNetworkConfigKey = "GNOME/JoinBar/ActiveNetwork"; public EventHandler Activated; public new bool HasFocus { get { return f_ChatEntry.HasFocus; } set { f_ChatEntry.HasFocus = value; } } public string ActiveNetwork { get { return f_NetworkComboBox.ActiveText; } set { var store = (Gtk.ListStore) f_NetworkComboBox.Model; var idx = 0; foreach (object[] row in store) { if ((string) row[0] == value) { f_NetworkComboBox.Active = idx; break; } idx++; } } } [DllImport("libgtk-win32-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)] static extern void gtk_entry_set_icon_from_pixbuf(IntPtr entry, int pos, IntPtr pixbuf); // Since: 2.16 // void gtk_entry_set_icon_tooltip_text(GtkEntry *entry, GtkEntryIconPosition icon_pos, const gchar *tooltip) [DllImport("libgtk-win32-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)] static extern void gtk_entry_set_icon_tooltip_text(IntPtr entry, int pos, IntPtr tooltip); // Since: 3.2 // void gtk_entry_set_placeholder_text (GtkEntry *entry, const gchar *text) [DllImport("libgtk-win32-2.0-0.dll", CallingConvention = CallingConvention.Cdecl)] static extern void gtk_entry_set_placeholder_text(IntPtr entry, string text); public JoinWidget() { Build(); try { gtk_entry_set_icon_from_pixbuf(f_ChatEntry.Handle, 0, GroupChatView.IconPixbuf.Handle); } catch (Exception ex) { #if LOG4NET f_Logger.Error("JoinWidget(): gtk_entry_set_icon_from_pixbuf() failed!", ex); #endif } try { var text = _("Enter which chat to join"); IntPtr textPtr = GLib.Marshaller.StringToPtrGStrdup(text); gtk_entry_set_icon_tooltip_text(f_ChatEntry.Handle, 0, textPtr); GLib.Marshaller.Free(textPtr); } catch (Exception ex) { #if LOG4NET f_Logger.Error("JoinWidget(): gtk_entry_set_icon_tooltip_text() failed!", ex); #endif } try { //gtk_entry_set_placeholder_text(f_ChatEntry.Handle, "Enter chat name..."); } catch (Exception ex) { #if LOG4NET f_Logger.Error("JoinWidget(): gtk_entry_set_placeholder_text() failed!", ex); #endif } f_ChatEntry.Activated += delegate { OnActivated(EventArgs.Empty); }; f_ChatEntry.KeyPressEvent += OnChatEntryKeyPressEvent; f_JoinButton.Clicked += delegate { OnActivated(EventArgs.Empty); }; } public void InitNetworks(IList networks) { Trace.Call(networks); if (networks == null) { throw new ArgumentNullException("networks"); } f_NetworkComboBox.Clear(); var cell = new Gtk.CellRendererText(); f_NetworkComboBox.PackStart(cell, false); f_NetworkComboBox.AddAttribute(cell, "text", 0); Gtk.ListStore store = new Gtk.ListStore(typeof(string)); foreach (string network in networks) { if (String.IsNullOrEmpty(network)) { continue; } store.AppendValues(network); } store.SetSortColumnId(0, Gtk.SortType.Ascending); f_NetworkComboBox.Model = store; var activeNetwork = (string) Frontend.FrontendConfig[ActiveNetworkConfigKey]; if (String.IsNullOrEmpty(activeNetwork)) { f_NetworkComboBox.Active = 0; } else { ActiveNetwork = activeNetwork; } f_NetworkComboBox.Changed += (sender, e) => { Frontend.FrontendConfig[ActiveNetworkConfigKey] = ActiveNetwork; Frontend.FrontendConfig.Save(); }; } public void ApplyConfig(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } var servers = new ServerListController(config); InitNetworks(servers.GetNetworks()); } public Uri GetChatLink() { return new Uri( String.Format("smuxi://{0}/{1}", f_NetworkComboBox.ActiveText, f_ChatEntry.Text) ); } public void Clear() { f_ChatEntry.Text = String.Empty; } protected virtual void OnActivated(EventArgs e) { if (Activated != null) { Activated(this, e); } } [GLib.ConnectBefore] protected void OnChatEntryKeyPressEvent(object o, Gtk.KeyPressEventArgs e) { var key = e.Event.Key; if ((e.Event.State & Gdk.ModifierType.ControlMask) != 0) { switch (key) { case Gdk.Key.x: case Gdk.Key.X: // ctrl + x is pressed e.RetVal = true; if (f_NetworkComboBox.Active == f_NetworkComboBox.Model.IterNChildren() - 1) { f_NetworkComboBox.Active = 0; } else { f_NetworkComboBox.Active++; } break; } } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/PreferencesDialog.cs0000664000175000017500000006156314011467170023552 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013, 2016-2017 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Threading; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; using Process = System.Diagnostics.Process; using UI = Gtk.Builder.ObjectAttribute; namespace Smuxi.Frontend.Gnome { public class PreferencesDialog : Gtk.Dialog { [UI("CategoryNotebook")] Gtk.Notebook f_CategoryNotebook; [UI("ConnectionToggleButton")] Gtk.ToggleButton f_ConnectionToggleButton; [UI("InterfaceToggleButton")] Gtk.ToggleButton f_InterfaceToggleButton; [UI("ServersToggleButton")] Gtk.ToggleButton f_ServersToggleButton; [UI("FiltersToggleButton")] Gtk.ToggleButton f_FiltersToggleButton; [UI("LoggingToggleButton")] Gtk.ToggleButton f_LoggingToggleButton; [UI("FilterListBox")] Gtk.Box f_FilterListBox; [UI("ServerListBox")] Gtk.Box f_ServerListBox; [UI("SystemWideFontRadioButton")] Gtk.RadioButton f_SystemWideFontRadioButton; [UI("CustomFontRadioButton")] Gtk.RadioButton f_CustomFontRadioButton; [UI("FontButton")] Gtk.FontButton f_FontButton; [UI("SystemWideFontColorRadioButton")] Gtk.RadioButton f_SystemWideFontColorRadioButton; [UI("CustomFontColorRadioButton")] Gtk.RadioButton f_CustomFontColorRadioButton; [UI("ForegroundColorButton")] Gtk.ColorButton f_ForegroundColorButton; [UI("BackgroundColorButton")] Gtk.ColorButton f_BackgroundColorButton; [UI("ProxySwitch")] Gtk.CheckButton f_ProxySwitch; [UI("ProxyTypeComboBox")] Gtk.ComboBox f_ProxyTypeComboBox; [UI("ProxyHostEntry")] Gtk.Entry f_ProxyHostEntry; [UI("ProxyPortSpinButton")] Gtk.SpinButton f_ProxyPortSpinButton; [UI("ProxyUsernameEntry")] Gtk.Entry f_ProxyUsernameEntry; [UI("ProxyPasswordEntry")] Gtk.Entry f_ProxyPasswordEntry; [UI("ProxyShowPasswordCheckButton")] Gtk.CheckButton f_ProxyShowPasswordCheckButton; [UI("LoggingSwitch")] Gtk.CheckButton f_LoggingSwitch; [UI("LoggingOpenButton")] Gtk.Button f_LoggingOpenButton; [UI("LoggingLogFilteredMessagesCheckButton")] Gtk.CheckButton f_LoggingLogFilteredMessagesCheckButton; [UI("ShowColorsCheckButton")] Gtk.CheckButton f_ShowColorsCheckButton; [UI("ShowFormattingsCheckButton")] Gtk.CheckButton f_ShowFormattingsCheckButton; [UI("InternalSettingsToolbar")] Gtk.Toolbar f_InternalSettingsToolbar; Dictionary ConfigKeyToWidgetNameMap { get; set; } new Gtk.Window Parent { get; set; } Gtk.Builder Builder { get; set; } FilterListWidget FilterListWidget { get; set; } ServerListView ServerListView { get; set; } public Category CurrentCategory { set { f_CategoryNotebook.Page = (int) value; switch (value) { case Category.Connection: if (!f_ConnectionToggleButton.Active) { f_ConnectionToggleButton.Active = true; } f_InterfaceToggleButton.Active = false; f_ServersToggleButton.Active = false; f_FiltersToggleButton.Active = false; f_LoggingToggleButton.Active = false; break; case Category.Interface: if (!f_InterfaceToggleButton.Active) { f_InterfaceToggleButton.Active = true; } f_ConnectionToggleButton.Active = false; f_ServersToggleButton.Active = false; f_FiltersToggleButton.Active = false; f_LoggingToggleButton.Active = false; break; case Category.Servers: if (!f_ServersToggleButton.Active) { f_ServersToggleButton.Active = true; } f_ConnectionToggleButton.Active = false; f_InterfaceToggleButton.Active = false; f_FiltersToggleButton.Active = false; f_LoggingToggleButton.Active = false; break; case Category.Filters: if (!f_FiltersToggleButton.Active) { f_FiltersToggleButton.Active = true; } f_ConnectionToggleButton.Active = false; f_InterfaceToggleButton.Active = false; f_ServersToggleButton.Active = false; f_LoggingToggleButton.Active = false; break; case Category.Logging: if (!f_LoggingToggleButton.Active) { f_LoggingToggleButton.Active = true; } f_ConnectionToggleButton.Active = false; f_InterfaceToggleButton.Active = false; f_ServersToggleButton.Active = false; f_FiltersToggleButton.Active = false; break; } } } public PreferencesDialog(Gtk.Window parent, Gtk.Builder builder, IntPtr handle) : base(handle) { Trace.Call(parent, builder, handle); if (parent == null) { throw new ArgumentNullException("parent"); } if (builder == null) { throw new ArgumentNullException("builder"); } if (handle == IntPtr.Zero) { throw new ArgumentException("handle", "handle must not be zero."); } Parent = parent; TransientFor = parent; Builder = builder; Builder.Autoconnect(this); f_CategoryNotebook.ShowTabs = false; f_ConnectionToggleButton.Active = true; // not implemented f_InternalSettingsToolbar.NoShowAll = true; f_InternalSettingsToolbar.Visible = false; // Filters FilterListWidget = new FilterListWidget(parent, Frontend.UserConfig); // REMOTING CALL FilterListWidget.InitProtocols(Frontend.Session.GetSupportedProtocols()); FilterListWidget.Load(); f_FilterListBox.Add(FilterListWidget); // Servers ServerListView = new ServerListView(parent); ServerListView.Load(); f_ServerListBox.Add(ServerListView); Init(); ReadFromConfig(); ShowAll(); } void Init() { ConfigKeyToWidgetNameMap = new Dictionary(); var map = ConfigKeyToWidgetNameMap; // Connection map.Add("Connection/Nicknames", "ConnectionNicknamesEntry"); map.Add("Connection/Realname", "ConnectionRealnameEntry"); map.Add("Connection/ProxyHostname", "ProxyHostEntry"); map.Add("Connection/ProxyPort", "ProxyPortSpinButton"); map.Add("Connection/ProxyUsername", "ProxyUsernameEntry"); map.Add("Connection/ProxyPassword", "ProxyPasswordEntry"); // Interface/Messages map.Add("Interface/Notebook/TimestampFormat", "TimestampFormatEntry"); map.Add("Interface/Notebook/BufferLines", "BufferLinesSpinButton"); // "Interface/Notebook/StripColors" // "Interface/Notebook/StripFormattings" // Interface/Tabs // "Interface/Notebook/TabPosition" map.Add("Interface/Notebook/AutoSwitchPersonChats", "AutoSwitchPersonChatsCheckButton"); map.Add("Interface/Notebook/AutoSwitchGroupChats", "AutoSwitchGroupChatsCheckButton"); // Interface/Notifications map.Add("Interface/Notebook/Tab/NoActivityColor", "NoActivityColorButton"); map.Add("Interface/Notebook/Tab/ActivityColor", "ActivityColorButton"); map.Add("Interface/Notebook/Tab/EventColor", "ModeColorButton"); map.Add("Interface/Notebook/Tab/HighlightColor", "HighlightColorButton"); // Interface/Input map.Add("Interface/Entry/CompletionCharacter", "CompletionCharacterEntry"); map.Add("Interface/Entry/CommandCharacter", "CommandCharacterEntry"); map.Add("Interface/Entry/CommandHistorySize", "CommandHistorySizeSpinButton"); map.Add("Interface/Entry/BashStyleCompletion", "BashStyleCompletionSwitch"); // Interface/Appearance map.Add("Interface/Notebook/Channel/NickColors", "ColoredNicknamesSwitch"); // "Interface/Chat/FontFamily" // "Interface/Chat/FontStyle" // "Interface/Chat/FontSize" // "Interface/Chat/BackgroundColor" // "Interface/Chat/ForegroundColor" map.Add("Interface/Chat/ForegroundColor", "ForegroundColorButton"); map.Add("Interface/Chat/BackgroundColor", "BackgroundColorButton"); map.Add("Interface/Chat/HighlightWords", "HighlightWordsTextView"); map.Add("Sound/BeepOnHighlight", "BeepOnHighlightCheckButton"); // Logging map.Add("Logging/Enabled", "LoggingSwitch"); map.Add("Logging/LogFilteredMessages", "LoggingLogFilteredMessagesCheckButton"); // init widgets f_ProxyTypeComboBox.Clear(); var cell = new Gtk.CellRendererText(); f_ProxyTypeComboBox.PackStart(cell, false); f_ProxyTypeComboBox.AddAttribute(cell, "text", 1); var store = new Gtk.ListStore(typeof(ProxyType), typeof(string)); // fill ListStore store.AppendValues(ProxyType.None, String.Format("<{0}>", _("No Proxy"))); store.AppendValues(ProxyType.System, String.Format("<{0}>", _("System Default"))); store.AppendValues(ProxyType.Http, "HTTP"); store.AppendValues(ProxyType.Socks4, "SOCK 4"); store.AppendValues(ProxyType.Socks4a, "SOCK 4a"); store.AppendValues(ProxyType.Socks5, "SOCK 5"); f_ProxyTypeComboBox.Model = store; f_ProxyTypeComboBox.Active = 0; // font radio buttons f_SystemWideFontRadioButton.Toggled += (sender, e) => { CheckFontRadioButtons(); }; f_CustomFontRadioButton.Toggled += (sender, e) => { CheckFontRadioButtons(); }; // font color radio buttons f_SystemWideFontColorRadioButton.Toggled += (sender, e) => { CheckFontColorRadioButtons(); }; f_CustomFontColorRadioButton.Toggled += (sender, e) => { CheckFontColorRadioButtons(); }; f_ProxySwitch.AddNotification("active", delegate { CheckProxySwitch(); }); f_LoggingSwitch.AddNotification("active", delegate { CheckLoggingSwitch(); }); } void ReadFromConfig() { Trace.Call(); var conf = Frontend.UserConfig; // manually handled widgets ProxyType proxyType = (ProxyType) Enum.Parse( typeof(ProxyType), (string) conf["Connection/ProxyType"] ); int i = 0; foreach (object[] row in (Gtk.ListStore) f_ProxyTypeComboBox.Model) { if (((ProxyType) row[0]) == proxyType) { f_ProxyTypeComboBox.Active = i; break; } i++; } f_ProxySwitch.Active = proxyType != ProxyType.None; CheckProxySwitch(); f_ShowColorsCheckButton.Active = !(bool) conf["Interface/Notebook/StripColors"]; f_ShowFormattingsCheckButton.Active = !(bool) conf["Interface/Notebook/StripFormattings"]; var fontButton = (Gtk.FontButton) Builder.GetObject("FontButton"); var fontFamily = (string) conf["Interface/Chat/FontFamily"]; var fontStyle = (string) conf["Interface/Chat/FontStyle"]; int fontSize = 0; if (conf["Interface/Chat/FontSize"] != null) { fontSize = (int) conf["Interface/Chat/FontSize"]; } if (String.IsNullOrEmpty(fontFamily) && String.IsNullOrEmpty(fontStyle) && fontSize == 0) { f_SystemWideFontRadioButton.Active = true; } else { f_CustomFontRadioButton.Active = true; Pango.FontDescription fontDescription = new Pango.FontDescription(); fontDescription.Family = fontFamily; string frontWeigth = null; if (fontStyle.Contains(" ")) { int pos = fontStyle.IndexOf(" "); frontWeigth = fontStyle.Substring(0, pos); fontStyle = fontStyle.Substring(pos + 1); } fontDescription.Style = (Pango.Style) Enum.Parse(typeof(Pango.Style), fontStyle); if (frontWeigth != null) { fontDescription.Weight = (Pango.Weight) Enum.Parse(typeof(Pango.Weight), frontWeigth); } fontDescription.Size = fontSize * 1024; fontButton.FontName = fontDescription.ToString(); } var bgColorHexCode = (string) conf["Interface/Chat/BackgroundColor"]; var fgColorHexCode = (string) conf["Interface/Chat/ForegroundColor"]; if (String.IsNullOrEmpty(bgColorHexCode) && String.IsNullOrEmpty(fgColorHexCode)) { f_SystemWideFontRadioButton.Active = true; } else { f_CustomFontColorRadioButton.Active = true; } // mapped widgets foreach (var confEntry in ConfigKeyToWidgetNameMap) { var confKey = confEntry.Key; var confValue = conf[confKey]; var widgetId = confEntry.Value; var widget = Builder.GetObject(widgetId); if (widget is Gtk.SpinButton) { var spinButton = (Gtk.SpinButton) widget; if (confValue is Int32) { spinButton.Value = (Int32) confValue; } else { spinButton.Value = Int32.Parse((string) confValue); } } else if (widget is Gtk.ColorButton) { var colorButton = (Gtk.ColorButton) widget; var colorHexCode = (string) confValue; if (String.IsNullOrEmpty(colorHexCode)) { colorButton.Color = Gdk.Color.Zero; } else { colorButton.Color = ColorConverter.GetGdkColor(colorHexCode); } } else if (widget is Gtk.CheckButton) { var checkButton = (Gtk.CheckButton) widget; checkButton.Active = (bool) confValue; #if GTK_SHARP_3 } else if (widget is Gtk.Switch) { var @switch = (Gtk.Switch) widget; @switch.Active = (bool) confValue; #endif } else if (widget is Gtk.TextView) { var textView = (Gtk.TextView) widget; if (confValue is string[]) { textView.Buffer.Text = String.Join("\n", (string[]) confValue); } else { textView.Buffer.Text = (string) confValue; } } else if (widget is Gtk.Entry) { var entry = (Gtk.Entry) widget; if (confValue is string[]) { entry.Text = String.Join(" ", (string[]) confValue); } else { entry.Text = (string) confValue; } } } } void WriteToConfig() { Trace.Call(); var userConf = Frontend.UserConfig; var conf = new Dictionary(); // manually handled widgets if (f_ProxySwitch.Active) { Gtk.TreeIter iter; f_ProxyTypeComboBox.GetActiveIter(out iter); var proxyType = (ProxyType) f_ProxyTypeComboBox.Model.GetValue(iter, 0); conf["Connection/ProxyType"] = proxyType.ToString(); } else { conf["Connection/ProxyType"] = ProxyType.None.ToString(); } conf["Interface/Notebook/StripColors"] = !f_ShowColorsCheckButton.Active; conf["Interface/Notebook/StripFormattings"] = !f_ShowFormattingsCheckButton.Active; if (f_CustomFontRadioButton.Active) { string fontName = f_FontButton.FontName; Pango.FontDescription fontDescription = Pango.FontDescription.FromString(fontName); conf["Interface/Chat/FontFamily"] = fontDescription.Family; conf["Interface/Chat/FontStyle"] = fontDescription.Weight + " " + fontDescription.Style; conf["Interface/Chat/FontSize"] = fontDescription.Size / 1024; } else { conf["Interface/Chat/FontFamily"] = String.Empty; conf["Interface/Chat/FontStyle"] = String.Empty; conf["Interface/Chat/FontSize"] = 0; } // mapped widgets foreach (var confEntry in ConfigKeyToWidgetNameMap) { var confKey = confEntry.Key; // get type from config value var confValue = userConf[confKey]; var widgetId = confEntry.Value; var widget = Builder.GetObject(widgetId); if (widget is Gtk.SpinButton) { var spinButton = (Gtk.SpinButton) widget; if (confValue is Int32) { conf[confKey] = spinButton.ValueAsInt; } } else if (widget is Gtk.ColorButton) { var colorButton = (Gtk.ColorButton) widget; if (confValue is string) { conf[confKey] = ColorConverter.GetHexCode(colorButton.Color); } } else if (widget is Gtk.CheckButton) { var checkButton = (Gtk.CheckButton) widget; if (confValue is bool) { conf[confKey] = checkButton.Active; } #if GTK_SHARP_3 } else if (widget is Gtk.Switch) { var @switch = (Gtk.Switch) widget; if (confValue is bool) { conf[confKey] = @switch.Active; } #endif } else if (widget is Gtk.TextView) { var textView = (Gtk.TextView) widget; if (confValue is string[]) { conf[confKey] = textView.Buffer.Text.Split('\n'); } else { conf[confKey] = textView.Buffer.Text; } } else if (widget is Gtk.Entry) { var entry = (Gtk.Entry) widget; if (confValue is string[]) { conf[confKey] = entry.Text.Split('\n'); } else { conf[confKey] = entry.Text; } } } // reset colors as there is no distinct key if they are custom or not if (f_SystemWideFontColorRadioButton.Active) { conf["Interface/Chat/ForegroundColor"] = String.Empty; conf["Interface/Chat/BackgroundColor"] = String.Empty; } if (Frontend.EngineProtocolVersion >= new Version(0, 14)) { // with >= 0.14 we can set many keys in a single call // REMOTING CALL userConf.SetAll(conf); } else { // < 0.14 we need to set key by key foreach (var entry in conf) { // REMOTING CALL userConf[entry.Key] = entry.Value; } } // REMOTING CALL userConf.Save(); } protected virtual void OnResponse(object sender, Gtk.ResponseArgs e) { Trace.Call(sender, e); WriteToConfig(); Frontend.ApplyConfig(Frontend.UserConfig); Destroy(); } protected virtual void OnConnectionToggleButtonToggled(object sender, EventArgs e) { Trace.Call(sender, e); if (f_ConnectionToggleButton.Active) { CurrentCategory = Category.Connection; } } protected virtual void OnInterfaceToggleButtonToggled(object sender, EventArgs e) { Trace.Call(sender, e); if (f_InterfaceToggleButton.Active) { CurrentCategory = Category.Interface; } } protected virtual void OnServersToggleButtonToggled(object sender, EventArgs e) { Trace.Call(sender, e); if (f_ServersToggleButton.Active) { CurrentCategory = Category.Servers; } } protected virtual void OnFiltersToggleButtonToggled(object sender, EventArgs e) { Trace.Call(sender, e); if (f_FiltersToggleButton.Active) { CurrentCategory = Category.Filters; } } protected virtual void OnLoggingToggleButtonToggled(object sender, EventArgs e) { Trace.Call(sender, e); if (f_LoggingToggleButton.Active) { CurrentCategory = Category.Logging; } } protected virtual void OnProxyShowPasswordCheckButtonToggled(object sender, EventArgs e) { Trace.Call(sender, e); f_ProxyPasswordEntry.Visibility = f_ProxyShowPasswordCheckButton.Active; } protected virtual void OnLoggingOpenButtonClicked(object sender, EventArgs e) { Trace.Call(sender, e); ThreadPool.QueueUserWorkItem(delegate { try { var logPath = Platform.LogPath; if (!Directory.Exists(logPath)) { Directory.CreateDirectory(logPath); } Process.Start(logPath); } catch (Exception ex) { Frontend.ShowError(Parent, ex); } }); } void CheckProxySwitch() { var isActive = f_ProxySwitch.Active; f_ProxyTypeComboBox.Sensitive = isActive; f_ProxyHostEntry.Sensitive = isActive; f_ProxyPortSpinButton.Sensitive = isActive; f_ProxyUsernameEntry.Sensitive = isActive; f_ProxyPasswordEntry.Sensitive = isActive; f_ProxyShowPasswordCheckButton.Sensitive = isActive; } void CheckLoggingSwitch() { var isActive = f_LoggingSwitch.Active; f_LoggingLogFilteredMessagesCheckButton.Sensitive = isActive; f_LoggingOpenButton.Sensitive = isActive; } void CheckFontRadioButtons() { f_FontButton.Sensitive = f_CustomFontRadioButton.Active; } void CheckFontColorRadioButtons() { var isCustomActive = f_CustomFontColorRadioButton.Active; f_ForegroundColorButton.Sensitive = isCustomActive; f_BackgroundColorButton.Sensitive = isCustomActive; } static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } public enum Category { Connection, Interface, Servers, Filters, Logging, } public enum InterfacePage { Messages, Tabs, Notifications, Input, Appearance, } } } smuxi-1.1/src/Frontend-GNOME/Views/MessageTextView.cs0000664000175000017500000011553514011467170023254 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2009-2015, 2017 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Text.RegularExpressions; using System.Threading; using System.Collections.Generic; using System.Globalization; using SysDiag = System.Diagnostics; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class MessageTextView : Gtk.TextView { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly Gdk.Cursor _NormalCursor = new Gdk.Cursor(Gdk.CursorType.Xterm); private static readonly Gdk.Cursor _LinkCursor = new Gdk.Cursor(Gdk.CursorType.Hand2); static readonly Regex NickRegex = new Regex("^(<([^ ]+)> )"); static bool IsGtk2_17 { get; set; } protected Gtk.TextTagTable _MessageTextTagTable; private MessageModel _LastMessage; private bool _ShowTimestamps; private bool _ShowHighlight; private bool _ShowMarkerline; private bool _AtLinkTag; private Uri _ActiveLink; private ThemeSettings _ThemeSettings; private Gdk.Color _MarkerlineColor = new Gdk.Color(255, 0, 0); private int _MarkerlineBufferPosition; private int _BufferLines = -1; IconCache EmojiCache { get; set; } Gtk.TextTag BoldTag { get; set; } Gtk.TextTag ItalicTag { get; set; } Gtk.TextTag UnderlineTag { get; set; } protected Gtk.TextTag LinkTag { get; set; } Gtk.TextTag EventTag { get; set; } Gtk.TextTag PersonTag { get; set; } bool AtPersonTag { get; set; } public event MessageTextViewMessageAddedEventHandler MessageAdded; public event MessageTextViewMessageHighlightedEventHandler MessageHighlighted; public event EventHandler PersonClicked; public int MarkerlineBufferPosition { get { return _MarkerlineBufferPosition; } set { _MarkerlineBufferPosition = value; } } public bool ShowTimestamps { get { return _ShowTimestamps; } set { _ShowTimestamps = value; } } public bool ShowHighlight { get { return _ShowHighlight; } set { _ShowHighlight = value; } } public bool ShowMarkerline { get { return _ShowMarkerline; } set { _ShowMarkerline = value; } } public bool HasTextViewSelection { get { #if GTK_SHARP_2_10 return Buffer.HasSelection; #else Gtk.TextIter start, end; Buffer.GetSelectionBounds(out start, out end); return start.Offset != end.Offset; #endif } } public Gtk.TextTagTable MessageTextTagTable { get { return _MessageTextTagTable; } } public bool IsEmpty { get { return Buffer.CharCount == 0; } } public bool IsAtUrlTag { get { return _AtLinkTag; } } public MessageModel LastMessage { get { return _LastMessage; } } Gdk.Color BackgroundColor { get { if (_ThemeSettings.BackgroundColor == null) { return DefaultAttributes.Appearance.BgColor; } return _ThemeSettings.BackgroundColor.Value; } } static MessageTextView() { IsGtk2_17 = String.IsNullOrEmpty(Gtk.Global.CheckVersion(2, 17, 0)) && !String.IsNullOrEmpty(Gtk.Global.CheckVersion(2, 18, 0)); } public MessageTextView() { Trace.Call(); _MessageTextTagTable = BuildTagTable(); _ThemeSettings = new ThemeSettings(); EmojiCache = new IconCache("emoji"); Buffer = new Gtk.TextBuffer(_MessageTextTagTable); MotionNotifyEvent += OnMotionNotifyEvent; PopulatePopup += OnPopulatePopup; ExposeEvent += OnExposeEvent; Realized += delegate { CheckStyle(); }; StyleSet += delegate(object o, Gtk.StyleSetArgs args) { if (!IsRealized) { // HACK: avoid GTK+ crash in gtk_text_attributes_copy_values() return; } CheckStyle(); }; } public void ApplyConfig(UserConfig config) { _ThemeSettings = new ThemeSettings(config); if (_ThemeSettings.BackgroundColor == null) { ModifyBase(Gtk.StateType.Normal); } else { ModifyBase(Gtk.StateType.Normal, _ThemeSettings.BackgroundColor.Value); } if (_ThemeSettings.ForegroundColor == null) { ModifyText(Gtk.StateType.Normal); } else { ModifyText(Gtk.StateType.Normal, _ThemeSettings.ForegroundColor.Value); } ModifyFont(_ThemeSettings.FontDescription); string wrapModeStr = (string) config["Interface/Chat/WrapMode"]; if (!String.IsNullOrEmpty(wrapModeStr)) { Gtk.WrapMode wrapMode = (Gtk.WrapMode) Enum.Parse( typeof(Gtk.WrapMode), wrapModeStr ); if (wrapMode == Gtk.WrapMode.Word) { wrapMode = Gtk.WrapMode.WordChar; } WrapMode = wrapMode; } _BufferLines = (int) config["Interface/Notebook/BufferLines"]; #if LOG4NET DateTime start = DateTime.UtcNow; #endif ResizeEmoji(); #if LOG4NET DateTime stop = DateTime.UtcNow; double duration = stop.Subtract(start).TotalMilliseconds; _Logger.Debug("ApplyConfig(): ResizeEmoji()" + " done, took: " + Math.Round(duration) + " ms"); #endif } void ResizeEmoji() { var buffer = Buffer; int width, height; int descent; using (var layout = CreatePangoLayout(null)) { layout.GetPixelSize(out width, out height); descent = layout.Context.GetMetrics(layout.FontDescription, null).Descent; } _MessageTextTagTable.Foreach((tag) => { if (!(tag is EmojiTag)) { return; } var emojiTag = tag as EmojiTag; tag.Rise = -descent; var pix = new Gdk.Pixbuf(emojiTag.Path, -1, height); var beforeIter = buffer.GetIterAtMark(emojiTag.Mark); var afterIter = beforeIter; afterIter.ForwardToTagToggle(tag); buffer.RemoveTag(tag, beforeIter, afterIter); buffer.Delete(ref beforeIter, ref afterIter); buffer.InsertPixbuf(ref beforeIter, pix); // after all that, we need to re-apply the tag to the buffer afterIter = beforeIter; beforeIter = Buffer.GetIterAtMark(emojiTag.Mark); buffer.ApplyTag(tag, beforeIter, afterIter); }); } void CheckStyle() { Trace.Call(); var bgTextColor = ColorConverter.GetTextColor(BackgroundColor); // get best contrast for the event font color Gdk.Color eventColor = Gdk.Color.Zero; Gdk.Color.Parse("darkgray", ref eventColor); var eventTextColor = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(eventColor), bgTextColor, TextColorContrast.High ); EventTag.ForegroundGdk = ColorConverter.GetGdkColor( eventTextColor ); // get best contrast for the link font color Gdk.Color linkColor = Gdk.Color.Zero; Gdk.Color.Parse("darkblue", ref linkColor); var linkTextColor = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(linkColor), bgTextColor ); LinkTag.ForegroundGdk = ColorConverter.GetGdkColor( linkTextColor ); } public void Clear() { Trace.Call(); Buffer.Clear(); } static void AddAlternativeText(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart) { if (!String.IsNullOrEmpty(imgPart.AlternativeText)) { buffer.Insert(ref iter, imgPart.AlternativeText); } } void AddEmoji(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart, string shortName) { var unicode = Emojione.ShortnameToUnicode(shortName); if (unicode == null) { AddAlternativeText(buffer, ref iter, imgPart); return; } // A mark here serves two pusposes. One is to allow us to apply the // tag across the pixbuf. It also lets us know later where to put // the pixbuf if we need to load it from the network var mark = new Gtk.TextMark(null, true); buffer.AddMark(mark, iter); var emojiName = unicode + ".png"; string emojiPath; if (EmojiCache.TryGetIcon("emojione", emojiName, out emojiPath)) { var emojiFile = new FileInfo(emojiPath); if (emojiFile.Exists && emojiFile.Length > 0) { AddEmoji(buffer, ref iter, imgPart, shortName, mark, emojiPath); } else { AddAlternativeText(buffer, ref iter, imgPart); } return; } var emojiUrl = Emojione.UnicodeToUrl(unicode); EmojiCache.BeginDownloadFile("emojione", emojiName, emojiUrl, (path) => { GLib.Idle.Add(delegate { var markIter = buffer.GetIterAtMark(mark); AddEmoji(buffer, ref markIter, imgPart, shortName, mark, path); return false; }); }, (ex) => { GLib.Idle.Add(delegate { var markIter = buffer.GetIterAtMark(mark); buffer.DeleteMark(mark); AddAlternativeText(buffer, ref markIter, imgPart); return false; }); } ); } void AddEmoji(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart, string shortName, Gtk.TextMark emojiMark , string imagePath) { int width, height; int descent; using (var layout = CreatePangoLayout(null)) { layout.GetPixelSize(out width, out height); descent = layout.Context.GetMetrics(layout.FontDescription, null).Descent; } Gdk.Pixbuf emojiPixBuf; try { emojiPixBuf = new Gdk.Pixbuf(imagePath, -1, height); } catch (Exception ex) { #if LOG4NET _Logger.ErrorFormat( "AddEmoji(): error loading " + "image file: '{0}' " + "emoji: '{1}' into Gdk.Pixbuf(), " + "Exception: {2}", imagePath, shortName, ex ); #endif // delete the broken image file, maybe after the // next download this will be a valid image File.Delete(imagePath); // show alternative text as fallback instead buffer.DeleteMark(emojiMark); AddAlternativeText(buffer, ref iter, imgPart); return; } buffer.InsertPixbuf(ref iter, emojiPixBuf); var beforeIter = buffer.GetIterAtMark(emojiMark); var emojiTag = new EmojiTag(emojiMark, imagePath) { Rise = - descent }; _MessageTextTagTable.Add(emojiTag); buffer.ApplyTag(emojiTag, beforeIter, iter); } public void AddMessage(MessageModel msg) { AddMessage(msg, true); } public void AddMessage(MessageModel msg, bool addLinebreak) { AddMessage(msg, addLinebreak, _ShowTimestamps); } protected virtual void InsertTimeStamp(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, string timestamp, MessageModel msg) { timestamp = String.Format("{0} ", timestamp); buffer.Insert(ref iter, timestamp); } public void AddMessage(MessageModel msg, bool addLinebreak, bool showTimestamps) { #if MSG_DEBUG Trace.Call(msg, addLinebreak); #endif if (msg == null) { throw new ArgumentNullException("msg"); } var buffer = Buffer; var iter = buffer.EndIter; var startMark = new Gtk.TextMark(null, true); buffer.AddMark(startMark, iter); var senderPrefixWidth = GetSenderPrefixWidth(msg); Gtk.TextTag indentTag = null; if (senderPrefixWidth != 0) { // TODO: re-use text tags that have the same indent width indentTag = new Gtk.TextTag(null) { Indent = -senderPrefixWidth }; _MessageTextTagTable.Add(indentTag); } if (showTimestamps) { var msgTimeStamp = msg.TimeStamp.ToLocalTime(); if (_LastMessage != null) { var lastMsgTimeStamp = _LastMessage.TimeStamp.ToLocalTime(); var span = msgTimeStamp.Date - lastMsgTimeStamp.Date; if (span.Days > 0) { var dayLine = new MessageBuilder(). AppendEventPrefix(); if (span.Days > 1) { dayLine.AppendText(_("Day changed from {0} to {1}"), lastMsgTimeStamp.ToShortDateString(), msgTimeStamp.ToShortDateString()); } else { dayLine.AppendText(_("Day changed to {0}"), msgTimeStamp.ToLongDateString()); } dayLine.AppendText("\n"); var dayLineMsg = dayLine.ToMessage().ToString(); Buffer.InsertWithTags(ref iter, dayLineMsg, EventTag); } } string timestamp = null; try { string format = (string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"]; if (!String.IsNullOrEmpty(format)) { timestamp = msgTimeStamp.ToString(format); } } catch (FormatException e) { timestamp = "Timestamp Format ERROR: " + e.Message; } if (timestamp != null) { InsertTimeStamp(buffer, ref iter, timestamp, msg); // apply timestamp width to indent tag if (indentTag != null) { indentTag.Indent -= GetPangoWidth(timestamp); } } } var msgStartMark = new Gtk.TextMark(null, true); buffer.AddMark(msgStartMark, iter); bool hasHighlight = false; foreach (MessagePartModel msgPart in msg.MessageParts) { // supposed to be used only in a ChatView if (msgPart.IsHighlight) { hasHighlight = true; } // TODO: implement all types if (msgPart is UrlMessagePartModel) { InsertToBuffer(buffer, ref iter, (UrlMessagePartModel) msgPart); } else if (msgPart is TextMessagePartModel) { InsertToBuffer(buffer, ref iter, (TextMessagePartModel) msgPart); } else if (msgPart is ImageMessagePartModel) { InsertToBuffer(buffer, ref iter, (ImageMessagePartModel) msgPart); } } var startIter = buffer.GetIterAtMark(startMark); if (msg.MessageType == MessageType.Event) { buffer.ApplyTag(EventTag, startIter, iter); } if (indentTag != null) { buffer.ApplyTag(indentTag, startIter, iter); } var nick = msg.GetNick(); if (nick != null) { // TODO: re-use the same person tag for the same nick var personTag = new PersonTag(nick, nick); personTag.TextEvent += OnPersonTagTextEvent; _MessageTextTagTable.Add(personTag); var msgStartIter = buffer.GetIterAtMark(msgStartMark); var nickEndIter = msgStartIter; nickEndIter.ForwardChars(nick.Length + 2); buffer.ApplyTag(PersonTag, msgStartIter, nickEndIter); buffer.ApplyTag(personTag, msgStartIter, nickEndIter); } buffer.DeleteMark(startMark); buffer.DeleteMark(msgStartMark); if (addLinebreak) { buffer.Insert(ref iter, "\n"); } CheckBufferSize(); if (IsGtk2_17) { // HACK: force a redraw of the widget, as for some reason // GTK+ 2.17.6 is not redrawing some lines we add here, especially // for local messages. See: // http://projects.qnetp.net/issues/show/185 QueueDraw(); } if (Frontend.IsWindows && _LastMessage == null) { // HACK: workaround rendering issue on Windows where the // first inserted text is not showing up until the next insert QueueDraw(); } if (MessageAdded != null) { MessageAdded(this, new MessageTextViewMessageAddedEventArgs(msg)); } if (hasHighlight) { if (MessageHighlighted != null) { MessageHighlighted(this, new MessageTextViewMessageHighlightedEventArgs(msg)); } } _LastMessage = msg; } private void InsertToBuffer(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, UrlMessagePartModel urlPart) { var linkText = urlPart.Text ?? urlPart.Url; Uri uri; try { uri = new Uri(urlPart.Url); } catch (UriFormatException ex) { #if LOG4NET _Logger.Error("AddMessage(): Invalid URL: " + urlPart.Url, ex); #endif buffer.Insert(ref iter, linkText); return; } var tags = new List(); // link URI tag var linkTag = new LinkTag(uri); linkTag.TextEvent += OnLinkTagTextEvent; _MessageTextTagTable.Add(linkTag); tags.Add(linkTag); // link style tag tags.Add(LinkTag); buffer.InsertWithTags(ref iter, linkText, tags.ToArray()); } private void InsertToBuffer(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, TextMessagePartModel fmsgti) { var tags = new List(); if (fmsgti.Text == null) { // Gtk.TextBuffer.Insert*() asserts on text == NULL return; } if (fmsgti.ForegroundColor != TextColor.None) { var bg = ColorConverter.GetTextColor(BackgroundColor); if (fmsgti.BackgroundColor != TextColor.None) { bg = fmsgti.BackgroundColor; } TextColor color = TextColorTools.GetBestTextColor( fmsgti.ForegroundColor, bg ); string tagname = GetTextTagName(color, null); var tag = _MessageTextTagTable.Lookup(tagname); tags.Add(tag); } if (fmsgti.BackgroundColor != TextColor.None) { // TODO: get this from ChatView string tagname = GetTextTagName(null, fmsgti.BackgroundColor); var tag = _MessageTextTagTable.Lookup(tagname); tags.Add(tag); } if (fmsgti.Underline) { #if LOG4NET && MSG_DEBUG _Logger.Debug("AddMessage(): fmsgti.Underline is true"); #endif tags.Add(UnderlineTag); } if (fmsgti.Bold) { #if LOG4NET && MSG_DEBUG _Logger.Debug("AddMessage(): fmsgti.Bold is true"); #endif tags.Add(BoldTag); } if (fmsgti.Italic) { #if LOG4NET && MSG_DEBUG _Logger.Debug("AddMessage(): fmsgti.Italic is true"); #endif tags.Add(ItalicTag); } if (tags.Count > 0) { buffer.InsertWithTags(ref iter, fmsgti.Text, tags.ToArray()); } else { buffer.Insert(ref iter, fmsgti.Text); } } private void InsertToBuffer(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgpart) { Uri uri = null; string scheme = null; try { uri = new Uri(imgpart.ImageFileName); scheme = uri.Scheme; } catch (UriFormatException) { AddAlternativeText(buffer, ref iter, imgpart); return; } switch (scheme) { case "smuxi-emoji": var shortName = uri.Host; AddEmoji(buffer, ref iter, imgpart, shortName); break; default: AddAlternativeText(buffer, ref iter, imgpart); break; } } public void UpdateMarkerline() { Trace.Call(); if (IsEmpty) { return; } _MarkerlineBufferPosition = Buffer.EndIter.Offset - 1; QueueDraw(); } public override void Dispose() { // HACK: this shouldn't be needed but GTK# keeps GC handles // these callbacks for some reason and thus leaks :( _MessageTextTagTable.Foreach(tag => { if (tag is LinkTag) { tag.TextEvent -= OnLinkTagTextEvent; } else if (tag is PersonTag) { tag.TextEvent -= OnPersonTagTextEvent; } }); _MessageTextTagTable.Dispose(); base.Dispose(); } /* * Helper methods */ private Gtk.TextTagTable BuildTagTable() { // TextTags Gtk.TextTagTable ttt = new Gtk.TextTagTable(); Gtk.TextTag tt; Pango.FontDescription fd; // WARNING: the insertion order of tags MATTERS! // The attributes of the text tags are applied in the order of // insertion to the text table, and not in which order the tags // applied in the buffer. This is sick IMHO. tt = new Gtk.TextTag("bold"); fd = new Pango.FontDescription(); fd.Weight = Pango.Weight.Bold; tt.FontDesc = fd; BoldTag = tt; ttt.Add(tt); tt = new Gtk.TextTag("italic"); fd = new Pango.FontDescription(); fd.Style = Pango.Style.Italic; tt.FontDesc = fd; ItalicTag = tt; ttt.Add(tt); tt = new Gtk.TextTag("underline"); tt.Underline = Pango.Underline.Single; UnderlineTag = tt; ttt.Add(tt); tt = new Gtk.TextTag("event"); tt.Foreground = "darkgray"; EventTag = tt; ttt.Add(tt); tt = new Gtk.TextTag("link"); tt.Underline = Pango.Underline.Single; tt.Foreground = "darkblue"; LinkTag = tt; ttt.Add(tt); tt = new Gtk.TextTag("person"); PersonTag = tt; ttt.Add(tt); return ttt; } protected virtual void OnMotionNotifyEvent(object sender, Gtk.MotionNotifyEventArgs e) { // GDK is ugly! Gdk.ModifierType modifierType; int windowX, windowY; int bufferX, bufferY; // get the window position of the mouse GdkWindow.GetPointer(out windowX, out windowY, out modifierType); // get buffer position with the window position WindowToBufferCoords(Gtk.TextWindowType.Widget, windowX, windowY, out bufferX, out bufferY); // get TextIter with buffer position Gtk.TextIter iter = GetIterAtLocation(bufferX, bufferY); bool atUrlTag = false; bool atPersonTag = false; foreach (Gtk.TextTag tag in iter.Tags) { if (tag.Name == "link") { atUrlTag = true; break; } if (tag.Name == "person") { atPersonTag = true; break; } } Gdk.Window window = GetWindow(Gtk.TextWindowType.Text); if (atUrlTag != _AtLinkTag) { _AtLinkTag = atUrlTag; if (atUrlTag) { #if LOG4NET _Logger.Debug("OnMotionNotifyEvent(): at url tag"); #endif window.Cursor = _LinkCursor; } else { #if LOG4NET _Logger.Debug("OnMotionNotifyEvent(): not at url tag"); #endif window.Cursor = _NormalCursor; _ActiveLink = null; } } if (atPersonTag != AtPersonTag) { AtPersonTag = atPersonTag; if (atPersonTag) { #if LOG4NET _Logger.Debug("OnMotionNotifyEvent(): at person tag"); #endif window.Cursor = _LinkCursor; } else { #if LOG4NET _Logger.Debug("OnMotionNotifyEvent(): not at person tag"); #endif window.Cursor = _NormalCursor; } } } protected virtual void OnLinkTagTextEvent(object sender, Gtk.TextEventArgs e) { // logging noise //Trace.Call(sender, e); // if something in the textview is selected, bail out if (HasTextViewSelection) { #if LOG4NET _Logger.Debug("OnLinkTagTextEvent(): active selection present, bailing out..."); #endif return; } var tag = (LinkTag) sender; _ActiveLink = tag.Link; if (e.Event.Type != Gdk.EventType.ButtonRelease) { return; } if (_ActiveLink == null) { #if LOG4NET _Logger.Warn("OnLinkTagTextEvent(): _ActiveLink is null, ignoring..."); #endif return; } Frontend.OpenLink(_ActiveLink); } protected virtual void OnPersonTagTextEvent(object sender, Gtk.TextEventArgs e) { // logging noise //Trace.Call(sender, e); // if something in the textview is selected, bail out if (HasTextViewSelection) { #if LOG4NET _Logger.Debug("OnPersonTagTextEvent(): active selection present, bailing out..."); #endif return; } var tag = (PersonTag) sender; if (tag == null) { return; } if (e.Event.Type != Gdk.EventType.ButtonPress) { return; } if (PersonClicked != null) { PersonClicked( this, new MessageTextViewPersonClickedEventArgs(tag.IdentityName) ); } } protected virtual void OnPopulatePopup(object sender, Gtk.PopulatePopupArgs e) { Trace.Call(sender, e); if (!_AtLinkTag) { return; } Gtk.Menu popup = e.Menu; // remove all items foreach (Gtk.Widget children in popup.Children) { popup.Remove(children); } Gtk.ImageMenuItem open_item = new Gtk.ImageMenuItem(Gtk.Stock.Open, null); open_item.Activated += delegate { if (_ActiveLink != null) { Frontend.OpenLink(_ActiveLink); } }; popup.Append(open_item); Gtk.ImageMenuItem copy_item = new Gtk.ImageMenuItem(Gtk.Stock.Copy, null); copy_item.Activated += delegate { if (_ActiveLink == null) { return; } Gdk.Atom clipboardAtom = Gdk.Atom.Intern("CLIPBOARD", false); Gtk.Clipboard clipboard = Gtk.Clipboard.Get(clipboardAtom); clipboard.Text = _ActiveLink.ToString(); }; popup.Append(copy_item); popup.ShowAll(); } private string GetTextTagName(TextColor fgColor, TextColor bgColor) { string hexcode; string tagname; if (fgColor != null) { hexcode = fgColor.HexCode; tagname = "fg_color:" + hexcode; } else if (bgColor != null) { hexcode = bgColor.HexCode; tagname = "bg_color:" + hexcode; } else { return null; } if (_MessageTextTagTable.Lookup(tagname) == null) { int red = Int16.Parse(hexcode.Substring(0, 2), NumberStyles.HexNumber); int green = Int16.Parse(hexcode.Substring(2, 2), NumberStyles.HexNumber); int blue = Int16.Parse(hexcode.Substring(4, 2), NumberStyles.HexNumber); Gdk.Color c = new Gdk.Color((byte)red, (byte)green, (byte)blue); Gtk.TextTag tt = new Gtk.TextTag(tagname); if (fgColor != null) { tt.ForegroundGdk = c; } else if (bgColor != null) { tt.BackgroundGdk = c; } _MessageTextTagTable.Add(tt); } return tagname; } void OnExposeEvent(object sender, Gtk.ExposeEventArgs e) { if (!_ShowMarkerline || _MarkerlineBufferPosition == 0) { return; } var window = e.Event.Window; var gc = new Gdk.GC(window); gc.RgbFgColor = _MarkerlineColor; var iter = Buffer.GetIterAtOffset(_MarkerlineBufferPosition); var location = GetIterLocation(iter); int last_y = location.Y + location.Height; // padding last_y += PixelsAboveLines + PixelsBelowLines / 2; int x, y; BufferToWindowCoords(Gtk.TextWindowType.Text, 0, last_y, out x, out y); if (y < e.Event.Area.Y) { return; } window.DrawLine(gc, 0, y, VisibleRect.Width, y); } void CheckBufferSize() { if (_BufferLines == -1) { // no limit defined return; } var buffer = Buffer; if (buffer.LineCount > _BufferLines) { Gtk.TextIter start_iter = buffer.StartIter; // TODO: maybe we should delete chunks instead of each line Gtk.TextIter end_iter = buffer.GetIterAtLine(buffer.LineCount - _BufferLines); int offset = end_iter.Offset; // release tags var toggled_tags = new List(16); var start_tags = start_iter.GetToggledTags(true); toggled_tags.AddRange(start_tags); var tag_iter = start_iter; while (tag_iter.ForwardToTagToggle(null)) { if (tag_iter.Compare(end_iter) >= 0) { // tag is after line end break; } var iter_tags = tag_iter.GetToggledTags(true); toggled_tags.AddRange(iter_tags); } foreach (var tag in toggled_tags) { // don't remove color tags as they are shared wither other lines var tagName = tag.Name; if (tagName != null && (tagName.StartsWith("fg_color:") || tagName.StartsWith("bg_color:"))) { continue; } if (tag.IndentSet || tag is LinkTag || tag is PersonTag || tag is EmojiTag) { buffer.RemoveTag(tag, start_iter, end_iter); _MessageTextTagTable.Remove(tag); tag.Dispose(); } } buffer.Delete(ref start_iter, ref end_iter); // update markerline offset if present if (_MarkerlineBufferPosition != 0) { _MarkerlineBufferPosition -= offset; // remove markerline if it went out of buffer if (_MarkerlineBufferPosition < 0) { _MarkerlineBufferPosition = 0; } } } } int GetSenderPrefixWidth(MessageModel msg) { // HACK: try to obtain the nickname from the message // TODO: extend MessageModel with Origin property var msgText = msg.ToString(); var nickMatch = NickRegex.Match(msgText); if (nickMatch.Success) { // HACK: the nick can be bold if (msg.MessageParts.Count >= 3) { // possibly colored nick, see MessageBuilder.CreateNick() var prefixPart = msg.MessageParts[0]; var nickPart = msg.MessageParts[1]; var suffixPart = msg.MessageParts[2]; if (prefixPart.ToString() == "<" && nickPart is TextMessagePartModel && suffixPart.ToString().StartsWith(">")) { // colored nick var nickTextPart = (TextMessagePartModel) nickPart; if (nickTextPart.Bold) { return GetPangoWidth( String.Format( "{0}{1}{2} ", GLib.Markup.EscapeText("<"), GLib.Markup.EscapeText( nickMatch.Groups[2].Value ), GLib.Markup.EscapeText(">") ), true ); } } } return GetPangoWidth(nickMatch.Groups[1].Value, false); } else { if (msgText.StartsWith("-!- ")) { return GetPangoWidth("-!- ", false); } } return 0; } int GetPangoWidth(string text) { return GetPangoWidth(text, false); } int GetPangoWidth(string text, bool isMarkup) { int width, heigth; using (var layout = CreatePangoLayout(null)) { if (isMarkup) { layout.SetMarkup(text); } else { layout.SetText(text); } layout.GetPixelSize(out width, out heigth); } return width; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } public delegate void MessageTextViewMessageAddedEventHandler(object sender, MessageTextViewMessageAddedEventArgs e); public class MessageTextViewMessageAddedEventArgs : EventArgs { private MessageModel f_Message; public MessageModel Message { get { return f_Message; } } public MessageTextViewMessageAddedEventArgs(MessageModel message) { f_Message = message; } } public delegate void MessageTextViewMessageHighlightedEventHandler(object sender, MessageTextViewMessageHighlightedEventArgs e); public class MessageTextViewMessageHighlightedEventArgs : EventArgs { private MessageModel f_Message; public MessageModel Message { get { return f_Message; } } public MessageTextViewMessageHighlightedEventArgs(MessageModel message) { f_Message = message; } } public class MessageTextViewPersonClickedEventArgs : EventArgs { public string IdentityName { get; private set; } public MessageTextViewPersonClickedEventArgs(string identityName) { IdentityName = identityName; } } } smuxi-1.1/src/Frontend-GNOME/Views/Assistants/0000775000175000017500000000000014011526501021755 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Views/Assistants/Engine/0000775000175000017500000000000014011526501023162 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs0000664000175000017500000003675113411450522026626 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2009, 2011, 2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Text.RegularExpressions; using Smuxi.Common; using Smuxi.Engine; using IOPath = System.IO.Path; namespace Smuxi.Frontend.Gnome { public class EngineAssistant : Gtk.Assistant { private FrontendConfig f_Config; private string f_EngineName; private EngineAssistantIntroWidget f_IntroWidget; private EngineAssistantNameWidget f_NameWidget; private int f_NamePage; private EngineAssistantConnectionWidget f_ConnectionWidget; private EngineAssistantCredentialsWidget f_CredentialsWidget; bool IsPutty { get; set; } public EngineAssistant(Gtk.Window parent, FrontendConfig config) : this(parent, config, null) { Trace.Call(parent, config); } public EngineAssistant(Gtk.Window parent, FrontendConfig config, string engineName) { Trace.Call(parent, config, engineName); if (parent == null) { throw new ArgumentNullException("parent"); } if (config == null) { throw new ArgumentNullException("config"); } f_Config = config; f_EngineName = engineName; TransientFor = parent; SetDefaultSize(640, 480); SetPosition(Gtk.WindowPosition.CenterAlways); Title = _("Engine Assistant - Smuxi"); IsPutty = File.Exists("plink.exe"); Apply += OnApply; InitPages(); } private void InitPages() { InitIntroPage(); InitNamePage(); InitConnectionPage(); InitCredentialsPage(); InitConfirmPage(); } private void InitIntroPage() { f_IntroWidget = new EngineAssistantIntroWidget(); AppendPage(f_IntroWidget); if (f_EngineName == null) { SetPageTitle(f_IntroWidget, _("Add Smuxi Engine")); } else { SetPageTitle(f_IntroWidget, _("Edit Smuxi Engine")); } SetPageType(f_IntroWidget, Gtk.AssistantPageType.Intro); SetPageComplete(f_IntroWidget, true); } private void InitNamePage() { f_NameWidget = new EngineAssistantNameWidget(); f_NamePage = AppendPage(f_NameWidget); SetPageTitle(f_NameWidget, _("Name")); SetPageType(f_NameWidget, Gtk.AssistantPageType.Content); Prepare += delegate(object sender, Gtk.PrepareArgs e) { if (e.Page != f_NameWidget) { return; } CheckNamePage(); }; f_NameWidget.EngineNameEntry.Changed += delegate { CheckNamePage(); }; if (f_EngineName != null) { // we can't rename engines for now f_NameWidget.EngineNameEntry.Text = f_EngineName; f_NameWidget.EngineNameEntry.Sensitive = false; } } private void CheckNamePage() { bool isComplete = true; if (f_NameWidget.EngineNameEntry.Text.Trim().Length == 0) { isComplete = false; } SetPageComplete(f_NameWidget, isComplete); } private void InitConnectionPage() { f_ConnectionWidget = new EngineAssistantConnectionWidget(); AppendPage(f_ConnectionWidget); SetPageTitle(f_ConnectionWidget, _("Connection")); SetPageType(f_ConnectionWidget, Gtk.AssistantPageType.Content); Prepare += delegate(object sender, Gtk.PrepareArgs e) { if (e.Page != f_ConnectionWidget) { return; } CheckConnectionPage(); }; f_ConnectionWidget.UseSshTunnelCheckButton.Toggled += delegate { bool isActive = f_ConnectionWidget.UseSshTunnelCheckButton.Active; f_ConnectionWidget.SshHostEntry.Sensitive = isActive; f_ConnectionWidget.SshPortSpinButton.Sensitive = isActive; f_ConnectionWidget.HostEntry.Sensitive = !isActive; if (isActive) { f_ConnectionWidget.HostEntry.Text = "localhost"; } else { f_ConnectionWidget.HostEntry.Text = String.Empty; f_ConnectionWidget.SshHostEntry.Text = String.Empty; f_ConnectionWidget.SshPortSpinButton.Value = 22d; } CheckConnectionPage(); }; f_ConnectionWidget.SshHostEntry.Changed += delegate { CheckConnectionPage(); }; f_ConnectionWidget.HostEntry.Changed += delegate { CheckConnectionPage(); }; if (f_EngineName != null) { f_ConnectionWidget.UseSshTunnelCheckButton.Active = (bool) f_Config["Engines/" + f_EngineName + "/UseSshTunnel"]; f_ConnectionWidget.SshHostEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/SshHostname"]; f_ConnectionWidget.SshPortSpinButton.Value = (double)(int) f_Config["Engines/" + f_EngineName + "/SshPort"]; f_ConnectionWidget.HostEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/Hostname"]; f_ConnectionWidget.PortSpinButton.Value = (double)(int) f_Config["Engines/" + f_EngineName + "/Port"]; } } private void CheckConnectionPage() { bool isComplete = true; if (f_ConnectionWidget.UseSshTunnelCheckButton.Active && f_ConnectionWidget.SshHostEntry.Text.Trim().Length == 0) { isComplete = false; } if (f_ConnectionWidget.HostEntry.Text.Trim().Length == 0) { isComplete = false; } SetPageComplete(f_ConnectionWidget, isComplete); } private void InitCredentialsPage() { f_CredentialsWidget = new EngineAssistantCredentialsWidget(); AppendPage(f_CredentialsWidget); SetPageTitle(f_CredentialsWidget, _("Credentials")); SetPageType(f_CredentialsWidget, Gtk.AssistantPageType.Content); Prepare += delegate(object sender, Gtk.PrepareArgs e) { if (e.Page != f_CredentialsWidget) { return; } CheckCredentialsPage(); }; f_CredentialsWidget.SshUsernameEntry.Changed += delegate { CheckCredentialsPage(); }; f_CredentialsWidget.UsernameEntry.Changed += delegate { CheckCredentialsPage(); }; f_CredentialsWidget.PasswordEntry.Changed += delegate { CheckCredentialsPage(); }; f_CredentialsWidget.VerifyPasswordEntry.Changed += delegate { CheckCredentialsPage(); }; // HACK: only show the SSH password field if plink is present as // OpenSSH doesn't support passing passwords via command line f_CredentialsWidget.SshPasswordVBox.Visible = IsPutty; if (IsPutty) { // Plink always requires a SSH username, thus // remove the (optional) portion from the label f_CredentialsWidget.SshUsernameLabel.Text = Regex.Replace( f_CredentialsWidget.SshUsernameLabel.Text, @"\(.*?\)", "" ); // PuTTY/Plink does not support OpenSSH key files but .ppk var filter = new Gtk.FileFilter(); filter.Name = "PuTTY/Plink key files (*.ppk)"; filter.AddPattern("*.ppk"); f_CredentialsWidget.SshKeyfileChooserButton.AddFilter(filter); } if (f_EngineName != null) { f_CredentialsWidget.SshUsernameEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/SshUsername"]; f_CredentialsWidget.SshPasswordEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/SshPassword"]; var sshKeyfile = (string) f_Config["Engines/" + f_EngineName + "/SshKeyfile"]; if (!String.IsNullOrEmpty(sshKeyfile)) { f_CredentialsWidget.SshKeyfileChooserButton.SetFilename( sshKeyfile ); } var sshPath = IOPath.Combine( Environment.GetFolderPath( Environment.SpecialFolder.Personal ), ".ssh" ); if (Directory.Exists(sshPath)) { f_CredentialsWidget.SshKeyfileChooserButton.SetCurrentFolder( sshPath ); } f_CredentialsWidget.UsernameEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/Username"]; f_CredentialsWidget.PasswordEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/Password"]; f_CredentialsWidget.VerifyPasswordEntry.Text = (string) f_Config["Engines/" + f_EngineName + "/Password"]; } } private void CheckCredentialsPage() { bool useSsh = f_ConnectionWidget.UseSshTunnelCheckButton.Active; f_CredentialsWidget.SshUsernameEntry.Sensitive = useSsh; f_CredentialsWidget.SshPasswordEntry.Sensitive = useSsh; f_CredentialsWidget.SshKeyfileChooserButton.Sensitive = useSsh; if (!useSsh) { f_CredentialsWidget.SshUsernameEntry.Text = String.Empty; f_CredentialsWidget.SshPasswordEntry.Text = String.Empty; f_CredentialsWidget.SshKeyfileChooserButton.UnselectAll(); } bool isComplete = true; if (f_CredentialsWidget.UsernameEntry.Text.Trim().Length == 0 || f_CredentialsWidget.PasswordEntry.Text.Trim().Length == 0) { isComplete = false; } if (f_CredentialsWidget.PasswordEntry.Text != f_CredentialsWidget.VerifyPasswordEntry.Text) { isComplete = false; } // Putty always requires a username if (IsPutty && f_CredentialsWidget.SshUsernameEntry.Text.Trim().Length == 0) { isComplete = false; } SetPageComplete(f_CredentialsWidget, isComplete); } private void InitConfirmPage() { Gtk.Label page = new Gtk.Label(_("Now you can use the Smuxi Engine")); AppendPage(page); SetPageTitle(page, _("Thank you")); SetPageType(page, Gtk.AssistantPageType.Confirm); SetPageComplete(page, true); } protected virtual void OnApply(object sender, EventArgs e) { Trace.Call(sender, e); string engine = f_NameWidget.EngineNameEntry.Text; if (f_EngineName == null) { // check if an engine wit that name exists already string[] engines = (string[]) f_Config["Engines/Engines"]; foreach (string oldEngine in engines) { if (engine == oldEngine) { Gtk.MessageDialog md = new Gtk.MessageDialog(this, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Close, _("An engine with this name already exists! Please specify a different one.")); md.Run(); md.Destroy(); // jump back to the name page // HACK: assistant API is buggy here, the "Apply" button // will trigger a next page signal, thus we have to jump // to one page before the name page :( CurrentPage = f_NamePage - 1; return; } } string[] newEngines; if (engines.Length == 0) { // there was no existing engines newEngines = new string[] { engine }; } else { newEngines = new string[engines.Length + 1]; engines.CopyTo(newEngines, 0); newEngines[engines.Length] = engine; } if (engines.Length == 1) { f_Config["Engines/Default"] = engine; } f_Config["Engines/Engines"] = newEngines; } if (f_NameWidget.MakeDefaultEngineCheckButton.Active) { f_Config["Engines/Default"] = engine; } f_Config["Engines/"+engine+"/Username"] = f_CredentialsWidget.UsernameEntry.Text.Trim(); f_Config["Engines/"+engine+"/Password"] = f_CredentialsWidget.PasswordEntry.Text.Trim(); f_Config["Engines/"+engine+"/Hostname"] = f_ConnectionWidget.HostEntry.Text.Trim(); f_Config["Engines/"+engine+"/Port"] = f_ConnectionWidget.PortSpinButton.ValueAsInt; f_Config["Engines/"+engine+"/UseSshTunnel"] = f_ConnectionWidget.UseSshTunnelCheckButton.Active; f_Config["Engines/"+engine+"/SshUsername"] = f_CredentialsWidget.SshUsernameEntry.Text.Trim(); if (f_CredentialsWidget.SshPasswordVBox.Visible) { f_Config["Engines/"+engine+"/SshPassword"] = f_CredentialsWidget.SshPasswordEntry.Text; } f_Config["Engines/"+engine+"/SshKeyfile"] = f_CredentialsWidget.SshKeyfileChooserButton.Filename ?? String.Empty; f_Config["Engines/"+engine+"/SshHostname"] = f_ConnectionWidget.SshHostEntry.Text.Trim(); f_Config["Engines/"+engine+"/SshPort"] = f_ConnectionWidget.SshPortSpinButton.ValueAsInt; // HACK: we don't really support any other channels/formatters (yet) f_Config["Engines/"+engine+"/Channel"] = "TCP"; f_Config["Engines/"+engine+"/Formatter"] = "binary"; f_Config.Save(); } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistantIntroWidget.cs0000644000175000017500000000210612726351313030775 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantIntroWidget : Gtk.Bin { public EngineAssistantIntroWidget() { Build(); } } } smuxi-1.1/src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistantConnectionWidget.cs0000644000175000017500000000345112726351313032005 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantConnectionWidget : Gtk.Bin { public Gtk.CheckButton UseSshTunnelCheckButton { get { return f_UseSshTunnelCheckButton; } } public Gtk.Entry SshHostEntry { get { return f_SshHostEntry; } } public Gtk.SpinButton SshPortSpinButton { get { return f_SshPortSpinButton; } } public Gtk.Entry HostEntry { get { return f_HostEntry; } } public Gtk.SpinButton PortSpinButton { get { return f_PortSpinButton; } } public EngineAssistantConnectionWidget() { Build(); f_SshHostEntry.HasFocus = true; } } } smuxi-1.1/src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistantCredentialsWidget.cs0000664000175000017500000000421713411450522032140 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantCredentialsWidget : Gtk.Bin { public Gtk.Entry UsernameEntry { get { return f_UsernameEntry; } } public Gtk.Entry PasswordEntry { get { return f_PasswordEntry; } } public Gtk.Entry VerifyPasswordEntry { get { return f_VerifyPasswordEntry; } } public Gtk.Entry SshUsernameEntry { get { return f_SshUsernameEntry; } } public Gtk.Label SshUsernameLabel { get { return f_SshUsernameLabel; } } public Gtk.Entry SshPasswordEntry { get { return f_SshPasswordEntry; } } public Gtk.VBox SshPasswordVBox { get { return f_SshPasswordVBox; } } public Gtk.FileChooserButton SshKeyfileChooserButton { get { return f_SshKeyfileChooserButton; } } public EngineAssistantCredentialsWidget() { Build(); } } } smuxi-1.1/src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistantNameWidget.cs0000644000175000017500000000254412726351313030570 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantNameWidget : Gtk.Bin { public Gtk.Entry EngineNameEntry { get { return f_EngineNameEntry; } } public Gtk.CheckButton MakeDefaultEngineCheckButton { get { return f_MakeDefaultEngineCheckButton; } } public EngineAssistantNameWidget() { Build(); } } } smuxi-1.1/src/Frontend-GNOME/Views/ServerDialog.cs0000664000175000017500000000611414011467170022546 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public partial class ServerDialog : Gtk.Dialog { public ServerDialog(Gtk.Window parent, ServerModel server, IList supportedProtocols, IList networks) : base(null, parent, Gtk.DialogFlags.DestroyWithParent) { Trace.Call(parent, server, supportedProtocols, networks); if (parent == null) { throw new ArgumentNullException("parent"); } if (supportedProtocols == null) { throw new ArgumentNullException("supportedProtocols"); } if (networks == null) { throw new ArgumentNullException("networks"); } Build(); TransientFor = parent; f_Widget.InitProtocols(supportedProtocols); f_Widget.InitNetworks(networks); f_Widget.ProtocolComboBox.Changed += delegate { CheckOkButton(); }; f_Widget.HostnameEntry.Changed += delegate { CheckOkButton(); }; CheckOkButton(); if (server != null) { f_OkButton.Label = _("Save"); try { f_Widget.Load(server); } catch (Exception) { Destroy(); throw; } } else { f_OkButton.Label = _("Add"); } } protected virtual void CheckOkButton() { Trace.Call(); f_OkButton.Sensitive = true; switch (f_Widget.ProtocolComboBox.ActiveText) { case "Campfire": if (f_Widget.HostnameEntry.Text == ".campfirenow.com") { f_OkButton.Sensitive = false; } break; } } public ServerModel GetServer() { return f_Widget.GetServer(); } static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/ServerWidget.cs0000664000175000017500000005213314011467170022574 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2015, 2017 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { [System.ComponentModel.ToolboxItem(true)] public partial class ServerWidget : Gtk.Bin { Gtk.ListStore f_NetworkListStore; string ServerID { get; set; } ServerModel Server { get; set; } public Gtk.Entry HostnameEntry { get { return f_HostnameEntry; } } public Gtk.ComboBox ProtocolComboBox { get { return f_ProtocolComboBox; } } public string Protocol { get { Gtk.TreeIter activeIter; if (!f_ProtocolComboBox.GetActiveIter(out activeIter)) { return null; } var store = (Gtk.ListStore) ProtocolComboBox.Model; var protocolId = (string) store.GetValue(activeIter, 1); return protocolId; } set { if (value == null) { // clear selection f_ProtocolComboBox.Active = -1; return; } Gtk.ListStore store = (Gtk.ListStore) ProtocolComboBox.Model; int protocolPosition = -1; int j = 0; foreach (object[] row in store) { var protocolId = (string) row[1]; if (protocolId == value) { protocolPosition = j; break; } j++; } if (protocolPosition == -1) { var iter = store.AppendValues( String.Format( "{0} ({1})", value, _("Unsupported") ), value ); f_ProtocolComboBox.SetActiveIter(iter); return; } f_ProtocolComboBox.Active = protocolPosition; } } public Gtk.ComboBoxEntry NetworkComboBoxEntry { get { return f_NetworkComboBoxEntry; } } public Gtk.Entry NicknameEntry { get { return f_NicknameEntry; } } public Gtk.Entry RealnameEntry { get { return f_RealnameEntry; } } public Gtk.CheckButton OnStartupConnectCheckButton { get { return f_OnStartupConnectCheckButton; } } public bool ShowHostname { set { f_HostnameLabel.Visible = value; f_HostnameEntry.Visible = value; f_PortLabel.Visible = value; f_PortSpinButton.Visible = value; } } public bool ShowNetwork { set { f_NetworkLabel.Visible = value; f_NetworkComboBoxEntry.Visible = value; } } public bool ShowNickname { set { // Smuxi < 0.11 does not support server specific nickname if (Frontend.EngineProtocolVersion < new Version(0, 11)) { value = false; } f_NicknameLabel.Visible = value; f_NicknameEntry.Visible = value; } } public bool ShowRealname { set { // Smuxi < 0.11 does not support server specific realname if (Frontend.EngineProtocolVersion < new Version(0, 11)) { value = false; } f_RealnameLabel.Visible = value; f_RealnameEntry.Visible = value; } } public bool ShowPassword { set { f_PasswordLabel.Visible = value; f_PasswordEntry.Visible = value; f_ShowPasswordCheckButton.Visible = value; } } public bool SupportUseEncryption { set { f_UseEncryptionCheckButton.Sensitive = value; f_ValidateServerCertificateCheckButton.Sensitive = value; if (!value) { f_UseEncryptionCheckButton.Active = false; f_ValidateServerCertificateCheckButton.Active = false; } CheckUseEncryptionCheckButton(); } } public ServerWidget() { Trace.Call(); f_NetworkListStore = new Gtk.ListStore(typeof(string)); Build(); Init(); } public void Load(ServerModel server) { Trace.Call(server); Server = server; // protocol is part of the PKEY, not allowed to change f_ProtocolComboBox.Sensitive = false; Protocol = server.Protocol; ServerID = server.ServerID; f_HostnameEntry.Text = server.Hostname; f_NetworkComboBoxEntry.Entry.Text = server.Network; if (String.IsNullOrEmpty(server.Nickname)) { var defaultNicknames = (string[]) Frontend.UserConfig["Connection/Nicknames"]; f_NicknameEntry.Text = String.Join(" ", defaultNicknames); } else { f_NicknameEntry.Text = server.Nickname; } if (String.IsNullOrEmpty(server.Realname)) { var defaultRealname = (string) Frontend.UserConfig["Connection/Realname"]; f_RealnameEntry.Text = defaultRealname; } else { f_RealnameEntry.Text = server.Realname; } f_UsernameEntry.Text = server.Username; // HACK: Twitter username is part of the PKEY, not allowed to change if (server.Protocol == "Twitter") { f_UsernameEntry.Sensitive = false; } else { f_UsernameEntry.Sensitive = true; } f_PasswordEntry.Text = server.Password; f_UseEncryptionCheckButton.Active = server.UseEncryption; f_ValidateServerCertificateCheckButton.Active = server.ValidateServerCertificate; f_PortSpinButton.Value = server.Port; OnStartupConnectCheckButton.Active = server.OnStartupConnect; if (server.OnConnectCommands == null || server.OnConnectCommands.Count == 0) { f_OnConnectCommandsTextView.Buffer.Text = String.Empty; } else { // LAME: replace me when we have .NET 3.0 string[] commands = new string[server.OnConnectCommands.Count]; server.OnConnectCommands.CopyTo(commands, 0); f_OnConnectCommandsTextView.Buffer.Text = String.Join( "\n", commands ); } } public ServerModel GetServer() { var server = Server; if (server == null) { server = new ServerModel(); } server.Protocol = f_ProtocolComboBox.ActiveText; server.ServerID = ServerID; server.Hostname = f_HostnameEntry.Text.Trim(); server.Network = f_NetworkComboBoxEntry.Entry.Text.Trim(); server.Port = f_PortSpinButton.ValueAsInt; server.Username = f_UsernameEntry.Text.Trim(); switch (Protocol) { case "Twitter": // HACK: use Twitter username as hostname for multi-account support server.Hostname = server.Username; break; case "Slack": // HACK: on Slack the nickname has to match the username server.Nickname = server.Username; break; } server.Password = f_PasswordEntry.Text; server.Nickname = f_NicknameEntry.Text.Trim(); server.Realname = f_RealnameEntry.Text.Trim(); server.UseEncryption = f_UseEncryptionCheckButton.Active; server.ValidateServerCertificate = f_ValidateServerCertificateCheckButton.Active; server.OnStartupConnect = f_OnStartupConnectCheckButton.Active; if (f_OnConnectCommandsTextView.Sensitive) { server.OnConnectCommands = f_OnConnectCommandsTextView.Buffer.Text.Split('\n'); } else { server.OnConnectCommands = new List(); } return server; } public void InitProtocols(IList protocols) { Trace.Call(protocols); if (protocols == null) { throw new ArgumentNullException("protocols"); } f_ProtocolComboBox.Clear(); var cell = new Gtk.CellRendererText(); f_ProtocolComboBox.PackStart(cell, false); f_ProtocolComboBox.AddAttribute(cell, "text", 0); var store = new Gtk.ListStore(typeof(string), typeof(string)); // fill protocols in ListStore foreach (string protocol in protocols) { store.AppendValues(protocol, protocol); } store.SetSortColumnId(0, Gtk.SortType.Ascending); f_ProtocolComboBox.Model = store; try { // select IRC by default (if available) Protocol = "IRC"; } catch (ArgumentOutOfRangeException) { } } public void InitNetworks(IList networks) { Trace.Call(networks); if (networks == null) { throw new ArgumentNullException("networks"); } f_NetworkComboBoxEntry.Visible = true; // fill protocols in ListStore f_NetworkListStore.Clear(); foreach (string network in networks) { f_NetworkListStore.AppendValues(network); } f_NetworkListStore.SetSortColumnId(0, Gtk.SortType.Ascending); f_NetworkComboBoxEntry.Model = f_NetworkListStore; f_NetworkComboBoxEntry.TextColumn = 0; } private void Init() { f_ProtocolComboBox.Changed += delegate { CheckProtocolComboBox(); }; f_HostnameEntry.Changed += delegate { CheckHostnameEntry(); }; f_ShowPasswordCheckButton.Clicked += delegate { CheckShowPasswordCheckButton(); }; f_IgnoreOnConnectCommandsCheckButton.Toggled += delegate { CheckIgnoreOnConnectCommandsCheckButton(); }; f_UseEncryptionCheckButton.Clicked += delegate { CheckUseEncryptionCheckButton(); }; var defaultNicknames = (string[]) Frontend.UserConfig["Connection/Nicknames"]; f_NicknameEntry.Text = String.Join(" ", defaultNicknames); var defaultRealname = (string) Frontend.UserConfig["Connection/Realname"]; f_RealnameEntry.Text = defaultRealname; } protected virtual void CheckIgnoreOnConnectCommandsCheckButton() { Trace.Call(); f_OnConnectCommandsTextView.Sensitive = !f_IgnoreOnConnectCommandsCheckButton.Active; } protected virtual void CheckShowPasswordCheckButton() { Trace.Call(); f_PasswordEntry.Visibility = f_ShowPasswordCheckButton.Active; } protected virtual void CheckUseEncryptionCheckButton() { Trace.Call(); var useEncryption = f_UseEncryptionCheckButton.Active; f_ValidateServerCertificateCheckButton.Sensitive = useEncryption; if (!useEncryption) { f_ValidateServerCertificateCheckButton.Active = false; } switch (f_ProtocolComboBox.ActiveText) { case "IRC": case "Slack": if (f_PortSpinButton.Value == 6667 || f_PortSpinButton.Value == 6697) { f_PortSpinButton.Value = useEncryption ? 6697 : 6667; } break; case "JabbR": if (f_PortSpinButton.Value == 80 || f_PortSpinButton.Value == 443) { f_PortSpinButton.Value = useEncryption ? 443 : 80; } break; } } protected virtual void CheckProtocolComboBox() { Trace.Call(); // HACK: hardcoded default list, not so nice // suggest sane port defaults // TODO: this should be replaced with some ProtocolInfo class // that contains exactly this kind of information switch (f_ProtocolComboBox.ActiveText) { case "IRC": ShowHostname = true; ShowNetwork = true; ShowNickname = true; ShowRealname = true; ShowPassword = true; SupportUseEncryption = true; f_HostnameEntry.Sensitive = true; f_NetworkComboBoxEntry.Sensitive = true; f_PortSpinButton.Value = 6667; f_PortSpinButton.Sensitive = true; break; case "Facebook": ShowHostname = false; ShowNetwork = false; ShowNickname = false; ShowRealname = false; ShowPassword = true; SupportUseEncryption = true; f_HostnameEntry.Text = "chat.facebook.com"; f_PortSpinButton.Value = 5222; break; case "XMPP": ShowHostname = true; ShowNetwork = false; ShowNickname = false; ShowRealname = false; ShowPassword = true; SupportUseEncryption = true; f_HostnameEntry.Sensitive = true; f_NetworkComboBoxEntry.Entry.Text = String.Empty; f_NetworkComboBoxEntry.Sensitive = false; f_PortSpinButton.Value = 5222; f_PortSpinButton.Sensitive = true; break; // this protocols have static servers case "AIM": case "ICQ": case "MSNP": ShowHostname = false; ShowNetwork = false; ShowNickname = false; ShowRealname = false; ShowPassword = true; SupportUseEncryption = false; f_HostnameEntry.Text = String.Empty; f_HostnameEntry.Sensitive = false; f_NetworkComboBoxEntry.Entry.Text = String.Empty; f_NetworkComboBoxEntry.Sensitive = false; f_PortSpinButton.Value = 0; f_PortSpinButton.Sensitive = false; break; case "Twitter": ShowHostname = false; ShowNetwork = false; ShowNickname = false; ShowRealname = false; ShowPassword = false; SupportUseEncryption = true; // engine always uses https f_UseEncryptionCheckButton.Active = true; f_UseEncryptionCheckButton.Sensitive = false; f_HostnameEntry.Text = String.Empty; f_PortSpinButton.Value = 443; f_PortSpinButton.Sensitive = false; f_NetworkComboBoxEntry.Entry.Text = String.Empty; f_PasswordEntry.Text = String.Empty; break; case "Campfire": ShowHostname = true; ShowNetwork = false; ShowNickname = false; ShowRealname = false; ShowPassword = true; SupportUseEncryption = true; // engine always uses https f_UseEncryptionCheckButton.Active = true; f_UseEncryptionCheckButton.Sensitive = false; f_HostnameEntry.Text = ".campfirenow.com"; f_HostnameEntry.Sensitive = true; f_PortSpinButton.Value = 443; f_PortSpinButton.Sensitive = false; f_NetworkComboBoxEntry.Entry.Text = String.Empty; f_PasswordEntry.Text = String.Empty; break; case "JabbR": ShowHostname = true; ShowNetwork = false; ShowNickname = false; ShowRealname = false; ShowPassword = true; SupportUseEncryption = true; f_HostnameEntry.Text = "jabbr.net"; f_HostnameEntry.Sensitive = true; f_PortSpinButton.Value = 443; f_PortSpinButton.Sensitive = true; f_UseEncryptionCheckButton.Active = true; f_NetworkComboBoxEntry.Entry.Text = String.Empty; f_PasswordEntry.Text = String.Empty; break; case "Slack": // https://my.slack.com/account/gateways ShowHostname = true; // we map the 4rd level domain (foo.irc.slacke.com) to the // network name as it is guaranteed to be unique, see // CheckHostnameEntry() ShowNetwork = false; // on Slack the nickname has to match the username ShowNickname = false; // the realname is ignored by the IRC bridge ShowRealname = false; ShowPassword = true; SupportUseEncryption = true; // use TLS by default f_UseEncryptionCheckButton.Active = true; f_HostnameEntry.Text = ".irc.slack.com"; f_HostnameEntry.Sensitive = true; // Slack only supports 6667 or 6697 f_PortSpinButton.Sensitive = false; f_NetworkComboBoxEntry.Entry.Text = String.Empty; f_PasswordEntry.Text = String.Empty; break; // in case we don't know / handle the protocol here, make // sure we grant maximum flexibility for the input default: ShowHostname = true; ShowNetwork = true; ShowNickname = true; ShowRealname = true; ShowPassword = true; SupportUseEncryption = true; f_HostnameEntry.Sensitive = true; f_PortSpinButton.Sensitive = true; f_UseEncryptionCheckButton.Sensitive = true; f_ValidateServerCertificateCheckButton.Sensitive = true; break; } } void CheckHostnameEntry() { Trace.Call(); var hostname = f_HostnameEntry.Text ?? String.Empty; switch (Protocol) { case "Slack": var colonPosition = hostname.IndexOf('.'); if (colonPosition < 0) { return; } // map 4th level domain to the network name, e.g. // "foo.irc.slack.come" as host becomes "foo" as network var fourthLevelDomain = hostname.Substring(0, colonPosition); f_NetworkComboBoxEntry.Entry.Text = fourthLevelDomain; break; } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/FilterListWidget.cs0000664000175000017500000004363614011467170023417 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010, 2015 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { [System.ComponentModel.ToolboxItem(true)] public partial class FilterListWidget : Gtk.Bin { Gtk.Window f_Parent { get; set; } Gtk.ListStore f_ListStore { get; set; } FilterListController f_Controller { get; set; } Gtk.ListStore f_ChatTypeListStore { get; set; } Gtk.ListStore f_MessageTypeListStore { get; set; } Gtk.ListStore f_ProtocolListStore { get; set; } public event EventHandler Changed; public FilterListWidget(Gtk.Window parent, UserConfig userConfig) { if (parent == null) { throw new ArgumentNullException("parent"); } if (userConfig == null) { throw new ArgumentNullException("userConfig"); } Build(); Init(); f_Parent = parent; f_Controller = new FilterListController(userConfig); } public void InitProtocols(IList protocols) { Trace.Call(protocols); if (protocols == null) { throw new ArgumentNullException("protocols"); } f_ProtocolListStore.Clear(); f_ProtocolListStore.AppendValues(String.Empty); foreach (string protocol in protocols) { f_ProtocolListStore.AppendValues(protocol); } f_ProtocolListStore.SetSortColumnId(0, Gtk.SortType.Ascending); } public void Load() { Trace.Call(); f_ListStore.Clear(); var filters = f_Controller.GetFilterList(); foreach (var filter in filters) { f_ListStore.AppendValues(filter.Value, filter.Key); } f_TreeView.ColumnsAutosize(); } public void Save() { Trace.Call(); // search for removed filters foreach (var filterPair in f_Controller.GetFilterList()) { bool removed = true; foreach (object[] row in f_ListStore) { if ((int) row[1] == filterPair.Key) { removed = false; break; } } if (removed) { f_Controller.RemoveFilter(filterPair.Key); } } Gtk.TreeIter iter; if (!f_ListStore.GetIterFirst(out iter)) { // empty list, nothing to do return; } do { var filter = (FilterModel) f_ListStore.GetValue(iter, 0); var key = (int) f_ListStore.GetValue(iter, 1); // test patterns try { Pattern.IsMatch(String.Empty, filter.ChatID); } catch (ArgumentException ex) { throw new ApplicationException( String.Format( _("Invalid filter regex: '{0}'. Reason: {1}"), filter.ChatID, ex.Message ) ); } try { Pattern.IsMatch(String.Empty, filter.MessagePattern); } catch (ArgumentException ex) { throw new ApplicationException( String.Format( _("Invalid filter regex: '{0}'. Reason: {1}"), filter.MessagePattern, ex.Message ) ); } if (key == -1) { // new filter if (String.IsNullOrEmpty(filter.Protocol) && String.IsNullOrEmpty(filter.NetworkID) && filter.ChatType == null && String.IsNullOrEmpty(filter.ChatID) && filter.MessageType == null && String.IsNullOrEmpty(filter.MessagePattern)) { // drop empty filters f_ListStore.Remove(ref iter); continue; } key = f_Controller.AddFilter(filter); // write generated key back f_ListStore.SetValue(iter, 1, key); } else { // update filter f_Controller.SetFilter(key, filter); } } while (f_ListStore.IterNext(ref iter)); } protected virtual void OnChanged(EventArgs e) { if (Changed != null) { Changed(this, e); } } protected virtual void OnAddButtonClicked(object sender, System.EventArgs e) { Trace.Call(sender, e); try { var filter = new FilterModel(); filter.Protocol = String.Empty; filter.NetworkID = String.Empty; filter.ChatID = String.Empty; filter.MessagePattern = String.Empty; Gtk.TreeIter iter = f_ListStore.AppendValues(filter, -1); f_TreeView.Selection.SelectIter(iter); OnChanged(EventArgs.Empty); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnRemoveButtonClicked(object sender, System.EventArgs e) { Trace.Call(sender, e); try { Gtk.TreeIter iter; if (!f_TreeView.Selection.GetSelected(out iter)) { return; } Gtk.MessageDialog md = new Gtk.MessageDialog( f_Parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, _("Are you sure you want to delete the selected filter?") ); int result = md.Run(); md.Destroy(); if (result != (int) Gtk.ResponseType.Yes) { return; } f_ListStore.Remove(ref iter); OnChanged(EventArgs.Empty); } catch (Exception ex) { Frontend.ShowException(ex); } } void Init() { f_ProtocolListStore = new Gtk.ListStore(typeof(string)); f_ListStore = new Gtk.ListStore( typeof(FilterModel), typeof(int), // filter key typeof(string) // tool tip ); f_TreeView.Model = f_ListStore; Gtk.TreeViewColumn column; Gtk.CellRendererText textCellr; Gtk.CellRendererCombo comboCellr; comboCellr = new Gtk.CellRendererCombo(); comboCellr.Model = f_ProtocolListStore; comboCellr.TextColumn = 0; comboCellr.HasEntry = false; comboCellr.Editable = true; comboCellr.Edited += OnProtocolEdited; column = f_TreeView.AppendColumn(_("Protocol"), comboCellr); column.SetCellDataFunc(comboCellr, RenderProtocol); // NetworkID textCellr = new Gtk.CellRendererText(); textCellr.Editable = true; textCellr.Edited += delegate(object sender, Gtk.EditedArgs e) { Gtk.TreeIter iter; if (!f_ListStore.GetIterFromString(out iter, e.Path)) { return; } var filter = (FilterModel) f_ListStore.GetValue(iter, 0); filter.NetworkID = e.NewText; f_ListStore.EmitRowChanged(new Gtk.TreePath(e.Path), iter); OnChanged(EventArgs.Empty); }; column = f_TreeView.AppendColumn(_("Network"), textCellr); column.Resizable = true; column.MinWidth = 80; column.Sizing = Gtk.TreeViewColumnSizing.GrowOnly; column.SetCellDataFunc(textCellr, delegate(Gtk.TreeViewColumn col, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { var filter = (FilterModel) model.GetValue(iter, 0); (cellr as Gtk.CellRendererText).Text = filter.NetworkID; } ); f_ChatTypeListStore = new Gtk.ListStore(typeof(string), typeof(ChatType?)); f_ChatTypeListStore.AppendValues(String.Empty, null); f_ChatTypeListStore.AppendValues(_("Person / Private"), ChatType.Person); f_ChatTypeListStore.AppendValues(_("Group / Public"), ChatType.Group); f_ChatTypeListStore.AppendValues(_("Protocol / Server"), ChatType.Protocol); comboCellr = new Gtk.CellRendererCombo(); comboCellr.Model = f_ChatTypeListStore; comboCellr.TextColumn = 0; comboCellr.HasEntry = false; comboCellr.Editable = true; comboCellr.Edited += OnChatTypeEdited; column = f_TreeView.AppendColumn(_("Chat Type"), comboCellr); column.Resizable = true; column.Sizing = Gtk.TreeViewColumnSizing.GrowOnly; column.SetCellDataFunc(comboCellr, RenderChatType); textCellr = new Gtk.CellRendererText(); textCellr.Editable = true; textCellr.Edited += delegate(object sender, Gtk.EditedArgs e) { Gtk.TreeIter iter; if (!f_ListStore.GetIterFromString(out iter, e.Path)) { return; } FilterModel filter = (FilterModel) f_ListStore.GetValue(iter, 0); filter.ChatID = e.NewText; f_ListStore.EmitRowChanged(new Gtk.TreePath(e.Path), iter); OnChanged(EventArgs.Empty); }; column = f_TreeView.AppendColumn(_("Name"), textCellr); column.MinWidth = 80; column.Resizable = true; column.Sizing = Gtk.TreeViewColumnSizing.GrowOnly; column.SetCellDataFunc(textCellr, delegate(Gtk.TreeViewColumn col, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter ) { FilterModel filter = (FilterModel) model.GetValue(iter, 0); (cellr as Gtk.CellRendererText).Text = filter.ChatID; } ); f_MessageTypeListStore = new Gtk.ListStore(typeof(string), typeof(MessageType?)); f_MessageTypeListStore.AppendValues(String.Empty, null); f_MessageTypeListStore.AppendValues(_("Normal"), MessageType.Normal); f_MessageTypeListStore.AppendValues(_("Event"), MessageType.Event); comboCellr = new Gtk.CellRendererCombo(); comboCellr.Model = f_MessageTypeListStore; comboCellr.TextColumn = 0; comboCellr.HasEntry = false; comboCellr.Editable = true; comboCellr.Edited += OnMessageTypeEdited; column = f_TreeView.AppendColumn(_("Type"), comboCellr); column.Resizable = true; column.Sizing = Gtk.TreeViewColumnSizing.GrowOnly; column.SetCellDataFunc(comboCellr, RenderMessageType); /* f_TreeView.HasTooltip = true; f_TreeView.QueryTooltip += delegate(object sender, Gtk.QueryTooltipArgs e) { e.Tooltip.Text = "Message Type"; f_TreeView.SetTooltipCell(e.Tooltip, null, column, null); e.RetVal = true; }; */ textCellr = new Gtk.CellRendererText(); textCellr.Editable = true; textCellr.Edited += delegate(object sender, Gtk.EditedArgs e) { Gtk.TreeIter iter; if (!f_ListStore.GetIterFromString(out iter, e.Path)) { return; } FilterModel filter = (FilterModel) f_ListStore.GetValue(iter, 0); filter.MessagePattern = e.NewText; f_ListStore.EmitRowChanged(new Gtk.TreePath(e.Path), iter); OnChanged(EventArgs.Empty); }; column = f_TreeView.AppendColumn(_("Pattern"), textCellr); column.Resizable = true; column.MinWidth = 80; column.Sizing = Gtk.TreeViewColumnSizing.GrowOnly; column.SetCellDataFunc(textCellr, delegate(Gtk.TreeViewColumn col, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { FilterModel filter = (FilterModel) model.GetValue(iter, 0); (cellr as Gtk.CellRendererText).Text = filter.MessagePattern; } ); } void RenderProtocol(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { FilterModel filter = (FilterModel) model.GetValue(iter, 0); (cellr as Gtk.CellRendererCombo).Text = filter.Protocol; } void OnProtocolEdited(object sender, Gtk.EditedArgs e) { Trace.Call(sender, e); Gtk.TreeIter iter; if (!f_ListStore.GetIterFromString(out iter, e.Path)) { return; } FilterModel filter = (FilterModel) f_ListStore.GetValue(iter, 0); filter.Protocol = e.NewText; f_ListStore.EmitRowChanged(new Gtk.TreePath(e.Path), iter); OnChanged(EventArgs.Empty); } void RenderChatType(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { FilterModel filter = (FilterModel) model.GetValue(iter, 0); foreach (object[] row in f_ChatTypeListStore) { if ((ChatType?) row[1] == filter.ChatType) { (cellr as Gtk.CellRendererCombo).Text = (string) row[0]; break; } } } void OnChatTypeEdited(object sender, Gtk.EditedArgs e) { Trace.Call(sender, e); Gtk.TreeIter iter; if (!f_ListStore.GetIterFromString(out iter, e.Path)) { return; } FilterModel filter = (FilterModel) f_ListStore.GetValue(iter, 0); // HACK: lame GTK+ 2.12 is not exposing the combo box neither // the iterator of the selected row inside the combo box thus // we have lookup the value in the list store using the text :/ // TODO: starting with GTK+ 2.14 the Changed event can be used // see http://git.gnome.org/browse/gtk+/tree/gtk/gtkcellrenderercombo.c#n178 ChatType? newChatType = null; foreach (object[] row in f_ChatTypeListStore) { if ((string) row[0] == e.NewText) { newChatType = (ChatType?) row[1]; break; } } filter.ChatType = newChatType; f_ListStore.EmitRowChanged(new Gtk.TreePath(e.Path), iter); OnChanged(EventArgs.Empty); } void RenderMessageType(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { FilterModel filter = (FilterModel) model.GetValue(iter, 0); foreach (object[] row in f_MessageTypeListStore) { if ((MessageType?) row[1] == filter.MessageType) { (cellr as Gtk.CellRendererCombo).Text = (string) row[0]; break; } } } void OnMessageTypeEdited(object sender, Gtk.EditedArgs e) { Trace.Call(sender, e); Gtk.TreeIter iter; if (!f_ListStore.GetIterFromString(out iter, e.Path)) { return; } FilterModel filter = (FilterModel) f_ListStore.GetValue(iter, 0); // HACK: lame GTK+ 2.12 is not exposing the combo box neither // the iterator of the selected row inside the combo box thus // we have lookup the value in the list store using the text :/ // TODO: starting with GTK+ 2.14 the Changed event can be used // see http://git.gnome.org/browse/gtk+/tree/gtk/gtkcellrenderercombo.c#n178 MessageType? newMsgType = null; foreach (object[] row in f_MessageTypeListStore) { if ((string) row[0] == e.NewText) { newMsgType = (MessageType?) row[1]; break; } } filter.MessageType = newMsgType; f_ListStore.EmitRowChanged(new Gtk.TreePath(e.Path), iter); OnChanged(EventArgs.Empty); } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/Chats/0000775000175000017500000000000014011526501020663 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Views/Chats/GroupChatView.cs0000664000175000017500000006340014011467170023752 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2009-2014 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Threading; using System.Collections.Generic; using System.Globalization; using System.Linq; using Mono.Unix; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Group)] public class GroupChatView : ChatView { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static Gdk.Pixbuf IconPixbuf { get; private set; } private bool NickColors { get; set; } private GroupChatModel _GroupChatModel; private Gtk.TreeView _PersonTreeView; private Gtk.ListStore _PersonListStore; private Gtk.Menu _PersonMenu; private Gtk.VBox _OutputVBox; private Gtk.Frame _PersonTreeViewFrame; private Gtk.HPaned _OutputHPaned; private Gtk.ScrolledWindow _TopicScrolledWindow; private MessageTextView _TopicTextView; private MessageModel _Topic; private Gtk.TreeViewColumn _IdentityNameColumn; IDictionary SyncedPersons { get; set; } MessageModel SyncedTopic { get; set; } public override IList Participants { get; protected set; } protected Gtk.CellRendererText IdentityNameCellRenderer { get; set; } Gtk.ScrolledWindow PersonScrolledWindow { get; set; } public event EventHandler ParticipantsChanged; public override bool HasSelection { get { return base.HasSelection || _PersonTreeView.Selection.CountSelectedRows() > 0 || _TopicTextView.HasTextViewSelection; } } public override bool HasFocus { get { return base.HasFocus || _PersonTreeView.HasFocus || _TopicTextView.HasFocus; } } public MessageModel Topic { get { return _Topic; } set { _Topic = value; _TopicTextView.Clear(); if (value != null) { _TopicTextView.AddMessage(value, false); } _TopicScrolledWindow.Visible = !_TopicTextView.IsEmpty; } } protected Gtk.TreeView PersonTreeView { get { return _PersonTreeView; } } protected Gtk.Menu PersonMenu { get { return _PersonMenu; } } protected Gtk.TreeViewColumn IdentityNameColumn { get { return _IdentityNameColumn; } } protected override Gtk.Image DefaultTabImage { get { return new Gtk.Image(IconPixbuf); } } public Gtk.HPaned OutputHPaned { get { return _OutputHPaned; } } static GroupChatView() { IconPixbuf = Frontend.LoadIcon( "smuxi-group-chat", 16, "group-chat_256x256.png" ); } public GroupChatView(GroupChatModel groupChat) : base(groupChat) { Trace.Call(groupChat); _GroupChatModel = groupChat; // person list Participants = new List(); _OutputHPaned = new Gtk.HPaned(); Gtk.TreeView tv = new Gtk.TreeView(); _PersonTreeView = tv; Gtk.ScrolledWindow sw = new Gtk.ScrolledWindow(); PersonScrolledWindow = sw; sw.ShadowType = Gtk.ShadowType.None; sw.HscrollbarPolicy = Gtk.PolicyType.Never; //tv.CanFocus = false; tv.BorderWidth = 0; tv.Selection.Mode = Gtk.SelectionMode.Multiple; sw.Add(tv); Gtk.TreeViewColumn column; var cellr = new Gtk.CellRendererText() { Ellipsize = Pango.EllipsizeMode.End }; IdentityNameCellRenderer = cellr; column = new Gtk.TreeViewColumn(String.Empty, cellr); column.SortColumnId = 0; column.Spacing = 0; column.SortIndicator = false; column.Expand = true; column.Sizing = Gtk.TreeViewColumnSizing.Autosize; // FIXME: this callback leaks memory column.SetCellDataFunc(cellr, new Gtk.TreeCellDataFunc(RenderPersonIdentityName)); tv.AppendColumn(column); _IdentityNameColumn = column; Gtk.ListStore liststore = new Gtk.ListStore(typeof(PersonModel)); liststore.SetSortColumnId(0, Gtk.SortType.Ascending); liststore.SetSortFunc(0, new Gtk.TreeIterCompareFunc(SortPersonListStore)); _PersonListStore = liststore; tv.Model = liststore; tv.SearchColumn = 0; tv.SearchEqualFunc = (model, col, key, iter) => { var person = (PersonModel) model.GetValue(iter, col); // Ladies and gentlemen welcome to C // 0 means it matched but 0 as bool is false. So if it matches // we have to return false. Still not clear? true is false and // false is true, weirdo! If you think this is retarded, // yes it is. return !person.IdentityName.StartsWith(key, StringComparison.InvariantCultureIgnoreCase); }; tv.EnableSearch = true; tv.HeadersVisible = false; tv.RowActivated += new Gtk.RowActivatedHandler(OnPersonsRowActivated); tv.FocusOutEvent += OnPersonTreeViewFocusOutEvent; // popup menu _PersonMenu = new Gtk.Menu(); // don't loose the focus else we lose the selection too! // see OnPersonTreeViewFocusOutEvent() _PersonMenu.TakeFocus = false; _PersonMenu.Shown += OnPersonMenuShown; _PersonTreeView.ButtonPressEvent += _OnPersonTreeViewButtonPressEvent; _PersonTreeView.KeyPressEvent += OnPersonTreeViewKeyPressEvent; // frame needed for events when selecting something in the treeview _PersonTreeViewFrame = new Gtk.Frame() { ShadowType = Gtk.ShadowType.In }; _PersonTreeViewFrame.ButtonReleaseEvent += new Gtk.ButtonReleaseEventHandler(_OnUserListButtonReleaseEvent); _PersonTreeViewFrame.Add(sw); // topic // don't worry, ApplyConfig() will add us to the OutputVBox! _OutputVBox = new Gtk.VBox() { Spacing = 1 }; _TopicTextView = new MessageTextView(); _TopicTextView.Editable = false; _TopicTextView.WrapMode = Gtk.WrapMode.WordChar; _TopicScrolledWindow = new Gtk.ScrolledWindow(); _TopicScrolledWindow.ShadowType = Gtk.ShadowType.In; _TopicScrolledWindow.HscrollbarPolicy = Gtk.PolicyType.Never; _TopicScrolledWindow.Add(_TopicTextView); // make sure the topic is invisible and remains by default and // visible when a topic gets set _TopicScrolledWindow.ShowAll(); _TopicScrolledWindow.Visible = false; _TopicScrolledWindow.NoShowAll = true; _TopicScrolledWindow.SizeRequested += delegate(object o, Gtk.SizeRequestedArgs args) { // predict and set useful topic heigth int lineWidth, lineHeight; using (var layout = _TopicTextView.CreatePangoLayout("Test Topic")) { layout.GetPixelSize(out lineWidth, out lineHeight); } var lineSpacing = _TopicTextView.PixelsAboveLines + _TopicTextView.PixelsBelowLines; var it = _TopicTextView.Buffer.StartIter; int newLines = 1; // move to end of next visual line while (_TopicTextView.ForwardDisplayLineEnd(ref it)) { newLines++; // calling ForwardDisplayLineEnd repeatedly stays on the same position // therefor we move one cursor position further it.ForwardCursorPosition(); } newLines = Math.Min(newLines, 3); var bestSize = new Gtk.Requisition() { Height = ((lineHeight + lineSpacing) * newLines) + 4 }; args.Requisition = bestSize; }; Add(_OutputHPaned); //ApplyConfig(Frontend.UserConfig); ShowAll(); } protected GroupChatView(IntPtr handle) : base(handle) { } public override void Dispose() { Trace.Call(); // HACK: this shouldn't be needed but GTK# keeps GC handles // these callbacks for some reason and thus leaks :( // release ListStore.SetSortFunc() callback // gtk_list_store_finalize() -> _gtk_tree_data_list_header_free() -> destroy(user_data); _TopicTextView.Dispose(); _PersonListStore.Dispose(); // release TreeViewColumn.SetCellDataFunc() callback // gtk_tree_view_column_finalize -> GtkTreeViewColumnCellInfo -> info->destroy(info->func_data) _IdentityNameColumn.Dispose(); base.Dispose(); } public override void Disable() { Trace.Call(); base.Disable(); _TopicTextView.Buffer.Text = String.Empty; _PersonListStore.Clear(); OnParticipantsChanged(EventArgs.Empty); } public override void Sync() { Trace.Call(); GLib.Idle.Add(delegate { TabImage.SetFromStock(Gtk.Stock.Refresh, Gtk.IconSize.Menu); OnStatusChanged(EventArgs.Empty); return false; }); #if LOG4NET _Logger.Debug("Sync() syncing persons"); #endif // REMOTING CALL 1 SyncedPersons = _GroupChatModel.Persons; if (SyncedPersons == null) { SyncedPersons = new Dictionary(0); } #if LOG4NET _Logger.Debug("Sync() syncing topic"); #endif // REMOTING CALL 2 SyncedTopic = _GroupChatModel.Topic; base.Sync(); } public override void Populate() { Trace.Call(); // sync persons var persons = SyncedPersons; if (_PersonTreeView != null && persons != null) { // HACK: out of scope string status = String.Format( _("Retrieving user list for {0}..."), SyncedName); Frontend.MainWindow.Status = status; Gtk.ListStore ls = (Gtk.ListStore) _PersonTreeView.Model; // cleanup, be sure the list is empty ls.Clear(); Participants = new List(); foreach (var person in persons.Values.OrderBy(x => x)) { ls.AppendValues(person); Participants.Add(person); } OnParticipantsChanged(EventArgs.Empty); // TRANSLATOR: this string will be appended to the one above status += String.Format(" {0}", _("done.")); Frontend.MainWindow.Status = status; } SyncedPersons = null; Topic = SyncedTopic; base.Populate(); } public override void AddMessage(MessageModel msg) { base.AddMessage(msg); var nick = msg.GetNick(); if (nick == null) { return; } // update who spoke last for (int i = 0; i < Participants.Count; ++i) { var speaker = Participants[i]; if (speaker.IdentityName == nick) { Participants.RemoveAt(i); Participants.Insert(0, speaker); break; } } } public void AddPerson(PersonModel person) { Trace.Call(person); if (_PersonListStore == null) { // no liststore, nothing todo return; } _PersonListStore.AppendValues(person); Participants.Add(person); OnParticipantsChanged(EventArgs.Empty); } public void UpdatePerson(PersonModel oldPerson, PersonModel newPerson) { Trace.Call(oldPerson, newPerson); if (_PersonListStore == null) { // no liststore, nothing todo return; } Gtk.TreeIter iter; bool res = _PersonListStore.GetIterFirst(out iter); if (!res) { #if LOG4NET _Logger.Error("UpdatePersonModelInChannel(): _PersonsStore.GetIterFirst() returned false, ignoring update..."); #endif return; } do { PersonModel person = (PersonModel) _PersonListStore.GetValue(iter, 0); if (person.ID == oldPerson.ID) { _PersonListStore.SetValue(iter, 0, newPerson); break; } } while (_PersonListStore.IterNext(ref iter)); _PersonTreeView.CheckResize(); //_PersonListStore.Reorder(); for (int i = 0; i < Participants.Count; ++i) { if (Participants[i].ID == oldPerson.ID) { Participants[i] = newPerson; break; } } } public void RemovePerson(PersonModel person) { Trace.Call(person); if (_PersonListStore == null) { // no liststore, nothing todo return; } Gtk.TreeIter iter; bool res = _PersonListStore.GetIterFirst(out iter); if (!res) { #if LOG4NET _Logger.Error("RemovePerson(): GetIterFirst() returned false!"); #endif return; } do { PersonModel currentPerson = (PersonModel) _PersonListStore.GetValue(iter, 0); if (currentPerson.ID == person.ID) { _PersonListStore.Remove(ref iter); break; } } while (_PersonListStore.IterNext(ref iter)); for (int i = 0; i < Participants.Count; ++i) { if (Participants[i].ID == person.ID) { Participants.RemoveAt(i); break; } } OnParticipantsChanged(EventArgs.Empty); } public override void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } base.ApplyConfig(config); // topic _TopicTextView.ApplyConfig(config); string topic_pos = (string) config["Interface/Notebook/Channel/TopicPosition"]; if (_TopicScrolledWindow.IsAncestor(_OutputVBox)) { _OutputVBox.Remove(_TopicScrolledWindow); } if (OutputScrolledWindow.IsAncestor(_OutputVBox)) { _OutputVBox.Remove(OutputScrolledWindow); } if (topic_pos == "top") { _OutputVBox.PackStart(_TopicScrolledWindow, false, false, 0); _OutputVBox.PackStart(OutputScrolledWindow, true, true, 0); } else if (topic_pos == "bottom") { _OutputVBox.PackStart(OutputScrolledWindow, true, true, 0); _OutputVBox.PackStart(_TopicScrolledWindow, false, false, 0); } else if (topic_pos == "none") { _OutputVBox.PackStart(OutputScrolledWindow, true, true, 0); } else { #if LOG4NET _Logger.Error("ApplyConfig(): unsupported value in Interface/Notebook/Channel/TopicPosition: " + topic_pos); #endif } _OutputVBox.ShowAll(); // person list if (ThemeSettings.BackgroundColor == null) { _PersonTreeView.ModifyBase(Gtk.StateType.Normal); } else { _PersonTreeView.ModifyBase(Gtk.StateType.Normal, ThemeSettings.BackgroundColor.Value); } if (ThemeSettings.ForegroundColor == null) { _PersonTreeView.ModifyText(Gtk.StateType.Normal); } else { _PersonTreeView.ModifyText(Gtk.StateType.Normal, ThemeSettings.ForegroundColor.Value); } _PersonTreeView.ModifyFont(ThemeSettings.FontDescription); string userlist_pos = (string) config["Interface/Notebook/Channel/UserListPosition"]; if (userlist_pos == "left") { userlist_pos = "right"; } if (_PersonTreeViewFrame.IsAncestor(_OutputHPaned)) { _OutputHPaned.Remove(_PersonTreeViewFrame); } if (_OutputVBox.IsAncestor(_OutputHPaned)) { _OutputHPaned.Remove(_OutputVBox); } if (userlist_pos == "left") { _OutputHPaned.Pack1(_PersonTreeViewFrame, false, true); _OutputHPaned.Pack2(_OutputVBox, true, true); } else if (userlist_pos == "right") { _OutputHPaned.Pack1(_OutputVBox, true, false); _OutputHPaned.Pack2(_PersonTreeViewFrame, false, false); } else if (userlist_pos == "none") { _OutputHPaned.Pack1(_OutputVBox, true, true); } else { #if LOG4NET _Logger.Error("ApplyConfig(): unsupported value in Interface/Notebook/Channel/UserListPosition: " + userlist_pos); #endif } _OutputHPaned.ShowAll(); NickColors = (bool) config["Interface/Notebook/Channel/NickColors"]; } public virtual void RenderPersonIdentityName(Gtk.TreeViewColumn column, Gtk.CellRenderer cellr, Gtk.TreeModel model, Gtk.TreeIter iter) { PersonModel person = (PersonModel) model.GetValue(iter, 0); var renderer = (Gtk.CellRendererText) cellr; if (NickColors) { // TODO: do we need to optimize this? it's called very often... Gdk.Color bgColor = _PersonTreeView.Style.Base(Gtk.StateType.Normal); var builder = new MessageBuilder(); builder.Settings.NickColors = true; builder.AppendNick(person); renderer.Markup = PangoTools.ToMarkup(builder.ToMessage(), bgColor); } else { renderer.Text = person.IdentityName; } } protected virtual int SortPersonListStore(Gtk.TreeModel model, Gtk.TreeIter iter1, Gtk.TreeIter iter2) { Gtk.ListStore liststore = (Gtk.ListStore) model; PersonModel person1 = (PersonModel) liststore.GetValue(iter1, 0); PersonModel person2 = (PersonModel) liststore.GetValue(iter2, 0); return person1.CompareTo(person2); } protected virtual void OnParticipantsChanged(EventArgs e) { if (ParticipantsChanged != null) { ParticipantsChanged(this, EventArgs.Empty); } } protected virtual void OnPersonsRowActivated(object sender, Gtk.RowActivatedArgs e) { Trace.Call(sender, e); IList persons = GetSelectedPersons(); if (persons == null || persons.Count == 0) { return; } var protocolManager = ProtocolManager; if (protocolManager == null) { #if LOG4NET _Logger.WarnFormat( "{0}.OnPersonsRowActivated(): ProtocolManager is null, " + "bailing out!", this ); #endif return; } // jump to person chat if available foreach (var chatView in Frontend.MainWindow.ChatViewManager.Chats) { if (!(chatView is PersonChatView)) { continue; } var personChatView = (PersonChatView) chatView; if (personChatView.PersonModel == persons[0]) { Frontend.MainWindow.ChatViewManager.CurrentChatView = personChatView; return; } } // this is a generic implemention that should be able to open/create // a private chat in most cases, as it depends what OpenChat() // of the specific protocol actually expects/needs foreach (PersonModel person in persons) { PersonChatModel personChat = new PersonChatModel( person, person.ID, person.IdentityName, null ); ThreadPool.QueueUserWorkItem(delegate { try { protocolManager.OpenChat( Frontend.FrontendManager, personChat ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } protected virtual void OnPersonTreeViewFocusOutEvent(object sender, EventArgs e) { Trace.Call(sender, e); // clear the selection when we loose the focus _PersonTreeView.Selection.UnselectAll(); } protected virtual void OnPersonTreeViewKeyPressEvent(object sender, Gtk.KeyPressEventArgs e) { Trace.Call(sender, e); if ((e.Event.State & Gdk.ModifierType.Mod1Mask) != 0 || (e.Event.State & Gdk.ModifierType.ControlMask) != 0 || (e.Event.State & Gdk.ModifierType.ShiftMask) != 0) { // alt, ctrl or shift pushed, returning return; } if (e.Event.Key == Gdk.Key.Menu && _PersonTreeView.Selection.CountSelectedRows() > 0) { _PersonMenu.Popup(null, null, null, 0, e.Event.Time); } } protected virtual void OnPersonMenuShown(object sender, EventArgs e) { } private void _OnUserListButtonReleaseEvent(object sender, Gtk.ButtonReleaseEventArgs e) { Trace.Call(sender, e); if (e.Event.Button == 3 && _PersonTreeView.Selection.CountSelectedRows() > 0) { // HACK: don't pass the real mouse button that was used to // initiate the menu, as sub-menus will only respond to that // button for some reason! As workaround we always pass // 0 == left mouse button here //_PersonMenu.Popup(null, null, null, e.Event.Button, e.Event.Time); _PersonMenu.Popup(null, null, null, 0, e.Event.Time); } } [GLib.ConnectBefore] private void _OnPersonTreeViewButtonPressEvent(object sender, Gtk.ButtonPressEventArgs e) { Trace.Call(sender, e); // If there is an existing selection prevent making a new one using // the right mouse button. // We have to check > 1 though, because you can't undo a single row selection! if (e.Event.Button == 3 && _PersonTreeView.Selection.CountSelectedRows() > 1) { e.RetVal = true; } } protected IList GetSelectedPersons() { Gtk.TreeIter iter; Gtk.TreeModel model; List persons = new List(); Gtk.TreePath[] paths = _PersonTreeView.Selection.GetSelectedRows(out model); foreach (Gtk.TreePath path in paths) { if (model.GetIter(out iter, path)) { persons.Add((PersonModel) model.GetValue(iter, 0)); } } return persons; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Views/Chats/SessionChatView.cs0000644000175000017500000000443612726351313024305 0ustar00meebeymeebey00000000000000/* * $Id: NetworkChatView.cs 218 2007-11-12 19:50:25Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Chats/NetworkChatView.cs $ * $Rev: 218 $ * $Author: meebey $ * $Date: 2007-11-12 20:50:25 +0100 (Mon, 12 Nov 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Session)] public class SessionChatView : ChatView { public static Gdk.Pixbuf IconPixbuf { get; private set; } protected override Gtk.Image DefaultTabImage { get { return new Gtk.Image(IconPixbuf); } } static SessionChatView() { IconPixbuf = Frontend.LoadIcon( "smuxi-session-chat", 16, "session-chat_256x256.png" ); } public SessionChatView(ChatModel chat) : base(chat) { Trace.Call(chat); OutputMessageTextView.ShowMarkerline = false; OutputMessageTextView.ShowTimestamps = false; Add(OutputScrolledWindow); ShowAll(); } protected SessionChatView(IntPtr handle) : base(handle) { } protected override void OnTabButtonPress(object sender, Gtk.ButtonPressEventArgs e) { Trace.Call(sender, e); // disable menu for session chats } } } smuxi-1.1/src/Frontend-GNOME/Views/Chats/ChatView.cs0000664000175000017500000007670314011467170022747 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2016 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Text.RegularExpressions; using System.Threading; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Gnome { // TODO: use Gtk.Bin public abstract class ChatView : Gtk.EventBox, IChatView, IDisposable, ITraceable { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public string ID { get; internal set; } public int Position { get; internal set; } private ChatModel _ChatModel; private bool _HasHighlight; public int HighlightCount { get; private set; } private bool _HasActivity; public int ActivityCount { get; private set; } private bool _HasEvent; public bool IsSynced { get; private set; } private Gtk.TextMark _EndMark; private Gtk.Menu _TabMenu; private Gtk.Label _TabLabel; private Gtk.EventBox _TabEventBox; private Gtk.HBox _TabHBox; private Gtk.ScrolledWindow _OutputScrolledWindow; private MessageTextView _OutputMessageTextView; private ThemeSettings _ThemeSettings; private TaskQueue _LastSeenHighlightQueue; public DateTime SyncedLastSeenMessage { get; private set; } public DateTime SyncedLastSeenHighlight { get; private set; } IList SyncedMessages { get; set; } protected string SyncedName { get; set; } public IProtocolManager ProtocolManager { get; set; } bool UseLowBandwidthMode { get; set; } public Gtk.Image TabImage { get; protected set; } bool IsAutoScrolling { get; set; } public event EventHandler StatusChanged; public ChatModel ChatModel { get { return _ChatModel; } } public new string Name { get { return base.Name; } set { base.Name = value; _TabLabel.Text = value; OnStatusChanged(EventArgs.Empty); } } // this property is thread-safe public bool IsActive { get { // is it really safe to query a property value of glib owned // object?!? return Frontend.MainWindow.HasToplevelFocus && Object.ReferenceEquals( Frontend.MainWindow.ChatViewManager.CurrentChatView, this ); } } public bool HasHighlight { get { return _HasHighlight; } set { if (value) { _HasHighlight = value; HighlightCount++; OnStatusChanged(EventArgs.Empty); } else { if (_HasHighlight == value) { // nothing to update return; } _HasHighlight = value; // clear highlight with "no activity" HasActivity = false; HighlightCount = 0; OnStatusChanged(EventArgs.Empty); return; } var color = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(_ThemeSettings.HighlightColor), ColorConverter.GetTextColor( Gtk.Rc.GetStyle(_TabLabel).Base(Gtk.StateType.Normal) ), TextColorContrast.High ); if (HighlightCount > 1) { _TabLabel.Markup = String.Format( "{1} ({2})", GLib.Markup.EscapeText(color.ToString()), GLib.Markup.EscapeText(Name), GLib.Markup.EscapeText(HighlightCount.ToString()) ); } else { _TabLabel.Markup = String.Format( "{1}", GLib.Markup.EscapeText(color.ToString()), GLib.Markup.EscapeText(Name) ); } } } public bool HasActivity { get { return _HasActivity; } set { if (value) { ActivityCount++; OnStatusChanged(EventArgs.Empty); } else { ActivityCount = 0; } if (_HasActivity == value) { // nothing to update return; } _HasActivity = value; OnStatusChanged(EventArgs.Empty); if (HasHighlight) { // don't show activity if there is a highlight active return; } Gdk.Color colorValue; if (value) { colorValue = _ThemeSettings.ActivityColor; } else { colorValue = _ThemeSettings.NoActivityColor; } var color = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(colorValue), ColorConverter.GetTextColor( Gtk.Rc.GetStyle(_TabLabel).Base(Gtk.StateType.Normal) ), TextColorContrast.High ); _TabLabel.Markup = String.Format( "{1}", GLib.Markup.EscapeText(color.ToString()), GLib.Markup.EscapeText(Name) ); } } public bool HasEvent { get { return _HasEvent; } set { if (_HasEvent == value) { // nothing to update return; } _HasEvent = value; OnStatusChanged(EventArgs.Empty); if (HasHighlight) { return; } if (HasActivity) { return; } if (!value) { // clear event with "no activity" HasActivity = false; return; } var color = TextColorTools.GetBestTextColor( ColorConverter.GetTextColor(_ThemeSettings.EventColor), ColorConverter.GetTextColor( Gtk.Rc.GetStyle(_TabLabel).Base(Gtk.StateType.Normal) ), TextColorContrast.High ); _TabLabel.Markup = String.Format( "{1}", GLib.Markup.EscapeText(color.ToString()), GLib.Markup.EscapeText(Name) ); } } public virtual bool HasSelection { get { return _OutputMessageTextView.HasTextViewSelection; } } public virtual new bool HasFocus { get { return base.HasFocus || _OutputMessageTextView.HasFocus; } set { _OutputMessageTextView.HasFocus = value; } } // by default: no participants public virtual IList Participants { get { return new List(); } protected set { } } public Gtk.Widget LabelWidget { get { return _TabEventBox; } } public MessageTextView OutputMessageTextView { get { return _OutputMessageTextView; } } protected Gtk.ScrolledWindow OutputScrolledWindow { get { return _OutputScrolledWindow; } } protected Gtk.HBox TabHBox { get { return _TabHBox; } } public Gtk.Menu TabMenu { get { return _TabMenu; } } protected ThemeSettings ThemeSettings { get { return _ThemeSettings; } } protected abstract Gtk.Image DefaultTabImage { get; } protected virtual MessageTextView CreateMainMessageTextView() { return new MessageTextView(); } public event EventHandler MessageHighlighted; public ChatView(ChatModel chat) { Trace.Call(chat); _ChatModel = chat; IsAutoScrolling = true; MessageTextView tv = CreateMainMessageTextView(); _EndMark = tv.Buffer.CreateMark("end", tv.Buffer.EndIter, false); tv.ShowTimestamps = true; tv.ShowMarkerline = true; tv.Editable = false; tv.CursorVisible = true; tv.WrapMode = Gtk.WrapMode.Char; tv.MessageAdded += OnMessageTextViewMessageAdded; tv.MessageHighlighted += OnMessageTextViewMessageHighlighted; tv.PopulatePopup += OnMessageTextViewPopulatePopup; tv.SizeRequested += delegate { AutoScroll(); }; tv.PersonClicked += OnMessageTextViewPersonClicked; _OutputMessageTextView = tv; Gtk.ScrolledWindow sw = new Gtk.ScrolledWindow(); _OutputScrolledWindow = sw; //sw.HscrollbarPolicy = Gtk.PolicyType.Never; sw.HscrollbarPolicy = Gtk.PolicyType.Automatic; sw.VscrollbarPolicy = Gtk.PolicyType.Always; sw.ShadowType = Gtk.ShadowType.In; sw.Vadjustment.ValueChanged += OnVadjustmentValueChanged; sw.Add(_OutputMessageTextView); // popup menu _TabMenu = new Gtk.Menu(); _TabMenu.Shown += OnTabMenuShown; //FocusChild = _OutputTextView; //CanFocus = false; _TabLabel = new Gtk.Label(); TabImage = DefaultTabImage; _TabHBox = new Gtk.HBox(); _TabHBox.PackEnd(new Gtk.Fixed(), true, true, 0); _TabHBox.PackEnd(_TabLabel, false, false, 0); _TabHBox.PackStart(TabImage, false, false, 2); _TabHBox.ShowAll(); _TabEventBox = new Gtk.EventBox(); _TabEventBox.VisibleWindow = false; _TabEventBox.ButtonPressEvent += new Gtk.ButtonPressEventHandler(OnTabButtonPress); _TabEventBox.Add(_TabHBox); _TabEventBox.ShowAll(); _ThemeSettings = new ThemeSettings(); // OPT-TODO: this should use a TaskStack instead of TaskQueue _LastSeenHighlightQueue = new TaskQueue("LastSeenHighlightQueue("+ID+")"); _LastSeenHighlightQueue.AbortedEvent += OnLastSeenHighlightQueueAbortedEvent; _LastSeenHighlightQueue.ExceptionEvent += OnLastSeenHighlightQueueExceptionEvent; } protected ChatView(IntPtr handle) : base(handle) { } ~ChatView() { Trace.Call(); Dispose(false); } public override void Dispose() { Trace.Call(); Dispose(true); base.Dispose(); } protected void Dispose(bool disposing) { Trace.Call(disposing); if (disposing) { if (_LastSeenHighlightQueue != null) { _LastSeenHighlightQueue.Dispose(); } _LastSeenHighlightQueue = null; // HACK: this shouldn't be needed but GTK# keeps GC handles // these callbacks for some reason and thus leaks :( _OutputMessageTextView.Dispose(); _TabMenu.Shown -= OnTabMenuShown; _OutputScrolledWindow.Vadjustment.ValueChanged -= OnVadjustmentValueChanged; } } public virtual void ScrollUp() { Trace.Call(); Gtk.Adjustment adj = _OutputScrolledWindow.Vadjustment; adj.Value -= adj.PageSize - adj.StepIncrement; } public virtual void ScrollDown() { Trace.Call(); // note: Upper - PageSize is the farest scrollable position! Gtk.Adjustment adj = _OutputScrolledWindow.Vadjustment; if ((adj.Value + adj.PageSize) <= (adj.Upper - adj.PageSize)) { adj.Value += adj.PageSize - adj.StepIncrement; } else { // there is no page left to scroll, so let's just scroll to the // farest position instead adj.Value = adj.Upper - adj.PageSize; } } public virtual void ScrollToStart() { Trace.Call(); Gtk.Adjustment adj = _OutputScrolledWindow.Vadjustment; adj.Value = adj.Lower; } public virtual void ScrollToEnd() { #if SCROLL_DEBUG Trace.Call(); #endif // BUG? doesn't work always for some reason // seems like GTK+ doesn't update the adjustment till we give back control //Gtk.Adjustment adj = _OutputScrolledWindow.Vadjustment; #if LOG4NET && SCROLL_DEBUG _Logger.Debug("ScrollToEnd(): Vadjustment.Value: " + adj.Value + " Vadjustment.Upper: " + adj.Upper + " Vadjustment.PageSize: " + adj.PageSize); #endif //adj.Value = adj.Upper - adj.PageSize; //_OutputTextView.Buffer.MoveMark(_EndMark, _OutputTextView.Buffer.EndIter); //_OutputTextView.ScrollMarkOnscreen(_EndMark); //_OutputTextView.ScrollToMark(_EndMark, 0.49, true, 0.0, 0.0); //_OutputTextView.ScrollMarkOnscreen(_OutputTextView.Buffer.InsertMark); //_OutputTextView.ScrollMarkOnscreen(_OutputTextView.Buffer.GetMark("tail")); #if SCROLL_DEBUG System.Reflection.MethodBase mb = Trace.GetMethodBase(); #endif // WORKAROUND1: scroll after one second delay /* GLib.Timeout.Add(1000, new GLib.TimeoutHandler(delegate { Trace.Call(mb); _OutputTextView.ScrollMarkOnscreen(_EndMark); return false; })); */ // WORKAROUND2: scroll when GTK+ mainloop is idle GLib.Idle.Add(new GLib.IdleHandler(delegate { #if SCROLL_DEBUG Trace.Call(mb); #endif _OutputMessageTextView.ScrollMarkOnscreen(_EndMark); return false; })); } void CheckAutoScroll() { var vAdjustment = _OutputScrolledWindow.Vadjustment; if (vAdjustment.Upper == (vAdjustment.Value + vAdjustment.PageSize)) { // the scrollbar is way at the end, lets autoscroll IsAutoScrolling = true; } else { IsAutoScrolling = false; } } void AutoScroll() { if (!IsAutoScrolling) { return; } ScrollToEnd(); } public virtual void Enable() { Trace.Call(); } public virtual void Disable() { Trace.Call(); IsSynced = false; } public virtual void Sync() { Trace.Call(); GLib.Idle.Add(delegate { TabImage.SetFromStock(Gtk.Stock.Refresh, Gtk.IconSize.Menu); OnStatusChanged(EventArgs.Empty); return false; }); // REMOTING CALL SyncedName = _ChatModel.Name; if (!Frontend.IsLocalEngine && Frontend.UseLowBandwidthMode) { // FIXME: set TabImage back to normal return; } // REMOTING CALL SyncedLastSeenHighlight = _ChatModel.LastSeenHighlight; if (Frontend.EngineProtocolVersion >= new Version(0, 12)) { // REMOTING CALL SyncedLastSeenMessage = _ChatModel.LastSeenMessage; } DateTime start, stop; start = DateTime.UtcNow; // REMOTING CALL SyncedMessages = _ChatModel.Messages; stop = DateTime.UtcNow; #if LOG4NET _Logger.Debug( String.Format( "Sync(): retrieving ChatModel.Messages took: {0:0.00} ms", (stop - start).TotalMilliseconds ) ); #endif } public virtual void Populate() { Trace.Call(); Name = SyncedName; // sync messages // cleanup, be sure the output is empty _OutputMessageTextView.Clear(); if (!Frontend.IsLocalEngine && Frontend.UseLowBandwidthMode) { var msg = new MessageBuilder(); msg.AppendEventPrefix(); msg.AppendMessage(_("Low Bandwidth Mode is active: no messages synced.")); AddMessage(msg.ToMessage()); } else { if (SyncedMessages != null) { // TODO: push messages in batches and give back control to // GTK+ in between for blocking the GUI thread less foreach (MessageModel msg in SyncedMessages) { AddMessage(msg); if (msg.TimeStamp <= SyncedLastSeenMessage) { // let the user know at which position new messages start _OutputMessageTextView.UpdateMarkerline(); } } } } // as we don't track which events have already been seen it would // show all chats with unseen events after the frontend connect if (!HasHighlight) { HasEvent = false; // Smuxi protocol < 0.13 does not support remembering seen // messages thus we mark all message as seen as we can't tell // which ones are new if (Frontend.EngineProtocolVersion < new Version(0, 13)) { HasActivity = false; } } // reset tab icon to normal TabImage.Pixbuf = DefaultTabImage.Pixbuf; OnStatusChanged(EventArgs.Empty); SyncedMessages = null; IsSynced = true; } public virtual void UpdateLastSeenMessage() { _OutputMessageTextView.UpdateMarkerline(); if (Frontend.EngineProtocolVersion == null || Frontend.EngineProtocolVersion < new Version(0, 13)) { return; } var lastSeenMessage = _OutputMessageTextView.LastMessage; if (lastSeenMessage == null) { return; } ThreadPool.QueueUserWorkItem(delegate { try { // REMOTING CALL _ChatModel.LastSeenMessage = lastSeenMessage.TimeStamp; } catch (Exception ex) { Frontend.ShowException(ex); } }); } public virtual void AddMessage(MessageModel msg) { switch (msg.MessageType) { case MessageType.ChatNameChanged: ThreadPool.QueueUserWorkItem(delegate { try { // REMOTING CALL var newname = ChatModel.Name; Gtk.Application.Invoke(delegate { Name = newname; }); } catch (Exception ex) { Frontend.ShowException(ex); } }); return; } _OutputMessageTextView.AddMessage(msg); } public virtual void Clear() { Trace.Call(); _OutputMessageTextView.Clear(); } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } _ThemeSettings = new ThemeSettings(config); _OutputMessageTextView.ApplyConfig(config); } public virtual void Close() { Trace.Call(); var protocolManager = ProtocolManager; if (protocolManager == null) { #if LOG4NET _Logger.WarnFormat( "{0}.Close(): ProtocolManager is null, bailing out!", this ); #endif return; } ThreadPool.QueueUserWorkItem(delegate { try { protocolManager.CloseChat( Frontend.FrontendManager, ChatModel ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public override string ToString() { return String.Format("<{0}>", ToTraceString()); } public string ToTraceString() { return ID; } protected virtual void OnTabButtonPress(object sender, Gtk.ButtonPressEventArgs e) { Trace.Call(sender, e); try { if (e.Event.Button == 3) { _TabMenu.Popup(null, null, null, e.Event.Button, e.Event.Time); } } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnTabMenuShown(object sender, EventArgs e) { Trace.Call(sender, e); foreach (var child in _TabMenu.Children) { _TabMenu.Remove(child); } var closeItem = new Gtk.ImageMenuItem(Gtk.Stock.Close, null); closeItem.Activated += OnTabMenuCloseActivated; _TabMenu.Append(closeItem); _TabMenu.ShowAll(); } protected virtual void OnTabMenuCloseActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { Close(); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnMessageTextViewMessageAdded(object sender, MessageTextViewMessageAddedEventArgs e) { var signalCounter = false; if (!IsActive) { // the chat isn't active, thus we need to signal the event/msg counter if (IsSynced) { signalCounter = true; } else { // we are still syncing and since Smuxi 0.13 we know what msg // was last seen, so we only signal newer messages than that if (Frontend.EngineProtocolVersion >= new Version(0, 13) && e.Message.TimeStamp > SyncedLastSeenMessage) { signalCounter = true; } } } if (signalCounter) { switch (e.Message.MessageType) { case MessageType.Normal: HasActivity = true; break; case MessageType.Event: HasEvent = true; break; } } var buffer = _OutputMessageTextView.Buffer; buffer.MoveMark(_EndMark, buffer.EndIter); AutoScroll(); } protected virtual void OnMessageTextViewMessageHighlighted(object sender, MessageTextViewMessageHighlightedEventArgs e) { if (IsSynced) { bool isActiveChat = IsActive; if (Frontend.UseLowBandwidthMode && !isActiveChat) { HasHighlight = true; return; } var method = Trace.GetMethodBase(); // update last seen highlight // OPT-TODO: we should use a TaskStack here OR at least a // timeout approach that will only sync once per 30 seconds! _LastSeenHighlightQueue.Queue(delegate { Trace.Call(method, null, null); // unhandled exception here would kill the syncer thread try { if (isActiveChat) { // REMOTING CALL 1 _ChatModel.LastSeenHighlight = e.Message.TimeStamp; } else { // REMOTING CALL 1 if (_ChatModel.LastSeenHighlight < e.Message.TimeStamp) { Gtk.Application.Invoke(delegate { // we have to make sure we only highlight // the chat if it still isn't the active // one as isActiveChat state is probably // obsolete by now if (IsActive) { return; } HasHighlight = true; }); } } } catch (Exception ex) { #if LOG4NET _Logger.Error("OnMessageTextViewMessageHighlighted(): Exception: ", ex); #endif } }); } else { if (e.Message.TimeStamp > SyncedLastSeenHighlight) { HasHighlight = true; } } if (e.Message.TimeStamp > SyncedLastSeenHighlight) { // unseen highlight // HACK: out of scope? // only beep if the main windows has no focus (the user is // elsewhere) and the chat is was already synced, as during sync we // would get insane from all beeping caused by the old highlights if (!Frontend.MainWindow.HasToplevelFocus && IsSynced && Frontend.UserConfig["Sound/BeepOnHighlight"] != null && (bool) Frontend.UserConfig["Sound/BeepOnHighlight"]) { #if LOG4NET _Logger.Debug("OnMessageTextViewMessageHighlighted(): BEEP!"); #endif try { if (Display != null) { Display.Beep(); } } catch (Exception ex) { #if LOG4NET _Logger.Error("OnMessageTextViewMessageHighlighted(): Exception", ex); #endif } } if (MessageHighlighted != null) { MessageHighlighted(this, new ChatViewMessageHighlightedEventArgs(e.Message)); } } } protected virtual void OnMessageTextViewPopulatePopup(object sender, Gtk.PopulatePopupArgs e) { Trace.Call(sender, e); if (OutputMessageTextView.IsAtUrlTag) { return; } Gtk.Menu popup = e.Menu; // hide menu bar item as it uses the app menu on OS X if (!Frontend.IsMacOSX) { popup.Prepend(new Gtk.SeparatorMenuItem()); var item = new Gtk.CheckMenuItem(_("Show _Menubar")); item.Active = Frontend.MainWindow.ShowMenuBar; item.Activated += delegate { try { Frontend.MainWindow.ShowMenuBar = !Frontend.MainWindow.ShowMenuBar; } catch (Exception ex) { Frontend.ShowException(ex); } }; popup.Prepend(item); } popup.ShowAll(); } protected virtual void OnMessageTextViewPersonClicked(object sender, MessageTextViewPersonClickedEventArgs e) { Trace.Call(sender, e); var entry = Frontend.MainWindow.Entry; var text = entry.Text; var match = Regex.Match(text, "^[^ ]+: "); if (match.Success) { // removing existing nick text = text.Substring(match.Length); } text = String.Format("{0}: {1}", e.IdentityName, text); entry.Text = text; entry.HasFocus = true; } protected virtual void OnLastSeenHighlightQueueExceptionEvent(object sender, TaskQueueExceptionEventArgs e) { Trace.Call(sender, e); #if LOG4NET _Logger.Error("Exception in TaskQueue: ", e.Exception); _Logger.Error("Inner-Exception: ", e.Exception.InnerException); #endif Frontend.ShowException(e.Exception); } protected virtual void OnLastSeenHighlightQueueAbortedEvent(object sender, EventArgs e) { Trace.Call(sender, e); #if LOG4NET _Logger.Debug("OnLastSeenHighlightQueueAbortedEvent(): task queue aborted!"); #endif } protected virtual void OnStatusChanged(EventArgs e) { if (StatusChanged != null) { StatusChanged(this, e); } } void OnVadjustmentValueChanged(object sender, EventArgs e) { CheckAutoScroll(); } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } public class ChatViewMessageHighlightedEventArgs : EventArgs { public MessageModel Message { get; set; } public ChatViewMessageHighlightedEventArgs(MessageModel msg) { Message = msg; } } } smuxi-1.1/src/Frontend-GNOME/Views/Chats/PersonChatView.cs0000644000175000017500000000630512726351313024125 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Engine; using Smuxi.Common; using System.Threading; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Person)] public class PersonChatView : ChatView { public static Gdk.Pixbuf IconPixbuf { get; private set; } public PersonChatModel PersonChatModel { get; private set; } public PersonModel PersonModel { get; private set; } protected override Gtk.Image DefaultTabImage { get { return new Gtk.Image(IconPixbuf); } } static PersonChatView() { IconPixbuf = Frontend.LoadIcon( "smuxi-person-chat", 16, "person-chat_256x256.png" ); } public override void AddMessage(MessageModel msg) { switch (msg.MessageType) { case MessageType.PersonChatPersonChanged: ThreadPool.QueueUserWorkItem(delegate { try { // REMOTING CALL PersonModel = PersonChatModel.Person; } catch (Exception ex) { Frontend.ShowException(ex); } }); return; } base.AddMessage(msg); } public PersonChatView(PersonChatModel chat) : base(chat) { Trace.Call(chat); PersonChatModel = chat; Add(OutputScrolledWindow); ShowAll(); } protected PersonChatView(IntPtr handle) : base(handle) { } public override IList Participants { get { var ret = new List(); ret.Add(PersonChatModel.Person); return ret; } } public override void Sync() { Trace.Call(); GLib.Idle.Add(delegate { TabImage.SetFromStock(Gtk.Stock.Refresh, Gtk.IconSize.Menu); OnStatusChanged(EventArgs.Empty); return false; }); // REMOTING CALL 1 PersonModel = PersonChatModel.Person; base.Sync(); } } } smuxi-1.1/src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs0000664000175000017500000002653314011467170024465 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2009-2014 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Collections.Generic; using SysPath = System.IO.Path; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Protocol)] public class ProtocolChatView : ChatView { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static Gdk.Pixbuf IconPixbuf { get; private set; } static Dictionary NetworkWebsiteUrls { get; set; } ProxySettings ProxySettings { get; set; } Gdk.Pixbuf ServerIconPixbuf { get; set; } public string Host { get; private set; } public int Port { get; private set; } public string NetworkID { get; private set; } Gtk.ImageMenuItem ReconnectItem { get; set; } protected override Gtk.Image DefaultTabImage { get { var icon = IconPixbuf; if (ServerIconPixbuf != null) { icon = ServerIconPixbuf; } return new Gtk.Image(icon); } } static ProtocolChatView() { IconPixbuf = Frontend.LoadIcon( "smuxi-protocol-chat", 16, "protocol-chat_256x256.png" ); NetworkWebsiteUrls = new Dictionary( StringComparer.InvariantCultureIgnoreCase ); // IRC NetworkWebsiteUrls.Add("OFTC", "http://www.oftc.net/"); NetworkWebsiteUrls.Add("freenode", "http://freenode.net/"); NetworkWebsiteUrls.Add("QuakeNet", "http://www.quakenet.org/"); NetworkWebsiteUrls.Add("IRCnet", "http://www.ircnet.org/"); NetworkWebsiteUrls.Add("DALnet", "http://www.dal.net/"); NetworkWebsiteUrls.Add("GameSurge", "https://gamesurge.net/"); NetworkWebsiteUrls.Add("EFnet", "http://www.efnet.org/"); NetworkWebsiteUrls.Add("GIMPnet", "http://www.gimp.org/"); NetworkWebsiteUrls.Add("GSDnet", "http://www.gsd-software.net/"); NetworkWebsiteUrls.Add("ustream", "http://www.ustream.tv/"); NetworkWebsiteUrls.Add("Infinity-IRC", "http://www.infinityirc.com/"); NetworkWebsiteUrls.Add("GeekShed", "http://www.geekshed.net/"); // IRC bridges NetworkWebsiteUrls.Add("Slack", "https://slack.com/"); // Twitter NetworkWebsiteUrls.Add("Twitter", "http://www.twitter.com/"); // XMPP - with federation NetworkWebsiteUrls.Add("XMPP", "http://xmpp.org/"); NetworkWebsiteUrls.Add("jabber.org", "http://planet.jabber.org/"); NetworkWebsiteUrls.Add("jabber.de", "http://www.jabber.de/"); NetworkWebsiteUrls.Add("jabber.at", "http://planet.jabber.org/"); NetworkWebsiteUrls.Add("jabber.ccc.de", "http://web.jabber.ccc.de/"); NetworkWebsiteUrls.Add("xmpp-gmx.gmx.net", "http://planet.jabber.org/"); NetworkWebsiteUrls.Add("xmpp-webde.gmx.net", "http://planet.jabber.org/"); NetworkWebsiteUrls.Add("jabber.gmx.net", "http://planet.jabber.org/"); // XMPP - without federation NetworkWebsiteUrls.Add("talk.google.com", "http://www.google.com/talk/"); NetworkWebsiteUrls.Add("chat.facebook.com", "http://www.facebook.com/"); // JabbR NetworkWebsiteUrls.Add("jabbr.net", "http://jabbr.net/"); // Campfire NetworkWebsiteUrls.Add("Campfire", "http://campfirenow.com"); // support downloading favicons via https var whitelist = Session.CertificateValidator.HostnameWhitelist; lock (whitelist) { foreach (var url in NetworkWebsiteUrls.Values) { var uri = new Uri(url); var hostname = uri.Host; if (whitelist.Contains(hostname)) { continue; } whitelist.Add(hostname); } } } public ProtocolChatView(ChatModel chat) : base(chat) { Trace.Call(chat); ProxySettings = new ProxySettings(); Add(OutputScrolledWindow); ReconnectItem = new Gtk.ImageMenuItem(_("Reconnect")); ReconnectItem.Image = new Gtk.Image(Gtk.Stock.Refresh, Gtk.IconSize.Menu); ReconnectItem.Activated += new EventHandler(OnTabMenuReconnectActivated); ShowAll(); } protected ProtocolChatView(IntPtr handle) : base(handle) { } public override void Sync() { Trace.Call(); base.Sync(); Host = ProtocolManager.Host; Port = ProtocolManager.Port; NetworkID = ProtocolManager.NetworkID; try { CheckIcon(); } catch (Exception ex) { #if LOG4NET f_Logger.Error("Sync(): CheckIcon() threw exception!", ex); #endif } } public override void Close() { Trace.Call(); // show warning if there are open chats (besides protocol chat) var ownedChats = 0; foreach (var chatView in Frontend.MainWindow.ChatViewManager.Chats) { if (chatView.ProtocolManager == ProtocolManager) { ownedChats++; } } if (ownedChats > 1) { Gtk.MessageDialog md = new Gtk.MessageDialog( Frontend.MainWindow, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, _("Closing the protocol chat will also close all open chats connected to it!\n"+ "Are you sure you want to do this?")); int result = md.Run(); md.Destroy(); if ((Gtk.ResponseType) result != Gtk.ResponseType.Yes) { return; } } ThreadPool.QueueUserWorkItem(delegate { try { // no need to call base.Close() as CommandNetwork() will // deal with it Frontend.Session.CommandNetwork( new CommandModel( Frontend.FrontendManager, ChatModel, "close" ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public override void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } base.ApplyConfig(config); ProxySettings.ApplyConfig(config); } void CheckIcon() { Trace.Call(); var iconCache = new IconCache("server-icons"); // REMOTING CALL var protocol = ProtocolManager.Protocol; string iconName = String.Format("{0}.ico", ID); string iconPath; if (iconCache.TryGetIcon(protocol, iconName, out iconPath)) { UpdateServerIcon(iconPath); } string websiteUrl = null; lock (NetworkWebsiteUrls) { if (!NetworkWebsiteUrls.TryGetValue(ID, out websiteUrl) && !NetworkWebsiteUrls.TryGetValue(protocol, out websiteUrl)) { // unknown network and protocol, nothing to download return; } // download in background so Sync() doesn't get slowed down WebProxy proxy = null; // ignore the proxy settings of remote engines if (Frontend.IsLocalEngine) { proxy = ProxySettings.GetWebProxy(websiteUrl); if (proxy == null) { // HACK: WebClient will always use the system proxy if set to // null so explicitely override this by setting an empty proxy proxy = new WebProxy(); } } iconCache.Proxy = proxy; iconCache.BeginDownloadIcon(protocol, iconName, websiteUrl, UpdateServerIcon, null); } } void UpdateServerIcon(string iconPath) { Trace.Call(iconPath); ServerIconPixbuf = new Gdk.Pixbuf(iconPath, 16, 16); GLib.Idle.Add(delegate { TabImage.Pixbuf = ServerIconPixbuf; OnStatusChanged(EventArgs.Empty); return false; }); } protected override void OnTabMenuShown(object sender, EventArgs e) { Trace.Call(sender, e); base.OnTabMenuShown(sender, e); TabMenu.Prepend(ReconnectItem); TabMenu.ShowAll(); } protected virtual void OnTabMenuReconnectActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { var pm = ProtocolManager; if (pm == null) { return; } ThreadPool.QueueUserWorkItem(delegate { try { pm.Reconnect(Frontend.FrontendManager); } catch (Exception ex) { Frontend.ShowException(ex); } }); } catch (Exception ex) { Frontend.ShowException(ex); } } static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) { return true; } #if LOG4NET f_Logger.Warn( "ValidateCertificate(): Certificate error: " + sslPolicyErrors ); #endif return true; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/QuickConnectDialog.cs0000644000175000017500000001717312726351313022600 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008, 2010 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public partial class QuickConnectDialog : Gtk.Dialog { private ServerListController f_Controller; private Gtk.TreeStore f_TreeStore; private ServerModel f_ServerModel; public ServerModel Server { get { return f_ServerModel; } } public QuickConnectDialog(Gtk.Window parent) : base(null, parent, Gtk.DialogFlags.DestroyWithParent) { Trace.Call(parent); if (parent == null) { throw new ArgumentNullException("parent"); } Build(); TransientFor = parent; f_Controller = new ServerListController(Frontend.UserConfig); f_TreeView.AppendColumn(_("Protocol"), new Gtk.CellRendererText(), "text", 1); f_TreeView.AppendColumn(_("Hostname"), new Gtk.CellRendererText(), "text", 2); f_TreeStore = new Gtk.TreeStore( typeof(ServerModel), typeof(string), // protocol typeof(string) // hostname ); f_TreeView.RowActivated += OnTreeViewRowActivated; f_TreeView.Selection.Changed += OnTreeViewSelectionChanged; f_TreeView.Model = f_TreeStore; f_Widget.InitProtocols(Frontend.Session.GetSupportedProtocols()); // these fields doesn't make sense here f_Widget.OnStartupConnectCheckButton.Visible = false; f_Widget.NetworkComboBoxEntry.Sensitive = false; f_Widget.ProtocolComboBox.Changed += delegate { CheckConnectButton(); }; f_Widget.HostnameEntry.Changed += delegate { CheckConnectButton(); }; } public virtual void Load() { Trace.Call(); LoadServers(); CheckConnectButton(); } protected void LoadServers() { Trace.Call(); f_TreeStore.Clear(); // group servers by protocol Dictionary> protocols = new Dictionary>(); IList servers = f_Controller.GetServerList(); foreach (ServerModel server in servers) { List protocolServers = null; protocols.TryGetValue(server.Protocol, out protocolServers); if (protocolServers == null) { protocolServers = new List(); protocols.Add(server.Protocol, protocolServers); } protocolServers.Add(server); } // add grouped servers to treeview foreach (KeyValuePair> pair in protocols) { Gtk.TreeIter parentIter = f_TreeStore.AppendValues(null, pair.Key, String.Empty); foreach (ServerModel server in pair.Value) { // a server with an empty hostname has only one default/hardcoded // hostname, thus don't create a sub-node for it if (String.IsNullOrEmpty(server.Hostname)) { f_TreeStore.SetValue(parentIter, 0, server); continue; } f_TreeStore.AppendValues(parentIter, server, String.Empty, server.Hostname); } } f_TreeView.ExpandAll(); } protected virtual ServerModel GetCurrentServer() { Trace.Call(); Gtk.TreeIter iter; if (!f_TreeView.Selection.GetSelected(out iter)) { return null; } return (ServerModel) f_TreeStore.GetValue(iter, 0); } #region Event Handlers protected virtual void OnTreeViewSelectionChanged(object sender, EventArgs e) { Trace.Call(sender, e); try { ServerModel server = GetCurrentServer(); if (server == null) { return; } f_Widget.Load(server); // we are not editing server entries here instead we use // whatever values are entered f_Widget.ProtocolComboBox.Sensitive = true; // this field doesn't make sense here f_Widget.NetworkComboBoxEntry.Sensitive = false; // only enable the hostname field if there it's not empty, as // some protocols don't allow custom hosts, e.g. twitter if (!String.IsNullOrEmpty(f_Widget.HostnameEntry.Text)) { f_Widget.HostnameEntry.Sensitive = true; } } catch (ApplicationException ex) { Frontend.ShowError(this, _("Unable to load server: "), ex); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnTreeViewRowActivated(object sender, Gtk.RowActivatedArgs e) { Trace.Call(sender, e); try { ServerModel server = GetCurrentServer(); if (server == null) { return; } f_ServerModel = server; Respond(Gtk.ResponseType.Ok); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void OnConnectButtonClicked(object sender, EventArgs e) { Trace.Call(sender, e); try { f_ServerModel = f_Widget.GetServer(); } catch (Exception ex) { Frontend.ShowException(ex); } } #endregion private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } protected virtual void CheckConnectButton() { Trace.Call(); f_ConnectButton.Sensitive = !f_Widget.HostnameEntry.Visible || f_Widget.HostnameEntry.Text.Trim().Length > 0; if (f_ConnectButton.Sensitive && f_Widget.ProtocolComboBox.ActiveText == "Campfire" && f_Widget.HostnameEntry.Text == ".campfirenow.com") { f_ConnectButton.Sensitive = false; } } } } smuxi-1.1/src/Frontend-GNOME/CrashDialog.cs0000644000175000017500000001357712726351313021256 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006, 2010 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Mono.Unix; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public class CrashDialog : Gtk.Dialog { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif string ReportSubject { get; set; } string ReportDescription { get; set; } public CrashDialog(Gtk.Window parent, Exception e) : base(null, parent, Gtk.DialogFlags.Modal) { SetDefaultSize(640, 480); Title = "Smuxi - " + _("Oops, I did it again..."); Gtk.HBox hbox = new Gtk.HBox(); Gtk.Image image = new Gtk.Image(Gtk.Stock.DialogError, Gtk.IconSize.Dialog); hbox.PackStart(image, false, false, 2); Gtk.VBox label_vbox = new Gtk.VBox(); Gtk.Label label1 = new Gtk.Label(); Gtk.Label label2 = new Gtk.Label(); label1.Markup = String.Format( "{0}", GLib.Markup.EscapeText( _("Smuxi crashed because an unhandled exception was thrown!") ) ); label2.Markup = GLib.Markup.EscapeText( _("Here is the stacktrace, please report this bug!") ); label_vbox.PackStart(label1, false, false, 0); label_vbox.PackStart(new Gtk.Fixed(), true, true, 0); label_vbox.PackStart(label2, false, false, 0); hbox.PackStart(label_vbox, true, true, 0); Gtk.VBox vbox = new Gtk.VBox(); vbox.PackStart(hbox, false, false, 2); Gtk.ScrolledWindow sw = new Gtk.ScrolledWindow(); sw.ShadowType = Gtk.ShadowType.In; Gtk.TextView tv = new Gtk.TextView(); tv.Editable = false; tv.CursorVisible = false; sw.Add(tv); vbox.PackStart(sw, true, true, 2); // add to the dialog VBox.PackStart(vbox, true, true, 2); AddButton(_("_Report Bug"), -1); AddButton(Gtk.Stock.Quit, 0); string message = String.Empty; if (e.InnerException != null) { message = "Inner-Exception Type:\n"+e.InnerException.GetType()+"\n\n"+ "Inner-Exception Message:\n"+e.InnerException.Message+"\n\n"+ "Inner-Exception StackTrace:\n"+e.InnerException.StackTrace+"\n\n"; if (e.StackTrace != null && e.InnerException.StackTrace.Contains("System.Runtime.Remoting")) { message += "Inner-Exception.ToString():\n"+e.InnerException.ToString()+"\n\n"; } } message += "Exception Type:\n"+e.GetType()+"\n\n"+ "Exception Message:\n"+e.Message+"\n\n"+ "Exception StackTrace:\n"+e.StackTrace+"\n\n"; if (e.StackTrace != null && e.StackTrace.Contains("System.Runtime.Remoting")) { message += "Exception.ToString():\n"+e.ToString()+"\n\n"; } tv.Buffer.Text = message; ReportSubject = "Exception: " + HtmlEncodeLame(e.Message); ReportDescription = String.Format( "
{0}
", HtmlEncodeLame("\n" + message) ); ShowAll(); } private string HtmlEncodeLame(string text) { if (text == null) { return String.Empty; } return text.Replace("&", "%26"). Replace(" ", "%20"). Replace("\n", "%0A"). Replace("<", "%3C"). Replace(">", "%3E"); } public static void Show(Gtk.Window parent, Exception ex) { CrashDialog cd = new CrashDialog(parent, ex); cd.Run(); cd.Destroy(); } public new int Run() { int res; do { res = base.Run(); if (res == -1) { try { System.Diagnostics.Process.Start( String.Format( "http://www.smuxi.org/issues/new" + "?issue[tracker_id]=1" + "&issue[subject]={0}" + "&issue[description]={1}", ReportSubject, ReportDescription ) ); } catch (Exception ex) { #if LOG4NET f_Logger.Error(ex); #endif } } } while (res == -1); return res; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.svg0000644000175000017500000037755614011526501023357 0ustar00meebeymeebey00000000000000 Smuxi IRC Client image/svg+xml Smuxi IRC Client 2010-7-28 Ahmed Abdellah Jakub Steiner <jimmac@ximian.com> smuxi-1.1/src/Frontend-GNOME/NetworkManager.cs0000644000175000017500000001206712726351313022013 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011, 2013, 2015 Mirco Bauer // // Full GPL License: // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #if IPC_DBUS using System; using System.Threading; #if DBUS_SHARP using DBus; #else using NDesk.DBus; #endif using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public enum StateNM8 : int { Unknown = 0, Asleep, Connecting, Connected, Disconnected } public enum StateNM9 : int { Unknown = 0, Asleep = 10, Disconnected = 20, Disconnecting = 30, Connecting = 40, ConnectedLocal = 50, ConnectedSite = 60, ConnectedGlobal = 70 } public delegate void StateChangedEventHandler(int state); [Interface("org.freedesktop.NetworkManager")] public interface INetworkManager { string Version(); event StateChangedEventHandler StateChanged; } public class NetworkManager { #if LOG4NET private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif const string BusName = "org.freedesktop.NetworkManager"; const string ObjectPath = "/org/freedesktop/NetworkManager"; INetworkManager Manager { get; set; } ChatViewManager ChatViewManager { get; set; } bool IsInitialized { get; set; } bool WasLocalEngine { get; set; } public NetworkManager(ChatViewManager chatViewManager) { if (chatViewManager == null) { throw new ArgumentNullException("mainWindow"); } ChatViewManager = chatViewManager; try { Init(); } catch (Exception ex) { #if LOG4NET Logger.Error("NetworkManager(): initialization failed: ", ex); #endif } } void Init() { BusG.Init(); var dbus = Bus.System; if (!dbus.NameHasOwner(BusName)) { #if LOG4NET Logger.Info("Init(): no DBus provider for network manager found, " + "disabling..."); #endif return; } Manager = dbus.GetObject( BusName, new ObjectPath(ObjectPath) ); if (Manager == null) { #if LOG4NET Logger.Warn("Init(): DBus object is null, bailing out!"); #endif return; } Manager.StateChanged += OnStateChanged; IsInitialized = true; } void OnStateChanged(int state) { Trace.Call(state); if (!Frontend.HadSession) { return; } switch (state) { case (int) StateNM9.Disconnecting: if (!Frontend.IsLocalEngine) { Frontend.DisconnectEngineFromGUI(true); } break; case (int) StateNM8.Disconnected: case (int) StateNM9.Disconnected: WasLocalEngine = Frontend.IsLocalEngine; if (!Frontend.IsLocalEngine) { Frontend.DisconnectEngineFromGUI(false); } break; case (int) StateNM8.Connected: case (int) StateNM9.ConnectedSite: case (int) StateNM9.ConnectedGlobal: if (WasLocalEngine) { // reconnect local protocol managers foreach (var protocolManager in Frontend.Session.ProtocolManagers) { var pm = protocolManager; // run in background so it can't block the GUI ThreadPool.QueueUserWorkItem(delegate { try { pm.Reconnect(Frontend.FrontendManager); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } else { Frontend.ReconnectEngineToGUI(false); } break; } } } } #endif smuxi-1.1/src/Frontend-GNOME/Makefile.am0000664000175000017500000002601014011472672020570 0ustar00meebeymeebey00000000000000TARGET_DIR = $(top_builddir)/bin/$(PROFILE) EXTRA_DIST = $(WIN_ICON) $(DESKTOP_FILE).in $(man_MANS) $(appdata_in_files) man_MANS = smuxi-frontend-gnome.1 mkdir_p = $(install_sh) -d ICON_NAME = smuxi-frontend-gnome ICON_NAME_PNG = $(ICON_NAME).png ICON_SVG = $(ICON_NAME).svg ICON_XPM = $(ICON_NAME).xpm GROUP_CHAT_ICON_NAME = smuxi-group-chat PERSON_CHAT_ICON_NAME = smuxi-person-chat ICON_16 = $(top_builddir)/images/16/$(ICON_NAME_PNG) ICON_22 = $(top_builddir)/images/22/$(ICON_NAME_PNG) ICON_24 = $(top_builddir)/images/24/$(ICON_NAME_PNG) ICON_32 = $(top_builddir)/images/32/$(ICON_NAME_PNG) ICON_48 = $(top_builddir)/images/48/$(ICON_NAME_PNG) ICON_128 = $(top_builddir)/images/128/$(ICON_NAME_PNG) ICON_256 = $(top_builddir)/images/256/$(ICON_NAME_PNG) WIN_ICON = $(top_srcdir)/images/icon.ico DESKTOP_FILE = smuxi-frontend-gnome.desktop THEME_DIR = $(datadir)/icons/hicolor svgicondir = $(THEME_DIR)/scalable/apps svgicon_DATA = $(ICON_SVG) icon16dir = $(THEME_DIR)/16x16/apps icon16_DATA = $(ICON_16) icon22dir = $(THEME_DIR)/22x22/apps icon22_DATA = $(ICON_22) icon24dir = $(THEME_DIR)/24x24/apps icon24_DATA = $(ICON_24) icon32dir = $(THEME_DIR)/32x32/apps icon32_DATA = $(ICON_32) icon48dir = $(THEME_DIR)/48x48/apps icon48_DATA = $(ICON_48) icon128dir = $(THEME_DIR)/128x128/apps icon128_DATA = $(ICON_128) icon256dir = $(THEME_DIR)/256x256/apps icon256_DATA = \ $(ICON_256) \ $(top_builddir)/images/256/$(GROUP_CHAT_ICON_NAME).png \ $(top_builddir)/images/256/$(PERSON_CHAT_ICON_NAME).png gtk_update_icon_cache = gtk-update-icon-cache -f -t $(THEME_DIR) desktopdir = $(datadir)/applications desktop_in_files = $(DESKTOP_FILE).in desktop_DATA = $(DESKTOP_FILE) build_datafiles = $(DESKTOP_FILE) @INTLTOOL_XML_RULE@ appdatadir = $(datarootdir)/appdata appdata_DATA = $(appdata_in_files:.xml.in=.xml) appdata_in_files = smuxi-frontend-gnome.appdata.xml.in FRONTEND_GNOME_EXE_CONFIG_SOURCE = smuxi-frontend-gnome.exe.config FRONTEND_GNOME_EXE_CONFIG = $(BUILD_DIR)/smuxi-frontend-gnome.exe.config ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = @CSC_FLAGS@ -noconfig -codepage:utf8 -warn:4 -optimize- -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET,CONFIG_NINI,UI_GNOME,GTK_SHARP_2_8" -win32icon:$(WIN_ICON) @FRONTEND_GNOME_COMPILER_FLAGS@ ASSEMBLY = ../../bin/debug/smuxi-frontend-gnome.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-frontend.dll BUILD_DIR = ../../bin/debug LOG4NET_DLL_SOURCE=../../lib/log4net.dll if BUNDLE_LOG4NET LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll SMUXI_FRONTEND_DLL_MDB_SOURCE=../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB=$(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_SOURCE=../../bin/debug/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) \ $(FRONTEND_GNOME_EXE_CONFIG) LINUX_DESKTOPAPPLICATIONS = \ $(FRONTEND_GNOME_DESKTOP_DESKTOP) BINARIES = \ $(FRONTEND_GNOME) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_DESKTOPAPPLICATIONS) $(BINARIES) $(ICON_SVG): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon.svg $@ $(ICON_XPM): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon.xpm $@ $(ICON_16): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_16x16.png $@ $(ICON_22): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_22x22.png $@ $(ICON_24): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_24x24.png $@ $(ICON_32): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_32x32.png $@ $(ICON_48): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_48x48.png $@ $(ICON_128): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_128x128.png $@ $(ICON_256): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_256x256.png $@ $(top_builddir)/images/256/$(GROUP_CHAT_ICON_NAME).png: $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/group-chat_256x256.png $@ $(top_builddir)/images/256/$(PERSON_CHAT_ICON_NAME).png: $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/person-chat_256x256.png $@ FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ AboutDialog.cs \ CrashDialog.cs \ EngineManagerDialog.cs \ Entry.cs \ Frontend.cs \ GnomeUI.cs \ Gtk.WindowExtensions.cs \ IndicateManager.cs \ Main.cs \ MainWindow.cs \ NetworkManager.cs \ NotImplementedMessageDialog.cs \ Notebook.cs \ SplashScreenWindow.cs \ ChatTypeWidget.cs \ ChatViewManager.cs \ ColorConverter.cs \ NotifyManager.cs \ PangoTools.cs \ Preferences/ServerListView.cs \ Views/ChatTreeView.cs \ Views/JoinWidget.cs \ Views/MenuWidget.cs \ Views/MessageTextView.cs \ Views/PreferencesDialog.cs \ Views/ServerWidget.cs \ Views/ServerDialog.cs \ Views/FilterListWidget.cs \ Views/Chats/ChatView.cs \ Views/Chats/GroupChatView.cs \ Views/Chats/PersonChatView.cs \ Views/Chats/ProtocolChatView.cs \ Views/Chats/SessionChatView.cs \ Views/Assistants/Engine/EngineAssistantNameWidget.cs \ Views/Assistants/Engine/EngineAssistantCredentialsWidget.cs \ Views/Assistants/Engine/EngineAssistantConnectionWidget.cs \ Views/Assistants/Engine/EngineAssistantIntroWidget.cs \ Views/Assistants/Engine/EngineAssistant.cs \ Views/Tags/EmojiTag.cs \ Views/Tags/LinkTag.cs \ Views/Tags/PersonTag.cs \ QuickConnectDialog.cs \ SteticPreferencesDialog.cs \ FindGroupChatDialog.cs \ ChatFindDialog.cs \ OpenChatDialog.cs \ ThemeSettings.cs \ StatusIconManager.cs \ gtk-gui/generated.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.ChatTypeWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.FilterListWidget.cs \ osx/AppleEvent.cs \ osx/ApplicationEvents.cs \ osx/Carbon.cs \ osx/CoreFoundation.cs \ osx/IgeMacMenu.cs DATA_FILES = \ $(DESKTOP_FILE) \ $(ICON_SVG) \ $(ICON_XPM) \ $(ICON_16) \ $(ICON_22) \ $(ICON_24) \ $(ICON_32) \ $(ICON_48) \ $(ICON_128) \ $(ICON_256) RESOURCES = \ gtk-gui/gui.stetic \ $(top_builddir)/glade/smuxi-frontend-gnome.glade \ $(top_builddir)/images/icon_256x256.png \ $(top_builddir)/images/group-chat_256x256.png \ $(top_builddir)/images/person-chat_256x256.png \ $(top_builddir)/images/protocol-chat_256x256.png \ $(top_builddir)/images/session-chat_256x256.png \ Interfaces/PreferencesDialog2.ui \ Interfaces/ServerListWidget.ui EXTRAS = \ smuxi-frontend-gnome.in \ $(FRONTEND_GNOME_EXE_CONFIG_SOURCE) REFERENCES = \ System.Runtime.Remoting \ System \ System.Core \ System.Web \ Mono.Posix \ $(GLIB_SHARP_20_LIBS) \ $(GLADE_SHARP_20_LIBS) \ $(GTK_SHARP_20_LIBS) \ $(GIO_SHARP_LIBS) \ $(LOG4NET_REF_LIBS) \ $(INDICATE_SHARP_LIBS) \ $(MESSAGINGMENU_SHARP_LIBS) \ $(MESSAGINGMENU_SHARP_INCLUDED_LIBS) \ $(NOTIFY_SHARP_LIBS) \ $(DBUS_LIBS) DLL_REFERENCES = $(MESSAGINGMENU_SHARP_INCLUDED_LIBS) CLEANFILES = $(LINUX_DESKTOPAPPLICATIONS) $(PROGRAMFILES) $(BINARIES) \ $(top_builddir)/images/256/$(GROUP_CHAT_ICON_NAME).png \ $(top_builddir)/images/256/$(PERSON_CHAT_ICON_NAME).png \ $(appdata_DATA) include $(top_srcdir)/Makefile.include SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_GNOME = $(BUILD_DIR)/smuxi-frontend-gnome FRONTEND_GNOME_DESKTOP = $(BUILD_DIR)/$(DESKTOP_FILE) SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll if WITH_MESSAGINGMENU_SHARP_INCLUDED MESSAGINGMENU_SHARP_DLL = $(TARGET_DIR)/messagingmenu-sharp.dll MESSAGINGMENU_SHARP_DLL_SOURCE = $(top_builddir)/lib/messagingmenu-sharp/messagingmenu-sharp.dll MESSAGINGMENU_SHARP_DLL_CONFIG = $(MESSAGINGMENU_SHARP_DLL).config MESSAGINGMENU_SHARP_DLL_CONFIG_SOURCE = $(MESSAGINGMENU_SHARP_DLL_SOURCE).config $(eval $(call emit-deploy-target,MESSAGINGMENU_SHARP_DLL)) $(eval $(call emit-deploy-target,MESSAGINGMENU_SHARP_DLL_CONFIG)) MESSAGINGMENU_SHARP_INCLUDED_LIBS := $(foreach file, $(MESSAGINGMENU_SHARP_FILES), $(TARGET_DIR)/$(file)) PROGRAMFILES += $(MESSAGINGMENU_SHARP_INCLUDED_LIBS) $(MESSAGINGMENU_SHARP_INCLUDED_LIBS).config GIO_SHARP_DLL = $(TARGET_DIR)/gio-sharp.dll GIO_SHARP_DLL_SOURCE = $(GIO_SHARP_LIBS) GIO_SHARP_DLL_CONFIG = $(TARGET_DIR)/gio-sharp.dll.config GIO_SHARP_DLL_CONFIG_SOURCE = $(GIO_SHARP_LIBS).config $(eval $(call emit-deploy-target,GIO_SHARP_DLL)) $(eval $(call emit-deploy-target,GIO_SHARP_DLL_CONFIG)) GIO_SHARP_PROGRAM_FILES := $(foreach file, $(GIO_SHARP_FILES), $(shell file=$(TARGET_DIR)/$(file); echo $$file; config_file=$${file}.config; if [ -f "$$config_file" ]; then echo $$config_file; fi)) PROGRAMFILES += $(GIO_SHARP_DLL) $(GIO_SHARP_DLL_CONFIG) endif $(eval $(call emit-deploy-wrapper,FRONTEND_GNOME,smuxi-frontend-gnome,x)) $(eval $(call emit-deploy-target,FRONTEND_GNOME_DESKTOP)) $(eval $(call emit-deploy-target,FRONTEND_GNOME_EXE_CONFIG)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) %.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po-Frontend-GNOME/*.po) LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po-Frontend-GNOME/.intltool-merge-cache $(top_srcdir)/po-Frontend-GNOME $< $@ install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi smuxi-1.1/src/Frontend-GNOME/IndicateManager.cs0000644000175000017500000004517212726351313022105 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010-2013 Mirco Bauer // // Full GPL License: // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #if INDICATE_SHARP || MESSAGING_MENU_SHARP using System; using System.IO; using System.Text.RegularExpressions; using System.Collections.Generic; using System.Runtime.InteropServices; #if INDICATE_SHARP using Indicate; #elif MESSAGING_MENU_SHARP using MessagingMenu; #endif #if IPC_DBUS #if DBUS_SHARP using DBus; #else using NDesk.DBus; #endif #endif using Gtk.Extensions; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class IndicateManager : IDisposable { #if LOG4NET private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif const string BusName = "com.canonical.indicator.session"; private static string PersonChatIconBase64 { get; set; } private static string GroupChatIconBase64 { get; set; } #if INDICATE_SHARP Server Server { get; set; } Dictionary Indicators { get; set; } #elif MESSAGING_MENU_SHARP private static DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0); App App { get; set; } Dictionary Sources { get; set; } #endif MainWindow MainWindow { get; set; } ChatViewManager ChatViewManager { get; set; } Dictionary HighlightEventHandlers { get; set; } bool IsInitialized { get; set; } bool IsEnabled { get; set; } string DesktopFile { get; set; } static IndicateManager() { PersonChatIconBase64 = Convert.ToBase64String( PersonChatView.IconPixbuf.SaveToBuffer("png") ); GroupChatIconBase64 = Convert.ToBase64String( GroupChatView.IconPixbuf.SaveToBuffer("png") ); } public IndicateManager(MainWindow mainWindow, ChatViewManager chatViewManager) { Trace.Call(mainWindow, chatViewManager); if (mainWindow == null) { throw new ArgumentNullException("mainWindow"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } MainWindow = mainWindow; ChatViewManager = chatViewManager; #if INDICATE_SHARP Indicators = new Dictionary(); #elif MESSAGING_MENU_SHARP Sources = new Dictionary(); #endif HighlightEventHandlers = new Dictionary (); try { Init(); } catch (Exception ex) { #if LOG4NET Logger.Error("IndicateManager(): initialization failed: ", ex); #endif } } public void Dispose() { Trace.Call(); MainWindow.FocusInEvent -= OnMainWindowFocusInEvent; MainWindow.Notebook.SwitchPage -= OnMainWindowNotebookSwitchPage; ChatViewManager.ChatAdded -= OnChatViewManagerChatAdded; ChatViewManager.ChatRemoved -= OnChatViewManagerChatRemoved; #if INDICATE_SHARP Server.Hide(); #elif MESSAGING_MENU_SHARP App.Unregister(); App.Dispose(); #endif } public void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } if (!IsInitialized) { return; } var home = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var blacklistPath = Path.Combine(home, ".config"); blacklistPath = Path.Combine(blacklistPath, "indicators"); blacklistPath = Path.Combine(blacklistPath, "messages"); blacklistPath = Path.Combine(blacklistPath, "applications-blacklist"); if (!Directory.Exists(blacklistPath)) { Directory.CreateDirectory(blacklistPath); } blacklistPath = Path.Combine(blacklistPath, "smuxi-frontend-gnome"); if ((bool) userConfig["Interface/Notification/MessagingMenuEnabled"]) { // persist in menu if (File.Exists(blacklistPath)) { File.Delete(blacklistPath); } var path = Path.Combine(home, ".config"); path = Path.Combine(path, "indicators"); path = Path.Combine(path, "messages"); path = Path.Combine(path, "applications"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } path = Path.Combine(path, "smuxi-frontend-gnome"); File.WriteAllText(path, DesktopFile + "\n"); #if INDICATE_SHARP Server.Show(); #elif MESSAGING_MENU_SHARP App.Register(); #endif IsEnabled = true; } else { // non-persistent in menu using the blacklist as per // specification: // https://wiki.ubuntu.com/MessagingMenu/#Registration File.WriteAllText(blacklistPath, DesktopFile + "\n"); #if INDICATE_SHARP Server.Hide(); #elif MESSAGING_MENU_SHARP App.Unregister(); #endif IsEnabled = false; } } void OnMainWindowFocusInEvent(object sender, Gtk.FocusInEventArgs e) { if (MainWindow.Notebook.IsBrowseModeEnabled) { return; } var currentChatView = ChatViewManager.CurrentChatView; if (currentChatView == null) { return; } #if INDICATE_SHARP DisposeIndicator(currentChatView); #elif MESSAGING_MENU_SHARP DisposeSource(currentChatView); #endif } void OnMainWindowNotebookSwitchPage(object sender, Gtk.SwitchPageArgs e) { if (MainWindow.Notebook.IsBrowseModeEnabled) { return; } var currentChatView = ChatViewManager.CurrentChatView; if (currentChatView == null) { return; } #if INDICATE_SHARP DisposeIndicator(currentChatView); #elif MESSAGING_MENU_SHARP DisposeSource(currentChatView); #endif } void OnChatViewManagerChatAdded(object sender, ChatViewManagerChatAddedEventArgs e) { // we are only interested in highlights on person and group chats if (!(e.ChatView is PersonChatView) && !(e.ChatView is GroupChatView)) { return; } MessageTextViewMessageHighlightedEventHandler handler = delegate(object o, MessageTextViewMessageHighlightedEventArgs args) { OnChatViewMessageHighlighted(o, args, e.ChatView); }; e.ChatView.OutputMessageTextView.MessageHighlighted += handler; // keep a reference to the handler so we can cleanup it up later // in OnChatViewManagerChatRemoved() HighlightEventHandlers.Add(e.ChatView, handler); } void OnChatViewManagerChatRemoved(object sender, ChatViewManagerChatRemovedEventArgs e) { MessageTextViewMessageHighlightedEventHandler handler; if (!HighlightEventHandlers.TryGetValue(e.ChatView, out handler)) { return; } e.ChatView.OutputMessageTextView.MessageHighlighted -= handler; HighlightEventHandlers.Remove(e.ChatView); // close possibly active indicator #if INDICATE_SHARP DisposeIndicator(e.ChatView); #elif MESSAGING_MENU_SHARP DisposeSource(e.ChatView); #endif } void OnChatViewMessageHighlighted(object sender, MessageTextViewMessageHighlightedEventArgs e, ChatView chatView) { if (!IsEnabled || e.Message.TimeStamp <= chatView.SyncedLastSeenHighlight || MainWindow.HasToplevelFocus) { return; } #if INDICATE_SHARP ShowIndicator(chatView, e.Message); #elif MESSAGING_MENU_SHARP ShowSource(chatView, e.Message); #endif } #if INDICATE_SHARP void Init() { Trace.Call(); #if IPC_DBUS if (!Bus.Session.NameHasOwner(BusName)) { #if LOG4NET Logger.Info("Init(): no DBus provider for messaging menu found, " + "disabling..."); #endif return; } #endif Server = Server.RefDefault(); if (Server == null) { // just in case return; } // all checks return false for some reason /* if (!Server.CheckInterest(Interests.ServerDisplay)) { #if LOG4NET Logger.Info("Init() the indicate server is not interested in " + "us, thus no messaging menu :/"); #endif return; } */ var partialPath = "share"; partialPath = Path.Combine(partialPath, "applications"); partialPath = Path.Combine(partialPath, "smuxi-frontend-gnome.desktop"); var insDesktopFile = Path.Combine(Defines.InstallPrefix, partialPath); var sysDesktopFile = Path.Combine("/usr", partialPath); if (File.Exists(insDesktopFile)) { DesktopFile = insDesktopFile; } else if (File.Exists(sysDesktopFile)) { DesktopFile = sysDesktopFile; } else { #if LOG4NET Logger.Error("Init(): smuxi-frontend-gnome.desktop could not " + " be found, thus no messaging menu :/"); #endif return; } Server.SetType("message.im"); Server.DesktopFile(DesktopFile); Server.ServerDisplay += OnServerServerDisplay; MainWindow.FocusInEvent += OnMainWindowFocusInEvent; MainWindow.Notebook.SwitchPage += OnMainWindowNotebookSwitchPage; ChatViewManager.ChatAdded += OnChatViewManagerChatAdded; ChatViewManager.ChatRemoved += OnChatViewManagerChatRemoved; IsInitialized = true; } void ShowIndicator(ChatView chatView, MessageModel msg) { Indicator indicator; if (Indicators.TryGetValue(chatView, out indicator)) { // update time of existing indicator indicator.SetProperty( "time", msg.TimeStamp.ToLocalTime().ToString("s") ); return; } indicator = new Indicator(); indicator.SetProperty("subtype", "im"); if (chatView is PersonChatView) { indicator.SetProperty("icon", PersonChatIconBase64); indicator.SetProperty("sender", chatView.Name); } if (chatView is GroupChatView) { indicator.SetProperty("icon", GroupChatIconBase64); var nick = GetNick(msg); if (nick == null) { indicator.SetProperty("sender", chatView.Name); } else { indicator.SetProperty("sender", String.Format( "{0} ({1})", chatView.Name, nick ) ); } } indicator.SetProperty( "time", msg.TimeStamp.ToLocalTime().ToString("s") ); indicator.SetPropertyBool("draw-attention", true); indicator.UserDisplay += delegate { try { MainWindow.PresentWithServerTime(); ChatViewManager.CurrentChatView = chatView; DisposeIndicator(chatView); } catch (Exception ex) { #if LOG4NET Logger.Error("OnChatViewMessageHighlighted() " + "indicator.UserDisplay threw exception", ex); #endif } }; try { indicator.Show(); } catch (Exception ex) { #if LOG4NET Logger.Error("OnChatViewMessageHighlighted() " + "indicator.Show() thew exception", ex); #endif } Indicators.Add(chatView, indicator); } void DisposeIndicator(ChatView chatView) { Indicator indicator; if (!Indicators.TryGetValue(chatView, out indicator)) { return; } #if LOG4NET Logger.Debug("DisposeIndicator(): disposing indicator for: " + chatView.Name); #endif try { indicator.Hide(); } catch (Exception ex) { #if LOG4NET Logger.Error("DisposeIndicator(): " + "indicator.Hide() thew exception", ex); #endif } finally { Indicators.Remove(chatView); } } void OnServerServerDisplay(object sender, ServerDisplayArgs e) { Trace.Call(sender, e); MainWindow.PresentWithTime(e.Timestamp); } #elif MESSAGING_MENU_SHARP void Init() { Trace.Call(); #if IPC_DBUS if (!Bus.Session.NameHasOwner(BusName)) { #if LOG4NET Logger.Info("Init(): no DBus provider for messaging menu found, " + "disabling..."); #endif return; } #endif App = new App("smuxi-frontend-gnome.desktop"); App.ActivateSource += OnAppActivateSource; MainWindow.FocusInEvent += OnMainWindowFocusInEvent; MainWindow.Notebook.SwitchPage += OnMainWindowNotebookSwitchPage; ChatViewManager.ChatAdded += OnChatViewManagerChatAdded; ChatViewManager.ChatRemoved += OnChatViewManagerChatRemoved; IsInitialized = true; } void ShowSource(ChatView chatView, MessageModel msg) { Trace.Call(chatView, msg); string sourceId; var time = (Int64) ((msg.TimeStamp - UnixEpoch).TotalMilliseconds * 1000L); if (Sources.TryGetValue(chatView, out sourceId)) { // update time of existing source App.SetSourceTime(sourceId, time); return; } // TODO: TEST ME! sourceId = chatView.ID; string iconName = null; string label = null; if (chatView is PersonChatView) { iconName = "smuxi-person-chat"; label = chatView.Name; } else if (chatView is GroupChatView) { iconName = "smuxi-group-chat"; var nick = GetNick(msg); if (nick == null) { label = chatView.Name; } else { label = String.Format("{0} ({1})", chatView.Name, nick); } } var theme = Gtk.IconTheme.Default; GLib.Icon icon = null; if (Frontend.HasSystemIconTheme && iconName != null && theme.HasIcon(iconName)) { icon = new GLib.ThemedIcon(iconName); } else if (iconName != null && theme.HasIcon(iconName)) { // icon wasn't in the system icon theme var iconInfo = theme.LookupIcon(iconName, 256, Gtk.IconLookupFlags.UseBuiltin); if (!String.IsNullOrEmpty(iconInfo.Filename) && File.Exists(iconInfo.Filename)) { icon = new GLib.FileIcon( GLib.FileFactory.NewForPath(iconInfo.Filename) ); } } App.AppendSource(sourceId, icon, label); App.SetSourceTime(sourceId, time); App.DrawAttention(sourceId); Sources.Add(chatView, sourceId); } void DisposeSource(ChatView chatView) { Trace.Call(chatView); try { string sourceId; if (!Sources.TryGetValue(chatView, out sourceId)) { return; } App.RemoveSource(sourceId); } finally { Sources.Remove(chatView); } } void OnAppActivateSource(object sender, ActivateSourceArgs e) { Trace.Call(sender, e); try { MainWindow.PresentWithServerTime(); ChatView chatView = null; foreach (var kvp in Sources) { if (kvp.Value != e.SourceId) { continue; } chatView = kvp.Key; } if (chatView == null) { return; } ChatViewManager.CurrentChatView = chatView; DisposeSource(chatView); } catch (Exception ex) { #if LOG4NET Logger.Error("OnAppActivateSource(): Exception", ex); #endif } } #endif string GetNick(MessageModel msg) { // HACK: try to obtain the nickname from the message // TODO: extend MessageModel with Origin property var msgText = msg.ToString(); var match = Regex.Match(msgText, "^<([^ ]+)>"); if (match.Success && match.Groups.Count >= 2) { return match.Groups[1].Value; } return null; } } } #endif smuxi-1.1/src/Frontend-GNOME/Notebook.cs0000644000175000017500000002340312726351313020643 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Threading; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class Notebook : Gtk.Notebook { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif //private Gtk.Menu _QueryTabMenu; private TaskQueue f_SwitchPageQueue; private bool f_IsBrowseModeEnabled; public ChatView CurrentChatView { get { return (ChatView) base.CurrentPageWidget; } set { if (value == null) { CurrentPage = 0; return; } CurrentPage = GetPageNumber(value); } } public bool IsBrowseModeEnabled { get { return f_IsBrowseModeEnabled; } set { f_IsBrowseModeEnabled = value; if (value) { #if LOG4NET f_Logger.Debug("set_IsBrowseModeEnabled(): enabling browse mode"); #endif } else { #if LOG4NET f_Logger.Debug("set_IsBrowseModeEnabled(): disabling browse mode"); #endif // HACK: force switch page event to clear activity and // update the markerline var chat = CurrentChatView; CurrentChatView = null; CurrentChatView = chat; } } } public Notebook() : base () { Trace.Call(); f_SwitchPageQueue = new TaskQueue("SwitchPage"); f_SwitchPageQueue.AbortedEvent += OnSwitchPageQueueAbortedEvent; f_SwitchPageQueue.ExceptionEvent += OnSwitchPageQueueExceptionEvent; Scrollable = true; SwitchPage += OnSwitchPage; SwitchPage += OnBeforeSwitchPage; PageReordered += OnPageReordered; } public void ApplyConfig(UserConfig userConfig) { switch ((string) userConfig["Interface/Notebook/TabPosition"]) { case "top": TabPos = Gtk.PositionType.Top; ShowTabs = true; break; case "bottom": TabPos = Gtk.PositionType.Bottom; ShowTabs = true; break; case "left": TabPos = Gtk.PositionType.Left; ShowTabs = true; break; case "right": TabPos = Gtk.PositionType.Right; ShowTabs = true; break; case "none": ShowTabs = false; break; } ShowTabs = false; // TODO: Homogeneous = true; } public ChatView GetChat(ChatModel chat) { for (int i=0; i < NPages; i++) { ChatView chatView = (ChatView) GetNthPage(i); if (chatView.ChatModel == chat) { return chatView; } } return null; } public ChatView GetChat(int pageNumber) { return (ChatView) base.GetNthPage(pageNumber); } public int GetPageNumber(ChatView chatView) { for (int i = 0; i < NPages; i++) { ChatView page = (ChatView) GetNthPage(i); if (page == chatView) { return i; } } return -1; } public void SyncPagePositions() { Trace.Call(); if (Frontend.EngineProtocolVersion >= new Version("0.8.1.2")) { // no need to sync chat positions with 0.8.1.2 as they get // updated via Session.MoveChat() return; } for (int i = 0; i < NPages; i++) { var chatView = (ChatView) GetNthPage(i); chatView.ChatModel.Position = i; } } public void ClearAllActivity() { Trace.Call(); int npages = NPages; for (int i = 0; i < npages; i++) { ChatView chat = GetChat(i); chat.HasActivity = false; chat.HasEvent = false; } } protected virtual void OnSwitchPageQueueExceptionEvent(object sender, TaskQueueExceptionEventArgs e) { Trace.Call(sender, e); #if LOG4NET f_Logger.Error("Exception in TaskQueue: ", e.Exception); f_Logger.Error("Inner-Exception: ", e.Exception.InnerException); #endif Frontend.ShowException(e.Exception); } protected virtual void OnSwitchPageQueueAbortedEvent(object sender, EventArgs e) { Trace.Call(sender, e); #if LOG4NET f_Logger.Fatal("OnSwitchPageQueueAbortedEvent(): task queue aborted!"); #endif } [GLib.ConnectBefore] protected virtual void OnBeforeSwitchPage(object sender, Gtk.SwitchPageArgs e) { if (f_IsBrowseModeEnabled || Frontend.IsDisconnecting) { return; } var chatView = CurrentChatView; chatView.UpdateLastSeenMessage(); } protected virtual void OnSwitchPage(object sender, Gtk.SwitchPageArgs e) { Trace.Call(sender, e); if (f_IsBrowseModeEnabled) { return; } // synchronize FrontManager.CurrenPage ChatView chatView = GetChat((int)e.PageNum); if (chatView == null) { return; } ChatModel chatModel = chatView.ChatModel; // clear activity and highlight chatView.HasHighlight = false; chatView.HasActivity = false; chatView.HasEvent = false; var lastMsg = chatView.OutputMessageTextView.LastMessage; var method = Trace.GetMethodBase(); f_SwitchPageQueue.Queue(delegate { // HACK: don't pass the real parameters are it's unsafe from // a non-main (GUI) thread! Trace.Call(method, null, null); try { DateTime start = DateTime.UtcNow, stop; var fm = Frontend.FrontendManager; if (fm == null) { // in case we are currently reconnecting to a remote engine return; } // OPT-TODO: we could use here a TaskStack instead which // would make sure only the newest task gets executed // instead of every task in the FIFO sequence! var nmanager = chatView.ProtocolManager; // TODO: only set the protocol manager and update network // status if the protocol manager differs from the old one // REMOTING CALL 2 fm.CurrentChat = chatModel; if (nmanager != null) { // REMOTING CALL 3 fm.CurrentProtocolManager = nmanager; } // even when we have no network manager, we still want to update // the network status and title // REMOTING CALL 4 fm.UpdateNetworkStatus(); // update last seen highlight // REMOTING CALL 5 if (lastMsg != null && !Frontend.UseLowBandwidthMode) { chatModel.LastSeenHighlight = lastMsg.TimeStamp; } stop = DateTime.UtcNow; #if LOG4NET f_Logger.Debug("OnSwitchPage(): task took: " + (stop - start).Milliseconds + " ms"); #endif } catch (Exception ex) { #if LOG4NET f_Logger.Error("OnSwitchPage(): Exception", ex); #endif Frontend.ShowException(ex); } }); } protected virtual void OnPageReordered(object sender, Gtk.PageReorderedArgs e) { Trace.Call(sender, e); if (Frontend.EngineProtocolVersion < new Version("0.8.1.2")) { // Session.MoveChat() was added in >= 0.8.1.2 return; } var chatView = (ChatView) e.P0; var newPosition = (int) e.P1; ThreadPool.QueueUserWorkItem(delegate { try { Frontend.Session.MoveChat(chatView.ChatModel, newPosition); } catch (Exception ex) { #if LOG4NET f_Logger.Error("OnPageReordered(): Exception", ex); #endif } }); } } } smuxi-1.1/src/Frontend-GNOME/GnomeUI.cs0000644000175000017500000002603112250426634020367 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2011 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using SysDiag = System.Diagnostics; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.ComponentModel; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Gnome { public class GnomeUI : PermanentRemoteObject, IFrontendUI { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private int _Version = 0; private ChatViewManager _ChatViewManager; public int Version { get { return _Version; } } public GnomeUI(ChatViewManager chatViewManager) { _ChatViewManager = chatViewManager; } public void AddChat(ChatModel chat) { TraceRemotingCall(chat); try { _ChatViewManager.AddChat(chat); } catch (Exception ex) { Frontend.ShowException(ex); } } private void _AddMessageToChat(ChatModel chatModel, MessageModel msg) { ChatView chatView = _ChatViewManager.GetChat(chatModel); if (chatView == null) { #if LOG4NET _Logger.Fatal( String.Format( "_AddMessageToChat(): " + "_ChatViewManager.GetChat(chatModel) " + "chatModel.Name: {0} returned null!", chatModel.Name ) ); #endif return; } #if LOG4NET && MSG_DEBUG DateTime start, stop; start = DateTime.UtcNow; #endif chatView.AddMessage(msg); #if LOG4NET && MSG_DEBUG stop = DateTime.UtcNow; _Logger.Debug( String.Format( "_AddMessageToChat(): chatView.AddMessage() took: {0:0.00} ms", (stop - start).TotalMilliseconds ) ); #endif } public void AddMessageToChat(ChatModel epage, MessageModel fmsg) { TraceRemotingCall(epage, fmsg); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, epage, fmsg); try { _AddMessageToChat(epage, fmsg); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void RemoveChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, chat); try { _ChatViewManager.RemoveChat(chat); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void EnableChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, chat); try { _ChatViewManager.EnableChat(chat); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void DisableChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, chat); try { _ChatViewManager.DisableChat(chat); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void SyncChat(ChatModel chatModel) { TraceRemotingCall(chatModel); try { _ChatViewManager.SyncChat(chatModel); } catch (Exception ex) { Frontend.ShowException(ex); } } public void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person) { TraceRemotingCall(groupChat, person); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, groupChat, person); try { GroupChatView groupChatView = (GroupChatView) _ChatViewManager.GetChat(groupChat); if (groupChatView == null) { #if LOG4NET _Logger.Fatal( String.Format( "AddPersonToGroupChat(): " + "_ChatViewManager.GetChat(groupChat) " + "groupChat.Name: {0} returned null!", groupChat.Name ) ); #endif return; } groupChatView.AddPerson(person); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { TraceRemotingCall(groupChat, oldPerson, newPerson); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, groupChat, oldPerson, newPerson); try { GroupChatView groupChatView = (GroupChatView) _ChatViewManager.GetChat(groupChat); if (groupChatView == null) { #if LOG4NET _Logger.Fatal( String.Format( "UpdatePersonInGroupChat(): " + "_ChatViewManager.GetChat(groupChat) " + "groupChat.Name: {0} returned null!", groupChat.Name ) ); #endif return; } groupChatView.UpdatePerson(oldPerson, newPerson); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void UpdateTopicInGroupChat(GroupChatModel groupChat, MessageModel topic) { TraceRemotingCall(groupChat, topic); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, groupChat, topic); try { GroupChatView groupChatView = (GroupChatView)Frontend.MainWindow.Notebook.GetChat(groupChat); if (groupChatView == null) { #if LOG4NET _Logger.Fatal( String.Format( "UpdateTopicInGroupChat(): " + "_ChatViewManager.GetChat(groupChat) " + "groupChat.Name: {0} returned null!", groupChat.Name ) ); #endif return; } groupChatView.Topic = topic; } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person) { TraceRemotingCall(groupChat, person); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, groupChat, person); try { GroupChatView groupChatView = (GroupChatView) _ChatViewManager.GetChat(groupChat); if (groupChatView == null) { #if LOG4NET _Logger.Fatal( String.Format( "RemovePersonFromGroupChat(): " + "_ChatViewManager.GetChat(groupChat) " + "groupChat.Name: {0} returned null!", groupChat.Name ) ); #endif return; } groupChatView.RemovePerson(person); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void SetNetworkStatus(string status) { TraceRemotingCall(status); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, status); try { Frontend.MainWindow.NetworkStatus = status; Frontend.MainWindow.UpdateTitle(null, status); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public void SetStatus(string status) { TraceRemotingCall(status); MethodBase mb = Trace.GetMethodBase(); Gtk.Application.Invoke(delegate { TraceRemotingCall(mb, status); try { Frontend.MainWindow.Status = status; } catch (Exception ex) { Frontend.ShowException(ex); } }); } [SysDiag.Conditional("REMOTING_TRACE")] protected static void TraceRemotingCall(MethodBase mb, params object[] parameters) { Trace.Call(mb, parameters); } [SysDiag.Conditional("REMOTING_TRACE")] protected static void TraceRemotingCall(params object[] parameters) { TraceRemotingCall(Trace.GetMethodBase(), parameters); } } } smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in0000644000175000017500000000056712726351313024627 0ustar00meebeymeebey00000000000000[Desktop Entry] Version=1.0 _Name=Smuxi _GenericName=IRC Chat _X-GNOME-FullName=Smuxi IRC Client _Comment=Chat with other people on IRC _Keywords=chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr; Exec=smuxi-frontend-gnome Terminal=false Type=Application Categories=Network;GNOME;GTK;Chat;InstantMessaging;IRCClient; Icon=smuxi-frontend-gnome smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in0000664000175000017500000000276414011467170025370 0ustar00meebeymeebey00000000000000 smuxi-frontend-gnome.desktop CC0-1.0 GPL-2.0+ <_name>Smuxi <_summary>Chat with other people on IRC, Twitter, Jabber and Campfire <_p> Smuxi is an open-source, distributed and user-friendly chat client for IRC, Twitter, Jabber/XMPP, Campfire and SignalR's JabbR. <_p> Inspired by the combination of screen and irssi, Smuxi has a detachable server (or like a "normal" client) that stays connected when you aren't, and can allow multiple Smuxi frontends to be connected and in sync. This is similar to screen+irssi or IRC bouncers, but more elegant and powerful. https://smuxi.im/screenshots/appdata/main-window.png <_caption>The main window showing an IRC channel https://smuxi.im/ https://smuxi.im/documentation/ https://smuxi.im/contribute/#translate https://smuxi.im/contribute/#providefeedback https://smuxi.im/faq/ mmmbauer@gnome.org Mirco Bauer smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.exe.config0000644000175000017500000000154012726351313024566 0ustar00meebeymeebey00000000000000
smuxi-1.1/src/Frontend-GNOME/ColorConverter.cs0000644000175000017500000000522011700531605022021 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Globalization; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public static class ColorConverter { public static string GetHexCode(Gdk.Color color) { /* // this approach is changing the color instead of converting it, as byte wraps string hexcode = String.Format("{0}{1}{2}", ((byte) color.Red).ToString("X2"), ((byte) color.Green).ToString("X2"), ((byte) color.Blue).ToString("X2")); */ string hexcode = String.Format("#{0}{1}{2}", (color.Red >> 8).ToString("X2"), (color.Green >> 8).ToString("X2"), (color.Blue >> 8).ToString("X2")); return hexcode; } public static Gdk.Color GetGdkColor(string hexCode) { if (hexCode == null) { throw new ArgumentNullException("hexCode"); } var color = TextColor.Parse(hexCode); return new Gdk.Color(color.Red, color.Green, color.Blue); } public static TextColor GetTextColor(Gdk.Color color) { string hexcode = GetHexCode(color); // remove leading "#" character hexcode = hexcode.Substring(1); int value = Int32.Parse(hexcode, NumberStyles.HexNumber); return new TextColor(value); } public static Gdk.Color GetGdkColor(TextColor textColor) { if (textColor == null) { throw new ArgumentNullException("textColor"); } return GetGdkColor(textColor.HexCode); } } } smuxi-1.1/src/Frontend-GNOME/PangoTools.cs0000644000175000017500000001247512250426606021157 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 David Paleino // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using System.Text; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class PangoTools { public static string ToMarkup(MessageModel msg) { return ToMarkup(msg, null); } public static string ToMarkup(MessageModel msg, Gdk.Color? bgColor) { if (msg == null) { return String.Empty; } /* Pango Markup doesn't support hyperlinks: * (smuxi-frontend-gnome:9824): Gtk-WARNING **: Failed to set * text from markup due to error parsing markup: Unknown tag * 'a' on line 1 char 59 * * For this reason, for UrlMessagePartModels, we'll render them as * plaintext. * * Here we loop over the MessageModel to build up a proper Pango * Markup. * * The colour codes/values have been taken from BuildTagTable(), in * MessageTextView.cs. * * Documentation for Pango Markup is located at: * http://library.gnome.org/devel/pango/unstable/PangoMarkupFormat.html */ StringBuilder markup = new StringBuilder (); foreach (MessagePartModel msgPart in msg.MessageParts) { if (msgPart is UrlMessagePartModel) { UrlMessagePartModel url = (UrlMessagePartModel) msgPart; string str = GLib.Markup.EscapeText(url.Url); Gdk.Color gdkColor = Gdk.Color.Zero; Gdk.Color.Parse("darkblue", ref gdkColor); TextColor urlColor = ColorConverter.GetTextColor(gdkColor); if (bgColor != null) { // we have a bg color so lets try to get a url color // with a good contrast urlColor = TextColorTools.GetBestTextColor( urlColor, ColorConverter.GetTextColor(bgColor.Value) ); } str = String.Format("{1}", urlColor.HexCode, str); markup.Append(str); } else if (msgPart is TextMessagePartModel) { TextMessagePartModel text = (TextMessagePartModel) msgPart; List tags = new List(); string str = GLib.Markup.EscapeText(text.Text); if (text.ForegroundColor != TextColor.None) { TextColor fgColor; if (bgColor == null) { fgColor = text.ForegroundColor; } else { var bgTextColor = ColorConverter.GetTextColor( bgColor.Value ); fgColor = TextColorTools.GetBestTextColor( text.ForegroundColor, bgTextColor ); } tags.Add(String.Format("span color='#{0}'", fgColor.HexCode)); } if (text.Underline) { tags.Add("u"); } if (text.Bold) { tags.Add("b"); } if (text.Italic) { tags.Add("i"); } if (tags.Count > 0) { tags.Reverse(); foreach (string tag in tags) { string endTag; if (tag.Contains(" ")) { // tag contains attributes, only get tag name endTag = tag.Split(' ')[0]; } else { endTag = tag; } str = String.Format("<{0}>{1}", tag, str, endTag); } } markup.Append(str); } } return markup.ToString(); } } } smuxi-1.1/src/Frontend-GNOME/Entry.cs0000664000175000017500000007601214011467170020170 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2015, 2017 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using Mono.Unix; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public class Entry : Gtk.TextView { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private StringCollection _History = new StringCollection(); private int _HistoryPosition; private bool _HistoryChangedLine; private CommandManager _CommandManager; private new EntrySettings Settings { get; set; } private NickCompleter NickCompleter { get; set; } ChatViewManager ChatViewManager { get; set; } event EventHandler Activated; /* public StringCollection History { get { return _History; } } */ /* public int HistoryPosition { get { return _HistoryPosition; } set { _HistoryPosition = value; } } */ /* public bool HistoryChangedLine { get { return _HistoryChangedLine; } set { _HistoryChangedLine = value; } } */ public string Text { get { return Buffer.Text; } set { Buffer.Text = value; } } public int Position { get { return Buffer.CursorPosition; } set { Gtk.TextIter position; if (value < 0) { position = Buffer.EndIter; } else { position = Buffer.GetIterAtOffset(value); } Buffer.PlaceCursor(position); } } public Entry(ChatViewManager chatViewManager) { Trace.Call(chatViewManager); if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } _History.Add(String.Empty); ChatViewManager = chatViewManager; Settings = new EntrySettings(); WrapMode = Gtk.WrapMode.WordChar; InitSpellCheck(); InitCommandManager(); Frontend.SessionPropertyChanged += delegate { InitCommandManager(); }; Activated += _OnActivated; KeyPressEvent += new Gtk.KeyPressEventHandler(_OnKeyPress); PasteClipboard += _OnClipboardPasted; } public void UpdateHistoryChangedLine() { if ((_History.Count > 0) && (Text.Length > 0) && (Text != HistoryCurrent())) { // the entry changed and the entry is not empty _HistoryChangedLine = true; #if LOG4NET //_Logger.Debug("_HistoryChangedLine = true"); #endif } else { _HistoryChangedLine = false; #if LOG4NET //_Logger.Debug("_HistoryChangedLine = false"); #endif } } public void AddToHistory(string data, int positiondiff) { /* // BUG: this code doesnt work well // _History.Count-1 is the last entry, which should be always empty if ((_History.Count > 1) && (data == _History[_History.Count-2])) { // don't add the same value return; } */ _History.Insert(_History.Count-1, data); #if LOG4NET _Logger.Debug("added: '"+data+"' to history"); #endif if (_History.Count > Settings.CommandHistorySize) { _History.RemoveAt(0); } else { _HistoryPosition += positiondiff; } } public string HistoryCurrent() { return _History[_HistoryPosition]; } public void HistoryPrevious() { if (_HistoryChangedLine) { #if LOG4NET _Logger.Debug("entry changed, adding to history"); #endif AddToHistory(Text, 0); _HistoryChangedLine = false; } if (_HistoryPosition > 0) { #if LOG4NET _Logger.Debug("showing previous item"); #endif _HistoryPosition--; Text = HistoryCurrent(); Position = -1; } } public void HistoryNext() { if (_HistoryChangedLine) { #if LOG4NET _Logger.Debug("entry changed, adding to history"); #endif AddToHistory(Text, 0); _HistoryChangedLine = false; } if (_HistoryPosition < _History.Count-1) { #if LOG4NET _Logger.Debug("showing next item"); #endif _HistoryPosition++; Text = HistoryCurrent(); Position = -1; } else if (Text.Length > 0) { #if LOG4NET _Logger.Debug("not empty line, lets add one"); #endif // last position and we went further down _History.Add(String.Empty); _HistoryPosition++; Text = String.Empty; } } [GLib.ConnectBefore] private void _OnKeyPress(object sender, Gtk.KeyPressEventArgs e) { // too much logging noise //Trace.Call(sender, e); #if LOG4NET // too much logging noise /* _Logger.Debug("_OnKeyPress(): Key: " + e.Event.Key.ToString() + " KeyValue: " + e.Event.KeyValue); */ #endif try { ProcessKey(e); } catch (Exception ex) { Frontend.ShowException(ex); } } protected virtual void ProcessKey(Gtk.KeyPressEventArgs e) { if (Frontend.IsWindows && String.IsNullOrEmpty(Text)) { // HACK: workaround rendering issue on Windows where the text // cursor and first typed character are not showing up until // a 2nd character is typed, see #810 QueueDraw(); } if (ChatViewManager.CurrentChatView == null) { // we are during a sync, so don't process keys yet return; } int keynumber = (int)e.Event.KeyValue; Gdk.Key key = e.Event.Key; if ((e.Event.State & Gdk.ModifierType.ControlMask) != 0 || (Frontend.IsMacOSX && (e.Event.State & Gdk.ModifierType.MetaMask) != 0)) { // ctrl / cmd is pressed e.RetVal = true; switch (key) { case Gdk.Key.x: case Gdk.Key.X: if (ChatViewManager.CurrentChatView is SessionChatView) { ThreadPool.QueueUserWorkItem(delegate { try { // REMOTING CALL Frontend.FrontendManager.NextProtocolManager(); } catch (Exception ex) { Frontend.ShowException(ex); } }); } else { // don't break cut e.RetVal = false; } break; case Gdk.Key.p: case Gdk.Key.P: ChatViewManager.CurrentChatNumber--; break; case Gdk.Key.n: case Gdk.Key.N: ChatViewManager.CurrentChatNumber++; break; case Gdk.Key.Tab: case Gdk.Key.ISO_Left_Tab: if ((e.Event.State & Gdk.ModifierType.ShiftMask) != 0) { ChatViewManager.CurrentChatNumber--; } else { ChatViewManager.CurrentChatNumber++; } break; case Gdk.Key.c: case Gdk.Key.C: case Gdk.Key.Insert: // only use copy if something is selected in the entry if (Buffer.HasSelection) { e.RetVal = false; break; } // copy selection from main chat window var buf = ChatViewManager.CurrentChatView.OutputMessageTextView.Buffer; buf.CopyClipboard(Gtk.Clipboard.Get(Gdk.Selection.Clipboard)); break; // don't break unicode input case Gdk.Key.U: // don't break paste case Gdk.Key.v: case Gdk.Key.V: // don't break select all case Gdk.Key.a: case Gdk.Key.A: // don't break jump one word left/right case Gdk.Key.Right: case Gdk.Key.Left: // don't break delete last word case Gdk.Key.BackSpace: e.RetVal = false; break; case Gdk.Key.Home: ChatViewManager.CurrentChatView.ScrollToStart(); break; case Gdk.Key.End: ChatViewManager.CurrentChatView.ScrollToEnd(); break; // anything else we let GTK+ handle default: e.RetVal = false; break; } } int pagenumber = -1; if ((e.Event.State & Gdk.ModifierType.Mod1Mask) != 0) { // alt is pressed switch (keynumber) { case 49: // 1 case 50: // 2 case 51: // 3 case 52: // 4 case 53: // 5 case 54: // 6 case 55: // 7 case 56: // 8 case 57: // 9 pagenumber = keynumber - 49; break; case 48: // 0 pagenumber = 9; break; case 113: // q pagenumber = 10; break; case 119: // w pagenumber = 11; break; case 101: // e pagenumber = 12; break; case 114: // r pagenumber = 13; break; case 116: // t pagenumber = 14; break; case 121: // y pagenumber = 15; break; case 117: // u pagenumber = 16; break; case 105: // i pagenumber = 17; break; case 111: // o pagenumber = 18; break; case 112: // p pagenumber = 19; break; } switch (key) { case Gdk.Key.h: case Gdk.Key.H: if (Frontend.IsMacOSX) { Frontend.MainWindow.Iconify(); e.RetVal = true; } break; case Gdk.Key.braceleft: case Gdk.Key.Up: if (Frontend.IsMacOSX) { ChatViewManager.CurrentChatNumber--; e.RetVal = true; } break; case Gdk.Key.braceright: case Gdk.Key.Down: if (Frontend.IsMacOSX) { ChatViewManager.CurrentChatNumber++; e.RetVal = true; } break; } if (pagenumber != -1) { ChatViewManager.CurrentChatNumber = pagenumber; } } if ((e.Event.State & Gdk.ModifierType.Mod1Mask) != 0 || (e.Event.State & Gdk.ModifierType.ControlMask) != 0 || (e.Event.State & Gdk.ModifierType.ShiftMask) != 0) { // alt, ctrl or shift pushed, returning return; } UpdateHistoryChangedLine(); switch (key) { case Gdk.Key.Tab: // don't let GTK handle the focus, as we will do it e.RetVal = true; if (Frontend.MainWindow.CaretMode) { // when we are in caret-mode change focus to output textview ChatViewManager.CurrentChatView.HasFocus = true; } else { if (Text.Length > 0) { _NickCompletion(); } } break; case Gdk.Key.Up: // supress widget navigation/jumping (like tab) e.RetVal = true; HistoryPrevious(); break; case Gdk.Key.Down: // supress widget navigation/jumping (like tab) e.RetVal = true; HistoryNext(); break; case Gdk.Key.Page_Up: // supress scrolling ChatViewManager.CurrentChatView.ScrollUp(); e.RetVal = true; break; case Gdk.Key.Page_Down: // supress scrolling ChatViewManager.CurrentChatView.ScrollDown(); e.RetVal = true; break; case Gdk.Key.Return: case Gdk.Key.KP_Enter: case Gdk.Key.ISO_Enter: case Gdk.Key.Key_3270_Enter: // supress adding a newline e.RetVal = true; if (Activated != null) { Activated(this, EventArgs.Empty); } break; } } private void _OnActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { if (!(Text.Length > 0)) { return; } if (ChatViewManager.CurrentChatView == null) { return; } if (Text.IndexOf("\n") != -1) { var text = Text.TrimEnd('\n'); // seems to be a paste, so let's break it apart string[] msgParts = text.Split(new char[] {'\n'}); if (msgParts.Length > 3) { string msg = String.Format(_("You are going to paste {0} lines. Do you want to continue?"), msgParts.Length); Gtk.MessageDialog md = new Gtk.MessageDialog( Frontend.MainWindow, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, msg); Gtk.ResponseType res = (Gtk.ResponseType)md.Run(); md.Destroy(); if (res != Gtk.ResponseType.Yes) { Text = String.Empty; return; } } if (Frontend.EngineProtocolVersion < new Version(0,8,11)) { foreach (string msg in msgParts) { ExecuteCommand(msg); } } else { // new engines know how to handle messages containing \n ExecuteCommand(text); } } else { ExecuteCommand(Text); AddToHistory(Text, _History.Count - _HistoryPosition); // reset history position to last entry _HistoryPosition = _History.Count - 1; } Text = String.Empty; } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif Frontend.ShowException(null, ex); } } private void _OnClipboardPasted(object sender, EventArgs e) { Trace.Call(sender, e); } public void ExecuteCommand(string cmd) { if (!(cmd.Length > 0)) { return; } CommandModel cd = new CommandModel( Frontend.FrontendManager, ChatViewManager.CurrentChatView.ChatModel, Settings.CommandCharacter, cmd ); if (_Command(cd)) { return; } _CommandManager.Execute(cd); } private bool _Command(CommandModel cd) { bool handled = false; // command that work even without beeing connected if (cd.IsCommand) { switch (cd.Command) { case "help": _CommandHelp(cd); break; case "detach": _CommandDetach(cd); handled = true; break; case "window": _CommandWindow(cd); handled = true; break; case "clear": _CommandClear(cd); handled = true; break; case "list": _CommandList(cd); handled = true; break; case "sync": _CommandSync(cd); handled = true; break; case "sort": CommandSort(cd); handled = true; break; case "gc": GC.Collect(); handled = true; break; case "generate_messages": CommandGenerateMessages(cd); handled = true; break; } } return handled; } private void _CommandHelp(CommandModel cd) { var chatView = ChatViewManager.GetChat(cd.Chat); var builder = new MessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of commands below builder.AppendHeader(_("Frontend Commands")); chatView.AddMessage(builder.ToMessage()); string[] help = { "window (number|channelname|queryname|close)", "sync", "sort", "clear", "echo data", "exec command", "detach", "list [search key]", }; foreach (string line in help) { builder = new MessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); chatView.AddMessage(builder.ToMessage()); } } private void _CommandList(CommandModel cd) { Frontend.OpenFindGroupChatWindow(cd.Parameter); } private void _CommandDetach(CommandModel cd) { Frontend.Quit(); } private void _CommandWindow(CommandModel cd) { if (cd.DataArray.Length >= 2) { var currentChat = ChatViewManager.CurrentChatView; if (cd.Parameter.ToLower() == "close") { currentChat.Close(); } else { try { int number = Int32.Parse(cd.DataArray[1]); if (number > ChatViewManager.Chats.Count) { return; } ChatViewManager.CurrentChatNumber = number - 1; return; } catch (FormatException) { } // seems to be query- or channelname // let's see if we find something var seachKey = cd.Parameter.ToLower(); var candidates = new List(); foreach (var chatView in ChatViewManager.Chats) { if (chatView.Name.ToLower() != seachKey) { continue; } if (chatView == currentChat) { // we don't want to switch to ourselves continue; } // name matches // let's see if there is an exact match, if so, take it if ((chatView.GetType() == currentChat.GetType()) && (chatView.ProtocolManager == currentChat.ProtocolManager)) { candidates.Add(chatView); break; } else { // there was no exact match candidates.Add(chatView); } } if (candidates.Count == 0) { return; } ChatViewManager.CurrentChatView = candidates[0]; } } } private void _CommandSync(CommandModel cmd) { if (Frontend.IsLocalEngine) { return; } var chatView = ChatViewManager.CurrentChatView; ThreadPool.QueueUserWorkItem(delegate { try { var oldValue = Frontend.UseLowBandwidthMode; // HACK: force a full sync Frontend.UseLowBandwidthMode = false; chatView.Sync(); Frontend.UseLowBandwidthMode = oldValue; Gtk.Application.Invoke(delegate { Frontend.UseLowBandwidthMode = false; chatView.Populate(); Frontend.UseLowBandwidthMode = oldValue; chatView.ScrollToEnd(); }); } catch (Exception ex) { Frontend.ShowError(null, ex); } }); } void CommandSort(CommandModel cmd) { var chats = new List(ChatViewManager.Chats); // as the sorting does 2 remoting calls, we use a background thread ThreadPool.QueueUserWorkItem(delegate { try { chats.Sort((x, y) => { if (x.ProtocolManager != null && y.ProtocolManager != null && x.ProtocolManager != y.ProtocolManager) { // REMOTING CALL 1 var xprot = x.ProtocolManager.Protocol; // REMOTING CALL 2 var yprot = y.ProtocolManager.Protocol; var prot = xprot.CompareTo(yprot); if (prot != 0) { return prot; } // theirs protocols are equal, so their network decide // REMOTING CALL 3 var xnet = x.ProtocolManager.NetworkID; // REMOTING CALL 4 var ynet = y.ProtocolManager.NetworkID; var net = xnet.CompareTo(ynet); if (net != 0) { return net; } } // their networks are equal, so their type decide var type = GetChatSortValue(y).CompareTo(GetChatSortValue(x)); if (type != 0) { return type; } // their types are equal, so their name decides return x.ID.CompareTo(y.ID); }); Gtk.Application.Invoke(delegate { for (int i = 0; i < chats.Count; i++) { Frontend.MainWindow.Notebook.ReorderChild(chats[i], i); } }); } catch (Exception ex) { #if LOG4NET _Logger.Error("CommandSort(): Exception", ex); #endif } }); } int GetChatSortValue(ChatView chat) { int status = 0; if (chat is SessionChatView) { status += 100; } if (chat is ProtocolChatView) { status += 50; } if (chat is GroupChatView) { status += 10; } return status; } private void _CommandClear(CommandModel cd) { ChatViewManager.CurrentChatView.Clear(); } void CommandGenerateMessages(CommandModel cmd) { var chat = ChatViewManager.CurrentChatView; _CommandManager.CommandGenerateMessages(cmd, chat); var builder = new MessageBuilder(); builder.AppendText( "ChatView.AddMessage(): MessageTextTagTable.Size: {0}", chat.OutputMessageTextView.MessageTextTagTable.Size ); chat.AddMessage(builder.ToMessage()); } private void _NickCompletion() { // perform completion string text = Text; int position = Position; NickCompleter.Complete(ref text, ref position, ChatViewManager.CurrentChatView); Text = text; Position = position; } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } var theme = new ThemeSettings(config); if (theme.BackgroundColor == null) { ModifyBase(Gtk.StateType.Normal); } else { ModifyBase(Gtk.StateType.Normal, theme.BackgroundColor.Value); } if (theme.ForegroundColor == null) { ModifyText(Gtk.StateType.Normal); } else { ModifyText(Gtk.StateType.Normal, theme.ForegroundColor.Value); } ModifyFont(theme.FontDescription); Settings.ApplyConfig(config); // replace nick completer if needed if (Settings.BashStyleCompletion && !(NickCompleter is LongestPrefixNickCompleter)) { NickCompleter = new LongestPrefixNickCompleter(); } else if (!Settings.BashStyleCompletion && !(NickCompleter is TabCycleNickCompleter)) { NickCompleter = new TabCycleNickCompleter(); } // set the completion character NickCompleter.CompletionChar = Settings.CompletionCharacter; } private void InitCommandManager() { if (_CommandManager != null) { _CommandManager.Dispose(); } if (Frontend.Session == null) { _CommandManager = null; } else { _CommandManager = new CommandManager(Frontend.Session); _CommandManager.EngineProtocolVersion = Frontend.EngineProtocolVersion; _CommandManager.ExceptionEvent += delegate(object sender, CommandExceptionEventArgs e) { Gtk.Application.Invoke(delegate { Frontend.ShowException(e.Exception); }); }; } } private void InitSpellCheck() { #if GTKSPELL try { gtkspell_new_attach(Handle, null, IntPtr.Zero); } catch (Exception ex) { _Logger.Error("InitSpellCheck(): gtkspell_new_attach() "+ "threw exception", ex); } #endif } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } #if GTKSPELL [DllImport("gtkspell.dll", CallingConvention = CallingConvention.Cdecl)] static extern IntPtr gtkspell_new_attach(IntPtr text_view, string locale, IntPtr error); [DllImport("gtkspell.dll", CallingConvention = CallingConvention.Cdecl)] static extern void gtkspell_detach(IntPtr obj); #endif } } smuxi-1.1/src/Frontend-GNOME/AboutDialog.cs0000664000175000017500000000744114011472672021264 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2006-2012 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Linq; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public class AboutDialog : Gtk.AboutDialog { public AboutDialog(Gtk.Window parent) { if (parent == null) { throw new ArgumentNullException("parent"); } TransientFor = parent; ProgramName = Frontend.Name; var version = Frontend.Version.ToString(); var distVersion = Defines.DistVersion; if (!String.IsNullOrEmpty(distVersion)) { Version = String.Format("\n Vendor: {0}", distVersion); } Version += "\n Frontend: " + Frontend.UIName + " " + version + "\n Engine: " + Frontend.EngineAssemblyVersion; if (!Frontend.IsLocalEngine) { Version += "\n Protocol: " + Frontend.EngineProtocolVersion; } Copyright = "Copyright © 2005-2021 Mirco Bauer and other contributors"; Authors = new string[] { "Mirco Bauer ", "David Paleino ", "Clément Bourgeois ", "Chris Le Sueur ", "Tuukka Hastrup ", "Bianca Mix ", "Oliver Schneider ", "Carlos Martín Nieto ", "Andres G. Aragoneses ", "Ondřej Hošek " }; Artists = new string[] { "Jakub Steiner ", "Rodney Dawes ", "Lapo Calamandrei ", "Ahmed Abdellah ", "George Karavasilev ", "Joern Konopka ", "Nuno F. Pinheiro " }; TranslatorCredits = _("translator-credits"); Logo = Frontend.LoadIcon( Frontend.IconName, 256, "icon_256x256.png" ); // HACK: shows "not implemented" error on OS X and // "No application is registered as handling this file" on Windows. // This probably relies on gvfs or similar which isn't available in // the GTK{+,#} ports/installers for OS X and Windows. Thus we only // show the website URL as label instead. if (Frontend.IsMacOSX || Frontend.IsWindows) { WebsiteLabel = "https://smuxi.im/"; } else { Website = "https://smuxi.im/"; WebsiteLabel = _("Smuxi Website"); } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Interfaces/0000775000175000017500000000000014011526501020607 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/Interfaces/ServerListWidget.ui0000664000175000017500000001056414011467170024430 0ustar00meebeymeebey00000000000000 True False True False True automatic automatic etched-in True True True 0 True False icons False True False True Add Server Add Server True gtk-add False True True False True Remove Server Remove Server True gtk-remove False True True False Edit Server Edit Server True gtk-edit False True False True 1 True True 0 smuxi-1.1/src/Frontend-GNOME/Interfaces/PreferencesDialog2.ui0000664000175000017500000030636214011467170024631 0ustar00meebeymeebey00000000000000 50 9999 500 10 100 1000 100 10 100 True False gtk-help 65535 1 10 False 5 Smuxi - Preferences dialog False vertical 2 False end gtk-close True True True True False True 0 False True end 0 True False vertical 6 True False True False center Connection True True True False True 0 Interface True True True False True 1 Servers True True True False True 2 Filters True True True False True 3 Logging True True True False True 4 True True 0 True False icons False True False Internal Settings True Internal Settings True view-more-symbolic False True False True end 1 False True 0 True True True False 6 9 2 6 6 True False 1 Nickname: GTK_FILL GTK_FILL True True True The nickname to use. You can specify extra nicknames (separated by spaces) which will be used as fallbacks when the first choice is not available. By default $nick_ and $nick__ will be used as fallbacks. True False False True True 1 GTK_FILL GTK_FILL True False 1 Real name: 1 GTK_FILL GTK_FILL True True True False False True True 1 1 GTK_FILL GTK_FILL True False 1 Type: 3 GTK_FILL GTK_FILL True False on 1 3 GTK_FILL GTK_FILL True False 1 Host: 4 GTK_FILL GTK_FILL True True True False False True True 1 4 GTK_FILL GTK_FILL True False 1 Port: 5 GTK_FILL GTK_FILL True True 5 True False False True True ProxyPortAdjustment 1 5 GTK_FILL GTK_FILL True False 1 Username: 6 GTK_FILL GTK_FILL True True True False False True True 1 6 GTK_FILL GTK_FILL True False 1 Password: 7 GTK_FILL GTK_FILL True True False True False False True True 1 7 GTK_FILL GTK_FILL Show Password True True False 0 True 1 8 GTK_FILL GTK_FILL True False 6 True False <b>Network Proxy</b> True False True 0 True True False True False True 1 2 2 GTK_FILL GTK_FILL True False 1 2 2 3 GTK_FILL GTK_FILL True False 8 9 GTK_FILL GTK_FILL True False Connection False True True 6 True False 6 4 2 6 6 Show colors True True False 0 True True 2 2 GTK_FILL GTK_FILL Show formattings True True False 0 True True 2 3 GTK_FILL GTK_FILL True False 1 Timestamp format: GTK_FILL GTK_FILL True False 1 Lines in scrollback: 1 GTK_FILL GTK_FILL True True True False False True True BufferLinesAdjustment 1 True 1 1 GTK_FILL GTK_FILL True False True True True ss = seconds mm = minutes hh = hours (01 - 12) HH = hours (00 - 23) tt = AM/PM dd = day MM = month yy/yyyy = year HH:mm True False False True True False True 0 True True True HelpImage right False True 1 1 GTK_FILL GTK_FILL True False Messages False True False 6 8 2 6 6 True False 0 <b>Behavior</b> True 2 5 6 GTK_FILL True False 1 No activity: 1 2 GTK_FILL Automatically switch to newly opened person chats True True False 0 True 2 6 7 GTK_FILL GTK_FILL Automatically switch to newly opened group chats True True False 0 True True 2 7 8 GTK_FILL GTK_FILL True False True True True #000000000000 False True 0 True False True True 1 1 2 1 2 GTK_FILL GTK_FILL True False True True True #000000000000 False True 0 True False True True 1 1 2 2 3 GTK_FILL GTK_FILL True False True True True #000000000000 False True 0 True False True True 1 1 2 3 4 GTK_FILL GTK_FILL True False True True True #000000000000 False True 0 True False True True 1 1 2 4 5 GTK_FILL GTK_FILL True False 1 Activity: 2 3 GTK_FILL True False 1 Join/Part/Mode: 3 4 GTK_FILL True False 1 Highlight: 4 5 GTK_FILL True False 0 <b>Colors</b> True GTK_FILL GTK_FILL True False 1 2 GTK_FILL 1 True False Chats 1 False True False 5 4 2 5 5 True True True True False False True True CommandHistorySizeAdjustment 1 True 1 2 2 3 GTK_FILL GTK_FILL 30 True True 1 / True False False True True 1 2 1 2 GTK_FILL GTK_FILL 30 True True 1 : True False False True True 1 2 GTK_FILL GTK_FILL True False 1 Completion character: GTK_FILL GTK_FILL True False 1 Command character: 1 2 GTK_FILL GTK_FILL True False 1 Command history size: 2 3 GTK_FILL GTK_FILL True False 1 Bash-style nick completion: 3 4 GTK_FILL GTK_FILL True True False True 1 2 3 4 GTK_FILL GTK_FILL 2 True False Input 2 False True False 6 8 4 6 6 True True False True 1 4 GTK_FILL GTK_FILL True False 1 Colored nicknames: True GTK_FILL GTK_FILL True False 1 Font type: True 1 GTK_FILL GTK_FILL System default True True False 0 True True 1 4 1 GTK_FILL GTK_FILL True False 1 Font color: True 3 GTK_FILL GTK_FILL System default True True False 0 True True 1 4 3 GTK_FILL GTK_FILL Custom: True True False 0 True SystemWideFontRadioButton 1 2 GTK_FILL GTK_FILL Custom: True True False 0 True SystemWideFontColorRadioButton 1 4 GTK_FILL GTK_FILL True False 1 Highlighted words: 6 GTK_FILL GTK_FILL True False 1 Text: 2 4 GTK_FILL GTK_FILL True False 1 Background: 2 5 GTK_FILL GTK_FILL True True automatic automatic in True True 1 4 6 Beep on highlight True True False True 0 True 1 4 7 GTK_FILL GTK_FILL True False 2 3 GTK_FILL GTK_FILL True False 4 5 GTK_FILL GTK_FILL True False 5 6 GTK_FILL GTK_FILL True False 7 8 GTK_FILL GTK_FILL True False 1 2 5 6 GTK_FILL GTK_FILL True False 3 4 1 2 GTK_FILL GTK_FILL True False True False True True #000000000000 False True 0 True False True True 1 3 4 4 5 GTK_FILL GTK_FILL True False True False True True #000000000000 False True 0 True False True True 1 3 4 5 6 GTK_FILL GTK_FILL True False True False True True False True 0 True False True True 1 3 4 2 3 GTK_FILL True False 2 4 2 3 GTK_FILL GTK_FILL 3 True False Appearance 3 False 1 True False Interface 1 False True False 6 vertical 2 True False Servers 2 False True False 6 vertical 3 True False Filters 3 False True False 6 vertical 12 True False 6 True False <b>Status</b> True False True 0 True True False True False True 1 False True 0 Log Filtered Messages True True False 0 True False True 1 True False Open Logs True True True False True 0 True False True True 1 False True 2 4 True False Logging 4 False True True 1 True True 1 CloseButton 100 1 10 smuxi-1.1/src/Frontend-GNOME/ChatViewManager.cs0000664000175000017500000003642014011467170022073 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2013, 2015-2016 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using System.Globalization; using Mono.Unix; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Gnome { public class ChatViewManager : ChatViewManagerBase { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private List f_Chats = new List(); private Notebook f_Notebook; ChatTreeView TreeView { get; set; } private UserConfig f_Config; ChatViewSyncManager SyncManager { get; set; } bool AutoSwitchPersonChats { get; set; } bool AutoSwitchGroupChats { get; set; } public event ChatViewManagerChatAddedEventHandler ChatAdded; public event ChatViewManagerChatRemovedEventHandler ChatRemoved; public event EventHandler ChatSynced; public override IChatView ActiveChat { get { return CurrentChatView; } } public ChatView CurrentChatView { get { return TreeView.CurrentChatView; } set { if (value == null) { return; } f_Notebook.CurrentChatView = value; TreeView.CurrentChatView = value; } } public int CurrentChatNumber { get { if (CurrentChatView == null) { return -1; } return TreeView.CurrentChatNumber; } set { if (value >= f_Chats.Count) { value = 0; } if (value < 0) { value = f_Chats.Count - 1; } TreeView.CurrentChatNumber = value; } } public IList Chats { get { return f_Chats; } } public bool IsSensitive { set { f_Notebook.Sensitive = value; TreeView.Sensitive = value; Frontend.MainWindow.MenuWidget.Sensitive = value; Frontend.MainWindow.Entry.Sensitive = value; } get { return f_Notebook.Sensitive; } } public ChatViewManager(Notebook notebook, ChatTreeView treeView) { f_Notebook = notebook; TreeView = treeView; TreeView.Selection.Changed += OnTreeViewSelectionChanged; SyncManager = new ChatViewSyncManager(); SyncManager.ChatAdded += OnChatAdded; SyncManager.ChatSynced += OnChatSynced; SyncManager.WorkerException += OnWorkerException; } /// /// This method is thread safe. /// public override void AddChat(ChatModel chat) { if (chat == null) { throw new ArgumentNullException("chat"); } SyncManager.QueueAdd(chat); } public override void RemoveChat(ChatModel chat) { ChatView chatView = GetChat(chat); if (chatView == null) { #if LOG4NET f_Logger.Warn("RemoveChat(): chatView is null!"); #endif return; } f_Notebook.RemovePage(f_Notebook.PageNum(chatView)); TreeView.Remove(chatView); f_Chats.Remove(chatView); SyncManager.Remove(chat); if (ChatRemoved != null) { ChatRemoved(this, new ChatViewManagerChatRemovedEventArgs(chatView)); } chatView.Dispose(); } public override void EnableChat(ChatModel chat) { ChatView chatView = GetChat(chat); if (chatView == null) { #if LOG4NET f_Logger.Warn("EnableChat(): chatView is null!"); #endif return; } chatView.Enable(); } public override void DisableChat(ChatModel chat) { ChatView chatView = GetChat(chat); if (chatView == null) { #if LOG4NET f_Logger.Warn("DisableChat(): chatView is null!"); #endif return; } chatView.Disable(); } /// /// This method is thread safe. /// public void SyncChat(ChatModel chat) { if (chat == null) { throw new ArgumentNullException("chat"); } SyncManager.QueueSync(chat); } public ChatView GetChat(ChatModel chatModel) { return f_Notebook.GetChat(chatModel); } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } var prefix = "Interface/Notebook/"; AutoSwitchPersonChats = config[prefix + "AutoSwitchPersonChats"] as bool? ?? false; AutoSwitchGroupChats = config[prefix + "AutoSwitchGroupChats"] as bool? ?? true; f_Config = config; foreach (ChatView chat in f_Chats) { chat.ApplyConfig(f_Config); } } public void Clear() { Trace.Call(); var chats = new List(f_Chats); foreach (var chat in chats) { // clean up ChatView and all notify related resources like // StatusIconManager, NotifyManager and IndicateManager RemoveChat(chat.ChatModel); } f_Config = null; SyncManager.Clear(); } public void ClearAllActivity() { Trace.Call(); f_Notebook.ClearAllActivity(); } public void Minimize() { Trace.Call(); Frontend.MainWindow.Iconify(); } public ProtocolChatView FindProtocolChatViewParent(ChatView child) { foreach (var candidate in Chats) { if (!(candidate is ProtocolChatView) || candidate.ProtocolManager == null) { continue; } if (child.ProtocolManager != candidate.ProtocolManager) { continue; } return (ProtocolChatView) candidate; } return null; } void OnChatAdded(object sender, ChatViewAddedEventArgs e) { Trace.Call(sender, e); GLib.Idle.Add(delegate { var chatView = (ChatView) CreateChatView(e.ChatModel, e.ChatType, e.ProtocolManagerType); chatView.ID = e.ChatID; chatView.Name = e.ChatID; chatView.Position = e.ChatPosition; chatView.ProtocolManager = e.ProtocolManager; f_Chats.Add(chatView); if (f_Config != null) { chatView.ApplyConfig(f_Config); } // POSSIBLE REMOTING CALL int idx = GetSortedChatPosition(chatView); #if LOG4NET f_Logger.Debug("OnChatAdded(): adding " + "<" + chatView.ID + "> at: " + idx); #endif if (idx == -1) { f_Notebook.AppendPage(chatView, chatView.LabelWidget); } else { f_Notebook.InsertPage(chatView, chatView.LabelWidget, idx); } TreeView.Append(chatView); // notify the sync manager that the ChatView is ready to be synced SyncManager.ReleaseSync(chatView); #if GTK_SHARP_2_10 f_Notebook.SetTabReorderable(chatView, true); #endif // we can't do auto switch for remote engines for now as that // kills all unseen highlights, see: // https://www.smuxi.org/issues/show/866 if (Frontend.IsLocalEngine) { if ((chatView is PersonChatView && AutoSwitchPersonChats) || (chatView is GroupChatView && AutoSwitchGroupChats)) { CurrentChatView = chatView; } } if (ChatAdded != null) { ChatAdded(this, new ChatViewManagerChatAddedEventArgs(chatView)); } return false; }); } void OnChatSynced(object sender, ChatViewSyncedEventArgs e) { Trace.Call(sender, e); // FIXME: should we tell the FrontendManager before we sync? // no problem making remoting calls here as this event is called // from worker threads // REMOTING CALL 1 Frontend.FrontendManager.AddSyncedChat(e.ChatView.ChatModel); GLib.Idle.Add(delegate { var chatView = (ChatView) e.ChatView; // we need to bailt out in case the chat was closed during the sync // else chatView.Populate() will die hard, see #635 if (!Chats.Contains(chatView)) { #if LOG4NET f_Logger.Debug("OnChatSynced(): detected closed chat: " + chatView.ID + " during sync, bailing out..."); #endif return false; } // HACK: patch chat position as OnChatAdded is not honoring the // AddChat order nor the complete range of chats if (chatView.Position != -1) { f_Notebook.ReorderChild(chatView, chatView.Position); } #if LOG4NET DateTime start = DateTime.UtcNow; #endif chatView.Populate(); #if LOG4NET DateTime stop = DateTime.UtcNow; double duration = stop.Subtract(start).TotalMilliseconds; f_Logger.Debug("OnChatSynced(): " + "<" + chatView.ID + ">.Populate() " + "Position: " + chatView.Position + " done, took: " + Math.Round(duration) + " ms"); #endif chatView.ScrollToEnd(); if (ChatSynced != null) { ChatSynced(this, new ChatViewManagerChatSyncedEventArgs(chatView)); } return false; }); } void OnWorkerException(object sender, WorkerExceptionEventArgs e) { Trace.Call(sender, e); Frontend.ShowException(e.Exception); } void OnTreeViewSelectionChanged(object sender, EventArgs e) { Trace.Call(sender, e); CurrentChatView = TreeView.CurrentChatView; } int GetSortedChatPosition(ChatView chatView) { // starting with > 0.8 the Engine supplies ChatModel.Position for us if (Frontend.EngineProtocolVersion > new Version("0.8")) { return chatView.Position; } // COMPAT: Engine <= 0.8 doesn't populate ChatModel.Position thus // _we_ have to find a good position var chat = chatView.ChatModel; // REMOTING CALL 1 int idx = chat.Position; // REMOTING CALL 2 ChatType type = chat.ChatType; // new group person and group chats behind their protocol chat if (idx == -1 && (type == ChatType.Person || type == ChatType.Group)) { // REMOTING CALL 3 IProtocolManager pm = chat.ProtocolManager; for (int i = 0; i < f_Notebook.NPages; i++) { ChatView page = (ChatView) f_Notebook.GetNthPage(i); ChatModel pageChat = page.ChatModel; // REMOTING CALL 4 and 5 if (pageChat.ChatType == ChatType.Protocol && pageChat.ProtocolManager == pm) { idx = i + 1; break; } } if (idx != -1) { // now find the first chat with a different protocol manager bool found = false; for (int i = idx; i < f_Notebook.NPages; i++) { ChatView page = (ChatView) f_Notebook.GetNthPage(i); ChatModel pageChat = page.ChatModel; // REMOTING CALL 6 if (pageChat.ProtocolManager != pm) { found = true; idx = i; break; } } if (!found) { // if there was no next protocol manager, simply append // the chat way to the end idx = -1; } } } return idx; } } public delegate void ChatViewManagerChatAddedEventHandler(object sender, ChatViewManagerChatAddedEventArgs e); public class ChatViewManagerChatAddedEventArgs : EventArgs { private ChatView f_ChatView; public ChatView ChatView { get { return f_ChatView; } } public ChatViewManagerChatAddedEventArgs(ChatView chatView) { f_ChatView = chatView; } } public delegate void ChatViewManagerChatRemovedEventHandler(object sender, ChatViewManagerChatRemovedEventArgs e); public class ChatViewManagerChatRemovedEventArgs : EventArgs { private ChatView f_ChatView; public ChatView ChatView { get { return f_ChatView; } } public ChatViewManagerChatRemovedEventArgs(ChatView chatView) { f_ChatView = chatView; } } public class ChatViewManagerChatSyncedEventArgs : EventArgs { public ChatView ChatView { get; private set; } public ChatViewManagerChatSyncedEventArgs(ChatView chatView) { ChatView = chatView; } } } smuxi-1.1/src/Frontend-GNOME/Main.cs0000644000175000017500000001667012726351313017757 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2008, 2012-2013, 2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Remoting; using System.Reflection; using Gtk.Extensions; using NDesk.Options; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public class MainClass { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif static readonly string LibraryTextDomain = "smuxi-frontend-gnome"; static SingleApplicationInstance Instance { get; set; } public static void Main(string[] args) { var debug = false; var link = String.Empty; var engine = String.Empty; var newInstance = false; var options = new OptionSet(); options.Add( "d|debug", _("Enable debug output"), v => { debug = true; } ); options.Add( "h|help", _("Show this help"), v => { Console.WriteLine("Usage: smuxi-frontend-gnome [options]"); Console.WriteLine(); Console.WriteLine(_("Options:")); options.WriteOptionDescriptions(Console.Out); Environment.Exit(0); } ); options.Add( "e|engine=", _("Connect to engine"), v => { engine = v; } ); options.Add( "open|open-link=", _("Opens the specified link in Smuxi"), v => { link = v; } ); options.Add( "new-instance", _("Starts a new Smuxi instance and ignores an existing one"), v => { newInstance = true; } ); try { options.Parse(args); #if LOG4NET // initialize log level log4net.Repository.ILoggerRepository repo = log4net.LogManager.GetRepository(); if (debug) { repo.Threshold = log4net.Core.Level.Debug; } else { repo.Threshold = log4net.Core.Level.Info; } #endif try { Instance = new SingleApplicationInstance(); if (Instance.IsFirstInstance) { Instance.FirstInstance = new CommandLineInterface(); if (!String.IsNullOrEmpty(link)) { Instance.FirstInstance.OpenLink(link); } } else { if (!String.IsNullOrEmpty(link)) { var msg = _("Passing link to already running Smuxi instance..."); #if LOG4NET _Logger.Info(msg); #else Console.WriteLine(msg); #endif Instance.FirstInstance.OpenLink(link); } else if (!newInstance) { var msg = _("Bringing already running Smuxi instance to foreground..."); #if LOG4NET _Logger.Info(msg); #else Console.WriteLine(msg); #endif Instance.FirstInstance.PresentMainWindow(); } if (!newInstance) { // don't initialize/spawn another instance return; } } } catch (Exception ex) { #if LOG4NET _Logger.Warn("Single application instance error, ignoring...", ex); #endif } Frontend.Init(args, engine); } catch (Exception e) { #if LOG4NET _Logger.Fatal(e); #endif // when Gtk# receives an exception it is not usable/relyable anymore! // except the exception was thrown in Frontend.Init() itself if (Frontend.IsGtkInitialized && !Frontend.InGtkApplicationRun) { Frontend.ShowException(e); } // rethrow the exception for console output throw; } } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } public class CommandLineInterface : SingleApplicationInterface { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public void PresentMainWindow() { if (!Frontend.IsGtkInitialized || !Frontend.InGtkApplicationRun) { return; } Gtk.Application.Invoke(delegate { var window = Frontend.MainWindow; if (window == null) { return; } window.PresentWithServerTime(); }); } public void OpenLink(string link) { if (Frontend.Session == null) { // we don't have a session yet, probably local instance that is // just starting or a remote engine that isn't connected yet EventHandler handler = null; handler = delegate { if (Frontend.Session == null) { return; } // we can't know which thread invokes SessionPropertyChanged Gtk.Application.Invoke((o, e) => { #if LOG4NET Logger.Info("Opening the link..."); #endif Frontend.OpenLink(new Uri(link)); }); // only process the link once Frontend.SessionPropertyChanged -= handler; }; #if LOG4NET Logger.Info("Delaying opening the link as the session isn't initialized yet..."); #endif // install event handler and wait till the session gets initialized Frontend.SessionPropertyChanged += handler; } else { Gtk.Application.Invoke((o, e) => { Frontend.OpenLink(new Uri(link)); }); } } public override object InitializeLifetimeService() { // live forever return null; } } } smuxi-1.1/src/Frontend-GNOME/MainWindow.cs0000664000175000017500000006114314011467170021142 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2016 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Linq; using System.Threading; using System.Reflection; using SysDiag = System.Diagnostics; using Mono.Unix; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class MainWindow : Gtk.Window { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private bool _IsFullscreen; string f_NetworkStatus; Gtk.Statusbar NetworkStatusbar { get; set; } Gtk.Statusbar Statusbar { get; set; } public Gtk.ProgressBar ProgressBar { get; private set; } Gtk.HBox StatusHBox { get; set; } public MenuWidget MenuWidget { get; private set; } Gtk.HPaned TreeViewHPaned { get; set; } public IFrontendUI UI { get; private set; } public Entry Entry { get; private set; } public Notebook Notebook { get; private set; } public ChatTreeView ChatTreeView { get; private set; } public ChatViewManager ChatViewManager { get; private set; } public EngineManager EngineManager { get; private set; } #if GTK_SHARP_2_10 StatusIconManager StatusIconManager { get; set; } #endif #if INDICATE_SHARP || MESSAGING_MENU_SHARP IndicateManager IndicateManager { get; set; } #endif #if NOTIFY_SHARP NotifyManager NotifyManager { get; set; } #endif #if IPC_DBUS NetworkManager NetworkManager { get; set; } #endif public NotificationAreaIconMode NotificationAreaIconMode { get; set; } public bool IsMinimized { get; private set; } public bool IsMaximized { get; private set; } public int WindowWidth { get; private set; } public bool CaretMode { get { return MenuWidget.CaretMode; } } public bool ShowMenuBar { get { return MenuWidget.MenuBar.Visible; } set { MenuWidget.ShowMenubarAction.Active = value; } } public bool ShowStatusbar { get { return StatusHBox.Visible; } set { StatusHBox.Visible = value; } } public string NetworkStatus { set { if (value == null) { value = String.Empty; } NetworkStatusbar.Pop(0); NetworkStatusbar.Push(0, value); f_NetworkStatus = value; } } public string Status { set { if (value == null) { value = String.Empty; } Statusbar.Pop(0); Statusbar.Push(0, value); } } public bool IsFullscreen { get { return _IsFullscreen; } set { _IsFullscreen = value; if (value) { Fullscreen(); } else { Unfullscreen(); } } } public EventHandler Minimized; public EventHandler Unminimized; public MainWindow() : base("Smuxi") { // restore window size / position int width, heigth; if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/Width"] != null) { width = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/Width"]; } else { width = 800; } if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/Heigth"] != null) { heigth = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/Heigth"]; } else { heigth = 600; } if (width < -1 || heigth < -1) { width = -1; heigth = -1; } if (width == -1 && heigth == -1) { SetDefaultSize(800, 600); Maximize(); } else if (width == 0 && heigth == 0) { // HACK: map 0/0 to default size as it crashes on Windows :/ SetDefaultSize(800, 600); } else { SetDefaultSize(width, heigth); } int x, y; if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/XPosition"] != null) { x = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/XPosition"]; } else { x = 0; } if (Frontend.FrontendConfig[Frontend.UIName + "/Interface/YPosition"] != null) { y = (int) Frontend.FrontendConfig[Frontend.UIName + "/Interface/YPosition"]; } else { y = 0; } if (x < 0 || y < 0) { x = 0; y = 0; } if (x == 0 && y == 0) { SetPosition(Gtk.WindowPosition.Center); } else { Move(x, y); } DeleteEvent += OnDeleteEvent; FocusInEvent += OnFocusInEvent; FocusOutEvent += OnFocusOutEvent; WindowStateEvent += OnWindowStateEvent; ChatTreeView = new ChatTreeView(); Notebook = new Notebook(); Notebook.SwitchPage += OnNotebookSwitchPage; Notebook.FocusInEvent += OnNotebookFocusInEvent; ChatViewManager = new ChatViewManager(Notebook, ChatTreeView); Assembly asm = Assembly.GetExecutingAssembly(); ChatViewManager.Load(asm); ChatViewManager.LoadAll(System.IO.Path.GetDirectoryName(asm.Location), "smuxi-frontend-gnome-*.dll"); ChatViewManager.ChatAdded += OnChatViewManagerChatAdded; ChatViewManager.ChatSynced += OnChatViewManagerChatSynced; ChatViewManager.ChatRemoved += OnChatViewManagerChatRemoved; #if GTK_SHARP_2_10 StatusIconManager = new StatusIconManager(this, ChatViewManager); #endif #if INDICATE_SHARP || MESSAGING_MENU_SHARP IndicateManager = new IndicateManager(this, ChatViewManager); #endif #if NOTIFY_SHARP NotifyManager = new NotifyManager(this, ChatViewManager); #endif #if IPC_DBUS NetworkManager = new NetworkManager(ChatViewManager); #endif UI = new GnomeUI(ChatViewManager); // HACK: Frontend.FrontendConfig out of scope EngineManager = new EngineManager(Frontend.FrontendConfig, UI); Entry = new Entry(ChatViewManager); var entryScrolledWindow = new Gtk.ScrolledWindow(); entryScrolledWindow.ShadowType = Gtk.ShadowType.EtchedIn; entryScrolledWindow.HscrollbarPolicy = Gtk.PolicyType.Never; entryScrolledWindow.SizeRequested += delegate(object o, Gtk.SizeRequestedArgs args) { // predict and set useful height int lineWidth, lineHeight; using (var layout = Entry.CreatePangoLayout("Qp")) { layout.GetPixelSize(out lineWidth, out lineHeight); } var it = Entry.Buffer.StartIter; int newLines = 1; // move to end of next visual line while (Entry.ForwardDisplayLineEnd(ref it)) { newLines++; // calling ForwardDisplayLineEnd repeatedly stays on the same position // therefor we move one cursor position further it.ForwardCursorPosition(); } newLines = Math.Min(newLines, 3); // use text heigth + a bit extra var bestSize = new Gtk.Requisition() { Height = (lineHeight * newLines) + 5 }; args.Requisition = bestSize; }; entryScrolledWindow.Add(Entry); ProgressBar = new Gtk.ProgressBar(); StatusHBox = new Gtk.HBox(); MenuWidget = new MenuWidget(this, ChatViewManager); var treeviewScrolledWindow = new Gtk.ScrolledWindow() { ShadowType = Gtk.ShadowType.EtchedIn, HscrollbarPolicy = Gtk.PolicyType.Never, VscrollbarPolicy = Gtk.PolicyType.Automatic }; treeviewScrolledWindow.Add(ChatTreeView); ChatViewManager.ChatAdded += (sender, e) => { treeviewScrolledWindow.CheckResize(); }; var notebookPaned = new Gtk.VPaned(); notebookPaned.Pack1(Notebook, true, false); notebookPaned.Pack2(entryScrolledWindow, false, false); var treeviewPaned = new Gtk.HPaned(); treeviewPaned.Pack1(treeviewScrolledWindow, false, false); treeviewPaned.Pack2(notebookPaned, true, false); TreeViewHPaned = treeviewPaned; var entryPaned = new Gtk.VPaned(); entryPaned.ButtonPressEvent += (sender, e) => { // reset entry size on double click if (e.Event.Type == Gdk.EventType.TwoButtonPress && e.Event.Button == 1) { GLib.Timeout.Add(100, delegate { entryPaned.Position = -1; return false; }); } }; entryPaned.Pack1(treeviewPaned, true, false); Gtk.VBox vbox = new Gtk.VBox(); vbox.PackStart(MenuWidget, false, false, 0); vbox.PackStart(entryPaned, true, true, 0); NetworkStatusbar = new Gtk.Statusbar(); NetworkStatusbar.WidthRequest = 300; NetworkStatusbar.HasResizeGrip = false; Statusbar = new Gtk.Statusbar(); Statusbar.HasResizeGrip = false; Gtk.HBox status_bar_hbox = new Gtk.HBox(); status_bar_hbox.Homogeneous = true; status_bar_hbox.PackStart(NetworkStatusbar, false, true, 0); status_bar_hbox.PackStart(Statusbar, true, true, 0); StatusHBox.PackStart(status_bar_hbox); StatusHBox.PackStart(ProgressBar, false, false, 0); StatusHBox.ShowAll(); StatusHBox.NoShowAll = true; StatusHBox.Visible = (bool) Frontend.FrontendConfig["ShowStatusBar"]; vbox.PackStart(StatusHBox, false, false, 0); Add(vbox); } public void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } string modeStr = (string) userConfig["Interface/Notification/NotificationAreaIconMode"]; NotificationAreaIconMode mode = (NotificationAreaIconMode) Enum.Parse( typeof(NotificationAreaIconMode), modeStr ); NotificationAreaIconMode = mode; MenuWidget.OpenLogAction.Visible = Frontend.IsLocalEngine; MenuWidget.OpenLogToolAction.Visible = Frontend.IsLocalEngine; #if GTK_SHARP_2_10 StatusIconManager.ApplyConfig(userConfig); #endif #if INDICATE_SHARP || MESSAGING_MENU_SHARP IndicateManager.ApplyConfig(userConfig); #endif #if NOTIFY_SHARP NotifyManager.ApplyConfig(userConfig); #endif Entry.ApplyConfig(userConfig); Notebook.ApplyConfig(userConfig); ChatTreeView.ApplyConfig(userConfig); ChatViewManager.ApplyConfig(userConfig); MenuWidget.JoinWidget.ApplyConfig(userConfig); } public void UpdateTitle() { UpdateTitle(null, null); } public void UpdateTitle(ChatView chatView, string protocolStatus) { Trace.Call(chatView, protocolStatus); if (chatView == null) { chatView = ChatViewManager.CurrentChatView; } if (protocolStatus == null) { protocolStatus = f_NetworkStatus; } if (chatView == null) { return; } string title; if (chatView is SessionChatView) { title = String.Empty; } else if (chatView is ProtocolChatView) { title = protocolStatus; } else if (chatView is GroupChatView) { var groupChatView = (GroupChatView) chatView; var users = String.Format(_("{0} Users"), groupChatView.Participants.Count); title = String.Format("{0} ({1}) @ {2}", chatView.Name, users, protocolStatus); } else { title = String.Format("{0} @ {1}", chatView.Name, protocolStatus); } if (!String.IsNullOrEmpty(title)) { title += " - "; } title += "Smuxi"; Title = title; } protected override bool OnConfigureEvent(Gdk.EventConfigure e) { Trace.Call(e); var widthChanged = WindowWidth != e.Width; if (widthChanged) { WindowWidth = e.Width; CheckLayout(); } return base.OnConfigureEvent(e); } protected virtual void OnDeleteEvent(object sender, Gtk.DeleteEventArgs e) { Trace.Call(sender, e); try { if (NotificationAreaIconMode == NotificationAreaIconMode.Closed) { // showing the tray icon is handled in OnWindowStateEvent Hide(); // don't destroy the window nor quit smuxi! e.RetVal = true; return; } Frontend.Quit(); } catch (Exception ex) { Frontend.ShowException(this, ex); } } protected virtual void OnFocusInEvent(object sender, EventArgs e) { Trace.Call(sender, e); try { UrgencyHint = false; // HACK: users sometimes click into the person list by accident // when they try to bring the focus back to the Smuxi window. // We try to be nice and do what they probably meant and move // the focus to the input entry instead. // HACK: we have to use a timeout here as the ButtonPressEvent // is directly raised _after_ the FocusInEvent. The idle loop // turned out to be too racy and works only sometimes. GLib.Timeout.Add(10, delegate { Entry.GrabFocus(); return false; }); if (Notebook.IsBrowseModeEnabled) { return; } var chatView = ChatViewManager.CurrentChatView; if (chatView != null) { // clear activity and highlight chatView.HasHighlight = false; chatView.HasActivity = false; chatView.HasEvent = false; var lastMsg = chatView.OutputMessageTextView.LastMessage; if (lastMsg == null || Frontend.UseLowBandwidthMode) { return; } // update last seen highlight ThreadPool.QueueUserWorkItem(delegate { try { // REMOTING CALL 1 chatView.ChatModel.LastSeenHighlight = lastMsg.TimeStamp; } catch (Exception ex) { #if LOG4NET f_Logger.Error("OnFocusInEvent(): Exception", ex); #endif } }); } } catch (Exception ex) { Frontend.ShowException(this, ex); } } protected virtual void OnFocusOutEvent(object sender, EventArgs e) { Trace.Call(sender, e); try { if (Notebook.IsBrowseModeEnabled) { return; } var chatView = ChatViewManager.CurrentChatView; if (chatView == null) { return; } chatView.UpdateLastSeenMessage(); } catch (Exception ex) { Frontend.ShowException(this, ex); } } protected virtual void OnWindowStateEvent(object sender, Gtk.WindowStateEventArgs e) { Trace.Call(sender, e); try { // handle minimize / un-minimize if ((e.Event.ChangedMask & Gdk.WindowState.Iconified) != 0) { IsMinimized = (e.Event.NewWindowState & Gdk.WindowState.Iconified) != 0; #if LOG4NET f_Logger.Debug("OnWindowStateEvent(): IsMinimized: " + IsMinimized); #endif #if DISABLED // BUG: metacity is not allowing us to use the minimize state // to hide and enable the notfication area icon as switching // to a different workspace sets WindowState.Iconified on all // windows, thus this code is disabled. For more details see: // http://projects.qnetp.net/issues/show/158 Hide(); #endif if (IsMinimized) { if (Minimized != null) { Minimized(this, EventArgs.Empty); } } else { if (Unminimized != null) { Unminimized(this, EventArgs.Empty); } } } // handle maximize / un-maximize if ((e.Event.ChangedMask & Gdk.WindowState.Maximized) != 0) { IsMaximized = (e.Event.NewWindowState & Gdk.WindowState.Maximized) != 0; #if LOG4NET f_Logger.Debug("OnWindowStateEvent(): IsMaximized: " + IsMaximized); #endif GLib.Idle.Add(() => { CheckLayout(); return false; }); } } catch (Exception ex) { Frontend.ShowException(this, ex); } } protected virtual void OnNotebookSwitchPage(object sender, EventArgs e) { try { var chatView = ChatViewManager.CurrentChatView; if (chatView == null) { return; } if (!Frontend.IsMacOSX) { MenuWidget.CloseChatAction.Sensitive = !(chatView is SessionChatView); } MenuWidget.FindGroupChatAction.Sensitive = !(chatView is SessionChatView); if (Frontend.IsLocalEngine) { var logExists = File.Exists(chatView.ChatModel.LogFile); MenuWidget.OpenLogAction.Sensitive = logExists; MenuWidget.OpenLogToolAction.Sensitive = logExists; } // find protocol chat parent and update join bar foreach (var view in ChatViewManager.Chats) { if (!(view is ProtocolChatView) || view.ProtocolManager == null) { continue; } if (chatView.ProtocolManager == view.ProtocolManager) { var pView = (ProtocolChatView) view; MenuWidget.JoinWidget.ActiveNetwork = pView.NetworkID; break; } } // HACK: Gtk.Notebook moves the focus to the child after the // page has been switched, so move the focus back to the entry if (!Notebook.IsBrowseModeEnabled) { GLib.Idle.Add(delegate { Entry.GrabFocus(); return false; }); } } catch (Exception ex) { Frontend.ShowException(this, ex); } } protected virtual void OnNotebookFocusInEvent(object sender, Gtk.FocusInEventArgs e) { // HACK: having the focus in the notebook doesn't make any sense, // so move focus back to the entry Entry.GrabFocus(); } protected void OnChatViewManagerChatAdded(object sender, ChatViewManagerChatAddedEventArgs e) { Trace.Call(sender, e); e.ChatView.MessageHighlighted += OnChatViewMessageHighlighted; e.ChatView.StatusChanged += (o, args) => { ChatTreeView.Render(e.ChatView); }; e.ChatView.OutputMessageTextView.FocusInEvent += delegate { if (CaretMode) { return; } Entry.GrabFocus(); }; if (e.ChatView is GroupChatView) { var groupChatView = (GroupChatView) e.ChatView; groupChatView.ParticipantsChanged += (o, args) => { if (ChatViewManager.CurrentChatView != groupChatView) { return; } UpdateTitle(groupChatView, null); }; groupChatView.OutputHPaned.Position = (WindowWidth / 7) * 5; } UpdateProgressBar(); } protected void OnChatViewManagerChatSynced(object sender, ChatViewManagerChatSyncedEventArgs e) { Trace.Call(sender, e); UpdateProgressBar(); } protected void OnChatViewManagerChatRemoved(object sender, ChatViewManagerChatRemovedEventArgs e) { Trace.Call(sender, e); e.ChatView.MessageHighlighted -= OnChatViewMessageHighlighted; UpdateProgressBar(); } protected void OnChatViewMessageHighlighted(object sender, ChatViewMessageHighlightedEventArgs e) { #if MSG_DEBUG Trace.Call(sender, e); #endif if (!HasToplevelFocus) { UrgencyHint = true; } } public void UpdateProgressBar() { var chats = ChatViewManager.Chats; var totalChatCount = chats.Count; var syncedChatCount = chats.Count(x => x.IsSynced); var fraction = (double) syncedChatCount / totalChatCount; if (totalChatCount == 0) { // x / 0d -> Infinity fraction = 0; } ProgressBar.Fraction = fraction; ProgressBar.Text = String.Format("{0} / {1}", syncedChatCount, totalChatCount); if (syncedChatCount >= totalChatCount) { ProgressBar.Hide(); } else { ProgressBar.Show(); } } void CheckLayout() { TreeViewHPaned.Position = WindowWidth / 7; foreach (var chat in ChatViewManager.Chats) { if (!(chat is GroupChatView)) { continue; } var groupChat = (GroupChatView) chat; groupChat.OutputHPaned.Position = (WindowWidth / 7) * 5; } } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/Makefile.in0000664000175000017500000015047614011526471020614 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@am__append_1 = $(MESSAGINGMENU_SHARP_INCLUDED_LIBS) \ @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@ $(MESSAGINGMENU_SHARP_INCLUDED_LIBS).config \ @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@ $(GIO_SHARP_DLL) \ @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@ $(GIO_SHARP_DLL_CONFIG) subdir = src/Frontend-GNOME ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-frontend-gnome 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)$(pkgappdir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(appdatadir)" \ "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(icon128dir)" \ "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon22dir)" \ "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon256dir)" \ "$(DESTDIR)$(icon32dir)" "$(DESTDIR)$(icon48dir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" "$(DESTDIR)$(svgicondir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(appdata_DATA) $(desktop_DATA) $(icon128_DATA) $(icon16_DATA) \ $(icon22_DATA) $(icon24_DATA) $(icon256_DATA) $(icon32_DATA) \ $(icon48_DATA) $(linuxdesktopapplications_DATA) \ $(linuxpkgconfig_DATA) $(programfiles_DATA) \ $(programfilesicons_DATA) $(svgicon_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-frontend-gnome.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = $(install_sh) -d oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ TARGET_DIR = $(top_builddir)/bin/$(PROFILE) EXTRA_DIST = $(WIN_ICON) $(DESKTOP_FILE).in $(man_MANS) \ $(appdata_in_files) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) man_MANS = smuxi-frontend-gnome.1 ICON_NAME = smuxi-frontend-gnome ICON_NAME_PNG = $(ICON_NAME).png ICON_SVG = $(ICON_NAME).svg ICON_XPM = $(ICON_NAME).xpm GROUP_CHAT_ICON_NAME = smuxi-group-chat PERSON_CHAT_ICON_NAME = smuxi-person-chat ICON_16 = $(top_builddir)/images/16/$(ICON_NAME_PNG) ICON_22 = $(top_builddir)/images/22/$(ICON_NAME_PNG) ICON_24 = $(top_builddir)/images/24/$(ICON_NAME_PNG) ICON_32 = $(top_builddir)/images/32/$(ICON_NAME_PNG) ICON_48 = $(top_builddir)/images/48/$(ICON_NAME_PNG) ICON_128 = $(top_builddir)/images/128/$(ICON_NAME_PNG) ICON_256 = $(top_builddir)/images/256/$(ICON_NAME_PNG) WIN_ICON = $(top_srcdir)/images/icon.ico DESKTOP_FILE = smuxi-frontend-gnome.desktop THEME_DIR = $(datadir)/icons/hicolor svgicondir = $(THEME_DIR)/scalable/apps svgicon_DATA = $(ICON_SVG) icon16dir = $(THEME_DIR)/16x16/apps icon16_DATA = $(ICON_16) icon22dir = $(THEME_DIR)/22x22/apps icon22_DATA = $(ICON_22) icon24dir = $(THEME_DIR)/24x24/apps icon24_DATA = $(ICON_24) icon32dir = $(THEME_DIR)/32x32/apps icon32_DATA = $(ICON_32) icon48dir = $(THEME_DIR)/48x48/apps icon48_DATA = $(ICON_48) icon128dir = $(THEME_DIR)/128x128/apps icon128_DATA = $(ICON_128) icon256dir = $(THEME_DIR)/256x256/apps icon256_DATA = \ $(ICON_256) \ $(top_builddir)/images/256/$(GROUP_CHAT_ICON_NAME).png \ $(top_builddir)/images/256/$(PERSON_CHAT_ICON_NAME).png gtk_update_icon_cache = gtk-update-icon-cache -f -t $(THEME_DIR) desktopdir = $(datadir)/applications desktop_in_files = $(DESKTOP_FILE).in desktop_DATA = $(DESKTOP_FILE) build_datafiles = $(DESKTOP_FILE) appdatadir = $(datarootdir)/appdata appdata_DATA = $(appdata_in_files:.xml.in=.xml) appdata_in_files = smuxi-frontend-gnome.appdata.xml.in FRONTEND_GNOME_EXE_CONFIG_SOURCE = smuxi-frontend-gnome.exe.config FRONTEND_GNOME_EXE_CONFIG = $(BUILD_DIR)/smuxi-frontend-gnome.exe.config ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = @CSC_FLAGS@ -noconfig -codepage:utf8 -warn:4 -optimize- -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET,CONFIG_NINI,UI_GNOME,GTK_SHARP_2_8" -win32icon:$(WIN_ICON) @FRONTEND_GNOME_COMPILER_FLAGS@ ASSEMBLY = ../../bin/debug/smuxi-frontend-gnome.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-frontend.dll BUILD_DIR = ../../bin/debug LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE = ../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll SMUXI_FRONTEND_DLL_MDB_SOURCE = ../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB = $(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_SOURCE = ../../bin/debug/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = $(SMUXI_ENGINE_DLL_MDB) $(SMUXI_ENGINE_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) $(FRONTEND_GNOME_EXE_CONFIG) \ $(am__append_1) LINUX_DESKTOPAPPLICATIONS = \ $(FRONTEND_GNOME_DESKTOP_DESKTOP) BINARIES = \ $(FRONTEND_GNOME) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ AboutDialog.cs \ CrashDialog.cs \ EngineManagerDialog.cs \ Entry.cs \ Frontend.cs \ GnomeUI.cs \ Gtk.WindowExtensions.cs \ IndicateManager.cs \ Main.cs \ MainWindow.cs \ NetworkManager.cs \ NotImplementedMessageDialog.cs \ Notebook.cs \ SplashScreenWindow.cs \ ChatTypeWidget.cs \ ChatViewManager.cs \ ColorConverter.cs \ NotifyManager.cs \ PangoTools.cs \ Preferences/ServerListView.cs \ Views/ChatTreeView.cs \ Views/JoinWidget.cs \ Views/MenuWidget.cs \ Views/MessageTextView.cs \ Views/PreferencesDialog.cs \ Views/ServerWidget.cs \ Views/ServerDialog.cs \ Views/FilterListWidget.cs \ Views/Chats/ChatView.cs \ Views/Chats/GroupChatView.cs \ Views/Chats/PersonChatView.cs \ Views/Chats/ProtocolChatView.cs \ Views/Chats/SessionChatView.cs \ Views/Assistants/Engine/EngineAssistantNameWidget.cs \ Views/Assistants/Engine/EngineAssistantCredentialsWidget.cs \ Views/Assistants/Engine/EngineAssistantConnectionWidget.cs \ Views/Assistants/Engine/EngineAssistantIntroWidget.cs \ Views/Assistants/Engine/EngineAssistant.cs \ Views/Tags/EmojiTag.cs \ Views/Tags/LinkTag.cs \ Views/Tags/PersonTag.cs \ QuickConnectDialog.cs \ SteticPreferencesDialog.cs \ FindGroupChatDialog.cs \ ChatFindDialog.cs \ OpenChatDialog.cs \ ThemeSettings.cs \ StatusIconManager.cs \ gtk-gui/generated.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.ChatTypeWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs \ gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs \ gtk-gui/Smuxi.Frontend.Gnome.FilterListWidget.cs \ osx/AppleEvent.cs \ osx/ApplicationEvents.cs \ osx/Carbon.cs \ osx/CoreFoundation.cs \ osx/IgeMacMenu.cs DATA_FILES = \ $(DESKTOP_FILE) \ $(ICON_SVG) \ $(ICON_XPM) \ $(ICON_16) \ $(ICON_22) \ $(ICON_24) \ $(ICON_32) \ $(ICON_48) \ $(ICON_128) \ $(ICON_256) RESOURCES = \ gtk-gui/gui.stetic \ $(top_builddir)/glade/smuxi-frontend-gnome.glade \ $(top_builddir)/images/icon_256x256.png \ $(top_builddir)/images/group-chat_256x256.png \ $(top_builddir)/images/person-chat_256x256.png \ $(top_builddir)/images/protocol-chat_256x256.png \ $(top_builddir)/images/session-chat_256x256.png \ Interfaces/PreferencesDialog2.ui \ Interfaces/ServerListWidget.ui EXTRAS = \ smuxi-frontend-gnome.in \ $(FRONTEND_GNOME_EXE_CONFIG_SOURCE) REFERENCES = \ System.Runtime.Remoting \ System \ System.Core \ System.Web \ Mono.Posix \ $(GLIB_SHARP_20_LIBS) \ $(GLADE_SHARP_20_LIBS) \ $(GTK_SHARP_20_LIBS) \ $(GIO_SHARP_LIBS) \ $(LOG4NET_REF_LIBS) \ $(INDICATE_SHARP_LIBS) \ $(MESSAGINGMENU_SHARP_LIBS) \ $(MESSAGINGMENU_SHARP_INCLUDED_LIBS) \ $(NOTIFY_SHARP_LIBS) \ $(DBUS_LIBS) DLL_REFERENCES = $(MESSAGINGMENU_SHARP_INCLUDED_LIBS) CLEANFILES = $(LINUX_DESKTOPAPPLICATIONS) $(PROGRAMFILES) $(BINARIES) \ $(top_builddir)/images/256/$(GROUP_CHAT_ICON_NAME).png \ $(top_builddir)/images/256/$(PERSON_CHAT_ICON_NAME).png \ $(appdata_DATA) $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) \ $(build_resx_resources) $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_GNOME = $(BUILD_DIR)/smuxi-frontend-gnome FRONTEND_GNOME_DESKTOP = $(BUILD_DIR)/$(DESKTOP_FILE) SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@MESSAGINGMENU_SHARP_DLL = $(TARGET_DIR)/messagingmenu-sharp.dll @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@MESSAGINGMENU_SHARP_DLL_SOURCE = $(top_builddir)/lib/messagingmenu-sharp/messagingmenu-sharp.dll @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@MESSAGINGMENU_SHARP_DLL_CONFIG = $(MESSAGINGMENU_SHARP_DLL).config @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@MESSAGINGMENU_SHARP_DLL_CONFIG_SOURCE = $(MESSAGINGMENU_SHARP_DLL_SOURCE).config @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@MESSAGINGMENU_SHARP_INCLUDED_LIBS := $(foreach file, $(MESSAGINGMENU_SHARP_FILES), $(TARGET_DIR)/$(file)) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@GIO_SHARP_DLL = $(TARGET_DIR)/gio-sharp.dll @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@GIO_SHARP_DLL_SOURCE = $(GIO_SHARP_LIBS) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@GIO_SHARP_DLL_CONFIG = $(TARGET_DIR)/gio-sharp.dll.config @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@GIO_SHARP_DLL_CONFIG_SOURCE = $(GIO_SHARP_LIBS).config @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@GIO_SHARP_PROGRAM_FILES := $(foreach file, $(GIO_SHARP_FILES), $(shell file=$(TARGET_DIR)/$(file); echo $$file; config_file=$${file}.config; if [ -f "$$config_file" ]; then echo $$config_file; fi)) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-GNOME/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-GNOME/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-frontend-gnome: $(top_builddir)/config.status $(srcdir)/smuxi-frontend-gnome.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-appdataDATA: $(appdata_DATA) @$(NORMAL_INSTALL) @list='$(appdata_DATA)'; test -n "$(appdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(appdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(appdatadir)" || 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)$(appdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(appdatadir)" || exit $$?; \ done uninstall-appdataDATA: @$(NORMAL_UNINSTALL) @list='$(appdata_DATA)'; test -n "$(appdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(appdatadir)'; $(am__uninstall_files_from_dir) install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || 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)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) install-icon128DATA: $(icon128_DATA) @$(NORMAL_INSTALL) @list='$(icon128_DATA)'; test -n "$(icon128dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon128dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon128dir)" || 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)$(icon128dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon128dir)" || exit $$?; \ done uninstall-icon128DATA: @$(NORMAL_UNINSTALL) @list='$(icon128_DATA)'; test -n "$(icon128dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon128dir)'; $(am__uninstall_files_from_dir) install-icon16DATA: $(icon16_DATA) @$(NORMAL_INSTALL) @list='$(icon16_DATA)'; test -n "$(icon16dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon16dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon16dir)" || 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)$(icon16dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon16dir)" || exit $$?; \ done uninstall-icon16DATA: @$(NORMAL_UNINSTALL) @list='$(icon16_DATA)'; test -n "$(icon16dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon16dir)'; $(am__uninstall_files_from_dir) install-icon22DATA: $(icon22_DATA) @$(NORMAL_INSTALL) @list='$(icon22_DATA)'; test -n "$(icon22dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon22dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon22dir)" || 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)$(icon22dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon22dir)" || exit $$?; \ done uninstall-icon22DATA: @$(NORMAL_UNINSTALL) @list='$(icon22_DATA)'; test -n "$(icon22dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon22dir)'; $(am__uninstall_files_from_dir) install-icon24DATA: $(icon24_DATA) @$(NORMAL_INSTALL) @list='$(icon24_DATA)'; test -n "$(icon24dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon24dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon24dir)" || 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)$(icon24dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon24dir)" || exit $$?; \ done uninstall-icon24DATA: @$(NORMAL_UNINSTALL) @list='$(icon24_DATA)'; test -n "$(icon24dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon24dir)'; $(am__uninstall_files_from_dir) install-icon256DATA: $(icon256_DATA) @$(NORMAL_INSTALL) @list='$(icon256_DATA)'; test -n "$(icon256dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon256dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon256dir)" || 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)$(icon256dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon256dir)" || exit $$?; \ done uninstall-icon256DATA: @$(NORMAL_UNINSTALL) @list='$(icon256_DATA)'; test -n "$(icon256dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon256dir)'; $(am__uninstall_files_from_dir) install-icon32DATA: $(icon32_DATA) @$(NORMAL_INSTALL) @list='$(icon32_DATA)'; test -n "$(icon32dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon32dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon32dir)" || 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)$(icon32dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon32dir)" || exit $$?; \ done uninstall-icon32DATA: @$(NORMAL_UNINSTALL) @list='$(icon32_DATA)'; test -n "$(icon32dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon32dir)'; $(am__uninstall_files_from_dir) install-icon48DATA: $(icon48_DATA) @$(NORMAL_INSTALL) @list='$(icon48_DATA)'; test -n "$(icon48dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icon48dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icon48dir)" || 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)$(icon48dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon48dir)" || exit $$?; \ done uninstall-icon48DATA: @$(NORMAL_UNINSTALL) @list='$(icon48_DATA)'; test -n "$(icon48dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon48dir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) install-svgiconDATA: $(svgicon_DATA) @$(NORMAL_INSTALL) @list='$(svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(svgicondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(svgicondir)" || 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)$(svgicondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(svgicondir)" || exit $$?; \ done uninstall-svgiconDATA: @$(NORMAL_UNINSTALL) @list='$(svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(svgicondir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(icon128dir)" "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon22dir)" "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon256dir)" "$(DESTDIR)$(icon32dir)" "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)" "$(DESTDIR)$(svgicondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-appdataDATA install-desktopDATA \ install-icon128DATA install-icon16DATA install-icon22DATA \ install-icon24DATA install-icon256DATA install-icon32DATA \ install-icon48DATA install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-svgiconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-appdataDATA uninstall-binSCRIPTS \ uninstall-desktopDATA uninstall-icon128DATA \ uninstall-icon16DATA uninstall-icon22DATA uninstall-icon24DATA \ uninstall-icon256DATA uninstall-icon32DATA \ uninstall-icon48DATA uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA uninstall-svgiconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-appdataDATA \ install-binSCRIPTS install-data install-data-am \ install-data-hook install-desktopDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-icon128DATA install-icon16DATA \ install-icon22DATA install-icon24DATA install-icon256DATA \ install-icon32DATA install-icon48DATA install-info \ install-info-am install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-man1 \ install-pdf install-pdf-am install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip install-svgiconDATA \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-appdataDATA uninstall-binSCRIPTS \ uninstall-desktopDATA uninstall-hook uninstall-icon128DATA \ uninstall-icon16DATA uninstall-icon22DATA uninstall-icon24DATA \ uninstall-icon256DATA uninstall-icon32DATA \ uninstall-icon48DATA uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man uninstall-man1 \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA uninstall-svgiconDATA .PRECIOUS: Makefile @INTLTOOL_XML_RULE@ all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_DESKTOPAPPLICATIONS) $(BINARIES) $(ICON_SVG): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon.svg $@ $(ICON_XPM): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon.xpm $@ $(ICON_16): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_16x16.png $@ $(ICON_22): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_22x22.png $@ $(ICON_24): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_24x24.png $@ $(ICON_32): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_32x32.png $@ $(ICON_48): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_48x48.png $@ $(ICON_128): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_128x128.png $@ $(ICON_256): $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/icon_256x256.png $@ $(top_builddir)/images/256/$(GROUP_CHAT_ICON_NAME).png: $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/group-chat_256x256.png $@ $(top_builddir)/images/256/$(PERSON_CHAT_ICON_NAME).png: $(mkdir_p) $(dir $@) $(INSTALL) -m644 $(top_srcdir)/images/person-chat_256x256.png $@ # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@$(eval $(call emit-deploy-target,MESSAGINGMENU_SHARP_DLL)) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@$(eval $(call emit-deploy-target,MESSAGINGMENU_SHARP_DLL_CONFIG)) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@$(eval $(call emit-deploy-target,GIO_SHARP_DLL)) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@$(eval $(call emit-deploy-target,GIO_SHARP_DLL_CONFIG)) $(eval $(call emit-deploy-wrapper,FRONTEND_GNOME,smuxi-frontend-gnome,x)) $(eval $(call emit-deploy-target,FRONTEND_GNOME_DESKTOP)) $(eval $(call emit-deploy-target,FRONTEND_GNOME_EXE_CONFIG)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) %.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po-Frontend-GNOME/*.po) LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po-Frontend-GNOME/.intltool-merge-cache $(top_srcdir)/po-Frontend-GNOME $< $@ install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi # 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: smuxi-1.1/src/Frontend-GNOME/EngineManagerDialog.cs0000644000175000017500000003536112726351313022711 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2013, 2015 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections; using System.Collections.Specialized; using Mono.Unix; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public class EngineManagerDialog : Gtk.Dialog { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private Gtk.ComboBox _ComboBox; private Gtk.ListStore _ListStore; private string _SelectedEngine; private EngineManager _EngineManager; private Gtk.Button _EditButton; private Gtk.Button _DeleteButton; new Gtk.Window Parent { get; set; } public string SelectedEngine { get { Gtk.TreeIter iter; if (!_ComboBox.GetActiveIter(out iter)) { return null; } return (string) _ComboBox.Model.GetValue(iter, 0); } set { int i = 0; foreach (object[] row in (Gtk.ListStore) _ComboBox.Model) { if ((string) row[0] == value) { _ComboBox.Active = i; return; } i++; } throw new ArgumentException(_("Engine not found."), "value"); } } public EngineManagerDialog(Gtk.Window parent, EngineManager engineManager) : base(null, parent, Gtk.DialogFlags.Modal) { Trace.Call(parent, engineManager); if (engineManager == null) { throw new ArgumentNullException("engineManager"); } Parent = parent; _EngineManager = engineManager; Title = "Smuxi - " + _("Engine Manager"); SetPosition(Gtk.WindowPosition.CenterAlways); var connect_button = new Gtk.Button(Gtk.Stock.Connect); AddActionWidget(connect_button, 1); AddActionWidget(new Gtk.Button(Gtk.Stock.New), 3); Gtk.Button edit_button = new Gtk.Button(Gtk.Stock.Edit); _EditButton = edit_button; AddActionWidget(edit_button, 2); _DeleteButton = new Gtk.Button(Gtk.Stock.Delete); AddActionWidget(_DeleteButton, 4); AddActionWidget(new Gtk.Button(Gtk.Stock.Quit), 5); Response += new Gtk.ResponseHandler(_OnResponse); Gtk.VBox vbox = new Gtk.VBox(); Gtk.Label label = new Gtk.Label("" + _("Select which Smuxi engine you want to connect to") + ""); label.UseMarkup = true; vbox.PackStart(label, false, false, 5); Gtk.HBox hbox = new Gtk.HBox(); hbox.PackStart(new Gtk.Label(_("Engine:")), false, false, 5); _ListStore = new Gtk.ListStore(typeof(string)); _ComboBox = new Gtk.ComboBox(); Gtk.CellRendererText cell = new Gtk.CellRendererText(); _ComboBox.PackStart(cell, false); _ComboBox.AddAttribute(cell, "text", 0); _ComboBox.Changed += new EventHandler(_OnComboBoxChanged); _ComboBox.Model = _ListStore; _InitEngineList(); var lowBandWidthCheckBox = new Gtk.CheckButton(_("Use Low Bandwidth Mode")); lowBandWidthCheckBox.Active = (bool) Frontend.FrontendConfig["UseLowBandwidthMode"]; lowBandWidthCheckBox.Clicked += delegate { Frontend.FrontendConfig["UseLowBandwidthMode"] = lowBandWidthCheckBox.Active; Frontend.FrontendConfig.Save(); }; hbox.PackStart(_ComboBox, true, true, 10); vbox.PackStart(hbox, false, false, 10); vbox.PackStart(lowBandWidthCheckBox); VBox.Add(vbox); ShowAll(); } private void _InitEngineList() { string[] engines = (string[])Frontend.FrontendConfig["Engines/Engines"]; string default_engine = (string)Frontend.FrontendConfig["Engines/Default"]; int item = 0; _ListStore.Clear(); _ListStore.AppendValues("<" + _("Local Engine") + ">"); item++; foreach (string engine in engines) { _ListStore.AppendValues(engine); if (engine == default_engine) { _ComboBox.Active = item; } item++; } } private void _OnResponse(object sender, Gtk.ResponseArgs e) { Trace.Call(sender, e); try { #if LOG4NET _Logger.Debug("_OnResponse(): ResponseId: "+e.ResponseId); #endif switch ((int)e.ResponseId) { case 1: _OnConnectButtonPressed(); break; case 2: _OnEditButtonPressed(); break; case 3: _OnNewButtonPressed(); break; case 4: _OnDeleteButtonPressed(); break; case 5: _OnQuitButtonPressed(); break; case (int)Gtk.ResponseType.DeleteEvent: _OnDeleteEvent(); break; } } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif CrashDialog.Show(this, ex); } } private void _OnConnectButtonPressed() { if (_SelectedEngine == null || _SelectedEngine == String.Empty) { Gtk.MessageDialog md = new Gtk.MessageDialog(this, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Close, _("Please select an engine!")); md.Run(); md.Destroy(); // Re-run the Dialog Run(); return; } if (_SelectedEngine == "<" + _("Local Engine") + ">") { Frontend.InitLocalEngine(); Frontend.ConnectEngineToGUI(); Destroy(); return; } string engine = _SelectedEngine; try { _EngineManager.Connect(engine); var engineProtocolVersion = _EngineManager.EngineProtocolVersion; var frontendProtocolVersion = new Version(0, 0); if (engineProtocolVersion.Major != frontendProtocolVersion.Major) { throw new ApplicationException( String.Format( _("Your frontend is not compatible with the engine!\n" + "Engine Version: {0} Frontend Version: {1}\n" + "Engine Protocol: {2} Frontend Protocol: {3}"), _EngineManager.EngineAssemblyVersion, Frontend.Version, engineProtocolVersion, frontendProtocolVersion ) ); } Frontend.Session = _EngineManager.Session; Frontend.UserConfig = _EngineManager.UserConfig; Frontend.EngineAssemblyVersion = _EngineManager.EngineAssemblyVersion; Frontend.EngineProtocolVersion = _EngineManager.EngineProtocolVersion; Frontend.ConnectEngineToGUI(); } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif // clean-up try { _EngineManager.Disconnect(); } catch (Exception disEx) { #if LOG4NET _Logger.Error(disEx); #endif } string error_msg = ex.Message + "\n"; if (ex.InnerException != null) { error_msg += " [" + ex.InnerException.Message + "]\n"; } string msg; msg = _("An error occurred while connecting to the engine!") + "\n\n"; msg += String.Format(_("Engine URL: {0}") + "\n", _EngineManager.EngineUrl); msg += String.Format(_("Error: {0}"), error_msg); Gtk.MessageDialog md = new Gtk.MessageDialog(this, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Close, msg); md.Run(); md.Destroy(); // Re-run the Dialog Run(); } } private void _OnNewButtonPressed() { EngineAssistant assistant = new EngineAssistant( Parent, Frontend.FrontendConfig ); assistant.Cancel += delegate { assistant.Destroy(); // Restart the Dialog // HACK: holy shit, please refactor this mess! var dialog = new EngineManagerDialog(Parent, _EngineManager); dialog.Run(); dialog.Destroy(); }; assistant.Close += delegate { assistant.Destroy(); // Restart the Dialog // HACK: holy shit, please refactor this mess! var dialog = new EngineManagerDialog(Parent, _EngineManager); dialog.Run(); dialog.Destroy(); }; assistant.ShowAll(); } private void _OnEditButtonPressed() { EngineAssistant assistant = new EngineAssistant( Parent, Frontend.FrontendConfig, _SelectedEngine ); assistant.Cancel += delegate { assistant.Destroy(); // Restart the Dialog // HACK: holy shit, please refactor this mess! var dialog = new EngineManagerDialog(Parent, _EngineManager); dialog.Run(); dialog.Destroy(); }; assistant.Close += delegate { assistant.Destroy(); // Restart the Dialog // HACK: holy shit, please refactor this mess! var dialog = new EngineManagerDialog(Parent, _EngineManager); dialog.Run(); dialog.Destroy(); }; assistant.ShowAll(); } private void _OnDeleteButtonPressed() { string msg = String.Format( _("Are you sure you want to delete the engine \"{0}\"?"), _SelectedEngine); Gtk.MessageDialog md = new Gtk.MessageDialog(this, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, msg); int res = md.Run(); md.Destroy(); if ((Gtk.ResponseType)res == Gtk.ResponseType.Yes) { _DeleteEngine(_SelectedEngine); _InitEngineList(); // Re-run the Dialog Run(); } } private void _DeleteEngine(string engine) { StringCollection new_engines = new StringCollection(); string[] current_engines = (string[])Frontend.FrontendConfig["Engines/Engines"]; foreach (string eng in current_engines) { if (eng != engine) { new_engines.Add(eng); } } string[] new_engines_array = new string[new_engines.Count]; new_engines.CopyTo(new_engines_array, 0); // UGLY: refactor this to a proper controller class, see ServerListController Frontend.FrontendConfig["Engines/Engines"] = new_engines_array; Frontend.FrontendConfig.Remove("Engines/"+engine+"/Username"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/Password"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/Hostname"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/Port"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/Channel"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/Formatter"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/UseSshTunnel"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/SshHostname"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/SshPort"); Frontend.FrontendConfig.Remove("Engines/"+engine+"/SshUsername"); Frontend.FrontendConfig.Remove("Engines/"+engine); Frontend.FrontendConfig.Save(); Frontend.FrontendConfig.Load(); } private void _OnQuitButtonPressed() { Frontend.Quit(); } private void _OnDeleteEvent() { Frontend.Quit(); } private void _OnComboBoxChanged(object sender, EventArgs e) { Trace.Call(sender, e); Gtk.TreeIter iter; if (_ComboBox.GetActiveIter(out iter)) { _SelectedEngine = (string )_ComboBox.Model.GetValue(iter, 0); } bool isLocalEngine = _SelectedEngine == "<" + _("Local Engine") + ">"; _EditButton.Sensitive = !isLocalEngine; _DeleteButton.Sensitive = !isLocalEngine; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/ChatFindDialog.cs0000644000175000017500000000244012726351313021661 0ustar00meebeymeebey00000000000000/* * $Id: AboutDialog.cs 415 2008-09-02 20:49:58Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AboutDialog.cs $ * $Rev: 415 $ * $Author: meebey $ * $Date: 2008-09-02 22:49:58 +0200 (Tue, 02 Sep 2008) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Frontend.Gnome { public partial class ChatFindDialog : Gtk.Dialog { public ChatFindDialog() { Build(); } } } smuxi-1.1/src/Frontend-GNOME/smuxi-frontend-gnome.xpm0000644000175000017500000005064514011526501023347 0ustar00meebeymeebey00000000000000/* XPM */ static char * icon_xpm[] = { "48 48 1003 2", " c None", ". c #254F8A", "+ c #25508D", "@ c #24508C", "# c #244E8A", "$ c #234D8A", "% c #244D8A", "& c #254F8C", "* c #26508C", "= c #214C89", "- c #254F8B", "; c #28528C", "> c #5577A8", ", c #7A99C1", "' c #92ABCE", ") c #A3BAD9", "! c #AAC0DC", "~ c #AFC4E0", "{ c #A8BFDB", "] c #A1B9D8", "^ c #8CA7CC", "/ c #7493BD", "( c #4A6EA1", "_ c #25508B", ": c #224C89", "< c #244E89", "[ c #5879AA", "} c #92ADCF", "| c #B5C9E3", "1 c #A8C0DE", "2 c #97B4D8", "3 c #8DACD5", "4 c #84A6D1", "5 c #81A4D0", "6 c #7FA2D0", "7 c #81A4D1", "8 c #85A7D2", "9 c #8FAED5", "0 c #9BB7D9", "a c #ADC3E0", "b c #B2C7E1", "c c #88A3C9", "d c #486EA2", "e c #234D89", "f c #234E8B", "g c #5E81AF", "h c #A5BCD9", "i c #A7BFDD", "j c #8AA9CD", "k c #7EA0A3", "l c #90A95A", "m c #83A48E", "n c #8EAA76", "o c #A0B959", "p c #B2C64F", "q c #B8CD4B", "r c #9FB976", "s c #7FA2B7", "t c #769CCC", "u c #749ACB", "v c #7298CA", "w c #779CCB", "x c #90AED5", "y c #AEC4E0", "z c #99B3D3", "A c #486DA1", "B c #244E8B", "C c #234D8B", "D c #375E96", "E c #98B2D1", "F c #A6BDDC", "G c #81A2B5", "H c #82A082", "I c #8EA75F", "J c #81A18F", "K c #96AC46", "L c #9DB029", "M c #A2B52C", "N c #AFC235", "O c #BBCE3D", "P c #C0D341", "Q c #BACD3D", "R c #85A7B3", "S c #799FCF", "T c #779DCD", "U c #749BCC", "V c #7299CA", "W c #6F96C8", "X c #6D94C6", "Y c #86A7D0", "Z c #AEC4DF", "` c #85A2C8", " . c #2B538E", ".. c #597BAB", "+. c #ABC1DC", "@. c #87A7CF", "#. c #6890C4", "$. c #87A46E", "%. c #8FA85B", "&. c #95AC46", "*. c #93AB4F", "=. c #7C9FBD", "-. c #92AB5C", ";. c #A2B52D", ">. c #AFC236", ",. c #BCCF3E", "'. c #C2D543", "). c #AFC55F", "!. c #80A3CC", "~. c #7CA1D0", "{. c #7A9FCF", "]. c #7198C9", "^. c #6D95C7", "/. c #6A92C5", "(. c #6B92C5", "_. c #95B1D5", ":. c #A4BBD9", "<. c #42689C", "[. c #234E8A", "}. c #6A8BB7", "|. c #A9BFDC", "1. c #7096C6", "2. c #83A387", "3. c #7A9C96", "4. c #8AA664", "5. c #91A956", "6. c #749AC9", "7. c #88A580", "8. c #85A49D", "9. c #90AA71", "0. c #B0C336", "a. c #B3C859", "b. c #A1BD94", "c. c #93AF7C", "d. c #8CAA97", "e. c #7FA4D2", "f. c #7CA0C2", "g. c #9DB772", "h. c #ADC248", "i. c #A1B859", "j. c #8EAA77", "k. c #6C92B1", "l. c #7E9FCB", "m. c #4F73A6", "n. c #244C8A", "o. c #234C8A", "p. c #6A8AB7", "q. c #A4BBDA", "r. c #6B92BA", "s. c #8FAA6A", "t. c #ABBF3C", "u. c #759AAE", "v. c #789ECE", "w. c #7BA1CE", "x. c #98AE46", "y. c #A1B533", "z. c #8FAFB0", "A. c #87AAD7", "B. c #88ABD8", "C. c #84A8D5", "D. c #82A7CE", "E. c #7EA3D2", "F. c #7EA2CA", "G. c #A2BC72", "H. c #B5C943", "I. c #97B279", "J. c #B2C537", "K. c #94AF6C", "L. c #8AA776", "M. c #85A476", "N. c #7296C6", "O. c #A7BEDA", "P. c #4B70A3", "Q. c #587AAB", "R. c #A5BCDA", "S. c #6890B7", "T. c #98B050", "U. c #9BB352", "V. c #7499A6", "W. c #8FAD84", "X. c #7C9CB9", "Y. c #99A1A7", "Z. c #B2A58F", "`. c #BCA789", " + c #C2AC6F", ".+ c #B5AD7A", "++ c #98AAC1", "@+ c #8AADD9", "#+ c #8CAEDA", "$+ c #87AAD6", "%+ c #92AC76", "&+ c #80A5CC", "*+ c #A1BC7F", "=+ c #BACD40", "-+ c #A2BC69", ";+ c #85A6A0", ">+ c #ADC143", ",+ c #ACBF33", "'+ c #A9BC31", ")+ c #83A175", "!+ c #7094C4", "~+ c #A3BAD8", "{+ c #3B6299", "]+ c #3A6098", "^+ c #A6BCD9", "/+ c #688FBF", "(+ c #92AB54", "_+ c #A2B83D", ":+ c #658DBD", "<+ c #668FC3", "[+ c #94A28F", "}+ c #E4B843", "|+ c #F8B346", "1+ c #F1C46B", "2+ c #F1D380", "3+ c #F2D887", "4+ c #F1D685", "5+ c #F1CD79", "6+ c #F5BD5A", "7+ c #ECB259", "8+ c #BBB09E", "9+ c #8DAED7", "0+ c #94AD75", "a+ c #8FAB86", "b+ c #8FAA7A", "c+ c #85A7BD", "d+ c #8DADA2", "e+ c #8DAC98", "f+ c #98B478", "g+ c #B3C638", "h+ c #ACBF34", "i+ c #A6B92F", "j+ c #789982", "k+ c #7699C6", "l+ c #96B0D1", "m+ c #27518B", "n+ c #92ABCD", "o+ c #789AC6", "p+ c #7F9E70", "q+ c #A7BA40", "r+ c #C9AB62", "s+ c #F6B64E", "t+ c #F1D888", "u+ c #F9E68B", "v+ c #EEE09A", "w+ c #E4DAAA", "x+ c #DFD7B0", "y+ c #E1D9AE", "z+ c #E7DCA4", "A+ c #F3E394", "B+ c #F8E68A", "C+ c #F4CF77", "D+ c #EDB35A", "E+ c #99ABBD", "F+ c #8AA9A6", "G+ c #84A6B5", "H+ c #9FBB86", "I+ c #B4C852", "J+ c #AAC15D", "K+ c #B6C93A", "L+ c #ADC034", "M+ c #A9BC32", "N+ c #A2B530", "O+ c #668C9C", "P+ c #88A6CD", "Q+ c #7091BC", "R+ c #214B89", "S+ c #5C7EAD", "T+ c #97B1D3", "U+ c #6A8F8E", "V+ c #A2B62E", "W+ c #ABBC31", "X+ c #E8B441", "Y+ c #F1C66F", "Z+ c #F8E68C", "`+ c #E5DBA7", " @ c #D0CEC6", ".@ c #CCCCCC", "+@ c #D4D1C2", "@@ c #EADEA0", "#@ c #F8D675", "$@ c #F9B54D", "%@ c #ECB25B", "&@ c #F3B44D", "*@ c #F5B647", "=@ c #EDBA48", "-@ c #DBBE40", ";@ c #C3C43B", ">@ c #A3B62D", ",@ c #95AB41", "'@ c #5C86B5", ")@ c #9AB4D5", "!@ c #396198", "~@ c #244D89", "{@ c #9AB2D2", "]@ c #668EB9", "^@ c #96AC3D", "/@ c #D6B63D", "(@ c #F7E68E", "_@ c #A8A798", ":@ c #959694", "<@ c #A2A3A1", "[@ c #AEAFAE", "}@ c #999A98", "|@ c #AFAFAF", "1@ c #AF9C7F", "2@ c #EFAF52", "3@ c #F9C96B", "4@ c #F9E08E", "5@ c #F9E791", "6@ c #FBE98D", "7@ c #FAE88F", "8@ c #FAE691", "9@ c #F8DD89", "0@ c #F8C45D", "a@ c #EEB745", "b@ c #C0BF38", "c@ c #A0B32B", "d@ c #759574", "e@ c #7397C4", "f@ c #7998C1", "g@ c #214D89", "h@ c #5475A7", "i@ c #90ACD0", "j@ c #709179", "k@ c #9FB22B", "l@ c #ACB730", "m@ c #F7B446", "n@ c #D6D2BE", "o@ c #8C8D8B", "p@ c #8B8C8A", "q@ c #989997", "r@ c #A5A6A4", "s@ c #888987", "t@ c #A4A5A3", "u@ c #C19E6A", "v@ c #F7BF5B", "w@ c #FAE78E", "x@ c #F8EAA2", "y@ c #F2EBC5", "z@ c #EEEBDA", "A@ c #EEECE4", "B@ c #EEECE1", "C@ c #EFEBD6", "D@ c #F3EABF", "E@ c #F9EA9C", "F@ c #FBE68E", "G@ c #F8BF56", "H@ c #D0B83B", "I@ c #97AC34", "J@ c #547FAE", "K@ c #95B0D2", "L@ c #305991", "M@ c #224D89", "N@ c #84A0C5", "O@ c #6B8FBD", "P@ c #92A93C", "Q@ c #9FB22A", "R@ c #C7B435", "S@ c #F1CC76", "T@ c #EBDF9E", "U@ c #C7C7C7", "V@ c #C4C4C4", "W@ c #CBCBCB", "X@ c #C8C8C8", "Y@ c #DCC29C", "Z@ c #F9C261", "`@ c #FBE98E", " # c #DEDAC0", ".# c #C4C4C3", "+# c #BDBDBC", "@# c #B9BAB9", "## c #C2C2C1", "$# c #E8E8E8", "%# c #BABBB9", "&# c #DED9BB", "*# c #FAE98F", "=# c #F8C15C", "-# c #C4B836", ";# c #6C8F7E", "># c #789AC5", ",# c #5F82B2", "'# c #224D8A", ")# c #9DB5D4", "!# c #5F868F", "~# c #D2B438", "{# c #F1D687", "]# c #E2D9AE", "^# c #6C6E6B", "/# c #60615E", "(# c #999B99", "_# c #5D5F5B", ":# c #7E7E7A", "<# c #F3AF4D", "[# c #FAE892", "}# c #F1EBCC", "|# c #BDBEBD", "1# c #919290", "2# c #9A9B99", "3# c #DFE0DF", "4# c #9B9C9A", "5# c #C8C9C8", "6# c #F1ECCF", "7# c #F9E890", "8# c #F3B346", "9# c #A5B82F", "0# c #89A24A", "a# c #5B85B8", "b# c #819FC6", "c# c #214C88", "d# c #486DA0", "e# c #88A5CC", "f# c #789664", "g# c #9EB12A", "h# c #A0B32D", "i# c #CEB336", "j# c #EFD183", "k# c #E6DCA6", "l# c #D5C7B1", "m# c #F8C264", "n# c #F9EA98", "o# c #D0D1D0", "p# c #CDCECD", "q# c #DCDCDC", "r# c #D9D9D8", "s# c #DDDDDC", "t# c #FAEA94", "u# c #F9B94E", "v# c #AEB72F", "w# c #9EB12B", "x# c #9CAF2B", "y# c #4E7AA7", "z# c #8EAACE", "A# c #2A538E", "B# c #6283B1", "C# c #7295C2", "D# c #8EA640", "E# c #9CAF2A", "F# c #7C9962", "G# c #638A93", "H# c #879189", "I# c #F2BA5D", "J# c #ACACA7", "K# c #747673", "L# c #979896", "M# c #968466", "N# c #F6C86F", "O# c #F7EAA5", "P# c #A7A8A6", "Q# c #8E8F8D", "R# c #A1A2A0", "S# c #888986", "T# c #B3B4B3", "U# c #949592", "V# c #C4C5C4", "W# c #F7BA53", "X# c #AFB630", "Y# c #A1B42C", "Z# c #78976E", "`# c #839E56", " $ c #9BAF2B", ".$ c #5F8588", "+$ c #7E9DC6", "@$ c #40669C", "#$ c #7291BB", "$$ c #658AB6", "%$ c #809D55", "&$ c #4A78B2", "*$ c #527BB1", "=$ c #6381A7", "-$ c #E3A954", ";$ c #EFD68A", ">$ c #E4D793", ",$ c #AEADA9", "'$ c #B8B9B8", ")$ c #BCBCBB", "!$ c #ADADAC", "~$ c #B5ADA1", "{$ c #FABA53", "]$ c #FAE991", "^$ c #ECECEA", "/$ c #E2E2E2", "($ c #CBCCCB", "_$ c #DBDCDB", ":$ c #D6D6D5", "<$ c #F0ECD4", "[$ c #FAE893", "}$ c #F2B04B", "|$ c #9FB235", "1$ c #91A83E", "2$ c #6E9075", "3$ c #668A80", "4$ c #4C78A1", "5$ c #6F93C0", "6$ c #5174A7", "7$ c #7998BF", "8$ c #6087A6", "9$ c #7E975F", "0$ c #7A8995", "a$ c #8D908B", "b$ c #ACAFAE", "c$ c #C3BCAE", "d$ c #F4B14C", "e$ c #F1D98B", "f$ c #F0E299", "g$ c #CFCEC9", "h$ c #F1B966", "i$ c #F9E290", "j$ c #F2E8B3", "k$ c #8D8E8B", "l$ c #898A87", "m$ c #C7C8C7", "n$ c #C5C6C4", "o$ c #B5B4AD", "p$ c #FAE993", "q$ c #F6C86E", "r$ c #C4A266", "s$ c #8B9386", "t$ c #97A253", "u$ c #9CAE2D", "v$ c #5C848A", "w$ c #4270AC", "x$ c #658CBB", "y$ c #587CAD", "z$ c #214988", "A$ c #224C8A", "B$ c #7D9AC2", "C$ c #527CB2", "D$ c #79906C", "E$ c #8F9286", "F$ c #CECFCC", "G$ c #F5F5F5", "H$ c #F8F8F7", "I$ c #F9F9F8", "J$ c #FAF0E1", "K$ c #FABB5C", "L$ c #F4DA87", "M$ c #DCD6B5", "N$ c #E4DAAB", "O$ c #E8DDA2", "P$ c #EEE19C", "Q$ c #F8DD80", "R$ c #FBB84E", "S$ c #FAE692", "T$ c #F7EAA7", "U$ c #EFECDC", "V$ c #ECECEC", "W$ c #F9EA96", "X$ c #F9D37D", "Y$ c #F8C477", "Z$ c #F2F1EE", "`$ c #E4E4E2", " % c #BABCB5", ".% c #8E9184", "+% c #7B926D", "@% c #4472AC", "#% c #406FAB", "$% c #5E86B8", "%% c #5C7FB0", "&% c #224C88", "*% c #214D8A", "=% c #7997BF", "-% c #597DAC", ";% c #8A8F8C", ">% c #E2E2E0", ",% c #F3F3F1", "'% c #F2F2F1", ")% c #F6F6F6", "!% c #FBFBFA", "~% c #F8E2C2", "{% c #F9D97C", "]% c #F8E78C", "^% c #F5E28E", "/% c #F0D27E", "(% c #F0CE7B", "_% c #F0CA77", ":% c #EFC36E", "<% c #F4B653", "[% c #F1AD49", "}% c #F7B149", "|% c #F7DA8C", "1% c #FAE990", "2% c #F9E996", "3% c #F7EBAA", "4% c #F4EAB6", "5% c #F5EAAF", "6% c #F6EAAC", "7% c #F3EBC1", "8% c #FBE58C", "9% c #FAC371", "0% c #F8F6F3", "a% c #F8F8F8", "b% c #F7F7F6", "c% c #E6E7E5", "d% c #919592", "e% c #5577A1", "f% c #3D6DAA", "g% c #5E85B8", "h% c #587CAC", "i% c #7090BB", "j% c #7D8A94", "k% c #CCCECB", "l% c #EFEFEE", "m% c #F2F2F0", "n% c #FCFCFB", "o% c #FBF2E6", "p% c #FABD60", "q% c #FCE887", "r% c #F5DB87", "s% c #F7B654", "t% c #B69C6E", "u% c #96938B", "v% c #909392", "w% c #85919B", "x% c #708BAD", "y% c #5D87BD", "z% c #6D8BB0", "A% c #C4A371", "B% c #F8B245", "C% c #F7C363", "D% c #F7D280", "E% c #F8D682", "F% c #F7D37F", "G% c #F6CD76", "H% c #F8D484", "I% c #FCE987", "J% c #FAC970", "K% c #FAF8F6", "L% c #FEFEFE", "M% c #F3F3F2", "N% c #8A8F8E", "O% c #416DA5", "P% c #6087B9", "Q% c #5075A9", "R% c #1F4A86", "S% c #6686AE", "T% c #8F938F", "U% c #EFEFED", "V% c #E7E7E4", "W% c #EBEBE9", "X% c #F0F0EE", "Y% c #F4F4F3", "Z% c #F9DBAE", "`% c #FBB146", " & c #FBBC50", ".& c #F5C378", "+& c #F2EADC", "@& c #A6A9A8", "#& c #6384AA", "$& c #5682B9", "%& c #5783BA", "&& c #5883BA", "*& c #5984BB", "=& c #688BAC", "-& c #BCB848", ";& c #CBBA40", ">& c #CAB742", ",& c #BDA65B", "'& c #D2BB92", ")& c #F5D19C", "!& c #FBBB55", "~& c #FAE288", "{& c #FCD975", "]& c #FBBF68", "^& c #FAFAFA", "/& c #EDEDEC", "(& c #F0F0EF", "_& c #BFC1BF", ":& c #667C96", "<& c #668BBB", "[& c #446B9F", "}& c #637B9B", "|& c #AEB1AF", "1& c #EAEAE8", "2& c #E4E4E1", "3& c #E8E8E6", "4& c #EDEDEB", "5& c #F0EFEC", "6& c #ECEBE7", "7& c #E9E9E8", "8& c #CBCCC9", "9& c #70869D", "0& c #537FB7", "a& c #547FB7", "b& c #5480B8", "c& c #5581B8", "d& c #5581B9", "e& c #6089A8", "f& c #5D86AC", "g& c #5781B3", "h& c #868D90", "i& c #E3E3E1", "j& c #E6E6E3", "k& c #EBE0CF", "l& c #F4CD93", "m& c #F7CB89", "n& c #F6E2C3", "o& c #F5F5F4", "p& c #E5E6E4", "q& c #838B8E", "r& c #6F92BE", "s& c #345B94", "t& c #59708D", "u& c #BBBDBB", "v& c #E6E6E4", "w& c #E1E1DE", "x& c #E5E5E2", "y& c #E9E9E6", "z& c #D5D5D3", "A& c #8C967E", "B& c #5B84A4", "C& c #507CB5", "D& c #517DB6", "E& c #527EB6", "F& c #517DB5", "G& c #898C87", "H& c #E5E5E3", "I& c #E9E9E7", "J& c #EEEEED", "K& c #8C8E8A", "L& c #7596C0", "M& c #486387", "N& c #B3B5B3", "O& c #DDDDDA", "P& c #E7E7E5", "Q& c #CFCFCC", "R& c #97A065", "S& c #A8BB34", "T& c #84A268", "U& c #4D7AB3", "V& c #4D7AB4", "W& c #4E7BB4", "X& c #4D79B2", "Y& c #8A8D89", "Z& c #DEDEDA", "`& c #E2E2DF", " * c #E0E0DE", ".* c #8E918C", "+* c #6083B2", "@* c #3A5B87", "#* c #959995", "$* c #D9D9D6", "%* c #DDDDD9", "&* c #DFDFDC", "** c #DCDCD9", "=* c #B3B5AC", "-* c #9BA84F", ";* c #A8BB31", ">* c #98AF48", ",* c #4977B1", "'* c #4A77B1", ")* c #4A77B2", "!* c #4876B1", "~* c #878C8A", "{* c #E3E3E0", "]* c #E0E0DD", "^* c #DFDFDB", "/* c #898D8B", "(* c #40689E", "_* c #808789", ":* c #D8D8D5", "<* c #D8D8D4", "[* c #DADAD7", "}* c #DCDCD8", "|* c #8E9187", "1* c #A3B534", "2* c #60868D", "3* c #4574AF", "4* c #4674AF", "5* c #4573AF", "6* c #4573AE", "7* c #728393", "8* c #C9CAC6", "9* c #E1E1DF", "0* c #DEDEDB", "a* c #E0E0DC", "b* c #DBDBD8", "c* c #CACBC8", "d* c #818F9A", "e* c #244C89", "f* c #59697E", "g* c #959792", "h* c #D6D6D2", "i* c #D7D7D3", "j* c #D7D7D4", "k* c #DBDBD7", "l* c #A7A9A4", "m* c #8B9265", "n* c #A4B72E", "o* c #4774A5", "p* c #4271AD", "q* c #4170AC", "r* c #49709F", "s* c #D9D9D5", "t* c #DADAD6", "u* c #929592", "v* c #54739D", "w* c #8C8F8A", "x* c #9FA09E", "y* c #9A9B97", "z* c #DEDFDD", "A* c #A9AAA6", "B* c #9C9D9A", "C* c #97998F", "D* c #959E63", "E* c #9FB231", "F* c #4371A2", "G* c #3E6DAA", "H* c #3E6EAA", "I* c #3F6EAB", "J* c #3F6EAA", "K* c #406EA9", "L* c #6C8094", "M* c #868986", "N* c #A3A4A1", "O* c #A5A6A1", "P* c #848682", "Q* c #4E6689", "R* c #8C8E89", "S* c #B9BAB7", "T* c #F6F6F5", "U* c #D9D9D7", "V* c #ABACA9", "W* c #8D8F8A", "X* c #ABACA8", "Y* c #CCCCC8", "Z* c #D4D5D2", "`* c #B4B6B2", " = c #8F918D", ".= c #A5A5A2", "+= c #AEB1A9", "@= c #7E8C81", "#= c #3B6BA7", "$= c #3A6AA8", "%= c #3B6AA8", "&= c #3B6BA8", "*= c #3E6CA6", "== c #7C8791", "-= c #BBBDBC", ";= c #DFDFDE", ">= c #A2A4A1", ",= c #969794", "'= c #D0D0CE", ")= c #D1D1CF", "!= c #989995", "~= c #A7A8A4", "{= c #E0E0DF", "]= c #9EA19D", "^= c #868882", "/= c #8A8B86", "(= c #B2B3B0", "_= c #D5D5D5", ":= c #C0C0BF", "<= c #A4A5A2", "[= c #979895", "}= c #959692", "|= c #BEBEBE", "1= c #D7D7D6", "2= c #A6A9A9", "3= c #5E7996", "4= c #3667A5", "5= c #3767A6", "6= c #3768A6", "7= c #3867A5", "8= c #7B8790", "9= c #C2C4C2", "0= c #D3D3D1", "a= c #B0B0AE", "b= c #949591", "c= c #9A9B96", "d= c #A4A6A3", "e= c #EEEEEC", "f= c #E1E1E0", "g= c #D5D5D4", "h= c #CECECE", "i= c #CDCDCC", "j= c #E3E3E2", "k= c #F1F1F0", "l= c #EEEEEE", "m= c #F1F1EF", "n= c #8F9290", "o= c #426C9F", "p= c #3465A4", "q= c #627A96", "r= c #ACAFAF", "s= c #D8D8D7", "t= c #C9C9C9", "u= c #B3B3B3", "v= c #B4B4B4", "w= c #BFBFBE", "x= c #CCCCCB", "y= c #949691", "z= c #8D8E8A", "A= c #D6D7D5", "B= c #D4D4D3", "C= c #F7F7F7", "D= c #F3F3F3", "E= c #D2D3D1", "F= c #748491", "G= c #3C68A2", "H= c #8B8E8C", "I= c #E7E7E6", "J= c #ECECEB", "K= c #E1E1E1", "L= c #DEDEDD", "M= c #DEDEDC", "N= c #DADAD9", "O= c #8A8E8B", "P= c #3B68A1", "Q= c #5F7896", "R= c #BDC0BF", "S= c #A5A6A2", "T= c #BFBFBD", "U= c #DCDCDA", "V= c #ACB0AF", "W= c #50729A", "X= c #7D8890", "Y= c #C9C9C7", "Z= c #D5D5D2", "`= c #8B8D88", " - c #AFB0AC", ".- c #C5C5C2", "+- c #B5B5B3", "@- c #C6C7C5", "#- c #5B7695", "$- c #868B8B", "%- c #C5C5C4", "&- c #C1C1BF", "*- c #E8E9E7", "=- c #A1A29E", "-- c #CECECB", ";- c #DFDFDD", ">- c #AEAEAD", ",- c #5A7596", "'- c #858B8C", ")- c #C0C0BE", "!- c #C5C5C3", "~- c #8B8E89", "{- c #8B8D89", "]- c #EBEBEA", "^- c #CFCFCE", "/- c #A6ABA9", "(- c #607FA5", "_- c #4F7AB0", ":- c #4D78AF", "<- c #7E8B94", "[- c #CDCDCB", "}- c #A6A6A5", "|- c #8E908B", "1- c #848680", "2- c #AEAFAB", "3- c #E8E8E5", "4- c #848989", "5- c #3E6496", "6- c #41699F", "7- c #456BA2", "8- c #597395", "9- c #9FA2A1", "0- c #D6D6D4", "a- c #C4C5C2", "b- c #878883", "c- c #878884", "d- c #B6B7B3", "e- c #EEEEEB", "f- c #90928E", "g- c #3D4956", "h- c #15325A", "i- c #1A3A6B", "j- c #1A3E6F", "k- c #1A3766", "l- c #7F8383", "m- c #EAEAE7", "n- c #7C7D79", "o- c #8B8C88", "p- c #AAACA8", "q- c #C2C3C0", "r- c #CCCCCA", "s- c #CDCECB", "t- c #CCCDCA", "u- c #C7C7C5", "v- c #B8B9B6", "w- c #969893", "x- c #838481", "y- c #A9AAA7", "z- c #DBDBD9", "A- c #EDEDED", "B- c #F5F5F3", "C- c #EFEFEF", "D- c #BBBCBA", "E- c #8B8C87", "F- c #70726E", "G- c #747572", "H- c #737571", "I- c #727470", "J- c #71736F", "K- c #6F716B", "L- c #626260", "M- c #828580", "N- c #888B86", "O- c #898B86", "P- c #888A85", "Q- c #8B8C86", "R- c #6B6D69", " ", " ", " . + @ # $ % & * = ", " - ; > , ' ) ! ~ { ] ^ / ( # _ ", " : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e ", " f g h i j k l m n o p q r s t u v w x y z A B ", " C D E F G H I J K L M N O P Q R S T U V W X Y Z ` .: ", " # ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.T u ].^./.(._.:.<.e ", " [.}.|.1.2.3.4.5.6.7.8.9.;.0.a.b.c.d.e.~.S f.g.h.i.j.k.l.|.m.n. ", " o.p.q.r.s.t.u.^.].U v.w.x.y.z.A.B.A.C.D.E.F.G.H.I.J.K.L.M.N.O.P.f ", " : Q.R.S.T.U.V./.W.X.Y.Z.`. +.+++@+#+@+$+%+&+*+=+-+;+>+>.,+'+)+!+~+{+ ", " ]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+>.h+'+i+j+k+l+m+ ", " e n+o+p+i+'+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+g+0.L+M+i+N+O+P+Q+$ ", " R+S+T+U+V+i+W+X+Y+Z+`+ @.@.@.@.@.@.@+@@@#@$@%@&@*@=@-@;@g+0.L+M+i+>@,@'@)@!@ ", " ~@{@]@^@>@i+/@Y+(@_@:@:@<@[@}@|@:@:@1@2@3@4@5@6@7@8@9@0@a@b@h+M+i+>@c@d@e@f@g@ ", " h@i@j@k@;.l@m@Z+n@}@o@p@q@r@s@t@o@u@v@w@x@y@z@A@B@C@D@E@F@G@H@'+i+>@c@I@J@K@L@ ", " M@N@O@P@Q@;.R@S@T@U@V@W@V@V@V@V@X@Y@Z@`@ #.#+#@###$#%#@#@#&#*#=#-#i+>@k@L ;#>#,#'# ", " ; )#!#L Q@M ~#{#]#^#/#(#_#_#_#_#:#<#[#}#|#1#1#1#2#3#:@4#2#5#6#7#8#9#;.Q@L 0#a#b#c# ", " d#e#f#L g#h#i#j#k#.@.@.@.@.@.@.@l#m#n#o#.#.#p#q#.#r#U@.#.#.#s#t#u#v#M w#L x#y#z#A# ", " B#C#D#E#F#G#H#I#(@J#K#o@L#K#K#K#M#N#O#P#1#Q#R#+#S#T#U#1#1#Q#V#t#W#X#Y#Z#`# $.$+$@$ ", " g@#$$$x#%$&$*$=$-$;$>$,$'$)$!$!$!$~${$]$^$X@U@/$.#.#.#($_$.#:$<$[$}$|$c@1$2$3$4$5$6$ ", " g@7$8$E#9$0$a$b$c$d$e$f$g$.@.@.@.@.@h$i$j$k$l$m$1#1#1#}@n$1#o$p$q$r$s$t$u$L v$w$x$y$z$ ", " A$B$C$D$E$F$G$H$I$J$K$L$T@M$N$`+O$P$Q$R$S$T$U$V$V$V$V$V$V$A@W$X$Y$Z$`$ %.%+%@%#%$%%%&% ", " *%=%-%;%>%,%'%)%!%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%4%5%6%T$7%8%9%0%I$a%b%c%d%e%f%g%h%R+ ", " *%i%j%k%l%^$m%b%n%o%p%q%r%s%t%u%v%w%x%y%z%A%B%C%D%E%F%G%H%`@I%J%K%L%I$M%'%c%N%O%P%Q%R% ", " R+S%T%U%V%W%X%Y%b%Z%`% &.&+&@&#&$&%&&&*&*&*&=&-&;&>&,&'&)&!&~&{&]&^&b%,%/&(&_&:&<&[& ", " }&|&1&2&3&4&(&'%'%5&6&3&7&8&9&0&a&b&c&d&d&d&e&f&g&h&i&j&k&l&m&n&o&M%X%W%3&p&q&r&s& ", " t&u&v&w&x&y&W%4&4&W%3&x&j&z&A&B&C&D&D&E&E&E&D&D&F&G&4&w&H&I&4&U%X%J&^$3&2&J&K&L&: ", " M&N&H&O&w&2&v&P&P&v&2&w&2&Q&R&S&T&U&V&W&W&W&V&U&X&Y&^$Z&`&H&3&1&1&I&P&`$ *4&.*+*= ", " @*#*I&$*%*&*w&`&`&w&&***v&=*-*;*>*,*'*)*)*)*'*,*!*~*`$**Z&w&{*`$x&`$>%]*^*V%/*(* ", " _*:*&*<*[***%*%*}*[***`$|*1*i+2*3*4*4*4*4*4*5*6*7*8*9*$***0*&*a*&*O&b*>%c*d*e* ", " f*g*v&0*h*i*j*j*i*k*3&l*m*;.n*o*w$p*p*p*p*p*w$q*r*T%v&}*i*s*t*[*t*:*b*v&u*v*= ", " w*x*P#y*z*P&&*O&^*x&H&A*B*C*D*E*F*G*H*I*I*J*H*G*K*L*M*N*v&w&j*h*h*i*]*v&O*P*Q* ", " R*S*T*U*V*W*X*Y*Z*F$`* =.=r#G$+=@=#=$=%=&=&=&=$=*===-=;=>=,='=3&3&3&3&)=!=~={=]=^= ", " /=(=T*X%J&_=:=<=[=}=!=R#|=1=l%(&o&2=3=4=5=5=6=5=7=8=9=b%J&0=a=b=R*c=c=R*}=T#1=,%Y%d=P* ", " }=M%e=e=X%'%f=g=h=i=h=:$j=M%k=J&l=m=n=o=p=p=p=p=q=r=T*e=J&/&s=t=)$u=v=w=x=s#k=l%(&'%y= ", " z=A=m=W%B=(&M%T*C=D=k=Y%H$T*M%X%e=W%k=E=F=p=p=p=G=H=(&e=4&I='%o&J=K=L=;=/$l%o&'%l%4&k=9*K& ", " z=M%I&M=N=l%'%Y%)%H$I$a%b%o&'%X%M=W%1&M%O=P=p=p=Q=R=m%I&)=U%k=Y%)%I$^&^&I$)%Y%k=v&^$I&o&<= ", " S='%v&T=^$e=(&'%Y%o&T*T*Y%M%m=J&U*U=P&k=V=W=p=p=X=>%W%i&Y=e=(&'%o&T*b%b%T*o&'%(&I&M=3&e=Z=`= ", " -X%>%.-1&^$J&(&m%,%M%M%'%(&U%4&H&+-2&4&@-#-p=p=$-e=P&%-`$^$J&m='%Y%Y%Y%Y%'%m=J&^$&-`$y&*-a$ ", " =-k=--;-3&1&^$e=U%X%(&X%l%e=J=W%y&>-Y=^$V#,-p=p='-^$v&)-3&1&J=J&X%k=k=k=k=X%J&J=1&!-)-H&e=~- ", " {-]-H&`$v&3&1&W%^$4&4&4&J=W%1&3&V%+-^-X%/-(-_-:-<-b*1&0=v&3&1&^$4&e=U%U%e=4&^$1&3&[-}-`$v&|- ", " 1-2-'%v&2&j&P&y&I&1&1&1&1&I&3-v&`$0*W%i&4-5-6-7-8-9-'%`$`$v&3&I&1&W%^$^$W%1&I&3&v&0-)=/&a-b- ", " c-d-X%(&/&4&e-e=J&J&J&e=e=4&4&/&k=M=f-g-h-i-j-k-l-a-'%m-j&H&V%3-3&I&I&3&3-V%H&x&P&e=f={- ", " n-o-p-q-r-s-s-s-s-s-s-s-t-u-v-w-x- P*y-z-A-M%Y%B-o&o&T*T*T*o&Y%C-f=D-E- ", " F-G-G-G-G-G-G-H-I-J-K- L-M-N-O-W*W*W*W*P-P-P-P-O-Q-b-R- ", " ", " "}; smuxi-1.1/src/Frontend-GNOME/ChatTypeWidget.cs0000644000175000017500000000431512726351313021751 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { [System.ComponentModel.ToolboxItem(true)] public partial class ChatTypeWidget : Gtk.Bin { private Gtk.ListStore f_ListStore; public ChatType ChatType { get { Gtk.TreeIter iter; f_ComboBox.GetActiveIter(out iter); return (ChatType) f_ListStore.GetValue(iter, 0); } } public ChatTypeWidget() { Build(); Init(); } private void Init() { f_ListStore = new Gtk.ListStore( typeof(ChatType), typeof(string) ); f_ListStore.AppendValues(ChatType.Person, _("Person / Private")); f_ListStore.AppendValues(ChatType.Group, _("Group / Public")); f_ListStore.SetSortColumnId(1, Gtk.SortType.Ascending); f_ComboBox.Clear(); Gtk.CellRenderer cell = new Gtk.CellRendererText(); f_ComboBox.PackStart(cell, false); f_ComboBox.AddAttribute(cell, "text", 1); f_ComboBox.Model = f_ListStore; f_ComboBox.Active = 0; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-GNOME/ThemeSettings.cs0000644000175000017500000001775312250426634021662 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; using System.IO; using System.Linq; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class ThemeSettings { private Gdk.Color? f_BackgroundColor; private Gdk.Color? f_ForegroundColor; private Pango.FontDescription f_FontDescription; private Gdk.Color f_HighlightColor; private Gdk.Color f_ActivityColor; private Gdk.Color f_NoActivityColor; private Gdk.Color f_EventColor; public Nullable BackgroundColor { get { return f_BackgroundColor; } } public Pango.FontDescription FontDescription { get { return f_FontDescription; } } public Nullable ForegroundColor { get { return f_ForegroundColor; } } public Gdk.Color ActivityColor { get { return f_ActivityColor; } } public Gdk.Color EventColor { get { return f_EventColor; } } public Gdk.Color HighlightColor { get { return f_HighlightColor; } } public Gdk.Color NoActivityColor { get { return f_NoActivityColor; } } public ThemeSettings() { } public ThemeSettings(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } string bgStr = (string) config["Interface/Chat/BackgroundColor"]; if (!String.IsNullOrEmpty(bgStr)) { Gdk.Color bgColor = Gdk.Color.Zero; if (Gdk.Color.Parse(bgStr, ref bgColor)) { f_BackgroundColor = bgColor; } } else { f_BackgroundColor = null; } string fgStr = (string) config["Interface/Chat/ForegroundColor"]; if (!String.IsNullOrEmpty(fgStr)) { Gdk.Color fgColor = Gdk.Color.Zero; if (Gdk.Color.Parse(fgStr, ref fgColor)) { f_ForegroundColor = fgColor; } } else { f_ForegroundColor = null; } string colorStr; Gdk.Color color; colorStr = (string) config["Interface/Notebook/Tab/HighlightColor"]; color = Gdk.Color.Zero; if (Gdk.Color.Parse(colorStr, ref color)) { f_HighlightColor = color; } colorStr = (string) config["Interface/Notebook/Tab/ActivityColor"]; color = Gdk.Color.Zero; if (Gdk.Color.Parse(colorStr, ref color)) { f_ActivityColor = color; } colorStr = (string) config["Interface/Notebook/Tab/NoActivityColor"]; color = Gdk.Color.Zero; if (Gdk.Color.Parse(colorStr, ref color)) { f_NoActivityColor = color; } colorStr = (string) config["Interface/Notebook/Tab/EventColor"]; color = Gdk.Color.Zero; if (Gdk.Color.Parse(colorStr, ref color)) { f_EventColor = color; } string fontFamily = (string) config["Interface/Chat/FontFamily"]; string fontStyle = (string) config["Interface/Chat/FontStyle"]; int fontSize = 0; if (config["Interface/Chat/FontSize"] != null) { fontSize = (int) config["Interface/Chat/FontSize"]; } Pango.FontDescription fontDescription = new Pango.FontDescription(); if (String.IsNullOrEmpty(fontFamily)) { // HACK: use Consolas or Fixed-Sys on Windows by default if (Environment.OSVersion.Platform == PlatformID.Win32NT) { var osVersion = Environment.OSVersion.Version; var isWinXp = osVersion.Major == 5 && osVersion.Minor > 0; var hasConsolas = false; using (var context = Frontend.MainWindow.CreatePangoContext()) { hasConsolas = context.Families.Any( family => family.Name == "Consolas" ); } if (hasConsolas && !isWinXp) { // this system has Consolas available and is not WinXP, // let's use it! fontDescription.Family = "Consolas, monospace"; // Consolas only looks good in size 11 fontDescription.Size = 11 * 1024; fontDescription.Weight = Pango.Weight.Normal; fontDescription.Style = Pango.Style.Normal; } else { // too bad, fallback to FixedSys then fontDescription.Family = "FixedsysTTF, monospace"; // FixedSys only looks good in size 11 fontDescription.Size = 11 * 1024; fontDescription.Weight = Pango.Weight.Bold; fontDescription.Style = Pango.Style.Normal; } } else if (Frontend.IsMacOSX) { // HACK: family font description with font fallbacks is not // working on OS X, thus we have to probe and decide ourself var ctx = Frontend.MainWindow.CreatePangoContext(); var families = ctx.Families; if (families.Any(family => family.Name == "Menlo")) { fontDescription.Family = "Menlo"; } else if (families.Any(family => family.Name == "Monaco")) { fontDescription.Family = "Monaco"; } else { fontDescription.Family = "monospace"; } } else { // use Monospace and Bold by default fontDescription.Family = "monospace"; // black bold font on white background looks odd //fontDescription.Weight = Pango.Weight.Bold; } } else { fontDescription.Family = fontFamily; string frontWeigth = null; if (fontStyle.Contains(" ")) { int pos = fontStyle.IndexOf(" "); frontWeigth = fontStyle.Substring(0, pos); fontStyle = fontStyle.Substring(pos + 1); } fontDescription.Style = (Pango.Style) Enum.Parse(typeof(Pango.Style), fontStyle); if (frontWeigth != null) { fontDescription.Weight = (Pango.Weight) Enum.Parse(typeof(Pango.Weight), frontWeigth); } fontDescription.Size = fontSize * 1024; } f_FontDescription = fontDescription; } } } smuxi-1.1/src/Frontend-GNOME/OpenChatDialog.cs0000644000175000017500000000356112726351313021707 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009 Mirco Bauer // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public partial class OpenChatDialog : Gtk.Dialog { public ChatType ChatType { get { return f_ChatTypeWidget.ChatType; } } public string ChatName { get { return f_NameEntry.Text; } } public OpenChatDialog(Gtk.Window parent) { Trace.Call(parent); if (parent == null) { throw new ArgumentNullException("parent"); } Build(); TransientFor = parent; f_NameEntry.Changed += OnNameEntryChanged; f_NameEntry.HasFocus = true; } protected virtual void OnNameEntryChanged(object sender, EventArgs e) { Trace.Call(sender, e); f_OpenButton.Sensitive = f_NameEntry.Text.Trim().Length > 0; } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/0000775000175000017500000000000014011526501020073 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs0000644000175000017500000025045712726351313031130 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class SteticPreferencesDialog { private global::Gtk.HBox hbox1; private global::Gtk.ScrolledWindow MenuScrolledWindow; private global::Gtk.TreeView MenuTreeView; private global::Gtk.Notebook Notebook; private global::Gtk.VBox vbox1; private global::Gtk.Table table1; private global::Gtk.Entry ConnectionNicknamesEntry; private global::Gtk.Entry ConnectionRealnameEntry; private global::Gtk.Entry ConnectionUsernameEntry; private global::Gtk.ComboBox EncodingComboBox; private global::Gtk.HBox hbox13; private global::Gtk.Label label6; private global::Gtk.Fixed fixed31; private global::Gtk.HBox hbox14; private global::Gtk.Label label7; private global::Gtk.Fixed fixed32; private global::Gtk.HBox hbox15; private global::Gtk.Label label8; private global::Gtk.Fixed fixed33; private global::Gtk.Label label58; private global::Gtk.VBox vbox2; private global::Gtk.VBox vbox3; private global::Gtk.HBox hbox2; private global::Gtk.Label label37; private global::Gtk.Fixed fixed18; private global::Gtk.ScrolledWindow scrolledwindow1; private global::Gtk.TextView OnConnectCommandsTextView; private global::Gtk.VBox vbox4; private global::Gtk.HBox hbox3; private global::Gtk.Label label43; private global::Gtk.Fixed fixed19; private global::Gtk.ScrolledWindow scrolledwindow2; private global::Gtk.TextView OnStartupCommandsTextView; private global::Gtk.Label label44; private global::Gtk.Notebook InterfaceNotebook; private global::Gtk.VBox vbox10; private global::Gtk.Table table5; private global::Gtk.SpinButton BufferLinesSpinButton; private global::Gtk.SpinButton EngineBufferLinesSpinButton; private global::Gtk.HBox hbox7; private global::Gtk.Label label33; private global::Gtk.Fixed fixed25; private global::Gtk.HBox hbox8; private global::Gtk.Label label39; private global::Gtk.Fixed fixed26; private global::Gtk.HBox hbox9; private global::Gtk.Label label40; private global::Gtk.Fixed fixed27; private global::Gtk.Entry TimestampFormatEntry; private global::Gtk.CheckButton StripColorsCheckButton; private global::Gtk.Alignment alignment16; private global::Gtk.HBox hbox17; private global::Gtk.Image image5; private global::Gtk.Label label47; private global::Gtk.CheckButton StripFormattingsCheckButton; private global::Gtk.Alignment alignment15; private global::Gtk.HBox hbox16; private global::Gtk.Image image6; private global::Gtk.Label label46; private global::Gtk.CheckButton checkbutton1; private global::Gtk.Alignment alignment26; private global::Gtk.HBox hbox28; private global::Gtk.Image image7; private global::Gtk.Label label60; private global::Gtk.Label label1; private global::Gtk.VBox vbox5; private global::Gtk.Frame frame1; private global::Gtk.Alignment alignment4; private global::Gtk.VBox vbox6; private global::Gtk.RadioButton TabPositionRadioButtonTop; private global::Gtk.HBox hbox10; private global::Gtk.Image image12; private global::Gtk.Label label5; private global::Gtk.RadioButton TabPositionRadioButtonBottom; private global::Gtk.HBox hbox24; private global::Gtk.Image image9; private global::Gtk.Label label54; private global::Gtk.RadioButton TabPositionRadioButtonLeft; private global::Gtk.Alignment alignment24; private global::Gtk.HBox hbox25; private global::Gtk.Image image10; private global::Gtk.Label label55; private global::Gtk.RadioButton TabPositionRadioButtonRight; private global::Gtk.Alignment alignment25; private global::Gtk.HBox hbox26; private global::Gtk.Image image11; private global::Gtk.Label label56; private global::Gtk.RadioButton TabPositionRadioButtonNone; private global::Gtk.Label label9; private global::Gtk.Frame frame4; private global::Gtk.Alignment alignment8; private global::Gtk.Table table3; private global::Gtk.ColorButton ActivityColorButton; private global::Gtk.ColorButton HighlightColorButton; private global::Gtk.Label label16; private global::Gtk.Label label17; private global::Gtk.Label label18; private global::Gtk.Label label59; private global::Gtk.ColorButton ModeColorButton; private global::Gtk.ColorButton NoActivityColorButton; private global::Gtk.Label label15; private global::Gtk.Label label2; private global::Gtk.Frame frame3; private global::Gtk.Alignment alignment7; private global::Gtk.VBox vbox7; private global::Gtk.Table table4; private global::Gtk.Entry CommandCharacterEntry; private global::Gtk.SpinButton CommandHistorySizeSpinButton; private global::Gtk.Entry CompletionCharacterEntry; private global::Gtk.HBox hbox4; private global::Gtk.Label label13; private global::Gtk.Fixed fixed22; private global::Gtk.HBox hbox5; private global::Gtk.Label label14; private global::Gtk.Fixed fixed23; private global::Gtk.HBox hbox6; private global::Gtk.Label label42; private global::Gtk.Fixed fixed24; private global::Gtk.CheckButton BashStyleCompletionCheckButton; private global::Gtk.Label label12; private global::Gtk.Label label3; private global::Gtk.VBox vbox8; private global::Gtk.Frame frame2; private global::Gtk.Alignment alignment5; private global::Gtk.VBox vbox9; private global::Gtk.CheckButton NickColorsCheckButton; private global::Gtk.Frame frame10; private global::Gtk.Alignment alignment14; private global::Gtk.VBox vbox11; private global::Gtk.RadioButton TopicPositionRadioButtonTop; private global::Gtk.Alignment alignment21; private global::Gtk.HBox hbox22; private global::Gtk.Image image1; private global::Gtk.Label label52; private global::Gtk.RadioButton TopicPositionRadioButtonBottom; private global::Gtk.Alignment alignment20; private global::Gtk.HBox hbox21; private global::Gtk.Image image2; private global::Gtk.Label label51; private global::Gtk.RadioButton TopicPositionRadioButtonNone; private global::Gtk.Label label41; private global::Gtk.Frame frame9; private global::Gtk.Alignment alignment13; private global::Gtk.VBox vbox12; private global::Gtk.RadioButton UserListPositionRadioButtonLeft; private global::Gtk.Alignment alignment17; private global::Gtk.HBox hbox18; private global::Gtk.Image image3; private global::Gtk.Label label48; private global::Gtk.RadioButton UserListPositionRadioButtonRight; private global::Gtk.Alignment alignment18; private global::Gtk.HBox hbox19; private global::Gtk.Image image4; private global::Gtk.Label label49; private global::Gtk.RadioButton UserListPositionRadioButtonNone; private global::Gtk.Label label38; private global::Gtk.Label label10; private global::Gtk.Frame frame11; private global::Gtk.Alignment alignment27; private global::Gtk.VBox vbox13; private global::Gtk.VBox vbox14; private global::Gtk.Label label62; private global::Gtk.ScrolledWindow scrolledwindow4; private global::Gtk.TextView HighlightWordsTextView; private global::Gtk.CheckButton BeepOnHighlightCheckButton; private global::Gtk.Label label61; private global::Gtk.Label label4; private global::Gtk.Label label45; private global::Gtk.HBox hbox27; private global::Gtk.ScrolledWindow scrolledwindow3; private global::Gtk.TreeView ServersTreeView; private global::Gtk.VButtonBox vbuttonbox1; private global::Gtk.Button ServersAddButton; private global::Gtk.Button ServersEditButton; private global::Gtk.Button ServersRemoveButton; private global::Gtk.Label label57; private global::Gtk.VBox vbox15; private global::Gtk.Frame frame12; private global::Gtk.Alignment alignment28; private global::Gtk.VBox vbox16; private global::Gtk.ScrolledWindow scrolledwindow5; private global::Gtk.TreeView ChannelFiltersTreeView; private global::Gtk.HButtonBox hbuttonbox1; private global::Gtk.Button ChannelFiltersAddButton; private global::Gtk.Button ChannelFiltersRemoveButton; private global::Gtk.Label label64; private global::Gtk.Frame frame13; private global::Gtk.Alignment alignment29; private global::Gtk.Label label65; private global::Gtk.Label label63; private global::Gtk.Button CancelButton; private global::Gtk.Button ApplyButton; private global::Gtk.Button OKButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.SteticPreferencesDialog this.Name = "Smuxi.Frontend.Gnome.SteticPreferencesDialog"; this.Title = global::Mono.Unix.Catalog.GetString ("Smuxi - Preferences"); this.TypeHint = ((global::Gdk.WindowTypeHint)(1)); // Internal child Smuxi.Frontend.Gnome.SteticPreferencesDialog.VBox global::Gtk.VBox w1 = this.VBox; w1.Name = "dialog-vbox1"; w1.BorderWidth = ((uint)(2)); // Container child dialog-vbox1.Gtk.Box+BoxChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; this.hbox1.BorderWidth = ((uint)(10)); // Container child hbox1.Gtk.Box+BoxChild this.MenuScrolledWindow = new global::Gtk.ScrolledWindow (); this.MenuScrolledWindow.WidthRequest = 128; this.MenuScrolledWindow.Name = "MenuScrolledWindow"; this.MenuScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child MenuScrolledWindow.Gtk.Container+ContainerChild this.MenuTreeView = new global::Gtk.TreeView (); this.MenuTreeView.Name = "MenuTreeView"; this.MenuTreeView.EnableSearch = false; this.MenuTreeView.HeadersVisible = false; this.MenuScrolledWindow.Add (this.MenuTreeView); this.hbox1.Add (this.MenuScrolledWindow); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.MenuScrolledWindow])); w3.Position = 0; w3.Expand = false; // Container child hbox1.Gtk.Box+BoxChild this.Notebook = new global::Gtk.Notebook (); this.Notebook.Name = "Notebook"; this.Notebook.CurrentPage = 0; this.Notebook.ShowBorder = false; // Container child Notebook.Gtk.Notebook+NotebookChild this.vbox1 = new global::Gtk.VBox (); this.vbox1.Name = "vbox1"; this.vbox1.Spacing = 5; this.vbox1.BorderWidth = ((uint)(5)); // Container child vbox1.Gtk.Box+BoxChild this.table1 = new global::Gtk.Table (((uint)(4)), ((uint)(2)), false); this.table1.Name = "table1"; this.table1.RowSpacing = ((uint)(5)); this.table1.ColumnSpacing = ((uint)(5)); // Container child table1.Gtk.Table+TableChild this.ConnectionNicknamesEntry = new global::Gtk.Entry (); this.ConnectionNicknamesEntry.Name = "ConnectionNicknamesEntry"; this.ConnectionNicknamesEntry.IsEditable = true; this.ConnectionNicknamesEntry.InvisibleChar = '●'; this.table1.Add (this.ConnectionNicknamesEntry); global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1 [this.ConnectionNicknamesEntry])); w4.LeftAttach = ((uint)(1)); w4.RightAttach = ((uint)(2)); w4.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table1.Gtk.Table+TableChild this.ConnectionRealnameEntry = new global::Gtk.Entry (); this.ConnectionRealnameEntry.Name = "ConnectionRealnameEntry"; this.ConnectionRealnameEntry.IsEditable = true; this.ConnectionRealnameEntry.InvisibleChar = '●'; this.table1.Add (this.ConnectionRealnameEntry); global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1 [this.ConnectionRealnameEntry])); w5.TopAttach = ((uint)(2)); w5.BottomAttach = ((uint)(3)); w5.LeftAttach = ((uint)(1)); w5.RightAttach = ((uint)(2)); w5.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table1.Gtk.Table+TableChild this.ConnectionUsernameEntry = new global::Gtk.Entry (); this.ConnectionUsernameEntry.Name = "ConnectionUsernameEntry"; this.ConnectionUsernameEntry.IsEditable = true; this.ConnectionUsernameEntry.InvisibleChar = '●'; this.table1.Add (this.ConnectionUsernameEntry); global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table1 [this.ConnectionUsernameEntry])); w6.TopAttach = ((uint)(1)); w6.BottomAttach = ((uint)(2)); w6.LeftAttach = ((uint)(1)); w6.RightAttach = ((uint)(2)); w6.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table1.Gtk.Table+TableChild this.EncodingComboBox = new global::Gtk.ComboBox (); this.EncodingComboBox.Name = "EncodingComboBox"; this.table1.Add (this.EncodingComboBox); global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table1 [this.EncodingComboBox])); w7.TopAttach = ((uint)(3)); w7.BottomAttach = ((uint)(4)); w7.LeftAttach = ((uint)(1)); w7.RightAttach = ((uint)(2)); // Container child table1.Gtk.Table+TableChild this.hbox13 = new global::Gtk.HBox (); this.hbox13.Name = "hbox13"; // Container child hbox13.Gtk.Box+BoxChild this.label6 = new global::Gtk.Label (); this.label6.Name = "label6"; this.label6.LabelProp = global::Mono.Unix.Catalog.GetString ("Nicknames:"); this.hbox13.Add (this.label6); global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.hbox13 [this.label6])); w8.Position = 0; w8.Expand = false; w8.Fill = false; // Container child hbox13.Gtk.Box+BoxChild this.fixed31 = new global::Gtk.Fixed (); this.fixed31.Name = "fixed31"; this.fixed31.HasWindow = false; this.hbox13.Add (this.fixed31); global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox13 [this.fixed31])); w9.Position = 1; this.table1.Add (this.hbox13); // Container child table1.Gtk.Table+TableChild this.hbox14 = new global::Gtk.HBox (); this.hbox14.Name = "hbox14"; // Container child hbox14.Gtk.Box+BoxChild this.label7 = new global::Gtk.Label (); this.label7.Name = "label7"; this.label7.LabelProp = global::Mono.Unix.Catalog.GetString ("Username:"); this.hbox14.Add (this.label7); global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox14 [this.label7])); w11.Position = 0; w11.Expand = false; w11.Fill = false; // Container child hbox14.Gtk.Box+BoxChild this.fixed32 = new global::Gtk.Fixed (); this.fixed32.Name = "fixed32"; this.fixed32.HasWindow = false; this.hbox14.Add (this.fixed32); global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.hbox14 [this.fixed32])); w12.Position = 1; this.table1.Add (this.hbox14); global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.table1 [this.hbox14])); w13.TopAttach = ((uint)(1)); w13.BottomAttach = ((uint)(2)); // Container child table1.Gtk.Table+TableChild this.hbox15 = new global::Gtk.HBox (); this.hbox15.Name = "hbox15"; // Container child hbox15.Gtk.Box+BoxChild this.label8 = new global::Gtk.Label (); this.label8.Name = "label8"; this.label8.LabelProp = global::Mono.Unix.Catalog.GetString ("Realname:"); this.hbox15.Add (this.label8); global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.hbox15 [this.label8])); w14.Position = 0; w14.Expand = false; w14.Fill = false; // Container child hbox15.Gtk.Box+BoxChild this.fixed33 = new global::Gtk.Fixed (); this.fixed33.Name = "fixed33"; this.fixed33.HasWindow = false; this.hbox15.Add (this.fixed33); global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.hbox15 [this.fixed33])); w15.Position = 1; this.table1.Add (this.hbox15); global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.table1 [this.hbox15])); w16.TopAttach = ((uint)(2)); w16.BottomAttach = ((uint)(3)); // Container child table1.Gtk.Table+TableChild this.label58 = new global::Gtk.Label (); this.label58.Name = "label58"; this.label58.Xalign = 0F; this.label58.LabelProp = global::Mono.Unix.Catalog.GetString ("Encoding:"); this.table1.Add (this.label58); global::Gtk.Table.TableChild w17 = ((global::Gtk.Table.TableChild)(this.table1 [this.label58])); w17.TopAttach = ((uint)(3)); w17.BottomAttach = ((uint)(4)); w17.YOptions = ((global::Gtk.AttachOptions)(0)); this.vbox1.Add (this.table1); global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.table1])); w18.Position = 0; w18.Expand = false; // Container child vbox1.Gtk.Box+BoxChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; // Container child vbox2.Gtk.Box+BoxChild this.vbox3 = new global::Gtk.VBox (); this.vbox3.Name = "vbox3"; // Container child vbox3.Gtk.Box+BoxChild this.hbox2 = new global::Gtk.HBox (); this.hbox2.Name = "hbox2"; // Container child hbox2.Gtk.Box+BoxChild this.label37 = new global::Gtk.Label (); this.label37.Name = "label37"; this.label37.LabelProp = global::Mono.Unix.Catalog.GetString ("On Connect Commands:"); this.hbox2.Add (this.label37); global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.label37])); w19.Position = 0; w19.Expand = false; w19.Fill = false; // Container child hbox2.Gtk.Box+BoxChild this.fixed18 = new global::Gtk.Fixed (); this.fixed18.Name = "fixed18"; this.fixed18.HasWindow = false; this.hbox2.Add (this.fixed18); global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.fixed18])); w20.Position = 1; this.vbox3.Add (this.hbox2); global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox2])); w21.Position = 0; w21.Expand = false; w21.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.scrolledwindow1 = new global::Gtk.ScrolledWindow (); this.scrolledwindow1.WidthRequest = 350; this.scrolledwindow1.HeightRequest = 100; this.scrolledwindow1.Name = "scrolledwindow1"; this.scrolledwindow1.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow1.Gtk.Container+ContainerChild this.OnConnectCommandsTextView = new global::Gtk.TextView (); this.OnConnectCommandsTextView.WidthRequest = 152; this.OnConnectCommandsTextView.HeightRequest = 168; this.OnConnectCommandsTextView.Name = "OnConnectCommandsTextView"; this.OnConnectCommandsTextView.WrapMode = ((global::Gtk.WrapMode)(2)); this.scrolledwindow1.Add (this.OnConnectCommandsTextView); this.vbox3.Add (this.scrolledwindow1); global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.scrolledwindow1])); w23.Position = 1; this.vbox2.Add (this.vbox3); global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox3])); w24.Position = 0; // Container child vbox2.Gtk.Box+BoxChild this.vbox4 = new global::Gtk.VBox (); this.vbox4.Name = "vbox4"; // Container child vbox4.Gtk.Box+BoxChild this.hbox3 = new global::Gtk.HBox (); this.hbox3.Name = "hbox3"; // Container child hbox3.Gtk.Box+BoxChild this.label43 = new global::Gtk.Label (); this.label43.Name = "label43"; this.label43.LabelProp = global::Mono.Unix.Catalog.GetString ("On Startup Commands:"); this.hbox3.Add (this.label43); global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.label43])); w25.Position = 0; w25.Expand = false; w25.Fill = false; // Container child hbox3.Gtk.Box+BoxChild this.fixed19 = new global::Gtk.Fixed (); this.fixed19.Name = "fixed19"; this.fixed19.HasWindow = false; this.hbox3.Add (this.fixed19); global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.fixed19])); w26.Position = 1; this.vbox4.Add (this.hbox3); global::Gtk.Box.BoxChild w27 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.hbox3])); w27.Position = 0; w27.Expand = false; w27.Fill = false; // Container child vbox4.Gtk.Box+BoxChild this.scrolledwindow2 = new global::Gtk.ScrolledWindow (); this.scrolledwindow2.WidthRequest = 350; this.scrolledwindow2.HeightRequest = 100; this.scrolledwindow2.Name = "scrolledwindow2"; this.scrolledwindow2.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow2.Gtk.Container+ContainerChild this.OnStartupCommandsTextView = new global::Gtk.TextView (); this.OnStartupCommandsTextView.WidthRequest = 152; this.OnStartupCommandsTextView.HeightRequest = 168; this.OnStartupCommandsTextView.Name = "OnStartupCommandsTextView"; this.OnStartupCommandsTextView.WrapMode = ((global::Gtk.WrapMode)(2)); this.scrolledwindow2.Add (this.OnStartupCommandsTextView); this.vbox4.Add (this.scrolledwindow2); global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.scrolledwindow2])); w29.Position = 1; this.vbox2.Add (this.vbox4); global::Gtk.Box.BoxChild w30 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox4])); w30.Position = 1; this.vbox1.Add (this.vbox2); global::Gtk.Box.BoxChild w31 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.vbox2])); w31.Position = 1; this.Notebook.Add (this.vbox1); // Notebook tab this.label44 = new global::Gtk.Label (); this.label44.Name = "label44"; this.label44.LabelProp = global::Mono.Unix.Catalog.GetString ("C_onnection"); this.label44.UseUnderline = true; this.Notebook.SetTabLabel (this.vbox1, this.label44); this.label44.ShowAll (); // Container child Notebook.Gtk.Notebook+NotebookChild this.InterfaceNotebook = new global::Gtk.Notebook (); this.InterfaceNotebook.Name = "InterfaceNotebook"; this.InterfaceNotebook.CurrentPage = 0; // Container child InterfaceNotebook.Gtk.Notebook+NotebookChild this.vbox10 = new global::Gtk.VBox (); this.vbox10.Name = "vbox10"; // Container child vbox10.Gtk.Box+BoxChild this.table5 = new global::Gtk.Table (((uint)(3)), ((uint)(2)), false); this.table5.Name = "table5"; this.table5.RowSpacing = ((uint)(5)); this.table5.ColumnSpacing = ((uint)(5)); this.table5.BorderWidth = ((uint)(5)); // Container child table5.Gtk.Table+TableChild this.BufferLinesSpinButton = new global::Gtk.SpinButton (1, 9999, 1); this.BufferLinesSpinButton.WidthRequest = 60; this.BufferLinesSpinButton.Name = "BufferLinesSpinButton"; this.BufferLinesSpinButton.Adjustment.PageIncrement = 10; this.BufferLinesSpinButton.Adjustment.PageSize = 10; this.BufferLinesSpinButton.ClimbRate = 1; this.BufferLinesSpinButton.Numeric = true; this.BufferLinesSpinButton.Value = 200; this.table5.Add (this.BufferLinesSpinButton); global::Gtk.Table.TableChild w33 = ((global::Gtk.Table.TableChild)(this.table5 [this.BufferLinesSpinButton])); w33.TopAttach = ((uint)(1)); w33.BottomAttach = ((uint)(2)); w33.LeftAttach = ((uint)(1)); w33.RightAttach = ((uint)(2)); w33.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table5.Gtk.Table+TableChild this.EngineBufferLinesSpinButton = new global::Gtk.SpinButton (0, 9999, 1); this.EngineBufferLinesSpinButton.WidthRequest = 60; this.EngineBufferLinesSpinButton.Name = "EngineBufferLinesSpinButton"; this.EngineBufferLinesSpinButton.Adjustment.PageIncrement = 10; this.EngineBufferLinesSpinButton.Adjustment.PageSize = 10; this.EngineBufferLinesSpinButton.ClimbRate = 1; this.EngineBufferLinesSpinButton.Numeric = true; this.EngineBufferLinesSpinButton.Value = 200; this.table5.Add (this.EngineBufferLinesSpinButton); global::Gtk.Table.TableChild w34 = ((global::Gtk.Table.TableChild)(this.table5 [this.EngineBufferLinesSpinButton])); w34.TopAttach = ((uint)(2)); w34.BottomAttach = ((uint)(3)); w34.LeftAttach = ((uint)(1)); w34.RightAttach = ((uint)(2)); w34.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table5.Gtk.Table+TableChild this.hbox7 = new global::Gtk.HBox (); this.hbox7.Name = "hbox7"; // Container child hbox7.Gtk.Box+BoxChild this.label33 = new global::Gtk.Label (); this.label33.Name = "label33"; this.label33.LabelProp = global::Mono.Unix.Catalog.GetString ("Timestamp Format:"); this.hbox7.Add (this.label33); global::Gtk.Box.BoxChild w35 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.label33])); w35.Position = 0; w35.Expand = false; w35.Fill = false; // Container child hbox7.Gtk.Box+BoxChild this.fixed25 = new global::Gtk.Fixed (); this.fixed25.Name = "fixed25"; this.fixed25.HasWindow = false; this.hbox7.Add (this.fixed25); global::Gtk.Box.BoxChild w36 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.fixed25])); w36.Position = 1; this.table5.Add (this.hbox7); // Container child table5.Gtk.Table+TableChild this.hbox8 = new global::Gtk.HBox (); this.hbox8.Name = "hbox8"; // Container child hbox8.Gtk.Box+BoxChild this.label39 = new global::Gtk.Label (); this.label39.Name = "label39"; this.label39.LabelProp = global::Mono.Unix.Catalog.GetString ("Buffer Lines:"); this.hbox8.Add (this.label39); global::Gtk.Box.BoxChild w38 = ((global::Gtk.Box.BoxChild)(this.hbox8 [this.label39])); w38.Position = 0; w38.Expand = false; w38.Fill = false; // Container child hbox8.Gtk.Box+BoxChild this.fixed26 = new global::Gtk.Fixed (); this.fixed26.Name = "fixed26"; this.fixed26.HasWindow = false; this.hbox8.Add (this.fixed26); global::Gtk.Box.BoxChild w39 = ((global::Gtk.Box.BoxChild)(this.hbox8 [this.fixed26])); w39.Position = 1; this.table5.Add (this.hbox8); global::Gtk.Table.TableChild w40 = ((global::Gtk.Table.TableChild)(this.table5 [this.hbox8])); w40.TopAttach = ((uint)(1)); w40.BottomAttach = ((uint)(2)); // Container child table5.Gtk.Table+TableChild this.hbox9 = new global::Gtk.HBox (); this.hbox9.Name = "hbox9"; // Container child hbox9.Gtk.Box+BoxChild this.label40 = new global::Gtk.Label (); this.label40.Name = "label40"; this.label40.LabelProp = global::Mono.Unix.Catalog.GetString ("Engine Buffer Lines:"); this.hbox9.Add (this.label40); global::Gtk.Box.BoxChild w41 = ((global::Gtk.Box.BoxChild)(this.hbox9 [this.label40])); w41.Position = 0; w41.Expand = false; w41.Fill = false; // Container child hbox9.Gtk.Box+BoxChild this.fixed27 = new global::Gtk.Fixed (); this.fixed27.Name = "fixed27"; this.fixed27.HasWindow = false; this.hbox9.Add (this.fixed27); global::Gtk.Box.BoxChild w42 = ((global::Gtk.Box.BoxChild)(this.hbox9 [this.fixed27])); w42.Position = 1; this.table5.Add (this.hbox9); global::Gtk.Table.TableChild w43 = ((global::Gtk.Table.TableChild)(this.table5 [this.hbox9])); w43.TopAttach = ((uint)(2)); w43.BottomAttach = ((uint)(3)); // Container child table5.Gtk.Table+TableChild this.TimestampFormatEntry = new global::Gtk.Entry (); this.TimestampFormatEntry.WidthRequest = 60; this.TimestampFormatEntry.Name = "TimestampFormatEntry"; this.TimestampFormatEntry.Text = "HH:mm"; this.TimestampFormatEntry.IsEditable = true; this.TimestampFormatEntry.InvisibleChar = '●'; this.table5.Add (this.TimestampFormatEntry); global::Gtk.Table.TableChild w44 = ((global::Gtk.Table.TableChild)(this.table5 [this.TimestampFormatEntry])); w44.LeftAttach = ((uint)(1)); w44.RightAttach = ((uint)(2)); w44.YOptions = ((global::Gtk.AttachOptions)(0)); this.vbox10.Add (this.table5); global::Gtk.Box.BoxChild w45 = ((global::Gtk.Box.BoxChild)(this.vbox10 [this.table5])); w45.Position = 0; w45.Expand = false; w45.Fill = false; // Container child vbox10.Gtk.Box+BoxChild this.StripColorsCheckButton = new global::Gtk.CheckButton (); this.StripColorsCheckButton.Name = "StripColorsCheckButton"; this.StripColorsCheckButton.DrawIndicator = true; this.StripColorsCheckButton.UseUnderline = true; this.StripColorsCheckButton.Remove (this.StripColorsCheckButton.Child); // Container child StripColorsCheckButton.Gtk.Container+ContainerChild this.alignment16 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment16.Name = "alignment16"; // Container child alignment16.Gtk.Container+ContainerChild this.hbox17 = new global::Gtk.HBox (); this.hbox17.Name = "hbox17"; this.hbox17.Spacing = 2; // Container child hbox17.Gtk.Box+BoxChild this.image5 = new global::Gtk.Image (); this.image5.Name = "image5"; this.image5.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-cut", global::Gtk.IconSize.Menu); this.hbox17.Add (this.image5); global::Gtk.Box.BoxChild w46 = ((global::Gtk.Box.BoxChild)(this.hbox17 [this.image5])); w46.Position = 0; w46.Expand = false; w46.Fill = false; // Container child hbox17.Gtk.Box+BoxChild this.label47 = new global::Gtk.Label (); this.label47.Name = "label47"; this.label47.LabelProp = global::Mono.Unix.Catalog.GetString ("Strip Colors"); this.label47.UseUnderline = true; this.hbox17.Add (this.label47); global::Gtk.Box.BoxChild w47 = ((global::Gtk.Box.BoxChild)(this.hbox17 [this.label47])); w47.Position = 1; w47.Expand = false; w47.Fill = false; this.alignment16.Add (this.hbox17); this.StripColorsCheckButton.Add (this.alignment16); this.vbox10.Add (this.StripColorsCheckButton); global::Gtk.Box.BoxChild w50 = ((global::Gtk.Box.BoxChild)(this.vbox10 [this.StripColorsCheckButton])); w50.Position = 1; w50.Expand = false; w50.Fill = false; // Container child vbox10.Gtk.Box+BoxChild this.StripFormattingsCheckButton = new global::Gtk.CheckButton (); this.StripFormattingsCheckButton.Name = "StripFormattingsCheckButton"; this.StripFormattingsCheckButton.DrawIndicator = true; this.StripFormattingsCheckButton.UseUnderline = true; this.StripFormattingsCheckButton.Remove (this.StripFormattingsCheckButton.Child); // Container child StripFormattingsCheckButton.Gtk.Container+ContainerChild this.alignment15 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment15.Name = "alignment15"; // Container child alignment15.Gtk.Container+ContainerChild this.hbox16 = new global::Gtk.HBox (); this.hbox16.Name = "hbox16"; this.hbox16.Spacing = 2; // Container child hbox16.Gtk.Box+BoxChild this.image6 = new global::Gtk.Image (); this.image6.Name = "image6"; this.image6.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-cut", global::Gtk.IconSize.Menu); this.hbox16.Add (this.image6); global::Gtk.Box.BoxChild w51 = ((global::Gtk.Box.BoxChild)(this.hbox16 [this.image6])); w51.Position = 0; w51.Expand = false; w51.Fill = false; // Container child hbox16.Gtk.Box+BoxChild this.label46 = new global::Gtk.Label (); this.label46.Name = "label46"; this.label46.LabelProp = global::Mono.Unix.Catalog.GetString ("Strip Formattings"); this.label46.UseUnderline = true; this.hbox16.Add (this.label46); global::Gtk.Box.BoxChild w52 = ((global::Gtk.Box.BoxChild)(this.hbox16 [this.label46])); w52.Position = 1; w52.Expand = false; w52.Fill = false; this.alignment15.Add (this.hbox16); this.StripFormattingsCheckButton.Add (this.alignment15); this.vbox10.Add (this.StripFormattingsCheckButton); global::Gtk.Box.BoxChild w55 = ((global::Gtk.Box.BoxChild)(this.vbox10 [this.StripFormattingsCheckButton])); w55.Position = 2; w55.Expand = false; w55.Fill = false; // Container child vbox10.Gtk.Box+BoxChild this.checkbutton1 = new global::Gtk.CheckButton (); this.checkbutton1.Sensitive = false; this.checkbutton1.Name = "checkbutton1"; this.checkbutton1.DrawIndicator = true; this.checkbutton1.UseUnderline = true; this.checkbutton1.Remove (this.checkbutton1.Child); // Container child checkbutton1.Gtk.Container+ContainerChild this.alignment26 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment26.Name = "alignment26"; // Container child alignment26.Gtk.Container+ContainerChild this.hbox28 = new global::Gtk.HBox (); this.hbox28.Name = "hbox28"; this.hbox28.Spacing = 2; // Container child hbox28.Gtk.Box+BoxChild this.image7 = new global::Gtk.Image (); this.image7.Name = "image7"; this.image7.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-cut", global::Gtk.IconSize.Menu); this.hbox28.Add (this.image7); global::Gtk.Box.BoxChild w56 = ((global::Gtk.Box.BoxChild)(this.hbox28 [this.image7])); w56.Position = 0; w56.Expand = false; w56.Fill = false; // Container child hbox28.Gtk.Box+BoxChild this.label60 = new global::Gtk.Label (); this.label60.Name = "label60"; this.label60.LabelProp = global::Mono.Unix.Catalog.GetString ("Strip UTF-8"); this.label60.UseUnderline = true; this.hbox28.Add (this.label60); global::Gtk.Box.BoxChild w57 = ((global::Gtk.Box.BoxChild)(this.hbox28 [this.label60])); w57.Position = 1; w57.Expand = false; w57.Fill = false; this.alignment26.Add (this.hbox28); this.checkbutton1.Add (this.alignment26); this.vbox10.Add (this.checkbutton1); global::Gtk.Box.BoxChild w60 = ((global::Gtk.Box.BoxChild)(this.vbox10 [this.checkbutton1])); w60.Position = 3; w60.Expand = false; w60.Fill = false; this.InterfaceNotebook.Add (this.vbox10); // Notebook tab this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("General"); this.InterfaceNotebook.SetTabLabel (this.vbox10, this.label1); this.label1.ShowAll (); // Container child InterfaceNotebook.Gtk.Notebook+NotebookChild this.vbox5 = new global::Gtk.VBox (); this.vbox5.Name = "vbox5"; this.vbox5.Spacing = 5; // Container child vbox5.Gtk.Box+BoxChild this.frame1 = new global::Gtk.Frame (); this.frame1.Name = "frame1"; // Container child frame1.Gtk.Container+ContainerChild this.alignment4 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment4.Name = "alignment4"; this.alignment4.LeftPadding = ((uint)(12)); // Container child alignment4.Gtk.Container+ContainerChild this.vbox6 = new global::Gtk.VBox (); this.vbox6.Name = "vbox6"; // Container child vbox6.Gtk.Box+BoxChild this.TabPositionRadioButtonTop = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Top")); this.TabPositionRadioButtonTop.CanFocus = true; this.TabPositionRadioButtonTop.Name = "TabPositionRadioButtonTop"; this.TabPositionRadioButtonTop.Active = true; this.TabPositionRadioButtonTop.DrawIndicator = true; this.TabPositionRadioButtonTop.UseUnderline = true; this.TabPositionRadioButtonTop.Group = new global::GLib.SList (global::System.IntPtr.Zero); this.TabPositionRadioButtonTop.Remove (this.TabPositionRadioButtonTop.Child); // Container child TabPositionRadioButtonTop.Gtk.Container+ContainerChild this.hbox10 = new global::Gtk.HBox (); this.hbox10.Name = "hbox10"; this.hbox10.Spacing = 6; // Container child hbox10.Gtk.Box+BoxChild this.image12 = new global::Gtk.Image (); this.image12.Name = "image12"; this.image12.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-top", global::Gtk.IconSize.Menu); this.hbox10.Add (this.image12); global::Gtk.Box.BoxChild w62 = ((global::Gtk.Box.BoxChild)(this.hbox10 [this.image12])); w62.Position = 0; w62.Expand = false; w62.Fill = false; // Container child hbox10.Gtk.Box+BoxChild this.label5 = new global::Gtk.Label (); this.label5.Name = "label5"; this.label5.LabelProp = global::Mono.Unix.Catalog.GetString ("Top"); this.hbox10.Add (this.label5); global::Gtk.Box.BoxChild w63 = ((global::Gtk.Box.BoxChild)(this.hbox10 [this.label5])); w63.Position = 1; w63.Expand = false; w63.Fill = false; this.TabPositionRadioButtonTop.Add (this.hbox10); this.vbox6.Add (this.TabPositionRadioButtonTop); global::Gtk.Box.BoxChild w65 = ((global::Gtk.Box.BoxChild)(this.vbox6 [this.TabPositionRadioButtonTop])); w65.Position = 0; w65.Expand = false; w65.Fill = false; // Container child vbox6.Gtk.Box+BoxChild this.TabPositionRadioButtonBottom = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Bottom")); this.TabPositionRadioButtonBottom.Name = "TabPositionRadioButtonBottom"; this.TabPositionRadioButtonBottom.DrawIndicator = true; this.TabPositionRadioButtonBottom.UseUnderline = true; this.TabPositionRadioButtonBottom.Group = this.TabPositionRadioButtonTop.Group; this.TabPositionRadioButtonBottom.Remove (this.TabPositionRadioButtonBottom.Child); // Container child TabPositionRadioButtonBottom.Gtk.Container+ContainerChild this.hbox24 = new global::Gtk.HBox (); this.hbox24.Name = "hbox24"; this.hbox24.Spacing = 2; // Container child hbox24.Gtk.Box+BoxChild this.image9 = new global::Gtk.Image (); this.image9.Name = "image9"; this.image9.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-bottom", global::Gtk.IconSize.Menu); this.hbox24.Add (this.image9); global::Gtk.Box.BoxChild w66 = ((global::Gtk.Box.BoxChild)(this.hbox24 [this.image9])); w66.Position = 0; w66.Expand = false; w66.Fill = false; // Container child hbox24.Gtk.Box+BoxChild this.label54 = new global::Gtk.Label (); this.label54.Name = "label54"; this.label54.LabelProp = global::Mono.Unix.Catalog.GetString ("Bottom"); this.label54.UseUnderline = true; this.hbox24.Add (this.label54); global::Gtk.Box.BoxChild w67 = ((global::Gtk.Box.BoxChild)(this.hbox24 [this.label54])); w67.Position = 1; w67.Expand = false; w67.Fill = false; this.TabPositionRadioButtonBottom.Add (this.hbox24); this.vbox6.Add (this.TabPositionRadioButtonBottom); global::Gtk.Box.BoxChild w69 = ((global::Gtk.Box.BoxChild)(this.vbox6 [this.TabPositionRadioButtonBottom])); w69.Position = 1; w69.Expand = false; w69.Fill = false; // Container child vbox6.Gtk.Box+BoxChild this.TabPositionRadioButtonLeft = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Left")); this.TabPositionRadioButtonLeft.Name = "TabPositionRadioButtonLeft"; this.TabPositionRadioButtonLeft.DrawIndicator = true; this.TabPositionRadioButtonLeft.UseUnderline = true; this.TabPositionRadioButtonLeft.Group = this.TabPositionRadioButtonTop.Group; this.TabPositionRadioButtonLeft.Remove (this.TabPositionRadioButtonLeft.Child); // Container child TabPositionRadioButtonLeft.Gtk.Container+ContainerChild this.alignment24 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment24.Name = "alignment24"; // Container child alignment24.Gtk.Container+ContainerChild this.hbox25 = new global::Gtk.HBox (); this.hbox25.Name = "hbox25"; this.hbox25.Spacing = 2; // Container child hbox25.Gtk.Box+BoxChild this.image10 = new global::Gtk.Image (); this.image10.Name = "image10"; this.image10.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-first", global::Gtk.IconSize.Menu); this.hbox25.Add (this.image10); global::Gtk.Box.BoxChild w70 = ((global::Gtk.Box.BoxChild)(this.hbox25 [this.image10])); w70.Position = 0; w70.Expand = false; w70.Fill = false; // Container child hbox25.Gtk.Box+BoxChild this.label55 = new global::Gtk.Label (); this.label55.Name = "label55"; this.label55.LabelProp = global::Mono.Unix.Catalog.GetString ("Left"); this.label55.UseUnderline = true; this.hbox25.Add (this.label55); global::Gtk.Box.BoxChild w71 = ((global::Gtk.Box.BoxChild)(this.hbox25 [this.label55])); w71.Position = 1; w71.Expand = false; w71.Fill = false; this.alignment24.Add (this.hbox25); this.TabPositionRadioButtonLeft.Add (this.alignment24); this.vbox6.Add (this.TabPositionRadioButtonLeft); global::Gtk.Box.BoxChild w74 = ((global::Gtk.Box.BoxChild)(this.vbox6 [this.TabPositionRadioButtonLeft])); w74.Position = 2; w74.Expand = false; w74.Fill = false; // Container child vbox6.Gtk.Box+BoxChild this.TabPositionRadioButtonRight = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Right")); this.TabPositionRadioButtonRight.Name = "TabPositionRadioButtonRight"; this.TabPositionRadioButtonRight.DrawIndicator = true; this.TabPositionRadioButtonRight.UseUnderline = true; this.TabPositionRadioButtonRight.Group = this.TabPositionRadioButtonTop.Group; this.TabPositionRadioButtonRight.Remove (this.TabPositionRadioButtonRight.Child); // Container child TabPositionRadioButtonRight.Gtk.Container+ContainerChild this.alignment25 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment25.Name = "alignment25"; // Container child alignment25.Gtk.Container+ContainerChild this.hbox26 = new global::Gtk.HBox (); this.hbox26.Name = "hbox26"; this.hbox26.Spacing = 2; // Container child hbox26.Gtk.Box+BoxChild this.image11 = new global::Gtk.Image (); this.image11.Name = "image11"; this.image11.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-last", global::Gtk.IconSize.Menu); this.hbox26.Add (this.image11); global::Gtk.Box.BoxChild w75 = ((global::Gtk.Box.BoxChild)(this.hbox26 [this.image11])); w75.Position = 0; w75.Expand = false; w75.Fill = false; // Container child hbox26.Gtk.Box+BoxChild this.label56 = new global::Gtk.Label (); this.label56.Name = "label56"; this.label56.LabelProp = global::Mono.Unix.Catalog.GetString ("Right"); this.label56.UseUnderline = true; this.hbox26.Add (this.label56); global::Gtk.Box.BoxChild w76 = ((global::Gtk.Box.BoxChild)(this.hbox26 [this.label56])); w76.Position = 1; w76.Expand = false; w76.Fill = false; this.alignment25.Add (this.hbox26); this.TabPositionRadioButtonRight.Add (this.alignment25); this.vbox6.Add (this.TabPositionRadioButtonRight); global::Gtk.Box.BoxChild w79 = ((global::Gtk.Box.BoxChild)(this.vbox6 [this.TabPositionRadioButtonRight])); w79.Position = 3; w79.Expand = false; w79.Fill = false; // Container child vbox6.Gtk.Box+BoxChild this.TabPositionRadioButtonNone = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("None")); this.TabPositionRadioButtonNone.Name = "TabPositionRadioButtonNone"; this.TabPositionRadioButtonNone.DrawIndicator = true; this.TabPositionRadioButtonNone.UseUnderline = true; this.TabPositionRadioButtonNone.Group = this.TabPositionRadioButtonTop.Group; this.vbox6.Add (this.TabPositionRadioButtonNone); global::Gtk.Box.BoxChild w80 = ((global::Gtk.Box.BoxChild)(this.vbox6 [this.TabPositionRadioButtonNone])); w80.Position = 4; w80.Expand = false; w80.Fill = false; this.alignment4.Add (this.vbox6); this.frame1.Add (this.alignment4); this.label9 = new global::Gtk.Label (); this.label9.Name = "label9"; this.label9.LabelProp = global::Mono.Unix.Catalog.GetString (" Tabs Position "); this.label9.UseMarkup = true; this.frame1.LabelWidget = this.label9; this.vbox5.Add (this.frame1); global::Gtk.Box.BoxChild w83 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.frame1])); w83.Position = 0; w83.Expand = false; // Container child vbox5.Gtk.Box+BoxChild this.frame4 = new global::Gtk.Frame (); this.frame4.Name = "frame4"; // Container child frame4.Gtk.Container+ContainerChild this.alignment8 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment8.Name = "alignment8"; this.alignment8.LeftPadding = ((uint)(12)); // Container child alignment8.Gtk.Container+ContainerChild this.table3 = new global::Gtk.Table (((uint)(4)), ((uint)(2)), false); this.table3.Name = "table3"; this.table3.RowSpacing = ((uint)(5)); this.table3.ColumnSpacing = ((uint)(5)); // Container child table3.Gtk.Table+TableChild this.ActivityColorButton = new global::Gtk.ColorButton (); this.ActivityColorButton.Name = "ActivityColorButton"; this.table3.Add (this.ActivityColorButton); global::Gtk.Table.TableChild w84 = ((global::Gtk.Table.TableChild)(this.table3 [this.ActivityColorButton])); w84.TopAttach = ((uint)(1)); w84.BottomAttach = ((uint)(2)); w84.LeftAttach = ((uint)(1)); w84.RightAttach = ((uint)(2)); w84.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.HighlightColorButton = new global::Gtk.ColorButton (); this.HighlightColorButton.Name = "HighlightColorButton"; this.table3.Add (this.HighlightColorButton); global::Gtk.Table.TableChild w85 = ((global::Gtk.Table.TableChild)(this.table3 [this.HighlightColorButton])); w85.TopAttach = ((uint)(3)); w85.BottomAttach = ((uint)(4)); w85.LeftAttach = ((uint)(1)); w85.RightAttach = ((uint)(2)); w85.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.label16 = new global::Gtk.Label (); this.label16.Name = "label16"; this.label16.Xalign = 0F; this.label16.LabelProp = global::Mono.Unix.Catalog.GetString ("No Activity"); this.table3.Add (this.label16); global::Gtk.Table.TableChild w86 = ((global::Gtk.Table.TableChild)(this.table3 [this.label16])); w86.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.label17 = new global::Gtk.Label (); this.label17.Name = "label17"; this.label17.Xalign = 0F; this.label17.LabelProp = global::Mono.Unix.Catalog.GetString ("Activity"); this.table3.Add (this.label17); global::Gtk.Table.TableChild w87 = ((global::Gtk.Table.TableChild)(this.table3 [this.label17])); w87.TopAttach = ((uint)(1)); w87.BottomAttach = ((uint)(2)); w87.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.label18 = new global::Gtk.Label (); this.label18.Name = "label18"; this.label18.Xalign = 0F; this.label18.LabelProp = global::Mono.Unix.Catalog.GetString ("Join/Part/Mode"); this.table3.Add (this.label18); global::Gtk.Table.TableChild w88 = ((global::Gtk.Table.TableChild)(this.table3 [this.label18])); w88.TopAttach = ((uint)(2)); w88.BottomAttach = ((uint)(3)); w88.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.label59 = new global::Gtk.Label (); this.label59.Name = "label59"; this.label59.Xalign = 0F; this.label59.LabelProp = global::Mono.Unix.Catalog.GetString ("Highlight"); this.table3.Add (this.label59); global::Gtk.Table.TableChild w89 = ((global::Gtk.Table.TableChild)(this.table3 [this.label59])); w89.TopAttach = ((uint)(3)); w89.BottomAttach = ((uint)(4)); w89.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.ModeColorButton = new global::Gtk.ColorButton (); this.ModeColorButton.Name = "ModeColorButton"; this.table3.Add (this.ModeColorButton); global::Gtk.Table.TableChild w90 = ((global::Gtk.Table.TableChild)(this.table3 [this.ModeColorButton])); w90.TopAttach = ((uint)(2)); w90.BottomAttach = ((uint)(3)); w90.LeftAttach = ((uint)(1)); w90.RightAttach = ((uint)(2)); w90.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table3.Gtk.Table+TableChild this.NoActivityColorButton = new global::Gtk.ColorButton (); this.NoActivityColorButton.Name = "NoActivityColorButton"; this.table3.Add (this.NoActivityColorButton); global::Gtk.Table.TableChild w91 = ((global::Gtk.Table.TableChild)(this.table3 [this.NoActivityColorButton])); w91.LeftAttach = ((uint)(1)); w91.RightAttach = ((uint)(2)); w91.YOptions = ((global::Gtk.AttachOptions)(0)); this.alignment8.Add (this.table3); this.frame4.Add (this.alignment8); this.label15 = new global::Gtk.Label (); this.label15.Name = "label15"; this.label15.LabelProp = global::Mono.Unix.Catalog.GetString (" Tab Colors "); this.label15.UseMarkup = true; this.frame4.LabelWidget = this.label15; this.vbox5.Add (this.frame4); global::Gtk.Box.BoxChild w94 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.frame4])); w94.Position = 1; w94.Expand = false; this.InterfaceNotebook.Add (this.vbox5); global::Gtk.Notebook.NotebookChild w95 = ((global::Gtk.Notebook.NotebookChild)(this.InterfaceNotebook [this.vbox5])); w95.Position = 1; // Notebook tab this.label2 = new global::Gtk.Label (); this.label2.Name = "label2"; this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("Tabs"); this.InterfaceNotebook.SetTabLabel (this.vbox5, this.label2); this.label2.ShowAll (); // Container child InterfaceNotebook.Gtk.Notebook+NotebookChild this.frame3 = new global::Gtk.Frame (); this.frame3.Name = "frame3"; // Container child frame3.Gtk.Container+ContainerChild this.alignment7 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment7.Name = "alignment7"; this.alignment7.LeftPadding = ((uint)(12)); // Container child alignment7.Gtk.Container+ContainerChild this.vbox7 = new global::Gtk.VBox (); this.vbox7.Name = "vbox7"; this.vbox7.Spacing = 5; // Container child vbox7.Gtk.Box+BoxChild this.table4 = new global::Gtk.Table (((uint)(3)), ((uint)(2)), false); this.table4.Name = "table4"; this.table4.RowSpacing = ((uint)(5)); this.table4.ColumnSpacing = ((uint)(5)); this.table4.BorderWidth = ((uint)(5)); // Container child table4.Gtk.Table+TableChild this.CommandCharacterEntry = new global::Gtk.Entry (); this.CommandCharacterEntry.WidthRequest = 30; this.CommandCharacterEntry.Name = "CommandCharacterEntry"; this.CommandCharacterEntry.Text = "/"; this.CommandCharacterEntry.IsEditable = true; this.CommandCharacterEntry.MaxLength = 1; this.CommandCharacterEntry.InvisibleChar = '●'; this.table4.Add (this.CommandCharacterEntry); global::Gtk.Table.TableChild w96 = ((global::Gtk.Table.TableChild)(this.table4 [this.CommandCharacterEntry])); w96.TopAttach = ((uint)(1)); w96.BottomAttach = ((uint)(2)); w96.LeftAttach = ((uint)(1)); w96.RightAttach = ((uint)(2)); w96.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table4.Gtk.Table+TableChild this.CommandHistorySizeSpinButton = new global::Gtk.SpinButton (1, 9999, 1); this.CommandHistorySizeSpinButton.WidthRequest = 60; this.CommandHistorySizeSpinButton.Name = "CommandHistorySizeSpinButton"; this.CommandHistorySizeSpinButton.Adjustment.PageIncrement = 10; this.CommandHistorySizeSpinButton.Adjustment.PageSize = 10; this.CommandHistorySizeSpinButton.ClimbRate = 1; this.CommandHistorySizeSpinButton.Numeric = true; this.CommandHistorySizeSpinButton.Value = 30; this.table4.Add (this.CommandHistorySizeSpinButton); global::Gtk.Table.TableChild w97 = ((global::Gtk.Table.TableChild)(this.table4 [this.CommandHistorySizeSpinButton])); w97.TopAttach = ((uint)(2)); w97.BottomAttach = ((uint)(3)); w97.LeftAttach = ((uint)(1)); w97.RightAttach = ((uint)(2)); w97.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table4.Gtk.Table+TableChild this.CompletionCharacterEntry = new global::Gtk.Entry (); this.CompletionCharacterEntry.WidthRequest = 30; this.CompletionCharacterEntry.Name = "CompletionCharacterEntry"; this.CompletionCharacterEntry.Text = ":"; this.CompletionCharacterEntry.IsEditable = true; this.CompletionCharacterEntry.MaxLength = 1; this.CompletionCharacterEntry.InvisibleChar = '●'; this.table4.Add (this.CompletionCharacterEntry); global::Gtk.Table.TableChild w98 = ((global::Gtk.Table.TableChild)(this.table4 [this.CompletionCharacterEntry])); w98.LeftAttach = ((uint)(1)); w98.RightAttach = ((uint)(2)); w98.YOptions = ((global::Gtk.AttachOptions)(0)); // Container child table4.Gtk.Table+TableChild this.hbox4 = new global::Gtk.HBox (); this.hbox4.Name = "hbox4"; // Container child hbox4.Gtk.Box+BoxChild this.label13 = new global::Gtk.Label (); this.label13.Name = "label13"; this.label13.LabelProp = global::Mono.Unix.Catalog.GetString ("Completion Character:"); this.hbox4.Add (this.label13); global::Gtk.Box.BoxChild w99 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.label13])); w99.Position = 0; w99.Expand = false; w99.Fill = false; // Container child hbox4.Gtk.Box+BoxChild this.fixed22 = new global::Gtk.Fixed (); this.fixed22.Name = "fixed22"; this.fixed22.HasWindow = false; this.hbox4.Add (this.fixed22); global::Gtk.Box.BoxChild w100 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.fixed22])); w100.Position = 1; this.table4.Add (this.hbox4); // Container child table4.Gtk.Table+TableChild this.hbox5 = new global::Gtk.HBox (); this.hbox5.Name = "hbox5"; // Container child hbox5.Gtk.Box+BoxChild this.label14 = new global::Gtk.Label (); this.label14.Name = "label14"; this.label14.LabelProp = global::Mono.Unix.Catalog.GetString ("Command Character:"); this.hbox5.Add (this.label14); global::Gtk.Box.BoxChild w102 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.label14])); w102.Position = 0; w102.Expand = false; w102.Fill = false; // Container child hbox5.Gtk.Box+BoxChild this.fixed23 = new global::Gtk.Fixed (); this.fixed23.Name = "fixed23"; this.fixed23.HasWindow = false; this.hbox5.Add (this.fixed23); global::Gtk.Box.BoxChild w103 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.fixed23])); w103.Position = 1; this.table4.Add (this.hbox5); global::Gtk.Table.TableChild w104 = ((global::Gtk.Table.TableChild)(this.table4 [this.hbox5])); w104.TopAttach = ((uint)(1)); w104.BottomAttach = ((uint)(2)); // Container child table4.Gtk.Table+TableChild this.hbox6 = new global::Gtk.HBox (); this.hbox6.Name = "hbox6"; // Container child hbox6.Gtk.Box+BoxChild this.label42 = new global::Gtk.Label (); this.label42.Name = "label42"; this.label42.LabelProp = global::Mono.Unix.Catalog.GetString ("Command History Size:"); this.hbox6.Add (this.label42); global::Gtk.Box.BoxChild w105 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.label42])); w105.Position = 0; w105.Expand = false; w105.Fill = false; // Container child hbox6.Gtk.Box+BoxChild this.fixed24 = new global::Gtk.Fixed (); this.fixed24.Name = "fixed24"; this.fixed24.HasWindow = false; this.hbox6.Add (this.fixed24); global::Gtk.Box.BoxChild w106 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.fixed24])); w106.Position = 1; this.table4.Add (this.hbox6); global::Gtk.Table.TableChild w107 = ((global::Gtk.Table.TableChild)(this.table4 [this.hbox6])); w107.TopAttach = ((uint)(2)); w107.BottomAttach = ((uint)(3)); this.vbox7.Add (this.table4); global::Gtk.Box.BoxChild w108 = ((global::Gtk.Box.BoxChild)(this.vbox7 [this.table4])); w108.Position = 0; w108.Expand = false; w108.Fill = false; // Container child vbox7.Gtk.Box+BoxChild this.BashStyleCompletionCheckButton = new global::Gtk.CheckButton (); this.BashStyleCompletionCheckButton.Name = "BashStyleCompletionCheckButton"; this.BashStyleCompletionCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Bash-Style Completion"); this.BashStyleCompletionCheckButton.DrawIndicator = true; this.BashStyleCompletionCheckButton.UseUnderline = true; this.vbox7.Add (this.BashStyleCompletionCheckButton); global::Gtk.Box.BoxChild w109 = ((global::Gtk.Box.BoxChild)(this.vbox7 [this.BashStyleCompletionCheckButton])); w109.Position = 1; w109.Expand = false; w109.Fill = false; this.alignment7.Add (this.vbox7); this.frame3.Add (this.alignment7); this.label12 = new global::Gtk.Label (); this.label12.Name = "label12"; this.label12.LabelProp = global::Mono.Unix.Catalog.GetString (" Entry Field "); this.label12.UseMarkup = true; this.frame3.LabelWidget = this.label12; this.InterfaceNotebook.Add (this.frame3); global::Gtk.Notebook.NotebookChild w112 = ((global::Gtk.Notebook.NotebookChild)(this.InterfaceNotebook [this.frame3])); w112.Position = 2; // Notebook tab this.label3 = new global::Gtk.Label (); this.label3.Name = "label3"; this.label3.LabelProp = global::Mono.Unix.Catalog.GetString ("Input"); this.InterfaceNotebook.SetTabLabel (this.frame3, this.label3); this.label3.ShowAll (); // Container child InterfaceNotebook.Gtk.Notebook+NotebookChild this.vbox8 = new global::Gtk.VBox (); this.vbox8.Name = "vbox8"; // Container child vbox8.Gtk.Box+BoxChild this.frame2 = new global::Gtk.Frame (); this.frame2.Name = "frame2"; // Container child frame2.Gtk.Container+ContainerChild this.alignment5 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment5.Name = "alignment5"; this.alignment5.LeftPadding = ((uint)(12)); // Container child alignment5.Gtk.Container+ContainerChild this.vbox9 = new global::Gtk.VBox (); this.vbox9.Name = "vbox9"; this.vbox9.Spacing = 5; this.vbox9.BorderWidth = ((uint)(5)); // Container child vbox9.Gtk.Box+BoxChild this.NickColorsCheckButton = new global::Gtk.CheckButton (); this.NickColorsCheckButton.Name = "NickColorsCheckButton"; this.NickColorsCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Nick Colors"); this.NickColorsCheckButton.DrawIndicator = true; this.NickColorsCheckButton.UseUnderline = true; this.vbox9.Add (this.NickColorsCheckButton); global::Gtk.Box.BoxChild w113 = ((global::Gtk.Box.BoxChild)(this.vbox9 [this.NickColorsCheckButton])); w113.Position = 0; w113.Expand = false; // Container child vbox9.Gtk.Box+BoxChild this.frame10 = new global::Gtk.Frame (); this.frame10.Name = "frame10"; // Container child frame10.Gtk.Container+ContainerChild this.alignment14 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment14.Name = "alignment14"; this.alignment14.LeftPadding = ((uint)(12)); // Container child alignment14.Gtk.Container+ContainerChild this.vbox11 = new global::Gtk.VBox (); this.vbox11.Name = "vbox11"; // Container child vbox11.Gtk.Box+BoxChild this.TopicPositionRadioButtonTop = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Top")); this.TopicPositionRadioButtonTop.Name = "TopicPositionRadioButtonTop"; this.TopicPositionRadioButtonTop.Active = true; this.TopicPositionRadioButtonTop.DrawIndicator = true; this.TopicPositionRadioButtonTop.UseUnderline = true; this.TopicPositionRadioButtonTop.Group = new global::GLib.SList (global::System.IntPtr.Zero); this.TopicPositionRadioButtonTop.Remove (this.TopicPositionRadioButtonTop.Child); // Container child TopicPositionRadioButtonTop.Gtk.Container+ContainerChild this.alignment21 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment21.Name = "alignment21"; // Container child alignment21.Gtk.Container+ContainerChild this.hbox22 = new global::Gtk.HBox (); this.hbox22.Name = "hbox22"; this.hbox22.Spacing = 2; // Container child hbox22.Gtk.Box+BoxChild this.image1 = new global::Gtk.Image (); this.image1.Name = "image1"; this.image1.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-top", global::Gtk.IconSize.Menu); this.hbox22.Add (this.image1); global::Gtk.Box.BoxChild w114 = ((global::Gtk.Box.BoxChild)(this.hbox22 [this.image1])); w114.Position = 0; w114.Expand = false; w114.Fill = false; // Container child hbox22.Gtk.Box+BoxChild this.label52 = new global::Gtk.Label (); this.label52.Name = "label52"; this.label52.LabelProp = global::Mono.Unix.Catalog.GetString ("Top"); this.label52.UseUnderline = true; this.hbox22.Add (this.label52); global::Gtk.Box.BoxChild w115 = ((global::Gtk.Box.BoxChild)(this.hbox22 [this.label52])); w115.Position = 1; w115.Expand = false; w115.Fill = false; this.alignment21.Add (this.hbox22); this.TopicPositionRadioButtonTop.Add (this.alignment21); this.vbox11.Add (this.TopicPositionRadioButtonTop); global::Gtk.Box.BoxChild w118 = ((global::Gtk.Box.BoxChild)(this.vbox11 [this.TopicPositionRadioButtonTop])); w118.Position = 0; w118.Expand = false; w118.Fill = false; // Container child vbox11.Gtk.Box+BoxChild this.TopicPositionRadioButtonBottom = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Bottom")); this.TopicPositionRadioButtonBottom.Name = "TopicPositionRadioButtonBottom"; this.TopicPositionRadioButtonBottom.DrawIndicator = true; this.TopicPositionRadioButtonBottom.UseUnderline = true; this.TopicPositionRadioButtonBottom.Group = this.TopicPositionRadioButtonTop.Group; this.TopicPositionRadioButtonBottom.Remove (this.TopicPositionRadioButtonBottom.Child); // Container child TopicPositionRadioButtonBottom.Gtk.Container+ContainerChild this.alignment20 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment20.Name = "alignment20"; // Container child alignment20.Gtk.Container+ContainerChild this.hbox21 = new global::Gtk.HBox (); this.hbox21.Name = "hbox21"; this.hbox21.Spacing = 2; // Container child hbox21.Gtk.Box+BoxChild this.image2 = new global::Gtk.Image (); this.image2.Name = "image2"; this.image2.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-bottom", global::Gtk.IconSize.Menu); this.hbox21.Add (this.image2); global::Gtk.Box.BoxChild w119 = ((global::Gtk.Box.BoxChild)(this.hbox21 [this.image2])); w119.Position = 0; w119.Expand = false; w119.Fill = false; // Container child hbox21.Gtk.Box+BoxChild this.label51 = new global::Gtk.Label (); this.label51.Name = "label51"; this.label51.LabelProp = global::Mono.Unix.Catalog.GetString ("Bottom"); this.label51.UseUnderline = true; this.hbox21.Add (this.label51); global::Gtk.Box.BoxChild w120 = ((global::Gtk.Box.BoxChild)(this.hbox21 [this.label51])); w120.Position = 1; w120.Expand = false; w120.Fill = false; this.alignment20.Add (this.hbox21); this.TopicPositionRadioButtonBottom.Add (this.alignment20); this.vbox11.Add (this.TopicPositionRadioButtonBottom); global::Gtk.Box.BoxChild w123 = ((global::Gtk.Box.BoxChild)(this.vbox11 [this.TopicPositionRadioButtonBottom])); w123.Position = 1; w123.Expand = false; w123.Fill = false; // Container child vbox11.Gtk.Box+BoxChild this.TopicPositionRadioButtonNone = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("None")); this.TopicPositionRadioButtonNone.Name = "TopicPositionRadioButtonNone"; this.TopicPositionRadioButtonNone.DrawIndicator = true; this.TopicPositionRadioButtonNone.UseUnderline = true; this.TopicPositionRadioButtonNone.Group = this.TopicPositionRadioButtonTop.Group; this.vbox11.Add (this.TopicPositionRadioButtonNone); global::Gtk.Box.BoxChild w124 = ((global::Gtk.Box.BoxChild)(this.vbox11 [this.TopicPositionRadioButtonNone])); w124.Position = 2; w124.Expand = false; w124.Fill = false; this.alignment14.Add (this.vbox11); this.frame10.Add (this.alignment14); this.label41 = new global::Gtk.Label (); this.label41.Name = "label41"; this.label41.LabelProp = global::Mono.Unix.Catalog.GetString (" Topic Position "); this.label41.UseMarkup = true; this.frame10.LabelWidget = this.label41; this.vbox9.Add (this.frame10); global::Gtk.Box.BoxChild w127 = ((global::Gtk.Box.BoxChild)(this.vbox9 [this.frame10])); w127.Position = 1; w127.Expand = false; // Container child vbox9.Gtk.Box+BoxChild this.frame9 = new global::Gtk.Frame (); this.frame9.WidthRequest = 152; this.frame9.HeightRequest = 96; this.frame9.Name = "frame9"; // Container child frame9.Gtk.Container+ContainerChild this.alignment13 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment13.Name = "alignment13"; this.alignment13.LeftPadding = ((uint)(12)); // Container child alignment13.Gtk.Container+ContainerChild this.vbox12 = new global::Gtk.VBox (); this.vbox12.Name = "vbox12"; // Container child vbox12.Gtk.Box+BoxChild this.UserListPositionRadioButtonLeft = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Left")); this.UserListPositionRadioButtonLeft.Name = "UserListPositionRadioButtonLeft"; this.UserListPositionRadioButtonLeft.Active = true; this.UserListPositionRadioButtonLeft.DrawIndicator = true; this.UserListPositionRadioButtonLeft.UseUnderline = true; this.UserListPositionRadioButtonLeft.Group = new global::GLib.SList (global::System.IntPtr.Zero); this.UserListPositionRadioButtonLeft.Remove (this.UserListPositionRadioButtonLeft.Child); // Container child UserListPositionRadioButtonLeft.Gtk.Container+ContainerChild this.alignment17 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment17.Name = "alignment17"; // Container child alignment17.Gtk.Container+ContainerChild this.hbox18 = new global::Gtk.HBox (); this.hbox18.Name = "hbox18"; this.hbox18.Spacing = 2; // Container child hbox18.Gtk.Box+BoxChild this.image3 = new global::Gtk.Image (); this.image3.Name = "image3"; this.image3.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-first", global::Gtk.IconSize.Menu); this.hbox18.Add (this.image3); global::Gtk.Box.BoxChild w128 = ((global::Gtk.Box.BoxChild)(this.hbox18 [this.image3])); w128.Position = 0; w128.Expand = false; w128.Fill = false; // Container child hbox18.Gtk.Box+BoxChild this.label48 = new global::Gtk.Label (); this.label48.Name = "label48"; this.label48.LabelProp = global::Mono.Unix.Catalog.GetString ("Left"); this.label48.UseUnderline = true; this.hbox18.Add (this.label48); global::Gtk.Box.BoxChild w129 = ((global::Gtk.Box.BoxChild)(this.hbox18 [this.label48])); w129.Position = 1; w129.Expand = false; w129.Fill = false; this.alignment17.Add (this.hbox18); this.UserListPositionRadioButtonLeft.Add (this.alignment17); this.vbox12.Add (this.UserListPositionRadioButtonLeft); global::Gtk.Box.BoxChild w132 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.UserListPositionRadioButtonLeft])); w132.Position = 0; w132.Expand = false; w132.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.UserListPositionRadioButtonRight = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Right")); this.UserListPositionRadioButtonRight.Name = "UserListPositionRadioButtonRight"; this.UserListPositionRadioButtonRight.DrawIndicator = true; this.UserListPositionRadioButtonRight.UseUnderline = true; this.UserListPositionRadioButtonRight.Group = this.UserListPositionRadioButtonLeft.Group; this.UserListPositionRadioButtonRight.Remove (this.UserListPositionRadioButtonRight.Child); // Container child UserListPositionRadioButtonRight.Gtk.Container+ContainerChild this.alignment18 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); this.alignment18.Name = "alignment18"; // Container child alignment18.Gtk.Container+ContainerChild this.hbox19 = new global::Gtk.HBox (); this.hbox19.Name = "hbox19"; this.hbox19.Spacing = 2; // Container child hbox19.Gtk.Box+BoxChild this.image4 = new global::Gtk.Image (); this.image4.Name = "image4"; this.image4.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-last", global::Gtk.IconSize.Menu); this.hbox19.Add (this.image4); global::Gtk.Box.BoxChild w133 = ((global::Gtk.Box.BoxChild)(this.hbox19 [this.image4])); w133.Position = 0; w133.Expand = false; w133.Fill = false; // Container child hbox19.Gtk.Box+BoxChild this.label49 = new global::Gtk.Label (); this.label49.Name = "label49"; this.label49.LabelProp = global::Mono.Unix.Catalog.GetString ("Right"); this.label49.UseUnderline = true; this.hbox19.Add (this.label49); global::Gtk.Box.BoxChild w134 = ((global::Gtk.Box.BoxChild)(this.hbox19 [this.label49])); w134.Position = 1; w134.Expand = false; w134.Fill = false; this.alignment18.Add (this.hbox19); this.UserListPositionRadioButtonRight.Add (this.alignment18); this.vbox12.Add (this.UserListPositionRadioButtonRight); global::Gtk.Box.BoxChild w137 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.UserListPositionRadioButtonRight])); w137.Position = 1; w137.Expand = false; w137.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.UserListPositionRadioButtonNone = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("None")); this.UserListPositionRadioButtonNone.Name = "UserListPositionRadioButtonNone"; this.UserListPositionRadioButtonNone.DrawIndicator = true; this.UserListPositionRadioButtonNone.UseUnderline = true; this.UserListPositionRadioButtonNone.Group = this.UserListPositionRadioButtonLeft.Group; this.vbox12.Add (this.UserListPositionRadioButtonNone); global::Gtk.Box.BoxChild w138 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.UserListPositionRadioButtonNone])); w138.Position = 2; w138.Expand = false; w138.Fill = false; this.alignment13.Add (this.vbox12); this.frame9.Add (this.alignment13); this.label38 = new global::Gtk.Label (); this.label38.Name = "label38"; this.label38.LabelProp = global::Mono.Unix.Catalog.GetString (" User List Position "); this.label38.UseMarkup = true; this.frame9.LabelWidget = this.label38; this.vbox9.Add (this.frame9); global::Gtk.Box.BoxChild w141 = ((global::Gtk.Box.BoxChild)(this.vbox9 [this.frame9])); w141.Position = 2; w141.Expand = false; this.alignment5.Add (this.vbox9); this.frame2.Add (this.alignment5); this.label10 = new global::Gtk.Label (); this.label10.Name = "label10"; this.label10.LabelProp = global::Mono.Unix.Catalog.GetString (" Channel "); this.label10.UseMarkup = true; this.frame2.LabelWidget = this.label10; this.vbox8.Add (this.frame2); global::Gtk.Box.BoxChild w144 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.frame2])); w144.Position = 0; w144.Expand = false; // Container child vbox8.Gtk.Box+BoxChild this.frame11 = new global::Gtk.Frame (); this.frame11.Name = "frame11"; // Container child frame11.Gtk.Container+ContainerChild this.alignment27 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment27.Name = "alignment27"; this.alignment27.LeftPadding = ((uint)(12)); // Container child alignment27.Gtk.Container+ContainerChild this.vbox13 = new global::Gtk.VBox (); this.vbox13.Name = "vbox13"; this.vbox13.BorderWidth = ((uint)(5)); // Container child vbox13.Gtk.Box+BoxChild this.vbox14 = new global::Gtk.VBox (); this.vbox14.Name = "vbox14"; // Container child vbox14.Gtk.Box+BoxChild this.label62 = new global::Gtk.Label (); this.label62.Name = "label62"; this.label62.Xalign = 0F; this.label62.LabelProp = global::Mono.Unix.Catalog.GetString ("Highlight words:"); this.vbox14.Add (this.label62); global::Gtk.Box.BoxChild w145 = ((global::Gtk.Box.BoxChild)(this.vbox14 [this.label62])); w145.Position = 0; w145.Expand = false; w145.Fill = false; // Container child vbox14.Gtk.Box+BoxChild this.scrolledwindow4 = new global::Gtk.ScrolledWindow (); this.scrolledwindow4.Name = "scrolledwindow4"; this.scrolledwindow4.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow4.Gtk.Container+ContainerChild this.HighlightWordsTextView = new global::Gtk.TextView (); this.HighlightWordsTextView.Sensitive = false; this.HighlightWordsTextView.Name = "HighlightWordsTextView"; this.scrolledwindow4.Add (this.HighlightWordsTextView); this.vbox14.Add (this.scrolledwindow4); global::Gtk.Box.BoxChild w147 = ((global::Gtk.Box.BoxChild)(this.vbox14 [this.scrolledwindow4])); w147.Position = 1; this.vbox13.Add (this.vbox14); global::Gtk.Box.BoxChild w148 = ((global::Gtk.Box.BoxChild)(this.vbox13 [this.vbox14])); w148.Position = 0; // Container child vbox13.Gtk.Box+BoxChild this.BeepOnHighlightCheckButton = new global::Gtk.CheckButton (); this.BeepOnHighlightCheckButton.Name = "BeepOnHighlightCheckButton"; this.BeepOnHighlightCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Beep on highlight"); this.BeepOnHighlightCheckButton.DrawIndicator = true; this.BeepOnHighlightCheckButton.UseUnderline = true; this.vbox13.Add (this.BeepOnHighlightCheckButton); global::Gtk.Box.BoxChild w149 = ((global::Gtk.Box.BoxChild)(this.vbox13 [this.BeepOnHighlightCheckButton])); w149.Position = 1; w149.Expand = false; w149.Fill = false; this.alignment27.Add (this.vbox13); this.frame11.Add (this.alignment27); this.label61 = new global::Gtk.Label (); this.label61.Name = "label61"; this.label61.LabelProp = global::Mono.Unix.Catalog.GetString (" Highlighting "); this.label61.UseMarkup = true; this.frame11.LabelWidget = this.label61; this.vbox8.Add (this.frame11); global::Gtk.Box.BoxChild w152 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.frame11])); w152.Position = 1; this.InterfaceNotebook.Add (this.vbox8); global::Gtk.Notebook.NotebookChild w153 = ((global::Gtk.Notebook.NotebookChild)(this.InterfaceNotebook [this.vbox8])); w153.Position = 3; // Notebook tab this.label4 = new global::Gtk.Label (); this.label4.Name = "label4"; this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("Output"); this.InterfaceNotebook.SetTabLabel (this.vbox8, this.label4); this.label4.ShowAll (); this.Notebook.Add (this.InterfaceNotebook); global::Gtk.Notebook.NotebookChild w154 = ((global::Gtk.Notebook.NotebookChild)(this.Notebook [this.InterfaceNotebook])); w154.Position = 1; // Notebook tab this.label45 = new global::Gtk.Label (); this.label45.Name = "label45"; this.label45.LabelProp = global::Mono.Unix.Catalog.GetString ("_Interface"); this.label45.UseUnderline = true; this.Notebook.SetTabLabel (this.InterfaceNotebook, this.label45); this.label45.ShowAll (); // Container child Notebook.Gtk.Notebook+NotebookChild this.hbox27 = new global::Gtk.HBox (); this.hbox27.Name = "hbox27"; this.hbox27.BorderWidth = ((uint)(5)); // Container child hbox27.Gtk.Box+BoxChild this.scrolledwindow3 = new global::Gtk.ScrolledWindow (); this.scrolledwindow3.Name = "scrolledwindow3"; this.scrolledwindow3.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow3.Gtk.Container+ContainerChild this.ServersTreeView = new global::Gtk.TreeView (); this.ServersTreeView.Name = "ServersTreeView"; this.scrolledwindow3.Add (this.ServersTreeView); this.hbox27.Add (this.scrolledwindow3); global::Gtk.Box.BoxChild w156 = ((global::Gtk.Box.BoxChild)(this.hbox27 [this.scrolledwindow3])); w156.Position = 0; // Container child hbox27.Gtk.Box+BoxChild this.vbuttonbox1 = new global::Gtk.VButtonBox (); this.vbuttonbox1.Name = "vbuttonbox1"; this.vbuttonbox1.BorderWidth = ((uint)(5)); this.vbuttonbox1.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(3)); // Container child vbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.ServersAddButton = new global::Gtk.Button (); this.ServersAddButton.Name = "ServersAddButton"; this.ServersAddButton.UseStock = true; this.ServersAddButton.UseUnderline = true; this.ServersAddButton.Label = "gtk-add"; this.vbuttonbox1.Add (this.ServersAddButton); global::Gtk.ButtonBox.ButtonBoxChild w157 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.vbuttonbox1 [this.ServersAddButton])); w157.Expand = false; w157.Fill = false; // Container child vbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.ServersEditButton = new global::Gtk.Button (); this.ServersEditButton.Name = "ServersEditButton"; this.ServersEditButton.UseStock = true; this.ServersEditButton.UseUnderline = true; this.ServersEditButton.Label = "gtk-edit"; this.vbuttonbox1.Add (this.ServersEditButton); global::Gtk.ButtonBox.ButtonBoxChild w158 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.vbuttonbox1 [this.ServersEditButton])); w158.Position = 1; w158.Expand = false; w158.Fill = false; // Container child vbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.ServersRemoveButton = new global::Gtk.Button (); this.ServersRemoveButton.Name = "ServersRemoveButton"; this.ServersRemoveButton.UseStock = true; this.ServersRemoveButton.UseUnderline = true; this.ServersRemoveButton.Label = "gtk-remove"; this.vbuttonbox1.Add (this.ServersRemoveButton); global::Gtk.ButtonBox.ButtonBoxChild w159 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.vbuttonbox1 [this.ServersRemoveButton])); w159.Position = 2; w159.Expand = false; w159.Fill = false; this.hbox27.Add (this.vbuttonbox1); global::Gtk.Box.BoxChild w160 = ((global::Gtk.Box.BoxChild)(this.hbox27 [this.vbuttonbox1])); w160.Position = 1; w160.Expand = false; this.Notebook.Add (this.hbox27); global::Gtk.Notebook.NotebookChild w161 = ((global::Gtk.Notebook.NotebookChild)(this.Notebook [this.hbox27])); w161.Position = 2; // Notebook tab this.label57 = new global::Gtk.Label (); this.label57.Name = "label57"; this.label57.LabelProp = global::Mono.Unix.Catalog.GetString ("_Servers"); this.label57.UseUnderline = true; this.Notebook.SetTabLabel (this.hbox27, this.label57); this.label57.ShowAll (); // Container child Notebook.Gtk.Notebook+NotebookChild this.vbox15 = new global::Gtk.VBox (); this.vbox15.Name = "vbox15"; this.vbox15.BorderWidth = ((uint)(5)); // Container child vbox15.Gtk.Box+BoxChild this.frame12 = new global::Gtk.Frame (); this.frame12.Name = "frame12"; // Container child frame12.Gtk.Container+ContainerChild this.alignment28 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment28.Name = "alignment28"; this.alignment28.LeftPadding = ((uint)(12)); // Container child alignment28.Gtk.Container+ContainerChild this.vbox16 = new global::Gtk.VBox (); this.vbox16.Name = "vbox16"; // Container child vbox16.Gtk.Box+BoxChild this.scrolledwindow5 = new global::Gtk.ScrolledWindow (); this.scrolledwindow5.Name = "scrolledwindow5"; this.scrolledwindow5.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow5.Gtk.Container+ContainerChild this.ChannelFiltersTreeView = new global::Gtk.TreeView (); this.ChannelFiltersTreeView.Name = "ChannelFiltersTreeView"; this.scrolledwindow5.Add (this.ChannelFiltersTreeView); this.vbox16.Add (this.scrolledwindow5); global::Gtk.Box.BoxChild w163 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.scrolledwindow5])); w163.Position = 0; // Container child vbox16.Gtk.Box+BoxChild this.hbuttonbox1 = new global::Gtk.HButtonBox (); this.hbuttonbox1.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(1)); // Container child hbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.ChannelFiltersAddButton = new global::Gtk.Button (); this.ChannelFiltersAddButton.Sensitive = false; this.ChannelFiltersAddButton.Name = "ChannelFiltersAddButton"; this.ChannelFiltersAddButton.UseStock = true; this.ChannelFiltersAddButton.UseUnderline = true; this.ChannelFiltersAddButton.Label = "gtk-add"; this.hbuttonbox1.Add (this.ChannelFiltersAddButton); global::Gtk.ButtonBox.ButtonBoxChild w164 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.hbuttonbox1 [this.ChannelFiltersAddButton])); w164.Expand = false; w164.Fill = false; // Container child hbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.ChannelFiltersRemoveButton = new global::Gtk.Button (); this.ChannelFiltersRemoveButton.Sensitive = false; this.ChannelFiltersRemoveButton.Name = "ChannelFiltersRemoveButton"; this.ChannelFiltersRemoveButton.UseStock = true; this.ChannelFiltersRemoveButton.UseUnderline = true; this.ChannelFiltersRemoveButton.Label = "gtk-remove"; this.hbuttonbox1.Add (this.ChannelFiltersRemoveButton); global::Gtk.ButtonBox.ButtonBoxChild w165 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.hbuttonbox1 [this.ChannelFiltersRemoveButton])); w165.Position = 1; w165.Expand = false; w165.Fill = false; this.vbox16.Add (this.hbuttonbox1); global::Gtk.Box.BoxChild w166 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.hbuttonbox1])); w166.Position = 1; w166.Expand = false; this.alignment28.Add (this.vbox16); this.frame12.Add (this.alignment28); this.label64 = new global::Gtk.Label (); this.label64.Name = "label64"; this.label64.LabelProp = global::Mono.Unix.Catalog.GetString ("Channel Filters"); this.label64.UseMarkup = true; this.frame12.LabelWidget = this.label64; this.vbox15.Add (this.frame12); global::Gtk.Box.BoxChild w169 = ((global::Gtk.Box.BoxChild)(this.vbox15 [this.frame12])); w169.Position = 0; // Container child vbox15.Gtk.Box+BoxChild this.frame13 = new global::Gtk.Frame (); this.frame13.Sensitive = false; this.frame13.Name = "frame13"; // Container child frame13.Gtk.Container+ContainerChild this.alignment29 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F); this.alignment29.Name = "alignment29"; this.alignment29.LeftPadding = ((uint)(12)); this.frame13.Add (this.alignment29); this.label65 = new global::Gtk.Label (); this.label65.Name = "label65"; this.label65.LabelProp = global::Mono.Unix.Catalog.GetString ("User Filters"); this.label65.UseMarkup = true; this.frame13.LabelWidget = this.label65; this.vbox15.Add (this.frame13); global::Gtk.Box.BoxChild w171 = ((global::Gtk.Box.BoxChild)(this.vbox15 [this.frame13])); w171.Position = 1; this.Notebook.Add (this.vbox15); global::Gtk.Notebook.NotebookChild w172 = ((global::Gtk.Notebook.NotebookChild)(this.Notebook [this.vbox15])); w172.Position = 3; // Notebook tab this.label63 = new global::Gtk.Label (); this.label63.Name = "label63"; this.label63.LabelProp = global::Mono.Unix.Catalog.GetString ("_Filters"); this.label63.UseUnderline = true; this.Notebook.SetTabLabel (this.vbox15, this.label63); this.label63.ShowAll (); this.hbox1.Add (this.Notebook); global::Gtk.Box.BoxChild w173 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.Notebook])); w173.Position = 1; w1.Add (this.hbox1); global::Gtk.Box.BoxChild w174 = ((global::Gtk.Box.BoxChild)(w1 [this.hbox1])); w174.Position = 0; // Internal child Smuxi.Frontend.Gnome.SteticPreferencesDialog.ActionArea global::Gtk.HButtonBox w175 = this.ActionArea; w175.Name = "dialog-action_area1"; w175.Spacing = 6; w175.BorderWidth = ((uint)(5)); w175.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4)); // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild this.CancelButton = new global::Gtk.Button (); this.CancelButton.Name = "CancelButton"; this.CancelButton.UseStock = true; this.CancelButton.UseUnderline = true; this.CancelButton.Label = "gtk-cancel"; this.AddActionWidget (this.CancelButton, -6); global::Gtk.ButtonBox.ButtonBoxChild w176 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w175 [this.CancelButton])); w176.Expand = false; w176.Fill = false; // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild this.ApplyButton = new global::Gtk.Button (); this.ApplyButton.Sensitive = false; this.ApplyButton.Name = "ApplyButton"; this.ApplyButton.UseStock = true; this.ApplyButton.UseUnderline = true; this.ApplyButton.Label = "gtk-apply"; this.AddActionWidget (this.ApplyButton, -10); global::Gtk.ButtonBox.ButtonBoxChild w177 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w175 [this.ApplyButton])); w177.Position = 1; w177.Expand = false; w177.Fill = false; // Container child dialog-action_area1.Gtk.ButtonBox+ButtonBoxChild this.OKButton = new global::Gtk.Button (); this.OKButton.Name = "OKButton"; this.OKButton.UseStock = true; this.OKButton.UseUnderline = true; this.OKButton.Label = "gtk-ok"; this.AddActionWidget (this.OKButton, -5); global::Gtk.ButtonBox.ButtonBoxChild w178 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w175 [this.OKButton])); w178.Position = 2; w178.Expand = false; w178.Fill = false; if ((this.Child != null)) { this.Child.ShowAll (); } this.DefaultWidth = 526; this.DefaultHeight = 579; this.label44.MnemonicWidget = this.Notebook; this.label45.MnemonicWidget = this.Notebook; this.label57.MnemonicWidget = this.Notebook; this.label63.MnemonicWidget = this.Notebook; this.Show (); this.EncodingComboBox.Changed += new global::System.EventHandler (this._OnChanged); this.ConnectionUsernameEntry.Changed += new global::System.EventHandler (this._OnChanged); this.ConnectionRealnameEntry.Changed += new global::System.EventHandler (this._OnChanged); this.ConnectionNicknamesEntry.Changed += new global::System.EventHandler (this._OnChanged); this.TimestampFormatEntry.Changed += new global::System.EventHandler (this._OnChanged); this.EngineBufferLinesSpinButton.Changed += new global::System.EventHandler (this._OnChanged); this.BufferLinesSpinButton.Changed += new global::System.EventHandler (this._OnChanged); this.TabPositionRadioButtonBottom.Toggled += new global::System.EventHandler (this._OnChanged); this.TabPositionRadioButtonLeft.Toggled += new global::System.EventHandler (this._OnChanged); this.TabPositionRadioButtonRight.Toggled += new global::System.EventHandler (this._OnChanged); this.TabPositionRadioButtonNone.Toggled += new global::System.EventHandler (this._OnChanged); this.NoActivityColorButton.ColorSet += new global::System.EventHandler (this._OnChanged); this.ModeColorButton.ColorSet += new global::System.EventHandler (this._OnChanged); this.ActivityColorButton.ColorSet += new global::System.EventHandler (this._OnChanged); this.CompletionCharacterEntry.Changed += new global::System.EventHandler (this._OnChanged); this.CommandHistorySizeSpinButton.Changed += new global::System.EventHandler (this._OnChanged); this.CommandCharacterEntry.Changed += new global::System.EventHandler (this._OnChanged); this.TopicPositionRadioButtonTop.Toggled += new global::System.EventHandler (this._OnChanged); this.TopicPositionRadioButtonBottom.Toggled += new global::System.EventHandler (this._OnChanged); this.TopicPositionRadioButtonNone.Toggled += new global::System.EventHandler (this._OnChanged); this.UserListPositionRadioButtonLeft.Toggled += new global::System.EventHandler (this._OnChanged); this.UserListPositionRadioButtonRight.Toggled += new global::System.EventHandler (this._OnChanged); this.UserListPositionRadioButtonNone.Toggled += new global::System.EventHandler (this._OnChanged); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs0000644000175000017500000004576312726351313026445 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class MenuWidget { private global::Gtk.UIManager UIManager; private global::Gtk.Action f_SmuxiAction; private global::Gtk.Action ServerAction; private global::Gtk.Action ChatAction; private global::Gtk.Action EngineAction; private global::Gtk.Action ViewAction; private global::Gtk.Action f_HelpAction; private global::Gtk.Action f_ConnectToolAction; private global::Gtk.Action f_OpenLogToolAction; private global::Gtk.Action f_FullscreenToolAction; private global::Gtk.Action f_PreferencesToolAction; private global::Gtk.Action f_PreferencesAction; private global::Gtk.Action f_QuitAction; private global::Gtk.Action f_ConnectAction; private global::Gtk.Action f_AddServerAction; private global::Gtk.Action f_ManageServerAction; private global::Gtk.Action f_JoinChatAction; private global::Gtk.Action f_FindGroupChatAction; private global::Gtk.Action f_ClearAllActivityAction; private global::Gtk.Action f_NextChatAction; private global::Gtk.Action f_PreviousChatAction; private global::Gtk.Action f_CloseChatAction; private global::Gtk.Action f_UseLocalEngineAction; private global::Gtk.Action f_AddRemoteEngineAction; private global::Gtk.Action f_SwitchRemoteEngineAction; private global::Gtk.ToggleAction f_CaretModeAction; private global::Gtk.ToggleAction f_BrowseModeAction; private global::Gtk.ToggleAction f_ShowMenubarAction; private global::Gtk.ToggleAction f_ShowStatusbarAction; private global::Gtk.Action f_FullscreenAction; private global::Gtk.Action f_AboutAction; private global::Gtk.Action f_OpenLogAction; private global::Gtk.Action f_FindGroupChatToolAction; private global::Gtk.Action f_WebsiteAction; private global::Gtk.ToggleAction f_ShowToolbarAction; private global::Gtk.VBox vbox2; private global::Gtk.MenuBar f_MenuBar; private global::Gtk.HBox hbox1; private global::Gtk.Toolbar f_MenuToolbar; private global::Gtk.Toolbar f_JoinToolbar; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.MenuWidget Stetic.BinContainer w1 = global::Stetic.BinContainer.Attach (this); this.UIManager = new global::Gtk.UIManager (); global::Gtk.ActionGroup w2 = new global::Gtk.ActionGroup ("Default"); this.f_SmuxiAction = new global::Gtk.Action ("f_SmuxiAction", global::Mono.Unix.Catalog.GetString ("_Smuxi"), null, null); this.f_SmuxiAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Smuxi"); w2.Add (this.f_SmuxiAction, null); this.ServerAction = new global::Gtk.Action ("ServerAction", global::Mono.Unix.Catalog.GetString ("_Server"), null, null); this.ServerAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Server"); w2.Add (this.ServerAction, null); this.ChatAction = new global::Gtk.Action ("ChatAction", global::Mono.Unix.Catalog.GetString ("_Chat"), null, null); this.ChatAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Chat"); w2.Add (this.ChatAction, null); this.EngineAction = new global::Gtk.Action ("EngineAction", global::Mono.Unix.Catalog.GetString ("_Engine"), null, null); this.EngineAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Engine"); w2.Add (this.EngineAction, null); this.ViewAction = new global::Gtk.Action ("ViewAction", global::Mono.Unix.Catalog.GetString ("_View"), null, null); this.ViewAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_View"); w2.Add (this.ViewAction, null); this.f_HelpAction = new global::Gtk.Action ("f_HelpAction", global::Mono.Unix.Catalog.GetString ("_Help"), null, null); this.f_HelpAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Help"); w2.Add (this.f_HelpAction, null); this.f_ConnectToolAction = new global::Gtk.Action ("f_ConnectToolAction", global::Mono.Unix.Catalog.GetString ("Connect"), null, "gtk-network"); this.f_ConnectToolAction.IsImportant = true; this.f_ConnectToolAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Connect"); w2.Add (this.f_ConnectToolAction, null); this.f_OpenLogToolAction = new global::Gtk.Action ("f_OpenLogToolAction", global::Mono.Unix.Catalog.GetString ("Open Log"), null, "gtk-open"); this.f_OpenLogToolAction.IsImportant = true; this.f_OpenLogToolAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Open Log"); w2.Add (this.f_OpenLogToolAction, null); this.f_FullscreenToolAction = new global::Gtk.Action ("f_FullscreenToolAction", null, null, "gtk-fullscreen"); this.f_FullscreenToolAction.IsImportant = true; w2.Add (this.f_FullscreenToolAction, null); this.f_PreferencesToolAction = new global::Gtk.Action ("f_PreferencesToolAction", null, null, "gtk-preferences"); this.f_PreferencesToolAction.IsImportant = true; w2.Add (this.f_PreferencesToolAction, null); this.f_PreferencesAction = new global::Gtk.Action ("f_PreferencesAction", global::Mono.Unix.Catalog.GetString ("_Preferences"), null, "gtk-preferences"); this.f_PreferencesAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Preferences"); w2.Add (this.f_PreferencesAction, null); this.f_QuitAction = new global::Gtk.Action ("f_QuitAction", global::Mono.Unix.Catalog.GetString ("_Quit"), null, null); this.f_QuitAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Quit"); w2.Add (this.f_QuitAction, "q"); this.f_ConnectAction = new global::Gtk.Action ("f_ConnectAction", global::Mono.Unix.Catalog.GetString ("_Connect"), null, "gtk-network"); this.f_ConnectAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Connect"); w2.Add (this.f_ConnectAction, null); this.f_AddServerAction = new global::Gtk.Action ("f_AddServerAction", global::Mono.Unix.Catalog.GetString ("_Add"), null, "gtk-add"); this.f_AddServerAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Add"); w2.Add (this.f_AddServerAction, null); this.f_ManageServerAction = new global::Gtk.Action ("f_ManageServerAction", global::Mono.Unix.Catalog.GetString ("_Manage"), null, "gtk-edit"); this.f_ManageServerAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Manage"); w2.Add (this.f_ManageServerAction, null); this.f_JoinChatAction = new global::Gtk.Action ("f_JoinChatAction", global::Mono.Unix.Catalog.GetString ("_Open / Join Chat"), null, null); this.f_JoinChatAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Open / Join Chat"); w2.Add (this.f_JoinChatAction, "l"); this.f_FindGroupChatAction = new global::Gtk.Action ("f_FindGroupChatAction", global::Mono.Unix.Catalog.GetString ("_Find Group Chat"), null, null); this.f_FindGroupChatAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Find Group Chat"); w2.Add (this.f_FindGroupChatAction, null); this.f_ClearAllActivityAction = new global::Gtk.Action ("f_ClearAllActivityAction", global::Mono.Unix.Catalog.GetString ("C_lear All Activity"), null, "gtk-clear"); this.f_ClearAllActivityAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("C_lear All Activity"); w2.Add (this.f_ClearAllActivityAction, null); this.f_NextChatAction = new global::Gtk.Action ("f_NextChatAction", global::Mono.Unix.Catalog.GetString ("_Next Chat"), null, "gtk-go-forward"); this.f_NextChatAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Next Chat"); w2.Add (this.f_NextChatAction, "Page_Down"); this.f_PreviousChatAction = new global::Gtk.Action ("f_PreviousChatAction", global::Mono.Unix.Catalog.GetString ("_Previous Chat"), null, "gtk-go-back"); this.f_PreviousChatAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Previous Chat"); w2.Add (this.f_PreviousChatAction, "Page_Up"); this.f_CloseChatAction = new global::Gtk.Action ("f_CloseChatAction", global::Mono.Unix.Catalog.GetString ("_Close"), null, null); this.f_CloseChatAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Close"); w2.Add (this.f_CloseChatAction, "w"); this.f_UseLocalEngineAction = new global::Gtk.Action ("f_UseLocalEngineAction", global::Mono.Unix.Catalog.GetString ("_Use Local Engine"), null, null); this.f_UseLocalEngineAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Use Local Engine"); w2.Add (this.f_UseLocalEngineAction, null); this.f_AddRemoteEngineAction = new global::Gtk.Action ("f_AddRemoteEngineAction", global::Mono.Unix.Catalog.GetString ("_Add Remote Engine"), null, null); this.f_AddRemoteEngineAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Add Remote Engine"); w2.Add (this.f_AddRemoteEngineAction, null); this.f_SwitchRemoteEngineAction = new global::Gtk.Action ("f_SwitchRemoteEngineAction", global::Mono.Unix.Catalog.GetString ("Switch Remote Engine"), null, null); this.f_SwitchRemoteEngineAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Switch Remote Engine"); w2.Add (this.f_SwitchRemoteEngineAction, null); this.f_CaretModeAction = new global::Gtk.ToggleAction ("f_CaretModeAction", global::Mono.Unix.Catalog.GetString ("_Caret Mode"), null, null); this.f_CaretModeAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Caret Mode"); w2.Add (this.f_CaretModeAction, "F7"); this.f_BrowseModeAction = new global::Gtk.ToggleAction ("f_BrowseModeAction", global::Mono.Unix.Catalog.GetString ("_Browse Mode"), null, null); this.f_BrowseModeAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Browse Mode"); w2.Add (this.f_BrowseModeAction, "F8"); this.f_ShowMenubarAction = new global::Gtk.ToggleAction ("f_ShowMenubarAction", global::Mono.Unix.Catalog.GetString ("Show _Menubar"), null, null); this.f_ShowMenubarAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Show _Menubar"); w2.Add (this.f_ShowMenubarAction, null); this.f_ShowStatusbarAction = new global::Gtk.ToggleAction ("f_ShowStatusbarAction", global::Mono.Unix.Catalog.GetString ("Show _Statusbar"), null, null); this.f_ShowStatusbarAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Show _Statusbar"); w2.Add (this.f_ShowStatusbarAction, null); this.f_FullscreenAction = new global::Gtk.Action ("f_FullscreenAction", global::Mono.Unix.Catalog.GetString ("_Fullscreen"), null, "gtk-fullscreen"); this.f_FullscreenAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Fullscreen"); w2.Add (this.f_FullscreenAction, "F11"); this.f_AboutAction = new global::Gtk.Action ("f_AboutAction", global::Mono.Unix.Catalog.GetString ("_About"), null, "gtk-about"); this.f_AboutAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_About"); w2.Add (this.f_AboutAction, null); this.f_OpenLogAction = new global::Gtk.Action ("f_OpenLogAction", global::Mono.Unix.Catalog.GetString ("Open Log"), null, null); this.f_OpenLogAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Open Log"); w2.Add (this.f_OpenLogAction, null); this.f_FindGroupChatToolAction = new global::Gtk.Action ("f_FindGroupChatToolAction", global::Mono.Unix.Catalog.GetString ("Find Group Chat"), null, null); this.f_FindGroupChatToolAction.IsImportant = true; this.f_FindGroupChatToolAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Find Group Chat"); w2.Add (this.f_FindGroupChatToolAction, null); this.f_WebsiteAction = new global::Gtk.Action ("f_WebsiteAction", global::Mono.Unix.Catalog.GetString ("_Website"), null, null); this.f_WebsiteAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Website"); w2.Add (this.f_WebsiteAction, null); this.f_ShowToolbarAction = new global::Gtk.ToggleAction ("f_ShowToolbarAction", global::Mono.Unix.Catalog.GetString ("Show _Toolbar"), null, null); this.f_ShowToolbarAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Show _Toolbar"); w2.Add (this.f_ShowToolbarAction, null); this.UIManager.InsertActionGroup (w2, 0); this.Name = "Smuxi.Frontend.Gnome.MenuWidget"; // Container child Smuxi.Frontend.Gnome.MenuWidget.Gtk.Container+ContainerChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; // Container child vbox2.Gtk.Box+BoxChild this.UIManager.AddUiFromString (""); this.f_MenuBar = ((global::Gtk.MenuBar)(this.UIManager.GetWidget ("/f_MenuBar"))); this.f_MenuBar.Name = "f_MenuBar"; this.vbox2.Add (this.f_MenuBar); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.f_MenuBar])); w3.Position = 0; w3.Expand = false; w3.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; // Container child hbox1.Gtk.Box+BoxChild this.UIManager.AddUiFromString (""); this.f_MenuToolbar = ((global::Gtk.Toolbar)(this.UIManager.GetWidget ("/f_MenuToolbar"))); this.f_MenuToolbar.Name = "f_MenuToolbar"; this.f_MenuToolbar.ShowArrow = false; this.f_MenuToolbar.ToolbarStyle = ((global::Gtk.ToolbarStyle)(3)); this.f_MenuToolbar.IconSize = ((global::Gtk.IconSize)(3)); this.hbox1.Add (this.f_MenuToolbar); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_MenuToolbar])); w4.Position = 0; // Container child hbox1.Gtk.Box+BoxChild this.UIManager.AddUiFromString (""); this.f_JoinToolbar = ((global::Gtk.Toolbar)(this.UIManager.GetWidget ("/f_JoinToolbar"))); this.f_JoinToolbar.Name = "f_JoinToolbar"; this.f_JoinToolbar.ShowArrow = false; this.hbox1.Add (this.f_JoinToolbar); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_JoinToolbar])); w5.PackType = ((global::Gtk.PackType)(1)); w5.Position = 1; w5.Expand = false; this.vbox2.Add (this.hbox1); global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1])); w6.Position = 1; w6.Expand = false; w6.Fill = false; this.Add (this.vbox2); if ((this.Child != null)) { this.Child.ShowAll (); } w1.SetUiManager (UIManager); this.Hide (); this.f_ConnectToolAction.Activated += new global::System.EventHandler (this.OnConnectActionActivated); this.f_OpenLogToolAction.Activated += new global::System.EventHandler (this.OnOpenLogActionActivated); this.f_FullscreenToolAction.Activated += new global::System.EventHandler (this.OnFullscreenActionActivated); this.f_PreferencesToolAction.Activated += new global::System.EventHandler (this.OnPreferencesActionActivated); this.f_PreferencesAction.Activated += new global::System.EventHandler (this.OnPreferencesActionActivated); this.f_QuitAction.Activated += new global::System.EventHandler (this.OnQuitActionActivated); this.f_ConnectAction.Activated += new global::System.EventHandler (this.OnConnectActionActivated); this.f_AddServerAction.Activated += new global::System.EventHandler (this.OnAddServerActionActivated); this.f_ManageServerAction.Activated += new global::System.EventHandler (this.OnManageServerActionActivated); this.f_JoinChatAction.Activated += new global::System.EventHandler (this.OnJoinChatActionActivated); this.f_FindGroupChatAction.Activated += new global::System.EventHandler (this.OnFindGroupChatActionActivated); this.f_ClearAllActivityAction.Activated += new global::System.EventHandler (this.OnClearAllActivityActionActivated); this.f_NextChatAction.Activated += new global::System.EventHandler (this.OnNextChatActionActivated); this.f_PreviousChatAction.Activated += new global::System.EventHandler (this.OnPreviousChatActionActivated); this.f_CloseChatAction.Activated += new global::System.EventHandler (this.OnCloseChatActionActivated); this.f_UseLocalEngineAction.Activated += new global::System.EventHandler (this.OnUseLocalEngineActionActivated); this.f_AddRemoteEngineAction.Activated += new global::System.EventHandler (this.OnAddRemoteEngineActionActivated); this.f_SwitchRemoteEngineAction.Activated += new global::System.EventHandler (this.OnSwitchRemoteEngineActionActivated); this.f_CaretModeAction.Toggled += new global::System.EventHandler (this.OnCaretModeActionToggled); this.f_BrowseModeAction.Toggled += new global::System.EventHandler (this.OnBrowseModeActionToggled); this.f_ShowMenubarAction.Toggled += new global::System.EventHandler (this.OnShowMenubarActionToggled); this.f_ShowStatusbarAction.Toggled += new global::System.EventHandler (this.OnShowStatusbarActionToggled); this.f_FullscreenAction.Activated += new global::System.EventHandler (this.OnFullscreenActionActivated); this.f_AboutAction.Activated += new global::System.EventHandler (this.OnAboutActionActivated); this.f_OpenLogAction.Activated += new global::System.EventHandler (this.OnOpenLogActionActivated); this.f_FindGroupChatToolAction.Activated += new global::System.EventHandler (this.OnFindGroupChatActionActivated); this.f_WebsiteAction.Activated += new global::System.EventHandler (this.OnWebsiteActionActivated); this.f_ShowToolbarAction.Toggled += new global::System.EventHandler (this.OnShowToolbarActionToggled); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatTypeWidget.cs0000644000175000017500000000132312726351313027242 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class ChatTypeWidget { private global::Gtk.ComboBox f_ComboBox; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.ChatTypeWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.ChatTypeWidget"; // Container child Smuxi.Frontend.Gnome.ChatTypeWidget.Gtk.Container+ContainerChild this.f_ComboBox = global::Gtk.ComboBox.NewText (); this.f_ComboBox.Name = "f_ComboBox"; this.Add (this.f_ComboBox); if ((this.Child != null)) { this.Child.ShowAll (); } this.Hide (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs0000644000175000017500000001236312726351313027204 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class OpenChatDialog { private global::Gtk.Table table1; private global::Smuxi.Frontend.Gnome.ChatTypeWidget f_ChatTypeWidget; private global::Gtk.Entry f_NameEntry; private global::Gtk.Label label1; private global::Gtk.Label label2; private global::Gtk.Button f_CancelButton; private global::Gtk.Button f_OpenButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.OpenChatDialog this.Name = "Smuxi.Frontend.Gnome.OpenChatDialog"; this.Title = global::Mono.Unix.Catalog.GetString ("Smuxi - Open Chat"); this.WindowPosition = ((global::Gtk.WindowPosition)(4)); this.Resizable = false; this.AllowGrow = false; // Internal child Smuxi.Frontend.Gnome.OpenChatDialog.VBox global::Gtk.VBox w1 = this.VBox; w1.Name = "dialog1_VBox"; w1.BorderWidth = ((uint)(2)); // Container child dialog1_VBox.Gtk.Box+BoxChild this.table1 = new global::Gtk.Table (((uint)(2)), ((uint)(2)), false); this.table1.Name = "table1"; this.table1.RowSpacing = ((uint)(6)); this.table1.ColumnSpacing = ((uint)(6)); this.table1.BorderWidth = ((uint)(5)); // Container child table1.Gtk.Table+TableChild this.f_ChatTypeWidget = new global::Smuxi.Frontend.Gnome.ChatTypeWidget (); this.f_ChatTypeWidget.Events = ((global::Gdk.EventMask)(256)); this.f_ChatTypeWidget.Name = "f_ChatTypeWidget"; this.table1.Add (this.f_ChatTypeWidget); global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table1 [this.f_ChatTypeWidget])); w2.LeftAttach = ((uint)(1)); w2.RightAttach = ((uint)(2)); w2.XOptions = ((global::Gtk.AttachOptions)(4)); w2.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.f_NameEntry = new global::Gtk.Entry (); this.f_NameEntry.CanFocus = true; this.f_NameEntry.Name = "f_NameEntry"; this.f_NameEntry.IsEditable = true; this.f_NameEntry.ActivatesDefault = true; this.f_NameEntry.InvisibleChar = '●'; this.table1.Add (this.f_NameEntry); global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1 [this.f_NameEntry])); w3.TopAttach = ((uint)(1)); w3.BottomAttach = ((uint)(2)); w3.LeftAttach = ((uint)(1)); w3.RightAttach = ((uint)(2)); w3.XOptions = ((global::Gtk.AttachOptions)(4)); w3.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; this.label1.Xalign = 0F; this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("_Type:"); this.label1.UseUnderline = true; this.table1.Add (this.label1); global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1 [this.label1])); w4.XOptions = ((global::Gtk.AttachOptions)(4)); w4.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label2 = new global::Gtk.Label (); this.label2.Name = "label2"; this.label2.Xalign = 0F; this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("_Name:"); this.label2.UseUnderline = true; this.table1.Add (this.label2); global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1 [this.label2])); w5.TopAttach = ((uint)(1)); w5.BottomAttach = ((uint)(2)); w5.XOptions = ((global::Gtk.AttachOptions)(4)); w5.YOptions = ((global::Gtk.AttachOptions)(4)); w1.Add (this.table1); global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(w1 [this.table1])); w6.Position = 0; w6.Expand = false; w6.Fill = false; // Internal child Smuxi.Frontend.Gnome.OpenChatDialog.ActionArea global::Gtk.HButtonBox w7 = this.ActionArea; w7.Name = "dialog1_ActionArea"; w7.Spacing = 6; w7.BorderWidth = ((uint)(5)); w7.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4)); // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_CancelButton = new global::Gtk.Button (); this.f_CancelButton.CanFocus = true; this.f_CancelButton.Name = "f_CancelButton"; this.f_CancelButton.UseStock = true; this.f_CancelButton.UseUnderline = true; this.f_CancelButton.Label = "gtk-cancel"; this.AddActionWidget (this.f_CancelButton, -6); global::Gtk.ButtonBox.ButtonBoxChild w8 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w7 [this.f_CancelButton])); w8.Expand = false; w8.Fill = false; // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_OpenButton = new global::Gtk.Button (); this.f_OpenButton.Sensitive = false; this.f_OpenButton.CanDefault = true; this.f_OpenButton.CanFocus = true; this.f_OpenButton.Name = "f_OpenButton"; this.f_OpenButton.UseStock = true; this.f_OpenButton.UseUnderline = true; this.f_OpenButton.Label = "gtk-open"; this.AddActionWidget (this.f_OpenButton, -5); global::Gtk.ButtonBox.ButtonBoxChild w9 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w7 [this.f_OpenButton])); w9.Position = 1; w9.Expand = false; w9.Fill = false; if ((this.Child != null)) { this.Child.ShowAll (); } this.DefaultWidth = 236; this.DefaultHeight = 153; this.f_OpenButton.HasDefault = true; this.Show (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/gui.stetic0000664000175000017500000100524013411450522022100 0ustar00meebeymeebey00000000000000 .. 2.12 Smuxi - Preferences Dialog 3 False 2 10 128 In False False 0 False False 0 False 5 5 4 2 5 5 True 1 2 False 0 True True False False False False True 2 3 1 2 False 0 True True False False False False True 1 2 1 2 False 0 True True False False False False False 3 4 1 2 False True True False True True False Nicknames: 0 False False False False 1 False False True True False True True False Username: 0 False False False False 1 False 1 2 False True True False True True False Realname: 0 False False False False 1 False 2 3 False True True False True True False 0 Encoding: 3 4 False 0 True True False False False False 0 False False On Connect Commands: 0 False False False False 1 False 0 False False False 350 100 In 152 168 Word 1 False 0 False On Startup Commands: 0 False False False False 1 False 0 False False False 350 100 In 152 168 Word 1 False 1 False 1 False C_onnection True Notebook tab 0 3 2 5 5 5 60 1 9999 10 10 1 1 True 200 1 2 1 2 False 0 True True False False False False 60 9999 10 10 1 1 True 200 2 3 1 2 False 0 True True False False False False Timestamp Format: 0 False False False False 1 False False True True False True True False Buffer Lines: 0 False False False False 1 False 1 2 False True True False True True False Engine Buffer Lines: 0 False False False False 1 False 2 3 False True True False True True False 60 HH:mm True 1 2 False 0 True True False False False False 0 False False False True False True 0 0 2 stock:gtk-cut Menu 0 True False False Strip Colors True 1 False False False 1 False False False True False True 0 0 2 stock:gtk-cut Menu 0 True False False Strip Formattings True 1 False False False 2 False False False False True False True 0 0 2 stock:gtk-cut Menu 0 True False False Strip UTF-8 True 1 False False False 3 False False False General tab 5 12 True Top True True False True TabPositionRadioButtonTop 6 stock:gtk-goto-top Menu 0 True False False Top 1 True False False 0 True False False Bottom True False True TabPositionRadioButtonTop 2 stock:gtk-goto-bottom Menu 0 True False False Bottom True 1 False False False 1 False False False Left True False True TabPositionRadioButtonTop 0 0 2 stock:gtk-goto-first Menu 0 True False False Left True 1 False False False 2 False False False Right True False True TabPositionRadioButtonTop 0 0 2 stock:gtk-goto-last Menu 0 True False False Right True 1 False False False 3 False False False None True True True TabPositionRadioButtonTop 4 False False False <b> Tabs Position </b> True label_item 0 False False 12 4 2 5 5 -1 1 2 1 2 False 0 True True False False False False -1 3 4 1 2 False 0 True True False False False False 0 No Activity False 0 True True False False False False 0 Activity 1 2 False 0 True True False False False False 0 Join/Part/Mode 2 3 False 0 True True False False False False 0 Highlight 3 4 False 0 True True False False False False -1 2 3 1 2 False 0 True True False False False False -1 1 2 False 0 True True False False False False <b> Tab Colors </b> True label_item 1 False False 1 Tabs tab 12 5 3 2 5 5 5 30 / True 1 1 2 1 2 False 0 True True False False False False 60 1 9999 10 10 1 1 True 30 2 3 1 2 False 0 True True False False False False 30 : True 1 1 2 False 0 True True False False False False Completion Character: 0 False False False False 1 False False True True False True True False Command Character: 0 False False False False 1 False 1 2 False True True False True True False Command History Size: 0 False False False False 1 False 2 3 False True True False True True False 0 False False False Bash-Style Completion True True True 1 False False False <b> Entry Field </b> True label_item 2 Input tab 12 5 5 Nick Colors True True True 0 False False 12 Top True True False True TopicPositionRadioButtonTop 0 0 2 stock:gtk-goto-top Menu 0 True False False Top True 1 False False False 0 False False False Bottom True False True TopicPositionRadioButtonTop 0 0 2 stock:gtk-goto-bottom Menu 0 True False False Bottom True 1 False False False 1 False False False None True True True TopicPositionRadioButtonTop 2 False False False <b> Topic Position </b> True label_item 1 False False 152 96 12 Left True True False True UserListPositionRadioButtonLeft 0 0 2 stock:gtk-goto-first Menu 0 True False False Left True 1 False False False 0 False False False Right True False True UserListPositionRadioButtonLeft 0 0 2 stock:gtk-goto-last Menu 0 True False False Right True 1 False False False 1 False False False None True True True UserListPositionRadioButtonLeft 2 False False False <b> User List Position </b> True label_item 2 False False <b> Channel </b> True label_item 0 False False 12 5 0 Highlight words: 0 False False False In False 1 False 0 False Beep on highlight True True True 1 False False False <b> Highlighting </b> True label_item 1 False 3 Output tab 1 _Interface True Notebook tab 5 In 0 False 5 3 Start True StockItem gtk-add gtk-add False False True StockItem gtk-edit gtk-edit 1 False False True StockItem gtk-remove gtk-remove 2 False False 1 False False 2 _Servers True Notebook tab 5 12 In 0 False 2 Spread False True StockItem gtk-add gtk-add False False False True StockItem gtk-remove gtk-remove 1 False False 1 False False <b>Channel Filters</b> True label_item 0 False False 12 <b>User Filters</b> True label_item 1 False 3 _Filters True Notebook tab 1 False 0 False 6 5 3 End True StockItem gtk-cancel -6 gtk-cancel False False False True StockItem gtk-apply -10 gtk-apply 1 False False True StockItem gtk-ok -5 gtk-ok 2 False False Smuxi - Connect Dialog 5 640 480 2 False 5 2 6 In True True 0 True ButtonPressMask 1 True False False 0 False 6 5 2 End True StockItem gtk-cancel -6 gtk-cancel False False True StockItem gtk-connect -5 gtk-connect 1 False False Smuxi - Find Group Chat stock:gtk-find Menu CenterOnParent 640 480 2 False 2 6 6 6 _Name: True f_NameEntry 0 True False False True True True 1 True 0 True True True StockItem gtk-find gtk-find 1 True False False 0 True False False In True True 1 True 0 True 6 5 2 End True True True StockItem gtk-cancel -6 gtk-cancel False False True True True StockItem gtk-ok -5 gtk-ok 1 False False Find CenterOnParent False False 2 False 2 6 10 6 _Search for: True f_SearchForEntry 0 True False False True True 1 True 0 True False False 6 True _Match Case True True True 0 True False False True Search _Backwards True True True 1 True False False True _Wrap Around True True True True 2 True False False True Use _Regular Expressions True True True End 3 True False False 1 True False False 0 True False False 6 5 2 End True True True StockItem gtk-close -7 gtk-close False False True True True StockItem gtk-find 0 gtk-find 1 False False Smuxi - Open Chat CenterOnParent False False 2 False 2 2 2 6 6 5 ButtonPressMask 1 2 True Fill Fill False True False False True False True True True 1 2 1 2 True Fill Fill False True False False True False 0 _Type: True True Fill Fill False True False False True False 0 _Name: True 1 2 True Fill Fill False True False False True False 0 True False False 6 5 2 End True True StockItem gtk-cancel -6 gtk-cancel False False False True True True True StockItem gtk-open -5 gtk-open 1 False False False True False 0 Welcome to the Smuxi Engine Configuration Assistant. You need to enter some information before you can use the engine. Click "Forward" to begin. False 10 5 6 0 _Engine Name: True f_EngineNameEntry 0 True False False True True 1 True False False 50 0 <span size="small">Profile name of the new engine</span> True 2 True False False 0 True False False 6 5 0 _Default Engine: True f_MakeDefaultEngineCheckButton 0 True False False True Use as new default engine True True True 1 True False False 50 0 <span size="small">If enabled, the current engine will be the default next time Smuxi is started</span> True True 2 True False False 1 True False False False 10 5 6 True Use _SSH Tunnel True True True True 0 True False False 50 0 <span size="small">Enables the use of SSH for the connection. This has a small performance impact, but is more secure and required when using NAT or port-based firewalls</span> True True 1 True False False 0 True False False 4 4 5 6 False True localhost True 2 3 1 2 True Fill Fill False True False False True False True 1 65535 1 1 1 True 7689 2 3 3 4 True Fill Fill False True False False True False True True 1 2 False Fill True True False False True False True 1 65535 1 1 1 True 22 3 4 True Fill Fill False True False False True False 0 SSH _Host: True f_SshHostEntry True Fill Fill False True False False True False 50 0 <span size="small">DNS or IP address and port of the SSH server</span> True 1 2 4 True Fill Fill False True False False True False 0 _Port: True f_PortSpinButton 2 3 2 3 True Fill Fill False True False False True False 0 _Port: True f_SshPortSpinButton 2 3 True Fill Fill False True False False True False 50 0 <span size="small">DNS or IP address and port of the Smuxi server</span> True 3 4 4 True Fill Fill False True False False True False 0 _Smuxi Host: True f_HostEntry 2 3 True Fill Fill False True False False True False 1 True False False False 10 5 6 0 _SSH Username: (optional) True f_SshUsernameEntry 0 True False False True True 1 True False False 50 0 <span size="small">Username which will be used to log into the SSH server</span> True 2 True False False 0 True False False 6 0 _SSH Password: (optional) True f_SshUsernameEntry 0 True False False True True False 1 True False False 50 0 <span size="small">Password which will be used to log into the SSH server. The password is optional if SSH key authorization is used (see below).</span> True True 2 True False False 1 True False False 6 0 _SSH Keyfile: (optional) True f_SshKeyfileChooserButton 0 True False False True 1 True False False 50 0 <span size="small">SSH private keyfile which will be used to log into the SSH server</span> True 2 True False False 2 True False False 6 0 _Username: True f_UsernameEntry 0 True False False True True 1 True False False 50 0 <span size="small">Username which will be used to log into the Smuxi server</span> True 2 True False False 3 True False False 6 0 _Password: True f_PasswordEntry 0 True False False True True False 1 True False False 50 0 <span size="small">Password of the user</span> True 2 True False False 4 True False False 6 0 _Verify Password: True f_VerifyPasswordEntry 0 True False False True True False 1 True False False 50 0 <span size="small">Repeat the password for verification</span> True 2 True False False 5 True False False Smuxi - Server CenterOnParent 2 False 2 ButtonPressMask 0 False 5 10 5 2 End True True True StockItem gtk-cancel -6 gtk-cancel False False True True True StockItem gtk-ok -5 gtk-ok 1 False False False 5 7 2 5 5 0 _Hostname: True f_HostnameEntry 1 2 False True True False True True False True 2 3 1 2 True Fill Fill False True False False True False 0 _Network: True f_NetworkComboBoxEntry 2 3 True Fill Fill False True False False True False True True 3 4 1 2 True Fill Fill False True False False True False 0 Nickname: f_NicknameEntry 3 4 True Fill Fill False True False False True False 0 _Password: True f_PasswordEntry 6 7 False True True False True True False False 1 2 False True True False True True False True True 4 5 1 2 True Fill Fill False True False False True False 0 Realname: f_RealnameEntry 4 5 True Fill Fill False True False False True False True 5 6 1 2 False True True False True True False True 0 False 5 _Port: True f_PortSpinButton 0 False 65535 10 10 1 1 True 1 False 1 False 1 2 1 2 False True True False True True False 6 True False 0 True True Show Password True True True 1 True 6 7 1 2 True Fill Fill False True False False True False 0 _Username: True f_UsernameEntry 5 6 False True True False True True False 0 _Protocol: True f_ProtocolComboBox False True True False True True False 0 False False True Automatically connect to server at startup True True True 0 1 True False False True Use Encryption True True True 2 True False False True Validate Server Certificate True True True 3 True False False 5 6 0 _On Connect Commands: True f_OnConnectCommandsTextView 0 True False False True _Ignore Commands True True True 1 True 0 True False False 350 100 In 152 168 Word 1 True 4 True False 5 In True True 0 True 5 2 Start True True StockItem gtk-add gtk-add False False True True StockItem gtk-remove gtk-remove 1 False False 1 True False False 6 True True 0 True @ 1 True False False True 2 True False False True TextAndIcon stock:gtk-go-forward Menu Join True 3 True False False Action _Smuxi _Smuxi Action _Server _Server Action _Chat _Chat Action _Engine _Engine Action _View _View Action _Help _Help Action True Connect Connect gtk-network Action True Open Log Open Log gtk-open Action True gtk-fullscreen Action True gtk-preferences Action _Preferences _Preferences gtk-preferences Action <Control>q _Quit _Quit Action _Connect _Connect gtk-network Action _Add _Add gtk-add Action _Manage _Manage gtk-edit Action <Control>l _Open / Join Chat _Open / Join Chat Action _Find Group Chat _Find Group Chat Action C_lear All Activity C_lear All Activity gtk-clear Action <Control>Page_Down _Next Chat _Next Chat gtk-go-forward Action <Control>Page_Up _Previous Chat _Previous Chat gtk-go-back Action <Control>w _Close _Close Action _Use Local Engine _Use Local Engine Action _Add Remote Engine _Add Remote Engine Action Switch Remote Engine Switch Remote Engine Toggle F7 _Caret Mode _Caret Mode False False Toggle F8 _Browse Mode _Browse Mode False False Toggle Show _Menubar Show _Menubar False False Toggle Show _Statusbar Show _Statusbar False False Action F11 _Fullscreen _Fullscreen gtk-fullscreen Action _About _About gtk-about Action Open Log Open Log Action True Find Group Chat Find Group Chat Action _Website _Website Toggle Show _Toolbar Show _Toolbar False False False 0 True False False False BothHoriz LargeToolbar 0 True False End 1 False False 1 True False False smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs0000644000175000017500000001224112726351313031422 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantNameWidget { private global::Gtk.VBox vbox2; private global::Gtk.VBox vbox3; private global::Gtk.Label f_EngineNameLabel; private global::Gtk.Entry f_EngineNameEntry; private global::Gtk.Label label2; private global::Gtk.VBox vbox4; private global::Gtk.Label label7; private global::Gtk.CheckButton f_MakeDefaultEngineCheckButton; private global::Gtk.Label label8; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.EngineAssistantNameWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.EngineAssistantNameWidget"; // Container child Smuxi.Frontend.Gnome.EngineAssistantNameWidget.Gtk.Container+ContainerChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; this.vbox2.Spacing = 10; this.vbox2.BorderWidth = ((uint)(5)); // Container child vbox2.Gtk.Box+BoxChild this.vbox3 = new global::Gtk.VBox (); this.vbox3.Name = "vbox3"; this.vbox3.Spacing = 6; // Container child vbox3.Gtk.Box+BoxChild this.f_EngineNameLabel = new global::Gtk.Label (); this.f_EngineNameLabel.Name = "f_EngineNameLabel"; this.f_EngineNameLabel.Xalign = 0F; this.f_EngineNameLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("_Engine Name:"); this.f_EngineNameLabel.UseUnderline = true; this.vbox3.Add (this.f_EngineNameLabel); global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.f_EngineNameLabel])); w1.Position = 0; w1.Expand = false; w1.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.f_EngineNameEntry = new global::Gtk.Entry (); this.f_EngineNameEntry.CanFocus = true; this.f_EngineNameEntry.Name = "f_EngineNameEntry"; this.f_EngineNameEntry.IsEditable = true; this.f_EngineNameEntry.InvisibleChar = '●'; this.vbox3.Add (this.f_EngineNameEntry); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.f_EngineNameEntry])); w2.Position = 1; w2.Expand = false; w2.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.label2 = new global::Gtk.Label (); this.label2.Name = "label2"; this.label2.Xpad = 50; this.label2.Xalign = 0F; this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("Profile name of the new engine"); this.label2.UseMarkup = true; this.vbox3.Add (this.label2); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.label2])); w3.Position = 2; w3.Expand = false; w3.Fill = false; this.vbox2.Add (this.vbox3); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox3])); w4.Position = 0; w4.Expand = false; w4.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.vbox4 = new global::Gtk.VBox (); this.vbox4.Name = "vbox4"; this.vbox4.Spacing = 6; this.vbox4.BorderWidth = ((uint)(5)); // Container child vbox4.Gtk.Box+BoxChild this.label7 = new global::Gtk.Label (); this.label7.Name = "label7"; this.label7.Xalign = 0F; this.label7.LabelProp = global::Mono.Unix.Catalog.GetString ("_Default Engine:"); this.label7.UseUnderline = true; this.vbox4.Add (this.label7); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.label7])); w5.Position = 0; w5.Expand = false; w5.Fill = false; // Container child vbox4.Gtk.Box+BoxChild this.f_MakeDefaultEngineCheckButton = new global::Gtk.CheckButton (); this.f_MakeDefaultEngineCheckButton.CanFocus = true; this.f_MakeDefaultEngineCheckButton.Name = "f_MakeDefaultEngineCheckButton"; this.f_MakeDefaultEngineCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Use as new default engine"); this.f_MakeDefaultEngineCheckButton.DrawIndicator = true; this.f_MakeDefaultEngineCheckButton.UseUnderline = true; this.vbox4.Add (this.f_MakeDefaultEngineCheckButton); global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.f_MakeDefaultEngineCheckButton])); w6.Position = 1; w6.Expand = false; w6.Fill = false; // Container child vbox4.Gtk.Box+BoxChild this.label8 = new global::Gtk.Label (); this.label8.Name = "label8"; this.label8.Xpad = 50; this.label8.Xalign = 0F; this.label8.LabelProp = global::Mono.Unix.Catalog.GetString ("If enabled, the current engine will be the default next time Smuxi is started"); this.label8.UseMarkup = true; this.label8.Wrap = true; this.vbox4.Add (this.label8); global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.label8])); w7.Position = 2; w7.Expand = false; w7.Fill = false; this.vbox2.Add (this.vbox4); global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox4])); w8.Position = 1; w8.Expand = false; w8.Fill = false; this.Add (this.vbox2); if ((this.Child != null)) { this.Child.ShowAll (); } this.f_EngineNameLabel.MnemonicWidget = this.f_EngineNameEntry; this.label7.MnemonicWidget = this.f_MakeDefaultEngineCheckButton; this.Hide (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs0000644000175000017500000000736112726351313030073 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class QuickConnectDialog { private global::Gtk.HBox hbox1; private global::Gtk.ScrolledWindow f_ScrolledWindow; private global::Gtk.TreeView f_TreeView; private global::Smuxi.Frontend.Gnome.ServerWidget f_Widget; private global::Gtk.Button f_CancelButton; private global::Gtk.Button f_ConnectButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.QuickConnectDialog this.Name = "Smuxi.Frontend.Gnome.QuickConnectDialog"; this.Title = global::Mono.Unix.Catalog.GetString ("Smuxi - Connect"); this.TypeHint = ((global::Gdk.WindowTypeHint)(1)); this.BorderWidth = ((uint)(5)); this.DefaultWidth = 640; this.DefaultHeight = 480; // Internal child Smuxi.Frontend.Gnome.QuickConnectDialog.VBox global::Gtk.VBox w1 = this.VBox; w1.Name = "dialog-vbox2"; w1.Spacing = 5; w1.BorderWidth = ((uint)(2)); // Container child dialog-vbox2.Gtk.Box+BoxChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; this.hbox1.Spacing = 6; // Container child hbox1.Gtk.Box+BoxChild this.f_ScrolledWindow = new global::Gtk.ScrolledWindow (); this.f_ScrolledWindow.Name = "f_ScrolledWindow"; this.f_ScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child f_ScrolledWindow.Gtk.Container+ContainerChild this.f_TreeView = new global::Gtk.TreeView (); this.f_TreeView.CanFocus = true; this.f_TreeView.Name = "f_TreeView"; this.f_ScrolledWindow.Add (this.f_TreeView); this.hbox1.Add (this.f_ScrolledWindow); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_ScrolledWindow])); w3.Position = 0; // Container child hbox1.Gtk.Box+BoxChild this.f_Widget = new global::Smuxi.Frontend.Gnome.ServerWidget (); this.f_Widget.Events = ((global::Gdk.EventMask)(256)); this.f_Widget.Name = "f_Widget"; this.hbox1.Add (this.f_Widget); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_Widget])); w4.Position = 1; w4.Expand = false; w4.Fill = false; w1.Add (this.hbox1); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(w1 [this.hbox1])); w5.Position = 0; // Internal child Smuxi.Frontend.Gnome.QuickConnectDialog.ActionArea global::Gtk.HButtonBox w6 = this.ActionArea; w6.Name = "dialog-action_area2"; w6.Spacing = 6; w6.BorderWidth = ((uint)(5)); w6.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4)); // Container child dialog-action_area2.Gtk.ButtonBox+ButtonBoxChild this.f_CancelButton = new global::Gtk.Button (); this.f_CancelButton.Name = "f_CancelButton"; this.f_CancelButton.UseStock = true; this.f_CancelButton.UseUnderline = true; this.f_CancelButton.Label = "gtk-cancel"; this.AddActionWidget (this.f_CancelButton, -6); global::Gtk.ButtonBox.ButtonBoxChild w7 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w6 [this.f_CancelButton])); w7.Expand = false; w7.Fill = false; // Container child dialog-action_area2.Gtk.ButtonBox+ButtonBoxChild this.f_ConnectButton = new global::Gtk.Button (); this.f_ConnectButton.Name = "f_ConnectButton"; this.f_ConnectButton.UseStock = true; this.f_ConnectButton.UseUnderline = true; this.f_ConnectButton.Label = "gtk-connect"; this.AddActionWidget (this.f_ConnectButton, -5); global::Gtk.ButtonBox.ButtonBoxChild w8 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w6 [this.f_ConnectButton])); w8.Position = 1; w8.Expand = false; w8.Fill = false; if ((this.Child != null)) { this.Child.ShowAll (); } this.Show (); this.f_ConnectButton.Clicked += new global::System.EventHandler (this.OnConnectButtonClicked); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs0000664000175000017500000003306513411450522033002 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantCredentialsWidget { private global::Gtk.VBox vbox12; private global::Gtk.VBox vbox13; private global::Gtk.Label f_SshUsernameLabel; private global::Gtk.Entry f_SshUsernameEntry; private global::Gtk.Label label9; private global::Gtk.VBox f_SshPasswordVBox; private global::Gtk.Label label14; private global::Gtk.Entry f_SshPasswordEntry; private global::Gtk.Label label15; private global::Gtk.VBox vbox17; private global::Gtk.Label label16; private global::Gtk.FileChooserButton f_SshKeyfileChooserButton; private global::Gtk.Label label17; private global::Gtk.VBox vbox16; private global::Gtk.Label label12; private global::Gtk.Entry f_UsernameEntry; private global::Gtk.Label label13; private global::Gtk.VBox vbox14; private global::Gtk.Label label7; private global::Gtk.Entry f_PasswordEntry; private global::Gtk.Label label10; private global::Gtk.VBox vbox15; private global::Gtk.Label label8; private global::Gtk.Entry f_VerifyPasswordEntry; private global::Gtk.Label label11; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget"; // Container child Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.Gtk.Container+ContainerChild this.vbox12 = new global::Gtk.VBox (); this.vbox12.Name = "vbox12"; this.vbox12.Spacing = 10; this.vbox12.BorderWidth = ((uint)(5)); // Container child vbox12.Gtk.Box+BoxChild this.vbox13 = new global::Gtk.VBox (); this.vbox13.Name = "vbox13"; this.vbox13.Spacing = 6; // Container child vbox13.Gtk.Box+BoxChild this.f_SshUsernameLabel = new global::Gtk.Label (); this.f_SshUsernameLabel.Name = "f_SshUsernameLabel"; this.f_SshUsernameLabel.Xalign = 0F; this.f_SshUsernameLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("_SSH Username: (optional)"); this.f_SshUsernameLabel.UseUnderline = true; this.vbox13.Add (this.f_SshUsernameLabel); global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox13 [this.f_SshUsernameLabel])); w1.Position = 0; w1.Expand = false; w1.Fill = false; // Container child vbox13.Gtk.Box+BoxChild this.f_SshUsernameEntry = new global::Gtk.Entry (); this.f_SshUsernameEntry.CanFocus = true; this.f_SshUsernameEntry.Name = "f_SshUsernameEntry"; this.f_SshUsernameEntry.IsEditable = true; this.f_SshUsernameEntry.InvisibleChar = '●'; this.vbox13.Add (this.f_SshUsernameEntry); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox13 [this.f_SshUsernameEntry])); w2.Position = 1; w2.Expand = false; w2.Fill = false; // Container child vbox13.Gtk.Box+BoxChild this.label9 = new global::Gtk.Label (); this.label9.Name = "label9"; this.label9.Xpad = 50; this.label9.Xalign = 0F; this.label9.LabelProp = global::Mono.Unix.Catalog.GetString ("Username which will be used to log into the SSH server"); this.label9.UseMarkup = true; this.vbox13.Add (this.label9); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox13 [this.label9])); w3.Position = 2; w3.Expand = false; w3.Fill = false; this.vbox12.Add (this.vbox13); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.vbox13])); w4.Position = 0; w4.Expand = false; w4.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.f_SshPasswordVBox = new global::Gtk.VBox (); this.f_SshPasswordVBox.Name = "f_SshPasswordVBox"; this.f_SshPasswordVBox.Spacing = 6; // Container child f_SshPasswordVBox.Gtk.Box+BoxChild this.label14 = new global::Gtk.Label (); this.label14.Name = "label14"; this.label14.Xalign = 0F; this.label14.LabelProp = global::Mono.Unix.Catalog.GetString ("_SSH Password: (optional)"); this.label14.UseUnderline = true; this.f_SshPasswordVBox.Add (this.label14); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.f_SshPasswordVBox [this.label14])); w5.Position = 0; w5.Expand = false; w5.Fill = false; // Container child f_SshPasswordVBox.Gtk.Box+BoxChild this.f_SshPasswordEntry = new global::Gtk.Entry (); this.f_SshPasswordEntry.CanFocus = true; this.f_SshPasswordEntry.Name = "f_SshPasswordEntry"; this.f_SshPasswordEntry.IsEditable = true; this.f_SshPasswordEntry.Visibility = false; this.f_SshPasswordEntry.InvisibleChar = '●'; this.f_SshPasswordVBox.Add (this.f_SshPasswordEntry); global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.f_SshPasswordVBox [this.f_SshPasswordEntry])); w6.Position = 1; w6.Expand = false; w6.Fill = false; // Container child f_SshPasswordVBox.Gtk.Box+BoxChild this.label15 = new global::Gtk.Label (); this.label15.Name = "label15"; this.label15.Xpad = 50; this.label15.Xalign = 0F; this.label15.LabelProp = global::Mono.Unix.Catalog.GetString ("Password which will be used to log into the SSH server. The password is optional if SSH key authorization is used (see below)."); this.label15.UseMarkup = true; this.label15.Wrap = true; this.f_SshPasswordVBox.Add (this.label15); global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.f_SshPasswordVBox [this.label15])); w7.Position = 2; w7.Expand = false; w7.Fill = false; this.vbox12.Add (this.f_SshPasswordVBox); global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.f_SshPasswordVBox])); w8.Position = 1; w8.Expand = false; w8.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.vbox17 = new global::Gtk.VBox (); this.vbox17.Name = "vbox17"; this.vbox17.Spacing = 6; // Container child vbox17.Gtk.Box+BoxChild this.label16 = new global::Gtk.Label (); this.label16.Name = "label16"; this.label16.Xalign = 0F; this.label16.LabelProp = global::Mono.Unix.Catalog.GetString ("_SSH Keyfile: (optional)"); this.label16.UseUnderline = true; this.vbox17.Add (this.label16); global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox17 [this.label16])); w9.Position = 0; w9.Expand = false; w9.Fill = false; // Container child vbox17.Gtk.Box+BoxChild this.f_SshKeyfileChooserButton = new global::Gtk.FileChooserButton (global::Mono.Unix.Catalog.GetString ("Select a File"), ((global::Gtk.FileChooserAction)(0))); this.f_SshKeyfileChooserButton.Name = "f_SshKeyfileChooserButton"; this.f_SshKeyfileChooserButton.ShowHidden = true; this.vbox17.Add (this.f_SshKeyfileChooserButton); global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox17 [this.f_SshKeyfileChooserButton])); w10.Position = 1; w10.Expand = false; w10.Fill = false; // Container child vbox17.Gtk.Box+BoxChild this.label17 = new global::Gtk.Label (); this.label17.Name = "label17"; this.label17.Xpad = 50; this.label17.Xalign = 0F; this.label17.LabelProp = global::Mono.Unix.Catalog.GetString ("SSH private keyfile which will be used to log into the SSH server"); this.label17.UseMarkup = true; this.vbox17.Add (this.label17); global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.vbox17 [this.label17])); w11.Position = 2; w11.Expand = false; w11.Fill = false; this.vbox12.Add (this.vbox17); global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.vbox17])); w12.Position = 2; w12.Expand = false; w12.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.vbox16 = new global::Gtk.VBox (); this.vbox16.Name = "vbox16"; this.vbox16.Spacing = 6; // Container child vbox16.Gtk.Box+BoxChild this.label12 = new global::Gtk.Label (); this.label12.Name = "label12"; this.label12.Xalign = 0F; this.label12.LabelProp = global::Mono.Unix.Catalog.GetString ("_Username:"); this.label12.UseUnderline = true; this.vbox16.Add (this.label12); global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.label12])); w13.Position = 0; w13.Expand = false; w13.Fill = false; // Container child vbox16.Gtk.Box+BoxChild this.f_UsernameEntry = new global::Gtk.Entry (); this.f_UsernameEntry.CanFocus = true; this.f_UsernameEntry.Name = "f_UsernameEntry"; this.f_UsernameEntry.IsEditable = true; this.f_UsernameEntry.InvisibleChar = '●'; this.vbox16.Add (this.f_UsernameEntry); global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.f_UsernameEntry])); w14.Position = 1; w14.Expand = false; w14.Fill = false; // Container child vbox16.Gtk.Box+BoxChild this.label13 = new global::Gtk.Label (); this.label13.Name = "label13"; this.label13.Xpad = 50; this.label13.Xalign = 0F; this.label13.LabelProp = global::Mono.Unix.Catalog.GetString ("Username which will be used to log into the Smuxi server"); this.label13.UseMarkup = true; this.vbox16.Add (this.label13); global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.label13])); w15.Position = 2; w15.Expand = false; w15.Fill = false; this.vbox12.Add (this.vbox16); global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.vbox16])); w16.Position = 3; w16.Expand = false; w16.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.vbox14 = new global::Gtk.VBox (); this.vbox14.Name = "vbox14"; this.vbox14.Spacing = 6; // Container child vbox14.Gtk.Box+BoxChild this.label7 = new global::Gtk.Label (); this.label7.Name = "label7"; this.label7.Xalign = 0F; this.label7.LabelProp = global::Mono.Unix.Catalog.GetString ("_Password:"); this.label7.UseUnderline = true; this.vbox14.Add (this.label7); global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.vbox14 [this.label7])); w17.Position = 0; w17.Expand = false; w17.Fill = false; // Container child vbox14.Gtk.Box+BoxChild this.f_PasswordEntry = new global::Gtk.Entry (); this.f_PasswordEntry.CanFocus = true; this.f_PasswordEntry.Name = "f_PasswordEntry"; this.f_PasswordEntry.IsEditable = true; this.f_PasswordEntry.Visibility = false; this.f_PasswordEntry.InvisibleChar = '●'; this.vbox14.Add (this.f_PasswordEntry); global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.vbox14 [this.f_PasswordEntry])); w18.Position = 1; w18.Expand = false; w18.Fill = false; // Container child vbox14.Gtk.Box+BoxChild this.label10 = new global::Gtk.Label (); this.label10.Name = "label10"; this.label10.Xpad = 50; this.label10.Xalign = 0F; this.label10.LabelProp = global::Mono.Unix.Catalog.GetString ("Password of the user"); this.label10.UseMarkup = true; this.vbox14.Add (this.label10); global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.vbox14 [this.label10])); w19.Position = 2; w19.Expand = false; w19.Fill = false; this.vbox12.Add (this.vbox14); global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.vbox14])); w20.Position = 4; w20.Expand = false; w20.Fill = false; // Container child vbox12.Gtk.Box+BoxChild this.vbox15 = new global::Gtk.VBox (); this.vbox15.Name = "vbox15"; this.vbox15.Spacing = 6; // Container child vbox15.Gtk.Box+BoxChild this.label8 = new global::Gtk.Label (); this.label8.Name = "label8"; this.label8.Xalign = 0F; this.label8.LabelProp = global::Mono.Unix.Catalog.GetString ("_Verify Password:"); this.label8.UseUnderline = true; this.vbox15.Add (this.label8); global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox15 [this.label8])); w21.Position = 0; w21.Expand = false; w21.Fill = false; // Container child vbox15.Gtk.Box+BoxChild this.f_VerifyPasswordEntry = new global::Gtk.Entry (); this.f_VerifyPasswordEntry.CanFocus = true; this.f_VerifyPasswordEntry.Name = "f_VerifyPasswordEntry"; this.f_VerifyPasswordEntry.IsEditable = true; this.f_VerifyPasswordEntry.Visibility = false; this.f_VerifyPasswordEntry.InvisibleChar = '●'; this.vbox15.Add (this.f_VerifyPasswordEntry); global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.vbox15 [this.f_VerifyPasswordEntry])); w22.Position = 1; w22.Expand = false; w22.Fill = false; // Container child vbox15.Gtk.Box+BoxChild this.label11 = new global::Gtk.Label (); this.label11.Name = "label11"; this.label11.Xpad = 50; this.label11.Xalign = 0F; this.label11.LabelProp = global::Mono.Unix.Catalog.GetString ("Repeat the password for verification"); this.label11.UseMarkup = true; this.vbox15.Add (this.label11); global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.vbox15 [this.label11])); w23.Position = 2; w23.Expand = false; w23.Fill = false; this.vbox12.Add (this.vbox15); global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox12 [this.vbox15])); w24.Position = 5; w24.Expand = false; w24.Fill = false; this.Add (this.vbox12); if ((this.Child != null)) { this.Child.ShowAll (); } this.f_SshUsernameLabel.MnemonicWidget = this.f_SshUsernameEntry; this.label14.MnemonicWidget = this.f_SshUsernameEntry; this.label16.MnemonicWidget = this.f_SshKeyfileChooserButton; this.label12.MnemonicWidget = this.f_UsernameEntry; this.label7.MnemonicWidget = this.f_PasswordEntry; this.label8.MnemonicWidget = this.f_VerifyPasswordEntry; this.Hide (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs0000644000175000017500000001654712726351313027173 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class ChatFindDialog { private global::Gtk.VBox vbox2; private global::Gtk.HBox hbox1; private global::Gtk.Label label1; private global::Gtk.Entry f_SearchForEntry; private global::Gtk.VBox vbox3; private global::Gtk.CheckButton f_MatchCaseCheckButton; private global::Gtk.CheckButton f_SearchBackwardsCheckButton; private global::Gtk.CheckButton f_WrapAroundCheckButton; private global::Gtk.CheckButton f_UseRegularExpressionsCheckButton; private global::Gtk.Button f_CloseButton; private global::Gtk.Button f_FindButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.ChatFindDialog this.Name = "Smuxi.Frontend.Gnome.ChatFindDialog"; this.Title = global::Mono.Unix.Catalog.GetString ("Find"); this.WindowPosition = ((global::Gtk.WindowPosition)(4)); this.Resizable = false; this.AllowGrow = false; // Internal child Smuxi.Frontend.Gnome.ChatFindDialog.VBox global::Gtk.VBox w1 = this.VBox; w1.Name = "dialog1_VBox"; w1.BorderWidth = ((uint)(2)); // Container child dialog1_VBox.Gtk.Box+BoxChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; this.vbox2.Spacing = 6; this.vbox2.BorderWidth = ((uint)(10)); // Container child vbox2.Gtk.Box+BoxChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; this.hbox1.Spacing = 6; // Container child hbox1.Gtk.Box+BoxChild this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("_Search for:"); this.label1.UseUnderline = true; this.hbox1.Add (this.label1); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.label1])); w2.Position = 0; w2.Expand = false; w2.Fill = false; // Container child hbox1.Gtk.Box+BoxChild this.f_SearchForEntry = new global::Gtk.Entry (); this.f_SearchForEntry.CanFocus = true; this.f_SearchForEntry.Name = "f_SearchForEntry"; this.f_SearchForEntry.IsEditable = true; this.f_SearchForEntry.InvisibleChar = '●'; this.hbox1.Add (this.f_SearchForEntry); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_SearchForEntry])); w3.Position = 1; this.vbox2.Add (this.hbox1); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1])); w4.Position = 0; w4.Expand = false; w4.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.vbox3 = new global::Gtk.VBox (); this.vbox3.Name = "vbox3"; this.vbox3.Spacing = 6; // Container child vbox3.Gtk.Box+BoxChild this.f_MatchCaseCheckButton = new global::Gtk.CheckButton (); this.f_MatchCaseCheckButton.CanFocus = true; this.f_MatchCaseCheckButton.Name = "f_MatchCaseCheckButton"; this.f_MatchCaseCheckButton.Label = global::Mono.Unix.Catalog.GetString ("_Match Case"); this.f_MatchCaseCheckButton.DrawIndicator = true; this.f_MatchCaseCheckButton.UseUnderline = true; this.vbox3.Add (this.f_MatchCaseCheckButton); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.f_MatchCaseCheckButton])); w5.Position = 0; w5.Expand = false; w5.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.f_SearchBackwardsCheckButton = new global::Gtk.CheckButton (); this.f_SearchBackwardsCheckButton.CanFocus = true; this.f_SearchBackwardsCheckButton.Name = "f_SearchBackwardsCheckButton"; this.f_SearchBackwardsCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Search _Backwards"); this.f_SearchBackwardsCheckButton.DrawIndicator = true; this.f_SearchBackwardsCheckButton.UseUnderline = true; this.vbox3.Add (this.f_SearchBackwardsCheckButton); global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.f_SearchBackwardsCheckButton])); w6.Position = 1; w6.Expand = false; w6.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.f_WrapAroundCheckButton = new global::Gtk.CheckButton (); this.f_WrapAroundCheckButton.CanFocus = true; this.f_WrapAroundCheckButton.Name = "f_WrapAroundCheckButton"; this.f_WrapAroundCheckButton.Label = global::Mono.Unix.Catalog.GetString ("_Wrap Around"); this.f_WrapAroundCheckButton.Active = true; this.f_WrapAroundCheckButton.DrawIndicator = true; this.f_WrapAroundCheckButton.UseUnderline = true; this.vbox3.Add (this.f_WrapAroundCheckButton); global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.f_WrapAroundCheckButton])); w7.Position = 2; w7.Expand = false; w7.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.f_UseRegularExpressionsCheckButton = new global::Gtk.CheckButton (); this.f_UseRegularExpressionsCheckButton.CanFocus = true; this.f_UseRegularExpressionsCheckButton.Name = "f_UseRegularExpressionsCheckButton"; this.f_UseRegularExpressionsCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Use _Regular Expressions"); this.f_UseRegularExpressionsCheckButton.DrawIndicator = true; this.f_UseRegularExpressionsCheckButton.UseUnderline = true; this.vbox3.Add (this.f_UseRegularExpressionsCheckButton); global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.f_UseRegularExpressionsCheckButton])); w8.PackType = ((global::Gtk.PackType)(1)); w8.Position = 3; w8.Expand = false; w8.Fill = false; this.vbox2.Add (this.vbox3); global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox3])); w9.Position = 1; w9.Expand = false; w9.Fill = false; w1.Add (this.vbox2); global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(w1 [this.vbox2])); w10.Position = 0; w10.Expand = false; w10.Fill = false; // Internal child Smuxi.Frontend.Gnome.ChatFindDialog.ActionArea global::Gtk.HButtonBox w11 = this.ActionArea; w11.Name = "dialog1_ActionArea"; w11.Spacing = 6; w11.BorderWidth = ((uint)(5)); w11.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4)); // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_CloseButton = new global::Gtk.Button (); this.f_CloseButton.CanDefault = true; this.f_CloseButton.CanFocus = true; this.f_CloseButton.Name = "f_CloseButton"; this.f_CloseButton.UseStock = true; this.f_CloseButton.UseUnderline = true; this.f_CloseButton.Label = "gtk-close"; this.AddActionWidget (this.f_CloseButton, -7); global::Gtk.ButtonBox.ButtonBoxChild w12 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w11 [this.f_CloseButton])); w12.Expand = false; w12.Fill = false; // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_FindButton = new global::Gtk.Button (); this.f_FindButton.CanDefault = true; this.f_FindButton.CanFocus = true; this.f_FindButton.Name = "f_FindButton"; this.f_FindButton.UseStock = true; this.f_FindButton.UseUnderline = true; this.f_FindButton.Label = "gtk-find"; this.AddActionWidget (this.f_FindButton, 0); global::Gtk.ButtonBox.ButtonBoxChild w13 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w11 [this.f_FindButton])); w13.Position = 1; w13.Expand = false; w13.Fill = false; if ((this.Child != null)) { this.Child.ShowAll (); } this.DefaultWidth = 400; this.DefaultHeight = 300; this.label1.MnemonicWidget = this.f_SearchForEntry; this.Show (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs0000644000175000017500000002370412726351313032647 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantConnectionWidget { private global::Gtk.VBox vbox2; private global::Gtk.VBox vbox4; private global::Gtk.CheckButton f_UseSshTunnelCheckButton; private global::Gtk.Label label6; private global::Gtk.Table table1; private global::Gtk.Entry f_HostEntry; private global::Gtk.SpinButton f_PortSpinButton; private global::Gtk.Entry f_SshHostEntry; private global::Gtk.SpinButton f_SshPortSpinButton; private global::Gtk.Label label1; private global::Gtk.Label label10; private global::Gtk.Label label11; private global::Gtk.Label label5; private global::Gtk.Label label7; private global::Gtk.Label label9; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget"; // Container child Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.Gtk.Container+ContainerChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; this.vbox2.Spacing = 10; this.vbox2.BorderWidth = ((uint)(5)); // Container child vbox2.Gtk.Box+BoxChild this.vbox4 = new global::Gtk.VBox (); this.vbox4.Name = "vbox4"; this.vbox4.Spacing = 6; // Container child vbox4.Gtk.Box+BoxChild this.f_UseSshTunnelCheckButton = new global::Gtk.CheckButton (); this.f_UseSshTunnelCheckButton.CanFocus = true; this.f_UseSshTunnelCheckButton.Name = "f_UseSshTunnelCheckButton"; this.f_UseSshTunnelCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Use _SSH Tunnel"); this.f_UseSshTunnelCheckButton.Active = true; this.f_UseSshTunnelCheckButton.DrawIndicator = true; this.f_UseSshTunnelCheckButton.UseUnderline = true; this.vbox4.Add (this.f_UseSshTunnelCheckButton); global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.f_UseSshTunnelCheckButton])); w1.Position = 0; w1.Expand = false; w1.Fill = false; // Container child vbox4.Gtk.Box+BoxChild this.label6 = new global::Gtk.Label (); this.label6.Name = "label6"; this.label6.Xpad = 50; this.label6.Xalign = 0F; this.label6.LabelProp = global::Mono.Unix.Catalog.GetString ("Enables the use of SSH for the connection. This has a small performance impact, but is more secure and required when using NAT or port-based firewalls"); this.label6.UseMarkup = true; this.label6.Wrap = true; this.vbox4.Add (this.label6); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.label6])); w2.Position = 1; w2.Expand = false; w2.Fill = false; this.vbox2.Add (this.vbox4); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox4])); w3.Position = 0; w3.Expand = false; w3.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.table1 = new global::Gtk.Table (((uint)(4)), ((uint)(4)), false); this.table1.Name = "table1"; this.table1.RowSpacing = ((uint)(5)); this.table1.ColumnSpacing = ((uint)(6)); // Container child table1.Gtk.Table+TableChild this.f_HostEntry = new global::Gtk.Entry (); this.f_HostEntry.Sensitive = false; this.f_HostEntry.CanFocus = true; this.f_HostEntry.Name = "f_HostEntry"; this.f_HostEntry.Text = "localhost"; this.f_HostEntry.IsEditable = true; this.f_HostEntry.InvisibleChar = '●'; this.table1.Add (this.f_HostEntry); global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1 [this.f_HostEntry])); w4.TopAttach = ((uint)(2)); w4.BottomAttach = ((uint)(3)); w4.LeftAttach = ((uint)(1)); w4.RightAttach = ((uint)(2)); w4.XOptions = ((global::Gtk.AttachOptions)(4)); w4.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.f_PortSpinButton = new global::Gtk.SpinButton (1, 65535, 1); this.f_PortSpinButton.CanFocus = true; this.f_PortSpinButton.Name = "f_PortSpinButton"; this.f_PortSpinButton.Adjustment.PageIncrement = 1; this.f_PortSpinButton.ClimbRate = 1; this.f_PortSpinButton.Numeric = true; this.f_PortSpinButton.Value = 7689; this.table1.Add (this.f_PortSpinButton); global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1 [this.f_PortSpinButton])); w5.TopAttach = ((uint)(2)); w5.BottomAttach = ((uint)(3)); w5.LeftAttach = ((uint)(3)); w5.RightAttach = ((uint)(4)); w5.XOptions = ((global::Gtk.AttachOptions)(4)); w5.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.f_SshHostEntry = new global::Gtk.Entry (); this.f_SshHostEntry.CanFocus = true; this.f_SshHostEntry.Name = "f_SshHostEntry"; this.f_SshHostEntry.IsEditable = true; this.f_SshHostEntry.InvisibleChar = '●'; this.table1.Add (this.f_SshHostEntry); global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table1 [this.f_SshHostEntry])); w6.LeftAttach = ((uint)(1)); w6.RightAttach = ((uint)(2)); w6.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.f_SshPortSpinButton = new global::Gtk.SpinButton (1, 65535, 1); this.f_SshPortSpinButton.CanFocus = true; this.f_SshPortSpinButton.Name = "f_SshPortSpinButton"; this.f_SshPortSpinButton.Adjustment.PageIncrement = 1; this.f_SshPortSpinButton.ClimbRate = 1; this.f_SshPortSpinButton.Numeric = true; this.f_SshPortSpinButton.Value = 22; this.table1.Add (this.f_SshPortSpinButton); global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table1 [this.f_SshPortSpinButton])); w7.LeftAttach = ((uint)(3)); w7.RightAttach = ((uint)(4)); w7.XOptions = ((global::Gtk.AttachOptions)(4)); w7.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; this.label1.Xalign = 0F; this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("SSH _Host:"); this.label1.UseUnderline = true; this.table1.Add (this.label1); global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table1 [this.label1])); w8.XOptions = ((global::Gtk.AttachOptions)(4)); w8.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label10 = new global::Gtk.Label (); this.label10.Name = "label10"; this.label10.Xpad = 50; this.label10.Xalign = 0F; this.label10.LabelProp = global::Mono.Unix.Catalog.GetString ("DNS or IP address and port of the SSH server"); this.label10.UseMarkup = true; this.table1.Add (this.label10); global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.table1 [this.label10])); w9.TopAttach = ((uint)(1)); w9.BottomAttach = ((uint)(2)); w9.RightAttach = ((uint)(4)); w9.XOptions = ((global::Gtk.AttachOptions)(4)); w9.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label11 = new global::Gtk.Label (); this.label11.Name = "label11"; this.label11.Xalign = 0F; this.label11.LabelProp = global::Mono.Unix.Catalog.GetString ("_Port:"); this.label11.UseUnderline = true; this.table1.Add (this.label11); global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table1 [this.label11])); w10.TopAttach = ((uint)(2)); w10.BottomAttach = ((uint)(3)); w10.LeftAttach = ((uint)(2)); w10.RightAttach = ((uint)(3)); w10.XOptions = ((global::Gtk.AttachOptions)(4)); w10.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label5 = new global::Gtk.Label (); this.label5.Name = "label5"; this.label5.Xalign = 0F; this.label5.LabelProp = global::Mono.Unix.Catalog.GetString ("_Port:"); this.label5.UseUnderline = true; this.table1.Add (this.label5); global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.table1 [this.label5])); w11.LeftAttach = ((uint)(2)); w11.RightAttach = ((uint)(3)); w11.XOptions = ((global::Gtk.AttachOptions)(4)); w11.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label7 = new global::Gtk.Label (); this.label7.Name = "label7"; this.label7.Xpad = 50; this.label7.Xalign = 0F; this.label7.LabelProp = global::Mono.Unix.Catalog.GetString ("DNS or IP address and port of the Smuxi server"); this.label7.UseMarkup = true; this.table1.Add (this.label7); global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.table1 [this.label7])); w12.TopAttach = ((uint)(3)); w12.BottomAttach = ((uint)(4)); w12.RightAttach = ((uint)(4)); w12.XOptions = ((global::Gtk.AttachOptions)(4)); w12.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table1.Gtk.Table+TableChild this.label9 = new global::Gtk.Label (); this.label9.Name = "label9"; this.label9.Xalign = 0F; this.label9.LabelProp = global::Mono.Unix.Catalog.GetString ("_Smuxi Host:"); this.label9.UseUnderline = true; this.table1.Add (this.label9); global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.table1 [this.label9])); w13.TopAttach = ((uint)(2)); w13.BottomAttach = ((uint)(3)); w13.XOptions = ((global::Gtk.AttachOptions)(4)); w13.YOptions = ((global::Gtk.AttachOptions)(4)); this.vbox2.Add (this.table1); global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.table1])); w14.Position = 1; w14.Expand = false; w14.Fill = false; this.Add (this.vbox2); if ((this.Child != null)) { this.Child.ShowAll (); } this.label1.MnemonicWidget = this.f_SshHostEntry; this.label11.MnemonicWidget = this.f_PortSpinButton; this.label5.MnemonicWidget = this.f_SshPortSpinButton; this.label9.MnemonicWidget = this.f_HostEntry; this.Hide (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs0000644000175000017500000000514612726351313026752 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class ServerDialog { private global::Smuxi.Frontend.Gnome.ServerWidget f_Widget; private global::Gtk.Button buttonCancel; private global::Gtk.Button f_OkButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.ServerDialog this.Name = "Smuxi.Frontend.Gnome.ServerDialog"; this.Title = global::Mono.Unix.Catalog.GetString ("Smuxi - Server"); this.WindowPosition = ((global::Gtk.WindowPosition)(4)); // Internal child Smuxi.Frontend.Gnome.ServerDialog.VBox global::Gtk.VBox w1 = this.VBox; w1.Name = "dialog1_VBox"; w1.BorderWidth = ((uint)(2)); // Container child dialog1_VBox.Gtk.Box+BoxChild this.f_Widget = new global::Smuxi.Frontend.Gnome.ServerWidget (); this.f_Widget.Events = ((global::Gdk.EventMask)(256)); this.f_Widget.Name = "f_Widget"; w1.Add (this.f_Widget); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(w1 [this.f_Widget])); w2.Position = 0; w2.Padding = ((uint)(5)); // Internal child Smuxi.Frontend.Gnome.ServerDialog.ActionArea global::Gtk.HButtonBox w3 = this.ActionArea; w3.Name = "dialog1_ActionArea"; w3.Spacing = 10; w3.BorderWidth = ((uint)(5)); w3.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4)); // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.buttonCancel = new global::Gtk.Button (); this.buttonCancel.CanDefault = true; this.buttonCancel.CanFocus = true; this.buttonCancel.Name = "buttonCancel"; this.buttonCancel.UseStock = true; this.buttonCancel.UseUnderline = true; this.buttonCancel.Label = "gtk-cancel"; this.AddActionWidget (this.buttonCancel, -6); global::Gtk.ButtonBox.ButtonBoxChild w4 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w3 [this.buttonCancel])); w4.Expand = false; w4.Fill = false; // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_OkButton = new global::Gtk.Button (); this.f_OkButton.CanDefault = true; this.f_OkButton.CanFocus = true; this.f_OkButton.Name = "f_OkButton"; this.f_OkButton.UseStock = true; this.f_OkButton.UseUnderline = true; this.f_OkButton.Label = "gtk-ok"; this.AddActionWidget (this.f_OkButton, -5); global::Gtk.ButtonBox.ButtonBoxChild w5 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w3 [this.f_OkButton])); w5.Position = 1; w5.Expand = false; w5.Fill = false; if ((this.Child != null)) { this.Child.ShowAll (); } this.DefaultWidth = 392; this.DefaultHeight = 410; this.Show (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs0000644000175000017500000000173412726351313031642 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class EngineAssistantIntroWidget { private global::Gtk.Label label2; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.EngineAssistantIntroWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.EngineAssistantIntroWidget"; // Container child Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.Gtk.Container+ContainerChild this.label2 = new global::Gtk.Label (); this.label2.Name = "label2"; this.label2.Xalign = 0F; this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("Welcome to the Smuxi Engine Configuration Assistant.\nYou need to enter some information before you can use the engine.\n\nClick \"Forward\" to begin."); this.Add (this.label2); if ((this.Child != null)) { this.Child.ShowAll (); } this.Hide (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs0000644000175000017500000000655412726351313026433 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class JoinWidget { private global::Gtk.UIManager UIManager; private global::Gtk.HBox hbox1; private global::Gtk.Entry f_ChatEntry; private global::Gtk.Label label1; private global::Gtk.ComboBox f_NetworkComboBox; private global::Gtk.Button f_JoinButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.JoinWidget Stetic.BinContainer w1 = global::Stetic.BinContainer.Attach (this); this.UIManager = new global::Gtk.UIManager (); global::Gtk.ActionGroup w2 = new global::Gtk.ActionGroup ("Default"); this.UIManager.InsertActionGroup (w2, 0); this.Name = "Smuxi.Frontend.Gnome.JoinWidget"; // Container child Smuxi.Frontend.Gnome.JoinWidget.Gtk.Container+ContainerChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; this.hbox1.Spacing = 6; // Container child hbox1.Gtk.Box+BoxChild this.f_ChatEntry = new global::Gtk.Entry (); this.f_ChatEntry.CanFocus = true; this.f_ChatEntry.Name = "f_ChatEntry"; this.f_ChatEntry.IsEditable = true; this.f_ChatEntry.InvisibleChar = '•'; this.hbox1.Add (this.f_ChatEntry); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_ChatEntry])); w3.Position = 0; // Container child hbox1.Gtk.Box+BoxChild this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; this.label1.LabelProp = "@"; this.hbox1.Add (this.label1); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.label1])); w4.Position = 1; w4.Expand = false; w4.Fill = false; // Container child hbox1.Gtk.Box+BoxChild this.f_NetworkComboBox = global::Gtk.ComboBox.NewText (); this.f_NetworkComboBox.Name = "f_NetworkComboBox"; this.hbox1.Add (this.f_NetworkComboBox); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_NetworkComboBox])); w5.Position = 2; w5.Expand = false; w5.Fill = false; // Container child hbox1.Gtk.Box+BoxChild this.f_JoinButton = new global::Gtk.Button (); this.f_JoinButton.CanFocus = true; this.f_JoinButton.Name = "f_JoinButton"; this.f_JoinButton.UseUnderline = true; // Container child f_JoinButton.Gtk.Container+ContainerChild global::Gtk.Alignment w6 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F); // Container child GtkAlignment.Gtk.Container+ContainerChild global::Gtk.HBox w7 = new global::Gtk.HBox (); w7.Spacing = 2; // Container child GtkHBox.Gtk.Container+ContainerChild global::Gtk.Image w8 = new global::Gtk.Image (); w8.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-go-forward", global::Gtk.IconSize.Menu); w7.Add (w8); // Container child GtkHBox.Gtk.Container+ContainerChild global::Gtk.Label w10 = new global::Gtk.Label (); w10.LabelProp = global::Mono.Unix.Catalog.GetString ("Join"); w10.UseUnderline = true; w7.Add (w10); w6.Add (w7); this.f_JoinButton.Add (w6); this.hbox1.Add (this.f_JoinButton); global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_JoinButton])); w14.Position = 3; w14.Expand = false; w14.Fill = false; this.Add (this.hbox1); if ((this.Child != null)) { this.Child.ShowAll (); } w1.SetUiManager (UIManager); this.Show (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/generated.cs0000644000175000017500000000631512726351313022373 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Stetic { internal class Gui { private static bool initialized; internal static void Initialize (Gtk.Widget iconRenderer) { if ((Stetic.Gui.initialized == false)) { Stetic.Gui.initialized = true; } } } internal class IconLoader { public static Gdk.Pixbuf LoadIcon (Gtk.Widget widget, string name, Gtk.IconSize size) { Gdk.Pixbuf res = widget.RenderIcon (name, size, null); if ((res != null)) { return res; } else { int sz; int sy; global::Gtk.Icon.SizeLookup (size, out sz, out sy); try { return Gtk.IconTheme.Default.LoadIcon (name, sz, 0); } catch (System.Exception) { if ((name != "gtk-missing-image")) { return Stetic.IconLoader.LoadIcon (widget, "gtk-missing-image", size); } else { Gdk.Pixmap pmap = new Gdk.Pixmap (Gdk.Screen.Default.RootWindow, sz, sz); Gdk.GC gc = new Gdk.GC (pmap); gc.RgbFgColor = new Gdk.Color (255, 255, 255); pmap.DrawRectangle (gc, true, 0, 0, sz, sz); gc.RgbFgColor = new Gdk.Color (0, 0, 0); pmap.DrawRectangle (gc, false, 0, 0, (sz - 1), (sz - 1)); gc.SetLineAttributes (3, Gdk.LineStyle.Solid, Gdk.CapStyle.Round, Gdk.JoinStyle.Round); gc.RgbFgColor = new Gdk.Color (255, 0, 0); pmap.DrawLine (gc, (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)), ((sz - 1) - (sz / 4))); pmap.DrawLine (gc, ((sz - 1) - (sz / 4)), (sz / 4), (sz / 4), ((sz - 1) - (sz / 4))); return Gdk.Pixbuf.FromDrawable (pmap, pmap.Colormap, 0, 0, 0, 0, sz, sz); } } } } } internal class BinContainer { private Gtk.Widget child; private Gtk.UIManager uimanager; public static BinContainer Attach (Gtk.Bin bin) { BinContainer bc = new BinContainer (); bin.SizeRequested += new Gtk.SizeRequestedHandler (bc.OnSizeRequested); bin.SizeAllocated += new Gtk.SizeAllocatedHandler (bc.OnSizeAllocated); bin.Added += new Gtk.AddedHandler (bc.OnAdded); return bc; } private void OnSizeRequested (object sender, Gtk.SizeRequestedArgs args) { if ((this.child != null)) { args.Requisition = this.child.SizeRequest (); } } private void OnSizeAllocated (object sender, Gtk.SizeAllocatedArgs args) { if ((this.child != null)) { this.child.Allocation = args.Allocation; } } private void OnAdded (object sender, Gtk.AddedArgs args) { this.child = args.Widget; } public void SetUiManager (Gtk.UIManager uim) { this.uimanager = uim; this.child.Realized += new System.EventHandler (this.OnRealized); } private void OnRealized (object sender, System.EventArgs args) { if ((this.uimanager != null)) { Gtk.Widget w; w = this.child.Toplevel; if (((w != null) && typeof(Gtk.Window).IsInstanceOfType (w))) { ((Gtk.Window)(w)).AddAccelGroup (this.uimanager.AccelGroup); this.uimanager = null; } } } } internal class ActionGroups { public static Gtk.ActionGroup GetActionGroup (System.Type type) { return Stetic.ActionGroups.GetActionGroup (type.FullName); } public static Gtk.ActionGroup GetActionGroup (string name) { return null; } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FilterListWidget.cs0000644000175000017500000000634112726351313027607 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class FilterListWidget { private global::Gtk.HBox hbox1; private global::Gtk.ScrolledWindow scrolledwindow1; private global::Gtk.TreeView f_TreeView; private global::Gtk.VButtonBox vbuttonbox1; private global::Gtk.Button f_AddButton; private global::Gtk.Button f_RemoveButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.FilterListWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.FilterListWidget"; // Container child Smuxi.Frontend.Gnome.FilterListWidget.Gtk.Container+ContainerChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; this.hbox1.Spacing = 5; // Container child hbox1.Gtk.Box+BoxChild this.scrolledwindow1 = new global::Gtk.ScrolledWindow (); this.scrolledwindow1.Name = "scrolledwindow1"; this.scrolledwindow1.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow1.Gtk.Container+ContainerChild this.f_TreeView = new global::Gtk.TreeView (); this.f_TreeView.CanFocus = true; this.f_TreeView.Name = "f_TreeView"; this.scrolledwindow1.Add (this.f_TreeView); this.hbox1.Add (this.scrolledwindow1); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.scrolledwindow1])); w2.Position = 0; // Container child hbox1.Gtk.Box+BoxChild this.vbuttonbox1 = new global::Gtk.VButtonBox (); this.vbuttonbox1.Name = "vbuttonbox1"; this.vbuttonbox1.BorderWidth = ((uint)(5)); this.vbuttonbox1.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(3)); // Container child vbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.f_AddButton = new global::Gtk.Button (); this.f_AddButton.CanFocus = true; this.f_AddButton.Name = "f_AddButton"; this.f_AddButton.UseStock = true; this.f_AddButton.UseUnderline = true; this.f_AddButton.Label = "gtk-add"; this.vbuttonbox1.Add (this.f_AddButton); global::Gtk.ButtonBox.ButtonBoxChild w3 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.vbuttonbox1 [this.f_AddButton])); w3.Expand = false; w3.Fill = false; // Container child vbuttonbox1.Gtk.ButtonBox+ButtonBoxChild this.f_RemoveButton = new global::Gtk.Button (); this.f_RemoveButton.CanFocus = true; this.f_RemoveButton.Name = "f_RemoveButton"; this.f_RemoveButton.UseStock = true; this.f_RemoveButton.UseUnderline = true; this.f_RemoveButton.Label = "gtk-remove"; this.vbuttonbox1.Add (this.f_RemoveButton); global::Gtk.ButtonBox.ButtonBoxChild w4 = ((global::Gtk.ButtonBox.ButtonBoxChild)(this.vbuttonbox1 [this.f_RemoveButton])); w4.Position = 1; w4.Expand = false; w4.Fill = false; this.hbox1.Add (this.vbuttonbox1); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbuttonbox1])); w5.Position = 1; w5.Expand = false; w5.Fill = false; this.Add (this.hbox1); if ((this.Child != null)) { this.Child.ShowAll (); } this.Hide (); this.f_AddButton.Clicked += new global::System.EventHandler (this.OnAddButtonClicked); this.f_RemoveButton.Clicked += new global::System.EventHandler (this.OnRemoveButtonClicked); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs0000644000175000017500000004343212726351313026776 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class ServerWidget { private global::Gtk.VBox vbox16; private global::Gtk.Table table2; private global::Gtk.Label f_HostnameLabel; private global::Gtk.ComboBoxEntry f_NetworkComboBoxEntry; private global::Gtk.Label f_NetworkLabel; private global::Gtk.Entry f_NicknameEntry; private global::Gtk.Label f_NicknameLabel; private global::Gtk.Label f_PasswordLabel; private global::Gtk.ComboBox f_ProtocolComboBox; private global::Gtk.Entry f_RealnameEntry; private global::Gtk.Label f_RealnameLabel; private global::Gtk.Entry f_UsernameEntry; private global::Gtk.HBox hbox10; private global::Gtk.Entry f_HostnameEntry; private global::Gtk.HBox hbox11; private global::Gtk.Label f_PortLabel; private global::Gtk.SpinButton f_PortSpinButton; private global::Gtk.HBox hbox2; private global::Gtk.Entry f_PasswordEntry; private global::Gtk.CheckButton f_ShowPasswordCheckButton; private global::Gtk.Label label21; private global::Gtk.Label label5; private global::Gtk.CheckButton f_OnStartupConnectCheckButton; private global::Gtk.CheckButton f_UseEncryptionCheckButton; private global::Gtk.CheckButton f_ValidateServerCertificateCheckButton; private global::Gtk.VBox vbox2; private global::Gtk.HBox hbox3; private global::Gtk.Label label37; private global::Gtk.CheckButton f_IgnoreOnConnectCommandsCheckButton; private global::Gtk.ScrolledWindow scrolledwindow1; private global::Gtk.TextView f_OnConnectCommandsTextView; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.ServerWidget global::Stetic.BinContainer.Attach (this); this.Name = "Smuxi.Frontend.Gnome.ServerWidget"; // Container child Smuxi.Frontend.Gnome.ServerWidget.Gtk.Container+ContainerChild this.vbox16 = new global::Gtk.VBox (); this.vbox16.Name = "vbox16"; this.vbox16.Spacing = 5; // Container child vbox16.Gtk.Box+BoxChild this.table2 = new global::Gtk.Table (((uint)(7)), ((uint)(2)), false); this.table2.Name = "table2"; this.table2.RowSpacing = ((uint)(5)); this.table2.ColumnSpacing = ((uint)(5)); // Container child table2.Gtk.Table+TableChild this.f_HostnameLabel = new global::Gtk.Label (); this.f_HostnameLabel.Name = "f_HostnameLabel"; this.f_HostnameLabel.Xalign = 0F; this.f_HostnameLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("_Hostname:"); this.f_HostnameLabel.UseUnderline = true; this.table2.Add (this.f_HostnameLabel); global::Gtk.Table.TableChild w1 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_HostnameLabel])); w1.TopAttach = ((uint)(1)); w1.BottomAttach = ((uint)(2)); // Container child table2.Gtk.Table+TableChild this.f_NetworkComboBoxEntry = global::Gtk.ComboBoxEntry.NewText (); this.f_NetworkComboBoxEntry.Name = "f_NetworkComboBoxEntry"; this.table2.Add (this.f_NetworkComboBoxEntry); global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_NetworkComboBoxEntry])); w2.TopAttach = ((uint)(2)); w2.BottomAttach = ((uint)(3)); w2.LeftAttach = ((uint)(1)); w2.RightAttach = ((uint)(2)); w2.XOptions = ((global::Gtk.AttachOptions)(4)); w2.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.f_NetworkLabel = new global::Gtk.Label (); this.f_NetworkLabel.Name = "f_NetworkLabel"; this.f_NetworkLabel.Xalign = 0F; this.f_NetworkLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("_Network:"); this.f_NetworkLabel.UseUnderline = true; this.table2.Add (this.f_NetworkLabel); global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_NetworkLabel])); w3.TopAttach = ((uint)(2)); w3.BottomAttach = ((uint)(3)); w3.XOptions = ((global::Gtk.AttachOptions)(4)); w3.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.f_NicknameEntry = new global::Gtk.Entry (); this.f_NicknameEntry.CanFocus = true; this.f_NicknameEntry.Name = "f_NicknameEntry"; this.f_NicknameEntry.IsEditable = true; this.f_NicknameEntry.InvisibleChar = '●'; this.table2.Add (this.f_NicknameEntry); global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_NicknameEntry])); w4.TopAttach = ((uint)(3)); w4.BottomAttach = ((uint)(4)); w4.LeftAttach = ((uint)(1)); w4.RightAttach = ((uint)(2)); w4.XOptions = ((global::Gtk.AttachOptions)(4)); w4.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.f_NicknameLabel = new global::Gtk.Label (); this.f_NicknameLabel.Name = "f_NicknameLabel"; this.f_NicknameLabel.Xalign = 0F; this.f_NicknameLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Nickname:"); this.table2.Add (this.f_NicknameLabel); global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_NicknameLabel])); w5.TopAttach = ((uint)(3)); w5.BottomAttach = ((uint)(4)); w5.XOptions = ((global::Gtk.AttachOptions)(4)); w5.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.f_PasswordLabel = new global::Gtk.Label (); this.f_PasswordLabel.Name = "f_PasswordLabel"; this.f_PasswordLabel.Xalign = 0F; this.f_PasswordLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("_Password:"); this.f_PasswordLabel.UseUnderline = true; this.table2.Add (this.f_PasswordLabel); global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_PasswordLabel])); w6.TopAttach = ((uint)(6)); w6.BottomAttach = ((uint)(7)); // Container child table2.Gtk.Table+TableChild this.f_ProtocolComboBox = new global::Gtk.ComboBox (); this.f_ProtocolComboBox.Name = "f_ProtocolComboBox"; this.table2.Add (this.f_ProtocolComboBox); global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_ProtocolComboBox])); w7.LeftAttach = ((uint)(1)); w7.RightAttach = ((uint)(2)); // Container child table2.Gtk.Table+TableChild this.f_RealnameEntry = new global::Gtk.Entry (); this.f_RealnameEntry.CanFocus = true; this.f_RealnameEntry.Name = "f_RealnameEntry"; this.f_RealnameEntry.IsEditable = true; this.f_RealnameEntry.InvisibleChar = '●'; this.table2.Add (this.f_RealnameEntry); global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_RealnameEntry])); w8.TopAttach = ((uint)(4)); w8.BottomAttach = ((uint)(5)); w8.LeftAttach = ((uint)(1)); w8.RightAttach = ((uint)(2)); w8.XOptions = ((global::Gtk.AttachOptions)(4)); w8.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.f_RealnameLabel = new global::Gtk.Label (); this.f_RealnameLabel.Name = "f_RealnameLabel"; this.f_RealnameLabel.Xalign = 0F; this.f_RealnameLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Realname:"); this.table2.Add (this.f_RealnameLabel); global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_RealnameLabel])); w9.TopAttach = ((uint)(4)); w9.BottomAttach = ((uint)(5)); w9.XOptions = ((global::Gtk.AttachOptions)(4)); w9.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.f_UsernameEntry = new global::Gtk.Entry (); this.f_UsernameEntry.Name = "f_UsernameEntry"; this.f_UsernameEntry.IsEditable = true; this.f_UsernameEntry.InvisibleChar = '●'; this.table2.Add (this.f_UsernameEntry); global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table2 [this.f_UsernameEntry])); w10.TopAttach = ((uint)(5)); w10.BottomAttach = ((uint)(6)); w10.LeftAttach = ((uint)(1)); w10.RightAttach = ((uint)(2)); // Container child table2.Gtk.Table+TableChild this.hbox10 = new global::Gtk.HBox (); this.hbox10.Name = "hbox10"; // Container child hbox10.Gtk.Box+BoxChild this.f_HostnameEntry = new global::Gtk.Entry (); this.f_HostnameEntry.Name = "f_HostnameEntry"; this.f_HostnameEntry.IsEditable = true; this.f_HostnameEntry.InvisibleChar = '●'; this.hbox10.Add (this.f_HostnameEntry); global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox10 [this.f_HostnameEntry])); w11.Position = 0; // Container child hbox10.Gtk.Box+BoxChild this.hbox11 = new global::Gtk.HBox (); this.hbox11.Name = "hbox11"; this.hbox11.Spacing = 5; // Container child hbox11.Gtk.Box+BoxChild this.f_PortLabel = new global::Gtk.Label (); this.f_PortLabel.Name = "f_PortLabel"; this.f_PortLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("_Port:"); this.f_PortLabel.UseUnderline = true; this.hbox11.Add (this.f_PortLabel); global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.hbox11 [this.f_PortLabel])); w12.Position = 0; // Container child hbox11.Gtk.Box+BoxChild this.f_PortSpinButton = new global::Gtk.SpinButton (0, 65535, 1); this.f_PortSpinButton.Name = "f_PortSpinButton"; this.f_PortSpinButton.Adjustment.PageIncrement = 10; this.f_PortSpinButton.Adjustment.PageSize = 10; this.f_PortSpinButton.ClimbRate = 1; this.f_PortSpinButton.Numeric = true; this.hbox11.Add (this.f_PortSpinButton); global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.hbox11 [this.f_PortSpinButton])); w13.Position = 1; this.hbox10.Add (this.hbox11); global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.hbox10 [this.hbox11])); w14.Position = 1; this.table2.Add (this.hbox10); global::Gtk.Table.TableChild w15 = ((global::Gtk.Table.TableChild)(this.table2 [this.hbox10])); w15.TopAttach = ((uint)(1)); w15.BottomAttach = ((uint)(2)); w15.LeftAttach = ((uint)(1)); w15.RightAttach = ((uint)(2)); // Container child table2.Gtk.Table+TableChild this.hbox2 = new global::Gtk.HBox (); this.hbox2.Name = "hbox2"; this.hbox2.Spacing = 6; // Container child hbox2.Gtk.Box+BoxChild this.f_PasswordEntry = new global::Gtk.Entry (); this.f_PasswordEntry.Name = "f_PasswordEntry"; this.f_PasswordEntry.IsEditable = true; this.f_PasswordEntry.Visibility = false; this.f_PasswordEntry.InvisibleChar = '●'; this.hbox2.Add (this.f_PasswordEntry); global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.f_PasswordEntry])); w16.Position = 0; // Container child hbox2.Gtk.Box+BoxChild this.f_ShowPasswordCheckButton = new global::Gtk.CheckButton (); this.f_ShowPasswordCheckButton.CanFocus = true; this.f_ShowPasswordCheckButton.Name = "f_ShowPasswordCheckButton"; this.f_ShowPasswordCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Show Password"); this.f_ShowPasswordCheckButton.DrawIndicator = true; this.f_ShowPasswordCheckButton.UseUnderline = true; this.hbox2.Add (this.f_ShowPasswordCheckButton); global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.f_ShowPasswordCheckButton])); w17.Position = 1; this.table2.Add (this.hbox2); global::Gtk.Table.TableChild w18 = ((global::Gtk.Table.TableChild)(this.table2 [this.hbox2])); w18.TopAttach = ((uint)(6)); w18.BottomAttach = ((uint)(7)); w18.LeftAttach = ((uint)(1)); w18.RightAttach = ((uint)(2)); w18.XOptions = ((global::Gtk.AttachOptions)(4)); w18.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child table2.Gtk.Table+TableChild this.label21 = new global::Gtk.Label (); this.label21.Name = "label21"; this.label21.Xalign = 0F; this.label21.LabelProp = global::Mono.Unix.Catalog.GetString ("_Username:"); this.label21.UseUnderline = true; this.table2.Add (this.label21); global::Gtk.Table.TableChild w19 = ((global::Gtk.Table.TableChild)(this.table2 [this.label21])); w19.TopAttach = ((uint)(5)); w19.BottomAttach = ((uint)(6)); // Container child table2.Gtk.Table+TableChild this.label5 = new global::Gtk.Label (); this.label5.Name = "label5"; this.label5.Xalign = 0F; this.label5.LabelProp = global::Mono.Unix.Catalog.GetString ("_Protocol:"); this.label5.UseUnderline = true; this.table2.Add (this.label5); this.vbox16.Add (this.table2); global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.table2])); w21.Position = 0; w21.Expand = false; // Container child vbox16.Gtk.Box+BoxChild this.f_OnStartupConnectCheckButton = new global::Gtk.CheckButton (); this.f_OnStartupConnectCheckButton.CanFocus = true; this.f_OnStartupConnectCheckButton.Name = "f_OnStartupConnectCheckButton"; this.f_OnStartupConnectCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Automatically connect to server at startup"); this.f_OnStartupConnectCheckButton.DrawIndicator = true; this.f_OnStartupConnectCheckButton.UseUnderline = true; this.f_OnStartupConnectCheckButton.Xalign = 0F; this.vbox16.Add (this.f_OnStartupConnectCheckButton); global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.f_OnStartupConnectCheckButton])); w22.Position = 1; w22.Expand = false; w22.Fill = false; // Container child vbox16.Gtk.Box+BoxChild this.f_UseEncryptionCheckButton = new global::Gtk.CheckButton (); this.f_UseEncryptionCheckButton.CanFocus = true; this.f_UseEncryptionCheckButton.Name = "f_UseEncryptionCheckButton"; this.f_UseEncryptionCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Use Encryption"); this.f_UseEncryptionCheckButton.DrawIndicator = true; this.f_UseEncryptionCheckButton.UseUnderline = true; this.vbox16.Add (this.f_UseEncryptionCheckButton); global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.f_UseEncryptionCheckButton])); w23.Position = 2; w23.Expand = false; w23.Fill = false; // Container child vbox16.Gtk.Box+BoxChild this.f_ValidateServerCertificateCheckButton = new global::Gtk.CheckButton (); this.f_ValidateServerCertificateCheckButton.CanFocus = true; this.f_ValidateServerCertificateCheckButton.Name = "f_ValidateServerCertificateCheckButton"; this.f_ValidateServerCertificateCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Validate Server Certificate"); this.f_ValidateServerCertificateCheckButton.DrawIndicator = true; this.f_ValidateServerCertificateCheckButton.UseUnderline = true; this.vbox16.Add (this.f_ValidateServerCertificateCheckButton); global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.f_ValidateServerCertificateCheckButton])); w24.Position = 3; w24.Expand = false; w24.Fill = false; // Container child vbox16.Gtk.Box+BoxChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; this.vbox2.Spacing = 5; // Container child vbox2.Gtk.Box+BoxChild this.hbox3 = new global::Gtk.HBox (); this.hbox3.Name = "hbox3"; this.hbox3.Spacing = 6; // Container child hbox3.Gtk.Box+BoxChild this.label37 = new global::Gtk.Label (); this.label37.Name = "label37"; this.label37.Xalign = 0F; this.label37.LabelProp = global::Mono.Unix.Catalog.GetString ("_On Connect Commands:"); this.label37.UseUnderline = true; this.hbox3.Add (this.label37); global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.label37])); w25.Position = 0; w25.Expand = false; w25.Fill = false; // Container child hbox3.Gtk.Box+BoxChild this.f_IgnoreOnConnectCommandsCheckButton = new global::Gtk.CheckButton (); this.f_IgnoreOnConnectCommandsCheckButton.CanFocus = true; this.f_IgnoreOnConnectCommandsCheckButton.Name = "f_IgnoreOnConnectCommandsCheckButton"; this.f_IgnoreOnConnectCommandsCheckButton.Label = global::Mono.Unix.Catalog.GetString ("_Ignore Commands"); this.f_IgnoreOnConnectCommandsCheckButton.DrawIndicator = true; this.f_IgnoreOnConnectCommandsCheckButton.UseUnderline = true; this.hbox3.Add (this.f_IgnoreOnConnectCommandsCheckButton); global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.f_IgnoreOnConnectCommandsCheckButton])); w26.Position = 1; this.vbox2.Add (this.hbox3); global::Gtk.Box.BoxChild w27 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox3])); w27.Position = 0; w27.Expand = false; w27.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.scrolledwindow1 = new global::Gtk.ScrolledWindow (); this.scrolledwindow1.WidthRequest = 350; this.scrolledwindow1.HeightRequest = 100; this.scrolledwindow1.Name = "scrolledwindow1"; this.scrolledwindow1.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child scrolledwindow1.Gtk.Container+ContainerChild this.f_OnConnectCommandsTextView = new global::Gtk.TextView (); this.f_OnConnectCommandsTextView.WidthRequest = 152; this.f_OnConnectCommandsTextView.HeightRequest = 168; this.f_OnConnectCommandsTextView.Name = "f_OnConnectCommandsTextView"; this.f_OnConnectCommandsTextView.WrapMode = ((global::Gtk.WrapMode)(2)); this.scrolledwindow1.Add (this.f_OnConnectCommandsTextView); this.vbox2.Add (this.scrolledwindow1); global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.scrolledwindow1])); w29.Position = 1; this.vbox16.Add (this.vbox2); global::Gtk.Box.BoxChild w30 = ((global::Gtk.Box.BoxChild)(this.vbox16 [this.vbox2])); w30.Position = 4; this.Add (this.vbox16); if ((this.Child != null)) { this.Child.ShowAll (); } this.f_HostnameLabel.MnemonicWidget = this.f_HostnameEntry; this.f_NetworkLabel.MnemonicWidget = this.f_NetworkComboBoxEntry; this.f_NicknameLabel.MnemonicWidget = this.f_NicknameEntry; this.f_PasswordLabel.MnemonicWidget = this.f_PasswordEntry; this.f_RealnameLabel.MnemonicWidget = this.f_RealnameEntry; this.f_PortLabel.MnemonicWidget = this.f_PortSpinButton; this.label21.MnemonicWidget = this.f_UsernameEntry; this.label5.MnemonicWidget = this.f_ProtocolComboBox; this.label37.MnemonicWidget = this.f_OnConnectCommandsTextView; this.Hide (); } } } smuxi-1.1/src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs0000644000175000017500000001332312726351313030175 0ustar00meebeymeebey00000000000000 // This file has been generated by the GUI designer. Do not modify. namespace Smuxi.Frontend.Gnome { public partial class FindGroupChatDialog { private global::Gtk.VBox vbox2; private global::Gtk.HBox hbox1; private global::Gtk.HBox hbox2; private global::Gtk.Label label1; private global::Gtk.Entry f_NameEntry; private global::Gtk.Button f_FindButton; private global::Gtk.ScrolledWindow GtkScrolledWindow; private global::Gtk.TreeView f_TreeView; private global::Gtk.Button f_CancelButton; private global::Gtk.Button f_OKButton; protected virtual void Build () { global::Stetic.Gui.Initialize (this); // Widget Smuxi.Frontend.Gnome.FindGroupChatDialog this.Name = "Smuxi.Frontend.Gnome.FindGroupChatDialog"; this.Title = global::Mono.Unix.Catalog.GetString ("Smuxi - Find Group Chat"); this.Icon = global::Stetic.IconLoader.LoadIcon (this, "gtk-find", global::Gtk.IconSize.Menu); this.WindowPosition = ((global::Gtk.WindowPosition)(4)); this.DefaultWidth = 640; this.DefaultHeight = 480; // Internal child Smuxi.Frontend.Gnome.FindGroupChatDialog.VBox global::Gtk.VBox w1 = this.VBox; w1.Name = "dialog1_VBox"; w1.BorderWidth = ((uint)(2)); // Container child dialog1_VBox.Gtk.Box+BoxChild this.vbox2 = new global::Gtk.VBox (); this.vbox2.Name = "vbox2"; this.vbox2.Spacing = 6; // Container child vbox2.Gtk.Box+BoxChild this.hbox1 = new global::Gtk.HBox (); this.hbox1.Name = "hbox1"; this.hbox1.Spacing = 6; // Container child hbox1.Gtk.Box+BoxChild this.hbox2 = new global::Gtk.HBox (); this.hbox2.Name = "hbox2"; this.hbox2.Spacing = 6; // Container child hbox2.Gtk.Box+BoxChild this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("_Name:"); this.label1.UseUnderline = true; this.hbox2.Add (this.label1); global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.label1])); w2.Position = 0; w2.Expand = false; w2.Fill = false; // Container child hbox2.Gtk.Box+BoxChild this.f_NameEntry = new global::Gtk.Entry (); this.f_NameEntry.CanDefault = true; this.f_NameEntry.CanFocus = true; this.f_NameEntry.Name = "f_NameEntry"; this.f_NameEntry.IsEditable = true; this.f_NameEntry.InvisibleChar = '●'; this.hbox2.Add (this.f_NameEntry); global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.f_NameEntry])); w3.Position = 1; this.hbox1.Add (this.hbox2); global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.hbox2])); w4.Position = 0; // Container child hbox1.Gtk.Box+BoxChild this.f_FindButton = new global::Gtk.Button (); this.f_FindButton.CanFocus = true; this.f_FindButton.Name = "f_FindButton"; this.f_FindButton.UseStock = true; this.f_FindButton.UseUnderline = true; this.f_FindButton.Label = "gtk-find"; this.hbox1.Add (this.f_FindButton); global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.f_FindButton])); w5.Position = 1; w5.Expand = false; w5.Fill = false; this.vbox2.Add (this.hbox1); global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1])); w6.Position = 0; w6.Expand = false; w6.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.GtkScrolledWindow = new global::Gtk.ScrolledWindow (); this.GtkScrolledWindow.Name = "GtkScrolledWindow"; this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1)); // Container child GtkScrolledWindow.Gtk.Container+ContainerChild this.f_TreeView = new global::Gtk.TreeView (); this.f_TreeView.CanFocus = true; this.f_TreeView.Name = "f_TreeView"; this.GtkScrolledWindow.Add (this.f_TreeView); this.vbox2.Add (this.GtkScrolledWindow); global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.GtkScrolledWindow])); w8.Position = 1; w1.Add (this.vbox2); global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(w1 [this.vbox2])); w9.Position = 0; // Internal child Smuxi.Frontend.Gnome.FindGroupChatDialog.ActionArea global::Gtk.HButtonBox w10 = this.ActionArea; w10.Name = "dialog1_ActionArea"; w10.Spacing = 6; w10.BorderWidth = ((uint)(5)); w10.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4)); // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_CancelButton = new global::Gtk.Button (); this.f_CancelButton.CanDefault = true; this.f_CancelButton.CanFocus = true; this.f_CancelButton.Name = "f_CancelButton"; this.f_CancelButton.UseStock = true; this.f_CancelButton.UseUnderline = true; this.f_CancelButton.Label = "gtk-cancel"; this.AddActionWidget (this.f_CancelButton, -6); global::Gtk.ButtonBox.ButtonBoxChild w11 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w10 [this.f_CancelButton])); w11.Expand = false; w11.Fill = false; // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild this.f_OKButton = new global::Gtk.Button (); this.f_OKButton.CanDefault = true; this.f_OKButton.CanFocus = true; this.f_OKButton.Name = "f_OKButton"; this.f_OKButton.UseStock = true; this.f_OKButton.UseUnderline = true; this.f_OKButton.Label = "gtk-ok"; this.AddActionWidget (this.f_OKButton, -5); global::Gtk.ButtonBox.ButtonBoxChild w12 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w10 [this.f_OKButton])); w12.Position = 1; w12.Expand = false; w12.Fill = false; if ((this.Child != null)) { this.Child.ShowAll (); } this.label1.MnemonicWidget = this.f_NameEntry; this.Show (); this.f_NameEntry.Activated += new global::System.EventHandler (this.OnNameEntryActivated); this.f_FindButton.Clicked += new global::System.EventHandler (this.OnFindButtonClicked); } } } smuxi-1.1/src/Frontend-GNOME/osx/0000775000175000017500000000000014011526501017335 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME/osx/ApplicationEvents.cs0000644000175000017500000002012612250426634023324 0ustar00meebeymeebey00000000000000// // ApplicationEvents.cs // // Author: // Michael Hutchinson // // Copyright (c) 2010 Novell, Inc. (http://www.novell.com) // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; namespace MonoDevelop.MacInterop { public static class ApplicationEvents { static object lockObj = new object (); #region Quit static EventHandler quit; static IntPtr quitHandlerRef = IntPtr.Zero; public static event EventHandler Quit { add { lock (lockObj) { quit += value; if (quitHandlerRef == IntPtr.Zero) quitHandlerRef = Carbon.InstallApplicationEventHandler (HandleQuit, CarbonEventApple.QuitApplication); } } remove { lock (lockObj) { quit -= value; if (quit == null && quitHandlerRef != IntPtr.Zero) { Carbon.RemoveEventHandler (quitHandlerRef); quitHandlerRef = IntPtr.Zero; } } } } static CarbonEventHandlerStatus HandleQuit (IntPtr callRef, IntPtr eventRef, IntPtr user_data) { var args = new ApplicationQuitEventArgs (); quit (null, args); return args.UserCancelled? CarbonEventHandlerStatus.UserCancelled : args.HandledStatus; } #endregion #region Reopen static EventHandler reopen; static IntPtr reopenHandlerRef = IntPtr.Zero; public static event EventHandler Reopen { add { lock (lockObj) { reopen += value; if (reopenHandlerRef == IntPtr.Zero) reopenHandlerRef = Carbon.InstallApplicationEventHandler (HandleReopen, CarbonEventApple.ReopenApplication); } } remove { lock (lockObj) { reopen -= value; if (reopen == null && reopenHandlerRef != IntPtr.Zero) { Carbon.RemoveEventHandler (reopenHandlerRef); reopenHandlerRef = IntPtr.Zero; } } } } static CarbonEventHandlerStatus HandleReopen (IntPtr callRef, IntPtr eventRef, IntPtr user_data) { var args = new ApplicationEventArgs (); reopen (null, args); return args.HandledStatus; } #endregion #region OpenDocuments static EventHandler openDocuments; static IntPtr openDocumentsHandlerRef = IntPtr.Zero; public static event EventHandler OpenDocuments { add { lock (lockObj) { openDocuments += value; if (openDocumentsHandlerRef == IntPtr.Zero) openDocumentsHandlerRef = Carbon.InstallApplicationEventHandler (HandleOpenDocuments, CarbonEventApple.OpenDocuments); } } remove { lock (lockObj) { openDocuments -= value; if (openDocuments == null && openDocumentsHandlerRef != IntPtr.Zero) { Carbon.RemoveEventHandler (openDocumentsHandlerRef); openDocumentsHandlerRef = IntPtr.Zero; } } } } static CarbonEventHandlerStatus HandleOpenDocuments (IntPtr callRef, IntPtr eventRef, IntPtr user_data) { try { var docs = Carbon.GetFileListFromEventRef (eventRef); var args = new ApplicationDocumentEventArgs (docs); openDocuments (null, args); return args.HandledStatus; } catch (Exception ex) { System.Console.WriteLine (ex); return CarbonEventHandlerStatus.NotHandled; } } #endregion #region OpenUrls static EventHandler openUrls; static IntPtr openUrlsHandlerRef = IntPtr.Zero; public static event EventHandler OpenUrls { add { lock (lockObj) { openUrls += value; if (openUrlsHandlerRef == IntPtr.Zero) openUrlsHandlerRef = Carbon.InstallApplicationEventHandler (HandleOpenUrls, new CarbonEventTypeSpec[] { //For some reason GetUrl doesn't take CarbonEventClass.AppleEvent //need to use GURL, GURL new CarbonEventTypeSpec (CarbonEventClass.Internet, (int)CarbonEventApple.GetUrl) } ); } } remove { lock (lockObj) { openUrls -= value; if (openUrls == null && openUrlsHandlerRef != IntPtr.Zero) { Carbon.RemoveEventHandler (openUrlsHandlerRef); openUrlsHandlerRef = IntPtr.Zero; } } } } static CarbonEventHandlerStatus HandleOpenUrls (IntPtr callRef, IntPtr eventRef, IntPtr user_data) { try { var urls = Carbon.GetUrlListFromEventRef (eventRef); var args = new ApplicationUrlEventArgs (urls); openUrls (null, args); return args.HandledStatus; } catch (Exception ex) { System.Console.WriteLine (ex); return CarbonEventHandlerStatus.NotHandled; } } #endregion } public class ApplicationEventArgs : EventArgs { public bool Handled { get; set; } internal CarbonEventHandlerStatus HandledStatus { get { return Handled? CarbonEventHandlerStatus.Handled : CarbonEventHandlerStatus.NotHandled; } } } public class ApplicationQuitEventArgs : ApplicationEventArgs { public bool UserCancelled { get; set; } } public class ApplicationDocumentEventArgs : ApplicationEventArgs { public ApplicationDocumentEventArgs (IDictionary documents) { this.Documents = documents; } public IDictionary Documents { get; private set; } } public class ApplicationUrlEventArgs : ApplicationEventArgs { public ApplicationUrlEventArgs (IList urls) { this.Urls = urls; } public IList Urls { get; private set; } } } smuxi-1.1/src/Frontend-GNOME/osx/IgeMacMenu.cs0000644000175000017500000000462712250426634021656 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Runtime.InteropServices; namespace IgeMacIntegration { public class IgeMacMenu { [DllImport("libigemacintegration.dylib")] static extern void ige_mac_menu_connect_window_key_handler (IntPtr window); public static void ConnectWindowKeyHandler (Gtk.Window window) { ige_mac_menu_connect_window_key_handler (window.Handle); } [DllImport("libigemacintegration.dylib")] static extern void ige_mac_menu_set_global_key_handler_enabled (bool enabled); public static bool GlobalKeyHandlerEnabled { set { ige_mac_menu_set_global_key_handler_enabled (value); } } [DllImport("libigemacintegration.dylib")] static extern void ige_mac_menu_set_menu_bar(IntPtr menu_shell); public static Gtk.MenuShell MenuBar { set { ige_mac_menu_set_menu_bar(value == null ? IntPtr.Zero : value.Handle); } } [DllImport("libigemacintegration.dylib")] static extern void ige_mac_menu_set_quit_menu_item(IntPtr quit_item); public static Gtk.MenuItem QuitMenuItem { set { ige_mac_menu_set_quit_menu_item(value == null ? IntPtr.Zero : value.Handle); } } [DllImport("libigemacintegration.dylib")] static extern IntPtr ige_mac_menu_add_app_menu_group(); public static IgeMacIntegration.IgeMacMenuGroup AddAppMenuGroup() { IntPtr raw_ret = ige_mac_menu_add_app_menu_group(); IgeMacIntegration.IgeMacMenuGroup ret = raw_ret == IntPtr.Zero ? null : (IgeMacIntegration.IgeMacMenuGroup) GLib.Opaque.GetOpaque (raw_ret, typeof (IgeMacIntegration.IgeMacMenuGroup), false); return ret; } } public class IgeMacMenuGroup : GLib.Opaque { [DllImport("libigemacintegration.dylib")] static extern void ige_mac_menu_add_app_menu_item(IntPtr raw, IntPtr menu_item, IntPtr label); public void AddMenuItem(Gtk.MenuItem menu_item, string label) { IntPtr native_label = GLib.Marshaller.StringToPtrGStrdup (label); ige_mac_menu_add_app_menu_item(Handle, menu_item == null ? IntPtr.Zero : menu_item.Handle, native_label); GLib.Marshaller.Free (native_label); } public IgeMacMenuGroup(IntPtr raw) : base(raw) {} } }smuxi-1.1/src/Frontend-GNOME/osx/CoreFoundation.cs0000644000175000017500000002011512250426634022611 0ustar00meebeymeebey00000000000000// // CoreFoundation.cs // // Author: // Michael Hutchinson // Miguel de Icaza // // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Runtime.InteropServices; namespace MonoDevelop.MacInterop { internal static class CoreFoundation { const string CFLib = "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation"; const string LSLib = "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices"; [DllImport (CFLib)] static extern IntPtr CFStringCreateWithCString (IntPtr alloc, string str, int encoding); public static IntPtr CreateString (string s) { // The magic value is "kCFStringENcodingUTF8" return CFStringCreateWithCString (IntPtr.Zero, s, 0x08000100); } [DllImport (CFLib, EntryPoint="CFRelease")] public static extern void Release (IntPtr cfRef); struct CFRange { public int Location, Length; public CFRange (int l, int len) { Location = l; Length = len; } } [DllImport (CFLib, CharSet=CharSet.Unicode)] extern static int CFStringGetLength (IntPtr handle); [DllImport (CFLib, CharSet=CharSet.Unicode)] extern static IntPtr CFStringGetCharactersPtr (IntPtr handle); [DllImport (CFLib, CharSet=CharSet.Unicode)] extern static IntPtr CFStringGetCharacters (IntPtr handle, CFRange range, IntPtr buffer); public static string FetchString (IntPtr handle) { if (handle == IntPtr.Zero) return null; string str; int l = CFStringGetLength (handle); IntPtr u = CFStringGetCharactersPtr (handle); IntPtr buffer = IntPtr.Zero; if (u == IntPtr.Zero){ CFRange r = new CFRange (0, l); buffer = Marshal.AllocCoTaskMem (l * 2); CFStringGetCharacters (handle, r, buffer); u = buffer; } /* unsafe { str = new string ((char *) u, 0, l); } */ str = Marshal.PtrToStringUni(u, l); if (buffer != IntPtr.Zero) Marshal.FreeCoTaskMem (buffer); return str; } public static string FSRefToString (ref FSRef fsref) { IntPtr url = IntPtr.Zero; IntPtr str = IntPtr.Zero; try { url = CFURLCreateFromFSRef (IntPtr.Zero, ref fsref); if (url == IntPtr.Zero) return null; str = CFURLCopyFileSystemPath (url, CFUrlPathStyle.Posix); if (str == IntPtr.Zero) return null; return FetchString (str); } finally { if (url != IntPtr.Zero) Release (url); if (str != IntPtr.Zero) Release (str); } } [DllImport (CFLib)] extern static IntPtr CFURLCreateFromFSRef (IntPtr allocator, ref FSRef fsref); [DllImport (CFLib)] extern static IntPtr CFURLCopyFileSystemPath (IntPtr urlRef, CFUrlPathStyle pathStyle); enum CFUrlPathStyle { Posix = 0, Hfs = 1, Windows = 2 }; [DllImport (CFLib)] extern static IntPtr CFURLCreateWithFileSystemPath (IntPtr allocator, IntPtr filePathString, CFUrlPathStyle pathStyle, bool isDirectory); [DllImport (LSLib)] extern static IntPtr LSCopyApplicationURLsForURL (IntPtr urlRef, LSRolesMask roleMask); //CFArrayRef [DllImport (LSLib)] extern static int LSGetApplicationForURL (IntPtr url, LSRolesMask roleMask, IntPtr fsRefZero, ref IntPtr appUrl); [DllImport (CFLib)] extern static int CFArrayGetCount (IntPtr theArray); [DllImport (CFLib)] extern static IntPtr CFArrayGetValueAtIndex (IntPtr theArray, int idx); [Flags] public enum LSRolesMask : uint { None = 0x00000001, Viewer = 0x00000002, Editor = 0x00000004, Shell = 0x00000008, All = 0xFFFFFFFF } static IntPtr CreatePathUrl (string path) { IntPtr str = IntPtr.Zero; IntPtr url = IntPtr.Zero; try { str = CreateString (path); if (str == IntPtr.Zero) throw new Exception ("CreateString failed"); url = CFURLCreateWithFileSystemPath (IntPtr.Zero, str, CFUrlPathStyle.Posix, false); if (url == IntPtr.Zero) throw new Exception ("CFURLCreateWithFileSystemPath failed"); return url; } finally { if (str != IntPtr.Zero) Release (str); } } public static string UrlToPath (IntPtr url) { IntPtr str = IntPtr.Zero; try { str = CFURLCopyFileSystemPath (url, CFUrlPathStyle.Posix); return str == IntPtr.Zero? null : FetchString (str); } finally { if (str != IntPtr.Zero) Release (str); } } public static string GetApplicationUrl (string filePath, LSRolesMask roles) { IntPtr url = IntPtr.Zero; try { url = CreatePathUrl (filePath); IntPtr appUrl = IntPtr.Zero; if (LSGetApplicationForURL (url, roles, IntPtr.Zero, ref appUrl) == 0 && appUrl != IntPtr.Zero) return UrlToPath (appUrl); return null; } finally { if (url != IntPtr.Zero) Release (url); } } public static string[] GetApplicationUrls (string filePath, LSRolesMask roles) { IntPtr url = IntPtr.Zero; IntPtr arr = IntPtr.Zero; try { url = CreatePathUrl (filePath); arr = LSCopyApplicationURLsForURL (url, roles); if (arr == IntPtr.Zero) return new string[0]; int count = CFArrayGetCount (arr); string[] values = new string [count]; for (int i = 0; i < values.Length; i++ ) { var u = CFArrayGetValueAtIndex (arr, i); if (u != IntPtr.Zero) values[i] = UrlToPath (u); } return values; } finally { if (url != IntPtr.Zero) Release (url); if (arr != IntPtr.Zero) Release (arr); } } } }smuxi-1.1/src/Frontend-GNOME/osx/Carbon.cs0000644000175000017500000005142212250426634021103 0ustar00meebeymeebey00000000000000// // Carbon.cs // // Author: // Michael Hutchinson // Geoff Norton // // Copyright (c) 2009 Novell, Inc. (http://www.novell.com) // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Diagnostics; namespace MonoDevelop.MacInterop { internal delegate CarbonEventHandlerStatus EventDelegate (IntPtr callRef, IntPtr eventRef, IntPtr userData); internal delegate CarbonEventHandlerStatus AEHandlerDelegate (IntPtr inEvnt, IntPtr outEvt, uint refConst); internal static class Carbon { public const string CarbonLib = "/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon"; [DllImport (CarbonLib)] static extern int Gestalt (int selector, out int result); public static int Gestalt (string selector) { int cc = ConvertCharCode (selector); int result; int ret = Gestalt (cc, out result); CheckReturn (ret); return result; } [DllImport (CarbonLib)] public static extern IntPtr GetApplicationEventTarget (); [DllImport (CarbonLib)] public static extern IntPtr GetControlEventTarget (IntPtr control); [DllImport (CarbonLib)] public static extern IntPtr GetWindowEventTarget (IntPtr window); [DllImport (CarbonLib)] public static extern IntPtr GetMenuEventTarget (IntPtr menu); [DllImport (CarbonLib)] public static extern CarbonEventClass GetEventClass (IntPtr eventref); [DllImport (CarbonLib)] public static extern uint GetEventKind (IntPtr eventref); #region Event handler installation [DllImport (CarbonLib)] static extern EventStatus InstallEventHandler (IntPtr target, EventDelegate handler, uint count, CarbonEventTypeSpec [] types, IntPtr user_data, out IntPtr handlerRef); [DllImport (CarbonLib)] public static extern EventStatus RemoveEventHandler (IntPtr handlerRef); public static IntPtr InstallEventHandler (IntPtr target, EventDelegate handler, CarbonEventTypeSpec [] types) { IntPtr handlerRef; CheckReturn (InstallEventHandler (target, handler, (uint)types.Length, types, IntPtr.Zero, out handlerRef)); return handlerRef; } public static IntPtr InstallEventHandler (IntPtr target, EventDelegate handler, CarbonEventTypeSpec type) { return InstallEventHandler (target, handler, new CarbonEventTypeSpec[] { type }); } public static IntPtr InstallApplicationEventHandler (EventDelegate handler, CarbonEventTypeSpec [] types) { return InstallEventHandler (GetApplicationEventTarget (), handler, types); } public static IntPtr InstallApplicationEventHandler (EventDelegate handler, CarbonEventTypeSpec type) { return InstallEventHandler (GetApplicationEventTarget (), handler, new CarbonEventTypeSpec[] { type }); } #endregion #region Event parameter extraction [DllImport (CarbonLib)] public static extern EventStatus GetEventParameter (IntPtr eventRef, CarbonEventParameterName name, CarbonEventParameterType desiredType, out CarbonEventParameterType actualType, uint size, ref uint outSize, ref IntPtr outPtr); public static IntPtr GetEventParameter (IntPtr eventRef, CarbonEventParameterName name, CarbonEventParameterType desiredType) { CarbonEventParameterType actualType; uint outSize = 0; IntPtr val = IntPtr.Zero; CheckReturn (GetEventParameter (eventRef, name, desiredType, out actualType, (uint)IntPtr.Size, ref outSize, ref val)); return val; } [DllImport (CarbonLib)] static extern EventStatus GetEventParameter (IntPtr eventRef, CarbonEventParameterName name, CarbonEventParameterType desiredType, out CarbonEventParameterType actualType, uint size, ref uint outSize, IntPtr dataBuffer); [DllImport (CarbonLib)] static extern EventStatus GetEventParameter (IntPtr eventRef, CarbonEventParameterName name, CarbonEventParameterType desiredType, uint zero, uint size, uint zero2, IntPtr dataBuffer); public static T GetEventParameter (IntPtr eventRef, CarbonEventParameterName name, CarbonEventParameterType desiredType) where T : struct { int len = Marshal.SizeOf (typeof (T)); IntPtr bufferPtr = Marshal.AllocHGlobal (len); CheckReturn (GetEventParameter (eventRef, name, desiredType, 0, (uint)len, 0, bufferPtr)); T val = (T)Marshal.PtrToStructure (bufferPtr, typeof (T)); Marshal.FreeHGlobal (bufferPtr); return val; } #endregion #region Sending events [DllImport (CarbonLib)] static extern EventStatus SendEventToEventTarget (IntPtr eventRef, IntPtr eventTarget); [DllImport (CarbonLib)] static extern EventStatus CreateEvent (IntPtr allocator, CarbonEventClass classID, uint kind, double eventTime, CarbonEventAttributes flags, out IntPtr eventHandle); [DllImport (CarbonLib)] static extern void ReleaseEvent (IntPtr eventHandle); static EventStatus SendApplicationEvent (CarbonEventClass classID, uint kind, CarbonEventAttributes flags) { IntPtr eventHandle; EventStatus s = CreateEvent (IntPtr.Zero, classID, kind, 0, flags, out eventHandle); if (s != EventStatus.Ok) return s; s = SendEventToEventTarget (eventHandle, GetApplicationEventTarget ()); ReleaseEvent (eventHandle); return s; } [DllImport (CarbonLib)] public static extern CarbonEventHandlerStatus ProcessHICommand (ref CarbonHICommand command); #endregion #region Error checking public static void CheckReturn (EventStatus status) { int intStatus = (int) status; if (intStatus < 0) throw new EventStatusException (status); } public static void CheckReturn (int osErr) { if (osErr != 0) { string s = GetMacOSStatusCommentString (osErr); throw new SystemException ("Unexpected OS error code " + osErr + ": " + s); } } [DllImport (CarbonLib)] static extern string GetMacOSStatusCommentString (int osErr); #endregion #region Char code conversion internal static int ConvertCharCode (string fourcc) { Debug.Assert (fourcc != null); Debug.Assert (fourcc.Length == 4); return (fourcc[3]) | (fourcc[2] << 8) | (fourcc[1] << 16) | (fourcc[0] << 24); } internal static string UnConvertCharCode (int i) { return new string (new char[] { (char)(i >> 24), (char)(0xFF & (i >> 16)), (char)(0xFF & (i >> 8)), (char)(0xFF & i), }); } #endregion #region Internal Mac API for setting process name [DllImport (CarbonLib)] static extern int GetCurrentProcess (out ProcessSerialNumber psn); [DllImport (CarbonLib)] static extern int CPSSetProcessName (ref ProcessSerialNumber psn, string name); public static void SetProcessName (string name) { try { ProcessSerialNumber psn; if (GetCurrentProcess (out psn) == 0) CPSSetProcessName (ref psn, name); } catch {} //EntryPointNotFoundException? } struct ProcessSerialNumber { #pragma warning disable 0169 ulong highLongOfPSN; ulong lowLongOfPSN; #pragma warning restore 0169 } #endregion public static Dictionary GetFileListFromEventRef (IntPtr eventRef) { AEDesc list = GetEventParameter (eventRef, CarbonEventParameterName.DirectObject, CarbonEventParameterType.AEList); try { int line = 0; try { SelectionRange range = GetEventParameter (eventRef, CarbonEventParameterName.AEPosition, CarbonEventParameterType.Char); line = range.lineNum+1; } catch { } var arr = AppleEvent.GetListFromAEDesc (ref list, CoreFoundation.FSRefToString, (OSType)(int)CarbonEventParameterType.FSRef); var files = new Dictionary (); foreach (var s in arr) { if (!string.IsNullOrEmpty (s)) files[s] = line; } return files; } finally { CheckReturn ((int)AppleEvent.AEDisposeDesc (ref list)); } } public static IList GetUrlListFromEventRef (IntPtr eventRef) { AEDesc list = GetEventParameter (eventRef, CarbonEventParameterName.DirectObject, CarbonEventParameterType.AEList); try { return AppleEvent.GetUtf8StringListFromAEDesc (ref list, true); } finally { Carbon.CheckReturn ((int)AppleEvent.AEDisposeDesc (ref list)); } } } [StructLayout(LayoutKind.Sequential, Pack = 2, Size = 80)] struct FSRef { //this is an 80-char opaque byte array #pragma warning disable 0169 private byte hidden; #pragma warning restore 0169 } [StructLayout(LayoutKind.Sequential)] struct SelectionRange { public short unused1; // 0 (not used) public short lineNum; // line to select (<0 to specify range) public int startRange; // start of selection range (if line < 0) public int endRange; // end of selection range (if line < 0) public int unused2; // 0 (not used) public int theDate; // modification date/time } internal enum CarbonEventHandlerStatus //this is an OSStatus { Handled = 0, NotHandled = -9874, UserCancelled = -128, } internal enum CarbonEventParameterName : uint { DirectObject = 757935405, // '----' AEPosition = 1802530675, // 'kpos' } internal enum CarbonEventParameterType : uint { HICommand = 1751346532, // 'hcmd' MenuRef = 1835363957, // 'menu' WindowRef = 2003398244, // 'wind' Char = 1413830740, // 'TEXT' UInt32 = 1835100014, // 'magn' UnicodeText = 1970567284, // 'utxt' AEList = 1818850164, // 'list' WildCard = 707406378, // '****' FSRef = 1718841958, // 'fsrf' } internal enum CarbonEventClass : uint { Mouse = 1836021107, // 'mous' Keyboard = 1801812322, // 'keyb' TextInput = 1952807028, // 'text' Application = 1634758764, // 'appl' RemoteAppleEvent = 1701867619, //'eppc' //remote apple event? Menu = 1835363957, // 'menu' Window = 2003398244, // 'wind' Control = 1668183148, // 'cntl' Command = 1668113523, // 'cmds' Tablet = 1952607348, // 'tblt' Volume = 1987013664, // 'vol ' Appearance = 1634758765, // 'appm' Service = 1936028278, // 'serv' Toolbar = 1952604530, // 'tbar' ToolbarItem = 1952606580, // 'tbit' Accessibility = 1633903461, // 'acce' HIObject = 1751740258, // 'hiob' AppleEvent = 1634039412, // 'aevt' Internet = 1196773964, // 'GURL' } public enum CarbonCommandID : uint { OK = 1869291552, // 'ok ' Cancel = 1852797985, // 'not!' Quit = 1903520116, // 'quit' Undo = 1970168943, // 'undo' Redo = 1919247471, // 'redo' Cut = 1668641824, // 'cut ' Copy = 1668247673, // 'copy' Paste = 1885434740, // 'past' Clear = 1668048225, // 'clea', SelectAll = 1935764588, // 'sall', Preferences = 1886545254, //'pref' About = 1633841013, // 'abou' New = 1852143392, // 'new ', Open = 1869636974, // 'open' Close = 1668050803, // 'clos' Save = 1935767141, // 'save', SaveAs = 1937138035, // 'svas' Revert = 1920365172, // 'rvrt' Print = 1886547572, // 'prnt' PageSetup = 1885431653, // 'page', AppHelp = 1634233456, //'ahlp' //menu manager handles these automatically Hide = 1751737445, // 'hide' HideOthers = 1751737455, // 'hido' ShowAll = 1936220524, // 'shal' ZoomWindow = 2054123373, // 'zoom' MinimizeWindow = 1835626089, // 'mini' MinimizeAll = 1835626081, // 'mina' MaximizeAll = 1835104353, // 'maxa' ArrangeInFront = 1718775412, // 'frnt' BringAllToFront = 1650881140, // 'bfrt' SelectWindow = 1937205614, // 'swin' RotateWindowsForward = 1919906935, // 'rotw' RotateWindowsBackward = 1919906914, // 'rotb' RotateFloatingWindowsForward = 1920231031, // 'rtfw' RotateFloatingWindowsBackward = 1920231010, // 'rtfb' //created automatically -- used for inserting before/after the default window list WindowListSeparator = 2003592310, // 'wldv' WindowListTerminator = 2003596148, // 'wlst' } internal enum CarbonEventCommand : uint { Process = 1, UpdateStatus = 2, } internal enum CarbonEventMenu : uint { BeginTracking = 1, EndTracking = 2, ChangeTrackingMode = 3, Opening = 4, Closed = 5, TargetItem = 6, MatchKey = 7, } internal enum CarbonEventAttributes : uint { None = 0, UserEvent = (1 << 0), Monitored= 1 << 3, } internal enum CarbonEventApple { OpenApplication = 1868656752, // 'oapp' ReopenApplication = 1918988400, //'rapp' OpenDocuments = 1868853091, // 'odoc' PrintDocuments = 188563030, // 'pdoc' OpenContents = 1868787566, // 'ocon' QuitApplication = 1903520116, // 'quit' ShowPreferences = 1886545254, // 'pref' ApplicationDied = 1868720500, // 'obit' GetUrl = 1196773964, // 'GURL' } [StructLayout(LayoutKind.Sequential, Pack = 2)] struct CarbonEventTypeSpec { public CarbonEventClass EventClass; public uint EventKind; public CarbonEventTypeSpec (CarbonEventClass eventClass, UInt32 eventKind) { this.EventClass = eventClass; this.EventKind = eventKind; } public CarbonEventTypeSpec (CarbonEventMenu kind) : this (CarbonEventClass.Menu, (uint) kind) { } public CarbonEventTypeSpec (CarbonEventCommand kind) : this (CarbonEventClass.Command, (uint) kind) { } public CarbonEventTypeSpec (CarbonEventApple kind) : this (CarbonEventClass.AppleEvent, (uint) kind) { } public static implicit operator CarbonEventTypeSpec (CarbonEventMenu kind) { return new CarbonEventTypeSpec (kind); } public static implicit operator CarbonEventTypeSpec (CarbonEventCommand kind) { return new CarbonEventTypeSpec (kind); } public static implicit operator CarbonEventTypeSpec (CarbonEventApple kind) { return new CarbonEventTypeSpec (kind); } } class EventStatusException : SystemException { public EventStatusException (EventStatus status) { StatusCode = status; } public EventStatus StatusCode { get; private set; } } enum EventStatus // this is an OSStatus { Ok = 0, //event manager EventAlreadyPostedErr = -9860, EventTargetBusyErr = -9861, EventClassInvalidErr = -9862, EventClassIncorrectErr = -9864, EventHandlerAlreadyInstalledErr = -9866, EventInternalErr = -9868, EventKindIncorrectErr = -9869, EventParameterNotFoundErr = -9870, EventNotHandledErr = -9874, EventLoopTimedOutErr = -9875, EventLoopQuitErr = -9876, EventNotInQueueErr = -9877, EventHotKeyExistsErr = -9878, EventHotKeyInvalidErr = -9879, } [StructLayout(LayoutKind.Explicit)] struct CarbonHICommand //technically HICommandExtended, but they're compatible { [FieldOffset(0)] CarbonHICommandAttributes attributes; [FieldOffset(4)] uint commandID; [FieldOffset(8)] IntPtr controlRef; [FieldOffset(8)] IntPtr windowRef; [FieldOffset(8)] HIMenuItem menuItem; public CarbonHICommand (uint commandID, HIMenuItem item) { windowRef = controlRef = IntPtr.Zero; this.commandID = commandID; this.menuItem = item; this.attributes = CarbonHICommandAttributes.FromMenu; } public CarbonHICommandAttributes Attributes { get { return attributes; } } public uint CommandID { get { return commandID; } } public IntPtr ControlRef { get { return controlRef; } } public IntPtr WindowRef { get { return windowRef; } } public HIMenuItem MenuItem { get { return menuItem; } } public bool IsFromMenu { get { return attributes == CarbonHICommandAttributes.FromMenu; } } public bool IsFromControl { get { return attributes == CarbonHICommandAttributes.FromControl; } } public bool IsFromWindow { get { return attributes == CarbonHICommandAttributes.FromWindow; } } } [StructLayout(LayoutKind.Sequential, Pack = 2)] struct HIMenuItem { IntPtr menuRef; ushort index; public HIMenuItem (IntPtr menuRef, ushort index) { this.index = index; this.menuRef = menuRef; } public IntPtr MenuRef { get { return menuRef; } } public ushort Index { get { return index; } } } //*NOT* flags enum CarbonHICommandAttributes : uint { FromMenu = 1, FromControl = 1 << 1, FromWindow = 1 << 2, } struct OSType { int value; public int Value { get { return Value; } } public OSType (int value) { this.value = value; } public OSType (string fourcc) { value = Carbon.ConvertCharCode (fourcc); } public static explicit operator OSType (string fourcc) { return new OSType (fourcc); } public static implicit operator int (OSType o) { return o.value; } public static implicit operator OSType (int i) { return new OSType (i); } } }smuxi-1.1/src/Frontend-GNOME/osx/AppleEvent.cs0000644000175000017500000002130712250426634021741 0ustar00meebeymeebey00000000000000// // AppleEvent.cs // // Author: // Michael Hutchinson // // Copyright (c) 2010 Novell, Inc. // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Runtime.InteropServices; using System.Collections.Generic; namespace MonoDevelop.MacInterop { internal static class AppleEvent { const string AELib = Carbon.CarbonLib; //FIXME: is "int" correct for size? [DllImport (AELib)] static extern AEDescStatus AECreateDesc (OSType typeCode, IntPtr dataPtr, int dataSize, out AEDesc desc); [DllImport (AELib)] static extern AEDescStatus AECreateDesc (OSType typeCode, byte[] data, int dataSize, out AEDesc desc); [DllImport (AELib)] static extern AEDescStatus AEGetNthPtr (ref AEDesc descList, int index, OSType desiredType, uint keyword, out CarbonEventParameterType actualType, IntPtr buffer, int bufferSize, out int actualSize); [DllImport (AELib)] static extern AEDescStatus AEGetNthPtr (ref AEDesc descList, int index, OSType desiredType, uint keyword, uint zero, IntPtr buffer, int bufferSize, int zero2); [DllImport (AELib)] static extern AEDescStatus AECountItems (ref AEDesc descList, out int count); //return an OSErr [DllImport (AELib)] static extern AEDescStatus AEGetNthPtr (ref AEDesc descList, int index, OSType desiredType, uint keyword, uint zero, out IntPtr outPtr, int bufferSize, int zero2); [DllImport (AELib)] public static extern AEDescStatus AEDisposeDesc (ref AEDesc desc); [DllImport (AELib)] public static extern AEDescStatus AESizeOfNthItem (ref AEDesc descList, int index, ref OSType type, out int size); [DllImport (AELib)] static extern AEDescStatus AEGetDescData (ref AEDesc desc, IntPtr ptr, int maximumSize); [DllImport (AELib)] static extern int AEGetDescDataSize (ref AEDesc desc); [DllImport (AELib)] static extern AEDescStatus AECoerceDesc (ref AEDesc theAEDesc, DescType toType, ref AEDesc result); public static void AECreateDesc (OSType typeCode, byte[] data, out AEDesc result) { CheckReturn (AECreateDesc (typeCode, data, data.Length, out result)); } public static void AECreateDescUtf8 (string value, out AEDesc result) { var type = (OSType)(int)CarbonEventParameterType.UnicodeText; var bytes = System.Text.Encoding.UTF8.GetBytes (value); CheckReturn (AECreateDesc (type, bytes, bytes.Length, out result)); } public static void AECreateDescAscii (string value, out AEDesc result) { var type = (OSType)(int)CarbonEventParameterType.Char; var bytes = System.Text.Encoding.ASCII.GetBytes (value); CheckReturn (AECreateDesc (type, bytes, bytes.Length, out result)); } public static void AECreateDescNull (out AEDesc desc) { CheckReturn (AECreateDesc ((OSType)0, IntPtr.Zero, 0, out desc)); } public static int AECountItems (ref AEDesc descList) { int count; CheckReturn (AECountItems (ref descList, out count)); return count; } public static T AEGetNthPtr (ref AEDesc descList, int index, OSType desiredType) where T : struct { int len = Marshal.SizeOf (typeof (T)); IntPtr bufferPtr = Marshal.AllocHGlobal (len); try { CheckReturn (AEGetNthPtr (ref descList, index, desiredType, 0, 0, bufferPtr, len, 0)); T val = (T)Marshal.PtrToStructure (bufferPtr, typeof (T)); return val; } finally{ Marshal.FreeHGlobal (bufferPtr); } } public static IntPtr AEGetNthPtr (ref AEDesc descList, int index, OSType desiredType) { IntPtr ret; CheckReturn (AEGetNthPtr (ref descList, index, desiredType, 0, 0, out ret, 4, 0)); return ret; } //FIXME: this might not work in some encodings. need to test more. static string GetUtf8StringFromAEPtr (ref AEDesc descList, int index) { int size; var type = (OSType)(int)CarbonEventParameterType.UnicodeText; if (AESizeOfNthItem (ref descList, index, ref type, out size) == AEDescStatus.Ok) { IntPtr buffer = Marshal.AllocHGlobal (size); try { if (AEGetNthPtr (ref descList, index, type, 0, 0, buffer, size, 0) == AEDescStatus.Ok) return Marshal.PtrToStringAuto (buffer, size); } finally { Marshal.FreeHGlobal (buffer); } } return null; } public static string GetStringFromAEDesc (ref AEDesc desc) { int size = AEGetDescDataSize (ref desc); if (size > 0) { IntPtr buffer = Marshal.AllocHGlobal (size); try { if (AEGetDescData (ref desc, buffer, size) == AEDescStatus.Ok) return Marshal.PtrToStringAuto (buffer, size); } finally { Marshal.FreeHGlobal (buffer); } } return null; } public static IList GetUtf8StringListFromAEDesc (ref AEDesc list, bool skipEmpty) { long count = AppleEvent.AECountItems (ref list); var items = new List (); for (int i = 1; i <= count; i++) { string str = AppleEvent.GetUtf8StringFromAEPtr (ref list, i); if (!string.IsNullOrEmpty (str)) items.Add (str); } return items; } public static T[] GetListFromAEDesc (ref AEDesc list, AEDescValueSelector sel, OSType type) where TRef : struct { long count = AppleEvent.AECountItems (ref list); T[] arr = new T[count]; for (int i = 1; i <= count; i++) { TRef r = AppleEvent.AEGetNthPtr (ref list, i, type); arr [i - 1] = sel (ref r); } return arr; } static void CheckReturn (AEDescStatus status) { if (status != AEDescStatus.Ok) throw new Exception ("Failed with code " + status.ToString ()); } } public delegate T AEDescValueSelector (ref TRef desc); [StructLayout(LayoutKind.Sequential, Pack = 2)] public struct AEDesc { public uint descriptorType; public IntPtr dataHandle; } public enum AEDescStatus { Ok = 0, MemoryFull = -108, CoercionFail = -1700, DescRecordNotFound = -1701, WrongDataType = -1703, NotAEDesc = -1704, ReplyNotArrived = -1718, } public enum AESendMode { NoReply = 0x00000001, QueueReply = 0x00000002, WaitReply = 0x00000003, DontReconnect = 0x00000080, WantReceipt = 0x00000200, NeverInteract = 0x00000010, CanInteract = 0x00000020, AlwaysInteract = 0x00000030, CanSwitchLayer = 0x00000040, DontRecord = 0x00001000, DontExecute = 0x00002000, ProcessNonReplyEvents = 0x00008000, } struct DescType { public OSType Value; } }smuxi-1.1/src/Frontend-GNOME/SteticPreferencesDialog.cs0000644000175000017500000000264012726351313023620 0ustar00meebeymeebey00000000000000/* * $Id: PreferencesDialog.cs 283 2008-07-16 21:26:07Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Preferences/PreferencesDialog.cs $ * $Rev: 283 $ * $Author: meebey $ * $Date: 2008-07-16 23:26:07 +0200 (Wed, 16 Jul 2008) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2008 Mirco Bauer * * Full GPL License: * * 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 */ namespace Smuxi.Frontend.Gnome { public partial class SteticPreferencesDialog : Gtk.Dialog { public SteticPreferencesDialog() { Build(); } protected virtual void _OnChanged(object sender, System.EventArgs e) { } } } smuxi-1.1/src/Frontend-GNOME/Frontend.cs0000664000175000017500000013366714011472672020663 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2015, 2021 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Web; using System.Linq; using System.Threading; using System.Reflection; using SysDiag = System.Diagnostics; using Mono.Unix; using Mono.Unix.Native; using MonoDevelop.MacInterop; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { public class Frontend { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _Name = "Smuxi"; private static readonly string _GladeFilename = "smuxi-frontend-gnome.glade"; private static readonly string _UIName = "GNOME"; private static int _UIThreadID; private static Version _Version; private static string _VersionString; private static SplashScreenWindow _SplashScreenWindow; private static MainWindow _MainWindow; private static FrontendConfig _FrontendConfig; private static Session _LocalSession; private static Session _Session; private static UserConfig _UserConfig; private static FrontendManager _FrontendManager; private static TaskQueue _FrontendManagerCheckerQueue; private static object _UnhandledExceptionSyncRoot = new Object(); private static bool _InCrashHandler; private static bool _InReconnectHandler; public static string IconName { get; private set; } public static bool HasSystemIconTheme { get; private set; } public static bool HadSession { get; private set; } public static bool IsDisconnecting { get; private set; } public static bool IsGtkInitialized { get; private set; } public static bool InGtkApplicationRun { get; private set; } public static bool IsWindows => Platform.IsWindows; public static bool IsUnity { get; private set; } public static bool IsMacOSX => Platform.IsMacOSX; public static bool IsLinux => Platform.IsLinux; public static bool IsMono => Platform.IsMono; public static Version EngineAssemblyVersion { get; set; } public static Version EngineProtocolVersion { get; set; } public static event EventHandler SessionPropertyChanged; public static string Name { get { return _Name; } } public static string GladeFilename { get { return _GladeFilename; } } public static string UIName { get { return _UIName; } } public static Version Version { get { return _Version; } } public static string VersionString { get { return _VersionString; } } public static MainWindow MainWindow { get { return _MainWindow; } } public static Session Session { get { return _Session; } set { _Session = value; if (value != null) { HadSession = true; } if (SessionPropertyChanged != null) { SessionPropertyChanged(value, EventArgs.Empty); } } } public static bool IsLocalEngine { get { return _LocalSession != null && _Session == _LocalSession; } } public static FrontendManager FrontendManager { get { return _FrontendManager; } } public static Config Config { get { return _Session.Config; } } public static UserConfig UserConfig { get { return _UserConfig; } set { _UserConfig = value; } } public static FrontendConfig FrontendConfig { get { return _FrontendConfig; } } public static bool UseLowBandwidthMode { get { if (_FrontendConfig == null) { return false; } return (bool) _FrontendConfig["UseLowBandwidthMode"]; } set { _FrontendConfig["UseLowBandwidthMode"] = value; } } static Frontend() { var desktop = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP"); if (!String.IsNullOrEmpty(desktop) && desktop.ToLower().Contains("unity")) { #if LOG4NET _Logger.Debug("Frontend(): Detected Unity desktop envrionment"); #endif IsUnity = true; } } public static void Init(string[] args, string engine) { System.Threading.Thread.CurrentThread.Name = "Main"; Assembly asm = Assembly.GetAssembly(typeof(Frontend)); AssemblyName asm_name = asm.GetName(false); AssemblyProductAttribute pr = (AssemblyProductAttribute)asm. GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0]; _Version = asm_name.Version; _VersionString = pr.Product + " - " + _UIName + " frontend " + _Version; #if LOG4NET _Logger.Info(_VersionString + " starting"); #endif InitSignalHandlers(); InitGtk(args); //_SplashScreenWindow = new SplashScreenWindow(); _FrontendConfig = new FrontendConfig(UIName); // loading and setting defaults _FrontendConfig.Load(); _FrontendConfig.Save(); _MainWindow = new MainWindow(); if (((string[]) FrontendConfig["Engines/Engines"]).Length == 0) { InitLocalEngine(); ConnectEngineToGUI(); } else { // there are remote engines defined, means we have to ask //_SplashScreenWindow.Destroy(); _SplashScreenWindow = null; try { ShowEngineManagerDialog(engine); } catch (ArgumentException ex) { if (ex.ParamName == "value") { Console.WriteLine(ex.Message); System.Environment.Exit(1); } throw; } } if (_SplashScreenWindow != null) { _SplashScreenWindow.Destroy(); } if (IsMacOSX) { ApplicationEvents.Quit += delegate(object sender, ApplicationQuitEventArgs e) { Quit(); e.Handled = true; }; ApplicationEvents.Reopen += delegate(object sender, ApplicationEventArgs e) { MainWindow.Deiconify(); MainWindow.Visible = true; e.Handled = true; }; ApplicationEvents.OpenUrls += delegate(object sender, ApplicationUrlEventArgs e) { e.Handled = true; if (e.Urls == null || e.Urls.Count == 0) { return; } foreach (var url in e.Urls) { try { OpenChatLink(new Uri(url)); } catch (Exception ex) { #if LOG4NET _Logger.Error("ApplicationEvents.OpenUrls() Exception", ex); #endif } } }; } InGtkApplicationRun = true; Gtk.Application.Run(); InGtkApplicationRun = false; #if LOG4NET _Logger.Warn("Gtk.Application.Run() returned!"); #endif } public static void InitLocalEngine() { if (!Engine.Engine.IsInitialized) { // only initialize a local engine once Engine.Engine.Init(); _LocalSession = new Engine.Session(Engine.Engine.Config, Engine.Engine.ProtocolManagerFactory, "local"); _LocalSession.ExecuteOnStartupCommands(); _LocalSession.ProcessAutoConnect(); } EngineAssemblyVersion = Engine.Engine.AssemblyVersion; EngineProtocolVersion = Engine.Engine.ProtocolVersion; Session = _LocalSession; _UserConfig = _Session.UserConfig; } public static void ConnectEngineToGUI() { if (IsLocalEngine) { // HACK: SessionManager.Register() is not used for local engines _LocalSession.RegisterFrontendUI(_MainWindow.UI); } SyncConfig(); _FrontendManager = _Session.GetFrontendManager(_MainWindow.UI); _FrontendManager.Sync(); // MS .NET doesn't like this with Remoting? if (Frontend.IsMono) { // when are running on Mono, all should be good if (_UserConfig.IsCaching) { // when our UserConfig is cached, we need to invalidate the cache // DISABLED: see FrontendManager._OnConfigChanged //_FrontendManager.ConfigChangedDelegate = SyncConfig; } } _MainWindow.ShowAll(); // make sure entry got attention :-P _MainWindow.Entry.HasFocus = true; // local sessions can't have network issues :) if (_Session != _LocalSession) { _FrontendManagerCheckerQueue = new TaskQueue("FrontendManagerCheckerQueue"); _FrontendManagerCheckerQueue.AbortedEvent += delegate { #if LOG4NET _Logger.Debug("_FrontendManagerCheckerQueue.AbortedEvent(): task queue aborted!"); #endif }; _FrontendManagerCheckerQueue.ExceptionEvent += delegate(object sender, TaskQueueExceptionEventArgs e) { #if LOG4NET _Logger.Error("Exception in TaskQueue: ", e.Exception); _Logger.Error("Inner-Exception: ", e.Exception.InnerException); #endif Frontend.ShowException(e.Exception); }; _FrontendManagerCheckerQueue.Queue(delegate { // keep looping as long as the checker returns true while (CheckFrontendManagerStatus()) { // FIXME: bail out somehow when we lost the connection // without an exception in the meantime // only check once per minute Thread.Sleep(60 * 1000); } #if LOG4NET _Logger.Debug("_FrontendManagerCheckerQueue(): " + "CheckFrontendManagerStatus() returned false, "+ "time to say good bye!"); #endif }); } MainWindow.ChatViewManager.IsSensitive = true; } public static void DisconnectEngineFromGUI() { DisconnectEngineFromGUI(true); } public static void DisconnectEngineFromGUI(bool cleanly) { Trace.Call(cleanly); IsDisconnecting = true; MainWindow.ChatViewManager.IsSensitive = false; if (cleanly) { try { // sync tab positions if (!IsLocalEngine && !UseLowBandwidthMode) { _MainWindow.Notebook.SyncPagePositions(); } if (_FrontendManager != null) { _FrontendManager.IsFrontendDisconnecting = true; } if (_Session != null) { _Session.DeregisterFrontendUI(_MainWindow.UI); } } catch (System.Net.Sockets.SocketException) { // ignore as the connection is maybe already broken } catch (System.Runtime.Remoting.RemotingException) { // ignore as the connection is maybe already broken } } if (_FrontendManagerCheckerQueue != null) { _FrontendManagerCheckerQueue.Dispose(); } _MainWindow.ChatViewManager.Clear(); _MainWindow.UpdateProgressBar(); // make sure no stray SSH tunnel leaves behind _MainWindow.EngineManager.Disconnect(); _MainWindow.NetworkStatus = null; _MainWindow.Status = _("Disconnected from engine."); _FrontendManager = null; Session = null; IsDisconnecting = false; } public static void ReconnectEngineToGUI() { ReconnectEngineToGUI(true); } public static void ReconnectEngineToGUI(bool cleanly) { Trace.Call(cleanly); if (_InReconnectHandler) { #if LOG4NET _Logger.Debug("ReconnectEngineToGUI(): already in reconnect " + "handler, ignoring reconnect..."); #endif return; } _InReconnectHandler = true; var disconnectedEvent = new AutoResetEvent(false); ThreadPool.QueueUserWorkItem(delegate { try { // delay the disconnect to give the reconnect some extra // time as NetworkManager is not accurate about when the // network is really ready GLib.Timeout.Add(5 * 1000, delegate { Frontend.DisconnectEngineFromGUI(cleanly); disconnectedEvent.Set(); return false; }); var successful = false; var attempt = 1; while (!successful) { Gtk.Application.Invoke(delegate { MainWindow.NetworkStatus = null; MainWindow.Status = String.Format( _("Reconnecting to engine... (attempt {0})"), attempt++ ); }); try { disconnectedEvent.WaitOne(); _MainWindow.EngineManager.Reconnect(); successful = true; } catch (Exception ex) { #if LOG4NET _Logger.Debug("ReconnectEngineToGUI(): Exception", ex); #endif disconnectedEvent.Set(); Thread.Sleep(30 * 1000); } } _UserConfig = _MainWindow.EngineManager.UserConfig; EngineAssemblyVersion = _MainWindow.EngineManager.EngineAssemblyVersion; EngineProtocolVersion = _MainWindow.EngineManager.EngineProtocolVersion; Session = _MainWindow.EngineManager.Session; Gtk.Application.Invoke(delegate { Frontend.ConnectEngineToGUI(); }); } catch (Exception ex) { Frontend.ShowException(ex); } finally { _InReconnectHandler = false; } }); } public static void Quit() { Trace.Call(); // only save windows size when we are not in the engine manager dialog if (_MainWindow != null && _MainWindow.Visible) { // save window size int width, heigth; if (_MainWindow.IsMaximized) { width = -1; heigth = -1; } else { _MainWindow.GetSize(out width, out heigth); } _FrontendConfig[Frontend.UIName + "/Interface/Width"] = width; _FrontendConfig[Frontend.UIName + "/Interface/Heigth"] = heigth; int x, y; _MainWindow.GetPosition(out x, out y); _FrontendConfig[Frontend.UIName + "/Interface/XPosition"] = x; _FrontendConfig[Frontend.UIName + "/Interface/YPosition"] = y; _FrontendConfig.Save(); } if (_FrontendManager != null) { if (IsLocalEngine) { try { // shutdown session (flush message buffers) Session.Shutdown(); } catch (Exception ex) { #if LOG4NET _Logger.Error("Quit(): Exception", ex); #endif } } // sync last seen message of current chat var currentChatView = _MainWindow.ChatViewManager.CurrentChatView; if (!UseLowBandwidthMode && currentChatView != null) { currentChatView.UpdateLastSeenMessage(); } // OPT: switch to Smuxi chat so switch page events are not // triggered when each chat gets removed _MainWindow.ChatViewManager.CurrentChatNumber = 0; DisconnectEngineFromGUI(); } #if LOG4NET // HACK: workaround log4net deadlock issue. Not sure if it has any // effect though, see: https://www.smuxi.org/issues/show/876 log4net.Core.LoggerManager.Shutdown(); #endif if (IsGtkInitialized && InGtkApplicationRun) { Gtk.Application.Quit(); } Environment.Exit(0); } public static bool IsGuiThread() { return System.Threading.Thread.CurrentThread.ManagedThreadId == _UIThreadID; } public static void ShowError(Gtk.Window parent, string msg, Exception ex) { Trace.Call(parent, msg, ex != null ? ex.GetType() : null); if (!IsGuiThread()) { Gtk.Application.Invoke(delegate { ShowError(parent, msg, ex); }); return; } if (ex != null) { #if LOG4NET _Logger.Error("ShowError(): Exception: ", ex); #endif msg += "\n" + String.Format(_("Cause: {0}"), ex.Message); } if (parent == null) { parent = _MainWindow; } Gtk.MessageDialog md = new Gtk.MessageDialog( parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Ok, false, msg ); md.Run(); md.Destroy(); } public static void ShowError(Gtk.Window parent, string msg) { Trace.Call(parent, msg); ShowError(parent, msg, null); } public static void ShowError(Gtk.Window parent, Exception ex) { Trace.Call(parent, ex != null ? ex.GetType() : null); if (ex == null) { throw new ArgumentNullException("ex"); } #if LOG4NET _Logger.Error("ShowError(): Exception:", ex); #endif ShowError(parent, ex.Message, null); } public static void ShowException(Gtk.Window parent, Exception ex) { Trace.Call(parent, ex != null ? ex.GetType() : null); if (parent == null) { parent = _MainWindow; } if (!IsGuiThread()) { Gtk.Application.Invoke(delegate { ShowException(parent, ex); }); return; } if (ex is NotImplementedException) { // don't quit on NotImplementedException ShowError(parent, ex); return; } #if LOG4NET _Logger.Error("ShowException(): Exception:", ex); #endif // HACK: ugly MS .NET throws underlaying SocketException instead of // wrapping those into a nice RemotingException, see: // http://projects.qnetp.net/issues/show/232 if (ex is System.Runtime.Remoting.RemotingException || ex is System.Net.Sockets.SocketException) { if (_InReconnectHandler || _InCrashHandler) { // one reconnect is good enough and a crash we won't survive return; } Frontend.ReconnectEngineToGUI(); return; } if (_InCrashHandler) { // only show not more than one crash dialog, else the user // will not be able to copy/paste the stack trace and stuff return; } _InCrashHandler = true; // we are using a remote engine, we are not running on Mono and an // IConvertible issue happened if (!Frontend.IsLocalEngine && !IsMono && ex is InvalidCastException && ex.Message.Contains("IConvertible")) { var msg = _( "A fatal error has been detected because of a protocol incompatibility with the smuxi-server!\n\n" + "Please install Mono on the frontend side so it matches the smuxi-server.\n\n" + "More details about this issue can be found here:\n" + "https://smuxi.im/issues/show/589" ); var dialog = new Gtk.MessageDialog( parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.Close, true, msg ); dialog.Run(); dialog.Destroy(); Quit(); return; } CrashDialog cd = new CrashDialog(parent, ex); cd.Run(); cd.Destroy(); if (SysDiag.Debugger.IsAttached) { // allow the debugger to examine the situation //SysDiag.Debugger.Break(); // HACK: Break() would be nicer but crashes the runtime throw ex; } Quit(); } public static void ShowException(Exception ex) { Trace.Call(ex != null ? ex.GetType() : null); ShowException(null, ex); } public static void ShowEngineManagerDialog(string engine) { Trace.Call(engine); var diag = new EngineManagerDialog(_MainWindow, _MainWindow.EngineManager); if (!String.IsNullOrEmpty(engine)) { diag.SelectedEngine = engine; // 1 == connect button diag.Respond(1); } else { diag.Run(); } diag.Destroy(); } public static void ShowEngineManagerDialog() { ShowEngineManagerDialog(null); } public static bool ShowReconnectDialog(Gtk.Window parent) { Trace.Call(parent); Gtk.MessageDialog md = new Gtk.MessageDialog(parent, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.OkCancel, _("The frontend has lost the connection to the server.\nDo you want to reconnect now?")); Gtk.ResponseType res = (Gtk.ResponseType) md.Run(); md.Destroy(); if (res != Gtk.ResponseType.Ok) { Quit(); return false; } while (true) { try { Frontend.ReconnectEngineToGUI(); // yay, we made it _InReconnectHandler = false; break; } catch (Exception e) { #if LOG4NET _Logger.Error("ShowReconnectDialog(): Reconnect failed, exception:", e); #endif var msg = _("Reconnecting to the server has failed.\nDo you want to try again?"); // the parent window is hidden (MainWindow) at this // point thus modal doesn't make sense here md = new Gtk.MessageDialog(parent, Gtk.DialogFlags.DestroyWithParent, Gtk.MessageType.Error, Gtk.ButtonsType.OkCancel, msg); md.SetPosition(Gtk.WindowPosition.CenterAlways); res = (Gtk.ResponseType) md.Run(); md.Destroy(); if (res != Gtk.ResponseType.Ok) { // give up Quit(); return false; } } } return true; } public static void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } _MainWindow.ApplyConfig(userConfig); } public static Gdk.Pixbuf LoadIcon(string iconName, int size, string resourceName) { Trace.Call(iconName, size, resourceName); if (iconName == null) { throw new ArgumentNullException("iconName"); } if (resourceName == null) { throw new ArgumentNullException("resourceName"); } try { // we use this method from type initializers so it has to deal // with GDK/GTK thread locking Gdk.Threads.Enter(); var theme = Gtk.IconTheme.Default; if (!theme.HasIcon(iconName) || !theme.GetIconSizes(iconName).Contains(size)) { Gtk.IconTheme.AddBuiltinIcon( iconName, size, new Gdk.Pixbuf(null, resourceName, size, size) ); #if LOG4NET _Logger.DebugFormat( "LoadIcon(): Added '{0}' to built-in icon theme", resourceName ); #endif } return theme.LoadIcon(iconName, size, Gtk.IconLookupFlags.UseBuiltin); } finally { Gdk.Threads.Leave(); } } public static void OpenChatLink(Uri link) { TryOpenChatLink(link); } public static bool TryOpenChatLink(Uri link) { Trace.Call(link); if (Session == null) { return false; } // supported: // smuxi://freenode/#smuxi // smuxi://freenode/#%23csharp (##csharp) // irc://#smuxi // irc://irc.oftc.net/ // irc://irc.oftc.net/#smuxi // irc://irc.oftc.net:6667/#smuxi // not supported (yet): // smuxi:///meebey IProtocolManager manager = null; var linkPort = link.Port; if (linkPort == -1) { switch (link.Scheme) { case "irc": linkPort = 6667; break; case "ircs": linkPort = 6697; break; } } // decode #%23csharp to ##csharp var linkChat = HttpUtility.UrlDecode(link.Fragment); if (String.IsNullOrEmpty(linkChat) && link.AbsolutePath.Length > 0) { linkChat = link.AbsolutePath.Substring(1); } var linkProtocol = link.Scheme; var linkHost = link.Host; string linkNetwork = null; if (!linkHost.Contains(".")) { // this seems to be a network name linkNetwork = linkHost; } // find existing protocol chat foreach (var chatView in MainWindow.ChatViewManager.Chats) { if (!(chatView is ProtocolChatView)) { continue; } var protocolChat = (ProtocolChatView) chatView; var host = protocolChat.Host; var port = protocolChat.Port; var network = protocolChat.NetworkID; // Check first by network name with fallback to host+port. // The network name has to be checked against the NetworkID and // also ChatModel.ID as the user might have entered a different // network name in settings than the server does if (!String.IsNullOrEmpty(network) && (String.Compare(network, linkNetwork, true) == 0 || String.Compare(chatView.ID, linkNetwork, true) == 0)) { manager = protocolChat.ProtocolManager; break; } if (String.Compare(host, linkHost, true) == 0 && port == linkPort) { manager = protocolChat.ProtocolManager; break; } } if (manager == null) { // only irc may autoconnect to a server switch (linkProtocol) { case "irc": case "ircs": case "smuxi": break; default: return false; } ServerModel server = null; if (!String.IsNullOrEmpty(linkNetwork)) { // try to find a server with this network name and connect to it var serverSettings = new ServerListController(UserConfig); server = serverSettings.GetServerByNetwork(linkNetwork); if (server == null) { // in case someone tried an unknown network return false; } // ignore OnConnectCommands server.OnConnectCommands = null; } else if (!String.IsNullOrEmpty(linkHost)) { server = new ServerModel() { Protocol = linkProtocol, Hostname = linkHost, Port = linkPort }; } if (server != null) { manager = Session.Connect(server, FrontendManager); } } if (String.IsNullOrEmpty(linkChat)) { return true; } // switch to existing chat foreach (var chatView in MainWindow.ChatViewManager.Chats) { if (manager != null && chatView.ProtocolManager != manager) { continue; } if (String.Compare(chatView.ID, linkChat, true) == 0) { MainWindow.ChatViewManager.CurrentChatView = chatView; return true; } } // join chat if (manager != null) { var chat = new GroupChatModel(linkChat, linkChat, null); ThreadPool.QueueUserWorkItem(delegate { try { manager.OpenChat(FrontendManager, chat); } catch (Exception ex) { Frontend.ShowException(ex); } }); } return true; } public static void OpenLink(Uri link) { Trace.Call(link); if (link == null) { throw new ArgumentNullException("link"); } if (TryOpenChatLink(link)) { return; } var escapedUrl = Uri.EscapeUriString(link.ToString()); // hopefully MS .NET / Mono finds some way to handle the URL ThreadPool.QueueUserWorkItem(delegate { try { using (var process = SysDiag.Process.Start(escapedUrl)) { // Start() might return null in case it re-used a // process instead of starting one if (process != null) { process.WaitForExit(); } } } catch (System.ComponentModel.Win32Exception ex) when (IsMono && IsLinux) { // HACK: Mono >= 6.6 has a regression where Process.Start() can // no longer open URLs on Linux and just throws a Win32Exception. // To workaround this issue we call xdg-open directly :( // For the bug in Mono see: // https://github.com/mono/mono/commit/5d088cf0de7f3e50e3547dba361af4401e938dd4#diff-c1ecca7d198c8f4922767c6c350edb3d1f7bbd59524f36f73d34f973d2f42a2eR2069 #if LOG4NET _Logger.Warn("OpenLink(): buggy Mono version detected, failing back to xdg-open. Exception:", ex); #endif var info = new SysDiag.ProcessStartInfo("xdg-open", escapedUrl) { UseShellExecute = false }; using (var process = SysDiag.Process.Start(info)) { if (process != null) { process.WaitForExit (); } } } catch (Exception ex) { // exceptions in the thread pool would kill the process, see: // http://msdn.microsoft.com/en-us/library/0ka9477y.aspx // http://projects.qnetp.net/issues/show/194 #if LOG4NET _Logger.Error("OpenLink(): opening URL: '" + link + "' failed", ex); #endif } }); } public static void OpenFindGroupChatWindow() { OpenFindGroupChatWindow(null); } public static void OpenFindGroupChatWindow(string searchKey) { var chatView = MainWindow.ChatViewManager.CurrentChatView; if (chatView == null) { return; } var manager = chatView.ProtocolManager; if (manager == null) { return; } var dialog = new FindGroupChatDialog( MainWindow, manager ); if (!String.IsNullOrEmpty(searchKey)) { dialog.NameEntry.Text = searchKey; dialog.FindButton.Click(); } var res = dialog.Run(); var groupChat = dialog.GroupChat; dialog.Destroy(); if (res != (int) Gtk.ResponseType.Ok) { return; } ThreadPool.QueueUserWorkItem(delegate { try { manager.OpenChat(Frontend.FrontendManager, groupChat); } catch (Exception ex) { Frontend.ShowException(null, ex); } }); } #if GTK_SHARP_2_10 private static void _OnUnhandledException(GLib.UnhandledExceptionArgs e) { Trace.CallFull(e); lock (_UnhandledExceptionSyncRoot) { if (e.ExceptionObject is Exception) { ShowException((Exception) e.ExceptionObject); } } } #endif private static bool CheckFrontendManagerStatus() { Trace.Call(); if (_FrontendManager == null) { // we lost the frontend manager, nothing to check return false; } if (_FrontendManager.IsAlive) { // everything is fine return true; } #if LOG4NET _Logger.Error("CheckFrontendManagerStatus(): frontend manager is not alive anymore!"); #endif Gtk.Application.Invoke(delegate { Gtk.MessageDialog md = new Gtk.MessageDialog(_MainWindow, Gtk.DialogFlags.Modal, Gtk.MessageType.Error, Gtk.ButtonsType.OkCancel, _("The server has lost the connection to the frontend.\nDo you want to reconnect now?")); Gtk.ResponseType res = (Gtk.ResponseType) md.Run(); md.Destroy(); if (res != Gtk.ResponseType.Ok) { // the frontend is unusable in this state -> say good bye Frontend.Quit(); return; } Frontend.ReconnectEngineToGUI(); }); return false; } static void InitSignalHandlers() { if ((Environment.OSVersion.Platform == PlatformID.Unix) || (Environment.OSVersion.Platform == PlatformID.MacOSX)) { // Register shutdown handlers #if LOG4NET _Logger.Info("Registering signal handlers"); #endif UnixSignal[] shutdown_signals = { new UnixSignal(Signum.SIGINT), new UnixSignal(Signum.SIGTERM), }; Thread signal_thread = new Thread(() => { var index = UnixSignal.WaitAny(shutdown_signals); #if LOG4NET _Logger.Info("Caught signal " + shutdown_signals[index].Signum.ToString() + ", shutting down"); #endif Gtk.Application.Invoke(delegate { Quit(); }); }); signal_thread.IsBackground = true; signal_thread.Start(); } } private static void InitGtk(string[] args) { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { InitGtkPathWin(); } #if GTK_SHARP_2_8 || GTK_SHARP_2_10 if (!GLib.Thread.Supported) { GLib.Thread.Init(); } #else // with GTK# 2.8 we can do this better, see above // GTK# 2.7.1 for MS .NET doesn't support that though. if (!IsMono) { // when we don't run on Mono, we need to initialize glib ourself GLib.Thread.Init(); } #endif _UIThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId; string appDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string localeDir = Path.Combine(appDir, "locale"); if (!Directory.Exists(localeDir)) { localeDir = Path.Combine(Defines.InstallPrefix, "share"); localeDir = Path.Combine(localeDir, "locale"); } LibraryCatalog.Init("smuxi-frontend-gnome", localeDir); #if LOG4NET _Logger.Debug("InitGtk(): Using locale data from: " + localeDir); #endif Gtk.Application.Init(Name, ref args); IsGtkInitialized = true; #if GTK_SHARP_2_10 GLib.ExceptionManager.UnhandledException += _OnUnhandledException; #endif IconName = "smuxi-frontend-gnome"; var iconPath = Path.Combine(Defines.InstallPrefix, "share"); iconPath = Path.Combine(iconPath, "icons"); var theme = Gtk.IconTheme.Default; var settings = Gtk.Settings.Default; var iconInfo = theme.LookupIcon(IconName, -1, 0); HasSystemIconTheme = iconInfo != null && iconInfo.Filename != null && iconInfo.Filename.StartsWith(iconPath); #if LOG4NET _Logger.DebugFormat("InitGtk(): Using {0} icon theme", HasSystemIconTheme ? "system" : "built-in"); #endif if (Frontend.IsUnity) { var sysGtkTheme = settings.ThemeName ?? String.Empty; var sysIconTheme = GetGtkIconThemeName() ?? String.Empty; #if LOG4NET _Logger.DebugFormat("InitGtk(): Detected GTK+ theme: {0} " + "icon theme: {1}", sysGtkTheme, sysIconTheme); #endif if (sysGtkTheme.StartsWith("Ambiance") && sysIconTheme != "ubuntu-mono-dark") { #if LOG4NET _Logger.Debug("InitGtk(): Detected Ambiance theme with "+ "light icons"); #endif } } var appIconDir = Path.Combine(appDir, "icons"); if (Directory.Exists(appIconDir)) { var iconTheme = "Smuxi-Symbolic"; #if LOG4NET _Logger.InfoFormat("InitGtk(): Setting icon theme to: {0}", iconTheme); #endif var origin = Assembly.GetExecutingAssembly().FullName; settings.SetStringProperty( "gtk-icon-theme-name", iconTheme, origin ); settings.SetLongProperty( "gtk-menu-images", 0, origin ); settings.SetLongProperty( "gtk-button-images", 0, origin ); #if LOG4NET _Logger.InfoFormat("InitGtk(): Prepending {0} to icon search path", appIconDir); #endif theme.PrependSearchPath(appIconDir); } if (HasSystemIconTheme) { Gtk.Window.DefaultIconName = "smuxi-frontend-gnome"; } else { Gtk.Window.DefaultIcon = Frontend.LoadIcon( "smuxi-frontend-gnome", 256, "icon_256x256.png" ); } } private static void InitGtkPathWin() { // HACK: Force GTK# to use the right GTK+ install as the PATH // environment variable might contain other GTK+ installs // GTK# 2.12.20 var installPath = (string) Microsoft.Win32.Registry.GetValue( "HKEY_LOCAL_MACHINE\\SOFTWARE\\Xamarin\\GtkSharp\\InstallFolder", "", null ); if (installPath == null) { // GTK# 2.12.10 installPath = (string) Microsoft.Win32.Registry.GetValue( "HKEY_LOCAL_MACHINE\\SOFTWARE\\Novell\\GtkSharp\\InstallFolder", "", null ); } if (installPath == null) { #if LOG4NET _Logger.Error("InitGtkPathWin(): couldn't obtain GTK# installation folder from registry. GTK# is probably incorrectly installed!"); #endif return; } var binPath = Path.Combine(installPath, "bin"); var currentPath = Environment.GetEnvironmentVariable("PATH"); var newPath = String.Format("{0}{1}{2}", binPath, Path.PathSeparator, currentPath); #if LOG4NET _Logger.Debug("InitGtkPathWin(): current PATH: " + currentPath); _Logger.Debug("InitGtkPathWin(): new PATH: " + newPath); #endif Environment.SetEnvironmentVariable("PATH", newPath); } static void SyncConfig() { Trace.Call(); if (EngineProtocolVersion >= new Version("0.8.1.1")) { var config = UserConfig; ThreadPool.QueueUserWorkItem(delegate { try { config.SyncCache(); } catch (Exception ex) { #if LOG4NET _Logger.Error("SyncConfig(): " + "Exception during config sync", ex); #endif } finally { Gtk.Application.Invoke(delegate { ApplyConfig(config); }); } }); } else { if (!IsGuiThread()) { Gtk.Application.Invoke(delegate { SyncConfig(); }); return; } ApplyConfig(UserConfig); } } static string GetGtkIconThemeName() { // HACK: Gtk.IconTheme is not exposing gtk-icon-theme-name var method = typeof(Gtk.Settings).GetMethod( "GetProperty", BindingFlags.Instance | BindingFlags.NonPublic ); if (method == null) { #if LOG4NET _Logger.Warn("GetGtkIconThemeName(): method is null!"); #endif return String.Empty; } var value = (string)(GLib.Value) method.Invoke( Gtk.Settings.Default, new object[] {"gtk-icon-theme-name"} ); return value; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-SWF/0000775000175000017500000000000014011526502016317 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-SWF/RichTextBoxEx.cs0000644000175000017500000000237211655545675021377 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace Smuxi.Frontend.Swf { class RichTextBoxEx : RichTextBox { private const int WM_VSCROLL = 0x115; private const int WM_HSCROLL = 0x114; private const int SB_LINEUP = 0; private const int SB_LINEDOWN = 1; private const int SB_PAGEUP = 2; private const int SB_PAGEDOWN = 3; private const int SB_TOP = 6; private const int SB_BOTTOM = 7; public bool CaretEndPosition { get { return SelectionStart == TextLength; } } public RichTextBoxEx() : base() { } private IntPtr SendMessage(int msg, IntPtr wParam, IntPtr lParam) { Message m = new Message(); m.HWnd = Handle; m.Msg = msg; m.WParam = wParam; m.LParam = lParam; WndProc(ref m); return m.Result; } public void ScrollToEnd() { SendMessage(WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero); } public void SetCaretEndPosition() { SelectionStart = TextLength; } } } smuxi-1.1/src/Frontend-SWF/NotImplementedMessageDialog.cs0000644000175000017500000000270211655545675024245 0ustar00meebeymeebey00000000000000/* * $Id: SplashScreenWindow.cs 122 2006-04-26 19:31:42Z meebey $ * $URL: svn+ssh://SmuxiSVN/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/SplashScreenWindow.cs $ * $Rev: 122 $ * $Author: meebey $ * $Date: 2006-04-26 14:31:42 -0500 (Wed, 26 Apr 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Windows.Forms; using Mono.Unix; namespace Smuxi.Frontend.Swf { public static class NotImplementedMessageDialog { public static void Show() { MessageBox.Show(Catalog.GetString("Sorry, not implemented yet!"), null, MessageBoxButtons.OK, MessageBoxIcon.Information); } } } smuxi-1.1/src/Frontend-SWF/AssemblyInfo.cs0000644000175000017500000000272411655545675021273 0ustar00meebeymeebey00000000000000/* * $Id: AssemblyInfo.cs 167 2007-04-17 21:17:37Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AssemblyInfo.cs $ * $Rev: 167 $ * $Author: meebey $ * $Date: 2007-04-17 23:17:37 +0200 (Tue, 17 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * Copyright (c) 2007-2008 Jeffrey Mann Richardson * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - SWF frontend")] [assembly: AssemblyCopyright("2005-2008 (C) Jeffrey Mann Richardson ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/src/Frontend-SWF/smuxi-frontend-swf.in0000644000175000017500000000011711655545675022452 0ustar00meebeymeebey00000000000000#!/bin/sh exec mono "@expanded_libdir@/@PACKAGE@/smuxi-frontend-swf.exe" "$@" smuxi-1.1/src/Frontend-SWF/Makefile.am0000664000175000017500000000724413411450522020363 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-frontend-swf.exe ASSEMBLY_MDB = COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../../bin/release/smuxi-common.dll \ ../../bin/release/smuxi-engine.dll \ ../../bin/release/smuxi-frontend.dll BUILD_DIR = ../../bin/release SMUXI_ENGINE_DLL_MDB= LOG4NET_DLL_SOURCE=../../lib/log4net.dll NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll SMUXI_FRONTEND_DLL_MDB= SMUXI_FRONTEND_DLL_SOURCE=../../bin/release/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-frontend-swf.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-frontend.dll BUILD_DIR = ../../bin/debug SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb LOG4NET_DLL_SOURCE=../../lib/log4net.dll NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll SMUXI_FRONTEND_DLL_MDB_SOURCE=../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB=$(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_SOURCE=../../bin/debug/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(LOG4NET_DLL) \ $(NINI_DLL) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) BINARIES = \ $(FRONTEND_SWF) all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ NotImplementedMessageDialog.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ MainWindow.Designer.cs \ MainWindow.cs \ Notebook.cs \ Entry.cs \ RichTextBoxEx.cs \ Chats/ChatView.cs \ Frontend.cs \ SwfUI.cs \ ChatViewManager.cs \ Chats/GroupChatView.cs \ Main.cs \ Chats/NetworkChatView.cs \ Chats/PersonChatView.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend-swf.in REFERENCES = \ System \ System.Windows.Forms \ System.Drawing \ Mono.Posix \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) include $(top_srcdir)/Makefile.include LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_SWF = $(BUILD_DIR)/smuxi-frontend-swf SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-wrapper,FRONTEND_SWF,smuxi-frontend-swf,x)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) smuxi-1.1/src/Frontend-SWF/Notebook.cs0000644000175000017500000001046511655545675020461 0ustar00meebeymeebey00000000000000/* * $Id: Notebook.cs 212 2007-08-23 21:36:44Z meebey $ * $URL: svn+ssh://SmuxiSVN/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Notebook.cs $ * $Rev: 212 $ * $Author: meebey $ * $Date: 2007-08-23 16:36:44 -0500 (Thu, 23 Aug 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Common; using Smuxi.Engine; using System.Windows.Forms; namespace Smuxi.Frontend.Swf { public class Notebook : TabControl { //private Gtk.Menu _QueryTabMenu; public ChatView CurrentChatView { get { return (ChatView)SelectedTab; } } public Notebook() : base () { Trace.Call(); Selected += _OnSwitchPage; } public void ApplyConfig(UserConfig userConfig) { switch ((string) userConfig["Interface/Notebook/TabPosition"]) { case "top": Alignment = TabAlignment.Top; break; case "bottom": Alignment = TabAlignment.Bottom; break; case "left": Alignment = TabAlignment.Left; break; case "right": Alignment = TabAlignment.Right; break; case "none": //ShowTabs = false; break; } } // BUG: something fishy here, I don't believe the collection contains key // as string and int, see method below. public ChatView GetChat(ChatModel chat) { return (ChatView) Controls[chat.Name]; } public ChatView GetChat(int pageNumber) { return (ChatView) Controls[pageNumber]; } public void RemoveAllPages() { Controls.Clear(); } // events private void _OnSwitchPage(object sender, TabControlEventArgs e) { Trace.Call(sender, e); try { // synchronize FrontManager.CurrenPage ChatView chatView = e.TabPage as ChatView; if (chatView != null) { ChatModel chatModel = chatView.ChatModel; IProtocolManager nmanager = chatModel.ProtocolManager; Frontend.FrontendManager.CurrentChat = chatModel; if (nmanager != null) { Frontend.FrontendManager.CurrentProtocolManager = nmanager; } // even when we have no network manager, we still want to update the state Frontend.FrontendManager.UpdateNetworkStatus(); // lets remove any markup / highlight string color = (string) Frontend.UserConfig["Interface/Notebook/Tab/NoActivityColor"]; // TODO: apply color to tab chatView.HasHighlight = false; // sync title if (Frontend.MainWindow != null) { string network = nmanager != null ? nmanager.ToString() + " / " : ""; Frontend.MainWindow.Text = network + chatView.Text + " - Smuxi"; } } } catch (Exception ex) { Frontend.ShowException(null, ex); } } } } smuxi-1.1/src/Frontend-SWF/SwfUI.cs0000664000175000017500000002130114011467170017645 0ustar00meebeymeebey00000000000000/* * $Id: GnomeUI.cs 213 2007-09-10 21:25:36Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/GnomeUI.cs $ * $Rev: 213 $ * $Author: meebey $ * $Date: 2007-09-10 23:25:36 +0200 (Mon, 10 Sep 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using SysDiag = System.Diagnostics; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.ComponentModel; using System.Windows.Forms; using Mono.Unix; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Swf { public class SwfUI : PermanentRemoteObject, IFrontendUI { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private int _Version = 0; private ChatViewManager _ChatViewManager; private Control _Control; public int Version { get { return _Version; } } public SwfUI(ChatViewManager chatViewManager, Control control) { _ChatViewManager = chatViewManager; _Control = control; } public void AddChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, chat); _ChatViewManager.AddChat(chat); })); } private void _AddMessageToChat(ChatModel epage, MessageModel msg) { ChatView chatView = _ChatViewManager.GetChat(epage); #if LOG4NET if (chatView == null) { _Logger.Fatal(String.Format("_AddMessageToChat(): Notebook.GetPage(epage) epage.Name: {0} returned null!", epage.Name)); return; } #endif chatView.AddMessage(msg); } public void AddMessageToChat(ChatModel epage, MessageModel fmsg) { TraceRemotingCall(epage, fmsg); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, epage, fmsg); _AddMessageToChat(epage, fmsg); })); } public void RemoveChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, chat); _ChatViewManager.RemoveChat(chat); })); } public void EnableChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, chat); _ChatViewManager.EnableChat(chat); })); } public void DisableChat(ChatModel chat) { TraceRemotingCall(chat); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, chat); _ChatViewManager.DisableChat(chat); })); } public void SyncChat(ChatModel chatModel) { TraceRemotingCall(chatModel); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, chatModel); ChatView chatView = _ChatViewManager.GetChat(chatModel); #if LOG4NET DateTime syncStart = DateTime.UtcNow; #endif chatView.Sync(); #if LOG4NET DateTime syncStop = DateTime.UtcNow; double duration = syncStop.Subtract(syncStart).TotalMilliseconds; _Logger.Debug("SyncChat() done, syncing took: " + Math.Round(duration) + " ms"); #endif // maybe a BUG here? should be tell the FrontendManager before we sync? Frontend.FrontendManager.AddSyncedChat(chatModel); //_SyncedChats.Add(chatView); // BUG: doesn't work?!? chatView.ScrollToEnd(); })); } public void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person) { TraceRemotingCall(groupChat, person); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, groupChat, person); GroupChatView groupChatView = (GroupChatView) _ChatViewManager.GetChat(groupChat); groupChatView.AddPerson(person); })); } public void UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { TraceRemotingCall(groupChat, oldPerson, newPerson); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, groupChat, oldPerson, newPerson); GroupChatView groupChatView = (GroupChatView) _ChatViewManager.GetChat(groupChat); groupChatView.UpdatePerson(oldPerson, newPerson); })); } public void UpdateTopicInGroupChat(GroupChatModel ecpage, MessageModel topic) { TraceRemotingCall(ecpage, topic); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, ecpage, topic); /* GroupChatView cpage = (GroupChatView)Frontend.MainWindow.Notebook.GetChat(ecpage); if (cpage.TopicEntry != null) { cpage.TopicEntry.Text = topic; } */ })); } public void RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person) { TraceRemotingCall(groupChat, person); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, groupChat, person); GroupChatView groupChatView = (GroupChatView) _ChatViewManager.GetChat(groupChat); groupChatView.RemovePerson(person); })); } public void SetNetworkStatus(string status) { TraceRemotingCall(status); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, status); Frontend.MainWindow.NetworkStatusbar.Text = status; })); } public void SetStatus(string status) { TraceRemotingCall(status); MethodBase mb = Trace.GetMethodBase(); _Control.Invoke(new MethodInvoker(delegate { TraceRemotingCall(mb, status); Frontend.MainWindow.Statusbar.Text = status; })); } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } [SysDiag.Conditional("REMOTING_TRACE")] protected static void TraceRemotingCall(MethodBase mb, params object[] parameters) { Trace.Call(mb, parameters); } [SysDiag.Conditional("REMOTING_TRACE")] protected static void TraceRemotingCall(params object[] parameters) { TraceRemotingCall(Trace.GetMethodBase(), parameters); } } } smuxi-1.1/src/Frontend-SWF/MainWindow.Designer.cs0000644000175000017500000003104511655545675022511 0ustar00meebeymeebey00000000000000namespace Smuxi.Frontend.Swf { partial class MainWindow { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { System.Windows.Forms.MenuStrip menuStrip1; System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem; System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem caretModeToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem engineToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem useLocalEngineToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem addRemoteEngineToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem switchRemoteEngineToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this._Statusbar = new System.Windows.Forms.ToolStripStatusLabel(); this._NetworkStatusbar = new System.Windows.Forms.ToolStripStatusLabel(); this._ProgressBar = new System.Windows.Forms.ToolStripProgressBar(); this._Notebook = new Smuxi.Frontend.Swf.Notebook(); this._Entry = new Smuxi.Frontend.Swf.Entry(); menuStrip1 = new System.Windows.Forms.MenuStrip(); fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); caretModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); engineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); useLocalEngineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); addRemoteEngineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); switchRemoteEngineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); menuStrip1.SuspendLayout(); this.statusStrip1.SuspendLayout(); this.SuspendLayout(); // // menuStrip1 // menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { fileToolStripMenuItem, viewToolStripMenuItem, engineToolStripMenuItem, helpToolStripMenuItem}); menuStrip1.Location = new System.Drawing.Point(0, 0); menuStrip1.Name = "menuStrip1"; menuStrip1.Size = new System.Drawing.Size(784, 24); menuStrip1.TabIndex = 0; menuStrip1.Text = "menuStrip1"; // // fileToolStripMenuItem // fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { preferencesToolStripMenuItem, toolStripMenuItem1, exitToolStripMenuItem}); fileToolStripMenuItem.Name = "fileToolStripMenuItem"; fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); fileToolStripMenuItem.Text = "&File"; // // preferencesToolStripMenuItem // preferencesToolStripMenuItem.Name = "preferencesToolStripMenuItem"; preferencesToolStripMenuItem.Size = new System.Drawing.Size(152, 22); preferencesToolStripMenuItem.Text = "&Preferences..."; // // toolStripMenuItem1 // toolStripMenuItem1.Name = "toolStripMenuItem1"; toolStripMenuItem1.Size = new System.Drawing.Size(149, 6); // // exitToolStripMenuItem // exitToolStripMenuItem.Name = "exitToolStripMenuItem"; exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22); exitToolStripMenuItem.Text = "E&xit"; // // viewToolStripMenuItem // viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { caretModeToolStripMenuItem}); viewToolStripMenuItem.Name = "viewToolStripMenuItem"; viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); viewToolStripMenuItem.Text = "&View"; // // caretModeToolStripMenuItem // caretModeToolStripMenuItem.CheckOnClick = true; caretModeToolStripMenuItem.Name = "caretModeToolStripMenuItem"; caretModeToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F7; caretModeToolStripMenuItem.Size = new System.Drawing.Size(155, 22); caretModeToolStripMenuItem.Text = "&Caret Mode"; // // engineToolStripMenuItem // engineToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { useLocalEngineToolStripMenuItem, addRemoteEngineToolStripMenuItem, switchRemoteEngineToolStripMenuItem}); engineToolStripMenuItem.Name = "engineToolStripMenuItem"; engineToolStripMenuItem.Size = new System.Drawing.Size(55, 20); engineToolStripMenuItem.Text = "&Engine"; // // useLocalEngineToolStripMenuItem // useLocalEngineToolStripMenuItem.Name = "useLocalEngineToolStripMenuItem"; useLocalEngineToolStripMenuItem.Size = new System.Drawing.Size(192, 22); useLocalEngineToolStripMenuItem.Text = "&Use Local Engine"; // // addRemoteEngineToolStripMenuItem // addRemoteEngineToolStripMenuItem.Name = "addRemoteEngineToolStripMenuItem"; addRemoteEngineToolStripMenuItem.Size = new System.Drawing.Size(192, 22); addRemoteEngineToolStripMenuItem.Text = "&Add Remote Engine"; // // switchRemoteEngineToolStripMenuItem // switchRemoteEngineToolStripMenuItem.Name = "switchRemoteEngineToolStripMenuItem"; switchRemoteEngineToolStripMenuItem.Size = new System.Drawing.Size(192, 22); switchRemoteEngineToolStripMenuItem.Text = "&Switch Remote Engine"; // // helpToolStripMenuItem // helpToolStripMenuItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { aboutToolStripMenuItem}); helpToolStripMenuItem.Name = "helpToolStripMenuItem"; helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); helpToolStripMenuItem.Text = "&Help"; // // aboutToolStripMenuItem // aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22); aboutToolStripMenuItem.Text = "&About"; // // statusStrip1 // this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this._NetworkStatusbar, this._Statusbar, this._ProgressBar}); this.statusStrip1.Location = new System.Drawing.Point(0, 540); this.statusStrip1.Name = "statusStrip1"; this.statusStrip1.Size = new System.Drawing.Size(784, 24); this.statusStrip1.TabIndex = 1; this.statusStrip1.Text = "statusStrip1"; // // _Statusbar // this._Statusbar.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top) | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); this._Statusbar.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; this._Statusbar.Name = "_Statusbar"; this._Statusbar.Size = new System.Drawing.Size(318, 19); this._Statusbar.Spring = true; this._Statusbar.Text = "Status"; this._Statusbar.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // _NetworkStatusbar // this._NetworkStatusbar.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top) | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); this._NetworkStatusbar.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; this._NetworkStatusbar.Name = "_NetworkStatusbar"; this._NetworkStatusbar.Size = new System.Drawing.Size(318, 19); this._NetworkStatusbar.Spring = true; this._NetworkStatusbar.Text = "NetworkStatus"; this._NetworkStatusbar.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // _ProgressBar // this._ProgressBar.Name = "_ProgressBar"; this._ProgressBar.Size = new System.Drawing.Size(100, 18); // // _Notebook // this._Notebook.Dock = System.Windows.Forms.DockStyle.Fill; this._Notebook.Location = new System.Drawing.Point(0, 24); this._Notebook.Name = "_Notebook"; this._Notebook.SelectedIndex = 0; this._Notebook.Size = new System.Drawing.Size(784, 496); this._Notebook.TabIndex = 2; // // _Entry // this._Entry.Dock = System.Windows.Forms.DockStyle.Bottom; this._Entry.Location = new System.Drawing.Point(0, 520); this._Entry.Name = "_Entry"; this._Entry.Size = new System.Drawing.Size(784, 20); this._Entry.TabIndex = 3; // // MainWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(784, 564); this.Controls.Add(this._Notebook); this.Controls.Add(this._Entry); this.Controls.Add(this.statusStrip1); this.Controls.Add(menuStrip1); this.MainMenuStrip = menuStrip1; this.Name = "MainWindow"; this.Text = "Smuxi - Smart MUltipleXed Irc"; menuStrip1.ResumeLayout(false); menuStrip1.PerformLayout(); this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.StatusStrip statusStrip1; private System.Windows.Forms.ToolStripStatusLabel _Statusbar; private System.Windows.Forms.ToolStripStatusLabel _NetworkStatusbar; private System.Windows.Forms.ToolStripProgressBar _ProgressBar; } }smuxi-1.1/src/Frontend-SWF/Entry.cs0000664000175000017500000006006414011467170017762 0ustar00meebeymeebey00000000000000/* * $Id: Entry.cs 216 2007-11-05 22:56:57Z meebey $ * $URL: svn+ssh://SmuxiSVN/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Entry.cs $ * $Rev: 216 $ * $Author: meebey $ * $Date: 2007-11-05 17:56:57 -0500 (Mon, 05 Nov 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Drawing; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Windows.Forms; using Mono.Unix; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Swf { public class Entry : TextBox { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private StringCollection _History = new StringCollection(); private int _HistoryPosition; private bool _HistoryChangedLine; private Notebook _Notebook; private NickCompleter NickCompleter { get; set; } public EventHandler Activated; /* public StringCollection History { get { return _History; } } */ /* public int HistoryPosition { get { return _HistoryPosition; } set { _HistoryPosition = value; } } */ /* public bool HistoryChangedLine { get { return _HistoryChangedLine; } set { _HistoryChangedLine = value; } } */ public Notebook Notebook { get { return _Notebook; } internal set { _Notebook = value; } } public Entry() { _History.Add(String.Empty); Activated += _OnActivated; KeyDown += _OnKeyPress; Leave += _OnFocusOut; //ClipboardPasted += new EventHandler(_OnClipboardPasted); } public void UpdateHistoryChangedLine() { if ((_History.Count > 0) && (Text.Length > 0) && (Text != HistoryCurrent())) { // the entry changed and the entry is not empty _HistoryChangedLine = true; #if LOG4NET _Logger.Debug("_HistoryChangedLine = true"); #endif } else { _HistoryChangedLine = false; #if LOG4NET _Logger.Debug("_HistoryChangedLine = false"); #endif } } public void AddToHistory(string data, int positiondiff) { /* // BUG: this code doesnt work well // _History.Count-1 is the last entry, which should be always empty if ((_History.Count > 1) && (data == _History[_History.Count-2])) { // don't add the same value return; } */ _History.Insert(_History.Count-1, data); #if LOG4NET _Logger.Debug("added: '"+data+"' to history"); #endif if (_History.Count > (int)Frontend.UserConfig["Interface/Entry/CommandHistorySize"]) { _History.RemoveAt(0); } else { _HistoryPosition += positiondiff; } } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } string bgStr = (string) config["Interface/Chat/BackgroundColor"]; if (!String.IsNullOrEmpty(bgStr)) { try { BackColor = ColorTools.GetColor(bgStr); } catch (FormatException ex) { #if LOG4NET _Logger.Error("setting background color failed", ex); #endif } } else { BackColor = Color.Empty; } string fgStr = (string) config["Interface/Chat/ForegroundColor"]; if (!String.IsNullOrEmpty(fgStr)) { try { ForeColor = ColorTools.GetColor(fgStr); } catch (FormatException ex) { #if LOG4NET _Logger.Error("setting foreground color failed", ex); #endif } } else { ForeColor = Color.Empty; } string fontFamily = (string) config["Interface/Chat/FontFamily"]; string fontStyle = (string) config["Interface/Chat/FontStyle"]; int fontSize = 0; if (config["Interface/Chat/FontSize"] != null) { fontSize = (int) config["Interface/Chat/FontSize"]; } Font font = null; if (String.IsNullOrEmpty(fontFamily)) { // use Monospace by default float? defaultSize; try { defaultSize = Font.Size; } catch (NullReferenceException) { #if LOG4NET _Logger.Error("could not get default system font size, using internal default"); #endif // Mono bug? defaultSize = 12f; } font = new Font(FontFamily.GenericMonospace, defaultSize.Value); } else { if (fontStyle.Contains(" ")) { int pos = fontStyle.IndexOf(" "); fontStyle = fontStyle.Substring(pos + 1); } FontStyle style = (FontStyle) Enum.Parse(typeof(FontStyle), fontStyle); font = new Font(fontFamily, fontSize, style); } Font = font; // replace nick completer if needed bool wantBashCompletion = (bool)config["Interface/Entry/BashStyleCompletion"]; if (wantBashCompletion && !(NickCompleter is LongestPrefixNickCompleter)) { NickCompleter = new LongestPrefixNickCompleter(); } else if (!wantBashCompletion && !(NickCompleter is TabCycleNickCompleter)) { NickCompleter = new TabCycleNickCompleter(); } // set the completion character NickCompleter.CompletionChar = (string)config["Interface/Entry/CompletionChar"]; } public string HistoryCurrent() { return _History[_HistoryPosition]; } public void HistoryPrevious() { if (_HistoryChangedLine) { #if LOG4NET _Logger.Debug("entry changed, adding to history"); #endif AddToHistory(Text, 0); _HistoryChangedLine = false; } if (_HistoryPosition > 0) { #if LOG4NET _Logger.Debug("showing previous item"); #endif _HistoryPosition--; Text = HistoryCurrent(); } } public void HistoryNext() { if (_HistoryChangedLine) { #if LOG4NET _Logger.Debug("entry changed, adding to history"); #endif AddToHistory(Text, 0); _HistoryChangedLine = false; } if (_HistoryPosition < _History.Count-1) { #if LOG4NET _Logger.Debug("showing next item"); #endif _HistoryPosition++; Text = HistoryCurrent(); //Position = -1; } else if (Text.Length > 0) { #if LOG4NET _Logger.Debug("not empty line, lets add one"); #endif // last position and we went further down _History.Add(String.Empty); _HistoryPosition++; Text = String.Empty; } } private void _OnKeyPress(object sender, KeyEventArgs e) { Trace.Call(sender, e); #if LOG4NET _Logger.Debug("_OnKeyPress(): KeyCode: " + e.KeyCode + " KeyValue: " + e.KeyValue); #endif //int keynumber = (int)e.KeyCode; Keys key = e.KeyCode; if (e.Control) { // ctrl is pressed e.Handled = true; switch (key) { case Keys.X: if (_Notebook.CurrentChatView is SessionChatView) { Frontend.FrontendManager.NextProtocolManager(); } else { // don't break cut e.Handled = false; } break; // don't break copy/paste case Keys.C: case Keys.V: e.Handled = false; break; case Keys.PageDown: if (_Notebook.SelectedIndex < _Notebook.TabCount - 1) { _Notebook.SelectedIndex++; } break; case Keys.PageUp: if (_Notebook.SelectedIndex > 0) { _Notebook.SelectedIndex--; } break; case Keys.Home: _Notebook.CurrentChatView.ScrollToStart(); break; case Keys.End: _Notebook.CurrentChatView.ScrollToEnd(); break; } } int pagenumber = -1; if (e.Alt) { // alt is pressed switch (e.KeyValue) { case 49: // 1 case 50: // 2 case 51: // 3 case 52: // 4 case 53: // 5 case 54: // 6 case 55: // 7 case 56: // 8 case 57: // 9 pagenumber = e.KeyValue - 49; break; case 48: // 0 pagenumber = 9; break; case 81: // q pagenumber = 10; break; case 87: // w pagenumber = 11; break; case 69: // e pagenumber = 12; break; case 82: // r pagenumber = 13; break; case 84: // t pagenumber = 14; break; case 89: // y pagenumber = 15; break; case 85: // u pagenumber = 16; break; case 73: // i pagenumber = 17; break; case 79: // o pagenumber = 18; break; case 80: // p pagenumber = 19; break; } if (pagenumber != -1 && _Notebook.TabCount > pagenumber) { _Notebook.SelectedIndex = pagenumber; } } if (e.Alt | e.Control | e.Shift) { // alt, ctrl or shift pushed, returning return; } UpdateHistoryChangedLine(); switch (key) { case Keys.Enter: if (Activated != null) { Activated(this, EventArgs.Empty); } e.Handled = true; break; case Keys.Tab: e.Handled = true; if (Frontend.MainWindow.CaretMode) { // when we are in caret-mode change focus to output textview _Notebook.CurrentChatView.OutputTextView.Focus(); } else { // don't loose the focus (if we are not in caret-mode) if (_Notebook.CurrentChatView.ChatModel is GroupChatModel) { if (Text.Length > 0) { _NickCompletion(); } } } break; case Keys.Up: HistoryPrevious(); break; case Keys.Down: HistoryNext(); break; case Keys.PageUp: _Notebook.CurrentChatView.ScrollUp(); break; case Keys.PageDown: _Notebook.CurrentChatView.ScrollDown(); break; } } private void _OnFocusOut(object sender, EventArgs e) { Trace.Call(sender, e); if (!Frontend.MainWindow.CaretMode) { Select(); } } private void _OnActivated(object sender, EventArgs e) { Trace.Call(sender, e); try { if (!(Text.Length > 0)) { return; } if (Text.IndexOf("\n") != -1) { // seems to be a paste, so let's break it apart string[] msgParts = Text.Split(new char[] {'\n'}); /* TODO? if (msgParts.Length > 3) { string msg = String.Format(_("You are going to paste {0} lines, do you want to continue?"), msgParts.Length); /* Gtk.MessageDialog md = new Gtk.MessageDialog( Frontend.MainWindow, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.YesNo, msg); Gtk.ResponseType res = (Gtk.ResponseType)md.Run(); md.Destroy(); if (res != Gtk.ResponseType.Yes) { Text = String.Empty; return; } } */ foreach (string msg in msgParts) { ExecuteCommand(msg); } } else { ExecuteCommand(Text); AddToHistory(Text, _History.Count - _HistoryPosition); // reset history position to last entry _HistoryPosition = _History.Count - 1; } Text = String.Empty; } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif Frontend.ShowException(null, ex); } } private void _OnClipboardPasted(object sender, EventArgs e) { Trace.Call(sender, e); } public void ExecuteCommand(string cmd) { if (!(cmd.Length > 0)) { return; } bool handled; CommandModel cd = new CommandModel(Frontend.FrontendManager, _Notebook.CurrentChatView.ChatModel, (string)Frontend.UserConfig["Interface/Entry/CommandCharacter"], cmd); handled = _Command(cd); if (!handled) { handled = Frontend.Session.Command(cd); } if (!handled) { // we may have no network manager yet Engine.IProtocolManager nm = Frontend.FrontendManager.CurrentProtocolManager; if (nm != null) { handled = nm.Command(cd); } else { handled = false; } } if (!handled) { _CommandUnknown(cd); } } private bool _Command(CommandModel cd) { bool handled = false; // command that work even without beeing connected if (cd.IsCommand) { switch (cd.Command) { case "help": _CommandHelp(cd); break; case "detach": _CommandDetach(cd); handled = true; break; case "echo": _CommandEcho(cd); handled = true; break; case "exec": _CommandExec(cd); handled = true; break; case "window": _CommandWindow(cd); handled = true; break; case "clear": _CommandClear(cd); handled = true; break; } } return handled; } private void _CommandHelp(CommandModel cd) { MessageModel msg = new MessageModel(); TextMessagePartModel msgPart; msgPart = new TextMessagePartModel(); // TRANSLATOR: this line is used as a label / category for a // list of commands below msgPart.Text = "[" + _("Frontend Commands") + "]"; msgPart.Bold = true; msg.MessageParts.Add(msgPart); cd.FrontendManager.AddMessageToChat(cd.Chat, msg); string[] help = { "window (number|channelname|queryname|close", "clear", "echo data", "exec command", "detach", }; foreach (string line in help) { cd.FrontendManager.AddTextToChat(cd.Chat, "-!- " + line); } } private void _CommandDetach(CommandModel cd) { Frontend.Quit(); } private void _CommandEcho(CommandModel cd) { cd.FrontendManager.AddTextToChat(cd.Chat, "-!- " + cd.Parameter); } private void _CommandExec(CommandModel cd) { if (cd.DataArray.Length >= 2) { string output; System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = cd.DataArray[1]; if (cd.DataArray.Length >= 3) { process.StartInfo.Arguments = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); } process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.UseShellExecute = false; try { process.Start(); output = process.StandardOutput.ReadToEnd(); cd.FrontendManager.AddTextToChat(cd.Chat, output); } catch { } } } private void _CommandWindow(CommandModel cd) { FrontendManager fm = cd.FrontendManager; if (cd.DataArray.Length >= 2) { ChatModel currentChatModel = _Notebook.CurrentChatView.ChatModel; string name; if (cd.DataArray[1].ToLower() == "close") { name = currentChatModel.Name; // BUG: handle this in GNOME-IRC /* if (currentChatModel.ChatType != ChatType.Network) { if (currentChatModel.ProtocolManager is IrcProtocolManager) { IrcProtocolManager ircm = (IrcProtocolManager) currentChatModel.ProtocolManager; if (currentChatModel.ChatType == ChatType.Group) { // channel ircm.CommandPart(new CommandModel(fm, currentChatModel, name)); } else { // query Frontend.Session.RemoveChat(currentChatModel); } } } */ } else { bool is_number = false; int pagecount = _Notebook.TabCount; try { int number = Int32.Parse(cd.DataArray[1]); is_number = true; if (number <= pagecount) { _Notebook.SelectedIndex = number - 1; } } catch (FormatException) { } if (!is_number) { // seems to be query- or channelname // let's see if we find something ArrayList candidates = new ArrayList(); for (int i = 0; i < pagecount; i++) { ChatView chatView = _Notebook.GetChat(i); ChatModel chatModel = chatView.ChatModel; if (chatModel.Name.ToLower() == cd.DataArray[1].ToLower()) { // name matches // first let's see if there is an exact match, if so, take it if ((chatModel.ChatType == currentChatModel.ChatType) && (chatModel.ProtocolManager == currentChatModel.ProtocolManager)) { _Notebook.SelectedIndex = i; break; } else { // there was no exact match candidates.Add(i); } } } if (candidates.Count > 0) { _Notebook.SelectedIndex = (int)candidates[0]; } } } } } private void _CommandClear(CommandModel cd) { _Notebook.CurrentChatView.OutputTextView.Clear(); } private void _CommandUnknown(CommandModel cd) { cd.FrontendManager.AddTextToChat(cd.Chat, "-!- " + String.Format(Catalog.GetString( "Unknown Command: {0}"), cd.Command)); } private void _NickCompletion() { // perform completion string text = Text; int position = SelectionStart; NickCompleter.Complete(ref text, ref position, _Notebook.CurrentChatView); Text = text; SelectionStart = position; } private static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-SWF/ChatViewManager.cs0000644000175000017500000000647611655545675021715 0ustar00meebeymeebey00000000000000/* * $Id: ChannelPage.cs 138 2006-12-23 17:11:57Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/ChannelPage.cs $ * $Rev: 138 $ * $Author: meebey $ * $Date: 2006-12-23 18:11:57 +0100 (Sat, 23 Dec 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using System.Globalization; using Mono.Unix; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Swf { public class ChatViewManager : ChatViewManagerBase { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private List f_Chats = new List(); private Notebook f_Notebook; private UserConfig f_Config; public override IChatView ActiveChat { get { return f_Notebook.CurrentChatView; } } public ChatViewManager(Notebook notebook) { f_Notebook = notebook; } public override void AddChat(ChatModel chat) { ChatView chatView = (ChatView) CreateChatView(chat); f_Chats.Add(chatView); if (f_Config != null) { chatView.ApplyConfig(f_Config); } f_Notebook.TabPages.Add(chatView); } public override void RemoveChat(ChatModel chat) { ChatView chatView = f_Notebook.GetChat(chat); f_Notebook.TabPages.Remove(chatView); f_Chats.Remove(chatView); } public override void EnableChat(ChatModel chat) { ChatView chatView = f_Notebook.GetChat(chat); chatView.Enable(); } public override void DisableChat(ChatModel chat) { ChatView chatView = f_Notebook.GetChat(chat); chatView.Disable(); } public ChatView GetChat(ChatModel chatModel) { return f_Notebook.GetChat(chatModel); } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } f_Config = config; foreach (ChatView chat in f_Chats) { chat.ApplyConfig(f_Config); } } } } smuxi-1.1/src/Frontend-SWF/Main.cs0000644000175000017500000000335611655545675017566 0ustar00meebeymeebey00000000000000/* * $Id: Main.cs 183 2007-04-21 15:14:23Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Main.cs $ * $Rev: 183 $ * $Author: meebey $ * $Date: 2007-04-21 17:14:23 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Frontend.Swf { public class MainClass { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif [STAThread] public static void Main(string[] args) { #if LOG4NET log4net.Config.BasicConfigurator.Configure(); #endif try { Frontend.Init(args); } catch (Exception e) { #if LOG4NET _Logger.Fatal(e); #endif // rethrow the exception for console output throw; } } } } smuxi-1.1/src/Frontend-SWF/MainWindow.cs0000664000175000017500000000466614011467170020743 0ustar00meebeymeebey00000000000000 using System; using System.Reflection; using System.Windows.Forms; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Swf { public partial class MainWindow : Form { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private ChatViewManager _ChatViewManager; private IFrontendUI _UI; private Notebook _Notebook; private Entry _Entry; public bool CaretMode { get { return false; } } public Notebook Notebook { get { return _Notebook; } } public IFrontendUI UI { get { return _UI; } } public ToolStripStatusLabel NetworkStatusbar { get { return _NetworkStatusbar; } } public ToolStripStatusLabel Statusbar { get { return _Statusbar; } } public ToolStripProgressBar ProgressBar { get { return _ProgressBar; } } public Entry Entry { get { return _Entry; } } public MainWindow() { InitializeComponent(); _Entry.Notebook = _Notebook; _Notebook.Show(); _ChatViewManager = new ChatViewManager(_Notebook); Assembly asm = Assembly.GetExecutingAssembly(); _ChatViewManager.Load(asm); _ChatViewManager.LoadAll(System.IO.Path.GetDirectoryName(asm.Location), "smuxi-frontend-swf-*.dll"); _UI = new SwfUI(_ChatViewManager, this); _NetworkStatusbar.Text = String.Empty; _Statusbar.Text = String.Empty; } public void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } _Entry.ApplyConfig(userConfig); _Notebook.ApplyConfig(userConfig); _ChatViewManager.ApplyConfig(userConfig); } } } smuxi-1.1/src/Frontend-SWF/Makefile.in0000664000175000017500000010352014011526472020373 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-SWF ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-frontend-swf 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-frontend-swf.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-frontend-swf.exe @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-frontend-swf.exe @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = exe @ENABLE_RELEASE_TRUE@COMPILE_TARGET = winexe @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_RELEASE_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB = $(BUILD_DIR)/smuxi-frontend.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB_SOURCE = ../../bin/debug/smuxi-frontend.dll.mdb AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(LOG4NET_DLL) \ $(NINI_DLL) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) BINARIES = \ $(FRONTEND_SWF) FILES = \ NotImplementedMessageDialog.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ MainWindow.Designer.cs \ MainWindow.cs \ Notebook.cs \ Entry.cs \ RichTextBoxEx.cs \ Chats/ChatView.cs \ Frontend.cs \ SwfUI.cs \ ChatViewManager.cs \ Chats/GroupChatView.cs \ Main.cs \ Chats/NetworkChatView.cs \ Chats/PersonChatView.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend-swf.in REFERENCES = \ System \ System.Windows.Forms \ System.Drawing \ Mono.Posix \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY) $(ASSEMBLY).mdb \ $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_SWF = $(BUILD_DIR)/smuxi-frontend-swf SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-SWF/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-SWF/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-frontend-swf: $(top_builddir)/config.status $(srcdir)/smuxi-frontend-swf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-wrapper,FRONTEND_SWF,smuxi-frontend-swf,x)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) # 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: smuxi-1.1/src/Frontend-SWF/Chats/0000775000175000017500000000000014011526502017361 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-SWF/Chats/GroupChatView.cs0000644000175000017500000001227412726351313022452 0ustar00meebeymeebey00000000000000/* * $Id: ChannelPage.cs 138 2006-12-23 17:11:57Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/ChannelPage.cs $ * $Rev: 138 $ * $Author: meebey $ * $Date: 2006-12-23 18:11:57 +0100 (Sat, 23 Dec 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Linq; using System.Windows.Forms; using System.Collections.Generic; using Mono.Unix; using Smuxi.Engine; namespace Smuxi.Frontend.Swf { [ChatViewInfo(ChatType = ChatType.Group)] public class GroupChatView : ChatView { private TextBox _TopicTextView; private ListBox _PersonListBox; private MessageModel _Topic; public GroupChatView(ChatModel chat) : base(chat) { InitializeComponents(); } public GroupChatModel GroupChatModel { get { return (GroupChatModel)base.ChatModel; } } private void InitializeComponents() { Splitter personListBoxSplitter = new Splitter(); this._TopicTextView = new TextBox(); this._PersonListBox = new ListBox(); this.SuspendLayout(); // _TopicTextView this._TopicTextView.ReadOnly = true; this._TopicTextView.Name = "_TopicTextView"; this._TopicTextView.Dock = DockStyle.Top; // _PersonListBox this._PersonListBox.Name = "_PersonListBox"; this._PersonListBox.Dock = DockStyle.Right; this._PersonListBox.IntegralHeight = false; // personListBoxSplitter personListBoxSplitter.Dock = DockStyle.Right; this.Controls.Add(base.OutputTextView); this.Controls.Add(_TopicTextView); this.Controls.Add(personListBoxSplitter); this.Controls.Add(_PersonListBox); this.ResumeLayout(); } public override void ApplyConfig(UserConfig config) { base.ApplyConfig(config); if (BackgroundColor.HasValue) _PersonListBox.BackColor = _TopicTextView.BackColor = BackgroundColor.Value; if (BackgroundColor.HasValue) _PersonListBox.ForeColor = _TopicTextView.ForeColor = ForegroundColor.Value; _PersonListBox.Font = _TopicTextView.Font = Font; _PersonListBox.Width = TextRenderer.MeasureText("999999999", Font).Width; } public void AddPerson(PersonModel person) { _PersonListBox.Items.Add(person.IdentityName); } public void UpdatePerson(PersonModel oldPerson, PersonModel newPerson) { _PersonListBox.Items.Remove(oldPerson.IdentityName); _PersonListBox.Items.Add(newPerson.IdentityName); } public void RemovePerson(PersonModel person) { _PersonListBox.Items.Remove(person.IdentityName); } public override void Sync() { base.Sync(); var persons = GroupChatModel.Persons; if (persons == null) { persons = new Dictionary(0); } foreach (PersonModel person in persons.Values) { _PersonListBox.Items.Add(person.IdentityName); } Topic = GroupChatModel.Topic; } public override void Disable() { base.Disable(); _PersonListBox.Items.Clear(); _TopicTextView.Clear(); } public override IList Participants { get { var participants = new List(); foreach (PersonModel person in _PersonListBox.Items) { participants.Add(person); } return new List(participants.OrderBy(x => x)); } } public MessageModel Topic { get { return _Topic; } set { _Topic = value; _TopicTextView.Clear(); if (value != null) { // TODO: Convert the TextBox into a rich one, and then add parsing code (like in ChatView) // TODO: And also wrapping _TopicTextView.Text = value.ToString(); } _TopicTextView.Visible = !(_TopicTextView.Text == String.Empty); } } } } smuxi-1.1/src/Frontend-SWF/Chats/ChatView.cs0000664000175000017500000003035714011467170021437 0ustar00meebeymeebey00000000000000using System; using System.Text; using System.Drawing; using System.Globalization; using System.Windows.Forms; using System.ComponentModel; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Swf { public abstract partial class ChatView : TabPage, IChatView { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private ChatModel _ChatModel; private bool _HasHighlight; private RichTextBoxEx _OutputTextView; private Color? _BackgroundColor; private Color? _ForegroundColor; private Font _Font; //protected override void OnPaint(PaintEventArgs pe) //{ // // TODO: Add custom paint code here // // Calling the base class OnPaint // base.OnPaint(pe); //} public ChatModel ChatModel { get { return _ChatModel; } } public string ID { get { return ChatModel.ID; } } public int Position { get { return ChatModel.Position; } } public RichTextBox OutputTextView { get { return _OutputTextView; } } public bool HasHighlight { get { return _HasHighlight; } set { _HasHighlight = value; } } protected Font Font { get { return _Font; } } protected Color? BackgroundColor { get { return _BackgroundColor; } } protected Color? ForegroundColor { get { return _ForegroundColor; } } protected ChatView(ChatModel chat) { _ChatModel = chat; InitializeComponent(); Name = chat.Name; Text = chat.Name; _OutputTextView.SelectionChanged += new EventHandler(OutputSelectionChanged); } private void OutputSelectionChanged(object sender, EventArgs e) { #if LOG4NET if (!_OutputTextView.CaretEndPosition) { _Logger.Debug("OutputSelectionChanged()"); } #endif } private void InitializeComponent() { this._OutputTextView = new RichTextBoxEx(); this.SuspendLayout(); // // _OutputTextView // this._OutputTextView.DetectUrls = false; this._OutputTextView.Dock = System.Windows.Forms.DockStyle.Fill; this._OutputTextView.HideSelection = false; this._OutputTextView.Name = "_OutputTextView"; this._OutputTextView.ReadOnly = true; this._OutputTextView.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; this._OutputTextView.ShowSelectionMargin = true; this._OutputTextView.TabIndex = 0; this.ResumeLayout(false); } public void ScrollUp() { Trace.Call(); // TODO } public void ScrollDown() { Trace.Call(); // TODO } public void ScrollToStart() { Trace.Call(); // TODO } public void ScrollToEnd() { Trace.Call(); _OutputTextView.ScrollToEnd(); } public void Enable() { Trace.Call(); Enabled = true; } public virtual void Disable() { Trace.Call(); Enabled = false; } public virtual void Sync() { Trace.Call(); #if LOG4NET _Logger.Debug("Sync() syncing messages"); #endif // sync messages // cleanup, be sure the output is empty _OutputTextView.Clear(); IList messages = _ChatModel.Messages; if (messages.Count > 0) { foreach (MessageModel msg in messages) { AddMessage(msg); } } } public virtual void Populate() { } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } string bgStr = (string) config["Interface/Chat/BackgroundColor"]; if (!String.IsNullOrEmpty(bgStr)) { try { Color color = ColorTools.GetColor(bgStr); _BackgroundColor = color; _OutputTextView.BackColor = color; } catch (FormatException ex) { #if LOG4NET _Logger.Error("setting background color failed", ex); #endif } } else { // Instead of a null colour, get the system colour "Window" _BackgroundColor = SystemColors.Window; _OutputTextView.BackColor = SystemColors.Window; } string fgStr = (string) config["Interface/Chat/ForegroundColor"]; if (!String.IsNullOrEmpty(fgStr)) { try { Color color = ColorTools.GetColor(fgStr); _ForegroundColor = color; _OutputTextView.ForeColor = color; } catch (FormatException ex) { #if LOG4NET _Logger.Error("setting foreground color failed", ex); #endif } } else { // Same for the text. _ForegroundColor = SystemColors.WindowText; _OutputTextView.ForeColor = SystemColors.WindowText; } string fontFamily = (string) config["Interface/Chat/FontFamily"]; string fontStyle = (string) config["Interface/Chat/FontStyle"]; int fontSize = 0; if (config["Interface/Chat/FontSize"] != null) { fontSize = (int) config["Interface/Chat/FontSize"]; } Font font = null; if (String.IsNullOrEmpty(fontFamily)) { // use Monospace by default float? defaultSize; try { defaultSize = Font.Size; } catch (NullReferenceException) { #if LOG4NET _Logger.Error("could not get default system font size, using internal default"); #endif // Mono bug? defaultSize = 12f; } font = new Font(FontFamily.GenericMonospace, defaultSize.Value); } else { if (fontStyle.Contains(" ")) { int pos = fontStyle.IndexOf(" "); fontStyle = fontStyle.Substring(pos + 1); } FontStyle style = (FontStyle) Enum.Parse(typeof(FontStyle), fontStyle); font = new Font(fontFamily, fontSize, style); } _Font = font; _OutputTextView.Font = font; } public virtual void AddMessage(MessageModel msg) { Trace.Call(msg); string timestamp; try { string format = (string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"]; timestamp = msg.TimeStamp.ToLocalTime().ToString(format); } catch (FormatException e) { timestamp = "Timestamp Format ERROR: " + e.Message; } timestamp += " "; _OutputTextView.SelectionHangingIndent = TextRenderer.MeasureText(timestamp, _Font).Width; _OutputTextView.AppendText(timestamp); bool hasHighlight = false; foreach (MessagePartModel msgPart in msg.MessageParts) { #if LOG4NET _Logger.Debug("AddMessage(): msgPart.GetType(): " + msgPart.GetType()); #endif if (msgPart.IsHighlight) { hasHighlight = true; } // TODO: implement all types if (msgPart is UrlMessagePartModel) { UrlMessagePartModel fmsgui = (UrlMessagePartModel) msgPart; /*TODO: Create a link in the TextView (possibly requiring WinAPI hacks...)*/ _OutputTextView.SelectionColor = Color.Blue; _OutputTextView.SelectionFont = new Font(_Font, FontStyle.Underline); _OutputTextView.AppendText(fmsgui.Url); } else if (msgPart is TextMessagePartModel) { /*TODO: Add required formatting to the TextView (possibly requiring WinAPI hacks...)*/ TextMessagePartModel fmsgti = (TextMessagePartModel) msgPart; #if LOG4NET _Logger.Debug("AddMessage(): fmsgti.Text: '" + fmsgti.Text + "'"); #endif FontStyle fstyle = FontStyle.Regular; if (fmsgti.ForegroundColor == TextColor.None) { _OutputTextView.SelectionColor = _ForegroundColor ?? Color.White; } else { #if LOG4NET _Logger.Debug("AddMessage(): fmsgti.ForegroundColor: '" + fmsgti.ForegroundColor.ToString() + "'"); #endif _OutputTextView.SelectionColor = ColorTools.GetColor(fmsgti.ForegroundColor); } if (fmsgti.BackgroundColor == TextColor.None) { _OutputTextView.SelectionBackColor = _BackgroundColor ?? Color.Black; } else { #if LOG4NET _Logger.Debug("AddMessage(): fmsgti.BackgroundColor: '" + fmsgti.BackgroundColor.ToString() + "'"); #endif _OutputTextView.SelectionBackColor = ColorTools.GetColor(fmsgti.BackgroundColor); } if (fmsgti.Underline) { #if LOG4NET _Logger.Debug("AddMessage(): fmsgti.Underline is true"); #endif fstyle |= FontStyle.Underline; } if (fmsgti.Bold) { #if LOG4NET _Logger.Debug("AddMessage(): fmsgti.Bold is true"); #endif fstyle |= FontStyle.Bold; } if (fmsgti.Italic) { #if LOG4NET _Logger.Debug("AddMessage(): fmsgti.Italic is true"); #endif fstyle |= FontStyle.Italic; } _OutputTextView.SelectionFont = new Font(Font, fstyle); _OutputTextView.AppendText(fmsgti.Text); } } _OutputTextView.AppendText("\n"); // HACK: out of scope? if (hasHighlight /*&& !Frontend.MainWindow.HasToplevelFocus*/) { /*TODO: Flash the main window*/ if (Frontend.UserConfig["Sound/BeepOnHighlight"] != null && (bool)Frontend.UserConfig["Sound/BeepOnHighlight"]) { System.Media.SystemSounds.Beep.Play(); } } // HACK: out of scope? if (((TabControl)this.Parent).SelectedTab != this) { string color = null; if (hasHighlight) { _HasHighlight = hasHighlight; color = (string) Frontend.UserConfig["Interface/Notebook/Tab/HighlightColor"]; } else if (!_HasHighlight) { color = (string) Frontend.UserConfig["Interface/Notebook/Tab/ActivityColor"]; } if (color != null) { /*TODO: Color the associated Tab*/ } } } // empty by default public virtual IList Participants { get { return new List(); } } } } smuxi-1.1/src/Frontend-SWF/Chats/PersonChatView.cs0000644000175000017500000000330112250426634022614 0ustar00meebeymeebey00000000000000/* * $Id: ChannelPage.cs 138 2006-12-23 17:11:57Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/ChannelPage.cs $ * $Rev: 138 $ * $Author: meebey $ * $Date: 2006-12-23 18:11:57 +0100 (Sat, 23 Dec 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections.Generic; using Smuxi.Engine; namespace Smuxi.Frontend.Swf { [ChatViewInfo(ChatType = ChatType.Person)] public class PersonChatView : ChatView { public PersonChatView(ChatModel chat) : base(chat) { this.Controls.Add(base.OutputTextView); } public override IList Participants { get { var ret = new List(); ret.Add(((PersonChatModel)ChatModel).Person); return ret; } } } } smuxi-1.1/src/Frontend-SWF/Chats/NetworkChatView.cs0000644000175000017500000000267111655545675023027 0ustar00meebeymeebey00000000000000/* * $Id: ChannelPage.cs 138 2006-12-23 17:11:57Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/ChannelPage.cs $ * $Rev: 138 $ * $Author: meebey $ * $Date: 2006-12-23 18:11:57 +0100 (Sat, 23 Dec 2006) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Mono.Unix; using Smuxi.Engine; namespace Smuxi.Frontend.Swf { [ChatViewInfo(ChatType = ChatType.Protocol)] public class NetworkChatView : ChatView { public NetworkChatView(ChatModel chat) : base(chat) { this.Controls.Add(base.OutputTextView); } } } smuxi-1.1/src/Frontend-SWF/Frontend.cs0000664000175000017500000002063414011467170020437 0ustar00meebeymeebey00000000000000/* * $Id: Frontend.cs 213 2007-09-10 21:25:36Z meebey $ * $URL: svn+ssh://SmuxiSVN/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/Frontend.cs $ * $Rev: 213 $ * $Author: meebey $ * $Date: 2007-09-10 16:25:36 -0500 (Mon, 10 Sep 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using System.Windows.Forms; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Swf { public class Frontend { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _Name = "smuxi"; private static readonly string _UIName = "SWF (WinForms)"; private static Version _Version; private static string _VersionString; private static Version _EngineVersion; private static MainWindow _MainWindow; private static FrontendConfig _FrontendConfig; private static Session _Session; private static UserConfig _UserConfig; private static FrontendManager _FrontendManager; public static string Name { get { return _Name; } } public static string UIName { get { return _UIName; } } public static Version Version { get { return _Version; } } public static Version EngineVersion { get { return _EngineVersion; } set { _EngineVersion = value; } } public static string VersionString { get { return _VersionString; } } public static MainWindow MainWindow { get { return _MainWindow; } } public static Session Session { get { return _Session; } set { _Session = value; } } public static FrontendManager FrontendManager { get { return _FrontendManager; } } public static Config Config { get { return _Session.Config; } } public static UserConfig UserConfig { get { return _UserConfig; } set { _UserConfig = value; } } public static FrontendConfig FrontendConfig { get { return _FrontendConfig; } } public static void Init(string[] args) { System.Threading.Thread.CurrentThread.Name = "Main"; Assembly asm = Assembly.GetAssembly(typeof(Frontend)); AssemblyName asm_name = asm.GetName(false); AssemblyProductAttribute pr = (AssemblyProductAttribute)asm. GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0]; _Version = asm_name.Version; _VersionString = pr.Product + " - " + _UIName + " frontend " + _Version; #if LOG4NET _Logger.Info(_VersionString + " starting"); #endif // We don't want to put any XP/Vista users by using the dull ugly // unthemed interface. Application.EnableVisualStyles() should be // called before any form is displayed. Application.EnableVisualStyles(); _MainWindow = new MainWindow(); // HACK: force creation of window handle, else the engine will have problems adding stuff IntPtr handle = _MainWindow.Handle; _FrontendConfig = new FrontendConfig(UIName); // loading and setting defaults _FrontendConfig.Load(); _FrontendConfig.Save(); if (_FrontendConfig.IsCleanConfig) { /*TODO: Create and show first run wizard*/ } else { if (((string)FrontendConfig["Engines/Default"]).Length == 0) { InitLocalEngine(); } else { // there is a default engine set, means we want a remote engine /*TODO: Create and show Engine Manager Dialog*/ // HACK: for now always use local engine InitLocalEngine(); } } /*TODO: Set the main message loop*/ Application.Run(_MainWindow); #if LOG4NET _Logger.Warn("Application.Run() returned!"); #endif } public static void InitLocalEngine() { Engine.Engine.Init(); _EngineVersion = Engine.Engine.Version; _Session = new Engine.Session(Engine.Engine.Config, Engine.Engine.ProtocolManagerFactory, "local"); _Session.ExecuteOnStartupCommands(); _Session.ProcessAutoConnect(); _Session.RegisterFrontendUI(_MainWindow.UI); _UserConfig = _Session.UserConfig; ConnectEngineToGUI(); } public static void ConnectEngineToGUI() { _FrontendManager = _Session.GetFrontendManager(_MainWindow.UI); _FrontendManager.Sync(); if (_UserConfig.IsCaching) { // when our UserConfig is cached, we need to invalidate the cache _FrontendManager.ConfigChangedDelegate = new SimpleDelegate(_UserConfig.ClearCache); } _MainWindow.Show(); _MainWindow.ApplyConfig(_UserConfig); // make sure entry got attention :-P _MainWindow.Entry.Select(); } public static void DisconnectEngineFromGUI() { Trace.Call(); _FrontendManager.IsFrontendDisconnecting = true; _Session.DeregisterFrontendUI(_MainWindow.UI); _MainWindow.Hide(); _MainWindow.Notebook.RemoveAllPages(); _FrontendManager = null; _Session = null; } public static void Quit() { _MainWindow.Close(); Application.Exit(); if (_FrontendManager != null) { _FrontendManager.IsFrontendDisconnecting = true; } /* BUG: don't do this, the access to config is lost and the entry will throw an exception then. if (_FrontendManager != null) { DisconnectEngineFromGUI(); } */ } public static void ShowException(Form parent, Exception ex) { /* TODO CrashDialog cd = new CrashDialog(parent, ex); cd.Run(); cd.Destroy(); */ } public static void ShowException(Exception ex) { ShowException(null, ex); } /* private static void _OnUnhandledException(GLib.UnhandledExceptionArgs e) { Trace.Call(e); lock (_UnhandledExceptionSyncRoot) { if (e.ExceptionObject is Exception) { ShowException((Exception) e.ExceptionObject); Quit(); } } } */ } } smuxi-1.1/src/Frontend-GNOME-XMPP/0000775000175000017500000000000014011526502017307 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME-XMPP/XmppPersonChatView.cs0000644000175000017500000002366212726351313023422 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Oliver Schneider // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; using System.Threading; using System.Collections.Generic; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Person, ProtocolManagerType = typeof(XmppProtocolManager))] public class XmppPersonChatView : PersonChatView { private static readonly string _LibraryTextDomain = "smuxi-frontend-gnome-xmpp"; private XmppProtocolManager XmppProtocolManager { get; set; } // for finding the position of the dots and removing them Gtk.TextMark ChatStateStartPosition { get; set; } bool ChatStatePositionValid { get; set; } // for drawing the dots int NumberOfTypingDots { get; set; } bool IsDisposed { get; set; } bool IsComposing { get; set; } bool ChatStateTimeoutRunning { get; set; } MessageModel TypingDots { get; set; } // for remembering the presence state MessageModel LastPresenceMessage { get; set; } public XmppPersonChatView(PersonChatModel personChat) : base(personChat) { Trace.Call(personChat); OutputMessageTextView.PopulatePopup += _OnOutputMessageTextViewPopulatePopup; ChatStateStartPosition = new Gtk.TextMark("ChatStateStartPosition", true); IsDisposed = false; } void DeleteOldChatState() { if (!ChatStatePositionValid) { return; } var buffer = OutputMessageTextView.Buffer; var start = buffer.GetIterAtMark(ChatStateStartPosition); var end = buffer.EndIter; buffer.Delete(ref start, ref end); buffer.DeleteMark(ChatStateStartPosition); if (buffer.EndIter.Offset < OutputMessageTextView.MarkerlineBufferPosition) { // in the rare case that the markeline is below the dots, move it to the correct position OutputMessageTextView.UpdateMarkerline(); } ChatStatePositionValid = false; } void UpdateChatState() { DeleteOldChatState(); if (LastPresenceMessage == null && TypingDots == null) { // nothing to display return; } var buffer = OutputMessageTextView.Buffer; buffer.AddMark(ChatStateStartPosition, buffer.EndIter); if (TypingDots != null) { OutputMessageTextView.AddMessage(TypingDots, true, false); } if (LastPresenceMessage != null) { OutputMessageTextView.AddMessage(LastPresenceMessage, false); } ChatStatePositionValid = true; } void SetPresenceStateText(MessageModel msg) { LastPresenceMessage = msg; UpdateChatState(); } void ClearPresenceStateText() { if (LastPresenceMessage == null) { // nothing to do, probably received duplicate available messages return; } LastPresenceMessage = null; UpdateChatState(); } bool TypingDotsCallback() { if (IsDisposed) { return false; } if (IsComposing) { NumberOfTypingDots++; if (NumberOfTypingDots == 4) { NumberOfTypingDots = 0; } } else { NumberOfTypingDots--; if (NumberOfTypingDots <= 0) { // done TypingDots = null; UpdateChatState(); ChatStateTimeoutRunning = false; return false; } } var builder = new MessageBuilder(); builder.AppendText(new string('.', NumberOfTypingDots)); TypingDots = builder.ToMessage(); UpdateChatState(); GLib.Timeout.Add(300, TypingDotsCallback); return false; } void StartMovingDots() { IsComposing = true; if (!ChatStateTimeoutRunning) { ChatStateTimeoutRunning = true; NumberOfTypingDots = 0; TypingDotsCallback(); } } void StopMovingDots() { if (!ChatStateTimeoutRunning) { // already done return; } IsComposing = false; } void AbortMovingDots() { TypingDots = null; UpdateChatState(); if (!ChatStateTimeoutRunning) { // already done return; } // will be removed on next call to UpdateChatState() NumberOfTypingDots = 0; IsComposing = false; } public override void AddMessage(MessageModel msg) { Trace.Call(msg); switch (msg.MessageType) { case MessageType.ChatStateComposing: StartMovingDots(); break; case MessageType.ChatStatePaused: StopMovingDots(); break; case MessageType.ChatStateReset: AbortMovingDots(); break; case MessageType.PresenceStateOnline: ClearPresenceStateText(); break; case MessageType.PresenceStateOffline: case MessageType.PresenceStateAway: SetPresenceStateText(msg); break; default: AbortMovingDots(); DeleteOldChatState(); base.AddMessage(msg); UpdateChatState(); break; } } private void _OnOutputMessageTextViewPopulatePopup (object o, Gtk.PopulatePopupArgs args) { if (OutputMessageTextView.IsAtUrlTag) { return; } Gtk.Menu popup = args.Menu; // minimum version of any command below if (Frontend.EngineProtocolVersion < new Version(0, 8, 11)) { return; } popup.Append(new Gtk.SeparatorMenuItem()); if (Frontend.EngineProtocolVersion >= new Version(0, 8, 12)) { Gtk.ImageMenuItem whois_item = new Gtk.ImageMenuItem(_("Whois")); whois_item.Activated += _OnMenuWhoisItemActivated; popup.Append(whois_item); } if (Frontend.EngineProtocolVersion >= new Version(0, 8, 11)) { Gtk.ImageMenuItem AddToContacts_item = new Gtk.ImageMenuItem(_("Add To Contacts")); AddToContacts_item.Activated += _OnMenuAddToContactsItemActivated; popup.Append(AddToContacts_item); } if (Frontend.EngineProtocolVersion >= new Version(0, 8, 12)) { Gtk.ImageMenuItem invite_to_item = new Gtk.ImageMenuItem(_("Invite to")); Gtk.Menu invite_to_menu_item = new InviteToMenu(XmppProtocolManager, Frontend.MainWindow.ChatViewManager, PersonModel); invite_to_item.Submenu = invite_to_menu_item; popup.Append(invite_to_item); } popup.ShowAll(); } void _OnMenuWhoisItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandWhoIs( new CommandModel( Frontend.FrontendManager, ChatModel, PersonModel.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } void _OnMenuAddToContactsItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandContact( new CommandModel( Frontend.FrontendManager, ChatModel, "add " + PersonModel.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } public override void Dispose() { Trace.Call(); IsDisposed = true; base.Dispose(); } public override void Sync() { Trace.Call(); base.Sync(); XmppProtocolManager = (XmppProtocolManager) ProtocolManager; } } } smuxi-1.1/src/Frontend-GNOME-XMPP/XmppGroupChatView.cs0000644000175000017500000002523212726351313023243 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Oliver Schneider // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; using System.Threading; using System.Collections.Generic; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Group, ProtocolManagerType = typeof(XmppProtocolManager))] public class XmppGroupChatView : GroupChatView { private static readonly string _LibraryTextDomain = "smuxi-frontend-gnome-xmpp"; private XmppProtocolManager XmppProtocolManager { get; set; } public bool IsContactList { get { return ID == "Contacts"; } } public XmppGroupChatView(GroupChatModel chat) : base(chat) { Trace.Call(chat); } protected override void OnMessageTextViewMessageAdded(object sender, MessageTextViewMessageAddedEventArgs e) { if (!IsActive) { switch (e.Message.MessageType) { case MessageType.PresenceStateOffline: case MessageType.PresenceStateAway: case MessageType.PresenceStateOnline: HasEvent = true; break; } } base.OnMessageTextViewMessageAdded(sender, e); } void OnPersonRenameEditingStarted(object o, Gtk.EditingStartedArgs e) { Trace.Call(o, e); // only allow editing once from the context menu IdentityNameCellRenderer.Editable = false; Gtk.TreeIter iter; if (!PersonTreeView.Model.GetIterFromString(out iter, e.Path)) { return; } var person = (PersonModel) PersonTreeView.Model.GetValue(iter, 0); var entry = (Gtk.Entry) e.Editable; entry.Text = person.IdentityName; } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } public override void Sync() { Trace.Call(); base.Sync(); XmppProtocolManager = (XmppProtocolManager) ProtocolManager; } void _OnUserListMenuWhoisActivated(object sender, EventArgs e) { Trace.Call(sender, e); IList persons = GetSelectedPersons(); if (persons == null) { return; } foreach (PersonModel person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandWhoIs( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuRemoveActivated(object sender, EventArgs e) { Trace.Call(sender, e); IList persons = GetSelectedPersons(); if (persons == null) { return; } foreach (PersonModel person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandContact( new CommandModel( Frontend.FrontendManager, ChatModel, "remove " + per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void _OnUserListMenuQueryActivated (object sender, EventArgs e) { Trace.Call(sender, e); IList persons = GetSelectedPersons(); if (persons == null) { return; } foreach (PersonModel person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandMessageQuery( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void _OnMenuAddToContactsItemActivated(object sender, EventArgs e) { Trace.Call(sender, e); IList persons = GetSelectedPersons(); if (persons == null) { return; } foreach (PersonModel person in persons) { var per = person; // is this a groupchat contact whose real id is unknown if (person.ID.StartsWith(ID)) { continue; } ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandContact( new CommandModel( Frontend.FrontendManager, ChatModel, "add " + per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnPersonRenameEdited(object o, Gtk.EditedArgs e) { Trace.Call(o, e); Gtk.TreeIter iter; if (!PersonTreeView.Model.GetIterFromString(out iter, e.Path)) { return; } PersonModel person = (PersonModel) PersonTreeView.Model.GetValue(iter, 0); ThreadPool.QueueUserWorkItem(delegate { try { XmppProtocolManager.CommandContact( new CommandModel( Frontend.FrontendManager, ChatModel, "rename " + person.ID + " " + e.NewText ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } protected override void OnPersonMenuShown(object sender, EventArgs e) { Trace.Call(sender, e); foreach (var child in PersonMenu.Children) { PersonMenu.Remove(child); } base.OnPersonMenuShown(sender, e); // minimum version of any command below if (Frontend.EngineProtocolVersion < new Version(0, 8, 9)) { return; } if (Frontend.EngineProtocolVersion >= new Version(0, 8, 9)) { Gtk.ImageMenuItem query_item = new Gtk.ImageMenuItem(_("Query")); query_item.Activated += _OnUserListMenuQueryActivated; PersonMenu.Append(query_item); } PersonMenu.Append(new Gtk.SeparatorMenuItem()); if (Frontend.EngineProtocolVersion >= new Version(0, 8, 12)) { Gtk.ImageMenuItem whois_item = new Gtk.ImageMenuItem(_("Whois")); whois_item.Activated += _OnUserListMenuWhoisActivated; PersonMenu.Append(whois_item); } if (!IsContactList && Frontend.EngineProtocolVersion >= new Version(0, 8, 11)) { var add_to_contacts_item = new Gtk.ImageMenuItem(_("Add To Contacts")); add_to_contacts_item.Activated += _OnMenuAddToContactsItemActivated; PersonMenu.Append(add_to_contacts_item); } if (Frontend.EngineProtocolVersion >= new Version(0, 8, 12)) { Gtk.MenuItem invite_to_item = new Gtk.MenuItem(_("Invite to")); Gtk.Menu invite_to_menu_item = new InviteToMenu( XmppProtocolManager, Frontend.MainWindow.ChatViewManager, GetSelectedPersons() ); invite_to_item.Submenu = invite_to_menu_item; PersonMenu.Append(invite_to_item); } if (IsContactList && Frontend.EngineProtocolVersion >= new Version(0, 8, 11)) { // cleanup old handlers IdentityNameCellRenderer.EditingStarted -= OnPersonRenameEditingStarted; IdentityNameCellRenderer.Edited -= OnPersonRenameEdited; IdentityNameCellRenderer.EditingStarted += OnPersonRenameEditingStarted; IdentityNameCellRenderer.Edited += OnPersonRenameEdited; var rename_item = new Gtk.ImageMenuItem(_("Rename")); rename_item.Activated += (o, args) => { var paths = PersonTreeView.Selection.GetSelectedRows(); if (paths == null || paths.Length == 0) { return; } var path = paths[0]; IdentityNameCellRenderer.Editable = true; PersonTreeView.SetCursor(path, IdentityNameColumn, true); }; PersonMenu.Append(rename_item); Gtk.ImageMenuItem remove_item = new Gtk.ImageMenuItem(_("Remove")); remove_item.Activated += OnUserListMenuRemoveActivated; PersonMenu.Append(remove_item); } PersonMenu.ShowAll(); } } } smuxi-1.1/src/Frontend-GNOME-XMPP/AssemblyInfo.cs0000644000175000017500000000271412253423337022243 0ustar00meebeymeebey00000000000000/* * $Id: AssemblyInfo.cs 167 2007-04-17 21:17:37Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-GNOME/AssemblyInfo.cs $ * $Rev: 167 $ * $Author: meebey $ * $Date: 2007-04-17 23:17:37 +0200 (Tue, 17 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - XMPP support for GNOME frontend")] [assembly: AssemblyCopyright("2010 (C) Mirco Bauer , " + "2013 (C) Oliver Schneider ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/src/Frontend-GNOME-XMPP/InviteToMenu.cs0000664000175000017500000001077613622524345022251 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Common; using Smuxi.Engine; using System.Threading; namespace Smuxi.Frontend.Gnome { public class InviteToMenu : Gtk.Menu { XmppProtocolManager ProtocolManager { get; set; } ChatViewManager ChatViewManager { get; set; } IList Invitees { get; set; } bool IsPopulated { get; set; } public InviteToMenu(XmppProtocolManager protocolManager, ChatViewManager chatViewManager, PersonModel invitee) : this(protocolManager, chatViewManager, new [] { invitee }) { } public InviteToMenu(XmppProtocolManager protocolManager, ChatViewManager chatViewManager, IList invitees) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } if (invitees == null) { throw new ArgumentNullException("invitees"); } ProtocolManager = protocolManager; ChatViewManager = chatViewManager; Invitees = invitees; } protected override void OnShown() { Trace.Call(); if (!IsPopulated) { IsPopulated = true; foreach (var chatView in ChatViewManager.Chats) { if (!(chatView is XmppGroupChatView)) { // only invite to group chats continue; } if (chatView == ChatViewManager.ActiveChat) { // don't need to add current chat to invite list continue; } if (chatView.ProtocolManager != ProtocolManager) { // only add chats from current server continue; } var groupChatView = (XmppGroupChatView) chatView; if (groupChatView.IsContactList) { // ignore our abused groupchatview continue; } var item = new Gtk.ImageMenuItem(chatView.Name); item.Image = new Gtk.Image(GroupChatView.IconPixbuf); var chatid = chatView.ID; item.Activated += delegate { var inviteFromChatModel = ChatViewManager.ActiveChat.ChatModel; ThreadPool.QueueUserWorkItem(delegate { try { for (int i = 0; i < Invitees.Count; i++) { ProtocolManager.CommandInvite( new CommandModel( Frontend.FrontendManager, inviteFromChatModel, chatid + " " + Invitees[i].ID ) ); } } catch (Exception ex) { Frontend.ShowException(ex); } }); }; item.Show(); Append(item); } } base.OnShown(); } } } smuxi-1.1/src/Frontend-GNOME-XMPP/Makefile.am0000664000175000017500000001107413411450522021347 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-frontend-gnome-xmpp.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/release/smuxi-frontend.dll \ ../../bin/release/smuxi-frontend-gnome.exe \ ../../bin/release/smuxi-engine.dll \ ../../bin/release/smuxi-common.dll \ ../../bin/release/smuxi-engine-xmpp.dll BUILD_DIR = ../../bin/release SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll SMUXI_ENGINE_XMPP_DLL_MDB= SMUXI_ENGINE_XMPP_DLL_SOURCE=../../bin/release/smuxi-engine-xmpp.dll SMUXI_FRONTEND_GNOME_EXE_MDB= SMUXI_FRONTEND_DLL_SOURCE=../../bin/release/smuxi-frontend.dll SMUXI_ENGINE_DLL_MDB= SMUXI_FRONTEND_DLL_MDB= NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_FRONTEND_GNOME_EXE_SOURCE=../../bin/release/smuxi-frontend-gnome.exe LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-frontend-gnome-xmpp.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/debug/smuxi-frontend.dll \ ../../bin/debug/smuxi-frontend-gnome.exe \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-engine-xmpp.dll BUILD_DIR = ../../bin/debug SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll SMUXI_ENGINE_XMPP_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine-xmpp.dll.mdb SMUXI_ENGINE_XMPP_DLL_MDB=$(BUILD_DIR)/smuxi-engine-xmpp.dll.mdb SMUXI_ENGINE_XMPP_DLL_SOURCE=../../bin/debug/smuxi-engine-xmpp.dll SMUXI_FRONTEND_GNOME_EXE_MDB_SOURCE=../../bin/debug/smuxi-frontend-gnome.exe.mdb SMUXI_FRONTEND_GNOME_EXE_MDB=$(BUILD_DIR)/smuxi-frontend-gnome.exe.mdb SMUXI_FRONTEND_DLL_SOURCE=../../bin/debug/smuxi-frontend.dll SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb SMUXI_FRONTEND_DLL_MDB_SOURCE=../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB=$(BUILD_DIR)/smuxi-frontend.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_FRONTEND_GNOME_EXE_SOURCE=../../bin/debug/smuxi-frontend-gnome.exe LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_COMMON_DLL) \ $(SMUXI_ENGINE_XMPP_DLL_MDB) \ $(SMUXI_ENGINE_XMPP_DLL) \ $(SMUXI_FRONTEND_GNOME_EXE_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_GNOME_EXE) \ $(SMUXI_ENGINE_DLL) LINUX_PKGCONFIG = \ $(FRONTEND_GNOME_XMPP_PC) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ InviteToMenu.cs \ XmppGroupChatView.cs \ XmppPersonChatView.cs DATA_FILES = RESOURCES = EXTRAS = REFERENCES = \ Mono.Posix \ $(GTK_SHARP_20_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) include $(top_srcdir)/Makefile.include SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll SMUXI_ENGINE_XMPP_DLL = $(BUILD_DIR)/smuxi-engine-xmpp.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_FRONTEND_GNOME_EXE = $(BUILD_DIR)/smuxi-frontend-gnome.exe LOG4NET_DLL = $(BUILD_DIR)/log4net.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_XMPP_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_XMPP_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_LIBS) smuxi-1.1/src/Frontend-GNOME-XMPP/Makefile.in0000664000175000017500000010554314011526471021371 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-GNOME-XMPP ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d 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)$(bindir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-frontend-gnome-xmpp.dll @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-frontend-gnome-xmpp.dll @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = library @ENABLE_RELEASE_TRUE@COMPILE_TARGET = library @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend-gnome.exe \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine-xmpp.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend-gnome.exe \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine-xmpp.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_XMPP_DLL_MDB = $(BUILD_DIR)/smuxi-engine-xmpp.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_XMPP_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_XMPP_DLL_SOURCE = ../../bin/debug/smuxi-engine-xmpp.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_XMPP_DLL_SOURCE = ../../bin/release/smuxi-engine-xmpp.dll @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_GNOME_EXE_MDB = $(BUILD_DIR)/smuxi-frontend-gnome.exe.mdb @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_GNOME_EXE_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_SOURCE = ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB = $(BUILD_DIR)/smuxi-frontend.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_DLL_MDB = @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_GNOME_EXE_SOURCE = ../../bin/debug/smuxi-frontend-gnome.exe @ENABLE_RELEASE_TRUE@SMUXI_FRONTEND_GNOME_EXE_SOURCE = ../../bin/release/smuxi-frontend-gnome.exe @ENABLE_DEBUG_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_RELEASE_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_XMPP_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine-xmpp.dll.mdb @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_GNOME_EXE_MDB_SOURCE = ../../bin/debug/smuxi-frontend-gnome.exe.mdb @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @ENABLE_DEBUG_TRUE@SMUXI_FRONTEND_DLL_MDB_SOURCE = ../../bin/debug/smuxi-frontend.dll.mdb AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_COMMON_DLL) \ $(SMUXI_ENGINE_XMPP_DLL_MDB) \ $(SMUXI_ENGINE_XMPP_DLL) \ $(SMUXI_FRONTEND_GNOME_EXE_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_GNOME_EXE) \ $(SMUXI_ENGINE_DLL) LINUX_PKGCONFIG = \ $(FRONTEND_GNOME_XMPP_PC) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ InviteToMenu.cs \ XmppGroupChatView.cs \ XmppPersonChatView.cs DATA_FILES = RESOURCES = EXTRAS = REFERENCES = \ Mono.Posix \ $(GTK_SHARP_20_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll SMUXI_ENGINE_XMPP_DLL = $(BUILD_DIR)/smuxi-engine-xmpp.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_FRONTEND_GNOME_EXE = $(BUILD_DIR)/smuxi-frontend-gnome.exe LOG4NET_DLL = $(BUILD_DIR)/log4net.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-GNOME-XMPP/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-GNOME-XMPP/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_XMPP_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_XMPP_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_GNOME_EXE)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) $(LOG4NET_LIBS) # 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: smuxi-1.1/src/Engine-XMPP/0000775000175000017500000000000014011526501016071 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-XMPP/Protocols/0000775000175000017500000000000014011526501020055 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-XMPP/Protocols/Xmpp/0000775000175000017500000000000014011526501021001 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-XMPP/Protocols/Xmpp/XmppGroupChatModel.cs0000644000175000017500000000254012726351313025061 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 tuukka // // Full GPL License: // // 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 using System; namespace Smuxi.Engine { public class XmppGroupChatModel : GroupChatModel { internal DateTime LatestSeenStamp { get; set; } internal bool SeenNewMessages { get; set; } internal string OwnNickname { get; set; } internal string Password { get; set; } internal bool IsJoining { get; set; } public XmppGroupChatModel(string id, string name, IProtocolManager networkManager) : base(id, name, networkManager) { } } } smuxi-1.1/src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs0000664000175000017500000033312214011467170025303 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2016 Mirco Bauer * Copyright (c) 2011 Tuukka Hastrup * Copyright (c) 2013-2014 Oliver Schneider * * Full GPL License: * * 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 */ using System; using System.IO; using System.Net.Security; using System.Xml; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Globalization; using agsXMPP; using agsXMPP.protocol; using agsXMPP.protocol.client; using agsXMPP.protocol.x.muc; using agsXMPP.protocol.iq; using agsXMPP.protocol.iq.roster; using agsXMPP.protocol.iq.disco; using agsXMPP.protocol.extensions.caps; using agsXMPP.protocol.extensions.chatstates; using XmppMessageType = agsXMPP.protocol.client.MessageType; using agsXMPP.Factory; using agsXMPP.Net; using Starksoft.Net.Proxy; using Smuxi.Common; using System.Runtime.CompilerServices; using agsXMPP.protocol.extensions.nickname; namespace Smuxi.Engine { [ProtocolManagerInfo(Name = "XMPP", Description = "Extensible Messaging and Presence Protocol", Alias = "xmpp")] public class XmppProtocolManager : ProtocolManagerBase { #if LOG4NET static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif static readonly string LibraryTextDomain = "smuxi-engine-xmpp"; XmppClientConnection JabberClient { get; set; } MucManager MucManager { get; set; } DiscoManager Disco { get; set; } string[] Nicknames { get; set; } Dictionary Contacts { get; set; } Dictionary DiscoCache { get; set; } ChatModel NetworkChat { get; set; } GroupChatModel ContactChat { get; set; } XmppServerModel Server { get; set; } bool AutoReconnect { get; set; } TimeSpan AutoReconnectDelay { get; set; } bool IsDisposed { get; set; } bool ShowChatStates { get; set; } // pidgin's psychic mode bool OpenNewChatOnChatState { get; set; } public override string NetworkID { get { return Host; } } public override string Protocol { get { return "XMPP"; } } public override ChatModel Chat { get { return NetworkChat; } } public override bool IsConnected { get { return JabberClient.Authenticated; } } public XmppProtocolManager(Session session) : base(session) { Trace.Call(session); Contacts = new Dictionary(); DiscoCache = new Dictionary(); ShowChatStates = true; OpenNewChatOnChatState = true; JabberClient = new XmppClientConnection(); JabberClient.AutoRoster = true; JabberClient.AutoPresence = true; JabberClient.OnMessage += OnMessage; JabberClient.OnClose += OnClose; JabberClient.OnLogin += OnLogin; JabberClient.OnError += OnError; JabberClient.OnStreamError += OnStreamError; JabberClient.OnPresence += OnPresence; JabberClient.OnRosterItem += OnRosterItem; JabberClient.OnReadXml += OnReadXml; JabberClient.OnWriteXml += OnWriteXml; JabberClient.OnAuthError += OnAuthError; JabberClient.SendingServiceUnavailable += OnSendingServiceUnavailable; JabberClient.AutoAgents = false; // outdated feature JabberClient.EnableCapabilities = true; JabberClient.Capabilities.Node = "https://smuxi.im"; JabberClient.ClientVersion = Engine.VersionString; // identify smuxi var ident = JabberClient.DiscoInfo.AddIdentity(); ident.Category = "client"; ident.Type = "pc"; ident.Name = Engine.VersionString; // add features here (this is just for notification of other clients) JabberClient.DiscoInfo.AddFeature().Var = "http://jabber.org/protocol/caps"; JabberClient.DiscoInfo.AddFeature().Var = "jabber:iq:last"; JabberClient.DiscoInfo.AddFeature().Var = "http://jabber.org/protocol/muc"; JabberClient.DiscoInfo.AddFeature().Var = "http://jabber.org/protocol/disco#info"; JabberClient.DiscoInfo.AddFeature().Var = "http://jabber.org/protocol/xhtml-im"; Disco = new DiscoManager(JabberClient); Disco.AutoAnswerDiscoInfoRequests = true; MucManager = new MucManager(JabberClient); } [MethodImpl(MethodImplOptions.Synchronized)] void OnSendingServiceUnavailable(object sender, SendingServiceUnavailableEventArgs e) { if (e.Stanza.To == null) { // can only be received by the server return; } if (e.Stanza.To == JabberClient.MyJID.Server) { // explicitly targeting the server return; } XmppPersonModel person; if (!Contacts.TryGetValue(e.Stanza.To.Bare, out person)) { e.Cancel = true; return; } if (person.Subscription != SubscriptionType.both && person.Subscription != SubscriptionType.from) { e.Cancel = true; return; } // the person already knows we are online, this does not give away our privacy } [MethodImpl(MethodImplOptions.Synchronized)] void OnStreamError(object sender, agsXMPP.Xml.Dom.Element e) { Trace.Call(sender, e); var error = e as agsXMPP.protocol.Error; var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); // TODO: create user readable error messages from the error.Condition //builder.AppendErrorText(error.Condition.ToString()); switch (error.Condition) { case StreamErrorCondition.SystemShutdown: builder.AppendErrorText(_("The server has shut down")); break; case StreamErrorCondition.Conflict: builder.AppendErrorText(_("Another client logged in with the same resource, you have been disconnected")); break; case StreamErrorCondition.SeeOtherHost: Server.Hostname = e.GetTag("see-other-host"); Reconnect(null); break; default: builder.AppendErrorText(error.Text ?? error.Condition.ToString()); break; } Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] void OnAuthError(object sender, agsXMPP.Xml.Dom.Element e) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(_("Authentication failed, either username does not exist or invalid password")); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendMessage(_("If you want to create an account with the specified user and password, type /register now")); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] public override void Connect(FrontendManager fm, ServerModel server) { Trace.Call(fm, server); if (server == null) { throw new ArgumentNullException("server"); } if (server is XmppServerModel) { Server = (XmppServerModel) server; } else { Server = new XmppServerModel(); if (server.ServerID != null) { Server.Load(Session.UserConfig, Protocol, server.ServerID); } // HACK: previous line overwrites any passed values with the values from config // thus we have to copy the original values: Server.Hostname = server.Hostname; Server.Network = server.Network; Server.OnConnectCommands = server.OnConnectCommands; Server.OnStartupConnect = server.OnStartupConnect; Server.Password = server.Password; Server.Port = server.Port; Server.Protocol = server.Protocol; Server.ServerID = server.ServerID; Server.UseEncryption = server.UseEncryption; Server.Username = server.Username; Server.ValidateServerCertificate = server.ValidateServerCertificate; } Host = Server.Hostname; Port = Server.Port; // TODO: use config for single network chat or once per network manager NetworkChat = Session.CreateChat( NetworkID, String.Format("{0} {1}", Protocol, Host), this ); Session.AddChat(NetworkChat); Session.SyncChat(NetworkChat); Connect(); } [MethodImpl(MethodImplOptions.Synchronized)] void Connect() { Trace.Call(); Contacts.Clear(); AutoReconnect = true; AutoReconnectDelay = TimeSpan.FromMinutes(1); ApplyConfig(Session.UserConfig, Server); OpenContactChat(); #if LOG4NET _Logger.Debug("calling JabberClient.Open()"); #endif JabberClient.Open(); } [MethodImpl(MethodImplOptions.Synchronized)] public override void Reconnect(FrontendManager fm) { Trace.Call(fm); // IsConnected checks for a working xmpp connection // we need to know the socket's state here if (JabberClient.XmppConnectionState != XmppConnectionState.Disconnected) { AutoReconnect = true; AutoReconnectDelay = TimeSpan.Zero; JabberClient.Close(); } else { JabberClient.ClientSocket.OnValidateCertificate -= ValidateCertificate; JabberClient.SocketConnectionType = SocketConnectionType.Direct; Reconnect(); } } [MethodImpl(MethodImplOptions.Synchronized)] public override void Disconnect(FrontendManager fm) { Trace.Call(fm); AutoReconnect = false; JabberClient.Close(); } public override void Dispose() { Trace.Call(); IsDisposed = true; base.Dispose(); AutoReconnect = false; JabberClient.SocketDisconnect(); } // this method is used as status / title public override string ToString() { var status = String.Format("{0} ({1})", JabberClient.Server, Protocol); if (!IsConnected) { status += " (" + _("not connected") + ")"; } return status; } DiscoItems ServerDiscoItems { get; set; } List CachedMucJids { get; set; } Dictionary CachedMucInfo { get; set; } DateTime CachedMucJidsTimeStamp { get; set; } // no need to synchronize this method as it only checks for null public override IList FindGroupChats(GroupChatModel filter) { Trace.Call(filter); var list = new List(); if (ContactChat == null) { list.Add(new GroupChatModel("Contacts", "Contacts", this)); } // find all transport/conference groups/whatnot DiscoItem[] discoItems; if (ServerDiscoItems == null) { var reset = new AutoResetEvent(false); lock (this) { Disco.DiscoverItems(JabberClient.Server, (sender, e) => FindGroupChatsDiscoItems(e, reset)); } reset.WaitOne(); } lock (this) { if (ServerDiscoItems == null) { return list; } else { discoItems = ServerDiscoItems.GetDiscoItems(); } } var resetList = new List(); if ((CachedMucJids == null) || ((DateTime.Now - CachedMucJidsTimeStamp) > TimeSpan.FromMinutes(5))) { // find all conference groups var mucList = new List(); foreach (var discoItem in discoItems) { var reset = new AutoResetEvent(false); var jid = discoItem.Jid; lock (this) { Disco.DiscoverInformation(discoItem.Jid, (sender, e) => FindGroupChatsItemDiscoInfo(e, reset, mucList, jid)); } resetList.Add(reset); } foreach (var reset in resetList) { reset.WaitOne(); } resetList.Clear(); // find all chats in all conference groups var jidList = new List(); foreach (var mucGroup in mucList) { var reset = new AutoResetEvent(false); lock (this) { Disco.DiscoverItems(mucGroup, (sender, e) => FindGroupChatsDiscoMucs(e, reset, jidList)); } resetList.Add(reset); } foreach (var reset in resetList) { reset.WaitOne(); } CachedMucJids = jidList; CachedMucJidsTimeStamp = DateTime.Now; CachedMucInfo = new Dictionary(); } // filter found items var filteredList = new List(); if (filter == null || String.IsNullOrEmpty(filter.Name)) { filteredList = CachedMucJids; } else { string searchPattern = null; if (!filter.Name.StartsWith("*") && !filter.Name.EndsWith("*")) { searchPattern = String.Format("*{0}*", filter.Name); } else { searchPattern = filter.Name; } foreach (var jid in CachedMucJids) { if (!Pattern.IsMatch(jid, searchPattern)) { continue; } filteredList.Add(jid); } } // get info on all chats matching the pattern resetList.Clear(); foreach (var jid in CachedMucJids) { bool isCached = false; DiscoInfo info; lock (this) { isCached = CachedMucInfo.TryGetValue(jid, out info); } if (isCached) { FindGroupChatsChatInfoParse(jid, info, list); continue; } var reset = new AutoResetEvent(false); lock (this) { Disco.DiscoverInformation(jid, (sender, e) => FindGroupChatsChatInfo(e, reset, list)); } resetList.Add(reset); } foreach (var reset in resetList) { reset.WaitOne(); } return list; } void FindGroupChatsChatInfoParse(Jid jid, DiscoInfo items, List list) { var ident = items.SelectSingleElement(); string name; if (ident != null && !String.IsNullOrEmpty(ident.Name)) { name = ident.Name + " [" + jid + "]"; } else { name = jid; } var chat = new GroupChatModel(jid, name, null); chat.PersonCount = -1; var x = items.SelectSingleElement(); if (x != null) { var users_field = x.GetField("muc#roominfo_occupants"); var topic_field = x.GetField("muc#roominfo_subject"); var desc_field = x.GetField("muc#roominfo_description"); if (users_field != null) { chat.PersonCount = int.Parse(users_field.GetValue()); } if (topic_field != null) { chat.Topic = new MessageModel(topic_field.GetValue()); } else if (desc_field != null) { chat.Topic = new MessageModel(desc_field.GetValue()); } } lock (list) { list.Add(chat); } } void FindGroupChatsChatInfo(IQEventArgs e, AutoResetEvent reset, List list) { if (e.IQ.Error == null) { var items = (DiscoInfo)e.IQ.Query; lock (this) { CachedMucInfo[e.IQ.From] = items; } FindGroupChatsChatInfoParse(e.IQ.From, items, list); } e.Handled = true; reset.Set(); } void FindGroupChatsDiscoMucs(IQEventArgs e, AutoResetEvent reset, List list) { if (e.IQ.Error == null) { var items = (DiscoItems)e.IQ.Query; foreach (var item in items.GetDiscoItems()) { // no locking required, these callbacks are sequential list.Add(item.Jid); } } e.Handled = true; reset.Set(); } void FindGroupChatsItemDiscoInfo(IQEventArgs e, AutoResetEvent reset, List mucList, Jid jid) { if (e.IQ.Error == null) { var discoInfo = (DiscoInfo)e.IQ.Query; if (discoInfo.HasFeature(agsXMPP.Uri.MUC)) { // no locking required, these callbacks are sequential mucList.Add(jid); } } e.Handled = true; reset.Set(); } void FindGroupChatsDiscoItems(IQEventArgs e, AutoResetEvent reset) { if (e.IQ.Error == null) { lock (this) { ServerDiscoItems = (DiscoItems)e.IQ.Query; } } e.Handled = true; reset.Set(); } [MethodImpl(MethodImplOptions.Synchronized)] public void OpenContactChat() { if (ContactChat == null) { ContactChat = Session.CreateChat( "Contacts", "Contacts", this ); Session.AddChat(ContactChat); } else if (!ContactChat.IsEnabled) { Session.EnableChat(ContactChat); } else { // already open return; } foreach (var pair in Contacts) { if (pair.Value.Resources.Count != 0) { ContactChat.UnsafePersons.Add(pair.Key, pair.Value.ToPersonModel()); } } // HACK: lower probability of sync race condition during connect ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(5000); lock (this) { if (IsDisposed) { return; } if (ContactChat != null) { Session.SyncChat(ContactChat); } } }); } // no need to synchronize as no members are accessed public override void OpenChat(FrontendManager fm, ChatModel chat) { Trace.Call(fm, chat); if (chat.ID == "Contacts") { OpenContactChat(); return; } CommandModel cmd = new CommandModel(fm, NetworkChat, chat.ID); switch (chat.ChatType) { case ChatType.Person: CommandMessageQuery(cmd); break; case ChatType.Group: CommandJoin(cmd); break; } } [MethodImpl(MethodImplOptions.Synchronized)] public override void CloseChat(FrontendManager fm, ChatModel chat) { Trace.Call(fm, chat); if (chat == ContactChat) { Session.RemoveChat(chat); ContactChat = null; } else if (chat.ChatType == ChatType.Group) { if (IsConnected) { var groupchat = (XmppGroupChatModel)chat; if (!groupchat.IsSynced) { Session.RemoveChat(chat); } else { MucManager.LeaveRoom(chat.ID, ((XmppGroupChatModel)chat).OwnNickname); } } else { Session.RemoveChat(chat); } } else if (chat.ChatType == ChatType.Person) { Session.RemoveChat(chat); } else { #if LOG4NET _Logger.Error("CloseChat(): Invalid chat type"); #endif } } [MethodImpl(MethodImplOptions.Synchronized)] public override void SetPresenceStatus(PresenceStatus status, string message) { Trace.Call(status, message); if (!IsConnected) { return; } switch (status) { case PresenceStatus.Online: JabberClient.Show = ShowType.NONE; JabberClient.Priority = Server.Priorities[status]; JabberClient.Status = message; break; case PresenceStatus.Away: JabberClient.Priority = Server.Priorities[status]; JabberClient.Show = ShowType.away; JabberClient.Status = message; break; } JabberClient.SendMyPresence(); // send presence update to all MUCs, see XEP-0045: // http://xmpp.org/extensions/xep-0045.html#changepres foreach (var chat in Chats) { if (!(chat is XmppGroupChatModel)) { continue; } var muc = (XmppGroupChatModel) chat; var to = new Jid(muc.ID) { Resource = muc.OwnNickname }; var presence = new Presence() { Show = JabberClient.Show, Status = JabberClient.Status, From = JabberClient.MyJID, To = to }; if (JabberClient.EnableCapabilities) { presence.AddChild(JabberClient.Capabilities); } JabberClient.Send(presence); } base.SetPresenceStatus(status, message); } [MethodImpl(MethodImplOptions.Synchronized)] public void CommandRegister(CommandModel command) { Trace.Call(command); Connect(); JabberClient.RegisterAccount = true; // TODO: add callbacks to process in case of error or success } public override bool Command(CommandModel command) { bool handled = false; if (IsConnected) { if (command.IsCommand) { switch (command.Command) { case "help": CommandHelp(command); handled = true; break; case "msg": case "query": CommandMessageQuery(command); handled = true; break; case "me": CommandMe(command); handled = true; break; case "say": CommandSay(command); handled = true; break; case "joinas": CommandJoinAs(command); handled = true; break; case "join": CommandJoin(command); handled = true; break; case "invite": CommandInvite(command); handled = true; break; case "part": case "leave": CommandPart(command); handled = true; break; case "away": CommandAway(command); handled = true; break; case "roster": CommandRoster(command); handled = true; break; case "contact": CommandContact(command); handled = true; break; case "priority": CommandPriority(command); handled = true; break; case "whois": CommandWhoIs(command); handled = true; break; case "register": CommandRegister(command); handled = true; break; } } else { _Say(command.Chat, command.Data); handled = true; } } else { if (command.IsCommand) { // commands which work even without being connected switch (command.Command) { case "help": CommandHelp(command); handled = true; break; case "connect": CommandConnect(command); handled = true; break; } } else { // normal text, without connection NotConnected(command); handled = true; } } return handled; } public void CommandMe(CommandModel command) { if (command.Data.Length <= 4) { return; } string actionstring = command.Data.Substring(3); // http://xmpp.org/extensions/xep-0245.html // says we should append "/me " no matter what our command char is _Say(command.Chat, "/me" + actionstring, true, false); // groupchat echos messages anyway if (command.Chat.ChatType == ChatType.Person) { var builder = CreateMessageBuilder(); builder.AppendActionPrefix(); builder.AppendIdendityName(Me); builder.AppendText(actionstring); Session.AddMessageToChat(command.Chat, builder.ToMessage()); } } [MethodImpl(MethodImplOptions.Synchronized)] void printResource(MessageBuilder builder, XmppResourceModel res) { builder.AppendText("\n\tName: {0}", res.Name); var pres = res.Presence; builder.AppendText("\n\tPresence:"); builder.AppendText("\n\t\tShow:\t{0}", pres.Show); builder.AppendText("\n\t\tStatus:\t{0}", pres.Status); builder.AppendText("\n\t\tLast:\t{0}", (pres.Last!=null)?pres.Last.Seconds.ToString():""); builder.AppendText("\n\t\tPriority:\t{0}", pres.Priority); builder.AppendText("\n\t\tType:\t{0}", pres.Type); builder.AppendText("\n\t\tXDelay:\t{0}", (pres.XDelay!=null)?pres.XDelay.Stamp.ToString():""); if (res.Disco != null) { builder.AppendText("\n\tFeatures:"); foreach(var feat in res.Disco.GetFeatures()) { builder.AppendText("\n\t\t{0}", feat.Var); } } } [MethodImpl(MethodImplOptions.Synchronized)] public void CommandWhoIs(CommandModel cmd) { Jid jid; if (cmd.DataArray.Length < 2) { if ((cmd.DataArray.Length == 1) && (cmd.Chat is PersonChatModel)) { jid = (cmd.Chat as PersonChatModel).Person.ID; } else { NotEnoughParameters(cmd); return; } } else { jid = GetJidFromNickname(cmd.DataArray[1]); } XmppPersonModel person; var builder = CreateMessageBuilder(); if (!Contacts.TryGetValue(jid.Bare, out person)) { builder.AppendErrorText(_("Could not find contact {0}"), jid); Session.AddMessageToFrontend(cmd, builder.ToMessage()); return; } if (!String.IsNullOrEmpty(jid.Resource)) { if (person.Resources.Count > 1) { builder.AppendText(_("Contact {0} has {1} known resources"), jid.Bare, person.Resources.Count); } XmppResourceModel res; if (!person.Resources.TryGetValue(jid.Resource??"", out res)) { builder.AppendErrorText(_("{0} is not a known resource"), jid.Resource); Session.AddMessageToFrontend(cmd, builder.ToMessage()); return; } printResource(builder, res); Session.AddMessageToFrontend(cmd, builder.ToMessage()); return; } builder.AppendText(_("Contact's JID: {0}"), person.Jid); builder.AppendText("\n"); switch (person.Subscription) { case SubscriptionType.both: builder.AppendText(_("You have a mutual subscription with this contact")); break; case SubscriptionType.none: builder.AppendText(_("You have no subscription with this contact and this contact is not subscribed to you")); break; case SubscriptionType.to: builder.AppendText(_("You are subscribed to this contact, but the contact is not subscribed to you")); break; case SubscriptionType.from: builder.AppendText(_("You are not subscribed to this contact, but the contact is subscribed to you")); break; case SubscriptionType.remove: #if LOG4NET _Logger.Debug("a contact with SubscriptionType remove has been found"); #endif break; } int i = 0; foreach(var res in person.Resources) { builder.AppendText("\nResource({0}):", i); printResource(builder, res.Value); i++; } Session.AddMessageToFrontend(cmd, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] public void CommandContact(CommandModel cd) { FrontendManager fm = cd.FrontendManager; // todo: allow length of 2 in private chat windows if (cd.DataArray.Length < 3) { NotEnoughParameters(cd); return; } Jid jid = GetJidFromNickname(cd.DataArray[2]); string cmd = cd.DataArray[1]; // the logic here is taken from // http://xmpp.org/rfcs/rfc3921.html#int switch (cmd) { case "addgroup": if (cd.DataArray.Length < 4) { NotEnoughParameters(cd); return; } JabberClient.RosterManager.AddRosterItem(jid, null, cd.DataArray[3]); break; case "addonly": JabberClient.RosterManager.AddRosterItem(jid); break; case "add": XmppPersonModel person; if (Contacts.TryGetValue(jid.Bare, out person)) { if (person.Subscription == SubscriptionType.both) break; if (person.Subscription != SubscriptionType.to) { JabberClient.PresenceManager.Subscribe(jid); } if (person.Subscription != SubscriptionType.from) { // in case we already know this contact… but he can't see us JabberClient.PresenceManager.ApproveSubscriptionRequest(jid); } } else { JabberClient.RosterManager.AddRosterItem(jid); JabberClient.PresenceManager.Subscribe(jid); JabberClient.PresenceManager.ApproveSubscriptionRequest(jid); } break; case "subscribe": JabberClient.PresenceManager.Subscribe(jid); break; case "unsubscribe": // stop receiving status updates from this contact // that contact will still receive your updates JabberClient.PresenceManager.Unsubscribe(jid); break; case "remove": case "rm": case "del": case "delete": JabberClient.RosterManager.RemoveRosterItem(jid); // unsubscribing is unnecessary, the server is required to do this break; case "accept": case "allow": case "approve": case "auth": case "authorize": JabberClient.PresenceManager.ApproveSubscriptionRequest(jid); break; case "deny": case "refuse": // stop the contact from receiving your updates // you will still receive the contact's status updates JabberClient.PresenceManager.RefuseSubscriptionRequest(jid); break; case "rename": if (cd.DataArray.Length < 4) { JabberClient.RosterManager.UpdateRosterItem(jid, ""); } else { var newNick = String.Join(" ", cd.DataArray.Skip(3).ToArray()); JabberClient.RosterManager.UpdateRosterItem(jid, newNick); } break; default: var builder = CreateMessageBuilder(); builder.AppendText(_("Invalid contact command: {0}"), cmd); Session.AddMessageToFrontend(cd, builder.ToMessage()); return; } } public void CommandHelp(CommandModel cmd) { var builder = CreateMessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of commands below builder.AppendHeader(_("{0} Commands"), Protocol); Session.AddMessageToFrontend(cmd, builder.ToMessage()); string[] help = { "connect xmpp/jabber server port username password [resource]", "msg/query jid/nick message", "say message", "join muc-jid [password]", "part/leave [muc-jid]", "away [away-message]", "roster [full]", "contact add/remove jid/nick", "contact rename jid/nick [newnick]" }; foreach (string line in help) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); Session.AddMessageToFrontend(cmd, builder.ToMessage()); } // TRANSLATOR: this line is used as a label / category for a // list of commands below builder = CreateMessageBuilder(); builder.AppendHeader(_("Advanced {0} Commands"), Protocol); Session.AddMessageToFrontend(cmd, builder.ToMessage()); string[] help2 = { "contact addonly/subscribe/unsubscribe/approve/deny", "whois jid", "joinas muc-jid nickname [password]", "priority away/online/temp priority-value" }; foreach (string line in help2) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); Session.AddMessageToFrontend(cmd, builder.ToMessage()); } } public void CommandConnect(CommandModel cd) { FrontendManager fm = cd.FrontendManager; var server = new XmppServerModel(); if (cd.DataArray.Length >= 3) { server.Hostname = cd.DataArray[2]; } else { NotEnoughParameters(cd); return; } if (cd.DataArray.Length >= 4) { try { server.Port = Int32.Parse(cd.DataArray[3]); } catch (FormatException) { var builder = CreateMessageBuilder(); builder.AppendText(_("Invalid port: {0}"), cd.DataArray[3]); Session.AddMessageToFrontend(cd, builder.ToMessage()); return; } } else { NotEnoughParameters(cd); return; } if (cd.DataArray.Length >= 5) { server.Username = cd.DataArray[4]; } else { NotEnoughParameters(cd); return; } if (cd.DataArray.Length >= 6) { server.Password = cd.DataArray[5]; } else { NotEnoughParameters(cd); return; } if (cd.DataArray.Length >= 7) { server.Resource = cd.DataArray[6]; } Connect(fm, server); } [MethodImpl(MethodImplOptions.Synchronized)] public void CommandPriority(CommandModel command) { if (command.DataArray.Length < 3) { var builder = CreateMessageBuilder(); builder.AppendText(_("Priority for Available is: {0}"), Server.Priorities[PresenceStatus.Online]); Session.AddMessageToFrontend(command, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendText(_("Priority for Away is: {0}"), Server.Priorities[PresenceStatus.Away]); Session.AddMessageToFrontend(command, builder.ToMessage()); return; } string subcmd = command.DataArray[1]; int prio; if (!int.TryParse(command.DataArray[2], out prio) || prio < -128 || prio > 127) { var builder = CreateMessageBuilder(); builder.AppendText(_("Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)"), command.DataArray[2]); Session.AddMessageToFrontend(command, builder.ToMessage()); return; } JabberClient.Priority = prio; bool change_current_prio = false; switch (subcmd) { case "temp": case "temporary": change_current_prio = true; // only set priority break; case "away": Server.Priorities[PresenceStatus.Away] = prio; change_current_prio = (JabberClient.Show == ShowType.away); JabberClient.Priority = prio; break; case "online": case "available": Server.Priorities[PresenceStatus.Online] = prio; change_current_prio = (JabberClient.Show == ShowType.NONE); JabberClient.Priority = prio; break; default: return; } if (change_current_prio) { // set priority and keep all other presence info JabberClient.SendMyPresence(); } } [MethodImpl(MethodImplOptions.Synchronized)] Jid GetJidFromNickname(string nickname) { XmppPersonModel it; Jid jid = nickname; if (Contacts.TryGetValue(jid, out it)) { // nickname is a jid we know return jid; } if (Contacts.TryGetValue(jid.Bare, out it)) { // is a jid with resource return jid; } // arg is not a jid in our rostermanager // find a jid to which the nickname belongs foreach (var pair in Contacts) { if (pair.Value.IdentityName != null && pair.Value.IdentityName.Replace(" ", "_") == nickname) { return pair.Key; } } // not found in roster, message directly to jid // TODO: check jid for validity return jid; } [MethodImpl(MethodImplOptions.Synchronized)] void MessageQuery(Jid jid, string message) { var chat = GetOrCreatePersonChat(jid); if (message != null && message.Trim().Length > 0) { _Say(chat, message); } } public void CommandMessageQuery(CommandModel cd) { if (cd.DataArray.Length < 2) { NotEnoughParameters(cd); return; } Jid jid = GetJidFromNickname(cd.DataArray[1]); if (cd.DataArray.Length >= 3) { // we have a message string message = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); MessageQuery(jid, message); } else { MessageQuery(jid, null); } } public void CommandJoin(CommandModel cd) { if (cd.DataArray.Length < 2) { NotEnoughParameters(cd); return; } string password = null; if (cd.DataArray.Length > 2) { password = cd.DataArray[2]; } JoinRoom(cd.DataArray[1], null, password); } [MethodImpl(MethodImplOptions.Synchronized)] void JoinRoom(Jid jid, string nickname, string password) { XmppGroupChatModel chat = (XmppGroupChatModel)GetChat(jid, ChatType.Group); if (nickname == null) { nickname = Nicknames[0]; } if (chat == null) { chat = Session.CreateChat(jid, jid, this); Session.AddChat(chat); } if (chat.IsJoining) { // double call to JoinRoom return; } chat.IsJoining = true; MucManager.JoinRoom(jid, nickname, password); if (password != null) { chat.Password = password; } chat.IsSynced = false; chat.OwnNickname = nickname; } public void CommandJoinAs(CommandModel cd) { if (cd.DataArray.Length < 3) { NotEnoughParameters(cd); return; } string password = null; if (cd.DataArray.Length > 3) { password = cd.DataArray[3]; } JoinRoom(cd.DataArray[1], cd.DataArray[2], password); } [MethodImpl(MethodImplOptions.Synchronized)] public void CommandPart(CommandModel cd) { string jid; if (cd.DataArray.Length >= 2) jid = cd.DataArray[1]; else jid = cd.Chat.ID; XmppGroupChatModel chat = (XmppGroupChatModel)GetChat(jid, ChatType.Group); if (chat != null) { MucManager.LeaveRoom(jid, chat.OwnNickname); } } public void CommandInvite(CommandModel cd) { if (cd.DataArray.Length < 3) { NotEnoughParameters(cd); return; } string password = null; if (cd.DataArray.Length > 3) { password = cd.DataArray[3]; } Invite(cd.DataArray[2], cd.DataArray[1], null, password); } void Invite(Jid jid, Jid room, string reason, string password) { Invite(new Jid[]{jid}, room, reason, password); } void Invite(string[] jids_string, string room, string reason, string password) { var jids = new Jid[jids_string.Length]; for (int i = 0; i < jids.Length; i++) { jids[i] = jids_string[i]; } Invite(jids, room, reason, password); } [MethodImpl(MethodImplOptions.Synchronized)] void Invite(Jid[] jid, Jid room, string reason, string password) { JoinRoom(room, null, password); XmppGroupChatModel chat = (XmppGroupChatModel)GetChat(room, ChatType.Group); // if no password is passed, but we are already in the chatroom and know // about a password, use that password if (password == null && chat != null) { password = chat.Password; } MucManager.Invite(jid, room, reason, password); } public void CommandAway(CommandModel cd) { if (cd.DataArray.Length >= 2) { SetPresenceStatus(PresenceStatus.Away, cd.Parameter); } else { SetPresenceStatus(PresenceStatus.Online, null); } } [MethodImpl(MethodImplOptions.Synchronized)] public void CommandRoster(CommandModel cd) { bool full = false; if (cd.Parameter == "full") { full = true; } MessageBuilder builder = CreateMessageBuilder(); builder.AppendHeader("Roster"); Session.AddMessageToFrontend(cd, builder.ToMessage()); foreach (var pair in Contacts) { string status = "+"; var contact = pair.Value; if (contact.Resources.Count == 0) { if (!full) { continue; } status = "-"; } builder = CreateMessageBuilder(); builder.AppendText("{0} {1}\t({2}): {3},{4}", status, contact.IdentityName, pair.Key, contact.Subscription, contact.Ask ); foreach (var p in contact.Resources) { builder.AppendText("\t|\t{0}:{1}:{2}", p.Key, p.Value.Presence.Type.ToString(), p.Value.Presence.Priority ); if (!String.IsNullOrEmpty(p.Value.Presence.Status)) { builder.AppendText(":\"{0}\"", p.Value.Presence.Status); } } Session.AddMessageToFrontend(cd, builder.ToMessage()); } } public void CommandSay(CommandModel cd) { _Say(cd.Chat, cd.Parameter); } void _Say(ChatModel chat, string text) { _Say(chat, text, true); } void _Say(ChatModel chat, string text, bool send) { _Say(chat, text, send, true); } [MethodImpl(MethodImplOptions.Synchronized)] void _Say(ChatModel chat, string text, bool send, bool display) { if (!chat.IsEnabled) { return; } if (chat == ContactChat) { return; } if (send) { if (chat.ChatType == ChatType.Person) { var _person = (chat as PersonChatModel).Person as PersonModel; XmppPersonModel person = GetOrCreateContact(_person.ID, _person.IdentityName); SendPrivateMessage(person, _person.ID, text); } else if (chat.ChatType == ChatType.Group) { JabberClient.Send(new Message(chat.ID, XmppMessageType.groupchat, text)); return; // don't show now. the message will be echoed back if it's sent successfully } } var builder = CreateMessageBuilder(); builder.AppendSenderPrefix(Me); builder.AppendMessage(text); var msg = builder.ToMessage(); if (display) { Session.AddMessageToChat(chat, msg); } OnMessageSent( new MessageEventArgs(chat, msg, null, chat.ID) ); } [MethodImpl(MethodImplOptions.Synchronized)] void _SendPrivateMessage(XmppPersonModel person, Jid jid, string text) { var mesg = new Message(jid, XmppMessageType.chat, text); XmppResourceModel res; if (person.Resources.TryGetValue(jid.Resource ?? "", out res)) { if (res.NicknameContactKnowsFromMe != Nicknames[0]) { res.NicknameContactKnowsFromMe = Nicknames[0]; mesg.Nickname = new Nickname(Nicknames[0]); } } JabberClient.Send(mesg); } void SendPrivateMessage(XmppPersonModel person, string text) { SendPrivateMessage(person, null, text); } [MethodImpl(MethodImplOptions.Synchronized)] void SendPrivateMessage(XmppPersonModel person, Jid jid, string text) { if (jid == null) { jid = person.Jid; } if ((jid.Server == "gmail.com") || (jid.Server == "googlemail.com")) { // don't send to all high prio resources or to specific resources // because gtalk clones any message to all resources anyway _SendPrivateMessage(person, jid.Bare, text); } else if (!String.IsNullOrEmpty(jid.Resource)) { _SendPrivateMessage(person, jid, text); } else { var resources = person.GetResourcesWithHighestPriority(); if (resources.Count == 0) { // no connected resource, send to bare jid _SendPrivateMessage(person, jid.Bare, text); } else { foreach (var res in resources) { if (String.IsNullOrEmpty(res.Name)) { // don't send messages to empty resources continue; } Jid j = new Jid(jid); j.Resource = res.Name; _SendPrivateMessage(person, j, text); } } } } void OnReadXml(object sender, string text) { if (!DebugProtocol) { return; } try { var strWriter = new StringWriter(); var xmlWriter = new XmlTextWriter(strWriter); xmlWriter.Formatting = Formatting.Indented; xmlWriter.Indentation = 2; xmlWriter.IndentChar = ' '; var document = new XmlDocument(); document.LoadXml(text); document.WriteContentTo(xmlWriter); DebugRead("\n" + strWriter.ToString()); } catch (XmlException) { DebugRead("\n" + text); } catch (Exception ex) { #if LOG4NET _Logger.Error("OnProtocol(): Exception", ex); #endif } } void OnWriteXml(object sender, string text) { if (!DebugProtocol) { return; } try { if (text == null || text.Trim().Length == 0) { // suppress logging keep-alive messages return; } var strWriter = new StringWriter(); var xmlWriter = new XmlTextWriter(strWriter); xmlWriter.Formatting = Formatting.Indented; xmlWriter.Indentation = 2; xmlWriter.IndentChar = ' '; var document = new XmlDocument(); document.LoadXml(text); document.WriteContentTo(xmlWriter); DebugWrite("\n" + strWriter.ToString()); } catch (XmlException) { // HACK: in case of an invalid doucment fallback to // plain string logging DebugWrite("\n" + text); } catch (Exception ex) { #if LOG4NET _Logger.Error("OnWriteText(): Exception", ex); #endif } } [MethodImpl(MethodImplOptions.Synchronized)] XmppPersonModel GetOrCreateContact(Jid jid, string name) { XmppPersonModel p; if (!Contacts.TryGetValue(jid.Bare, out p)) { p = new XmppPersonModel(jid, name, this); Contacts[jid.Bare] = p; } return p; } [MethodImpl(MethodImplOptions.Synchronized)] void OnRosterItem(object sender, RosterItem rosterItem) { // setting to none also removes the person from chat, as we'd never get an offline message anymore if (rosterItem.Subscription == SubscriptionType.none || rosterItem.Subscription == SubscriptionType.remove) { if (rosterItem.Subscription == SubscriptionType.remove) { Contacts.Remove(rosterItem.Jid); } if (ContactChat == null) { return; } PersonModel oldp = ContactChat.GetPerson(rosterItem.Jid); if (oldp == null) { // doesn't exist, don't need to do anything return; } Session.RemovePersonFromGroupChat(ContactChat, oldp); return; } // create or update a roster item var contact = GetOrCreateContact(rosterItem.Jid.Bare, rosterItem.Name ?? rosterItem.Jid); contact.Temporary = false; contact.Subscription = rosterItem.Subscription; contact.Ask = rosterItem.Ask; string oldIdentityName = contact.IdentityName; var oldIdentityNameColored = contact.IdentityNameColored; contact.IdentityName = rosterItem.Name ?? rosterItem.Jid; if (oldIdentityName == contact.IdentityName) { // identity name didn't change // the rest of this function only handles changed identity names return; } contact.IdentityNameColored = null; // uncache ProcessIdentityNameChanged(contact, oldIdentityNameColored, oldIdentityName); } void ProcessIdentityNameChanged(XmppPersonModel contact, TextMessagePartModel oldIdentityNameColored, string oldIdentityName) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); string idstring = (oldIdentityName == contact.Jid.Bare)?"":GenerateIdString(contact); oldIdentityNameColored.BackgroundColor = TextColor.None; builder.AppendFormat("{2}{1} is now known as {0}", contact, idstring, oldIdentityNameColored); if (ContactChat != null) { PersonModel oldp = ContactChat.GetPerson(contact.ID); if (oldp != null) { Session.UpdatePersonInGroupChat(ContactChat, oldp, contact.ToPersonModel()); Session.AddMessageToChat(ContactChat, new MessageModel(builder.ToMessage())); } } var chat = Session.GetChat(contact.ID, ChatType.Person, this) as PersonChatModel; if (chat != null) { chat.Name = contact.IdentityName; builder.MessageType = MessageType.ChatNameChanged; var msg = builder.ToMessage(); Session.AddMessageToChat(chat, msg); chat.Person = contact.ToPersonModel(); var msg2 = new MessageModel(msg); msg2.MessageType = MessageType.PersonChatPersonChanged; Session.AddMessageToChat(chat, msg2); } } protected virtual string GenerateIdString(PersonModel contact) { if (contact.ID == contact.IdentityName) { return ""; } var jid = new Jid(contact.ID); return String.Format(" [{0}]", jid.Bare); } void RequestCapabilities(Jid jid, Capabilities caps) { string hash = caps.Node + "#" + caps.Version; RequestCapabilities(jid, hash); } [MethodImpl(MethodImplOptions.Synchronized)] void RequestCapabilities(Jid jid, string hash) { // already in cache? DiscoInfo info; if (DiscoCache.TryGetValue(hash, out info)) { AddCapabilityToResource(jid, info); return; } // prevent duplicate requests DiscoCache[hash] = null; // request it Disco.DiscoverInformation(jid, (object sender, IQEventArgs e) => OnDiscoInfo(e, hash) ); } [MethodImpl(MethodImplOptions.Synchronized)] void AddCapabilityToResource(Jid jid, DiscoInfo info) { XmppPersonModel contact; if (!Contacts.TryGetValue(jid.Bare, out contact)) { return; } XmppResourceModel res; if (!contact.Resources.TryGetValue(jid.Resource??"", out res)) { return; } res.Disco = info; } [MethodImpl(MethodImplOptions.Synchronized)] void OnDiscoInfo(IQEventArgs e, string hash) { if (e.IQ.Error != null) { #if LOG4NET _Logger.DebugFormat("An error happened during service discovery: {0}", e.IQ); #endif // clear item from cache so the request is done again some time DiscoCache.Remove(hash); e.Handled = true; return; } if (e.IQ.Type != IqType.result) { #if LOG4NET _Logger.Debug("OnDiscoInfo(): iq is not a result"); #endif return; } if (!(e.IQ.Query is DiscoInfo)) { #if LOG4NET _Logger.Debug("OnDiscoInfo(): query is not a DiscoInfo"); #endif return; } var info = (DiscoInfo)e.IQ.Query; DiscoCache[hash] = info; e.Handled = true; if (String.IsNullOrEmpty(e.IQ.From.User)) { // server capabilities var builder = CreateMessageBuilder(); builder.AppendText("The Server supports the following features: "); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); foreach (var feature in info.GetFeatures()) { builder = CreateMessageBuilder(); builder.AppendText(feature.Var); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } } else { AddCapabilityToResource(e.IQ.From, info); } } [MethodImpl(MethodImplOptions.Synchronized)] MessageModel CreatePresenceUpdateMessage(Jid jid, PersonModel person, Presence pres) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); string idstring = GenerateIdString(person); // print the type (and in case of available detailed type) switch (pres.Type) { case PresenceType.available: switch(pres.Show) { case ShowType.NONE: builder.AppendFormat(_("{0}{1} is available"), person, idstring); builder.AppendPresenceState(person, MessageType.PresenceStateOnline); break; case ShowType.away: builder.AppendFormat(_("{0}{1} is away"), person, idstring); builder.AppendPresenceState(person, MessageType.PresenceStateAway); break; case ShowType.xa: builder.AppendFormat(_("{0}{1} is extended away"), person, idstring); builder.AppendPresenceState(person, MessageType.PresenceStateAway); break; case ShowType.dnd: builder.AppendFormat(_("{0}{1} wishes not to be disturbed"), person, idstring); builder.AppendPresenceState(person, MessageType.PresenceStateAway); break; case ShowType.chat: builder.AppendFormat(_("{0}{1} wants to chat"), person, idstring); builder.AppendPresenceState(person, MessageType.PresenceStateOnline); break; } break; case PresenceType.unavailable: builder.AppendPresenceState(person, MessageType.PresenceStateOffline); builder.AppendFormat(_("{0}{1} is offline"), person, idstring); break; case PresenceType.subscribe: if ((person as XmppPersonModel).Ask == AskType.subscribe) { builder = CreateMessageBuilder(); builder.AppendActionPrefix(); builder.AppendFormat(_("Automatically allowed {0} to subscribe to you, since you are already asking to subscribe"), person ); } else { builder.AppendFormat(_("{0}{1} wishes to subscribe to you"), person, idstring); // you have to respond builder.MarkAsHighlight(); } break; case PresenceType.subscribed: // you can now see their presences builder.AppendFormat(_("{0}{1} allowed you to subscribe"), person, idstring); break; case PresenceType.unsubscribed: if ((person as XmppPersonModel).Subscription == SubscriptionType.from) { builder = CreateMessageBuilder(); builder.AppendActionPrefix(); builder.AppendFormat( _("Automatically removed {0}'s subscription to " + "your presences after losing the subscription " + "to theirs"), person ); } else { // you cannot (anymore?) see their presences builder.AppendFormat(_("{0}{1} denied/removed your subscription"), person, idstring); } break; case PresenceType.unsubscribe: // you might still be able to see their presences builder.AppendFormat(_("{0}{1} unsubscribed from you"), person, idstring); break; case PresenceType.error: if (pres.Error == null) { builder.AppendErrorText(_("received a malformed error message: {0}"), pres); break; } switch (pres.Error.Type) { case ErrorType.cancel: switch (pres.Error.Condition) { case ErrorCondition.RemoteServerNotFound: builder.AppendErrorText(_("{0}{1}'s server could not be found"), person.IdentityName, idstring); break; case ErrorCondition.Conflict: builder.AppendErrorText(_("{0}{1} is already using your requested resource"), person.IdentityName, idstring); break; default: if (!String.IsNullOrEmpty(pres.Error.ErrorText)) { builder.AppendErrorText(pres.Error.ErrorText); } else { builder.AppendErrorText( _("There is currently no useful error message for {0}, {1}, {2}{3}"), pres.Error.Type, pres.Error.Condition, person.IdentityName, idstring); } break; } break; case ErrorType.auth: switch (pres.Error.Condition) { case ErrorCondition.Forbidden: builder.AppendErrorText( _("You do not have permission to access {0}{1}") , person.IdentityName, idstring); break; default: if (!String.IsNullOrEmpty(pres.Error.ErrorText)) { builder.AppendErrorText(pres.Error.ErrorText); } else { builder.AppendErrorText( _("There is currently no useful error message for {0}, {1}, {2}{3}"), pres.Error.Type, pres.Error.Condition, person.IdentityName, idstring); } break; } break; default: if (!String.IsNullOrEmpty(pres.Error.ErrorText)) { builder.AppendErrorText(pres.Error.ErrorText); } else { builder.AppendErrorText( _("There is currently no useful error message for {0}, {1}, {2}{3}"), pres.Error.Type, pres.Error.Condition, person.IdentityName, idstring); } break; } break; } // print timestamp of presence if (pres.XDelay != null || pres.Last != null) { DateTime stamp = DateTime.MinValue; TimeSpan span = TimeSpan.MinValue; if (pres.XDelay != null) { stamp = pres.XDelay.Stamp; span = DateTime.Now.Subtract(stamp); } else if (pres.Last != null) { span = TimeSpan.FromSeconds(pres.Last.Seconds); stamp = DateTime.Now.Subtract(span); } string spanstr; if (span > TimeSpan.FromDays(1)) { spanstr = String.Format( "{0:00}:{1:00}:{2:00}:{3:00}", span.TotalDays, span.Hours, span.Minutes, span.Seconds ); spanstr = String.Format(_("{0} days"), spanstr); } else if (span > TimeSpan.FromHours(1)) { spanstr = String.Format( "{0:00}:{1:00}:{2:00}", span.Hours, span.Minutes, span.Seconds ); spanstr = String.Format(_("{0} hours"), spanstr); } else if (span > TimeSpan.FromMinutes(1)) { spanstr = String.Format("{0:00}:{1:00}", span.Minutes, span.Seconds); spanstr = String.Format(_("{0} minutes"), spanstr); } else { spanstr = String.Format("{0:00}", span.Seconds); spanstr = String.Format(_("{0} seconds"), spanstr); } string timestamp = null; try { string format = Session.UserConfig["Interface/Notebook/TimestampFormat"] as string; if (!String.IsNullOrEmpty(format)) { timestamp = stamp.ToString(format); } } catch (FormatException e) { timestamp = "Timestamp Format ERROR: " + e.Message; } builder.AppendText(_(" since {0} ({1})"), timestamp, spanstr); } // print user defined message if (pres.Status != null && pres.Status.Trim().Length > 0) { builder.AppendText(": {0}", pres.Status); } return builder.ToMessage(); } [MethodImpl(MethodImplOptions.Synchronized)] void PrintGroupChatPresence(XmppGroupChatModel chat, PersonModel person, Presence pres) { Jid jid = pres.From; var msg = CreatePresenceUpdateMessage(person.ID, person, pres); Session.AddMessageToChat(chat, msg); // clone directly to muc person chat // don't care about real jid, that has its own presence packets var personChat = Session.GetChat(jid, ChatType.Person, this); if (personChat != null) { Session.AddMessageToChat(personChat, msg); } } [MethodImpl(MethodImplOptions.Synchronized)] void OnGroupChatPresence(XmppGroupChatModel chat, Presence pres) { Jid jid = pres.From; var person = new PersonModel(jid, pres.From.Resource ?? pres.From, NetworkID, Protocol, this); PrintGroupChatPresence(chat, person, pres); switch (pres.Type) { case PresenceType.available: // don't do anything if the contact already exists if (chat.UnsafePersons.ContainsKey(person.ID)) { return; } // is the chat synced? add the new contact the regular way if (chat.IsSynced) { Session.AddPersonToGroupChat(chat, person); return; } chat.UnsafePersons.Add(person.ID, person); // did I join? then the chat roster is fully received if (pres.From.Resource == chat.OwnNickname || pres.MucUser.StatusCodes.Exists(x => x.Code == StatusCode.SelfPresence)) { if (pres.MucUser.StatusCodes.Exists(x => x.Code == StatusCode.ModifiedNick)) { // as per XEP-0045 7.2.3 Example 24 the server is // allowed to give us a different nick than we requested chat.OwnNickname = pres.From.Resource; } chat.IsJoining = false; // HACK: lower probability of sync race condition swallowing messages ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(1000); lock (this) { if (IsDisposed) { return; } chat.IsSynced = true; Session.SyncChat(chat); Session.EnableChat(chat); } }); } break; case PresenceType.unavailable: Session.RemovePersonFromGroupChat(chat, person); // did I leave? then I "probably" left the room if (pres.From.Resource == chat.OwnNickname) { Session.RemoveChat(chat); } break; case PresenceType.error: OnGroupChatPresenceError(chat, pres); break; } } MessageModel CreateGroupChatPresenceErrorMessage(Presence pres) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); if (pres.Error == null) { builder.AppendErrorText(_("An unknown groupchat error occurred: {0}"), pres); return builder.ToMessage(); } switch (pres.Error.Type) { case ErrorType.cancel: switch (pres.Error.Condition) { case ErrorCondition.RemoteServerNotFound: builder.AppendErrorText(_("Server of groupchat \"{0}\" not found."), pres.From.Bare); break; case ErrorCondition.ServiceUnavailable: builder.AppendErrorText(_("MUC service is not available for \"{0}\""), pres.From.Bare); break; } break; case ErrorType.auth: switch (pres.Error.Condition) { case ErrorCondition.NotAuthorized: builder.AppendErrorText(_("You do not have permission to join \"{0}\""), pres.From.Bare); break; } break; } if (String.IsNullOrEmpty(pres.Error.ErrorText) && builder.IsEmpty) { builder.AppendErrorText(_("An unhandled groupchat error occurred: {0}"), pres.From.Bare); } else { builder.AppendErrorText(": {0}", pres.Error.ErrorText); } return builder.ToMessage(); } void OnGroupChatPresenceError(XmppGroupChatModel chat, Presence pres) { if (pres.Error != null && pres.Error.Type == ErrorType.cancel && pres.Error.Condition == ErrorCondition.Conflict) { // nickname already in use; autorejoin with _ appended JoinRoom(chat.ID, chat.OwnNickname + "_", chat.Password); return; } var msg = CreateGroupChatPresenceErrorMessage(pres); Session.AddMessageToChat(NetworkChat, msg); Session.RemoveChat(chat); } [MethodImpl(MethodImplOptions.Synchronized)] void PrintPrivateChatPresence(XmppPersonModel person, Presence pres) { Jid jid = pres.From; XmppResourceModel resource; if (person.Resources.TryGetValue(jid.Resource??"", out resource)) { if (resource.Presence.Show == pres.Show && resource.Presence.Status == pres.Status && resource.Presence.Last == pres.Last && resource.Presence.XDelay == pres.XDelay && resource.Presence.Priority == pres.Priority && resource.Presence.Type == pres.Type ) { // presence didn't change enough to warrent a display message -> abort return; } } MessageModel msg = CreatePresenceUpdateMessage(jid, person, pres); if (!String.IsNullOrEmpty(jid.Resource)) { var directchat = Session.GetChat(jid, ChatType.Person, this); if (directchat != null) { // in case of direct chat we still send this message Session.AddMessageToChat(directchat, msg); } } // a nonexisting resource going offline? if (pres.Type == PresenceType.unavailable) { if (!person.Resources.ContainsKey(jid.Resource??"")) { return; } } var res = person.GetOrCreateResource(jid); var oldpres = res.Presence; res.Presence = pres; // highest pres Jid hjid = jid; Jid nextjid = jid; // 2nd highest pres Presence hpres = pres; Presence nextpres = null; bool amHighest = true; bool wasHighest = true; foreach (var pair in person.Resources) { if (pair.Value == res) continue; if (nextpres == null || pair.Value.Presence.Priority > nextpres.Priority) { nextjid.Resource = pair.Key; nextpres = pair.Value.Presence; } if (pair.Value.Presence.Priority > hpres.Priority) { // someone has a higher priority than I do // print the status of that resource hjid.Resource = pair.Key; hpres = pair.Value.Presence; amHighest = false; } if (oldpres != null && pair.Value.Presence.Priority > oldpres.Priority) { wasHighest = false; } } if (pres.Type == PresenceType.available) { // wasn't and isn't highiest prio -> ignore if (!wasHighest && !amHighest) return; // just another below zero prio -> ignore if (amHighest && pres.Priority < 0) return; // was highest, isn't anymore -> show presence of new highest if (wasHighest && !amHighest) { msg = CreatePresenceUpdateMessage(hjid, person, hpres); } } else if (pres.Type == PresenceType.unavailable) { // still a resource left with positive priority if (nextpres != null && nextpres.Priority >= 0) { msg = CreatePresenceUpdateMessage(nextjid, person, nextpres); } } var chat = Session.GetChat(jid.Bare, ChatType.Person, this); if (chat != null) { Session.AddMessageToChat(chat, msg); } if (ContactChat != null) { Session.AddMessageToChat(ContactChat, msg); } } [MethodImpl(MethodImplOptions.Synchronized)] void OnPrivateChatPresence(Presence pres) { Jid jid = pres.From; if (jid.Bare == JabberClient.MyJID.Bare) { // don't process any of my own resources return; } var person = GetOrCreateContact(jid.Bare, jid); PrintPrivateChatPresence(person, pres); switch (pres.Type) { case PresenceType.available: if (pres.Priority < 0) break; if (ContactChat == null) break; if (ContactChat.UnsafePersons.ContainsKey(jid.Bare)) break; Session.AddPersonToGroupChat(ContactChat, person.ToPersonModel()); break; case PresenceType.unavailable: person.RemoveResource(jid); if (pres.Priority < 0) break; if (ContactChat == null) break; if (!ContactChat.UnsafePersons.ContainsKey(jid.Bare)) break; var pers = ContactChat.GetPerson(jid.Bare); Session.RemovePersonFromGroupChat(ContactChat, pers); break; case PresenceType.subscribe: if (person.Ask == AskType.subscribe) { // we are currently asking the contact OR are subscribed to him // so we allow the contact to subscribe // TODO: make the following dependent on some user setable boolean JabberClient.PresenceManager.ApproveSubscriptionRequest(jid); } break; case PresenceType.subscribed: // we are now able to see that contact's presences break; case PresenceType.unsubscribed: // the contact does not wish us to see his presences anymore if (person.Subscription == SubscriptionType.from) { // but the contact can still see us // TODO: make the following dependent on some user setable boolean JabberClient.PresenceManager.RefuseSubscriptionRequest(jid); } else { // TODO: this contact was just created in OnPresence… prevent it from doing that? // TODO: this can happen when a subscription=none contact sends a deny… Contacts.Remove(jid.Bare); } break; case PresenceType.unsubscribe: // the contact does not wish to see our presence anymore? // we could care less break; } } [MethodImpl(MethodImplOptions.Synchronized)] void OnPresence(object sender, Presence pres) { Trace.Call(sender, pres); Jid jid = pres.From; if (jid == JabberClient.MyJID) return; // we don't care about ourself if (pres.Capabilities != null && pres.Type == PresenceType.available) { // only test capabilities of users going online or changing something in their online state RequestCapabilities(jid, pres.Capabilities); } if (pres.MucUser != null || pres.Muc != null) { var groupChat = (XmppGroupChatModel) Session.GetChat(jid.Bare, ChatType.Group, this); if (groupChat == null) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(_("Received a presence update from {0}, but there's no corresponding chat window"), pres.From.Bare); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); if (pres.Type == PresenceType.error) { var msg = CreateGroupChatPresenceErrorMessage(pres); Session.AddMessageToChat(NetworkChat, msg); } else { MucManager.LeaveRoom(jid.Bare, jid.Resource); } } else { OnGroupChatPresence(groupChat, pres); } } else { OnPrivateChatPresence(pres); } } [MethodImpl(MethodImplOptions.Synchronized)] void OnGroupChatMessage(Message msg) { string group_jid = msg.From.Bare; XmppGroupChatModel groupChat = (XmppGroupChatModel) Session.GetChat(group_jid, ChatType.Group, this); if (groupChat == null) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(_("Received a groupchat message from {0} but there's no corresponding chat window: {1}"), msg.From, msg.Body); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); return; } // resource can be empty for room messages var sender_id = msg.From.Resource ?? msg.From.Bare; var person = groupChat.GetPerson(sender_id); if (person == null) { // happens in case of a delayed message if the participant has left meanwhile // TODO: or in case of a room message? person = new PersonModel(sender_id, sender_id, NetworkID, Protocol, this); } // XXX maybe only a Google Talk bug requires this: if (msg.XDelay != null) { var stamp = msg.XDelay.Stamp; if (stamp > groupChat.LatestSeenStamp) { groupChat.LatestSeenStamp = stamp; } else { return; // already seen newer delayed message } if (groupChat.SeenNewMessages) { return; // already seen newer messages } } else { groupChat.SeenNewMessages = true; } // mark highlights only for received messages MessageModel message; if (person.ID == groupChat.OwnNickname) { message = CreateEchoGroupChatMessage(groupChat, msg); } else { message = CreateGroupChatMessage(groupChat, person, msg); } Session.AddMessageToChat(groupChat, message); OnMessageReceived( new MessageEventArgs(groupChat, message, msg.From, groupChat.ID) ); } void AddMessageToChatIfNotFiltered(MessageModel msg, ChatModel chat, bool isNew) { if (Session.IsFilteredMessage(chat, msg)) { Session.LogMessage(chat, msg, true); return; } if (isNew) { Session.AddChat(chat); } Session.AddMessageToChat(chat, msg, true); if (isNew) { Session.SyncChat(chat); } } [MethodImpl(MethodImplOptions.Synchronized)] void ProcessNickname(XmppPersonModel person, Nickname nick) { if (String.IsNullOrEmpty(nick.Value)) { return; } // only rename person if it doesn't have a preset name if (person.IdentityName == person.ID) { var oldIdentityNameColored = person.IdentityNameColored; var oldIdentityName = person.IdentityName; person.IdentityName = nick.Value; ProcessIdentityNameChanged(person, oldIdentityNameColored, oldIdentityName); } } [MethodImpl(MethodImplOptions.Synchronized)] void OnPrivateChatMessage(Message msg) { var chat = Session.GetChat(msg.From, ChatType.Person, this) as PersonChatModel; bool isNew = false; if (chat == null) { // in case full jid doesn't have a chat window, use bare jid chat = GetOrCreatePersonChat(msg.From.Bare, out isNew); } if (msg.Nickname != null) { ProcessNickname(GetOrCreateContact(msg.From, msg.Nickname.Value), msg.Nickname); } var message = CreatePrivateChatMessage(chat.Person, msg); AddMessageToChatIfNotFiltered(message, chat, isNew); OnMessageReceived( new MessageEventArgs(chat, message, msg.From, null) ); } MessageModel CreateEchoGroupChatMessage(XmppGroupChatModel groupChat, Message msg) { var builder = CreateMessageBuilder(); string msgstring; if (msg.Html != null) { msgstring = msg.Html.ToString(); } else { msgstring = msg.Body.Trim(); } var self = new PersonModel( groupChat.OwnNickname, groupChat.OwnNickname, NetworkID, Protocol, this); if (msgstring.StartsWith("/me ")) { // leave the " " intact msgstring = msgstring.Substring(3); builder.AppendActionPrefix(); builder.AppendIdendityName(self); } else { builder.AppendSenderPrefix(self); } if (msg.Html != null) { builder.AppendHtmlMessage(msgstring); } else { builder.AppendMessage(msgstring); } if (msg.XDelay != null) { builder.TimeStamp = msg.XDelay.Stamp; } return builder.ToMessage(); } MessageModel CreateGroupChatMessage(XmppGroupChatModel groupChat, PersonModel person, Message msg) { var builder = CreateMessageBuilder(); string msgstring; if (msg.Html != null) { msgstring = msg.Html.ToString(); } else { msgstring = msg.Body.Trim(); } if (msgstring.StartsWith("/me ")) { // leave the " " intact msgstring = msgstring.Substring(3); builder.AppendActionPrefix(); builder.AppendIdendityName(person); } else { builder.AppendSenderPrefix(person); } if (msg.Html != null) { builder.AppendHtmlMessage(msgstring); } else { builder.AppendMessage(msgstring); } // mark hilights only for OwnNickname, too builder.Me = new PersonModel( groupChat.OwnNickname, groupChat.OwnNickname, NetworkID, Protocol, this); builder.MarkHighlights(); if (msg.XDelay != null) { builder.TimeStamp = msg.XDelay.Stamp; } return builder.ToMessage(); } MessageModel CreatePrivateChatMessage(PersonModel person, Message msg) { var builder = CreateMessageBuilder(); string msgstring; if (msg.Html != null) { msgstring = msg.Html.ToString(); } else { msgstring = msg.Body.Trim(); } if (msgstring.StartsWith("/me ")) { // leave the " " intact msgstring = msgstring.Substring(3); builder.AppendActionPrefix(); builder.AppendIdendityName(person, true); } else { builder.AppendSenderPrefix(person, true); } if (msg.Html != null) { builder.AppendHtmlMessage(msgstring); } else { builder.AppendMessage(msgstring); } if (msg.XDelay != null) { builder.TimeStamp = msg.XDelay.Stamp; } return builder.ToMessage(); } void OnGroupChatMessageError(Message msg, XmppGroupChatModel chat) { var builder = CreateMessageBuilder(); // TODO: nicer formatting if (msg.Error.ErrorText != null) { builder.AppendErrorText(msg.Error.ErrorText); } else { builder.AppendErrorText(msg.Error.ToString()); } Session.AddMessageToChat(chat, builder.ToMessage()); } void OnPrivateChatMessageError(Message msg, PersonChatModel chat) { var builder = CreateMessageBuilder(); // TODO: nicer formatting if (msg.Error.ErrorText != null) { builder.AppendErrorText(msg.Error.ErrorText); } else { builder.AppendErrorText(msg.Error.ToString()); } Session.AddMessageToChat(chat, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] void OnMessage(object sender, Message msg) { // process chatstates if (msg.Chatstate != agsXMPP.protocol.extensions.chatstates.Chatstate.None) { OnChatState(msg); } if (String.IsNullOrEmpty(msg.Body)) { // TODO: capture events and stuff return; } switch (msg.Type) { case XmppMessageType.groupchat: OnGroupChatMessage(msg); break; case XmppMessageType.chat: case XmppMessageType.headline: case XmppMessageType.normal: if (String.IsNullOrEmpty(msg.From.User)) { OnServerMessage(msg); } else if (msg.MucUser != null) { OnMucMessage(msg); } else { OnPrivateChatMessage(msg); } break; case XmppMessageType.error: { var chat = Session.GetChat(msg.From, ChatType.Group, this); if (chat != null) { OnGroupChatMessageError(msg, chat as XmppGroupChatModel); break; } chat = Session.GetChat(msg.From, ChatType.Person, this); if (chat != null) { OnPrivateChatMessageError(msg, chat as PersonChatModel); break; } // no person and no groupchat open? -> dump in networkchat var builder = CreateMessageBuilder(); // TODO: nicer formatting if (msg.Error.ErrorText != null) { builder.AppendErrorText(msg.Error.ErrorText); } else { builder.AppendErrorText(msg.Error.ToString()); } Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } break; } } [MethodImpl(MethodImplOptions.Synchronized)] void OnMucMessage (Message msg) { User user = msg.MucUser; string text; if (user.Invite != null) { if (user.Invite.Reason != null && user.Invite.Reason.Trim().Length > 0) { text = String.Format(_("You have been invited to {2} by {0} because {1}"), user.Invite.From, user.Invite.Reason, msg.From ); } else { text = String.Format(_("You have been invited to {1} by {0}"), user.Invite.From, msg.From ); } } else { text = msg.ToString(); } var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); var txt = builder.CreateText(text); txt.IsHighlight = true; builder.AppendText(txt); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); builder = CreateMessageBuilder(); string url; if (!String.IsNullOrEmpty(user.Password)) { url = String.Format("xmpp:{0}?join;password={1}", msg.From, user.Password); } else { url = String.Format("xmpp:{0}?join", msg.From); } builder.AppendUrl(url, _("Accept invite (join room)")); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] void OnChatState(Message msg) { if (!ShowChatStates) { return; } if (msg.Body != null) { return; } switch (msg.Type) { case XmppMessageType.chat: case XmppMessageType.headline: case XmppMessageType.normal: { var chat = GetChat(msg.From, ChatType.Person) as PersonChatModel; bool isNew = false; // no full jid chat if (chat == null) { // create chat chat = GetOrCreatePersonChat(msg.From.Bare, out isNew); if (isNew) { if (!OpenNewChatOnChatState) { return; } if (msg.Chatstate != Chatstate.composing) { // there is NO reason to open a new chat window for // a chatstate other than composing return; } Session.AddChat(chat); } } var builder = CreateMessageBuilder(); switch (msg.Chatstate) { case Chatstate.composing: builder.AppendChatState(chat.Person, MessageType.ChatStateComposing); break; case Chatstate.paused: builder.AppendChatState(chat.Person, MessageType.ChatStatePaused); break; default: builder.AppendChatState(chat.Person, MessageType.ChatStateReset); break; } Session.AddMessageToChat(chat, builder.ToMessage()); if (isNew) { Session.SyncChat(chat); } } break; default: break; } } void OnServerMessage(Message msg) { var builder = CreateMessageBuilder(); builder.AppendText("<{0}> {1}", msg.From, msg.Body); builder.MarkHighlights(); // todo: can server messages have an xdelay? if (msg.XDelay != null) { builder.TimeStamp = msg.XDelay.Stamp; } Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] PersonChatModel GetOrCreatePersonChat(Jid jid) { bool isNew; var chat = GetOrCreatePersonChat(jid, out isNew); if (isNew) { Session.AddChat(chat); Session.SyncChat(chat); } return chat; } [MethodImpl(MethodImplOptions.Synchronized)] PersonChatModel GetOrCreatePersonChat(Jid jid, out bool isNew) { var chat = (PersonChatModel) Session.GetChat(jid, ChatType.Person, this); isNew = false; if (chat != null) return chat; var person = GetOrCreateContact(jid.Bare, jid); PersonModel pers; if (!String.IsNullOrEmpty(jid.Resource)) { pers = new PersonModel(jid, person.IdentityName, NetworkID, Protocol, this); } else { pers = person.ToPersonModel(); } isNew = true; chat = Session.CreatePersonChat(pers, this); if (jid == JabberClient.MyJID || jid == JabberClient.MyJID.Bare) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText("Note: you are now talking to yourself"); Session.AddMessageToChat(chat, builder.ToMessage()); } return chat; } [MethodImpl(MethodImplOptions.Synchronized)] void OnClose(object sender) { Trace.Call(sender); foreach (var chat in Chats) { // don't disable the protocol chat, else the user loses all // control for the protocol manager! e.g. after a manual // reconnect or server-side disconnect if (chat.ChatType == ChatType.Protocol) { continue; } Session.DisableChat(chat); } OnDisconnected(EventArgs.Empty); // reset socket JabberClient.ClientSocket.OnValidateCertificate -= ValidateCertificate; JabberClient.SocketConnectionType = SocketConnectionType.Direct; if (AutoReconnect) { Reconnect(AutoReconnectDelay); } } void Reconnect() { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Reconnecting to {0}"), JabberClient.Server); Session.AddMessageToChat(Chat, builder.ToMessage()); Connect(); } void Reconnect(TimeSpan span) { int delay = (int)span.TotalMilliseconds; if (delay <= 0) { Reconnect(); } var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Reconnecting to {0} in {1} seconds"), JabberClient.Server, span.TotalSeconds); Session.AddMessageToChat(Chat, builder.ToMessage()); ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(delay); lock (this) { // prevent this timer from calling connect after it has been closed if (IsDisposed) { return; } // prevent this timer from calling connect if during the timout // some other event already began a connect if (JabberClient.XmppConnectionState != XmppConnectionState.Disconnected) { return; } Connect(); } }); } void OnError(object sender, Exception ex) { Trace.Call(sender); #if LOG4NET _Logger.Error("OnError(): Exception", ex); #endif var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendErrorText(_("Error: {0}"), String.Empty); builder.AppendMessage(ex.Message); Session.AddMessageToChat(NetworkChat, builder.ToMessage()); } [MethodImpl(MethodImplOptions.Synchronized)] void OnLogin(object sender) { Trace.Call(sender); var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Authenticated")); Session.AddMessageToChat(Chat, builder.ToMessage()); RequestCapabilities(JabberClient.Server, JabberClient.Server); OnConnected(EventArgs.Empty); foreach (var chat in Chats) { if (chat is PersonChatModel) { Session.EnableChat(chat); Session.SyncChat(chat); } else if (chat is XmppGroupChatModel) { var muc = (XmppGroupChatModel)chat; JoinRoom(muc.ID, muc.OwnNickname, muc.Password); } } } [MethodImpl(MethodImplOptions.Synchronized)] void ApplyConfig(UserConfig config, XmppServerModel server) { if (String.IsNullOrEmpty(server.Nickname)) { Nicknames = (string[]) config["Connection/Nicknames"]; } else { Nicknames = new string[] { server.Nickname }; } if (server.Username.Contains("@")) { var jid_user = server.Username.Split('@')[0]; var jid_host = server.Username.Split('@')[1]; JabberClient.ConnectServer = server.Hostname; JabberClient.AutoResolveConnectServer = false; JabberClient.Username = jid_user; JabberClient.Server = jid_host; } else { JabberClient.Server = server.Hostname; JabberClient.Username = server.Username; } JabberClient.Port = server.Port; JabberClient.Password = server.Password; var proxySettings = new ProxySettings(); proxySettings.ApplyConfig(config); var protocol = Server.UseEncryption ? "xmpps" : "xmpp"; var serverUri = String.Format("{0}://{1}:{2}", protocol, Server.Hostname, Server.Port); var proxy = proxySettings.GetWebProxy(serverUri); var socket = JabberClient.ClientSocket as ClientSocket; if (proxy == null) { socket.Proxy = null; } else { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Using proxy: {0}:{1}"), proxy.Address.Host, proxy.Address.Port); Session.AddMessageToChat(Chat, builder.ToMessage()); var proxyScheme = proxy.Address.Scheme; var proxyType = Starksoft.Net.Proxy.ProxyType.None; try { proxyType = (Starksoft.Net.Proxy.ProxyType) Enum.Parse( typeof(Starksoft.Net.Proxy.ProxyType), proxy.Address.Scheme, true ); } catch (ArgumentException ex) { #if LOG4NET _Logger.Error("ApplyConfig(): Couldn't parse proxy type: " + proxyScheme, ex); #endif } var proxyFactory = new ProxyClientFactory(); if (String.IsNullOrEmpty(proxySettings.ProxyUsername) && String.IsNullOrEmpty(proxySettings.ProxyPassword)) { socket.Proxy = proxyFactory.CreateProxyClient( proxyType, proxy.Address.Host, proxy.Address.Port ); } else { socket.Proxy = proxyFactory.CreateProxyClient( proxyType, proxy.Address.Host, proxy.Address.Port, proxySettings.ProxyUsername, proxySettings.ProxyPassword ); } } Me = new PersonModel( JabberClient.MyJID.Bare, Nicknames[0], NetworkID, Protocol, this ); Me.IdentityNameColored.ForegroundColor = new TextColor(0, 0, 255); Me.IdentityNameColored.BackgroundColor = TextColor.None; Me.IdentityNameColored.Bold = true; // XMPP specific settings JabberClient.Resource = server.Resource; if (server.UseEncryption) { // HACK: Google Talk doesn't support StartTLS :( if (server.Hostname == "talk.google.com" && server.Port == 5223) { JabberClient.ForceStartTls = false; JabberClient.UseSSL = true; } else { JabberClient.ForceStartTls = true; } } else { JabberClient.ForceStartTls = false; JabberClient.UseStartTLS = true; } if (!server.ValidateServerCertificate) { JabberClient.ClientSocket.OnValidateCertificate += ValidateCertificate; } } static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } } smuxi-1.1/src/Engine-XMPP/AssemblyInfo.cs0000644000175000017500000000262612253423337021030 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - XMPP protocol support")] [assembly: AssemblyCopyright("2005-2013 (C) Mirco Bauer , " + "2011 (C) Tuukka Hastrup , " + "2013 (C) Oliver Schneider ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Engine-XMPP/Makefile.am0000664000175000017500000000226214011472672020140 0ustar00meebeymeebey00000000000000if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-xmpp ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Config/XmppServerModel.cs \ Protocols/Xmpp/XmppGroupChatModel.cs \ Protocols/Xmpp/XmppProtocolManager.cs \ Config/XmppPersonModel.cs REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/StarkSoftProxy.dll \ $(TARGET_DIR)/agsxmpp.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb include $(top_srcdir)/Makefile.include all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) smuxi-1.1/src/Engine-XMPP/Config/0000775000175000017500000000000014011526501017276 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-XMPP/Config/XmppServerModel.cs0000644000175000017500000000562512726351313022737 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine { public class XmppServerModel : ServerModel { public string Resource { get; set; } public Dictionary Priorities { get; private set; } public void InitDefaults() { Priorities = new Dictionary(); // choose somewhat reasonable defaults Priorities[PresenceStatus.Online] = 5; Priorities[PresenceStatus.Away] = 0; Protocol = "XMPP"; } public XmppServerModel() { InitDefaults(); } public override void Load(UserConfig config, string protocol, string id) { if (config == null) { throw new ArgumentNullException("config"); } if (String.IsNullOrEmpty(protocol)) { throw new ArgumentNullException("protocol"); } if (String.IsNullOrEmpty(id)) { throw new ArgumentNullException("id"); } base.Load(config, protocol, id); var obj = config[ConfigKeyPrefix + "PriorityOnline"]; if (obj != null) { Priorities[PresenceStatus.Online] = (int) obj; } obj = config[ConfigKeyPrefix + "PriorityAway"]; if (obj != null) { Priorities[PresenceStatus.Away] = (int) obj; } obj = config[ConfigKeyPrefix + "Resource"]; if (obj != null) { Resource = (string) obj; } } public override void Save(UserConfig config) { if (config == null) { throw new ArgumentNullException("config"); } base.Save(config); config[ConfigKeyPrefix + "PriorityOnline"] = Priorities[PresenceStatus.Online]; config[ConfigKeyPrefix + "PriorityAway"] = Priorities[PresenceStatus.Away]; config[ConfigKeyPrefix + "Resource"] = Resource; } } } smuxi-1.1/src/Engine-XMPP/Config/XmppPersonModel.cs0000644000175000017500000001002412726351313022724 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Oliver Schneider // // Full GPL License: // // 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 using System; using agsXMPP.protocol.client; using System.Collections.Generic; using agsXMPP; using Smuxi.Common; using agsXMPP.protocol.iq.roster; using agsXMPP.protocol.iq.disco; namespace Smuxi.Engine { internal class XmppResourceModel { public Presence Presence { get; set; } public DiscoInfo Disco { get; set; } public string Name { get; set; } public string NicknameContactKnowsFromMe { get; set; } } internal class XmppPersonModel : PersonModel { public bool Temporary { get; set; } public Jid Jid { get; set; } public Dictionary Resources { get; private set; } public SubscriptionType Subscription { get; set; } public AskType Ask { get; set; } public XmppPersonModel(Jid jid, string nick, XmppProtocolManager protocolManager) :base(jid, nick, protocolManager.NetworkID, protocolManager.Protocol, protocolManager) { Trace.Call(jid, nick, protocolManager); Jid = jid.Bare; Resources = new Dictionary(); Ask = AskType.NONE; Subscription = SubscriptionType.none; Temporary = true; if (!String.IsNullOrEmpty(jid.Resource)) { GetOrCreateResource(jid); } } public XmppResourceModel GetOrCreateResource(Jid jid, out bool isNew) { XmppResourceModel ret; string res = jid.Resource ?? ""; if (Resources.TryGetValue(res, out ret)) { isNew = false; return ret; } ret = new XmppResourceModel(); ret.Name = res; Resources.Add(res, ret); isNew = true; return ret; } public XmppResourceModel GetOrCreateResource(Jid jid) { XmppResourceModel ret; string res = jid.Resource ?? ""; if (Resources.TryGetValue(res, out ret)) { return ret; } ret = new XmppResourceModel(); ret.Name = res; Resources.Add(res, ret); return ret; } public List GetResourcesWithHighestPriority() { List ret = new List(); int prio = -99999; foreach (var res in Resources) { if (res.Value.Presence.Priority > prio) { ret.Clear(); ret.Add(res.Value); prio = res.Value.Presence.Priority; } else if (res.Value.Presence.Priority == prio) { ret.Add(res.Value); } } return ret; } public void RemoveResource(Jid jid) { Resources.Remove(jid.Resource ?? ""); } public PersonModel ToPersonModel() { return new PersonModel( base.ID, base.IdentityName, base.NetworkID, base.NetworkID, base.ProtocolManager ); } } } smuxi-1.1/src/Engine-XMPP/Makefile.in0000664000175000017500000010317214011526471020150 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Engine-XMPP ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-engine-xmpp.pc 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(pkgapp_DATA) $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-engine-xmpp.pc.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-xmpp ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Config/XmppServerModel.cs \ Protocols/Xmpp/XmppGroupChatModel.cs \ Protocols/Xmpp/XmppProtocolManager.cs \ Config/XmppPersonModel.cs REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/StarkSoftProxy.dll \ $(TARGET_DIR)/agsxmpp.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine-XMPP/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine-XMPP/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-engine-xmpp.pc: $(top_builddir)/config.status $(srcdir)/smuxi-engine-xmpp.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) # 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: smuxi-1.1/src/Engine-XMPP/smuxi-engine-xmpp.pc.in0000644000175000017500000000022111655545675022435 0ustar00meebeymeebey00000000000000Name: Engine-XMPP Description: Engine-XMPP Version: @VERSION@ Requires: smuxi-engine Libs: -r:@expanded_libdir@/@PACKAGE@/smuxi-engine-xmpp.dll smuxi-1.1/src/Frontend-GNOME-Twitter/0000775000175000017500000000000014011526501020164 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-GNOME-Twitter/AssemblyInfo.cs0000644000175000017500000000227412726351313023121 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2013 Andrés G. Aragoneses * * Full GPL License: * * 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 */ using System.Reflection; [assembly: AssemblyTitle("Smuxi - Twitter support for GNOME frontend")] [assembly: AssemblyCopyright("2013 (C) Andrés G. Aragoneses , " + "2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/src/Frontend-GNOME-Twitter/Makefile.am0000664000175000017500000000207714011467170022234 0ustar00meebeymeebey00000000000000TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-frontend-gnome-twitter ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ TwitterGroupChatView.cs \ TwitterMessageTextView.cs \ TwitterPersonChatView.cs REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_LIBS) \ $(GTK_SHARP_20_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/smuxi-engine-twitter.dll \ $(TARGET_DIR)/smuxi-frontend.dll \ $(TARGET_DIR)/smuxi-frontend-gnome.exe SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb include $(top_srcdir)/Makefile.include all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) smuxi-1.1/src/Frontend-GNOME-Twitter/TwitterMessageTextView.cs0000664000175000017500000000366314011467170025200 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2015 Andrés G. Aragoneses // // Full GPL License: // // 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 using System; using System.Collections.Generic; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { public class TwitterMessageTextView : MessageTextView { protected override void InsertTimeStamp(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, string timestamp, MessageModel msg) { if (String.IsNullOrWhiteSpace(msg.ID)) { buffer.Insert(ref iter, timestamp); } else { var uri = new Uri(String.Format("https://twitter.com/{0}/status/{1}", msg.GetNick(), msg.ID)); var tags = new List(); // link URI tag var linkTag = new LinkTag(uri); linkTag.TextEvent += OnLinkTagTextEvent; _MessageTextTagTable.Add(linkTag); tags.Add(linkTag); // link style tag tags.Add(LinkTag); buffer.InsertWithTags(ref iter, timestamp, tags.ToArray()); } buffer.Insert(ref iter, " "); } } } smuxi-1.1/src/Frontend-GNOME-Twitter/Makefile.in0000664000175000017500000010246014011526471022242 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-GNOME-Twitter ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d 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)$(bindir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(pkgapp_DATA) $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-frontend-gnome-twitter ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ TwitterGroupChatView.cs \ TwitterMessageTextView.cs \ TwitterPersonChatView.cs REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_LIBS) \ $(GTK_SHARP_20_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/smuxi-engine-twitter.dll \ $(TARGET_DIR)/smuxi-frontend.dll \ $(TARGET_DIR)/smuxi-frontend-gnome.exe SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-GNOME-Twitter/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-GNOME-Twitter/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) # 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: smuxi-1.1/src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs0000664000175000017500000001535614011467170024645 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Andrés G. Aragoneses // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Threading; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Group, ProtocolManagerType = typeof(TwitterProtocolManager))] public class TwitterGroupChatView : GroupChatView { static readonly string LibraryTextDomain = "smuxi-frontend-gnome-twitter"; TwitterProtocolManager TwitterProtocolManager { get; set; } public TwitterGroupChatView(GroupChatModel groupChat) : base(groupChat) { Trace.Call(groupChat); } protected override MessageTextView CreateMainMessageTextView() { return new TwitterMessageTextView(); } protected override void OnPersonMenuShown(object sender, EventArgs e) { Trace.Call(sender, e); foreach (var child in PersonMenu.Children) { PersonMenu.Remove(child); } base.OnPersonMenuShown(sender, e); Gtk.MenuItem item; if (Frontend.EngineProtocolVersion >= new Version(0, 7)) { item = new Gtk.ImageMenuItem(_("Direct Message")); item.Activated += OnUserListMenuDirectMessageActivated; PersonMenu.Append(item); PersonMenu.Append(new Gtk.SeparatorMenuItem()); } if (Frontend.EngineProtocolVersion >= new Version(0, 10)) { item = new Gtk.ImageMenuItem(_("Timeline")); item.Activated += OnUserListMenuTimelineActivated; PersonMenu.Append(item); if (ID == TwitterChatType.FriendsTimeline.ToString()) { item = new Gtk.ImageMenuItem(_("Unfollow")); item.Activated += OnUserListMenuUnfollowActivated; PersonMenu.Append(item); } else { item = new Gtk.ImageMenuItem(_("Follow")); item.Activated += OnUserListMenuFollowActivated; PersonMenu.Append(item); } } PersonMenu.ShowAll(); } void OnUserListMenuUnfollowActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { TwitterProtocolManager.CommandUnfollow( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuFollowActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { TwitterProtocolManager.CommandFollow( new CommandModel( Frontend.FrontendManager, ChatModel, per.ID ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuDirectMessageActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { TwitterProtocolManager.CommandMessage( new CommandModel( Frontend.FrontendManager, ChatModel, per.IdentityName ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } void OnUserListMenuTimelineActivated(object sender, EventArgs e) { Trace.Call(sender, e); var persons = GetSelectedPersons(); if (persons == null) { return; } foreach (var person in persons) { var per = person; ThreadPool.QueueUserWorkItem(delegate { try { TwitterProtocolManager.CommandTimeline( new CommandModel( Frontend.FrontendManager, ChatModel, per.IdentityName ) ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } } public override void Sync() { Trace.Call(); base.Sync(); TwitterProtocolManager = (TwitterProtocolManager) ProtocolManager; } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } } smuxi-1.1/src/Frontend-GNOME-Twitter/TwitterPersonChatView.cs0000664000175000017500000000260514011467170025010 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2015 Andrés G. Aragoneses * * Full GPL License: * * 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 */ using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Gnome { [ChatViewInfo(ChatType = ChatType.Person, ProtocolManagerType = typeof(TwitterProtocolManager))] public class TwitterPersonChatView : PersonChatView { public TwitterPersonChatView(PersonChatModel personChat) : base(personChat) { Trace.Call(personChat); } protected override MessageTextView CreateMainMessageTextView() { return new TwitterMessageTextView(); } } } smuxi-1.1/src/Makefile.am0000644000175000017500000000245012726351313016145 0ustar00meebeymeebey00000000000000# Engines if ENABLE_ENGINE_IRC ENGINE_IRC = Engine-IRC endif if ENABLE_ENGINE_XMPP ENGINE_XMPP = Engine-XMPP endif if ENABLE_ENGINE_TWITTER ENGINE_TWITTER = Engine-Twitter endif if ENABLE_ENGINE_CAMPFIRE ENGINE_CAMPFIRE = Engine-Campfire endif if ENABLE_ENGINE_JABBR ENGINE_JABBR = Engine-JabbR endif # Frontends if ENABLE_FRONTEND_GNOME FRONTEND_GNOME = Frontend-GNOME endif if ENABLE_FRONTEND_GNOME_IRC FRONTEND_GNOME_IRC = Frontend-GNOME-IRC endif if ENABLE_FRONTEND_GNOME_TWITTER FRONTEND_GNOME_TWITTER = Frontend-GNOME-Twitter endif if ENABLE_FRONTEND_GNOME_XMPP FRONTEND_GNOME_XMPP = Frontend-GNOME-XMPP endif if ENABLE_FRONTEND_STFL FRONTEND_STFL = Frontend-STFL endif if ENABLE_FRONTEND_CURSES FRONTEND_CURSES = Frontend-Curses endif if ENABLE_FRONTEND_SWF FRONTEND_SWF = Frontend-SWF endif if ENABLE_FRONTEND_WPF #FRONTEND_WPF = Frontend-WPF endif if ENABLE_FRONTEND_TEST FRONTEND_TEST = Frontend-Test endif SUBDIRS = Common \ Engine \ $(ENGINE_IRC) \ $(ENGINE_TWITTER) \ $(ENGINE_CAMPFIRE) \ $(ENGINE_JABBR) \ $(ENGINE_XMPP) \ Engine-MessageBuffer \ Server \ Frontend \ $(FRONTEND_GNOME) \ $(FRONTEND_GNOME_IRC) \ $(FRONTEND_GNOME_TWITTER) \ $(FRONTEND_GNOME_XMPP) \ $(FRONTEND_STFL) \ $(FRONTEND_CURSES) \ $(FRONTEND_SWF) \ $(FRONTEND_WPF) \ $(FRONTEND_TEST) smuxi-1.1/src/AssemblyVersion.cs0000664000175000017500000000236414011526477017577 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyDescription("Smart MUltipleXed Irc")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("qNETp")] [assembly: AssemblyProduct("Smuxi")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyVersion("1.1")] smuxi-1.1/src/Engine-Twitter/0000775000175000017500000000000014011526501016747 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-Twitter/Protocols/0000775000175000017500000000000014011526501020733 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-Twitter/Protocols/Twitter/0000775000175000017500000000000014011526501022375 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-Twitter/Protocols/Twitter/TwitterSearchStream.cs0000644000175000017500000001176312726351313026706 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013-2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Net; using Twitterizer; using Twitterizer.Streaming; using Smuxi.Common; namespace Smuxi.Engine { public class TwitterSearchStream : IDisposable { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif TwitterProtocolManager ProtocolManager { get; set; } Session Session { get; set; } TwitterStream Stream { get; set; } GroupChatModel Chat { get; set; } RateLimiter MessageRateLimiter { get; set; } public TwitterSearchStream(TwitterProtocolManager protocolManager, GroupChatModel chat, string keyword, OAuthTokens tokens, WebProxy proxy) { if (protocolManager == null) { throw new ArgumentNullException("protocolManager"); } if (chat == null) { throw new ArgumentNullException("chat"); } if (keyword == null) { throw new ArgumentNullException("keyword"); } if (tokens == null) { throw new ArgumentNullException("tokens"); } ProtocolManager = protocolManager; Session = protocolManager.Session; Chat = chat; var options = new StreamOptions(); options.Track.Add(keyword); Stream = new TwitterStream(tokens, null, options); Stream.Proxy = proxy; Stream.StartPublicStream(OnStreamStopped, OnStatusCreated, OnStatusDeleted, OnEvent); MessageRateLimiter = new RateLimiter(5, TimeSpan.FromSeconds(5)); } ~TwitterSearchStream() { Dispose(false); } protected virtual void Dispose(bool disposing) { Trace.Call(disposing); Stream.EndStream(); Stream.Dispose(); } public void Dispose() { GC.SuppressFinalize(this); Dispose(true); } protected TwitterMessageBuilder CreateMessageBuilder() { var builder = new TwitterMessageBuilder(); builder.ApplyConfig(Session.UserConfig); return builder; } void OnStreamStopped(StopReasons reason) { Trace.Call(reason); try { Session.DisableChat(Chat); } catch (Exception ex) { #if LOG4NET Logger.Error("OnStreamStopped()", ex); #endif } } void OnStatusCreated(TwitterStatus status) { Trace.Call(status); try { if (MessageRateLimiter.IsRateLimited) { return; } // filter native and old-school retweets if (status.RetweetedStatus != null || status.Text.StartsWith("RT @")) { return; } MessageRateLimiter++; var sender = ProtocolManager.GetPerson(status.User); var userId = status.User.Id.ToString(); lock (Chat.UnsafePersons) { if (!Chat.UnsafePersons.ContainsKey(userId)) { Session.AddPersonToGroupChat(Chat, sender); } } var msg = CreateMessageBuilder(). Append(status, sender). ToMessage(); Session.AddMessageToChat(Chat, msg); } catch (Exception ex) { #if LOG4NET Logger.Error("OnStatusCreated()", ex); #endif } } void OnStatusDeleted(TwitterStreamDeletedEvent status) { Trace.Call(status); try { } catch (Exception ex) { #if LOG4NET Logger.Error("OnStatusDeleted()", ex); #endif } } void OnEvent(TwitterStreamEvent @event) { Trace.Call(@event); try { } catch (Exception ex) { #if LOG4NET Logger.Error("OnEvent()", ex); #endif } } } } smuxi-1.1/src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs0000664000175000017500000023576314011472672027434 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2009-2015 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Net; using System.Net.Security; using System.Web; using System.Linq; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Collections.Generic; using Twitterizer; using Twitterizer.Core; using Smuxi.Common; namespace Smuxi.Engine { public enum TwitterChatType { FriendsTimeline, Replies, DirectMessages } [ProtocolManagerInfo(Name = "Twitter", Description = "Twitter Micro-Blogging", Alias = "twitter")] public class TwitterProtocolManager : ProtocolManagerBase { #if LOG4NET private static readonly log4net.ILog f_Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif static readonly string f_LibraryTextDomain = "smuxi-engine-twitter"; static readonly TextColor f_BlueTextColor = new TextColor(0x0000FF); OAuthTokens f_OAuthTokens; string f_RequestToken; OptionalProperties f_OptionalProperties; TwitterUser f_TwitterUser; WebProxy f_WebProxy; string f_Username; ProtocolChatModel f_ProtocolChat; Dictionary f_Friends; List f_GroupChats = new List(); GroupChatModel f_FriendsTimelineChat; AutoResetEvent f_FriendsTimelineEvent = new AutoResetEvent(false); Thread f_UpdateFriendsTimelineThread; int f_UpdateFriendsTimelineInterval = 120; decimal f_LastFriendsTimelineStatusID; GroupChatModel f_RepliesChat; Thread f_UpdateRepliesThread; int f_UpdateRepliesInterval = 120; decimal f_LastReplyStatusID; GroupChatModel f_DirectMessagesChat; AutoResetEvent f_DirectMessageEvent = new AutoResetEvent(false); Thread f_UpdateDirectMessagesThread; int f_UpdateDirectMessagesInterval = 120; decimal f_LastDirectMessageReceivedStatusID; decimal f_LastDirectMessageSentStatusID; bool f_Listening; bool f_IsConnected; int ErrorResponseCount { get; set; } const int MaxErrorResponseCount = 3; TwitterStatus[] StatusIndex { get; set; } int StatusIndexOffset { get; set; } Dictionary SearchStreams { get; set; } public override string NetworkID { get { if (f_TwitterUser == null) { return "Twitter"; } return String.Format("Twitter/{0}", f_TwitterUser.ScreenName); } } public override string Protocol { get { return "Twitter"; } } public override ChatModel Chat { get { return f_ProtocolChat; } } protected bool HasTokens { get { return f_OAuthTokens != null && f_OAuthTokens.HasConsumerToken && f_OAuthTokens.HasAccessToken; } } public TwitterProtocolManager(Session session) : base(session) { Trace.Call(session); f_FriendsTimelineChat = new GroupChatModel( TwitterChatType.FriendsTimeline.ToString(), _("Home Timeline"), this ); f_FriendsTimelineChat.InitMessageBuffer( MessageBufferPersistencyType.Volatile ); f_FriendsTimelineChat.ApplyConfig(Session.UserConfig); f_GroupChats.Add(f_FriendsTimelineChat); f_RepliesChat = new GroupChatModel( TwitterChatType.Replies.ToString(), _("Replies & Mentions"), this ); f_RepliesChat.InitMessageBuffer( MessageBufferPersistencyType.Volatile ); f_RepliesChat.ApplyConfig(Session.UserConfig); f_GroupChats.Add(f_RepliesChat); f_DirectMessagesChat = new GroupChatModel( TwitterChatType.DirectMessages.ToString(), _("Direct Messages"), this ); f_DirectMessagesChat.InitMessageBuffer( MessageBufferPersistencyType.Volatile ); f_DirectMessagesChat.ApplyConfig(Session.UserConfig); f_GroupChats.Add(f_DirectMessagesChat); StatusIndex = new TwitterStatus[99]; SearchStreams = new Dictionary(); } public override void Connect(FrontendManager fm, ServerModel server) { Trace.Call(fm, server); if (server == null) { throw new ArgumentNullException("server"); } f_Username = server.Username; var proxySettings = new ProxySettings(); proxySettings.ApplyConfig(Session.UserConfig); var twitterUrl = new OptionalProperties().APIBaseAddress; var proxy = proxySettings.GetWebProxy(twitterUrl); // HACK: Twitterizer will always use the system proxy if set to null // so explicitely override this by setting an empty proxy if (proxy == null) { f_WebProxy = new WebProxy(); } else { f_WebProxy = proxy; } f_OptionalProperties = CreateOptions(); f_ProtocolChat = new ProtocolChatModel(NetworkID, "Twitter " + f_Username, this); f_ProtocolChat.InitMessageBuffer( MessageBufferPersistencyType.Volatile ); f_ProtocolChat.ApplyConfig(Session.UserConfig); Session.AddChat(f_ProtocolChat); Session.SyncChat(f_ProtocolChat); MessageBuilder builder; if (proxy != null && proxy.Address != null) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Using proxy: {0}:{1}"), proxy.Address.Host, proxy.Address.Port); Session.AddMessageToChat(Chat, builder.ToMessage()); } if (!server.ValidateServerCertificate) { var whitelist = Session.CertificateValidator.HostnameWhitelist; lock (whitelist) { // needed for favicon if (!whitelist.Contains("www.twitter.com")) { whitelist.Add("www.twitter.com"); } if (!whitelist.Contains("api.twitter.com")) { whitelist.Add("api.twitter.com"); } if (!whitelist.Contains("stream.twitter.com")) { whitelist.Add("stream.twitter.com"); } } } string msgStr = _("Connecting to Twitter..."); if (fm != null) { fm.SetStatus(msgStr); } var msg = CreateMessageBuilder(). AppendEventPrefix().AppendText(msgStr).ToMessage(); Session.AddMessageToChat(Chat, msg); try { var key = GetApiKey(); f_OAuthTokens = new OAuthTokens(); f_OAuthTokens.ConsumerKey = key[0]; f_OAuthTokens.ConsumerSecret = key[1]; var password = server.Password ?? String.Empty; var access = password.Split('|'); if (access.Length == 2) { f_OAuthTokens.AccessToken = access[0]; f_OAuthTokens.AccessTokenSecret = access[1]; // verify access token var options = CreateOptions(); var response = TwitterAccount.VerifyCredentials( f_OAuthTokens, options ); if (response.Result == RequestResult.Unauthorized) { #if LOG4NET f_Logger.Warn("Connect(): Invalid access token, " + "re-authorization required"); #endif f_OAuthTokens.AccessToken = null; f_OAuthTokens.AccessTokenSecret = null; } } if (!f_OAuthTokens.HasAccessToken) { // new account or basic auth user that needs to be migrated var reqToken = OAuthUtility.GetRequestToken(key[0], key[1], "oob", f_WebProxy); f_RequestToken = reqToken.Token; var authUri = OAuthUtility.BuildAuthorizationUri(f_RequestToken); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Twitter authorization required.")); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); // TRANSLATOR: do NOT change the position of {0}! builder.AppendText( _("Please open the following URL and click " + "\"Allow\" to allow Smuxi to connect to your " + "Twitter account: {0}"), String.Empty ); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(" "); builder.AppendUrl(authUri.AbsoluteUri); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Once you have allowed Smuxi to access your " + "Twitter account, Twitter will provide a PIN.") ); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Please type: /pin PIN_FROM_TWITTER")); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); } } catch (Exception ex) { #if LOG4NET f_Logger.Error("Connect(): Exception", ex); #endif if (fm != null) { fm.SetStatus(_("Connection failed!")); } msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("Connection failed! Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); return; } // twitter is sometimes pretty slow, so fetch this in the background ThreadPool.QueueUserWorkItem(delegate { try { // FIXME: replace with AutoResetEvent while (!HasTokens) { Thread.Sleep(1000); } var message = _("Fetching user details from Twitter, please wait..."); msg = CreateMessageBuilder(). AppendEventPrefix().AppendText(message).ToMessage(); Session.AddMessageToChat(Chat, msg); UpdateUser(); message = _("Finished fetching user details."); msg = CreateMessageBuilder(). AppendEventPrefix().AppendText(message).ToMessage(); Session.AddMessageToChat(Chat, msg); f_IsConnected = true; message =_("Successfully connected to Twitter."); if (fm != null) { fm.UpdateNetworkStatus(); fm.SetStatus(message); } msg = CreateMessageBuilder(). AppendEventPrefix().AppendText(message).ToMessage(); Session.AddMessageToChat(Chat, msg); f_Listening = true; f_FriendsTimelineChat.PersonCount = f_RepliesChat.PersonCount = f_DirectMessagesChat.PersonCount = (int) f_TwitterUser.NumberOfFriends; OnConnected(EventArgs.Empty); } catch (Exception ex) { var message = _("Failed to fetch user details from Twitter. Reason: "); #if LOG4NET f_Logger.Error("Connect(): " + message, ex); #endif msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(message + ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); if (fm != null) { fm.SetStatus(_("Connection failed!")); } msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(_("Connection failed! Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); } }); ThreadPool.QueueUserWorkItem(delegate { try { // FIXME: replace with AutoResetEvent // f_TwitterUser needed for proper self detection in the // CreatePerson() method while (!HasTokens || f_TwitterUser == null) { Thread.Sleep(1000); } msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText( _("Fetching friends from Twitter, please wait...") ). ToMessage(); Session.AddMessageToChat(Chat, msg); UpdateFriends(); msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Finished fetching friends.")). ToMessage(); Session.AddMessageToChat(Chat, msg); } catch (Exception ex) { var message = _("Failed to fetch friends from Twitter. Reason: "); #if LOG4NET f_Logger.Error("Connect(): " + message, ex); #endif msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(message + ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); } }); OpenFriendsTimelineChat(); OpenRepliesChat(); OpenDirectMessagesChat(); } public override void Reconnect(FrontendManager fm) { Trace.Call(fm); } public override void Disconnect(FrontendManager fm) { Trace.Call(fm); f_Listening = false; f_FriendsTimelineEvent.Set(); } public override IList FindGroupChats(GroupChatModel filter) { Trace.Call(filter); return f_GroupChats; } public override void OpenChat(FrontendManager fm, ChatModel chat) { Trace.Call(fm, chat); if (chat.ChatType == ChatType.Group) { TwitterChatType twitterChatType = (TwitterChatType) Enum.Parse(typeof(TwitterChatType), chat.ID); switch (twitterChatType) { case TwitterChatType.FriendsTimeline: OpenFriendsTimelineChat(); break; case TwitterChatType.Replies: OpenRepliesChat(); break; case TwitterChatType.DirectMessages: OpenDirectMessagesChat(); break; } return; } OpenPrivateChat(chat.ID); } private void OpenFriendsTimelineChat() { ChatModel chat = Session.GetChat( TwitterChatType.FriendsTimeline.ToString(), ChatType.Group, this ); if (chat != null) { return; } if (f_UpdateFriendsTimelineThread != null && f_UpdateFriendsTimelineThread.IsAlive) { return; } // BUG: causes a race condition as the frontend syncs the // unpopulated chat! So only add it if it's ready //Session.AddChat(f_FriendsTimelineChat); f_UpdateFriendsTimelineThread = new Thread( new ThreadStart(UpdateFriendsTimelineThread) ); f_UpdateFriendsTimelineThread.IsBackground = true; f_UpdateFriendsTimelineThread.Name = "TwitterProtocolManager friends timeline listener"; f_UpdateFriendsTimelineThread.Start(); } private void OpenRepliesChat() { ChatModel chat = Session.GetChat( TwitterChatType.Replies.ToString(), ChatType.Group, this ); if (chat != null) { return; } if (f_UpdateRepliesThread != null && f_UpdateRepliesThread.IsAlive) { return; } // BUG: causes a race condition as the frontend syncs the // unpopulated chat! So only add it if it's ready //Session.AddChat(f_RepliesChat); f_UpdateRepliesThread = new Thread( new ThreadStart(UpdateRepliesThread) ); f_UpdateRepliesThread.IsBackground = true; f_UpdateRepliesThread.Name = "TwitterProtocolManager replies listener"; f_UpdateRepliesThread.Start(); } private void OpenDirectMessagesChat() { ChatModel chat = Session.GetChat( TwitterChatType.DirectMessages.ToString(), ChatType.Group, this ); if (chat != null) { return; } if (f_UpdateDirectMessagesThread != null && f_UpdateDirectMessagesThread.IsAlive) { return; } // BUG: causes a race condition as the frontend syncs the // unpopulated chat! So only add it if it's ready //Session.AddChat(f_DirectMessagesChat); f_UpdateDirectMessagesThread = new Thread( new ThreadStart(UpdateDirectMessagesThread) ); f_UpdateDirectMessagesThread.IsBackground = true; f_UpdateDirectMessagesThread.Name = "TwitterProtocolManager direct messages listener"; f_UpdateDirectMessagesThread.Start(); } private ChatModel OpenPrivateChat(string userId) { return OpenPrivateChat(Decimal.Parse(userId)); } private ChatModel OpenPrivateChat(decimal userId) { ChatModel chat = Session.GetChat( userId.ToString(), ChatType.Person, this ); if (chat != null) { return chat; } var response = TwitterUser.Show(f_OAuthTokens, userId, f_OptionalProperties); CheckResponse(response); var user = response.ResponseObject; PersonModel person = CreatePerson(user); PersonChatModel personChat = new PersonChatModel( person, user.Id.ToString(), user.ScreenName, this ); personChat.InitMessageBuffer( MessageBufferPersistencyType.Volatile ); personChat.ApplyConfig(Session.UserConfig); Session.AddChat(personChat); Session.SyncChat(personChat); return personChat; } public override void CloseChat(FrontendManager fm, ChatModel chat) { Trace.Call(fm, chat); TwitterChatType? chatType = null; if (chat.ChatType == ChatType.Group) { try { chatType = (TwitterChatType) Enum.Parse( typeof(TwitterChatType), chat.ID ); } catch (ArgumentException) { } } if (chatType.HasValue) { switch (chatType.Value) { case TwitterChatType.FriendsTimeline: if (f_UpdateFriendsTimelineThread != null && f_UpdateFriendsTimelineThread.IsAlive) { f_UpdateFriendsTimelineThread.Abort(); } break; case TwitterChatType.Replies: if (f_UpdateRepliesThread != null && f_UpdateRepliesThread.IsAlive) { f_UpdateRepliesThread.Abort(); } break; case TwitterChatType.DirectMessages: if (f_UpdateDirectMessagesThread != null && f_UpdateDirectMessagesThread.IsAlive) { f_UpdateDirectMessagesThread.Abort(); } break; } } else { // no static/singleton chat, but maybe a search? TwitterSearchStream stream; lock (SearchStreams) { if (SearchStreams.TryGetValue(chat.ID, out stream)) { SearchStreams.Remove(chat.ID); stream.Dispose(); } } } Session.RemoveChat(chat); } public override void SetPresenceStatus(PresenceStatus status, string message) { Trace.Call(status, message); // TODO: implement me // should we send updates here?!? } public override bool Command(CommandModel command) { bool handled = false; if (command.IsCommand) { if (f_IsConnected) { switch (command.Command) { case "msg": case "query": CommandMessage(command); handled = true; break; case "timeline": CommandTimeline(command); handled = true; break; case "follow": CommandFollow(command); handled = true; break; case "unfollow": CommandUnfollow(command); handled = true; break; case "search": case "join": CommandSearch(command); handled = true; break; case "rt": case "retweet": CommandRetweet(command); handled = true; break; case "reply": CommandReply(command); handled = true; break; case "say": CommandSay(command); handled = true; break; case "del": case "delete": CommandDelete(command); handled = true; break; case "fav": case "favourite": case "favorite": CommandFavorite(command); handled = true; break; case "unfav": case "unfavourite": case "unfavorite": CommandUnfavorite(command); handled = true; break; } } switch (command.Command) { case "help": CommandHelp(command); handled = true; break; case "connect": CommandConnect(command); handled = true; break; case "pin": CommandPin(command); handled = true; break; } } else { if (f_IsConnected) { CommandSay(command); handled = true; } else { NotConnected(command); handled = true; } } return handled; } public override string ToString() { if (f_TwitterUser == null) { return NetworkID; } return String.Format("{0} (Twitter)", f_TwitterUser.ScreenName); } public void CommandHelp(CommandModel cd) { var builder = CreateMessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of commands below builder.AppendHeader(_("Twitter Commands")); Session.AddMessageToFrontend(cd, builder.ToMessage()); string[] help = { "connect twitter username", "pin pin-number", "follow screen-name|user-id", "unfollow screen-name|user-id", "search keyword", "retweet/rt index-number|tweet-id", "reply index-number|tweet-id message", "delete/del index-number|tweet-id", "favorite/fav index-number|tweet-id", "unfavorite/unfav index-number|tweet-id", }; foreach (string line in help) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); Session.AddMessageToFrontend(cd, builder.ToMessage()); } } public void CommandConnect(CommandModel cd) { var server = new ServerModel(); if (cd.DataArray.Length >= 3) { server.Username = cd.DataArray[2]; } else { NotEnoughParameters(cd); return; } Connect(cd.FrontendManager, server); } public void CommandPin(CommandModel cd) { if (String.IsNullOrEmpty(cd.Parameter)) { NotEnoughParameters(cd); return; } var pin = cd.Parameter.Trim(); MessageBuilder builder; if (String.IsNullOrEmpty(f_RequestToken)) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("No pending authorization request!")); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); return; } var reqToken = f_RequestToken; f_RequestToken = null; var key = GetApiKey(); OAuthTokenResponse response; try { response = OAuthUtility.GetAccessToken(key[0], key[1], reqToken, pin, f_WebProxy); } catch (Exception ex) { #if LOG4NET f_Logger.Error("CommandPin(): GetAccessToken() threw Exception!", ex); #endif builder = CreateMessageBuilder(); builder.AppendEventPrefix(); // TRANSLATOR: {0} contains the reason of the failure builder.AppendText( _("Failed to authorize with Twitter: {0}"), ex.Message ); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Twitter did not accept your PIN. " + "Did you enter it correctly?") ); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Please retry by closing this tab and reconnecting to " + "the Twitter \"{0}\" account."), f_Username ); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); // allow the user to re-enter the pin // LAME: An incorrect PIN invalidates the request token! //f_RequestToken = reqToken; return; } #if LOG4NET f_Logger.Debug("CommandPin(): retrieved " + " AccessToken: " + response.Token + " AccessTokenSecret: " + response.TokenSecret + " ScreenName: " + response.ScreenName + " UserId: " + response.UserId); #endif var servers = new ServerListController(Session.UserConfig); var server = servers.GetServer(Protocol, response.ScreenName); if (server == null) { server = new ServerModel() { Protocol = Protocol, Network = String.Empty, Hostname = response.ScreenName, Username = response.ScreenName, Password = String.Format("{0}|{1}", response.Token, response.TokenSecret), OnStartupConnect = true }; servers.AddServer(server); var obsoleteServer = servers.GetServer(Protocol, String.Empty); if (obsoleteServer != null && obsoleteServer.Username.ToLower() == response.ScreenName.ToLower()) { // found an old server entry for this user using basic auth servers.RemoveServer(Protocol, String.Empty); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Migrated Twitter account from basic auth to OAuth.") ); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); } } else { // update token server.Password = String.Format("{0}|{1}", response.Token, response.TokenSecret); servers.SetServer(server); } servers.Save(); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Successfully authorized Twitter account " + "\"{0}\" for Smuxi"), response.ScreenName); Session.AddMessageToChat(f_ProtocolChat, builder.ToMessage()); f_OAuthTokens.AccessToken = response.Token; f_OAuthTokens.AccessTokenSecret = response.TokenSecret; f_Username = response.ScreenName; } public void CommandSay(CommandModel cmd) { if (cmd.Chat.ChatType == ChatType.Group) { TwitterChatType twitterChatType = (TwitterChatType) Enum.Parse(typeof(TwitterChatType), cmd.Chat.ID); switch (twitterChatType) { case TwitterChatType.FriendsTimeline: case TwitterChatType.Replies: { try { PostUpdate(cmd); } catch (Exception ex) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("Could not update status - Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } break; } case TwitterChatType.DirectMessages: { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("Cannot send message - no target specified. " + "Use: /msg $nick message")). ToMessage(); Session.AddMessageToFrontend(cmd, msg); break; } } } else if (cmd.Chat.ChatType == ChatType.Person) { try { SendMessage(cmd); } catch (Exception ex) { #if LOG4NET f_Logger.Error(ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("Could not send message - Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } } else { // ignore protocol chat } } public void CommandTimeline(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } string keyword = cmd.Parameter; string[] users = cmd.Parameter.Split(','); string chatName = users.Length > 1 ? _("Other timelines") : "@" + users[0]; ChatModel chat; if (users.Length > 1) { chat = Session.CreateChat(keyword, chatName, this); } else { var userResponse = TwitterUser.Show(f_OAuthTokens, users [0], f_OptionalProperties); CheckResponse(userResponse); var person = GetPerson(userResponse.ResponseObject); chat = Session.CreatePersonChat(person, person.ID + "/timeline", chatName, this); } var statuses = new List(); foreach (var user in users) { var opts = CreateOptions(); opts.ScreenName = user; var statusCollectionResponse = TwitterTimeline.UserTimeline(f_OAuthTokens, opts); CheckResponse(statusCollectionResponse); foreach (var status in statusCollectionResponse.ResponseObject) { statuses.Add(status); } } var sortedStatuses = SortTimeline(statuses); foreach (var status in sortedStatuses) { AddIndexToStatus(status); var msg = CreateMessageBuilder(). Append(status, GetPerson(status.User)).ToMessage(); chat.MessageBuffer.Add(msg); var userId = status.User.Id.ToString(); var groupChat = chat as GroupChatModel; if (groupChat != null) { if (!groupChat.UnsafePersons.ContainsKey(userId)) { groupChat.UnsafePersons.Add(userId, GetPerson(status.User)); } } } Session.AddChat(chat); Session.SyncChat(chat); } public void CommandMessage(CommandModel cmd) { string nickname; if (cmd.DataArray.Length >= 2) { nickname = cmd.DataArray[1]; } else { NotEnoughParameters(cmd); return; } var response = TwitterUser.Show(f_OAuthTokens, nickname, f_OptionalProperties); if (response.Result != RequestResult.Success) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(_("Could not send message - the " + "specified user does not exist.")). ToMessage(); Session.AddMessageToFrontend(cmd, msg); return; } var user = response.ResponseObject; var chat = OpenPrivateChat(user.Id); if (cmd.DataArray.Length >= 3) { string message = String.Join(" ", cmd.DataArray, 2, cmd.DataArray.Length-2); try { SendMessage(user.ScreenName, message); } catch (Exception ex) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("Could not send message - Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToFrontend(cmd.FrontendManager, chat, msg); } } } public void CommandFollow(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } var chat = cmd.Chat as GroupChatModel; if (chat == null) { return; } var options = CreateOptions(); options.Follow = true; decimal userId; TwitterResponse res; if (Decimal.TryParse(cmd.Parameter, out userId)) { // parameter is an ID res = TwitterFriendship.Create(f_OAuthTokens, userId, options); } else { // parameter is a screen name var screenName = cmd.Parameter; res = TwitterFriendship.Create(f_OAuthTokens, screenName, options); } CheckResponse(res); var person = CreatePerson(res.ResponseObject); if (chat.GetPerson(person.ID) == null) { Session.AddPersonToGroupChat(chat, person); } } public void CommandUnfollow(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } var chat = cmd.Chat as GroupChatModel; if (chat == null) { return; } PersonModel person; var persons = chat.Persons; if (persons.TryGetValue(cmd.Parameter, out person)) { // parameter is an ID decimal userId; Decimal.TryParse(cmd.Parameter, out userId); var res = TwitterFriendship.Delete(f_OAuthTokens, userId, f_OptionalProperties); CheckResponse(res); } else { // parameter is a screen name var screenName = cmd.Parameter; person = persons.SingleOrDefault((arg) => arg.Value.IdentityName == screenName).Value; if (person == null) { return; } var res = TwitterFriendship.Delete(f_OAuthTokens, screenName, f_OptionalProperties); CheckResponse(res); } Session.RemovePersonFromGroupChat(chat, person); } public bool IsHomeTimeLine(ChatModel chatModel) { return chatModel.Equals(f_FriendsTimelineChat); } private List SortTimeline(IList timeline) { List sortedTimeline = new List( timeline ); sortedTimeline.Sort( (a, b) => (a.CreatedDate.CompareTo(b.CreatedDate)) ); return sortedTimeline; } public void CommandSearch(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } var keyword = cmd.Parameter; var chatName = String.Format(_("Search {0}"), keyword); var chat = Session.CreateChat(keyword, chatName, this); Session.AddChat(chat); var options = CreateOptions(); options.Count = 50; var response = TwitterSearch.Search(f_OAuthTokens, keyword, options); CheckResponse(response); var search = response.ResponseObject; var sortedSearch = SortTimeline(search); foreach (var status in sortedSearch) { AddIndexToStatus(status); var msg = CreateMessageBuilder(). Append(status, GetPerson(status.User)). ToMessage(); chat.MessageBuffer.Add(msg); var userId = status.User.Id.ToString(); if (!chat.UnsafePersons.ContainsKey(userId)) { chat.UnsafePersons.Add(userId, GetPerson(status.User)); } } Session.SyncChat(chat); var stream = new TwitterSearchStream(this, chat, keyword, f_OAuthTokens, f_WebProxy); lock (SearchStreams) { SearchStreams.Add(chat.ID, stream); } } public void CommandRetweet(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } TwitterStatus status = null; int indexId; if (Int32.TryParse(cmd.Parameter, out indexId)) { status = GetStatusFromIndex(indexId); } decimal statusId; if (status == null) { if (!Decimal.TryParse(cmd.Parameter, out statusId)) { return; } } else { statusId = status.Id; } var response = TwitterStatus.Retweet(f_OAuthTokens, statusId, f_OptionalProperties); CheckResponse(response); status = response.ResponseObject; var msg = CreateMessageBuilder(). Append(status, GetPerson(status.User)). ToMessage(); Session.AddMessageToChat(f_FriendsTimelineChat, msg); } public void CommandReply(CommandModel cmd) { if (cmd.DataArray.Length < 3) { NotEnoughParameters(cmd); return; } var id = cmd.DataArray[1]; TwitterStatus status = null; int indexId; if (Int32.TryParse(id, out indexId)) { status = GetStatusFromIndex(indexId); } decimal statusId; if (status == null) { if (!Decimal.TryParse(id, out statusId)) { return; } var response = TwitterStatus.Show(f_OAuthTokens, statusId, f_OptionalProperties); CheckResponse(response); status = response.ResponseObject; } var text = String.Join(" ", cmd.DataArray.Skip(2).ToArray()); // the screen name must be somewhere in the message for replies if (!text.Contains("@" + status.User.ScreenName)) { text = String.Format("@{0} {1}", status.User.ScreenName, text); } var options = CreateOptions(); options.InReplyToStatusId = status.Id; PostUpdate(text, options); } public void CommandDelete(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } TwitterStatus status = null; int indexId; if (Int32.TryParse(cmd.Parameter, out indexId)) { status = GetStatusFromIndex(indexId); } decimal statusId; if (status == null) { if (!Decimal.TryParse(cmd.Parameter, out statusId)) { return; } } else { statusId = status.Id; } var response = TwitterStatus.Delete(f_OAuthTokens, statusId, f_OptionalProperties); CheckResponse(response); status = response.ResponseObject; var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendFormat(_("Successfully deleted tweet {0}."), cmd.Parameter). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } public void CommandFavorite(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } TwitterStatus status = null; int indexId; if (Int32.TryParse(cmd.Parameter, out indexId)) { status = GetStatusFromIndex(indexId); } decimal statusId; if (status == null) { if (!Decimal.TryParse(cmd.Parameter, out statusId)) { return; } } else { statusId = status.Id; } var response = TwitterFavorite.Create(f_OAuthTokens, statusId, f_OptionalProperties); CheckResponse(response); status = response.ResponseObject; var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendFormat(_("Successfully favorited tweet {0}."), cmd.Parameter). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } public void CommandUnfavorite(CommandModel cmd) { if (cmd.DataArray.Length < 2) { NotEnoughParameters(cmd); return; } TwitterStatus status = null; int indexId; if (Int32.TryParse(cmd.Parameter, out indexId)) { status = GetStatusFromIndex(indexId); } decimal statusId; if (status == null) { if (!Decimal.TryParse(cmd.Parameter, out statusId)) { return; } } else { statusId = status.Id; } var response = TwitterFavorite.Delete(f_OAuthTokens, statusId, f_OptionalProperties); CheckResponse(response); status = response.ResponseObject; var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendFormat(_("Successfully unfavorited tweet {0}."), cmd.Parameter). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } private List SortTimeline(TwitterDirectMessageCollection timeline) { var sortedTimeline = new List(timeline.Count); foreach (TwitterDirectMessage msg in timeline) { sortedTimeline.Add(msg); } sortedTimeline.Sort( (a, b) => (a.CreatedDate.CompareTo(b.CreatedDate)) ); return sortedTimeline; } private void UpdateFriendsTimelineThread() { Trace.Call(); try { // query the timeline only after we have fetched the user and friends while (f_TwitterUser == null /*|| f_TwitterUser.IsEmpty*/ || f_Friends == null) { Thread.Sleep(1000); } // populate friend list lock (f_Friends) { foreach (PersonModel friend in f_Friends.Values) { f_FriendsTimelineChat.UnsafePersons.Add(friend.ID, friend); } } Session.AddChat(f_FriendsTimelineChat); Session.SyncChat(f_FriendsTimelineChat); while (f_Listening) { try { UpdateFriendsTimeline(); } catch (TwitterizerException ex) { CheckTwitterizerException(ex); } catch (WebException ex) { CheckWebException(ex); } // only poll once per interval or when we get fired f_FriendsTimelineEvent.WaitOne( f_UpdateFriendsTimelineInterval * 1000, false ); } } catch (ThreadAbortException) { #if LOG4NET f_Logger.Debug("UpdateFriendsTimelineThread(): thread aborted"); #endif } catch (Exception ex) { #if LOG4NET f_Logger.Error("UpdateFriendsTimelineThread(): Exception", ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("An error occurred while fetching the friends " + "timeline from Twitter. Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); } finally { #if LOG4NET f_Logger.Debug("UpdateFriendsTimelineThread(): finishing thread."); #endif lock (Session.Chats) { if (Session.Chats.Contains(f_FriendsTimelineChat)) { Session.RemoveChat(f_FriendsTimelineChat); } } f_FriendsTimelineChat.UnsafePersons.Clear(); } } private void UpdateFriendsTimeline() { Trace.Call(); #if LOG4NET f_Logger.Debug("UpdateFriendsTimeline(): getting friend timeline from twitter..."); #endif var options = CreateOptions(); options.SinceStatusId = f_LastFriendsTimelineStatusID; options.Count = 50; var response = TwitterTimeline.HomeTimeline(f_OAuthTokens, options); // ignore temporarily issues if (IsTemporilyErrorResponse(response)) { return; } CheckResponse(response); var timeline = response.ResponseObject; #if LOG4NET f_Logger.Debug("UpdateFriendsTimeline(): done. New tweets: " + timeline.Count); #endif if (timeline.Count == 0) { return; } List sortedTimeline = SortTimeline(timeline); foreach (TwitterStatus status in sortedTimeline) { AddIndexToStatus(status); var msg = CreateMessageBuilder(). Append(status, GetPerson(status.User)). ToMessage(); Session.AddMessageToChat(f_FriendsTimelineChat, msg); if (status.User.Id.ToString() == Me.ID) { OnMessageSent( new MessageEventArgs(f_FriendsTimelineChat, msg, null, status.InReplyToScreenName ?? String.Empty) ); } else { OnMessageReceived( new MessageEventArgs(f_FriendsTimelineChat, msg, status.User.ScreenName, status.InReplyToScreenName ?? String.Empty) ); } f_LastFriendsTimelineStatusID = status.Id; } } private void UpdateRepliesThread() { Trace.Call(); try { // query the replies only after we have fetched the user and friends while (f_TwitterUser == null /*|| f_TwitterUser.IsEmpty*/ || f_Friends == null) { Thread.Sleep(1000); } // populate friend list lock (f_Friends) { foreach (PersonModel friend in f_Friends.Values) { f_RepliesChat.UnsafePersons.Add(friend.ID, friend); } } Session.AddChat(f_RepliesChat); Session.SyncChat(f_RepliesChat); while (f_Listening) { try { UpdateReplies(); } catch (TwitterizerException ex) { CheckTwitterizerException(ex); } catch (WebException ex) { CheckWebException(ex); } // only poll once per interval Thread.Sleep(f_UpdateRepliesInterval * 1000); } } catch (ThreadAbortException) { #if LOG4NET f_Logger.Debug("UpdateRepliesThread(): thread aborted"); #endif } catch (Exception ex) { #if LOG4NET f_Logger.Error("UpdateRepliesThread(): Exception", ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("An error occurred while fetching the replies " + "from Twitter. Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); } finally { #if LOG4NET f_Logger.Debug("UpdateRepliesThread(): finishing thread."); #endif lock (Session.Chats) { if (Session.Chats.Contains(f_RepliesChat)) { Session.RemoveChat(f_RepliesChat); } } f_RepliesChat.UnsafePersons.Clear(); } } private void UpdateReplies() { Trace.Call(); #if LOG4NET f_Logger.Debug("UpdateReplies(): getting replies from twitter..."); #endif var options = CreateOptions(); options.SinceStatusId = f_LastReplyStatusID; var response = TwitterTimeline.Mentions(f_OAuthTokens, options); // ignore temporarily issues if (IsTemporilyErrorResponse(response)) { return; } CheckResponse(response); var timeline = response.ResponseObject; #if LOG4NET f_Logger.Debug("UpdateReplies(): done. New replies: " + timeline.Count); #endif if (timeline.Count == 0) { return; } // if this isn't the first time we receive replies, this is new! bool highlight = f_LastReplyStatusID != 0; List sortedTimeline = SortTimeline(timeline); foreach (TwitterStatus status in sortedTimeline) { AddIndexToStatus(status); var msg = CreateMessageBuilder(). Append(status, GetPerson(status.User), highlight). ToMessage(); Session.AddMessageToChat(f_RepliesChat, msg); OnMessageReceived( new MessageEventArgs(f_RepliesChat, msg, status.User.ScreenName, status.InReplyToScreenName ?? String.Empty) ); f_LastReplyStatusID = status.Id; } } private void UpdateDirectMessagesThread() { Trace.Call(); try { // query the messages only after we have fetched the user and friends while (f_TwitterUser == null || f_Friends == null) { Thread.Sleep(1000); } // populate friend list lock (f_Friends) { foreach (PersonModel friend in f_Friends.Values) { f_DirectMessagesChat.UnsafePersons.Add(friend.ID, friend); } } Session.AddChat(f_DirectMessagesChat); Session.SyncChat(f_DirectMessagesChat); while (f_Listening) { try { UpdateDirectMessages(); } catch (TwitterizerException ex) { CheckTwitterizerException(ex); } catch (WebException ex) { CheckWebException(ex); } // only poll once per interval or when we get fired f_DirectMessageEvent.WaitOne( f_UpdateDirectMessagesInterval * 1000, false ); } } catch (ThreadAbortException) { #if LOG4NET f_Logger.Debug("UpdateDirectMessagesThread(): thread aborted"); #endif } catch (Exception ex) { #if LOG4NET f_Logger.Error("UpdateDirectMessagesThread(): Exception", ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText( _("An error occurred while fetching direct messages " + "from Twitter. Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); } finally { #if LOG4NET f_Logger.Debug("UpdateDirectMessagesThread(): finishing thread."); #endif lock (Session.Chats) { if (Session.Chats.Contains(f_DirectMessagesChat)) { Session.RemoveChat(f_DirectMessagesChat); } } f_DirectMessagesChat.UnsafePersons.Clear(); } } private void UpdateDirectMessages() { Trace.Call(); #if LOG4NET f_Logger.Debug("UpdateDirectMessages(): getting received direct messages from twitter..."); #endif var options = CreateOptions(); options.SinceStatusId = f_LastDirectMessageReceivedStatusID; options.Count = 50; var response = TwitterDirectMessage.DirectMessages( f_OAuthTokens, options ); // ignore temporarily issues if (IsTemporilyErrorResponse(response)) { return; } CheckResponse(response); var receivedTimeline = response.ResponseObject; #if LOG4NET f_Logger.Debug("UpdateDirectMessages(): done. New messages: " + (receivedTimeline == null ? 0 : receivedTimeline.Count)); #endif #if LOG4NET f_Logger.Debug("UpdateDirectMessages(): getting sent direct messages from twitter..."); #endif var sentOptions = CreateOptions(); sentOptions.SinceStatusId = f_LastDirectMessageSentStatusID; sentOptions.Count = 50; response = TwitterDirectMessage.DirectMessagesSent( f_OAuthTokens, sentOptions ); // ignore temporarily issues if (IsTemporilyErrorResponse(response)) { return; } CheckResponse(response); var sentTimeline = response.ResponseObject; #if LOG4NET f_Logger.Debug("UpdateDirectMessages(): done. New messages: " + (sentTimeline == null ? 0 : sentTimeline.Count)); #endif var timeline = new TwitterDirectMessageCollection(); if (receivedTimeline != null) { foreach (TwitterDirectMessage msg in receivedTimeline) { timeline.Add(msg); } } if (sentTimeline != null) { foreach (TwitterDirectMessage msg in sentTimeline) { timeline.Add(msg); } } if (timeline.Count == 0) { // nothing to do return; } var sortedTimeline = SortTimeline(timeline); foreach (TwitterDirectMessage directMsg in sortedTimeline) { // if this isn't the first time a receive a direct message, // this is a new one! bool highlight = receivedTimeline.Contains(directMsg) && f_LastDirectMessageReceivedStatusID != 0; var msg = CreateMessageBuilder(). Append(directMsg, GetPerson(directMsg.Sender), highlight). ToMessage(); Session.AddMessageToChat(f_DirectMessagesChat, msg); // if there is a tab open for this user put the message there too string userId; if (receivedTimeline.Contains(directMsg)) { // this is a received message userId = directMsg.SenderId.ToString(); OnMessageReceived( new MessageEventArgs(f_DirectMessagesChat, msg, directMsg.SenderScreenName, null) ); } else { // this is a sent message userId = directMsg.RecipientId.ToString(); OnMessageSent( new MessageEventArgs(f_DirectMessagesChat, msg, null, directMsg.RecipientScreenName) ); } ChatModel chat = Session.GetChat( userId, ChatType.Person, this ); if (chat != null) { Session.AddMessageToChat(chat, msg); } } if (receivedTimeline != null) { // first one is the newest foreach (TwitterDirectMessage msg in receivedTimeline) { f_LastDirectMessageReceivedStatusID = msg.Id; break; } } if (sentTimeline != null) { // first one is the newest foreach (TwitterDirectMessage msg in sentTimeline) { f_LastDirectMessageSentStatusID = msg.Id; break; } } } private void UpdateFriends() { Trace.Call(); if (f_Friends != null) { return; } #if LOG4NET f_Logger.Debug("UpdateFriends(): fetching friend IDs from twitter..."); #endif var options = CreateOptions(); options.UserId = f_TwitterUser.Id; var response = TwitterFriendship.FriendsIds( f_OAuthTokens, options ); CheckResponse(response); var friendIds = response.ResponseObject; #if LOG4NET f_Logger.Debug("UpdateFriends(): done. Fetched IDs: " + friendIds.Count); #endif var persons = new Dictionary(friendIds.Count); // users/lookup only permits 100 users per call var pageSize = 100; var idList = new List(friendIds); var idPages = new List>(); for (int offset = 0; offset < idList.Count; offset += pageSize) { var count = Math.Min(pageSize, idList.Count - offset); idPages.Add(idList.GetRange(offset, count)); } foreach (var idPage in idPages) { #if LOG4NET f_Logger.Debug("UpdateFriends(): fetching friends from twitter..."); #endif var userIds = new TwitterIdCollection(idPage); var lookupOptions = CreateOptions(); lookupOptions.UserIds = userIds; var lookupResponse = TwitterUser.Lookup(f_OAuthTokens, lookupOptions); CheckResponse(lookupResponse); var friends = lookupResponse.ResponseObject; #if LOG4NET f_Logger.Debug("UpdateFriends(): done. Fetched friends: " + friends.Count); #endif foreach (var friend in friends) { var person = CreatePerson(friend); persons.Add(person.ID, person); } } f_Friends = persons; } private void UpdateUser() { #if LOG4NET f_Logger.Debug("UpdateUser(): getting user details from twitter..."); #endif var response = TwitterUser.Show(f_OAuthTokens, f_Username, f_OptionalProperties); CheckResponse(response); var user = response.ResponseObject; f_TwitterUser = user; Me = CreatePerson(f_TwitterUser); #if LOG4NET f_Logger.Debug("UpdateUser(): done."); #endif } protected new TwitterMessageBuilder CreateMessageBuilder() { return CreateMessageBuilder(); } private T CreateOptions() where T : OptionalProperties, new() { var options = new T() { Proxy = f_WebProxy }; return options; } void PostUpdate(CommandModel cmd) { var text = cmd.IsCommand ? cmd.Parameter : cmd.Data; PostUpdate(text); } void PostUpdate(string text) { PostUpdate(text, null); } void PostUpdate(string text, StatusUpdateOptions options) { if (options == null) { options = CreateOptions(); } var res = TwitterStatus.Update(f_OAuthTokens, text, options); CheckResponse(res); f_FriendsTimelineEvent.Set(); } void SendMessage(CommandModel cmd) { var text = cmd.IsCommand ? cmd.Parameter : cmd.Data; SendMessage(cmd.Chat.Name, text); } private void SendMessage(string target, string text) { var res = TwitterDirectMessage.Send(f_OAuthTokens, target, text, f_OptionalProperties); CheckResponse(res); f_DirectMessageEvent.Set(); } void AddIndexToStatus(TwitterStatus status) { lock (StatusIndex) { var slot = ++StatusIndexOffset; if (slot > StatusIndex.Length) { StatusIndexOffset = 1; slot = 1; } StatusIndex[slot - 1] = status; status.Text = String.Format("[{0:00}] {1}", slot, status.Text); var rtStatus = status.RetweetedStatus; if (rtStatus != null) { rtStatus.Text = String.Format("[{0:00}] {1}", slot, rtStatus.Text); } } } TwitterStatus GetStatusFromIndex(int slot) { lock (StatusIndex) { if (slot > StatusIndex.Length || slot < 1) { return null; } return StatusIndex[slot - 1]; } } private void CheckTwitterizerException(TwitterizerException exception) { Trace.Call(exception == null ? null : exception.GetType()); if (exception.InnerException is WebException) { CheckWebException((WebException) exception.InnerException); return; } else if (exception.InnerException != null) { #if LOG4NET f_Logger.Warn("CheckTwitterizerException(): unknown inner exception: " + exception.InnerException.GetType(), exception.InnerException); #endif } throw exception; } private void CheckWebException(WebException exception) { Trace.Call(exception == null ? null : exception.GetType()); switch (exception.Status) { case WebExceptionStatus.ConnectFailure: case WebExceptionStatus.ConnectionClosed: case WebExceptionStatus.Timeout: case WebExceptionStatus.ReceiveFailure: case WebExceptionStatus.NameResolutionFailure: case WebExceptionStatus.ProxyNameResolutionFailure: // ignore temporarly issues #if LOG4NET f_Logger.Warn("CheckWebException(): ignored exception", exception); #endif return; } if (exception.InnerException != null) { if (exception.InnerException is System.IO.IOException) { // sometimes data can't be read from the transport connection, e.g.: // System.Net.WebException: Unable to read data from the transport connection: Connection reset by peer #if LOG4NET f_Logger.Warn("CheckWebException(): ignored inner-exception", exception.InnerException); #endif return; } else { #if LOG4NET f_Logger.Error("CheckWebException(): inner-exception", exception.InnerException); #endif } } /* http://apiwiki.twitter.com/HTTP-Response-Codes-and-Errors * 200 OK: Success! * 304 Not Modified: There was no new data to return. * 400 Bad Request: The request was invalid. An accompanying error * message will explain why. This is the status code will be * returned during rate limiting. * 401 Unauthorized: Authentication credentials were missing or * incorrect. * 403 Forbidden: The request is understood, but it has been * refused. An accompanying error message will explain why. * This code is used when requests are being denied due to * update limits. * 404 Not Found: The URI requested is invalid or the resource * requested, such as a user, does not exists. * 406 Not Acceptable: Returned by the Search API when an invalid * format is specified in the request. * 500 Internal Server Error: Something is broken. Please post to * the group so the Twitter team can investigate. * 502 Bad Gateway: Twitter is down or being upgraded. * 503 Service Unavailable: The Twitter servers are up, but * overloaded with requests. Try again later. The search and * trend methods use this to indicate when you are being rate * limited. */ HttpWebResponse httpRes = exception.Response as HttpWebResponse; if (httpRes == null) { throw exception; } switch (httpRes.StatusCode) { case HttpStatusCode.BadGateway: case HttpStatusCode.BadRequest: case HttpStatusCode.Forbidden: case HttpStatusCode.ServiceUnavailable: case HttpStatusCode.GatewayTimeout: // ignore temporarly issues #if LOG4NET f_Logger.Warn("CheckWebException(): ignored exception", exception); #endif return; default: #if LOG4NET f_Logger.Error("CheckWebException(): " + "Status: " + exception.Status + " " + "ResponseUri: " + exception.Response.ResponseUri); #endif throw exception; } } private void CheckResponse(TwitterResponse response) where T : ITwitterObject { if (response == null) { throw new ArgumentNullException("response"); } if (response.Result == RequestResult.Success) { return; } #if LOG4NET f_Logger.Error("CheckResponse(): " + "RequestUrl: " + response.RequestUrl + " " + "Result: " + response.Result + " " + "Content:\n" + response.Content); #endif // HACK: Twitter returns HTML code saying they are overloaded o_O if (response.Result == RequestResult.Unknown && response.ErrorMessage == null) { response.ErrorMessage = _("Twitter didn't send a valid response, they're probably overloaded"); } throw new TwitterizerException(response.ErrorMessage); } private bool IsTemporilyErrorResponse(TwitterResponse response) where T : ITwitterObject { if (response == null) { throw new ArgumentNullException("response"); } switch (response.Result) { case RequestResult.Success: // no error at all ErrorResponseCount = 0; return false; case RequestResult.ConnectionFailure: case RequestResult.RateLimited: case RequestResult.TwitterIsDown: case RequestResult.TwitterIsOverloaded: // probably "Twitter is over capacity" case RequestResult.Unknown: #if LOG4NET f_Logger.Debug("IsTemporilyErrorResponse(): " + "Detected temporily error " + "RequestUrl: " + response.RequestUrl + " " + "Result: " + response.Result + " " + "Content:\n" + response.Content); #endif return true; } if (ErrorResponseCount++ < MaxErrorResponseCount) { #if LOG4NET f_Logger.WarnFormat( "IsTemporilyErrorResponse(): Ignoring permanent error " + "({0}/{1}) " + "RequestUrl: {2} " + "Result: {3} " + "Content:\n{4}", ErrorResponseCount, MaxErrorResponseCount, response.RequestUrl, response.Result, response.Content ); #endif return true; } #if LOG4NET f_Logger.ErrorFormat( "IsTemporilyErrorResponse(): Detected permanent error " + "RequestUrl: {0} Result: {1} " + "Content:\n{2}", response.RequestUrl, response.Result, response.Content ); #endif return false; } internal PersonModel GetPerson(TwitterUser user) { if (user == null) { throw new ArgumentNullException("user"); } PersonModel person; if (f_Friends == null || !f_Friends.TryGetValue(user.Id.ToString(), out person)) { return CreatePerson(user); } return person; } private PersonModel CreatePerson(decimal userId) { var res = TwitterUser.Show(f_OAuthTokens, userId, f_OptionalProperties); CheckResponse(res); var user = res.ResponseObject; return CreatePerson(user); } private PersonModel CreatePerson(TwitterUser user) { if (user == null) { throw new ArgumentNullException("user"); } var person = new PersonModel( user.Id.ToString(), user.ScreenName, NetworkID, Protocol, this ); if (f_TwitterUser != null && f_TwitterUser.ScreenName == user.ScreenName) { person.IdentityNameColored.ForegroundColor = f_BlueTextColor; person.IdentityNameColored.BackgroundColor = TextColor.None; person.IdentityNameColored.Bold = true; } return person; } protected override T CreateMessageBuilder() { var builder = new TwitterMessageBuilder(); builder.ApplyConfig(Session.UserConfig); return (T)(object) builder; } private string[] GetApiKey() { var key = Defines.TwitterApiKey.Split('|'); if (key.Length != 2) { throw new InvalidOperationException("Invalid Twitter API key!"); } return key; } private static string _(string msg) { return LibraryCatalog.GetString(msg, f_LibraryTextDomain); } } } smuxi-1.1/src/Engine-Twitter/Protocols/Twitter/TwitterMessageBuilder.cs0000664000175000017500000000674514011467170027224 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010, 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Web; using System.Text; using Twitterizer; namespace Smuxi.Engine { public class TwitterMessageBuilder : MessageBuilder { public TwitterMessageBuilder Append(TwitterStatus status, ContactModel sender, bool isHighlight) { if (status == null) { throw new ArgumentNullException("status"); } if (sender == null) { throw new ArgumentNullException("sender"); } // MessageModel serializer expects UTC values TimeStamp = status.CreatedDate.ToUniversalTime(); ID = status.StringId; AppendSenderPrefix(sender, isHighlight); if (status.RetweetedStatus == null && status.QuotedStatus == null) { AppendMessage(status.Text); } if (status.RetweetedStatus != null) { var rtMsg = String.Format( "RT @{0}: {1}", status.RetweetedStatus.User.ScreenName, status.RetweetedStatus.Text ); AppendMessage(rtMsg); } if (status.QuotedStatus != null) { var qtMsg = String.Format( "QT @{0}: {1}", status.QuotedStatus.User.ScreenName, status.QuotedStatus.Text ); AppendMessage(status.Text); AppendSpace(); AppendMessage(qtMsg); } return this; } public TwitterMessageBuilder Append(TwitterStatus status, ContactModel sender) { return Append(status, sender, false); } public TwitterMessageBuilder Append(TwitterDirectMessage status, ContactModel sender, bool isHighlight) { if (status == null) { throw new ArgumentNullException("status"); } if (sender == null) { throw new ArgumentNullException("sender"); } // MessageModel serializer expects UTC values TimeStamp = status.CreatedDate.ToUniversalTime(); AppendSenderPrefix(sender, isHighlight); AppendMessage(status.Text); return this; } public override MessageBuilder AppendMessage(string msg) { msg = NormalizeNewlines(msg); return base.AppendMessage(HttpUtility.HtmlDecode(msg)); } } } smuxi-1.1/src/Engine-Twitter/AssemblyInfo.cs0000644000175000017500000000235512253423337021705 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - Twitter support")] [assembly: AssemblyCopyright("2009-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Engine-Twitter/Makefile.am0000664000175000017500000000244014011472672021014 0ustar00meebeymeebey00000000000000if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-twitter ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) #ASSEMBLY_PC = $(top_srcdir)/$(PACKAGE_NAME).pc SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Protocols/Twitter/TwitterProtocolManager.cs \ Protocols/Twitter/TwitterMessageBuilder.cs \ Protocols/Twitter/TwitterSearchStream.cs REFERENCES = $(LOG4NET_REF_LIBS) \ $(SMARTIRC4NET_LIBS) \ System.Web \ System.Core DLL_REFERENCES = \ $(TARGET_DIR)/Twitterizer2.dll \ $(TARGET_DIR)/Twitterizer2.Streaming.dll \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb pkgapp_DATA = $(ASSEMBLY_TARGET) #pkgconfigdir = $(libdir)/pkgconfig #pkgconfig_DATA = $(ASSEMBLY_PC) include $(top_srcdir)/Makefile.include all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET): $(SOURCES) $(DLL_REFERENCES) $(MCS) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) smuxi-1.1/src/Engine-Twitter/Makefile.in0000664000175000017500000010303714011526471021026 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Engine-Twitter ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d 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)$(bindir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(pkgapp_DATA) $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-twitter ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) #ASSEMBLY_PC = $(top_srcdir)/$(PACKAGE_NAME).pc SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Protocols/Twitter/TwitterProtocolManager.cs \ Protocols/Twitter/TwitterMessageBuilder.cs \ Protocols/Twitter/TwitterSearchStream.cs REFERENCES = $(LOG4NET_REF_LIBS) \ $(SMARTIRC4NET_LIBS) \ System.Web \ System.Core DLL_REFERENCES = \ $(TARGET_DIR)/Twitterizer2.dll \ $(TARGET_DIR)/Twitterizer2.Streaming.dll \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) pkgapp_DATA = $(ASSEMBLY_TARGET) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine-Twitter/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine-Twitter/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) #pkgconfigdir = $(libdir)/pkgconfig #pkgconfig_DATA = $(ASSEMBLY_PC) all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET): $(SOURCES) $(DLL_REFERENCES) $(MCS) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) # 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: smuxi-1.1/src/Frontend-STFL/0000775000175000017500000000000014011526502016430 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-STFL/MainWindow.stfl0000644000175000017500000000266112253423337021411 0ustar00meebeymeebey00000000000000vbox[root_vbox] autobind:0 hbox[title_hbox] .display[title_hbox_display]:1 .expand:0 .height:1 @style_normal:fg=white,bg=blue label[title_label] text[title_label_text]:"Smuxi" hbox[topic_hbox] .display[topic_hbox_display]:0 .expand:0 .height:1 @style_normal:fg=white,bg=blue label[topic_label] text[topic_label_text]:"insert topic here" hbox[menu_hbox] .display:0 .expand:0 .height:1 @style_normal:fg=white,bg=blue label text:"Server" label text:"Chat" label text:"Engine" label text:"View" label text:"Help" vbox[output_vbox] vbox[status] .expand:0 .height:1 @style_normal:fg=white,bg=blue label richtext:1 style_clear_normal:fg=white,bg=blue style_event_normal:fg=green,bg=blue style_msg_normal:fg=cyan,bg=blue,attr=bold style_highlight_normal:fg=magenta,bg=blue,attr=bold text[navigation_label_text]:"Navigation" hbox[input_hbox] .expand:0 .height:1 label[input_label] .expand:0 text[input_label_text]:"[Chat] " !input[input] on_TAB:TAB on_^1:CTRL1 on_^2:CTRL2 on_^3:CTRL3 on_^4:CTRL4 on_^5:CTRL5 on_^6:CTRL6 on_^7:CTRL7 on_^8:CTRL8 on_^9:CTRL9 on_^0:CTRL0 on_^@:CTRL2 on_^]:CTRL5 on_^^:CTRL6 on_^_:CTRL7 on_^]:CTRL5 text[input_text]: pos[input_pos]:"0" smuxi-1.1/src/Frontend-STFL/StflUI.cs0000644000175000017500000001724612253423337020145 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2011, 2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.Frontend.Stfl { public class StflUI : PermanentRemoteObject, IFrontendUI { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private int _Version = 0; private ChatViewManager _ChatViewManager; public int Version { get { return _Version; } } public StflUI(ChatViewManager chatViewManager) { _ChatViewManager = chatViewManager; } public void AddChat(ChatModel chat) { Trace.Call(chat); try { _ChatViewManager.AddChat(chat); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void AddMessageToChat(ChatModel chat, MessageModel msg) { Trace.Call(chat, msg); try { ChatView chatView = _ChatViewManager.GetChat(chat); if (chatView == null) { #if LOG4NET _Logger.Fatal(String.Format("AddMessageToChat(): _ChatViewManager.GetChat(chat) chat.Name: {0} returned null!", chat.Name)); #endif return; } // FIXME: this must be marshalled into the UI thread! chatView.AddMessage(msg); _ChatViewManager.UpdateNavigation(); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void RemoveChat(ChatModel chat) { Trace.Call(chat); try { _ChatViewManager.RemoveChat(chat); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void EnableChat(ChatModel chat) { Trace.Call(chat); try { _ChatViewManager.EnableChat(chat); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void DisableChat(ChatModel chat) { Trace.Call(chat); try { _ChatViewManager.DisableChat(chat); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void SyncChat(ChatModel chat) { Trace.Call(chat); try { var chatView = _ChatViewManager.GetChat(chat); if (chatView == null) { #if LOG4NET _Logger.Fatal(String.Format("SyncChat(): _ChatViewManager.GetChat(chat) chat.Name: {0} returned null!", chat.Name)); #endif return; } chatView.Sync(); if (_ChatViewManager.CurrentChat == chatView) { _ChatViewManager.UpdateInput(); } Frontend.FrontendManager.AddSyncedChat(chat); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void AddPersonToGroupChat(GroupChatModel groupChat, PersonModel person) { Trace.Call(groupChat, person); try { var chatView = _ChatViewManager.GetChat(groupChat); if (chatView == null) { #if LOG4NET _Logger.Fatal(String.Format("AddPersonToGroupChat(): _ChatViewManager.GetChat(chat) chat.Name: {0} returned null!", groupChat.Name)); #endif return; } lock (chatView.Participants) { chatView.Participants.Add(person); } } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void UpdatePersonInGroupChat(GroupChatModel groupChat, PersonModel oldPerson, PersonModel newPerson) { Trace.Call(groupChat, oldPerson, newPerson); try { var chatView = _ChatViewManager.GetChat(groupChat); if (chatView == null) { #if LOG4NET _Logger.Fatal(String.Format("UpdatePersonInGroupChat(): _ChatViewManager.GetChat(groupChat) groupChat.Name: {0} returned null!", groupChat.Name)); #endif return; } lock (chatView.Participants) { chatView.Participants.Remove(oldPerson); chatView.Participants.Add(newPerson); } } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void UpdateTopicInGroupChat(GroupChatModel groupChat, MessageModel topic) { Trace.Call(groupChat, topic); try { var chatView = _ChatViewManager.GetChat(groupChat); if (chatView == null) { #if LOG4NET _Logger.Fatal(String.Format("UpdateTopicInGroupChat(): _ChatViewManager.GetChat(groupChat) groupChat.Name: {0} returned null!", groupChat.Name)); #endif return; } if (!(chatView is GroupChatView)) { #if LOG4NET _Logger.Fatal(String.Format("UpdateTopicInGroupChat(): _ChatViewManager.GetChat(groupChat) groupChat.Name: {0} returned something that isn't a group chat view!", groupChat.Name)); #endif return; } var groupChatView = (GroupChatView) chatView; groupChatView.Topic = topic; _ChatViewManager.UpdateTopic(); } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void RemovePersonFromGroupChat(GroupChatModel groupChat, PersonModel person) { Trace.Call(groupChat, person); try { var chatView = _ChatViewManager.GetChat(groupChat); if (chatView == null) { #if LOG4NET _Logger.Fatal(String.Format("RemovePersonFromGroupChat(): _ChatViewManager.GetChat(groupChat) groupChat.Name: {0} returned null!", groupChat.Name)); #endif return; } lock (chatView.Participants) { chatView.Participants.Remove(person); } } catch (Exception ex) { #if LOG4NET _Logger.Fatal(ex); #endif } } public void SetNetworkStatus(string status) { Trace.Call(status); } public void SetStatus(string status) { Trace.Call(status); } } } smuxi-1.1/src/Frontend-STFL/AssemblyInfo.cs0000644000175000017500000000241512253423337021362 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - STFL frontend")] [assembly: AssemblyCopyright("2007-2013 (C) Mirco Bauer , 2011 (C) Andrius Bentkus ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] #if LOG4NET // let log4net use .exe.config file [assembly: log4net.Config.XmlConfigurator] #endif smuxi-1.1/src/Frontend-STFL/Views/0000775000175000017500000000000014011526502017525 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-STFL/Views/GroupChatView.cs0000644000175000017500000000441112253423337022611 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Linq; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Stfl { [ChatViewInfo(ChatType = ChatType.Group)] public class GroupChatView : ChatView { public MessageModel Topic { get; set; } public GroupChatView(ChatModel chat, MainWindow window) : base(chat, window) { Trace.Call(chat, window); } public override void AddMessage(MessageModel msg) { base.AddMessage(msg); var nick = msg.GetNick(); if (nick == null) { return; } // update who spoke last for (int i = 0; i < Participants.Count; ++i) { var speaker = Participants[i]; if (speaker.IdentityName == nick) { Participants.RemoveAt(i); Participants.Insert(0, speaker); break; } } } public override void Sync() { base.Sync(); var groupChat = (GroupChatModel) ChatModel; Topic = groupChat.Topic; var persons = groupChat.Persons; if (persons != null) { Participants.Clear(); foreach (var person in persons.Values.OrderBy(x => x)) { Participants.Add(person); } } } } } smuxi-1.1/src/Frontend-STFL/Views/ChatView.cs0000644000175000017500000003134712726351313021603 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Text; using System.Threading; using System.Collections.Generic; using System.Globalization; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; using Stfl; namespace Smuxi.Frontend.Stfl { [ChatViewInfo(ChatType = ChatType.Session)] [ChatViewInfo(ChatType = ChatType.Protocol)] public class ChatView : IChatView, IDisposable { #if LOG4NET static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif // HACK: STFL crashes if we use 0 in a widget name static int f_NextID = 1; int f_WidgetID; string f_WidgetName; public ChatModel ChatModel { get; private set; } MainWindow f_MainWindow; TextView MessageTextView { get; set; } IProtocolManager ProtocolManager { get; set; } bool HasEvent { get; set; } bool HasMessage { get; set; } bool HasHighlight { get; set; } public string Name { get; private set; } public IList Participants { get; private set; } public string ID { get { return ChatModel.ID; } } public int Position { get { return ChatModel.Position; } } public bool IsVisible { get { return f_MainWindow[f_WidgetID + "d"] == "1"; } set { if (value) { HasEvent = false; HasMessage = false; HasHighlight = false; } f_MainWindow[f_WidgetID + "d"] = value ? "1" : "0"; } } public string WidgetName { get { return f_WidgetName; } } public string Label { get { string style; if (HasHighlight) { style = "highlight"; } else if (HasMessage) { style = "msg"; } else if (HasEvent) { style = "event"; } else { style = "clear"; } return String.Format("<{0}>{1}", style, Name); } } public ChatView(ChatModel chat, MainWindow window) { Trace.Call(chat, window); if (chat == null) { throw new ArgumentNullException("chat"); } if (window == null) { throw new ArgumentNullException("window"); } ChatModel = chat; f_MainWindow = window; f_WidgetID = f_NextID++; f_WidgetName = "output_textview_" + f_WidgetID; f_MainWindow.Modify("output_vbox", "append", "{" + "textview[" + f_WidgetName + "] " + ".expand:vh " + ".display[" + f_WidgetID + "d]:0 " + "offset[" + f_WidgetID + "os]:0 " + "richtext:1 " + "style_color0_normal:fg=black " + "style_color1_normal:fg=red " + "style_color2_normal:fg=green " + "style_color3_normal:fg=yellow " + "style_color4_normal:fg=blue " + "style_color5_normal:fg=magenta " + "style_color6_normal:fg=cyan " + "style_color7_normal:fg=white " + "style_color8_normal:fg=black,attr=bold " + "style_color9_normal:fg=red,attr=bold " + "style_color10_normal:fg=green,attr=bold " + "style_color11_normal:fg=yellow,attr=bold " + "style_color12_normal:fg=blue,attr=bold " + "style_color13_normal:fg=magenta,attr=bold " + "style_color14_normal:fg=cyan,attr=bold " + "style_color15_normal:fg=white,attr=bold " + "style_url_normal:attr=underline " + "style_u_normal:attr=underline " + "style_b_normal:attr=bold " + "style_i_normal:attr=standout " + "}" ); MessageTextView = new TextView(f_MainWindow, f_WidgetName); MessageTextView.OffsetVariableName = f_WidgetID + "os"; // HACK: as the chat is not always visible we can't extract the // heigth and width information from the textview because it simply // returns 0 when invisible, thus we need to abuse output_vbox MessageTextView.HeigthVariableName = "output_vbox:h"; MessageTextView.WidthVariableName = "output_vbox:w"; MessageTextView.AutoLineWrap = true; Participants = new List(); } ~ChatView() { Dispose(false); } protected virtual void Dispose(bool disposing) { Trace.Call(disposing); // do not make STFL calls from the finalizer thread! if (disposing) { f_MainWindow.Modify(f_WidgetName, "delete", null); } } public virtual void Dispose() { Dispose(true); GC.SuppressFinalize(this); } public virtual void Close() { Trace.Call(); var protocolManager = ProtocolManager; if (protocolManager == null) { #if LOG4NET _Logger.WarnFormat( "{0}.Close(): ProtocolManager is null, bailing out!", this ); #endif return; } ThreadPool.QueueUserWorkItem(delegate { try { protocolManager.CloseChat( Frontend.FrontendManager, ChatModel ); } catch (Exception ex) { Frontend.ShowException(ex); } }); } public virtual void Enable() { Trace.Call(); } public virtual void Disable() { Trace.Call(); } public virtual void Sync() { ProtocolManager = ChatModel.ProtocolManager; Name = ChatModel.Name; #if LOG4NET _Logger.Debug("Sync() syncing messages"); #endif // sync messages // cleanup, be sure the output is empty f_MainWindow.Modify("output_textview", "replace_inner", ""); var messages = ChatModel.Messages; if (messages.Count > 0) { foreach (MessageModel msg in messages) { AddMessage(msg); } } } public virtual void Populate() { } public virtual void AddMessage(MessageModel msg) { // OPT: typical message length var line = new StringBuilder(512); int msgLength = 0; switch (msg.MessageType) { case MessageType.Normal: HasMessage = true; break; case MessageType.Event: HasEvent = true; break; } bool hasHighlight = false; foreach (MessagePartModel msgPart in msg.MessageParts) { if (msgPart.IsHighlight) { HasHighlight = true; } // TODO: implement other types if (msgPart is UrlMessagePartModel) { var urlPart = (UrlMessagePartModel) msgPart; var escapedUrl = StflApi.EscapeRichText(urlPart.Url); line.Append(String.Format("{0}", escapedUrl)); msgLength += urlPart.Url.Length; } else if (msgPart is TextMessagePartModel) { var txtPart = (TextMessagePartModel) msgPart; if (String.IsNullOrEmpty(txtPart.Text)) { continue; } var tags = new List(); if (txtPart.ForegroundColor != TextColor.None) { var palette = TextColorPalettes.LinuxConsole; var foregroundColor = txtPart.ForegroundColor; var backgroundColorString = (string)Frontend.FrontendConfig[Frontend.UIName + "/Interface/TerminalBackgroundColor"]; if (!String.IsNullOrEmpty(backgroundColorString)) { foregroundColor = TextColorTools.GetBestTextColor( foregroundColor, TextColor.Parse(backgroundColorString) ); } var color = TextColorTools.GetNearestColor( foregroundColor, palette ); var colorNumber = palette.IndexOf(color); tags.Add(String.Format("color{0}", colorNumber)); } // HACK: STFL doesn't support applying multiple styles at // the same time and thus simply overwrites any previous // style. As a workaround we only apply one style with the // highest priority in this order: // color >> underline >> bold >> italic if (txtPart.Underline && tags.Count == 0) { tags.Add("u"); } if (txtPart.Bold && tags.Count == 0) { tags.Add("b"); } if (txtPart.Italic && tags.Count == 0) { tags.Add("i"); } string escapedText = StflApi.EscapeRichText(txtPart.Text); if (tags.Count > 0) { tags.Reverse(); string markup = escapedText; foreach (string tag in tags) { markup = String.Format("<{0}>{1}", tag, markup, tag); } line.Append(markup); } else { line.Append(escapedText); } msgLength += txtPart.Text.Length; } else if (msgPart is ImageMessagePartModel) { var imgPart = (ImageMessagePartModel)msgPart; string escapedAltText = StflApi.EscapeRichText(imgPart.AlternativeText); line.Append(escapedAltText); msgLength += escapedAltText.Length; } } string timestamp; try { timestamp = msg.TimeStamp.ToLocalTime().ToString((string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"]); } catch (FormatException e) { timestamp = "Timestamp Format ERROR: " + e.Message; } var finalMsg = String.Format("{0} {1}", timestamp, line.ToString()); MessageTextView.AppendLine(finalMsg); ScrollToEnd(); } public void ScrollUp() { Trace.Call(); MessageTextView.ScrollUp(); } public void ScrollDown() { Trace.Call(); MessageTextView.ScrollDown(); } public void ScrollToStart() { Trace.Call(); MessageTextView.ScrollToStart(); } public void ScrollToEnd() { Trace.Call(); MessageTextView.ScrollToEnd(); } } } smuxi-1.1/src/Frontend-STFL/Views/PersonChatView.cs0000644000175000017500000000261112250426634022763 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Stfl { [ChatViewInfo(ChatType = ChatType.Person)] public class PersonChatView : ChatView { public PersonChatView(ChatModel chat, MainWindow window) : base(chat, window) { Trace.Call(chat, window); } public override void Sync() { base.Sync(); var personChat = (PersonChatModel) ChatModel; Participants.Add(personChat.Person); } } } smuxi-1.1/src/Frontend-STFL/smuxi-frontend-stfl.10000644000175000017500000000567012726351313022457 0ustar00meebeymeebey00000000000000.Dd $Mdocdate: February 23 2014 $ .Dt smuxi-frontend-stfl 1 .Os .Sh NAME .Nm smuxi-frontend-stfl .Nd terminal frontend for Smuxi chat client .Sh SYNOPSIS .Nm smuxi-frontend-stfl .Op Fl dlh .Op Fl e Ar engine .Sh DESCRIPTION .Nm is a terminal frontend for the Smuxi chat client, powered by the STFL library. It can operate standalone or attached to a remote Smuxi engine. .Pp The options are as follows: .Bl -tag -width Ds .It Fl d , Fl \-debug Turn on debugging. Debug logs are sent to .Pa $XDG_DATA_HOME/smuxi/smuxi-frontend-stfl.log , and older logs are moved to the date of usage. .It Fl h , Fl \-help Show the arguments Smuxi takes. .It Fl l , Fl \-list-engines List the available engines Smuxi can connect to. .It Fl e Ar engine , Fl \-engine Ns = Ns Ar engine Connect to a remote engine. .El .Sh KEY BINDINGS The keyboards are similar to that of irssi and similar clients. Note that some terminal control characters (like C-c, C-z, etc) are not intercepted. Common line editing keys that work in graphical applications will also work. In the following examples, C-x means Control-x. .Pp .Bl -tag -width xxxxxxxxxxxxxxx -offset indent -compact .It Tab complete nickname .It PageUp move up the scrollback .It PageDown move down the scrollback .It C-p , C-PageUp previous window .It C-n , C-PageDown next window .It C-Left jump to the previous word .It C-Right jump to the next word .It C-w delete word .It C-c exit frontend .El .Sh SMUXI COMMANDS Like most IRC clients, Smuxi uses commands prefixed with "/", and most use the same commands, also including its own set of commands for the client and engine. In the following examples, the "/" prefix is not included. .Bl -tag -width xx -offset -ident .It exit Exit the Smuxi frontend gracefully. .It window close Closes the current window. .It window Ar number Goes to the window with that number. .It connect Ar protocol Ar protocol-parameters Connects to the server with the given protocol. .It connect Ar network Connects to the preset network. .It disconnect Ar server Disconnects from server. If no parameter is passed, then the server associated with the current window will be disconnected. .It config list Lists the configuration options. .It config get Ar key Get the configuration key's value. .It config set Ar key Ns = Ns Ar value Set the configuration key's value. .It shutdown Shuts down the current engine. .El .Sh FILES .Bl -tag -width -compact .It Pa $XDG_DATA_HOME/smuxi/share/smuxi-frontend-stfl.log smuxi debug log .It Pa $XDG_CONFIG_HOME/smuxi/smuxi-engine.ini smuxi local engine config .It Pa $XDG_CONFIG_HOME/smuxi/smuxi-frontend.ini smuxi frontend configuration and remote engine list .El .Sh SEE ALSO .Xr smuxi-frontend-gnome 1 , .Xr smuxi-server 1 , .Xr smuxi-message-buffer 1 .Pp Website: https://smuxi.im/ .Sh AUTHOR/CREDITS Smuxi, including this frontend, was written by Mirco Bauer. Contributions to this frontend were also made by Ondřej Hošek and Andrius Bentkus. .Pp This manpage was written by Calvin Buckley. smuxi-1.1/src/Frontend-STFL/smuxi-frontend-stfl.in0000644000175000017500000000013012253423337022710 0ustar00meebeymeebey00000000000000#!/bin/sh exec mono --debug "@expanded_libdir@/@PACKAGE@/smuxi-frontend-stfl.exe" "$@" smuxi-1.1/src/Frontend-STFL/STFL/0000775000175000017500000000000014011526502017200 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-STFL/STFL/Form.cs0000644000175000017500000001306412253423337020444 0ustar00meebeymeebey00000000000000/* * $Id: TestUI.cs 179 2007-04-21 15:01:29Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-Test/TestUI.cs $ * $Rev: 179 $ * $Author: meebey $ * $Date: 2007-04-21 17:01:29 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Text; using System.Runtime.InteropServices; using System.Reflection; namespace Stfl { public class Form : IDisposable { IntPtr f_Handle; bool Disposed { get; set; } public event KeyPressedEventHandler KeyPressed; public event EventHandler EventReceived; public event EventHandler Resized; public string this[string name] { get { CheckDisposed(); return StflApi.stfl_get(f_Handle, name); } set { CheckDisposed(); StflApi.stfl_set(f_Handle, name, value); } } public Form(string text) { f_Handle = StflApi.stfl_create(text); // initialize ncurses StflApi.stfl_run(f_Handle, -3); //StflApi.raw(); NcursesApi.nocbreak(); } public Form(Assembly assembly, string resourceName) { if (assembly == null) { assembly = Assembly.GetCallingAssembly(); } using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { if (stream == null) { throw new ArgumentException(resourceName + " could not be found in assembly", "resourceName"); } string text = reader.ReadToEnd(); if (String.IsNullOrEmpty(text)) { throw new ArgumentException(resourceName + " in assembly is missing or empty.", "resourceName"); } f_Handle = StflApi.stfl_create(text); } } ~Form() { Dispose(false); } protected virtual void Dispose(bool disposing) { var disposed = Disposed; if (disposed) { return; } if (f_Handle != IntPtr.Zero) { StflApi.stfl_free(f_Handle); } } public virtual void Dispose() { Dispose(true); GC.SuppressFinalize(this); } public virtual void Run(int timeout) { CheckDisposed(); string @event = StflApi.stfl_run(f_Handle, timeout); if (timeout == -3) { // HACK: timeout of -3 should never return an event but // sometimes does which causes event duplication return; } ProcessEvent(@event); } public void Run() { Run(0); } public void Modify(string name, string mode, string text) { CheckDisposed(); StflApi.stfl_modify(f_Handle, name, mode, text); } public string Dump(string name, string prefix, int focus) { CheckDisposed(); return StflApi.stfl_dump(f_Handle, name, prefix, focus); } public void Reset() { CheckDisposed(); Dispose(); StflApi.stfl_reset(); } protected virtual void ProcessEvent(string @event) { OnEventReceived(new EventReceivedEventArgs(@event)); switch (@event) { case null: case "TIMEOUT": return; case "RESIZE": OnResized(EventArgs.Empty); return; } ProcessKey(@event); } protected virtual void OnEventReceived(EventReceivedEventArgs e) { if (EventReceived != null) { EventReceived(this, e); } } protected virtual void OnResized(EventArgs e) { if (Resized != null) { Resized(this, e); } } protected virtual void ProcessKey(string key) { CheckDisposed(); string focus = StflApi.stfl_get_focus(f_Handle); OnKeyPressed(new KeyPressedEventArgs(key, focus)); } protected virtual void OnKeyPressed(KeyPressedEventArgs e) { if (KeyPressed != null) { KeyPressed(this, e); } } void CheckDisposed() { if (!Disposed) { return; } throw new ObjectDisposedException(GetType().Name); } } } smuxi-1.1/src/Frontend-STFL/STFL/StringOnHeap.cs0000644000175000017500000000333612726351313022102 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2010-2015 Mirco Bauer * Copyright (c) 2015 Ondrej Hosek * * Full GPL License: * * 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 */ using System; using System.Text; using Mono.Unix; namespace Stfl { public sealed class StringOnHeap : IDisposable { public IntPtr Pointer { get; private set; } public StringOnHeap(string str, Encoding encoding) { if (str == null) { Pointer = IntPtr.Zero; return; } Pointer = UnixMarshal.StringToHeap(str, encoding); } public void Dispose() { if (Pointer != IntPtr.Zero) { UnixMarshal.FreeHeap(Pointer); Pointer = IntPtr.Zero; } GC.SuppressFinalize(this); } ~StringOnHeap() { if (Pointer != IntPtr.Zero) { UnixMarshal.FreeHeap(Pointer); } } } } smuxi-1.1/src/Frontend-STFL/STFL/Widget.cs0000644000175000017500000001046212253423337020763 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Stfl { public abstract class Widget { public string HeigthVariableName { get; set; } public string WidthVariableName { get; set; } protected Form Form { get; private set; } protected string WidgetName { get; set; } public int Heigth { get { Render(); var variableName = HeigthVariableName; if (variableName == null) { variableName = String.Format("{0}:h", WidgetName); } var value = Form[variableName]; try { return Int32.Parse(value); } catch (FormatException ex) { throw new FormatException( String.Format( "Failed to parse Widget.Heigth: '{0}' as number " + "(HeigthVariableName: '{1}').", value, variableName ), ex ); } } } public int Width { get { Render(); var variableName = WidthVariableName; if (variableName == null) { variableName = String.Format("{0}:w", WidgetName); } var value = Form[variableName]; try { return Int32.Parse(value); } catch (FormatException ex) { throw new FormatException( String.Format( "Failed to parse Widget.Width: '{0}' as number " + "(WidthVariableName: '{1}').", value, variableName ), ex ); } } } public int MinHeigth { get { Render(); return Int32.Parse(Form[String.Format("{0}:minh", WidgetName)]); } } public int MinWidth { get { Render(); return Int32.Parse(Form[String.Format("{0}:minw", WidgetName)]); } } public int XPosition { get { Render(); return Int32.Parse(Form[String.Format("{0}:x", WidgetName)]); } } public int YPosition { get { Render(); return Int32.Parse(Form[String.Format("{0}:y", WidgetName)]); } } protected Widget(Form form, string widgetName) { if (form == null) { throw new ArgumentNullException("form"); } if (widgetName == null) { throw new ArgumentNullException("widgetName"); } Form = form; WidgetName = widgetName; } public void Bind() { CheckWidget(); } protected void Render() { Form.Run(-3); } protected bool WidgetExists() { return String.IsNullOrEmpty(Form.Dump(WidgetName, null, 0)); } protected void CheckWidget() { if (!WidgetExists()) { return; } throw new ArgumentException( String.Format("Widget name: '{0}' is already used.", WidgetName) ); } } } smuxi-1.1/src/Frontend-STFL/STFL/Makefile.am0000644000175000017500000000045211700531605021235 0ustar00meebeymeebey00000000000000if ENABLE_STATIC_STFL STFL_STATIC_LIB = /usr/lib/libstfl.a LIB_FILE = libstflsharp.so OBJ_FILES = $(wildcard *.o) CLEANFILES = $(LIB_FILE) $(OBJ_FILES) all: $(LIB_FILE) $(LIB_FILE): $(OBJ_FILES) $(AR) -x $(STFL_STATIC_LIB) $(LD) -o $(LIB_FILE) -shared -lncursesw -lpthread $(OBJ_FILES) endif smuxi-1.1/src/Frontend-STFL/STFL/StflApi.cs0000644000175000017500000002563412726351313021110 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2010 Mirco Bauer * Copyright (c) 2010 Andrius Bentkus * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using Mono.Unix; namespace Stfl { internal class StflApi { public static bool IsXterm { get; private set; } static bool IsUtf8Locale { get; set; } static string EscapeLessThanCharacter { get; set; } static string EscapeGreaterThanCharacter { get; set; } static Encoding Utf32NativeEndian { get; set; } static bool BrokenUtf32Handling { get; set; } static StflApi() { // check if he has a graphical terminal. screen/tmux in not // detected in case someone is using it in pure text mode string termName = Environment.GetEnvironmentVariable("TERM"); IsXterm = (termName != null && (termName.StartsWith("xterm") || termName.StartsWith("rxvt"))); // detect UTF-8 locale according to: // http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate var locale = Environment.GetEnvironmentVariable("LC_ALL") ?? Environment.GetEnvironmentVariable("LC_LCTYPE") ?? Environment.GetEnvironmentVariable("LANG") ?? String.Empty; locale = locale.ToUpperInvariant(); IsUtf8Locale = locale.Contains("UTF-8") || locale.Contains("UTF8"); EscapeLessThanCharacter = "<>"; EscapeGreaterThanCharacter = ">"; Utf32NativeEndian = new UTF32Encoding( bigEndian: !BitConverter.IsLittleEndian, byteOrderMark: false, throwOnInvalidCharacters: true ); // UTF-32 handling is broken in mono < 4.2 // fix in 4.4: https://github.com/mono/mono/commit/6bfb7e6d149f5e5c0fe04d680e3f7d36769ef541 // fix in 4.2: https://github.com/mono/mono/commit/ea4ed4a47b98832e294d166bee5b8301fe87e216 BrokenUtf32Handling = IsMonoVersionLessThan(4, 2); } static bool IsMonoVersionLessThan(int majorVersion, int minorVersion) { var monoRuntimeType = Type.GetType("Mono.Runtime"); if (monoRuntimeType != null) { var monoRuntimeVersionMethod = monoRuntimeType.GetMethod( "GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static ); if (monoRuntimeVersionMethod != null) { var version = (string)monoRuntimeVersionMethod.Invoke(null, null); var versionPieces = version.Split(new[] { ' ' }, 2); var versionNumberPieces = versionPieces [0].Split(new[] { '.' }); int runtimeMajorVersion, runtimeMinorVersion; int.TryParse(versionNumberPieces [0], out runtimeMajorVersion); int.TryParse(versionNumberPieces[1], out runtimeMinorVersion); if (runtimeMajorVersion < majorVersion) { return true; } if (runtimeMajorVersion == majorVersion && runtimeMinorVersion < minorVersion) { return true; } return false; } } return false; } internal static string PtrToUtf32String(IntPtr ptr) { // calculate length int length = 0; while (Marshal.ReadInt32(ptr, 4 * length) != 0) { ++length; } // read the bytes var utf32Bytes = new byte[4 * length]; Marshal.Copy(ptr, utf32Bytes, 0, utf32Bytes.Length); // decode to string return Utf32NativeEndian.GetString(utf32Bytes); } public static StringOnHeap ToUnixWideCharacters(string text) { return new StringOnHeap(text, Utf32NativeEndian); } public static string FromUnixWideCharacters(IntPtr text) { if (text == IntPtr.Zero) { return null; } if (BrokenUtf32Handling) { return PtrToUtf32String(text); } else { return UnixMarshal.PtrToString(text, Utf32NativeEndian); } } public static string EscapeRichText(string text) { text = text.Replace("<", EscapeLessThanCharacter); text = text.Replace(">", EscapeGreaterThanCharacter); return text; } [DllImport("stfl")] static extern IntPtr stfl_create(IntPtr text); internal static IntPtr stfl_create(string text) { using (var heapText = ToUnixWideCharacters(text)) { return stfl_create(heapText.Pointer); } } [DllImport("stfl")] internal static extern void stfl_free(IntPtr form); [DllImport("stfl", EntryPoint = "stfl_run")] static extern IntPtr stfl_run_native(IntPtr form, int timeout); internal static string stfl_run(IntPtr form, int timeout) { IntPtr res = stfl_run_native(form, timeout); if (res == IntPtr.Zero) { return null; } return FromUnixWideCharacters(res); } [DllImport("stfl")] internal static extern void stfl_reset(); [DllImport("stfl")] static extern IntPtr stfl_get(IntPtr form, IntPtr name); internal static string stfl_get(IntPtr form, string text) { using (var heapText = ToUnixWideCharacters(text)) { return FromUnixWideCharacters( stfl_get(form, heapText.Pointer) ); } } [DllImport("stfl")] static extern void stfl_set(IntPtr form, IntPtr name, IntPtr value); internal static void stfl_set(IntPtr form, string name, string value) { using (var heapName = ToUnixWideCharacters(name)) using (var heapValue = ToUnixWideCharacters(value)) { stfl_set(form, heapName.Pointer, heapValue.Pointer); } } [DllImport("stfl", EntryPoint = "stfl_get_focus")] static extern IntPtr stfl_get_focus_native(IntPtr form); internal static string stfl_get_focus(IntPtr form) { IntPtr res = stfl_get_focus_native(form); return FromUnixWideCharacters(res); } [DllImport("stfl")] static extern void stfl_set_focus(IntPtr form, IntPtr name); internal static void stfl_set_focus(IntPtr form, string name) { using (var heapName = ToUnixWideCharacters(name)) { stfl_set_focus(form, heapName.Pointer); } } [DllImport("stfl")] static extern IntPtr stfl_quote(IntPtr text); internal static string stfl_quote(string text) { using (var heapText = ToUnixWideCharacters(text)) { return FromUnixWideCharacters( stfl_quote(heapText.Pointer) ); } } [DllImport("stfl")] static extern IntPtr stfl_dump(IntPtr form, IntPtr name, IntPtr prefix, int focus); internal static string stfl_dump(IntPtr form, string name, string prefix, int focus) { using (var heapName = ToUnixWideCharacters(name)) using (var heapPrefix = ToUnixWideCharacters(prefix)) { return FromUnixWideCharacters( stfl_dump(form, heapName.Pointer, heapPrefix.Pointer, focus) ); } } [DllImport("stfl")] static extern void stfl_modify(IntPtr form, IntPtr name, IntPtr mode, IntPtr text); internal static void stfl_modify(IntPtr form, string name, string mode, string text) { using (var heapName = ToUnixWideCharacters(name)) using (var heapMode = ToUnixWideCharacters(mode)) using (var heapText = ToUnixWideCharacters(text)) { stfl_modify(form, heapName.Pointer, heapMode.Pointer, heapText.Pointer); } } [DllImport("stfl")] static extern IntPtr stfl_lookup(IntPtr form, IntPtr path, IntPtr newname); internal static string stfl_lookup(IntPtr form, string path, string newname) { using (var heapPath = ToUnixWideCharacters(path)) using (var heapNewName = ToUnixWideCharacters(newname)) { return FromUnixWideCharacters( stfl_lookup(form, heapPath.Pointer, heapNewName.Pointer) ); } } [DllImport("stfl", EntryPoint = "stfl_error")] static extern IntPtr stfl_error_native(); internal static string stfl_error() { return FromUnixWideCharacters(stfl_error_native()); } [DllImport("stfl")] static extern void stfl_error_action(IntPtr mode); internal static void stfl_error_action(string mode) { using (var heapMode = ToUnixWideCharacters(mode)) { stfl_error_action(heapMode.Pointer); } } /* [DllImport("stfl")] internal static extern IntPtr stfl_ipool_create(IntPtr code); [DllImport("stfl")] internal static extern IntPtr stfl_ipool_add(IntPtr pool, IntPtr data); [DllImport("stfl")] internal static extern IntPtr stfl_ipool_towc(IntPtr pool, IntPtr buf); [DllImport("stfl")] internal static extern IntPtr stfl_ipool_fromwc(IntPtr pool, IntPtr buf); [DllImport("stfl")] internal static extern void stfl_ipool_flush(IntPtr pool); [DllImport("stfl")] internal static extern void stfl_ipool_destroy(IntPtr pool); */ } } smuxi-1.1/src/Frontend-STFL/STFL/TextView.cs0000644000175000017500000003170712253423337021324 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011, 2013 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; namespace Stfl { public class TextView : Widget { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public string OffsetVariableName { get; set; } public bool AutoLineWrap { get; set; } List Lines { get; set; } int WrappedLineCount { get; set; } static Regex StyleTagRegex = new Regex("<([^>]+)>"); public int Offset { get { var offset = Form[OffsetVariableName]; if (String.IsNullOrEmpty(offset)) { return -1; } return Int32.Parse(offset); } set { var minOffset = OffsetStart; var maxOffset = OffsetEnd; if (value == -1) { value = maxOffset; } else if (value > maxOffset) { value = maxOffset; } else if (value < minOffset) { value = minOffset; } Form[OffsetVariableName] = value.ToString(); } } public int OffsetStart { get { return 0; } } public int OffsetEnd { get { int heigth = Heigth; if (WrappedLineCount <= heigth) { return 0; } return WrappedLineCount - heigth; } } public TextView(Form form, string widgetId) : base(form, widgetId) { Lines = new List(); Form.EventReceived += OnEventReceived; } public void AppendWrappedLine(string line) { WrappedLineCount++; Form.Modify( WidgetName, "append", String.Format("{{listitem text:{0}}}", StflApi.stfl_quote(line)) ); } public void AppendWrappedLines(IEnumerable lines) { foreach (var line in lines) { AppendWrappedLine(line); } } public void AppendLine(string line) { var width = Width; if (!AutoLineWrap || width <= 0) { // we don't know our width for whatever reason thus we can't // apply any line wrapping Lines.Add(line); AppendWrappedLine(line); return; } Lines.Add(line); AppendWrappedLines(WrapLine(line, width)); } public void AppendLines(IEnumerable lines) { var width = Width; if (!AutoLineWrap || width <= 0) { // we don't know our width for whatever reason thus we can't // apply any line wrapping Lines.AddRange(lines); AppendWrappedLines(lines); return; } Lines.AddRange(lines); var wrappedLines = new List(lines); foreach (var line in lines) { wrappedLines.AddRange(WrapLine(line, width)); } AppendWrappedLines(wrappedLines); } public void ScrollUp() { Scroll(-0.9); } public void ScrollDown() { Scroll(0.9); } protected void Scroll(double scrollFactor) { int currentOffset = Offset; try { int newOffset = (int) (currentOffset + (Heigth * scrollFactor)); if (newOffset < 0) { newOffset = 0; } else if (newOffset > OffsetEnd) { newOffset = OffsetEnd; } Offset = newOffset; } catch (FormatException ex) { #if LOG4NET Logger.ErrorFormat( "Scroll({0}): FormatException, ignoring...", ex ); #endif } } public void ScrollToStart() { Offset = OffsetStart; } public void ScrollToEnd() { Offset = OffsetEnd; } public void Clear() { Lines.Clear(); WrappedLineCount = 0; Form.Modify(WidgetName, "replace_inner", "{list}"); ScrollToStart(); } /// /// Splits a line into characters, keeping style tags intact and /// attached to the character following them, and not breaking apart /// escapes of <. /// private static IList SplitStyledLineIntoCharacters(string line) { var chars = new List(); string assembleStyle = null; bool tagging = false; for (int i = 0; i < line.Length; ++i) { char c = line [i]; if (c == '<') { if (i < line.Length - 1 && line [i+1] == '>') { // this is <> which is an escape of < if (assembleStyle != null) { chars.Add('<' + assembleStyle + "><>"); } else { chars.Add("<>"); } // no style anymore assembleStyle = null; // skip the > too ++i; } else { // style begins assembleStyle = String.Empty; tagging = true; } } else if (c == '>') { // style ended tagging = false; } else if (tagging) { // add to style assembleStyle += c; } else { // normal character if (assembleStyle != null) { // we have a style too chars.Add('<' + assembleStyle + '>' + c); } else { chars.Add(c.ToString()); } // no style anymore assembleStyle = null; } } return chars; } /// /// Returns the length of the given line in characters that will /// actually be displayed. /// private static int LengthWithoutStyle(string line) { var untaggedString = StyleTagRegex.Replace(line, ""); var unescapedString = untaggedString.Replace("<>", "<"); return unescapedString.Length; } public static List WrapLine(string line, int wrapWidth) { if (line == null) { throw new ArgumentNullException("line"); } if (wrapWidth <= 0) { throw new ArgumentException("Wrap width must bigger than 0", "wrapWidth"); } // split the line on spaces IList splitOnSpaces = line.Split(' ').ToList(); var wrappedLine = new List(); var freshestStyle = ""; // as long as there is anything left to wrap while (splitOnSpaces.Count > 0) { var joinedUp = splitOnSpaces [0]; int currentLengthWithoutStyle = LengthWithoutStyle(joinedUp); // take one word if (currentLengthWithoutStyle > wrapWidth) { // uh-oh, cannot grab first word whole; must split it var chars = SplitStyledLineIntoCharacters(joinedUp); joinedUp = String.Join("", chars.Take(wrapWidth).ToArray()); currentLengthWithoutStyle = wrapWidth; // process the remaining characters next time var rest = splitOnSpaces [0].Substring(joinedUp.Length); splitOnSpaces.RemoveAt(0); splitOnSpaces.Insert(0, rest); } else { // that worked splitOnSpaces.RemoveAt(0); // try taking more words var joinedUpBuilder = new StringBuilder(joinedUp, wrapWidth*2); while (splitOnSpaces.Count > 0) { // + 1 accounts for the joining space var newLengthWithoutStyle = currentLengthWithoutStyle + 1 + LengthWithoutStyle(splitOnSpaces [0]); if (newLengthWithoutStyle > wrapWidth) { // that won't work anymore break; } joinedUpBuilder.Append(' '); joinedUpBuilder.Append(splitOnSpaces [0]); currentLengthWithoutStyle = newLengthWithoutStyle; splitOnSpaces.RemoveAt(0); } joinedUp = joinedUpBuilder.ToString(); } // prepend the currently freshest style unless the line starts with a style if (!joinedUp.StartsWith("<")) { joinedUp = freshestStyle + joinedUp; } // find out the now-freshest style var styleTags = StyleTagRegex.Matches(joinedUp); if (styleTags.Count > 0) { var lastTagName = styleTags[styleTags.Count-1].Groups[1].Value; if (lastTagName.IndexOf('/') != -1) { // closing tag -- no more style freshestStyle = ""; } else { // we have a new style freshestStyle = '<' + lastTagName + '>'; // make sure to terminate our string joinedUp += ""; } } // add the joined-up, style-terminated line to the list wrappedLine.Add(joinedUp); } return wrappedLine; } void Resize() { var width = Width; if (!AutoLineWrap || width <= 0) { // nothing to do return; } var estimatedLines = Math.Max(WrappedLineCount, Lines.Count); // see items.AppendFormat() below var lineStyleOverhead = 18; var listStyleOverhead = 6; var estimatedLength = listStyleOverhead + (estimatedLines * (width + lineStyleOverhead)); estimatedLength = (int) (estimatedLength * 1.2); // re-wrap all lines and re-apply offset WrappedLineCount = 0; var offset = Offset; var items = new StringBuilder("{list", estimatedLength); foreach (var line in Lines) { foreach (var wrappedLine in WrapLine(line, width)) { WrappedLineCount++; items.AppendFormat("{{listitem text:{0}}}", StflApi.stfl_quote(wrappedLine)); } } items.Append("}"); Form.Modify(WidgetName, "replace_inner", items.ToString()); Offset = offset; } void OnEventReceived(object sender, EventReceivedEventArgs e) { if (e.Event == "RESIZE") { DateTime start, stop; start = DateTime.UtcNow; Resize(); stop = DateTime.UtcNow; #if LOG4NET Logger.DebugFormat( "OnEventReceived(): Resize() took: {0:0.00} ms " + "lines: {1} wrapped lines: {2} width: {3}", (stop - start).TotalMilliseconds, Lines.Count, WrappedLineCount, Width ); #endif } } } } smuxi-1.1/src/Frontend-STFL/STFL/Makefile.in0000664000175000017500000003760414011526472021265 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-STFL/STFL ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ @ENABLE_STATIC_STFL_TRUE@STFL_STATIC_LIB = /usr/lib/libstfl.a @ENABLE_STATIC_STFL_TRUE@LIB_FILE = libstflsharp.so @ENABLE_STATIC_STFL_TRUE@OBJ_FILES = $(wildcard *.o) @ENABLE_STATIC_STFL_TRUE@CLEANFILES = $(LIB_FILE) $(OBJ_FILES) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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) --foreign src/Frontend-STFL/STFL/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-STFL/STFL/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic 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-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile @ENABLE_STATIC_STFL_TRUE@all: $(LIB_FILE) @ENABLE_STATIC_STFL_TRUE@$(LIB_FILE): $(OBJ_FILES) @ENABLE_STATIC_STFL_TRUE@ $(AR) -x $(STFL_STATIC_LIB) @ENABLE_STATIC_STFL_TRUE@ $(LD) -o $(LIB_FILE) -shared -lncursesw -lpthread $(OBJ_FILES) # 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: smuxi-1.1/src/Frontend-STFL/STFL/NcursesApi.cs0000644000175000017500000000243512250426550021612 0ustar00meebeymeebey00000000000000// $Id$ // // Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Runtime.InteropServices; namespace Stfl { internal static class NcursesApi { [DllImport("ncurses")] public static extern void raw(); [DllImport("ncurses")] public static extern void nocbreak(); [DllImport("ncurses")] public static extern void endwin(); [DllImport("ncurses")] public static extern void refresh(); } } smuxi-1.1/src/Frontend-STFL/STFL/EventReceivedEventArgs.cs0000644000175000017500000000210711700531605024076 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; namespace Stfl { public class EventReceivedEventArgs : EventArgs { public string Event { get; set; } public EventReceivedEventArgs(string @event) { Event = @event; } } } smuxi-1.1/src/Frontend-STFL/STFL/KeyPressedEventArgs.cs0000644000175000017500000000327211700531605023430 0ustar00meebeymeebey00000000000000/* * $Id: TestUI.cs 179 2007-04-21 15:01:29Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Frontend-Test/TestUI.cs $ * $Rev: 179 $ * $Author: meebey $ * $Date: 2007-04-21 17:01:29 +0200 (Sat, 21 Apr 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Stfl { public delegate void KeyPressedEventHandler(object sender, KeyPressedEventArgs e); public class KeyPressedEventArgs : EventArgs { private string _Key; private string _Focus; public string Key { get { return _Key; } } public string Focus { get { return _Focus; } } public KeyPressedEventArgs(string key, string focus) { _Key = key; _Focus = focus; } } } smuxi-1.1/src/Frontend-STFL/Makefile.am0000664000175000017500000000677313411450522020502 0ustar00meebeymeebey00000000000000SUBDIRS = STFL EXTRA_DIST = $(man_MANS) man_MANS = smuxi-frontend-stfl.1 ASSEMBLY_CONFIG_SOURCE = smuxi-frontend-stfl.exe.config ASSEMBLY_CONFIG = $(BUILD_DIR)/smuxi-frontend-stfl.exe.config ASSEMBLY = $(BUILD_DIR)/smuxi-frontend-stfl.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-frontend.dll \ ../../bin/debug/smuxi-common.dll BUILD_DIR = ../../bin/debug LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll STFL_DLL_SOURCE=../../lib/Stfl.dll SMUXI_FRONTEND_DLL_MDB_SOURCE=../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB=$(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_SOURCE=../../bin/debug/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) \ $(ASSEMBLY_CONFIG) BINARIES = \ $(FRONTEND_STFL) all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ Main.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Frontend.cs \ MainWindow.cs \ StflUI.cs \ Entry.cs \ STFL/Form.cs \ STFL/EventReceivedEventArgs.cs \ STFL/KeyPressedEventArgs.cs \ STFL/NcursesApi.cs \ STFL/StflApi.cs \ STFL/StringOnHeap.cs \ STFL/TextView.cs \ STFL/Widget.cs \ Views/ChatView.cs \ Views/GroupChatView.cs \ Views/PersonChatView.cs \ ChatViewManager.cs DATA_FILES = RESOURCES = \ MainWindow.stfl EXTRAS = \ smuxi-frontend-stfl.in \ $(ASSEMBLY_CONFIG_SOURCE) REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) include $(top_srcdir)/Makefile.include FRONTEND_STFL = $(BUILD_DIR)/smuxi-frontend-stfl LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll STFL_DLL = $(BUILD_DIR)/Stfl.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll LOG4NET_CONFIG = $(BUILD_DIR)/smuxi-frontend-stfl.exe.config LOG4NET_CONFIG_SOURCE = smuxi-frontend-stfl.exe.config build_datafiles = $(LOG4NET_CONFIG) if ENABLE_STATIC_STFL STFLSHARP_SO_SOURCE = $(builddir)/STFL/libstflsharp.so STFLSHARP_SO = $(BUILD_DIR)/libstflsharp.so build_datafiles += $(STFLSHARP_SO) endif $(eval $(call emit-deploy-wrapper,FRONTEND_STFL,smuxi-frontend-stfl,x)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,LOG4NET_CONFIG)) $(eval $(call emit-deploy-target,ASSEMBLY_CONFIG)) if ENABLE_STATIC_STFL $(eval $(call emit-deploy-target,STFLSHARP_SO)) endif $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(CSC) $(CSC_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) smuxi-1.1/src/Frontend-STFL/smuxi-frontend-stfl.exe.config0000644000175000017500000000243112253423337024335 0ustar00meebeymeebey00000000000000
smuxi-1.1/src/Frontend-STFL/Entry.cs0000664000175000017500000003136514011467170020075 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010-2013 Mirco Bauer * Copyright (c) 2011 Andrius Bentkus * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Unix; using Stfl; using Smuxi.Common; using Smuxi.Engine; namespace Smuxi.Frontend.Stfl { public class Entry { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif MainWindow f_MainWindow; ChatViewManager f_ChatViewManager; CommandManager CommandManager { get; set; } NickCompleter NickCompleter { get; set; } EntrySettings Settings { get; set; } event EventHandler Activated; public string Text { get { return f_MainWindow["input_text"]; } set { f_MainWindow["input_text"] = value; } } public int Position { get { return Int32.Parse(f_MainWindow["input_pos"]); } set { f_MainWindow["input_pos"] = value.ToString(); } } public Entry(MainWindow mainWindow, ChatViewManager chatViewManager) { if (mainWindow == null) { throw new ArgumentNullException("mainWindow"); } if (chatViewManager == null) { throw new ArgumentNullException("chatViewManager"); } f_MainWindow = mainWindow; f_MainWindow.KeyPressed += OnKeyPressed; f_ChatViewManager = chatViewManager; Frontend.SessionPropertyChanged += delegate { InitCommandManager(); }; Settings = new EntrySettings(); NickCompleter = new TabCycleNickCompleter(); } public virtual void ApplyConfig(UserConfig config) { Trace.Call(config); if (config == null) { throw new ArgumentNullException("config"); } Settings.ApplyConfig(config); // replace nick completer if needed if (Settings.BashStyleCompletion && !(NickCompleter is LongestPrefixNickCompleter)) { NickCompleter = new LongestPrefixNickCompleter(); } else if (!Settings.BashStyleCompletion && !(NickCompleter is TabCycleNickCompleter)) { NickCompleter = new TabCycleNickCompleter(); } // set the completion character NickCompleter.CompletionChar = Settings.CompletionCharacter; } void InitCommandManager() { Trace.Call(); if (CommandManager != null) { CommandManager.Dispose(); } if (Frontend.Session == null) { CommandManager = null; } else { CommandManager = new CommandManager(Frontend.Session); } } private void OnKeyPressed(object sender, KeyPressedEventArgs e) { Trace.Call(sender, e); #if LOG4NET _Logger.Debug("_OnKeyPressed(): e.Key: '" + e.Key + "' e.Focus: '" + e.Focus + "'"); #endif switch (e.Key) { case "ENTER": OnActivated(EventArgs.Empty); break; case "PPAGE": if (f_ChatViewManager.ActiveChat != null) { f_ChatViewManager.ActiveChat.ScrollUp(); } break; case "NPAGE": if (f_ChatViewManager.ActiveChat != null) { f_ChatViewManager.ActiveChat.ScrollDown(); } break; case "TAB": CompleteNick(); break; case "kPRV5": // CTRL + PAGE UP case "^P": f_ChatViewManager.CurrentChatNumber--; break; case "kNXT5": // CTRL + PAGE DOWN case "^N": f_ChatViewManager.CurrentChatNumber++; break; case "^W": DeleteUntilSpace(); break; case "kRIT5": JumpWord(false); break; case "kLFT5": JumpWord(true); break; case "^D": DeleteChar(); break; } } public virtual void OnActivated(EventArgs e) { var text = Text; if (String.IsNullOrEmpty(text)) { return; } ExecuteCommand(text); if (Activated != null) { Activated(this, EventArgs.Empty); } Text = String.Empty; } public void ExecuteCommand(string cmd) { if (cmd == null) { throw new ArgumentNullException("cmd"); } ChatModel chat = null; var currentChat = f_ChatViewManager.CurrentChat; if (currentChat != null) { chat = currentChat.ChatModel; } CommandModel cd = new CommandModel( Frontend.FrontendManager, chat, (string) Frontend.UserConfig["Interface/Entry/CommandCharacter"], cmd ); var handled = Command(cd); if (handled) { return; } CommandManager.Execute(cd); } private bool Command(CommandModel cmd) { bool handled = false; if (cmd.IsCommand) { switch (cmd.Command.ToLower()) { case "help": CommandHelp(cmd); break; case "window": CommandWindow(cmd); handled = true; break; case "exit": Frontend.Quit(); handled = true; break; case "gc": #if LOG4NET _Logger.Debug("GC.Collect()"); #endif var msg = new MessageBuilder(). AppendEventPrefix(). AppendText("GCing..."). ToMessage(); cmd.FrontendManager.AddMessageToChat(cmd.Chat, msg); GC.Collect(); handled = true; break; case "generate_messages": CommandGenerateMessages(cmd); handled = true; break; } } return handled; } void CommandHelp(CommandModel cmd) { var chatView = f_MainWindow.ChatViewManager.GetChat(cmd.Chat); var builder = new MessageBuilder(); // TRANSLATOR: this line is used as a label / category for a // list of commands below builder.AppendHeader(_("Frontend Commands")); chatView.AddMessage(builder.ToMessage()); string[] help = { "window (number|list|close)", "exit", }; foreach (string line in help) { builder = new MessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); chatView.AddMessage(builder.ToMessage()); } } private void CommandWindow(CommandModel cmd) { if (cmd.Parameter == "close") { f_ChatViewManager.CurrentChat.Close(); return; } else if (cmd.Parameter == "list") { var thisChatView = f_MainWindow.ChatViewManager.GetChat(cmd.Chat); for (int i = 0;; ++i) { ChatView availableChatView = f_MainWindow.ChatViewManager.GetChat(i); if (availableChatView == null) { break; } var builder = new MessageBuilder(); builder.AppendEventPrefix(); builder.AppendFormat("{0} - {1}", i + 1, availableChatView.Name ?? ""); thisChatView.AddMessage(builder.ToMessage()); } return; } int window; if (!Int32.TryParse(cmd.Parameter, out window)) { return; } ChatView chat = f_ChatViewManager.GetChat(window - 1); if (chat == null) { return; } f_ChatViewManager.CurrentChat = chat; } private void CommandUnknown(CommandModel cmd) { var msg = new MessageBuilder(). AppendEventPrefix(). AppendText(_("Unknown Command: {0}"), cmd.Command). ToMessage(); cmd.FrontendManager.AddMessageToChat(cmd.Chat, msg); } void CommandGenerateMessages(CommandModel cmd) { var chat = f_ChatViewManager.CurrentChat; CommandManager.CommandGenerateMessages(cmd, chat); } // gets the position of the first space left private int GetLeftSpace(int end) { // we are already at the very beginning if (end == 0) { return 0; } int start; // are the first characters spaces? bool firstSpace = true; for (start = end; start > 0; start--) { if (start >= Text.Length) { continue; } else if (Text[start] == ' ') { if (firstSpace) { continue; } else { start++; // don't cut the last char break; } } else { firstSpace = false; } } return start; } private int GetRightSpace(int start) { bool firstSpace = true; int end; for (end = start; end < Text.Length; end++) { if (Text[end] == ' ') { if (firstSpace) { continue; } else { break; } } else { firstSpace = false; } } return end; } private void DeleteUntilSpace() { int end = Position; // nothing to delete, if we are at the very beginning if (end == 0) { return; } int start = GetLeftSpace(end); Text = Text.Substring(0, start) + Text.Substring(end); Position = start; } private void JumpWord(bool left) { if (left) { int pos = GetLeftSpace(Position); if (pos > 0) { pos--; } Position = pos; } else { Position = GetRightSpace(Position); } } private void DeleteChar() { Text = Text.Substring(0, Position) + Text.Substring(Math.Min(Position + 1, Text.Length)); } void CompleteNick() { // perform completion string text = Text; int position = Position; NickCompleter.Complete(ref text, ref position, f_ChatViewManager.CurrentChat); Text = text; Position = position; } static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-STFL/ChatViewManager.cs0000644000175000017500000001651112253423337021776 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Text; using System.Globalization; using System.Collections.Generic; using Mono.Unix; using Stfl; using Smuxi.Common; using Smuxi.Engine; using Smuxi.Frontend; namespace Smuxi.Frontend.Stfl { public class ChatViewManager : ChatViewManagerBase { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private MainWindow f_MainWindow; private ChatView f_CurrentChat; private Dictionary f_ChatViews = new Dictionary(); private List f_ChatViewList = new List(); public event ChatSwitchedEventHandler CurrentChatSwitched; public override IChatView ActiveChat { get { return CurrentChat; } } public ChatView CurrentChat { get { return f_CurrentChat; } set { if (f_CurrentChat != null) { f_CurrentChat.IsVisible = false; } f_CurrentChat = value; if (f_CurrentChat != null) { #if LOG4NET _Logger.Debug("set_CurrentChat(): making " + value.ChatModel.ID + " visible"); #endif f_CurrentChat.IsVisible = true; UpdateNavigation(); UpdateInput(); UpdateTitle(); UpdateTopic(); } if (CurrentChatSwitched != null) { CurrentChatSwitched(this, new ChatSwitchedEventArgs(f_CurrentChat)); } } } public int CurrentChatNumber { get { if (CurrentChat == null) { return -1; } return f_ChatViewList.IndexOf(CurrentChat); } set { if (value < 0 || value >= f_ChatViewList.Count) { return; } CurrentChat = f_ChatViewList[value]; } } public ChatViewManager(MainWindow mainWindow) { if (mainWindow == null) { throw new ArgumentNullException("mainWindow"); } f_MainWindow = mainWindow; } public override void AddChat(ChatModel chat) { ChatView chatView = (ChatView) CreateChatView(chat, f_MainWindow); f_ChatViews.Add(chat, chatView); f_ChatViewList.Add(chatView); if (CurrentChat == null) { CurrentChat = chatView; } UpdateNavigation(); } public override void RemoveChat(ChatModel chat) { var chatView = GetChat(chat); chatView.IsVisible = false; if (CurrentChat == chatView) { CurrentChatNumber--; } chatView.Dispose(); f_ChatViews.Remove(chat); f_ChatViewList.Remove(chatView); UpdateNavigation(); } public override void EnableChat(ChatModel chat) { ChatView chatView = f_ChatViews[chat]; chatView.Enable(); } public override void DisableChat(ChatModel chat) { ChatView chatView = f_ChatViews[chat]; chatView.Disable(); } public ChatView GetChat(ChatModel chat) { return f_ChatViews[chat]; } public ChatView GetChat(int chat) { if (chat < 0 || chat >= f_ChatViewList.Count) { return null; } return f_ChatViewList[chat]; } public void UpdateNavigation() { var nav = new StringBuilder(); foreach (var chat in f_ChatViewList) { nav.AppendFormat("[{0}] ", chat == CurrentChat ? chat.Name : chat.Label); } if (nav.Length > 0) { nav.Length--; } f_MainWindow.NavigationLabel = nav.ToString(); } public void UpdateInput() { var chatView = CurrentChat; if (chatView == null) { return; } f_MainWindow.InputLabel = String.Format("[{0}]", chatView.Name); } void UpdateTitle() { var chatView = CurrentChat; if (chatView == null) { return; } string title; var chatModel = chatView.ChatModel; string protocolStatus = null; if (chatModel.ProtocolManager != null) { protocolStatus = chatModel.ProtocolManager.ToString(); } if (chatModel is SessionChatModel) { title = String.Empty; } else if (chatModel is ProtocolChatModel) { title = protocolStatus; } else { title = String.Format("{0} @ {1}", chatModel.Name, protocolStatus); } if (!String.IsNullOrEmpty(title)) { title += " - "; } title += "Smuxi"; f_MainWindow.TitleLabel = title; // HACK: set xterm window title if (StflApi.IsXterm) { NcursesApi.endwin(); Console.WriteLine((char) 27 + "]0;{0}" + (char) 7, title); NcursesApi.refresh(); } } public void UpdateTopic() { string topic = String.Empty; var chatView = CurrentChat; if (chatView is GroupChatView) { var topicModel = ((GroupChatView) chatView).Topic; if (topicModel != null) { topic = topicModel.ToString(); } } f_MainWindow.TopicLabel = topic; f_MainWindow.ShowTopic = !String.IsNullOrEmpty(topic); } } public delegate void ChatSwitchedEventHandler(object sender, ChatSwitchedEventArgs e); public class ChatSwitchedEventArgs : EventArgs { public ChatView ChatView { get; set; } public ChatSwitchedEventArgs(ChatView chatView) { ChatView = chatView; } } } smuxi-1.1/src/Frontend-STFL/Main.cs0000644000175000017500000001316312726351313017654 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010-2011 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using System.Threading; using SysDiag = System.Diagnostics; using NDesk.Options; using Smuxi.Common; using Smuxi.Engine; using Mono.Unix; using Mono.Unix.Native; namespace Smuxi.Frontend.Stfl { public class MainClass { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static void Main(string[] args) { #if LOG4NET // initialize log level log4net.Repository.ILoggerRepository repo = log4net.LogManager.GetRepository(); repo.Threshold = log4net.Core.Level.Error; #endif bool debug = false; bool listEngines = false; string engine = "local"; InitLocale(); OptionSet parser = new OptionSet(); parser.Add( "d|debug", _("Enable debug output"), delegate (string value) { debug = true; } ); parser.Add( "e|engine=", _("Engine to connect to"), delegate (string value) { engine = value; } ); parser.Add( "l|list-engines", _("List available engines"), delegate (string value) { listEngines = true; } ); parser.Add( "h|help", _("Show this help"), delegate(string value) { Console.WriteLine(_("Usage: smuxi-frontend-stfl [options]")); Console.WriteLine(); Console.WriteLine(_("Options:")); parser.WriteOptionDescriptions(Console.Out); Environment.Exit(0); } ); parser.Add( "<>", delegate(string value) { throw new OptionException( String.Format( _("Unknown option: '{0}'"), value ), value ); } ); try { parser.Parse(args); #if LOG4NET if (debug) { repo.Threshold = log4net.Core.Level.Debug; } #endif } catch (OptionException ex) { Console.Error.WriteLine(_("Command line error: {0}"), ex.Message); Environment.Exit(1); } if (listEngines) { Console.WriteLine(_("Available Engines:")); var config = new FrontendConfig(Frontend.UIName); config.Load(); foreach (var entry in (string[]) config["Engines/Engines"]) { Console.WriteLine("\t{0}", entry); } return; } if ((Environment.OSVersion.Platform == PlatformID.Unix) || (Environment.OSVersion.Platform == PlatformID.MacOSX)) { // Register shutdown handlers #if LOG4NET _Logger.Info("Registering signal handlers"); #endif UnixSignal[] shutdown_signals = { new UnixSignal(Signum.SIGINT), new UnixSignal(Signum.SIGTERM), }; Thread signal_thread = new Thread(() => { var index = UnixSignal.WaitAny(shutdown_signals); #if LOG4NET _Logger.Info("Caught signal " + shutdown_signals[index].Signum.ToString() + ", shutting down"); #endif Frontend.Quit(); }); signal_thread.Start(); } try { Frontend.Init(engine); } catch (Exception e) { #if LOG4NET _Logger.Fatal(e); #endif if (SysDiag.Debugger.IsAttached) { throw; } } } private static void InitLocale() { string appDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string localeDir = Path.Combine(appDir, "locale"); if (!Directory.Exists(localeDir)) { localeDir = Path.Combine(Defines.InstallPrefix, "share"); localeDir = Path.Combine(localeDir, "locale"); } LibraryCatalog.Init("smuxi-frontend-stfl", localeDir); #if LOG4NET _Logger.Debug("Using locale data from: " + localeDir); #endif } static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Frontend-STFL/MainWindow.cs0000644000175000017500000000700212253423337021040 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using Mono.Unix; using Smuxi.Common; using Smuxi.Engine; using Stfl; namespace Smuxi.Frontend.Stfl { public class MainWindow : Form { #if LOG4NET static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public StflUI UI { get; private set; } Entry Entry { get; set; } public ChatViewManager ChatViewManager { get; private set; } public string InputLabel { get { return this["input_label_text"]; } set { this["input_label_text"] = String.Format("{0} ", value); } } public string NavigationLabel { get { return this["navigation_label_text"]; } set { this["navigation_label_text"] = value; } } public bool ShowTitle { get { return this["title_hbox_display"] == "1"; } set { this["title_hbox_display"] = value ? "1" : "0"; } } public string TitleLabel { get { return this["title_label_text"]; } set { this["title_label_text"] = value; } } public bool ShowTopic { get { return this["topic_hbox_display"] == "1"; } set { this["topic_hbox_display"] = value ? "1" : "0"; } } public string TopicLabel { get { return this["topic_label_text"]; } set { this["topic_label_text"] = value; } } public MainWindow() : base(null, "MainWindow.stfl") { ChatViewManager = new ChatViewManager(this); Entry = new Entry(this, ChatViewManager); UI = new StflUI(ChatViewManager); Resized += OnResized; if (StflApi.IsXterm) { ShowTitle = false; } Assembly asm = Assembly.GetExecutingAssembly(); ChatViewManager.Load(asm); } void OnResized(object sender, EventArgs e) { #if LOG4NET Logger.DebugFormat( "OnResized(): terminal resized, columns: {0} lines: {1}", this["root_vbox:w"], this["root_vbox:h"] ); #endif } public void ApplyConfig(UserConfig config) { Entry.ApplyConfig(config); } } } smuxi-1.1/src/Frontend-STFL/Makefile.in0000664000175000017500000012215514011526472020511 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ @ENABLE_STATIC_STFL_TRUE@am__append_1 = $(STFLSHARP_SO) subdir = src/Frontend-STFL ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-frontend-stfl 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)$(pkgappdir)" \ "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-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 \ tags-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 man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-frontend-stfl.in \ $(top_srcdir)/Makefile.include 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@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ SUBDIRS = STFL EXTRA_DIST = $(man_MANS) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) man_MANS = smuxi-frontend-stfl.1 ASSEMBLY_CONFIG_SOURCE = smuxi-frontend-stfl.exe.config ASSEMBLY_CONFIG = $(BUILD_DIR)/smuxi-frontend-stfl.exe.config ASSEMBLY = $(BUILD_DIR)/smuxi-frontend-stfl.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-frontend.dll \ ../../bin/debug/smuxi-common.dll BUILD_DIR = ../../bin/debug LOG4NET_DLL_SOURCE = ../../lib/log4net.dll SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE = ../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll STFL_DLL_SOURCE = ../../lib/Stfl.dll SMUXI_FRONTEND_DLL_MDB_SOURCE = ../../bin/debug/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_MDB = $(BUILD_DIR)/smuxi-frontend.dll.mdb SMUXI_FRONTEND_DLL_SOURCE = ../../bin/debug/smuxi-frontend.dll SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_FRONTEND_DLL_MDB) \ $(SMUXI_FRONTEND_DLL) \ $(SMUXI_COMMON_DLL) \ $(ASSEMBLY_CONFIG) BINARIES = \ $(FRONTEND_STFL) FILES = \ Main.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Frontend.cs \ MainWindow.cs \ StflUI.cs \ Entry.cs \ STFL/Form.cs \ STFL/EventReceivedEventArgs.cs \ STFL/KeyPressedEventArgs.cs \ STFL/NcursesApi.cs \ STFL/StflApi.cs \ STFL/StringOnHeap.cs \ STFL/TextView.cs \ STFL/Widget.cs \ Views/ChatView.cs \ Views/GroupChatView.cs \ Views/PersonChatView.cs \ ChatViewManager.cs DATA_FILES = RESOURCES = \ MainWindow.stfl EXTRAS = \ smuxi-frontend-stfl.in \ $(ASSEMBLY_CONFIG_SOURCE) REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY) $(ASSEMBLY).mdb \ $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) FRONTEND_STFL = $(BUILD_DIR)/smuxi-frontend-stfl LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll STFL_DLL = $(BUILD_DIR)/Stfl.dll SMUXI_FRONTEND_DLL = $(BUILD_DIR)/smuxi-frontend.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll LOG4NET_CONFIG = $(BUILD_DIR)/smuxi-frontend-stfl.exe.config LOG4NET_CONFIG_SOURCE = smuxi-frontend-stfl.exe.config build_datafiles = $(LOG4NET_CONFIG) $(am__append_1) @ENABLE_STATIC_STFL_TRUE@STFLSHARP_SO_SOURCE = $(builddir)/STFL/libstflsharp.so @ENABLE_STATIC_STFL_TRUE@STFLSHARP_SO = $(BUILD_DIR)/libstflsharp.so all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-STFL/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-STFL/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-frontend-stfl: $(top_builddir)/config.status $(srcdir)/smuxi-frontend-stfl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; \ $(am__define_uniq_tagged_files); \ 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-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA 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-man1 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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-man1 \ install-pdf install-pdf-am install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-man uninstall-man1 \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-wrapper,FRONTEND_STFL,smuxi-frontend-stfl,x)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_FRONTEND_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(eval $(call emit-deploy-target,LOG4NET_CONFIG)) $(eval $(call emit-deploy-target,ASSEMBLY_CONFIG)) @ENABLE_STATIC_STFL_TRUE@$(eval $(call emit-deploy-target,STFLSHARP_SO)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(CSC) $(CSC_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) # 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: smuxi-1.1/src/Frontend-STFL/Frontend.cs0000664000175000017500000002262514011467170020552 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2007, 2010-2013 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using Smuxi.Engine; using Smuxi.Common; using Stfl; namespace Smuxi.Frontend.Stfl { public class Frontend { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _Name = "smuxi"; private static readonly string _UIName = "STFL"; private static Version _Version; private static string _VersionString; private static MainWindow _MainWindow; private static FrontendConfig _FrontendConfig; private static Session _LocalSession; private static Session _Session; private static UserConfig _UserConfig; private static FrontendManager _FrontendManager; public static EngineManager EngineManager { get; private set; } public static event EventHandler SessionPropertyChanged; public static string Name { get { return _Name; } } public static string UIName { get { return _UIName; } } public static Version Version { get { return _Version; } } public static string VersionString { get { return _VersionString; } } public static MainWindow MainWindow { get { return _MainWindow; } } public static Session Session { get { return _Session; } set { _Session = value; if (SessionPropertyChanged != null) { SessionPropertyChanged(value, EventArgs.Empty); } } } public static bool IsLocalEngine { get { return _LocalSession != null && _Session == _LocalSession; } } public static FrontendManager FrontendManager { get { return _FrontendManager; } } public static Config Config { get { return _Session.Config; } } public static UserConfig UserConfig { get { return _UserConfig; } set { _UserConfig = value; } } public static FrontendConfig FrontendConfig { get { return _FrontendConfig; } } public static void Init(string engine) { System.Threading.Thread.CurrentThread.Name = "Main"; Trace.Call(engine); Assembly asm = Assembly.GetAssembly(typeof(Frontend)); AssemblyName asm_name = asm.GetName(false); AssemblyProductAttribute pr = (AssemblyProductAttribute)asm. GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0]; _Version = asm_name.Version; _VersionString = pr.Product + " - " + _UIName + " frontend " + _Version; // this always calls abort() :((( //StflApi.stfl_error_action("print"); #if LOG4NET _Logger.Info(_VersionString + " starting"); #endif _MainWindow = new MainWindow(); _FrontendConfig = new FrontendConfig(UIName); // loading and setting defaults _FrontendConfig.Load(); if (_FrontendConfig[Frontend.UIName + "/Interface/TerminalBackgroundColor"] == null) { _FrontendConfig[Frontend.UIName + "/Interface/TerminalBackgroundColor"] = "#000000"; } _FrontendConfig.Save(); if (_FrontendConfig.IsCleanConfig) { // first start assistant } else { if (String.IsNullOrEmpty(engine) || engine == "local") { InitLocalEngine(); } else { InitRemoteEngine(engine); } } while (true) { // wait maximum for 500ms, to force a refresh even when // not hitting a key _MainWindow.Run(500); } } public static void InitLocalEngine() { Engine.Engine.Init(); _LocalSession = new Engine.Session(Engine.Engine.Config, Engine.Engine.ProtocolManagerFactory, "local"); Session = _LocalSession; Session.ExecuteOnStartupCommands(); Session.ProcessAutoConnect(); Session.RegisterFrontendUI(_MainWindow.UI); _UserConfig = Session.UserConfig; ConnectEngineToGUI(); } public static void InitRemoteEngine(string engine) { EngineManager = new EngineManager(_FrontendConfig, _MainWindow.UI); try { try { Console.WriteLine( _("Connecting to remote engine '{0}'..."), engine ); EngineManager.Connect(engine); Console.WriteLine(_("Connection established")); } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif Console.WriteLine( _("Connection failed! Error: {1}"), engine, ex.Message ); Environment.Exit(1); } Session = EngineManager.Session; _UserConfig = EngineManager.UserConfig; ConnectEngineToGUI(); } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif EngineManager.Disconnect(); throw; } } public static void ConnectEngineToGUI() { _FrontendManager = _Session.GetFrontendManager(_MainWindow.UI); _FrontendManager.Sync(); if (_UserConfig.IsCaching) { // when our UserConfig is cached, we need to invalidate the cache _FrontendManager.ConfigChangedDelegate = new SimpleDelegate(_UserConfig.ClearCache); } // make sure entry got attention :-P // BUG: MonoCurses //_MainWindow.Entry.HasFocus = true; } public static void DisconnectEngineFromGUI() { _FrontendManager.IsFrontendDisconnecting = true; //_Session.DeregisterFrontendUI(_MainWindow.UI); //_MainWindow.Hide(); //_MainWindow.Notebook.RemoveAllPages(); _FrontendManager = null; _Session = null; } public static void ApplyConfig(UserConfig userConfig) { Trace.Call(userConfig); if (userConfig == null) { throw new ArgumentNullException("userConfig"); } _MainWindow.ApplyConfig(userConfig); } public static void Quit() { if (_FrontendManager != null) { _FrontendManager.IsFrontendDisconnecting = true; if (IsLocalEngine) { try { // we don't shutdown the remote session Session.Shutdown(); } catch (Exception ex) { #if LOG4NET _Logger.Error("Quit(): Exception", ex); #endif } } else if (EngineManager != null) { EngineManager.Disconnect(); } } /* BUG: don't do this, the access to config is lost and the entry will throw an exception then. if (_FrontendManager != null) { DisconnectEngineFromGUI(); } */ MainWindow.Reset(); Environment.Exit(0); } public static void ShowException(Exception ex) { //Application.Error("Error occurred!", ex.ToString()); } static string _(string msg) { return Mono.Unix.Catalog.GetString(msg); } } } smuxi-1.1/src/Engine-Campfire/0000775000175000017500000000000014011526501017033 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-Campfire/Protocols/0000775000175000017500000000000014011526501021017 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-Campfire/Protocols/Campfire/0000775000175000017500000000000014011526501022545 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-Campfire/Protocols/Campfire/CampfirePersonModel.cs0000644000175000017500000000405212250426634027002 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Carlos Martín Nieto // // Full GPL License: // // 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 using System; using System.Net; using System.Runtime.Serialization; using Smuxi.Common; using Smuxi.Engine.Campfire; namespace Smuxi.Engine.Campfire { [Serializable] internal class CampfirePersonModel : PersonModel { public int Uid { get; internal set; } public string Ident { get; internal set; } public string Host { get; internal set; } public string Name {get; internal set; } public string Email {get; internal set; } public bool Admin {get; internal set; } public string AvatarUrl {get; internal set; } internal protected CampfirePersonModel(User user, string network, IProtocolManager pm) : base(user.Id.ToString(), user.Name, network, "Campfire", pm) { Uid = user.Id; Name = user.Name; Email = user.Email_Address; Admin = user.Admin; AvatarUrl = user.Avatar_Url; Host = network; Ident = Name; } internal protected CampfirePersonModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { } } } smuxi-1.1/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs0000644000175000017500000001367612726351313027023 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Carlos Martín Nieto // // Full GPL License: // // 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 using System; using System.Net; using System.IO; using System.Text; using System.Threading; using ServiceStack.Text; using ServiceStack.ServiceClient.Web; using Smuxi.Common; using Smuxi.Engine.Campfire; namespace Smuxi.Engine { internal class MessageReceivedEventArgs : EventArgs { public GroupChatModel Chat { get; private set; } public Message Message { get; private set; } public MessageReceivedEventArgs(GroupChatModel chat, Message message) { Chat = chat; Message = message; } } internal class ErrorReceivedEventArgs : EventArgs { public HttpStatusCode StatusCode { get; private set; } public string StatusDescription { get; private set; } public ErrorReceivedEventArgs(HttpStatusCode code, string description) { StatusCode = code; StatusDescription = description; } } internal class CampfireEventStream : IDisposable { public EventHandler MessageReceived; public EventHandler ErrorReceived; HttpWebRequest Request { get; set; } GroupChatModel Chat { get; set; } NetworkCredential Cred { get; set; } Thread Thread { get; set; } Uri BaseUri { get; set; } string Host { get; set; } int LastMessage { get; set; } public CampfireEventStream(GroupChatModel chat, Uri baseuri, NetworkCredential cred) { this.Chat = chat; this.Cred = cred; this.Host = Host; this.BaseUri = baseuri; this.LastMessage = 0; } public void Start() { Thread = new Thread(DoWork); Thread.Start(); } void FillHole() { var client = new JsonServiceClient(BaseUri.AbsoluteUri); client.Credentials = Cred; var messages = client.Get( String.Format("/room/{0}.json?since={1}", Chat.ID, LastMessage)).Messages; if (messages == null) return; foreach (var message in messages) { if (MessageReceived != null) { var args = new MessageReceivedEventArgs(Chat, message); MessageReceived(this, args); } LastMessage = message.Id; } } void DoWork() { while (true) { try { // if LastMessage > 0 we're reconnecting, so we need to ask // the server for the messages we've missed if (LastMessage > 0) { FillHole(); } ParseStream(); } catch (TimeoutException) { // Not to worry, let's just connect again } catch (WebException e) { if (e.Status == WebExceptionStatus.ProtocolError) { var resp = (HttpWebResponse) e.Response; if (resp.StatusCode == HttpStatusCode.Unauthorized || resp.StatusCode == HttpStatusCode.Forbidden) { if (ErrorReceived != null) { ErrorReceived(this, new ErrorReceivedEventArgs(resp.StatusCode, resp.StatusDescription)); } return; } // it's not such a bad error, sleep for a bit before trying again Thread.Sleep(TimeSpan.FromSeconds(5)); } } } } public void ParseStream() { Request = HttpWebRequest.Create( String.Format("https://streaming.campfirenow.com/room/{0}/live.json", Chat.ID)) as HttpWebRequest; Request.Credentials = Cred; Request.PreAuthenticate = true; var res = Request.GetResponse() as HttpWebResponse; using (StreamReader reader = new StreamReader(res.GetResponseStream())) { StringBuilder bld = new StringBuilder(); while (!reader.EndOfStream) { var c = reader.Read(); /* The server uses CR to indicate when each message ends */ if (c != '\r') { bld.Append((char)c); continue; } var str = bld.ToString(); bld.Length = 0; var message = JsonSerializer.DeserializeFromString(str); if (MessageReceived != null) { var args = new MessageReceivedEventArgs(Chat, message); MessageReceived(this, args); } LastMessage = message.Id; } reader.Close(); } res.Close(); Request = null; } public void Dispose() { Thread.Abort(); } } } smuxi-1.1/src/Engine-Campfire/Protocols/Campfire/DTO.cs0000664000175000017500000000740214011467170023533 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Carlos Martín Nieto // // Full GPL License: // // 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 using System; namespace Smuxi.Engine.Campfire { internal class UserResponse { public User User { get; set; } } internal class RoomsResponse { public Room[] Rooms { get; set; } } internal class RoomResponse { public Room Room { get; set; } } internal class MessagesResponse { public Message[] Messages { get; set; } } internal class MessageResponse { public Message Message { get; set; } } internal class MessageWrapper { public MessageSending message { get; set; } } internal class TopicChange { public string topic { get; set; } } internal class UpdateTopicWrapper { public TopicChange room { get; set; } } internal class UploadWrapper { public Upload Upload { get; set; } } internal class UploadsResponse { public Upload[] Uploads { get; set; } } internal enum MessageType { UnknownMessage, EnterMessage, KickMessage, LeaveMessage, TimestampMessage, TextMessage, PasteMessage, SoundMessage, LockMessage, UnlockMessage, TopicChangeMessage, TweetMessage, UploadMessage, } internal class Room { public string Topic { get; set; } public string Name { get; set; } public int Id { get; set; } public bool Locked { get; set; } public int MembershipLimit { get; set; } public DateTime CreatedAt { get; set; } public DateTime UpdatedAt { get; set; } public User[] Users { get; set; } } internal class User { public int Id { get; set; } public string Name { get; set; } public string Email_Address { get; set; } public bool Admin { get; set; } public DateTimeOffset Created_At { get; set; } public string Type { get; set; } public string Avatar_Url { get; set; } public string Api_Auth_Token { get; set; } } internal class MessageSending { public string body { get; set; } } internal class Tweet { public long Id { get; set; } public string Message { get; set; } public string Author_Username { get; set; } public string Author_Avatar_Url { get; set; } } internal class Message { public int Id { get; set; } public string Body { get; set; } public int Room_Id { get; set; } public int User_Id { get; set; } public DateTimeOffset Created_At { get; set; } public MessageType Type { get; set; } public bool Starred { get; set; } public Tweet Tweet { get; set; } } internal class Upload { public int Id { get; set; } public int Room_Id { get; set; } public string Name { get; set; } public string Full_Url { get; set; } public DateTimeOffset Created_At { get; set; } public string Content_Type { get; set; } public int User_Id { get; set; } public int Byte_Size { get; set; } } } smuxi-1.1/src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs0000664000175000017500000005327614011467170027662 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Carlos Martín Nieto // // Full GPL License: // // 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 using System; using System.Web; using System.Net; using System.Linq; using System.Collections; using System.Collections.Generic; using System.Threading; using Smuxi.Common; using Smuxi.Engine.Campfire; using ServiceStack.ServiceClient.Web; namespace Smuxi.Engine { [ProtocolManagerInfo(Name = "Campfire", Description = "Campfire chat", Alias = "campfire")] public class CampfireProtocolManager : ProtocolManagerBase { static readonly string f_LibraryTextDomain = "smuxi-engine-campfire"; Dictionary EventStreams { get; set; } int LastSentId { get; set; } IEnumerable Rooms { get; set; } DateTime RoomsUpdated { get; set; } TimeSpan RefreshInterval { get; set; } Dictionary Users { get; set; } string Key { get; set; } string Network { get; set; } Uri BaseUri { get; set; } ChatModel NetworkChat { get; set; } JsonServiceClient Client { get; set; } public override string Protocol { get { return "Campfire"; } } public override string NetworkID { get { return Network; } } public override ChatModel Chat { get { return NetworkChat; } } static CampfireProtocolManager() { } private CampfirePersonModel CreatePerson(User user) { var person = new CampfirePersonModel(user, NetworkID, this); return person; } private void GetUserDetails(int id) { if (Users.ContainsKey(id) || id == 0) return; var u = Client.Get(String.Format("/users/{0}.json", id)).User; Users[u.Id] = CreatePerson(u); } private void RefreshRooms() { if (Rooms == null || RefreshInterval.CompareTo(RoomsUpdated - DateTime.Now) > 0) Rooms = Client.Get("/rooms.json").Rooms; } public CampfireProtocolManager(Session session) : base(session) { Trace.Call(session); RefreshInterval = TimeSpan.FromMinutes(5); RoomsUpdated = DateTime.MinValue; Users = new Dictionary(); EventStreams = new Dictionary(); } private void FailedToConnect(string str, Exception e) { Session.AddMessageToChat(NetworkChat, CreateMessageBuilder() .AppendErrorText("{0}: {1}", str, e.Message) .ToMessage()); } public override void Connect(FrontendManager fm, ServerModel server) { Trace.Call(fm, server); Network = server.Hostname.Substring(0, server.Hostname.IndexOf('.')); Host = server.Hostname; BaseUri = new Uri(String.Format("https://{0}", Host)); NetworkChat = new ProtocolChatModel(Network, "Campfire " + Network, this); NetworkChat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); NetworkChat.ApplyConfig(Session.UserConfig); Session.AddChat(NetworkChat); Session.SyncChat(NetworkChat); var msg = _("Connecting to campfire... "); if (fm != null) { fm.SetStatus(msg); } var bld = CreateMessageBuilder().AppendEventPrefix().AppendText(msg); Session.AddMessageToChat(NetworkChat, bld.ToMessage()); if (!server.ValidateServerCertificate) { var whitelist = Session.CertificateValidator.HostnameWhitelist; lock (whitelist) { // needed for favicon if (!whitelist.Contains("campfirenow.com")) { whitelist.Add("campfirenow.com"); } // needed for receiving messages if (!whitelist.Contains("streaming.campfirenow.com")) { whitelist.Add("streaming.campfirenow.com"); } if (!whitelist.Contains(Host)) { whitelist.Add(Host); } } } Client = new JsonServiceClient(BaseUri.AbsoluteUri); var creds = new NetworkCredential(server.Username, server.Password); Client.Credentials = creds; try { var me = Client.Get("/users/me.json").User; Key = me.Api_Auth_Token; Me = CreatePerson(me); // The blue color is hardcoded for now Me.IdentityNameColored.ForegroundColor = new TextColor(0x0000FF); Me.IdentityNameColored.BackgroundColor = TextColor.None; Me.IdentityNameColored.Bold = true; } catch (Exception e) { FailedToConnect("Failed to connect to Campfire", e); return; } Client.Credentials = new NetworkCredential(Key, "X"); msg = _("Connected to campfire"); if (fm != null) { fm.SetStatus(msg); } bld = CreateMessageBuilder().AppendEventPrefix().AppendText(msg); Session.AddMessageToChat(NetworkChat, bld.ToMessage()); // Campfire lets us know what channels the user is currently in, so // connect to those rooms automatically Rooms = Client.Get("/rooms.json").Rooms; RoomsUpdated = DateTime.Now; var myrooms = Client.Get("/presence.json").Rooms; if (myrooms.Length > 0) { bld = CreateMessageBuilder(). AppendEventPrefix(). AppendText("Present in {0}", String.Join(", ", myrooms.Select(r => r.Name).ToArray()) ); Session.AddMessageToChat(NetworkChat, bld.ToMessage()); } foreach (var room in myrooms) { var chat = new GroupChatModel(room.Id.ToString(), room.Name, null); OpenChat(fm, chat); } } public void CommandHelp(CommandModel cd) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); // TRANSLATOR: this line is used as a label / category for a // list of commands below builder.AppendHeader(_("Campfire Commands")); Session.AddMessageToFrontend(cd, builder.ToMessage()); string[] help = { "connect campfire username password", "join", "topic", "uploads", "say" }; foreach (string line in help) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); Session.AddMessageToFrontend(cd, builder.ToMessage()); } } public void CommandJoin(CommandModel cmd) { Trace.Call(cmd); RefreshRooms(); /* * cmd.DataArray is split at SP, but that's an allowed character * for Campfire. Instead of relying on that, we need to remove the "/join " * part and then split on ',' */ var chans = cmd.Parameter.Split(','); var list = Rooms.Where(r => chans.Any(r.Name.Equals)); foreach(Room room in list) { var chat = new GroupChatModel(room.Id.ToString(), room.Name, null); OpenChat(cmd.FrontendManager, chat); } } public void CommandTopic(CommandModel cmd) { Trace.Call(cmd); var update = new UpdateTopicWrapper { room = new TopicChange { topic = cmd.Parameter } }; Client.Put(String.Format("/room/{0}.json", cmd.Chat.ID), update); } public void CommandUploads(CommandModel cmd) { Trace.Call(cmd); var uploads = Client.Get(String.Format("/room/{0}/uploads.json", cmd.Chat.ID)).Uploads; foreach (var upload in uploads) { var bld = CreateMessageBuilder(); bld.AppendEventPrefix().AppendHeader(_("Upload")).AppendSpace(); bld.AppendText(_("'{0}' ({1} B) {2}"), upload.Name, upload.Byte_Size, upload.Full_Url); Session.AddMessageToChat(cmd.Chat, bld.ToMessage()); } } public void CommandSay(CommandModel cmd) { Trace.Call(cmd); SendMessage((GroupChatModel) cmd.Chat, cmd.Parameter); } public override bool Command(CommandModel command) { Trace.Call(command); bool handled = false; switch (command.Command) { case "j": case "join": CommandJoin(command); handled = true; break; case "say": CommandSay(command); handled = true; break; case "help": CommandHelp(command); handled = true; break; case "topic": CommandTopic(command); handled = true; break; case "uploads": CommandUploads(command); handled = true; break; default: // nothing, normal chat handled = true; if (command.Chat is GroupChatModel) SendMessage((GroupChatModel) command.Chat, command.Data); break; } return handled; } public override IList FindGroupChats(GroupChatModel filter) { Trace.Call(filter); RefreshRooms(); string searchPattern = null; if (filter == null || String.IsNullOrEmpty(filter.Name)) { // full channel list } else { if (!filter.Name.StartsWith("*") && !filter.Name.EndsWith("*")) { searchPattern = String.Format("*{0}*", filter.Name); } else { searchPattern = filter.Name; } } List chats = new List(Rooms.Count()); IEnumerable matching; matching = searchPattern == null ? Rooms : Rooms.Where(r => Pattern.IsMatch(r.Name, searchPattern)); foreach (var room in matching) { GroupChatModel chat = new GroupChatModel(room.Id.ToString(), room.Name, null); var users = Client.Get(String.Format("/room/{0}.json", chat.ID)).Room.Users; /* Don't waste this data */ lock (Users) { foreach (var user in users) { if (!Users.ContainsKey(user.Id)) Users[user.Id] = CreatePerson(user); } } chat.PersonCount = users.Length; chat.Topic = CreateMessageBuilder().AppendMessage(room.Topic).ToMessage(); lock (chat) { chats.Add(chat); } } return chats; } void SendMessage(GroupChatModel chat, string text) { var message = new MessageSending { body = text }; var wrapper = new MessageWrapper { message = message }; Message res; try { res = Client.Post(String.Format("/room/{0}/speak.json", chat.ID), wrapper).Message; } catch (WebServiceException e) { var bld = CreateMessageBuilder(); bld.AppendErrorText(_("Failed to post message: {0}"), e.Message); Session.AddMessageToChat(NetworkChat, bld.ToMessage()); return; } ShowMessage(this, new MessageReceivedEventArgs(chat, res)); LastSentId = res.Id; } void FormatUpload(MessageBuilder bld, PersonModel person, ChatModel chat, Message message) { // Figure out what the user uploaded, we need to issue another call for this var upload = Client.Get(String.Format("/room/{0}/messages/{1}/upload.json", chat.ID, message.Id)).Upload; bld.AppendEventPrefix(); bld.AppendIdendityName(person).AppendSpace(); bld.AppendText(_("has uploaded '{0}' ({1} B) {2}"), upload.Name, upload.Byte_Size, upload.Full_Url); } void FormatEvent(MessageBuilder bld, PersonModel person, string action) { bld.AppendEventPrefix(); bld.AppendIdendityName(person).AppendSpace(); bld.AppendText(action); } bool AlreadyPosted(PersonModel person, int messageId) { return person == Me && messageId <= LastSentId; } void ShowMessage(object sender, MessageReceivedEventArgs args) { var message = args.Message; var chat = args.Chat; bool processed = true; if (message.Type == Campfire.MessageType.TimestampMessage) return; CampfirePersonModel person; lock (Users) { GetUserDetails(message.User_Id); /* Make sure we know who this is */ person = Users[message.User_Id]; } var bld = CreateMessageBuilder(); bld.TimeStamp = message.Created_At.DateTime; switch (message.Type) { case Campfire.MessageType.EnterMessage: // TRANSLATOR: {0} is the name of the room FormatEvent(bld, person, String.Format(_("has joined {0}"), chat.Name)); lock (chat) { if (chat.GetPerson(person.ID) == null) Session.AddPersonToGroupChat(chat, person); } break; case Campfire.MessageType.KickMessage: case Campfire.MessageType.LeaveMessage: // TRANSLATOR: {0} is the name of the room FormatEvent(bld, person, String.Format(_("has left {0}"), chat.Name)); lock (chat) { if (chat.GetPerson(person.ID) != null) Session.RemovePersonFromGroupChat(chat, person); } break; case Campfire.MessageType.LockMessage: // TRANSLATOR: {0} is the name of the room FormatEvent(bld, person, String.Format(_("has locked {0}"), chat.Name)); break; case Campfire.MessageType.UnlockMessage: // TRANSLATOR: {0} is the name of the room FormatEvent(bld, person, String.Format(_("has unlocked {0}"), chat.Name)); break; case Campfire.MessageType.TopicChangeMessage: var topic = CreateMessageBuilder().AppendMessage(message.Body); Session.UpdateTopicInGroupChat(chat, topic.ToMessage()); FormatEvent(bld, person, _("has changed the topic")); break; case Campfire.MessageType.UploadMessage: FormatUpload(bld, person, chat, message); break; case Campfire.MessageType.TweetMessage: if (AlreadyPosted(person, message.Id)) return; var tweet = message.Tweet; // TRANSLATOR: {0} is the twitter username, {1} the tweet text FormatEvent(bld, person, String.Format(_("has pasted a tweet by {0}: {1}"), tweet.Author_Username, tweet.Message)); break; case Campfire.MessageType.TextMessage: case Campfire.MessageType.PasteMessage: processed = false; break; default: FormatEvent(bld, person, String.Format(_("has performed an unknown action"), chat.Name)); break; } if (processed) { Session.AddMessageToChat(chat, bld.ToMessage()); return; } if (AlreadyPosted(person, message.Id)) return; bool mine = person == Me; if (mine) bld.AppendSenderPrefix(Me); else bld.AppendNick(person).AppendSpace(); if (message.Type == Campfire.MessageType.TextMessage) { bld.AppendMessage(message.Body); } else if (message.Type == Campfire.MessageType.PasteMessage) { bld.AppendText("\n"); foreach (string part in message.Body.Split('\n')) { bld.AppendText(" {0}\n", part); } } if (!mine) bld.MarkHighlights(); Session.AddMessageToChat(chat, bld.ToMessage()); } void ShowError(object sender, ErrorReceivedEventArgs args) { var message = args.StatusDescription; var bld = CreateMessageBuilder(); bld.AppendErrorText(_("Error reading from stream: {0}"), message); Session.AddMessageToChat(NetworkChat, bld.ToMessage()); } public override void OpenChat(FrontendManager fm, ChatModel chat_) { Trace.Call(fm, chat_); var room = Rooms.Single(r => r.Name.Equals(chat_.Name)); Client.Post(String.Format("/room/{0}/join.json", room.Id), null); room = Client.Get(String.Format("/room/{0}.json", room.Id)).Room; var chat = Session.GetChat(room.Name, ChatType.Group, this) as GroupChatModel; if (chat == null) chat = Session.CreateChat(room.Id.ToString(), room.Name, this); var bld = CreateMessageBuilder(); bld.AppendMessage(room.Topic); chat.Topic = bld.ToMessage(); Session.AddChat(chat); /* Fill what we know about the users, this is only the currently-connected ones */ lock (Users) { foreach (User user in room.Users) { if (!Users.ContainsKey(user.Id)) Users[user.Id] = CreatePerson(user); Session.AddPersonToGroupChat(chat, Users[user.Id]); } } /* Show the recent messages, then go live. FIXME: race condition */ var recent = Client.Get(String.Format("/room/{0}/recent.json", chat.ID)).Messages; foreach (Message message in recent) ShowMessage(this, new MessageReceivedEventArgs(chat, message)); Session.SyncChat(chat); chat.IsSynced = true; // Let the part and join messages take affect var stream = new CampfireEventStream(chat, BaseUri, new NetworkCredential(Key, "X")); lock (EventStreams) EventStreams.Add(chat, stream); stream.MessageReceived += ShowMessage; stream.ErrorReceived += ShowError; stream.Start(); } public override void CloseChat(FrontendManager fm, ChatModel ChatInfo) { var chat = GetChat(ChatInfo.ID, ChatType.Group); Client.Post(String.Format("/room/{0}/leave.json", chat.ID), null); Session.RemoveChat(chat); lock (EventStreams) { var stream = EventStreams[chat]; stream.Dispose(); EventStreams.Remove(chat); } } public override void Reconnect(FrontendManager fm) { Trace.Call(fm); } public override void Disconnect(FrontendManager fm) { Trace.Call(fm); } public override void SetPresenceStatus(PresenceStatus status, string message) { } public override void Dispose() { Trace.Call(); lock (EventStreams) { foreach (var stream in EventStreams.Values) stream.Dispose(); } base.Dispose(); } public override string ToString() { return Network; } private static string _(string msg) { return LibraryCatalog.GetString(msg, f_LibraryTextDomain); } } } smuxi-1.1/src/Engine-Campfire/AssemblyInfo.cs0000644000175000017500000000060012253423337021760 0ustar00meebeymeebey00000000000000using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - Campfire support")] [assembly: AssemblyCopyright("2012-2013 © Carlos Martín Nieto ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Engine-Campfire/Makefile.am0000664000175000017500000000217013411450522021071 0ustar00meebeymeebey00000000000000TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-campfire ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Protocols/Campfire/CampfireProtocolManager.cs \ Protocols/Campfire/CampfirePersonModel.cs \ Protocols/Campfire/CampfireEventStream.cs \ Protocols/Campfire/DTO.cs REFERENCES = \ System \ System.Web \ Mono.Posix \ $(LOG4NET_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/ServiceStack.Common.dll \ $(TARGET_DIR)/ServiceStack.Interfaces.dll \ $(TARGET_DIR)/ServiceStack.Text.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb include $(top_srcdir)/Makefile.include all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) smuxi-1.1/src/Engine-Campfire/Makefile.in0000664000175000017500000010252414011526471021112 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Engine-Campfire ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d 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)$(bindir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(pkgapp_DATA) $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-campfire ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Protocols/Campfire/CampfireProtocolManager.cs \ Protocols/Campfire/CampfirePersonModel.cs \ Protocols/Campfire/CampfireEventStream.cs \ Protocols/Campfire/DTO.cs REFERENCES = \ System \ System.Web \ Mono.Posix \ $(LOG4NET_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/ServiceStack.Common.dll \ $(TARGET_DIR)/ServiceStack.Interfaces.dll \ $(TARGET_DIR)/ServiceStack.Text.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine-Campfire/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine-Campfire/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) # 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: smuxi-1.1/src/Engine-JabbR/0000775000175000017500000000000014011526501016265 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-JabbR/JabbrMessageBuilder.cs0000644000175000017500000000445012253423337022462 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Web; using System.Text; using System.Text.RegularExpressions; using Smuxi.Common; namespace Smuxi.Engine { public class JabbrMessageBuilder : MessageBuilder { public JabbrMessageBuilder() : base() { } public override MessageBuilder AppendMessage(string msg) { return base.AppendMessage(HtmlToText(msg)); } string HtmlToText(string html) { // TODO: implement tag if (html.Contains("\n")) { var normalized = new StringBuilder(html.Length); html = html.Replace("\r\n", "\n"); foreach (var htmlPart in html.Split('\n')) { var trimmed = htmlPart.TrimEnd(' '); if (trimmed.Length == 0) { // skip empty lines continue; } normalized.AppendFormat("{0} ", trimmed); } // remove trailing space normalized.Length--; html = normalized.ToString(); } // strip all HTML tags var text = Regex.Replace(html, "<[^>]+>", String.Empty); // strip leading and trailing whitespace text = text.Trim(); // convert HTML entities to their string values text = HttpUtility.HtmlDecode(text); return text; } } } smuxi-1.1/src/Engine-JabbR/AssemblyInfo.cs0000644000175000017500000000235712253423337021225 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2012 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - JabbR protocol support")] [assembly: AssemblyCopyright("2012-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Engine-JabbR/Makefile.am0000664000175000017500000000216214011472672020333 0ustar00meebeymeebey00000000000000if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-jabbr ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ JabbrMessageBuilder.cs \ JabbrProtocolManager.cs REFERENCES = \ System \ System.Web \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(TARGET_DIR)/JabbR.Client.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb include $(top_srcdir)/Makefile.include all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) smuxi-1.1/src/Engine-JabbR/JabbrProtocolManager.cs0000664000175000017500000005365214011472672022675 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2012-2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; using JabbR.Client; using JabbR.Client.Models; using Microsoft.AspNet.SignalR.Client.Transports; using Microsoft.AspNet.SignalR.Client.Http; using Smuxi.Common; namespace Smuxi.Engine { // https://github.com/davidfowl/Jabbot/blob/master/Jabbot/Bot.cs // https://github.com/davidfowl/JabbR/blob/master/JabbR/Hubs/Chat.cs [ProtocolManagerInfo(Name = "JabbR", Description = "JabbR Chat", Alias = "jabbr")] public class JabbrProtocolManager : ProtocolManagerBase { #if LOG4NET private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif const string LibraryTextDomain = "smuxi-engine-jabbr"; ChatModel ProtocolChat { get; set; } JabbRClient Client { get; set; } string Username { get; set; } ServerModel Server { get; set; } public override string NetworkID { get { if (Server == null) { return Protocol; } return Server.Hostname; } } public override string Protocol { get { return "JabbR"; } } public override ChatModel Chat { get { return ProtocolChat; } } public JabbrProtocolManager(Session session) : base(session) { Trace.Call(session); } public override bool Command(CommandModel cmd) { Trace.Call(cmd); if (cmd.IsCommand) { var handled = false; switch (cmd.Command) { case "help": CommandHelp(cmd); handled = true; break; case "j": case "join": CommandJoin(cmd); handled = true; break; } return handled; } else { CommandMessage(cmd); } return true; } public void CommandHelp(CommandModel cmd) { Trace.Call(cmd); // TRANSLATOR: this line is used as a label / category for a // list of commands below var builder = CreateMessageBuilder(). AppendEventPrefix(). AppendHeader(_("JabbR Commands")); Session.AddMessageToFrontend(cmd, builder.ToMessage()); string[] help = { "connect jabbr username password", "join" }; foreach (string line in help) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); Session.AddMessageToFrontend(cmd, builder.ToMessage()); } } public void CommandJoin(CommandModel cmd) { Trace.Call(cmd); if (String.IsNullOrEmpty(cmd.Parameter)) { NotEnoughParameters(cmd); return; } try { Client.JoinRoom(cmd.Parameter); } catch (Exception ex) { #if LOG4NET Logger.Error(ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(_("Joining room failed. Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } } public void CommandMessage(CommandModel cmd) { Trace.Call(cmd); try { switch (cmd.Chat.ChatType) { case ChatType.Group: Client.Send(cmd.Data, cmd.Chat.ID).Wait(); break; case ChatType.Person: Client.SendPrivateMessage(cmd.Chat.ID, cmd.Data).Wait(); break; } } catch (Exception ex) { #if LOG4NET Logger.Error(ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(_("Sending message failed. Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToFrontend(cmd, msg); } } public override void Connect(FrontendManager fm, ServerModel server) { Trace.Call(fm, server); Server = server; Username = server.Username; var chatName = String.Format("{0} {1}", Protocol, NetworkID); ProtocolChat = new ProtocolChatModel(NetworkID, chatName, this); ProtocolChat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); Session.AddChat(Chat); Session.SyncChat(Chat); try { string url; if (server.Hostname.StartsWith("http://") || server.Hostname.StartsWith("https://")) { url = server.Hostname; } else { if (server.UseEncryption && server.Port == 443) { url = String.Format("https://{0}", server.Hostname); } else if (server.UseEncryption) { url = String.Format("https://{0}:{1}", server.Hostname, server.Port); } else if (!server.UseEncryption && server.Port == 80) { url = String.Format("http://{0}", server.Hostname); } else { url = String.Format("http://{0}:{1}", server.Hostname, server.Port); } } // HACK: SignalR's ServerSentEventsTransport times out on Mono // for some reason and then fallbacks to LongPollingTransport // this takes 10 seconds though, so let's go LP directly Func transport = null; if (!Platform.IsMono) { transport = () => new AutoTransport(new DefaultHttpClient()); } else { transport = () => new LongPollingTransport(); } var authProvider = new DefaultAuthenticationProvider(url); Client = new JabbRClient(url, authProvider, transport); Client.AutoReconnect = true; Client.MessageReceived += OnMessageReceived; Client.MeMessageReceived += OnMeMessageReceived; Client.UserLeft += OnUserLeft; Client.UserJoined += OnUserJoined; Client.JoinedRoom += OnJoinedRoom; Client.PrivateMessage += OnPrivateMessage; Me = CreatePerson(Username); Me.IdentityNameColored.ForegroundColor = new TextColor(0, 0, 255); Me.IdentityNameColored.BackgroundColor = TextColor.None; Me.IdentityNameColored.Bold = true; Connect(); } catch (Exception ex) { #if LOG4NET Logger.Error(ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(_("Connection failed! Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(ProtocolChat, msg); } } void Connect() { Trace.Call(); var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Connecting to {0}..."), Client.SourceUrl). ToMessage(); Session.AddMessageToChat(ProtocolChat, msg); if (!Server.ValidateServerCertificate) { var whitelist = Session.CertificateValidator.HostnameWhitelist; lock (whitelist) { var hostname = Server.Hostname; if (hostname.StartsWith("http://") || hostname.StartsWith("https://")) { hostname = new Uri(hostname).Host; } if (!whitelist.Contains(hostname)) { whitelist.Add(hostname); } } } var res = Client.Connect(Server.Username, Server.Password); res.Wait(); // HACK: this event can only be subscribed if we have made an // actual connection o_O Client.Disconnected += OnDisconnected; IsConnected = true; OnConnected(EventArgs.Empty); OnLoggedOn(res.Result.Rooms); } void OnPrivateMessage(string fromUserName, string toUserName, string message) { Trace.Call(fromUserName, toUserName, message); string targetChat; string targetUser; if (fromUserName == Username) { targetChat = toUserName; targetUser = toUserName; } else { targetChat = fromUserName; targetUser = fromUserName; } var chat = (PersonChatModel) GetChat(targetChat, ChatType.Person); if (chat == null) { var person = CreatePerson(targetUser); chat = new PersonChatModel(person, targetUser, targetUser, this); chat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); Session.AddChat(chat); Session.SyncChat(chat); } var builder = CreateMessageBuilder(); if (fromUserName == Username) { builder.AppendSenderPrefix(Me); } else { builder.AppendSenderPrefix(chat.Person, true); } builder.AppendMessage(message); Session.AddMessageToChat(chat, builder.ToMessage()); } void OnDisconnected() { Trace.Call(); foreach (var chat in Chats) { // don't disable the protocol chat, else the user loses all // control for the protocol manager! e.g. after a manual // reconnect or server-side disconnect if (chat.ChatType == ChatType.Protocol) { continue; } Session.DisableChat(chat); } IsConnected = false; OnDisconnected(EventArgs.Empty); } void OnJoinedRoom(Room room) { Trace.Call(room); var groupChat = new GroupChatModel(room.Name, room.Name, this); groupChat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); var task = Client.GetRoomInfo(room.Name); task.Wait(); // check task.Exception var roomInfo = task.Result; groupChat.Topic = CreateMessageBuilder(). AppendMessage(roomInfo.Topic). ToMessage(); foreach (var user in roomInfo.Users) { groupChat.UnsafePersons.Add(user.Name, CreatePerson(user)); } // add ourself if needed if (!groupChat.UnsafePersons.ContainsKey(Username)) { groupChat.UnsafePersons.Add(Username, Me); } Session.AddChat(groupChat); Session.SyncChat(groupChat); } public override void Reconnect(FrontendManager fm) { Trace.Call(fm); var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Reconnecting to {0}..."), Server.Hostname). ToMessage(); Session.AddMessageToChat(Chat, msg); try { Client.Disconnect(); Connect(); } catch (Exception ex) { #if LOG4NET Logger.Error("Reconnect(): Exception during reconnect", ex); #endif } } public override void Disconnect(FrontendManager fm) { Trace.Call(fm); Client.Disconnect(); } public override IList FindGroupChats(GroupChatModel filter) { Trace.Call(filter); var res = Client.GetRooms(); res.Wait(); // res.Exception var groupChats = new List(); foreach (var room in res.Result) { var groupChat = new GroupChatModel(room.Name, room.Name, this); groupChat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); groupChat.PersonCount = room.Count; groupChats.Add(groupChat); } return groupChats; } public override void OpenChat(FrontendManager fm, ChatModel chat) { Trace.Call(fm, chat); switch (chat.ChatType) { case ChatType.Person: var personChat = (PersonChatModel) GetChat(chat.ID, ChatType.Person); if (personChat != null) { return; } var person = CreatePerson(chat.ID); personChat = new PersonChatModel(person, chat.ID, chat.ID, this); personChat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); Session.AddChat(personChat); Session.SyncChat(personChat); break; case ChatType.Group: Client.JoinRoom(chat.ID); break; } } public override void CloseChat(FrontendManager fm, ChatModel chatInfo) { Trace.Call(fm, chatInfo); // get real chat object from session var chat = GetChat(chatInfo.ID, chatInfo.ChatType); if (chat == null) { #if LOG4NET Logger.Error("CloseChat(): Session.GetChat(" + chatInfo.ID + ", " + chatInfo.ChatType + ")" + " returned null!"); #endif return; } switch (chat.ChatType) { case ChatType.Person: Session.RemoveChat(chat); break; case ChatType.Group: Client.LeaveRoom(chat.ID); break; } } public override void SetPresenceStatus(PresenceStatus status, string message) { //throw new NotImplementedException(); } public override string ToString() { string result = Chat.Name; if (!IsConnected) { result += " (" + _("not connected") + ")"; } return result; } void OnMessageReceived(Message message, string room) { Trace.Call(message, room); var chat = GetChat(room, ChatType.Group) ?? ProtocolChat; AddMessage(chat, message); } void AddMessage(ChatModel chat, Message msg) { if (chat == null) { throw new ArgumentNullException("chat"); } if (msg == null) { throw new ArgumentNullException("msg"); } string content = msg.Content; string name = msg.User.Name; var builder = CreateMessageBuilder(); if (msg.When != default(DateTimeOffset)) { builder.TimeStamp = msg.When.UtcDateTime; } var sender = name == Username ? Me : CreatePerson(name); builder.AppendSenderPrefix(sender); builder.AppendMessage(content); if (sender != Me) { builder.MarkHighlights(); } var message = builder.ToMessage(); Session.AddMessageToChat(chat, message); if (sender == Me) { // server echos our sent messages for us OnMessageSent( new MessageEventArgs(chat, message, null, chat.ID) ); } else { OnMessageReceived( new MessageEventArgs(chat, message, name, chat.ID) ); } } void OnMeMessageReceived(string userName, string content, string roomName) { Trace.Call(userName, content, roomName); var chat = GetChat(roomName, ChatType.Group) ?? ProtocolChat; var builder = CreateMessageBuilder(). AppendActionPrefix(). AppendIdendityName(GetPerson(chat, userName)). AppendSpace(). AppendMessage(content); if (userName != Username) { builder.MarkHighlights(); } var msg = builder.ToMessage(); Session.AddMessageToChat(chat, msg); OnMessageReceived( new MessageEventArgs(chat, msg, userName, roomName) ); } void OnUserJoined(User user, string room, bool isOwner) { Trace.Call(user, room, isOwner); var chat = (GroupChatModel) GetChat(room, ChatType.Group); if (chat == null) { return; } var person = CreatePerson(user.Name); lock (chat) { if (chat.Persons.ContainsKey(person.ID)) { #if LOG4NET Logger.Warn("OnUserJoined(): person already on chat, ignoring..."); #endif return; } Session.AddPersonToGroupChat(chat, person); } } void OnUserLeft(User user, string room) { Trace.Call(user, room); var chat = (GroupChatModel) GetChat(room, ChatType.Group); if (chat == null) { return; } if (user.Name == Username) { Session.RemoveChat(chat); return; } PersonModel person = null; if (chat.Persons.TryGetValue(user.Name, out person)) { Session.RemovePersonFromGroupChat(chat, person); } } void OnLoggedOn(IEnumerable rooms) { Trace.Call(rooms); try { foreach (var room in rooms) { var groupChat = (GroupChatModel) GetChat(room.Name, ChatType.Group); bool newChat; if (groupChat == null) { groupChat = new GroupChatModel(room.Name, room.Name, this); groupChat.InitMessageBuffer(MessageBufferPersistencyType.Volatile); newChat = true; } else { groupChat.UnsafePersons.Clear(); newChat = false; } var task = Client.GetRoomInfo(room.Name); task.Wait(); // check task.Exception var roomInfo = task.Result; groupChat.Topic = CreateMessageBuilder(). AppendMessage(roomInfo.Topic). ToMessage(); foreach (var user in roomInfo.Users) { groupChat.UnsafePersons.Add(user.Name, CreatePerson(user)); } // add ourself if needed if (!groupChat.UnsafePersons.ContainsKey(Username)) { groupChat.UnsafePersons.Add(Username, Me); } foreach (var msg in roomInfo.RecentMessages) { AddMessage(groupChat, msg); } if (newChat) { Session.AddChat(groupChat); } else { Session.EnableChat(groupChat); } Session.SyncChat(groupChat); } } catch (Exception ex) { #if LOG4NET Logger.Error(ex); #endif var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendErrorText(_("Retrieving chat information failed. " + "Reason: {0}"), ex.Message). ToMessage(); Session.AddMessageToChat(ProtocolChat, msg); } } PersonModel CreatePerson(User user) { return CreatePerson(user.Name); } PersonModel CreatePerson(string username) { return new PersonModel(username, username, NetworkID, Protocol, this); } static string _(string msg) { return LibraryCatalog.GetString(msg, LibraryTextDomain); } } } smuxi-1.1/src/Engine-JabbR/Makefile.in0000664000175000017500000010310114011526471020334 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Engine-JabbR ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-engine-jabbr.pc 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(pkgapp_DATA) $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-engine-jabbr.pc.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) TARGET_DIR = $(top_builddir)/bin/$(PROFILE) ASSEMBLY_NAME = smuxi-engine-jabbr ASSEMBLY_FILENAME = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY_FILENAME) SOURCES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ JabbrMessageBuilder.cs \ JabbrProtocolManager.cs REFERENCES = \ System \ System.Web \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(TARGET_DIR)/smuxi-common.dll \ $(TARGET_DIR)/smuxi-engine.dll \ $(TARGET_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(TARGET_DIR)/JabbR.Client.dll SOURCES_BUILD = $(addprefix $(srcdir)/, $(SOURCES)) # automake magic variables EXTRA_DIST = $(SOURCES_BUILD) $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) pkgapp_DATA = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine-JabbR/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine-JabbR/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-engine-jabbr.pc: $(top_builddir)/config.status $(srcdir)/smuxi-engine-jabbr.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappDATA \ install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappDATA \ uninstall-pkgappSCRIPTS uninstall-programfilesDATA \ uninstall-programfilesiconsDATA .PRECIOUS: Makefile # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb: $(SOURCES) $(DLL_REFERENCES) $(CSC) $(CSC_FLAGS) $(build_references_ref) -target:library -out:$(ASSEMBLY_TARGET) $(SOURCES_BUILD) # 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: smuxi-1.1/src/Engine-JabbR/smuxi-engine-jabbr.pc.in0000644000175000017500000000022412253423337022711 0ustar00meebeymeebey00000000000000Name: Engine-JabbR Description: Engine-JabbR Version: @VERSION@ Requires: smuxi-engine Libs: -r:@expanded_libdir@/@PACKAGE@/smuxi-engine-jabbr.dll smuxi-1.1/src/Makefile.in0000664000175000017500000005662314011526472016172 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = AssemblyVersion.cs smuxi-win32.nsis CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-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 \ tags-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_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = Common Engine Engine-IRC Engine-Twitter Engine-Campfire \ Engine-JabbR Engine-XMPP Engine-MessageBuffer Server Frontend \ Frontend-GNOME Frontend-GNOME-IRC Frontend-GNOME-Twitter \ Frontend-GNOME-XMPP Frontend-STFL Frontend-Curses Frontend-SWF \ Frontend-Test am__DIST_COMMON = $(srcdir)/AssemblyVersion.cs.in \ $(srcdir)/Makefile.in $(srcdir)/smuxi-win32.nsis.in 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@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ # Engines @ENABLE_ENGINE_IRC_TRUE@ENGINE_IRC = Engine-IRC @ENABLE_ENGINE_XMPP_TRUE@ENGINE_XMPP = Engine-XMPP @ENABLE_ENGINE_TWITTER_TRUE@ENGINE_TWITTER = Engine-Twitter @ENABLE_ENGINE_CAMPFIRE_TRUE@ENGINE_CAMPFIRE = Engine-Campfire @ENABLE_ENGINE_JABBR_TRUE@ENGINE_JABBR = Engine-JabbR # Frontends @ENABLE_FRONTEND_GNOME_TRUE@FRONTEND_GNOME = Frontend-GNOME @ENABLE_FRONTEND_GNOME_IRC_TRUE@FRONTEND_GNOME_IRC = Frontend-GNOME-IRC @ENABLE_FRONTEND_GNOME_TWITTER_TRUE@FRONTEND_GNOME_TWITTER = Frontend-GNOME-Twitter @ENABLE_FRONTEND_GNOME_XMPP_TRUE@FRONTEND_GNOME_XMPP = Frontend-GNOME-XMPP @ENABLE_FRONTEND_STFL_TRUE@FRONTEND_STFL = Frontend-STFL @ENABLE_FRONTEND_CURSES_TRUE@FRONTEND_CURSES = Frontend-Curses @ENABLE_FRONTEND_SWF_TRUE@FRONTEND_SWF = Frontend-SWF #FRONTEND_WPF = Frontend-WPF @ENABLE_FRONTEND_TEST_TRUE@FRONTEND_TEST = Frontend-Test SUBDIRS = Common \ Engine \ $(ENGINE_IRC) \ $(ENGINE_TWITTER) \ $(ENGINE_CAMPFIRE) \ $(ENGINE_JABBR) \ $(ENGINE_XMPP) \ Engine-MessageBuffer \ Server \ Frontend \ $(FRONTEND_GNOME) \ $(FRONTEND_GNOME_IRC) \ $(FRONTEND_GNOME_TWITTER) \ $(FRONTEND_GNOME_XMPP) \ $(FRONTEND_STFL) \ $(FRONTEND_CURSES) \ $(FRONTEND_SWF) \ $(FRONTEND_WPF) \ $(FRONTEND_TEST) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): AssemblyVersion.cs: $(top_builddir)/config.status $(srcdir)/AssemblyVersion.cs.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ smuxi-win32.nsis: $(top_builddir)/config.status $(srcdir)/smuxi-win32.nsis.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ # 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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; \ $(am__define_uniq_tagged_files); \ 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-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic 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 pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # 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: smuxi-1.1/src/Engine-IRC/0000775000175000017500000000000014011526501015722 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-IRC/Protocols/0000775000175000017500000000000014011526501017706 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-IRC/Protocols/Irc/0000775000175000017500000000000014011526501020423 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-IRC/Protocols/Irc/IrcPersonModel.cs0000644000175000017500000001171711655545675023674 0ustar00meebeymeebey00000000000000/* * $Id: IrcUser.cs 142 2007-01-02 22:19:08Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/IrcUser.cs $ * $Rev: 142 $ * $Author: meebey $ * $Date: 2007-01-02 23:19:08 +0100 (Tue, 02 Jan 2007) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class IrcPersonModel : PersonModel { private string _RealName; private string _Ident; private string _Host; private string _AwayMessage; private bool _IsAwaySeen; private bool _IsAway; public string NickName { get { return IdentityName; } internal set { IdentityName = value; } } public string RealName { get { return _RealName; } internal set { _RealName = value; } } public string Ident { get { return _Ident; } internal set { _Ident = value; } } public string Host { get { return _Host; } internal set { _Host = value; } } /// /// Store the last away message. /// public string AwayMessage { get { return this._AwayMessage; } set { this._AwayMessage = value; } } /// /// Whether has been shown or not. /// public bool IsAwaySeen { get { return this._IsAwaySeen; } set { this._IsAwaySeen = value; } } /// /// Whether this user is away or not. /// public bool IsAway { get { return this._IsAway; } set { this._IsAway = value; } } internal IrcPersonModel(string nickName, string realName, string ident, string host, string networkID, IProtocolManager protocolManager) : base(nickName, nickName, networkID, "IRC", protocolManager) { _RealName = realName; _Ident = ident; _Host = host; } internal protected IrcPersonModel(string nickName, string networkID, IProtocolManager protocolManager) : base(nickName, nickName, networkID, "IRC", protocolManager) { } internal protected IrcPersonModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { } protected override void GetObjectData(SerializationWriter sw) { if (sw == null) { throw new ArgumentNullException("sw"); } base.GetObjectData(sw); sw.Write(_RealName); sw.Write(_Ident); sw.Write(_Host); } protected override void SetObjectData(SerializationReader sr) { if (sr == null) { throw new ArgumentNullException("sr"); } base.SetObjectData(sr); _RealName = sr.ReadString(); _Ident = sr.ReadString(); _Host = sr.ReadString(); } protected override TextMessagePartModel GetColoredIdentityName( string idendityName, string normalized) { normalized = IrcProtocolManager.NormalizeNick(idendityName.TrimEnd('_')); return base.GetColoredIdentityName(idendityName, normalized); } } } smuxi-1.1/src/Engine-IRC/Protocols/Irc/SlackProtocolManager.cs0000664000175000017500000000303414011467170025032 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2017 Mirco Bauer // // Full GPL License: // // 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 using System; using Smuxi.Common; namespace Smuxi.Engine { [ProtocolManagerInfo(Name = "Slack", Description = "Slack IRC", Alias = "slack")] public class SlackProtocolManager : IrcProtocolManager { public override string Protocol { get { return "Slack"; } } public SlackProtocolManager(Session session) : base(session) { Trace.Call(session); } protected override T CreateMessageBuilder() { var builder = base.CreateMessageBuilder(); builder.Settings.Emojis = true; return builder; } } }smuxi-1.1/src/Engine-IRC/Protocols/Irc/IrcTextColor.cs0000644000175000017500000001305211655545675023362 0ustar00meebeymeebey00000000000000/* * $Id: Config.cs 100 2005-08-07 14:54:22Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smuxi/smuxi/trunk/src/Engine/Config.cs $ * $Rev: 100 $ * $Author: meebey $ * $Date: 2005-08-07 16:54:22 +0200 (Sun, 07 Aug 2005) $ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.Engine { [Serializable] public static class IrcTextColor { private static TextColor _Normal = new TextColor(-1); private static TextColor _White = new TextColor(0xFFFFFF); private static TextColor _Black = new TextColor(0x000000); private static TextColor _Blue = new TextColor(0x0000FF); private static TextColor _Green = new TextColor(0x008000); private static TextColor _Red = new TextColor(0xFF0000); private static TextColor _Brown = new TextColor(0xA52A2A); private static TextColor _Purple = new TextColor(0x800080); private static TextColor _Orange = new TextColor(0xFFA500); private static TextColor _Yellow = new TextColor(0xFFFF00); private static TextColor _LightGreen = new TextColor(0x00FF00); private static TextColor _Teal = new TextColor(0x008080); private static TextColor _LightCyan = new TextColor(0xE0FFFF); //static private TextColor _LightBlue = new TextColor(0xADD8E6); private static TextColor _LightBlue = new TextColor(0xA4C8E0); private static TextColor _LightPurple = new TextColor(0xEE82EE); private static TextColor _Grey = new TextColor(0x808080); private static TextColor _LightGrey = new TextColor(0xD3D3D3); public static TextColor Normal { get { return _Normal; } set { _Normal = value; } } public static TextColor White { get { return _White; } set { _White = value; } } public static TextColor Black { get { return _Black; } set { _Black = value; } } public static TextColor Blue { get { return _Blue; } set { _Blue = value; } } public static TextColor Green { get { return _Green; } set { _Green = value; } } public static TextColor Red { get { return _Red; } set { _Red = value; } } public static TextColor Brown { get { return _Brown; } set { _Brown = value; } } public static TextColor Purple { get { return _Purple; } set { _Purple = value; } } public static TextColor Orange { get { return _Orange; } set { _Orange = value; } } public static TextColor Yellow { get { return _Yellow; } set { _Yellow = value; } } public static TextColor LightGreen { get { return _LightGreen; } set { _LightGreen = value; } } public static TextColor Teal { get { return _Teal; } set { _Teal = value; } } public static TextColor LightCyan { get { return _LightCyan; } set { _LightCyan = value; } } public static TextColor LightBlue { get { return _LightBlue; } set { _LightBlue = value; } } public static TextColor LightPurple { get { return _LightPurple; } set { _LightPurple = value; } } public static TextColor Grey { get { return _Grey; } set { _Grey = value; } } public static TextColor LightGrey { get { return _LightGrey; } set { _LightGrey = value; } } } } smuxi-1.1/src/Engine-IRC/Protocols/Irc/IrcMessageBuilder.cs0000644000175000017500000002635712726351313024326 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2010 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Text.RegularExpressions; namespace Smuxi.Engine { public enum IrcControlCode : int { Bold = 2, Color = 3, Clear = 15, Italic = 29, Underline = 31, } public class IrcMessageBuilder : MessageBuilder { private static char[] IrcControlChars { get; set; } static IrcMessageBuilder() { int[] intValues = (int[])Enum.GetValues(typeof(IrcControlCode)); char[] chars = new char[intValues.Length]; int i = 0; foreach (int intValue in intValues) { chars[i++] = (char)intValue; } IrcControlChars = chars; } public override MessageBuilder AppendMessage(string msg) { msg = msg ?? ""; if (msg.Length == 0) { return this; } // strip color and formatting if configured if (Settings.StripColors) { msg = Regex.Replace(msg, (char)IrcControlCode.Color + "[0-9]{1,2}(,[0-9]{1,2})?", String.Empty); } if (Settings.StripFormattings) { msg = Regex.Replace(msg, String.Format("({0}|{1}|{2}|{3})", (char)IrcControlCode.Bold, (char)IrcControlCode.Clear, (char)IrcControlCode.Italic, (char)IrcControlCode.Underline), String.Empty); } // convert * / _ to mIRC control characters string[] messageParts = msg.Split(new char[] {' '}); // better regex? \*([^ *]+)\* //string pattern = @"^({0})([A-Za-z0-9]+?){0}$"; string pattern = @"^({0})([^ *]+){0}$"; for (int i = 0; i < messageParts.Length; i++) { messageParts[i] = Regex.Replace(messageParts[i], String.Format(pattern, @"\*"), (char)IrcControlCode.Bold + "$1$2$1" + (char)IrcControlCode.Bold); messageParts[i] = Regex.Replace(messageParts[i], String.Format(pattern, "_"), (char)IrcControlCode.Underline + "$1$2$1" + (char)IrcControlCode.Underline); messageParts[i] = Regex.Replace(messageParts[i], String.Format(pattern, "/"), (char)IrcControlCode.Italic + "$1$2$1" + (char)IrcControlCode.Italic); } msg = String.Join(" ", messageParts); // crash: ^C^C0,7Dj Ler #Dj KanaL?na Girmek ZorunDaD?rLar UnutMay?N @>'^C0,4WwW.MaViGuL.NeT ^C4]^O ^C4]' // parse colors bool bold = false; bool underline = false; bool italic = false; bool color = false; TextColor fg_color = IrcTextColor.Normal; TextColor bg_color = IrcTextColor.Normal; bool controlCharFound; do { string submessage; int controlPos = msg.IndexOfAny(IrcControlChars); if (controlPos > 0) { // control char found and we have normal text infront controlCharFound = true; submessage = msg.Substring(0, controlPos); msg = msg.Substring(controlPos); } else if (controlPos != -1) { // control char found controlCharFound = true; char controlChar = msg.Substring(controlPos, 1)[0]; IrcControlCode controlCode = (IrcControlCode)controlChar; string controlChars = controlChar.ToString(); switch (controlCode) { case IrcControlCode.Clear: #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): found clear control character"); #endif bold = false; underline = false; italic = false; color = false; fg_color = IrcTextColor.Normal; bg_color = IrcTextColor.Normal; break; case IrcControlCode.Bold: #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): found bold control character"); #endif bold = !bold; break; case IrcControlCode.Underline: #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): found underline control character"); #endif underline = !underline; break; case IrcControlCode.Italic: #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): found italic control character"); #endif italic = !italic; break; case IrcControlCode.Color: #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): found color control character"); #endif color = !color; string colorMessage = msg.Substring(controlPos); #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): colorMessage: '" + colorMessage + "'"); #endif Match match = Regex.Match(colorMessage, "^" + (char)IrcControlCode.Color + "(?[0-9][0-9]?)(,(?[0-9][0-9]?))?"); if (match.Success) { controlChars = match.Value; int color_code; if (match.Groups["fg"] != null) { #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): match.Groups[fg].Value: " + match.Groups["fg"].Value); #endif try { color_code = Int32.Parse(match.Groups["fg"].Value); fg_color = IrcColorToTextColor(color_code); } catch (FormatException) { fg_color = IrcTextColor.Normal; } } if (match.Groups["bg"] != null) { #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): match.Groups[bg].Value: " + match.Groups["bg"].Value); #endif try { color_code = Int32.Parse(match.Groups["bg"].Value); bg_color = IrcColorToTextColor(color_code); } catch (FormatException) { bg_color = IrcTextColor.Normal; } } } else { controlChars = controlChar.ToString(); fg_color = IrcTextColor.Normal; bg_color = IrcTextColor.Normal; } #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): fg_color.HexCode: " + String.Format("0x{0:X6}", fg_color.HexCode)); Logger.Debug("AppendMessage(): bg_color.HexCode: " + String.Format("0x{0:X6}", bg_color.HexCode)); #endif break; } #if LOG4NET && MSG_DEBUG Logger.Debug("AppendMessage(): controlChars.Length: " + controlChars.Length); #endif // check if there are more control chars in the rest of the message int nextControlPos = msg.IndexOfAny(IrcControlChars, controlPos + controlChars.Length); if (nextControlPos != -1) { // more control chars found submessage = msg.Substring(controlChars.Length, nextControlPos - controlChars.Length); msg = msg.Substring(nextControlPos); } else { // no next control char // skip the control chars submessage = msg.Substring(controlChars.Length); msg = String.Empty; } } else { // no control char, nothing to do controlCharFound = false; submessage = msg; } TextMessagePartModel msgPart = new TextMessagePartModel(); msgPart.Text = submessage; msgPart.Bold = bold; msgPart.Underline = underline; msgPart.Italic = italic; msgPart.ForegroundColor = fg_color; msgPart.BackgroundColor = bg_color; Append(ParsePatterns(msgPart)); } while (controlCharFound); return this; } private static TextColor IrcColorToTextColor(int color) { switch (color) { case 0: return IrcTextColor.White; case 1: return IrcTextColor.Black; case 2: return IrcTextColor.Blue; case 3: return IrcTextColor.Green; case 4: return IrcTextColor.Red; case 5: return IrcTextColor.Brown; case 6: return IrcTextColor.Purple; case 7: return IrcTextColor.Orange; case 8: return IrcTextColor.Yellow; case 9: return IrcTextColor.LightGreen; case 10: return IrcTextColor.Teal; case 11: return IrcTextColor.LightCyan; case 12: return IrcTextColor.LightBlue; case 13: return IrcTextColor.LightPurple; case 14: return IrcTextColor.Grey; case 15: return IrcTextColor.LightGrey; default: return IrcTextColor.Normal; } } } } smuxi-1.1/src/Engine-IRC/Protocols/Irc/IrcProtocolManager.cs0000664000175000017500000050322714011467170024523 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2016 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Security.Cryptography.X509Certificates; using System.Globalization; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Linq; using Meebey.SmartIrc4net; using Smuxi.Common; using IrcProxyType = Meebey.SmartIrc4net.ProxyType; namespace Smuxi.Engine { [ProtocolManagerInfo(Name = "IRC", Description = "Internet Relay Chat", Alias = "irc")] public class IrcProtocolManager : ProtocolManagerBase { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private static readonly string _LibraryTextDomain = "smuxi-engine-irc"; private IrcFeatures _IrcClient; private ServerModel _ServerModel; private string _Host; private int _Port; private string _Network; private string[] _Nicknames; string _Realname; private int _CurrentNickname; private string _Username; private string _Password; private FrontendManager _FrontendManager; private bool _Listening; private ChatModel _NetworkChat; private TimeSpan _LastLag; private Thread _RunThread; private Thread _LagWatcherThread; private TaskQueue _ChannelJoinQueue = new TaskQueue("JoinChannelQueue"); private List _QueuedChannelJoinList = new List(); private List _ActiveChannelJoinList = new List(); private AutoResetEvent _ActiveChannelJoinHandle = new AutoResetEvent(false); bool HasListMaskSearchSupport { get; set; } bool HasSafeListSupport { get; set; } IList NetworkChannels { get; set; } DateTime NetworkChannelsAge { get; set; } TimeSpan NetworkChannelsMaxAge { get; set; } List ChannelTypes { get; set; } Dictionary ChannelKeys { get; set; } public override bool IsConnected { get { if ((_IrcClient != null) && (_IrcClient.IsConnected)) { return true; } return false; } } public override string Host { get { if (_IrcClient == null) { return null; } return _IrcClient.Address; } } public override int Port { get { if (_IrcClient == null) { return -1; } return _IrcClient.Port; } } public override string NetworkID { get { if (String.IsNullOrEmpty(_Network)) { return _IrcClient.Address; } return _Network; } } public override string Protocol { get { return "IRC"; } } public override ChatModel Chat { get { return _NetworkChat; } } private string Prefix { get { if (_IrcClient == null) { return String.Empty; } if (IrcMe == null) { return _IrcClient.Nickname; } return String.Format("{0}!{1}@{2}", _IrcClient.Nickname, IrcMe.Ident, IrcMe.Host); } } private IrcPersonModel IrcMe { get { return (IrcPersonModel) Me; } set { Me = value; } } public IrcProtocolManager(Session session) : base(session) { Trace.Call(session); NetworkChannelsMaxAge = TimeSpan.FromMinutes(5); ChannelTypes = new List(new string[] {"#", "&", "!", "+"}); ChannelKeys = new Dictionary(StringComparer.OrdinalIgnoreCase); _IrcClient = new IrcFeatures(); _IrcClient.AutoRetry = true; // keep retrying to connect forever _IrcClient.AutoRetryLimit = 0; _IrcClient.AutoRetryDelay = 120; _IrcClient.AutoReconnect = true; _IrcClient.AutoRelogin = true; // we need to keep track of channel keys for proper auto rejoin _IrcClient.AutoRejoin = false; // HACK: SmartIrc4net <= 0.4.5.1 is not resetting the nickname list // after disconnect. This causes random nicks to be used when there // are many reconnects like when the network connection goes flaky, // see: http://projects.qnetp.net/issues/show/163 _IrcClient.AutoNickHandling = false; _IrcClient.CtcpVersion = Engine.VersionString; _IrcClient.SendDelay = 250; _IrcClient.SupportNonRfc = true; _IrcClient.OnRawMessage += new IrcEventHandler(_OnRawMessage); _IrcClient.OnChannelMessage += new IrcEventHandler(_OnChannelMessage); _IrcClient.OnChannelAction += new ActionEventHandler(_OnChannelAction); _IrcClient.OnChannelNotice += new IrcEventHandler(_OnChannelNotice); _IrcClient.OnQueryMessage += new IrcEventHandler(_OnQueryMessage); _IrcClient.OnQueryAction += new ActionEventHandler(_OnQueryAction); _IrcClient.OnQueryNotice += new IrcEventHandler(_OnQueryNotice); _IrcClient.OnJoin += new JoinEventHandler(_OnJoin); _IrcClient.OnNames += new NamesEventHandler(_OnNames); _IrcClient.OnPart += new PartEventHandler(_OnPart); _IrcClient.OnKick += new KickEventHandler(_OnKick); _IrcClient.OnNickChange += new NickChangeEventHandler(_OnNickChange); _IrcClient.OnOwner += new OwnerEventHandler(OnOwner); _IrcClient.OnDeowner += new DeownerEventHandler(OnDeowner); _IrcClient.OnChannelAdmin += new ChannelAdminEventHandler(OnChannelAdmin); _IrcClient.OnDeChannelAdmin += new DeChannelAdminEventHandler(OnDeChannelAdmin); _IrcClient.OnOp += new OpEventHandler(_OnOp); _IrcClient.OnDeop += new DeopEventHandler(_OnDeop); _IrcClient.OnHalfop += new HalfopEventHandler(OnHalfop); _IrcClient.OnDehalfop += new DehalfopEventHandler(OnDehalfop); _IrcClient.OnVoice += new VoiceEventHandler(_OnVoice); _IrcClient.OnDevoice += new DevoiceEventHandler(_OnDevoice); _IrcClient.OnUserModeChange += OnUserModeChange; _IrcClient.OnChannelModeChange += OnChannelModeChange; _IrcClient.OnTopic += new TopicEventHandler(_OnTopic); _IrcClient.OnTopicChange += new TopicChangeEventHandler(_OnTopicChange); _IrcClient.OnQuit += new QuitEventHandler(_OnQuit); _IrcClient.OnRegistered += new EventHandler(_OnRegistered); _IrcClient.OnDisconnected += new EventHandler(_OnDisconnected); _IrcClient.OnAutoConnectError += OnAutoConnectError; _IrcClient.OnAway += new AwayEventHandler(_OnAway); _IrcClient.OnUnAway += new IrcEventHandler(_OnUnAway); _IrcClient.OnNowAway += new IrcEventHandler(_OnNowAway); _IrcClient.OnCtcpRequest += new CtcpEventHandler(_OnCtcpRequest); _IrcClient.OnCtcpReply += new CtcpEventHandler(_OnCtcpReply); _IrcClient.OnWho += OnWho; _IrcClient.OnInvite += OnInvite; _IrcClient.OnReadLine += OnReadLine; _IrcClient.OnWriteLine += OnWriteLine; _IrcClient.CtcpUserInfo = (string) Session.UserConfig["Connection/Realname"]; // disabled as we don't use / support DCC yet _IrcClient.CtcpDelegates.Remove("dcc"); // finger we handle ourself, no little helga here! _IrcClient.CtcpDelegates["finger"] = delegate(CtcpEventArgs e) { _IrcClient.SendMessage( SendType.CtcpReply, e.Data.Nick, String.Format("{0} {1}", e.CtcpCommand, _IrcClient.CtcpUserInfo ) ); }; // time we handle ourself _IrcClient.CtcpDelegates["time"] = delegate(CtcpEventArgs e) { _IrcClient.SendMessage( SendType.CtcpReply, e.Data.Nick, String.Format("{0} {1}", e.CtcpCommand, DateTime.Now.ToString( "ddd MMM dd HH:mm:ss yyyy", DateTimeFormatInfo.InvariantInfo ) ) ); }; } private void OnWho(object sender, WhoEventArgs e) { if (e.WhoInfo.Nick == _IrcClient.Nickname) { // that's me! IrcMe.Ident = e.WhoInfo.Ident; IrcMe.Host = e.WhoInfo.Host; IrcMe.RealName = e.WhoInfo.Realname; } } private void OnInvite(object sender, InviteEventArgs e) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.MessageType = MessageType.Normal; var msg = builder.CreateFormat(_("{0} invites you to {1}"), CreatePerson(e.Who), e.Channel); foreach (var part in msg) { part.IsHighlight = true; } builder.Append(msg); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); builder = CreateMessageBuilder(); string host; if (String.IsNullOrEmpty(NetworkID)) { host = _IrcClient.Address; } else { host = NetworkID; var serverSettings = new ServerListController(Session.UserConfig); var server = serverSettings.GetServerByNetwork(host); if (server == null) { // if the network is not stored in config, we need to // fallback to the bare server address. Otherwise the // frontend will have no idea how to connect to it. host = _IrcClient.Address; } } string url = String.Format("irc://{0}/{1}", host, e.Channel); builder.AppendUrl(url, _("Accept invite (join room)")); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); } void OnReadLine(object sender, ReadLineEventArgs e) { DebugRead(e.Line); } void OnWriteLine(object sender, WriteLineEventArgs e) { DebugWrite(e.Line); } public override string ToString() { string result = null; if (_IrcClient != null) { if (String.IsNullOrEmpty(_Network)) { result += _IrcClient.Address; } else { result += _Network; } } result += " (IRC)"; if (IsConnected) { if (_IrcClient.IsAway) { result += " (" + _("away") + ")"; } if (_IrcClient.Lag > TimeSpan.FromSeconds(5)) { result += String.Format(" ({0})", String.Format( // TRANSLATOR: {0} is the amount of seconds _("lag: {0} seconds"), (int) _IrcClient.Lag.TotalSeconds ) ); } } else { result += " (" + _("not connected") + ")"; } return result; } public override void Connect(FrontendManager fm, ServerModel server) { Trace.Call(fm, server); if (server == null) { throw new ArgumentNullException("server"); } _FrontendManager = fm; _ServerModel = server; ApplyConfig(Session.UserConfig, server); // TODO: use config for single network chat or once per network manager _NetworkChat = Session.CreateChat( _Network, "IRC " + _Network, this ); // BUG: race condition when we use Session.AddChat() as it pushes this already // to the connected frontend and the frontend will sync and get the page 2 times! //Session.Chats.Add(_NetworkChat); // NOTABUG: the frontend manager needs to take care for that Session.AddChat(_NetworkChat); Session.SyncChat(_NetworkChat); _RunThread = new Thread(new ThreadStart(_Run)); _RunThread.IsBackground = true; _RunThread.Name = String.Format( "IrcProtocolManager ({0}:{1}) listener", server.Hostname, server.Port ); _RunThread.Start(); _LagWatcherThread = new Thread(new ThreadStart(_LagWatcher)); _LagWatcherThread.IsBackground = true; _LagWatcherThread.Name = String.Format( "IrcProtocolManager ({0}:{1}) lag watcher", server.Hostname, server.Port ); _LagWatcherThread.Start(); } public void Connect(FrontendManager fm) { Trace.Call(fm); MessageBuilder builder; try { if (!String.IsNullOrEmpty(_IrcClient.ProxyHost)) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Using proxy: {0}:{1}"), _IrcClient.ProxyHost, _IrcClient.ProxyPort); Session.AddMessageToChat(Chat, builder.ToMessage()); } string msg; msg = String.Format(_("Connecting to {0} port {1}..."), _Host, _Port); if (fm != null) { fm.SetStatus(msg); } builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(msg); Session.AddMessageToChat(Chat, builder.ToMessage()); // TODO: add SSL support _IrcClient.Connect(_Host, _Port); if (fm != null) { fm.UpdateNetworkStatus(); } msg = String.Format(_("Connection to {0} established"), _Host); if (fm != null) { fm.SetStatus(msg); } builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(msg); Session.AddMessageToChat(Chat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(_("Logging in...")); Session.AddMessageToChat(Chat, builder.ToMessage()); string realname = _Realname; if (realname == null || realname.Trim().Length == 0) { realname = "unset"; } if (!Regex.IsMatch(_Username, "^[a-z0-9]+$", RegexOptions.IgnoreCase)) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendWarningText( "Warning: Your username (ident) contains special " + "characters which the IRC server might refuse. " + "If this happens please change your username in the " + "server settings." ); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); } _IrcClient.Login(_Nicknames, realname, 0, _Username, _Password); // set Me property very early as we might need to know who we // are before the registration was confirmed in _OnRegistered() Me = CreatePerson(_IrcClient.Nickname); foreach (string command in (string[]) Session.UserConfig["Connection/OnConnectCommands"]) { if (command.Length == 0) { continue; } CommandModel cd = new CommandModel(_FrontendManager, _NetworkChat, (string) Session.UserConfig["Interface/Entry/CommandCharacter"], command); bool handled; handled = Session.Command(cd); if (!handled) { Command(cd); } } _Listening = true; } catch (CouldNotConnectException ex) { if (fm != null) { fm.SetStatus(_("Connection failed!")); } builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Connection failed! Reason: ")); builder.AppendText(ex.Message); if (ex.InnerException is IOException && ex.InnerException.InnerException != null && ex.InnerException.InnerException.GetType().FullName == "Mono.Security.Protocol.Tls.TlsException") { // this is a CA / certificate issue builder.AppendSpace(); builder.AppendUrl( "https://smuxi.im/faq/troubleshooting/linux-tls/", "[" + _("Open Smuxi FAQ for help") + "]" ); } Session.AddMessageToChat(Chat, builder.ToMessage()); throw; } } public override void Disconnect(FrontendManager fm) { Trace.Call(fm); MessageBuilder builder; if (fm != null) { fm.SetStatus(_("Disconnecting...")); } if (IsConnected) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Disconnecting from {0}..."), _IrcClient.Address); Session.AddMessageToChat(Chat, builder.ToMessage()); // else the Listen() thread would try to connect again _Listening = false; _IrcClient.Disconnect(); if (fm != null) { fm.SetStatus(String.Format(_("Disconnected from {0}"), _IrcClient.Address)); } builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Connection closed")); Session.AddMessageToChat(Chat, builder.ToMessage()); // TODO: set someone else as current network manager? } else { if (fm != null) { fm.SetStatus(String.Empty); } builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Not connected")); Session.AddMessageToFrontend(fm, Chat, builder.ToMessage()); } if (_RunThread != null && _RunThread.IsAlive) { try { _RunThread.Abort(); } catch (Exception ex) { #if LOG4NET _Logger.Error("_RunThread.Abort() failed:", ex); #endif } } if (_LagWatcherThread != null && _LagWatcherThread.IsAlive) { try { _LagWatcherThread.Abort(); } catch (Exception ex) { #if LOG4NET _Logger.Error("_LagWatcherThread.Abort() failed:", ex); #endif } } if (fm != null) { fm.UpdateNetworkStatus(); } } public override void Reconnect(FrontendManager fm) { Trace.Call(fm); MessageBuilder builder; if (fm != null) { fm.SetStatus(_("Reconnecting...")); } try { string msg; if (_IrcClient != null) { if (_IrcClient.IsConnected) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Reconnecting to {0}..."), _IrcClient.Address); Session.AddMessageToChat(Chat, builder.ToMessage()); ApplyConfig(Session.UserConfig, _ServerModel); _IrcClient.Reconnect(true); msg = String.Format(_("Connection to {0} established"), _IrcClient.Address); if (fm != null) { fm.SetStatus(msg); } builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(msg); Session.AddMessageToChat(Chat, builder.ToMessage()); } else { Connect(fm); } } else { msg = _("Reconnect Error"); if (fm != null) { fm.SetStatus(msg); } builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(msg); Session.AddMessageToChat(Chat, builder.ToMessage()); } } catch (ConnectionException) { if (fm != null) { fm.SetStatus(String.Empty); } builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(_("Not connected")); Session.AddMessageToFrontend(fm, Chat, builder.ToMessage()); } if (fm != null) { fm.UpdateNetworkStatus(); } } public override void Dispose() { Trace.Call(); _ChannelJoinQueue.Dispose(); base.Dispose(); } public override IList FindGroupChats(GroupChatModel filter) { Trace.Call(filter); // invalidate channel list cache when too old if (NetworkChannels != null && (DateTime.UtcNow - NetworkChannelsAge) > NetworkChannelsMaxAge) { NetworkChannels = null; } string searchPattern = null; if (filter == null || String.IsNullOrEmpty(filter.Name)) { // full channel list } else { if (!filter.Name.StartsWith("*") && !filter.Name.EndsWith("*")) { searchPattern = String.Format("*{0}*", filter.Name); } else { searchPattern = filter.Name; } } var channels = NetworkChannels; if (channels == null && HasSafeListSupport) { // fetch and cache full channel list from server channels = _IrcClient.GetChannelList(String.Empty); NetworkChannels = channels; NetworkChannelsAge = DateTime.UtcNow; } else if (channels == null && searchPattern != null && HasListMaskSearchSupport) { channels = _IrcClient.GetChannelList(searchPattern); } else if (channels == null) { // Houston, we have a problem // no safelist and empty search pattern, the IRCd might kill us! channels = _IrcClient.GetChannelList(String.Empty); NetworkChannels = channels; NetworkChannelsAge = DateTime.UtcNow; } List chats = new List(channels.Count); foreach (ChannelInfo info in channels) { if (channels == NetworkChannels && searchPattern != null && !Pattern.IsMatch(info.Channel, searchPattern)) { continue; } GroupChatModel chat = new GroupChatModel( info.Channel, info.Channel, null ); chat.PersonCount = info.UserCount; var topic = CreateMessageBuilder(); topic.AppendMessage(info.Topic); chat.Topic = topic.ToMessage(); chats.Add(chat); } return chats; } public override void OpenChat(FrontendManager fm, ChatModel chat) { Trace.Call(fm, chat); CommandModel cmd = new CommandModel(fm, _NetworkChat, chat.ID); switch (chat.ChatType) { case ChatType.Person: CommandQuery(cmd); break; case ChatType.Group: CommandJoin(cmd); break; } } public override void CloseChat(FrontendManager fm, ChatModel chatInfo) { Trace.Call(fm, chatInfo); if (fm == null) { throw new ArgumentNullException("fm"); } if (chatInfo == null) { throw new ArgumentNullException("chatInfo"); } // get real chat object from session var chat = GetChat(chatInfo.ID, chatInfo.ChatType); if (chat == null) { #if LOG4NET _Logger.Error("CloseChat(): Session.GetChat(" + chatInfo.ID + ", " + chatInfo.ChatType + ")" + " returned null!"); #endif return; } if (!chat.IsEnabled) { Session.RemoveChat(chat); return; } switch (chat.ChatType) { case ChatType.Person: Session.RemoveChat(chat); break; case ChatType.Group: CommandModel cmd = new CommandModel(fm, _NetworkChat, chat.ID); CommandPart(cmd); break; } } public override void SetPresenceStatus(PresenceStatus status, string message) { Trace.Call(status, message); if (!_IrcClient.IsConnected) { return; } switch (status) { case PresenceStatus.Online: if (!_IrcClient.IsAway) { // nothing to do return; } _IrcClient.RfcAway(); break; case PresenceStatus.Away: if (String.IsNullOrEmpty(message)) { // HACK: empty away message unsets away state on IRC message = "away"; } _IrcClient.RfcAway(message); break; } base.SetPresenceStatus(status, message); } public override bool Command(CommandModel command) { Trace.Call(command); bool handled = false; if (IsConnected) { if (command.IsCommand) { // commands which work when we have a connection switch (command.Command) { case "help": CommandHelp(command); handled = true; break; // commands which work on serverchat/channels/queries case "j": case "join": CommandJoin(command); handled = true; break; case "msg": CommandMessage(command); handled = true; break; case "query": CommandQuery(command); handled = true; break; case "amsg": CommandAllMessage(command); handled = true; break; case "anotice": CommandAllNotice(command); handled = true; break; case "ame": CommandAllMe(command); handled = true; break; case "notice": CommandNotice(command); handled = true; break; case "nick": CommandNick(command); handled = true; break; case "raw": case "quote": CommandRaw(command); handled = true; break; case "ping": CommandPing(command); handled = true; break; case "version": CommandVersion(command); handled = true; break; case "time": CommandTime(command); handled = true; break; case "finger": CommandFinger(command); handled = true; break; case "who": CommandWho(command); handled = true; break; case "whois": CommandWhoIs(command); handled = true; break; case "whowas": CommandWhoWas(command); handled = true; break; case "away": CommandAway(command); // send away on all other IRC networks too lock (Session.ProtocolManagers) { foreach (IProtocolManager nm in Session.ProtocolManagers) { if (nm == this) { // skip us, else we send it 2 times continue; } if (nm is IrcProtocolManager) { IrcProtocolManager ircnm = (IrcProtocolManager)nm; ircnm.CommandAway(command); } } } handled = true; break; case "ctcp": CommandCtcp(command); handled = true; break; case "oper": CommandOper(command); handled = true; break; // commands which only work on channels or queries case "me": CommandMe(command); handled = true; break; case "say": CommandSay(command); handled = true; break; // commands which only work on channels case "p": case "part": CommandPart(command); handled = true; break; case "topic": CommandTopic(command); handled = true; break; case "cycle": case "rejoin": CommandCycle(command); handled = true; break; case "op": CommandOp(command); handled = true; break; case "deop": CommandDeop(command); handled = true; break; case "owner": CommandOwner(command); handled = true; break; case "deowner": CommandDeowner(command); handled = true; break; case "chanadmin": CommandChanAdmin(command); handled = true; break; case "dechanadmin": CommandDeChanAdmin(command); handled = true; break; case "halfop": CommandHalfop(command); handled = true; break; case "dehalfop": CommandDehalfop(command); handled = true; break; case "voice": CommandVoice(command); handled = true; break; case "devoice": CommandDevoice(command); handled = true; break; case "ban": CommandBan(command); handled = true; break; case "unban": CommandUnban(command); handled = true; break; case "banexcept": CommandBanException(command); handled = true; break; case "unbanexcept": CommandUnBanException(command); handled = true; break; case "inviteexcept": CommandInviteException(command); handled = true; break; case "uninviteexcept": CommandUnInviteException(command); handled = true; break; case "kick": CommandKick(command); handled = true; break; case "kickban": case "kb": CommandKickban(command); handled = true; break; case "mode": CommandMode(command); handled = true; break; case "invite": CommandInvite(command); handled = true; break; case "names": CommandNames(command); handled = true; break; case "quit": CommandQuit(command); handled = true; break; case "sleep": int amount = 0; if (Int32.TryParse(command.Parameter, out amount)) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText( _("Sleeping for {0} milliseconds"), amount ). ToMessage(); Session.AddMessageToChat(Chat, msg); Thread.Sleep(amount); } else { _NotEnoughParameters(command); } handled = true; break; } } else { // normal text if (command.Chat.ChatType == ChatType.Session || command.Chat.ChatType == ChatType.Protocol) { // we are on the session chat or protocol chat _IrcClient.WriteLine(command.Data); } else { // split multiline messages string[] lines = command.Data.Split(new char[] {'\n'}); foreach (string line in lines) { // split too long messages var messages = SplitMessage("PRIVMSG", command.Chat.ID, line); foreach (string message in messages) { _Say(command.Chat, message); } } } handled = true; } } else { if (command.IsCommand) { // commands which work even without beeing connected switch (command.Command) { case "help": CommandHelp(command); handled = true; break; case "connect": CommandConnect(command); handled = true; break; } } else { // normal text, without connection _NotConnected(command); handled = true; } } return handled; } private void CommandFallback(CommandModel cmd) { string parameters; if (cmd.DataArray.Length <= 3) { parameters = cmd.Parameter; } else { parameters = String.Format("{0} :{1}", cmd.DataArray[1], String.Join(" ", cmd.DataArray, 2, cmd.DataArray.Length - 2)); } string data = String.Format("{0}raw {1} {2}", cmd.CommandCharacter, cmd.Command, parameters); CommandModel command = new CommandModel( cmd.FrontendManager, cmd.Chat, cmd.CommandCharacter, data ); CommandRaw(command); } public void CommandHelp(CommandModel cd) { var builder = CreateMessageBuilder(); // TRANSLATOR: this line is used as label / category for a // list of commands below builder.AppendHeader(_("IrcProtocolManager Commands")); Session.AddMessageToFrontend(cd, builder.ToMessage()); string[] help = { "connect irc server [port|+port] [password] [nicknames]", "say", "join/j channel(s) [key]", "part/p [channel(s)] [part-message]", "topic [new-topic]", "names", "cycle/rejoin", "msg/query (channel|nick) message", "amsg message", "me action-message", "ame action-message", "notice (channel|nick) message", "anotice message", "invite nick [channel]", "who nick/channel", "whois nick", "whowas nick", "ping nick", "version nick", "time nick", "finger nick", "mode [target] [new-mode]", "away [away-message]", "oper username password", "kick nick(s) [reason]", "kickban/kb nick(s) [reason]", "ban [mask]", "unban mask", "banexcept [mask]", "unbanexcept mask", "inviteexcept [mask]", "uninviteexcept mask", "voice nick", "devoice nick", "op nick", "deop nick", "owner nick", "deowner nick", "chanadmin nick", "dechanadmin nick", "halfop nick", "dehalfop nick", "nick newnick", "ctcp destination command [data]", "raw/quote irc-command", "quit [quit-message]", }; foreach (string line in help) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(line); Session.AddMessageToFrontend(cd, builder.ToMessage()); } } public void CommandConnect(CommandModel cd) { FrontendManager fm = cd.FrontendManager; var server = new IrcServerModel(); if (cd.DataArray.Length >= 3) { server.Hostname = cd.DataArray[2]; } else { server.Hostname = "localhost"; } if (cd.DataArray.Length >= 4) { var port = cd.DataArray[3]; var ssl = port.StartsWith("+"); if (ssl) { server.UseEncryption = true; port = port.Substring(1); } try { server.Port = Int32.Parse(port); } catch (FormatException) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Invalid port: {0}"), cd.DataArray[3]); Session.AddMessageToFrontend(fm, Chat, builder.ToMessage()); return; } } else { server.Port = 6667; } if (cd.DataArray.Length >= 5) { server.Password = cd.DataArray[4]; } if (cd.DataArray.Length >= 6) { var nicks = new List(1); nicks.Add(cd.DataArray[5]); server.Nicknames = nicks; } Connect(fm, server); } public void CommandSay(CommandModel cd) { _Say(cd.Chat, cd.Parameter); } private void _Say(ChatModel chat, string message) { if (!chat.IsEnabled) { return; } if (chat is PersonChatModel) { PersonModel person = ((PersonChatModel) chat).Person; IrcPersonModel ircperson = (IrcPersonModel) person; ircperson.IsAway = false; } _IrcClient.SendMessage(SendType.Message, chat.ID, message); var builder = CreateMessageBuilder(); builder.AppendSenderPrefix(Me); Match m = Regex.Match(message, String.Format(@"^@(?\S+)|^(?\S+)(?:\:|,)")); if (m.Success && chat is GroupChatModel) { // this is probably a reply with a nickname string nick = m.Groups["nick"].Value; #if LOG4NET _Logger.Debug("_Say(): detected reply with possible nick: '" + nick + "' in: '" + m.Value + "'"); #endif var groupChat = (GroupChatModel) chat; PersonModel person; if (groupChat.Persons.TryGetValue(nick, out person)) { // bingo, it's a nick on this channel message = message.Substring(m.Value.Length); var coloredNick = builder.CreateIdendityName(person); coloredNick.Text = m.Value; builder.AppendText(coloredNick); } } builder.AppendMessage(message); var msg = builder.ToMessage(); Session.AddMessageToChat(chat, msg, true); OnMessageSent( new MessageEventArgs(chat, msg, null, chat.ID) ); } public void CommandJoin(CommandModel cd) { Trace.Call(cd); MessageBuilder builder; if (cd.DataArray.Length < 2 || cd.DataArray[1].Length == 0) { _NotEnoughParameters(cd); return; } string[] channels = cd.DataArray[1].Split(','); string[] keys = null; if (cd.DataArray.Length > 2) { keys = cd.DataArray[2].Split(','); } int activeCount; lock (_ActiveChannelJoinList) { activeCount = _ActiveChannelJoinList.Count; } if (activeCount > 0) { // ok, these channels will be queued builder = CreateMessageBuilder(); builder.AppendEventPrefix(); // TRANSLATOR: some IRC networks dislike too many joins in a // short period and thus Smuxi throttles/queues them builder.AppendText(_("Queuing joins: {0}"), String.Join(" ", channels)); Session.AddMessageToFrontend(cd.FrontendManager, Chat, builder.ToMessage()); } int i = 0; foreach (string channel in channels) { // HACK: copy channel from foreach() into our scope var chan = channel; var chanType = chan[0]; if (!ChannelTypes.Contains(chanType.ToString())) { chan = "#" + chan; } string key = keys != null && keys.Length > i ? keys[i] : null; var chat = GetChat(chan, ChatType.Group); if (chat != null && chat.IsEnabled) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Already joined to channel: {0}." + " Type /window {0} to switch to it."), channel ); Session.AddMessageToFrontend(cd, builder.ToMessage()); continue; } lock (_QueuedChannelJoinList) { _QueuedChannelJoinList.Add(channel); } _ChannelJoinQueue.Queue(delegate { try { int count = 0; string activeChans = null; lock (_ActiveChannelJoinList) { count = _ActiveChannelJoinList.Count; if (count > 0) { activeChans = String.Join( " ", _ActiveChannelJoinList.ToArray() ); } } if (count > 0) { string queuedChans; lock (_QueuedChannelJoinList) { queuedChans = String.Join( " ", _QueuedChannelJoinList.ToArray() ); } builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( _("Active joins: {0} - Queued joins: {1}"), activeChans, queuedChans ); Session.AddMessageToFrontend(cd.FrontendManager, Chat, builder.ToMessage()); #if LOG4NET _Logger.Debug("CommandJoin(): waiting to join: " + chan); #endif _ActiveChannelJoinHandle.WaitOne(); lock (_ActiveChannelJoinList) { activeChans = String.Join( " ", _ActiveChannelJoinList.ToArray() ); } lock (_QueuedChannelJoinList) { _QueuedChannelJoinList.Remove(chan); queuedChans = String.Join( " ", _QueuedChannelJoinList.ToArray() ); } // TRANSLATORS: final message will look like this: // Joining: #chan1 - Remaining active joins: #chan2 / queued joins: #chan3 string msg = String.Format(_("Joining: {0}"), chan); if (activeChans.Length > 0 || queuedChans.Length > 0) { msg += String.Format(" - {0} ", _("Remaining")); } if (activeChans.Length > 0) { msg += String.Format( _("active joins: {0}"), activeChans ); } if (queuedChans.Length > 0) { if (activeChans.Length > 0) { msg += " / "; } msg += String.Format( _("queued joins: {0}"), queuedChans ); } builder = CreateMessageBuilder(); builder.AppendEventPrefix().AppendText(msg); Session.AddMessageToFrontend(cd.FrontendManager, Chat, builder.ToMessage()); } else { lock (_QueuedChannelJoinList) { _QueuedChannelJoinList.Remove(chan); } builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Joining: {0}"), chan); Session.AddMessageToFrontend(cd.FrontendManager, Chat, builder.ToMessage()); } #if LOG4NET _Logger.Debug("CommandJoin(): joining: " + chan); #endif // we have a slot, show time! if (key == null) { _IrcClient.RfcJoin(chan); } else { _IrcClient.RfcJoin(chan, key); lock (ChannelKeys) { ChannelKeys[chan] = key; } } // Some IRC networks are very kick happy and thus need // some artificial delay between JOINs. // We know our friendly networks though :) string network = _Network == null ? String.Empty : _Network.ToLower(); switch (network) { case "efnet": case "freenode": case "gimpnet": case "ircnet": case "oftc": // give the IRCd some time to actually sent us a JOIN // confirmation, else we will just hammer all channels // in a single row _ActiveChannelJoinHandle.WaitOne(2 * 1000, false); break; default: // delay the queue for some extra seconds so new join // attempts will not happen too early as some IRCds // limit this and disconnect us if we are not brave Thread.Sleep(2000); break; } } catch (ThreadAbortException ex) { #if LOG4NET _Logger.Warn("ThreadAbortException when trying to join channel: " + chan, ex); #endif } catch (Exception ex) { #if LOG4NET _Logger.Error("Exception when trying to join channel: " + chan, ex); #endif } }); i++; } } public void CommandCycle(CommandModel cd) { if (cd.Chat.ChatType == ChatType.Group) { if (cd.Chat.IsEnabled) { // disable chat so we don't loose the message buffer Session.DisableChat(cd.Chat); _IrcClient.RfcPart(cd.Chat.ID); } string key; lock (ChannelKeys) { ChannelKeys.TryGetValue(cd.Chat.ID, out key); } if (String.IsNullOrEmpty(key)) { _IrcClient.RfcJoin(cd.Chat.ID); } else { _IrcClient.RfcJoin(cd.Chat.ID, key); } } } public void CommandMessage(CommandModel cd) { Trace.Call(cd); if ((cd.DataArray.Length >= 2) && (cd.DataArray[1].Length >= 1)) { var chanType = cd.DataArray[1][0].ToString(); if (ChannelTypes.Contains(chanType)) { // seems to be a channel CommandMessageChannel(cd); } else { // seems to be a nick CommandMessageNick(cd); } } else { NotEnoughParameters(cd); } } public void CommandQuery(CommandModel cd) { ChatModel chat = null; if (cd.DataArray.Length >= 2) { string nickname = cd.DataArray[1]; chat = GetChat(nickname, ChatType.Person); if (chat == null) { var person = CreatePerson(nickname); chat = Session.CreatePersonChat(person, nickname, nickname, this); Session.AddChat(chat); if (Session.IsLocal) { Session.SyncChat(chat); } else { // HACK: lower probability of sync race condition swallowing // messages, see: https://www.smuxi.org/issues/show/634 ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(1000); Session.SyncChat(chat); }); } } } if (cd.DataArray.Length >= 3) { string message = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); // ignore empty messages if (message.TrimEnd(' ').Length > 0) { _Say(chat, message); } } } public void CommandMessageChannel(CommandModel cd) { if (cd.DataArray.Length >= 3) { string message = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); string channelname = cd.DataArray[1]; ChatModel chat = GetChat(channelname, ChatType.Group); if (chat == null) { // server chat as fallback if we are not joined var builder = CreateMessageBuilder(); builder.AppendText("<{0}:{1}> ", _IrcClient.Nickname, channelname); builder.AppendMessage(message); Session.AddMessageToChat(Chat, builder.ToMessage(), true); _IrcClient.SendMessage(SendType.Message, channelname, message); } else { _Say(chat, message); } } else { _NotEnoughParameters(cd); } } [Obsolete("CommandMessageQuery() is deprecated, use CommandQuery() instead")] public void CommandMessageQuery(CommandModel cmd) { CommandQuery(cmd); } public void CommandMessageNick(CommandModel cmd) { if (cmd == null) { throw new ArgumentNullException("cmd"); } if (cmd.DataArray.Length < 3) { NotEnoughParameters(cmd); return; } var nickname = cmd.DataArray[1]; string message = String.Join(" ", cmd.DataArray, 2, cmd.DataArray.Length - 2); // ignore empty messages if (message.TrimEnd(' ').Length == 0) { return; } var chat = GetChat(nickname, ChatType.Person); if (chat == null) { // fallback to protocol chat + where the command was issued var msg = CreateMessageBuilder(). AppendText("<{0}:{1}> ", _IrcClient.Nickname, nickname). AppendMessage(message). ToMessage(); Session.AddMessageToChat(_NetworkChat, msg, true); if (cmd.Chat != _NetworkChat && cmd.FrontendManager != null) { cmd.FrontendManager.AddMessageToChat(cmd.Chat, msg); } _IrcClient.SendMessage(SendType.Message, nickname, message); } else { _Say(chat, message); } } private IList SplitMessage(string command, string target, string message) { List messages = new List(); int line = 0; do { var lineByteLength = GetProtocolMessageLength(command, target, message); if (lineByteLength <= 512) { if (line > 0) { // remove leading spaces as we are a new line messages.Add(message.TrimStart(new char[] {' '})); } else { messages.Add(message); } break; } line++; // UTF8 can have multi-byte chars, thus we need to remove char // by char and see when it fits into an IRC message var chunkBuilder = new StringBuilder(message); var chunkByteLength = lineByteLength; while (chunkByteLength > 512) { chunkBuilder.Length--; chunkByteLength = GetProtocolMessageLength( command, target, chunkBuilder.ToString() ); } var chunk = chunkBuilder.ToString(); string nextChar = message.Substring(chunk.Length, 1); if (nextChar != " ") { // we split in the middle of a word, split it better! int lastWordPos = chunk.LastIndexOf(" "); if (lastWordPos > 0) { // the chunk has to get smaller, else we run into an // endless loop chunk = chunk.Substring(0, lastWordPos); } } // remove leading spaces as we are a new line messages.Add(chunk.TrimStart(new char[] {' '})); message = message.Substring(chunk.Length); } while (true); return messages; } public void CommandAllMessage(CommandModel cd) { if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } string message = cd.Parameter; foreach (ChatModel chat in Chats) { if (chat.ChatType != ChatType.Group) { // only show on group chats continue; } CommandModel msgCmd = new CommandModel( cd.FrontendManager, cd.Chat, String.Format("{0} {1}", chat.ID, message) ); CommandMessageChannel(msgCmd); } } public void CommandAllNotice(CommandModel cd) { if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } string message = cd.Parameter; foreach (ChatModel chat in Chats) { if (chat.ChatType != ChatType.Group) { // only show on group chats continue; } CommandModel msgCmd = new CommandModel( cd.FrontendManager, cd.Chat, String.Format("{0} {1}", chat.ID, message) ); CommandNotice(msgCmd); } } public void CommandAllMe(CommandModel cd) { if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } string message = cd.Parameter; foreach (ChatModel chat in Chats) { if (chat.ChatType != ChatType.Group) { // only show on group chats continue; } CommandModel msgCmd = new CommandModel( cd.FrontendManager, chat, message ); CommandMe(msgCmd); } } public void CommandPart(CommandModel cd) { ChatModel chat = cd.Chat; if ((cd.DataArray.Length >= 2) && (cd.DataArray[1].Length >= 1)) { // have to guess here if we got a channel passed or not var chanType = cd.DataArray[1][0].ToString(); if (ChannelTypes.Contains(chanType)) { // seems to be a channel string[] channels = cd.DataArray[1].Split(new char[] {','}); string message = null; if (cd.DataArray.Length >= 3) { message = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); } foreach (string channel in channels) { if (message != null) { _IrcClient.RfcPart(channel, message); } else { _IrcClient.RfcPart(channel); } } } else { // sems to be only a part message _IrcClient.RfcPart(chat.ID, cd.Parameter); } } else { _IrcClient.RfcPart(chat.ID); } } public void CommandAway(CommandModel cd) { if (cd.DataArray.Length >= 2) { SetPresenceStatus(PresenceStatus.Away, cd.Parameter); } else { SetPresenceStatus(PresenceStatus.Online, null); } } public void CommandOper(CommandModel cd) { if (cd.DataArray.Length < 3) { _NotEnoughParameters(cd); return; } _IrcClient.RfcOper(cd.DataArray[1], cd.DataArray[2]); } public void CommandCtcp(CommandModel cd) { if (cd.DataArray.Length >= 3) { string destination = cd.DataArray[1]; string command = cd.DataArray[2].ToUpper(); string parameters = String.Empty; if (cd.DataArray.Length >= 4) { parameters = String.Join(" ", cd.DataArray, 3, cd.DataArray.Length-3); } var builder = CreateMessageBuilder(); builder.AppendText("[ctcp({0})] {1} {2}", destination, command, parameters); Session.AddMessageToChat(Chat, builder.ToMessage()); _IrcClient.SendMessage(SendType.CtcpRequest, destination, command + " " + parameters); } else { _NotEnoughParameters(cd); } } public void CommandPing(CommandModel cd) { if (cd.DataArray.Length >= 2) { string destination = cd.DataArray[1]; string timestamp = DateTime.Now.ToFileTime().ToString(); var builder = CreateMessageBuilder(); builder.AppendText("[ctcp({0})] {1} {2}", destination, "PING", timestamp); Session.AddMessageToChat(Chat, builder.ToMessage()); _IrcClient.SendMessage(SendType.CtcpRequest, destination, "PING " + timestamp); } else { _NotEnoughParameters(cd); } } public void CommandTime(CommandModel cd) { if (cd.DataArray.Length >= 2) { string destination = cd.DataArray[1]; var builder = CreateMessageBuilder(); builder.AppendText("[ctcp({0})] {1}", destination, "TIME"); Session.AddMessageToChat(Chat, builder.ToMessage()); _IrcClient.SendMessage(SendType.CtcpRequest, destination, "TIME"); } else { _NotEnoughParameters(cd); } } public void CommandVersion(CommandModel cd) { if (cd.DataArray.Length >= 2) { string destination = cd.DataArray[1]; var builder = CreateMessageBuilder(); builder.AppendText("[ctcp({0})] {1}", destination, "VERSION"); Session.AddMessageToChat(Chat, builder.ToMessage()); _IrcClient.SendMessage(SendType.CtcpRequest, destination, "VERSION"); } else { _NotEnoughParameters(cd); } } public void CommandFinger(CommandModel cd) { if (cd.DataArray.Length >= 2) { string destination = cd.DataArray[1]; var builder = CreateMessageBuilder(); builder.AppendText("[ctcp({0})] {1}", destination, "FINGER"); Session.AddMessageToChat(Chat, builder.ToMessage()); _IrcClient.SendMessage(SendType.CtcpRequest, destination, "FINGER"); } else { _NotEnoughParameters(cd); } } public void CommandWho(CommandModel cd) { if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } IList infos = _IrcClient.GetWhoList(cd.DataArray[1]); // irssi: * meebey H 1 ~meebey@e176002059.adsl.alicedsl.de [Mirco Bauer] foreach (WhoInfo info in infos) { string mode; if (info.IsIrcOp) { mode = _("IRC Op"); } else if (info.IsOwner) { mode = _("Owner"); } else if (info.IsChannelAdmin) { mode = _("ChanAdmin"); } else if (info.IsOp) { mode = _("Op"); } else if (info.IsHalfop) { mode = _("Halfop"); } else if (info.IsVoice) { mode = _("Voice"); } else { mode = String.Empty; } string msg = String.Format( "-!- {0} {1} {2}{3} {4} {5}@{6} [{7}]", info.Channel, info.Nick, mode, info.IsAway ? " (" + _("away") + ")" : String.Empty, info.HopCount, info.Ident, info.Host, info.Realname ); var builder = CreateMessageBuilder().AppendText(msg); Session.AddMessageToChat(cd.Chat, builder.ToMessage()); } } public void CommandWhoIs(CommandModel cd) { if (cd.DataArray.Length >= 2) { _IrcClient.RfcWhois(cd.Parameter); } else { if (cd.Chat is PersonChatModel) { var pchat = (PersonChatModel) cd.Chat; _IrcClient.RfcWhois(pchat.Person.ID); } else { _NotEnoughParameters(cd); } } } public void CommandWhoWas(CommandModel cd) { if (cd.DataArray.Length >= 2) { _IrcClient.RfcWhowas(cd.DataArray[1]); } else { if (cd.Chat is PersonChatModel) { var pchat = (PersonChatModel) cd.Chat; _IrcClient.RfcWhowas(pchat.Person.ID); } else { _NotEnoughParameters(cd); } } } public void CommandTopic(CommandModel cd) { MessageBuilder builder; string channel = cd.Chat.ID; if (cd.DataArray.Length >= 2) { _IrcClient.RfcTopic(channel, cd.Parameter); } else { var groupChat = (GroupChatModel) Session.GetChat( channel, ChatType.Group, this ); if (groupChat != null) { var topic = groupChat.Topic; builder = CreateMessageBuilder(); builder.AppendEventPrefix(); if (topic != null && !topic.IsEmpty) { builder.AppendFormat(_("Topic for {0}: {1}"), channel, topic); } else { builder.AppendText(_("No topic set for {0}"), channel); } Session.AddMessageToFrontend(cd, builder.ToMessage()); } } } public void CommandOp(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Op(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Op(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandDeop(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Deop(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Deop(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandVoice(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Voice(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Voice(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandDevoice(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Devoice(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Devoice(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandOwner(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Owner(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Owner(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandDeowner(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Deowner(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Deowner(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandChanAdmin(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.ChanAdmin(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.ChanAdmin(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandDeChanAdmin(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.DeChanAdmin(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.DeChanAdmin(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandHalfop(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Halfop(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Halfop(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandDehalfop(CommandModel cd) { ChatModel chat = cd.Chat; string channel = chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Dehalfop(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Dehalfop(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandBan(CommandModel cd) { MessageBuilder builder; string channel = cd.Chat.ID; if (cd.DataArray.Length == 2) { // TODO: use a smart mask by default _IrcClient.Ban(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Ban(channel, candidates); } else { IList infos = _IrcClient.GetBanList(channel); int i = 1; foreach (BanInfo info in infos) { string msg = String.Format( "{0} - {1}: {2} {3}", i++, info.Channel, _("ban"), info.Mask ); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(msg); Session.AddMessageToFrontend(cd, builder.ToMessage()); } if (infos.Count == 0) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("No bans in channel"), channel); Session.AddMessageToFrontend(cd, builder.ToMessage()); } } } public void CommandUnban(CommandModel cd) { string channel = cd.Chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.Unban(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.Unban(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandBanException(CommandModel cd) { MessageBuilder builder; string channel = cd.Chat.ID; if (cd.DataArray.Length == 2) { // TODO: use a smart mask by default _IrcClient.BanException(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.BanException(channel, candidates); } else { IList infos = _IrcClient.GetBanExceptionList(channel); int i = 1; foreach (BanInfo info in infos) { string msg = String.Format( "{0} - {1}: {2} {3}", i++, info.Channel, _("ban exception"), info.Mask ); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(msg); Session.AddMessageToFrontend(cd, builder.ToMessage()); } if (infos.Count == 0) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("No ban exceptions in channel"), channel); Session.AddMessageToFrontend(cd, builder.ToMessage()); } } } public void CommandUnBanException(CommandModel cd) { string channel = cd.Chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.UnBanException(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.UnBanException(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandInviteException(CommandModel cd) { MessageBuilder builder; string channel = cd.Chat.ID; if (cd.DataArray.Length == 2) { // TODO: use a smart mask by default _IrcClient.InviteException(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.InviteException(channel, candidates); } else { IList infos = _IrcClient.GetInviteExceptionList(channel); int i = 1; foreach (BanInfo info in infos) { string msg = String.Format( "{0} - {1}: {2} {3}", i++, info.Channel, _("invite exception"), info.Mask ); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(msg); Session.AddMessageToFrontend(cd, builder.ToMessage()); } if (infos.Count == 0) { builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("No invite exceptions in channel"), channel); Session.AddMessageToFrontend(cd, builder.ToMessage()); } } } public void CommandUnInviteException(CommandModel cd) { string channel = cd.Chat.ID; if (cd.DataArray.Length == 2) { _IrcClient.UnInviteException(channel, cd.Parameter); } else if (cd.DataArray.Length > 2) { string[] candidates = cd.Parameter.TrimEnd().Split(new char[] {' '}); _IrcClient.UnInviteException(channel, candidates); } else { _NotEnoughParameters(cd); } } public void CommandKick(CommandModel cd) { string channel = cd.Chat.ID; if (cd.DataArray.Length >= 2) { string[] candidates = cd.DataArray[1].Split(new char[] {','}); if (cd.DataArray.Length >= 3) { string reason = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); foreach (string nick in candidates) { _IrcClient.RfcKick(channel, nick, reason); } } else { foreach (string nick in candidates) { _IrcClient.RfcKick(channel, nick); } } } else { _NotEnoughParameters(cd); } } public void CommandKickban(CommandModel cd) { if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } var chat = cd.Chat as GroupChatModel; if (chat == null) { return; } string channel = chat.ID; string[] candidates = cd.DataArray[1].Split(new char[] {','}); string reason = null; if (cd.DataArray.Length >= 3) { reason = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); } foreach (string nick in candidates) { var victim = (IrcGroupPersonModel) chat.GetPerson(nick); if (victim == null) { continue; } _IrcClient.Ban(channel, "*!*" + victim.Ident + "@" + victim.Host); if (reason == null) { _IrcClient.RfcKick(channel, victim.NickName); } else { _IrcClient.RfcKick(channel, victim.NickName, reason); } } } public void CommandMode(CommandModel cd) { string target = null; string mode = null; if (cd.DataArray.Length >= 2) { // /mode #smuxi // /mode meebey var param1 = cd.DataArray[1]; if (param1.StartsWith("+") || param1.StartsWith("-")) { // no target given, this is the mode already // /mode +i (on server) // /mode +b (on channel) // /mode +b *!*@foo (on channel) if (cd.Chat.ChatType == ChatType.Group) { target = cd.Chat.ID; } else { target = _IrcClient.Nickname; } mode = cd.Parameter; } else { target = param1; if (cd.DataArray.Length >= 3) { // /mode #smuxi +b *!*@foo // /mode #smuxi +b // /mode meebey +i mode = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); } } } else { // /mode (on server) // /mode (on channel) if (cd.Chat.ChatType == ChatType.Group) { target = cd.Chat.ID; } else { target = _IrcClient.Nickname; } } if (target != null && mode != null) { _IrcClient.RfcMode(target, mode); } else if (target != null) { if (_IrcClient.IsMe(target)) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Your user mode is {0}"), String.Format("[{0}]", _IrcClient.Usermode)); Session.AddMessageToFrontend(cd, builder.ToMessage()); } else { _IrcClient.RfcMode(target); } } } public void CommandInvite(CommandModel cd) { string channel; if (cd.DataArray.Length >= 3) { channel = cd.DataArray[2]; } else { channel = cd.Chat.ID; } if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } var invitee = cd.DataArray[1]; var groupChat = cd.Chat as GroupChatModel; if (groupChat != null && groupChat.GetPerson(invitee) != null) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("{0} is already on {1}"), invitee, channel). ToMessage(); Session.AddMessageToFrontend(cd, msg); } else { _IrcClient.RfcInvite(invitee, channel); var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Inviting {0} to {1}"), invitee, channel). ToMessage(); Session.AddMessageToFrontend(cd, msg); } } public void CommandNames(CommandModel cd) { /* 13:10 [Users #smuxi] 13:10 [ CIA-5] [ d-best] [ meebey] [ meebey_] [ NotZh817] [ RAOF] 13:10 -!- Irssi: #smuxi: Total of 6 nicks [0 ops, 0 halfops, 0 voices, 6 normal] */ ChatModel chat = cd.Chat; if (!(chat is GroupChatModel)) { return; } GroupChatModel groupChat = (GroupChatModel) chat; var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText("[{0} {1}]", _("Users"), groupChat.Name); Session.AddMessageToFrontend(cd, builder.ToMessage()); builder = CreateMessageBuilder(); int opCount = 0; int voiceCount = 0; int normalCount = 0; builder.AppendEventPrefix(); // sort nicklist var persons = groupChat.Persons; if (persons == null) { persons = new Dictionary(0); } List ircPersons = new List(persons.Values); ircPersons.Sort((a, b) => (a.IdentityName.CompareTo(b.IdentityName))); builder.AppendText("[ "); foreach (IrcGroupPersonModel ircPerson in ircPersons) { string mode; if (ircPerson.IsOwner) { opCount++; mode = "~"; } else if (ircPerson.IsChannelAdmin) { opCount++; mode = "&"; } else if (ircPerson.IsOp) { opCount++; mode = "@"; } else if (ircPerson.IsHalfop) { opCount++; mode = "%"; } else if (ircPerson.IsVoice) { voiceCount++; mode = "+"; } else { normalCount++; mode = String.Empty; } if (!String.IsNullOrEmpty(mode)) { builder.AppendText(mode); } builder.AppendNick(ircPerson); builder.AppendSpace(); } builder.AppendText("]"); Session.AddMessageToFrontend(cd, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText( String.Format( _("Total of {0} users [{1} ops, {2} voices, {3} normal]"), opCount + voiceCount + normalCount, opCount, voiceCount, normalCount ) ); Session.AddMessageToFrontend(cd, builder.ToMessage()); } public void CommandRaw(CommandModel cd) { if (_IrcClient.IsRegistered) { _IrcClient.WriteLine(cd.Parameter); } else { _IrcClient.WriteLine(cd.Parameter, Priority.Critical); } } public void CommandMe(CommandModel cd) { if (cd.DataArray.Length < 2) { _NotEnoughParameters(cd); return; } _IrcClient.SendMessage(SendType.Action, cd.Chat.ID, cd.Parameter); var builder = CreateMessageBuilder(); builder.AppendActionPrefix(); builder.AppendIdendityName(Me); builder.AppendText(" "); builder.AppendMessage(cd.Parameter); Session.AddMessageToChat(cd.Chat, builder.ToMessage(), true); } public void CommandNotice(CommandModel cd) { if (cd.DataArray.Length >= 3) { string target = cd.DataArray[1]; string message = String.Join(" ", cd.DataArray, 2, cd.DataArray.Length-2); _IrcClient.SendMessage(SendType.Notice, target, message); var chat = GetChat(target, ChatType.Group); if (chat == null) { // wasn't a channel but maybe a query chat = GetChat(target, ChatType.Person); } if (chat == null) { chat = _NetworkChat; } var msg = CreateMessageBuilder(). AppendText("[notice({0})] ", target). AppendMessage(message). ToMessage(); Session.AddMessageToChat(chat, msg, true); } } public void CommandNick(CommandModel cd) { if (cd.DataArray.Length >= 2) { _IrcClient.RfcNick(cd.Parameter); } } public void CommandQuit(CommandModel cd) { Trace.Call(cd); string message = cd.Parameter; // else SmartIrc4net would reconnect us _IrcClient.AutoReconnect = false; // else the Listen() thread would try to connect again _Listening = false; // when we are disconnected, remove all chats _IrcClient.OnDisconnected += delegate { // cleanup all open chats Dispose(); }; // ok now we are ready to die if (message != null) { _IrcClient.RfcQuit(message); } else { _IrcClient.RfcQuit(); } } private void _Run() { Trace.Call(); try { Connect(_FrontendManager); while (_Listening) { try { _Listen(); #if LOG4NET _Logger.Warn("_Run(): _Listen() returned."); #endif } catch (ThreadAbortException) { throw; } catch (Exception ex) { #if LOG4NET _Logger.Error("_Run(): exception in _Listen() occurred!" ,ex); #endif Reconnect(_FrontendManager); } // sleep for 10 seconds, we don't want to be abusive System.Threading.Thread.Sleep(10000); } } catch (ThreadAbortException) { #if LOG4NET _Logger.Debug("_Run(): thread aborted"); #endif } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif } // don't need the FrontendManager anymore _FrontendManager = null; } private void _Listen() { try { _IrcClient.Listen(); } catch (Exception ex) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Connection error! Reason: ")). AppendText(ex.Message). ToMessage(); Session.AddMessageToChat(Chat, msg); throw; } } private void _NotEnoughParameters(CommandModel cd) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Not enough parameters for {0} command"), cd.Command). ToMessage(); Session.AddMessageToFrontend(cd, msg); } private void _NotConnected(CommandModel cd) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("Not connected to server")). ToMessage(); Session.AddMessageToFrontend(cd, msg); } private void ApplyConfig(UserConfig config, ServerModel server) { _Host = server.Hostname; _Port = server.Port; if (String.IsNullOrEmpty(server.Network)) { _Network = server.Hostname; } else { _Network = server.Network; } if (String.IsNullOrEmpty(server.Nickname)) { _Nicknames = (string[]) config["Connection/Nicknames"]; } else { _Nicknames = server.Nickname.Split(' '); } if (String.IsNullOrEmpty(server.Realname)) { _Realname = (string) config["Connection/Realname"]; } else { _Realname = server.Realname; } if (String.IsNullOrEmpty(server.Username)) { _Username = (string) config["Connection/Username"]; } else { _Username = server.Username; } _Password = server.Password; // internal fallbacks if (String.IsNullOrEmpty(_Username)) { _Username = "smuxi"; } // IRC specific settings if (server is IrcServerModel) { var ircServer = (IrcServerModel) server; if (ircServer.Nicknames != null && ircServer.Nicknames.Count > 0) { _Nicknames = ircServer.Nicknames.ToArray(); } } // add fallbacks if only one nick was specified, else we get random // number nicks when nick collisions happen if (_Nicknames.Length == 1) { _Nicknames = new string[] { _Nicknames[0], _Nicknames[0] + "_", _Nicknames[0] + "__" }; } string encodingName = (string) config["Connection/Encoding"]; if (String.IsNullOrEmpty(encodingName)) { _IrcClient.Encoding = Encoding.Default; } else { try { _IrcClient.Encoding = Encoding.GetEncoding(encodingName); } catch (Exception ex) { #if LOG4NET _Logger.Warn("ApplyConfig(): Error getting encoding for: " + encodingName + " falling back to system encoding.", ex); #endif _IrcClient.Encoding = Encoding.Default; } } if (config["Connection/AutoConvertUTF8"] == null) { _IrcClient.EnableUTF8Recode = true; } else { _IrcClient.EnableUTF8Recode = (bool) config["Connection/AutoConvertUTF8"]; } var proxySettings = new ProxySettings(); proxySettings.ApplyConfig(config); var protocol = server.UseEncryption ? "ircs" : "irc"; var serverUri = String.Format("{0}://{1}:{2}", protocol, server.Hostname, server.Port); var proxy = proxySettings.GetWebProxy(serverUri); if (proxy == null) { _IrcClient.ProxyType = IrcProxyType.None; } else { var proxyScheme = proxy.Address.Scheme; var ircProxyType = IrcProxyType.None; try { // HACK: map proxy scheme to SmartIrc4net's ProxyType ircProxyType = (IrcProxyType) Enum.Parse( typeof(IrcProxyType), proxyScheme, true ); } catch (ArgumentException ex) { #if LOG4NET _Logger.Error("ApplyConfig(): Couldn't parse proxy type: " + proxyScheme, ex); #endif } _IrcClient.ProxyType = ircProxyType; _IrcClient.ProxyHost = proxy.Address.Host; _IrcClient.ProxyPort = proxy.Address.Port; if (!String.IsNullOrEmpty(proxySettings.ProxyUsername)) { _IrcClient.ProxyUsername = proxySettings.ProxyUsername; } if (!String.IsNullOrEmpty(proxySettings.ProxyPassword)) { _IrcClient.ProxyPassword = proxySettings.ProxyPassword; } } if (server != null) { _IrcClient.UseSsl = server.UseEncryption; _IrcClient.ValidateServerCertificate = server.ValidateServerCertificate; if (String.IsNullOrEmpty(server.ClientCertificateFilename)) { _IrcClient.SslClientCertificate = null; } else { var certFile = server.ClientCertificateFilename; if (!Path.IsPathRooted(certFile)) { var configPath = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData ); configPath = Path.Combine(configPath, "smuxi"); var certPath = Path.Combine(configPath, "certs"); certFile = Path.Combine(certPath, certFile); } var certType = X509Certificate2.GetCertContentType(certFile); if (certType != X509ContentType.Unknown) { var cert = new X509Certificate2(); cert.Import(certFile, "", X509KeyStorageFlags.PersistKeySet); if (cert.PublicKey == null) { #if LOG4NET _Logger.ErrorFormat( "ApplyConfig(): client certificate {0} does " + "not contain a public key!", certFile ); #endif } if (cert.PrivateKey == null) { #if LOG4NET _Logger.ErrorFormat( "ApplyConfig(): client certificate {0} does " + "not contain a private key!", certFile ); #endif } _IrcClient.SslClientCertificate = cert; } } } } private void _OnRawMessage(object sender, IrcEventArgs e) { #if LOG4NET //_Logger.Debug("_OnRawMessage(): received: '" + e.Data.RawMessage + "'"); #endif bool handled = false; switch (e.Data.Type) { case ReceiveType.Who: case ReceiveType.List: case ReceiveType.Name: case ReceiveType.Login: case ReceiveType.Topic: case ReceiveType.BanList: case ReceiveType.ChannelMode: // ignore handled = true; break; } if (e.Data.Message != null) { switch (e.Data.Type) { case ReceiveType.Error: _OnError(e); handled = true; break; case ReceiveType.WhoIs: case ReceiveType.WhoWas: _OnReceiveTypeWho(e); handled = true; break; } } string chan; string nick; MessageModel msg; ChatModel chat; switch (e.Data.ReplyCode) { case ReplyCode.Null: case ReplyCode.Away: // already handled via _OnAway() case ReplyCode.NowAway: // already handled via _OnNowAway() case ReplyCode.UnAway: // already handled via _OnUnAway() case (ReplyCode) 329: // RPL_CREATIONTIME case (ReplyCode) 333: // RPL_TOPICWHOTIME: who set topic + timestamp // ignore break; case ReplyCode.Bounce: // RPL_ISUPPORT // :friendly.landlord.eloxoph.com 005 meebey CHANTYPES=# PREFIX=(ohv)@%+ NETWORK=Eloxoph AWAYLEN=200 TOPICLEN=300 :are supported by this server // :friendly.landlord.eloxoph.com 005 meebey CHANLIMIT=#:12 IRCD=WeIRCd NICKLEN=25 CASEMAPPING=ascii USERLEN=9 :are supported by this server // :friendly.landlord.eloxoph.com 005 meebey CHANMODE=b,kl,,cimnOrst PENALTY MAXTARGETS=1 MAXBANS=50 MODES=5 LISTMODE=997 :are supported by this server string line = String.Empty; if (e.Data.RawMessageArray.Length >= 4) { line = String.Join( " ", e.Data.RawMessageArray, 3, e.Data.RawMessageArray.Length - 3 ); } string[] supportList = line.Split(' '); foreach (string support in supportList) { string supportKey = null; string supportValue = null; if (support.Contains("=")) { supportKey = support.Split('=')[0]; supportValue = support.Split('=')[1]; } else { supportKey = support; supportValue = null; } switch (supportKey) { case "NETWORK": _Network = supportValue; #if LOG4NET _Logger.Debug( "_OnRawMessage(): detected IRC network: " + "'" + _Network + "'" ); #endif break; case "ELIST": HasListMaskSearchSupport = supportValue.Contains("M"); break; case "SAFELIST": HasSafeListSupport = true; break; case "CHANTYPES": ChannelTypes.Clear(); foreach (var type in supportValue) { ChannelTypes.Add(type.ToString()); } break; } } break; case ReplyCode.ErrorNoSuchNickname: nick = e.Data.RawMessageArray[3]; chat = GetChat(nick, ChatType.Person) ?? Chat; msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("{0}: No such nick/channel"), nick). ToMessage(); Session.AddMessageToChat(chat, msg); break; case ReplyCode.ErrorChannelIsFull: case ReplyCode.ErrorInviteOnlyChannel: case ReplyCode.ErrorBadChannelKey: case ReplyCode.ErrorTooManyChannels: case ReplyCode.ErrorChannelOpPrivilegesNeeded: case ReplyCode.ErrorCannotSendToChannel: case ReplyCode.ErrorUnavailableResource: chan = e.Data.RawMessageArray[3]; chat = GetChat(chan, ChatType.Group) ?? Chat; msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(chan).AppendSpace(). AppendMessage(e.Data.Message). ToMessage(); Session.AddMessageToChat(chat, msg); // if our own nick is temporarily not available then we // need to deal this like an already used nick if (chan == _IrcClient.Nickname) { AutoRenick(); } break; case ReplyCode.ErrorBannedFromChannel: _OnErrorBannedFromChannel(e); break; case ReplyCode.ErrorNicknameInUse: _OnErrorNicknameInUse(e); break; case ReplyCode.EndOfNames: OnEndOfNames(e); break; case ReplyCode.ChannelModeIs: OnChannelModeIs(e); break; default: if (!handled) { var builder = CreateMessageBuilder(); builder.MessageType = MessageType.Event; int replyCode = (int) e.Data.ReplyCode; string numeric = String.Format("{0:000}", replyCode); string constant; if (Enum.IsDefined(typeof(ReplyCode), e.Data.ReplyCode)) { constant = e.Data.ReplyCode.ToString(); } else { constant = "?"; } string parameters = String.Empty; if (e.Data.RawMessageArray.Length >= 4) { parameters = String.Join( " ", e.Data.RawMessageArray, 3, e.Data.RawMessageArray.Length - 3 ); } int colonPosition = parameters.IndexOf(':'); if (colonPosition > 0) { parameters = " " + parameters.Substring(0, colonPosition - 1); } else { parameters = String.Empty; } TextMessagePartModel msgPart; msgPart = new TextMessagePartModel("["); msgPart.ForegroundColor = IrcTextColor.Grey; msgPart.Bold = true; builder.AppendText(msgPart); msgPart = new TextMessagePartModel(numeric); if (replyCode >= 400 && replyCode <= 599) { msgPart.ForegroundColor = new TextColor(255, 0, 0); } msgPart.Bold = true; builder.AppendText(msgPart); var response = String.Format( " ({0}){1}", constant, parameters ); builder.AppendText(response); msgPart = new TextMessagePartModel("] "); msgPart.ForegroundColor = IrcTextColor.Grey; msgPart.Bold = true; builder.AppendText(msgPart); if (e.Data.Message != null) { builder.MessageType = MessageType.Normal; builder.AppendMessage(e.Data.Message); } Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); } break; } } private void _OnError(IrcEventArgs e) { var builder = CreateMessageBuilder(); var text = builder.CreateText(e.Data.Message); text.ForegroundColor = IrcTextColor.Red; text.Bold = true; text.IsHighlight = true; builder.AppendText(text); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); if (e.Data.Message.ToLower().Contains("flood")) { _IrcClient.SendDelay += 250; var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText( _("Increased send delay to {0}ms to avoid being " + "flooded off the server again."), _IrcClient.SendDelay ).ToMessage(); Session.AddMessageToChat(Chat, msg); } } private void _OnErrorNicknameInUse(IrcEventArgs e) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); var text = builder.CreateText(e.Data.RawMessageArray[3]); text.Bold = true; builder.AppendFormat(_("Nick {0} is already in use"), text); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); AutoRenick(); } private void _OnErrorBannedFromChannel(IrcEventArgs e) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); var text = builder.CreateText(e.Data.RawMessageArray[3]); text.Bold = true; builder.AppendFormat("{0}: {1} ({2})", _("Cannot join to channel:"), text, _("You are banned")); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); } private void _OnReceiveTypeWho(IrcEventArgs e) { MessageModel msg; string nick = e.Data.RawMessageArray[3]; ChatModel chat = GetChat(nick, ChatType.Person); if (chat == null) { chat = _NetworkChat; } switch (e.Data.ReplyCode) { case ReplyCode.WhoIsUser: case ReplyCode.WhoWasUser: string ident = e.Data.RawMessageArray[4]; string host = e.Data.RawMessageArray[5]; string realname = e.Data.Message; msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText("{0} [{1}@{2}]", nick, ident, host). ToMessage(); Session.AddMessageToChat(chat, msg); msg = CreateMessageBuilder(). AppendEventPrefix().AppendSpace(). AppendText("realname: {0}", realname). ToMessage(); Session.AddMessageToChat(chat, msg); break; case ReplyCode.WhoIsServer: string server = e.Data.RawMessageArray[4]; string serverinfo = e.Data.Message; msg = CreateMessageBuilder(). AppendEventPrefix().AppendSpace(). AppendText("server: {0} [{1}]", server, serverinfo). ToMessage(); Session.AddMessageToChat(chat, msg); break; case ReplyCode.WhoIsIdle: string idle = e.Data.RawMessageArray[4]; try { long timestamp = Int64.Parse(e.Data.RawMessageArray[5]); DateTime signon = new DateTime(1970, 1, 1, 0, 0, 0, 0); signon = signon.AddSeconds(timestamp).ToLocalTime(); msg = CreateMessageBuilder(). AppendEventPrefix().AppendSpace(). AppendText("idle: {0} [signon: {1}]", idle, signon.ToString()). ToMessage(); Session.AddMessageToChat(chat, msg); } catch (FormatException) { } break; case ReplyCode.WhoIsChannels: string channels = e.Data.Message; msg = CreateMessageBuilder(). AppendEventPrefix().AppendSpace(). AppendText("channels: {0}", channels). ToMessage(); Session.AddMessageToChat(chat, msg); break; case ReplyCode.WhoIsOperator: case ReplyCode.EndOfWhoIs: case ReplyCode.EndOfWhoWas: msg = CreateMessageBuilder(). AppendEventPrefix().AppendSpace(). AppendText(e.Data.Message). ToMessage(); Session.AddMessageToChat(chat, msg); break; } } private void _OnCtcpRequest(object sender, CtcpEventArgs e) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText( // TRANSLATOR: {0}: nickname, {1}: ident@host, // {2}: CTCP command, {3}: own nickname, {4}: CTCP parameter // example: // meebey [meebey@example.com] requested CTCP VERSION from meebey: _("{0} [{1}] requested CTCP {2} from {3}: {4}"), e.Data.Nick, e.Data.Ident+"@"+e.Data.Host, e.CtcpCommand, _IrcClient.Nickname, e.CtcpParameter ). ToMessage(); Session.AddMessageToChat(Chat, msg); } private void _OnCtcpReply(object sender, CtcpEventArgs e) { ChatModel chat = GetChat(e.Data); if (chat == null) { chat = _NetworkChat; } if (e.CtcpCommand == "PING") { try { long timestamp = Int64.Parse(e.CtcpParameter); if (!(timestamp >= 0)) { return; } DateTime sent = DateTime.FromFileTime(timestamp); string duration = DateTime.Now.Subtract(sent).TotalSeconds.ToString(); var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("CTCP PING reply from {0}: {1} seconds"), e.Data.Nick, duration). ToMessage(); Session.AddMessageToChat(chat, msg); } catch (FormatException) { } } else { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("CTCP {0} reply from {1}: {2}"), e.CtcpCommand, e.Data.Nick, e.CtcpParameter). ToMessage(); Session.AddMessageToChat(chat, msg); } } private void _OnChannelMessage(object sender, IrcEventArgs e) { var chat = GetChat(e.Data.Channel, ChatType.Group) ?? Chat; UpdateGroupPerson(chat, e.Data); var builder = CreateMessageBuilder(); PersonModel senderPerson = GetPerson(chat, e.Data.Nick ?? e.Data.From); builder.AppendMessage(senderPerson, e.Data.Message); builder.MarkHighlights(senderPerson); var msg = builder.ToMessage(); Session.AddMessageToChat(chat, msg); OnMessageReceived( new MessageEventArgs(chat, msg, e.Data.Nick ?? e.Data.From, e.Data.Channel) ); } private void _OnChannelAction(object sender, ActionEventArgs e) { var chat = GetChat(e.Data.Channel, ChatType.Group) ?? Chat; UpdateGroupPerson(chat, e.Data); var builder = CreateMessageBuilder(); builder.AppendActionPrefix(); PersonModel senderPerson = GetPerson(chat, e.Data.Nick ?? e.Data.From); builder.AppendIdendityName(senderPerson); builder.AppendText(" "); builder.AppendMessage(e.ActionMessage); builder.MarkHighlights(senderPerson); var msg = builder.ToMessage(); Session.AddMessageToChat(chat, msg); OnMessageReceived( new MessageEventArgs(chat, msg, e.Data.Nick ?? e.Data.From, e.Data.Channel) ); } private void _OnChannelNotice(object sender, IrcEventArgs e) { var chat = GetChat(e.Data.Channel, ChatType.Group) ?? Chat; UpdateGroupPerson(chat, e.Data); var builder = CreateMessageBuilder(); builder.AppendText("-{0}:{1}- ", e.Data.Nick, e.Data.Channel); builder.AppendMessage(e.Data.Message); builder.MarkHighlights(); var msg = builder.ToMessage(); Session.AddMessageToChat(chat, msg); OnMessageReceived( new MessageEventArgs(chat, msg, e.Data.Nick ?? e.Data.From, e.Data.Channel) ); } private void _OnQueryMessage(object sender, IrcEventArgs e) { var chat = (PersonChatModel) GetChat(e.Data.Nick, ChatType.Person); bool newChat = false; if (chat == null) { var person = CreatePerson(e.Data.Nick); person.Ident = e.Data.Ident; person.Host = e.Data.Host; chat = Session.CreatePersonChat(person, e.Data.Nick, e.Data.Nick, this); newChat = true; } var builder = CreateMessageBuilder(); builder.AppendSenderPrefix(chat.Person, true); builder.AppendMessage(e.Data.Message); builder.MarkHighlights(); var msg = builder.ToMessage(); if (newChat) { // don't create chats for filtered messages if (Session.IsFilteredMessage(chat, msg)) { Session.LogMessage(chat, msg, true); return; } Session.AddChat(chat); Session.AddMessageToChat(chat, msg); // HACK: lower probability of sync race condition swallowing // messages, see: https://www.smuxi.org/issues/show/634 ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(1000); Session.SyncChat(chat); }); return; } Session.AddMessageToChat(chat, msg); OnMessageReceived( new MessageEventArgs(chat, msg, e.Data.Nick ?? e.Data.From, null) ); } private void _OnQueryAction(object sender, ActionEventArgs e) { var chat = (PersonChatModel) GetChat(e.Data.Nick, ChatType.Person); bool newChat = false; if (chat == null) { var person = CreatePerson(e.Data.Nick); person.Ident = e.Data.Ident; person.Host = e.Data.Host; chat = Session.CreatePersonChat(person, e.Data.Nick, e.Data.Nick, this); newChat = true; } var builder = CreateMessageBuilder(); builder.AppendActionPrefix(); builder.AppendIdendityName(chat.Person, true); builder.AppendSpace(); builder.AppendMessage(e.ActionMessage); builder.MarkHighlights(); var msg = builder.ToMessage(); if (newChat) { // don't create chats for filtered messages if (Session.IsFilteredMessage(chat, msg)) { Session.LogMessage(chat, msg, true); return; } Session.AddChat(chat); Session.AddMessageToChat(chat, msg); // HACK: lower probability of sync race condition swallowing // messages, see: https://www.smuxi.org/issues/show/634 ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(1000); Session.SyncChat(chat); }); return; } Session.AddMessageToChat(chat, msg); OnMessageReceived( new MessageEventArgs(chat, msg, e.Data.Nick ?? e.Data.From, null) ); } private void _OnQueryNotice(object sender, IrcEventArgs e) { var targetChats = new List(); if (e.Data.Nick != null) { var chat = (PersonChatModel) GetChat(e.Data.Nick, ChatType.Person); if (chat != null) { targetChats.Add(chat); } } // show notice on shared channels except the sender is Nick/ChanServ if (targetChats.Count == 0 && e.Data.Nick != null && String.Compare(e.Data.Nick, "NickServ", true) != 0 && String.Compare(e.Data.Nick, "ChanServ", true) != 0) { // always show on server chat targetChats.Add(_NetworkChat); // check if we share a channel with the sender foreach (var chat in Chats) { if (!(chat is GroupChatModel)) { continue; } var groupChat = (GroupChatModel) chat; if (groupChat.UnsafePersons == null) { continue; } if (groupChat.UnsafePersons.ContainsKey(e.Data.Nick)) { targetChats.Add(groupChat); } } } if (targetChats.Count == 0) { // use server chat as fallback targetChats.Add(_NetworkChat); } var builder = CreateMessageBuilder(); if (e.Data.Nick == null) { // server message builder.AppendText("!{0} ", e.Data.From); } else { builder.AppendText("-"); builder.AppendIdendityName(GetPerson(targetChats[0], e.Data.Nick)); builder.AppendText(" ({0}@{1})- ", e.Data.Ident, e.Data.Host); } builder.AppendMessage(e.Data.Message); builder.MarkHighlights(); var msg = builder.ToMessage(); foreach (var targetChat in targetChats) { Session.AddMessageToChat(targetChat, msg); } OnMessageReceived( new MessageEventArgs(Chat, msg, e.Data.Nick ?? e.Data.From, null) ); } private void _OnJoin(object sender, JoinEventArgs e) { GroupChatModel groupChat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); if (e.Data.Irc.IsMe(e.Who)) { // tell join handlers, that they need to wait!! lock (_ActiveChannelJoinList) { _ActiveChannelJoinList.Add(e.Channel.ToLower()); } if (groupChat == null) { groupChat = Session.CreateChat( e.Channel, e.Channel, this ); groupChat.UnsafePersonsComparer = StringComparer.OrdinalIgnoreCase; Session.AddChat(groupChat); } else { // chat still exists, so we we only need to enable it // (sync is done in _OnChannelActiveSynced) Session.EnableChat(groupChat); } } else { // someone else joined, let's add him to the channel chat // HACK: some buggy networks might send JOIN messages for users // that are already on the channel if (groupChat.UnsafePersons.ContainsKey(e.Who)) { #if LOG4NET _Logger.Error("_OnJoin(): groupChat.UnsafePerson contains " + "already: '" + e.Who + "', ignoring..."); #endif // ignore } else { var person = CreateGroupPerson(e.Who); person.Ident = e.Data.Ident; person.Host = e.Data.Host; Session.AddPersonToGroupChat(groupChat, person); } } var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendFormat(_("{0} [{1}] has joined {2}"), GetPerson(groupChat, e.Who), String.Format("{0}@{1}", e.Data.Ident, e.Data.Host), e.Channel); var msg = builder.ToMessage(); Session.AddMessageToChat(groupChat, msg); } private void _OnNames(object sender, NamesEventArgs e) { #if LOG4NET // logging noise //_Logger.Debug("_OnNames() e.Channel: " + e.Channel); #endif GroupChatModel groupChat = (GroupChatModel) GetChat(e.Data.Channel, ChatType.Group); if (groupChat == null || groupChat.IsSynced) { // nothing todo for us return; } foreach (string user in e.RawUserList) { // skip empty users (some IRC servers send an extra space) if (user.TrimEnd(' ').Length == 0) { continue; } string nick = user; var modePrefixes = new List(); bool checkNextChar; // this has to be a loop since there could be multiple prefixes (NAMESX): // :irc.poop.nl 353 meebey3 @ #gtk# :meebey3 FHaag1 shana knocte ~@meebey stsundermann antonius Bertrand do { checkNextChar = false; foreach (var kvp in _IrcClient.ServerProperties.ChannelPrivilegeModesPrefixes) { if (nick[0] == kvp.Value) { // first char of the nick is a mode prefix, thus strip it modePrefixes.Add(nick[0]); nick = nick.Substring(1); checkNextChar = true; break; } } } while (checkNextChar); var groupPerson = CreateGroupPerson(nick); foreach (char modePrefix in modePrefixes) { switch (modePrefix) { case '~': groupPerson.IsOwner = true; break; case '&': groupPerson.IsChannelAdmin = true; break; case '@': groupPerson.IsOp = true; break; case '%': groupPerson.IsHalfop = true; break; case '+': groupPerson.IsVoice = true; break; } } // HACK: replace existing value in case we get duplicate nicks // on broken IRC servers like irc.gitter.im, see: // https://smuxi.im/issues/show/1051 groupChat.UnsafePersons[groupPerson.NickName] = groupPerson; #if LOG4NET // logging noise //_Logger.Debug("_OnNames() added user: " + username + " to: " + groupChat.Name); #endif } } void OnEndOfNames(IrcEventArgs e) { Trace.Call(e); var chan = e.Data.RawMessageArray[3]; lock (_ActiveChannelJoinList) { _ActiveChannelJoinList.Remove(chan.ToLower()); } // tell the currently waiting join task item from the task queue // that one channel is finished _ActiveChannelJoinHandle.Set(); var groupChat = (GroupChatModel) GetChat(chan, ChatType.Group); if (groupChat == null) { #if LOG4NET _Logger.Error("OnEndOfNames(): GetChat(" + e.Data.Channel + ", ChatType.Group) returned null!"); #endif return; } #if LOG4NET _Logger.Debug("OnEndOfNames(): " + chan + " synced"); #endif groupChat.IsSynced = true; // prime-time Session.SyncChat(groupChat); } void OnChannelModeIs(IrcEventArgs e) { Trace.Call(e); var chat = GetChat(e.Data.Channel, ChatType.Group) ?? Chat; var mode = String.Join(" ", e.Data.RawMessageArray.Skip(4).ToArray()).Trim(); var channelName = e.Data.RawMessageArray[3]; var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText("mode/{0} [{1}]", channelName, mode); Session.AddMessageToChat(chat, builder.ToMessage()); } private void _OnPart(object sender, PartEventArgs e) { #if LOG4NET _Logger.Debug("_OnPart() e.Channel: "+e.Channel+" e.Who: "+e.Who); #endif GroupChatModel groupChat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); // only remove the chat if it was enabled, that way we can retain // the message buffer if (e.Data.Irc.IsMe(e.Who)) { if (groupChat.IsEnabled) { Session.RemoveChat(groupChat); } // nothing else we can do return; } PersonModel person = groupChat.GetPerson(e.Who); if (person == null) { #if LOG4NET // HACK: some buggy networks might send PART messages for users // that are not on the channel _Logger.Error("_OnPart(): groupChat.GetPerson(" + e.Who + ") returned null!"); #endif } else { Session.RemovePersonFromGroupChat(groupChat, person); } var builder = CreateMessageBuilder(); builder.MessageType = MessageType.Event; builder.AppendEventPrefix(); builder.AppendFormat(_("{0} [{1}] has left {2}"), GetPerson(groupChat, e.Who), String.Format("{0}@{1}", e.Data.Ident, e.Data.Host), e.Channel); if (!String.IsNullOrEmpty(e.PartMessage)) { builder.AppendText(" ["); // colors in part messages are annoying builder.Settings.StripColors = true; builder.AppendMessage(e.PartMessage); builder.AppendText("]"); } Session.AddMessageToChat(groupChat, builder.ToMessage()); } private void _OnKick(object sender, KickEventArgs e) { #if LOG4NET _Logger.Debug("_OnKick() e.Channel: "+e.Channel+" e.Whom: "+e.Whom); #endif var chat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); if (e.Data.Irc.IsMe(e.Whom)) { builder.AppendFormat(_("You were kicked from {0} by {1}"), e.Channel, GetPerson(chat, e.Who)); builder.AppendText(" [").AppendMessage(e.KickReason).AppendText("]"); Session.AddMessageToChat(chat, builder.ToMessage()); Session.DisableChat(chat); } else { PersonModel user = chat.GetPerson(e.Whom); Session.RemovePersonFromGroupChat(chat, user); builder.AppendFormat(_("{0} was kicked from {1} by {2}"), GetPerson(chat, e.Whom), e.Channel, GetPerson(chat, e.Who)); builder.AppendText(" [").AppendMessage(e.KickReason).AppendText("]"); Session.AddMessageToChat(chat, builder.ToMessage()); } } private void _OnNickChange(object sender, NickChangeEventArgs e) { #if LOG4NET _Logger.Debug("_OnNickChange() e.OldNickname: "+e.OldNickname+" e.NewNickname: "+e.NewNickname); #endif if (e.Data.Irc.IsMe(e.NewNickname)) { IrcMe = CreatePerson(e.NewNickname, IrcMe.RealName, IrcMe.Ident, IrcMe.Host); var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendFormat(_("You're now known as {0}"), CreatePerson(e.NewNickname)); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); } foreach (var chat in Chats) { if (!(chat is GroupChatModel)) { continue; } var groupChat = (GroupChatModel) chat; var oldPerson = (IrcGroupPersonModel) groupChat.GetPerson(e.OldNickname); if (oldPerson == null) { // nobodoy to rename continue; } // clone the old user to a new user var newPerson = CreateGroupPerson(e.NewNickname); newPerson.RealName = oldPerson.RealName; newPerson.Ident = oldPerson.Ident; newPerson.Host = oldPerson.Host; newPerson.IsOwner = oldPerson.IsOwner; newPerson.IsChannelAdmin = oldPerson.IsChannelAdmin; newPerson.IsOp = oldPerson.IsOp; newPerson.IsHalfop = oldPerson.IsHalfop; newPerson.IsVoice = oldPerson.IsVoice; Session.UpdatePersonInGroupChat(groupChat, oldPerson, newPerson); var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); if (e.Data.Irc.IsMe(e.NewNickname)) { builder.AppendFormat(_("You're now known as {0}"), newPerson); } else { builder.AppendFormat(_("{0} is now known as {1}"), oldPerson, newPerson); } Session.AddMessageToChat(groupChat, builder.ToMessage()); } } private void _OnTopic(object sender, TopicEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); var topic = CreateMessageBuilder(); topic.AppendMessage(e.Topic); Session.UpdateTopicInGroupChat(cchat, topic.ToMessage()); } private void _OnTopicChange(object sender, TopicChangeEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); var builder = CreateMessageBuilder(); builder.AppendMessage(e.NewTopic); Session.UpdateTopicInGroupChat(cchat, builder.ToMessage()); builder = CreateMessageBuilder(); builder.AppendEventPrefix(); MessagePartModel who; if (String.IsNullOrEmpty(e.Who)) { // server changed topic who = builder.CreateText(e.Data.From); } else { who = builder.CreateIdendityName(GetPerson(cchat, e.Who)); } builder.AppendFormat(_("{0} changed the topic of {1} to: {2}"), who, e.Channel, e.NewTopic); Session.AddMessageToChat(cchat, builder.ToMessage()); } void OnOwner(object sender, OwnerEventArgs e) { var cchat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); var user = (IrcGroupPersonModel) cchat.GetPerson(e.Whom); if (user != null) { user.IsOwner = true; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("OnOwner(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } void OnDeowner(object sender, DeownerEventArgs e) { var cchat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); var user = (IrcGroupPersonModel) cchat.GetPerson(e.Whom); if (user != null) { user.IsOwner = false; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("OnDeowner(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } void OnChannelAdmin(object sender, ChannelAdminEventArgs e) { var cchat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); var user = (IrcGroupPersonModel) cchat.GetPerson(e.Whom); if (user != null) { user.IsChannelAdmin = true; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("OnChannelAdmin(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } void OnDeChannelAdmin(object sender, DeChannelAdminEventArgs e) { var cchat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); var user = (IrcGroupPersonModel) cchat.GetPerson(e.Whom); if (user != null) { user.IsChannelAdmin = false; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("OnDeChannelAdmin(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } private void _OnOp(object sender, OpEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); if (user != null) { user.IsOp = true; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("_OnOp(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } private void _OnDeop(object sender, DeopEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); if (user != null) { user.IsOp = false; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("_OnDeop(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } void OnHalfop(object sender, HalfopEventArgs e) { var cchat = (GroupChatModel) GetChat(e.Channel, ChatType.Group); var user = (IrcGroupPersonModel) cchat.GetPerson(e.Whom); if (user != null) { user.IsHalfop = true; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("OnHalfop(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } void OnDehalfop(object sender, DehalfopEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); if (user != null) { user.IsHalfop = false; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("OnDehalfop(): cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } private void _OnVoice(object sender, VoiceEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); if (user != null) { user.IsVoice = true; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } private void _OnDevoice(object sender, DevoiceEventArgs e) { GroupChatModel cchat = (GroupChatModel)GetChat(e.Channel, ChatType.Group); IrcGroupPersonModel user = (IrcGroupPersonModel)cchat.GetPerson(e.Whom); if (user != null) { user.IsVoice = false; Session.UpdatePersonInGroupChat(cchat, user, user); #if LOG4NET } else { _Logger.Error("cchat.GetPerson(e.Whom) returned null! cchat.Name: "+cchat.Name+" e.Whom: "+e.Whom); #endif } } void OnUserModeChange(object sender, IrcEventArgs e) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); string modechange; string who = null; ChatModel target = null; modechange = e.Data.RawMessageArray[3]; if (modechange.StartsWith(":")) { modechange = modechange.Substring(1); } who = e.Data.Irc.Nickname; target = _NetworkChat; builder.AppendFormat(_("Mode change [{0}] for user {1}"), modechange, CreatePerson(who)); if (target == null) { #if LOG4NET _Logger.Error("_OnModeChange(): target is null!"); #endif return; } Session.AddMessageToChat(target, builder.ToMessage()); } void OnChannelModeChange(object sender, ChannelModeChangeEventArgs e) { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); var modechange = String.Join(" ", e.Data.RawMessageArray, 3, e.Data.RawMessageArray.Length - 3); var target = GetChat(e.Data.Channel, ChatType.Group) ?? Chat; UpdateGroupPerson(target, e.Data); MessagePartModel whoMsgPart; if (String.IsNullOrEmpty(e.Data.Nick)) { // server changed mode whoMsgPart = builder.CreateText(e.Data.From); } else { whoMsgPart = builder.CreateIdendityName(GetPerson(target, e.Data.Nick)); } builder.AppendFormat(_("mode/{0} [{1}] by {2}"), e.Data.Channel, modechange, whoMsgPart); Session.AddMessageToChat(target, builder.ToMessage()); // remeber channel key for rejoin etc foreach (var modeChange in e.ModeChanges) { if (modeChange.Mode != ChannelMode.Key) { continue; } switch (modeChange.Action) { case ChannelModeChangeAction.Set: lock (ChannelKeys) { ChannelKeys[e.Channel] = modeChange.Parameter; } break; case ChannelModeChangeAction.Unset: lock (ChannelKeys) { ChannelKeys.Remove(e.Channel); } break; } } } private void _OnQuit(object sender, QuitEventArgs e) { #if LOG4NET // logging noise //_Logger.Debug("_Quit() e.Who: "+e.Who); #endif if (e.Data.Irc.IsMe(e.Who)) { // _OnDisconnect() handles this } else { var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendFormat(_("{0} [{1}] has quit"), CreatePerson(e.Who), String.Format("{0}@{1}", e.Data.Ident, e.Data.Host)); builder.AppendText(" ["); // colors are annoying in quit messages builder.Settings.StripColors = true; builder.AppendMessage(e.QuitMessage); builder.AppendText("]"); var quitMsg = builder.ToMessage(); foreach (ChatModel chat in Chats) { if (chat.ChatType == ChatType.Group) { GroupChatModel cchat = (GroupChatModel)chat; PersonModel user = cchat.GetPerson(e.Who); if (user != null) { // he is on this channel, let's remove him Session.RemovePersonFromGroupChat(cchat, user); Session.AddMessageToChat(cchat, quitMsg); } } else if ((chat.ChatType == ChatType.Person) && (chat.ID == e.Who)) { Session.AddMessageToChat(chat, quitMsg); } } } } private void _OnRegistered(object sender, EventArgs e) { OnConnected(EventArgs.Empty); // preliminary person Me = CreatePerson(_IrcClient.Nickname); // WHO ourself so OnWho() can retrieve our ident, host and realname _IrcClient.RfcWho(_IrcClient.Nickname); // NickServ authentication if (_ServerModel != null && !String.IsNullOrEmpty(_ServerModel.Password)) { _IrcClient.WriteLine( String.Format("NS IDENTIFY {0}", _ServerModel.Password), Priority.Critical ); } } protected override void OnConnected(EventArgs e) { foreach (ChatModel chat in Chats) { // re-enable all person chats if (chat.ChatType == ChatType.Person) { Session.EnableChat(chat); // and re-sync them else new messages are not processed in // the FrontendManager Session.SyncChat(chat); } // group chats are handled in _OnJoin() // automatically rejoin group chats if (chat.ChatType == ChatType.Group) { string key; lock (ChannelKeys) { ChannelKeys.TryGetValue(chat.ID, out key); } if (String.IsNullOrEmpty(key)) { _IrcClient.RfcJoin(chat.ID); } else { _IrcClient.RfcJoin(chat.ID, key); } } } base.OnConnected(e); } private void _OnDisconnected(object sender, EventArgs e) { Trace.Call(sender, e); // reset join queue lock (_ActiveChannelJoinList) { _ActiveChannelJoinList.Clear(); } lock (_QueuedChannelJoinList) { _QueuedChannelJoinList.Clear(); } _ChannelJoinQueue.Reset(true); _ActiveChannelJoinHandle.Reset(); OnDisconnected(EventArgs.Empty); } private void OnAutoConnectError(object sender, AutoConnectErrorEventArgs e) { Trace.Call(sender, e); var builder = CreateMessageBuilder(); builder.AppendEventPrefix(); builder.AppendText(_("Connection to {0} port {1} has failed " + "(attempt {2}), retrying in {3} seconds..."), e.Address, e.Port, _IrcClient.AutoRetryAttempt, _IrcClient.AutoRetryDelay); Session.AddMessageToChat(_NetworkChat, builder.ToMessage()); } protected override void OnDisconnected(EventArgs e) { foreach (ChatModel chat in Chats) { // don't disable the protocol chat, else the user loses all // control for the protocol manager! e.g. after a manual // reconnect or server-side disconnect if (chat.ChatType == ChatType.Protocol) { continue; } Session.DisableChat(chat); } // reset the nickname list, so if we connect again we will start // using the best nickname again _CurrentNickname = 0; base.OnDisconnected(e); } private void _OnAway(object sender, AwayEventArgs e) { ChatModel chat = GetChat(e.Who, ChatType.Person); if (chat == null) { chat = _NetworkChat; } else { PersonModel person = ((PersonChatModel) chat).Person; IrcPersonModel ircperson = (IrcPersonModel) person; if (ircperson.AwayMessage != e.AwayMessage) { ircperson.AwayMessage = e.AwayMessage; ircperson.IsAwaySeen = false; ircperson.IsAway = true; } if (ircperson.IsAwaySeen) { return; } ircperson.IsAwaySeen = true; } var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("{0} is away: {1}"), e.Who, e.AwayMessage). ToMessage(); Session.AddMessageToChat(chat, msg); } private void _OnUnAway(object sender, IrcEventArgs e) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("You are no longer marked as being away")). ToMessage(); Session.AddMessageToChat(Chat, msg); Session.UpdateNetworkStatus(); } private void _OnNowAway(object sender, IrcEventArgs e) { var msg = CreateMessageBuilder(). AppendEventPrefix(). AppendText(_("You have been marked as being away")). ToMessage(); Session.AddMessageToChat(Chat, msg); Session.UpdateNetworkStatus(); } private void _LagWatcher() { try { while (true) { // check every 10 seconds Thread.Sleep(10000); if (_IrcClient == null || !_IrcClient.IsConnected) { // nothing to do continue; } TimeSpan lag = _IrcClient.Lag; TimeSpan diff = lag - _LastLag; int absDiff = Math.Abs((int) diff.TotalSeconds); // update network status if the lag changed over 5 seconds if (absDiff > 5) { #if LOG4NET _Logger.Debug("_LagWatcher(): lag: " + lag.TotalSeconds + " seconds, difference: " + absDiff + " seconds"); #endif Session.UpdateNetworkStatus(); } _LastLag = lag; } } catch (ThreadAbortException) { #if LOG4NET _Logger.Debug("_LagWatcher(): thread aborted"); #endif } catch (Exception ex) { #if LOG4NET _Logger.Error(ex); #endif } } private int GetProtocolMessageLength(string command, string target, string message) { // : : return 1 + Prefix.Length + 1 + command.Length + 1 + target.Length + 2 + _IrcClient.Encoding.GetByteCount(message) + 2; } // HACK: workaround a compiler bug in Mono #if __MonoCS__ protected new T GetPerson(ChatModel chat, string nick) where T : PersonModel #else protected override T GetPerson(ChatModel chat, string nick) #endif { var person = base.GetPerson(chat, nick); #if LOG4NET if (chat == null) { _Logger.Warn("GetPerson(" + chat + ", " + nick + "): chat is null!"); } if (person == null) { _Logger.Warn("GetPerson(" + chat + ", " + nick + "): person is null!"); } #endif if (chat == null || person == null) { person = (T)(object) CreatePerson(nick); } return person; } IrcPersonModel GetPerson(ChatModel chat, string nick) { return GetPerson(chat, nick); } private IrcPersonModel CreatePerson(string nick) { return CreatePerson(nick, null, null, null); } private IrcPersonModel CreatePerson(string nick, string realname, string ident, string host) { var person = new IrcPersonModel(nick, realname,ident, host, NetworkID, this); if (_IrcClient.IsMe(nick)) { person.IdentityNameColored.ForegroundColor = IrcTextColor.Blue; person.IdentityNameColored.BackgroundColor = TextColor.None; person.IdentityNameColored.Bold = true; } return person; } private IrcGroupPersonModel CreateGroupPerson(string nick) { var person = new IrcGroupPersonModel(nick, NetworkID, this); if (_IrcClient.IsMe(nick)) { person.IdentityNameColored.ForegroundColor = IrcTextColor.Blue; person.IdentityNameColored.BackgroundColor = TextColor.None; person.IdentityNameColored.Bold = true; } return person; } void UpdateGroupPerson(ChatModel chat, IrcMessageData msg) { if (!(chat is GroupChatModel)) { return; } // server messages have no nick if (msg.Nick == null) { return; } // write-back ident/host to person var groupChat = (GroupChatModel) chat; var person = groupChat.GetPerson(msg.Nick) as IrcGroupPersonModel; if (person == null) { return; } person.Ident = person.Ident ?? msg.Ident; person.Host = person.Host ?? msg.Host; } private ChatModel GetChat(IrcMessageData msg) { if (msg == null) { throw new ArgumentNullException("msg"); } if (msg.Channel != null) { // group chat message return GetChat(msg.Channel, ChatType.Group); } if (msg.Nick != null) { // person chat message return GetChat(msg.Nick, ChatType.Person); } if (msg.From != null) { // server message return _NetworkChat; } return null; } protected override T CreateMessageBuilder() { return (T)(object) base.CreateMessageBuilder(); } void AutoRenick() { if (_IrcClient.AutoNickHandling || _IrcClient.IsRegistered) { return; } // allright, we have to care then and try a different nick as // we don't have a nick yet string nick; if (_CurrentNickname == _Nicknames.Length - 1) { // we tried all nicks already, so fallback to random Random rand = new Random(); int number = rand.Next(999); nick = _Nicknames[_CurrentNickname].Substring(0, 5) + number; } else { _CurrentNickname++; nick = _Nicknames[_CurrentNickname]; } _IrcClient.RfcNick(nick, Priority.Critical); } private static string _(string msg) { return LibraryCatalog.GetString(msg, _LibraryTextDomain); } public static string NormalizeNick(string nickname) { string normalized = nickname; normalized = normalized.ToLower(); normalized = normalized.Replace("[", "{"); normalized = normalized.Replace("]", "}"); normalized = normalized.Replace("\\", "|"); normalized = normalized.Replace("~", "^"); return normalized; } public static bool CompareNicks(string a, string b) { return NormalizeNick(a) == NormalizeNick(b); } } } smuxi-1.1/src/Engine-IRC/Protocols/Irc/IrcGroupPersonModel.cs0000644000175000017500000001043112253423337024662 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2007, 2011 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Runtime.Serialization; using Smuxi.Common; namespace Smuxi.Engine { [Serializable] public class IrcGroupPersonModel : IrcPersonModel { public bool IsOwner { get; internal set; } public bool IsChannelAdmin { get; internal set; } public bool IsOp { get; internal set; } public bool IsHalfop { get; internal set; } public bool IsVoice { get; internal set; } internal IrcGroupPersonModel(string nickname, string realname, string ident, string host, string networkID, IProtocolManager networkManager) : base(nickname, realname, ident, host, networkID, networkManager) { } internal IrcGroupPersonModel(string nickname, string networkID, IProtocolManager networkManager) : base(nickname, networkID, networkManager) { } internal protected IrcGroupPersonModel(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { } protected override void GetObjectData(SerializationWriter sw) { if (sw == null) { throw new ArgumentNullException("sw"); } base.GetObjectData(sw); sw.Write(IsOp); sw.Write(IsVoice); sw.Write(IsOwner); sw.Write(IsChannelAdmin); sw.Write(IsHalfop); } protected override void SetObjectData(SerializationReader sr) { if (sr == null) { throw new ArgumentNullException("sr"); } base.SetObjectData(sr); IsOp = sr.ReadBoolean(); IsVoice = sr.ReadBoolean(); // backward compatibility if (sr.PeekChar() != -1) { IsOwner = sr.ReadBoolean(); IsChannelAdmin = sr.ReadBoolean(); IsHalfop = sr.ReadBoolean(); } } public override int CompareTo(ContactModel contact) { var ircContact = contact as IrcGroupPersonModel; if (ircContact == null) { return 1; } int status1 = 0; if (IsOwner) { status1 += 5; } else if (IsChannelAdmin) { status1 += 4; } else if (IsOp) { status1 += 3; } else if (IsHalfop) { status1 += 2; } else if (IsVoice) { status1 += 1; } int status2 = 0; if (ircContact.IsOwner) { status2 += 5; } else if (ircContact.IsChannelAdmin) { status2 += 4; } else if (ircContact.IsOp) { status2 += 3; } else if (ircContact.IsHalfop) { status2 += 2; } else if (ircContact.IsVoice) { status2 += 1; } int res = status2.CompareTo(status1); if (res != 0 ) { return res; } // the status is equal, so the name decides return base.CompareTo(contact); } } } smuxi-1.1/src/Engine-IRC/AssemblyInfo.cs0000644000175000017500000000236312253423337020657 0ustar00meebeymeebey00000000000000/* * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Smuxi - IRC protocol support")] [assembly: AssemblyCopyright("2005-2013 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] smuxi-1.1/src/Engine-IRC/Makefile.am0000664000175000017500000000620214011472672017767 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ ASSEMBLY = ../../bin/release/smuxi-engine-irc.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/release/smuxi-common.dll \ ../../bin/release/smuxi-engine.dll BUILD_DIR = ../../bin/release SMUXI_ENGINE_DLL_MDB= NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-engine-irc.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-engine.dll BUILD_DIR = ../../bin/debug SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif if BUNDLE_LOG4NET LOG4NET_DLL_SOURCE=../../lib/log4net.dll LOG4NET_REF_LIBS=-r:$(LOG4NET_DLL_SOURCE) else LOG4NET_REF_LIBS=$(LOG4NET_LIBS) endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(LOG4NET_DLL) \ $(NINI_DLL) \ $(SMUXI_COMMON_DLL) \ $(SMUXI_COMMON_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_ENGINE_DLL_MDB) LINUX_PKGCONFIG = \ $(ENGINE_IRC_PC) all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) FILES = \ Protocols/Irc/IrcGroupPersonModel.cs \ Protocols/Irc/IrcMessageBuilder.cs \ Protocols/Irc/IrcProtocolManager.cs \ Protocols/Irc/IrcPersonModel.cs \ Protocols/Irc/IrcTextColor.cs \ Protocols/Irc/SlackProtocolManager.cs \ Config/IrcServerModel.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-engine-irc.pc.in REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) include $(top_srcdir)/Makefile.include ENGINE_IRC_PC = $(BUILD_DIR)/smuxi-engine-irc.pc SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-wrapper,ENGINE_IRC_PC,smuxi-engine-irc.pc)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) smuxi-1.1/src/Engine-IRC/Config/0000775000175000017500000000000014011526501017127 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Engine-IRC/Config/IrcServerModel.cs0000644000175000017500000000213011700531610022334 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2011 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Collections.Generic; namespace Smuxi.Engine { public class IrcServerModel : ServerModel { public List Nicknames { get; set; } public IrcServerModel() { } } } smuxi-1.1/src/Engine-IRC/Makefile.in0000664000175000017500000010223214011526471017775 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Engine-IRC ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-engine-irc.pc 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-engine-irc.pc.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-engine-irc.dll @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-engine-irc.dll @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = @ENABLE_DEBUG_TRUE@COMPILE_TARGET = library @ENABLE_RELEASE_TRUE@COMPILE_TARGET = library @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb @BUNDLE_LOG4NET_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @BUNDLE_LOG4NET_FALSE@LOG4NET_REF_LIBS = $(LOG4NET_LIBS) @BUNDLE_LOG4NET_TRUE@LOG4NET_REF_LIBS = -r:$(LOG4NET_DLL_SOURCE) AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(LOG4NET_DLL) \ $(NINI_DLL) \ $(SMUXI_COMMON_DLL) \ $(SMUXI_COMMON_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_ENGINE_DLL_MDB) LINUX_PKGCONFIG = \ $(ENGINE_IRC_PC) FILES = \ Protocols/Irc/IrcGroupPersonModel.cs \ Protocols/Irc/IrcMessageBuilder.cs \ Protocols/Irc/IrcProtocolManager.cs \ Protocols/Irc/IrcPersonModel.cs \ Protocols/Irc/IrcTextColor.cs \ Protocols/Irc/SlackProtocolManager.cs \ Config/IrcServerModel.cs \ ../AssemblyVersion.cs \ AssemblyInfo.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-engine-irc.pc.in REFERENCES = \ System \ System.Core \ Mono.Posix \ $(LOG4NET_REF_LIBS) DLL_REFERENCES = \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(ASSEMBLY) \ $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) ENGINE_IRC_PC = $(BUILD_DIR)/smuxi-engine-irc.pc SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Engine-IRC/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Engine-IRC/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-engine-irc.pc: $(top_builddir)/config.status $(srcdir)/smuxi-engine-irc.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-wrapper,ENGINE_IRC_PC,smuxi-engine-irc.pc)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) # 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: smuxi-1.1/src/Engine-IRC/smuxi-engine-irc.pc.in0000644000175000017500000000022411655545675022062 0ustar00meebeymeebey00000000000000Name: smuxi-engine-irc Description: Engine-IRC Version: @VERSION@ Requires: smuxi-engine Libs: -r:@expanded_libdir@/@PACKAGE@/smuxi-engine-irc.dll smuxi-1.1/src/Frontend-Test/0000775000175000017500000000000014011526502016577 5ustar00meebeymeebey00000000000000smuxi-1.1/src/Frontend-Test/AssemblyInfo.cs0000644000175000017500000000225411655545675021551 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyTitle("Smuxi - Test frontend")] [assembly: AssemblyCopyright("2005-2008 (C) Mirco Bauer ")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/src/Frontend-Test/TestUI.cs0000644000175000017500000000774611655545675020346 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using Smuxi.Engine; using Smuxi.Common; namespace Smuxi.FrontendTest { public class TestUI : PermanentRemoteObject, IFrontendUI { private int _Version = 0; public int Version { get { return _Version; } } public void AddChat(ChatModel page) { Trace.Call(page); Console.WriteLine("New page: "+page.Name+ " type: "+page.ChatType); Frontend.ChangeActiveChat(page); } public void AddMessageToChat(ChatModel page, MessageModel msg) { Trace.Call(page, msg); string finalMsg = String.Empty; foreach (MessagePartModel msgPart in msg.MessageParts) { // TODO: implement other types if (msgPart is TextMessagePartModel) { TextMessagePartModel fmsgti = (TextMessagePartModel) msgPart; finalMsg += fmsgti.Text; } } string timestamp; try { timestamp = msg.TimeStamp.ToLocalTime().ToString((string)Frontend.UserConfig["Interface/Notebook/TimestampFormat"]); } catch (FormatException e) { timestamp = "Timestamp Format ERROR: " + e.Message; } finalMsg = timestamp + " " + page.Name + " " + finalMsg; Console.WriteLine(finalMsg); } public void RemoveChat(ChatModel page) { Trace.Call(page); Console.WriteLine("Removed page: "+page.Name+" type: "+page.ChatType); } public void EnableChat(ChatModel page) { Trace.Call(page); } public void DisableChat(ChatModel page) { Trace.Call(page); } public void SyncChat(ChatModel page) { Trace.Call(page); Console.WriteLine("Synced page: "+page.Name+" type: "+page.ChatType); Frontend.FrontendManager.AddSyncedChat(page); } public void AddPersonToGroupChat(GroupChatModel cpage, PersonModel user) { Trace.Call(cpage, user); } public void UpdatePersonInGroupChat(GroupChatModel cpage, PersonModel olduser, PersonModel newuser) { Trace.Call(cpage, olduser, newuser); } public void UpdateTopicInGroupChat(GroupChatModel cpage, MessageModel topic) { Trace.Call(cpage, topic); Console.WriteLine("Topic changed to: " + topic.ToString() + " on " + cpage.Name); } public void RemovePersonFromGroupChat(GroupChatModel cpage, PersonModel user) { Trace.Call(cpage, user); } public void SetNetworkStatus(string status) { Trace.Call(status); } public void SetStatus(string status) { Trace.Call(status); } } } smuxi-1.1/src/Frontend-Test/Makefile.am0000664000175000017500000000577313411450522020650 0ustar00meebeymeebey00000000000000 EXTRA_DIST = # Warning: This is an automatically generated file, do not edit! if ENABLE_RELEASE ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG ASSEMBLY = ../../bin/release/smuxi-frontend-test.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/release/smuxi-engine.dll \ ../../bin/release/smuxi-common.dll \ ../../bin/release/smuxi-frontend.dll BUILD_DIR = ../../bin/release LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_MDB= NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/release/smuxi-engine.dll SMUXI_COMMON_DLL_SOURCE=../../bin/release/smuxi-common.dll endif if ENABLE_DEBUG ASSEMBLY_COMPILER_COMMAND = @MCS@ ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" ASSEMBLY = ../../bin/debug/smuxi-frontend-test.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = exe PROJECT_REFERENCES = \ ../../bin/debug/smuxi-engine.dll \ ../../bin/debug/smuxi-common.dll \ ../../bin/debug/smuxi-frontend.dll BUILD_DIR = ../../bin/debug LOG4NET_DLL_SOURCE=../../lib/log4net.dll SMUXI_ENGINE_DLL_MDB_SOURCE=../../bin/debug/smuxi-engine.dll.mdb SMUXI_ENGINE_DLL_MDB=$(BUILD_DIR)/smuxi-engine.dll.mdb NINI_DLL_SOURCE=../../lib/Nini.dll SMUXI_ENGINE_DLL_SOURCE=../../bin/debug/smuxi-engine.dll SMUXI_COMMON_DLL_SOURCE=../../bin/debug/smuxi-common.dll endif AL=al2 SATELLITE_ASSEMBLY_NAME=.resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_COMMON_DLL) BINARIES = \ $(FRONTEND_TEST) all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Frontend.cs \ Main.cs \ TestUI.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend-test.in REFERENCES = \ System.Runtime.Remoting \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) include $(top_srcdir)/Makefile.include LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_TEST = $(BUILD_DIR)/smuxi-frontend-test SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll $(eval $(call emit-deploy-target,LOG4NET_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,NINI_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-wrapper,FRONTEND_TEST,smuxi-frontend-test,x)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) smuxi-1.1/src/Frontend-Test/smuxi-frontend-test.in0000644000175000017500000000012011655545675023104 0ustar00meebeymeebey00000000000000#!/bin/sh exec mono "@expanded_libdir@/@PACKAGE@/smuxi-frontend-test.exe" "$@" smuxi-1.1/src/Frontend-Test/Main.cs0000644000175000017500000000275011655545675020043 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; namespace Smuxi.FrontendTest { public class MainClass { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public static void Main(string[] args) { #if LOG4NET log4net.Config.BasicConfigurator.Configure(); #endif try { Frontend.Init(args); } catch (Exception e) { #if LOG4NET _Logger.Fatal(e); #endif throw; } } } } smuxi-1.1/src/Frontend-Test/Makefile.in0000664000175000017500000010210314011526472020647 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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/Frontend-Test ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = smuxi-frontend-test 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)$(pkgappdir)" \ "$(DESTDIR)$(linuxdesktopapplicationsdir)" \ "$(DESTDIR)$(linuxpkgconfigdir)" \ "$(DESTDIR)$(programfilesdir)" \ "$(DESTDIR)$(programfilesiconsdir)" SCRIPTS = $(bin_SCRIPTS) $(pkgapp_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(linuxdesktopapplications_DATA) $(linuxpkgconfig_DATA) \ $(programfiles_DATA) $(programfilesicons_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/smuxi-frontend-test.in \ $(top_srcdir)/Makefile.include DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ EXTRA_DIST = $(build_sources) $(build_resx_files) \ $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) \ $(DATA_FILES) $(build_culture_res_files) @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ # Warning: This is an automatically generated file, do not edit! @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_COMMAND = @MCS@ @ENABLE_DEBUG_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG "-define:DEBUG,TRACE,LOG4NET" @ENABLE_RELEASE_TRUE@ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:4 -optimize+ -debug -define:DEBUG @ENABLE_DEBUG_TRUE@ASSEMBLY = ../../bin/debug/smuxi-frontend-test.exe @ENABLE_RELEASE_TRUE@ASSEMBLY = ../../bin/release/smuxi-frontend-test.exe @ENABLE_DEBUG_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_RELEASE_TRUE@ASSEMBLY_MDB = $(ASSEMBLY).mdb @ENABLE_DEBUG_TRUE@COMPILE_TARGET = exe @ENABLE_RELEASE_TRUE@COMPILE_TARGET = exe @ENABLE_DEBUG_TRUE@PROJECT_REFERENCES = \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-engine.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-common.dll \ @ENABLE_DEBUG_TRUE@ ../../bin/debug/smuxi-frontend.dll @ENABLE_RELEASE_TRUE@PROJECT_REFERENCES = \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-engine.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-common.dll \ @ENABLE_RELEASE_TRUE@ ../../bin/release/smuxi-frontend.dll @ENABLE_DEBUG_TRUE@BUILD_DIR = ../../bin/debug @ENABLE_RELEASE_TRUE@BUILD_DIR = ../../bin/release @ENABLE_DEBUG_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_RELEASE_TRUE@LOG4NET_DLL_SOURCE = ../../lib/log4net.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB = $(BUILD_DIR)/smuxi-engine.dll.mdb @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_MDB = @ENABLE_DEBUG_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_RELEASE_TRUE@NINI_DLL_SOURCE = ../../lib/Nini.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/debug/smuxi-engine.dll @ENABLE_RELEASE_TRUE@SMUXI_ENGINE_DLL_SOURCE = ../../bin/release/smuxi-engine.dll @ENABLE_DEBUG_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/debug/smuxi-common.dll @ENABLE_RELEASE_TRUE@SMUXI_COMMON_DLL_SOURCE = ../../bin/release/smuxi-common.dll @ENABLE_DEBUG_TRUE@SMUXI_ENGINE_DLL_MDB_SOURCE = ../../bin/debug/smuxi-engine.dll.mdb AL = al2 SATELLITE_ASSEMBLY_NAME = .resources.dll PROGRAMFILES = \ $(SMUXI_ENGINE_DLL_MDB) \ $(SMUXI_ENGINE_DLL) \ $(SMUXI_COMMON_DLL) BINARIES = \ $(FRONTEND_TEST) FILES = \ ../AssemblyVersion.cs \ AssemblyInfo.cs \ Frontend.cs \ Main.cs \ TestUI.cs DATA_FILES = RESOURCES = EXTRAS = \ smuxi-frontend-test.in REFERENCES = \ System.Runtime.Remoting \ $(LOG4NET_LIBS) DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(BINARIES) $(ASSEMBLY) $(ASSEMBLY).mdb \ $(BINARIES) $(build_resx_resources) \ $(build_satellite_assembly_list) VALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT build_sources = $(FILES) $(GENERATED_FILES) build_sources_embed = $(build_sources:%='$(srcdir)/%') comma__ = , get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) build_resx_list = $(foreach res, $(RESOURCES), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources = $(build_resx_files:.resx=.resources) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) build_resx_resources_embed = $(build_resx_resources_hack:%='-resource:%') build_others_files = $(foreach res, $(build_others_list),$(call get_resource_name,$(res))) build_others_resources = $(build_others_files) build_others_resources_embed = $(build_others_list:%='-resource:$(srcdir)/%') build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) build_references_ref = $(foreach ref, $(REFERENCES), $(if $(filter \ -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), \ -r:$(ref)))) $(foreach ref, $(DLL_REFERENCES), -r:$(ref)) \ $(foreach ref, $(PROJECT_REFERENCES), -r:$(ref)) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) pkgappdir = $(pkglibdir) pkgapp_SCRIPTS = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) programfilesiconsdir = @libdir@/@PACKAGE@/icons programfilesicons_DATA = $(PROGRAMFILES_ICONS) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) linuxdesktopapplicationsdir = @prefix@/share/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2) culture_resource_commandlines = cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)' build_satellite_assembly_list = $(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME)) build_culture_res_files = $(foreach res, $(culture_resources),$(call get_resource_name,$(res))) LOG4NET_DLL = $(BUILD_DIR)/log4net.dll NINI_DLL = $(BUILD_DIR)/Nini.dll SMUXI_ENGINE_DLL = $(BUILD_DIR)/smuxi-engine.dll FRONTEND_TEST = $(BUILD_DIR)/smuxi-frontend-test SMUXI_COMMON_DLL = $(BUILD_DIR)/smuxi-common.dll all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(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) --foreign src/Frontend-Test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Frontend-Test/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/Makefile.include $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): smuxi-frontend-test: $(top_builddir)/config.status $(srcdir)/smuxi-frontend-test.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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) install-pkgappSCRIPTS: $(pkgapp_SCRIPTS) @$(NORMAL_INSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(pkgappdir)$$dir" || exit $$?; \ } \ ; done uninstall-pkgappSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(pkgapp_SCRIPTS)'; test -n "$(pkgappdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(am__uninstall_files_from_dir) install-linuxdesktopapplicationsDATA: $(linuxdesktopapplications_DATA) @$(NORMAL_INSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxdesktopapplicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxdesktopapplicationsdir)" || 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)$(linuxdesktopapplicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxdesktopapplicationsdir)" || exit $$?; \ done uninstall-linuxdesktopapplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(linuxdesktopapplications_DATA)'; test -n "$(linuxdesktopapplicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxdesktopapplicationsdir)'; $(am__uninstall_files_from_dir) install-linuxpkgconfigDATA: $(linuxpkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(linuxpkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(linuxpkgconfigdir)" || 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)$(linuxpkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(linuxpkgconfigdir)" || exit $$?; \ done uninstall-linuxpkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(linuxpkgconfig_DATA)'; test -n "$(linuxpkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(linuxpkgconfigdir)'; $(am__uninstall_files_from_dir) install-programfilesDATA: $(programfiles_DATA) @$(NORMAL_INSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesdir)" || 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)$(programfilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesdir)" || exit $$?; \ done uninstall-programfilesDATA: @$(NORMAL_UNINSTALL) @list='$(programfiles_DATA)'; test -n "$(programfilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesdir)'; $(am__uninstall_files_from_dir) install-programfilesiconsDATA: $(programfilesicons_DATA) @$(NORMAL_INSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(programfilesiconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(programfilesiconsdir)" || 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)$(programfilesiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(programfilesiconsdir)" || exit $$?; \ done uninstall-programfilesiconsDATA: @$(NORMAL_UNINSTALL) @list='$(programfilesicons_DATA)'; test -n "$(programfilesiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(programfilesiconsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(SCRIPTS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgappdir)" "$(DESTDIR)$(linuxdesktopapplicationsdir)" "$(DESTDIR)$(linuxpkgconfigdir)" "$(DESTDIR)$(programfilesdir)" "$(DESTDIR)$(programfilesiconsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-pkgappSCRIPTS \ install-programfilesDATA install-programfilesiconsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir 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-linuxdesktopapplicationsDATA \ install-linuxpkgconfigDATA install-man install-pdf \ install-pdf-am install-pkgappSCRIPTS install-programfilesDATA \ install-programfilesiconsDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS \ uninstall-linuxdesktopapplicationsDATA \ uninstall-linuxpkgconfigDATA uninstall-pkgappSCRIPTS \ uninstall-programfilesDATA uninstall-programfilesiconsDATA .PRECIOUS: Makefile all: $(ASSEMBLY) $(PROGRAMFILES) $(BINARIES) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p $$(dir $($1)) cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 mkdir -p '$$(@D)' cp '$$<' '$$@' $(if $3,chmod +x '$$@') endef $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(eval $(call emit-deploy-target,LOG4NET_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL_MDB)) $(eval $(call emit-deploy-target,NINI_DLL)) $(eval $(call emit-deploy-target,SMUXI_ENGINE_DLL)) $(eval $(call emit-deploy-wrapper,FRONTEND_TEST,smuxi-frontend-test,x)) $(eval $(call emit-deploy-target,SMUXI_COMMON_DLL)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(build_resx_resources) : %.resources: %.resx resgen2 '$<' '$@' $(ASSEMBLY) $(ASSEMBLY_MDB): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) mkdir -p $(dir $(ASSEMBLY)) $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) # 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: smuxi-1.1/src/Frontend-Test/Frontend.cs0000664000175000017500000001534214011467170020717 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System; using System.Collections; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.Serialization.Formatters; using Smuxi; using Smuxi.Frontend; using Smuxi.Engine; namespace Smuxi.FrontendTest { public class Frontend { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif public const char Escape = (char)27; private static FrontendManager _FrontendManager; private static FrontendConfig _FrontendConfig; private static Session _Session; private static UserConfig _UserConfig; public static FrontendConfig FrontendConfig { get { return _FrontendConfig; } } public static FrontendManager FrontendManager { get { return _FrontendManager; } } public static Session Session { get { return _Session; } } public static UserConfig UserConfig { get { return _UserConfig; } } public static void Init(string[] args) { System.Threading.Thread.CurrentThread.Name = "Main"; if (!(args.Length >= 1)) { Console.Error.WriteLine("Usage: smuxi-test.exe profile"); Environment.Exit(1); } #if LOG4NET _Logger.Info("smuxi-test starting"); #endif _FrontendConfig = new FrontendConfig("Test"); _FrontendConfig.Load(); string profile = args[0]; if (String.IsNullOrEmpty(profile)) { Console.Error.WriteLine("profile parameter must not be empty!"); Environment.Exit(1); } IFrontendUI ui = new TestUI(); Session session = null; if (profile == "local") { Engine.Engine.Init(); session = new Engine.Session(Engine.Engine.Config, Engine.Engine.ProtocolManagerFactory, "local"); session.ExecuteOnStartupCommands(); session.ProcessAutoConnect(); session.RegisterFrontendUI(ui); } else { // remote engine EngineManager engineManager = new EngineManager(_FrontendConfig, ui); engineManager.Connect(profile); session = engineManager.Session; } if (session == null) { Console.Error.WriteLine("Session is null, something went wrong setting up or connecting to the engine!"); Environment.Exit(1); } _Session = session; _UserConfig = session.UserConfig; _FrontendManager = session.GetFrontendManager(ui); _FrontendManager.Sync(); if (_UserConfig.IsCaching) { // when our UserConfig is cached, we need to invalidate the cache _FrontendManager.ConfigChangedDelegate = new SimpleDelegate(_UserConfig.ClearCache); } while (true) { string line = Console.ReadLine(); // TODO: remove the entered line from output //Console.WriteLine(Escape+"M"); _ExecuteCommand(line); } } public static void _ExecuteCommand(string cmd) { bool handled = false; CommandModel cd = new CommandModel(_FrontendManager, _FrontendManager.CurrentChat, (string)_UserConfig["Interface/Entry/CommandCharacter"], cmd); if (cd.IsCommand) { switch (cd.Command) { case "window": bool found = false; lock (_Session.Chats) { foreach (ChatModel chatModel in _Session.Chats) { if (chatModel.Name.ToLower() == cd.Parameter.ToLower()) { found = true; ChangeActiveChat(chatModel); break; } } } if (!found) { Console.WriteLine("-!- Unknown page: "+cd.Parameter); } handled = true; break; case "quit": Environment.Exit(0); handled = true; break; } } if (!handled) { handled = _Session.Command(cd); } if (!handled) { // we may have no network manager yet if (_FrontendManager.CurrentProtocolManager != null) { handled = _FrontendManager.CurrentProtocolManager.Command(cd); } else { handled = true; } } if (!handled) { Console.WriteLine("-!- Unknown command"); } } public static void ChangeActiveChat(ChatModel chatModel) { Console.WriteLine("Active chat: "+chatModel.Name); _FrontendManager.CurrentChat = chatModel; } } } smuxi-1.1/src/AssemblyVersion.cs.in0000644000175000017500000000237211655545675020215 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * Smuxi - Smart MUltipleXed Irc * * Copyright (c) 2005-2006 Mirco Bauer * * Full GPL License: * * 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 */ using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyDescription("Smart MUltipleXed Irc")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("qNETp")] [assembly: AssemblyProduct("Smuxi")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyVersion("@VERSION@")] smuxi-1.1/LICENSE0000644000175000017500000004310311655545675014347 0ustar00meebeymeebey00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. smuxi-1.1/po-Frontend-GNOME-IRC/0000775000175000017500000000000014011526504016767 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Frontend-GNOME-IRC/LINGUAS0000664000175000017500000000014314011526464020017 0ustar00meebeymeebey00000000000000ca cs da de el en_GB es fa fi fr hr hu id it lt nl oc pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Frontend-GNOME-IRC/en_GB.po0000664000175000017500000000425514011526464020314 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2009 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # Ryan Smith-Evans , 2009. # msgid "" msgstr "" "Project-Id-Version: smuxi 0.6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-09 15:32+0100\n" "PO-Revision-Date: 2010-01-09 00:20+0100\n" "Last-Translator: Ryan Smith-Evans \n" "Language-Team: English (British)\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:53 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:57 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:61 msgid "Voice" msgstr "Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:65 msgid "Devoice" msgstr "Devoice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:69 msgid "Kick" msgstr "Kick" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:73 msgid "Kick + Ban" msgstr "Kick + Ban" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:77 msgid "Ban" msgstr "Ban" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:81 msgid "Unban" msgstr "Unban" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:87 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:91 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:57 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:96 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:99 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:66 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:103 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:70 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:107 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Time" msgstr "Time" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:111 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:78 msgid "Finger" msgstr "Finger" smuxi-1.1/po-Frontend-GNOME-IRC/cs.po0000664000175000017500000000443414011526464017746 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: RavuAlHemio \n" "Language-Team: Czech (http://www.transifex.com/projects/p/smuxi/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Soukromý pokec" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Operátor" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Odebrat operátora" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Hlas" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Odebrat hlas" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Vykopnout" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Vykopnout + zákaz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Zákaz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Zrušit zákaz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Kdo je" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Pozvat do" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Verze" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Čas" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Info o uživateli" smuxi-1.1/po-Frontend-GNOME-IRC/zh_CN.po0000664000175000017500000000442414011526464020341 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-13 08:16+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "私聊" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "设为版主" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "撤销版主" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "设为认证用户" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "撤销认证用户" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "踢除" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "踢除 + 封禁" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "封禁" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "解封" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "详情" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "邀请加入" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "版本" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "用户时间" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "真实姓名与空闲时间" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "用户信息" smuxi-1.1/po-Frontend-GNOME-IRC/sk.po0000664000175000017500000000447214011526464017760 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2011-09-30 08:40+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "Hlas" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "Ukončiť hlas" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "Vykopnúť" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "Vykopnúť + zakázať" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "Zakázať" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "Zrušiť zakázanie" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "Opýtať sa" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "Kto je" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "Pozvať na" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "Verzia" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "Čas" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "Informácie o používateľovi" smuxi-1.1/po-Frontend-GNOME-IRC/el.po0000664000175000017500000000524414011526464017741 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-24 11:46+0000\n" "PO-Revision-Date: 2015-07-27 12:13+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@lists.gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Ερώτημα" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Χειριστής" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Αφαίρεση χειριστή" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Ομιλία" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Αφαίρεση φωνής" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Αποβολή" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Αποβολή + απαγόρευση" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Απαγόρευση" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Άρση αποκλεισμού" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Ποιος είναι" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Πρόσκληση στο" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Αναγνωριστική αποστολή" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Έκδοση" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Χρόνος" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Δάκτυλο (Finger)" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Πληροφορίες χρήστη" smuxi-1.1/po-Frontend-GNOME-IRC/ro.po0000664000175000017500000000463314011526464017762 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:21+0000\n" "PO-Revision-Date: 2018-04-06 23:25+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > " "0 && n%100 < 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Interogare" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Operator" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Elimină operator" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voce" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Elimină vocea" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Dă afară" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Dă afară + blochează" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Blochează" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Deblochează" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Cine este" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Invită la" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versiune" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Ora" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Informații extra" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Informații utilizator" smuxi-1.1/po-Frontend-GNOME-IRC/fi.po0000664000175000017500000000437014011526464017736 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Yksityisviesti" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Operaattori" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Ääni" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Poista Ääni" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Potki" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Potki + porttikielto" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Porttikielto" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Poista porttikielto" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Kutsu..." #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versio" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Aika" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Userinfo" smuxi-1.1/po-Frontend-GNOME-IRC/de.po0000664000175000017500000000443514011526464017732 0ustar00meebeymeebey00000000000000# German translation for smuxi-Frontend-GNOME-IRC. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Mario Blättermann , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:04+0100\n" "PO-Revision-Date: 2016-01-08 15:08+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Devoice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Hinauswerfen" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Hinauswerfen und Sperren" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Sperren" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Sperre aufheben" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:63 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:67 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Invite to" msgstr "Einladen zu" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Zeit" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Benutzerinformationen" smuxi-1.1/po-Frontend-GNOME-IRC/hu.po0000664000175000017500000000452514011526464017756 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 11:46+0000\n" "PO-Revision-Date: 2015-07-17 18:08+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Lekérdezés" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Hang" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Hang elvétele" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Kirúgás" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Kirúgás + kitiltás" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Kitiltás" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Kitiltás visszavonása" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Kicsoda" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Meghívás" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Verzió" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Idő" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Ujj" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Felhasználó-információk" smuxi-1.1/po-Frontend-GNOME-IRC/ur.po0000664000175000017500000000410114011526464017756 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-11-30 04:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "" smuxi-1.1/po-Frontend-GNOME-IRC/fr.po0000664000175000017500000000427414011526464017752 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Chat privé" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Opper" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Enlever l'Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voicer" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Enlever le Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Kicker" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Kicker + Bannir" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Bannir" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Enlever le ban" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Inviter à" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Temps" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Userinfo" smuxi-1.1/po-Frontend-GNOME-IRC/sr.po0000664000175000017500000000513114011526464017760 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:43+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Упит" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Оп" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Разреши дужности" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Глас" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Обезгласи" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Избаци" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Избаци и забрани" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Забрани" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Поништи забрану" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Ко-је" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "ЦТЦП" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Позови у" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Пинг" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Издање" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Време" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Додирни" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Подаци о кориснику" smuxi-1.1/po-Frontend-GNOME-IRC/sl.po0000664000175000017500000000441714011526464017760 0ustar00meebeymeebey00000000000000#'smuxi/po-Frontend-GNOME-IRC/ # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:41+0000\n" "PO-Revision-Date: 2016-03-11 21:41+0000\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "" smuxi-1.1/po-Frontend-GNOME-IRC/pl.po0000664000175000017500000000454214011526464017754 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:54+0200\n" "PO-Revision-Date: 2016-08-21 16:40+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Zapytanie" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Daj operatora" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Zabierz operatora" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Daj Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Zabierz Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Wyrzuć" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Wyrzuć i zbanuj" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Zbanuj" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Odbanuj" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Kim jest" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Zaproś do" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Wersja" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Czas" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Informacje o użytkowniku" smuxi-1.1/po-Frontend-GNOME-IRC/id.po0000664000175000017500000000436314011526464017736 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:43+0000\n" "PO-Revision-Date: 2017-04-20 13:54+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Kueri" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Suara" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Devoice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Tendang" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Tendang + Cekal" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Cekal" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Lepas cekal" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Undang ke" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versi" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Waktu" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Jari" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Info pengguna" smuxi-1.1/po-Frontend-GNOME-IRC/es.po0000664000175000017500000000430314011526464017743 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-10 18:53+0000\n" "Last-Translator: Matías Bellone\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Consulta" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Quitar voz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Expulsar" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Expulsar + bloquear" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Bloquear" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Desbloquear" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Invitar a" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versión" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Hora" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Información de usuario" smuxi-1.1/po-Frontend-GNOME-IRC/Makefile.in.in0000664000175000017500000001600114011526464021444 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Frontend-GNOME-IRC/pt.po0000664000175000017500000000473614011526464017771 0ustar00meebeymeebey00000000000000# Translation of smuxi-frontend-gnome-irc messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-frontend-gnome-irc package. # Américo Monteiro , 2010. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend-gnome-irc\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:47+0000\n" "PO-Revision-Date: 2015-11-17 10:15+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Consultar" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Dar Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Retirar Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Dar voz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Retirar voz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Expulsar" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Expulsar + Banir" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Banir" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Retirar dos banidos" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Quem é" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Convidar para" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versão" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Hora" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Apontar" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Informação do utilizador" smuxi-1.1/po-Frontend-GNOME-IRC/it.po0000664000175000017500000000455514011526464017761 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # David Paleino , 2008. # # Vincenzo Campanella , 2009-2010, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend-gnome-irc\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-07-15 13:28+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "Operatore" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "Rimuovi l'operatore" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "Dai la parola" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "Togli la parola" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "Espelli (kick)" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "Espelli (kick) e allontana (ban)" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "Allontana (ban)" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "Rimuovi l'allontanamento (unban)" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "Messaggio privato" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "Invita a" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "Versione" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "Ora" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "Informazioni sull'utente" smuxi-1.1/po-Frontend-GNOME-IRC/nl.po0000664000175000017500000000453014011526464017747 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:20+0000\n" "PO-Revision-Date: 2019-03-10 15:05+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Devoice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Schoppen" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Schoppen + verbannen" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Verbannen" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Verbanning opheffen" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Uitnodigen voor" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versie" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Tijd" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Wijs" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Gebruikersinfo" smuxi-1.1/po-Frontend-GNOME-IRC/ru.po0000664000175000017500000000505514011526464017767 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:43+0200\n" "PO-Revision-Date: 2017-09-19 09:12+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Запрос" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Сделать оператором" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Убрать статус оператора" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Дать голос" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Отнять голос" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Выгнать" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Выгнать и запретить" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Запретить" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Разрешить" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Пригласить" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Версия" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Время" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Информация о пользователе" smuxi-1.1/po-Frontend-GNOME-IRC/lt.po0000664000175000017500000000461014011526464017754 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Andrius Bentkus , 2015 # Moo, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2015-05-26 10:13+0000\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Užklausa" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Suteikti operatoriaus teises" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Atimti operatoriaus teises" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Suteikti balsą" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Atimti balsą" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Išmesti" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Išmesti + Užbaninti" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Užbaninti" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Atbaninti" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Kas yra" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Pakviesti į" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ryšio patikrinimas" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Versija" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Laikas" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Klientų ieškyklė" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Vartotojo informacija" smuxi-1.1/po-Frontend-GNOME-IRC/oc.po0000664000175000017500000000442714011526464017744 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:47+0000\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/" "fr/)\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Chat privat" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Opper" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Levar l'Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voicer" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Levar lo Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Kicker" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Kicker + Bannir" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Bannir" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Levar lo ban" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Inviter a" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Temps" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Userinfo" smuxi-1.1/po-Frontend-GNOME-IRC/POTFILES.in0000664000175000017500000000017214011526464020551 0ustar00meebeymeebey00000000000000src/Frontend-GNOME-IRC/IrcGroupChatView.cs src/Frontend-GNOME-IRC/IrcPersonChatView.cs src/Frontend-GNOME-IRC/CtcpMenu.cs smuxi-1.1/po-Frontend-GNOME-IRC/POTFILES.skip0000664000175000017500000000046414011526464021115 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Frontend-GNOME-IRC/te.po0000664000175000017500000000406014011526464017744 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:04+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:63 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:67 msgid "CTCP" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "" smuxi-1.1/po-Frontend-GNOME-IRC/ca.po0000664000175000017500000000412514011526464017721 0ustar00meebeymeebey00000000000000# msgid "" msgstr "" "Project-Id-Version: Smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: \n" "Last-Translator: Siegfried-Angel Gevatter Pujals \n" "Language-Team: Siegfried Gevatter \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "X-Poedit-Language: Catalan\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "Dóna l'estatus d'operador" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "Treu l'estatus d'operador" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "Dóna l'estatus de veu" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "Treu l'estatus de veu" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "Expulsa" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "Expulsa i bandeja" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "Bandeja" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "Readmet l'usuari" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "Conversa privada" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "Informació de l'usuari" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "Invita a" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "Versió del client d'IRC" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "Hora" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "Informació de l'usuari" smuxi-1.1/po-Frontend-GNOME-IRC/sv.po0000664000175000017500000000445714011526464017776 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:04+0100\n" "PO-Revision-Date: 2013-12-10 13:33+0000\n" "Last-Translator: Martin Bagge \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Privat" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Gör till operatör" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Ta bort operatörsskap" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Ge \"voice\"-status" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Ta bort voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Sparka" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Sparka och stäng ute" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Stäng ute" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Upphäv utestängning" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:63 msgid "Whois" msgstr "Användarinformation" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:67 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Invite to" msgstr "Bjud in till" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Tid" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Användarinformation" smuxi-1.1/po-Frontend-GNOME-IRC/tr.po0000664000175000017500000000441014011526464017760 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # zeugma , 2013 # Ş. Uzun , 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2014-11-12 09:51+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Özel Sohbet" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op Ver" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Op Kaldır" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voice Ver" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Voice Kaldır" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "At" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "At + Yasakla" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Yasakla" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Yasak Kaldır" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Şuraya davet et" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Time" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Userinfo" smuxi-1.1/po-Frontend-GNOME-IRC/pt_BR.po0000664000175000017500000000435514011526464020351 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Leonardopf , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:04+0100\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: Leonardopf \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/smuxi/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Retirado Voz" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Expulso" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Expulso + Banido" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Banido" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Desbanido" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:63 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:67 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Invite to" msgstr "Convidar para" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Tempo" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "InfoUsuário" smuxi-1.1/po-Frontend-GNOME-IRC/fa.po0000664000175000017500000000405214011526464017723 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:04+0100\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:63 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:67 msgid "CTCP" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "" smuxi-1.1/po-Frontend-GNOME-IRC/da.po0000664000175000017500000000440314011526464017721 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:47+0000\n" "PO-Revision-Date: 2013-11-19 16:27+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:390 msgid "Query" msgstr "Forespørgsel" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Voice" msgstr "Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Devoice" msgstr "Devoice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Kick" msgstr "Smid ud" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:416 msgid "Kick + Ban" msgstr "Smid ud + giv karantæne" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:420 msgid "Ban" msgstr "Giv karantæne" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:424 msgid "Unban" msgstr "Fjern karantæne" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:430 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:92 msgid "Whois" msgstr "Hvem er" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:434 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:96 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:443 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:103 msgid "Invite to" msgstr "Inviter til" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:73 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:78 msgid "Version" msgstr "Version" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:83 msgid "Time" msgstr "Tid" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:88 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:93 msgid "Userinfo" msgstr "Brugerinfo" smuxi-1.1/po-Frontend-GNOME-IRC/hr.po0000664000175000017500000000451214011526464017747 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:22+0100\n" "PO-Revision-Date: 2012-01-08 08:23+0000\n" "Last-Translator: Matias M. \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:381 msgid "Op" msgstr "Dodijeli Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:385 msgid "Deop" msgstr "Oduzmi Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:389 msgid "Voice" msgstr "Dodijeli Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:393 msgid "Devoice" msgstr "Oduzmi Voice" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:397 msgid "Kick" msgstr "Izbaci" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:401 msgid "Kick + Ban" msgstr "Izbaci + zabrani" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:405 msgid "Ban" msgstr "Zabrani" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:409 msgid "Unban" msgstr "Skini zabranu" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:415 msgid "Query" msgstr "Upit" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:419 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:64 msgid "Whois" msgstr "Whois naredba" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:423 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:68 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:432 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:75 msgid "Invite to" msgstr "Pozovi u" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "Inačica" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "Vrijeme" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "Finger naredba" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "Userinfo naredba" smuxi-1.1/po-Engine-XMPP/0000775000175000017500000000000014011526503015720 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-XMPP/LINGUAS0000664000175000017500000000011014011526464016743 0ustar00meebeymeebey00000000000000cs da de el es fa fi fr hu id lt nl pl pt ro sl sr pt_BR sv te tr zh_CN smuxi-1.1/po-Engine-XMPP/cs.po0000664000175000017500000002711014011526464016674 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013-2015 # Marek Černocký , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-12 16:03+0000\n" "PO-Revision-Date: 2016-03-17 08:27+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.7\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Server byl vypnut" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Připojil se jiný klient se stejným zdrojem, vaše připojení bylo ukončeno" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Ověření selhalo, buď neexistuje uživatelské jméno anebo je špatně heslo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Jestli chcete vytvořit uživatelský účet s tímto jménem a heslem, zadejte /" "register" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Tato výkonná část má vestavěnou podporu pro Facebook. Měli byste ji použít " "místo připojení k Facebooku přes XMPP." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "nepřipojen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Nelze najít kontakt {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Kontakt {0} má {1} známých zdrojů" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} není známý zdroj" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID kontaktu: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "S tímto kontaktem jste navzájem odběratelé" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Nejste odběratelem od tohoto kontaktu a tento kontakt není odběratelem od vás" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Jste odběratelem od tohoto kontaktu, ale tento kontakt není odběratelem od " "vás" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Nejste odběratelem od tohoto kontaktu, ale tento kontakt je odběratelem od " "vás" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Neplatný příkaz pro kontakt: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "Příkazy {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Pokročilé příkazy {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Neplatný port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Priorita pro „přítomen“ je: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Priorita pro „nepřítomen“ je: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Neplatná priorita: {0} (platné priority jsou v rozmezí -128 až 127 včetně)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} je přítomen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} je pryč" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} je pryč delší dobu" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} nechce být vyrušen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} by rád pokecal" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} je odpojen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Uživatel {0} vám automaticky dovolil být odběratelem, protože jste o to již " "žádali" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} si přeje stát se vaším odběratelem" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} vám dovolil být jeho odběratelem" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Uživatel {0} automaticky přestal být vaším odběratelem, protože vy jste " "přestali být jeho" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} vás odmítl/odstranil jako odběratele" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} přestal být vaším odběratelem" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "obdržena neplatná chybová zpráva: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Server uživatele {0}{1} nebyl nalezen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} už používá vámi požadovaný zdroj" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" "Zatím není k dispozici žádná užitečnou chybovou zprávu pro {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Nemáte oprávnění k přístupu pro {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} dnů" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} hodin" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minut" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} vteřin" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "od {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Nastala neznámá chyba skupinového pokecu: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Server skupinového pokecu „{0}“ nebyl nalezen." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Služba víceuživatelských pokecu není na „{0}“ k dispozici" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Nemáte oprávnění připojit se k „{0}“" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Nastala neošetřená chyba skupinového pokecu: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Od {0} byla obdržena aktualizace o přítomnosti, ale náležící oknu " "s pokecem, které neexistuje" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Od {0} byla obdržena zpráva ze skupinového pokecu, ale náležící oknu s " "pokecem, které neexistuje: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "{0} vás zve do místnosti {2} protože {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "{0} vás zve do místnosti {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Přijmout pozvánku (vstoupit do místnosti)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Opětovně se připojuje k serveru {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Opětovné připojení k serveru {0} za {1} s" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Chyba: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Ověřen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Používá se proxy: {0}:{1}" smuxi-1.1/po-Engine-XMPP/zh_CN.po0000664000175000017500000002531214011526464017272 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dian Li , 2013-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:40+0200\n" "PO-Revision-Date: 2017-09-23 19:25+0000\n" "Last-Translator: Dian Li \n" "Language-Team: Chinese (China) (http://www.transifex.com/meebey/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "服务器已关闭" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "相同资源被其他客户端登录占用,您已被断开连接" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "身份认证失败,用户名不存在或密码无效" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type " "/register now" msgstr "如果您希望以指定的用户名与密码创建账号,请输入 /register" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "该引擎有原生的 Facebook 支持,您应使用该引擎,而非通过 XMPP 连接到 Facebook" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "未连接" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "未找到联系人 {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "联系人 {0} 有 {1} 个已知资源" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} 不是已知资源" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "联系人的 JID: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "您与该联系人存在双向订阅关系" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "您未订阅该联系人,该联系人也未订阅您" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "您已订阅该联系人,但该联系人未订阅您" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "您未订阅该联系人,但该联系人已订阅您" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "无效的联系人命令: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} 命令" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "高级 {0} 命令" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "无效端口: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "有空优先级为: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "离开优先级为: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "无效的优先级: {0} (有效的优先级介于 -128 与 127 之间,包含边界值)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} 有空" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} 离开" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} 长时间离开" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} 忙碌" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} 想要聊天" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} 离线" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "由于您已请求订阅,已自动允许 {0} 订阅您" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} 希望订阅您" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} 允许您订阅" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "由于您不再订阅 {0},已自动移除他对您在线状态的订阅" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} 拒绝/移除了您的订阅" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} 已取消订阅您" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "收到畸形错误消息: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "找不到 {0}{1} 的服务器" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} 已在使用您请求的资源" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "{0}, {1}, {2}{3} 当前没有有用的错误消息" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "您无权访问 {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} 天" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} 小时" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} 分钟" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} 秒" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " 从 {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "发生未知群聊错误: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "未找到群聊“{0}”的服务器。" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "MUC 服务对于“{0}”不可用" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "您没有权限加入“{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "发生未处理的群聊错误: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat " "window" msgstr "收到来自“{0}”的更新,但没有相应的聊天窗口" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "收到来自“{0}”的群聊消息,但没有相应的聊天窗口: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "您被 {0} 邀请加入 {2},因为 {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "您被 {0} 邀请加入 {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "接受邀请 (加入房间)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "正在重新连接到 {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "将在 {1} 秒后重新连接到 {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "错误: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "已通过身份认证" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "使用代理: {0}:{1}" smuxi-1.1/po-Engine-XMPP/el.po0000664000175000017500000003304214011526464016670 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:42+0000\n" "PO-Revision-Date: 2015-07-21 07:41+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Ο διακομιστής έχει κλείσει" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Ένας άλλος πελάτης συνδέθηκε με τον ίδιο πόρο, έχετε αποσυνδεθεί" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Αποτυχία της πιστοποίησης, είτε το όνομα χρήστη δεν υπάρχει ή ο κωδικός " "πρόσβασης είναι άκυρος" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Αν θέλετε να δημιουργήσετε έναν λογαριασμό με τον συγκεκριμένο χρήστη και " "κωδικό πρόσβασης, πληκτρολογήστε /register τώρα" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Αυτό το μηχάνημα έχει εγγενή υποστήριξη του Facebook, θα πρέπει να τη " "χρησιμοποιείτε αντί να συνδέεστε στο Facebook με XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "δεν συνδέθηκε" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Αδύνατη η εύρεση της επαφής {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Η επαφή {0} έχει {1} γνωστούς πόρους" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "Το {0} δεν είναι γνωστός πόρος" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID της επαφής: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Έχετε αμοιβαία συνδρομή με αυτήν την επαφή." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Δεν έχετε συνδρομή με αυτήν την επαφή και αυτή η επαφή δεν σας έχει ως " "συνδρομή." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Έχετε συνδρομή με αυτήν την επαφή, αλλά η επαφή δεν σας έχει ως συνδρομή." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Δεν έχετε συνδρομή με αυτήν την επαφή, αλλά η επαφή σας έχει ως συνδρομή." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Άκυρη εντολή επαφής: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} Εντολές" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Προχωρημένες {0} εντολές" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Άκυρη θύρα: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Η προτεραιότητα για διαθεσιμότητα είναι: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Η προτεραιότητα για απουσία είναι: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Άκυρη προτεραιότητα: {0} (οι έγκυρες προτεραιότητες είναι μεταξύ -128 και " "127 συμπεριλαμβανόμενων)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "Ο {0}{1} είναι διαθέσιμος" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "Ο {0}{1} είναι απών" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "Ο {0}{1} είναι παρατεταμένα απών" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "Ο {0}{1} δεν επιθυμεί να διακοπεί" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "Ο {0}{1} θέλει να συνομιλήσει" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "Ο {0}{1} είναι αποσυνδεδεμένος " #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Αυτόματα επιτρεπόμενο {0} να σας κάνει συνδρομή, αφού το έχετε ήδη ζητήσει." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "Ο {0}{1} επιθυμεί να σας κάνει συνδρομή" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "Ο {0}{1} σας επέτρεψε να εγγραφείτε" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Αυτόματη αφαίρεση της συνδρομής του {0} ως προς την παρουσία σας μετά την " "απώλεια της συνδρομής ως τη δικιά τους" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "Ο {0}{1} αρνήθηκε/αφαίρεσε τη συνδρομή σας" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "Ο {0}{1} αφαίρεσε τη συνδρομή από εσάς" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "έγινε δεκτό ένα κακοσχηματισμένο μήνυμα σφάλματος:{0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Ο διακομιστής του {0}{1} δεν μπόρεσε να βρεθεί" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "Ο {0}{1} χρησιμοποιεί ήδη τον ζητούμενο πόρο" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" "Δεν υπάρχει προς το παρόν κανένα χρήσιμο μήνυμα σφάλματος για {0}, {1}, " "{2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Δεν έχετε δικαίωμα πρόσβασης στο {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} ημέρες" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} ώρες" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} λεπτά" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} δευτερόλεπτα" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " από {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Παρουσιάστηκε ένα άγνωστο σφάλμα ομαδικής συνομιλίας: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Ο διακομιστής της ομαδικής συνομιλίας \"{0}\" δεν βρέθηκε." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Η υπηρεσία MUC δεν είναι διαθέσιμη για το \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Δεν έχετε άδεια να συνδεθείτε με τον \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Παρουσιάστηκε ένα ανεπίλυτο σφάλμα ομαδικής συνομιλίας: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Ελήφθη ενημέρωση διαθεσιμότητας από τον {0}, αλλά δεν υπάρχει αντίστοιχο " "παράθυρο συνομιλίας" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Ελήφθη μήνυμα ομαδικής συνομιλίας τον {0}, αλλά δεν υπάρχει αντίστοιχο " "παράθυρο συνομιλίας: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Έχετε προσκληθεί στο {2} από τον {0} λόγω του {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Έχετε προσκληθεί στο {1} από τον {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Αποδοχή πρόσκλησης (συμμετοχή στην αίθουσα)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Επανασύνδεση στο {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Επανασύνδεση στο {0} σε {1} δευτερόλεπτα" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Σφάλμα: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Πιστοποιήθηκε" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Χρήση διαμεσολαβητή: {0}:{1}" smuxi-1.1/po-Engine-XMPP/ro.po0000664000175000017500000002621014011526464016707 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:20+0000\n" "PO-Revision-Date: 2018-04-08 17:16+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Serverul s-a oprit" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Un alt client s-a autentificat cu aceeași resursă, ați fost deconectat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Autentificarea a eșuat, fie numele de utilizator nu există fie parola nu " "este validă" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Dacă doriți să creați un cont cu numele de utilizator și parola specificate, " "tastați /register now" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:320 msgid "not connected" msgstr "neconectat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:811 #, csharp-format msgid "Could not find contact {0}" msgstr "Nu s-a putut găsi contactul {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:817 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Contactul {0} are {1} resurse cunoscute" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:821 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} nu este o resursă cunoscută" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID de contact: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:833 msgid "You have a mutual subscription with this contact" msgstr "Aveți o abonare în comun cu acest contact" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:836 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "Nu aveți nicio abonare cu acest contact și acesta nu vă este abonat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:839 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Sunteți abonat la acest contact, dar contactul nu vă este abonat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:842 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Nu sunteți abonat la acest contact, dar contactul vă este abonat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:938 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Comandă de contact nevalidă: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:949 #, csharp-format msgid "{0} Commands" msgstr "Comenzi {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:974 #, csharp-format msgid "Advanced {0} Commands" msgstr "Comenzi avansate {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1009 #, csharp-format msgid "Invalid port: {0}" msgstr "Port nevalid: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1044 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioritatea pentru disponibil este: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1047 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioritatea pentru absent este: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Prioritate nevalidă: {0} (prioritățile valide sunt între -128 și 127 " "inclusiv)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1636 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} este disponibil" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1640 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} este absent" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1644 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} este absent extins" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1648 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} nu dorește să fie deranjat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1652 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} vrea să discute" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1659 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} este deconectat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1665 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "S-a permis automat ca {0} să vi se aboneze, din moment ce deja solicitați " "abonarea" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1669 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} dorește să vi se aboneze" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1677 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} v-a permis să vă abonați" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1684 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "S-a eliminat automat abonarea lui {0} de la prezențe după pierderea abonării " "la prezențele acestuia" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1691 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} a respins / eliminat abonarea" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1696 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} s-a dezabonat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1700 #, csharp-format msgid "received a malformed error message: {0}" msgstr "s-a primit un mesaj de eroare eronat: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Nu s-a putut găsi serverul de {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1710 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} utilizează deja resursa cerută" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1717 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1739 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1753 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" "Nu există în prezent niciun mesaj de eroare util pentru {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1730 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Nu aveți permisiunea să accesați {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1780 #, csharp-format msgid "{0} days" msgstr "{0} zile" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1786 #, csharp-format msgid "{0} hours" msgstr "{0} ore" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} minutes" msgstr "{0} minute" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1793 #, csharp-format msgid "{0} seconds" msgstr "{0} secunde" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1805 #, csharp-format msgid " since {0} ({1})" msgstr " de la {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1890 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "A apărut o eroare de discuție de grup: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Nu s-a găsit serverul pentru discuția de grup „{0}”." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1900 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Serviciul MUC nu este disponibil pentru „{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1907 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Nu aveți permisiunea de alăturare la „{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1913 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "A apărut o eroare de discuție de grup nemanevrată: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2090 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Ați primit o actualizare de prezență de la {0}, dar nu există o fereastră de " "discuție corespunzătoare" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2114 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Ați primit un mesaj de discuție de grup de la {0} dar nu există o fereastră " "de discuție corespunzătoare: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2391 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Ați fost invitat la {2} de către {0} pentru că {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Ați fost invitat la {1} de către {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2418 msgid "Accept invite (join room)" msgstr "Acceptă invitația (alăturare la cameră)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2556 #, csharp-format msgid "Reconnecting to {0}" msgstr "Se reconectează la {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2570 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Se reconectează la {0} în {1} secunde" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2600 #, csharp-format msgid "Error: {0}" msgstr "Eroare: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2612 msgid "Authenticated" msgstr "Autentificat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2663 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Se utilizează proxy: {0}:{1}" smuxi-1.1/po-Engine-XMPP/fi.po0000664000175000017500000002253214011526464016670 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2015-05-17 09:50+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The Server has shut down" msgstr "Palvelin on sammunut" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Toinen asiakasohjelma on kirjautunut samalla tunnisteella, yhteytesi on katkaistu" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "Tunnistautuminen epäonnistui, käyttäjänimeä ei ole tai salasana on väärin" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "if you want to create an account with the specified user and password, type " "/register now" msgstr "Jos haluat luoda tilin annetuilla käyttäjänimellä ja salasanalla kirjoita /register now" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to facebook with xmpp" msgstr "Tässä moottorissa on natiivi Facebook-tuki, jota tulisi käyttää XMPP-toiminnon sijaan" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "Ei yhdistetty" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Yhteystietoa {0} ei löytynyt" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Yhteystiedolla {0} on {1} tunnettua resurssia" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} ei ole tunnettu resurssi" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's Jid: {0}" msgstr "Yhteystiedon JID: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subcribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subcribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid Contact command: {0}" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid Priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "Muc service is not available for \"{0}\"" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat " "window" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" smuxi-1.1/po-Engine-XMPP/de.po0000664000175000017500000002743214011526464016666 0ustar00meebeymeebey00000000000000# German translation for smuxi-Engine-XMPP. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2013. # JB, 2015 # Mirco Bauer , 2013, 2015. # Wasilis Mandratzis-Walz, 2015. # Mario Blättermann , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-09-01 10:49+0000\n" "PO-Revision-Date: 2016-01-07 21:55+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Der Server wurde heruntergefahren" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Ein anderer Client hat sich mit der gleichen Ressource angemeldet; Sie " "wurden getrennt." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Authentifizierung ist fehlgeschlagen, entweder existiert der Benutzername " "nicht oder das Passwort ist ungültig." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Wenn Sie ein Benutzerkonto mit dem angegebenen Benutzer und Passwort " "erstellen möchten, tippen Sie jetzt /register" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Diese Engine besitzt eine native Facebook-Unterstützung, die Sie verwenden " "sollten anstelle von Verbindungen zu Facebook mit XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "nicht verbunden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Kontakt {0} konnte nicht gefunden werden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Kontakt {0} hat {1} bekannte Ressourcen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} ist keine bekannte Ressource" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID des Kontakts: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Sie haben ein gegenseitiges Abonnement mit diesem Kontakt" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Sie haben kein Abonnement bei diesem Kontakt und dieser Kontakt abonniert " "Sie nicht" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Sie abonnieren diesen Kontakt, aber der Kontakt abonniert Sie nicht" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Sie abonnieren diesen Kontakt nicht, aber der Kontakt abonniert Sie." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Ungültiger Kontakt-Befehl: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} Befehle" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Erweiterte {0}-Befehle" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Ungültiger Port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Priorität für »Verfügbar« ist: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Priorität für »Abwesend« ist: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Ungültige Priorität: {0} (gültige Prioritäten liegen zwischen -128 und 127)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} ist verfügbar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} ist abwesend" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} ist länger abwesend" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} möchte nicht gestört werden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} möchte chatten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} ist offline" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Automatisch zugelassen, dass {0} Sie abonniert, da Sie bereits um Abonnement " "gebeten haben" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} möchte Sie abonnieren" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} gestattet, Sie zu abonnieren" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Automatisch {0}s Abonnement zu Ihren Anwesenheiten storniert, nachdem das " "Abonnement zu seinen verloren ging" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} lehnte ab/entfernte Ihr Abonnement" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} abonniert Sie nicht mehr" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "schlecht strukturierte Fehlernachricht erhalten: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "{0}{1}s Server konnte nicht gefunden werden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} benutzts bereits die gewünschte Ressource" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Es gibt momentan keine nützliche Fehlermeldung für {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Sie sind nicht berechtigt, auf {0}{1} zuzugreifen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} Tage" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} Stunden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} Minuten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} Sekunden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " seit {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Ein unbekannter Gruppenchat-Fehler ist aufgetreten: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Server für den Gruppenchat »{0}« konnte nicht gefunden werden." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "MUC-Dienst ist für »{0}« nicht verfügbar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Sie haben keine Berechtigung, »{0}« beizutreten." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Ein unbehandelter Gruppenchat-Fehler ist aufgetreten: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Eine Anwesenheitsaktualisierung von {0} wurde empfangen, aber es gibt kein " "zugehöriges Chat-Fenster" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Eine Gruppenchat-Nachricht von {0} wurde empfangen, aber es gibt kein " "zugehöriges Chat-Fenster: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Sie wurden wegen {1} nach {2} von {0} eingeladen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Sie wurden von {0} nach {1} eingeladen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Einladung akzeptieren (Raum betreten)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Verbinde wird erneut zu {0} aufgebaut" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Verbinde wird erneut zu {0} aufgebaut in {1} Sekunden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Fehler: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Authentifiziert" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Proxy wird verwendet: {0}:{1}" smuxi-1.1/po-Engine-XMPP/hu.po0000664000175000017500000002705014011526464016706 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 17:47+0000\n" "PO-Revision-Date: 2015-07-17 23:48+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "A kiszolgáló leállt" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Egy másik kliens bejelentkezett ugyanazzal az erőforrással, az ön kapcsolata " "bontva lett" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "A hitelesítés sikertelen, vagy a felhasználónév nem létezik, vagy érvénytelen " "a jelszó" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Ha létre szeretne hozni egy fiókot a megadott felhasználóval és jelszóval, " "akkor írja be a /register parancsot most" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Ennek a motornak natív Facebook támogatása van, ezt kellene használnia az " "XMPP-vel történő Facebook kapcsolódás helyett" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "nincs kapcsolódva" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Nem található a partner: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "A(z) {0} partnernek {1} ismert erőforrása van" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} nem ismert erőforrás" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "Partner JID-ja: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Kölcsönös feliratkozása van ezzel a partnerrel" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Nincs feliratkozása ezzel a partnerrel, és ez a partner nincs feliratkozva " "önre" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Feliratkozott erre a partnerre, de a partner nincs feliratkozva önre" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Nincs feliratkozva erre a partnerre, de a partner feliratkozott önre" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Érvénytelen partnerparancs: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} parancsok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Speciális {0} parancsok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Érvénytelen port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioritás az Elérhetőhöz: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioritás a Távolhoz: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Érvénytelen prioritás: {0} (az érvényes prioritások -128 és 127 között " "vannak, a határokat is beleértve)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} elérhető" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} távol" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} tartósan távol" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} azt szeretné, ha nem zavarnák" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} csevegni szeretne" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} nem érhető el" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Automatikusan lehetővé téve {0} számára, hogy feliratkozzon önre, mivel ön " "már kérte a feliratkozást" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} fel szeretne iratkozni önre" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} lehetővé tette önnek a feliratkozást" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Automatikusan eltávolítva {0} feliratkozása az ön jelenléteihez, miután " "elvesztette a feliratkozást az övéikhez" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} megtagadta/eltávolította az ön feliratkozását" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} leiratkozott önről" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "egy helytelenül formázott üzenet érkezett: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "{0}{1} kiszolgálója nem található" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} már használja a kért erőforrását" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Jelenleg nincs hasznos hibaüzenet ennél: {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Nincs jogosultsága hozzáférni: {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} nap" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} óra" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} perc" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} másodperc" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " {0} óta ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Ismeretlen csoportos csevegési hiba történt: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "A(z) „{0}” csoportos csevegés kiszolgálója nem található." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "A MUC-szolgáltatás nem érhető el ehhez: „{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Nincs jogosultsága csatlakozni: „{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Kezeletlen csoportos csevegési hiba történt: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Jelenlét frissítés érkezett innen: {0}, de nincs megfelelő csevegőablak" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Csoportos csevegési üzenet érkezett innen: {0}, de nincs megfelelő " "csevegőablak: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "{0} meghívta önt ide: {2}, mert {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "{0} meghívta önt ide: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Meghívás elfogadása (belépés a szobába)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Újrakapcsolódás ehhez: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Újrakapcsolódás ehhez: {0} {1} másodperc múlva" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Hiba: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Hitelesítve" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Proxy használata: {0}:{1}" smuxi-1.1/po-Engine-XMPP/fr.po0000664000175000017500000002664414011526464016711 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2013,2015-2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:40+0200\n" "PO-Revision-Date: 2017-09-23 19:25+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/meebey/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Le serveur s'est arreté" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Un autre client s'est connecté avec le même nom de resource, vous avez été déconnecté" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "Authentification échouée, mot de passe ou nom d'utilisateur incorrect" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type " "/register now" msgstr "Si vous voulez créer un compte avec le nom d'utilisateur et le mot de passe spécifié, tapez /register maintenant" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "Ce moteur a le support natif de Facebook, vous devriez l'utiliser à la place d'une connexion à Facebook via XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "non connecté" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Impossible de trouver le contact {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Le contact {0} a {1} ressource(s) connue(s)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} n'est pas une ressource connue" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID du contact: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Vous avez un abonnement mutuel avec ce contact" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "Vous n'avez pas d'abonnement avec ce contact ou ce contact n'est pas abonné à vous" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Vous êtes abonné à ce contact, mais celui-ci ne s'est pas abonné à vous" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Vous n'êtes pas abonné à ce contact, mais lui est abonné à vous" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Commande contact invalide : {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "Commandes {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Commandes avancées {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Port invalide : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "La priorité pour Disponible est : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "La priorité pour Parti est : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "Priorité {0} invalide (les priorités valides sont comprises entre -128 et 127 inclus)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} est disponible" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} est parti" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} est parti depuis longtemps" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} ne veut pas être dérangé" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} veut discutter" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} est hors ligne" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "{0} a été automatiquement autorisé à s'abonner à vous car vous aviez une demande d'abonnement vers lui en attente" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} souhaite s'abonner à vous" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} vous a autorisé à vous abonner" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "L'abonnement de {0} pour votre présence a été automatiquement supprimé après la perte de l'abonnement vers le sien" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} a refusé/supprimé votre abonnement" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} s'est desabonné de vous" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "message d'erreur mal formé reçu : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "le serveur de {0}{1} n'a pû être trouvé" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} utilise deja le nom de ressource demandé" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Il n'y a pour l'instant aucun message d'erreur utile pour {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Vous n'avez pas la permission d'acceder à {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} jours" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} heures" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minutes" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} secondes" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "depuis {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Une erreur de chat de groupe s'est produite : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Chat de groupe \"{0}\" non trouvé sur le serveur." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Le service MUC n'est pas disponible pour \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Vous n'avez pas la permission de rejoindre \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Une erreur de chat de groupe non gérée s'est produite : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat " "window" msgstr "Une indication de présence a été reçue depuis {0} mais il n'y aucune fenêtre de chat correspondante" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "Message de groupe reçu depuis {0} mais aucune fenêtre de chat correspondante trouvée : {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Vous avez été invité sur {2} par {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Vous avez été invité sur {1} par {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Accepter l'invitation (rejoindre le canal)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Reconnexion à {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Reconnexion à {0} dans {1} seconde(s)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Erreur : {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Authentifié" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilisation du proxy : {0}:{1}" smuxi-1.1/po-Engine-XMPP/sr.po0000664000175000017500000003201014011526464016706 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:42+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Сервер се угасио" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Још један клијент се пријавио са истим извориштем, веза вам је прекинута" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Потврђивање идентитета није успело, или корисничко име не постоји или је " "лозинка неисправна" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Ако желите да направите налог са наведеним корисником и лозинком, упишите „/" "register now“" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Овај погон има изворну подршку Фејсбука, требало би да га користите уместо " "да се повезујете на Фејсбук помоћу ИксМПП-а" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "нисте повезани" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Не могу да нађем контакт {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Контакт {0} има {1} позната изворишта" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} није познато извориште" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "ЈИБ контакта: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Постоји обострано пријатељство са овим контактом" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Нисте пријатељ са овим контактом а и овај контакт није пријатељ са вама" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Пријатељ сте са овим контактом, али овај контакт није пријатељ са вама" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Нисте пријатељ са овим контактом, али овај контакт је пријатељ са вама" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Неисправна наредба контакта: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} наредбе" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Напредне {0} наредбе" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Неисправан прикључник: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Приоритет за доступност је: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Приоритет за отсутност је: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Неисправан приоритет: {0} (исправни приоритети су између -128 и 127 закључно)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} је доступан" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} је одсутан" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} је проширено одсутан" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} не жели да буде узнемираван" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} жели да ћаска" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} је ван мреже" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Самостално је дозвољено да вам {0} постане пријатељ, јер сте ви већ " "затражили пријатељство" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} жели да се упише код вас" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} вам је дозволио да се упишете" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Самостално је уклоњено пријатељство {0} са вашим присуством након што сте " "изгубили пријатељство са њима" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} је одбио/уклонио ваш упис" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} се исписао од вас" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "примих лошу поруку грешке: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Не могу да нађем {0}{1}-ов сервер" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} већ користи ваше затражено извориште" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Тренутно нема корисне поруке грешке за {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Нисте овлашћени да приступите {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} дана" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} сата" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} минута" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} секунде" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " још од {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Дошло је до непознате грешке групног ћаскања: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Сервер групног ћаскања „{0}“ није пронађен." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "МУК услуга није доступна за „{0}“" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Нисте овлашћени да се придружите „{0}“" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Дошло је до непознате грешке групног ћаскања: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Примих ажурирање присуства за {0}, али нема одговарајућег прозора ћаскања" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Примих поруку групног ћаскања са {0} али нема одговарајућег прозора ћаскања: " "{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "{0} вас је позвао на {2} због {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "{0} вас је позвао на {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Прихвати позив (приступи соби)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Поново се повезујем са {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Поново ћу се повезати са {0} за {1} секунде" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Грешка: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Пријављени сте" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Користим посредника: {0}:{1}" smuxi-1.1/po-Engine-XMPP/sl.po0000664000175000017500000002207314011526464016710 0ustar00meebeymeebey00000000000000# 'smuxi/po-Engine-XMMP/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:40+0000\n" "PO-Revision-Date: 2016-03-11 22:57+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Overjeno" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" smuxi-1.1/po-Engine-XMPP/pl.po0000664000175000017500000002677514011526464016722 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2015-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-09-10 06:04+0200\n" "PO-Revision-Date: 2016-09-10 06:05+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Serwer został wyłączony" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Inny klient zalogował się za pomocą tego samego zasobu, rozłączono" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Uwierzytelnienie się nie powiodło, nazwa użytkownika nie istnieje lub " "nieprawidłowe hasło" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Aby utworzyć konto o podanej nazwie użytkownika i haśle, należy wpisać /" "register" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Ten mechanizm ma natywną obsługę serwisu Facebook, należy jej używać zamiast " "łączenia przez protokół XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "niepołączony" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Nie można odnaleźć kontaktu {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Znane zasoby kontaktu {0}: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} nie jest znanym zasobem" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID kontaktu: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Subskrypcja z tym kontaktem działa w obie strony" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "Ten kontakt nie jest subskrybowany ani nie subskrybuje użytkownika" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Ten kontakt jest subskrybowany, ale on nie subskrybuje użytkownika" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Ten kontakt nie jest subskrybowany, ale on subskrybuje użytkownika" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Nieprawidłowe polecenie kontaktu: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "Polecenia {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Zaawansowane polecenia {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Nieprawidłowy port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Priorytet dla stanu „Dostępny”: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Priorytet dla stanu „Nieobecny”: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Nieprawidłowy priorytet: {0} (prawidłowe priorytety mogą być między -128 " "a 127)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "Użytkownik {0}{1} jest dostępny" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "Użytkownik {0}{1} jest nieobecny" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "Użytkownik {0}{1} wróci później" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "Użytkownik {0}{1} prosi, aby mu nie przeszkadzać" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "Użytkownik {0}{1} chce rozmawiać" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "Użytkownik {0}{1} jest w trybie offline" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Automatycznie zezwolono użytkownikowi {0} na subskrypcję, ponieważ już " "wysłano mu prośbę o subskrypcję" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "Użytkownik {0}{1} prosi o subskrypcję" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "Użytkownik {0}{1} pozwolił na subskrypcję" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Automatycznie usunięto subskrypcję użytkownika {0} po utracie jego " "subskrypcji" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "Użytkownik {0}{1} zabronił/usunął subskrypcję" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "Użytkownik {0}{1} zrezygnował z subskrypcji" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "otrzymano nieprawidłowo sformatowaną wiadomość: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Nie można odnaleźć serwera użytkownika {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "Użytkownik {0}{1} już używa zażądanego zasobu" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Obecnie nie ma przydatnego komunikatu o błędzie dla {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Brak uprawnień do dostępu do {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "Dni: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "Godziny: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "Minuty: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "Sekundy: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " od {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Wystąpił nieznany błąd rozmowy grupowej: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Nie odnaleziono serwera rozmowy grupowej „{0}”." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Niedostępna usługa MUC dla „{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Brak uprawnień do dołączenia do „{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Wystąpił nieobsłużony błąd rozmowy grupowej: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Otrzymano aktualizację obecności od użytkownika {0}, ale nie ma " "odpowiedniego okna rozmowy" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Otrzymano wiadomość rozmowy grupowej od użytkownika {0}, ale nie ma " "odpowiedniego okna rozmowy: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Zaproszono do {2} przez {0} z powodu {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Zaproszono do {1} przez {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Przyjmij zaproszenie (dołącz do pokoju)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Ponowne łączenie z {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Ponowne łączenie z {0} za {1} s" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Błąd: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Uwierzytelniono" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Używanie pośrednika: {0}:{1}" smuxi-1.1/po-Engine-XMPP/id.po0000664000175000017500000002635314011526464016673 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Kukuh Syafaat , 2017, 2019. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:19+0000\n" "PO-Revision-Date: 2019-05-22 13:11+0700\n" "Last-Translator: Kukuh Syafaat \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Peladen telah dimatikan" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Klien lain masuk dengan sumber yang sama, Anda telah terputus" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "Autentikasi gagal, nama pengguna tidak ada atau kata sandi salah" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Jika Anda ingin membuat akun dengan pengguna dan kata sandi yang ditentukan, " "ketik /register sekarang" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:320 msgid "not connected" msgstr "tidak terhubung" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:811 #, csharp-format msgid "Could not find contact {0}" msgstr "Tidak dapat menemukan kontak {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:817 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Kontak {0} memiliki {1} sumber yang diketahui" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:821 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} bukan sumber yang diketahui" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID Kontak: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:833 msgid "You have a mutual subscription with this contact" msgstr "Anda memiliki langganan bersama dengan kontak ini" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:836 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Anda tidak memiliki langganan dengan kontak ini dan kontak ini tidak " "berlangganan ke Anda" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:839 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Anda berlangganan kontak ini, namun kontak ini tidak berlangganan ke Anda" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:842 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Anda tidak berlangganan kontak ini, namun kontak ini berlangganan ke Anda" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:938 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Perintah kontak tidak valid: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:949 #, csharp-format msgid "{0} Commands" msgstr "Perintah {0} " #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:974 #, csharp-format msgid "Advanced {0} Commands" msgstr "Perintah Lanjutan {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1009 #, csharp-format msgid "Invalid port: {0}" msgstr "Port tidak valid: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1044 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioritas untuk Tersedia adalah: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1047 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioritas untuk Pergi adalah: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Prioritas tidak valid: {0} (prioritas yang valid adalah antara -128 dan 127 " "inklusif)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1636 #, csharp-format msgid "{0}{1} is available" msgstr "{0} {1} tersedia" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1640 #, csharp-format msgid "{0}{1} is away" msgstr "{0} {1} sedang pergi" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1644 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0} {1} sedang pergi lama" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1648 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0} {1} tidak ingin diganggu" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1652 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0} {1} ingin mengobrol" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1659 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} sedang luring" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1665 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Izinkan secara otomatis {0} untuk berlangganan ke Anda, karena Anda sudah " "meminta untuk berlangganan" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1669 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0} {1} ingin berlangganan ke Anda" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1677 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0} {1} memungkinkan Anda untuk berlangganan" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1684 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Secara otomatis menghapus langganan {0} ke posisi Anda setelah kehilangan " "langganan mereka" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1691 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0} {1} menolak/menghapus langganan Anda" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1696 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0} {1} berhenti berlangganan dari Anda" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1700 #, csharp-format msgid "received a malformed error message: {0}" msgstr "Menerima pesan kesalahan yang salah: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Peladen {0} {1} tidak dapat ditemukan" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1710 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0} {1} sudah menggunakan sumber yang Anda minta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1717 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1739 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1753 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Saat ini tidak ada pesan kesalahan yang berguna untuk {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1730 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Anda tidak memiliki izin untuk mengakses {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1780 #, csharp-format msgid "{0} days" msgstr "{0} hari" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1786 #, csharp-format msgid "{0} hours" msgstr "{0} jam" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} minutes" msgstr "{0} menit" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1793 #, csharp-format msgid "{0} seconds" msgstr "{0} detik" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1805 #, csharp-format msgid " since {0} ({1})" msgstr " sejak {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1890 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Kesalahan obrolan grup tidak dikenal terjadi: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Peladen obrolan grup \"{0}\" tidak ditemukan." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1900 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Layanan MUC tidak tersedia untuk \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1907 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Anda tidak memiliki izin untuk bergabung \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1913 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Terjadi kesalahan obrolan grup yang tidak ditangani: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2090 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Menerima pembaruan kehadiran dari {0}, namun tidak ada jendela obrolan yang " "sesuai" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2114 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Menerima pesan obrolan grup dari {0} tapi tidak ada jendela obrolan yang " "sesuai: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2391 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Anda telah diundang ke {2} oleh {0} karena {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Anda telah diundang ke {1} oleh {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2418 msgid "Accept invite (join room)" msgstr "Terima undangan (gabung kanal)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2556 #, csharp-format msgid "Reconnecting to {0}" msgstr "Menyambung kembali ke {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2570 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Menyambung kembali ke {0} dalam {1} detik" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2600 #, csharp-format msgid "Error: {0}" msgstr "Kesalahan: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2612 msgid "Authenticated" msgstr "Terautentikasi" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2663 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Menggunakan proksi: {0}:{1}" #~ msgid "" #~ "This engine has native Facebook support, you should be using it instead " #~ "of connecting to Facebook with XMPP" #~ msgstr "" #~ "Mesin ini memiliki dukungan Facebook asli, Anda harus menggunakannya alih-" #~ "alih terhubung ke Facebook dengan XMPP" smuxi-1.1/po-Engine-XMPP/es.po0000664000175000017500000002675314011526464016712 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013-2014 # Daniel Mustieles , 2015. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-14 10:54+0000\n" "PO-Revision-Date: 2015-07-14 \n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Se ha apagado el servidor" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Otro cliente inició sesión con su mismo recurso, se finalizó esta conexión" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Falló la autenticación, el usuario no existe o la contraseña no es válida" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Si quiere crear una cuenta con el usuario y contraseña especificados, " "escriba /register ahora" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Este motor es compatible con Facebook de forma nativa, debería utilizarlo en " "lugar de conectarse con Facebook utilizando XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "no conectado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "No se pudo encontrar el contact {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "El contacto {0} tiene {1} recursos conocidos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} no es un recurso conocido" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID del contacto: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Posee una suscripción mutua con este contacto" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "No tiene una suscripción con este contacto y este contacto no está suscrito " "a su cuenta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Está suscrito a este contacto, pero el contacto no está suscrito a su cuenta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "No está suscrito a este contacto pero el contacto está suscrito a su cuenta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Comando de contacto no válido: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "Órdenes {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Órdenes {0} avanzadas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Puerto no válido: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "La prioridad para «Disponible» es: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "La prioridad para «Ausente» es: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Prioridad no válida: {0} (las prioridades válidas son entre -128 y 127 " "inclusive)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} está disponible" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} está ausente" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} está ausente de forma prolongada" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} no desea ser molestado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} desea conversar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} no está conectado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Se permitió automáticamente la suscripción de {0} a su cuenta debido a que " "había solicitado una suscripción" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} desea suscribirse a su cuenta" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} le permitió suscribirse" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Se eliminó automáticamente la suscripción de {0} a su cuenta luego de perder " "su suscripción mutua" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} negó/eliminó su suscripción" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} se desuscribió de su cuenta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "se recibió un mensaje de error no válido: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "no se encontró el servidor de {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} ya está utilizado el recurso solicitado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Actualmente no hay un mensaje de error útil para {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "No tiene permisos para acceder a {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} días" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} horas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minutos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} segundos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "desde {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Ocurrió un error desconocido en el chat grupal: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Servidor de chart de grupo «{0}» no encontrado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "El servicio MUC no está disponible para «{0}»" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "No tiene permisos para unirse a «{0}»" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Ocurrió un error sin control en el chat grupal: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Recibida una actualización de presencia de {0}, pero no hay correspondencia " "en la ventana del chat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Recibido un mensaje de chat de grupo de {0}, pero no hay correspondencia en " "la ventana del chat: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Ha sido invitado a {2} por {0} debido a {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Ha sido invitado a {1} por {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Aceptar invitación (entrar al canal)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Reconectado a {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Reconectando a {0} en {1} segundos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Error: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Autenticado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilizando proxy: {0}:{1}" smuxi-1.1/po-Engine-XMPP/Makefile.in.in0000664000175000017500000001577214011526464020414 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_ENGINE_XMPP@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine-XMPP/pt.po0000664000175000017500000002674114011526464016723 0ustar00meebeymeebey00000000000000# Portuguese translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Tiago Santos , 2014 - 2016.. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-04-28 15:01+0000\n" "PO-Revision-Date: 2016-07-05 19:52+0100\n" "Last-Translator: Tiago Santos \n" "Language-Team: Portuguese\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.4\n" "X-Project-Style: gnome\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "O servidor foi desligado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Outro cliente está autenticado no mesmo recurso. Foi desligado." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Autenticação falhou. Ou o nome de utilizador não existe ou a senha não é " "válida." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Se quiser criar uma conta com o utilizador e senha especificados, digite /" "register agora" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Este motor tem suporte nativo para Facebook. Deve utilizá-lo em vez de ligar " "ao Facebook com XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "não ligado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Impossível encontrar o contacto {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Contacto {0} tem {1} recursos conhecidos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} não é um recurso conhecido" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID do contacto: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Tem um subscrição mútua com este contacto" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Não tem uma subscrição com este contacto e este contacto não está subscrito " "consigo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Está subscrito a este contacto mas este contacto não está subscrito consigo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Não está subscrito a este contacto mas o contacto está subscrito consigo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Comando de contacto inválido: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} comandos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "{0} comandos avançados" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Porta inválida: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioridade para Disponível é: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioridade para Ausente é: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Prioridade inválida: {0} (prioridades válidas estão entre -128 e 127 " "inclusive)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} está disponível" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} está ausente" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} está ausente por muito tempo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} não quer ser perturbado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} quer conversar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} está offline" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Permitir automaticamente que {0} se subscreva a si, dado que já está a pedir " "para subscrever" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} quer subscrever-se a si" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} permitiu-lhe subscrever" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Remover automaticamente a subscrição de {0} das suas presenças depois de " "perder a sua subscrição às deles" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} negou/removeu a sua subscrição" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} deixou de subscrever a si" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "recebeu uma mensagem de erro mal formada: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "servidor de {0}{1} não pôde ser encontrado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} já está a utilizar o recurso pedido" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" "De momento não existe nenhuma mensagem de erro útil para {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Não tem permissão para aceder a {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} dias" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} horas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minutos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} segundos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "desde {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Ocorreu um erro desconhecido de conversa de grupo: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Servidor da conversa de grupo \"{0}\" não encontrado." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "Serviço MUC não está disponível para \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Não tem permissão para se juntar a \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Ocorreu um erro não gerido de conversa de grupo: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Recebeu uma atualização de presença de {0} mas não existe uma janela de " "conversação correspondente" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Recebeu uma mensagem de conversa de grupo de {0} mas não existe uma janela " "de conversação correspondente: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Foi convidado para {2} por {0} porque {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Foi convidado para {1} por {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Aceitar convite (juntar-se à sala)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "A religar a {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "A religar a {0} em {1} segundos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Erro: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Autenticado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "A usar o proxy: {0}:{1}" smuxi-1.1/po-Engine-XMPP/nl.po0000664000175000017500000002643414011526464016710 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:19+0000\n" "PO-Revision-Date: 2019-03-10 15:37+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "De server is uitgeschakeld" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Een andere cliënt heeft zich aangemeld met dezelfde bron, uw verbinding is " "verbroken" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Authenticatie mislukt. Gebruikersnaam bestaat niet of wachtwoord is ongeldig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Als u een account wilt aanmaken met de opgegeven gebruikersnaam en " "wachtwoord, typ dan nu ‘/register’" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:320 msgid "not connected" msgstr "niet verbonden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:811 #, csharp-format msgid "Could not find contact {0}" msgstr "Kon contact ‘{0}’ niet vinden." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:817 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Contact {0} heeft {1} bekende bronnen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:821 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} is een onbekende bron" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID van contact: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:833 msgid "You have a mutual subscription with this contact" msgstr "U heeft een wederzijds abonnement op dit contact" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:836 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "U heeft geen abonnement op dit contact en dit contact is niet op u " "geabonneerd" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:839 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "U heeft een abonnement op dit contact, maar het contact is niet op u " "geabonneerd" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:842 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "U heeft geen abonnement op dit contact, maar het contact is wel op u " "geabonneerd" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:938 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Ongeldige contactopdracht: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:949 #, csharp-format msgid "{0} Commands" msgstr "{0}-opdrachten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:974 #, csharp-format msgid "Advanced {0} Commands" msgstr "Geavanceerde {0}-opdrachten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1009 #, csharp-format msgid "Invalid port: {0}" msgstr "Ongeldige poort: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1044 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioriteit voor Beschikbaar is: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1047 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioriteit voor Afwezig is: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Ongeldige prioriteit: {0} (geldige prioriteiten zijn tussen -128 en 127 " "inclusief)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1636 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} is beschikbaar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1640 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} is afwezig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1644 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} is voor langere tijd afwezig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1648 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} wenst niet gestoord te worden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1652 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} wil praten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1659 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} is offline" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1665 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "{0} is automatisch toegestaan om op u te abonneren omdat u al een " "abonnementsverzoek had ingediend" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1669 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} wil zich op u abonneren" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1677 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} heeft u toegestaan om te abonneren" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1684 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Abonnement van {0} op uw aanwezigheid automatisch verwijderd na verlies van " "abonnement op die van hun" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1691 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} heeft uw abonnement geweigerd/verwijderd" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1696 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} is niet meer op u geabonneerd" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1700 #, csharp-format msgid "received a malformed error message: {0}" msgstr "ontving een misvormde foutmelding: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Server van {0}{1} kon niet gevonden worden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1710 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} gebruikt reeds uw verzochte bron" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1717 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1739 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1753 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Er is momenteel geen bruikbare foutmelding voor {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1730 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "U heeft geen toestemming voor het benaderen van {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1780 #, csharp-format msgid "{0} days" msgstr "{0} dagen" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1786 #, csharp-format msgid "{0} hours" msgstr "{0} uur" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} minutes" msgstr "{0} minuten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1793 #, csharp-format msgid "{0} seconds" msgstr "{0} seconden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1805 #, csharp-format msgid " since {0} ({1})" msgstr " sinds {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1890 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Er is een onbekende groepsgespreksfout opgetreden: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Server van groepsgesprek ‘{0}’ niet gevonden." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1900 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "MUC-dienst is niet beschikbaar voor ‘{0}’" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1907 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "U heeft geen toestemming om deel te nemen aan ‘{0}’" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1913 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Er is een onverwerkte groepsgespreksfout opgetreden: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2090 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Aanwezigheidsupdate van {0} ontvangen, maar er is geen overeenkomstig " "gespreksvenster" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2114 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Bericht in groepsgesprek ontvangen van {0}, maar er is geen overeenkomstig " "gespreksvenster: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2391 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "U bent door {0} uitgenodigd in {2} vanwege {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "U bent door {0} uitgenodigd in {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2418 msgid "Accept invite (join room)" msgstr "Uitnodiging aanvaarden (deelnemen aan groepsgesprek)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2556 #, csharp-format msgid "Reconnecting to {0}" msgstr "Opnieuw verbinden met {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2570 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Opnieuw verbinden met {0} over {1} seconden" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2600 #, csharp-format msgid "Error: {0}" msgstr "Fout: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2612 msgid "Authenticated" msgstr "Geauthenticeerd" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2663 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Gebruikmakend van proxy: {0}:{1}" #~ msgid "Error in Groupchat {0}: {1}" #~ msgstr "Fout in Groupchat {0}: {1}" smuxi-1.1/po-Engine-XMPP/lt.po0000664000175000017500000002711614011526464016714 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-08 14:33+0000\n" "PO-Revision-Date: 2016-01-08 22:07+0200\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/" "language/lt/)\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Serveris sustabdytas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Prisijungė kitas klientas su tuo pačiu ištekliu, jūs buvote atjungti" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Tapatybės nustatymas nepavyko, tokio vartotojo vardo nėra arba neteisingas " "slaptažodis" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Jeigu norite susikurti paskyrą su nurodytu vartotojo vardu ir slaptažodžiu, " "dabar įveskite /register" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Šis modulis turi savą Facebook palaikymą, jūs turėtumėte naudoti jį, vietoj " "jungimosi prie Facebook per XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "neprisijungta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Nepavyko rasti kontakto {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Kontaktas {0} turi {1} žinomų išteklių" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} nėra žinomas išteklius" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "Kontakto JID: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Jūs esate priregistruoti su šiuo kontaktu vienas prie kito" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Jūs nesate priregistruoti prie šio kontakto ir šis kontaktas nėra " "priregistruotas prie jūsų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Jūs esate priregistruoti prie šio kontakto, tačiau šis kontaktas nėra " "priregistruotas prie jūsų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Jūs nesate priregistruoti prie šio kontakto, tačiau kontaktas yra " "priregistruotas prie jūsų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Neteisinga kontakto komanda: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} Komandos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Išplėstinės {0} Komandos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Neteisingas prievadas: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prieinamumo Pirmenybė yra: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Atsitraukimo Pirmenybė yra: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Neteisinga pirmenybė: {0} (teisingos pirmenybės yra tarp -128 ir 127 imtinai)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} yra prieinamas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} yra atsitraukęs" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} yra išplėstinai atsitraukęs" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} nenori būti trukdomas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} nori kalbėtis" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} yra atsijungęs" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Automatiškai leista {0} prie jūsų prisiregistruoti, kadangi jūs jau prašote " "priregistravimo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} nori užsisakyti jūsų prenumeratą" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} leido jums prisiregistruoti" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Automatiškai pašalintas {0} priregistravimas prie jūsų būsenų, po to, kai " "jūs praradote priregistravimą prie šio vartotojo būsenų" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} atmetė/pašalino jūsų priregistravimą" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} išsiregistravo iš jūsų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "gautas netaisyklingas klaidos pranešimas: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "Nepavyko rasti {0}{1} serverio" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} jau naudoja jūsų užklaustą išteklių" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Šiuo metu nėra naudingų {0}, {1}, {2}{3} klaidos pranešimų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Jūs neturite leidimo prieiti prie {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} dienų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} valandų" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minučių" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} sekundžių" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " nuo {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Grupės pokalbyje įvyko nežinoma klaida: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Grupės pokalbio \"{0}\" serveris nerastas." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "MUC paslauga \"{0}\" yra neprieinama" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Jūs neturite leidimo prisijungti prie \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Grupės pokalbyje įvyko neapdorota klaida: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Gautas būsenos atnaujinimas iš {0}, tačiau nėra atitinkamo pokalbių lango" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Gautas grupės pokalbio pranešimas iš {0}, tačiau nėra atitinkamo pokalbių " "lango: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr " {0} pakvietė jus į {2}, nes {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "{0} pakvietė jus į {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Priimti pakvietimą (užeiti į kambarį)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Iš naujo jungiamasi prie {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Iš naujo jungiamasi prie {0} po {1} sekundžių" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Klaida: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Tapatybė patvirtinta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Naudojamas įgaliotasis serveris: {0}:{1}" smuxi-1.1/po-Engine-XMPP/POTFILES.in0000664000175000017500000000006614011526464017505 0ustar00meebeymeebey00000000000000src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs smuxi-1.1/po-Engine-XMPP/POTFILES.skip0000664000175000017500000000047314011526464020047 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Engine-XMPP/te.po0000664000175000017500000001772014011526464016705 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:01+0100\n" "PO-Revision-Date: 2013-12-11 16:07+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:212 msgid "The Server has shut down" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:215 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:233 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:237 msgid "" "if you want to create an account with the specified user and password, type " "/register now" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:359 msgid "not connected" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:818 #, csharp-format msgid "Could not find contact {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:824 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:828 #, csharp-format msgid "{0} is not a known resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:836 #, csharp-format msgid "Contact's Jid: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:840 msgid "You have a mutual subscription with this contact" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:843 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:846 msgid "" "You are subscribed to this contact, but the contact is not subcribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:849 msgid "" "You are not subscribed to this contact, but the contact is subcribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:945 #, csharp-format msgid "Invalid Contact command: {0}" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:956 #, csharp-format msgid "{0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:981 #, csharp-format msgid "Advanced {0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1016 #, csharp-format msgid "Invalid port: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1051 #, csharp-format msgid "Priority for Available is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1054 #, csharp-format msgid "Priority for Away is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1062 #, csharp-format msgid "" "Invalid Priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is available" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} is away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} is extended away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1653 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1657 #, csharp-format msgid "{0}{1} wants to chat" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1664 #, csharp-format msgid "{0}{1} is offline" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1670 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1682 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1689 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1696 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1701 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1705 #, csharp-format msgid "received a malformed error message: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1712 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1715 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1722 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1744 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1758 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1735 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1785 #, csharp-format msgid "{0} days" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1791 #, csharp-format msgid "{0} hours" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1795 #, csharp-format msgid "{0} minutes" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1798 #, csharp-format msgid "{0} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1810 #, csharp-format msgid " since {0} ({1})" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1888 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1906 #, csharp-format msgid "Error in Groupchat {0}: {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2277 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2283 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2304 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2471 #, csharp-format msgid "Reconnecting to {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2485 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2515 #, csharp-format msgid "Error: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2527 msgid "Authenticated" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2574 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" smuxi-1.1/po-Engine-XMPP/sv.po0000664000175000017500000002675714011526464016737 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2014-2015 # Martin Bagge , 2013 # Anders Jonsson , 2016 # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-28 17:02+0000\n" "PO-Revision-Date: 2016-04-03 15:55+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Servern har stängts av" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "En annan klient loggade in med samma resurs, du har kopplats bort" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Autentisering misslyckades, antingen finns inte användarnamnet eller så är " "lösenordet fel" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Om du vill skapa ett konto med den specificerade användaren och lösenordet " "skriv då /register nu" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Den här motorn har inbyggt stöd för Facebook, använd den hellre än att " "ansluta till Facebook med XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "inte ansluten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Kunde inte hitta kontakten {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Kontakten {0} har {1} känd resurs" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} är inte en känd resurs" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "Kontaktens JID: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Ni prenumererar på varandra" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Du har inga prenumerationer med denna kontakt och kontakten prenumererar " "inte på dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Du prenumererar på denna kontakt, men kontakten prenumererar inte på dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Du prenumererar inte på denna kontakt, men kontakten prenumererar på dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Felaktigt kontaktkommando: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0}-kommandon" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Avancerade {0}-kommandon" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Felaktig port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioritet för Tillgänglig är: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioritet för Borta är: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Felaktig prioritet: {0} (korrekta prioriteringar spänner från -128 till och " "med 127)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} är tillgänglig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} är borta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} är borta sedan längre tid" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} vill inte bli störd" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} vill chatta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} är inte ansluten" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Tillät automatiskt {0} att prenumerera på dig eftersom du redan frågar om " "att prenumerera" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} vill prenumerera på dig" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} tillät dig att prenumerera" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Tog automatiskt bort prenumerationen för {0} eftersom du nekades " "kontraprenumeration" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} nekade/tog bort din prenumeration" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} slutade prenumerera på dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "fick ett felaktigt formaterat felmeddelande: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "server för {0}{1} kunde inte hittas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} använder redan din begärda resurs" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Det finns inget meningsfullt felmeddelande för {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Du har inte tillåtelse att komma åt {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} dagar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} timmar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minuter" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} sekunder" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " sedan {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Ett okänt fel i gruppchatten inträffade: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Servern för gruppchatten ”{0}” kunde inte hittas." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "MUC-tjänst är inte tillgänglig för ”{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Du har inte tillåtelse att ansluta till ”{0}”" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Ett ohanterat fel i gruppchatten inträffade: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Fick en närvarouppdatering från {0} men det finns inget motsvarande " "chattfönster" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Fick ett gruppchattsmeddelande från {0} men det finns inget motsvarande " "chattfönster: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Du har bjudits in till {2} av {0} med anledning {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Du har bjudits in till {1} av {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Acceptera inbjudan (anslut till rum)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Återansluter till {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Återansluter till {0} om {1} sekunder" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Fel: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Autentiserad" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Använder proxy: {0}:{1}" smuxi-1.1/po-Engine-XMPP/tr.po0000664000175000017500000002633714011526464016726 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:40+0200\n" "PO-Revision-Date: 2017-09-19 22:25+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/meebey/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Sunucu kapatıldı" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "Başka bir istemci aynı kaynakla oturum açtı, bağlantınız kesildi" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "Kimlik doğrulama başarısız oldu, kullanıcı adı mevcut değil ya da parola yanlış" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type " "/register now" msgstr "Belirtilen kullanıcı ve parola ile bir hesap oluşturmak istiyorsanız şimdi /register yazın" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "Bu motorda yerleşik Facebook desteği bulunuyor, XMPP ile facebook bağlantısı kurmak yerine onu kullanmalısınız" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "bağlantı yok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "{0} kişisi bulunamadı" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "{0} kişisi bilinen {1} kaynağa sahip" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} bilinen bir kaynak değil" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "Kişi'ye ait JID: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Bu kişiyle ortak bir aboneliğiniz var" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "Bu kişiye aboneliğiniz yok ve bu kişi size abone değil" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "Bu kişiye abonesiniz ancak kişi size abone değil" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "Bu kişiye abone değilsiniz ancak kişi size abone" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Geçersiz kişi komutu: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} Komutları" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Gelişmiş {0} Komutları" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Geçersiz port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Uygun için öncelik: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Uzakta için öncelik: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "Geçersiz öncelik: {0} (geçerli öncelikler -128 ile 127 - dahil - arası)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} uygun" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} uzakta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} uzun süredir uzakta" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} rahatsız edilmek istemiyor" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} sohbet etmek istiyor" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} çevrimdışı" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "{0} kişisinin size abone olmasına, zaten sizin de abonelik isteğiniz olduğu için kendiliğinden izin verildi" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} size abone olmak istiyor" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} abone olmanıza izin verdi" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "{0} kişisinin bulunmalarınıza aboneliği, siz o kişiye aboneliğinizi kaybedince kendiliğinden kaldırıldı" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} aboneliğinizi reddetti/kaldırdı" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} size aboneliğini iptal etti" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "kusurlu bir hata mesajı alındı: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "{0}{1} kişisinin sunucusu bulunamadı" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} zaten talep ettiğiniz kaynağı kullanıyor" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "{0}, {1}, {2}{3} için henüz kullanışlı bir hata mesajı yok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "{0}{1} kişisine erişim için izniniz yok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} gün" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} saat" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} dakika" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} saniye" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "{0} ({1}) süresince" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Bilinmeyen bir toplu sohbet hatası oluştu: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "\"{0}\" toplu sohbetinin sunucusu bulunamadı." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "\"{0}\" için MUC hizmeti mevcut değil" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "\"{0}\" katılımı için izniniz yok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Öngörülmemiş bir toplu sohbet hatası oluştu: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat " "window" msgstr "{0} kişisinden bir bulunma güncellemesi alındı, ancak karşılık gelen bir sohbet penceresi yok" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "{0} kişisinden bir toplu sohbet mesajı alındı ancak karşılık gelen bir sohbet penceresi yok: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "{0} tarafından {2} odasına davet edildiniz çünkü {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "{0} tarafından {1} odasına davet edildiniz" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Daveti kabul et (odaya katıl)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "{0} ile yeniden bağlantı kuruluyor" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "{0} ile {1} saniye içinde yeniden bağlantı kuruluyor" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Hata: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Kimlik doğrulandı" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "{0}:{1} vekil sunucusu kullanılıyor" smuxi-1.1/po-Engine-XMPP/pt_BR.po0000664000175000017500000002703214011526464017300 0ustar00meebeymeebey00000000000000# Brazilian Portuguese for smuxi-Engine-XMPP # Copyright (C) 2016 THE smuxi'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Rafael Fontenelle , 2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-12 16:03+0000\n" "PO-Revision-Date: 2016-03-09 16:12-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "O servidor foi desligado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "Um outro cliente se autenticou com o mesmo recurso; você foi desconectado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Autenticação falhou; o nome de usuário não existe ou a senha é inválida" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Se você quiser criar uma conta com o usuário e a senha especificados, " "digite /register agora" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Esse motor possui suporte nativo ao Facebook; você deveria estar usando-o, " "ao invés de se conectar ao Facebook via XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "não conectado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Não foi possível localizar o contato {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "O contato {0} possui {1} recursos conhecidos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} não é um recurso conhecido" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "JID do contato: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Você possui uma inscrição mútua com este contato" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Você não possui inscrição com este contato e este contato não está inscrito " "em você" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Você está inscrito neste contato, mas o contato não está inscrito em você" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Você não está inscrito neste contato, mas o contato está inscrito em você" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Comando de contato inválido: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "Comandos de {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Comandos avançados de {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Porta inválida: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioridade para disponível é: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioridade para ausente é: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Prioridade inválida: {0} (prioridade válidas estão entre -128 e 127, " "incluídos)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} está disponível" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} está ausente" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} está inativo" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} deseja não ser perturbado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} deseja conversar" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} está desconectado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Automaticamente permitir {0} se inscrever em você, desde que você já esteja " "solicitar se inscrever" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} deseja se inscrever em você" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} permitiu você se inscrever" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Inscrição do {0} removida automaticamente após ter perdido a sua inscrição" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} negou/removeu sua inscrição" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} desinscreveu de você" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "recebida uma mensagem de erro malformada: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "O servidor de {0}{1} não pôde ser localizado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} já está usando o recurso solicitado por você" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Não há atualmente mensagem de erro útil para {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Você não tem permissão para acessar {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} dias" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} horas" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minutos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} segundos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr " desde {0} ({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Ocorreu um erro desconhecido de grupo de bate-papo: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "O servidor do grupo de bate-papo \"{0}\" não foi localizado." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "O serviço MUC não está disponível para \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Você não possui permissão para ingressar em \"{0}\"" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Ocorreu um erro não tratado de grupo de bate-papo: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Recebida uma atualização de presença de {0}, mas não há uma janela de bate-" "papo correspondente" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Recebida uma mensagem de grupo de bate-papo de {0}, mas não há uma janela de " "bate-papo correspondente: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Você pode convidado para {2} por {0} porque {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Você foi convidado para {1} por {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Aceitar convite (ingressar na sala)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Reconectando a {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Reconectando a {0} em {1} segundos" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Erro: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Autenticado" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Usando proxy: {0}:{1}" smuxi-1.1/po-Engine-XMPP/fa.po0000664000175000017500000001771214011526464016664 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:01+0100\n" "PO-Revision-Date: 2013-12-11 16:07+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:212 msgid "The Server has shut down" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:215 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:233 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:237 msgid "" "if you want to create an account with the specified user and password, type " "/register now" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:359 msgid "not connected" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:818 #, csharp-format msgid "Could not find contact {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:824 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:828 #, csharp-format msgid "{0} is not a known resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:836 #, csharp-format msgid "Contact's Jid: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:840 msgid "You have a mutual subscription with this contact" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:843 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:846 msgid "" "You are subscribed to this contact, but the contact is not subcribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:849 msgid "" "You are not subscribed to this contact, but the contact is subcribed to you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:945 #, csharp-format msgid "Invalid Contact command: {0}" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:956 #, csharp-format msgid "{0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:981 #, csharp-format msgid "Advanced {0} Commands" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1016 #, csharp-format msgid "Invalid port: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1051 #, csharp-format msgid "Priority for Available is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1054 #, csharp-format msgid "Priority for Away is: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1062 #, csharp-format msgid "" "Invalid Priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is available" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} is away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} is extended away" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1653 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1657 #, csharp-format msgid "{0}{1} wants to chat" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1664 #, csharp-format msgid "{0}{1} is offline" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1670 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1682 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1689 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1696 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1701 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1705 #, csharp-format msgid "received a malformed error message: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1712 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1715 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1722 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1744 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1758 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1735 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1785 #, csharp-format msgid "{0} days" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1791 #, csharp-format msgid "{0} hours" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1795 #, csharp-format msgid "{0} minutes" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1798 #, csharp-format msgid "{0} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1810 #, csharp-format msgid " since {0} ({1})" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1888 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1906 #, csharp-format msgid "Error in Groupchat {0}: {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2277 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2283 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2304 msgid "Accept invite (join room)" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2471 #, csharp-format msgid "Reconnecting to {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2485 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2515 #, csharp-format msgid "Error: {0}" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2527 msgid "Authenticated" msgstr "" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2574 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" smuxi-1.1/po-Engine-XMPP/da.po0000664000175000017500000002666114011526464016665 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2013-2015 # Alan Mortensen , 2017. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-12 16:03+0000\n" "PO-Revision-Date: 2017-01-17 17:48+0100\n" "Last-Translator: Alan Mortensen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\"\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:188 msgid "The server has shut down" msgstr "Serveren har lukket ned" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:191 msgid "" "Another client logged in with the same resource, you have been disconnected" msgstr "" "En anden klient loggede ind med den samme ressource, du er blevet frakoblet" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:209 msgid "" "Authentication failed, either username does not exist or invalid password" msgstr "" "Godkendelse mislykkedes, enten er brugernavnet ikkeeksisterende eller " "adgangskoden er ugyldig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:213 msgid "" "If you want to create an account with the specified user and password, type /" "register now" msgstr "" "Hvis du ønsker at oprette en konto med den angivne bruger og adgangskode, så " "tast /register nu" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:259 msgid "" "This engine has native Facebook support, you should be using it instead of " "connecting to Facebook with XMPP" msgstr "" "Denne motor har indbygget understøttelse for Facebook. Du bør bruge den i " "stedet for at forbinde til Facebook med XMPP" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:328 msgid "not connected" msgstr "ikke forbundet" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:819 #, csharp-format msgid "Could not find contact {0}" msgstr "Kunne ikke finde kontakt {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:825 #, csharp-format msgid "Contact {0} has {1} known resources" msgstr "Kontakt {0} har {1} kendte ressourcer" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:829 #, csharp-format msgid "{0} is not a known resource" msgstr "{0} er ikke en kendt ressource" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:837 #, csharp-format msgid "Contact's JID: {0}" msgstr "Kontakts JID: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:841 msgid "You have a mutual subscription with this contact" msgstr "Du har et fælles abonnement med denne kontakt" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:844 msgid "" "You have no subscription with this contact and this contact is not " "subscribed to you" msgstr "" "Du har intet abonnement med denne kontakt og denne kontakt har ikke " "abonnement hos dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:847 msgid "" "You are subscribed to this contact, but the contact is not subscribed to you" msgstr "" "Du har abonnement med denne kontakt, men kontakten har ikke abonnement hos " "dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:850 msgid "" "You are not subscribed to this contact, but the contact is subscribed to you" msgstr "" "Du har ikke abonnement hos denne kontakt, men kontakten har abonnement hos " "dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:946 #, csharp-format msgid "Invalid contact command: {0}" msgstr "Ugyldig kontaktkommando: {0}" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:957 #, csharp-format msgid "{0} Commands" msgstr "{0} kommandoer" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:982 #, csharp-format msgid "Advanced {0} Commands" msgstr "Avancerede {0} kommandoer" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1017 #, csharp-format msgid "Invalid port: {0}" msgstr "Ugyldig port: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1052 #, csharp-format msgid "Priority for Available is: {0}" msgstr "Prioritet for tilgængelig er: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1055 #, csharp-format msgid "Priority for Away is: {0}" msgstr "Prioritet for fraværende er: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1063 #, csharp-format msgid "" "Invalid priority: {0} (valid priorities are between -128 and 127 inclusive)" msgstr "" "Ugyldig prioritet: {0} (gyldige prioriteter er mellem -128 og 127 inklusive)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1633 #, csharp-format msgid "{0}{1} is available" msgstr "{0}{1} er tilgængelig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1637 #, csharp-format msgid "{0}{1} is away" msgstr "{0}{1} er fraværende" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1641 #, csharp-format msgid "{0}{1} is extended away" msgstr "{0}{1} er udvidet fraværende" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1645 #, csharp-format msgid "{0}{1} wishes not to be disturbed" msgstr "{0}{1} ønsker ikke at blive forstyrret" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1649 #, csharp-format msgid "{0}{1} wants to chat" msgstr "{0}{1} ønsker at chatte" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1656 #, csharp-format msgid "{0}{1} is offline" msgstr "{0}{1} er frakoblet" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1662 #, csharp-format msgid "" "Automatically allowed {0} to subscribe to you, since you are already asking " "to subscribe" msgstr "" "Tilladte automatisk {0} at abonnere på dig, da du allerede anmoder om at " "abonnere" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1666 #, csharp-format msgid "{0}{1} wishes to subscribe to you" msgstr "{0}{1} ønsker at abonnere på dig" #. you can now see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1674 #, csharp-format msgid "{0}{1} allowed you to subscribe" msgstr "{0}{1} lod dig abonnere" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1681 #, csharp-format msgid "" "Automatically removed {0}'s subscription to your presences after losing the " "subscription to theirs" msgstr "" "Fjernede automatisk {0}s abonnement til dine tilstedeværelser efter tab af " "abonnement til deres" #. you cannot (anymore?) see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1688 #, csharp-format msgid "{0}{1} denied/removed your subscription" msgstr "{0}{1} nægtede/fjernede dit abonnement" #. you might still be able to see their presences #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1693 #, csharp-format msgid "{0}{1} unsubscribed from you" msgstr "{0}{1} fjernede sit abonnement fra dig" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1697 #, csharp-format msgid "received a malformed error message: {0}" msgstr "modtog en forkert udformet fejlbesked: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1704 #, csharp-format msgid "{0}{1}'s server could not be found" msgstr "{0}{1}s server kunne ikke findes" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1707 #, csharp-format msgid "{0}{1} is already using your requested resource" msgstr "{0}{1} bruger allerede din anmodte ressource" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1714 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1736 #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1750 #, csharp-format msgid "There is currently no useful error message for {0}, {1}, {2}{3}" msgstr "Der er i øjeblikket ingen brugbar fejlbesked for {0}, {1}, {2}{3}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1727 #, csharp-format msgid "You do not have permission to access {0}{1}" msgstr "Du har ikke rettighed til at tilgå {0}{1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1777 #, csharp-format msgid "{0} days" msgstr "{0} dage" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1783 #, csharp-format msgid "{0} hours" msgstr "{0} timer" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1787 #, csharp-format msgid "{0} minutes" msgstr "{0} minutter" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1790 #, csharp-format msgid "{0} seconds" msgstr "{0} sekunder" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1802 #, csharp-format msgid " since {0} ({1})" msgstr "siden {0}({1})" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1887 #, csharp-format msgid "An unknown groupchat error occurred: {0}" msgstr "Der opstod en ukendt gruppechatfejl: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1894 #, csharp-format msgid "Server of groupchat \"{0}\" not found." msgstr "Server for gruppechat »{0}« blev ikke fundet." #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1897 #, csharp-format msgid "MUC service is not available for \"{0}\"" msgstr "MUC-tjeneste er ikke tilgængelig for »{0}«" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1904 #, csharp-format msgid "You do not have permission to join \"{0}\"" msgstr "Du har ikke tilladelse til at slutte dig til »{0}«" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:1910 #, csharp-format msgid "An unhandled groupchat error occurred: {0}" msgstr "Der opstod en uhåndteret gruppechatfejl: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2096 #, csharp-format msgid "" "Received a presence update from {0}, but there's no corresponding chat window" msgstr "" "Modtog en tilstedeværelsesopdatering fra »{0}«, men der er intet tilsvarende " "chatvindue" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2120 #, csharp-format msgid "" "Received a groupchat message from {0} but there's no corresponding chat " "window: {1}" msgstr "" "Modtog en gruppechatbesked fra »{0}«, men der er intet tilsvarende " "chatvindue: {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2397 #, csharp-format msgid "You have been invited to {2} by {0} because {1}" msgstr "Du er blevet inviteret til {2} af {0} da {1}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2403 #, csharp-format msgid "You have been invited to {1} by {0}" msgstr "Du er blevet inviteret til {1} af {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2424 msgid "Accept invite (join room)" msgstr "Accepter invitation (gå til rum)" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2562 #, csharp-format msgid "Reconnecting to {0}" msgstr "Genforbinder til {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2576 #, csharp-format msgid "Reconnecting to {0} in {1} seconds" msgstr "Genforbinder til {0} om {1} sekunder" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2606 #, csharp-format msgid "Error: {0}" msgstr "Fejl: {0}" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2618 msgid "Authenticated" msgstr "Godkendt" #: ../src/Engine-XMPP/Protocols/Xmpp/XmppProtocolManager.cs:2669 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Bruger proxy: {0}:{1}" smuxi-1.1/config.sub0000755000175000017500000010645014011526474015313 0ustar00meebeymeebey00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-22' # 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 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 . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # 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: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # 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 or ALIAS Canonicalize a configuration name. Options: -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 1992-2018 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-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ 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/'` ;; -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 | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | 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 \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]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 \ | visium \ | wasm32 \ | 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 ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; 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-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | 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-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | 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-* \ | visium-* \ | wasm32-* \ | 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-pc 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 ;; asmjs) basic_machine=asmjs-unknown ;; 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*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; 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 ;; 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 ;; 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 ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-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 ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-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 ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-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) 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) 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 | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) 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 ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; x64) basic_machine=x86_64-pc ;; 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 ;; 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 ;; 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 ;; 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 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now 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* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -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* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # 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 | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -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 ;; -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 ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -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 ;; c8051-*) os=-elf ;; 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 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-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 ;; *-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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: smuxi-1.1/missing0000755000175000017500000001533614011526474014731 0ustar00meebeymeebey00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written 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 case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man 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 # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: smuxi-1.1/configure0000775000175000017500000144253314011526472015245 0ustar00meebeymeebey00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for smuxi 1.1. # # 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 \$(( 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 $0: https://smuxi.im/issues/new about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do 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'" 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='smuxi' PACKAGE_TARNAME='smuxi' PACKAGE_VERSION='1.1' PACKAGE_STRING='smuxi 1.1' PACKAGE_BUGREPORT='https://smuxi.im/issues/new' PACKAGE_URL='' gt_needs= enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS ENABLE_FRONTEND_TEST_FALSE ENABLE_FRONTEND_TEST_TRUE ENABLE_FRONTEND_WPF_FALSE ENABLE_FRONTEND_WPF_TRUE ENABLE_FRONTEND_SWF_FALSE ENABLE_FRONTEND_SWF_TRUE ENABLE_FRONTEND_CURSES_FALSE ENABLE_FRONTEND_CURSES_TRUE ENABLE_FRONTEND_STFL_FALSE ENABLE_FRONTEND_STFL_TRUE ENABLE_STATIC_STFL_FALSE ENABLE_STATIC_STFL_TRUE STFL_LIBS STFL_CFLAGS ENABLE_FRONTEND_GNOME_XMPP_FALSE ENABLE_FRONTEND_GNOME_XMPP_TRUE ENABLE_FRONTEND_GNOME_TWITTER_FALSE ENABLE_FRONTEND_GNOME_TWITTER_TRUE ENABLE_FRONTEND_GNOME_IRC_FALSE ENABLE_FRONTEND_GNOME_IRC_TRUE ENABLE_FRONTEND_GNOME_FALSE ENABLE_FRONTEND_GNOME_TRUE FRONTEND_GNOME_COMPILER_FLAGS GLADE_SHARP_20_LIBS GLADE_SHARP_20_CFLAGS GTK_SHARP_20_LIBS GTK_SHARP_20_CFLAGS GLIB_SHARP_20_LIBS GLIB_SHARP_20_CFLAGS SERVER_COMPILER_FLAGS MSG_BUFFER_COMPILER_FLAGS ENABLE_ENGINE_JABBR_FALSE ENABLE_ENGINE_JABBR_TRUE twitter_api_key ENABLE_ENGINE_TWITTER_FALSE ENABLE_ENGINE_TWITTER_TRUE ENABLE_ENGINE_XMPP_FALSE ENABLE_ENGINE_XMPP_TRUE ENABLE_ENGINE_CAMPFIRE_FALSE ENABLE_ENGINE_CAMPFIRE_TRUE ENABLE_ENGINE_IRC_FALSE ENABLE_ENGINE_IRC_TRUE GTKSPELL_LIBS GTKSPELL_CFLAGS NDESK_DBUS_GLIB_LIBS NDESK_DBUS_GLIB_CFLAGS NDESK_DBUS_LIBS NDESK_DBUS_CFLAGS DBUS_LIBS DBUS_SHARP_GLIB_LIBS DBUS_SHARP_GLIB_CFLAGS DBUS_SHARP_LIBS DBUS_SHARP_CFLAGS NOTIFY_SHARP_LIBS NOTIFY_SHARP_CFLAGS INDICATE_SHARP_LIBS INDICATE_SHARP_CFLAGS WITH_MESSAGINGMENU_SHARP_INCLUDED_FALSE WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE MESSAGINGMENU_SHARP_FILES subdirs GIO_SHARP_FILES GIO_SHARP_LIBS GIO_SHARP_CFLAGS MESSAGING_MENU_LIBS MESSAGING_MENU_CFLAGS MESSAGINGMENU_SHARP_LIBS MESSAGINGMENU_SHARP_CFLAGS DB4O_FILES XBUILD BUNDLE_DB4O_FALSE BUNDLE_DB4O_TRUE DB4O_LIBS DB4O_CFLAGS BUNDLE_NINI_BLOB_FALSE BUNDLE_NINI_BLOB_TRUE BUNDLE_NINI_FALSE BUNDLE_NINI_TRUE NINI_LIBS NINI_CFLAGS ENABLE_TESTS_FALSE ENABLE_TESTS_TRUE BUNDLE_LOG4NET_FALSE BUNDLE_LOG4NET_TRUE LOG4NET_LIBS LOG4NET_CFLAGS XBUILD_FLAGS CSC_FLAGS CSC PROFILE ENABLE_DEBUG_FALSE ENABLE_DEBUG_TRUE ENABLE_RELEASE_FALSE ENABLE_RELEASE_TRUE MCS MONO MONO_MODULE_LIBS MONO_MODULE_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH expanded_libdir dist_version DEV_VERSION_SUFFIX git_commit_hash git_branch LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS EGREP GREP CPP host_os host_vendor host_cpu host build_os build_vendor build_cpu build am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC XGETTEXT_EXTRA_OPTIONS XGETTEXT_015 GMSGFMT_015 MSGFMT_015 GETTEXT_MACRO_VERSION SED GETTEXT_PACKAGE_FRONTEND_WPF GETTEXT_PACKAGE_FRONTEND_SWF GETTEXT_PACKAGE_FRONTEND_CURSES GETTEXT_PACKAGE_FRONTEND_STFL GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER GETTEXT_PACKAGE_FRONTEND_GNOME_IRC GETTEXT_PACKAGE_FRONTEND_GNOME GETTEXT_PACKAGE_FRONTEND GETTEXT_PACKAGE_SERVER GETTEXT_PACKAGE_MSG_BUFFER GETTEXT_PACKAGE_ENGINE_JABBR GETTEXT_PACKAGE_ENGINE_CAMPFIRE GETTEXT_PACKAGE_ENGINE_TWITTER GETTEXT_PACKAGE_ENGINE_XMPP GETTEXT_PACKAGE_ENGINE_IRC GETTEXT_PACKAGE_ENGINE GETTEXT_PACKAGE POSUB ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS PKG_CONFIG MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V 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 runstatedir 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 am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_nls enable_dependency_tracking with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix with_vendor_package_version enable_debug with_db4o with_messaging_menu with_indicate with_notify with_dbus with_gtkspell enable_engine_irc enable_engine_campfire enable_engine_xmpp enable_engine_twitter with_twitter_api_key enable_engine_jabbr enable_frontend_gnome enable_frontend_stfl enable_frontend_curses enable_frontend_swf enable_frontend_wpf enable_frontend_test ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR MONO_MODULE_CFLAGS MONO_MODULE_LIBS LOG4NET_CFLAGS LOG4NET_LIBS NINI_CFLAGS NINI_LIBS DB4O_CFLAGS DB4O_LIBS MESSAGINGMENU_SHARP_CFLAGS MESSAGINGMENU_SHARP_LIBS MESSAGING_MENU_CFLAGS MESSAGING_MENU_LIBS GIO_SHARP_CFLAGS GIO_SHARP_LIBS INDICATE_SHARP_CFLAGS INDICATE_SHARP_LIBS NOTIFY_SHARP_CFLAGS NOTIFY_SHARP_LIBS DBUS_SHARP_CFLAGS DBUS_SHARP_LIBS DBUS_SHARP_GLIB_CFLAGS DBUS_SHARP_GLIB_LIBS NDESK_DBUS_CFLAGS NDESK_DBUS_LIBS NDESK_DBUS_GLIB_CFLAGS NDESK_DBUS_GLIB_LIBS GTKSPELL_CFLAGS GTKSPELL_LIBS GLIB_SHARP_20_CFLAGS GLIB_SHARP_20_LIBS GTK_SHARP_20_CFLAGS GTK_SHARP_20_LIBS GLADE_SHARP_20_CFLAGS GLADE_SHARP_20_LIBS STFL_CFLAGS STFL_LIBS' ac_subdirs_all='lib/messagingmenu-sharp' # 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' runstatedir='${localstatedir}/run' 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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 runstatedir 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 smuxi 1.1 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] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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/smuxi] --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 smuxi 1.1:";; 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] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-nls do not use Native Language Support --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-rpath do not hardcode runtime library paths --enable-debug Use 'DEBUG' Configuration [default=YES] --enable-engine-irc Enable IRC protocol support (default yes) --enable-engine-campfire Enable Campfire protocol support (default yes) --enable-engine-xmpp Enable XMPP (Jabber) protocol support (default yes) --enable-engine-twitter Enable Twitter support (default yes) --enable-engine-jabbr Enable JabbR support (default yes) --enable-frontend-gnome Enable GNOME frontend (default yes) --enable-frontend-stfl Enable STFL frontend (default yes) --enable-frontend-curses Enable Ncurses frontend (default no) --enable-frontend-swf Enable SWF (WinForms) frontend (default no) --enable-frontend-wpf Enable WPF (Windows Presentation Foundation) frontend (default no) --enable-frontend-test Enable Test frontend (default no) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-vendor-package-version="DISTRO_NAME PACKAGE_VERSION" Set the distro name and package version, e.g. "Debian 0.8-1" --with-db4o=auto|system|included Use system or included db4o [default=auto] --with-messaging-menu=auto|system|included|no Support Messaging Menu (Ubuntu >= 12.10) [default=auto] --with-indicate Support Messaging Menu (Ubuntu <= 12.04) [default=auto] --with-notify Support Desktop Notifications [default=auto] --with-dbus Support D-Bus [default=auto] --with-gtkspell Support GTK+ spell checking [default=auto] --with-twitter-api-key Specify custom Twitter API key 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 CPP 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 MONO_MODULE_CFLAGS C compiler flags for MONO_MODULE, overriding pkg-config MONO_MODULE_LIBS linker flags for MONO_MODULE, overriding pkg-config LOG4NET_CFLAGS C compiler flags for LOG4NET, overriding pkg-config LOG4NET_LIBS linker flags for LOG4NET, overriding pkg-config NINI_CFLAGS C compiler flags for NINI, overriding pkg-config NINI_LIBS linker flags for NINI, overriding pkg-config DB4O_CFLAGS C compiler flags for DB4O, overriding pkg-config DB4O_LIBS linker flags for DB4O, overriding pkg-config MESSAGINGMENU_SHARP_CFLAGS C compiler flags for MESSAGINGMENU_SHARP, overriding pkg-config MESSAGINGMENU_SHARP_LIBS linker flags for MESSAGINGMENU_SHARP, overriding pkg-config MESSAGING_MENU_CFLAGS C compiler flags for MESSAGING_MENU, overriding pkg-config MESSAGING_MENU_LIBS linker flags for MESSAGING_MENU, overriding pkg-config GIO_SHARP_CFLAGS C compiler flags for GIO_SHARP, overriding pkg-config GIO_SHARP_LIBS linker flags for GIO_SHARP, overriding pkg-config INDICATE_SHARP_CFLAGS C compiler flags for INDICATE_SHARP, overriding pkg-config INDICATE_SHARP_LIBS linker flags for INDICATE_SHARP, overriding pkg-config NOTIFY_SHARP_CFLAGS C compiler flags for NOTIFY_SHARP, overriding pkg-config NOTIFY_SHARP_LIBS linker flags for NOTIFY_SHARP, overriding pkg-config DBUS_SHARP_CFLAGS C compiler flags for DBUS_SHARP, overriding pkg-config DBUS_SHARP_LIBS linker flags for DBUS_SHARP, overriding pkg-config DBUS_SHARP_GLIB_CFLAGS C compiler flags for DBUS_SHARP_GLIB, overriding pkg-config DBUS_SHARP_GLIB_LIBS linker flags for DBUS_SHARP_GLIB, overriding pkg-config NDESK_DBUS_CFLAGS C compiler flags for NDESK_DBUS, overriding pkg-config NDESK_DBUS_LIBS linker flags for NDESK_DBUS, overriding pkg-config NDESK_DBUS_GLIB_CFLAGS C compiler flags for NDESK_DBUS_GLIB, overriding pkg-config NDESK_DBUS_GLIB_LIBS linker flags for NDESK_DBUS_GLIB, overriding pkg-config GTKSPELL_CFLAGS C compiler flags for GTKSPELL, overriding pkg-config GTKSPELL_LIBS linker flags for GTKSPELL, overriding pkg-config GLIB_SHARP_20_CFLAGS C compiler flags for GLIB_SHARP_20, overriding pkg-config GLIB_SHARP_20_LIBS linker flags for GLIB_SHARP_20, overriding pkg-config GTK_SHARP_20_CFLAGS C compiler flags for GTK_SHARP_20, overriding pkg-config GTK_SHARP_20_LIBS linker flags for GTK_SHARP_20, overriding pkg-config GLADE_SHARP_20_CFLAGS C compiler flags for GLADE_SHARP_20, overriding pkg-config GLADE_SHARP_20_LIBS linker flags for GLADE_SHARP_20, overriding pkg-config STFL_CFLAGS C compiler flags for STFL, overriding pkg-config STFL_LIBS linker flags for STFL, 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 smuxi configure 1.1 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_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_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_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 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 smuxi $as_me 1.1, 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 gt_needs="$gt_needs " # 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 # using the --foreign option makes automake less strict about GNU policy am__api_version='1.16' 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; } # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 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 if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done 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; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file 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 --is-lightweight"; then am_missing_run="$MISSING " 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+set}" != 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; } 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 # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' 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='smuxi' VERSION='1.1' 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"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). 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}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 $as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test $am_uid -le $am_max_uid; 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; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 $as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test $am_gid -le $am_max_gid; 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; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -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 ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -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_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # 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_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 test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" ;; 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 if test "x$PKG_CONFIG" = "xno"; then as_fn_error $? "You need to install pkg-config" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $shell_append" >&5 $as_echo "$shell_append" >&6; } if test "x$shell_append" = "xno"; then as_fn_error $? "Your shell (/bin/sh) is not supporting += which is required by this configure script. Try CONFIG_SHELL=\"env bash\" ./configure instead." "$LINENO" 5 fi # I18N { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.25 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "0.25"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.25" >&5 $as_echo_n "checking for intltool >= 0.25... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool 0.25 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; 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_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # 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_INTLTOOL_UPDATE="$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 INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; 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_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # 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_INTLTOOL_MERGE="$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 INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; 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_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # 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_INTLTOOL_EXTRACT="$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 INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; 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_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # 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_XGETTEXT="$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 XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; 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_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # 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_MSGMERGE="$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 MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; 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_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # 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_MSGFMT="$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 MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; 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_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # 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_GMSGFMT="$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 test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; 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_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # 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_INTLTOOL_PERL="$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 INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile POSUB=" po po-Engine po-Engine-MessageBuffer po-Engine-Campfire po-Engine-IRC po-Engine-JabbR po-Engine-Twitter po-Engine-XMPP po-Server po-Frontend po-Frontend-GNOME po-Frontend-GNOME-IRC po-Frontend-GNOME-Twitter po-Frontend-GNOME-XMPP po-Frontend-SWF " GETTEXT_PACKAGE=smuxi GETTEXT_PACKAGE_ENGINE=smuxi-engine cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_ENGINE "$GETTEXT_PACKAGE_ENGINE" _ACEOF GETTEXT_PACKAGE_ENGINE_IRC=smuxi-engine-irc cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_ENGINE_IRC "$GETTEXT_PACKAGE_ENGINE_IRC" _ACEOF GETTEXT_PACKAGE_ENGINE_XMPP=smuxi-engine-xmpp cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_ENGINE_XMPP "$GETTEXT_PACKAGE_ENGINE_XMPP" _ACEOF GETTEXT_PACKAGE_ENGINE_TWITTER=smuxi-engine-twitter cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_ENGINE_TWITTER "$GETTEXT_PACKAGE_ENGINE_TWITTER" _ACEOF GETTEXT_PACKAGE_ENGINE_CAMPFIRE=smuxi-engine-campfire cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_ENGINE_CAMPFIRE "$GETTEXT_PACKAGE_ENGINE_CAMPFIRE" _ACEOF GETTEXT_PACKAGE_ENGINE_JABBR=smuxi-engine-jabbr cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_ENGINE_JABBR "$GETTEXT_PACKAGE_ENGINE_JABBR" _ACEOF GETTEXT_PACKAGE_MSG_BUFFER=smuxi-message-buffer cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_MSG_BUFFER "$GETTEXT_PACKAGE_MSG_BUFFER" _ACEOF GETTEXT_PACKAGE_SERVER=smuxi-server cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_SERVER "$GETTEXT_PACKAGE_SERVER" _ACEOF GETTEXT_PACKAGE_FRONTEND=smuxi-frontend cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND "$GETTEXT_PACKAGE_FRONTEND" _ACEOF GETTEXT_PACKAGE_FRONTEND_GNOME=smuxi-frontend-gnome cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_GNOME "$GETTEXT_PACKAGE_FRONTEND_GNOME" _ACEOF GETTEXT_PACKAGE_FRONTEND_GNOME_IRC=smuxi-frontend-gnome-irc cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_GNOME_IRC "$GETTEXT_PACKAGE_FRONTEND_GNOME_IRC" _ACEOF GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER=smuxi-frontend-gnome-twitter cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER "$GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER" _ACEOF GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP=smuxi-frontend-gnome-xmpp cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP "$GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP" _ACEOF GETTEXT_PACKAGE_FRONTEND_STFL=smuxi-frontend-stfl cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_STFL "$GETTEXT_PACKAGE_FRONTEND_STFL" _ACEOF GETTEXT_PACKAGE_FRONTEND_CURSES=smuxi-frontend-curses cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_CURSES "$GETTEXT_PACKAGE_FRONTEND_CURSES" _ACEOF GETTEXT_PACKAGE_FRONTEND_SWF=smuxi-frontend-swf cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_SWF "$GETTEXT_PACKAGE_FRONTEND_SWF" _ACEOF GETTEXT_PACKAGE_FRONTEND_WPF=smuxi-frontend-wpf cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE_FRONTEND_WPF "$GETTEXT_PACKAGE_FRONTEND_WPF" _ACEOF { $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 GETTEXT_MACRO_VERSION=0.19 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; 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_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; 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_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # 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_GMSGFMT="$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 test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; 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_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; 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_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # 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 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 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 whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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="$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 10 /bin/sh. echo '/* dummy */' > 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 # 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 # 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 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 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 ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_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 `"$acl_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 ${acl_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 "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes 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 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 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" acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi test "$am_cv_func_iconv_works" = no || break done LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" # doesn't support multiple po directories :( #AM_GLIB_GNU_GETTEXT # Check whether --with-vendor-package-version was given. if test "${with_vendor_package_version+set}" = set; then : withval=$with_vendor_package_version; else with_vendor_package_version= fi WITH_VENDOR_PACKAGE_VERSION=$with_vendor_package_version if test "x$WITH_VENDOR_PACKAGE_VERSION" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for git version" >&5 $as_echo_n "checking for git version... " >&6; } if git log --oneline 295b37c8ac4939829a3c7f9150943dba8fff07f0 > /dev/null 2>&1; then GIT_BRANCH=$(git branch | grep '^\*' | cut -d ' ' -f 2) GIT_COMMIT_HASH=$(git log --no-color --first-parent -n1 --pretty=format:%h) DIST_VERSION=$GIT_BRANCH/$GIT_COMMIT_HASH DEV_VERSION_SUFFIX="-dev" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else DIST_VERSION=tarball DEV_VERSION_SUFFIX= { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else DIST_VERSION=$WITH_VENDOR_PACKAGE_VERSION fi git_branch="$GIT_BRANCH" git_commit_hash="$GIT_COMMIT_HASH" dist_version="$DIST_VERSION" expanded_libdir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $libdir )` 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 if test "x$(uname)" = "xDarwin"; then export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig:$PKG_CONFIG_PATH fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MONO_MODULE" >&5 $as_echo_n "checking for MONO_MODULE... " >&6; } if test -n "$MONO_MODULE_CFLAGS"; then pkg_cv_MONO_MODULE_CFLAGS="$MONO_MODULE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono >= 4.6.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono >= 4.6.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_MODULE_CFLAGS=`$PKG_CONFIG --cflags "mono >= 4.6.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MONO_MODULE_LIBS"; then pkg_cv_MONO_MODULE_LIBS="$MONO_MODULE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mono >= 4.6.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "mono >= 4.6.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MONO_MODULE_LIBS=`$PKG_CONFIG --libs "mono >= 4.6.2" 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 MONO_MODULE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "mono >= 4.6.2" 2>&1` else MONO_MODULE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "mono >= 4.6.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MONO_MODULE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (mono >= 4.6.2) were not met: $MONO_MODULE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MONO_MODULE_CFLAGS and MONO_MODULE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables MONO_MODULE_CFLAGS and MONO_MODULE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else MONO_MODULE_CFLAGS=$pkg_cv_MONO_MODULE_CFLAGS MONO_MODULE_LIBS=$pkg_cv_MONO_MODULE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # Extract the first word of "mono", so it can be a program name with args. set dummy mono; 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_MONO+:} false; then : $as_echo_n "(cached) " >&6 else case $MONO in [\\/]* | ?:[\\/]*) ac_cv_path_MONO="$MONO" # 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_MONO="$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 test -z "$ac_cv_path_MONO" && ac_cv_path_MONO="no" ;; esac fi MONO=$ac_cv_path_MONO if test -n "$MONO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MONO" >&5 $as_echo "$MONO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$MONO" = "xno"; then as_fn_error $? "You need to install 'mono'" "$LINENO" 5 fi if pkg-config --atleast-version=4.0 mono; then # Extract the first word of "mcs", so it can be a program name with args. set dummy mcs; 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_MCS+:} false; then : $as_echo_n "(cached) " >&6 else case $MCS in [\\/]* | ?:[\\/]*) ac_cv_path_MCS="$MCS" # 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_MCS="$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 MCS=$ac_cv_path_MCS if test -n "$MCS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCS" >&5 $as_echo "$MCS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if pkg-config --atleast-version=2.8 mono; then # Extract the first word of "dmcs", so it can be a program name with args. set dummy dmcs; 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_MCS+:} false; then : $as_echo_n "(cached) " >&6 else case $MCS in [\\/]* | ?:[\\/]*) ac_cv_path_MCS="$MCS" # 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_MCS="$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 MCS=$ac_cv_path_MCS if test -n "$MCS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCS" >&5 $as_echo "$MCS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$MCS" = "x" ; then # Extract the first word of "gmcs", so it can be a program name with args. set dummy gmcs; 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_MCS+:} false; then : $as_echo_n "(cached) " >&6 else case $MCS in [\\/]* | ?:[\\/]*) ac_cv_path_MCS="$MCS" # 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_MCS="$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 MCS=$ac_cv_path_MCS if test -n "$MCS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MCS" >&5 $as_echo "$MCS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$MCS" = "x" ; then as_fn_error $? "You need to install 'dmcs' or 'gmcs'" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Core System.Data System.Runtime.Remoting System.Runtime.Serialization System.Xml Mono.Posix Mono.Data.Sqlite " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done PROFILE=debug # Release builds, that is without log4net and without debug symbol files (.mdb) # are not supported at this point, as they have no advantage at runtime but # disadvantages to analyze bugs. #AC_ARG_ENABLE(release, # AC_HELP_STRING([--enable-release], # [Use 'RELEASE' Configuration [default=NO]]), # enable_release=yes, enable_release=no) if test x$enable_release = xyes; then ENABLE_RELEASE_TRUE= ENABLE_RELEASE_FALSE='#' else ENABLE_RELEASE_TRUE='#' ENABLE_RELEASE_FALSE= fi #if test "x$enable_release" = "xyes" ; then # PROFILE=release #fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; enable_debug=yes else enable_debug=no fi if test x$enable_debug = xyes; then ENABLE_DEBUG_TRUE= ENABLE_DEBUG_FALSE='#' else ENABLE_DEBUG_TRUE='#' ENABLE_DEBUG_FALSE= fi if test "x$enable_debug" = "xyes" ; then PROFILE=debug fi CSC="$MCS" CSC_FLAGS= if test "x$PROFILE" = "xdebug"; then if true; then ENABLE_DEBUG_TRUE= ENABLE_DEBUG_FALSE='#' else ENABLE_DEBUG_TRUE='#' ENABLE_DEBUG_FALSE= fi CSC_FLAGS+="-define:DEBUG,TRACE,LOG4NET -debug" else if true; then ENABLE_RELEASE_TRUE= ENABLE_RELEASE_FALSE='#' else ENABLE_RELEASE_TRUE='#' ENABLE_RELEASE_FALSE= fi fi MCS_BASENAME=$(basename $MCS) CLI_RUNTIME=4.5 if test "$MCS_BASENAME" = "gmcs"; then CLI_RUNTIME=3.5 fi if test "$MCS_BASENAME" = "dmcs"; then CLI_RUNTIME=4.0 fi if test "$MCS_BASENAME" = "mcs"; then CLI_RUNTIME=4.5 fi if test "$CLI_RUNTIME" = "4.5"; then if test ! -e "$($PKG_CONFIG --variable=libdir mono)/mono/4.5/mscorlib.dll" -a \ ! -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/4.5/mscorlib.dll"; then # Mono without 4.5 support -> downgrade to 4.0 CLI_RUNTIME=4.0 fi fi if test "$CLI_RUNTIME" = "4.0"; then if test ! -e "$($PKG_CONFIG --variable=libdir mono)/mono/4.0/mscorlib.dll" -a \ ! -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/4.0/mscorlib.dll"; then # Mono without 4.0 support -> downgrade to 3.5 CLI_RUNTIME=3.5 fi fi if test "$CLI_RUNTIME" = "3.5"; then XBUILD_FLAGS="/toolsversion:3.5 /p:TargetFrameworkVersion=v3.5 /property:DefineConstants=MONO_3_5" fi if test "$CLI_RUNTIME" = "4.0"; then XBUILD_FLAGS="/toolsversion:4.0 /p:TargetFrameworkVersion=v4.0 /property:DefineConstants=MONO_4_0" fi if test "$CLI_RUNTIME" = "4.5"; then XBUILD_FLAGS="/toolsversion:4.0 /p:TargetFrameworkVersion=v4.5 /property:DefineConstants=MONO_4_5" fi # Mono's xbuild >= 5.0 no longer defaults to mcs as compiler but csc which will # generate debug symbol files named .pdb instead of .mdb. Since we are # installing the debug symbol files, we override the compiler to mcs to ensure # the files will be avilable for the install during "make install" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mono >= 5.0" >&5 $as_echo_n "checking for Mono >= 5.0... " >&6; } if $PKG_CONFIG 'mono >= 5.0'; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } XBUILD_FLAGS+=" /p:CscToolExe=mcs.exe" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Required Libraries if test "x$(uname)" != "xDarwin"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LOG4NET" >&5 $as_echo_n "checking for LOG4NET... " >&6; } if test -n "$LOG4NET_CFLAGS"; then pkg_cv_LOG4NET_CFLAGS="$LOG4NET_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"log4net\""; } >&5 ($PKG_CONFIG --exists --print-errors "log4net") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LOG4NET_CFLAGS=`$PKG_CONFIG --cflags "log4net" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LOG4NET_LIBS"; then pkg_cv_LOG4NET_LIBS="$LOG4NET_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"log4net\""; } >&5 ($PKG_CONFIG --exists --print-errors "log4net") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LOG4NET_LIBS=`$PKG_CONFIG --libs "log4net" 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 LOG4NET_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "log4net" 2>&1` else LOG4NET_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "log4net" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LOG4NET_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (log4net) were not met: $LOG4NET_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LOG4NET_CFLAGS and LOG4NET_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables LOG4NET_CFLAGS and LOG4NET_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LOG4NET_CFLAGS=$pkg_cv_LOG4NET_CFLAGS LOG4NET_LIBS=$pkg_cv_LOG4NET_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if false; then BUNDLE_LOG4NET_TRUE= BUNDLE_LOG4NET_FALSE='#' else BUNDLE_LOG4NET_TRUE='#' BUNDLE_LOG4NET_FALSE= fi else if true; then BUNDLE_LOG4NET_TRUE= BUNDLE_LOG4NET_FALSE='#' else BUNDLE_LOG4NET_TRUE='#' BUNDLE_LOG4NET_FALSE= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NUnit" >&5 $as_echo_n "checking for NUnit... " >&6; } if $PKG_CONFIG 'nunit'; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } FOUND_NUNIT=yes if true; then ENABLE_TESTS_TRUE= ENABLE_TESTS_FALSE='#' else ENABLE_TESTS_TRUE='#' ENABLE_TESTS_FALSE= fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } FOUND_NUNIT=no if false; then ENABLE_TESTS_TRUE= ENABLE_TESTS_FALSE='#' else ENABLE_TESTS_TRUE='#' ENABLE_TESTS_FALSE= fi fi nini_files= if test "x$(uname)" != "xDarwin"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nini-1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "nini-1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then FOUND_NINI=yes else FOUND_NINI=no fi if test "x$FOUND_NINI" = "xyes"; then nini_files=`pkg-config --variable=Libraries nini-1.1` if test -z "$nini_files" ; then # Debian-based distros place Nini into the GAC pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NINI" >&5 $as_echo_n "checking for NINI... " >&6; } if test -n "$NINI_CFLAGS"; then pkg_cv_NINI_CFLAGS="$NINI_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nini-1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "nini-1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NINI_CFLAGS=`$PKG_CONFIG --cflags "nini-1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$NINI_LIBS"; then pkg_cv_NINI_LIBS="$NINI_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nini-1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "nini-1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NINI_LIBS=`$PKG_CONFIG --libs "nini-1.1" 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 NINI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "nini-1.1" 2>&1` else NINI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "nini-1.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$NINI_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (nini-1.1) were not met: $NINI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NINI_CFLAGS and NINI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables NINI_CFLAGS and NINI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else NINI_CFLAGS=$pkg_cv_NINI_CFLAGS NINI_LIBS=$pkg_cv_NINI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else # openSUSE has Nini as a private assembly; need to copy it. NINI_LIBS="$nini_files" fi else pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NINI" >&5 $as_echo_n "checking for NINI... " >&6; } if test -n "$NINI_CFLAGS"; then pkg_cv_NINI_CFLAGS="$NINI_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nini >= 1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "nini >= 1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NINI_CFLAGS=`$PKG_CONFIG --cflags "nini >= 1.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$NINI_LIBS"; then pkg_cv_NINI_LIBS="$NINI_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nini >= 1.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "nini >= 1.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NINI_LIBS=`$PKG_CONFIG --libs "nini >= 1.1" 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 NINI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "nini >= 1.1" 2>&1` else NINI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "nini >= 1.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$NINI_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (nini >= 1.1) were not met: $NINI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NINI_CFLAGS and NINI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables NINI_CFLAGS and NINI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else NINI_CFLAGS=$pkg_cv_NINI_CFLAGS NINI_LIBS=$pkg_cv_NINI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test -n "$nini_files"; then BUNDLE_NINI_TRUE= BUNDLE_NINI_FALSE='#' else BUNDLE_NINI_TRUE='#' BUNDLE_NINI_FALSE= fi if false; then BUNDLE_NINI_BLOB_TRUE= BUNDLE_NINI_BLOB_FALSE='#' else BUNDLE_NINI_BLOB_TRUE='#' BUNDLE_NINI_BLOB_FALSE= fi else if false; then BUNDLE_NINI_TRUE= BUNDLE_NINI_FALSE='#' else BUNDLE_NINI_TRUE='#' BUNDLE_NINI_FALSE= fi if true; then BUNDLE_NINI_BLOB_TRUE= BUNDLE_NINI_BLOB_FALSE='#' else BUNDLE_NINI_BLOB_TRUE='#' BUNDLE_NINI_BLOB_FALSE= fi fi # Check whether --with-db4o was given. if test "${with_db4o+set}" = set; then : withval=$with_db4o; else with_db4o=auto fi WITH_DB4O=$with_db4o if test "x$WITH_DB4O" = "xauto"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"db4o >= 8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "db4o >= 8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then FOUND_DB4O=yes else FOUND_DB4O=no fi if test "x$FOUND_DB4O" = "xyes"; then WITH_DB4O=system else WITH_DB4O=included fi fi if test "x$WITH_DB4O" = "xsystem"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DB4O" >&5 $as_echo_n "checking for DB4O... " >&6; } if test -n "$DB4O_CFLAGS"; then pkg_cv_DB4O_CFLAGS="$DB4O_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"db4o >= 8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "db4o >= 8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DB4O_CFLAGS=`$PKG_CONFIG --cflags "db4o >= 8.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$DB4O_LIBS"; then pkg_cv_DB4O_LIBS="$DB4O_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"db4o >= 8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "db4o >= 8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DB4O_LIBS=`$PKG_CONFIG --libs "db4o >= 8.0" 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 DB4O_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "db4o >= 8.0" 2>&1` else DB4O_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "db4o >= 8.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DB4O_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (db4o >= 8.0) were not met: $DB4O_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables DB4O_CFLAGS and DB4O_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables DB4O_CFLAGS and DB4O_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else DB4O_CFLAGS=$pkg_cv_DB4O_CFLAGS DB4O_LIBS=$pkg_cv_DB4O_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if false; then BUNDLE_DB4O_TRUE= BUNDLE_DB4O_FALSE='#' else BUNDLE_DB4O_TRUE='#' BUNDLE_DB4O_FALSE= fi fi if test "x$WITH_DB4O" = "xincluded"; then if test ! -d "$srcdir/lib/db4o-net/Db4objects.Db4o"; then as_fn_error $? "lib/db4o-net is empty!" "$LINENO" 5 fi # Extract the first word of "xbuild", so it can be a program name with args. set dummy xbuild; 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_XBUILD+:} false; then : $as_echo_n "(cached) " >&6 else case $XBUILD in [\\/]* | ?:[\\/]*) ac_cv_path_XBUILD="$XBUILD" # 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_XBUILD="$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 test -z "$ac_cv_path_XBUILD" && ac_cv_path_XBUILD="no" ;; esac fi XBUILD=$ac_cv_path_XBUILD if test -n "$XBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XBUILD" >&5 $as_echo "$XBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XBUILD" = "xno"; then as_fn_error $? "You need to install xbuild" "$LINENO" 5 fi if true; then BUNDLE_DB4O_TRUE= BUNDLE_DB4O_FALSE='#' else BUNDLE_DB4O_TRUE='#' BUNDLE_DB4O_FALSE= fi #AC_SUBST([DB4O_FILES], "Db4objects.Db4o.dll Db4objects.Db4o.Instrumentation.dll Db4objects.Db4o.NativeQueries.dll") DB4O_FILES="Db4objects.Db4o.dll" fi # Optional Libraries # Check whether --with-messaging-menu was given. if test "${with_messaging_menu+set}" = set; then : withval=$with_messaging_menu; else with_messagingmenu=auto fi WITH_MESSAGINGMENU=$with_messagingmenu if test "x$WITH_MESSAGINGMENU" = "xauto"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"messagingmenu-sharp\""; } >&5 ($PKG_CONFIG --exists --print-errors "messagingmenu-sharp") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then FOUND_MESSAGINGMENU_SHARP=yes else FOUND_MESSAGINGMENU_SHARP=no fi if test "x$FOUND_MESSAGINGMENU_SHARP" = "xyes"; then WITH_MESSAGINGMENU=system else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"messaging-menu\""; } >&5 ($PKG_CONFIG --exists --print-errors "messaging-menu") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then FOUND_MESSAGING_MENU=yes else FOUND_MESSAGING_MENU=no fi if test "x$FOUND_MESSAGING_MENU" = "xyes"; then WITH_MESSAGINGMENU=included else WITH_MESSAGINGMENU=no fi fi fi if test "x$WITH_MESSAGINGMENU" = "xsystem"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MESSAGINGMENU_SHARP" >&5 $as_echo_n "checking for MESSAGINGMENU_SHARP... " >&6; } if test -n "$MESSAGINGMENU_SHARP_CFLAGS"; then pkg_cv_MESSAGINGMENU_SHARP_CFLAGS="$MESSAGINGMENU_SHARP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"messagingmenu-sharp\""; } >&5 ($PKG_CONFIG --exists --print-errors "messagingmenu-sharp") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MESSAGINGMENU_SHARP_CFLAGS=`$PKG_CONFIG --cflags "messagingmenu-sharp" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MESSAGINGMENU_SHARP_LIBS"; then pkg_cv_MESSAGINGMENU_SHARP_LIBS="$MESSAGINGMENU_SHARP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"messagingmenu-sharp\""; } >&5 ($PKG_CONFIG --exists --print-errors "messagingmenu-sharp") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MESSAGINGMENU_SHARP_LIBS=`$PKG_CONFIG --libs "messagingmenu-sharp" 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 MESSAGINGMENU_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "messagingmenu-sharp" 2>&1` else MESSAGINGMENU_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "messagingmenu-sharp" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MESSAGINGMENU_SHARP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (messagingmenu-sharp) were not met: $MESSAGINGMENU_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MESSAGINGMENU_SHARP_CFLAGS and MESSAGINGMENU_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables MESSAGINGMENU_SHARP_CFLAGS and MESSAGINGMENU_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else MESSAGINGMENU_SHARP_CFLAGS=$pkg_cv_MESSAGINGMENU_SHARP_CFLAGS MESSAGINGMENU_SHARP_LIBS=$pkg_cv_MESSAGINGMENU_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "x$WITH_MESSAGINGMENU" = "xincluded"; then if test ! -f "$srcdir/lib/messagingmenu-sharp/configure.ac"; then as_fn_error $? "lib/messagingmenu-sharp is empty!" "$LINENO" 5 fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MESSAGING_MENU" >&5 $as_echo_n "checking for MESSAGING_MENU... " >&6; } if test -n "$MESSAGING_MENU_CFLAGS"; then pkg_cv_MESSAGING_MENU_CFLAGS="$MESSAGING_MENU_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"messaging-menu\""; } >&5 ($PKG_CONFIG --exists --print-errors "messaging-menu") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MESSAGING_MENU_CFLAGS=`$PKG_CONFIG --cflags "messaging-menu" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MESSAGING_MENU_LIBS"; then pkg_cv_MESSAGING_MENU_LIBS="$MESSAGING_MENU_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"messaging-menu\""; } >&5 ($PKG_CONFIG --exists --print-errors "messaging-menu") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MESSAGING_MENU_LIBS=`$PKG_CONFIG --libs "messaging-menu" 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 MESSAGING_MENU_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "messaging-menu" 2>&1` else MESSAGING_MENU_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "messaging-menu" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MESSAGING_MENU_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (messaging-menu) were not met: $MESSAGING_MENU_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables MESSAGING_MENU_CFLAGS and MESSAGING_MENU_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables MESSAGING_MENU_CFLAGS and MESSAGING_MENU_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else MESSAGING_MENU_CFLAGS=$pkg_cv_MESSAGING_MENU_CFLAGS MESSAGING_MENU_LIBS=$pkg_cv_MESSAGING_MENU_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO_SHARP" >&5 $as_echo_n "checking for GIO_SHARP... " >&6; } if test -n "$GIO_SHARP_CFLAGS"; then pkg_cv_GIO_SHARP_CFLAGS="$GIO_SHARP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-sharp-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gio-sharp-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_SHARP_CFLAGS=`$PKG_CONFIG --cflags "gio-sharp-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GIO_SHARP_LIBS"; then pkg_cv_GIO_SHARP_LIBS="$GIO_SHARP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-sharp-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gio-sharp-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_SHARP_LIBS=`$PKG_CONFIG --libs "gio-sharp-2.0" 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 GIO_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gio-sharp-2.0" 2>&1` else GIO_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gio-sharp-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GIO_SHARP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gio-sharp-2.0) were not met: $GIO_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GIO_SHARP_CFLAGS and GIO_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables GIO_SHARP_CFLAGS and GIO_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GIO_SHARP_CFLAGS=$pkg_cv_GIO_SHARP_CFLAGS GIO_SHARP_LIBS=$pkg_cv_GIO_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi GIO_SHARP_LIBS=`$PKG_CONFIG --variable=Libraries gio-sharp-2.0` GIO_SHARP_FILES="gio-sharp.dll" ac_configure_args="$ac_configure_args CSC=$MCS" subdirs="$subdirs lib/messagingmenu-sharp" MESSAGINGMENU_SHARP_FILES="messagingmenu-sharp.dll" fi if test "x$WITH_MESSAGINGMENU" = "xincluded"; then WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE= WITH_MESSAGINGMENU_SHARP_INCLUDED_FALSE='#' else WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE='#' WITH_MESSAGINGMENU_SHARP_INCLUDED_FALSE= fi # Check whether --with-indicate was given. if test "${with_indicate+set}" = set; then : withval=$with_indicate; else with_indicate=auto fi WITH_INDICATE=$with_indicate if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicate-sharp-0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicate-sharp-0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then INDICATE_SHARP_SUPPORT=yes else INDICATE_SHARP_SUPPORT=no fi if test "x$WITH_INDICATE" = "xauto" -a "x$WITH_MESSAGINGMENU" != "xno"; then WITH_INDICATE=no fi if test "x$WITH_INDICATE" = "xauto"; then WITH_INDICATE=$INDICATE_SHARP_SUPPORT fi if test "x$WITH_INDICATE" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for INDICATE_SHARP" >&5 $as_echo_n "checking for INDICATE_SHARP... " >&6; } if test -n "$INDICATE_SHARP_CFLAGS"; then pkg_cv_INDICATE_SHARP_CFLAGS="$INDICATE_SHARP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicate-sharp-0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicate-sharp-0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_INDICATE_SHARP_CFLAGS=`$PKG_CONFIG --cflags "indicate-sharp-0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$INDICATE_SHARP_LIBS"; then pkg_cv_INDICATE_SHARP_LIBS="$INDICATE_SHARP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"indicate-sharp-0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "indicate-sharp-0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_INDICATE_SHARP_LIBS=`$PKG_CONFIG --libs "indicate-sharp-0.1" 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 INDICATE_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "indicate-sharp-0.1" 2>&1` else INDICATE_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "indicate-sharp-0.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$INDICATE_SHARP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (indicate-sharp-0.1) were not met: $INDICATE_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables INDICATE_SHARP_CFLAGS and INDICATE_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables INDICATE_SHARP_CFLAGS and INDICATE_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else INDICATE_SHARP_CFLAGS=$pkg_cv_INDICATE_SHARP_CFLAGS INDICATE_SHARP_LIBS=$pkg_cv_INDICATE_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi # Check whether --with-notify was given. if test "${with_notify+set}" = set; then : withval=$with_notify; else with_notify=auto fi WITH_NOTIFY=$with_notify if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"notify-sharp\""; } >&5 ($PKG_CONFIG --exists --print-errors "notify-sharp") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then NOTIFY_SHARP_SUPPORT=yes else NOTIFY_SHARP_SUPPORT=no fi if test "x$WITH_NOTIFY" = "xauto"; then WITH_NOTIFY=$NOTIFY_SHARP_SUPPORT fi if test "x$WITH_NOTIFY" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NOTIFY_SHARP" >&5 $as_echo_n "checking for NOTIFY_SHARP... " >&6; } if test -n "$NOTIFY_SHARP_CFLAGS"; then pkg_cv_NOTIFY_SHARP_CFLAGS="$NOTIFY_SHARP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"notify-sharp\""; } >&5 ($PKG_CONFIG --exists --print-errors "notify-sharp") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NOTIFY_SHARP_CFLAGS=`$PKG_CONFIG --cflags "notify-sharp" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$NOTIFY_SHARP_LIBS"; then pkg_cv_NOTIFY_SHARP_LIBS="$NOTIFY_SHARP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"notify-sharp\""; } >&5 ($PKG_CONFIG --exists --print-errors "notify-sharp") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NOTIFY_SHARP_LIBS=`$PKG_CONFIG --libs "notify-sharp" 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 NOTIFY_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "notify-sharp" 2>&1` else NOTIFY_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "notify-sharp" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$NOTIFY_SHARP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (notify-sharp) were not met: $NOTIFY_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NOTIFY_SHARP_CFLAGS and NOTIFY_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables NOTIFY_SHARP_CFLAGS and NOTIFY_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else NOTIFY_SHARP_CFLAGS=$pkg_cv_NOTIFY_SHARP_CFLAGS NOTIFY_SHARP_LIBS=$pkg_cv_NOTIFY_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi # Check whether --with-dbus was given. if test "${with_dbus+set}" = set; then : withval=$with_dbus; else with_dbus=auto fi WITH_DBUS=$with_dbus if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then DBUS_SHARP1_SUPPORT=yes else DBUS_SHARP1_SUPPORT=no fi if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then DBUS_SHARP2_SUPPORT=yes else DBUS_SHARP2_SUPPORT=no fi if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then NDESK_DBUS_SUPPORT=yes else NDESK_DBUS_SUPPORT=no fi if test "x$WITH_DBUS" = "xauto"; then if test "x$DBUS_SHARP1_SUPPORT" = "xyes"; then WITH_DBUS=$DBUS_SHARP1_SUPPORT elif test "x$DBUS_SHARP2_SUPPORT" = "xyes"; then WITH_DBUS=$DBUS_SHARP2_SUPPORT else WITH_DBUS=$NDESK_DBUS_SUPPORT fi fi if test "x$WITH_DBUS" = "xyes"; then if test "x$DBUS_SHARP2_SUPPORT" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS_SHARP" >&5 $as_echo_n "checking for DBUS_SHARP... " >&6; } if test -n "$DBUS_SHARP_CFLAGS"; then pkg_cv_DBUS_SHARP_CFLAGS="$DBUS_SHARP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_CFLAGS=`$PKG_CONFIG --cflags "dbus-sharp-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$DBUS_SHARP_LIBS"; then pkg_cv_DBUS_SHARP_LIBS="$DBUS_SHARP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_LIBS=`$PKG_CONFIG --libs "dbus-sharp-2.0" 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 DBUS_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dbus-sharp-2.0" 2>&1` else DBUS_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dbus-sharp-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DBUS_SHARP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (dbus-sharp-2.0) were not met: $DBUS_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables DBUS_SHARP_CFLAGS and DBUS_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables DBUS_SHARP_CFLAGS and DBUS_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else DBUS_SHARP_CFLAGS=$pkg_cv_DBUS_SHARP_CFLAGS DBUS_SHARP_LIBS=$pkg_cv_DBUS_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS_SHARP_GLIB" >&5 $as_echo_n "checking for DBUS_SHARP_GLIB... " >&6; } if test -n "$DBUS_SHARP_GLIB_CFLAGS"; then pkg_cv_DBUS_SHARP_GLIB_CFLAGS="$DBUS_SHARP_GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_GLIB_CFLAGS=`$PKG_CONFIG --cflags "dbus-sharp-glib-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$DBUS_SHARP_GLIB_LIBS"; then pkg_cv_DBUS_SHARP_GLIB_LIBS="$DBUS_SHARP_GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_GLIB_LIBS=`$PKG_CONFIG --libs "dbus-sharp-glib-2.0" 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 DBUS_SHARP_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dbus-sharp-glib-2.0" 2>&1` else DBUS_SHARP_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dbus-sharp-glib-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DBUS_SHARP_GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (dbus-sharp-glib-2.0) were not met: $DBUS_SHARP_GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables DBUS_SHARP_GLIB_CFLAGS and DBUS_SHARP_GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables DBUS_SHARP_GLIB_CFLAGS and DBUS_SHARP_GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else DBUS_SHARP_GLIB_CFLAGS=$pkg_cv_DBUS_SHARP_GLIB_CFLAGS DBUS_SHARP_GLIB_LIBS=$pkg_cv_DBUS_SHARP_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi DBUS_LIBS="$DBUS_SHARP_LIBS $DBUS_SHARP_GLIB_LIBS" CSC_FLAGS+=" -define:IPC_DBUS -define:DBUS_SHARP" elif test "x$DBUS_SHARP1_SUPPORT" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS_SHARP" >&5 $as_echo_n "checking for DBUS_SHARP... " >&6; } if test -n "$DBUS_SHARP_CFLAGS"; then pkg_cv_DBUS_SHARP_CFLAGS="$DBUS_SHARP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_CFLAGS=`$PKG_CONFIG --cflags "dbus-sharp-1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$DBUS_SHARP_LIBS"; then pkg_cv_DBUS_SHARP_LIBS="$DBUS_SHARP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_LIBS=`$PKG_CONFIG --libs "dbus-sharp-1.0" 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 DBUS_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dbus-sharp-1.0" 2>&1` else DBUS_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dbus-sharp-1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DBUS_SHARP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (dbus-sharp-1.0) were not met: $DBUS_SHARP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables DBUS_SHARP_CFLAGS and DBUS_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables DBUS_SHARP_CFLAGS and DBUS_SHARP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else DBUS_SHARP_CFLAGS=$pkg_cv_DBUS_SHARP_CFLAGS DBUS_SHARP_LIBS=$pkg_cv_DBUS_SHARP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS_SHARP_GLIB" >&5 $as_echo_n "checking for DBUS_SHARP_GLIB... " >&6; } if test -n "$DBUS_SHARP_GLIB_CFLAGS"; then pkg_cv_DBUS_SHARP_GLIB_CFLAGS="$DBUS_SHARP_GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-glib-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-glib-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_GLIB_CFLAGS=`$PKG_CONFIG --cflags "dbus-sharp-glib-1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$DBUS_SHARP_GLIB_LIBS"; then pkg_cv_DBUS_SHARP_GLIB_LIBS="$DBUS_SHARP_GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-sharp-glib-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-sharp-glib-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DBUS_SHARP_GLIB_LIBS=`$PKG_CONFIG --libs "dbus-sharp-glib-1.0" 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 DBUS_SHARP_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "dbus-sharp-glib-1.0" 2>&1` else DBUS_SHARP_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "dbus-sharp-glib-1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$DBUS_SHARP_GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (dbus-sharp-glib-1.0) were not met: $DBUS_SHARP_GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables DBUS_SHARP_GLIB_CFLAGS and DBUS_SHARP_GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables DBUS_SHARP_GLIB_CFLAGS and DBUS_SHARP_GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else DBUS_SHARP_GLIB_CFLAGS=$pkg_cv_DBUS_SHARP_GLIB_CFLAGS DBUS_SHARP_GLIB_LIBS=$pkg_cv_DBUS_SHARP_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi DBUS_LIBS="$DBUS_SHARP_LIBS $DBUS_SHARP_GLIB_LIBS" CSC_FLAGS+=" -define:IPC_DBUS -define:DBUS_SHARP" else # fallback to ndesk-dbus pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NDESK_DBUS" >&5 $as_echo_n "checking for NDESK_DBUS... " >&6; } if test -n "$NDESK_DBUS_CFLAGS"; then pkg_cv_NDESK_DBUS_CFLAGS="$NDESK_DBUS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NDESK_DBUS_CFLAGS=`$PKG_CONFIG --cflags "ndesk-dbus-1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$NDESK_DBUS_LIBS"; then pkg_cv_NDESK_DBUS_LIBS="$NDESK_DBUS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NDESK_DBUS_LIBS=`$PKG_CONFIG --libs "ndesk-dbus-1.0" 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 NDESK_DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ndesk-dbus-1.0" 2>&1` else NDESK_DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ndesk-dbus-1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$NDESK_DBUS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (ndesk-dbus-1.0) were not met: $NDESK_DBUS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NDESK_DBUS_CFLAGS and NDESK_DBUS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables NDESK_DBUS_CFLAGS and NDESK_DBUS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else NDESK_DBUS_CFLAGS=$pkg_cv_NDESK_DBUS_CFLAGS NDESK_DBUS_LIBS=$pkg_cv_NDESK_DBUS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NDESK_DBUS_GLIB" >&5 $as_echo_n "checking for NDESK_DBUS_GLIB... " >&6; } if test -n "$NDESK_DBUS_GLIB_CFLAGS"; then pkg_cv_NDESK_DBUS_GLIB_CFLAGS="$NDESK_DBUS_GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-glib-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-glib-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NDESK_DBUS_GLIB_CFLAGS=`$PKG_CONFIG --cflags "ndesk-dbus-glib-1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$NDESK_DBUS_GLIB_LIBS"; then pkg_cv_NDESK_DBUS_GLIB_LIBS="$NDESK_DBUS_GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ndesk-dbus-glib-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ndesk-dbus-glib-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_NDESK_DBUS_GLIB_LIBS=`$PKG_CONFIG --libs "ndesk-dbus-glib-1.0" 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 NDESK_DBUS_GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ndesk-dbus-glib-1.0" 2>&1` else NDESK_DBUS_GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ndesk-dbus-glib-1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$NDESK_DBUS_GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (ndesk-dbus-glib-1.0) were not met: $NDESK_DBUS_GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables NDESK_DBUS_GLIB_CFLAGS and NDESK_DBUS_GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables NDESK_DBUS_GLIB_CFLAGS and NDESK_DBUS_GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else NDESK_DBUS_GLIB_CFLAGS=$pkg_cv_NDESK_DBUS_GLIB_CFLAGS NDESK_DBUS_GLIB_LIBS=$pkg_cv_NDESK_DBUS_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi DBUS_LIBS="$NDESK_DBUS_LIBS $NDESK_DBUS_GLIB_LIBS" CSC_FLAGS+=" -define:IPC_DBUS -define:NDESK_DBUS" fi fi # Check whether --with-gtkspell was given. if test "${with_gtkspell+set}" = set; then : withval=$with_gtkspell; else with_gtkspell=auto fi WITH_GTKSPELL=$with_gtkspell if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then GTKSPELL_SUPPORT=yes else GTKSPELL_SUPPORT=no fi if test "x$WITH_GTKSPELL" = "xauto"; then WITH_GTKSPELL=$GTKSPELL_SUPPORT fi if test "x$WITH_GTKSPELL" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKSPELL" >&5 $as_echo_n "checking for GTKSPELL... " >&6; } if test -n "$GTKSPELL_CFLAGS"; then pkg_cv_GTKSPELL_CFLAGS="$GTKSPELL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell-2.0 >= 2.0.9\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell-2.0 >= 2.0.9") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSPELL_CFLAGS=`$PKG_CONFIG --cflags "gtkspell-2.0 >= 2.0.9" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKSPELL_LIBS"; then pkg_cv_GTKSPELL_LIBS="$GTKSPELL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell-2.0 >= 2.0.9\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell-2.0 >= 2.0.9") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSPELL_LIBS=`$PKG_CONFIG --libs "gtkspell-2.0 >= 2.0.9" 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 GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtkspell-2.0 >= 2.0.9" 2>&1` else GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtkspell-2.0 >= 2.0.9" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKSPELL_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtkspell-2.0 >= 2.0.9) were not met: $GTKSPELL_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKSPELL_CFLAGS and GTKSPELL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables GTKSPELL_CFLAGS and GTKSPELL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTKSPELL_CFLAGS=$pkg_cv_GTKSPELL_CFLAGS GTKSPELL_LIBS=$pkg_cv_GTKSPELL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi # Engines # Check whether --enable-engine-irc was given. if test "${enable_engine_irc+set}" = set; then : enableval=$enable_engine_irc; ENABLE_ENGINE_IRC=$enableval else ENABLE_ENGINE_IRC=yes fi if test "x$ENABLE_ENGINE_IRC" != "xno"; then # Extract the first word of "xbuild", so it can be a program name with args. set dummy xbuild; 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_XBUILD+:} false; then : $as_echo_n "(cached) " >&6 else case $XBUILD in [\\/]* | ?:[\\/]*) ac_cv_path_XBUILD="$XBUILD" # 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_XBUILD="$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 test -z "$ac_cv_path_XBUILD" && ac_cv_path_XBUILD="no" ;; esac fi XBUILD=$ac_cv_path_XBUILD if test -n "$XBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XBUILD" >&5 $as_echo "$XBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XBUILD" = "xno"; then as_fn_error $? "You need to install xbuild for irc support" "$LINENO" 5 fi if test ! -f "$srcdir/lib/SmartIrc4net/SmartIrc4net.csproj"; then as_fn_error $? "lib/SmartIrc4net is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System Mono.Posix " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done fi if test "x$ENABLE_ENGINE_IRC" = "xyes"; then ENABLE_ENGINE_IRC_TRUE= ENABLE_ENGINE_IRC_FALSE='#' else ENABLE_ENGINE_IRC_TRUE='#' ENABLE_ENGINE_IRC_FALSE= fi # Check whether --enable-engine-campfire was given. if test "${enable_engine_campfire+set}" = set; then : enableval=$enable_engine_campfire; ENABLE_ENGINE_CAMPFIRE=$enableval else ENABLE_ENGINE_CAMPFIRE=yes fi if test "x$ENABLE_ENGINE_CAMPFIRE" = "xyes"; then ENABLE_ENGINE_CAMPFIRE_TRUE= ENABLE_ENGINE_CAMPFIRE_FALSE='#' else ENABLE_ENGINE_CAMPFIRE_TRUE='#' ENABLE_ENGINE_CAMPFIRE_FALSE= fi # Check whether --enable-engine-xmpp was given. if test "${enable_engine_xmpp+set}" = set; then : enableval=$enable_engine_xmpp; ENABLE_ENGINE_XMPP=$enableval else ENABLE_ENGINE_XMPP=yes fi if test "x$ENABLE_ENGINE_XMPP" != "xno"; then # Extract the first word of "xbuild", so it can be a program name with args. set dummy xbuild; 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_XBUILD+:} false; then : $as_echo_n "(cached) " >&6 else case $XBUILD in [\\/]* | ?:[\\/]*) ac_cv_path_XBUILD="$XBUILD" # 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_XBUILD="$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 test -z "$ac_cv_path_XBUILD" && ac_cv_path_XBUILD="no" ;; esac fi XBUILD=$ac_cv_path_XBUILD if test -n "$XBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XBUILD" >&5 $as_echo "$XBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XBUILD" = "xno"; then as_fn_error $? "You need to install xbuild for XMPP support" "$LINENO" 5 fi if test ! -f "$srcdir/lib/agsxmpp/agsxmpp/agsxmpp.csproj"; then as_fn_error $? "lib/agsxmpp is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Core Mono.Posix System.Xml " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done fi if test "x$ENABLE_ENGINE_XMPP" = "xyes"; then ENABLE_ENGINE_XMPP_TRUE= ENABLE_ENGINE_XMPP_FALSE='#' else ENABLE_ENGINE_XMPP_TRUE='#' ENABLE_ENGINE_XMPP_FALSE= fi if test ! -f "$srcdir/lib/StarkSoftProxy/StarkSoftProxy.csproj"; then as_fn_error $? "lib/StarkSoftProxy is empty!" "$LINENO" 5 fi # Check whether --enable-engine-twitter was given. if test "${enable_engine_twitter+set}" = set; then : enableval=$enable_engine_twitter; ENABLE_ENGINE_TWITTER=$enableval else ENABLE_ENGINE_TWITTER=yes fi if test "x$ENABLE_ENGINE_TWITTER" != "xno"; then # Extract the first word of "xbuild", so it can be a program name with args. set dummy xbuild; 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_XBUILD+:} false; then : $as_echo_n "(cached) " >&6 else case $XBUILD in [\\/]* | ?:[\\/]*) ac_cv_path_XBUILD="$XBUILD" # 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_XBUILD="$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 test -z "$ac_cv_path_XBUILD" && ac_cv_path_XBUILD="no" ;; esac fi XBUILD=$ac_cv_path_XBUILD if test -n "$XBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XBUILD" >&5 $as_echo "$XBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XBUILD" = "xno"; then as_fn_error $? "You need to install xbuild for Twitter support" "$LINENO" 5 fi # compiling Json.NET with the C# compiler of Mono 2.4 will result in # a endless loop with eating all memory :/ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mono >= 2.6" >&5 $as_echo_n "checking for Mono >= 2.6... " >&6; } if $PKG_CONFIG 'mono >= 2.6'; 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; } as_fn_error $? "You need Mono 2.6 or later for Twitter support" "$LINENO" 5 fi if test ! -f "$srcdir/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.csproj"; then as_fn_error $? "lib/Newtonsoft.Json is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Core System.Data System.Runtime.Serialization System.Web System.Xml System.Xml.Linq " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done if test ! -f "$srcdir/lib/Twitterizer/Twitterizer2/Twitterizer2.csproj"; then as_fn_error $? "lib/Twitterizer is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Configuration System.Core System.Data System.Drawing System.Web System.Web.Extensions System.Xml System.Xml.Linq " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done fi if test "x$ENABLE_ENGINE_TWITTER" = "xyes"; then ENABLE_ENGINE_TWITTER_TRUE= ENABLE_ENGINE_TWITTER_FALSE='#' else ENABLE_ENGINE_TWITTER_TRUE='#' ENABLE_ENGINE_TWITTER_FALSE= fi # Check whether --with-twitter-api-key was given. if test "${with_twitter_api_key+set}" = set; then : withval=$with_twitter_api_key; else with_twitter_api_key="60QV2qQx9cS7y1BJDbgAA|2VgD6qQKddsF5HYQ0TrRgs3tFTnCwDONBmRlTmG658" fi twitter_api_key=$with_twitter_api_key # Check whether --enable-engine-jabbr was given. if test "${enable_engine_jabbr+set}" = set; then : enableval=$enable_engine_jabbr; ENABLE_ENGINE_JABBR=$enableval else ENABLE_ENGINE_JABBR=yes fi if test "x$ENABLE_ENGINE_JABBR" != "xno"; then # Extract the first word of "xbuild", so it can be a program name with args. set dummy xbuild; 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_XBUILD+:} false; then : $as_echo_n "(cached) " >&6 else case $XBUILD in [\\/]* | ?:[\\/]*) ac_cv_path_XBUILD="$XBUILD" # 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_XBUILD="$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 test -z "$ac_cv_path_XBUILD" && ac_cv_path_XBUILD="no" ;; esac fi XBUILD=$ac_cv_path_XBUILD if test -n "$XBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XBUILD" >&5 $as_echo "$XBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XBUILD" = "xno"; then as_fn_error $? "You need to install xbuild for JabbR support" "$LINENO" 5 fi # compiling Json.NET with the C# compiler of Mono 2.4 will result in # a endless loop with eating all memory :/ # SignalR.Client requires System.Threading.Tasks which is part of .NET 4.0 # thus Mono 2.10 with dmcs is required! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mono >= 2.10" >&5 $as_echo_n "checking for Mono >= 2.10... " >&6; } if $PKG_CONFIG 'mono >= 2.10'; 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; } as_fn_error $? "You need Mono 2.10 or later for JabbR support (or use --disable-engine-jabbr)" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 4.0 compiler" >&5 $as_echo_n "checking for 4.0 compiler... " >&6; } if test "x$CLI_RUNTIME" = "x2.0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "You need to compile with a 4.0 compiler (dmcs) for JabbR support (or use --disable-engine-jabbr)" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if test ! -f "$srcdir/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.csproj"; then as_fn_error $? "lib/Newtonsoft.Json is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Core System.Data System.Runtime.Serialization System.Web System.Xml System.Xml.Linq " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done if test ! -f "$srcdir/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Microsoft.AspNet.SignalR.Client.csproj"; then as_fn_error $? "lib/SignalR is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Core " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done if test ! -f "$srcdir/lib/JabbR/JabbR.Client/JabbR.Client.csproj"; then as_fn_error $? "lib/JabbR is empty!" "$LINENO" 5 fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System System.Core System.Data System.Data.DataSetExtensions System.Xml System.Xml.Linq " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done fi if test "x$ENABLE_ENGINE_JABBR" = "xyes"; then ENABLE_ENGINE_JABBR_TRUE= ENABLE_ENGINE_JABBR_FALSE='#' else ENABLE_ENGINE_JABBR_TRUE='#' ENABLE_ENGINE_JABBR_FALSE= fi # MessageBuffer tool if $PKG_CONFIG 'mono >= 2.6'; then MSG_BUFFER_COMPILER_FLAGS+=" -platform:x86" fi # Server if $PKG_CONFIG 'mono >= 2.6'; then SERVER_COMPILER_FLAGS+=" -platform:x86" fi # Frontends # Check whether --enable-frontend-gnome was given. if test "${enable_frontend_gnome+set}" = set; then : enableval=$enable_frontend_gnome; ENABLE_FRONTEND_GNOME=$enableval else ENABLE_FRONTEND_GNOME=yes fi if test "x$ENABLE_FRONTEND_GNOME" != "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB_SHARP_20" >&5 $as_echo_n "checking for GLIB_SHARP_20... " >&6; } if test -n "$GLIB_SHARP_20_CFLAGS"; then pkg_cv_GLIB_SHARP_20_CFLAGS="$GLIB_SHARP_20_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_SHARP_20_CFLAGS=`$PKG_CONFIG --cflags "glib-sharp-2.0 >= 2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_SHARP_20_LIBS"; then pkg_cv_GLIB_SHARP_20_LIBS="$GLIB_SHARP_20_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_SHARP_20_LIBS=`$PKG_CONFIG --libs "glib-sharp-2.0 >= 2.8" 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 GLIB_SHARP_20_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-sharp-2.0 >= 2.8" 2>&1` else GLIB_SHARP_20_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-sharp-2.0 >= 2.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_SHARP_20_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-sharp-2.0 >= 2.8) were not met: $GLIB_SHARP_20_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_SHARP_20_CFLAGS and GLIB_SHARP_20_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables GLIB_SHARP_20_CFLAGS and GLIB_SHARP_20_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_SHARP_20_CFLAGS=$pkg_cv_GLIB_SHARP_20_CFLAGS GLIB_SHARP_20_LIBS=$pkg_cv_GLIB_SHARP_20_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_SHARP_20" >&5 $as_echo_n "checking for GTK_SHARP_20... " >&6; } if test -n "$GTK_SHARP_20_CFLAGS"; then pkg_cv_GTK_SHARP_20_CFLAGS="$GTK_SHARP_20_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-2.0 >= 2.12.39\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-sharp-2.0 >= 2.12.39") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_SHARP_20_CFLAGS=`$PKG_CONFIG --cflags "gtk-sharp-2.0 >= 2.12.39" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_SHARP_20_LIBS"; then pkg_cv_GTK_SHARP_20_LIBS="$GTK_SHARP_20_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-sharp-2.0 >= 2.12.39\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-sharp-2.0 >= 2.12.39") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_SHARP_20_LIBS=`$PKG_CONFIG --libs "gtk-sharp-2.0 >= 2.12.39" 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 GTK_SHARP_20_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk-sharp-2.0 >= 2.12.39" 2>&1` else GTK_SHARP_20_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk-sharp-2.0 >= 2.12.39" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_SHARP_20_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk-sharp-2.0 >= 2.12.39) were not met: $GTK_SHARP_20_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_SHARP_20_CFLAGS and GTK_SHARP_20_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables GTK_SHARP_20_CFLAGS and GTK_SHARP_20_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_SHARP_20_CFLAGS=$pkg_cv_GTK_SHARP_20_CFLAGS GTK_SHARP_20_LIBS=$pkg_cv_GTK_SHARP_20_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLADE_SHARP_20" >&5 $as_echo_n "checking for GLADE_SHARP_20... " >&6; } if test -n "$GLADE_SHARP_20_CFLAGS"; then pkg_cv_GLADE_SHARP_20_CFLAGS="$GLADE_SHARP_20_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glade-sharp-2.0 >= 2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glade-sharp-2.0 >= 2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLADE_SHARP_20_CFLAGS=`$PKG_CONFIG --cflags "glade-sharp-2.0 >= 2.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLADE_SHARP_20_LIBS"; then pkg_cv_GLADE_SHARP_20_LIBS="$GLADE_SHARP_20_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glade-sharp-2.0 >= 2.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "glade-sharp-2.0 >= 2.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLADE_SHARP_20_LIBS=`$PKG_CONFIG --libs "glade-sharp-2.0 >= 2.8" 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 GLADE_SHARP_20_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glade-sharp-2.0 >= 2.8" 2>&1` else GLADE_SHARP_20_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glade-sharp-2.0 >= 2.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLADE_SHARP_20_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glade-sharp-2.0 >= 2.8) were not met: $GLADE_SHARP_20_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLADE_SHARP_20_CFLAGS and GLADE_SHARP_20_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables GLADE_SHARP_20_CFLAGS and GLADE_SHARP_20_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLADE_SHARP_20_CFLAGS=$pkg_cv_GLADE_SHARP_20_CFLAGS GLADE_SHARP_20_LIBS=$pkg_cv_GLADE_SHARP_20_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-sharp version >= 2.10" >&5 $as_echo_n "checking for gtk-sharp version >= 2.10... " >&6; } if $PKG_CONFIG 'gtk-sharp-2.0 >= 2.10'; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define GTK_SHARP_2_10 1" >>confdefs.h FRONTEND_GNOME_COMPILER_FLAGS+=" -define:GTK_SHARP_2_10" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System.Drawing " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done if test "x$WITH_MESSAGINGMENU" = "xsystem"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:MESSAGING_MENU_SHARP" fi if test "x$WITH_MESSAGINGMENU" = "xincluded"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:MESSAGING_MENU_SHARP" fi if test "x$WITH_INDICATE" = "xyes"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:INDICATE_SHARP" fi if test "x$WITH_NOTIFY" = "xyes"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:NOTIFY_SHARP" fi if test "x$WITH_GTKSPELL" = "xyes"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:GTKSPELL" fi if $PKG_CONFIG 'mono >= 2.6'; then FRONTEND_GNOME_COMPILER_FLAGS+=" -platform:x86" fi ENABLE_FRONTEND_GNOME_IRC=$ENABLE_ENGINE_IRC; ENABLE_FRONTEND_GNOME_TWITTER=$ENABLE_ENGINE_TWITTER; ENABLE_FRONTEND_GNOME_XMPP=$ENABLE_ENGINE_XMPP; fi if test "x$ENABLE_FRONTEND_GNOME" = "xyes"; then ENABLE_FRONTEND_GNOME_TRUE= ENABLE_FRONTEND_GNOME_FALSE='#' else ENABLE_FRONTEND_GNOME_TRUE='#' ENABLE_FRONTEND_GNOME_FALSE= fi if test "x$ENABLE_FRONTEND_GNOME_IRC" = "xyes"; then ENABLE_FRONTEND_GNOME_IRC_TRUE= ENABLE_FRONTEND_GNOME_IRC_FALSE='#' else ENABLE_FRONTEND_GNOME_IRC_TRUE='#' ENABLE_FRONTEND_GNOME_IRC_FALSE= fi if test "x$ENABLE_FRONTEND_GNOME_TWITTER" = "xyes"; then ENABLE_FRONTEND_GNOME_TWITTER_TRUE= ENABLE_FRONTEND_GNOME_TWITTER_FALSE='#' else ENABLE_FRONTEND_GNOME_TWITTER_TRUE='#' ENABLE_FRONTEND_GNOME_TWITTER_FALSE= fi if test "x$ENABLE_FRONTEND_GNOME_XMPP" = "xyes"; then ENABLE_FRONTEND_GNOME_XMPP_TRUE= ENABLE_FRONTEND_GNOME_XMPP_FALSE='#' else ENABLE_FRONTEND_GNOME_XMPP_TRUE='#' ENABLE_FRONTEND_GNOME_XMPP_FALSE= fi # Check whether --enable-frontend-stfl was given. if test "${enable_frontend_stfl+set}" = set; then : enableval=$enable_frontend_stfl; ENABLE_FRONTEND_STFL=$enableval else ENABLE_FRONTEND_STFL=yes fi if test "x$(uname)" = "xDarwin"; then ENABLE_FRONTEND_STFL=no fi if test "x$ENABLE_FRONTEND_STFL" != "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for STFL" >&5 $as_echo_n "checking for STFL... " >&6; } if test -n "$STFL_CFLAGS"; then pkg_cv_STFL_CFLAGS="$STFL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"stfl >= 0.21\""; } >&5 ($PKG_CONFIG --exists --print-errors "stfl >= 0.21") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_STFL_CFLAGS=`$PKG_CONFIG --cflags "stfl >= 0.21" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$STFL_LIBS"; then pkg_cv_STFL_LIBS="$STFL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"stfl >= 0.21\""; } >&5 ($PKG_CONFIG --exists --print-errors "stfl >= 0.21") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_STFL_LIBS=`$PKG_CONFIG --libs "stfl >= 0.21" 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 STFL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "stfl >= 0.21" 2>&1` else STFL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "stfl >= 0.21" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$STFL_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (stfl >= 0.21) were not met: $STFL_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables STFL_CFLAGS and STFL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "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. Alternatively, you may set the environment variables STFL_CFLAGS and STFL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else STFL_CFLAGS=$pkg_cv_STFL_CFLAGS STFL_LIBS=$pkg_cv_STFL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if false; then ENABLE_STATIC_STFL_TRUE= ENABLE_STATIC_STFL_FALSE='#' else ENABLE_STATIC_STFL_TRUE='#' ENABLE_STATIC_STFL_FALSE= fi if test "x$ENABLE_FRONTEND_STFL" = "xyes"; then ENABLE_FRONTEND_STFL_TRUE= ENABLE_FRONTEND_STFL_FALSE='#' else ENABLE_FRONTEND_STFL_TRUE='#' ENABLE_FRONTEND_STFL_FALSE= fi # Check whether --enable-frontend-curses was given. if test "${enable_frontend_curses+set}" = set; then : enableval=$enable_frontend_curses; ENABLE_FRONTEND_CURSES=$enableval else ENABLE_FRONTEND_CURSES=no fi if test "x$ENABLE_FRONTEND_CURSES" != "xno"; then # TODO: check deps as_fn_error $? "Ncurses frontend not supported (yet)" "$LINENO" 5 fi if test "x$ENABLE_FRONTEND_CURSES" = "xyes"; then ENABLE_FRONTEND_CURSES_TRUE= ENABLE_FRONTEND_CURSES_FALSE='#' else ENABLE_FRONTEND_CURSES_TRUE='#' ENABLE_FRONTEND_CURSES_FALSE= fi # Check whether --enable-frontend-swf was given. if test "${enable_frontend_swf+set}" = set; then : enableval=$enable_frontend_swf; ENABLE_FRONTEND_SWF=$enableval else ENABLE_FRONTEND_SWF=no fi if test "x$ENABLE_FRONTEND_SWF" != "xno"; then CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo " System.Windows.Forms " | cut -d, -f2- | sed 's/\,/ /g'); do { $as_echo "$as_me:${as_lineno-$LINENO}: checking Mono GAC for $ASM.dll" >&5 $as_echo_n "checking Mono GAC for $ASM.dll... " >&6; } found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "missing required Mono assembly: $ASM.dll" "$LINENO" 5 fi done fi if test "x$ENABLE_FRONTEND_SWF" = "xyes"; then ENABLE_FRONTEND_SWF_TRUE= ENABLE_FRONTEND_SWF_FALSE='#' else ENABLE_FRONTEND_SWF_TRUE='#' ENABLE_FRONTEND_SWF_FALSE= fi # Check whether --enable-frontend-wpf was given. if test "${enable_frontend_wpf+set}" = set; then : enableval=$enable_frontend_wpf; ENABLE_FRONTEND_WPF=$enableval else ENABLE_FRONTEND_WPF=no fi if test "x$ENABLE_FRONTEND_WPF" != "xno"; then # TODO: check deps as_fn_error $? "WPF frontend not supported (yet)" "$LINENO" 5 fi if test "x$ENABLE_FRONTEND_WPF" = "xyes"; then ENABLE_FRONTEND_WPF_TRUE= ENABLE_FRONTEND_WPF_FALSE='#' else ENABLE_FRONTEND_WPF_TRUE='#' ENABLE_FRONTEND_WPF_FALSE= fi # Check whether --enable-frontend-test was given. if test "${enable_frontend_test+set}" = set; then : enableval=$enable_frontend_test; ENABLE_FRONTEND_TEST=$enableval else ENABLE_FRONTEND_TEST=no fi if test "x$ENABLE_FRONTEND_TEST" = "xyes"; then ENABLE_FRONTEND_TEST_TRUE= ENABLE_FRONTEND_TEST_FALSE='#' else ENABLE_FRONTEND_TEST_TRUE='#' ENABLE_FRONTEND_TEST_FALSE= fi ac_config_files="$ac_config_files Makefile src/Makefile src/AssemblyVersion.cs src/smuxi-win32.nsis src/Common/Makefile src/Common/Defines.cs src/Common/smuxi-common.pc src/Engine/Makefile src/Engine/smuxi-engine.pc src/Engine-IRC/Makefile src/Engine-IRC/smuxi-engine-irc.pc src/Engine-JabbR/Makefile src/Engine-JabbR/smuxi-engine-jabbr.pc src/Engine-Twitter/Makefile src/Engine-XMPP/Makefile src/Engine-XMPP/smuxi-engine-xmpp.pc src/Engine-Campfire/Makefile src/Engine-MessageBuffer/Makefile src/Engine-MessageBuffer/smuxi-message-buffer src/Server/Makefile src/Server/smuxi-server src/Frontend/Makefile src/Frontend/smuxi-frontend.pc src/Frontend-GNOME/Makefile src/Frontend-GNOME/smuxi-frontend-gnome src/Frontend-GNOME-IRC/Makefile src/Frontend-GNOME-Twitter/Makefile src/Frontend-GNOME-XMPP/Makefile src/Frontend-Curses/Makefile src/Frontend-Curses/smuxi-frontend-curses src/Frontend-STFL/Makefile src/Frontend-STFL/smuxi-frontend-stfl src/Frontend-STFL/STFL/Makefile src/Frontend-SWF/Makefile src/Frontend-SWF/smuxi-frontend-swf src/Frontend-Test/Makefile src/Frontend-Test/smuxi-frontend-test lib/Makefile lib/osx/Info.plist po/Makefile.in po-Engine/Makefile.in po-Engine-Campfire/Makefile.in po-Engine-IRC/Makefile.in po-Engine-JabbR/Makefile.in po-Engine-Twitter/Makefile.in po-Engine-XMPP/Makefile.in po-Engine-MessageBuffer/Makefile.in po-Server/Makefile.in po-Frontend/Makefile.in po-Frontend-GNOME/Makefile.in po-Frontend-GNOME-IRC/Makefile.in po-Frontend-GNOME-Twitter/Makefile.in po-Frontend-GNOME-XMPP/Makefile.in" 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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" 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 "${ENABLE_RELEASE_TRUE}" && test -z "${ENABLE_RELEASE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_RELEASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DEBUG_TRUE}" && test -z "${ENABLE_DEBUG_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_DEBUG_TRUE}" && test -z "${ENABLE_DEBUG_FALSE}"; then as_fn_error $? "conditional \"ENABLE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_RELEASE_TRUE}" && test -z "${ENABLE_RELEASE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_RELEASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_LOG4NET_TRUE}" && test -z "${BUNDLE_LOG4NET_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_LOG4NET\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_LOG4NET_TRUE}" && test -z "${BUNDLE_LOG4NET_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_LOG4NET\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TESTS_TRUE}" && test -z "${ENABLE_TESTS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TESTS_TRUE}" && test -z "${ENABLE_TESTS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_NINI_TRUE}" && test -z "${BUNDLE_NINI_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_NINI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_NINI_BLOB_TRUE}" && test -z "${BUNDLE_NINI_BLOB_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_NINI_BLOB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_NINI_TRUE}" && test -z "${BUNDLE_NINI_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_NINI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_NINI_BLOB_TRUE}" && test -z "${BUNDLE_NINI_BLOB_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_NINI_BLOB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_DB4O_TRUE}" && test -z "${BUNDLE_DB4O_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_DB4O\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUNDLE_DB4O_TRUE}" && test -z "${BUNDLE_DB4O_FALSE}"; then as_fn_error $? "conditional \"BUNDLE_DB4O\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE}" && test -z "${WITH_MESSAGINGMENU_SHARP_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"WITH_MESSAGINGMENU_SHARP_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ENGINE_IRC_TRUE}" && test -z "${ENABLE_ENGINE_IRC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ENGINE_IRC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ENGINE_CAMPFIRE_TRUE}" && test -z "${ENABLE_ENGINE_CAMPFIRE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ENGINE_CAMPFIRE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ENGINE_XMPP_TRUE}" && test -z "${ENABLE_ENGINE_XMPP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ENGINE_XMPP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ENGINE_TWITTER_TRUE}" && test -z "${ENABLE_ENGINE_TWITTER_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ENGINE_TWITTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ENGINE_JABBR_TRUE}" && test -z "${ENABLE_ENGINE_JABBR_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ENGINE_JABBR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_GNOME_TRUE}" && test -z "${ENABLE_FRONTEND_GNOME_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_GNOME\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_GNOME_IRC_TRUE}" && test -z "${ENABLE_FRONTEND_GNOME_IRC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_GNOME_IRC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_GNOME_TWITTER_TRUE}" && test -z "${ENABLE_FRONTEND_GNOME_TWITTER_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_GNOME_TWITTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_GNOME_XMPP_TRUE}" && test -z "${ENABLE_FRONTEND_GNOME_XMPP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_GNOME_XMPP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_STATIC_STFL_TRUE}" && test -z "${ENABLE_STATIC_STFL_FALSE}"; then as_fn_error $? "conditional \"ENABLE_STATIC_STFL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_STFL_TRUE}" && test -z "${ENABLE_FRONTEND_STFL_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_STFL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_CURSES_TRUE}" && test -z "${ENABLE_FRONTEND_CURSES_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_CURSES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_SWF_TRUE}" && test -z "${ENABLE_FRONTEND_SWF_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_SWF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_WPF_TRUE}" && test -z "${ENABLE_FRONTEND_WPF_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_WPF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_FRONTEND_TEST_TRUE}" && test -z "${ENABLE_FRONTEND_TEST_FALSE}"; then as_fn_error $? "conditional \"ENABLE_FRONTEND_TEST\" 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 smuxi $as_me 1.1, 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" 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 Configuration files: $config_files 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="\\ smuxi config.status 1.1 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;; --he | --h | --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 # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _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 "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/AssemblyVersion.cs") CONFIG_FILES="$CONFIG_FILES src/AssemblyVersion.cs" ;; "src/smuxi-win32.nsis") CONFIG_FILES="$CONFIG_FILES src/smuxi-win32.nsis" ;; "src/Common/Makefile") CONFIG_FILES="$CONFIG_FILES src/Common/Makefile" ;; "src/Common/Defines.cs") CONFIG_FILES="$CONFIG_FILES src/Common/Defines.cs" ;; "src/Common/smuxi-common.pc") CONFIG_FILES="$CONFIG_FILES src/Common/smuxi-common.pc" ;; "src/Engine/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine/Makefile" ;; "src/Engine/smuxi-engine.pc") CONFIG_FILES="$CONFIG_FILES src/Engine/smuxi-engine.pc" ;; "src/Engine-IRC/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine-IRC/Makefile" ;; "src/Engine-IRC/smuxi-engine-irc.pc") CONFIG_FILES="$CONFIG_FILES src/Engine-IRC/smuxi-engine-irc.pc" ;; "src/Engine-JabbR/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine-JabbR/Makefile" ;; "src/Engine-JabbR/smuxi-engine-jabbr.pc") CONFIG_FILES="$CONFIG_FILES src/Engine-JabbR/smuxi-engine-jabbr.pc" ;; "src/Engine-Twitter/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine-Twitter/Makefile" ;; "src/Engine-XMPP/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine-XMPP/Makefile" ;; "src/Engine-XMPP/smuxi-engine-xmpp.pc") CONFIG_FILES="$CONFIG_FILES src/Engine-XMPP/smuxi-engine-xmpp.pc" ;; "src/Engine-Campfire/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine-Campfire/Makefile" ;; "src/Engine-MessageBuffer/Makefile") CONFIG_FILES="$CONFIG_FILES src/Engine-MessageBuffer/Makefile" ;; "src/Engine-MessageBuffer/smuxi-message-buffer") CONFIG_FILES="$CONFIG_FILES src/Engine-MessageBuffer/smuxi-message-buffer" ;; "src/Server/Makefile") CONFIG_FILES="$CONFIG_FILES src/Server/Makefile" ;; "src/Server/smuxi-server") CONFIG_FILES="$CONFIG_FILES src/Server/smuxi-server" ;; "src/Frontend/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend/Makefile" ;; "src/Frontend/smuxi-frontend.pc") CONFIG_FILES="$CONFIG_FILES src/Frontend/smuxi-frontend.pc" ;; "src/Frontend-GNOME/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-GNOME/Makefile" ;; "src/Frontend-GNOME/smuxi-frontend-gnome") CONFIG_FILES="$CONFIG_FILES src/Frontend-GNOME/smuxi-frontend-gnome" ;; "src/Frontend-GNOME-IRC/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-GNOME-IRC/Makefile" ;; "src/Frontend-GNOME-Twitter/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-GNOME-Twitter/Makefile" ;; "src/Frontend-GNOME-XMPP/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-GNOME-XMPP/Makefile" ;; "src/Frontend-Curses/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-Curses/Makefile" ;; "src/Frontend-Curses/smuxi-frontend-curses") CONFIG_FILES="$CONFIG_FILES src/Frontend-Curses/smuxi-frontend-curses" ;; "src/Frontend-STFL/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-STFL/Makefile" ;; "src/Frontend-STFL/smuxi-frontend-stfl") CONFIG_FILES="$CONFIG_FILES src/Frontend-STFL/smuxi-frontend-stfl" ;; "src/Frontend-STFL/STFL/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-STFL/STFL/Makefile" ;; "src/Frontend-SWF/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-SWF/Makefile" ;; "src/Frontend-SWF/smuxi-frontend-swf") CONFIG_FILES="$CONFIG_FILES src/Frontend-SWF/smuxi-frontend-swf" ;; "src/Frontend-Test/Makefile") CONFIG_FILES="$CONFIG_FILES src/Frontend-Test/Makefile" ;; "src/Frontend-Test/smuxi-frontend-test") CONFIG_FILES="$CONFIG_FILES src/Frontend-Test/smuxi-frontend-test" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "lib/osx/Info.plist") CONFIG_FILES="$CONFIG_FILES lib/osx/Info.plist" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "po-Engine/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine/Makefile.in" ;; "po-Engine-Campfire/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine-Campfire/Makefile.in" ;; "po-Engine-IRC/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine-IRC/Makefile.in" ;; "po-Engine-JabbR/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine-JabbR/Makefile.in" ;; "po-Engine-Twitter/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine-Twitter/Makefile.in" ;; "po-Engine-XMPP/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine-XMPP/Makefile.in" ;; "po-Engine-MessageBuffer/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Engine-MessageBuffer/Makefile.in" ;; "po-Server/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Server/Makefile.in" ;; "po-Frontend/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Frontend/Makefile.in" ;; "po-Frontend-GNOME/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Frontend-GNOME/Makefile.in" ;; "po-Frontend-GNOME-IRC/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Frontend-GNOME-IRC/Makefile.in" ;; "po-Frontend-GNOME-Twitter/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Frontend-GNOME-Twitter/Makefile.in" ;; "po-Frontend-GNOME-XMPP/Makefile.in") CONFIG_FILES="$CONFIG_FILES po-Frontend-GNOME-XMPP/Makefile.in" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) 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_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" eval set X " :F $CONFIG_FILES :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 ;; :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 "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; 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 # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -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=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 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 cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done 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 if test "x$CLI_RUNTIME" = "x"; then CLI_RUNTIME=default fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Configuration summary for $PACKAGE_NAME $VERSION ($DIST_VERSION) * Installation prefix: $prefix * Build profile: $PROFILE * Compiler: $CSC * Target CLI runtime: $CLI_RUNTIME * Tests: $FOUND_NUNIT * Engines ------- Core: (sqlite: built-in, db4o: $WITH_DB4O) IRC: $ENABLE_ENGINE_IRC XMPP: $ENABLE_ENGINE_XMPP Twitter: $ENABLE_ENGINE_TWITTER Campfire: $ENABLE_ENGINE_CAMPFIRE JabbR: $ENABLE_ENGINE_JABBR * Frontends --------- GNOME: $ENABLE_FRONTEND_GNOME (IRC: $ENABLE_FRONTEND_GNOME_IRC XMPP: $ENABLE_FRONTEND_GNOME_XMPP Twitter: $ENABLE_FRONTEND_GNOME_TWITTER) + Messaging Menu (indicate: Ubuntu <= 12.04, messaging-menu: Ubuntu >= 12.04) - indicate: $WITH_INDICATE - messaging-menu: $WITH_MESSAGINGMENU + Notifications: $WITH_NOTIFY + Spell Checking: $WITH_GTKSPELL + D-Bus: $WITH_DBUS Ncurses: $ENABLE_FRONTEND_CURSES STFL: $ENABLE_FRONTEND_STFL SWF (WinForms): $ENABLE_FRONTEND_SWF WPF: $ENABLE_FRONTEND_WPF Test: $ENABLE_FRONTEND_TEST " >&5 $as_echo " Configuration summary for $PACKAGE_NAME $VERSION ($DIST_VERSION) * Installation prefix: $prefix * Build profile: $PROFILE * Compiler: $CSC * Target CLI runtime: $CLI_RUNTIME * Tests: $FOUND_NUNIT * Engines ------- Core: (sqlite: built-in, db4o: $WITH_DB4O) IRC: $ENABLE_ENGINE_IRC XMPP: $ENABLE_ENGINE_XMPP Twitter: $ENABLE_ENGINE_TWITTER Campfire: $ENABLE_ENGINE_CAMPFIRE JabbR: $ENABLE_ENGINE_JABBR * Frontends --------- GNOME: $ENABLE_FRONTEND_GNOME (IRC: $ENABLE_FRONTEND_GNOME_IRC XMPP: $ENABLE_FRONTEND_GNOME_XMPP Twitter: $ENABLE_FRONTEND_GNOME_TWITTER) + Messaging Menu (indicate: Ubuntu <= 12.04, messaging-menu: Ubuntu >= 12.04) - indicate: $WITH_INDICATE - messaging-menu: $WITH_MESSAGINGMENU + Notifications: $WITH_NOTIFY + Spell Checking: $WITH_GTKSPELL + D-Bus: $WITH_DBUS Ncurses: $ENABLE_FRONTEND_CURSES STFL: $ENABLE_FRONTEND_STFL SWF (WinForms): $ENABLE_FRONTEND_SWF WPF: $ENABLE_FRONTEND_WPF Test: $ENABLE_FRONTEND_TEST " >&6; } smuxi-1.1/po-Frontend-GNOME-Twitter/0000775000175000017500000000000014011526504020014 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Frontend-GNOME-Twitter/LINGUAS0000664000175000017500000000012114011526464021040 0ustar00meebeymeebey00000000000000ca cs da de el es fa fi fr hr hu id lt nl oc pl pt pt_BR ro sl sr sv te tr zh_CN smuxi-1.1/po-Frontend-GNOME-Twitter/cs.po0000664000175000017500000000217014011526464020766 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-06 15:08+0000\n" "Last-Translator: RavuAlHemio \n" "Language-Team: Czech (http://www.transifex.com/projects/p/smuxi/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Přímá zpráva" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Časový přehled" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Přestat následovat" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Následovat" smuxi-1.1/po-Frontend-GNOME-Twitter/zh_CN.po0000664000175000017500000000207314011526464021364 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-13 08:16+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "私信" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "时间线" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "取消关注" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "关注" smuxi-1.1/po-Frontend-GNOME-Twitter/el.po0000664000175000017500000000253014011526464020761 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-24 11:46+0000\n" "PO-Revision-Date: 2015-07-27 12:14+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@lists.gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Άμεσο μήνυμα" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Γραμμή χρόνου" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Διακοπή παρακολούθησης" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Παρακολούθηση" smuxi-1.1/po-Frontend-GNOME-Twitter/ro.po0000664000175000017500000000232314011526464021001 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:21+0000\n" "PO-Revision-Date: 2018-04-05 17:49+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > " "0 && n%100 < 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:57 msgid "Direct Message" msgstr "Mesaj direct" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Timeline" msgstr "Cronologie" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:70 msgid "Unfollow" msgstr "Anulează urmărirea" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:74 msgid "Follow" msgstr "Urmărește" smuxi-1.1/po-Frontend-GNOME-Twitter/fi.po0000664000175000017500000000175614011526464020770 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-05 18:35+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "" smuxi-1.1/po-Frontend-GNOME-Twitter/de.po0000664000175000017500000000216214011526464020752 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Bianca Mix , 2013 # Mirco Bauer , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:05+0100\n" "PO-Revision-Date: 2013-12-11 19:38+0000\n" "Last-Translator: Bianca Mix \n" "Language-Team: German (http://www.transifex.com/projects/p/smuxi/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Direktnachricht" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Zeitachse" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Nicht mehr folgen" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Folgen" smuxi-1.1/po-Frontend-GNOME-Twitter/hu.po0000664000175000017500000000223514011526464020777 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 11:46+0000\n" "PO-Revision-Date: 2015-07-17 17:59+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Közvetlen üzenet" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Idővonal" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Leiratkozás" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Követés" smuxi-1.1/po-Frontend-GNOME-Twitter/fr.po0000664000175000017500000000212014011526464020763 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-13 21:36+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Message privé" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Chronologie" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Se désabonner" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Suivre" smuxi-1.1/po-Frontend-GNOME-Twitter/sr.po0000664000175000017500000000256414011526464021014 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:43+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Непосредна порука" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Временска линија" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Поништи праћење" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Прати" smuxi-1.1/po-Frontend-GNOME-Twitter/sl.po0000664000175000017500000000244614011526464021005 0ustar00meebeymeebey00000000000000#'smuxi/po-Frontend-GNOME-Twitter/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:41+0000\n" "PO-Revision-Date: 2016-03-11 21:41+0000\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Neposredno sporočilo" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Časovnica" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Prekini sledenje" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Sledi" smuxi-1.1/po-Frontend-GNOME-Twitter/pl.po0000664000175000017500000000220414011526464020772 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2015 the smuxi authors. # This file is distributed under the same license as the smuxi package. # Piotr Drąg , 2015. # Aviary.pl , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:54+0200\n" "PO-Revision-Date: 2015-06-12 17:22+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Wiadomość prywatna" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Oś czasu" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Przestań obserwować" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Obserwuj" smuxi-1.1/po-Frontend-GNOME-Twitter/id.po0000664000175000017500000000215314011526464020756 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:43+0000\n" "PO-Revision-Date: 2017-04-20 13:58+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Pesan Langsung" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Lini masa" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Berhenti Ikuti" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Ikuti" smuxi-1.1/po-Frontend-GNOME-Twitter/es.po0000664000175000017500000000205214011526464020767 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2013-12-10 18:53+0000\n" "Last-Translator: Matías Bellone\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Mensaje directo" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Línea temporal" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Dejar de seguir" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Seguir" smuxi-1.1/po-Frontend-GNOME-Twitter/Makefile.in.in0000664000175000017500000001600514011526464022475 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Frontend-GNOME-Twitter/pt.po0000664000175000017500000000234414011526464021007 0ustar00meebeymeebey00000000000000# Portuguese translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Tiago S. , 2015. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-19 12:40+0000\n" "PO-Revision-Date: 2015-11-17 10:17+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Mensagem direta" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Cronologia" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Deixar de seguir" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Seguir" smuxi-1.1/po-Frontend-GNOME-Twitter/nl.po0000664000175000017500000000210214011526464020765 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:05+0100\n" "PO-Revision-Date: 2013-12-26 14:49+0000\n" "Last-Translator: Jeroen Baten \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Privéberichten" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Tijdslijn" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Ontvolgen" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Volgen" smuxi-1.1/po-Frontend-GNOME-Twitter/lt.po0000664000175000017500000000212614011526464021001 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2014-12-17 14:45+0000\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Tiesioginis Pranešimas" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Laiko Skalė" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Nustoti Sekti" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Sekti" smuxi-1.1/po-Frontend-GNOME-Twitter/oc.po0000664000175000017500000000230214011526464020757 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # Cédric Valmary (totenoc.eu) , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&k" "eywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:47+0000\n" "PO-Revision-Date: 2016-03-16 19:42+0200\n" "Last-Translator: Cédric Valmary (totenoc.eu) \n" "Language-Team: Tot En Òc\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Messatge privat" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Cronologia" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Se desabonar" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Seguir" smuxi-1.1/po-Frontend-GNOME-Twitter/POTFILES.in0000664000175000017500000000006314011526464021575 0ustar00meebeymeebey00000000000000src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs smuxi-1.1/po-Frontend-GNOME-Twitter/POTFILES.skip0000664000175000017500000000055714011526464022145 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-MSNP/ src/Engine-OSCAR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Frontend-GNOME-Twitter/te.po0000664000175000017500000000175514011526464021001 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:05+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "" smuxi-1.1/po-Frontend-GNOME-Twitter/ca.po0000664000175000017500000000221614011526464020745 0ustar00meebeymeebey00000000000000# Catalan translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Robert Antoni Buj Gelonch , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-11-29 14:30+0000\n" "PO-Revision-Date: 2015-11-30 00:01+0100\n" "Last-Translator: Robert Antoni Buj Gelonch \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Missatge directe" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Línia temporal" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Deixa de seguir" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Segueix" smuxi-1.1/po-Frontend-GNOME-Twitter/sv.po0000664000175000017500000000207414011526464021014 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:05+0100\n" "PO-Revision-Date: 2013-12-10 13:30+0000\n" "Last-Translator: Martin Bagge \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Direktmeddelande" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Tidslinje" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Avfölj" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Följ" smuxi-1.1/po-Frontend-GNOME-Twitter/tr.po0000664000175000017500000000210314011526464021002 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:35+0200\n" "PO-Revision-Date: 2014-11-02 06:43+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Direkt Mesaj" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Zaman Akışı" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Takibi Bırak" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Takip Et" smuxi-1.1/po-Frontend-GNOME-Twitter/pt_BR.po0000664000175000017500000000234614011526464021374 0ustar00meebeymeebey00000000000000# Brazilian Portuguese for smuxi-Frontend-GNOME-Twitter # Copyright (C) 2016 THE smuxi'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Rafael Fontenelle , 2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:47+0000\n" "PO-Revision-Date: 2016-03-09 13:11-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Mensagem direta" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Linha do tempo" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Parar de seguir" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Seguir" smuxi-1.1/po-Frontend-GNOME-Twitter/fa.po0000664000175000017500000000174714011526464020760 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:05+0100\n" "PO-Revision-Date: 2013-12-05 18:35+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "" smuxi-1.1/po-Frontend-GNOME-Twitter/da.po0000664000175000017500000000221114011526464020741 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:47+0000\n" "PO-Revision-Date: 2013-12-05 19:51+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:52 msgid "Direct Message" msgstr "Direkte besked" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:60 msgid "Timeline" msgstr "Tidslinje" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Unfollow" msgstr "Følg ikke længere" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:69 msgid "Follow" msgstr "Følg" smuxi-1.1/po-Frontend-GNOME-Twitter/hr.po0000664000175000017500000000221014011526464020765 0ustar00meebeymeebey00000000000000# Croatian translation for smuxi. # Copyright (C) 2020 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2020-09-04 11:36+0000\n" "PO-Revision-Date: 2020-09-19 19:49+0200\n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Last-Translator: gogo \n" "X-Generator: Poedit 2.3\n" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:57 msgid "Direct Message" msgstr "Izravna poruka" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:65 msgid "Timeline" msgstr "Kronologija" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:70 msgid "Unfollow" msgstr "Ne prati" #: ../src/Frontend-GNOME-Twitter/TwitterGroupChatView.cs:74 msgid "Follow" msgstr "Poprati" smuxi-1.1/Makefile.am0000664000175000017500000002352514011472672015367 0ustar00meebeymeebey00000000000000# Engines if ENABLE_ENGINE_CAMPFIRE PO_ENGINE_CAMPFIRE = po-Engine-Campfire endif if ENABLE_ENGINE_IRC PO_ENGINE_IRC = po-Engine-IRC endif if ENABLE_ENGINE_JABBR PO_ENGINE_JABBR = po-Engine-JabbR endif if ENABLE_ENGINE_TWITTER PO_ENGINE_TWITTER = po-Engine-Twitter endif if ENABLE_ENGINE_XMPP PO_ENGINE_XMPP = po-Engine-XMPP endif # Frontends if ENABLE_FRONTEND_GNOME PO_FRONTEND_GNOME = po-Frontend-GNOME endif if ENABLE_FRONTEND_GNOME_IRC PO_FRONTEND_GNOME_IRC = po-Frontend-GNOME-IRC endif if ENABLE_FRONTEND_GNOME_TWITTER PO_FRONTEND_GNOME_TWITTER = po-Frontend-GNOME-Twitter endif if ENABLE_FRONTEND_GNOME_XMPP PO_FRONTEND_GNOME_XMPP = po-Frontend-GNOME-XMPP endif ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} EXTRA_DIST = install-sh \ HACKING.md \ LICENSE \ README.md # HACK: distclean in po/ does not work for some reason DISTCLEANFILES = \ po/POTFILES \ po/Makefile \ po/stamp-it \ po/Makefile.in PODIRS = po \ po-Engine \ po-Engine-MessageBuffer \ $(PO_ENGINE_CAMPFIRE) \ $(PO_ENGINE_IRC) \ $(PO_ENGINE_JABBR) \ $(PO_ENGINE_TWITTER) \ $(PO_ENGINE_XMPP) \ po-Server \ po-Frontend \ $(PO_FRONTEND_GNOME) \ $(PO_FRONTEND_GNOME_IRC) \ $(PO_FRONTEND_GNOME_TWITTER) \ $(PO_FRONTEND_GNOME_XMPP) SUBDIRS = lib \ src \ $(PODIRS) # forcely disable parallel builds export MAKEFLAGS=-j1 update-po: for PODIR in $(PODIRS); do \ echo $$PODIR; \ $(MAKE) -C $$PODIR $@ | egrep -e '(:$$|messages)'; \ done update-pot: for PODIR in $(PODIRS); do \ echo $$PODIR; \ $(MAKE) -C $$PODIR clean; \ $(MAKE) -C $$PODIR check 2>&1 | grep -v 'mismatched quotes at line' 2>&1; \ done pull-transifex: tx pull -f -l ca,cs,da,de,en_GB,es,fa,fi,fr,hr,ko,lt,nb_NO,pl,pt_BR,ru,sk,sv,te,tr,ur,zh_CN push-transifex: tx push -t --skip mail-po: update-po for PODIR in $(PODIRS); do \ echo $$PODIR; \ podebconf-report-po \ --deadline=+14days \ --notdebconf \ --package="Smuxi ($$PODIR)" \ --utf8 \ --from="Mirco Bauer " \ --smtp=booster.qnetp.net \ --podir=$$PODIR \ --langs=cs,es_AR,it,pt; \ done call-po: update-po for PODIR in $(PODIRS); do \ echo $$PODIR; \ podebconf-report-po \ --deadline=+14days \ --notdebconf \ --package="Smuxi ($$PODIR)" \ --utf8 \ --from="Mirco Bauer " \ --smtp=booster.qnetp.net \ --podir=$$PODIR \ --call; \ done install-po: for PODIR in $(PODIRS); do \ $(MAKE) -C $$PODIR install itlocaledir=$(abs_top_builddir)/bin/$(PROFILE)/locale; \ done LIB_DIR = $(top_builddir)/lib BUILD_DIR = $(top_builddir)/bin/$(PROFILE) WIN32_LIB_DIR = $(LIB_DIR)/win32 WIN32_BUILD_DIR = $(top_builddir)/bin-win32 WIN32_ICON_THEME_DIR = $(top_srcdir)/images/Smuxi-Symbolic OSX_LIB_DIR = $(LIB_DIR)/osx OSX_ICON_THEME_DIR = $(top_srcdir)/images/Smuxi-Symbolic OSX_BUILD_DIR = $(top_builddir)/bin-osx OSX_APP_DIR = $(OSX_BUILD_DIR)/Smuxi.app OSX_CONTENTS_DIR = $(OSX_APP_DIR)/Contents OSX_RESOURCES_DIR = $(OSX_CONTENTS_DIR)/Resources OSX_BINARIES_DIR = $(OSX_CONTENTS_DIR)/MacOS LINUX_STATIC_BUILD_DIR = $(top_builddir)/bin-linux-static WIN32_EXE_FILES = \ $(BUILD_DIR)/smuxi-frontend-gnome.exe \ $(BUILD_DIR)/smuxi-server.exe \ $(BUILD_DIR)/smuxi-message-buffer.exe WIN32_FILES = \ $(WIN32_EXE_FILES) \ $(LIB_DIR)/Mono.Data.Sqlite.dll \ $(LIB_DIR)/Mono.Posix.dll \ $(LIB_DIR)/Nini.dll \ $(LIB_DIR)/log4net.dll \ $(WIN32_LIB_DIR)/plink.exe \ $(WIN32_LIB_DIR)/sqlite3.dll \ $(WIN32_LIB_DIR)/fixedsys500c/Fixedsys500c.ttf \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/smuxi-engine-campfire.dll \ $(BUILD_DIR)/smuxi-engine-irc.dll \ $(BUILD_DIR)/smuxi-engine-jabbr.dll \ $(BUILD_DIR)/smuxi-engine-twitter.dll \ $(BUILD_DIR)/smuxi-engine-xmpp.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-irc.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-twitter.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-xmpp.dll \ $(BUILD_DIR)/smuxi-frontend.dll \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll \ $(BUILD_DIR)/Twitterizer2.dll \ $(BUILD_DIR)/Twitterizer2.Streaming.dll \ $(BUILD_DIR)/Newtonsoft.Json.dll \ $(BUILD_DIR)/agsxmpp.dll \ $(BUILD_DIR)/StarkSoftProxy.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll \ $(BUILD_DIR)/ServiceStack.Interfaces.dll \ $(BUILD_DIR)/ServiceStack.Common.dll \ $(BUILD_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(BUILD_DIR)/JabbR.Client.dll \ $(WIN32_LIB_DIR)/smuxi-frontend-gnome.exe.config \ $(WIN32_LIB_DIR)/smuxi-server.exe.config OSX_FILES = \ $(LIB_DIR)/Nini.dll \ $(LIB_DIR)/log4net.dll \ $(BUILD_DIR)/smuxi-frontend-gnome.exe \ $(BUILD_DIR)/smuxi-frontend-gnome.exe.config \ $(BUILD_DIR)/smuxi-frontend-gnome-irc.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-twitter.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-xmpp.dll \ $(BUILD_DIR)/smuxi-server.exe \ $(BUILD_DIR)/smuxi-message-buffer.exe \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/smuxi-engine-campfire.dll \ $(BUILD_DIR)/smuxi-engine-irc.dll \ $(BUILD_DIR)/smuxi-engine-jabbr.dll \ $(BUILD_DIR)/smuxi-engine-twitter.dll \ $(BUILD_DIR)/smuxi-engine-xmpp.dll \ $(BUILD_DIR)/smuxi-frontend.dll \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll \ $(BUILD_DIR)/Twitterizer2.dll \ $(BUILD_DIR)/Twitterizer2.Streaming.dll \ $(BUILD_DIR)/Newtonsoft.Json.dll \ $(BUILD_DIR)/agsxmpp.dll \ $(BUILD_DIR)/StarkSoftProxy.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll \ $(BUILD_DIR)/ServiceStack.Interfaces.dll \ $(BUILD_DIR)/ServiceStack.Common.dll \ $(BUILD_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(BUILD_DIR)/JabbR.Client.dll LINUX_STATIC_FILES = \ $(LIB_DIR)/Mono.Data.Sqlite.dll \ $(LIB_DIR)/Mono.Posix.dll \ /usr/lib/libMonoPosixHelper.so \ $(LIB_DIR)/Nini.dll \ $(LIB_DIR)/log4net.dll \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/smuxi-engine-campfire.dll \ $(BUILD_DIR)/smuxi-engine-irc.dll \ $(BUILD_DIR)/smuxi-engine-jabbr.dll \ $(BUILD_DIR)/smuxi-engine-twitter.dll \ $(BUILD_DIR)/smuxi-engine-xmpp.dll \ $(BUILD_DIR)/smuxi-server.exe.config \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll \ $(BUILD_DIR)/Twitterizer2.dll \ $(BUILD_DIR)/Twitterizer2.Streaming.dll \ $(BUILD_DIR)/Newtonsoft.Json.dll \ $(BUILD_DIR)/agsxmpp.dll \ $(BUILD_DIR)/StarkSoftProxy.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll \ $(BUILD_DIR)/ServiceStack.Interfaces.dll \ $(BUILD_DIR)/ServiceStack.Common.dll \ $(BUILD_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(BUILD_DIR)/JabbR.Client.dll dist-win32: DIST_VERSION=$$(git describe); \ ./autogen.sh --without-indicate --without-messaging-menu --without-notify --without-dbus \ --with-db4o=included \ --with-vendor-package-version="dist-win32 $$DIST_VERSION" $(MAKE) mkdir -p $(WIN32_BUILD_DIR) for FILE in $(WIN32_FILES); do \ cp $$FILE $(WIN32_BUILD_DIR); \ done for PODIR in $(PODIRS); do \ $(MAKE) -C $$PODIR install itlocaledir=$(abs_top_builddir)/$(WIN32_BUILD_DIR)/locale; \ done mkdir -p $(WIN32_BUILD_DIR)/icons cp -r $(WIN32_ICON_THEME_DIR) $(WIN32_BUILD_DIR)/icons makensis $(top_srcdir)/src/smuxi-win32.nsis mv smuxi-win32-setup.exe smuxi-$(VERSION)-win32-setup.exe dist-osx: DIST_VERSION=$$(git describe); \ ./autogen.sh --without-indicate --without-messaging-menu --without-notify --without-dbus \ --with-db4o=included \ --with-vendor-package-version="dist-osx $$DIST_VERSION" $(MAKE) mkdir -p $(OSX_BINARIES_DIR) $(OSX_RESOURCES_DIR) cp $(OSX_LIB_DIR)/Info.plist $(OSX_CONTENTS_DIR) cp $(OSX_LIB_DIR)/smuxi $(OSX_BINARIES_DIR) cp $(OSX_LIB_DIR)/smuxi-server $(OSX_BINARIES_DIR) cp $(OSX_LIB_DIR)/smuxi.icns $(OSX_RESOURCES_DIR) for FILE in $(OSX_FILES); do \ cp $$FILE $(OSX_BINARIES_DIR); \ done mkdir -p $(OSX_BINARIES_DIR)/icons cp -r $(OSX_ICON_THEME_DIR) $(OSX_BINARIES_DIR)/icons -rm smuxi-osx.zip cd $(OSX_BUILD_DIR) && zip -r ../smuxi-osx.zip Smuxi.app mv smuxi-osx.zip smuxi-$(VERSION)-osx.zip dist-linux-static: DIST_VERSION=$$(git describe); \ ./autogen.sh --without-indicate --without-messaging-menu --without-notify --without-dbus \ --with-db4o=included \ --with-vendor-package-version="dist-linux-static $$DIST_VERSION" \ --disable-frontend-gnome --disable-frontend-stfl $(MAKE) mkdir -p $(LINUX_STATIC_BUILD_DIR) mkbundle --deps --static -z -L $(BUILD_DIR) \ -o $(LINUX_STATIC_BUILD_DIR)/smuxi-server \ $(BUILD_DIR)/smuxi-server.exe \ $(LIB_DIR)/log4net.dll \ $(LIB_DIR)/Nini.dll \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll for FILE in $(LINUX_STATIC_FILES); do \ cp $$FILE $(LINUX_STATIC_BUILD_DIR); \ done tar -czf smuxi-server-$(VERSION)-linux-$$(uname -m)-static.tar.gz $(LINUX_STATIC_BUILD_DIR) dist-linux-debs: git checkout -- debian/changelog dch -b \ -v "1:$(VERSION)+git-1~$$(date +%Y%m%d%H%M%S).$$(git rev-parse --short=8 HEAD)" \ -D "$$(lsb_release -r -s)" \ "Building git snapshot." dpkg-buildpackage -b -us -uc run: run-gnome run-gnome: all if [ "x$(shell uname)" = "xDarwin" ]; then \ cp lib/Nini.dll bin/debug && cp lib/log4net.dll bin/debug; \ fi; \ cd $(BUILD_DIR) && \ mono --debug ./smuxi-frontend-gnome.exe -d --new-instance run-stfl: all cd $(BUILD_DIR) && \ mono --debug ./smuxi-frontend-stfl.exe -d 2> smuxi-frontend-stfl.err run-server: all cd $(BUILD_DIR) && \ mono --debug ./smuxi-server.exe -d test: src/*-Tests/*.cs* xbuild src/Common-Tests/Common-Tests.csproj xbuild src/Engine-Tests/Engine-Tests.csproj xbuild src/Frontend-Tests/Frontend-Tests.csproj xbuild src/Frontend-GNOME-Tests/Frontend-GNOME-Tests.csproj xbuild src/Frontend-STFL-Tests/Frontend-STFL-Tests.csproj -nunit-console $(BUILD_DIR)/smuxi-common-tests.dll -nunit-console $(BUILD_DIR)/smuxi-engine-tests.dll -nunit-console $(BUILD_DIR)bin/debug/smuxi-frontend-tests.dll -nunit-console $(BUILD_DIR)bin/debug/smuxi-frontend-gnome-tests.dll -nunit-console $(BUILD_DIR)bin/debug/smuxi-frontend-stfl-tests.dll .NOTPARALLEL: .PHONY: test smuxi-1.1/po/0000775000175000017500000000000014011526502013732 5ustar00meebeymeebey00000000000000smuxi-1.1/po/Makefile.in.in0000644000175000017500000001575614011526467016432 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po/POTFILES.in0000664000175000017500000000000014011526464015504 0ustar00meebeymeebey00000000000000smuxi-1.1/po/POTFILES.skip0000664000175000017500000000001714011526464016054 0ustar00meebeymeebey00000000000000src glade lib/ smuxi-1.1/po-Engine-MessageBuffer/0000775000175000017500000000000014011526502017651 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-MessageBuffer/LINGUAS0000664000175000017500000000010514011526464020701 0ustar00meebeymeebey00000000000000cs da de el es fi fr hu id lt nl oc pl pt pt_BR ro sl sr sv tr zh_CN smuxi-1.1/po-Engine-MessageBuffer/cs.po0000664000175000017500000001030714011526464020626 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Ondřej Hošek , 2014 # Marek Černocký , 2016, 2020 # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2020-09-04 11:25+0000\n" "PO-Revision-Date: 2020-11-16 20:11+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Zapnout ladicí informace" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Zobrazit tuto nápovědu" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Neznámá akce: „{0}“" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Chybný příkaz: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Použití: smuxi-message-buffer [volby] akce volby-akce" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Akce:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Volby:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Formát databáze (povolené hodnoty: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Neznámá volba {0}: „{1}“" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Použití: smuxi-message-buffer {0} [volby-akce] cesta_k_databázi" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Cesta, či více cest, k databázi" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "cesta_k_databázi musí být zadána" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Zdrojový formát (povolené hodnoty: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Cílový formát (povolené hodnoty: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Použití: smuxi-message-buffer {0} [volby-akce] zdrojová_databáze… " "cílová_databáze" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Cesta, či více cest, ke zdrojovému souboru" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Cesta k cílovému souboru nebo -/empty pro standardní výstup" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "zdrojová_databáze a cílová_databáze musí být zadány" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "Zdrojový soubor nesmí být prázdný." #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "Zdrojov0 soubory nesmí být prázdné." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Cílová databáze {0} musí být prázdná!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Neznámý formát souboru: „{0}“" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Nepodporovaný typ vyrovnávací paměti: „{0}“" smuxi-1.1/po-Engine-MessageBuffer/zh_CN.po0000664000175000017500000000743714011526464021234 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2014-03-17 08:14+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "启用调试输出" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "显示本帮助" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "用法: smuxi-message-buffer [选项列表] 操作 操作选项列表" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "操作:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "选项:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "未知操作: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "命令行错误: {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "数据库格式 (有效值: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "未知 {0} 选项: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "用法: smuxi-message-buffer {0} [操作选项列表] 数据库路径" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "数据库路径" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "数据库路径必须提供" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "源格式 (有效值: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "目标格式 (有效值: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "用法: smuxi-message-buffer {0} [操作选项列表] 源数据库 目标数据库" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "源文件路径" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "目标文件路径或 -/留空输出到标准输出" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "源数据库与目标数据库均必须提供" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "源文件不能为空。" #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "目标数据库 {0} 必须为空!" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "未知文件格式: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "不支持的缓冲器类型: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/el.po0000664000175000017500000001113614011526464020622 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:41+0000\n" "PO-Revision-Date: 2015-07-20 11:45+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Ενεργοποίηση εξόδου αποσφαλμάτωσης" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Εμφάνιση αυτής της βοήθειας" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Χρήση: smuxi-message-buffer [options] action action-options" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Ενέργειες:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Επιλογές:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Άγνωστη ενέργεια: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Σφάλμα γραμμής εντολών: {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Μορφή βάσης δεδομένων (έγκυρες τιμές: αυτόματο, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Άγνωστη επιλογή του {0}: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Χρήση: smuxi-message-buffer {0} [action-options] db_path" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Διαδρομή βάσης δεδομένων" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "απαιτείται το db_path" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Μορφή προέλευσης (έγκυρες τιμές: αυτόματο, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Μορφή προορισμού (έγκυρες τιμές: αυτόματο, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "" "Χρήση: smuxi-message-buffer {0} [action-options] source_db destination_db" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Διαδρομή αρχείου προέλευσης" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "Διαδρομή αρχείου προορισμού ή -/κενό για τυπική έξοδο" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "απαιτούνται source_db και destination_db" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "Το αρχείο προέλευσης δεν πρέπει να είναι κενό." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Η βάση δεδομένων προορισμού {0} πρέπει να είναι κενή!" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Άγνωστη μορφή αρχείου: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Μη υποστηριζόμενος τύπος ενδιάμεσης μνήμης: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/ro.po0000664000175000017500000001034014011526464020636 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:19+0000\n" "PO-Revision-Date: 2018-04-08 17:23+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 " "&& n%100 < 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Activează rezultat depanare" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Afișează acest ajutor" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Acțiune necunoscută: „{0}”" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Eroare în linia de comandă: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "" "Mod de utilizare: smuxi-message-buffer [opțiuni] action action-" "options" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Acțiuni:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Opțiuni:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Format bază de date (valori valide: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Opțiune {0} necunoscută: „{1}”" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "" "Mod de utilizare: smuxi-message-buffer {0} [action-options] " "db_path" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Căi bază de date" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "este necesar db_path" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Format sursă (valori valide: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Format destinație (valori valide: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Mod de utilizare: smuxi-message-buffer {0} [action-options] " "source_db(s)... destination_db" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Căi fișier sursă" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Calea fișierului destinație sau -/empty pentru stdout" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "sunt necesare source_db și destination_db" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "sourceFile nu trebuie să fie gol." #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "sourceFiles nu trebuie să fie goale." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Baza de date destinație {0} nu trebuie să fie goală!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Format de fișier necunoscut: „{0}”" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Tip de preîncărcare nesuportat: „{0}”" smuxi-1.1/po-Engine-MessageBuffer/fi.po0000664000175000017500000000764114011526464020626 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2015-05-04 05:02+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Kytke debug-ulostulo" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Näytä tämä avustustieto" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Käyttö: smuxi-message-buffer [valinnat] toiminnat toiminto-vaihtoehdot" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Toiminnot:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Vaihtoehdot:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Tuntematon toiminto: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Komentorivin virhe: {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Tietokannan muoto (käytettävät valinnat: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Tuntematon {0} valinta: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Käyttö: smuxi-message-buffer {0} [toimintavaihtoehdot] tietokanta_polku" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Tietokannan polku" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "tietokanta_polku vaaditaan" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Lähteen muoto (kelvolliset arvot: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Kohdemuoto (kelvolliset arvot: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "Käyttö: smuxi-message-buffer {0} [toimintavaihtoehdot] lähde_tietokanta kohde_tietokanta" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Lähdetiedoston polku" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "Kohdetiedoston polku tai -/empty käyttääksesi stdout:ia" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "lähde_tietokanta ja kohde_tietokanta vaaditaan" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "Lähdetiedosto ei saa olla tyhjä." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Kohdetietokannan {0} pitää olla tyhjä!" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Tuntematon tiedostomuoto: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Puskurityyppiä ei tueta: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/de.po0000664000175000017500000001001214011526464020602 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # JB, 2014 # JB, 2014 # Mario Blättermann , 2016-2017 # Mirco Bauer , 2015 # Wasilis Mandratzis-Walz, 2015 # Wasilis Mandratzis-Walz, 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:38+0200\n" "PO-Revision-Date: 2017-10-27 14:09+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: German (http://www.transifex.com/meebey/smuxi/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Aktivieren der Ausgabe zur Fehlerbeseitigung" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Diese Hilfe anzeigen" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Aufruf: smuxi-message-buffer [Optionen] Aktion Aktions-Optionen" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Aktionen:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Optionen:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Unbekannte Aktion: »{0}«" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Befehlszeilenfehler: {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Datenbankformat (gültige Werte: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Unbekannte {0}-Option: »{1}«" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Aufruf: smuxi-message-buffer {0} [Aktions-Optionen] Datenbankpfad" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Datenbankpfad" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "Datenbankpfad wird benötigt" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Quellformat (gültige Werte: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Zielformat (gültige Werte: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "Aufruf: smuxi-message-buffer {0} [Aktions-Optionen] Quelldatenbank Zieldatenbank" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Pfad der Quelldatei" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "Zieldateipfad oder - / leer für Standardausgabe" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "Quelldatenbank und Zieldatenbank werden benötigt" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "Die Quelldatei darf nicht leer sein." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Die Zieldatenbank {0} muss leer sein!" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Unbekanntes Dateiformat: »{0}«" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Nicht unterstützter Puffertyp: »{0}«" smuxi-1.1/po-Engine-MessageBuffer/hu.po0000664000175000017500000001063614011526464020642 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015, 2018 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015, 2018. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:45+0000\n" "PO-Revision-Date: 2018-01-27 09:59+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Hibakeresési kimenet engedélyezése" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Ezen súgó megjelenítése" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Ismeretlen művelet: „{0}”" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Parancssori hiba: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Használat: smuxi-message-buffer [kapcsolók] művelet művelet-kapcsolók" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Műveletek:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Kapcsolók:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Adatbázis-formátum (érvényes értékek: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Ismeretlen {0} kapcsoló: „{1}”" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "" "Használat: smuxi-message-buffer {0} [művelet-kapcsolók] adatbázis_útvonal" #: ../src/Engine-MessageBuffer/Main.cs:150 #| msgid "Database path" msgid "Database path(s)" msgstr "Adatbázis útvonalai" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "Az adatbázis_útvonal kötelező" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Forrásformátum (érvényes értékek: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Célformátum (érvényes értékek: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format #| msgid "" #| "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Használat: smuxi-message-buffer {0} [művelet-kapcsolók] forrás_adatbázisok... " "cél_adatbázis" #: ../src/Engine-MessageBuffer/Main.cs:214 #| msgid "Source file path" msgid "Source file path(s)" msgstr "Forrásfájl útvonalai" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Célfájl útvonala vagy -/üres a szabványos kimenethez" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "A forrás_adatbázis és a cél_adatbázis kötelező" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "A sourceFile nem lehet üres." #: ../src/Engine-MessageBuffer/Main.cs:251 #| msgid "sourceFile must not be empty." msgid "sourceFiles must not be empty." msgstr "A sourceFiles nem lehet üres." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "A(z) {0} céladatbázisnak üresnek kell lennie!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Ismeretlen fájlformátum: „{0}”" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Nem támogatott puffertípus: „{0}”" smuxi-1.1/po-Engine-MessageBuffer/fr.po0000664000175000017500000000772314011526464020640 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2015-05-03 20:22+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Activer la sortie déboggage" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Afficher cette aide" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Utilisation : smuxi-message-buffer [options] action action-options" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Actions : " #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Options : " #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Action inconnue : '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Erreur de ligne de commande : {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Format de base de données (valeurs valides : auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Option {0} inconnue : '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Utilisation : smuxi-message-buffer {0} [action-options] chemin_vers_db" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Chemin vers la base de données" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "chemin_vers_db est requis" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Format source (valeurs valides: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Format de destination (valeurs valides : auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "Utilisation : smuxi-message-buffer {0} [action-options] db_source db_destination" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Chemin vers fichier source" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "Chemin de destination du fichier ou -/vide pour sortie standard (stdout)" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "db_source et db_destination sont obligatoires" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "fichier source ne peut pas être vide." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "La base de données de destination {0} doit être vide !" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Type de fichier : '{0}' inconnu" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Type de tampon non supporté : '{0}'" smuxi-1.1/po-Engine-MessageBuffer/sr.po0000664000175000017500000001203414011526464020644 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright © 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016–2018. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:45+0000\n" "PO-Revision-Date: 2018-02-24 09:06+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: српски \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Project-Style: gnome\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Укључује излаз прочишћавања" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Приказује ову помоћ" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Непозната радња: „{0}“" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Грешка линије наредби: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Употреба: smuxi-message-buffer [опције] радња опције-радње" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Радње:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Опције:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Запис базе података (исправне вредности: „auto“, „db4o“, „sqlite“)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Непозната {0} опција: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Употреба: smuxi-message-buffer {0} [опције-радње] путања_бп" #: ../src/Engine-MessageBuffer/Main.cs:150 #| msgid "Database path" msgid "Database path(s)" msgstr "Путања базе података" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "путања базе података је потребна" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Запис извора (исправне вредности: „auto“, „db4o“, „sqlite“)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Запис одредишта (исправне вредности: „auto“, „db4o“, „sqlite“)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format #| msgid "" #| "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Употреба: smuxi-message-buffer {0} [опције-радње] извор_бп... одредиште_бп" #: ../src/Engine-MessageBuffer/Main.cs:214 #| msgid "Source file path" msgid "Source file path(s)" msgstr "Путања изворне датотеке" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Путања одредишне датотеке или „-/empty“ за стнд_излаз" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "изворна_бп и одредишна_бп су потребне" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "Изворна датотека не сме бити празна." #: ../src/Engine-MessageBuffer/Main.cs:251 #| msgid "sourceFile must not be empty." msgid "sourceFiles must not be empty." msgstr "Изворне датотеке не смеју бити празне." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Одредишна база података {0} мора бити празна!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Непознат запис датотеке: „{0}“" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Неподржана врста међумеморије: „{0}“" smuxi-1.1/po-Engine-MessageBuffer/sl.po0000664000175000017500000000650114011526464020640 0ustar00meebeymeebey00000000000000# 'smuxi/po-Engine-MessageBuffer/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:40+0000\n" "PO-Revision-Date: 2016-03-11 22:56+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 " "|| n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Pokaže to pomoč" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Dejanja:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Možnosti:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "" smuxi-1.1/po-Engine-MessageBuffer/pl.po0000664000175000017500000001054014011526464020633 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2015-2017 the smuxi authors. # This file is distributed under the same license as the smuxi package. # Piotr Drąg , 2015-2017. # Aviary.pl , 2015-2017. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-05 15:12+0100\n" "PO-Revision-Date: 2017-11-05 15:15+0100\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Włącza wyjście debugowania" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Wyświetla tę pomoc" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Nieznane działanie: „{0}”" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Błąd wiersza poleceń: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Użycie: smuxi-message-buffer [opcje] działanie opcje-działania" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Działania:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Opcje:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "" "Format bazy danych (prawidłowe wartości: „auto” (automatycznie), „db4o”, " "„sqlite”)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Nieznana opcja {0}: „{1}”" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "" "Użycie: smuxi-message-buffer {0} [opcje-działania] ścieżka_do_bazy_danych" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Ścieżki do baz danych" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "ścieżka_do_bazy_danych jest wymagana" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "" "Format źródłowy (prawidłowe wartości: „auto” (automatycznie), „db4o”, " "„sqlite”)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "" "Format docelowy (prawidłowe wartości: „auto” (automatycznie), „db4o”, " "„sqlite”)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Użycie: smuxi-message-buffer {0} [opcje-działania] źródłowe_bazy_danych… " "docelowa_baza_danych" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Ścieżki do plików źródłowych" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "" "Ścieżka do pliku docelowego lub „-/empty”, aby użyć standardowego wyjścia" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "źródłowa_baza_danych w docelowa_baza_danych są wymagane" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "Plik źródłowy nie może być pusty." #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "Pliki źródłowe nie mogą być puste." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Docelowa baza danych {0} musi być pusta." #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Nieznany format pliku: „{0}”" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Nieobsługiwany typ bufora: „{0}”" smuxi-1.1/po-Engine-MessageBuffer/id.po0000664000175000017500000001000214011526464020605 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:45+0000\n" "PO-Revision-Date: 2017-11-30 14:00+0700\n" "Last-Translator: Kukuh Syafaat \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Aktifkan keluaran debug" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Tampilkan bantuan ini" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Tindakan tak dikenal: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Kesalahan baris perintah: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Penggunaan: smuxi-message-buffer [options] action-option" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Aksi:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Opsi:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Format basis data (nilai yang valid: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Pilihan {0} tidak dikenal: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Usage: smuxi-message-buffer {0} [action-options] db_path" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Path basis data" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "db_path diperlukan" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Format sumber (nilai yang valid: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Format tujuan (nilai yang valid: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Penggunaan: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Path berkas sumber" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Path berkas tujuan atau -/kosong untuk stdout" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "Source_db dan destination_db diperlukan" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "sourceFile tidak boleh kosong" #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "sourceFile tidak boleh kosong." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Basis data tujuan {0} harus kosong!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Format berkas tidak dikenal: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Jenis penyangga yang tidak didukung: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/es.po0000664000175000017500000001075014011526464020632 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2014 # Matías Bellone, 2014 # Daniel Mustieles , 2018-2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-02-01 13:35+0000\n" "PO-Revision-Date: 2019-02-19 15:55+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: es \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 3.31.90\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Activar salida de depuración" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Mostrar esta ayuda" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Acción desconocida: «{0}»" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Error de línea de órdenes: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Uso: smuxi-message-buffer [opciones] acción opciones-de-acción" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Acciones:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Opciones:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Formato de base de datos (valores válidos: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Opción de {0} desconocida: «{1}»" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "" "Uso: smuxi-message-buffer {0} [opciones-de-acción] ruta_a_base_de_datos" #: ../src/Engine-MessageBuffer/Main.cs:150 #| msgid "Database path" msgid "Database path(s)" msgstr "Rutas a bases de datos" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "ruta_a_base_de_datos es obligatorio" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Formato de origen (valores válidos: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Formato de destino (valores válidos: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format #| msgid "" #| "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Uso: smuxi-message-buffer {0} [opciones-acción] basesdedatos_origen " "basededatos_destino" #: ../src/Engine-MessageBuffer/Main.cs:214 #| msgid "Source file path" msgid "Source file path(s)" msgstr "Rutas a archivos de origen" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "" "Ruta al archivo de destino o utilice «-» o ningún valor para la salida " "estándar" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "basededatos_origen y basededatos_destino son obligatorios" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "El archivo de origen no puede no puede estar vacío." #: ../src/Engine-MessageBuffer/Main.cs:251 #| msgid "sourceFile must not be empty." msgid "sourceFiles must not be empty." msgstr "Los archivos de origen no pueden estar vacíos." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "¡La base de datos de destino {0} debe estar vacía!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Formato de archivo desconocido: «{0}»" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Tipo de búfer incompatible: «{0}»" smuxi-1.1/po-Engine-MessageBuffer/Makefile.in.in0000664000175000017500000001577114011526464022345 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_MSG_BUFFER@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine-MessageBuffer/pt.po0000664000175000017500000001006714011526464020647 0ustar00meebeymeebey00000000000000# Portuguese translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Tiago S. , 2015. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-11-11 14:24+0000\n" "PO-Revision-Date: 2015-11-17 08:30+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Ativar saída de depuração" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Mostrar esta ajuda" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Uso: smuxi-message-buffer [opções] ação opções-da-ação" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Ações:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Opções:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Ação desconhecida: \"{0}\"" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Erro da linha de comandos: {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Formato de base de dados (valores válidos: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Opção desconhecida {0}: \"{1}\"" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Uso: smuxi-message-buffer {0} [opções-da-ação] caminho_da_bd" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Caminho da base de dados" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "É necessário db_path" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Formato origem (valores válidos: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Formato destino (valores válidos: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "Uso: smuxi-message-buffer {0} [opções-da-ação] bd_origem db_saída" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Caminho do ficheiro origem" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "Caminho do ficheiro destino ou -/vazio para saída stdout" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "bd_origem e bd_destino são necessários" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "FicheiroOrigem não pode estar vazio." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "A base de dados de destino {0} tem de estar vazia!" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Formato de ficheiros desconhecido: \"{0}\"" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Tipo de buffer não suportado: \"{0}\"" smuxi-1.1/po-Engine-MessageBuffer/nl.po0000664000175000017500000000764714011526464020647 0ustar00meebeymeebey00000000000000# Dutch translation for smuxi. # Copyright (C) 2019 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Nathan Follens , 2019. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-03-09 18:10+0000\n" "PO-Revision-Date: 2019-03-10 15:04+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Debuguitvoer inschakelen" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Deze hulp tonen" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Onbekende actie: ‘{0}’" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Opdrachtregelfout: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Gebruik: smuxi-message-buffer [opties] actie actie-opties" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Acties:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Opties:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Databaseformaat (geldige waarden: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Onbekende {0}-optie: ‘{1}’" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Gebruik: smuxi-message-buffer {0} [actie-opties] db_pad" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Databasepad(en)" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "db_pad vereist" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Bronformaat (geldige waarden: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Doelformaat (geldige waarden: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Gebruik: smuxi-message-buffer {0} [actie-opties] bron_db(es)… doel_db" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Bronbestandspad(en)" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Doelbestandspad of -/empty voor stdout" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "bron_db en doel_db vereist" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "bronBestand mag niet leeg zijn." #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "bronBestanden mogen niet leeg zijn." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Doeldatabase {0} moet leeg zijn!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Onbekend bestandsformaat: ‘{0}’" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Onbekend buffertype: ‘{0}’" smuxi-1.1/po-Engine-MessageBuffer/lt.po0000664000175000017500000001072014011526464020637 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # aurisc4 , 2018 # Moo, 2014-2016 # Aurimas Černius , 2021. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2020-09-04 11:25+0000\n" "PO-Revision-Date: 2021-01-05 12:50+0200\n" "Last-Translator: Aurimas Černius \n" "Language-Team: Lietuvių \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Gtranslator 3.38.0\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Įjungti derinimo išvestį" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Rodyti šią pagalbą" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Nežinomas veiksmas: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Komandų eilutės klaida: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "" "Naudojimas: smuxi-message-buffer [parametrai] veiksmas veiksmo-parametrai" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Veiksmai:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Parametrai:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Duomenų bazės formatas (teisingos reikšmės: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Nežinomas {0} parametras: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Naudojimas: smuxi-message-buffer {0} [veiksmo-parametrai] db_kelias" #: ../src/Engine-MessageBuffer/Main.cs:150 #| msgid "Database path" msgid "Database path(s)" msgstr "Duomenų bazės kelias (-iai)" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "reikalingas db_kelias" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Šaltinio formatas (teisingos reikšmės: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Paskirties formatas (teisingos reikšmės: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format #| msgid "" #| "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Naudojimas: smuxi-message-buffer {0} [veiksmo-parametrai] šaltinio_db(-" "ės)... paskirties_db" #: ../src/Engine-MessageBuffer/Main.cs:214 #| msgid "Source file path" msgid "Source file path(s)" msgstr "Šaltinio failo kelias (-iai)" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Paskirties failo kelias arba -/empty metodui stdout" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "reikalinga šaltinio_db ir paskirties_db" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "šaltinioFailas negali būti tuščias." #: ../src/Engine-MessageBuffer/Main.cs:251 #| msgid "sourceFile must not be empty." msgid "sourceFiles must not be empty." msgstr "sourceFiles negali būti tuščias." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Paskirties duomenų bazė {0} privalo būti tuščia!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Nežinomas failo formatas: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Nepalaikomas buferio tipas: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/oc.po0000664000175000017500000001012514011526464020620 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # Cédric Valmary (totenoc.eu) , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&k" "eywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 20:05+0000\n" "PO-Revision-Date: 2016-03-17 19:52+0200\n" "Last-Translator: Cédric Valmary (totenoc.eu) \n" "Language-Team: Tot En Òc\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Activar la sortida desbugatge" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Afichar aquesta ajuda" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Utilizacion : smuxi-message-buffer [options] accion action-options" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Accions : " #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Opcions : " #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Accion desconeguda : '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Error de linha de comanda : {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Format de banca de donadas (valors validas : auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Opcion {0} desconeguda : '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Utilizacion : smuxi-message-buffer {0} [action-options] camin_cap_a_db" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Camin cap a la banca de donadas" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "camin_cap _a_db es requesits" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Format font (valors validas: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Format de destinacion (valors validas : auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "" "Utilizacion : smuxi-message-buffer {0} [action-options] db_source " "db_destination" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Camin cap a fichièr font" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "" "Camin de destinacion del fichièr o -/void per sortida estandarda (stdout)" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "db_source e db_destination son obligatòris" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "fichièr font pòt pas èsser void." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "La banca de donadas de destinacion {0} deu èsser voida !" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Tipe de fichièr : '{0}' desconegut" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Tipe de tampon pas suportat : '{0}'" smuxi-1.1/po-Engine-MessageBuffer/POTFILES.in0000664000175000017500000000004114011526464021430 0ustar00meebeymeebey00000000000000src/Engine-MessageBuffer/Main.cs smuxi-1.1/po-Engine-MessageBuffer/POTFILES.skip0000664000175000017500000000046214011526464021777 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-GNOME/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Engine-MessageBuffer/sv.po0000664000175000017500000001015714011526464020654 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2014 # flugsio , 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-02-01 13:35+0000\n" "PO-Revision-Date: 2019-03-13 23:08+0100\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish (http://www.transifex.com/meebey/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Aktivera felsökningsmeddelanden" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Visa den här hjälpen" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Okänd handling: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Kommandoradsfel: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "" "Användning: smuxi-message-buffer [alternativ] handling handlings-alternativ" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Handlingar:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Alternativ:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Databasformat (giltiga värden: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Okänt alternativ för {0}: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Användning: smuxi-message-buffer {0} [handlings-alternativ] db_path" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Databassökväg(ar)" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "db_path är nödvändig" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Källformat (giltiga värden: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Målformat (giltiga värden: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Användning: smuxi-message-buffer {0} [handlings-alternativ] source_db(s)... " "destination_db" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Källfilssökväg(ar)" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Målfilssökväg eller -/empty för stdout" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "source_db och destination_db är nödvändiga" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "sourceFile får inte vara tom." #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "sourceFiles får inte vara tom." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Måldatabas {0} måste vara tom!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Okänt filformat: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Buffertypen stöds inte: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/tr.po0000664000175000017500000001016214011526464020645 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 # Emin Tufan Çetin , 2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-02-01 17:46+0000\n" "PO-Revision-Date: 2019-07-21 17:28+0300\n" "Last-Translator: Emin Tufan Çetin \n" "Language-Team: Türkçe \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 3.32.1\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Hata ayıklama çıktısını etkinleştir" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Yardımı göster" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Bilinmeyen eylem: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Komut satırı hatası: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Kullanım: smuxi-message-buffer [seçenekler] eylem eylem-seçenekleri" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Eylemler:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Seçenekler:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Veritabanı biçimi (geçerli değerler: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Bilinmeyen {0} seçeneği: '{1}'" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Kullanım: smuxi-message-buffer {0} [eylem-seçenekleri] db_path" #: ../src/Engine-MessageBuffer/Main.cs:150 msgid "Database path(s)" msgstr "Veritabanı yolu" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "db_path gereklidir" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Kaynak biçimi (geçerli değerler: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Hedef biçimi (geçerli değerler: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Kullanım: smuxi-message-buffer {0} [eylem-seçenekleri] source_db(ler)... " "destination_db" #: ../src/Engine-MessageBuffer/Main.cs:214 msgid "Source file path(s)" msgstr "Kaynak dosyası yolları" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "Hedef dosya yolu ya da stdout için -/empty (boş)" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "source_db ve destination_db gereklidir" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "kaynakDosya boş olamaz." #: ../src/Engine-MessageBuffer/Main.cs:251 msgid "sourceFiles must not be empty." msgstr "kaynakDosyalar boş olamaz." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Hedef veritabanı {0} boş olmalıdır!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Bilinmeyen dosya biçimi: '{0}'" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Desteklenmeyen arabellek türü: '{0}'" smuxi-1.1/po-Engine-MessageBuffer/pt_BR.po0000664000175000017500000001074114011526464021231 0ustar00meebeymeebey00000000000000# Brazilian Portuguese translation of smuxi-Engine-MessageBuffer # Copyright (C) 2019 smuxi-Engine-MessageBuffer'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Enrico Nicoletto , 2015 # Rafael Fontenelle , 2017-2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-02-01 13:35+0000\n" "PO-Revision-Date: 2019-03-10 11:05-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Portuguese - Brazil \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Gtranslator 3.31.90\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Habilita saída de depuração" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:141 #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Show this help" msgstr "Mostra esta ajuda" #: ../src/Engine-MessageBuffer/Main.cs:88 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Ação desconhecida: \"{0}\"" #: ../src/Engine-MessageBuffer/Main.cs:95 #, csharp-format msgid "Command line error: {0}" msgstr "Erro na linha de comando: {0}" #: ../src/Engine-MessageBuffer/Main.cs:104 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Uso: smuxi-message-buffer [opções] action ação-opções" #: ../src/Engine-MessageBuffer/Main.cs:106 msgid "Actions:" msgstr "Ações:" #: ../src/Engine-MessageBuffer/Main.cs:110 #: ../src/Engine-MessageBuffer/Main.cs:152 #: ../src/Engine-MessageBuffer/Main.cs:217 msgid "Options:" msgstr "Opções:" #: ../src/Engine-MessageBuffer/Main.cs:119 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Formato da base de dados (valores válidos são: auto, db4o e sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:134 #: ../src/Engine-MessageBuffer/Main.cs:198 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Opção {0} desconhecida: \"{1}\"" #: ../src/Engine-MessageBuffer/Main.cs:145 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Uso: smuxi-message-buffer {0} [ação-opções] db_path" #: ../src/Engine-MessageBuffer/Main.cs:150 #| msgid "Database path" msgid "Database path(s)" msgstr "Caminho(s) da base de dados" #: ../src/Engine-MessageBuffer/Main.cs:161 msgid "db_path is required" msgstr "db_path é necessário" #: ../src/Engine-MessageBuffer/Main.cs:175 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Formato de origem (valores válidos são: auto, db4o e sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:183 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Formato de destino (valores válidos são: auto, db4o e sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:209 #, csharp-format #| msgid "" #| "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db(s)... " "destination_db" msgstr "" "Uso: smuxi-message-buffer {0} [ação-opções] source_db(s)... destination_db" #: ../src/Engine-MessageBuffer/Main.cs:214 #| msgid "Source file path" msgid "Source file path(s)" msgstr "Caminho(s) do arquivo de origem" #: ../src/Engine-MessageBuffer/Main.cs:215 msgid "Destination file path or -/empty for stdout" msgstr "" "Caminho do arquivo de destino ou \"-/empty\" para a saída padrão (stdout)" #: ../src/Engine-MessageBuffer/Main.cs:226 msgid "source_db and destination_db are required" msgstr "source_db e o destination_db são necessários" #: ../src/Engine-MessageBuffer/Main.cs:242 msgid "sourceFile must not be empty." msgstr "Arquivo de origem não pode estar vazio." #: ../src/Engine-MessageBuffer/Main.cs:251 #| msgid "sourceFile must not be empty." msgid "sourceFiles must not be empty." msgstr "Arquivos de origem não podem estar vazios." #: ../src/Engine-MessageBuffer/Main.cs:271 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "A base de dados de destino {0} deve estar vazia!" #: ../src/Engine-MessageBuffer/Main.cs:340 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Formato de arquivo desconhecido: \"{0}\"" #: ../src/Engine-MessageBuffer/Main.cs:362 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Não há suporte ao tipo de buffer: \"{0}\"" smuxi-1.1/po-Engine-MessageBuffer/da.po0000664000175000017500000000752514011526464020615 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Alan Mortensen , 2018 # Joe Hansen , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:38+0200\n" "PO-Revision-Date: 2017-09-20 01:00+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish (http://www.transifex.com/meebey/smuxi/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-MessageBuffer/Main.cs:49 msgid "Enable debug output" msgstr "Aktiver fejlsøgningsuddata" #: ../src/Engine-MessageBuffer/Main.cs:55 #: ../src/Engine-MessageBuffer/Main.cs:131 #: ../src/Engine-MessageBuffer/Main.cs:195 msgid "Show this help" msgstr "Vis denne hjælp" #: ../src/Engine-MessageBuffer/Main.cs:57 msgid "Usage: smuxi-message-buffer [options] action action-options" msgstr "Brug: smuxi-message-buffer [tilvalg] handling handling-tilvalg" #: ../src/Engine-MessageBuffer/Main.cs:59 msgid "Actions:" msgstr "Handlinger:" #: ../src/Engine-MessageBuffer/Main.cs:63 #: ../src/Engine-MessageBuffer/Main.cs:142 #: ../src/Engine-MessageBuffer/Main.cs:207 msgid "Options:" msgstr "Tilvalg:" #: ../src/Engine-MessageBuffer/Main.cs:90 #, csharp-format msgid "Unknown action: '{0}'" msgstr "Ukendt handling: »{0}«" #: ../src/Engine-MessageBuffer/Main.cs:97 #, csharp-format msgid "Command line error: {0}" msgstr "Kommandolinjefejl: {0}" #: ../src/Engine-MessageBuffer/Main.cs:109 msgid "Database format (valid values: auto, db4o, sqlite)" msgstr "Databaseformat (gyldige værdier: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:124 #: ../src/Engine-MessageBuffer/Main.cs:188 #, csharp-format msgid "Unknown {0} option: '{1}'" msgstr "Ukendt {0} tilvalg: »{1}" #: ../src/Engine-MessageBuffer/Main.cs:135 #, csharp-format msgid "Usage: smuxi-message-buffer {0} [action-options] db_path" msgstr "Brug: smuxi-message-buffer {0} [handling-tilvalg] db_sti" #: ../src/Engine-MessageBuffer/Main.cs:140 msgid "Database path" msgstr "Databasesti" #: ../src/Engine-MessageBuffer/Main.cs:151 msgid "db_path is required" msgstr "db_sti er krævet" #: ../src/Engine-MessageBuffer/Main.cs:165 msgid "Source format (valid values: auto, db4o, sqlite)" msgstr "Kildeformat (gyldige værdier: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:173 msgid "Destination format (valid values: auto, db4o, sqlite)" msgstr "Destinationsformat (gyldige værdier: auto, db4o, sqlite)" #: ../src/Engine-MessageBuffer/Main.cs:199 #, csharp-format msgid "" "Usage: smuxi-message-buffer {0} [action-options] source_db destination_db" msgstr "Brug: smuxi-message-buffer {0} [handling-tilvalg] source_db destination_db" #: ../src/Engine-MessageBuffer/Main.cs:204 msgid "Source file path" msgstr "Kildefilsti" #: ../src/Engine-MessageBuffer/Main.cs:205 msgid "Destination file path or -/empty for stdout" msgstr "Destinationsfilsti eller /empty for standardud" #: ../src/Engine-MessageBuffer/Main.cs:216 msgid "source_db and destination_db are required" msgstr "source_db og destination_db er krævet" #: ../src/Engine-MessageBuffer/Main.cs:232 msgid "sourceFile must not be empty." msgstr "kildefil må ikke være tom." #: ../src/Engine-MessageBuffer/Main.cs:248 #, csharp-format msgid "Destination database {0} must be empty!" msgstr "Destinationsdatabase {0} skal være tom!" #: ../src/Engine-MessageBuffer/Main.cs:298 #, csharp-format msgid "Unknown file format: '{0}'" msgstr "Ukendt filformat: »{0}«" #: ../src/Engine-MessageBuffer/Main.cs:320 #, csharp-format msgid "Unsupported buffer type: '{0}'" msgstr "Ikke understøttet buffertype: »{0}«" smuxi-1.1/m4/0000775000175000017500000000000014011526500013632 5ustar00meebeymeebey00000000000000smuxi-1.1/m4/expansions.m40000664000175000017500000000146614011467170016301 0ustar00meebeymeebey00000000000000AC_DEFUN([SHAMROCK_EXPAND_LIBDIR], [ expanded_libdir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $libdir )` AC_SUBST(expanded_libdir) ]) AC_DEFUN([SHAMROCK_EXPAND_BINDIR], [ expanded_bindir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $bindir )` AC_SUBST(expanded_bindir) ]) AC_DEFUN([SHAMROCK_EXPAND_DATADIR], [ case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac expanded_datadir=`(eval echo $datadir)` expanded_datadir=`(eval echo $expanded_datadir)` AC_SUBST(expanded_datadir) ]) smuxi-1.1/m4/intltool.m40000644000175000017500000002636114011526470015754 0ustar00meebeymeebey00000000000000## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- ## Copyright (C) 2001 Eazel, Inc. ## Author: Maciej Stachowiak ## Kenneth Christiansen ## ## 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. dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) smuxi-1.1/m4/programs.m40000664000175000017500000000036114011467170015735 0ustar00meebeymeebey00000000000000AC_DEFUN([SHAMROCK_FIND_PROGRAM], [ AC_PATH_PROG($1, $2, $3) AC_SUBST($1) ]) AC_DEFUN([SHAMROCK_FIND_PROGRAM_OR_BAIL], [ SHAMROCK_FIND_PROGRAM($1, $2, no) if test "x$$1" = "xno"; then AC_MSG_ERROR([You need to install '$2']) fi ]) smuxi-1.1/m4/mono.m40000664000175000017500000000321514011472672015057 0ustar00meebeymeebey00000000000000AC_DEFUN([SHAMROCK_FIND_MONO_1_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, mcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_2_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, gmcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_2_0_COMPILER_OR_HIGHER], [ if pkg-config --atleast-version=4.0 mono; then SHAMROCK_FIND_PROGRAM(MCS, mcs) fi if pkg-config --atleast-version=2.8 mono; then SHAMROCK_FIND_PROGRAM(MCS, dmcs) fi if test "x$MCS" = "x" ; then SHAMROCK_FIND_PROGRAM(MCS, gmcs) fi if test "x$MCS" = "x" ; then AC_MSG_ERROR([You need to install 'dmcs' or 'gmcs']) fi ]) AC_DEFUN([SHAMROCK_FIND_MONO_RUNTIME], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MONO, mono) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE], [ if test "x$(uname)" = "xDarwin"; then export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig:$PKG_CONFIG_PATH fi PKG_CHECK_MODULES(MONO_MODULE, mono >= $1) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES], [ CLR_VERSIONS="2.0 3.5 4.0 4.5" for ASM in $(echo "$*" | cut -d, -f2- | sed 's/\,/ /g'); do AC_MSG_CHECKING([Mono GAC for $ASM.dll]) found=0 for CLR_VER in $CLR_VERSIONS; do if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$CLR_VER/$ASM.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$CLR_VER/$ASM.dll"; then found=1 fi done if test "x$found" = "x1"; then AC_MSG_RESULT([found]) else AC_MSG_RESULT([not found]) AC_MSG_ERROR([missing required Mono assembly: $ASM.dll]) fi done ]) smuxi-1.1/po-Server/0000775000175000017500000000000014011526503015177 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Server/LINGUAS0000664000175000017500000000014014011526464016225 0ustar00meebeymeebey00000000000000ca cs da de el en_GB es fa fi fr hr hu id it lt nl pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Server/en_GB.po0000664000175000017500000000565014011526464016525 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2010-11-30 04:13+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: English (United Kingdom) (http://www.transifex.net/projects/p/smuxi/team/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Server/Main.cs:71 msgid "Add user to Server" msgstr "" #: ../src/Server/Main.cs:80 msgid "Modify existing user of Server" msgstr "" #: ../src/Server/Main.cs:89 msgid "Delete user from Server" msgstr "" #: ../src/Server/Main.cs:98 msgid "List all existing users of Server" msgstr "" #: ../src/Server/Main.cs:107 msgid "User to create, modify or delete" msgstr "" #: ../src/Server/Main.cs:116 msgid "Password of the user when creating or modifying a user" msgstr "" #: ../src/Server/Main.cs:125 msgid "Enable debug output" msgstr "" #: ../src/Server/Main.cs:133 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" #: ../src/Server/Main.cs:146 msgid "Show this help" msgstr "" #: ../src/Server/Main.cs:148 msgid "Usage: smuxi-server [options]" msgstr "" #: ../src/Server/Main.cs:150 msgid "Options:" msgstr "" #: ../src/Server/Main.cs:161 #, csharp-format msgid "Unknown option: '{0}'" msgstr "" #: ../src/Server/Main.cs:188 #, csharp-format msgid "Command line error: {0}" msgstr "" #: ../src/Server/Main.cs:232 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "" #: ../src/Server/Main.cs:242 msgid "You must specify a username with the --username option." msgstr "" #: ../src/Server/Main.cs:248 msgid "Username must not be empty." msgstr "" #: ../src/Server/Main.cs:258 msgid "You must specify a password with the --password option." msgstr "" #: ../src/Server/Main.cs:264 msgid "Password must not be empty." msgstr "" #: ../src/Server/Main.cs:283 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "" #: ../src/Server/Main.cs:303 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "" #: ../src/Server/Main.cs:312 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "" #: ../src/Server/Main.cs:321 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "" #: ../src/Server/Main.cs:328 msgid "Users:" msgstr "" #: ../src/Server/Main.cs:376 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "" #: ../src/Server/Main.cs:389 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "" smuxi-1.1/po-Server/cs.po0000664000175000017500000001010214011526464016144 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2015-05-03 11:52+0000\n" "Last-Translator: RavuAlHemio \n" "Language-Team: Czech (http://www.transifex.com/projects/p/smuxi/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Přidat uživatele na server" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Upravit existujícího uživatele serveru" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Smazat uživatele ze serveru" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Procházet všechny existující uživatele serveru" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Uživatel, který se má přidat, upravit či smazat" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Heslo vytvářeného či upravovaného uživatele" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Povolit ladicí informace" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "Optimalizovat buffery zpráv a ukončit (platné hodnoty: none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Ukázat tuto nápovědu" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Používání: smuxi-server [volby]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Volby:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Zobrazit verzi" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Neznámá volba: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Chybný příkaz: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "Najednou smí být použita nanejvýš jedna z možností --add-user, --modify-user a --delete-user." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "U volby --username musíte zadat uživatelské jméno." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Uživatelské jméno nemůže být prázdné." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "U volby --password musíte zadat heslo." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Heslo nemůže být prázdné." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "Neplatná hodnota předaná volbě --optimize-message-buffer; platné hodnoty jsou: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Uživatel \"{0}\" byl úspěšně přidán na server." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Uživatel \"{0}\" byl úspěšně upraven." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Uživatel \"{0}\" byl úspěšně smazán ze serveru." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Uživatelé:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Podařilo se optimalizovat buffery zpráv: {0}" #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Optimalizace bufferů zpráv selhala: {0}" smuxi-1.1/po-Server/zh_CN.po0000664000175000017500000000757314011526464016562 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2012,2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2015-05-03 19:36+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "将用户添加到服务器" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "修改服务器上现存的用户" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "将用户从服务器删除" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "列出服务器上所有现存的用户" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "要创建、修改或删除的用户" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "要创建或修改的用户的密码" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "启用调试输出" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "优化信息缓存并退出 (有效值: none、defrag、index、all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "显示本帮助" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "用法: smuxi-server [选项]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "选项:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "显示版本" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "未知选项: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "命令行错误: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "只能选用 --add-user、--modify-user 及 --delete-user 三者中的一个,不可同时使用多个。" #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "您必须通过 --username 选项指定用户名。" #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "用户名不能为空。" #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "您必须通过 --password 选项指定密码。" #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "密码不能为空。" #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "传递给 --optimize-message-buffer 的优化参数值无效,有效值有: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "成功将用户 \"{0}\" 添加到服务器。" #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "成功修改用户 \"{0}\"。" #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "成功将用户 \"{0}\" 从服务器删除。" #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "用户:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "成功优化 {0} 块信息缓存。" #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "无法优化信息缓存: {0}" smuxi-1.1/po-Server/sk.po0000664000175000017500000000754314011526464016173 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2011-12-29 08:46+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../src/Server/Main.cs:71 msgid "Add user to Server" msgstr "Pridať používateľa na server" #: ../src/Server/Main.cs:80 msgid "Modify existing user of Server" msgstr "Upraviť existujúcich používateľov na serveri" #: ../src/Server/Main.cs:89 msgid "Delete user from Server" msgstr "Zmazať používateľa zo servera" #: ../src/Server/Main.cs:98 msgid "List all existing users of Server" msgstr "Vypísať všetkých existujúcich používateľov servera" #: ../src/Server/Main.cs:107 msgid "User to create, modify or delete" msgstr "Používateľ, ktorý sa má pridať, upraviť, alebo zmazať" #: ../src/Server/Main.cs:116 msgid "Password of the user when creating or modifying a user" msgstr "Heslo vytváraného či upravovaného používateľa" #: ../src/Server/Main.cs:125 msgid "Enable debug output" msgstr "Povoliť ladiace informácie" #: ../src/Server/Main.cs:133 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" #: ../src/Server/Main.cs:146 msgid "Show this help" msgstr "Zobraziť túto nápovedu" #: ../src/Server/Main.cs:148 msgid "Usage: smuxi-server [options]" msgstr "Používanie: smuxi-server [možnosti]" #: ../src/Server/Main.cs:150 msgid "Options:" msgstr "Možnosti:" #: ../src/Server/Main.cs:161 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Neznáma možnosť: '{0}'" #: ../src/Server/Main.cs:188 #, csharp-format msgid "Command line error: {0}" msgstr "Chybný príkaz: {0}" #: ../src/Server/Main.cs:232 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "" "V súčasnej dobe môžete použiť jednu z týchto možností: --add-user, --modify-" "user, aa --delete-user." #: ../src/Server/Main.cs:242 msgid "You must specify a username with the --username option." msgstr "U možnosti --username musíte zadať používateľské meno." #: ../src/Server/Main.cs:248 msgid "Username must not be empty." msgstr "Používateľské meno nemôže byť prázdne." #: ../src/Server/Main.cs:258 msgid "You must specify a password with the --password option." msgstr "U možnosti --password musíte zadať heslo." #: ../src/Server/Main.cs:264 msgid "Password must not be empty." msgstr "heslo nemôže byť prázdne." #: ../src/Server/Main.cs:283 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "" #: ../src/Server/Main.cs:303 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Používateľ \"{0}\" bol úspešne pridaný na server." #: ../src/Server/Main.cs:312 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Používateľ \"{0}\" bol úspešne upravený." #: ../src/Server/Main.cs:321 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Používateľ \"{0}\" bol úspešne zmazaný zo servera." #: ../src/Server/Main.cs:328 msgid "Users:" msgstr "Používatelia:" #: ../src/Server/Main.cs:376 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "" #: ../src/Server/Main.cs:389 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "" smuxi-1.1/po-Server/el.po0000664000175000017500000001250414011526464016147 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-24 11:46+0000\n" "PO-Revision-Date: 2015-07-27 12:18+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@lists.gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Προσθήκη χρήστη στον διακομιστή" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Τροποποίηση υφιστάμενου χρήστη του διακομιστή" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Διαγραφή χρήστη από τον διακομιστή" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Καταγραφή όλων των υφιστάμενων χρηστών του διακομιστή" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Χρήστης για δημιουργία, τροποποίηση ή διαγραφή" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "" "Κωδικός πρόσβασης του χρήστη κατά τη δημιουργία ή τροποποίηση ενός χρήστη" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Ενεργοποίηση εξόδου αποσφαλμάτωσης" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Βελτιστοποίηση ενδιαμέσων μνημών μηνύματος και έξοδος (έγκυρες τιμές: καμία, " "αποσφαλμάτωση, δείκτης, όλες - none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Εμφάνιση αυτής της βοήθειας" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Χρήση: smuxi-server [options]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Επιλογές:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Εμφάνιση έκδοσης" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Άγνωστη επιλογή: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Σφάλμα γραμμής εντολών: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Το πολύ ένα από τα --add-user, --modify-user και --delete-user μπορεί να " "χρησιμοποιηθεί τη φορά." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Πρέπει να ορίσετε ένα όνομα χρήστη με την επιλογή --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Το όνομα χρήστη δεν πρέπει να είναι κενό." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Πρέπει να ορίσετε έναν κωδικό πρόσβασης με την επιλογή --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Ο κωδικός πρόσβασης δεν πρέπει να είναι κενός." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Άκυρη τιμή βελτιστοποίησης πέρασε στο --optimize-message-buffer, έγκυρες " "τιμές είναι: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Ο χρήστης \"{0}\" προστέθηκε επιτυχώς στον διακομιστή." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Ο χρήστης \"{0}\" τροποποιήθηκε επιτυχώς." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Ο χρήστης \"{0}\" διαγράφτηκε επιτυχώς από τον διακομιστή." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Χρήστες:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Επιτυχής βελτιστοποίηση {0} ενδιάμεσων μνημών μηνύματος." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Αποτυχία βελτιστοποίησης ενδιαμέσων μνημών μηνύματος: {0}" smuxi-1.1/po-Server/ro.po0000664000175000017500000001053414011526464016170 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:22+0000\n" "PO-Revision-Date: 2018-04-08 17:40+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Adaugă un utilizator la server" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modifică un utilizator existent de pe server" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Șterge un utilizator de pe server" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Listează toți utilizatorii existenți de pe server" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Utilizator de creat, modificat sau șters" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Parola utilizatorului când se creează sau se modifică un utilizator" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Activează rezultat depanare" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimizează preîncărcările de mesaj și ieși (valori valide: none, defrag, " "index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Afișează acest ajutor" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Mod de utilizare: smuxi-server [opțiuni]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opțiuni:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Afișează versiunea" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Opțiune necunoscută: „{0}”" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Eroare în linia de comandă: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Cel mult una dintre --add-user, --modify-user, și --delete-user poate fi " "utilizată la un moment dat." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Trebuie să specificați un nume de utilizator cu opțiunea --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Numele de utilizator nu trebuie să fie gol." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Trebuie să specificați o parolă cu opțiunea --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Parola nu trebuie să fie goală." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Valoare de optimizare nevalidă transferată la --optimize-message-buffer, " "valorile valide sunt: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Utilizatorul „{0}” a fost adăugat cu succes la server." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Utilizatorul „{0}” a fost modificat cu succes." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Utilizatorul „{0}” a fost șters cu succes de pe server." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Utilizatori:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "S-au optimizat cu succes preîncărcările de mesaj {0}." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Nu s-au putut optimiza preîncărcările de mesaj: {0}" smuxi-1.1/po-Server/fi.po0000664000175000017500000001015014011526464016140 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2015-05-03 15:19+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Lisää käyttäjä palvelimeen" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Muokkaa olemassaolevaa palvelimen käyttäjää" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Poista käyttäjä palvelimelta" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Listaa kaikki palvelimen käyttäjät" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Luotava, muokattava tai poistettava käyttäjä" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Käyttäjän salasana, jos luodaan tai muokataan käyttäjää" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Vianetsinnän tuloste päälle" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "Optimoi viestipuskurit ja poistu (validit arvot: none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Näytä tämä aputeksti" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Käyttö: smuxi-server [vaihtoehdot]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Vaihtoehdot:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Näytä versio" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Tuntematon vaihtoehto: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Komentorivin virhe: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "Vain yhtä komennoista --add-user, --modify-user tai --delete-user voi käyttää kerrallaan." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Käyttäjänimen ilmoittaminen --username -komennolla on pakollista." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Käyttäjänimi ei saa olla tyhjä." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Salasanan ilmoittaminen --password -vaihtoehdolla on pakollista." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Salasana ei saa olla tyhjä." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "Epäkelpo optimointiarvo välitetty komennolle --optimize-message-buffer, kelvolliset arvot ovat: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Käyttäjä \"{0}\" lisätty palvelimelle onnistuneesti." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Käyttäjää \"{0}\" muokattu onnistuneesti." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Käyttäjä \"{0}\" poistettu palvelimelta onnistuneesti." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Käyttäjät:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "{0} viestipuskuria optimoitu onnistuneesti." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Viestipuskurien optimointi epäonnistui: {0}" smuxi-1.1/po-Server/de.po0000664000175000017500000001042514011526464016137 0ustar00meebeymeebey00000000000000# German translation for smuxi-Server. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2011. # JB, 2015. # JB, 2014. # Wasilis Mandratzis-Walz, 2015. # Mario Blättermann , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2016-01-08 15:14+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Benutzer zum Server hinzufügen" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Verändern eines bereits existierenden Benutzers des Servers" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Benutzer vom Server entfernen" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Alle vorhandenen Benutzer des Servers auflisten" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Benutzer, der erstellt, verändert oder entfernt werden soll" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Passwort für den Benutzer, wenn ein Benutzer erstellt oder verändert werden soll" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Aktivieren der Ausgabe zur Fehlerbeseitigung" #: ../src/Server/Main.cs:127 msgid "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "Nachrichtenpuffer optimieren und verlassen (gültige Werte: none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Diese Hilfe anzeigen" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Aufruf: smuxi-server [options]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Optionen:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Version anzeigen" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Unbekannte Option: »{0}«" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Befehlszeilenfehler: {0}" #: ../src/Server/Main.cs:236 msgid "At most one of --add-user, --modify-user, and --delete-user may be used at a time." msgstr "Nur eine der Optionen --add-user, --modify-user oder --delete-user darf verwendet werden." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Sie müssen einen Benutzernamen mit der Option --username angeben." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Benutzername darf nicht leer sein." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Sie müssen ein Passwort mit der Option --password angeben." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Passwort darf nicht leer sein." #: ../src/Server/Main.cs:287 #, csharp-format msgid "Invalid optimization value passed to --optimize-message-buffer, valid values are: {0}" msgstr "Ungültiger Optimierungswert übergeben an --optimize-message-buffer, gültige Werte sind: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Benutzer »{0}« wurde erfolgreich zum Server hinzugefügt." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Benutzer »{0}« wurde erfolgreich verändert." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Benutzer »{0}« wurde erfolgreich vom Server entfernt." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Benutzer:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Erfolgreich {0} Nachrichtenpuffer optimiert." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Optimierung der Nachrichtenpuffer fehlgeschlagen: {0}" smuxi-1.1/po-Server/hu.po0000664000175000017500000001057614011526464016172 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 17:48+0000\n" "PO-Revision-Date: 2015-07-18 00:14+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Felhasználó hozzáadása a kiszolgálóhoz" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "A kiszolgáló meglévő felhasználójának módosítása" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Felhasználó törlése a kiszolgálóról" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "A kiszolgáló összes meglévő felhasználójának felsorolása" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "A létrehozandó, módosítandó vagy törlendő felhasználó" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "" "A felhasználó jelszava egy felhasználó létrehozásakor vagy módosításakor" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Hibakeresési kimenet engedélyezése" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Üzenetpufferek optimalizálása és kilépés (érvényes értékek: none, defrag, " "index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Ezen súgó megjelenítése" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Használat: smuxi-server [kapcsolók]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Kapcsolók:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Verzió megjelenítése" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Ismeretlen kapcsoló: „{0}”" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Parancssori hiba: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Az --add-user, --modify-user és --delete-user legfeljebb egyike használható " "egy időben." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Meg kell adnia egy felhasználónevet a --username kapcsolóval." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "A felhasználónév nem lehet üres." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Meg kell adnia egy jelszót a --password kapcsolóval." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "A jelszó nem lehet üres." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Érvénytelen optimalizációs érték lett átadva az --optimize-message-buffer " "kapcsolónak, az érvényes értékek: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "A(z) „{0}” felhasználó sikeresen hozzáadva a kiszolgálóhoz." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "A(z) „{0}” felhasználó sikeresen módosítva." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "A(z) „{0}” felhasználó sikeresen törölve a kiszolgálóról." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Felhasználók:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Sikeresen optimalizálva {0} üzenetpuffer." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Nem sikerült optimalizálni az üzenetpuffereket: {0}" smuxi-1.1/po-Server/ur.po0000664000175000017500000000561614011526464016203 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2010-11-30 04:13+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Server/Main.cs:71 msgid "Add user to Server" msgstr "" #: ../src/Server/Main.cs:80 msgid "Modify existing user of Server" msgstr "" #: ../src/Server/Main.cs:89 msgid "Delete user from Server" msgstr "" #: ../src/Server/Main.cs:98 msgid "List all existing users of Server" msgstr "" #: ../src/Server/Main.cs:107 msgid "User to create, modify or delete" msgstr "" #: ../src/Server/Main.cs:116 msgid "Password of the user when creating or modifying a user" msgstr "" #: ../src/Server/Main.cs:125 msgid "Enable debug output" msgstr "" #: ../src/Server/Main.cs:133 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" #: ../src/Server/Main.cs:146 msgid "Show this help" msgstr "" #: ../src/Server/Main.cs:148 msgid "Usage: smuxi-server [options]" msgstr "" #: ../src/Server/Main.cs:150 msgid "Options:" msgstr "" #: ../src/Server/Main.cs:161 #, csharp-format msgid "Unknown option: '{0}'" msgstr "" #: ../src/Server/Main.cs:188 #, csharp-format msgid "Command line error: {0}" msgstr "" #: ../src/Server/Main.cs:232 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "" #: ../src/Server/Main.cs:242 msgid "You must specify a username with the --username option." msgstr "" #: ../src/Server/Main.cs:248 msgid "Username must not be empty." msgstr "" #: ../src/Server/Main.cs:258 msgid "You must specify a password with the --password option." msgstr "" #: ../src/Server/Main.cs:264 msgid "Password must not be empty." msgstr "" #: ../src/Server/Main.cs:283 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "" #: ../src/Server/Main.cs:303 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "" #: ../src/Server/Main.cs:312 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "" #: ../src/Server/Main.cs:321 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "" #: ../src/Server/Main.cs:328 msgid "Users:" msgstr "" #: ../src/Server/Main.cs:376 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "" #: ../src/Server/Main.cs:389 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "" smuxi-1.1/po-Server/fr.po0000664000175000017500000001037614011526464016163 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Calinou, 2014 # Clément Bourgeois , 2011,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2015-05-03 20:15+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Ajouter un utilisateur au serveur" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modifier un utilisateur existant du serveur" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Supprimer un utilisateur du serveur" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Lister tous les utilisateurs existants du serveur" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Utilisateur à créer, modifier ou supprimer" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Mot de passe utilisé pendant la création ou la modification d'un utilisateur." #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Activer la sortie de déboguage" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "Optimiser les tampons de messages et sortir (valeurs valides: none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Affiche cette aide" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Usage : smuxi-server [options]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Options :" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Afficher la version" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Option inconnue : '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Erreur de ligne de commande : {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "Seulement un seul des parametres --add-user, --modify-user, et --delete-user peut être utilisé à la fois." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Vous devez spécifier un nom d'utilisateur avec l'option --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Le nom d'utilisateur ne peut pas être vide." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Vous devez spécifier un mot de passe avec l'option --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Le mot de passe ne peut pas être vide." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "Valeur d'optimisation passée à --optimize-message-buffer invalide, les valeurs valides sont : {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "L'utilisateur \"{0}\" a été ajouté avec succès au serveur." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "L'utilisateur \"{0}\" a été modifié avec succès." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "L'utilisateur : \"{0}\" a été supprimé de la configuration avec succès." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Utilisateurs :" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Optimisation des tampons de messages {0} réalisée avec succès." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Impossible d'optimiser les tampon de messages : {0}" smuxi-1.1/po-Server/sr.po0000664000175000017500000001177414011526464016203 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:43+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Додај корисника на сервер" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Измени постојећег корисника сервера" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Обриши корисника са сервера" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Испиши све постојеће кориснике сервера" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Корисник за стварање, измену или брисање" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Лозинка за корисника када се исти ствара или мења" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Укључује излаз прочишћавања" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Оптимизује међумеморије поруке и излази (исправне вредности: „none“, " "„defrag“, „index“, „all“)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Приказује ову помоћ" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Употреба: smuxi-server [опције]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Опције:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Приказује издање" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Непозната опција: „{0}“" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Грешка линије наредби: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Може бити коришћено само „--add-user“, „--modify-user“, и „--delete-user“ у " "исто време." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Морате навести корисника опцијом „--username“." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Корисничко име не сме бити празно." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Морате навести лозинку опцијом „--password“." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Лозинка не сме бити празна." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Неисправна вредност оптимизације је прослеђена у „--optimize-message-" "buffer“, исправне вредности су: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Корисник „{0}“ је успешно додат серверу." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Корисник „{0}“ је успешно измењен." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Корисник „{0}“ је успешно обрисан са сервера." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Корисници:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Успешно су оптимизоване {0} међумеморије поруке." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Нисам успео да оптимизујем међумеморије поруке: {0}" smuxi-1.1/po-Server/sl.po0000664000175000017500000000761114011526464016170 0ustar00meebeymeebey00000000000000# 'smuxi/po-Server/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 14:43+0000\n" "PO-Revision-Date: 2016-03-11 23:36+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Dodaj uporabnika na strežnik" #: ../src/Server/Main.cs:74 #, fuzzy msgid "Modify existing user of Server" msgstr "Vsili obstoječi uporabniški način" #: ../src/Server/Main.cs:83 #, fuzzy msgid "Delete user from Server" msgstr "_Izbriši s strežnika" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "" #: ../src/Server/Main.cs:101 #, fuzzy msgid "User to create, modify or delete" msgstr "Ustvari in spremeni arhiv" #: ../src/Server/Main.cs:110 #, fuzzy msgid "Password of the user when creating or modifying a user" msgstr "Pri ustvarjanju datoteke omogoči dostop le trenutnemu uporabniku" #: ../src/Server/Main.cs:119 #, fuzzy msgid "Enable debug output" msgstr "Omogoči odvod razhroščevanja" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Pokaži to pomoč" #: ../src/Server/Main.cs:142 #, fuzzy msgid "Usage: smuxi-server [options]" msgstr "Uporaba: gbrainy [možnosti ...]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Možnosti:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Pokaži različico" #: ../src/Server/Main.cs:165 #, fuzzy, csharp-format msgid "Unknown option: '{0}'" msgstr "Neznana možnost: %s" #: ../src/Server/Main.cs:192 #, fuzzy, csharp-format msgid "Command line error: {0}" msgstr "Neznan parameter v ukazni vrstici {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" #: ../src/Server/Main.cs:246 #, fuzzy msgid "You must specify a username with the --username option." msgstr "" "Dovoljenje za poizvedovanje o uporabniku imajo le pooblaščene osebe in " "osebe, ki navedejo uporabniško ime." #: ../src/Server/Main.cs:252 #, fuzzy msgid "Username must not be empty." msgstr "Seznam mora biti prazen" #: ../src/Server/Main.cs:262 #, fuzzy msgid "You must specify a password with the --password option." msgstr "Vnesti je treba podatke OpenID ali pa geslo" #: ../src/Server/Main.cs:268 #, fuzzy msgid "Password must not be empty." msgstr "Imena delovnih listov ne morejo biti prazna." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "" #: ../src/Server/Main.cs:316 #, fuzzy, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Ali lahko uporabnik spremeni besedilo" #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "" #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Uporabniki:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "" #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "" smuxi-1.1/po-Server/pl.po0000664000175000017500000001055714011526464016170 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # , 2012. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:55+0200\n" "PO-Revision-Date: 2016-08-21 16:40+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Dodaje użytkownika do serwera" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modyfikuje istniejącego użytkownika serwera" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Usuwa użytkownika z serwera" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Wyświetla wszystkich istniejących użytkowników serwera" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Użytkownik do utworzenia, modyfikacji albo usunięcia" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Hasło użytkownika podczas tworzenia lub modyfikowania" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Włącza wyjście debugowania" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optymalizuje bufory wiadomości i kończy działanie (prawidłowe wartości: " "„none”, „defrag”, „index”, „all”)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Wyświetla tę pomoc" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Użycie: smuxi-server [opcje]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opcje:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Wyświetla wersję" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Nieznana opcja: „{0}”" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Błąd wiersza poleceń: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Najwyżej jedno polecenie „--add-user”, „--modify-user” i „--delete-user” " "może być użyte w tym samym czasie." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Należy podać nazwę użytkownika za pomocą opcji „--username”." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Nazwa użytkownika nie może być pusta." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Należy podać hasło za pomocą opcji „--password”." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Hasło nie może być puste." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Przekazano nieprawidłową wartość optymalizacji do „--optimize-message-" "buffer”, prawidłowe wartości: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Pomyślnie dodano użytkownika „{0}” do serwera." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Pomyślnie zmodyfikowano użytkownika „{0}”." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Pomyślnie usunięto użytkownika „{0}” z serwera." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Użytkownicy:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Pomyślnie zoptymalizowano tyle buforów wiadomości: {0}." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Zoptymalizowanie tylu buforów wiadomości się nie powiodło: {0}" smuxi-1.1/po-Server/id.po0000664000175000017500000001013014011526464016134 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:43+0000\n" "PO-Revision-Date: 2017-04-20 14:07+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Tambahkan pengguna ke Peladen" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Ubah pengguna Peladen yang ada" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Hapus pengguna dari Peladen" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Cantumkan semua pengguna Peladen yang ada" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Pengguna untuk membuat, memodifikasi atau menghapus" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Kata sandi pengguna saat membuat atau memodifikasi pengguna" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Aktifkan keluaran debug" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimalkan buffer pesan dan keluar (nilai yang valid: none, defrag, index, " "all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Tampilkan bantuan ini" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Penggunaan: smuxi-server [options]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opsi:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Tampilkan versi" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Pilihan tidak diketahui: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Kesalahan baris perintah: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Paling banyak satu dari --add-user, --modify-user, dan --delete-user dapat " "digunakan sekaligus." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Anda harus menentukan nama pengguna dengan opsi --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Nama pengguna tidak boleh kosong" #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Anda harus menentukan kata sandi dengan opsi --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Kata sandi tidak boleh kosong" #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Nilai pengoptimalan yang tidak valid dikirimkan ke --optimize-message-" "buffer, nilai yang valid adalah: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Pengguna \"{0}\" berhasil ditambahkan ke server." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Pengguna \"{0}\" berhasil dimodifikasi." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Pengguna \"{0}\" berhasil dihapus dari server." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Pengguna:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Penyangga pesan yang berhasil dioptimalkan {0}." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Gagal mengoptimalkan penyangga pesan: {0}" smuxi-1.1/po-Server/es.po0000664000175000017500000001044414011526464016157 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013-2014 # Ricardo A. Hermosilla Carrillo , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-05-03 18:38+0000\n" "PO-Revision-Date: 2015-07-13 \n" "Last-Translator: Mirco Bauer \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/" "es/) <>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Agregar usuario al servidor" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modificar un usuario existente en el servidor" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Borrar usuario del servidor" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Enumerar todos los usuarios existentes en el servidor" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Usuario a crear, modificar o borrar" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Contraseña del usuario que se está creando o modificando" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Habilitar salida de depuración" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimizar buffers de mensaje y salida (valores válidos: none, defrag, index, " "all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Mostrar esta ayuda" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Modo de uso: smuxi-server [opciones]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opciones:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Mostrar versión" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Opción desconocida: «{0}»" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Error de línea de órdenes: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Se debe usar al menos una de estas opciones: --add-user, --modify-user, o --" "delete-user" #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Debe especificar un nombre de usuario con la opción --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "El nombre de usuario no puede estar vacío." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Debe especificar una contraseña con la opción --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "La contraseña no puede estar vacía." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Se pasó un valor de optimización no válido a pasado --optimize-message-" "buffer, los valores válidos son: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Se ha añadido correctamente el usuario «{0}» al servidor." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Se ha modificado correctamente el usuario «{0}»." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Se ha borrado correctamente el usuario «{0}» del servidor." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Usuarios:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Se optimizaron correctamente {0} buffers de mensaje." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Fallo al optimizar buffers de mensaje: {0}" smuxi-1.1/po-Server/Makefile.in.in0000664000175000017500000001576514011526464017675 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_SERVER@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Server/pt.po0000664000175000017500000001553014011526464016174 0ustar00meebeymeebey00000000000000# Translation of smuxi-frontend messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-frontend package. # Américo Monteiro , 2010. # Pedro Ribeiro , 2012. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-23 13:05+0000\n" "PO-Revision-Date: 2015-11-17 09:31+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Acrescentar utilizador ao servidor" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modificar utilizador existente" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Eliminar utilizador do servidor" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Listar todos os utilizadores do servidor" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Utilizador a criar, modificar ou eliminar" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Senha do utilizador ao criar ou modificar um utilizador" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Ativar saída de depuração" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Otimizar buffers de mensagens e sair (valores válidos: none, defrag, index, " "all) " #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Mostrar esta ajuda" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Utilização: smuxi-server [opções]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opções:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Mostrar versão" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Opção desconhecida: \"{0}\"" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Erro na linha de comandos: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Só pode ser usado um de --add-user, --modify-user ou --delete-user de cada " "vez." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Tem que indicar um nome de utilizador com a opção --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "O nome de utilizador não pode estar vazio." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Tem que indicar uma senha com a opção --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "A palavra-chave não pode estar vazia." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Valor de otimização inválido passado a --optimize-message-buffer. Os valores " "válidos são: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Utilizador \"{0}\" adicionado ao servidor com sucesso." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Utilizador \"{0}\" modificado com sucesso." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Utilizador \"{0}\" removido do servidor com sucesso." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Utilizadores:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "{0} buffers de mensagens otimizados com sucesso." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Falha ao otimizar os buffers de mensagens: {0}" #~ msgid "Engine does not exist." #~ msgstr "Não existe esse 'Engine'." #~ msgid "" #~ "Unknown channel ({0}) - only the following channel types are supported:" #~ msgstr "" #~ "Canal desconhecido ({0}) - apenas os seguintes tipos de canais são " #~ "suportados:" #~ msgid "" #~ "Registration with engine failed! The username and/or password were wrong " #~ "- please verify them." #~ msgstr "" #~ "O registo com o motor falhou! O nome de utilizador e/ou a palavra-passe " #~ "estavam errados - por favor verifique-os." #~ msgid "SSH client application was not found: " #~ msgstr "A aplicação cliente SSH não foi encontrada: " #~ msgid "" #~ "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty." #~ "exe)" #~ msgstr "" #~ "O cliente SSH tem de ser ou OpenSSH (ssh) ou Plink (plink.exe, não putty." #~ "exe)" #~ msgid "" #~ "The local SSH forwarding port {0} is already in use. Is there an old SSH " #~ "tunnel still active?" #~ msgstr "" #~ "O porto de encaminhamento de SSH local {0} já está em uso. Existe um " #~ "túnel SSH antigo ainda activo?" #~ msgid "" #~ "SSH tunnel setup failed (exit code: {0})\n" #~ "\n" #~ "SSH program: {1}\n" #~ "SSH parameters: {2}\n" #~ "\n" #~ "Program Error:\n" #~ "{3}\n" #~ "Program Output:\n" #~ "{4}\n" #~ msgstr "" #~ "Configuração do túnel SSH falhou (código ao terminar: {0})\n" #~ "\n" #~ "Programa SSH: {1}\n" #~ "Parâmetros SSH: {2}\n" #~ "\n" #~ "Erro do Programa:\n" #~ "{3}\n" #~ "Saída do Programa:\n" #~ "{4}\n" #~ msgid "SSH keyfile not found." #~ msgstr "Ficheiro de chaves SSH não encontrado." #~ msgid "SSH keyfile could not be read." #~ msgstr "Ficheiro de chaves SSH não pode ser lido." #~ msgid "" #~ "OpenSSH version number not found (exit code: {0})\n" #~ "\n" #~ "SSH program: {1}\n" #~ "\n" #~ "Program Error:\n" #~ "{2}\n" #~ "Program Output:\n" #~ "{3}\n" #~ msgstr "" #~ "Número de versão de OpenSSH não encontrado (código ao terminar: {0})\n" #~ "\n" #~ "Programa SSH: {1}\n" #~ "\n" #~ "Erro do Programa:\n" #~ "{2}\n" #~ "Saída do Programa:\n" #~ "{3}\n" #~ msgid "PuTTY / Plink requires a username to be set." #~ msgstr "PuTTY / Plink requer que seja definido um nome de utilizador." #~ msgid "" #~ "Plink version number not found (exit code: {0})\n" #~ "\n" #~ "SSH program: {1}\n" #~ "\n" #~ "Program Error:\n" #~ "{2}\n" #~ "Program Output:\n" #~ "{3}\n" #~ msgstr "" #~ "Número de versão de Plink não encontrado (código ao terminar: {0})\n" #~ "\n" #~ "Programa SSH: {1}\n" #~ "\n" #~ "Erro do Programa:\n" #~ "{2}\n" #~ "Saída do Programa:\n" #~ "{3}\n" smuxi-1.1/po-Server/it.po0000664000175000017500000000633714011526464016172 0ustar00meebeymeebey00000000000000# ITALIAN TRANSLATION OF SMUXI-SERVER. # COPYRIGHT (C) 2010 THE SMUXI-SERVER'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi-server package. # # Vincenzo Campanella , 2010. # msgid "" msgstr "" "Project-Id-Version: smuxi-server\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-09-11 12:19+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/Server/Main.cs:69 msgid "Add user to Server" msgstr "Aggiungi un utente al server" #: ../src/Server/Main.cs:78 msgid "Modify existing user of Server" msgstr "Modifica un utente esistente del server" #: ../src/Server/Main.cs:87 msgid "Delete user from Server" msgstr "Elimina un utente dal server" #: ../src/Server/Main.cs:96 msgid "List all existing users of Server" msgstr "Elenca tutti gli utenti esistenti del server" #: ../src/Server/Main.cs:105 msgid "User to create, modify or delete" msgstr "Utente da creare, modificare o eliminare" #: ../src/Server/Main.cs:114 msgid "Password of the user when creating or modifying a user" msgstr "Password dell'utente durante la creazione o la modifica di un utente" #: ../src/Server/Main.cs:123 msgid "Enable debug output" msgstr "Abilita l'output del debug" #: ../src/Server/Main.cs:131 msgid "Show this help" msgstr "Mostra questo aiuto" #: ../src/Server/Main.cs:133 msgid "Usage: smuxi-server [options]" msgstr "Utilizzo: smuxi-server [opzioni]" #: ../src/Server/Main.cs:135 msgid "Options:" msgstr "Opzioni:" #: ../src/Server/Main.cs:146 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Opzione sconosciuta: «{0}»" #: ../src/Server/Main.cs:170 #, csharp-format msgid "Command line error: {0}" msgstr "Errore da riga di comando: {0}" #: ../src/Server/Main.cs:214 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "È possibile utilizzare contemporaneamente al massimo uno fra «--add-user», " "«--modify-user» e «--delete-user»." #: ../src/Server/Main.cs:224 msgid "You must specify a username with the --username option." msgstr "" "È necessario specificare un nome utente, mediante l'opzione «--username»." #: ../src/Server/Main.cs:230 msgid "Username must not be empty." msgstr "Il nome utente non può essere vuoto." #: ../src/Server/Main.cs:240 msgid "You must specify a password with the --password option." msgstr "" "È necessario specificare una password, mediante l'opzione «--password»." #: ../src/Server/Main.cs:246 msgid "Password must not be empty." msgstr "La password non può essere vuota." #: ../src/Server/Main.cs:263 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "L'utente «{0}» è stato aggiunto al server." #: ../src/Server/Main.cs:272 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "L'utente «{0}» è stato modificato." #: ../src/Server/Main.cs:281 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "L'utente «{0}» è stato eliminato dal server." #: ../src/Server/Main.cs:288 msgid "Users:" msgstr "Utenti:" smuxi-1.1/po-Server/nl.po0000664000175000017500000001032714011526464016161 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Mirco Bauer , 2014. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:21+0000\n" "PO-Revision-Date: 2019-02-26 14:03+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Gebruiker toevoegen aan server" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Bestaande gebruiker van server aanpassen" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Gebruiker verwijderen van server" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Alle bestaande gebruikers van server tonen" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Gebruiker om aan te maken, te wijzigen of te verwijderen" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Gebruikerswachtwoord voor het maken of wijzigen van een gebruiker" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Debuguitvoer inschakelen" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Meldingenbuffers optimaliseren en afsluiten (toegestane waarden: none, " "defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Deze hulp tonen" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Gebruik: smuxi-server [opties]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opties:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Versie tonen" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Onbekende optie: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Opdrachtregelfout: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Maximaal één van --add-user, --modify-user, of --delete-user kan tegelijk " "worden gebruikt." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "U dient een gebruikersnaam op te geven met de optie --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Gebruikersnaam mag niet leeg zijn." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "U dient een wachtwoord op te geven met de optie --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Wachtwoord mag niet leeg zijn." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Ongeldige optimalisatiewaarden doorgegeven via --optimize-message-buffer, " "geldige waarden zijn: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Gebruiker \"{0}\" toegevoegd aan de server." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Gebruiker \"{0}\" gewijzigd." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Gebruiker \"{0}\" verwijderd van de server." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Gebruikers:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Met succes {0} meldingenbuffers geoptimaliseerd." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Optimaliseren van meldingenbuffers is niet gelukt: {0}" smuxi-1.1/po-Server/ru.po0000664000175000017500000001203014011526464016167 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 # Yuri Myasoedov , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:41+0200\n" "PO-Revision-Date: 2017-09-19 09:14+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Добавить пользователя на сервер" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Изменить существующего пользователя на сервере" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Удалить пользователя с сервера" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Вывести список всех пользователей, существующих на сервере" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Создать, изменить или удалить пользователя" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Пароль пользователя при создании или изменении пользователя" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Включить вывод отладочной информации" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "Оптимизировать буферы сообщений и выйти (возможные значения: none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Показать эту справку" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Использование: smuxi-server [параметры]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Параметры:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Версия" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Неизвестный параметр: «{0}»" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Ошибка в командной строке: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "Параметры --add-user, --modify-user и --delete-user не могут использоваться одновременно друг с другом." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Для параметра --username необходимо указать имя пользователя." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Укажите имя пользователя." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Для параметра --password необходимо указать пароль." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Укажите пароль." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "Параметру --optimize-message-buffer передано недопустимое значение, возможные значения: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Пользователь «{0}» успешно добавлен на сервер." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Пользователь «{0}» успешно изменён." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Пользователь «{0}» успешно удалён с сервера." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Пользователи:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Успешно оптимизировано {0} буферов сообщений." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Сбой при оптимизации буферов сообщений: {0}" smuxi-1.1/po-Server/lt.po0000664000175000017500000001045714011526464016173 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-08 14:35+0000\n" "PO-Revision-Date: 2016-01-08 22:27+0200\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/" "language/lt/)\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Pridėti vartotoją į Serverį" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modifikuoti esantį Serverio vartotoją" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Ištrinti vartotoją iš Serverio" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Pateikti visus esamus Serverio vartotojus" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Vartotojas, kurį norima sukurti, modifikuoti ar ištrinti" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Vartotojo slaptažodis, kuomet kuriamas ar modifikuojamas vartotojas" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Įjungti derinimo išvestį" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimizuoti pranešimo buferius ir išėjimą (teisingos reikšmės: none, defrag, " "index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Rodyti šią pagalbą" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Naudojimas: smuxi-server [parametrai]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Parametrai:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Rodyti versiją" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Nežinomas parametras: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Komandų eilutės klaida: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Vienu metu gali būti naudojamas daugiausiai vienas iš --add-user, --modify-" "user ir --delete-user" #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Privalote nurodyti vartotojo vardą, naudodami --username parametrą." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Vartotojo vardas negali būti tuščias." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Privalote nurodyti slaptažodį, naudodami --password parametrą." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Slaptažodis negali būti tuščias." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Į --optimize-message-buffer perduota neteisinga optimizavimo reikšmė, " "teisingos reikšmės yra: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Vartotojas \"{0}\" sėkmingai pridėtas į serverį." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Vartotojas \"{0}\" sėkmingai modifikuotas." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Vartotojas \"{0}\" sėkmingai ištrintas iš serverio." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Vartotojai:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Sėkmingai optimizuota {0} pranešimo buferių." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Nepavyko optimizuoti pranešimo buferių: {0}" smuxi-1.1/po-Server/POTFILES.in0000664000175000017500000000005014011526464016755 0ustar00meebeymeebey00000000000000src/Server/Server.cs src/Server/Main.cs smuxi-1.1/po-Server/POTFILES.skip0000664000175000017500000000050014011526464017315 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-GNOME/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ lib/ smuxi-1.1/po-Server/te.po0000664000175000017500000000674014011526464016164 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # ప్రవీణ్ ఇళ్ళ , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:02+0100\n" "PO-Revision-Date: 2013-12-12 04:49+0000\n" "Last-Translator: ప్రవీణ్ ఇళ్ళ \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Server/Main.cs:71 msgid "Add user to Server" msgstr "వాడుకరిని సేవకానికి జతచేయి" #: ../src/Server/Main.cs:80 msgid "Modify existing user of Server" msgstr "సేవకములో ఉన్నటువంటి వాడుకరిని సవరించు" #: ../src/Server/Main.cs:89 msgid "Delete user from Server" msgstr "వాడుకరిని సేవకము నుండి తొలగించు" #: ../src/Server/Main.cs:98 msgid "List all existing users of Server" msgstr "" #: ../src/Server/Main.cs:107 msgid "User to create, modify or delete" msgstr "" #: ../src/Server/Main.cs:116 msgid "Password of the user when creating or modifying a user" msgstr "" #: ../src/Server/Main.cs:125 msgid "Enable debug output" msgstr "" #: ../src/Server/Main.cs:133 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" #: ../src/Server/Main.cs:146 msgid "Show this help" msgstr "ఈ సహాయాన్ని చూపించు" #: ../src/Server/Main.cs:148 msgid "Usage: smuxi-server [options]" msgstr "" #: ../src/Server/Main.cs:150 msgid "Options:" msgstr "ఐచ్ఛికాలు:" #: ../src/Server/Main.cs:161 #, csharp-format msgid "Unknown option: '{0}'" msgstr "" #: ../src/Server/Main.cs:188 #, csharp-format msgid "Command line error: {0}" msgstr "" #: ../src/Server/Main.cs:232 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "" #: ../src/Server/Main.cs:242 msgid "You must specify a username with the --username option." msgstr "" #: ../src/Server/Main.cs:248 msgid "Username must not be empty." msgstr "వాడుకరిపేరు ఖాళీగా ఉండకూడదు." #: ../src/Server/Main.cs:258 msgid "You must specify a password with the --password option." msgstr "" #: ../src/Server/Main.cs:264 msgid "Password must not be empty." msgstr "సంకేతపదం ఖాళీగా ఉండకూడదు." #: ../src/Server/Main.cs:283 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "" #: ../src/Server/Main.cs:303 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "" #: ../src/Server/Main.cs:312 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "" #: ../src/Server/Main.cs:321 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "" #: ../src/Server/Main.cs:328 msgid "Users:" msgstr "వాడుకరులు:" #: ../src/Server/Main.cs:376 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "" #: ../src/Server/Main.cs:389 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "" smuxi-1.1/po-Server/ca.po0000664000175000017500000000571414011526464016137 0ustar00meebeymeebey00000000000000msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: \n" "Last-Translator: Siegfried-Angel Gevatter Pujals \n" "Language-Team: Siegfried Gevatter \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1\n" "X-Poedit-Language: Catalan\n" #: ../src/Server/Main.cs:69 msgid "Add user to Server" msgstr "Afegeix un usuari al servidor" #: ../src/Server/Main.cs:78 msgid "Modify existing user of Server" msgstr "Modifica un usuari existent" #: ../src/Server/Main.cs:87 msgid "Delete user from Server" msgstr "Elimina un usuari del servidor" #: ../src/Server/Main.cs:96 msgid "List all existing users of Server" msgstr "Llista tots els usuaris existents al servidor" #: ../src/Server/Main.cs:105 msgid "User to create, modify or delete" msgstr "Usuari a crear, modificar o eliminar" #: ../src/Server/Main.cs:114 msgid "Password of the user when creating or modifying a user" msgstr "Contrasenya de l'usuari quan se n'està creant o modificant un" #: ../src/Server/Main.cs:123 msgid "Enable debug output" msgstr "Habilita la sortida de depuració" #: ../src/Server/Main.cs:131 msgid "Show this help" msgstr "Mostra aquesta ajuda" #: ../src/Server/Main.cs:133 msgid "Usage: smuxi-server [options]" msgstr "Ús: smuxi-server [opcions]" #: ../src/Server/Main.cs:135 msgid "Options:" msgstr "Opcions:" #: ../src/Server/Main.cs:146 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Opció desconeguda: «{0}»" #: ../src/Server/Main.cs:170 #, csharp-format msgid "Command line error: {0}" msgstr "Error de línia d'ordres: {0}" #: ../src/Server/Main.cs:214 msgid "At most one of --add-user, --modify-user, and --delete-user may be used at a time." msgstr "Podeu utilitzar com a molt una opció d'entre --add-user, --modify-user i --delete-user alhora." #: ../src/Server/Main.cs:224 msgid "You must specify a username with the --username option." msgstr "Cal especificar un nom d'usuari amb l'opció --username." #: ../src/Server/Main.cs:230 msgid "Username must not be empty." msgstr "El nom d'usuari no pot ser buit." #: ../src/Server/Main.cs:240 msgid "You must specify a password with the --password option." msgstr "Cal especificar una contrasenya amb l'opció --password." #: ../src/Server/Main.cs:246 msgid "Password must not be empty." msgstr "La contrasenya no pot ser buida." #: ../src/Server/Main.cs:263 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "S'ha afegit l'usuari «{0}» al servidor." #: ../src/Server/Main.cs:272 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "S'ha modificat l'usuari «{0}»." #: ../src/Server/Main.cs:281 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "S'ha eliminat l'usuari «{0}»." #: ../src/Server/Main.cs:288 msgid "Users:" msgstr "Usuaris:" smuxi-1.1/po-Server/sv.po0000664000175000017500000001032514011526464016176 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2014-2015 # flugsio , 2011 # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-28 17:04+0000\n" "PO-Revision-Date: 2016-04-03 13:36+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Lägg till användare till server" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Redigera existerande användare på server" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Radera användare från server" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Visa alla existerande användare på server" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Användare att skapa, redigera eller radera" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Lösenord för användaren som skapas eller redigeras" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Aktivera utskrift av fellogg" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimera meddelandebuffertarna och avsluta (giltiga värden: none, defrag, " "index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Visa den här hjälpen" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Använding: smuxi-server [flaggor]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Flaggor:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Visa version" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Okänd flagga: \"{0}\"" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Kommandoradsfel: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Högst en av --add-user, --modify-user och --delete-user får användas i taget." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Du måste ange ett användarnamn med flaggan --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Användarnamnet får inte vara tomt." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Du måste ange ett lösenord med flaggan --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Lösenordet kan inte vara tomt." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Ogiltigt optimeringsvärde för --optimize-message-buffer, giltiga värden är: " "{0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Användaren \"{0}\" lades till korrekt i servern." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Användaren \"{0}\" redigerad." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Användaren \"{0}\" raderades från servern." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Användare:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Lyckades optimera {0} meddelandebuffertar." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Misslyckades att optimera buffertar: {0}" smuxi-1.1/po-Server/tr.po0000664000175000017500000001013014011526464016165 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 # U, 2011,2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:33+0200\n" "PO-Revision-Date: 2015-05-14 21:03+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Sunucuya bir kişi ekle" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Sunucudaki kişiyi değiştir" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Sunucudaki kişiyi sil" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Sunucudaki tüm kişileri listele" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Oluşturulacak, değiştirilecek ya da silinecek kişiler" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Oluştururken ya da değiştirirken kişinin şifresi" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Hata ayıklama çıktısını etkinleştir" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "İleti arabelleklerini en iyi hale getir ve çık (geçerli değerler: none, defrag, index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Yardımı göster" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Kullanım: smuxi-server [tercihler]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Tercihler:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Sürümü göster" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Bilinmeyen tercih: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Komut satırı hatası: '{0}'" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "Tek seferde --add-user, --modify-user ve --delete-user tercihlerinden en fazla biri kullanılabilir." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "--username tercihiyle birlikte bir kullanıcı adı belirtmelisiniz." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Kullanıcı adı boş olmamalı" #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "--password tercihiyle birlikte bir şifre belirtmelisiniz." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Şifre boş olmamalı" #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "--optimize-message-buffer tercihine geçersiz iyileştirme değeri geçildi, geçerli değerler: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "\"{0}\" kişisi başarıyla sunucuya eklendi" #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "\"{0}\" kişisi başarıyla değiştirildi" #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "\"{0}\" kişisi başarıyla sunucudan silindi" #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Kişiler:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "{0} ileti arabelleği başarılı bir şekilde iyileştirildi." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "İleti arabelleği iyileştirmesi başarısız oldu: {0}" smuxi-1.1/po-Server/pt_BR.po0000664000175000017500000001037514011526464016561 0ustar00meebeymeebey00000000000000# Brazilian Portuguese for smuxi-Server # Copyright (C) 2016 THE smuxi'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Leonardopf , 2013 # Rafael Fontenelle , 2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:48+0000\n" "PO-Revision-Date: 2016-03-09 19:15-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Adicionar usuário ao servidor" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Modificar usuário existente do servidor" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Apagar usuário do servidor" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Exibir todos usuários existentes do servidor" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Usuário a ser criado, modificado ou excluído" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Senha do usuário ao criar ou modificar um usuário" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Habilitar saída de depuração" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Otimizar os buffers de mensagens e sair (valores válidos: none, defrag, " "index e all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Mostrar esta ajuda" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Uso: smuxi-server [opções]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Opções:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Mostra versão" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Opção desconhecida: \"{0}\"" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Erro de linha de comando: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "No máximo um de --add-user, --modify-user e --delete-user pode ser usado por " "vez." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Você deve especificar um nome de usuário com a opção --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Nome de usuário não pode estar vazio." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Você deve especificar uma senha com a opção --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Senha não pode estar vazia." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Valores de otimização inválidos passados para --optimize-message-buffer; " "valores válidos são: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Usuário \"{0}\" adicionado com sucesso ao servidor." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Usuário \"{0}\" modificado com sucesso." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Usuário \"{0}\" excluído com sucesso do servidor." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Usuários:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Buffers de mensagem {0} otimizados com sucesso." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Falha ao otimizar buffers de mensagem: {0}" smuxi-1.1/po-Server/fa.po0000664000175000017500000000556714011526464016150 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:02+0100\n" "PO-Revision-Date: 2013-08-19 12:20+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Server/Main.cs:71 msgid "Add user to Server" msgstr "" #: ../src/Server/Main.cs:80 msgid "Modify existing user of Server" msgstr "" #: ../src/Server/Main.cs:89 msgid "Delete user from Server" msgstr "" #: ../src/Server/Main.cs:98 msgid "List all existing users of Server" msgstr "" #: ../src/Server/Main.cs:107 msgid "User to create, modify or delete" msgstr "" #: ../src/Server/Main.cs:116 msgid "Password of the user when creating or modifying a user" msgstr "" #: ../src/Server/Main.cs:125 msgid "Enable debug output" msgstr "" #: ../src/Server/Main.cs:133 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" #: ../src/Server/Main.cs:146 msgid "Show this help" msgstr "" #: ../src/Server/Main.cs:148 msgid "Usage: smuxi-server [options]" msgstr "" #: ../src/Server/Main.cs:150 msgid "Options:" msgstr "" #: ../src/Server/Main.cs:161 #, csharp-format msgid "Unknown option: '{0}'" msgstr "" #: ../src/Server/Main.cs:188 #, csharp-format msgid "Command line error: {0}" msgstr "" #: ../src/Server/Main.cs:232 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "" #: ../src/Server/Main.cs:242 msgid "You must specify a username with the --username option." msgstr "" #: ../src/Server/Main.cs:248 msgid "Username must not be empty." msgstr "" #: ../src/Server/Main.cs:258 msgid "You must specify a password with the --password option." msgstr "" #: ../src/Server/Main.cs:264 msgid "Password must not be empty." msgstr "" #: ../src/Server/Main.cs:283 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "" #: ../src/Server/Main.cs:303 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "" #: ../src/Server/Main.cs:312 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "" #: ../src/Server/Main.cs:321 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "" #: ../src/Server/Main.cs:328 msgid "Users:" msgstr "" #: ../src/Server/Main.cs:376 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "" #: ../src/Server/Main.cs:389 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "" smuxi-1.1/po-Server/da.po0000664000175000017500000001003014011526464016123 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2011,2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:48+0000\n" "PO-Revision-Date: 2015-05-03 19:24+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Server/Main.cs:65 msgid "Add user to Server" msgstr "Tilføj bruger til Server" #: ../src/Server/Main.cs:74 msgid "Modify existing user of Server" msgstr "Ændr eksisterende bruger af Server" #: ../src/Server/Main.cs:83 msgid "Delete user from Server" msgstr "Slet bruger fra Server" #: ../src/Server/Main.cs:92 msgid "List all existing users of Server" msgstr "Vis alle eksisterende brugere af Server" #: ../src/Server/Main.cs:101 msgid "User to create, modify or delete" msgstr "Bruger at oprette, ændre eller slette" #: ../src/Server/Main.cs:110 msgid "Password of the user when creating or modifying a user" msgstr "Adgangskode på brugeren når en bruger oprettes eller ændres" #: ../src/Server/Main.cs:119 msgid "Enable debug output" msgstr "Aktiver fejlsøgningsuddata" #: ../src/Server/Main.cs:127 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimer mellemlager for beskeder og afslut (gyldige værdier: none, defrag, " "index, all)" #: ../src/Server/Main.cs:140 msgid "Show this help" msgstr "Vis denne hjælp" #: ../src/Server/Main.cs:142 msgid "Usage: smuxi-server [options]" msgstr "Brug: smuxi-server [tilvalg]" #: ../src/Server/Main.cs:144 msgid "Options:" msgstr "Tilvalg:" #: ../src/Server/Main.cs:152 msgid "Show version" msgstr "Vis version" #: ../src/Server/Main.cs:165 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Ukendt tilvalg: '{0}'" #: ../src/Server/Main.cs:192 #, csharp-format msgid "Command line error: {0}" msgstr "Kommandolinjefejl: {0}" #: ../src/Server/Main.cs:236 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a " "time." msgstr "" "Kun et af tilvalgene --add-user, --modify-user og --delete-user kan bruges " "på samme tid." #: ../src/Server/Main.cs:246 msgid "You must specify a username with the --username option." msgstr "Du skal angive et brugernavn med tilvalget --username." #: ../src/Server/Main.cs:252 msgid "Username must not be empty." msgstr "Brugernavn må ikke være tomt." #: ../src/Server/Main.cs:262 msgid "You must specify a password with the --password option." msgstr "Du skal angive en adgangskode med tilvalget --password." #: ../src/Server/Main.cs:268 msgid "Password must not be empty." msgstr "Adgangskode må ikke være tomt." #: ../src/Server/Main.cs:287 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values " "are: {0}" msgstr "" "Ugyldig optimeringsværdi sendt til --optimize-message-buffer, gyldige " "værdier er: {0}" #: ../src/Server/Main.cs:307 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Bruger »{0}« tilføjet til server." #: ../src/Server/Main.cs:316 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Bruger »{0}« ændret." #: ../src/Server/Main.cs:325 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Bruger »{0}« slettet fra server." #: ../src/Server/Main.cs:332 msgid "Users:" msgstr "Brugere:" #: ../src/Server/Main.cs:380 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Lykkedes med optimering af {0} beskedmellemlagre." #: ../src/Server/Main.cs:393 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Kunne ikke optimere beskedmellemlagre: {0}" smuxi-1.1/po-Server/hr.po0000664000175000017500000001017114011526464016156 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2012-01-08 10:34+0000\n" "Last-Translator: Matias M. \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: ../src/Server/Main.cs:71 msgid "Add user to Server" msgstr "Dodaj korisnika na poslužitelj" #: ../src/Server/Main.cs:80 msgid "Modify existing user of Server" msgstr "Uredi postojećeg korisnika poslužitelja" #: ../src/Server/Main.cs:89 msgid "Delete user from Server" msgstr "Ukloni korisnika sa poslužitelja" #: ../src/Server/Main.cs:98 msgid "List all existing users of Server" msgstr "Ispiši sve postojeće korisnike poslužitelja" #: ../src/Server/Main.cs:107 msgid "User to create, modify or delete" msgstr "Korisnik za stvaranje, uređivanje ili uklanjanje" #: ../src/Server/Main.cs:116 msgid "Password of the user when creating or modifying a user" msgstr "Lozinka korisnika pri stvaranju ili uređivanju korisnika" #: ../src/Server/Main.cs:125 msgid "Enable debug output" msgstr "Omogući debug ispis" #: ../src/Server/Main.cs:133 msgid "" "Optimize message buffers and exit (valid values: none, defrag, index, all)" msgstr "" "Optimiziraj međuspremnike poruka i zatvori (važeće vrijednosti: none, " "defrag, index, all)" #: ../src/Server/Main.cs:146 msgid "Show this help" msgstr "Prikaži ovu pomoć" #: ../src/Server/Main.cs:148 msgid "Usage: smuxi-server [options]" msgstr "Upotreba: smuxi-server [opcije]" #: ../src/Server/Main.cs:150 msgid "Options:" msgstr "Opcije:" #: ../src/Server/Main.cs:161 #, csharp-format msgid "Unknown option: '{0}'" msgstr "Nepoznata opcija: '{0}'" #: ../src/Server/Main.cs:188 #, csharp-format msgid "Command line error: {0}" msgstr "Pogreška komandne linije: {0}" #: ../src/Server/Main.cs:232 msgid "" "At most one of --add-user, --modify-user, and --delete-user may be used at a" " time." msgstr "" "Najviše jedna naredba --add-user, --modify-user, ili --delete-user mogu biti" " korištene istovremeno." #: ../src/Server/Main.cs:242 msgid "You must specify a username with the --username option." msgstr "Morate odrediti korisničko ime sa --username opcijom." #: ../src/Server/Main.cs:248 msgid "Username must not be empty." msgstr "Korisničko ime ne smije biti prazno." #: ../src/Server/Main.cs:258 msgid "You must specify a password with the --password option." msgstr "Morate odrediti lozinku sa --password opcijom." #: ../src/Server/Main.cs:264 msgid "Password must not be empty." msgstr "Lozinka ne smije biti prazna." #: ../src/Server/Main.cs:283 #, csharp-format msgid "" "Invalid optimization value passed to --optimize-message-buffer, valid values" " are: {0}" msgstr "" "Nevažeća optimizacijska vrijednost dodijeljena --optimize-message-bufferu, " "važeće vrijednosti su: {0}" #: ../src/Server/Main.cs:303 #, csharp-format msgid "User \"{0}\" successfully added to server." msgstr "Dodavanje korisnika \"{0}\" na poslužitelj uspješno izvršeno." #: ../src/Server/Main.cs:312 #, csharp-format msgid "User \"{0}\" successfully modified." msgstr "Uređivanje korisnika \"{0}\" uspješno izvršeno." #: ../src/Server/Main.cs:321 #, csharp-format msgid "User \"{0}\" successfully deleted from server." msgstr "Uklanjanje korisnika \"{0}\" sa poslužitelja uspješno izvršeno." #: ../src/Server/Main.cs:328 msgid "Users:" msgstr "Korisnici:" #: ../src/Server/Main.cs:376 #, csharp-format msgid "Successfully optimized {0} message buffers." msgstr "Međuspremnici poruka {0} uspješno optimizirani." #: ../src/Server/Main.cs:389 #, csharp-format msgid "Failed to optimize message buffers: {0}" msgstr "Optimizacija međuspremnika poruka {0} nije uspjela." smuxi-1.1/README.md0000664000175000017500000000331314011472672014603 0ustar00meebeymeebey00000000000000Software Requirements ===================== First you will need to install a few libraries to compile the source Build tools & libraries: * Automake, Autoconf, gettext, pkg-config * Mono SDK (>= 4.6.2) * Nini (>= 1.1) * log4net * SQLite3 * GTK# (>= 2.10) (optional, but required for the GNOME frontend) * Notify# (optional) * Indicate# / MessagingMenu# (optional) * DBus# / NDesk.DBus (optional) * GtkSpell (optional) * STFL (optional) Depending on your operating system and favorite distribution the installation of the listed applications varies. For Debian based distributions it's just a matter of the following commands: apt-get install mono-devel mono-xbuild libnini-cil-dev liblog4net-cil-dev libgtk2.0-cil-dev libglade2.0-cil-dev libnotify-cil-dev libdbus2.0-cil-dev libdbus2.0-cil-dev lsb-release Compiling Source ================ ./autogen.sh || ./configure make Installing ========== make install Running ======= Now you can start Smuxi from the GNOME or KDE menu. Source Structure ================ src/ ---- This directory contains the source code of all Smuxi components. lib/ ---- This directory contains libraries that Smuxi needs and ships as part of Smuxi. po\*/ ----- These directories contain translation files based on gettext. debian/ ------- The debian/ directory contains upstream packaging used for the daily development builds for Ubuntu and Debian found on [launchpad][] (which you can subscribe to via `sudo add-apt-repository -y ppa:meebey/smuxi-daily && sudo apt update`). The official (downstream) Debian packaging can be found on [here][]. [launchpad]: https://launchpad.net/~meebey/+archive/smuxi-daily [here]: http://git.debian.org/?p=pkg-cli-apps/packages/smuxi.git smuxi-1.1/lib/0000775000175000017500000000000014011526500014060 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/0000775000175000017500000000000014011526500017371 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/0000775000175000017500000000000014011526500020160 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/0000755000175000017500000000000012652476423023510 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Reflection/0000755000175000017500000000000012146506553025576 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Reflection/StaticAccessors.cs0000644000175000017500000000450012146506553031221 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Reflection; #if !XBOX using System.Linq.Expressions ; #endif namespace ServiceStack.Text.Reflection { public static class StaticAccessors { public static Func GetValueGetter(this PropertyInfo propertyInfo, Type type) { #if SILVERLIGHT || MONOTOUCH || XBOX var getMethodInfo = propertyInfo.GetGetMethod(); if (getMethodInfo == null) return null; return x => getMethodInfo.Invoke(x, new object[0]); #else var instance = Expression.Parameter(typeof(object), "i"); var convertInstance = Expression.TypeAs(instance, propertyInfo.DeclaringType); var property = Expression.Property(convertInstance, propertyInfo); var convertProperty = Expression.TypeAs(property, typeof(object)); return Expression.Lambda>(convertProperty, instance).Compile(); #endif } public static Func GetValueGetter(this PropertyInfo propertyInfo) { #if SILVERLIGHT || MONOTOUCH || XBOX var getMethodInfo = propertyInfo.GetGetMethod(); if (getMethodInfo == null) return null; return x => getMethodInfo.Invoke(x, new object[0]); #else var instance = Expression.Parameter(propertyInfo.DeclaringType, "i"); var property = Expression.Property(instance, propertyInfo); var convert = Expression.TypeAs(property, typeof(object)); return Expression.Lambda>(convert, instance).Compile(); #endif } #if !XBOX public static Action GetValueSetter(this PropertyInfo propertyInfo) { if (typeof(T) != propertyInfo.DeclaringType) { throw new ArgumentException(); } var instance = Expression.Parameter(propertyInfo.DeclaringType, "i"); var argument = Expression.Parameter(typeof(object), "a"); var setterCall = Expression.Call( instance, propertyInfo.GetSetMethod(), Expression.Convert(argument, propertyInfo.PropertyType)); return Expression.Lambda> ( setterCall, instance, argument ).Compile(); } #endif } } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ITracer.cs0000644000175000017500000000065212146506553025367 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Text { public interface ITracer { void WriteDebug(string error); void WriteDebug(string format, params object[] args); void WriteWarning(string warning); void WriteWarning(string format, params object[] args); void WriteError(Exception ex); void WriteError(string error); void WriteError(string format, params object[] args); } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/AssemblyUtils.cs0000644000175000017500000001037112146506553026635 0ustar00meebeymeebey00000000000000using System; using System.IO; using System.Reflection; using System.Text; using System.Text.RegularExpressions; #if SILVERLIGHT using System.Windows; #endif using ServiceStack.Common.Support; namespace ServiceStack.Text { /// /// Utils to load types /// public static class AssemblyUtils { private const string FileUri = "file:///"; private const string DllExt = "dll"; private const string ExeExt = "dll"; private const char UriSeperator = '/'; #if !XBOX /// /// Find the type from the name supplied /// /// [typeName] or [typeName, assemblyName] /// public static Type FindType(string typeName) { #if !SILVERLIGHT var type = Type.GetType(typeName); if (type != null) return type; #endif var typeDef = new AssemblyTypeDefinition(typeName); if (!String.IsNullOrEmpty(typeDef.AssemblyName)) { return FindType(typeDef.TypeName, typeDef.AssemblyName); } else { return FindTypeFromLoadedAssemblies(typeDef.TypeName); } } #endif #if !XBOX /// /// Find type if it exists /// /// /// /// The type if it exists public static Type FindType(string typeName, string assemblyName) { var type = FindTypeFromLoadedAssemblies(typeName); if (type != null) { return type; } var binPath = GetAssemblyBinPath(Assembly.GetExecutingAssembly()); Assembly assembly = null; var assemblyDllPath = binPath + String.Format("{0}.{1}", assemblyName, DllExt); if (File.Exists(assemblyDllPath)) { assembly = LoadAssembly(assemblyDllPath); } var assemblyExePath = binPath + String.Format("{0}.{1}", assemblyName, ExeExt); if (File.Exists(assemblyExePath)) { assembly = LoadAssembly(assemblyExePath); } return assembly != null ? assembly.GetType(typeName) : null; } #endif #if !XBOX public static Type FindTypeFromLoadedAssemblies(string typeName) { #if SILVERLIGHT4 var assemblies = ((dynamic) AppDomain.CurrentDomain).GetAssemblies() as Assembly[]; #else var assemblies = AppDomain.CurrentDomain.GetAssemblies(); #endif foreach (var assembly in assemblies) { var type = assembly.GetType(typeName); if (type != null) { return type; } } return null; } #endif #if !SILVERLIGHT private static Assembly LoadAssembly(string assemblyPath) { return Assembly.LoadFrom(assemblyPath); } #else private static Assembly LoadAssembly(string assemblyPath) { var sri = Application.GetResourceStream(new Uri(assemblyPath, UriKind.Relative)); var myPart = new AssemblyPart(); var assembly = myPart.Load(sri.Stream); return assembly; } #endif #if !XBOX public static string GetAssemblyBinPath(Assembly assembly) { var binPathPos = assembly.CodeBase.LastIndexOf(UriSeperator); var assemblyPath = assembly.CodeBase.Substring(0, binPathPos + 1); if (assemblyPath.StartsWith(FileUri)) { assemblyPath = assemblyPath.Remove(0, FileUri.Length); } return assemblyPath; } #endif #if !SILVERLIGHT static readonly Regex versionRegEx = new Regex(", Version=[^\\]]+", RegexOptions.Compiled); #else static readonly Regex versionRegEx = new Regex(", Version=[^\\]]+"); #endif public static string ToTypeString(this Type type) { return versionRegEx.Replace(type.AssemblyQualifiedName, ""); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Controller/0000755000175000017500000000000012146506553025627 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Controller/PathInfo.cs0000644000175000017500000000520212146506553027665 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Linq; namespace ServiceStack.Text.Controller { /// /// Class to hold /// public class PathInfo { public string ControllerName { get; private set; } public string ActionName { get; private set; } public List Arguments { get; private set; } public Dictionary Options { get; private set; } public PathInfo(string actionName, params string[] arguments) : this(actionName, arguments.ToList(), null) { } public PathInfo(string actionName, List arguments, Dictionary options) { ActionName = actionName; Arguments = arguments ?? new List(); Options = options ?? new Dictionary(); } public string FirstArgument { get { return this.Arguments.Count > 0 ? this.Arguments[0] : null; } } public T GetArgumentValue(int index) { return TypeSerializer.DeserializeFromString(this.Arguments[index]); } /// /// Parses the specified path info. /// e.g. /// MusicPage/arg1/0/true?debug&showFlows=3 => PathInfo /// .ActionName = 'MusicPage' /// .Arguments = ['arg1','0','true'] /// .Options = { debug:'True', showFlows:'3' } /// /// The path url. /// public static PathInfo Parse(string pathUri) { var actionParts = pathUri.Split(new[] { "://" }, StringSplitOptions.None); var controllerName = actionParts.Length == 2 ? actionParts[0] : null; var pathInfo = actionParts[actionParts.Length - 1]; var optionMap = new Dictionary(); var optionsPos = pathInfo.LastIndexOf('?'); if (optionsPos != -1) { var options = pathInfo.Substring(optionsPos + 1).Split('&'); foreach (var option in options) { var keyValuePair = option.Split('='); optionMap[keyValuePair[0]] = keyValuePair.Length == 1 ? true.ToString() : keyValuePair[1].UrlDecode(); } pathInfo = pathInfo.Substring(0, optionsPos); } var args = pathInfo.Split('/'); var pageName = args[0]; return new PathInfo(pageName, args.Skip(1).ToList(), optionMap) { ControllerName = controllerName }; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Controller/CommandProcessor.cs0000644000175000017500000000414612146506553031441 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Linq; namespace ServiceStack.Text.Controller { public class CommandProcessor { private object[] Controllers { get; set; } private readonly Dictionary contextMap; public CommandProcessor(object[] controllers) { this.Controllers = controllers; this.contextMap = new Dictionary(); controllers.ToList().ForEach(x => contextMap[x.GetType().Name] = x); } public void Invoke(string commandUri) { var actionParts = commandUri.Split(new[] { "://" }, StringSplitOptions.None); var controllerName = actionParts[0]; var pathInfo = PathInfo.Parse(actionParts[1]); object context; if (!this.contextMap.TryGetValue(controllerName, out context)) { throw new Exception("UnknownContext: " + controllerName); } var methodName = pathInfo.ActionName; var method = context.GetType().GetMethods().First( c => c.Name == methodName && c.GetParameters().Count() == pathInfo.Arguments.Count); var methodParamTypes = method.GetParameters().Select(x => x.ParameterType); var methodArgs = ConvertValuesToTypes(pathInfo.Arguments, methodParamTypes.ToList()); try { method.Invoke(context, methodArgs); } catch (Exception ex) { throw new Exception("InvalidCommand", ex); } } private static object[] ConvertValuesToTypes(IList values, IList types) { var convertedValues = new object[types.Count]; for (var i = 0; i < types.Count; i++) { var propertyValueType = types[i]; var propertyValueString = values[i]; var argValue = TypeSerializer.DeserializeFromString(propertyValueString, propertyValueType); convertedValues[i] = argValue; } return convertedValues; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ReflectionExtensions.cs0000644000175000017500000003001612146506553030205 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Serialization; using System.Threading; using ServiceStack.Text.Support; namespace ServiceStack.Text { public delegate object EmptyCtorDelegate(); public static class ReflectionExtensions { private static Dictionary DefaultValueTypes = new Dictionary(); public static object GetDefaultValue(Type type) { if (!type.IsValueType) return null; object defaultValue; if (DefaultValueTypes.TryGetValue(type, out defaultValue)) return defaultValue; defaultValue = Activator.CreateInstance(type); Dictionary snapshot, newCache; do { snapshot = DefaultValueTypes; newCache = new Dictionary(DefaultValueTypes); newCache[type] = defaultValue; } while (!ReferenceEquals( Interlocked.CompareExchange(ref DefaultValueTypes, newCache, snapshot), snapshot)); return defaultValue; } public static bool IsInstanceOf(this Type type, Type thisOrBaseType) { while (type != null) { if (type == thisOrBaseType) return true; type = type.BaseType; } return false; } public static bool IsGenericType(this Type type) { while (type != null) { if (type.IsGenericType) return true; type = type.BaseType; } return false; } public static Type GetGenericType(this Type type) { while (type != null) { if (type.IsGenericType) return type; type = type.BaseType; } return null; } public static bool IsOrHasGenericInterfaceTypeOf(this Type type, Type genericTypeDefinition) { return type.GetTypeWithGenericTypeDefinitionOf(genericTypeDefinition) != null; } public static Type GetTypeWithGenericTypeDefinitionOf(this Type type, Type genericTypeDefinition) { foreach (var t in type.GetInterfaces()) { if (t.IsGenericType && t.GetGenericTypeDefinition() == genericTypeDefinition) { return t; } } var genericType = type.GetGenericType(); if (genericType != null && genericType.GetGenericTypeDefinition() == genericTypeDefinition) { return genericType; } return null; } public static Type GetTypeWithInterfaceOf(this Type type, Type interfaceType) { if (type == interfaceType) return interfaceType; foreach (var t in type.GetInterfaces()) { if (t == interfaceType) return t; } return null; } public static bool HasInterface(this Type type, Type interfaceType) { foreach (var t in type.GetInterfaces()) { if (t == interfaceType) return true; } return false; } public static bool AllHaveInterfacesOfType( this Type assignableFromType, params Type[] types) { foreach (var type in types) { if (assignableFromType.GetTypeWithInterfaceOf(type) == null) return false; } return true; } public static bool IsNumericType(this Type type) { if (!type.IsValueType) return false; return type.IsIntegerType() || type.IsRealNumberType(); } public static bool IsIntegerType(this Type type) { if (!type.IsValueType) return false; var underlyingType = Nullable.GetUnderlyingType(type) ?? type; return underlyingType == typeof(byte) || underlyingType == typeof(sbyte) || underlyingType == typeof(short) || underlyingType == typeof(ushort) || underlyingType == typeof(int) || underlyingType == typeof(uint) || underlyingType == typeof(long) || underlyingType == typeof(ulong); } public static bool IsRealNumberType(this Type type) { if (!type.IsValueType) return false; var underlyingType = Nullable.GetUnderlyingType(type) ?? type; return underlyingType == typeof(float) || underlyingType == typeof(double) || underlyingType == typeof(decimal); } public static Type GetTypeWithGenericInterfaceOf(this Type type, Type genericInterfaceType) { foreach (var t in type.GetInterfaces()) { if (t.IsGenericType && t.GetGenericTypeDefinition() == genericInterfaceType) return t; } if (!type.IsGenericType) return null; var genericType = type.GetGenericType(); return genericType.GetGenericTypeDefinition() == genericInterfaceType ? genericType : null; } public static bool HasAnyTypeDefinitionsOf(this Type genericType, params Type[] theseGenericTypes) { if (!genericType.IsGenericType) return false; var genericTypeDefinition = genericType.GetGenericTypeDefinition(); foreach (var thisGenericType in theseGenericTypes) { if (genericTypeDefinition == thisGenericType) return true; } return false; } public static Type[] GetGenericArgumentsIfBothHaveSameGenericDefinitionTypeAndArguments( this Type assignableFromType, Type typeA, Type typeB) { var typeAInterface = typeA.GetTypeWithGenericInterfaceOf(assignableFromType); if (typeAInterface == null) return null; var typeBInterface = typeB.GetTypeWithGenericInterfaceOf(assignableFromType); if (typeBInterface == null) return null; var typeAGenericArgs = typeAInterface.GetGenericArguments(); var typeBGenericArgs = typeBInterface.GetGenericArguments(); if (typeAGenericArgs.Length != typeBGenericArgs.Length) return null; for (var i = 0; i < typeBGenericArgs.Length; i++) { if (typeAGenericArgs[i] != typeBGenericArgs[i]) { return null; } } return typeAGenericArgs; } public static TypePair GetGenericArgumentsIfBothHaveConvertibleGenericDefinitionTypeAndArguments( this Type assignableFromType, Type typeA, Type typeB) { var typeAInterface = typeA.GetTypeWithGenericInterfaceOf(assignableFromType); if (typeAInterface == null) return null; var typeBInterface = typeB.GetTypeWithGenericInterfaceOf(assignableFromType); if (typeBInterface == null) return null; var typeAGenericArgs = typeAInterface.GetGenericArguments(); var typeBGenericArgs = typeBInterface.GetGenericArguments(); if (typeAGenericArgs.Length != typeBGenericArgs.Length) return null; for (var i = 0; i < typeBGenericArgs.Length; i++) { if (!AreAllStringOrValueTypes(typeAGenericArgs[i], typeBGenericArgs[i])) { return null; } } return new TypePair(typeAGenericArgs, typeBGenericArgs); } public static bool AreAllStringOrValueTypes(params Type[] types) { foreach (var type in types) { if (!(type == typeof(string) || type.IsValueType)) return false; } return true; } static Dictionary ConstructorMethods = new Dictionary(); public static EmptyCtorDelegate GetConstructorMethod(Type type) { EmptyCtorDelegate emptyCtorFn; if (ConstructorMethods.TryGetValue(type, out emptyCtorFn)) return emptyCtorFn; emptyCtorFn = GetConstructorMethodToCache(type); Dictionary snapshot, newCache; do { snapshot = ConstructorMethods; newCache = new Dictionary(ConstructorMethods); newCache[type] = emptyCtorFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ConstructorMethods, newCache, snapshot), snapshot)); return emptyCtorFn; } static Dictionary TypeNamesMap = new Dictionary(); public static EmptyCtorDelegate GetConstructorMethod(string typeName) { EmptyCtorDelegate emptyCtorFn; if (TypeNamesMap.TryGetValue(typeName, out emptyCtorFn)) return emptyCtorFn; var type = AssemblyUtils.FindType(typeName); if (type == null) return null; emptyCtorFn = GetConstructorMethodToCache(type); Dictionary snapshot, newCache; do { snapshot = TypeNamesMap; newCache = new Dictionary(TypeNamesMap); newCache[typeName] = emptyCtorFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref TypeNamesMap, newCache, snapshot), snapshot)); return emptyCtorFn; } public static EmptyCtorDelegate GetConstructorMethodToCache(Type type) { var emptyCtor = type.GetConstructor(Type.EmptyTypes); if (emptyCtor != null) { #if MONOTOUCH || SILVERLIGHT || XBOX return () => Activator.CreateInstance(type); #else var dm = new System.Reflection.Emit.DynamicMethod("MyCtor", type, Type.EmptyTypes, typeof(ReflectionExtensions).Module, true); var ilgen = dm.GetILGenerator(); ilgen.Emit(System.Reflection.Emit.OpCodes.Nop); ilgen.Emit(System.Reflection.Emit.OpCodes.Newobj, emptyCtor); ilgen.Emit(System.Reflection.Emit.OpCodes.Ret); return (EmptyCtorDelegate)dm.CreateDelegate(typeof(EmptyCtorDelegate)); #endif } #if SILVERLIGHT || XBOX return () => Activator.CreateInstance(type); #else //Anonymous types don't have empty constructors return () => FormatterServices.GetUninitializedObject(type); #endif } private static class TypeMeta { public static readonly EmptyCtorDelegate EmptyCtorFn; static TypeMeta() { EmptyCtorFn = GetConstructorMethodToCache(typeof(T)); } } public static object CreateInstance() { return TypeMeta.EmptyCtorFn(); } public static object CreateInstance(this Type type) { var ctorFn = GetConstructorMethod(type); return ctorFn(); } public static object CreateInstance(string typeName) { var ctorFn = GetConstructorMethod(typeName); return ctorFn(); } public static PropertyInfo[] GetPublicProperties(this Type type) { if (type.IsInterface) { var propertyInfos = new List(); var considered = new List(); var queue = new Queue(); considered.Add(type); queue.Enqueue(type); while (queue.Count > 0) { var subType = queue.Dequeue(); foreach (var subInterface in subType.GetInterfaces()) { if (considered.Contains(subInterface)) continue; considered.Add(subInterface); queue.Enqueue(subInterface); } var typeProperties = subType.GetProperties( BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance); var newPropertyInfos = typeProperties .Where(x => !propertyInfos.Contains(x)); propertyInfos.InsertRange(0, newPropertyInfos); } return propertyInfos.ToArray(); } return type.GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance); } const string DataContract = "DataContractAttribute"; const string DataMember = "DataMemberAttribute"; const string IgnoreDataMember = "IgnoreDataMemberAttribute"; public static PropertyInfo[] GetSerializableProperties(this Type type) { var publicProperties = GetPublicProperties(type); var publicReadableProperties = publicProperties.Where(x => x.GetGetMethod(false) != null); //If it is a 'DataContract' only return 'DataMember' properties. //checking for "DataContract" using strings to avoid dependency on System.Runtime.Serialization if (type.IsDto()) { return publicReadableProperties.Where(attr => attr.GetCustomAttributes(false).Any(x => x.GetType().Name == DataMember)) .ToArray(); } // else return those properties that are not decorated with IgnoreDataMember return publicReadableProperties.Where(prop => !prop.GetCustomAttributes(false).Any(attr => attr.GetType().Name == IgnoreDataMember)).ToArray(); } public static bool IsDto(this Type type) { return type.GetCustomAttributes(true).Any(x => x.GetType().Name == DataContract); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Env.cs0000644000175000017500000000171512146506553024567 0ustar00meebeymeebey00000000000000 using System; namespace ServiceStack.Text { public static class Env { static Env() { var platform = (int)Environment.OSVersion.Platform; IsUnix = (platform == 4) || (platform == 6) || (platform == 128); IsMono = Type.GetType("Mono.Runtime") != null; IsMonoTouch = Type.GetType("MonoTouch.Foundation.NSObject") != null; SupportsExpressions = SupportsEmit = !IsMonoTouch; ServerUserAgent = "ServiceStack/" + ServiceStackVersion + " " + Environment.OSVersion.Platform + (IsMono ? "/Mono" : "/.NET") + (IsMonoTouch ? " MonoTouch" : ""); } public static decimal ServiceStackVersion = 3.55m; public static bool IsUnix { get; set; } public static bool IsMono { get; set; } public static bool IsMonoTouch { get; set; } public static bool SupportsExpressions { get; set; } public static bool SupportsEmit { get; set; } public static string ServerUserAgent { get; set; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/0000755000175000017500000000000012146506553024734 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/JsWriter.cs0000644000175000017500000002662312146506553027045 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using System.IO; using ServiceStack.Text.Json; using ServiceStack.Text.Jsv; namespace ServiceStack.Text.Common { public static class JsWriter { public const string TypeAttr = "__type"; public const char MapStartChar = '{'; public const char MapKeySeperator = ':'; public const char ItemSeperator = ','; public const char MapEndChar = '}'; public const string MapNullValue = "\"\""; public const string EmptyMap = "{}"; public const char ListStartChar = '['; public const char ListEndChar = ']'; public const char ReturnChar = '\r'; public const char LineFeedChar = '\n'; public const char QuoteChar = '"'; public const string QuoteString = "\""; public const string EscapedQuoteString = "\\\""; public const string ItemSeperatorString = ","; public const string MapKeySeperatorString = ":"; public static readonly char[] CsvChars = new[] { ItemSeperator, QuoteChar }; public static readonly char[] EscapeChars = new[] { QuoteChar, MapKeySeperator, ItemSeperator, MapStartChar, MapEndChar, ListStartChar, ListEndChar, ReturnChar, LineFeedChar }; private const int LengthFromLargestChar = '}' + 1; private static readonly bool[] EscapeCharFlags = new bool[LengthFromLargestChar]; static JsWriter() { foreach (var escapeChar in EscapeChars) { EscapeCharFlags[escapeChar] = true; } var loadConfig = JsConfig.IncludeNullValues; } public static void WriteDynamic(Action callback) { JsState.IsWritingDynamic = true; try { callback(); } finally { JsState.IsWritingDynamic = false; } } /// /// micro optimizations: using flags instead of value.IndexOfAny(EscapeChars) /// /// /// public static bool HasAnyEscapeChars(string value) { var len = value.Length; for (var i = 0; i < len; i++) { var c = value[i]; if (c >= LengthFromLargestChar || !EscapeCharFlags[c]) continue; return true; } return false; } internal static void WriteItemSeperatorIfRanOnce(TextWriter writer, ref bool ranOnce) { if (ranOnce) writer.Write(ItemSeperator); else ranOnce = true; foreach (var escapeChar in EscapeChars) { EscapeCharFlags[escapeChar] = true; } } internal static bool ShouldUseDefaultToStringMethod(Type type) { return type == typeof(byte) || type == typeof(byte?) || type == typeof(short) || type == typeof(short?) || type == typeof(ushort) || type == typeof(ushort?) || type == typeof(int) || type == typeof(int?) || type == typeof(uint) || type == typeof(uint?) || type == typeof(long) || type == typeof(long?) || type == typeof(ulong) || type == typeof(ulong?) || type == typeof(bool) || type == typeof(bool?) || type == typeof(DateTime) || type == typeof(DateTime?) || type == typeof(Guid) || type == typeof(Guid?) || type == typeof(float) || type == typeof(float?) || type == typeof(double) || type == typeof(double?) || type == typeof(decimal) || type == typeof(decimal?); } internal static ITypeSerializer GetTypeSerializer() { if (typeof(TSerializer) == typeof(JsvTypeSerializer)) return JsvTypeSerializer.Instance; if (typeof(TSerializer) == typeof(JsonTypeSerializer)) return JsonTypeSerializer.Instance; throw new NotSupportedException(typeof(TSerializer).Name); } } internal class JsWriter where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); public JsWriter() { this.SpecialTypes = new Dictionary { { typeof(Uri), Serializer.WriteObjectString }, { typeof(Type), WriteType }, { typeof(Exception), Serializer.WriteException }, #if !MONOTOUCH && !SILVERLIGHT && !XBOX { typeof(System.Data.Linq.Binary), Serializer.WriteLinqBinary }, #endif }; } public WriteObjectDelegate GetValueTypeToStringMethod(Type type) { if (type == typeof(char) || type == typeof(char?)) return Serializer.WriteChar; if (type == typeof(int) || type == typeof(int?)) return Serializer.WriteInt32; if (type == typeof(long) || type == typeof(long?)) return Serializer.WriteInt64; if (type == typeof(ulong) || type == typeof(ulong?)) return Serializer.WriteUInt64; if (type == typeof(uint) || type == typeof(uint?)) return Serializer.WriteUInt32; if (type == typeof(byte) || type == typeof(byte?)) return Serializer.WriteByte; if (type == typeof(short) || type == typeof(short?)) return Serializer.WriteInt16; if (type == typeof(ushort) || type == typeof(ushort?)) return Serializer.WriteUInt16; if (type == typeof(bool) || type == typeof(bool?)) return Serializer.WriteBool; if (type == typeof(DateTime)) return Serializer.WriteDateTime; if (type == typeof(DateTime?)) return Serializer.WriteNullableDateTime; if (type == typeof(Guid)) return Serializer.WriteGuid; if (type == typeof(Guid?)) return Serializer.WriteNullableGuid; if (type == typeof(float) || type == typeof(float?)) return Serializer.WriteFloat; if (type == typeof(double) || type == typeof(double?)) return Serializer.WriteDouble; if (type == typeof(decimal) || type == typeof(decimal?)) return Serializer.WriteDecimal; if (type.IsEnum || type.UnderlyingSystemType.IsEnum) return type.GetCustomAttributes(typeof(FlagsAttribute), false).Length > 0 ? (WriteObjectDelegate)Serializer.WriteEnumFlags : Serializer.WriteEnum; return Serializer.WriteObjectString; } internal WriteObjectDelegate GetWriteFn() { if (typeof(T) == typeof(string)) { return Serializer.WriteObjectString; } if (typeof(T).IsValueType) { return JsConfig.SerializeFn != null ? JsConfig.WriteFn : GetValueTypeToStringMethod(typeof(T)); } var specialWriteFn = GetSpecialWriteFn(typeof(T)); if (specialWriteFn != null) { return specialWriteFn; } if (typeof(T).IsArray) { if (typeof(T) == typeof(byte[])) return (w, x) => WriteLists.WriteBytes(Serializer, w, x); if (typeof(T) == typeof(string[])) return (w, x) => WriteLists.WriteStringArray(Serializer, w, x); if (typeof(T) == typeof(int[])) return WriteListsOfElements.WriteGenericArrayValueType; if (typeof(T) == typeof(long[])) return WriteListsOfElements.WriteGenericArrayValueType; var elementType = typeof(T).GetElementType(); var writeFn = WriteListsOfElements.GetGenericWriteArray(elementType); return writeFn; } if (typeof(T).IsGenericType()) { if (typeof(T).IsOrHasGenericInterfaceTypeOf(typeof(IList<>))) return WriteLists.Write; var mapInterface = typeof(T).GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); if (mapInterface != null) { var mapTypeArgs = mapInterface.GetGenericArguments(); var writeFn = WriteDictionary.GetWriteGenericDictionary( mapTypeArgs[0], mapTypeArgs[1]); var keyWriteFn = Serializer.GetWriteFn(mapTypeArgs[0]); var valueWriteFn = Serializer.GetWriteFn(mapTypeArgs[1]); return (w, x) => writeFn(w, x, keyWriteFn, valueWriteFn); } var enumerableInterface = typeof(T).GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); if (enumerableInterface != null) { var elementType = enumerableInterface.GetGenericArguments()[0]; var writeFn = WriteListsOfElements.GetGenericWriteEnumerable(elementType); return writeFn; } } var isCollection = typeof(T).IsOrHasGenericInterfaceTypeOf(typeof(ICollection)); if (isCollection) { var isDictionary = typeof(T).IsAssignableFrom(typeof(IDictionary)) || typeof(T).HasInterface(typeof(IDictionary)); if (isDictionary) { return WriteDictionary.WriteIDictionary; } return WriteListsOfElements.WriteIEnumerable; } var isEnumerable = typeof(T).IsAssignableFrom(typeof(IEnumerable)) || typeof(T).HasInterface(typeof(IEnumerable)); if (isEnumerable) { return WriteListsOfElements.WriteIEnumerable; } if (typeof(T).IsClass || typeof(T).IsInterface) { var typeToStringMethod = WriteType.Write; if (typeToStringMethod != null) { return typeToStringMethod; } } return Serializer.WriteBuiltIn; } public Dictionary SpecialTypes; public WriteObjectDelegate GetSpecialWriteFn(Type type) { WriteObjectDelegate writeFn = null; if (SpecialTypes.TryGetValue(type, out writeFn)) return writeFn; if (type.IsInstanceOfType(typeof(Type))) return WriteType; if (type.IsInstanceOf(typeof(Exception))) return Serializer.WriteException; return null; } public void WriteType(TextWriter writer, object value) { Serializer.WriteRawString(writer, ((Type)value).ToTypeString()); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeCollection.cs0000644000175000017500000001077012146506553031544 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Reflection; using System.Threading; namespace ServiceStack.Text.Common { internal static class DeserializeCollection where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); public static ParseStringDelegate GetParseMethod(Type type) { var collectionInterface = type.GetTypeWithGenericInterfaceOf(typeof(ICollection<>)); if (collectionInterface == null) throw new ArgumentException(string.Format("Type {0} is not of type ICollection<>", type.FullName)); //optimized access for regularly used types if (type.HasInterface(typeof(ICollection))) return value => ParseStringCollection(value, type); if (type.HasInterface(typeof(ICollection))) return value => ParseIntCollection(value, type); var elementType = collectionInterface.GetGenericArguments()[0]; var supportedTypeParseMethod = Serializer.GetParseFn(elementType); if (supportedTypeParseMethod != null) { var createCollectionType = type.HasAnyTypeDefinitionsOf(typeof(ICollection<>)) ? null : type; return value => ParseCollectionType(value, createCollectionType, elementType, supportedTypeParseMethod); } return null; } public static ICollection ParseStringCollection(string value, Type createType) { var items = DeserializeArrayWithElements.ParseGenericArray(value, Serializer.ParseString); return CreateAndPopulate(createType, items); } public static ICollection ParseIntCollection(string value, Type createType) { var items = DeserializeArrayWithElements.ParseGenericArray(value, x => int.Parse(x)); return CreateAndPopulate(createType, items); } public static ICollection ParseCollection(string value, Type createType, ParseStringDelegate parseFn) { if (value == null) return null; var items = DeserializeArrayWithElements.ParseGenericArray(value, parseFn); return CreateAndPopulate(createType, items); } private static ICollection CreateAndPopulate(Type ofCollectionType, T[] withItems) { if (ofCollectionType == null) return new List(withItems); var genericTypeDefinition = ofCollectionType.IsGenericType() ? ofCollectionType.GetGenericTypeDefinition() : null; #if !XBOX if (genericTypeDefinition == typeof(HashSet)) return new HashSet(withItems); #endif if (genericTypeDefinition == typeof(LinkedList)) return new LinkedList(withItems); var collection = (ICollection)ofCollectionType.CreateInstance(); foreach (var item in withItems) { collection.Add(item); } return collection; } private static Dictionary ParseDelegateCache = new Dictionary(); private delegate object ParseCollectionDelegate(string value, Type createType, ParseStringDelegate parseFn); public static object ParseCollectionType(string value, Type createType, Type elementType, ParseStringDelegate parseFn) { ParseCollectionDelegate parseDelegate; if (ParseDelegateCache.TryGetValue(elementType, out parseDelegate)) return parseDelegate(value, createType, parseFn); var mi = typeof(DeserializeCollection).GetMethod("ParseCollection", BindingFlags.Static | BindingFlags.Public); var genericMi = mi.MakeGenericMethod(new[] { elementType }); parseDelegate = (ParseCollectionDelegate)Delegate.CreateDelegate(typeof(ParseCollectionDelegate), genericMi); Dictionary snapshot, newCache; do { snapshot = ParseDelegateCache; newCache = new Dictionary(ParseDelegateCache); newCache[elementType] = parseDelegate; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot)); return parseDelegate(value, createType, parseFn); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeTypeUtils.cs0000644000175000017500000000225612146506553031413 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Reflection; namespace ServiceStack.Text.Common { public class DeserializeTypeUtils { public static ParseStringDelegate GetParseMethod(Type type) { var typeConstructor = GetTypeStringConstructor(type); if (typeConstructor != null) { return value => typeConstructor.Invoke(new object[] { value }); } return null; } /// /// Get the type(string) constructor if exists /// /// The type. /// public static ConstructorInfo GetTypeStringConstructor(Type type) { foreach (var ci in type.GetConstructors()) { var paramInfos = ci.GetParameters(); var matchFound = (paramInfos.Length == 1 && paramInfos[0].ParameterType == typeof(string)); if (matchFound) { return ci; } } return null; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeTypeRef.cs0000644000175000017500000000654712146506553031036 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Runtime.Serialization; namespace ServiceStack.Text.Common { internal static class DeserializeTypeRef { internal static SerializationException CreateSerializationError(Type type, string strType) { return new SerializationException(String.Format( "Type definitions should start with a '{0}', expecting serialized type '{1}', got string starting with: {2}", JsWriter.MapStartChar, type.Name, strType.Substring(0, strType.Length < 50 ? strType.Length : 50))); } /* The old Reference generic implementation internal static object StringToType( ITypeSerializer Serializer, Type type, string strType, EmptyCtorDelegate ctorFn, Dictionary typeAccessorMap) { var index = 0; if (strType == null) return null; if (!Serializer.EatMapStartChar(strType, ref index)) throw DeserializeTypeRef.CreateSerializationError(type, strType); if (strType == JsWriter.EmptyMap) return ctorFn(); object instance = null; var strTypeLength = strType.Length; while (index < strTypeLength) { var propertyName = Serializer.EatMapKey(strType, ref index); Serializer.EatMapKeySeperator(strType, ref index); var propertyValueStr = Serializer.EatValue(strType, ref index); var possibleTypeInfo = propertyValueStr != null && propertyValueStr.Length > 1 && propertyValueStr[0] == '_'; if (possibleTypeInfo && propertyName == JsWriter.TypeAttr) { var typeName = Serializer.ParseString(propertyValueStr); instance = ReflectionExtensions.CreateInstance(typeName); if (instance == null) { Tracer.Instance.WriteWarning("Could not find type: " + propertyValueStr); } else { //If __type info doesn't match, ignore it. if (!type.IsInstanceOfType(instance)) instance = null; } Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); continue; } if (instance == null) instance = ctorFn(); TypeAccessor typeAccessor; typeAccessorMap.TryGetValue(propertyName, out typeAccessor); var propType = possibleTypeInfo ? TypeAccessor.ExtractType(Serializer, propertyValueStr) : null; if (propType != null) { try { if (typeAccessor != null) { var parseFn = Serializer.GetParseFn(propType); var propertyValue = parseFn(propertyValueStr); typeAccessor.SetProperty(instance, propertyValue); } Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); continue; } catch { Tracer.Instance.WriteWarning("WARN: failed to set dynamic property {0} with: {1}", propertyName, propertyValueStr); } } if (typeAccessor != null && typeAccessor.GetProperty != null && typeAccessor.SetProperty != null) { try { var propertyValue = typeAccessor.GetProperty(propertyValueStr); typeAccessor.SetProperty(instance, propertyValue); } catch { Tracer.Instance.WriteWarning("WARN: failed to set property {0} with: {1}", propertyName, propertyValueStr); } } Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); } return instance; } */ } //The same class above but JSON-specific to enable inlining in this hot class. }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeListWithElements.cs0000644000175000017500000001754712146506553032726 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Reflection; using System.Threading; namespace ServiceStack.Text.Common { internal static class DeserializeListWithElements where TSerializer : ITypeSerializer { internal static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); private static Dictionary ParseDelegateCache = new Dictionary(); private delegate object ParseListDelegate(string value, Type createListType, ParseStringDelegate parseFn); public static Func GetListTypeParseFn( Type createListType, Type elementType, ParseStringDelegate parseFn) { ParseListDelegate parseDelegate; if (ParseDelegateCache.TryGetValue(elementType, out parseDelegate)) return parseDelegate.Invoke; var genericType = typeof(DeserializeListWithElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("ParseGenericList", BindingFlags.Static | BindingFlags.Public); parseDelegate = (ParseListDelegate)Delegate.CreateDelegate(typeof(ParseListDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ParseDelegateCache; newCache = new Dictionary(ParseDelegateCache); newCache[elementType] = parseDelegate; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot)); return parseDelegate.Invoke; } internal static string StripList(string value) { if (string.IsNullOrEmpty(value)) return null; const int startQuotePos = 1; const int endQuotePos = 2; return value[0] == JsWriter.ListStartChar ? value.Substring(startQuotePos, value.Length - endQuotePos) : value; } public static List ParseStringList(string value) { if ((value = StripList(value)) == null) return null; if (value == string.Empty) return new List(); var to = new List(); var valueLength = value.Length; var i = 0; while (i < valueLength) { var elementValue = Serializer.EatValue(value, ref i); var listValue = elementValue; to.Add(listValue); Serializer.EatItemSeperatorOrMapEndChar(value, ref i); } return to; } public static List ParseIntList(string value) { if ((value = StripList(value)) == null) return null; if (value == string.Empty) return new List(); var intParts = value.Split(JsWriter.ItemSeperator); var intValues = new List(intParts.Length); foreach (var intPart in intParts) { intValues.Add(int.Parse(intPart)); } return intValues; } } internal static class DeserializeListWithElements where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); public static ICollection ParseGenericList(string value, Type createListType, ParseStringDelegate parseFn) { if ((value = DeserializeListWithElements.StripList(value)) == null) return null; var isReadOnly = createListType != null && (createListType.IsGenericType && createListType.GetGenericTypeDefinition() == typeof(ReadOnlyCollection<>)); var to = (createListType == null || isReadOnly) ? new List() : (ICollection)createListType.CreateInstance(); if (value == string.Empty) return to; if (!string.IsNullOrEmpty(value)) { if (value[0] == JsWriter.MapStartChar) { var i = 0; do { var itemValue = Serializer.EatTypeValue(value, ref i); to.Add((T)parseFn(itemValue)); } while (++i < value.Length); } else { var valueLength = value.Length; var i = 0; while (i < valueLength) { var elementValue = Serializer.EatValue(value, ref i); var listValue = elementValue; to.Add((T)parseFn(listValue)); Serializer.EatItemSeperatorOrMapEndChar(value, ref i); } } } //TODO: 8-10-2011 -- this CreateInstance call should probably be moved over to ReflectionExtensions, //but not sure how you'd like to go about caching constructors with parameters -- I would probably build a NewExpression, .Compile to a LambdaExpression and cache return isReadOnly ? (ICollection)Activator.CreateInstance(createListType, to) : to; } } internal static class DeserializeList where TSerializer : ITypeSerializer { private readonly static ParseStringDelegate CacheFn; static DeserializeList() { CacheFn = GetParseFn(); } public static ParseStringDelegate Parse { get { return CacheFn; } } public static ParseStringDelegate GetParseFn() { var listInterface = typeof(T).GetTypeWithGenericInterfaceOf(typeof(IList<>)); if (listInterface == null) throw new ArgumentException(string.Format("Type {0} is not of type IList<>", typeof(T).FullName)); //optimized access for regularly used types if (typeof(T) == typeof(List)) return DeserializeListWithElements.ParseStringList; if (typeof(T) == typeof(List)) return DeserializeListWithElements.ParseIntList; var elementType = listInterface.GetGenericArguments()[0]; var supportedTypeParseMethod = DeserializeListWithElements.Serializer.GetParseFn(elementType); if (supportedTypeParseMethod != null) { var createListType = typeof(T).HasAnyTypeDefinitionsOf(typeof(List<>), typeof(IList<>)) ? null : typeof(T); var parseFn = DeserializeListWithElements.GetListTypeParseFn(createListType, elementType, supportedTypeParseMethod); return value => parseFn(value, createListType, supportedTypeParseMethod); } return null; } } internal static class DeserializeEnumerable where TSerializer : ITypeSerializer { private readonly static ParseStringDelegate CacheFn; static DeserializeEnumerable() { CacheFn = GetParseFn(); } public static ParseStringDelegate Parse { get { return CacheFn; } } public static ParseStringDelegate GetParseFn() { var enumerableInterface = typeof(T).GetTypeWithGenericInterfaceOf(typeof(IEnumerable<>)); if (enumerableInterface == null) throw new ArgumentException(string.Format("Type {0} is not of type IEnumerable<>", typeof(T).FullName)); //optimized access for regularly used types if (typeof(T) == typeof(IEnumerable)) return DeserializeListWithElements.ParseStringList; if (typeof(T) == typeof(IEnumerable)) return DeserializeListWithElements.ParseIntList; var elementType = enumerableInterface.GetGenericArguments()[0]; var supportedTypeParseMethod = DeserializeListWithElements.Serializer.GetParseFn(elementType); if (supportedTypeParseMethod != null) { const Type createListTypeWithNull = null; //Use conversions outside this class. see: Queue var parseFn = DeserializeListWithElements.GetListTypeParseFn( createListTypeWithNull, elementType, supportedTypeParseMethod); return value => parseFn(value, createListTypeWithNull, supportedTypeParseMethod); } return null; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeArray.cs0000644000175000017500000001373112146506553030527 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Reflection; using System.Threading; namespace ServiceStack.Text.Common { internal static class DeserializeArrayWithElements where TSerializer : ITypeSerializer { private static Dictionary ParseDelegateCache = new Dictionary(); private delegate object ParseArrayOfElementsDelegate(string value, ParseStringDelegate parseFn); public static Func GetParseFn(Type type) { ParseArrayOfElementsDelegate parseFn; if (ParseDelegateCache.TryGetValue(type, out parseFn)) return parseFn.Invoke; var genericType = typeof(DeserializeArrayWithElements<,>).MakeGenericType(type, typeof(TSerializer)); var mi = genericType.GetMethod("ParseGenericArray", BindingFlags.Public | BindingFlags.Static); parseFn = (ParseArrayOfElementsDelegate)Delegate.CreateDelegate(typeof(ParseArrayOfElementsDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ParseDelegateCache; newCache = new Dictionary(ParseDelegateCache); newCache[type] = parseFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot)); return parseFn.Invoke; } } internal static class DeserializeArrayWithElements where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); public static T[] ParseGenericArray(string value, ParseStringDelegate elementParseFn) { if ((value = DeserializeListWithElements.StripList(value)) == null) return null; if (value == string.Empty) return new T[0]; if (value[0] == JsWriter.MapStartChar) { var itemValues = new List(); var i = 0; do { itemValues.Add(Serializer.EatTypeValue(value, ref i)); } while (++i < value.Length); var results = new T[itemValues.Count]; for (var j=0; j < itemValues.Count; j++) { results[j] = (T)elementParseFn(itemValues[j]); } return results; } else { var to = new List(); var valueLength = value.Length; var i = 0; while (i < valueLength) { var elementValue = Serializer.EatValue(value, ref i); var listValue = elementValue; to.Add((T)elementParseFn(listValue)); Serializer.EatItemSeperatorOrMapEndChar(value, ref i); } return to.ToArray(); } } } internal static class DeserializeArray where TSerializer : ITypeSerializer { private static Dictionary ParseDelegateCache = new Dictionary(); public static ParseStringDelegate GetParseFn(Type type) { ParseStringDelegate parseFn; if (ParseDelegateCache.TryGetValue(type, out parseFn)) return parseFn; var genericType = typeof(DeserializeArray<,>).MakeGenericType(type, typeof(TSerializer)); var mi = genericType.GetMethod("GetParseFn", BindingFlags.Public | BindingFlags.Static); var parseFactoryFn = (Func)Delegate.CreateDelegate( typeof(Func), mi); parseFn = parseFactoryFn(); Dictionary snapshot, newCache; do { snapshot = ParseDelegateCache; newCache = new Dictionary(ParseDelegateCache); newCache[type] = parseFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot)); return parseFn; } } internal static class DeserializeArray where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); private static readonly ParseStringDelegate CacheFn; static DeserializeArray() { CacheFn = GetParseFn(); } public static ParseStringDelegate Parse { get { return CacheFn; } } public static ParseStringDelegate GetParseFn() { var type = typeof (T); if (!type.IsArray) throw new ArgumentException(string.Format("Type {0} is not an Array type", type.FullName)); if (type == typeof(string[])) return ParseStringArray; if (type == typeof(byte[])) return ParseByteArray; var elementType = type.GetElementType(); var elementParseFn = Serializer.GetParseFn(elementType); if (elementParseFn != null) { var parseFn = DeserializeArrayWithElements.GetParseFn(elementType); return value => parseFn(value, elementParseFn); } return null; } public static string[] ParseStringArray(string value) { if ((value = DeserializeListWithElements.StripList(value)) == null) return null; return value == string.Empty ? new string[0] : DeserializeListWithElements.ParseStringList(value).ToArray(); } public static byte[] ParseByteArray(string value) { if ((value = DeserializeListWithElements.StripList(value)) == null) return null; if ((value = Serializer.ParseRawString(value)) == null) return null; return value == string.Empty ? new byte[0] : Convert.FromBase64String(value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cs0000644000175000017500000003766612146506553027416 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Threading; namespace ServiceStack.Text.Common { internal static class WriteListsOfElements where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); static Dictionary ListCacheFns = new Dictionary(); public static WriteObjectDelegate GetListWriteFn(Type elementType) { WriteObjectDelegate writeFn; if (ListCacheFns.TryGetValue(elementType, out writeFn)) return writeFn; var genericType = typeof(WriteListsOfElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteList", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ListCacheFns; newCache = new Dictionary(ListCacheFns); newCache[elementType] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ListCacheFns, newCache, snapshot), snapshot)); return writeFn; } static Dictionary IListCacheFns = new Dictionary(); public static WriteObjectDelegate GetIListWriteFn(Type elementType) { WriteObjectDelegate writeFn; if (IListCacheFns.TryGetValue(elementType, out writeFn)) return writeFn; var genericType = typeof(WriteListsOfElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteIList", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); Dictionary snapshot, newCache; do { snapshot = IListCacheFns; newCache = new Dictionary(IListCacheFns); newCache[elementType] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref IListCacheFns, newCache, snapshot), snapshot)); return writeFn; } static Dictionary CacheFns = new Dictionary(); public static WriteObjectDelegate GetGenericWriteArray(Type elementType) { WriteObjectDelegate writeFn; if (CacheFns.TryGetValue(elementType, out writeFn)) return writeFn; var genericType = typeof(WriteListsOfElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteArray", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); Dictionary snapshot, newCache; do { snapshot = CacheFns; newCache = new Dictionary(CacheFns); newCache[elementType] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref CacheFns, newCache, snapshot), snapshot)); return writeFn; } static Dictionary EnumerableCacheFns = new Dictionary(); public static WriteObjectDelegate GetGenericWriteEnumerable(Type elementType) { WriteObjectDelegate writeFn; if (EnumerableCacheFns.TryGetValue(elementType, out writeFn)) return writeFn; var genericType = typeof(WriteListsOfElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteEnumerable", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); Dictionary snapshot, newCache; do { snapshot = EnumerableCacheFns; newCache = new Dictionary(EnumerableCacheFns); newCache[elementType] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref EnumerableCacheFns, newCache, snapshot), snapshot)); return writeFn; } static Dictionary ListValueTypeCacheFns = new Dictionary(); public static WriteObjectDelegate GetWriteListValueType(Type elementType) { WriteObjectDelegate writeFn; if (ListValueTypeCacheFns.TryGetValue(elementType, out writeFn)) return writeFn; var genericType = typeof(WriteListsOfElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteListValueType", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ListValueTypeCacheFns; newCache = new Dictionary(ListValueTypeCacheFns); newCache[elementType] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ListValueTypeCacheFns, newCache, snapshot), snapshot)); return writeFn; } static Dictionary IListValueTypeCacheFns = new Dictionary(); public static WriteObjectDelegate GetWriteIListValueType(Type elementType) { WriteObjectDelegate writeFn; if (IListValueTypeCacheFns.TryGetValue(elementType, out writeFn)) return writeFn; var genericType = typeof(WriteListsOfElements<,>).MakeGenericType(elementType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteIListValueType", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); Dictionary snapshot, newCache; do { snapshot = IListValueTypeCacheFns; newCache = new Dictionary(IListValueTypeCacheFns); newCache[elementType] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref IListValueTypeCacheFns, newCache, snapshot), snapshot)); return writeFn; } public static void WriteIEnumerable(TextWriter writer, object oValueCollection) { WriteObjectDelegate toStringFn = null; writer.Write(JsWriter.ListStartChar); var valueCollection = (IEnumerable)oValueCollection; var ranOnce = false; foreach (var valueItem in valueCollection) { if (toStringFn == null) toStringFn = Serializer.GetWriteFn(valueItem.GetType()); JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); toStringFn(writer, valueItem); } writer.Write(JsWriter.ListEndChar); } } internal static class WriteListsOfElements where TSerializer : ITypeSerializer { private static readonly WriteObjectDelegate ElementWriteFn; static WriteListsOfElements() { ElementWriteFn = JsWriter.GetTypeSerializer().GetWriteFn(); } public static void WriteList(TextWriter writer, object oList) { if (oList == null) return; WriteGenericIList(writer, (IList)oList); } public static void WriteGenericList(TextWriter writer, List list) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; var listLength = list.Count; for (var i = 0; i < listLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, list[i]); } writer.Write(JsWriter.ListEndChar); } public static void WriteListValueType(TextWriter writer, object list) { WriteGenericListValueType(writer, (List)list); } public static void WriteGenericListValueType(TextWriter writer, List list) { if (list == null) return; //AOT writer.Write(JsWriter.ListStartChar); var ranOnce = false; var listLength = list.Count; for (var i = 0; i < listLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, list[i]); } writer.Write(JsWriter.ListEndChar); } public static void WriteIList(TextWriter writer, object oList) { if (oList == null) return; WriteGenericIList(writer, (IList)oList); } public static void WriteGenericIList(TextWriter writer, IList list) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; var listLength = list.Count; try { for (var i = 0; i < listLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, list[i]); } } catch (Exception ex) { Tracer.Instance.WriteError(ex); throw; } writer.Write(JsWriter.ListEndChar); } public static void WriteIListValueType(TextWriter writer, object list) { WriteGenericIListValueType(writer, (IList)list); } public static void WriteGenericIListValueType(TextWriter writer, IList list) { if (list == null) return; //AOT writer.Write(JsWriter.ListStartChar); var ranOnce = false; var listLength = list.Count; for (var i = 0; i < listLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, list[i]); } writer.Write(JsWriter.ListEndChar); } public static void WriteArray(TextWriter writer, object oArrayValue) { if (oArrayValue == null) return; WriteGenericArray(writer, (T[])oArrayValue); } public static void WriteGenericArrayValueType(TextWriter writer, object oArray) { writer.Write(JsWriter.ListStartChar); var array = (T[])oArray; var ranOnce = false; var arrayLength = array.Length; for (var i = 0; i < arrayLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, array[i]); } writer.Write(JsWriter.ListEndChar); } public static void WriteGenericArray(TextWriter writer, T[] array) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; var arrayLength = array.Length; for (var i = 0; i < arrayLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, array[i]); } writer.Write(JsWriter.ListEndChar); } public static void WriteEnumerable(TextWriter writer, object oEnumerable) { if (oEnumerable == null) return; WriteGenericEnumerable(writer, (IEnumerable)oEnumerable); } public static void WriteGenericEnumerable(TextWriter writer, IEnumerable enumerable) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; foreach (var value in enumerable) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, value); } writer.Write(JsWriter.ListEndChar); } public static void WriteGenericEnumerableValueType(TextWriter writer, IEnumerable enumerable) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; foreach (var value in enumerable) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); ElementWriteFn(writer, value); } writer.Write(JsWriter.ListEndChar); } } internal static class WriteLists { public static void WriteListString(ITypeSerializer serializer, TextWriter writer, object list) { WriteListString(serializer, writer, (List)list); } public static void WriteListString(ITypeSerializer serializer, TextWriter writer, List list) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; list.ForEach(x => { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); serializer.WriteString(writer, x); }); writer.Write(JsWriter.ListEndChar); } public static void WriteIListString(ITypeSerializer serializer, TextWriter writer, object list) { WriteIListString(serializer, writer, (IList)list); } public static void WriteIListString(ITypeSerializer serializer, TextWriter writer, IList list) { writer.Write(JsWriter.ListStartChar); var ranOnce = false; var listLength = list.Count; for (var i = 0; i < listLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); serializer.WriteString(writer, list[i]); } writer.Write(JsWriter.ListEndChar); } public static void WriteBytes(ITypeSerializer serializer, TextWriter writer, object byteValue) { if (byteValue == null) return; serializer.WriteBytes(writer, byteValue); } public static void WriteStringArray(ITypeSerializer serializer, TextWriter writer, object oList) { writer.Write(JsWriter.ListStartChar); var list = (string[])oList; var ranOnce = false; var listLength = list.Length; for (var i = 0; i < listLength; i++) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); serializer.WriteString(writer, list[i]); } writer.Write(JsWriter.ListEndChar); } } internal static class WriteLists where TSerializer : ITypeSerializer { private static readonly WriteObjectDelegate CacheFn; private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); static WriteLists() { CacheFn = GetWriteFn(); } public static WriteObjectDelegate Write { get { return CacheFn; } } public static WriteObjectDelegate GetWriteFn() { var type = typeof(T); var listInterface = type.GetTypeWithGenericTypeDefinitionOf(typeof(IList<>)); if (listInterface == null) throw new ArgumentException(string.Format("Type {0} is not of type IList<>", type.FullName)); //optimized access for regularly used types if (type == typeof(List)) return (w, x) => WriteLists.WriteListString(Serializer, w, x); if (type == typeof(IList)) return (w, x) => WriteLists.WriteIListString(Serializer, w, x); if (type == typeof(List)) return WriteListsOfElements.WriteListValueType; if (type == typeof(IList)) return WriteListsOfElements.WriteIListValueType; if (type == typeof(List)) return WriteListsOfElements.WriteListValueType; if (type == typeof(IList)) return WriteListsOfElements.WriteIListValueType; var elementType = listInterface.GetGenericArguments()[0]; var isGenericList = typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(List<>); if (elementType.IsValueType && JsWriter.ShouldUseDefaultToStringMethod(elementType)) { if (isGenericList) return WriteListsOfElements.GetWriteListValueType(elementType); return WriteListsOfElements.GetWriteIListValueType(elementType); } return isGenericList ? WriteListsOfElements.GetListWriteFn(elementType) : WriteListsOfElements.GetIListWriteFn(elementType); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/JsReader.cs0000644000175000017500000000625012146506553026765 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; namespace ServiceStack.Text.Common { internal class JsReader where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); public ParseStringDelegate GetParseFn() { var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); if (type.IsEnum) { return x => Enum.Parse(type, x, true); } if (type == typeof(string)) return Serializer.ParseString; if (type == typeof(object)) return DeserializeType.ObjectStringToType; var specialParseFn = ParseUtils.GetSpecialParseMethod(type); if (specialParseFn != null) return specialParseFn; if (type.IsEnum) return x => Enum.Parse(type, x, true); if (type.IsArray) { return DeserializeArray.Parse; } var builtInMethod = DeserializeBuiltin.Parse; if (builtInMethod != null) return value => builtInMethod(Serializer.ParseRawString(value)); if (JsConfig.SerializeFn != null) return value => JsConfig.ParseFn(Serializer.ParseRawString(value)); if (type.IsGenericType()) { if (type.IsOrHasGenericInterfaceTypeOf(typeof(IList<>))) return DeserializeList.Parse; if (type.IsOrHasGenericInterfaceTypeOf(typeof(IDictionary<,>))) return DeserializeDictionary.GetParseMethod(type); if (type.IsOrHasGenericInterfaceTypeOf(typeof(ICollection<>))) return DeserializeCollection.GetParseMethod(type); if (type.HasAnyTypeDefinitionsOf(typeof(Queue<>)) || type.HasAnyTypeDefinitionsOf(typeof(Stack<>))) return DeserializeSpecializedCollections.Parse; if (type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable<>))) return DeserializeEnumerable.Parse; } var isCollection = typeof(T).IsOrHasGenericInterfaceTypeOf(typeof(ICollection)); if (isCollection) { var isDictionary = typeof(T).IsAssignableFrom(typeof(IDictionary)) || typeof(T).HasInterface(typeof(IDictionary)); if (isDictionary) { return DeserializeDictionary.GetParseMethod(type); } return DeserializeEnumerable.Parse; } var isEnumerable = typeof(T).IsAssignableFrom(typeof(IEnumerable)) || typeof(T).HasInterface(typeof(IEnumerable)); if (isEnumerable) { var parseFn = DeserializeSpecializedCollections.Parse; if (parseFn != null) return parseFn; } if (type.IsValueType) { var staticParseMethod = StaticParseMethod.Parse; if (staticParseMethod != null) return value => staticParseMethod(Serializer.ParseRawString(value)); } var typeConstructor = DeserializeType.GetParseMethod(TypeConfig.GetState()); if (typeConstructor != null) return typeConstructor; var stringConstructor = DeserializeTypeUtils.GetParseMethod(type); if (stringConstructor != null) return stringConstructor; return DeserializeType.ParseAbstractType; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeType.cs0000644000175000017500000001762412146506553030377 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // #if !XBOX && !MONOTOUCH && !SILVERLIGHT using System.Reflection.Emit; #endif using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; using System.Linq; namespace ServiceStack.Text.Common { internal static class DeserializeType where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); private static readonly string TypeAttrInObject = Serializer.TypeAttrInObject; public static ParseStringDelegate GetParseMethod(TypeConfig typeConfig) { var type = typeConfig.Type; if (!type.IsClass || type.IsAbstract || type.IsInterface) return null; var propertyInfos = type.GetSerializableProperties(); if (propertyInfos.Length == 0) { var emptyCtorFn = ReflectionExtensions.GetConstructorMethodToCache(type); return value => emptyCtorFn(); } var map = new Dictionary(StringComparer.OrdinalIgnoreCase); var isDataContract = type.GetCustomAttributes(typeof(DataContractAttribute), false).Any(); foreach (var propertyInfo in propertyInfos) { var propertyName = propertyInfo.Name; if (isDataContract) { var dcsDataMember = propertyInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault() as DataMemberAttribute; if (dcsDataMember != null && dcsDataMember.Name != null) { propertyName = dcsDataMember.Name; } } map[propertyName] = TypeAccessor.Create(Serializer, typeConfig, propertyInfo); } var ctorFn = ReflectionExtensions.GetConstructorMethodToCache(type); return typeof(TSerializer) == typeof(Json.JsonTypeSerializer) ? (ParseStringDelegate)(value => DeserializeTypeRefJson.StringToType(type, value, ctorFn, map)) : value => DeserializeTypeRefJsv.StringToType(type, value, ctorFn, map); } public static object ObjectStringToType(string strType) { var type = ExtractType(strType); if (type != null) { var parseFn = Serializer.GetParseFn(type); var propertyValue = parseFn(strType); return propertyValue; } return strType; } public static Type ExtractType(string strType) { if (strType != null && strType.Length > TypeAttrInObject.Length && strType.Substring(0, TypeAttrInObject.Length) == TypeAttrInObject) { var propIndex = TypeAttrInObject.Length; var typeName = Serializer.EatValue(strType, ref propIndex); var type = AssemblyUtils.FindType(typeName); if (type == null) Tracer.Instance.WriteWarning("Could not find type: " + typeName); return type; } return null; } public static object ParseAbstractType(string value) { if (typeof(T).IsAbstract) { if (string.IsNullOrEmpty(value)) return null; var concreteType = ExtractType(value); if (concreteType != null) { return Serializer.GetParseFn(concreteType)(value); } Tracer.Instance.WriteWarning( "Could not deserialize Abstract Type with unknown concrete type: " + typeof(T).FullName); } return null; } } internal class TypeAccessor { internal ParseStringDelegate GetProperty; internal SetPropertyDelegate SetProperty; public static Type ExtractType(ITypeSerializer Serializer, string strType) { var TypeAttrInObject = Serializer.TypeAttrInObject; if (strType != null && strType.Length > TypeAttrInObject.Length && strType.Substring(0, TypeAttrInObject.Length) == TypeAttrInObject) { var propIndex = TypeAttrInObject.Length; var typeName = Serializer.EatValue(strType, ref propIndex); var type = AssemblyUtils.FindType(typeName); if (type == null) Tracer.Instance.WriteWarning("Could not find type: " + typeName); return type; } return null; } public static TypeAccessor Create(ITypeSerializer serializer, TypeConfig typeConfig, PropertyInfo propertyInfo) { return new TypeAccessor { GetProperty = serializer.GetParseFn(propertyInfo.PropertyType), SetProperty = GetSetPropertyMethod(typeConfig, propertyInfo), }; } private static SetPropertyDelegate GetSetPropertyMethod(TypeConfig typeConfig, PropertyInfo propertyInfo) { if (!propertyInfo.CanWrite && !typeConfig.EnableAnonymousFieldSetterses) return null; FieldInfo fieldInfo = null; if (!propertyInfo.CanWrite) { //TODO: What string comparison is used in SST? var fieldName = string.Format("<{0}>i__Field", propertyInfo.Name); var fieldInfos = typeConfig.Type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.SetField); foreach (var f in fieldInfos) { if (f.IsInitOnly && f.FieldType == propertyInfo.PropertyType && f.Name == fieldName) { fieldInfo = f; break; } } if (fieldInfo == null) return null; } #if SILVERLIGHT || MONOTOUCH || XBOX if (propertyInfo.CanWrite) { var setMethodInfo = propertyInfo.GetSetMethod(true); return (instance, value) => setMethodInfo.Invoke(instance, new[] { value }); } if (fieldInfo == null) return null; return (instance, value) => fieldInfo.SetValue(instance, value); #else return propertyInfo.CanWrite ? CreateIlPropertySetter(propertyInfo) : CreateIlFieldSetter(fieldInfo); #endif } #if !SILVERLIGHT && !MONOTOUCH && !XBOX private static SetPropertyDelegate CreateIlPropertySetter(PropertyInfo propertyInfo) { var propSetMethod = propertyInfo.GetSetMethod(true); if (propSetMethod == null) return null; var setter = CreateDynamicSetMethod(propertyInfo); var generator = setter.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); generator.Emit(OpCodes.Ldarg_1); generator.Emit(propertyInfo.PropertyType.IsClass ? OpCodes.Castclass : OpCodes.Unbox_Any, propertyInfo.PropertyType); generator.EmitCall(OpCodes.Callvirt, propSetMethod, (Type[])null); generator.Emit(OpCodes.Ret); return (SetPropertyDelegate)setter.CreateDelegate(typeof(SetPropertyDelegate)); } private static SetPropertyDelegate CreateIlFieldSetter(FieldInfo fieldInfo) { var setter = CreateDynamicSetMethod(fieldInfo); var generator = setter.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Castclass, fieldInfo.DeclaringType); generator.Emit(OpCodes.Ldarg_1); generator.Emit(fieldInfo.FieldType.IsClass ? OpCodes.Castclass : OpCodes.Unbox_Any, fieldInfo.FieldType); generator.Emit(OpCodes.Stfld, fieldInfo); generator.Emit(OpCodes.Ret); return (SetPropertyDelegate)setter.CreateDelegate(typeof(SetPropertyDelegate)); } private static DynamicMethod CreateDynamicSetMethod(MemberInfo memberInfo) { var args = new[] { typeof(object), typeof(object) }; var name = string.Format("_{0}{1}_", "Set", memberInfo.Name); var returnType = typeof(void); return !memberInfo.DeclaringType.IsInterface ? new DynamicMethod(name, returnType, args, memberInfo.DeclaringType, true) : new DynamicMethod(name, returnType, args, memberInfo.Module, true); } #endif internal static SetPropertyDelegate GetSetPropertyMethod(Type type, PropertyInfo propertyInfo) { if (!propertyInfo.CanWrite) return null; #if SILVERLIGHT || MONOTOUCH || XBOX var setMethodInfo = propertyInfo.GetSetMethod(true); return (instance, value) => setMethodInfo.Invoke(instance, new[] { value }); #else return CreateIlPropertySetter(propertyInfo); #endif } } } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/ParseUtils.cs0000644000175000017500000000256712146506553027370 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Reflection; namespace ServiceStack.Text.Common { internal static class ParseUtils { public static object NullValueType(Type type) { return ReflectionExtensions.GetDefaultValue(type); } public static object ParseObject(string value) { return value; } public static object ParseEnum(Type type, string value) { return Enum.Parse(type, value, false); } public static ParseStringDelegate GetSpecialParseMethod(Type type) { if (type == typeof(Uri)) return x => new Uri(x.FromCsvField()); //Warning: typeof(object).IsInstanceOfType(typeof(Type)) == True?? if (type.IsInstanceOfType(typeof(Type))) return ParseType; if (type == typeof(Exception)) return x => new Exception(x); if (type.IsInstanceOf(typeof(Exception))) return DeserializeTypeUtils.GetParseMethod(type); return null; } public static Type ParseType(string assemblyQualifiedName) { return Type.GetType(assemblyQualifiedName.FromCsvField()); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/JsState.cs0000644000175000017500000000047512146506553026646 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Text.Common { internal static class JsState { //Exposing field for perf [ThreadStatic] internal static int WritingKeyCount = 0; [ThreadStatic] internal static bool IsWritingValue = false; [ThreadStatic] internal static bool IsWritingDynamic = false; } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs0000644000175000017500000000636412146506553031516 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Runtime.Serialization; using ServiceStack.Text.Jsv; namespace ServiceStack.Text.Common { internal static class DeserializeTypeRefJsv { private static readonly JsvTypeSerializer Serializer = (JsvTypeSerializer)JsvTypeSerializer.Instance; internal static object StringToType( Type type, string strType, EmptyCtorDelegate ctorFn, Dictionary typeAccessorMap) { var index = 0; if (strType == null) return null; //if (!Serializer.EatMapStartChar(strType, ref index)) if (strType[index++] != JsWriter.MapStartChar) throw DeserializeTypeRef.CreateSerializationError(type, strType); if (strType == JsWriter.EmptyMap) return ctorFn(); object instance = null; var strTypeLength = strType.Length; while (index < strTypeLength) { var propertyName = Serializer.EatMapKey(strType, ref index); //Serializer.EatMapKeySeperator(strType, ref index); index++; var propertyValueStr = Serializer.EatValue(strType, ref index); var possibleTypeInfo = propertyValueStr != null && propertyValueStr.Length > 1 && propertyValueStr[0] == '_'; if (possibleTypeInfo && propertyName == JsWriter.TypeAttr) { var typeName = Serializer.ParseString(propertyValueStr); instance = ReflectionExtensions.CreateInstance(typeName); if (instance == null) { Tracer.Instance.WriteWarning("Could not find type: " + propertyValueStr); } else { //If __type info doesn't match, ignore it. if (!type.IsInstanceOfType(instance)) instance = null; } //Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); if (index != strType.Length) index++; continue; } if (instance == null) instance = ctorFn(); TypeAccessor typeAccessor; typeAccessorMap.TryGetValue(propertyName, out typeAccessor); var propType = possibleTypeInfo ? TypeAccessor.ExtractType(Serializer, propertyValueStr) : null; if (propType != null) { try { if (typeAccessor != null) { var parseFn = Serializer.GetParseFn(propType); var propertyValue = parseFn(propertyValueStr); typeAccessor.SetProperty(instance, propertyValue); } //Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); if (index != strType.Length) index++; continue; } catch { Tracer.Instance.WriteWarning("WARN: failed to set dynamic property {0} with: {1}", propertyName, propertyValueStr); } } if (typeAccessor != null && typeAccessor.GetProperty != null && typeAccessor.SetProperty != null) { try { var propertyValue = typeAccessor.GetProperty(propertyValueStr); typeAccessor.SetProperty(instance, propertyValue); } catch { Tracer.Instance.WriteWarning("WARN: failed to set property {0} with: {1}", propertyName, propertyValueStr); } } //Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); if (index != strType.Length) index++; } return instance; } } //The same class above but JSON-specific to enable inlining in this hot class. }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/StaticParseMethod.cs0000644000175000017500000000307712146506553030655 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Reflection; namespace ServiceStack.Text.Common { internal delegate object ParseDelegate(string value); public static class StaticParseMethod { const string ParseMethod = "Parse"; private static readonly ParseStringDelegate CacheFn; public static ParseStringDelegate Parse { get { return CacheFn; } } static StaticParseMethod() { CacheFn = GetParseFn(); } public static ParseStringDelegate GetParseFn() { // Get the static Parse(string) method on the type supplied var parseMethodInfo = typeof(T).GetMethod( ParseMethod, BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(string) }, null); if (parseMethodInfo == null) return null; ParseDelegate parseDelegate; try { parseDelegate = (ParseDelegate)Delegate.CreateDelegate(typeof(ParseDelegate), parseMethodInfo); } catch ( ArgumentException ) { //Try wrapping strongly-typed return with wrapper fn. var typedParseDelegate = (Func)Delegate.CreateDelegate(typeof(Func), parseMethodInfo); parseDelegate = x => typedParseDelegate(x); } if (parseDelegate != null) return value => parseDelegate(value.FromCsvField()); return null; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeBuiltin.cs0000644000175000017500000001024612146506553031055 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Globalization; namespace ServiceStack.Text.Common { public static class DeserializeBuiltin { private static readonly ParseStringDelegate CachedParseFn; static DeserializeBuiltin() { CachedParseFn = GetParseFn(); } public static ParseStringDelegate Parse { get { return CachedParseFn; } } private static ParseStringDelegate GetParseFn() { //Note the generic typeof(T) is faster than using var type = typeof(T) if (typeof(T) == typeof(bool)) return value => bool.Parse(value); if (typeof(T) == typeof(byte)) return value => byte.Parse(value); if (typeof(T) == typeof(sbyte)) return value => sbyte.Parse(value); if (typeof(T) == typeof(short)) return value => short.Parse(value); if (typeof(T) == typeof(int)) return value => int.Parse(value); if (typeof(T) == typeof(long)) return value => long.Parse(value); if (typeof(T) == typeof(float)) return value => float.Parse(value, CultureInfo.InvariantCulture); if (typeof(T) == typeof(double)) return value => double.Parse(value, CultureInfo.InvariantCulture); if (typeof(T) == typeof(decimal)) return value => decimal.Parse(value, CultureInfo.InvariantCulture); if (typeof(T) == typeof(Guid)) return value => new Guid(value); if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?)) return value => DateTimeSerializer.ParseShortestXsdDateTime(value); if (typeof(T) == typeof(TimeSpan)) return value => TimeSpan.Parse(value); #if !MONOTOUCH && !SILVERLIGHT && !XBOX if (typeof(T) == typeof(System.Data.Linq.Binary)) return value => new System.Data.Linq.Binary(Convert.FromBase64String(value)); #endif if (typeof(T) == typeof(char)) { char cValue; return value => char.TryParse(value, out cValue) ? cValue : '\0'; } if (typeof(T) == typeof(ushort)) return value => ushort.Parse(value); if (typeof(T) == typeof(uint)) return value => uint.Parse(value); if (typeof(T) == typeof(ulong)) return value => ulong.Parse(value); if (typeof(T) == typeof(bool?)) return value => value == null ? (bool?)null : bool.Parse(value); if (typeof(T) == typeof(byte?)) return value => value == null ? (byte?)null : byte.Parse(value); if (typeof(T) == typeof(sbyte?)) return value => value == null ? (sbyte?)null : sbyte.Parse(value); if (typeof(T) == typeof(short?)) return value => value == null ? (short?)null : short.Parse(value); if (typeof(T) == typeof(int?)) return value => value == null ? (int?)null : int.Parse(value); if (typeof(T) == typeof(long?)) return value => value == null ? (long?)null : long.Parse(value); if (typeof(T) == typeof(float?)) return value => value == null ? (float?)null : float.Parse(value, CultureInfo.InvariantCulture); if (typeof(T) == typeof(double?)) return value => value == null ? (double?)null : double.Parse(value, CultureInfo.InvariantCulture); if (typeof(T) == typeof(decimal?)) return value => value == null ? (decimal?)null : decimal.Parse(value, CultureInfo.InvariantCulture); if (typeof(T) == typeof(TimeSpan?)) return value => value == null ? (TimeSpan?)null : TimeSpan.Parse(value); if (typeof(T) == typeof(Guid?)) return value => value == null ? (Guid?)null : new Guid(value); if (typeof(T) == typeof(ushort?)) return value => value == null ? (ushort?)null : ushort.Parse(value); if (typeof(T) == typeof(uint?)) return value => value == null ? (uint?)null : uint.Parse(value); if (typeof(T) == typeof(ulong?)) return value => value == null ? (ulong?)null : ulong.Parse(value); if (typeof(T) == typeof(char?)) { char cValue; return value => value == null ? (char?)null : char.TryParse(value, out cValue) ? cValue : '\0'; } return null; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cs0000644000175000017500000000221412146506553027454 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.IO; namespace ServiceStack.Text.Common { internal delegate void WriteListDelegate(TextWriter writer, object oList, WriteObjectDelegate toStringFn); internal delegate void WriteGenericListDelegate(TextWriter writer, IList list, WriteObjectDelegate toStringFn); internal delegate void WriteDelegate(TextWriter writer, object value); internal delegate ParseStringDelegate ParseFactoryDelegate(); internal delegate void WriteObjectDelegate(TextWriter writer, object obj); public delegate void SetPropertyDelegate(object instance, object propertyValue); public delegate object ParseStringDelegate(string stringValue); public delegate object ConvertObjectDelegate(object fromObject); public delegate object ConvertInstanceDelegate(object obj, Type type); } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeDictionary.cs0000644000175000017500000001465412146506553031563 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; using System.Text; using System.Threading; using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { internal static class DeserializeDictionary where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); const int KeyIndex = 0; const int ValueIndex = 1; public static ParseStringDelegate GetParseMethod(Type type) { var mapInterface = type.GetTypeWithGenericInterfaceOf(typeof(IDictionary<,>)); if (mapInterface == null) throw new ArgumentException(string.Format("Type {0} is not of type IDictionary<,>", type.FullName)); //optimized access for regularly used types if (type == typeof(Dictionary)) { return ParseStringDictionary; } var dictionaryArgs = mapInterface.GetGenericArguments(); var keyTypeParseMethod = Serializer.GetParseFn(dictionaryArgs[KeyIndex]); if (keyTypeParseMethod == null) return null; var valueTypeParseMethod = Serializer.GetParseFn(dictionaryArgs[ValueIndex]); if (valueTypeParseMethod == null) return null; var createMapType = type.HasAnyTypeDefinitionsOf(typeof(Dictionary<,>), typeof(IDictionary<,>)) ? null : type; return value => ParseDictionaryType(value, createMapType, dictionaryArgs, keyTypeParseMethod, valueTypeParseMethod); } public static Dictionary ParseStringDictionary(string value) { var index = VerifyAndGetStartIndex(value, typeof(Dictionary)); var result = new Dictionary(); if (value == JsWriter.EmptyMap) return result; var valueLength = value.Length; while (index < valueLength) { var keyValue = Serializer.EatMapKey(value, ref index); Serializer.EatMapKeySeperator(value, ref index); var elementValue = Serializer.EatValue(value, ref index); var mapKey = keyValue; var mapValue = elementValue; result[mapKey] = mapValue; Serializer.EatItemSeperatorOrMapEndChar(value, ref index); } return result; } public static IDictionary ParseDictionary( string value, Type createMapType, ParseStringDelegate parseKeyFn, ParseStringDelegate parseValueFn) { if (value == null) return null; var tryToParseItemsAsDictionaries = JsConfig.ConvertObjectTypesIntoStringDictionary && typeof(TValue) == typeof(object); var index = VerifyAndGetStartIndex(value, createMapType); var to = (createMapType == null) ? new Dictionary() : (IDictionary)ReflectionExtensions.CreateInstance(createMapType); if (value == JsWriter.EmptyMap) return to; var valueLength = value.Length; while (index < valueLength) { var keyValue = Serializer.EatMapKey(value, ref index); Serializer.EatMapKeySeperator(value, ref index); var elementValue = Serializer.EatValue(value, ref index); var mapKey = (TKey)parseKeyFn(keyValue); var mapValue = (TValue)parseValueFn(elementValue); if (tryToParseItemsAsDictionaries) { var mapValueString = mapValue as string; var tryParseValueAsDictionary = JsonUtils.IsJsObject(mapValueString); if (tryParseValueAsDictionary) { var tmpMap = ParseDictionary(mapValueString, createMapType, parseKeyFn, parseValueFn); to[mapKey] = (tmpMap != null && tmpMap.Count > 0) ? (TValue)tmpMap : to[mapKey] = mapValue; } else { to[mapKey] = mapValue; } } else { to[mapKey] = mapValue; } Serializer.EatItemSeperatorOrMapEndChar(value, ref index); } return to; } private static int VerifyAndGetStartIndex(string value, Type createMapType) { var index = 0; if (!Serializer.EatMapStartChar(value, ref index)) { //Don't throw ex because some KeyValueDataContractDeserializer don't have '{}' Tracer.Instance.WriteDebug("WARN: Map definitions should start with a '{0}', expecting serialized type '{1}', got string starting with: {2}", JsWriter.MapStartChar, createMapType != null ? createMapType.Name : "Dictionary<,>", value.Substring(0, value.Length < 50 ? value.Length : 50)); } return index; } private static Dictionary ParseDelegateCache = new Dictionary(); private delegate object ParseDictionaryDelegate(string value, Type createMapType, ParseStringDelegate keyParseFn, ParseStringDelegate valueParseFn); public static object ParseDictionaryType(string value, Type createMapType, Type[] argTypes, ParseStringDelegate keyParseFn, ParseStringDelegate valueParseFn) { ParseDictionaryDelegate parseDelegate; var key = GetTypesKey(argTypes); if (ParseDelegateCache.TryGetValue(key, out parseDelegate)) return parseDelegate(value, createMapType, keyParseFn, valueParseFn); var mi = typeof(DeserializeDictionary).GetMethod("ParseDictionary", BindingFlags.Static | BindingFlags.Public); var genericMi = mi.MakeGenericMethod(argTypes); parseDelegate = (ParseDictionaryDelegate)Delegate.CreateDelegate(typeof(ParseDictionaryDelegate), genericMi); Dictionary snapshot, newCache; do { snapshot = ParseDelegateCache; newCache = new Dictionary(ParseDelegateCache); newCache[key] = parseDelegate; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot)); return parseDelegate(value, createMapType, keyParseFn, valueParseFn); } private static string GetTypesKey(params Type[] types) { var sb = new StringBuilder(256); foreach (var type in types) { if (sb.Length > 0) sb.Append(">"); sb.Append(type.FullName); } return sb.ToString(); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/WriteDictionary.cs0000644000175000017500000001503112146506553030403 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Threading; using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { internal delegate void WriteMapDelegate( TextWriter writer, object oMap, WriteObjectDelegate writeKeyFn, WriteObjectDelegate writeValueFn); internal static class WriteDictionary where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); internal class MapKey { internal Type KeyType; internal Type ValueType; public MapKey(Type keyType, Type valueType) { KeyType = keyType; ValueType = valueType; } public bool Equals(MapKey other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return Equals(other.KeyType, KeyType) && Equals(other.ValueType, ValueType); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != typeof(MapKey)) return false; return Equals((MapKey)obj); } public override int GetHashCode() { unchecked { return ((KeyType != null ? KeyType.GetHashCode() : 0) * 397) ^ (ValueType != null ? ValueType.GetHashCode() : 0); } } } static Dictionary CacheFns = new Dictionary(); public static Action GetWriteGenericDictionary(Type keyType, Type valueType) { WriteMapDelegate writeFn; var mapKey = new MapKey(keyType, valueType); if (CacheFns.TryGetValue(mapKey, out writeFn)) return writeFn.Invoke; var genericType = typeof(ToStringDictionaryMethods<,,>).MakeGenericType(keyType, valueType, typeof(TSerializer)); var mi = genericType.GetMethod("WriteIDictionary", BindingFlags.Static | BindingFlags.Public); writeFn = (WriteMapDelegate)Delegate.CreateDelegate(typeof(WriteMapDelegate), mi); Dictionary snapshot, newCache; do { snapshot = CacheFns; newCache = new Dictionary(CacheFns); newCache[mapKey] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref CacheFns, newCache, snapshot), snapshot)); return writeFn.Invoke; } public static void WriteIDictionary(TextWriter writer, object oMap) { WriteObjectDelegate writeKeyFn = null; WriteObjectDelegate writeValueFn = null; writer.Write(JsWriter.MapStartChar); var encodeMapKey = false; var map = (IDictionary)oMap; var ranOnce = false; foreach (var key in map.Keys) { var dictionaryValue = map[key]; var isNull = (dictionaryValue == null); if (isNull && !JsConfig.IncludeNullValues) continue; if (writeKeyFn == null) { var keyType = key.GetType(); writeKeyFn = Serializer.GetWriteFn(keyType); encodeMapKey = Serializer.GetTypeInfo(keyType).EncodeMapKey; } if (writeValueFn == null) writeValueFn = Serializer.GetWriteFn(dictionaryValue.GetType()); JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); JsState.WritingKeyCount++; JsState.IsWritingValue = false; if (encodeMapKey) { JsState.IsWritingValue = true; //prevent ""null"" writer.Write(JsWriter.QuoteChar); writeKeyFn(writer, key); writer.Write(JsWriter.QuoteChar); } else { writeKeyFn(writer, key); } JsState.WritingKeyCount--; writer.Write(JsWriter.MapKeySeperator); if (isNull) { writer.Write(JsonUtils.Null); } else { JsState.IsWritingValue = true; writeValueFn(writer, dictionaryValue); JsState.IsWritingValue = false; } } writer.Write(JsWriter.MapEndChar); } } internal static class ToStringDictionaryMethods where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); public static void WriteIDictionary( TextWriter writer, object oMap, WriteObjectDelegate writeKeyFn, WriteObjectDelegate writeValueFn) { if (writer == null) return; //AOT WriteGenericIDictionary(writer, (IDictionary)oMap, writeKeyFn, writeValueFn); } public static void WriteGenericIDictionary( TextWriter writer, IDictionary map, WriteObjectDelegate writeKeyFn, WriteObjectDelegate writeValueFn) { if (map == null) { writer.Write(JsonUtils.Null); return; } writer.Write(JsWriter.MapStartChar); var encodeMapKey = Serializer.GetTypeInfo(typeof(TKey)).EncodeMapKey; var ranOnce = false; foreach (var kvp in map) { var isNull = (kvp.Value == null); if (isNull && !JsConfig.IncludeNullValues) continue; JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); JsState.WritingKeyCount++; JsState.IsWritingValue = false; if (encodeMapKey) { JsState.IsWritingValue = true; //prevent ""null"" writer.Write(JsWriter.QuoteChar); writeKeyFn(writer, kvp.Key); writer.Write(JsWriter.QuoteChar); } else { writeKeyFn(writer, kvp.Key); } JsState.WritingKeyCount--; writer.Write(JsWriter.MapKeySeperator); if (isNull) { writer.Write(JsonUtils.Null); } else { JsState.IsWritingValue = true; writeValueFn(writer, kvp.Value); JsState.IsWritingValue = false; } } writer.Write(JsWriter.MapEndChar); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeSpecializedCollections.cs0000644000175000017500000001421012146506553034075 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Reflection; namespace ServiceStack.Text.Common { internal static class DeserializeSpecializedCollections where TSerializer : ITypeSerializer { private readonly static ParseStringDelegate CacheFn; static DeserializeSpecializedCollections() { CacheFn = GetParseFn(); } public static ParseStringDelegate Parse { get { return CacheFn; } } public static ParseStringDelegate GetParseFn() { if (typeof(T).HasAnyTypeDefinitionsOf(typeof(Queue<>))) { if (typeof(T) == typeof(Queue)) return ParseStringQueue; if (typeof(T) == typeof(Queue)) return ParseIntQueue; return GetGenericQueueParseFn(); } if (typeof(T).HasAnyTypeDefinitionsOf(typeof(Stack<>))) { if (typeof(T) == typeof(Stack)) return ParseStringStack; if (typeof(T) == typeof(Stack)) return ParseIntStack; return GetGenericStackParseFn(); } #if !SILVERLIGHT if (typeof(T) == typeof(StringCollection)) { return ParseStringCollection; } #endif return GetGenericEnumerableParseFn(); } public static Queue ParseStringQueue(string value) { var parse = (IEnumerable)DeserializeList, TSerializer>.Parse(value); return new Queue(parse); } public static Queue ParseIntQueue(string value) { var parse = (IEnumerable)DeserializeList, TSerializer>.Parse(value); return new Queue(parse); } #if !SILVERLIGHT public static StringCollection ParseStringCollection(string value) where TSerializer : ITypeSerializer { if ((value = DeserializeListWithElements.StripList(value)) == null) return null; return value == String.Empty ? new StringCollection() : ToStringCollection(DeserializeListWithElements.ParseStringList(value)); } public static StringCollection ToStringCollection(List items) { var to = new StringCollection(); foreach (var item in items) { to.Add(item); } return to; } #endif internal static ParseStringDelegate GetGenericQueueParseFn() { var enumerableInterface = typeof(T).GetTypeWithGenericInterfaceOf(typeof(IEnumerable<>)); var elementType = enumerableInterface.GetGenericArguments()[0]; var genericType = typeof(SpecializedQueueElements<>).MakeGenericType(elementType); var mi = genericType.GetMethod("ConvertToQueue", BindingFlags.Static | BindingFlags.Public); var convertToQueue = (ConvertObjectDelegate)Delegate.CreateDelegate(typeof(ConvertObjectDelegate), mi); var parseFn = DeserializeEnumerable.GetParseFn(); return x => convertToQueue(parseFn(x)); } public static Stack ParseStringStack(string value) { var parse = (IEnumerable)DeserializeList, TSerializer>.Parse(value); return new Stack(parse); } public static Stack ParseIntStack(string value) { var parse = (IEnumerable)DeserializeList, TSerializer>.Parse(value); return new Stack(parse); } internal static ParseStringDelegate GetGenericStackParseFn() { var enumerableInterface = typeof(T).GetTypeWithGenericInterfaceOf(typeof(IEnumerable<>)); var elementType = enumerableInterface.GetGenericArguments()[0]; var genericType = typeof(SpecializedQueueElements<>).MakeGenericType(elementType); var mi = genericType.GetMethod("ConvertToStack", BindingFlags.Static | BindingFlags.Public); var convertToQueue = (ConvertObjectDelegate)Delegate.CreateDelegate(typeof(ConvertObjectDelegate), mi); var parseFn = DeserializeEnumerable.GetParseFn(); return x => convertToQueue(parseFn(x)); } public static ParseStringDelegate GetGenericEnumerableParseFn() { var enumerableInterface = typeof(T).GetTypeWithGenericInterfaceOf(typeof(IEnumerable<>)); var elementType = enumerableInterface.GetGenericArguments()[0]; var genericType = typeof(SpecializedEnumerableElements<,>).MakeGenericType(typeof(T), elementType); var fi = genericType.GetField("ConvertFn", BindingFlags.Static | BindingFlags.Public); var convertFn = fi.GetValue(null) as ConvertObjectDelegate; if (convertFn == null) return null; var parseFn = DeserializeEnumerable.GetParseFn(); return x => convertFn(parseFn(x)); } } internal class SpecializedQueueElements { public static Queue ConvertToQueue(object enumerable) { if (enumerable == null) return null; return new Queue((IEnumerable)enumerable); } public static Stack ConvertToStack(object enumerable) { if (enumerable == null) return null; return new Stack((IEnumerable)enumerable); } } internal class SpecializedEnumerableElements { public static ConvertObjectDelegate ConvertFn; static SpecializedEnumerableElements() { foreach (var ctorInfo in typeof(TCollection).GetConstructors()) { var ctorParams = ctorInfo.GetParameters(); if (ctorParams.Length != 1) continue; var ctorParam = ctorParams[0]; if (typeof(IEnumerable).IsAssignableFrom(ctorParam.ParameterType) || ctorParam.ParameterType.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable<>))) { ConvertFn = fromObject => { var to = Activator.CreateInstance(typeof(TCollection), fromObject); return to; }; return; } } if (typeof(TCollection).IsOrHasGenericInterfaceTypeOf(typeof(ICollection<>))) { ConvertFn = ConvertFromCollection; } } public static object Convert(object enumerable) { return ConvertFn(enumerable); } public static object ConvertFromCollection(object enumerable) { var to = (ICollection)typeof(TCollection).CreateInstance(); var from = (IEnumerable)enumerable; foreach (var item in from) { to.Add(item); } return to; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/ITypeSerializer.cs0000644000175000017500000000450212146506553030350 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { internal interface ITypeSerializer { string TypeAttrInObject { get; } WriteObjectDelegate GetWriteFn(); WriteObjectDelegate GetWriteFn(Type type); TypeInfo GetTypeInfo(Type type); void WriteRawString(TextWriter writer, string value); void WritePropertyName(TextWriter writer, string value); void WriteBuiltIn(TextWriter writer, object value); void WriteObjectString(TextWriter writer, object value); void WriteException(TextWriter writer, object value); void WriteString(TextWriter writer, string value); void WriteDateTime(TextWriter writer, object oDateTime); void WriteNullableDateTime(TextWriter writer, object dateTime); void WriteGuid(TextWriter writer, object oValue); void WriteNullableGuid(TextWriter writer, object oValue); void WriteBytes(TextWriter writer, object oByteValue); void WriteChar(TextWriter writer, object charValue); void WriteByte(TextWriter writer, object byteValue); void WriteInt16(TextWriter writer, object intValue); void WriteUInt16(TextWriter writer, object intValue); void WriteInt32(TextWriter writer, object intValue); void WriteUInt32(TextWriter writer, object uintValue); void WriteInt64(TextWriter writer, object longValue); void WriteUInt64(TextWriter writer, object ulongValue); void WriteBool(TextWriter writer, object boolValue); void WriteFloat(TextWriter writer, object floatValue); void WriteDouble(TextWriter writer, object doubleValue); void WriteDecimal(TextWriter writer, object decimalValue); void WriteEnum(TextWriter writer, object enumValue); void WriteEnumFlags(TextWriter writer, object enumFlagValue); void WriteLinqBinary(TextWriter writer, object linqBinaryValue); //object EncodeMapKey(object value); ParseStringDelegate GetParseFn(); ParseStringDelegate GetParseFn(Type type); string ParseRawString(string value); string ParseString(string value); string EatTypeValue(string value, ref int i); bool EatMapStartChar(string value, ref int i); string EatMapKey(string value, ref int i); bool EatMapKeySeperator(string value, ref int i); string EatValue(string value, ref int i); bool EatItemSeperatorOrMapEndChar(string value, ref int i); } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/WriteType.cs0000644000175000017500000001622112146506553027221 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.IO; using System.Threading; using ServiceStack.Text.Json; using ServiceStack.Text.Reflection; using System.Linq; using System.Runtime.Serialization; namespace ServiceStack.Text.Common { internal static class WriteType where TSerializer : ITypeSerializer { private static readonly ITypeSerializer Serializer = JsWriter.GetTypeSerializer(); private static readonly WriteObjectDelegate CacheFn; internal static TypePropertyWriter[] PropertyWriters; private static WriteObjectDelegate WriteTypeInfo; static WriteType() { CacheFn = Init() ? GetWriteFn() : WriteEmptyType; if (typeof(T).IsAbstract) { WriteTypeInfo = TypeInfoWriter; if (!typeof(T).IsInterface) { CacheFn = WriteAbstractProperties; } } } public static void TypeInfoWriter(TextWriter writer, object obj) { DidWriteTypeInfo(writer, obj); } private static bool DidWriteTypeInfo(TextWriter writer, object obj) { if (obj == null || JsConfig.ExcludeTypeInfo || JsConfig.ExcludeTypeInfo) return false; Serializer.WriteRawString(writer, JsWriter.TypeAttr); writer.Write(JsWriter.MapKeySeperator); Serializer.WriteRawString(writer, obj.GetType().ToTypeString()); return true; } public static WriteObjectDelegate Write { get { return CacheFn; } } private static WriteObjectDelegate GetWriteFn() { return WriteProperties; } private static bool Init() { if (!typeof(T).IsClass && !typeof(T).IsInterface) return false; var propertyInfos = TypeConfig.Properties; if (propertyInfos.Length == 0 && !JsState.IsWritingDynamic) { return typeof(T).IsDto(); } var propertyNamesLength = propertyInfos.Length; PropertyWriters = new TypePropertyWriter[propertyNamesLength]; // NOTE: very limited support for DataContractSerialization (DCS) // NOT supporting Serializable // support for DCS is intended for (re)Name of properties and Ignore by NOT having a DataMember present var isDataContract = typeof(T).GetCustomAttributes(typeof(DataContractAttribute), false).Any(); for (var i = 0; i < propertyNamesLength; i++) { var propertyInfo = propertyInfos[i]; string propertyName, propertyNameCLSFriendly; if (isDataContract) { var dcsDataMember = propertyInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault() as DataMemberAttribute; if (dcsDataMember == null) continue; propertyName = dcsDataMember.Name ?? propertyInfo.Name; propertyNameCLSFriendly = dcsDataMember.Name ?? propertyName.ToCamelCase(); } else { propertyName = propertyInfo.Name; propertyNameCLSFriendly = propertyName.ToCamelCase(); } var propertyType = propertyInfo.PropertyType; var suppressDefaultValue = propertyType.IsValueType && JsConfig.HasSerializeFn.Contains(propertyType) ? ReflectionExtensions.GetDefaultValue(propertyType) : null; PropertyWriters[i] = new TypePropertyWriter ( propertyName, propertyNameCLSFriendly, propertyInfo.GetValueGetter(), Serializer.GetWriteFn(propertyType), suppressDefaultValue ); } return true; } internal struct TypePropertyWriter { internal string PropertyName { get { return (JsConfig.EmitCamelCaseNames) ? propertyNameCLSFriendly : propertyName; } } internal readonly string propertyName; internal readonly string propertyNameCLSFriendly; internal readonly Func GetterFn; internal readonly WriteObjectDelegate WriteFn; internal readonly object DefaultValue; public TypePropertyWriter(string propertyName, string propertyNameCLSFriendly, Func getterFn, WriteObjectDelegate writeFn, object defaultValue) { this.propertyName = propertyName; this.propertyNameCLSFriendly = propertyNameCLSFriendly; this.GetterFn = getterFn; this.WriteFn = writeFn; this.DefaultValue = defaultValue; } } public static void WriteEmptyType(TextWriter writer, object value) { writer.Write(JsWriter.EmptyMap); } public static void WriteAbstractProperties(TextWriter writer, object value) { if (value == null) { writer.Write(JsWriter.EmptyMap); return; } var valueType = value.GetType(); if (valueType.IsAbstract) { WriteProperties(writer, value); return; } var writeFn = Serializer.GetWriteFn(valueType); if (!JsConfig.ExcludeTypeInfo) JsState.IsWritingDynamic = true; writeFn(writer, value); if (!JsConfig.ExcludeTypeInfo) JsState.IsWritingDynamic = false; } public static void WriteProperties(TextWriter writer, object value) { if (typeof(TSerializer) == typeof(JsonTypeSerializer) && JsState.WritingKeyCount > 0) writer.Write(JsWriter.QuoteChar); writer.Write(JsWriter.MapStartChar); var i = 0; if (WriteTypeInfo != null || JsState.IsWritingDynamic) { if (DidWriteTypeInfo(writer, value)) i++; } if (PropertyWriters != null) { var len = PropertyWriters.Length; for (int index = 0; index < len; index++) { var propertyWriter = PropertyWriters[index]; var propertyValue = value != null ? propertyWriter.GetterFn((T)value) : null; if ((propertyValue == null || (propertyWriter.DefaultValue != null && propertyWriter.DefaultValue.Equals(propertyValue))) && !JsConfig.IncludeNullValues) continue; if (i++ > 0) writer.Write(JsWriter.ItemSeperator); Serializer.WritePropertyName(writer, propertyWriter.PropertyName); writer.Write(JsWriter.MapKeySeperator); if (typeof (TSerializer) == typeof (JsonTypeSerializer)) JsState.IsWritingValue = true; propertyWriter.WriteFn(writer, propertyValue); if (typeof(TSerializer) == typeof(JsonTypeSerializer)) JsState.IsWritingValue = false; } } writer.Write(JsWriter.MapEndChar); if (typeof(TSerializer) == typeof(JsonTypeSerializer) && JsState.WritingKeyCount > 0) writer.Write(JsWriter.QuoteChar); } public static void WriteQueryString(TextWriter writer, object value) { var i = 0; foreach (var propertyWriter in PropertyWriters) { var propertyValue = propertyWriter.GetterFn((T)value); if (propertyValue == null) continue; var propertyValueString = propertyValue as string; if (propertyValueString != null) { propertyValue = propertyValueString.UrlEncode(); } if (i++ > 0) writer.Write('&'); Serializer.WritePropertyName(writer, propertyWriter.PropertyName); writer.Write('='); propertyWriter.WriteFn(writer, propertyValue); } } } } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DateTimeSerializer.cs0000644000175000017500000001210512146506553031010 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Globalization; using System.Xml; using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { public static class DateTimeSerializer { public const string ShortDateTimeFormat = "yyyy-MM-dd"; //11 public const string DefaultDateTimeFormat = "dd/MM/yyyy HH:mm:ss"; //20 public const string DefaultDateTimeFormatWithFraction = "dd/MM/yyyy HH:mm:ss.fff"; //24 public const string XsdDateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ"; //29 public const string XsdDateTimeFormat3F = "yyyy-MM-ddTHH:mm:ss.fffZ"; //25 public const string XsdDateTimeFormatSeconds = "yyyy-MM-ddTHH:mm:ssZ"; //21 public const string EscapedWcfJsonPrefix = "\\/Date("; public const string EscapedWcfJsonSuffix = ")\\/"; public const string WcfJsonPrefix = "/Date("; public const char WcfJsonSuffix = ')'; public static DateTime ParseShortestXsdDateTime(string dateTimeStr) { if (string.IsNullOrEmpty(dateTimeStr)) return DateTime.MinValue; if (dateTimeStr.StartsWith(EscapedWcfJsonPrefix) || dateTimeStr.StartsWith(WcfJsonPrefix)) return ParseWcfJsonDate(dateTimeStr); if (dateTimeStr.Length == DefaultDateTimeFormat.Length || dateTimeStr.Length == DefaultDateTimeFormatWithFraction.Length) return DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture); if (dateTimeStr.Length == XsdDateTimeFormatSeconds.Length) return DateTime.ParseExact(dateTimeStr, XsdDateTimeFormatSeconds, null, DateTimeStyles.AdjustToUniversal); if (dateTimeStr.Length >= XsdDateTimeFormat3F.Length && dateTimeStr.Length <= XsdDateTimeFormat.Length) return XmlConvert.ToDateTime(dateTimeStr, XmlDateTimeSerializationMode.Local); return DateTime.Parse(dateTimeStr, null, DateTimeStyles.AssumeLocal); } public static string ToDateTimeString(DateTime dateTime) { return dateTime.ToStableUniversalTime().ToString(XsdDateTimeFormat); } public static DateTime ParseDateTime(string dateTimeStr) { return DateTime.ParseExact(dateTimeStr, XsdDateTimeFormat, null); } public static string ToXsdDateTimeString(DateTime dateTime) { return XmlConvert.ToString(dateTime.ToStableUniversalTime(), XmlDateTimeSerializationMode.Utc); } public static DateTime ParseXsdDateTime(string dateTimeStr) { return XmlConvert.ToDateTime(dateTimeStr, XmlDateTimeSerializationMode.Utc); } public static string ToShortestXsdDateTimeString(DateTime dateTime) { var timeOfDay = dateTime.TimeOfDay; if (timeOfDay.Ticks == 0) return dateTime.ToString(ShortDateTimeFormat); if (timeOfDay.Milliseconds == 0) return dateTime.ToStableUniversalTime().ToString(XsdDateTimeFormatSeconds); return ToXsdDateTimeString(dateTime); } static readonly char[] TimeZoneChars = new[] { '+', '-' }; /// /// WCF Json format: /Date(unixts+0000)/ /// /// /// public static DateTime ParseWcfJsonDate(string wcfJsonDate) { if (wcfJsonDate[0] == JsonUtils.EscapeChar) { wcfJsonDate = wcfJsonDate.Substring(1); } var suffixPos = wcfJsonDate.IndexOf(WcfJsonSuffix); var timeString = wcfJsonDate.Substring(WcfJsonPrefix.Length, suffixPos - WcfJsonPrefix.Length); if (JsConfig.DateHandler == JsonDateHandler.ISO8601) { return DateTime.Parse(timeString, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind); } var timeZonePos = timeString.LastIndexOfAny(TimeZoneChars); var timeZone = timeZonePos <= 0 ? string.Empty : timeString.Substring(timeZonePos); var unixTimeString = timeString.Substring(0, timeString.Length - timeZone.Length); var unixTime = long.Parse(unixTimeString); if (timeZone == string.Empty) { // when no timezone offset is supplied, then treat the time as UTC return unixTime.FromUnixTimeMs(); } if (JsConfig.DateHandler == JsonDateHandler.DCJSCompatible) { // DCJS ignores the offset and considers it local time if any offset exists return unixTime.FromUnixTimeMs().ToLocalTime(); } var offset = timeZone.FromTimeOffsetString(); var date = unixTime.FromUnixTimeMs(offset); return date; } public static string ToWcfJsonDate(DateTime dateTime) { if (JsConfig.DateHandler == JsonDateHandler.ISO8601) { return EscapedWcfJsonPrefix + dateTime.ToString("o", CultureInfo.InvariantCulture) + EscapedWcfJsonSuffix; } var timestamp = dateTime.ToUnixTimeMs(); var offset = dateTime.Kind == DateTimeKind.Utc || dateTime.Kind == DateTimeKind.Unspecified ? string.Empty : TimeZoneInfo.Local.GetUtcOffset(dateTime).ToTimeOffsetString(); return EscapedWcfJsonPrefix + timestamp + offset + EscapedWcfJsonSuffix; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs0000644000175000017500000001115712146506553031661 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { internal static class DeserializeTypeRefJson { private static readonly JsonTypeSerializer Serializer = (JsonTypeSerializer)JsonTypeSerializer.Instance; internal static object StringToType( Type type, string strType, EmptyCtorDelegate ctorFn, Dictionary typeAccessorMap) { var index = 0; if (strType == null) return null; //if (!Serializer.EatMapStartChar(strType, ref index)) for (; index < strType.Length; index++) { var c = strType[index]; if (c >= JsonTypeSerializer.WhiteSpaceFlags.Length || !JsonTypeSerializer.WhiteSpaceFlags[c]) break; } //Whitespace inline if (strType[index++] != JsWriter.MapStartChar) throw DeserializeTypeRef.CreateSerializationError(type, strType); if (strType == JsWriter.EmptyMap) return ctorFn(); object instance = null; var strTypeLength = strType.Length; while (index < strTypeLength) { var propertyName = JsonTypeSerializer.ParseJsonString(strType, ref index); //Serializer.EatMapKeySeperator(strType, ref index); for (; index < strType.Length; index++) { var c = strType[index]; if (c >= JsonTypeSerializer.WhiteSpaceFlags.Length || !JsonTypeSerializer.WhiteSpaceFlags[c]) break; } //Whitespace inline if (strType.Length != index) index++; var propertyValueStr = Serializer.EatValue(strType, ref index); var possibleTypeInfo = propertyValueStr != null && propertyValueStr.Length > 1 && propertyValueStr[0] == '_'; if (possibleTypeInfo && propertyName == JsWriter.TypeAttr) { var typeName = Serializer.ParseString(propertyValueStr); instance = ReflectionExtensions.CreateInstance(typeName); if (instance == null) { Tracer.Instance.WriteWarning("Could not find type: " + propertyValueStr); } else { //If __type info doesn't match, ignore it. if (!type.IsInstanceOfType(instance)) instance = null; } Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); continue; } if (instance == null) instance = ctorFn(); TypeAccessor typeAccessor; typeAccessorMap.TryGetValue(propertyName, out typeAccessor); var propType = possibleTypeInfo ? TypeAccessor.ExtractType(Serializer, propertyValueStr) : null; if (propType != null) { try { if (typeAccessor != null) { //var parseFn = Serializer.GetParseFn(propType); var parseFn = JsonReader.GetParseFn(propType); var propertyValue = parseFn(propertyValueStr); typeAccessor.SetProperty(instance, propertyValue); } //Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); for (; index < strType.Length; index++) { var c = strType[index]; if (c >= JsonTypeSerializer.WhiteSpaceFlags.Length || !JsonTypeSerializer.WhiteSpaceFlags[c]) break; } //Whitespace inline if (index != strType.Length) { var success = strType[index] == JsWriter.ItemSeperator || strType[index] == JsWriter.MapEndChar; index++; if (success) for (; index < strType.Length; index++) { var c = strType[index]; if (c >= JsonTypeSerializer.WhiteSpaceFlags.Length || !JsonTypeSerializer.WhiteSpaceFlags[c]) break; } //Whitespace inline } continue; } catch { Tracer.Instance.WriteWarning("WARN: failed to set dynamic property {0} with: {1}", propertyName, propertyValueStr); } } if (typeAccessor != null && typeAccessor.GetProperty != null && typeAccessor.SetProperty != null) { try { var propertyValue = typeAccessor.GetProperty(propertyValueStr); typeAccessor.SetProperty(instance, propertyValue); } catch { Tracer.Instance.WriteWarning("WARN: failed to set property {0} with: {1}", propertyName, propertyValueStr); } } //Serializer.EatItemSeperatorOrMapEndChar(strType, ref index); for (; index < strType.Length; index++) { var c = strType[index]; if (c >= JsonTypeSerializer.WhiteSpaceFlags.Length || !JsonTypeSerializer.WhiteSpaceFlags[c]) break; } //Whitespace inline if (index != strType.Length) { var success = strType[index] == JsWriter.ItemSeperator || strType[index] == JsWriter.MapEndChar; index++; if (success) for (; index < strType.Length; index++) { var c = strType[index]; if (c >= JsonTypeSerializer.WhiteSpaceFlags.Length || !JsonTypeSerializer.WhiteSpaceFlags[c]) break; } //Whitespace inline } } return instance; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Json/0000755000175000017500000000000012503640373024411 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Json/JsonUtils.cs0000644000175000017500000000556112146506553026705 0ustar00meebeymeebey00000000000000using System; using System.IO; namespace ServiceStack.Text.Json { public static class JsonUtils { public const char EscapeChar = '\\'; public const char QuoteChar = '"'; public const string Null = "null"; public const string True = "true"; public const string False = "false"; static readonly char[] EscapeChars = new[] { QuoteChar, '\n', '\r', '\t', '"', '\\', '\f', '\b', }; private const int LengthFromLargestChar = '\\' + 1; private static readonly bool[] EscapeCharFlags = new bool[LengthFromLargestChar]; static JsonUtils() { foreach (var escapeChar in EscapeChars) { EscapeCharFlags[escapeChar] = true; } } public static void WriteString(TextWriter writer, string value) { if (value == null) { writer.Write(JsonUtils.Null); return; } if (!HasAnyEscapeChars(value)) { writer.Write(QuoteChar); writer.Write(value); writer.Write(QuoteChar); return; } var hexSeqBuffer = new char[4]; writer.Write(QuoteChar); var len = value.Length; for (var i = 0; i < len; i++) { switch (value[i]) { case '\n': writer.Write("\\n"); continue; case '\r': writer.Write("\\r"); continue; case '\t': writer.Write("\\t"); continue; case '"': case '\\': writer.Write('\\'); writer.Write(value[i]); continue; case '\f': writer.Write("\\f"); continue; case '\b': writer.Write("\\b"); continue; } //Is printable char? if (value[i] >= 32 && value[i] <= 126) { writer.Write(value[i]); continue; } var isValidSequence = value[i] < 0xD800 || value[i] > 0xDFFF; if (isValidSequence) { // Default, turn into a \uXXXX sequence IntToHex(value[i], hexSeqBuffer); writer.Write("\\u"); writer.Write(hexSeqBuffer); } } writer.Write(QuoteChar); } /// /// micro optimizations: using flags instead of value.IndexOfAny(EscapeChars) /// /// /// private static bool HasAnyEscapeChars(string value) { var len = value.Length; for (var i = 0; i < len; i++) { var c = value[i]; if (c >= LengthFromLargestChar || !EscapeCharFlags[c]) continue; return true; } return false; } public static void IntToHex(int intValue, char[] hex) { for (var i = 0; i < 4; i++) { var num = intValue % 16; if (num < 10) hex[3 - i] = (char)('0' + num); else hex[3 - i] = (char)('A' + (num - 10)); intValue >>= 4; } } public static bool IsJsObject(string value) { return !string.IsNullOrEmpty(value) && value[0] == '{' && value[value.Length - 1] == '}'; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Json/JsonTypeSerializer.cs0000644000175000017500000003373612503640373030561 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Globalization; using System.IO; using System.Text; using ServiceStack.Text.Common; namespace ServiceStack.Text.Json { internal class JsonTypeSerializer : ITypeSerializer { public static ITypeSerializer Instance = new JsonTypeSerializer(); public string TypeAttrInObject { get { return "{\"__type\":"; } } public static readonly bool[] WhiteSpaceFlags = new bool[(int)' ' + 1]; static JsonTypeSerializer() { WhiteSpaceFlags[(int)' '] = true; WhiteSpaceFlags[(int)'\t'] = true; WhiteSpaceFlags[(int)'\r'] = true; WhiteSpaceFlags[(int)'\n'] = true; } public WriteObjectDelegate GetWriteFn() { return JsonWriter.WriteFn(); } public WriteObjectDelegate GetWriteFn(Type type) { return JsonWriter.GetWriteFn(type); } public TypeInfo GetTypeInfo(Type type) { return JsonWriter.GetTypeInfo(type); } /// /// Shortcut escape when we're sure value doesn't contain any escaped chars /// /// /// public void WriteRawString(TextWriter writer, string value) { writer.Write(JsWriter.QuoteChar); writer.Write(value); writer.Write(JsWriter.QuoteChar); } public void WritePropertyName(TextWriter writer, string value) { if (JsState.WritingKeyCount > 0) { writer.Write(JsWriter.EscapedQuoteString); writer.Write(value); writer.Write(JsWriter.EscapedQuoteString); } else { WriteRawString(writer, value); } } public void WriteString(TextWriter writer, string value) { JsonUtils.WriteString(writer, value); } public void WriteBuiltIn(TextWriter writer, object value) { if (JsState.WritingKeyCount > 0 && !JsState.IsWritingValue) writer.Write(JsonUtils.QuoteChar); WriteRawString(writer, value.ToString()); if (JsState.WritingKeyCount > 0 && !JsState.IsWritingValue) writer.Write(JsonUtils.QuoteChar); } public void WriteObjectString(TextWriter writer, object value) { JsonUtils.WriteString(writer, value != null ? value.ToString() : null); } public void WriteException(TextWriter writer, object value) { WriteString(writer, ((Exception)value).Message); } public void WriteDateTime(TextWriter writer, object oDateTime) { WriteRawString(writer, DateTimeSerializer.ToWcfJsonDate((DateTime)oDateTime)); } public void WriteNullableDateTime(TextWriter writer, object dateTime) { if (dateTime == null) writer.Write( JsonUtils.Null ); else WriteDateTime(writer, dateTime); } public void WriteGuid(TextWriter writer, object oValue) { WriteRawString(writer, ((Guid)oValue).ToString("N")); } public void WriteNullableGuid(TextWriter writer, object oValue) { if (oValue == null) return; WriteRawString(writer, ((Guid)oValue).ToString("N")); } public void WriteBytes(TextWriter writer, object oByteValue) { if (oByteValue == null) return; WriteRawString(writer, Convert.ToBase64String((byte[])oByteValue)); } public void WriteChar(TextWriter writer, object charValue) { if (charValue == null) writer.Write(JsonUtils.Null); else WriteRawString(writer, ((char)charValue).ToString(CultureInfo.InvariantCulture)); } public void WriteByte(TextWriter writer, object byteValue) { if (byteValue == null) writer.Write(JsonUtils.Null); else writer.Write((byte)byteValue); } public void WriteInt16(TextWriter writer, object intValue) { if (intValue == null) writer.Write(JsonUtils.Null); else writer.Write((short)intValue); } public void WriteUInt16(TextWriter writer, object intValue) { if (intValue == null) writer.Write(JsonUtils.Null); else writer.Write((ushort)intValue); } public void WriteInt32(TextWriter writer, object intValue) { if (intValue == null) writer.Write(JsonUtils.Null); else writer.Write((int)intValue); } public void WriteUInt32(TextWriter writer, object uintValue) { if (uintValue == null) writer.Write(JsonUtils.Null); else writer.Write((uint)uintValue); } public void WriteInt64(TextWriter writer, object integerValue) { if (integerValue == null) writer.Write(JsonUtils.Null); else writer.Write((long)integerValue); } public void WriteUInt64(TextWriter writer, object ulongValue) { if (ulongValue == null) { writer.Write(JsonUtils.Null); } else writer.Write((ulong)ulongValue); } public void WriteBool(TextWriter writer, object boolValue) { if (boolValue == null) writer.Write(JsonUtils.Null); else writer.Write(((bool)boolValue) ? JsonUtils.True : JsonUtils.False); } public void WriteFloat(TextWriter writer, object floatValue) { if (floatValue == null) writer.Write(JsonUtils.Null); else { var floatVal = (float)floatValue; if (Equals(floatVal, float.MaxValue) || Equals(floatVal, float.MinValue)) writer.Write(floatVal.ToString("r", CultureInfo.InvariantCulture)); else writer.Write(floatVal.ToString(CultureInfo.InvariantCulture)); } } public void WriteDouble(TextWriter writer, object doubleValue) { if (doubleValue == null) writer.Write(JsonUtils.Null); else { var doubleVal = (double)doubleValue; if (Equals(doubleVal, double.MaxValue) || Equals(doubleVal, double.MinValue)) writer.Write(doubleVal.ToString("r", CultureInfo.InvariantCulture)); else writer.Write(doubleVal.ToString(CultureInfo.InvariantCulture)); } } public void WriteDecimal(TextWriter writer, object decimalValue) { if (decimalValue == null) writer.Write(JsonUtils.Null); else writer.Write(((decimal)decimalValue).ToString(CultureInfo.InvariantCulture)); } public void WriteEnum(TextWriter writer, object enumValue) { if (enumValue == null) return; WriteRawString(writer, enumValue.ToString()); } public void WriteEnumFlags(TextWriter writer, object enumFlagValue) { if (enumFlagValue == null) return; var intVal = (int)enumFlagValue; writer.Write(intVal); } public void WriteLinqBinary(TextWriter writer, object linqBinaryValue) { #if !MONOTOUCH && !SILVERLIGHT && !XBOX WriteRawString(writer, Convert.ToBase64String(((System.Data.Linq.Binary)linqBinaryValue).ToArray())); #endif } public ParseStringDelegate GetParseFn() { return JsonReader.Instance.GetParseFn(); } public ParseStringDelegate GetParseFn(Type type) { return JsonReader.GetParseFn(type); } public string ParseRawString(string value) { if (String.IsNullOrEmpty(value)) return value; return value[0] == JsonUtils.QuoteChar && value[value.Length - 1] == JsonUtils.QuoteChar && value.Length > 1 ? value.Substring(1, value.Length - 2) : value; } public string ParseString(string value) { return string.IsNullOrEmpty(value) ? value : ParseRawString(value); } static readonly char[] IsSafeJsonChars = new[] { JsonUtils.QuoteChar, JsonUtils.EscapeChar }; internal static string ParseJsonString(string json, ref int index) { var jsonLength = json.Length; for (; index < json.Length; index++) { var ch = json[index]; if (ch >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[ch]) break; } //Whitespace inline if (json[index] == JsonUtils.QuoteChar) { index++; //MicroOp: See if we can short-circuit evaluation (to avoid StringBuilder) var strEndPos = json.IndexOfAny(IsSafeJsonChars, index); if (strEndPos == -1) return json.Substring(index, jsonLength - index); if (json[strEndPos] == JsonUtils.QuoteChar) { var potentialValue = json.Substring(index, strEndPos - index); index = strEndPos + 1; return potentialValue; } } var sb = new StringBuilder(jsonLength); char c; while (true) { if (index == jsonLength) break; c = json[index++]; if (c == JsonUtils.QuoteChar) break; if (c == '\\') { if (index == jsonLength) { break; } c = json[index++]; switch (c) { case '"': sb.Append('"'); break; case '\\': sb.Append('\\'); break; case '/': sb.Append('/'); break; case 'b': sb.Append('\b'); break; case 'f': sb.Append('\f'); break; case 'n': sb.Append('\n'); break; case 'r': sb.Append('\r'); break; case 't': sb.Append('\t'); break; case 'u': var remainingLength = jsonLength - index; if (remainingLength >= 4) { var unicodeString = json.Substring(index, 4); var unicodeIntVal = UInt32.Parse(unicodeString, NumberStyles.HexNumber); sb.Append(ConvertFromUtf32((int)unicodeIntVal)); index += 4; } else { break; } break; } } else { sb.Append(c); } } var strValue = sb.ToString(); return strValue == JsonUtils.Null ? null : strValue; } /// /// Since Silverlight doesn't have char.ConvertFromUtf32() so putting Mono's implemenation inline. /// /// /// private static string ConvertFromUtf32(int utf32) { if (utf32 < 0 || utf32 > 0x10FFFF) throw new ArgumentOutOfRangeException("utf32", "The argument must be from 0 to 0x10FFFF."); if (0xD800 <= utf32 && utf32 <= 0xDFFF) throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); if (utf32 < 0x10000) return new string((char)utf32, 1); utf32 -= 0x10000; return new string(new[] {(char) ((utf32 >> 10) + 0xD800), (char) (utf32 % 0x0400 + 0xDC00)}); } private static void EatWhitespace(string json, ref int index) { int c; for (; index < json.Length; index++) { c = json[index]; if (c >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[c]) { break; } } } public string EatTypeValue(string value, ref int i) { return EatValue(value, ref i); } public bool EatMapStartChar(string value, ref int i) { for (; i < value.Length; i++) { var c = value[i]; if (c >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[c]) break; } //Whitespace inline return value[i++] == JsWriter.MapStartChar; } public string EatMapKey(string value, ref int i) { return ParseJsonString(value, ref i); } public bool EatMapKeySeperator(string value, ref int i) { for (; i < value.Length; i++) { var c = value[i]; if (c >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[c]) break; } //Whitespace inline if (value.Length == i) return false; return value[i++] == JsWriter.MapKeySeperator; } public bool EatItemSeperatorOrMapEndChar(string value, ref int i) { for (; i < value.Length; i++) { var c = value[i]; if (c >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[c]) break; } //Whitespace inline if (i == value.Length) return false; var success = value[i] == JsWriter.ItemSeperator || value[i] == JsWriter.MapEndChar; i++; if (success) { for (; i < value.Length; i++) { var c = value[i]; if (c >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[c]) break; } //Whitespace inline } return success; } public string EatValue(string value, ref int i) { var valueLength = value.Length; if (i == valueLength) return null; for (; i < value.Length; i++) { var c = value[i]; if (c >= WhiteSpaceFlags.Length || !WhiteSpaceFlags[c]) break; } //Whitespace inline var tokenStartPos = i; var valueChar = value[i]; var withinQuotes = false; var endsToEat = 1; switch (valueChar) { //If we are at the end, return. case JsWriter.ItemSeperator: case JsWriter.MapEndChar: return null; //Is Within Quotes, i.e. "..." case JsWriter.QuoteChar: return ParseJsonString(value, ref i); //Is Type/Map, i.e. {...} case JsWriter.MapStartChar: while (++i < valueLength && endsToEat > 0) { valueChar = value[i]; if (valueChar == JsWriter.QuoteChar && value[i - 1] != JsonUtils.EscapeChar) withinQuotes = !withinQuotes; if (withinQuotes) continue; if (valueChar == JsWriter.MapStartChar) endsToEat++; if (valueChar == JsWriter.MapEndChar) endsToEat--; } return value.Substring(tokenStartPos, i - tokenStartPos); //Is List, i.e. [...] case JsWriter.ListStartChar: while (++i < valueLength && endsToEat > 0) { valueChar = value[i]; if (valueChar == JsWriter.QuoteChar && value[i - 1] != JsonUtils.EscapeChar) withinQuotes = !withinQuotes; if (withinQuotes) continue; if (valueChar == JsWriter.ListStartChar) endsToEat++; if (valueChar == JsWriter.ListEndChar) endsToEat--; } return value.Substring(tokenStartPos, i - tokenStartPos); } //Is Value while (++i < valueLength) { valueChar = value[i]; if (valueChar == JsWriter.ItemSeperator || valueChar == JsWriter.MapEndChar //If it doesn't have quotes it's either a keyword or number so also has a ws boundary || (valueChar < WhiteSpaceFlags.Length && WhiteSpaceFlags[valueChar]) ) { break; } } var strValue = value.Substring(tokenStartPos, i - tokenStartPos); return strValue == JsonUtils.Null ? null : strValue; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Json/JsonWriter.Generic.cs0000644000175000017500000001016312146506553030426 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Threading; using ServiceStack.Text.Common; namespace ServiceStack.Text.Json { internal static class JsonWriter { public static readonly JsWriter Instance = new JsWriter(); private static Dictionary WriteFnCache = new Dictionary(); public static WriteObjectDelegate GetWriteFn(Type type) { try { WriteObjectDelegate writeFn; if (WriteFnCache.TryGetValue(type, out writeFn)) return writeFn; var genericType = typeof(JsonWriter<>).MakeGenericType(type); var mi = genericType.GetMethod("WriteFn", BindingFlags.Public | BindingFlags.Static); var writeFactoryFn = (Func)Delegate.CreateDelegate(typeof(Func), mi); writeFn = writeFactoryFn(); Dictionary snapshot, newCache; do { snapshot = WriteFnCache; newCache = new Dictionary(WriteFnCache); newCache[type] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref WriteFnCache, newCache, snapshot), snapshot)); return writeFn; } catch (Exception ex) { Tracer.Instance.WriteError(ex); throw; } } private static Dictionary JsonTypeInfoCache = new Dictionary(); public static TypeInfo GetTypeInfo(Type type) { try { TypeInfo writeFn; if (JsonTypeInfoCache.TryGetValue(type, out writeFn)) return writeFn; var genericType = typeof(JsonWriter<>).MakeGenericType(type); var mi = genericType.GetMethod("GetTypeInfo", BindingFlags.Public | BindingFlags.Static); var writeFactoryFn = (Func)Delegate.CreateDelegate(typeof(Func), mi); writeFn = writeFactoryFn(); Dictionary snapshot, newCache; do { snapshot = JsonTypeInfoCache; newCache = new Dictionary(JsonTypeInfoCache); newCache[type] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref JsonTypeInfoCache, newCache, snapshot), snapshot)); return writeFn; } catch (Exception ex) { Tracer.Instance.WriteError(ex); throw; } } public static void WriteLateBoundObject(TextWriter writer, object value) { if (value == null) { if (JsConfig.IncludeNullValues) { writer.Write(JsonUtils.Null); } return; } var writeFn = GetWriteFn(value.GetType()); var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = true; writeFn(writer, value); JsState.IsWritingDynamic = prevState; } public static WriteObjectDelegate GetValueTypeToStringMethod(Type type) { return Instance.GetValueTypeToStringMethod(type); } } internal class TypeInfo { internal bool EncodeMapKey; } /// /// Implement the serializer using a more static approach /// /// internal static class JsonWriter { internal static TypeInfo TypeInfo; private static readonly WriteObjectDelegate CacheFn; public static WriteObjectDelegate WriteFn() { return CacheFn ?? WriteObject; } public static TypeInfo GetTypeInfo() { return TypeInfo; } static JsonWriter() { TypeInfo = new TypeInfo { EncodeMapKey = typeof(T) == typeof(bool) || typeof(T).IsNumericType() }; CacheFn = typeof(T) == typeof(object) ? JsonWriter.WriteLateBoundObject : JsonWriter.Instance.GetWriteFn(); } public static void WriteObject(TextWriter writer, object value) { CacheFn(writer, value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Json/JsonReader.Generic.cs0000644000175000017500000000510112146506553030350 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Reflection; using System.Threading; using ServiceStack.Text.Common; namespace ServiceStack.Text.Json { internal static class JsonReader { public static readonly JsReader Instance = new JsReader(); private static Dictionary ParseFnCache = new Dictionary(); public static ParseStringDelegate GetParseFn(Type type) { ParseFactoryDelegate parseFactoryFn; ParseFnCache.TryGetValue(type, out parseFactoryFn); if (parseFactoryFn != null) return parseFactoryFn(); var genericType = typeof(JsonReader<>).MakeGenericType(type); var mi = genericType.GetMethod("GetParseFn", BindingFlags.Public | BindingFlags.Static); parseFactoryFn = (ParseFactoryDelegate)Delegate.CreateDelegate(typeof(ParseFactoryDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ParseFnCache; newCache = new Dictionary(ParseFnCache); newCache[type] = parseFactoryFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseFnCache, newCache, snapshot), snapshot)); return parseFactoryFn(); } } public static class JsonReader { private static readonly ParseStringDelegate ReadFn; static JsonReader() { ReadFn = JsonReader.Instance.GetParseFn(); } public static ParseStringDelegate GetParseFn() { return ReadFn ?? Parse; } public static object Parse(string value) { if (ReadFn == null) { if (typeof(T).IsAbstract || typeof(T).IsInterface) { if (string.IsNullOrEmpty(value)) return null; var concreteType = DeserializeType.ExtractType(value); if (concreteType != null) { return JsonReader.GetParseFn(concreteType)(value); } throw new NotSupportedException("Can not deserialize interface type: " + typeof(T).Name); } } return value == null ? null : ReadFn(value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ServiceStack.Text.csproj0000644000175000017500000002475212652472053030250 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {579B3FDB-CDAD-44E1-8417-885C38E49A0E} Library Properties ServiceStack.Text ServiceStack.Text 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true v4.5 true full false bin\Debug\ DEBUG;TRACE prompt 4 AllRules.ruleset pdbonly true bin\Release\ TRACE prompt 4 AllRules.ruleset bin\Release\ServiceStack.Text.XML pdbonly true bin\MonoTouch MONOTOUCH;TRACE prompt 4 AllRules.ruleset Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/TextExtensions.cs0000644000175000017500000000344512146506553027045 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Text; using ServiceStack.Text.Common; namespace ServiceStack.Text { public static class TextExtensions { public static string ToCsvField(this string text) { return string.IsNullOrEmpty(text) || !JsWriter.HasAnyEscapeChars(text) ? text : string.Concat ( JsWriter.QuoteString, text.Replace(JsWriter.QuoteString, TypeSerializer.DoubleQuoteString), JsWriter.QuoteString ); } public static string FromCsvField(this string text) { const int startingQuotePos = 1; const int endingQuotePos = 2; return string.IsNullOrEmpty(text) || text[0] != JsWriter.QuoteChar ? text : text.Substring(startingQuotePos, text.Length - endingQuotePos) .Replace(TypeSerializer.DoubleQuoteString, JsWriter.QuoteString); } public static List FromCsvFields(this IEnumerable texts) { var safeTexts = new List(); foreach (var text in texts) { safeTexts.Add(FromCsvField(text)); } return safeTexts; } public static string[] FromCsvFields(params string[] texts) { var textsLen = texts.Length; var safeTexts = new string[textsLen]; for (var i = 0; i < textsLen; i++) { safeTexts[i] = FromCsvField(texts[i]); } return safeTexts; } public static string SerializeToString(this T value) { return JsonSerializer.SerializeToString(value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Properties/0000755000175000017500000000000012146506553025640 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Properties/AssemblyInfo.cs0000644000175000017500000000267512146506553030574 0ustar00meebeymeebey00000000000000using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("ServiceStack.Text")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Microsoft")] [assembly: AssemblyProduct("ServiceStack.Text")] [assembly: AssemblyCopyright("Copyright © ServiceStack 2012")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("a352d4d3-df2a-4c78-b646-67181a6333a6")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("3.5.7.*")] //[assembly: AssemblyFileVersion("1.0.0.0")] smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/JsConfig.cs0000644000175000017500000002634612146506553025550 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; using ServiceStack.Text.Common; using ServiceStack.Text.Json; using ServiceStack.Text.Jsv; namespace ServiceStack.Text { public static class JsConfig { static JsConfig() { //In-built default serialization, to Deserialize Color struct do: //JsConfig.SerializeFn = c => c.ToString().Replace("Color ", "").Replace("[", "").Replace("]", ""); //JsConfig.DeSerializeFn = System.Drawing.Color.FromName; } [ThreadStatic] private static bool? tsConvertObjectTypesIntoStringDictionary; private static bool? sConvertObjectTypesIntoStringDictionary; public static bool ConvertObjectTypesIntoStringDictionary { get { return tsConvertObjectTypesIntoStringDictionary ?? sConvertObjectTypesIntoStringDictionary ?? false; } set { if (!tsConvertObjectTypesIntoStringDictionary.HasValue) tsConvertObjectTypesIntoStringDictionary = value; if (!sConvertObjectTypesIntoStringDictionary.HasValue) sConvertObjectTypesIntoStringDictionary = value; } } [ThreadStatic] private static bool? tsIncludeNullValues; private static bool? sIncludeNullValues; public static bool IncludeNullValues { get { return tsIncludeNullValues ?? sIncludeNullValues ?? false; } set { if (!tsIncludeNullValues.HasValue) tsIncludeNullValues = value; if (!sIncludeNullValues.HasValue) sIncludeNullValues = value; } } [ThreadStatic] private static bool? tsExcludeTypeInfo; private static bool? sExcludeTypeInfo; public static bool ExcludeTypeInfo { get { return tsExcludeTypeInfo ?? sExcludeTypeInfo ?? false; } set { if (!tsExcludeTypeInfo.HasValue) tsExcludeTypeInfo = value; if (!sExcludeTypeInfo.HasValue) sExcludeTypeInfo = value; } } [ThreadStatic] private static JsonDateHandler? tsDateHandler; private static JsonDateHandler? sDateHandler; public static JsonDateHandler DateHandler { get { return tsDateHandler ?? sDateHandler ?? JsonDateHandler.TimestampOffset; } set { if (!tsDateHandler.HasValue) tsDateHandler = value; if (!sDateHandler.HasValue) sDateHandler = value; } } /// /// if the is configured /// to take advantage of specification, /// to support user-friendly serialized formats, ie emitting camelCasing for JSON /// and parsing member names and enum values in a case-insensitive manner. /// [ThreadStatic] private static bool? tsEmitCamelCaseNames; private static bool? sEmitCamelCaseNames; public static bool EmitCamelCaseNames { // obeying the use of ThreadStatic, but allowing for setting JsConfig once as is the normal case get { return tsEmitCamelCaseNames ?? sEmitCamelCaseNames ?? false; } set { if (!tsEmitCamelCaseNames.HasValue) tsEmitCamelCaseNames = value; if (!sEmitCamelCaseNames.HasValue) sEmitCamelCaseNames = value; } } internal static HashSet HasSerializeFn = new HashSet(); public static void Reset() { tsConvertObjectTypesIntoStringDictionary = sConvertObjectTypesIntoStringDictionary = null; tsIncludeNullValues = sIncludeNullValues = null; tsExcludeTypeInfo = sExcludeTypeInfo = null; tsEmitCamelCaseNames = sEmitCamelCaseNames = null; tsDateHandler = sDateHandler = null; HasSerializeFn = new HashSet(); } #if SILVERLIGHT || MONOTOUCH /// /// Provide hint to MonoTouch AOT compiler to pre-compile generic classes for all your DTOs. /// Just needs to be called once in a static constructor. /// public static void InitForAot() { } public static void RegisterForAot() { JsonAotConfig.Register(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterElement(); RegisterQueryStringWriter(); RegisterCsvSerializer(); } static void RegisterQueryStringWriter() { var i = 0; if (QueryStringWriter.WriteFn() != null) i++; } static void RegisterCsvSerializer() { CsvSerializer.WriteFn(); CsvSerializer.WriteObject(null, null); CsvWriter.WriteObject(null, null); CsvWriter.WriteObjectRow(null, null); } public static void RegisterElement() { JsonAotConfig.RegisterElement(); } #endif } #if SILVERLIGHT || MONOTOUCH internal class Poco { public string Dummy { get; set; } } internal class JsonAotConfig { static JsReader reader; static JsonTypeSerializer serializer; static JsonAotConfig() { serializer = new JsonTypeSerializer(); reader = new JsReader(); } public static ParseStringDelegate GetParseFn(Type type) { var parseFn = JsonTypeSerializer.Instance.GetParseFn(type); return parseFn; } internal static ParseStringDelegate RegisterBuiltin() { var i = 0; if (reader.GetParseFn() != null) i++; if (JsonReader.GetParseFn() != null) i++; if (JsonReader.Parse(null) != null) i++; if (JsonWriter.WriteFn() != null) i++; return serializer.GetParseFn(); } public static void Register() { var i = 0; var serializer = JsonTypeSerializer.Instance; if (new List() != null) i++; if (new T[0] != null) i++; if (serializer.GetParseFn() != null) i++; if (DeserializeArray.Parse != null) i++; JsConfig.ExcludeTypeInfo = false; //JsConfig.SerializeFn = arg => ""; //JsConfig.DeSerializeFn = arg => default(T); DeserializeArrayWithElements.ParseGenericArray(null, null); DeserializeCollection.ParseCollection(null, null, null); DeserializeListWithElements.ParseGenericList(null, null, null); SpecializedQueueElements.ConvertToQueue(null); SpecializedQueueElements.ConvertToStack(null); WriteListsOfElements.WriteList(null, null); WriteListsOfElements.WriteIList(null, null); WriteListsOfElements.WriteEnumerable(null, null); WriteListsOfElements.WriteListValueType(null, null); WriteListsOfElements.WriteIListValueType(null, null); JsonReader.Parse(null); JsonWriter.WriteFn(); TranslateListWithElements.LateBoundTranslateToGenericICollection(null, null); TranslateListWithConvertibleElements.LateBoundTranslateToGenericICollection(null, null); QueryStringWriter.WriteObject(null, null); } public static void RegisterElement() { RegisterBuiltin(); DeserializeDictionary.ParseDictionary(null, null, null, null); DeserializeDictionary.ParseDictionary(null, null, null, null); ToStringDictionaryMethods.WriteIDictionary(null, null, null, null); ToStringDictionaryMethods.WriteIDictionary(null, null, null, null); TranslateListWithElements.LateBoundTranslateToGenericICollection(null, typeof(List)); TranslateListWithConvertibleElements.LateBoundTranslateToGenericICollection(null, typeof(List)); } } #endif public class JsConfig //where T : struct { /// /// Never emit type info for this type /// public static bool ExcludeTypeInfo = false; /// /// if the is configured /// to take advantage of specification, /// to support user-friendly serialized formats, ie emitting camelCasing for JSON /// and parsing member names and enum values in a case-insensitive manner. /// public static bool EmitCamelCaseNames = false; /// /// Define custom serialization fn for BCL Structs /// private static Func serializeFn; public static Func SerializeFn { get { return serializeFn; } set { serializeFn = value; if (value != null) JsConfig.HasSerializeFn.Add(typeof(T)); else JsConfig.HasSerializeFn.Remove(typeof(T)); } } /// /// Define custom deserialization fn for BCL Structs /// public static Func DeSerializeFn; /// /// Exclude specific properties of this type from being serialized /// public static string[] ExcludePropertyNames; public static void WriteFn(TextWriter writer, object obj) { var serializer = JsWriter.GetTypeSerializer(); serializer.WriteString(writer, SerializeFn((T)obj)); } public static object ParseFn(string str) { return DeSerializeFn(str); } } public enum JsonDateHandler { TimestampOffset, DCJSCompatible, ISO8601 } } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ITypeSerializer.Generic.cs0000644000175000017500000000277612146506553030506 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.IO; namespace ServiceStack.Text { public interface ITypeSerializer { /// /// Determines whether this serializer can create the specified type from a string. /// /// The type. /// /// true if this instance [can create from string] the specified type; otherwise, false. /// bool CanCreateFromString(Type type); /// /// Parses the specified value. /// /// The value. /// T DeserializeFromString(string value); /// /// Deserializes from reader. /// /// The reader. /// T DeserializeFromReader(TextReader reader); /// /// Serializes to string. /// /// The value. /// string SerializeToString(T value); /// /// Serializes to writer. /// /// The value. /// The writer. void SerializeToWriter(T value, TextWriter writer); } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Marc/0000755000175000017500000000000012146506553024366 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Marc/TypeAccessor.cs0000644000175000017500000003304112146506553027322 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Reflection; using System.Reflection.Emit; using System.Threading; //using System.Dynamic; //Not using it here, but @marcgravell's stuff is too good not to include // http://code.google.com/p/fast-member/ Apache License 2.0 #if !SILVERLIGHT && !MONOTOUCH && !XBOX namespace FastMember { /// /// Provides by-name member-access to objects of a given type /// public abstract class TypeAccessor { // hash-table has better read-without-locking semantics than dictionary private static readonly Hashtable typeLookyp = new Hashtable(); /// /// Does this type support new instances via a parameterless constructor? /// public virtual bool CreateNewSupported { get { return false; } } /// /// Create a new instance of this type /// public virtual object CreateNew() { throw new NotSupportedException();} /// /// Provides a type-specific accessor, allowing by-name access for all objects of that type /// /// The accessor is cached internally; a pre-existing accessor may be returned public static TypeAccessor Create(Type type) { if(type == null) throw new ArgumentNullException("type"); TypeAccessor obj = (TypeAccessor)typeLookyp[type]; if (obj != null) return obj; lock(typeLookyp) { // double-check obj = (TypeAccessor)typeLookyp[type]; if (obj != null) return obj; obj = CreateNew(type); typeLookyp[type] = obj; return obj; } } //sealed class DynamicAccessor : TypeAccessor //{ // public static readonly DynamicAccessor Singleton = new DynamicAccessor(); // private DynamicAccessor(){} // public override object this[object target, string name] // { // get { return CallSiteCache.GetValue(name, target); } // set { CallSiteCache.SetValue(name, target, value); } // } //} private static AssemblyBuilder assembly; private static ModuleBuilder module; private static int counter; private static void WriteGetter(ILGenerator il, Type type, PropertyInfo[] props, FieldInfo[] fields, bool isStatic) { LocalBuilder loc = type.IsValueType ? il.DeclareLocal(type) : null; OpCode propName = isStatic ? OpCodes.Ldarg_1 : OpCodes.Ldarg_2, target = isStatic ? OpCodes.Ldarg_0 : OpCodes.Ldarg_1; foreach (PropertyInfo prop in props) { if (prop.GetIndexParameters().Length != 0 || !prop.CanRead) continue; Label next = il.DefineLabel(); il.Emit(propName); il.Emit(OpCodes.Ldstr, prop.Name); il.EmitCall(OpCodes.Call, strinqEquals, null); il.Emit(OpCodes.Brfalse_S, next); // match: il.Emit(target); Cast(il, type, loc); il.EmitCall(type.IsValueType ? OpCodes.Call : OpCodes.Callvirt, prop.GetGetMethod(), null); if (prop.PropertyType.IsValueType) { il.Emit(OpCodes.Box, prop.PropertyType); } il.Emit(OpCodes.Ret); // not match: il.MarkLabel(next); } foreach (FieldInfo field in fields) { Label next = il.DefineLabel(); il.Emit(propName); il.Emit(OpCodes.Ldstr, field.Name); il.EmitCall(OpCodes.Call, strinqEquals, null); il.Emit(OpCodes.Brfalse_S, next); // match: il.Emit(target); Cast(il, type, loc); il.Emit(OpCodes.Ldfld, field); if (field.FieldType.IsValueType) { il.Emit(OpCodes.Box, field.FieldType); } il.Emit(OpCodes.Ret); // not match: il.MarkLabel(next); } il.Emit(OpCodes.Ldstr, "name"); il.Emit(OpCodes.Newobj, typeof(ArgumentOutOfRangeException).GetConstructor(new Type[] { typeof(string) })); il.Emit(OpCodes.Throw); } private static void WriteSetter(ILGenerator il, Type type, PropertyInfo[] props, FieldInfo[] fields, bool isStatic) { if (type.IsValueType) { il.Emit(OpCodes.Ldstr, "Write is not supported for structs"); il.Emit(OpCodes.Newobj, typeof(NotSupportedException).GetConstructor(new Type[] { typeof(string) })); il.Emit(OpCodes.Throw); } else { OpCode propName = isStatic ? OpCodes.Ldarg_1 : OpCodes.Ldarg_2, target = isStatic ? OpCodes.Ldarg_0 : OpCodes.Ldarg_1, value = isStatic ? OpCodes.Ldarg_2 : OpCodes.Ldarg_3; LocalBuilder loc = type.IsValueType ? il.DeclareLocal(type) : null; foreach (PropertyInfo prop in props) { if (prop.GetIndexParameters().Length != 0 || !prop.CanWrite) continue; Label next = il.DefineLabel(); il.Emit(propName); il.Emit(OpCodes.Ldstr, prop.Name); il.EmitCall(OpCodes.Call, strinqEquals, null); il.Emit(OpCodes.Brfalse_S, next); // match: il.Emit(target); Cast(il, type, loc); il.Emit(value); Cast(il, prop.PropertyType, null); il.EmitCall(type.IsValueType ? OpCodes.Call : OpCodes.Callvirt, prop.GetSetMethod(), null); il.Emit(OpCodes.Ret); // not match: il.MarkLabel(next); } foreach (FieldInfo field in fields) { Label next = il.DefineLabel(); il.Emit(propName); il.Emit(OpCodes.Ldstr, field.Name); il.EmitCall(OpCodes.Call, strinqEquals, null); il.Emit(OpCodes.Brfalse_S, next); // match: il.Emit(target); Cast(il, type, loc); il.Emit(value); Cast(il, field.FieldType, null); il.Emit(OpCodes.Stfld, field); il.Emit(OpCodes.Ret); // not match: il.MarkLabel(next); } il.Emit(OpCodes.Ldstr, "name"); il.Emit(OpCodes.Newobj, typeof(ArgumentOutOfRangeException).GetConstructor(new Type[] { typeof(string) })); il.Emit(OpCodes.Throw); } } private static readonly MethodInfo strinqEquals = typeof(string).GetMethod("op_Equality", new Type[] { typeof(string), typeof(string) }); sealed class DelegateAccessor : TypeAccessor { private readonly Func getter; private readonly Action setter; private readonly Func ctor; public DelegateAccessor(Func getter, Action setter, Func ctor) { this.getter = getter; this.setter = setter; this.ctor = ctor; } public override bool CreateNewSupported { get { return ctor != null; } } public override object CreateNew() { return ctor != null ? ctor() : base.CreateNew(); } public override object this[object target, string name] { get { return getter(target, name); } set { setter(target, name, value); } } } private static bool IsFullyPublic(Type type) { while (type.IsNestedPublic) type = type.DeclaringType; return type.IsPublic; } static TypeAccessor CreateNew(Type type) { //if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(type)) //{ // return DynamicAccessor.Singleton; //} PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); ConstructorInfo ctor = null; if(type.IsClass && !type.IsAbstract) { ctor = type.GetConstructor(Type.EmptyTypes); } ILGenerator il; if(!IsFullyPublic(type)) { DynamicMethod dynGetter = new DynamicMethod(type.FullName + "_get", typeof(object), new Type[] { typeof(object), typeof(string) }, type, true), dynSetter = new DynamicMethod(type.FullName + "_set", null, new Type[] { typeof(object), typeof(string), typeof(object) }, type, true); WriteGetter(dynGetter.GetILGenerator(), type, props, fields, true); WriteSetter(dynSetter.GetILGenerator(), type, props, fields, true); DynamicMethod dynCtor = null; if(ctor != null) { dynCtor = new DynamicMethod(type.FullName + "_ctor", typeof(object), Type.EmptyTypes, type, true); il = dynCtor.GetILGenerator(); il.Emit(OpCodes.Newobj, ctor); il.Emit(OpCodes.Ret); } return new DelegateAccessor( (Func)dynGetter.CreateDelegate(typeof(Func)), (Action)dynSetter.CreateDelegate(typeof(Action)), dynCtor == null ? null : (Func)dynCtor.CreateDelegate(typeof(Func))); } // note this region is synchronized; only one is being created at a time so we don't need to stress about the builders if(assembly == null) { AssemblyName name = new AssemblyName("FastMember_dynamic"); assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); module = assembly.DefineDynamicModule(name.Name); } TypeBuilder tb = module.DefineType("FastMember_dynamic." + type.Name + "_" + Interlocked.Increment(ref counter), (typeof(TypeAccessor).Attributes | TypeAttributes.Sealed) & ~TypeAttributes.Abstract, typeof(TypeAccessor) ); tb.DefineDefaultConstructor(MethodAttributes.Public); PropertyInfo indexer = typeof (TypeAccessor).GetProperty("Item"); MethodInfo baseGetter = indexer.GetGetMethod(), baseSetter = indexer.GetSetMethod(); MethodBuilder body = tb.DefineMethod(baseGetter.Name, baseGetter.Attributes & ~MethodAttributes.Abstract, typeof(object), new Type[] {typeof(object), typeof(string)}); il = body.GetILGenerator(); WriteGetter(il, type, props, fields, false); tb.DefineMethodOverride(body, baseGetter); body = tb.DefineMethod(baseSetter.Name, baseSetter.Attributes & ~MethodAttributes.Abstract, null, new Type[] { typeof(object), typeof(string), typeof(object) }); il = body.GetILGenerator(); WriteSetter(il, type, props, fields, false); tb.DefineMethodOverride(body, baseSetter); if(ctor != null) { MethodInfo baseMethod = typeof (TypeAccessor).GetProperty("CreateNewSupported").GetGetMethod(); body = tb.DefineMethod(baseMethod.Name, baseMethod.Attributes, typeof (bool), Type.EmptyTypes); il = body.GetILGenerator(); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Ret); tb.DefineMethodOverride(body, baseMethod); baseMethod = typeof (TypeAccessor).GetMethod("CreateNew"); body = tb.DefineMethod(baseMethod.Name, baseMethod.Attributes, typeof (object), Type.EmptyTypes); il = body.GetILGenerator(); il.Emit(OpCodes.Newobj, ctor); il.Emit(OpCodes.Ret); tb.DefineMethodOverride(body, baseMethod); } return (TypeAccessor)Activator.CreateInstance(tb.CreateType()); } private static void Cast(ILGenerator il, Type type, LocalBuilder addr) { if(type == typeof(object)) {} else if(type.IsValueType) { il.Emit(OpCodes.Unbox_Any, type); if (addr != null) { il.Emit(OpCodes.Stloc, addr); il.Emit(OpCodes.Ldloca_S, addr); } } else { il.Emit(OpCodes.Castclass, type); } } /// /// Get or set the value of a named member on the target instance /// public abstract object this[object target, string name] { get; set; } } } #endif smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Marc/Link.cs0000644000175000017500000000340212146506553025611 0ustar00meebeymeebey00000000000000using System.Threading; //Not using it here, but @marcgravell's stuff is too good not to include namespace ServiceStack.Text.Marc { /// /// Pretty Thread-Safe cache class from: /// http://code.google.com/p/dapper-dot-net/source/browse/Dapper/SqlMapper.cs /// /// This is a micro-cache; suitable when the number of terms is controllable (a few hundred, for example), /// and strictly append-only; you cannot change existing values. All key matches are on **REFERENCE** /// equality. The type is fully thread-safe. /// class Link where TKey : class { public static bool TryGet(Link link, TKey key, out TValue value) { while (link != null) { if ((object)key == (object)link.Key) { value = link.Value; return true; } link = link.Tail; } value = default(TValue); return false; } public static bool TryAdd(ref Link head, TKey key, ref TValue value) { bool tryAgain; do { var snapshot = Interlocked.CompareExchange(ref head, null, null); TValue found; if (TryGet(snapshot, key, out found)) { // existing match; report the existing value instead value = found; return false; } var newNode = new Link(key, value, snapshot); // did somebody move our cheese? tryAgain = Interlocked.CompareExchange(ref head, newNode, snapshot) != snapshot; } while (tryAgain); return true; } private Link(TKey key, TValue value, Link tail) { Key = key; Value = value; Tail = tail; } public TKey Key { get; private set; } public TValue Value { get; private set; } public Link Tail { get; private set; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Marc/ObjectAccessor.cs0000644000175000017500000000612312146506553027610 0ustar00meebeymeebey00000000000000using System; //using System.Dynamic; //Not using it here, but @marcgravell's stuff is too good not to include #if !SILVERLIGHT && !MONOTOUCH && !XBOX namespace FastMember { /// /// Represents an individual object, allowing access to members by-name /// public abstract class ObjectAccessor { /// /// Get or Set the value of a named member for the underlying object /// public abstract object this[string name] { get; set; } /// /// The object represented by this instance /// public abstract object Target { get; } /// /// Use the target types definition of equality /// public override bool Equals(object obj) { return Target.Equals(obj); } /// /// Obtain the hash of the target object /// public override int GetHashCode() { return Target.GetHashCode(); } /// /// Use the target's definition of a string representation /// public override string ToString() { return Target.ToString(); } /// /// Wraps an individual object, allowing by-name access to that instance /// public static ObjectAccessor Create(object target) { if (target == null) throw new ArgumentNullException("target"); //IDynamicMetaObjectProvider dlr = target as IDynamicMetaObjectProvider; //if (dlr != null) return new DynamicWrapper(dlr); // use the DLR return new TypeAccessorWrapper(target, TypeAccessor.Create(target.GetType())); } sealed class TypeAccessorWrapper : ObjectAccessor { private readonly object target; private readonly TypeAccessor accessor; public TypeAccessorWrapper(object target, TypeAccessor accessor) { this.target = target; this.accessor = accessor; } public override object this[string name] { get { return accessor[target, name.ToUpperInvariant()]; } set { accessor[target, name.ToUpperInvariant()] = value; } } public override object Target { get { return target; } } } //sealed class DynamicWrapper : ObjectAccessor //{ // private readonly IDynamicMetaObjectProvider target; // public override object Target // { // get { return target; } // } // public DynamicWrapper(IDynamicMetaObjectProvider target) // { // this.target = target; // } // public override object this[string name] // { // get { return CallSiteCache.GetValue(name, target); } // set { CallSiteCache.SetValue(name, target, value); } // } //} } } #endifsmuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/QueryStringSerializer.cs0000644000175000017500000000677412146506553030377 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Reflection; using System.Text; using System.Threading; using ServiceStack.Text.Common; using ServiceStack.Text.Jsv; namespace ServiceStack.Text { public static class QueryStringSerializer { internal static readonly JsWriter Instance = new JsWriter(); private static Dictionary WriteFnCache = new Dictionary(); internal static WriteObjectDelegate GetWriteFn(Type type) { try { WriteObjectDelegate writeFn; if (WriteFnCache.TryGetValue(type, out writeFn)) return writeFn; var genericType = typeof(QueryStringWriter<>).MakeGenericType(type); var mi = genericType.GetMethod("WriteFn", BindingFlags.NonPublic | BindingFlags.Static); var writeFactoryFn = (Func)Delegate.CreateDelegate( typeof(Func), mi); writeFn = writeFactoryFn(); Dictionary snapshot, newCache; do { snapshot = WriteFnCache; newCache = new Dictionary(WriteFnCache); newCache[type] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref WriteFnCache, newCache, snapshot), snapshot)); return writeFn; } catch (Exception ex) { Tracer.Instance.WriteError(ex); throw; } } public static void WriteLateBoundObject(TextWriter writer, object value) { if (value == null) return; var writeFn = GetWriteFn(value.GetType()); writeFn(writer, value); } internal static WriteObjectDelegate GetValueTypeToStringMethod(Type type) { return Instance.GetValueTypeToStringMethod(type); } public static string SerializeToString(T value) { var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { GetWriteFn(value.GetType())(writer, value); } return sb.ToString(); } } /// /// Implement the serializer using a more static approach /// /// public static class QueryStringWriter { private static readonly WriteObjectDelegate CacheFn; internal static WriteObjectDelegate WriteFn() { return CacheFn; } static QueryStringWriter() { if (typeof(T) == typeof(object)) { CacheFn = QueryStringSerializer.WriteLateBoundObject; } else { if (typeof(T).IsClass || typeof(T).IsInterface) { var canWriteType = WriteType.Write; if (canWriteType != null) { CacheFn = WriteType.WriteQueryString; return; } } CacheFn = QueryStringSerializer.Instance.GetWriteFn(); } } public static void WriteObject(TextWriter writer, object value) { if (writer == null) return; CacheFn(writer, value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/TypeSerializer.Generic.cs0000644000175000017500000000303112146506553030356 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.IO; using System.Text; using ServiceStack.Text.Jsv; namespace ServiceStack.Text { public class TypeSerializer : ITypeSerializer { public bool CanCreateFromString(Type type) { return JsvReader.GetParseFn(type) != null; } /// /// Parses the specified value. /// /// The value. /// public T DeserializeFromString(string value) { if (string.IsNullOrEmpty(value)) return default(T); return (T)JsvReader.Parse(value); } public T DeserializeFromReader(TextReader reader) { return DeserializeFromString(reader.ReadToEnd()); } public string SerializeToString(T value) { if (value == null) return null; if (typeof(T) == typeof(string)) return value as string; var sb = new StringBuilder(); using (var writer = new StringWriter(sb)) { JsvWriter.WriteObject(writer, value); } return sb.ToString(); } public void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; if (typeof(T) == typeof(string)) { writer.Write(value); return; } JsvWriter.WriteObject(writer, value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/JsonSerializer.Generic.cs0000644000175000017500000000470712146506553030361 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.IO; using System.Text; using ServiceStack.Text.Common; using ServiceStack.Text.Json; namespace ServiceStack.Text { public class JsonSerializer : ITypeSerializer { public bool CanCreateFromString(Type type) { return JsonReader.GetParseFn(type) != null; } /// /// Parses the specified value. /// /// The value. /// public T DeserializeFromString(string value) { if (string.IsNullOrEmpty(value)) return default(T); return (T)JsonReader.Parse(value); } public T DeserializeFromReader(TextReader reader) { return DeserializeFromString(reader.ReadToEnd()); } public string SerializeToString(T value) { if (value == null) return null; if (typeof(T) == typeof(string)) return value as string; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; var result = JsonSerializer.SerializeToString(value, value.GetType()); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return result; } var sb = new StringBuilder(); using (var writer = new StringWriter(sb)) { JsonWriter.WriteObject(writer, value); } return sb.ToString(); } public void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; if (typeof(T) == typeof(string)) { writer.Write(value); return; } if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; JsonSerializer.SerializeToWriter(value, value.GetType(), writer); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return; } JsonWriter.WriteObject(writer, value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Support/0000755000175000017500000000000012146506553025160 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Support/DoubleConverter.cs0000644000175000017500000001422612146506553030616 0ustar00meebeymeebey00000000000000namespace ServiceStack.Text.Support { using System; using System.Globalization; /// /// A class to allow the conversion of doubles to string representations of /// their exact decimal values. The implementation aims for readability over /// efficiency. /// /// Courtesy of @JonSkeet /// http://www.yoda.arachsys.com/csharp/DoubleConverter.cs /// public class DoubleConverter { /// /// Converts the given double to a string representation of its /// exact decimal value. /// /// The double to convert. /// A string representation of the double's exact decimal value. public static string ToExactString(double d) { #if XBOX return BitConverter.ToString( BitConverter.GetBytes( d ) ) ; #else if (double.IsPositiveInfinity(d)) return "+Infinity"; if (double.IsNegativeInfinity(d)) return "-Infinity"; if (double.IsNaN(d)) return "NaN"; // Translate the double into sign, exponent and mantissa. long bits = BitConverter.DoubleToInt64Bits(d); // Note that the shift is sign-extended, hence the test against -1 not 1 bool negative = (bits < 0); int exponent = (int)((bits >> 52) & 0x7ffL); long mantissa = bits & 0xfffffffffffffL; // Subnormal numbers; exponent is effectively one higher, // but there's no extra normalisation bit in the mantissa if (exponent == 0) { exponent++; } // Normal numbers; leave exponent as it is but add extra // bit to the front of the mantissa else { mantissa = mantissa | (1L << 52); } // Bias the exponent. It's actually biased by 1023, but we're // treating the mantissa as m.0 rather than 0.m, so we need // to subtract another 52 from it. exponent -= 1075; if (mantissa == 0) { return "0"; } /* Normalize */ while ((mantissa & 1) == 0) { /* i.e., Mantissa is even */ mantissa >>= 1; exponent++; } /// Construct a new decimal expansion with the mantissa ArbitraryDecimal ad = new ArbitraryDecimal(mantissa); // If the exponent is less than 0, we need to repeatedly // divide by 2 - which is the equivalent of multiplying // by 5 and dividing by 10. if (exponent < 0) { for (int i = 0; i < -exponent; i++) ad.MultiplyBy(5); ad.Shift(-exponent); } // Otherwise, we need to repeatedly multiply by 2 else { for (int i = 0; i < exponent; i++) ad.MultiplyBy(2); } // Finally, return the string with an appropriate sign if (negative) return "-" + ad.ToString(); else return ad.ToString(); #endif } /// Private class used for manipulating class ArbitraryDecimal { /// Digits in the decimal expansion, one byte per digit byte[] digits; /// /// How many digits are *after* the decimal point /// int decimalPoint = 0; /// /// Constructs an arbitrary decimal expansion from the given long. /// The long must not be negative. /// internal ArbitraryDecimal(long x) { string tmp = x.ToString(CultureInfo.InvariantCulture); digits = new byte[tmp.Length]; for (int i = 0; i < tmp.Length; i++) digits[i] = (byte)(tmp[i] - '0'); Normalize(); } /// /// Multiplies the current expansion by the given amount, which should /// only be 2 or 5. /// internal void MultiplyBy(int amount) { byte[] result = new byte[digits.Length + 1]; for (int i = digits.Length - 1; i >= 0; i--) { int resultDigit = digits[i] * amount + result[i + 1]; result[i] = (byte)(resultDigit / 10); result[i + 1] = (byte)(resultDigit % 10); } if (result[0] != 0) { digits = result; } else { Array.Copy(result, 1, digits, 0, digits.Length); } Normalize(); } /// /// Shifts the decimal point; a negative value makes /// the decimal expansion bigger (as fewer digits come after the /// decimal place) and a positive value makes the decimal /// expansion smaller. /// internal void Shift(int amount) { decimalPoint += amount; } /// /// Removes leading/trailing zeroes from the expansion. /// internal void Normalize() { int first; for (first = 0; first < digits.Length; first++) if (digits[first] != 0) break; int last; for (last = digits.Length - 1; last >= 0; last--) if (digits[last] != 0) break; if (first == 0 && last == digits.Length - 1) return; byte[] tmp = new byte[last - first + 1]; for (int i = 0; i < tmp.Length; i++) tmp[i] = digits[i + first]; decimalPoint -= digits.Length - (last + 1); digits = tmp; } /// /// Converts the value to a proper decimal string representation. /// public override String ToString() { char[] digitString = new char[digits.Length]; for (int i = 0; i < digits.Length; i++) digitString[i] = (char)(digits[i] + '0'); // Simplest case - nothing after the decimal point, // and last real digit is non-zero, eg value=35 if (decimalPoint == 0) { return new string(digitString); } // Fairly simple case - nothing after the decimal // point, but some 0s to add, eg value=350 if (decimalPoint < 0) { return new string(digitString) + new string('0', -decimalPoint); } // Nothing before the decimal point, eg 0.035 if (decimalPoint >= digitString.Length) { return "0." + new string('0', (decimalPoint - digitString.Length)) + new string(digitString); } // Most complicated case - part of the string comes // before the decimal point, part comes after it, // eg 3.5 return new string(digitString, 0, digitString.Length - decimalPoint) + "." + new string(digitString, digitString.Length - decimalPoint, decimalPoint); } } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Support/AssemblyTypeDefinition.cs0000644000175000017500000000124512146506553032143 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Common.Support { internal class AssemblyTypeDefinition { private const char TypeDefinitionSeperator = ','; private const int TypeNameIndex = 0; private const int AssemblyNameIndex = 1; public AssemblyTypeDefinition(string typeDefinition) { if (string.IsNullOrEmpty(typeDefinition)) { throw new ArgumentNullException(); } var parts = typeDefinition.Split(TypeDefinitionSeperator); TypeName = parts[TypeNameIndex].Trim(); AssemblyName = (parts.Length > AssemblyNameIndex) ? parts[AssemblyNameIndex].Trim() : null; } public string TypeName { get; set; } public string AssemblyName { get; set; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Support/TypePair.cs0000644000175000017500000000226112146506553027245 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; namespace ServiceStack.Text.Support { public class TypePair { public Type[] Args1 { get; set; } public Type[] Arg2 { get; set; } public TypePair(Type[] arg1, Type[] arg2) { Args1 = arg1; Arg2 = arg2; } public bool Equals(TypePair other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return Equals(other.Args1, Args1) && Equals(other.Arg2, Arg2); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != typeof (TypePair)) return false; return Equals((TypePair) obj); } public override int GetHashCode() { unchecked { return ((Args1 != null ? Args1.GetHashCode() : 0)*397) ^ (Arg2 != null ? Arg2.GetHashCode() : 0); } } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/JsonObject.cs0000644000175000017500000000425512146506553026101 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Text { public static class JsonExtensions { public static T JsonTo(this Dictionary map, string key) { return Get(map, key); } public static T Get(this Dictionary map, string key) { string strVal; return map.TryGetValue(key, out strVal) ? JsonSerializer.DeserializeFromString(strVal) : default(T); } public static string Get(this Dictionary map, string key) { string strVal; return map.TryGetValue(key, out strVal) ? strVal : null; } public static JsonArrayObjects ArrayObjects(this string json, string propertyName) { return Text.JsonArrayObjects.Parse(json); } public static List ConvertAll(this JsonArrayObjects jsonArrayObjects, Func converter) { var results = new List(); foreach (var jsonObject in jsonArrayObjects) { results.Add(converter(jsonObject)); } return results; } public static T ConvertTo(this JsonObject jsonObject, Func converFn) { return jsonObject == null ? default(T) : converFn(jsonObject); } public static Dictionary ToDictionary(this JsonObject jsonObject) { return jsonObject == null ? new Dictionary() : new Dictionary(jsonObject); } } public class JsonObject : Dictionary { public static JsonObject Parse(string json) { return JsonSerializer.DeserializeFromString(json); } public JsonArrayObjects ArrayObjects(string propertyName) { string strValue; return this.TryGetValue(propertyName, out strValue) ? JsonArrayObjects.Parse(strValue) : null; } public JsonObject Object(string propertyName) { string strValue; return this.TryGetValue(propertyName, out strValue) ? Parse(strValue) : null; } } public class JsonArrayObjects : List { public static JsonArrayObjects Parse(string json) { return JsonSerializer.DeserializeFromString(json); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/JsvFormatter.cs0000644000175000017500000000426312146506553026466 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Peter Townsend (townsend.pete@gmail.com) // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Text; using ServiceStack.Text.Common; namespace ServiceStack.Text { public static class JsvFormatter { public static string Format(string serializedText) { if (string.IsNullOrEmpty(serializedText)) return null; var tabCount = 0; var sb = new StringBuilder(); var firstKeySeparator = true; for (var i = 0; i < serializedText.Length; i++) { var current = serializedText[i]; var previous = i - 1 >= 0 ? serializedText[i - 1] : 0; var next = i < serializedText.Length - 1 ? serializedText[i + 1] : 0; if (current == JsWriter.MapStartChar || current == JsWriter.ListStartChar) { if (previous == JsWriter.MapKeySeperator) { if (next == JsWriter.MapEndChar || next == JsWriter.ListEndChar) { sb.Append(current); sb.Append(serializedText[++i]); //eat next continue; } AppendTabLine(sb, tabCount); } sb.Append(current); AppendTabLine(sb, ++tabCount); firstKeySeparator = true; continue; } if (current == JsWriter.MapEndChar || current == JsWriter.ListEndChar) { AppendTabLine(sb, --tabCount); sb.Append(current); firstKeySeparator = true; continue; } if (current == JsWriter.ItemSeperator) { sb.Append(current); AppendTabLine(sb, tabCount); firstKeySeparator = true; continue; } sb.Append(current); if (current == JsWriter.MapKeySeperator && firstKeySeparator) { sb.Append(" "); firstKeySeparator = false; } } return sb.ToString(); } private static void AppendTabLine(StringBuilder sb, int tabCount) { sb.AppendLine(); if (tabCount > 0) { sb.Append(new string('\t', tabCount)); } } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/TypeConfig.cs0000644000175000017500000000243112146506553026102 0ustar00meebeymeebey00000000000000using System; using System.Linq; using System.Reflection; namespace ServiceStack.Text { internal class TypeConfig { internal readonly Type Type; internal bool EnableAnonymousFieldSetterses; internal PropertyInfo[] Properties; internal TypeConfig(Type type) { Type = type; EnableAnonymousFieldSetterses = false; Properties = new PropertyInfo[0]; } } public static class TypeConfig { private static readonly TypeConfig config; public static PropertyInfo[] Properties { get { return config.Properties; } set { config.Properties = value; } } public static bool EnableAnonymousFieldSetters { get { return config.EnableAnonymousFieldSetterses; } set { config.EnableAnonymousFieldSetterses = value; } } static TypeConfig() { config = new TypeConfig(typeof(T)); var excludedProperties = JsConfig.ExcludePropertyNames ?? new string[0]; var properties = excludedProperties.Any() ? config.Type.GetSerializableProperties().Where(x => !excludedProperties.Contains(x.Name)) : config.Type.GetSerializableProperties(); Properties = properties.Where(x => x.GetIndexParameters().Length == 0).ToArray(); } internal static TypeConfig GetState() { return config; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ListExtensions.cs0000644000175000017500000000262612146506553027034 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceStack.Text.Common; namespace ServiceStack.Text { public static class ListExtensions { public static string Join(this IEnumerable values) { return Join(values, JsWriter.ItemSeperatorString); } public static string Join(this IEnumerable values, string seperator) { var sb = new StringBuilder(); foreach (var value in values) { if (sb.Length > 0) sb.Append(seperator); sb.Append(value); } return sb.ToString(); } public static bool IsNullOrEmpty(this List list) { return list == null || list.Count == 0; } //TODO: make it work public static IEnumerable SafeWhere(this List list, Func predicate) { return list.Where(predicate); } public static int NullableCount(this List list) { return list == null ? 0 : list.Count; } public static void AddIfNotExists(this List list, T item) { if (!list.Contains(item)) list.Add(item); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/MapExtensions.cs0000644000175000017500000000172612146506553026636 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System.Collections.Generic; using System.Text; using ServiceStack.Text.Common; namespace ServiceStack.Text { public static class MapExtensions { public static string Join(this Dictionary values) { return Join(values, JsWriter.ItemSeperatorString, JsWriter.MapKeySeperatorString); } public static string Join(this Dictionary values, string itemSeperator, string keySeperator) { var sb = new StringBuilder(); foreach (var entry in values) { if (sb.Length > 0) sb.Append(itemSeperator); sb.Append(entry.Key).Append(keySeperator).Append(entry.Value); } return sb.ToString(); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ServiceStack.Text.XBox360.csproj0000644000175000017500000001470612146506553031357 0ustar00meebeymeebey00000000000000 {E2B0C358-6CC5-4D15-AD73-41730FBF5530} {6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Debug Xbox 360 Library Properties ServiceStack.Text.XBox360 ServiceStack.Text.XBox360 v4.0 Client v4.0 Xbox 360 HiDef 0ed135ea-1216-457e-bc3e-9a191a60dafa Library true full false bin\Xbox 360\Debug DEBUG;TRACE;XBOX;XBOX360 prompt 4 true false true pdbonly true bin\Xbox 360\Release TRACE;XBOX;XBOX360 prompt 4 true false true 4.0 4.0 smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/CsvSerializer.cs0000644000175000017500000001714012146506553026623 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Reflection; using System.Text; using System.Threading; using ServiceStack.Text.Common; using ServiceStack.Text.Jsv; using ServiceStack.Text.Reflection; namespace ServiceStack.Text { public class CsvSerializer { private static readonly UTF8Encoding UTF8EncodingWithoutBom = new UTF8Encoding(false); private static Dictionary WriteFnCache = new Dictionary(); internal static WriteObjectDelegate GetWriteFn(Type type) { try { WriteObjectDelegate writeFn; if (WriteFnCache.TryGetValue(type, out writeFn)) return writeFn; var genericType = typeof(CsvSerializer<>).MakeGenericType(type); var mi = genericType.GetMethod("WriteFn", BindingFlags.Public | BindingFlags.Static); var writeFactoryFn = (Func)Delegate.CreateDelegate( typeof(Func), mi); writeFn = writeFactoryFn(); Dictionary snapshot, newCache; do { snapshot = WriteFnCache; newCache = new Dictionary(WriteFnCache); newCache[type] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref WriteFnCache, newCache, snapshot), snapshot)); return writeFn; } catch (Exception ex) { Tracer.Instance.WriteError(ex); throw; } } public static string SerializeToCsv(IEnumerable records) { var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { writer.WriteCsv(records); return sb.ToString(); } } public static string SerializeToString(T value) { if (value == null) return null; if (typeof(T) == typeof(string)) return value as string; var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { CsvSerializer.WriteObject(writer, value); } return sb.ToString(); } public static void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; if (typeof(T) == typeof(string)) { writer.Write(value); return; } CsvSerializer.WriteObject(writer, value); } public static void SerializeToStream(T value, Stream stream) { if (value == null) return; using (var writer = new StreamWriter(stream, UTF8EncodingWithoutBom)) { CsvSerializer.WriteObject(writer, value); } } public static void SerializeToStream(object obj, Stream stream) { if (obj == null) return; using (var writer = new StreamWriter(stream, UTF8EncodingWithoutBom)) { var writeFn = GetWriteFn(obj.GetType()); writeFn(writer, obj); } } public static T DeserializeFromStream(Stream stream) { throw new NotImplementedException(); } public static object DeserializeFromStream(Type type, Stream stream) { throw new NotImplementedException(); } public static void WriteLateBoundObject(TextWriter writer, object value) { if (value == null) return; var writeFn = GetWriteFn(value.GetType()); writeFn(writer, value); } } internal static class CsvSerializer { private static readonly WriteObjectDelegate CacheFn; public static WriteObjectDelegate WriteFn() { return CacheFn; } private const string IgnoreResponseStatus = "ResponseStatus"; private static Func valueGetter = null; private static WriteObjectDelegate writeElementFn = null; private static WriteObjectDelegate GetWriteFn() { PropertyInfo firstCandidate = null; Type bestCandidateEnumerableType = null; PropertyInfo bestCandidate = null; if (typeof(T).IsValueType) { return JsvWriter.WriteObject; } //If type is an enumerable property itself write that bestCandidateEnumerableType = typeof(T).GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); if (bestCandidateEnumerableType != null) { var elementType = bestCandidateEnumerableType.GetGenericArguments()[0]; writeElementFn = CreateWriteFn(elementType); return WriteEnumerableType; } //Look for best candidate property if DTO if (typeof(T).IsDto()) { var properties = TypeConfig.Properties; foreach (var propertyInfo in properties) { if (propertyInfo.Name == IgnoreResponseStatus) continue; if (propertyInfo.PropertyType == typeof(string) || propertyInfo.PropertyType.IsValueType || propertyInfo.PropertyType == typeof(byte[])) continue; if (firstCandidate == null) { firstCandidate = propertyInfo; } var enumProperty = propertyInfo.PropertyType .GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); if (enumProperty != null) { bestCandidateEnumerableType = enumProperty; bestCandidate = propertyInfo; break; } } } //If is not DTO or no candidates exist, write self var noCandidatesExist = bestCandidate == null && firstCandidate == null; if (noCandidatesExist) { return WriteSelf; } //If is DTO and has an enumerable property serialize that if (bestCandidateEnumerableType != null) { valueGetter = bestCandidate.GetValueGetter(typeof(T)); var elementType = bestCandidateEnumerableType.GetGenericArguments()[0]; writeElementFn = CreateWriteFn(elementType); return WriteEnumerableProperty; } //If is DTO and has non-enumerable, reference type property serialize that valueGetter = firstCandidate.GetValueGetter(typeof(T)); writeElementFn = CreateWriteRowFn(firstCandidate.PropertyType); return WriteNonEnumerableType; } private static WriteObjectDelegate CreateWriteFn(Type elementType) { return CreateCsvWriterFn(elementType, "WriteObject"); } private static WriteObjectDelegate CreateWriteRowFn(Type elementType) { return CreateCsvWriterFn(elementType, "WriteObjectRow"); } private static WriteObjectDelegate CreateCsvWriterFn(Type elementType, string methodName) { var genericType = typeof(CsvWriter<>).MakeGenericType(elementType); var mi = genericType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public); var writeFn = (WriteObjectDelegate)Delegate.CreateDelegate(typeof(WriteObjectDelegate), mi); return writeFn; } public static void WriteEnumerableType(TextWriter writer, object obj) { writeElementFn(writer, obj); } public static void WriteSelf(TextWriter writer, object obj) { CsvWriter.WriteRow(writer, (T)obj); } public static void WriteEnumerableProperty(TextWriter writer, object obj) { if (obj == null) return; //AOT var enumerableProperty = valueGetter(obj); writeElementFn(writer, enumerableProperty); } public static void WriteNonEnumerableType(TextWriter writer, object obj) { var nonEnumerableType = valueGetter(obj); writeElementFn(writer, nonEnumerableType); } static CsvSerializer() { if (typeof(T) == typeof(object)) { CacheFn = CsvSerializer.WriteLateBoundObject; } else { CacheFn = GetWriteFn(); } } public static void WriteObject(TextWriter writer, object value) { CacheFn(writer, value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/TranslateListWithElements.cs0000644000175000017500000001730312146506553031161 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Threading; using ServiceStack.Text.Common; namespace ServiceStack.Text { public static class TranslateListWithElements { private static Dictionary TranslateICollectionCache = new Dictionary(); public static object TranslateToGenericICollectionCache(object from, Type toInstanceOfType, Type elementType) { ConvertInstanceDelegate translateToFn; if (TranslateICollectionCache.TryGetValue(toInstanceOfType, out translateToFn)) return translateToFn(from, toInstanceOfType); var genericType = typeof(TranslateListWithElements<>).MakeGenericType(elementType); var mi = genericType.GetMethod("LateBoundTranslateToGenericICollection", BindingFlags.Static | BindingFlags.Public); translateToFn = (ConvertInstanceDelegate)Delegate.CreateDelegate(typeof(ConvertInstanceDelegate), mi); Dictionary snapshot, newCache; do { snapshot = TranslateICollectionCache; newCache = new Dictionary(TranslateICollectionCache); newCache[elementType] = translateToFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref TranslateICollectionCache, newCache, snapshot), snapshot)); return translateToFn(from, toInstanceOfType); } private static Dictionary TranslateConvertibleICollectionCache = new Dictionary(); public static object TranslateToConvertibleGenericICollectionCache( object from, Type toInstanceOfType, Type fromElementType) { var typeKey = new ConvertibleTypeKey(toInstanceOfType, fromElementType); ConvertInstanceDelegate translateToFn; if (TranslateConvertibleICollectionCache.TryGetValue(typeKey, out translateToFn)) return translateToFn(from, toInstanceOfType); var toElementType = toInstanceOfType.GetGenericType().GetGenericArguments()[0]; var genericType = typeof(TranslateListWithConvertibleElements<,>).MakeGenericType(fromElementType, toElementType); var mi = genericType.GetMethod("LateBoundTranslateToGenericICollection", BindingFlags.Static | BindingFlags.Public); translateToFn = (ConvertInstanceDelegate)Delegate.CreateDelegate(typeof(ConvertInstanceDelegate), mi); Dictionary snapshot, newCache; do { snapshot = TranslateConvertibleICollectionCache; newCache = new Dictionary(TranslateConvertibleICollectionCache); newCache[typeKey] = translateToFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref TranslateConvertibleICollectionCache, newCache, snapshot), snapshot)); return translateToFn(from, toInstanceOfType); } public static object TryTranslateToGenericICollection(Type fromPropertyType, Type toPropertyType, object fromValue) { var args = typeof(ICollection<>).GetGenericArgumentsIfBothHaveSameGenericDefinitionTypeAndArguments( fromPropertyType, toPropertyType); if (args != null) { return TranslateToGenericICollectionCache( fromValue, toPropertyType, args[0]); } var varArgs = typeof(ICollection<>).GetGenericArgumentsIfBothHaveConvertibleGenericDefinitionTypeAndArguments( fromPropertyType, toPropertyType); if (varArgs != null) { return TranslateToConvertibleGenericICollectionCache( fromValue, toPropertyType, varArgs.Args1[0]); } return null; } } public class ConvertibleTypeKey { public Type ToInstanceType { get; set; } public Type FromElemenetType { get; set; } public ConvertibleTypeKey() { } public ConvertibleTypeKey(Type toInstanceType, Type fromElemenetType) { ToInstanceType = toInstanceType; FromElemenetType = fromElemenetType; } public bool Equals(ConvertibleTypeKey other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return Equals(other.ToInstanceType, ToInstanceType) && Equals(other.FromElemenetType, FromElemenetType); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != typeof(ConvertibleTypeKey)) return false; return Equals((ConvertibleTypeKey)obj); } public override int GetHashCode() { unchecked { return ((ToInstanceType != null ? ToInstanceType.GetHashCode() : 0) * 397) ^ (FromElemenetType != null ? FromElemenetType.GetHashCode() : 0); } } } public class TranslateListWithElements { public static object CreateInstance(Type toInstanceOfType) { if (toInstanceOfType.IsGenericType) { if (toInstanceOfType.HasAnyTypeDefinitionsOf( typeof(ICollection<>), typeof(IList<>))) { return ReflectionExtensions.CreateInstance(typeof(List)); } } return ReflectionExtensions.CreateInstance(toInstanceOfType); } public static IList TranslateToIList(IList fromList, Type toInstanceOfType) { var to = (IList)ReflectionExtensions.CreateInstance(toInstanceOfType); foreach (var item in fromList) { to.Add(item); } return to; } public static object LateBoundTranslateToGenericICollection( object fromList, Type toInstanceOfType) { if (fromList == null) return null; //AOT return TranslateToGenericICollection( (ICollection)fromList, toInstanceOfType); } public static ICollection TranslateToGenericICollection( ICollection fromList, Type toInstanceOfType) { var to = (ICollection)CreateInstance(toInstanceOfType); foreach (var item in fromList) { to.Add(item); } return to; } } public class TranslateListWithConvertibleElements { private static readonly Func ConvertFn; static TranslateListWithConvertibleElements() { ConvertFn = GetConvertFn(); } public static object LateBoundTranslateToGenericICollection( object fromList, Type toInstanceOfType) { return TranslateToGenericICollection( (ICollection)fromList, toInstanceOfType); } public static ICollection TranslateToGenericICollection( ICollection fromList, Type toInstanceOfType) { if (fromList == null) return null; //AOT var to = (ICollection)TranslateListWithElements.CreateInstance(toInstanceOfType); foreach (var item in fromList) { var toItem = ConvertFn(item); to.Add(toItem); } return to; } private static Func GetConvertFn() { if (typeof(TTo) == typeof(string)) { return x => (TTo)(object)TypeSerializer.SerializeToString(x); } if (typeof(TFrom) == typeof(string)) { return x => TypeSerializer.DeserializeFromString((string)(object)x); } return x => TypeSerializer.DeserializeFromString(TypeSerializer.SerializeToString(x)); } } } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/StringExtensions.cs0000644000175000017500000004237412146506553027373 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Globalization; using System.Text.RegularExpressions; using ServiceStack.Text.Support; namespace ServiceStack.Text { public static class StringExtensions { public static T To(this string value) { return TypeSerializer.DeserializeFromString(value); } public static T To(this string value, T defaultValue) { return string.IsNullOrEmpty(value) ? defaultValue : TypeSerializer.DeserializeFromString(value); } public static T ToOrDefaultValue(this string value) { return string.IsNullOrEmpty(value) ? default(T) : TypeSerializer.DeserializeFromString(value); } public static object To(this string value, Type type) { return TypeSerializer.DeserializeFromString(value, type); } /// /// Converts from base: 0 - 62 /// /// The source. /// From. /// To. /// public static string BaseConvert(this string source, int from, int to) { const string chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; var result = ""; var length = source.Length; var number = new int[length]; for (var i = 0; i < length; i++) { number[i] = chars.IndexOf(source[i]); } int newlen; do { var divide = 0; newlen = 0; for (var i = 0; i < length; i++) { divide = divide * from + number[i]; if (divide >= to) { number[newlen++] = divide / to; divide = divide % to; } else if (newlen > 0) { number[newlen++] = 0; } } length = newlen; result = chars[divide] + result; } while (newlen != 0); return result; } public static string EncodeXml(this string value) { return value.Replace("<", "<").Replace(">", ">").Replace("&", "&"); } public static string EncodeJson(this string value) { return string.Concat ("\"", value.Replace("\\", "\\\\").Replace("\"", "\\\"").Replace("\r", "").Replace("\n", "\\n"), "\"" ); } public static string EncodeJsv(this string value) { return value.ToCsvField(); } public static string UrlEncode(this string text) { if (string.IsNullOrEmpty(text)) return text; var sb = new StringBuilder(); var textLength = text.Length; for (var i = 0; i < textLength; i++) { var c = text.Substring(i, 1); int charCode = text[i]; if ( charCode >= 65 && charCode <= 90 // A-Z || charCode >= 97 && charCode <= 122 // a-z || charCode >= 48 && charCode <= 57 // 0-9 || charCode >= 44 && charCode <= 46 // ,-. ) { sb.Append(c); } else { sb.Append('%' + charCode.ToString("x")); } } return sb.ToString(); } public static string UrlDecode(this string text) { if (string.IsNullOrEmpty(text)) return null; var sb = new StringBuilder(); var textLength = text.Length; for (var i = 0; i < textLength; i++) { var c = text.Substring(i, 1); if (c == "+") { sb.Append(" "); } else if (c == "%") { var hexNo = Convert.ToInt32(text.Substring(i + 1, 2), 16); sb.Append((char)hexNo); i += 2; } else { sb.Append(c); } } return sb.ToString(); } #if !XBOX public static string HexEscape(this string text, params char[] anyCharOf) { if (string.IsNullOrEmpty(text)) return text; if (anyCharOf == null || anyCharOf.Length == 0) return text; var encodeCharMap = new HashSet(anyCharOf); var sb = new StringBuilder(); var textLength = text.Length; for (var i = 0; i < textLength; i++) { var c = text[i]; if (encodeCharMap.Contains(c)) { sb.Append('%' + ((int)c).ToString("x")); } else { sb.Append(c); } } return sb.ToString(); } #endif public static string HexUnescape(this string text, params char[] anyCharOf) { if (string.IsNullOrEmpty(text)) return null; if (anyCharOf == null || anyCharOf.Length == 0) return text; var sb = new StringBuilder(); var textLength = text.Length; for (var i = 0; i < textLength; i++) { var c = text.Substring(i, 1); if (c == "%") { var hexNo = Convert.ToInt32(text.Substring(i + 1, 2), 16); sb.Append((char)hexNo); i += 2; } else { sb.Append(c); } } return sb.ToString(); } public static string UrlFormat(this string url, params string[] urlComponents) { var encodedUrlComponents = new string[urlComponents.Length]; for (var i = 0; i < urlComponents.Length; i++) { var x = urlComponents[i]; encodedUrlComponents[i] = x.UrlEncode(); } return string.Format(url, encodedUrlComponents); } public static string ToRot13(this string value) { var array = value.ToCharArray(); for (var i = 0; i < array.Length; i++) { var number = (int)array[i]; if (number >= 'a' && number <= 'z') number += (number > 'm') ? -13 : 13; else if (number >= 'A' && number <= 'Z') number += (number > 'M') ? -13 : 13; array[i] = (char)number; } return new string(array); } public static string WithTrailingSlash(this string path) { if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path"); if (path[path.Length - 1] != '/') { return path + "/"; } return path; } public static string AppendUrlPaths(this string uri, params string[] uriComponents) { var sb = new StringBuilder(uri.WithTrailingSlash()); var i = 0; foreach (var uriComponent in uriComponents) { if (i++ > 0) sb.Append('/'); sb.Append(uriComponent.UrlEncode()); } return sb.ToString(); } public static string FromUtf8Bytes(this byte[] bytes) { return bytes == null ? null : Encoding.UTF8.GetString(bytes, 0, bytes.Length); } public static byte[] ToUtf8Bytes(this string value) { return Encoding.UTF8.GetBytes(value); } public static byte[] ToUtf8Bytes(this int intVal) { return FastToUtf8Bytes(intVal.ToString()); } public static byte[] ToUtf8Bytes(this long longVal) { return FastToUtf8Bytes(longVal.ToString()); } public static byte[] ToUtf8Bytes(this double doubleVal) { var doubleStr = doubleVal.ToString(CultureInfo.InvariantCulture.NumberFormat); if (doubleStr.IndexOf('E') != -1 || doubleStr.IndexOf('e') != -1) doubleStr = DoubleConverter.ToExactString(doubleVal); return FastToUtf8Bytes(doubleStr); } /// /// Skip the encoding process for 'safe strings' /// /// /// private static byte[] FastToUtf8Bytes(string strVal) { var bytes = new byte[strVal.Length]; for (var i = 0; i < strVal.Length; i++) bytes[i] = (byte)strVal[i]; return bytes; } public static string[] SplitOnFirst(this string strVal, char needle) { if (strVal == null) return new string[0]; var pos = strVal.IndexOf(needle); return pos == -1 ? new[] { strVal } : new[] { strVal.Substring(0, pos), strVal.Substring(pos + 1) }; } public static string[] SplitOnFirst(this string strVal, string needle) { if (strVal == null) return new string[0]; var pos = strVal.IndexOf(needle); return pos == -1 ? new[] { strVal } : new[] { strVal.Substring(0, pos), strVal.Substring(pos + 1) }; } public static string[] SplitOnLast(this string strVal, char needle) { if (strVal == null) return new string[0]; var pos = strVal.LastIndexOf(needle); return pos == -1 ? new[] { strVal } : new[] { strVal.Substring(0, pos), strVal.Substring(pos + 1) }; } public static string[] SplitOnLast(this string strVal, string needle) { if (strVal == null) return new string[0]; var pos = strVal.LastIndexOf(needle); return pos == -1 ? new[] { strVal } : new[] { strVal.Substring(0, pos), strVal.Substring(pos + 1) }; } public static string WithoutExtension(this string filePath) { if (string.IsNullOrEmpty(filePath)) return null; var extPos = filePath.LastIndexOf('.'); if (extPos == -1) return filePath; var dirPos = filePath.LastIndexOfAny(DirSeps); return extPos > dirPos ? filePath.Substring(0, extPos) : filePath; } private static readonly char DirSep = Path.DirectorySeparatorChar; private static readonly char AltDirSep = Path.DirectorySeparatorChar == '/' ? '\\' : '/'; static readonly char[] DirSeps = new[] { '\\', '/' }; public static string ParentDirectory(this string filePath) { if (string.IsNullOrEmpty(filePath)) return null; var dirSep = filePath.IndexOf(DirSep) != -1 ? DirSep : filePath.IndexOf(AltDirSep) != -1 ? AltDirSep : (char)0; return dirSep == 0 ? null : filePath.TrimEnd(dirSep).SplitOnLast(dirSep)[0]; } public static string ToJsv(this T obj) { return TypeSerializer.SerializeToString(obj); } public static T FromJsv(this string jsv) { return TypeSerializer.DeserializeFromString(jsv); } public static string ToJson(this T obj) { return JsonSerializer.SerializeToString(obj); } public static T FromJson(this string json) { return JsonSerializer.DeserializeFromString(json); } #if !XBOX && !SILVERLIGHT public static string ToXml(this T obj) { return XmlSerializer.SerializeToString(obj); } #endif #if !XBOX && !SILVERLIGHT public static T FromXml(this string json) { return XmlSerializer.DeserializeFromString(json); } #endif public static string FormatWith(this string text, params object[] args) { return string.Format(text, args); } public static string Fmt(this string text, params object[] args) { return string.Format(text, args); } public static bool StartsWithIgnoreCase(this string text, string startsWith) { return text != null && text.StartsWith(startsWith, StringComparison.InvariantCultureIgnoreCase); } public static string ReadAllText(this string filePath) { #if XBOX && !SILVERLIGHT using( var fileStream = new FileStream( filePath, FileMode.Open, FileAccess.Read ) ) { return new StreamReader( fileStream ).ReadToEnd( ) ; } #else return File.ReadAllText(filePath); #endif } public static int IndexOfAny(this string text, params string[] needles) { return IndexOfAny(text, 0, needles); } public static int IndexOfAny(this string text, int startIndex, params string[] needles) { if (text == null) return -1; var firstPos = -1; foreach (var needle in needles) { var pos = text.IndexOf(needle); if (firstPos == -1 || pos < firstPos) firstPos = pos; } return firstPos; } public static string ExtractContents(this string fromText, string startAfter, string endAt) { return ExtractContents(fromText, startAfter, startAfter, endAt); } public static string ExtractContents(this string fromText, string uniqueMarker, string startAfter, string endAt) { if (string.IsNullOrEmpty(uniqueMarker)) throw new ArgumentNullException("uniqueMarker"); if (string.IsNullOrEmpty(startAfter)) throw new ArgumentNullException("startAfter"); if (string.IsNullOrEmpty(endAt)) throw new ArgumentNullException("endAt"); if (string.IsNullOrEmpty(fromText)) return null; var markerPos = fromText.IndexOf(uniqueMarker); if (markerPos == -1) return null; var startPos = fromText.IndexOf(startAfter, markerPos); if (startPos == -1) return null; startPos += startAfter.Length; var endPos = fromText.IndexOf(endAt, startPos); if (endPos == -1) endPos = fromText.Length; return fromText.Substring(startPos, endPos - startPos); } #if XBOX && !SILVERLIGHT static readonly Regex StripHtmlRegEx = new Regex(@"<(.|\n)*?>", RegexOptions.Compiled); #else static readonly Regex StripHtmlRegEx = new Regex(@"<(.|\n)*?>"); #endif public static string StripHtml(this string html) { return string.IsNullOrEmpty(html) ? null : StripHtmlRegEx.Replace(html, ""); } #if XBOX && !SILVERLIGHT static readonly Regex StripBracketsRegEx = new Regex(@"\[(.|\n)*?\]", RegexOptions.Compiled); static readonly Regex StripBracesRegEx = new Regex(@"\((.|\n)*?\)", RegexOptions.Compiled); #else static readonly Regex StripBracketsRegEx = new Regex(@"\[(.|\n)*?\]"); static readonly Regex StripBracesRegEx = new Regex(@"\((.|\n)*?\)"); #endif public static string StripMarkdownMarkup(this string markdown) { if (string.IsNullOrEmpty(markdown)) return null; markdown = StripBracketsRegEx.Replace(markdown, ""); markdown = StripBracesRegEx.Replace(markdown, ""); markdown = markdown .Replace("*", "") .Replace("!", "") .Replace("\r", "") .Replace("\n", "") .Replace("#", ""); return markdown; } private const int LowerCaseOffset = 'a' - 'A'; public static string ToCamelCase(this string value) { if (string.IsNullOrEmpty(value)) return value; var firstChar = value[0]; if (firstChar < 'A' || firstChar > 'Z') return value; return (char)(firstChar + LowerCaseOffset) + value.Substring(1); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ServiceStack.Text.pidb0000644000175000017500000046127612146506553027675 0ustar00meebeymeebey00000000000000System.Collections.Hashtable LoadFactorVersionComparerHashSizeKeysValuesequalityComparer @?   LastValidTaskListTokensVersionFIXME:2;TODO:1;HACK:1;UNDONE:0T Mf AssemblyUtils  dgI/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/AssemblyUtils.cshServiceStack.TextiFileUrij) Utils to load types  kDllExtlExeExtm UriSeperatornFindTypeo Find the type from the name supplied [typeName] or [typeName, assemblyName] /#ptypeName&nq Find type if it exists The type if it exists--DAp-&r assemblyName-7sFindTypeFromLoadedAssembliesEECPpE:t LoadAssemblySS<VuSystem.ReflectionvAssemblyw assemblyPathS/xGetAssemblyBinPathYY=byassemblyuvY4f CsvConfig7gE/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvConfig.cshServiceStack.TexticustomHeadersMap -jSystem.Collections.Generick DictionarylReset226m OmitHeaders"/$()-nCustomHeadersMap , jk o CustomHeaders0/pTfJsConfig  UgD/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsConfig.cshServiceStack.Texti&ConvertObjectTypesIntoStringDictionary j ThreadStatic  kSystemlThreadStaticAttributemIncludeNullValuesjklf!DeserializeSpecializedCollections9hgd/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeSpecializedCollections.cshServiceStack.Text.CommoniCacheFn /jParseStringDelegate -k GetParseFn%1/jlParseStringQueue11=5mSystem.Collections.GenericnQueue`17o ParseIntQueue777;mn `71pGetGenericQueueParseFn='=?KjqParseStringStackMM=QmrStack`M7s ParseIntStackSS7Wmr `S1tGetGenericStackParseFnY'Y?gjuParse%jvTw TSerializerhxITypeSerializerfSpecializedQueueElementsjj)wgd/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeSpecializedCollections.cshServiceStack.Text.CommoniConvertToQueuell;pjSystem.Collections.GenerickQueuehflTm enumerablel0nConvertToStackrr;vjoStackhflmr0lfJsReaderKgK/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsReader.cshServiceStack.Text.Commoni Serializer +hjITypeSerializerk GetParseFn  -IlParseStringDelegatemTn TSerializerhjfJsState gJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsState.cshServiceStack.Text.CommoniWritingKeyCount j ThreadStatickSystemlThreadStaticAttribute mIsWritingValue j  kl]f CsvSerializer  ugI/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvSerializer.cshServiceStack.TextiUTF8EncodingWithoutBom(j System.Textk UTF8Encodingl WriteFnCacheAmSystem.Collections.Genericn DictionaryoWriteObjectDelegate p GetWriteFn'<.o_7qSerializeToCsv00A8rrecordsms IEnumerabletT09tuSerializeToString::5E`t:/tvSerializeToWriterGGFP`tG-wwriterx System.IOy TextWriterG?tzSerializeToStreamRRBY`tR-{streamx|StreamR;tz[[Bc'[/{x|[;}DeserializeFromStreamee:ht{x|e3t}jjGm_j3{x|j@~WriteLateBoundObjectooKtwxyo6`oEwf CsvSerializerww%gI/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvSerializer.cshServiceStack.TextiCacheFny/jWriteObjectDelegatekIgnoreResponseStatusl valueGetter'mSystemnFuncowriteElementFn&j pWriteFn{%{.~jq GetWriteFn&2jr CreateWriteFn&Ejs elementType9tCreateWriteRowFn&Hjs<uCreateCsvWriterFn&\js=v methodNameQwWriteEnumerableTypeHxwritery System.IOz TextWriter5'D{ WriteSelf>xyz+':|WriteEnumerablePropertyLxyz9'H}WriteNonEnumerableTypeKxyz8'G ~ WriteObject  B xyz -` <T f CsvWriter  gE/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvWriter.cshServiceStack.Texti DelimiterChar jPropertyGetters)kSystem.Collections.GenericlListmSystemnFunchfoTpOptimizedWriter/qWriteObjectDelegate   rReset+sConfigureCustomHeaders--[?tcustomHeadersMapku Dictionary-Jv GetSingleRowAATMklwrecordskx IEnumerablehfoA;y recordTypeAIzGetRowsO$OClklklwkxhfoO;{ WriteObjectnnDq|writer} System.IO~ TextWritern-wn<WriteObjectRowssFv|}~s0records?WritexxF|}~x'wkxhfox>WriteRow8|}~*rowhfo4J|}~*kxFN|}~'rowskxklIHeaders  & 3kl ( , - 1ofITracer gC/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ITracer.cshServiceStack.Texti WriteDebugjerrorikformatlSystemmObject2n WriteError oex n j n k lm 2fJsonExtensions$7gF/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonObject.cshServiceStack.TextiJsonToM jTkmap lSystem.Collections.Genericm Dictionary=IjnGet  Jjk lm : FjnLk lm<Ho ArrayObjects"UhpJsonArrayObjectsqjson ;r propertyNameHs ConvertAllm(ltListjujsonArrayObjects hp=v converterwSystemxFunchy JsonObjectjcjz ConvertTo**Y/j{ jsonObject hy*0|converFnwxhyj*Pj} ToDictionary1,1T6lm{ hy1If JsonObject99OgF/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonObject.cshServiceStack.TextiSystem.Collections.Genericj DictionarykParse;;.>hfljson;)m ArrayObjects@@<FhnJsonArrayObjectso propertyName@/pObjectHH0NhfoH#fJsonArrayObjectsQQWgF/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonObject.cshServiceStack.TextiSystem.Collections.GenericjListhk JsonObjectlParseS"S4VhfmjsonS/+fJsonSerializerCgR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonSerializer.Generic.cshServiceStack.TexthiITypeSerializerhfjTkCanCreateFromString-_(lDeserializeFromStringml Parses the specified value. The value.  /$hfj` )nDeserializeFromReader& &4)hfjoreaderp System.IOq TextReader&-rSerializeToString+++6`hfj+%sSerializeToWriter88<B`hfj8#twriterpu TextWriter85jCfJsonTypeSerializer#gS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonTypeSerializer.cshServiceStack.Text.JsoniServiceStack.Text.CommonjITypeSerializerkInstance!ijlWhiteSpaceFlags!mSystemnBooleanoIsSafeJsonCharsmpChar!  "q GetWriteFn$$-'rWriteObjectDelegatesTq))3,r_).tWriteRawStringu Shortcut escape when we're sure value doesn't contain any escaped chars 33>8vwriterw System.IOx TextWriter3)`38yWritePropertyName::AFvwx:,`:;z WriteStringHH;KvwxH&`H5{ WriteBuiltInMM<TvwxM'`M6|WriteObjectStringVVA`vwxV,`V;}WriteExceptionbb>evwxb)`b8~ WriteDateTimeggAjvwxg( oDateTimeg7WriteNullableDateTimellHpvwxl0dateTimel? WriteGuidrr:uvwxr$oValuer3WriteNullableGuidwwB{vwxw,w; WriteBytes}}?vwx}% oByteValue}4 WriteIntegerCvwx' integerValue6 WriteBool=vwx$ boolValue3 WriteFloat?vwx% floatValue4 WriteDoubleAvwx& doubleValue5 WriteDecimalCvwx' decimalValue6 EncodeMapKeyr A JSON key needs to be a string with quotes +`% GetParseFn-ParseStringDelegates3_.ParseRawString-`' ParseString*`$ParseJsonStringDPjson0 >ConvertFromUtf32 Since Silverlight doesn't have char.ConvertFromUtf32() so putting Mono's implemenation inline. WW4butf32 W. EatWhitespacedd@od, d: EatTypeValueqq6t`q% q4EatMapStartCharvv7z`v& v5 EatMapKey||3`|" |1EatMapKeySeperator:`) 8EatItemSeperatorOrMapEndCharD`3 BEatValue2`! 0fJsvDeserializeType( gR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvDeserializeType.cshServiceStack.Text.JsviGetSetPropertyMethod % _ jSetPropertyDelegate_ ?k propertyInfolSystem.Reflectionm PropertyInfo RfCommandProcessorNgW/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Controller/CommandProcessor.cshServiceStack.Text.Controlleri contextMap/jSystem.Collections.Generick Dictionary  0l controllersmSystemnObject$!!(@o commandUri!pConvertValuesToTypesBBXMmnqvaluesjrIListB>stypesjrBRt Controllers -mn"&'+fPathInfoegO/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Controller/PathInfo.cshServiceStack.Text.Controller ! !@$i actionName!j argumentskSystemlString!6 & &a+i&jmSystem.Collections.GenericnList&3ooptionsmp Dictionary&YqGetArgumentValue5 5*8rT 5$rsParset Parses the specified path info. e.g. MusicPage/arg1/0/true?debug&showFlows=3 => PathInfo .ActionName = 'MusicPage' .Arguments = ['arg1','0','true'] .Options = { debug:'True', showFlows:'3' } The path url. DD/dhfupathUriD'vControllerNamew% Class to hold  5"&/3x ActionName1"+/y Arguments!6mn#'04zOptions%-Bmp/3<@{ FirstArgument-.3/2fJsonSerializer$gJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonSerializer.cshServiceStack.TextiUTF8EncodingWithoutBomjG Creates an instance of a Type from a string value (k System.Textl UTF8Encoding mDeserializeFromString9 nT`3noDeserializeFromReader"">%npreaderq System.IOr TextReader"7nm''F,`'5_'Ao..K1pqr.9_.FsSerializeToString335D`n3/ntSerializeToWriterFFFP`nF-uwriterqv TextWriterF?nwSerializeToStreamRRBW`nR-xstreamqyStreamR;nzDeserializeFromStreamYY:_nxqyY3nzaaGg_a3xqya@siiBz`i1_i=t||S`|/_|;uqv|LwO`/_;xqyHfCsvStreamExtensions)!gO/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvStreamExtensions.cshServiceStack.TextiWriteCsvSj outputStream k System.IOlStream.mrecordsnSystem.Collections.Generico IEnumerablepTKpiQqwriter kr TextWriter2mnopIpfDateTimeExtensions(FgN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/DateTimeExtensions.cshServiceStack.Texti UnixEpochj\ A fast, standards-based, serialization-issue free DateTime serailizer.  kUnixEpochDateTime$l TicksPerMs m ToUnixTime8  ndateTime /o FromUnixTime""<%punixTime "3q ToUnixTimeMs'':+ n '1rFromUnixTimeMs--A1s msSince1970 -5t RoundToSecond33?6n 36uToShortestXsdDateTimeString88K;n 8BvFromShortestXsdDateTimeString==P@w xsdDateTime =DxIsEqualToTheSecondBBXEn B7y otherDateTimeBJfEnv'g?/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Env.cshServiceStack.TextiServiceStackVersion  jIsUnix*#$(kIsMono*#$(l IsMonoTouch  " / $ ( ) -mSupportsExpressions""*"7","0"1"5n SupportsEmit$$#$0$%$)$*$.oServerUserAgent&&(&5&*&.&/&3fITypeSerializer"8gS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ITypeSerializer.Generic.cshServiceStack.TextiCanCreateFromStringj Determines whether this serializer can create the specified type from a string. The type. true if this instance [can create from string] the specified type; otherwise, false. _!kDeserializeFromStringll Parses the specified value. The value. "hfmT`""nDeserializeFromReaderol Deserializes from reader. The reader. )hfmpreaderq System.IOr TextReader)&sSerializeToStringtf Serializes to string. The value. 0 `hfm0uSerializeToWriterv{ Serializes to writer. The value. The writer.7`hfm7wwriterqx TextWriter7.mf JsonUtilsgJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonUtils.cshServiceStack.Text.Jsoni EscapeCharj QuoteChar kNull lTrue mFalse n EscapeCharsoSystempCharqLengthFromLargestChar rEscapeCharFlags"osBoolean  t WriteStringBbuwriterv System.IOw TextWriter-`<xHasAnyEscapeCharsy micro optimizations: using flags instead of value.IndexOfAny(EscapeChars) ii6s`i0zIntToHexuu8{intValue u#|hexopu4} IsJsString.`(f JsonWriter"CgS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonWriter.Generic.cshServiceStack.Text.JsoniInstance7jServiceStack.Text.CommonkJsWriterhlJsonTypeSerializerm WriteFnCacheAnSystem.Collections.Generico DictionarypWriteObjectDelegateq GetWriteFn%:6p_5rWriteLateBoundObject88K=swritert System.IOu TextWriter86`8EvGetValueTypeToStringMethod?%?JBp_?Ef JsonWriterII"bgS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonWriter.Generic.cshServiceStack.Text.JsoniCacheFnjl Implement the serializer using a more static approach K/kWriteObjectDelegatelWriteFnM%M.Pk R R\m WriteObject^^Banwritero System.IOp TextWriter^-`^<qT7fJsWriter  hgK/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsWriter.cshServiceStack.Text.Commoni MapStartChar jMapKeySeperatork ItemSeperatorl MapEndCharm MapNullValuenEmptyMapo ListStartCharp ListEndCharq ReturnCharr LineFeedChars QuoteChart QuoteStringuEscapedQuoteStringvItemSeperatorStringwMapKeySeperatorStringxCsvChars!ySystemzChar{ EscapeChars !yz|LengthFromLargestChar" }EscapeCharFlags#"y~Boolean % %+HasAnyEscapeChars micro optimizations: using flags instead of value.IndexOfAny(EscapeChars) 225<`2/WriteItemSeperatorIfRanOnce>>XIwriter System.IO TextWriter>?ranOnce>PShouldUseDefaultToStringMethodKKA\_K<GetTypeSerializer^#^CghITypeSerializer TSerializerBfJsWriterjjgK/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsWriter.cshServiceStack.Text.Commoni Serializerm+hjITypeSerializerk SpecialTypes0lSystem.Collections.Genericm DictionarynWriteObjectDelegate o owoGetValueTypeToStringMethodyyCn_y>p GetWriteFn /nqTrGetSpecialWriteFn:n_5s WriteType9twriteru System.IOv TextWriter$`3w TSerializerhjf JsonReader".gS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonReader.Generic.cshServiceStack.Text.JsoniInstance7jServiceStack.Text.CommonkJsReaderhlJsonTypeSerializerm ParseFnCacheBnSystem.Collections.Generico DictionarypParseFactoryDelegateq GetParseFn%:-rParseStringDelegate_5%f JsonReader00 JgS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonReader.Generic.cshServiceStack.Text.JsoniReadFn2/jParseStringDelegate 4 47k GetParseFn9%91<jlParse>>+I`>%mTPfQueryStringSerializer+QgQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/QueryStringSerializer.cshServiceStack.TextiInstance8jServiceStack.Text.CommonkJsWriterlServiceStack.Text.JsvmJsvTypeSerializern WriteFnCacheAoSystem.Collections.Genericp DictionaryqWriteObjectDelegater GetWriteFn'<:q_7sWriteLateBoundObject<<KAtwriteru System.IOv TextWriter<6`<EwGetValueTypeToStringMethodC'CLFq_CGxSerializeToStringHH5P`yTH/yfQueryStringWriterWW'zgQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/QueryStringSerializer.cshServiceStack.TextiCacheFnjl Implement the serializer using a more static approach Y/kWriteObjectDelegatelWriteFn['[0^k ` `tm WriteObjectvvBynwritero System.IOp TextWriterv-`v<qTf JsvFormatter"^gH/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsvFormatter.cshServiceStack.TextiFormat5SjserializedText&k AppendTabLineUUD]lsbU3mtabCount U;bfDateTimeSerializer(gU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DateTimeSerializer.cshServiceStack.Text.Common iShortDateTimeFormatjDefaultDateTimeFormatk!DefaultDateTimeFormatWithFractionlXsdDateTimeFormatmXsdDateTimeFormat3FnXsdDateTimeFormatSecondsoEscapedWcfJsonPrefixp WcfJsonPrefixq TimeZoneCharsYrSystemsChartParseShortestXsdDateTime  F5u dateTimeStr :vToDateTimeString77;:wdateTime72x ParseDateTime<<;?u</yToXsdDateTimeStringAA>DwA5zParseXsdDateTimeFF>IuF2{ToShortestXsdDateTimeStringKKFVwK=|ParseWcfJsonDate}q WCF Json format: /Date(unixts+0000)/ __>~ wcfJsonDate_2 ToWcfJsonDate8w/ fITypeSerializer$*gR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/ITypeSerializer.cshServiceStack.Text.Commoni GetWriteFnjWriteObjectDelegatekTi j_ 'lWriteRawString mwritern System.IOo TextWriter "` 1pWritePropertyName mno %` 4q WriteBuiltInmno `/rWriteObjectStringmno%`4sWriteExceptionmno"`1t WriteStringmno`.u WriteDateTimemno!v oDateTime0wWriteNullableDateTimemno)xdateTime8y WriteGuidmnozoValue,{WriteNullableGuidmno%z4| WriteBytesmno} oByteValue-~ WriteIntegermno  integerValue/ WriteBoolmno boolValue, WriteFloatmno floatValue- WriteDoublemno doubleValue. WriteDecimalmno decimalValue/ GetParseFnParseStringDelegatek _ 'ParseRawString" `" ParseString# `# EatTypeValue$ `$ $-EatMapStartChar%`% %. EatMapKey& `& &*EatMapKeySeperator'`'" '1EatValue( `( ()EatItemSeperatorOrMapEndChar)`), );f JsvReader.gQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvReader.Generic.cshServiceStack.Text.JsviInstance8jServiceStack.Text.CommonkJsReaderhlJsvTypeSerializerm ParseFnCacheBnSystem.Collections.Generico DictionarypParseFactoryDelegateq GetParseFn%:-rParseStringDelegate_5!f JsvReader00JgQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvReader.Generic.cshServiceStack.Text.JsviReadFn2/jParseStringDelegate 4 47k GetParseFn9%91<jlParse>>+I`>%mTcf JsvSerializerFgU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvSerializer.Generic.cshServiceStack.Text.JsviDeserializerCache2jSystem.Collections.Generick DictionarylParseStringDelegatemDeserializeFromString :,hfnT`)_5m. ./3hfn`.)oSerializeToWriter55<8`hfn5#pwriterq System.IOr TextWriter55sSerializeToString::+E`hfn:%nf JsvWriter!CgQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cshServiceStack.Text.JsviInstance6jServiceStack.Text.CommonkJsWriterhlJsvTypeSerializerm WriteFnCacheAnSystem.Collections.Generico DictionarypWriteObjectDelegateq GetWriteFn%:6p_5rWriteLateBoundObject88K=swritert System.IOu TextWriter86`8EvGetValueTypeToStringMethod?%?JBp_?Ef JsvWriterII!cgQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cshServiceStack.Text.JsviCacheFnjl Implement the serializer using a more static approach K/kWriteObjectDelegatelWriteFnM%M.Pk R R\m WriteObject^^Banwritero System.IOp TextWriter^-`^<qTvfDeserializeArrayWithElements4+gS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeArray.cshServiceStack.Text.CommoniParseArrayOfElementsDelegategh`?jparseFnkParseStringDelegateZlParseDelegateCacheJmSystem.Collections.Genericn Dictionaryhfio GetParseFn;P*pSystemqFunck_Kr TSerializerhsITypeSerializerfDeserializeArrayWithElements--4XgS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeArray.cshServiceStack.Text.Commoni Serializer0+hjITypeSerializerkParseGenericArray22XWhflT`2.melementParseFnnParseStringDelegate2Ilo TSerializerhj8fDeserializeArrayZZ(tgS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeArray.cshServiceStack.Text.CommoniParseDelegateCache]AjSystem.Collections.Generick DictionarylParseStringDelegatem GetParseFn`%`:sl_`5n TSerializerhoITypeSerializerfDeserializeArrayvv(gS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeArray.cshServiceStack.Text.Commoni Serializery+hjITypeSerializerkCacheFn{/lParseStringDelegate } }m GetParseFn%1lnParseStringArray8oSystempString`2qParseByteArray4orByte`.sParse%ltTu TSerializerhjQfDeserializeBuiltin(JgU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeBuiltin.cshServiceStack.Text.Commoni CachedParseFn/jParseStringDelegate  k GetParseFn&2IjlParse%j!mTfDeserializeCollection-pgX/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeCollection.cshServiceStack.Text.CommoniParseCollectionDelegate^gh^`^:j createType^FkparseFnlParseStringDelegate^fm Serializer+hnITypeSerializeroParseDelegateCache[EpSystem.Collections.Genericq DictionaryhfirGetParseMethod%>1l_9sParseStringCollection3%3Y7pt ICollection`3Bj3NuParseIntCollection9"9S=pt `9<j9HvParseCollection? ?nEptwT`?:j?Fkl?fwxCreateAndPopulateG!G[YptwyofCollectionTypeG;z withItemswGQw{ParseCollectionType``yo``3j`?| elementType`Pkl`q} TSerializerhnDfDeserializeDictionary-gX/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeDictionary.cshServiceStack.Text.CommoniParseDictionaryDelegategh`:j createMapTypeFk keyParseFnlParseStringDelegatem valueParseFnl8n Serializer+hoITypeSerializerpKeyIndex q ValueIndex rParseDelegateCacheGsSystem.Collections.Generict DictionaryhfiuGetParseMethod%>6l_9vParseStringDictionary8,8OPst`8IwParseDictionaryR+TEsx IDictionaryyTKeyzTValue`S jS{ parseKeyFnlT| parseValueFnlT8yz}VerifyAndGetStartIndexN `4j@~ParseDictionaryTypeE`3j?argTypesSystemTypeUklml8 GetTypesKey9types3 TSerializerhofDeserializeListWithElements3`g^/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeListWithElements.cshServiceStack.Text.CommoniParseListDelegategh`4jcreateListType@kparseFnlParseStringDelegatedm Serializer,hnITypeSerializeroParseDelegateCache?pSystem.Collections.Genericq DictionaryhfirGetListTypeParseFnA 1sSystemtFunclj u elementTypekl v StripList331=`3+wParseStringList??;QpxList`?5y ParseIntListSS5_px `S/z TSerializerhnfDeserializeListWithElementsbb3g^/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeListWithElements.cshServiceStack.Text.Commoni Serializere+hjITypeSerializerkParseGenericListggjlSystem.Collections.GenericmIListhfnT`g2ocreateListTypeg>pparseFnqParseStringDelegategbnr TSerializerhjfDeserializeList'g^/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeListWithElements.cshServiceStack.Text.CommoniCacheFn/jParseStringDelegate k GetParseFn%1jlParse%jmTn TSerializerhoITypeSerializerfDeserializeEnumerable-g^/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeListWithElements.cshServiceStack.Text.CommoniCacheFn/jParseStringDelegate !k GetParseFn%1jlParse%jmTn TSerializerhoITypeSerializerf ParseUtils":gM/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/ParseUtils.cshServiceStack.Text.Commoni NullValueType0_+j ParseObject1`+k ParseEnum:"_'`4lGetSpecialParseMethod$%$E4mParseStringDelegate_$@n ParseType66=9oassemblyQualifiedName6'f ParseDelegategT/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/StaticParseMethod.cs`0pfStaticParseMethod'>gT/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/StaticParseMethod.cshServiceStack.Text.Commoni ParseMethodjCacheFn/kParseStringDelegate  "l GetParseFn$%$1<kmParse%knTfDeserializeTypeUtils#2gW/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeTypeUtils.cshServiceStack.Text.CommoniGetParseMethod%>jParseStringDelegate_9kGetTypeStringConstructorly Get the type(string) constructor if exists The type. $!$D0mSystem.ReflectionnConstructorInfo_$?{fDeserializeType'gR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeType.cshServiceStack.Text.Commoni Serializer+hjITypeSerializerkGetParseMethod%>4lParseStringDelegate_9m StringToType69@e_6+nstrType68octorFnpEmptyCtorDelegate7q setterMaprSystem.Collections.Generics IDictionarytSetPropertyDelegate8/uparseStringFnMaprsl9/vGetSetPropertyMethodg%g_t_g?w propertyInfoxSystem.Reflectiony PropertyInfogRz TSerializerhjfWriteListDelegategN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cshwriteri System.IOj TextWriter6koListEl toStringFnmWriteObjectDelegate` fWriteGenericListDelegategN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cshwriteri System.IOj TextWriter@klistlSystem.Collections.GenericmIListfnTQo toStringFnpWriteObjectDelegatekn3f WriteDelegategN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cshwriteri System.IOj TextWriter2`A fParseFactoryDelegate(gN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cs(hParseStringDelegate9fWriteObjectDelegategN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cshwriteri System.IOj TextWriter8'GfSetPropertyDelegategN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cshinstance2i propertyValueCfParseStringDelegategN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.csh stringValue4fConvertObjectDelegate!gN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cs!h fromObject!6fListExtensions$=gJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ListExtensions.cshServiceStack.TextiJoin;jvalues kSystem.Collections.Genericl IEnumerablemT4miM&j klm4n seperatorCmo IsNullOrEmpty((9+plist kqListm(4mr SafeWhere.$.h1klsTFromp kqs.Ft predicateuSystemvFuncs.^sw NullableCount3386 p kqm33mxAddIfNotExists88B<p kqm85yitemm8=mf MapExtensions#&gI/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/MapExtensions.cshServiceStack.TextiJoin@jvalues kSystem.Collections.Genericl DictionarymKnV9mnik%j klmn9o itemSeperatorHp keySeperator^mnBfStaticAccessors%JgV/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Reflection/StaticAccessors.cshServiceStack.Text.ReflectioniGetValueGetter&_$jSystemkFuncl propertyInfo mSystem.Reflectionn PropertyInfoG_Zi&!&R2jkoTl mn&EopGetValueSetter5#5TGjqActionol mn5GoVfJsvTypeSerializer"FgQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cshServiceStack.Text.JsviServiceStack.Text.CommonjITypeSerializerkInstance!ijl GetWriteFn-mWriteObjectDelegatenTl3!m_.oWriteRawString##>&pwriterq System.IOr TextWriter#)`#8sWritePropertyName((A+pqr(,`(;t WriteBuiltIn--<0pqr-'`-6uWriteObjectString22A8pqr2,`2;vWriteException::>=pqr:)`:8w WriteString??;Bpqr?&`?5x WriteDateTimeDDAGpqrD(y oDateTimeD7zWriteNullableDateTimeIIHMpqrI0{dateTimeI?| WriteGuidOO:RpqrO$}oValueO3~WriteNullableGuidTTBXpqrT,}T; WriteBytesZZ?^pqrZ% oByteValueZ4 WriteInteger``Cdpqr`' integerValue`6 WriteBoolff=jpqrf$ boolValuef3 WriteFloatll?ppqrl% floatValuel4 WriteDoublerrAvpqrr& doubleValuer5 WriteDecimalxxC|pqrx' decimalValuex6 EncodeMapKey+`% GetParseFn-ParseStringDelegaten3_.ParseRawString-`' ParseString*`$ EatTypeValue6`% 4EatMapStartChar7`& 5 EatMapKey3`" 1EatMapKeySeperator:`) 8EatItemSeperatorOrMapEndCharD`3 BEatValue2E`! 0fWriteMapDelegategR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteDictionary.cshwriteri System.IOj TextWriterkoMap l writeKeyFnmWriteObjectDelegaten writeValueFnmHfWriteDictionary'|gR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteDictionary.cshServiceStack.Text.CommoniMapKey  AghjKeyType"k ValueType# % %/)lkeyType%m valueType%%++$0notherhfi+22+8'2'o GetHashCode::%@ p Serializer+hqITypeSerializerrCacheFnsDsSystem.Collections.Generict DictionaryhfiuWriteMapDelegatevGetWriteGenericDictionaryGG;XwSystemxActiony System.IOz TextWriter{WriteObjectDelegate{lG#mG1|WriteIDictionaryZZF{}writeryzZ2~oMapZA TSerializerhqfToStringDictionaryMethods~~1gR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteDictionary.cshServiceStack.Text.Commoni Serializer+hjITypeSerializerkWriteIDictionary%lwriterm System.IOn TextWriterooMap p writeKeyFnqWriteObjectDelegater writeValueFnqsWriteGenericIDictionary%lmntmapuSystem.Collections.Genericv IDictionaryhfwTKeyhfxTValuepqrqwxy TSerializerhjfWriteListsOfElements,gM/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cshServiceStack.Text.Commoni Serializer+hjITypeSerializerk ListCacheFnslSystem.Collections.Genericm DictionarynWriteObjectDelegateo IListCacheFns3lmnpCacheFnsKlmnqEnumerableCacheFnsdlmnrListValueTypeCacheFns}lmnsIListValueTypeCacheFnslmntGetListWriteFn%E/nu elementType9vGetIListWriteFn5%5FHnu5:wGetGenericWriteArrayM%MKanuM?xGetGenericWriteEnumerablef%fPznufDyGetWriteListValueType%Lnu@zGetWriteIListValueType%MnuA{WriteIEnumerableR|writer} System.IO~ TextWriter2oValueCollectionA TSerializerhj fWriteListsOfElements,rgM/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cshServiceStack.Text.CommoniElementWriteFn/jWriteObjectDelegate k WriteList@lwriterm System.IOn TextWriter+ooList:pWriteGenericListGlmn2qlistrSystem.Collections.GenericsListhftTBuWriteListValueTypeHlmn4qCvWriteGenericListValueTypePlmn;qrshftKw WriteIListAlmn,o;xWriteGenericIListIlmn3qryIListhftDzWriteIListValueTypeIlmn5qD{WriteGenericIListValueTypeR*lmn<qryhftM| WriteArray,,G0lmn,,} oArrayValue,;~WriteGenericArrayValueType22R@lmn2<oArray2KWriteGenericArrayBBEOlmnB3 hftB?WriteEnumerableQQLUlmnQ1 oEnumerableQ@WriteGenericEnumerableWWZclmnW8 enumerabler IEnumerablehftWOWriteGenericEnumerableValueTypeeecqlmneArhfteXt TSerializerhITypeSerializerf WriteListstt"gM/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cshServiceStack.Text.CommoniWriteListStringvvayj serializerhkITypeSerializerv6lwriterm System.IOn TextWritervMolistv\i{{gjhk{6lmn{MopSystem.Collections.GenericqList{brWriteIListStringbjhk7lmnNo]rijhk7lmnNopsIListdt WriteBytesajhk1lmnHu byteValueWvWriteStringArraycjhk7lmnNwoList]f WriteLists"gM/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cshServiceStack.Text.CommoniCacheFn/jWriteObjectDelegatek Serializer+hlITypeSerializer  m GetWriteFn%1jnWrite%joTp TSerializerhlfStreamExtensions&gL/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/StreamExtensions.cshServiceStack.TextiDefaultBufferSizej @jonskeet: Collection of utility methods which operate on streams. r285, February 26th 2009: http://www.yoda.arachsys.com/csharp/miscutil/ + kWriteTo  ElinStream m System.IOnStream *o outStreammn ;p ReadLines%H%qSystem.Collections.Genericr IEnumerablesreader mt StreamReaderAu ReadFullyv_ Reads the given stream up to the end, returning the data as a byte array. 1144wSystemxByteyinput mn1.uz| Reads the given stream up to the end, returning the data as a byte array, using the given buffer size. ::DAwxy mn:.{ bufferSize :9u| Reads the given stream up to the end, returning the data as a byte array, using the given buffer for transferring data. Note that the current contents of the buffer is ignored, so the buffer needn't be cleared beforehand. IICdwxy mnI.}bufferwxI<~CopyToG Copies all the data from one stream into another. ii>ly mni)outputmni7~i Copies all the data from one stream into another, using a buffer of the given size. rrNyy mnr)mnr7{ rC~ Copies all the data from one stream into another, using the given buffer for transferring data. Note that the current contents of the buffer is ignored, so the buffer needn't be cleared beforehand. My mn)mn7}wxF ReadExactly Reads exactly the given number of bytes from the specified stream. If the end of the stream is reached before the specified amount of data is read, an exception is thrown. Gwxy mn0 bytesToRead ;A Reads into a buffer, filling it completely. Ewxy mn0}wx> Reads exactly the given number of bytes from the specified stream, into the given buffer, starting at position 0 of the array. Vwxy mn0}wx> Jfwxy mn0}wx> startIndex J ZReadExactlyFastK Same as ReadExactly, but without the argument checks. qwx fromStreammn0 intoBufferwxC startAtIndex S efStringExtensions&gL/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/StringExtensions.cshServiceStack.TextiDirSepg j AltDirSeph kDirSepsilSystemmCharnStripHtmlRegExoSystem.Text.RegularExpressionspRegexqStripBracketsRegExoprStripBracesRegExop+sTo+tT` %ts;"t` %u defaultValuet.tvToOrDefaultValue$$9't` $3ts))8,` )'_)3w BaseConvertx Converts from base: 0 - 62 The source. From. To. 66I^ysource 60zfrom 6<{to 6F| EncodeXml``4c` `.} EncodeJsonee5l` e/~ EncodeJsvnn4q` n. UrlEncodess3W s. UrlDecode3W . HexEscapeLW . anyCharOflmB HexUnescapeNW 0lmD UrlFormatQurl . urlComponentslStringCToRot132` ,WithTrailingSlash; ) 6 FromUtf8Bytes  8bytes lByte 2 ToUtf8Bytes6l` 04lintVal -6llongVal .  :(l doubleVal  0FastToUtf8Bytesu Skip the encoding process for 'safe strings' //76lstrVal/0 SplitOnFirst88G?l 83needle8@AAIHl A3AB SplitOnLastJJFQl J2J?SSHZl S2SAWithoutExtension\\>efilePath \5ParentDirectorykk=t k4ToJsvvv,y' tv(tFromJsv{{.~tjsv {*tToJson-' t)tFromJson0tjson +tToXml,' t(tFromXml/t *t FormatWithJW /lObjectEFmtCW (l>StartsWithIgnoreCaseOW 7 startsWithD ReadAllText9 0 IndexOfAnyJ W ,needleslBZ W , startIndex 6lRExtractContents^fromText 4 startAfterEendAtXs 4 uniqueMarkerEZm StripHtml3html .StripMarkdownMarkupAmarkdown 8fAssemblyTypeDefinition'gZ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Support/AssemblyTypeDefinition.cshServiceStack.Common.SupportiTypeDefinitionSeperatorj TypeNameIndex kAssemblyNameIndex   7ltypeDefinition (mTypeName' !%n AssemblyName+ $%)fDoubleConvertergS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Support/DoubleConverter.cshServiceStack.Text.SupportiArbitraryDecimalc cghjdigitsk Construct a new decimal expansion with the mantissa Private class used for manipulating Digits in the decimal expansion, one byte per digitf lSystemmByten decimalPointoD How many digits are *after* the decimal point j pt Constructs an arbitrary decimal expansion from the given long. The long must not be negative.  p p%wb p#q MultiplyByrh Multiplies the current expansion by the given amount, which should only be 2 or 5. }}(samount }!tShiftu Shifts the decimal point; a negative value makes the decimal expansion bigger (as fewer digits come after the decimal place) and a positive value makes the decimal expansion smaller. #s v NormalizewI Removes leading/trailing zeroes from the expansion. ^xS Converts the value to a proper decimal string representation. %y ToExactStringz A class to allow the conversion of doubles to string representations of their exact decimal values. The implementation aims for readability over efficiency. Courtesy of @JonSkeet http://www.yoda.arachsys.com/csharp/DoubleConverter.cs Converts the given double to a string representation of its exact decimal value. The double to convert. A string representation of the double's exact decimal value./`{d-fTypePair2gL/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Support/TypePair.cshServiceStack.Text.Support  ,iSystemjTypekarg2ij'%!lotherhf##*)'#&m GetHashCode++$1 nArgs1$ij"oArg2#ij!%fTracer2gB/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Tracer.cshServiceStack.Texti NullTracer  ghhjITracerk WriteDebug  ( ,lerror "k  ? Cmformat "nSystemoObject :p WriteError(,qex%p(,l"p?Cm"no:r ConsoleTracer1ghhjk(l"k?!m"no:p##(&q#%p(((+l("p--?0m-"no-:sInstancehjhfTranslateListWithElements/bgU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TranslateListWithElements.cshServiceStack.TextiTranslateICollectionCacheHjSystem.Collections.Generick DictionarylSystemmFuncn$TranslateConvertibleICollectionCache.VjkhoConvertibleTypeKeylmp"TranslateToGenericICollectionCachep,qfromBrtoInstanceOfTypeMs elementTypedt-TranslateToConvertibleGenericICollectionCache12=Iq2 r2ufromElementType2-v TryTranslateToGenericICollectionKKv`wfromPropertyTypeK>xtoPropertyTypeKUy fromValueKlyfConvertibleTypeKeydd!gU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TranslateListWithElements.cshServiceStack.Text i ik m mHqitoInstanceTypem"jfromElemenetTypem7ss/xkotherhfs)zz*'z&l GetHashCode$ mToInstanceTypefff+f f$f%f)nFromElemenetTypegg g-g"g&g'g+fTranslateListWithElements(gU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TranslateListWithElements.cshServiceStack.TextiCreateInstance=jtoInstanceOfType,kTranslateToIListNlSystem.CollectionsmIListnfromListlm.j=o&LateBoundTranslateToGenericICollection+n jpTranslateToGenericICollection 3qSystem.Collections.Genericr ICollectionhfsTnqrhfsj"sf$TranslateListWithConvertibleElements3gU/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TranslateListWithElements.cshServiceStack.Texti ConvertFn,jSystemkFunchflTFromhfmTTo 0n&LateBoundTranslateToGenericICollection+ofromList ptoInstanceOfTypeqTranslateToGenericICollection"7rSystem.Collections.Generics ICollectionhfmorshflp&t GetConvertFn#1jkhflhfmlmnf TypeConfig gF/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TypeConfig.cshServiceStack.Texti Properties jSystem.Reflectionk PropertyInfo  lT fTypeSerializer$gJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TypeSerializer.cshServiceStack.TextiUTF8EncodingWithoutBomjG Creates an instance of a Type from a string value (k System.Textl UTF8EncodingmDoubleQuoteStringnCanCreateFromStringo Determines whether the specified type is convertible from string. The type. true if the specified type is convertible from string; otherwise, false. &&4)_&/pDeserializeFromStringql Parses the specified value. The value. 0094rT`03rsDeserializeFromReader66>9rtreaderu System.IOv TextReader67rpw Parses the specified type. The type. The value. AAFF`A5_AAsHHKKtuvH9_HFxSerializeToStringMM5X`rM/rySerializeToWriterZZFd`rZ-zwriteru{ TextWriterZ?r|Cloneff$kr`rfr}SerializeToStreammmBr`rm-~streamuStreamm;rDeserializeFromStreamtt:zr~ut3r||G_|3~u|@ToStringDictionary Useful extension method to get the Dictionary[string,string] representation of any POCO type. ,MSystem.Collections.Generic Dictionary' rIrDump Recursively prints the contents of any POCO object in a human-friendly, readable format 0instance r'rSerializeAndFormat> r5rf WriteType!gL/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteType.cshServiceStack.Text.CommoniTypePropertyWriterBII%Vghj PropertyNameKkGetterFnL&lSystemmFunchfnToWriteFnM*pWriteObjectDelegate O P;Uq propertyNameO%rgetterFnlmhfnPswriteFnpP3t Serializer+huITypeSerializervCacheFn/pwPropertyWriters(hfi   x GetWriteFn'&'2*pyInit,,GzWriteEmptyTypeXXE[{writer| System.IO} TextWriterX0`X?~WriteProperties]]F|{|}]1`]@WriteQueryString~~G{|}~2`~AWrite"%#%p$$n TSerializerhufEmptyCtorDelegategP/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ReflectionExtensions.csEfReflectionExtensions*mgP/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ReflectionExtensions.cshServiceStack.TextiDefaultValueTypes4jSystem.Collections.Generick DictionarylConstructorMethods7jkmEmptyCtorDelegaten DataContractTo DataMemberUpGetDefaultValue2-_-q IsInstanceOf//G9_ /-rthisOrBaseType/8s IsGenericType;;3E_ ;.tGetGenericTypeGG4Q_ G/uIsOrHasGenericInterfaceTypeOfSS_V_ S>vgenericTypeDefinitionSIw"GetTypeWithGenericTypeDefinitionOfXXdi_ XCvXNxGetTypeWithInterfaceOfkkPv_ k7y interfaceTypekBz HasInterfacexxF_ x-yx8{AllHaveInterfacesOfType6|assignableFromType }types~SystemType0 IsNumericType3_ . IsIntegerType3_ .IsRealNumberType6_ 1GetTypeWithGenericInterfaceOf^_ >genericInterfaceTypeIHasAnyTypeDefinitionsOfe genericType 8theseGenericTypes~SBGetGenericArgumentsIfBothHaveSameGenericDefinitionTypeAndArguments9~| typeA'typeB3IGetGenericArgumentsIfBothHaveConvertibleGenericDefinitionTypeAndArguments9ServiceStack.Text.SupportTypePair| '3AreAllStringOrValueTypesC}~=GetConstructorMethod#B m_=GetConstructorMethodToCache # I%m_ DCreateInstance''1+_',GetPublicProperties- -CRSystem.Reflection PropertyInfo_ ->GetSerializablePropertiesW WIf_ WDIsDtohh+k_ h&rfTextExtensions$EgJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TextExtensions.cshServiceStack.Texti ToCsvField4 W /j FromCsvField""6*W "1k FromCsvFields,,K4lSystem.Collections.GenericmListntexts lo IEnumerable,Ek66>?pSystemqStringnpq68rSerializeToStringAA:D` sTA4s+fTypeSerializerCgR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TypeSerializer.Generic.cshServiceStack.TexthiITypeSerializerhfjTkCanCreateFromString-_(lDeserializeFromStringml Parses the specified value. The value.  /$hfj` )nDeserializeFromReader& &4)hfjoreaderp System.IOq TextReader&-rSerializeToString+++6`hfj+%sSerializeToWriter88<B`hfj8#twriterpu TextWriter85jf XmlSerializer  gI/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/XmlSerializer.cshServiceStack.Textiquotas.j System.XmlkXmlDictionaryReaderQuotaslInstancehf   9ijk2m Deserialize]+nxml,_6ijkVoDeserializeFromString--D0n-5_-?o2276pTn23pqDeserializeFromReader88>;prreaders System.IOt TextReader87puDeserializeFromStream==:BpvstreamswStream=3puDDGH_D3vswD@xSerializeToStringJJ4ayfrompJ/pzSerializeToWriterccFq`pc-{writers| TextWriterc?p}CompressToStreamssL|y~TXmlDtos8vswsE~SerializeToStream~~B'~/vsw~;Compress7SystemBytey~2~ fS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Properties/AssemblyInfo.csg AssemblyTitle  hSystem.ReflectioniAssemblyTitleAttributejServiceStack.TextfkAssemblyDescription hlAssemblyDescriptionAttributefmAssemblyConfiguration hnAssemblyConfigurationAttributefoAssemblyCompany hpAssemblyCompanyAttributeq MicrosoftfrAssemblyProduct hsAssemblyProductAttributejftAssemblyCopyright huAssemblyCopyrightAttributevCopyright © Liquidbit 2011fwAssemblyTrademark  hxAssemblyTrademarkAttributefyAssemblyCulture  hzAssemblyCultureAttributef{ ComVisible  |Falsef}Guid  ~System.Runtime.InteropServices GuidAttribute$a352d4d3-df2a-4c78-b646-67181a6333a6fAssemblyVersion# # hAssemblyVersionAttribute2.2.6.*     MonoDevelop.CoreSystem.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.ReferenceEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]_items_size_version)MonoDevelop.Projects.Dom.ReferenceEntry[] System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]VersionComparerHashSize KeyValuePairs1System.Collections.Generic.InternalStringComparerSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]][] m System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]VersionComparerHashSize KeyValuePairs1System.Collections.Generic.InternalStringComparerSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]][]A m System.Collections.Hashtable LoadFactorVersionComparerHashSizeKeysValuesequalityComparer @?  'MonoDevelop.Projects.Dom.ReferenceEntry       1System.Collections.Generic.InternalStringComparer ^System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]keyvalue1MonoDevelop.Projects.Dom.Serialization.ClassEntryServiceStack.Text.AssemblyUtils ServiceStack.Text.CsvConfig`1 ServiceStack.Text.JsConfig ?"ServiceStack.Text.JsonSerializer`1 @AB)ServiceStack.Text.Json.JsonTypeSerializer CDE(ServiceStack.Text.Jsv.JsvDeserializeType FGH-ServiceStack.Text.Controller.CommandProcessor IJK%ServiceStack.Text.Controller.PathInfo LMN ServiceStack.Text.JsonSerializer OPQ%ServiceStack.Text.CsvStreamExtensions RST$ServiceStack.Text.DateTimeExtensions UVWServiceStack.Text.Env XYZ#ServiceStack.Text.ITypeSerializer`1 [\] ServiceStack.Text.Json.JsonUtils ^_`!ServiceStack.Text.Json.JsonWriter abc#ServiceStack.Text.Json.JsonWriter`1 def!ServiceStack.Text.Common.JsWriter ghi#ServiceStack.Text.Common.JsWriter`1 jkl!ServiceStack.Text.Json.JsonReader mno#ServiceStack.Text.Json.JsonReader`1 pqr'ServiceStack.Text.QueryStringSerializer stu%ServiceStack.Text.QueryStringWriter`1 vwxServiceStack.Text.JsvFormatter yz{+ServiceStack.Text.Common.DateTimeSerializer |}~(ServiceStack.Text.Common.ITypeSerializer ServiceStack.Text.Jsv.JsvReader !ServiceStack.Text.Jsv.JsvReader`1 %ServiceStack.Text.Jsv.JsvSerializer`1 ServiceStack.Text.Jsv.JsvWriter !ServiceStack.Text.Jsv.JsvWriter`1 7ServiceStack.Text.Common.DeserializeArrayWithElements`1 7ServiceStack.Text.Common.DeserializeArrayWithElements`2 +ServiceStack.Text.Common.DeserializeArray`1 +ServiceStack.Text.Common.DeserializeArray`2 -ServiceStack.Text.Common.DeserializeBuiltin`1 0ServiceStack.Text.Common.DeserializeCollection`1 0ServiceStack.Text.Common.DeserializeDictionary`1 6ServiceStack.Text.Common.DeserializeListWithElements`1 6ServiceStack.Text.Common.DeserializeListWithElements`2 *ServiceStack.Text.Common.DeserializeList`2 0ServiceStack.Text.Common.DeserializeEnumerable`2 #ServiceStack.Text.Common.ParseUtils  ParseDelegate ,ServiceStack.Text.Common.StaticParseMethod`1 -ServiceStack.Text.Common.DeserializeTypeUtils *ServiceStack.Text.Common.DeserializeType`1 WriteListDelegate WriteGenericListDelegate`1  WriteDelegate ParseFactoryDelegate WriteObjectDelegate SetPropertyDelegate ParseStringDelegate ConvertObjectDelegate  ServiceStack.Text.ListExtensions ServiceStack.Text.MapExtensions ,ServiceStack.Text.Reflection.StaticAccessors 'ServiceStack.Text.Jsv.JsvTypeSerializer WriteMapDelegate *ServiceStack.Text.Common.WriteDictionary`1 4ServiceStack.Text.Common.ToStringDictionaryMethods`3 /ServiceStack.Text.Common.WriteListsOfElements`1 /ServiceStack.Text.Common.WriteListsOfElements`2 #ServiceStack.Text.Common.WriteLists %ServiceStack.Text.Common.WriteLists`2 "ServiceStack.Text.StreamExtensions "ServiceStack.Text.StringExtensions 2ServiceStack.Common.Support.AssemblyTypeDefinition )ServiceStack.Text.Support.DoubleConverter "ServiceStack.Text.Support.TypePair ServiceStack.Text.Tracer   +ServiceStack.Text.TranslateListWithElements  $ServiceStack.Text.ConvertibleTypeKey -ServiceStack.Text.TranslateListWithElements`1 8ServiceStack.Text.TranslateListWithConvertibleElements`2 ServiceStack.Text.TypeConfig`1  ServiceStack.Text.TypeSerializer $ServiceStack.Text.Common.WriteType`2  EmptyCtorDelegate !"#&ServiceStack.Text.ReflectionExtensions $%& ServiceStack.Text.TextExtensions '()"ServiceStack.Text.TypeSerializer`1 *+,ServiceStack.Text.XmlSerializer - ASystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]].System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]keyvalue0MonoDevelop.Projects.Dom.Serialization.FileEntry/I/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/AssemblyUtils.cs 01.2E/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvConfig.cs 34.5D/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsConfig.cs 67.8d/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeSpecializedCollections.cs 9:.;K/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsReader.cs <=.>J/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsState.cs ?@.AI/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvSerializer.cs BC.DE/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvWriter.cs EF.GC/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ITracer.cs HI.JF/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonObject.cs KL.MR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonSerializer.Generic.cs NO.PS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonTypeSerializer.cs QR.SR/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvDeserializeType.cs TU.VW/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Controller/CommandProcessor.cs WX.YO/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Controller/PathInfo.cs Z[.\J/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsonSerializer.cs ]^._O/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/CsvStreamExtensions.cs `a.bN/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/DateTimeExtensions.cs cd.e?/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Env.cs fg.hS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ITypeSerializer.Generic.cs ij.kJ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonUtils.cs lm.nS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonWriter.Generic.cs op.qK/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsWriter.cs rs.tS/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Json/JsonReader.Generic.cs uv.wQ/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/QueryStringSerializer.cs xy.zH/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/JsvFormatter.cs {|.}U/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DateTimeSerializer.cs ~.R/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/ITypeSerializer.cs .Q/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs .U/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvSerializer.Generic.cs .Q/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs .S/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeArray.cs .U/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeBuiltin.cs .X/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeCollection.cs .X/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeDictionary.cs .^/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeListWithElements.cs .M/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/ParseUtils.cs .T/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/StaticParseMethod.cs .W/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeTypeUtils.cs .R/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/DeserializeType.cs .N/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/JsDelegates.cs .J/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ListExtensions.cs .I/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/MapExtensions.cs .V/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Reflection/StaticAccessors.cs .Q/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs .S/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Properties/AssemblyInfo.cs .R/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteDictionary.cs .M/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cs .L/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/StreamExtensions.cs .L/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/StringExtensions.cs .Z/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Support/AssemblyTypeDefinition.cs .S/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Support/DoubleConverter.cs .L/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Support/TypePair.cs .B/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Tracer.cs .U/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TranslateListWithElements.cs .F/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TypeConfig.cs .J/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TypeSerializer.cs .L/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Common/WriteType.cs .P/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/ReflectionExtensions.cs .J/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TextExtensions.cs .R/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/TypeSerializer.Generic.cs .I/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/XmlSerializer.cs .Q/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Microsoft.Net.Client.3.5 .X/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Microsoft.Net.Framework.3.5.SP1 .X/Users/mythz/src/ServiceStack.Text/src/ServiceStack.Text/Microsoft.Windows.Installer.3.1  'System.Collections.Generic.Dictionary`2ServiceStack.Text.ITracer!System.Collections.Generic.List`1     'MonoDevelop.Projects.Dom.ReferenceEntry databaseUri_Assembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/System.dll dAssembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/System.Core.dll uAssembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/System.Runtime.Serialization.dll hAssembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/System.Xml.Linq.dll dAssembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/System.Data.dll cAssembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/System.Xml.dll aAssembly:Mono 2.10.5:/Library/Frameworks/Mono.framework/Versions/2.10.5/lib/mono/2.0/mscorlib.dll1MonoDevelop.Projects.Dom.Serialization.ClassEntry positionnspacenametypeParameterCount subclassesflagsctype modifiers typeModifier System.Collections.ArrayList3MonoDevelop.Projects.Dom.Serialization.ContentFlags"MonoDevelop.Projects.Dom.ClassType"MonoDevelop.Projects.Dom.Modifiers%MonoDevelop.Projects.Dom.TypeModifier ServiceStack.Text AssemblyUtils 3MonoDevelop.Projects.Dom.Serialization.ContentFlagsvalue__"MonoDevelop.Projects.Dom.ClassTypevalue__"MonoDevelop.Projects.Dom.Modifiersvalue__%MonoDevelop.Projects.Dom.TypeModifiervalue__$ServiceStack.Text CsvConfig 9  ServiceStack.Text JsConfig    ServiceStack.Text.Common!DeserializeSpecializedCollections 9N"y SpecializedQueueElements %+ServiceStack.Text.CommonJsReader  (!ServiceStack.Text.Common"JsState #$%&+'ServiceStack.Text( CsvSerializer )*+,.- ' ( -N./01%1ServiceStack.Text2 CsvWriter 39N4564/7ServiceStack.Text8ITracer 9:;<7J2=ServiceStack.Text>JsonExtensions ?@AB:8 =C JsonObject DEFG=g; =HJsonArrayObjects IJKL@ =MServiceStack.TextNJsonSerializer OPQRC9BSServiceStack.Text.JsonTJsonTypeSerializer UNVWXFVYServiceStack.Text.JsvZJsvDeserializeType [\]^IJX_ServiceStack.Text.Controller`CommandProcessor a8NbcdL[eServiceStack.Text.ControllerfPathInfo g0NhijObkServiceStack.Text N lmnoRTkpServiceStack.TextqCsvStreamExtensions rstuUnvServiceStack.TextwDateTimeExtensions xyz{X s|ServiceStack.Text}Env ~(N[vServiceStack.TextITypeSerializer ^}ServiceStack.Text.Json JsonUtils NaServiceStack.Text.Json JsonWriter dI   Ng.ServiceStack.Text.CommonJsWriter Nji   NmServiceStack.Text.Json JsonReader p<   NseServiceStack.TextQueryStringSerializer v QueryStringWriter NyServiceStack.Text JsvFormatter |IServiceStack.Text.CommonDateTimeSerializer ServiceStack.Text.Common  jServiceStack.Text.Jsv JsvReader    NServiceStack.Text.Jsv JsvSerializer ~ServiceStack.Text.Jsv JsvWriter '   NServiceStack.Text.CommonDeserializeArrayWithElements     DeserializeArray U   9N9ServiceStack.Text.CommonDeserializeBuiltin 9NServiceStack.Text.CommonDeserializeCollection ServiceStack.Text.CommonDeserializeDictionary _ ServiceStack.Text.Common DeserializeListWithElements        DeserializeList 9N} DeserializeEnumerable 9NServiceStack.Text.Common ParseUtils  !"# $ %&'(ServiceStack.Text.Common)StaticParseMethod *9N+,-.ServiceStack.Text.Common/DeserializeTypeUtils 01234ServiceStack.Text.Common5DeserializeType 6789 # : ;<=$ #>WriteGenericListDelegate ? @ABH # C DEF # G HIJ # K LMN # O PQR # S TUV # W XYZ [ServiceStack.Text\ListExtensions ]^_`aServiceStack.Textb MapExtensions cdef_gServiceStack.Text.ReflectionhStaticAccessors ijklmServiceStack.Text.JsvnJsvTypeSerializer opqr% # s tuv'wServiceStack.Text.CommonxWriteDictionary yz{|. w}ToStringDictionaryMethods ~3ServiceStack.Text.CommonWriteListsOfElements :   NtH  WriteLists BN   9N QServiceStack.TextStreamExtensions bServiceStack.TextStringExtensions zServiceStack.Common.SupportAssemblyTypeDefinition (NU}ServiceStack.Text.SupportDoubleConverter ServiceStack.Text.SupportTypePair 0N ServiceStack.TextTracer   ɏServiceStack.TextTranslateListWithElements 5 ConvertibleTypeKey 0N   Л $TranslateListWithConvertibleElements NServiceStack.Text TypeConfig  NServiceStack.TextTypeSerializer ServiceStack.Text.Common WriteType =N! #   $ServiceStack.TextReflectionExtensions '6ServiceStack.TextTextExtensions *ServiceStack.Text  -ServiceStack.Text XmlSerializer N00MonoDevelop.Projects.Dom.Serialization.FileEntryfilePath parseTimeparseErrorRetries commentTasksclasses System.Collections.Generic.IList`1[[MonoDevelop.Projects.Dom.Tag, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]] /sM8Έ  30 2p/͈  60 5!͈  90 8Ղ{͈  <0 ;m͈  %?0 >p/͈  (B0 AՂ{͈  E0 DՂ{͈  1H0 Gp/͈  4K0 Jp/͈  N0 M>͈  @Q0 PSZ|͈  CT0 Sp/͈  FW0 V>͈  IZ0 Y>͈  L]0 \fΈ  O`0 _>͈  Rc0 b>͈  Uf0 efΈ  Xi0 h>͈  [l0 kfΈ  ^o0 n>͈  r0 q>͈  u0 tm͈  x0 w>͈  {0 z>͈  y~0 }>͈  |0 ]T|͈  0 >͈  0 >͈  0 >͈  !0 m͈ " #0 m͈ $ 0 sM8Έ % 0 Ղ{͈ & 0 sM8Έ ' (0 >͈ ) 0 sM8Έ * +0 >͈ , 0 sM8Έ - 0 >͈ . /0 >͈ 0 0 >͈ 1 0 sM8Έ 2 0 >͈ 3 0 fΈ 4 0 Ղ{͈ 5 60 Ղ{͈ 7 80 p/͈ 9 0 sM8Έ : 0 p/͈ ; 0 sM8Έ < 0 >͈ = 0 p/͈ > 0 Ղ{͈ ? @0 >͈ A 0 fΈ B 0 sM8Έ C 0 sM8Έ D E0 >͈ F '0 >͈ G *0 sM8Έ H -0  0  0  System.Collections.ArrayList_size_items_version I J K L MSystem.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.Tag, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]_items_size_versionMonoDevelop.Projects.Dom.Tag[] N N N N1MonoDevelop.Projects.Dom.Serialization.ClassEntry  " N N N1MonoDevelop.Projects.Dom.Serialization.ClassEntry + . N N N1MonoDevelop.Projects.Dom.Serialization.ClassEntry 7 : = N O  N  N  N  N  N N N N N N1MonoDevelop.Projects.Dom.Serialization.ClassEntry a d N1MonoDevelop.Projects.Dom.Serialization.ClassEntry g j N1MonoDevelop.Projects.Dom.Serialization.ClassEntry m p N1MonoDevelop.Projects.Dom.Serialization.ClassEntry s v N N N N1MonoDevelop.Projects.Dom.Serialization.ClassEntry  N  N!1MonoDevelop.Projects.Dom.Serialization.ClassEntry " N#1MonoDevelop.Projects.Dom.Serialization.ClassEntry $ N% N& N' P(1MonoDevelop.Projects.Dom.Serialization.ClassEntry ) N* N+1MonoDevelop.Projects.Dom.Serialization.ClassEntry , N- N. N/1MonoDevelop.Projects.Dom.Serialization.ClassEntry 0 Q1 N2 N3 N4 N5 N61MonoDevelop.Projects.Dom.Serialization.ClassEntry 7 N81MonoDevelop.Projects.Dom.Serialization.ClassEntry 9 N: N; N< N= N> N? N@1MonoDevelop.Projects.Dom.Serialization.ClassEntry    A NB NC ND NE1MonoDevelop.Projects.Dom.Serialization.ClassEntry ! $F NG NH NI : JR#ServiceStack.Text.Tracer.NullTracerS&ServiceStack.Text.Tracer.ConsoleTracer K = L @ @ * M C C NMonoDevelop.Projects.Dom.TagOMonoDevelop.Projects.Dom.Tag T PMonoDevelop.Projects.Dom.Tag U QMonoDevelop.Projects.Dom.Tag V TMonoDevelop.Projects.Dom.Tagkey Comment+k__BackingField#Comment+k__BackingFieldComment+k__BackingFieldComment+k__BackingField(Comment+k__BackingField*Comment+k__BackingField$Comment+k__BackingField"MonoDevelop.Projects.Dom.DomRegion$MonoDevelop.Projects.Dom.CommentTypeWTODO X!TODO: might need to optimize thisY"MonoDevelop.Projects.Dom.DomRegionstartend$MonoDevelop.Projects.Dom.DomLocation$MonoDevelop.Projects.Dom.DomLocationZ$MonoDevelop.Projects.Dom.DomLocationk__BackingFieldk__BackingField[Z'\$MonoDevelop.Projects.Dom.CommentTypevalue__UT W ]cTODO: 8-10-2011 -- this CreateInstance call should probably be moved over to ReflectionExtensions, ^Y_Z`Zia\VT W bTODO: make it workcYdZ-eZ-f\ smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/ServiceStack.Text.suo0000644000175000017500000000500012146506553027540 0ustar00meebeymeebey00000000000000ࡱ> Root Entry/I@ProjInfoExProjExplorerState$P謓lKusQ `c:\src\servicestack.text\src\servicestack.text\pc:\src\servicestack.text\tests\servicestack.text.tests\smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/TypeSerializer.cs0000644000175000017500000001446212146506553027015 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Text; using ServiceStack.Text.Common; using ServiceStack.Text.Jsv; namespace ServiceStack.Text { /// /// Creates an instance of a Type from a string value /// public static class TypeSerializer { private static readonly UTF8Encoding UTF8EncodingWithoutBom = new UTF8Encoding(false); public const string DoubleQuoteString = "\"\""; /// /// Determines whether the specified type is convertible from string. /// /// The type. /// /// true if the specified type is convertible from string; otherwise, false. /// public static bool CanCreateFromString(Type type) { return JsvReader.GetParseFn(type) != null; } /// /// Parses the specified value. /// /// The value. /// public static T DeserializeFromString(string value) { if (string.IsNullOrEmpty(value)) return default(T); return (T)JsvReader.Parse(value); } public static T DeserializeFromReader(TextReader reader) { return DeserializeFromString(reader.ReadToEnd()); } /// /// Parses the specified type. /// /// The type. /// The value. /// public static object DeserializeFromString(string value, Type type) { return value == null ? null : JsvReader.GetParseFn(type)(value); } public static object DeserializeFromReader(TextReader reader, Type type) { return DeserializeFromString(reader.ReadToEnd(), type); } public static string SerializeToString(T value) { if (value == null) return null; if (typeof(T) == typeof(string)) return value as string; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; var result = SerializeToString(value, value.GetType()); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return result; } var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { JsvWriter.WriteObject(writer, value); } return sb.ToString(); } public static string SerializeToString(object value, Type type) { if (value == null) return null; if (type == typeof(string)) return value as string; var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { JsvWriter.GetWriteFn(type)(writer, value); } return sb.ToString(); } public static void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; if (typeof(T) == typeof(string)) { writer.Write(value); return; } if (typeof(T) == typeof(object)) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; SerializeToWriter(value, value.GetType(), writer); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return; } JsvWriter.WriteObject(writer, value); } public static void SerializeToWriter(object value, Type type, TextWriter writer) { if (value == null) return; if (type == typeof(string)) { writer.Write(value); return; } JsvWriter.GetWriteFn(type)(writer, value); } public static void SerializeToStream(T value, Stream stream) { if (value == null) return; if (typeof(T) == typeof(object)) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; SerializeToStream(value, value.GetType(), stream); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return; } var writer = new StreamWriter(stream, UTF8EncodingWithoutBom); JsvWriter.WriteObject(writer, value); writer.Flush(); } public static void SerializeToStream(object value, Type type, Stream stream) { var writer = new StreamWriter(stream, UTF8EncodingWithoutBom); JsvWriter.GetWriteFn(type)(writer, value); writer.Flush(); } public static T Clone(T value) { var serializedValue = SerializeToString(value); var cloneObj = DeserializeFromString(serializedValue); return cloneObj; } public static T DeserializeFromStream(Stream stream) { using (var reader = new StreamReader(stream, UTF8EncodingWithoutBom)) { return DeserializeFromString(reader.ReadToEnd()); } } public static object DeserializeFromStream(Type type, Stream stream) { using (var reader = new StreamReader(stream, UTF8EncodingWithoutBom)) { return DeserializeFromString(reader.ReadToEnd(), type); } } /// /// Useful extension method to get the Dictionary[string,string] representation of any POCO type. /// /// public static Dictionary ToStringDictionary(this T obj) where T : class { var jsv = SerializeToString(obj); var map = DeserializeFromString>(jsv); return map; } /// /// Recursively prints the contents of any POCO object in a human-friendly, readable format /// /// public static string Dump(this T instance) { return SerializeAndFormat(instance); } public static string SerializeAndFormat(this T instance) { var dtoStr = SerializeToString(instance); var formatStr = JsvFormatter.Format(dtoStr); return formatStr; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Tracer.cs0000644000175000017500000000261612146506553025260 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Text { public class Tracer { public static ITracer Instance = new NullTracer(); public class NullTracer : ITracer { public void WriteDebug(string error) { } public void WriteDebug(string format, params object[] args) { } public void WriteWarning(string warning) { } public void WriteWarning(string format, params object[] args) { } public void WriteError(Exception ex) { } public void WriteError(string error) { } public void WriteError(string format, params object[] args) { } } public class ConsoleTracer : ITracer { public void WriteDebug(string error) { Console.WriteLine(error); } public void WriteDebug(string format, params object[] args) { Console.WriteLine(format, args); } public void WriteWarning(string warning) { Console.WriteLine(warning); } public void WriteWarning(string format, params object[] args) { Console.WriteLine(format, args); } public void WriteError(Exception ex) { Console.WriteLine(ex); } public void WriteError(string error) { Console.WriteLine(error); } public void WriteError(string format, params object[] args) { Console.WriteLine(format, args); } } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/JsonSerializer.cs0000644000175000017500000001134512146506553027002 0ustar00meebeymeebey00000000000000 // // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Globalization; using System.IO; using System.Text; using ServiceStack.Text.Common; using ServiceStack.Text.Json; namespace ServiceStack.Text { /// /// Creates an instance of a Type from a string value /// public static class JsonSerializer { private static readonly UTF8Encoding UTF8EncodingWithoutBom = new UTF8Encoding(false); public static T DeserializeFromString(string value) { if (string.IsNullOrEmpty(value)) return default(T); return (T)JsonReader.Parse(value); } public static T DeserializeFromReader(TextReader reader) { return DeserializeFromString(reader.ReadToEnd()); } public static object DeserializeFromString(string value, Type type) { return value == null ? null : JsonReader.GetParseFn(type)(value); } public static object DeserializeFromReader(TextReader reader, Type type) { return DeserializeFromString(reader.ReadToEnd(), type); } public static string SerializeToString(T value) { if (value == null) return null; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; var result = SerializeToString(value, value.GetType()); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return result; } var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { if (typeof(T) == typeof(string)) { JsonUtils.WriteString(writer, value as string); } else { JsonWriter.WriteObject(writer, value); } } return sb.ToString(); } public static string SerializeToString(object value, Type type) { if (value == null) return null; var sb = new StringBuilder(); using (var writer = new StringWriter(sb, CultureInfo.InvariantCulture)) { if (type == typeof(string)) { JsonUtils.WriteString(writer, value as string); } else { JsonWriter.GetWriteFn(type)(writer, value); } } return sb.ToString(); } public static void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; if (typeof(T) == typeof(string)) { writer.Write(value); return; } if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; SerializeToWriter(value, value.GetType(), writer); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return; } JsonWriter.WriteObject(writer, value); } public static void SerializeToWriter(object value, Type type, TextWriter writer) { if (value == null) return; if (type == typeof(string)) { writer.Write(value); return; } JsonWriter.GetWriteFn(type)(writer, value); } public static void SerializeToStream(T value, Stream stream) { if (value == null) return; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; SerializeToStream(value, value.GetType(), stream); if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; return; } var writer = new StreamWriter(stream, UTF8EncodingWithoutBom); JsonWriter.WriteObject(writer, value); writer.Flush(); } public static void SerializeToStream(object value, Type type, Stream stream) { var writer = new StreamWriter(stream, UTF8EncodingWithoutBom); JsonWriter.GetWriteFn(type)(writer, value); writer.Flush(); } public static T DeserializeFromStream(Stream stream) { using (var reader = new StreamReader(stream, UTF8EncodingWithoutBom)) { return DeserializeFromString(reader.ReadToEnd()); } } public static object DeserializeFromStream(Type type, Stream stream) { using (var reader = new StreamReader(stream, UTF8EncodingWithoutBom)) { return DeserializeFromString(reader.ReadToEnd(), type); } } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/DateTimeExtensions.cs0000644000175000017500000001100012146506553027577 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using ServiceStack.Text.Common; namespace ServiceStack.Text { /// /// A fast, standards-based, serialization-issue free DateTime serailizer. /// public static class DateTimeExtensions { public const long UnixEpoch = 621355968000000000L; private static readonly DateTime UnixEpochDateTimeUtc = new DateTime(UnixEpoch, DateTimeKind.Utc); private static readonly DateTime UnixEpochDateTimeUnspecified = new DateTime(UnixEpoch, DateTimeKind.Unspecified); public static long ToUnixTime(this DateTime dateTime) { return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerSecond; } public static DateTime FromUnixTime(this double unixTime) { return UnixEpochDateTimeUtc + TimeSpan.FromSeconds(unixTime); } public static long ToUnixTimeMs(this DateTime dateTime) { return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond; } public static DateTime FromUnixTimeMs(this double msSince1970) { return UnixEpochDateTimeUtc + TimeSpan.FromMilliseconds(msSince1970); } public static DateTime FromUnixTimeMs(this long msSince1970) { return UnixEpochDateTimeUtc + TimeSpan.FromMilliseconds(msSince1970); } public static DateTime FromUnixTimeMs(this long msSince1970, TimeSpan offset) { return UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset; } public static DateTime FromUnixTimeMs(this double msSince1970, TimeSpan offset) { return UnixEpochDateTimeUnspecified + TimeSpan.FromMilliseconds(msSince1970) + offset; } public static DateTime FromUnixTimeMs(string msSince1970) { long ms; if (long.TryParse(msSince1970, out ms)) return ms.FromUnixTimeMs(); // Do we really need to support fractional unix time ms time strings?? return double.Parse(msSince1970).FromUnixTimeMs(); } public static DateTime FromUnixTimeMs(string msSince1970, TimeSpan offset) { long ms; if (long.TryParse(msSince1970, out ms)) return ms.FromUnixTimeMs(offset); // Do we really need to support fractional unix time ms time strings?? return double.Parse(msSince1970).FromUnixTimeMs(offset); } public static DateTime RoundToMs(this DateTime dateTime) { return new DateTime((dateTime.Ticks / TimeSpan.TicksPerMillisecond) * TimeSpan.TicksPerMillisecond); } public static DateTime RoundToSecond(this DateTime dateTime) { return new DateTime((dateTime.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond); } public static string ToShortestXsdDateTimeString(this DateTime dateTime) { return DateTimeSerializer.ToShortestXsdDateTimeString(dateTime); } public static DateTime FromShortestXsdDateTimeString(this string xsdDateTime) { return DateTimeSerializer.ParseShortestXsdDateTime(xsdDateTime); } public static bool IsEqualToTheSecond(this DateTime dateTime, DateTime otherDateTime) { return dateTime.ToStableUniversalTime().RoundToSecond().Equals(otherDateTime.ToStableUniversalTime().RoundToSecond()); } public static string ToTimeOffsetString(this TimeSpan offset, bool includeColon = false) { var sign = offset < TimeSpan.Zero ? "-" : "+"; var hours = Math.Abs(offset.Hours); var minutes = Math.Abs(offset.Minutes); var separator = includeColon ? ":" : ""; return string.Format("{0}{1:00}{2}{3:00}", sign, hours, separator, minutes); } public static TimeSpan FromTimeOffsetString(this string offsetString) { if (!offsetString.Contains(":")) offsetString = offsetString.Insert(offsetString.Length - 2, ":"); offsetString = offsetString.TrimStart('+'); return TimeSpan.Parse(offsetString); } public static DateTime ToStableUniversalTime(this DateTime dateTime) { #if SILVERLIGHT // Silverlight 3, 4 and 5 all work ok with DateTime.ToUniversalTime, but have no TimeZoneInfo.ConverTimeToUtc implementation. return dateTime.ToUniversalTime(); #else // .Net 2.0 - 3.5 has an issue with DateTime.ToUniversalTime, but works ok with TimeZoneInfo.ConvertTimeToUtc. // .Net 4.0+ does this under the hood anyway. return TimeZoneInfo.ConvertTimeToUtc(dateTime); #endif } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/StreamExtensions.cs0000644000175000017500000001461212146506553027352 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; namespace ServiceStack.Text { public static class StreamExtensions { public static void WriteTo(this Stream inStream, Stream outStream) { var memoryStream = inStream as MemoryStream; if (memoryStream != null) { memoryStream.WriteTo(outStream); return; } var data = new byte[4096]; int bytesRead; while ((bytesRead = inStream.Read(data, 0, data.Length)) > 0) { outStream.Write(data, 0, bytesRead); } } public static IEnumerable ReadLines(this StreamReader reader) { if (reader == null) throw new ArgumentNullException("reader"); string line; while ((line = reader.ReadLine()) != null) { yield return line; } } /// /// @jonskeet: Collection of utility methods which operate on streams. /// r285, February 26th 2009: http://www.yoda.arachsys.com/csharp/miscutil/ /// const int DefaultBufferSize = 8 * 1024; /// /// Reads the given stream up to the end, returning the data as a byte /// array. /// public static byte[] ReadFully(this Stream input) { return ReadFully(input, DefaultBufferSize); } /// /// Reads the given stream up to the end, returning the data as a byte /// array, using the given buffer size. /// public static byte[] ReadFully(this Stream input, int bufferSize) { if (bufferSize < 1) { throw new ArgumentOutOfRangeException("bufferSize"); } return ReadFully(input, new byte[bufferSize]); } /// /// Reads the given stream up to the end, returning the data as a byte /// array, using the given buffer for transferring data. Note that the /// current contents of the buffer is ignored, so the buffer needn't /// be cleared beforehand. /// public static byte[] ReadFully(this Stream input, byte[] buffer) { if (buffer == null) { throw new ArgumentNullException("buffer"); } if (input == null) { throw new ArgumentNullException("input"); } if (buffer.Length == 0) { throw new ArgumentException("Buffer has length of 0"); } // We could do all our own work here, but using MemoryStream is easier // and likely to be just as efficient. using (var tempStream = new MemoryStream()) { CopyTo(input, tempStream, buffer); // No need to copy the buffer if it's the right size if (tempStream.Length == tempStream.GetBuffer().Length) { return tempStream.GetBuffer(); } // Okay, make a copy that's the right size return tempStream.ToArray(); } } /// /// Copies all the data from one stream into another. /// public static void CopyTo(this Stream input, Stream output) { CopyTo(input, output, DefaultBufferSize); } /// /// Copies all the data from one stream into another, using a buffer /// of the given size. /// public static void CopyTo(this Stream input, Stream output, int bufferSize) { if (bufferSize < 1) { throw new ArgumentOutOfRangeException("bufferSize"); } CopyTo(input, output, new byte[bufferSize]); } /// /// Copies all the data from one stream into another, using the given /// buffer for transferring data. Note that the current contents of /// the buffer is ignored, so the buffer needn't be cleared beforehand. /// public static void CopyTo(this Stream input, Stream output, byte[] buffer) { if (buffer == null) { throw new ArgumentNullException("buffer"); } if (input == null) { throw new ArgumentNullException("input"); } if (output == null) { throw new ArgumentNullException("output"); } if (buffer.Length == 0) { throw new ArgumentException("Buffer has length of 0"); } int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, read); } } /// /// Reads exactly the given number of bytes from the specified stream. /// If the end of the stream is reached before the specified amount /// of data is read, an exception is thrown. /// public static byte[] ReadExactly(this Stream input, int bytesToRead) { return ReadExactly(input, new byte[bytesToRead]); } /// /// Reads into a buffer, filling it completely. /// public static byte[] ReadExactly(this Stream input, byte[] buffer) { return ReadExactly(input, buffer, buffer.Length); } /// /// Reads exactly the given number of bytes from the specified stream, /// into the given buffer, starting at position 0 of the array. /// public static byte[] ReadExactly(this Stream input, byte[] buffer, int bytesToRead) { return ReadExactly(input, buffer, 0, bytesToRead); } /// /// Reads exactly the given number of bytes from the specified stream, /// into the given buffer, starting at position 0 of the array. /// public static byte[] ReadExactly(this Stream input, byte[] buffer, int startIndex, int bytesToRead) { if (input == null) { throw new ArgumentNullException("input"); } if (buffer == null) { throw new ArgumentNullException("buffer"); } if (startIndex < 0 || startIndex >= buffer.Length) { throw new ArgumentOutOfRangeException("startIndex"); } if (bytesToRead < 1 || startIndex + bytesToRead > buffer.Length) { throw new ArgumentOutOfRangeException("bytesToRead"); } return ReadExactlyFast(input, buffer, startIndex, bytesToRead); } /// /// Same as ReadExactly, but without the argument checks. /// private static byte[] ReadExactlyFast(Stream fromStream, byte[] intoBuffer, int startAtIndex, int bytesToRead) { var index = 0; while (index < bytesToRead) { var read = fromStream.Read(intoBuffer, startAtIndex + index, bytesToRead - index); if (read == 0) { throw new EndOfStreamException (String.Format("End of stream reached with {0} byte{1} left to read.", bytesToRead - index, bytesToRead - index == 1 ? "s" : "")); } index += read; } return intoBuffer; } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/CsvStreamExtensions.cs0000644000175000017500000000141112146506553030017 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System.Collections.Generic; using System.IO; namespace ServiceStack.Text { public static class CsvStreamExtensions { public static void WriteCsv(this Stream outputStream, IEnumerable records) { using (var textWriter = new StreamWriter(outputStream)) { textWriter.WriteCsv(records); } } public static void WriteCsv(this TextWriter writer, IEnumerable records) { CsvWriter.Write(writer, records); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/CsvWriter.cs0000644000175000017500000001127112146506553025765 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; using ServiceStack.Text.Common; using ServiceStack.Text.Reflection; namespace ServiceStack.Text { internal class CsvWriter { public const char DelimiterChar = ','; public static List Headers { get; set; } internal static List> PropertyGetters; private static readonly WriteObjectDelegate OptimizedWriter; static CsvWriter() { if (typeof(T) == typeof(string)) { OptimizedWriter = (w, o) => WriteRow(w, (IEnumerable)o); return; } Reset(); } internal static void Reset() { Headers = new List(); PropertyGetters = new List>(); foreach (var propertyInfo in TypeConfig.Properties) { if (!propertyInfo.CanRead || propertyInfo.GetGetMethod() == null) continue; if (!TypeSerializer.CanCreateFromString(propertyInfo.PropertyType)) continue; PropertyGetters.Add(propertyInfo.GetValueGetter()); Headers.Add(propertyInfo.Name); } } internal static void ConfigureCustomHeaders(Dictionary customHeadersMap) { Reset(); for (var i = Headers.Count - 1; i >= 0; i--) { var oldHeader = Headers[i]; string newHeaderValue; if (!customHeadersMap.TryGetValue(oldHeader, out newHeaderValue)) { Headers.RemoveAt(i); PropertyGetters.RemoveAt(i); } else { Headers[i] = newHeaderValue.EncodeJsv(); } } } private static List GetSingleRow(IEnumerable records, Type recordType) { var row = new List(); foreach (var value in records) { var strValue = recordType == typeof(string) ? value as string : TypeSerializer.SerializeToString(value); row.Add(strValue); } return row; } public static List> GetRows(IEnumerable records) { var rows = new List>(); if (records == null) return rows; if (typeof(T).IsValueType || typeof(T) == typeof(string)) { rows.Add(GetSingleRow(records, typeof(T))); return rows; } foreach (var record in records) { var row = new List(); foreach (var propertyGetter in PropertyGetters) { var value = propertyGetter(record) ?? ""; var strValue = value.GetType() == typeof(string) ? (string)value : TypeSerializer.SerializeToString(value); row.Add(strValue); } rows.Add(row); } return rows; } public static void WriteObject(TextWriter writer, object records) { Write(writer, (IEnumerable)records); } public static void WriteObjectRow(TextWriter writer, object record) { WriteRow(writer, (T)record); } public static void Write(TextWriter writer, IEnumerable records) { if (records == null) return; //AOT if (OptimizedWriter != null) { OptimizedWriter(writer, records); return; } if (!CsvConfig.OmitHeaders && Headers.Count > 0) { var ranOnce = false; foreach (var header in Headers) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); writer.Write(header); } writer.WriteLine(); } if (records == null) return; if (typeof(T).IsValueType || typeof(T) == typeof(string)) { var singleRow = GetSingleRow(records, typeof(T)); WriteRow(writer, singleRow); return; } var row = new string[Headers.Count]; foreach (var record in records) { for (var i = 0; i < PropertyGetters.Count; i++) { var propertyGetter = PropertyGetters[i]; var value = propertyGetter(record) ?? ""; var strValue = value.GetType() == typeof(string) ? (string)value : TypeSerializer.SerializeToString(value); row[i] = strValue; } WriteRow(writer, row); } } public static void WriteRow(TextWriter writer, T row) { if (row == null) return; //AOT Write(writer, new[] { row }); } public static void WriteRow(TextWriter writer, IEnumerable row) { var ranOnce = false; foreach (var field in row) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); writer.Write(field.ToCsvField()); } writer.WriteLine(); } public static void Write(TextWriter writer, IEnumerable> rows) { if (Headers.Count > 0) { var ranOnce = false; foreach (var header in Headers) { JsWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); writer.Write(header); } writer.WriteLine(); } foreach (var row in rows) { WriteRow(writer, row); } } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Jsv/0000755000175000017500000000000012146506553024246 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs0000644000175000017500000000565412146506553030121 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Threading; using ServiceStack.Text.Common; namespace ServiceStack.Text.Jsv { internal static class JsvWriter { public static readonly JsWriter Instance = new JsWriter(); private static Dictionary WriteFnCache = new Dictionary(); public static WriteObjectDelegate GetWriteFn(Type type) { try { WriteObjectDelegate writeFn; if (WriteFnCache.TryGetValue(type, out writeFn)) return writeFn; var genericType = typeof(JsvWriter<>).MakeGenericType(type); var mi = genericType.GetMethod("WriteFn", BindingFlags.Public | BindingFlags.Static); var writeFactoryFn = (Func)Delegate.CreateDelegate(typeof(Func), mi); writeFn = writeFactoryFn(); Dictionary snapshot, newCache; do { snapshot = WriteFnCache; newCache = new Dictionary(WriteFnCache); newCache[type] = writeFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref WriteFnCache, newCache, snapshot), snapshot)); return writeFn; } catch (Exception ex) { Tracer.Instance.WriteError(ex); throw; } } public static void WriteLateBoundObject(TextWriter writer, object value) { if (value == null) return; var writeFn = GetWriteFn(value.GetType()); var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = true; writeFn(writer, value); JsState.IsWritingDynamic = prevState; } public static WriteObjectDelegate GetValueTypeToStringMethod(Type type) { return Instance.GetValueTypeToStringMethod(type); } } /// /// Implement the serializer using a more static approach /// /// internal static class JsvWriter { private static readonly WriteObjectDelegate CacheFn; public static WriteObjectDelegate WriteFn() { return CacheFn ?? WriteObject; } static JsvWriter() { CacheFn = typeof(T) == typeof(object) ? JsvWriter.WriteLateBoundObject : JsvWriter.Instance.GetWriteFn(); } public static void WriteObject(TextWriter writer, object value) { CacheFn(writer, value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvDeserializeType.cs0000644000175000017500000000051612146506553030364 0ustar00meebeymeebey00000000000000using System; using System.Reflection; using ServiceStack.Text.Common; namespace ServiceStack.Text.Jsv { public static class JsvDeserializeType { public static SetPropertyDelegate GetSetPropertyMethod(Type type, PropertyInfo propertyInfo) { return TypeAccessor.GetSetPropertyMethod(type, propertyInfo); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs0000644000175000017500000000444512146506553030044 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Reflection; using System.Threading; using ServiceStack.Text.Common; namespace ServiceStack.Text.Jsv { public static class JsvReader { internal static readonly JsReader Instance = new JsReader(); private static Dictionary ParseFnCache = new Dictionary(); public static ParseStringDelegate GetParseFn(Type type) { ParseFactoryDelegate parseFactoryFn; ParseFnCache.TryGetValue(type, out parseFactoryFn); if (parseFactoryFn != null) return parseFactoryFn(); var genericType = typeof(JsvReader<>).MakeGenericType(type); var mi = genericType.GetMethod("GetParseFn", BindingFlags.Public | BindingFlags.Static); parseFactoryFn = (ParseFactoryDelegate)Delegate.CreateDelegate(typeof(ParseFactoryDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ParseFnCache; newCache = new Dictionary(ParseFnCache); newCache[type] = parseFactoryFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseFnCache, newCache, snapshot), snapshot)); return parseFactoryFn(); } } public static class JsvReader { private static readonly ParseStringDelegate ReadFn; static JsvReader() { ReadFn = JsvReader.Instance.GetParseFn(); } public static ParseStringDelegate GetParseFn() { return ReadFn ?? Parse; } public static object Parse(string value) { if (ReadFn == null) { if (typeof(T).IsInterface) { throw new NotSupportedException("Can not deserialize interface type: " + typeof(T).Name); } } return value == null ? null : ReadFn(value); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs0000644000175000017500000002320112146506553030231 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Globalization; using System.IO; using ServiceStack.Text.Common; using ServiceStack.Text.Json; namespace ServiceStack.Text.Jsv { internal class JsvTypeSerializer : ITypeSerializer { public static ITypeSerializer Instance = new JsvTypeSerializer(); public string TypeAttrInObject { get { return "{__type:"; } } public WriteObjectDelegate GetWriteFn() { return JsvWriter.WriteFn(); } public WriteObjectDelegate GetWriteFn(Type type) { return JsvWriter.GetWriteFn(type); } static readonly TypeInfo DefaultTypeInfo = new TypeInfo { EncodeMapKey = false }; public TypeInfo GetTypeInfo(Type type) { return DefaultTypeInfo; } public void WriteRawString(TextWriter writer, string value) { writer.Write(value.ToCsvField()); } public void WritePropertyName(TextWriter writer, string value) { writer.Write(value); } public void WriteBuiltIn(TextWriter writer, object value) { writer.Write(value); } public void WriteObjectString(TextWriter writer, object value) { if (value != null) { writer.Write(value.ToString().ToCsvField()); } } public void WriteException(TextWriter writer, object value) { writer.Write(((Exception)value).Message.ToCsvField()); } public void WriteString(TextWriter writer, string value) { writer.Write(value.ToCsvField()); } public void WriteDateTime(TextWriter writer, object oDateTime) { writer.Write(DateTimeSerializer.ToShortestXsdDateTimeString((DateTime)oDateTime)); } public void WriteNullableDateTime(TextWriter writer, object dateTime) { if (dateTime == null) return; writer.Write(DateTimeSerializer.ToShortestXsdDateTimeString((DateTime)dateTime)); } public void WriteGuid(TextWriter writer, object oValue) { writer.Write(((Guid)oValue).ToString("N")); } public void WriteNullableGuid(TextWriter writer, object oValue) { if (oValue == null) return; writer.Write(((Guid)oValue).ToString("N")); } public void WriteBytes(TextWriter writer, object oByteValue) { if (oByteValue == null) return; writer.Write(Convert.ToBase64String((byte[])oByteValue)); } public void WriteChar(TextWriter writer, object charValue) { if (charValue == null) return; writer.Write((char)charValue); } public void WriteByte(TextWriter writer, object byteValue) { if (byteValue == null) return; writer.Write((byte)byteValue); } public void WriteInt16(TextWriter writer, object intValue) { if (intValue == null) return; writer.Write((short)intValue); } public void WriteUInt16(TextWriter writer, object intValue) { if (intValue == null) return; writer.Write((ushort)intValue); } public void WriteInt32(TextWriter writer, object intValue) { if (intValue == null) return; writer.Write((int)intValue); } public void WriteUInt32(TextWriter writer, object uintValue) { if (uintValue == null) return; writer.Write((uint)uintValue); } public void WriteUInt64(TextWriter writer, object ulongValue) { if (ulongValue == null) return; writer.Write((ulong)ulongValue); } public void WriteInt64(TextWriter writer, object longValue) { if (longValue == null) return; writer.Write((long)longValue); } public void WriteBool(TextWriter writer, object boolValue) { if (boolValue == null) return; writer.Write((bool)boolValue); } public void WriteFloat(TextWriter writer, object floatValue) { if (floatValue == null) return; var floatVal = (float)floatValue; if (Equals(floatVal, float.MaxValue) || Equals(floatVal, float.MinValue)) writer.Write(floatVal.ToString("r", CultureInfo.InvariantCulture)); else writer.Write(floatVal.ToString(CultureInfo.InvariantCulture)); } public void WriteDouble(TextWriter writer, object doubleValue) { if (doubleValue == null) return; var doubleVal = (double)doubleValue; if (Equals(doubleVal, double.MaxValue) || Equals(doubleVal, double.MinValue)) writer.Write(doubleVal.ToString("r", CultureInfo.InvariantCulture)); else writer.Write(doubleVal.ToString(CultureInfo.InvariantCulture)); } public void WriteDecimal(TextWriter writer, object decimalValue) { if (decimalValue == null) return; writer.Write(((decimal)decimalValue).ToString(CultureInfo.InvariantCulture)); } public void WriteEnum(TextWriter writer, object enumValue) { if (enumValue == null) return; writer.Write(enumValue.ToString()); } public void WriteEnumFlags(TextWriter writer, object enumFlagValue) { if (enumFlagValue == null) return; var intVal = (int)enumFlagValue; writer.Write(intVal); } public void WriteLinqBinary(TextWriter writer, object linqBinaryValue) { #if !MONOTOUCH && !SILVERLIGHT && !XBOX WriteRawString(writer, Convert.ToBase64String(((System.Data.Linq.Binary)linqBinaryValue).ToArray())); #endif } public object EncodeMapKey(object value) { return value; } public ParseStringDelegate GetParseFn() { return JsvReader.Instance.GetParseFn(); } public ParseStringDelegate GetParseFn(Type type) { return JsvReader.GetParseFn(type); } public string ParseRawString(string value) { return value; } public string ParseString(string value) { return value.FromCsvField(); } public string EatTypeValue(string value, ref int i) { return EatValue(value, ref i); } public bool EatMapStartChar(string value, ref int i) { var success = value[i] == JsWriter.MapStartChar; if (success) i++; return success; } public string EatMapKey(string value, ref int i) { var tokenStartPos = i; var valueLength = value.Length; var valueChar = value[tokenStartPos]; switch (valueChar) { case JsWriter.QuoteChar: while (++i < valueLength) { valueChar = value[i]; if (valueChar != JsWriter.QuoteChar) continue; var isLiteralQuote = i + 1 < valueLength && value[i + 1] == JsWriter.QuoteChar; i++; //skip quote if (!isLiteralQuote) break; } return value.Substring(tokenStartPos, i - tokenStartPos); //Is Type/Map, i.e. {...} case JsWriter.MapStartChar: var endsToEat = 1; var withinQuotes = false; while (++i < valueLength && endsToEat > 0) { valueChar = value[i]; if (valueChar == JsWriter.QuoteChar) withinQuotes = !withinQuotes; if (withinQuotes) continue; if (valueChar == JsWriter.MapStartChar) endsToEat++; if (valueChar == JsWriter.MapEndChar) endsToEat--; } return value.Substring(tokenStartPos, i - tokenStartPos); } while (value[++i] != JsWriter.MapKeySeperator) { } return value.Substring(tokenStartPos, i - tokenStartPos); } public bool EatMapKeySeperator(string value, ref int i) { return value[i++] == JsWriter.MapKeySeperator; } public bool EatItemSeperatorOrMapEndChar(string value, ref int i) { if (i == value.Length) return false; var success = value[i] == JsWriter.ItemSeperator || value[i] == JsWriter.MapEndChar; i++; return success; } public string EatValue(string value, ref int i) { var tokenStartPos = i; var valueLength = value.Length; if (i == valueLength) return null; var valueChar = value[i]; var withinQuotes = false; var endsToEat = 1; switch (valueChar) { //If we are at the end, return. case JsWriter.ItemSeperator: case JsWriter.MapEndChar: return null; //Is Within Quotes, i.e. "..." case JsWriter.QuoteChar: while (++i < valueLength) { valueChar = value[i]; if (valueChar != JsWriter.QuoteChar) continue; var isLiteralQuote = i + 1 < valueLength && value[i + 1] == JsWriter.QuoteChar; i++; //skip quote if (!isLiteralQuote) break; } return value.Substring(tokenStartPos, i - tokenStartPos).FromCsvField(); //Is Type/Map, i.e. {...} case JsWriter.MapStartChar: while (++i < valueLength && endsToEat > 0) { valueChar = value[i]; if (valueChar == JsWriter.QuoteChar) withinQuotes = !withinQuotes; if (withinQuotes) continue; if (valueChar == JsWriter.MapStartChar) endsToEat++; if (valueChar == JsWriter.MapEndChar) endsToEat--; } return value.Substring(tokenStartPos, i - tokenStartPos); //Is List, i.e. [...] case JsWriter.ListStartChar: while (++i < valueLength && endsToEat > 0) { valueChar = value[i]; if (valueChar == JsWriter.QuoteChar) withinQuotes = !withinQuotes; if (withinQuotes) continue; if (valueChar == JsWriter.ListStartChar) endsToEat++; if (valueChar == JsWriter.ListEndChar) endsToEat--; } return value.Substring(tokenStartPos, i - tokenStartPos); } //Is Value while (++i < valueLength) { valueChar = value[i]; if (valueChar == JsWriter.ItemSeperator || valueChar == JsWriter.MapEndChar) { break; } } return value.Substring(tokenStartPos, i - tokenStartPos); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/Jsv/JsvSerializer.Generic.cs0000644000175000017500000000416312146506553030750 0ustar00meebeymeebey00000000000000// // http://code.google.com/p/servicestack/wiki/TypeSerializer // ServiceStack.Text: .NET C# POCO Type Text Serializer. // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2011 Liquidbit Ltd. // // Licensed under the same terms of ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using ServiceStack.Text.Common; namespace ServiceStack.Text.Jsv { public class JsvSerializer { Dictionary DeserializerCache = new Dictionary(); public T DeserializeFromString(string value, Type type) { ParseStringDelegate parseFn; if (DeserializerCache.TryGetValue(type, out parseFn)) return (T)parseFn(value); var genericType = typeof(T).MakeGenericType(type); var mi = genericType.GetMethod("DeserializeFromString", new[] { typeof(string) }); parseFn = (ParseStringDelegate)Delegate.CreateDelegate(typeof(ParseStringDelegate), mi); Dictionary snapshot, newCache; do { snapshot = DeserializerCache; newCache = new Dictionary(DeserializerCache); newCache[type] = parseFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref DeserializerCache, newCache, snapshot), snapshot)); return (T)parseFn(value); } public T DeserializeFromString(string value) { if (typeof(T) == typeof(string)) return (T)(object)value; return (T)JsvReader.Parse(value); } public void SerializeToWriter(T value, TextWriter writer) { JsvWriter.WriteObject(writer, value); } public string SerializeToString(T value) { if (value == null) return null; if (value is string) return value as string; var sb = new StringBuilder(); using (var writer = new StringWriter(sb)) { JsvWriter.WriteObject(writer, value); } return sb.ToString(); } } }smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/XmlSerializer.cs0000644000175000017500000001171312146506553026630 0ustar00meebeymeebey00000000000000using System; using System.IO; #if !XBOX360 && !SILVERLIGHT using System.IO.Compression; #endif using System.Runtime.Serialization; using System.Text; using System.Xml; namespace ServiceStack.Text { #if !XBOX public class XmlSerializer { private readonly XmlDictionaryReaderQuotas quotas; private static readonly XmlWriterSettings XSettings = new XmlWriterSettings(); public static XmlSerializer Instance = new XmlSerializer( #if !SILVERLIGHT new XmlDictionaryReaderQuotas { MaxStringContentLength = 1024 * 1024, } #endif ); public XmlSerializer(XmlDictionaryReaderQuotas quotas=null, bool omitXmlDeclaration = false) { this.quotas = quotas; XSettings.Encoding = Encoding.UTF8; XSettings.OmitXmlDeclaration = omitXmlDeclaration; } private static object Deserialize(string xml, Type type, XmlDictionaryReaderQuotas quotas) { try { var bytes = Encoding.UTF8.GetBytes(xml); using (var reader = XmlDictionaryReader.CreateTextReader(bytes, quotas)) { var serializer = new DataContractSerializer(type); return serializer.ReadObject(reader); } } catch (Exception ex) { throw new SerializationException("DeserializeDataContract: Error converting type: " + ex.Message, ex); } } public static object DeserializeFromString(string xml, Type type) { return Deserialize(xml, type, Instance.quotas); } public static T DeserializeFromString(string xml) { var type = typeof(T); return (T)Deserialize(xml, type, Instance.quotas); } public static T DeserializeFromReader(TextReader reader) { return DeserializeFromString(reader.ReadToEnd()); } public static T DeserializeFromStream(Stream stream) { var serializer = new DataContractSerializer(typeof(T)); return (T)serializer.ReadObject(stream); } public static object DeserializeFromStream(Type type, Stream stream) { var serializer = new DataContractSerializer(type); return serializer.ReadObject(stream); } public static string SerializeToString(T from) { try { using (var ms = new MemoryStream()) { using (var xw = XmlWriter.Create(ms, XSettings)) { var serializer = new DataContractSerializer(from.GetType()); serializer.WriteObject(xw, from); xw.Flush(); ms.Seek(0, SeekOrigin.Begin); var reader = new StreamReader(ms); return reader.ReadToEnd(); } } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", from.GetType().FullName), ex); } } public static void SerializeToWriter(T value, TextWriter writer) { try { #if !SILVERLIGHT using (var xw = new XmlTextWriter(writer)) #else using (var xw = XmlWriter.Create(writer)) #endif { var serializer = new DataContractSerializer(value.GetType()); serializer.WriteObject(xw, value); } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", value.GetType().FullName), ex); } } public static void SerializeToStream(object obj, Stream stream) { #if !SILVERLIGHT using (var xw = new XmlTextWriter(stream, Encoding.UTF8)) #else using (var xw = XmlWriter.Create(stream)) #endif { var serializer = new DataContractSerializer(obj.GetType()); serializer.WriteObject(xw, obj); } } #if !SILVERLIGHT public static void CompressToStream(TXmlDto from, Stream stream) { using (var deflateStream = new DeflateStream(stream, CompressionMode.Compress)) using (var xw = new XmlTextWriter(deflateStream, Encoding.UTF8)) { var serializer = new DataContractSerializer(from.GetType()); serializer.WriteObject(xw, from); xw.Flush(); } } public static byte[] Compress(TXmlDto from) { using (var ms = new MemoryStream()) { CompressToStream(from, ms); return ms.ToArray(); } } #endif } #endif } smuxi-1.1/lib/ServiceStack.Text/src/ServiceStack.Text/CsvConfig.cs0000644000175000017500000000244012146506553025714 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Text { public static class CsvConfig { public static bool OmitHeaders { get; set; } private static Dictionary customHeadersMap; public static Dictionary CustomHeadersMap { get { return customHeadersMap; } set { customHeadersMap = value; if (value == null) return; CsvWriter.ConfigureCustomHeaders(customHeadersMap); } } public static object CustomHeaders { set { if (value == null) return; if (value.GetType().IsValueType) throw new ArgumentException("CustomHeaders is a ValueType"); var propertyInfos = value.GetType().GetProperties(); if (propertyInfos.Length == 0) return; customHeadersMap = new Dictionary(); foreach (var pi in propertyInfos) { var getMethod = pi.GetGetMethod(); if (getMethod == null) continue; var oValue = getMethod.Invoke(value, new object[0]); if (oValue == null) continue; customHeadersMap[pi.Name] = oValue.ToString(); } CsvWriter.ConfigureCustomHeaders(customHeadersMap); } } public static void Reset() { OmitHeaders = false; CsvWriter.Reset(); } } }smuxi-1.1/lib/Newtonsoft.Json/0000775000175000017500000000000014011526500017136 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/0000775000175000017500000000000014011526500017665 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/0000755000175000017500000000000012652476423022762 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonWriterException.cs0000644000175000017500000001045012253423361027264 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Text; namespace Newtonsoft.Json { /// /// The exception thrown when an error occurs while reading Json text. /// #if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE) [Serializable] #endif public class JsonWriterException : JsonException { /// /// Gets the path to the JSON where the error occurred. /// /// The path to the JSON where the error occurred. public string Path { get; private set; } /// /// Initializes a new instance of the class. /// public JsonWriterException() { } /// /// Initializes a new instance of the class /// with a specified error message. /// /// The error message that explains the reason for the exception. public JsonWriterException(string message) : base(message) { } /// /// Initializes a new instance of the class /// with a specified error message and a reference to the inner exception that is the cause of this exception. /// /// The error message that explains the reason for the exception. /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. public JsonWriterException(string message, Exception innerException) : base(message, innerException) { } #if !(WINDOWS_PHONE || SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is null. /// The class name is null or is zero (0). public JsonWriterException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif internal JsonWriterException(string message, Exception innerException, string path) : base(message, innerException) { Path = path; } internal static JsonWriterException Create(JsonWriter writer, string message, Exception ex) { return Create(writer.ContainerPath, message, ex); } internal static JsonWriterException Create(string path, string message, Exception ex) { message = FormatExceptionMessage(null, path, message); return new JsonWriterException(message, ex, path); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonConvert.cs0000644000175000017500000013325212253423361025557 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.IO; using System.Globalization; #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE) using System.Threading.Tasks; #endif using Newtonsoft.Json.Utilities; using System.Xml; using Newtonsoft.Json.Converters; using System.Text; #if !NET20 && (!SILVERLIGHT || WINDOWS_PHONE) && !PORTABLE using System.Xml.Linq; #endif #if NETFX_CORE using IConvertible = Newtonsoft.Json.Utilities.Convertible; #endif namespace Newtonsoft.Json { /// /// Provides methods for converting between common language runtime types and JSON types. /// /// /// /// public static class JsonConvert { /// /// Represents JavaScript's boolean value true as a string. This field is read-only. /// public static readonly string True = "true"; /// /// Represents JavaScript's boolean value false as a string. This field is read-only. /// public static readonly string False = "false"; /// /// Represents JavaScript's null as a string. This field is read-only. /// public static readonly string Null = "null"; /// /// Represents JavaScript's undefined as a string. This field is read-only. /// public static readonly string Undefined = "undefined"; /// /// Represents JavaScript's positive infinity as a string. This field is read-only. /// public static readonly string PositiveInfinity = "Infinity"; /// /// Represents JavaScript's negative infinity as a string. This field is read-only. /// public static readonly string NegativeInfinity = "-Infinity"; /// /// Represents JavaScript's NaN as a string. This field is read-only. /// public static readonly string NaN = "NaN"; internal static readonly long InitialJavaScriptDateTicks = 621355968000000000; /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } /// /// Converts the to its JSON string representation using the specified. /// /// The value to convert. /// The format the date will be converted to. /// The time zone handling when the date is converted to a string. /// A JSON string representation of the . public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime updatedDateTime = EnsureDateTime(value, timeZoneHandling); using (StringWriter writer = StringUtils.CreateStringWriter(64)) { WriteDateTimeString(writer, updatedDateTime, updatedDateTime.GetUtcOffset(), updatedDateTime.Kind, format); return writer.ToString(); } } internal static DateTime EnsureDateTime(DateTime value, DateTimeZoneHandling timeZone) { switch (timeZone) { case DateTimeZoneHandling.Local: value = SwitchToLocalTime(value); break; case DateTimeZoneHandling.Utc: value = SwitchToUtcTime(value); break; case DateTimeZoneHandling.Unspecified: value = new DateTime(value.Ticks, DateTimeKind.Unspecified); break; case DateTimeZoneHandling.RoundtripKind: break; default: throw new ArgumentException("Invalid date time handling value."); } return value; } #if !PocketPC && !NET20 /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(DateTimeOffset value) { return ToString(value, DateFormatHandling.IsoDateFormat); } /// /// Converts the to its JSON string representation using the specified. /// /// The value to convert. /// The format the date will be converted to. /// A JSON string representation of the . public static string ToString(DateTimeOffset value, DateFormatHandling format) { using (StringWriter writer = StringUtils.CreateStringWriter(64)) { WriteDateTimeString(writer, (format == DateFormatHandling.IsoDateFormat) ? value.DateTime : value.UtcDateTime, value.Offset, DateTimeKind.Local, format); return writer.ToString(); } } #endif internal static void WriteDateTimeString(TextWriter writer, DateTime value, DateFormatHandling format) { WriteDateTimeString(writer, value, value.GetUtcOffset(), value.Kind, format); } internal static void WriteDateTimeString(TextWriter writer, DateTime value, TimeSpan offset, DateTimeKind kind, DateFormatHandling format) { if (format == DateFormatHandling.MicrosoftDateFormat) { long javaScriptTicks = ConvertDateTimeToJavaScriptTicks(value, offset); writer.Write(@"""\/Date("); writer.Write(javaScriptTicks); switch (kind) { case DateTimeKind.Unspecified: if (value != DateTime.MaxValue && value != DateTime.MinValue) WriteDateTimeOffset(writer, offset, format); break; case DateTimeKind.Local: WriteDateTimeOffset(writer, offset, format); break; } writer.Write(@")\/"""); } else { writer.Write(@""""); writer.Write(value.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFF", CultureInfo.InvariantCulture)); switch (kind) { case DateTimeKind.Local: WriteDateTimeOffset(writer, offset, format); break; case DateTimeKind.Utc: writer.Write("Z"); break; } writer.Write(@""""); } } internal static void WriteDateTimeOffset(TextWriter writer, TimeSpan offset, DateFormatHandling format) { writer.Write((offset.Ticks >= 0L) ? "+" : "-"); int absHours = Math.Abs(offset.Hours); if (absHours < 10) writer.Write(0); writer.Write(absHours); if (format == DateFormatHandling.IsoDateFormat) writer.Write(':'); int absMinutes = Math.Abs(offset.Minutes); if (absMinutes < 10) writer.Write(0); writer.Write(absMinutes); } private static long ToUniversalTicks(DateTime dateTime) { if (dateTime.Kind == DateTimeKind.Utc) return dateTime.Ticks; return ToUniversalTicks(dateTime, dateTime.GetUtcOffset()); } private static long ToUniversalTicks(DateTime dateTime, TimeSpan offset) { // special case min and max value // they never have a timezone appended to avoid issues if (dateTime.Kind == DateTimeKind.Utc || dateTime == DateTime.MaxValue || dateTime == DateTime.MinValue) return dateTime.Ticks; long ticks = dateTime.Ticks - offset.Ticks; if (ticks > 3155378975999999999L) return 3155378975999999999L; if (ticks < 0L) return 0L; return ticks; } internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, TimeSpan offset) { long universialTicks = ToUniversalTicks(dateTime, offset); return UniversialTicksToJavaScriptTicks(universialTicks); } internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime) { return ConvertDateTimeToJavaScriptTicks(dateTime, true); } internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, bool convertToUtc) { long ticks = (convertToUtc) ? ToUniversalTicks(dateTime) : dateTime.Ticks; return UniversialTicksToJavaScriptTicks(ticks); } private static long UniversialTicksToJavaScriptTicks(long universialTicks) { long javaScriptTicks = (universialTicks - InitialJavaScriptDateTicks)/10000; return javaScriptTicks; } internal static DateTime ConvertJavaScriptTicksToDateTime(long javaScriptTicks) { DateTime dateTime = new DateTime((javaScriptTicks*10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc); return dateTime; } private static DateTime SwitchToLocalTime(DateTime value) { switch (value.Kind) { case DateTimeKind.Unspecified: return new DateTime(value.Ticks, DateTimeKind.Local); case DateTimeKind.Utc: return value.ToLocalTime(); case DateTimeKind.Local: return value; } return value; } private static DateTime SwitchToUtcTime(DateTime value) { switch (value.Kind) { case DateTimeKind.Unspecified: return new DateTime(value.Ticks, DateTimeKind.Utc); case DateTimeKind.Utc: return value; case DateTimeKind.Local: return value.ToUniversalTime(); } return value; } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(bool value) { return (value) ? True : False; } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(char value) { return ToString(char.ToString(value)); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(Enum value) { return value.ToString("D"); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || text.IndexOf('.') != -1 || text.IndexOf('E') != -1 || text.IndexOf('e') != -1) return text; return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (text.IndexOf('.') != -1) return text; return text + ".0"; } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(Guid value) { string text = null; #if !(NETFX_CORE || PORTABLE) text = value.ToString("D", CultureInfo.InvariantCulture); #else text = value.ToString("D"); #endif return '"' + text + '"'; } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(TimeSpan value) { return '"' + value.ToString() + '"'; } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(Uri value) { if (value == null) return Null; return ToString(value.ToString()); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(string value) { return ToString(value, '"'); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// The string delimiter character. /// A JSON string representation of the . public static string ToString(string value, char delimter) { return JavaScriptUtils.ToEscapedJavaScriptString(value, delimter, true); } /// /// Converts the to its JSON string representation. /// /// The value to convert. /// A JSON string representation of the . public static string ToString(object value) { if (value == null) return Null; IConvertible convertible = ConvertUtils.ToConvertible(value); if (convertible != null) { switch (convertible.GetTypeCode()) { case TypeCode.String: return ToString(convertible.ToString(CultureInfo.InvariantCulture)); case TypeCode.Char: return ToString(convertible.ToChar(CultureInfo.InvariantCulture)); case TypeCode.Boolean: return ToString(convertible.ToBoolean(CultureInfo.InvariantCulture)); case TypeCode.SByte: return ToString(convertible.ToSByte(CultureInfo.InvariantCulture)); case TypeCode.Int16: return ToString(convertible.ToInt16(CultureInfo.InvariantCulture)); case TypeCode.UInt16: return ToString(convertible.ToUInt16(CultureInfo.InvariantCulture)); case TypeCode.Int32: return ToString(convertible.ToInt32(CultureInfo.InvariantCulture)); case TypeCode.Byte: return ToString(convertible.ToByte(CultureInfo.InvariantCulture)); case TypeCode.UInt32: return ToString(convertible.ToUInt32(CultureInfo.InvariantCulture)); case TypeCode.Int64: return ToString(convertible.ToInt64(CultureInfo.InvariantCulture)); case TypeCode.UInt64: return ToString(convertible.ToUInt64(CultureInfo.InvariantCulture)); case TypeCode.Single: return ToString(convertible.ToSingle(CultureInfo.InvariantCulture)); case TypeCode.Double: return ToString(convertible.ToDouble(CultureInfo.InvariantCulture)); case TypeCode.DateTime: return ToString(convertible.ToDateTime(CultureInfo.InvariantCulture)); case TypeCode.Decimal: return ToString(convertible.ToDecimal(CultureInfo.InvariantCulture)); #if !(NETFX_CORE || PORTABLE) case TypeCode.DBNull: return Null; #endif } } #if !PocketPC && !NET20 else if (value is DateTimeOffset) { return ToString((DateTimeOffset) value); } #endif else if (value is Guid) { return ToString((Guid) value); } else if (value is Uri) { return ToString((Uri) value); } else if (value is TimeSpan) { return ToString((TimeSpan) value); } throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())); } private static bool IsJsonPrimitiveTypeCode(TypeCode typeCode) { switch (typeCode) { case TypeCode.String: case TypeCode.Char: case TypeCode.Boolean: case TypeCode.SByte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.Byte: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: case TypeCode.Single: case TypeCode.Double: case TypeCode.DateTime: case TypeCode.Decimal: #if !(NETFX_CORE || PORTABLE) case TypeCode.DBNull: #endif return true; default: return false; } } internal static bool IsJsonPrimitiveType(Type type) { if (ReflectionUtils.IsNullableType(type)) type = Nullable.GetUnderlyingType(type); #if !PocketPC && !NET20 if (type == typeof (DateTimeOffset)) return true; #endif if (type == typeof (byte[])) return true; if (type == typeof (Uri)) return true; if (type == typeof (TimeSpan)) return true; if (type == typeof (Guid)) return true; return IsJsonPrimitiveTypeCode(ConvertUtils.GetTypeCode(type)); } #region Serialize /// /// Serializes the specified object to a JSON string. /// /// The object to serialize. /// A JSON string representation of the object. public static string SerializeObject(object value) { return SerializeObject(value, Formatting.None, (JsonSerializerSettings) null); } /// /// Serializes the specified object to a JSON string. /// /// The object to serialize. /// Indicates how the output is formatted. /// /// A JSON string representation of the object. /// public static string SerializeObject(object value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings) null); } /// /// Serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// A collection converters used while serializing. /// A JSON string representation of the object. public static string SerializeObject(object value, params JsonConverter[] converters) { return SerializeObject(value, Formatting.None, converters); } /// /// Serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// Indicates how the output is formatted. /// A collection converters used while serializing. /// A JSON string representation of the object. public static string SerializeObject(object value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = (converters != null && converters.Length > 0) ? new JsonSerializerSettings {Converters = converters} : null; return SerializeObject(value, formatting, settings); } /// /// Serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// The used to serialize the object. /// If this is null, default serialization settings will be is used. /// /// A JSON string representation of the object. /// public static string SerializeObject(object value, JsonSerializerSettings settings) { return SerializeObject(value, Formatting.None, settings); } /// /// Serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// Indicates how the output is formatted. /// The used to serialize the object. /// If this is null, default serialization settings will be is used. /// /// A JSON string representation of the object. /// public static string SerializeObject(object value, Formatting formatting, JsonSerializerSettings settings) { JsonSerializer jsonSerializer = JsonSerializer.Create(settings); StringBuilder sb = new StringBuilder(256); StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture); using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) { jsonWriter.Formatting = formatting; jsonSerializer.Serialize(jsonWriter, value); } return sw.ToString(); } #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE) /// /// Asynchronously serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// /// A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. /// public static Task SerializeObjectAsync(object value) { return SerializeObjectAsync(value, Formatting.None, null); } /// /// Asynchronously serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// Indicates how the output is formatted. /// /// A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. /// public static Task SerializeObjectAsync(object value, Formatting formatting) { return SerializeObjectAsync(value, formatting, null); } /// /// Asynchronously serializes the specified object to a JSON string using a collection of . /// /// The object to serialize. /// Indicates how the output is formatted. /// The used to serialize the object. /// If this is null, default serialization settings will be is used. /// /// A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. /// public static Task SerializeObjectAsync(object value, Formatting formatting, JsonSerializerSettings settings) { return Task.Factory.StartNew(() => SerializeObject(value, formatting, settings)); } #endif #endregion #region Deserialize /// /// Deserializes the JSON to a .NET object. /// /// The JSON to deserialize. /// The deserialized object from the Json string. public static object DeserializeObject(string value) { return DeserializeObject(value, null, (JsonSerializerSettings) null); } /// /// Deserializes the JSON to a .NET object. /// /// The JSON to deserialize. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// /// The deserialized object from the JSON string. public static object DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } /// /// Deserializes the JSON to the specified .NET type. /// /// The JSON to deserialize. /// The of object being deserialized. /// The deserialized object from the Json string. public static object DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings) null); } /// /// Deserializes the JSON to the specified .NET type. /// /// The type of the object to deserialize to. /// The JSON to deserialize. /// The deserialized object from the Json string. public static T DeserializeObject(string value) { return DeserializeObject(value, (JsonSerializerSettings) null); } /// /// Deserializes the JSON to the given anonymous type. /// /// /// The anonymous type to deserialize to. This can't be specified /// traditionally and must be infered from the anonymous type passed /// as a parameter. /// /// The JSON to deserialize. /// The anonymous type object. /// The deserialized anonymous type from the JSON string. public static T DeserializeAnonymousType(string value, T anonymousTypeObject) { return DeserializeObject(value); } /// /// Deserializes the JSON to the specified .NET type. /// /// The type of the object to deserialize to. /// The JSON to deserialize. /// Converters to use while deserializing. /// The deserialized object from the JSON string. public static T DeserializeObject(string value, params JsonConverter[] converters) { return (T) DeserializeObject(value, typeof (T), converters); } /// /// Deserializes the JSON to the specified .NET type. /// /// The type of the object to deserialize to. /// The object to deserialize. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// /// The deserialized object from the JSON string. public static T DeserializeObject(string value, JsonSerializerSettings settings) { return (T) DeserializeObject(value, typeof (T), settings); } /// /// Deserializes the JSON to the specified .NET type. /// /// The JSON to deserialize. /// The type of the object to deserialize. /// Converters to use while deserializing. /// The deserialized object from the JSON string. public static object DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = (converters != null && converters.Length > 0) ? new JsonSerializerSettings {Converters = converters} : null; return DeserializeObject(value, type, settings); } /// /// Deserializes the JSON to the specified .NET type. /// /// The JSON to deserialize. /// The type of the object to deserialize to. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// /// The deserialized object from the JSON string. public static object DeserializeObject(string value, Type type, JsonSerializerSettings settings) { ValidationUtils.ArgumentNotNull(value, "value"); StringReader sr = new StringReader(value); JsonSerializer jsonSerializer = JsonSerializer.Create(settings); // by default DeserializeObject should check for additional content if (!jsonSerializer.IsCheckAdditionalContentSet()) jsonSerializer.CheckAdditionalContent = true; return jsonSerializer.Deserialize(new JsonTextReader(sr), type); } #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE) /// /// Asynchronously deserializes the JSON to the specified .NET type. /// /// The type of the object to deserialize to. /// The JSON to deserialize. /// /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. /// public static Task DeserializeObjectAsync(string value) { return DeserializeObjectAsync(value, null); } /// /// Asynchronously deserializes the JSON to the specified .NET type. /// /// The type of the object to deserialize to. /// The JSON to deserialize. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// /// /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. /// public static Task DeserializeObjectAsync(string value, JsonSerializerSettings settings) { return Task.Factory.StartNew(() => DeserializeObject(value, settings)); } /// /// Asynchronously deserializes the JSON to the specified .NET type. /// /// The JSON to deserialize. /// /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. /// public static Task DeserializeObjectAsync(string value) { return DeserializeObjectAsync(value, null, null); } /// /// Asynchronously deserializes the JSON to the specified .NET type. /// /// The JSON to deserialize. /// The type of the object to deserialize to. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// /// /// A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. /// public static Task DeserializeObjectAsync(string value, Type type, JsonSerializerSettings settings) { return Task.Factory.StartNew(() => DeserializeObject(value, type, settings)); } #endif #endregion /// /// Populates the object with values from the JSON string. /// /// The JSON to populate values from. /// The target object to populate values onto. public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } /// /// Populates the object with values from the JSON string. /// /// The JSON to populate values from. /// The target object to populate values onto. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// public static void PopulateObject(string value, object target, JsonSerializerSettings settings) { StringReader sr = new StringReader(value); JsonSerializer jsonSerializer = JsonSerializer.Create(settings); using (JsonReader jsonReader = new JsonTextReader(sr)) { jsonSerializer.Populate(jsonReader, target); if (jsonReader.Read() && jsonReader.TokenType != JsonToken.Comment) throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object."); } } #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE) /// /// Asynchronously populates the object with values from the JSON string. /// /// The JSON to populate values from. /// The target object to populate values onto. /// /// The used to deserialize the object. /// If this is null, default serialization settings will be is used. /// /// /// A task that represents the asynchronous populate operation. /// public static Task PopulateObjectAsync(string value, object target, JsonSerializerSettings settings) { return Task.Factory.StartNew(() => PopulateObject(value, target, settings)); } #endif #if !(SILVERLIGHT || PORTABLE || NETFX_CORE) /// /// Serializes the XML node to a JSON string. /// /// The node to serialize. /// A JSON string of the XmlNode. public static string SerializeXmlNode(XmlNode node) { return SerializeXmlNode(node, Formatting.None); } /// /// Serializes the XML node to a JSON string. /// /// The node to serialize. /// Indicates how the output is formatted. /// A JSON string of the XmlNode. public static string SerializeXmlNode(XmlNode node, Formatting formatting) { XmlNodeConverter converter = new XmlNodeConverter(); return SerializeObject(node, formatting, converter); } /// /// Serializes the XML node to a JSON string. /// /// The node to serialize. /// Indicates how the output is formatted. /// Omits writing the root object. /// A JSON string of the XmlNode. public static string SerializeXmlNode(XmlNode node, Formatting formatting, bool omitRootObject) { XmlNodeConverter converter = new XmlNodeConverter {OmitRootObject = omitRootObject}; return SerializeObject(node, formatting, converter); } /// /// Deserializes the XmlNode from a JSON string. /// /// The JSON string. /// The deserialized XmlNode public static XmlDocument DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } /// /// Deserializes the XmlNode from a JSON string nested in a root elment. /// /// The JSON string. /// The name of the root element to append when deserializing. /// The deserialized XmlNode public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, false); } /// /// Deserializes the XmlNode from a JSON string nested in a root elment. /// /// The JSON string. /// The name of the root element to append when deserializing. /// /// A flag to indicate whether to write the Json.NET array attribute. /// This attribute helps preserve arrays when converting the written XML back to JSON. /// /// The deserialized XmlNode public static XmlDocument DeserializeXmlNode(string value, string deserializeRootElementName, bool writeArrayAttribute) { XmlNodeConverter converter = new XmlNodeConverter(); converter.DeserializeRootElementName = deserializeRootElementName; converter.WriteArrayAttribute = writeArrayAttribute; return (XmlDocument) DeserializeObject(value, typeof (XmlDocument), converter); } #endif #if !NET20 && (!(SILVERLIGHT || PORTABLE) || WINDOWS_PHONE) /// /// Serializes the to a JSON string. /// /// The node to convert to JSON. /// A JSON string of the XNode. public static string SerializeXNode(XObject node) { return SerializeXNode(node, Formatting.None); } /// /// Serializes the to a JSON string. /// /// The node to convert to JSON. /// Indicates how the output is formatted. /// A JSON string of the XNode. public static string SerializeXNode(XObject node, Formatting formatting) { return SerializeXNode(node, formatting, false); } /// /// Serializes the to a JSON string. /// /// The node to serialize. /// Indicates how the output is formatted. /// Omits writing the root object. /// A JSON string of the XNode. public static string SerializeXNode(XObject node, Formatting formatting, bool omitRootObject) { XmlNodeConverter converter = new XmlNodeConverter {OmitRootObject = omitRootObject}; return SerializeObject(node, formatting, converter); } /// /// Deserializes the from a JSON string. /// /// The JSON string. /// The deserialized XNode public static XDocument DeserializeXNode(string value) { return DeserializeXNode(value, null); } /// /// Deserializes the from a JSON string nested in a root elment. /// /// The JSON string. /// The name of the root element to append when deserializing. /// The deserialized XNode public static XDocument DeserializeXNode(string value, string deserializeRootElementName) { return DeserializeXNode(value, deserializeRootElementName, false); } /// /// Deserializes the from a JSON string nested in a root elment. /// /// The JSON string. /// The name of the root element to append when deserializing. /// /// A flag to indicate whether to write the Json.NET array attribute. /// This attribute helps preserve arrays when converting the written XML back to JSON. /// /// The deserialized XNode public static XDocument DeserializeXNode(string value, string deserializeRootElementName, bool writeArrayAttribute) { XmlNodeConverter converter = new XmlNodeConverter(); converter.DeserializeRootElementName = deserializeRootElementName; converter.WriteArrayAttribute = writeArrayAttribute; return (XDocument) DeserializeObject(value, typeof (XDocument), converter); } #endif } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonReaderException.cs0000644000175000017500000001251612253423361027217 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.Runtime.Serialization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json { /// /// The exception thrown when an error occurs while reading Json text. /// #if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE) [Serializable] #endif public class JsonReaderException : JsonException { /// /// Gets the line number indicating where the error occurred. /// /// The line number indicating where the error occurred. public int LineNumber { get; private set; } /// /// Gets the line position indicating where the error occurred. /// /// The line position indicating where the error occurred. public int LinePosition { get; private set; } /// /// Gets the path to the JSON where the error occurred. /// /// The path to the JSON where the error occurred. public string Path { get; private set; } /// /// Initializes a new instance of the class. /// public JsonReaderException() { } /// /// Initializes a new instance of the class /// with a specified error message. /// /// The error message that explains the reason for the exception. public JsonReaderException(string message) : base(message) { } /// /// Initializes a new instance of the class /// with a specified error message and a reference to the inner exception that is the cause of this exception. /// /// The error message that explains the reason for the exception. /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } #if !(WINDOWS_PHONE || SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is null. /// The class name is null or is zero (0). public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif internal JsonReaderException(string message, Exception innerException, string path, int lineNumber, int linePosition) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo lineInfo, string path, string message, Exception ex) { message = FormatExceptionMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, ex, path, lineNumber, linePosition); } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.Metro.csproj0000644000175000017500000003446012253423361030344 0ustar00meebeymeebey00000000000000 Debug AnyCPU 8.0.30703 2.0 {263136A2-B89B-424E-A87A-F988CAA8D032} Library Properties Newtonsoft.Json Newtonsoft.Json en-US 512 {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true full false bin\Debug\Metro\ DEBUG;TRACE;NETFX_CORE prompt 3 pdbonly true bin\Release\Metro\ TRACE;NETFX_CORE prompt 4 bin\Release\Metro\Newtonsoft.Json.xml true bin\ARM\Debug\ DEBUG;TRACE;NETFX_CORE ;2008 full ARM false prompt ExpressRules.ruleset true bin\ARM\Release\ TRACE;NETFX_CORE true ;2008 pdbonly ARM false prompt ExpressRules.ruleset true true bin\x64\Debug\ DEBUG;TRACE;NETFX_CORE ;2008 full x64 false prompt ExpressRules.ruleset true bin\x64\Release\ TRACE;NETFX_CORE true ;2008 pdbonly x64 false prompt ExpressRules.ruleset true true bin\x86\Debug\ DEBUG;TRACE;NETFX_CORE ;2008 full x86 false prompt ExpressRules.ruleset true bin\x86\Release\ TRACE;NETFX_CORE true ;2008 pdbonly x86 false prompt ExpressRules.ruleset true 11.0 smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj0000644000175000017500000003315512253423361031552 0ustar00meebeymeebey00000000000000 v3.5 Debug AnyCPU 9.0.30729 2.0 {DC3C6F3D-2CA1-4278-9B79-63770FB3EA2D} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Newtonsoft.Json Newtonsoft.Json v4.0 false true false 3.5 Silverlight $(TargetFrameworkVersion) publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true false true full false Bin\Debug\Silverlight\ DEBUG;TRACE;SILVERLIGHT true true prompt 4 Bin\Debug\Silverlight\Newtonsoft.Json.xml Newtonsoft.Json.ruleset true pdbonly true Bin\Release\Silverlight\ TRACE;SILVERLIGHT true true prompt 4 Bin\Release\Silverlight\Newtonsoft.Json.xml AllRules.ruleset False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Dynamic.snk0000644000175000017500000000112411655552510025053 0ustar00meebeymeebey00000000000000$RSA2;}x6F,TnzV8v3̼{Zjv] 3ƍgE0"!JJI UOˠIkN򅓰ʵ}r?gОݤ`?* .D8L$de4kBz T&M:=w؞|㹎:'$Bev#c H:FQMs_GxpjMLJETAMVdnn؅'㻢a$xy|{2k\F,ڧzwo|JЩ/( %N7sj_JTkB.ջ:7mFiGb7 =QB`SO*t{/=j3F[TVzJ|HZIf3RXnڣy$`&+}AʃGФULo 0y>]b@OhG{3lįsG)ePՆC乑q`"Oh{l)J /// Specifies how constructors are used when initializing objects during deserialization by the . /// public enum ConstructorHandling { /// /// First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. /// Default = 0, /// /// Json.NET will use a non-public default constructor before falling back to a paramatized constructor. /// AllowNonPublicDefaultConstructor = 1 } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonPropertyAttribute.cs0000644000175000017500000001552412253423361027650 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Instructs the to always serialize the member with the specified name. /// [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { // yuck. can't set nullable properties on an attribute in C# // have to use this approach to get an unset default state internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; /// /// Gets or sets the converter used when serializing the property's collection items. /// /// The collection's items converter. public Type ItemConverterType { get; set; } /// /// Gets or sets the null value handling used when serializing this property. /// /// The null value handling. public NullValueHandling NullValueHandling { get { return _nullValueHandling ?? default(NullValueHandling); } set { _nullValueHandling = value; } } /// /// Gets or sets the default value handling used when serializing this property. /// /// The default value handling. public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling ?? default(DefaultValueHandling); } set { _defaultValueHandling = value; } } /// /// Gets or sets the reference loop handling used when serializing this property. /// /// The reference loop handling. public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling ?? default(ReferenceLoopHandling); } set { _referenceLoopHandling = value; } } /// /// Gets or sets the object creation handling used when deserializing this property. /// /// The object creation handling. public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling ?? default(ObjectCreationHandling); } set { _objectCreationHandling = value; } } /// /// Gets or sets the type name handling used when serializing this property. /// /// The type name handling. public TypeNameHandling TypeNameHandling { get { return _typeNameHandling ?? default(TypeNameHandling); } set { _typeNameHandling = value; } } /// /// Gets or sets whether this property's value is serialized as a reference. /// /// Whether this property's value is serialized as a reference. public bool IsReference { get { return _isReference ?? default(bool); } set { _isReference = value; } } /// /// Gets or sets the order of serialization and deserialization of a member. /// /// The numeric order of serialization or deserialization. public int Order { get { return _order ?? default(int); } set { _order = value; } } /// /// Gets or sets a value indicating whether this property is required. /// /// /// A value indicating whether this property is required. /// public Required Required { get { return _required ?? Required.Default; } set { _required = value; } } /// /// Gets or sets the name of the property. /// /// The name of the property. public string PropertyName { get; set; } /// /// Gets or sets the the reference loop handling used when serializing the property's collection items. /// /// The collection's items reference loop handling. public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling ?? default(ReferenceLoopHandling); } set { _itemReferenceLoopHandling = value; } } /// /// Gets or sets the the type name handling used when serializing the property's collection items. /// /// The collection's items type name handling. public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling ?? default(TypeNameHandling); } set { _itemTypeNameHandling = value; } } /// /// Gets or sets whether this property's collection items are serialized as a reference. /// /// Whether this property's collection items are serialized as a reference. public bool ItemIsReference { get { return _itemIsReference ?? default(bool); } set { _itemIsReference = value; } } /// /// Initializes a new instance of the class. /// public JsonPropertyAttribute() { } /// /// Initializes a new instance of the class with the specified name. /// /// Name of the property. public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/NullValueHandling.cs0000644000175000017500000000373712253423361026665 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Specifies null value handling options for the . /// /// /// /// /// public enum NullValueHandling { /// /// Include null values when serializing and deserializing objects. /// Include = 0, /// /// Ignore null values when serializing and deserializing objects. /// Ignore = 1 } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/SerializationBinder.cs0000644000175000017500000000263112253423361027242 0ustar00meebeymeebey00000000000000#if SILVERLIGHT || PocketPC || NETFX_CORE || PORTABLE using System; using System.Reflection; namespace Newtonsoft.Json { /// /// Allows users to control class loading and mandate what class to load. /// public abstract class SerializationBinder { /// /// When overridden in a derived class, controls the binding of a serialized object to a type. /// /// Specifies the name of the serialized object. /// Specifies the name of the serialized object /// The type of the object the formatter creates a new instance of. public abstract Type BindToType(string assemblyName, string typeName); /// /// When overridden in a derived class, controls the binding of a serialized object to a type. /// /// The type of the object the formatter creates a new instance of. /// Specifies the name of the serialized object. /// Specifies the name of the serialized object. public virtual void BindToName(Type serializedType, out string assemblyName, out string typeName) { assemblyName = null; typeName = null; } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj0000644000175000017500000003106612253423361030145 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Library Properties Newtonsoft.Json Newtonsoft.Json false 3.5 false v2.0 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false true true full false bin\Debug\Net20\ TRACE;DEBUG;NET20 prompt 4 bin\Debug\Net20\Newtonsoft.Json.xml true Newtonsoft.Json.ruleset pdbonly true bin\Release\Net20\ TRACE;NET20 prompt 4 bin\Release\Net20\Newtonsoft.Json.xml AllRules.ruleset False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 2.0 %28x86%29 true False .NET Framework 3.0 %28x86%29 false False .NET Framework 3.5 false False .NET Framework 3.5 SP1 false smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/TypeNameHandling.cs0000644000175000017500000000377212253423361026477 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Specifies type name handling options for the . /// [Flags] public enum TypeNameHandling { /// /// Do not include the .NET type name when serializing types. /// None = 0, /// /// Include the .NET type name when serializing into a JSON object structure. /// Objects = 1, /// /// Include the .NET type name when serializing into a JSON array structure. /// Arrays = 2, /// /// Always include the .NET type name when serializing. /// All = Objects | Arrays, /// /// Include the .NET type name when the type of the object being serialized is not the same as its declared type. /// Auto = 4 } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonSerializerSettings.cs0000644000175000017500000002405512253423361027771 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.Runtime.Serialization.Formatters; using Newtonsoft.Json.Serialization; using System.Runtime.Serialization; namespace Newtonsoft.Json { /// /// Specifies the settings on a object. /// public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const FormatterAssemblyStyle DefaultTypeNameAssemblyFormat = FormatterAssemblyStyle.Simple; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal CultureInfo _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; /// /// Gets or sets how reference loops (e.g. a class referencing itself) is handled. /// /// Reference loop handling. public ReferenceLoopHandling ReferenceLoopHandling { get; set; } /// /// Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. /// /// Missing member handling. public MissingMemberHandling MissingMemberHandling { get; set; } /// /// Gets or sets how objects are created during deserialization. /// /// The object creation handling. public ObjectCreationHandling ObjectCreationHandling { get; set; } /// /// Gets or sets how null values are handled during serialization and deserialization. /// /// Null value handling. public NullValueHandling NullValueHandling { get; set; } /// /// Gets or sets how null default are handled during serialization and deserialization. /// /// The default value handling. public DefaultValueHandling DefaultValueHandling { get; set; } /// /// Gets or sets a collection that will be used during serialization. /// /// The converters. public IList Converters { get; set; } /// /// Gets or sets how object references are preserved by the serializer. /// /// The preserve references handling. public PreserveReferencesHandling PreserveReferencesHandling { get; set; } /// /// Gets or sets how type name writing and reading is handled by the serializer. /// /// The type name handling. public TypeNameHandling TypeNameHandling { get; set; } /// /// Gets or sets how a type name assembly is written and resolved by the serializer. /// /// The type name assembly format. public FormatterAssemblyStyle TypeNameAssemblyFormat { get; set; } /// /// Gets or sets how constructors are used during deserialization. /// /// The constructor handling. public ConstructorHandling ConstructorHandling { get; set; } /// /// Gets or sets the contract resolver used by the serializer when /// serializing .NET objects to JSON and vice versa. /// /// The contract resolver. public IContractResolver ContractResolver { get; set; } /// /// Gets or sets the used by the serializer when resolving references. /// /// The reference resolver. public IReferenceResolver ReferenceResolver { get; set; } /// /// Gets or sets the used by the serializer when resolving type names. /// /// The binder. public SerializationBinder Binder { get; set; } /// /// Gets or sets the error handler called during serialization and deserialization. /// /// The error handler called during serialization and deserialization. public EventHandler Error { get; set; } /// /// Gets or sets the used by the serializer when invoking serialization callback methods. /// /// The context. public StreamingContext Context { get; set; } /// /// Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . /// public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) throw new ArgumentException("Value must be positive.", "value"); _maxDepth = value; _maxDepthSet = true; } } /// /// Indicates how JSON text output is formatted. /// public Formatting Formatting { get { return _formatting ?? DefaultFormatting; } set { _formatting = value; } } /// /// Get or set how dates are written to JSON text. /// public DateFormatHandling DateFormatHandling { get { return _dateFormatHandling ?? DefaultDateFormatHandling; } set { _dateFormatHandling = value; } } /// /// Get or set how time zones are handling during serialization and deserialization. /// public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DefaultDateTimeZoneHandling; } set { _dateTimeZoneHandling = value; } } /// /// Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. /// public DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DefaultDateParseHandling; } set { _dateParseHandling = value; } } /// /// Gets or sets the culture used when reading JSON. Defaults to . /// public CultureInfo Culture { get { return _culture ?? DefaultCulture; } set { _culture = value; } } /// /// Gets a value indicating whether there will be a check for additional content after deserializing an object. /// /// /// true if there will be a check for additional content after deserializing an object; otherwise, false. /// public bool CheckAdditionalContent { get { return _checkAdditionalContent ?? DefaultCheckAdditionalContent; } set { _checkAdditionalContent = value; } } static JsonSerializerSettings() { DefaultContext = new StreamingContext(); DefaultCulture = CultureInfo.InvariantCulture; } /// /// Initializes a new instance of the class. /// public JsonSerializerSettings() { ReferenceLoopHandling = DefaultReferenceLoopHandling; MissingMemberHandling = DefaultMissingMemberHandling; ObjectCreationHandling = DefaultObjectCreationHandling; NullValueHandling = DefaultNullValueHandling; DefaultValueHandling = DefaultDefaultValueHandling; PreserveReferencesHandling = DefaultPreserveReferencesHandling; TypeNameHandling = DefaultTypeNameHandling; TypeNameAssemblyFormat = DefaultTypeNameAssemblyFormat; Context = DefaultContext; Converters = new List(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/IJsonLineInfo.cs0000644000175000017500000000405112253423361025745 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Provides an interface to enable a class to return line and position information. /// public interface IJsonLineInfo { /// /// Gets a value indicating whether the class can return line information. /// /// /// true if LineNumber and LinePosition can be provided; otherwise, false. /// bool HasLineInfo(); /// /// Gets the current line number. /// /// The current line number or 0 if no line information is available (for example, HasLineInfo returns false). int LineNumber { get; } /// /// Gets the current line position. /// /// The current line position or 0 if no line information is available (for example, HasLineInfo returns false). int LinePosition { get; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonTextWriter.cs0000644000175000017500000003576412253423361026271 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.IO; using System.Xml; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json { /// /// Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. /// public class JsonTextWriter : JsonWriter { private readonly TextWriter _writer; private Base64Encoder _base64Encoder; private char _indentChar; private int _indentation; private char _quoteChar; private bool _quoteName; private Base64Encoder Base64Encoder { get { if (_base64Encoder == null) _base64Encoder = new Base64Encoder(_writer); return _base64Encoder; } } /// /// Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented. /// public int Indentation { get { return _indentation; } set { if (value < 0) throw new ArgumentException("Indentation value must be greater than 0."); _indentation = value; } } /// /// Gets or sets which character to use to quote attribute values. /// public char QuoteChar { get { return _quoteChar; } set { if (value != '"' && value != '\'') throw new ArgumentException(@"Invalid JavaScript string quote character. Valid quote characters are ' and ""."); _quoteChar = value; } } /// /// Gets or sets which character to use for indenting when is set to Formatting.Indented. /// public char IndentChar { get { return _indentChar; } set { _indentChar = value; } } /// /// Gets or sets a value indicating whether object names will be surrounded with quotes. /// public bool QuoteName { get { return _quoteName; } set { _quoteName = value; } } /// /// Creates an instance of the JsonWriter class using the specified . /// /// The TextWriter to write to. public JsonTextWriter(TextWriter textWriter) { if (textWriter == null) throw new ArgumentNullException("textWriter"); _writer = textWriter; _quoteChar = '"'; _quoteName = true; _indentChar = ' '; _indentation = 2; } /// /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. /// public override void Flush() { _writer.Flush(); } /// /// Closes this stream and the underlying stream. /// public override void Close() { base.Close(); if (CloseOutput && _writer != null) #if !(NETFX_CORE || PORTABLE) _writer.Close(); #else _writer.Dispose(); #endif } /// /// Writes the beginning of a Json object. /// public override void WriteStartObject() { base.WriteStartObject(); _writer.Write("{"); } /// /// Writes the beginning of a Json array. /// public override void WriteStartArray() { base.WriteStartArray(); _writer.Write("["); } /// /// Writes the start of a constructor with the given name. /// /// The name of the constructor. public override void WriteStartConstructor(string name) { base.WriteStartConstructor(name); _writer.Write("new "); _writer.Write(name); _writer.Write("("); } /// /// Writes the specified end token. /// /// The end token to write. protected override void WriteEnd(JsonToken token) { switch (token) { case JsonToken.EndObject: _writer.Write("}"); break; case JsonToken.EndArray: _writer.Write("]"); break; case JsonToken.EndConstructor: _writer.Write(")"); break; default: throw JsonWriterException.Create(this, "Invalid JsonToken: " + token, null); } } /// /// Writes the property name of a name/value pair on a Json object. /// /// The name of the property. public override void WritePropertyName(string name) { base.WritePropertyName(name); JavaScriptUtils.WriteEscapedJavaScriptString(_writer, name, _quoteChar, _quoteName); _writer.Write(':'); } /// /// Writes indent characters. /// protected override void WriteIndent() { _writer.Write(Environment.NewLine); // levels of indentation multiplied by the indent count int currentIndentCount = Top*_indentation; while (currentIndentCount > 0) { // write up to a max of 10 characters at once to avoid creating too many new strings int writeCount = Math.Min(currentIndentCount, 10); _writer.Write(new string(_indentChar, writeCount)); currentIndentCount -= writeCount; } } /// /// Writes the JSON value delimiter. /// protected override void WriteValueDelimiter() { _writer.Write(','); } /// /// Writes an indent space. /// protected override void WriteIndentSpace() { _writer.Write(' '); } private void WriteValueInternal(string value, JsonToken token) { _writer.Write(value); } #region WriteValue methods /// /// Writes a null value. /// public override void WriteNull() { base.WriteNull(); WriteValueInternal(JsonConvert.Null, JsonToken.Null); } /// /// Writes an undefined value. /// public override void WriteUndefined() { base.WriteUndefined(); WriteValueInternal(JsonConvert.Undefined, JsonToken.Undefined); } /// /// Writes raw JSON. /// /// The raw JSON to write. public override void WriteRaw(string json) { base.WriteRaw(json); _writer.Write(json); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(string value) { base.WriteValue(value); if (value == null) WriteValueInternal(JsonConvert.Null, JsonToken.Null); else JavaScriptUtils.WriteEscapedJavaScriptString(_writer, value, _quoteChar, true); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(int value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(uint value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(long value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(ulong value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(float value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(double value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(bool value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Boolean); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(short value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(ushort value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(char value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(byte value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(sbyte value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(decimal value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(DateTime value) { base.WriteValue(value); value = JsonConvert.EnsureDateTime(value, DateTimeZoneHandling); JsonConvert.WriteDateTimeString(_writer, value, DateFormatHandling); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(byte[] value) { base.WriteValue(value); if (value != null) { _writer.Write(_quoteChar); Base64Encoder.Encode(value, 0, value.Length); Base64Encoder.Flush(); _writer.Write(_quoteChar); } } #if !PocketPC && !NET20 /// /// Writes a value. /// /// The value to write. public override void WriteValue(DateTimeOffset value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value, DateFormatHandling), JsonToken.Date); } #endif /// /// Writes a value. /// /// The value to write. public override void WriteValue(Guid value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.String); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(TimeSpan value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.String); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(Uri value) { base.WriteValue(value); WriteValueInternal(JsonConvert.ToString(value), JsonToken.String); } #endregion /// /// Writes out a comment /*...*/ containing the specified text. /// /// Text to place inside the comment. public override void WriteComment(string text) { base.WriteComment(text); _writer.Write("/*"); _writer.Write(text); _writer.Write("*/"); } /// /// Writes out the given white space. /// /// The string of white space characters. public override void WriteWhitespace(string ws) { base.WriteWhitespace(ws); _writer.Write(ws); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Properties/0000755000175000017500000000000012253423361025104 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs0000644000175000017500000001011712253423361030026 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. #if WINDOWS_PHONE [assembly: AssemblyTitle("Json.NET Windows Phone")] #elif SILVERLIGHT [assembly: AssemblyTitle("Json.NET Silverlight")] #elif PocketPC [assembly: AssemblyTitle("Json.NET Compact")] #elif PORTABLE [assembly: AssemblyTitle("Json.NET Portable")] #elif NETFX_CORE [assembly: AssemblyTitle("Json.NET Metro")] [assembly: SecurityTransparent] #elif NET20 [assembly: AssemblyTitle("Json.NET .NET 2.0")] [assembly: AllowPartiallyTrustedCallers] #elif NET35 [assembly: AssemblyTitle("Json.NET .NET 3.5")] [assembly: AllowPartiallyTrustedCallers] #else [assembly: AssemblyTitle("Json.NET")] [assembly: AllowPartiallyTrustedCallers] #endif #if !SIGNED [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests")] #else [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] #endif [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyCopyright("Copyright James Newton-King 2008")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] #if !PORTABLE // Setting ComVisible to false makes the types in this assembly not visible // to COM componenets. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] #endif // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("4.5.0.0")] #if !PocketPC [assembly: AssemblyFileVersion("4.5.8.15205")] #endif [assembly: CLSCompliant(true)] smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonContainerAttribute.cs0000644000175000017500000001050512253423361027740 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Instructs the how to serialize the object. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { /// /// Gets or sets the id. /// /// The id. public string Id { get; set; } /// /// Gets or sets the title. /// /// The title. public string Title { get; set; } /// /// Gets or sets the description. /// /// The description. public string Description { get; set; } /// /// Gets the collection's items converter. /// /// The collection's items converter. public Type ItemConverterType { get; set; } // yuck. can't set nullable properties on an attribute in C# // have to use this approach to get an unset default state internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; /// /// Gets or sets a value that indicates whether to preserve object references. /// /// /// true to keep object reference; otherwise, false. The default is false. /// public bool IsReference { get { return _isReference ?? default(bool); } set { _isReference = value; } } /// /// Gets or sets a value that indicates whether to preserve collection's items references. /// /// /// true to keep collection's items object references; otherwise, false. The default is false. /// public bool ItemIsReference { get { return _itemIsReference ?? default(bool); } set { _itemIsReference = value; } } /// /// Gets or sets the reference loop handling used when serializing the collection's items. /// /// The reference loop handling. public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling ?? default(ReferenceLoopHandling); } set { _itemReferenceLoopHandling = value; } } /// /// Gets or sets the type name handling used when serializing the collection's items. /// /// The type name handling. public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling ?? default(TypeNameHandling); } set { _itemTypeNameHandling = value; } } /// /// Initializes a new instance of the class. /// protected JsonContainerAttribute() { } /// /// Initializes a new instance of the class with the specified container Id. /// /// The container Id. protected JsonContainerAttribute(string id) { Id = id; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonWriter.cs0000644000175000017500000011336212253423361025413 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.IO; using Newtonsoft.Json.Utilities; using System.Globalization; #if NETFX_CORE using IConvertible = Newtonsoft.Json.Utilities.Convertible; #endif #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json { /// /// Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. /// public abstract class JsonWriter : IDisposable { internal enum State { Start, Property, ObjectStart, Object, ArrayStart, Array, ConstructorStart, Constructor, Bytes, Closed, Error } // array that gives a new state based on the current state an the token being written private static readonly State[][] StateArray; internal static readonly State[][] StateArrayTempate = new[] { // Start PropertyName ObjectStart Object ArrayStart Array ConstructorStart Constructor Closed Error // /* None */new[]{ State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error }, /* StartObject */new[]{ State.ObjectStart, State.ObjectStart, State.Error, State.Error, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.ObjectStart, State.Error, State.Error }, /* StartArray */new[]{ State.ArrayStart, State.ArrayStart, State.Error, State.Error, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.ArrayStart, State.Error, State.Error }, /* StartConstructor */new[]{ State.ConstructorStart, State.ConstructorStart, State.Error, State.Error, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.ConstructorStart, State.Error, State.Error }, /* StartProperty */new[]{ State.Property, State.Error, State.Property, State.Property, State.Error, State.Error, State.Error, State.Error, State.Error, State.Error }, /* Comment */new[]{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, /* Raw */new[]{ State.Start, State.Property, State.ObjectStart, State.Object, State.ArrayStart, State.Array, State.Constructor, State.Constructor, State.Error, State.Error }, /* Value (this will be copied) */new[]{ State.Start, State.Object, State.Error, State.Error, State.Array, State.Array, State.Constructor, State.Constructor, State.Error, State.Error } }; internal static State[][] BuildStateArray() { var allStates = StateArrayTempate.ToList(); var errorStates = StateArrayTempate[0]; var valueStates = StateArrayTempate[7]; foreach (JsonToken valueToken in EnumUtils.GetValues(typeof(JsonToken))) { if (allStates.Count <= (int)valueToken) { switch (valueToken) { case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: allStates.Add(valueStates); break; default: allStates.Add(errorStates); break; } } } return allStates.ToArray(); } static JsonWriter() { StateArray = BuildStateArray(); } private readonly List _stack; private JsonPosition _currentPosition; private State _currentState; private Formatting _formatting; /// /// Gets or sets a value indicating whether the underlying stream or /// should be closed when the writer is closed. /// /// /// true to close the underlying stream or when /// the writer is closed; otherwise false. The default is true. /// public bool CloseOutput { get; set; } /// /// Gets the top. /// /// The top. protected internal int Top { get { int depth = _stack.Count; if (Peek() != JsonContainerType.None) depth++; return depth; } } internal string ContainerPath { get { if (_currentPosition.Type == JsonContainerType.None) return string.Empty; IEnumerable positions = (_currentPosition.InsideContainer()) ? _stack : _stack.Concat(new[] { _currentPosition }); return JsonPosition.BuildPath(positions); } } /// /// Gets the state of the writer. /// public WriteState WriteState { get { switch (_currentState) { case State.Error: return WriteState.Error; case State.Closed: return WriteState.Closed; case State.Object: case State.ObjectStart: return WriteState.Object; case State.Array: case State.ArrayStart: return WriteState.Array; case State.Constructor: case State.ConstructorStart: return WriteState.Constructor; case State.Property: return WriteState.Property; case State.Start: return WriteState.Start; default: throw JsonWriterException.Create(this, "Invalid state: " + _currentState, null); } } } /// /// Gets the path of the writer. /// public string Path { get { if (_currentPosition.Type == JsonContainerType.None) return string.Empty; return JsonPosition.BuildPath(_stack.Concat(new[] { _currentPosition })); } } private DateFormatHandling _dateFormatHandling; private DateTimeZoneHandling _dateTimeZoneHandling; /// /// Indicates how JSON text output is formatted. /// public Formatting Formatting { get { return _formatting; } set { _formatting = value; } } /// /// Get or set how dates are written to JSON text. /// public DateFormatHandling DateFormatHandling { get { return _dateFormatHandling; } set { _dateFormatHandling = value; } } /// /// Get or set how time zones are handling when writing JSON. /// public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { _dateTimeZoneHandling = value; } } /// /// Creates an instance of the JsonWriter class. /// protected JsonWriter() { _stack = new List(4); _currentState = State.Start; _formatting = Formatting.None; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; CloseOutput = true; } private void UpdateScopeWithFinishedValue() { if (_currentPosition.Type == JsonContainerType.Array || _currentPosition.Type == JsonContainerType.Constructor) { if (_currentPosition.Position == null) _currentPosition.Position = 0; else _currentPosition.Position++; } } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition.Type = value; } else { _stack.Add(_currentPosition); var state = new JsonPosition { Type = value }; _currentPosition = state; } } private JsonContainerType Pop() { JsonPosition oldPosition; if (_stack.Count > 0) { oldPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { oldPosition = _currentPosition; _currentPosition = new JsonPosition(); } return oldPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } /// /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. /// public abstract void Flush(); /// /// Closes this stream and the underlying stream. /// public virtual void Close() { AutoCompleteAll(); } /// /// Writes the beginning of a Json object. /// public virtual void WriteStartObject() { AutoComplete(JsonToken.StartObject); Push(JsonContainerType.Object); } /// /// Writes the end of a Json object. /// public virtual void WriteEndObject() { AutoCompleteClose(JsonToken.EndObject); } /// /// Writes the beginning of a Json array. /// public virtual void WriteStartArray() { AutoComplete(JsonToken.StartArray); Push(JsonContainerType.Array); } /// /// Writes the end of an array. /// public virtual void WriteEndArray() { AutoCompleteClose(JsonToken.EndArray); } /// /// Writes the start of a constructor with the given name. /// /// The name of the constructor. public virtual void WriteStartConstructor(string name) { AutoComplete(JsonToken.StartConstructor); Push(JsonContainerType.Constructor); } /// /// Writes the end constructor. /// public virtual void WriteEndConstructor() { AutoCompleteClose(JsonToken.EndConstructor); } /// /// Writes the property name of a name/value pair on a Json object. /// /// The name of the property. public virtual void WritePropertyName(string name) { _currentPosition.PropertyName = name; AutoComplete(JsonToken.PropertyName); } /// /// Writes the end of the current Json object or array. /// public virtual void WriteEnd() { WriteEnd(Peek()); } /// /// Writes the current token. /// /// The to read the token from. public void WriteToken(JsonReader reader) { ValidationUtils.ArgumentNotNull(reader, "reader"); int initialDepth; if (reader.TokenType == JsonToken.None) initialDepth = -1; else if (!IsStartToken(reader.TokenType)) initialDepth = reader.Depth + 1; else initialDepth = reader.Depth; WriteToken(reader, initialDepth); } internal void WriteToken(JsonReader reader, int initialDepth) { do { switch (reader.TokenType) { case JsonToken.None: // read to next break; case JsonToken.StartObject: WriteStartObject(); break; case JsonToken.StartArray: WriteStartArray(); break; case JsonToken.StartConstructor: string constructorName = reader.Value.ToString(); // write a JValue date when the constructor is for a date if (string.Equals(constructorName, "Date", StringComparison.Ordinal)) WriteConstructorDate(reader); else WriteStartConstructor(reader.Value.ToString()); break; case JsonToken.PropertyName: WritePropertyName(reader.Value.ToString()); break; case JsonToken.Comment: WriteComment(reader.Value.ToString()); break; case JsonToken.Integer: WriteValue(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); break; case JsonToken.Float: WriteValue(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture)); break; case JsonToken.String: WriteValue(reader.Value.ToString()); break; case JsonToken.Boolean: WriteValue(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); break; case JsonToken.Null: WriteNull(); break; case JsonToken.Undefined: WriteUndefined(); break; case JsonToken.EndObject: WriteEndObject(); break; case JsonToken.EndArray: WriteEndArray(); break; case JsonToken.EndConstructor: WriteEndConstructor(); break; case JsonToken.Date: WriteValue((DateTime)reader.Value); break; case JsonToken.Raw: WriteRawValue((string)reader.Value); break; case JsonToken.Bytes: WriteValue((byte[])reader.Value); break; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("TokenType", reader.TokenType, "Unexpected token type."); } } while ( // stop if we have reached the end of the token being read initialDepth - 1 < reader.Depth - (IsEndToken(reader.TokenType) ? 1 : 0) && reader.Read()); } private void WriteConstructorDate(JsonReader reader) { if (!reader.Read()) throw JsonWriterException.Create(this, "Unexpected end when reading date constructor.", null); if (reader.TokenType != JsonToken.Integer) throw JsonWriterException.Create(this, "Unexpected token when reading date constructor. Expected Integer, got " + reader.TokenType, null); long ticks = (long)reader.Value; DateTime date = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks); if (!reader.Read()) throw JsonWriterException.Create(this, "Unexpected end when reading date constructor.", null); if (reader.TokenType != JsonToken.EndConstructor) throw JsonWriterException.Create(this, "Unexpected token when reading date constructor. Expected EndConstructor, got " + reader.TokenType, null); WriteValue(date); } private bool IsEndToken(JsonToken token) { switch (token) { case JsonToken.EndObject: case JsonToken.EndArray: case JsonToken.EndConstructor: return true; default: return false; } } private bool IsStartToken(JsonToken token) { switch (token) { case JsonToken.StartObject: case JsonToken.StartArray: case JsonToken.StartConstructor: return true; default: return false; } } private void WriteEnd(JsonContainerType type) { switch (type) { case JsonContainerType.Object: WriteEndObject(); break; case JsonContainerType.Array: WriteEndArray(); break; case JsonContainerType.Constructor: WriteEndConstructor(); break; default: throw JsonWriterException.Create(this, "Unexpected type when writing end: " + type, null); } } private void AutoCompleteAll() { while (Top > 0) { WriteEnd(); } } private JsonContainerType GetTypeForCloseToken(JsonToken token) { switch (token) { case JsonToken.EndObject: return JsonContainerType.Object; case JsonToken.EndArray: return JsonContainerType.Array; case JsonToken.EndConstructor: return JsonContainerType.Constructor; default: throw JsonWriterException.Create(this, "No type for token: " + token, null); } } private JsonToken GetCloseTokenForType(JsonContainerType type) { switch (type) { case JsonContainerType.Object: return JsonToken.EndObject; case JsonContainerType.Array: return JsonToken.EndArray; case JsonContainerType.Constructor: return JsonToken.EndConstructor; default: throw JsonWriterException.Create(this, "No close token for type: " + type, null); } } private void AutoCompleteClose(JsonToken tokenBeingClosed) { // write closing symbol and calculate new state int levelsToComplete = 0; JsonContainerType type = GetTypeForCloseToken(tokenBeingClosed); if (_currentPosition.Type == type) { levelsToComplete = 1; } else { int top = Top - 2; for (int i = top; i >= 0; i--) { int currentLevel = top - i; if (_stack[currentLevel].Type == type) { levelsToComplete = i + 2; break; } } } if (levelsToComplete == 0) throw JsonWriterException.Create(this, "No token to close.", null); for (int i = 0; i < levelsToComplete; i++) { JsonToken token = GetCloseTokenForType(Pop()); if (_currentState == State.Property) WriteNull(); if (_formatting == Formatting.Indented) { if (_currentState != State.ObjectStart && _currentState != State.ArrayStart) WriteIndent(); } WriteEnd(token); JsonContainerType currentLevelType = Peek(); switch (currentLevelType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Array; break; case JsonContainerType.None: _currentState = State.Start; break; default: throw JsonWriterException.Create(this, "Unknown JsonType: " + currentLevelType, null); } } } /// /// Writes the specified end token. /// /// The end token to write. protected virtual void WriteEnd(JsonToken token) { } /// /// Writes indent characters. /// protected virtual void WriteIndent() { } /// /// Writes the JSON value delimiter. /// protected virtual void WriteValueDelimiter() { } /// /// Writes an indent space. /// protected virtual void WriteIndentSpace() { } internal void AutoComplete(JsonToken tokenBeingWritten) { if (tokenBeingWritten != JsonToken.StartObject && tokenBeingWritten != JsonToken.StartArray && tokenBeingWritten != JsonToken.StartConstructor) UpdateScopeWithFinishedValue(); // gets new state based on the current state and what is being written State newState = StateArray[(int)tokenBeingWritten][(int)_currentState]; if (newState == State.Error) throw JsonWriterException.Create(this, "Token {0} in state {1} would result in an invalid JSON object.".FormatWith(CultureInfo.InvariantCulture, tokenBeingWritten.ToString(), _currentState.ToString()), null); if ((_currentState == State.Object || _currentState == State.Array || _currentState == State.Constructor) && tokenBeingWritten != JsonToken.Comment) { WriteValueDelimiter(); } else if (_currentState == State.Property) { if (_formatting == Formatting.Indented) WriteIndentSpace(); } if (_formatting == Formatting.Indented) { WriteState writeState = WriteState; // don't indent a property when it is the first token to be written (i.e. at the start) if ((tokenBeingWritten == JsonToken.PropertyName && writeState != WriteState.Start) || writeState == WriteState.Array || writeState == WriteState.Constructor) { WriteIndent(); } } _currentState = newState; } #region WriteValue methods /// /// Writes a null value. /// public virtual void WriteNull() { AutoComplete(JsonToken.Null); } /// /// Writes an undefined value. /// public virtual void WriteUndefined() { AutoComplete(JsonToken.Undefined); } /// /// Writes raw JSON without changing the writer's state. /// /// The raw JSON to write. public virtual void WriteRaw(string json) { } /// /// Writes raw JSON where a value is expected and updates the writer's state. /// /// The raw JSON to write. public virtual void WriteRawValue(string json) { // hack. want writer to change state as if a value had been written AutoComplete(JsonToken.Undefined); WriteRaw(json); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(string value) { AutoComplete(JsonToken.String); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(int value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(uint value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(long value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(ulong value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(float value) { AutoComplete(JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(double value) { AutoComplete(JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(bool value) { AutoComplete(JsonToken.Boolean); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(short value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(ushort value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(char value) { AutoComplete(JsonToken.String); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(byte value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(sbyte value) { AutoComplete(JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(decimal value) { AutoComplete(JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(DateTime value) { AutoComplete(JsonToken.Date); } #if !PocketPC && !NET20 /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(DateTimeOffset value) { AutoComplete(JsonToken.Date); } #endif /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(Guid value) { AutoComplete(JsonToken.String); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(TimeSpan value) { AutoComplete(JsonToken.String); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(int? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(uint? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(long? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(ulong? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(float? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(double? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(bool? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(short? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(ushort? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(char? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(byte? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public virtual void WriteValue(sbyte? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(decimal? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(DateTime? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } #if !PocketPC && !NET20 /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(DateTimeOffset? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } #endif /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(Guid? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(TimeSpan? value) { if (value == null) WriteNull(); else WriteValue(value.Value); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(byte[] value) { if (value == null) WriteNull(); else AutoComplete(JsonToken.Bytes); } /// /// Writes a value. /// /// The value to write. public virtual void WriteValue(Uri value) { if (value == null) WriteNull(); else AutoComplete(JsonToken.String); } /// /// Writes a value. /// An error will raised if the value cannot be written as a single JSON token. /// /// The value to write. public virtual void WriteValue(object value) { if (value == null) { WriteNull(); return; } else if (ConvertUtils.IsConvertible(value)) { IConvertible convertible = ConvertUtils.ToConvertible(value); switch (convertible.GetTypeCode()) { case TypeCode.String: WriteValue(convertible.ToString(CultureInfo.InvariantCulture)); return; case TypeCode.Char: WriteValue(convertible.ToChar(CultureInfo.InvariantCulture)); return; case TypeCode.Boolean: WriteValue(convertible.ToBoolean(CultureInfo.InvariantCulture)); return; case TypeCode.SByte: WriteValue(convertible.ToSByte(CultureInfo.InvariantCulture)); return; case TypeCode.Int16: WriteValue(convertible.ToInt16(CultureInfo.InvariantCulture)); return; case TypeCode.UInt16: WriteValue(convertible.ToUInt16(CultureInfo.InvariantCulture)); return; case TypeCode.Int32: WriteValue(convertible.ToInt32(CultureInfo.InvariantCulture)); return; case TypeCode.Byte: WriteValue(convertible.ToByte(CultureInfo.InvariantCulture)); return; case TypeCode.UInt32: WriteValue(convertible.ToUInt32(CultureInfo.InvariantCulture)); return; case TypeCode.Int64: WriteValue(convertible.ToInt64(CultureInfo.InvariantCulture)); return; case TypeCode.UInt64: WriteValue(convertible.ToUInt64(CultureInfo.InvariantCulture)); return; case TypeCode.Single: WriteValue(convertible.ToSingle(CultureInfo.InvariantCulture)); return; case TypeCode.Double: WriteValue(convertible.ToDouble(CultureInfo.InvariantCulture)); return; case TypeCode.DateTime: WriteValue(convertible.ToDateTime(CultureInfo.InvariantCulture)); return; case TypeCode.Decimal: WriteValue(convertible.ToDecimal(CultureInfo.InvariantCulture)); return; #if !(NETFX_CORE || PORTABLE) case TypeCode.DBNull: WriteNull(); return; #endif } } #if !PocketPC && !NET20 else if (value is DateTimeOffset) { WriteValue((DateTimeOffset)value); return; } #endif else if (value is byte[]) { WriteValue((byte[])value); return; } else if (value is Guid) { WriteValue((Guid)value); return; } else if (value is Uri) { WriteValue((Uri)value); return; } else if (value is TimeSpan) { WriteValue((TimeSpan)value); return; } throw JsonWriterException.Create(this, "Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType()), null); } #endregion /// /// Writes out a comment /*...*/ containing the specified text. /// /// Text to place inside the comment. public virtual void WriteComment(string text) { AutoComplete(JsonToken.Comment); } /// /// Writes out the given white space. /// /// The string of white space characters. public virtual void WriteWhitespace(string ws) { if (ws != null) { if (!StringUtils.IsWhiteSpace(ws)) throw JsonWriterException.Create(this, "Only white space characters should be used.", null); } } void IDisposable.Dispose() { Dispose(true); } private void Dispose(bool disposing) { if (_currentState != State.Closed) Close(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/0000755000175000017500000000000012253423361025565 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonSerializerProxy.cs0000644000175000017500000001523512253423361032127 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.Runtime.Serialization.Formatters; using Newtonsoft.Json.Utilities; using System.Runtime.Serialization; namespace Newtonsoft.Json.Serialization { internal class JsonSerializerProxy : JsonSerializer { private readonly JsonSerializerInternalReader _serializerReader; private readonly JsonSerializerInternalWriter _serializerWriter; private readonly JsonSerializer _serializer; public override event EventHandler Error { add { _serializer.Error += value; } remove { _serializer.Error -= value; } } public override IReferenceResolver ReferenceResolver { get { return _serializer.ReferenceResolver; } set { _serializer.ReferenceResolver = value; } } public override JsonConverterCollection Converters { get { return _serializer.Converters; } } public override DefaultValueHandling DefaultValueHandling { get { return _serializer.DefaultValueHandling; } set { _serializer.DefaultValueHandling = value; } } public override IContractResolver ContractResolver { get { return _serializer.ContractResolver; } set { _serializer.ContractResolver = value; } } public override MissingMemberHandling MissingMemberHandling { get { return _serializer.MissingMemberHandling; } set { _serializer.MissingMemberHandling = value; } } public override NullValueHandling NullValueHandling { get { return _serializer.NullValueHandling; } set { _serializer.NullValueHandling = value; } } public override ObjectCreationHandling ObjectCreationHandling { get { return _serializer.ObjectCreationHandling; } set { _serializer.ObjectCreationHandling = value; } } public override ReferenceLoopHandling ReferenceLoopHandling { get { return _serializer.ReferenceLoopHandling; } set { _serializer.ReferenceLoopHandling = value; } } public override PreserveReferencesHandling PreserveReferencesHandling { get { return _serializer.PreserveReferencesHandling; } set { _serializer.PreserveReferencesHandling = value; } } public override TypeNameHandling TypeNameHandling { get { return _serializer.TypeNameHandling; } set { _serializer.TypeNameHandling = value; } } public override FormatterAssemblyStyle TypeNameAssemblyFormat { get { return _serializer.TypeNameAssemblyFormat; } set { _serializer.TypeNameAssemblyFormat = value; } } public override ConstructorHandling ConstructorHandling { get { return _serializer.ConstructorHandling; } set { _serializer.ConstructorHandling = value; } } public override SerializationBinder Binder { get { return _serializer.Binder; } set { _serializer.Binder = value; } } public override StreamingContext Context { get { return _serializer.Context; } set { _serializer.Context = value; } } public override Formatting Formatting { get { return _serializer.Formatting; } set { _serializer.Formatting = value; } } public override DateFormatHandling DateFormatHandling { get { return _serializer.DateFormatHandling; } set { _serializer.DateFormatHandling = value; } } public override DateTimeZoneHandling DateTimeZoneHandling { get { return _serializer.DateTimeZoneHandling; } set { _serializer.DateTimeZoneHandling = value; } } public override DateParseHandling DateParseHandling { get { return _serializer.DateParseHandling; } set { _serializer.DateParseHandling = value; } } public override CultureInfo Culture { get { return _serializer.Culture; } set { _serializer.Culture = value; } } public override int? MaxDepth { get { return _serializer.MaxDepth; } set { _serializer.MaxDepth = value; } } public override bool CheckAdditionalContent { get { return _serializer.CheckAdditionalContent; } set { _serializer.CheckAdditionalContent = value; } } internal JsonSerializerInternalBase GetInternalSerializer() { if (_serializerReader != null) return _serializerReader; else return _serializerWriter; } public JsonSerializerProxy(JsonSerializerInternalReader serializerReader) { ValidationUtils.ArgumentNotNull(serializerReader, "serializerReader"); _serializerReader = serializerReader; _serializer = serializerReader.Serializer; } public JsonSerializerProxy(JsonSerializerInternalWriter serializerWriter) { ValidationUtils.ArgumentNotNull(serializerWriter, "serializerWriter"); _serializerWriter = serializerWriter; _serializer = serializerWriter.Serializer; } internal override object DeserializeInternal(JsonReader reader, Type objectType) { if (_serializerReader != null) return _serializerReader.Deserialize(reader, objectType, false); else return _serializer.Deserialize(reader, objectType); } internal override void PopulateInternal(JsonReader reader, object target) { if (_serializerReader != null) _serializerReader.Populate(reader, target); else _serializer.Populate(reader, target); } internal override void SerializeInternal(JsonWriter jsonWriter, object value) { if (_serializerWriter != null) _serializerWriter.Serialize(jsonWriter, value); else _serializer.Serialize(jsonWriter, value); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/ErrorEventArgs.cs0000644000175000017500000000415312253423361031027 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// Provides data for the Error event. /// public class ErrorEventArgs : EventArgs { /// /// Gets the current object the error event is being raised against. /// /// The current object the error event is being raised against. public object CurrentObject { get; private set; } /// /// Gets the error context. /// /// The error context. public ErrorContext ErrorContext { get; private set; } /// /// Initializes a new instance of the class. /// /// The current object. /// The error context. public ErrorEventArgs(object currentObject, ErrorContext errorContext) { CurrentObject = currentObject; ErrorContext = errorContext; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonDynamicContract.cs0000644000175000017500000000451312253423361032033 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System; using System.Collections.Generic; using System.Reflection; using Newtonsoft.Json.Utilities; using System.Collections; namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonDynamicContract : JsonContainerContract { /// /// Gets the object's properties. /// /// The object's properties. public JsonPropertyCollection Properties { get; private set; } /// /// Gets or sets the property name resolver. /// /// The property name resolver. public Func PropertyNameResolver { get; set; } /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonDynamicContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Dynamic; Properties = new JsonPropertyCollection(UnderlyingType); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonContainerContract.cs0000644000175000017500000001011412253423361032363 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Reflection; using Newtonsoft.Json.Utilities; using System.Collections; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonContainerContract : JsonContract { private JsonContract _itemContract; private JsonContract _finalItemContract; // will be null for containers that don't have an item type (e.g. IList) or for complex objects internal JsonContract ItemContract { get { return _itemContract; } set { _itemContract = value; if (_itemContract != null) { _finalItemContract = (_itemContract.UnderlyingType.IsSealed()) ? _itemContract : null; } else { _finalItemContract = null; } } } // the final (i.e. can't be inherited from like a sealed class or valuetype) item contract internal JsonContract FinalItemContract { get { return _finalItemContract; } } /// /// Gets or sets the default collection items . /// /// The converter. public JsonConverter ItemConverter { get; set; } /// /// Gets or sets a value indicating whether the collection items preserve object references. /// /// true if collection items preserve object references; otherwise, false. public bool? ItemIsReference { get; set; } /// /// Gets or sets the collection item reference loop handling. /// /// The reference loop handling. public ReferenceLoopHandling? ItemReferenceLoopHandling { get; set; } /// /// Gets or sets the collection item type name handling. /// /// The type name handling. public TypeNameHandling? ItemTypeNameHandling { get; set; } /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. internal JsonContainerContract(Type underlyingType) : base(underlyingType) { JsonContainerAttribute jsonContainerAttribute = JsonTypeReflector.GetJsonContainerAttribute(underlyingType); if (jsonContainerAttribute != null) { if (jsonContainerAttribute.ItemConverterType != null) ItemConverter = JsonConverterAttribute.CreateJsonConverterInstance(jsonContainerAttribute.ItemConverterType); ItemIsReference = jsonContainerAttribute._itemIsReference; ItemReferenceLoopHandling = jsonContainerAttribute._itemReferenceLoopHandling; ItemTypeNameHandling = jsonContainerAttribute._itemTypeNameHandling; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalWriter.cs0000644000175000017500000007501712253423361033763 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System.Dynamic; #endif using System.Globalization; using System.Security; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; using System.Runtime.Serialization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Serialization { internal class JsonSerializerInternalWriter : JsonSerializerInternalBase { private readonly List _serializeStack = new List(); private JsonSerializerProxy _internalSerializer; public JsonSerializerInternalWriter(JsonSerializer serializer) : base(serializer) { } public void Serialize(JsonWriter jsonWriter, object value) { if (jsonWriter == null) throw new ArgumentNullException("jsonWriter"); SerializeValue(jsonWriter, value, GetContractSafe(value), null, null, null); } private JsonSerializerProxy GetInternalSerializer() { if (_internalSerializer == null) _internalSerializer = new JsonSerializerProxy(this); return _internalSerializer; } private JsonContract GetContractSafe(object value) { if (value == null) return null; return Serializer.ContractResolver.ResolveContract(value.GetType()); } private void SerializePrimitive(JsonWriter writer, object value, JsonPrimitiveContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) { if (contract.UnderlyingType == typeof (byte[])) { bool includeTypeDetails = ShouldWriteType(TypeNameHandling.Objects, contract, member, containerContract, containerProperty); if (includeTypeDetails) { writer.WriteStartObject(); WriteTypeProperty(writer, contract.CreatedType); writer.WritePropertyName(JsonTypeReflector.ValuePropertyName); writer.WriteValue(value); writer.WriteEndObject(); return; } } writer.WriteValue(value); } private void SerializeValue(JsonWriter writer, object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) { if (value == null) { writer.WriteNull(); return; } JsonConverter converter; if ((((converter = (member != null) ? member.Converter : null) != null) || ((converter = (containerProperty != null) ? containerProperty.ItemConverter : null) != null) || ((converter = (containerContract != null) ? containerContract.ItemConverter : null) != null) || ((converter = valueContract.Converter) != null) || ((converter = Serializer.GetMatchingConverter(valueContract.UnderlyingType)) != null) || ((converter = valueContract.InternalConverter) != null)) && converter.CanWrite) { SerializeConvertable(writer, converter, value, valueContract, containerContract, containerProperty); return; } switch (valueContract.ContractType) { case JsonContractType.Object: SerializeObject(writer, value, (JsonObjectContract)valueContract, member, containerContract, containerProperty); break; case JsonContractType.Array: JsonArrayContract arrayContract = (JsonArrayContract) valueContract; if (!arrayContract.IsMultidimensionalArray) SerializeList(writer, arrayContract.CreateWrapper(value), arrayContract, member, containerContract, containerProperty); else SerializeMultidimensionalArray(writer, (Array)value, arrayContract, member, containerContract, containerProperty); break; case JsonContractType.Primitive: SerializePrimitive(writer, value, (JsonPrimitiveContract)valueContract, member, containerContract, containerProperty); break; case JsonContractType.String: SerializeString(writer, value, (JsonStringContract)valueContract); break; case JsonContractType.Dictionary: JsonDictionaryContract dictionaryContract = (JsonDictionaryContract) valueContract; SerializeDictionary(writer, dictionaryContract.CreateWrapper(value), dictionaryContract, member, containerContract, containerProperty); break; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) case JsonContractType.Dynamic: SerializeDynamic(writer, (IDynamicMetaObjectProvider)value, (JsonDynamicContract)valueContract, member, containerContract, containerProperty); break; #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) case JsonContractType.Serializable: SerializeISerializable(writer, (ISerializable)value, (JsonISerializableContract)valueContract, member, containerContract, containerProperty); break; #endif case JsonContractType.Linq: ((JToken) value).WriteTo(writer, (Serializer.Converters != null) ? Serializer.Converters.ToArray() : null); break; } } private bool? ResolveIsReference(JsonContract contract, JsonProperty property, JsonContainerContract collectionContract, JsonProperty containerProperty) { bool? isReference = null; // value could be coming from a dictionary or array and not have a property if (property != null) isReference = property.IsReference; if (isReference == null && containerProperty != null) isReference = containerProperty.ItemIsReference; if (isReference == null && collectionContract != null) isReference = collectionContract.ItemIsReference; if (isReference == null) isReference = contract.IsReference; return isReference; } private bool ShouldWriteReference(object value, JsonProperty property, JsonContract valueContract, JsonContainerContract collectionContract, JsonProperty containerProperty) { if (value == null) return false; if (valueContract.ContractType == JsonContractType.Primitive || valueContract.ContractType == JsonContractType.String) return false; bool? isReference = ResolveIsReference(valueContract, property, collectionContract, containerProperty); if (isReference == null) { if (valueContract.ContractType == JsonContractType.Array) isReference = HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Arrays); else isReference = HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Objects); } if (!isReference.Value) return false; return Serializer.ReferenceResolver.IsReferenced(this, value); } private bool ShouldWriteProperty(object memberValue, JsonProperty property) { if (property.NullValueHandling.GetValueOrDefault(Serializer.NullValueHandling) == NullValueHandling.Ignore && memberValue == null) return false; if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Ignore) && MiscellaneousUtils.ValueEquals(memberValue, property.DefaultValue)) return false; return true; } private bool CheckForCircularReference(JsonWriter writer, object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty) { if (value == null || contract.ContractType == JsonContractType.Primitive || contract.ContractType == JsonContractType.String) return true; ReferenceLoopHandling? referenceLoopHandling = null; if (property != null) referenceLoopHandling = property.ReferenceLoopHandling; if (referenceLoopHandling == null && containerProperty != null) referenceLoopHandling = containerProperty.ItemReferenceLoopHandling; if (referenceLoopHandling == null && containerContract != null) referenceLoopHandling = containerContract.ItemReferenceLoopHandling; if (_serializeStack.IndexOf(value) != -1) { switch (referenceLoopHandling.GetValueOrDefault(Serializer.ReferenceLoopHandling)) { case ReferenceLoopHandling.Error: string message = "Self referencing loop detected"; if (property != null) message += " for property '{0}'".FormatWith(CultureInfo.InvariantCulture, property.PropertyName); message += " with type '{0}'.".FormatWith(CultureInfo.InvariantCulture, value.GetType()); throw JsonSerializationException.Create(null, writer.ContainerPath, message, null); case ReferenceLoopHandling.Ignore: return false; case ReferenceLoopHandling.Serialize: return true; default: throw new InvalidOperationException("Unexpected ReferenceLoopHandling value: '{0}'".FormatWith(CultureInfo.InvariantCulture, Serializer.ReferenceLoopHandling)); } } return true; } private void WriteReference(JsonWriter writer, object value) { writer.WriteStartObject(); writer.WritePropertyName(JsonTypeReflector.RefPropertyName); writer.WriteValue(Serializer.ReferenceResolver.GetReference(this, value)); writer.WriteEndObject(); } internal static bool TryConvertToString(object value, Type type, out string s) { #if !(PocketPC || NETFX_CORE || PORTABLE) TypeConverter converter = ConvertUtils.GetConverter(type); // use the objectType's TypeConverter if it has one and can convert to a string if (converter != null #if !SILVERLIGHT && !(converter is ComponentConverter) #endif && converter.GetType() != typeof(TypeConverter)) { if (converter.CanConvertTo(typeof(string))) { #if !SILVERLIGHT s = converter.ConvertToInvariantString(value); #else s = converter.ConvertToString(value); #endif return true; } } #endif #if SILVERLIGHT || PocketPC || NETFX_CORE if (value is Guid || value is Uri || value is TimeSpan) { s = value.ToString(); return true; } #endif if (value is Type) { s = ((Type)value).AssemblyQualifiedName; return true; } s = null; return false; } private void SerializeString(JsonWriter writer, object value, JsonStringContract contract) { contract.InvokeOnSerializing(value, Serializer.Context); string s; TryConvertToString(value, contract.UnderlyingType, out s); writer.WriteValue(s); contract.InvokeOnSerialized(value, Serializer.Context); } private void SerializeObject(JsonWriter writer, object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { contract.InvokeOnSerializing(value, Serializer.Context); _serializeStack.Add(value); WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty); int initialDepth = writer.Top; foreach (JsonProperty property in contract.Properties) { try { object memberValue; JsonContract memberContract; if (!CalculatePropertyValues(writer, value, contract, member, property, out memberContract, out memberValue)) continue; writer.WritePropertyName(property.PropertyName); SerializeValue(writer, memberValue, memberContract, property, contract, member); } catch (Exception ex) { if (IsErrorHandled(value, contract, property.PropertyName, writer.ContainerPath, ex)) HandleError(writer, initialDepth); else throw; } } writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(value, Serializer.Context); } private bool CalculatePropertyValues(JsonWriter writer, object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, out JsonContract memberContract, out object memberValue) { if (!property.Ignored && property.Readable && ShouldSerialize(property, value) && IsSpecified(property, value)) { if (property.PropertyContract == null) property.PropertyContract = Serializer.ContractResolver.ResolveContract(property.PropertyType); memberValue = property.ValueProvider.GetValue(value); memberContract = (property.PropertyContract.UnderlyingType.IsSealed()) ? property.PropertyContract : GetContractSafe(memberValue); if (ShouldWriteProperty(memberValue, property)) { if (ShouldWriteReference(memberValue, property, memberContract, contract, member)) { writer.WritePropertyName(property.PropertyName); WriteReference(writer, memberValue); return false; } if (!CheckForCircularReference(writer, memberValue, property, memberContract, contract, member)) return false; if (memberValue == null) { JsonObjectContract objectContract = contract as JsonObjectContract; Required resolvedRequired = property._required ?? ((objectContract != null) ? objectContract.ItemRequired : null) ?? Required.Default; if (resolvedRequired == Required.Always) throw JsonSerializationException.Create(null, writer.ContainerPath, "Cannot write a null value for property '{0}'. Property requires a value.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName), null); } return true; } } memberContract = null; memberValue = null; return false; } private void WriteObjectStart(JsonWriter writer, object value, JsonContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { writer.WriteStartObject(); bool isReference = ResolveIsReference(contract, member, collectionContract, containerProperty) ?? HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Objects); if (isReference) { writer.WritePropertyName(JsonTypeReflector.IdPropertyName); writer.WriteValue(Serializer.ReferenceResolver.GetReference(this, value)); } if (ShouldWriteType(TypeNameHandling.Objects, contract, member, collectionContract, containerProperty)) { WriteTypeProperty(writer, contract.UnderlyingType); } } private void WriteTypeProperty(JsonWriter writer, Type type) { writer.WritePropertyName(JsonTypeReflector.TypePropertyName); writer.WriteValue(ReflectionUtils.GetTypeName(type, Serializer.TypeNameAssemblyFormat, Serializer.Binder)); } private bool HasFlag(DefaultValueHandling value, DefaultValueHandling flag) { return ((value & flag) == flag); } private bool HasFlag(PreserveReferencesHandling value, PreserveReferencesHandling flag) { return ((value & flag) == flag); } private bool HasFlag(TypeNameHandling value, TypeNameHandling flag) { return ((value & flag) == flag); } private void SerializeConvertable(JsonWriter writer, JsonConverter converter, object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty) { if (ShouldWriteReference(value, null, contract, collectionContract, containerProperty)) { WriteReference(writer, value); } else { if (!CheckForCircularReference(writer, value, null, contract, collectionContract, containerProperty)) return; _serializeStack.Add(value); converter.WriteJson(writer, value, GetInternalSerializer()); _serializeStack.RemoveAt(_serializeStack.Count - 1); } } private void SerializeList(JsonWriter writer, IWrappedCollection values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { contract.InvokeOnSerializing(values.UnderlyingCollection, Serializer.Context); _serializeStack.Add(values.UnderlyingCollection); bool hasWrittenMetadataObject = WriteStartArray(writer, values.UnderlyingCollection, contract, member, collectionContract, containerProperty); writer.WriteStartArray(); int initialDepth = writer.Top; int index = 0; // note that an error in the IEnumerable won't be caught foreach (object value in values) { try { JsonContract valueContract = contract.FinalItemContract ?? GetContractSafe(value); if (ShouldWriteReference(value, null, valueContract, contract, member)) { WriteReference(writer, value); } else { if (CheckForCircularReference(writer, value, null, valueContract, contract, member)) { SerializeValue(writer, value, valueContract, null, contract, member); } } } catch (Exception ex) { if (IsErrorHandled(values.UnderlyingCollection, contract, index, writer.ContainerPath, ex)) HandleError(writer, initialDepth); else throw; } finally { index++; } } writer.WriteEndArray(); if (hasWrittenMetadataObject) writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(values.UnderlyingCollection, Serializer.Context); } private void SerializeMultidimensionalArray(JsonWriter writer, Array values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { contract.InvokeOnSerializing(values, Serializer.Context); _serializeStack.Add(values); bool hasWrittenMetadataObject = WriteStartArray(writer, values, contract, member, collectionContract, containerProperty); SerializeMultidimensionalArray(writer, values, contract, member, writer.Top, new int[0]); if (hasWrittenMetadataObject) writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(values, Serializer.Context); } private void SerializeMultidimensionalArray(JsonWriter writer, Array values, JsonArrayContract contract, JsonProperty member, int initialDepth, int[] indices) { int dimension = indices.Length; int[] newIndices = new int[dimension + 1]; for (int i = 0; i < dimension; i++) { newIndices[i] = indices[i]; } writer.WriteStartArray(); for (int i = 0; i < values.GetLength(dimension); i++) { newIndices[dimension] = i; bool isTopLevel = (newIndices.Length == values.Rank); if (isTopLevel) { object value = values.GetValue(newIndices); try { JsonContract valueContract = contract.FinalItemContract ?? GetContractSafe(value); if (ShouldWriteReference(value, null, valueContract, contract, member)) { WriteReference(writer, value); } else { if (CheckForCircularReference(writer, value, null, valueContract, contract, member)) { SerializeValue(writer, value, valueContract, null, contract, member); } } } catch (Exception ex) { if (IsErrorHandled(values, contract, i, writer.ContainerPath, ex)) HandleError(writer, initialDepth + 1); else throw; } } else { SerializeMultidimensionalArray(writer, values, contract, member, initialDepth + 1, newIndices); } } writer.WriteEndArray(); } private bool WriteStartArray(JsonWriter writer, object values, JsonArrayContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) { bool isReference = ResolveIsReference(contract, member, containerContract, containerProperty) ?? HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Arrays); bool includeTypeDetails = ShouldWriteType(TypeNameHandling.Arrays, contract, member, containerContract, containerProperty); bool writeMetadataObject = isReference || includeTypeDetails; if (writeMetadataObject) { writer.WriteStartObject(); if (isReference) { writer.WritePropertyName(JsonTypeReflector.IdPropertyName); writer.WriteValue(Serializer.ReferenceResolver.GetReference(this, values)); } if (includeTypeDetails) { WriteTypeProperty(writer, values.GetType()); } writer.WritePropertyName(JsonTypeReflector.ArrayValuesPropertyName); } if (contract.ItemContract == null) contract.ItemContract = Serializer.ContractResolver.ResolveContract(contract.CollectionItemType ?? typeof (object)); return writeMetadataObject; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) #if !(NET20 || NET35) [SecuritySafeCritical] #endif private void SerializeISerializable(JsonWriter writer, ISerializable value, JsonISerializableContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { if (!JsonTypeReflector.FullyTrusted) { throw JsonSerializationException.Create(null, writer.ContainerPath, @"Type '{0}' implements ISerializable but cannot be serialized using the ISerializable interface because the current application is not fully trusted and ISerializable can expose secure data. To fix this error either change the environment to be fully trusted, change the application to not deserialize the type, add JsonObjectAttribute to the type or change the JsonSerializer setting ContractResolver to use a new DefaultContractResolver with IgnoreSerializableInterface set to true.".FormatWith(CultureInfo.InvariantCulture, value.GetType()), null); } contract.InvokeOnSerializing(value, Serializer.Context); _serializeStack.Add(value); WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty); SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, new FormatterConverter()); value.GetObjectData(serializationInfo, Serializer.Context); foreach (SerializationEntry serializationEntry in serializationInfo) { writer.WritePropertyName(serializationEntry.Name); SerializeValue(writer, serializationEntry.Value, GetContractSafe(serializationEntry.Value), null, null, member); } writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(value, Serializer.Context); } #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) private void SerializeDynamic(JsonWriter writer, IDynamicMetaObjectProvider value, JsonDynamicContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { contract.InvokeOnSerializing(value, Serializer.Context); _serializeStack.Add(value); WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty); int initialDepth = writer.Top; foreach (JsonProperty property in contract.Properties) { // only write non-dynamic properties that have an explicit attribute if (property.HasMemberAttribute) { try { object memberValue; JsonContract memberContract; if (!CalculatePropertyValues(writer, value, contract, member, property, out memberContract, out memberValue)) continue; writer.WritePropertyName(property.PropertyName); SerializeValue(writer, memberValue, memberContract, property, contract, member); } catch (Exception ex) { if (IsErrorHandled(value, contract, property.PropertyName, writer.ContainerPath, ex)) HandleError(writer, initialDepth); else throw; } } } foreach (string memberName in value.GetDynamicMemberNames()) { object memberValue; if (value.TryGetMember(memberName, out memberValue)) { try { string resolvedPropertyName = (contract.PropertyNameResolver != null) ? contract.PropertyNameResolver(memberName) : memberName; writer.WritePropertyName(resolvedPropertyName); SerializeValue(writer, memberValue, GetContractSafe(memberValue), null, null, member); } catch (Exception ex) { if (IsErrorHandled(value, contract, memberName, writer.ContainerPath, ex)) HandleError(writer, initialDepth); else throw; } } } writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(value, Serializer.Context); } #endif private bool ShouldWriteType(TypeNameHandling typeNameHandlingFlag, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) { TypeNameHandling resolvedTypeNameHandling = ((member != null) ? member.TypeNameHandling : null) ?? ((containerProperty != null) ? containerProperty.ItemTypeNameHandling : null) ?? ((containerContract != null) ? containerContract.ItemTypeNameHandling : null) ?? Serializer.TypeNameHandling; if (HasFlag(resolvedTypeNameHandling, typeNameHandlingFlag)) return true; // instance type and the property's type's contract default type are different (no need to put the type in JSON because the type will be created by default) if (HasFlag(resolvedTypeNameHandling, TypeNameHandling.Auto)) { if (member != null) { if (contract.UnderlyingType != member.PropertyContract.CreatedType) return true; } else if (containerContract != null && containerContract.ItemContract != null) { if (contract.UnderlyingType != containerContract.ItemContract.CreatedType) return true; } } return false; } private void SerializeDictionary(JsonWriter writer, IWrappedDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) { contract.InvokeOnSerializing(values.UnderlyingDictionary, Serializer.Context); _serializeStack.Add(values.UnderlyingDictionary); WriteObjectStart(writer, values.UnderlyingDictionary, contract, member, collectionContract, containerProperty); if (contract.ItemContract == null) contract.ItemContract = Serializer.ContractResolver.ResolveContract(contract.DictionaryValueType ?? typeof(object)); int initialDepth = writer.Top; // Mono Unity 3.0 fix IWrappedDictionary d = values; foreach (DictionaryEntry entry in d) { string propertyName = GetPropertyName(entry); propertyName = (contract.PropertyNameResolver != null) ? contract.PropertyNameResolver(propertyName) : propertyName; try { object value = entry.Value; JsonContract valueContract = contract.FinalItemContract ?? GetContractSafe(value); if (ShouldWriteReference(value, null, valueContract, contract, member)) { writer.WritePropertyName(propertyName); WriteReference(writer, value); } else { if (!CheckForCircularReference(writer, value, null, valueContract, contract, member)) continue; writer.WritePropertyName(propertyName); SerializeValue(writer, value, valueContract, null, contract, member); } } catch (Exception ex) { if (IsErrorHandled(values.UnderlyingDictionary, contract, propertyName, writer.ContainerPath, ex)) HandleError(writer, initialDepth); else throw; } } writer.WriteEndObject(); _serializeStack.RemoveAt(_serializeStack.Count - 1); contract.InvokeOnSerialized(values.UnderlyingDictionary, Serializer.Context); } private string GetPropertyName(DictionaryEntry entry) { string propertyName; if (ConvertUtils.IsConvertible(entry.Key)) return Convert.ToString(entry.Key, CultureInfo.InvariantCulture); else if (TryConvertToString(entry.Key, entry.Key.GetType(), out propertyName)) return propertyName; else return entry.Key.ToString(); } private void HandleError(JsonWriter writer, int initialDepth) { ClearErrorContext(); if (writer.WriteState == WriteState.Property) writer.WriteNull(); while (writer.Top > initialDepth) { writer.WriteEnd(); } } private bool ShouldSerialize(JsonProperty property, object target) { if (property.ShouldSerialize == null) return true; return property.ShouldSerialize(target); } private bool IsSpecified(JsonProperty property, object target) { if (property.GetIsSpecified == null) return true; return property.GetIsSpecified(target); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/OnErrorAttribute.cs0000644000175000017500000000271012253423361031366 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// When applied to a method, specifies that the method is called when an error occurs serializing an object. /// [AttributeUsage(AttributeTargets.Method, Inherited = false)] public sealed class OnErrorAttribute : Attribute { } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonObjectContract.cs0000644000175000017500000001154412253423361031657 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.Reflection; using System.Runtime.Serialization; using System.Security; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonObjectContract : JsonContainerContract { /// /// Gets or sets the object member serialization. /// /// The member object serialization. public MemberSerialization MemberSerialization { get; set; } /// /// Gets or sets a value that indicates whether the object's properties are required. /// /// /// A value indicating whether the object's properties are required. /// public Required? ItemRequired { get; set; } /// /// Gets the object's properties. /// /// The object's properties. public JsonPropertyCollection Properties { get; private set; } /// /// Gets the constructor parameters required for any non-default constructor /// public JsonPropertyCollection ConstructorParameters { get; private set; } /// /// Gets or sets the override constructor used to create the object. /// This is set when a constructor is marked up using the /// JsonConstructor attribute. /// /// The override constructor. public ConstructorInfo OverrideConstructor { get; set; } /// /// Gets or sets the parametrized constructor used to create the object. /// /// The parametrized constructor. public ConstructorInfo ParametrizedConstructor { get; set; } private bool? _hasRequiredOrDefaultValueProperties; internal bool HasRequiredOrDefaultValueProperties { get { if (_hasRequiredOrDefaultValueProperties == null) { _hasRequiredOrDefaultValueProperties = false; if (ItemRequired.GetValueOrDefault(Required.Default) != Required.Default) { _hasRequiredOrDefaultValueProperties = true; } else { foreach (JsonProperty property in Properties) { if (property.Required != Required.Default || ((property.DefaultValueHandling & DefaultValueHandling.Populate) == DefaultValueHandling.Populate) && property.Writable) { _hasRequiredOrDefaultValueProperties = true; break; } } } } return _hasRequiredOrDefaultValueProperties.Value; } } /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonObjectContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Object; Properties = new JsonPropertyCollection(UnderlyingType); ConstructorParameters = new JsonPropertyCollection(UnderlyingType); } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) #if !(NET20 || NET35) [SecuritySafeCritical] #endif internal object GetUninitializedObject() { // we should never get here if the environment is not fully trusted, check just in case if (!JsonTypeReflector.FullyTrusted) throw new JsonException("Insufficient permissions. Creating an uninitialized '{0}' type requires full trust.".FormatWith(CultureInfo.InvariantCulture, NonNullableUnderlyingType)); return FormatterServices.GetUninitializedObject(NonNullableUnderlyingType); } #endif } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs0000644000175000017500000013075212253423361032730 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; #if !(NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE) using System.Collections.Concurrent; #endif using System.Collections.Generic; using System.ComponentModel; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System.Dynamic; #endif using System.Globalization; using System.Reflection; using System.Runtime.Serialization; #if !(NETFX_CORE || PORTABLE) using System.Security.Permissions; #endif using System.Xml.Serialization; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; using System.Runtime.CompilerServices; #if NETFX_CORE || PORTABLE using ICustomAttributeProvider = Newtonsoft.Json.Utilities.CustomAttributeProvider; #endif #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Serialization { internal struct ResolverContractKey : IEquatable { private readonly Type _resolverType; private readonly Type _contractType; public ResolverContractKey(Type resolverType, Type contractType) { _resolverType = resolverType; _contractType = contractType; } public override int GetHashCode() { return _resolverType.GetHashCode() ^ _contractType.GetHashCode(); } public override bool Equals(object obj) { if (!(obj is ResolverContractKey)) return false; return Equals((ResolverContractKey)obj); } public bool Equals(ResolverContractKey other) { return (_resolverType == other._resolverType && _contractType == other._contractType); } } /// /// Used by to resolves a for a given . /// public class DefaultContractResolver : IContractResolver { private static readonly IContractResolver _instance = new DefaultContractResolver(true); internal static IContractResolver Instance { get { return _instance; } } private static readonly IList BuiltInConverters = new List { #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) new EntityKeyMemberConverter(), #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) new ExpandoObjectConverter(), #endif #if (!(SILVERLIGHT || PORTABLE) || WINDOWS_PHONE) new XmlNodeConverter(), #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) new BinaryConverter(), new DataSetConverter(), new DataTableConverter(), #endif new KeyValuePairConverter(), new BsonObjectIdConverter() }; private static Dictionary _sharedContractCache; private static readonly object _typeContractCacheLock = new object(); private Dictionary _instanceContractCache; private readonly bool _sharedCache; /// /// Gets a value indicating whether members are being get and set using dynamic code generation. /// This value is determined by the runtime permissions available. /// /// /// true if using dynamic code generation; otherwise, false. /// public bool DynamicCodeGeneration { get { return JsonTypeReflector.DynamicCodeGeneration; } } #if !NETFX_CORE /// /// Gets or sets the default members search flags. /// /// The default members search flags. public BindingFlags DefaultMembersSearchFlags { get; set; } #else private BindingFlags DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.Public; #endif /// /// Gets or sets a value indicating whether compiler generated members should be serialized. /// /// /// true if serialized compiler generated members; otherwise, false. /// public bool SerializeCompilerGeneratedMembers { get; set; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. /// /// /// true if the interface will be ignored when serializing and deserializing types; otherwise, false. /// public bool IgnoreSerializableInterface { get; set; } /// /// Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. /// /// /// true if the attribute will be ignored when serializing and deserializing types; otherwise, false. /// public bool IgnoreSerializableAttribute { get; set; } #endif /// /// Initializes a new instance of the class. /// public DefaultContractResolver() : this(false) { } /// /// Initializes a new instance of the class. /// /// /// If set to true the will use a cached shared with other resolvers of the same type. /// Sharing the cache will significantly performance because expensive reflection will only happen once but could cause unexpected /// behavior if different instances of the resolver are suppose to produce different results. When set to false it is highly /// recommended to reuse instances with the . /// public DefaultContractResolver(bool shareCache) { #if !NETFX_CORE DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.Instance; #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) IgnoreSerializableAttribute = true; #endif _sharedCache = shareCache; } private Dictionary GetCache() { if (_sharedCache) return _sharedContractCache; else return _instanceContractCache; } private void UpdateCache(Dictionary cache) { if (_sharedCache) _sharedContractCache = cache; else _instanceContractCache = cache; } /// /// Resolves the contract for a given type. /// /// The type to resolve a contract for. /// The contract for a given type. public virtual JsonContract ResolveContract(Type type) { if (type == null) throw new ArgumentNullException("type"); JsonContract contract; ResolverContractKey key = new ResolverContractKey(GetType(), type); Dictionary cache = GetCache(); if (cache == null || !cache.TryGetValue(key, out contract)) { contract = CreateContract(type); // avoid the possibility of modifying the cache dictionary while another thread is accessing it lock (_typeContractCacheLock) { cache = GetCache(); Dictionary updatedCache = (cache != null) ? new Dictionary(cache) : new Dictionary(); updatedCache[key] = contract; UpdateCache(updatedCache); } } return contract; } /// /// Gets the serializable members for the type. /// /// The type to get serializable members for. /// The serializable members for the type. protected virtual List GetSerializableMembers(Type objectType) { bool ignoreSerializableAttribute; #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) ignoreSerializableAttribute = IgnoreSerializableAttribute; #else ignoreSerializableAttribute = true; #endif MemberSerialization memberSerialization = JsonTypeReflector.GetObjectMemberSerialization(objectType, ignoreSerializableAttribute); List allMembers = ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static) .Where(m => !ReflectionUtils.IsIndexedProperty(m)).ToList(); List serializableMembers = new List(); if (memberSerialization != MemberSerialization.Fields) { #if !PocketPC && !NET20 DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType); #endif List defaultMembers = ReflectionUtils.GetFieldsAndProperties(objectType, DefaultMembersSearchFlags) .Where(m => !ReflectionUtils.IsIndexedProperty(m)).ToList(); foreach (MemberInfo member in allMembers) { // exclude members that are compiler generated if set if (SerializeCompilerGeneratedMembers || !member.IsDefined(typeof (CompilerGeneratedAttribute), true)) { if (defaultMembers.Contains(member)) { // add all members that are found by default member search serializableMembers.Add(member); } else { // add members that are explicitly marked with JsonProperty/DataMember attribute // or are a field if serializing just fields if (JsonTypeReflector.GetAttribute(member.GetCustomAttributeProvider()) != null) serializableMembers.Add(member); #if !PocketPC && !NET20 else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute(member.GetCustomAttributeProvider()) != null) serializableMembers.Add(member); #endif else if (memberSerialization == MemberSerialization.Fields && member.MemberType() == MemberTypes.Field) serializableMembers.Add(member); } } } #if !PocketPC && !SILVERLIGHT && !NET20 Type match; // don't include EntityKey on entities objects... this is a bit hacky if (objectType.AssignableToTypeName("System.Data.Objects.DataClasses.EntityObject", out match)) serializableMembers = serializableMembers.Where(ShouldSerializeEntityMember).ToList(); #endif } else { // serialize all fields foreach (MemberInfo member in allMembers) { if (member.MemberType() == MemberTypes.Field) serializableMembers.Add(member); } } return serializableMembers; } #if !PocketPC && !SILVERLIGHT && !NET20 private bool ShouldSerializeEntityMember(MemberInfo memberInfo) { PropertyInfo propertyInfo = memberInfo as PropertyInfo; if (propertyInfo != null) { if (propertyInfo.PropertyType.IsGenericType() && propertyInfo.PropertyType.GetGenericTypeDefinition().FullName == "System.Data.Objects.DataClasses.EntityReference`1") return false; } return true; } #endif /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonObjectContract CreateObjectContract(Type objectType) { JsonObjectContract contract = new JsonObjectContract(objectType); InitializeContract(contract); bool ignoreSerializableAttribute; #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) ignoreSerializableAttribute = IgnoreSerializableAttribute; #else ignoreSerializableAttribute = true; #endif contract.MemberSerialization = JsonTypeReflector.GetObjectMemberSerialization(contract.NonNullableUnderlyingType, ignoreSerializableAttribute); contract.Properties.AddRange(CreateProperties(contract.NonNullableUnderlyingType, contract.MemberSerialization)); JsonObjectAttribute attribute = JsonTypeReflector.GetJsonObjectAttribute(contract.NonNullableUnderlyingType); if (attribute != null) contract.ItemRequired = attribute._itemRequired; // check if a JsonConstructorAttribute has been defined and use that if (contract.NonNullableUnderlyingType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Any(c => c.IsDefined(typeof(JsonConstructorAttribute), true))) { ConstructorInfo constructor = GetAttributeConstructor(contract.NonNullableUnderlyingType); if (constructor != null) { contract.OverrideConstructor = constructor; contract.ConstructorParameters.AddRange(CreateConstructorParameters(constructor, contract.Properties)); } } else if (contract.MemberSerialization == MemberSerialization.Fields) { #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) // mimic DataContractSerializer behaviour when populating fields by overriding default creator to create an uninitialized object // note that this is only possible when the application is fully trusted so fall back to using the default constructor (if available) in partial trust if (JsonTypeReflector.FullyTrusted) contract.DefaultCreator = contract.GetUninitializedObject; #endif } else if (contract.DefaultCreator == null || contract.DefaultCreatorNonPublic) { ConstructorInfo constructor = GetParametrizedConstructor(contract.NonNullableUnderlyingType); if (constructor != null) { contract.ParametrizedConstructor = constructor; contract.ConstructorParameters.AddRange(CreateConstructorParameters(constructor, contract.Properties)); } } return contract; } private ConstructorInfo GetAttributeConstructor(Type objectType) { IList markedConstructors = objectType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(c => c.IsDefined(typeof(JsonConstructorAttribute), true)).ToList(); if (markedConstructors.Count > 1) throw new JsonException("Multiple constructors with the JsonConstructorAttribute."); else if (markedConstructors.Count == 1) return markedConstructors[0]; return null; } private ConstructorInfo GetParametrizedConstructor(Type objectType) { IList constructors = objectType.GetConstructors(BindingFlags.Public | BindingFlags.Instance).ToList(); if (constructors.Count == 1) return constructors[0]; else return null; } /// /// Creates the constructor parameters. /// /// The constructor to create properties for. /// The type's member properties. /// Properties for the given . protected virtual IList CreateConstructorParameters(ConstructorInfo constructor, JsonPropertyCollection memberProperties) { var constructorParameters = constructor.GetParameters(); JsonPropertyCollection parameterCollection = new JsonPropertyCollection(constructor.DeclaringType); foreach (ParameterInfo parameterInfo in constructorParameters) { JsonProperty matchingMemberProperty = memberProperties.GetClosestMatchProperty(parameterInfo.Name); // type must match as well as name if (matchingMemberProperty != null && matchingMemberProperty.PropertyType != parameterInfo.ParameterType) matchingMemberProperty = null; JsonProperty property = CreatePropertyFromConstructorParameter(matchingMemberProperty, parameterInfo); if (property != null) { parameterCollection.AddProperty(property); } } return parameterCollection; } /// /// Creates a for the given . /// /// The matching member property. /// The constructor parameter. /// A created for the given . protected virtual JsonProperty CreatePropertyFromConstructorParameter(JsonProperty matchingMemberProperty, ParameterInfo parameterInfo) { JsonProperty property = new JsonProperty(); property.PropertyType = parameterInfo.ParameterType; bool allowNonPublicAccess; SetPropertySettingsFromAttributes(property, parameterInfo.GetCustomAttributeProvider(), parameterInfo.Name, parameterInfo.Member.DeclaringType, MemberSerialization.OptOut, out allowNonPublicAccess); property.Readable = false; property.Writable = true; // "inherit" values from matching member property if unset on parameter if (matchingMemberProperty != null) { property.PropertyName = (property.PropertyName != parameterInfo.Name) ? property.PropertyName : matchingMemberProperty.PropertyName; property.Converter = property.Converter ?? matchingMemberProperty.Converter; property.MemberConverter = property.MemberConverter ?? matchingMemberProperty.MemberConverter; property.DefaultValue = property.DefaultValue ?? matchingMemberProperty.DefaultValue; property._required = property._required ?? matchingMemberProperty._required; property.IsReference = property.IsReference ?? matchingMemberProperty.IsReference; property.NullValueHandling = property.NullValueHandling ?? matchingMemberProperty.NullValueHandling; property.DefaultValueHandling = property.DefaultValueHandling ?? matchingMemberProperty.DefaultValueHandling; property.ReferenceLoopHandling = property.ReferenceLoopHandling ?? matchingMemberProperty.ReferenceLoopHandling; property.ObjectCreationHandling = property.ObjectCreationHandling ?? matchingMemberProperty.ObjectCreationHandling; property.TypeNameHandling = property.TypeNameHandling ?? matchingMemberProperty.TypeNameHandling; } return property; } /// /// Resolves the default for the contract. /// /// Type of the object. /// The contract's default . protected virtual JsonConverter ResolveContractConverter(Type objectType) { return JsonTypeReflector.GetJsonConverter(objectType.GetCustomAttributeProvider(), objectType); } private Func GetDefaultCreator(Type createdType) { return JsonTypeReflector.ReflectionDelegateFactory.CreateDefaultConstructor(createdType); } #if !PocketPC && !NET20 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Portability", "CA1903:UseOnlyApiFromTargetedFramework", MessageId = "System.Runtime.Serialization.DataContractAttribute.#get_IsReference()")] #endif private void InitializeContract(JsonContract contract) { JsonContainerAttribute containerAttribute = JsonTypeReflector.GetJsonContainerAttribute(contract.NonNullableUnderlyingType); if (containerAttribute != null) { contract.IsReference = containerAttribute._isReference; } #if !PocketPC && !NET20 else { DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(contract.NonNullableUnderlyingType); // doesn't have a null value if (dataContractAttribute != null && dataContractAttribute.IsReference) contract.IsReference = true; } #endif contract.Converter = ResolveContractConverter(contract.NonNullableUnderlyingType); // then see whether object is compadible with any of the built in converters contract.InternalConverter = JsonSerializer.GetMatchingConverter(BuiltInConverters, contract.NonNullableUnderlyingType); if (ReflectionUtils.HasDefaultConstructor(contract.CreatedType, true) || contract.CreatedType.IsValueType()) { contract.DefaultCreator = GetDefaultCreator(contract.CreatedType); contract.DefaultCreatorNonPublic = (!contract.CreatedType.IsValueType() && ReflectionUtils.GetDefaultConstructor(contract.CreatedType) == null); } ResolveCallbackMethods(contract, contract.NonNullableUnderlyingType); } private void ResolveCallbackMethods(JsonContract contract, Type t) { if (t.BaseType() != null) ResolveCallbackMethods(contract, t.BaseType()); MethodInfo onSerializing; MethodInfo onSerialized; MethodInfo onDeserializing; MethodInfo onDeserialized; MethodInfo onError; GetCallbackMethodsForType(t, out onSerializing, out onSerialized, out onDeserializing, out onDeserialized, out onError); if (onSerializing != null) { #if NETFX_CORE if (!t.IsGenericType() || (t.GetGenericTypeDefinition() != typeof(ConcurrentDictionary<,>))) contract.OnSerializing = onSerializing; #else contract.OnSerializing = onSerializing; #endif } if (onSerialized != null) contract.OnSerialized = onSerialized; if (onDeserializing != null) contract.OnDeserializing = onDeserializing; if (onDeserialized != null) { // ConcurrentDictionary throws an error here so don't use its OnDeserialized - http://json.codeplex.com/discussions/257093 #if !(NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE) if (!t.IsGenericType() || (t.GetGenericTypeDefinition() != typeof(ConcurrentDictionary<,>))) contract.OnDeserialized = onDeserialized; #else contract.OnDeserialized = onDeserialized; #endif } if (onError != null) contract.OnError = onError; } private void GetCallbackMethodsForType(Type type, out MethodInfo onSerializing, out MethodInfo onSerialized, out MethodInfo onDeserializing, out MethodInfo onDeserialized, out MethodInfo onError) { onSerializing = null; onSerialized = null; onDeserializing = null; onDeserialized = null; onError = null; foreach (MethodInfo method in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { // compact framework errors when getting parameters for a generic method // lame, but generic methods should not be callbacks anyway if (method.ContainsGenericParameters) continue; Type prevAttributeType = null; ParameterInfo[] parameters = method.GetParameters(); if (IsValidCallback(method, parameters, typeof(OnSerializingAttribute), onSerializing, ref prevAttributeType)) { onSerializing = method; } if (IsValidCallback(method, parameters, typeof(OnSerializedAttribute), onSerialized, ref prevAttributeType)) { onSerialized = method; } if (IsValidCallback(method, parameters, typeof(OnDeserializingAttribute), onDeserializing, ref prevAttributeType)) { onDeserializing = method; } if (IsValidCallback(method, parameters, typeof(OnDeserializedAttribute), onDeserialized, ref prevAttributeType)) { onDeserialized = method; } if (IsValidCallback(method, parameters, typeof(OnErrorAttribute), onError, ref prevAttributeType)) { onError = method; } } } /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonDictionaryContract CreateDictionaryContract(Type objectType) { JsonDictionaryContract contract = new JsonDictionaryContract(objectType); InitializeContract(contract); contract.PropertyNameResolver = ResolvePropertyName; return contract; } /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonArrayContract CreateArrayContract(Type objectType) { JsonArrayContract contract = new JsonArrayContract(objectType); InitializeContract(contract); return contract; } /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonPrimitiveContract CreatePrimitiveContract(Type objectType) { JsonPrimitiveContract contract = new JsonPrimitiveContract(objectType); InitializeContract(contract); return contract; } /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonLinqContract CreateLinqContract(Type objectType) { JsonLinqContract contract = new JsonLinqContract(objectType); InitializeContract(contract); return contract; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonISerializableContract CreateISerializableContract(Type objectType) { JsonISerializableContract contract = new JsonISerializableContract(objectType); InitializeContract(contract); ConstructorInfo constructorInfo = contract.NonNullableUnderlyingType.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null); if (constructorInfo != null) { MethodCall methodCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(constructorInfo); contract.ISerializableCreator = (args => methodCall(null, args)); } return contract; } #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonDynamicContract CreateDynamicContract(Type objectType) { JsonDynamicContract contract = new JsonDynamicContract(objectType); InitializeContract(contract); contract.PropertyNameResolver = ResolvePropertyName; contract.Properties.AddRange(CreateProperties(objectType, MemberSerialization.OptOut)); return contract; } #endif /// /// Creates a for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonStringContract CreateStringContract(Type objectType) { JsonStringContract contract = new JsonStringContract(objectType); InitializeContract(contract); return contract; } /// /// Determines which contract type is created for the given type. /// /// Type of the object. /// A for the given type. protected virtual JsonContract CreateContract(Type objectType) { Type t = ReflectionUtils.EnsureNotNullableType(objectType); if (JsonConvert.IsJsonPrimitiveType(t)) return CreatePrimitiveContract(objectType); if (JsonTypeReflector.GetJsonObjectAttribute(t) != null) return CreateObjectContract(objectType); if (JsonTypeReflector.GetJsonArrayAttribute(t) != null) return CreateArrayContract(objectType); if (JsonTypeReflector.GetJsonDictionaryAttribute(t) != null) return CreateDictionaryContract(objectType); if (t == typeof(JToken) || t.IsSubclassOf(typeof(JToken))) return CreateLinqContract(objectType); if (CollectionUtils.IsDictionaryType(t)) return CreateDictionaryContract(objectType); if (typeof(IEnumerable).IsAssignableFrom(t)) return CreateArrayContract(objectType); if (CanConvertToString(t)) return CreateStringContract(objectType); #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) if (!IgnoreSerializableInterface && typeof(ISerializable).IsAssignableFrom(t)) return CreateISerializableContract(objectType); #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(t)) return CreateDynamicContract(objectType); #endif return CreateObjectContract(objectType); } internal static bool CanConvertToString(Type type) { #if !(NETFX_CORE || PORTABLE) TypeConverter converter = ConvertUtils.GetConverter(type); // use the objectType's TypeConverter if it has one and can convert to a string if (converter != null #if !SILVERLIGHT && !(converter is ComponentConverter) && !(converter is ReferenceConverter) #endif && converter.GetType() != typeof(TypeConverter)) { if (converter.CanConvertTo(typeof(string))) return true; } #endif if (type == typeof(Type) || type.IsSubclassOf(typeof(Type))) return true; #if SILVERLIGHT || PocketPC if (type == typeof(Guid) || type == typeof(Uri) || type == typeof(TimeSpan)) return true; #endif return false; } private static bool IsValidCallback(MethodInfo method, ParameterInfo[] parameters, Type attributeType, MethodInfo currentCallback, ref Type prevAttributeType) { if (!method.IsDefined(attributeType, false)) return false; if (currentCallback != null) throw new JsonException("Invalid attribute. Both '{0}' and '{1}' in type '{2}' have '{3}'.".FormatWith(CultureInfo.InvariantCulture, method, currentCallback, GetClrTypeFullName(method.DeclaringType), attributeType)); if (prevAttributeType != null) throw new JsonException("Invalid Callback. Method '{3}' in type '{2}' has both '{0}' and '{1}'.".FormatWith(CultureInfo.InvariantCulture, prevAttributeType, attributeType, GetClrTypeFullName(method.DeclaringType), method)); if (method.IsVirtual) throw new JsonException("Virtual Method '{0}' of type '{1}' cannot be marked with '{2}' attribute.".FormatWith(CultureInfo.InvariantCulture, method, GetClrTypeFullName(method.DeclaringType), attributeType)); if (method.ReturnType != typeof(void)) throw new JsonException("Serialization Callback '{1}' in type '{0}' must return void.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(method.DeclaringType), method)); if (attributeType == typeof(OnErrorAttribute)) { if (parameters == null || parameters.Length != 2 || parameters[0].ParameterType != typeof(StreamingContext) || parameters[1].ParameterType != typeof(ErrorContext)) throw new JsonException("Serialization Error Callback '{1}' in type '{0}' must have two parameters of type '{2}' and '{3}'.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(method.DeclaringType), method, typeof(StreamingContext), typeof(ErrorContext))); } else { if (parameters == null || parameters.Length != 1 || parameters[0].ParameterType != typeof(StreamingContext)) throw new JsonException("Serialization Callback '{1}' in type '{0}' must have a single parameter of type '{2}'.".FormatWith(CultureInfo.InvariantCulture, GetClrTypeFullName(method.DeclaringType), method, typeof(StreamingContext))); } prevAttributeType = attributeType; return true; } internal static string GetClrTypeFullName(Type type) { if (type.IsGenericTypeDefinition() || !type.ContainsGenericParameters()) return type.FullName; return string.Format(CultureInfo.InvariantCulture, "{0}.{1}", new object[] { type.Namespace, type.Name }); } /// /// Creates properties for the given . /// /// The type to create properties for. /// /// The member serialization mode for the type. /// Properties for the given . protected virtual IList CreateProperties(Type type, MemberSerialization memberSerialization) { List members = GetSerializableMembers(type); if (members == null) throw new JsonSerializationException("Null collection of seralizable members returned."); JsonPropertyCollection properties = new JsonPropertyCollection(type); foreach (MemberInfo member in members) { JsonProperty property = CreateProperty(member, memberSerialization); if (property != null) properties.AddProperty(property); } IList orderedProperties = properties.OrderBy(p => p.Order ?? -1).ToList(); return orderedProperties; } /// /// Creates the used by the serializer to get and set values from a member. /// /// The member. /// The used by the serializer to get and set values from a member. protected virtual IValueProvider CreateMemberValueProvider(MemberInfo member) { // warning - this method use to cause errors with Intellitrace. Retest in VS Ultimate after changes IValueProvider valueProvider; #if !(SILVERLIGHT || PORTABLE || NETFX_CORE) if (DynamicCodeGeneration) valueProvider = new DynamicValueProvider(member); else valueProvider = new ReflectionValueProvider(member); #else valueProvider = new ReflectionValueProvider(member); #endif return valueProvider; } /// /// Creates a for the given . /// /// The member's parent . /// The member to create a for. /// A created for the given . protected virtual JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = new JsonProperty(); property.PropertyType = ReflectionUtils.GetMemberUnderlyingType(member); property.DeclaringType = member.DeclaringType; property.ValueProvider = CreateMemberValueProvider(member); bool allowNonPublicAccess; SetPropertySettingsFromAttributes(property, member.GetCustomAttributeProvider(), member.Name, member.DeclaringType, memberSerialization, out allowNonPublicAccess); if (memberSerialization != MemberSerialization.Fields) { property.Readable = ReflectionUtils.CanReadMemberValue(member, allowNonPublicAccess); property.Writable = ReflectionUtils.CanSetMemberValue(member, allowNonPublicAccess, property.HasMemberAttribute); } else { // write to readonly fields property.Readable = true; property.Writable = true; } property.ShouldSerialize = CreateShouldSerializeTest(member); SetIsSpecifiedActions(property, member, allowNonPublicAccess); return property; } private void SetPropertySettingsFromAttributes(JsonProperty property, ICustomAttributeProvider attributeProvider, string name, Type declaringType, MemberSerialization memberSerialization, out bool allowNonPublicAccess) { #if !PocketPC && !NET20 DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(declaringType); MemberInfo memberInfo = null; #if !(NETFX_CORE || PORTABLE) memberInfo = attributeProvider as MemberInfo; #else memberInfo = attributeProvider.UnderlyingObject as MemberInfo; #endif DataMemberAttribute dataMemberAttribute; if (dataContractAttribute != null && memberInfo != null) dataMemberAttribute = JsonTypeReflector.GetDataMemberAttribute((MemberInfo) memberInfo); else dataMemberAttribute = null; #endif JsonPropertyAttribute propertyAttribute = JsonTypeReflector.GetAttribute(attributeProvider); if (propertyAttribute != null) property.HasMemberAttribute = true; string mappedName; if (propertyAttribute != null && propertyAttribute.PropertyName != null) mappedName = propertyAttribute.PropertyName; #if !PocketPC && !NET20 else if (dataMemberAttribute != null && dataMemberAttribute.Name != null) mappedName = dataMemberAttribute.Name; #endif else mappedName = name; property.PropertyName = ResolvePropertyName(mappedName); property.UnderlyingName = name; bool hasMemberAttribute = false; if (propertyAttribute != null) { property._required = propertyAttribute._required; property.Order = propertyAttribute._order; hasMemberAttribute = true; } #if !PocketPC && !NET20 else if (dataMemberAttribute != null) { property._required = (dataMemberAttribute.IsRequired) ? Required.AllowNull : Required.Default; property.Order = (dataMemberAttribute.Order != -1) ? (int?) dataMemberAttribute.Order : null; hasMemberAttribute = true; } #endif bool hasJsonIgnoreAttribute = JsonTypeReflector.GetAttribute(attributeProvider) != null #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) || JsonTypeReflector.GetAttribute(attributeProvider) != null #endif ; if (memberSerialization != MemberSerialization.OptIn) { bool hasIgnoreDataMemberAttribute = false; #if !(NET20 || NET35) hasIgnoreDataMemberAttribute = (JsonTypeReflector.GetAttribute(attributeProvider) != null); #endif // ignored if it has JsonIgnore or NonSerialized or IgnoreDataMember attributes property.Ignored = (hasJsonIgnoreAttribute || hasIgnoreDataMemberAttribute); } else { // ignored if it has JsonIgnore/NonSerialized or does not have DataMember or JsonProperty attributes property.Ignored = (hasJsonIgnoreAttribute || !hasMemberAttribute); } // resolve converter for property // the class type might have a converter but the property converter takes presidence property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider, property.PropertyType); property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider, property.PropertyType); DefaultValueAttribute defaultValueAttribute = JsonTypeReflector.GetAttribute(attributeProvider); property.DefaultValue = (defaultValueAttribute != null) ? defaultValueAttribute.Value : null; property.NullValueHandling = (propertyAttribute != null) ? propertyAttribute._nullValueHandling : null; property.DefaultValueHandling = (propertyAttribute != null) ? propertyAttribute._defaultValueHandling : null; property.ReferenceLoopHandling = (propertyAttribute != null) ? propertyAttribute._referenceLoopHandling : null; property.ObjectCreationHandling = (propertyAttribute != null) ? propertyAttribute._objectCreationHandling : null; property.TypeNameHandling = (propertyAttribute != null) ? propertyAttribute._typeNameHandling : null; property.IsReference = (propertyAttribute != null) ? propertyAttribute._isReference : null; property.ItemIsReference = (propertyAttribute != null) ? propertyAttribute._itemIsReference : null; property.ItemConverter = (propertyAttribute != null && propertyAttribute.ItemConverterType != null) ? JsonConverterAttribute.CreateJsonConverterInstance(propertyAttribute.ItemConverterType) : null; property.ItemReferenceLoopHandling = (propertyAttribute != null) ? propertyAttribute._itemReferenceLoopHandling : null; property.ItemTypeNameHandling = (propertyAttribute != null) ? propertyAttribute._itemTypeNameHandling : null; allowNonPublicAccess = false; if ((DefaultMembersSearchFlags & BindingFlags.NonPublic) == BindingFlags.NonPublic) allowNonPublicAccess = true; if (propertyAttribute != null) allowNonPublicAccess = true; if (memberSerialization == MemberSerialization.Fields) allowNonPublicAccess = true; #if !PocketPC && !NET20 if (dataMemberAttribute != null) { allowNonPublicAccess = true; property.HasMemberAttribute = true; } #endif } private Predicate CreateShouldSerializeTest(MemberInfo member) { MethodInfo shouldSerializeMethod = member.DeclaringType.GetMethod(JsonTypeReflector.ShouldSerializePrefix + member.Name, ReflectionUtils.EmptyTypes); if (shouldSerializeMethod == null || shouldSerializeMethod.ReturnType != typeof(bool)) return null; MethodCall shouldSerializeCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(shouldSerializeMethod); return o => (bool)shouldSerializeCall(o); } private void SetIsSpecifiedActions(JsonProperty property, MemberInfo member, bool allowNonPublicAccess) { MemberInfo specifiedMember = member.DeclaringType.GetProperty(member.Name + JsonTypeReflector.SpecifiedPostfix); if (specifiedMember == null) specifiedMember = member.DeclaringType.GetField(member.Name + JsonTypeReflector.SpecifiedPostfix); if (specifiedMember == null || ReflectionUtils.GetMemberUnderlyingType(specifiedMember) != typeof(bool)) { return; } Func specifiedPropertyGet = JsonTypeReflector.ReflectionDelegateFactory.CreateGet(specifiedMember); property.GetIsSpecified = o => (bool)specifiedPropertyGet(o); if (ReflectionUtils.CanSetMemberValue(specifiedMember, allowNonPublicAccess, false)) property.SetIsSpecified = JsonTypeReflector.ReflectionDelegateFactory.CreateSet(specifiedMember); } /// /// Resolves the name of the property. /// /// Name of the property. /// Name of the property. protected internal virtual string ResolvePropertyName(string propertyName) { return propertyName; } /// /// Gets the resolved name of the property. /// /// Name of the property. /// Name of the property. public string GetResolvedPropertyName(string propertyName) { // this is a new method rather than changing the visibility of ResolvePropertyName to avoid // a breaking change for anyone who has overidden the method return ResolvePropertyName(propertyName); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonDictionaryContract.cs0000644000175000017500000001146312253423361032556 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Reflection; using Newtonsoft.Json.Utilities; using System.Collections; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonDictionaryContract : JsonContainerContract { /// /// Gets or sets the property name resolver. /// /// The property name resolver. public Func PropertyNameResolver { get; set; } /// /// Gets the of the dictionary keys. /// /// The of the dictionary keys. public Type DictionaryKeyType { get; private set; } /// /// Gets the of the dictionary values. /// /// The of the dictionary values. public Type DictionaryValueType { get; private set; } internal JsonContract KeyContract { get; set; } private readonly bool _isDictionaryValueTypeNullableType; private readonly Type _genericCollectionDefinitionType; private Type _genericWrapperType; private MethodCall _genericWrapperCreator; /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonDictionaryContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Dictionary; Type keyType; Type valueType; if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IDictionary<,>), out _genericCollectionDefinitionType)) { keyType = _genericCollectionDefinitionType.GetGenericArguments()[0]; valueType = _genericCollectionDefinitionType.GetGenericArguments()[1]; } else { ReflectionUtils.GetDictionaryKeyValueTypes(UnderlyingType, out keyType, out valueType); } DictionaryKeyType = keyType; DictionaryValueType = valueType; if (DictionaryValueType != null) _isDictionaryValueTypeNullableType = ReflectionUtils.IsNullableType(DictionaryValueType); if (IsTypeGenericDictionaryInterface(UnderlyingType)) { CreatedType = ReflectionUtils.MakeGenericType(typeof(Dictionary<,>), keyType, valueType); } else if (UnderlyingType == typeof(IDictionary)) { CreatedType = typeof (Dictionary); } } internal IWrappedDictionary CreateWrapper(object dictionary) { if (dictionary is IDictionary && (DictionaryValueType == null || !_isDictionaryValueTypeNullableType)) return new DictionaryWrapper((IDictionary)dictionary); if (_genericWrapperCreator == null) { _genericWrapperType = ReflectionUtils.MakeGenericType(typeof(DictionaryWrapper<,>), DictionaryKeyType, DictionaryValueType); ConstructorInfo genericWrapperConstructor = _genericWrapperType.GetConstructor(new[] { _genericCollectionDefinitionType }); _genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(genericWrapperConstructor); } return (IWrappedDictionary)_genericWrapperCreator(null, dictionary); } private bool IsTypeGenericDictionaryInterface(Type type) { if (!type.IsGenericType()) return false; Type genericDefinition = type.GetGenericTypeDefinition(); return (genericDefinition == typeof(IDictionary<,>)); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/ObjectConstructor.cs0000644000175000017500000000260712253423361031575 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Serialization { /// /// Represents a method that constructs an object. /// /// The object type to create. public delegate object ObjectConstructor(params object[] args); }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonStringContract.cs0000644000175000017500000000331312253423361031712 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonStringContract : JsonPrimitiveContract { /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonStringContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.String; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/IValueProvider.cs0000644000175000017500000000335412253423361031021 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Serialization { /// /// Provides methods to get and set values. /// public interface IValueProvider { /// /// Sets the value. /// /// The target to set the value on. /// The value to set on the target. void SetValue(object target, object value); /// /// Gets the value. /// /// The target to get the value from. /// The value. object GetValue(object target); } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs0000644000175000017500000020120212253423361033674 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System.ComponentModel; using System.Dynamic; #endif using System.Globalization; using System.Reflection; using System.Runtime.Serialization; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Serialization { internal class JsonSerializerInternalReader : JsonSerializerInternalBase { private JsonSerializerProxy _internalSerializer; #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) private JsonFormatterConverter _formatterConverter; #endif public JsonSerializerInternalReader(JsonSerializer serializer) : base(serializer) { } public void Populate(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(target, "target"); Type objectType = target.GetType(); JsonContract contract = Serializer.ContractResolver.ResolveContract(objectType); if (reader.TokenType == JsonToken.None) reader.Read(); if (reader.TokenType == JsonToken.StartArray) { if (contract.ContractType == JsonContractType.Array) PopulateList(CollectionUtils.CreateCollectionWrapper(target), reader, (JsonArrayContract) contract, null, null); else throw JsonSerializationException.Create(reader, "Cannot populate JSON array onto type '{0}'.".FormatWith(CultureInfo.InvariantCulture, objectType)); } else if (reader.TokenType == JsonToken.StartObject) { CheckedRead(reader); string id = null; if (reader.TokenType == JsonToken.PropertyName && string.Equals(reader.Value.ToString(), JsonTypeReflector.IdPropertyName, StringComparison.Ordinal)) { CheckedRead(reader); id = (reader.Value != null) ? reader.Value.ToString() : null; CheckedRead(reader); } if (contract.ContractType == JsonContractType.Dictionary) PopulateDictionary(CollectionUtils.CreateDictionaryWrapper(target), reader, (JsonDictionaryContract) contract, null, id); else if (contract.ContractType == JsonContractType.Object) PopulateObject(target, reader, (JsonObjectContract) contract, null, id); else throw JsonSerializationException.Create(reader, "Cannot populate JSON object onto type '{0}'.".FormatWith(CultureInfo.InvariantCulture, objectType)); } else { throw JsonSerializationException.Create(reader, "Unexpected initial token '{0}' when populating object. Expected JSON object or array.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } } private JsonContract GetContractSafe(Type type) { if (type == null) return null; return Serializer.ContractResolver.ResolveContract(type); } public object Deserialize(JsonReader reader, Type objectType, bool checkAdditionalContent) { if (reader == null) throw new ArgumentNullException("reader"); JsonContract contract = GetContractSafe(objectType); try { JsonConverter converter = GetConverter(contract, null, null, null); if (reader.TokenType == JsonToken.None && !ReadForType(reader, contract, converter != null)) { if (contract != null && !contract.IsNullable) throw JsonSerializationException.Create(reader, "No JSON content found and type '{0}' is not nullable.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); return null; } object deserializedValue; if (converter != null && converter.CanRead) deserializedValue = converter.ReadJson(reader, objectType, null, GetInternalSerializer()); else deserializedValue = CreateValueInternal(reader, objectType, contract, null, null, null, null); if (checkAdditionalContent) { if (reader.Read() && reader.TokenType != JsonToken.Comment) throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object."); } return deserializedValue; } catch (Exception ex) { if (IsErrorHandled(null, contract, null, reader.Path, ex)) { HandleError(reader, false, 0); return null; } else { throw; } } } private JsonSerializerProxy GetInternalSerializer() { if (_internalSerializer == null) _internalSerializer = new JsonSerializerProxy(this); return _internalSerializer; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) private JsonFormatterConverter GetFormatterConverter() { if (_formatterConverter == null) _formatterConverter = new JsonFormatterConverter(GetInternalSerializer()); return _formatterConverter; } #endif private JToken CreateJToken(JsonReader reader, JsonContract contract) { ValidationUtils.ArgumentNotNull(reader, "reader"); if (contract != null && contract.UnderlyingType == typeof (JRaw)) { return JRaw.Create(reader); } else { JToken token; using (JTokenWriter writer = new JTokenWriter()) { writer.WriteToken(reader); token = writer.Token; } return token; } } private JToken CreateJObject(JsonReader reader) { ValidationUtils.ArgumentNotNull(reader, "reader"); // this is needed because we've already read inside the object, looking for special properties JToken token; using (JTokenWriter writer = new JTokenWriter()) { writer.WriteStartObject(); if (reader.TokenType == JsonToken.PropertyName) writer.WriteToken(reader, reader.Depth - 1); else writer.WriteEndObject(); token = writer.Token; } return token; } private object CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) { if (contract != null && contract.ContractType == JsonContractType.Linq) return CreateJToken(reader, contract); do { switch (reader.TokenType) { // populate a typed object or generic dictionary/array // depending upon whether an objectType was supplied case JsonToken.StartObject: return CreateObject(reader, objectType, contract, member, containerContract, containerMember, existingValue); case JsonToken.StartArray: return CreateList(reader, objectType, contract, member, existingValue, null); case JsonToken.Integer: case JsonToken.Float: case JsonToken.Boolean: case JsonToken.Date: case JsonToken.Bytes: return EnsureType(reader, reader.Value, CultureInfo.InvariantCulture, contract, objectType); case JsonToken.String: // convert empty string to null automatically for nullable types if (string.IsNullOrEmpty((string)reader.Value) && objectType != typeof(string) && objectType != typeof(object) && contract != null && contract.IsNullable) return null; // string that needs to be returned as a byte array should be base 64 decoded if (objectType == typeof (byte[])) return Convert.FromBase64String((string) reader.Value); return EnsureType(reader, reader.Value, CultureInfo.InvariantCulture, contract, objectType); case JsonToken.StartConstructor: string constructorName = reader.Value.ToString(); return EnsureType(reader, constructorName, CultureInfo.InvariantCulture, contract, objectType); case JsonToken.Null: case JsonToken.Undefined: #if !(NETFX_CORE || PORTABLE) if (objectType == typeof (DBNull)) return DBNull.Value; #endif return EnsureType(reader, reader.Value, CultureInfo.InvariantCulture, contract, objectType); case JsonToken.Raw: return new JRaw((string) reader.Value); case JsonToken.Comment: // ignore break; default: throw JsonSerializationException.Create(reader, "Unexpected token while deserializing object: " + reader.TokenType); } } while (reader.Read()); throw JsonSerializationException.Create(reader, "Unexpected end when deserializing object."); } internal string GetExpectedDescription(JsonContract contract) { switch (contract.ContractType) { case JsonContractType.Object: case JsonContractType.Dictionary: #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) case JsonContractType.Serializable: #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) case JsonContractType.Dynamic: #endif return @"JSON object (e.g. {""name"":""value""})"; case JsonContractType.Array: return @"JSON array (e.g. [1,2,3])"; case JsonContractType.Primitive: return @"JSON primitive value (e.g. string, number, boolean, null)"; case JsonContractType.String: return @"JSON string value"; default: throw new ArgumentOutOfRangeException(); } } private JsonConverter GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty) { JsonConverter converter = null; if (memberConverter != null) { // member attribute converter converter = memberConverter; } else if (containerProperty != null && containerProperty.ItemConverter != null) { converter = containerProperty.ItemConverter; } else if (containerContract != null && containerContract.ItemConverter != null) { converter = containerContract.ItemConverter; } else if (contract != null) { JsonConverter matchingConverter; if (contract.Converter != null) // class attribute converter converter = contract.Converter; else if ((matchingConverter = Serializer.GetMatchingConverter(contract.UnderlyingType)) != null) // passed in converters converter = matchingConverter; else if (contract.InternalConverter != null) // internally specified converter converter = contract.InternalConverter; } return converter; } private object CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) { CheckedRead(reader); string id; object newValue; if (ReadSpecialProperties(reader, ref objectType, ref contract, member, containerContract, containerMember, existingValue, out newValue, out id)) return newValue; if (!HasDefinedType(objectType)) return CreateJObject(reader); if (contract == null) throw JsonSerializationException.Create(reader, "Could not resolve type '{0}' to a JsonContract.".FormatWith(CultureInfo.InvariantCulture, objectType)); switch (contract.ContractType) { case JsonContractType.Object: bool createdFromNonDefaultConstructor = false; JsonObjectContract objectContract = (JsonObjectContract) contract; object targetObject; if (existingValue != null) targetObject = existingValue; else targetObject = CreateNewObject(reader, objectContract, member, containerMember, id, out createdFromNonDefaultConstructor); // don't populate if read from non-default constructor because the object has already been read if (createdFromNonDefaultConstructor) return targetObject; return PopulateObject(targetObject, reader, objectContract, member, id); case JsonContractType.Primitive: JsonPrimitiveContract primitiveContract = (JsonPrimitiveContract) contract; // if the content is inside $value then read past it if (reader.TokenType == JsonToken.PropertyName && string.Equals(reader.Value.ToString(), JsonTypeReflector.ValuePropertyName, StringComparison.Ordinal)) { CheckedRead(reader); object value = CreateValueInternal(reader, objectType, primitiveContract, member, null, null, existingValue); CheckedRead(reader); return value; } break; case JsonContractType.Dictionary: JsonDictionaryContract dictionaryContract = (JsonDictionaryContract) contract; object targetDictionary; if (existingValue != null) targetDictionary = existingValue; else targetDictionary = CreateNewDictionary(reader, dictionaryContract); return PopulateDictionary(dictionaryContract.CreateWrapper(targetDictionary), reader, dictionaryContract, member, id); #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) case JsonContractType.Dynamic: JsonDynamicContract dynamicContract = (JsonDynamicContract) contract; return CreateDynamic(reader, dynamicContract, member, id); #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) case JsonContractType.Serializable: JsonISerializableContract serializableContract = (JsonISerializableContract) contract; return CreateISerializable(reader, serializableContract, id); #endif } throw JsonSerializationException.Create(reader, @"Cannot deserialize the current JSON object (e.g. {{""name"":""value""}}) into type '{0}' because the type requires a {1} to deserialize correctly. To fix this error either change the JSON to a {1} or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. ".FormatWith(CultureInfo.InvariantCulture, objectType, GetExpectedDescription(contract))); } private bool ReadSpecialProperties(JsonReader reader, ref Type objectType, ref JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue, out object newValue, out string id) { id = null; newValue = null; if (reader.TokenType == JsonToken.PropertyName) { string propertyName = reader.Value.ToString(); if (propertyName.Length > 0 && propertyName[0] == '$') { // read 'special' properties // $type, $id, $ref, etc bool specialProperty; do { propertyName = reader.Value.ToString(); if (string.Equals(propertyName, JsonTypeReflector.RefPropertyName, StringComparison.Ordinal)) { CheckedRead(reader); if (reader.TokenType != JsonToken.String && reader.TokenType != JsonToken.Null) throw JsonSerializationException.Create(reader, "JSON reference {0} property must have a string or null value.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName)); string reference = (reader.Value != null) ? reader.Value.ToString() : null; CheckedRead(reader); if (reference != null) { if (reader.TokenType == JsonToken.PropertyName) throw JsonSerializationException.Create(reader, "Additional content found in JSON reference object. A JSON reference object should only have a {0} property.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName)); { newValue = Serializer.ReferenceResolver.ResolveReference(this, reference); return true; } } else { specialProperty = true; } } else if (string.Equals(propertyName, JsonTypeReflector.TypePropertyName, StringComparison.Ordinal)) { CheckedRead(reader); string qualifiedTypeName = reader.Value.ToString(); TypeNameHandling resolvedTypeNameHandling = ((member != null) ? member.TypeNameHandling : null) ?? ((containerContract != null) ? containerContract.ItemTypeNameHandling : null) ?? ((containerMember != null) ? containerMember.ItemTypeNameHandling : null) ?? Serializer.TypeNameHandling; if (resolvedTypeNameHandling != TypeNameHandling.None) { string typeName; string assemblyName; ReflectionUtils.SplitFullyQualifiedTypeName(qualifiedTypeName, out typeName, out assemblyName); Type specifiedType; try { specifiedType = Serializer.Binder.BindToType(assemblyName, typeName); } catch (Exception ex) { throw JsonSerializationException.Create(reader, "Error resolving type specified in JSON '{0}'.".FormatWith(CultureInfo.InvariantCulture, qualifiedTypeName), ex); } if (specifiedType == null) throw JsonSerializationException.Create(reader, "Type specified in JSON '{0}' was not resolved.".FormatWith(CultureInfo.InvariantCulture, qualifiedTypeName)); if (objectType != null #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) && objectType != typeof (IDynamicMetaObjectProvider) #endif && !objectType.IsAssignableFrom(specifiedType)) throw JsonSerializationException.Create(reader, "Type specified in JSON '{0}' is not compatible with '{1}'.".FormatWith(CultureInfo.InvariantCulture, specifiedType.AssemblyQualifiedName, objectType.AssemblyQualifiedName)); objectType = specifiedType; contract = GetContractSafe(specifiedType); } CheckedRead(reader); specialProperty = true; } else if (string.Equals(propertyName, JsonTypeReflector.IdPropertyName, StringComparison.Ordinal)) { CheckedRead(reader); id = (reader.Value != null) ? reader.Value.ToString() : null; CheckedRead(reader); specialProperty = true; } else if (string.Equals(propertyName, JsonTypeReflector.ArrayValuesPropertyName, StringComparison.Ordinal)) { CheckedRead(reader); object list = CreateList(reader, objectType, contract, member, existingValue, id); CheckedRead(reader); newValue = list; return true; } else { specialProperty = false; } } while (specialProperty && reader.TokenType == JsonToken.PropertyName); } } return false; } private JsonArrayContract EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract) { if (contract == null) throw JsonSerializationException.Create(reader, "Could not resolve type '{0}' to a JsonContract.".FormatWith(CultureInfo.InvariantCulture, objectType)); JsonArrayContract arrayContract = contract as JsonArrayContract; if (arrayContract == null) throw JsonSerializationException.Create(reader, @"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type '{0}' because the type requires a {1} to deserialize correctly. To fix this error either change the JSON to a {1} or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. ".FormatWith(CultureInfo.InvariantCulture, objectType, GetExpectedDescription(contract))); return arrayContract; } private void CheckedRead(JsonReader reader) { if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when deserializing object."); } private object CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, object existingValue, string id) { object value; if (HasDefinedType(objectType)) { JsonArrayContract arrayContract = EnsureArrayContract(reader, objectType, contract); if (existingValue == null) { bool isTemporaryListReference; IList list = CollectionUtils.CreateList(contract.CreatedType, out isTemporaryListReference); if (id != null && isTemporaryListReference) throw JsonSerializationException.Create(reader, "Cannot preserve reference to array or readonly list: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); #if !PocketPC if (contract.OnSerializing != null && isTemporaryListReference) throw JsonSerializationException.Create(reader, "Cannot call OnSerializing on an array or readonly list: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); #endif if (contract.OnError != null && isTemporaryListReference) throw JsonSerializationException.Create(reader, "Cannot call OnError on an array or readonly list: {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); if (!arrayContract.IsMultidimensionalArray) PopulateList(arrayContract.CreateWrapper(list), reader, arrayContract, member, id); else PopulateMultidimensionalArray(list, reader, arrayContract, member, id); // create readonly and fixed sized collections using the temporary list if (isTemporaryListReference) { if (arrayContract.IsMultidimensionalArray) { list = CollectionUtils.ToMultidimensionalArray(list, ReflectionUtils.GetCollectionItemType(contract.CreatedType), contract.CreatedType.GetArrayRank()); } else if (contract.CreatedType.IsArray) { list = CollectionUtils.ToArray(((List) list).ToArray(), ReflectionUtils.GetCollectionItemType(contract.CreatedType)); } else if (ReflectionUtils.InheritsGenericDefinition(contract.CreatedType, typeof(ReadOnlyCollection<>))) { list = (IList) ReflectionUtils.CreateInstance(contract.CreatedType, list); } } else if (list is IWrappedCollection) { return ((IWrappedCollection)list).UnderlyingCollection; } value = list; } else { value = PopulateList(arrayContract.CreateWrapper(existingValue), reader, arrayContract, member, id); } } else { value = CreateJToken(reader, contract); } return value; } private bool HasDefinedType(Type type) { return (type != null && type != typeof (object) && !typeof (JToken).IsSubclassOf(type) #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) && type != typeof (IDynamicMetaObjectProvider) #endif ); } private object EnsureType(JsonReader reader, object value, CultureInfo culture, JsonContract contract, Type targetType) { if (targetType == null) return value; Type valueType = ReflectionUtils.GetObjectType(value); // type of value and type of target don't match // attempt to convert value's type to target's type if (valueType != targetType) { try { if (value == null && contract.IsNullable) return null; if (contract.IsConvertable) { if (contract.NonNullableUnderlyingType.IsEnum()) { if (value is string) return Enum.Parse(contract.NonNullableUnderlyingType, value.ToString(), true); else if (ConvertUtils.IsInteger(value)) return Enum.ToObject(contract.NonNullableUnderlyingType, value); } return Convert.ChangeType(value, contract.NonNullableUnderlyingType, culture); } return ConvertUtils.ConvertOrCast(value, culture, contract.NonNullableUnderlyingType); } catch (Exception ex) { throw JsonSerializationException.Create(reader, "Error converting value {0} to type '{1}'.".FormatWith(CultureInfo.InvariantCulture, FormatValueForPrint(value), targetType), ex); } } return value; } private string FormatValueForPrint(object value) { if (value == null) return "{null}"; if (value is string) return @"""" + value + @""""; return value.ToString(); } private void SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target) { object currentValue; bool useExistingValue; JsonContract propertyContract; bool gottenCurrentValue; if (CalculatePropertyDetails(property, ref propertyConverter, containerContract, containerProperty, reader, target, out useExistingValue, out currentValue, out propertyContract, out gottenCurrentValue)) return; object value; if (propertyConverter != null && propertyConverter.CanRead) { if (!gottenCurrentValue && target != null && property.Readable) currentValue = property.ValueProvider.GetValue(target); value = propertyConverter.ReadJson(reader, property.PropertyType, currentValue, GetInternalSerializer()); } else { value = CreateValueInternal(reader, property.PropertyType, propertyContract, property, containerContract, containerProperty, (useExistingValue) ? currentValue : null); } // always set the value if useExistingValue is false, // otherwise also set it if CreateValue returns a new value compared to the currentValue // this could happen because of a JsonConverter against the type if ((!useExistingValue || value != currentValue) && ShouldSetPropertyValue(property, value)) { property.ValueProvider.SetValue(target, value); if (property.SetIsSpecified != null) property.SetIsSpecified(target, true); } } private bool CalculatePropertyDetails(JsonProperty property, ref JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target, out bool useExistingValue, out object currentValue, out JsonContract propertyContract, out bool gottenCurrentValue) { currentValue = null; useExistingValue = false; propertyContract = null; gottenCurrentValue = false; if (property.Ignored) { reader.Skip(); return true; } ObjectCreationHandling objectCreationHandling = property.ObjectCreationHandling.GetValueOrDefault(Serializer.ObjectCreationHandling); if ((objectCreationHandling == ObjectCreationHandling.Auto || objectCreationHandling == ObjectCreationHandling.Reuse) && (reader.TokenType == JsonToken.StartArray || reader.TokenType == JsonToken.StartObject) && property.Readable) { currentValue = property.ValueProvider.GetValue(target); gottenCurrentValue = true; useExistingValue = (currentValue != null && !property.PropertyType.IsArray && !ReflectionUtils.InheritsGenericDefinition(property.PropertyType, typeof (ReadOnlyCollection<>)) && !property.PropertyType.IsValueType()); } if (!property.Writable && !useExistingValue) { reader.Skip(); return true; } // test tokentype here because null might not be convertable to some types, e.g. ignoring null when applied to DateTime if (property.NullValueHandling.GetValueOrDefault(Serializer.NullValueHandling) == NullValueHandling.Ignore && reader.TokenType == JsonToken.Null) { reader.Skip(); return true; } // test tokentype here because default value might not be convertable to actual type, e.g. default of "" for DateTime if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Ignore) && JsonReader.IsPrimitiveToken(reader.TokenType) && MiscellaneousUtils.ValueEquals(reader.Value, property.DefaultValue)) { reader.Skip(); return true; } if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); if (currentValue == null) { propertyContract = property.PropertyContract; } else { propertyContract = GetContractSafe(currentValue.GetType()); if (propertyContract != property.PropertyContract) propertyConverter = GetConverter(propertyContract, property.MemberConverter, containerContract, containerProperty); } return false; } private bool HasFlag(DefaultValueHandling value, DefaultValueHandling flag) { return ((value & flag) == flag); } private bool ShouldSetPropertyValue(JsonProperty property, object value) { if (property.NullValueHandling.GetValueOrDefault(Serializer.NullValueHandling) == NullValueHandling.Ignore && value == null) return false; if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Ignore) && MiscellaneousUtils.ValueEquals(value, property.DefaultValue)) return false; if (!property.Writable) return false; return true; } public object CreateNewDictionary(JsonReader reader, JsonDictionaryContract contract) { object dictionary; if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) dictionary = contract.DefaultCreator(); else throw JsonSerializationException.Create(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); return dictionary; } private object PopulateDictionary(IWrappedDictionary wrappedDictionary, JsonReader reader, JsonDictionaryContract contract, JsonProperty containerProperty, string id) { object dictionary = wrappedDictionary.UnderlyingDictionary; if (id != null) Serializer.ReferenceResolver.AddReference(this, id, dictionary); contract.InvokeOnDeserializing(dictionary, Serializer.Context); int initialDepth = reader.Depth; if (contract.KeyContract == null) contract.KeyContract = GetContractSafe(contract.DictionaryKeyType); if (contract.ItemContract == null) contract.ItemContract = GetContractSafe(contract.DictionaryValueType); JsonConverter dictionaryValueConverter = contract.ItemConverter ?? GetConverter(contract.ItemContract, null, contract, containerProperty); bool finished = false; do { switch (reader.TokenType) { case JsonToken.PropertyName: object keyValue = reader.Value; try { try { keyValue = EnsureType(reader, keyValue, CultureInfo.InvariantCulture, contract.KeyContract, contract.DictionaryKeyType); } catch (Exception ex) { throw JsonSerializationException.Create(reader, "Could not convert string '{0}' to dictionary key type '{1}'. Create a TypeConverter to convert from the string to the key type object.".FormatWith(CultureInfo.InvariantCulture, reader.Value, contract.DictionaryKeyType), ex); } if (!ReadForType(reader, contract.ItemContract, dictionaryValueConverter != null)) throw JsonSerializationException.Create(reader, "Unexpected end when deserializing object."); object itemValue; if (dictionaryValueConverter != null && dictionaryValueConverter.CanRead) itemValue = dictionaryValueConverter.ReadJson(reader, contract.DictionaryValueType, null, GetInternalSerializer()); else itemValue = CreateValueInternal(reader, contract.DictionaryValueType, contract.ItemContract, null, contract, containerProperty, null); wrappedDictionary[keyValue] = itemValue; } catch (Exception ex) { if (IsErrorHandled(dictionary, contract, keyValue, reader.Path, ex)) HandleError(reader, true, initialDepth); else throw; } break; case JsonToken.Comment: break; case JsonToken.EndObject: finished = true; break; default: throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); } } while (!finished && reader.Read()); if (!finished) ThrowUnexpectedEndException(reader, contract, dictionary, "Unexpected end when deserializing object."); contract.InvokeOnDeserialized(dictionary, Serializer.Context); return dictionary; } private object PopulateMultidimensionalArray(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, string id) { int rank = contract.UnderlyingType.GetArrayRank(); if (id != null) Serializer.ReferenceResolver.AddReference(this, id, list); contract.InvokeOnDeserializing(list, Serializer.Context); JsonContract collectionItemContract = GetContractSafe(contract.CollectionItemType); JsonConverter collectionItemConverter = GetConverter(collectionItemContract, null, contract, containerProperty); int? previousErrorIndex = null; Stack listStack = new Stack(); listStack.Push(list); IList currentList = list; bool finished = false; do { int initialDepth = reader.Depth; if (listStack.Count == rank) { try { if (ReadForType(reader, collectionItemContract, collectionItemConverter != null)) { switch (reader.TokenType) { case JsonToken.EndArray: listStack.Pop(); currentList = listStack.Peek(); previousErrorIndex = null; break; case JsonToken.Comment: break; default: object value; if (collectionItemConverter != null && collectionItemConverter.CanRead) value = collectionItemConverter.ReadJson(reader, contract.CollectionItemType, null, GetInternalSerializer()); else value = CreateValueInternal(reader, contract.CollectionItemType, collectionItemContract, null, contract, containerProperty, null); currentList.Add(value); break; } } else { break; } } catch (Exception ex) { JsonPosition errorPosition = reader.GetPosition(initialDepth); if (IsErrorHandled(list, contract, errorPosition.Position, reader.Path, ex)) { HandleError(reader, true, initialDepth); if (previousErrorIndex != null && previousErrorIndex == errorPosition.Position) { // reader index has not moved since previous error handling // break out of reading array to prevent infinite loop throw JsonSerializationException.Create(reader, "Infinite loop detected from error handling.", ex); } else { previousErrorIndex = errorPosition.Position; } } else { throw; } } } else { if (reader.Read()) { switch (reader.TokenType) { case JsonToken.StartArray: IList newList = new List(); currentList.Add(newList); listStack.Push(newList); currentList = newList; break; case JsonToken.EndArray: listStack.Pop(); if (listStack.Count > 0) { currentList = listStack.Peek(); } else { finished = true; } break; case JsonToken.Comment: break; default: throw JsonSerializationException.Create(reader, "Unexpected token when deserializing multidimensional array: " + reader.TokenType); } } else { break; } } } while (!finished); if (!finished) ThrowUnexpectedEndException(reader, contract, list, "Unexpected end when deserializing array."); contract.InvokeOnDeserialized(list, Serializer.Context); return list; } private void ThrowUnexpectedEndException(JsonReader reader, JsonContract contract, object currentObject, string message) { try { throw JsonSerializationException.Create(reader, message); } catch (Exception ex) { if (IsErrorHandled(currentObject, contract, null, reader.Path, ex)) HandleError(reader, false, 0); else throw; } } private object PopulateList(IWrappedCollection wrappedList, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, string id) { object list = wrappedList.UnderlyingCollection; if (id != null) Serializer.ReferenceResolver.AddReference(this, id, list); // can't populate an existing array if (wrappedList.IsFixedSize) { reader.Skip(); return list; } contract.InvokeOnDeserializing(list, Serializer.Context); int initialDepth = reader.Depth; JsonContract collectionItemContract = GetContractSafe(contract.CollectionItemType); JsonConverter collectionItemConverter = GetConverter(collectionItemContract, null, contract, containerProperty); int? previousErrorIndex = null; bool finished = false; do { try { if (ReadForType(reader, collectionItemContract, collectionItemConverter != null)) { switch (reader.TokenType) { case JsonToken.EndArray: finished = true; break; case JsonToken.Comment: break; default: object value; if (collectionItemConverter != null && collectionItemConverter.CanRead) value = collectionItemConverter.ReadJson(reader, contract.CollectionItemType, null, GetInternalSerializer()); else value = CreateValueInternal(reader, contract.CollectionItemType, collectionItemContract, null, contract, containerProperty, null); wrappedList.Add(value); break; } } else { break; } } catch (Exception ex) { JsonPosition errorPosition = reader.GetPosition(initialDepth); if (IsErrorHandled(list, contract, errorPosition.Position, reader.Path, ex)) { HandleError(reader, true, initialDepth); if (previousErrorIndex != null && previousErrorIndex == errorPosition.Position) { // reader index has not moved since previous error handling // break out of reading array to prevent infinite loop throw JsonSerializationException.Create(reader, "Infinite loop detected from error handling.", ex); } else { previousErrorIndex = errorPosition.Position; } } else { throw; } } } while (!finished); if (!finished) ThrowUnexpectedEndException(reader, contract, list, "Unexpected end when deserializing array."); contract.InvokeOnDeserialized(list, Serializer.Context); return list; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) private object CreateISerializable(JsonReader reader, JsonISerializableContract contract, string id) { Type objectType = contract.UnderlyingType; if (!JsonTypeReflector.FullyTrusted) { throw JsonSerializationException.Create(reader, @"Type '{0}' implements ISerializable but cannot be deserialized using the ISerializable interface because the current application is not fully trusted and ISerializable can expose secure data. To fix this error either change the environment to be fully trusted, change the application to not deserialize the type, add JsonObjectAttribute to the type or change the JsonSerializer setting ContractResolver to use a new DefaultContractResolver with IgnoreSerializableInterface set to true. ".FormatWith(CultureInfo.InvariantCulture, objectType)); } SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, GetFormatterConverter()); bool finished = false; do { switch (reader.TokenType) { case JsonToken.PropertyName: string memberName = reader.Value.ToString(); if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); serializationInfo.AddValue(memberName, JToken.ReadFrom(reader)); break; case JsonToken.Comment: break; case JsonToken.EndObject: finished = true; break; default: throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); } } while (!finished && reader.Read()); if (!finished) ThrowUnexpectedEndException(reader, contract, serializationInfo, "Unexpected end when deserializing object."); if (contract.ISerializableCreator == null) throw JsonSerializationException.Create(reader, "ISerializable type '{0}' does not have a valid constructor. To correctly implement ISerializable a constructor that takes SerializationInfo and StreamingContext parameters should be present.".FormatWith(CultureInfo.InvariantCulture, objectType)); object createdObject = contract.ISerializableCreator(serializationInfo, Serializer.Context); if (id != null) Serializer.ReferenceResolver.AddReference(this, id, createdObject); // these are together because OnDeserializing takes an object but for an ISerializable the object is fully created in the constructor contract.InvokeOnDeserializing(createdObject, Serializer.Context); contract.InvokeOnDeserialized(createdObject, Serializer.Context); return createdObject; } #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) private object CreateDynamic(JsonReader reader, JsonDynamicContract contract, JsonProperty member, string id) { IDynamicMetaObjectProvider newObject; if (contract.UnderlyingType.IsInterface() || contract.UnderlyingType.IsAbstract()) throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) newObject = (IDynamicMetaObjectProvider) contract.DefaultCreator(); else throw JsonSerializationException.Create(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); if (id != null) Serializer.ReferenceResolver.AddReference(this, id, newObject); contract.InvokeOnDeserializing(newObject, Serializer.Context); int initialDepth = reader.Depth; bool finished = false; do { switch (reader.TokenType) { case JsonToken.PropertyName: string memberName = reader.Value.ToString(); try { if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); // first attempt to find a settable property, otherwise fall back to a dynamic set without type JsonProperty property = contract.Properties.GetClosestMatchProperty(memberName); if (property != null && property.Writable && !property.Ignored) { if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, null, null); SetPropertyValue(property, propertyConverter, null, member, reader, newObject); } else { Type t = (JsonReader.IsPrimitiveToken(reader.TokenType)) ? reader.ValueType : typeof (IDynamicMetaObjectProvider); JsonContract dynamicMemberContract = GetContractSafe(t); JsonConverter dynamicMemberConverter = GetConverter(dynamicMemberContract, null, null, member); object value; if (dynamicMemberConverter != null && dynamicMemberConverter.CanRead) value = dynamicMemberConverter.ReadJson(reader, t, null, GetInternalSerializer()); else value = CreateValueInternal(reader, t, dynamicMemberContract, null, null, member, null); newObject.TrySetMember(memberName, value); } } catch (Exception ex) { if (IsErrorHandled(newObject, contract, memberName, reader.Path, ex)) HandleError(reader, true, initialDepth); else throw; } break; case JsonToken.EndObject: finished = true; break; default: throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); } } while (!finished && reader.Read()); if (!finished) ThrowUnexpectedEndException(reader, contract, newObject, "Unexpected end when deserializing object."); contract.InvokeOnDeserialized(newObject, Serializer.Context); return newObject; } #endif private object CreateObjectFromNonDefaultConstructor(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ConstructorInfo constructorInfo, string id) { ValidationUtils.ArgumentNotNull(constructorInfo, "constructorInfo"); Type objectType = contract.UnderlyingType; IDictionary propertyValues = ResolvePropertyAndConstructorValues(contract, containerProperty, reader, objectType); IDictionary constructorParameters = constructorInfo.GetParameters().ToDictionary(p => p, p => (object) null); IDictionary remainingPropertyValues = new Dictionary(); foreach (KeyValuePair propertyValue in propertyValues) { ParameterInfo matchingConstructorParameter = constructorParameters.ForgivingCaseSensitiveFind(kv => kv.Key.Name, propertyValue.Key.UnderlyingName).Key; if (matchingConstructorParameter != null) constructorParameters[matchingConstructorParameter] = propertyValue.Value; else remainingPropertyValues.Add(propertyValue); } object createdObject = constructorInfo.Invoke(constructorParameters.Values.ToArray()); if (id != null) Serializer.ReferenceResolver.AddReference(this, id, createdObject); contract.InvokeOnDeserializing(createdObject, Serializer.Context); // go through unused values and set the newly created object's properties foreach (KeyValuePair remainingPropertyValue in remainingPropertyValues) { JsonProperty property = remainingPropertyValue.Key; object value = remainingPropertyValue.Value; if (ShouldSetPropertyValue(remainingPropertyValue.Key, remainingPropertyValue.Value)) { property.ValueProvider.SetValue(createdObject, value); } else if (!property.Writable && value != null) { // handle readonly collection/dictionary properties JsonContract propertyContract = Serializer.ContractResolver.ResolveContract(property.PropertyType); if (propertyContract.ContractType == JsonContractType.Array) { JsonArrayContract propertyArrayContract = (JsonArrayContract)propertyContract; object createdObjectCollection = property.ValueProvider.GetValue(createdObject); if (createdObjectCollection != null) { IWrappedCollection createdObjectCollectionWrapper = propertyArrayContract.CreateWrapper(createdObjectCollection); IWrappedCollection newValues = propertyArrayContract.CreateWrapper(value); foreach (object newValue in newValues) { createdObjectCollectionWrapper.Add(newValue); } } } else if (propertyContract.ContractType == JsonContractType.Dictionary) { JsonDictionaryContract jsonDictionaryContract = (JsonDictionaryContract)propertyContract; object createdObjectDictionary = property.ValueProvider.GetValue(createdObject); if (createdObjectDictionary != null) { IWrappedDictionary createdObjectDictionaryWrapper = jsonDictionaryContract.CreateWrapper(createdObjectDictionary); IWrappedDictionary newValues = jsonDictionaryContract.CreateWrapper(value); foreach (DictionaryEntry newValue in newValues) { createdObjectDictionaryWrapper.Add(newValue.Key, newValue.Value); } } } } } contract.InvokeOnDeserialized(createdObject, Serializer.Context); return createdObject; } private IDictionary ResolvePropertyAndConstructorValues(JsonObjectContract contract, JsonProperty containerProperty, JsonReader reader, Type objectType) { IDictionary propertyValues = new Dictionary(); bool exit = false; do { switch (reader.TokenType) { case JsonToken.PropertyName: string memberName = reader.Value.ToString(); // attempt exact case match first // then try match ignoring case JsonProperty property = contract.ConstructorParameters.GetClosestMatchProperty(memberName) ?? contract.Properties.GetClosestMatchProperty(memberName); if (property != null) { if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, contract, containerProperty); if (!ReadForType(reader, property.PropertyContract, propertyConverter != null)) throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); if (!property.Ignored) { if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); object propertyValue; if (propertyConverter != null && propertyConverter.CanRead) propertyValue = propertyConverter.ReadJson(reader, property.PropertyType, null, GetInternalSerializer()); else propertyValue = CreateValueInternal(reader, property.PropertyType, property.PropertyContract, property, contract, containerProperty, null); propertyValues[property] = propertyValue; } else { reader.Skip(); } } else { if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); if (Serializer.MissingMemberHandling == MissingMemberHandling.Error) throw JsonSerializationException.Create(reader, "Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, objectType.Name)); reader.Skip(); } break; case JsonToken.Comment: break; case JsonToken.EndObject: exit = true; break; default: throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); } } while (!exit && reader.Read()); return propertyValues; } private bool ReadForType(JsonReader reader, JsonContract contract, bool hasConverter) { // don't read properties with converters as a specific value // the value might be a string which will then get converted which will error if read as date for example if (hasConverter) return reader.Read(); ReadType t = (contract != null) ? contract.InternalReadType : ReadType.Read; switch (t) { case ReadType.Read: do { if (!reader.Read()) return false; } while (reader.TokenType == JsonToken.Comment); return true; case ReadType.ReadAsInt32: reader.ReadAsInt32(); break; case ReadType.ReadAsDecimal: reader.ReadAsDecimal(); break; case ReadType.ReadAsBytes: reader.ReadAsBytes(); break; case ReadType.ReadAsString: reader.ReadAsString(); break; case ReadType.ReadAsDateTime: reader.ReadAsDateTime(); break; #if !NET20 case ReadType.ReadAsDateTimeOffset: reader.ReadAsDateTimeOffset(); break; #endif default: throw new ArgumentOutOfRangeException(); } return (reader.TokenType != JsonToken.None); } public object CreateNewObject(JsonReader reader, JsonObjectContract objectContract, JsonProperty containerMember, JsonProperty containerProperty, string id, out bool createdFromNonDefaultConstructor) { object newObject = null; if (objectContract.UnderlyingType.IsInterface() || objectContract.UnderlyingType.IsAbstract()) throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantated.".FormatWith(CultureInfo.InvariantCulture, objectContract.UnderlyingType)); if (objectContract.OverrideConstructor != null) { if (objectContract.OverrideConstructor.GetParameters().Length > 0) { createdFromNonDefaultConstructor = true; return CreateObjectFromNonDefaultConstructor(reader, objectContract, containerMember, objectContract.OverrideConstructor, id); } newObject = objectContract.OverrideConstructor.Invoke(null); } else if (objectContract.DefaultCreator != null && (!objectContract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor || objectContract.ParametrizedConstructor == null)) { // use the default constructor if it is... // public // non-public and the user has change constructor handling settings // non-public and there is no other constructor newObject = objectContract.DefaultCreator(); } else if (objectContract.ParametrizedConstructor != null) { createdFromNonDefaultConstructor = true; return CreateObjectFromNonDefaultConstructor(reader, objectContract, containerMember, objectContract.ParametrizedConstructor, id); } if (newObject == null) throw JsonSerializationException.Create(reader, "Unable to find a constructor to use for type {0}. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute.".FormatWith(CultureInfo.InvariantCulture, objectContract.UnderlyingType)); createdFromNonDefaultConstructor = false; return newObject; } private object PopulateObject(object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, string id) { contract.InvokeOnDeserializing(newObject, Serializer.Context); // only need to keep a track of properies presence if they are required or a value should be defaulted if missing Dictionary propertiesPresence = (contract.HasRequiredOrDefaultValueProperties || HasFlag(Serializer.DefaultValueHandling, DefaultValueHandling.Populate)) ? contract.Properties.ToDictionary(m => m, m => PropertyPresence.None) : null; if (id != null) Serializer.ReferenceResolver.AddReference(this, id, newObject); int initialDepth = reader.Depth; bool finished = false; do { switch (reader.TokenType) { case JsonToken.PropertyName: { string memberName = reader.Value.ToString(); try { // attempt exact case match first // then try match ignoring case JsonProperty property = contract.Properties.GetClosestMatchProperty(memberName); if (property == null) { if (Serializer.MissingMemberHandling == MissingMemberHandling.Error) throw JsonSerializationException.Create(reader, "Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType.Name)); reader.Skip(); continue; } if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, contract, member); if (!ReadForType(reader, property.PropertyContract, propertyConverter != null)) throw JsonSerializationException.Create(reader, "Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); SetPropertyPresence(reader, property, propertiesPresence); SetPropertyValue(property, propertyConverter, contract, member, reader, newObject); } catch (Exception ex) { if (IsErrorHandled(newObject, contract, memberName, reader.Path, ex)) HandleError(reader, true, initialDepth); else throw; } } break; case JsonToken.EndObject: finished = true; break; case JsonToken.Comment: // ignore break; default: throw JsonSerializationException.Create(reader, "Unexpected token when deserializing object: " + reader.TokenType); } } while (!finished && reader.Read()); if (!finished) ThrowUnexpectedEndException(reader, contract, newObject, "Unexpected end when deserializing object."); EndObject(newObject, reader, contract, initialDepth, propertiesPresence); contract.InvokeOnDeserialized(newObject, Serializer.Context); return newObject; } private void EndObject(object newObject, JsonReader reader, JsonObjectContract contract, int initialDepth, Dictionary propertiesPresence) { if (propertiesPresence != null) { foreach (KeyValuePair propertyPresence in propertiesPresence) { JsonProperty property = propertyPresence.Key; PropertyPresence presence = propertyPresence.Value; if (presence == PropertyPresence.None || presence == PropertyPresence.Null) { try { Required resolvedRequired = property._required ?? contract.ItemRequired ?? Required.Default; switch (presence) { case PropertyPresence.None: if (resolvedRequired == Required.AllowNull || resolvedRequired == Required.Always) throw JsonSerializationException.Create(reader, "Required property '{0}' not found in JSON.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName)); if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Populate) && property.Writable) property.ValueProvider.SetValue(newObject, EnsureType(reader, property.DefaultValue, CultureInfo.InvariantCulture, property.PropertyContract, property.PropertyType)); break; case PropertyPresence.Null: if (resolvedRequired == Required.Always) throw JsonSerializationException.Create(reader, "Required property '{0}' expects a value but got null.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName)); break; } } catch (Exception ex) { if (IsErrorHandled(newObject, contract, property.PropertyName, reader.Path, ex)) HandleError(reader, true, initialDepth); else throw; } } } } } private void SetPropertyPresence(JsonReader reader, JsonProperty property, Dictionary requiredProperties) { if (property != null && requiredProperties != null) { requiredProperties[property] = (reader.TokenType == JsonToken.Null || reader.TokenType == JsonToken.Undefined) ? PropertyPresence.Null : PropertyPresence.Value; } } private void HandleError(JsonReader reader, bool readPastError, int initialDepth) { ClearErrorContext(); if (readPastError) { reader.Skip(); while (reader.Depth > (initialDepth + 1)) { if (!reader.Read()) break; } } } internal enum PropertyPresence { None, Null, Value } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonFormatterConverter.cs0000644000175000017500000000756212253423361032613 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; using System.Globalization; using System.Runtime.Serialization; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; namespace Newtonsoft.Json.Serialization { internal class JsonFormatterConverter : IFormatterConverter { private readonly JsonSerializer _serializer; public JsonFormatterConverter(JsonSerializer serializer) { ValidationUtils.ArgumentNotNull(serializer, "serializer"); _serializer = serializer; } private T GetTokenValue(object value) { ValidationUtils.ArgumentNotNull(value, "value"); JValue v = (JValue)value; return (T)System.Convert.ChangeType(v.Value, typeof(T), CultureInfo.InvariantCulture); } public object Convert(object value, Type type) { ValidationUtils.ArgumentNotNull(value, "value"); JToken token = value as JToken; if (token == null) throw new ArgumentException("Value is not a JToken.", "value"); return _serializer.Deserialize(token.CreateReader(), type); } public object Convert(object value, TypeCode typeCode) { ValidationUtils.ArgumentNotNull(value, "value"); if (value is JValue) value = ((JValue) value).Value; return System.Convert.ChangeType(value, typeCode, CultureInfo.InvariantCulture); } public bool ToBoolean(object value) { return GetTokenValue(value); } public byte ToByte(object value) { return GetTokenValue(value); } public char ToChar(object value) { return GetTokenValue(value); } public DateTime ToDateTime(object value) { return GetTokenValue(value); } public decimal ToDecimal(object value) { return GetTokenValue(value); } public double ToDouble(object value) { return GetTokenValue(value); } public short ToInt16(object value) { return GetTokenValue(value); } public int ToInt32(object value) { return GetTokenValue(value); } public long ToInt64(object value) { return GetTokenValue(value); } public sbyte ToSByte(object value) { return GetTokenValue(value); } public float ToSingle(object value) { return GetTokenValue(value); } public string ToString(object value) { return GetTokenValue(value); } public ushort ToUInt16(object value) { return GetTokenValue(value); } public uint ToUInt32(object value) { return GetTokenValue(value); } public ulong ToUInt64(object value) { return GetTokenValue(value); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/DefaultSerializationBinder.cs0000644000175000017500000001245112253423361033365 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Runtime.Serialization; using System.Reflection; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Serialization { /// /// The default serialization binder used when resolving and loading classes from type names. /// public class DefaultSerializationBinder : SerializationBinder { internal static readonly DefaultSerializationBinder Instance = new DefaultSerializationBinder(); private readonly ThreadSafeStore _typeCache = new ThreadSafeStore(GetTypeFromTypeNameKey); private static Type GetTypeFromTypeNameKey(TypeNameKey typeNameKey) { string assemblyName = typeNameKey.AssemblyName; string typeName = typeNameKey.TypeName; if (assemblyName != null) { Assembly assembly; #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) // look, I don't like using obsolete methods as much as you do but this is the only way // Assembly.Load won't check the GAC for a partial name #pragma warning disable 618,612 assembly = Assembly.LoadWithPartialName(assemblyName); #pragma warning restore 618,612 #elif NETFX_CORE assembly = Assembly.Load(new AssemblyName(assemblyName)); #else assembly = Assembly.Load(assemblyName); #endif if (assembly == null) throw new JsonSerializationException("Could not load assembly '{0}'.".FormatWith(CultureInfo.InvariantCulture, assemblyName)); Type type = assembly.GetType(typeName); if (type == null) throw new JsonSerializationException("Could not find type '{0}' in assembly '{1}'.".FormatWith(CultureInfo.InvariantCulture, typeName, assembly.FullName)); return type; } else { return Type.GetType(typeName); } } internal struct TypeNameKey : IEquatable { internal readonly string AssemblyName; internal readonly string TypeName; public TypeNameKey(string assemblyName, string typeName) { AssemblyName = assemblyName; TypeName = typeName; } public override int GetHashCode() { return ((AssemblyName != null) ? AssemblyName.GetHashCode() : 0) ^ ((TypeName != null) ? TypeName.GetHashCode() : 0); } public override bool Equals(object obj) { if (!(obj is TypeNameKey)) return false; return Equals((TypeNameKey)obj); } public bool Equals(TypeNameKey other) { return (AssemblyName == other.AssemblyName && TypeName == other.TypeName); } } /// /// When overridden in a derived class, controls the binding of a serialized object to a type. /// /// Specifies the name of the serialized object. /// Specifies the name of the serialized object. /// /// The type of the object the formatter creates a new instance of. /// public override Type BindToType(string assemblyName, string typeName) { return _typeCache.Get(new TypeNameKey(assemblyName, typeName)); } #if !(NET35 || NET20) /// /// When overridden in a derived class, controls the binding of a serialized object to a type. /// /// The type of the object the formatter creates a new instance of. /// Specifies the name of the serialized object. /// Specifies the name of the serialized object. public override void BindToName(Type serializedType, out string assemblyName, out string typeName) { #if NETFX_CORE assemblyName = serializedType.GetTypeInfo().Assembly.FullName; typeName = serializedType.FullName; #elif !SILVERLIGHT assemblyName = serializedType.Assembly.FullName; typeName = serializedType.FullName; #else assemblyName = null; typeName = serializedType.AssemblyQualifiedName; #endif } #endif } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonISerializableContract.cs0000644000175000017500000000377212253423361033174 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonISerializableContract : JsonContract { /// /// Gets or sets the ISerializable object constructor. /// /// The ISerializable object constructor. public ObjectConstructor ISerializableCreator { get; set; } /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonISerializableContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Serializable; } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/ErrorContext.cs0000644000175000017500000000500312253423361030550 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// Provides information surrounding an error. /// public class ErrorContext { internal ErrorContext(object originalObject, object member, string path, Exception error) { OriginalObject = originalObject; Member = member; Error = error; Path = path; } /// /// Gets or sets the error. /// /// The error. public Exception Error { get; private set; } /// /// Gets the original object that caused the error. /// /// The original object that caused the error. public object OriginalObject { get; private set; } /// /// Gets the member that caused the error. /// /// The member that caused the error. public object Member { get; private set; } /// /// Gets the path of the JSON location where the error occurred. /// /// The path of the JSON location where the error occurred. public string Path { get; private set; } /// /// Gets or sets a value indicating whether this is handled. /// /// true if handled; otherwise, false. public bool Handled { get; set; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonLinqContract.cs0000644000175000017500000000327512253423361031356 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonLinqContract : JsonContract { /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonLinqContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Linq; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/IReferenceResolver.cs0000644000175000017500000000535212253423361031652 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Serialization { /// /// Used to resolve references when serializing and deserializing JSON by the . /// public interface IReferenceResolver { /// /// Resolves a reference to its object. /// /// The serialization context. /// The reference to resolve. /// The object that object ResolveReference(object context, string reference); /// /// Gets the reference for the sepecified object. /// /// The serialization context. /// The object to get a reference for. /// The reference to the object. string GetReference(object context, object value); /// /// Determines whether the specified object is referenced. /// /// The serialization context. /// The object to test for a reference. /// /// true if the specified object is referenced; otherwise, false. /// bool IsReferenced(object context, object value); /// /// Adds a reference to the specified object. /// /// The serialization context. /// The reference. /// The object to reference. void AddReference(object context, string reference, object value); } }CamelCasePropertyNamesContractResolver.cs0000644000175000017500000000403712253423361035627 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Serialization { /// /// Resolves member mappings for a type, camel casing property names. /// public class CamelCasePropertyNamesContractResolver : DefaultContractResolver { /// /// Initializes a new instance of the class. /// public CamelCasePropertyNamesContractResolver() : base(true) { } /// /// Resolves the name of the property. /// /// Name of the property. /// The property name camel cased. protected internal override string ResolvePropertyName(string propertyName) { // lower case the first letter of the passed in name return StringUtils.ToCamelCase(propertyName); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/ReflectionValueProvider.cs0000644000175000017500000000563112253423361032723 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Reflection; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json.Serialization { /// /// Get and set values for a using reflection. /// public class ReflectionValueProvider : IValueProvider { private readonly MemberInfo _memberInfo; /// /// Initializes a new instance of the class. /// /// The member info. public ReflectionValueProvider(MemberInfo memberInfo) { ValidationUtils.ArgumentNotNull(memberInfo, "memberInfo"); _memberInfo = memberInfo; } /// /// Sets the value. /// /// The target to set the value on. /// The value to set on the target. public void SetValue(object target, object value) { try { ReflectionUtils.SetMemberValue(_memberInfo, target, value); } catch (Exception ex) { throw new JsonSerializationException("Error setting value to '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); } } /// /// Gets the value. /// /// The target to get the value from. /// The value. public object GetValue(object target) { try { return ReflectionUtils.GetMemberValue(_memberInfo, target); } catch (Exception ex) { throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/DynamicValueProvider.cs0000644000175000017500000001002612253423361032207 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || PORTABLE || NETFX_CORE) using System; using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif using System.Text; using System.Reflection; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json.Serialization { /// /// Get and set values for a using dynamic methods. /// public class DynamicValueProvider : IValueProvider { private readonly MemberInfo _memberInfo; private Func _getter; private Action _setter; /// /// Initializes a new instance of the class. /// /// The member info. public DynamicValueProvider(MemberInfo memberInfo) { ValidationUtils.ArgumentNotNull(memberInfo, "memberInfo"); _memberInfo = memberInfo; } /// /// Sets the value. /// /// The target to set the value on. /// The value to set on the target. public void SetValue(object target, object value) { try { if (_setter == null) _setter = DynamicReflectionDelegateFactory.Instance.CreateSet(_memberInfo); #if DEBUG // dynamic method doesn't check whether the type is 'legal' to set // add this check for unit tests if (value == null) { if (!ReflectionUtils.IsNullable(ReflectionUtils.GetMemberUnderlyingType(_memberInfo))) throw new JsonSerializationException("Incompatible value. Cannot set {0} to null.".FormatWith(CultureInfo.InvariantCulture, _memberInfo)); } else if (!ReflectionUtils.GetMemberUnderlyingType(_memberInfo).IsAssignableFrom(value.GetType())) { throw new JsonSerializationException("Incompatible value. Cannot set {0} to type {1}.".FormatWith(CultureInfo.InvariantCulture, _memberInfo, value.GetType())); } #endif _setter(target, value); } catch (Exception ex) { throw new JsonSerializationException("Error setting value to '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); } } /// /// Gets the value. /// /// The target to get the value from. /// The value. public object GetValue(object target) { try { if (_getter == null) _getter = DynamicReflectionDelegateFactory.Instance.CreateGet(_memberInfo); return _getter(target); } catch (Exception ex) { throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex); } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/CachedAttributeGetter.cs0000644000175000017500000000334612253423361032330 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Reflection; using Newtonsoft.Json.Utilities; #if NETFX_CORE || PORTABLE using ICustomAttributeProvider = Newtonsoft.Json.Utilities.CustomAttributeProvider; #endif namespace Newtonsoft.Json.Serialization { internal static class CachedAttributeGetter where T : Attribute { private static readonly ThreadSafeStore TypeAttributeCache = new ThreadSafeStore(JsonTypeReflector.GetAttribute); public static T GetAttribute(ICustomAttributeProvider type) { return TypeAttributeCache.Get(type); } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/IContractResolver.cs0000644000175000017500000000404412253423361031526 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// Used by to resolves a for a given . /// /// /// /// /// public interface IContractResolver { /// /// Resolves the contract for a given type. /// /// The type to resolve a contract for. /// The contract for a given type. JsonContract ResolveContract(Type type); } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonContract.cs0000644000175000017500000001620212253423361030524 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Reflection; using System.Runtime.Serialization; using Newtonsoft.Json.Utilities; #if NETFX_CORE using IConvertible = Newtonsoft.Json.Utilities.Convertible; #endif namespace Newtonsoft.Json.Serialization { internal enum JsonContractType { None, Object, Array, Primitive, String, Dictionary, #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) Dynamic, #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) Serializable, #endif Linq } /// /// Contract details for a used by the . /// public abstract class JsonContract { internal bool IsNullable; internal bool IsConvertable; internal Type NonNullableUnderlyingType; internal ReadType InternalReadType; internal JsonContractType ContractType; /// /// Gets the underlying type for the contract. /// /// The underlying type for the contract. public Type UnderlyingType { get; private set; } /// /// Gets or sets the type created during deserialization. /// /// The type created during deserialization. public Type CreatedType { get; set; } /// /// Gets or sets whether this type contract is serialized as a reference. /// /// Whether this type contract is serialized as a reference. public bool? IsReference { get; set; } /// /// Gets or sets the default for this contract. /// /// The converter. public JsonConverter Converter { get; set; } // internally specified JsonConverter's to override default behavour // checked for after passed in converters and attribute specified converters internal JsonConverter InternalConverter { get; set; } #if !PocketPC /// /// Gets or sets the method called immediately after deserialization of the object. /// /// The method called immediately after deserialization of the object. public MethodInfo OnDeserialized { get; set; } /// /// Gets or sets the method called during deserialization of the object. /// /// The method called during deserialization of the object. public MethodInfo OnDeserializing { get; set; } /// /// Gets or sets the method called after serialization of the object graph. /// /// The method called after serialization of the object graph. public MethodInfo OnSerialized { get; set; } /// /// Gets or sets the method called before serialization of the object. /// /// The method called before serialization of the object. public MethodInfo OnSerializing { get; set; } #endif /// /// Gets or sets the default creator method used to create the object. /// /// The default creator method used to create the object. public Func DefaultCreator { get; set; } /// /// Gets or sets a value indicating whether the default creator is non public. /// /// true if the default object creator is non-public; otherwise, false. public bool DefaultCreatorNonPublic { get; set; } /// /// Gets or sets the method called when an error is thrown during the serialization of the object. /// /// The method called when an error is thrown during the serialization of the object. public MethodInfo OnError { get; set; } internal void InvokeOnSerializing(object o, StreamingContext context) { #if !PocketPC if (OnSerializing != null) OnSerializing.Invoke(o, new object[] {context}); #endif } internal void InvokeOnSerialized(object o, StreamingContext context) { #if !PocketPC if (OnSerialized != null) OnSerialized.Invoke(o, new object[] {context}); #endif } internal void InvokeOnDeserializing(object o, StreamingContext context) { #if !PocketPC if (OnDeserializing != null) OnDeserializing.Invoke(o, new object[] {context}); #endif } internal void InvokeOnDeserialized(object o, StreamingContext context) { #if !PocketPC if (OnDeserialized != null) OnDeserialized.Invoke(o, new object[] {context}); #endif } internal void InvokeOnError(object o, StreamingContext context, ErrorContext errorContext) { if (OnError != null) OnError.Invoke(o, new object[] {context, errorContext}); } internal JsonContract(Type underlyingType) { ValidationUtils.ArgumentNotNull(underlyingType, "underlyingType"); UnderlyingType = underlyingType; IsNullable = ReflectionUtils.IsNullable(underlyingType); NonNullableUnderlyingType = (IsNullable && ReflectionUtils.IsNullableType(underlyingType)) ? Nullable.GetUnderlyingType(underlyingType) : underlyingType; CreatedType = NonNullableUnderlyingType; IsConvertable = ConvertUtils.IsConvertible(NonNullableUnderlyingType); if (NonNullableUnderlyingType == typeof(byte[])) { InternalReadType = ReadType.ReadAsBytes; } else if (NonNullableUnderlyingType == typeof(int)) { InternalReadType = ReadType.ReadAsInt32; } else if (NonNullableUnderlyingType == typeof(decimal)) { InternalReadType = ReadType.ReadAsDecimal; } else if (NonNullableUnderlyingType == typeof(string)) { InternalReadType = ReadType.ReadAsString; } else if (NonNullableUnderlyingType == typeof(DateTime)) { InternalReadType = ReadType.ReadAsDateTime; } #if !NET20 else if (NonNullableUnderlyingType == typeof(DateTimeOffset)) { InternalReadType = ReadType.ReadAsDateTimeOffset; } #endif else { InternalReadType = ReadType.Read; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/DefaultReferenceResolver.cs0000644000175000017500000000537512253423361033053 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json.Serialization { internal class DefaultReferenceResolver : IReferenceResolver { private int _referenceCount; private BidirectionalDictionary GetMappings(object context) { JsonSerializerInternalBase internalSerializer; if (context is JsonSerializerInternalBase) internalSerializer = (JsonSerializerInternalBase) context; else if (context is JsonSerializerProxy) internalSerializer = ((JsonSerializerProxy) context).GetInternalSerializer(); else throw new JsonException("The DefaultReferenceResolver can only be used internally."); return internalSerializer.DefaultReferenceMappings; } public object ResolveReference(object context, string reference) { object value; GetMappings(context).TryGetByFirst(reference, out value); return value; } public string GetReference(object context, object value) { var mappings = GetMappings(context); string reference; if (!mappings.TryGetBySecond(value, out reference)) { _referenceCount++; reference = _referenceCount.ToString(CultureInfo.InvariantCulture); mappings.Add(reference, value); } return reference; } public void AddReference(object context, string reference, object value) { GetMappings(context).Add(reference, value); } public bool IsReferenced(object context, object value) { string reference; return GetMappings(context).TryGetBySecond(value, out reference); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonTypeReflector.cs0000644000175000017500000003537012253423361031545 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.ComponentModel; using System.Globalization; using System.Reflection; #if !(NETFX_CORE || PORTABLE) using System.Security.Permissions; #endif using Newtonsoft.Json.Utilities; #if NETFX_CORE || PORTABLE using ICustomAttributeProvider = Newtonsoft.Json.Utilities.CustomAttributeProvider; #endif #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using System.Runtime.Serialization; namespace Newtonsoft.Json.Serialization { #if !SILVERLIGHT && !PocketPC && !NET20 && !NETFX_CORE internal interface IMetadataTypeAttribute { Type MetadataClassType { get; } } #endif internal static class JsonTypeReflector { public const string IdPropertyName = "$id"; public const string RefPropertyName = "$ref"; public const string TypePropertyName = "$type"; public const string ValuePropertyName = "$value"; public const string ArrayValuesPropertyName = "$values"; public const string ShouldSerializePrefix = "ShouldSerialize"; public const string SpecifiedPostfix = "Specified"; private static readonly ThreadSafeStore JsonConverterTypeCache = new ThreadSafeStore(GetJsonConverterTypeFromAttribute); #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) private static readonly ThreadSafeStore AssociatedMetadataTypesCache = new ThreadSafeStore(GetAssociateMetadataTypeFromAttribute); private const string MetadataTypeAttributeTypeName = "System.ComponentModel.DataAnnotations.MetadataTypeAttribute, System.ComponentModel.DataAnnotations, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; private static Type _cachedMetadataTypeAttributeType; #endif #if SILVERLIGHT private static readonly ThreadSafeStore TypeConverterTypeCache = new ThreadSafeStore(GetTypeConverterTypeFromAttribute); private static Type GetTypeConverterTypeFromAttribute(ICustomAttributeProvider attributeProvider) { TypeConverterAttribute converterAttribute = GetAttribute(attributeProvider); if (converterAttribute == null) return null; return Type.GetType(converterAttribute.ConverterTypeName); } private static Type GetTypeConverterType(ICustomAttributeProvider attributeProvider) { return TypeConverterTypeCache.Get(attributeProvider); } #endif public static JsonContainerAttribute GetJsonContainerAttribute(Type type) { return CachedAttributeGetter.GetAttribute(type.GetCustomAttributeProvider()); } public static JsonObjectAttribute GetJsonObjectAttribute(Type type) { return GetJsonContainerAttribute(type) as JsonObjectAttribute; } public static JsonArrayAttribute GetJsonArrayAttribute(Type type) { return GetJsonContainerAttribute(type) as JsonArrayAttribute; } public static JsonDictionaryAttribute GetJsonDictionaryAttribute(Type type) { return GetJsonContainerAttribute(type) as JsonDictionaryAttribute; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) public static SerializableAttribute GetSerializableAttribute(Type type) { return CachedAttributeGetter.GetAttribute(type.GetCustomAttributeProvider()); } #endif #if !PocketPC && !NET20 public static DataContractAttribute GetDataContractAttribute(Type type) { // DataContractAttribute does not have inheritance Type currentType = type; while (currentType != null) { DataContractAttribute result = CachedAttributeGetter.GetAttribute(currentType.GetCustomAttributeProvider()); if (result != null) return result; currentType = currentType.BaseType(); } return null; } public static DataMemberAttribute GetDataMemberAttribute(MemberInfo memberInfo) { // DataMemberAttribute does not have inheritance // can't override a field if (memberInfo.MemberType() == MemberTypes.Field) return CachedAttributeGetter.GetAttribute(memberInfo.GetCustomAttributeProvider()); // search property and then search base properties if nothing is returned and the property is virtual PropertyInfo propertyInfo = (PropertyInfo)memberInfo; DataMemberAttribute result = CachedAttributeGetter.GetAttribute(propertyInfo.GetCustomAttributeProvider()); if (result == null) { if (propertyInfo.IsVirtual()) { Type currentType = propertyInfo.DeclaringType; while (result == null && currentType != null) { PropertyInfo baseProperty = (PropertyInfo)ReflectionUtils.GetMemberInfoFromType(currentType, propertyInfo); if (baseProperty != null && baseProperty.IsVirtual()) result = CachedAttributeGetter.GetAttribute(baseProperty.GetCustomAttributeProvider()); currentType = currentType.BaseType(); } } } return result; } #endif public static MemberSerialization GetObjectMemberSerialization(Type objectType, bool ignoreSerializableAttribute) { JsonObjectAttribute objectAttribute = GetJsonObjectAttribute(objectType); if (objectAttribute != null) return objectAttribute.MemberSerialization; #if !PocketPC && !NET20 DataContractAttribute dataContractAttribute = GetDataContractAttribute(objectType); if (dataContractAttribute != null) return MemberSerialization.OptIn; #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) if (!ignoreSerializableAttribute) { SerializableAttribute serializableAttribute = GetSerializableAttribute(objectType); if (serializableAttribute != null) return MemberSerialization.Fields; } #endif // the default return MemberSerialization.OptOut; } private static Type GetJsonConverterType(ICustomAttributeProvider attributeProvider) { return JsonConverterTypeCache.Get(attributeProvider); } private static Type GetJsonConverterTypeFromAttribute(ICustomAttributeProvider attributeProvider) { JsonConverterAttribute converterAttribute = GetAttribute(attributeProvider); return (converterAttribute != null) ? converterAttribute.ConverterType : null; } public static JsonConverter GetJsonConverter(ICustomAttributeProvider attributeProvider, Type targetConvertedType) { object provider = null; #if !(NETFX_CORE || PORTABLE) provider = attributeProvider as MemberInfo; #else provider = attributeProvider.UnderlyingObject; #endif Type converterType = GetJsonConverterType(attributeProvider); if (converterType != null) { JsonConverter memberConverter = JsonConverterAttribute.CreateJsonConverterInstance(converterType); return memberConverter; } return null; } #if !(NETFX_CORE || PORTABLE) #if !PocketPC public static TypeConverter GetTypeConverter(Type type) { #if !SILVERLIGHT return TypeDescriptor.GetConverter(type); #else Type converterType = GetTypeConverterType(type); if (converterType != null) return (TypeConverter)ReflectionUtils.CreateInstance(converterType); return null; #endif #endif } #endif #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) private static Type GetAssociatedMetadataType(Type type) { return AssociatedMetadataTypesCache.Get(type); } private static Type GetAssociateMetadataTypeFromAttribute(Type type) { Type metadataTypeAttributeType = GetMetadataTypeAttributeType(); if (metadataTypeAttributeType == null) return null; object attribute = type.GetCustomAttributes(metadataTypeAttributeType, true).SingleOrDefault(); if (attribute == null) return null; IMetadataTypeAttribute metadataTypeAttribute = (DynamicCodeGeneration) ? DynamicWrapper.CreateWrapper(attribute) : new LateBoundMetadataTypeAttribute(attribute); return metadataTypeAttribute.MetadataClassType; } private static Type GetMetadataTypeAttributeType() { // always attempt to get the metadata type attribute type // the assembly may have been loaded since last time if (_cachedMetadataTypeAttributeType == null) { Type metadataTypeAttributeType = Type.GetType(MetadataTypeAttributeTypeName); if (metadataTypeAttributeType != null) _cachedMetadataTypeAttributeType = metadataTypeAttributeType; else return null; } return _cachedMetadataTypeAttributeType; } #endif private static T GetAttribute(Type type) where T : Attribute { T attribute; #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) Type metadataType = GetAssociatedMetadataType(type); if (metadataType != null) { attribute = ReflectionUtils.GetAttribute(metadataType, true); if (attribute != null) return attribute; } #endif attribute = ReflectionUtils.GetAttribute(type.GetCustomAttributeProvider(), true); if (attribute != null) return attribute; foreach (Type typeInterface in type.GetInterfaces()) { attribute = ReflectionUtils.GetAttribute(typeInterface.GetCustomAttributeProvider(), true); if (attribute != null) return attribute; } return null; } private static T GetAttribute(MemberInfo memberInfo) where T : Attribute { T attribute; #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) Type metadataType = GetAssociatedMetadataType(memberInfo.DeclaringType); if (metadataType != null) { MemberInfo metadataTypeMemberInfo = ReflectionUtils.GetMemberInfoFromType(metadataType, memberInfo); if (metadataTypeMemberInfo != null) { attribute = ReflectionUtils.GetAttribute(metadataTypeMemberInfo, true); if (attribute != null) return attribute; } } #endif attribute = ReflectionUtils.GetAttribute(memberInfo.GetCustomAttributeProvider(), true); if (attribute != null) return attribute; if (memberInfo.DeclaringType != null) { foreach (Type typeInterface in memberInfo.DeclaringType.GetInterfaces()) { MemberInfo interfaceTypeMemberInfo = ReflectionUtils.GetMemberInfoFromType(typeInterface, memberInfo); if (interfaceTypeMemberInfo != null) { attribute = ReflectionUtils.GetAttribute(interfaceTypeMemberInfo.GetCustomAttributeProvider(), true); if (attribute != null) return attribute; } } } return null; } public static T GetAttribute(ICustomAttributeProvider attributeProvider) where T : Attribute { object provider = null; #if !(NETFX_CORE || PORTABLE) provider = attributeProvider; #else provider = attributeProvider.UnderlyingObject; #endif Type type = provider as Type; if (type != null) return GetAttribute(type); MemberInfo memberInfo = provider as MemberInfo; if (memberInfo != null) return GetAttribute(memberInfo); return ReflectionUtils.GetAttribute(attributeProvider, true); } private static bool? _dynamicCodeGeneration; private static bool? _fullyTrusted; #if DEBUG internal static void SetFullyTrusted(bool fullyTrusted) { _fullyTrusted = fullyTrusted; } internal static void SetDynamicCodeGeneration(bool dynamicCodeGeneration) { _dynamicCodeGeneration = dynamicCodeGeneration; } #endif public static bool DynamicCodeGeneration { get { if (_dynamicCodeGeneration == null) { #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) try { new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Demand(); new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess).Demand(); new SecurityPermission(SecurityPermissionFlag.SkipVerification).Demand(); new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); new SecurityPermission(PermissionState.Unrestricted).Demand(); _dynamicCodeGeneration = true; } catch (Exception) { _dynamicCodeGeneration = false; } #else _dynamicCodeGeneration = false; #endif } return _dynamicCodeGeneration.Value; } } public static bool FullyTrusted { get { if (_fullyTrusted == null) { #if (NETFX_CORE || SILVERLIGHT || PORTABLE) _fullyTrusted = false; #elif !(NET20 || NET35) AppDomain appDomain = AppDomain.CurrentDomain; _fullyTrusted = appDomain.IsHomogenous && appDomain.IsFullyTrusted; #else try { new SecurityPermission(PermissionState.Unrestricted).Demand(); _fullyTrusted = true; } catch (Exception) { _fullyTrusted = false; } #endif } return _fullyTrusted.Value; } } public static ReflectionDelegateFactory ReflectionDelegateFactory { get { #if !(SILVERLIGHT || PORTABLE || NETFX_CORE) if (DynamicCodeGeneration) return DynamicReflectionDelegateFactory.Instance; #endif return LateBoundReflectionDelegateFactory.Instance; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonPrimitiveContract.cs0000644000175000017500000000331612253423361032417 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonPrimitiveContract : JsonContract { /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonPrimitiveContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Primitive; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonProperty.cs0000644000175000017500000002024412253423361030574 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif namespace Newtonsoft.Json.Serialization { /// /// Maps a JSON property to a .NET member or constructor parameter. /// public class JsonProperty { internal Required? _required; // use to cache contract during deserialization internal JsonContract PropertyContract { get; set; } /// /// Gets or sets the name of the property. /// /// The name of the property. public string PropertyName { get; set; } /// /// Gets or sets the type that declared this property. /// /// The type that declared this property. public Type DeclaringType { get; set; } /// /// Gets or sets the order of serialization and deserialization of a member. /// /// The numeric order of serialization or deserialization. public int? Order { get; set; } /// /// Gets or sets the name of the underlying member or parameter. /// /// The name of the underlying member or parameter. public string UnderlyingName { get; set; } /// /// Gets the that will get and set the during serialization. /// /// The that will get and set the during serialization. public IValueProvider ValueProvider { get; set; } /// /// Gets or sets the type of the property. /// /// The type of the property. public Type PropertyType { get; set; } /// /// Gets or sets the for the property. /// If set this converter takes presidence over the contract converter for the property type. /// /// The converter. public JsonConverter Converter { get; set; } /// /// Gets the member converter. /// /// The member converter. public JsonConverter MemberConverter { get; set; } /// /// Gets a value indicating whether this is ignored. /// /// true if ignored; otherwise, false. public bool Ignored { get; set; } /// /// Gets a value indicating whether this is readable. /// /// true if readable; otherwise, false. public bool Readable { get; set; } /// /// Gets a value indicating whether this is writable. /// /// true if writable; otherwise, false. public bool Writable { get; set; } /// /// Gets a value indicating whether this has a member attribute. /// /// true if has a member attribute; otherwise, false. public bool HasMemberAttribute { get; set; } /// /// Gets the default value. /// /// The default value. public object DefaultValue { get; set; } /// /// Gets a value indicating whether this is required. /// /// A value indicating whether this is required. public Required Required { get { return _required ?? Required.Default; } set { _required = value; } } /// /// Gets a value indicating whether this property preserves object references. /// /// /// true if this instance is reference; otherwise, false. /// public bool? IsReference { get; set; } /// /// Gets the property null value handling. /// /// The null value handling. public NullValueHandling? NullValueHandling { get; set; } /// /// Gets the property default value handling. /// /// The default value handling. public DefaultValueHandling? DefaultValueHandling { get; set; } /// /// Gets the property reference loop handling. /// /// The reference loop handling. public ReferenceLoopHandling? ReferenceLoopHandling { get; set; } /// /// Gets the property object creation handling. /// /// The object creation handling. public ObjectCreationHandling? ObjectCreationHandling { get; set; } /// /// Gets or sets the type name handling. /// /// The type name handling. public TypeNameHandling? TypeNameHandling { get; set; } /// /// Gets or sets a predicate used to determine whether the property should be serialize. /// /// A predicate used to determine whether the property should be serialize. public Predicate ShouldSerialize { get; set; } /// /// Gets or sets a predicate used to determine whether the property should be serialized. /// /// A predicate used to determine whether the property should be serialized. public Predicate GetIsSpecified { get; set; } /// /// Gets or sets an action used to set whether the property has been deserialized. /// /// An action used to set whether the property has been deserialized. public Action SetIsSpecified { get; set; } /// /// Returns a that represents this instance. /// /// /// A that represents this instance. /// public override string ToString() { return PropertyName; } /// /// Gets or sets the converter used when serializing the property's collection items. /// /// The collection's items converter. public JsonConverter ItemConverter { get; set; } /// /// Gets or sets whether this property's collection items are serialized as a reference. /// /// Whether this property's collection items are serialized as a reference. public bool? ItemIsReference { get; set; } /// /// Gets or sets the the type name handling used when serializing the property's collection items. /// /// The collection's items type name handling. public TypeNameHandling? ItemTypeNameHandling { get; set; } /// /// Gets or sets the the reference loop handling used when serializing the property's collection items. /// /// The collection's items reference loop handling. public ReferenceLoopHandling? ItemReferenceLoopHandling { get; set; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonArrayContract.cs0000644000175000017500000001335112253423361031525 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Reflection; using Newtonsoft.Json.Utilities; using System.Collections; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonArrayContract : JsonContainerContract { /// /// Gets the of the collection items. /// /// The of the collection items. public Type CollectionItemType { get; private set; } /// /// Gets a value indicating whether the collection type is a multidimensional array. /// /// true if the collection type is a multidimensional array; otherwise, false. public bool IsMultidimensionalArray { get; private set; } private readonly bool _isCollectionItemTypeNullableType; private readonly Type _genericCollectionDefinitionType; private Type _genericWrapperType; private MethodCall _genericWrapperCreator; /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonArrayContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Array; if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection<>), out _genericCollectionDefinitionType)) { CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0]; } else if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { _genericCollectionDefinitionType = typeof (IEnumerable<>); CollectionItemType = underlyingType.GetGenericArguments()[0]; } else { CollectionItemType = ReflectionUtils.GetCollectionItemType(UnderlyingType); } if (CollectionItemType != null) _isCollectionItemTypeNullableType = ReflectionUtils.IsNullableType(CollectionItemType); if (IsTypeGenericCollectionInterface(UnderlyingType)) { CreatedType = ReflectionUtils.MakeGenericType(typeof(List<>), CollectionItemType); } IsMultidimensionalArray = (UnderlyingType.IsArray && UnderlyingType.GetArrayRank() > 1); } internal IWrappedCollection CreateWrapper(object list) { if ((list is IList && (CollectionItemType == null || !_isCollectionItemTypeNullableType)) || UnderlyingType.IsArray) return new CollectionWrapper((IList)list); if (_genericCollectionDefinitionType != null) { EnsureGenericWrapperCreator(); return (IWrappedCollection) _genericWrapperCreator(null, list); } else { IList values = ((IEnumerable) list).Cast().ToList(); if (CollectionItemType != null) { Array array = Array.CreateInstance(CollectionItemType, values.Count); for (int i = 0; i < values.Count; i++) { array.SetValue(values[i], i); } values = array; } return new CollectionWrapper(values); } } private void EnsureGenericWrapperCreator() { if (_genericWrapperCreator == null) { _genericWrapperType = ReflectionUtils.MakeGenericType(typeof (CollectionWrapper<>), CollectionItemType); Type constructorArgument; if (ReflectionUtils.InheritsGenericDefinition(_genericCollectionDefinitionType, typeof(List<>)) || _genericCollectionDefinitionType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) constructorArgument = ReflectionUtils.MakeGenericType(typeof(ICollection<>), CollectionItemType); else constructorArgument = _genericCollectionDefinitionType; ConstructorInfo genericWrapperConstructor = _genericWrapperType.GetConstructor(new[] { constructorArgument }); _genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(genericWrapperConstructor); } } private bool IsTypeGenericCollectionInterface(Type type) { if (!type.IsGenericType()) return false; Type genericDefinition = type.GetGenericTypeDefinition(); return (genericDefinition == typeof(IList<>) || genericDefinition == typeof(ICollection<>) || genericDefinition == typeof(IEnumerable<>)); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalBase.cs0000644000175000017500000000752112253423361033354 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Net; using System.Runtime.CompilerServices; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Serialization { internal abstract class JsonSerializerInternalBase { private class ReferenceEqualsEqualityComparer : IEqualityComparer { bool IEqualityComparer.Equals(object x, object y) { return ReferenceEquals(x, y); } int IEqualityComparer.GetHashCode(object obj) { #if !(NETFX_CORE || PORTABLE) // put objects in a bucket based on their reference return RuntimeHelpers.GetHashCode(obj); #else // put all objects in the same bucket so ReferenceEquals is called on all return -1; #endif } } private ErrorContext _currentErrorContext; private BidirectionalDictionary _mappings; internal readonly JsonSerializer Serializer; protected JsonSerializerInternalBase(JsonSerializer serializer) { ValidationUtils.ArgumentNotNull(serializer, "serializer"); Serializer = serializer; } internal BidirectionalDictionary DefaultReferenceMappings { get { // override equality comparer for object key dictionary // object will be modified as it deserializes and might have mutable hashcode if (_mappings == null) _mappings = new BidirectionalDictionary( EqualityComparer.Default, new ReferenceEqualsEqualityComparer()); return _mappings; } } protected ErrorContext GetErrorContext(object currentObject, object member, string path, Exception error) { if (_currentErrorContext == null) _currentErrorContext = new ErrorContext(currentObject, member, path, error); if (_currentErrorContext.Error != error) throw new InvalidOperationException("Current error context error is different to requested error."); return _currentErrorContext; } protected void ClearErrorContext() { if (_currentErrorContext == null) throw new InvalidOperationException("Could not clear error context. Error context is already null."); _currentErrorContext = null; } protected bool IsErrorHandled(object currentObject, JsonContract contract, object keyValue, string path, Exception ex) { ErrorContext errorContext = GetErrorContext(currentObject, keyValue, path, ex); if (contract != null) contract.InvokeOnError(currentObject, Serializer.Context, errorContext); if (!errorContext.Handled) Serializer.OnError(new ErrorEventArgs(currentObject, errorContext)); return errorContext.Handled; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/LateBoundMetadataTypeAttribute.cs0000644000175000017500000000371712253423361034170 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !SILVERLIGHT && !PocketPC && !NET20 && !NETFX_CORE using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json.Utilities; using System.Reflection; namespace Newtonsoft.Json.Serialization { internal class LateBoundMetadataTypeAttribute : IMetadataTypeAttribute { private static PropertyInfo _metadataClassTypeProperty; private readonly object _attribute; public LateBoundMetadataTypeAttribute(object attribute) { _attribute = attribute; } public Type MetadataClassType { get { if (_metadataClassTypeProperty == null) _metadataClassTypeProperty = _attribute.GetType().GetProperty("MetadataClassType"); return (Type)ReflectionUtils.GetMemberValue(_metadataClassTypeProperty, _attribute); } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Serialization/JsonPropertyCollection.cs0000644000175000017500000001272312253423361032613 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; using System.Collections.ObjectModel; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json.Serialization { /// /// A collection of objects. /// public class JsonPropertyCollection : KeyedCollection { private readonly Type _type; /// /// Initializes a new instance of the class. /// /// The type. public JsonPropertyCollection(Type type) : base(StringComparer.Ordinal) { ValidationUtils.ArgumentNotNull(type, "type"); _type = type; } /// /// When implemented in a derived class, extracts the key from the specified element. /// /// The element from which to extract the key. /// The key for the specified element. protected override string GetKeyForItem(JsonProperty item) { return item.PropertyName; } /// /// Adds a object. /// /// The property to add to the collection. public void AddProperty(JsonProperty property) { if (Contains(property.PropertyName)) { // don't overwrite existing property with ignored property if (property.Ignored) return; JsonProperty existingProperty = this[property.PropertyName]; bool duplicateProperty = true; if (existingProperty.Ignored) { // remove ignored property so it can be replaced in collection Remove(existingProperty); duplicateProperty = false; } if (property.DeclaringType != null && existingProperty.DeclaringType != null) { if (property.DeclaringType.IsSubclassOf(existingProperty.DeclaringType)) { // current property is on a derived class and hides the existing Remove(existingProperty); duplicateProperty = false; } if (existingProperty.DeclaringType.IsSubclassOf(property.DeclaringType)) { // current property is hidden by the existing so don't add it return; } } if (duplicateProperty) throw new JsonSerializationException("A member with the name '{0}' already exists on '{1}'. Use the JsonPropertyAttribute to specify another name.".FormatWith(CultureInfo.InvariantCulture, property.PropertyName, _type)); } Add(property); } /// /// Gets the closest matching object. /// First attempts to get an exact case match of propertyName and then /// a case insensitive match. /// /// Name of the property. /// A matching property if found. public JsonProperty GetClosestMatchProperty(string propertyName) { JsonProperty property = GetProperty(propertyName, StringComparison.Ordinal); if (property == null) property = GetProperty(propertyName, StringComparison.OrdinalIgnoreCase); return property; } private bool TryGetValue(string key, out JsonProperty item) { if (Dictionary == null) { item = default(JsonProperty); return false; } return Dictionary.TryGetValue(key, out item); } /// /// Gets a property by property name. /// /// The name of the property to get. /// Type property name string comparison. /// A matching property if found. public JsonProperty GetProperty(string propertyName, StringComparison comparisonType) { // KeyedCollection has an ordinal comparer if (comparisonType == StringComparison.Ordinal) { JsonProperty property; if (TryGetValue(propertyName, out property)) return property; return null; } foreach (JsonProperty property in this) { if (string.Equals(propertyName, property.PropertyName, comparisonType)) { return property; } } return null; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.Portable.csproj0000644000175000017500000002611212253423361031021 0ustar00meebeymeebey00000000000000 Debug AnyCPU {959F7F85-C98B-4876-971A-9036224578E4} Library Properties Newtonsoft.Json Newtonsoft.Json v4.0 Profile2 512 {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true full false bin\Debug\Portable\ TRACE;DEBUG;PORTABLE prompt 4 pdbonly true bin\Release\Portable\ TRACE;PORTABLE prompt 4 bin\Release\Portable\Newtonsoft.Json.xml smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonIgnoreAttribute.cs0000644000175000017500000000302612253423361027241 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json { /// /// Instructs the not to serialize the public field or public read/write property value. /// [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonPosition.cs0000644000175000017500000000501712253423361025740 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json { internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { internal JsonContainerType Type; internal int? Position; internal string PropertyName; internal void WriteTo(StringBuilder sb) { switch (Type) { case JsonContainerType.Object: if (PropertyName != null) { if (sb.Length > 0) sb.Append("."); sb.Append(PropertyName); } break; case JsonContainerType.Array: case JsonContainerType.Constructor: if (Position != null) { sb.Append("["); sb.Append(Position); sb.Append("]"); } break; } } internal bool InsideContainer() { switch (Type) { case JsonContainerType.Object: return (PropertyName != null); case JsonContainerType.Array: case JsonContainerType.Constructor: return (Position != null); } return false; } internal static string BuildPath(IEnumerable positions) { StringBuilder sb = new StringBuilder(); foreach (JsonPosition state in positions) { state.WriteTo(sb); } return sb.ToString(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/DefaultValueHandling.cs0000644000175000017500000000532112253423361027326 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Specifies default value handling options for the . /// /// /// /// /// [Flags] public enum DefaultValueHandling { /// /// Include members where the member value is the same as the member's default value when serializing objects. /// Included members are written to JSON. Has no effect when deserializing. /// Include = 0, /// /// Ignore members where the member value is the same as the member's default value when serializing objects /// so that is is not written to JSON, and ignores setting members when the JSON value equals the member's default value. /// Ignore = 1, /// /// Members with a default value but no JSON will be set to their default value when deserializing. /// Populate = 2, /// /// Ignore members where the member value is the same as the member's default value when serializing objects /// and sets members to their default value when deserializing. /// IgnoreAndPopulate = Ignore | Populate } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Required.cs0000644000175000017500000000315412253423361025062 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Indicating whether a property is required. /// public enum Required { /// /// The property is not required. The default state. /// Default, /// /// The property must be defined in JSON but can be a null value. /// AllowNull, /// /// The property must be defined in JSON and cannot be a null value. /// Always } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.csproj0000644000175000017500000003213412652472053027260 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Library Properties Newtonsoft.Json Newtonsoft.Json false 3.5 false publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false true v4.5 true full false bin\Debug\Net40\ DEBUG;TRACE;NET35 prompt 4 bin\Debug\Net40\Newtonsoft.Json.xml true Newtonsoft.Json.ruleset pdbonly true bin\Release\Net40\ TRACE prompt 4 bin\Release\Net40\Newtonsoft.Json.xml AllRules.ruleset 3.5 3.0 3.5 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 2.0 %28x86%29 true False .NET Framework 3.0 %28x86%29 false False .NET Framework 3.5 false False .NET Framework 3.5 SP1 false smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonDictionaryAttribute.cs0000644000175000017500000000363012253423361030124 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Instructs the how to serialize the collection. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { /// /// Initializes a new instance of the class. /// public JsonDictionaryAttribute() { } /// /// Initializes a new instance of the class with the specified container Id. /// /// The container Id. public JsonDictionaryAttribute(string id) : base(id) { } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/MissingMemberHandling.cs0000644000175000017500000000325412253423361027511 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json { /// /// Specifies missing member handling options for the . /// public enum MissingMemberHandling { /// /// Ignore a missing member and do not attempt to deserialize it. /// Ignore = 0, /// /// Throw a when a missing member is encountered during deserialization. /// Error = 1 } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/ReferenceLoopHandling.cs0000644000175000017500000000332512253423361027477 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json { /// /// Specifies reference loop handling options for the . /// public enum ReferenceLoopHandling { /// /// Throw a when a loop is encountered. /// Error = 0, /// /// Ignore loop references and do not serialize. /// Ignore = 1, /// /// Serialize loop references. /// Serialize = 2 } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/0000755000175000017500000000000012253423361023653 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JTokenReader.cs0000644000175000017500000002214112253423361026517 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Linq { /// /// Represents a reader that provides fast, non-cached, forward-only access to serialized Json data. /// public class JTokenReader : JsonReader, IJsonLineInfo { private readonly JToken _root; private JToken _parent; private JToken _current; /// /// Initializes a new instance of the class. /// /// The token to read from. public JTokenReader(JToken token) { ValidationUtils.ArgumentNotNull(token, "token"); _root = token; _current = token; } /// /// Reads the next JSON token from the stream as a . /// /// /// A or a null reference if the next JSON token is null. This method will return null at the end of an array. /// public override byte[] ReadAsBytes() { return ReadAsBytesInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override decimal? ReadAsDecimal() { return ReadAsDecimalInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override int? ReadAsInt32() { return ReadAsInt32Internal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override string ReadAsString() { return ReadAsStringInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override DateTime? ReadAsDateTime() { return ReadAsDateTimeInternal(); } #if !NET20 /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override DateTimeOffset? ReadAsDateTimeOffset() { return ReadAsDateTimeOffsetInternal(); } #endif internal override bool ReadInternal() { if (CurrentState != State.Start) { JContainer container = _current as JContainer; if (container != null && _parent != container) return ReadInto(container); else return ReadOver(_current); } SetToken(_current); return true; } /// /// Reads the next JSON token from the stream. /// /// /// true if the next token was read successfully; false if there are no more tokens to read. /// public override bool Read() { _readType = ReadType.Read; return ReadInternal(); } private bool ReadOver(JToken t) { if (t == _root) return ReadToEnd(); JToken next = t.Next; if ((next == null || next == t) || t == t.Parent.Last) { if (t.Parent == null) return ReadToEnd(); return SetEnd(t.Parent); } else { _current = next; SetToken(_current); return true; } } private bool ReadToEnd() { SetToken(JsonToken.None); return false; } private bool IsEndElement { get { return (_current == _parent); } } private JsonToken? GetEndToken(JContainer c) { switch (c.Type) { case JTokenType.Object: return JsonToken.EndObject; case JTokenType.Array: return JsonToken.EndArray; case JTokenType.Constructor: return JsonToken.EndConstructor; case JTokenType.Property: return null; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("Type", c.Type, "Unexpected JContainer type."); } } private bool ReadInto(JContainer c) { JToken firstChild = c.First; if (firstChild == null) { return SetEnd(c); } else { SetToken(firstChild); _current = firstChild; _parent = c; return true; } } private bool SetEnd(JContainer c) { JsonToken? endToken = GetEndToken(c); if (endToken != null) { SetToken(endToken.Value); _current = c; _parent = c; return true; } else { return ReadOver(c); } } private void SetToken(JToken token) { switch (token.Type) { case JTokenType.Object: SetToken(JsonToken.StartObject); break; case JTokenType.Array: SetToken(JsonToken.StartArray); break; case JTokenType.Constructor: SetToken(JsonToken.StartConstructor); break; case JTokenType.Property: SetToken(JsonToken.PropertyName, ((JProperty)token).Name); break; case JTokenType.Comment: SetToken(JsonToken.Comment, ((JValue)token).Value); break; case JTokenType.Integer: SetToken(JsonToken.Integer, ((JValue)token).Value); break; case JTokenType.Float: SetToken(JsonToken.Float, ((JValue)token).Value); break; case JTokenType.String: SetToken(JsonToken.String, ((JValue)token).Value); break; case JTokenType.Boolean: SetToken(JsonToken.Boolean, ((JValue)token).Value); break; case JTokenType.Null: SetToken(JsonToken.Null, ((JValue)token).Value); break; case JTokenType.Undefined: SetToken(JsonToken.Undefined, ((JValue)token).Value); break; case JTokenType.Date: SetToken(JsonToken.Date, ((JValue)token).Value); break; case JTokenType.Raw: SetToken(JsonToken.Raw, ((JValue)token).Value); break; case JTokenType.Bytes: SetToken(JsonToken.Bytes, ((JValue)token).Value); break; case JTokenType.Guid: SetToken(JsonToken.String, SafeToString(((JValue)token).Value)); break; case JTokenType.Uri: SetToken(JsonToken.String, SafeToString(((JValue)token).Value)); break; case JTokenType.TimeSpan: SetToken(JsonToken.String, SafeToString(((JValue)token).Value)); break; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("Type", token.Type, "Unexpected JTokenType."); } } private string SafeToString(object value) { return (value != null) ? value.ToString() : null; } bool IJsonLineInfo.HasLineInfo() { if (CurrentState == State.Start) return false; IJsonLineInfo info = IsEndElement ? null : _current; return (info != null && info.HasLineInfo()); } int IJsonLineInfo.LineNumber { get { if (CurrentState == State.Start) return 0; IJsonLineInfo info = IsEndElement ? null : _current; if (info != null) return info.LineNumber; return 0; } } int IJsonLineInfo.LinePosition { get { if (CurrentState == State.Start) return 0; IJsonLineInfo info = IsEndElement ? null : _current; if (info != null) return info.LinePosition; return 0; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JConstructor.cs0000644000175000017500000001530512253423361026645 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json.Linq { /// /// Represents a JSON constructor. /// public class JConstructor : JContainer { private string _name; private readonly IList _values = new List(); /// /// Gets the container's children tokens. /// /// The container's children tokens. protected override IList ChildrenTokens { get { return _values; } } /// /// Gets or sets the name of this constructor. /// /// The constructor name. public string Name { get { return _name; } set { _name = value; } } /// /// Gets the node type for this . /// /// The type. public override JTokenType Type { get { return JTokenType.Constructor; } } /// /// Initializes a new instance of the class. /// public JConstructor() { } /// /// Initializes a new instance of the class from another object. /// /// A object to copy from. public JConstructor(JConstructor other) : base(other) { _name = other.Name; } /// /// Initializes a new instance of the class with the specified name and content. /// /// The constructor name. /// The contents of the constructor. public JConstructor(string name, params object[] content) : this(name, (object)content) { } /// /// Initializes a new instance of the class with the specified name and content. /// /// The constructor name. /// The contents of the constructor. public JConstructor(string name, object content) : this(name) { Add(content); } /// /// Initializes a new instance of the class with the specified name. /// /// The constructor name. public JConstructor(string name) { ValidationUtils.ArgumentNotNullOrEmpty(name, "name"); _name = name; } internal override bool DeepEquals(JToken node) { JConstructor c = node as JConstructor; return (c != null && _name == c.Name && ContentsEqual(c)); } internal override JToken CloneToken() { return new JConstructor(this); } /// /// Writes this token to a . /// /// A into which this method will write. /// A collection of which will be used when writing the token. public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) { writer.WriteStartConstructor(_name); foreach (JToken token in Children()) { token.WriteTo(writer, converters); } writer.WriteEndConstructor(); } /// /// Gets the with the specified key. /// /// The with the specified key. public override JToken this[object key] { get { ValidationUtils.ArgumentNotNull(key, "o"); if (!(key is int)) throw new ArgumentException("Accessed JConstructor values with invalid key value: {0}. Argument position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); return GetItem((int)key); } set { ValidationUtils.ArgumentNotNull(key, "o"); if (!(key is int)) throw new ArgumentException("Set JConstructor values with invalid key value: {0}. Argument position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); SetItem((int)key, value); } } internal override int GetDeepHashCode() { return _name.GetHashCode() ^ ContentsHashCode(); } /// /// Loads an from a . /// /// A that will be read for the content of the . /// A that contains the JSON that was read from the specified . public static new JConstructor Load(JsonReader reader) { if (reader.TokenType == JsonToken.None) { if (!reader.Read()) throw JsonReaderException.Create(reader, "Error reading JConstructor from JsonReader."); } while (reader.TokenType == JsonToken.Comment) { reader.Read(); } if (reader.TokenType != JsonToken.StartConstructor) throw JsonReaderException.Create(reader, "Error reading JConstructor from JsonReader. Current JsonReader item is not a constructor: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); JConstructor c = new JConstructor((string)reader.Value); c.SetLineInfo(reader as IJsonLineInfo); c.ReadTokenFrom(reader); return c; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/Extensions.cs0000644000175000017500000003106612253423361026347 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Utilities; using System.Globalization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Linq { /// /// Contains the LINQ to JSON extension methods. /// public static class Extensions { /// /// Returns a collection of tokens that contains the ancestors of every token in the source collection. /// /// The type of the objects in source, constrained to . /// An of that contains the source collection. /// An of that contains the ancestors of every node in the source collection. public static IJEnumerable Ancestors(this IEnumerable source) where T : JToken { ValidationUtils.ArgumentNotNull(source, "source"); return source.SelectMany(j => j.Ancestors()).AsJEnumerable(); } //TODO //public static IEnumerable AncestorsAndSelf(this IEnumerable source) where T : JObject //{ // ValidationUtils.ArgumentNotNull(source, "source"); // return source.SelectMany(j => j.AncestorsAndSelf()); //} /// /// Returns a collection of tokens that contains the descendants of every token in the source collection. /// /// The type of the objects in source, constrained to . /// An of that contains the source collection. /// An of that contains the descendants of every node in the source collection. public static IJEnumerable Descendants(this IEnumerable source) where T : JContainer { ValidationUtils.ArgumentNotNull(source, "source"); return source.SelectMany(j => j.Descendants()).AsJEnumerable(); } //TODO //public static IEnumerable DescendantsAndSelf(this IEnumerable source) where T : JContainer //{ // ValidationUtils.ArgumentNotNull(source, "source"); // return source.SelectMany(j => j.DescendantsAndSelf()); //} /// /// Returns a collection of child properties of every object in the source collection. /// /// An of that contains the source collection. /// An of that contains the properties of every object in the source collection. public static IJEnumerable Properties(this IEnumerable source) { ValidationUtils.ArgumentNotNull(source, "source"); return source.SelectMany(d => d.Properties()).AsJEnumerable(); } /// /// Returns a collection of child values of every object in the source collection with the given key. /// /// An of that contains the source collection. /// The token key. /// An of that contains the values of every node in the source collection with the given key. public static IJEnumerable Values(this IEnumerable source, object key) { return Values(source, key).AsJEnumerable(); } /// /// Returns a collection of child values of every object in the source collection. /// /// An of that contains the source collection. /// An of that contains the values of every node in the source collection. public static IJEnumerable Values(this IEnumerable source) { return source.Values(null); } /// /// Returns a collection of converted child values of every object in the source collection with the given key. /// /// The type to convert the values to. /// An of that contains the source collection. /// The token key. /// An that contains the converted values of every node in the source collection with the given key. public static IEnumerable Values(this IEnumerable source, object key) { return Values(source, key); } /// /// Returns a collection of converted child values of every object in the source collection. /// /// The type to convert the values to. /// An of that contains the source collection. /// An that contains the converted values of every node in the source collection. public static IEnumerable Values(this IEnumerable source) { return Values(source, null); } /// /// Converts the value. /// /// The type to convert the value to. /// A cast as a of . /// A converted value. public static U Value(this IEnumerable value) { return value.Value(); } /// /// Converts the value. /// /// The source collection type. /// The type to convert the value to. /// A cast as a of . /// A converted value. public static U Value(this IEnumerable value) where T : JToken { ValidationUtils.ArgumentNotNull(value, "source"); JToken token = value as JToken; if (token == null) throw new ArgumentException("Source value must be a JToken."); return token.Convert(); } internal static IEnumerable Values(this IEnumerable source, object key) where T : JToken { ValidationUtils.ArgumentNotNull(source, "source"); foreach (JToken token in source) { if (key == null) { if (token is JValue) { yield return Convert((JValue)token); } else { foreach (JToken t in token.Children()) { yield return t.Convert(); } } } else { JToken value = token[key]; if (value != null) yield return value.Convert(); } } yield break; } //TODO //public static IEnumerable InDocumentOrder(this IEnumerable source) where T : JObject; //public static IEnumerable Children(this IEnumerable source) where T : JToken //{ // ValidationUtils.ArgumentNotNull(source, "source"); // return source.SelectMany(c => c.Children()); //} /// /// Returns a collection of child tokens of every array in the source collection. /// /// The source collection type. /// An of that contains the source collection. /// An of that contains the values of every node in the source collection. public static IJEnumerable Children(this IEnumerable source) where T : JToken { return Children(source).AsJEnumerable(); } /// /// Returns a collection of converted child tokens of every array in the source collection. /// /// An of that contains the source collection. /// The type to convert the values to. /// The source collection type. /// An that contains the converted values of every node in the source collection. public static IEnumerable Children(this IEnumerable source) where T : JToken { ValidationUtils.ArgumentNotNull(source, "source"); return source.SelectMany(c => c.Children()).Convert(); } internal static IEnumerable Convert(this IEnumerable source) where T : JToken { ValidationUtils.ArgumentNotNull(source, "source"); foreach (T token in source) { yield return Convert(token); } } internal static U Convert(this T token) where T : JToken { if (token == null) return default(U); if (token is U // don't want to cast JValue to its interfaces, want to get the internal value && typeof(U) != typeof(IComparable) && typeof(U) != typeof(IFormattable)) { // HACK return (U)(object)token; } else { JValue value = token as JValue; if (value == null) throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, token.GetType(), typeof(T))); if (value.Value is U) return (U)value.Value; Type targetType = typeof(U); if (ReflectionUtils.IsNullableType(targetType)) { if (value.Value == null) return default(U); targetType = Nullable.GetUnderlyingType(targetType); } return (U)System.Convert.ChangeType(value.Value, targetType, CultureInfo.InvariantCulture); } } //TODO //public static void Remove(this IEnumerable source) where T : JContainer; /// /// Returns the input typed as . /// /// An of that contains the source collection. /// The input typed as . public static IJEnumerable AsJEnumerable(this IEnumerable source) { return source.AsJEnumerable(); } /// /// Returns the input typed as . /// /// The source collection type. /// An of that contains the source collection. /// The input typed as . public static IJEnumerable AsJEnumerable(this IEnumerable source) where T : JToken { if (source == null) return null; else if (source is IJEnumerable) return (IJEnumerable)source; else return new JEnumerable(source); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JPath.cs0000644000175000017500000001435712253423361025222 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Linq { internal class JPath { private readonly string _expression; public List Parts { get; private set; } private int _currentIndex; public JPath(string expression) { ValidationUtils.ArgumentNotNull(expression, "expression"); _expression = expression; Parts = new List(); ParseMain(); } private void ParseMain() { int currentPartStartIndex = _currentIndex; bool followingIndexer = false; while (_currentIndex < _expression.Length) { char currentChar = _expression[_currentIndex]; switch (currentChar) { case '[': case '(': if (_currentIndex > currentPartStartIndex) { string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex); Parts.Add(member); } ParseIndexer(currentChar); currentPartStartIndex = _currentIndex + 1; followingIndexer = true; break; case ']': case ')': throw new JsonException("Unexpected character while parsing path: " + currentChar); case '.': if (_currentIndex > currentPartStartIndex) { string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex); Parts.Add(member); } currentPartStartIndex = _currentIndex + 1; followingIndexer = false; break; default: if (followingIndexer) throw new JsonException("Unexpected character following indexer: " + currentChar); break; } _currentIndex++; } if (_currentIndex > currentPartStartIndex) { string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex); Parts.Add(member); } } private void ParseIndexer(char indexerOpenChar) { _currentIndex++; char indexerCloseChar = (indexerOpenChar == '[') ? ']' : ')'; int indexerStart = _currentIndex; int indexerLength = 0; bool indexerClosed = false; while (_currentIndex < _expression.Length) { char currentCharacter = _expression[_currentIndex]; if (char.IsDigit(currentCharacter)) { indexerLength++; } else if (currentCharacter == indexerCloseChar) { indexerClosed = true; break; } else { throw new JsonException("Unexpected character while parsing path indexer: " + currentCharacter); } _currentIndex++; } if (!indexerClosed) throw new JsonException("Path ended with open indexer. Expected " + indexerCloseChar); if (indexerLength == 0) throw new JsonException("Empty path indexer."); string indexer = _expression.Substring(indexerStart, indexerLength); Parts.Add(Convert.ToInt32(indexer, CultureInfo.InvariantCulture)); } internal JToken Evaluate(JToken root, bool errorWhenNoMatch) { JToken current = root; foreach (object part in Parts) { string propertyName = part as string; if (propertyName != null) { JObject o = current as JObject; if (o != null) { current = o[propertyName]; if (current == null && errorWhenNoMatch) throw new JsonException("Property '{0}' does not exist on JObject.".FormatWith(CultureInfo.InvariantCulture, propertyName)); } else { if (errorWhenNoMatch) throw new JsonException("Property '{0}' not valid on {1}.".FormatWith(CultureInfo.InvariantCulture, propertyName, current.GetType().Name)); return null; } } else { int index = (int) part; JArray a = current as JArray; JConstructor c = current as JConstructor; if (a != null) { if (a.Count <= index) { if (errorWhenNoMatch) throw new IndexOutOfRangeException("Index {0} outside the bounds of JArray.".FormatWith(CultureInfo.InvariantCulture, index)); return null; } current = a[index]; } else if (c != null) { if (c.Count <= index) { if (errorWhenNoMatch) throw new IndexOutOfRangeException("Index {0} outside the bounds of JConstructor.".FormatWith(CultureInfo.InvariantCulture, index)); return null; } current = c[index]; } else { if (errorWhenNoMatch) throw new JsonException("Index {0} not valid on {1}.".FormatWith(CultureInfo.InvariantCulture, index, current.GetType().Name)); return null; } } } return current; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/IJEnumerable.cs0000644000175000017500000000325612253423361026512 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; namespace Newtonsoft.Json.Linq { /// /// Represents a collection of objects. /// /// The type of token public interface IJEnumerable< #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE) out #endif T> : IEnumerable where T : JToken { /// /// Gets the with the specified key. /// /// IJEnumerable this[object key] { get; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JContainer.cs0000644000175000017500000006357512253423361026256 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; #if !PORTABLE using System.Collections.Specialized; #endif using System.Threading; using Newtonsoft.Json.Utilities; using System.Collections; using System.Globalization; using System.ComponentModel; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Linq { /// /// Represents a token that can contain other tokens. /// public abstract class JContainer : JToken, IList #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) , ITypedList, IBindingList #elif !PORTABLE , INotifyCollectionChanged #endif , IList #if !(SILVERLIGHT || NET20 || NET35 || NETFX_CORE || PORTABLE) , INotifyCollectionChanged #endif { #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Occurs when the list changes or an item in the list changes. /// public event ListChangedEventHandler ListChanged; /// /// Occurs before an item is added to the collection. /// public event AddingNewEventHandler AddingNew; #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) /// /// Occurs when the items list of the collection has changed, or the collection is reset. /// public event NotifyCollectionChangedEventHandler CollectionChanged; #endif /// /// Gets the container's children tokens. /// /// The container's children tokens. protected abstract IList ChildrenTokens { get; } private object _syncRoot; private bool _busy; internal JContainer() { } internal JContainer(JContainer other) { ValidationUtils.ArgumentNotNull(other, "c"); foreach (JToken child in other) { Add(child); } } internal void CheckReentrancy() { if (_busy) throw new InvalidOperationException("Cannot change {0} during a collection change event.".FormatWith(CultureInfo.InvariantCulture, GetType())); } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Raises the event. /// /// The instance containing the event data. protected virtual void OnAddingNew(AddingNewEventArgs e) { AddingNewEventHandler handler = AddingNew; if (handler != null) handler(this, e); } /// /// Raises the event. /// /// The instance containing the event data. protected virtual void OnListChanged(ListChangedEventArgs e) { ListChangedEventHandler handler = ListChanged; if (handler != null) { _busy = true; try { handler(this, e); } finally { _busy = false; } } } #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) /// /// Raises the event. /// /// The instance containing the event data. protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { NotifyCollectionChangedEventHandler handler = CollectionChanged; if (handler != null) { _busy = true; try { handler(this, e); } finally { _busy = false; } } } #endif /// /// Gets a value indicating whether this token has childen tokens. /// /// /// true if this token has child values; otherwise, false. /// public override bool HasValues { get { return ChildrenTokens.Count > 0; } } internal bool ContentsEqual(JContainer container) { if (container == this) return true; IList t1 = ChildrenTokens; IList t2 = container.ChildrenTokens; if (t1.Count != t2.Count) return false; for (int i = 0; i < t1.Count; i++) { if (!t1[i].DeepEquals(t2[i])) return false; } return true; } /// /// Get the first child token of this token. /// /// /// A containing the first child token of the . /// public override JToken First { get { return ChildrenTokens.FirstOrDefault(); } } /// /// Get the last child token of this token. /// /// /// A containing the last child token of the . /// public override JToken Last { get { return ChildrenTokens.LastOrDefault(); } } /// /// Returns a collection of the child tokens of this token, in document order. /// /// /// An of containing the child tokens of this , in document order. /// public override JEnumerable Children() { return new JEnumerable(ChildrenTokens); } /// /// Returns a collection of the child values of this token, in document order. /// /// The type to convert the values to. /// /// A containing the child values of this , in document order. /// public override IEnumerable Values() { return ChildrenTokens.Convert(); } /// /// Returns a collection of the descendant tokens for this token in document order. /// /// An containing the descendant tokens of the . public IEnumerable Descendants() { foreach (JToken o in ChildrenTokens) { yield return o; JContainer c = o as JContainer; if (c != null) { foreach (JToken d in c.Descendants()) { yield return d; } } } } internal bool IsMultiContent(object content) { return (content is IEnumerable && !(content is string) && !(content is JToken) && !(content is byte[])); } internal JToken EnsureParentToken(JToken item, bool skipParentCheck) { if (item == null) return new JValue((object) null); if (skipParentCheck) return item; // to avoid a token having multiple parents or creating a recursive loop, create a copy if... // the item already has a parent // the item is being added to itself // the item is being added to the root parent of itself if (item.Parent != null || item == this || (item.HasValues && Root == item)) item = item.CloneToken(); return item; } private class JTokenReferenceEqualityComparer : IEqualityComparer { public static readonly JTokenReferenceEqualityComparer Instance = new JTokenReferenceEqualityComparer(); public bool Equals(JToken x, JToken y) { return ReferenceEquals(x, y); } public int GetHashCode(JToken obj) { if (obj == null) return 0; return obj.GetHashCode(); } } internal int IndexOfItem(JToken item) { return ChildrenTokens.IndexOf(item, JTokenReferenceEqualityComparer.Instance); } internal virtual void InsertItem(int index, JToken item, bool skipParentCheck) { if (index > ChildrenTokens.Count) throw new ArgumentOutOfRangeException("index", "Index must be within the bounds of the List."); CheckReentrancy(); item = EnsureParentToken(item, skipParentCheck); JToken previous = (index == 0) ? null : ChildrenTokens[index - 1]; // haven't inserted new token yet so next token is still at the inserting index JToken next = (index == ChildrenTokens.Count) ? null : ChildrenTokens[index]; ValidateToken(item, null); item.Parent = this; item.Previous = previous; if (previous != null) previous.Next = item; item.Next = next; if (next != null) next.Previous = item; ChildrenTokens.Insert(index, item); #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) if (ListChanged != null) OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index)); #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) if (CollectionChanged != null) OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index)); #endif } internal virtual void RemoveItemAt(int index) { if (index < 0) throw new ArgumentOutOfRangeException("index", "Index is less than 0."); if (index >= ChildrenTokens.Count) throw new ArgumentOutOfRangeException("index", "Index is equal to or greater than Count."); CheckReentrancy(); JToken item = ChildrenTokens[index]; JToken previous = (index == 0) ? null : ChildrenTokens[index - 1]; JToken next = (index == ChildrenTokens.Count - 1) ? null : ChildrenTokens[index + 1]; if (previous != null) previous.Next = next; if (next != null) next.Previous = previous; item.Parent = null; item.Previous = null; item.Next = null; ChildrenTokens.RemoveAt(index); #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index)); #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index)); #endif } internal virtual bool RemoveItem(JToken item) { int index = IndexOfItem(item); if (index >= 0) { RemoveItemAt(index); return true; } return false; } internal virtual JToken GetItem(int index) { return ChildrenTokens[index]; } internal virtual void SetItem(int index, JToken item) { if (index < 0) throw new ArgumentOutOfRangeException("index", "Index is less than 0."); if (index >= ChildrenTokens.Count) throw new ArgumentOutOfRangeException("index", "Index is equal to or greater than Count."); JToken existing = ChildrenTokens[index]; if (IsTokenUnchanged(existing, item)) return; CheckReentrancy(); item = EnsureParentToken(item, false); ValidateToken(item, existing); JToken previous = (index == 0) ? null : ChildrenTokens[index - 1]; JToken next = (index == ChildrenTokens.Count - 1) ? null : ChildrenTokens[index + 1]; item.Parent = this; item.Previous = previous; if (previous != null) previous.Next = item; item.Next = next; if (next != null) next.Previous = item; ChildrenTokens[index] = item; existing.Parent = null; existing.Previous = null; existing.Next = null; #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, index)); #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, item, existing, index)); #endif } internal virtual void ClearItems() { CheckReentrancy(); foreach (JToken item in ChildrenTokens) { item.Parent = null; item.Previous = null; item.Next = null; } ChildrenTokens.Clear(); #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); #endif } internal virtual void ReplaceItem(JToken existing, JToken replacement) { if (existing == null || existing.Parent != this) return; int index = IndexOfItem(existing); SetItem(index, replacement); } internal virtual bool ContainsItem(JToken item) { return (IndexOfItem(item) != -1); } internal virtual void CopyItemsTo(Array array, int arrayIndex) { if (array == null) throw new ArgumentNullException("array"); if (arrayIndex < 0) throw new ArgumentOutOfRangeException("arrayIndex", "arrayIndex is less than 0."); if (arrayIndex >= array.Length) throw new ArgumentException("arrayIndex is equal to or greater than the length of array."); if (Count > array.Length - arrayIndex) throw new ArgumentException("The number of elements in the source JObject is greater than the available space from arrayIndex to the end of the destination array."); int index = 0; foreach (JToken token in ChildrenTokens) { array.SetValue(token, arrayIndex + index); index++; } } internal static bool IsTokenUnchanged(JToken currentValue, JToken newValue) { JValue v1 = currentValue as JValue; if (v1 != null) { // null will get turned into a JValue of type null if (v1.Type == JTokenType.Null && newValue == null) return true; return v1.Equals(newValue); } return false; } internal virtual void ValidateToken(JToken o, JToken existing) { ValidationUtils.ArgumentNotNull(o, "o"); if (o.Type == JTokenType.Property) throw new ArgumentException("Can not add {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, o.GetType(), GetType())); } /// /// Adds the specified content as children of this . /// /// The content to be added. public virtual void Add(object content) { AddInternal(ChildrenTokens.Count, content, false); } internal void AddAndSkipParentCheck(JToken token) { AddInternal(ChildrenTokens.Count, token, true); } /// /// Adds the specified content as the first children of this . /// /// The content to be added. public void AddFirst(object content) { AddInternal(0, content, false); } internal void AddInternal(int index, object content, bool skipParentCheck) { if (IsMultiContent(content)) { IEnumerable enumerable = (IEnumerable)content; int multiIndex = index; foreach (object c in enumerable) { AddInternal(multiIndex, c, skipParentCheck); multiIndex++; } } else { JToken item = CreateFromContent(content); InsertItem(index, item, skipParentCheck); } } internal JToken CreateFromContent(object content) { if (content is JToken) return (JToken)content; return new JValue(content); } /// /// Creates an that can be used to add tokens to the . /// /// An that is ready to have content written to it. public JsonWriter CreateWriter() { return new JTokenWriter(this); } /// /// Replaces the children nodes of this token with the specified content. /// /// The content. public void ReplaceAll(object content) { ClearItems(); Add(content); } /// /// Removes the child nodes from this token. /// public void RemoveAll() { ClearItems(); } internal void ReadTokenFrom(JsonReader reader) { int startDepth = reader.Depth; if (!reader.Read()) throw JsonReaderException.Create(reader, "Error reading {0} from JsonReader.".FormatWith(CultureInfo.InvariantCulture, GetType().Name)); ReadContentFrom(reader); int endDepth = reader.Depth; if (endDepth > startDepth) throw JsonReaderException.Create(reader, "Unexpected end of content while loading {0}.".FormatWith(CultureInfo.InvariantCulture, GetType().Name)); } internal void ReadContentFrom(JsonReader r) { ValidationUtils.ArgumentNotNull(r, "r"); IJsonLineInfo lineInfo = r as IJsonLineInfo; JContainer parent = this; do { if (parent is JProperty && ((JProperty)parent).Value != null) { if (parent == this) return; parent = parent.Parent; } switch (r.TokenType) { case JsonToken.None: // new reader. move to actual content break; case JsonToken.StartArray: JArray a = new JArray(); a.SetLineInfo(lineInfo); parent.Add(a); parent = a; break; case JsonToken.EndArray: if (parent == this) return; parent = parent.Parent; break; case JsonToken.StartObject: JObject o = new JObject(); o.SetLineInfo(lineInfo); parent.Add(o); parent = o; break; case JsonToken.EndObject: if (parent == this) return; parent = parent.Parent; break; case JsonToken.StartConstructor: JConstructor constructor = new JConstructor(r.Value.ToString()); constructor.SetLineInfo(constructor); parent.Add(constructor); parent = constructor; break; case JsonToken.EndConstructor: if (parent == this) return; parent = parent.Parent; break; case JsonToken.String: case JsonToken.Integer: case JsonToken.Float: case JsonToken.Date: case JsonToken.Boolean: case JsonToken.Bytes: JValue v = new JValue(r.Value); v.SetLineInfo(lineInfo); parent.Add(v); break; case JsonToken.Comment: v = JValue.CreateComment(r.Value.ToString()); v.SetLineInfo(lineInfo); parent.Add(v); break; case JsonToken.Null: v = new JValue(null, JTokenType.Null); v.SetLineInfo(lineInfo); parent.Add(v); break; case JsonToken.Undefined: v = new JValue(null, JTokenType.Undefined); v.SetLineInfo(lineInfo); parent.Add(v); break; case JsonToken.PropertyName: string propertyName = r.Value.ToString(); JProperty property = new JProperty(propertyName); property.SetLineInfo(lineInfo); JObject parentObject = (JObject) parent; // handle multiple properties with the same name in JSON JProperty existingPropertyWithName = parentObject.Property(propertyName); if (existingPropertyWithName == null) parent.Add(property); else existingPropertyWithName.Replace(property); parent = property; break; default: throw new InvalidOperationException("The JsonReader should not be on a token of type {0}.".FormatWith(CultureInfo.InvariantCulture, r.TokenType)); } } while (r.Read()); } internal int ContentsHashCode() { int hashCode = 0; foreach (JToken item in ChildrenTokens) { hashCode ^= item.GetDeepHashCode(); } return hashCode; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) string ITypedList.GetListName(PropertyDescriptor[] listAccessors) { return string.Empty; } PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) { ICustomTypeDescriptor d = First as ICustomTypeDescriptor; if (d != null) return d.GetProperties(); return null; } #endif #region IList Members int IList.IndexOf(JToken item) { return IndexOfItem(item); } void IList.Insert(int index, JToken item) { InsertItem(index, item, false); } void IList.RemoveAt(int index) { RemoveItemAt(index); } JToken IList.this[int index] { get { return GetItem(index); } set { SetItem(index, value); } } #endregion #region ICollection Members void ICollection.Add(JToken item) { Add(item); } void ICollection.Clear() { ClearItems(); } bool ICollection.Contains(JToken item) { return ContainsItem(item); } void ICollection.CopyTo(JToken[] array, int arrayIndex) { CopyItemsTo(array, arrayIndex); } bool ICollection.IsReadOnly { get { return false; } } bool ICollection.Remove(JToken item) { return RemoveItem(item); } #endregion private JToken EnsureValue(object value) { if (value == null) return null; if (value is JToken) return (JToken) value; throw new ArgumentException("Argument is not a JToken."); } #region IList Members int IList.Add(object value) { Add(EnsureValue(value)); return Count - 1; } void IList.Clear() { ClearItems(); } bool IList.Contains(object value) { return ContainsItem(EnsureValue(value)); } int IList.IndexOf(object value) { return IndexOfItem(EnsureValue(value)); } void IList.Insert(int index, object value) { InsertItem(index, EnsureValue(value), false); } bool IList.IsFixedSize { get { return false; } } bool IList.IsReadOnly { get { return false; } } void IList.Remove(object value) { RemoveItem(EnsureValue(value)); } void IList.RemoveAt(int index) { RemoveItemAt(index); } object IList.this[int index] { get { return GetItem(index); } set { SetItem(index, EnsureValue(value)); } } #endregion #region ICollection Members void ICollection.CopyTo(Array array, int index) { CopyItemsTo(array, index); } /// /// Gets the count of child JSON tokens. /// /// The count of child JSON tokens public int Count { get { return ChildrenTokens.Count; } } bool ICollection.IsSynchronized { get { return false; } } object ICollection.SyncRoot { get { if (_syncRoot == null) Interlocked.CompareExchange(ref _syncRoot, new object(), null); return _syncRoot; } } #endregion #region IBindingList Members #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) void IBindingList.AddIndex(PropertyDescriptor property) { } object IBindingList.AddNew() { AddingNewEventArgs args = new AddingNewEventArgs(); OnAddingNew(args); if (args.NewObject == null) throw new JsonException("Could not determine new value to add to '{0}'.".FormatWith(CultureInfo.InvariantCulture, GetType())); if (!(args.NewObject is JToken)) throw new JsonException("New item to be added to collection must be compatible with {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JToken))); JToken newItem = (JToken)args.NewObject; Add(newItem); return newItem; } bool IBindingList.AllowEdit { get { return true; } } bool IBindingList.AllowNew { get { return true; } } bool IBindingList.AllowRemove { get { return true; } } void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) { throw new NotSupportedException(); } int IBindingList.Find(PropertyDescriptor property, object key) { throw new NotSupportedException(); } bool IBindingList.IsSorted { get { return false; } } void IBindingList.RemoveIndex(PropertyDescriptor property) { } void IBindingList.RemoveSort() { throw new NotSupportedException(); } ListSortDirection IBindingList.SortDirection { get { return ListSortDirection.Ascending; } } PropertyDescriptor IBindingList.SortProperty { get { return null; } } bool IBindingList.SupportsChangeNotification { get { return true; } } bool IBindingList.SupportsSearching { get { return false; } } bool IBindingList.SupportsSorting { get { return false; } } #endif #endregion } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JPropertyDescriptor.cs0000644000175000017500000001377412253423361030213 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; using System.ComponentModel; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Linq { /// /// Represents a view of a . /// public class JPropertyDescriptor : PropertyDescriptor { private readonly Type _propertyType; /// /// Initializes a new instance of the class. /// /// The name. /// Type of the property. public JPropertyDescriptor(string name, Type propertyType) : base(name, null) { ValidationUtils.ArgumentNotNull(name, "name"); ValidationUtils.ArgumentNotNull(propertyType, "propertyType"); _propertyType = propertyType; } private static JObject CastInstance(object instance) { return (JObject)instance; } /// /// When overridden in a derived class, returns whether resetting an object changes its value. /// /// /// true if resetting the component changes its value; otherwise, false. /// /// The component to test for reset capability. /// public override bool CanResetValue(object component) { return false; } /// /// When overridden in a derived class, gets the current value of the property on a component. /// /// /// The value of a property for a given component. /// /// The component with the property for which to retrieve the value. /// public override object GetValue(object component) { JToken token = CastInstance(component)[Name]; return token; } /// /// When overridden in a derived class, resets the value for this property of the component to the default value. /// /// The component with the property value that is to be reset to the default value. /// public override void ResetValue(object component) { } /// /// When overridden in a derived class, sets the value of the component to a different value. /// /// The component with the property value that is to be set. /// The new value. /// public override void SetValue(object component, object value) { JToken token = (value is JToken) ? (JToken) value : new JValue(value); CastInstance(component)[Name] = token; } /// /// When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. /// /// /// true if the property should be persisted; otherwise, false. /// /// The component with the property to be examined for persistence. /// public override bool ShouldSerializeValue(object component) { return false; } /// /// When overridden in a derived class, gets the type of the component this property is bound to. /// /// /// A that represents the type of component this property is bound to. When the or methods are invoked, the object specified might be an instance of this type. /// public override Type ComponentType { get { return typeof(JObject); } } /// /// When overridden in a derived class, gets a value indicating whether this property is read-only. /// /// /// true if the property is read-only; otherwise, false. /// public override bool IsReadOnly { get { return false; } } /// /// When overridden in a derived class, gets the type of the property. /// /// /// A that represents the type of the property. /// public override Type PropertyType { get { return _propertyType; } } /// /// Gets the hash code for the name of the member. /// /// /// /// The hash code for the name of the member. /// protected override int NameHashCode { get { // override property to fix up an error in its documentation int nameHashCode = base.NameHashCode; return nameHashCode; } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JTokenEqualityComparer.cs0000644000175000017500000000456412253423361030614 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; namespace Newtonsoft.Json.Linq { /// /// Compares tokens to determine whether they are equal. /// public class JTokenEqualityComparer : IEqualityComparer { /// /// Determines whether the specified objects are equal. /// /// The first object of type to compare. /// The second object of type to compare. /// /// true if the specified objects are equal; otherwise, false. /// public bool Equals(JToken x, JToken y) { return JToken.DeepEquals(x, y); } /// /// Returns a hash code for the specified object. /// /// The for which a hash code is to be returned. /// A hash code for the specified object. /// The type of is a reference type and is null. public int GetHashCode(JToken obj) { if (obj == null) return 0; return obj.GetDeepHashCode(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JValue.cs0000644000175000017500000006403512253423361025400 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Utilities; using System.Globalization; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System.Dynamic; using System.Linq.Expressions; #endif namespace Newtonsoft.Json.Linq { /// /// Represents a value in JSON (string, integer, date, etc). /// public class JValue : JToken, IEquatable, IFormattable, IComparable, IComparable { private JTokenType _valueType; private object _value; internal JValue(object value, JTokenType type) { _value = value; _valueType = type; } /// /// Initializes a new instance of the class from another object. /// /// A object to copy from. public JValue(JValue other) : this(other.Value, other.Type) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(long value) : this(value, JTokenType.Integer) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. [CLSCompliant(false)] public JValue(ulong value) : this(value, JTokenType.Integer) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(double value) : this(value, JTokenType.Float) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(float value) : this(value, JTokenType.Float) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(DateTime value) : this(value, JTokenType.Date) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(bool value) : this(value, JTokenType.Boolean) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(string value) : this(value, JTokenType.String) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(Guid value) : this(value, JTokenType.String) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(Uri value) : this(value, JTokenType.String) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(TimeSpan value) : this(value, JTokenType.String) { } /// /// Initializes a new instance of the class with the given value. /// /// The value. public JValue(object value) : this(value, GetValueType(null, value)) { } internal override bool DeepEquals(JToken node) { JValue other = node as JValue; if (other == null) return false; if (other == this) return true; return ValuesEquals(this, other); } /// /// Gets a value indicating whether this token has childen tokens. /// /// /// true if this token has child values; otherwise, false. /// public override bool HasValues { get { return false; } } private static int Compare(JTokenType valueType, object objA, object objB) { if (objA == null && objB == null) return 0; if (objA != null && objB == null) return 1; if (objA == null && objB != null) return -1; switch (valueType) { case JTokenType.Integer: if (objA is ulong || objB is ulong || objA is decimal || objB is decimal) return Convert.ToDecimal(objA, CultureInfo.InvariantCulture).CompareTo(Convert.ToDecimal(objB, CultureInfo.InvariantCulture)); else if (objA is float || objB is float || objA is double || objB is double) return CompareFloat(objA, objB); else return Convert.ToInt64(objA, CultureInfo.InvariantCulture).CompareTo(Convert.ToInt64(objB, CultureInfo.InvariantCulture)); case JTokenType.Float: return CompareFloat(objA, objB); case JTokenType.Comment: case JTokenType.String: case JTokenType.Raw: string s1 = Convert.ToString(objA, CultureInfo.InvariantCulture); string s2 = Convert.ToString(objB, CultureInfo.InvariantCulture); return string.CompareOrdinal(s1, s2); case JTokenType.Boolean: bool b1 = Convert.ToBoolean(objA, CultureInfo.InvariantCulture); bool b2 = Convert.ToBoolean(objB, CultureInfo.InvariantCulture); return b1.CompareTo(b2); case JTokenType.Date: #if !NET20 if (objA is DateTime) { #endif DateTime date1 = Convert.ToDateTime(objA, CultureInfo.InvariantCulture); DateTime date2 = Convert.ToDateTime(objB, CultureInfo.InvariantCulture); return date1.CompareTo(date2); #if !NET20 } else { if (!(objB is DateTimeOffset)) throw new ArgumentException("Object must be of type DateTimeOffset."); DateTimeOffset date1 = (DateTimeOffset) objA; DateTimeOffset date2 = (DateTimeOffset) objB; return date1.CompareTo(date2); } #endif case JTokenType.Bytes: if (!(objB is byte[])) throw new ArgumentException("Object must be of type byte[]."); byte[] bytes1 = objA as byte[]; byte[] bytes2 = objB as byte[]; if (bytes1 == null) return -1; if (bytes2 == null) return 1; return MiscellaneousUtils.ByteArrayCompare(bytes1, bytes2); case JTokenType.Guid: if (!(objB is Guid)) throw new ArgumentException("Object must be of type Guid."); Guid guid1 = (Guid) objA; Guid guid2 = (Guid) objB; return guid1.CompareTo(guid2); case JTokenType.Uri: if (!(objB is Uri)) throw new ArgumentException("Object must be of type Uri."); Uri uri1 = (Uri)objA; Uri uri2 = (Uri)objB; return Comparer.Default.Compare(uri1.ToString(), uri2.ToString()); case JTokenType.TimeSpan: if (!(objB is TimeSpan)) throw new ArgumentException("Object must be of type TimeSpan."); TimeSpan ts1 = (TimeSpan)objA; TimeSpan ts2 = (TimeSpan)objB; return ts1.CompareTo(ts2); default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("valueType", valueType, "Unexpected value type: {0}".FormatWith(CultureInfo.InvariantCulture, valueType)); } } private static int CompareFloat(object objA, object objB) { double d1 = Convert.ToDouble(objA, CultureInfo.InvariantCulture); double d2 = Convert.ToDouble(objB, CultureInfo.InvariantCulture); // take into account possible floating point errors if (MathUtils.ApproxEquals(d1, d2)) return 0; return d1.CompareTo(d2); } #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) private static bool Operation(ExpressionType operation, object objA, object objB, out object result) { if (objA is string || objB is string) { if (operation == ExpressionType.Add || operation == ExpressionType.AddAssign) { result = ((objA != null) ? objA.ToString() : null) + ((objB != null) ? objB.ToString() : null); return true; } } if (objA is ulong || objB is ulong || objA is decimal || objB is decimal) { if (objA == null || objB == null) { result = null; return true; } decimal d1 = Convert.ToDecimal(objA, CultureInfo.InvariantCulture); decimal d2 = Convert.ToDecimal(objB, CultureInfo.InvariantCulture); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = d1 + d2; return true; case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = d1 - d2; return true; case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = d1 * d2; return true; case ExpressionType.Divide: case ExpressionType.DivideAssign: result = d1 / d2; return true; } } else if (objA is float || objB is float || objA is double || objB is double) { if (objA == null || objB == null) { result = null; return true; } double d1 = Convert.ToDouble(objA, CultureInfo.InvariantCulture); double d2 = Convert.ToDouble(objB, CultureInfo.InvariantCulture); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = d1 + d2; return true; case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = d1 - d2; return true; case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = d1 * d2; return true; case ExpressionType.Divide: case ExpressionType.DivideAssign: result = d1 / d2; return true; } } else if (objA is int || objA is uint || objA is long || objA is short || objA is ushort || objA is sbyte || objA is byte || objB is int || objB is uint || objB is long || objB is short || objB is ushort || objB is sbyte || objB is byte) { if (objA == null || objB == null) { result = null; return true; } long l1 = Convert.ToInt64(objA, CultureInfo.InvariantCulture); long l2 = Convert.ToInt64(objB, CultureInfo.InvariantCulture); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = l1 + l2; return true; case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = l1 - l2; return true; case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = l1 * l2; return true; case ExpressionType.Divide: case ExpressionType.DivideAssign: result = l1 / l2; return true; } } result = null; return false; } #endif internal override JToken CloneToken() { return new JValue(this); } /// /// Creates a comment with the given value. /// /// The value. /// A comment with the given value. public static JValue CreateComment(string value) { return new JValue(value, JTokenType.Comment); } /// /// Creates a string with the given value. /// /// The value. /// A string with the given value. public static JValue CreateString(string value) { return new JValue(value, JTokenType.String); } private static JTokenType GetValueType(JTokenType? current, object value) { if (value == null) return JTokenType.Null; #if !(NETFX_CORE || PORTABLE) else if (value == DBNull.Value) return JTokenType.Null; #endif else if (value is string) return GetStringValueType(current); else if (value is long || value is int || value is short || value is sbyte || value is ulong || value is uint || value is ushort || value is byte) return JTokenType.Integer; else if (value is Enum) return JTokenType.Integer; else if (value is double || value is float || value is decimal) return JTokenType.Float; else if (value is DateTime) return JTokenType.Date; #if !PocketPC && !NET20 else if (value is DateTimeOffset) return JTokenType.Date; #endif else if (value is byte[]) return JTokenType.Bytes; else if (value is bool) return JTokenType.Boolean; else if (value is Guid) return JTokenType.Guid; else if (value is Uri) return JTokenType.Uri; else if (value is TimeSpan) return JTokenType.TimeSpan; throw new ArgumentException("Could not determine JSON object type for type {0}.".FormatWith(CultureInfo.InvariantCulture, value.GetType())); } private static JTokenType GetStringValueType(JTokenType? current) { if (current == null) return JTokenType.String; switch (current.Value) { case JTokenType.Comment: case JTokenType.String: case JTokenType.Raw: return current.Value; default: return JTokenType.String; } } /// /// Gets the node type for this . /// /// The type. public override JTokenType Type { get { return _valueType; } } /// /// Gets or sets the underlying token value. /// /// The underlying token value. public object Value { get { return _value; } set { Type currentType = (_value != null) ? _value.GetType() : null; Type newType = (value != null) ? value.GetType() : null; if (currentType != newType) _valueType = GetValueType(_valueType, value); _value = value; } } /// /// Writes this token to a . /// /// A into which this method will write. /// A collection of which will be used when writing the token. public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) { switch (_valueType) { case JTokenType.Comment: writer.WriteComment(_value.ToString()); return; case JTokenType.Raw: writer.WriteRawValue((_value != null) ? _value.ToString() : null); return; case JTokenType.Null: writer.WriteNull(); return; case JTokenType.Undefined: writer.WriteUndefined(); return; } JsonConverter matchingConverter; if (_value != null && ((matchingConverter = JsonSerializer.GetMatchingConverter(converters, _value.GetType())) != null)) { matchingConverter.WriteJson(writer, _value, new JsonSerializer()); return; } switch (_valueType) { case JTokenType.Integer: writer.WriteValue(Convert.ToInt64(_value, CultureInfo.InvariantCulture)); return; case JTokenType.Float: if (_value is float) writer.WriteValue(_value); else writer.WriteValue(Convert.ToDouble(_value, CultureInfo.InvariantCulture)); return; case JTokenType.String: writer.WriteValue((_value != null) ? _value.ToString() : null); return; case JTokenType.Boolean: writer.WriteValue(Convert.ToBoolean(_value, CultureInfo.InvariantCulture)); return; case JTokenType.Date: #if !PocketPC && !NET20 if (_value is DateTimeOffset) writer.WriteValue((DateTimeOffset)_value); else #endif writer.WriteValue(Convert.ToDateTime(_value, CultureInfo.InvariantCulture)); return; case JTokenType.Bytes: writer.WriteValue((byte[])_value); return; case JTokenType.Guid: case JTokenType.Uri: case JTokenType.TimeSpan: writer.WriteValue((_value != null) ? _value.ToString() : null); return; } throw MiscellaneousUtils.CreateArgumentOutOfRangeException("TokenType", _valueType, "Unexpected token type."); } internal override int GetDeepHashCode() { int valueHashCode = (_value != null) ? _value.GetHashCode() : 0; return _valueType.GetHashCode() ^ valueHashCode; } private static bool ValuesEquals(JValue v1, JValue v2) { return (v1 == v2 || (v1._valueType == v2._valueType && Compare(v1._valueType, v1._value, v2._value) == 0)); } /// /// Indicates whether the current object is equal to another object of the same type. /// /// /// true if the current object is equal to the parameter; otherwise, false. /// /// An object to compare with this object. public bool Equals(JValue other) { if (other == null) return false; return ValuesEquals(this, other); } /// /// Determines whether the specified is equal to the current . /// /// The to compare with the current . /// /// true if the specified is equal to the current ; otherwise, false. /// /// /// The parameter is null. /// public override bool Equals(object obj) { if (obj == null) return false; JValue otherValue = obj as JValue; if (otherValue != null) return Equals(otherValue); return base.Equals(obj); } /// /// Serves as a hash function for a particular type. /// /// /// A hash code for the current . /// public override int GetHashCode() { if (_value == null) return 0; return _value.GetHashCode(); } /// /// Returns a that represents this instance. /// /// /// A that represents this instance. /// public override string ToString() { if (_value == null) return string.Empty; return _value.ToString(); } /// /// Returns a that represents this instance. /// /// The format. /// /// A that represents this instance. /// public string ToString(string format) { return ToString(format, CultureInfo.CurrentCulture); } /// /// Returns a that represents this instance. /// /// The format provider. /// /// A that represents this instance. /// public string ToString(IFormatProvider formatProvider) { return ToString(null, formatProvider); } /// /// Returns a that represents this instance. /// /// The format. /// The format provider. /// /// A that represents this instance. /// public string ToString(string format, IFormatProvider formatProvider) { if (_value == null) return string.Empty; IFormattable formattable = _value as IFormattable; if (formattable != null) return formattable.ToString(format, formatProvider); else return _value.ToString(); } #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) /// /// Returns the responsible for binding operations performed on this object. /// /// The expression tree representation of the runtime value. /// /// The to bind this object. /// protected override DynamicMetaObject GetMetaObject(Expression parameter) { return new DynamicProxyMetaObject(parameter, this, new JValueDynamicProxy(), true); } private class JValueDynamicProxy : DynamicProxy { public override bool TryConvert(JValue instance, ConvertBinder binder, out object result) { if (binder.Type == typeof(JValue)) { result = instance; return true; } object value = instance.Value; if (value == null) { result = null; return ReflectionUtils.IsNullable(binder.Type); } result = ConvertUtils.Convert(instance.Value, CultureInfo.InvariantCulture, binder.Type); return true; } public override bool TryBinaryOperation(JValue instance, BinaryOperationBinder binder, object arg, out object result) { object compareValue = (arg is JValue) ? ((JValue) arg).Value : arg; switch (binder.Operation) { case ExpressionType.Equal: result = (Compare(instance.Type, instance.Value, compareValue) == 0); return true; case ExpressionType.NotEqual: result = (Compare(instance.Type, instance.Value, compareValue) != 0); return true; case ExpressionType.GreaterThan: result = (Compare(instance.Type, instance.Value, compareValue) > 0); return true; case ExpressionType.GreaterThanOrEqual: result = (Compare(instance.Type, instance.Value, compareValue) >= 0); return true; case ExpressionType.LessThan: result = (Compare(instance.Type, instance.Value, compareValue) < 0); return true; case ExpressionType.LessThanOrEqual: result = (Compare(instance.Type, instance.Value, compareValue) <= 0); return true; case ExpressionType.Add: case ExpressionType.AddAssign: case ExpressionType.Subtract: case ExpressionType.SubtractAssign: case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: case ExpressionType.Divide: case ExpressionType.DivideAssign: if (Operation(binder.Operation, instance.Value, compareValue, out result)) { result = new JValue(result); return true; } break; } result = null; return false; } } #endif int IComparable.CompareTo(object obj) { if (obj == null) return 1; object otherValue = (obj is JValue) ? ((JValue) obj).Value : obj; return Compare(_valueType, _value, otherValue); } /// /// Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. /// /// An object to compare with this instance. /// /// A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: /// Value /// Meaning /// Less than zero /// This instance is less than . /// Zero /// This instance is equal to . /// Greater than zero /// This instance is greater than . /// /// /// is not the same type as this instance. /// public int CompareTo(JValue obj) { if (obj == null) return 1; return Compare(_valueType, _value, obj._value); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JProperty.cs0000644000175000017500000001666412253423361026155 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Utilities; using System.Diagnostics; using System.Globalization; namespace Newtonsoft.Json.Linq { /// /// Represents a JSON property. /// public class JProperty : JContainer { private readonly List _content = new List(); private readonly string _name; /// /// Gets the container's children tokens. /// /// The container's children tokens. protected override IList ChildrenTokens { get { return _content; } } /// /// Gets the property name. /// /// The property name. public string Name { [DebuggerStepThrough] get { return _name; } } /// /// Gets or sets the property value. /// /// The property value. public JToken Value { [DebuggerStepThrough] get { return (ChildrenTokens.Count > 0) ? ChildrenTokens[0] : null; } set { CheckReentrancy(); JToken newValue = value ?? new JValue((object) null); if (ChildrenTokens.Count == 0) { InsertItem(0, newValue, false); } else { SetItem(0, newValue); } } } /// /// Initializes a new instance of the class from another object. /// /// A object to copy from. public JProperty(JProperty other) : base(other) { _name = other.Name; } internal override JToken GetItem(int index) { if (index != 0) throw new ArgumentOutOfRangeException(); return Value; } internal override void SetItem(int index, JToken item) { if (index != 0) throw new ArgumentOutOfRangeException(); if (IsTokenUnchanged(Value, item)) return; if (Parent != null) ((JObject)Parent).InternalPropertyChanging(this); base.SetItem(0, item); if (Parent != null) ((JObject)Parent).InternalPropertyChanged(this); } internal override bool RemoveItem(JToken item) { throw new JsonException("Cannot add or remove items from {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); } internal override void RemoveItemAt(int index) { throw new JsonException("Cannot add or remove items from {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); } internal override void InsertItem(int index, JToken item, bool skipParentCheck) { if (Value != null) throw new JsonException("{0} cannot have multiple values.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); base.InsertItem(0, item, false); } internal override bool ContainsItem(JToken item) { return (Value == item); } internal override void ClearItems() { throw new JsonException("Cannot add or remove items from {0}.".FormatWith(CultureInfo.InvariantCulture, typeof(JProperty))); } internal override bool DeepEquals(JToken node) { JProperty t = node as JProperty; return (t != null && _name == t.Name && ContentsEqual(t)); } internal override JToken CloneToken() { return new JProperty(this); } /// /// Gets the node type for this . /// /// The type. public override JTokenType Type { [DebuggerStepThrough] get { return JTokenType.Property; } } internal JProperty(string name) { // called from JTokenWriter ValidationUtils.ArgumentNotNull(name, "name"); _name = name; } /// /// Initializes a new instance of the class. /// /// The property name. /// The property content. public JProperty(string name, params object[] content) : this(name, (object)content) { } /// /// Initializes a new instance of the class. /// /// The property name. /// The property content. public JProperty(string name, object content) { ValidationUtils.ArgumentNotNull(name, "name"); _name = name; Value = IsMultiContent(content) ? new JArray(content) : CreateFromContent(content); } /// /// Writes this token to a . /// /// A into which this method will write. /// A collection of which will be used when writing the token. public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) { writer.WritePropertyName(_name); Value.WriteTo(writer, converters); } internal override int GetDeepHashCode() { return _name.GetHashCode() ^ ((Value != null) ? Value.GetDeepHashCode() : 0); } /// /// Loads an from a . /// /// A that will be read for the content of the . /// A that contains the JSON that was read from the specified . public static new JProperty Load(JsonReader reader) { if (reader.TokenType == JsonToken.None) { if (!reader.Read()) throw JsonReaderException.Create(reader, "Error reading JProperty from JsonReader."); } while (reader.TokenType == JsonToken.Comment) { reader.Read(); } if (reader.TokenType != JsonToken.PropertyName) throw JsonReaderException.Create(reader, "Error reading JProperty from JsonReader. Current JsonReader item is not a property: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); JProperty p = new JProperty((string)reader.Value); p.SetLineInfo(reader as IJsonLineInfo); p.ReadTokenFrom(reader); return p; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JTokenWriter.cs0000644000175000017500000002742612253423361026604 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Linq { /// /// Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. /// public class JTokenWriter : JsonWriter { private JContainer _token; private JContainer _parent; // used when writer is writing single value and the value has no containing parent private JValue _value; /// /// Gets the token being writen. /// /// The token being writen. public JToken Token { get { if (_token != null) return _token; return _value; } } /// /// Initializes a new instance of the class writing to the given . /// /// The container being written to. public JTokenWriter(JContainer container) { ValidationUtils.ArgumentNotNull(container, "container"); _token = container; _parent = container; } /// /// Initializes a new instance of the class. /// public JTokenWriter() { } /// /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. /// public override void Flush() { } /// /// Closes this stream and the underlying stream. /// public override void Close() { base.Close(); } /// /// Writes the beginning of a Json object. /// public override void WriteStartObject() { base.WriteStartObject(); AddParent(new JObject()); } private void AddParent(JContainer container) { if (_parent == null) _token = container; else _parent.AddAndSkipParentCheck(container); _parent = container; } private void RemoveParent() { _parent = _parent.Parent; if (_parent != null && _parent.Type == JTokenType.Property) _parent = _parent.Parent; } /// /// Writes the beginning of a Json array. /// public override void WriteStartArray() { base.WriteStartArray(); AddParent(new JArray()); } /// /// Writes the start of a constructor with the given name. /// /// The name of the constructor. public override void WriteStartConstructor(string name) { base.WriteStartConstructor(name); AddParent(new JConstructor(name)); } /// /// Writes the end. /// /// The token. protected override void WriteEnd(JsonToken token) { RemoveParent(); } /// /// Writes the property name of a name/value pair on a Json object. /// /// The name of the property. public override void WritePropertyName(string name) { base.WritePropertyName(name); AddParent(new JProperty(name)); } private void AddValue(object value, JsonToken token) { AddValue(new JValue(value), token); } internal void AddValue(JValue value, JsonToken token) { if (_parent != null) { _parent.Add(value); if (_parent.Type == JTokenType.Property) _parent = _parent.Parent; } else { _value = value; } } #region WriteValue methods /// /// Writes a null value. /// public override void WriteNull() { base.WriteNull(); AddValue(null, JsonToken.Null); } /// /// Writes an undefined value. /// public override void WriteUndefined() { base.WriteUndefined(); AddValue(null, JsonToken.Undefined); } /// /// Writes raw JSON. /// /// The raw JSON to write. public override void WriteRaw(string json) { base.WriteRaw(json); AddValue(new JRaw(json), JsonToken.Raw); } /// /// Writes out a comment /*...*/ containing the specified text. /// /// Text to place inside the comment. public override void WriteComment(string text) { base.WriteComment(text); AddValue(JValue.CreateComment(text), JsonToken.Comment); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(string value) { base.WriteValue(value); AddValue(value ?? string.Empty, JsonToken.String); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(int value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(uint value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(long value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(ulong value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(float value) { base.WriteValue(value); AddValue(value, JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(double value) { base.WriteValue(value); AddValue(value, JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(bool value) { base.WriteValue(value); AddValue(value, JsonToken.Boolean); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(short value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(ushort value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(char value) { base.WriteValue(value); string s = null; #if !(NETFX_CORE || PORTABLE) s = value.ToString(CultureInfo.InvariantCulture); #else s = value.ToString(); #endif AddValue(s, JsonToken.String); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(byte value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(sbyte value) { base.WriteValue(value); AddValue(value, JsonToken.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(decimal value) { base.WriteValue(value); AddValue(value, JsonToken.Float); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(DateTime value) { base.WriteValue(value); value = JsonConvert.EnsureDateTime(value, DateTimeZoneHandling); AddValue(value, JsonToken.Date); } #if !PocketPC && !NET20 /// /// Writes a value. /// /// The value to write. public override void WriteValue(DateTimeOffset value) { base.WriteValue(value); AddValue(value, JsonToken.Date); } #endif /// /// Writes a value. /// /// The value to write. public override void WriteValue(byte[] value) { base.WriteValue(value); AddValue(value, JsonToken.Bytes); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(TimeSpan value) { base.WriteValue(value); AddValue(value, JsonToken.String); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(Guid value) { base.WriteValue(value); AddValue(value, JsonToken.String); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(Uri value) { base.WriteValue(value); AddValue(value, JsonToken.String); } #endregion } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JEnumerable.cs0000644000175000017500000000773612253423361026410 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using Newtonsoft.Json.Utilities; using System.Collections; namespace Newtonsoft.Json.Linq { /// /// Represents a collection of objects. /// /// The type of token public struct JEnumerable : IJEnumerable where T : JToken { /// /// An empty collection of objects. /// public static readonly JEnumerable Empty = new JEnumerable(Enumerable.Empty()); private readonly IEnumerable _enumerable; /// /// Initializes a new instance of the struct. /// /// The enumerable. public JEnumerable(IEnumerable enumerable) { ValidationUtils.ArgumentNotNull(enumerable, "enumerable"); _enumerable = enumerable; } /// /// Returns an enumerator that iterates through the collection. /// /// /// A that can be used to iterate through the collection. /// public IEnumerator GetEnumerator() { return _enumerable.GetEnumerator(); } /// /// Returns an enumerator that iterates through a collection. /// /// /// An object that can be used to iterate through the collection. /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } /// /// Gets the with the specified key. /// /// public IJEnumerable this[object key] { get { return new JEnumerable(Extensions.Values(_enumerable, key)); } } /// /// Determines whether the specified is equal to this instance. /// /// The to compare with this instance. /// /// true if the specified is equal to this instance; otherwise, false. /// public override bool Equals(object obj) { if (obj is JEnumerable) return _enumerable.Equals(((JEnumerable)obj)._enumerable); return false; } /// /// Returns a hash code for this instance. /// /// /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. /// public override int GetHashCode() { return _enumerable.GetHashCode(); } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JToken.cs0000644000175000017500000014452112253423361025403 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System.Dynamic; using System.Linq.Expressions; #endif using System.IO; using Newtonsoft.Json.Utilities; using System.Diagnostics; using System.Globalization; using System.Collections; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Linq { /// /// Represents an abstract JSON token. /// public abstract class JToken : IJEnumerable, IJsonLineInfo #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) , ICloneable #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) , IDynamicMetaObjectProvider #endif { private JContainer _parent; private JToken _previous; private JToken _next; private static JTokenEqualityComparer _equalityComparer; private int? _lineNumber; private int? _linePosition; /// /// Gets a comparer that can compare two tokens for value equality. /// /// A that can compare two nodes for value equality. public static JTokenEqualityComparer EqualityComparer { get { if (_equalityComparer == null) _equalityComparer = new JTokenEqualityComparer(); return _equalityComparer; } } /// /// Gets or sets the parent. /// /// The parent. public JContainer Parent { [DebuggerStepThrough] get { return _parent; } internal set { _parent = value; } } /// /// Gets the root of this . /// /// The root of this . public JToken Root { get { JContainer parent = Parent; if (parent == null) return this; while (parent.Parent != null) { parent = parent.Parent; } return parent; } } internal abstract JToken CloneToken(); internal abstract bool DeepEquals(JToken node); /// /// Gets the node type for this . /// /// The type. public abstract JTokenType Type { get; } /// /// Gets a value indicating whether this token has childen tokens. /// /// /// true if this token has child values; otherwise, false. /// public abstract bool HasValues { get; } /// /// Compares the values of two tokens, including the values of all descendant tokens. /// /// The first to compare. /// The second to compare. /// true if the tokens are equal; otherwise false. public static bool DeepEquals(JToken t1, JToken t2) { return (t1 == t2 || (t1 != null && t2 != null && t1.DeepEquals(t2))); } /// /// Gets the next sibling token of this node. /// /// The that contains the next sibling token. public JToken Next { get { return _next; } internal set { _next = value; } } /// /// Gets the previous sibling token of this node. /// /// The that contains the previous sibling token. public JToken Previous { get { return _previous; } internal set { _previous = value; } } internal JToken() { } /// /// Adds the specified content immediately after this token. /// /// A content object that contains simple content or a collection of content objects to be added after this token. public void AddAfterSelf(object content) { if (_parent == null) throw new InvalidOperationException("The parent is missing."); int index = _parent.IndexOfItem(this); _parent.AddInternal(index + 1, content, false); } /// /// Adds the specified content immediately before this token. /// /// A content object that contains simple content or a collection of content objects to be added before this token. public void AddBeforeSelf(object content) { if (_parent == null) throw new InvalidOperationException("The parent is missing."); int index = _parent.IndexOfItem(this); _parent.AddInternal(index, content, false); } /// /// Returns a collection of the ancestor tokens of this token. /// /// A collection of the ancestor tokens of this token. public IEnumerable Ancestors() { for (JToken parent = Parent; parent != null; parent = parent.Parent) { yield return parent; } } /// /// Returns a collection of the sibling tokens after this token, in document order. /// /// A collection of the sibling tokens after this tokens, in document order. public IEnumerable AfterSelf() { if (Parent == null) yield break; for (JToken o = Next; o != null; o = o.Next) { yield return o; } } /// /// Returns a collection of the sibling tokens before this token, in document order. /// /// A collection of the sibling tokens before this token, in document order. public IEnumerable BeforeSelf() { for (JToken o = Parent.First; o != this; o = o.Next) { yield return o; } } /// /// Gets the with the specified key. /// /// The with the specified key. public virtual JToken this[object key] { get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } set { throw new InvalidOperationException("Cannot set child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } } /// /// Gets the with the specified key converted to the specified type. /// /// The type to convert the token to. /// The token key. /// The converted token value. public virtual T Value(object key) { JToken token = this[key]; return Extensions.Convert(token); } /// /// Get the first child token of this token. /// /// A containing the first child token of the . public virtual JToken First { get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } } /// /// Get the last child token of this token. /// /// A containing the last child token of the . public virtual JToken Last { get { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } } /// /// Returns a collection of the child tokens of this token, in document order. /// /// An of containing the child tokens of this , in document order. public virtual JEnumerable Children() { return JEnumerable.Empty; } /// /// Returns a collection of the child tokens of this token, in document order, filtered by the specified type. /// /// The type to filter the child tokens on. /// A containing the child tokens of this , in document order. public JEnumerable Children() where T : JToken { return new JEnumerable(Children().OfType()); } /// /// Returns a collection of the child values of this token, in document order. /// /// The type to convert the values to. /// A containing the child values of this , in document order. public virtual IEnumerable Values() { throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType())); } /// /// Removes this token from its parent. /// public void Remove() { if (_parent == null) throw new InvalidOperationException("The parent is missing."); _parent.RemoveItem(this); } /// /// Replaces this token with the specified token. /// /// The value. public void Replace(JToken value) { if (_parent == null) throw new InvalidOperationException("The parent is missing."); _parent.ReplaceItem(this, value); } /// /// Writes this token to a . /// /// A into which this method will write. /// A collection of which will be used when writing the token. public abstract void WriteTo(JsonWriter writer, params JsonConverter[] converters); /// /// Returns the indented JSON for this token. /// /// /// The indented JSON for this token. /// public override string ToString() { return ToString(Formatting.Indented); } /// /// Returns the JSON for this token using the given formatting and converters. /// /// Indicates how the output is formatted. /// A collection of which will be used when writing the token. /// The JSON for this token using the given formatting and converters. public string ToString(Formatting formatting, params JsonConverter[] converters) { using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) { JsonTextWriter jw = new JsonTextWriter(sw); jw.Formatting = formatting; WriteTo(jw, converters); return sw.ToString(); } } private static JValue EnsureValue(JToken value) { if (value == null) throw new ArgumentNullException("value"); if (value is JProperty) value = ((JProperty)value).Value; JValue v = value as JValue; return v; } private static string GetType(JToken token) { ValidationUtils.ArgumentNotNull(token, "token"); if (token is JProperty) token = ((JProperty)token).Value; return token.Type.ToString(); } private static bool IsNullable(JToken o) { return (o.Type == JTokenType.Undefined || o.Type == JTokenType.Null); } private static bool ValidateFloat(JToken o, bool nullable) { return (o.Type == JTokenType.Float || o.Type == JTokenType.Integer || (nullable && IsNullable(o))); } private static bool ValidateInteger(JToken o, bool nullable) { return (o.Type == JTokenType.Integer || (nullable && IsNullable(o))); } private static bool ValidateDate(JToken o, bool nullable) { return (o.Type == JTokenType.Date || (nullable && IsNullable(o))); } private static bool ValidateBoolean(JToken o, bool nullable) { return (o.Type == JTokenType.Boolean || (nullable && IsNullable(o))); } private static bool ValidateString(JToken o) { return (o.Type == JTokenType.String || o.Type == JTokenType.Comment || o.Type == JTokenType.Raw || IsNullable(o)); } private static bool ValidateBytes(JToken o) { return (o.Type == JTokenType.Bytes || IsNullable(o)); } #region Cast from operators /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator bool(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateBoolean(v, false)) throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToBoolean(v.Value, CultureInfo.InvariantCulture); } #if !PocketPC && !NET20 /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator DateTimeOffset(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateDate(v, false)) throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (DateTimeOffset)v.Value; } #endif /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator bool?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateBoolean(v, true)) throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (bool?)Convert.ToBoolean(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator long(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, false)) throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToInt64(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator DateTime?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateDate(v, true)) throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (DateTime?)Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture) : null; } #if !PocketPC && !NET20 /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator DateTimeOffset?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateDate(v, true)) throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (DateTimeOffset?)v.Value; } #endif /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator decimal?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateFloat(v, true)) throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (decimal?)Convert.ToDecimal(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator double?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateFloat(v, true)) throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (double?)v.Value; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator int(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, false)) throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToInt32(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator short(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, false)) throw new ArgumentException("Can not convert {0} to Int16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToInt16(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. [CLSCompliant(false)] public static explicit operator ushort(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, false)) throw new ArgumentException("Can not convert {0} to UInt16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToUInt16(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator int?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, true)) throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (int?)Convert.ToInt32(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator short?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, true)) throw new ArgumentException("Can not convert {0} to Int16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (short?)Convert.ToInt16(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. [CLSCompliant(false)] public static explicit operator ushort?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, true)) throw new ArgumentException("Can not convert {0} to UInt16.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (ushort?)Convert.ToInt16(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator DateTime(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateDate(v, false)) throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToDateTime(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator long?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, true)) throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (long?)Convert.ToInt64(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator float?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateFloat(v, true)) throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (float?)Convert.ToSingle(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator decimal(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateFloat(v, false)) throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToDecimal(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. [CLSCompliant(false)] public static explicit operator uint?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, true)) throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (uint?)Convert.ToUInt32(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. [CLSCompliant(false)] public static explicit operator ulong?(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, true)) throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? (ulong?)Convert.ToUInt64(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator double(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateFloat(v, false)) throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToDouble(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator float(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateFloat(v, false)) throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToSingle(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator string(JToken value) { if (value == null) return null; JValue v = EnsureValue(value); if (v == null || !ValidateString(v)) throw new ArgumentException("Can not convert {0} to String.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (v.Value != null) ? Convert.ToString(v.Value, CultureInfo.InvariantCulture) : null; } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. [CLSCompliant(false)] public static explicit operator uint(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, false)) throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToUInt32(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. [CLSCompliant(false)] public static explicit operator ulong(JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateInteger(v, false)) throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return Convert.ToUInt64(v.Value, CultureInfo.InvariantCulture); } /// /// Performs an explicit conversion from to . /// /// The value. /// The result of the conversion. public static explicit operator byte[](JToken value) { JValue v = EnsureValue(value); if (v == null || !ValidateBytes(v)) throw new ArgumentException("Can not convert {0} to byte array.".FormatWith(CultureInfo.InvariantCulture, GetType(value))); return (byte[])v.Value; } #endregion #region Cast to operators /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(bool value) { return new JValue(value); } #if !PocketPC && !NET20 /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(DateTimeOffset value) { return new JValue(value); } #endif /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(bool? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(long value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(DateTime? value) { return new JValue(value); } #if !PocketPC && !NET20 /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(DateTimeOffset? value) { return new JValue(value); } #endif /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(decimal? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(double? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(short value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(ushort value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(int value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(int? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(DateTime value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(long? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(float? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(decimal value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(short? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(ushort? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(uint? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(ulong? value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(double value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(float value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(string value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(uint value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. [CLSCompliant(false)] public static implicit operator JToken(ulong value) { return new JValue(value); } /// /// Performs an implicit conversion from to . /// /// The value to create a from. /// The initialized with the specified value. public static implicit operator JToken(byte[] value) { return new JValue(value); } #endregion IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return Children().GetEnumerator(); } internal abstract int GetDeepHashCode(); IJEnumerable IJEnumerable.this[object key] { get { return this[key]; } } /// /// Creates an for this token. /// /// An that can be used to read this token and its descendants. public JsonReader CreateReader() { return new JTokenReader(this); } internal static JToken FromObjectInternal(object o, JsonSerializer jsonSerializer) { ValidationUtils.ArgumentNotNull(o, "o"); ValidationUtils.ArgumentNotNull(jsonSerializer, "jsonSerializer"); JToken token; using (JTokenWriter jsonWriter = new JTokenWriter()) { jsonSerializer.Serialize(jsonWriter, o); token = jsonWriter.Token; } return token; } /// /// Creates a from an object. /// /// The object that will be used to create . /// A with the value of the specified object public static JToken FromObject(object o) { return FromObjectInternal(o, new JsonSerializer()); } /// /// Creates a from an object using the specified . /// /// The object that will be used to create . /// The that will be used when reading the object. /// A with the value of the specified object public static JToken FromObject(object o, JsonSerializer jsonSerializer) { return FromObjectInternal(o, jsonSerializer); } /// /// Creates the specified .NET type from the . /// /// The object type that the token will be deserialized to. /// The new object created from the JSON value. public T ToObject() { return ToObject(new JsonSerializer()); } /// /// Creates the specified .NET type from the using the specified . /// /// The object type that the token will be deserialized to. /// The that will be used when creating the object. /// The new object created from the JSON value. public T ToObject(JsonSerializer jsonSerializer) { ValidationUtils.ArgumentNotNull(jsonSerializer, "jsonSerializer"); using (JTokenReader jsonReader = new JTokenReader(this)) { return jsonSerializer.Deserialize(jsonReader); } } /// /// Creates a from a . /// /// An positioned at the token to read into this . /// /// An that contains the token and its descendant tokens /// that were read from the reader. The runtime type of the token is determined /// by the token type of the first token encountered in the reader. /// public static JToken ReadFrom(JsonReader reader) { ValidationUtils.ArgumentNotNull(reader, "reader"); if (reader.TokenType == JsonToken.None) { if (!reader.Read()) throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader."); } if (reader.TokenType == JsonToken.StartObject) return JObject.Load(reader); if (reader.TokenType == JsonToken.StartArray) return JArray.Load(reader); if (reader.TokenType == JsonToken.PropertyName) return JProperty.Load(reader); if (reader.TokenType == JsonToken.StartConstructor) return JConstructor.Load(reader); if (!JsonReader.IsStartToken(reader.TokenType)) return new JValue(reader.Value); throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader. Unexpected token: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } /// /// Load a from a string that contains JSON. /// /// A that contains JSON. /// A populated from the string that contains JSON. public static JToken Parse(string json) { JsonReader reader = new JsonTextReader(new StringReader(json)); JToken t = Load(reader); if (reader.Read() && reader.TokenType != JsonToken.Comment) throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content."); return t; } /// /// Creates a from a . /// /// An positioned at the token to read into this . /// /// An that contains the token and its descendant tokens /// that were read from the reader. The runtime type of the token is determined /// by the token type of the first token encountered in the reader. /// public static JToken Load(JsonReader reader) { return ReadFrom(reader); } internal void SetLineInfo(IJsonLineInfo lineInfo) { if (lineInfo == null || !lineInfo.HasLineInfo()) return; SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition); } internal void SetLineInfo(int lineNumber, int linePosition) { _lineNumber = lineNumber; _linePosition = linePosition; } bool IJsonLineInfo.HasLineInfo() { return (_lineNumber != null && _linePosition != null); } int IJsonLineInfo.LineNumber { get { return _lineNumber ?? 0; } } int IJsonLineInfo.LinePosition { get { return _linePosition ?? 0; } } /// /// Selects the token that matches the object path. /// /// /// The object path from the current to the /// to be returned. This must be a string of property names or array indexes separated /// by periods, such as Tables[0].DefaultView[0].Price in C# or /// Tables(0).DefaultView(0).Price in Visual Basic. /// /// The that matches the object path or a null reference if no matching token is found. public JToken SelectToken(string path) { return SelectToken(path, false); } /// /// Selects the token that matches the object path. /// /// /// The object path from the current to the /// to be returned. This must be a string of property names or array indexes separated /// by periods, such as Tables[0].DefaultView[0].Price in C# or /// Tables(0).DefaultView(0).Price in Visual Basic. /// /// A flag to indicate whether an error should be thrown if no token is found. /// The that matches the object path. public JToken SelectToken(string path, bool errorWhenNoMatch) { JPath p = new JPath(path); return p.Evaluate(this, errorWhenNoMatch); } #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) /// /// Returns the responsible for binding operations performed on this object. /// /// The expression tree representation of the runtime value. /// /// The to bind this object. /// protected virtual DynamicMetaObject GetMetaObject(Expression parameter) { return new DynamicProxyMetaObject(parameter, this, new DynamicProxy(), true); } /// /// Returns the responsible for binding operations performed on this object. /// /// The expression tree representation of the runtime value. /// /// The to bind this object. /// DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) { return GetMetaObject(parameter); } #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) object ICloneable.Clone() { return DeepClone(); } #endif /// /// Creates a new instance of the . All child tokens are recursively cloned. /// /// A new instance of the . public JToken DeepClone() { return CloneToken(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JPropertyKeyedCollection.cs0000644000175000017500000001270012253423361031136 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Newtonsoft.Json.Linq { internal class JPropertyKeyedCollection : Collection { private static readonly IEqualityComparer Comparer = StringComparer.Ordinal; private Dictionary _dictionary; private void AddKey(string key, JToken item) { EnsureDictionary(); _dictionary[key] = item; } protected void ChangeItemKey(JToken item, string newKey) { if (!ContainsItem(item)) throw new ArgumentException("The specified item does not exist in this KeyedCollection."); string keyForItem = GetKeyForItem(item); if (!Comparer.Equals(keyForItem, newKey)) { if (newKey != null) AddKey(newKey, item); if (keyForItem != null) RemoveKey(keyForItem); } } protected override void ClearItems() { base.ClearItems(); if (_dictionary != null) _dictionary.Clear(); } public bool Contains(string key) { if (key == null) throw new ArgumentNullException("key"); if (_dictionary != null) return _dictionary.ContainsKey(key); return false; } private bool ContainsItem(JToken item) { if (_dictionary == null) return false; string key = GetKeyForItem(item); JToken value; return _dictionary.TryGetValue(key, out value); } private void EnsureDictionary() { if (_dictionary == null) _dictionary = new Dictionary(Comparer); } private string GetKeyForItem(JToken item) { return ((JProperty)item).Name; } protected override void InsertItem(int index, JToken item) { AddKey(GetKeyForItem(item), item); base.InsertItem(index, item); } public bool Remove(string key) { if (key == null) throw new ArgumentNullException("key"); if (_dictionary != null) return _dictionary.ContainsKey(key) && Remove(_dictionary[key]); return false; } protected override void RemoveItem(int index) { string keyForItem = GetKeyForItem(Items[index]); RemoveKey(keyForItem); base.RemoveItem(index); } private void RemoveKey(string key) { if (_dictionary != null) _dictionary.Remove(key); } protected override void SetItem(int index, JToken item) { string keyForItem = GetKeyForItem(item); string keyAtIndex = GetKeyForItem(Items[index]); if (Comparer.Equals(keyAtIndex, keyForItem)) { if (_dictionary != null) _dictionary[keyForItem] = item; } else { AddKey(keyForItem, item); if (keyAtIndex != null) RemoveKey(keyAtIndex); } base.SetItem(index, item); } public JToken this[string key] { get { if (key == null) throw new ArgumentNullException("key"); if (_dictionary != null) return _dictionary[key]; throw new KeyNotFoundException(); } } public bool TryGetValue(string key, out JToken value) { if (_dictionary == null) { value = null; return false; } return _dictionary.TryGetValue(key, out value); } public ICollection Keys { get { EnsureDictionary(); return _dictionary.Keys; } } public ICollection Values { get { EnsureDictionary(); return _dictionary.Values; } } public bool Compare(JPropertyKeyedCollection other) { if (this == other) return true; // dictionaries in JavaScript aren't ordered // ignore order when comparing properties Dictionary d1 = _dictionary; Dictionary d2 = other._dictionary; if (d1.Count != d2.Count) return false; foreach (KeyValuePair keyAndProperty in d1) { JToken secondValue; if (!d2.TryGetValue(keyAndProperty.Key, out secondValue)) return false; JProperty p1 = (JProperty)keyAndProperty.Value; JProperty p2 = (JProperty)secondValue; if (!p1.Value.DeepEquals(p2.Value)) return false; } return true; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JTokenType.cs0000644000175000017500000000510712253423361026241 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Linq { /// /// Specifies the type of token. /// public enum JTokenType { /// /// No token type has been set. /// None, /// /// A JSON object. /// Object, /// /// A JSON array. /// Array, /// /// A JSON constructor. /// Constructor, /// /// A JSON object property. /// Property, /// /// A comment. /// Comment, /// /// An integer value. /// Integer, /// /// A float value. /// Float, /// /// A string value. /// String, /// /// A boolean value. /// Boolean, /// /// A null value. /// Null, /// /// An undefined value. /// Undefined, /// /// A date value. /// Date, /// /// A raw JSON value. /// Raw, /// /// A collection of bytes value. /// Bytes, /// /// A Guid value. /// Guid, /// /// A Uri value. /// Uri, /// /// A TimeSpan value. /// TimeSpan } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JObject.cs0000644000175000017500000006146512253423361025536 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Collections.ObjectModel; #if !PORTABLE using System.Collections.Specialized; #endif using System.ComponentModel; #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System.Dynamic; using System.Linq.Expressions; #endif using System.IO; using Newtonsoft.Json.Utilities; using System.Globalization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Linq { /// /// Represents a JSON object. /// /// /// /// public class JObject : JContainer, IDictionary, INotifyPropertyChanged #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) , ICustomTypeDescriptor #endif #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) , INotifyPropertyChanging #endif { private readonly JPropertyKeyedCollection _properties = new JPropertyKeyedCollection(); /// /// Gets the container's children tokens. /// /// The container's children tokens. protected override IList ChildrenTokens { get { return _properties; } } /// /// Occurs when a property value changes. /// public event PropertyChangedEventHandler PropertyChanged; #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) /// /// Occurs when a property value is changing. /// public event PropertyChangingEventHandler PropertyChanging; #endif /// /// Initializes a new instance of the class. /// public JObject() { } /// /// Initializes a new instance of the class from another object. /// /// A object to copy from. public JObject(JObject other) : base(other) { } /// /// Initializes a new instance of the class with the specified content. /// /// The contents of the object. public JObject(params object[] content) : this((object)content) { } /// /// Initializes a new instance of the class with the specified content. /// /// The contents of the object. public JObject(object content) { Add(content); } internal override bool DeepEquals(JToken node) { JObject t = node as JObject; if (t == null) return false; return _properties.Compare(t._properties); } internal override void InsertItem(int index, JToken item, bool skipParentCheck) { // don't add comments to JObject, no name to reference comment by if (item != null && item.Type == JTokenType.Comment) return; base.InsertItem(index, item, skipParentCheck); } internal override void ValidateToken(JToken o, JToken existing) { ValidationUtils.ArgumentNotNull(o, "o"); if (o.Type != JTokenType.Property) throw new ArgumentException("Can not add {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, o.GetType(), GetType())); JProperty newProperty = (JProperty) o; if (existing != null) { JProperty existingProperty = (JProperty) existing; if (newProperty.Name == existingProperty.Name) return; } if (_properties.TryGetValue(newProperty.Name, out existing)) throw new ArgumentException("Can not add property {0} to {1}. Property with the same name already exists on object.".FormatWith(CultureInfo.InvariantCulture, newProperty.Name, GetType())); } internal void InternalPropertyChanged(JProperty childProperty) { OnPropertyChanged(childProperty.Name); #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, IndexOfItem(childProperty))); #endif #if SILVERLIGHT || !(NET20 || NET35 || PORTABLE) OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, childProperty, childProperty, IndexOfItem(childProperty))); #endif } internal void InternalPropertyChanging(JProperty childProperty) { #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) OnPropertyChanging(childProperty.Name); #endif } internal override JToken CloneToken() { return new JObject(this); } /// /// Gets the node type for this . /// /// The type. public override JTokenType Type { get { return JTokenType.Object; } } /// /// Gets an of this object's properties. /// /// An of this object's properties. public IEnumerable Properties() { return ChildrenTokens.Cast(); } /// /// Gets a the specified name. /// /// The property name. /// A with the specified name or null. public JProperty Property(string name) { if (name == null) return null; JToken property; _properties.TryGetValue(name, out property); return (JProperty)property; } /// /// Gets an of this object's property values. /// /// An of this object's property values. public JEnumerable PropertyValues() { return new JEnumerable(Properties().Select(p => p.Value)); } /// /// Gets the with the specified key. /// /// The with the specified key. public override JToken this[object key] { get { ValidationUtils.ArgumentNotNull(key, "o"); string propertyName = key as string; if (propertyName == null) throw new ArgumentException("Accessed JObject values with invalid key value: {0}. Object property name expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); return this[propertyName]; } set { ValidationUtils.ArgumentNotNull(key, "o"); string propertyName = key as string; if (propertyName == null) throw new ArgumentException("Set JObject values with invalid key value: {0}. Object property name expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); this[propertyName] = value; } } /// /// Gets or sets the with the specified property name. /// /// public JToken this[string propertyName] { get { ValidationUtils.ArgumentNotNull(propertyName, "propertyName"); JProperty property = Property(propertyName); return (property != null) ? property.Value : null; } set { JProperty property = Property(propertyName); if (property != null) { property.Value = value; } else { #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) OnPropertyChanging(propertyName); #endif Add(new JProperty(propertyName, value)); OnPropertyChanged(propertyName); } } } /// /// Loads an from a . /// /// A that will be read for the content of the . /// A that contains the JSON that was read from the specified . public static new JObject Load(JsonReader reader) { ValidationUtils.ArgumentNotNull(reader, "reader"); if (reader.TokenType == JsonToken.None) { if (!reader.Read()) throw JsonReaderException.Create(reader, "Error reading JObject from JsonReader."); } while (reader.TokenType == JsonToken.Comment) { reader.Read(); } if (reader.TokenType != JsonToken.StartObject) { throw JsonReaderException.Create(reader, "Error reading JObject from JsonReader. Current JsonReader item is not an object: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } JObject o = new JObject(); o.SetLineInfo(reader as IJsonLineInfo); o.ReadTokenFrom(reader); return o; } /// /// Load a from a string that contains JSON. /// /// A that contains JSON. /// A populated from the string that contains JSON. /// /// /// public static new JObject Parse(string json) { JsonReader reader = new JsonTextReader(new StringReader(json)); JObject o = Load(reader); if (reader.Read() && reader.TokenType != JsonToken.Comment) throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content."); return o; } /// /// Creates a from an object. /// /// The object that will be used to create . /// A with the values of the specified object public static new JObject FromObject(object o) { return FromObject(o, new JsonSerializer()); } /// /// Creates a from an object. /// /// The object that will be used to create . /// The that will be used to read the object. /// A with the values of the specified object public static new JObject FromObject(object o, JsonSerializer jsonSerializer) { JToken token = FromObjectInternal(o, jsonSerializer); if (token != null && token.Type != JTokenType.Object) throw new ArgumentException("Object serialized to {0}. JObject instance expected.".FormatWith(CultureInfo.InvariantCulture, token.Type)); return (JObject)token; } /// /// Writes this token to a . /// /// A into which this method will write. /// A collection of which will be used when writing the token. public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) { writer.WriteStartObject(); foreach (JProperty property in ChildrenTokens) { property.WriteTo(writer, converters); } writer.WriteEndObject(); } #region IDictionary Members /// /// Adds the specified property name. /// /// Name of the property. /// The value. public void Add(string propertyName, JToken value) { Add(new JProperty(propertyName, value)); } bool IDictionary.ContainsKey(string key) { return _properties.Contains(key); } ICollection IDictionary.Keys { // todo: make order the collection returned match JObject order get { return _properties.Keys; } } /// /// Removes the property with the specified name. /// /// Name of the property. /// true if item was successfully removed; otherwise, false. public bool Remove(string propertyName) { JProperty property = Property(propertyName); if (property == null) return false; property.Remove(); return true; } /// /// Tries the get value. /// /// Name of the property. /// The value. /// true if a value was successfully retrieved; otherwise, false. public bool TryGetValue(string propertyName, out JToken value) { JProperty property = Property(propertyName); if (property == null) { value = null; return false; } value = property.Value; return true; } ICollection IDictionary.Values { get { // todo: need to wrap _properties.Values with a collection to get the JProperty value throw new NotImplementedException(); } } #endregion #region ICollection> Members void ICollection>.Add(KeyValuePair item) { Add(new JProperty(item.Key, item.Value)); } void ICollection>.Clear() { RemoveAll(); } bool ICollection>.Contains(KeyValuePair item) { JProperty property = Property(item.Key); if (property == null) return false; return (property.Value == item.Value); } void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException("array"); if (arrayIndex < 0) throw new ArgumentOutOfRangeException("arrayIndex", "arrayIndex is less than 0."); if (arrayIndex >= array.Length) throw new ArgumentException("arrayIndex is equal to or greater than the length of array."); if (Count > array.Length - arrayIndex) throw new ArgumentException("The number of elements in the source JObject is greater than the available space from arrayIndex to the end of the destination array."); int index = 0; foreach (JProperty property in ChildrenTokens) { array[arrayIndex + index] = new KeyValuePair(property.Name, property.Value); index++; } } bool ICollection>.IsReadOnly { get { return false; } } bool ICollection>.Remove(KeyValuePair item) { if (!((ICollection>)this).Contains(item)) return false; ((IDictionary)this).Remove(item.Key); return true; } #endregion internal override int GetDeepHashCode() { return ContentsHashCode(); } /// /// Returns an enumerator that iterates through the collection. /// /// /// A that can be used to iterate through the collection. /// public IEnumerator> GetEnumerator() { foreach (JProperty property in ChildrenTokens) { yield return new KeyValuePair(property.Name, property.Value); } } /// /// Raises the event with the provided arguments. /// /// Name of the property. protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE || NET20) /// /// Raises the event with the provided arguments. /// /// Name of the property. protected virtual void OnPropertyChanging(string propertyName) { if (PropertyChanging != null) PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); } #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) // include custom type descriptor on JObject rather than use a provider because the properties are specific to a type #region ICustomTypeDescriptor /// /// Returns the properties for this instance of a component. /// /// /// A that represents the properties for this component instance. /// PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() { return ((ICustomTypeDescriptor) this).GetProperties(null); } private static Type GetTokenPropertyType(JToken token) { if (token is JValue) { JValue v = (JValue)token; return (v.Value != null) ? v.Value.GetType() : typeof(object); } return token.GetType(); } /// /// Returns the properties for this instance of a component using the attribute array as a filter. /// /// An array of type that is used as a filter. /// /// A that represents the filtered properties for this component instance. /// PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes) { PropertyDescriptorCollection descriptors = new PropertyDescriptorCollection(null); foreach (KeyValuePair propertyValue in this) { descriptors.Add(new JPropertyDescriptor(propertyValue.Key, GetTokenPropertyType(propertyValue.Value))); } return descriptors; } /// /// Returns a collection of custom attributes for this instance of a component. /// /// /// An containing the attributes for this object. /// AttributeCollection ICustomTypeDescriptor.GetAttributes() { return AttributeCollection.Empty; } /// /// Returns the class name of this instance of a component. /// /// /// The class name of the object, or null if the class does not have a name. /// string ICustomTypeDescriptor.GetClassName() { return null; } /// /// Returns the name of this instance of a component. /// /// /// The name of the object, or null if the object does not have a name. /// string ICustomTypeDescriptor.GetComponentName() { return null; } /// /// Returns a type converter for this instance of a component. /// /// /// A that is the converter for this object, or null if there is no for this object. /// TypeConverter ICustomTypeDescriptor.GetConverter() { return new TypeConverter(); } /// /// Returns the default event for this instance of a component. /// /// /// An that represents the default event for this object, or null if this object does not have events. /// EventDescriptor ICustomTypeDescriptor.GetDefaultEvent() { return null; } /// /// Returns the default property for this instance of a component. /// /// /// A that represents the default property for this object, or null if this object does not have properties. /// PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty() { return null; } /// /// Returns an editor of the specified type for this instance of a component. /// /// A that represents the editor for this object. /// /// An of the specified type that is the editor for this object, or null if the editor cannot be found. /// object ICustomTypeDescriptor.GetEditor(Type editorBaseType) { return null; } /// /// Returns the events for this instance of a component using the specified attribute array as a filter. /// /// An array of type that is used as a filter. /// /// An that represents the filtered events for this component instance. /// EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes) { return EventDescriptorCollection.Empty; } /// /// Returns the events for this instance of a component. /// /// /// An that represents the events for this component instance. /// EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { return EventDescriptorCollection.Empty; } /// /// Returns an object that contains the property described by the specified property descriptor. /// /// A that represents the property whose owner is to be found. /// /// An that represents the owner of the specified property. /// object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd) { return null; } #endregion #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) /// /// Returns the responsible for binding operations performed on this object. /// /// The expression tree representation of the runtime value. /// /// The to bind this object. /// protected override DynamicMetaObject GetMetaObject(Expression parameter) { return new DynamicProxyMetaObject(parameter, this, new JObjectDynamicProxy(), true); } private class JObjectDynamicProxy : DynamicProxy { public override bool TryGetMember(JObject instance, GetMemberBinder binder, out object result) { // result can be null result = instance[binder.Name]; return true; } public override bool TrySetMember(JObject instance, SetMemberBinder binder, object value) { JToken v = value as JToken; // this can throw an error if value isn't a valid for a JValue if (v == null) v = new JValue(value); instance[binder.Name] = v; return true; } public override IEnumerable GetDynamicMemberNames(JObject instance) { return instance.Properties().Select(p => p.Name); } } #endif } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JArray.cs0000644000175000017500000003055712253423361025404 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Utilities; using System.IO; using System.Globalization; namespace Newtonsoft.Json.Linq { /// /// Represents a JSON array. /// /// /// /// public class JArray : JContainer, IList { private readonly IList _values = new List(); /// /// Gets the container's children tokens. /// /// The container's children tokens. protected override IList ChildrenTokens { get { return _values; } } /// /// Gets the node type for this . /// /// The type. public override JTokenType Type { get { return JTokenType.Array; } } /// /// Initializes a new instance of the class. /// public JArray() { } /// /// Initializes a new instance of the class from another object. /// /// A object to copy from. public JArray(JArray other) : base(other) { } /// /// Initializes a new instance of the class with the specified content. /// /// The contents of the array. public JArray(params object[] content) : this((object)content) { } /// /// Initializes a new instance of the class with the specified content. /// /// The contents of the array. public JArray(object content) { Add(content); } internal override bool DeepEquals(JToken node) { JArray t = node as JArray; return (t != null && ContentsEqual(t)); } internal override JToken CloneToken() { return new JArray(this); } /// /// Loads an from a . /// /// A that will be read for the content of the . /// A that contains the JSON that was read from the specified . public static new JArray Load(JsonReader reader) { if (reader.TokenType == JsonToken.None) { if (!reader.Read()) throw JsonReaderException.Create(reader, "Error reading JArray from JsonReader."); } while (reader.TokenType == JsonToken.Comment) { reader.Read(); } if (reader.TokenType != JsonToken.StartArray) throw JsonReaderException.Create(reader, "Error reading JArray from JsonReader. Current JsonReader item is not an array: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); JArray a = new JArray(); a.SetLineInfo(reader as IJsonLineInfo); a.ReadTokenFrom(reader); return a; } /// /// Load a from a string that contains JSON. /// /// A that contains JSON. /// A populated from the string that contains JSON. /// /// /// public static new JArray Parse(string json) { JsonReader reader = new JsonTextReader(new StringReader(json)); JArray a = Load(reader); if (reader.Read() && reader.TokenType != JsonToken.Comment) throw JsonReaderException.Create(reader, "Additional text found in JSON string after parsing content."); return a; } /// /// Creates a from an object. /// /// The object that will be used to create . /// A with the values of the specified object public static new JArray FromObject(object o) { return FromObject(o, new JsonSerializer()); } /// /// Creates a from an object. /// /// The object that will be used to create . /// The that will be used to read the object. /// A with the values of the specified object public static new JArray FromObject(object o, JsonSerializer jsonSerializer) { JToken token = FromObjectInternal(o, jsonSerializer); if (token.Type != JTokenType.Array) throw new ArgumentException("Object serialized to {0}. JArray instance expected.".FormatWith(CultureInfo.InvariantCulture, token.Type)); return (JArray)token; } /// /// Writes this token to a . /// /// A into which this method will write. /// A collection of which will be used when writing the token. public override void WriteTo(JsonWriter writer, params JsonConverter[] converters) { writer.WriteStartArray(); foreach (JToken token in ChildrenTokens) { token.WriteTo(writer, converters); } writer.WriteEndArray(); } /// /// Gets the with the specified key. /// /// The with the specified key. public override JToken this[object key] { get { ValidationUtils.ArgumentNotNull(key, "o"); if (!(key is int)) throw new ArgumentException("Accessed JArray values with invalid key value: {0}. Array position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); return GetItem((int)key); } set { ValidationUtils.ArgumentNotNull(key, "o"); if (!(key is int)) throw new ArgumentException("Set JArray values with invalid key value: {0}. Array position index expected.".FormatWith(CultureInfo.InvariantCulture, MiscellaneousUtils.ToString(key))); SetItem((int)key, value); } } /// /// Gets or sets the at the specified index. /// /// public JToken this[int index] { get { return GetItem(index); } set { SetItem(index, value); } } #region IList Members /// /// Determines the index of a specific item in the . /// /// The object to locate in the . /// /// The index of if found in the list; otherwise, -1. /// public int IndexOf(JToken item) { return IndexOfItem(item); } /// /// Inserts an item to the at the specified index. /// /// The zero-based index at which should be inserted. /// The object to insert into the . /// /// is not a valid index in the . /// The is read-only. public void Insert(int index, JToken item) { InsertItem(index, item, false); } /// /// Removes the item at the specified index. /// /// The zero-based index of the item to remove. /// /// is not a valid index in the . /// The is read-only. public void RemoveAt(int index) { RemoveItemAt(index); } #endregion #region ICollection Members /// /// Adds an item to the . /// /// The object to add to the . /// The is read-only. public void Add(JToken item) { Add((object)item); } /// /// Removes all items from the . /// /// The is read-only. public void Clear() { ClearItems(); } /// /// Determines whether the contains a specific value. /// /// The object to locate in the . /// /// true if is found in the ; otherwise, false. /// public bool Contains(JToken item) { return ContainsItem(item); } void ICollection.CopyTo(JToken[] array, int arrayIndex) { CopyItemsTo(array, arrayIndex); } bool ICollection.IsReadOnly { get { return false; } } /// /// Removes the first occurrence of a specific object from the . /// /// The object to remove from the . /// /// true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . /// /// The is read-only. public bool Remove(JToken item) { return RemoveItem(item); } #endregion internal override int GetDeepHashCode() { return ContentsHashCode(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Linq/JRaw.cs0000644000175000017500000000475612253423361025061 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Globalization; using System.IO; namespace Newtonsoft.Json.Linq { /// /// Represents a raw JSON string. /// public class JRaw : JValue { /// /// Initializes a new instance of the class from another object. /// /// A object to copy from. public JRaw(JRaw other) : base(other) { } /// /// Initializes a new instance of the class. /// /// The raw json. public JRaw(object rawJson) : base(rawJson, JTokenType.Raw) { } /// /// Creates an instance of with the content of the reader's current token. /// /// The reader. /// An instance of with the content of the reader's current token. public static JRaw Create(JsonReader reader) { using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) { jsonWriter.WriteToken(reader); return new JRaw(sw.ToString()); } } internal override JToken CloneToken() { return new JRaw(this); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonException.cs0000644000175000017500000001037412253423361026074 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.Runtime.Serialization; using System.Text; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json { /// /// The exception thrown when an error occurs during Json serialization or deserialization. /// #if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE) [Serializable] #endif public class JsonException : Exception { /// /// Initializes a new instance of the class. /// public JsonException() { } /// /// Initializes a new instance of the class /// with a specified error message. /// /// The error message that explains the reason for the exception. public JsonException(string message) : base(message) { } /// /// Initializes a new instance of the class /// with a specified error message and a reference to the inner exception that is the cause of this exception. /// /// The error message that explains the reason for the exception. /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. public JsonException(string message, Exception innerException) : base(message, innerException) { } #if !(WINDOWS_PHONE || SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is null. /// The class name is null or is zero (0). public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif internal static string FormatExceptionMessage(IJsonLineInfo lineInfo, string path, string message) { // don't add a fullstop and space when message ends with a new line if (!message.EndsWith(Environment.NewLine)) { message = message.Trim(); if (!message.EndsWith(".")) message += "."; message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); message += "."; return message; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/0000755000175000017500000000000012253423361024723 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/TypeExtensions.cs0000644000175000017500000004160312253423361030257 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Reflection; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Utilities { internal static class TypeExtensions { #if NETFX_CORE private static BindingFlags DefaultFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; public static MethodInfo GetGetMethod(this PropertyInfo propertyInfo) { return propertyInfo.GetGetMethod(false); } public static MethodInfo GetGetMethod(this PropertyInfo propertyInfo, bool nonPublic) { MethodInfo getMethod = propertyInfo.GetMethod; if (getMethod != null && (getMethod.IsPublic || nonPublic)) return getMethod; return null; } public static MethodInfo GetSetMethod(this PropertyInfo propertyInfo) { return propertyInfo.GetSetMethod(false); } public static MethodInfo GetSetMethod(this PropertyInfo propertyInfo, bool nonPublic) { MethodInfo setMethod = propertyInfo.SetMethod; if (setMethod != null && (setMethod.IsPublic || nonPublic)) return setMethod; return null; } public static bool IsSubclassOf(this Type type, Type c) { return type.GetTypeInfo().IsSubclassOf(c); } public static bool IsAssignableFrom(this Type type, Type c) { return type.GetTypeInfo().IsAssignableFrom(c.GetTypeInfo()); } #endif public static MemberTypes MemberType(this MemberInfo memberInfo) { #if !(NETFX_CORE || PORTABLE) return memberInfo.MemberType; #else if (memberInfo is PropertyInfo) return MemberTypes.Property; else if (memberInfo is FieldInfo) return MemberTypes.Field; else if (memberInfo is EventInfo) return MemberTypes.Event; else if (memberInfo is MethodInfo) return MemberTypes.Method; else return MemberTypes.Other; #endif } public static bool ContainsGenericParameters(this Type type) { #if !NETFX_CORE return type.ContainsGenericParameters; #else return type.GetTypeInfo().ContainsGenericParameters; #endif } public static bool IsInterface(this Type type) { #if !NETFX_CORE return type.IsInterface; #else return type.GetTypeInfo().IsInterface; #endif } public static bool IsGenericType(this Type type) { #if !NETFX_CORE return type.IsGenericType; #else return type.GetTypeInfo().IsGenericType; #endif } public static bool IsGenericTypeDefinition(this Type type) { #if !NETFX_CORE return type.IsGenericTypeDefinition; #else return type.GetTypeInfo().IsGenericTypeDefinition; #endif } public static Type BaseType(this Type type) { #if !NETFX_CORE return type.BaseType; #else return type.GetTypeInfo().BaseType; #endif } public static bool IsEnum(this Type type) { #if !NETFX_CORE return type.IsEnum; #else return type.GetTypeInfo().IsEnum; #endif } public static bool IsClass(this Type type) { #if !NETFX_CORE return type.IsClass; #else return type.GetTypeInfo().IsClass; #endif } public static bool IsSealed(this Type type) { #if !NETFX_CORE return type.IsSealed; #else return type.GetTypeInfo().IsSealed; #endif } #if PORTABLE public static PropertyInfo GetProperty(this Type type, string name, BindingFlags bindingFlags, object placeholder1, Type propertyType, IList indexParameters, object placeholder2) { IList propertyInfos = type.GetProperties(bindingFlags); return propertyInfos.Where(p => { if (name != null && name != p.Name) return false; if (propertyType != null && propertyType != p.PropertyType) return false; if (indexParameters != null) { if (!p.GetIndexParameters().Select(ip => ip.ParameterType).SequenceEqual(indexParameters)) return false; } return true; }).SingleOrDefault(); } public static IEnumerable GetMember(this Type type, string name, MemberTypes memberType, BindingFlags bindingFlags) { return type.GetMembers(bindingFlags).Where(m => { if (name != null && name != m.Name) return false; if (m.MemberType() != memberType) return false; return true; }); } #endif #if NETFX_CORE public static bool IsDefined(this Type type, Type attributeType, bool inherit) { return type.GetTypeInfo().CustomAttributes.Any(a => a.AttributeType == attributeType); } public static MethodInfo GetMethod(this Type type, string name) { return type.GetMethod(name, DefaultFlags); } public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags) { return type.GetTypeInfo().GetDeclaredMethod(name); } public static MethodInfo GetMethod(this Type type, IList parameterTypes) { return type.GetMethod(null, parameterTypes); } public static MethodInfo GetMethod(this Type type, string name, IList parameterTypes) { return type.GetMethod(name, DefaultFlags, null, parameterTypes, null); } public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags, object placeHolder1, IList parameterTypes, object placeHolder2) { return type.GetTypeInfo().DeclaredMethods.Where(m => { if (name != null && m.Name != name) return false; if (!TestAccessibility(m, bindingFlags)) return false; return m.GetParameters().Select(p => p.ParameterType).SequenceEqual(parameterTypes); }).SingleOrDefault(); } public static PropertyInfo GetProperty(this Type type, string name, BindingFlags bindingFlags, object placeholder1, Type propertyType, IList indexParameters, object placeholder2) { return type.GetTypeInfo().DeclaredProperties.Where(p => { if (name != null && name != p.Name) return false; if (propertyType != null && propertyType != p.PropertyType) return false; if (indexParameters != null) { if (!p.GetIndexParameters().Select(ip => ip.ParameterType).SequenceEqual(indexParameters)) return false; } return true; }).SingleOrDefault(); } public static IEnumerable GetMember(this Type type, string name, MemberTypes memberType, BindingFlags bindingFlags) { return type.GetTypeInfo().GetMembersRecursive().Where(m => { if (name != null && name != m.Name) return false; if (m.MemberType() != memberType) return false; if (!TestAccessibility(m, bindingFlags)) return false; return true; }); } public static IEnumerable GetConstructors(this Type type) { return type.GetConstructors(DefaultFlags); } public static IEnumerable GetConstructors(this Type type, BindingFlags bindingFlags) { return type.GetConstructors(bindingFlags, null); } private static IEnumerable GetConstructors(this Type type, BindingFlags bindingFlags, IList parameterTypes) { return type.GetTypeInfo().DeclaredConstructors.Where(c => { if (!TestAccessibility(c, bindingFlags)) return false; if (parameterTypes != null && !c.GetParameters().Select(p => p.ParameterType).SequenceEqual(parameterTypes)) return false; return true; }); } public static ConstructorInfo GetConstructor(this Type type, IList parameterTypes) { return type.GetConstructor(DefaultFlags, null, parameterTypes, null); } public static ConstructorInfo GetConstructor(this Type type, BindingFlags bindingFlags, object placeholder1, IList parameterTypes, object placeholder2) { return type.GetConstructors(bindingFlags, parameterTypes).SingleOrDefault(); } public static MemberInfo[] GetMember(this Type type, string member) { return type.GetMember(member, DefaultFlags); } public static MemberInfo[] GetMember(this Type type, string member, BindingFlags bindingFlags) { return type.GetTypeInfo().GetMembersRecursive().Where(m => m.Name == member && TestAccessibility(m, bindingFlags)).ToArray(); } public static MemberInfo GetField(this Type type, string member) { return type.GetField(member, DefaultFlags); } public static MemberInfo GetField(this Type type, string member, BindingFlags bindingFlags) { return type.GetTypeInfo().GetDeclaredField(member); } public static IEnumerable GetProperties(this Type type, BindingFlags bindingFlags) { return type.GetTypeInfo().GetPropertiesRecursive().Where(p => TestAccessibility(p, bindingFlags)); } private static IList GetMembersRecursive(this TypeInfo type) { TypeInfo t = type; IList members = new List(); while (t != null) { foreach (var member in t.DeclaredMembers) { if (!members.Any(p => p.Name == member.Name)) members.Add(member); } t = (t.BaseType != null) ? t.BaseType.GetTypeInfo() : null; } return members; } private static IList GetPropertiesRecursive(this TypeInfo type) { TypeInfo t = type; IList properties = new List(); while (t != null) { foreach (var member in t.DeclaredProperties) { if (!properties.Any(p => p.Name == member.Name)) properties.Add(member); } t = (t.BaseType != null) ? t.BaseType.GetTypeInfo() : null; } return properties; } private static IList GetFieldsRecursive(this TypeInfo type) { TypeInfo t = type; IList fields = new List(); while (t != null) { foreach (var member in t.DeclaredFields) { if (!fields.Any(p => p.Name == member.Name)) fields.Add(member); } t = (t.BaseType != null) ? t.BaseType.GetTypeInfo() : null; } return fields; } public static IEnumerable GetMethods(this Type type, BindingFlags bindingFlags) { return type.GetTypeInfo().DeclaredMethods; } public static PropertyInfo GetProperty(this Type type, string name) { return type.GetProperty(name, DefaultFlags); } public static PropertyInfo GetProperty(this Type type, string name, BindingFlags bindingFlags) { return type.GetTypeInfo().GetDeclaredProperty(name); } public static IEnumerable GetFields(this Type type) { return type.GetFields(DefaultFlags); } public static IEnumerable GetFields(this Type type, BindingFlags bindingFlags) { return type.GetTypeInfo().GetFieldsRecursive().Where(f => TestAccessibility(f, bindingFlags)).ToList(); } private static bool TestAccessibility(PropertyInfo member, BindingFlags bindingFlags) { if (member.GetMethod != null && TestAccessibility(member.GetMethod, bindingFlags)) return true; if (member.SetMethod != null && TestAccessibility(member.SetMethod, bindingFlags)) return true; return false; } private static bool TestAccessibility(MemberInfo member, BindingFlags bindingFlags) { if (member is FieldInfo) { return TestAccessibility((FieldInfo)member, bindingFlags); } else if (member is MethodBase) { return TestAccessibility((MethodBase)member, bindingFlags); } else if (member is PropertyInfo) { return TestAccessibility((PropertyInfo)member, bindingFlags); } throw new Exception("Unexpected member type."); } private static bool TestAccessibility(FieldInfo member, BindingFlags bindingFlags) { bool visibility = (member.IsPublic && bindingFlags.HasFlag(BindingFlags.Public)) || (!member.IsPublic && bindingFlags.HasFlag(BindingFlags.NonPublic)); bool instance = (member.IsStatic && bindingFlags.HasFlag(BindingFlags.Static)) || (!member.IsStatic && bindingFlags.HasFlag(BindingFlags.Instance)); return visibility && instance; } private static bool TestAccessibility(MethodBase member, BindingFlags bindingFlags) { bool visibility = (member.IsPublic && bindingFlags.HasFlag(BindingFlags.Public)) || (!member.IsPublic && bindingFlags.HasFlag(BindingFlags.NonPublic)); bool instance = (member.IsStatic && bindingFlags.HasFlag(BindingFlags.Static)) || (!member.IsStatic && bindingFlags.HasFlag(BindingFlags.Instance)); return visibility && instance; } public static Type[] GetGenericArguments(this Type type) { return type.GetTypeInfo().GenericTypeArguments; } public static IEnumerable GetInterfaces(this Type type) { return type.GetTypeInfo().ImplementedInterfaces; } public static IEnumerable GetMethods(this Type type) { return type.GetTypeInfo().DeclaredMethods; } #endif public static bool IsAbstract(this Type type) { #if !NETFX_CORE return type.IsAbstract; #else return type.GetTypeInfo().IsAbstract; #endif } public static bool IsVisible(this Type type) { #if !NETFX_CORE return type.IsVisible; #else return type.GetTypeInfo().IsVisible; #endif } public static bool IsValueType(this Type type) { #if !NETFX_CORE return type.IsValueType; #else return type.GetTypeInfo().IsValueType; #endif } public static bool AssignableToTypeName(this Type type, string fullTypeName, out Type match) { Type current = type; while (current != null) { if (string.Equals(current.FullName, fullTypeName, StringComparison.Ordinal)) { match = current; return true; } current = current.BaseType(); } foreach (Type i in type.GetInterfaces()) { if (string.Equals(i.Name, fullTypeName, StringComparison.Ordinal)) { match = type; return true; } } match = null; return false; } public static bool AssignableToTypeName(this Type type, string fullTypeName) { Type match; return type.AssignableToTypeName(fullTypeName, out match); } public static MethodInfo GetGenericMethod(this Type type, string name, params Type[] parameterTypes) { var methods = type.GetMethods().Where(method => method.Name == name); foreach (var method in methods) { if (method.HasParameters(parameterTypes)) return method; } return null; } public static bool HasParameters(this MethodInfo method, params Type[] parameterTypes) { var methodParameters = method.GetParameters().Select(parameter => parameter.ParameterType).ToArray(); if (methodParameters.Length != parameterTypes.Length) return false; for (int i = 0; i < methodParameters.Length; i++) if (methodParameters[i].ToString() != parameterTypes[i].ToString()) return false; return true; } public static IEnumerable GetAllInterfaces(this Type target) { foreach (var i in target.GetInterfaces()) { yield return i; foreach (var ci in i.GetInterfaces()) { yield return ci; } } } public static IEnumerable GetAllMethods(this Type target) { var allTypes = target.GetAllInterfaces().ToList(); allTypes.Add(target); return from type in allTypes from method in type.GetMethods() select method; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/LinqBridge.cs0000644000175000017500000025334512253423361027306 0ustar00meebeymeebey00000000000000#if NET20 #region License, Terms and Author(s) // // LINQBridge // Copyright (c) 2007-9 Atif Aziz, Joseph Albahari. All rights reserved. // // Author(s): // // Atif Aziz, http://www.raboof.com // // This library is free software; you can redistribute it and/or modify it // under the terms of the New BSD License, a copy of which should have // been delivered along with this distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #endregion using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Utilities.LinqBridge { /// /// Provides a set of static (Shared in Visual Basic) methods for /// querying objects that implement . /// internal static partial class Enumerable { /// /// Returns the input typed as . /// public static IEnumerable AsEnumerable(IEnumerable source) { return source; } /// /// Returns an empty that has the /// specified type argument. /// public static IEnumerable Empty() { return Sequence.Empty; } /// /// Converts the elements of an to the /// specified type. /// public static IEnumerable Cast( this IEnumerable source) { CheckNotNull(source, "source"); return CastYield(source); } private static IEnumerable CastYield( IEnumerable source) { foreach (var item in source) yield return (TResult) item; } /// /// Filters the elements of an based on a specified type. /// public static IEnumerable OfType( this IEnumerable source) { CheckNotNull(source, "source"); return OfTypeYield(source); } private static IEnumerable OfTypeYield( IEnumerable source) { foreach (var item in source) if (item is TResult) yield return (TResult) item; } /// /// Generates a sequence of integral numbers within a specified range. /// /// The value of the first integer in the sequence. /// The number of sequential integers to generate. public static IEnumerable Range(int start, int count) { if (count < 0) throw new ArgumentOutOfRangeException("count", count, null); var end = (long) start + count; if (end - 1 >= int.MaxValue) throw new ArgumentOutOfRangeException("count", count, null); return RangeYield(start, end); } private static IEnumerable RangeYield(int start, long end) { for (var i = start; i < end; i++) yield return i; } /// /// Generates a sequence that contains one repeated value. /// public static IEnumerable Repeat(TResult element, int count) { if (count < 0) throw new ArgumentOutOfRangeException("count", count, null); return RepeatYield(element, count); } private static IEnumerable RepeatYield(TResult element, int count) { for (var i = 0; i < count; i++) yield return element; } /// /// Filters a sequence of values based on a predicate. /// public static IEnumerable Where( this IEnumerable source, Func predicate) { CheckNotNull(predicate, "predicate"); return source.Where((item, i) => predicate(item)); } /// /// Filters a sequence of values based on a predicate. /// Each element's index is used in the logic of the predicate function. /// public static IEnumerable Where( this IEnumerable source, Func predicate) { CheckNotNull(source, "source"); CheckNotNull(predicate, "predicate"); return WhereYield(source, predicate); } private static IEnumerable WhereYield( IEnumerable source, Func predicate) { var i = 0; foreach (var item in source) if (predicate(item, i++)) yield return item; } /// /// Projects each element of a sequence into a new form. /// public static IEnumerable Select( this IEnumerable source, Func selector) { CheckNotNull(selector, "selector"); return source.Select((item, i) => selector(item)); } /// /// Projects each element of a sequence into a new form by /// incorporating the element's index. /// public static IEnumerable Select( this IEnumerable source, Func selector) { CheckNotNull(source, "source"); CheckNotNull(selector, "selector"); return SelectYield(source, selector); } private static IEnumerable SelectYield( IEnumerable source, Func selector) { var i = 0; foreach (var item in source) yield return selector(item, i++); } /// /// Projects each element of a sequence to an /// and flattens the resulting sequences into one sequence. /// public static IEnumerable SelectMany( this IEnumerable source, Func> selector) { CheckNotNull(selector, "selector"); return source.SelectMany((item, i) => selector(item)); } /// /// Projects each element of a sequence to an , /// and flattens the resulting sequences into one sequence. The /// index of each source element is used in the projected form of /// that element. /// public static IEnumerable SelectMany( this IEnumerable source, Func> selector) { CheckNotNull(selector, "selector"); return source.SelectMany(selector, (item, subitem) => subitem); } /// /// Projects each element of a sequence to an , /// flattens the resulting sequences into one sequence, and invokes /// a result selector function on each element therein. /// public static IEnumerable SelectMany( this IEnumerable source, Func> collectionSelector, Func resultSelector) { CheckNotNull(collectionSelector, "collectionSelector"); return source.SelectMany((item, i) => collectionSelector(item), resultSelector); } /// /// Projects each element of a sequence to an , /// flattens the resulting sequences into one sequence, and invokes /// a result selector function on each element therein. The index of /// each source element is used in the intermediate projected form /// of that element. /// public static IEnumerable SelectMany( this IEnumerable source, Func> collectionSelector, Func resultSelector) { CheckNotNull(source, "source"); CheckNotNull(collectionSelector, "collectionSelector"); CheckNotNull(resultSelector, "resultSelector"); return SelectManyYield(source, collectionSelector, resultSelector); } private static IEnumerable SelectManyYield( this IEnumerable source, Func> collectionSelector, Func resultSelector) { var i = 0; foreach (var item in source) foreach (var subitem in collectionSelector(item, i++)) yield return resultSelector(item, subitem); } /// /// Returns elements from a sequence as long as a specified condition is true. /// public static IEnumerable TakeWhile( this IEnumerable source, Func predicate) { CheckNotNull(predicate, "predicate"); return source.TakeWhile((item, i) => predicate(item)); } /// /// Returns elements from a sequence as long as a specified condition is true. /// The element's index is used in the logic of the predicate function. /// public static IEnumerable TakeWhile( this IEnumerable source, Func predicate) { CheckNotNull(source, "source"); CheckNotNull(predicate, "predicate"); return TakeWhileYield(source, predicate); } private static IEnumerable TakeWhileYield( this IEnumerable source, Func predicate) { var i = 0; foreach (var item in source) if (predicate(item, i++)) yield return item; else break; } private static class Futures { public static readonly Func Default = () => default(T); public static readonly Func Undefined = () => { throw new InvalidOperationException(); }; } /// /// Base implementation of First operator. /// private static TSource FirstImpl( this IEnumerable source, Func empty) { CheckNotNull(source, "source"); Debug.Assert(empty != null); var list = source as IList; // optimized case for lists if (list != null) return list.Count > 0 ? list[0] : empty(); using (var e = source.GetEnumerator()) // fallback for enumeration return e.MoveNext() ? e.Current : empty(); } /// /// Returns the first element of a sequence. /// public static TSource First( this IEnumerable source) { return source.FirstImpl(Futures.Undefined); } /// /// Returns the first element in a sequence that satisfies a specified condition. /// public static TSource First( this IEnumerable source, Func predicate) { return First(source.Where(predicate)); } /// /// Returns the first element of a sequence, or a default value if /// the sequence contains no elements. /// public static TSource FirstOrDefault( this IEnumerable source) { return source.FirstImpl(Futures.Default); } /// /// Returns the first element of the sequence that satisfies a /// condition or a default value if no such element is found. /// public static TSource FirstOrDefault( this IEnumerable source, Func predicate) { return FirstOrDefault(source.Where(predicate)); } /// /// Base implementation of Last operator. /// private static TSource LastImpl( this IEnumerable source, Func empty) { CheckNotNull(source, "source"); var list = source as IList; // optimized case for lists if (list != null) return list.Count > 0 ? list[list.Count - 1] : empty(); using (var e = source.GetEnumerator()) { if (!e.MoveNext()) return empty(); var last = e.Current; while (e.MoveNext()) last = e.Current; return last; } } /// /// Returns the last element of a sequence. /// public static TSource Last( this IEnumerable source) { return source.LastImpl(Futures.Undefined); } /// /// Returns the last element of a sequence that satisfies a /// specified condition. /// public static TSource Last( this IEnumerable source, Func predicate) { return Last(source.Where(predicate)); } /// /// Returns the last element of a sequence, or a default value if /// the sequence contains no elements. /// public static TSource LastOrDefault( this IEnumerable source) { return source.LastImpl(Futures.Default); } /// /// Returns the last element of a sequence that satisfies a /// condition or a default value if no such element is found. /// public static TSource LastOrDefault( this IEnumerable source, Func predicate) { return LastOrDefault(source.Where(predicate)); } /// /// Base implementation of Single operator. /// private static TSource SingleImpl( this IEnumerable source, Func empty) { CheckNotNull(source, "source"); using (var e = source.GetEnumerator()) { if (e.MoveNext()) { var single = e.Current; if (!e.MoveNext()) return single; throw new InvalidOperationException(); } return empty(); } } /// /// Returns the only element of a sequence, and throws an exception /// if there is not exactly one element in the sequence. /// public static TSource Single( this IEnumerable source) { return source.SingleImpl(Futures.Undefined); } /// /// Returns the only element of a sequence that satisfies a /// specified condition, and throws an exception if more than one /// such element exists. /// public static TSource Single( this IEnumerable source, Func predicate) { return Single(source.Where(predicate)); } /// /// Returns the only element of a sequence, or a default value if /// the sequence is empty; this method throws an exception if there /// is more than one element in the sequence. /// public static TSource SingleOrDefault( this IEnumerable source) { return source.SingleImpl(Futures.Default); } /// /// Returns the only element of a sequence that satisfies a /// specified condition or a default value if no such element /// exists; this method throws an exception if more than one element /// satisfies the condition. /// public static TSource SingleOrDefault( this IEnumerable source, Func predicate) { return SingleOrDefault(source.Where(predicate)); } /// /// Returns the element at a specified index in a sequence. /// public static TSource ElementAt( this IEnumerable source, int index) { CheckNotNull(source, "source"); if (index < 0) throw new ArgumentOutOfRangeException("index", index, null); var list = source as IList; if (list != null) return list[index]; try { return source.SkipWhile((item, i) => i < index).First(); } catch (InvalidOperationException) // if thrown by First { throw new ArgumentOutOfRangeException("index", index, null); } } /// /// Returns the element at a specified index in a sequence or a /// default value if the index is out of range. /// public static TSource ElementAtOrDefault( this IEnumerable source, int index) { CheckNotNull(source, "source"); if (index < 0) return default(TSource); var list = source as IList; if (list != null) return index < list.Count ? list[index] : default(TSource); return source.SkipWhile((item, i) => i < index).FirstOrDefault(); } /// /// Inverts the order of the elements in a sequence. /// public static IEnumerable Reverse( this IEnumerable source) { CheckNotNull(source, "source"); return ReverseYield(source); } private static IEnumerable ReverseYield(IEnumerable source) { var stack = new Stack(); foreach (var item in source) stack.Push(item); foreach (var item in stack) yield return item; } /// /// Returns a specified number of contiguous elements from the start /// of a sequence. /// public static IEnumerable Take( this IEnumerable source, int count) { return source.Where((item, i) => i < count); } /// /// Bypasses a specified number of elements in a sequence and then /// returns the remaining elements. /// public static IEnumerable Skip( this IEnumerable source, int count) { return source.Where((item, i) => i >= count); } /// /// Bypasses elements in a sequence as long as a specified condition /// is true and then returns the remaining elements. /// public static IEnumerable SkipWhile( this IEnumerable source, Func predicate) { CheckNotNull(predicate, "predicate"); return source.SkipWhile((item, i) => predicate(item)); } /// /// Bypasses elements in a sequence as long as a specified condition /// is true and then returns the remaining elements. The element's /// index is used in the logic of the predicate function. /// public static IEnumerable SkipWhile( this IEnumerable source, Func predicate) { CheckNotNull(source, "source"); CheckNotNull(predicate, "predicate"); return SkipWhileYield(source, predicate); } private static IEnumerable SkipWhileYield( IEnumerable source, Func predicate) { using (var e = source.GetEnumerator()) { for (var i = 0;; i++) { if (!e.MoveNext()) yield break; if (!predicate(e.Current, i)) break; } do { yield return e.Current; } while (e.MoveNext()); } } /// /// Returns the number of elements in a sequence. /// public static int Count( this IEnumerable source) { CheckNotNull(source, "source"); var collection = source as ICollection; return collection != null ? collection.Count : source.Aggregate(0, (count, item) => checked(count + 1)); } /// /// Returns a number that represents how many elements in the /// specified sequence satisfy a condition. /// public static int Count( this IEnumerable source, Func predicate) { return Count(source.Where(predicate)); } /// /// Returns an that represents the total number /// of elements in a sequence. /// public static long LongCount( this IEnumerable source) { CheckNotNull(source, "source"); var array = source as Array; return array != null ? array.LongLength : source.Aggregate(0L, (count, item) => count + 1); } /// /// Returns an that represents how many elements /// in a sequence satisfy a condition. /// public static long LongCount( this IEnumerable source, Func predicate) { return LongCount(source.Where(predicate)); } /// /// Concatenates two sequences. /// public static IEnumerable Concat( this IEnumerable first, IEnumerable second) { CheckNotNull(first, "first"); CheckNotNull(second, "second"); return ConcatYield(first, second); } private static IEnumerable ConcatYield( IEnumerable first, IEnumerable second) { foreach (var item in first) yield return item; foreach (var item in second) yield return item; } /// /// Creates a from an . /// public static List ToList( this IEnumerable source) { CheckNotNull(source, "source"); return new List(source); } /// /// Creates an array from an . /// public static TSource[] ToArray( this IEnumerable source) { return source.ToList().ToArray(); } /// /// Returns distinct elements from a sequence by using the default /// equality comparer to compare values. /// public static IEnumerable Distinct( this IEnumerable source) { return Distinct(source, /* comparer */ null); } /// /// Returns distinct elements from a sequence by using a specified /// to compare values. /// public static IEnumerable Distinct( this IEnumerable source, IEqualityComparer comparer) { CheckNotNull(source, "source"); return DistinctYield(source, comparer); } private static IEnumerable DistinctYield( IEnumerable source, IEqualityComparer comparer) { var set = new Dictionary(comparer); var gotNull = false; foreach (var item in source) { if (item == null) { if (gotNull) continue; gotNull = true; } else { if (set.ContainsKey(item)) continue; set.Add(item, null); } yield return item; } } /// /// Creates a from an /// according to a specified key /// selector function. /// public static ILookup ToLookup( this IEnumerable source, Func keySelector) { return ToLookup(source, keySelector, e => e, /* comparer */ null); } /// /// Creates a from an /// according to a specified key /// selector function and a key comparer. /// public static ILookup ToLookup( this IEnumerable source, Func keySelector, IEqualityComparer comparer) { return ToLookup(source, keySelector, e => e, comparer); } /// /// Creates a from an /// according to specified key /// and element selector functions. /// public static ILookup ToLookup( this IEnumerable source, Func keySelector, Func elementSelector) { return ToLookup(source, keySelector, elementSelector, /* comparer */ null); } /// /// Creates a from an /// according to a specified key /// selector function, a comparer and an element selector function. /// public static ILookup ToLookup( this IEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(keySelector, "keySelector"); CheckNotNull(elementSelector, "elementSelector"); var lookup = new Lookup(comparer); foreach (var item in source) { var key = keySelector(item); var grouping = (Grouping) lookup.Find(key); if (grouping == null) { grouping = new Grouping(key); lookup.Add(grouping); } grouping.Add(elementSelector(item)); } return lookup; } /// /// Groups the elements of a sequence according to a specified key /// selector function. /// public static IEnumerable> GroupBy( this IEnumerable source, Func keySelector) { return GroupBy(source, keySelector, /* comparer */ null); } /// /// Groups the elements of a sequence according to a specified key /// selector function and compares the keys by using a specified /// comparer. /// public static IEnumerable> GroupBy( this IEnumerable source, Func keySelector, IEqualityComparer comparer) { return GroupBy(source, keySelector, e => e, comparer); } /// /// Groups the elements of a sequence according to a specified key /// selector function and projects the elements for each group by /// using a specified function. /// public static IEnumerable> GroupBy( this IEnumerable source, Func keySelector, Func elementSelector) { return GroupBy(source, keySelector, elementSelector, /* comparer */ null); } /// /// Groups the elements of a sequence according to a specified key /// selector function and creates a result value from each group and /// its key. /// public static IEnumerable> GroupBy( this IEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(keySelector, "keySelector"); CheckNotNull(elementSelector, "elementSelector"); return ToLookup(source, keySelector, elementSelector, comparer); } /// /// Groups the elements of a sequence according to a key selector /// function. The keys are compared by using a comparer and each /// group's elements are projected by using a specified function. /// public static IEnumerable GroupBy( this IEnumerable source, Func keySelector, Func, TResult> resultSelector) { return GroupBy(source, keySelector, resultSelector, /* comparer */ null); } /// /// Groups the elements of a sequence according to a specified key /// selector function and creates a result value from each group and /// its key. The elements of each group are projected by using a /// specified function. /// public static IEnumerable GroupBy( this IEnumerable source, Func keySelector, Func, TResult> resultSelector, IEqualityComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(keySelector, "keySelector"); CheckNotNull(resultSelector, "resultSelector"); return ToLookup(source, keySelector, comparer).Select(g => resultSelector(g.Key, g)); } /// /// Groups the elements of a sequence according to a specified key /// selector function and creates a result value from each group and /// its key. The keys are compared by using a specified comparer. /// public static IEnumerable GroupBy( this IEnumerable source, Func keySelector, Func elementSelector, Func, TResult> resultSelector) { return GroupBy(source, keySelector, elementSelector, resultSelector, /* comparer */ null); } /// /// Groups the elements of a sequence according to a specified key /// selector function and creates a result value from each group and /// its key. Key values are compared by using a specified comparer, /// and the elements of each group are projected by using a /// specified function. /// public static IEnumerable GroupBy( this IEnumerable source, Func keySelector, Func elementSelector, Func, TResult> resultSelector, IEqualityComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(keySelector, "keySelector"); CheckNotNull(elementSelector, "elementSelector"); CheckNotNull(resultSelector, "resultSelector"); return ToLookup(source, keySelector, elementSelector, comparer) .Select(g => resultSelector(g.Key, g)); } /// /// Applies an accumulator function over a sequence. /// public static TSource Aggregate( this IEnumerable source, Func func) { CheckNotNull(source, "source"); CheckNotNull(func, "func"); using (var e = source.GetEnumerator()) { if (!e.MoveNext()) throw new InvalidOperationException(); return e.Renumerable().Skip(1).Aggregate(e.Current, func); } } /// /// Applies an accumulator function over a sequence. The specified /// seed value is used as the initial accumulator value. /// public static TAccumulate Aggregate( this IEnumerable source, TAccumulate seed, Func func) { return Aggregate(source, seed, func, r => r); } /// /// Applies an accumulator function over a sequence. The specified /// seed value is used as the initial accumulator value, and the /// specified function is used to select the result value. /// public static TResult Aggregate( this IEnumerable source, TAccumulate seed, Func func, Func resultSelector) { CheckNotNull(source, "source"); CheckNotNull(func, "func"); CheckNotNull(resultSelector, "resultSelector"); var result = seed; foreach (var item in source) result = func(result, item); return resultSelector(result); } /// /// Produces the set union of two sequences by using the default /// equality comparer. /// public static IEnumerable Union( this IEnumerable first, IEnumerable second) { return Union(first, second, /* comparer */ null); } /// /// Produces the set union of two sequences by using a specified /// . /// public static IEnumerable Union( this IEnumerable first, IEnumerable second, IEqualityComparer comparer) { return first.Concat(second).Distinct(comparer); } /// /// Returns the elements of the specified sequence or the type /// parameter's default value in a singleton collection if the /// sequence is empty. /// public static IEnumerable DefaultIfEmpty( this IEnumerable source) { return source.DefaultIfEmpty(default(TSource)); } /// /// Returns the elements of the specified sequence or the specified /// value in a singleton collection if the sequence is empty. /// public static IEnumerable DefaultIfEmpty( this IEnumerable source, TSource defaultValue) { CheckNotNull(source, "source"); return DefaultIfEmptyYield(source, defaultValue); } private static IEnumerable DefaultIfEmptyYield( IEnumerable source, TSource defaultValue) { using (var e = source.GetEnumerator()) { if (!e.MoveNext()) yield return defaultValue; else do { yield return e.Current; } while (e.MoveNext()); } } /// /// Determines whether all elements of a sequence satisfy a condition. /// public static bool All( this IEnumerable source, Func predicate) { CheckNotNull(source, "source"); CheckNotNull(predicate, "predicate"); foreach (var item in source) if (!predicate(item)) return false; return true; } /// /// Determines whether a sequence contains any elements. /// public static bool Any( this IEnumerable source) { CheckNotNull(source, "source"); using (var e = source.GetEnumerator()) return e.MoveNext(); } /// /// Determines whether any element of a sequence satisfies a /// condition. /// public static bool Any( this IEnumerable source, Func predicate) { return source.Where(predicate).Any(); } /// /// Determines whether a sequence contains a specified element by /// using the default equality comparer. /// public static bool Contains( this IEnumerable source, TSource value) { return source.Contains(value, /* comparer */ null); } /// /// Determines whether a sequence contains a specified element by /// using a specified . /// public static bool Contains( this IEnumerable source, TSource value, IEqualityComparer comparer) { CheckNotNull(source, "source"); if (comparer == null) { var collection = source as ICollection; if (collection != null) return collection.Contains(value); } comparer = comparer ?? EqualityComparer.Default; return source.Any(item => comparer.Equals(item, value)); } /// /// Determines whether two sequences are equal by comparing the /// elements by using the default equality comparer for their type. /// public static bool SequenceEqual( this IEnumerable first, IEnumerable second) { return first.SequenceEqual(second, /* comparer */ null); } /// /// Determines whether two sequences are equal by comparing their /// elements by using a specified . /// public static bool SequenceEqual( this IEnumerable first, IEnumerable second, IEqualityComparer comparer) { CheckNotNull(first, "frist"); CheckNotNull(second, "second"); comparer = comparer ?? EqualityComparer.Default; using (IEnumerator lhs = first.GetEnumerator(), rhs = second.GetEnumerator()) { do { if (!lhs.MoveNext()) return !rhs.MoveNext(); if (!rhs.MoveNext()) return false; } while (comparer.Equals(lhs.Current, rhs.Current)); } return false; } /// /// Base implementation for Min/Max operator. /// private static TSource MinMaxImpl( this IEnumerable source, Func lesser) { CheckNotNull(source, "source"); Debug.Assert(lesser != null); return source.Aggregate((a, item) => lesser(a, item) ? a : item); } /// /// Base implementation for Min/Max operator for nullable types. /// private static TSource? MinMaxImpl( this IEnumerable source, TSource? seed, Func lesser) where TSource : struct { CheckNotNull(source, "source"); Debug.Assert(lesser != null); return source.Aggregate(seed, (a, item) => lesser(a, item) ? a : item); // == MinMaxImpl(Repeat(null, 1).Concat(source), lesser); } /// /// Returns the minimum value in a generic sequence. /// public static TSource Min( this IEnumerable source) { var comparer = Comparer.Default; return source.MinMaxImpl((x, y) => comparer.Compare(x, y) < 0); } /// /// Invokes a transform function on each element of a generic /// sequence and returns the minimum resulting value. /// public static TResult Min( this IEnumerable source, Func selector) { return source.Select(selector).Min(); } /// /// Returns the maximum value in a generic sequence. /// public static TSource Max( this IEnumerable source) { var comparer = Comparer.Default; return source.MinMaxImpl((x, y) => comparer.Compare(x, y) > 0); } /// /// Invokes a transform function on each element of a generic /// sequence and returns the maximum resulting value. /// public static TResult Max( this IEnumerable source, Func selector) { return source.Select(selector).Max(); } /// /// Makes an enumerator seen as enumerable once more. /// /// /// The supplied enumerator must have been started. The first element /// returned is the element the enumerator was on when passed in. /// DO NOT use this method if the caller must be a generator. It is /// mostly safe among aggregate operations. /// private static IEnumerable Renumerable(this IEnumerator e) { Debug.Assert(e != null); do { yield return e.Current; } while (e.MoveNext()); } /// /// Sorts the elements of a sequence in ascending order according to a key. /// public static IOrderedEnumerable OrderBy( this IEnumerable source, Func keySelector) { return source.OrderBy(keySelector, /* comparer */ null); } /// /// Sorts the elements of a sequence in ascending order by using a /// specified comparer. /// public static IOrderedEnumerable OrderBy( this IEnumerable source, Func keySelector, IComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(keySelector, "keySelector"); return new OrderedEnumerable(source, keySelector, comparer, /* descending */ false); } /// /// Sorts the elements of a sequence in descending order according to a key. /// public static IOrderedEnumerable OrderByDescending( this IEnumerable source, Func keySelector) { return source.OrderByDescending(keySelector, /* comparer */ null); } /// /// Sorts the elements of a sequence in descending order by using a /// specified comparer. /// public static IOrderedEnumerable OrderByDescending( this IEnumerable source, Func keySelector, IComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(source, "keySelector"); return new OrderedEnumerable(source, keySelector, comparer, /* descending */ true); } /// /// Performs a subsequent ordering of the elements in a sequence in /// ascending order according to a key. /// public static IOrderedEnumerable ThenBy( this IOrderedEnumerable source, Func keySelector) { return source.ThenBy(keySelector, /* comparer */ null); } /// /// Performs a subsequent ordering of the elements in a sequence in /// ascending order by using a specified comparer. /// public static IOrderedEnumerable ThenBy( this IOrderedEnumerable source, Func keySelector, IComparer comparer) { CheckNotNull(source, "source"); return source.CreateOrderedEnumerable(keySelector, comparer, /* descending */ false); } /// /// Performs a subsequent ordering of the elements in a sequence in /// descending order, according to a key. /// public static IOrderedEnumerable ThenByDescending( this IOrderedEnumerable source, Func keySelector) { return source.ThenByDescending(keySelector, /* comparer */ null); } /// /// Performs a subsequent ordering of the elements in a sequence in /// descending order by using a specified comparer. /// public static IOrderedEnumerable ThenByDescending( this IOrderedEnumerable source, Func keySelector, IComparer comparer) { CheckNotNull(source, "source"); return source.CreateOrderedEnumerable(keySelector, comparer, /* descending */ true); } /// /// Base implementation for Intersect and Except operators. /// private static IEnumerable IntersectExceptImpl( this IEnumerable first, IEnumerable second, IEqualityComparer comparer, bool flag) { CheckNotNull(first, "first"); CheckNotNull(second, "second"); var keys = new List(); var flags = new Dictionary(comparer); foreach (var item in first.Where(k => !flags.ContainsKey(k))) { flags.Add(item, !flag); keys.Add(item); } foreach (var item in second.Where(flags.ContainsKey)) flags[item] = flag; // // As per docs, "the marked elements are yielded in the order in // which they were collected. // return keys.Where(item => flags[item]); } /// /// Produces the set intersection of two sequences by using the /// default equality comparer to compare values. /// public static IEnumerable Intersect( this IEnumerable first, IEnumerable second) { return first.Intersect(second, /* comparer */ null); } /// /// Produces the set intersection of two sequences by using the /// specified to compare values. /// public static IEnumerable Intersect( this IEnumerable first, IEnumerable second, IEqualityComparer comparer) { return IntersectExceptImpl(first, second, comparer, /* flag */ true); } /// /// Produces the set difference of two sequences by using the /// default equality comparer to compare values. /// public static IEnumerable Except( this IEnumerable first, IEnumerable second) { return first.Except(second, /* comparer */ null); } /// /// Produces the set difference of two sequences by using the /// specified to compare values. /// public static IEnumerable Except( this IEnumerable first, IEnumerable second, IEqualityComparer comparer) { return IntersectExceptImpl(first, second, comparer, /* flag */ false); } /// /// Creates a from an /// according to a specified key /// selector function. /// public static Dictionary ToDictionary( this IEnumerable source, Func keySelector) { return source.ToDictionary(keySelector, /* comparer */ null); } /// /// Creates a from an /// according to a specified key /// selector function and key comparer. /// public static Dictionary ToDictionary( this IEnumerable source, Func keySelector, IEqualityComparer comparer) { return source.ToDictionary(keySelector, e => e); } /// /// Creates a from an /// according to specified key /// selector and element selector functions. /// public static Dictionary ToDictionary( this IEnumerable source, Func keySelector, Func elementSelector) { return source.ToDictionary(keySelector, elementSelector, /* comparer */ null); } /// /// Creates a from an /// according to a specified key /// selector function, a comparer, and an element selector function. /// public static Dictionary ToDictionary( this IEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer comparer) { CheckNotNull(source, "source"); CheckNotNull(keySelector, "keySelector"); CheckNotNull(elementSelector, "elementSelector"); var dict = new Dictionary(comparer); foreach (var item in source) { // // ToDictionary is meant to throw ArgumentNullException if // keySelector produces a key that is null and // Argument exception if keySelector produces duplicate keys // for two elements. Incidentally, the doucmentation for // IDictionary.Add says that the Add method // throws the same exceptions under the same circumstances // so we don't need to do any additional checking or work // here and let the Add implementation do all the heavy // lifting. // dict.Add(keySelector(item), elementSelector(item)); } return dict; } /// /// Correlates the elements of two sequences based on matching keys. /// The default equality comparer is used to compare keys. /// public static IEnumerable Join( this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector) { return outer.Join(inner, outerKeySelector, innerKeySelector, resultSelector, /* comparer */ null); } /// /// Correlates the elements of two sequences based on matching keys. /// The default equality comparer is used to compare keys. A /// specified is used to compare keys. /// public static IEnumerable Join( this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector, IEqualityComparer comparer) { CheckNotNull(outer, "outer"); CheckNotNull(inner, "inner"); CheckNotNull(outerKeySelector, "outerKeySelector"); CheckNotNull(innerKeySelector, "innerKeySelector"); CheckNotNull(resultSelector, "resultSelector"); var lookup = inner.ToLookup(innerKeySelector, comparer); return from o in outer from i in lookup[outerKeySelector(o)] select resultSelector(o, i); } /// /// Correlates the elements of two sequences based on equality of /// keys and groups the results. The default equality comparer is /// used to compare keys. /// public static IEnumerable GroupJoin( this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector) { return outer.GroupJoin(inner, outerKeySelector, innerKeySelector, resultSelector, /* comparer */ null); } /// /// Correlates the elements of two sequences based on equality of /// keys and groups the results. The default equality comparer is /// used to compare keys. A specified /// is used to compare keys. /// public static IEnumerable GroupJoin( this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector, IEqualityComparer comparer) { CheckNotNull(outer, "outer"); CheckNotNull(inner, "inner"); CheckNotNull(outerKeySelector, "outerKeySelector"); CheckNotNull(innerKeySelector, "innerKeySelector"); CheckNotNull(resultSelector, "resultSelector"); var lookup = inner.ToLookup(innerKeySelector, comparer); return outer.Select(o => resultSelector(o, lookup[outerKeySelector(o)])); } [DebuggerStepThrough] private static void CheckNotNull(T value, string name) where T : class { if (value == null) throw new ArgumentNullException(name); } private static class Sequence { public static readonly IEnumerable Empty = new T[0]; } private sealed class Grouping : List, IGrouping { internal Grouping(K key) { Key = key; } public K Key { get; private set; } } } internal partial class Enumerable { /// /// Computes the sum of a sequence of nullable values. /// public static int Sum( this IEnumerable source) { CheckNotNull(source, "source"); int sum = 0; foreach (var num in source) sum = checked(sum + num); return sum; } /// /// Computes the sum of a sequence of nullable /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static int Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of nullable values. /// public static double Average( this IEnumerable source) { CheckNotNull(source, "source"); long sum = 0; long count = 0; foreach (var num in source) checked { sum += (int) num; count++; } if (count == 0) throw new InvalidOperationException(); return (double) sum/count; } /// /// Computes the average of a sequence of nullable values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static double Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Computes the sum of a sequence of values. /// public static int? Sum( this IEnumerable source) { CheckNotNull(source, "source"); int sum = 0; foreach (var num in source) sum = checked(sum + (num ?? 0)); return sum; } /// /// Computes the sum of a sequence of /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static int? Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of values. /// public static double? Average( this IEnumerable source) { CheckNotNull(source, "source"); long sum = 0; long count = 0; foreach (var num in source.Where(n => n != null)) checked { sum += (int) num; count++; } if (count == 0) return null; return (double?) sum/count; } /// /// Computes the average of a sequence of values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static double? Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Returns the minimum value in a sequence of nullable /// values. /// public static int? Min( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); } /// /// Invokes a transform function on each element of a sequence and /// returns the minimum nullable value. /// public static int? Min( this IEnumerable source, Func selector) { return source.Select(selector).Min(); } /// /// Returns the maximum value in a sequence of nullable /// values. /// public static int? Max( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (max, x) => x == null || (max != null && x.Value < max.Value)); } /// /// Invokes a transform function on each element of a sequence and /// returns the maximum nullable value. /// public static int? Max( this IEnumerable source, Func selector) { return source.Select(selector).Max(); } /// /// Computes the sum of a sequence of nullable values. /// public static long Sum( this IEnumerable source) { CheckNotNull(source, "source"); long sum = 0; foreach (var num in source) sum = checked(sum + num); return sum; } /// /// Computes the sum of a sequence of nullable /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static long Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of nullable values. /// public static double Average( this IEnumerable source) { CheckNotNull(source, "source"); long sum = 0; long count = 0; foreach (var num in source) checked { sum += (long) num; count++; } if (count == 0) throw new InvalidOperationException(); return (double) sum/count; } /// /// Computes the average of a sequence of nullable values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static double Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Computes the sum of a sequence of values. /// public static long? Sum( this IEnumerable source) { CheckNotNull(source, "source"); long sum = 0; foreach (var num in source) sum = checked(sum + (num ?? 0)); return sum; } /// /// Computes the sum of a sequence of /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static long? Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of values. /// public static double? Average( this IEnumerable source) { CheckNotNull(source, "source"); long sum = 0; long count = 0; foreach (var num in source.Where(n => n != null)) checked { sum += (long) num; count++; } if (count == 0) return null; return (double?) sum/count; } /// /// Computes the average of a sequence of values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static double? Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Returns the minimum value in a sequence of nullable /// values. /// public static long? Min( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); } /// /// Invokes a transform function on each element of a sequence and /// returns the minimum nullable value. /// public static long? Min( this IEnumerable source, Func selector) { return source.Select(selector).Min(); } /// /// Returns the maximum value in a sequence of nullable /// values. /// public static long? Max( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (max, x) => x == null || (max != null && x.Value < max.Value)); } /// /// Invokes a transform function on each element of a sequence and /// returns the maximum nullable value. /// public static long? Max( this IEnumerable source, Func selector) { return source.Select(selector).Max(); } /// /// Computes the sum of a sequence of nullable values. /// public static float Sum( this IEnumerable source) { CheckNotNull(source, "source"); float sum = 0; foreach (var num in source) sum = checked(sum + num); return sum; } /// /// Computes the sum of a sequence of nullable /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static float Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of nullable values. /// public static float Average( this IEnumerable source) { CheckNotNull(source, "source"); float sum = 0; long count = 0; foreach (var num in source) checked { sum += (float) num; count++; } if (count == 0) throw new InvalidOperationException(); return (float) sum/count; } /// /// Computes the average of a sequence of nullable values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static float Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Computes the sum of a sequence of values. /// public static float? Sum( this IEnumerable source) { CheckNotNull(source, "source"); float sum = 0; foreach (var num in source) sum = checked(sum + (num ?? 0)); return sum; } /// /// Computes the sum of a sequence of /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static float? Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of values. /// public static float? Average( this IEnumerable source) { CheckNotNull(source, "source"); float sum = 0; long count = 0; foreach (var num in source.Where(n => n != null)) checked { sum += (float) num; count++; } if (count == 0) return null; return (float?) sum/count; } /// /// Computes the average of a sequence of values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static float? Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Returns the minimum value in a sequence of nullable /// values. /// public static float? Min( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); } /// /// Invokes a transform function on each element of a sequence and /// returns the minimum nullable value. /// public static float? Min( this IEnumerable source, Func selector) { return source.Select(selector).Min(); } /// /// Returns the maximum value in a sequence of nullable /// values. /// public static float? Max( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (max, x) => x == null || (max != null && x.Value < max.Value)); } /// /// Invokes a transform function on each element of a sequence and /// returns the maximum nullable value. /// public static float? Max( this IEnumerable source, Func selector) { return source.Select(selector).Max(); } /// /// Computes the sum of a sequence of nullable values. /// public static double Sum( this IEnumerable source) { CheckNotNull(source, "source"); double sum = 0; foreach (var num in source) sum = checked(sum + num); return sum; } /// /// Computes the sum of a sequence of nullable /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static double Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of nullable values. /// public static double Average( this IEnumerable source) { CheckNotNull(source, "source"); double sum = 0; long count = 0; foreach (var num in source) checked { sum += (double) num; count++; } if (count == 0) throw new InvalidOperationException(); return (double) sum/count; } /// /// Computes the average of a sequence of nullable values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static double Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Computes the sum of a sequence of values. /// public static double? Sum( this IEnumerable source) { CheckNotNull(source, "source"); double sum = 0; foreach (var num in source) sum = checked(sum + (num ?? 0)); return sum; } /// /// Computes the sum of a sequence of /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static double? Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of values. /// public static double? Average( this IEnumerable source) { CheckNotNull(source, "source"); double sum = 0; long count = 0; foreach (var num in source.Where(n => n != null)) checked { sum += (double) num; count++; } if (count == 0) return null; return (double?) sum/count; } /// /// Computes the average of a sequence of values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static double? Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Returns the minimum value in a sequence of nullable /// values. /// public static double? Min( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); } /// /// Invokes a transform function on each element of a sequence and /// returns the minimum nullable value. /// public static double? Min( this IEnumerable source, Func selector) { return source.Select(selector).Min(); } /// /// Returns the maximum value in a sequence of nullable /// values. /// public static double? Max( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (max, x) => x == null || (max != null && x.Value < max.Value)); } /// /// Invokes a transform function on each element of a sequence and /// returns the maximum nullable value. /// public static double? Max( this IEnumerable source, Func selector) { return source.Select(selector).Max(); } /// /// Computes the sum of a sequence of nullable values. /// public static decimal Sum( this IEnumerable source) { CheckNotNull(source, "source"); decimal sum = 0; foreach (var num in source) sum = checked(sum + num); return sum; } /// /// Computes the sum of a sequence of nullable /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static decimal Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of nullable values. /// public static decimal Average( this IEnumerable source) { CheckNotNull(source, "source"); decimal sum = 0; long count = 0; foreach (var num in source) checked { sum += (decimal) num; count++; } if (count == 0) throw new InvalidOperationException(); return (decimal) sum/count; } /// /// Computes the average of a sequence of nullable values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static decimal Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Computes the sum of a sequence of values. /// public static decimal? Sum( this IEnumerable source) { CheckNotNull(source, "source"); decimal sum = 0; foreach (var num in source) sum = checked(sum + (num ?? 0)); return sum; } /// /// Computes the sum of a sequence of /// values that are obtained by invoking a transform function on /// each element of the input sequence. /// public static decimal? Sum( this IEnumerable source, Func selector) { return source.Select(selector).Sum(); } /// /// Computes the average of a sequence of values. /// public static decimal? Average( this IEnumerable source) { CheckNotNull(source, "source"); decimal sum = 0; long count = 0; foreach (var num in source.Where(n => n != null)) checked { sum += (decimal) num; count++; } if (count == 0) return null; return (decimal?) sum/count; } /// /// Computes the average of a sequence of values /// that are obtained by invoking a transform function on each /// element of the input sequence. /// public static decimal? Average( this IEnumerable source, Func selector) { return source.Select(selector).Average(); } /// /// Returns the minimum value in a sequence of nullable /// values. /// public static decimal? Min( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (min, x) => min < x); } /// /// Invokes a transform function on each element of a sequence and /// returns the minimum nullable value. /// public static decimal? Min( this IEnumerable source, Func selector) { return source.Select(selector).Min(); } /// /// Returns the maximum value in a sequence of nullable /// values. /// public static decimal? Max( this IEnumerable source) { CheckNotNull(source, "source"); return MinMaxImpl(source.Where(x => x != null), null, (max, x) => x == null || (max != null && x.Value < max.Value)); } /// /// Invokes a transform function on each element of a sequence and /// returns the maximum nullable value. /// public static decimal? Max( this IEnumerable source, Func selector) { return source.Select(selector).Max(); } } /// /// Represents a collection of objects that have a common key. /// internal partial interface IGrouping : IEnumerable { /// /// Gets the key of the . /// TKey Key { get; } } /// /// Defines an indexer, size property, and Boolean search method for /// data structures that map keys to /// sequences of values. /// internal partial interface ILookup : IEnumerable> { bool Contains(TKey key); int Count { get; } IEnumerable this[TKey key] { get; } } /// /// Represents a sorted sequence. /// internal partial interface IOrderedEnumerable : IEnumerable { /// /// Performs a subsequent ordering on the elements of an /// according to a key. /// IOrderedEnumerable CreateOrderedEnumerable( Func keySelector, IComparer comparer, bool descending); } /// /// Represents a collection of keys each mapped to one or more values. /// internal sealed class Lookup : ILookup { private readonly Dictionary> _map; internal Lookup(IEqualityComparer comparer) { _map = new Dictionary>(comparer); } internal void Add(IGrouping item) { _map.Add(item.Key, item); } internal IEnumerable Find(TKey key) { IGrouping grouping; return _map.TryGetValue(key, out grouping) ? grouping : null; } /// /// Gets the number of key/value collection pairs in the . /// public int Count { get { return _map.Count; } } /// /// Gets the collection of values indexed by the specified key. /// public IEnumerable this[TKey key] { get { IGrouping result; return _map.TryGetValue(key, out result) ? result : Enumerable.Empty(); } } /// /// Determines whether a specified key is in the . /// public bool Contains(TKey key) { return _map.ContainsKey(key); } /// /// Applies a transform function to each key and its associated /// values and returns the results. /// public IEnumerable ApplyResultSelector( Func, TResult> resultSelector) { if (resultSelector == null) throw new ArgumentNullException("resultSelector"); foreach (var pair in _map) yield return resultSelector(pair.Key, pair.Value); } /// /// Returns a generic enumerator that iterates through the . /// public IEnumerator> GetEnumerator() { return _map.Values.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } internal sealed class OrderedEnumerable : IOrderedEnumerable { private readonly IEnumerable _source; private readonly List> _comparisons; public OrderedEnumerable(IEnumerable source, Func keySelector, IComparer comparer, bool descending) : this(source, null, keySelector, comparer, descending) { } private OrderedEnumerable(IEnumerable source, List> comparisons, Func keySelector, IComparer comparer, bool descending) { if (source == null) throw new ArgumentNullException("source"); if (keySelector == null) throw new ArgumentNullException("keySelector"); _source = source; comparer = comparer ?? Comparer.Default; if (comparisons == null) comparisons = new List>( /* capacity */ 4); comparisons.Add((x, y) => (descending ? -1 : 1)*comparer.Compare(keySelector(x), keySelector(y))); _comparisons = comparisons; } public IOrderedEnumerable CreateOrderedEnumerable( Func keySelector, IComparer comparer, bool descending) { return new OrderedEnumerable(_source, _comparisons, keySelector, comparer, descending); } public IEnumerator GetEnumerator() { // // We sort using List.Sort, but docs say that it performs an // unstable sort. LINQ, on the other hand, says OrderBy performs // a stable sort. So convert the source sequence into a sequence // of tuples where the second element tags the position of the // element from the source sequence (First). The position is // then used as a tie breaker when all keys compare equal, // thus making the sort stable. // var list = _source.Select(new Func>(TagPosition)).ToList(); list.Sort((x, y) => { // // Compare keys from left to right. // var comparisons = _comparisons; for (var i = 0; i < comparisons.Count; i++) { var result = comparisons[i](x.First, y.First); if (result != 0) return result; } // // All keys compared equal so now break the tie by their // position in the original sequence, making the sort stable. // return x.Second.CompareTo(y.Second); }); return list.Select(new Func, T>(GetFirst)).GetEnumerator(); } /// /// See issue #11 /// for why this method is needed and cannot be expressed as a /// lambda at the call site. /// private static Tuple TagPosition(T e, int i) { return new Tuple(e, i); } /// /// See issue #11 /// for why this method is needed and cannot be expressed as a /// lambda at the call site. /// private static T GetFirst(Tuple pv) { return pv.First; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } [Serializable] internal struct Tuple : IEquatable> { public TFirst First { get; private set; } public TSecond Second { get; private set; } public Tuple(TFirst first, TSecond second) : this() { First = first; Second = second; } public override bool Equals(object obj) { return obj != null && obj is Tuple && base.Equals((Tuple) obj); } public bool Equals(Tuple other) { return EqualityComparer.Default.Equals(other.First, First) && EqualityComparer.Default.Equals(other.Second, Second); } public override int GetHashCode() { var num = 0x7a2f0b42; num = (-1521134295*num) + EqualityComparer.Default.GetHashCode(First); return (-1521134295*num) + EqualityComparer.Default.GetHashCode(Second); } public override string ToString() { return string.Format(@"{{ First = {0}, Second = {1} }}", First, Second); } } } namespace Newtonsoft.Json.Serialization { public delegate TResult Func(); public delegate TResult Func(T a); public delegate TResult Func(T1 arg1, T2 arg2); public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3); public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4); public delegate void Action(); public delegate void Action(T1 arg1, T2 arg2); public delegate void Action(T1 arg1, T2 arg2, T3 arg3); public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4); } namespace System.Runtime.CompilerServices { /// /// This attribute allows us to define extension methods without /// requiring .NET Framework 3.5. For more information, see the section, /// Extension Methods in .NET Framework 2.0 Apps, /// of Basic Instincts: Extension Methods /// column in MSDN Magazine, /// issue Nov 2007. /// [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] internal sealed class ExtensionAttribute : Attribute { } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ValidationUtils.cs0000644000175000017500000000556712253423361030402 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Globalization; namespace Newtonsoft.Json.Utilities { internal static class ValidationUtils { public static void ArgumentNotNullOrEmpty(string value, string parameterName) { if (value == null) throw new ArgumentNullException(parameterName); if (value.Length == 0) throw new ArgumentException("'{0}' cannot be empty.".FormatWith(CultureInfo.InvariantCulture, parameterName), parameterName); } public static void ArgumentTypeIsEnum(Type enumType, string parameterName) { ArgumentNotNull(enumType, "enumType"); if (!enumType.IsEnum()) throw new ArgumentException("Type {0} is not an Enum.".FormatWith(CultureInfo.InvariantCulture, enumType), parameterName); } public static void ArgumentNotNullOrEmpty(ICollection collection, string parameterName) { ArgumentNotNullOrEmpty(collection, parameterName, "Collection '{0}' cannot be empty.".FormatWith(CultureInfo.InvariantCulture, parameterName)); } public static void ArgumentNotNullOrEmpty(ICollection collection, string parameterName, string message) { if (collection == null) throw new ArgumentNullException(parameterName); if (collection.Count == 0) throw new ArgumentException(message, parameterName); } public static void ArgumentNotNull(object value, string parameterName) { if (value == null) throw new ArgumentNullException(parameterName); } public static void ArgumentConditionTrue(bool condition, string parameterName, string message) { if (!condition) throw new ArgumentException(message, parameterName); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs0000644000175000017500000010230512253423361030366 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Reflection; using System.Collections; using System.Globalization; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Text; #if NETFX_CORE using IConvertible = Newtonsoft.Json.Utilities.Convertible; #endif #if NETFX_CORE || PORTABLE using ICustomAttributeProvider = Newtonsoft.Json.Utilities.CustomAttributeProvider; #endif #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Utilities { #if NETFX_CORE || PORTABLE internal enum MemberTypes { Property, Field, Event, Method, Other } internal class CustomAttributeProvider { private readonly object _underlyingObject; public CustomAttributeProvider(object o) { _underlyingObject = o; } public object UnderlyingObject { get { return _underlyingObject; } } } #endif #if NETFX_CORE internal enum TypeCode { Empty, Object, String, Char, Boolean, SByte, Int16, UInt16, Int32, Byte, UInt32, Int64, UInt64, Single, Double, DateTime, Decimal } [Flags] internal enum BindingFlags { Default = 0, IgnoreCase = 1, DeclaredOnly = 2, Instance = 4, Static = 8, Public = 16, NonPublic = 32, FlattenHierarchy = 64, InvokeMethod = 256, CreateInstance = 512, GetField = 1024, SetField = 2048, GetProperty = 4096, SetProperty = 8192, PutDispProperty = 16384, ExactBinding = 65536, PutRefDispProperty = 32768, SuppressChangeType = 131072, OptionalParamBinding = 262144, IgnoreReturn = 16777216 } #endif internal static class ReflectionUtils { public static readonly Type[] EmptyTypes; static ReflectionUtils() { #if !(NETFX_CORE || PORTABLE) EmptyTypes = Type.EmptyTypes; #else EmptyTypes = new Type[0]; #endif } public static ICustomAttributeProvider GetCustomAttributeProvider(this object o) { #if !(NETFX_CORE || PORTABLE) return (ICustomAttributeProvider)o; #else return new ICustomAttributeProvider(o); #endif } public static bool IsVirtual(this PropertyInfo propertyInfo) { ValidationUtils.ArgumentNotNull(propertyInfo, "propertyInfo"); MethodInfo m = propertyInfo.GetGetMethod(); if (m != null && m.IsVirtual) return true; m = propertyInfo.GetSetMethod(); if (m != null && m.IsVirtual) return true; return false; } public static Type GetObjectType(object v) { return (v != null) ? v.GetType() : null; } public static string GetTypeName(Type t, FormatterAssemblyStyle assemblyFormat) { return GetTypeName(t, assemblyFormat, null); } public static string GetTypeName(Type t, FormatterAssemblyStyle assemblyFormat, SerializationBinder binder) { string fullyQualifiedTypeName; #if !(NET20 || NET35) if (binder != null) { string assemblyName, typeName; binder.BindToName(t, out assemblyName, out typeName); fullyQualifiedTypeName = typeName + (assemblyName == null ? "" : ", " + assemblyName); } else { fullyQualifiedTypeName = t.AssemblyQualifiedName; } #else fullyQualifiedTypeName = t.AssemblyQualifiedName; #endif switch (assemblyFormat) { case FormatterAssemblyStyle.Simple: return RemoveAssemblyDetails(fullyQualifiedTypeName); case FormatterAssemblyStyle.Full: return fullyQualifiedTypeName; default: throw new ArgumentOutOfRangeException(); } } private static string RemoveAssemblyDetails(string fullyQualifiedTypeName) { StringBuilder builder = new StringBuilder(); // loop through the type name and filter out qualified assembly details from nested type names bool writingAssemblyName = false; bool skippingAssemblyDetails = false; for (int i = 0; i < fullyQualifiedTypeName.Length; i++) { char current = fullyQualifiedTypeName[i]; switch (current) { case '[': writingAssemblyName = false; skippingAssemblyDetails = false; builder.Append(current); break; case ']': writingAssemblyName = false; skippingAssemblyDetails = false; builder.Append(current); break; case ',': if (!writingAssemblyName) { writingAssemblyName = true; builder.Append(current); } else { skippingAssemblyDetails = true; } break; default: if (!skippingAssemblyDetails) builder.Append(current); break; } } return builder.ToString(); } public static bool IsInstantiatableType(Type t) { ValidationUtils.ArgumentNotNull(t, "t"); if (t.IsAbstract() || t.IsInterface() || t.IsArray || t.IsGenericTypeDefinition() || t == typeof(void)) return false; if (!HasDefaultConstructor(t)) return false; return true; } public static bool HasDefaultConstructor(Type t) { return HasDefaultConstructor(t, false); } public static bool HasDefaultConstructor(Type t, bool nonPublic) { ValidationUtils.ArgumentNotNull(t, "t"); if (t.IsValueType()) return true; return (GetDefaultConstructor(t, nonPublic) != null); } public static ConstructorInfo GetDefaultConstructor(Type t) { return GetDefaultConstructor(t, false); } public static ConstructorInfo GetDefaultConstructor(Type t, bool nonPublic) { BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public; if (nonPublic) bindingFlags = bindingFlags | BindingFlags.NonPublic; return t.GetConstructors(bindingFlags).SingleOrDefault(c => !c.GetParameters().Any()); } public static bool IsNullable(Type t) { ValidationUtils.ArgumentNotNull(t, "t"); if (t.IsValueType()) return IsNullableType(t); return true; } public static bool IsNullableType(Type t) { ValidationUtils.ArgumentNotNull(t, "t"); return (t.IsGenericType() && t.GetGenericTypeDefinition() == typeof(Nullable<>)); } public static Type EnsureNotNullableType(Type t) { return (IsNullableType(t)) ? Nullable.GetUnderlyingType(t) : t; } public static bool ImplementsGenericDefinition(Type type, Type genericInterfaceDefinition) { Type implementingType; return ImplementsGenericDefinition(type, genericInterfaceDefinition, out implementingType); } public static bool ImplementsGenericDefinition(Type type, Type genericInterfaceDefinition, out Type implementingType) { ValidationUtils.ArgumentNotNull(type, "type"); ValidationUtils.ArgumentNotNull(genericInterfaceDefinition, "genericInterfaceDefinition"); if (!genericInterfaceDefinition.IsInterface() || !genericInterfaceDefinition.IsGenericTypeDefinition()) throw new ArgumentNullException("'{0}' is not a generic interface definition.".FormatWith(CultureInfo.InvariantCulture, genericInterfaceDefinition)); if (type.IsInterface()) { if (type.IsGenericType()) { Type interfaceDefinition = type.GetGenericTypeDefinition(); if (genericInterfaceDefinition == interfaceDefinition) { implementingType = type; return true; } } } foreach (Type i in type.GetInterfaces()) { if (i.IsGenericType()) { Type interfaceDefinition = i.GetGenericTypeDefinition(); if (genericInterfaceDefinition == interfaceDefinition) { implementingType = i; return true; } } } implementingType = null; return false; } public static bool InheritsGenericDefinition(Type type, Type genericClassDefinition) { Type implementingType; return InheritsGenericDefinition(type, genericClassDefinition, out implementingType); } public static bool InheritsGenericDefinition(Type type, Type genericClassDefinition, out Type implementingType) { ValidationUtils.ArgumentNotNull(type, "type"); ValidationUtils.ArgumentNotNull(genericClassDefinition, "genericClassDefinition"); if (!genericClassDefinition.IsClass() || !genericClassDefinition.IsGenericTypeDefinition()) throw new ArgumentNullException("'{0}' is not a generic class definition.".FormatWith(CultureInfo.InvariantCulture, genericClassDefinition)); return InheritsGenericDefinitionInternal(type, genericClassDefinition, out implementingType); } private static bool InheritsGenericDefinitionInternal(Type currentType, Type genericClassDefinition, out Type implementingType) { if (currentType.IsGenericType()) { Type currentGenericClassDefinition = currentType.GetGenericTypeDefinition(); if (genericClassDefinition == currentGenericClassDefinition) { implementingType = currentType; return true; } } if (currentType.BaseType() == null) { implementingType = null; return false; } return InheritsGenericDefinitionInternal(currentType.BaseType(), genericClassDefinition, out implementingType); } /// /// Gets the type of the typed collection's items. /// /// The type. /// The type of the typed collection's items. public static Type GetCollectionItemType(Type type) { ValidationUtils.ArgumentNotNull(type, "type"); Type genericListType; if (type.IsArray) { return type.GetElementType(); } else if (ImplementsGenericDefinition(type, typeof(IEnumerable<>), out genericListType)) { if (genericListType.IsGenericTypeDefinition()) throw new Exception("Type {0} is not a collection.".FormatWith(CultureInfo.InvariantCulture, type)); return genericListType.GetGenericArguments()[0]; } else if (typeof(IEnumerable).IsAssignableFrom(type)) { return null; } else { throw new Exception("Type {0} is not a collection.".FormatWith(CultureInfo.InvariantCulture, type)); } } public static void GetDictionaryKeyValueTypes(Type dictionaryType, out Type keyType, out Type valueType) { ValidationUtils.ArgumentNotNull(dictionaryType, "type"); Type genericDictionaryType; if (ImplementsGenericDefinition(dictionaryType, typeof(IDictionary<,>), out genericDictionaryType)) { if (genericDictionaryType.IsGenericTypeDefinition()) throw new Exception("Type {0} is not a dictionary.".FormatWith(CultureInfo.InvariantCulture, dictionaryType)); Type[] dictionaryGenericArguments = genericDictionaryType.GetGenericArguments(); keyType = dictionaryGenericArguments[0]; valueType = dictionaryGenericArguments[1]; return; } else if (typeof(IDictionary).IsAssignableFrom(dictionaryType)) { keyType = null; valueType = null; return; } else { throw new Exception("Type {0} is not a dictionary.".FormatWith(CultureInfo.InvariantCulture, dictionaryType)); } } public static Type GetDictionaryValueType(Type dictionaryType) { Type keyType; Type valueType; GetDictionaryKeyValueTypes(dictionaryType, out keyType, out valueType); return valueType; } public static Type GetDictionaryKeyType(Type dictionaryType) { Type keyType; Type valueType; GetDictionaryKeyValueTypes(dictionaryType, out keyType, out valueType); return keyType; } /// /// Gets the member's underlying type. /// /// The member. /// The underlying type of the member. public static Type GetMemberUnderlyingType(MemberInfo member) { ValidationUtils.ArgumentNotNull(member, "member"); switch (member.MemberType()) { case MemberTypes.Field: return ((FieldInfo)member).FieldType; case MemberTypes.Property: return ((PropertyInfo)member).PropertyType; case MemberTypes.Event: return ((EventInfo)member).EventHandlerType; default: throw new ArgumentException("MemberInfo must be of type FieldInfo, PropertyInfo or EventInfo", "member"); } } /// /// Determines whether the member is an indexed property. /// /// The member. /// /// true if the member is an indexed property; otherwise, false. /// public static bool IsIndexedProperty(MemberInfo member) { ValidationUtils.ArgumentNotNull(member, "member"); PropertyInfo propertyInfo = member as PropertyInfo; if (propertyInfo != null) return IsIndexedProperty(propertyInfo); else return false; } /// /// Determines whether the property is an indexed property. /// /// The property. /// /// true if the property is an indexed property; otherwise, false. /// public static bool IsIndexedProperty(PropertyInfo property) { ValidationUtils.ArgumentNotNull(property, "property"); return (property.GetIndexParameters().Length > 0); } /// /// Gets the member's value on the object. /// /// The member. /// The target object. /// The member's value on the object. public static object GetMemberValue(MemberInfo member, object target) { ValidationUtils.ArgumentNotNull(member, "member"); ValidationUtils.ArgumentNotNull(target, "target"); switch (member.MemberType()) { case MemberTypes.Field: return ((FieldInfo)member).GetValue(target); case MemberTypes.Property: try { return ((PropertyInfo)member).GetValue(target, null); } catch (TargetParameterCountException e) { throw new ArgumentException("MemberInfo '{0}' has index parameters".FormatWith(CultureInfo.InvariantCulture, member.Name), e); } default: throw new ArgumentException("MemberInfo '{0}' is not of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, CultureInfo.InvariantCulture, member.Name), "member"); } } /// /// Sets the member's value on the target object. /// /// The member. /// The target. /// The value. public static void SetMemberValue(MemberInfo member, object target, object value) { ValidationUtils.ArgumentNotNull(member, "member"); ValidationUtils.ArgumentNotNull(target, "target"); switch (member.MemberType()) { case MemberTypes.Field: ((FieldInfo)member).SetValue(target, value); break; case MemberTypes.Property: ((PropertyInfo)member).SetValue(target, value, null); break; default: throw new ArgumentException("MemberInfo '{0}' must be of type FieldInfo or PropertyInfo".FormatWith(CultureInfo.InvariantCulture, member.Name), "member"); } } /// /// Determines whether the specified MemberInfo can be read. /// /// The MemberInfo to determine whether can be read. /// /// if set to true then allow the member to be gotten non-publicly. /// /// true if the specified MemberInfo can be read; otherwise, false. /// public static bool CanReadMemberValue(MemberInfo member, bool nonPublic) { switch (member.MemberType()) { case MemberTypes.Field: FieldInfo fieldInfo = (FieldInfo)member; if (nonPublic) return true; else if (fieldInfo.IsPublic) return true; return false; case MemberTypes.Property: PropertyInfo propertyInfo = (PropertyInfo) member; if (!propertyInfo.CanRead) return false; if (nonPublic) return true; return (propertyInfo.GetGetMethod(nonPublic) != null); default: return false; } } /// /// Determines whether the specified MemberInfo can be set. /// /// The MemberInfo to determine whether can be set. /// if set to true then allow the member to be set non-publicly. /// if set to true then allow the member to be set if read-only. /// /// true if the specified MemberInfo can be set; otherwise, false. /// public static bool CanSetMemberValue(MemberInfo member, bool nonPublic, bool canSetReadOnly) { switch (member.MemberType()) { case MemberTypes.Field: FieldInfo fieldInfo = (FieldInfo)member; if (fieldInfo.IsInitOnly && !canSetReadOnly) return false; if (nonPublic) return true; else if (fieldInfo.IsPublic) return true; return false; case MemberTypes.Property: PropertyInfo propertyInfo = (PropertyInfo)member; if (!propertyInfo.CanWrite) return false; if (nonPublic) return true; return (propertyInfo.GetSetMethod(nonPublic) != null); default: return false; } } public static List GetFieldsAndProperties(Type type, BindingFlags bindingAttr) { List targetMembers = new List(); targetMembers.AddRange(GetFields(type, bindingAttr)); targetMembers.AddRange(GetProperties(type, bindingAttr)); // for some reason .NET returns multiple members when overriding a generic member on a base class // http://forums.msdn.microsoft.com/en-US/netfxbcl/thread/b5abbfee-e292-4a64-8907-4e3f0fb90cd9/ // filter members to only return the override on the topmost class // update: I think this is fixed in .NET 3.5 SP1 - leave this in for now... List distinctMembers = new List(targetMembers.Count); foreach (var groupedMember in targetMembers.GroupBy(m => m.Name)) { int count = groupedMember.Count(); IList members = groupedMember.ToList(); if (count == 1) { distinctMembers.Add(members.First()); } else { var resolvedMembers = members.Where(m => !IsOverridenGenericMember(m, bindingAttr) || m.Name == "Item"); distinctMembers.AddRange(resolvedMembers); } } return distinctMembers; } private static bool IsOverridenGenericMember(MemberInfo memberInfo, BindingFlags bindingAttr) { MemberTypes memberType = memberInfo.MemberType(); if (memberType != MemberTypes.Field && memberType != MemberTypes.Property) throw new ArgumentException("Member must be a field or property."); Type declaringType = memberInfo.DeclaringType; if (!declaringType.IsGenericType()) return false; Type genericTypeDefinition = declaringType.GetGenericTypeDefinition(); if (genericTypeDefinition == null) return false; MemberInfo[] members = genericTypeDefinition.GetMember(memberInfo.Name, bindingAttr); if (members.Length == 0) return false; Type memberUnderlyingType = GetMemberUnderlyingType(members[0]); if (!memberUnderlyingType.IsGenericParameter) return false; return true; } public static T GetAttribute(ICustomAttributeProvider attributeProvider) where T : Attribute { return GetAttribute(attributeProvider, true); } public static T GetAttribute(ICustomAttributeProvider attributeProvider, bool inherit) where T : Attribute { T[] attributes = GetAttributes(attributeProvider, inherit); return attributes.SingleOrDefault(); } #if !(NETFX_CORE) public static T[] GetAttributes(ICustomAttributeProvider attributeProvider, bool inherit) where T : Attribute { ValidationUtils.ArgumentNotNull(attributeProvider, "attributeProvider"); object provider; #if !PORTABLE provider = attributeProvider; #else provider = attributeProvider.UnderlyingObject; #endif // http://hyperthink.net/blog/getcustomattributes-gotcha/ // ICustomAttributeProvider doesn't do inheritance if (provider is Type) return (T[])((Type)provider).GetCustomAttributes(typeof(T), inherit); if (provider is Assembly) return (T[])Attribute.GetCustomAttributes((Assembly)provider, typeof(T)); if (provider is MemberInfo) return (T[])Attribute.GetCustomAttributes((MemberInfo)provider, typeof(T), inherit); #if !PORTABLE if (provider is Module) return (T[])Attribute.GetCustomAttributes((Module)provider, typeof(T), inherit); #endif if (provider is ParameterInfo) return (T[])Attribute.GetCustomAttributes((ParameterInfo)provider, typeof(T), inherit); #if !PORTABLE return (T[])attributeProvider.GetCustomAttributes(typeof(T), inherit); #else throw new Exception("Cannot get attributes from '{0}'.".FormatWith(CultureInfo.InvariantCulture, provider)); #endif } #else public static T[] GetAttributes(ICustomAttributeProvider attributeProvider, bool inherit) where T : Attribute { object provider = attributeProvider.UnderlyingObject; if (provider is Type) return ((Type)provider).GetTypeInfo().GetCustomAttributes(inherit).ToArray(); if (provider is Assembly) return ((Assembly)provider).GetCustomAttributes().ToArray(); if (provider is MemberInfo) return ((MemberInfo)provider).GetCustomAttributes(inherit).ToArray(); if (provider is Module) return ((Module)provider).GetCustomAttributes().ToArray(); if (provider is ParameterInfo) return ((ParameterInfo)provider).GetCustomAttributes(inherit).ToArray(); throw new Exception("Cannot get attributes from '{0}'.".FormatWith(CultureInfo.InvariantCulture, provider)); } #endif public static Type MakeGenericType(Type genericTypeDefinition, params Type[] innerTypes) { ValidationUtils.ArgumentNotNull(genericTypeDefinition, "genericTypeDefinition"); ValidationUtils.ArgumentNotNullOrEmpty(innerTypes, "innerTypes"); ValidationUtils.ArgumentConditionTrue(genericTypeDefinition.IsGenericTypeDefinition(), "genericTypeDefinition", "Type {0} is not a generic type definition.".FormatWith(CultureInfo.InvariantCulture, genericTypeDefinition)); return genericTypeDefinition.MakeGenericType(innerTypes); } public static object CreateGeneric(Type genericTypeDefinition, Type innerType, params object[] args) { return CreateGeneric(genericTypeDefinition, new [] { innerType }, args); } public static object CreateGeneric(Type genericTypeDefinition, IList innerTypes, params object[] args) { return CreateGeneric(genericTypeDefinition, innerTypes, (t, a) => CreateInstance(t, a.ToArray()), args); } public static object CreateGeneric(Type genericTypeDefinition, IList innerTypes, Func, object> instanceCreator, params object[] args) { ValidationUtils.ArgumentNotNull(genericTypeDefinition, "genericTypeDefinition"); ValidationUtils.ArgumentNotNullOrEmpty(innerTypes, "innerTypes"); ValidationUtils.ArgumentNotNull(instanceCreator, "createInstance"); Type specificType = MakeGenericType(genericTypeDefinition, innerTypes.ToArray()); return instanceCreator(specificType, args); } public static object CreateInstance(Type type, params object[] args) { ValidationUtils.ArgumentNotNull(type, "type"); #if !PocketPC return Activator.CreateInstance(type, args); #else // CF doesn't have a Activator.CreateInstance overload that takes args // lame if (type.IsValueType && CollectionUtils.IsNullOrEmpty(args)) return Activator.CreateInstance(type); ConstructorInfo[] constructors = type.GetConstructors(); ConstructorInfo match = constructors.Where(c => { ParameterInfo[] parameters = c.GetParameters(); if (parameters.Length != args.Length) return false; for (int i = 0; i < parameters.Length; i++) { ParameterInfo parameter = parameters[i]; object value = args[i]; if (!IsCompatibleValue(value, parameter.ParameterType)) return false; } return true; }).FirstOrDefault(); if (match == null) throw new Exception("Could not create '{0}' with given parameters.".FormatWith(CultureInfo.InvariantCulture, type)); return match.Invoke(args); #endif } public static void SplitFullyQualifiedTypeName(string fullyQualifiedTypeName, out string typeName, out string assemblyName) { int? assemblyDelimiterIndex = GetAssemblyDelimiterIndex(fullyQualifiedTypeName); if (assemblyDelimiterIndex != null) { typeName = fullyQualifiedTypeName.Substring(0, assemblyDelimiterIndex.Value).Trim(); assemblyName = fullyQualifiedTypeName.Substring(assemblyDelimiterIndex.Value + 1, fullyQualifiedTypeName.Length - assemblyDelimiterIndex.Value - 1).Trim(); } else { typeName = fullyQualifiedTypeName; assemblyName = null; } } private static int? GetAssemblyDelimiterIndex(string fullyQualifiedTypeName) { // we need to get the first comma following all surrounded in brackets because of generic types // e.g. System.Collections.Generic.Dictionary`2[[System.String, mscorlib,Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 int scope = 0; for (int i = 0; i < fullyQualifiedTypeName.Length; i++) { char current = fullyQualifiedTypeName[i]; switch (current) { case '[': scope++; break; case ']': scope--; break; case ',': if (scope == 0) return i; break; } } return null; } public static MemberInfo GetMemberInfoFromType(Type targetType, MemberInfo memberInfo) { const BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; switch (memberInfo.MemberType()) { case MemberTypes.Property: PropertyInfo propertyInfo = (PropertyInfo) memberInfo; Type[] types = propertyInfo.GetIndexParameters().Select(p => p.ParameterType).ToArray(); return targetType.GetProperty(propertyInfo.Name, bindingAttr, null, propertyInfo.PropertyType, types, null); default: return targetType.GetMember(memberInfo.Name, memberInfo.MemberType(), bindingAttr).SingleOrDefault(); } } public static IEnumerable GetFields(Type targetType, BindingFlags bindingAttr) { ValidationUtils.ArgumentNotNull(targetType, "targetType"); List fieldInfos = new List(targetType.GetFields(bindingAttr)); #if !NETFX_CORE // Type.GetFields doesn't return inherited private fields // manually find private fields from base class GetChildPrivateFields(fieldInfos, targetType, bindingAttr); #endif return fieldInfos.Cast(); } private static void GetChildPrivateFields(IList initialFields, Type targetType, BindingFlags bindingAttr) { // fix weirdness with private FieldInfos only being returned for the current Type // find base type fields and add them to result if ((bindingAttr & BindingFlags.NonPublic) != 0) { // modify flags to not search for public fields BindingFlags nonPublicBindingAttr = bindingAttr.RemoveFlag(BindingFlags.Public); while ((targetType = targetType.BaseType()) != null) { // filter out protected fields IEnumerable childPrivateFields = targetType.GetFields(nonPublicBindingAttr).Where(f => f.IsPrivate).Cast(); initialFields.AddRange(childPrivateFields); } } } public static IEnumerable GetProperties(Type targetType, BindingFlags bindingAttr) { ValidationUtils.ArgumentNotNull(targetType, "targetType"); List propertyInfos = new List(targetType.GetProperties(bindingAttr)); GetChildPrivateProperties(propertyInfos, targetType, bindingAttr); // a base class private getter/setter will be inaccessable unless the property was gotten from the base class for (int i = 0; i < propertyInfos.Count; i++) { PropertyInfo member = propertyInfos[i]; if (member.DeclaringType != targetType) { PropertyInfo declaredMember = (PropertyInfo)GetMemberInfoFromType(member.DeclaringType, member); propertyInfos[i] = declaredMember; } } return propertyInfos; } public static BindingFlags RemoveFlag(this BindingFlags bindingAttr, BindingFlags flag) { return ((bindingAttr & flag) == flag) ? bindingAttr ^ flag : bindingAttr; } private static void GetChildPrivateProperties(IList initialProperties, Type targetType, BindingFlags bindingAttr) { // fix weirdness with private PropertyInfos only being returned for the current Type // find base type properties and add them to result if ((bindingAttr & BindingFlags.NonPublic) != 0) { // modify flags to not search for public fields BindingFlags nonPublicBindingAttr = bindingAttr.RemoveFlag(BindingFlags.Public); while ((targetType = targetType.BaseType()) != null) { foreach (PropertyInfo propertyInfo in targetType.GetProperties(nonPublicBindingAttr)) { PropertyInfo nonPublicProperty = propertyInfo; // have to test on name rather than reference because instances are different // depending on the type that GetProperties was called on int index = initialProperties.IndexOf(p => p.Name == nonPublicProperty.Name); if (index == -1) { initialProperties.Add(nonPublicProperty); } else { // replace nonpublic properties for a child, but gotten from // the parent with the one from the child // the property gotten from the child will have access to private getter/setter initialProperties[index] = nonPublicProperty; } } } } } public static bool IsMethodOverridden(Type currentType, Type methodDeclaringType, string method) { bool isMethodOverriden = currentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Any(info => info.Name == method && // check that the method overrides the original on DynamicObjectProxy info.DeclaringType != methodDeclaringType // todo - find out whether there is a way to do this in winrt #if !NETFX_CORE && info.GetBaseDefinition().DeclaringType == methodDeclaringType #endif ); return isMethodOverriden; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/EnumUtils.cs0000644000175000017500000001205212253423361027177 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using System.Reflection; namespace Newtonsoft.Json.Utilities { internal static class EnumUtils { public static IList GetFlagsValues(T value) where T : struct { Type enumType = typeof(T); if (!enumType.IsDefined(typeof(FlagsAttribute), false)) throw new ArgumentException("Enum type {0} is not a set of flags.".FormatWith(CultureInfo.InvariantCulture, enumType)); Type underlyingType = Enum.GetUnderlyingType(value.GetType()); ulong num = Convert.ToUInt64(value, CultureInfo.InvariantCulture); EnumValues enumNameValues = GetNamesAndValues(); IList selectedFlagsValues = new List(); foreach (EnumValue enumNameValue in enumNameValues) { if ((num & enumNameValue.Value) == enumNameValue.Value && enumNameValue.Value != 0) selectedFlagsValues.Add((T)Convert.ChangeType(enumNameValue.Value, underlyingType, CultureInfo.CurrentCulture)); } if (selectedFlagsValues.Count == 0 && enumNameValues.SingleOrDefault(v => v.Value == 0) != null) selectedFlagsValues.Add(default(T)); return selectedFlagsValues; } /// /// Gets a dictionary of the names and values of an Enum type. /// /// public static EnumValues GetNamesAndValues() where T : struct { return GetNamesAndValues(typeof(T)); } /// /// Gets a dictionary of the names and values of an Enum type. /// /// The enum type to get names and values for. /// public static EnumValues GetNamesAndValues(Type enumType) where TUnderlyingType : struct { if (enumType == null) throw new ArgumentNullException("enumType"); ValidationUtils.ArgumentTypeIsEnum(enumType, "enumType"); IList enumValues = GetValues(enumType); IList enumNames = GetNames(enumType); EnumValues nameValues = new EnumValues(); for (int i = 0; i < enumValues.Count; i++) { try { nameValues.Add(new EnumValue(enumNames[i], (TUnderlyingType)Convert.ChangeType(enumValues[i], typeof(TUnderlyingType), CultureInfo.CurrentCulture))); } catch (OverflowException e) { throw new InvalidOperationException( string.Format(CultureInfo.InvariantCulture, "Value from enum with the underlying type of {0} cannot be added to dictionary with a value type of {1}. Value was too large: {2}", Enum.GetUnderlyingType(enumType), typeof(TUnderlyingType), Convert.ToUInt64(enumValues[i], CultureInfo.InvariantCulture)), e); } } return nameValues; } public static IList GetValues(Type enumType) { if (!enumType.IsEnum()) throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); List values = new List(); var fields = from field in enumType.GetFields() where field.IsLiteral select field; foreach (FieldInfo field in fields) { object value = field.GetValue(enumType); values.Add(value); } return values; } public static IList GetNames(Type enumType) { if (!enumType.IsEnum()) throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); List values = new List(); var fields = from field in enumType.GetFields() where field.IsLiteral select field; foreach (FieldInfo field in fields) { values.Add(field.Name); } return values; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/StringReference.cs0000644000175000017500000000342612253423361030344 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Utilities { internal struct StringReference { private readonly char[] _chars; private readonly int _startIndex; private readonly int _length; public char[] Chars { get { return _chars; } } public int StartIndex { get { return _startIndex; } } public int Length { get { return _length; } } public StringReference(char[] chars, int startIndex, int length) { _chars = chars; _startIndex = startIndex; _length = length; } public override string ToString() { return new string(_chars, _startIndex, _length); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/Base64Encoder.cs0000644000175000017500000000716112253423361027603 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.IO; namespace Newtonsoft.Json.Utilities { internal class Base64Encoder { private const int Base64LineSize = 76; private const int LineSizeInBytes = 57; private readonly char[] _charsLine = new char[Base64LineSize]; private readonly TextWriter _writer; private byte[] _leftOverBytes; private int _leftOverBytesCount; public Base64Encoder(TextWriter writer) { ValidationUtils.ArgumentNotNull(writer, "writer"); _writer = writer; } public void Encode(byte[] buffer, int index, int count) { if (buffer == null) throw new ArgumentNullException("buffer"); if (index < 0) throw new ArgumentOutOfRangeException("index"); if (count < 0) throw new ArgumentOutOfRangeException("count"); if (count > (buffer.Length - index)) throw new ArgumentOutOfRangeException("count"); if (_leftOverBytesCount > 0) { int leftOverBytesCount = _leftOverBytesCount; while (leftOverBytesCount < 3 && count > 0) { _leftOverBytes[leftOverBytesCount++] = buffer[index++]; count--; } if (count == 0 && leftOverBytesCount < 3) { _leftOverBytesCount = leftOverBytesCount; return; } int num2 = Convert.ToBase64CharArray(_leftOverBytes, 0, 3, _charsLine, 0); WriteChars(_charsLine, 0, num2); } _leftOverBytesCount = count % 3; if (_leftOverBytesCount > 0) { count -= _leftOverBytesCount; if (_leftOverBytes == null) { _leftOverBytes = new byte[3]; } for (int i = 0; i < _leftOverBytesCount; i++) { _leftOverBytes[i] = buffer[(index + count) + i]; } } int num4 = index + count; int length = LineSizeInBytes; while (index < num4) { if ((index + length) > num4) { length = num4 - index; } int num6 = Convert.ToBase64CharArray(buffer, index, length, _charsLine, 0); WriteChars(_charsLine, 0, num6); index += length; } } public void Flush() { if (_leftOverBytesCount > 0) { int count = Convert.ToBase64CharArray(_leftOverBytes, 0, _leftOverBytesCount, _charsLine, 0); WriteChars(_charsLine, 0, count); _leftOverBytesCount = 0; } } private void WriteChars(char[] chars, int index, int count) { _writer.Write(chars, index, count); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/StringUtils.cs0000644000175000017500000001333412253423361027545 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Globalization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Utilities { internal static class StringUtils { public const string CarriageReturnLineFeed = "\r\n"; public const string Empty = ""; public const char CarriageReturn = '\r'; public const char LineFeed = '\n'; public const char Tab = '\t'; public static string FormatWith(this string format, IFormatProvider provider, object arg0) { return format.FormatWith(provider, new[] { arg0 }); } public static string FormatWith(this string format, IFormatProvider provider, object arg0, object arg1) { return format.FormatWith(provider, new[] { arg0, arg1 }); } public static string FormatWith(this string format, IFormatProvider provider, object arg0, object arg1, object arg2) { return format.FormatWith(provider, new[] { arg0, arg1, arg2 }); } public static string FormatWith(this string format, IFormatProvider provider, params object[] args) { ValidationUtils.ArgumentNotNull(format, "format"); return string.Format(provider, format, args); } /// /// Determines whether the string is all white space. Empty string will return false. /// /// The string to test whether it is all white space. /// /// true if the string is all white space; otherwise, false. /// public static bool IsWhiteSpace(string s) { if (s == null) throw new ArgumentNullException("s"); if (s.Length == 0) return false; for (int i = 0; i < s.Length; i++) { if (!char.IsWhiteSpace(s[i])) return false; } return true; } /// /// Nulls an empty string. /// /// The string. /// Null if the string was null, otherwise the string unchanged. public static string NullEmptyString(string s) { return (string.IsNullOrEmpty(s)) ? null : s; } public static StringWriter CreateStringWriter(int capacity) { StringBuilder sb = new StringBuilder(capacity); StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture); return sw; } public static int? GetLength(string value) { if (value == null) return null; else return value.Length; } public static void ToCharAsUnicode(char c, char[] buffer) { buffer[0] = '\\'; buffer[1] = 'u'; buffer[2] = MathUtils.IntToHex((c >> 12) & '\x000f'); buffer[3] = MathUtils.IntToHex((c >> 8) & '\x000f'); buffer[4] = MathUtils.IntToHex((c >> 4) & '\x000f'); buffer[5] = MathUtils.IntToHex(c & '\x000f'); } public static TSource ForgivingCaseSensitiveFind(this IEnumerable source, Func valueSelector, string testValue) { if (source == null) throw new ArgumentNullException("source"); if (valueSelector == null) throw new ArgumentNullException("valueSelector"); var caseInsensitiveResults = source.Where(s => string.Equals(valueSelector(s), testValue, StringComparison.OrdinalIgnoreCase)); if (caseInsensitiveResults.Count() <= 1) { return caseInsensitiveResults.SingleOrDefault(); } else { // multiple results returned. now filter using case sensitivity var caseSensitiveResults = source.Where(s => string.Equals(valueSelector(s), testValue, StringComparison.Ordinal)); return caseSensitiveResults.SingleOrDefault(); } } public static string ToCamelCase(string s) { if (string.IsNullOrEmpty(s)) return s; if (!char.IsUpper(s[0])) return s; string camelCase = null; #if !(NETFX_CORE || PORTABLE) camelCase = char.ToLower(s[0], CultureInfo.InvariantCulture).ToString(CultureInfo.InvariantCulture); #else camelCase = char.ToLower(s[0]).ToString(); #endif if (s.Length > 1) camelCase += s.Substring(1); return camelCase; } public static bool IsHighSurrogate(char c) { #if !(SILVERLIGHT || PORTABLE) return char.IsHighSurrogate(c); #else return (c >= 55296 && c <= 56319); #endif } public static bool IsLowSurrogate(char c) { #if !(SILVERLIGHT || PORTABLE) return char.IsLowSurrogate(c); #else return (c >= 56320 && c <= 57343); #endif } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/MethodCall.cs0000644000175000017500000000237312253423361027273 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Utilities { internal delegate TResult MethodCall(T target, params object[] args); }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DynamicReflectionDelegateFactory.cs0000644000175000017500000002056512253423361033644 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || PORTABLE || NETFX_CORE) using System; using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif using System.Reflection; using System.Reflection.Emit; using Newtonsoft.Json.Serialization; using System.Globalization; namespace Newtonsoft.Json.Utilities { internal class DynamicReflectionDelegateFactory : ReflectionDelegateFactory { public static DynamicReflectionDelegateFactory Instance = new DynamicReflectionDelegateFactory(); private static DynamicMethod CreateDynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner) { DynamicMethod dynamicMethod = !owner.IsInterface() ? new DynamicMethod(name, returnType, parameterTypes, owner, true) : new DynamicMethod(name, returnType, parameterTypes, owner.Module, true); return dynamicMethod; } public override MethodCall CreateMethodCall(MethodBase method) { DynamicMethod dynamicMethod = CreateDynamicMethod(method.ToString(), typeof(object), new[] { typeof(object), typeof(object[]) }, method.DeclaringType); ILGenerator generator = dynamicMethod.GetILGenerator(); GenerateCreateMethodCallIL(method, generator); return (MethodCall)dynamicMethod.CreateDelegate(typeof(MethodCall)); } private void GenerateCreateMethodCallIL(MethodBase method, ILGenerator generator) { ParameterInfo[] args = method.GetParameters(); Label argsOk = generator.DefineLabel(); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldlen); generator.Emit(OpCodes.Ldc_I4, args.Length); generator.Emit(OpCodes.Beq, argsOk); generator.Emit(OpCodes.Newobj, typeof(TargetParameterCountException).GetConstructor(ReflectionUtils.EmptyTypes)); generator.Emit(OpCodes.Throw); generator.MarkLabel(argsOk); if (!method.IsConstructor && !method.IsStatic) generator.PushInstance(method.DeclaringType); for (int i = 0; i < args.Length; i++) { generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Ldelem_Ref); generator.UnboxIfNeeded(args[i].ParameterType); } if (method.IsConstructor) generator.Emit(OpCodes.Newobj, (ConstructorInfo)method); else if (method.IsFinal || !method.IsVirtual) generator.CallMethod((MethodInfo)method); Type returnType = method.IsConstructor ? method.DeclaringType : ((MethodInfo)method).ReturnType; if (returnType != typeof(void)) generator.BoxIfNeeded(returnType); else generator.Emit(OpCodes.Ldnull); generator.Return(); } public override Func CreateDefaultConstructor(Type type) { DynamicMethod dynamicMethod = CreateDynamicMethod("Create" + type.FullName, typeof(T), ReflectionUtils.EmptyTypes, type); dynamicMethod.InitLocals = true; ILGenerator generator = dynamicMethod.GetILGenerator(); GenerateCreateDefaultConstructorIL(type, generator); return (Func)dynamicMethod.CreateDelegate(typeof(Func)); } private void GenerateCreateDefaultConstructorIL(Type type, ILGenerator generator) { if (type.IsValueType()) { generator.DeclareLocal(type); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Box, type); } else { ConstructorInfo constructorInfo = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, ReflectionUtils.EmptyTypes, null); if (constructorInfo == null) throw new ArgumentException("Could not get constructor for {0}.".FormatWith(CultureInfo.InvariantCulture, type)); generator.Emit(OpCodes.Newobj, constructorInfo); } generator.Return(); } public override Func CreateGet(PropertyInfo propertyInfo) { DynamicMethod dynamicMethod = CreateDynamicMethod("Get" + propertyInfo.Name, typeof(T), new[] { typeof(object) }, propertyInfo.DeclaringType); ILGenerator generator = dynamicMethod.GetILGenerator(); GenerateCreateGetPropertyIL(propertyInfo, generator); return (Func)dynamicMethod.CreateDelegate(typeof(Func)); } private void GenerateCreateGetPropertyIL(PropertyInfo propertyInfo, ILGenerator generator) { MethodInfo getMethod = propertyInfo.GetGetMethod(true); if (getMethod == null) throw new ArgumentException("Property '{0}' does not have a getter.".FormatWith(CultureInfo.InvariantCulture, propertyInfo.Name)); if (!getMethod.IsStatic) generator.PushInstance(propertyInfo.DeclaringType); generator.CallMethod(getMethod); generator.BoxIfNeeded(propertyInfo.PropertyType); generator.Return(); } public override Func CreateGet(FieldInfo fieldInfo) { DynamicMethod dynamicMethod = CreateDynamicMethod("Get" + fieldInfo.Name, typeof(T), new[] { typeof(object) }, fieldInfo.DeclaringType); ILGenerator generator = dynamicMethod.GetILGenerator(); GenerateCreateGetFieldIL(fieldInfo, generator); return (Func)dynamicMethod.CreateDelegate(typeof(Func)); } private void GenerateCreateGetFieldIL(FieldInfo fieldInfo, ILGenerator generator) { if (!fieldInfo.IsStatic) generator.PushInstance(fieldInfo.DeclaringType); generator.Emit(OpCodes.Ldfld, fieldInfo); generator.BoxIfNeeded(fieldInfo.FieldType); generator.Return(); } public override Action CreateSet(FieldInfo fieldInfo) { DynamicMethod dynamicMethod = CreateDynamicMethod("Set" + fieldInfo.Name, null, new[] { typeof(T), typeof(object) }, fieldInfo.DeclaringType); ILGenerator generator = dynamicMethod.GetILGenerator(); GenerateCreateSetFieldIL(fieldInfo, generator); return (Action)dynamicMethod.CreateDelegate(typeof(Action)); } internal static void GenerateCreateSetFieldIL(FieldInfo fieldInfo, ILGenerator generator) { if (!fieldInfo.IsStatic) generator.PushInstance(fieldInfo.DeclaringType); generator.Emit(OpCodes.Ldarg_1); generator.UnboxIfNeeded(fieldInfo.FieldType); generator.Emit(OpCodes.Stfld, fieldInfo); generator.Return(); } public override Action CreateSet(PropertyInfo propertyInfo) { DynamicMethod dynamicMethod = CreateDynamicMethod("Set" + propertyInfo.Name, null, new[] { typeof(T), typeof(object) }, propertyInfo.DeclaringType); ILGenerator generator = dynamicMethod.GetILGenerator(); GenerateCreateSetPropertyIL(propertyInfo, generator); return (Action)dynamicMethod.CreateDelegate(typeof(Action)); } internal static void GenerateCreateSetPropertyIL(PropertyInfo propertyInfo, ILGenerator generator) { MethodInfo setMethod = propertyInfo.GetSetMethod(true); if (!setMethod.IsStatic) generator.PushInstance(propertyInfo.DeclaringType); generator.Emit(OpCodes.Ldarg_1); generator.UnboxIfNeeded(propertyInfo.PropertyType); generator.CallMethod(setMethod); generator.Return(); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DynamicProxyMetaObject.cs0000644000175000017500000003644012253423361031645 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace Newtonsoft.Json.Utilities { internal sealed class DynamicProxyMetaObject : DynamicMetaObject { private readonly DynamicProxy _proxy; private readonly bool _dontFallbackFirst; internal DynamicProxyMetaObject(Expression expression, T value, DynamicProxy proxy, bool dontFallbackFirst) : base(expression, BindingRestrictions.Empty, value) { _proxy = proxy; _dontFallbackFirst = dontFallbackFirst; } private new T Value { get { return (T)base.Value; } } private bool IsOverridden(string method) { return ReflectionUtils.IsMethodOverridden(_proxy.GetType(), typeof (DynamicProxy), method); } public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { return IsOverridden("TryGetMember") ? CallMethodWithResult("TryGetMember", binder, NoArgs, e => binder.FallbackGetMember(this, e)) : base.BindGetMember(binder); } public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { return IsOverridden("TrySetMember") ? CallMethodReturnLast("TrySetMember", binder, GetArgs(value), e => binder.FallbackSetMember(this, value, e)) : base.BindSetMember(binder, value); } public override DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder) { return IsOverridden("TryDeleteMember") ? CallMethodNoResult("TryDeleteMember", binder, NoArgs, e => binder.FallbackDeleteMember(this, e)) : base.BindDeleteMember(binder); } public override DynamicMetaObject BindConvert(ConvertBinder binder) { return IsOverridden("TryConvert") ? CallMethodWithResult("TryConvert", binder, NoArgs, e => binder.FallbackConvert(this, e)) : base.BindConvert(binder); } public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { if (!IsOverridden("TryInvokeMember")) return base.BindInvokeMember(binder, args); // // Generate a tree like: // // { // object result; // TryInvokeMember(payload, out result) // ? result // : TryGetMember(payload, out result) // ? FallbackInvoke(result) // : fallbackResult // } // // Then it calls FallbackInvokeMember with this tree as the // "error", giving the language the option of using this // tree or doing .NET binding. // Fallback fallback = e => binder.FallbackInvokeMember(this, args, e); DynamicMetaObject call = BuildCallMethodWithResult( "TryInvokeMember", binder, GetArgArray(args), BuildCallMethodWithResult( "TryGetMember", new GetBinderAdapter(binder), NoArgs, fallback(null), e => binder.FallbackInvoke(e, args, null) ), null ); return _dontFallbackFirst ? call : fallback(call); } public override DynamicMetaObject BindCreateInstance(CreateInstanceBinder binder, DynamicMetaObject[] args) { return IsOverridden("TryCreateInstance") ? CallMethodWithResult("TryCreateInstance", binder, GetArgArray(args), e => binder.FallbackCreateInstance(this, args, e)) : base.BindCreateInstance(binder, args); } public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { return IsOverridden("TryInvoke") ? CallMethodWithResult("TryInvoke", binder, GetArgArray(args), e => binder.FallbackInvoke(this, args, e)) : base.BindInvoke(binder, args); } public override DynamicMetaObject BindBinaryOperation(BinaryOperationBinder binder, DynamicMetaObject arg) { return IsOverridden("TryBinaryOperation") ? CallMethodWithResult("TryBinaryOperation", binder, GetArgs(arg), e => binder.FallbackBinaryOperation(this, arg, e)) : base.BindBinaryOperation(binder, arg); } public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder) { return IsOverridden("TryUnaryOperation") ? CallMethodWithResult("TryUnaryOperation", binder, NoArgs, e => binder.FallbackUnaryOperation(this, e)) : base.BindUnaryOperation(binder); } public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { return IsOverridden("TryGetIndex") ? CallMethodWithResult("TryGetIndex", binder, GetArgArray(indexes), e => binder.FallbackGetIndex(this, indexes, e)) : base.BindGetIndex(binder, indexes); } public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { return IsOverridden("TrySetIndex") ? CallMethodReturnLast("TrySetIndex", binder, GetArgArray(indexes, value), e => binder.FallbackSetIndex(this, indexes, value, e)) : base.BindSetIndex(binder, indexes, value); } public override DynamicMetaObject BindDeleteIndex(DeleteIndexBinder binder, DynamicMetaObject[] indexes) { return IsOverridden("TryDeleteIndex") ? CallMethodNoResult("TryDeleteIndex", binder, GetArgArray(indexes), e => binder.FallbackDeleteIndex(this, indexes, e)) : base.BindDeleteIndex(binder, indexes); } private delegate DynamicMetaObject Fallback(DynamicMetaObject errorSuggestion); private readonly static Expression[] NoArgs = new Expression[0]; private static Expression[] GetArgs(params DynamicMetaObject[] args) { return args.Select(arg => Expression.Convert(arg.Expression, typeof(object))).ToArray(); } private static Expression[] GetArgArray(DynamicMetaObject[] args) { return new[] { Expression.NewArrayInit(typeof(object), GetArgs(args)) }; } private static Expression[] GetArgArray(DynamicMetaObject[] args, DynamicMetaObject value) { return new Expression[] { Expression.NewArrayInit(typeof(object), GetArgs(args)), Expression.Convert(value.Expression, typeof(object)) }; } private static ConstantExpression Constant(DynamicMetaObjectBinder binder) { Type t = binder.GetType(); while (!t.IsVisible()) t = t.BaseType(); return Expression.Constant(binder, t); } /// /// Helper method for generating a MetaObject which calls a /// specific method on Dynamic that returns a result /// private DynamicMetaObject CallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback, Fallback fallbackInvoke = null) { // // First, call fallback to do default binding // This produces either an error or a call to a .NET member // DynamicMetaObject fallbackResult = fallback(null); DynamicMetaObject callDynamic = BuildCallMethodWithResult(methodName, binder, args, fallbackResult, fallbackInvoke); // // Now, call fallback again using our new MO as the error // When we do this, one of two things can happen: // 1. Binding will succeed, and it will ignore our call to // the dynamic method, OR // 2. Binding will fail, and it will use the MO we created // above. // return _dontFallbackFirst ? callDynamic : fallback(callDynamic); } private DynamicMetaObject BuildCallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, DynamicMetaObject fallbackResult, Fallback fallbackInvoke) { // // Build a new expression like: // { // object result; // TryGetMember(payload, out result) ? fallbackInvoke(result) : fallbackResult // } // ParameterExpression result = Expression.Parameter(typeof(object), null); IList callArgs = new List(); callArgs.Add(Expression.Convert(Expression, typeof(T))); callArgs.Add(Constant(binder)); callArgs.AddRange(args); callArgs.Add(result); DynamicMetaObject resultMetaObject = new DynamicMetaObject(result, BindingRestrictions.Empty); // Need to add a conversion if calling TryConvert if (binder.ReturnType != typeof (object)) { UnaryExpression convert = Expression.Convert(resultMetaObject.Expression, binder.ReturnType); // will always be a cast or unbox resultMetaObject = new DynamicMetaObject(convert, resultMetaObject.Restrictions); } if (fallbackInvoke != null) resultMetaObject = fallbackInvoke(resultMetaObject); DynamicMetaObject callDynamic = new DynamicMetaObject( Expression.Block( new[] {result}, Expression.Condition( Expression.Call( Expression.Constant(_proxy), typeof(DynamicProxy).GetMethod(methodName), callArgs ), resultMetaObject.Expression, fallbackResult.Expression, binder.ReturnType ) ), GetRestrictions().Merge(resultMetaObject.Restrictions).Merge(fallbackResult.Restrictions) ); return callDynamic; } /// /// Helper method for generating a MetaObject which calls a /// specific method on Dynamic, but uses one of the arguments for /// the result. /// private DynamicMetaObject CallMethodReturnLast(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) { // // First, call fallback to do default binding // This produces either an error or a call to a .NET member // DynamicMetaObject fallbackResult = fallback(null); // // Build a new expression like: // { // object result; // TrySetMember(payload, result = value) ? result : fallbackResult // } // ParameterExpression result = Expression.Parameter(typeof(object), null); IList callArgs = new List(); callArgs.Add(Expression.Convert(Expression, typeof (T))); callArgs.Add(Constant(binder)); callArgs.AddRange(args); callArgs[args.Length + 1] = Expression.Assign(result, callArgs[args.Length + 1]); DynamicMetaObject callDynamic = new DynamicMetaObject( Expression.Block( new[] { result }, Expression.Condition( Expression.Call( Expression.Constant(_proxy), typeof(DynamicProxy).GetMethod(methodName), callArgs ), result, fallbackResult.Expression, typeof(object) ) ), GetRestrictions().Merge(fallbackResult.Restrictions) ); // // Now, call fallback again using our new MO as the error // When we do this, one of two things can happen: // 1. Binding will succeed, and it will ignore our call to // the dynamic method, OR // 2. Binding will fail, and it will use the MO we created // above. // return _dontFallbackFirst ? callDynamic : fallback(callDynamic); } /// /// Helper method for generating a MetaObject which calls a /// specific method on Dynamic, but uses one of the arguments for /// the result. /// private DynamicMetaObject CallMethodNoResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) { // // First, call fallback to do default binding // This produces either an error or a call to a .NET member // DynamicMetaObject fallbackResult = fallback(null); IList callArgs = new List(); callArgs.Add(Expression.Convert(Expression, typeof(T))); callArgs.Add(Constant(binder)); callArgs.AddRange(args); // // Build a new expression like: // if (TryDeleteMember(payload)) { } else { fallbackResult } // DynamicMetaObject callDynamic = new DynamicMetaObject( Expression.Condition( Expression.Call( Expression.Constant(_proxy), typeof(DynamicProxy).GetMethod(methodName), callArgs ), Expression.Empty(), fallbackResult.Expression, typeof (void) ), GetRestrictions().Merge(fallbackResult.Restrictions) ); // // Now, call fallback again using our new MO as the error // When we do this, one of two things can happen: // 1. Binding will succeed, and it will ignore our call to // the dynamic method, OR // 2. Binding will fail, and it will use the MO we created // above. // return _dontFallbackFirst ? callDynamic : fallback(callDynamic); } /// /// Returns a Restrictions object which includes our current restrictions merged /// with a restriction limiting our type /// private BindingRestrictions GetRestrictions() { return (Value == null && HasValue) ? BindingRestrictions.GetInstanceRestriction(Expression, null) : BindingRestrictions.GetTypeRestriction(Expression, LimitType); } public override IEnumerable GetDynamicMemberNames() { return _proxy.GetDynamicMemberNames(Value); } // It is okay to throw NotSupported from this binder. This object // is only used by DynamicObject.GetMember--it is not expected to // (and cannot) implement binding semantics. It is just so the DO // can use the Name and IgnoreCase properties. private sealed class GetBinderAdapter : GetMemberBinder { internal GetBinderAdapter(InvokeMemberBinder binder) : base(binder.Name, binder.IgnoreCase) { } public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { throw new NotSupportedException(); } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ThreadSafeStore.cs0000644000175000017500000000475512253423361030310 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Utilities { internal class ThreadSafeStore { private readonly object _lock = new object(); private Dictionary _store; private readonly Func _creator; public ThreadSafeStore(Func creator) { if (creator == null) throw new ArgumentNullException("creator"); _creator = creator; } public TValue Get(TKey key) { if (_store == null) return AddValue(key); TValue value; if (!_store.TryGetValue(key, out value)) return AddValue(key); return value; } private TValue AddValue(TKey key) { TValue value = _creator(key); lock (_lock) { if (_store == null) { _store = new Dictionary(); _store[key] = value; } else { // double check locking TValue checkValue; if (_store.TryGetValue(key, out checkValue)) return checkValue; Dictionary newStore = new Dictionary(_store); newStore[key] = value; _store = newStore; } return value; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/StringBuffer.cs0000644000175000017500000000543112253423361027655 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Utilities { /// /// Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer. /// internal class StringBuffer { private char[] _buffer; private int _position; private static readonly char[] EmptyBuffer = new char[0]; public int Position { get { return _position; } set { _position = value; } } public StringBuffer() { _buffer = EmptyBuffer; } public StringBuffer(int initalSize) { _buffer = new char[initalSize]; } public void Append(char value) { // test if the buffer array is large enough to take the value if (_position == _buffer.Length) EnsureSize(1); // set value and increment poisition _buffer[_position++] = value; } public void Append(char[] buffer, int startIndex, int count) { if (_position + count >= _buffer.Length) EnsureSize(count); Array.Copy(buffer, startIndex, _buffer, _position, count); _position += count; } public void Clear() { _buffer = EmptyBuffer; _position = 0; } private void EnsureSize(int appendLength) { char[] newBuffer = new char[(_position + appendLength) * 2]; Array.Copy(_buffer, newBuffer, _position); _buffer = newBuffer; } public override string ToString() { return ToString(0, _position); } public string ToString(int start, int length) { // TODO: validation return new string(_buffer, start, length); } public char[] GetInternalBuffer() { return _buffer; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/JavaScriptUtils.cs0000644000175000017500000001205612253423361030345 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Globalization; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Collections.Generic; namespace Newtonsoft.Json.Utilities { internal static class JavaScriptUtils { private const string EscapedUnicodeText = "!"; public static void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter, bool appendDelimiters) { // leading delimiter if (appendDelimiters) writer.Write(delimiter); if (s != null) { char[] chars = null; char[] unicodeBuffer = null; int lastWritePosition = 0; for (int i = 0; i < s.Length; i++) { var c = s[i]; // don't escape standard text/numbers except '\' and the text delimiter if (c >= ' ' && c < 128 && c != '\\' && c != delimiter) continue; string escapedValue; switch (c) { case '\t': escapedValue = @"\t"; break; case '\n': escapedValue = @"\n"; break; case '\r': escapedValue = @"\r"; break; case '\f': escapedValue = @"\f"; break; case '\b': escapedValue = @"\b"; break; case '\\': escapedValue = @"\\"; break; case '\u0085': // Next Line escapedValue = @"\u0085"; break; case '\u2028': // Line Separator escapedValue = @"\u2028"; break; case '\u2029': // Paragraph Separator escapedValue = @"\u2029"; break; case '\'': // this charater is being used as the delimiter escapedValue = @"\'"; break; case '"': // this charater is being used as the delimiter escapedValue = "\\\""; break; default: if (c <= '\u001f') { if (unicodeBuffer == null) unicodeBuffer = new char[6]; StringUtils.ToCharAsUnicode(c, unicodeBuffer); // slightly hacky but it saves multiple conditions in if test escapedValue = EscapedUnicodeText; } else { escapedValue = null; } break; } if (escapedValue == null) continue; if (i > lastWritePosition) { if (chars == null) chars = s.ToCharArray(); // write unchanged chars before writing escaped text writer.Write(chars, lastWritePosition, i - lastWritePosition); } lastWritePosition = i + 1; if (!string.Equals(escapedValue, EscapedUnicodeText)) writer.Write(escapedValue); else writer.Write(unicodeBuffer); } if (lastWritePosition == 0) { // no escaped text, write entire string writer.Write(s); } else { if (chars == null) chars = s.ToCharArray(); // write remaining text writer.Write(chars, lastWritePosition, s.Length - lastWritePosition); } } // trailing delimiter if (appendDelimiters) writer.Write(delimiter); } public static string ToEscapedJavaScriptString(string value) { return ToEscapedJavaScriptString(value, '"', true); } public static string ToEscapedJavaScriptString(string value, char delimiter, bool appendDelimiters) { using (StringWriter w = StringUtils.CreateStringWriter(StringUtils.GetLength(value) ?? 16)) { WriteEscapedJavaScriptString(w, value, delimiter, appendDelimiters); return w.ToString(); } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DynamicProxy.cs0000644000175000017500000000635712253423361027713 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace Newtonsoft.Json.Utilities { internal class DynamicProxy { public virtual IEnumerable GetDynamicMemberNames(T instance) { return new string[0]; } public virtual bool TryBinaryOperation(T instance, BinaryOperationBinder binder, object arg, out object result) { result = null; return false; } public virtual bool TryConvert(T instance, ConvertBinder binder, out object result) { result = null; return false; } public virtual bool TryCreateInstance(T instance, CreateInstanceBinder binder, object[] args, out object result) { result = null; return false; } public virtual bool TryDeleteIndex(T instance, DeleteIndexBinder binder, object[] indexes) { return false; } public virtual bool TryDeleteMember(T instance, DeleteMemberBinder binder) { return false; } public virtual bool TryGetIndex(T instance, GetIndexBinder binder, object[] indexes, out object result) { result = null; return false; } public virtual bool TryGetMember(T instance, GetMemberBinder binder, out object result) { result = null; return false; } public virtual bool TryInvoke(T instance, InvokeBinder binder, object[] args, out object result) { result = null; return false; } public virtual bool TryInvokeMember(T instance, InvokeMemberBinder binder, object[] args, out object result) { result = null; return false; } public virtual bool TrySetIndex(T instance, SetIndexBinder binder, object[] indexes, object value) { return false; } public virtual bool TrySetMember(T instance, SetMemberBinder binder, object value) { return false; } public virtual bool TryUnaryOperation(T instance, UnaryOperationBinder binder, out object result) { result = null; return false; } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/BidirectionalDictionary.cs0000644000175000017500000000464112253423361032055 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; namespace Newtonsoft.Json.Utilities { internal class BidirectionalDictionary { private readonly IDictionary _firstToSecond; private readonly IDictionary _secondToFirst; public BidirectionalDictionary() : this(EqualityComparer.Default, EqualityComparer.Default) { } public BidirectionalDictionary(IEqualityComparer firstEqualityComparer, IEqualityComparer secondEqualityComparer) { _firstToSecond = new Dictionary(firstEqualityComparer); _secondToFirst = new Dictionary(secondEqualityComparer); } public void Add(TFirst first, TSecond second) { if (_firstToSecond.ContainsKey(first) || _secondToFirst.ContainsKey(second)) { throw new ArgumentException("Duplicate first or second"); } _firstToSecond.Add(first, second); _secondToFirst.Add(second, first); } public bool TryGetByFirst(TFirst first, out TSecond second) { return _firstToSecond.TryGetValue(first, out second); } public bool TryGetBySecond(TSecond second, out TFirst first) { return _secondToFirst.TryGetValue(second, out first); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/MiscellaneousUtils.cs0000644000175000017500000001323612253423361031103 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using System.Text; using System.Globalization; namespace Newtonsoft.Json.Utilities { internal delegate T Creator(); internal static class MiscellaneousUtils { public static bool ValueEquals(object objA, object objB) { if (objA == null && objB == null) return true; if (objA != null && objB == null) return false; if (objA == null && objB != null) return false; // comparing an Int32 and Int64 both of the same value returns false // make types the same then compare if (objA.GetType() != objB.GetType()) { if (ConvertUtils.IsInteger(objA) && ConvertUtils.IsInteger(objB)) return Convert.ToDecimal(objA, CultureInfo.CurrentCulture).Equals(Convert.ToDecimal(objB, CultureInfo.CurrentCulture)); else if ((objA is double || objA is float || objA is decimal) && (objB is double || objB is float || objB is decimal)) return MathUtils.ApproxEquals(Convert.ToDouble(objA, CultureInfo.CurrentCulture), Convert.ToDouble(objB, CultureInfo.CurrentCulture)); else return false; } return objA.Equals(objB); } public static ArgumentOutOfRangeException CreateArgumentOutOfRangeException(string paramName, object actualValue, string message) { string newMessage = message + Environment.NewLine + @"Actual value was {0}.".FormatWith(CultureInfo.InvariantCulture, actualValue); return new ArgumentOutOfRangeException(paramName, newMessage); } public static bool TryAction(Creator creator, out T output) { ValidationUtils.ArgumentNotNull(creator, "creator"); try { output = creator(); return true; } catch { output = default(T); return false; } } public static string ToString(object value) { if (value == null) return "{null}"; return (value is string) ? @"""" + value.ToString() + @"""" : value.ToString(); } public static byte[] HexToBytes(string hex) { string fixedHex = hex.Replace("-", string.Empty); // array to put the result in byte[] bytes = new byte[fixedHex.Length / 2]; // variable to determine shift of high/low nibble int shift = 4; // offset of the current byte in the array int offset = 0; // loop the characters in the string foreach (char c in fixedHex) { // get character code in range 0-9, 17-22 // the % 32 handles lower case characters int b = (c - '0') % 32; // correction for a-f if (b > 9) b -= 7; // store nibble (4 bits) in byte array bytes[offset] |= (byte)(b << shift); // toggle the shift variable between 0 and 4 shift ^= 4; // move to next byte if (shift != 0) offset++; } return bytes; } public static string BytesToHex(byte[] bytes) { return BytesToHex(bytes, false); } public static string BytesToHex(byte[] bytes, bool removeDashes) { string hex = BitConverter.ToString(bytes); if (removeDashes) hex = hex.Replace("-", ""); return hex; } public static int ByteArrayCompare(byte[] a1, byte[] a2) { int lengthCompare = a1.Length.CompareTo(a2.Length); if (lengthCompare != 0) return lengthCompare; for (int i = 0; i < a1.Length; i++) { int valueCompare = a1[i].CompareTo(a2[i]); if (valueCompare != 0) return valueCompare; } return 0; } public static string GetPrefix(string qualifiedName) { string prefix; string localName; GetQualifiedNameParts(qualifiedName, out prefix, out localName); return prefix; } public static string GetLocalName(string qualifiedName) { string prefix; string localName; GetQualifiedNameParts(qualifiedName, out prefix, out localName); return localName; } public static void GetQualifiedNameParts(string qualifiedName, out string prefix, out string localName) { int colonPosition = qualifiedName.IndexOf(':'); if ((colonPosition == -1 || colonPosition == 0) || (qualifiedName.Length - 1) == colonPosition) { prefix = null; localName = qualifiedName; } else { prefix = qualifiedName.Substring(0, colonPosition); localName = qualifiedName.Substring(colonPosition + 1); } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DateTimeUtils.cs0000644000175000017500000000444712253423361030000 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Xml; using System.Globalization; namespace Newtonsoft.Json.Utilities { internal static class DateTimeUtils { public static string GetUtcOffsetText(this DateTime d) { TimeSpan utcOffset = d.GetUtcOffset(); return utcOffset.Hours.ToString("+00;-00", CultureInfo.InvariantCulture) + ":" + utcOffset.Minutes.ToString("00;00", CultureInfo.InvariantCulture); } public static TimeSpan GetUtcOffset(this DateTime d) { #if NET20 return TimeZone.CurrentTimeZone.GetUtcOffset(d); #else return TimeZoneInfo.Local.GetUtcOffset(d); #endif } #if !(NETFX_CORE || PORTABLE) public static XmlDateTimeSerializationMode ToSerializationMode(DateTimeKind kind) { switch (kind) { case DateTimeKind.Local: return XmlDateTimeSerializationMode.Local; case DateTimeKind.Unspecified: return XmlDateTimeSerializationMode.Unspecified; case DateTimeKind.Utc: return XmlDateTimeSerializationMode.Utc; default: throw MiscellaneousUtils.CreateArgumentOutOfRangeException("kind", kind, "Unexpected DateTimeKind value."); } } #endif } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ListWrapper.cs0000644000175000017500000001045312253423361027531 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections; using System.Collections.Generic; namespace Newtonsoft.Json.Utilities { internal interface IWrappedList : IList { object UnderlyingList { get; } } internal class ListWrapper : CollectionWrapper, IList, IWrappedList { private readonly IList _genericList; public ListWrapper(IList list) : base(list) { ValidationUtils.ArgumentNotNull(list, "list"); if (list is IList) _genericList = (IList) list; } public ListWrapper(IList list) : base(list) { ValidationUtils.ArgumentNotNull(list, "list"); _genericList = list; } public int IndexOf(T item) { if (_genericList != null) return _genericList.IndexOf(item); else return ((IList)this).IndexOf(item); } public void Insert(int index, T item) { if (_genericList != null) _genericList.Insert(index, item); else ((IList)this).Insert(index, item); } public void RemoveAt(int index) { if (_genericList != null) _genericList.RemoveAt(index); else ((IList)this).RemoveAt(index); } public T this[int index] { get { if (_genericList != null) return _genericList[index]; else return (T)((IList)this)[index]; } set { if (_genericList != null) _genericList[index] = value; else ((IList)this)[index] = value; } } public override void Add(T item) { if (_genericList != null) _genericList.Add(item); else base.Add(item); } public override void Clear() { if (_genericList != null) _genericList.Clear(); else base.Clear(); } public override bool Contains(T item) { if (_genericList != null) return _genericList.Contains(item); else return base.Contains(item); } public override void CopyTo(T[] array, int arrayIndex) { if (_genericList != null) _genericList.CopyTo(array, arrayIndex); else base.CopyTo(array, arrayIndex); } public override int Count { get { if (_genericList != null) return _genericList.Count; else return base.Count; } } public override bool IsReadOnly { get { if (_genericList != null) return _genericList.IsReadOnly; else return base.IsReadOnly; } } public override bool Remove(T item) { if (_genericList != null) { return _genericList.Remove(item); } else { bool contains = base.Contains(item); if (contains) base.Remove(item); return contains; } } public override IEnumerator GetEnumerator() { if (_genericList != null) return _genericList.GetEnumerator(); return base.GetEnumerator(); } public object UnderlyingList { get { if (_genericList != null) return _genericList; else return UnderlyingCollection; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DynamicUtils.cs0000644000175000017500000002241712253423361027665 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Globalization; using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Utilities { internal static class DynamicUtils { internal static class BinderWrapper { #if !SILVERLIGHT public const string CSharpAssemblyName = "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; #else public const string CSharpAssemblyName = "Microsoft.CSharp, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; #endif private const string BinderTypeName = "Microsoft.CSharp.RuntimeBinder.Binder, " + CSharpAssemblyName; private const string CSharpArgumentInfoTypeName = "Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo, " + CSharpAssemblyName; private const string CSharpArgumentInfoFlagsTypeName = "Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, " + CSharpAssemblyName; private const string CSharpBinderFlagsTypeName = "Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags, " + CSharpAssemblyName; private static object _getCSharpArgumentInfoArray; private static object _setCSharpArgumentInfoArray; private static MethodCall _getMemberCall; private static MethodCall _setMemberCall; private static bool _init; private static void Init() { if (!_init) { Type binderType = Type.GetType(BinderTypeName, false); if (binderType == null) throw new InvalidOperationException("Could not resolve type '{0}'. You may need to add a reference to Microsoft.CSharp.dll to work with dynamic types.".FormatWith(CultureInfo.InvariantCulture, BinderTypeName)); // None _getCSharpArgumentInfoArray = CreateSharpArgumentInfoArray(0); // None, Constant | UseCompileTimeType _setCSharpArgumentInfoArray = CreateSharpArgumentInfoArray(0, 3); CreateMemberCalls(); _init = true; } } private static object CreateSharpArgumentInfoArray(params int[] values) { Type csharpArgumentInfoType = Type.GetType(CSharpArgumentInfoTypeName); Type csharpArgumentInfoFlags = Type.GetType(CSharpArgumentInfoFlagsTypeName); Array a = Array.CreateInstance(csharpArgumentInfoType, values.Length); for (int i = 0; i < values.Length; i++) { MethodInfo createArgumentInfoMethod = csharpArgumentInfoType.GetMethod("Create", BindingFlags.Public | BindingFlags.Static, null, new[] { csharpArgumentInfoFlags, typeof(string) }, null); object arg = createArgumentInfoMethod.Invoke(null, new object[] { 0, null }); a.SetValue(arg, i); } return a; } private static void CreateMemberCalls() { Type csharpArgumentInfoType = Type.GetType(CSharpArgumentInfoTypeName); Type csharpBinderFlagsType = Type.GetType(CSharpBinderFlagsTypeName); Type binderType = Type.GetType(BinderTypeName); Type csharpArgumentInfoTypeEnumerableType = typeof(IEnumerable<>).MakeGenericType(csharpArgumentInfoType); MethodInfo getMemberMethod = binderType.GetMethod("GetMember", BindingFlags.Public | BindingFlags.Static, null, new[] { csharpBinderFlagsType, typeof(string), typeof(Type), csharpArgumentInfoTypeEnumerableType }, null); _getMemberCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(getMemberMethod); MethodInfo setMemberMethod = binderType.GetMethod("SetMember", BindingFlags.Public | BindingFlags.Static, null, new[] { csharpBinderFlagsType, typeof(string), typeof(Type), csharpArgumentInfoTypeEnumerableType }, null); _setMemberCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(setMemberMethod); } public static CallSiteBinder GetMember(string name, Type context) { Init(); return (CallSiteBinder)_getMemberCall(null, 0, name, context, _getCSharpArgumentInfoArray); } public static CallSiteBinder SetMember(string name, Type context) { Init(); return (CallSiteBinder)_setMemberCall(null, 0, name, context, _setCSharpArgumentInfoArray); } } public static bool TryGetMember(this IDynamicMetaObjectProvider dynamicProvider, string name, out object value) { ValidationUtils.ArgumentNotNull(dynamicProvider, "dynamicProvider"); GetMemberBinder getMemberBinder = (GetMemberBinder) BinderWrapper.GetMember(name, typeof (DynamicUtils)); CallSite> callSite = CallSite>.Create(new NoThrowGetBinderMember(getMemberBinder)); object result = callSite.Target(callSite, dynamicProvider); if (!ReferenceEquals(result, NoThrowExpressionVisitor.ErrorResult)) { value = result; return true; } else { value = null; return false; } } public static bool TrySetMember(this IDynamicMetaObjectProvider dynamicProvider, string name, object value) { ValidationUtils.ArgumentNotNull(dynamicProvider, "dynamicProvider"); SetMemberBinder binder = (SetMemberBinder)BinderWrapper.SetMember(name, typeof(DynamicUtils)); var setterSite = CallSite>.Create(new NoThrowSetBinderMember(binder)); object result = setterSite.Target(setterSite, dynamicProvider, value); return !ReferenceEquals(result, NoThrowExpressionVisitor.ErrorResult); } public static IEnumerable GetDynamicMemberNames(this IDynamicMetaObjectProvider dynamicProvider) { DynamicMetaObject metaObject = dynamicProvider.GetMetaObject(Expression.Constant(dynamicProvider)); return metaObject.GetDynamicMemberNames(); } internal class NoThrowGetBinderMember : GetMemberBinder { private readonly GetMemberBinder _innerBinder; public NoThrowGetBinderMember(GetMemberBinder innerBinder) : base(innerBinder.Name, innerBinder.IgnoreCase) { _innerBinder = innerBinder; } public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { DynamicMetaObject retMetaObject = _innerBinder.Bind(target, new DynamicMetaObject[] { }); NoThrowExpressionVisitor noThrowVisitor = new NoThrowExpressionVisitor(); Expression resultExpression = noThrowVisitor.Visit(retMetaObject.Expression); DynamicMetaObject finalMetaObject = new DynamicMetaObject(resultExpression, retMetaObject.Restrictions); return finalMetaObject; } } internal class NoThrowSetBinderMember : SetMemberBinder { private readonly SetMemberBinder _innerBinder; public NoThrowSetBinderMember(SetMemberBinder innerBinder) : base(innerBinder.Name, innerBinder.IgnoreCase) { _innerBinder = innerBinder; } public override DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion) { DynamicMetaObject retMetaObject = _innerBinder.Bind(target, new DynamicMetaObject[] { value }); NoThrowExpressionVisitor noThrowVisitor = new NoThrowExpressionVisitor(); Expression resultExpression = noThrowVisitor.Visit(retMetaObject.Expression); DynamicMetaObject finalMetaObject = new DynamicMetaObject(resultExpression, retMetaObject.Restrictions); return finalMetaObject; } } internal class NoThrowExpressionVisitor : ExpressionVisitor { internal static readonly object ErrorResult = new object(); protected override Expression VisitConditional(ConditionalExpression node) { // if the result of a test is to throw an error, rewrite to result an error result value if (node.IfFalse.NodeType == ExpressionType.Throw) return Expression.Condition(node.Test, node.IfTrue, Expression.Constant(ErrorResult)); return base.VisitConditional(node); } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/EnumValue.cs0000644000175000017500000000300112253423361027145 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Utilities { internal class EnumValue where T : struct { private readonly string _name; private readonly T _value; public string Name { get { return _name; } } public T Value { get { return _value; } } public EnumValue(string name, T value) { _name = name; _value = value; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ILGeneratorExtensions.cs0000644000175000017500000000462512253423361031514 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || PORTABLE || NETFX_CORE) using System; using System.Reflection.Emit; using System.Reflection; namespace Newtonsoft.Json.Utilities { internal static class ILGeneratorExtensions { public static void PushInstance(this ILGenerator generator, Type type) { generator.Emit(OpCodes.Ldarg_0); if (type.IsValueType()) generator.Emit(OpCodes.Unbox, type); else generator.Emit(OpCodes.Castclass, type); } public static void BoxIfNeeded(this ILGenerator generator, Type type) { if (type.IsValueType()) generator.Emit(OpCodes.Box, type); else generator.Emit(OpCodes.Castclass, type); } public static void UnboxIfNeeded(this ILGenerator generator, Type type) { if (type.IsValueType()) generator.Emit(OpCodes.Unbox_Any, type); else generator.Emit(OpCodes.Castclass, type); } public static void CallMethod(this ILGenerator generator, MethodInfo methodInfo) { if (methodInfo.IsFinal || !methodInfo.IsVirtual) generator.Emit(OpCodes.Call, methodInfo); else generator.Emit(OpCodes.Callvirt, methodInfo); } public static void Return(this ILGenerator generator) { generator.Emit(OpCodes.Ret); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs0000644000175000017500000003763612253423361027732 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.ComponentModel; using Newtonsoft.Json.Serialization; using System.Reflection; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System.Data.SqlTypes; #endif #if NETFX_CORE using IConvertible = Newtonsoft.Json.Utilities.Convertible; #endif namespace Newtonsoft.Json.Utilities { #if NETFX_CORE internal class Convertible { private object _underlyingValue; public Convertible(object o) { _underlyingValue = o; } public TypeCode GetTypeCode() { return ConvertUtils.GetTypeCode(_underlyingValue); } public bool ToBoolean(IFormatProvider provider) { return Convert.ToBoolean(_underlyingValue, provider); } public byte ToByte(IFormatProvider provider) { return Convert.ToByte(_underlyingValue, provider); } public char ToChar(IFormatProvider provider) { return Convert.ToChar(_underlyingValue, provider); } public DateTime ToDateTime(IFormatProvider provider) { return Convert.ToDateTime(_underlyingValue, provider); } public decimal ToDecimal(IFormatProvider provider) { return Convert.ToDecimal(_underlyingValue, provider); } public double ToDouble(IFormatProvider provider) { return Convert.ToDouble(_underlyingValue, provider); } public short ToInt16(IFormatProvider provider) { return Convert.ToInt16(_underlyingValue, provider); } public int ToInt32(IFormatProvider provider) { return Convert.ToInt32(_underlyingValue, provider); } public long ToInt64(IFormatProvider provider) { return Convert.ToInt64(_underlyingValue, provider); } public sbyte ToSByte(IFormatProvider provider) { return Convert.ToSByte(_underlyingValue, provider); } public float ToSingle(IFormatProvider provider) { return Convert.ToSingle(_underlyingValue, provider); } public string ToString(IFormatProvider provider) { return Convert.ToString(_underlyingValue, provider); } public object ToType(Type conversionType, IFormatProvider provider) { return Convert.ChangeType(_underlyingValue, conversionType, provider); } public ushort ToUInt16(IFormatProvider provider) { return Convert.ToUInt16(_underlyingValue, provider); } public uint ToUInt32(IFormatProvider provider) { return Convert.ToUInt32(_underlyingValue, provider); } public ulong ToUInt64(IFormatProvider provider) { return Convert.ToUInt64(_underlyingValue, provider); } } #endif internal static class ConvertUtils { public static TypeCode GetTypeCode(this IConvertible convertible) { #if !NETFX_CORE return convertible.GetTypeCode(); #else return GetTypeCode((object)convertible); #endif } public static TypeCode GetTypeCode(object o) { #if !(NETFX_CORE || PORTABLE) return System.Convert.GetTypeCode(o); #else return GetTypeCode(o.GetType()); #endif } public static TypeCode GetTypeCode(Type t) { #if !NETFX_CORE return Type.GetTypeCode(t); #else if (t == typeof(bool)) return TypeCode.Boolean; if (t == typeof(byte)) return TypeCode.Byte; if (t == typeof(char)) return TypeCode.Char; if (t == typeof(DateTime)) return TypeCode.DateTime; if (t == typeof(decimal)) return TypeCode.Decimal; if (t == typeof(double)) return TypeCode.Double; if (t == typeof(short)) return TypeCode.Int16; if (t == typeof(int)) return TypeCode.Int32; if (t == typeof(long)) return TypeCode.Int64; if (t == typeof(sbyte)) return TypeCode.SByte; if (t == typeof(float)) return TypeCode.Single; if (t == typeof(string)) return TypeCode.String; if (t == typeof(ushort)) return TypeCode.UInt16; if (t == typeof(uint)) return TypeCode.UInt32; if (t == typeof(ulong)) return TypeCode.UInt64; if (t.IsEnum()) return GetTypeCode(Enum.GetUnderlyingType(t)); return TypeCode.Object; #endif } public static IConvertible ToConvertible(object o) { #if !NETFX_CORE return o as IConvertible; #else if (!IsConvertible(o)) return null; return new IConvertible(o); #endif } public static bool IsConvertible(object o) { #if !NETFX_CORE return o is IConvertible; #else if (o == null) return false; return ( o is bool || o is byte || o is char || o is DateTime || o is decimal || o is double || o is short || o is int || o is long || o is sbyte || o is float || o is string || o is ushort || o is uint || o is ulong || o is Enum); #endif } public static bool IsConvertible(Type t) { #if !NETFX_CORE return typeof(IConvertible).IsAssignableFrom(t); #else return ( t == typeof(bool) || t == typeof(byte) || t == typeof(char) || t == typeof(DateTime) || t == typeof(decimal) || t == typeof(double) || t == typeof(short) || t == typeof(int) || t == typeof(long) || t == typeof(sbyte) || t == typeof(float) || t == typeof(string) || t == typeof(ushort) || t == typeof(uint) || t == typeof(ulong) || t.IsEnum()); #endif } internal struct TypeConvertKey : IEquatable { private readonly Type _initialType; private readonly Type _targetType; public Type InitialType { get { return _initialType; } } public Type TargetType { get { return _targetType; } } public TypeConvertKey(Type initialType, Type targetType) { _initialType = initialType; _targetType = targetType; } public override int GetHashCode() { return _initialType.GetHashCode() ^ _targetType.GetHashCode(); } public override bool Equals(object obj) { if (!(obj is TypeConvertKey)) return false; return Equals((TypeConvertKey)obj); } public bool Equals(TypeConvertKey other) { return (_initialType == other._initialType && _targetType == other._targetType); } } private static readonly ThreadSafeStore> CastConverters = new ThreadSafeStore>(CreateCastConverter); private static Func CreateCastConverter(TypeConvertKey t) { MethodInfo castMethodInfo = t.TargetType.GetMethod("op_Implicit", new[] { t.InitialType }); if (castMethodInfo == null) castMethodInfo = t.TargetType.GetMethod("op_Explicit", new[] { t.InitialType }); if (castMethodInfo == null) return null; MethodCall call = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall(castMethodInfo); return o => call(null, o); } #region Convert /// /// Converts the value to the specified type. /// /// The value to convert. /// The culture to use when converting. /// The type to convert the value to. /// The converted type. public static object Convert(object initialValue, CultureInfo culture, Type targetType) { if (initialValue == null) throw new ArgumentNullException("initialValue"); if (ReflectionUtils.IsNullableType(targetType)) targetType = Nullable.GetUnderlyingType(targetType); Type initialType = initialValue.GetType(); if (targetType == initialType) return initialValue; // use Convert.ChangeType if both types are IConvertible if (ConvertUtils.IsConvertible(initialValue) && ConvertUtils.IsConvertible(targetType)) { if (targetType.IsEnum()) { if (initialValue is string) return Enum.Parse(targetType, initialValue.ToString(), true); else if (IsInteger(initialValue)) return Enum.ToObject(targetType, initialValue); } return System.Convert.ChangeType(initialValue, targetType, culture); } if (initialValue is string && typeof(Type).IsAssignableFrom(targetType)) return Type.GetType((string) initialValue, true); if (targetType.IsInterface() || targetType.IsGenericTypeDefinition() || targetType.IsAbstract()) throw new ArgumentException("Target type {0} is not a value type or a non-abstract class.".FormatWith(CultureInfo.InvariantCulture, targetType), "targetType"); #if !PocketPC && !NET20 if (initialValue is DateTime && targetType == typeof(DateTimeOffset)) return new DateTimeOffset((DateTime)initialValue); #endif if (initialValue is string) { if (targetType == typeof (Guid)) return new Guid((string) initialValue); if (targetType == typeof (Uri)) return new Uri((string) initialValue, UriKind.RelativeOrAbsolute); if (targetType == typeof (TimeSpan)) #if !(NET35 || NET20 || SILVERLIGHT || PORTABLE) return TimeSpan.Parse((string) initialValue, CultureInfo.InvariantCulture); #else return TimeSpan.Parse((string)initialValue); #endif } #if !(NETFX_CORE || PORTABLE) // see if source or target types have a TypeConverter that converts between the two TypeConverter toConverter = GetConverter(initialType); if (toConverter != null && toConverter.CanConvertTo(targetType)) { #if !SILVERLIGHT return toConverter.ConvertTo(null, culture, initialValue, targetType); #else return toConverter.ConvertTo(initialValue, targetType); #endif } TypeConverter fromConverter = GetConverter(targetType); if (fromConverter != null && fromConverter.CanConvertFrom(initialType)) { #if !SILVERLIGHT return fromConverter.ConvertFrom(null, culture, initialValue); #else return fromConverter.ConvertFrom(initialValue); #endif } #endif #if !(NETFX_CORE || PORTABLE) // handle DBNull and INullable if (initialValue == DBNull.Value) { if (ReflectionUtils.IsNullable(targetType)) return EnsureTypeAssignable(null, initialType, targetType); throw new Exception("Can not convert null {0} into non-nullable {1}.".FormatWith(CultureInfo.InvariantCulture, initialType, targetType)); } #endif #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) if (initialValue is INullable) return EnsureTypeAssignable(ToValue((INullable)initialValue), initialType, targetType); #endif throw new InvalidOperationException("Can not convert from {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, initialType, targetType)); } #endregion #region TryConvert /// /// Converts the value to the specified type. /// /// The value to convert. /// The culture to use when converting. /// The type to convert the value to. /// The converted value if the conversion was successful or the default value of T if it failed. /// /// true if initialValue was converted successfully; otherwise, false. /// public static bool TryConvert(object initialValue, CultureInfo culture, Type targetType, out object convertedValue) { return MiscellaneousUtils.TryAction(delegate { return Convert(initialValue, culture, targetType); }, out convertedValue); } #endregion #region ConvertOrCast /// /// Converts the value to the specified type. If the value is unable to be converted, the /// value is checked whether it assignable to the specified type. /// /// The value to convert. /// The culture to use when converting. /// The type to convert or cast the value to. /// /// The converted type. If conversion was unsuccessful, the initial value /// is returned if assignable to the target type. /// public static object ConvertOrCast(object initialValue, CultureInfo culture, Type targetType) { object convertedValue; if (targetType == typeof(object)) return initialValue; if (initialValue == null && ReflectionUtils.IsNullable(targetType)) return null; if (TryConvert(initialValue, culture, targetType, out convertedValue)) return convertedValue; return EnsureTypeAssignable(initialValue, ReflectionUtils.GetObjectType(initialValue), targetType); } #endregion private static object EnsureTypeAssignable(object value, Type initialType, Type targetType) { Type valueType = (value != null) ? value.GetType() : null; if (value != null) { if (targetType.IsAssignableFrom(valueType)) return value; Func castConverter = CastConverters.Get(new TypeConvertKey(valueType, targetType)); if (castConverter != null) return castConverter(value); } else { if (ReflectionUtils.IsNullable(targetType)) return null; } throw new ArgumentException("Could not cast or convert from {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, (initialType != null) ? initialType.ToString() : "{null}", targetType)); } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) public static object ToValue(INullable nullableValue) { if (nullableValue == null) return null; else if (nullableValue is SqlInt32) return ToValue((SqlInt32)nullableValue); else if (nullableValue is SqlInt64) return ToValue((SqlInt64)nullableValue); else if (nullableValue is SqlBoolean) return ToValue((SqlBoolean)nullableValue); else if (nullableValue is SqlString) return ToValue((SqlString)nullableValue); else if (nullableValue is SqlDateTime) return ToValue((SqlDateTime)nullableValue); throw new ArgumentException("Unsupported INullable type: {0}".FormatWith(CultureInfo.InvariantCulture, nullableValue.GetType())); } #endif #if !(NETFX_CORE || PORTABLE) internal static TypeConverter GetConverter(Type t) { return JsonTypeReflector.GetTypeConverter(t); } #endif public static bool IsInteger(object value) { switch (GetTypeCode(value)) { case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: return true; default: return false; } } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/MathUtils.cs0000644000175000017500000000503512253423361027167 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json.Utilities { internal class MathUtils { public static int IntLength(int i) { if (i < 0) throw new ArgumentOutOfRangeException(); if (i == 0) return 1; return (int)Math.Floor(Math.Log10(i)) + 1; } public static char IntToHex(int n) { if (n <= 9) return (char)(n + 48); return (char)((n - 10) + 97); } public static int? Min(int? val1, int? val2) { if (val1 == null) return val2; if (val2 == null) return val1; return Math.Min(val1.Value, val2.Value); } public static int? Max(int? val1, int? val2) { if (val1 == null) return val2; if (val2 == null) return val1; return Math.Max(val1.Value, val2.Value); } public static double? Max(double? val1, double? val2) { if (val1 == null) return val2; if (val2 == null) return val1; return Math.Max(val1.Value, val2.Value); } public static bool ApproxEquals(double d1, double d2) { const double epsilon = 2.2204460492503131E-16; if (d1 == d2) return true; double tolerance = ((Math.Abs(d1) + Math.Abs(d2)) + 10.0) * epsilon; double difference = d1 - d2; return (-tolerance < difference && tolerance > difference); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/EnumValues.cs0000644000175000017500000000262412253423361027342 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.ObjectModel; namespace Newtonsoft.Json.Utilities { internal class EnumValues : KeyedCollection> where T : struct { protected override string GetKeyForItem(EnumValue item) { return item.Name; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/CollectionWrapper.cs0000644000175000017500000001533112253423361030711 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.Threading; using System.Globalization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Utilities { internal interface IWrappedCollection : IList { object UnderlyingCollection { get; } } internal class CollectionWrapper : ICollection, IWrappedCollection { private readonly IList _list; private readonly ICollection _genericCollection; private object _syncRoot; public CollectionWrapper(IList list) { ValidationUtils.ArgumentNotNull(list, "list"); if (list is ICollection) _genericCollection = (ICollection)list; else _list = list; } public CollectionWrapper(ICollection list) { ValidationUtils.ArgumentNotNull(list, "list"); _genericCollection = list; } public virtual void Add(T item) { if (_genericCollection != null) _genericCollection.Add(item); else _list.Add(item); } public virtual void Clear() { if (_genericCollection != null) _genericCollection.Clear(); else _list.Clear(); } public virtual bool Contains(T item) { if (_genericCollection != null) return _genericCollection.Contains(item); else return _list.Contains(item); } public virtual void CopyTo(T[] array, int arrayIndex) { if (_genericCollection != null) _genericCollection.CopyTo(array, arrayIndex); else _list.CopyTo(array, arrayIndex); } public virtual int Count { get { if (_genericCollection != null) return _genericCollection.Count; else return _list.Count; } } public virtual bool IsReadOnly { get { if (_genericCollection != null) return _genericCollection.IsReadOnly; else return _list.IsReadOnly; } } public virtual bool Remove(T item) { if (_genericCollection != null) { return _genericCollection.Remove(item); } else { bool contains = _list.Contains(item); if (contains) _list.Remove(item); return contains; } } public virtual IEnumerator GetEnumerator() { if (_genericCollection != null) return _genericCollection.GetEnumerator(); return _list.Cast().GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { if (_genericCollection != null) return _genericCollection.GetEnumerator(); else return _list.GetEnumerator(); } int IList.Add(object value) { VerifyValueType(value); Add((T)value); return (Count - 1); } bool IList.Contains(object value) { if (IsCompatibleObject(value)) return Contains((T)value); return false; } int IList.IndexOf(object value) { if (_genericCollection != null) throw new InvalidOperationException("Wrapped ICollection does not support IndexOf."); if (IsCompatibleObject(value)) return _list.IndexOf((T)value); return -1; } void IList.RemoveAt(int index) { if (_genericCollection != null) throw new InvalidOperationException("Wrapped ICollection does not support RemoveAt."); _list.RemoveAt(index); } void IList.Insert(int index, object value) { if (_genericCollection != null) throw new InvalidOperationException("Wrapped ICollection does not support Insert."); VerifyValueType(value); _list.Insert(index, (T)value); } bool IList.IsFixedSize { get { if (_genericCollection != null) // ICollection only has IsReadOnly return _genericCollection.IsReadOnly; else return _list.IsFixedSize; } } void IList.Remove(object value) { if (IsCompatibleObject(value)) Remove((T)value); } object IList.this[int index] { get { if (_genericCollection != null) throw new InvalidOperationException("Wrapped ICollection does not support indexer."); return _list[index]; } set { if (_genericCollection != null) throw new InvalidOperationException("Wrapped ICollection does not support indexer."); VerifyValueType(value); _list[index] = (T)value; } } void ICollection.CopyTo(Array array, int arrayIndex) { CopyTo((T[])array, arrayIndex); } bool ICollection.IsSynchronized { get { return false; } } object ICollection.SyncRoot { get { if (_syncRoot == null) Interlocked.CompareExchange(ref _syncRoot, new object(), null); return _syncRoot; } } private static void VerifyValueType(object value) { if (!IsCompatibleObject(value)) throw new ArgumentException("The value '{0}' is not of type '{1}' and cannot be used in this generic collection.".FormatWith(CultureInfo.InvariantCulture, value, typeof(T)), "value"); } private static bool IsCompatibleObject(object value) { if (!(value is T) && (value != null || (typeof(T).IsValueType() && !ReflectionUtils.IsNullableType(typeof(T))))) return false; return true; } public object UnderlyingCollection { get { if (_genericCollection != null) return _genericCollection; else return _list; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/ReflectionDelegateFactory.cs0000644000175000017500000000532712253423361032336 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.Reflection; using Newtonsoft.Json.Serialization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif namespace Newtonsoft.Json.Utilities { internal abstract class ReflectionDelegateFactory { public Func CreateGet(MemberInfo memberInfo) { PropertyInfo propertyInfo = memberInfo as PropertyInfo; if (propertyInfo != null) return CreateGet(propertyInfo); FieldInfo fieldInfo = memberInfo as FieldInfo; if (fieldInfo != null) return CreateGet(fieldInfo); throw new Exception("Could not create getter for {0}.".FormatWith(CultureInfo.InvariantCulture, memberInfo)); } public Action CreateSet(MemberInfo memberInfo) { PropertyInfo propertyInfo = memberInfo as PropertyInfo; if (propertyInfo != null) return CreateSet(propertyInfo); FieldInfo fieldInfo = memberInfo as FieldInfo; if (fieldInfo != null) return CreateSet(fieldInfo); throw new Exception("Could not create setter for {0}.".FormatWith(CultureInfo.InvariantCulture, memberInfo)); } public abstract MethodCall CreateMethodCall(MethodBase method); public abstract Func CreateDefaultConstructor(Type type); public abstract Func CreateGet(PropertyInfo propertyInfo); public abstract Func CreateGet(FieldInfo fieldInfo); public abstract Action CreateSet(FieldInfo fieldInfo); public abstract Action CreateSet(PropertyInfo propertyInfo); } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/CollectionUtils.cs0000644000175000017500000003245712253423361030401 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Reflection; using System.Text; using System.Collections; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using System.Globalization; using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Utilities { internal static class CollectionUtils { public static IEnumerable CastValid(this IEnumerable enumerable) { ValidationUtils.ArgumentNotNull(enumerable, "enumerable"); return enumerable.Cast().Where(o => o is T).Cast(); } /// /// Determines whether the collection is null or empty. /// /// The collection. /// /// true if the collection is null or empty; otherwise, false. /// public static bool IsNullOrEmpty(ICollection collection) { if (collection != null) { return (collection.Count == 0); } return true; } /// /// Adds the elements of the specified collection to the specified generic IList. /// /// The list to add to. /// The collection of elements to add. public static void AddRange(this IList initial, IEnumerable collection) { if (initial == null) throw new ArgumentNullException("initial"); if (collection == null) return; foreach (T value in collection) { initial.Add(value); } } public static void AddRange(this IList initial, IEnumerable collection) { ValidationUtils.ArgumentNotNull(initial, "initial"); ListWrapper wrapper = new ListWrapper(initial); wrapper.AddRange(collection.Cast()); } public static IList CreateGenericList(Type listType) { ValidationUtils.ArgumentNotNull(listType, "listType"); return (IList)ReflectionUtils.CreateGeneric(typeof(List<>), listType); } public static bool IsDictionaryType(Type type) { ValidationUtils.ArgumentNotNull(type, "type"); if (typeof(IDictionary).IsAssignableFrom(type)) return true; if (ReflectionUtils.ImplementsGenericDefinition(type, typeof (IDictionary<,>))) return true; return false; } public static IWrappedCollection CreateCollectionWrapper(object list) { ValidationUtils.ArgumentNotNull(list, "list"); Type collectionDefinition; if (ReflectionUtils.ImplementsGenericDefinition(list.GetType(), typeof(ICollection<>), out collectionDefinition)) { Type collectionItemType = ReflectionUtils.GetCollectionItemType(collectionDefinition); // Activator.CreateInstance throws AmbiguousMatchException. Manually invoke constructor Func, object> instanceCreator = (t, a) => { ConstructorInfo c = t.GetConstructor(new[] { collectionDefinition }); return c.Invoke(new[] { list }); }; return (IWrappedCollection)ReflectionUtils.CreateGeneric(typeof(CollectionWrapper<>), new[] { collectionItemType }, instanceCreator, list); } else if (list is IList) { return new CollectionWrapper((IList)list); } else { throw new ArgumentException("Can not create ListWrapper for type {0}.".FormatWith(CultureInfo.InvariantCulture, list.GetType()), "list"); } } public static IWrappedDictionary CreateDictionaryWrapper(object dictionary) { ValidationUtils.ArgumentNotNull(dictionary, "dictionary"); Type dictionaryDefinition; if (ReflectionUtils.ImplementsGenericDefinition(dictionary.GetType(), typeof(IDictionary<,>), out dictionaryDefinition)) { Type dictionaryKeyType = ReflectionUtils.GetDictionaryKeyType(dictionaryDefinition); Type dictionaryValueType = ReflectionUtils.GetDictionaryValueType(dictionaryDefinition); // Activator.CreateInstance throws AmbiguousMatchException. Manually invoke constructor Func, object> instanceCreator = (t, a) => { ConstructorInfo c = t.GetConstructor(new[] { dictionaryDefinition }); return c.Invoke(new[] { dictionary }); }; return (IWrappedDictionary)ReflectionUtils.CreateGeneric(typeof(DictionaryWrapper<,>), new[] { dictionaryKeyType, dictionaryValueType }, instanceCreator, dictionary); } else if (dictionary is IDictionary) { return new DictionaryWrapper((IDictionary)dictionary); } else { throw new ArgumentException("Can not create DictionaryWrapper for type {0}.".FormatWith(CultureInfo.InvariantCulture, dictionary.GetType()), "dictionary"); } } public static IList CreateList(Type listType, out bool isReadOnlyOrFixedSize) { ValidationUtils.ArgumentNotNull(listType, "listType"); IList list; Type collectionType; isReadOnlyOrFixedSize = false; if (listType.IsArray) { // have to use an arraylist when creating array // there is no way to know the size until it is finised list = new List(); isReadOnlyOrFixedSize = true; } else if (ReflectionUtils.InheritsGenericDefinition(listType, typeof(ReadOnlyCollection<>), out collectionType)) { Type readOnlyCollectionContentsType = collectionType.GetGenericArguments()[0]; Type genericEnumerable = ReflectionUtils.MakeGenericType(typeof(IEnumerable<>), readOnlyCollectionContentsType); bool suitableConstructor = false; foreach (ConstructorInfo constructor in listType.GetConstructors()) { IList parameters = constructor.GetParameters(); if (parameters.Count == 1) { if (genericEnumerable.IsAssignableFrom(parameters[0].ParameterType)) { suitableConstructor = true; break; } } } if (!suitableConstructor) throw new Exception("Read-only type {0} does not have a public constructor that takes a type that implements {1}.".FormatWith(CultureInfo.InvariantCulture, listType, genericEnumerable)); // can't add or modify a readonly list // use List and convert once populated list = CreateGenericList(readOnlyCollectionContentsType); isReadOnlyOrFixedSize = true; } else if (typeof(IList).IsAssignableFrom(listType)) { if (ReflectionUtils.IsInstantiatableType(listType)) list = (IList)Activator.CreateInstance(listType); else if (listType == typeof(IList)) list = new List(); else list = null; } else if (ReflectionUtils.ImplementsGenericDefinition(listType, typeof(ICollection<>))) { if (ReflectionUtils.IsInstantiatableType(listType)) list = CreateCollectionWrapper(Activator.CreateInstance(listType)); else list = null; } else { list = null; } if (list == null) throw new InvalidOperationException("Cannot create and populate list type {0}.".FormatWith(CultureInfo.InvariantCulture, listType)); return list; } public static Array ToArray(Array initial, Type type) { if (type == null) throw new ArgumentNullException("type"); Array destinationArray = Array.CreateInstance(type, initial.Length); Array.Copy(initial, 0, destinationArray, 0, initial.Length); return destinationArray; } public static bool AddDistinct(this IList list, T value) { return list.AddDistinct(value, EqualityComparer.Default); } public static bool AddDistinct(this IList list, T value, IEqualityComparer comparer) { if (list.ContainsValue(value, comparer)) return false; list.Add(value); return true; } // this is here because LINQ Bridge doesn't support Contains with IEqualityComparer public static bool ContainsValue(this IEnumerable source, TSource value, IEqualityComparer comparer) { if (comparer == null) comparer = EqualityComparer.Default; if (source == null) throw new ArgumentNullException("source"); foreach (TSource local in source) { if (comparer.Equals(local, value)) return true; } return false; } public static bool AddRangeDistinct(this IList list, IEnumerable values, IEqualityComparer comparer) { bool allAdded = true; foreach (T value in values) { if (!list.AddDistinct(value, comparer)) allAdded = false; } return allAdded; } public static int IndexOf(this IEnumerable collection, Func predicate) { int index = 0; foreach (T value in collection) { if (predicate(value)) return index; index++; } return -1; } /// /// Returns the index of the first occurrence in a sequence by using a specified IEqualityComparer. /// /// The type of the elements of source. /// A sequence in which to locate a value. /// The object to locate in the sequence /// An equality comparer to compare values. /// The zero-based index of the first occurrence of value within the entire sequence, if found; otherwise, 1. public static int IndexOf(this IEnumerable list, TSource value, IEqualityComparer comparer) { int index = 0; foreach (TSource item in list) { if (comparer.Equals(item, value)) { return index; } index++; } return -1; } private static IList GetDimensions(IList values) { IList dimensions = new List(); IList currentArray = values; while (true) { dimensions.Add(currentArray.Count); if (currentArray.Count == 0) break; object v = currentArray[0]; if (v is IList) currentArray = (IList)v; else break; } return dimensions; } private static void CopyFromJaggedToMultidimensionalArray(IList values, Array multidimensionalArray, int[] indices) { int dimension = indices.Length; if (dimension == multidimensionalArray.Rank) { multidimensionalArray.SetValue(JaggedArrayGetValue(values, indices), indices); return; } int dimensionLength = multidimensionalArray.GetLength(dimension); IList list = (IList)JaggedArrayGetValue(values, indices); int currentValuesLength = list.Count; if (currentValuesLength != dimensionLength) throw new Exception("Cannot deserialize non-cubical array as multidimensional array."); int[] newIndices = new int[dimension + 1]; for (int i = 0; i < dimension; i++) { newIndices[i] = indices[i]; } for (int i = 0; i < multidimensionalArray.GetLength(dimension); i++) { newIndices[dimension] = i; CopyFromJaggedToMultidimensionalArray(values, multidimensionalArray, newIndices); } } private static object JaggedArrayGetValue(IList values, int[] indices) { IList currentList = values; for (int i = 0; i < indices.Length; i++) { int index = indices[i]; if (i == indices.Length - 1) return currentList[index]; else currentList = (IList)currentList[index]; } return currentList; } public static Array ToMultidimensionalArray(IList values, Type type, int rank) { IList dimensions = GetDimensions(values); while (dimensions.Count < rank) { dimensions.Add(0); } Array multidimensionalArray = Array.CreateInstance(type, dimensions.ToArray()); CopyFromJaggedToMultidimensionalArray(values, multidimensionalArray, new int[0]); return multidimensionalArray; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DictionaryWrapper.cs0000644000175000017500000002303012253423361030716 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Collections; using System.Threading; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Utilities { internal interface IWrappedDictionary : IDictionary { object UnderlyingDictionary { get; } } internal class DictionaryWrapper : IDictionary, IWrappedDictionary { private readonly IDictionary _dictionary; private readonly IDictionary _genericDictionary; private object _syncRoot; public DictionaryWrapper(IDictionary dictionary) { ValidationUtils.ArgumentNotNull(dictionary, "dictionary"); _dictionary = dictionary; } public DictionaryWrapper(IDictionary dictionary) { ValidationUtils.ArgumentNotNull(dictionary, "dictionary"); _genericDictionary = dictionary; } public void Add(TKey key, TValue value) { if (_dictionary != null) _dictionary.Add(key, value); else _genericDictionary.Add(key, value); } public bool ContainsKey(TKey key) { if (_dictionary != null) return _dictionary.Contains(key); else return _genericDictionary.ContainsKey(key); } public ICollection Keys { get { if (_dictionary != null) return _dictionary.Keys.Cast().ToList(); else return _genericDictionary.Keys; } } public bool Remove(TKey key) { if (_dictionary != null) { if (_dictionary.Contains(key)) { _dictionary.Remove(key); return true; } else { return false; } } return _genericDictionary.Remove(key); } public bool TryGetValue(TKey key, out TValue value) { if (_dictionary != null) { if (!_dictionary.Contains(key)) { value = default(TValue); return false; } else { value = (TValue)_dictionary[key]; return true; } } return _genericDictionary.TryGetValue(key, out value); } public ICollection Values { get { if (_dictionary != null) return _dictionary.Values.Cast().ToList(); else return _genericDictionary.Values; } } public TValue this[TKey key] { get { if (_dictionary != null) return (TValue)_dictionary[key]; return _genericDictionary[key]; } set { if (_dictionary != null) _dictionary[key] = value; else _genericDictionary[key] = value; } } public void Add(KeyValuePair item) { if (_dictionary != null) ((IList)_dictionary).Add(item); else _genericDictionary.Add(item); } public void Clear() { if (_dictionary != null) _dictionary.Clear(); else _genericDictionary.Clear(); } public bool Contains(KeyValuePair item) { if (_dictionary != null) return ((IList)_dictionary).Contains(item); else return _genericDictionary.Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { if (_dictionary != null) { foreach (DictionaryEntry item in _dictionary) { array[arrayIndex++] = new KeyValuePair((TKey)item.Key, (TValue)item.Value); } } else { _genericDictionary.CopyTo(array, arrayIndex); } } public int Count { get { if (_dictionary != null) return _dictionary.Count; else return _genericDictionary.Count; } } public bool IsReadOnly { get { if (_dictionary != null) return _dictionary.IsReadOnly; else return _genericDictionary.IsReadOnly; } } public bool Remove(KeyValuePair item) { if (_dictionary != null) { if (_dictionary.Contains(item.Key)) { object value = _dictionary[item.Key]; if (object.Equals(value, item.Value)) { _dictionary.Remove(item.Key); return true; } else { return false; } } else { return true; } } else { return _genericDictionary.Remove(item); } } public IEnumerator> GetEnumerator() { if (_dictionary != null) return _dictionary.Cast().Select(de => new KeyValuePair((TKey)de.Key, (TValue)de.Value)).GetEnumerator(); else return _genericDictionary.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } void IDictionary.Add(object key, object value) { if (_dictionary != null) _dictionary.Add(key, value); else _genericDictionary.Add((TKey)key, (TValue)value); } object IDictionary.this[object key] { get { if (_dictionary != null) return _dictionary[key]; else return _genericDictionary[(TKey)key]; } set { if (_dictionary != null) _dictionary[key] = value; else _genericDictionary[(TKey)key] = (TValue)value; } } private struct DictionaryEnumerator : IDictionaryEnumerator { private readonly IEnumerator> _e; public DictionaryEnumerator(IEnumerator> e) { ValidationUtils.ArgumentNotNull(e, "e"); _e = e; } public DictionaryEntry Entry { get { return (DictionaryEntry)Current; } } public object Key { get { return Entry.Key; } } public object Value { get { return Entry.Value; } } public object Current { get { return new DictionaryEntry(_e.Current.Key, _e.Current.Value); } } public bool MoveNext() { return _e.MoveNext(); } public void Reset() { _e.Reset(); } } IDictionaryEnumerator IDictionary.GetEnumerator() { if (_dictionary != null) return _dictionary.GetEnumerator(); else return new DictionaryEnumerator(_genericDictionary.GetEnumerator()); } bool IDictionary.Contains(object key) { if (_genericDictionary != null) return _genericDictionary.ContainsKey((TKey)key); else return _dictionary.Contains(key); } bool IDictionary.IsFixedSize { get { if (_genericDictionary != null) return false; else return _dictionary.IsFixedSize; } } ICollection IDictionary.Keys { get { if (_genericDictionary != null) return _genericDictionary.Keys.ToList(); else return _dictionary.Keys; } } public void Remove(object key) { if (_dictionary != null) _dictionary.Remove(key); else _genericDictionary.Remove((TKey)key); } ICollection IDictionary.Values { get { if (_genericDictionary != null) return _genericDictionary.Values.ToList(); else return _dictionary.Values; } } void ICollection.CopyTo(Array array, int index) { if (_dictionary != null) _dictionary.CopyTo(array, index); else _genericDictionary.CopyTo((KeyValuePair[])array, index); } bool ICollection.IsSynchronized { get { if (_dictionary != null) return _dictionary.IsSynchronized; else return false; } } object ICollection.SyncRoot { get { if (_syncRoot == null) Interlocked.CompareExchange(ref _syncRoot, new object(), null); return _syncRoot; } } public object UnderlyingDictionary { get { if (_dictionary != null) return _dictionary; else return _genericDictionary; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/LateBoundReflectionDelegateFactory.cs0000644000175000017500000000607012253423361034130 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Serialization; using System.Reflection; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #endif namespace Newtonsoft.Json.Utilities { internal class LateBoundReflectionDelegateFactory : ReflectionDelegateFactory { private static readonly LateBoundReflectionDelegateFactory _instance = new LateBoundReflectionDelegateFactory(); internal static ReflectionDelegateFactory Instance { get { return _instance; } } public override MethodCall CreateMethodCall(MethodBase method) { ValidationUtils.ArgumentNotNull(method, "method"); ConstructorInfo c = method as ConstructorInfo; if (c != null) return (o, a) => c.Invoke(a); return (o, a) => method.Invoke(o, a); } public override Func CreateDefaultConstructor(Type type) { ValidationUtils.ArgumentNotNull(type, "type"); if (type.IsValueType()) return () => (T)ReflectionUtils.CreateInstance(type); ConstructorInfo constructorInfo = ReflectionUtils.GetDefaultConstructor(type, true); return () => (T)constructorInfo.Invoke(null); } public override Func CreateGet(PropertyInfo propertyInfo) { ValidationUtils.ArgumentNotNull(propertyInfo, "propertyInfo"); return o => propertyInfo.GetValue(o, null); } public override Func CreateGet(FieldInfo fieldInfo) { ValidationUtils.ArgumentNotNull(fieldInfo, "fieldInfo"); return o => fieldInfo.GetValue(o); } public override Action CreateSet(FieldInfo fieldInfo) { ValidationUtils.ArgumentNotNull(fieldInfo, "fieldInfo"); return (o, v) => fieldInfo.SetValue(o, v); } public override Action CreateSet(PropertyInfo propertyInfo) { ValidationUtils.ArgumentNotNull(propertyInfo, "propertyInfo"); return (o, v) => propertyInfo.SetValue(o, v, null); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Utilities/DynamicWrapper.cs0000644000175000017500000002024412253423361030201 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Globalization; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Utilities { internal class DynamicWrapperBase { internal protected object UnderlyingObject; } internal static class DynamicWrapper { private static readonly object _lock = new object(); private static readonly WrapperDictionary _wrapperDictionary = new WrapperDictionary(); private static ModuleBuilder _moduleBuilder; private static ModuleBuilder ModuleBuilder { get { Init(); return _moduleBuilder; } } private static void Init() { if (_moduleBuilder == null) { lock (_lock) { if (_moduleBuilder == null) { AssemblyName assemblyName = new AssemblyName("Newtonsoft.Json.Dynamic"); assemblyName.KeyPair = new StrongNameKeyPair(GetStrongKey()); AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); _moduleBuilder = assembly.DefineDynamicModule("Newtonsoft.Json.DynamicModule", false); } } } } private static byte[] GetStrongKey() { const string name = "Newtonsoft.Json.Dynamic.snk"; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name)) { if (stream == null) throw new MissingManifestResourceException("Should have " + name + " as an embedded resource."); int length = (int)stream.Length; byte[] buffer = new byte[length]; stream.Read(buffer, 0, length); return buffer; } } public static Type GetWrapper(Type interfaceType, Type realObjectType) { Type wrapperType = _wrapperDictionary.GetType(interfaceType, realObjectType); if (wrapperType == null) { lock (_lock) { wrapperType = _wrapperDictionary.GetType(interfaceType, realObjectType); if (wrapperType == null) { wrapperType = GenerateWrapperType(interfaceType, realObjectType); _wrapperDictionary.SetType(interfaceType, realObjectType, wrapperType); } } } return wrapperType; } public static object GetUnderlyingObject(object wrapper) { DynamicWrapperBase wrapperBase = wrapper as DynamicWrapperBase; if (wrapperBase == null) throw new ArgumentException("Object is not a wrapper.", "wrapper"); return wrapperBase.UnderlyingObject; } private static Type GenerateWrapperType(Type interfaceType, Type underlyingType) { TypeBuilder wrapperBuilder = ModuleBuilder.DefineType( "{0}_{1}_Wrapper".FormatWith(CultureInfo.InvariantCulture, interfaceType.Name, underlyingType.Name), TypeAttributes.NotPublic | TypeAttributes.Sealed, typeof(DynamicWrapperBase), new[] { interfaceType }); WrapperMethodBuilder wrapperMethod = new WrapperMethodBuilder(underlyingType, wrapperBuilder); foreach (MethodInfo method in interfaceType.GetAllMethods()) { wrapperMethod.Generate(method); } return wrapperBuilder.CreateType(); } public static T CreateWrapper(object realObject) where T : class { var dynamicType = GetWrapper(typeof(T), realObject.GetType()); var dynamicWrapper = (DynamicWrapperBase)Activator.CreateInstance(dynamicType); dynamicWrapper.UnderlyingObject = realObject; return dynamicWrapper as T; } } internal class WrapperMethodBuilder { private readonly Type _realObjectType; private readonly TypeBuilder _wrapperBuilder; public WrapperMethodBuilder(Type realObjectType, TypeBuilder proxyBuilder) { _realObjectType = realObjectType; _wrapperBuilder = proxyBuilder; } public void Generate(MethodInfo newMethod) { if (newMethod.IsGenericMethod) newMethod = newMethod.GetGenericMethodDefinition(); FieldInfo srcField = typeof(DynamicWrapperBase).GetField("UnderlyingObject", BindingFlags.Instance | BindingFlags.NonPublic); var parameters = newMethod.GetParameters(); var parameterTypes = parameters.Select(parameter => parameter.ParameterType).ToArray(); MethodBuilder methodBuilder = _wrapperBuilder.DefineMethod( newMethod.Name, MethodAttributes.Public | MethodAttributes.Virtual, newMethod.ReturnType, parameterTypes); if (newMethod.IsGenericMethod) { methodBuilder.DefineGenericParameters( newMethod.GetGenericArguments().Select(arg => arg.Name).ToArray()); } ILGenerator ilGenerator = methodBuilder.GetILGenerator(); LoadUnderlyingObject(ilGenerator, srcField); PushParameters(parameters, ilGenerator); ExecuteMethod(newMethod, parameterTypes, ilGenerator); Return(ilGenerator); } private static void Return(ILGenerator ilGenerator) { ilGenerator.Emit(OpCodes.Ret); } private void ExecuteMethod(MethodBase newMethod, Type[] parameterTypes, ILGenerator ilGenerator) { MethodInfo srcMethod = GetMethod(newMethod, parameterTypes); if (srcMethod == null) throw new MissingMethodException("Unable to find method " + newMethod.Name + " on " + _realObjectType.FullName); ilGenerator.Emit(OpCodes.Call, srcMethod); } private MethodInfo GetMethod(MethodBase realMethod, Type[] parameterTypes) { if (realMethod.IsGenericMethod) return _realObjectType.GetGenericMethod(realMethod.Name, parameterTypes); return _realObjectType.GetMethod(realMethod.Name, parameterTypes); } private static void PushParameters(ICollection parameters, ILGenerator ilGenerator) { for (int i = 1; i < parameters.Count + 1; i++) ilGenerator.Emit(OpCodes.Ldarg, i); } private static void LoadUnderlyingObject(ILGenerator ilGenerator, FieldInfo srcField) { ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldfld, srcField); } } internal class WrapperDictionary { private readonly Dictionary _wrapperTypes = new Dictionary(); private static string GenerateKey(Type interfaceType, Type realObjectType) { return interfaceType.Name + "_" + realObjectType.Name; } public Type GetType(Type interfaceType, Type realObjectType) { string key = GenerateKey(interfaceType, realObjectType); if (_wrapperTypes.ContainsKey(key)) return _wrapperTypes[key]; return null; } public void SetType(Type interfaceType, Type realObjectType, Type wrapperType) { string key = GenerateKey(interfaceType, realObjectType); if (_wrapperTypes.ContainsKey(key)) _wrapperTypes[key] = wrapperType; else _wrapperTypes.Add(key, wrapperType); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonTextReader.cs0000644000175000017500000013153412253423361026207 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.IO; using System.Xml; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json { internal enum ReadType { Read, ReadAsInt32, ReadAsBytes, ReadAsString, ReadAsDecimal, ReadAsDateTime, #if !NET20 ReadAsDateTimeOffset #endif } /// /// Represents a reader that provides fast, non-cached, forward-only access to JSON text data. /// public class JsonTextReader : JsonReader, IJsonLineInfo { private const char UnicodeReplacementChar = '\uFFFD'; private readonly TextReader _reader; private char[] _chars; private int _charsUsed; private int _charPos; private int _lineStartPos; private int _lineNumber; private bool _isEndOfFile; private StringBuffer _buffer; private StringReference _stringReference; /// /// Initializes a new instance of the class with the specified . /// /// The TextReader containing the XML data to read. public JsonTextReader(TextReader reader) { if (reader == null) throw new ArgumentNullException("reader"); _reader = reader; _lineNumber = 1; _chars = new char[4097]; } internal void SetCharBuffer(char[] chars) { _chars = chars; } private StringBuffer GetBuffer() { if (_buffer == null) { _buffer = new StringBuffer(4096); } else { _buffer.Position = 0; } return _buffer; } private void OnNewLine(int pos) { _lineNumber++; _lineStartPos = pos - 1; } private void ParseString(char quote) { _charPos++; ShiftBufferIfNeeded(); ReadStringIntoBuffer(quote); if (_readType == ReadType.ReadAsBytes) { byte[] data; if (_stringReference.Length == 0) { data = new byte[0]; } else { data = Convert.FromBase64CharArray(_stringReference.Chars, _stringReference.StartIndex, _stringReference.Length); } SetToken(JsonToken.Bytes, data); } else if (_readType == ReadType.ReadAsString) { string text = _stringReference.ToString(); SetToken(JsonToken.String, text); QuoteChar = quote; } else { string text = _stringReference.ToString(); if (_dateParseHandling != DateParseHandling.None) { if (text.Length > 0) { if (text[0] == '/') { if (text.StartsWith("/Date(", StringComparison.Ordinal) && text.EndsWith(")/", StringComparison.Ordinal)) { ParseDateMicrosoft(text); return; } } else if (char.IsDigit(text[0]) && text.Length >= 19 && text.Length <= 40) { if (ParseDateIso(text)) return; } } } SetToken(JsonToken.String, text); QuoteChar = quote; } } private bool ParseDateIso(string text) { const string isoDateFormat = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"; #if !NET20 if (_readType == ReadType.ReadAsDateTimeOffset || (_readType == ReadType.Read && _dateParseHandling == DateParseHandling.DateTimeOffset)) { DateTimeOffset dateTimeOffset; if (DateTimeOffset.TryParseExact(text, isoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) { SetToken(JsonToken.Date, dateTimeOffset); return true; } } else #endif { DateTime dateTime; if (DateTime.TryParseExact(text, isoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTime)) { dateTime = JsonConvert.EnsureDateTime(dateTime, DateTimeZoneHandling); SetToken(JsonToken.Date, dateTime); return true; } } return false; } private void ParseDateMicrosoft(string text) { string value = text.Substring(6, text.Length - 8); DateTimeKind kind = DateTimeKind.Utc; int index = value.IndexOf('+', 1); if (index == -1) index = value.IndexOf('-', 1); TimeSpan offset = TimeSpan.Zero; if (index != -1) { kind = DateTimeKind.Local; offset = ReadOffset(value.Substring(index)); value = value.Substring(0, index); } long javaScriptTicks = long.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture); DateTime utcDateTime = JsonConvert.ConvertJavaScriptTicksToDateTime(javaScriptTicks); #if !NET20 if (_readType == ReadType.ReadAsDateTimeOffset || (_readType == ReadType.Read && _dateParseHandling == DateParseHandling.DateTimeOffset)) { SetToken(JsonToken.Date, new DateTimeOffset(utcDateTime.Add(offset).Ticks, offset)); } else #endif { DateTime dateTime; switch (kind) { case DateTimeKind.Unspecified: dateTime = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified); break; case DateTimeKind.Local: dateTime = utcDateTime.ToLocalTime(); break; default: dateTime = utcDateTime; break; } dateTime = JsonConvert.EnsureDateTime(dateTime, DateTimeZoneHandling); SetToken(JsonToken.Date, dateTime); } } private static void BlockCopyChars(char[] src, int srcOffset, char[] dst, int dstOffset, int count) { const int charByteCount = 2; Buffer.BlockCopy(src, srcOffset * charByteCount, dst, dstOffset * charByteCount, count * charByteCount); } private void ShiftBufferIfNeeded() { // once in the last 10% of the buffer shift the remainling content to the start to avoid // unnessesarly increasing the buffer size when reading numbers/strings int length = _chars.Length; if (length - _charPos <= length * 0.1) { int count = _charsUsed - _charPos; if (count > 0) BlockCopyChars(_chars, _charPos, _chars, 0, count); _lineStartPos -= _charPos; _charPos = 0; _charsUsed = count; _chars[_charsUsed] = '\0'; } } private int ReadData(bool append) { return ReadData(append, 0); } private int ReadData(bool append, int charsRequired) { if (_isEndOfFile) return 0; // char buffer is full if (_charsUsed + charsRequired >= _chars.Length - 1) { if (append) { // copy to new array either double the size of the current or big enough to fit required content int newArrayLength = Math.Max(_chars.Length * 2, _charsUsed + charsRequired + 1); // increase the size of the buffer char[] dst = new char[newArrayLength]; BlockCopyChars(_chars, 0, dst, 0, _chars.Length); _chars = dst; } else { int remainingCharCount = _charsUsed - _charPos; if (remainingCharCount + charsRequired + 1 >= _chars.Length) { // the remaining count plus the required is bigger than the current buffer size char[] dst = new char[remainingCharCount + charsRequired + 1]; if (remainingCharCount > 0) BlockCopyChars(_chars, _charPos, dst, 0, remainingCharCount); _chars = dst; } else { // copy any remaining data to the beginning of the buffer if needed and reset positions if (remainingCharCount > 0) BlockCopyChars(_chars, _charPos, _chars, 0, remainingCharCount); } _lineStartPos -= _charPos; _charPos = 0; _charsUsed = remainingCharCount; } } int attemptCharReadCount = _chars.Length - _charsUsed - 1; int charsRead = _reader.Read(_chars, _charsUsed, attemptCharReadCount); _charsUsed += charsRead; if (charsRead == 0) _isEndOfFile = true; _chars[_charsUsed] = '\0'; return charsRead; } private bool EnsureChars(int relativePosition, bool append) { if (_charPos + relativePosition >= _charsUsed) return ReadChars(relativePosition, append); return true; } private bool ReadChars(int relativePosition, bool append) { if (_isEndOfFile) return false; int charsRequired = _charPos + relativePosition - _charsUsed + 1; int totalCharsRead = 0; // it is possible that the TextReader doesn't return all data at once // repeat read until the required text is returned or the reader is out of content do { int charsRead = ReadData(append, charsRequired - totalCharsRead); // no more content if (charsRead == 0) break; totalCharsRead += charsRead; } while (totalCharsRead < charsRequired); if (totalCharsRead < charsRequired) return false; return true; } private static TimeSpan ReadOffset(string offsetText) { bool negative = (offsetText[0] == '-'); int hours = int.Parse(offsetText.Substring(1, 2), NumberStyles.Integer, CultureInfo.InvariantCulture); int minutes = 0; if (offsetText.Length >= 5) minutes = int.Parse(offsetText.Substring(3, 2), NumberStyles.Integer, CultureInfo.InvariantCulture); TimeSpan offset = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes); if (negative) offset = offset.Negate(); return offset; } /// /// Reads the next JSON token from the stream. /// /// /// true if the next token was read successfully; false if there are no more tokens to read. /// [DebuggerStepThrough] public override bool Read() { _readType = ReadType.Read; if (!ReadInternal()) { SetToken(JsonToken.None); return false; } return true; } /// /// Reads the next JSON token from the stream as a . /// /// /// A or a null reference if the next JSON token is null. This method will return null at the end of an array. /// public override byte[] ReadAsBytes() { return ReadAsBytesInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override decimal? ReadAsDecimal() { return ReadAsDecimalInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override int? ReadAsInt32() { return ReadAsInt32Internal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override string ReadAsString() { return ReadAsStringInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override DateTime? ReadAsDateTime() { return ReadAsDateTimeInternal(); } #if !NET20 /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override DateTimeOffset? ReadAsDateTimeOffset() { return ReadAsDateTimeOffsetInternal(); } #endif internal override bool ReadInternal() { while (true) { switch (_currentState) { case State.Start: case State.Property: case State.Array: case State.ArrayStart: case State.Constructor: case State.ConstructorStart: return ParseValue(); case State.Complete: break; case State.Object: case State.ObjectStart: return ParseObject(); case State.PostValue: // returns true if it hits // end of object or array if (ParsePostValue()) return true; break; case State.Finished: if (EnsureChars(0, false)) { EatWhitespace(false); if (_isEndOfFile) { return false; } if (_chars[_charPos] == '/') { ParseComment(); return true; } else { throw JsonReaderException.Create(this, "Additional text encountered after finished reading JSON content: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); } } return false; case State.Closed: break; case State.Error: break; default: throw JsonReaderException.Create(this, "Unexpected state: {0}.".FormatWith(CultureInfo.InvariantCulture, CurrentState)); } } } private void ReadStringIntoBuffer(char quote) { int charPos = _charPos; int initialPosition = _charPos; int lastWritePosition = _charPos; StringBuffer buffer = null; while (true) { switch (_chars[charPos++]) { case '\0': if (_charsUsed == charPos - 1) { charPos--; if (ReadData(true) == 0) { _charPos = charPos; throw JsonReaderException.Create(this, "Unterminated string. Expected delimiter: {0}.".FormatWith(CultureInfo.InvariantCulture, quote)); } } break; case '\\': _charPos = charPos; if (!EnsureChars(0, true)) { _charPos = charPos; throw JsonReaderException.Create(this, "Unterminated string. Expected delimiter: {0}.".FormatWith(CultureInfo.InvariantCulture, quote)); } // start of escape sequence int escapeStartPos = charPos - 1; char currentChar = _chars[charPos]; char writeChar; switch (currentChar) { case 'b': charPos++; writeChar = '\b'; break; case 't': charPos++; writeChar = '\t'; break; case 'n': charPos++; writeChar = '\n'; break; case 'f': charPos++; writeChar = '\f'; break; case 'r': charPos++; writeChar = '\r'; break; case '\\': charPos++; writeChar = '\\'; break; case '"': case '\'': case '/': writeChar = currentChar; charPos++; break; case 'u': charPos++; _charPos = charPos; writeChar = ParseUnicode(); if (StringUtils.IsLowSurrogate(writeChar)) { // low surrogate with no preceding high surrogate; this char is replaced writeChar = UnicodeReplacementChar; } else if (StringUtils.IsHighSurrogate(writeChar)) { bool anotherHighSurrogate; // loop for handling situations where there are multiple consecutive high surrogates do { anotherHighSurrogate = false; // potential start of a surrogate pair if (EnsureChars(2, true) && _chars[_charPos] == '\\' && _chars[_charPos + 1] == 'u') { char highSurrogate = writeChar; _charPos += 2; writeChar = ParseUnicode(); if (StringUtils.IsLowSurrogate(writeChar)) { // a valid surrogate pair! } else if (StringUtils.IsHighSurrogate(writeChar)) { // another high surrogate; replace current and start check over highSurrogate = UnicodeReplacementChar; anotherHighSurrogate = true; } else { // high surrogate not followed by low surrogate; original char is replaced highSurrogate = UnicodeReplacementChar; } if (buffer == null) buffer = GetBuffer(); WriteCharToBuffer(buffer, highSurrogate, lastWritePosition, escapeStartPos); lastWritePosition = _charPos; } else { // there are not enough remaining chars for the low surrogate or is not follow by unicode sequence // replace high surrogate and continue on as usual writeChar = UnicodeReplacementChar; } } while (anotherHighSurrogate); } charPos = _charPos; break; default: charPos++; _charPos = charPos; throw JsonReaderException.Create(this, "Bad JSON escape sequence: {0}.".FormatWith(CultureInfo.InvariantCulture, @"\" + currentChar)); } if (buffer == null) buffer = GetBuffer(); WriteCharToBuffer(buffer, writeChar, lastWritePosition, escapeStartPos); lastWritePosition = charPos; break; case StringUtils.CarriageReturn: _charPos = charPos - 1; ProcessCarriageReturn(true); charPos = _charPos; break; case StringUtils.LineFeed: _charPos = charPos - 1; ProcessLineFeed(); charPos = _charPos; break; case '"': case '\'': if (_chars[charPos - 1] == quote) { charPos--; if (initialPosition == lastWritePosition) { _stringReference = new StringReference(_chars, initialPosition, charPos - initialPosition); } else { if (buffer == null) buffer = GetBuffer(); if (charPos > lastWritePosition) buffer.Append(_chars, lastWritePosition, charPos - lastWritePosition); _stringReference = new StringReference(buffer.GetInternalBuffer(), 0, buffer.Position); } charPos++; _charPos = charPos; return; } break; } } } private void WriteCharToBuffer(StringBuffer buffer, char writeChar, int lastWritePosition, int writeToPosition) { if (writeToPosition > lastWritePosition) { buffer.Append(_chars, lastWritePosition, writeToPosition - lastWritePosition); } buffer.Append(writeChar); } private char ParseUnicode() { char writeChar; if (EnsureChars(4, true)) { string hexValues = new string(_chars, _charPos, 4); char hexChar = Convert.ToChar(int.Parse(hexValues, NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo)); writeChar = hexChar; _charPos += 4; } else { throw JsonReaderException.Create(this, "Unexpected end while parsing unicode character."); } return writeChar; } private void ReadNumberIntoBuffer() { int charPos = _charPos; while (true) { switch (_chars[charPos++]) { case '\0': if (_charsUsed == charPos - 1) { charPos--; _charPos = charPos; if (ReadData(true) == 0) return; } break; case '-': case '+': case 'a': case 'A': case 'b': case 'B': case 'c': case 'C': case 'd': case 'D': case 'e': case 'E': case 'f': case 'F': case 'x': case 'X': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; default: _charPos = charPos - 1; return; } } } private void ClearRecentString() { if (_buffer != null) _buffer.Position = 0; _stringReference = new StringReference(); } private bool ParsePostValue() { while (true) { char currentChar = _chars[_charPos]; switch (currentChar) { case '\0': if (_charsUsed == _charPos) { if (ReadData(false) == 0) { _currentState = State.Finished; return false; } } else { _charPos++; } break; case '}': _charPos++; SetToken(JsonToken.EndObject); return true; case ']': _charPos++; SetToken(JsonToken.EndArray); return true; case ')': _charPos++; SetToken(JsonToken.EndConstructor); return true; case '/': ParseComment(); return true; case ',': _charPos++; // finished parsing SetStateBasedOnCurrent(); return false; case ' ': case StringUtils.Tab: // eat _charPos++; break; case StringUtils.CarriageReturn: ProcessCarriageReturn(false); break; case StringUtils.LineFeed: ProcessLineFeed(); break; default: if (char.IsWhiteSpace(currentChar)) { // eat _charPos++; } else { throw JsonReaderException.Create(this, "After parsing a value an unexpected character was encountered: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); } break; } } } private bool ParseObject() { while (true) { char currentChar = _chars[_charPos]; switch (currentChar) { case '\0': if (_charsUsed == _charPos) { if (ReadData(false) == 0) return false; } else { _charPos++; } break; case '}': SetToken(JsonToken.EndObject); _charPos++; return true; case '/': ParseComment(); return true; case StringUtils.CarriageReturn: ProcessCarriageReturn(false); break; case StringUtils.LineFeed: ProcessLineFeed(); break; case ' ': case StringUtils.Tab: // eat _charPos++; break; default: if (char.IsWhiteSpace(currentChar)) { // eat _charPos++; } else { return ParseProperty(); } break; } } } private bool ParseProperty() { char firstChar = _chars[_charPos]; char quoteChar; if (firstChar == '"' || firstChar == '\'') { _charPos++; quoteChar = firstChar; ShiftBufferIfNeeded(); ReadStringIntoBuffer(quoteChar); } else if (ValidIdentifierChar(firstChar)) { quoteChar = '\0'; ShiftBufferIfNeeded(); ParseUnquotedProperty(); } else { throw JsonReaderException.Create(this, "Invalid property identifier character: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); } string propertyName = _stringReference.ToString(); EatWhitespace(false); if (_chars[_charPos] != ':') throw JsonReaderException.Create(this, "Invalid character after parsing property name. Expected ':' but got: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); _charPos++; SetToken(JsonToken.PropertyName, propertyName); QuoteChar = quoteChar; ClearRecentString(); return true; } private bool ValidIdentifierChar(char value) { return (char.IsLetterOrDigit(value) || value == '_' || value == '$'); } private void ParseUnquotedProperty() { int initialPosition = _charPos; // parse unquoted property name until whitespace or colon while (true) { switch (_chars[_charPos]) { case '\0': if (_charsUsed == _charPos) { if (ReadData(true) == 0) throw JsonReaderException.Create(this, "Unexpected end while parsing unquoted property name."); break; } _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition); return; default: char currentChar = _chars[_charPos]; if (ValidIdentifierChar(currentChar)) { _charPos++; break; } else if (char.IsWhiteSpace(currentChar) || currentChar == ':') { _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition); return; } throw JsonReaderException.Create(this, "Invalid JavaScript property identifier character: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); } } } private bool ParseValue() { while (true) { char currentChar = _chars[_charPos]; switch (currentChar) { case '\0': if (_charsUsed == _charPos) { if (ReadData(false) == 0) return false; } else { _charPos++; } break; case '"': case '\'': ParseString(currentChar); return true; case 't': ParseTrue(); return true; case 'f': ParseFalse(); return true; case 'n': if (EnsureChars(1, true)) { char next = _chars[_charPos + 1]; if (next == 'u') ParseNull(); else if (next == 'e') ParseConstructor(); else throw JsonReaderException.Create(this, "Unexpected character encountered while parsing value: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); } else { throw JsonReaderException.Create(this, "Unexpected end."); } return true; case 'N': ParseNumberNaN(); return true; case 'I': ParseNumberPositiveInfinity(); return true; case '-': if (EnsureChars(1, true) && _chars[_charPos + 1] == 'I') ParseNumberNegativeInfinity(); else ParseNumber(); return true; case '/': ParseComment(); return true; case 'u': ParseUndefined(); return true; case '{': _charPos++; SetToken(JsonToken.StartObject); return true; case '[': _charPos++; SetToken(JsonToken.StartArray); return true; case ']': _charPos++; SetToken(JsonToken.EndArray); return true; case ',': // don't increment position, the next call to read will handle comma // this is done to handle multiple empty comma values SetToken(JsonToken.Undefined); return true; case ')': _charPos++; SetToken(JsonToken.EndConstructor); return true; case StringUtils.CarriageReturn: ProcessCarriageReturn(false); break; case StringUtils.LineFeed: ProcessLineFeed(); break; case ' ': case StringUtils.Tab: // eat _charPos++; break; default: if (char.IsWhiteSpace(currentChar)) { // eat _charPos++; break; } else if (char.IsNumber(currentChar) || currentChar == '-' || currentChar == '.') { ParseNumber(); return true; } else { throw JsonReaderException.Create(this, "Unexpected character encountered while parsing value: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); } } } } private void ProcessLineFeed() { _charPos++; OnNewLine(_charPos); } private void ProcessCarriageReturn(bool append) { _charPos++; if (EnsureChars(1, append) && _chars[_charPos] == StringUtils.LineFeed) _charPos++; OnNewLine(_charPos); } private bool EatWhitespace(bool oneOrMore) { bool finished = false; bool ateWhitespace = false; while (!finished) { char currentChar = _chars[_charPos]; switch (currentChar) { case '\0': if (_charsUsed == _charPos) { if (ReadData(false) == 0) finished = true; } else { _charPos++; } break; case StringUtils.CarriageReturn: ProcessCarriageReturn(false); break; case StringUtils.LineFeed: ProcessLineFeed(); break; default: if (currentChar == ' ' || char.IsWhiteSpace(currentChar)) { ateWhitespace = true; _charPos++; } else { finished = true; } break; } } return (!oneOrMore || ateWhitespace); } private void ParseConstructor() { if (MatchValueWithTrailingSeperator("new")) { EatWhitespace(false); int initialPosition = _charPos; int endPosition; while (true) { char currentChar = _chars[_charPos]; if (currentChar == '\0') { if (_charsUsed == _charPos) { if (ReadData(true) == 0) throw JsonReaderException.Create(this, "Unexpected end while parsing constructor."); } else { endPosition = _charPos; _charPos++; break; } } else if (char.IsLetterOrDigit(currentChar)) { _charPos++; } else if (currentChar == StringUtils.CarriageReturn) { endPosition = _charPos; ProcessCarriageReturn(true); break; } else if (currentChar == StringUtils.LineFeed) { endPosition = _charPos; ProcessLineFeed(); break; } else if (char.IsWhiteSpace(currentChar)) { endPosition = _charPos; _charPos++; break; } else if (currentChar == '(') { endPosition = _charPos; break; } else { throw JsonReaderException.Create(this, "Unexpected character while parsing constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); } } _stringReference = new StringReference(_chars, initialPosition, endPosition - initialPosition); string constructorName = _stringReference.ToString(); EatWhitespace(false); if (_chars[_charPos] != '(') throw JsonReaderException.Create(this, "Unexpected character while parsing constructor: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); _charPos++; ClearRecentString(); SetToken(JsonToken.StartConstructor, constructorName); } } private void ParseNumber() { ShiftBufferIfNeeded(); char firstChar = _chars[_charPos]; int initialPosition = _charPos; ReadNumberIntoBuffer(); _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition); object numberValue; JsonToken numberType; bool singleDigit = (char.IsDigit(firstChar) && _stringReference.Length == 1); bool nonBase10 = (firstChar == '0' && _stringReference.Length > 1 && _stringReference.Chars[_stringReference.StartIndex + 1] != '.' && _stringReference.Chars[_stringReference.StartIndex + 1] != 'e' && _stringReference.Chars[_stringReference.StartIndex + 1] != 'E'); if (_readType == ReadType.ReadAsInt32) { if (singleDigit) { // digit char values start at 48 numberValue = firstChar - 48; } else if (nonBase10) { string number = _stringReference.ToString(); // decimal.Parse doesn't support parsing hexadecimal values int integer = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt32(number, 16) : Convert.ToInt32(number, 8); numberValue = integer; } else { string number = _stringReference.ToString(); numberValue = Convert.ToInt32(number, CultureInfo.InvariantCulture); } numberType = JsonToken.Integer; } else if (_readType == ReadType.ReadAsDecimal) { if (singleDigit) { // digit char values start at 48 numberValue = (decimal)firstChar - 48; } else if (nonBase10) { string number = _stringReference.ToString(); // decimal.Parse doesn't support parsing hexadecimal values long integer = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(number, 16) : Convert.ToInt64(number, 8); numberValue = Convert.ToDecimal(integer); } else { string number = _stringReference.ToString(); numberValue = decimal.Parse(number, NumberStyles.Number | NumberStyles.AllowExponent, CultureInfo.InvariantCulture); } numberType = JsonToken.Float; } else { if (singleDigit) { // digit char values start at 48 numberValue = (long)firstChar - 48; numberType = JsonToken.Integer; } else if (nonBase10) { string number = _stringReference.ToString(); numberValue = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(number, 16) : Convert.ToInt64(number, 8); numberType = JsonToken.Integer; } else { string number = _stringReference.ToString(); // it's faster to do 3 indexof with single characters than an indexofany if (number.IndexOf('.') != -1 || number.IndexOf('E') != -1 || number.IndexOf('e') != -1) { numberValue = Convert.ToDouble(number, CultureInfo.InvariantCulture); numberType = JsonToken.Float; } else { try { numberValue = Convert.ToInt64(number, CultureInfo.InvariantCulture); } catch (OverflowException ex) { throw JsonReaderException.Create((JsonReader)this, "JSON integer {0} is too large or small for an Int64.".FormatWith(CultureInfo.InvariantCulture, number), ex); } numberType = JsonToken.Integer; } } } ClearRecentString(); SetToken(numberType, numberValue); } private void ParseComment() { // should have already parsed / character before reaching this method _charPos++; if (!EnsureChars(1, false) || _chars[_charPos] != '*') throw JsonReaderException.Create(this, "Error parsing comment. Expected: *, got {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); else _charPos++; int initialPosition = _charPos; bool commentFinished = false; while (!commentFinished) { switch (_chars[_charPos]) { case '\0': if (_charsUsed == _charPos) { if (ReadData(true) == 0) throw JsonReaderException.Create(this, "Unexpected end while parsing comment."); } else { _charPos++; } break; case '*': _charPos++; if (EnsureChars(0, true)) { if (_chars[_charPos] == '/') { _stringReference = new StringReference(_chars, initialPosition, _charPos - initialPosition - 1); _charPos++; commentFinished = true; } } break; case StringUtils.CarriageReturn: ProcessCarriageReturn(true); break; case StringUtils.LineFeed: ProcessLineFeed(); break; default: _charPos++; break; } } SetToken(JsonToken.Comment, _stringReference.ToString()); ClearRecentString(); } private bool MatchValue(string value) { if (!EnsureChars(value.Length - 1, true)) return false; for (int i = 0; i < value.Length; i++) { if (_chars[_charPos + i] != value[i]) { return false; } } _charPos += value.Length; return true; } private bool MatchValueWithTrailingSeperator(string value) { // will match value and then move to the next character, checking that it is a seperator character bool match = MatchValue(value); if (!match) return false; if (!EnsureChars(0, false)) return true; return IsSeperator(_chars[_charPos]) || _chars[_charPos] == '\0'; } private bool IsSeperator(char c) { switch (c) { case '}': case ']': case ',': return true; case '/': // check next character to see if start of a comment if (!EnsureChars(1, false)) return false; return (_chars[_charPos + 1] == '*'); case ')': if (CurrentState == State.Constructor || CurrentState == State.ConstructorStart) return true; break; case ' ': case StringUtils.Tab: case StringUtils.LineFeed: case StringUtils.CarriageReturn: return true; default: if (char.IsWhiteSpace(c)) return true; break; } return false; } private void ParseTrue() { // check characters equal 'true' // and that it is followed by either a seperator character // or the text ends if (MatchValueWithTrailingSeperator(JsonConvert.True)) { SetToken(JsonToken.Boolean, true); } else { throw JsonReaderException.Create(this, "Error parsing boolean value."); } } private void ParseNull() { if (MatchValueWithTrailingSeperator(JsonConvert.Null)) { SetToken(JsonToken.Null); } else { throw JsonReaderException.Create(this, "Error parsing null value."); } } private void ParseUndefined() { if (MatchValueWithTrailingSeperator(JsonConvert.Undefined)) { SetToken(JsonToken.Undefined); } else { throw JsonReaderException.Create(this, "Error parsing undefined value."); } } private void ParseFalse() { if (MatchValueWithTrailingSeperator(JsonConvert.False)) { SetToken(JsonToken.Boolean, false); } else { throw JsonReaderException.Create(this, "Error parsing boolean value."); } } private void ParseNumberNegativeInfinity() { if (MatchValueWithTrailingSeperator(JsonConvert.NegativeInfinity)) { SetToken(JsonToken.Float, double.NegativeInfinity); } else { throw JsonReaderException.Create(this, "Error parsing negative infinity value."); } } private void ParseNumberPositiveInfinity() { if (MatchValueWithTrailingSeperator(JsonConvert.PositiveInfinity)) { SetToken(JsonToken.Float, double.PositiveInfinity); } else { throw JsonReaderException.Create(this, "Error parsing positive infinity value."); } } private void ParseNumberNaN() { if (MatchValueWithTrailingSeperator(JsonConvert.NaN)) { SetToken(JsonToken.Float, double.NaN); } else { throw JsonReaderException.Create(this, "Error parsing NaN value."); } } /// /// Changes the state to closed. /// public override void Close() { base.Close(); if (CloseInput && _reader != null) #if !(NETFX_CORE || PORTABLE) _reader.Close(); #else _reader.Dispose(); #endif if (_buffer != null) _buffer.Clear(); } /// /// Gets a value indicating whether the class can return line information. /// /// /// true if LineNumber and LinePosition can be provided; otherwise, false. /// public bool HasLineInfo() { return true; } /// /// Gets the current line number. /// /// /// The current line number or 0 if no line information is available (for example, HasLineInfo returns false). /// public int LineNumber { get { if (CurrentState == State.Start && LinePosition == 0) return 0; return _lineNumber; } } /// /// Gets the current line position. /// /// /// The current line position or 0 if no line information is available (for example, HasLineInfo returns false). /// public int LinePosition { get { return _charPos - _lineStartPos; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/MemberSerialization.cs0000644000175000017500000000456012253423361027251 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Runtime.Serialization; using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json { /// /// Specifies the member serialization options for the . /// public enum MemberSerialization { /// /// All public members are serialized by default. Members can be excluded using or . /// This is the default member serialization mode. /// OptOut, /// /// Only members must be marked with or are serialized. /// This member serialization mode can also be set by marking the class with . /// OptIn, /// /// All public and private fields are serialized. Members can be excluded using or . /// This member serialization mode can also be set by marking the class with /// and setting IgnoreSerializableAttribute on to false. /// Fields } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/WriteState.cs0000644000175000017500000000435212253423361025376 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Specifies the state of the . /// public enum WriteState { /// /// An exception has been thrown, which has left the in an invalid state. /// You may call the method to put the in the Closed state. /// Any other method calls results in an being thrown. /// Error, /// /// The method has been called. /// Closed, /// /// An object is being written. /// Object, /// /// A array is being written. /// Array, /// /// A constructor is being written. /// Constructor, /// /// A property is being written. /// Property, /// /// A write method has not been called. /// Start } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonToken.cs0000644000175000017500000000536412253423361025221 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json { /// /// Specifies the type of Json token. /// public enum JsonToken { /// /// This is returned by the if a method has not been called. /// None, /// /// An object start token. /// StartObject, /// /// An array start token. /// StartArray, /// /// A constructor start token. /// StartConstructor, /// /// An object property name. /// PropertyName, /// /// A comment. /// Comment, /// /// Raw JSON. /// Raw, /// /// An integer. /// Integer, /// /// A float. /// Float, /// /// A string. /// String, /// /// A boolean. /// Boolean, /// /// A null token. /// Null, /// /// An undefined token. /// Undefined, /// /// An object end token. /// EndObject, /// /// An array end token. /// EndArray, /// /// A constructor end token. /// EndConstructor, /// /// A Date. /// Date, /// /// Byte data. /// Bytes } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj0000644000175000017500000003261112253423361030150 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Library Properties Newtonsoft.Json Newtonsoft.Json false 3.5 false v3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false true Client true full false bin\Debug\Net35\ TRACE;DEBUG;CODE_ANALYSIS;NET35 prompt 4 bin\Debug\Net35\Newtonsoft.Json.xml true Newtonsoft.Json.ruleset pdbonly true bin\Release\Net35\ TRACE;NET35 prompt 4 bin\Release\Net35\Newtonsoft.Json.xml ..\..\..\..\trunk\Src\Newtonsoft.Json\Newtonsoft.Json.ruleset false 3.5 3.0 3.5 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 2.0 %28x86%29 true False .NET Framework 3.0 %28x86%29 false False .NET Framework 3.5 false False .NET Framework 3.5 SP1 false smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonSerializationException.cs0000644000175000017500000001032612253423361030627 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Text; namespace Newtonsoft.Json { /// /// The exception thrown when an error occurs during Json serialization or deserialization. /// #if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE) [Serializable] #endif public class JsonSerializationException : JsonException { /// /// Initializes a new instance of the class. /// public JsonSerializationException() { } /// /// Initializes a new instance of the class /// with a specified error message. /// /// The error message that explains the reason for the exception. public JsonSerializationException(string message) : base(message) { } /// /// Initializes a new instance of the class /// with a specified error message and a reference to the inner exception that is the cause of this exception. /// /// The error message that explains the reason for the exception. /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } #if !(WINDOWS_PHONE || SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is null. /// The class name is null or is zero (0). public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo lineInfo, string path, string message, Exception ex) { message = FormatExceptionMessage(lineInfo, path, message); return new JsonSerializationException(message, ex); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonConverterCollection.cs0000644000175000017500000000266212253423361030122 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; using System.Collections.ObjectModel; namespace Newtonsoft.Json { /// /// Represents a collection of . /// public class JsonConverterCollection : Collection { } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/DateFormatHandling.cs0000644000175000017500000000310012253423361026764 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Specifies how dates are formatted when writing JSON text. /// public enum DateFormatHandling { /// /// Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". /// IsoDateFormat, /// /// Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". /// MicrosoftDateFormat } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/0000755000175000017500000000000012253423361025102 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/VersionConverter.cs0000644000175000017500000000742312253423361030754 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from a string (e.g. "1.2.3.4"). /// public class VersionConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); } else if (value is Version) { writer.WriteValue(value.ToString()); } else { throw new JsonSerializationException("Expected Version object value"); } } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing property value of the JSON that is being converted. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return null; } else { if (reader.TokenType == JsonToken.String) { try { Version v = new Version((string) reader.Value); return v; } catch (Exception ex) { throw JsonSerializationException.Create(reader, "Error parsing version string: {0}".FormatWith(CultureInfo.InvariantCulture, reader.Value), ex); } } else { throw JsonSerializationException.Create(reader, "Unexpected token or value when parsing version. Token: {0}, Value: {1}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType, reader.Value)); } } } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof (Version); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/EntityKeyMemberConverter.cs0000644000175000017500000001201512253423361032375 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NET20 || NETFX_CORE || PORTABLE) using System; using Newtonsoft.Json.Serialization; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { internal interface IEntityKeyMember { string Key { get; set; } object Value { get; set; } } /// /// Converts an Entity Framework EntityKey to and from JSON. /// public class EntityKeyMemberConverter : JsonConverter { private const string EntityKeyMemberFullTypeName = "System.Data.EntityKeyMember"; /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { IEntityKeyMember entityKeyMember = DynamicWrapper.CreateWrapper(value); Type keyType = (entityKeyMember.Value != null) ? entityKeyMember.Value.GetType() : null; writer.WriteStartObject(); writer.WritePropertyName("Key"); writer.WriteValue(entityKeyMember.Key); writer.WritePropertyName("Type"); writer.WriteValue((keyType != null) ? keyType.FullName : null); writer.WritePropertyName("Value"); if (keyType != null) { string valueJson; if (JsonSerializerInternalWriter.TryConvertToString(entityKeyMember.Value, keyType, out valueJson)) writer.WriteValue(valueJson); else writer.WriteValue(entityKeyMember.Value); } else { writer.WriteNull(); } writer.WriteEndObject(); } private static void ReadAndAssertProperty(JsonReader reader, string propertyName) { ReadAndAssert(reader); if (reader.TokenType != JsonToken.PropertyName || reader.Value.ToString() != propertyName) throw new JsonSerializationException("Expected JSON property '{0}'.".FormatWith(CultureInfo.InvariantCulture, propertyName)); } private static void ReadAndAssert(JsonReader reader) { if (!reader.Read()) throw new JsonSerializationException("Unexpected end."); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { IEntityKeyMember entityKeyMember = DynamicWrapper.CreateWrapper(Activator.CreateInstance(objectType)); ReadAndAssertProperty(reader, "Key"); ReadAndAssert(reader); entityKeyMember.Key = reader.Value.ToString(); ReadAndAssertProperty(reader, "Type"); ReadAndAssert(reader); string type = reader.Value.ToString(); Type t = Type.GetType(type); ReadAndAssertProperty(reader, "Value"); ReadAndAssert(reader); entityKeyMember.Value = serializer.Deserialize(reader, t); ReadAndAssert(reader); return DynamicWrapper.GetUnderlyingObject(entityKeyMember); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return (objectType.AssignableToTypeName(EntityKeyMemberFullTypeName)); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/ExpandoObjectConverter.cs0000644000175000017500000001246112253423361032052 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) using System; using System.Collections.Generic; using System.Dynamic; using System.Globalization; using System.Linq; using System.Text; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { /// /// Converts an ExpandoObject to and from JSON. /// public class ExpandoObjectConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // can write is set to false } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return ReadValue(reader); } private object ReadValue(JsonReader reader) { while (reader.TokenType == JsonToken.Comment) { if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); } switch (reader.TokenType) { case JsonToken.StartObject: return ReadObject(reader); case JsonToken.StartArray: return ReadList(reader); default: if (JsonReader.IsPrimitiveToken(reader.TokenType)) return reader.Value; throw JsonSerializationException.Create(reader, "Unexpected token when converting ExpandoObject: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } } private object ReadList(JsonReader reader) { IList list = new List(); while (reader.Read()) { switch (reader.TokenType) { case JsonToken.Comment: break; default: object v = ReadValue(reader); list.Add(v); break; case JsonToken.EndArray: return list; } } throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); } private object ReadObject(JsonReader reader) { IDictionary expandoObject = new ExpandoObject(); while (reader.Read()) { switch (reader.TokenType) { case JsonToken.PropertyName: string propertyName = reader.Value.ToString(); if (!reader.Read()) throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); object v = ReadValue(reader); expandoObject[propertyName] = v; break; case JsonToken.Comment: break; case JsonToken.EndObject: return expandoObject; } } throw JsonSerializationException.Create(reader, "Unexpected end when reading ExpandoObject."); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return (objectType == typeof (ExpandoObject)); } /// /// Gets a value indicating whether this can write JSON. /// /// /// true if this can write JSON; otherwise, false. /// public override bool CanWrite { get { return false; } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/CustomCreationConverter.cs0000644000175000017500000000732612253423361032270 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { /// /// Create a custom object /// /// The object type to convert. public abstract class CustomCreationConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotSupportedException("CustomCreationConverter should only be used while deserializing."); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; T value = Create(objectType); if (value == null) throw new JsonSerializationException("No object created."); serializer.Populate(reader, value); return value; } /// /// Creates an object which will then be populated by the serializer. /// /// Type of the object. /// The created object. public abstract T Create(Type objectType); /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return typeof (T).IsAssignableFrom(objectType); } /// /// Gets a value indicating whether this can write JSON. /// /// /// true if this can write JSON; otherwise, false. /// public override bool CanWrite { get { return false; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs0000644000175000017500000013467112253423361030703 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if (!(SILVERLIGHT || PORTABLE) || WINDOWS_PHONE) using System; using System.Collections.Generic; using System.Globalization; using System.Xml; #if !NET20 using System.Xml.Linq; #endif using Newtonsoft.Json.Utilities; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Converters { #region XmlNodeWrappers #if !SILVERLIGHT && !NETFX_CORE internal class XmlDocumentWrapper : XmlNodeWrapper, IXmlDocument { private readonly XmlDocument _document; public XmlDocumentWrapper(XmlDocument document) : base(document) { _document = document; } public IXmlNode CreateComment(string data) { return new XmlNodeWrapper(_document.CreateComment(data)); } public IXmlNode CreateTextNode(string text) { return new XmlNodeWrapper(_document.CreateTextNode(text)); } public IXmlNode CreateCDataSection(string data) { return new XmlNodeWrapper(_document.CreateCDataSection(data)); } public IXmlNode CreateWhitespace(string text) { return new XmlNodeWrapper(_document.CreateWhitespace(text)); } public IXmlNode CreateSignificantWhitespace(string text) { return new XmlNodeWrapper(_document.CreateSignificantWhitespace(text)); } public IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone) { return new XmlNodeWrapper(_document.CreateXmlDeclaration(version, encoding, standalone)); } public IXmlNode CreateProcessingInstruction(string target, string data) { return new XmlNodeWrapper(_document.CreateProcessingInstruction(target, data)); } public IXmlElement CreateElement(string elementName) { return new XmlElementWrapper(_document.CreateElement(elementName)); } public IXmlElement CreateElement(string qualifiedName, string namespaceUri) { return new XmlElementWrapper(_document.CreateElement(qualifiedName, namespaceUri)); } public IXmlNode CreateAttribute(string name, string value) { XmlNodeWrapper attribute = new XmlNodeWrapper(_document.CreateAttribute(name)); attribute.Value = value; return attribute; } public IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value) { XmlNodeWrapper attribute = new XmlNodeWrapper(_document.CreateAttribute(qualifiedName, namespaceUri)); attribute.Value = value; return attribute; } public IXmlElement DocumentElement { get { if (_document.DocumentElement == null) return null; return new XmlElementWrapper(_document.DocumentElement); } } } internal class XmlElementWrapper : XmlNodeWrapper, IXmlElement { private readonly XmlElement _element; public XmlElementWrapper(XmlElement element) : base(element) { _element = element; } public void SetAttributeNode(IXmlNode attribute) { XmlNodeWrapper xmlAttributeWrapper = (XmlNodeWrapper)attribute; _element.SetAttributeNode((XmlAttribute) xmlAttributeWrapper.WrappedNode); } public string GetPrefixOfNamespace(string namespaceUri) { return _element.GetPrefixOfNamespace(namespaceUri); } } internal class XmlDeclarationWrapper : XmlNodeWrapper, IXmlDeclaration { private readonly XmlDeclaration _declaration; public XmlDeclarationWrapper(XmlDeclaration declaration) : base(declaration) { _declaration = declaration; } public string Version { get { return _declaration.Version; } } public string Encoding { get { return _declaration.Encoding; } set { _declaration.Encoding = value; } } public string Standalone { get { return _declaration.Standalone; } set { _declaration.Standalone = value; } } } internal class XmlNodeWrapper : IXmlNode { private readonly XmlNode _node; public XmlNodeWrapper(XmlNode node) { _node = node; } public object WrappedNode { get { return _node; } } public XmlNodeType NodeType { get { return _node.NodeType; } } public string Name { get { return _node.Name; } } public string LocalName { get { return _node.LocalName; } } public IList ChildNodes { get { return _node.ChildNodes.Cast().Select(n => WrapNode(n)).ToList(); } } private IXmlNode WrapNode(XmlNode node) { switch (node.NodeType) { case XmlNodeType.Element: return new XmlElementWrapper((XmlElement) node); case XmlNodeType.XmlDeclaration: return new XmlDeclarationWrapper((XmlDeclaration) node); default: return new XmlNodeWrapper(node); } } public IList Attributes { get { if (_node.Attributes == null) return null; return _node.Attributes.Cast().Select(a => WrapNode(a)).ToList(); } } public IXmlNode ParentNode { get { XmlNode node = (_node is XmlAttribute) ? ((XmlAttribute) _node).OwnerElement : _node.ParentNode; if (node == null) return null; return WrapNode(node); } } public string Value { get { return _node.Value; } set { _node.Value = value; } } public IXmlNode AppendChild(IXmlNode newChild) { XmlNodeWrapper xmlNodeWrapper = (XmlNodeWrapper) newChild; _node.AppendChild(xmlNodeWrapper._node); return newChild; } public string Prefix { get { return _node.Prefix; } } public string NamespaceUri { get { return _node.NamespaceURI; } } } #endif #endregion #region Interfaces internal interface IXmlDocument : IXmlNode { IXmlNode CreateComment(string text); IXmlNode CreateTextNode(string text); IXmlNode CreateCDataSection(string data); IXmlNode CreateWhitespace(string text); IXmlNode CreateSignificantWhitespace(string text); IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone); IXmlNode CreateProcessingInstruction(string target, string data); IXmlElement CreateElement(string elementName); IXmlElement CreateElement(string qualifiedName, string namespaceUri); IXmlNode CreateAttribute(string name, string value); IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value); IXmlElement DocumentElement { get; } } internal interface IXmlDeclaration : IXmlNode { string Version { get; } string Encoding { get; set; } string Standalone { get; set; } } internal interface IXmlElement : IXmlNode { void SetAttributeNode(IXmlNode attribute); string GetPrefixOfNamespace(string namespaceUri); } internal interface IXmlNode { XmlNodeType NodeType { get; } string LocalName { get; } IList ChildNodes { get; } IList Attributes { get; } IXmlNode ParentNode { get; } string Value { get; set; } IXmlNode AppendChild(IXmlNode newChild); string NamespaceUri { get; } object WrappedNode { get; } } #endregion #region XNodeWrappers #if !NET20 internal class XDeclarationWrapper : XObjectWrapper, IXmlDeclaration { internal XDeclaration Declaration { get; private set; } public XDeclarationWrapper(XDeclaration declaration) : base(null) { Declaration = declaration; } public override XmlNodeType NodeType { get { return XmlNodeType.XmlDeclaration; } } public string Version { get { return Declaration.Version; } } public string Encoding { get { return Declaration.Encoding; } set { Declaration.Encoding = value; } } public string Standalone { get { return Declaration.Standalone; } set { Declaration.Standalone = value; } } } internal class XDocumentWrapper : XContainerWrapper, IXmlDocument { private XDocument Document { get { return (XDocument)WrappedNode; } } public XDocumentWrapper(XDocument document) : base(document) { } public override IList ChildNodes { get { IList childNodes = base.ChildNodes; if (Document.Declaration != null) childNodes.Insert(0, new XDeclarationWrapper(Document.Declaration)); return childNodes; } } public IXmlNode CreateComment(string text) { return new XObjectWrapper(new XComment(text)); } public IXmlNode CreateTextNode(string text) { return new XObjectWrapper(new XText(text)); } public IXmlNode CreateCDataSection(string data) { return new XObjectWrapper(new XCData(data)); } public IXmlNode CreateWhitespace(string text) { return new XObjectWrapper(new XText(text)); } public IXmlNode CreateSignificantWhitespace(string text) { return new XObjectWrapper(new XText(text)); } public IXmlNode CreateXmlDeclaration(string version, string encoding, string standalone) { return new XDeclarationWrapper(new XDeclaration(version, encoding, standalone)); } public IXmlNode CreateProcessingInstruction(string target, string data) { return new XProcessingInstructionWrapper(new XProcessingInstruction(target, data)); } public IXmlElement CreateElement(string elementName) { return new XElementWrapper(new XElement(elementName)); } public IXmlElement CreateElement(string qualifiedName, string namespaceUri) { string localName = MiscellaneousUtils.GetLocalName(qualifiedName); return new XElementWrapper(new XElement(XName.Get(localName, namespaceUri))); } public IXmlNode CreateAttribute(string name, string value) { return new XAttributeWrapper(new XAttribute(name, value)); } public IXmlNode CreateAttribute(string qualifiedName, string namespaceUri, string value) { string localName = MiscellaneousUtils.GetLocalName(qualifiedName); return new XAttributeWrapper(new XAttribute(XName.Get(localName, namespaceUri), value)); } public IXmlElement DocumentElement { get { if (Document.Root == null) return null; return new XElementWrapper(Document.Root); } } public override IXmlNode AppendChild(IXmlNode newChild) { XDeclarationWrapper declarationWrapper = newChild as XDeclarationWrapper; if (declarationWrapper != null) { Document.Declaration = declarationWrapper.Declaration; return declarationWrapper; } else { return base.AppendChild(newChild); } } } internal class XTextWrapper : XObjectWrapper { private XText Text { get { return (XText)WrappedNode; } } public XTextWrapper(XText text) : base(text) { } public override string Value { get { return Text.Value; } set { Text.Value = value; } } public override IXmlNode ParentNode { get { if (Text.Parent == null) return null; return XContainerWrapper.WrapNode(Text.Parent); } } } internal class XCommentWrapper : XObjectWrapper { private XComment Text { get { return (XComment)WrappedNode; } } public XCommentWrapper(XComment text) : base(text) { } public override string Value { get { return Text.Value; } set { Text.Value = value; } } public override IXmlNode ParentNode { get { if (Text.Parent == null) return null; return XContainerWrapper.WrapNode(Text.Parent); } } } internal class XProcessingInstructionWrapper : XObjectWrapper { private XProcessingInstruction ProcessingInstruction { get { return (XProcessingInstruction)WrappedNode; } } public XProcessingInstructionWrapper(XProcessingInstruction processingInstruction) : base(processingInstruction) { } public override string LocalName { get { return ProcessingInstruction.Target; } } public override string Value { get { return ProcessingInstruction.Data; } set { ProcessingInstruction.Data = value; } } } internal class XContainerWrapper : XObjectWrapper { private XContainer Container { get { return (XContainer)WrappedNode; } } public XContainerWrapper(XContainer container) : base(container) { } public override IList ChildNodes { get { return Container.Nodes().Select(n => WrapNode(n)).ToList(); } } public override IXmlNode ParentNode { get { if (Container.Parent == null) return null; return WrapNode(Container.Parent); } } internal static IXmlNode WrapNode(XObject node) { if (node is XDocument) return new XDocumentWrapper((XDocument)node); else if (node is XElement) return new XElementWrapper((XElement)node); else if (node is XContainer) return new XContainerWrapper((XContainer)node); else if (node is XProcessingInstruction) return new XProcessingInstructionWrapper((XProcessingInstruction)node); else if (node is XText) return new XTextWrapper((XText)node); else if (node is XComment) return new XCommentWrapper((XComment)node); else if (node is XAttribute) return new XAttributeWrapper((XAttribute) node); else return new XObjectWrapper(node); } public override IXmlNode AppendChild(IXmlNode newChild) { Container.Add(newChild.WrappedNode); return newChild; } } internal class XObjectWrapper : IXmlNode { private readonly XObject _xmlObject; public XObjectWrapper(XObject xmlObject) { _xmlObject = xmlObject; } public object WrappedNode { get { return _xmlObject; } } public virtual XmlNodeType NodeType { get { return _xmlObject.NodeType; } } public virtual string LocalName { get { return null; } } public virtual IList ChildNodes { get { return new List(); } } public virtual IList Attributes { get { return null; } } public virtual IXmlNode ParentNode { get { return null; } } public virtual string Value { get { return null; } set { throw new InvalidOperationException(); } } public virtual IXmlNode AppendChild(IXmlNode newChild) { throw new InvalidOperationException(); } public virtual string NamespaceUri { get { return null; } } } internal class XAttributeWrapper : XObjectWrapper { private XAttribute Attribute { get { return (XAttribute)WrappedNode; } } public XAttributeWrapper(XAttribute attribute) : base(attribute) { } public override string Value { get { return Attribute.Value; } set { Attribute.Value = value; } } public override string LocalName { get { return Attribute.Name.LocalName; } } public override string NamespaceUri { get { return Attribute.Name.NamespaceName; } } public override IXmlNode ParentNode { get { if (Attribute.Parent == null) return null; return XContainerWrapper.WrapNode(Attribute.Parent); } } } internal class XElementWrapper : XContainerWrapper, IXmlElement { private XElement Element { get { return (XElement) WrappedNode; } } public XElementWrapper(XElement element) : base(element) { } public void SetAttributeNode(IXmlNode attribute) { XObjectWrapper wrapper = (XObjectWrapper)attribute; Element.Add(wrapper.WrappedNode); } public override IList Attributes { get { return Element.Attributes().Select(a => new XAttributeWrapper(a)).Cast().ToList(); } } public override string Value { get { return Element.Value; } set { Element.Value = value; } } public override string LocalName { get { return Element.Name.LocalName; } } public override string NamespaceUri { get { return Element.Name.NamespaceName; } } public string GetPrefixOfNamespace(string namespaceUri) { return Element.GetPrefixOfNamespace(namespaceUri); } } #endif #endregion /// /// Converts XML to and from JSON. /// public class XmlNodeConverter : JsonConverter { private const string TextName = "#text"; private const string CommentName = "#comment"; private const string CDataName = "#cdata-section"; private const string WhitespaceName = "#whitespace"; private const string SignificantWhitespaceName = "#significant-whitespace"; private const string DeclarationName = "?xml"; private const string JsonNamespaceUri = "http://james.newtonking.com/projects/json"; /// /// Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements. /// /// The name of the deserialize root element. public string DeserializeRootElementName { get; set; } /// /// Gets or sets a flag to indicate whether to write the Json.NET array attribute. /// This attribute helps preserve arrays when converting the written XML back to JSON. /// /// true if the array attibute is written to the XML; otherwise, false. public bool WriteArrayAttribute { get; set; } /// /// Gets or sets a value indicating whether to write the root JSON object. /// /// true if the JSON root object is omitted; otherwise, false. public bool OmitRootObject { get; set; } #region Writing /// /// Writes the JSON representation of the object. /// /// The to write to. /// The calling serializer. /// The value. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { IXmlNode node = WrapXml(value); XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable()); PushParentNamespaces(node, manager); if (!OmitRootObject) writer.WriteStartObject(); SerializeNode(writer, node, manager, !OmitRootObject); if (!OmitRootObject) writer.WriteEndObject(); } private IXmlNode WrapXml(object value) { #if !NET20 if (value is XObject) return XContainerWrapper.WrapNode((XObject)value); #endif #if !(SILVERLIGHT || NETFX_CORE) if (value is XmlNode) return new XmlNodeWrapper((XmlNode)value); #endif throw new ArgumentException("Value must be an XML object.", "value"); } private void PushParentNamespaces(IXmlNode node, XmlNamespaceManager manager) { List parentElements = null; IXmlNode parent = node; while ((parent = parent.ParentNode) != null) { if (parent.NodeType == XmlNodeType.Element) { if (parentElements == null) parentElements = new List(); parentElements.Add(parent); } } if (parentElements != null) { parentElements.Reverse(); foreach (IXmlNode parentElement in parentElements) { manager.PushScope(); foreach (IXmlNode attribute in parentElement.Attributes) { if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/" && attribute.LocalName != "xmlns") manager.AddNamespace(attribute.LocalName, attribute.Value); } } } } private string ResolveFullName(IXmlNode node, XmlNamespaceManager manager) { string prefix = (node.NamespaceUri == null || (node.LocalName == "xmlns" && node.NamespaceUri == "http://www.w3.org/2000/xmlns/")) ? null : manager.LookupPrefix(node.NamespaceUri); if (!string.IsNullOrEmpty(prefix)) return prefix + ":" + node.LocalName; else return node.LocalName; } private string GetPropertyName(IXmlNode node, XmlNamespaceManager manager) { switch (node.NodeType) { case XmlNodeType.Attribute: if (node.NamespaceUri == JsonNamespaceUri) return "$" + node.LocalName; else return "@" + ResolveFullName(node, manager); case XmlNodeType.CDATA: return CDataName; case XmlNodeType.Comment: return CommentName; case XmlNodeType.Element: return ResolveFullName(node, manager); case XmlNodeType.ProcessingInstruction: return "?" + ResolveFullName(node, manager); case XmlNodeType.XmlDeclaration: return DeclarationName; case XmlNodeType.SignificantWhitespace: return SignificantWhitespaceName; case XmlNodeType.Text: return TextName; case XmlNodeType.Whitespace: return WhitespaceName; default: throw new JsonSerializationException("Unexpected XmlNodeType when getting node name: " + node.NodeType); } } private bool IsArray(IXmlNode node) { IXmlNode jsonArrayAttribute = (node.Attributes != null) ? node.Attributes.SingleOrDefault(a => a.LocalName == "Array" && a.NamespaceUri == JsonNamespaceUri) : null; return (jsonArrayAttribute != null && XmlConvert.ToBoolean(jsonArrayAttribute.Value)); } private void SerializeGroupedNodes(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName) { // group nodes together by name Dictionary> nodesGroupedByName = new Dictionary>(); for (int i = 0; i < node.ChildNodes.Count; i++) { IXmlNode childNode = node.ChildNodes[i]; string nodeName = GetPropertyName(childNode, manager); List nodes; if (!nodesGroupedByName.TryGetValue(nodeName, out nodes)) { nodes = new List(); nodesGroupedByName.Add(nodeName, nodes); } nodes.Add(childNode); } // loop through grouped nodes. write single name instances as normal, // write multiple names together in an array foreach (KeyValuePair> nodeNameGroup in nodesGroupedByName) { List groupedNodes = nodeNameGroup.Value; bool writeArray; if (groupedNodes.Count == 1) { writeArray = IsArray(groupedNodes[0]); } else { writeArray = true; } if (!writeArray) { SerializeNode(writer, groupedNodes[0], manager, writePropertyName); } else { string elementNames = nodeNameGroup.Key; if (writePropertyName) writer.WritePropertyName(elementNames); writer.WriteStartArray(); for (int i = 0; i < groupedNodes.Count; i++) { SerializeNode(writer, groupedNodes[i], manager, false); } writer.WriteEndArray(); } } } private void SerializeNode(JsonWriter writer, IXmlNode node, XmlNamespaceManager manager, bool writePropertyName) { switch (node.NodeType) { case XmlNodeType.Document: case XmlNodeType.DocumentFragment: SerializeGroupedNodes(writer, node, manager, writePropertyName); break; case XmlNodeType.Element: if (IsArray(node) && node.ChildNodes.All(n => n.LocalName == node.LocalName) && node.ChildNodes.Count > 0) { SerializeGroupedNodes(writer, node, manager, false); } else { foreach (IXmlNode attribute in node.Attributes) { if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/") { string prefix = (attribute.LocalName != "xmlns") ? attribute.LocalName : string.Empty; manager.AddNamespace(prefix, attribute.Value); } } if (writePropertyName) writer.WritePropertyName(GetPropertyName(node, manager)); if (!ValueAttributes(node.Attributes).Any() && node.ChildNodes.Count == 1 && node.ChildNodes[0].NodeType == XmlNodeType.Text) { // write elements with a single text child as a name value pair writer.WriteValue(node.ChildNodes[0].Value); } else if (node.ChildNodes.Count == 0 && CollectionUtils.IsNullOrEmpty(node.Attributes)) { // empty element writer.WriteNull(); } else { writer.WriteStartObject(); for (int i = 0; i < node.Attributes.Count; i++) { SerializeNode(writer, node.Attributes[i], manager, true); } SerializeGroupedNodes(writer, node, manager, true); writer.WriteEndObject(); } } break; case XmlNodeType.Comment: if (writePropertyName) writer.WriteComment(node.Value); break; case XmlNodeType.Attribute: case XmlNodeType.Text: case XmlNodeType.CDATA: case XmlNodeType.ProcessingInstruction: case XmlNodeType.Whitespace: case XmlNodeType.SignificantWhitespace: if (node.NamespaceUri == "http://www.w3.org/2000/xmlns/" && node.Value == JsonNamespaceUri) return; if (node.NamespaceUri == JsonNamespaceUri) { if (node.LocalName == "Array") return; } if (writePropertyName) writer.WritePropertyName(GetPropertyName(node, manager)); writer.WriteValue(node.Value); break; case XmlNodeType.XmlDeclaration: IXmlDeclaration declaration = (IXmlDeclaration)node; writer.WritePropertyName(GetPropertyName(node, manager)); writer.WriteStartObject(); if (!string.IsNullOrEmpty(declaration.Version)) { writer.WritePropertyName("@version"); writer.WriteValue(declaration.Version); } if (!string.IsNullOrEmpty(declaration.Encoding)) { writer.WritePropertyName("@encoding"); writer.WriteValue(declaration.Encoding); } if (!string.IsNullOrEmpty(declaration.Standalone)) { writer.WritePropertyName("@standalone"); writer.WriteValue(declaration.Standalone); } writer.WriteEndObject(); break; default: throw new JsonSerializationException("Unexpected XmlNodeType when serializing nodes: " + node.NodeType); } } #endregion #region Reading /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { XmlNamespaceManager manager = new XmlNamespaceManager(new NameTable()); IXmlDocument document = null; IXmlNode rootNode = null; #if !NET20 if (typeof(XObject).IsAssignableFrom(objectType)) { if (objectType != typeof (XDocument) && objectType != typeof (XElement)) throw new JsonSerializationException("XmlNodeConverter only supports deserializing XDocument or XElement."); XDocument d = new XDocument(); document = new XDocumentWrapper(d); rootNode = document; } #endif #if !(SILVERLIGHT || NETFX_CORE) if (typeof(XmlNode).IsAssignableFrom(objectType)) { if (objectType != typeof (XmlDocument)) throw new JsonSerializationException("XmlNodeConverter only supports deserializing XmlDocuments"); XmlDocument d = new XmlDocument(); document = new XmlDocumentWrapper(d); rootNode = document; } #endif if (document == null || rootNode == null) throw new JsonSerializationException("Unexpected type when converting XML: " + objectType); if (reader.TokenType != JsonToken.StartObject) throw new JsonSerializationException("XmlNodeConverter can only convert JSON that begins with an object."); if (!string.IsNullOrEmpty(DeserializeRootElementName)) { //rootNode = document.CreateElement(DeserializeRootElementName); //document.AppendChild(rootNode); ReadElement(reader, document, rootNode, DeserializeRootElementName, manager); } else { reader.Read(); DeserializeNode(reader, document, manager, rootNode); } #if !NET20 if (objectType == typeof(XElement)) { XElement element = (XElement)document.DocumentElement.WrappedNode; element.Remove(); return element; } #endif return document.WrappedNode; } private void DeserializeValue(JsonReader reader, IXmlDocument document, XmlNamespaceManager manager, string propertyName, IXmlNode currentNode) { switch (propertyName) { case TextName: currentNode.AppendChild(document.CreateTextNode(reader.Value.ToString())); break; case CDataName: currentNode.AppendChild(document.CreateCDataSection(reader.Value.ToString())); break; case WhitespaceName: currentNode.AppendChild(document.CreateWhitespace(reader.Value.ToString())); break; case SignificantWhitespaceName: currentNode.AppendChild(document.CreateSignificantWhitespace(reader.Value.ToString())); break; default: // processing instructions and the xml declaration start with ? if (!string.IsNullOrEmpty(propertyName) && propertyName[0] == '?') { CreateInstruction(reader, document, currentNode, propertyName); } else { if (reader.TokenType == JsonToken.StartArray) { // handle nested arrays ReadArrayElements(reader, document, propertyName, currentNode, manager); return; } // have to wait until attributes have been parsed before creating element // attributes may contain namespace info used by the element ReadElement(reader, document, currentNode, propertyName, manager); } break; } } private void ReadElement(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string propertyName, XmlNamespaceManager manager) { if (string.IsNullOrEmpty(propertyName)) throw new JsonSerializationException("XmlNodeConverter cannot convert JSON with an empty property name to XML."); Dictionary attributeNameValues = ReadAttributeElements(reader, manager); string elementPrefix = MiscellaneousUtils.GetPrefix(propertyName); if (propertyName.StartsWith("@")) { var attributeName = propertyName.Substring(1); var attributeValue = reader.Value.ToString(); var attributePrefix = MiscellaneousUtils.GetPrefix(attributeName); var attribute = (!string.IsNullOrEmpty(attributePrefix)) ? document.CreateAttribute(attributeName, manager.LookupNamespace(attributePrefix), attributeValue) : document.CreateAttribute(attributeName, attributeValue); ((IXmlElement)currentNode).SetAttributeNode(attribute); } else { IXmlElement element = CreateElement(propertyName, document, elementPrefix, manager); currentNode.AppendChild(element); // add attributes to newly created element foreach (KeyValuePair nameValue in attributeNameValues) { string attributePrefix = MiscellaneousUtils.GetPrefix(nameValue.Key); IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) ? document.CreateAttribute(nameValue.Key, manager.LookupNamespace(attributePrefix), nameValue.Value) : document.CreateAttribute(nameValue.Key, nameValue.Value); element.SetAttributeNode(attribute); } if (reader.TokenType == JsonToken.String || reader.TokenType == JsonToken.Integer || reader.TokenType == JsonToken.Float || reader.TokenType == JsonToken.Boolean || reader.TokenType == JsonToken.Date) { element.AppendChild(document.CreateTextNode(ConvertTokenToXmlValue(reader))); } else if (reader.TokenType == JsonToken.Null) { // empty element. do nothing } else { // finished element will have no children to deserialize if (reader.TokenType != JsonToken.EndObject) { manager.PushScope(); DeserializeNode(reader, document, manager, element); manager.PopScope(); } } } } private string ConvertTokenToXmlValue(JsonReader reader) { if (reader.TokenType == JsonToken.String) { return reader.Value.ToString(); } else if (reader.TokenType == JsonToken.Integer) { return XmlConvert.ToString(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); } else if (reader.TokenType == JsonToken.Float) { return XmlConvert.ToString(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture)); } else if (reader.TokenType == JsonToken.Boolean) { return XmlConvert.ToString(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); } else if (reader.TokenType == JsonToken.Date) { DateTime d = Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture); #if !NETFX_CORE return XmlConvert.ToString(d, DateTimeUtils.ToSerializationMode(d.Kind)); #else return XmlConvert.ToString(d); #endif } else if (reader.TokenType == JsonToken.Null) { return null; } else { throw JsonSerializationException.Create(reader, "Cannot get an XML string value from token type '{0}'.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } } private void ReadArrayElements(JsonReader reader, IXmlDocument document, string propertyName, IXmlNode currentNode, XmlNamespaceManager manager) { string elementPrefix = MiscellaneousUtils.GetPrefix(propertyName); IXmlElement nestedArrayElement = CreateElement(propertyName, document, elementPrefix, manager); currentNode.AppendChild(nestedArrayElement); int count = 0; while (reader.Read() && reader.TokenType != JsonToken.EndArray) { DeserializeValue(reader, document, manager, propertyName, nestedArrayElement); count++; } if (WriteArrayAttribute) { AddJsonArrayAttribute(nestedArrayElement, document); } if (count == 1 && WriteArrayAttribute) { IXmlElement arrayElement = nestedArrayElement.ChildNodes.CastValid().Single(n => n.LocalName == propertyName); AddJsonArrayAttribute(arrayElement, document); } } private void AddJsonArrayAttribute(IXmlElement element, IXmlDocument document) { element.SetAttributeNode(document.CreateAttribute("json:Array", JsonNamespaceUri, "true")); #if !NET20 // linq to xml doesn't automatically include prefixes via the namespace manager if (element is XElementWrapper) { if (element.GetPrefixOfNamespace(JsonNamespaceUri) == null) { element.SetAttributeNode(document.CreateAttribute("xmlns:json", "http://www.w3.org/2000/xmlns/", JsonNamespaceUri)); } } #endif } private Dictionary ReadAttributeElements(JsonReader reader, XmlNamespaceManager manager) { Dictionary attributeNameValues = new Dictionary(); bool finishedAttributes = false; bool finishedElement = false; // a string token means the element only has a single text child if (reader.TokenType != JsonToken.String && reader.TokenType != JsonToken.Null && reader.TokenType != JsonToken.Boolean && reader.TokenType != JsonToken.Integer && reader.TokenType != JsonToken.Float && reader.TokenType != JsonToken.Date && reader.TokenType != JsonToken.StartConstructor) { // read properties until first non-attribute is encountered while (!finishedAttributes && !finishedElement && reader.Read()) { switch (reader.TokenType) { case JsonToken.PropertyName: string attributeName = reader.Value.ToString(); if (!string.IsNullOrEmpty(attributeName)) { char firstChar = attributeName[0]; string attributeValue; switch (firstChar) { case '@': attributeName = attributeName.Substring(1); reader.Read(); attributeValue = ConvertTokenToXmlValue(reader); attributeNameValues.Add(attributeName, attributeValue); string namespacePrefix; if (IsNamespaceAttribute(attributeName, out namespacePrefix)) { manager.AddNamespace(namespacePrefix, attributeValue); } break; case '$': attributeName = attributeName.Substring(1); reader.Read(); attributeValue = reader.Value.ToString(); // check that JsonNamespaceUri is in scope // if it isn't then add it to document and namespace manager string jsonPrefix = manager.LookupPrefix(JsonNamespaceUri); if (jsonPrefix == null) { // ensure that the prefix used is free int? i = null; while (manager.LookupNamespace("json" + i) != null) { i = i.GetValueOrDefault() + 1; } jsonPrefix = "json" + i; attributeNameValues.Add("xmlns:" + jsonPrefix, JsonNamespaceUri); manager.AddNamespace(jsonPrefix, JsonNamespaceUri); } attributeNameValues.Add(jsonPrefix + ":" + attributeName, attributeValue); break; default: finishedAttributes = true; break; } } else { finishedAttributes = true; } break; case JsonToken.EndObject: finishedElement = true; break; default: throw new JsonSerializationException("Unexpected JsonToken: " + reader.TokenType); } } } return attributeNameValues; } private void CreateInstruction(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string propertyName) { if (propertyName == DeclarationName) { string version = null; string encoding = null; string standalone = null; while (reader.Read() && reader.TokenType != JsonToken.EndObject) { switch (reader.Value.ToString()) { case "@version": reader.Read(); version = reader.Value.ToString(); break; case "@encoding": reader.Read(); encoding = reader.Value.ToString(); break; case "@standalone": reader.Read(); standalone = reader.Value.ToString(); break; default: throw new JsonSerializationException("Unexpected property name encountered while deserializing XmlDeclaration: " + reader.Value); } } IXmlNode declaration = document.CreateXmlDeclaration(version, encoding, standalone); currentNode.AppendChild(declaration); } else { IXmlNode instruction = document.CreateProcessingInstruction(propertyName.Substring(1), reader.Value.ToString()); currentNode.AppendChild(instruction); } } private IXmlElement CreateElement(string elementName, IXmlDocument document, string elementPrefix, XmlNamespaceManager manager) { string ns = string.IsNullOrEmpty(elementPrefix) ? manager.DefaultNamespace : manager.LookupNamespace(elementPrefix); IXmlElement element = (!string.IsNullOrEmpty(ns)) ? document.CreateElement(elementName, ns) : document.CreateElement(elementName); return element; } private void DeserializeNode(JsonReader reader, IXmlDocument document, XmlNamespaceManager manager, IXmlNode currentNode) { do { switch (reader.TokenType) { case JsonToken.PropertyName: if (currentNode.NodeType == XmlNodeType.Document && document.DocumentElement != null) throw new JsonSerializationException("JSON root object has multiple properties. The root object must have a single property in order to create a valid XML document. Consider specifing a DeserializeRootElementName."); string propertyName = reader.Value.ToString(); reader.Read(); if (reader.TokenType == JsonToken.StartArray) { int count = 0; while (reader.Read() && reader.TokenType != JsonToken.EndArray) { DeserializeValue(reader, document, manager, propertyName, currentNode); count++; } if (count == 1 && WriteArrayAttribute) { IXmlElement arrayElement = currentNode.ChildNodes.CastValid().Single(n => n.LocalName == propertyName); AddJsonArrayAttribute(arrayElement, document); } } else { DeserializeValue(reader, document, manager, propertyName, currentNode); } break; case JsonToken.StartConstructor: string constructorName = reader.Value.ToString(); while (reader.Read() && reader.TokenType != JsonToken.EndConstructor) { DeserializeValue(reader, document, manager, constructorName, currentNode); } break; case JsonToken.Comment: currentNode.AppendChild(document.CreateComment((string)reader.Value)); break; case JsonToken.EndObject: case JsonToken.EndArray: return; default: throw new JsonSerializationException("Unexpected JsonToken when deserializing node: " + reader.TokenType); } } while (reader.TokenType == JsonToken.PropertyName || reader.Read()); // don't read if current token is a property. token was already read when parsing element attributes } /// /// Checks if the attributeName is a namespace attribute. /// /// Attribute name to test. /// The attribute name prefix if it has one, otherwise an empty string. /// True if attribute name is for a namespace attribute, otherwise false. private bool IsNamespaceAttribute(string attributeName, out string prefix) { if (attributeName.StartsWith("xmlns", StringComparison.Ordinal)) { if (attributeName.Length == 5) { prefix = string.Empty; return true; } else if (attributeName[5] == ':') { prefix = attributeName.Substring(6, attributeName.Length - 6); return true; } } prefix = null; return false; } private IEnumerable ValueAttributes(IEnumerable c) { return c.Where(a => a.NamespaceUri != JsonNamespaceUri); } #endregion /// /// Determines whether this instance can convert the specified value type. /// /// Type of the value. /// /// true if this instance can convert the specified value type; otherwise, false. /// public override bool CanConvert(Type valueType) { #if !NET20 if (typeof(XObject).IsAssignableFrom(valueType)) return true; #endif #if !(SILVERLIGHT || NETFX_CORE) if (typeof(XmlNode).IsAssignableFrom(valueType)) return true; #endif return false; } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/DataSetConverter.cs0000644000175000017500000000721212253423361030650 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; using System.Data; using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from JSON. /// public class DataSetConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { DataSet dataSet = (DataSet)value; DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; DataTableConverter converter = new DataTableConverter(); writer.WriteStartObject(); foreach (DataTable table in dataSet.Tables) { writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(table.TableName) : table.TableName); converter.WriteJson(writer, table, serializer); } writer.WriteEndObject(); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { DataSet ds = new DataSet(); DataTableConverter converter = new DataTableConverter(); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { DataTable dt = (DataTable)converter.ReadJson(reader, typeof (DataTable), null, serializer); ds.Tables.Add(dt); reader.Read(); } return ds; } /// /// Determines whether this instance can convert the specified value type. /// /// Type of the value. /// /// true if this instance can convert the specified value type; otherwise, false. /// public override bool CanConvert(Type valueType) { return (valueType == typeof(DataSet)); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/BsonObjectIdConverter.cs0000644000175000017500000000647112253423361031636 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Bson; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from JSON and BSON. /// public class BsonObjectIdConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { BsonObjectId objectId = (BsonObjectId) value; BsonWriter bsonWriter = writer as BsonWriter; if (bsonWriter != null) { bsonWriter.WriteObjectId(objectId.Value); } else { writer.WriteValue(objectId.Value); } } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.Bytes) throw new JsonSerializationException("Expected Bytes but got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); byte[] value = (byte[])reader.Value; return new BsonObjectId(value); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return (objectType == typeof (BsonObjectId)); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/RegexConverter.cs0000644000175000017500000001333112253423361030374 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Text.RegularExpressions; using Newtonsoft.Json.Bson; using System.Globalization; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from JSON and BSON. /// public class RegexConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Regex regex = (Regex) value; BsonWriter bsonWriter = writer as BsonWriter; if (bsonWriter != null) WriteBson(bsonWriter, regex); else WriteJson(writer, regex); } private bool HasFlag(RegexOptions options, RegexOptions flag) { return ((options & flag) == flag); } private void WriteBson(BsonWriter writer, Regex regex) { // Regular expression - The first cstring is the regex pattern, the second // is the regex options string. Options are identified by characters, which // must be stored in alphabetical order. Valid options are 'i' for case // insensitive matching, 'm' for multiline matching, 'x' for verbose mode, // 'l' to make \w, \W, etc. locale dependent, 's' for dotall mode // ('.' matches everything), and 'u' to make \w, \W, etc. match unicode. string options = null; if (HasFlag(regex.Options, RegexOptions.IgnoreCase)) options += "i"; if (HasFlag(regex.Options, RegexOptions.Multiline)) options += "m"; if (HasFlag(regex.Options, RegexOptions.Singleline)) options += "s"; options += "u"; if (HasFlag(regex.Options, RegexOptions.ExplicitCapture)) options += "x"; writer.WriteRegex(regex.ToString(), options); } private void WriteJson(JsonWriter writer, Regex regex) { writer.WriteStartObject(); writer.WritePropertyName("Pattern"); writer.WriteValue(regex.ToString()); writer.WritePropertyName("Options"); writer.WriteValue(regex.Options); writer.WriteEndObject(); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { BsonReader bsonReader = reader as BsonReader; if (bsonReader != null) return ReadBson(bsonReader); else return ReadJson(reader); } private object ReadBson(BsonReader reader) { string regexText = (string)reader.Value; int patternOptionDelimiterIndex = regexText.LastIndexOf('/'); string patternText = regexText.Substring(1, patternOptionDelimiterIndex - 1); string optionsText = regexText.Substring(patternOptionDelimiterIndex + 1); RegexOptions options = RegexOptions.None; foreach (char c in optionsText) { switch (c) { case 'i': options |= RegexOptions.IgnoreCase; break; case 'm': options |= RegexOptions.Multiline; break; case 's': options |= RegexOptions.Singleline; break; case 'x': options |= RegexOptions.ExplicitCapture; break; } } return new Regex(patternText, options); } private Regex ReadJson(JsonReader reader) { reader.Read(); reader.Read(); string pattern = (string)reader.Value; reader.Read(); reader.Read(); int options = Convert.ToInt32(reader.Value, CultureInfo.InvariantCulture); reader.Read(); return new Regex(pattern, (RegexOptions) options); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return (objectType == typeof (Regex)); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs0000644000175000017500000001121312253423361033002 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). /// public class JavaScriptDateTimeConverter : DateTimeConverterBase { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { long ticks; if (value is DateTime) { DateTime dateTime = (DateTime)value; DateTime utcDateTime = dateTime.ToUniversalTime(); ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(utcDateTime); } #if !PocketPC && !NET20 else if (value is DateTimeOffset) { DateTimeOffset dateTimeOffset = (DateTimeOffset)value; DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime); } #endif else { throw new JsonSerializationException("Expected date object value."); } writer.WriteStartConstructor("Date"); writer.WriteValue(ticks); writer.WriteEndConstructor(); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing property value of the JSON that is being converted. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { Type t = (ReflectionUtils.IsNullableType(objectType)) ? Nullable.GetUnderlyingType(objectType) : objectType; if (reader.TokenType == JsonToken.Null) { if (!ReflectionUtils.IsNullable(objectType)) throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); return null; } if (reader.TokenType != JsonToken.StartConstructor || !string.Equals(reader.Value.ToString(), "Date", StringComparison.Ordinal)) throw JsonSerializationException.Create(reader, "Unexpected token or value when parsing date. Token: {0}, Value: {1}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType, reader.Value)); reader.Read(); if (reader.TokenType != JsonToken.Integer) throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected Integer, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); long ticks = (long)reader.Value; DateTime d = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks); reader.Read(); if (reader.TokenType != JsonToken.EndConstructor) throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected EndConstructor, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); #if !PocketPC && !NET20 if (t == typeof(DateTimeOffset)) return new DateTimeOffset(d); #endif return d; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/DateTimeConverterBase.cs0000644000175000017500000000377112253423361031620 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Converters { /// /// Provides a base class for converting a to and from JSON. /// public abstract class DateTimeConverterBase : JsonConverter { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { if (objectType == typeof(DateTime) || objectType == typeof(DateTime?)) return true; #if !PocketPC && !NET20 if (objectType == typeof(DateTimeOffset) || objectType == typeof(DateTimeOffset?)) return true; #endif return false; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/BinaryConverter.cs0000644000175000017500000001371712253423361030556 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; using System.Data.SqlTypes; using System.Globalization; using Newtonsoft.Json.Utilities; using System.Collections.Generic; namespace Newtonsoft.Json.Converters { #if !NET20 internal interface IBinary { byte[] ToArray(); } #endif /// /// Converts a binary value to and from a base 64 string value. /// public class BinaryConverter : JsonConverter { #if !NET20 private const string BinaryTypeName = "System.Data.Linq.Binary"; #endif /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } byte[] data = GetByteArray(value); writer.WriteValue(data); } private byte[] GetByteArray(object value) { #if !(NET20) if (value.GetType().AssignableToTypeName(BinaryTypeName)) { IBinary binary = DynamicWrapper.CreateWrapper(value); return binary.ToArray(); } #endif if (value is SqlBinary) return ((SqlBinary) value).Value; throw new JsonSerializationException("Unexpected value type when writing binary: {0}".FormatWith(CultureInfo.InvariantCulture, value.GetType())); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { Type t = (ReflectionUtils.IsNullableType(objectType)) ? Nullable.GetUnderlyingType(objectType) : objectType; if (reader.TokenType == JsonToken.Null) { if (!ReflectionUtils.IsNullable(objectType)) throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); return null; } byte[] data; if (reader.TokenType == JsonToken.StartArray) { data = ReadByteArray(reader); } else if (reader.TokenType == JsonToken.String) { // current token is already at base64 string // unable to call ReadAsBytes so do it the old fashion way string encodedData = reader.Value.ToString(); data = Convert.FromBase64String(encodedData); } else { throw JsonSerializationException.Create(reader, "Unexpected token parsing binary. Expected String or StartArray, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } #if !NET20 if (t.AssignableToTypeName(BinaryTypeName)) return Activator.CreateInstance(t, data); #endif if (t == typeof(SqlBinary)) return new SqlBinary(data); throw JsonSerializationException.Create(reader, "Unexpected object type when writing binary: {0}".FormatWith(CultureInfo.InvariantCulture, objectType)); } private byte[] ReadByteArray(JsonReader reader) { List byteList = new List(); while (reader.Read()) { switch (reader.TokenType) { case JsonToken.Integer: byteList.Add(Convert.ToByte(reader.Value, CultureInfo.InvariantCulture)); break; case JsonToken.EndArray: return byteList.ToArray(); case JsonToken.Comment: // skip break; default: throw JsonSerializationException.Create(reader, "Unexpected token when reading bytes: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } } throw JsonSerializationException.Create(reader, "Unexpected end when reading bytes."); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { #if !NET20 if (objectType.AssignableToTypeName(BinaryTypeName)) return true; #endif if (objectType == typeof(SqlBinary) || objectType == typeof(SqlBinary?)) return true; return false; } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs0000644000175000017500000001207012253423361031662 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; using System.Reflection; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from JSON. /// public class KeyValuePairConverter : JsonConverter { private const string KeyName = "Key"; private const string ValueName = "Value"; /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { Type t = value.GetType(); PropertyInfo keyProperty = t.GetProperty(KeyName); PropertyInfo valueProperty = t.GetProperty(ValueName); DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; writer.WriteStartObject(); writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(KeyName) : KeyName); serializer.Serialize(writer, ReflectionUtils.GetMemberValue(keyProperty, value)); writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(ValueName) : ValueName); serializer.Serialize(writer, ReflectionUtils.GetMemberValue(valueProperty, value)); writer.WriteEndObject(); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { bool isNullable = ReflectionUtils.IsNullableType(objectType); if (reader.TokenType == JsonToken.Null) { if (!isNullable) throw JsonSerializationException.Create(reader, "Cannot convert null value to KeyValuePair."); return null; } Type t = (isNullable) ? Nullable.GetUnderlyingType(objectType) : objectType; IList genericArguments = t.GetGenericArguments(); Type keyType = genericArguments[0]; Type valueType = genericArguments[1]; object key = null; object value = null; reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { string propertyName = reader.Value.ToString(); if (string.Equals(propertyName, KeyName, StringComparison.OrdinalIgnoreCase)) { reader.Read(); key = serializer.Deserialize(reader, keyType); } else if (string.Equals(propertyName, ValueName, StringComparison.OrdinalIgnoreCase)) { reader.Read(); value = serializer.Deserialize(reader, valueType); } else { reader.Skip(); } reader.Read(); } return ReflectionUtils.CreateInstance(t, key, value); } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { Type t = (ReflectionUtils.IsNullableType(objectType)) ? Nullable.GetUnderlyingType(objectType) : objectType; if (t.IsValueType() && t.IsGenericType()) return (t.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)); return false; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs0000644000175000017500000001457012253423361031477 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). /// public class IsoDateTimeConverter : DateTimeConverterBase { private const string DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; private DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; private string _dateTimeFormat; private CultureInfo _culture; /// /// Gets or sets the date time styles used when converting a date to and from JSON. /// /// The date time styles used when converting a date to and from JSON. public DateTimeStyles DateTimeStyles { get { return _dateTimeStyles; } set { _dateTimeStyles = value; } } /// /// Gets or sets the date time format used when converting a date to and from JSON. /// /// The date time format used when converting a date to and from JSON. public string DateTimeFormat { get { return _dateTimeFormat ?? string.Empty; } set { _dateTimeFormat = StringUtils.NullEmptyString(value); } } /// /// Gets or sets the culture used when converting a date to and from JSON. /// /// The culture used when converting a date to and from JSON. public CultureInfo Culture { get { return _culture ?? CultureInfo.CurrentCulture; } set { _culture = value; } } /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { string text; if (value is DateTime) { DateTime dateTime = (DateTime)value; if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) dateTime = dateTime.ToUniversalTime(); text = dateTime.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); } #if !PocketPC && !NET20 else if (value is DateTimeOffset) { DateTimeOffset dateTimeOffset = (DateTimeOffset)value; if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) dateTimeOffset = dateTimeOffset.ToUniversalTime(); text = dateTimeOffset.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); } #endif else { throw new JsonSerializationException("Unexpected value when converting date. Expected DateTime or DateTimeOffset, got {0}.".FormatWith(CultureInfo.InvariantCulture, ReflectionUtils.GetObjectType(value))); } writer.WriteValue(text); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { bool nullable = ReflectionUtils.IsNullableType(objectType); Type t = (nullable) ? Nullable.GetUnderlyingType(objectType) : objectType; if (reader.TokenType == JsonToken.Null) { if (!ReflectionUtils.IsNullableType(objectType)) throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); return null; } if (reader.TokenType == JsonToken.Date) { #if !PocketPC && !NET20 if (t == typeof(DateTimeOffset)) return new DateTimeOffset((DateTime)reader.Value); #endif return reader.Value; } if (reader.TokenType != JsonToken.String) throw JsonSerializationException.Create(reader, "Unexpected token parsing date. Expected String, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); string dateText = reader.Value.ToString(); if (string.IsNullOrEmpty(dateText) && nullable) return null; #if !PocketPC && !NET20 if (t == typeof(DateTimeOffset)) { if (!string.IsNullOrEmpty(_dateTimeFormat)) return DateTimeOffset.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles); else return DateTimeOffset.Parse(dateText, Culture, _dateTimeStyles); } #endif if (!string.IsNullOrEmpty(_dateTimeFormat)) return DateTime.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles); else return DateTime.Parse(dateText, Culture, _dateTimeStyles); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/StringEnumConverter.cs0000644000175000017500000001564612253423361031430 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Runtime.Serialization; using Newtonsoft.Json.Utilities; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Converters { /// /// Converts an to and from its name string value. /// public class StringEnumConverter : JsonConverter { private readonly Dictionary> _enumMemberNamesPerType = new Dictionary>(); /// /// Gets or sets a value indicating whether the written enum text should be camel case. /// /// true if the written enum text will be camel case; otherwise, false. public bool CamelCaseText { get; set; } /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } Enum e = (Enum)value; string enumName = e.ToString("G"); if (char.IsNumber(enumName[0]) || enumName[0] == '-') { writer.WriteValue(value); } else { BidirectionalDictionary map = GetEnumNameMap(e.GetType()); string resolvedEnumName; map.TryGetByFirst(enumName, out resolvedEnumName); resolvedEnumName = resolvedEnumName ?? enumName; if (CamelCaseText) { string[] names = resolvedEnumName.Split(',').Select(item => StringUtils.ToCamelCase(item.Trim())).ToArray(); resolvedEnumName = string.Join(", ", names); } writer.WriteValue(resolvedEnumName); } } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { Type t = (ReflectionUtils.IsNullableType(objectType)) ? Nullable.GetUnderlyingType(objectType) : objectType; if (reader.TokenType == JsonToken.Null) { if (!ReflectionUtils.IsNullableType(objectType)) throw JsonSerializationException.Create(reader, "Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); return null; } if (reader.TokenType == JsonToken.String) { var map = GetEnumNameMap(t); string resolvedEnumName; map.TryGetBySecond(reader.Value.ToString(), out resolvedEnumName); resolvedEnumName = resolvedEnumName ?? reader.Value.ToString(); return Enum.Parse(t, resolvedEnumName, true); } if (reader.TokenType == JsonToken.Integer) return ConvertUtils.ConvertOrCast(reader.Value, CultureInfo.InvariantCulture, t); throw JsonSerializationException.Create(reader, "Unexpected token when parsing enum. Expected String or Integer, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); } /// /// A cached representation of the Enum string representation to respect per Enum field name. /// /// The type of the Enum. /// A map of enum field name to either the field name, or the configured enum member name (). private BidirectionalDictionary GetEnumNameMap(Type t) { BidirectionalDictionary map; if (!_enumMemberNamesPerType.TryGetValue(t, out map)) { lock (_enumMemberNamesPerType) { if (_enumMemberNamesPerType.TryGetValue(t, out map)) return map; map = new BidirectionalDictionary( StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase); foreach (FieldInfo f in t.GetFields()) { string n1 = f.Name; string n2; #if !NET20 n2 = f.GetCustomAttributes(typeof (EnumMemberAttribute), true) .Cast() .Select(a => a.Value) .SingleOrDefault() ?? f.Name; #else n2 = f.Name; #endif string s; if (map.TryGetBySecond(n2, out s)) { throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'." .FormatWith(CultureInfo.InvariantCulture, n2, t.Name)); } map.Add(n1, n2); } _enumMemberNamesPerType[t] = map; } } return map; } /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { Type t = (ReflectionUtils.IsNullableType(objectType)) ? Nullable.GetUnderlyingType(objectType) : objectType; return t.IsEnum(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Converters/DataTableConverter.cs0000644000175000017500000001171112253423361031143 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) using System; using System.Data; using Newtonsoft.Json.Serialization; namespace Newtonsoft.Json.Converters { /// /// Converts a to and from JSON. /// public class DataTableConverter : JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { DataTable table = (DataTable)value; DefaultContractResolver resolver = serializer.ContractResolver as DefaultContractResolver; writer.WriteStartArray(); foreach (DataRow row in table.Rows) { writer.WriteStartObject(); foreach (DataColumn column in row.Table.Columns) { if (serializer.NullValueHandling == NullValueHandling.Ignore && (row[column] == null || row[column] == DBNull.Value)) continue; writer.WritePropertyName((resolver != null) ? resolver.GetResolvedPropertyName(column.ColumnName) : column.ColumnName); serializer.Serialize(writer, row[column]); } writer.WriteEndObject(); } writer.WriteEndArray(); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { DataTable dt; if (reader.TokenType == JsonToken.PropertyName) { dt = new DataTable((string)reader.Value); reader.Read(); } else { dt = new DataTable(); } reader.Read(); while (reader.TokenType == JsonToken.StartObject) { DataRow dr = dt.NewRow(); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { string columnName = (string)reader.Value; reader.Read(); if (!dt.Columns.Contains(columnName)) { Type columnType = GetColumnDataType(reader.TokenType); dt.Columns.Add(new DataColumn(columnName, columnType)); } dr[columnName] = reader.Value ?? DBNull.Value; reader.Read(); } dr.EndEdit(); dt.Rows.Add(dr); reader.Read(); } return dt; } private static Type GetColumnDataType(JsonToken tokenType) { switch (tokenType) { case JsonToken.Integer: return typeof (long); case JsonToken.Float: return typeof (double); case JsonToken.String: case JsonToken.Null: case JsonToken.Undefined: return typeof (string); case JsonToken.Boolean: return typeof (bool); case JsonToken.Date: return typeof (DateTime); default: throw new ArgumentOutOfRangeException(); } } /// /// Determines whether this instance can convert the specified value type. /// /// Type of the value. /// /// true if this instance can convert the specified value type; otherwise, false. /// public override bool CanConvert(Type valueType) { return (valueType == typeof(DataTable)); } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonConstructorAttribute.cs0000644000175000017500000000271512253423361030347 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Instructs the to use the specified constructor when deserializing that object. /// [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/0000755000175000017500000000000012253423361023651 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonBinaryType.cs0000644000175000017500000000266212253423361027116 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Bson { internal enum BsonBinaryType : byte { Binary = 0x00, Function = 0x01, [Obsolete("This type has been deprecated in the BSON specification. Use Binary instead.")] Data = 0x02, Uuid = 0x03, Md5 = 0x05, UserDefined = 0x80 } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonType.cs0000644000175000017500000000303412253423361025743 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Bson { internal enum BsonType : sbyte { Number = 1, String = 2, Object = 3, Array = 4, Binary = 5, Undefined = 6, Oid = 7, Boolean = 8, Date = 9, Null = 10, Regex = 11, Reference = 12, Code = 13, Symbol = 14, CodeWScope = 15, Integer = 16, TimeStamp = 17, Long = 18, MinKey = -1, MaxKey = 127 } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonWriter.cs0000644000175000017500000003445112253423361026305 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; using System.Globalization; namespace Newtonsoft.Json.Bson { /// /// Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. /// public class BsonWriter : JsonWriter { private readonly BsonBinaryWriter _writer; private BsonToken _root; private BsonToken _parent; private string _propertyName; /// /// Gets or sets the used when writing values to BSON. /// When set to no conversion will occur. /// /// The used when writing values to BSON. public DateTimeKind DateTimeKindHandling { get { return _writer.DateTimeKindHandling; } set { _writer.DateTimeKindHandling = value; } } /// /// Initializes a new instance of the class. /// /// The stream. public BsonWriter(Stream stream) { ValidationUtils.ArgumentNotNull(stream, "stream"); _writer = new BsonBinaryWriter(new BinaryWriter(stream)); } /// /// Initializes a new instance of the class. /// /// The writer. public BsonWriter(BinaryWriter writer) { ValidationUtils.ArgumentNotNull(writer, "writer"); _writer = new BsonBinaryWriter(writer); } /// /// Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. /// public override void Flush() { _writer.Flush(); } /// /// Writes the end. /// /// The token. protected override void WriteEnd(JsonToken token) { base.WriteEnd(token); RemoveParent(); if (Top == 0) { _writer.WriteToken(_root); } } /// /// Writes out a comment /*...*/ containing the specified text. /// /// Text to place inside the comment. public override void WriteComment(string text) { throw JsonWriterException.Create(this, "Cannot write JSON comment as BSON.", null); } /// /// Writes the start of a constructor with the given name. /// /// The name of the constructor. public override void WriteStartConstructor(string name) { throw JsonWriterException.Create(this, "Cannot write JSON constructor as BSON.", null); } /// /// Writes raw JSON. /// /// The raw JSON to write. public override void WriteRaw(string json) { throw JsonWriterException.Create(this, "Cannot write raw JSON as BSON.", null); } /// /// Writes raw JSON where a value is expected and updates the writer's state. /// /// The raw JSON to write. public override void WriteRawValue(string json) { throw JsonWriterException.Create(this, "Cannot write raw JSON as BSON.", null); } /// /// Writes the beginning of a Json array. /// public override void WriteStartArray() { base.WriteStartArray(); AddParent(new BsonArray()); } /// /// Writes the beginning of a Json object. /// public override void WriteStartObject() { base.WriteStartObject(); AddParent(new BsonObject()); } /// /// Writes the property name of a name/value pair on a Json object. /// /// The name of the property. public override void WritePropertyName(string name) { base.WritePropertyName(name); _propertyName = name; } /// /// Closes this stream and the underlying stream. /// public override void Close() { base.Close(); if (CloseOutput && _writer != null) _writer.Close(); } private void AddParent(BsonToken container) { AddToken(container); _parent = container; } private void RemoveParent() { _parent = _parent.Parent; } private void AddValue(object value, BsonType type) { AddToken(new BsonValue(value, type)); } internal void AddToken(BsonToken token) { if (_parent != null) { if (_parent is BsonObject) { ((BsonObject) _parent).Add(_propertyName, token); _propertyName = null; } else { ((BsonArray) _parent).Add(token); } } else { if (token.Type != BsonType.Object && token.Type != BsonType.Array) throw JsonWriterException.Create(this, "Error writing {0} value. BSON must start with an Object or Array.".FormatWith(CultureInfo.InvariantCulture, token.Type), null); _parent = token; _root = token; } } #region WriteValue methods /// /// Writes a null value. /// public override void WriteNull() { base.WriteNull(); AddValue(null, BsonType.Null); } /// /// Writes an undefined value. /// public override void WriteUndefined() { base.WriteUndefined(); AddValue(null, BsonType.Undefined); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(string value) { base.WriteValue(value); if (value == null) AddValue(null, BsonType.Null); else AddToken(new BsonString(value, true)); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(int value) { base.WriteValue(value); AddValue(value, BsonType.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(uint value) { if (value > int.MaxValue) throw JsonWriterException.Create(this, "Value is too large to fit in a signed 32 bit integer. BSON does not support unsigned values.", null); base.WriteValue(value); AddValue(value, BsonType.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(long value) { base.WriteValue(value); AddValue(value, BsonType.Long); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(ulong value) { if (value > long.MaxValue) throw JsonWriterException.Create(this, "Value is too large to fit in a signed 64 bit integer. BSON does not support unsigned values.", null); base.WriteValue(value); AddValue(value, BsonType.Long); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(float value) { base.WriteValue(value); AddValue(value, BsonType.Number); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(double value) { base.WriteValue(value); AddValue(value, BsonType.Number); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(bool value) { base.WriteValue(value); AddValue(value, BsonType.Boolean); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(short value) { base.WriteValue(value); AddValue(value, BsonType.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(ushort value) { base.WriteValue(value); AddValue(value, BsonType.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(char value) { base.WriteValue(value); string s = null; #if !(NETFX_CORE || PORTABLE) s = value.ToString(CultureInfo.InvariantCulture); #else s = value.ToString(); #endif AddToken(new BsonString(s, true)); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(byte value) { base.WriteValue(value); AddValue(value, BsonType.Integer); } /// /// Writes a value. /// /// The value to write. [CLSCompliant(false)] public override void WriteValue(sbyte value) { base.WriteValue(value); AddValue(value, BsonType.Integer); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(decimal value) { base.WriteValue(value); AddValue(value, BsonType.Number); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(DateTime value) { base.WriteValue(value); value = JsonConvert.EnsureDateTime(value, DateTimeZoneHandling); AddValue(value, BsonType.Date); } #if !PocketPC && !NET20 /// /// Writes a value. /// /// The value to write. public override void WriteValue(DateTimeOffset value) { base.WriteValue(value); AddValue(value, BsonType.Date); } #endif /// /// Writes a value. /// /// The value to write. public override void WriteValue(byte[] value) { base.WriteValue(value); AddValue(value, BsonType.Binary); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(Guid value) { base.WriteValue(value); AddToken(new BsonString(value.ToString(), true)); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(TimeSpan value) { base.WriteValue(value); AddToken(new BsonString(value.ToString(), true)); } /// /// Writes a value. /// /// The value to write. public override void WriteValue(Uri value) { base.WriteValue(value); AddToken(new BsonString(value.ToString(), true)); } #endregion /// /// Writes a value that represents a BSON object id. /// /// The Object ID value to write. public void WriteObjectId(byte[] value) { ValidationUtils.ArgumentNotNull(value, "value"); if (value.Length != 12) throw JsonWriterException.Create(this, "An object id must be 12 bytes", null); // hack to update the writer state AutoComplete(JsonToken.Undefined); AddValue(value, BsonType.Oid); } /// /// Writes a BSON regex. /// /// The regex pattern. /// The regex options. public void WriteRegex(string pattern, string options) { ValidationUtils.ArgumentNotNull(pattern, "pattern"); // hack to update the writer state AutoComplete(JsonToken.Undefined); AddToken(new BsonRegex(pattern, options)); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonBinaryWriter.cs0000644000175000017500000002243312253423361027447 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.IO; using System.Text; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Bson { internal class BsonBinaryWriter { private static readonly Encoding Encoding = new UTF8Encoding(false); private readonly BinaryWriter _writer; private byte[] _largeByteBuffer; public DateTimeKind DateTimeKindHandling { get; set; } public BsonBinaryWriter(BinaryWriter writer) { DateTimeKindHandling = DateTimeKind.Utc; _writer = writer; } public void Flush() { _writer.Flush(); } public void Close() { #if !(NETFX_CORE || PORTABLE) _writer.Close(); #else _writer.Dispose(); #endif } public void WriteToken(BsonToken t) { CalculateSize(t); WriteTokenInternal(t); } private void WriteTokenInternal(BsonToken t) { switch (t.Type) { case BsonType.Object: { BsonObject value = (BsonObject)t; _writer.Write(value.CalculatedSize); foreach (BsonProperty property in value) { _writer.Write((sbyte)property.Value.Type); WriteString((string)property.Name.Value, property.Name.ByteCount, null); WriteTokenInternal(property.Value); } _writer.Write((byte)0); } break; case BsonType.Array: { BsonArray value = (BsonArray)t; _writer.Write(value.CalculatedSize); int index = 0; foreach (BsonToken c in value) { _writer.Write((sbyte)c.Type); WriteString(index.ToString(CultureInfo.InvariantCulture), MathUtils.IntLength(index), null); WriteTokenInternal(c); index++; } _writer.Write((byte)0); } break; case BsonType.Integer: { BsonValue value = (BsonValue)t; _writer.Write(Convert.ToInt32(value.Value, CultureInfo.InvariantCulture)); } break; case BsonType.Long: { BsonValue value = (BsonValue)t; _writer.Write(Convert.ToInt64(value.Value, CultureInfo.InvariantCulture)); } break; case BsonType.Number: { BsonValue value = (BsonValue)t; _writer.Write(Convert.ToDouble(value.Value, CultureInfo.InvariantCulture)); } break; case BsonType.String: { BsonString value = (BsonString)t; WriteString((string)value.Value, value.ByteCount, value.CalculatedSize - 4); } break; case BsonType.Boolean: { BsonValue value = (BsonValue)t; _writer.Write((bool)value.Value); } break; case BsonType.Null: case BsonType.Undefined: break; case BsonType.Date: { BsonValue value = (BsonValue)t; long ticks = 0; if (value.Value is DateTime) { DateTime dateTime = (DateTime)value.Value; if (DateTimeKindHandling == DateTimeKind.Utc) dateTime = dateTime.ToUniversalTime(); else if (DateTimeKindHandling == DateTimeKind.Local) dateTime = dateTime.ToLocalTime(); ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(dateTime, false); } #if !PocketPC && !NET20 else { DateTimeOffset dateTimeOffset = (DateTimeOffset)value.Value; ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(dateTimeOffset.UtcDateTime, dateTimeOffset.Offset); } #endif _writer.Write(ticks); } break; case BsonType.Binary: { BsonValue value = (BsonValue)t; byte[] data = (byte[])value.Value; _writer.Write(data.Length); _writer.Write((byte)BsonBinaryType.Binary); _writer.Write(data); } break; case BsonType.Oid: { BsonValue value = (BsonValue)t; byte[] data = (byte[])value.Value; _writer.Write(data); } break; case BsonType.Regex: { BsonRegex value = (BsonRegex)t; WriteString((string)value.Pattern.Value, value.Pattern.ByteCount, null); WriteString((string)value.Options.Value, value.Options.ByteCount, null); } break; default: throw new ArgumentOutOfRangeException("t", "Unexpected token when writing BSON: {0}".FormatWith(CultureInfo.InvariantCulture, t.Type)); } } private void WriteString(string s, int byteCount, int? calculatedlengthPrefix) { if (calculatedlengthPrefix != null) _writer.Write(calculatedlengthPrefix.Value); WriteUtf8Bytes(s, byteCount); _writer.Write((byte)0); } public void WriteUtf8Bytes(string s, int byteCount) { if (s != null) { if (_largeByteBuffer == null) { _largeByteBuffer = new byte[256]; } if (byteCount <= 256) { Encoding.GetBytes(s, 0, s.Length, _largeByteBuffer, 0); _writer.Write(_largeByteBuffer, 0, byteCount); } else { byte[] bytes = Encoding.GetBytes(s); _writer.Write(bytes); } } } private int CalculateSize(int stringByteCount) { return stringByteCount + 1; } private int CalculateSizeWithLength(int stringByteCount, bool includeSize) { int baseSize = (includeSize) ? 5 // size bytes + terminator : 1; // terminator return baseSize + stringByteCount; } private int CalculateSize(BsonToken t) { switch (t.Type) { case BsonType.Object: { BsonObject value = (BsonObject)t; int bases = 4; foreach (BsonProperty p in value) { int size = 1; size += CalculateSize(p.Name); size += CalculateSize(p.Value); bases += size; } bases += 1; value.CalculatedSize = bases; return bases; } case BsonType.Array: { BsonArray value = (BsonArray)t; int size = 4; int index = 0; foreach (BsonToken c in value) { size += 1; size += CalculateSize(MathUtils.IntLength(index)); size += CalculateSize(c); index++; } size += 1; value.CalculatedSize = size; return value.CalculatedSize; } case BsonType.Integer: return 4; case BsonType.Long: return 8; case BsonType.Number: return 8; case BsonType.String: { BsonString value = (BsonString)t; string s = (string)value.Value; value.ByteCount = (s != null) ? Encoding.GetByteCount(s) : 0; value.CalculatedSize = CalculateSizeWithLength(value.ByteCount, value.IncludeLength); return value.CalculatedSize; } case BsonType.Boolean: return 1; case BsonType.Null: case BsonType.Undefined: return 0; case BsonType.Date: return 8; case BsonType.Binary: { BsonValue value = (BsonValue)t; byte[] data = (byte[])value.Value; value.CalculatedSize = 4 + 1 + data.Length; return value.CalculatedSize; } case BsonType.Oid: return 12; case BsonType.Regex: { BsonRegex value = (BsonRegex)t; int size = 0; size += CalculateSize(value.Pattern); size += CalculateSize(value.Options); value.CalculatedSize = size; return value.CalculatedSize; } default: throw new ArgumentOutOfRangeException("t", "Unexpected token when writing BSON: {0}".FormatWith(CultureInfo.InvariantCulture, t.Type)); } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonToken.cs0000644000175000017500000000716712253423361026115 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections; using System.Collections.Generic; namespace Newtonsoft.Json.Bson { internal abstract class BsonToken { public abstract BsonType Type { get; } public BsonToken Parent { get; set; } public int CalculatedSize { get; set; } } internal class BsonObject : BsonToken, IEnumerable { private readonly List _children = new List(); public void Add(string name, BsonToken token) { _children.Add(new BsonProperty { Name = new BsonString(name, false), Value = token }); token.Parent = this; } public override BsonType Type { get { return BsonType.Object; } } public IEnumerator GetEnumerator() { return _children.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } internal class BsonArray : BsonToken, IEnumerable { private readonly List _children = new List(); public void Add(BsonToken token) { _children.Add(token); token.Parent = this; } public override BsonType Type { get { return BsonType.Array; } } public IEnumerator GetEnumerator() { return _children.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } internal class BsonValue : BsonToken { private readonly object _value; private readonly BsonType _type; public BsonValue(object value, BsonType type) { _value = value; _type = type; } public object Value { get { return _value; } } public override BsonType Type { get { return _type; } } } internal class BsonString : BsonValue { public int ByteCount { get; set; } public bool IncludeLength { get; set; } public BsonString(object value, bool includeLength) : base(value, BsonType.String) { IncludeLength = includeLength; } } internal class BsonRegex : BsonToken { public BsonString Pattern { get; set; } public BsonString Options { get; set; } public BsonRegex(string pattern, string options) { Pattern = new BsonString(pattern, false); Options = new BsonString(options, false); } public override BsonType Type { get { return BsonType.Regex; } } } internal class BsonProperty { public BsonString Name { get; set; } public BsonToken Value { get; set; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonObjectId.cs0000644000175000017500000000357612253423361026520 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Bson { /// /// Represents a BSON Oid (object id). /// public class BsonObjectId { /// /// Gets or sets the value of the Oid. /// /// The value of the Oid. public byte[] Value { get; private set; } /// /// Initializes a new instance of the class. /// /// The Oid value. public BsonObjectId(byte[] value) { ValidationUtils.ArgumentNotNull(value, "value"); if (value.Length != 12) throw new ArgumentException("An ObjectId must be 12 bytes", "value"); Value = value; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Bson/BsonReader.cs0000644000175000017500000006225212253423361026233 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.IO; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; namespace Newtonsoft.Json.Bson { /// /// Represents a reader that provides fast, non-cached, forward-only access to serialized Json data. /// public class BsonReader : JsonReader { private const int MaxCharBytesSize = 128; private static readonly byte[] SeqRange1 = new byte[] {0, 127}; // range of 1-byte sequence private static readonly byte[] SeqRange2 = new byte[] {194, 223}; // range of 2-byte sequence private static readonly byte[] SeqRange3 = new byte[] {224, 239}; // range of 3-byte sequence private static readonly byte[] SeqRange4 = new byte[] {240, 244}; // range of 4-byte sequence private readonly BinaryReader _reader; private readonly List _stack; private byte[] _byteBuffer; private char[] _charBuffer; private BsonType _currentElementType; private BsonReaderState _bsonReaderState; private ContainerContext _currentContext; private bool _readRootValueAsArray; private bool _jsonNet35BinaryCompatibility; private DateTimeKind _dateTimeKindHandling; private enum BsonReaderState { Normal, ReferenceStart, ReferenceRef, ReferenceId, CodeWScopeStart, CodeWScopeCode, CodeWScopeScope, CodeWScopeScopeObject, CodeWScopeScopeEnd } private class ContainerContext { public readonly BsonType Type; public int Length; public int Position; public ContainerContext(BsonType type) { Type = type; } } /// /// Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary. /// /// /// true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. /// public bool JsonNet35BinaryCompatibility { get { return _jsonNet35BinaryCompatibility; } set { _jsonNet35BinaryCompatibility = value; } } /// /// Gets or sets a value indicating whether the root object will be read as a JSON array. /// /// /// true if the root object will be read as a JSON array; otherwise, false. /// public bool ReadRootValueAsArray { get { return _readRootValueAsArray; } set { _readRootValueAsArray = value; } } /// /// Gets or sets the used when reading values from BSON. /// /// The used when reading values from BSON. public DateTimeKind DateTimeKindHandling { get { return _dateTimeKindHandling; } set { _dateTimeKindHandling = value; } } /// /// Initializes a new instance of the class. /// /// The stream. public BsonReader(Stream stream) : this(stream, false, DateTimeKind.Local) { } /// /// Initializes a new instance of the class. /// /// The reader. public BsonReader(BinaryReader reader) : this(reader, false, DateTimeKind.Local) { } /// /// Initializes a new instance of the class. /// /// The stream. /// if set to true the root object will be read as a JSON array. /// The used when reading values from BSON. public BsonReader(Stream stream, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling) { ValidationUtils.ArgumentNotNull(stream, "stream"); _reader = new BinaryReader(stream); _stack = new List(); _readRootValueAsArray = readRootValueAsArray; _dateTimeKindHandling = dateTimeKindHandling; } /// /// Initializes a new instance of the class. /// /// The reader. /// if set to true the root object will be read as a JSON array. /// The used when reading values from BSON. public BsonReader(BinaryReader reader, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling) { ValidationUtils.ArgumentNotNull(reader, "reader"); _reader = reader; _stack = new List(); _readRootValueAsArray = readRootValueAsArray; _dateTimeKindHandling = dateTimeKindHandling; } private string ReadElement() { _currentElementType = ReadType(); string elementName = ReadString(); return elementName; } /// /// Reads the next JSON token from the stream as a . /// /// /// A or a null reference if the next JSON token is null. This method will return null at the end of an array. /// public override byte[] ReadAsBytes() { return ReadAsBytesInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override decimal? ReadAsDecimal() { return ReadAsDecimalInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override int? ReadAsInt32() { return ReadAsInt32Internal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override string ReadAsString() { return ReadAsStringInternal(); } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override DateTime? ReadAsDateTime() { return ReadAsDateTimeInternal(); } #if !NET20 /// /// Reads the next JSON token from the stream as a . /// /// /// A . This method will return null at the end of an array. /// public override DateTimeOffset? ReadAsDateTimeOffset() { return ReadAsDateTimeOffsetInternal(); } #endif /// /// Reads the next JSON token from the stream. /// /// /// true if the next token was read successfully; false if there are no more tokens to read. /// public override bool Read() { _readType = Json.ReadType.Read; return ReadInternal(); } internal override bool ReadInternal() { try { bool success; switch (_bsonReaderState) { case BsonReaderState.Normal: success = ReadNormal(); break; case BsonReaderState.ReferenceStart: case BsonReaderState.ReferenceRef: case BsonReaderState.ReferenceId: success = ReadReference(); break; case BsonReaderState.CodeWScopeStart: case BsonReaderState.CodeWScopeCode: case BsonReaderState.CodeWScopeScope: case BsonReaderState.CodeWScopeScopeObject: case BsonReaderState.CodeWScopeScopeEnd: success = ReadCodeWScope(); break; default: throw JsonReaderException.Create(this, "Unexpected state: {0}".FormatWith(CultureInfo.InvariantCulture, _bsonReaderState)); } if (!success) { SetToken(JsonToken.None); return false; } return true; } catch (EndOfStreamException) { SetToken(JsonToken.None); return false; } } /// /// Changes the to Closed. /// public override void Close() { base.Close(); if (CloseInput && _reader != null) #if !(NETFX_CORE || PORTABLE) _reader.Close(); #else _reader.Dispose(); #endif } private bool ReadCodeWScope() { switch (_bsonReaderState) { case BsonReaderState.CodeWScopeStart: SetToken(JsonToken.PropertyName, "$code"); _bsonReaderState = BsonReaderState.CodeWScopeCode; return true; case BsonReaderState.CodeWScopeCode: // total CodeWScope size - not used ReadInt32(); SetToken(JsonToken.String, ReadLengthString()); _bsonReaderState = BsonReaderState.CodeWScopeScope; return true; case BsonReaderState.CodeWScopeScope: if (CurrentState == State.PostValue) { SetToken(JsonToken.PropertyName, "$scope"); return true; } else { SetToken(JsonToken.StartObject); _bsonReaderState = BsonReaderState.CodeWScopeScopeObject; ContainerContext newContext = new ContainerContext(BsonType.Object); PushContext(newContext); newContext.Length = ReadInt32(); return true; } case BsonReaderState.CodeWScopeScopeObject: bool result = ReadNormal(); if (result && TokenType == JsonToken.EndObject) _bsonReaderState = BsonReaderState.CodeWScopeScopeEnd; return result; case BsonReaderState.CodeWScopeScopeEnd: SetToken(JsonToken.EndObject); _bsonReaderState = BsonReaderState.Normal; return true; default: throw new ArgumentOutOfRangeException(); } } private bool ReadReference() { switch (CurrentState) { case State.ObjectStart: { SetToken(JsonToken.PropertyName, "$ref"); _bsonReaderState = BsonReaderState.ReferenceRef; return true; } case State.Property: { if (_bsonReaderState == BsonReaderState.ReferenceRef) { SetToken(JsonToken.String, ReadLengthString()); return true; } else if (_bsonReaderState == BsonReaderState.ReferenceId) { SetToken(JsonToken.Bytes, ReadBytes(12)); return true; } else { throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + _bsonReaderState); } } case State.PostValue: { if (_bsonReaderState == BsonReaderState.ReferenceRef) { SetToken(JsonToken.PropertyName, "$id"); _bsonReaderState = BsonReaderState.ReferenceId; return true; } else if (_bsonReaderState == BsonReaderState.ReferenceId) { SetToken(JsonToken.EndObject); _bsonReaderState = BsonReaderState.Normal; return true; } else { throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + _bsonReaderState); } } default: throw JsonReaderException.Create(this, "Unexpected state when reading BSON reference: " + CurrentState); } } private bool ReadNormal() { switch (CurrentState) { case State.Start: { JsonToken token = (!_readRootValueAsArray) ? JsonToken.StartObject : JsonToken.StartArray; BsonType type = (!_readRootValueAsArray) ? BsonType.Object : BsonType.Array; SetToken(token); ContainerContext newContext = new ContainerContext(type); PushContext(newContext); newContext.Length = ReadInt32(); return true; } case State.Complete: case State.Closed: return false; case State.Property: { ReadType(_currentElementType); return true; } case State.ObjectStart: case State.ArrayStart: case State.PostValue: ContainerContext context = _currentContext; if (context == null) return false; int lengthMinusEnd = context.Length - 1; if (context.Position < lengthMinusEnd) { if (context.Type == BsonType.Array) { ReadElement(); ReadType(_currentElementType); return true; } else { SetToken(JsonToken.PropertyName, ReadElement()); return true; } } else if (context.Position == lengthMinusEnd) { if (ReadByte() != 0) throw JsonReaderException.Create(this, "Unexpected end of object byte value."); PopContext(); if (_currentContext != null) MovePosition(context.Length); JsonToken endToken = (context.Type == BsonType.Object) ? JsonToken.EndObject : JsonToken.EndArray; SetToken(endToken); return true; } else { throw JsonReaderException.Create(this, "Read past end of current container context."); } case State.ConstructorStart: break; case State.Constructor: break; case State.Error: break; case State.Finished: break; default: throw new ArgumentOutOfRangeException(); } return false; } private void PopContext() { _stack.RemoveAt(_stack.Count - 1); if (_stack.Count == 0) _currentContext = null; else _currentContext = _stack[_stack.Count - 1]; } private void PushContext(ContainerContext newContext) { _stack.Add(newContext); _currentContext = newContext; } private byte ReadByte() { MovePosition(1); return _reader.ReadByte(); } private void ReadType(BsonType type) { switch (type) { case BsonType.Number: SetToken(JsonToken.Float, ReadDouble()); break; case BsonType.String: case BsonType.Symbol: SetToken(JsonToken.String, ReadLengthString()); break; case BsonType.Object: { SetToken(JsonToken.StartObject); ContainerContext newContext = new ContainerContext(BsonType.Object); PushContext(newContext); newContext.Length = ReadInt32(); break; } case BsonType.Array: { SetToken(JsonToken.StartArray); ContainerContext newContext = new ContainerContext(BsonType.Array); PushContext(newContext); newContext.Length = ReadInt32(); break; } case BsonType.Binary: SetToken(JsonToken.Bytes, ReadBinary()); break; case BsonType.Undefined: SetToken(JsonToken.Undefined); break; case BsonType.Oid: byte[] oid = ReadBytes(12); SetToken(JsonToken.Bytes, oid); break; case BsonType.Boolean: bool b = Convert.ToBoolean(ReadByte()); SetToken(JsonToken.Boolean, b); break; case BsonType.Date: long ticks = ReadInt64(); DateTime utcDateTime = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks); DateTime dateTime; switch (DateTimeKindHandling) { case DateTimeKind.Unspecified: dateTime = DateTime.SpecifyKind(utcDateTime, DateTimeKind.Unspecified); break; case DateTimeKind.Local: dateTime = utcDateTime.ToLocalTime(); break; default: dateTime = utcDateTime; break; } SetToken(JsonToken.Date, dateTime); break; case BsonType.Null: SetToken(JsonToken.Null); break; case BsonType.Regex: string expression = ReadString(); string modifiers = ReadString(); string regex = @"/" + expression + @"/" + modifiers; SetToken(JsonToken.String, regex); break; case BsonType.Reference: SetToken(JsonToken.StartObject); _bsonReaderState = BsonReaderState.ReferenceStart; break; case BsonType.Code: SetToken(JsonToken.String, ReadLengthString()); break; case BsonType.CodeWScope: SetToken(JsonToken.StartObject); _bsonReaderState = BsonReaderState.CodeWScopeStart; break; case BsonType.Integer: SetToken(JsonToken.Integer, (long) ReadInt32()); break; case BsonType.TimeStamp: case BsonType.Long: SetToken(JsonToken.Integer, ReadInt64()); break; default: throw new ArgumentOutOfRangeException("type", "Unexpected BsonType value: " + type); } } private byte[] ReadBinary() { int dataLength = ReadInt32(); BsonBinaryType binaryType = (BsonBinaryType) ReadByte(); #pragma warning disable 612,618 // the old binary type has the data length repeated in the data for some reason if (binaryType == BsonBinaryType.Data && !_jsonNet35BinaryCompatibility) { dataLength = ReadInt32(); } #pragma warning restore 612,618 return ReadBytes(dataLength); } private string ReadString() { EnsureBuffers(); StringBuilder builder = null; int totalBytesRead = 0; // used in case of left over multibyte characters in the buffer int offset = 0; do { int count = offset; byte b; while (count < MaxCharBytesSize && (b = _reader.ReadByte()) > 0) { _byteBuffer[count++] = b; } int byteCount = count - offset; totalBytesRead += byteCount; if (count < MaxCharBytesSize && builder == null) { // pref optimization to avoid reading into a string builder // if string is smaller than the buffer then return it directly int length = Encoding.UTF8.GetChars(_byteBuffer, 0, byteCount, _charBuffer, 0); MovePosition(totalBytesRead + 1); return new string(_charBuffer, 0, length); } else { // calculate the index of the end of the last full character in the buffer int lastFullCharStop = GetLastFullCharStop(count - 1); int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, lastFullCharStop + 1, _charBuffer, 0); if (builder == null) builder = new StringBuilder(MaxCharBytesSize*2); builder.Append(_charBuffer, 0, charCount); if (lastFullCharStop < byteCount - 1) { offset = byteCount - lastFullCharStop - 1; // copy left over multi byte characters to beginning of buffer for next iteration Array.Copy(_byteBuffer, lastFullCharStop + 1, _byteBuffer, 0, offset); } else { // reached end of string if (count < MaxCharBytesSize) { MovePosition(totalBytesRead + 1); return builder.ToString(); } offset = 0; } } } while (true); } private string ReadLengthString() { int length = ReadInt32(); MovePosition(length); string s = GetString(length - 1); _reader.ReadByte(); return s; } private string GetString(int length) { if (length == 0) return string.Empty; EnsureBuffers(); StringBuilder builder = null; int totalBytesRead = 0; // used in case of left over multibyte characters in the buffer int offset = 0; do { int count = ((length - totalBytesRead) > MaxCharBytesSize - offset) ? MaxCharBytesSize - offset : length - totalBytesRead; int byteCount = _reader.Read(_byteBuffer, offset, count); if (byteCount == 0) throw new EndOfStreamException("Unable to read beyond the end of the stream."); totalBytesRead += byteCount; // Above, byteCount is how many bytes we read this time. // Below, byteCount is how many bytes are in the _byteBuffer. byteCount += offset; if (byteCount == length) { // pref optimization to avoid reading into a string builder // first iteration and all bytes read then return string directly int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, byteCount, _charBuffer, 0); return new string(_charBuffer, 0, charCount); } else { int lastFullCharStop = GetLastFullCharStop(byteCount - 1); if (builder == null) builder = new StringBuilder(length); int charCount = Encoding.UTF8.GetChars(_byteBuffer, 0, lastFullCharStop + 1, _charBuffer, 0); builder.Append(_charBuffer, 0, charCount); if (lastFullCharStop < byteCount - 1) { offset = byteCount - lastFullCharStop - 1; // copy left over multi byte characters to beginning of buffer for next iteration Array.Copy(_byteBuffer, lastFullCharStop + 1, _byteBuffer, 0, offset); } else { offset = 0; } } } while (totalBytesRead < length); return builder.ToString(); } private int GetLastFullCharStop(int start) { int lookbackPos = start; int bis = 0; while (lookbackPos >= 0) { bis = BytesInSequence(_byteBuffer[lookbackPos]); if (bis == 0) { lookbackPos--; continue; } else if (bis == 1) { break; } else { lookbackPos--; break; } } if (bis == start - lookbackPos) { //Full character. return start; } else { return lookbackPos; } } private int BytesInSequence(byte b) { if (b <= SeqRange1[1]) return 1; if (b >= SeqRange2[0] && b <= SeqRange2[1]) return 2; if (b >= SeqRange3[0] && b <= SeqRange3[1]) return 3; if (b >= SeqRange4[0] && b <= SeqRange4[1]) return 4; return 0; } private void EnsureBuffers() { if (_byteBuffer == null) { _byteBuffer = new byte[MaxCharBytesSize]; } if (_charBuffer == null) { int charBufferSize = Encoding.UTF8.GetMaxCharCount(MaxCharBytesSize); _charBuffer = new char[charBufferSize]; } } private double ReadDouble() { MovePosition(8); return _reader.ReadDouble(); } private int ReadInt32() { MovePosition(4); return _reader.ReadInt32(); } private long ReadInt64() { MovePosition(8); return _reader.ReadInt64(); } private BsonType ReadType() { MovePosition(1); return (BsonType) _reader.ReadSByte(); } private void MovePosition(int count) { _currentContext.Position += count; } private byte[] ReadBytes(int count) { MovePosition(count); return _reader.ReadBytes(count); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/DateTimeZoneHandling.cs0000644000175000017500000000410212253423361027271 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Specifies how to treat the time value when converting between string and . /// public enum DateTimeZoneHandling { /// /// Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. /// Local, /// /// Treat as a UTC. If the object represents a local time, it is converted to a UTC. /// Utc, /// /// Treat as a local time if a is being converted to a string. /// If a string is being converted to , convert to a local time if a time zone is specified. /// Unspecified, /// /// Time zone information should be preserved when converting. /// RoundtripKind } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/PreserveReferencesHandling.cs0000644000175000017500000000410412253423361030540 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; namespace Newtonsoft.Json { /// /// Specifies reference handling options for the . /// /// /// /// [Flags] public enum PreserveReferencesHandling { /// /// Do not preserve references when serializing types. /// None = 0, /// /// Preserve references when serializing into a JSON object structure. /// Objects = 1, /// /// Preserve references when serializing into a JSON array structure. /// Arrays = 2, /// /// Preserve references when serializing. /// All = Objects | Arrays } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/ObjectCreationHandling.cs0000644000175000017500000000314612253423361027643 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Specifies how object creation is handled by the . /// public enum ObjectCreationHandling { /// /// Reuse existing objects, create new objects when needed. /// Auto = 0, /// /// Only reuse existing objects. /// Reuse = 1, /// /// Always create new objects. /// Replace = 2 } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj0000644000175000017500000002715412253423361031704 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.20506 2.0 {7A7F70AB-5C07-47ED-BDD2-ECC14DBACA5E} {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Newtonsoft.Json Newtonsoft.Json v4.0 $(TargetFrameworkVersion) WindowsPhone Silverlight false true true true full false Bin\Debug\WindowsPhone\ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE true true prompt 4 pdbonly true Bin\Release\WindowsPhone\ TRACE;SILVERLIGHT;WINDOWS_PHONE true true prompt 4 Bin\Release\WindowsPhone\Newtonsoft.Json.xml smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonConverterAttribute.cs0000644000175000017500000000522312253423361027766 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json { /// /// Instructs the to use the specified when serializing the member or class. /// [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Enum | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; /// /// Gets the type of the converter. /// /// The type of the converter. public Type ConverterType { get { return _converterType; } } /// /// Initializes a new instance of the class. /// /// Type of the converter. public JsonConverterAttribute(Type converterType) { if (converterType == null) throw new ArgumentNullException("converterType"); _converterType = converterType; } internal static JsonConverter CreateJsonConverterInstance(Type converterType) { try { return (JsonConverter)Activator.CreateInstance(converterType); } catch (Exception ex) { throw new JsonException("Error creating {0}".FormatWith(CultureInfo.InvariantCulture, converterType), ex); } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Formatting.cs0000644000175000017500000000314412253423361025413 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Specifies formatting options for the . /// public enum Formatting { /// /// No special formatting is applied. This is the default. /// None, /// /// Causes child objects to be indented according to the and settings. /// Indented } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/DateParseHandling.cs0000644000175000017500000000356412253423361026624 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json { /// /// Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. /// public enum DateParseHandling { /// /// Date formatted strings are not parsed to a date type and are read as strings. /// None, /// /// Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . /// DateTime, #if !NET20 /// /// Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . /// DateTimeOffset #endif } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonConverter.cs0000644000175000017500000000710012253423361026076 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Text; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Schema; namespace Newtonsoft.Json { /// /// Converts an object to and from JSON. /// public abstract class JsonConverter { /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public abstract void WriteJson(JsonWriter writer, object value, JsonSerializer serializer); /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public abstract object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer); /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public abstract bool CanConvert(Type objectType); /// /// Gets the of the JSON produced by the JsonConverter. /// /// The of the JSON produced by the JsonConverter. public virtual JsonSchema GetSchema() { return null; } /// /// Gets a value indicating whether this can read JSON. /// /// true if this can read JSON; otherwise, false. public virtual bool CanRead { get { return true; } } /// /// Gets a value indicating whether this can write JSON. /// /// true if this can write JSON; otherwise, false. public virtual bool CanWrite { get { return true; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.ruleset0000644000175000017500000002170212253423361027435 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/FormatterAssemblyStyle.cs0000644000175000017500000000147212253423361027767 0ustar00meebeymeebey00000000000000#if SILVERLIGHT || PocketPC || NETFX_CORE || PORTABLE namespace System.Runtime.Serialization.Formatters { /// /// Indicates the method that will be used during deserialization for locating and loading assemblies. /// public enum FormatterAssemblyStyle { /// /// In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method is used to load the assembly. /// Simple, /// /// In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the Assembly class is used to load the assembly. /// Full } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonSerializer.cs0000644000175000017500000005731612253423361026256 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Runtime.Serialization.Formatters; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; using System.Runtime.Serialization; using ErrorEventArgs=Newtonsoft.Json.Serialization.ErrorEventArgs; namespace Newtonsoft.Json { /// /// Serializes and deserializes objects into and from the JSON format. /// The enables you to control how objects are encoded into JSON. /// public class JsonSerializer { #region Properties private TypeNameHandling _typeNameHandling; private FormatterAssemblyStyle _typeNameAssemblyFormat; private PreserveReferencesHandling _preserveReferencesHandling; private ReferenceLoopHandling _referenceLoopHandling; private MissingMemberHandling _missingMemberHandling; private ObjectCreationHandling _objectCreationHandling; private NullValueHandling _nullValueHandling; private DefaultValueHandling _defaultValueHandling; private ConstructorHandling _constructorHandling; private JsonConverterCollection _converters; private IContractResolver _contractResolver; private IReferenceResolver _referenceResolver; private SerializationBinder _binder; private StreamingContext _context; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; /// /// Occurs when the errors during serialization and deserialization. /// public virtual event EventHandler Error; /// /// Gets or sets the used by the serializer when resolving references. /// public virtual IReferenceResolver ReferenceResolver { get { if (_referenceResolver == null) _referenceResolver = new DefaultReferenceResolver(); return _referenceResolver; } set { if (value == null) throw new ArgumentNullException("value", "Reference resolver cannot be null."); _referenceResolver = value; } } /// /// Gets or sets the used by the serializer when resolving type names. /// public virtual SerializationBinder Binder { get { return _binder; } set { if (value == null) throw new ArgumentNullException("value", "Serialization binder cannot be null."); _binder = value; } } /// /// Gets or sets how type name writing and reading is handled by the serializer. /// public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) throw new ArgumentOutOfRangeException("value"); _typeNameHandling = value; } } /// /// Gets or sets how a type name assembly is written and resolved by the serializer. /// /// The type name assembly format. public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return _typeNameAssemblyFormat; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) throw new ArgumentOutOfRangeException("value"); _typeNameAssemblyFormat = value; } } /// /// Gets or sets how object references are preserved by the serializer. /// public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) throw new ArgumentOutOfRangeException("value"); _preserveReferencesHandling = value; } } /// /// Get or set how reference loops (e.g. a class referencing itself) is handled. /// public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) throw new ArgumentOutOfRangeException("value"); _referenceLoopHandling = value; } } /// /// Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. /// public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) throw new ArgumentOutOfRangeException("value"); _missingMemberHandling = value; } } /// /// Get or set how null values are handled during serialization and deserialization. /// public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) throw new ArgumentOutOfRangeException("value"); _nullValueHandling = value; } } /// /// Get or set how null default are handled during serialization and deserialization. /// public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) throw new ArgumentOutOfRangeException("value"); _defaultValueHandling = value; } } /// /// Gets or sets how objects are created during deserialization. /// /// The object creation handling. public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) throw new ArgumentOutOfRangeException("value"); _objectCreationHandling = value; } } /// /// Gets or sets how constructors are used during deserialization. /// /// The constructor handling. public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) throw new ArgumentOutOfRangeException("value"); _constructorHandling = value; } } /// /// Gets a collection that will be used during serialization. /// /// Collection that will be used during serialization. public virtual JsonConverterCollection Converters { get { if (_converters == null) _converters = new JsonConverterCollection(); return _converters; } } /// /// Gets or sets the contract resolver used by the serializer when /// serializing .NET objects to JSON and vice versa. /// public virtual IContractResolver ContractResolver { get { if (_contractResolver == null) _contractResolver = DefaultContractResolver.Instance; return _contractResolver; } set { _contractResolver = value; } } /// /// Gets or sets the used by the serializer when invoking serialization callback methods. /// /// The context. public virtual StreamingContext Context { get { return _context; } set { _context = value; } } /// /// Indicates how JSON text output is formatted. /// public virtual Formatting Formatting { get { return _formatting ?? JsonSerializerSettings.DefaultFormatting; } set { _formatting = value; } } /// /// Get or set how dates are written to JSON text. /// public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling ?? JsonSerializerSettings.DefaultDateFormatHandling; } set { _dateFormatHandling = value; } } /// /// Get or set how time zones are handling during serialization and deserialization. /// public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? JsonSerializerSettings.DefaultDateTimeZoneHandling; } set { _dateTimeZoneHandling = value; } } /// /// Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. /// public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? JsonSerializerSettings.DefaultDateParseHandling; } set { _dateParseHandling = value; } } /// /// Gets or sets the culture used when reading JSON. Defaults to . /// public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } /// /// Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . /// public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) throw new ArgumentException("Value must be positive.", "value"); _maxDepth = value; _maxDepthSet = true; } } /// /// Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. /// /// /// true if there will be a check for additional JSON content after deserializing an object; otherwise, false. /// public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent ?? JsonSerializerSettings.DefaultCheckAdditionalContent; } set { _checkAdditionalContent = value; } } internal bool IsCheckAdditionalContentSet() { return (_checkAdditionalContent != null); } #endregion /// /// Initializes a new instance of the class. /// public JsonSerializer() { _referenceLoopHandling = JsonSerializerSettings.DefaultReferenceLoopHandling; _missingMemberHandling = JsonSerializerSettings.DefaultMissingMemberHandling; _nullValueHandling = JsonSerializerSettings.DefaultNullValueHandling; _defaultValueHandling = JsonSerializerSettings.DefaultDefaultValueHandling; _objectCreationHandling = JsonSerializerSettings.DefaultObjectCreationHandling; _preserveReferencesHandling = JsonSerializerSettings.DefaultPreserveReferencesHandling; _constructorHandling = JsonSerializerSettings.DefaultConstructorHandling; _typeNameHandling = JsonSerializerSettings.DefaultTypeNameHandling; _context = JsonSerializerSettings.DefaultContext; _binder = DefaultSerializationBinder.Instance; } /// /// Creates a new instance using the specified . /// /// The settings to be applied to the . /// A new instance using the specified . public static JsonSerializer Create(JsonSerializerSettings settings) { JsonSerializer jsonSerializer = new JsonSerializer(); if (settings != null) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) jsonSerializer.Converters.AddRange(settings.Converters); // serializer specific jsonSerializer.TypeNameHandling = settings.TypeNameHandling; jsonSerializer.TypeNameAssemblyFormat = settings.TypeNameAssemblyFormat; jsonSerializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; jsonSerializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; jsonSerializer.MissingMemberHandling = settings.MissingMemberHandling; jsonSerializer.ObjectCreationHandling = settings.ObjectCreationHandling; jsonSerializer.NullValueHandling = settings.NullValueHandling; jsonSerializer.DefaultValueHandling = settings.DefaultValueHandling; jsonSerializer.ConstructorHandling = settings.ConstructorHandling; jsonSerializer.Context = settings.Context; jsonSerializer._checkAdditionalContent = settings._checkAdditionalContent; // reader/writer specific // unset values won't override reader/writer set values jsonSerializer._formatting = settings._formatting; jsonSerializer._dateFormatHandling = settings._dateFormatHandling; jsonSerializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; jsonSerializer._dateParseHandling = settings._dateParseHandling; jsonSerializer._culture = settings._culture; jsonSerializer._maxDepth = settings._maxDepth; jsonSerializer._maxDepthSet = settings._maxDepthSet; if (settings.Error != null) jsonSerializer.Error += settings.Error; if (settings.ContractResolver != null) jsonSerializer.ContractResolver = settings.ContractResolver; if (settings.ReferenceResolver != null) jsonSerializer.ReferenceResolver = settings.ReferenceResolver; if (settings.Binder != null) jsonSerializer.Binder = settings.Binder; } return jsonSerializer; } /// /// Populates the JSON values onto the target object. /// /// The that contains the JSON structure to reader values from. /// The target object to populate values onto. public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } /// /// Populates the JSON values onto the target object. /// /// The that contains the JSON structure to reader values from. /// The target object to populate values onto. public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this); serializerReader.Populate(reader, target); } /// /// Deserializes the Json structure contained by the specified . /// /// The that contains the JSON structure to deserialize. /// The being deserialized. public object Deserialize(JsonReader reader) { return Deserialize(reader, null); } /// /// Deserializes the Json structure contained by the specified /// into an instance of the specified type. /// /// The containing the object. /// The of object being deserialized. /// The instance of being deserialized. public object Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } /// /// Deserializes the Json structure contained by the specified /// into an instance of the specified type. /// /// The containing the object. /// The type of the object to deserialize. /// The instance of being deserialized. public T Deserialize(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } /// /// Deserializes the Json structure contained by the specified /// into an instance of the specified type. /// /// The containing the object. /// The of object being deserialized. /// The instance of being deserialized. public object Deserialize(JsonReader reader, Type objectType) { return DeserializeInternal(reader, objectType); } internal virtual object DeserializeInternal(JsonReader reader, Type objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); // set serialization options onto reader CultureInfo previousCulture = null; if (_culture != null && reader.Culture != _culture) { previousCulture = reader.Culture; reader.Culture = _culture; } DateTimeZoneHandling? previousDateTimeZoneHandling = null; if (_dateTimeZoneHandling != null && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.Value; } DateParseHandling? previousDateParseHandling = null; if (_dateParseHandling != null && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.Value; } int? previousMaxDepth = null; if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } JsonSerializerInternalReader serializerReader = new JsonSerializerInternalReader(this); object value = serializerReader.Deserialize(reader, objectType, CheckAdditionalContent); // reset reader back to previous options if (previousCulture != null) reader.Culture = previousCulture; if (previousDateTimeZoneHandling != null) reader.DateTimeZoneHandling = previousDateTimeZoneHandling.Value; if (previousDateParseHandling != null) reader.DateParseHandling = previousDateParseHandling.Value; if (_maxDepthSet) reader.MaxDepth = previousMaxDepth; return value; } /// /// Serializes the specified and writes the Json structure /// to a Stream using the specified . /// /// The used to write the Json structure. /// The to serialize. public void Serialize(TextWriter textWriter, object value) { Serialize(new JsonTextWriter(textWriter), value); } /// /// Serializes the specified and writes the Json structure /// to a Stream using the specified . /// /// The used to write the Json structure. /// The to serialize. public void Serialize(JsonWriter jsonWriter, object value) { SerializeInternal(jsonWriter, value); } internal virtual void SerializeInternal(JsonWriter jsonWriter, object value) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); // set serialization options onto writer Formatting? previousFormatting = null; if (_formatting != null && jsonWriter.Formatting != _formatting) { previousFormatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.Value; } DateFormatHandling? previousDateFormatHandling = null; if (_dateFormatHandling != null && jsonWriter.DateFormatHandling != _dateFormatHandling) { previousDateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.Value; } DateTimeZoneHandling? previousDateTimeZoneHandling = null; if (_dateTimeZoneHandling != null && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.Value; } JsonSerializerInternalWriter serializerWriter = new JsonSerializerInternalWriter(this); serializerWriter.Serialize(jsonWriter, value); // reset writer back to previous options if (previousFormatting != null) jsonWriter.Formatting = previousFormatting.Value; if (previousDateFormatHandling != null) jsonWriter.DateFormatHandling = previousDateFormatHandling.Value; if (previousDateTimeZoneHandling != null) jsonWriter.DateTimeZoneHandling = previousDateTimeZoneHandling.Value; } internal JsonConverter GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter GetMatchingConverter(IList converters, Type objectType) { #if DEBUG ValidationUtils.ArgumentNotNull(objectType, "objectType"); #endif if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter converter = converters[i]; if (converter.CanConvert(objectType)) return converter; } } return null; } internal void OnError(ErrorEventArgs e) { EventHandler error = Error; if (error != null) error(this, e); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonArrayAttribute.cs0000644000175000017500000000521312253423361027074 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Instructs the how to serialize the collection. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; /// /// Gets or sets a value indicating whether null items are allowed in the collection. /// /// true if null items are allowed in the collection; otherwise, false. public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } /// /// Initializes a new instance of the class. /// public JsonArrayAttribute() { } /// /// Initializes a new instance of the class with a flag indicating whether the array can contain null items /// /// A flag indicating whether the array can contain null items. public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } /// /// Initializes a new instance of the class with the specified container Id. /// /// The container Id. public JsonArrayAttribute(string id) : base(id) { } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonReader.cs0000644000175000017500000006205212253423361025340 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.IO; using System.Globalization; using Newtonsoft.Json.Utilities; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json { /// /// Represents a reader that provides fast, non-cached, forward-only access to serialized Json data. /// public abstract class JsonReader : IDisposable { /// /// Specifies the state of the reader. /// protected internal enum State { /// /// The Read method has not been called. /// Start, /// /// The end of the file has been reached successfully. /// Complete, /// /// Reader is at a property. /// Property, /// /// Reader is at the start of an object. /// ObjectStart, /// /// Reader is in an object. /// Object, /// /// Reader is at the start of an array. /// ArrayStart, /// /// Reader is in an array. /// Array, /// /// The Close method has been called. /// Closed, /// /// Reader has just read a value. /// PostValue, /// /// Reader is at the start of a constructor. /// ConstructorStart, /// /// Reader in a constructor. /// Constructor, /// /// An error occurred that prevents the read operation from continuing. /// Error, /// /// The end of the file has been reached successfully. /// Finished } // current Token data private JsonToken _tokenType; private object _value; private char _quoteChar; internal State _currentState; internal ReadType _readType; private JsonPosition _currentPosition; private CultureInfo _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; private readonly List _stack; /// /// Gets the current reader state. /// /// The current reader state. protected State CurrentState { get { return _currentState; } } /// /// Gets or sets a value indicating whether the underlying stream or /// should be closed when the reader is closed. /// /// /// true to close the underlying stream or when /// the reader is closed; otherwise false. The default is true. /// public bool CloseInput { get; set; } /// /// Gets the quotation mark character used to enclose the value of a string. /// public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } /// /// Get or set how time zones are handling when reading JSON. /// public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { _dateTimeZoneHandling = value; } } /// /// Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. /// public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { _dateParseHandling = value; } } /// /// Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . /// public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) throw new ArgumentException("Value must be positive.", "value"); _maxDepth = value; } } /// /// Gets the type of the current JSON token. /// public virtual JsonToken TokenType { get { return _tokenType; } } /// /// Gets the text value of the current JSON token. /// public virtual object Value { get { return _value; } } /// /// Gets The Common Language Runtime (CLR) type for the current JSON token. /// public virtual Type ValueType { get { return (_value != null) ? _value.GetType() : null; } } /// /// Gets the depth of the current token in the JSON document. /// /// The depth of the current token in the JSON document. public virtual int Depth { get { int depth = _stack.Count; if (IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) return depth; else return depth + 1; } } /// /// Gets the path of the current JSON token. /// public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) return string.Empty; return JsonPosition.BuildPath(_stack.Concat(new[] { _currentPosition })); } } /// /// Gets or sets the culture used when reading JSON. Defaults to . /// public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } internal JsonPosition GetPosition(int depth) { if (depth < _stack.Count) return _stack[depth]; return _currentPosition; } /// /// Initializes a new instance of the class with the specified . /// protected JsonReader() { _currentState = State.Start; _stack = new List(4); _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition.Type = value; } else { _stack.Add(_currentPosition); JsonPosition state = new JsonPosition { Type = value }; _currentPosition = state; // this is a little hacky because Depth increases when first property/value is written but only testing here is faster/simpler if (_maxDepth != null && Depth + 1 > _maxDepth && !_hasExceededMaxDepth) { _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } } } private JsonContainerType Pop() { JsonPosition oldPosition; if (_stack.Count > 0) { oldPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { oldPosition = _currentPosition; _currentPosition = new JsonPosition(); } if (_maxDepth != null && Depth <= _maxDepth) _hasExceededMaxDepth = false; return oldPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } /// /// Reads the next JSON token from the stream. /// /// true if the next token was read successfully; false if there are no more tokens to read. public abstract bool Read(); /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public abstract int? ReadAsInt32(); /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public abstract string ReadAsString(); /// /// Reads the next JSON token from the stream as a . /// /// A or a null reference if the next JSON token is null. This method will return null at the end of an array. public abstract byte[] ReadAsBytes(); /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public abstract decimal? ReadAsDecimal(); /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public abstract DateTime? ReadAsDateTime(); #if !NET20 /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public abstract DateTimeOffset? ReadAsDateTimeOffset(); #endif internal virtual bool ReadInternal() { throw new NotImplementedException(); } #if !NET20 internal DateTimeOffset? ReadAsDateTimeOffsetInternal() { _readType = ReadType.ReadAsDateTimeOffset; do { if (!ReadInternal()) { SetToken(JsonToken.None); return null; } } while (TokenType == JsonToken.Comment); if (TokenType == JsonToken.Date) { if (Value is DateTime) SetToken(JsonToken.Date, new DateTimeOffset((DateTime)Value)); return (DateTimeOffset)Value; } if (TokenType == JsonToken.Null) return null; DateTimeOffset dt; if (TokenType == JsonToken.String) { if (DateTimeOffset.TryParse((string)Value, Culture, DateTimeStyles.RoundtripKind, out dt)) { SetToken(JsonToken.Date, dt); return dt; } else { throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, Value)); } } if (TokenType == JsonToken.EndArray) return null; throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } #endif internal byte[] ReadAsBytesInternal() { _readType = ReadType.ReadAsBytes; do { if (!ReadInternal()) { SetToken(JsonToken.None); return null; } } while (TokenType == JsonToken.Comment); if (IsWrappedInTypeObject()) { byte[] data = ReadAsBytes(); ReadInternal(); SetToken(JsonToken.Bytes, data); return data; } // attempt to convert possible base 64 string to bytes if (TokenType == JsonToken.String) { string s = (string)Value; byte[] data = (s.Length == 0) ? new byte[0] : Convert.FromBase64String(s); SetToken(JsonToken.Bytes, data); } if (TokenType == JsonToken.Null) return null; if (TokenType == JsonToken.Bytes) return (byte[])Value; if (TokenType == JsonToken.StartArray) { List data = new List(); while (ReadInternal()) { switch (TokenType) { case JsonToken.Integer: data.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); break; case JsonToken.EndArray: byte[] d = data.ToArray(); SetToken(JsonToken.Bytes, d); return d; case JsonToken.Comment: // skip break; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); } if (TokenType == JsonToken.EndArray) return null; throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } internal decimal? ReadAsDecimalInternal() { _readType = ReadType.ReadAsDecimal; do { if (!ReadInternal()) { SetToken(JsonToken.None); return null; } } while (TokenType == JsonToken.Comment); if (TokenType == JsonToken.Integer || TokenType == JsonToken.Float) { if (!(Value is decimal)) SetToken(JsonToken.Float, Convert.ToDecimal(Value, CultureInfo.InvariantCulture)); return (decimal)Value; } if (TokenType == JsonToken.Null) return null; decimal d; if (TokenType == JsonToken.String) { if (decimal.TryParse((string)Value, NumberStyles.Number, Culture, out d)) { SetToken(JsonToken.Float, d); return d; } else { throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, Value)); } } if (TokenType == JsonToken.EndArray) return null; throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } internal int? ReadAsInt32Internal() { _readType = ReadType.ReadAsInt32; do { if (!ReadInternal()) { SetToken(JsonToken.None); return null; } } while (TokenType == JsonToken.Comment); if (TokenType == JsonToken.Integer || TokenType == JsonToken.Float) { if (!(Value is int)) SetToken(JsonToken.Integer, Convert.ToInt32(Value, CultureInfo.InvariantCulture)); return (int)Value; } if (TokenType == JsonToken.Null) return null; int i; if (TokenType == JsonToken.String) { if (int.TryParse((string)Value, NumberStyles.Integer, Culture, out i)) { SetToken(JsonToken.Integer, i); return i; } else { throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, Value)); } } if (TokenType == JsonToken.EndArray) return null; throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } internal string ReadAsStringInternal() { _readType = ReadType.ReadAsString; do { if (!ReadInternal()) { SetToken(JsonToken.None); return null; } } while (TokenType == JsonToken.Comment); if (TokenType == JsonToken.String) return (string)Value; if (TokenType == JsonToken.Null) return null; if (IsPrimitiveToken(TokenType)) { if (Value != null) { string s; if (ConvertUtils.IsConvertible(Value)) s = ConvertUtils.ToConvertible(Value).ToString(Culture); else if (Value is IFormattable) s = ((IFormattable)Value).ToString(null, Culture); else s = Value.ToString(); SetToken(JsonToken.String, s); return s; } } if (TokenType == JsonToken.EndArray) return null; throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } internal DateTime? ReadAsDateTimeInternal() { _readType = ReadType.ReadAsDateTime; do { if (!ReadInternal()) { SetToken(JsonToken.None); return null; } } while (TokenType == JsonToken.Comment); if (TokenType == JsonToken.Date) return (DateTime)Value; if (TokenType == JsonToken.Null) return null; DateTime dt; if (TokenType == JsonToken.String) { string s = (string)Value; if (string.IsNullOrEmpty(s)) { SetToken(JsonToken.Null); return null; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = JsonConvert.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt); return dt; } else { throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, Value)); } } if (TokenType == JsonToken.EndArray) return null; throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } private bool IsWrappedInTypeObject() { _readType = ReadType.Read; if (TokenType == JsonToken.StartObject) { if (!ReadInternal()) throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); if (Value.ToString() == "$type") { ReadInternal(); if (Value != null && Value.ToString().StartsWith("System.Byte[]")) { ReadInternal(); if (Value.ToString() == "$value") { return true; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } return false; } /// /// Skips the children of the current token. /// public void Skip() { if (TokenType == JsonToken.PropertyName) Read(); if (IsStartToken(TokenType)) { int depth = Depth; while (Read() && (depth < Depth)) { } } } /// /// Sets the current token. /// /// The new token. protected void SetToken(JsonToken newToken) { SetToken(newToken, null); } /// /// Sets the current token and value. /// /// The new token. /// The value. protected void SetToken(JsonToken newToken, object value) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string) value; break; case JsonToken.Undefined: case JsonToken.Integer: case JsonToken.Float: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Date: case JsonToken.String: case JsonToken.Raw: case JsonToken.Bytes: _currentState = (Peek() != JsonContainerType.None) ? State.PostValue : State.Finished; UpdateScopeWithFinishedValue(); break; } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.Type == JsonContainerType.Array || _currentPosition.Type == JsonContainerType.Constructor) { if (_currentPosition.Position == null) _currentPosition.Position = 0; else _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType currentObject = Pop(); if (GetTypeForCloseToken(endToken) != currentObject) throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, currentObject)); _currentState = (Peek() != JsonContainerType.None) ? State.PostValue : State.Finished; } /// /// Sets the state based on current token type. /// protected void SetStateBasedOnCurrent() { JsonContainerType currentObject = Peek(); switch (currentObject) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: _currentState = State.Finished; break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, currentObject)); } } internal static bool IsPrimitiveToken(JsonToken token) { switch (token) { case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Undefined: case JsonToken.Null: case JsonToken.Date: case JsonToken.Bytes: return true; default: return false; } } internal static bool IsStartToken(JsonToken token) { switch (token) { case JsonToken.StartObject: case JsonToken.StartArray: case JsonToken.StartConstructor: return true; default: return false; } } private JsonContainerType GetTypeForCloseToken(JsonToken token) { switch (token) { case JsonToken.EndObject: return JsonContainerType.Object; case JsonToken.EndArray: return JsonContainerType.Array; case JsonToken.EndConstructor: return JsonContainerType.Constructor; default: throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)); } } /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// void IDisposable.Dispose() { Dispose(true); } /// /// Releases unmanaged and - optionally - managed resources /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) Close(); } /// /// Changes the to Closed. /// public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/StreamingContext.cs0000644000175000017500000000263012253423361026576 0ustar00meebeymeebey00000000000000#if PocketPC #pragma warning disable 1591 // This class is... borrowed from .NET and Microsoft for a short time. // Hopefully Microsoft will add DateTimeOffset to the compact framework // or I will rewrite a striped down version of this file myself namespace System.Runtime.Serialization { public enum StreamingContextStates { All = 255, Clone = 64, CrossAppDomain = 128, CrossMachine = 2, CrossProcess = 1, File = 4, Other = 32, Persistence = 8, Remoting = 16 } public struct StreamingContext { internal object m_additionalContext; internal StreamingContextStates m_state; public StreamingContext(StreamingContextStates state) : this(state, null) { } public StreamingContext(StreamingContextStates state, object additional) { this.m_state = state; this.m_additionalContext = additional; } public object Context { get { return this.m_additionalContext; } } public override bool Equals(object obj) { return ((obj is StreamingContext) && ((((StreamingContext)obj).m_additionalContext == this.m_additionalContext) && (((StreamingContext)obj).m_state == this.m_state))); } public override int GetHashCode() { return (int)this.m_state; } public StreamingContextStates State { get { return this.m_state; } } } } #endifsmuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/0000755000175000017500000000000012253423361024150 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaBuilder.cs0000644000175000017500000003652012253423361030046 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif using System.Globalization; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; namespace Newtonsoft.Json.Schema { internal class JsonSchemaBuilder { private JsonReader _reader; private readonly IList _stack; private readonly JsonSchemaResolver _resolver; private JsonSchema _currentSchema; private void Push(JsonSchema value) { _currentSchema = value; _stack.Add(value); _resolver.LoadedSchemas.Add(value); } private JsonSchema Pop() { JsonSchema poppedSchema = _currentSchema; _stack.RemoveAt(_stack.Count - 1); _currentSchema = _stack.LastOrDefault(); return poppedSchema; } private JsonSchema CurrentSchema { get { return _currentSchema; } } public JsonSchemaBuilder(JsonSchemaResolver resolver) { _stack = new List(); _resolver = resolver; } internal JsonSchema Parse(JsonReader reader) { _reader = reader; if (reader.TokenType == JsonToken.None) _reader.Read(); return BuildSchema(); } private JsonSchema BuildSchema() { if (_reader.TokenType != JsonToken.StartObject) throw JsonReaderException.Create(_reader, "Expected StartObject while parsing schema object, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); _reader.Read(); // empty schema object if (_reader.TokenType == JsonToken.EndObject) { Push(new JsonSchema()); return Pop(); } string propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); _reader.Read(); // schema reference if (propertyName == JsonSchemaConstants.ReferencePropertyName) { string id = (string)_reader.Value; // skip to the end of the current object while (_reader.Read() && _reader.TokenType != JsonToken.EndObject) { if (_reader.TokenType == JsonToken.StartObject) throw JsonReaderException.Create(_reader, "Found StartObject within the schema reference with the Id '{0}'".FormatWith(CultureInfo.InvariantCulture, id)); } JsonSchema referencedSchema = _resolver.GetSchema(id); if (referencedSchema == null) throw new JsonException("Could not resolve schema reference for Id '{0}'.".FormatWith(CultureInfo.InvariantCulture, id)); return referencedSchema; } // regular ol' schema object Push(new JsonSchema()); ProcessSchemaProperty(propertyName); while (_reader.Read() && _reader.TokenType != JsonToken.EndObject) { propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); _reader.Read(); ProcessSchemaProperty(propertyName); } return Pop(); } private void ProcessSchemaProperty(string propertyName) { switch (propertyName) { case JsonSchemaConstants.TypePropertyName: CurrentSchema.Type = ProcessType(); break; case JsonSchemaConstants.IdPropertyName: CurrentSchema.Id = (string) _reader.Value; break; case JsonSchemaConstants.TitlePropertyName: CurrentSchema.Title = (string) _reader.Value; break; case JsonSchemaConstants.DescriptionPropertyName: CurrentSchema.Description = (string)_reader.Value; break; case JsonSchemaConstants.PropertiesPropertyName: ProcessProperties(); break; case JsonSchemaConstants.ItemsPropertyName: ProcessItems(); break; case JsonSchemaConstants.AdditionalPropertiesPropertyName: ProcessAdditionalProperties(); break; case JsonSchemaConstants.PatternPropertiesPropertyName: ProcessPatternProperties(); break; case JsonSchemaConstants.RequiredPropertyName: CurrentSchema.Required = (bool)_reader.Value; break; case JsonSchemaConstants.RequiresPropertyName: CurrentSchema.Requires = (string) _reader.Value; break; case JsonSchemaConstants.IdentityPropertyName: ProcessIdentity(); break; case JsonSchemaConstants.MinimumPropertyName: CurrentSchema.Minimum = Convert.ToDouble(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.MaximumPropertyName: CurrentSchema.Maximum = Convert.ToDouble(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.ExclusiveMinimumPropertyName: CurrentSchema.ExclusiveMinimum = (bool)_reader.Value; break; case JsonSchemaConstants.ExclusiveMaximumPropertyName: CurrentSchema.ExclusiveMaximum = (bool)_reader.Value; break; case JsonSchemaConstants.MaximumLengthPropertyName: CurrentSchema.MaximumLength = Convert.ToInt32(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.MinimumLengthPropertyName: CurrentSchema.MinimumLength = Convert.ToInt32(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.MaximumItemsPropertyName: CurrentSchema.MaximumItems = Convert.ToInt32(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.MinimumItemsPropertyName: CurrentSchema.MinimumItems = Convert.ToInt32(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.DivisibleByPropertyName: CurrentSchema.DivisibleBy = Convert.ToDouble(_reader.Value, CultureInfo.InvariantCulture); break; case JsonSchemaConstants.DisallowPropertyName: CurrentSchema.Disallow = ProcessType(); break; case JsonSchemaConstants.DefaultPropertyName: ProcessDefault(); break; case JsonSchemaConstants.HiddenPropertyName: CurrentSchema.Hidden = (bool) _reader.Value; break; case JsonSchemaConstants.ReadOnlyPropertyName: CurrentSchema.ReadOnly = (bool) _reader.Value; break; case JsonSchemaConstants.FormatPropertyName: CurrentSchema.Format = (string) _reader.Value; break; case JsonSchemaConstants.PatternPropertyName: CurrentSchema.Pattern = (string) _reader.Value; break; case JsonSchemaConstants.OptionsPropertyName: ProcessOptions(); break; case JsonSchemaConstants.EnumPropertyName: ProcessEnum(); break; case JsonSchemaConstants.ExtendsPropertyName: ProcessExtends(); break; default: _reader.Skip(); break; } } private void ProcessExtends() { CurrentSchema.Extends = BuildSchema(); } private void ProcessEnum() { if (_reader.TokenType != JsonToken.StartArray) throw JsonReaderException.Create(_reader, "Expected StartArray token while parsing enum values, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); CurrentSchema.Enum = new List(); while (_reader.Read() && _reader.TokenType != JsonToken.EndArray) { JToken value = JToken.ReadFrom(_reader); CurrentSchema.Enum.Add(value); } } private void ProcessOptions() { CurrentSchema.Options = new Dictionary(new JTokenEqualityComparer()); switch (_reader.TokenType) { case JsonToken.StartArray: while (_reader.Read() && _reader.TokenType != JsonToken.EndArray) { if (_reader.TokenType != JsonToken.StartObject) throw JsonReaderException.Create(_reader, "Expect object token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); string label = null; JToken value = null; while (_reader.Read() && _reader.TokenType != JsonToken.EndObject) { string propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); _reader.Read(); switch (propertyName) { case JsonSchemaConstants.OptionValuePropertyName: value = JToken.ReadFrom(_reader); break; case JsonSchemaConstants.OptionLabelPropertyName: label = (string) _reader.Value; break; default: throw JsonReaderException.Create(_reader, "Unexpected property in JSON schema option: {0}.".FormatWith(CultureInfo.InvariantCulture, propertyName)); } } if (value == null) throw new JsonException("No value specified for JSON schema option."); if (CurrentSchema.Options.ContainsKey(value)) throw new JsonException("Duplicate value in JSON schema option collection: {0}".FormatWith(CultureInfo.InvariantCulture, value)); CurrentSchema.Options.Add(value, label); } break; default: throw JsonReaderException.Create(_reader, "Expected array token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); } } private void ProcessDefault() { CurrentSchema.Default = JToken.ReadFrom(_reader); } private void ProcessIdentity() { CurrentSchema.Identity = new List(); switch (_reader.TokenType) { case JsonToken.String: CurrentSchema.Identity.Add(_reader.Value.ToString()); break; case JsonToken.StartArray: while (_reader.Read() && _reader.TokenType != JsonToken.EndArray) { if (_reader.TokenType != JsonToken.String) throw JsonReaderException.Create(_reader, "Exception JSON property name string token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); CurrentSchema.Identity.Add(_reader.Value.ToString()); } break; default: throw JsonReaderException.Create(_reader, "Expected array or JSON property name string token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); } } private void ProcessAdditionalProperties() { if (_reader.TokenType == JsonToken.Boolean) CurrentSchema.AllowAdditionalProperties = (bool)_reader.Value; else CurrentSchema.AdditionalProperties = BuildSchema(); } private void ProcessPatternProperties() { Dictionary patternProperties = new Dictionary(); if (_reader.TokenType != JsonToken.StartObject) throw JsonReaderException.Create(_reader, "Expected StartObject token."); while (_reader.Read() && _reader.TokenType != JsonToken.EndObject) { string propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); _reader.Read(); if (patternProperties.ContainsKey(propertyName)) throw new JsonException("Property {0} has already been defined in schema.".FormatWith(CultureInfo.InvariantCulture, propertyName)); patternProperties.Add(propertyName, BuildSchema()); } CurrentSchema.PatternProperties = patternProperties; } private void ProcessItems() { CurrentSchema.Items = new List(); switch (_reader.TokenType) { case JsonToken.StartObject: CurrentSchema.Items.Add(BuildSchema()); break; case JsonToken.StartArray: while (_reader.Read() && _reader.TokenType != JsonToken.EndArray) { CurrentSchema.Items.Add(BuildSchema()); } break; default: throw JsonReaderException.Create(_reader, "Expected array or JSON schema object token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); } } private void ProcessProperties() { IDictionary properties = new Dictionary(); if (_reader.TokenType != JsonToken.StartObject) throw JsonReaderException.Create(_reader, "Expected StartObject token while parsing schema properties, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); while (_reader.Read() && _reader.TokenType != JsonToken.EndObject) { string propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); _reader.Read(); if (properties.ContainsKey(propertyName)) throw new JsonException("Property {0} has already been defined in schema.".FormatWith(CultureInfo.InvariantCulture, propertyName)); properties.Add(propertyName, BuildSchema()); } CurrentSchema.Properties = properties; } private JsonSchemaType? ProcessType() { switch (_reader.TokenType) { case JsonToken.String: return MapType(_reader.Value.ToString()); case JsonToken.StartArray: // ensure type is in blank state before ORing values JsonSchemaType? type = JsonSchemaType.None; while (_reader.Read() && _reader.TokenType != JsonToken.EndArray) { if (_reader.TokenType != JsonToken.String) throw JsonReaderException.Create(_reader, "Exception JSON schema type string token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); type = type | MapType(_reader.Value.ToString()); } return type; default: throw JsonReaderException.Create(_reader, "Expected array or JSON schema type string token, got {0}.".FormatWith(CultureInfo.InvariantCulture, _reader.TokenType)); } } internal static JsonSchemaType MapType(string type) { JsonSchemaType mappedType; if (!JsonSchemaConstants.JsonSchemaTypeMapping.TryGetValue(type, out mappedType)) throw new JsonException("Invalid JSON schema type: {0}".FormatWith(CultureInfo.InvariantCulture, type)); return mappedType; } internal static string MapType(JsonSchemaType type) { return JsonSchemaConstants.JsonSchemaTypeMapping.Single(kv => kv.Value == type).Key; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaNode.cs0000644000175000017500000000556412253423361027351 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.Collections.ObjectModel; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Schema { internal class JsonSchemaNode { public string Id { get; private set; } public ReadOnlyCollection Schemas { get; private set; } public Dictionary Properties { get; private set; } public Dictionary PatternProperties { get; private set; } public List Items { get; private set; } public JsonSchemaNode AdditionalProperties { get; set; } public JsonSchemaNode(JsonSchema schema) { Schemas = new ReadOnlyCollection(new []{ schema }); Properties = new Dictionary(); PatternProperties = new Dictionary(); Items = new List(); Id = GetId(Schemas); } private JsonSchemaNode(JsonSchemaNode source, JsonSchema schema) { Schemas = new ReadOnlyCollection(source.Schemas.Union(new[] { schema }).ToList()); Properties = new Dictionary(source.Properties); PatternProperties = new Dictionary(source.PatternProperties); Items = new List(source.Items); AdditionalProperties = source.AdditionalProperties; Id = GetId(Schemas); } public JsonSchemaNode Combine(JsonSchema schema) { return new JsonSchemaNode(this, schema); } public static string GetId(IEnumerable schemata) { return string.Join("-", schemata.Select(s => s.InternalId).OrderBy(id => id, StringComparer.Ordinal).ToArray()); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaNodeCollection.cs0000644000175000017500000000261212253423361031354 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.ObjectModel; namespace Newtonsoft.Json.Schema { internal class JsonSchemaNodeCollection : KeyedCollection { protected override string GetKeyForItem(JsonSchemaNode item) { return item.Id; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/ValidationEventHandler.cs0000644000175000017500000000263412253423361031076 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Schema { /// /// Represents the callback method that will handle JSON schema validation events and the . /// public delegate void ValidationEventHandler(object sender, ValidationEventArgs e); }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchema.cs0000644000175000017500000002557512253423361026547 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using System.IO; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; using System.Globalization; namespace Newtonsoft.Json.Schema { /// /// An in-memory representation of a JSON Schema. /// public class JsonSchema { /// /// Gets or sets the id. /// public string Id { get; set; } /// /// Gets or sets the title. /// public string Title { get; set; } /// /// Gets or sets whether the object is required. /// public bool? Required { get; set; } /// /// Gets or sets whether the object is read only. /// public bool? ReadOnly { get; set; } /// /// Gets or sets whether the object is visible to users. /// public bool? Hidden { get; set; } /// /// Gets or sets whether the object is transient. /// public bool? Transient { get; set; } /// /// Gets or sets the description of the object. /// public string Description { get; set; } /// /// Gets or sets the types of values allowed by the object. /// /// The type. public JsonSchemaType? Type { get; set; } /// /// Gets or sets the pattern. /// /// The pattern. public string Pattern { get; set; } /// /// Gets or sets the minimum length. /// /// The minimum length. public int? MinimumLength { get; set; } /// /// Gets or sets the maximum length. /// /// The maximum length. public int? MaximumLength { get; set; } /// /// Gets or sets a number that the value should be divisble by. /// /// A number that the value should be divisble by. public double? DivisibleBy { get; set; } /// /// Gets or sets the minimum. /// /// The minimum. public double? Minimum { get; set; } /// /// Gets or sets the maximum. /// /// The maximum. public double? Maximum { get; set; } /// /// Gets or sets a flag indicating whether the value can not equal the number defined by the "minimum" attribute. /// /// A flag indicating whether the value can not equal the number defined by the "minimum" attribute. public bool? ExclusiveMinimum { get; set; } /// /// Gets or sets a flag indicating whether the value can not equal the number defined by the "maximum" attribute. /// /// A flag indicating whether the value can not equal the number defined by the "maximum" attribute. public bool? ExclusiveMaximum { get; set; } /// /// Gets or sets the minimum number of items. /// /// The minimum number of items. public int? MinimumItems { get; set; } /// /// Gets or sets the maximum number of items. /// /// The maximum number of items. public int? MaximumItems { get; set; } /// /// Gets or sets the of items. /// /// The of items. public IList Items { get; set; } /// /// Gets or sets the of properties. /// /// The of properties. public IDictionary Properties { get; set; } /// /// Gets or sets the of additional properties. /// /// The of additional properties. public JsonSchema AdditionalProperties { get; set; } /// /// Gets or sets the pattern properties. /// /// The pattern properties. public IDictionary PatternProperties { get; set; } /// /// Gets or sets a value indicating whether additional properties are allowed. /// /// /// true if additional properties are allowed; otherwise, false. /// public bool AllowAdditionalProperties { get; set; } /// /// Gets or sets the required property if this property is present. /// /// The required property if this property is present. public string Requires { get; set; } /// /// Gets or sets the identity. /// /// The identity. public IList Identity { get; set; } /// /// Gets or sets the a collection of valid enum values allowed. /// /// A collection of valid enum values allowed. public IList Enum { get; set; } /// /// Gets or sets a collection of options. /// /// A collection of options. public IDictionary Options { get; set; } /// /// Gets or sets disallowed types. /// /// The disallow types. public JsonSchemaType? Disallow { get; set; } /// /// Gets or sets the default value. /// /// The default value. public JToken Default { get; set; } /// /// Gets or sets the extend . /// /// The extended . public JsonSchema Extends { get; set; } /// /// Gets or sets the format. /// /// The format. public string Format { get; set; } private readonly string _internalId = Guid.NewGuid().ToString("N"); internal string InternalId { get { return _internalId; } } /// /// Initializes a new instance of the class. /// public JsonSchema() { AllowAdditionalProperties = true; } /// /// Reads a from the specified . /// /// The containing the JSON Schema to read. /// The object representing the JSON Schema. public static JsonSchema Read(JsonReader reader) { return Read(reader, new JsonSchemaResolver()); } /// /// Reads a from the specified . /// /// The containing the JSON Schema to read. /// The to use when resolving schema references. /// The object representing the JSON Schema. public static JsonSchema Read(JsonReader reader, JsonSchemaResolver resolver) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(resolver, "resolver"); JsonSchemaBuilder builder = new JsonSchemaBuilder(resolver); return builder.Parse(reader); } /// /// Load a from a string that contains schema JSON. /// /// A that contains JSON. /// A populated from the string that contains JSON. public static JsonSchema Parse(string json) { return Parse(json, new JsonSchemaResolver()); } /// /// Parses the specified json. /// /// The json. /// The resolver. /// A populated from the string that contains JSON. public static JsonSchema Parse(string json, JsonSchemaResolver resolver) { ValidationUtils.ArgumentNotNull(json, "json"); JsonReader reader = new JsonTextReader(new StringReader(json)); return Read(reader, resolver); } /// /// Writes this schema to a . /// /// A into which this method will write. public void WriteTo(JsonWriter writer) { WriteTo(writer, new JsonSchemaResolver()); } /// /// Writes this schema to a using the specified . /// /// A into which this method will write. /// The resolver used. public void WriteTo(JsonWriter writer, JsonSchemaResolver resolver) { ValidationUtils.ArgumentNotNull(writer, "writer"); ValidationUtils.ArgumentNotNull(resolver, "resolver"); JsonSchemaWriter schemaWriter = new JsonSchemaWriter(writer, resolver); schemaWriter.WriteSchema(this); } /// /// Returns a that represents the current . /// /// /// A that represents the current . /// public override string ToString() { StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); JsonTextWriter jsonWriter = new JsonTextWriter(writer); jsonWriter.Formatting = Formatting.Indented; WriteTo(jsonWriter); return writer.ToString(); } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/Extensions.cs0000644000175000017500000000764212253423361026647 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Schema { /// /// Contains the JSON schema extension methods. /// public static class Extensions { /// /// Determines whether the is valid. /// /// The source to test. /// The schema to test with. /// /// true if the specified is valid; otherwise, false. /// public static bool IsValid(this JToken source, JsonSchema schema) { bool valid = true; source.Validate(schema, (sender, args) => { valid = false; }); return valid; } /// /// Determines whether the is valid. /// /// The source to test. /// The schema to test with. /// When this method returns, contains any error messages generated while validating. /// /// true if the specified is valid; otherwise, false. /// public static bool IsValid(this JToken source, JsonSchema schema, out IList errorMessages) { IList errors = new List(); source.Validate(schema, (sender, args) => errors.Add(args.Message)); errorMessages = errors; return (errorMessages.Count == 0); } /// /// Validates the specified . /// /// The source to test. /// The schema to test with. public static void Validate(this JToken source, JsonSchema schema) { source.Validate(schema, null); } /// /// Validates the specified . /// /// The source to test. /// The schema to test with. /// The validation event handler. public static void Validate(this JToken source, JsonSchema schema, ValidationEventHandler validationEventHandler) { ValidationUtils.ArgumentNotNull(source, "source"); ValidationUtils.ArgumentNotNull(schema, "schema"); using (JsonValidatingReader reader = new JsonValidatingReader(source.CreateReader())) { reader.Schema = schema; if (validationEventHandler != null) reader.ValidationEventHandler += validationEventHandler; while (reader.Read()) { } } } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaGenerator.cs0000644000175000017500000004041312253423361030402 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Globalization; using System.ComponentModel; using System.Collections.Generic; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Serialization; #if NETFX_CORE using IConvertible = Newtonsoft.Json.Utilities.Convertible; #endif #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Schema { /// /// Generates a from a specified . /// public class JsonSchemaGenerator { /// /// Gets or sets how undefined schemas are handled by the serializer. /// public UndefinedSchemaIdHandling UndefinedSchemaIdHandling { get; set; } private IContractResolver _contractResolver; /// /// Gets or sets the contract resolver. /// /// The contract resolver. public IContractResolver ContractResolver { get { if (_contractResolver == null) return DefaultContractResolver.Instance; return _contractResolver; } set { _contractResolver = value; } } private class TypeSchema { public Type Type { get; private set; } public JsonSchema Schema { get; private set;} public TypeSchema(Type type, JsonSchema schema) { ValidationUtils.ArgumentNotNull(type, "type"); ValidationUtils.ArgumentNotNull(schema, "schema"); Type = type; Schema = schema; } } private JsonSchemaResolver _resolver; private readonly IList _stack = new List(); private JsonSchema _currentSchema; private JsonSchema CurrentSchema { get { return _currentSchema; } } private void Push(TypeSchema typeSchema) { _currentSchema = typeSchema.Schema; _stack.Add(typeSchema); _resolver.LoadedSchemas.Add(typeSchema.Schema); } private TypeSchema Pop() { TypeSchema popped = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); TypeSchema newValue = _stack.LastOrDefault(); if (newValue != null) { _currentSchema = newValue.Schema; } else { _currentSchema = null; } return popped; } /// /// Generate a from the specified type. /// /// The type to generate a from. /// A generated from the specified type. public JsonSchema Generate(Type type) { return Generate(type, new JsonSchemaResolver(), false); } /// /// Generate a from the specified type. /// /// The type to generate a from. /// The used to resolve schema references. /// A generated from the specified type. public JsonSchema Generate(Type type, JsonSchemaResolver resolver) { return Generate(type, resolver, false); } /// /// Generate a from the specified type. /// /// The type to generate a from. /// Specify whether the generated root will be nullable. /// A generated from the specified type. public JsonSchema Generate(Type type, bool rootSchemaNullable) { return Generate(type, new JsonSchemaResolver(), rootSchemaNullable); } /// /// Generate a from the specified type. /// /// The type to generate a from. /// The used to resolve schema references. /// Specify whether the generated root will be nullable. /// A generated from the specified type. public JsonSchema Generate(Type type, JsonSchemaResolver resolver, bool rootSchemaNullable) { ValidationUtils.ArgumentNotNull(type, "type"); ValidationUtils.ArgumentNotNull(resolver, "resolver"); _resolver = resolver; return GenerateInternal(type, (!rootSchemaNullable) ? Required.Always : Required.Default, false); } private string GetTitle(Type type) { JsonContainerAttribute containerAttribute = JsonTypeReflector.GetJsonContainerAttribute(type); if (containerAttribute != null && !string.IsNullOrEmpty(containerAttribute.Title)) return containerAttribute.Title; return null; } private string GetDescription(Type type) { JsonContainerAttribute containerAttribute = JsonTypeReflector.GetJsonContainerAttribute(type); if (containerAttribute != null && !string.IsNullOrEmpty(containerAttribute.Description)) return containerAttribute.Description; #if !(NETFX_CORE || PORTABLE) DescriptionAttribute descriptionAttribute = ReflectionUtils.GetAttribute(type); if (descriptionAttribute != null) return descriptionAttribute.Description; #endif return null; } private string GetTypeId(Type type, bool explicitOnly) { JsonContainerAttribute containerAttribute = JsonTypeReflector.GetJsonContainerAttribute(type); if (containerAttribute != null && !string.IsNullOrEmpty(containerAttribute.Id)) return containerAttribute.Id; if (explicitOnly) return null; switch (UndefinedSchemaIdHandling) { case UndefinedSchemaIdHandling.UseTypeName: return type.FullName; case UndefinedSchemaIdHandling.UseAssemblyQualifiedName: return type.AssemblyQualifiedName; default: return null; } } private JsonSchema GenerateInternal(Type type, Required valueRequired, bool required) { ValidationUtils.ArgumentNotNull(type, "type"); string resolvedId = GetTypeId(type, false); string explicitId = GetTypeId(type, true); if (!string.IsNullOrEmpty(resolvedId)) { JsonSchema resolvedSchema = _resolver.GetSchema(resolvedId); if (resolvedSchema != null) { // resolved schema is not null but referencing member allows nulls // change resolved schema to allow nulls. hacky but what are ya gonna do? if (valueRequired != Required.Always && !HasFlag(resolvedSchema.Type, JsonSchemaType.Null)) resolvedSchema.Type |= JsonSchemaType.Null; if (required && resolvedSchema.Required != true) resolvedSchema.Required = true; return resolvedSchema; } } // test for unresolved circular reference if (_stack.Any(tc => tc.Type == type)) { throw new JsonException("Unresolved circular reference for type '{0}'. Explicitly define an Id for the type using a JsonObject/JsonArray attribute or automatically generate a type Id using the UndefinedSchemaIdHandling property.".FormatWith(CultureInfo.InvariantCulture, type)); } JsonContract contract = ContractResolver.ResolveContract(type); JsonConverter converter; if ((converter = contract.Converter) != null || (converter = contract.InternalConverter) != null) { JsonSchema converterSchema = converter.GetSchema(); if (converterSchema != null) return converterSchema; } Push(new TypeSchema(type, new JsonSchema())); if (explicitId != null) CurrentSchema.Id = explicitId; if (required) CurrentSchema.Required = true; CurrentSchema.Title = GetTitle(type); CurrentSchema.Description = GetDescription(type); if (converter != null) { // todo: Add GetSchema to JsonConverter and use here? CurrentSchema.Type = JsonSchemaType.Any; } else { switch (contract.ContractType) { case JsonContractType.Object: CurrentSchema.Type = AddNullType(JsonSchemaType.Object, valueRequired); CurrentSchema.Id = GetTypeId(type, false); GenerateObjectSchema(type, (JsonObjectContract) contract); break; case JsonContractType.Array: CurrentSchema.Type = AddNullType(JsonSchemaType.Array, valueRequired); CurrentSchema.Id = GetTypeId(type, false); JsonArrayAttribute arrayAttribute = JsonTypeReflector.GetJsonContainerAttribute(type) as JsonArrayAttribute; bool allowNullItem = (arrayAttribute == null || arrayAttribute.AllowNullItems); Type collectionItemType = ReflectionUtils.GetCollectionItemType(type); if (collectionItemType != null) { CurrentSchema.Items = new List(); CurrentSchema.Items.Add(GenerateInternal(collectionItemType, (!allowNullItem) ? Required.Always : Required.Default, false)); } break; case JsonContractType.Primitive: CurrentSchema.Type = GetJsonSchemaType(type, valueRequired); if (CurrentSchema.Type == JsonSchemaType.Integer && type.IsEnum() && !type.IsDefined(typeof (FlagsAttribute), true)) { CurrentSchema.Enum = new List(); CurrentSchema.Options = new Dictionary(); EnumValues enumValues = EnumUtils.GetNamesAndValues(type); foreach (EnumValue enumValue in enumValues) { JToken value = JToken.FromObject(enumValue.Value); CurrentSchema.Enum.Add(value); CurrentSchema.Options.Add(value, enumValue.Name); } } break; case JsonContractType.String: JsonSchemaType schemaType = (!ReflectionUtils.IsNullable(contract.UnderlyingType)) ? JsonSchemaType.String : AddNullType(JsonSchemaType.String, valueRequired); CurrentSchema.Type = schemaType; break; case JsonContractType.Dictionary: CurrentSchema.Type = AddNullType(JsonSchemaType.Object, valueRequired); Type keyType; Type valueType; ReflectionUtils.GetDictionaryKeyValueTypes(type, out keyType, out valueType); if (keyType != null) { // can be converted to a string if (ConvertUtils.IsConvertible(keyType)) { CurrentSchema.AdditionalProperties = GenerateInternal(valueType, Required.Default, false); } } break; #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) case JsonContractType.Serializable: CurrentSchema.Type = AddNullType(JsonSchemaType.Object, valueRequired); CurrentSchema.Id = GetTypeId(type, false); GenerateISerializableContract(type, (JsonISerializableContract) contract); break; #endif #if !(NET35 || NET20 || WINDOWS_PHONE || PORTABLE) case JsonContractType.Dynamic: #endif case JsonContractType.Linq: CurrentSchema.Type = JsonSchemaType.Any; break; default: throw new JsonException("Unexpected contract type: {0}".FormatWith(CultureInfo.InvariantCulture, contract)); } } return Pop().Schema; } private JsonSchemaType AddNullType(JsonSchemaType type, Required valueRequired) { if (valueRequired != Required.Always) return type | JsonSchemaType.Null; return type; } private bool HasFlag(DefaultValueHandling value, DefaultValueHandling flag) { return ((value & flag) == flag); } private void GenerateObjectSchema(Type type, JsonObjectContract contract) { CurrentSchema.Properties = new Dictionary(); foreach (JsonProperty property in contract.Properties) { if (!property.Ignored) { bool optional = property.NullValueHandling == NullValueHandling.Ignore || HasFlag(property.DefaultValueHandling.GetValueOrDefault(), DefaultValueHandling.Ignore) || property.ShouldSerialize != null || property.GetIsSpecified != null; JsonSchema propertySchema = GenerateInternal(property.PropertyType, property.Required, !optional); if (property.DefaultValue != null) propertySchema.Default = JToken.FromObject(property.DefaultValue); CurrentSchema.Properties.Add(property.PropertyName, propertySchema); } } if (type.IsSealed()) CurrentSchema.AllowAdditionalProperties = false; } #if !(SILVERLIGHT || NETFX_CORE || PORTABLE) private void GenerateISerializableContract(Type type, JsonISerializableContract contract) { CurrentSchema.AllowAdditionalProperties = true; } #endif internal static bool HasFlag(JsonSchemaType? value, JsonSchemaType flag) { // default value is Any if (value == null) return true; bool match = ((value & flag) == flag); if (match) return true; // integer is a subset of float if (value == JsonSchemaType.Float && flag == JsonSchemaType.Integer) return true; return false; } private JsonSchemaType GetJsonSchemaType(Type type, Required valueRequired) { JsonSchemaType schemaType = JsonSchemaType.None; if (valueRequired != Required.Always && ReflectionUtils.IsNullable(type)) { schemaType = JsonSchemaType.Null; if (ReflectionUtils.IsNullableType(type)) type = Nullable.GetUnderlyingType(type); } TypeCode typeCode = ConvertUtils.GetTypeCode(type); switch (typeCode) { case TypeCode.Empty: case TypeCode.Object: return schemaType | JsonSchemaType.String; #if !(NETFX_CORE || PORTABLE) case TypeCode.DBNull: return schemaType | JsonSchemaType.Null; #endif case TypeCode.Boolean: return schemaType | JsonSchemaType.Boolean; case TypeCode.Char: return schemaType | JsonSchemaType.String; case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: return schemaType | JsonSchemaType.Integer; case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: return schemaType | JsonSchemaType.Float; // convert to string? case TypeCode.DateTime: return schemaType | JsonSchemaType.String; case TypeCode.String: return schemaType | JsonSchemaType.String; default: throw new JsonException("Unexpected type code '{0}' for type '{1}'.".FormatWith(CultureInfo.InvariantCulture, typeCode, type)); } } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaConstants.cs0000644000175000017500000000722712253423361030436 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; namespace Newtonsoft.Json.Schema { internal static class JsonSchemaConstants { public const string TypePropertyName = "type"; public const string PropertiesPropertyName = "properties"; public const string ItemsPropertyName = "items"; public const string RequiredPropertyName = "required"; public const string PatternPropertiesPropertyName = "patternProperties"; public const string AdditionalPropertiesPropertyName = "additionalProperties"; public const string RequiresPropertyName = "requires"; public const string IdentityPropertyName = "identity"; public const string MinimumPropertyName = "minimum"; public const string MaximumPropertyName = "maximum"; public const string ExclusiveMinimumPropertyName = "exclusiveMinimum"; public const string ExclusiveMaximumPropertyName = "exclusiveMaximum"; public const string MinimumItemsPropertyName = "minItems"; public const string MaximumItemsPropertyName = "maxItems"; public const string PatternPropertyName = "pattern"; public const string MaximumLengthPropertyName = "maxLength"; public const string MinimumLengthPropertyName = "minLength"; public const string EnumPropertyName = "enum"; public const string OptionsPropertyName = "options"; public const string ReadOnlyPropertyName = "readonly"; public const string TitlePropertyName = "title"; public const string DescriptionPropertyName = "description"; public const string FormatPropertyName = "format"; public const string DefaultPropertyName = "default"; public const string TransientPropertyName = "transient"; public const string DivisibleByPropertyName = "divisibleBy"; public const string HiddenPropertyName = "hidden"; public const string DisallowPropertyName = "disallow"; public const string ExtendsPropertyName = "extends"; public const string IdPropertyName = "id"; public const string OptionValuePropertyName = "value"; public const string OptionLabelPropertyName = "label"; public const string ReferencePropertyName = "$ref"; public static readonly IDictionary JsonSchemaTypeMapping = new Dictionary { {"string", JsonSchemaType.String}, {"object", JsonSchemaType.Object}, {"integer", JsonSchemaType.Integer}, {"number", JsonSchemaType.Float}, {"null", JsonSchemaType.Null}, {"boolean", JsonSchemaType.Boolean}, {"array", JsonSchemaType.Array}, {"any", JsonSchemaType.Any} }; } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaResolver.cs0000644000175000017500000000424412253423361030257 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Schema { /// /// Resolves from an id. /// public class JsonSchemaResolver { /// /// Gets or sets the loaded schemas. /// /// The loaded schemas. public IList LoadedSchemas { get; protected set; } /// /// Initializes a new instance of the class. /// public JsonSchemaResolver() { LoadedSchemas = new List(); } /// /// Gets a for the specified id. /// /// The id. /// A for the specified id. public virtual JsonSchema GetSchema(string id) { JsonSchema schema = LoadedSchemas.SingleOrDefault(s => s.Id == id); return schema; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaException.cs0000644000175000017500000001064112253423361030412 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Runtime.Serialization; namespace Newtonsoft.Json.Schema { /// /// Returns detailed information about the schema exception. /// #if !(SILVERLIGHT || WINDOWS_PHONE || NETFX_CORE || PORTABLE) [Serializable] #endif public class JsonSchemaException : JsonException { /// /// Gets the line number indicating where the error occurred. /// /// The line number indicating where the error occurred. public int LineNumber { get; private set; } /// /// Gets the line position indicating where the error occurred. /// /// The line position indicating where the error occurred. public int LinePosition { get; private set; } /// /// Gets the path to the JSON where the error occurred. /// /// The path to the JSON where the error occurred. public string Path { get; private set; } /// /// Initializes a new instance of the class. /// public JsonSchemaException() { } /// /// Initializes a new instance of the class /// with a specified error message. /// /// The error message that explains the reason for the exception. public JsonSchemaException(string message) : base(message) { } /// /// Initializes a new instance of the class /// with a specified error message and a reference to the inner exception that is the cause of this exception. /// /// The error message that explains the reason for the exception. /// The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. public JsonSchemaException(string message, Exception innerException) : base(message, innerException) { } #if !(WINDOWS_PHONE || SILVERLIGHT || NETFX_CORE || PORTABLE) /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is null. /// The class name is null or is zero (0). public JsonSchemaException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif internal JsonSchemaException(string message, Exception innerException, string path, int lineNumber, int linePosition) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaModelBuilder.cs0000644000175000017500000001277212253423361031032 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Schema { internal class JsonSchemaModelBuilder { private JsonSchemaNodeCollection _nodes = new JsonSchemaNodeCollection(); private Dictionary _nodeModels = new Dictionary(); private JsonSchemaNode _node ; public JsonSchemaModel Build(JsonSchema schema) { _nodes = new JsonSchemaNodeCollection(); _node = AddSchema(null, schema); _nodeModels = new Dictionary(); JsonSchemaModel model = BuildNodeModel(_node); return model; } public JsonSchemaNode AddSchema(JsonSchemaNode existingNode, JsonSchema schema) { string newId; if (existingNode != null) { if (existingNode.Schemas.Contains(schema)) return existingNode; newId = JsonSchemaNode.GetId(existingNode.Schemas.Union(new[] { schema })); } else { newId = JsonSchemaNode.GetId(new[] { schema }); } if (_nodes.Contains(newId)) return _nodes[newId]; JsonSchemaNode currentNode = (existingNode != null) ? existingNode.Combine(schema) : new JsonSchemaNode(schema); _nodes.Add(currentNode); AddProperties(schema.Properties, currentNode.Properties); AddProperties(schema.PatternProperties, currentNode.PatternProperties); if (schema.Items != null) { for (int i = 0; i < schema.Items.Count; i++) { AddItem(currentNode, i, schema.Items[i]); } } if (schema.AdditionalProperties != null) AddAdditionalProperties(currentNode, schema.AdditionalProperties); if (schema.Extends != null) currentNode = AddSchema(currentNode, schema.Extends); return currentNode; } public void AddProperties(IDictionary source, IDictionary target) { if (source != null) { foreach (KeyValuePair property in source) { AddProperty(target, property.Key, property.Value); } } } public void AddProperty(IDictionary target, string propertyName, JsonSchema schema) { JsonSchemaNode propertyNode; target.TryGetValue(propertyName, out propertyNode); target[propertyName] = AddSchema(propertyNode, schema); } public void AddItem(JsonSchemaNode parentNode, int index, JsonSchema schema) { JsonSchemaNode existingItemNode = (parentNode.Items.Count > index) ? parentNode.Items[index] : null; JsonSchemaNode newItemNode = AddSchema(existingItemNode, schema); if (!(parentNode.Items.Count > index)) { parentNode.Items.Add(newItemNode); } else { parentNode.Items[index] = newItemNode; } } public void AddAdditionalProperties(JsonSchemaNode parentNode, JsonSchema schema) { parentNode.AdditionalProperties = AddSchema(parentNode.AdditionalProperties, schema); } private JsonSchemaModel BuildNodeModel(JsonSchemaNode node) { JsonSchemaModel model; if (_nodeModels.TryGetValue(node, out model)) return model; model = JsonSchemaModel.Create(node.Schemas); _nodeModels[node] = model; foreach (KeyValuePair property in node.Properties) { if (model.Properties == null) model.Properties = new Dictionary(); model.Properties[property.Key] = BuildNodeModel(property.Value); } foreach (KeyValuePair property in node.PatternProperties) { if (model.PatternProperties == null) model.PatternProperties = new Dictionary(); model.PatternProperties[property.Key] = BuildNodeModel(property.Value); } foreach (JsonSchemaNode t in node.Items) { if (model.Items == null) model.Items = new List(); model.Items.Add(BuildNodeModel(t)); } if (node.AdditionalProperties != null) model.AdditionalProperties = BuildNodeModel(node.AdditionalProperties); return model; } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/ValidationEventArgs.cs0000644000175000017500000000452212253423361030413 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Schema { /// /// Returns detailed information related to the . /// public class ValidationEventArgs : EventArgs { private readonly JsonSchemaException _ex; internal ValidationEventArgs(JsonSchemaException ex) { ValidationUtils.ArgumentNotNull(ex, "ex"); _ex = ex; } /// /// Gets the associated with the validation error. /// /// The JsonSchemaException associated with the validation error. public JsonSchemaException Exception { get { return _ex; } } /// /// Gets the path of the JSON location where the validation error occurred. /// /// The path of the JSON location where the validation error occurred. public string Path { get { return _ex.Path; } } /// /// Gets the text description corresponding to the validation error. /// /// The text description. public string Message { get { return _ex.Message; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaType.cs0000644000175000017500000000402412253423361027373 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json.Schema { /// /// The value types allowed by the . /// [Flags] public enum JsonSchemaType { /// /// No type specified. /// None = 0, /// /// String type. /// String = 1, /// /// Float type. /// Float = 2, /// /// Integer type. /// Integer = 4, /// /// Boolean type. /// Boolean = 8, /// /// Object type. /// Object = 16, /// /// Array type. /// Array = 32, /// /// Null type. /// Null = 64, /// /// Any type. /// Any = String | Float | Integer | Boolean | Object | Array | Null } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/UndefinedSchemaIdHandling.cs0000644000175000017500000000324012253423361031442 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion namespace Newtonsoft.Json.Schema { /// /// Specifies undefined schema Id handling options for the . /// public enum UndefinedSchemaIdHandling { /// /// Do not infer a schema Id. /// None = 0, /// /// Use the .NET type name as the schema Id. /// UseTypeName = 1, /// /// Use the assembly qualified .NET type name as the schema Id. /// UseAssemblyQualifiedName = 2, } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaWriter.cs0000644000175000017500000002043612253423361027733 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json.Schema { internal class JsonSchemaWriter { private readonly JsonWriter _writer; private readonly JsonSchemaResolver _resolver; public JsonSchemaWriter(JsonWriter writer, JsonSchemaResolver resolver) { ValidationUtils.ArgumentNotNull(writer, "writer"); _writer = writer; _resolver = resolver; } private void ReferenceOrWriteSchema(JsonSchema schema) { if (schema.Id != null && _resolver.GetSchema(schema.Id) != null) { _writer.WriteStartObject(); _writer.WritePropertyName(JsonSchemaConstants.ReferencePropertyName); _writer.WriteValue(schema.Id); _writer.WriteEndObject(); } else { WriteSchema(schema); } } public void WriteSchema(JsonSchema schema) { ValidationUtils.ArgumentNotNull(schema, "schema"); if (!_resolver.LoadedSchemas.Contains(schema)) _resolver.LoadedSchemas.Add(schema); _writer.WriteStartObject(); WritePropertyIfNotNull(_writer, JsonSchemaConstants.IdPropertyName, schema.Id); WritePropertyIfNotNull(_writer, JsonSchemaConstants.TitlePropertyName, schema.Title); WritePropertyIfNotNull(_writer, JsonSchemaConstants.DescriptionPropertyName, schema.Description); WritePropertyIfNotNull(_writer, JsonSchemaConstants.RequiredPropertyName, schema.Required); WritePropertyIfNotNull(_writer, JsonSchemaConstants.ReadOnlyPropertyName, schema.ReadOnly); WritePropertyIfNotNull(_writer, JsonSchemaConstants.HiddenPropertyName, schema.Hidden); WritePropertyIfNotNull(_writer, JsonSchemaConstants.TransientPropertyName, schema.Transient); if (schema.Type != null) WriteType(JsonSchemaConstants.TypePropertyName, _writer, schema.Type.Value); if (!schema.AllowAdditionalProperties) { _writer.WritePropertyName(JsonSchemaConstants.AdditionalPropertiesPropertyName); _writer.WriteValue(schema.AllowAdditionalProperties); } else { if (schema.AdditionalProperties != null) { _writer.WritePropertyName(JsonSchemaConstants.AdditionalPropertiesPropertyName); ReferenceOrWriteSchema(schema.AdditionalProperties); } } WriteSchemaDictionaryIfNotNull(_writer, JsonSchemaConstants.PropertiesPropertyName, schema.Properties); WriteSchemaDictionaryIfNotNull(_writer, JsonSchemaConstants.PatternPropertiesPropertyName, schema.PatternProperties); WriteItems(schema); WritePropertyIfNotNull(_writer, JsonSchemaConstants.MinimumPropertyName, schema.Minimum); WritePropertyIfNotNull(_writer, JsonSchemaConstants.MaximumPropertyName, schema.Maximum); WritePropertyIfNotNull(_writer, JsonSchemaConstants.ExclusiveMinimumPropertyName, schema.ExclusiveMinimum); WritePropertyIfNotNull(_writer, JsonSchemaConstants.ExclusiveMaximumPropertyName, schema.ExclusiveMaximum); WritePropertyIfNotNull(_writer, JsonSchemaConstants.MinimumLengthPropertyName, schema.MinimumLength); WritePropertyIfNotNull(_writer, JsonSchemaConstants.MaximumLengthPropertyName, schema.MaximumLength); WritePropertyIfNotNull(_writer, JsonSchemaConstants.MinimumItemsPropertyName, schema.MinimumItems); WritePropertyIfNotNull(_writer, JsonSchemaConstants.MaximumItemsPropertyName, schema.MaximumItems); WritePropertyIfNotNull(_writer, JsonSchemaConstants.DivisibleByPropertyName, schema.DivisibleBy); WritePropertyIfNotNull(_writer, JsonSchemaConstants.FormatPropertyName, schema.Format); WritePropertyIfNotNull(_writer, JsonSchemaConstants.PatternPropertyName, schema.Pattern); if (schema.Enum != null) { _writer.WritePropertyName(JsonSchemaConstants.EnumPropertyName); _writer.WriteStartArray(); foreach (JToken token in schema.Enum) { token.WriteTo(_writer); } _writer.WriteEndArray(); } if (schema.Default != null) { _writer.WritePropertyName(JsonSchemaConstants.DefaultPropertyName); schema.Default.WriteTo(_writer); } if (schema.Options != null) { _writer.WritePropertyName(JsonSchemaConstants.OptionsPropertyName); _writer.WriteStartArray(); foreach (KeyValuePair option in schema.Options) { _writer.WriteStartObject(); _writer.WritePropertyName(JsonSchemaConstants.OptionValuePropertyName); option.Key.WriteTo(_writer); if (option.Value != null) { _writer.WritePropertyName(JsonSchemaConstants.OptionLabelPropertyName); _writer.WriteValue(option.Value); } _writer.WriteEndObject(); } _writer.WriteEndArray(); } if (schema.Disallow != null) WriteType(JsonSchemaConstants.DisallowPropertyName, _writer, schema.Disallow.Value); if (schema.Extends != null) { _writer.WritePropertyName(JsonSchemaConstants.ExtendsPropertyName); ReferenceOrWriteSchema(schema.Extends); } _writer.WriteEndObject(); } private void WriteSchemaDictionaryIfNotNull(JsonWriter writer, string propertyName, IDictionary properties) { if (properties != null) { writer.WritePropertyName(propertyName); writer.WriteStartObject(); foreach (KeyValuePair property in properties) { writer.WritePropertyName(property.Key); ReferenceOrWriteSchema(property.Value); } writer.WriteEndObject(); } } private void WriteItems(JsonSchema schema) { if (CollectionUtils.IsNullOrEmpty(schema.Items)) return; _writer.WritePropertyName(JsonSchemaConstants.ItemsPropertyName); if (schema.Items.Count == 1) { ReferenceOrWriteSchema(schema.Items[0]); return; } _writer.WriteStartArray(); foreach (JsonSchema itemSchema in schema.Items) { ReferenceOrWriteSchema(itemSchema); } _writer.WriteEndArray(); } private void WriteType(string propertyName, JsonWriter writer, JsonSchemaType type) { IList types; if (System.Enum.IsDefined(typeof(JsonSchemaType), type)) types = new List { type }; else types = EnumUtils.GetFlagsValues(type).Where(v => v != JsonSchemaType.None).ToList(); if (types.Count == 0) return; writer.WritePropertyName(propertyName); if (types.Count == 1) { writer.WriteValue(JsonSchemaBuilder.MapType(types[0])); return; } writer.WriteStartArray(); foreach (JsonSchemaType jsonSchemaType in types) { writer.WriteValue(JsonSchemaBuilder.MapType(jsonSchemaType)); } writer.WriteEndArray(); } private void WritePropertyIfNotNull(JsonWriter writer, string propertyName, object value) { if (value != null) { writer.WritePropertyName(propertyName); writer.WriteValue(value); } } } } smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Schema/JsonSchemaModel.cs0000644000175000017500000001040512253423361027512 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System.Collections.Generic; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Utilities; namespace Newtonsoft.Json.Schema { internal class JsonSchemaModel { public bool Required { get; set; } public JsonSchemaType Type { get; set; } public int? MinimumLength { get; set; } public int? MaximumLength { get; set; } public double? DivisibleBy { get; set; } public double? Minimum { get; set; } public double? Maximum { get; set; } public bool ExclusiveMinimum { get; set; } public bool ExclusiveMaximum { get; set; } public int? MinimumItems { get; set; } public int? MaximumItems { get; set; } public IList Patterns { get; set; } public IList Items { get; set; } public IDictionary Properties { get; set; } public IDictionary PatternProperties { get; set; } public JsonSchemaModel AdditionalProperties { get; set; } public bool AllowAdditionalProperties { get; set; } public IList Enum { get; set; } public JsonSchemaType Disallow { get; set; } public JsonSchemaModel() { Type = JsonSchemaType.Any; AllowAdditionalProperties = true; Required = false; } public static JsonSchemaModel Create(IList schemata) { JsonSchemaModel model = new JsonSchemaModel(); foreach (JsonSchema schema in schemata) { Combine(model, schema); } return model; } private static void Combine(JsonSchemaModel model, JsonSchema schema) { // Version 3 of the Draft JSON Schema has the default value of Not Required model.Required = model.Required || (schema.Required ?? false); model.Type = model.Type & (schema.Type ?? JsonSchemaType.Any); model.MinimumLength = MathUtils.Max(model.MinimumLength, schema.MinimumLength); model.MaximumLength = MathUtils.Min(model.MaximumLength, schema.MaximumLength); // not sure what is the best way to combine divisibleBy model.DivisibleBy = MathUtils.Max(model.DivisibleBy, schema.DivisibleBy); model.Minimum = MathUtils.Max(model.Minimum, schema.Minimum); model.Maximum = MathUtils.Max(model.Maximum, schema.Maximum); model.ExclusiveMinimum = model.ExclusiveMinimum || (schema.ExclusiveMinimum ?? false); model.ExclusiveMaximum = model.ExclusiveMaximum || (schema.ExclusiveMaximum ?? false); model.MinimumItems = MathUtils.Max(model.MinimumItems, schema.MinimumItems); model.MaximumItems = MathUtils.Min(model.MaximumItems, schema.MaximumItems); model.AllowAdditionalProperties = model.AllowAdditionalProperties && schema.AllowAdditionalProperties; if (schema.Enum != null) { if (model.Enum == null) model.Enum = new List(); model.Enum.AddRangeDistinct(schema.Enum, new JTokenEqualityComparer()); } model.Disallow = model.Disallow | (schema.Disallow ?? JsonSchemaType.None); if (schema.Pattern != null) { if (model.Patterns == null) model.Patterns = new List(); model.Patterns.AddDistinct(schema.Pattern); } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonValidatingReader.cs0000644000175000017500000006275012253423361027350 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Utilities; using System.Globalization; using System.Text.RegularExpressions; using System.IO; #if NET20 using Newtonsoft.Json.Utilities.LinqBridge; #else using System.Linq; #endif namespace Newtonsoft.Json { /// /// Represents a reader that provides validation. /// public class JsonValidatingReader : JsonReader, IJsonLineInfo { private class SchemaScope { private readonly JTokenType _tokenType; private readonly IList _schemas; private readonly Dictionary _requiredProperties; public string CurrentPropertyName { get; set; } public int ArrayItemCount { get; set; } public IList Schemas { get { return _schemas; } } public Dictionary RequiredProperties { get { return _requiredProperties; } } public JTokenType TokenType { get { return _tokenType; } } public SchemaScope(JTokenType tokenType, IList schemas) { _tokenType = tokenType; _schemas = schemas; _requiredProperties = schemas.SelectMany(GetRequiredProperties).Distinct().ToDictionary(p => p, p => false); } private IEnumerable GetRequiredProperties(JsonSchemaModel schema) { if (schema == null || schema.Properties == null) return Enumerable.Empty(); return schema.Properties.Where(p => p.Value.Required).Select(p => p.Key); } } private readonly JsonReader _reader; private readonly Stack _stack; private JsonSchema _schema; private JsonSchemaModel _model; private SchemaScope _currentScope; /// /// Sets an event handler for receiving schema validation errors. /// public event ValidationEventHandler ValidationEventHandler; /// /// Gets the text value of the current Json token. /// /// public override object Value { get { return _reader.Value; } } /// /// Gets the depth of the current token in the JSON document. /// /// The depth of the current token in the JSON document. public override int Depth { get { return _reader.Depth; } } /// /// Gets the path of the current JSON token. /// public override string Path { get { return _reader.Path; } } /// /// Gets the quotation mark character used to enclose the value of a string. /// /// public override char QuoteChar { get { return _reader.QuoteChar; } protected internal set { } } /// /// Gets the type of the current Json token. /// /// public override JsonToken TokenType { get { return _reader.TokenType; } } /// /// Gets the Common Language Runtime (CLR) type for the current Json token. /// /// public override Type ValueType { get { return _reader.ValueType; } } private void Push(SchemaScope scope) { _stack.Push(scope); _currentScope = scope; } private SchemaScope Pop() { SchemaScope poppedScope = _stack.Pop(); _currentScope = (_stack.Count != 0) ? _stack.Peek() : null; return poppedScope; } private IEnumerable CurrentSchemas { get { return _currentScope.Schemas; } } private IEnumerable CurrentMemberSchemas { get { if (_currentScope == null) return new List(new [] { _model }); if (_currentScope.Schemas == null || _currentScope.Schemas.Count == 0) return Enumerable.Empty(); switch (_currentScope.TokenType) { case JTokenType.None: return _currentScope.Schemas; case JTokenType.Object: { if (_currentScope.CurrentPropertyName == null) throw new JsonReaderException("CurrentPropertyName has not been set on scope."); IList schemas = new List(); foreach (JsonSchemaModel schema in CurrentSchemas) { JsonSchemaModel propertySchema; if (schema.Properties != null && schema.Properties.TryGetValue(_currentScope.CurrentPropertyName, out propertySchema)) { schemas.Add(propertySchema); } if (schema.PatternProperties != null) { foreach (KeyValuePair patternProperty in schema.PatternProperties) { if (Regex.IsMatch(_currentScope.CurrentPropertyName, patternProperty.Key)) { schemas.Add(patternProperty.Value); } } } if (schemas.Count == 0 && schema.AllowAdditionalProperties && schema.AdditionalProperties != null) schemas.Add(schema.AdditionalProperties); } return schemas; } case JTokenType.Array: { IList schemas = new List(); foreach (JsonSchemaModel schema in CurrentSchemas) { if (!CollectionUtils.IsNullOrEmpty(schema.Items)) { if (schema.Items.Count == 1) { schemas.Add(schema.Items[0]); } else { if (schema.Items.Count > (_currentScope.ArrayItemCount - 1)) schemas.Add(schema.Items[_currentScope.ArrayItemCount - 1]); } } if (schema.AllowAdditionalProperties && schema.AdditionalProperties != null) schemas.Add(schema.AdditionalProperties); } return schemas; } case JTokenType.Constructor: return Enumerable.Empty(); default: throw new ArgumentOutOfRangeException("TokenType", "Unexpected token type: {0}".FormatWith(CultureInfo.InvariantCulture, _currentScope.TokenType)); } } } private void RaiseError(string message, JsonSchemaModel schema) { IJsonLineInfo lineInfo = this; string exceptionMessage = (lineInfo.HasLineInfo()) ? message + " Line {0}, position {1}.".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition) : message; OnValidationEvent(new JsonSchemaException(exceptionMessage, null, Path, lineInfo.LineNumber, lineInfo.LinePosition)); } private void OnValidationEvent(JsonSchemaException exception) { ValidationEventHandler handler = ValidationEventHandler; if (handler != null) handler(this, new ValidationEventArgs(exception)); else throw exception; } /// /// Initializes a new instance of the class that /// validates the content returned from the given . /// /// The to read from while validating. public JsonValidatingReader(JsonReader reader) { ValidationUtils.ArgumentNotNull(reader, "reader"); _reader = reader; _stack = new Stack(); } /// /// Gets or sets the schema. /// /// The schema. public JsonSchema Schema { get { return _schema; } set { if (TokenType != JsonToken.None) throw new InvalidOperationException("Cannot change schema while validating JSON."); _schema = value; _model = null; } } /// /// Gets the used to construct this . /// /// The specified in the constructor. public JsonReader Reader { get { return _reader; } } private void ValidateInEnumAndNotDisallowed(JsonSchemaModel schema) { if (schema == null) return; JToken value = new JValue(_reader.Value); if (schema.Enum != null) { StringWriter sw = new StringWriter(CultureInfo.InvariantCulture); value.WriteTo(new JsonTextWriter(sw)); if (!schema.Enum.ContainsValue(value, new JTokenEqualityComparer())) RaiseError("Value {0} is not defined in enum.".FormatWith(CultureInfo.InvariantCulture, sw.ToString()), schema); } JsonSchemaType? currentNodeType = GetCurrentNodeSchemaType(); if (currentNodeType != null) { if (JsonSchemaGenerator.HasFlag(schema.Disallow, currentNodeType.Value)) RaiseError("Type {0} is disallowed.".FormatWith(CultureInfo.InvariantCulture, currentNodeType), schema); } } private JsonSchemaType? GetCurrentNodeSchemaType() { switch (_reader.TokenType) { case JsonToken.StartObject: return JsonSchemaType.Object; case JsonToken.StartArray: return JsonSchemaType.Array; case JsonToken.Integer: return JsonSchemaType.Integer; case JsonToken.Float: return JsonSchemaType.Float; case JsonToken.String: return JsonSchemaType.String; case JsonToken.Boolean: return JsonSchemaType.Boolean; case JsonToken.Null: return JsonSchemaType.Null; default: return null; } } /// /// Reads the next JSON token from the stream as a . /// /// A . public override int? ReadAsInt32() { int? i = _reader.ReadAsInt32(); ValidateCurrentToken(); return i; } /// /// Reads the next JSON token from the stream as a . /// /// /// A or a null reference if the next JSON token is null. /// public override byte[] ReadAsBytes() { byte[] data = _reader.ReadAsBytes(); ValidateCurrentToken(); return data; } /// /// Reads the next JSON token from the stream as a . /// /// A . public override decimal? ReadAsDecimal() { decimal? d = _reader.ReadAsDecimal(); ValidateCurrentToken(); return d; } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override string ReadAsString() { string s = _reader.ReadAsString(); ValidateCurrentToken(); return s; } /// /// Reads the next JSON token from the stream as a . /// /// A . This method will return null at the end of an array. public override DateTime? ReadAsDateTime() { DateTime? dateTime = _reader.ReadAsDateTime(); ValidateCurrentToken(); return dateTime; } #if !NET20 /// /// Reads the next JSON token from the stream as a . /// /// A . public override DateTimeOffset? ReadAsDateTimeOffset() { DateTimeOffset? dateTimeOffset = _reader.ReadAsDateTimeOffset(); ValidateCurrentToken(); return dateTimeOffset; } #endif /// /// Reads the next JSON token from the stream. /// /// /// true if the next token was read successfully; false if there are no more tokens to read. /// public override bool Read() { if (!_reader.Read()) return false; if (_reader.TokenType == JsonToken.Comment) return true; ValidateCurrentToken(); return true; } private void ValidateCurrentToken() { // first time validate has been called. build model if (_model == null) { JsonSchemaModelBuilder builder = new JsonSchemaModelBuilder(); _model = builder.Build(_schema); } switch (_reader.TokenType) { case JsonToken.StartObject: ProcessValue(); IList objectSchemas = CurrentMemberSchemas.Where(ValidateObject).ToList(); Push(new SchemaScope(JTokenType.Object, objectSchemas)); break; case JsonToken.StartArray: ProcessValue(); IList arraySchemas = CurrentMemberSchemas.Where(ValidateArray).ToList(); Push(new SchemaScope(JTokenType.Array, arraySchemas)); break; case JsonToken.StartConstructor: Push(new SchemaScope(JTokenType.Constructor, null)); break; case JsonToken.PropertyName: foreach (JsonSchemaModel schema in CurrentSchemas) { ValidatePropertyName(schema); } break; case JsonToken.Raw: break; case JsonToken.Integer: ProcessValue(); foreach (JsonSchemaModel schema in CurrentMemberSchemas) { ValidateInteger(schema); } break; case JsonToken.Float: ProcessValue(); foreach (JsonSchemaModel schema in CurrentMemberSchemas) { ValidateFloat(schema); } break; case JsonToken.String: ProcessValue(); foreach (JsonSchemaModel schema in CurrentMemberSchemas) { ValidateString(schema); } break; case JsonToken.Boolean: ProcessValue(); foreach (JsonSchemaModel schema in CurrentMemberSchemas) { ValidateBoolean(schema); } break; case JsonToken.Null: ProcessValue(); foreach (JsonSchemaModel schema in CurrentMemberSchemas) { ValidateNull(schema); } break; case JsonToken.Undefined: break; case JsonToken.EndObject: foreach (JsonSchemaModel schema in CurrentSchemas) { ValidateEndObject(schema); } Pop(); break; case JsonToken.EndArray: foreach (JsonSchemaModel schema in CurrentSchemas) { ValidateEndArray(schema); } Pop(); break; case JsonToken.EndConstructor: Pop(); break; case JsonToken.Date: case JsonToken.Bytes: // these have no equivalent in JSON schema break; case JsonToken.None: // no content, do nothing break; default: throw new ArgumentOutOfRangeException(); } } private void ValidateEndObject(JsonSchemaModel schema) { if (schema == null) return; Dictionary requiredProperties = _currentScope.RequiredProperties; if (requiredProperties != null) { List unmatchedRequiredProperties = requiredProperties.Where(kv => !kv.Value).Select(kv => kv.Key).ToList(); if (unmatchedRequiredProperties.Count > 0) RaiseError("Required properties are missing from object: {0}.".FormatWith(CultureInfo.InvariantCulture, string.Join(", ", unmatchedRequiredProperties.ToArray())), schema); } } private void ValidateEndArray(JsonSchemaModel schema) { if (schema == null) return; int arrayItemCount = _currentScope.ArrayItemCount; if (schema.MaximumItems != null && arrayItemCount > schema.MaximumItems) RaiseError("Array item count {0} exceeds maximum count of {1}.".FormatWith(CultureInfo.InvariantCulture, arrayItemCount, schema.MaximumItems), schema); if (schema.MinimumItems != null && arrayItemCount < schema.MinimumItems) RaiseError("Array item count {0} is less than minimum count of {1}.".FormatWith(CultureInfo.InvariantCulture, arrayItemCount, schema.MinimumItems), schema); } private void ValidateNull(JsonSchemaModel schema) { if (schema == null) return; if (!TestType(schema, JsonSchemaType.Null)) return; ValidateInEnumAndNotDisallowed(schema); } private void ValidateBoolean(JsonSchemaModel schema) { if (schema == null) return; if (!TestType(schema, JsonSchemaType.Boolean)) return; ValidateInEnumAndNotDisallowed(schema); } private void ValidateString(JsonSchemaModel schema) { if (schema == null) return; if (!TestType(schema, JsonSchemaType.String)) return; ValidateInEnumAndNotDisallowed(schema); string value = _reader.Value.ToString(); if (schema.MaximumLength != null && value.Length > schema.MaximumLength) RaiseError("String '{0}' exceeds maximum length of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.MaximumLength), schema); if (schema.MinimumLength != null && value.Length < schema.MinimumLength) RaiseError("String '{0}' is less than minimum length of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.MinimumLength), schema); if (schema.Patterns != null) { foreach (string pattern in schema.Patterns) { if (!Regex.IsMatch(value, pattern)) RaiseError("String '{0}' does not match regex pattern '{1}'.".FormatWith(CultureInfo.InvariantCulture, value, pattern), schema); } } } private void ValidateInteger(JsonSchemaModel schema) { if (schema == null) return; if (!TestType(schema, JsonSchemaType.Integer)) return; ValidateInEnumAndNotDisallowed(schema); long value = Convert.ToInt64(_reader.Value, CultureInfo.InvariantCulture); if (schema.Maximum != null) { if (value > schema.Maximum) RaiseError("Integer {0} exceeds maximum value of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.Maximum), schema); if (schema.ExclusiveMaximum && value == schema.Maximum) RaiseError("Integer {0} equals maximum value of {1} and exclusive maximum is true.".FormatWith(CultureInfo.InvariantCulture, value, schema.Maximum), schema); } if (schema.Minimum != null) { if (value < schema.Minimum) RaiseError("Integer {0} is less than minimum value of {1}.".FormatWith(CultureInfo.InvariantCulture, value, schema.Minimum), schema); if (schema.ExclusiveMinimum && value == schema.Minimum) RaiseError("Integer {0} equals minimum value of {1} and exclusive minimum is true.".FormatWith(CultureInfo.InvariantCulture, value, schema.Minimum), schema); } if (schema.DivisibleBy != null && !IsZero(value % schema.DivisibleBy.Value)) RaiseError("Integer {0} is not evenly divisible by {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.DivisibleBy), schema); } private void ProcessValue() { if (_currentScope != null && _currentScope.TokenType == JTokenType.Array) { _currentScope.ArrayItemCount++; foreach (JsonSchemaModel currentSchema in CurrentSchemas) { if (currentSchema != null && currentSchema.Items != null && currentSchema.Items.Count > 1 && _currentScope.ArrayItemCount >= currentSchema.Items.Count) RaiseError("Index {0} has not been defined and the schema does not allow additional items.".FormatWith(CultureInfo.InvariantCulture, _currentScope.ArrayItemCount), currentSchema); } } } private void ValidateFloat(JsonSchemaModel schema) { if (schema == null) return; if (!TestType(schema, JsonSchemaType.Float)) return; ValidateInEnumAndNotDisallowed(schema); double value = Convert.ToDouble(_reader.Value, CultureInfo.InvariantCulture); if (schema.Maximum != null) { if (value > schema.Maximum) RaiseError("Float {0} exceeds maximum value of {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Maximum), schema); if (schema.ExclusiveMaximum && value == schema.Maximum) RaiseError("Float {0} equals maximum value of {1} and exclusive maximum is true.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Maximum), schema); } if (schema.Minimum != null) { if (value < schema.Minimum) RaiseError("Float {0} is less than minimum value of {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Minimum), schema); if (schema.ExclusiveMinimum && value == schema.Minimum) RaiseError("Float {0} equals minimum value of {1} and exclusive minimum is true.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.Minimum), schema); } if (schema.DivisibleBy != null && !IsZero(value % schema.DivisibleBy.Value)) RaiseError("Float {0} is not evenly divisible by {1}.".FormatWith(CultureInfo.InvariantCulture, JsonConvert.ToString(value), schema.DivisibleBy), schema); } private static bool IsZero(double value) { const double epsilon = 2.2204460492503131e-016; return Math.Abs(value) < 10.0 * epsilon; } private void ValidatePropertyName(JsonSchemaModel schema) { if (schema == null) return; string propertyName = Convert.ToString(_reader.Value, CultureInfo.InvariantCulture); if (_currentScope.RequiredProperties.ContainsKey(propertyName)) _currentScope.RequiredProperties[propertyName] = true; if (!schema.AllowAdditionalProperties) { bool propertyDefinied = IsPropertyDefinied(schema, propertyName); if (!propertyDefinied) RaiseError("Property '{0}' has not been defined and the schema does not allow additional properties.".FormatWith(CultureInfo.InvariantCulture, propertyName), schema); } _currentScope.CurrentPropertyName = propertyName; } private bool IsPropertyDefinied(JsonSchemaModel schema, string propertyName) { if (schema.Properties != null && schema.Properties.ContainsKey(propertyName)) return true; if (schema.PatternProperties != null) { foreach (string pattern in schema.PatternProperties.Keys) { if (Regex.IsMatch(propertyName, pattern)) return true; } } return false; } private bool ValidateArray(JsonSchemaModel schema) { if (schema == null) return true; return (TestType(schema, JsonSchemaType.Array)); } private bool ValidateObject(JsonSchemaModel schema) { if (schema == null) return true; return (TestType(schema, JsonSchemaType.Object)); } private bool TestType(JsonSchemaModel currentSchema, JsonSchemaType currentType) { if (!JsonSchemaGenerator.HasFlag(currentSchema.Type, currentType)) { RaiseError("Invalid type. Expected {0} but got {1}.".FormatWith(CultureInfo.InvariantCulture, currentSchema.Type, currentType), currentSchema); return false; } return true; } bool IJsonLineInfo.HasLineInfo() { IJsonLineInfo lineInfo = _reader as IJsonLineInfo; return lineInfo != null && lineInfo.HasLineInfo(); } int IJsonLineInfo.LineNumber { get { IJsonLineInfo lineInfo = _reader as IJsonLineInfo; return (lineInfo != null) ? lineInfo.LineNumber : 0; } } int IJsonLineInfo.LinePosition { get { IJsonLineInfo lineInfo = _reader as IJsonLineInfo; return (lineInfo != null) ? lineInfo.LinePosition : 0; } } } }smuxi-1.1/lib/Newtonsoft.Json/Src/Newtonsoft.Json/JsonObjectAttribute.cs0000644000175000017500000000623112253423361027225 0ustar00meebeymeebey00000000000000#region License // Copyright (c) 2007 James Newton-King // // 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 AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; namespace Newtonsoft.Json { /// /// Instructs the how to serialize the object. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization = MemberSerialization.OptOut; // yuck. can't set nullable properties on an attribute in C# // have to use this approach to get an unset default state internal Required? _itemRequired; /// /// Gets or sets the member serialization. /// /// The member serialization. public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } /// /// Gets or sets a value that indicates whether the object's properties are required. /// /// /// A value indicating whether the object's properties are required. /// public Required ItemRequired { get { return _itemRequired ?? default(Required); } set { _itemRequired = value; } } /// /// Initializes a new instance of the class. /// public JsonObjectAttribute() { } /// /// Initializes a new instance of the class with the specified member serialization. /// /// The member serialization. public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } /// /// Initializes a new instance of the class with the specified container Id. /// /// The container Id. public JsonObjectAttribute(string id) : base(id) { } } }smuxi-1.1/lib/SmartIrc4net/0000755000175000017500000000000014011526500016375 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/SmartIrc4net.sln0000664000175000017500000001206613014002107021433 0ustar00meebeymeebey00000000000000 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartIrc4net", "SmartIrc4net.csproj", "{91D3003B-7E65-4EAF-8EE1-DA43832E7A9C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "benchmark", "examples\benchmark\benchmark.csproj", "{CD3D60C4-0A53-4B4C-B30C-1C4F2D68A21E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "examples\test\test.csproj", "{6F25C6EA-D1C3-47AA-8300-B6D5D6DE33B2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "stresstest", "examples\stresstest\stresstest.csproj", "{65CBCA77-4241-4D4C-ACCB-E640D972CDC4}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StarkSoftProxy", "src\starksoftproxy\StarkSoftProxy.csproj", "{3F8CF2C1-EA37-444F-8693-A3A00B1131D2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{154D83B3-A162-4886-B358-6188DBE376D7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Release|Any CPU = Release|Any CPU Debug|Any CPU = Debug|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {154D83B3-A162-4886-B358-6188DBE376D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {154D83B3-A162-4886-B358-6188DBE376D7}.Debug|Any CPU.Build.0 = Debug|Any CPU {154D83B3-A162-4886-B358-6188DBE376D7}.Release|Any CPU.ActiveCfg = Release|Any CPU {154D83B3-A162-4886-B358-6188DBE376D7}.Release|Any CPU.Build.0 = Release|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Debug|Any CPU.Build.0 = Debug|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Release|Any CPU.Build.0 = Release|Any CPU {65CBCA77-4241-4D4C-ACCB-E640D972CDC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {65CBCA77-4241-4D4C-ACCB-E640D972CDC4}.Debug|Any CPU.Build.0 = Debug|Any CPU {65CBCA77-4241-4D4C-ACCB-E640D972CDC4}.Release|Any CPU.ActiveCfg = Release|Any CPU {65CBCA77-4241-4D4C-ACCB-E640D972CDC4}.Release|Any CPU.Build.0 = Release|Any CPU {6F25C6EA-D1C3-47AA-8300-B6D5D6DE33B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F25C6EA-D1C3-47AA-8300-B6D5D6DE33B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F25C6EA-D1C3-47AA-8300-B6D5D6DE33B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F25C6EA-D1C3-47AA-8300-B6D5D6DE33B2}.Release|Any CPU.Build.0 = Release|Any CPU {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C}.Debug|Any CPU.Build.0 = Debug|Any CPU {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C}.Release|Any CPU.Build.0 = Release|Any CPU {CD3D60C4-0A53-4B4C-B30C-1C4F2D68A21E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD3D60C4-0A53-4B4C-B30C-1C4F2D68A21E}.Debug|Any CPU.Build.0 = Debug|Any CPU {CD3D60C4-0A53-4B4C-B30C-1C4F2D68A21E}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD3D60C4-0A53-4B4C-B30C-1C4F2D68A21E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = SmartIrc4net.csproj Policies = $0 $0.ChangeLogPolicy = $1 $1.UpdateMode = Nearest $1.MessageStyle = $2 $2.LineAlign = 0 $1.inheritsSet = Mono $0.TextStylePolicy = $3 $3.inheritsSet = VisualStudio $3.inheritsScope = text/plain $3.scope = text/plain $0.TextStylePolicy = $4 $4.inheritsSet = null $4.scope = text/x-csharp $0.CSharpFormattingPolicy = $5 $5.IndentSwitchBody = True $5.AllowPropertyGetBlockInline = False $5.AllowPropertySetBlockInline = False $5.BeforeMethodDeclarationParentheses = False $5.BeforeMethodCallParentheses = False $5.BeforeConstructorDeclarationParentheses = False $5.BeforeDelegateDeclarationParentheses = False $5.NewParentheses = False $5.inheritsSet = Mono $5.inheritsScope = text/x-csharp $5.scope = text/x-csharp $0.StandardHeader = $6 $6.Text = @ SmartIrc4net - the IRC library for .NET/C# \n\n Copyright (c) ${Year} ${CopyrightHolder}\n\n Full LGPL License: \n\n This library is free software; you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as\n published by the Free Software Foundation; either version 2.1 of the\n License, or (at your option) any later version.\n\n This library is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public\n License along with this library; if not, write to the Free Software\n Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA $6.IncludeInNewFiles = True releaseversion = 0.4.5 name = SmartIrc4net EndGlobalSection EndGlobal smuxi-1.1/lib/SmartIrc4net/expansions.m40000664000175000017500000000146613014002107021031 0ustar00meebeymeebey00000000000000AC_DEFUN([SHAMROCK_EXPAND_LIBDIR], [ expanded_libdir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $libdir )` AC_SUBST(expanded_libdir) ]) AC_DEFUN([SHAMROCK_EXPAND_BINDIR], [ expanded_bindir=`( case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac eval echo $bindir )` AC_SUBST(expanded_bindir) ]) AC_DEFUN([SHAMROCK_EXPAND_DATADIR], [ case $prefix in NONE) prefix=$ac_default_prefix ;; *) ;; esac case $exec_prefix in NONE) exec_prefix=$prefix ;; *) ;; esac expanded_datadir=`(eval echo $datadir)` expanded_datadir=`(eval echo $expanded_datadir)` AC_SUBST(expanded_datadir) ]) smuxi-1.1/lib/SmartIrc4net/autogen.sh0000775000175000017500000000457213014002107020402 0ustar00meebeymeebey00000000000000#! /bin/sh PROJECT=smuxi FILE= CONFIGURE=configure.ac : ${AUTOCONF=autoconf} : ${AUTOHEADER=autoheader} : ${AUTOMAKE=automake} : ${LIBTOOLIZE=libtoolize} : ${ACLOCAL=aclocal} : ${LIBTOOL=libtool} srcdir=`dirname $0` test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir TEST_TYPE=-f aclocalinclude="-I . $ACLOCAL_FLAGS" DIE=0 ($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have autoconf installed to compile $PROJECT." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } ($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have automake installed to compile $PROJECT." echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz" echo "(or a newer version if it is available)" DIE=1 } (grep "^AM_PROG_LIBTOOL" $CONFIGURE >/dev/null) && { ($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`libtool' installed to compile $PROJECT." echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" echo "(or a newer version if it is available)" DIE=1 } } if test "$DIE" -eq 1; then exit 1 fi #test $TEST_TYPE $FILE || { # echo "You must run this script in the top-level $PROJECT directory" # exit 1 #} if test -z "$*"; then echo "I am going to run ./configure with no arguments - if you wish " echo "to pass any to it, please specify them on the $0 command line." fi case $CC in *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;; esac (grep "^AM_PROG_LIBTOOL" $CONFIGURE >/dev/null) && { echo "Running $LIBTOOLIZE ..." $LIBTOOLIZE --force --copy } echo "Running $ACLOCAL $aclocalinclude ..." $ACLOCAL $aclocalinclude echo "Running $AUTOMAKE --gnu $am_opt ..." $AUTOMAKE --add-missing --gnu $am_opt echo "Running $AUTOCONF ..." $AUTOCONF if test x$NOGIT = x; then git submodule init || exit 1 git submodule update || exit 1 else echo Skipping git submodule initialization. fi if test x$NOCONFIGURE = x; then echo Running $srcdir/configure $conf_flags "$@" ... $srcdir/configure --enable-maintainer-mode $conf_flags "$@" || exit 1 else echo Skipping configure process. fi smuxi-1.1/lib/SmartIrc4net/API_CHANGE0000664000175000017500000000537613014002107017745 0ustar00meebeymeebey00000000000000API Change (0.2.0 -> 0.3.0) Documentation ----------------------------------------- This file is only relevent for you if you wrote an IRC application that is SmartIrc4net 0.2.0 based! If you didn't use SmartIrc4net yet, you can safely ignore this file and just continue on hacking a great IRC application ;) The API naming between SmartIrc4net 0.2.0 and 0.3.0 changed a lot, mostly because of .NET library standards. Here are the changes: - All RFC commands in IrcCommands are now prefixed with "Rfc" If you used the Join() method, then you need to change your calls to RfcJoin(). The reason is for this change is that the most commands are plain RFC wrapper methods. This way you can easily distinguish between API commands/feature and plain RFC commands. Another reason was conflicts or confusing names like Admin(), Version() or Ison(). Message() got renamed to SendMessage() which makes more clear what that method actually does. - All delegates now uses .NET standards conform signatures If you used JoinEventHandler which was: JoinEventHandler(string channel, string who, Data ircdata) it's now: JoinEventHandler(object sender, JoinEventArgs e); This way the .NET library standards suggest, because those JoinEventArgs which extends IrcEventArgs which extends EventArgs can be easily changed at any time later for additional data. The "sender" argument is type IrcClient, the irc client object that triggered the event (very useful for multiple irc connections). IrcEventArgs always contain the property "Data" (type IrcMessageData, formerly known as type Data) This means you have to change all your event method signatures, e.g.: If you had an event method for OnJoin it was like this: MyOnJoinMethod(string channel, string who, Data ircdata) { System.Console.WriteLine(who+" joined on "+channel+"!"); } you need to change that to: MyOnJoinMethod(object sender, JoinEventArgs e) { System.Console.WriteLine(e.Who+" joined on "+e.Channel+"!"); } you still have the whole parsed IRC message in e.Data! - Connect() Disconnect() Reconnect() don't return bool anymore They use now proper exception handling, so catch them! There is ConnectionException which work for all 3 methods, and also more specific exception types like: CouldNotConnectException AlreadyConnectedException NotConnectionException There is also a very general exception type which will catch ANY exception that SmartIrc4net will throw! It's called: SmartIrc4netException - ChannelSync property is renamed to ActiveChannelSync (read more about in the CHANGELOG) - Any method that will send a message can throw an exception! If the IRC library is not connected and you try to send any message, then a NotConnectedException will be thrown! smuxi-1.1/lib/SmartIrc4net/smartirc4net.snk0000664000175000017500000000112413014002107021523 0ustar00meebeymeebey00000000000000$RSA2Ɍ_V顢 xeLK, źq;8cҮp1]xљFmU7mGQr_4݂Rti5u@A%HpH9~{@0 fACQ?Ozឧ/ys%\+:fuB g`ZQ{3: e ,B#ʏ ~7r3~kdi_* $sm5Ř6c$'%sgQgOtnGg i btw, I forgot to mention, but the channel modes +q and +a are for Owner (~) and Admin (&) respectively. - IrcClient.AutoAwaySync, query every minute WHO of joined channels to keep away synced - Reconnect() / StoreRejoinChannels() should remember channel keys too! - add IrcNetwork property, which is guessed by default or passed with Connect() - Documentation - passive channel sync - AutoNickChange - clean message parser, channel is not always right set (need to check for replycode!) - DCC chat, file send/receive - ipv6 support? - add IrcConnection.HostAddress (which IP is used for the client) - add OnSocketTimeout event - add server properties to IrcConnection (required for smart mode changes etc) - Exception Error Handling (argument checking) - Use async sockets? - Create Debian Package smuxi-1.1/lib/SmartIrc4net/debian/0000755000175000017500000000000013014002107017611 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/debian/libsmartirc4net0.4-cil.links0000664000175000017500000000011013014002107024742 0ustar00meebeymeebey00000000000000usr/lib/pkgconfig/smartirc4net.pc usr/lib/pkgconfig/smartirc4net-0.4.pc smuxi-1.1/lib/SmartIrc4net/debian/compat0000664000175000017500000000000213014002107021011 0ustar00meebeymeebey000000000000005 smuxi-1.1/lib/SmartIrc4net/debian/key.snk.uue0000664000175000017500000000152013014002107021713 0ustar00meebeymeebey00000000000000begin 600 key.snk M!P(````D``!24T$R``0``!$```#)C+`?K8^G[U^XC0!6'9[SG>FAHH:]"7BL MSV7%WTRUKP"`2RP*A[H+VL6Z<>'(._G..)MCFM*N<`[6/\9/$7H;!I'AGJ>ES\"4$'UPK.F9U`;-""6>.8%H6XE$/^GNP?QO&N,[3>_>LZ^=,+ M91<,NBQ"M\;=$2,$JLJ/('X6V#=RA;L5,Y/#PGZW:Q5D^!AIA5\JS!+2#>[L M)'.4;=KZ-:WVQ9C!FC;B!0ACD]LDF^`!)Y^ M9_(*J&GV!<`\3MN98%!>F+Q`=Q0KE9&(4Q M`1-WP)D8N3%D42^6#`QFCP$8^/ZC%5!#\K6!?&[/#,9!\.MD$)=VP:TUU+\U MZQTPP-L]J#?8\VSJSF,9S83/?YR;X)#-(C]],FOBKB[6`L,K3HU>=J7A3HW? M[S.<0+#&$<>-)(6DV6:N[LW9/0KUQ/_U:[6)Z]8C?Q0H?8>\3.IA[/DY0!/R M<(CF@Y]Y7DT+C* Build-Depends: debhelper (>= 5.0.0), dpatch Build-Depends-Indep: cli-common-dev (>= 0.4.4), mono-gmcs (>= 1.0) | c-sharp-2.0-compiler, sharutils, pkg-config, libmono-dev, liblog4net1.2-cil Standards-Version: 3.7.2 Package: libsmartirc4net0.4-cil Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, ${cli:Depends} Description: IRC library for CLI SmartIrc4net is a multi-threaded and thread-safe IRC library written in C#. It allows you to communicate with IRC servers. The API features full channel syncing and is splitted in 3 layers: IrcConnection, IrcCommands and IrcClient. smuxi-1.1/lib/SmartIrc4net/debian/changelog0000664000175000017500000000024013014002107021461 0ustar00meebeymeebey00000000000000smartirc4net (0.4.5-1~pre1) unstable; urgency=low * Initial release. (Closes: #310837) -- Mirco Bauer Fri, 18 Jul 2008 17:04:00 +0200 smuxi-1.1/lib/SmartIrc4net/debian/rules0000775000175000017500000000266613014002107020705 0ustar00meebeymeebey00000000000000#!/usr/bin/make -f #export DH_VERBOSE=1 export MONO_SHARED_DIR=$(CURDIR) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif # Include dpatch stuff. include /usr/share/dpatch/dpatch.make build: patch build-stamp build-stamp: dh_testdir uudecode -o debian/key.snk debian/key.snk.uue ./configure --enable-release $(MAKE) touch build-stamp clean: clean-patched unpatch clean-patched: dh_testdir dh_testroot rm -f build-stamp -$(MAKE) clean rm -rf $(MONO_SHARED_DIR)/.wapi rm -f debian/key.snk dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs #$(MAKE) install PREFIX=/usr DESTDIR=$(CURDIR)/debian/tmp mkdir -p debian/libsmartirc4net0.4-cil/usr/lib/cli/smartirc4net-0.4/ cp bin/release/Meebey.SmartIrc4net.dll debian/libsmartirc4net0.4-cil/usr/lib/cli/smartirc4net-0.4/ binary-indep: build install dh_testdir dh_testroot dh_install #dh_installchangelogs ChangeLog dh_installdocs dh_installexamples dh_installmenu dh_installman dh_link dh_strip dh_compress dh_fixperms dh_shlibdeps dh_makeclilibs -m 0.4.5 dh_installcligac dh_clideps dh_installdeb dh_gencontrol dh_md5sums dh_builddeb binary-arch: binary: binary-indep .PHONY: build clean binary-indep binary-arch binary install patch unpatch smuxi-1.1/lib/SmartIrc4net/debian/libsmartirc4net0.4-cil.install0000664000175000017500000000005313014002107025276 0ustar00meebeymeebey00000000000000debian/smartirc4net.pc /usr/lib/pkgconfig/ smuxi-1.1/lib/SmartIrc4net/debian/copyright0000664000175000017500000000204313014002107021545 0ustar00meebeymeebey00000000000000This package was debianized by Mirco Bauer on Wed, 18 Apr 2007 01:01:50 +0200. It was downloaded from http://smartirc4net.meebey.net/ Copyright Holder: Mirco Bauer License: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA On Debian systems, the complete text of the GNU Lesser General Public License can be found in `/usr/share/common-licenses/LGPL'. smuxi-1.1/lib/SmartIrc4net/debian/watch0000664000175000017500000000010513014002107020640 0ustar00meebeymeebey00000000000000version=3 http://sf.net/smartirc4net/SmartIrc4net-(.*)\.src\.tar\.gz smuxi-1.1/lib/SmartIrc4net/debian/patches/0000755000175000017500000000000013014002107021240 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/debian/patches/use_debian_key.snk.dpatch0000775000175000017500000000130113014002107026165 0ustar00meebeymeebey00000000000000#! /bin/sh /usr/share/dpatch/dpatch-run ## use_debian_key.snk.dpatch by Mirco Bauer ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: No description. @DPATCH@ diff -urNad svn~/Makefile svn/Makefile --- svn~/Makefile 2007-04-18 02:21:20.000000000 +0200 +++ svn/Makefile 2007-04-18 02:21:59.000000000 +0200 @@ -25,8 +25,7 @@ release-signed: release-signed-stamp release-signed-stamp: $(SOURCE_FILES) - $(CSC) /target:library /define:DELAY_SIGN /out:bin/release/$(TARGET) $^ - $(CSS) -R bin/release/$(TARGET) ../SmartIrc4net.snk + $(CSC) /target:library /out:bin/release/$(TARGET) -keyfile:debian/key.snk $^ touch release-signed-stamp docs: release smuxi-1.1/lib/SmartIrc4net/debian/patches/00list0000664000175000017500000000002313014002107022273 0ustar00meebeymeebey00000000000000use_debian_key.snk smuxi-1.1/lib/SmartIrc4net/debian/libsmartirc4net0.4-cil.installcligac0000664000175000017500000000006613014002107026445 0ustar00meebeymeebey00000000000000/usr/lib/cli/smartirc4net-0.4/Meebey.SmartIrc4net.dll smuxi-1.1/lib/SmartIrc4net/debian/docs0000664000175000017500000000006213014002107020464 0ustar00meebeymeebey00000000000000API_CHANGE CHANGELOG CREDITS FEATURES README TODO smuxi-1.1/lib/SmartIrc4net/src/0000755000175000017500000000000013014002126017157 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/0000755000175000017500000000000013014002126021714 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/Delegates.cs0000664000175000017500000000245413014002107024146 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { public delegate void ReadLineEventHandler(object sender, ReadLineEventArgs e); public delegate void WriteLineEventHandler(object sender, WriteLineEventArgs e); public delegate void AutoConnectErrorEventHandler(object sender, AutoConnectErrorEventArgs e); } smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/EventArgs.cs0000664000175000017500000000502513014002107024144 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections.Specialized; namespace Meebey.SmartIrc4net { /// /// /// public class ReadLineEventArgs : EventArgs { private string _Line; public string Line { get { return _Line; } } internal ReadLineEventArgs(string line) { _Line = line; } } /// /// /// public class WriteLineEventArgs : EventArgs { private string _Line; public string Line { get { return _Line; } } internal WriteLineEventArgs(string line) { _Line = line; } } /// /// /// public class AutoConnectErrorEventArgs : EventArgs { private Exception _Exception; private string _Address; private int _Port; public Exception Exception { get { return _Exception; } } public string Address { get { return _Address; } } public int Port { get { return _Port; } } internal AutoConnectErrorEventArgs(string address, int port, Exception ex) { _Address = address; _Port = port; _Exception = ex; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/ProxyType.cs0000664000175000017500000000216513014002107024233 0ustar00meebeymeebey00000000000000/* * $Id$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2009 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; namespace Meebey.SmartIrc4net { public enum ProxyType { None, Http, Socks4, Socks4a, Socks5 } } smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/IrcConnection.cs0000664000175000017500000014755313014002126025021 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2009 Mirco Bauer * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Security; using System.Net.Sockets; using System.Reflection; using System.Text; using System.Security.Cryptography.X509Certificates; using System.Security.Authentication; using System.Threading; using Starksoft.Net.Proxy; namespace Meebey.SmartIrc4net { /// /// /// /// public class IrcConnection { private string _VersionNumber; private string _VersionString; private string[] _AddressList = {"localhost"}; private int _CurrentAddress; private int _Port; private bool _UseSsl; private bool _ValidateServerCertificate; private X509Certificate _SslClientCertificate; private StreamReader _Reader; private StreamWriter _Writer; private ReadThread _ReadThread; private WriteThread _WriteThread; private IdleWorkerThread _IdleWorkerThread; private TcpClient _TcpClient; private Hashtable _SendBuffer = Hashtable.Synchronized(new Hashtable()); private int _SendDelay = 200; private bool _IsRegistered; private bool _IsConnected; private bool _IsConnectionError; private bool _IsDisconnecting; private int _AutoRetryAttempt; private bool _AutoRetry; private int _AutoRetryDelay = 30; private int _AutoRetryLimit = 3; private bool _AutoReconnect; private Encoding _Encoding = Encoding.Default; public bool EnableUTF8Recode { get; set; } private int _SocketReceiveTimeout = 600; private int _SocketSendTimeout = 600; private int _IdleWorkerInterval = 60; private int _PingInterval = 60; private int _PingTimeout = 300; private Stopwatch PingStopwatch { get; set; } private Stopwatch NextPingStopwatch { get; set; } private string _ProxyHost; private int _ProxyPort; private ProxyType _ProxyType = ProxyType.None; private string _ProxyUsername; private string _ProxyPassword; /// /// Raised when a \r\n terminated line is read from the socket /// public event ReadLineEventHandler OnReadLine; /// /// Raised when a \r\n terminated line is written to the socket /// public event WriteLineEventHandler OnWriteLine; /// /// Raised before the connect attempt /// public event EventHandler OnConnecting; /// /// Raised on successful connect /// public event EventHandler OnConnected; /// /// Raised before the connection is closed /// public event EventHandler OnDisconnecting; /// /// Raised when the connection is closed /// public event EventHandler OnDisconnected; /// /// Raised when the connection got into an error state /// public event EventHandler OnConnectionError; /// /// Raised when the connection got into an error state during auto connect loop /// public event AutoConnectErrorEventHandler OnAutoConnectError; /// /// When a connection error is detected this property will return true /// protected bool IsConnectionError { get { lock (this) { return _IsConnectionError; } } set { lock (this) { _IsConnectionError = value; } if (value) { // signal ReadLine() to check IsConnectionError state _ReadThread.QueuedEvent.Set(); } } } protected bool IsDisconnecting { get { lock (this) { return _IsDisconnecting; } } set { lock (this) { _IsDisconnecting = value; } } } /// /// Gets the current address of the connection /// public string Address { get { return _AddressList[_CurrentAddress]; } } /// /// Gets the address list of the connection /// public string[] AddressList { get { return _AddressList; } } /// /// Gets the used port of the connection /// public int Port { get { return _Port; } } /// /// By default nothing is done when the library looses the connection /// to the server. /// Default: false /// /// /// true, if the library should reconnect on lost connections /// false, if the library should not take care of it /// public bool AutoReconnect { get { return _AutoReconnect; } set { #if LOG4NET if (value) { Logger.Connection.Info("AutoReconnect enabled"); } else { Logger.Connection.Info("AutoReconnect disabled"); } #endif _AutoReconnect = value; } } /// /// If the library should retry to connect when the connection fails. /// Default: false /// /// /// true, if the library should retry to connect /// false, if the library should not retry /// public bool AutoRetry { get { return _AutoRetry; } set { #if LOG4NET if (value) { Logger.Connection.Info("AutoRetry enabled"); } else { Logger.Connection.Info("AutoRetry disabled"); } #endif _AutoRetry = value; } } /// /// Delay between retry attempts in Connect() in seconds. /// Default: 30 /// public int AutoRetryDelay { get { return _AutoRetryDelay; } set { _AutoRetryDelay = value; } } /// /// Maximum number of retries to connect to the server /// Default: 3 /// public int AutoRetryLimit { get { return _AutoRetryLimit; } set { _AutoRetryLimit = value; } } /// /// Returns the current amount of reconnect attempts /// Default: 3 /// public int AutoRetryAttempt { get { return _AutoRetryAttempt; } } /// /// To prevent flooding the IRC server, it's required to delay each /// message, given in milliseconds. /// Default: 200 /// public int SendDelay { get { return _SendDelay; } set { _SendDelay = value; } } /// /// On successful registration on the IRC network, this is set to true. /// public bool IsRegistered { get { return _IsRegistered; } } /// /// On successful connect to the IRC server, this is set to true. /// public bool IsConnected { get { return _IsConnected; } } /// /// Gets the SmartIrc4net version number /// public string VersionNumber { get { return _VersionNumber; } } /// /// Gets the full SmartIrc4net version string /// public string VersionString { get { return _VersionString; } } /// /// The encoding to use to write to and read from the socket. /// /// If EnableUTF8Recode is true, reading and writing will always happen /// using UTF-8; this encoding is only used to decode incoming messages /// that cannot be successfully decoded using UTF-8. /// /// Default: encoding of the system /// public Encoding Encoding { get { return _Encoding; } set { _Encoding = value; } } /// /// Enables/disables using SSL for the connection /// Default: false /// public bool UseSsl { get { return _UseSsl; } set { _UseSsl = value; } } /// /// Specifies if the certificate of the server is validated /// Default: true /// public bool ValidateServerCertificate { get { return _ValidateServerCertificate; } set { _ValidateServerCertificate = value; } } /// /// Specifies the client certificate used for the SSL connection /// Default: null /// public X509Certificate SslClientCertificate { get { return _SslClientCertificate; } set { _SslClientCertificate = value; } } /// /// Timeout in seconds for receiving data from the socket /// Default: 600 /// public int SocketReceiveTimeout { get { return _SocketReceiveTimeout; } set { _SocketReceiveTimeout = value; } } /// /// Timeout in seconds for sending data to the socket /// Default: 600 /// public int SocketSendTimeout { get { return _SocketSendTimeout; } set { _SocketSendTimeout = value; } } /// /// Interval in seconds to run the idle worker /// Default: 60 /// public int IdleWorkerInterval { get { return _IdleWorkerInterval; } set { _IdleWorkerInterval = value; } } /// /// Interval in seconds to send a PING /// Default: 60 /// public int PingInterval { get { return _PingInterval; } set { _PingInterval = value; } } /// /// Timeout in seconds for server response to a PING /// Default: 600 /// public int PingTimeout { get { return _PingTimeout; } set { _PingTimeout = value; } } /// /// Latency between client and the server /// public TimeSpan Lag { get { return PingStopwatch.Elapsed; } } /// /// If you want to use a Proxy, set the ProxyHost to Host of the Proxy you want to use. /// public string ProxyHost { get { return _ProxyHost; } set { _ProxyHost = value; } } /// /// If you want to use a Proxy, set the ProxyPort to Port of the Proxy you want to use. /// public int ProxyPort { get { return _ProxyPort; } set { _ProxyPort = value; } } /// /// Standard Setting is to use no Proxy Server, if you Set this to any other value, /// you have to set the ProxyHost and ProxyPort aswell (and give credentials if needed) /// Default: ProxyType.None /// public ProxyType ProxyType { get { return _ProxyType; } set { _ProxyType = value; } } /// /// Username to your Proxy Server /// public string ProxyUsername { get { return _ProxyUsername; } set { _ProxyUsername = value; } } /// /// Password to your Proxy Server /// public string ProxyPassword { get { return _ProxyPassword; } set { _ProxyPassword = value; } } /// /// Initializes the message queues, read and write thread /// public IrcConnection() { #if LOG4NET Logger.Main.Debug("IrcConnection created"); #endif _SendBuffer[Priority.High] = Queue.Synchronized(new Queue()); _SendBuffer[Priority.AboveMedium] = Queue.Synchronized(new Queue()); _SendBuffer[Priority.Medium] = Queue.Synchronized(new Queue()); _SendBuffer[Priority.BelowMedium] = Queue.Synchronized(new Queue()); _SendBuffer[Priority.Low] = Queue.Synchronized(new Queue()); // setup own callbacks OnReadLine += new ReadLineEventHandler(_SimpleParser); OnConnectionError += new EventHandler(_OnConnectionError); _ReadThread = new ReadThread(this); _WriteThread = new WriteThread(this); _IdleWorkerThread = new IdleWorkerThread(this); PingStopwatch = new Stopwatch(); NextPingStopwatch = new Stopwatch(); Assembly assm = Assembly.GetAssembly(this.GetType()); AssemblyName assm_name = assm.GetName(false); AssemblyProductAttribute pr = (AssemblyProductAttribute)assm.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0]; _VersionNumber = assm_name.Version.ToString(); _VersionString = pr.Product+" "+_VersionNumber; } #if LOG4NET ~IrcConnection() { Logger.Main.Debug("IrcConnection destroyed"); } #endif /// this method has 2 overloads /// /// Connects to the specified server and port, when the connection fails /// the next server in the list will be used. /// /// List of servers to connect to /// Portnumber to connect to /// The connection failed /// If there is already an active connection public void Connect(string[] addresslist, int port) { if (_IsConnected) { throw new AlreadyConnectedException("Already connected to: " + Address + ":" + Port); } _AutoRetryAttempt++; #if LOG4NET Logger.Connection.Info(String.Format("connecting... (attempt: {0})", _AutoRetryAttempt)); #endif _AddressList = (string[])addresslist.Clone(); _Port = port; if (OnConnecting != null) { OnConnecting(this, EventArgs.Empty); } try { _TcpClient = new TcpClient(); _TcpClient.NoDelay = true; _TcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1); // set timeout, after this the connection will be aborted _TcpClient.ReceiveTimeout = _SocketReceiveTimeout * 1000; _TcpClient.SendTimeout = _SocketSendTimeout * 1000; if (_ProxyType != ProxyType.None) { IProxyClient proxyClient = null; ProxyClientFactory proxyFactory = new ProxyClientFactory(); // HACK: map our ProxyType to Starksoft's ProxyType Starksoft.Net.Proxy.ProxyType proxyType = (Starksoft.Net.Proxy.ProxyType) Enum.Parse( typeof(ProxyType), _ProxyType.ToString(), true ); if (_ProxyUsername == null && _ProxyPassword == null) { proxyClient = proxyFactory.CreateProxyClient( proxyType ); } else { proxyClient = proxyFactory.CreateProxyClient( proxyType, _ProxyHost, _ProxyPort, _ProxyUsername, _ProxyPassword ); } _TcpClient.Connect(_ProxyHost, _ProxyPort); proxyClient.TcpClient = _TcpClient; proxyClient.CreateConnection(Address, port); } else { _TcpClient.Connect(Address, port); } Stream stream = _TcpClient.GetStream(); if (_UseSsl) { RemoteCertificateValidationCallback certValidation; if (_ValidateServerCertificate) { certValidation = ServicePointManager.ServerCertificateValidationCallback; if (certValidation == null) { certValidation = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) { return true; } #if LOG4NET Logger.Connection.Error( "Connect(): Certificate error: " + sslPolicyErrors ); #endif return false; }; } } else { certValidation = delegate { return true; }; } RemoteCertificateValidationCallback certValidationWithIrcAsSender = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return certValidation(this, certificate, chain, sslPolicyErrors); }; LocalCertificateSelectionCallback selectionCallback = delegate(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers) { if (localCertificates == null || localCertificates.Count == 0) { return null; } return localCertificates[0]; }; SslStream sslStream = new SslStream(stream, false, certValidationWithIrcAsSender, selectionCallback); try { if (_SslClientCertificate != null) { var certs = new X509Certificate2Collection(); certs.Add(_SslClientCertificate); sslStream.AuthenticateAsClient(Address, certs, SslProtocols.Default, false); } else { sslStream.AuthenticateAsClient(Address); } } catch (IOException ex) { #if LOG4NET Logger.Connection.Error( "Connect(): AuthenticateAsClient() failed!" ); #endif throw new CouldNotConnectException("Could not connect to: " + Address + ":" + Port + " " + ex.Message, ex); } stream = sslStream; } if (EnableUTF8Recode) { _Reader = new StreamReader(stream, new PrimaryOrFallbackEncoding(new UTF8Encoding(false, true), _Encoding)); _Writer = new StreamWriter(stream, new UTF8Encoding(false, false)); } else { _Reader = new StreamReader(stream, _Encoding); _Writer = new StreamWriter(stream, _Encoding); if (_Encoding.GetPreamble().Length > 0) { // HACK: we have an encoding that has some kind of preamble // like UTF-8 has a BOM, this will confuse the IRCd! // Thus we send a \r\n so the IRCd can safely ignore that // garbage. _Writer.WriteLine(); // make sure we flush the BOM+CRLF correctly _Writer.Flush(); } } // Connection was succeful, reseting the connect counter _AutoRetryAttempt = 0; // updating the connection error state, so connecting is possible again IsConnectionError = false; _IsConnected = true; // lets power up our threads _ReadThread.Start(); _WriteThread.Start(); _IdleWorkerThread.Start(); #if LOG4NET Logger.Connection.Info("connected"); #endif if (OnConnected != null) { OnConnected(this, EventArgs.Empty); } } catch (AuthenticationException ex) { #if LOG4NET Logger.Connection.Error("Connect(): Exception", ex); #endif throw new CouldNotConnectException("Could not connect to: " + Address + ":" + Port + " " + ex.Message, ex); } catch (Exception e) { if (_Reader != null) { try { _Reader.Close(); } catch (ObjectDisposedException) { } } if (_Writer != null) { try { _Writer.Close(); } catch (ObjectDisposedException) { } } if (_TcpClient != null) { _TcpClient.Close(); } _IsConnected = false; IsConnectionError = true; #if LOG4NET Logger.Connection.Info("connection failed: "+e.Message, e); #endif if (e is CouldNotConnectException) { // error was fatal, bail out throw; } if (_AutoRetry && (_AutoRetryLimit == -1 || _AutoRetryLimit == 0 || _AutoRetryLimit <= _AutoRetryAttempt)) { if (OnAutoConnectError != null) { OnAutoConnectError(this, new AutoConnectErrorEventArgs(Address, Port, e)); } #if LOG4NET Logger.Connection.Debug("delaying new connect attempt for "+_AutoRetryDelay+" sec"); #endif Thread.Sleep(_AutoRetryDelay * 1000); _NextAddress(); // FIXME: this is recursion Connect(_AddressList, _Port); } else { throw new CouldNotConnectException("Could not connect to: "+Address+":"+Port+" "+e.Message, e); } } } /// /// Connects to the specified server and port. /// /// Server address to connect to /// Port number to connect to public void Connect(string address, int port) { Connect(new string[] { address }, port); } /// /// Reconnects to the server /// /// /// If there was no active connection /// /// /// The connection failed /// /// /// If there is already an active connection /// public void Reconnect() { #if LOG4NET Logger.Connection.Info("reconnecting..."); #endif Disconnect(); Connect(_AddressList, _Port); } /// /// Disconnects from the server /// /// /// If there was no active connection /// public void Disconnect() { if (!IsConnected) { throw new NotConnectedException("The connection could not be disconnected because there is no active connection"); } #if LOG4NET Logger.Connection.Info("disconnecting..."); #endif if (OnDisconnecting != null) { OnDisconnecting(this, EventArgs.Empty); } IsDisconnecting = true; _IdleWorkerThread.Stop(); _ReadThread.Stop(); _WriteThread.Stop(); _TcpClient.Close(); _IsConnected = false; _IsRegistered = false; // signal ReadLine() to check IsConnected state _ReadThread.QueuedEvent.Set(); IsDisconnecting = false; if (OnDisconnected != null) { OnDisconnected(this, EventArgs.Empty); } #if LOG4NET Logger.Connection.Info("disconnected"); #endif } /// /// /// /// public void Listen(bool blocking) { if (blocking) { while (IsConnected) { ReadLine(true); } } else { while (ReadLine(false).Length > 0) { // loop as long as we receive messages } } } /// /// /// public void Listen() { Listen(true); } /// /// /// /// public void ListenOnce(bool blocking) { ReadLine(blocking); } /// /// /// public void ListenOnce() { ListenOnce(true); } /// /// /// /// /// public string ReadLine(bool blocking) { string data = ""; if (blocking) { // block till the queue has data, but bail out on connection error while (IsConnected && !IsConnectionError && _ReadThread.Queue.Count == 0) { _ReadThread.QueuedEvent.WaitOne(); } } if (IsConnected && _ReadThread.Queue.Count > 0) { data = (string)(_ReadThread.Queue.Dequeue()); } if (data != null && data.Length > 0) { #if LOG4NET Logger.Queue.Debug("read: \""+data+"\""); #endif if (OnReadLine != null) { OnReadLine(this, new ReadLineEventArgs(data)); } } if (IsConnectionError && !IsDisconnecting && OnConnectionError != null) { OnConnectionError(this, EventArgs.Empty); } return data; } /// /// /// /// /// public void WriteLine(string data, Priority priority) { if (priority == Priority.Critical) { if (!IsConnected) { throw new NotConnectedException(); } _WriteLine(data); } else { ((Queue)_SendBuffer[priority]).Enqueue(data); _WriteThread.QueuedEvent.Set(); } } /// /// /// /// public void WriteLine(string data) { WriteLine(data, Priority.Medium); } private bool _WriteLine(string data) { if (IsConnected) { try { lock (_Writer) { _Writer.Write(data + "\r\n"); _Writer.Flush(); } } catch (IOException) { #if LOG4NET Logger.Socket.Warn("sending data failed, connection lost"); #endif IsConnectionError = true; return false; } catch (ObjectDisposedException) { #if LOG4NET Logger.Socket.Warn("sending data failed (stream error), connection lost"); #endif IsConnectionError = true; return false; } #if LOG4NET Logger.Socket.Debug("sent: \""+data+"\""); #endif if (OnWriteLine != null) { OnWriteLine(this, new WriteLineEventArgs(data)); } return true; } return false; } private void _NextAddress() { _CurrentAddress++; if (_CurrentAddress >= _AddressList.Length) { _CurrentAddress = 0; } #if LOG4NET Logger.Connection.Info("set server to: "+Address); #endif } private void _SimpleParser(object sender, ReadLineEventArgs args) { string rawline = args.Line; string[] rawlineex = rawline.Split(new char[] {' '}); string line = null; string prefix = null; string command = null; if (rawline[0] == ':') { prefix = rawlineex[0].Substring(1); line = rawline.Substring(prefix.Length + 2); } else { line = rawline; } string[] lineex = line.Split(new char[] {' '}); command = lineex[0]; ReplyCode replycode = ReplyCode.Null; int intReplycode; if (Int32.TryParse(command, out intReplycode)) { replycode = (ReplyCode) intReplycode; } if (replycode != ReplyCode.Null) { switch (replycode) { case ReplyCode.Welcome: _IsRegistered = true; #if LOG4NET Logger.Connection.Info("logged in"); #endif break; } } else { switch (command) { case "ERROR": // FIXME: handle server errors differently than connection errors! //IsConnectionError = true; break; case "PONG": PingStopwatch.Stop(); NextPingStopwatch.Reset(); NextPingStopwatch.Start(); #if LOG4NET Logger.Connection.Debug("PONG received, took: " + PingStopwatch.ElapsedMilliseconds + " ms"); #endif break; } } } private void _OnConnectionError(object sender, EventArgs e) { try { if (AutoReconnect) { // prevent connect -> exception -> connect flood loop Thread.Sleep(AutoRetryDelay * 1000); // lets try to recover the connection Reconnect(); } else { // make sure we clean up Disconnect(); } } catch (ConnectionException) { } } /// /// /// private class ReadThread { #if LOG4NET private static readonly log4net.ILog _Logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #endif private IrcConnection _Connection; private Thread _Thread; private Queue _Queue = Queue.Synchronized(new Queue()); public AutoResetEvent QueuedEvent; public Queue Queue { get { return _Queue; } } /// /// /// /// public ReadThread(IrcConnection connection) { _Connection = connection; QueuedEvent = new AutoResetEvent(false); } /// /// /// public void Start() { _Thread = new Thread(new ThreadStart(_Worker)); _Thread.Name = "ReadThread ("+_Connection.Address+":"+_Connection.Port+")"; _Thread.IsBackground = true; _Thread.Start(); } /// /// /// public void Stop() { #if LOG4NET _Logger.Debug("Stop()"); #endif #if LOG4NET _Logger.Debug("Stop(): aborting thread..."); #endif _Thread.Abort(); // make sure we close the stream after the thread is gone, else // the thread will think the connection is broken! #if LOG4NET _Logger.Debug("Stop(): joining thread..."); #endif _Thread.Join(); #if LOG4NET _Logger.Debug("Stop(): closing reader..."); #endif try { _Connection._Reader.Close(); } catch (ObjectDisposedException) { } // clean up our receive queue else we continue processing old // messages when the read thread is restarted! _Queue.Clear(); } private void _Worker() { #if LOG4NET Logger.Socket.Debug("ReadThread started"); #endif try { string data = ""; try { while (_Connection.IsConnected && ((data = _Connection._Reader.ReadLine()) != null)) { _Queue.Enqueue(data); QueuedEvent.Set(); #if LOG4NET Logger.Socket.Debug("received: \""+data+"\""); #endif } } catch (IOException e) { #if LOG4NET Logger.Socket.Warn("IOException: "+e.Message); #endif } finally { #if LOG4NET Logger.Socket.Warn("connection lost"); #endif // only flag this as connection error if we are not // cleanly disconnecting if (!_Connection.IsDisconnecting) { _Connection.IsConnectionError = true; } } } catch (ThreadAbortException) { Thread.ResetAbort(); #if LOG4NET Logger.Socket.Debug("ReadThread aborted"); #endif } catch (Exception ex) { #if LOG4NET Logger.Socket.Error(ex); #endif } } } /// /// /// private class WriteThread { private IrcConnection _Connection; private Thread _Thread; private int _HighCount; private int _AboveMediumCount; private int _MediumCount; private int _BelowMediumCount; private int _LowCount; private int _AboveMediumSentCount; private int _MediumSentCount; private int _BelowMediumSentCount; private int _AboveMediumThresholdCount = 4; private int _MediumThresholdCount = 2; private int _BelowMediumThresholdCount = 1; private int _BurstCount; public AutoResetEvent QueuedEvent; /// /// /// /// public WriteThread(IrcConnection connection) { _Connection = connection; QueuedEvent = new AutoResetEvent(false); } /// /// /// public void Start() { _Thread = new Thread(new ThreadStart(_Worker)); _Thread.Name = "WriteThread ("+_Connection.Address+":"+_Connection.Port+")"; _Thread.IsBackground = true; _Thread.Start(); } /// /// /// public void Stop() { #if LOG4NET Logger.Connection.Debug("Stopping WriteThread..."); #endif _Thread.Abort(); // make sure we close the stream after the thread is gone, else // the thread will think the connection is broken! _Thread.Join(); try { _Connection._Writer.Close(); } catch (ObjectDisposedException) { } } private void _Worker() { #if LOG4NET Logger.Socket.Debug("WriteThread started"); #endif try { try { while (_Connection.IsConnected) { QueuedEvent.WaitOne(); var isBufferEmpty = false; do { isBufferEmpty = _CheckBuffer() == 0; Thread.Sleep(_Connection._SendDelay); } while (!isBufferEmpty); } } catch (IOException e) { #if LOG4NET Logger.Socket.Warn("IOException: " + e.Message); #endif } finally { #if LOG4NET Logger.Socket.Warn("connection lost"); #endif // only flag this as connection error if we are not // cleanly disconnecting if (!_Connection.IsDisconnecting) { _Connection.IsConnectionError = true; } } } catch (ThreadAbortException) { Thread.ResetAbort(); #if LOG4NET Logger.Socket.Debug("WriteThread aborted"); #endif } catch (Exception ex) { #if LOG4NET Logger.Socket.Error(ex); #endif } } #region WARNING: complex scheduler, don't even think about changing it! // WARNING: complex scheduler, don't even think about changing it! private int _CheckBuffer() { _HighCount = ((Queue)_Connection._SendBuffer[Priority.High]).Count; _AboveMediumCount = ((Queue)_Connection._SendBuffer[Priority.AboveMedium]).Count; _MediumCount = ((Queue)_Connection._SendBuffer[Priority.Medium]).Count; _BelowMediumCount = ((Queue)_Connection._SendBuffer[Priority.BelowMedium]).Count; _LowCount = ((Queue)_Connection._SendBuffer[Priority.Low]).Count; var msgCount = _HighCount + _AboveMediumCount + _MediumCount + _BelowMediumCount + _LowCount; // only send data if we are succefully registered on the IRC network if (!_Connection._IsRegistered) { return msgCount; } if (_CheckHighBuffer() && _CheckAboveMediumBuffer() && _CheckMediumBuffer() && _CheckBelowMediumBuffer() && _CheckLowBuffer()) { // everything is sent, resetting all counters _AboveMediumSentCount = 0; _MediumSentCount = 0; _BelowMediumSentCount = 0; _BurstCount = 0; } if (_BurstCount < 3) { _BurstCount++; //_CheckBuffer(); } return msgCount; } private bool _CheckHighBuffer() { if (_HighCount > 0) { string data = (string)((Queue)_Connection._SendBuffer[Priority.High]).Dequeue(); if (_Connection._WriteLine(data) == false) { #if LOG4NET Logger.Queue.Warn("Sending data was not sucessful, data is requeued!"); #endif ((Queue)_Connection._SendBuffer[Priority.High]).Enqueue(data); return false; } if (_HighCount > 1) { // there is more data to send return false; } } return true; } private bool _CheckAboveMediumBuffer() { if ((_AboveMediumCount > 0) && (_AboveMediumSentCount < _AboveMediumThresholdCount)) { string data = (string)((Queue)_Connection._SendBuffer[Priority.AboveMedium]).Dequeue(); if (_Connection._WriteLine(data) == false) { #if LOG4NET Logger.Queue.Warn("Sending data was not sucessful, data is requeued!"); #endif ((Queue)_Connection._SendBuffer[Priority.AboveMedium]).Enqueue(data); return false; } _AboveMediumSentCount++; if (_AboveMediumSentCount < _AboveMediumThresholdCount) { return false; } } return true; } private bool _CheckMediumBuffer() { if ((_MediumCount > 0) && (_MediumSentCount < _MediumThresholdCount)) { string data = (string)((Queue)_Connection._SendBuffer[Priority.Medium]).Dequeue(); if (_Connection._WriteLine(data) == false) { #if LOG4NET Logger.Queue.Warn("Sending data was not sucessful, data is requeued!"); #endif ((Queue)_Connection._SendBuffer[Priority.Medium]).Enqueue(data); return false; } _MediumSentCount++; if (_MediumSentCount < _MediumThresholdCount) { return false; } } return true; } private bool _CheckBelowMediumBuffer() { if ((_BelowMediumCount > 0) && (_BelowMediumSentCount < _BelowMediumThresholdCount)) { string data = (string)((Queue)_Connection._SendBuffer[Priority.BelowMedium]).Dequeue(); if (_Connection._WriteLine(data) == false) { #if LOG4NET Logger.Queue.Warn("Sending data was not sucessful, data is requeued!"); #endif ((Queue)_Connection._SendBuffer[Priority.BelowMedium]).Enqueue(data); return false; } _BelowMediumSentCount++; if (_BelowMediumSentCount < _BelowMediumThresholdCount) { return false; } } return true; } private bool _CheckLowBuffer() { if (_LowCount > 0) { if ((_HighCount > 0) || (_AboveMediumCount > 0) || (_MediumCount > 0) || (_BelowMediumCount > 0)) { return true; } string data = (string)((Queue)_Connection._SendBuffer[Priority.Low]).Dequeue(); if (_Connection._WriteLine(data) == false) { #if LOG4NET Logger.Queue.Warn("Sending data was not sucessful, data is requeued!"); #endif ((Queue)_Connection._SendBuffer[Priority.Low]).Enqueue(data); return false; } if (_LowCount > 1) { return false; } } return true; } // END OF WARNING, below this you can read/change again ;) #endregion } /// /// /// private class IdleWorkerThread { private IrcConnection _Connection; private Thread _Thread; /// /// /// /// public IdleWorkerThread(IrcConnection connection) { _Connection = connection; } /// /// /// public void Start() { _Connection.PingStopwatch.Reset(); _Connection.NextPingStopwatch.Reset(); _Connection.NextPingStopwatch.Start(); _Thread = new Thread(new ThreadStart(_Worker)); _Thread.Name = "IdleWorkerThread ("+_Connection.Address+":"+_Connection.Port+")"; _Thread.IsBackground = true; _Thread.Start(); } /// /// /// public void Stop() { _Thread.Abort(); _Thread.Join(); } private void _Worker() { #if LOG4NET Logger.Socket.Debug("IdleWorkerThread started"); #endif try { while (_Connection.IsConnected ) { Thread.Sleep(_Connection._IdleWorkerInterval * 1000); // only send active pings if we are registered if (!_Connection.IsRegistered) { continue; } int last_ping_sent = (int)_Connection.PingStopwatch.Elapsed.TotalSeconds; int last_pong_rcvd = (int)_Connection.NextPingStopwatch.Elapsed.TotalSeconds; // determins if the resoponse time is ok if (last_ping_sent < _Connection._PingTimeout) { if (_Connection.PingStopwatch.IsRunning) { // there is a pending ping request, we have to wait continue; } // determines if it need to send another ping yet if (last_pong_rcvd > _Connection._PingInterval) { _Connection.NextPingStopwatch.Stop(); _Connection.PingStopwatch.Reset(); _Connection.PingStopwatch.Start(); _Connection.WriteLine(Rfc2812.Ping(_Connection.Address), Priority.Critical); } // else connection is fine, just continue } else { if (_Connection.IsDisconnecting) { break; } #if LOG4NET Logger.Socket.Warn("ping timeout, connection lost"); #endif // only flag this as connection error if we are not // cleanly disconnecting _Connection.IsConnectionError = true; break; } } } catch (ThreadAbortException) { Thread.ResetAbort(); #if LOG4NET Logger.Socket.Debug("IdleWorkerThread aborted"); #endif } catch (Exception ex) { #if LOG4NET Logger.Socket.Error(ex); #endif } } } } } smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/PrimaryOrFallbackEncoding.cs0000664000175000017500000001065613014002107027267 0ustar00meebeymeebey00000000000000/* * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2013 Ondřej Hošek * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Text; namespace Meebey.SmartIrc4net { internal class PrimaryOrFallbackEncoding : Encoding { public Encoding PrimaryEncoding { get; private set; } public Encoding FallbackEncoding { get; private set; } public PrimaryOrFallbackEncoding(Encoding primary, Encoding fallback) { try { PrimaryEncoding = Encoding.GetEncoding(primary.WebName, new EncoderExceptionFallback(), new DecoderExceptionFallback()); } catch (ArgumentException) { // probably not a standard encoding; check if it's throw-exception if (!(primary.EncoderFallback is EncoderExceptionFallback)) { throw new System.ArgumentException("a custom primary encoding's encoder fallback must be an EncoderExceptionFallback"); } if (!(primary.DecoderFallback is DecoderExceptionFallback)) { throw new System.ArgumentException("a custom primary encoding's decoder fallback must be a DecoderExceptionFallback"); } } FallbackEncoding = fallback; } public override int GetByteCount(char[] chars, int index, int count) { try { return PrimaryEncoding.GetByteCount(chars, index, count); } catch (EncoderFallbackException) { return FallbackEncoding.GetByteCount(chars, index, count); } } public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) { try { return PrimaryEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex); } catch (EncoderFallbackException) { return FallbackEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex); } } public override int GetCharCount(byte[] bytes, int index, int count) { try { return PrimaryEncoding.GetCharCount(bytes, index, count); } catch (DecoderFallbackException) { return FallbackEncoding.GetCharCount(bytes, index, count); } } public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { try { return PrimaryEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex); } catch (DecoderFallbackException) { return FallbackEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex); } } public override int GetMaxByteCount(int charCount) { try { int pri = PrimaryEncoding.GetMaxByteCount(charCount); int fab = FallbackEncoding.GetMaxByteCount(charCount); return Math.Max(pri, fab); } catch (EncoderFallbackException) { return FallbackEncoding.GetMaxByteCount(charCount); } } public override int GetMaxCharCount(int byteCount) { try { int pri = PrimaryEncoding.GetMaxCharCount(byteCount); int fab = FallbackEncoding.GetMaxCharCount(byteCount); return Math.Max(pri, fab); } catch (DecoderFallbackException) { return FallbackEncoding.GetMaxCharCount(byteCount); } } public override byte[] GetPreamble() { return PrimaryEncoding.GetPreamble(); } } } smuxi-1.1/lib/SmartIrc4net/src/IrcConnection/IrcProperties.cs0000664000175000017500000000304713014002107025042 0ustar00meebeymeebey00000000000000/* * $Id: IrcConnection.cs 208 2006-01-28 17:11:59Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smartirc/SmartIrc4net/trunk/src/IrcConnection/IrcConnection.cs $ * $Rev: 208 $ * $Author: meebey $ * $Date: 2006-01-28 18:11:59 +0100 (Sat, 28 Jan 2006) $ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.IO; using System.Text; using System.Collections; using System.Threading; using System.Reflection; using System.Net.Sockets; namespace Meebey.SmartIrc4net { /// /// /// /// /* public class IrcProperties { } */ } smuxi-1.1/lib/SmartIrc4net/src/Consts.cs0000664000175000017500000002050113014002107020756 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { /// /// /// public enum Priority { Low, BelowMedium, Medium, AboveMedium, High, Critical } /// /// /// public enum SendType { Message, Action, Notice, CtcpReply, CtcpRequest } /// /// /// public enum ReceiveType { Info, Login, Motd, List, Join, Kick, Part, Invite, Quit, Who, WhoIs, WhoWas, Name, Topic, BanList, NickChange, TopicChange, UserMode, UserModeChange, ChannelMode, ChannelModeChange, ChannelMessage, ChannelAction, ChannelNotice, QueryMessage, QueryAction, QueryNotice, CtcpReply, CtcpRequest, Error, ErrorMessage, Unknown } /// /// /// public enum ReplyCode: int { Null = 000, Welcome = 001, YourHost = 002, Created = 003, MyInfo = 004, Bounce = 005, TraceLink = 200, TraceConnecting = 201, TraceHandshake = 202, TraceUnknown = 203, TraceOperator = 204, TraceUser = 205, TraceServer = 206, TraceService = 207, TraceNewType = 208, TraceClass = 209, TraceReconnect = 210, StatsLinkInfo = 211, StatsCommands = 212, EndOfStats = 219, UserModeIs = 221, ServiceList = 234, ServiceListEnd = 235, StatsUptime = 242, StatsOLine = 243, LuserClient = 251, LuserOp = 252, LuserUnknown = 253, LuserChannels = 254, LuserMe = 255, AdminMe = 256, AdminLocation1 = 257, AdminLocation2 = 258, AdminEmail = 259, TraceLog = 261, TraceEnd = 262, TryAgain = 263, Away = 301, UserHost = 302, IsOn = 303, UnAway = 305, NowAway = 306, WhoIsUser = 311, WhoIsServer = 312, WhoIsOperator = 313, WhoWasUser = 314, EndOfWho = 315, WhoIsIdle = 317, EndOfWhoIs = 318, WhoIsChannels = 319, ListStart = 321, List = 322, ListEnd = 323, ChannelModeIs = 324, UniqueOpIs = 325, NoTopic = 331, Topic = 332, Inviting = 341, Summoning = 342, InviteList = 346, EndOfInviteList = 347, ExceptionList = 348, EndOfExceptionList = 349, Version = 351, WhoReply = 352, NamesReply = 353, Links = 364, EndOfLinks = 365, EndOfNames = 366, BanList = 367, EndOfBanList = 368, EndOfWhoWas = 369, Info = 371, Motd = 372, EndOfInfo = 374, MotdStart = 375, EndOfMotd = 376, YouAreOper = 381, Rehashing = 382, YouAreService = 383, Time = 391, UsersStart = 392, Users = 393, EndOfUsers = 394, NoUsers = 395, ErrorNoSuchNickname = 401, ErrorNoSuchServer = 402, ErrorNoSuchChannel = 403, ErrorCannotSendToChannel = 404, ErrorTooManyChannels = 405, ErrorWasNoSuchNickname = 406, ErrorTooManyTargets = 407, ErrorNoSuchService = 408, ErrorNoOrigin = 409, ErrorNoRecipient = 411, ErrorNoTextToSend = 412, ErrorNoTopLevel = 413, ErrorWildTopLevel = 414, ErrorBadMask = 415, ErrorUnknownCommand = 421, ErrorNoMotd = 422, ErrorNoAdminInfo = 423, ErrorFileError = 424, ErrorNoNicknameGiven = 431, ErrorErroneusNickname = 432, ErrorNicknameInUse = 433, ErrorNicknameCollision = 436, ErrorUnavailableResource = 437, ErrorUserNotInChannel = 441, ErrorNotOnChannel = 442, ErrorUserOnChannel = 443, ErrorNoLogin = 444, ErrorSummonDisabled = 445, ErrorUsersDisabled = 446, ErrorNotRegistered = 451, ErrorNeedMoreParams = 461, ErrorAlreadyRegistered = 462, ErrorNoPermissionForHost = 463, ErrorPasswordMismatch = 464, ErrorYouAreBannedCreep = 465, ErrorYouWillBeBanned = 466, ErrorKeySet = 467, ErrorChannelIsFull = 471, ErrorUnknownMode = 472, ErrorInviteOnlyChannel = 473, ErrorBannedFromChannel = 474, ErrorBadChannelKey = 475, ErrorBadChannelMask = 476, ErrorNoChannelModes = 477, ErrorBanListFull = 478, ErrorNoPrivileges = 481, ErrorChannelOpPrivilegesNeeded = 482, ErrorCannotKillServer = 483, ErrorRestricted = 484, ErrorUniqueOpPrivilegesNeeded = 485, ErrorNoOperHost = 491, ErrorUserModeUnknownFlag = 501, ErrorUsersDoNotMatch = 502 } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/0000755000175000017500000000000014011526500022306 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/EventArgs/0000755000175000017500000000000012253423361024213 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/EventArgs/CreateConnectionAsyncCompletedEventArgs.cs0000644000175000017500000000446712253423361034452 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Net.Sockets; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Event arguments class for the EncryptAsyncCompleted event. /// public class CreateConnectionAsyncCompletedEventArgs : AsyncCompletedEventArgs { private TcpClient _proxyConnection; /// /// Constructor. /// /// Exception information generated by the event. /// Cancelled event flag. This flag is set to true if the event was cancelled. /// Proxy Connection. The initialized and open TcpClient proxy connection. public CreateConnectionAsyncCompletedEventArgs(Exception error, bool cancelled, TcpClient proxyConnection) : base(error, cancelled, null) { _proxyConnection = proxyConnection; } /// /// The proxy connection. /// public TcpClient ProxyConnection { get { return _proxyConnection; } } } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/Exceptions/0000755000175000017500000000000012253423361024436 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/Exceptions/ProxyException.cs0000644000175000017500000000475012253423361027773 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Runtime.Serialization; namespace Starksoft.Net.Proxy { /// /// This exception is thrown when a general, unexpected proxy error. /// [Serializable()] public class ProxyException : Exception { /// /// Constructor. /// public ProxyException() { } /// /// Constructor. /// /// Exception message text. public ProxyException(string message) : base(message) { } /// /// Constructor. /// /// Exception message text. /// The inner exception object. public ProxyException(string message, Exception innerException) : base(message, innerException) { } /// /// Constructor. /// /// Serialization information. /// Stream context information. protected ProxyException(SerializationInfo info, StreamingContext context) : base(info, context) { } } }smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/Socks4aProxyClient.cs0000644000175000017500000002571212253423361026363 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace Starksoft.Net.Proxy { /// /// Socks4a connection proxy class. This class implements the Socks4a standard proxy protocol /// which is an extension of the Socks4 protocol /// /// /// In Socks version 4A if the client cannot resolve the destination host's domain name /// to find its IP address the server will attempt to resolve it. /// public class Socks4aProxyClient : Socks4ProxyClient { private const string PROXY_NAME = "SOCKS4a"; /// /// Default constructor. /// public Socks4aProxyClient() : base() { } /// /// Creates a Socks4 proxy client object using the supplied TcpClient object connection. /// /// An open TcpClient object with an established connection. public Socks4aProxyClient(TcpClient tcpClient) : base(tcpClient) { } /// /// Create a Socks4a proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy user identification information for an IDENTD server. public Socks4aProxyClient(string proxyHost, string proxyUserId) : base(proxyHost, proxyUserId) { } /// /// Create a Socks4a proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy user identification information. public Socks4aProxyClient(string proxyHost, int proxyPort, string proxyUserId) : base(proxyHost, proxyPort, proxyUserId) { } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks4aProxyClient(string proxyHost) : base(proxyHost) { } /// /// Create a Socks4a proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks4aProxyClient(string proxyHost, int proxyPort) : base(proxyHost, proxyPort) { } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS4a' public override string ProxyName { get { return PROXY_NAME; } } /// /// Sends a command to the proxy server. /// /// Proxy server data stream. /// Proxy byte command to execute. /// Destination host name or IP address. /// Destination port number /// IDENTD user ID value. /// /// This method override the SendCommand message in the Sock4ProxyClient object. The override adds support for the /// Socks4a extensions which allow the proxy client to optionally command the proxy server to resolve the /// destination host IP address. /// internal override void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId) { // PROXY SERVER REQUEST //Please read SOCKS4.protocol first for an description of the version 4 //protocol. This extension is intended to allow the use of SOCKS on hosts //which are not capable of resolving all domain names. // //In version 4, the client sends the following packet to the SOCKS server //to request a CONNECT or a BIND operation: // // +----+----+----+----+----+----+----+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+ // # of bytes: 1 1 2 4 variable 1 // //VN is the SOCKS protocol version number and should be 4. CD is the //SOCKS command code and should be 1 for CONNECT or 2 for BIND. NULL //is a byte of all zero bits. // //For version 4A, if the client cannot resolve the destination host's //domain name to find its IP address, it should set the first three bytes //of DSTIP to NULL and the last byte to a non-zero value. (This corresponds //to IP address 0.0.0.x, with x nonzero. As decreed by IANA -- The //Internet Assigned Numbers Authority -- such an address is inadmissible //as a destination IP address and thus should never occur if the client //can resolve the domain name.) Following the NULL byte terminating //USERID, the client must sends the destination domain name and termiantes //it with another NULL byte. This is used for both CONNECT and BIND requests. // //A server using protocol 4A must check the DSTIP in the request packet. //If it represent address 0.0.0.x with nonzero x, the server must read //in the domain name that the client sends in the packet. The server //should resolve the domain name and make connection to the destination //host if it can. // //SOCKSified sockd may pass domain names that it cannot resolve to //the next-hop SOCKS server. // userId needs to be a zero length string so that the GetBytes method // works properly if (userId == null) userId = ""; byte[] destIp = {0,0,0,1}; // build the invalid ip address as specified in the 4a protocol byte[] destPort = GetDestinationPortBytes(destinationPort); byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId); byte[] hostBytes = ASCIIEncoding.ASCII.GetBytes(destinationHost); byte[] request = new byte[10 + userIdBytes.Length + hostBytes.Length]; // set the bits on the request byte array request[0] = SOCKS4_VERSION_NUMBER; request[1] = command; destPort.CopyTo(request, 2); destIp.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); // copy the userid to the request byte array request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId hostBytes.CopyTo(request, 9 + userIdBytes.Length); // copy the host name to the request byte array request[9 + userIdBytes.Length + hostBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId // send the connect request proxy.Write(request, 0, request.Length); // wait for the proxy server to send a response base.WaitForData(proxy); // PROXY SERVER RESPONSE // The SOCKS server checks to see whether such a request should be granted // based on any combination of source IP address, destination IP address, // destination port number, the userid, and information it may obtain by // consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS // server makes a connection to the specified port of the destination host. // A reply packet is sent to the client when this connection is established, // or when the request is rejected or the operation fails. // // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // # of bytes: 1 1 2 4 // // VN is the version of the reply code and should be 0. CD is the result // code with one of the following values: // // 90: request granted // 91: request rejected or failed // 92: request rejected becuase SOCKS server cannot connect to // identd on the client // 93: request rejected because the client program and identd // report different user-ids // // The remaining fields are ignored. // // The SOCKS server closes its connection immediately after notifying // the client of a failed or rejected request. For a successful request, // the SOCKS server gets ready to relay traffic on both directions. This // enables the client to do I/O on its connection as if it were directly // connected to the application server. // create an 8 byte response array byte[] response = new byte[8]; // read the resonse from the network stream proxy.Read(response, 0, 8); // evaluate the reply code for an error condition if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED) HandleProxyCommandError(response, destinationHost, destinationPort); } } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/.travis.yml0000644000175000017500000000062512253423361024431 0ustar00meebeymeebey00000000000000language: c install: - sudo apt-get update > /dev/null - sudo apt-get install mono-devel > /dev/null script: - xbuild StarkSoftProxy.csproj notifications: irc: channels: "irc.oftc.net#smuxi-devel" skip_join: true template: - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" - "Build details : %{build_url}" smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/StarkSoftProxy.csproj0000644000175000017500000000405712253423361026527 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {3F8CF2C1-EA37-444F-8693-A3A00B1131D2} Library StarkSoftProxy StarkSoftProxy true full false bin\Debug DEBUG; prompt 4 false none false bin\Release prompt 4 false smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/ProxyClientFactory.cs0000644000175000017500000002113412253423361026455 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace Starksoft.Net.Proxy { /// /// The type of proxy. /// public enum ProxyType { /// /// No Proxy specified. Note this option will cause an exception to be thrown if used to create a proxy object by the factory. /// None, /// /// HTTP Proxy /// Http, /// /// SOCKS v4 Proxy /// Socks4, /// /// SOCKS v4a Proxy /// Socks4a, /// /// SOCKS v5 Proxy /// Socks5 } /// /// Factory class for creating new proxy client objects. /// /// /// /// // create an instance of the client proxy factory /// ProxyClientFactory factory = new ProxyClientFactory(); /// /// // use the proxy client factory to generically specify the type of proxy to create /// // the proxy factory method CreateProxyClient returns an IProxyClient object /// IProxyClient proxy = factory.CreateProxyClient(ProxyType.Http, "localhost", 6588); /// /// // create a connection through the proxy to www.starksoft.com over port 80 /// System.Net.Sockets.TcpClient tcpClient = proxy.CreateConnection("www.starksoft.com", 80); /// /// public class ProxyClientFactory { /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(); case ProxyType.Socks4: return new Socks4ProxyClient(); case ProxyType.Socks4a: return new Socks4aProxyClient(); case ProxyType.Socks5: return new Socks5ProxyClient(); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects using an existing TcpClient connection object. /// /// The type of proxy client to create. /// Open TcpClient object. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, TcpClient tcpClient) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(tcpClient); case ProxyType.Socks4: return new Socks4ProxyClient(tcpClient); case ProxyType.Socks4a: return new Socks4aProxyClient(tcpClient); case ProxyType.Socks5: return new Socks5ProxyClient(tcpClient); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// The proxy host or IP address. /// The proxy port number. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, string proxyHost, int proxyPort) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(proxyHost, proxyPort); case ProxyType.Socks4: return new Socks4ProxyClient(proxyHost, proxyPort); case ProxyType.Socks4a: return new Socks4aProxyClient(proxyHost, proxyPort); case ProxyType.Socks5: return new Socks5ProxyClient(proxyHost, proxyPort); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// The proxy host or IP address. /// The proxy port number. /// The proxy username. This parameter is only used by Socks4 and Socks5 proxy objects. /// The proxy user password. This parameter is only used Socks5 proxy objects. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, string proxyHost, int proxyPort, string proxyUsername, string proxyPassword) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(proxyHost, proxyPort); case ProxyType.Socks4: return new Socks4ProxyClient(proxyHost, proxyPort, proxyUsername); case ProxyType.Socks4a: return new Socks4aProxyClient(proxyHost, proxyPort, proxyUsername); case ProxyType.Socks5: return new Socks5ProxyClient(proxyHost, proxyPort, proxyUsername, proxyPassword); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// Open TcpClient object. /// The proxy host or IP address. /// The proxy port number. /// The proxy username. This parameter is only used by Socks4 and Socks5 proxy objects. /// The proxy user password. This parameter is only used Socks5 proxy objects. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, TcpClient tcpClient, string proxyHost, int proxyPort, string proxyUsername, string proxyPassword) { IProxyClient c = CreateProxyClient(type, proxyHost, proxyPort, proxyUsername, proxyPassword); c.TcpClient = tcpClient; return c; } } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/HttpProxyClient.cs0000644000175000017500000004343512253423361025775 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net.Sockets; using System.Threading; using System.Globalization; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// HTTP connection proxy class. This class implements the HTTP standard proxy protocol. /// /// You can use this class to set up a connection to an HTTP proxy server. Calling the /// CreateConnection() method initiates the proxy connection and returns a standard /// System.Net.Socks.TcpClient object that can be used as normal. The proxy plumbing /// is all handled for you. /// /// /// /// /// public class HttpProxyClient : IProxyClient { private string _proxyHost; private int _proxyPort; private HttpResponseCodes _respCode; private string _respText; private TcpClient _tcpClient; private const int HTTP_PROXY_DEFAULT_PORT = 8080; private const string HTTP_PROXY_CONNECT_CMD = "CONNECT {0}:{1} HTTP/1.0\r\nHost: {0}:{1}\r\n\r\n"; private const int WAIT_FOR_DATA_INTERVAL = 50; // 50 ms private const int WAIT_FOR_DATA_TIMEOUT = 15000; // 15 seconds private const string PROXY_NAME = "HTTP"; private enum HttpResponseCodes { None = 0, Continue = 100, SwitchingProtocols = 101, OK = 200, Created = 201, Accepted = 202, NonAuthoritiveInformation = 203, NoContent = 204, ResetContent = 205, PartialContent = 206, MultipleChoices = 300, MovedPermanetly = 301, Found = 302, SeeOther = 303, NotModified = 304, UserProxy = 305, TemporaryRedirect = 307, BadRequest = 400, Unauthorized = 401, PaymentRequired = 402, Forbidden = 403, NotFound = 404, MethodNotAllowed = 405, NotAcceptable = 406, ProxyAuthenticantionRequired = 407, RequestTimeout = 408, Conflict = 409, Gone = 410, PreconditionFailed = 411, RequestEntityTooLarge = 413, RequestURITooLong = 414, UnsupportedMediaType = 415, RequestedRangeNotSatisfied = 416, ExpectationFailed = 417, InternalServerError = 500, NotImplemented = 501, BadGateway = 502, ServiceUnavailable = 503, GatewayTimeout = 504, HTTPVersionNotSupported = 505 } /// /// Constructor. /// public HttpProxyClient() { } /// /// Creates a HTTP proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public HttpProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Constructor. The default HTTP proxy port 8080 is used. /// /// Host name or IP address of the proxy. public HttpProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = HTTP_PROXY_DEFAULT_PORT; } /// /// Constructor. /// /// Host name or IP address of the proxy server. /// Port number for the proxy server. public HttpProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port number for the proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'HTTP' public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // send connection command to proxy host for the specified destination host and port SendConnectionCommand(destinationHost, destinationPort); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (SocketException ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } private void SendConnectionCommand(string host, int port) { NetworkStream stream = _tcpClient.GetStream(); // PROXY SERVER REQUEST // ======================================================================= //CONNECT starksoft.com:443 HTTP/1.0 //HOST starksoft.com:443 //[... other HTTP header lines ending with if required]> // // Last Empty Line string connectCmd = String.Format(CultureInfo.InvariantCulture, HTTP_PROXY_CONNECT_CMD, host, port.ToString(CultureInfo.InvariantCulture)); byte[] request = ASCIIEncoding.ASCII.GetBytes(connectCmd); // send the connect request stream.Write(request, 0, request.Length); // wait for the proxy server to respond WaitForData(stream); // PROXY SERVER RESPONSE // ======================================================================= //HTTP/1.0 200 Connection Established //[.... other HTTP header lines ending with .. //ignore all of them] // // Last Empty Line // create an byte response array byte[] response = new byte[_tcpClient.ReceiveBufferSize]; StringBuilder sbuilder = new StringBuilder(); int bytes = 0; long total = 0; do { bytes = stream.Read(response, 0, _tcpClient.ReceiveBufferSize); total += bytes; sbuilder.Append(System.Text.ASCIIEncoding.UTF8.GetString(response, 0, bytes)); } while (stream.DataAvailable); ParseResponse(sbuilder.ToString()); // evaluate the reply code for an error condition if (_respCode != HttpResponseCodes.OK) HandleProxyCommandError(host, port); } private void HandleProxyCommandError(string host, int port) { string msg; switch (_respCode) { case HttpResponseCodes.None: msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} failed to return a recognized HTTP response code. Server response: {2}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), _respText); break; case HttpResponseCodes.BadGateway: //HTTP/1.1 502 Proxy Error (The specified Secure Sockets Layer (SSL) port is not allowed. ISA Server is not configured to allow SSL requests from this port. Most Web browsers use port 443 for SSL requests.) msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} responded with a 502 code - Bad Gateway. If you are connecting to a Microsoft ISA destination please refer to knowledge based article Q283284 for more information. Server response: {2}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), _respText); break; default: msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} responded with a {2} code - {3}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), ((int)_respCode).ToString(CultureInfo.InvariantCulture), _respText); break; } // throw a new application exception throw new ProxyException(msg); } private void WaitForData(NetworkStream stream) { int sleepTime = 0; while (!stream.DataAvailable) { Thread.Sleep(WAIT_FOR_DATA_INTERVAL); sleepTime += WAIT_FOR_DATA_INTERVAL; if (sleepTime > WAIT_FOR_DATA_TIMEOUT) throw new ProxyException(String.Format("A timeout while waiting for the proxy server at {0} on port {1} to respond.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient) )); } } private void ParseResponse(string response) { string[] data = null; // get rid of the LF character if it exists and then split the string on all CR data = response.Replace('\n', ' ').Split('\r'); ParseCodeAndText(data[0]); } private void ParseCodeAndText(string line) { int begin = 0; int end = 0; string val = null; if (line.IndexOf("HTTP") == -1) throw new ProxyException(String.Format("No HTTP response received from proxy destination. Server response: {0}.", line)); begin = line.IndexOf(" ") + 1; end = line.IndexOf(" ", begin); val = line.Substring(begin, end - begin); Int32 code = 0; if (!Int32.TryParse(val, out code)) throw new ProxyException(String.Format("An invalid response code was received from proxy destination. Server response: {0}.", line)); _respCode = (HttpResponseCodes)code; _respText = line.Substring(end + 1).Trim(); } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The HttpProxy object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/Utils.cs0000644000175000017500000000174512253423361023753 0ustar00meebeymeebey00000000000000using System; using System.Text; using System.Globalization; using System.Net.Sockets; namespace Starksoft.Net.Proxy { internal static class Utils { internal static string GetHost(TcpClient client) { if (client == null) throw new ArgumentNullException("client"); string host = ""; try { host = ((System.Net.IPEndPoint)client.Client.RemoteEndPoint).Address.ToString(); } catch { }; return host; } internal static string GetPort(TcpClient client) { if (client == null) throw new ArgumentNullException("client"); string port = ""; try { port = ((System.Net.IPEndPoint)client.Client.RemoteEndPoint).Port.ToString(CultureInfo.InvariantCulture); } catch { }; return port; } } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/Socks4ProxyClient.cs0000644000175000017500000006030612253423361026220 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Globalization; using System.IO; using System.Threading; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Socks4 connection proxy class. This class implements the Socks4 standard proxy protocol. /// /// /// This class implements the Socks4 proxy protocol standard for TCP communciations. /// public class Socks4ProxyClient : IProxyClient { private const int WAIT_FOR_DATA_INTERVAL = 50; // 50 ms private const int WAIT_FOR_DATA_TIMEOUT = 15000; // 15 seconds private const string PROXY_NAME = "SOCKS4"; private TcpClient _tcpClient; private string _proxyHost; private int _proxyPort; private string _proxyUserId; /// /// Default Socks4 proxy port. /// internal const int SOCKS_PROXY_DEFAULT_PORT = 1080; /// /// Socks4 version number. /// internal const byte SOCKS4_VERSION_NUMBER = 4; /// /// Socks4 connection command value. /// internal const byte SOCKS4_CMD_CONNECT = 0x01; /// /// Socks4 bind command value. /// internal const byte SOCKS4_CMD_BIND = 0x02; /// /// Socks4 reply request grant response value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_GRANTED = 90; /// /// Socks4 reply request rejected or failed response value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_OR_FAILED = 91; /// /// Socks4 reply request rejected becauase the proxy server can not connect to the IDENTD server value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_CANNOT_CONNECT_TO_IDENTD = 92; /// /// Socks4 reply request rejected because of a different IDENTD server. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_DIFFERENT_IDENTD = 93; /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// public Socks4ProxyClient() { } /// /// Creates a Socks4 proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public Socks4ProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy user identification information. public Socks4ProxyClient(string proxyHost, string proxyUserId) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyUserId == null) throw new ArgumentNullException("proxyUserId"); _proxyHost = proxyHost; _proxyPort = SOCKS_PROXY_DEFAULT_PORT; _proxyUserId = proxyUserId; } /// /// Create a Socks4 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy user identification information. public Socks4ProxyClient(string proxyHost, int proxyPort, string proxyUserId) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); if (proxyUserId == null) throw new ArgumentNullException("proxyUserId"); _proxyHost = proxyHost; _proxyPort = proxyPort; _proxyUserId = proxyUserId; } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks4ProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = SOCKS_PROXY_DEFAULT_PORT; } /// /// Create a Socks4 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks4ProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port used to connect to proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS4' virtual public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets proxy user identification information. /// public string ProxyUserId { get { return _proxyUserId; } set { _proxyUserId = value; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a TCP connection to the destination host through the proxy server /// host. /// /// Destination host name or IP address of the destination server. /// Port number to connect to on the destination server. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { if (String.IsNullOrEmpty(destinationHost)) throw new ArgumentNullException("destinationHost"); if (destinationPort <= 0 || destinationPort > 65535) throw new ArgumentOutOfRangeException("destinationPort", "port must be greater than zero and less than 65535"); try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // send connection command to proxy host for the specified destination host and port SendCommand(_tcpClient.GetStream(), SOCKS4_CMD_CONNECT, destinationHost, destinationPort, _proxyUserId); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } /// /// Sends a command to the proxy server. /// /// Proxy server data stream. /// Proxy byte command to execute. /// Destination host name or IP address. /// Destination port number /// IDENTD user ID value. internal virtual void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId) { // PROXY SERVER REQUEST // The client connects to the SOCKS server and sends a CONNECT request when // it wants to establish a connection to an application server. The client // includes in the request packet the IP address and the port number of the // destination host, and userid, in the following format. // // +----+----+----+----+----+----+----+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+ // # of bytes: 1 1 2 4 variable 1 // // VN is the SOCKS protocol version number and should be 4. CD is the // SOCKS command code and should be 1 for CONNECT request. NULL is a byte // of all zero bits. // userId needs to be a zero length string so that the GetBytes method // works properly if (userId == null) userId = ""; byte[] destIp = GetIPAddressBytes(destinationHost); byte[] destPort = GetDestinationPortBytes(destinationPort); byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId); byte[] request = new byte[9 + userIdBytes.Length]; // set the bits on the request byte array request[0] = SOCKS4_VERSION_NUMBER; request[1] = command; destPort.CopyTo(request, 2); destIp.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId // send the connect request proxy.Write(request, 0, request.Length); // wait for the proxy server to respond WaitForData(proxy); // PROXY SERVER RESPONSE // The SOCKS server checks to see whether such a request should be granted // based on any combination of source IP address, destination IP address, // destination port number, the userid, and information it may obtain by // consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS // server makes a connection to the specified port of the destination host. // A reply packet is sent to the client when this connection is established, // or when the request is rejected or the operation fails. // // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // # of bytes: 1 1 2 4 // // VN is the version of the reply code and should be 0. CD is the result // code with one of the following values: // // 90: request granted // 91: request rejected or failed // 92: request rejected becuase SOCKS server cannot connect to // identd on the client // 93: request rejected because the client program and identd // report different user-ids // // The remaining fields are ignored. // // The SOCKS server closes its connection immediately after notifying // the client of a failed or rejected request. For a successful request, // the SOCKS server gets ready to relay traffic on both directions. This // enables the client to do I/O on its connection as if it were directly // connected to the application server. // create an 8 byte response array byte[] response = new byte[8]; // read the resonse from the network stream proxy.Read(response, 0, 8); // evaluate the reply code for an error condition if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED) HandleProxyCommandError(response, destinationHost, destinationPort); } /// /// Translate the host name or IP address to a byte array. /// /// Host name or IP address. /// Byte array representing IP address in bytes. internal byte[] GetIPAddressBytes(string destinationHost) { IPAddress ipAddr = null; // if the address doesn't parse then try to resolve with dns if (!IPAddress.TryParse(destinationHost, out ipAddr)) { try { ipAddr = Dns.GetHostEntry(destinationHost).AddressList[0]; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "A error occurred while attempting to DNS resolve the host name {0}.", destinationHost), ex); } } // return address bytes return ipAddr.GetAddressBytes(); } /// /// Translate the destination port value to a byte array. /// /// Destination port. /// Byte array representing an 16 bit port number as two bytes. internal byte[] GetDestinationPortBytes(int value) { byte[] array = new byte[2]; array[0] = Convert.ToByte(value / 256); array[1] = Convert.ToByte(value % 256); return array; } /// /// Receive a byte array from the proxy server and determine and handle and errors that may have occurred. /// /// Proxy server command response as a byte array. /// Destination host. /// Destination port number. internal void HandleProxyCommandError(byte[] response, string destinationHost, int destinationPort) { if (response == null) throw new ArgumentNullException("response"); // extract the reply code byte replyCode = response[1]; // extract the ip v4 address (4 bytes) byte[] ipBytes = new byte[4]; for (int i = 0; i < 4; i++) ipBytes[i] = response[i + 4]; // convert the ip address to an IPAddress object IPAddress ipAddr = new IPAddress(ipBytes); // extract the port number big endian (2 bytes) byte[] portBytes = new byte[2]; portBytes[0] = response[3]; portBytes[1] = response[2]; Int16 port = BitConverter.ToInt16(portBytes, 0); // translate the reply code error number to human readable text string proxyErrorText; switch (replyCode) { case SOCKS4_CMD_REPLY_REQUEST_REJECTED_OR_FAILED: proxyErrorText = "connection request was rejected or failed"; break; case SOCKS4_CMD_REPLY_REQUEST_REJECTED_CANNOT_CONNECT_TO_IDENTD: proxyErrorText = "connection request was rejected because SOCKS destination cannot connect to identd on the client"; break; case SOCKS4_CMD_REPLY_REQUEST_REJECTED_DIFFERENT_IDENTD: proxyErrorText = "connection request rejected because the client program and identd report different user-ids"; break; default: proxyErrorText = String.Format(CultureInfo.InvariantCulture, "proxy client received an unknown reply with the code value '{0}' from the proxy destination", replyCode.ToString(CultureInfo.InvariantCulture)); break; } // build the exeception message string string exceptionMsg = String.Format(CultureInfo.InvariantCulture, "The {0} concerning destination host {1} port number {2}. The destination reported the host as {3} port {4}.", proxyErrorText, destinationHost, destinationPort, ipAddr.ToString(), port.ToString(CultureInfo.InvariantCulture)); // throw a new application exception throw new ProxyException(exceptionMsg); } internal void WaitForData(NetworkStream stream) { int sleepTime = 0; while (!stream.DataAvailable) { Thread.Sleep(WAIT_FOR_DATA_INTERVAL); sleepTime += WAIT_FOR_DATA_INTERVAL; if (sleepTime > WAIT_FOR_DATA_TIMEOUT) throw new ProxyException("A timeout while waiting for the proxy destination to respond."); } } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port /// using the supplied open TcpClient object with an open connection to proxy server. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns TcpClient object that can be used normally to communicate /// with the destination server. /// /// /// This instructs the proxy server to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The Socks4/4a object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/IProxyClient.cs0000644000175000017500000000771512253423361025247 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace Starksoft.Net.Proxy { /// /// Proxy client interface. This is the interface that all proxy clients must implement. /// public interface IProxyClient { /// /// Event handler for CreateConnectionAsync method completed. /// event EventHandler CreateConnectionAsyncCompleted; /// /// Gets or sets proxy host name or IP address. /// string ProxyHost { get; set; } /// /// Gets or sets proxy port number. /// int ProxyPort { get; set; } /// /// Gets String representing the name of the proxy. /// string ProxyName { get; } /// /// Gets or set the TcpClient object if one was specified in the constructor. /// TcpClient TcpClient { get; set; } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// TcpClient CreateConnection(string destinationHost, int destinationPort); /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// void CreateConnectionAsync(string destinationHost, int destinationPort); } } smuxi-1.1/lib/SmartIrc4net/src/starksoftproxy/Socks5ProxyClient.cs0000644000175000017500000007701512253423361026226 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Globalization; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Socks5 connection proxy class. This class implements the Socks5 standard proxy protocol. /// /// /// This implementation supports TCP proxy connections with a Socks v5 server. /// public class Socks5ProxyClient : IProxyClient { private string _proxyHost; private int _proxyPort; private string _proxyUserName; private string _proxyPassword; private SocksAuthentication _proxyAuthMethod; private TcpClient _tcpClient; private const string PROXY_NAME = "SOCKS5"; private const int SOCKS5_DEFAULT_PORT = 1080; private const byte SOCKS5_VERSION_NUMBER = 5; private const byte SOCKS5_RESERVED = 0x00; private const byte SOCKS5_AUTH_NUMBER_OF_AUTH_METHODS_SUPPORTED = 2; private const byte SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED = 0x00; private const byte SOCKS5_AUTH_METHOD_GSSAPI = 0x01; private const byte SOCKS5_AUTH_METHOD_USERNAME_PASSWORD = 0x02; private const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_BEGIN = 0x03; private const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_END = 0x7f; private const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_BEGIN = 0x80; private const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_END = 0xfe; private const byte SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS = 0xff; private const byte SOCKS5_CMD_CONNECT = 0x01; private const byte SOCKS5_CMD_BIND = 0x02; private const byte SOCKS5_CMD_UDP_ASSOCIATE = 0x03; private const byte SOCKS5_CMD_REPLY_SUCCEEDED = 0x00; private const byte SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE = 0x01; private const byte SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET = 0x02; private const byte SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE = 0x03; private const byte SOCKS5_CMD_REPLY_HOST_UNREACHABLE = 0x04; private const byte SOCKS5_CMD_REPLY_CONNECTION_REFUSED = 0x05; private const byte SOCKS5_CMD_REPLY_TTL_EXPIRED = 0x06; private const byte SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED = 0x07; private const byte SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED = 0x08; private const byte SOCKS5_ADDRTYPE_IPV4 = 0x01; private const byte SOCKS5_ADDRTYPE_DOMAIN_NAME = 0x03; private const byte SOCKS5_ADDRTYPE_IPV6 = 0x04; /// /// Authentication itemType. /// private enum SocksAuthentication { /// /// No authentication used. /// None, /// /// Username and password authentication. /// UsernamePassword } /// /// Create a Socks5 proxy client object. /// public Socks5ProxyClient() { } /// /// Creates a Socks5 proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public Socks5ProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Create a Socks5 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks5ProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = SOCKS5_DEFAULT_PORT; } /// /// Create a Socks5 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks5ProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Create a Socks5 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy authentication user name. /// Proxy authentication password. public Socks5ProxyClient(string proxyHost, string proxyUserName, string proxyPassword) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyUserName == null) throw new ArgumentNullException("proxyUserName"); if (proxyPassword == null) throw new ArgumentNullException("proxyPassword"); _proxyHost = proxyHost; _proxyPort = SOCKS5_DEFAULT_PORT; _proxyUserName = proxyUserName; _proxyPassword = proxyPassword; } /// /// Create a Socks5 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy authentication user name. /// Proxy authentication password. public Socks5ProxyClient(string proxyHost, int proxyPort, string proxyUserName, string proxyPassword) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); if (proxyUserName == null) throw new ArgumentNullException("proxyUserName"); if (proxyPassword == null) throw new ArgumentNullException("proxyPassword"); _proxyHost = proxyHost; _proxyPort = proxyPort; _proxyUserName = proxyUserName; _proxyPassword = proxyPassword; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port used to connect to proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS5' public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets proxy authentication user name. /// public string ProxyUserName { get { return _proxyUserName; } set { _proxyUserName = value; } } /// /// Gets or sets proxy authentication password. /// public string ProxyPassword { get { return _proxyPassword; } set { _proxyPassword = value; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address of the destination server. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { if (String.IsNullOrEmpty(destinationHost)) throw new ArgumentNullException("destinationHost"); if (destinationPort <= 0 || destinationPort > 65535) throw new ArgumentOutOfRangeException("destinationPort", "port must be greater than zero and less than 65535"); try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // determine which authentication method the client would like to use DetermineClientAuthMethod(); // negotiate which authentication methods are supported / accepted by the server NegotiateServerAuthMethod(); // send a connect command to the proxy server for destination host and port SendCommand(SOCKS5_CMD_CONNECT, destinationHost, destinationPort); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } private void DetermineClientAuthMethod() { // set the authentication itemType used based on values inputed by the user if (_proxyUserName != null && _proxyPassword != null) _proxyAuthMethod = SocksAuthentication.UsernamePassword; else _proxyAuthMethod = SocksAuthentication.None; } private void NegotiateServerAuthMethod() { // get a reference to the network stream NetworkStream stream = _tcpClient.GetStream(); // SERVER AUTHENTICATION REQUEST // The client connects to the server, and sends a version // identifier/method selection message: // // +----+----------+----------+ // |VER | NMETHODS | METHODS | // +----+----------+----------+ // | 1 | 1 | 1 to 255 | // +----+----------+----------+ byte[] authRequest = new byte[4]; authRequest[0] = SOCKS5_VERSION_NUMBER; authRequest[1] = SOCKS5_AUTH_NUMBER_OF_AUTH_METHODS_SUPPORTED; authRequest[2] = SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED; authRequest[3] = SOCKS5_AUTH_METHOD_USERNAME_PASSWORD; // send the request to the server specifying authentication types supported by the client. stream.Write(authRequest, 0, authRequest.Length); // SERVER AUTHENTICATION RESPONSE // The server selects from one of the methods given in METHODS, and // sends a METHOD selection message: // // +----+--------+ // |VER | METHOD | // +----+--------+ // | 1 | 1 | // +----+--------+ // // If the selected METHOD is X'FF', none of the methods listed by the // client are acceptable, and the client MUST close the connection. // // The values currently defined for METHOD are: // * X'00' NO AUTHENTICATION REQUIRED // * X'01' GSSAPI // * X'02' USERNAME/PASSWORD // * X'03' to X'7F' IANA ASSIGNED // * X'80' to X'FE' RESERVED FOR PRIVATE METHODS // * X'FF' NO ACCEPTABLE METHODS // receive the server response byte[] response = new byte[2]; stream.Read(response, 0, response.Length); // the first byte contains the socks version number (e.g. 5) // the second byte contains the auth method acceptable to the proxy server byte acceptedAuthMethod = response[1]; // if the server does not accept any of our supported authenication methods then throw an error if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS) { _tcpClient.Close(); throw new ProxyException("The proxy destination does not accept the supported proxy client authentication methods."); } // if the server accepts a username and password authentication and none is provided by the user then throw an error if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_USERNAME_PASSWORD && _proxyAuthMethod == SocksAuthentication.None) { _tcpClient.Close(); throw new ProxyException("The proxy destination requires a username and password for authentication."); } if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_USERNAME_PASSWORD) { // USERNAME / PASSWORD SERVER REQUEST // Once the SOCKS V5 server has started, and the client has selected the // Username/Password Authentication protocol, the Username/Password // subnegotiation begins. This begins with the client producing a // Username/Password request: // // +----+------+----------+------+----------+ // |VER | ULEN | UNAME | PLEN | PASSWD | // +----+------+----------+------+----------+ // | 1 | 1 | 1 to 255 | 1 | 1 to 255 | // +----+------+----------+------+----------+ byte[] credentials = new byte[_proxyUserName.Length + _proxyPassword.Length + 3]; credentials[0] = 1; credentials[1] = (byte)_proxyUserName.Length; Array.Copy(ASCIIEncoding.ASCII.GetBytes(_proxyUserName), 0, credentials, 2, _proxyUserName.Length); credentials[_proxyUserName.Length + 2] = (byte)_proxyPassword.Length; Array.Copy(ASCIIEncoding.ASCII.GetBytes(_proxyPassword), 0, credentials, _proxyUserName.Length + 3, _proxyPassword.Length); // USERNAME / PASSWORD SERVER RESPONSE // The server verifies the supplied UNAME and PASSWD, and sends the // following response: // // +----+--------+ // |VER | STATUS | // +----+--------+ // | 1 | 1 | // +----+--------+ // // A STATUS field of X'00' indicates success. If the server returns a // `failure' (STATUS value other than X'00') status, it MUST close the // connection. stream.Write(credentials, 0, credentials.Length); byte[] crResponse = new byte[2]; stream.Read(crResponse, 0, crResponse.Length); if (crResponse[1] != 0) { _tcpClient.Close(); throw new ProxyException("Proxy authentification failure!"); } } } private byte GetDestAddressType(string host) { IPAddress ipAddr = null; bool result = IPAddress.TryParse(host, out ipAddr); if (!result) return SOCKS5_ADDRTYPE_DOMAIN_NAME; switch (ipAddr.AddressFamily) { case AddressFamily.InterNetwork: return SOCKS5_ADDRTYPE_IPV4; case AddressFamily.InterNetworkV6: return SOCKS5_ADDRTYPE_IPV6; default: throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "The host addess {0} of type '{1}' is not a supported address type. The supported types are InterNetwork and InterNetworkV6.", host, Enum.GetName(typeof(AddressFamily), ipAddr.AddressFamily))); } } private byte[] GetDestAddressBytes(byte addressType, string host) { switch (addressType) { case SOCKS5_ADDRTYPE_IPV4: case SOCKS5_ADDRTYPE_IPV6: return IPAddress.Parse(host).GetAddressBytes(); case SOCKS5_ADDRTYPE_DOMAIN_NAME: // create a byte array to hold the host name bytes plus one byte to store the length byte[] bytes = new byte[host.Length + 1]; // if the address field contains a fully-qualified domain name. The first // octet of the address field contains the number of octets of name that // follow, there is no terminating NUL octet. bytes[0] = Convert.ToByte(host.Length); Encoding.ASCII.GetBytes(host).CopyTo(bytes, 1); return bytes; default: return null; } } private byte[] GetDestPortBytes(int value) { byte[] array = new byte[2]; array[0] = Convert.ToByte(value / 256); array[1] = Convert.ToByte(value % 256); return array; } private void SendCommand(byte command, string destinationHost, int destinationPort) { NetworkStream stream = _tcpClient.GetStream(); byte addressType = GetDestAddressType(destinationHost); byte[] destAddr = GetDestAddressBytes(addressType, destinationHost); byte[] destPort = GetDestPortBytes(destinationPort); // The connection request is made up of 6 bytes plus the // length of the variable address byte array // // +----+-----+-------+------+----------+----------+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ // // * VER protocol version: X'05' // * CMD // * CONNECT X'01' // * BIND X'02' // * UDP ASSOCIATE X'03' // * RSV RESERVED // * ATYP address itemType of following address // * IP V4 address: X'01' // * DOMAINNAME: X'03' // * IP V6 address: X'04' // * DST.ADDR desired destination address // * DST.PORT desired destination port in network octet order byte[] request = new byte[4 + destAddr.Length + 2]; request[0] = SOCKS5_VERSION_NUMBER; request[1] = command; request[2] = SOCKS5_RESERVED; request[3] = addressType; destAddr.CopyTo(request, 4); destPort.CopyTo(request, 4 + destAddr.Length); // send connect request. stream.Write(request, 0, request.Length); // PROXY SERVER RESPONSE // +----+-----+-------+------+----------+----------+ // |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ // // * VER protocol version: X'05' // * REP Reply field: // * X'00' succeeded // * X'01' general SOCKS server failure // * X'02' connection not allowed by ruleset // * X'03' Network unreachable // * X'04' Host unreachable // * X'05' Connection refused // * X'06' TTL expired // * X'07' Command not supported // * X'08' Address itemType not supported // * X'09' to X'FF' unassigned //* RSV RESERVED //* ATYP address itemType of following address byte[] response = new byte[255]; // read proxy server response var responseSize = stream.Read(response, 0, response.Length); byte replyCode = response[1]; // evaluate the reply code for an error condition if (responseSize < 2 || replyCode != SOCKS5_CMD_REPLY_SUCCEEDED) HandleProxyCommandError(response, destinationHost, destinationPort ); } private void HandleProxyCommandError(byte[] response, string destinationHost, int destinationPort) { string proxyErrorText; byte replyCode = response[1]; byte addrType = response[3]; string addr = ""; Int16 port = 0; switch (addrType) { case SOCKS5_ADDRTYPE_DOMAIN_NAME: int addrLen = Convert.ToInt32(response[4]); byte[] addrBytes = new byte[addrLen]; for (int i = 0; i < addrLen; i++) addrBytes[i] = response[i + 5]; addr = System.Text.ASCIIEncoding.ASCII.GetString(addrBytes); byte[] portBytesDomain = new byte[2]; portBytesDomain[0] = response[6 + addrLen]; portBytesDomain[1] = response[5 + addrLen]; port = BitConverter.ToInt16(portBytesDomain, 0); break; case SOCKS5_ADDRTYPE_IPV4: byte[] ipv4Bytes = new byte[4]; for (int i = 0; i < 4; i++) ipv4Bytes[i] = response[i + 4]; IPAddress ipv4 = new IPAddress(ipv4Bytes); addr = ipv4.ToString(); byte[] portBytesIpv4 = new byte[2]; portBytesIpv4[0] = response[9]; portBytesIpv4[1] = response[8]; port = BitConverter.ToInt16(portBytesIpv4, 0); break; case SOCKS5_ADDRTYPE_IPV6: byte[] ipv6Bytes = new byte[16]; for (int i = 0; i < 16; i++) ipv6Bytes[i] = response[i + 4]; IPAddress ipv6 = new IPAddress(ipv6Bytes); addr = ipv6.ToString(); byte[] portBytesIpv6 = new byte[2]; portBytesIpv6[0] = response[21]; portBytesIpv6[1] = response[20]; port = BitConverter.ToInt16(portBytesIpv6, 0); break; } switch (replyCode) { case SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE: proxyErrorText = "a general socks destination failure occurred"; break; case SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET: proxyErrorText = "the connection is not allowed by proxy destination rule set"; break; case SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE: proxyErrorText = "the network was unreachable"; break; case SOCKS5_CMD_REPLY_HOST_UNREACHABLE: proxyErrorText = "the host was unreachable"; break; case SOCKS5_CMD_REPLY_CONNECTION_REFUSED: proxyErrorText = "the connection was refused by the remote network"; break; case SOCKS5_CMD_REPLY_TTL_EXPIRED: proxyErrorText = "the time to live (TTL) has expired"; break; case SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED: proxyErrorText = "the command issued by the proxy client is not supported by the proxy destination"; break; case SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED: proxyErrorText = "the address type specified is not supported"; break; default: proxyErrorText = String.Format(CultureInfo.InvariantCulture, "that an unknown reply with the code value '{0}' was received by the destination", replyCode.ToString(CultureInfo.InvariantCulture)); break; } string exceptionMsg = String.Format(CultureInfo.InvariantCulture, "The {0} concerning destination host {1} port number {2}. The destination reported the host as {3} port {4}.", proxyErrorText, destinationHost, destinationPort, addr, port.ToString(CultureInfo.InvariantCulture)); throw new ProxyException(exceptionMsg); } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns TcpClient object that can be used normally to communicate /// with the destination server. /// /// /// This method instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The Socks4 object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/AssemblyInfo.cs0000664000175000017500000000467313014002126022115 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] [assembly: AssemblyTitle("SmartIrc4net")] [assembly: AssemblyDescription("IRC library for CLI")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("qNETp")] [assembly: AssemblyProduct("SmartIrc4net")] [assembly: AssemblyCopyright("2003-2015 (C) Mirco Bauer and other contributors")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("0.4.5.0")] [assembly: AssemblyInformationalVersion("1.0")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. #if DELAY_SIGN [assembly: AssemblyDelaySign(true)] [assembly: AssemblyKeyFile("../SmartIrc4net-pub.snk")] #else [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] #endif smuxi-1.1/lib/SmartIrc4net/src/IrcClient/0000755000175000017500000000000014011525432021043 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/IrcClient/WhoInfo.cs0000664000175000017500000001504213014002107022736 0ustar00meebeymeebey00000000000000/* * $Id: IrcUser.cs 198 2005-06-08 16:50:11Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smartirc/SmartIrc4net/trunk/src/IrcClient/IrcUser.cs $ * $Rev: 198 $ * $Author: meebey $ * $Date: 2005-06-08 18:50:11 +0200 (Wed, 08 Jun 2005) $ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; namespace Meebey.SmartIrc4net { public class WhoInfo { private string f_Channel; private string f_Ident; private string f_Host; private string f_Server; private string f_Nick; private int f_HopCount; private string f_Realname; private bool f_IsAway; private bool f_IsOwner; private bool f_IsChannelAdmin; private bool f_IsOp; private bool f_IsHalfop; private bool f_IsVoice; private bool f_IsIrcOp; private bool f_IsRegistered; public string Channel { get { return f_Channel; } } public string Ident { get { return f_Ident; } } public string Host { get { return f_Host; } } public string Server { get { return f_Server; } } public string Nick { get { return f_Nick; } } public int HopCount { get { return f_HopCount; } } public string Realname { get { return f_Realname; } } public bool IsAway { get { return f_IsAway; } } public bool IsOwner { get { return f_IsOwner; } } public bool IsChannelAdmin { get { return f_IsChannelAdmin; } } public bool IsOp { get { return f_IsOp; } } public bool IsHalfop { get { return f_IsHalfop; } } public bool IsVoice { get { return f_IsVoice; } } public bool IsIrcOp { get { return f_IsIrcOp; } } public bool IsRegistered { get { return f_IsRegistered; } } private WhoInfo() { } public static WhoInfo Parse(IrcMessageData data) { WhoInfo whoInfo = new WhoInfo(); // :fu-berlin.de 352 meebey_ * ~meebey e176002059.adsl.alicedsl.de fu-berlin.de meebey_ H :0 Mirco Bauer.. whoInfo.f_Channel = data.RawMessageArray[3]; whoInfo.f_Ident = data.RawMessageArray[4]; whoInfo.f_Host = data.RawMessageArray[5]; whoInfo.f_Server = data.RawMessageArray[6]; whoInfo.f_Nick = data.RawMessageArray[7]; // HACK: realname field can be empty on bugged IRCds like InspIRCd-2.0 // :topiary.voxanon.net 352 Mirco #anonplusradio CpGc igot.avhost Voxanon CpGc H if (data.MessageArray == null || data.MessageArray.Length < 2) { whoInfo.f_Realname = String.Empty; } else { int hopcount = 0; var hopcountStr = data.MessageArray[0]; if (Int32.TryParse(hopcountStr, out hopcount)) { whoInfo.f_HopCount = hopcount; } else { #if LOG4NET Logger.MessageParser.Warn("Parse(): couldn't parse hopcount (as int): '" + hopcountStr + "'"); #endif } // skip hop count whoInfo.f_Realname = String.Join(" ", data.MessageArray, 1, data.MessageArray.Length - 1); } string usermode = data.RawMessageArray[8]; bool owner = false; bool chanadmin = false; bool op = false; bool halfop = false; bool voice = false; bool ircop = false; bool away = false; bool registered = false; int usermodelength = usermode.Length; for (int i = 0; i < usermodelength; i++) { switch (usermode[i]) { case 'H': away = false; break; case 'G': away = true; break; case '~': owner = true; break; case '&': chanadmin = true; break; case '@': op = true; break; case '%': halfop = true; break; case '+': voice = true; break; case '*': ircop = true; break; case 'r': registered = true; break; } } whoInfo.f_IsAway = away; whoInfo.f_IsOwner = owner; whoInfo.f_IsChannelAdmin = chanadmin; whoInfo.f_IsOp = op; whoInfo.f_IsHalfop = halfop; whoInfo.f_IsVoice = voice; whoInfo.f_IsIrcOp = ircop; whoInfo.f_IsRegistered = registered; return whoInfo; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/Delegates.cs0000664000175000017500000000674513014002107023274 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { public delegate void IrcEventHandler(object sender, IrcEventArgs e); public delegate void CtcpEventHandler(object sender, CtcpEventArgs e); public delegate void ActionEventHandler(object sender, ActionEventArgs e); public delegate void ErrorEventHandler(object sender, ErrorEventArgs e); public delegate void PingEventHandler(object sender, PingEventArgs e); public delegate void KickEventHandler(object sender, KickEventArgs e); public delegate void JoinEventHandler(object sender, JoinEventArgs e); public delegate void NamesEventHandler(object sender, NamesEventArgs e); public delegate void ListEventHandler(object sender, ListEventArgs e); public delegate void PartEventHandler(object sender, PartEventArgs e); public delegate void InviteEventHandler(object sender, InviteEventArgs e); public delegate void OwnerEventHandler(object sender, OwnerEventArgs e); public delegate void DeownerEventHandler(object sender, DeownerEventArgs e); public delegate void ChannelAdminEventHandler(object sender, ChannelAdminEventArgs e); public delegate void DeChannelAdminEventHandler(object sender, DeChannelAdminEventArgs e); public delegate void OpEventHandler(object sender, OpEventArgs e); public delegate void DeopEventHandler(object sender, DeopEventArgs e); public delegate void HalfopEventHandler(object sender, HalfopEventArgs e); public delegate void DehalfopEventHandler(object sender, DehalfopEventArgs e); public delegate void VoiceEventHandler(object sender, VoiceEventArgs e); public delegate void DevoiceEventHandler(object sender, DevoiceEventArgs e); public delegate void BanEventHandler(object sender, BanEventArgs e); public delegate void UnbanEventHandler(object sender, UnbanEventArgs e); public delegate void TopicEventHandler(object sender, TopicEventArgs e); public delegate void TopicChangeEventHandler(object sender, TopicChangeEventArgs e); public delegate void NickChangeEventHandler(object sender, NickChangeEventArgs e); public delegate void QuitEventHandler(object sender, QuitEventArgs e); public delegate void AwayEventHandler(object sender, AwayEventArgs e); public delegate void WhoEventHandler(object sender, WhoEventArgs e); public delegate void MotdEventHandler(object sender, MotdEventArgs e); public delegate void PongEventHandler(object sender, PongEventArgs e); public delegate void BounceEventHandler(object sender, BounceEventArgs e); } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/ChannelUser.cs0000664000175000017500000001165113014002107023576 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { /// /// This class manages the information of a user within a channel. /// /// /// only used with channel sync /// /// public class ChannelUser { private string _Channel; private IrcUser _IrcUser; private bool _IsOp; private bool _IsVoice; /// /// /// /// /// internal ChannelUser(string channel, IrcUser ircuser) { _Channel = channel; _IrcUser = ircuser; } #if LOG4NET ~ChannelUser() { Logger.ChannelSyncing.Debug("ChannelUser ("+Channel+":"+IrcUser.Nick+") destroyed"); } #endif /// /// Gets the channel name /// public string Channel { get { return _Channel; } } /// /// Gets the server operator status of the user /// public bool IsIrcOp { get { return _IrcUser.IsIrcOp; } } /// /// Gets or sets the op flag of the user (+o) /// /// /// only used with channel sync /// public bool IsOp { get { return _IsOp; } set { _IsOp = value; } } /// /// Gets or sets the voice flag of the user (+v) /// /// /// only used with channel sync /// public bool IsVoice { get { return _IsVoice; } set { _IsVoice = value; } } /// /// Gets the away status of the user /// public bool IsAway { get { return _IrcUser.IsAway; } } /// /// Gets the underlaying IrcUser object /// public IrcUser IrcUser { get { return _IrcUser; } } /// /// Gets the nickname of the user /// public string Nick { get { return _IrcUser.Nick; } } /// /// Gets the identity (username) of the user, which is used by some IRC networks for authentication. /// public string Ident { get { return _IrcUser.Ident; } } /// /// Gets the hostname of the user, /// public string Host { get { return _IrcUser.Host; } } /// /// Gets the supposed real name of the user. /// public string Realname { get { return _IrcUser.Realname; } } /// /// Gets the server the user is connected to. /// /// public string Server { get { return _IrcUser.Server; } } /// /// Gets or sets the count of hops between you and the user's server /// public int HopCount { get { return _IrcUser.HopCount; } } /// /// Gets the list of channels the user has joined /// public string[] JoinedChannels { get { return _IrcUser.JoinedChannels; } } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/IrcUser.cs0000664000175000017500000001456213014002107022747 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System.Collections.Specialized; namespace Meebey.SmartIrc4net { /// /// This class manages the user information. /// /// /// only used with channel sync /// /// IrcClient.ActiveChannelSyncing /// /// /// public class IrcUser { private IrcClient _IrcClient; private string _Nick = null; private string _Ident = null; private string _Host = null; private string _Realname = null; private bool _IsIrcOp = false; private bool _IsRegistered = false; private bool _IsAway = false; private string _Server = null; private int _HopCount = -1; internal IrcUser(string nickname, IrcClient ircclient) { _IrcClient = ircclient; _Nick = nickname; } #if LOG4NET ~IrcUser() { Logger.ChannelSyncing.Debug("IrcUser ("+Nick+") destroyed"); } #endif /// /// Gets or sets the nickname of the user. /// /// /// Do _not_ set this value, it will break channel sync! /// public string Nick { get { return _Nick; } set { _Nick = value; } } /// /// Gets or sets the identity (username) of the user which is used by some IRC networks for authentication. /// /// /// Do _not_ set this value, it will break channel sync! /// public string Ident { get { return _Ident; } set { _Ident = value; } } /// /// Gets or sets the hostname of the user. /// /// /// Do _not_ set this value, it will break channel sync! /// public string Host { get { return _Host; } set { _Host = value; } } /// /// Gets or sets the supposed real name of the user. /// /// /// Do _not_ set this value, it will break channel sync! /// public string Realname { get { return _Realname; } set { _Realname = value; } } /// /// Gets or sets the server operator status of the user /// /// /// Do _not_ set this value, it will break channel sync! /// public bool IsIrcOp { get { return _IsIrcOp; } set { _IsIrcOp = value; } } /// /// Gets or sets the registered status of the user /// public bool IsRegistered { get { return _IsRegistered; } internal set { _IsRegistered = value; } } /// /// Gets or sets away status of the user /// /// /// Do _not_ set this value, it will break channel sync! /// public bool IsAway { get { return _IsAway; } set { _IsAway = value; } } /// /// Gets or sets the server the user is connected to /// /// /// Do _not_ set this value, it will break channel sync! /// public string Server { get { return _Server; } set { _Server = value; } } /// /// Gets or sets the count of hops between you and the user's server /// /// /// Do _not_ set this value, it will break channel sync! /// public int HopCount { get { return _HopCount; } set { _HopCount = value; } } /// /// Gets the list of channels the user has joined /// public string[] JoinedChannels { get { Channel channel; string[] result; string[] channels = _IrcClient.GetChannels(); StringCollection joinedchannels = new StringCollection(); foreach (string channelname in channels) { channel = _IrcClient.GetChannel(channelname); if (channel.UnsafeUsers.ContainsKey(_Nick)) { joinedchannels.Add(channelname); } } result = new string[joinedchannels.Count]; joinedchannels.CopyTo(result, 0); return result; //return joinedchannels; } } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/IrcClient.cs0000664000175000017500000037714314011525432023267 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2010, 2012-2014 Mirco Bauer * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; namespace Meebey.SmartIrc4net { /// /// This layer is an event driven high-level API with all features you could need for IRC programming. /// /// public class IrcClient : IrcCommands { private string _Nickname = string.Empty; private string[] _NicknameList; private int _CurrentNickname; private string _Realname = string.Empty; private string _Usermode = string.Empty; private int _IUsermode; private string _Username = string.Empty; private string _Password = string.Empty; private bool _IsAway; private string _CtcpVersion; private bool _ActiveChannelSyncing; private bool _PassiveChannelSyncing; private bool _AutoJoinOnInvite; private bool _AutoRejoin; private Dictionary _AutoRejoinChannels = new Dictionary(); private bool _AutoRejoinOnKick; private bool _AutoRelogin; private bool _AutoNickHandling = true; private bool _SupportNonRfc; private bool _SupportNonRfcLocked; private StringCollection _Motd = new StringCollection(); private bool _MotdReceived; private Array _ReplyCodes = Enum.GetValues(typeof(ReplyCode)); private StringCollection _JoinedChannels = new StringCollection(); private Hashtable _Channels = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private Hashtable _IrcUsers = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private List _ChannelList; private Object _ChannelListSyncRoot = new Object(); private AutoResetEvent _ChannelListReceivedEvent; private List _WhoList; private Object _WhoListSyncRoot = new Object(); private AutoResetEvent _WhoListReceivedEvent; private List _BanList; private Object _BanListSyncRoot = new Object(); private AutoResetEvent _BanListReceivedEvent; private List _BanExceptList; private Object _BanExceptListSyncRoot = new Object(); private AutoResetEvent _BanExceptListReceivedEvent; private List _InviteExceptList; private Object _InviteExceptListSyncRoot = new Object(); private AutoResetEvent _InviteExceptListReceivedEvent; private ServerProperties _ServerProperties = new ServerProperties(); private static Regex _ReplyCodeRegex = new Regex("^:[^ ]+? ([0-9]{3}) .+$", RegexOptions.Compiled); private static Regex _PingRegex = new Regex("^PING :.*", RegexOptions.Compiled); private static Regex _ErrorRegex = new Regex("^ERROR :.*", RegexOptions.Compiled); private static Regex _ActionRegex = new Regex("^:.*? PRIVMSG (.).* :"+"\x1"+"ACTION .*"+"\x1"+"$", RegexOptions.Compiled); private static Regex _CtcpRequestRegex = new Regex("^:.*? PRIVMSG .* :"+"\x1"+".*"+"\x1"+"$", RegexOptions.Compiled); private static Regex _MessageRegex = new Regex("^:.*? PRIVMSG (.).* :.*$", RegexOptions.Compiled); private static Regex _CtcpReplyRegex = new Regex("^:.*? NOTICE .* :"+"\x1"+".*"+"\x1"+"$", RegexOptions.Compiled); private static Regex _NoticeRegex = new Regex("^:.*? NOTICE (.).* :.*$", RegexOptions.Compiled); private static Regex _InviteRegex = new Regex("^:.*? INVITE .* .*$", RegexOptions.Compiled); private static Regex _JoinRegex = new Regex("^:.*? JOIN .*$", RegexOptions.Compiled); private static Regex _TopicRegex = new Regex("^:.*? TOPIC .* :.*$", RegexOptions.Compiled); private static Regex _NickRegex = new Regex("^:.*? NICK .*$", RegexOptions.Compiled); private static Regex _KickRegex = new Regex("^:.*? KICK .* .*$", RegexOptions.Compiled); private static Regex _PartRegex = new Regex("^:.*? PART .*$", RegexOptions.Compiled); private static Regex _ModeRegex = new Regex("^:.*? MODE (.*) .*$", RegexOptions.Compiled); private static Regex _QuitRegex = new Regex("^:.*? QUIT :.*$", RegexOptions.Compiled); private static Regex _BounceMessageRegex = new Regex("^Try server (.+), port ([0-9]+)$", RegexOptions.Compiled); ChannelModeMap ChannelModeMap { get; set; } public event EventHandler OnRegistered; public event PingEventHandler OnPing; public event PongEventHandler OnPong; public event IrcEventHandler OnRawMessage; public event ErrorEventHandler OnError; public event IrcEventHandler OnErrorMessage; public event JoinEventHandler OnJoin; public event NamesEventHandler OnNames; public event ListEventHandler OnList; public event PartEventHandler OnPart; public event QuitEventHandler OnQuit; public event KickEventHandler OnKick; public event AwayEventHandler OnAway; public event IrcEventHandler OnUnAway; public event IrcEventHandler OnNowAway; public event InviteEventHandler OnInvite; public event BanEventHandler OnBan; public event UnbanEventHandler OnUnban; public event BanEventHandler OnBanException; public event UnbanEventHandler OnUnBanException; public event BanEventHandler OnInviteException; public event UnbanEventHandler OnUnInviteException; public event OwnerEventHandler OnOwner; public event DeownerEventHandler OnDeowner; public event ChannelAdminEventHandler OnChannelAdmin; public event DeChannelAdminEventHandler OnDeChannelAdmin; public event OpEventHandler OnOp; public event DeopEventHandler OnDeop; public event HalfopEventHandler OnHalfop; public event DehalfopEventHandler OnDehalfop; public event VoiceEventHandler OnVoice; public event DevoiceEventHandler OnDevoice; public event WhoEventHandler OnWho; public event MotdEventHandler OnMotd; public event TopicEventHandler OnTopic; public event TopicChangeEventHandler OnTopicChange; public event NickChangeEventHandler OnNickChange; public event IrcEventHandler OnModeChange; public event IrcEventHandler OnUserModeChange; public event EventHandler OnChannelModeChange; public event IrcEventHandler OnChannelMessage; public event ActionEventHandler OnChannelAction; public event IrcEventHandler OnChannelNotice; public event IrcEventHandler OnChannelActiveSynced; public event IrcEventHandler OnChannelPassiveSynced; public event IrcEventHandler OnQueryMessage; public event ActionEventHandler OnQueryAction; public event IrcEventHandler OnQueryNotice; public event CtcpEventHandler OnCtcpRequest; public event CtcpEventHandler OnCtcpReply; public event BounceEventHandler OnBounce; /// /// Enables/disables the active channel sync feature. /// Default: false /// public bool ActiveChannelSyncing { get { return _ActiveChannelSyncing; } set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("Active channel syncing enabled"); } else { Logger.ChannelSyncing.Info("Active channel syncing disabled"); } #endif _ActiveChannelSyncing = value; } } /// /// Enables/disables the passive channel sync feature. Not implemented yet! /// public bool PassiveChannelSyncing { get { return _PassiveChannelSyncing; } /* set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("Passive channel syncing enabled"); } else { Logger.ChannelSyncing.Info("Passive channel syncing disabled"); } #endif _PassiveChannelSyncing = value; } */ } /// /// Sets the ctcp version that should be replied on ctcp version request. /// public string CtcpVersion { get { return _CtcpVersion; } set { _CtcpVersion = value; } } /// /// Enables/disables auto joining of channels when invited. /// Default: false /// public bool AutoJoinOnInvite { get { return _AutoJoinOnInvite; } set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("AutoJoinOnInvite enabled"); } else { Logger.ChannelSyncing.Info("AutoJoinOnInvite disabled"); } #endif _AutoJoinOnInvite = value; } } /// /// Enables/disables automatic rejoining of channels when a connection to the server is lost. /// Default: false /// public bool AutoRejoin { get { return _AutoRejoin; } set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("AutoRejoin enabled"); } else { Logger.ChannelSyncing.Info("AutoRejoin disabled"); } #endif _AutoRejoin = value; } } /// /// Enables/disables auto rejoining of channels when kicked. /// Default: false /// public bool AutoRejoinOnKick { get { return _AutoRejoinOnKick; } set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("AutoRejoinOnKick enabled"); } else { Logger.ChannelSyncing.Info("AutoRejoinOnKick disabled"); } #endif _AutoRejoinOnKick = value; } } /// /// Enables/disables auto relogin to the server after a reconnect. /// Default: false /// public bool AutoRelogin { get { return _AutoRelogin; } set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("AutoRelogin enabled"); } else { Logger.ChannelSyncing.Info("AutoRelogin disabled"); } #endif _AutoRelogin = value; } } /// /// Enables/disables auto nick handling on nick collisions /// Default: true /// public bool AutoNickHandling { get { return _AutoNickHandling; } set { #if LOG4NET if (value) { Logger.ChannelSyncing.Info("AutoNickHandling enabled"); } else { Logger.ChannelSyncing.Info("AutoNickHandling disabled"); } #endif _AutoNickHandling = value; } } /// /// Enables/disables support for non rfc features. /// Default: false /// public bool SupportNonRfc { get { return _SupportNonRfc; } set { if (_SupportNonRfcLocked) { return; } #if LOG4NET if (value) { Logger.ChannelSyncing.Info("SupportNonRfc enabled"); } else { Logger.ChannelSyncing.Info("SupportNonRfc disabled"); } #endif _SupportNonRfc = value; } } /// /// Gets the nickname of us. /// public string Nickname { get { return _Nickname; } } /// /// Gets the list of nicknames of us. /// public string[] NicknameList { get { return _NicknameList; } } /// /// Gets the supposed real name of us. /// public string Realname { get { return _Realname; } } /// /// Gets the username for the server. /// /// /// System username is set by default /// public string Username { get { return _Username; } } /// /// Gets the alphanumeric mode mask of us. /// public string Usermode { get { return _Usermode; } } /// /// Gets the numeric mode mask of us. /// public int IUsermode { get { return _IUsermode; } } /// /// Returns if we are away on this connection /// public bool IsAway { get { return _IsAway; } } /// /// Gets the password for the server. /// public string Password { get { return _Password; } } /// /// Gets the list of channels we are joined. /// public StringCollection JoinedChannels { get { return _JoinedChannels; } } /// /// Gets the server message of the day. /// public StringCollection Motd { get { return _Motd; } } public object BanListSyncRoot { get { return _BanListSyncRoot; } } /// /// Gets the special functionality supported by this server. /// public ServerProperties ServerProperties { get { return _ServerProperties; } } /// /// This class manages the connection server and provides access to all the objects needed to send and receive messages. /// public IrcClient() { #if LOG4NET Logger.Main.Debug("IrcClient created"); #endif OnReadLine += new ReadLineEventHandler(_Worker); OnDisconnected += new EventHandler(_OnDisconnected); OnConnectionError += new EventHandler(_OnConnectionError); ChannelModeMap = new ChannelModeMap(); } #if LOG4NET ~IrcClient() { Logger.Main.Debug("IrcClient destroyed"); } #endif /// /// Connection parameters required to establish an server connection. /// /// The list of server hostnames. /// The TCP port the server listens on. public new void Connect(string[] addresslist, int port) { _SupportNonRfcLocked = true; ChannelModeMap = new ChannelModeMap(); base.Connect(addresslist, port); } /// /// Reconnects to the current server. /// /// If the login data should be sent, after successful connect. /// If the channels should be rejoined, after successful connect. public void Reconnect(bool login, bool channels) { if (channels) { _StoreChannelsToRejoin(); } base.Reconnect(); if (login) { //reset the nick to the original nicklist _CurrentNickname = 0; // FIXME: honor _Nickname (last used nickname) Login(_NicknameList, Realname, IUsermode, Username, Password); } if (channels) { _RejoinChannels(); } } /// If the login data should be sent, after successful connect. public void Reconnect(bool login) { Reconnect(login, AutoRejoin); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users list of 'nick' names which may NOT contain spaces /// The users 'real' name which may contain space characters /// A numeric mode parameter. /// /// Set to 0 to recieve wallops and be invisible. /// Set to 4 to be invisible and not receive wallops. /// /// /// The user's machine logon name /// The optional password can and MUST be set before any attempt to register /// the connection is made. public void Login(string[] nicklist, string realname, int usermode, string username, string password) { #if LOG4NET Logger.Connection.Info("logging in"); #endif _NicknameList = (string[])nicklist.Clone(); // here we set the nickname which we will try first _Nickname = _NicknameList[0].Replace(" ", ""); _Realname = realname; _IUsermode = usermode; if (username != null && username.Length > 0) { _Username = username.Replace(" ", ""); } else { _Username = Environment.UserName.Replace(" ", ""); } if (password != null && password.Length > 0) { _Password = password; RfcPass(Password, Priority.Critical); } RfcNick(Nickname, Priority.Critical); RfcUser(Username, IUsermode, Realname, Priority.Critical); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users list of 'nick' names which may NOT contain spaces /// The users 'real' name which may contain space characters /// A numeric mode parameter. /// Set to 0 to recieve wallops and be invisible. /// Set to 4 to be invisible and not receive wallops. /// The user's machine logon name public void Login(string[] nicklist, string realname, int usermode, string username) { Login(nicklist, realname, usermode, username, ""); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users list of 'nick' names which may NOT contain spaces /// The users 'real' name which may contain space characters /// A numeric mode parameter. /// Set to 0 to recieve wallops and be invisible. /// Set to 4 to be invisible and not receive wallops. public void Login(string[] nicklist, string realname, int usermode) { Login(nicklist, realname, usermode, "", ""); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users list of 'nick' names which may NOT contain spaces /// The users 'real' name which may contain space characters public void Login(string[] nicklist, string realname) { Login(nicklist, realname, 0, "", ""); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users 'nick' name which may NOT contain spaces /// The users 'real' name which may contain space characters /// A numeric mode parameter. /// Set to 0 to recieve wallops and be invisible. /// Set to 4 to be invisible and not receive wallops. /// The user's machine logon name /// The optional password can and MUST be set before any attempt to register /// the connection is made. public void Login(string nick, string realname, int usermode, string username, string password) { Login(new string[] {nick, nick+"_", nick+"__"}, realname, usermode, username, password); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users 'nick' name which may NOT contain spaces /// The users 'real' name which may contain space characters /// A numeric mode parameter. /// Set to 0 to recieve wallops and be invisible. /// Set to 4 to be invisible and not receive wallops. /// The user's machine logon name public void Login(string nick, string realname, int usermode, string username) { Login(new string[] {nick, nick+"_", nick+"__"}, realname, usermode, username, ""); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users 'nick' name which may NOT contain spaces /// The users 'real' name which may contain space characters /// A numeric mode parameter. /// Set to 0 to recieve wallops and be invisible. /// Set to 4 to be invisible and not receive wallops. public void Login(string nick, string realname, int usermode) { Login(new string[] {nick, nick+"_", nick+"__"}, realname, usermode, "", ""); } /// /// Login parameters required identify with server connection /// /// Login is used at the beginning of connection to specify the username, hostname and realname of a new user. /// The users 'nick' name which may NOT contain spaces /// The users 'real' name which may contain space characters public void Login(string nick, string realname) { Login(new string[] {nick, nick+"_", nick+"__"}, realname, 0, "", ""); } /// /// Determine if a specifier nickname is you /// /// The users 'nick' name which may NOT contain spaces /// True if nickname belongs to you public bool IsMe(string nickname) { return String.Compare(Nickname, nickname, StringComparison.OrdinalIgnoreCase) == 0; } /// /// Determines if your nickname can be found in a specified channel /// /// The name of the channel you wish to query /// True if you are found in channel public bool IsJoined(string channelname) { return IsJoined(channelname, Nickname); } /// /// Determine if a specified nickname can be found in a specified channel /// /// The name of the channel you wish to query /// The users 'nick' name which may NOT contain spaces /// True if nickname is found in channel public bool IsJoined(string channelname, string nickname) { if (channelname == null) { throw new System.ArgumentNullException("channelname"); } if (nickname == null) { throw new System.ArgumentNullException("nickname"); } Channel channel = GetChannel(channelname); if (channel != null && channel.UnsafeUsers != null && channel.UnsafeUsers.ContainsKey(nickname)) { return true; } return false; } /// /// Returns user information /// /// The users 'nick' name which may NOT contain spaces /// IrcUser object of requested nickname public IrcUser GetIrcUser(string nickname) { if (nickname == null) { throw new System.ArgumentNullException("nickname"); } return (IrcUser)_IrcUsers[nickname]; } /// /// Returns extended user information including channel information /// /// The name of the channel you wish to query /// The users 'nick' name which may NOT contain spaces /// ChannelUser object of requested channelname/nickname public ChannelUser GetChannelUser(string channelname, string nickname) { if (channelname == null) { throw new System.ArgumentNullException("channel"); } if (nickname == null) { throw new System.ArgumentNullException("nickname"); } Channel channel = GetChannel(channelname); if (channel != null) { return (ChannelUser)channel.UnsafeUsers[nickname]; } else { return null; } } /// /// /// /// The name of the channel you wish to query /// Channel object of requested channel public Channel GetChannel(string channelname) { if (channelname == null) { throw new System.ArgumentNullException("channelname"); } return (Channel)_Channels[channelname]; } /// /// Gets a list of all joined channels on server /// /// String array of all joined channel names public string[] GetChannels() { string[] channels = new string[_Channels.Values.Count]; int i = 0; foreach (Channel channel in _Channels.Values) { channels[i++] = channel.Name; } return channels; } /// /// Fetches a fresh list of all available channels that match the passed mask /// /// List of ListInfo public IList GetChannelList(string mask) { List list = new List(); lock (_ChannelListSyncRoot) { _ChannelList = list; _ChannelListReceivedEvent = new AutoResetEvent(false); // request list RfcList(mask); // wait till we have the complete list _ChannelListReceivedEvent.WaitOne(); _ChannelListReceivedEvent = null; _ChannelList = null; } return list; } /// /// Fetches a fresh list of users that matches the passed mask /// /// List of ListInfo public IList GetWhoList(string mask) { List list = new List(); lock (_WhoListSyncRoot) { _WhoList = list; _WhoListReceivedEvent = new AutoResetEvent(false); // request list RfcWho(mask); // wait till we have the complete list _WhoListReceivedEvent.WaitOne(); _WhoListReceivedEvent = null; _WhoList = null; } return list; } /// /// Fetches a fresh ban list of the specified channel /// /// List of ListInfo public IList GetBanList(string channel) { List list = new List(); lock (_BanListSyncRoot) { _BanList = list; _BanListReceivedEvent = new AutoResetEvent(false); // request list Ban(channel); // wait till we have the complete list _BanListReceivedEvent.WaitOne(); _BanListReceivedEvent = null; _BanList = null; } return list; } /// /// Fetches a fresh ban-exceptions list from the specified channel. /// public IList GetBanExceptionList(string channel) { List list = new List(); if (!_ServerProperties.BanExceptionCharacter.HasValue) { return list; } lock (_BanExceptListSyncRoot) { _BanExceptList = list; _BanExceptListReceivedEvent = new AutoResetEvent(false); BanException(channel); _BanExceptListReceivedEvent.WaitOne(); _BanExceptListReceivedEvent = null; _BanExceptList = null; } return list; } /// /// Fetches a fresh invite-exceptions list from the specified channel. /// public IList GetInviteExceptionList(string channel) { List list = new List(); if (!_ServerProperties.InviteExceptionCharacter.HasValue) { return list; } lock (_InviteExceptListSyncRoot) { _InviteExceptList = list; _InviteExceptListReceivedEvent = new AutoResetEvent(false); InviteException(channel); _InviteExceptListReceivedEvent.WaitOne(); _InviteExceptListReceivedEvent = null; _InviteExceptList = null; } return list; } public IrcMessageData MessageParser(string rawline) { if (rawline == null) { throw new ArgumentNullException("rawline"); } string line; string[] linear; string messagecode; string from; string nick = null; string ident = null; string host = null; string channel = null; string message = null; ReceiveType type; ReplyCode replycode; int exclamationpos; int atpos; int colonpos; if (rawline.Length == 0) { throw new ArgumentException("Value must not be empty.", "rawline"); } if (rawline[0] == ':') { line = rawline.Substring(1); } else { line = rawline; } linear = line.Split(new char[] {' '}); // conform to RFC 2812 from = linear[0]; messagecode = linear[1]; exclamationpos = from.IndexOf("!", StringComparison.Ordinal); atpos = from.IndexOf("@", StringComparison.Ordinal); colonpos = line.IndexOf(" :", StringComparison.Ordinal); if (colonpos != -1) { // we want the exact position of ":" not beginning from the space colonpos += 1; } if (exclamationpos != -1) { nick = from.Substring(0, exclamationpos); } else { if (atpos == -1) { // no ident and no host, should be nick then if (!from.Contains(".")) { // HACK: from seems to be a nick instead of servername nick = from; } } else { nick = from.Substring(0, atpos); } } if ((atpos != -1) && (exclamationpos != -1)) { ident = from.Substring(exclamationpos+1, (atpos - exclamationpos)-1); } if (atpos != -1) { host = from.Substring(atpos+1); } int tmp; if (int.TryParse(messagecode, out tmp)) { replycode = (ReplyCode) tmp; } else { replycode = ReplyCode.Null; } type = _GetMessageType(rawline); if (colonpos != -1) { message = line.Substring(colonpos + 1); } switch (type) { case ReceiveType.Join: case ReceiveType.Kick: case ReceiveType.Part: case ReceiveType.TopicChange: case ReceiveType.ChannelModeChange: case ReceiveType.ChannelMessage: case ReceiveType.ChannelAction: case ReceiveType.ChannelNotice: channel = linear[2]; break; case ReceiveType.Who: case ReceiveType.Topic: case ReceiveType.Invite: case ReceiveType.BanList: case ReceiveType.ChannelMode: channel = linear[3]; break; case ReceiveType.Name: channel = linear[4]; break; } switch (replycode) { case ReplyCode.List: case ReplyCode.ListEnd: case ReplyCode.ErrorNoChannelModes: case ReplyCode.InviteList: case ReplyCode.ExceptionList: channel = linear[3]; break; } if ((channel != null) && (channel[0] == ':')) { channel = channel.Substring(1); } IrcMessageData data; data = new IrcMessageData(this, from, nick, ident, host, channel, message, rawline, type, replycode); #if LOG4NET Logger.MessageParser.Debug("IrcMessageData "+ "nick: '"+data.Nick+"' "+ "ident: '"+data.Ident+"' "+ "host: '"+data.Host+"' "+ "type: '"+data.Type.ToString()+"' "+ "from: '"+data.From+"' "+ "channel: '"+data.Channel+"' "+ "message: '"+data.Message+"' " ); #endif return data; } // ISUPPORT-honoring versions of some IrcCommands methods public override void BanException(string channel) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ListChannelMasks("+" + bexchar.Value, channel); } else { base.BanException(channel); } } public override void BanException(string channel, string hostmask, Priority priority) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ModifyChannelMasks("+" + bexchar.Value, channel, hostmask, priority); } else { base.BanException(channel, hostmask, priority); } } public override void BanException(string channel, string hostmask) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ModifyChannelMasks("+" + bexchar.Value, channel, hostmask); } else { base.BanException(channel, hostmask); } } public override void BanException(string channel, string[] hostmasks) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ModifyChannelMasks("+" + bexchar.Value, channel, hostmasks); } else { base.BanException(channel, hostmasks); } } public override void UnBanException(string channel, string hostmask, Priority priority) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ModifyChannelMasks("-" + bexchar.Value, channel, hostmask, priority); } else { base.UnBanException(channel, hostmask, priority); } } public override void UnBanException(string channel, string hostmask) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ModifyChannelMasks("-" + bexchar.Value, channel, hostmask); } else { base.UnBanException(channel, hostmask); } } public override void UnBanException(string channel, string[] hostmasks) { var bexchar = _ServerProperties.BanExceptionCharacter; if (bexchar.HasValue) { ModifyChannelMasks("-" + bexchar.Value, channel, hostmasks); } else { base.UnBanException(channel, hostmasks); } } public override void InviteException(string channel) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ListChannelMasks("+" + iexchar.Value, channel); } else { base.InviteException(channel); } } public override void InviteException(string channel, string hostmask, Priority priority) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ModifyChannelMasks("+" + iexchar.Value, channel, hostmask, priority); } else { base.InviteException(channel, hostmask, priority); } } public override void InviteException(string channel, string hostmask) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ModifyChannelMasks("+" + iexchar.Value, channel, hostmask); } else { base.InviteException(channel, hostmask); } } public override void InviteException(string channel, string[] hostmasks) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ModifyChannelMasks("+" + iexchar.Value, channel, hostmasks); } else { base.InviteException(channel, hostmasks); } } public override void UnInviteException(string channel, string hostmask, Priority priority) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ModifyChannelMasks("-" + iexchar.Value, channel, hostmask, priority); } else { base.UnInviteException(channel, hostmask, priority); } } public override void UnInviteException(string channel, string hostmask) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ModifyChannelMasks("-" + iexchar.Value, channel, hostmask); } else { base.UnInviteException(channel, hostmask); } } public override void UnInviteException(string channel, string[] hostmasks) { var iexchar = _ServerProperties.InviteExceptionCharacter; if (iexchar.HasValue) { ModifyChannelMasks("-" + iexchar.Value, channel, hostmasks); } else { base.UnInviteException(channel, hostmasks); } } protected virtual IrcUser CreateIrcUser(string nickname) { return new IrcUser(nickname, this); } protected virtual Channel CreateChannel(string name) { if (_SupportNonRfc) { return new NonRfcChannel(name); } else { return new Channel(name); } } protected virtual ChannelUser CreateChannelUser(string channel, IrcUser ircUser) { if (_SupportNonRfc) { return new NonRfcChannelUser(channel, ircUser); } else { return new ChannelUser(channel, ircUser); } } private void _Worker(object sender, ReadLineEventArgs e) { // lets see if we have events or internal messagehandler for it _HandleEvents(MessageParser(e.Line)); } private void _OnDisconnected(object sender, EventArgs e) { if (AutoRejoin) { _StoreChannelsToRejoin(); } _SyncingCleanup(); } private void _OnConnectionError(object sender, EventArgs e) { try { // AutoReconnect is handled in IrcConnection._OnConnectionError if (AutoReconnect && AutoRelogin) { Login(_NicknameList, Realname, IUsermode, Username, Password); } if (AutoReconnect && AutoRejoin) { _RejoinChannels(); } } catch (NotConnectedException) { // HACK: this is hacky, we don't know if the Reconnect was actually successful // means sending IRC commands without a connection throws NotConnectedExceptions } } private void _StoreChannelsToRejoin() { #if LOG4NET Logger.Connection.Info("Storing channels for rejoin..."); #endif lock (_AutoRejoinChannels) { _AutoRejoinChannels.Clear(); if (ActiveChannelSyncing || PassiveChannelSyncing) { // store the key using channel sync foreach (Channel channel in _Channels.Values) { _AutoRejoinChannels.Add(channel.Name, channel.Key); } } else { foreach (string channel in _JoinedChannels) { _AutoRejoinChannels.Add(channel, null); } } } } private void _RejoinChannels() { #if LOG4NET Logger.Connection.Info("Rejoining channels..."); #endif lock (_AutoRejoinChannels) { RfcJoin(_AutoRejoinChannels.Keys.ToArray(), _AutoRejoinChannels.Values.ToArray(), Priority.High); _AutoRejoinChannels.Clear(); } } private void _SyncingCleanup() { // lets clean it baby, powered by Mr. Proper #if LOG4NET Logger.ChannelSyncing.Debug("Mr. Proper action, cleaning good..."); #endif _JoinedChannels.Clear(); if (ActiveChannelSyncing) { _Channels.Clear(); _IrcUsers.Clear(); } _IsAway = false; _MotdReceived = false; _Motd.Clear(); } /// /// /// private string _NextNickname() { _CurrentNickname++; //if we reach the end stay there if (_CurrentNickname >= _NicknameList.Length) { _CurrentNickname--; } return NicknameList[_CurrentNickname]; } private ReceiveType _GetMessageType(string rawline) { Match found = _ReplyCodeRegex.Match(rawline); if (found.Success) { string code = found.Groups[1].Value; ReplyCode replycode = (ReplyCode)int.Parse(code); // check if this replycode is known in the RFC if (Array.IndexOf(_ReplyCodes, replycode) == -1) { return ReceiveType.Unknown; } switch (replycode) { case ReplyCode.Welcome: case ReplyCode.YourHost: case ReplyCode.Created: case ReplyCode.MyInfo: case ReplyCode.Bounce: return ReceiveType.Login; case ReplyCode.LuserClient: case ReplyCode.LuserOp: case ReplyCode.LuserUnknown: case ReplyCode.LuserMe: case ReplyCode.LuserChannels: return ReceiveType.Info; case ReplyCode.MotdStart: case ReplyCode.Motd: case ReplyCode.EndOfMotd: return ReceiveType.Motd; case ReplyCode.NamesReply: case ReplyCode.EndOfNames: return ReceiveType.Name; case ReplyCode.WhoReply: case ReplyCode.EndOfWho: return ReceiveType.Who; case ReplyCode.ListStart: case ReplyCode.List: case ReplyCode.ListEnd: return ReceiveType.List; case ReplyCode.BanList: case ReplyCode.EndOfBanList: return ReceiveType.BanList; case ReplyCode.Topic: case ReplyCode.NoTopic: return ReceiveType.Topic; case ReplyCode.WhoIsUser: case ReplyCode.WhoIsServer: case ReplyCode.WhoIsOperator: case ReplyCode.WhoIsIdle: case ReplyCode.WhoIsChannels: case ReplyCode.EndOfWhoIs: return ReceiveType.WhoIs; case ReplyCode.WhoWasUser: case ReplyCode.EndOfWhoWas: return ReceiveType.WhoWas; case ReplyCode.UserModeIs: return ReceiveType.UserMode; case ReplyCode.ChannelModeIs: return ReceiveType.ChannelMode; default: if (((int)replycode >= 400) && ((int)replycode <= 599)) { return ReceiveType.ErrorMessage; } else { #if LOG4NET Logger.MessageTypes.Debug("replycode unknown ("+code+"): \""+rawline+"\""); #endif return ReceiveType.Unknown; } } } found = _PingRegex.Match(rawline); if (found.Success) { return ReceiveType.Unknown; } found = _ErrorRegex.Match(rawline); if (found.Success) { return ReceiveType.Error; } found = _ActionRegex.Match(rawline); if (found.Success) { switch (found.Groups[1].Value) { case "#": case "!": case "&": case "+": return ReceiveType.ChannelAction; default: return ReceiveType.QueryAction; } } found = _CtcpRequestRegex.Match(rawline); if (found.Success) { return ReceiveType.CtcpRequest; } found = _MessageRegex.Match(rawline); if (found.Success) { switch (found.Groups[1].Value) { case "#": case "!": case "&": case "+": return ReceiveType.ChannelMessage; default: return ReceiveType.QueryMessage; } } found = _CtcpReplyRegex.Match(rawline); if (found.Success) { return ReceiveType.CtcpReply; } found = _NoticeRegex.Match(rawline); if (found.Success) { switch (found.Groups[1].Value) { case "#": case "!": case "&": case "+": return ReceiveType.ChannelNotice; default: return ReceiveType.QueryNotice; } } found = _InviteRegex.Match(rawline); if (found.Success) { return ReceiveType.Invite; } found = _JoinRegex.Match(rawline); if (found.Success) { return ReceiveType.Join; } found = _TopicRegex.Match(rawline); if (found.Success) { return ReceiveType.TopicChange; } found = _NickRegex.Match(rawline); if (found.Success) { return ReceiveType.NickChange; } found = _KickRegex.Match(rawline); if (found.Success) { return ReceiveType.Kick; } found = _PartRegex.Match(rawline); if (found.Success) { return ReceiveType.Part; } found = _ModeRegex.Match(rawline); if (found.Success) { if (IsMe(found.Groups[1].Value)) { return ReceiveType.UserModeChange; } else { return ReceiveType.ChannelModeChange; } } found = _QuitRegex.Match(rawline); if (found.Success) { return ReceiveType.Quit; } #if LOG4NET Logger.MessageTypes.Debug("messagetype unknown: \""+rawline+"\""); #endif return ReceiveType.Unknown; } private void _HandleEvents(IrcMessageData ircdata) { if (OnRawMessage != null) { OnRawMessage(this, new IrcEventArgs(ircdata)); } string code; // special IRC messages code = ircdata.RawMessageArray[0]; switch (code) { case "PING": _Event_PING(ircdata); break; case "ERROR": _Event_ERROR(ircdata); break; } code = ircdata.RawMessageArray[1]; switch (code) { case "PRIVMSG": _Event_PRIVMSG(ircdata); break; case "NOTICE": _Event_NOTICE(ircdata); break; case "JOIN": _Event_JOIN(ircdata); break; case "PART": _Event_PART(ircdata); break; case "KICK": _Event_KICK(ircdata); break; case "QUIT": _Event_QUIT(ircdata); break; case "TOPIC": _Event_TOPIC(ircdata); break; case "NICK": _Event_NICK(ircdata); break; case "INVITE": _Event_INVITE(ircdata); break; case "MODE": _Event_MODE(ircdata); break; case "PONG": _Event_PONG(ircdata); break; } if (ircdata.ReplyCode != ReplyCode.Null) { switch (ircdata.ReplyCode) { case ReplyCode.Welcome: _Event_RPL_WELCOME(ircdata); break; case ReplyCode.Topic: _Event_RPL_TOPIC(ircdata); break; case ReplyCode.NoTopic: _Event_RPL_NOTOPIC(ircdata); break; case ReplyCode.NamesReply: _Event_RPL_NAMREPLY(ircdata); break; case ReplyCode.EndOfNames: _Event_RPL_ENDOFNAMES(ircdata); break; case ReplyCode.List: _Event_RPL_LIST(ircdata); break; case ReplyCode.ListEnd: _Event_RPL_LISTEND(ircdata); break; case ReplyCode.WhoReply: _Event_RPL_WHOREPLY(ircdata); break; case ReplyCode.EndOfWho: _Event_RPL_ENDOFWHO(ircdata); break; case ReplyCode.ChannelModeIs: _Event_RPL_CHANNELMODEIS(ircdata); break; case ReplyCode.BanList: _Event_RPL_BANLIST(ircdata); break; case ReplyCode.EndOfBanList: _Event_RPL_ENDOFBANLIST(ircdata); break; case ReplyCode.ErrorNoChannelModes: _Event_ERR_NOCHANMODES(ircdata); break; case ReplyCode.Motd: _Event_RPL_MOTD(ircdata); break; case ReplyCode.EndOfMotd: _Event_RPL_ENDOFMOTD(ircdata); break; case ReplyCode.Away: _Event_RPL_AWAY(ircdata); break; case ReplyCode.UnAway: _Event_RPL_UNAWAY(ircdata); break; case ReplyCode.NowAway: _Event_RPL_NOWAWAY(ircdata); break; case ReplyCode.TryAgain: _Event_RPL_TRYAGAIN(ircdata); break; case ReplyCode.ErrorNicknameInUse: _Event_ERR_NICKNAMEINUSE(ircdata); break; case ReplyCode.InviteList: _Event_RPL_INVITELIST(ircdata); break; case ReplyCode.EndOfInviteList: _Event_RPL_ENDOFINVITELIST(ircdata); break; case ReplyCode.ExceptionList: _Event_RPL_EXCEPTLIST(ircdata); break; case ReplyCode.EndOfExceptionList: _Event_RPL_ENDOFEXCEPTLIST(ircdata); break; case ReplyCode.Bounce: _Event_RPL_BOUNCE(ircdata); break; } } if (ircdata.Type == ReceiveType.ErrorMessage) { _Event_ERR(ircdata); } } /// /// Removes a specified user from all channel lists /// /// The users 'nick' name which may NOT contain spaces private bool _RemoveIrcUser(string nickname) { IrcUser user = GetIrcUser(nickname); if (user != null) { if (user.JoinedChannels.Length == 0) { // he is nowhere else, lets kill him _IrcUsers.Remove(nickname); return true; } } return false; } /// /// Removes a specified user from a specified channel list /// /// The name of the channel you wish to query /// The users 'nick' name which may NOT contain spaces private void _RemoveChannelUser(string channelname, string nickname) { Channel chan = GetChannel(channelname); chan.UnsafeUsers.Remove(nickname); chan.UnsafeOps.Remove(nickname); chan.UnsafeVoices.Remove(nickname); if (SupportNonRfc) { NonRfcChannel nchan = (NonRfcChannel)chan; nchan.UnsafeOwners.Remove(nickname); nchan.UnsafeChannelAdmins.Remove(nickname); nchan.UnsafeHalfops.Remove(nickname); } } /// /// /// /// Message data containing channel mode information /// Channel mode /// List of supplied paramaters private void _InterpretChannelMode(IrcMessageData ircdata, List changeInfos) { Channel channel = null; if (ActiveChannelSyncing) { channel = GetChannel(ircdata.Channel); } foreach (var changeInfo in changeInfos) { var temp = changeInfo.Parameter; var add = changeInfo.Action == ChannelModeChangeAction.Set; var remove = changeInfo.Action == ChannelModeChangeAction.Unset; switch (changeInfo.Mode) { case ChannelMode.Op: if (add) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the op list try { channel.UnsafeOps.Add(temp, GetIrcUser(temp)); #if LOG4NET Logger.ChannelSyncing.Debug("added op: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate op: "+temp+" in: "+ircdata.Channel+" not added"); #endif } // update the user op status ChannelUser cuser = GetChannelUser(ircdata.Channel, temp); cuser.IsOp = true; #if LOG4NET Logger.ChannelSyncing.Debug("set op status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnOp != null) { OnOp(this, new OpEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the op list channel.UnsafeOps.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed op: "+temp+" from: "+ircdata.Channel); #endif // update the user op status ChannelUser cuser = GetChannelUser(ircdata.Channel, temp); cuser.IsOp = false; #if LOG4NET Logger.ChannelSyncing.Debug("unset op status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnDeop != null) { OnDeop(this, new DeopEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } break; case ChannelMode.Owner: if (SupportNonRfc) { if (add) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the owner list try { ((NonRfcChannel)channel).UnsafeOwners.Add(temp, GetIrcUser(temp)); #if LOG4NET Logger.ChannelSyncing.Debug("added owner: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate owner: "+temp+" in: "+ircdata.Channel+" not added"); #endif } // update the user owner status NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp); cuser.IsOwner = true; #if LOG4NET Logger.ChannelSyncing.Debug("set owner status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnOwner != null) { OnOwner(this, new OwnerEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the owner list ((NonRfcChannel)channel).UnsafeOwners.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed owner: "+temp+" from: "+ircdata.Channel); #endif // update the user owner status NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp); cuser.IsOwner = false; #if LOG4NET Logger.ChannelSyncing.Debug("unset owner status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnDeowner != null) { OnDeowner(this, new DeownerEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } } break; case ChannelMode.Admin: if (SupportNonRfc) { if (add) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the channel admin list try { ((NonRfcChannel)channel).UnsafeChannelAdmins.Add(temp, GetIrcUser(temp)); #if LOG4NET Logger.ChannelSyncing.Debug("added channel admin: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate channel admin: "+temp+" in: "+ircdata.Channel+" not added"); #endif } // update the user channel admin status NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp); cuser.IsChannelAdmin = true; #if LOG4NET Logger.ChannelSyncing.Debug("set channel admin status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnChannelAdmin != null) { OnChannelAdmin(this, new ChannelAdminEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the channel admin list ((NonRfcChannel)channel).UnsafeChannelAdmins.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed channel admin: "+temp+" from: "+ircdata.Channel); #endif // update the user channel admin status NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp); cuser.IsChannelAdmin = false; #if LOG4NET Logger.ChannelSyncing.Debug("unset channel admin status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnDeChannelAdmin != null) { OnDeChannelAdmin(this, new DeChannelAdminEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } } break; case ChannelMode.HalfOp: if (SupportNonRfc) { if (add) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the halfop list try { ((NonRfcChannel)channel).UnsafeHalfops.Add(temp, GetIrcUser(temp)); #if LOG4NET Logger.ChannelSyncing.Debug("added halfop: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate halfop: "+temp+" in: "+ircdata.Channel+" not added"); #endif } // update the user halfop status NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp); cuser.IsHalfop = true; #if LOG4NET Logger.ChannelSyncing.Debug("set halfop status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnHalfop != null) { OnHalfop(this, new HalfopEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the halfop list ((NonRfcChannel)channel).UnsafeHalfops.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed halfop: "+temp+" from: "+ircdata.Channel); #endif // update the user halfop status NonRfcChannelUser cuser = (NonRfcChannelUser)GetChannelUser(ircdata.Channel, temp); cuser.IsHalfop = false; #if LOG4NET Logger.ChannelSyncing.Debug("unset halfop status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnDehalfop != null) { OnDehalfop(this, new DehalfopEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } } break; case ChannelMode.Voice: if (add) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the voice list try { channel.UnsafeVoices.Add(temp, GetIrcUser(temp)); #if LOG4NET Logger.ChannelSyncing.Debug("added voice: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate voice: "+temp+" in: "+ircdata.Channel+" not added"); #endif } // update the user voice status ChannelUser cuser = GetChannelUser(ircdata.Channel, temp); cuser.IsVoice = true; #if LOG4NET Logger.ChannelSyncing.Debug("set voice status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnVoice != null) { OnVoice(this, new VoiceEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { // sanity check if (GetChannelUser(ircdata.Channel, temp) != null) { // update the voice list channel.UnsafeVoices.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed voice: "+temp+" from: "+ircdata.Channel); #endif // update the user voice status ChannelUser cuser = GetChannelUser(ircdata.Channel, temp); cuser.IsVoice = false; #if LOG4NET Logger.ChannelSyncing.Debug("unset voice status: " + temp + " for: "+ircdata.Channel); #endif } else { #if LOG4NET Logger.ChannelSyncing.Error("_InterpretChannelMode(): GetChannelUser(" + ircdata.Channel + "," + temp + ") returned null! Ignoring..."); #endif } } if (OnDevoice != null) { OnDevoice(this, new DevoiceEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } break; case ChannelMode.Ban: if (add) { if (ActiveChannelSyncing && channel != null) { try { channel.Bans.Add(temp); #if LOG4NET Logger.ChannelSyncing.Debug("added ban: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate ban: "+temp+" in: "+ircdata.Channel+" not added"); #endif } } if (OnBan != null) { OnBan(this, new BanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { channel.Bans.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed ban: "+temp+" from: "+ircdata.Channel); #endif } if (OnUnban != null) { OnUnban(this, new UnbanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } break; case ChannelMode.BanException: if (add) { if (ActiveChannelSyncing && channel != null) { try { channel.BanExceptions.Add(temp); #if LOG4NET Logger.ChannelSyncing.Debug("added ban exception: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate ban exception: "+temp+" in: "+ircdata.Channel+" not added"); #endif } } if (OnBanException != null) { OnBanException(this, new BanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { channel.BanExceptions.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed ban exception: "+temp+" from: "+ircdata.Channel); #endif } if (OnUnBanException != null) { OnUnBanException(this, new UnbanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } break; case ChannelMode.InviteException: if (add) { if (ActiveChannelSyncing && channel != null) { try { channel.InviteExceptions.Add(temp); #if LOG4NET Logger.ChannelSyncing.Debug("added invite exception: "+temp+" to: "+ircdata.Channel); #endif } catch (ArgumentException) { #if LOG4NET Logger.ChannelSyncing.Debug("duplicate invite exception: "+temp+" in: "+ircdata.Channel+" not added"); #endif } } if (OnInviteException != null) { OnInviteException(this, new BanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } if (remove) { if (ActiveChannelSyncing && channel != null) { channel.InviteExceptions.Remove(temp); #if LOG4NET Logger.ChannelSyncing.Debug("removed invite exception: "+temp+" from: "+ircdata.Channel); #endif } if (OnUnInviteException != null) { OnUnInviteException(this, new UnbanEventArgs(ircdata, ircdata.Channel, ircdata.Nick, temp)); } } break; case ChannelMode.UserLimit: if (add) { if (ActiveChannelSyncing && channel != null) { try { channel.UserLimit = int.Parse(temp); #if LOG4NET Logger.ChannelSyncing.Debug("stored user limit for: "+ircdata.Channel); #endif } catch (FormatException) { #if LOG4NET Logger.ChannelSyncing.Error("could not parse user limit: "+temp+" channel: "+ircdata.Channel); #endif } } } if (remove) { if (ActiveChannelSyncing && channel != null) { channel.UserLimit = 0; #if LOG4NET Logger.ChannelSyncing.Debug("removed user limit for: "+ircdata.Channel); #endif } } break; case ChannelMode.Key: if (add) { if (ActiveChannelSyncing && channel != null) { channel.Key = temp; #if LOG4NET Logger.ChannelSyncing.Debug("stored channel key for: "+ircdata.Channel); #endif } } if (remove) { if (ActiveChannelSyncing && channel != null) { channel.Key = ""; #if LOG4NET Logger.ChannelSyncing.Debug("removed channel key for: "+ircdata.Channel); #endif } } break; default: if (add) { if (ActiveChannelSyncing && channel != null) { if (channel.Mode.IndexOf(changeInfo.ModeChar) == -1) { channel.Mode += changeInfo.ModeChar; #if LOG4NET Logger.ChannelSyncing.Debug("added channel mode ("+changeInfo.ModeChar+") for: "+ircdata.Channel); #endif } } } if (remove) { if (ActiveChannelSyncing && channel != null) { channel.Mode = channel.Mode.Replace(changeInfo.ModeChar.ToString(), String.Empty); #if LOG4NET Logger.ChannelSyncing.Debug("removed channel mode ("+changeInfo.ModeChar+") for: "+ircdata.Channel); #endif } } break; } } } #region Internal Messagehandlers /// /// Event handler for ping messages /// /// Message data containing ping information private void _Event_PING(IrcMessageData ircdata) { string server = ircdata.RawMessageArray[1].Substring(1); #if LOG4NET Logger.Connection.Debug("Ping? Pong!"); #endif RfcPong(server, Priority.Critical); if (OnPing != null) { OnPing(this, new PingEventArgs(ircdata, server)); } } /// /// Event handler for PONG messages /// /// Message data containing pong information private void _Event_PONG(IrcMessageData ircdata) { if (OnPong != null) { OnPong(this, new PongEventArgs(ircdata, ircdata.Irc.Lag)); } } /// /// Event handler for error messages /// /// Message data containing error information private void _Event_ERROR(IrcMessageData ircdata) { string message = ircdata.Message; #if LOG4NET Logger.Connection.Info("received ERROR from IRC server"); #endif if (OnError != null) { OnError(this, new ErrorEventArgs(ircdata, message)); } } /// /// Event handler for join messages /// /// Message data containing join information private void _Event_JOIN(IrcMessageData ircdata) { string who = ircdata.Nick; string channelname = ircdata.Channel; if (IsMe(who)) { _JoinedChannels.Add(channelname); } if (ActiveChannelSyncing) { Channel channel; if (IsMe(who)) { // we joined the channel #if LOG4NET Logger.ChannelSyncing.Debug("joining channel: "+channelname); #endif channel = CreateChannel(channelname); _Channels.Add(channelname, channel); // request channel mode RfcMode(channelname); // request wholist RfcWho(channelname); // request ban exception list if (_ServerProperties.BanExceptionCharacter.HasValue) { BanException(channelname); } // request invite exception list if (_ServerProperties.InviteExceptionCharacter.HasValue) { InviteException(channelname); } // request banlist Ban(channelname); } else { // someone else joined the channel // request the who data RfcWho(who); } #if LOG4NET Logger.ChannelSyncing.Debug(who+" joins channel: "+channelname); #endif channel = GetChannel(channelname); IrcUser ircuser = GetIrcUser(who); if (ircuser == null) { ircuser = new IrcUser(who, this); ircuser.Ident = ircdata.Ident; ircuser.Host = ircdata.Host; _IrcUsers.Add(who, ircuser); } // HACK: IRCnet's anonymous channel mode feature breaks our // channnel sync here as they use the same nick for ALL channel // users! // Example: :anonymous!anonymous@anonymous. JOIN :$channel if (who == "anonymous" && ircdata.Ident == "anonymous" && ircdata.Host == "anonymous." && IsJoined(channelname, who)) { // ignore } else { ChannelUser channeluser = CreateChannelUser(channelname, ircuser); channel.UnsafeUsers[who] = channeluser; } } if (OnJoin != null) { OnJoin(this, new JoinEventArgs(ircdata, channelname, who)); } } /// /// Event handler for part messages /// /// Message data containing part information private void _Event_PART(IrcMessageData ircdata) { string who = ircdata.Nick; string channel = ircdata.Channel; string partmessage = ircdata.Message; if (IsMe(who)) { _JoinedChannels.Remove(channel); } if (ActiveChannelSyncing) { if (IsMe(who)) { #if LOG4NET Logger.ChannelSyncing.Debug("parting channel: "+channel); #endif _Channels.Remove(channel); } else { #if LOG4NET Logger.ChannelSyncing.Debug(who+" parts channel: "+channel); #endif // HACK: IRCnet's anonymous channel mode feature breaks our // channnel sync here as they use the same nick for ALL channel // users! // Example: :anonymous!anonymous@anonymous. PART $channel :$msg if (who == "anonymous" && ircdata.Ident == "anonymous" && ircdata.Host == "anonymous." && !IsJoined(channel, who)) { // ignore } else { _RemoveChannelUser(channel, who); _RemoveIrcUser(who); } } } if (OnPart != null) { OnPart(this, new PartEventArgs(ircdata, channel, who, partmessage)); } } /// /// Event handler for kick messages /// /// Message data containing kick information private void _Event_KICK(IrcMessageData ircdata) { string channelname = ircdata.Channel; string who = ircdata.Nick; if (String.IsNullOrEmpty(who)) { // the server itself kicked who = ircdata.From; } string whom = ircdata.RawMessageArray[3]; string reason = ircdata.Message; bool isme = IsMe(whom); if (isme) { _JoinedChannels.Remove(channelname); } if (ActiveChannelSyncing) { if (isme) { Channel channel = GetChannel(channelname); _Channels.Remove(channelname); if (_AutoRejoinOnKick) { RfcJoin(channel.Name, channel.Key); } } else { _RemoveChannelUser(channelname, whom); _RemoveIrcUser(whom); } } else { if (isme && AutoRejoinOnKick) { RfcJoin(channelname); } } if (OnKick != null) { OnKick(this, new KickEventArgs(ircdata, channelname, who, whom, reason)); } } /// /// Event handler for quit messages /// /// Message data containing quit information private void _Event_QUIT(IrcMessageData ircdata) { string who = ircdata.Nick; string reason = ircdata.Message; // no need to handle if we quit, disconnect event will take care if (ActiveChannelSyncing) { // sanity checks, freshirc is very broken about RFC IrcUser user = GetIrcUser(who); if (user != null) { string[] joined_channels = user.JoinedChannels; if (joined_channels != null) { foreach (string channel in joined_channels) { _RemoveChannelUser(channel, who); } _RemoveIrcUser(who); #if LOG4NET } else { Logger.ChannelSyncing.Error("user.JoinedChannels (for: '"+who+"') returned null in _Event_QUIT! Ignoring..."); #endif } #if LOG4NET } else { Logger.ChannelSyncing.Error("GetIrcUser("+who+") returned null in _Event_QUIT! Ignoring..."); #endif } } if (OnQuit != null) { OnQuit(this, new QuitEventArgs(ircdata, who, reason)); } } /// /// Event handler for private messages /// /// Message data containing private message information private void _Event_PRIVMSG(IrcMessageData ircdata) { switch (ircdata.Type) { case ReceiveType.ChannelMessage: if (OnChannelMessage != null) { OnChannelMessage(this, new IrcEventArgs(ircdata)); } break; case ReceiveType.ChannelAction: if (OnChannelAction != null) { string action = ircdata.Message.Substring(8, ircdata.Message.Length - 9); OnChannelAction(this, new ActionEventArgs(ircdata, action)); } break; case ReceiveType.QueryMessage: if (OnQueryMessage != null) { OnQueryMessage(this, new IrcEventArgs(ircdata)); } break; case ReceiveType.QueryAction: if (OnQueryAction != null) { string action = ircdata.Message.Substring(8, ircdata.Message.Length - 9); OnQueryAction(this, new ActionEventArgs(ircdata, action)); } break; case ReceiveType.CtcpRequest: if (OnCtcpRequest != null) { int space_pos = ircdata.Message.IndexOf(' '); string cmd = ""; string param = ""; if (space_pos != -1) { cmd = ircdata.Message.Substring(1, space_pos - 1); param = ircdata.Message.Substring(space_pos + 1, ircdata.Message.Length - space_pos - 2); } else { cmd = ircdata.Message.Substring(1, ircdata.Message.Length - 2); } OnCtcpRequest(this, new CtcpEventArgs(ircdata, cmd, param)); } break; } } /// /// Event handler for notice messages /// /// Message data containing notice information private void _Event_NOTICE(IrcMessageData ircdata) { switch (ircdata.Type) { case ReceiveType.ChannelNotice: if (OnChannelNotice != null) { OnChannelNotice(this, new IrcEventArgs(ircdata)); } break; case ReceiveType.QueryNotice: if (OnQueryNotice != null) { OnQueryNotice(this, new IrcEventArgs(ircdata)); } break; case ReceiveType.CtcpReply: if (OnCtcpReply != null) { int space_pos = ircdata.Message.IndexOf(' '); string cmd = ""; string param = ""; if (space_pos != -1) { cmd = ircdata.Message.Substring(1, space_pos - 1); param = ircdata.Message.Substring(space_pos + 1, ircdata.Message.Length - space_pos - 2); } else { cmd = ircdata.Message.Substring(1, ircdata.Message.Length - 2); } OnCtcpReply(this, new CtcpEventArgs(ircdata, cmd, param)); } break; } } /// /// Event handler for topic messages /// /// Message data containing topic information private void _Event_TOPIC(IrcMessageData ircdata) { string who = ircdata.Nick; string channel = ircdata.Channel; string newtopic = ircdata.Message; if (ActiveChannelSyncing && IsJoined(channel)) { GetChannel(channel).Topic = newtopic; #if LOG4NET Logger.ChannelSyncing.Debug("stored topic for channel: "+channel); #endif } if (OnTopicChange != null) { OnTopicChange(this, new TopicChangeEventArgs(ircdata, channel, who, newtopic)); } } /// /// Event handler for nickname messages /// /// Message data containing nickname information private void _Event_NICK(IrcMessageData ircdata) { string oldnickname = ircdata.Nick; //string newnickname = ircdata.Message; // the colon in the NICK message is optional, thus we can't rely on Message string newnickname = ircdata.RawMessageArray[2]; // so let's strip the colon if it's there if (newnickname.StartsWith(":")) { newnickname = newnickname.Substring(1); } if (IsMe(ircdata.Nick)) { // nickname change is your own _Nickname = newnickname; } if (ActiveChannelSyncing) { IrcUser ircuser = GetIrcUser(oldnickname); // if we don't have any info about him, don't update him! // (only queries or ourself in no channels) if (ircuser != null) { string[] joinedchannels = ircuser.JoinedChannels; // update his nickname ircuser.Nick = newnickname; // remove the old entry // remove first to avoid duplication, Foo -> foo _IrcUsers.Remove(oldnickname); // add him as new entry and new nickname as key _IrcUsers.Add(newnickname, ircuser); #if LOG4NET Logger.ChannelSyncing.Debug("updated nickname of: "+oldnickname+" to: "+newnickname); #endif // now the same for all channels he is joined Channel channel; ChannelUser channeluser; foreach (string channelname in joinedchannels) { channel = GetChannel(channelname); channeluser = GetChannelUser(channelname, oldnickname); // remove first to avoid duplication, Foo -> foo channel.UnsafeUsers.Remove(oldnickname); channel.UnsafeUsers.Add(newnickname, channeluser); if (SupportNonRfc && ((NonRfcChannelUser)channeluser).IsOwner) { NonRfcChannel nchannel = (NonRfcChannel)channel; nchannel.UnsafeOwners.Remove(oldnickname); nchannel.UnsafeOwners.Add(newnickname, channeluser); } if (SupportNonRfc && ((NonRfcChannelUser)channeluser).IsChannelAdmin) { NonRfcChannel nchannel = (NonRfcChannel)channel; nchannel.UnsafeChannelAdmins.Remove(oldnickname); nchannel.UnsafeChannelAdmins.Add(newnickname, channeluser); } if (channeluser.IsOp) { channel.UnsafeOps.Remove(oldnickname); channel.UnsafeOps.Add(newnickname, channeluser); } if (SupportNonRfc && ((NonRfcChannelUser)channeluser).IsHalfop) { NonRfcChannel nchannel = (NonRfcChannel)channel; nchannel.UnsafeHalfops.Remove(oldnickname); nchannel.UnsafeHalfops.Add(newnickname, channeluser); } if (channeluser.IsVoice) { channel.UnsafeVoices.Remove(oldnickname); channel.UnsafeVoices.Add(newnickname, channeluser); } } } } if (OnNickChange != null) { OnNickChange(this, new NickChangeEventArgs(ircdata, oldnickname, newnickname)); } } /// /// Event handler for invite messages /// /// Message data containing invite information private void _Event_INVITE(IrcMessageData ircdata) { string channel = ircdata.Channel; string inviter = ircdata.Nick; if (AutoJoinOnInvite) { if (channel.Trim() != "0") { RfcJoin(channel); } } if (OnInvite != null) { OnInvite(this, new InviteEventArgs(ircdata, channel, inviter)); } } /// /// Event handler for mode messages /// /// Message data containing mode information private void _Event_MODE(IrcMessageData ircdata) { if (IsMe(ircdata.RawMessageArray[2])) { // my user mode changed _Usermode = ircdata.RawMessageArray[3].Substring(1); if (OnUserModeChange != null) { OnUserModeChange(this, new IrcEventArgs(ircdata)); } } else { // channel mode changed string mode = ircdata.RawMessageArray[3]; string parameter = String.Join(" ", ircdata.RawMessageArray, 4, ircdata.RawMessageArray.Length-4); var changeInfos = ChannelModeChangeInfo.Parse( ChannelModeMap, ircdata.Channel, mode, parameter ); _InterpretChannelMode(ircdata, changeInfos); if (OnChannelModeChange != null) { OnChannelModeChange( this, new ChannelModeChangeEventArgs( ircdata, ircdata.Channel, changeInfos ) ); } } if (OnModeChange != null) { OnModeChange(this, new IrcEventArgs(ircdata)); } } /// /// Event handler for channel mode reply messages /// /// Message data containing reply information private void _Event_RPL_CHANNELMODEIS(IrcMessageData ircdata) { if (ActiveChannelSyncing && IsJoined(ircdata.Channel)) { // reset stored mode first, as this is the complete mode Channel chan = GetChannel(ircdata.Channel); chan.Mode = String.Empty; string mode = ircdata.RawMessageArray[4]; string parameter = String.Join(" ", ircdata.RawMessageArray, 5, ircdata.RawMessageArray.Length-5); var changeInfos = ChannelModeChangeInfo.Parse( ChannelModeMap, ircdata.Channel, mode, parameter ); _InterpretChannelMode(ircdata, changeInfos); } } /// /// Event handler for welcome reply messages /// /// /// Upon success, the client will receive an RPL_WELCOME (for users) or /// RPL_YOURESERVICE (for services) message indicating that the /// connection is now registered and known the to the entire IRC network. /// The reply message MUST contain the full client identifier upon which /// it was registered. /// /// Message data containing reply information private void _Event_RPL_WELCOME(IrcMessageData ircdata) { // updating our nickname, that we got (maybe cutted...) _Nickname = ircdata.RawMessageArray[2]; if (OnRegistered != null) { OnRegistered(this, EventArgs.Empty); } } private void _Event_RPL_TOPIC(IrcMessageData ircdata) { string topic = ircdata.Message; string channel = ircdata.Channel; if (ActiveChannelSyncing && IsJoined(channel)) { GetChannel(channel).Topic = topic; #if LOG4NET Logger.ChannelSyncing.Debug("stored topic for channel: "+channel); #endif } if (OnTopic != null) { OnTopic(this, new TopicEventArgs(ircdata, channel, topic)); } } private void _Event_RPL_NOTOPIC(IrcMessageData ircdata) { string channel = ircdata.Channel; if (ActiveChannelSyncing && IsJoined(channel)) { GetChannel(channel).Topic = ""; #if LOG4NET Logger.ChannelSyncing.Debug("stored empty topic for channel: "+channel); #endif } if (OnTopic != null) { OnTopic(this, new TopicEventArgs(ircdata, channel, "")); } } private void _Event_RPL_NAMREPLY(IrcMessageData ircdata) { string channelname = ircdata.Channel; string[] userlist = ircdata.MessageArray; // HACK: BIP skips the colon after the channel name even though // RFC 1459 and 2812 says it's mandantory in RPL_NAMREPLY if (userlist == null) { if (ircdata.RawMessageArray.Length > 5) { userlist = new string[] { ircdata.RawMessageArray[5] }; } else { userlist = new string[] {}; } } if (ActiveChannelSyncing && IsJoined(channelname)) { string nickname; bool owner; bool chanadmin; bool op; bool halfop; bool voice; foreach (string user in userlist) { if (user.Length <= 0) { continue; } owner = false; chanadmin = false; op = false; halfop = false; voice = false; nickname = user; char mode; foreach (var kvp in _ServerProperties.ChannelPrivilegeModesPrefixes) { if (nickname[0] == kvp.Value) { nickname = nickname.Substring(1); switch(kvp.Key) { case 'q': owner = true; break; case 'a': chanadmin = true; break; case 'o': op = true; break; case 'h': halfop = true; break; case 'v': voice = true; break; } } } IrcUser ircuser = GetIrcUser(nickname); ChannelUser channeluser = GetChannelUser(channelname, nickname); if (ircuser == null) { #if LOG4NET Logger.ChannelSyncing.Debug("creating IrcUser: "+nickname+" because he doesn't exist yet"); #endif ircuser = new IrcUser(nickname, this); _IrcUsers.Add(nickname, ircuser); } if (channeluser == null) { #if LOG4NET Logger.ChannelSyncing.Debug("creating ChannelUser: "+nickname+" for Channel: "+channelname+" because he doesn't exist yet"); #endif channeluser = CreateChannelUser(channelname, ircuser); Channel channel = GetChannel(channelname); channel.UnsafeUsers.Add(nickname, channeluser); if (SupportNonRfc && owner) { ((NonRfcChannel)channel).UnsafeOwners.Add(nickname, channeluser); #if LOG4NET Logger.ChannelSyncing.Debug("added owner: "+nickname+" to: "+channelname); #endif } if (SupportNonRfc && chanadmin) { ((NonRfcChannel)channel).UnsafeChannelAdmins.Add(nickname, channeluser); #if LOG4NET Logger.ChannelSyncing.Debug("added channel admin: "+nickname+" to: "+channelname); #endif } if (op) { channel.UnsafeOps.Add(nickname, channeluser); #if LOG4NET Logger.ChannelSyncing.Debug("added op: "+nickname+" to: "+channelname); #endif } if (SupportNonRfc && halfop) { ((NonRfcChannel)channel).UnsafeHalfops.Add(nickname, channeluser); #if LOG4NET Logger.ChannelSyncing.Debug("added halfop: "+nickname+" to: "+channelname); #endif } if (voice) { channel.UnsafeVoices.Add(nickname, channeluser); #if LOG4NET Logger.ChannelSyncing.Debug("added voice: "+nickname+" to: "+channelname); #endif } } channeluser.IsOp = op; channeluser.IsVoice = voice; if (SupportNonRfc) { var nchanneluser = (NonRfcChannelUser)channeluser; nchanneluser.IsOwner = owner; nchanneluser.IsChannelAdmin = chanadmin; nchanneluser.IsHalfop = halfop; } } } var filteredUserlist = new List(userlist.Length); // filter user modes from nicknames foreach (string user in userlist) { if (String.IsNullOrEmpty(user)) { continue; } string temp = user; foreach (var kvp in _ServerProperties.ChannelPrivilegeModesPrefixes) { if (temp[0] == kvp.Value) { temp = temp.Substring(1); } } filteredUserlist.Add(temp); } if (OnNames != null) { OnNames(this, new NamesEventArgs(ircdata, channelname, filteredUserlist.ToArray(), userlist)); } } private void _Event_RPL_LIST(IrcMessageData ircdata) { string channelName = ircdata.Channel; int userCount = Int32.Parse(ircdata.RawMessageArray[4]); string topic = ircdata.Message; ChannelInfo info = null; if (OnList != null || _ChannelList != null) { info = new ChannelInfo(channelName, userCount, topic); } if (_ChannelList != null) { _ChannelList.Add(info); } if (OnList != null) { OnList(this, new ListEventArgs(ircdata, info)); } } private void _Event_RPL_LISTEND(IrcMessageData ircdata) { if (_ChannelListReceivedEvent != null) { _ChannelListReceivedEvent.Set(); } } private void _Event_RPL_TRYAGAIN(IrcMessageData ircdata) { if (_ChannelListReceivedEvent != null) { _ChannelListReceivedEvent.Set(); } } /* // BUG: RFC2812 says LIST and WHO might return ERR_TOOMANYMATCHES which // is not defined :( private void _Event_ERR_TOOMANYMATCHES(IrcMessageData ircdata) { if (_ListInfosReceivedEvent != null) { _ListInfosReceivedEvent.Set(); } } */ private void _Event_RPL_ENDOFNAMES(IrcMessageData ircdata) { string channelname = ircdata.RawMessageArray[3]; if (ActiveChannelSyncing && IsJoined(channelname)) { #if LOG4NET Logger.ChannelSyncing.Debug("passive synced: "+channelname); #endif if (OnChannelPassiveSynced != null) { OnChannelPassiveSynced(this, new IrcEventArgs(ircdata)); } } } private void _Event_RPL_AWAY(IrcMessageData ircdata) { string who = ircdata.RawMessageArray[3]; string awaymessage = ircdata.Message; if (ActiveChannelSyncing) { IrcUser ircuser = GetIrcUser(who); if (ircuser != null) { #if LOG4NET Logger.ChannelSyncing.Debug("setting away flag for user: "+who); #endif ircuser.IsAway = true; } } if (OnAway != null) { OnAway(this, new AwayEventArgs(ircdata, who, awaymessage)); } } private void _Event_RPL_UNAWAY(IrcMessageData ircdata) { _IsAway = false; if (OnUnAway != null) { OnUnAway(this, new IrcEventArgs(ircdata)); } } private void _Event_RPL_NOWAWAY(IrcMessageData ircdata) { _IsAway = true; if (OnNowAway != null) { OnNowAway(this, new IrcEventArgs(ircdata)); } } private void _Event_RPL_WHOREPLY(IrcMessageData ircdata) { WhoInfo info = WhoInfo.Parse(ircdata); string channel = info.Channel; string nick = info.Nick; if (_WhoList != null) { _WhoList.Add(info); } if (ActiveChannelSyncing && IsJoined(channel)) { // checking the irc and channel user I only do for sanity! // according to RFC they must be known to us already via RPL_NAMREPLY // psyBNC is not very correct with this... maybe other bouncers too IrcUser ircuser = GetIrcUser(nick); ChannelUser channeluser = GetChannelUser(channel, nick); #if LOG4NET if (ircuser == null) { Logger.ChannelSyncing.Error("GetIrcUser("+nick+") returned null in _Event_WHOREPLY! Ignoring..."); } #endif #if LOG4NET if (channeluser == null) { Logger.ChannelSyncing.Error("GetChannelUser("+nick+") returned null in _Event_WHOREPLY! Ignoring..."); } #endif if (ircuser != null) { #if LOG4NET Logger.ChannelSyncing.Debug("updating userinfo (from whoreply) for user: "+nick+" channel: "+channel); #endif ircuser.Ident = info.Ident; ircuser.Host = info.Host; ircuser.Server = info.Server; ircuser.Nick = info.Nick; ircuser.HopCount = info.HopCount; ircuser.Realname = info.Realname; ircuser.IsAway = info.IsAway; ircuser.IsIrcOp = info.IsIrcOp; ircuser.IsRegistered = info.IsRegistered; switch (channel[0]) { case '#': case '!': case '&': case '+': // this channel may not be where we are joined! // see RFC 1459 and RFC 2812, it must return a channelname // we use this channel info when possible... if (channeluser != null) { channeluser.IsOp = info.IsOp; channeluser.IsVoice = info.IsVoice; } break; } } } if (OnWho != null) { OnWho(this, new WhoEventArgs(ircdata, info)); } } private void _Event_RPL_ENDOFWHO(IrcMessageData ircdata) { if (_WhoListReceivedEvent != null) { _WhoListReceivedEvent.Set(); } } private void _Event_RPL_MOTD(IrcMessageData ircdata) { if (!_MotdReceived) { _Motd.Add(ircdata.Message); } if (OnMotd != null) { OnMotd(this, new MotdEventArgs(ircdata, ircdata.Message)); } } private void _Event_RPL_ENDOFMOTD(IrcMessageData ircdata) { _MotdReceived = true; } private void _Event_RPL_BANLIST(IrcMessageData ircdata) { string channelname = ircdata.Channel; BanInfo info = BanInfo.Parse(ircdata); if (_BanList != null) { _BanList.Add(info); } if (ActiveChannelSyncing && IsJoined(channelname)) { Channel channel = GetChannel(channelname); if (channel.IsSycned) { return; } channel.Bans.Add(info.Mask); } } private void _Event_RPL_ENDOFBANLIST(IrcMessageData ircdata) { string channelname = ircdata.Channel; if (_BanListReceivedEvent != null) { _BanListReceivedEvent.Set(); } if (ActiveChannelSyncing && IsJoined(channelname)) { Channel channel = GetChannel(channelname); if (channel.IsSycned) { // only fire the event once return; } channel.ActiveSyncStop = DateTime.Now; channel.IsSycned = true; #if LOG4NET Logger.ChannelSyncing.Debug("active synced: "+channelname+ " (in "+channel.ActiveSyncTime.TotalSeconds+" sec)"); #endif if (OnChannelActiveSynced != null) { OnChannelActiveSynced(this, new IrcEventArgs(ircdata)); } } } private void _Event_RPL_EXCEPTLIST(IrcMessageData ircdata) { string channelname = ircdata.Channel; BanInfo info = BanInfo.Parse(ircdata); if (_BanExceptList != null) { _BanExceptList.Add(info); } if (ActiveChannelSyncing && IsJoined(channelname)) { Channel channel = GetChannel(channelname); if (channel.IsSycned) { return; } channel.BanExceptions.Add(info.Mask); } } private void _Event_RPL_ENDOFEXCEPTLIST(IrcMessageData ircdata) { string channelname = ircdata.Channel; if (_BanExceptListReceivedEvent != null) { _BanExceptListReceivedEvent.Set(); } } private void _Event_RPL_INVITELIST(IrcMessageData ircdata) { string channelname = ircdata.Channel; BanInfo info = BanInfo.Parse(ircdata); if (_InviteExceptList != null) { _InviteExceptList.Add(info); } if (ActiveChannelSyncing && IsJoined(channelname)) { Channel channel = GetChannel(channelname); if (channel.IsSycned) { return; } channel.InviteExceptions.Add(info.Mask); } } private void _Event_RPL_ENDOFINVITELIST(IrcMessageData ircdata) { string channelname = ircdata.Channel; if (_InviteExceptListReceivedEvent != null) { _InviteExceptListReceivedEvent.Set(); } } // MODE +b might return ERR_NOCHANMODES for mode-less channels (like +chan) private void _Event_ERR_NOCHANMODES(IrcMessageData ircdata) { string channelname = ircdata.RawMessageArray[3]; if (ActiveChannelSyncing && IsJoined(channelname)) { Channel channel = GetChannel(channelname); if (channel.IsSycned) { // only fire the event once return; } channel.ActiveSyncStop = DateTime.Now; channel.IsSycned = true; #if LOG4NET Logger.ChannelSyncing.Debug("active synced: "+channelname+ " (in "+channel.ActiveSyncTime.TotalSeconds+" sec)"); #endif if (OnChannelActiveSynced != null) { OnChannelActiveSynced(this, new IrcEventArgs(ircdata)); } } } private void _Event_ERR(IrcMessageData ircdata) { if (OnErrorMessage != null) { OnErrorMessage(this, new IrcEventArgs(ircdata)); } } private void _Event_ERR_NICKNAMEINUSE(IrcMessageData ircdata) { #if LOG4NET Logger.Connection.Warn("nickname collision detected, changing nickname"); #endif if (!AutoNickHandling) { return; } string nickname; // if a nicklist has been given loop through the nicknames // if the upper limit of this list has been reached and still no nickname has registered // then generate a random nick if (_CurrentNickname == NicknameList.Length-1) { Random rand = new Random(); int number = rand.Next(999); if (Nickname.Length > 5) { nickname = Nickname.Substring(0, 5)+number; } else { nickname = Nickname.Substring(0, Nickname.Length-1)+number; } } else { nickname = _NextNickname(); } // change the nickname RfcNick(nickname, Priority.Critical); } private void _Event_RPL_BOUNCE(IrcMessageData ircdata) { // HACK: might be BOUNCE or ISUPPORT; try to detect if (ircdata.Message != null && ircdata.Message.StartsWith("Try server ")) { // BOUNCE string host = null; int port = -1; // try to parse out host and port var match = _BounceMessageRegex.Match(ircdata.Message); if (match.Success) { host = match.Groups [1].Value; port = int.Parse(match.Groups [2].Value); } if (OnBounce != null) { OnBounce(this, new BounceEventArgs(ircdata, host, port)); } return; } // ISUPPORT // split the message (0 = server, 1 = code, 2 = my nick) for (int i = 3; i < ircdata.RawMessageArray.Length; ++i) { var msg = ircdata.RawMessageArray [i]; if (msg.StartsWith(":")) { // addendum; we're done break; } var keyval = msg.Split('='); if (keyval.Length == 1) { // keyword only _ServerProperties.RawProperties [keyval [0]] = null; } else if (keyval.Length == 2) { // key and value _ServerProperties.RawProperties [keyval [0]] = keyval [1]; } else { #if LOG4NET Logger.Connection.Warn("confusing ISUPPORT message, ignoring: " + msg); #endif } if (keyval.Length == 2 && keyval[0] == "CHANMODES") { var chanModes = keyval[1]; if (!String.IsNullOrEmpty(chanModes)) { ChannelModeMap = new ChannelModeMap(chanModes); } } if (keyval[0] == "NAMESX") { WriteLine("PROTOCTL NAMESX", Priority.Critical); } } } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/ChannelInfo.cs0000664000175000017500000000363613014002107023557 0ustar00meebeymeebey00000000000000/* * $Id: IrcUser.cs 198 2005-06-08 16:50:11Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smartirc/SmartIrc4net/trunk/src/IrcClient/IrcUser.cs $ * $Rev: 198 $ * $Author: meebey $ * $Date: 2005-06-08 18:50:11 +0200 (Wed, 08 Jun 2005) $ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; namespace Meebey.SmartIrc4net { public class ChannelInfo { private string f_Channel; private int f_UserCount; private string f_Topic; public string Channel { get { return f_Channel; } } public int UserCount { get { return f_UserCount; } } public string Topic { get { return f_Topic; } } internal ChannelInfo(string channel, int userCount, string topic) { f_Channel = channel; f_UserCount = userCount; f_Topic = topic; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/EventArgs.cs0000664000175000017500000004654013014002126023273 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections.Specialized; using System.Collections.Generic; namespace Meebey.SmartIrc4net { /// /// /// public class ActionEventArgs : CtcpEventArgs { private string _ActionMessage; public string ActionMessage { get { return _ActionMessage; } } internal ActionEventArgs(IrcMessageData data, string actionmsg) : base(data, "ACTION", actionmsg) { _ActionMessage = actionmsg; } } /// /// /// public class CtcpEventArgs : IrcEventArgs { private string _CtcpCommand; private string _CtcpParameter; public string CtcpCommand { get { return _CtcpCommand; } } public string CtcpParameter { get { return _CtcpParameter; } } internal CtcpEventArgs(IrcMessageData data, string ctcpcmd, string ctcpparam) : base(data) { _CtcpCommand = ctcpcmd; _CtcpParameter = ctcpparam; } } /// /// /// public class ErrorEventArgs : IrcEventArgs { private string _ErrorMessage; public string ErrorMessage { get { return _ErrorMessage; } } internal ErrorEventArgs(IrcMessageData data, string errormsg) : base(data) { _ErrorMessage = errormsg; } } /// /// /// public class MotdEventArgs : IrcEventArgs { private string _MotdMessage; public string MotdMessage { get { return _MotdMessage; } } internal MotdEventArgs(IrcMessageData data, string motdmsg) : base(data) { _MotdMessage = motdmsg; } } /// /// /// public class PingEventArgs : IrcEventArgs { private string _PingData; public string PingData { get { return _PingData; } } internal PingEventArgs(IrcMessageData data, string pingdata) : base(data) { _PingData = pingdata; } } /// /// /// public class PongEventArgs : IrcEventArgs { private TimeSpan _Lag; public TimeSpan Lag { get { return _Lag; } } internal PongEventArgs(IrcMessageData data, TimeSpan lag) : base(data) { _Lag = lag; } } /// /// /// public class KickEventArgs : IrcEventArgs { private string _Channel; private string _Who; private string _Whom; private string _KickReason; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } public string Whom { get { return _Whom; } } public string KickReason { get { return _KickReason; } } internal KickEventArgs(IrcMessageData data, string channel, string who, string whom, string kickreason) : base(data) { _Channel = channel; _Who = who; _Whom = whom; _KickReason = kickreason; } } /// /// /// public class JoinEventArgs : IrcEventArgs { private string _Channel; private string _Who; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } internal JoinEventArgs(IrcMessageData data, string channel, string who) : base(data) { _Channel = channel; _Who = who; } } /// /// /// public class NamesEventArgs : IrcEventArgs { private string _Channel; private string[] _UserList; public string[] RawUserList { get; private set; } public string Channel { get { return _Channel; } } public string[] UserList { get { return _UserList; } } internal NamesEventArgs(IrcMessageData data, string channel, string[] userlist, string[] rawUserList) : base(data) { _Channel = channel; _UserList = userlist; RawUserList = rawUserList; } } /// /// /// public class ListEventArgs : IrcEventArgs { private ChannelInfo f_ListInfo; public ChannelInfo ListInfo { get { return f_ListInfo; } } internal ListEventArgs(IrcMessageData data, ChannelInfo listInfo) : base(data) { f_ListInfo = listInfo; } } /// /// /// public class InviteEventArgs : IrcEventArgs { private string _Channel; private string _Who; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } internal InviteEventArgs(IrcMessageData data, string channel, string who) : base(data) { _Channel = channel; _Who = who; } } /// /// /// public class PartEventArgs : IrcEventArgs { private string _Channel; private string _Who; private string _PartMessage; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } public string PartMessage { get { return _PartMessage; } } internal PartEventArgs(IrcMessageData data, string channel, string who, string partmessage) : base(data) { _Channel = channel; _Who = who; _PartMessage = partmessage; } } /// /// /// public class WhoEventArgs : IrcEventArgs { private WhoInfo f_WhoInfo; [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public string Channel { get { return f_WhoInfo.Channel; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public string Nick { get { return f_WhoInfo.Nick; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public string Ident { get { return f_WhoInfo.Ident; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public string Host { get { return f_WhoInfo.Host; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public string Realname { get { return f_WhoInfo.Realname; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public bool IsAway { get { return f_WhoInfo.IsAway; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public bool IsOp { get { return f_WhoInfo.IsOp; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public bool IsVoice { get { return f_WhoInfo.IsVoice; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public bool IsIrcOp { get { return f_WhoInfo.IsIrcOp; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public string Server { get { return f_WhoInfo.Server; } } [Obsolete("Use WhoEventArgs.WhoInfo instead.")] public int HopCount { get { return f_WhoInfo.HopCount; } } public WhoInfo WhoInfo { get { return f_WhoInfo; } } internal WhoEventArgs(IrcMessageData data, WhoInfo whoInfo) : base(data) { f_WhoInfo = whoInfo; } } /// /// /// public class QuitEventArgs : IrcEventArgs { private string _Who; private string _QuitMessage; public string Who { get { return _Who; } } public string QuitMessage { get { return _QuitMessage; } } internal QuitEventArgs(IrcMessageData data, string who, string quitmessage) : base(data) { _Who = who; _QuitMessage = quitmessage; } } /// /// /// public class AwayEventArgs : IrcEventArgs { private string _Who; private string _AwayMessage; public string Who { get { return _Who; } } public string AwayMessage{ get { return _AwayMessage; } } internal AwayEventArgs(IrcMessageData data, string who, string awaymessage) : base(data) { _Who = who; _AwayMessage = awaymessage; } } /// /// /// public class NickChangeEventArgs : IrcEventArgs { private string _OldNickname; private string _NewNickname; public string OldNickname { get { return _OldNickname; } } public string NewNickname { get { return _NewNickname; } } internal NickChangeEventArgs(IrcMessageData data, string oldnick, string newnick) : base(data) { _OldNickname = oldnick; _NewNickname = newnick; } } /// /// /// public class TopicEventArgs : IrcEventArgs { private string _Channel; private string _Topic; public string Channel { get { return _Channel; } } public string Topic { get { return _Topic; } } internal TopicEventArgs(IrcMessageData data, string channel, string topic) : base(data) { _Channel = channel; _Topic = topic; } } /// /// /// public class TopicChangeEventArgs : IrcEventArgs { private string _Channel; private string _Who; private string _NewTopic; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } public string NewTopic { get { return _NewTopic; } } internal TopicChangeEventArgs(IrcMessageData data, string channel, string who, string newtopic) : base(data) { _Channel = channel; _Who = who; _NewTopic = newtopic; } } /// /// /// public class BanEventArgs : IrcEventArgs { private string _Channel; private string _Who; private string _Hostmask; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } public string Hostmask { get { return _Hostmask; } } internal BanEventArgs(IrcMessageData data, string channel, string who, string hostmask) : base(data) { _Channel = channel; _Who = who; _Hostmask = hostmask; } } /// /// /// public class UnbanEventArgs : IrcEventArgs { private string _Channel; private string _Who; private string _Hostmask; public string Channel { get { return _Channel; } } public string Who { get { return _Who; } } public string Hostmask { get { return _Hostmask; } } internal UnbanEventArgs(IrcMessageData data, string channel, string who, string hostmask) : base(data) { _Channel = channel; _Who = who; _Hostmask = hostmask; } } /// /// Event arguments for any change in channel role. /// public class ChannelRoleChangeEventArgs : IrcEventArgs { public string Channel { get; private set; } public string Who { get; private set; } public string Whom { get; private set; } internal ChannelRoleChangeEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data) { Channel = channel; Who = who; Whom = whom; } } /// /// User gained owner status (non-RFC, channel mode +q, prefix ~). /// public class OwnerEventArgs : ChannelRoleChangeEventArgs { internal OwnerEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User lost owner status (non-RFC, channel mode -q). /// public class DeownerEventArgs : ChannelRoleChangeEventArgs { internal DeownerEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User gained channel admin status (non-RFC, channel mode +a, prefix &). /// public class ChannelAdminEventArgs : ChannelRoleChangeEventArgs { internal ChannelAdminEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User lost channel admin status (non-RFC, channel mode -a). /// public class DeChannelAdminEventArgs : ChannelRoleChangeEventArgs { internal DeChannelAdminEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User gained op status (channel mode +o, prefix @). /// public class OpEventArgs : ChannelRoleChangeEventArgs { internal OpEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User lost op status (channel mode -o). /// public class DeopEventArgs : ChannelRoleChangeEventArgs { internal DeopEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User gained halfop status (non-RFC, channel mode +h, prefix %). /// public class HalfopEventArgs : ChannelRoleChangeEventArgs { internal HalfopEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User lost halfop status (non-RFC, channel mode -h). /// public class DehalfopEventArgs : ChannelRoleChangeEventArgs { internal DehalfopEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User gained voice status (channel mode +v, prefix +). /// public class VoiceEventArgs : ChannelRoleChangeEventArgs { internal VoiceEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } /// /// User lost voice status (channel mode -v). /// public class DevoiceEventArgs : ChannelRoleChangeEventArgs { internal DevoiceEventArgs(IrcMessageData data, string channel, string who, string whom) : base(data, channel, who, whom) { } } public class BounceEventArgs : IrcEventArgs { /// /// Hostname/address of the server to which the user is being redirected. /// May be null if not successfully parsed from the message. /// public string Server { get; private set; } /// /// Port of the server to which the user is being redirected. /// May be -1 if not successfully parsed from the message. /// public int Port { get; private set; } internal BounceEventArgs(IrcMessageData data, string server, int port) : base(data) { Server = server; Port = port; } } public class ChannelModeChangeEventArgs : IrcEventArgs { public string Channel { get; private set; } public List ModeChanges { get; private set; } internal ChannelModeChangeEventArgs(IrcMessageData data, string channel, List modeChanges) : base(data) { Channel = channel; ModeChanges = modeChanges; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/ChannelModeChangeInfo.cs0000664000175000017500000001432213014002126025465 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2014 Mirco Bauer // // Full GPL License: // // 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 using System; using System.Linq; using System.Collections.Generic; namespace Meebey.SmartIrc4net { public enum ChannelModeChangeAction { Set, Unset } public enum ChannelMode { Unknown, Op = 'o', Owner = 'q', Admin = 'a', HalfOp = 'h', Voice = 'v', Ban = 'b', BanException = 'e', InviteException = 'I', Key = 'k', UserLimit = 'l', TopicLock = 't' } public enum ChannelModeHasParameter { Always, OnlySet, Never } public class ChannelModeInfo { public ChannelMode Mode { get; set; } public ChannelModeHasParameter HasParameter { get; set; } public ChannelModeInfo(ChannelMode mode, ChannelModeHasParameter hasParameter) { Mode = mode; HasParameter = hasParameter; } } public class ChannelModeMap : Dictionary { // TODO: verify RFC modes! public ChannelModeMap() : // Smuxi mapping this("oqahvbeI,k,l,imnpstr") // IRCnet mapping //this("beIR,k,l,imnpstaqr") { } public ChannelModeMap(string channelModes) { Parse(channelModes); } public void Parse(string channelModes) { var listAlways = channelModes.Split(',')[0]; var settingAlways = channelModes.Split(',')[1]; var onlySet = channelModes.Split(',')[2]; var never = channelModes.Split(',')[3]; foreach (var mode in listAlways) { this[mode] = new ChannelModeInfo((ChannelMode) mode, ChannelModeHasParameter.Always); } foreach (var mode in settingAlways) { this[mode] = new ChannelModeInfo((ChannelMode) mode, ChannelModeHasParameter.Always); } foreach (var mode in onlySet) { this[mode] = new ChannelModeInfo((ChannelMode) mode, ChannelModeHasParameter.OnlySet); } foreach (var mode in never) { this[mode] = new ChannelModeInfo((ChannelMode) mode, ChannelModeHasParameter.Never); } } } public class ChannelModeChangeInfo { public ChannelModeChangeAction Action { get; private set; } public ChannelMode Mode { get; private set; } public char ModeChar { get; private set; } public string Parameter { get; private set; } public ChannelModeChangeInfo() { } public static List Parse(ChannelModeMap modeMap, string target, string mode, string modeParameters) { if (modeMap == null) { throw new ArgumentNullException("modeMap"); } if (target == null) { throw new ArgumentNullException("target"); } if (mode == null) { throw new ArgumentNullException("mode"); } if (modeParameters == null) { throw new ArgumentNullException("modeParameters"); } var modeChanges = new List(); var action = ChannelModeChangeAction.Set; var parameters = modeParameters.Split(new char[] {' '}); var parametersEnumerator = parameters.GetEnumerator(); // bring the enumerator to the 1. element parametersEnumerator.MoveNext(); foreach (char modeChar in mode) { switch (modeChar) { case '+': action = ChannelModeChangeAction.Set; break; case '-': action = ChannelModeChangeAction.Unset; break; default: ChannelModeInfo modeInfo = null; modeMap.TryGetValue(modeChar, out modeInfo); if (modeInfo == null) { // modes not specified in CHANMODES are expected to // always have parameters modeInfo = new ChannelModeInfo((ChannelMode) modeChar, ChannelModeHasParameter.Always); } string parameter = null; var channelMode = modeInfo.Mode; if (!Enum.IsDefined(typeof(ChannelMode), channelMode)) { channelMode = ChannelMode.Unknown; } var hasParameter = modeInfo.HasParameter; if (hasParameter == ChannelModeHasParameter.Always || (hasParameter == ChannelModeHasParameter.OnlySet && action == ChannelModeChangeAction.Set)) { parameter = (string) parametersEnumerator.Current; parametersEnumerator.MoveNext(); } modeChanges.Add(new ChannelModeChangeInfo() { Action = action, Mode = channelMode, ModeChar = modeChar, Parameter = parameter }); break; } } return modeChanges; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/Channel.cs0000664000175000017500000001502113014002107022732 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; namespace Meebey.SmartIrc4net { /// /// /// /// public class Channel { private string _Name; private string _Key = String.Empty; private Hashtable _Users = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private Hashtable _Ops = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private Hashtable _Voices = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private StringCollection _Bans = new StringCollection(); private List _BanExcepts = new List(); private List _InviteExcepts = new List(); private string _Topic = String.Empty; private int _UserLimit; private string _Mode = String.Empty; private DateTime _ActiveSyncStart; private DateTime _ActiveSyncStop; private TimeSpan _ActiveSyncTime; private bool _IsSycned; /// /// /// /// internal Channel(string name) { _Name = name; _ActiveSyncStart = DateTime.Now; } #if LOG4NET ~Channel() { Logger.ChannelSyncing.Debug("Channel ("+Name+") destroyed"); } #endif /// /// /// /// public string Name { get { return _Name; } } /// /// /// /// public string Key { get { return _Key; } set { _Key = value; } } /// /// /// /// public Hashtable Users { get { return (Hashtable)_Users.Clone(); } } /// /// /// /// internal Hashtable UnsafeUsers { get { return _Users; } } /// /// /// /// public Hashtable Ops { get { return (Hashtable)_Ops.Clone(); } } /// /// /// /// internal Hashtable UnsafeOps { get { return _Ops; } } /// /// /// /// public Hashtable Voices { get { return (Hashtable)_Voices.Clone(); } } /// /// /// /// internal Hashtable UnsafeVoices { get { return _Voices; } } /// /// /// /// public StringCollection Bans { get { return _Bans; } } public List BanExceptions { get { return _BanExcepts; } } public List InviteExceptions { get { return _InviteExcepts; } } /// /// /// /// public string Topic { get { return _Topic; } set { _Topic = value; } } /// /// /// /// public int UserLimit { get { return _UserLimit; } set { _UserLimit = value; } } /// /// /// /// public string Mode { get { return _Mode; } set { _Mode = value; } } /// /// /// /// public DateTime ActiveSyncStart { get { return _ActiveSyncStart; } } /// /// /// /// public DateTime ActiveSyncStop { get { return _ActiveSyncStop; } set { _ActiveSyncStop = value; _ActiveSyncTime = _ActiveSyncStop.Subtract(_ActiveSyncStart); } } /// /// /// /// public TimeSpan ActiveSyncTime { get { return _ActiveSyncTime; } } public bool IsSycned { get { return _IsSycned; } set { _IsSycned = value; } } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/IrcMessageData.cs0000664000175000017500000001366113014002107024206 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { /// /// This class contains an IRC message in a parsed form /// /// public class IrcMessageData { private IrcClient _Irc; private string _From; private string _Nick; private string _Ident; private string _Host; private string _Channel; private string _Message; private string[] _MessageArray; private string _RawMessage; private string[] _RawMessageArray; private ReceiveType _Type; private ReplyCode _ReplyCode; /// /// Gets the IrcClient object the message originated from /// public IrcClient Irc { get { return _Irc; } } /// /// Gets the combined nickname, identity and hostname of the user that sent the message /// /// /// nick!ident@host /// public string From { get { return _From; } } /// /// Gets the nickname of the user that sent the message /// public string Nick { get { return _Nick; } } /// /// Gets the identity (username) of the user that sent the message /// public string Ident { get { return _Ident; } } /// /// Gets the hostname of the user that sent the message /// public string Host { get { return _Host; } } /// /// Gets the channel the message originated from /// public string Channel { get { return _Channel; } } /// /// Gets the message /// public string Message { get { return _Message; } } /// /// Gets the message as an array of strings (splitted by space) /// public string[] MessageArray { get { return _MessageArray; } } /// /// Gets the raw message sent by the server /// public string RawMessage { get { return _RawMessage; } } /// /// Gets the raw message sent by the server as array of strings (splitted by space) /// public string[] RawMessageArray { get { return _RawMessageArray; } } /// /// Gets the message type /// public ReceiveType Type { get { return _Type; } } /// /// Gets the message reply code /// public ReplyCode ReplyCode { get { return _ReplyCode; } } /// /// Constructor to create an instace of IrcMessageData /// /// IrcClient the message originated from /// combined nickname, identity and host of the user that sent the message (nick!ident@host) /// nickname of the user that sent the message /// identity (username) of the userthat sent the message /// hostname of the user that sent the message /// channel the message originated from /// message /// raw message sent by the server /// message type /// message reply code public IrcMessageData(IrcClient ircclient, string from, string nick, string ident, string host, string channel, string message, string rawmessage, ReceiveType type, ReplyCode replycode) { _Irc = ircclient; _RawMessage = rawmessage; _RawMessageArray = rawmessage.Split(new char[] {' '}); _Type = type; _ReplyCode = replycode; _From = from; _Nick = nick; _Ident = ident; _Host = host; _Channel = channel; if (message != null) { // message is optional _Message = message; _MessageArray = message.Split(new char[] {' '}); } } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/ServerProperties.cs0000664000175000017500000006110613014002107024712 0ustar00meebeymeebey00000000000000/* * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2013 Ondřej Hošek * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections.Generic; namespace Meebey.SmartIrc4net { /// /// This class stores information about the capabilities and idiosyncrasies /// of an IRC server. /// See http://tools.ietf.org/html/draft-hardy-irc-isupport-00 for more /// information. /// public class ServerProperties { /// /// Contains the properties as returned by the server. If a property has /// been specified without a value, it is mapped to null. /// public Dictionary RawProperties { get; internal set; } /// /// Stores how the server maps between uppercase and lowercase letters. /// (raw property CASEMAPPING) /// public CaseMappingType CaseMapping { get { if (!HaveNonNullKey("CASEMAPPING")) { // default is rfc1459 return CaseMappingType.Rfc1459; } switch (RawProperties ["CASEMAPPING"]) { case "ascii": return CaseMappingType.Ascii; case "rfc1459": return CaseMappingType.Rfc1459; case "strict-rfc1459": return CaseMappingType.StrictRfc1459; default: return CaseMappingType.Unknown; } } } /// /// Stores how many channels of a given type a user can join. /// A return value of null means none were supplied or the /// value was invalid. The key is a string of channel types /// which count towards the same total; a value of -1 means /// an infinite amount. /// (raw property CHANLIMIT) /// public IDictionary ChannelJoinLimits { get { return ParseStringNumberPairs("CHANLIMIT", null, null, -1); } } /// /// Stores the channel modes which store lists. When a /// change is sent by the server, it will always contain a /// parameter; when sent by a client without a parameter, /// the server will reply with the current list. A return /// value of null means none or invalid ones were supplied. /// (raw property CHANMODES, first value) /// public string ListChannelModes { get { var splitmodes = SplitChannelModes; if (splitmodes == null) { return null; } return splitmodes [0]; } } /// /// Stores the channel modes which store a parameter. This /// parameter must be provided both when adding and when /// removing the mode. /// (raw property CHANMODES, second value) /// public string ParametricChannelModes { get { var splitmodes = SplitChannelModes; if (splitmodes == null) { return null; } return splitmodes [1]; } } /// /// Stores the channel modes which store a parameter. This /// parameter must only be provided when adding the value. /// (raw property CHANMODES, third value) /// public string SetParametricChannelModes { get { var splitmodes = SplitChannelModes; if (splitmodes == null) { return null; } return splitmodes [2]; } } /// /// Stores the channel modes which don't store a parameter. /// (raw property CHANMODES, fourth value) /// public string ParameterlessChannelModes { get { var splitmodes = SplitChannelModes; if (splitmodes == null) { return null; } return splitmodes [3]; } } /// /// Stores the maximum length of a channel name. -1 means no limit. /// (raw property CHANNELLEN) /// public int ChannelNameLength { get { // defaults as specified by RFC1459 int? len = ParseNumber("CHANNELLEN", 200, 200); return len ?? -1; } } /// /// Stores the types of channels supported by the server. /// An empty string means no channels are supported (!). /// (raw property CHANTYPES) /// public char[] ChannelTypes { get { if (!HaveNonNullKey("CHANTYPES")) { // sane default return "#&".ToCharArray(); } return RawProperties ["CHANTYPES"].ToCharArray(); } } /// /// Stores whether the server supports the CNOTICE command, /// which allows users with a specific channel privilege to /// send a notice to another participant in that channel /// without some of the restrictions that the sever may have /// placed on NOTICE. /// (raw property CNOTICE) /// public bool SupportsChannelParticipantNotices { get { return RawProperties.ContainsKey("CNOTICE"); } } /// /// Stores whether the server supports the CPRIVMSG command, /// which allows users with a specific channel privilege to /// send a message to another participant in that channel /// without some of the restrictions that the sever may have /// placed on PRIVMSG. /// (raw property CPRIVMSG) /// public bool SupportsChannelParticipantPrivMsgs { get { return RawProperties.ContainsKey("CPRIVMSG"); } } /// /// Stores available extensions to the LIST command. /// (raw property ELIST) /// public ListExtensions ListExtensions { get { if (!HaveNonNullKey("ELIST")) { return ListExtensions.None; } var eliststr = RawProperties ["ELIST"]; var exts = ListExtensions.None; foreach (char e in eliststr.ToUpperInvariant()) { switch (e) { case 'C': exts |= ListExtensions.CreationTime; break; case 'M': exts |= ListExtensions.ContainsParticipantWithMask; break; case 'N': exts |= ListExtensions.DoesNotContainParticipantWithMask; break; case 'T': exts |= ListExtensions.TopicAge; break; case 'U': exts |= ListExtensions.ParticipantCount; break; } } return exts; } } /// /// Returns what channel mode character is used by the /// server to signify ban exceptions. null means the server /// does not support ban exceptions. /// (raw property EXCEPTS) /// public char? BanExceptionCharacter { get { if (!RawProperties.ContainsKey("EXCEPTS")) { return null; } var exstr = RawProperties ["EXCEPTS"]; if (exstr == null) { // default: +e return 'e'; } else if (exstr.Length != 1) { // invalid; assume lack of support return null; } return exstr [0]; } } /// /// Returns what channel mode character is used by the /// server to signify invite exceptions. null means the server /// does not support ban exceptions. /// (raw property INVEX) /// public char? InviteExceptionCharacter { get { if (!RawProperties.ContainsKey("INVEX")) { return null; } var exstr = RawProperties ["INVEX"]; if (exstr == null) { // default: +I return 'I'; } else if (exstr.Length != 1) { // invalid; assume lack of support return null; } return exstr [0]; } } /// /// Returns how long a kick message supplied by the client /// may be. /// (raw property KICKLEN) /// public int? KickMessageLength { get { return ParseNumber("KICKLEN", null, null); } } /// /// Stores how many list channel modes (see ListChannelModes) /// of a given type a user can set on a channel. (Note that /// the server may always return more.) A return value of null /// means none were supplied or the value was invalid. The key /// is a string of list mode characters which count towards the /// same total; a value of -1 means an infinite amount. /// (raw property MAXLIST) /// public IDictionary ListModeLimits { get { return ParseStringNumberPairs("MAXLIST", null, null, -1); } } /// /// Stores how many non-parameterless (list, parametric or /// set-parametric) modes can be set using a single MODE call. /// A return value of null means an invalid value has been /// supplied; a return value of -1 means a theoretically /// unlimited number of simultaneous mode sets. /// (raw property MODES) /// public int? MaxParametricModeSets { get { // 3 if not set, infinity if value-less return ParseNumber("MODES", 3, -1); } } /// /// Stores the display name of the network the IRC /// server is participating in. A return value of null /// means the server is not participating in an IRC network. /// (raw property NETWORK) /// public string NetworkName { get { if (!HaveNonNullKey("NETWORK")) { return null; } return RawProperties ["NETWORK"]; } } /// /// Stores the maximum length of the nickname the client /// may set. (This has no bearing on the nicknames of /// other clients.) A return value of null means no or an /// invalid value was specified. /// (raw property NICKLEN) /// public int? MaxNicknameLength { get { // RFC1459 default if unset return ParseNumber("NICKLEN", 9, null); } } /// /// Stores the channel privilege modes (e.g. o for op, v for /// voice) and their corresponding prefixes (e.g. @, +), /// ordered from most to least powerful. A return value of /// null means no or an invalid value was specified. /// (raw property PREFIX) /// public IList> ChannelPrivilegeModesPrefixes { get { var modesList = new List>(); if (!RawProperties.ContainsKey("PREFIX")) { // assume voice and ops modesList.Add(new KeyValuePair('o', '@')); modesList.Add(new KeyValuePair('v', '+')); return modesList; } var prefixstr = RawProperties ["PREFIX"]; if (prefixstr == null) { // supports no modes (!) return modesList; } // format: (modes)prefixes if (prefixstr [0] != '(') { return null; } var modesPrefixes = prefixstr.Substring(1).Split(')'); if (modesPrefixes.Length != 2) { // assuming the pathological case of a ')' mode // character is impossible, this is invalid return null; } var modes = modesPrefixes[0]; var prefixes = modesPrefixes[1]; if (modes.Length != prefixes.Length) { return null; } for (int i = 0; i < modes.Length; ++i) { modesList.Add(new KeyValuePair(modes [i], prefixes [i])); } return modesList; } } /// /// Stores whether using the LIST command is safe, i.e. whether /// the user won't be disconnected because of the large amount /// of traffic generated by LIST. /// (raw property SAFELIST) /// public bool ListIsSafe { get { return RawProperties.ContainsKey("SAFELIST"); } } /// /// Stores the maximum number of entries on a user's silence /// list. A value of 0 means silence lists are not supported /// on this server. /// (raw property SILENCE) /// public int MaxSilenceListEntries { get { // SILENCE requires a value, but assume 0 if unspecified return ParseNumber("SILENCE", 0, 0) ?? 0; } } /// /// If this property is not set to an empty string, users may /// send NOTICEs to channel participants of a given status; /// e.g. NOTICE @#help :I found a bug. would send the /// message to the operators of #help. The property stores the /// modes that may be the recipients of such messages, e.g. /// "~&@" for "owners, admins and operators only". /// (raw property STATUSMSG) /// public string StatusNoticeParticipants { get { if (!HaveNonNullKey("STATUSMSG")) { // STATUSMSG requires a value, but assume none // if unspecified return ""; } return RawProperties ["STATUSMSG"]; } } /// /// Maps the commands which support multiple targets to the /// maximum number of targets each of them supports. A return /// value of null means the server specified an invalid value. /// An entry value of -1 means infinity. /// (raw property TARGMAX) /// public IDictionary MaxCommandTargets { get { var emptydict = new Dictionary(); return ParseStringNumberPairs("TARGMAX", emptydict, null, -1); } } /// /// Stores the maximum topic length that the client may set /// on a channel on the server. A length of -1 means an /// infinite length. /// (raw property TOPICLEN) /// public int MaxTopicLength { get { // SILENCE requires a value, but assume infinity // if unspecified or invalid return ParseNumber("TOPICLEN", -1, -1) ?? -1; } } /// /// Stores the maximum number of entries on a user's watch /// list. A value of 0 means watch lists are not supported /// on this server. /// (raw property WATCH) /// public int MaxWatchListEntries { get { // SILENCE requires a value, but assume 0 if unspecified return ParseNumber("WATCH", 0, 0) ?? 0; } } /// /// Constructs an empty server properties object. /// internal ServerProperties() { RawProperties = new Dictionary(); } /// /// Returns whether the property dictionary contains the given key and /// it is not null. /// /// The key to check. /// Whether the given key maps to a non-null value in the /// dictionary. bool HaveNonNullKey(string key) { if (!RawProperties.ContainsKey(key)) { return false; } return RawProperties [key] != null; } /// /// Returns a dictionary from parsing a value in the format /// string:number[,string:number,...]. If the value is unset (i.e. not /// contained in the dictionary), returns unsetDefault. If the value is /// empty (i.e. maps to null), returns emptyDefault. /// defaultValue is used if no number is specified after a colon; if /// defaultValue is null, this method returns null. /// IDictionary ParseStringNumberPairs(string key, IDictionary unsetDefault, IDictionary emptyDefault, int? defaultValue) { if (!RawProperties.ContainsKey(key)) { return unsetDefault; } var valstr = RawProperties [key]; if (valstr == null) { return emptyDefault; } var valmap = new Dictionary(); // comma splits the specs foreach (string limit in valstr.Split(',')) { // colon splits keys and value var split = limit.Split(':'); if (split.Length != 2) { // invalid spec; don't trust the whole thing return null; } var chantypes = split [0]; var valuestr = split [1]; int value; if (valuestr == string.Empty) { if (defaultValue.HasValue) { value = defaultValue.Value; } return null; } else if (!int.TryParse(valuestr, out value)) { // invalid integer; don't trust the whole thing return null; } valmap [chantypes] = value; } return valmap; } /// /// Returns a numeric value. If the value is unset (i.e. not contained /// in the dictionary), returns unsetDefault. If the value is empty /// (i.e. maps to null), returns emptyDefault. On parse failure, returns /// null. Otherwise, returns the parsed value. /// int? ParseNumber(string key, int? unsetDefault, int? emptyDefault) { if (!RawProperties.ContainsKey(key)) { return unsetDefault; } var numstr = RawProperties [key]; if (numstr == null) { return emptyDefault; } int num; if (!int.TryParse(numstr, out num)) { return null; } return num; } /// /// Returns the array value of the CHANMODES property, or null if /// it was invalid. /// string[] SplitChannelModes { get { if (!HaveNonNullKey("CHANMODES")) { return null; } var splits = RawProperties ["CHANMODES"].Split(','); if (splits.Length != 4) { return null; } return splits; } } } /// /// Represents how lowercase and uppercase are mapped by the server. This /// information is mostly supplied in the CASEMAPPING server property. /// public enum CaseMappingType { /// /// The server provided no or an unknown value. /// Unknown, /// /// The ASCII characters 0x61 to 0x7a (a to z) are defined /// as the lowercase variants of 0x41 to 0x5a (A to Z). /// The server provided the string ascii. /// Ascii, /// /// The ASCII characters 0x61 to 0x7e (a to ~) are defined /// as the lowercase variants of 0x41 to 0x5e (A to ^). /// The server provided the string rfc1459. /// Rfc1459, /// /// The ASCII characters 0x61 to 0x7d (a to }) are defined /// as the lowercase variants of 0x41 to 0x5d (A to ]). /// The server provided the string strict-rfc1459. /// StrictRfc1459, } /// /// Represents additional functionality available in the LIST command. /// [Flags] public enum ListExtensions { /// /// No additional functionality is supported by LIST. /// None = 0, /// /// Channel lists may be requested by creation time, using the syntax /// C>time to search for channels created after the given time /// and C<time to search for channels created before the given /// time. /// (letter: C) /// CreationTime = (1 << 0), /// /// Channel lists may be requested by a mask, matching channels in which /// a user matching the given mask is participating. /// (letter: M) /// ContainsParticipantWithMask = (1 << 1), /// /// Channel lists may be requested by a mask, matching channels in which /// a user matching the given mask is not participating. /// (letter: N) /// DoesNotContainParticipantWithMask = (1 << 2), /// /// Channel lists may be requested by topic age, using the syntax /// T>time to search for channels with topics last changed after /// the given time and T<time to search for channels with topics /// last changed before the given time. /// (letter: T) /// TopicAge = (1 << 3), /// /// Channel lists may be requested by number of participants, using the /// syntax U>count to search for channels with more than the given /// number of participants and C<time to search for channels with /// fewer than the given number of participants. /// (letter: U) /// ParticipantCount = (1 << 4) } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/NonRfcChannelUser.cs0000664000175000017500000000340213014002107024677 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { /// /// /// /// public class NonRfcChannelUser : ChannelUser { public bool IsOwner { get; set; } public bool IsChannelAdmin { get; set; } public bool IsHalfop { get; set; } /// /// /// /// /// internal NonRfcChannelUser(string channel, IrcUser ircuser) : base(channel, ircuser) { } #if LOG4NET ~NonRfcChannelUser() { Logger.ChannelSyncing.Debug("NonRfcChannelUser ("+Channel+":"+IrcUser.Nick+") destroyed"); } #endif } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/NonRfcChannel.cs0000664000175000017500000000640613014002107024047 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System.Collections; using System.Collections.Specialized; namespace Meebey.SmartIrc4net { /// /// /// /// public class NonRfcChannel : Channel { private Hashtable _Owners = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private Hashtable _ChannelAdmins = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); private Hashtable _Halfops = Hashtable.Synchronized(new Hashtable(new CaseInsensitiveHashCodeProvider(), new CaseInsensitiveComparer())); /// /// /// /// internal NonRfcChannel(string name) : base(name) { } #if LOG4NET ~NonRfcChannel() { Logger.ChannelSyncing.Debug("NonRfcChannel ("+Name+") destroyed"); } #endif /// /// /// /// public Hashtable Owners { get { return (Hashtable) _Owners.Clone(); } } /// /// /// /// internal Hashtable UnsafeOwners { get { return _Owners; } } /// /// /// /// public Hashtable ChannelAdmins { get { return (Hashtable) _ChannelAdmins.Clone(); } } /// /// /// /// internal Hashtable UnsafeChannelAdmins { get { return _ChannelAdmins; } } /// /// /// /// public Hashtable Halfops { get { return (Hashtable) _Halfops.Clone(); } } /// /// /// /// internal Hashtable UnsafeHalfops { get { return _Halfops; } } } } smuxi-1.1/lib/SmartIrc4net/src/IrcClient/BanInfo.cs0000664000175000017500000000374313014002107022706 0ustar00meebeymeebey00000000000000/* * $Id: IrcUser.cs 198 2005-06-08 16:50:11Z meebey $ * $URL: svn+ssh://svn.qnetp.net/svn/smartirc/SmartIrc4net/trunk/src/IrcClient/IrcUser.cs $ * $Rev: 198 $ * $Author: meebey $ * $Date: 2005-06-08 18:50:11 +0200 (Wed, 08 Jun 2005) $ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; namespace Meebey.SmartIrc4net { public class BanInfo { private string f_Channel; private string f_Mask; public string Channel { get { return f_Channel; } } public string Mask { get { return f_Mask; } } private BanInfo() { } public static BanInfo Parse(IrcMessageData data) { BanInfo info = new BanInfo(); // :magnet.oftc.net 367 meebey #smuxi test!test@test meebey!~meebey@e176002059.adsl.alicedsl.de 1216309801.. info.f_Channel = data.RawMessageArray[3]; info.f_Mask= data.RawMessageArray[4]; return info; } } } smuxi-1.1/lib/SmartIrc4net/src/EventArgs.cs0000664000175000017500000000307413014002107021411 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections.Specialized; namespace Meebey.SmartIrc4net { /// /// /// /// public class IrcEventArgs : EventArgs { private readonly IrcMessageData _Data; /// /// /// public IrcMessageData Data { get { return _Data; } } internal IrcEventArgs(IrcMessageData data) { _Data = data; } } } smuxi-1.1/lib/SmartIrc4net/src/Makefile.am0000664000175000017500000000321413014002107021214 0ustar00meebeymeebey00000000000000TARGET_DIR = $(top_builddir)/bin KEYFILE = $(top_srcdir)/$(PACKAGE_NAME).snk ASSEMBLY = $(ASSEMBLY_NAME).dll ASSEMBLY_TARGET = $(TARGET_DIR)/$(ASSEMBLY) ASSEMBLY_XML = $(ASSEMBLY_NAME).xml ASSEMBLY_XML_TARGET = $(TARGET_DIR)/$(ASSEMBLY_XML) ASSEMBLY_PC = $(top_srcdir)/$(PACKAGE_NAME).pc NDOC = ndoc-console NDOC_TARGET_DIR = docs/html SOURCE_PATTERNS = *.cs */*.cs */*/*.cs SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(srcdir)/$(pattern))) GACUTIL_INSTALL = $(GACUTIL) -i $(ASSEMBLY_TARGET) -f $(GACUTIL_FLAGS) GACUTIL_UNINSTALL = $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) # automake magic variables EXTRA_DIST = $(SOURCE_FILES) CLEANFILES = $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET).mdb $(ASSEMBLY_XML_TARGET) if INSTALL_PKG_LIB pkgappdir = $(pkglibdir) pkgapp_DATA = $(ASSEMBLY_TARGET) endif if INSTALL_PKG_CONFIG pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = $(ASSEMBLY_PC) endif # end of magic all: $(ASSEMBLY_TARGET) $(ASSEMBLY_TARGET): $(SOURCE_FILES) $(INSTALL) -d $(TARGET_DIR) $(CSC) $(CSC_FLAGS) -keyfile:$(KEYFILE) -doc:$(ASSEMBLY_XML_TARGET) -target:library -out:$@ $^ docs: $(ASSEMBLY_TARGET) $(NDOC) $(ASSEMBLY) \ -documenter=MSDN -OutputTarget=Web -OutputDirectory=$(NDOC_TARGET_DIR) \ -Title="SmartIrc4net API documentation" -SdkLinksOnWeb=true \ -AssemblyVersionInfo=AssemblyVersion if INSTALL_PKG_GAC install-data-local: echo "$(GACUTIL_INSTALL)"; \ $(GACUTIL_INSTALL) || exit 1; uninstall-local: echo "$(GACUTIL_UNINSTALL)"; \ $(GACUTIL_UNINSTALL) || exit 1; endif # HACK: autofoo stubbornly creates the $pkglibdir/$package directory if !INSTALL_PKG_LIB installdirs: install-pkglibDATA: endif smuxi-1.1/lib/SmartIrc4net/src/Exceptions.cs0000664000175000017500000000763013014002107021636 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Runtime.Serialization; namespace Meebey.SmartIrc4net { /// [Serializable()] public class SmartIrc4netException : ApplicationException { public SmartIrc4netException() : base() { } public SmartIrc4netException(string message) : base(message) { } public SmartIrc4netException(string message, Exception e) : base(message, e) { } protected SmartIrc4netException(SerializationInfo info, StreamingContext context) : base(info, context) { } } /// [Serializable()] public class ConnectionException : SmartIrc4netException { public ConnectionException() : base() { } public ConnectionException(string message) : base(message) { } public ConnectionException(string message, Exception e) : base(message, e) { } protected ConnectionException(SerializationInfo info, StreamingContext context) : base(info, context) { } } /// [Serializable()] public class CouldNotConnectException : ConnectionException { public CouldNotConnectException() : base() { } public CouldNotConnectException(string message) : base(message) { } public CouldNotConnectException(string message, Exception e) : base(message, e) { } protected CouldNotConnectException(SerializationInfo info, StreamingContext context) : base(info, context) { } } /// [Serializable()] public class NotConnectedException : ConnectionException { public NotConnectedException() : base() { } public NotConnectedException(string message) : base(message) { } public NotConnectedException(string message, Exception e) : base(message, e) { } protected NotConnectedException(SerializationInfo info, StreamingContext context) : base(info, context) { } } /// [Serializable()] public class AlreadyConnectedException : ConnectionException { public AlreadyConnectedException() : base() { } public AlreadyConnectedException(string message) : base(message) { } public AlreadyConnectedException(string message, Exception e) : base(message, e) { } protected AlreadyConnectedException(SerializationInfo info, StreamingContext context) : base(info, context) { } } } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/0000755000175000017500000000000013014002107021372 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/Delegates.cs0000664000175000017500000000362413014002107023625 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ namespace Meebey.SmartIrc4net { /// /// Delegates to handle individual ctcp commands /// public delegate void CtcpDelegate(CtcpEventArgs eventArgs); /// /// Delegate for the Standard DCC EVent /// public delegate void DccConnectionHandler(object sender, DccEventArgs e); /// /// Delegate for DCC Events involving Sending or Receiving Lines of Text /// public delegate void DccChatLineHandler(object sender, DccChatEventArgs e); /// /// Delegate for DCC EVents involving Sending or Receiving Packets of Binary Data /// public delegate void DccSendPacketHandler(object sender, DccSendEventArgs e); /// /// Special Delegate for Incoming Requests to Receive a File /// public delegate void DccSendRequestHandler(object sender, DccSendRequestEventArgs e); } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/DccSend.cs0000664000175000017500000002655313014002107023241 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.IO; using System.Net; using System.Threading; using System.Net.Sockets; namespace Meebey.SmartIrc4net { /// /// Dcc Send Connection, Filetransfer /// public class DccSend : DccConnection { #region Private Variables private Stream _File; private long _Filesize; private string _Filename; private bool _DirectionUp; private long _SentBytes; private DccSpeed _Speed; private byte[] _Buffer = new byte[8192]; #endregion #region Public Properties public long SentBytes { get { return _SentBytes; } } #endregion internal DccSend(IrcFeatures irc, string user, IPAddress externalIpAdress, Stream file, string filename, long filesize, DccSpeed speed, bool passive, Priority priority) : base() { this.Irc = irc; _DirectionUp = true; _File = file; _Filesize = filesize; _Filename = filename; _Speed = speed; User = user; if(passive) { irc.SendMessage(SendType.CtcpRequest, user, "DCC SEND \"" + filename + "\" " + HostToDccInt(externalIpAdress).ToString() + " 0 " + filesize + " " + session, priority); } else { DccServer = new TcpListener(new IPEndPoint(IPAddress.Any, 0)); DccServer.Start(); LocalEndPoint = (IPEndPoint)DccServer.LocalEndpoint; irc.SendMessage(SendType.CtcpRequest, user, "DCC SEND \"" + filename + "\" " + HostToDccInt(externalIpAdress).ToString() + " " + LocalEndPoint.Port + " " + filesize, priority); } } internal DccSend(IrcFeatures irc, IPAddress externalIpAdress, CtcpEventArgs e) : base() { /* Remote Request */ this.Irc = irc; _DirectionUp = false; User = e.Data.Nick; if (e.Data.MessageArray.Length > 4) { long ip, filesize = 0; int port = 0; bool okIP = long.TryParse(e.Data.MessageArray[3], out ip); bool okPo = int.TryParse(e.Data.MessageArray[4], out port); // port 0 = passive if (e.Data.MessageArray.Length > 5) { bool okFs = long.TryParse(FilterMarker(e.Data.MessageArray[5]), out filesize); _Filesize = filesize; _Filename = e.Data.MessageArray[2].Trim(new char[] {'\"'}); } if (okIP && okPo) { RemoteEndPoint = new IPEndPoint(IPAddress.Parse(DccIntToHost(ip)), port); DccSendRequestEvent(new DccSendRequestEventArgs(this, e.Data.MessageArray[2], filesize)); return; } else { irc.SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC Send Parameter Error"); } } else { irc.SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC Send not enough parameters"); } } internal override void InitWork(Object stateInfo) { if (!Valid) return; if (DccServer != null) { Connection = DccServer.AcceptTcpClient(); RemoteEndPoint = (IPEndPoint)Connection.Client.RemoteEndPoint; DccServer.Stop(); isConnected = true; } else { while(!isConnected) { Thread.Sleep(500); // We wait till Request is Accepted (or jump out when rejected) if (reject) return; } } DccSendStartEvent(new DccEventArgs(this)); int bytes; if(_DirectionUp) { do{ while (Connection.Available > 0) { switch(_Speed) { case DccSpeed.Rfc: Connection.GetStream().Read(_Buffer, 0, _Buffer.Length); // TODO: only send x not ACKed Bytes ahead / (nobody wants this anyway) break; case DccSpeed.RfcSendAhead: Connection.GetStream().Read(_Buffer, 0, _Buffer.Length); break; case DccSpeed.Turbo: // Available > 0 should not happen break; } } bytes = _File.Read(_Buffer, 0, _Buffer.Length); try { Connection.GetStream().Write(_Buffer, 0, (int)bytes); } catch (IOException) { bytes = 0; // Connection Lost } _SentBytes += bytes; if (bytes > 0) { DccSendSentBlockEvent(new DccSendEventArgs(this, _Buffer, bytes)); Console.Write("."); } } while(bytes > 0); } else { while((bytes = Connection.GetStream().Read(_Buffer,0,_Buffer.Length))>0) { _File.Write(_Buffer, 0, bytes); _SentBytes += bytes; if (_Speed != DccSpeed.Turbo) Connection.GetStream().Write(getAck(_SentBytes),0,4); DccSendReceiveBlockEvent(new DccSendEventArgs(this, _Buffer, bytes)); } } isValid = false; isConnected = false; Console.WriteLine("--> Filetrangsfer Endet / Bytes sent: " + _SentBytes + " of " + _Filesize); DccSendStopEvent(new DccEventArgs(this)); } #region Public Methods for the DCC Send Object /// /// With this methode you can accept a DCC SEND Request you got from another User /// /// Any Stream you want use as a file, if you use offset it should be Seekable /// Offset to start a Resume Request for the rest of a file /// public bool AcceptRequest(Stream file, long offset) { if (isConnected) return false; try { if (file!=null) _File = file; if(RemoteEndPoint.Port==0) { DccServer = new TcpListener(new IPEndPoint(IPAddress.Any, 0)); DccServer.Start(); LocalEndPoint = (IPEndPoint)DccServer.LocalEndpoint; Irc.SendMessage(SendType.CtcpRequest, User, "DCC SEND \"" + _Filename + "\" " + HostToDccInt(ExternalIPAdress).ToString() + " " + LocalEndPoint.Port + " " + _Filesize); } else { if(offset==0) { Connection = new TcpClient(); Connection.Connect(RemoteEndPoint); isConnected = true; } else { if(_File.CanSeek) { _File.Seek(offset, SeekOrigin.Begin); _SentBytes = offset; Irc.SendMessage(SendType.CtcpRequest, User, "DCC RESUME \"" + _Filename + "\" " + RemoteEndPoint.Port + " " + offset); } else { /* Resume of a file which is not seekable : I dont care, its your filestream! */ _SentBytes = offset; Irc.SendMessage(SendType.CtcpRequest, User, "DCC RESUME \"" + _Filename + "\" " + RemoteEndPoint.Port + " " + offset); } } } return true; } catch(Exception) { isValid = false; isConnected = false; return false; } } #endregion #region Handler for Passive / Resume DCC internal bool TryResume(CtcpEventArgs e) { if (User == e.Data.Nick) { if ((e.Data.MessageArray.Length > 4) && (_Filename == e.Data.MessageArray[2].Trim(new char[] {'\"'}))) { long offset = 0; long.TryParse(FilterMarker(e.Data.MessageArray[4]), out offset); if (_File.CanSeek) { if (e.Data.MessageArray.Length > 5) { Irc.SendMessage(SendType.CtcpRequest, e.Data.Nick, "DCC ACCEPT " + e.Data.MessageArray[2] + " " + e.Data.MessageArray[3] + " " + e.Data.MessageArray[4] + " " + FilterMarker(e.Data.MessageArray[5])); } else { Irc.SendMessage(SendType.CtcpRequest, e.Data.Nick, "DCC ACCEPT " + e.Data.MessageArray[2] + " " + e.Data.MessageArray[3] + " " + FilterMarker(e.Data.MessageArray[4])); } _File.Seek(offset, SeekOrigin.Begin); _SentBytes = offset; return true; } else { Irc.SendMessage(SendType.CtcpRequest, e.Data.Nick, "ERRMSG DCC File not seekable"); } } } return false; } internal bool TryAccept(CtcpEventArgs e) { if (User == e.Data.Nick) { if ((e.Data.MessageArray.Length > 4) && (_Filename == e.Data.MessageArray[2].Trim(new char[] {'\"'}))) { return this.AcceptRequest(null, 0); } } return false; } internal bool SetRemote(CtcpEventArgs e) { long ip; int port = 0; bool okIP = long.TryParse(e.Data.MessageArray[3], out ip); bool okPo = int.TryParse(e.Data.MessageArray[4], out port); // port 0 = passive if (okIP && okPo) { RemoteEndPoint = new IPEndPoint(IPAddress.Parse(DccIntToHost(ip)), port); return true; } return false; } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/EventArgs.cs0000664000175000017500000000724213014002107023626 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections.Generic; namespace Meebey.SmartIrc4net { /// /// Base DCC Event Arguments /// public class DccEventArgs : EventArgs { private DccConnection _dcc; public DccConnection dcc { get { return _dcc; } } /// /// /// /// /// If there are multiple streams on a DCC (a channel DCC) this identifies the stream internal DccEventArgs(DccConnection dcc) { this._dcc = dcc; } } /// /// Dcc Event Args Involving Lines of Text /// public class DccChatEventArgs : DccEventArgs { private string _Message; public string Message { get { return _Message; } } private string[] _MessageArray; public string[] MessageArray { get { return _MessageArray; } } internal DccChatEventArgs(DccConnection dcc, string messageLine) : base(dcc) { char[] whiteSpace = {' '}; this._Message = messageLine; this._MessageArray = messageLine.Split(new char[] {' '}); } } /// /// Dcc Event Args involving Packets of Bytes /// public class DccSendEventArgs : DccEventArgs { private byte[] _Package; public byte[] Package { get { return _Package; } } private int _PackageSize; public int PackageSize { get { return _PackageSize; } } internal DccSendEventArgs(DccConnection dcc, byte[] package, int packageSize) : base(dcc) { this._Package = package; this._PackageSize = packageSize; } } /// /// Special DCC Event Arg for Receiving File Requests /// public class DccSendRequestEventArgs : DccEventArgs { private string _Filename; public string Filename { get { return _Filename; } } private long _Filesize; public long Filesize { get { return _Filesize; } } internal DccSendRequestEventArgs(DccConnection dcc, string filename, long filesize) : base(dcc) { this._Filename = filename; this._Filesize = filesize; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/IrcFeatures.cs0000664000175000017500000004511513014002107024145 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.IO; using System.Net; using System.Threading; using System.Collections.Generic; using System.Collections.ObjectModel; namespace Meebey.SmartIrc4net { /// /// Description of IrcFeatures2. /// /// public class IrcFeatures : IrcClient { #region Public Field Access public IPAddress ExternalIpAdress { get { return _ExternalIpAdress; } set { _ExternalIpAdress = value; } } /// /// Access to all DccConnections, Its not possible to change the collection itself, /// but you can use the public Members of the DccCollections or its inherited Classes. /// public ReadOnlyCollection DccConnections { get { return new ReadOnlyCollection(_DccConnections); } } /// /// To handle more or less CTCP Events, modify this collection to your needs. /// You can also change the Delegates to your own implementations. /// public Dictionary CtcpDelegates { get { return _CtcpDelegates; } } /// /// This Info is shown with the CTCP UserInfo Request /// public string CtcpUserInfo { get { return _CtcpUserInfo; } set { _CtcpUserInfo = value; } } /// /// This Url will be mentioned with the CTCP Url Request /// public string CtcpUrl { get { return _CtcpUrl; } set { _CtcpUrl = value; } } /// /// The Source of the IRC Program is show in the CTCP Source Request /// public string CtcpSource { get { return _CtcpSource; } set { _CtcpSource = value; } } #endregion #region private variables private IPAddress _ExternalIpAdress; private List _DccConnections = new List(); private Dictionary _CtcpDelegates = new Dictionary(StringComparer.CurrentCultureIgnoreCase); private string _CtcpUserInfo; private string _CtcpUrl; private string _CtcpSource; internal DccSpeed Speed = DccSpeed.RfcSendAhead; #endregion #region Public DCC Events (Global: All Dcc Events) public event DccConnectionHandler OnDccChatRequestEvent; public void DccChatRequestEvent(DccEventArgs e) { if (OnDccChatRequestEvent!=null) {OnDccChatRequestEvent(this, e); } } public event DccSendRequestHandler OnDccSendRequestEvent; public void DccSendRequestEvent(DccSendRequestEventArgs e) { if (OnDccSendRequestEvent!=null) {OnDccSendRequestEvent(this, e); } } public event DccConnectionHandler OnDccChatStartEvent; public void DccChatStartEvent(DccEventArgs e) { if (OnDccChatStartEvent!=null) {OnDccChatStartEvent(this, e); } } public event DccConnectionHandler OnDccSendStartEvent; public void DccSendStartEvent(DccEventArgs e) { if (OnDccSendStartEvent!=null) {OnDccSendStartEvent(this, e); } } public event DccChatLineHandler OnDccChatReceiveLineEvent; public void DccChatReceiveLineEvent(DccChatEventArgs e) { if (OnDccChatReceiveLineEvent!=null) {OnDccChatReceiveLineEvent(this, e); } } public event DccSendPacketHandler OnDccSendReceiveBlockEvent; public void DccSendReceiveBlockEvent(DccSendEventArgs e) { if (OnDccSendReceiveBlockEvent!=null) {OnDccSendReceiveBlockEvent(this, e); } } public event DccChatLineHandler OnDccChatSentLineEvent; public void DccChatSentLineEvent(DccChatEventArgs e) { if (OnDccChatSentLineEvent!=null) {OnDccChatSentLineEvent(this, e); } } public event DccSendPacketHandler OnDccSendSentBlockEvent; internal void DccSendSentBlockEvent(DccSendEventArgs e) { if (OnDccSendSentBlockEvent!=null) {OnDccSendSentBlockEvent(this, e); } } public event DccConnectionHandler OnDccChatStopEvent; public void DccChatStopEvent(DccEventArgs e) { if (OnDccChatStopEvent!=null) {OnDccChatStopEvent(this, e); } } public event DccConnectionHandler OnDccSendStopEvent; public void DccSendStopEvent(DccEventArgs e) { if (OnDccSendStopEvent!=null) {OnDccSendStopEvent(this, e); } } #endregion #region Public Interface Methods public IrcFeatures() : base() { // This method calls all the ctcp handlers defined below (or added anywhere else) this.OnCtcpRequest += new CtcpEventHandler(this.CtcpRequestsHandler); // Adding ctcp handler, all commands are lower case (.ToLower() in handler) _CtcpDelegates.Add("version", this.CtcpVersionDelegate); _CtcpDelegates.Add("clientinfo", this.CtcpClientInfoDelegate); _CtcpDelegates.Add("time", this.CtcpTimeDelegate); _CtcpDelegates.Add("userinfo", this.CtcpUserInfoDelegate); _CtcpDelegates.Add("url", this.CtcpUrlDelegate); _CtcpDelegates.Add("source", this.CtcpSourceDelegate); _CtcpDelegates.Add("finger", this.CtcpFingerDelegate); // The DCC Handler _CtcpDelegates.Add("dcc", this.CtcpDccDelegate); // Don't remove the Ping handler without your own implementation _CtcpDelegates.Add("ping", this.CtcpPingDelegate); } /// /// Init a DCC Chat Session /// /// User to DCC public void InitDccChat(string user) { this.InitDccChat(user, false); } /// /// Init a DCC Chat Session /// /// User to DCC /// Passive DCC public void InitDccChat(string user, bool passive) { this.InitDccChat(user, passive, Priority.Medium); } /// /// Init a DCC Chat Session /// /// User to DCC /// Passive DCC /// Non Dcc Message Priority for Negotiation public void InitDccChat(string user, bool passive, Priority priority) { DccChat chat = new DccChat(this, user, _ExternalIpAdress, passive, priority); _DccConnections.Add(chat); ThreadPool.QueueUserWorkItem(new WaitCallback(chat.InitWork)); RemoveInvalidDccConnections(); } /// /// Send a local File /// /// Destination of the File (no channel) /// complete filepath, absolute or relative (carefull) public void SendFile(string user, string filepath) { FileInfo fi = new FileInfo(filepath); if (fi.Exists) { this.SendFile(user, new FileStream(filepath, FileMode.Open), fi.Name, fi.Length, DccSpeed.RfcSendAhead, false, Priority.Medium); } } /// /// Send a local File passivly /// /// Destination of the File (no channel) /// complete filepath, absolute or relative (carefull) /// Passive DCC public void SendFile(string user, string filepath, bool passive) { FileInfo fi = new FileInfo(filepath); if (fi.Exists) { this.SendFile(user, new FileStream(filepath, FileMode.Open), fi.Name, fi.Length, DccSpeed.RfcSendAhead, passive, Priority.Medium); } } /// /// Send any Stream, active initiator, fast RfC method /// /// Destination of the File (no channel) /// You can send any stream here /// give a filename for the remote User /// give the length of the stream public void SendFile(string user, Stream file, string filename, long filesize) { this.SendFile(user, file, filename, filesize, DccSpeed.RfcSendAhead, false); } /// /// Send any Stream, full flexibility in Dcc Connection Negotiation /// /// Destination of the File (no channel) /// You can send any stream here /// give a filename for the remote User /// give the length of the stream /// What ACK Managment should be used /// Passive DCC public void SendFile(string user, Stream file, string filename, long filesize, DccSpeed speed, bool passive) { this.SendFile(user, file, filename, filesize, speed, passive, Priority.Medium); } /// /// Send any Stream, full flexibility in Dcc Connection Negotiation /// /// Destination of the File (no channel) /// You can send any stream here /// give a filename for the remote User /// give the length of the stream /// What ACK Managment should be used /// Passive DCC /// Non Dcc Message Priority for Negotiation public void SendFile(string user, Stream file, string filename, long filesize, DccSpeed speed, bool passive, Priority priority) { DccSend send = new DccSend(this, user, _ExternalIpAdress, file, filename, filesize, speed, passive, priority); _DccConnections.Add(send); ThreadPool.QueueUserWorkItem(new WaitCallback(send.InitWork)); RemoveInvalidDccConnections(); } #endregion #region Private Methods private void CtcpRequestsHandler(object sender, CtcpEventArgs e) { if (_CtcpDelegates.ContainsKey(e.CtcpCommand)) { _CtcpDelegates[e.CtcpCommand].Invoke(e); } else { /* No CTCP Handler for this Command */ } RemoveInvalidDccConnections(); } #endregion #region implemented ctcp delegates, can be overwritten by changing the ctcpDelagtes Dictionary private void CtcpVersionDelegate(CtcpEventArgs e) { SendMessage(SendType.CtcpReply, e.Data.Nick, "VERSION " + ((CtcpVersion==null)?VersionString:CtcpVersion)); } private void CtcpClientInfoDelegate(CtcpEventArgs e) { string clientInfo = "CLIENTINFO"; foreach(KeyValuePair kvp in _CtcpDelegates) { clientInfo = clientInfo+" "+kvp.Key.ToUpper(); } SendMessage(SendType.CtcpReply, e.Data.Nick, clientInfo); } private void CtcpPingDelegate(CtcpEventArgs e) { if (e.Data.Message.Length > 7) { SendMessage(SendType.CtcpReply, e.Data.Nick, "PING "+e.Data.Message.Substring(6, (e.Data.Message.Length-7))); } else { SendMessage(SendType.CtcpReply, e.Data.Nick, "PING"); //according to RFC, it should be PONG! } } /// /// This is the correct Rfc Ping Delegate, which is not used because all other clients do not use the PING According to RfC /// /// private void CtcpRfcPingDelegate(CtcpEventArgs e) { if (e.Data.Message.Length > 7) { SendMessage(SendType.CtcpReply, e.Data.Nick, "PONG "+e.Data.Message.Substring(6, (e.Data.Message.Length-7))); } else { SendMessage(SendType.CtcpReply, e.Data.Nick, "PONG"); } } private void CtcpTimeDelegate(CtcpEventArgs e) { SendMessage(SendType.CtcpReply, e.Data.Nick, "TIME " + DateTime.Now.ToString("r")); } private void CtcpUserInfoDelegate(CtcpEventArgs e) { SendMessage(SendType.CtcpReply, e.Data.Nick, "USERINFO " + ((CtcpUserInfo==null)?"No user info given.":CtcpUserInfo)); } private void CtcpUrlDelegate(CtcpEventArgs e) { SendMessage(SendType.CtcpReply, e.Data.Nick, "URL " + ((CtcpUrl==null)?"http://www.google.com":CtcpUrl)); } private void CtcpSourceDelegate(CtcpEventArgs e) { SendMessage(SendType.CtcpReply, e.Data.Nick, "SOURCE " + ((CtcpSource==null)?"http://smartirc4net.meebey.net":CtcpSource)); } private void CtcpFingerDelegate(CtcpEventArgs e) { SendMessage(SendType.CtcpReply, e.Data.Nick, "FINGER Don't touch little Helga there! " ); //SendMessage(SendType.CtcpReply, e.Data.Nick, "FINGER " + this.Realname + " (" + this.Email + ") Idle " + this.Idle + " seconds (" + ((string.IsNullOrEmpty(this.Reason))?this.Reason:"-") + ") " ); } private void CtcpDccDelegate(CtcpEventArgs e) { if (e.Data.MessageArray.Length < 2) { SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC missing parameters"); } else { switch(e.Data.MessageArray[1]) { case "CHAT": DccChat chat = new DccChat(this, _ExternalIpAdress, e); _DccConnections.Add(chat); ThreadPool.QueueUserWorkItem(new WaitCallback(chat.InitWork)); break; case "SEND": if (e.Data.MessageArray.Length > 6 && (FilterMarker(e.Data.MessageArray[6]) != "T")) { long session = -1; long.TryParse(FilterMarker(e.Data.MessageArray[6]), out session); foreach(DccConnection dc in _DccConnections) { if(dc.isSession(session)) { ((DccSend)dc).SetRemote(e); ((DccSend)dc).AcceptRequest(null, 0); return; } } SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG Invalid passive DCC"); } else { DccSend send = new DccSend(this, _ExternalIpAdress, e); _DccConnections.Add(send); ThreadPool.QueueUserWorkItem(new WaitCallback(send.InitWork)); } break; case "RESUME": foreach(DccConnection dc in _DccConnections) { if((dc is DccSend) && (((DccSend)dc).TryResume(e))) { return; } } SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG Invalid DCC RESUME"); break; case "ACCEPT": foreach(DccConnection dc in _DccConnections) { if((dc is DccSend) && (((DccSend)dc).TryAccept(e))) { return; } } SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG Invalid DCC ACCEPT"); break; case "XMIT": SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC XMIT not implemented"); break; default: SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC "+e.CtcpParameter+" unavailable"); break; } } } /// /// cleanup all old invalide DCCs (late cleaning) /// /// private void RemoveInvalidDccConnections() { // List invalidDc= new List(); foreach (DccConnection dc in _DccConnections) { if ((!dc.Valid) && (!dc.Connected)) { invalidDc.Add(dc); } } foreach (DccConnection dc in invalidDc) { _DccConnections.Remove(dc); } } private string FilterMarker(string msg) { string result = ""; foreach(char c in msg) { if (c!=IrcConstants.CtcpChar) result += c; } return result; } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/DccChat.cs0000664000175000017500000001654313014002107023225 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.IO; using System.Net; using System.Threading; using System.Net.Sockets; namespace Meebey.SmartIrc4net { /// /// Dcc Chat Connection, Line Based Text /// public class DccChat : DccConnection { #region Private Variables private StreamReader _sr; private StreamWriter _sw; private int _lines; #endregion #region Public Properties public int Lines { get { return _lines; } } #endregion /// /// Constructor of DCC CHat for local DCC Chat Request to a certain user. /// /// IrcFeature Class /// Chat Destination (channels are no valid targets) /// Our externally reachable IP Adress (can be anything if passive) /// if you have no reachable ports! /// Non DCC Message Priority internal DccChat(IrcFeatures irc, string user, IPAddress externalIpAdress, bool passive, Priority priority) : base() { this.Irc = irc; this.ExternalIPAdress = externalIpAdress; this.User = user; if(passive) { irc.SendMessage(SendType.CtcpRequest, user, "DCC CHAT chat " + HostToDccInt(externalIpAdress).ToString() + " 0 " + session, priority); this.Disconnect(); } else { DccServer = new TcpListener(new IPEndPoint(IPAddress.Any, 0)); DccServer.Start(); LocalEndPoint = (IPEndPoint)DccServer.LocalEndpoint; irc.SendMessage(SendType.CtcpRequest, user, "DCC CHAT chat " + HostToDccInt(externalIpAdress).ToString() + " " + LocalEndPoint.Port, priority); } } /// /// Constructor of a DCC Chat for a Incoming DCC Chat Request /// /// IrcFeature Class /// Our externally reachable IP Adress /// The Ctcp Event which initiated this constructor internal DccChat(IrcFeatures irc, IPAddress externalIpAdress, CtcpEventArgs e) : base () { this.Irc = irc; this.ExternalIPAdress = externalIpAdress; this.User = e.Data.Nick; long ip; int port; if (e.Data.MessageArray.Length > 4) { bool okIP = long.TryParse(e.Data.MessageArray[3], out ip); bool okPo = int.TryParse(FilterMarker(e.Data.MessageArray[4]), out port); // port 0 = passive if((e.Data.MessageArray[2]=="chat") && okIP && okPo) { RemoteEndPoint = new IPEndPoint(IPAddress.Parse(DccIntToHost(ip)), port); if (e.Data.MessageArray.Length > 5 && e.Data.MessageArray[5] != "T") { this.AcceptRequest(); // Since we initated the Request, we accept DCC return; // No OnDccChatRequestEvent Event! (we know that we want a connection) } DccChatRequestEvent(new DccEventArgs(this)); return; } else { irc.SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC Chat Parameter Error"); } } else { irc.SendMessage(SendType.CtcpReply, e.Data.Nick, "ERRMSG DCC Chat not enough parameters"); } this.isValid = false; } internal override void InitWork(Object stateInfo) { if (!Valid) return; if (DccServer != null) { Connection = DccServer.AcceptTcpClient(); RemoteEndPoint = (IPEndPoint)Connection.Client.RemoteEndPoint; DccServer.Stop(); isConnected = true; } else { while(!isConnected) { Thread.Sleep(500); // We wait till Request is Accepted (or jump out when rejected) if (reject) { isValid = false; return; } } } DccChatStartEvent(new DccEventArgs(this)); _sr = new StreamReader(Connection.GetStream(), Irc.Encoding); _sw = new StreamWriter(Connection.GetStream(), Irc.Encoding); _sw.AutoFlush = true; string line; while(((line = _sr.ReadLine())!=null) && (isConnected)) { DccChatReceiveLineEvent(new DccChatEventArgs(this, line)); _lines++; } isValid = false; isConnected = false; DccChatStopEvent(new DccEventArgs(this)); } #region Public Methods for the DCC Chat Object /// /// Accept an incoming Chatrequest, returns false if anything but a Connect happens /// /// public bool AcceptRequest() { if (isConnected) return false; try { if(RemoteEndPoint.Port==0) { DccServer = new TcpListener(new IPEndPoint(IPAddress.Any, 0)); DccServer.Start(); LocalEndPoint = (IPEndPoint)DccServer.LocalEndpoint; Irc.SendMessage(SendType.CtcpRequest, User, "DCC CHAT chat " + HostToDccInt(ExternalIPAdress).ToString() + " " + LocalEndPoint.Port); } else { Connection = new TcpClient(); Connection.Connect(RemoteEndPoint); isConnected = true; } return true; } catch(Exception) { isValid = false; isConnected = false; return false; } } public void WriteLine(string message) { if(isConnected) { _sw.WriteLine(message); _lines++; DccChatSentLineEvent(new DccChatEventArgs(this, message)); } else { throw new NotConnectedException("DCC Chat is not Connected"); } } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/IrcConstants.cs0000664000175000017500000000456013014002107024342 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; namespace Meebey.SmartIrc4net { /// /// Special IRC Charakters /// public class IrcConstants { public const char CtcpChar = '\x1'; public const char IrcBold = '\x2'; public const char IrcColor = '\x3'; public const char IrcReverse = '\x16'; public const char IrcNormal = '\xf'; public const char IrcUnderline = '\x1f'; public const char CtcpQuoteChar = '\x20'; } public enum DccSpeed { /// /// slow, ack every packet /// Rfc, /// /// hack, ignore acks, just send at max speed /// RfcSendAhead, /// /// fast, Turbo extension, no acks (Virc) /// Turbo } /// /// Mirc Compatible Colors /// public enum IrcColors { White = 0, Black = 1, Blue = 2, Green = 3, LightRed = 4, Brown = 5, Purple = 6, Orange = 7, Yellow = 8, LightGreen = 9, Cyan = 10, LightCyan = 11, LightBlue = 12, Pink = 13, Grey = 14, LightGrey = 15, Transparent = 99 } } smuxi-1.1/lib/SmartIrc4net/src/IrcFeatures/DccConnection.cs0000664000175000017500000001771713014002107024451 0ustar00meebeymeebey00000000000000/* * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2008-2009 Thomas Bruderer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.IO; using System.Net; using System.Threading; using System.Net.Sockets; namespace Meebey.SmartIrc4net { /// /// Baseclass for all DccConnections /// public class DccConnection { #region Private Variables protected IrcFeatures Irc; protected TcpListener DccServer; protected TcpClient Connection; protected IPEndPoint LocalEndPoint; protected IPEndPoint RemoteEndPoint; protected IPAddress ExternalIPAdress; protected DateTime Timeout; protected string User; protected bool isConnected = false; protected bool isValid = true; protected bool reject = false; protected long session; private class Session { private static long next; internal static long Next { get { return ++next; } } } #endregion #region Public Fields /// /// Returns false when the Connections is not Valid (before or after Connection) /// public bool Connected{ get { return isConnected; } } /// /// Returns false when the Connections is not Valid anymore (only at the end) /// public bool Valid{ get { return isValid && (isConnected || (DateTime.Now < Timeout)); } } /// /// Returns the Nick of the User we have a DCC with /// public string Nick { get { return User; } } #endregion #region Public DCC Events public event DccConnectionHandler OnDccChatRequestEvent; protected virtual void DccChatRequestEvent(DccEventArgs e) { if (OnDccChatRequestEvent!=null) {OnDccChatRequestEvent(this, e); } Irc.DccChatRequestEvent(e); } public event DccSendRequestHandler OnDccSendRequestEvent; protected virtual void DccSendRequestEvent(DccSendRequestEventArgs e) { if (OnDccSendRequestEvent!=null) {OnDccSendRequestEvent(this, e); } Irc.DccSendRequestEvent(e); } public event DccConnectionHandler OnDccChatStartEvent; protected virtual void DccChatStartEvent(DccEventArgs e) { if (OnDccChatStartEvent!=null) {OnDccChatStartEvent(this, e); } Irc.DccChatStartEvent(e); } public event DccConnectionHandler OnDccSendStartEvent; protected virtual void DccSendStartEvent(DccEventArgs e) { if (OnDccSendStartEvent!=null) {OnDccSendStartEvent(this, e); } Irc.DccSendStartEvent(e); } public event DccChatLineHandler OnDccChatReceiveLineEvent; protected virtual void DccChatReceiveLineEvent(DccChatEventArgs e) { if (OnDccChatReceiveLineEvent!=null) {OnDccChatReceiveLineEvent(this, e); } Irc.DccChatReceiveLineEvent(e); } public event DccSendPacketHandler OnDccSendReceiveBlockEvent; protected virtual void DccSendReceiveBlockEvent(DccSendEventArgs e) { if (OnDccSendReceiveBlockEvent!=null) {OnDccSendReceiveBlockEvent(this, e); } Irc.DccSendReceiveBlockEvent(e); } public event DccChatLineHandler OnDccChatSentLineEvent; protected virtual void DccChatSentLineEvent(DccChatEventArgs e) { if (OnDccChatSentLineEvent!=null) {OnDccChatSentLineEvent(this, e); } Irc.DccChatSentLineEvent(e); } public event DccSendPacketHandler OnDccSendSentBlockEvent; protected virtual void DccSendSentBlockEvent(DccSendEventArgs e) { if (OnDccSendSentBlockEvent!=null) {OnDccSendSentBlockEvent(this, e); } Irc.DccSendSentBlockEvent(e); } public event DccConnectionHandler OnDccChatStopEvent; protected virtual void DccChatStopEvent(DccEventArgs e) { if (OnDccChatStopEvent!=null) {OnDccChatStopEvent(this, e); } Irc.DccChatStopEvent(e); } public event DccConnectionHandler OnDccSendStopEvent; protected virtual void DccSendStopEvent(DccEventArgs e) { if (OnDccSendStopEvent!=null) {OnDccSendStopEvent(this, e); } Irc.DccSendStopEvent(e); } #endregion internal DccConnection() { //Each DccConnection gets a Unique Identifier (just used internally until we have a TcpClient connected) session = Session.Next; // If a Connection is not established within 120 Seconds we invalidate the DccConnection (see property Valid) Timeout = DateTime.Now.AddSeconds(120); } internal virtual void InitWork(Object stateInfo) { throw new NotSupportedException(); } internal bool isSession(long session) { return (session == this.session); } #region Public Methods public void RejectRequest() { Irc.SendMessage(SendType.CtcpReply, User, "ERRMSG DCC Rejected"); reject = true; isValid = false; } public void Disconnect() { isConnected = false; isValid = false; } public override string ToString() { return "DCC Session " + session + " of " + this.GetType().ToString() + " is " + ((isConnected)?"connected to "+RemoteEndPoint.Address.ToString():"not connected") + "[" + this.User + "]"; } #endregion #region protected Helper Functions protected long HostToDccInt(IPAddress ip) { long temp = (ip.Address & 0xff) << 24; temp |= (ip.Address & 0xff00) << 8; temp |= (ip.Address >> 8) & 0xff00; temp |= (ip.Address >> 24) & 0xff; return temp; } protected string DccIntToHost(long ip) { IPEndPoint ep = new IPEndPoint(ip, 80); char[] sep = { '.' }; string[] ipparts = ep.Address.ToString().Split(sep); return ipparts[3] + "." + ipparts[2] + "." + ipparts[1] + "." + ipparts[0]; } protected byte[] getAck(long SentBytes) { byte[] acks = new byte[4]; acks[0] = (byte)((SentBytes >>24 ) % 256); acks[1] = (byte)((SentBytes >>16 ) % 256); acks[2] = (byte)((SentBytes >>8 ) % 256); acks[3] = (byte)((SentBytes ) % 256); return acks; } protected string FilterMarker(string msg) { string result = ""; foreach(char c in msg) { if (c!=IrcConstants.CtcpChar) result += c; } return result; } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/IrcCommands/0000755000175000017500000000000013014002107021355 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/src/IrcCommands/Rfc2812.cs0000664000175000017500000004563213014002107022747 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Text; using System.Globalization; using System.Text.RegularExpressions; namespace Meebey.SmartIrc4net { /// /// /// /// public sealed class Rfc2812 { // nickname = ( letter / special ) *8( letter / digit / special / "-" ) // letter = %x41-5A / %x61-7A ; A-Z / a-z // digit = %x30-39 ; 0-9 // special = %x5B-60 / %x7B-7D // ; "[", "]", "\", "`", "_", "^", "{", "|", "}" private static Regex _NicknameRegex = new Regex(@"^[A-Za-z\[\]\\`_^{|}][A-Za-z0-9\[\]\\`_\-^{|}]+$", RegexOptions.Compiled); private Rfc2812() { } /// /// Checks if the passed nickname is valid according to the RFC /// /// Use with caution, many IRC servers are not conform with this! /// public static bool IsValidNickname(string nickname) { if ((nickname != null) && (nickname.Length > 0) && (_NicknameRegex.Match(nickname).Success)) { return true; } return false; } public static string Pass(string password) { return "PASS "+password; } public static string Nick(string nickname) { return "NICK "+nickname; } public static string User(string username, int usermode, string realname) { return "USER "+username+" "+usermode.ToString()+" * :"+realname; } public static string Oper(string name, string password) { return "OPER "+name+" "+password; } public static string Privmsg(string destination, string message) { return "PRIVMSG "+destination+" :"+message; } public static string Notice(string destination, string message) { return "NOTICE "+destination+" :"+message; } public static string Join(string channel) { return "JOIN "+channel; } public static string Join(string[] channels) { string channellist = String.Join(",", channels); return "JOIN "+channellist; } public static string Join(string channel, string key) { return "JOIN "+channel+" "+key; } public static string Join(string[] channels, string[] keys) { string channellist = String.Join(",", channels); string keylist = String.Join(",", keys); return "JOIN "+channellist+" "+keylist; } public static string Part(string channel) { return "PART "+channel; } public static string Part(string[] channels) { string channellist = String.Join(",", channels); return "PART "+channellist; } public static string Part(string channel, string partmessage) { return "PART "+channel+" :"+partmessage; } public static string Part(string[] channels, string partmessage) { string channellist = String.Join(",", channels); return "PART "+channellist+" :"+partmessage; } public static string Kick(string channel, string nickname) { return "KICK "+channel+" "+nickname; } public static string Kick(string channel, string nickname, string comment) { return "KICK "+channel+" "+nickname+" :"+comment; } public static string Kick(string[] channels, string nickname) { string channellist = String.Join(",", channels); return "KICK "+channellist+" "+nickname; } public static string Kick(string[] channels, string nickname, string comment) { string channellist = String.Join(",", channels); return "KICK "+channellist+" "+nickname+" :"+comment; } public static string Kick(string channel, string[] nicknames) { string nicknamelist = String.Join(",", nicknames); return "KICK "+channel+" "+nicknamelist; } public static string Kick(string channel, string[] nicknames, string comment) { string nicknamelist = String.Join(",", nicknames); return "KICK "+channel+" "+nicknamelist+" :"+comment; } public static string Kick(string[] channels, string[] nicknames) { string channellist = String.Join(",", channels); string nicknamelist = String.Join(",", nicknames); return "KICK "+channellist+" "+nicknamelist; } public static string Kick(string[] channels, string[] nicknames, string comment) { string channellist = String.Join(",", channels); string nicknamelist = String.Join(",", nicknames); return "KICK "+channellist+" "+nicknamelist+" :"+comment; } public static string Motd() { return "MOTD"; } public static string Motd(string target) { return "MOTD "+target; } [Obsolete("use Lusers() method instead")] public static string Luser() { return Lusers(); } public static string Lusers() { return "LUSERS"; } [Obsolete("use Lusers(string) method instead")] public static string Luser(string mask) { return Lusers(mask); } public static string Lusers(string mask) { return "LUSER "+mask; } [Obsolete("use Lusers(string, string) method instead")] public static string Luser(string mask, string target) { return Lusers(mask, target); } public static string Lusers(string mask, string target) { return "LUSER "+mask+" "+target; } public static string Version() { return "VERSION"; } public static string Version(string target) { return "VERSION "+target; } public static string Stats() { return "STATS"; } public static string Stats(string query) { return "STATS "+query; } public static string Stats(string query, string target) { return "STATS "+query+" "+target; } public static string Links() { return "LINKS"; } public static string Links(string servermask) { return "LINKS "+servermask; } public static string Links(string remoteserver, string servermask) { return "LINKS "+remoteserver+" "+servermask; } public static string Time() { return "TIME"; } public static string Time(string target) { return "TIME "+target; } public static string Connect(string targetserver, string port) { return "CONNECT "+targetserver+" "+port; } public static string Connect(string targetserver, string port, string remoteserver) { return "CONNECT "+targetserver+" "+port+" "+remoteserver; } public static string Trace() { return "TRACE"; } public static string Trace(string target) { return "TRACE "+target; } public static string Admin() { return "ADMIN"; } public static string Admin(string target) { return "ADMIN "+target; } public static string Info() { return "INFO"; } public static string Info(string target) { return "INFO "+target; } public static string Servlist() { return "SERVLIST"; } public static string Servlist(string mask) { return "SERVLIST "+mask; } public static string Servlist(string mask, string type) { return "SERVLIST "+mask+" "+type; } public static string Squery(string servicename, string servicetext) { return "SQUERY "+servicename+" :"+servicetext; } public static string List() { return "LIST"; } public static string List(string channel) { return "LIST "+channel; } public static string List(string[] channels) { string channellist = String.Join(",", channels); return "LIST "+channellist; } public static string List(string channel, string target) { return "LIST "+channel+" "+target; } public static string List(string[] channels, string target) { string channellist = String.Join(",", channels); return "LIST "+channellist+" "+target; } public static string Names() { return "NAMES"; } public static string Names(string channel) { return "NAMES "+channel; } public static string Names(string[] channels) { string channellist = String.Join(",", channels); return "NAMES "+channellist; } public static string Names(string channel, string target) { return "NAMES "+channel+" "+target; } public static string Names(string[] channels, string target) { string channellist = String.Join(",", channels); return "NAMES "+channellist+" "+target; } public static string Topic(string channel) { return "TOPIC "+channel; } public static string Topic(string channel, string newtopic) { return "TOPIC "+channel+" :"+newtopic; } public static string Mode(string target) { return "MODE "+target; } public static string Mode(string target, string newmode) { return "MODE "+target+" "+newmode; } public static string Mode(string target, string[] newModes, string[] newModeParameters) { if (newModes == null) { throw new ArgumentNullException("newModes"); } if (newModeParameters == null) { throw new ArgumentNullException("newModeParameters"); } if (newModes.Length != newModeParameters.Length) { throw new ArgumentException("newModes and newModeParameters must have the same size."); } StringBuilder newMode = new StringBuilder(newModes.Length); StringBuilder newModeParameter = new StringBuilder(); // as per RFC 3.2.3, maximum is 3 modes changes at once int maxModeChanges = 3; if (newModes.Length > maxModeChanges) { throw new ArgumentOutOfRangeException( "newModes.Length", newModes.Length, String.Format("Mode change list is too large (> {0}).", maxModeChanges) ); } for (int i = 0; i <= newModes.Length; i += maxModeChanges) { for (int j = 0; j < maxModeChanges; j++) { if (i + j >= newModes.Length) { break; } newMode.Append(newModes[i + j]); } for (int j = 0; j < maxModeChanges; j++) { if (i + j >= newModeParameters.Length) { break; } newModeParameter.Append(newModeParameters[i + j]); newModeParameter.Append(" "); } } if (newModeParameter.Length > 0) { // remove trailing space newModeParameter.Length--; newMode.Append(" "); newMode.Append(newModeParameter.ToString()); } return Mode(target, newMode.ToString()); } public static string Service(string nickname, string distribution, string info) { return "SERVICE "+nickname+" * "+distribution+" * * :"+info; } public static string Invite(string nickname, string channel) { return "INVITE "+nickname+" "+channel; } public static string Who() { return "WHO"; } public static string Who(string mask) { return "WHO "+mask; } public static string Who(string mask, bool ircop) { if (ircop) { return "WHO "+mask+" o"; } else { return "WHO "+mask; } } public static string Whois(string mask) { return "WHOIS "+mask; } public static string Whois(string[] masks) { string masklist = String.Join(",", masks); return "WHOIS "+masklist; } public static string Whois(string target, string mask) { return "WHOIS "+target+" "+mask; } public static string Whois(string target, string[] masks) { string masklist = String.Join(",", masks); return "WHOIS "+target+" "+masklist; } public static string Whowas(string nickname) { return "WHOWAS "+nickname; } public static string Whowas(string[] nicknames) { string nicknamelist = String.Join(",", nicknames); return "WHOWAS "+nicknamelist; } public static string Whowas(string nickname, string count) { return "WHOWAS "+nickname+" "+count+" "; } public static string Whowas(string[] nicknames, string count) { string nicknamelist = String.Join(",", nicknames); return "WHOWAS "+nicknamelist+" "+count+" "; } public static string Whowas(string nickname, string count, string target) { return "WHOWAS "+nickname+" "+count+" "+target; } public static string Whowas(string[] nicknames, string count, string target) { string nicknamelist = String.Join(",", nicknames); return "WHOWAS "+nicknamelist+" "+count+" "+target; } public static string Kill(string nickname, string comment) { return "KILL "+nickname+" :"+comment; } public static string Ping(string server) { return "PING "+server; } public static string Ping(string server, string server2) { return "PING "+server+" "+server2; } public static string Pong(string server) { return "PONG "+server; } public static string Pong(string server, string server2) { return "PONG "+server+" "+server2; } public static string Error(string errormessage) { return "ERROR :"+errormessage; } public static string Away() { return "AWAY"; } public static string Away(string awaytext) { return "AWAY :"+awaytext; } public static string Rehash() { return "REHASH"; } public static string Die() { return "DIE"; } public static string Restart() { return "RESTART"; } public static string Summon(string user) { return "SUMMON "+user; } public static string Summon(string user, string target) { return "SUMMON "+user+" "+target; } public static string Summon(string user, string target, string channel) { return "SUMMON "+user+" "+target+" "+channel; } public static string Users() { return "USERS"; } public static string Users(string target) { return "USERS "+target; } public static string Wallops(string wallopstext) { return "WALLOPS :"+wallopstext; } public static string Userhost(string nickname) { return "USERHOST "+nickname; } public static string Userhost(string[] nicknames) { string nicknamelist = String.Join(" ", nicknames); return "USERHOST "+nicknamelist; } public static string Ison(string nickname) { return "ISON "+nickname; } public static string Ison(string[] nicknames) { string nicknamelist = String.Join(" ", nicknames); return "ISON "+nicknamelist; } public static string Quit() { return "QUIT"; } public static string Quit(string quitmessage) { return "QUIT :"+quitmessage; } public static string Squit(string server, string comment) { return "SQUIT "+server+" :"+comment; } } } smuxi-1.1/lib/SmartIrc4net/src/IrcCommands/IrcCommands.cs0000664000175000017500000022144613014002107024116 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections.Generic; using System.Text; namespace Meebey.SmartIrc4net { /// /// /// /// public class IrcCommands : IrcConnection { private int _MaxModeChanges = 3; protected int MaxModeChanges { get { return _MaxModeChanges; } set { _MaxModeChanges = value; } } #if LOG4NET public IrcCommands() { Logger.Main.Debug("IrcCommands created"); } #endif #if LOG4NET ~IrcCommands() { Logger.Main.Debug("IrcCommands destroyed"); } #endif // API commands /// /// /// /// /// /// /// public void SendMessage(SendType type, string destination, string message, Priority priority) { switch(type) { case SendType.Message: RfcPrivmsg(destination, message, priority); break; case SendType.Action: RfcPrivmsg(destination, "\x1"+"ACTION "+message+"\x1", priority); break; case SendType.Notice: RfcNotice(destination, message, priority); break; case SendType.CtcpRequest: RfcPrivmsg(destination, "\x1"+message+"\x1", priority); break; case SendType.CtcpReply: RfcNotice(destination, "\x1"+message+"\x1", priority); break; } } /// /// /// /// /// /// public void SendMessage(SendType type, string destination, string message) { SendMessage(type, destination, message, Priority.Medium); } /// /// /// /// /// /// public void SendReply(IrcMessageData data, string message, Priority priority) { switch (data.Type) { case ReceiveType.ChannelMessage: SendMessage(SendType.Message, data.Channel, message, priority); break; case ReceiveType.QueryMessage: SendMessage(SendType.Message, data.Nick, message, priority); break; case ReceiveType.QueryNotice: SendMessage(SendType.Notice, data.Nick, message, priority); break; } } /// /// /// /// /// public void SendReply(IrcMessageData data, string message) { SendReply(data, message, Priority.Medium); } /// /// Give or take a user's privilege in a channel. /// /// The mode change (e.g. +o) to perform on the user. /// The channel in which to perform the privilege change. /// The nickname of the user whose privilege is being changed. /// The priority with which the mode-setting message should be sent. public void ChangeChannelPrivilege(string modechg, string channel, string nickname, Priority priority) { WriteLine(Rfc2812.Mode(channel, modechg + " " + nickname), priority); } /// /// Give or take a user's privilege in a channel. /// /// The mode change (e.g. +o) to perform on the user. /// The channel in which to perform the privilege change. /// The nickname of the user whose privilege is being changed. public void ChangeChannelPrivilege(string modechg, string channel, string nickname) { WriteLine(Rfc2812.Mode(channel, modechg + " " + nickname)); } /// /// Give or take a privilege to/from multiple users in a channel. /// /// The mode change (e.g. +o) to perform on the users. /// The channel in which to give the users a privilege. /// The nicknames of the users receiving the privilege. public void ChangeChannelPrivilege(string modechg, string channel, string[] nicknames) { if (nicknames == null) { throw new ArgumentNullException("nicknames"); } string[] modes = new string[nicknames.Length]; for (int i = 0; i < nicknames.Length; i++) { modes[i] = modechg; } Mode(channel, modes, nicknames); } public void Op(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("+o", channel, nickname, priority); } public void Op(string channel, string[] nicknames) { ChangeChannelPrivilege("+o", channel, nicknames); } public void Op(string channel, string nickname) { ChangeChannelPrivilege("+o", channel, nickname); } public void Deop(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("-o", channel, nickname, priority); } public void Deop(string channel, string[] nicknames) { ChangeChannelPrivilege("-o", channel, nicknames); } public void Deop(string channel, string nickname) { ChangeChannelPrivilege("-o", channel, nickname); } public void Voice(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("+v", channel, nickname, priority); } public void Voice(string channel, string[] nicknames) { ChangeChannelPrivilege("+v", channel, nicknames); } public void Voice(string channel, string nickname) { ChangeChannelPrivilege("+v", channel, nickname); } public void Devoice(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("-v", channel, nickname, priority); } public void Devoice(string channel, string[] nicknames) { ChangeChannelPrivilege("-v", channel, nicknames); } public void Devoice(string channel, string nickname) { ChangeChannelPrivilege("-v", channel, nickname); } /// /// Fetch a list of entries of a mask-format channel mode. /// /// The type of the mask-format mode (e.g. +b) to fetch. /// The channel whose mode to fetch. public void ListChannelMasks(string modetype, string channel) { WriteLine(Rfc2812.Mode(channel, modetype)); } /// /// Fetch a list of entries of a mask-format channel mode. /// /// The type of the mask-format mode (e.g. +b) to fetch. /// The channel whose mode to fetch. /// The priority with which the mode-setting message should be sent. public void ListChannelMasks(string modetype, string channel, Priority priority) { WriteLine(Rfc2812.Mode(channel, modetype), priority); } /// /// Add or remove an entry to/from a mask-format channel mode. /// /// The type of the mask-format mode (e.g. +b) whose entries to modify. /// The channel whose mode to edit. /// The hostmask of the entry to add/remove. /// The priority with which the mode-setting message should be sent. public void ModifyChannelMasks(string modetype, string channel, string hostmask, Priority priority) { WriteLine(Rfc2812.Mode(channel, modetype + " " + hostmask), priority); } /// /// Add or remove an entry to/from a mask-format channel mode. /// /// The type of the mask-format mode (e.g. +b) whose entries to modify. /// The channel whose mode to edit. /// The hostmask of the entry to add/remove. public void ModifyChannelMasks(string modetype, string channel, string hostmask) { WriteLine(Rfc2812.Mode(channel, modetype + " " + hostmask)); } /// /// Add or remove multiple entries to/from a mask-format channel mode. /// /// The type of the mask-format mode (e.g. +b) whose entries to modify. /// The channel whose mode to edit. /// The hostmasks of the entries to add/remove. public void ModifyChannelMasks(string modetype, string channel, string[] hostmasks) { if (hostmasks == null) { throw new ArgumentNullException("hostmasks"); } string[] modes = new string[hostmasks.Length]; for (int i = 0; i < hostmasks.Length; i++) { modes[i] = modetype; } Mode(channel, modes, hostmasks); } public void Ban(string channel) { ListChannelMasks("+b", channel); } public void Ban(string channel, string hostmask, Priority priority) { ModifyChannelMasks("+b", channel, hostmask, priority); } public void Ban(string channel, string hostmask) { ModifyChannelMasks("+b", channel, hostmask); } public void Ban(string channel, string[] hostmasks) { ModifyChannelMasks("+b", channel, hostmasks); } public void Unban(string channel, string hostmask, Priority priority) { ModifyChannelMasks("-b", channel, hostmask, priority); } public void Unban(string channel, string hostmask) { ModifyChannelMasks("-b", channel, hostmask); } public void Unban(string channel, string[] hostmasks) { ModifyChannelMasks("-b", channel, hostmasks); } public virtual void BanException(string channel) { ListChannelMasks("+e", channel); } public virtual void BanException(string channel, string hostmask, Priority priority) { ModifyChannelMasks("+e", channel, hostmask, priority); } public virtual void BanException(string channel, string hostmask) { ModifyChannelMasks("+e", channel, hostmask); } public virtual void BanException(string channel, string[] hostmasks) { ModifyChannelMasks("+e", channel, hostmasks); } public virtual void UnBanException(string channel, string hostmask, Priority priority) { ModifyChannelMasks("-e", channel, hostmask, priority); } public virtual void UnBanException(string channel, string hostmask) { ModifyChannelMasks("-e", channel, hostmask); } public virtual void UnBanException(string channel, string[] hostmasks) { ModifyChannelMasks("-e", channel, hostmasks); } public virtual void InviteException(string channel) { ListChannelMasks("+I", channel); } public virtual void InviteException(string channel, string hostmask, Priority priority) { ModifyChannelMasks("+I", channel, hostmask, priority); } public virtual void InviteException(string channel, string hostmask) { ModifyChannelMasks("+I", channel, hostmask); } public virtual void InviteException(string channel, string[] hostmasks) { ModifyChannelMasks("+I", channel, hostmasks); } public virtual void UnInviteException(string channel, string hostmask, Priority priority) { ModifyChannelMasks("-I", channel, hostmask, priority); } public virtual void UnInviteException(string channel, string hostmask) { ModifyChannelMasks("-I", channel, hostmask); } public virtual void UnInviteException(string channel, string[] hostmasks) { ModifyChannelMasks("-I", channel, hostmasks); } // non-RFC commands public void Owner(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("+q", channel, nickname, priority); } public void Owner(string channel, string[] nicknames) { ChangeChannelPrivilege("+q", channel, nicknames); } public void Owner(string channel, string nickname) { ChangeChannelPrivilege("+q", channel, nickname); } public void Deowner(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("-q", channel, nickname, priority); } public void Deowner(string channel, string[] nicknames) { ChangeChannelPrivilege("-q", channel, nicknames); } public void Deowner(string channel, string nickname) { ChangeChannelPrivilege("-q", channel, nickname); } public void ChanAdmin(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("+a", channel, nickname, priority); } public void ChanAdmin(string channel, string[] nicknames) { ChangeChannelPrivilege("+a", channel, nicknames); } public void ChanAdmin(string channel, string nickname) { ChangeChannelPrivilege("+a", channel, nickname); } public void DeChanAdmin(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("-a", channel, nickname, priority); } public void DeChanAdmin(string channel, string[] nicknames) { ChangeChannelPrivilege("-a", channel, nicknames); } public void DeChanAdmin(string channel, string nickname) { ChangeChannelPrivilege("-a", channel, nickname); } public void Halfop(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("+h", channel, nickname, priority); } public void Halfop(string channel, string[] nicknames) { ChangeChannelPrivilege("+h", channel, nicknames); } public void Halfop(string channel, string nickname) { ChangeChannelPrivilege("+h", channel, nickname); } public void Dehalfop(string channel, string nickname, Priority priority) { ChangeChannelPrivilege("-h", channel, nickname, priority); } public void Dehalfop(string channel, string[] nicknames) { ChangeChannelPrivilege("-h", channel, nicknames); } public void Dehalfop(string channel, string nickname) { ChangeChannelPrivilege("-h", channel, nickname); } /// /// /// /// /// /// public void Mode(string target, string[] newModes, string[] newModeParameters) { if (target == null) { throw new ArgumentNullException("target"); } if (newModes == null) { throw new ArgumentNullException("newModes"); } if (newModeParameters == null) { throw new ArgumentNullException("newModeParameters"); } if (newModes.Length == 0) { throw new ArgumentException("newModes must not be empty." , "newModes"); } if (newModeParameters.Length == 0) { throw new ArgumentException("newModeParameters must not be empty." , "newModeParameters"); } if (newModes.Length != newModeParameters.Length) { throw new ArgumentException("newModes and newModeParameters must have the same size.", "newModes"); } int maxModeChanges = _MaxModeChanges; for (int i = 0; i < newModes.Length; i += maxModeChanges) { var newModeChunks = new List(maxModeChanges); var newModeParameterChunks = new List(maxModeChanges); for (int j = 0; j < maxModeChanges; j++) { if (i + j >= newModes.Length) { break; } newModeChunks.Add(newModes[i + j]); newModeParameterChunks.Add(newModeParameters[i + j]); } WriteLine(Rfc2812.Mode(target, newModeChunks.ToArray(), newModeParameterChunks.ToArray())); } } #region RFC commands /// /// /// /// /// public void RfcPass(string password, Priority priority) { WriteLine(Rfc2812.Pass(password), priority); } /// /// /// /// public void RfcPass(string password) { WriteLine(Rfc2812.Pass(password)); } /// /// /// /// /// /// /// public void RfcUser(string username, int usermode, string realname, Priority priority) { WriteLine(Rfc2812.User(username, usermode, realname), priority); } /// /// /// /// /// /// public void RfcUser(string username, int usermode, string realname) { WriteLine(Rfc2812.User(username, usermode, realname)); } /// /// /// /// /// /// public void RfcOper(string name, string password, Priority priority) { WriteLine(Rfc2812.Oper(name, password), priority); } /// /// /// /// /// public void RfcOper(string name, string password) { WriteLine(Rfc2812.Oper(name, password)); } /// /// /// /// /// /// public void RfcPrivmsg(string destination, string message, Priority priority) { WriteLine(Rfc2812.Privmsg(destination, message), priority); } /// /// /// /// /// public void RfcPrivmsg(string destination, string message) { WriteLine(Rfc2812.Privmsg(destination, message)); } /// /// /// /// /// /// public void RfcNotice(string destination, string message, Priority priority) { WriteLine(Rfc2812.Notice(destination, message), priority); } /// /// /// /// /// public void RfcNotice(string destination, string message) { WriteLine(Rfc2812.Notice(destination, message)); } /// /// /// /// /// public void RfcJoin(string channel, Priority priority) { WriteLine(Rfc2812.Join(channel), priority); } /// /// /// /// public void RfcJoin(string channel) { WriteLine(Rfc2812.Join(channel)); } /// /// /// /// /// public void RfcJoin(string[] channels, Priority priority) { WriteLine(Rfc2812.Join(channels), priority); } /// /// /// /// public void RfcJoin(string[] channels) { WriteLine(Rfc2812.Join(channels)); } /// /// /// /// /// /// public void RfcJoin(string channel, string key, Priority priority) { WriteLine(Rfc2812.Join(channel, key), priority); } /// /// /// /// /// public void RfcJoin(string channel, string key) { WriteLine(Rfc2812.Join(channel, key)); } /// /// /// /// /// /// public void RfcJoin(string[] channels, string[] keys, Priority priority) { WriteLine(Rfc2812.Join(channels, keys), priority); } /// /// /// /// /// public void RfcJoin(string[] channels, string[] keys) { WriteLine(Rfc2812.Join(channels, keys)); } /// /// /// /// /// public void RfcPart(string channel, Priority priority) { WriteLine(Rfc2812.Part(channel), priority); } /// /// /// /// public void RfcPart(string channel) { WriteLine(Rfc2812.Part(channel)); } /// /// /// /// /// public void RfcPart(string[] channels, Priority priority) { WriteLine(Rfc2812.Part(channels), priority); } /// /// /// /// public void RfcPart(string[] channels) { WriteLine(Rfc2812.Part(channels)); } /// /// /// /// /// /// public void RfcPart(string channel, string partmessage, Priority priority) { WriteLine(Rfc2812.Part(channel, partmessage), priority); } /// /// /// /// /// public void RfcPart(string channel, string partmessage) { WriteLine(Rfc2812.Part(channel, partmessage)); } /// /// /// /// /// /// public void RfcPart(string[] channels, string partmessage, Priority priority) { WriteLine(Rfc2812.Part(channels, partmessage), priority); } /// /// /// /// /// public void RfcPart(string[] channels, string partmessage) { WriteLine(Rfc2812.Part(channels, partmessage)); } /// /// /// /// /// /// public void RfcKick(string channel, string nickname, Priority priority) { WriteLine(Rfc2812.Kick(channel, nickname), priority); } /// /// /// /// /// public void RfcKick(string channel, string nickname) { WriteLine(Rfc2812.Kick(channel, nickname)); } /// /// /// /// /// /// public void RfcKick(string[] channels, string nickname, Priority priority) { WriteLine(Rfc2812.Kick(channels, nickname), priority); } /// /// /// /// /// public void RfcKick(string[] channels, string nickname) { WriteLine(Rfc2812.Kick(channels, nickname)); } /// /// /// /// /// /// public void RfcKick(string channel, string[] nicknames, Priority priority) { WriteLine(Rfc2812.Kick(channel, nicknames), priority); } /// /// /// /// /// public void RfcKick(string channel, string[] nicknames) { WriteLine(Rfc2812.Kick(channel, nicknames)); } /// /// /// /// /// /// public void RfcKick(string[] channels, string[] nicknames, Priority priority) { WriteLine(Rfc2812.Kick(channels, nicknames), priority); } /// /// /// /// /// public void RfcKick(string[] channels, string[] nicknames) { WriteLine(Rfc2812.Kick(channels, nicknames)); } /// /// /// /// /// /// /// public void RfcKick(string channel, string nickname, string comment, Priority priority) { WriteLine(Rfc2812.Kick(channel, nickname, comment), priority); } /// /// /// /// /// /// public void RfcKick(string channel, string nickname, string comment) { WriteLine(Rfc2812.Kick(channel, nickname, comment)); } /// /// /// /// /// /// /// public void RfcKick(string[] channels, string nickname, string comment, Priority priority) { WriteLine(Rfc2812.Kick(channels, nickname, comment), priority); } /// /// /// /// /// /// public void RfcKick(string[] channels, string nickname, string comment) { WriteLine(Rfc2812.Kick(channels, nickname, comment)); } /// /// /// /// /// /// /// public void RfcKick(string channel, string[] nicknames, string comment, Priority priority) { WriteLine(Rfc2812.Kick(channel, nicknames, comment), priority); } /// /// /// /// /// /// public void RfcKick(string channel, string[] nicknames, string comment) { WriteLine(Rfc2812.Kick(channel, nicknames, comment)); } /// /// /// /// /// /// /// public void RfcKick(string[] channels, string[] nicknames, string comment, Priority priority) { WriteLine(Rfc2812.Kick(channels, nicknames, comment), priority); } /// /// /// /// /// /// public void RfcKick(string[] channels, string[] nicknames, string comment) { WriteLine(Rfc2812.Kick(channels, nicknames, comment)); } /// /// /// /// public void RfcMotd(Priority priority) { WriteLine(Rfc2812.Motd(), priority); } /// /// /// public void RfcMotd() { WriteLine(Rfc2812.Motd()); } /// /// /// /// /// public void RfcMotd(string target, Priority priority) { WriteLine(Rfc2812.Motd(target), priority); } /// /// /// /// public void RfcMotd(string target) { WriteLine(Rfc2812.Motd(target)); } /// /// /// /// [Obsolete("use RfcLusers(Priority) instead")] public void RfcLuser(Priority priority) { RfcLusers(priority); } public void RfcLusers(Priority priority) { WriteLine(Rfc2812.Lusers(), priority); } /// /// /// [Obsolete("use RfcLusers() instead")] public void RfcLuser() { RfcLusers(); } public void RfcLusers() { WriteLine(Rfc2812.Lusers()); } /// /// /// /// /// [Obsolete("use RfcLusers(string, Priority) instead")] public void RfcLuser(string mask, Priority priority) { RfcLusers(mask, priority); } public void RfcLusers(string mask, Priority priority) { WriteLine(Rfc2812.Lusers(mask), priority); } /// /// /// /// [Obsolete("use RfcLusers(string) instead")] public void RfcLuser(string mask) { RfcLusers(mask); } public void RfcLusers(string mask) { WriteLine(Rfc2812.Lusers(mask)); } /// /// /// /// /// /// [Obsolete("use RfcLusers(string, string, Priority) instead")] public void RfcLuser(string mask, string target, Priority priority) { RfcLusers(mask, target, priority); } public void RfcLusers(string mask, string target, Priority priority) { WriteLine(Rfc2812.Lusers(mask, target), priority); } /// /// /// /// /// [Obsolete("use RfcLusers(string, string) instead")] public void RfcLuser(string mask, string target) { RfcLusers(mask, target); } public void RfcLusers(string mask, string target) { WriteLine(Rfc2812.Lusers(mask, target)); } /// /// /// /// public void RfcVersion(Priority priority) { WriteLine(Rfc2812.Version(), priority); } /// /// /// public void RfcVersion() { WriteLine(Rfc2812.Version()); } /// /// /// /// /// public void RfcVersion(string target, Priority priority) { WriteLine(Rfc2812.Version(target), priority); } /// /// /// /// public void RfcVersion(string target) { WriteLine(Rfc2812.Version(target)); } /// /// /// /// public void RfcStats(Priority priority) { WriteLine(Rfc2812.Stats(), priority); } /// /// /// public void RfcStats() { WriteLine(Rfc2812.Stats()); } /// /// /// /// /// public void RfcStats(string query, Priority priority) { WriteLine(Rfc2812.Stats(query), priority); } /// /// /// /// public void RfcStats(string query) { WriteLine(Rfc2812.Stats(query)); } /// /// /// /// /// /// public void RfcStats(string query, string target, Priority priority) { WriteLine(Rfc2812.Stats(query, target), priority); } /// /// /// /// /// public void RfcStats(string query, string target) { WriteLine(Rfc2812.Stats(query, target)); } /// /// /// public void RfcLinks() { WriteLine(Rfc2812.Links()); } /// /// /// /// /// public void RfcLinks(string servermask, Priority priority) { WriteLine(Rfc2812.Links(servermask), priority); } /// /// /// /// public void RfcLinks(string servermask) { WriteLine(Rfc2812.Links(servermask)); } /// /// /// /// /// /// public void RfcLinks(string remoteserver, string servermask, Priority priority) { WriteLine(Rfc2812.Links(remoteserver, servermask), priority); } /// /// /// /// /// public void RfcLinks(string remoteserver, string servermask) { WriteLine(Rfc2812.Links(remoteserver, servermask)); } /// /// /// /// public void RfcTime(Priority priority) { WriteLine(Rfc2812.Time(), priority); } /// /// /// public void RfcTime() { WriteLine(Rfc2812.Time()); } /// /// /// /// /// public void RfcTime(string target, Priority priority) { WriteLine(Rfc2812.Time(target), priority); } /// /// /// /// public void RfcTime(string target) { WriteLine(Rfc2812.Time(target)); } /// /// /// /// /// /// public void RfcConnect(string targetserver, string port, Priority priority) { WriteLine(Rfc2812.Connect(targetserver, port), priority); } /// /// /// /// /// public void RfcConnect(string targetserver, string port) { WriteLine(Rfc2812.Connect(targetserver, port)); } /// /// /// /// /// /// /// public void RfcConnect(string targetserver, string port, string remoteserver, Priority priority) { WriteLine(Rfc2812.Connect(targetserver, port, remoteserver), priority); } /// /// /// /// /// /// public void RfcConnect(string targetserver, string port, string remoteserver) { WriteLine(Rfc2812.Connect(targetserver, port, remoteserver)); } /// /// /// /// public void RfcTrace(Priority priority) { WriteLine(Rfc2812.Trace(), priority); } /// /// /// public void RfcTrace() { WriteLine(Rfc2812.Trace()); } /// /// /// /// /// public void RfcTrace(string target, Priority priority) { WriteLine(Rfc2812.Trace(target), priority); } /// /// /// /// public void RfcTrace(string target) { WriteLine(Rfc2812.Trace(target)); } /// /// /// /// public void RfcAdmin(Priority priority) { WriteLine(Rfc2812.Admin(), priority); } /// /// /// public void RfcAdmin() { WriteLine(Rfc2812.Admin()); } /// /// /// /// /// public void RfcAdmin(string target, Priority priority) { WriteLine(Rfc2812.Admin(target), priority); } /// /// /// /// public void RfcAdmin(string target) { WriteLine(Rfc2812.Admin(target)); } /// /// /// /// public void RfcInfo(Priority priority) { WriteLine(Rfc2812.Info(), priority); } /// /// /// public void RfcInfo() { WriteLine(Rfc2812.Info()); } /// /// /// /// /// public void RfcInfo(string target, Priority priority) { WriteLine(Rfc2812.Info(target), priority); } /// /// /// /// public void RfcInfo(string target) { WriteLine(Rfc2812.Info(target)); } /// /// /// /// public void RfcServlist(Priority priority) { WriteLine(Rfc2812.Servlist(), priority); } /// /// /// public void RfcServlist() { WriteLine(Rfc2812.Servlist()); } /// /// /// /// /// public void RfcServlist(string mask, Priority priority) { WriteLine(Rfc2812.Servlist(mask), priority); } /// /// /// /// public void RfcServlist(string mask) { WriteLine(Rfc2812.Servlist(mask)); } /// /// /// /// /// /// public void RfcServlist(string mask, string type, Priority priority) { WriteLine(Rfc2812.Servlist(mask, type), priority); } /// /// /// /// /// public void RfcServlist(string mask, string type) { WriteLine(Rfc2812.Servlist(mask, type)); } /// /// /// /// /// /// public void RfcSquery(string servicename, string servicetext, Priority priority) { WriteLine(Rfc2812.Squery(servicename, servicetext), priority); } /// /// /// /// /// public void RfcSquery(string servicename, string servicetext) { WriteLine(Rfc2812.Squery(servicename, servicetext)); } /// /// /// /// /// public void RfcList(string channel, Priority priority) { WriteLine(Rfc2812.List(channel), priority); } /// /// /// /// public void RfcList(string channel) { WriteLine(Rfc2812.List(channel)); } /// /// /// /// /// public void RfcList(string[] channels, Priority priority) { WriteLine(Rfc2812.List(channels), priority); } /// /// /// /// public void RfcList(string[] channels) { WriteLine(Rfc2812.List(channels)); } /// /// /// /// /// /// public void RfcList(string channel, string target, Priority priority) { WriteLine(Rfc2812.List(channel, target), priority); } /// /// /// /// /// public void RfcList(string channel, string target) { WriteLine(Rfc2812.List(channel, target)); } /// /// /// /// /// /// public void RfcList(string[] channels, string target, Priority priority) { WriteLine(Rfc2812.List(channels, target), priority); } /// /// /// /// /// public void RfcList(string[] channels, string target) { WriteLine(Rfc2812.List(channels, target)); } /// /// /// /// /// public void RfcNames(string channel, Priority priority) { WriteLine(Rfc2812.Names(channel), priority); } /// /// /// /// public void RfcNames(string channel) { WriteLine(Rfc2812.Names(channel)); } /// /// /// /// /// public void RfcNames(string[] channels, Priority priority) { WriteLine(Rfc2812.Names(channels), priority); } /// /// /// /// public void RfcNames(string[] channels) { WriteLine(Rfc2812.Names(channels)); } /// /// /// /// /// /// public void RfcNames(string channel, string target, Priority priority) { WriteLine(Rfc2812.Names(channel, target), priority); } /// /// /// /// /// public void RfcNames(string channel, string target) { WriteLine(Rfc2812.Names(channel, target)); } /// /// /// /// /// /// public void RfcNames(string[] channels, string target, Priority priority) { WriteLine(Rfc2812.Names(channels, target), priority); } /// /// /// /// /// public void RfcNames(string[] channels, string target) { WriteLine(Rfc2812.Names(channels, target)); } /// /// /// /// /// public void RfcTopic(string channel, Priority priority) { WriteLine(Rfc2812.Topic(channel), priority); } /// /// /// /// public void RfcTopic(string channel) { WriteLine(Rfc2812.Topic(channel)); } /// /// /// /// /// /// public void RfcTopic(string channel, string newtopic, Priority priority) { WriteLine(Rfc2812.Topic(channel, newtopic), priority); } /// /// /// /// /// public void RfcTopic(string channel, string newtopic) { WriteLine(Rfc2812.Topic(channel, newtopic)); } /// /// /// /// /// public void RfcMode(string target, Priority priority) { WriteLine(Rfc2812.Mode(target), priority); } /// /// /// /// public void RfcMode(string target) { WriteLine(Rfc2812.Mode(target)); } /// /// /// /// /// /// public void RfcMode(string target, string newmode, Priority priority) { WriteLine(Rfc2812.Mode(target, newmode), priority); } /// /// /// /// /// public void RfcMode(string target, string newmode) { WriteLine(Rfc2812.Mode(target, newmode)); } /// /// /// /// /// /// /// public void RfcService(string nickname, string distribution, string info, Priority priority) { WriteLine(Rfc2812.Service(nickname, distribution, info), priority); } /// /// /// /// /// /// public void RfcService(string nickname, string distribution, string info) { WriteLine(Rfc2812.Service(nickname, distribution, info)); } /// /// /// /// /// /// public void RfcInvite(string nickname, string channel, Priority priority) { WriteLine(Rfc2812.Invite(nickname, channel), priority); } /// /// /// /// /// public void RfcInvite(string nickname, string channel) { WriteLine(Rfc2812.Invite(nickname, channel)); } /// /// /// /// /// public void RfcNick(string newnickname, Priority priority) { WriteLine(Rfc2812.Nick(newnickname), priority); } /// /// /// /// public void RfcNick(string newnickname) { WriteLine(Rfc2812.Nick(newnickname)); } /// /// /// /// public void RfcWho(Priority priority) { WriteLine(Rfc2812.Who(), priority); } /// /// /// public void RfcWho() { WriteLine(Rfc2812.Who()); } /// /// /// /// /// public void RfcWho(string mask, Priority priority) { WriteLine(Rfc2812.Who(mask), priority); } /// /// /// /// public void RfcWho(string mask) { WriteLine(Rfc2812.Who(mask)); } /// /// /// /// /// /// public void RfcWho(string mask, bool ircop, Priority priority) { WriteLine(Rfc2812.Who(mask, ircop), priority); } /// /// /// /// /// public void RfcWho(string mask, bool ircop) { WriteLine(Rfc2812.Who(mask, ircop)); } /// /// /// /// /// public void RfcWhois(string mask, Priority priority) { WriteLine(Rfc2812.Whois(mask), priority); } /// /// /// /// public void RfcWhois(string mask) { WriteLine(Rfc2812.Whois(mask)); } /// /// /// /// /// public void RfcWhois(string[] masks, Priority priority) { WriteLine(Rfc2812.Whois(masks), priority); } /// /// /// /// public void RfcWhois(string[] masks) { WriteLine(Rfc2812.Whois(masks)); } /// /// /// /// /// /// public void RfcWhois(string target, string mask, Priority priority) { WriteLine(Rfc2812.Whois(target, mask), priority); } /// /// /// /// /// public void RfcWhois(string target, string mask) { WriteLine(Rfc2812.Whois(target, mask)); } /// /// /// /// /// /// public void RfcWhois(string target, string[] masks, Priority priority) { WriteLine(Rfc2812.Whois(target ,masks), priority); } /// /// /// /// /// public void RfcWhois(string target, string[] masks) { WriteLine(Rfc2812.Whois(target, masks)); } /// /// /// /// /// public void RfcWhowas(string nickname, Priority priority) { WriteLine(Rfc2812.Whowas(nickname), priority); } /// /// /// /// public void RfcWhowas(string nickname) { WriteLine(Rfc2812.Whowas(nickname)); } /// /// /// /// /// public void RfcWhowas(string[] nicknames, Priority priority) { WriteLine(Rfc2812.Whowas(nicknames), priority); } /// /// /// /// public void RfcWhowas(string[] nicknames) { WriteLine(Rfc2812.Whowas(nicknames)); } /// /// /// /// /// /// public void RfcWhowas(string nickname, string count, Priority priority) { WriteLine(Rfc2812.Whowas(nickname, count), priority); } /// /// /// /// /// public void RfcWhowas(string nickname, string count) { WriteLine(Rfc2812.Whowas(nickname, count)); } /// /// /// /// /// /// public void RfcWhowas(string[] nicknames, string count, Priority priority) { WriteLine(Rfc2812.Whowas(nicknames, count), priority); } /// /// /// /// /// public void RfcWhowas(string[] nicknames, string count) { WriteLine(Rfc2812.Whowas(nicknames, count)); } /// /// /// /// /// /// /// public void RfcWhowas(string nickname, string count, string target, Priority priority) { WriteLine(Rfc2812.Whowas(nickname, count, target), priority); } /// /// /// /// /// /// public void RfcWhowas(string nickname, string count, string target) { WriteLine(Rfc2812.Whowas(nickname, count, target)); } /// /// /// /// /// /// /// public void RfcWhowas(string[] nicknames, string count, string target, Priority priority) { WriteLine(Rfc2812.Whowas(nicknames, count, target), priority); } /// /// /// /// /// /// public void RfcWhowas(string[] nicknames, string count, string target) { WriteLine(Rfc2812.Whowas(nicknames, count, target)); } /// /// /// /// /// /// public void RfcKill(string nickname, string comment, Priority priority) { WriteLine(Rfc2812.Kill(nickname, comment), priority); } /// /// /// /// /// public void RfcKill(string nickname, string comment) { WriteLine(Rfc2812.Kill(nickname, comment)); } /// /// /// /// /// public void RfcPing(string server, Priority priority) { WriteLine(Rfc2812.Ping(server), priority); } /// /// /// /// public void RfcPing(string server) { WriteLine(Rfc2812.Ping(server)); } /// /// /// /// /// /// public void RfcPing(string server, string server2, Priority priority) { WriteLine(Rfc2812.Ping(server, server2), priority); } /// /// /// /// /// public void RfcPing(string server, string server2) { WriteLine(Rfc2812.Ping(server, server2)); } /// /// /// /// /// public void RfcPong(string server, Priority priority) { WriteLine(Rfc2812.Pong(server), priority); } /// /// /// /// public void RfcPong(string server) { WriteLine(Rfc2812.Pong(server)); } /// /// /// /// /// /// public void RfcPong(string server, string server2, Priority priority) { WriteLine(Rfc2812.Pong(server, server2), priority); } /// /// /// /// /// public void RfcPong(string server, string server2) { WriteLine(Rfc2812.Pong(server, server2)); } /// /// /// /// public void RfcAway(Priority priority) { WriteLine(Rfc2812.Away(), priority); } /// /// /// public void RfcAway() { WriteLine(Rfc2812.Away()); } /// /// /// /// /// public void RfcAway(string awaytext, Priority priority) { WriteLine(Rfc2812.Away(awaytext), priority); } /// /// /// /// public void RfcAway(string awaytext) { WriteLine(Rfc2812.Away(awaytext)); } /// /// /// public void RfcRehash() { WriteLine(Rfc2812.Rehash()); } /// /// /// public void RfcDie() { WriteLine(Rfc2812.Die()); } /// /// /// public void RfcRestart() { WriteLine(Rfc2812.Restart()); } /// /// /// /// /// public void RfcSummon(string user, Priority priority) { WriteLine(Rfc2812.Summon(user), priority); } /// /// /// /// public void RfcSummon(string user) { WriteLine(Rfc2812.Summon(user)); } /// /// /// /// /// /// public void RfcSummon(string user, string target, Priority priority) { WriteLine(Rfc2812.Summon(user, target), priority); } /// /// /// /// /// public void RfcSummon(string user, string target) { WriteLine(Rfc2812.Summon(user, target)); } /// /// /// /// /// /// /// public void RfcSummon(string user, string target, string channel, Priority priority) { WriteLine(Rfc2812.Summon(user, target, channel), priority); } /// /// /// /// /// /// public void RfcSummon(string user, string target, string channel) { WriteLine(Rfc2812.Summon(user, target, channel)); } /// /// /// /// public void RfcUsers(Priority priority) { WriteLine(Rfc2812.Users(), priority); } /// /// /// public void RfcUsers() { WriteLine(Rfc2812.Users()); } /// /// /// /// /// public void RfcUsers(string target, Priority priority) { WriteLine(Rfc2812.Users(target), priority); } /// /// /// /// public void RfcUsers(string target) { WriteLine(Rfc2812.Users(target)); } /// /// /// /// /// public void RfcWallops(string wallopstext, Priority priority) { WriteLine(Rfc2812.Wallops(wallopstext), priority); } /// /// /// /// public void RfcWallops(string wallopstext) { WriteLine(Rfc2812.Wallops(wallopstext)); } /// /// /// /// /// public void RfcUserhost(string nickname, Priority priority) { WriteLine(Rfc2812.Userhost(nickname), priority); } /// /// /// /// public void RfcUserhost(string nickname) { WriteLine(Rfc2812.Userhost(nickname)); } /// /// /// /// /// public void RfcUserhost(string[] nicknames, Priority priority) { WriteLine(Rfc2812.Userhost(nicknames), priority); } /// /// /// /// public void RfcUserhost(string[] nicknames) { WriteLine(Rfc2812.Userhost(nicknames)); } /// /// /// /// /// public void RfcIson(string nickname, Priority priority) { WriteLine(Rfc2812.Ison(nickname), priority); } /// /// /// /// public void RfcIson(string nickname) { WriteLine(Rfc2812.Ison(nickname)); } /// /// /// /// /// public void RfcIson(string[] nicknames, Priority priority) { WriteLine(Rfc2812.Ison(nicknames), priority); } /// /// /// /// public void RfcIson(string[] nicknames) { WriteLine(Rfc2812.Ison(nicknames)); } /// /// /// /// public void RfcQuit(Priority priority) { WriteLine(Rfc2812.Quit(), priority); } /// /// /// public void RfcQuit() { WriteLine(Rfc2812.Quit()); } public void RfcQuit(string quitmessage, Priority priority) { WriteLine(Rfc2812.Quit(quitmessage), priority); } /// /// /// /// public void RfcQuit(string quitmessage) { WriteLine(Rfc2812.Quit(quitmessage)); } /// /// /// /// /// /// public void RfcSquit(string server, string comment, Priority priority) { WriteLine(Rfc2812.Squit(server, comment), priority); } /// /// /// /// /// public void RfcSquit(string server, string comment) { WriteLine(Rfc2812.Squit(server, comment)); } #endregion } } smuxi-1.1/lib/SmartIrc4net/src/Logger.cs0000664000175000017500000000605213014002107020731 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #if LOG4NET using System.IO; using System.Collections; using log4net; namespace Meebey.SmartIrc4net { /// /// /// /// internal static class Logger { static public ILog Main { get; private set; } static public ILog Connection { get; private set; } static public ILog Socket { get; private set; } static public ILog Queue { get; private set; } static public ILog IrcMessages { get; private set; } static public ILog MessageTypes { get; private set; } static public ILog MessageParser { get; private set; } static public ILog ActionHandler { get; private set; } static public ILog TimeHandler { get; private set; } static public ILog MessageHandler { get; private set; } static public ILog ChannelSyncing { get; private set; } static public ILog UserSyncing { get; private set; } static public ILog Modules { get; private set; } static public ILog Dcc { get; private set; } static Logger() { Main = log4net.LogManager.GetLogger("MAIN"); Socket = log4net.LogManager.GetLogger("SOCKET"); Queue = log4net.LogManager.GetLogger("QUEUE"); Connection = log4net.LogManager.GetLogger("CONNECTION"); IrcMessages = log4net.LogManager.GetLogger("IRCMESSAGE"); MessageParser = log4net.LogManager.GetLogger("MESSAGEPARSER"); MessageTypes = log4net.LogManager.GetLogger("MESSAGETYPES"); ActionHandler = log4net.LogManager.GetLogger("ACTIONHANDLER"); TimeHandler = log4net.LogManager.GetLogger("TIMEHANDLER"); MessageHandler = log4net.LogManager.GetLogger("MESSAGEHANDLER"); ChannelSyncing = log4net.LogManager.GetLogger("CHANNELSYNCING"); UserSyncing = log4net.LogManager.GetLogger("USERSYNCING"); Modules = log4net.LogManager.GetLogger("MODULES"); Dcc = log4net.LogManager.GetLogger("DCC"); } } } #endif smuxi-1.1/lib/SmartIrc4net/src/AssemblyInfo.cs.in0000664000175000017500000000470413014002126022515 0ustar00meebeymeebey00000000000000/* * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * * Copyright (c) 2003-2005 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] [assembly: AssemblyTitle("@ASSEMBLY_TITLE@")] [assembly: AssemblyDescription("@ASSEMBLY_DESCRIPTION@")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("qNETp")] [assembly: AssemblyProduct("SmartIrc4net")] [assembly: AssemblyCopyright("2003-2008 (C) Mirco Bauer ")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("@ASSEMBLY_VERSION@")] [assembly: AssemblyInformationalVersion("@PACKAGE_VERSION@")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. #if DELAY_SIGN [assembly: AssemblyDelaySign(true)] [assembly: AssemblyKeyFile("../SmartIrc4net-pub.snk")] #else [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] #endif smuxi-1.1/lib/SmartIrc4net/LICENSE0000664000175000017500000006354713014002107017415 0ustar00meebeymeebey00000000000000/** * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ */ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! smuxi-1.1/lib/SmartIrc4net/FEATURES0000664000175000017500000000237413014002107017540 0ustar00meebeymeebey00000000000000/** * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ */ Full featurelist of SmartIrc4net ------------------------------------- - 3 layered API - IrcConnection (low-level API) contains socket handling and message buffer - IrcCommands (extends IrcConnection, middle-level API) contains RFC IRC commands plus easy to use IRC methods (like Op/Deop/Ban/Unban...) - IrcClient (extends IrcCommands, high-level API) full featured IRC class, with channel syncing, fully event driven - send/receive floodprotection - detects and changes nickname on nickname collisions - autoreconnect, if connection is lost - autoretry for connecting to IRC servers - debugging/logging system with log levels (using log4net) - compatible with Mono and Micrsoft .NET Framework - sendbuffer with a queue that has 3 priority levels (high, medium, low) plus a bypass level (critical) - channel syncing (tracking of users/modes/topic etc in objects) - user syncing (tracking the user in channels, nick/ident/host/realname/server/hopcount in objects) - when channel syncing is acticated the following methods are available: - IsJoined - IsOpped - IsVoiced - IsBanned - on reconnect all joined channels will be rejoined, also when keys are used - own CTCP version reply can be set smuxi-1.1/lib/SmartIrc4net/.travis.yml0000664000175000017500000000075513014002107020511 0ustar00meebeymeebey00000000000000language: c install: - sudo apt-get update > /dev/null - sudo apt-get install mono-devel > /dev/null script: - ./autogen.sh MCS=/usr/bin/dmcs - xbuild SmartIrc4net.sln - make clean; make distcheck MCS=/usr/bin/dmcs notifications: irc: channels: "chat.freenode.net#smuxi-devel" skip_join: true template: - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" - "Build details : %{build_url}" smuxi-1.1/lib/SmartIrc4net/Makefile.am0000664000175000017500000000023413014002107020424 0ustar00meebeymeebey00000000000000SUBDIRS = \ src EXTRA_DIST = \ $(PACKAGE_NAME).snk \ SmartIrc4net.csproj \ API_CHANGE \ CHANGELOG \ CREDITS \ FEATURES \ LICENSE \ README \ TODO smuxi-1.1/lib/SmartIrc4net/mono.m40000664000175000017500000000225613014002107017610 0ustar00meebeymeebey00000000000000AC_DEFUN([SHAMROCK_FIND_MONO_1_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, mcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_2_0_COMPILER], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, gmcs) ]) AC_DEFUN([SHAMROCK_FIND_MONO_RUNTIME], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MONO, mono) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE], [ PKG_CHECK_MODULES(MONO_MODULE, mono >= $1) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE_NOBAIL], [ PKG_CHECK_MODULES(MONO_MODULE, mono >= $1, HAVE_MONO_MODULE=yes, HAVE_MONO_MODULE=no) AC_SUBST(HAVE_MONO_MODULE) ]) AC_DEFUN([_SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES], [ for asm in $(echo "$*" | cut -d, -f2- | sed 's/\,/ /g') do AC_MSG_CHECKING([for Mono $1 GAC for $asm.dll]) if test \ -e "$($PKG_CONFIG --variable=libdir mono)/mono/$1/$asm.dll" -o \ -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/$1/$asm.dll"; \ then \ AC_MSG_RESULT([found]) else AC_MSG_RESULT([not found]) AC_MSG_ERROR([missing reqired Mono $1 assembly: $asm.dll]) fi done ]) AC_DEFUN([SHAMROCK_CHECK_MONO_1_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(1.0, $*) ]) AC_DEFUN([SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES], [ _SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES(2.0, $*) ]) smuxi-1.1/lib/SmartIrc4net/smartirc4net.pc.in0000664000175000017500000000030413014002107021736 0ustar00meebeymeebey00000000000000prefix=@prefix@ exec_prefix=${prefix} libdir=@libdir@ Name: @ASSEMBLY_TITLE@ Description: @ASSEMBLY_DESCRIPTION@ Version: @ASSEMBLY_VERSION@ Libs: -r:${libdir}/@PACKAGE_NAME@/@ASSEMBLY_NAME@.dll smuxi-1.1/lib/SmartIrc4net/.gitmodules0000664000175000017500000000015613014002107020550 0ustar00meebeymeebey00000000000000[submodule "src/starksoftproxy"] path = src/starksoftproxy url = git://github.com/meebey/starksoftproxy.git smuxi-1.1/lib/SmartIrc4net/bin/0000755000175000017500000000000013014002107017137 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/bin/debug/0000755000175000017500000000000013014002107020225 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/bin/debug/SmartIrc4net_log.config0000664000175000017500000000137713014002107024606 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/SmartIrc4net/bin/.gitignore0000664000175000017500000000020413014002107021125 0ustar00meebeymeebey00000000000000debug/*.dll* debug/*.exe* release/*.dll* release/*.exe* Meebey.SmartIrc4net.dll Meebey.SmartIrc4net.dll.mdb Meebey.SmartIrc4net.xml smuxi-1.1/lib/SmartIrc4net/CREDITS0000664000175000017500000000141713014002107017414 0ustar00meebeymeebey00000000000000/** * $Id$ * $URL$ * $Rev$ * $Author$ * $Date$ */ This is the creditslist for SmartIrc4net The fields are: (N) name (E) email (W) web-address (P) PGP key ID and fingerprint (D) description (S) snail-mail address --------------------------- N: Mirco Bauer E: meebey@meebey.net E: meebey@php.net W: www.meebey.net P: EEF946C8 / ABE1 95E1 50A8 DBE7 809D 3F42 7127 E5AB EEF9 46C8 D: Project Leader S: Kroonhorst 42 S: 22549 Hamburg S: Germany N: Benjamin Hall E: Benjamin.Hall@orcon.net.nz D: Several patches: AutoRejoinOnKick, AutoJoinOnInvite, NicknameList, IdleWorkerThread, OnAutoConnectError, Lag, documentation S: Auckland S: New Zealand N: Thomas Bruderer (apophis) E: apophis@apophis.ch D: Several patches: DCC implementation, OnNames fix S: Zurich S: Switzerland smuxi-1.1/lib/SmartIrc4net/SmartIrc4net.csproj0000664000175000017500000001024713014002126022137 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C} Library SmartIrc4net Meebey.SmartIrc4net v4.5 true full false bin\debug TRACE;DEBUG;LOG4NET;NET_2_0 prompt 4 true false false none true bin\release NET_2_0 prompt 4 false false ..\..\src\packages\log4net.2.0.3\lib\net40-full\log4net.dll {3F8CF2C1-EA37-444F-8693-A3A00B1131D2} StarkSoftProxy smuxi-1.1/lib/SmartIrc4net/CHANGELOG0000664000175000017500000002047513014002107017613 0ustar00meebeymeebey00000000000000v0.4.0 (SVN r266) ------ fixes: - fixed null reference exception when CTCP PING contains no data (thanks to Nick 'Zaf' Clifford, closes sf.net patch #1199630) - fixed NonRfcSupport, it didn't check for NonRfcSupport in _Event_RPL_NAMREPLY (thanks to the anonymous poster on the sf.net forum for reporting this) - added sanity checks to the mode change parser in IrcClient._InterpretChannelMode(), otherwise some nasty IRCd servers might break us. - catch ObjectDisposedExceptions in connection handling code. new: - IrcConnection now uses an active pinger to better detect network problems, by default every 60 seconds a ping will be send to the server, if it doesn't respond the class will disconnect or reconnect depending on the IrcConnection.AutoReconnect property. - added IrcConnection.OnAutoConnectError event, raised when there is a problem with the connection, it passes in AutoConnectErrorEventArgs which server and port was used and which exception was thrown, this way application can display and handle connection errors. - reconnect handling will now store/use keys if ActiveChannelSyncing and AutoRejoin is activated. - UTF-8 support now you can set IrcConnection.Encoding = Encoding.UTF8 and all messages send and receives will be encoded/decoded to/from UTF-8 - added lots of documentation stabs - added IrcClient.IsAway property. - added IrcClient.OnAway, IrcClient.OnAway, IrcClient.OnUnAway and IrcClient.OnNowAway events. - added IrcClient.OnPong event. - added IrcClient.AutoJoinOnInvite property, if enabled and the class receives an invite it will join that channel automatic (don't worry it will not join "0"). - added IrcClient.AutoRejoinOnKick property, if enabled and the class was in a channel and got kicked, it will try to rejoin that channel. - added IrcClient.AutoNickHandling property, now you can deactivate the automatic nick change when a nick collision happens, so you can handle it on your application instead. - added IrcCLient.NicknameList property, set in Login() call, will try the different nicks when the nick was already used, in order. - added IrcClient.Login() overload for passing a nickname list. - added some documentation. - added IrcConnection.Lag property, indicates how much lag is between the IRCd server and the IRC client. - added VisualStudio 2005 project files. changes: - IrcConnection.Encoding now uses the system encoding as default! So you might have to set it to Encoding.GetEncoding("ISO-8859-1") manually. - IrcClient.Reconnect() now stores channel keys too for rejoining them. - IrcClient.OnCtcpRequest and IrcClient.OnCtcpReply events now passes parsed CTCP data as CtcpEventArgs. - Removed log4net initialization, as this can conflict with applications using log4net. If you need debug output, use the debug build and add this code to your application: log4net.Config.BasicConfigurator.Configure(); or if you want the old config style with a config file: FileInfo fi = new FileInfo("SmartIrc4net_log.config"); log4net.Config.DOMConfigurator.ConfigureAndWatch(fi); - When IrcClient.CtcpVersion is set, the library will no longer advertise itself in CTCP VERSION replies. v0.3.5 (SVN r184) ------ fixes: - fixed bug in channel sync that caused duplicate exception (Closes sf.net bug #1064190) - fixed tracking of ops and voices list on join (thanks to Clment Bourgeois, closes sf.net bug #1075942) - fixed bug that the initial channel mode is not synced (on join). - fixed a crash bug in the channel sync code when a user was voiced/opped/banned 2 times, an ArgumentException was thrown (thanks to Clment Bourgeois for spotting this) - fixed handling of a stalled connection IOException was not catched in the write thread, and in the read thread the IsConnectionError was not set - fixed InviteEventArgs, mixed who with channel name - fixed OnConnected event now it's raised when the connection is ready for sending data. - fixed Reconnect() handling in the Listen() loop, moved to ReadLine(). - fixed InviteEventArgs.Channel property, initialized with the right value now. - fixed nullref exception in _Event_QUIT() added sanity checks, FreshIRC network does very ugly things with the IRC protocol. changes: - improved handling of rejoining channels after reconnect. - using keep-alive socket now. - removed underscores in parameter names (violates .NET library standards) - renamed parameters with "text" to different names (violates .NET library standards) - using new case-insensitive hashtables (FxCop spotted this) - improved the example/test program - main bin/ directory is now used for the example programs - changed overrides to new (method hiding is sufficient here). - updated all MS VS.NET project files. new: - added Halfop support (with OnHalfop and OnDehalfop events) if you want to use it do: irc.NonRfcSupport = true; NonRfcChannel nchan = GetChannel("#channel"); nchan.Halfops.... or NonRfcChannelUser nuser = GetChannelUser("#channel", "nick"); nuser.Halfop..... - added Halfop() and Dehalfop() command to IrcCommands - added OnErrorMessage event as general hook for all ERR_ messages - added SendReply(), easy way of replying to a message (regardless if its a channel, query or notice message) - added OnMotd event (with MotdEventArgs) - added IrcClient.Motd property - added OnChannelPassiveSynced event - added channel sync timings to channels (Channel.ActiveSyncTime). - added IrcClient.AutoRelogin setting. - added IrcConnection.AutoRetryDelay property. - added IrcConnection.OnConnectionError event. - added Rfc2812.IsValidNickname() method. - added IrcConnection.SocketSendTimeout and IrcConnection.SocketReceiveTimeout - added little benchmark program (examples/benchmark). - added stresstest program (examples/stresstest). - added sign target to the makefile v0.3.0 (SVN r123) ------- fixes: - fine tuned the "#ifdef LOG4NET" statements (thanks to prencher for noticing this log4net is fully optional! (only required for debugging the library) - fixed bug, the class changed the Op and Voice list of a copy *boing* (FxCop pointed me to it) - added check for "~" userflag on nameslist (thanks to Giacomo Di Ciocco) this broke the library on IRC networks using that userflag on channels - fixed channel sync bug, when the connection is re-established (Closes sf.net bug #1043536) - fixed rejoining channels when using Reconnect() - added sanity checks in _Event_WHOREPLY() this will prevent exceptions when the IRC server voilates the RFC (like some psybnc version do) - fixed string handling in _Event_PRIVMSG() for CTCP messages (Closes sf.net bug #1039286) changes: - making SmartIrc4net CLS and .NET standards conform changed all delegates to use EventArgs - made a few constructors "internal" - directory struture changed the structure now represents the API layers (IrcConnection, IrcCommands and IrcClient) - regex optimizations (thanks to prencher for the hints) - renamed all ReplyCodes to conform to .NET standards (e.g. ReyplCode.RPL_Welcome -> ReplyCode.Welcome) - renamed IrcConnection.Version to IrcConnection.VersionNumber - renamed ChannelSync to ActiveChannelSync later I will introduce PassiveChannelSync, this means only the received data is used for channel sync no extra commands are send to the IRC server. new: - parts of SmartIrc4net have now XML documentation tags - added *EventArgs for the events - added exception handling for Connect() Reconnect() Disconnect() - added VisualStudio project files (thanks to prencher for creating them) - added constructors to the exception classes (.NET standards) - added log calls for queue, when data could not be sent and is requeued - added missing overloads for RFC commands (Closes sf.net bug #1061503) (Join, Part, Kick, List, Names) - added more RFC commands, now all RFC 2812 commands are implemented! (Oper, Motd, Luser, Version, Stats, Service, Squit, Links, Time, Connect, Trace, Admin, Info, Servlist, Squery, Whois, Whowas, Kill, Ping, Pong, Away, Rehash, Die, Restart, Summon, Users, Wallops, Userhost, Ison) - WriteLine() will throw an NotConnectedException now when it's used without having a connection to an IRC server - added timeout values for the tcp socket (6 minutes), and activated nodelay flag - prefixed all IrcCommands that are actually plain RFC commands with "Rfc" e.g. Join() is now called RfcJoin() v0.2.0 (SVN r83) ------- fixes: changes: new: - first public release smuxi-1.1/lib/SmartIrc4net/packages.config0000664000175000017500000000020313014002126021332 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/SmartIrc4net/CSharpBuilder/0000755000175000017500000000000013014002107021056 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/CSharpBuilder/Meebey.SmartIrc4net.bdsgroup0000664000175000017500000000173013014002107026354 0ustar00meebeymeebey00000000000000 Meebey.SmartIrc4net.bdsproj ..\examples\test\CSharpBuilder\test.bdsproj Meebey.SmartIrc4net.dll test.exe smuxi-1.1/lib/SmartIrc4net/CSharpBuilder/Meebey.SmartIrc4net.bdsproj0000664000175000017500000001676113014002107026204 0ustar00meebeymeebey00000000000000 Release 4 False Meebey.SmartIrc4net False True False False False TRACE Meebey.SmartIrc4net.dll Assembly 285212672 False ..\bin\net\release False False False False IIS 4 False Meebey.SmartIrc4net True False True False False TRACE;DEBUG;LOG4NET Meebey.SmartIrc4net.dll Assembly 285212672 False ..\bin\net\debug False False False False IIS smuxi-1.1/lib/SmartIrc4net/.gitignore0000664000175000017500000000033613014002126020364 0ustar00meebeymeebey00000000000000Makefile Makefile.in aclocal.m4 autom4te.cache config.guess config.log config.status config.sub configure install-sh libtool ltmain.sh missing smartirc4net.pc *.pidb *.userprefs [Bb]in/ [Oo]bj/ *.suo *.user *.sln.docstatessmuxi-1.1/lib/SmartIrc4net/configure.ac0000664000175000017500000000327513014002126020667 0ustar00meebeymeebey00000000000000AC_PREREQ([2.54]) AC_INIT([smartirc4net], [1.0]) AM_INIT_AUTOMAKE([foreign]) AM_MAINTAINER_MODE AC_PROG_INSTALL ASSEMBLY_TITLE="SmartIrc4net" ASSEMBLY_DESCRIPTION="IRC library for CLI" ASSEMBLY_NAME="Meebey.SmartIrc4net" ASSEMBLY_VERSION="0.4.5.0" AC_SUBST(ASSEMBLY_TITLE) AC_SUBST(ASSEMBLY_DESCRIPTION) AC_SUBST(ASSEMBLY_VERSION) AC_SUBST(ASSEMBLY_NAME) SHAMROCK_EXPAND_LIBDIR SHAMROCK_CHECK_MONO_MODULE(1.2.6) SHAMROCK_FIND_MONO_RUNTIME AC_SUBST(CLR, $MONO) SHAMROCK_FIND_MONO_2_0_COMPILER AC_SUBST(CSC, $MCS) CSC_FLAGS="-debug -define:TRACE,DEBUG -nowarn:1591" AC_SUBST(CSC_FLAGS) SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES([ System ]) AC_PATH_PROG(GACUTIL, gacutil) if test x$GACUTIL = x; then AC_MSG_ERROR(You need gacutil) fi #PKG_CHECK_MODULES([LOG4NET], [log4net]) GACUTIL_FLAGS='-root $(DESTDIR)$(libdir)' AC_SUBST(GACUTIL_FLAGS) AC_ARG_ENABLE(pkg-config, AC_HELP_STRING([--disable-pkg-config], [Disable pkg-config install [default=NO]]), disable_pkg_config=yes, disable_pkg_config=no ) AM_CONDITIONAL([INSTALL_PKG_CONFIG], test x$disable_pkg_config = xno) AC_ARG_ENABLE(pkg-lib, AC_HELP_STRING([--disable-pkg-lib], [Disable library install [default=NO]]), disable_pkg_lib=yes, disable_pkg_lib=no ) AM_CONDITIONAL([INSTALL_PKG_LIB], test x$disable_pkg_lib = xno) AC_ARG_ENABLE(pkg-gac, AC_HELP_STRING([--disable-pkg-gac], [Disable GAC install [default=NO]]), disable_pkg_gac=yes, disable_pkg_gac=no ) AM_CONDITIONAL([INSTALL_PKG_GAC], test x$disable_pkg_gac = xno) AC_CONFIG_FILES([ Makefile smartirc4net.pc src/Makefile src/AssemblyInfo.cs ]) AC_OUTPUT AC_MSG_RESULT([ Configuration summary for $PACKAGE_NAME ($VERSION) * Installation prefix: $prefix ]) smuxi-1.1/lib/SmartIrc4net/tests/0000755000175000017500000000000013014002126017532 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/tests/tests.csproj0000664000175000017500000000363113014002126022123 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {154D83B3-A162-4886-B358-6188DBE376D7} Library tests Meebey.SmartIrc4net.Tests true full false ..\bin\debug DEBUG; prompt 4 false true ..\bin\release prompt 4 false ..\packages\NUnit.2.6.4\lib\nunit.framework.dll {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C} SmartIrc4net smuxi-1.1/lib/SmartIrc4net/tests/ChannelModeChangeInfoTests.cs0000664000175000017500000001252513014002107025211 0ustar00meebeymeebey00000000000000// SmartIrc4net - the IRC library for .NET/C# // // Copyright (c) 2014 Mirco Bauer // // Full LGPL License: // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 2.1 of the // License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using System.Collections.Generic; using NUnit.Framework; namespace Meebey.SmartIrc4net { [TestFixture] public class ChannelModeChangeInfoTests { [Test] public void ParseWithParameter() { var modeMap = new ChannelModeMap(); List changeInfos; ChannelModeChangeInfo changeInfo; changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "+o", "meebey"); Assert.IsNotNull(changeInfos); Assert.AreEqual(1, changeInfos.Count); changeInfo = changeInfos[0]; Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action); Assert.AreEqual(ChannelMode.Op, changeInfo.Mode); Assert.AreEqual('o', changeInfo.ModeChar); Assert.AreEqual("meebey", changeInfo.Parameter); } [Test] public void ParseWithoutParameter() { var modeMap = new ChannelModeMap(); List changeInfos; ChannelModeChangeInfo changeInfo; changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "+nt", ""); Assert.IsNotNull(changeInfos); Assert.AreEqual(2, changeInfos.Count); changeInfo = changeInfos[0]; Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action); Assert.AreEqual(ChannelMode.Unknown, changeInfo.Mode); Assert.AreEqual('n', changeInfo.ModeChar); Assert.AreEqual(null, changeInfo.Parameter); changeInfo = changeInfos[1]; Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action); Assert.AreEqual(ChannelMode.TopicLock, changeInfo.Mode); Assert.AreEqual('t', changeInfo.ModeChar); Assert.AreEqual(null, changeInfo.Parameter); } [Test] public void ParseComplex() { var modeMap = new ChannelModeMap(); List changeInfos; ChannelModeChangeInfo changeInfo; changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "-l+o-k+v", "op_nick * voice_nick"); Assert.IsNotNull(changeInfos); Assert.AreEqual(4, changeInfos.Count); changeInfo = changeInfos[0]; Assert.AreEqual(ChannelModeChangeAction.Unset, changeInfo.Action); Assert.AreEqual(ChannelMode.UserLimit, changeInfo.Mode); Assert.AreEqual('l', changeInfo.ModeChar); Assert.AreEqual(null, changeInfo.Parameter); changeInfo = changeInfos[1]; Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action); Assert.AreEqual(ChannelMode.Op, changeInfo.Mode); Assert.AreEqual('o', changeInfo.ModeChar); Assert.AreEqual("op_nick", changeInfo.Parameter); changeInfo = changeInfos[2]; Assert.AreEqual(ChannelModeChangeAction.Unset, changeInfo.Action); Assert.AreEqual(ChannelMode.Key, changeInfo.Mode); Assert.AreEqual('k', changeInfo.ModeChar); Assert.AreEqual("*", changeInfo.Parameter); changeInfo = changeInfos[3]; Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action); Assert.AreEqual(ChannelMode.Voice, changeInfo.Mode); Assert.AreEqual('v', changeInfo.ModeChar); Assert.AreEqual("voice_nick", changeInfo.Parameter); } [Test] public void ParseUnknown() { var modeMap = new ChannelModeMap(); List changeInfos; ChannelModeChangeInfo changeInfo; changeInfos = ChannelModeChangeInfo.Parse(modeMap, "#test", "+X-Y", "foo bar"); Assert.IsNotNull(changeInfos); Assert.AreEqual(2, changeInfos.Count); changeInfo = changeInfos[0]; Assert.AreEqual(ChannelModeChangeAction.Set, changeInfo.Action); Assert.AreEqual(ChannelMode.Unknown, changeInfo.Mode); Assert.AreEqual('X', changeInfo.ModeChar); Assert.AreEqual("foo", changeInfo.Parameter); changeInfo = changeInfos[1]; Assert.AreEqual(ChannelModeChangeAction.Unset, changeInfo.Action); Assert.AreEqual(ChannelMode.Unknown, changeInfo.Mode); Assert.AreEqual('Y', changeInfo.ModeChar); Assert.AreEqual("bar", changeInfo.Parameter); } } } smuxi-1.1/lib/SmartIrc4net/tests/packages.config0000664000175000017500000000020113014002126022472 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/SmartIrc4net/examples/0000755000175000017500000000000011655552514020232 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/examples/stresstest/0000755000175000017500000000000013014002107022430 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/examples/stresstest/Makefile0000664000175000017500000000131413014002107024071 0ustar00meebeymeebey00000000000000 CSC=mcs SMARTIRC_DLL=Meebey.SmartIrc4net.dll LOG4NET_DLL=log4net.dll TARGET=stresstest.exe all: release debug: TARGET_PATH=../../bin/debug debug: *.cs mkdir -p $(TARGET_PATH) cp ../../bin/$(LOG4NET_DLL) $(TARGET_PATH) $(CSC) /debug /r:$(TARGET_PATH)/$(SMARTIRC_DLL) /out:$(TARGET_PATH)/$(TARGET) $^ release: TARGET_PATH=../../bin/release release: *.cs mkdir -p $(TARGET_PATH) $(CSC) /r:$(TARGET_PATH)/$(SMARTIRC_DLL) /out:$(TARGET_PATH)/$(TARGET) $^ debug-full: cd ../../src; make debug $(MAKE) debug release-full: release cd ../../src; make release $(MAKE) release clean: -rm -f ../../bin/debug/$(TARGET) -rm -f ../../bin/release/$(TARGET) .PHONY: all debug debug-full release release-full clean smuxi-1.1/lib/SmartIrc4net/examples/stresstest/AssemblyInfo.cs0000664000175000017500000000217213014002107025356 0ustar00meebeymeebey00000000000000using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("SmartIrc4net examples/stresstest Bot")] [assembly: AssemblyDescription("IRC Bot for developing/testing SmartIrc4net")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("0.1.*")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/lib/SmartIrc4net/examples/stresstest/stresstest.csproj0000664000175000017500000000612513014002107026103 0ustar00meebeymeebey00000000000000 Local 8.0.50727 2.0 {65CBCA77-4241-4D4C-ACCB-E640D972CDC4} Debug AnyCPU stresstest JScript Grid IE50 false Exe stresstest OnBuildSuccess 2.0 ..\..\..\..\bin\debug\ 285212672 DEBUG;TRACE true 4096 false false false 4 full prompt ..\..\..\..\bin\release\ 285212672 true 4096 true false false 4 none prompt System {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C} SmartIrc4net smuxi-1.1/lib/SmartIrc4net/examples/stresstest/stresstest.cs0000664000175000017500000001302613014002107025206 0ustar00meebeymeebey00000000000000/** * $Id$ * $Revision$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * This is a simple test client for the library. * * Copyright (c) 2003-2004 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Collections; using System.Threading; using Meebey.SmartIrc4net; public class StressTest { // make an instance of the high-level API public static IrcClient irc = new IrcClient(); // this method we will use to analyse queries (also known as private messages) public static void OnQueryMessage(object sender, IrcEventArgs e) { switch (e.Data.MessageArray[0]) { // debug stuff case "dump_channel": string requested_channel = e.Data.MessageArray[1]; // getting the channel (via channel sync feature) Channel channel = irc.GetChannel(requested_channel); // here we send messages irc.SendMessage(SendType.Message, e.Data.Nick, ""); irc.SendMessage(SendType.Message, e.Data.Nick, "Name: '"+channel.Name+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "Topic: '"+channel.Topic+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "Mode: '"+channel.Mode+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "Key: '"+channel.Key+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "UserLimit: '"+channel.UserLimit+"'"); // here we go through all users of the channel and show their // hashtable key and nickname string nickname_list = ""; nickname_list += "Users: "; IDictionaryEnumerator it = channel.Users.GetEnumerator(); while(it.MoveNext()) { string key = (string)it.Key; ChannelUser channeluser = (ChannelUser)it.Value; nickname_list += "("; if (channeluser.IsOp) { nickname_list += "@"; } if (channeluser.IsVoice) { nickname_list += "+"; } nickname_list += ")"+key+" => "+channeluser.Nick+", "; } irc.SendMessage(SendType.Message, e.Data.Nick, nickname_list); irc.SendMessage(SendType.Message, e.Data.Nick, ""); break; case "gc": GC.Collect(); break; // typical commands case "join": irc.RfcJoin(e.Data.MessageArray[1]); break; case "part": irc.RfcPart(e.Data.MessageArray[1]); break; case "die": Exit(); break; } } public static void OnError(object sender, ErrorEventArgs e) { System.Console.WriteLine("Error: "+e.ErrorMessage); Exit(); } public static void OnRawMessage(object sender, IrcEventArgs e) { System.Console.WriteLine("Received: "+e.Data.RawMessage); } public static void Main(string[] args) { Thread.CurrentThread.Name = "Main"; irc.SendDelay = 400; irc.ActiveChannelSyncing = true; irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage); irc.OnError += new ErrorEventHandler(OnError); irc.OnRawMessage += new IrcEventHandler(OnRawMessage); string[] serverlist; // the server we want to connect to, could be also a simple string serverlist = new string[] {"irc.freshirc.com"}; int port = 6667; string channel = "#OCS"; try { irc.Connect(serverlist, port); } catch (ConnectionException e) { System.Console.WriteLine("couldn't connect! Reason: "+e.Message); Exit(); } try { irc.Login("SmartIRC", "SmartIrc4net Test Bot"); irc.RfcJoin(channel); new Thread(new ThreadStart(ReadCommands)).Start(); irc.Listen(); irc.Disconnect(); } catch (ConnectionException) { Exit(); } catch (Exception e) { System.Console.WriteLine("Error occurred! Message: "+e.Message); System.Console.WriteLine("Exception: "+e.StackTrace); Exit(); } } public static void ReadCommands() { while (true) { irc.WriteLine(System.Console.ReadLine()); } } public static void Exit() { System.Console.WriteLine("Exiting..."); System.Environment.Exit(0); } } smuxi-1.1/lib/SmartIrc4net/examples/benchmark/0000755000175000017500000000000013014002126022140 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/examples/benchmark/Makefile0000664000175000017500000000130413014002107023577 0ustar00meebeymeebey00000000000000 CSC=mcs SMARTIRC_DLL=Meebey.SmartIrc4net.dll LOG4NET_DLL=log4net.dll TARGET=benchmark.exe all: release debug: TARGET_PATH=../../bin/debug debug: *.cs mkdir -p $(TARGET_PATH) cp ../../bin/$(LOG4NET_DLL) $(TARGET_PATH) $(CSC) /debug /r:$(TARGET_PATH)/$(SMARTIRC_DLL) /out:$(TARGET_PATH)/$(TARGET) $^ release: TARGET_PATH=../../bin/release release: *.cs mkdir -p $(TARGET_PATH) $(CSC) /r:$(TARGET_PATH)/$(SMARTIRC_DLL) /out:$(TARGET_PATH)/$(TARGET) $^ debug-full: cd ../../src; make debug $(MAKE) debug release-full: cd ../../src; make release $(MAKE) release clean: -rm -f ../../bin/debug/$(TARGET) -rm -f ../../bin/release/$(TARGET) .PHONY: all debug debug-full release release-full clean smuxi-1.1/lib/SmartIrc4net/examples/benchmark/benchmark-result.txt0000664000175000017500000000072413014002107026153 0ustar00meebeymeebey00000000000000Benchmark was tested against saberhagen.freenode.net The benchmark was run about 10 times and the lowest (fastest) values was used. Net_SmartIRC (PHP) Jan 18 18:14:15 SmartIRC.php(841) benchmark time: 0.393995046616 SmartIrc4net (C# on Mono) TcpClientList() took 0.273 sec IrcConnectionList() took 0.275 sec IrcClientList() took 0.298 sec SmartIrc4net (C# on MS .NET) TcpClientList() took 0.171 sec IrcConnectionList() took 0.265 sec IrcClientList() took 0.281 sec smuxi-1.1/lib/SmartIrc4net/examples/benchmark/AssemblyInfo.cs0000664000175000017500000000217113014002107025064 0ustar00meebeymeebey00000000000000using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("SmartIrc4net examples/benchmark Bot")] [assembly: AssemblyDescription("IRC Bot for developing/testing SmartIrc4net")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("0.1.*")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/lib/SmartIrc4net/examples/benchmark/benchmark.cs0000664000175000017500000001112613014002107024423 0ustar00meebeymeebey00000000000000/** * $Id$ * $Revision$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * This is a benchmark test client for the library. * * Copyright (c) 2003-2004 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.IO; using System.Threading; using System.Net.Sockets; using Meebey.SmartIrc4net; public class Benchmark { const string SERVER = "irc.freenode.net"; //const string SERVER = "irc.freenet.de"; //const string SERVER = "10.1.0.101"; const int PORT = 6667; const string NICK = "SmartIrcB"; const string REALNAME = "SmartIrc4net Benchmark Bot"; const string CHANNEL = "#C#"; public static void Main(string[] args) { Thread.Sleep(5000); DateTime start, end; start = DateTime.UtcNow; TcpClientList(); end = DateTime.UtcNow; Console.WriteLine("TcpClientList() took "+end.Subtract(start).TotalSeconds+" sec"); Thread.Sleep(5000); start = DateTime.UtcNow; IrcConnectionList(); end = DateTime.UtcNow; Console.WriteLine("IrcConnectionList() took "+end.Subtract(start).TotalSeconds+" sec"); Thread.Sleep(5000); start = DateTime.UtcNow; IrcClientList(); end = DateTime.UtcNow; Console.WriteLine("IrcClientList() took "+end.Subtract(start).TotalSeconds+" sec"); } public static void TcpClientList() { TcpClient tc = new TcpClient(SERVER, PORT); StreamReader sr = new StreamReader(tc.GetStream()); StreamWriter sw = new StreamWriter(tc.GetStream()); sw.Write(Rfc2812.Nick(NICK)+"\r\n"); sw.Write(Rfc2812.User(NICK, 0, REALNAME)+"\r\n"); sw.Flush(); string line; string[] linear; while (true) { line = sr.ReadLine(); if (line != null) { linear = line.Split(new char[] {' '}); if (linear.Length >= 2 && linear[1] == "001") { sw.Write(Rfc2812.List(CHANNEL)+"\r\n"); sw.Flush(); } if (linear.Length >= 5 && linear[1] == "322") { Console.WriteLine("On the IRC channel "+CHANNEL+" are "+linear[4]+" users"); sr.Close(); sw.Close(); tc.Close(); break; } } } } public static void IrcClientList() { IrcClient irc = new IrcClient(); irc.OnRawMessage += new IrcEventHandler(IrcClientListCallback); irc.Connect(SERVER, PORT); irc.Login(NICK, REALNAME); irc.RfcList(CHANNEL); irc.Listen(); } public static void IrcClientListCallback(object sender, IrcEventArgs e) { if (e.Data.ReplyCode == ReplyCode.List) { Console.WriteLine("On the IRC channel "+CHANNEL+" are "+e.Data.RawMessageArray[4]+" users"); e.Data.Irc.Disconnect(); } } public static void IrcConnectionList() { IrcConnection irc = new IrcConnection(); irc.OnReadLine += new ReadLineEventHandler(IrcConnectionListCallback); irc.Connect(SERVER, PORT); irc.WriteLine(Rfc2812.Nick(NICK), Priority.Critical); irc.WriteLine(Rfc2812.User(NICK, 0, REALNAME), Priority.Critical); irc.WriteLine(Rfc2812.List(CHANNEL)); irc.Listen(); } public static void IrcConnectionListCallback(object sender, ReadLineEventArgs e) { string[] linear = e.Line.Split(new char[] {' '}); if (linear.Length >= 5 && linear[1] == "322") { Console.WriteLine("On the IRC channel "+CHANNEL+" are "+linear[4]+" users"); ((IrcConnection)sender).Disconnect(); } } } smuxi-1.1/lib/SmartIrc4net/examples/benchmark/benchmark.csproj0000664000175000017500000000406513014002126025323 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {CD3D60C4-0A53-4B4C-B30C-1C4F2D68A21E} Exe Benchmark benchmark true full false ..\..\..\bin\mono\debug prompt 4 false true none true ..\..\..\bin\mono\release prompt 4 false true {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C} SmartIrc4net smuxi-1.1/lib/SmartIrc4net/examples/test/0000755000175000017500000000000013014002107021164 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/examples/test/test.csproj0000664000175000017500000000425713014002107023377 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {6F25C6EA-D1C3-47AA-8300-B6D5D6DE33B2} Exe Test Test test true full false ..\..\..\bin\mono\debug prompt 4 true false true . none true ..\..\..\mono\release prompt 4 true true false {91D3003B-7E65-4EAF-8EE1-DA43832E7A9C} SmartIrc4net smuxi-1.1/lib/SmartIrc4net/examples/test/Makefile0000664000175000017500000000130713014002107022627 0ustar00meebeymeebey00000000000000 CSC=mcs SMARTIRC_DLL=Meebey.SmartIrc4net.dll LOG4NET_DLL=log4net.dll TARGET=test.exe all: release debug: TARGET_PATH=../../bin/debug debug: *.cs mkdir -p $(TARGET_PATH) cp ../../bin/$(LOG4NET_DLL) $(TARGET_PATH) $(CSC) /debug /r:$(TARGET_PATH)/$(SMARTIRC_DLL) /out:$(TARGET_PATH)/$(TARGET) $^ release: TARGET_PATH=../../bin/release release: *.cs mkdir -p $(TARGET_PATH) $(CSC) /r:$(TARGET_PATH)/$(SMARTIRC_DLL) /out:$(TARGET_PATH)/$(TARGET) $^ debug-full: cd ../../src; make debug $(MAKE) debug release-full: release cd ../../src; make release $(MAKE) release clean: -rm -f ../../bin/debug/$(TARGET) -rm -f ../../bin/release/$(TARGET) .PHONY: all debug debug-full release release-full clean smuxi-1.1/lib/SmartIrc4net/examples/test/AssemblyInfo.cs0000664000175000017500000000216413014002107024113 0ustar00meebeymeebey00000000000000using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("SmartIrc4net examples/test Bot")] [assembly: AssemblyDescription("IRC Bot for developing/testing SmartIrc4net")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("0.1.*")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] smuxi-1.1/lib/SmartIrc4net/examples/test/Test.cs0000664000175000017500000002205413014002107022437 0ustar00meebeymeebey00000000000000/** * $Id$ * $Revision$ * $Author$ * $Date$ * * SmartIrc4net - the IRC library for .NET/C# * This is a simple test client for the library. * * Copyright (c) 2003-2004 Mirco Bauer * * Full LGPL License: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using System; using System.Threading; using System.Collections; using System.Collections.Generic; using Meebey.SmartIrc4net; // This is an VERY basic example how your IRC application could be written // its mainly for showing how to use the API, this program just connects sends // a few message to a channel and waits for commands on the console // (raw RFC commands though! it's later explained). // There are also a few commands the IRC bot/client allows via private message. public class Test { // make an instance of the high-level API public static IrcClient irc = new IrcClient(); // this method we will use to analyse queries (also known as private messages) public static void OnQueryMessage(object sender, IrcEventArgs e) { switch (e.Data.MessageArray[0]) { // debug stuff case "dump_channel": string requested_channel = e.Data.MessageArray[1]; // getting the channel (via channel sync feature) Channel channel = irc.GetChannel(requested_channel); // here we send messages irc.SendMessage(SendType.Message, e.Data.Nick, ""); irc.SendMessage(SendType.Message, e.Data.Nick, "Name: '"+channel.Name+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "Topic: '"+channel.Topic+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "Mode: '"+channel.Mode+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "Key: '"+channel.Key+"'"); irc.SendMessage(SendType.Message, e.Data.Nick, "UserLimit: '"+channel.UserLimit+"'"); // here we go through all users of the channel and show their // hashtable key and nickname string nickname_list = ""; nickname_list += "Users: "; foreach (DictionaryEntry de in channel.Users) { string key = (string)de.Key; ChannelUser channeluser = (ChannelUser)de.Value; nickname_list += "("; if (channeluser.IsOp) { nickname_list += "@"; } if (channeluser.IsVoice) { nickname_list += "+"; } nickname_list += ")"+key+" => "+channeluser.Nick+", "; } irc.SendMessage(SendType.Message, e.Data.Nick, nickname_list); irc.SendMessage(SendType.Message, e.Data.Nick, ""); break; case "gc": GC.Collect(); break; // typical commands case "join": irc.RfcJoin(e.Data.MessageArray[1]); break; case "part": irc.RfcPart(e.Data.MessageArray[1]); break; case "die": Exit(); break; } } // this method handles when we receive "ERROR" from the IRC server public static void OnError(object sender, ErrorEventArgs e) { System.Console.WriteLine("Error: "+e.ErrorMessage); Exit(); } // this method will get all IRC messages public static void OnRawMessage(object sender, IrcEventArgs e) { System.Console.WriteLine("Received: "+e.Data.RawMessage); } public static void Main(string[] args) { Thread.CurrentThread.Name = "Main"; // UTF-8 test irc.Encoding = System.Text.Encoding.UTF8; // wait time between messages, we can set this lower on own irc servers irc.SendDelay = 200; // we use channel sync, means we can use irc.GetChannel() and so on irc.ActiveChannelSyncing = true; // here we connect the events of the API to our written methods // most have own event handler types, because they ship different data irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage); irc.OnError += new ErrorEventHandler(OnError); irc.OnRawMessage += new IrcEventHandler(OnRawMessage); string[] serverlist; // the server we want to connect to, could be also a simple string serverlist = new string[] {"irc.freenode.org"}; int port = 6667; string channel = "#smartirc-test"; try { // here we try to connect to the server and exceptions get handled irc.Connect(serverlist, port); } catch (ConnectionException e) { // something went wrong, the reason will be shown System.Console.WriteLine("couldn't connect! Reason: "+e.Message); Exit(); } try { // here we logon and register our nickname and so on irc.Login("SmartIRC", "SmartIrc4net Test Bot"); // join the channel irc.RfcJoin(channel); for (int i = 0; i < 3; i++) { // here we send just 3 different types of messages, 3 times for // testing the delay and flood protection (messagebuffer work) irc.SendMessage(SendType.Message, channel, "test message ("+i.ToString()+")"); irc.SendMessage(SendType.Action, channel, "thinks this is cool ("+i.ToString()+")"); irc.SendMessage(SendType.Notice, channel, "SmartIrc4net rocks ("+i.ToString()+")"); } // spawn a new thread to read the stdin of the console, this we use // for reading IRC commands from the keyboard while the IRC connection // stays in its own thread new Thread(new ThreadStart(ReadCommands)).Start(); // here we tell the IRC API to go into a receive mode, all events // will be triggered by _this_ thread (main thread in this case) // Listen() blocks by default, you can also use ListenOnce() if you // need that does one IRC operation and then returns, so you need then // an own loop irc.Listen(); // when Listen() returns our IRC session is over, to be sure we call // disconnect manually irc.Disconnect(); } catch (ConnectionException) { // this exception is handled because Disconnect() can throw a not // connected exception Exit(); } catch (Exception e) { // this should not happen by just in case we handle it nicely System.Console.WriteLine("Error occurred! Message: "+e.Message); System.Console.WriteLine("Exception: "+e.StackTrace); Exit(); } } public static void ReadCommands() { // here we read the commands from the stdin and send it to the IRC API // WARNING, it uses WriteLine() means you need to enter RFC commands // like "JOIN #test" and then "PRIVMSG #test :hello to you" while (true) { string cmd = System.Console.ReadLine(); if (cmd.StartsWith("/list")) { int pos = cmd.IndexOf(" "); string channel = null; if (pos != -1) { channel = cmd.Substring(pos + 1); } IList channelInfos = irc.GetChannelList(channel); Console.WriteLine("channel count: {0}", channelInfos.Count); foreach (ChannelInfo channelInfo in channelInfos) { Console.WriteLine("channel: {0} user count: {1} topic: {2}", channelInfo.Channel, channelInfo.UserCount, channelInfo.Topic); } } else { irc.WriteLine(cmd); } } } public static void Exit() { // we are done, lets exit... System.Console.WriteLine("Exiting..."); System.Environment.Exit(0); } } smuxi-1.1/lib/SmartIrc4net/examples/test/CSharpBuilder/0000755000175000017500000000000013014002107023653 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SmartIrc4net/examples/test/CSharpBuilder/test.dsk0000664000175000017500000001225713014002107025346 0ustar00meebeymeebey00000000000000[Closed Files] File_0=TSourceModule,'D:\projects\SmartIRC#\non-cvs\src\Channel.cs',0,1,1,38,1,0,0 File_1=TSourceModule,'D:\projects\SmartIRC#\non-cvs\src\IrcClient.cs',0,1,1,1,1,0,0 File_2=TSourceModule,'D:\projects\SmartIRC#\non-cvs\src\AssemblyInfo.cs',0,1,1,1,1,0,0 File_3=TSourceModule,'D:\projects\SmartIRC#\non-cvs\examples\test\C#Builder\WinForm.cs',0,1,1,1,1,0,0 File_4=TSourceModule,'D:\projects\SmartIRC#\non-cvs\examples\test\C#Builder\AssemblyInfo.cs',0,1,1,1,1,0,0 File_5=TSourceModule,'D:\projects\SmartIRC#\non-cvs\src\User.cs',0,1,10,28,40,0,0 File_6=TSourceModule,'D:\projects\SmartIRC#\non-cvs\src\Rfc2812.cs',0,1,19,1,1,0,0 File_7=TSourceModule,'D:\projects\SmartIRC#\non-cvs\src\Logger.cs',0,1,106,1,1,0,0 [Modules] Module0=D:\projects\SmartIRC#\non-cvs\examples\test\test.cs Module1=D:\projects\SmartIRC#\non-cvs\examples\test\AssemblyInfo.cs Count=2 EditWindowCount=1 [D:\projects\SmartIRC#\non-cvs\examples\test\test.cs] ModuleType=TSourceModule [D:\projects\SmartIRC#\non-cvs\examples\test\AssemblyInfo.cs] ModuleType=TSourceModule [EditWindow0] ViewCount=2 CurrentEditView=D:\projects\SmartIRC#\non-cvs\examples\test\test.cs View0=0 View1=1 PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=0 Width=10000 Height=8943 MaxLeft=-1 MaxTop=-1 ClientWidth=10000 ClientHeight=8943 DockedToMainForm=1 MessageView=MessageView@EditWindow0 TopPanelSize=0 LeftPanelSize=0 LeftPanelClients=DockSite2 LeftPanelData=0000080001000100000009000000446F636B5369746532D42D00000000000000460D000000000000FFFFFFFF RightPanelSize=2256 RightPanelClients=ToolForm,DockSite1 RightPanelData=0000080001010100000008000000546F6F6C466F726D2D1900000000000001D00800000000000001000000009221000009000000446F636B5369746531FFFFFFFF BottomPanelSize=0 BottomPanelClients=MessageView@EditWindow0,DockSite0 BottomPanelData=000008000102020000000B0000004D6573736167655669657709000000446F636B5369746530A03300000000000002240E000000000000FFFFFFFF [View0] CustomEditViewType=TEditView Module=D:\projects\SmartIRC#\non-cvs\examples\test\AssemblyInfo.cs CursorX=38 CursorY=9 TopLine=1 LeftCol=1 Elisions= [View1] CustomEditViewType=TEditView Module=D:\projects\SmartIRC#\non-cvs\examples\test\test.cs CursorX=63 CursorY=31 TopLine=10 LeftCol=1 Elisions= [Breakpoints] Count=0 [AddressBreakpoints] Count=0 [Watches] Count=0 [WatchWindow] WatchColumnWidth=100 WatchShowColumnHeaders=1 PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=0 Width=4307 Height=4580 MaxLeft=-1 MaxTop=-1 ClientWidth=4307 ClientHeight=4580 TBDockHeight=203 LRDockWidth=13604 Dockable=1 [Main Window] PercentageSizes=1 Create=1 Visible=1 Docked=0 State=2 Left=10 Top=0 Width=9990 Height=10014 MaxLeft=-10 MaxTop=-14 MaxWidth=10078 MaxHeight=10108 ClientWidth=10000 ClientHeight=9648 BottomPanelSize=8594 BottomPanelClients=EditWindow0 BottomPanelData=0000080000000000000000000000000000000000000000000000000100000000000000000C0000004564697457696E646F775F30FFFFFFFF [ProjectManager] PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=0 Width=2178 Height=8591 MaxLeft=-1 MaxTop=-1 ClientWidth=2178 ClientHeight=8591 TBDockHeight=5908 LRDockWidth=3154 Dockable=1 [ToolForm] PercentageSizes=1 Create=1 Visible=0 Docked=1 State=0 Left=-797 Top=-82 Width=1621 Height=6789 MaxLeft=-1 MaxTop=-1 ClientWidth=1621 ClientHeight=6789 TBDockHeight=6518 LRDockWidth=1621 Dockable=1 [BreakpointWindow] PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=0 Width=4307 Height=4580 MaxLeft=-1 MaxTop=-1 ClientWidth=4307 ClientHeight=4580 TBDockHeight=1545 LRDockWidth=8740 Dockable=1 Column0Width=100 Column1Width=75 Column2Width=200 Column3Width=200 Column4Width=75 Column5Width=75 [CallStackWindow] PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=0 Width=4307 Height=4580 MaxLeft=-1 MaxTop=-1 ClientWidth=4307 ClientHeight=4580 TBDockHeight=2073 LRDockWidth=3486 Dockable=1 [PropertyInspector] PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=0 Width=4307 Height=4919 MaxLeft=-1 MaxTop=-1 ClientWidth=4307 ClientHeight=4919 TBDockHeight=407 LRDockWidth=1904 Dockable=1 SplitPos=95 HiddenCategories= [MessageView@EditWindow0] PercentageSizes=1 Create=1 Visible=0 Docked=1 State=0 Left=-4 Top=-742 Width=4326 Height=1152 MaxLeft=-1 MaxTop=-1 ClientWidth=4326 ClientHeight=1152 TBDockHeight=1152 LRDockWidth=4326 Dockable=1 [DockHosts] DockHostCount=3 [DockSite0] DockSiteType=1 PercentageSizes=1 Create=1 Visible=0 Docked=1 State=0 Left=-4 Top=-742 Width=4385 Height=5054 MaxLeft=-1 MaxTop=-1 ClientWidth=4385 ClientHeight=5054 TBDockHeight=5054 LRDockWidth=3828 Dockable=1 TabPosition=1 ActiveTab=Watch List TabDockClients=BreakpointWindow,CallStackWindow,WatchWindow [DockSite1] DockSiteType=1 PercentageSizes=1 Create=1 Visible=1 Docked=1 State=0 Left=0 Top=16 Width=2256 Height=8726 MaxLeft=-1 MaxTop=-1 ClientWidth=2256 ClientHeight=8726 TBDockHeight=6314 LRDockWidth=2256 Dockable=1 TabPosition=1 ActiveTab=Project Manager TabDockClients=ProjectManager [DockSite2] DockSiteType=1 PercentageSizes=1 Create=1 Visible=0 Docked=1 State=0 Left=-4 Top=-82 Width=4385 Height=5054 MaxLeft=-1 MaxTop=-1 ClientWidth=4385 ClientHeight=5054 TBDockHeight=5108 LRDockWidth=4385 Dockable=1 TabPosition=1 ActiveTab=Object Inspector TabDockClients=PropertyInspector smuxi-1.1/lib/SmartIrc4net/examples/test/CSharpBuilder/test.bdsproj0000664000175000017500000001372013014002107026224 0ustar00meebeymeebey00000000000000 Debug 4 False test False True False False False TRACE Console 285212672 False ..\bin\net\release D:\projects\SmartIRC#\non-cvs\examples\test\bin\net\debug\test.exe False D:\projects\SmartIRC#\non-cvs\examples\test\bin\net\release False False False IIS 4 False test True False True False False TRACE;DEBUG;LOG4NET Console 285212672 False ..\bin\net\debug D:\projects\SmartIRC#\non-cvs\examples\test\bin\net\debug\test.exe False D:\projects\SmartIRC#\non-cvs\examples\test\bin\net\debug False False False IIS smuxi-1.1/lib/db4o-net/0000775000175000017500000000000014011526500015474 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/0000755000175000017500000000000012652476423020265 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Makefile0000644000175000017500000000011311700531646021710 0ustar00meebeymeebey00000000000000 include ../include.mk TARGET = library ASSEMBLY = $(CORE) REFERENCES = smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Properties/0000755000175000017500000000000011700531646022411 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Properties/AssemblyInfo.cs0000755000175000017500000000162411700531646025341 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using System.Security; [assembly: AssemblyTitle("db4o - database for objects")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyName("")] // attributes are automatically set by the build [assembly: AssemblyVersion("8.0.183.14430")] [assembly: AssemblyKeyFile("")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyDescription("Db4objects.Db4o 8.0.183.14430 (.NET)")] #if !CF && !SILVERLIGHT [assembly: AllowPartiallyTrustedCallers] #endif #if NET_4_0 [assembly: SecurityRules(SecurityRuleSet.Level1)] #endif [assembly: CLSCompliant(true)]smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o-CF-2008.csproj0000644000175000017500000021712111700531646025132 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Library Properties Db4objects.Db4o Db4objects.Db4o {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4objects.Db4o_CF_2008 v3.5 2.0 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off bin\Debug\Db4objects.Db4o.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off 1591;1572;1573;1574;0419; bin\Release\Db4objects.Db4o.xml False D:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\System.Core.dll smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o-Silverlight-2010.csproj0000644000175000017500000022477211700531646027141 0ustar00meebeymeebey00000000000000 v3.5 true ../db4objects.snk Debug AnyCPU 9.0.30729 2.0 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o Db4objects.Db4o v4.0 false true true true ../db4objects.snk Silverlight $(TargetFrameworkVersion) 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/0000755000175000017500000000000011700531646023027 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/0000755000175000017500000000000011700531646025113 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/IDiagnostic.cs0000644000175000017500000000172111700531646027640 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Diagnostic { /// /// Marker interface for Diagnostic messages

/// Diagnostic system can be enabled on a running db4o database /// to notify a user about possible problems or misconfigurations. ///
/// /// Marker interface for Diagnostic messages

/// Diagnostic system can be enabled on a running db4o database /// to notify a user about possible problems or misconfigurations. Diagnostic /// messages must implement this interface and are usually derived from /// DiagnosticBase /// class. A separate Diagnostic implementation /// should be used for each problem. ///
/// DiagnosticBase /// IDiagnosticConfiguration public interface IDiagnostic { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/DeletionFailed.cs0000644000175000017500000000121111700531646030305 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic on failed delete. /// Diagnostic on failed delete. public class DeletionFailed : DiagnosticBase { public override string Problem() { return "Cascading delete to members failed. Possible reasons: db4o engine updates, corruption, changed class hierarchies."; } public override object Reason() { return string.Empty; } public override string Solution() { return "Running Defragment may fix."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/NativeQueryOptimizerNotLoaded.cs0000644000175000017500000000251111700531646033412 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { public class NativeQueryOptimizerNotLoaded : DiagnosticBase { private int _reason; private readonly Exception _details; public const int NqNotPresent = 1; public const int NqConstructionFailed = 2; public NativeQueryOptimizerNotLoaded(int reason, Exception details) { _reason = reason; _details = details; } public override string Problem() { return "Native Query Optimizer could not be loaded"; } public override object Reason() { switch (_reason) { case NqNotPresent: { return AppendDetails("Native query not present."); } case NqConstructionFailed: { return AppendDetails("Native query couldn't be instantiated."); } default: { return AppendDetails("Reason not specified."); break; } } } public override string Solution() { return "If you to have the native queries optimized, please check that the native query jar is present in the class-path."; } private object AppendDetails(string reason) { if (_details == null) { return reason; } return reason + "\n" + _details.ToString(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/IDiagnosticConfiguration.cs0000644000175000017500000000247011700531646032372 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// provides methods to configure the behaviour of db4o /// diagnostics. /// /// provides methods to configure the behaviour of db4o diagnostics. ///
///
/// Diagnostic system can be enabled on a running db4o database to /// notify a user about possible problems or misconfigurations. /// Diagnostic listeners can be be added and removed with calls to this /// interface. To install the most basic listener call: ///
/// commonConfig.Diagnostic.AddListener(new /// DiagnosticToConsole()); ///
/// IConfiguration.Diagnostic /// /// IDiagnosticListener /// public interface IDiagnosticConfiguration { /// adds a DiagnosticListener to listen to Diagnostic messages. /// adds a DiagnosticListener to listen to Diagnostic messages. void AddListener(IDiagnosticListener listener); /// removes all DiagnosticListeners. /// removes all DiagnosticListeners. void RemoveAllListeners(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/UpdateDepthGreaterOne.cs0000644000175000017500000000200611700531646031623 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic, if update depth greater than 1. /// Diagnostic, if update depth greater than 1. public class UpdateDepthGreaterOne : DiagnosticBase { private readonly int _depth; public UpdateDepthGreaterOne(int depth) { _depth = depth; } public override object Reason() { return "Db4o.configure().updateDepth(" + _depth + ")"; } public override string Problem() { return "A global update depth greater than 1 is not recommended"; } public override string Solution() { return "Increasing the global update depth to a value greater than 1 is only recommended for" + " testing, not for production use. If individual deep updates are needed, consider using" + " ExtObjectContainer#set(object, depth) and make sure to profile the performance of each call."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/DefragmentRecommendation.cs0000644000175000017500000000241311700531646032403 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic to recommend Defragment when needed. /// Diagnostic to recommend Defragment when needed. public class DefragmentRecommendation : DiagnosticBase { private readonly DefragmentRecommendation.DefragmentRecommendationReason _reason; public DefragmentRecommendation(DefragmentRecommendation.DefragmentRecommendationReason reason) { _reason = reason; } public class DefragmentRecommendationReason { internal readonly string _message; public DefragmentRecommendationReason(string reason) { _message = reason; } public static readonly DefragmentRecommendation.DefragmentRecommendationReason DeleteEmbeded = new DefragmentRecommendation.DefragmentRecommendationReason("Delete Embedded not supported on old file format." ); } public override string Problem() { return "Database file format is old or database is highly fragmented."; } public override object Reason() { return _reason._message; } public override string Solution() { return "Defragment the database."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/MissingClass.cs0000644000175000017500000000115711700531646030045 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic if class not found public class MissingClass : DiagnosticBase { public readonly string _className; public MissingClass(string className) { _className = className; } public override string Problem() { return "Class not found in classpath."; } public override object Reason() { return _className; } public override string Solution() { return "Check your classpath."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/NativeQueryNotOptimized.cs0000644000175000017500000000253311700531646032267 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic, if Native Query can not be run optimized. /// Diagnostic, if Native Query can not be run optimized. public class NativeQueryNotOptimized : DiagnosticBase { private readonly Predicate _predicate; private readonly Exception _details; public NativeQueryNotOptimized(Predicate predicate, Exception details) { _predicate = predicate; _details = details; } public override object Reason() { if (_details == null) { return _predicate; } return _predicate != null ? _predicate.ToString() : string.Empty + "\n" + _details .Message; } public override string Problem() { return "Native Query Predicate could not be run optimized"; } public override string Solution() { return "This Native Query was run by instantiating all objects of the candidate class. " + "Consider simplifying the expression in the Native Query method. If you feel that " + "the Native Query processor should understand your code better, you are invited to " + "post yout query code to db4o forums at http://developer.db4o.com/forums"; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/ObjectFieldDoesNotExist.cs0000644000175000017500000000171011700531646032124 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// /// Diagnostic if /// Db4objects.Db4o.Config.IObjectClass.ObjectField(string) /// /// was called on a /// field that does not exist. /// public class ObjectFieldDoesNotExist : DiagnosticBase { public readonly string _className; public readonly string _fieldName; public ObjectFieldDoesNotExist(string className, string fieldName) { _className = className; _fieldName = fieldName; } public override string Problem() { return "ObjectField was configured but does not exist."; } public override object Reason() { return _className + "." + _fieldName; } public override string Solution() { return "Check your configuration."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/IDiagnosticListener.cs0000644000175000017500000000146711700531646031355 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// listens to Diagnostic messages. /// /// listens to Diagnostic messages. ///

Create a class that implements this listener interface and add /// the listener by calling commonConfig.Diagnostic.AddListener(). ///
/// Db4objects.Db4o.Diagnostic.IDiagnosticConfiguration /// public interface IDiagnosticListener { /// this method will be called with Diagnostic messages. /// this method will be called with Diagnostic messages. void OnDiagnostic(IDiagnostic d); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/DiagnosticToConsole.cs0000644000175000017500000000176411700531646031364 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// prints Diagnostic messsages to the Console. /// /// prints Diagnostic messages to the Console. /// Install this /// Db4objects.Db4o.Diagnostic.IDiagnosticListener /// /// with:
/// commonConfig.Diagnostic.AddListener(new DiagnosticToConsole());
///
/// Db4objects.Db4o.Diagnostic.IDiagnosticConfiguration /// public class DiagnosticToConsole : IDiagnosticListener { /// redirects Diagnostic messages to the Console. /// redirects Diagnostic messages to the Console. public virtual void OnDiagnostic(IDiagnostic d) { Sharpen.Runtime.Out.WriteLine(d.ToString()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/DescendIntoTranslator.cs0000644000175000017500000000210211700531646031706 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// /// Query tries to descend into a field of a class that is configured to be translated /// (and thus cannot be descended into). /// /// /// Query tries to descend into a field of a class that is configured to be translated /// (and thus cannot be descended into). /// public class DescendIntoTranslator : DiagnosticBase { private string className; private string fieldName; public DescendIntoTranslator(string className_, string fieldName_) { className = className_; fieldName = fieldName_; } public override string Problem() { return "Query descends into field(s) of translated class."; } public override object Reason() { return className + "." + fieldName; } public override string Solution() { return "Consider dropping the translator configuration or resort to evaluations/unoptimized NQs."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/ClassHasNoFields.cs0000644000175000017500000000153211700531646030570 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic, if class has no fields. /// Diagnostic, if class has no fields. public class ClassHasNoFields : DiagnosticBase { private readonly string _className; public ClassHasNoFields(string className) { _className = className; } public override object Reason() { return _className; } public override string Problem() { return "Class does not contain any persistent fields"; } public override string Solution() { return "Every class in the hierarchy requires overhead for the maintenance of a class index." + " Consider removing this class from the hierarchy, if it is not needed."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/LoadedFromClassIndex.cs0000644000175000017500000000164511700531646031442 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// Diagnostic, if query was required to load candidate set from class index. /// /// Diagnostic, if query was required to load candidate set from class index. /// public class LoadedFromClassIndex : DiagnosticBase { private readonly string _className; public LoadedFromClassIndex(string className) { _className = className; } public override object Reason() { return _className; } public override string Problem() { return "Query candidate set could not be loaded from a field index"; } public override string Solution() { return "Consider indexing fields that you query for: " + "Db4o.configure().objectClass([class]).objectField([fieldName]).indexed(true)"; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Diagnostic/DiagnosticBase.cs0000644000175000017500000000145211700531646030323 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Diagnostic; namespace Db4objects.Db4o.Diagnostic { /// base class for Diagnostic messages public abstract class DiagnosticBase : IDiagnostic { /// returns the reason for the message public abstract object Reason(); /// returns the potential problem that triggered the message public abstract string Problem(); /// suggests a possible solution for the possible problem public abstract string Solution(); public override string ToString() { return ":: db4o " + Db4oVersion.Name + " Diagnostics ::\n " + Reason() + " :: " + Problem() + "\n " + Solution(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/0000755000175000017500000000000011700531646024603 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/0000755000175000017500000000000011700531646026656 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/AndIndexedLeaf.cs0000644000175000017500000000070611700531646032003 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public class AndIndexedLeaf : JoinedLeaf { public AndIndexedLeaf(QCon constraint, IIndexedNodeWithRange leaf1, IIndexedNodeWithRange leaf2) : base(constraint, leaf1, leaf1.GetRange().Intersect(leaf2.GetRange())) { } } } FieldIndexProcessorResult.cs0000644000175000017500000000354311700531646034245 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public class FieldIndexProcessorResult { public static readonly Db4objects.Db4o.Internal.Fieldindex.FieldIndexProcessorResult NoIndexFound = new Db4objects.Db4o.Internal.Fieldindex.FieldIndexProcessorResult (null); public static readonly Db4objects.Db4o.Internal.Fieldindex.FieldIndexProcessorResult FoundIndexButNoMatch = new Db4objects.Db4o.Internal.Fieldindex.FieldIndexProcessorResult (null); private readonly IIndexedNode _indexedNode; public FieldIndexProcessorResult(IIndexedNode indexedNode) { _indexedNode = indexedNode; } public virtual Tree ToQCandidate(QCandidates candidates) { return TreeInt.ToQCandidate(ToTreeInt(), candidates); } public virtual TreeInt ToTreeInt() { if (FoundMatch()) { return _indexedNode.ToTreeInt(); } return null; } public virtual bool FoundMatch() { return FoundIndex() && !NoMatch(); } public virtual bool FoundIndex() { return this != NoIndexFound; } public virtual bool NoMatch() { return this == FoundIndexButNoMatch; } public virtual IEnumerator IterateIDs() { return new _MappingIterator_46(_indexedNode.GetEnumerator()); } private sealed class _MappingIterator_46 : MappingIterator { public _MappingIterator_46(IEnumerator baseArg1) : base(baseArg1) { } protected override object Map(object current) { IFieldIndexKey composite = (IFieldIndexKey)current; return composite.ParentID(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IIndexedNode.cs0000644000175000017500000000076511700531646031514 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; namespace Db4objects.Db4o.Internal.Fieldindex { public interface IIndexedNode : IEnumerable { bool IsResolved(); IIndexedNode Resolve(); BTree GetIndex(); int ResultSize(); //FIXME: do we need this? TreeInt ToTreeInt(); void MarkAsBestIndex(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IndexedPath.cs0000644000175000017500000000324011700531646031401 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public class IndexedPath : IndexedNodeBase { public static IIndexedNode NewParentPath(IIndexedNode next, QCon constraint) { if (!CanFollowParent(constraint)) { return null; } return new Db4objects.Db4o.Internal.Fieldindex.IndexedPath((QConObject)constraint .Parent(), next); } private static bool CanFollowParent(QCon con) { QCon parent = con.Parent(); FieldMetadata parentField = GetYapField(parent); if (null == parentField) { return false; } FieldMetadata conField = GetYapField(con); if (null == conField) { return false; } return parentField.HasIndex() && parentField.FieldType().IsAssignableFrom(conField .ContainingClass()); } private static FieldMetadata GetYapField(QCon con) { QField field = con.GetField(); if (null == field) { return null; } return field.GetFieldMetadata(); } private IIndexedNode _next; public IndexedPath(QConObject parent, IIndexedNode next) : base(parent) { _next = next; } public override IEnumerator GetEnumerator() { return new IndexedPathIterator(this, _next.GetEnumerator()); } public override int ResultSize() { throw new NotSupportedException(); } public override void MarkAsBestIndex() { _constraint.SetProcessedByIndex(); _next.MarkAsBestIndex(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/QEBitmap.cs0000644000175000017500000000136611700531646030655 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { internal class QEBitmap { public static Db4objects.Db4o.Internal.Fieldindex.QEBitmap ForQE(QE qe) { bool[] bitmap = new bool[4]; qe.IndexBitMap(bitmap); return new Db4objects.Db4o.Internal.Fieldindex.QEBitmap(bitmap); } private QEBitmap(bool[] bitmap) { _bitmap = bitmap; } private bool[] _bitmap; public virtual bool TakeGreater() { return _bitmap[QE.Greater]; } public virtual bool TakeEqual() { return _bitmap[QE.Equal]; } public virtual bool TakeSmaller() { return _bitmap[QE.Smaller]; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/OrIndexedLeaf.cs0000644000175000017500000000070011700531646031653 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public class OrIndexedLeaf : JoinedLeaf { public OrIndexedLeaf(QCon constraint, IIndexedNodeWithRange leaf1, IIndexedNodeWithRange leaf2) : base(constraint, leaf1, leaf1.GetRange().Union(leaf2.GetRange())) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/FieldIndexProcessor.cs0000644000175000017500000000330011700531646033114 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public class FieldIndexProcessor { private readonly QCandidates _candidates; public FieldIndexProcessor(QCandidates candidates) { _candidates = candidates; } public virtual FieldIndexProcessorResult Run() { IIndexedNode bestIndex = SelectBestIndex(); if (null == bestIndex) { return FieldIndexProcessorResult.NoIndexFound; } if (bestIndex.ResultSize() > 0) { IIndexedNode resolved = ResolveFully(bestIndex); if (null == resolved) { return FieldIndexProcessorResult.NoIndexFound; } resolved.MarkAsBestIndex(); return new FieldIndexProcessorResult(resolved); } return FieldIndexProcessorResult.FoundIndexButNoMatch; } private IIndexedNode ResolveFully(IIndexedNode bestIndex) { if (null == bestIndex) { return null; } if (bestIndex.IsResolved()) { return bestIndex; } return ResolveFully(bestIndex.Resolve()); } public virtual IIndexedNode SelectBestIndex() { IEnumerator i = CollectIndexedNodes(); if (!i.MoveNext()) { return null; } IIndexedNode best = (IIndexedNode)i.Current; while (i.MoveNext()) { IIndexedNode leaf = (IIndexedNode)i.Current; if (leaf.ResultSize() < best.ResultSize()) { best = leaf; } } return best; } public virtual IEnumerator CollectIndexedNodes() { return new IndexedNodeCollector(_candidates).GetNodes(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IndexedNodeBase.cs0000644000175000017500000000377311700531646032200 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public abstract class IndexedNodeBase : IIndexedNode { protected readonly QConObject _constraint; public IndexedNodeBase(QConObject qcon) { if (null == qcon) { throw new ArgumentNullException(); } if (null == qcon.GetField()) { throw new ArgumentException(); } _constraint = qcon; } public virtual TreeInt ToTreeInt() { return AddToTree(null, this); } public BTree GetIndex() { return GetYapField().GetIndex(Transaction()); } private FieldMetadata GetYapField() { return _constraint.GetField().GetFieldMetadata(); } public virtual QCon Constraint() { return _constraint; } public virtual bool IsResolved() { QCon parent = Constraint().Parent(); return null == parent || !parent.HasParent(); } public virtual IBTreeRange Search(object value) { return GetYapField().Search(Transaction(), value); } public static TreeInt AddToTree(TreeInt tree, IIndexedNode node) { IEnumerator i = node.GetEnumerator(); while (i.MoveNext()) { IFieldIndexKey composite = (IFieldIndexKey)i.Current; tree = (TreeInt)((TreeInt)Tree.Add(tree, new TreeInt(composite.ParentID()))); } return tree; } public virtual IIndexedNode Resolve() { if (IsResolved()) { return null; } return IndexedPath.NewParentPath(this, Constraint()); } private Db4objects.Db4o.Internal.Transaction Transaction() { return Constraint().Transaction(); } public abstract IEnumerator GetEnumerator(); public abstract void MarkAsBestIndex(); public abstract int ResultSize(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IndexedPathIterator.cs0000644000175000017500000000123211700531646033112 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; namespace Db4objects.Db4o.Internal.Fieldindex { internal sealed class IndexedPathIterator : CompositeIterator4 { private IndexedPath _path; public IndexedPathIterator(IndexedPath path, IEnumerator iterator) : base(iterator ) { _path = path; } protected override IEnumerator NextIterator(object current) { IFieldIndexKey key = (IFieldIndexKey)current; return _path.Search(key.ParentID()).Keys(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IndexedNodeCollector.cs0000644000175000017500000002011211700531646033236 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public class IndexedNodeCollector { private readonly Collection4 _nodes; private readonly Hashtable4 _nodeCache; public IndexedNodeCollector(QCandidates candidates) { _nodes = new Collection4(); _nodeCache = new Hashtable4(); CollectIndexedNodes(candidates); } public virtual IEnumerator GetNodes() { return _nodes.GetEnumerator(); } private void CollectIndexedNodes(QCandidates candidates) { CollectIndexedNodes(candidates.IterateConstraints()); ImplicitlyAndJoinsOnSameField(); } private void ImplicitlyAndJoinsOnSameField() { object[] nodes = _nodes.ToArray(); for (int i = 0; i < nodes.Length; i++) { object node = nodes[i]; if (node is OrIndexedLeaf) { OrIndexedLeaf current = (OrIndexedLeaf)node; OrIndexedLeaf other = FindJoinOnSameFieldAtSameLevel(current); if (null != other) { nodes[Arrays4.IndexOfIdentity(nodes, other)] = null; CollectImplicitAnd(current.GetConstraint(), current, other); } } } } private OrIndexedLeaf FindJoinOnSameFieldAtSameLevel(OrIndexedLeaf join) { IEnumerator i = _nodes.GetEnumerator(); while (i.MoveNext()) { if (i.Current == join) { continue; } if (i.Current is OrIndexedLeaf) { OrIndexedLeaf current = (OrIndexedLeaf)i.Current; if (current.GetIndex() == join.GetIndex() && ParentConstraint(current) == ParentConstraint (join)) { return current; } } } return null; } private object ParentConstraint(OrIndexedLeaf node) { return node.GetConstraint().Parent(); } private void CollectIndexedNodes(IEnumerator qcons) { while (qcons.MoveNext()) { QCon qcon = (QCon)qcons.Current; if (IsCached(qcon)) { continue; } if (IsLeaf(qcon)) { if (qcon.CanLoadByIndex() && qcon.CanBeIndexLeaf()) { QConObject conObject = (QConObject)qcon; if (conObject.HasJoins()) { CollectJoinedNode(conObject); } else { CollectStandaloneNode(conObject); } } } else { if (!qcon.HasJoins()) { CollectIndexedNodes(qcon.IterateChildren()); } } } } private bool IsCached(QCon qcon) { return null != _nodeCache.Get(qcon); } private void CollectStandaloneNode(QConObject conObject) { IndexedLeaf existing = FindLeafOnSameField(conObject); if (existing != null) { CollectImplicitAnd(conObject, existing, new IndexedLeaf(conObject)); } else { _nodes.Add(new IndexedLeaf(conObject)); } } private void CollectJoinedNode(QConObject constraintWithJoins) { Collection4 joins = CollectTopLevelJoins(constraintWithJoins); if (!CanJoinsBeSearchedByIndex(joins)) { return; } if (1 == joins.Size()) { _nodes.Add(NodeForConstraint((QCon)joins.SingleElement())); return; } CollectImplicitlyAndingJoins(joins, constraintWithJoins); } private bool AllHaveSamePath(Collection4 leaves) { IEnumerator i = leaves.GetEnumerator(); i.MoveNext(); QCon first = (QCon)i.Current; while (i.MoveNext()) { if (!HaveSamePath(first, (QCon)i.Current)) { return false; } } return true; } private bool HaveSamePath(QCon x, QCon y) { if (x == y) { return true; } if (!x.OnSameFieldAs(y)) { return false; } if (!x.HasParent()) { return !y.HasParent(); } return HaveSamePath(x.Parent(), y.Parent()); } private Collection4 CollectLeaves(Collection4 joins) { Collection4 leaves = new Collection4(); CollectLeaves(leaves, joins); return leaves; } private void CollectLeaves(Collection4 leaves, Collection4 joins) { IEnumerator i = joins.GetEnumerator(); while (i.MoveNext()) { QConJoin join = ((QConJoin)i.Current); CollectLeavesFromJoin(leaves, join); } } private void CollectLeavesFromJoin(Collection4 leaves, QConJoin join) { CollectLeavesFromJoinConstraint(leaves, join.Constraint1()); CollectLeavesFromJoinConstraint(leaves, join.Constraint2()); } private void CollectLeavesFromJoinConstraint(Collection4 leaves, QCon constraint) { if (constraint is QConJoin) { CollectLeavesFromJoin(leaves, (QConJoin)constraint); } else { if (!leaves.ContainsByIdentity(constraint)) { leaves.Add(constraint); } } } private bool CanJoinsBeSearchedByIndex(Collection4 joins) { Collection4 leaves = CollectLeaves(joins); return AllHaveSamePath(leaves) && AllCanBeSearchedByIndex(leaves); } private bool AllCanBeSearchedByIndex(Collection4 leaves) { IEnumerator i = leaves.GetEnumerator(); while (i.MoveNext()) { QCon leaf = ((QCon)i.Current); if (!leaf.CanLoadByIndex()) { return false; } } return true; } private void CollectImplicitlyAndingJoins(Collection4 joins, QConObject constraintWithJoins ) { IEnumerator i = joins.GetEnumerator(); i.MoveNext(); IIndexedNodeWithRange last = NodeForConstraint((QCon)i.Current); while (i.MoveNext()) { IIndexedNodeWithRange node = NodeForConstraint((QCon)i.Current); last = new AndIndexedLeaf(constraintWithJoins, node, last); _nodes.Add(last); } } private Collection4 CollectTopLevelJoins(QConObject constraintWithJoins) { Collection4 joins = new Collection4(); CollectTopLevelJoins(joins, constraintWithJoins); return joins; } private void CollectTopLevelJoins(Collection4 joins, QCon constraintWithJoins) { IEnumerator i = constraintWithJoins.IterateJoins(); while (i.MoveNext()) { QConJoin join = (QConJoin)i.Current; if (!join.HasJoins()) { if (!joins.ContainsByIdentity(join)) { joins.Add(join); } } else { CollectTopLevelJoins(joins, join); } } } private IIndexedNodeWithRange NewNodeForConstraint(QConJoin join) { IIndexedNodeWithRange c1 = NodeForConstraint(join.Constraint1()); IIndexedNodeWithRange c2 = NodeForConstraint(join.Constraint2()); if (join.IsOr()) { return new OrIndexedLeaf(FindLeafForJoin(join), c1, c2); } return new AndIndexedLeaf(join.Constraint1(), c1, c2); } private QCon FindLeafForJoin(QConJoin join) { if (join.Constraint1() is QConObject) { return join.Constraint1(); } QCon con = join.Constraint2(); if (con is QConObject) { return con; } return FindLeafForJoin((QConJoin)con); } private IIndexedNodeWithRange NodeForConstraint(QCon con) { IIndexedNodeWithRange node = (IIndexedNodeWithRange)_nodeCache.Get(con); if (null != node || _nodeCache.ContainsKey(con)) { return node; } node = NewNodeForConstraint(con); _nodeCache.Put(con, node); return node; } private IIndexedNodeWithRange NewNodeForConstraint(QCon con) { if (con is QConJoin) { return NewNodeForConstraint((QConJoin)con); } return new IndexedLeaf((QConObject)con); } private void CollectImplicitAnd(QCon constraint, IIndexedNodeWithRange x, IIndexedNodeWithRange y) { _nodes.Remove(x); _nodes.Remove(y); _nodes.Add(new AndIndexedLeaf(constraint, x, y)); } private IndexedLeaf FindLeafOnSameField(QConObject conObject) { IEnumerator i = _nodes.GetEnumerator(); while (i.MoveNext()) { if (i.Current is IndexedLeaf) { IndexedLeaf leaf = (IndexedLeaf)i.Current; if (conObject.OnSameFieldAs(leaf.Constraint())) { return leaf; } } } return null; } private bool IsLeaf(QCon qcon) { return !qcon.HasChildren(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/JoinedLeaf.cs0000644000175000017500000000311111700531646031201 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { public abstract class JoinedLeaf : IIndexedNodeWithRange { private readonly QCon _constraint; private readonly IIndexedNodeWithRange _leaf1; private readonly IBTreeRange _range; public JoinedLeaf(QCon constraint, IIndexedNodeWithRange leaf1, IBTreeRange range ) { if (null == constraint || null == leaf1 || null == range) { throw new ArgumentNullException(); } _constraint = constraint; _leaf1 = leaf1; _range = range; } public virtual QCon GetConstraint() { return _constraint; } public virtual IBTreeRange GetRange() { return _range; } public virtual IEnumerator GetEnumerator() { return _range.Keys(); } public virtual TreeInt ToTreeInt() { return IndexedNodeBase.AddToTree(null, this); } public virtual BTree GetIndex() { return _leaf1.GetIndex(); } public virtual bool IsResolved() { return _leaf1.IsResolved(); } public virtual IIndexedNode Resolve() { return IndexedPath.NewParentPath(this, _constraint); } public virtual int ResultSize() { return _range.Size(); } public virtual void MarkAsBestIndex() { _leaf1.MarkAsBestIndex(); _constraint.SetProcessedByIndex(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IIndexedNodeWithRange.cs0000644000175000017500000000045111700531646033315 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; namespace Db4objects.Db4o.Internal.Fieldindex { public interface IIndexedNodeWithRange : IIndexedNode { IBTreeRange GetRange(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fieldindex/IndexedLeaf.cs0000644000175000017500000000264411700531646031363 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Fieldindex { /// public class IndexedLeaf : IndexedNodeBase, IIndexedNodeWithRange { private readonly IBTreeRange _range; public IndexedLeaf(QConObject qcon) : base(qcon) { _range = Search(); } private IBTreeRange Search() { IBTreeRange range = Search(Constraint().GetObject()); QEBitmap bitmap = QEBitmap.ForQE(Constraint().Evaluator()); if (bitmap.TakeGreater()) { if (bitmap.TakeEqual()) { return range.ExtendToLast(); } IBTreeRange greater = range.Greater(); if (bitmap.TakeSmaller()) { return greater.Union(range.Smaller()); } return greater; } if (bitmap.TakeSmaller()) { if (bitmap.TakeEqual()) { return range.ExtendToFirst(); } return range.Smaller(); } return range; } public override int ResultSize() { return _range.Size(); } public override IEnumerator GetEnumerator() { return _range.Keys(); } public virtual IBTreeRange GetRange() { return _range; } public override void MarkAsBestIndex() { _constraint.SetProcessedByIndex(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Diagnostic/0000755000175000017500000000000011700531646026667 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Diagnostic/DiagnosticProcessor.cs0000644000175000017500000000723511700531646033211 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Diagnostic { /// FIXME: remove me from the core and make me a facade over Events public class DiagnosticProcessor : IDiagnosticConfiguration, IDeepClone { private Collection4 _listeners; public DiagnosticProcessor() { } private DiagnosticProcessor(Collection4 listeners) { _listeners = listeners; } public virtual void AddListener(IDiagnosticListener listener) { if (_listeners == null) { _listeners = new Collection4(); } _listeners.Add(listener); } public virtual void CheckClassHasFields(ClassMetadata classMetadata) { if (classMetadata.AspectsAreNull() || classMetadata.DeclaredAspectCount() == 0) { string name = classMetadata.GetName(); string[] ignoredPackages = new string[] { "java.util." }; for (int i = 0; i < ignoredPackages.Length; i++) { if (name.IndexOf(ignoredPackages[i]) == 0) { return; } } if (IsDb4oClass(classMetadata)) { return; } OnDiagnostic(new ClassHasNoFields(name)); } } public virtual void CheckUpdateDepth(int depth) { if (depth > 1) { OnDiagnostic(new UpdateDepthGreaterOne(depth)); } } public virtual object DeepClone(object context) { return new Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor(CloneListeners ()); } public virtual void DeletionFailed() { OnDiagnostic(new Db4objects.Db4o.Diagnostic.DeletionFailed()); } public virtual void DefragmentRecommended(DefragmentRecommendation.DefragmentRecommendationReason reason) { OnDiagnostic(new DefragmentRecommendation(reason)); } private Collection4 CloneListeners() { return _listeners != null ? new Collection4(_listeners) : null; } public virtual bool Enabled() { return _listeners != null; } private bool IsDb4oClass(ClassMetadata classMetadata) { return classMetadata.IsInternal(); } public virtual void LoadedFromClassIndex(ClassMetadata classMetadata) { if (IsDb4oClass(classMetadata)) { return; } OnDiagnostic(new Db4objects.Db4o.Diagnostic.LoadedFromClassIndex(classMetadata.GetName ())); } public virtual void DescendIntoTranslator(ClassMetadata parent, string fieldName) { OnDiagnostic(new Db4objects.Db4o.Diagnostic.DescendIntoTranslator(parent.GetName( ), fieldName)); } public virtual void NativeQueryUnoptimized(Predicate predicate, Exception exception ) { OnDiagnostic(new NativeQueryNotOptimized(predicate, exception)); } public virtual void NativeQueryOptimizerNotLoaded(int reason, Exception e) { OnDiagnostic(new Db4objects.Db4o.Diagnostic.NativeQueryOptimizerNotLoaded(reason, e)); } public virtual void ObjectFieldDoesNotExist(string className, string fieldName) { OnDiagnostic(new Db4objects.Db4o.Diagnostic.ObjectFieldDoesNotExist(className, fieldName )); } public virtual void ClassMissed(string className) { OnDiagnostic(new MissingClass(className)); } public virtual void OnDiagnostic(IDiagnostic d) { if (_listeners == null) { return; } IEnumerator i = _listeners.GetEnumerator(); while (i.MoveNext()) { ((IDiagnosticListener)i.Current).OnDiagnostic(d); } } public virtual void RemoveAllListeners() { _listeners = null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/CallBackMode.cs0000644000175000017500000000130611700531646027373 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { public sealed class CallBackMode { public static readonly Db4objects.Db4o.Internal.CallBackMode All = new Db4objects.Db4o.Internal.CallBackMode ("ALL"); public static readonly Db4objects.Db4o.Internal.CallBackMode DeleteOnly = new Db4objects.Db4o.Internal.CallBackMode ("DELETE_ONLY"); public static readonly Db4objects.Db4o.Internal.CallBackMode None = new Db4objects.Db4o.Internal.CallBackMode ("NONE"); private string _desc; private CallBackMode(string desc) { _desc = desc; } public override string ToString() { return _desc; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IIndexable4.cs0000644000175000017500000000074411700531646027227 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public interface IIndexable4 : IComparable4, ILinkLengthAware { object ReadIndexEntry(IContext context, ByteArrayBuffer reader); void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj); void DefragIndexEntry(DefragmentContextImpl context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TransactionContext.cs0000644000175000017500000000065011700531646030765 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class TransactionContext { public readonly Transaction _transaction; public readonly object _object; public TransactionContext(Transaction transaction, object obj) { _transaction = transaction; _object = obj; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ClassMetadata.cs0000644000175000017500000020352111700531646027643 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Diagnostic; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Metadata; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Reflect; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class ClassMetadata : PersistentBase, IStoredClass { /// /// For reference types, _typeHandler always holds a StandardReferenceTypeHandler /// that will use the _aspects of this class to take care of its business. /// /// /// For reference types, _typeHandler always holds a StandardReferenceTypeHandler /// that will use the _aspects of this class to take care of its business. A custom /// type handler would appear as a TypeHandlerAspect in that case. /// For value types, _typeHandler always holds the actual value type handler be it /// a custom type handler or a builtin one. /// protected ITypeHandler4 _typeHandler; public Db4objects.Db4o.Internal.ClassMetadata _ancestor; private Config4Class _config; public ClassAspect[] _aspects; private IClassIndexStrategy _index; private string i_name; private readonly ObjectContainerBase _container; internal byte[] i_nameBytes; private ByteArrayBuffer i_reader; private bool _classIndexed; private IReflectClass _classReflector; private IEventDispatcher _eventDispatcher; private bool _internal; private bool _unversioned; private TernaryBool _canUpdateFast = TernaryBool.Unspecified; private TranslatedAspect _translator; private IModificationAware _modificationChecker = ClassMetadata.AlwaysModified.Instance; private IFieldAccessor _fieldAccessor; private IFunction4 _constructor; private TypeHandlerAspect _customTypeHandlerAspect; private IAspectTraversalStrategy _aspectTraversalStrategy; internal bool CanUpdateFast() { if (_canUpdateFast == TernaryBool.Unspecified) { _canUpdateFast = TernaryBool.ForBoolean(CheckCanUpdateFast()); } return _canUpdateFast.BooleanValue(false); } private bool CheckCanUpdateFast() { if (_ancestor != null && !_ancestor.CanUpdateFast()) { return false; } if (_config != null && _config.CascadeOnDelete() == TernaryBool.Yes) { return false; } BooleanByRef hasIndex = new BooleanByRef(false); TraverseDeclaredFields(new _IProcedure4_101(hasIndex)); return !hasIndex.value; } private sealed class _IProcedure4_101 : IProcedure4 { public _IProcedure4_101(BooleanByRef hasIndex) { this.hasIndex = hasIndex; } public void Apply(object arg) { if (((FieldMetadata)arg).HasIndex()) { hasIndex.value = true; } } private readonly BooleanByRef hasIndex; } public virtual bool IsInternal() { return _internal; } private IClassIndexStrategy CreateIndexStrategy() { return new BTreeClassIndexStrategy(this); } protected ClassMetadata(ObjectContainerBase container) { if (null == container) { throw new ArgumentNullException(); } _container = container; _index = CreateIndexStrategy(); _classIndexed = true; _fieldAccessor = new StrictFieldAccessor(); } public ClassMetadata(ObjectContainerBase container, IReflectClass classReflector) { if (null == container) { throw new ArgumentNullException(); } _container = container; ClassReflector(classReflector); _index = CreateIndexStrategy(); _classIndexed = true; if (_container.Config().ExceptionsOnNotStorable()) { _fieldAccessor = new StrictFieldAccessor(); } else { _fieldAccessor = new LenientFieldAccessor(); } } internal virtual IFieldAccessor FieldAccessor() { return _fieldAccessor; } private ITypeHandler4 CreateDefaultTypeHandler() { // TODO: make sure initializeAspects has been executed // before the actual type handler is required // and remove this method return new StandardReferenceTypeHandler(this); } public virtual void CascadeActivation(IActivationContext context) { if (!ObjectCanActivate(context.Transaction(), context.TargetObject())) { return; } TraverseAllAspects(new _ITraverseAspectCommand_160(context)); } private sealed class _ITraverseAspectCommand_160 : ITraverseAspectCommand { public _ITraverseAspectCommand_160(IActivationContext context) { this.context = context; } public void ProcessAspectOnMissingClass(ClassAspect aspect, int currentSlot) { } // do nothing public void ProcessAspect(ClassAspect aspect, int currentSlot) { aspect.CascadeActivation(context); } public int DeclaredAspectCount(Db4objects.Db4o.Internal.ClassMetadata classMetadata ) { return classMetadata.DeclaredAspectCount(); } public bool Cancelled() { return false; } private readonly IActivationContext context; } public void AddFieldIndices(StatefulBuffer buffer) { if (!StandardReferenceTypeHandlerIsUsed()) { return; } if (HasClassIndex() || HasVirtualAttributes()) { ObjectHeader oh = new ObjectHeader(this, buffer); ObjectIdContextImpl context = new ObjectIdContextImpl(buffer.Transaction(), buffer , oh, buffer.GetID()); Handlers4.FieldAwareTypeHandler(CorrectHandlerVersion(context)).AddFieldIndices(context ); } } // FIXME: This method wants to be removed. private bool StandardReferenceTypeHandlerIsUsed() { return _typeHandler is StandardReferenceTypeHandler; } internal virtual void InitializeAspects() { BitTrue(Const4.CheckedChanges); Collection4 aspects = new Collection4(); if (null != _aspects) { aspects.AddAll(_aspects); } ITypeHandler4 customTypeHandler = Container().Handlers.ConfiguredTypeHandler(ClassReflector ()); bool dirty = IsDirty(); if (InstallTranslator(aspects, customTypeHandler)) { dirty = true; } if (Container().DetectSchemaChanges()) { if (GenerateCommitTimestamps()) { if (!HasCommitTimestampField()) { aspects.Add(Container().CommitTimestampIndex()); dirty = true; } } if (GenerateUUIDs()) { if (!HasUUIDField()) { aspects.Add(Container().UUIDIndex()); dirty = true; } } } if (InstallCustomTypehandler(aspects, customTypeHandler)) { dirty = true; } bool defaultFieldBehaviour = _translator == null && customTypeHandler == null; if (Container().DetectSchemaChanges()) { if (defaultFieldBehaviour) { if (CollectReflectFields(aspects)) { dirty = true; } } if (dirty) { _container.SetDirtyInSystemTransaction(this); } } if (dirty || !defaultFieldBehaviour) { _aspects = ToClassAspectArray(aspects); } DiagnosticProcessor dp = _container._handlers.DiagnosticProcessor(); if (dp.Enabled()) { dp.CheckClassHasFields(this); } if (_aspects == null) { _aspects = new FieldMetadata[0]; } InitializeConstructor(customTypeHandler); if (StateDead()) { return; } _container.Callbacks().ClassOnRegistered(this); SetStateOK(); } private ClassAspect[] ToClassAspectArray(Collection4 aspects) { ClassAspect[] array = new ClassAspect[aspects.Size()]; aspects.ToArray(array); for (int i = 0; i < array.Length; i++) { array[i].SetHandle(i); } return array; } private bool InstallCustomTypehandler(Collection4 aspects, ITypeHandler4 customTypeHandler ) { if (customTypeHandler == null) { return false; } if (customTypeHandler is IModificationAware) { _modificationChecker = (IModificationAware)customTypeHandler; } if (Handlers4.IsStandaloneTypeHandler(customTypeHandler)) { _typeHandler = customTypeHandler; return false; } bool dirty = false; TypeHandlerAspect typeHandlerAspect = new TypeHandlerAspect(this, customTypeHandler ); if (!ReplaceAspectByName(aspects, typeHandlerAspect)) { aspects.Add(typeHandlerAspect); dirty = true; } DisableAspectsBefore(aspects, typeHandlerAspect); _customTypeHandlerAspect = typeHandlerAspect; return dirty; } private void DisableAspectsBefore(Collection4 aspects, TypeHandlerAspect typeHandlerAspect ) { int disableFromVersion = aspects.IndexOf(typeHandlerAspect) + 1; IEnumerator i = aspects.GetEnumerator(); while (i.MoveNext()) { ClassAspect aspect = (ClassAspect)i.Current; if (aspect == typeHandlerAspect) { break; } aspect.DisableFromAspectCountVersion(disableFromVersion); } } private bool InstallTranslator(Collection4 aspects, ITypeHandler4 customTypeHandler ) { if (_config == null) { return false; } IObjectTranslator translator = _config.GetTranslator(); if (translator == null) { return false; } ClassAspect existingAspect = AspectByName(aspects, TranslatedAspect.FieldNameFor( translator)); if (null != existingAspect) { return InstallTranslatorOnExistingAspect(translator, existingAspect, aspects); } if (customTypeHandler == null) { return InstallTranslatorOnNewAspect(translator, aspects); } return false; } private bool InstallTranslatorOnNewAspect(IObjectTranslator translator, Collection4 aspects) { TranslatedAspect translatedAspect = new TranslatedAspect(this, translator); aspects.Add(translatedAspect); _translator = translatedAspect; return true; } private bool InstallTranslatorOnExistingAspect(IObjectTranslator translator, ClassAspect existingAspect, Collection4 aspects) { if (existingAspect is TranslatedAspect) { TranslatedAspect translatedAspect = (TranslatedAspect)existingAspect; translatedAspect.InitializeTranslator(translator); _translator = translatedAspect; return false; } // older versions didn't store the aspect type properly _translator = new TranslatedAspect(this, translator); aspects.ReplaceByIdentity(existingAspect, _translator); return true; } private bool ReplaceAspectByName(Collection4 aspects, ClassAspect aspect) { ClassAspect existing = AspectByName(aspects, aspect.GetName()); if (existing == null) { return false; } aspects.ReplaceByIdentity(existing, aspect); return true; } private ClassAspect AspectByName(Collection4 aspects, string aspectName) { IEnumerator i = aspects.GetEnumerator(); while (i.MoveNext()) { ClassAspect current = (ClassAspect)i.Current; if (current.GetName().Equals(aspectName)) { return current; } } return null; } public virtual bool AspectsAreInitialized() { if (_aspects == null) { return false; } if (_ancestor != null) { return _ancestor.AspectsAreInitialized(); } return true; } private bool CollectReflectFields(Collection4 collectedAspects) { bool dirty = false; IReflectField[] reflectFieldArray = ReflectFields(); for (int reflectFieldIndex = 0; reflectFieldIndex < reflectFieldArray.Length; ++reflectFieldIndex) { IReflectField reflectField = reflectFieldArray[reflectFieldIndex]; if (!StoreField(reflectField)) { continue; } Db4objects.Db4o.Internal.ClassMetadata classMetadata = Handlers4.ErasedFieldType( Container(), reflectField.GetFieldType()); if (classMetadata == null) { continue; } FieldMetadata field = new FieldMetadata(this, reflectField, classMetadata); if (Contains(collectedAspects, field)) { continue; } dirty = true; collectedAspects.Add(field); } return dirty; } private bool Contains(Collection4 collectedAspects, FieldMetadata field) { IEnumerator aspectIterator = collectedAspects.GetEnumerator(); while (aspectIterator.MoveNext()) { if (((ClassAspect)aspectIterator.Current).Equals(field)) { return true; } } return false; } internal virtual void AddToIndex(Transaction trans, int id) { if (!trans.Container().MaintainsIndices()) { return; } AddToIndex1(trans, id); } internal void AddToIndex1(Transaction a_trans, int a_id) { if (_ancestor != null) { _ancestor.AddToIndex1(a_trans, a_id); } if (HasClassIndex()) { _index.Add(a_trans, a_id); } } internal virtual bool AllowsQueries() { return HasClassIndex(); } public virtual bool DescendOnCascadingActivation() { return true; } internal virtual void CheckChanges() { if (StateOK()) { if (!BitIsTrue(Const4.CheckedChanges)) { BitTrue(Const4.CheckedChanges); if (_ancestor != null) { _ancestor.CheckChanges(); } // Ancestor first, so the object length calculates // correctly if (_classReflector != null) { InitializeAspects(); if (!_container.IsClient && !IsReadOnlyContainer()) { Write(_container.SystemTransaction()); } } } } } public virtual void CheckType() { IReflectClass claxx = ClassReflector(); if (claxx == null) { return; } if (_container._handlers.IclassInternal.IsAssignableFrom(claxx)) { _internal = true; } if (_container._handlers.IclassUnversioned.IsAssignableFrom(claxx)) { _unversioned = true; } if (IsDb4oTypeImpl()) { IDb4oTypeImpl db4oTypeImpl = (IDb4oTypeImpl)claxx.NewInstance(); _classIndexed = (db4oTypeImpl == null || db4oTypeImpl.HasClassIndex()); } else { if (_config != null) { _classIndexed = _config.Indexed(); } } } public virtual bool IsDb4oTypeImpl() { return _container._handlers.IclassDb4otypeimpl.IsAssignableFrom(ClassReflector()); } public IUpdateDepth AdjustUpdateDepth(Transaction trans, IUpdateDepth depth) { return depth.Adjust(this); } public virtual bool CascadesOnDeleteOrUpdate() { Config4Class config = ConfigOrAncestorConfig(); if (config == null) { return false; } bool cascadeOnDelete = config.CascadeOnDelete() == TernaryBool.Yes; bool cascadeOnUpdate = config.CascadeOnUpdate() == TernaryBool.Yes; return cascadeOnDelete || cascadeOnUpdate; } public virtual FixedActivationDepth AdjustCollectionDepthToBorders(FixedActivationDepth depth) { if (!ClassReflector().IsCollection()) { return depth; } return depth.AdjustDepthToBorders(); } public int UpdateDepthFromConfig() { if (_config != null && _config.UpdateDepth() != Const4.Unspecified) { return _config.UpdateDepth(); } Config4Impl config = ConfigImpl(); int depth = config.UpdateDepth(); if (_ancestor != null) { int ancestordepth = _ancestor.UpdateDepthFromConfig(); if (ancestordepth > depth) { return ancestordepth; } } return depth; } public virtual void CollectConstraints(Transaction trans, QConObject parentConstraint , object obj, IVisitor4 visitor) { TraverseAllAspects(new _TraverseFieldCommand_534(trans, parentConstraint, obj, visitor )); } private sealed class _TraverseFieldCommand_534 : TraverseFieldCommand { public _TraverseFieldCommand_534(Transaction trans, QConObject parentConstraint, object obj, IVisitor4 visitor) { this.trans = trans; this.parentConstraint = parentConstraint; this.obj = obj; this.visitor = visitor; } protected override void Process(FieldMetadata field) { if (field.IsEnabledOn(AspectVersionContextImpl.CheckAlwaysEnabled)) { field.CollectConstraints(trans, parentConstraint, obj, visitor); } } private readonly Transaction trans; private readonly QConObject parentConstraint; private readonly object obj; private readonly IVisitor4 visitor; } public void CollectIDs(CollectIdContext context, string fieldName) { CollectIDs(context, new _IPredicate4_544(fieldName)); } private sealed class _IPredicate4_544 : IPredicate4 { public _IPredicate4_544(string fieldName) { this.fieldName = fieldName; } public bool Match(object candidate) { return fieldName.Equals(((ClassAspect)candidate).GetName()); } private readonly string fieldName; } public void CollectIDs(CollectIdContext context) { CollectIDs(context, new _IPredicate4_553()); } private sealed class _IPredicate4_553 : IPredicate4 { public _IPredicate4_553() { } public bool Match(object candidate) { return true; } } private void CollectIDs(CollectIdContext context, IPredicate4 predicate) { if (!StandardReferenceTypeHandlerIsUsed()) { throw new InvalidOperationException(); } ((StandardReferenceTypeHandler)CorrectHandlerVersion(context)).CollectIDs(context , predicate); } public virtual void CollectIDs(QueryingReadContext context) { if (!StandardReferenceTypeHandlerIsUsed()) { throw new InvalidOperationException(); } Handlers4.CollectIDs(context, CorrectHandlerVersion(context)); } public virtual Config4Class Config() { return _config; } public virtual Config4Class ConfigOrAncestorConfig() { if (_config != null) { return _config; } if (_ancestor != null) { return _ancestor.ConfigOrAncestorConfig(); } return null; } private void ResolveClassReflector(string className) { IReflectClass reflectClass = _container.Reflector().ForName(className); if (null == reflectClass) { throw new InvalidOperationException("Cannot initialize ClassMetadata for '" + className + "'."); } ClassReflector(reflectClass); } private void InitializeConstructor(ITypeHandler4 customTypeHandler) { if (IsTransient()) { _container.LogMsg(23, GetName()); SetStateDead(); return; } if (IsInterface() || IsAbstract()) { return; } IFunction4 constructor = CreateConstructor(customTypeHandler); if (constructor != null) { _constructor = constructor; return; } NotStorable(); } private bool IsAbstract() { return ClassReflector().IsAbstract(); } private bool IsInterface() { return ClassReflector().IsInterface(); } private IFunction4 CreateConstructor(ITypeHandler4 customTypeHandler) { if (customTypeHandler is IInstantiatingTypeHandler) { return new _IFunction4_632(this); } if (HasObjectConstructor()) { return new _IFunction4_640(this); } if (ClassReflector().EnsureCanBeInstantiated()) { return new _IFunction4_648(this); } return null; } private sealed class _IFunction4_632 : IFunction4 { public _IFunction4_632(ClassMetadata _enclosing) { this._enclosing = _enclosing; } public object Apply(object context) { return this._enclosing.InstantiateWithCustomTypeHandlerIfEnabled(((UnmarshallingContext )context)); } private readonly ClassMetadata _enclosing; } private sealed class _IFunction4_640 : IFunction4 { public _IFunction4_640(ClassMetadata _enclosing) { this._enclosing = _enclosing; } public object Apply(object context) { return this._enclosing._translator.Construct(((UnmarshallingContext)context)); } private readonly ClassMetadata _enclosing; } private sealed class _IFunction4_648 : IFunction4 { public _IFunction4_648(ClassMetadata _enclosing) { this._enclosing = _enclosing; } public object Apply(object context) { return this._enclosing.InstantiateFromReflector(((UnmarshallingContext)context).Container ()); } private readonly ClassMetadata _enclosing; } private void NotStorable() { _container.LogMsg(7, GetName()); SetStateDead(); } private bool IsTransient() { return _container._handlers.IsTransient(ClassReflector()); } private void ClassReflector(IReflectClass claxx) { _classReflector = claxx; if (claxx == null) { _typeHandler = null; return; } _typeHandler = CreateDefaultTypeHandler(); } public virtual void Deactivate(Transaction trans, IObjectInfo reference, IActivationDepth depth) { object obj = reference.GetObject(); if (ObjectCanDeactivate(trans, reference)) { ForceDeactivation(trans, depth, obj); ObjectOnDeactivate(trans, reference); } } public virtual void ForceDeactivation(Transaction trans, IActivationDepth depth, object obj) { DeactivateFields(trans.Container().ActivationContextFor(trans, obj, depth)); } private void ObjectOnDeactivate(Transaction transaction, IObjectInfo obj) { ObjectContainerBase container = transaction.Container(); container.Callbacks().ObjectOnDeactivate(transaction, obj); DispatchEvent(transaction, obj.GetObject(), EventDispatchers.Deactivate); } private bool ObjectCanDeactivate(Transaction transaction, IObjectInfo objectInfo) { ObjectContainerBase container = transaction.Container(); return container.Callbacks().ObjectCanDeactivate(transaction, objectInfo) && DispatchEvent (transaction, objectInfo.GetObject(), EventDispatchers.CanDeactivate); } internal void DeactivateFields(IActivationContext context) { TraverseAllAspects(new _ITraverseAspectCommand_701(context)); } private sealed class _ITraverseAspectCommand_701 : ITraverseAspectCommand { public _ITraverseAspectCommand_701(IActivationContext context) { this.context = context; } public void ProcessAspectOnMissingClass(ClassAspect aspect, int currentSlot) { } // do nothing public void ProcessAspect(ClassAspect aspect, int currentSlot) { if (aspect.IsEnabledOn(AspectVersionContextImpl.CheckAlwaysEnabled)) { aspect.Deactivate(context); } } public int DeclaredAspectCount(Db4objects.Db4o.Internal.ClassMetadata classMetadata ) { return classMetadata.DeclaredAspectCount(); } public bool Cancelled() { return false; } private readonly IActivationContext context; } internal void Delete(StatefulBuffer buffer, object obj) { RemoveFromIndex(buffer.Transaction(), buffer.GetID()); CascadeDeletion(buffer, obj); } private void CascadeDeletion(StatefulBuffer buffer, object obj) { ObjectHeader oh = new ObjectHeader(this, buffer); DeleteContextImpl context = new DeleteContextImpl(buffer, oh, ClassReflector(), null ); DeleteMembers(context, ArrayTypeFor(buffer, obj), false); } private ArrayType ArrayTypeFor(StatefulBuffer buffer, object obj) { return buffer.Transaction().Container()._handlers.ArrayType(obj); } /// public virtual void Delete(IDeleteContext context) { CorrectHandlerVersion(context).Delete(context); } internal virtual void DeleteMembers(DeleteContextImpl context, ArrayType arrayType , bool isUpdate) { StatefulBuffer buffer = (StatefulBuffer)context.Buffer(); int preserveCascade = context.CascadeDeleteDepth(); try { if (CascadeOnDelete()) { if (ClassReflector().IsCollection()) { buffer.SetCascadeDeletes(CollectionDeleteDepth(context)); } else { buffer.SetCascadeDeletes(1); } } Handlers4.FieldAwareTypeHandler(CorrectHandlerVersion(context)).DeleteMembers(context , isUpdate); } catch (Exception e) { // This a catch for changed class hierarchies. // It's very ugly to catch all here but it does // help to heal migration from earlier db4o // versions. DiagnosticProcessor dp = Container()._handlers.DiagnosticProcessor(); if (dp.Enabled()) { dp.DeletionFailed(); } } buffer.SetCascadeDeletes(preserveCascade); } private int CollectionDeleteDepth(DeleteContextImpl context) { return 1; } public virtual TernaryBool CascadeOnDeleteTernary() { Config4Class config = Config(); TernaryBool cascadeOnDelete = TernaryBool.Unspecified; if (config != null && (cascadeOnDelete = config.CascadeOnDelete()) != TernaryBool .Unspecified) { return cascadeOnDelete; } if (_ancestor == null) { return cascadeOnDelete; } return _ancestor.CascadeOnDeleteTernary(); } public virtual bool CascadeOnDelete() { return CascadeOnDeleteTernary() == TernaryBool.Yes; } public bool DispatchEvent(Transaction trans, object obj, int message) { return EventDispatcher().Dispatch(trans, obj, message); } public bool HasEventRegistered(Transaction trans, int eventID) { return EventDispatcher().HasEventRegistered(eventID); } private IEventDispatcher EventDispatcher() { if (null != _eventDispatcher) { return _eventDispatcher; } _eventDispatcher = EventDispatchers.ForClass(_container, ClassReflector()); return _eventDispatcher; } public int DeclaredAspectCount() { if (_aspects == null) { return 0; } return _aspects.Length; } public int AspectCount() { int count = DeclaredAspectCount(); if (_ancestor != null) { count += _ancestor.AspectCount(); } return count; } // Scrolls offset in passed reader to the offset the passed field should // be read at. public HandlerVersion SeekToField(Transaction trans, ByteArrayBuffer buffer, FieldMetadata field) { if (buffer == null) { return HandlerVersion.Invalid; } if (!StandardReferenceTypeHandlerIsUsed()) { return HandlerVersion.Invalid; } buffer.Seek(0); ObjectHeader oh = new ObjectHeader(_container, buffer); bool res = oh.ClassMetadata().SeekToField(new ObjectHeaderContext(trans, buffer, oh), field); if (!res) { return HandlerVersion.Invalid; } return new HandlerVersion(oh.HandlerVersion()); } public bool SeekToField(ObjectHeaderContext context, ClassAspect field) { if (!StandardReferenceTypeHandlerIsUsed()) { return false; } return Handlers4.FieldAwareTypeHandler(CorrectHandlerVersion(context)).SeekToField (context, field); } public virtual bool GenerateUUIDs() { if (!GenerateVirtual()) { return false; } TernaryBool configValue = (_config == null) ? TernaryBool.Unspecified : _config.GenerateUUIDs (); return Generate1(_container.Config().GenerateUUIDs(), configValue); } public virtual bool GenerateCommitTimestamps() { return _container.Config().GenerateCommitTimestamps().DefiniteYes(); } private bool GenerateVirtual() { if (_unversioned) { return false; } if (_internal) { return false; } return true; } private bool Generate1(ConfigScope globalConfig, TernaryBool individualConfig) { return globalConfig.ApplyConfig(individualConfig); } public virtual Db4objects.Db4o.Internal.ClassMetadata GetAncestor() { return _ancestor; } public virtual object GetComparableObject(object forObject) { if (_config != null) { if (_config.QueryAttributeProvider() != null) { return _config.QueryAttributeProvider().Attribute(forObject); } } return forObject; } public virtual Db4objects.Db4o.Internal.ClassMetadata GetHigherHierarchy(Db4objects.Db4o.Internal.ClassMetadata a_classMetadata) { Db4objects.Db4o.Internal.ClassMetadata yc = GetHigherHierarchy1(a_classMetadata); if (yc != null) { return yc; } return a_classMetadata.GetHigherHierarchy1(this); } private Db4objects.Db4o.Internal.ClassMetadata GetHigherHierarchy1(Db4objects.Db4o.Internal.ClassMetadata a_classMetadata) { if (a_classMetadata == this) { return this; } if (_ancestor != null) { return _ancestor.GetHigherHierarchy1(a_classMetadata); } return null; } public virtual Db4objects.Db4o.Internal.ClassMetadata GetHigherOrCommonHierarchy( Db4objects.Db4o.Internal.ClassMetadata a_classMetadata) { Db4objects.Db4o.Internal.ClassMetadata yc = GetHigherHierarchy1(a_classMetadata); if (yc != null) { return yc; } if (_ancestor != null) { yc = _ancestor.GetHigherOrCommonHierarchy(a_classMetadata); if (yc != null) { return yc; } } return a_classMetadata.GetHigherHierarchy1(this); } public override byte GetIdentifier() { return Const4.Yapclass; } public virtual long[] GetIDs() { lock (Lock()) { if (!StateOK()) { return new long[0]; } return GetIDs(_container.Transaction); } } public virtual long[] GetIDs(Transaction trans) { lock (Lock()) { if (!StateOK()) { return new long[0]; } if (!HasClassIndex()) { return new long[0]; } return trans.Container().GetIDsForClass(trans, this); } } public virtual bool HasClassIndex() { if (!_classIndexed) { return false; } return StandardReferenceTypeHandlerIsUsed() || !(Handlers4.IsValueType(_typeHandler )); } private bool AncestorHasUUIDField() { if (_ancestor == null) { return false; } return _ancestor.HasUUIDField(); } private bool HasUUIDField() { if (AncestorHasUUIDField()) { return true; } return Arrays4.ContainsInstanceOf(_aspects, typeof(UUIDFieldMetadata)); } private bool AncestorHasVersionField() { if (_ancestor == null) { return false; } return _ancestor.HasVersionField(); } private bool AncestorHasCommitTimestampField() { if (_ancestor == null) { return false; } return _ancestor.HasCommitTimestampField(); } public virtual bool HasVersionField() { if (AncestorHasVersionField()) { return true; } return Arrays4.ContainsInstanceOf(_aspects, typeof(VersionFieldMetadata)); } private bool HasCommitTimestampField() { if (AncestorHasCommitTimestampField()) { return true; } return Arrays4.ContainsInstanceOf(_aspects, typeof(CommitTimestampFieldMetadata)); } public virtual IClassIndexStrategy Index() { return _index; } public virtual int IndexEntryCount(Transaction ta) { if (!StateOK()) { return 0; } return _index.EntryCount(ta); } public virtual IReflectClass ClassReflector() { return _classReflector; } public virtual string GetName() { if (i_name == null) { if (_classReflector != null) { SetName(_classReflector.GetName()); } } return i_name; } public virtual IStoredClass GetParentStoredClass() { return GetAncestor(); } public virtual IStoredField[] GetStoredFields() { lock (Lock()) { if (_aspects == null) { return new IStoredField[0]; } Collection4 storedFields = new Collection4(); TraverseDeclaredFields(new _IProcedure4_1037(storedFields)); IStoredField[] fields = new IStoredField[storedFields.Size()]; storedFields.ToArray(fields); return fields; } } private sealed class _IProcedure4_1037 : IProcedure4 { public _IProcedure4_1037(Collection4 storedFields) { this.storedFields = storedFields; } public void Apply(object field) { storedFields.Add(field); } private readonly Collection4 storedFields; } public ObjectContainerBase Container() { return _container; } public virtual FieldMetadata FieldMetadataForName(string name) { ByRef byReference = new ByRef(); TraverseAllAspects(new _TraverseFieldCommand_1054(name, byReference)); return (FieldMetadata)byReference.value; } private sealed class _TraverseFieldCommand_1054 : TraverseFieldCommand { public _TraverseFieldCommand_1054(string name, ByRef byReference) { this.name = name; this.byReference = byReference; } protected override void Process(FieldMetadata field) { if (name.Equals(field.GetName())) { byReference.value = field; } } private readonly string name; private readonly ByRef byReference; } /// public virtual bool HasField(ObjectContainerBase container, string fieldName) { if (ClassReflector().IsCollection()) { return true; } return FieldMetadataForName(fieldName) != null; } internal virtual bool HasVirtualAttributes() { if (_internal) { return false; } return HasVersionField() || HasUUIDField(); } public virtual bool HoldsAnyClass() { return ClassReflector().IsCollection(); } internal virtual void IncrementFieldsOffset1(ByteArrayBuffer a_bytes) { int length = ReadAspectCount(a_bytes); for (int i = 0; i < length; i++) { _aspects[i].IncrementOffset(a_bytes); } } internal bool Init(Db4objects.Db4o.Internal.ClassMetadata ancestor) { if (DTrace.enabled) { DTrace.ClassmetadataInit.Log(GetID()); } SetConfig(ConfigImpl().ConfigClass(GetName())); SetAncestor(ancestor); CheckType(); if (AllowsQueries()) { _index.Initialize(_container); } BitTrue(Const4.CheckedChanges); return true; } internal void InitConfigOnUp(Transaction systemTrans) { Config4Class extendedConfig = Platform4.ExtendConfiguration(_classReflector, _container .Configure(), _config); if (extendedConfig != null) { _config = extendedConfig; } if (_config == null) { return; } if (!StateOK()) { return; } InitializeFieldsConfiguration(systemTrans, extendedConfig); CheckAllConfiguredFieldsExist(extendedConfig); } private void InitializeFieldsConfiguration(Transaction systemTrans, Config4Class extendedConfig) { if (_aspects == null) { return; } for (int i = 0; i < _aspects.Length; i++) { if (_aspects[i] is FieldMetadata) { FieldMetadata field = (FieldMetadata)_aspects[i]; string fieldName = field.GetName(); if (!field.HasConfig() && extendedConfig != null && extendedConfig.ConfigField(fieldName ) != null) { field.InitConfiguration(fieldName); } field.InitConfigOnUp(systemTrans); } } } private void CheckAllConfiguredFieldsExist(Config4Class config) { Hashtable4 exceptionalFields = config.ExceptionalFieldsOrNull(); if (exceptionalFields == null) { return; } IEnumerator i = exceptionalFields.ValuesIterator(); while (i.MoveNext()) { Config4Field fieldConfig = (Config4Field)i.Current; if (!fieldConfig.Used()) { ConfigImpl().DiagnosticProcessor().ObjectFieldDoesNotExist(GetName(), fieldConfig .GetName()); } } } internal virtual void InitOnUp(Transaction systemTrans) { if (!StateOK()) { return; } InitConfigOnUp(systemTrans); StoreStaticFieldValues(systemTrans, false); } public virtual object Instantiate(UnmarshallingContext context) { // overridden in PrimitiveTypeMetadata // never called for primitive YapAny // FIXME: [TA] no longer necessary? // context.adjustInstantiationDepth(); object obj = context.PersistentObject(); bool instantiating = (obj == null); if (instantiating) { obj = InstantiateObject(context); if (obj == null) { return null; } ShareTransaction(obj, context.Transaction()); ShareObjectReference(obj, context.ObjectReference()); OnInstantiate(context, obj); if (context.ActivationDepth().Mode().IsPrefetch()) { context.ObjectReference().SetStateDeactivated(); return obj; } if (!context.ActivationDepth().RequiresActivation()) { context.ObjectReference().SetStateDeactivated(); return obj; } return Activate(context); } if (ActivatingActiveObject(context.ActivationDepth().Mode(), context.ObjectReference ())) { IActivationDepth child = context.ActivationDepth().Descend(this); if (child.RequiresActivation()) { CascadeActivation(new ActivationContext4(context.Transaction(), obj, child)); } return obj; } return Activate(context); } protected void OnInstantiate(UnmarshallingContext context, object obj) { context.SetObjectWeak(obj); context.Transaction().ReferenceSystem().AddExistingReference(context.ObjectReference ()); ObjectOnInstantiate(context.Transaction(), context.ObjectReference()); } public virtual object InstantiateTransient(UnmarshallingContext context) { // overridden in YapClassPrimitive // never called for primitive YapAny object obj = InstantiateObject(context); if (obj == null) { return null; } context.Container().Peeked(context.ObjectId(), obj); if (context.ActivationDepth().RequiresActivation()) { InstantiateFields(context); } return obj; } private bool ActivatingActiveObject(ActivationMode mode, ObjectReference @ref) { return !mode.IsRefresh() && @ref.IsActive(); } private object Activate(UnmarshallingContext context) { object obj = context.PersistentObject(); ObjectReference objectReference = context.ObjectReference(); if (!ObjectCanActivate(context.Transaction(), obj)) { objectReference.SetStateDeactivated(); return obj; } objectReference.SetStateClean(); if (context.ActivationDepth().RequiresActivation()) { InstantiateFields(context); } ObjectOnActivate(context.Transaction(), objectReference); return obj; } public virtual bool HasObjectConstructor() { return _translator != null && _translator.IsObjectConstructor(); } public virtual bool IsTranslated() { return _translator != null; } private object InstantiateObject(UnmarshallingContext context) { object obj = _constructor.Apply(context); context.PersistentObject(obj); return obj; } private void ObjectOnInstantiate(Transaction transaction, IObjectInfo reference) { transaction.Container().Callbacks().ObjectOnInstantiate(transaction, reference); } private object InstantiateFromReflector(ObjectContainerBase stream) { if (_classReflector == null) { throw new InvalidOperationException(); } try { return _classReflector.NewInstance(); } catch (MissingMethodException) { Container().LogMsg(7, ClassReflector().GetName()); return null; } catch (Exception) { // TODO: be more helpful here return null; } } private void ShareObjectReference(object obj, ObjectReference @ref) { if (obj is IDb4oTypeImpl) { ((IDb4oTypeImpl)obj).SetObjectReference(@ref); } } private void ShareTransaction(object obj, Transaction transaction) { if (obj is ITransactionAware) { ((ITransactionAware)obj).SetTrans(transaction); } } private void ObjectOnActivate(Transaction transaction, IObjectInfo obj) { ObjectContainerBase container = transaction.Container(); container.Callbacks().ObjectOnActivate(transaction, obj); DispatchEvent(transaction, obj.GetObject(), EventDispatchers.Activate); } private bool ObjectCanActivate(Transaction transaction, object obj) { ObjectContainerBase container = transaction.Container(); return container.Callbacks().ObjectCanActivate(transaction, obj) && DispatchEvent (transaction, obj, EventDispatchers.CanActivate); } internal virtual void InstantiateFields(UnmarshallingContext context) { ITypeHandler4 handler = CorrectHandlerVersion((IHandlerVersionContext)context); Handlers4.Activate(context, handler); } public virtual bool IsArray() { return ClassReflector().IsCollection(); } internal virtual bool IsCollection(object obj) { return Reflector().ForObject(obj).IsCollection(); } public override bool IsDirty() { if (!StateOK()) { return false; } return base.IsDirty(); } internal virtual bool IsEnum() { return Platform4.IsJavaEnum(Reflector(), ClassReflector()); } public virtual bool HasIdentity() { return true; } /// no any, primitive, array or other tricks. /// /// no any, primitive, array or other tricks. overridden in YapClassAny and /// YapClassPrimitive /// public virtual bool IsStronglyTyped() { return true; } public virtual bool IsValueType() { return Handlers4.HoldsValueType(_typeHandler); } private object Lock() { return _container.Lock(); } public virtual string NameToWrite() { if (_config != null && _config.WriteAs() != null) { return _config.WriteAs(); } if (i_name == null) { return string.Empty; } return ConfigImpl().ResolveAliasRuntimeName(i_name); } public bool CallConstructor() { TernaryBool specialized = CallConstructorSpecialized(); // FIXME: If specified, return yes?!? if (!specialized.IsUnspecified()) { return specialized.DefiniteYes(); } return ConfigImpl().CallConstructors().DefiniteYes(); } private Config4Impl ConfigImpl() { return _container.ConfigImpl; } private TernaryBool CallConstructorSpecialized() { if (_config != null) { TernaryBool res = _config.CallConstructor(); if (!res.IsUnspecified()) { return res; } } if (IsEnum()) { return TernaryBool.No; } if (_ancestor != null) { return _ancestor.CallConstructorSpecialized(); } return TernaryBool.Unspecified; } public override int OwnLength() { return MarshallerFamily.Current()._class.MarshalledLength(_container, this); } internal virtual void Purge() { _index.Purge(); } // TODO: may want to add manual purge to Btree // indexes here public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { ITypeHandler4 typeHandler = CorrectHandlerVersion(context); if (typeHandler is ICascadingTypeHandler) { return ((ICascadingTypeHandler)typeHandler).ReadCandidateHandler(context); } return null; } public virtual ITypeHandler4 SeekCandidateHandler(QueryingReadContext context) { if (IsArray()) { if (Platform4.IsCollectionTranslator(this._config)) { context.Seek(context.Offset() + Const4.IntLength); return new ArrayHandler(null, false); } IncrementFieldsOffset1((ByteArrayBuffer)context.Buffer()); if (_ancestor != null) { return _ancestor.SeekCandidateHandler(context); } } return null; } public int ReadAspectCount(IReadBuffer buffer) { int count = buffer.ReadInt(); if (count > _aspects.Length) { return _aspects.Length; } return count; } internal virtual byte[] ReadName(Transaction a_trans) { i_reader = a_trans.Container().ReadBufferById(a_trans, GetID()); return ReadName1(a_trans, i_reader); } public byte[] ReadName1(Transaction trans, ByteArrayBuffer reader) { if (reader == null) { return null; } i_reader = reader; bool ok = false; try { ClassMarshaller marshaller = MarshallerFamily.Current()._class; i_nameBytes = marshaller.ReadName(trans, reader); marshaller.ReadMetaClassID(reader); // never used ??? SetStateUnread(); BitFalse(Const4.CheckedChanges); BitFalse(Const4.StaticFieldsStored); ok = true; return i_nameBytes; } finally { if (!ok) { SetStateDead(); } } } public virtual void ReadVirtualAttributes(Transaction trans, ObjectReference @ref , bool lastCommitted) { int id = @ref.GetID(); ObjectContainerBase container = trans.Container(); ByteArrayBuffer buffer = container.ReadBufferById(trans, id, lastCommitted); ObjectHeader oh = new ObjectHeader(this, buffer); ObjectReferenceContext context = new ObjectReferenceContext(trans, buffer, oh, @ref ); Handlers4.FieldAwareTypeHandler(CorrectHandlerVersion(context)).ReadVirtualAttributes (context); } public virtual GenericReflector Reflector() { return _container.Reflector(); } public virtual void Rename(string newName) { if (_container.IsClient) { Exceptions4.ThrowRuntimeException(58); } int tempState = _state; SetStateOK(); SetName(newName); i_nameBytes = AsBytes(i_name); SetStateDirty(); Write(_container.SystemTransaction()); IReflectClass oldReflector = _classReflector; ClassReflector(Container().Reflector().ForName(newName)); Container().ClassCollection().RefreshClassCache(this, oldReflector); Refresh(); _state = tempState; } //TODO: duplicates ClassMetadataRepository#asBytes private byte[] AsBytes(string str) { return Container().StringIO().Write(str); } internal void CreateConfigAndConstructor(Hashtable4 a_byteHashTable, IReflectClass claxx) { SetName(ResolveName(claxx)); SetConfig(ConfigImpl().ConfigClass(GetName())); if (claxx == null) { ResolveClassReflector(GetName()); } else { ClassReflector(claxx); } // createConstructor(true); if (i_nameBytes != null) { a_byteHashTable.Remove(i_nameBytes); i_nameBytes = null; } } internal virtual string ResolveName(IReflectClass claxx) { if (claxx != null) { return claxx.GetName(); } if (i_nameBytes != null) { string name = _container.StringIO().Read(i_nameBytes); return ConfigImpl().ResolveAliasStoredName(name); } throw new InvalidOperationException(); } internal virtual bool ReadThis() { bool stateUnread = StateUnread(); if (stateUnread) { SetStateOK(); SetStateClean(); } if (stateUnread || StateDead()) { ForceRead(); return true; } return false; } internal void ForceRead() { if (i_reader == null || BitIsTrue(Const4.Reading)) { return; } BitTrue(Const4.Reading); try { MarshallerFamily.ForConverterVersion(_container.ConverterVersion())._class.Read(_container , this, i_reader); i_nameBytes = null; i_reader = null; } finally { BitFalse(Const4.Reading); } } public override void ReadThis(Transaction a_trans, ByteArrayBuffer a_reader) { throw Exceptions4.VirtualException(); } public virtual void Refresh() { if (!StateUnread()) { ResolveClassReflector(i_name); BitFalse(Const4.CheckedChanges); CheckChanges(); TraverseDeclaredFields(new _IProcedure4_1582()); } } private sealed class _IProcedure4_1582 : IProcedure4 { public _IProcedure4_1582() { } public void Apply(object arg) { ((FieldMetadata)arg).Refresh(); } } internal virtual void RemoveFromIndex(Transaction ta, int id) { if (HasClassIndex()) { _index.Remove(ta, id); } if (_ancestor != null) { _ancestor.RemoveFromIndex(ta, id); } } internal virtual bool RenameField(string oldName, string newName) { BooleanByRef renamed = new BooleanByRef(false); for (int i = 0; i < _aspects.Length; i++) { if (_aspects[i].GetName().Equals(newName)) { _container.LogMsg(9, "class:" + GetName() + " field:" + newName); return false; } } TraverseDeclaredFields(new _IProcedure4_1607(oldName, newName, renamed)); return renamed.value; } private sealed class _IProcedure4_1607 : IProcedure4 { public _IProcedure4_1607(string oldName, string newName, BooleanByRef renamed) { this.oldName = oldName; this.newName = newName; this.renamed = renamed; } public void Apply(object arg) { FieldMetadata field = (FieldMetadata)arg; if (field.GetName().Equals(oldName)) { field.SetName(newName); renamed.value = true; } } private readonly string oldName; private readonly string newName; private readonly BooleanByRef renamed; } internal virtual void SetConfig(Config4Class config) { if (config == null) { return; } // The configuration can be set by a ObjectClass#readAs setting // from YapClassCollection, right after reading the meta information // for the first time. In that case we never change the setting if (_config == null) { _config = config; } } internal virtual void SetName(string a_name) { i_name = a_name; } internal void SetStateDead() { BitTrue(Const4.Dead); BitFalse(Const4.Continue); } private void SetStateUnread() { BitFalse(Const4.Dead); BitTrue(Const4.Continue); } internal void SetStateOK() { BitFalse(Const4.Dead); BitFalse(Const4.Continue); } internal virtual bool StateDead() { return BitIsTrue(Const4.Dead); } internal bool StateOK() { return BitIsFalse(Const4.Continue) && BitIsFalse(Const4.Dead) && BitIsFalse(Const4 .Reading); } internal virtual bool StateUnread() { return BitIsTrue(Const4.Continue) && BitIsFalse(Const4.Dead) && BitIsFalse(Const4 .Reading); } internal virtual bool StoreField(IReflectField field) { if (field.IsStatic()) { return false; } if (IsTransient(field)) { if (!ShouldStoreTransientFields()) { return false; } } return Platform4.CanSetAccessible() || field.IsPublic(); } internal virtual bool ShouldStoreTransientFields() { Config4Class config = ConfigOrAncestorConfig(); if (config == null) { return false; } return config.StoreTransientFields(); } private bool IsTransient(IReflectField field) { return field.IsTransient() || Platform4.IsTransient(field.GetFieldType()); } public virtual IStoredField StoredField(string fieldName, object fieldType) { lock (Lock()) { Db4objects.Db4o.Internal.ClassMetadata fieldTypeFilter = fieldType == null ? null : _container.ClassMetadataForReflectClass(ReflectorUtils.ReflectClassFor(Reflector (), fieldType)); ByRef foundField = new ByRef(); TraverseAllAspects(new _TraverseFieldCommand_1701(foundField, fieldName, fieldTypeFilter )); // TODO: implement field creation return (IStoredField)foundField.value; } } private sealed class _TraverseFieldCommand_1701 : TraverseFieldCommand { public _TraverseFieldCommand_1701(ByRef foundField, string fieldName, Db4objects.Db4o.Internal.ClassMetadata fieldTypeFilter) { this.foundField = foundField; this.fieldName = fieldName; this.fieldTypeFilter = fieldTypeFilter; } protected override void Process(FieldMetadata field) { if (foundField.value != null) { return; } if (field.GetName().Equals(fieldName)) { if (fieldTypeFilter == null || fieldTypeFilter == field.FieldType()) { foundField.value = field; } } } private readonly ByRef foundField; private readonly string fieldName; private readonly Db4objects.Db4o.Internal.ClassMetadata fieldTypeFilter; } internal virtual void StoreStaticFieldValues(Transaction trans, bool force) { if (BitIsTrue(Const4.StaticFieldsStored) && !force) { return; } BitTrue(Const4.StaticFieldsStored); if (!ShouldStoreStaticFields(trans)) { return; } ObjectContainerBase stream = trans.Container(); stream.ShowInternalClasses(true); try { StaticClass sc = QueryStaticClass(trans); if (sc == null) { CreateStaticClass(trans); } else { UpdateStaticClass(trans, sc); } } finally { stream.ShowInternalClasses(false); } } private bool ShouldStoreStaticFields(Transaction trans) { return !IsReadOnlyContainer() && (StaticFieldValuesArePersisted() || Platform4.StoreStaticFieldValues (trans.Reflector(), ClassReflector())); } private bool IsReadOnlyContainer() { return Container().Config().IsReadOnly(); } private void UpdateStaticClass(Transaction trans, StaticClass sc) { ObjectContainerBase stream = trans.Container(); stream.Activate(trans, sc, new FixedActivationDepth(4)); StaticField[] existingFields = sc.fields; IEnumerator staticFields = Iterators.Map(StaticReflectFields(), new _IFunction4_1761 (this, existingFields, trans)); sc.fields = ToStaticFieldArray(staticFields); if (!stream.IsClient) { SetStaticClass(trans, sc); } } private sealed class _IFunction4_1761 : IFunction4 { public _IFunction4_1761(ClassMetadata _enclosing, StaticField[] existingFields, Transaction trans) { this._enclosing = _enclosing; this.existingFields = existingFields; this.trans = trans; } public object Apply(object arg) { IReflectField reflectField = (IReflectField)arg; StaticField existingField = this._enclosing.FieldByName(existingFields, reflectField .GetName()); if (existingField != null) { this._enclosing.UpdateExistingStaticField(trans, existingField, reflectField); return existingField; } return this._enclosing.ToStaticField(reflectField); } private readonly ClassMetadata _enclosing; private readonly StaticField[] existingFields; private readonly Transaction trans; } private void CreateStaticClass(Transaction trans) { if (trans.Container().IsClient) { return; } StaticClass sc = new StaticClass(GetName(), ToStaticFieldArray(StaticReflectFieldsToStaticFields ())); SetStaticClass(trans, sc); } private IEnumerator StaticReflectFieldsToStaticFields() { return Iterators.Map(StaticReflectFields(), new _IFunction4_1789(this)); } private sealed class _IFunction4_1789 : IFunction4 { public _IFunction4_1789(ClassMetadata _enclosing) { this._enclosing = _enclosing; } public object Apply(object arg) { return this._enclosing.ToStaticField((IReflectField)arg); } private readonly ClassMetadata _enclosing; } protected virtual StaticField ToStaticField(IReflectField reflectField) { return new StaticField(reflectField.GetName(), StaticReflectFieldValue(reflectField )); } private object StaticReflectFieldValue(IReflectField reflectField) { return _fieldAccessor.Get(reflectField, null); } private void SetStaticClass(Transaction trans, StaticClass sc) { // TODO: we should probably use a specific update depth here, 4? trans.Container().StoreInternal(trans, sc, true); } private StaticField[] ToStaticFieldArray(IEnumerator iterator4) { return ToStaticFieldArray(new Collection4(iterator4)); } private StaticField[] ToStaticFieldArray(Collection4 fields) { return (StaticField[])fields.ToArray(new StaticField[fields.Size()]); } private IEnumerator StaticReflectFields() { return Iterators.Filter(ReflectFields(), new _IPredicate4_1818()); } private sealed class _IPredicate4_1818 : IPredicate4 { public _IPredicate4_1818() { } public bool Match(object candidate) { return ((IReflectField)candidate).IsStatic() && !((IReflectField)candidate).IsTransient (); } } private IReflectField[] ReflectFields() { return ClassReflector().GetDeclaredFields(); } protected virtual void UpdateExistingStaticField(Transaction trans, StaticField existingField , IReflectField reflectField) { ObjectContainerBase stream = trans.Container(); object newValue = StaticReflectFieldValue(reflectField); if (existingField.value != null && newValue != null && existingField.value.GetType () == newValue.GetType()) { int id = stream.GetID(trans, existingField.value); if (id > 0) { if (existingField.value != newValue) { // This is the clue: // Bind the current static member to it's old database identity, // so constants and enums will work with '==' stream.Bind(trans, newValue, id); // This may produce unwanted side effects if the static field object // was modified in the current session. TODO:Add documentation case. stream.Refresh(trans, newValue, int.MaxValue); existingField.value = newValue; } return; } } if (newValue == null) { try { _fieldAccessor.Set(reflectField, null, existingField.value); } catch (Exception) { } // fail silently // TODO: why? return; } existingField.value = newValue; } private bool StaticFieldValuesArePersisted() { return (_config != null && _config.StaticFieldValuesArePersisted()); } protected virtual StaticField FieldByName(StaticField[] fields, string fieldName) { for (int i = 0; i < fields.Length; i++) { StaticField field = fields[i]; if (fieldName.Equals(field.name)) { return field; } } return null; } private StaticClass QueryStaticClass(Transaction trans) { IQuery q = trans.Container().Query(trans); q.Constrain(Const4.ClassStaticclass); q.Descend("name").Constrain(GetName()); IObjectSet os = q.Execute(); return os.Count > 0 ? (StaticClass)os.Next() : null; } public override string ToString() { if (i_name != null) { return i_name; } if (i_nameBytes == null) { return "*CLASS NAME UNKNOWN*"; } LatinStringIO stringIO = _container == null ? Const4.stringIO : _container.StringIO (); return stringIO.Read(i_nameBytes); } public override bool WriteObjectBegin() { if (!StateOK()) { return false; } return base.WriteObjectBegin(); } public sealed override void WriteThis(Transaction trans, ByteArrayBuffer writer) { MarshallerFamily.Current()._class.Write(trans, this, writer); } public virtual IPreparedComparison PrepareComparison(IContext context, object source ) { return Handlers4.PrepareComparisonFor(_typeHandler, context, source); } public static void DefragObject(DefragmentContextImpl context) { ObjectHeader header = ObjectHeader.Defrag(context); DefragmentContextImpl childContext = new DefragmentContextImpl(context, header); header.ClassMetadata().Defragment(childContext); } public virtual void Defragment(IDefragmentContext context) { CorrectHandlerVersion(context).Defragment(context); } public virtual void DefragClass(DefragmentContextImpl context, int classIndexID) { MarshallerFamily mf = MarshallerFamily.ForConverterVersion(Container().ConverterVersion ()); mf._class.Defrag(this, _container.StringIO(), context, classIndexID); } public static Db4objects.Db4o.Internal.ClassMetadata ReadClass(ObjectContainerBase stream, ByteArrayBuffer reader) { ObjectHeader oh = new ObjectHeader(stream, reader); return oh.ClassMetadata(); } public virtual bool IsAssignableFrom(Db4objects.Db4o.Internal.ClassMetadata other ) { return ClassReflector().IsAssignableFrom(other.ClassReflector()); } public virtual void SetAncestor(Db4objects.Db4o.Internal.ClassMetadata ancestor) { if (ancestor == this) { throw new InvalidOperationException(); } _ancestor = ancestor; } public virtual object WrapWithTransactionContext(Transaction transaction, object value) { if (value is int) { return value; } return new TransactionContext(transaction, value); } public virtual ITypeHandler4 TypeHandler() { return _typeHandler; } public virtual ITypeHandler4 DelegateTypeHandler(IContext context) { if (context is IHandlerVersionContext) { return CorrectHandlerVersion((IHandlerVersionContext)context); } return _typeHandler; } protected virtual ITypeHandler4 CorrectHandlerVersion(IHandlerVersionContext context ) { ITypeHandler4 typeHandler = HandlerRegistry.CorrectHandlerVersion(context, _typeHandler ); if (typeHandler != _typeHandler) { if (typeHandler is StandardReferenceTypeHandler) { ((StandardReferenceTypeHandler)typeHandler).ClassMetadata(this); } } return typeHandler; } public virtual void TraverseDeclaredFields(IProcedure4 procedure) { if (_aspects == null) { return; } for (int i = 0; i < _aspects.Length; i++) { if (_aspects[i] is FieldMetadata) { procedure.Apply(_aspects[i]); } } } public virtual void TraverseDeclaredAspects(IProcedure4 procedure) { if (_aspects == null) { return; } for (int i = 0; i < _aspects.Length; i++) { procedure.Apply(_aspects[i]); } } public virtual bool AspectsAreNull() { return _aspects == null; } private sealed class AlwaysModified : IModificationAware { internal static readonly ClassMetadata.AlwaysModified Instance = new ClassMetadata.AlwaysModified (); public bool IsModified(object obj) { return true; } } public virtual bool IsModified(object obj) { return _modificationChecker.IsModified(obj); } public virtual int InstanceCount() { return InstanceCount(_container.Transaction); } public virtual int InstanceCount(Transaction trans) { return _container.InstanceCount(this, trans); } public virtual bool IsStorable() { return !StateDead() && !IsTransient(); } private object InstantiateWithCustomTypeHandlerIfEnabled(UnmarshallingContext context ) { if (!_customTypeHandlerAspect.IsEnabledOn(context)) { return InstantiateForVersionWithoutCustomTypeHandler(context); } return InstantiateWithCustomTypeHandler(context); } private object InstantiateForVersionWithoutCustomTypeHandler(UnmarshallingContext context) { IFunction4 oldVersionConstructor = CreateConstructor(null); if (null == oldVersionConstructor) { throw new InvalidOperationException(); } return oldVersionConstructor.Apply(context); } private object InstantiateWithCustomTypeHandler(UnmarshallingContext context) { ContextState contextState = context.SaveState(); try { bool fieldHasValue = SeekToField(context, _customTypeHandlerAspect); if (!fieldHasValue) { context.RestoreState(contextState); return InstantiateForVersionWithoutCustomTypeHandler(context); } IInstantiatingTypeHandler customTypeHandler = (IInstantiatingTypeHandler)_customTypeHandlerAspect ._typeHandler; return context.SlotFormat().DoWithSlotIndirection(context, new _IClosure4_2056(customTypeHandler , context)); } finally { context.RestoreState(contextState); } } private sealed class _IClosure4_2056 : IClosure4 { public _IClosure4_2056(IInstantiatingTypeHandler customTypeHandler, UnmarshallingContext context) { this.customTypeHandler = customTypeHandler; this.context = context; } public object Run() { return customTypeHandler.Instantiate(context); } private readonly IInstantiatingTypeHandler customTypeHandler; private readonly UnmarshallingContext context; } public virtual bool IsStruct() { return Platform4.IsStruct(ClassReflector()); } public virtual void DropClassIndex() { if (Container().IsClient) { throw new InvalidOperationException(); } _index = CreateIndexStrategy(); _index.Initialize(Container()); Container().SetDirtyInSystemTransaction(this); } public virtual void TraverseAllAspects(ITraverseAspectCommand command) { AspectTraversalStrategy().TraverseAllAspects(command); } private IAspectTraversalStrategy AspectTraversalStrategy() { if (_aspectTraversalStrategy == null) { _aspectTraversalStrategy = DetectAspectTraversalStrategy(); } return _aspectTraversalStrategy; } protected virtual IAspectTraversalStrategy DetectAspectTraversalStrategy() { IList ancestors = CompareAncestorHierarchy(); for (IEnumerator diffIter = ancestors.GetEnumerator(); diffIter.MoveNext(); ) { HierarchyAnalyzer.Diff diff = ((HierarchyAnalyzer.Diff)diffIter.Current); if (diff.IsRemoved()) { return CreateRemovedAspectTraversalStrategy(ancestors); } } return new StandardAspectTraversalStrategy(this); } private IAspectTraversalStrategy CreateRemovedAspectTraversalStrategy(IList ancestors ) { return new ModifiedAspectTraversalStrategy(this, ancestors); } private IList CompareAncestorHierarchy() { return new HierarchyAnalyzer(this, ClassReflector()).Analyze(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Classindex/0000755000175000017500000000000011700531646026700 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Classindex/IClassIndexStrategy.cs0000644000175000017500000000230611700531646033121 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Classindex { /// public interface IClassIndexStrategy { void Initialize(ObjectContainerBase stream); void Read(ObjectContainerBase stream, int indexID); int Write(Transaction transaction); void Add(Transaction transaction, int id); void Remove(Transaction transaction, int id); int EntryCount(Transaction transaction); int OwnLength(); void Purge(); /// Traverses all index entries (java.lang.Integer references). /// Traverses all index entries (java.lang.Integer references). void TraverseAll(Transaction transaction, IVisitor4 command); void DontDelete(Transaction transaction, int id); IEnumerator AllSlotIDs(Transaction trans); // FIXME: Why is this never called? void DefragReference(ClassMetadata classMetadata, DefragmentContextImpl context, int classIndexID); int Id(); // FIXME: Why is this never called? void DefragIndex(DefragmentContextImpl context); } } AbstractClassIndexStrategy.cs0000644000175000017500000000362411700531646034421 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Classindex/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Classindex; namespace Db4objects.Db4o.Internal.Classindex { /// public abstract class AbstractClassIndexStrategy : IClassIndexStrategy { protected readonly ClassMetadata _classMetadata; public AbstractClassIndexStrategy(ClassMetadata classMetadata) { _classMetadata = classMetadata; } protected virtual int ClassMetadataID() { return _classMetadata.GetID(); } public virtual int OwnLength() { return Const4.IdLength; } protected abstract void InternalAdd(Transaction trans, int id); public void Add(Transaction trans, int id) { if (DTrace.enabled) { DTrace.AddToClassIndex.Log(id); } CheckId(id); InternalAdd(trans, id); } protected abstract void InternalRemove(Transaction ta, int id); public void Remove(Transaction ta, int id) { if (DTrace.enabled) { DTrace.RemoveFromClassIndex.Log(id); } CheckId(id); InternalRemove(ta, id); } private void CheckId(int id) { } public abstract IEnumerator AllSlotIDs(Transaction arg1); public abstract void DefragIndex(DefragmentContextImpl arg1); public abstract void DefragReference(ClassMetadata arg1, DefragmentContextImpl arg2 , int arg3); public abstract void DontDelete(Transaction arg1, int arg2); public abstract int EntryCount(Transaction arg1); public abstract int Id(); public abstract void Initialize(ObjectContainerBase arg1); public abstract void Purge(); public abstract void Read(ObjectContainerBase arg1, int arg2); public abstract void TraverseAll(Transaction arg1, IVisitor4 arg2); public abstract int Write(Transaction arg1); } } BTreeClassIndexStrategy.cs0000644000175000017500000000732011700531646033654 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Classindex/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal.Classindex { /// public class BTreeClassIndexStrategy : AbstractClassIndexStrategy { private BTree _btreeIndex; public BTreeClassIndexStrategy(ClassMetadata classMetadata) : base(classMetadata) { } public virtual BTree Btree() { return _btreeIndex; } public override int EntryCount(Transaction ta) { return _btreeIndex != null ? _btreeIndex.Size(ta) : 0; } public override void Initialize(ObjectContainerBase stream) { CreateBTreeIndex(stream, 0); } public override void Purge() { } public override void Read(ObjectContainerBase stream, int indexID) { ReadBTreeIndex(stream, indexID); } public override int Write(Transaction trans) { if (_btreeIndex == null) { return 0; } _btreeIndex.Write(trans); return _btreeIndex.GetID(); } public override void TraverseAll(Transaction ta, IVisitor4 command) { if (_btreeIndex != null) { _btreeIndex.TraverseKeys(ta, command); } } private void CreateBTreeIndex(ObjectContainerBase stream, int btreeID) { if (stream.IsClient) { return; } _btreeIndex = ((LocalObjectContainer)stream).CreateBTreeClassIndex(btreeID); _btreeIndex.SetRemoveListener(new _IVisitor4_61(this)); } private sealed class _IVisitor4_61 : IVisitor4 { public _IVisitor4_61(BTreeClassIndexStrategy _enclosing) { this._enclosing = _enclosing; } public void Visit(object obj) { this._enclosing.RemoveId((TransactionContext)obj); } private readonly BTreeClassIndexStrategy _enclosing; } private void RemoveId(TransactionContext context) { IReferenceSystem referenceSystem = context._transaction.ReferenceSystem(); ObjectReference reference = referenceSystem.ReferenceForId(((int)context._object) ); if (reference != null) { referenceSystem.RemoveReference(reference); } } private void ReadBTreeIndex(ObjectContainerBase stream, int indexId) { if (!stream.IsClient && _btreeIndex == null) { CreateBTreeIndex(stream, indexId); } } protected override void InternalAdd(Transaction trans, int id) { _btreeIndex.Add(trans, id); } protected override void InternalRemove(Transaction ta, int id) { _btreeIndex.Remove(ta, id); } public override void DontDelete(Transaction transaction, int id) { } public override void DefragReference(ClassMetadata classMetadata, DefragmentContextImpl context, int classIndexID) { int newID = -classIndexID; context.WriteInt(newID); } public override int Id() { return _btreeIndex.GetID(); } public override IEnumerator AllSlotIDs(Transaction trans) { return _btreeIndex.AllNodeIds(trans); } public override void DefragIndex(DefragmentContextImpl context) { _btreeIndex.DefragIndex(context); } public static BTree Btree(ClassMetadata clazz) { IClassIndexStrategy index = clazz.Index(); if (!(index is Db4objects.Db4o.Internal.Classindex.BTreeClassIndexStrategy)) { throw new InvalidOperationException(); } return ((Db4objects.Db4o.Internal.Classindex.BTreeClassIndexStrategy)index).Btree (); } public static IEnumerator Iterate(ClassMetadata clazz, Transaction trans) { return Btree(clazz).AsRange(trans).Keys(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers4.cs0000644000175000017500000002515611700531646026767 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class Handlers4 { public const int IntId = 1; public const int LongId = 2; public const int FloatId = 3; public const int BooleanId = 4; public const int DoubleId = 5; public const int ByteId = 6; public const int CharId = 7; public const int ShortId = 8; public const int StringId = 9; public const int DateId = 10; public const int UntypedId = 11; public const int AnyArrayId = 12; public const int AnyArrayNId = 13; public static bool IsQueryLeaf(ITypeHandler4 handler) { ITypeHandler4 baseTypeHandler = BaseTypeHandler(handler); if (!(baseTypeHandler is IQueryableTypeHandler)) { return false; } if (baseTypeHandler is ArrayHandler) { return false; } return baseTypeHandler is IValueTypeHandler; } public static bool HandlesArray(ITypeHandler4 handler) { return handler is ArrayHandler; } public static bool HandlesMultidimensionalArray(ITypeHandler4 handler) { return handler is MultidimensionalArrayHandler; } public static bool HandlesClass(ITypeHandler4 handler) { return BaseTypeHandler(handler) is ICascadingTypeHandler; } public static IReflectClass PrimitiveClassReflector(ITypeHandler4 handler, IReflector reflector) { ITypeHandler4 baseTypeHandler = BaseTypeHandler(handler); if (baseTypeHandler is PrimitiveHandler) { return ((PrimitiveHandler)baseTypeHandler).PrimitiveClassReflector(); } return null; } public static ITypeHandler4 BaseTypeHandler(ITypeHandler4 handler) { if (handler is ArrayHandler) { return ((ArrayHandler)handler).DelegateTypeHandler(); } if (handler is PrimitiveTypeMetadata) { return ((PrimitiveTypeMetadata)handler).TypeHandler(); } return handler; } public static IReflectClass BaseType(IReflectClass clazz) { if (clazz == null) { return null; } if (clazz.IsArray()) { return BaseType(clazz.GetComponentType()); } return clazz; } public static bool IsClassAware(ITypeHandler4 typeHandler) { return typeHandler is IBuiltinTypeHandler || typeHandler is StandardReferenceTypeHandler; } public static int CalculateLinkLength(ITypeHandler4 handler) { if (handler == null) { throw new ArgumentNullException(); } if (handler is ILinkLengthAware) { return ((ILinkLengthAware)handler).LinkLength(); } if (handler is IReferenceTypeHandler) { return Const4.IdLength; } if (handler is IVariableLengthTypeHandler) { return Const4.IndirectionLength; } // TODO: For custom handlers there will have to be a way // to calculate the length in the slot. // Options: // (1) Remember when the first object is marshalled. // (2) Add a #defaultValue() method to TypeHandler4, // marshall the default value and check. // (3) Add a way to test the custom handler when it // is installed and remember the length there. throw new NotImplementedException("Unexpected typehandler: " + handler); } public static bool HoldsValueType(ITypeHandler4 handler) { return IsValueType(BaseTypeHandler(handler)); } public static bool IsValueType(ITypeHandler4 handler) { return !(handler is IReferenceTypeHandler); } public static bool IsCascading(ITypeHandler4 handler) { return handler is ICascadingTypeHandler; } public static bool IsUntyped(ITypeHandler4 handler) { return handler is OpenTypeHandler; } public static bool IsVariableLength(ITypeHandler4 handler) { return handler is IVariableLengthTypeHandler; } public static IFieldAwareTypeHandler FieldAwareTypeHandler(ITypeHandler4 typeHandler ) { if (typeHandler is IFieldAwareTypeHandler) { return (IFieldAwareTypeHandler)typeHandler; } return NullFieldAwareTypeHandler.Instance; } public static void CollectIDs(QueryingReadContext context, ITypeHandler4 typeHandler ) { if (typeHandler is ICascadingTypeHandler) { ((ICascadingTypeHandler)typeHandler).CollectIDs(context); } } public static bool UseDedicatedSlot(IContext context, ITypeHandler4 handler) { if (IsValueType(handler)) { return false; } if (IsUntyped(handler)) { return false; } return true; } public static ITypeHandler4 ArrayElementHandler(ITypeHandler4 handler, QueryingReadContext queryingReadContext) { if (!(handler is ICascadingTypeHandler)) { return null; } ICascadingTypeHandler cascadingHandler = (ICascadingTypeHandler)HandlerRegistry.CorrectHandlerVersion (queryingReadContext, handler); return HandlerRegistry.CorrectHandlerVersion(queryingReadContext, cascadingHandler .ReadCandidateHandler(queryingReadContext)); } public static object NullRepresentationInUntypedArrays(ITypeHandler4 handler) { if (handler is PrimitiveHandler) { return ((PrimitiveHandler)handler).NullRepresentationInUntypedArrays(); } return null; } public static bool HandleAsObject(ITypeHandler4 typeHandler) { if (IsValueType(typeHandler)) { return false; } if (IsUntyped(typeHandler)) { return false; } return true; } public static void CascadeActivation(IActivationContext context, ITypeHandler4 handler ) { if (!(handler is ICascadingTypeHandler)) { return; } ((ICascadingTypeHandler)handler).CascadeActivation(context); } public static bool HandlesPrimitiveArray(ITypeHandler4 typeHandler) { return typeHandler is ArrayHandler; } // && isPrimitive(((ArrayHandler)typeHandler).delegateTypeHandler()); public static bool HasClassIndex(ITypeHandler4 typeHandler) { if (typeHandler is StandardReferenceTypeHandler) { return ((StandardReferenceTypeHandler)typeHandler).ClassMetadata().HasClassIndex( ); } return false; } public static bool CanLoadFieldByIndex(ITypeHandler4 handler) { if (handler is IQueryableTypeHandler) { return !((IQueryableTypeHandler)handler).DescendsIntoMembers(); } return true; } public static object WrapWithTransactionContext(Transaction transaction, object value , ITypeHandler4 handler) { if (IsValueType(handler)) { return value; } return transaction.Wrap(value); } public static void CollectIdsInternal(CollectIdContext context, ITypeHandler4 handler , int linkLength, bool doWithSlotIndirection) { if (!(IsCascading(handler))) { IReadBuffer buffer = context.Buffer(); buffer.Seek(buffer.Offset() + linkLength); return; } if (handler is StandardReferenceTypeHandler) { context.AddId(); return; } LocalObjectContainer container = (LocalObjectContainer)context.Container(); SlotFormat slotFormat = context.SlotFormat(); if (HandleAsObject(handler)) { // TODO: Code is similar to QCandidate.readArrayCandidates. Try to refactor to one place. int collectionID = context.ReadInt(); ByteArrayBuffer collectionBuffer = container.ReadBufferById(context.Transaction() , collectionID); ObjectHeader objectHeader = new ObjectHeader(container, collectionBuffer); QueryingReadContext subContext = new QueryingReadContext(context.Transaction(), context .HandlerVersion(), collectionBuffer, collectionID, context.Collector()); objectHeader.ClassMetadata().CollectIDs(subContext); return; } QueryingReadContext queryingReadContext = new QueryingReadContext(context.Transaction (), context.HandlerVersion(), context.Buffer(), 0, context.Collector()); IClosure4 collectIDsFromQueryingContext = new _IClosure4_263(handler, queryingReadContext ); if (doWithSlotIndirection) { slotFormat.DoWithSlotIndirection(queryingReadContext, handler, collectIDsFromQueryingContext ); } else { collectIDsFromQueryingContext.Run(); } } private sealed class _IClosure4_263 : IClosure4 { public _IClosure4_263(ITypeHandler4 handler, QueryingReadContext queryingReadContext ) { this.handler = handler; this.queryingReadContext = queryingReadContext; } public object Run() { ((ICascadingTypeHandler)handler).CollectIDs(queryingReadContext); return null; } private readonly ITypeHandler4 handler; private readonly QueryingReadContext queryingReadContext; } public static bool IsIndirectedIndexed(ITypeHandler4 handler) { return IsValueType(handler) && (handler is IVariableLengthTypeHandler) && (handler is IIndexableTypeHandler); } public static IPreparedComparison PrepareComparisonFor(ITypeHandler4 handler, IContext context, object obj) { if (!(handler is IComparable4)) { return null; } return ((IComparable4)handler).PrepareComparison(context, obj); } public static IReflectClass PrimitiveClassReflector(ClassMetadata classMetadata, IReflector reflector) { if (classMetadata is PrimitiveTypeMetadata) { return PrimitiveClassReflector(((PrimitiveTypeMetadata)classMetadata).TypeHandler (), reflector); } return null; } public static void Activate(UnmarshallingContext context, ITypeHandler4 handler) { if (handler is IReferenceTypeHandler) { ((IReferenceTypeHandler)handler).Activate(context); } } public static void Write(ITypeHandler4 handler, IWriteContext context, object obj ) { handler.Write(context, obj); } public static object ReadValueType(IReadContext context, ITypeHandler4 handler) { return ((IValueTypeHandler)handler).Read(context); } public static bool IsStandaloneTypeHandler(ITypeHandler4 customTypeHandler) { return IsValueType(customTypeHandler) || customTypeHandler is OpenTypeHandler; } public static ClassMetadata ErasedFieldType(ObjectContainerBase container, IReflectClass fieldType) { return fieldType.IsInterface() ? container.ClassMetadataForID(UntypedId) : container .ProduceClassMetadata(BaseType(fieldType)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/DeleteInfo.cs0000644000175000017500000000121011700531646027142 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class DeleteInfo : TreeInt { internal int _cascade; public ObjectReference _reference; public DeleteInfo(int id, ObjectReference reference, int cascade) : base(id) { _reference = reference; _cascade = cascade; } public override object ShallowClone() { Db4objects.Db4o.Internal.DeleteInfo deleteinfo = new Db4objects.Db4o.Internal.DeleteInfo (0, _reference, _cascade); return ShallowCloneInternal(deleteinfo); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config4Class.cs0000644000175000017500000002150311700531646027412 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// public class Config4Class : Config4Abstract, IObjectClass, IDeepClone { private readonly Config4Impl _configImpl; private static readonly KeySpec CallConstructorKey = new KeySpec(TernaryBool.Unspecified ); private static readonly KeySpec ClassIndexedKey = new KeySpec(true); private static readonly KeySpec ExceptionalFieldsKey = new KeySpec(null); private static readonly KeySpec GenerateUuidsKey = new KeySpec(TernaryBool.Unspecified ); /// /// We are running into cyclic dependancies on reading the PBootRecord /// object, if we maintain MetaClass information there /// private static readonly KeySpec MaintainMetaclassKey = new KeySpec(true); private static readonly KeySpec MaximumActivationDepthKey = new KeySpec(0); private static readonly KeySpec MinimumActivationDepthKey = new KeySpec(0); private static readonly KeySpec PersistStaticFieldValuesKey = new KeySpec(false); private static readonly KeySpec QueryAttributeProviderKey = new KeySpec(null); private static readonly KeySpec StoreTransientFieldsKey = new KeySpec(false); private static readonly KeySpec TranslatorKey = new KeySpec(null); private static readonly KeySpec TranslatorNameKey = new KeySpec((string)null); private static readonly KeySpec UpdateDepthKey = new KeySpec(Const4.Unspecified); private static readonly KeySpec WriteAsKey = new KeySpec((string)null); protected Config4Class(Config4Impl configuration, KeySpecHashtable4 config) : base (config) { _configImpl = configuration; } internal Config4Class(Config4Impl a_configuration, string a_name) { _configImpl = a_configuration; SetName(a_name); } public virtual int AdjustActivationDepth(int depth) { TernaryBool cascadeOnActivate = CascadeOnActivate(); if (cascadeOnActivate.DefiniteYes() && depth < 2) { depth = 2; } if (cascadeOnActivate.DefiniteNo() && depth > 1) { depth = 1; } if (Config().ClassActivationDepthConfigurable()) { int minimumActivationDepth = MinimumActivationDepth(); if (minimumActivationDepth != 0 && depth < minimumActivationDepth) { depth = minimumActivationDepth; } int maximumActivationDepth = MaximumActivationDepth(); if (maximumActivationDepth != 0 && depth > maximumActivationDepth) { depth = maximumActivationDepth; } } return depth; } public virtual void CallConstructor(bool flag) { PutThreeValued(CallConstructorKey, flag); } internal override string ClassName() { return GetName(); } internal virtual IReflectClass ClassReflector() { return Config().Reflector().ForName(GetName()); } [System.ObsoleteAttribute] public virtual void Compare(IObjectAttribute comparator) { _config.Put(QueryAttributeProviderKey, comparator); } internal virtual Config4Field ConfigField(string fieldName) { Hashtable4 exceptionalFields = ExceptionalFieldsOrNull(); if (exceptionalFields == null) { return null; } Config4Field config4Field = (Config4Field)exceptionalFields.Get(fieldName); if (config4Field == null) { return null; } config4Field.Used(true); return config4Field; } public virtual object DeepClone(object param) { Config4Impl parentConfig = ((Config4Impl.ConfigDeepCloneContext)param)._cloned; return new Db4objects.Db4o.Internal.Config4Class(parentConfig, _config); } public virtual void EnableReplication(bool setting) { throw new NotSupportedException("See documentation"); } public virtual void GenerateUUIDs(bool setting) { _config.Put(GenerateUuidsKey, TernaryBool.ForBoolean(setting)); } public virtual void GenerateVersionNumbers(bool setting) { throw new NotSupportedException("See documentation"); } public virtual IObjectTranslator GetTranslator() { IObjectTranslator translator = (IObjectTranslator)_config.Get(TranslatorKey); if (translator != null) { return translator; } string translatorName = _config.GetAsString(TranslatorNameKey); if (translatorName == null) { return null; } try { translator = NewTranslatorFromReflector(translatorName); } catch (Exception) { try { translator = NewTranslatorFromPlatform(translatorName); } catch (Exception e) { throw new Db4oException(e); } } Translate(translator); return translator; } /// /// private IObjectTranslator NewTranslatorFromPlatform(string translatorName) { return (IObjectTranslator)System.Activator.CreateInstance(ReflectPlatform.ForName (translatorName)); } private IObjectTranslator NewTranslatorFromReflector(string translatorName) { return (IObjectTranslator)Config().Reflector().ForName(translatorName).NewInstance (); } public virtual void Indexed(bool flag) { _config.Put(ClassIndexedKey, flag); } public virtual bool Indexed() { return _config.GetAsBoolean(ClassIndexedKey); } public virtual void MaximumActivationDepth(int depth) { _config.Put(MaximumActivationDepthKey, depth); } internal virtual int MaximumActivationDepth() { return _config.GetAsInt(MaximumActivationDepthKey); } public virtual void MinimumActivationDepth(int depth) { _config.Put(MinimumActivationDepthKey, depth); } public virtual int MinimumActivationDepth() { return _config.GetAsInt(MinimumActivationDepthKey); } public virtual TernaryBool CallConstructor() { if (_config.Get(TranslatorKey) != null) { return TernaryBool.Yes; } return _config.GetAsTernaryBool(CallConstructorKey); } internal virtual Hashtable4 ExceptionalFieldsOrNull() { return (Hashtable4)_config.Get(ExceptionalFieldsKey); } private Hashtable4 ExceptionalFields() { Hashtable4 exceptionalFieldsCollection = ExceptionalFieldsOrNull(); if (exceptionalFieldsCollection == null) { exceptionalFieldsCollection = new Hashtable4(16); _config.Put(ExceptionalFieldsKey, exceptionalFieldsCollection); } return exceptionalFieldsCollection; } public virtual IObjectField ObjectField(string fieldName) { Hashtable4 exceptionalFieldsCollection = ExceptionalFields(); Config4Field c4f = (Config4Field)exceptionalFieldsCollection.Get(fieldName); if (c4f == null) { c4f = new Config4Field(this, fieldName); exceptionalFieldsCollection.Put(fieldName, c4f); } return c4f; } public virtual void PersistStaticFieldValues() { _config.Put(PersistStaticFieldValuesKey, true); } public virtual void Rename(string newName) { Config().Rename(Renames.ForClass(GetName(), newName)); SetName(newName); } public virtual void StoreTransientFields(bool flag) { _config.Put(StoreTransientFieldsKey, flag); } public virtual void Translate(IObjectTranslator translator) { if (translator == null) { _config.Put(TranslatorNameKey, null); } _config.Put(TranslatorKey, translator); } internal virtual void TranslateOnDemand(string a_translatorName) { _config.Put(TranslatorNameKey, a_translatorName); } public virtual void UpdateDepth(int depth) { if (depth < 0) { throw new ArgumentException("update depth must not be negative"); } _config.Put(UpdateDepthKey, depth); } internal virtual Config4Impl Config() { return _configImpl; } internal virtual TernaryBool GenerateUUIDs() { return (TernaryBool)_config.Get(GenerateUuidsKey); } internal virtual TernaryBool GenerateVersionNumbers() { return TernaryBool.No; } internal virtual void MaintainMetaClass(bool flag) { _config.Put(MaintainMetaclassKey, flag); } internal virtual bool StaticFieldValuesArePersisted() { return _config.GetAsBoolean(PersistStaticFieldValuesKey); } public virtual IObjectAttribute QueryAttributeProvider() { return (IObjectAttribute)_config.Get(QueryAttributeProviderKey); } public virtual bool StoreTransientFields() { return _config.GetAsBoolean(StoreTransientFieldsKey); } internal virtual int UpdateDepth() { return _config.GetAsInt(UpdateDepthKey); } internal virtual string WriteAs() { return _config.GetAsString(WriteAsKey); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TransportObjectContainer.cs0000644000175000017500000002004311700531646032117 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Convert; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Internal.Weakref; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Types; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { /// /// no reading /// no writing /// no updates /// no weak references /// navigation by ID only both sides need synchronised ClassCollections and /// MetaInformationCaches /// /// public class TransportObjectContainer : LocalObjectContainer { private readonly ObjectContainerBase _parent; private readonly MemoryBin _memoryBin; public TransportObjectContainer(ObjectContainerBase parent, MemoryBin memoryFile) : base(parent.Config()) { _memoryBin = memoryFile; _parent = parent; _lock = parent.Lock(); _showInternalClasses = parent._showInternalClasses; Open(); } protected override void Initialize1(IConfiguration config) { _handlers = _parent._handlers; _classCollection = _parent.ClassCollection(); _config = _parent.ConfigImpl; _references = WeakReferenceSupportFactory.DisabledWeakReferenceSupport(); } protected override void InitializeClassMetadataRepository() { } // do nothing, it's passed from the parent ObjectContainer protected override void InitalizeWeakReferenceSupport() { } // do nothing, no Weak references internal override void InitializeEssentialClasses() { } // do nothing protected override void InitializePostOpenExcludingTransportObjectContainer() { } // do nothing internal override void InitNewClassCollection() { } // do nothing internal override bool CanUpdate() { return false; } public override ClassMetadata ClassMetadataForID(int id) { return _parent.ClassMetadataForID(id); } internal override void ConfigureNewFile() { } // do nothing public override int ConverterVersion() { return Converter.Version; } protected virtual void DropReferences() { _config = null; } protected override void HandleExceptionOnClose(Exception exc) { } // do nothing here public sealed override Transaction NewTransaction(Transaction parentTransaction, IReferenceSystem referenceSystem, bool isSystemTransaction) { if (null != parentTransaction) { return parentTransaction; } return new TransactionObjectCarrier(this, null, new TransportIdSystem(this), referenceSystem ); } public override long CurrentVersion() { return 0; } public override IDb4oType Db4oTypeStored(Transaction a_trans, object a_object) { return null; } public override bool DispatchsEvents() { return false; } ~TransportObjectContainer() { } // do nothing public sealed override void Free(int a_address, int a_length) { } // do nothing public sealed override void Free(Slot slot) { } // do nothing public override Slot AllocateSlot(int length) { return AppendBytes(length); } protected override bool IsValidPointer(int id) { return id != 0 && base.IsValidPointer(id); } public override Db4oDatabase Identity() { return ((ExternalObjectContainer)_parent).Identity(); } public override bool MaintainsIndices() { return false; } public override long GenerateTimeStampId() { return _parent.GenerateTimeStampId(); } internal override void Message(string msg) { } // do nothing public override ClassMetadata ProduceClassMetadata(IReflectClass claxx) { return _parent.ProduceClassMetadata(claxx); } public override void RaiseCommitTimestamp(long a_minimumVersion) { } // do nothing internal override void ReadThis() { } // do nothing internal override bool StateMessages() { return false; } // overridden to do nothing in YapObjectCarrier public override void Shutdown() { ProcessPendingClassUpdates(); WriteDirtyClassMetadata(); Transaction.Commit(); } public sealed override void WriteHeader(bool startFileLockingThread, bool shuttingDown ) { } public class KnownObjectIdentity { public int _id; public KnownObjectIdentity(int id) { // do nothing _id = id; } } /// /// public override int StoreInternal(Transaction trans, object obj, IUpdateDepth depth , bool checkJustSet) { int id = _parent.GetID(null, obj); if (id > 0) { return base.StoreInternal(trans, new TransportObjectContainer.KnownObjectIdentity (id), depth, checkJustSet); } return base.StoreInternal(trans, obj, depth, checkJustSet); } public override object GetByID2(Transaction ta, int id) { object obj = base.GetByID2(ta, id); if (obj is TransportObjectContainer.KnownObjectIdentity) { TransportObjectContainer.KnownObjectIdentity oi = (TransportObjectContainer.KnownObjectIdentity )obj; Activate(oi); obj = _parent.GetByID(null, oi._id); } return obj; } public virtual void DeferredOpen() { Open(); } /// protected sealed override void OpenImpl() { CreateIdSystem(); if (_memoryBin.Length() == 0) { ConfigureNewFile(); CommitTransaction(); } else { ReadThis(); } } /// public override void Backup(IStorage targetStorage, string path) { throw new NotSupportedException(); } public override void BlockSize(int size) { } // do nothing, blocksize is always 1 public override void CloseTransaction(Transaction transaction, bool isSystemTransaction , bool rollbackOnClose) { } // do nothing protected override void ShutdownDataStorage() { DropReferences(); } public override long FileLength() { return _memoryBin.Length(); } public override string FileName() { return "Memory File"; } protected override bool HasShutDownHook() { return false; } public sealed override bool NeedsLockFileThread() { return false; } public override void ReadBytes(byte[] bytes, int address, int length) { try { _memoryBin.Read(address, bytes, length); } catch (Exception e) { Exceptions4.ThrowRuntimeException(13, e); } } public override void ReadBytes(byte[] bytes, int address, int addressOffset, int length) { ReadBytes(bytes, address + addressOffset, length); } public override void SyncFiles() { } public override void WriteBytes(ByteArrayBuffer buffer, int address, int addressOffset ) { _memoryBin.Write(address + addressOffset, buffer._buffer, buffer.Length()); } public override void OverwriteDeletedBytes(int a_address, int a_length) { } public override void Reserve(int byteCount) { throw new NotSupportedException(); } public override byte BlockSize() { return 1; } protected override void FatalStorageShutdown() { ShutdownDataStorage(); } public override IReferenceSystem CreateReferenceSystem() { return new HashcodeReferenceSystem(); } protected override void CreateIdSystem() { } // do nothing public override IRunnable CommitHook() { return Runnable4.DoNothing; } public override void SyncFiles(IRunnable runnable) { runnable.Run(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/VirtualFieldMetadata.cs0000644000175000017500000001160311700531646031166 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Replication; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// /// TODO: refactor for symmetric inheritance - don't inherit from YapField and override, /// instead extract an abstract superclass from YapField and let both YapField and this class implement /// /// public abstract class VirtualFieldMetadata : FieldMetadata { private static readonly object AnyObject = new object(); private IReflectClass _classReflector; private IBuiltinTypeHandler _handler; internal VirtualFieldMetadata(int fieldTypeID, IBuiltinTypeHandler handler) : base (fieldTypeID) { _handler = handler; } public override ITypeHandler4 GetHandler() { return _handler; } /// public abstract override void AddFieldIndex(ObjectIdContextImpl context); public override bool Alive() { return true; } internal override bool CanAddToQuery(string fieldName) { return fieldName.Equals(GetName()); } public override bool CanBeDisabled() { return false; } public override bool CanUseNullBitmap() { return false; } public virtual IReflectClass ClassReflector(IReflector reflector) { if (_classReflector == null) { _classReflector = ((IBuiltinTypeHandler)GetHandler()).ClassReflector(); } return _classReflector; } internal override void CollectConstraints(Transaction a_trans, QConObject a_parent , object a_template, IVisitor4 a_visitor) { } // QBE constraint collection call // There isn't anything useful to do here, since virtual fields // are not on the actual object. public override void Deactivate(IActivationContext context) { } // do nothing public abstract override void Delete(DeleteContextImpl context, bool isUpdate); public override object GetOrCreate(Transaction a_trans, object a_OnObject) { // This is the first part of marshalling // Virtual fields do it all in #marshall(), the object is never used. // Returning any object here prevents triggering null handling. return AnyObject; } public override bool NeedsArrayAndPrimitiveInfo() { return false; } public override void Activate(UnmarshallingContext context) { context.ObjectReference().ProduceVirtualAttributes(); Instantiate1(context); } internal abstract void Instantiate1(ObjectReferenceContext context); public override void LoadFieldTypeById() { } // do nothing public override void Marshall(MarshallingContext context, object obj) { Marshall(context.Transaction(), context.Reference(), context, context.IsNew()); } private void Marshall(Transaction trans, ObjectReference @ref, IWriteBuffer buffer , bool isNew) { if (!trans.SupportsVirtualFields()) { MarshallIgnore(buffer); return; } ObjectContainerBase stream = trans.Container(); HandlerRegistry handlers = stream._handlers; bool migrating = false; if (stream._replicationCallState == Const4.New) { IDb4oReplicationReferenceProvider provider = handlers._replicationReferenceProvider; object parentObject = @ref.GetObject(); IDb4oReplicationReference replicationReference = provider.ReferenceFor(parentObject ); if (replicationReference != null) { migrating = true; VirtualAttributes va = @ref.ProduceVirtualAttributes(); va.i_version = replicationReference.Version(); va.i_uuid = replicationReference.LongPart(); va.i_database = replicationReference.SignaturePart(); } } if (@ref.VirtualAttributes() == null) { @ref.ProduceVirtualAttributes(); migrating = false; } Marshall(trans, @ref, buffer, migrating, isNew); } internal abstract void Marshall(Transaction trans, ObjectReference @ref, IWriteBuffer buffer, bool migrating, bool isNew); internal abstract void MarshallIgnore(IWriteBuffer writer); public virtual void ReadVirtualAttribute(ObjectReferenceContext context) { if (!context.Transaction().SupportsVirtualFields()) { IncrementOffset(context); return; } Instantiate1(context); } public override bool IsVirtual() { return true; } protected override object IndexEntryFor(object indexEntry) { return indexEntry; } protected override IIndexable4 IndexHandler(ObjectContainerBase stream) { return (IIndexable4)GetHandler(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/0000755000175000017500000000000011700531646026323 5ustar00meebeymeebey00000000000000ModifiedAspectTraversalStrategy.cs0000644000175000017500000000605311700531646035066 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Metadata; namespace Db4objects.Db4o.Internal.Metadata { /// public class ModifiedAspectTraversalStrategy : IAspectTraversalStrategy { private readonly IList _classDiffs; public ModifiedAspectTraversalStrategy(ClassMetadata classMetadata, IList ancestors ) { _classDiffs = new ArrayList(); _classDiffs.Add(new HierarchyAnalyzer.Same(classMetadata)); Sharpen.Collections.AddAll(_classDiffs, ancestors); } public virtual void TraverseAllAspects(ITraverseAspectCommand command) { int currentSlot = 0; for (IEnumerator diffIter = _classDiffs.GetEnumerator(); diffIter.MoveNext(); ) { HierarchyAnalyzer.Diff diff = ((HierarchyAnalyzer.Diff)diffIter.Current); ClassMetadata classMetadata = diff.ClassMetadata(); if (diff.IsRemoved()) { currentSlot = SkipAspectsOf(classMetadata, command, currentSlot); continue; } currentSlot = TraverseAspectsOf(classMetadata, command, currentSlot); if (command.Cancelled()) { return; } } } internal interface ITraverseAspectCommandProcessor { void Process(ITraverseAspectCommand command, ClassAspect currentAspect, int currentSlot ); } private int TraverseAspectsOf(ClassMetadata classMetadata, ITraverseAspectCommand command, int currentSlot) { return ProcessAspectsOf(classMetadata, command, currentSlot, new _ITraverseAspectCommandProcessor_49 ()); } private sealed class _ITraverseAspectCommandProcessor_49 : ModifiedAspectTraversalStrategy.ITraverseAspectCommandProcessor { public _ITraverseAspectCommandProcessor_49() { } public void Process(ITraverseAspectCommand command, ClassAspect currentAspect, int currentSlot) { command.ProcessAspect(currentAspect, currentSlot); } } private int ProcessAspectsOf(ClassMetadata classMetadata, ITraverseAspectCommand command, int currentSlot, ModifiedAspectTraversalStrategy.ITraverseAspectCommandProcessor processor) { int aspectCount = command.DeclaredAspectCount(classMetadata); for (int i = 0; i < aspectCount && !command.Cancelled(); i++) { processor.Process(command, classMetadata._aspects[i], currentSlot); currentSlot++; } return currentSlot; } private int SkipAspectsOf(ClassMetadata classMetadata, ITraverseAspectCommand command , int currentSlot) { return ProcessAspectsOf(classMetadata, command, currentSlot, new _ITraverseAspectCommandProcessor_70 ()); } private sealed class _ITraverseAspectCommandProcessor_70 : ModifiedAspectTraversalStrategy.ITraverseAspectCommandProcessor { public _ITraverseAspectCommandProcessor_70() { } public void Process(ITraverseAspectCommand command, ClassAspect currentAspect, int currentSlot) { command.ProcessAspectOnMissingClass(currentAspect, currentSlot); } } } } MarshallingInfoTraverseAspectCommand.cs0000644000175000017500000000333111700531646036023 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Metadata; namespace Db4objects.Db4o.Internal.Metadata { /// public abstract class MarshallingInfoTraverseAspectCommand : ITraverseAspectCommand { private bool _cancelled = false; protected readonly IMarshallingInfo _marshallingInfo; public MarshallingInfoTraverseAspectCommand(IMarshallingInfo marshallingInfo) { _marshallingInfo = marshallingInfo; } public int DeclaredAspectCount(ClassMetadata classMetadata) { int aspectCount = InternalDeclaredAspectCount(classMetadata); _marshallingInfo.DeclaredAspectCount(aspectCount); return aspectCount; } protected virtual int InternalDeclaredAspectCount(ClassMetadata classMetadata) { return classMetadata.ReadAspectCount(_marshallingInfo.Buffer()); } public virtual bool Cancelled() { return _cancelled; } protected virtual void Cancel() { _cancelled = true; } public virtual bool Accept(ClassAspect aspect) { return true; } public virtual void ProcessAspectOnMissingClass(ClassAspect aspect, int currentSlot ) { if (_marshallingInfo.IsNull(currentSlot)) { return; } aspect.IncrementOffset(_marshallingInfo.Buffer()); } public virtual void ProcessAspect(ClassAspect aspect, int currentSlot) { if (Accept(aspect)) { ProcessAspect(aspect, currentSlot, _marshallingInfo.IsNull(currentSlot)); } _marshallingInfo.BeginSlot(); } protected abstract void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ); } } StandardAspectTraversalStrategy.cs0000644000175000017500000000177611700531646035115 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Metadata; namespace Db4objects.Db4o.Internal.Metadata { /// public class StandardAspectTraversalStrategy : IAspectTraversalStrategy { private readonly ClassMetadata _classMetadata; public StandardAspectTraversalStrategy(ClassMetadata classMetadata) { _classMetadata = classMetadata; } public virtual void TraverseAllAspects(ITraverseAspectCommand command) { ClassMetadata classMetadata = _classMetadata; int currentSlot = 0; while (classMetadata != null) { int aspectCount = command.DeclaredAspectCount(classMetadata); for (int i = 0; i < aspectCount && !command.Cancelled(); i++) { command.ProcessAspect(classMetadata._aspects[i], currentSlot); currentSlot++; } if (command.Cancelled()) { return; } classMetadata = classMetadata._ancestor; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/HierarchyAnalyzer.cs0000644000175000017500000000703111700531646032277 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Metadata; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Metadata { /// public class HierarchyAnalyzer { public class Diff { private readonly Db4objects.Db4o.Internal.ClassMetadata _classMetadata; public Diff(Db4objects.Db4o.Internal.ClassMetadata classMetadata) { if (classMetadata == null) { throw new ArgumentNullException(); } _classMetadata = classMetadata; } public override bool Equals(object obj) { if (GetType() != obj.GetType()) { return false; } HierarchyAnalyzer.Diff other = (HierarchyAnalyzer.Diff)obj; return _classMetadata == other._classMetadata; } public override string ToString() { return ReflectPlatform.SimpleName(GetType()) + "(" + _classMetadata.GetName() + ")"; } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _classMetadata; } public virtual bool IsRemoved() { return false; } } public class Same : HierarchyAnalyzer.Diff { public Same(ClassMetadata classMetadata) : base(classMetadata) { } } public class Removed : HierarchyAnalyzer.Diff { public Removed(ClassMetadata classMetadata) : base(classMetadata) { } public override bool IsRemoved() { return true; } } private ClassMetadata _storedClass; private IReflectClass _runtimeClass; private readonly IReflectClass _objectClass; public HierarchyAnalyzer(ClassMetadata storedClass, IReflectClass runtimeClass) { if (storedClass == null || runtimeClass == null) { throw new ArgumentNullException(); } _storedClass = storedClass; _runtimeClass = runtimeClass; _objectClass = runtimeClass.Reflector().ForClass(typeof(object)); } public virtual IList Analyze() { IList ancestors = new ArrayList(); ClassMetadata storedAncestor = _storedClass.GetAncestor(); IReflectClass runtimeAncestor = _runtimeClass.GetSuperclass(); while (storedAncestor != null) { if (runtimeAncestor == storedAncestor.ClassReflector()) { ancestors.Add(new HierarchyAnalyzer.Same(storedAncestor)); } else { do { ancestors.Add(new HierarchyAnalyzer.Removed(storedAncestor)); storedAncestor = storedAncestor.GetAncestor(); if (null == storedAncestor) { if (IsObject(runtimeAncestor)) { return ancestors; } ThrowUnsupportedAdd(runtimeAncestor); } if (runtimeAncestor == storedAncestor.ClassReflector()) { ancestors.Add(new HierarchyAnalyzer.Same(storedAncestor)); break; } } while (storedAncestor != null); } storedAncestor = storedAncestor.GetAncestor(); runtimeAncestor = runtimeAncestor.GetSuperclass(); } if (runtimeAncestor != null && (!IsObject(runtimeAncestor))) { ThrowUnsupportedAdd(runtimeAncestor); } return ancestors; } private void ThrowUnsupportedAdd(IReflectClass runtimeAncestor) { throw new InvalidOperationException("Unsupported class hierarchy change. Class " + runtimeAncestor.GetName() + " was added to hierarchy of " + _runtimeClass.GetName ()); } private bool IsObject(IReflectClass clazz) { return _objectClass == clazz; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/TraverseFieldCommand.cs0000644000175000017500000000151311700531646032710 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Metadata; namespace Db4objects.Db4o.Internal.Metadata { /// public abstract class TraverseFieldCommand : ITraverseAspectCommand { public virtual bool Cancelled() { return false; } public virtual int DeclaredAspectCount(ClassMetadata classMetadata) { return classMetadata.DeclaredAspectCount(); } public virtual void ProcessAspect(ClassAspect aspect, int currentSlot) { if (aspect is FieldMetadata) { Process((FieldMetadata)aspect); } } public virtual void ProcessAspectOnMissingClass(ClassAspect aspect, int currentSlot ) { } // do nothing protected abstract void Process(FieldMetadata field); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/IAspectTraversalStrategy.cs0000644000175000017500000000045511700531646033615 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Metadata; namespace Db4objects.Db4o.Internal.Metadata { /// public interface IAspectTraversalStrategy { void TraverseAllAspects(ITraverseAspectCommand command); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Metadata/ITraverseAspectCommand.cs0000644000175000017500000000070011700531646033212 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Metadata { /// public interface ITraverseAspectCommand { int DeclaredAspectCount(ClassMetadata classMetadata); bool Cancelled(); void ProcessAspectOnMissingClass(ClassAspect aspect, int currentSlot); void ProcessAspect(ClassAspect aspect, int currentSlot); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ByteArrayBuffer.cs0000644000175000017500000001450411700531646030172 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Sharpen; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { /// public class ByteArrayBuffer : IReadWriteBuffer { private static readonly ThreadLocal _checkXBytes = Debug4.xbytes ? new ThreadLocal () : null; public byte[] _buffer; public int _offset; internal ByteArrayBuffer() { } public ByteArrayBuffer(int length) : this() { // for coding convenience, we allow objects to grab into the buffer _buffer = new byte[length]; } public ByteArrayBuffer(byte[] buffer) : this() { _buffer = buffer; } public virtual void Seek(int offset) { _offset = offset; } public virtual void WriteBytes(byte[] bytes) { System.Array.Copy(bytes, 0, _buffer, _offset, bytes.Length); _offset += bytes.Length; } // TODO: Change all callers to call writeBytes directly. public virtual void Append(byte[] bytes) { WriteBytes(bytes); } public bool ContainsTheSame(Db4objects.Db4o.Internal.ByteArrayBuffer other) { if (other != null) { return Arrays4.Equals(_buffer, other._buffer); } return false; } public virtual void CopyTo(Db4objects.Db4o.Internal.ByteArrayBuffer to, int fromOffset , int toOffset, int length) { System.Array.Copy(_buffer, fromOffset, to._buffer, toOffset, length); } public virtual int Length() { return _buffer.Length; } public virtual void IncrementOffset(int a_by) { _offset += a_by; } /// non-encrypted read, used for indexes public virtual void Read(ObjectContainerBase stream, int address, int addressOffset ) { stream.ReadBytes(_buffer, address, addressOffset, Length()); } public void ReadBegin(byte identifier) { } public virtual BitMap4 ReadBitMap(int bitCount) { BitMap4 map = new BitMap4(_buffer, _offset, bitCount); _offset += map.MarshalledLength(); return map; } public virtual byte ReadByte() { return _buffer[_offset++]; } public virtual byte[] ReadBytes(int a_length) { byte[] bytes = new byte[a_length]; ReadBytes(bytes); return bytes; } public virtual void ReadBytes(byte[] bytes) { int length = bytes.Length; System.Array.Copy(_buffer, _offset, bytes, 0, length); _offset += length; } /// public Db4objects.Db4o.Internal.ByteArrayBuffer ReadEmbeddedObject(Transaction trans ) { int address = ReadInt(); int length = ReadInt(); if (address == 0) { return null; } return trans.Container().DecryptedBufferByAddress(address, length); } /// public virtual void ReadEncrypt(ObjectContainerBase stream, int address) { stream.ReadBytes(_buffer, address, Length()); stream._handlers.Decrypt(this); } public virtual void ReadEnd() { } public int ReadInt() { int o = (_offset += 4) - 1; return (_buffer[o] & 255) | (_buffer[--o] & 255) << 8 | (_buffer[--o] & 255) << 16 | _buffer[--o] << 24; } public virtual long ReadLong() { return LongHandler.ReadLong(this); } public virtual Db4objects.Db4o.Internal.ByteArrayBuffer ReadPayloadReader(int offset , int length) { Db4objects.Db4o.Internal.ByteArrayBuffer payLoad = new Db4objects.Db4o.Internal.ByteArrayBuffer (length); System.Array.Copy(_buffer, offset, payLoad._buffer, 0, length); return payLoad; } internal virtual void ReplaceWith(byte[] a_bytes) { System.Array.Copy(a_bytes, 0, _buffer, 0, Length()); } public override string ToString() { string str = string.Empty; for (int i = 0; i < _buffer.Length; i++) { if (i > 0) { str += " , "; } str += _buffer[i]; } return str; } public virtual void WriteBegin(byte a_identifier) { } public void WriteBitMap(BitMap4 nullBitMap) { nullBitMap.WriteTo(_buffer, _offset); _offset += nullBitMap.MarshalledLength(); } public void WriteByte(byte a_byte) { _buffer[_offset++] = a_byte; } public virtual void WriteEnd() { if (Deploy.debug && Deploy.brackets) { WriteByte(Const4.Yapend); } } public void WriteInt(int a_int) { int o = _offset + 4; _offset = o; byte[] b = _buffer; b[--o] = (byte)a_int; b[--o] = (byte)(a_int >>= 8); b[--o] = (byte)(a_int >>= 8); b[--o] = (byte)(a_int >> 8); } public virtual void WriteIDOf(Transaction trans, object obj) { if (obj == null) { WriteInt(0); return; } if (obj is PersistentBase) { WriteIDOf(trans, (PersistentBase)obj); return; } WriteInt(((int)obj)); } public virtual void WriteIDOf(Transaction trans, PersistentBase persistent) { if (persistent == null) { WriteInt(0); return; } if (CanWritePersistentBase()) { persistent.WriteOwnID(trans, this); } else { WriteInt(persistent.GetID()); } } protected virtual bool CanWritePersistentBase() { return true; } public virtual void WriteShortString(Transaction trans, string a_string) { trans.Container()._handlers._stringHandler.WriteShort(trans, a_string, this); } public virtual void WriteLong(long l) { LongHandler.WriteLong(this, l); } public virtual void IncrementIntSize() { IncrementOffset(Const4.IntLength); } public virtual int Offset() { return _offset; } public virtual void EnsureSize(int size) { if (size == _buffer.Length) { return; } _buffer = new byte[size]; } public virtual void Skip(int length) { Seek(_offset + length); } public virtual void CheckXBytes(bool flag) { } public virtual bool CheckXBytes() { throw new InvalidOperationException(); } public virtual bool Eof() { return _offset == _buffer.Length; } public virtual int RemainingByteCount() { return _buffer.Length - _offset; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ReflectorConfigurationImpl.cs0000644000175000017500000000252311700531646032433 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { public class ReflectorConfigurationImpl : IReflectorConfiguration { private Config4Impl _config; public ReflectorConfigurationImpl(Config4Impl config) { _config = config; } public virtual bool TestConstructors() { return _config.TestConstructors(); } public virtual bool CallConstructor(IReflectClass clazz) { TernaryBool specialized = CallConstructorSpecialized(clazz); if (!specialized.IsUnspecified()) { return specialized.DefiniteYes(); } return _config.CallConstructors().DefiniteYes(); } private TernaryBool CallConstructorSpecialized(IReflectClass clazz) { Config4Class clazzConfig = _config.ConfigClass(clazz.GetName()); if (clazzConfig != null) { TernaryBool res = clazzConfig.CallConstructor(); if (!res.IsUnspecified()) { return res; } } if (Platform4.IsEnum(_config.Reflector(), clazz)) { return TernaryBool.No; } IReflectClass ancestor = clazz.GetSuperclass(); if (ancestor != null) { return CallConstructorSpecialized(ancestor); } return TernaryBool.Unspecified; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IDGenerator.cs0000644000175000017500000000044111700531646027274 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { public class IDGenerator { private int id = 0; public virtual int Next() { id++; if (id > 0) { return id; } id = 1; return 1; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ILinkLengthAware.cs0000644000175000017500000000025711700531646030266 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { public interface ILinkLengthAware { int LinkLength(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/0000755000175000017500000000000011700531646025644 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeCancelledRemoval.cs0000644000175000017500000000216411700531646032320 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeCancelledRemoval : BTreeUpdate { private readonly object _newKey; public BTreeCancelledRemoval(Transaction transaction, object originalKey, object newKey, BTreeUpdate existingPatches) : base(transaction, originalKey) { _newKey = newKey; if (null != existingPatches) { Append(existingPatches); } } protected override void Committed(BTree btree) { } // do nothing public override bool IsCancelledRemoval() { return true; } public override string ToString() { return "(u) " + base.ToString(); } protected override object GetCommittedObject() { return _newKey; } protected override void AdjustSizeOnRemovalByOtherTransaction(BTree btree, BTreeNode node) { } // The other transaction reduces the size, this entry ignores. protected override int SizeDiff() { return 1; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeConfiguration.cs0000644000175000017500000000221311700531646031722 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeConfiguration { public static readonly Db4objects.Db4o.Internal.Btree.BTreeConfiguration Default = new Db4objects.Db4o.Internal.Btree.BTreeConfiguration(null, 20, true); public readonly ITransactionalIdSystem _idSystem; public readonly SlotChangeFactory _slotChangeFactory; public readonly bool _canEnlistWithTransaction; public readonly int _cacheSize; public BTreeConfiguration(ITransactionalIdSystem idSystem, SlotChangeFactory slotChangeFactory , int cacheSize, bool canEnlistWithTransaction) { _idSystem = idSystem; _slotChangeFactory = slotChangeFactory; _canEnlistWithTransaction = canEnlistWithTransaction; _cacheSize = cacheSize; } public BTreeConfiguration(ITransactionalIdSystem idSystem, int cacheSize, bool canEnlistWithTransaction ) : this(idSystem, SlotChangeFactory.SystemObjects, cacheSize, canEnlistWithTransaction ) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Searcher.cs0000644000175000017500000000506711700531646027737 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public sealed class Searcher { private int _lower; private int _upper; private int _cursor; private int _cmp; private readonly SearchTarget _target; private readonly int _count; public Searcher(SearchTarget target, int count) { if (count < 0) { throw new ArgumentException(); } _target = target; _count = count; _cmp = -1; if (count == 0) { Complete(); return; } _cursor = -1; _upper = count - 1; AdjustCursor(); } private void AdjustBounds() { if (_cmp > 0) { _upper = _cursor - 1; if (_upper < _lower) { _upper = _lower; } return; } if (_cmp < 0) { if (_lower == _cursor && _lower < _upper) { _lower++; } else { _lower = _cursor; } return; } if (_target == SearchTarget.Any) { _lower = _cursor; _upper = _cursor; } else { if (_target == SearchTarget.Highest) { _lower = _cursor; } else { if (_target == SearchTarget.Lowest) { _upper = _cursor; } else { throw new InvalidOperationException("Unknown target"); } } } } private void AdjustCursor() { int oldCursor = _cursor; if (_upper - _lower <= 1) { if ((_target == SearchTarget.Lowest) && (_cmp == 0)) { _cursor = _lower; } else { _cursor = _upper; } } else { _cursor = _lower + ((_upper - _lower) / 2); } if (_cursor == oldCursor) { Complete(); } } public bool AfterLast() { if (_count == 0) { return false; } // _cursor is 0: not after last return (_cursor == _count - 1) && _cmp < 0; } public bool BeforeFirst() { return (_cursor == 0) && (_cmp > 0); } private void Complete() { _upper = -2; } public int Count() { return _count; } public int Cursor() { return _cursor; } public bool FoundMatch() { return _cmp == 0; } public bool Incomplete() { return _upper >= _lower; } public void MoveForward() { _cursor++; } public void ResultIs(int cmp) { _cmp = cmp; AdjustBounds(); AdjustCursor(); } public bool IsGreater() { return _cmp < 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeNodeCacheEntry.cs0000644000175000017500000000107411700531646031752 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeNodeCacheEntry { public readonly BTreeNode _node; private ByteArrayBuffer _buffer; public BTreeNodeCacheEntry(BTreeNode node) { _node = node; } public virtual ByteArrayBuffer Buffer() { return _buffer; } public virtual void Buffer(ByteArrayBuffer buffer) { _buffer = buffer; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/0000755000175000017500000000000011700531646027201 5ustar00meebeymeebey00000000000000BTreeRangeSingleOperation.cs0000644000175000017500000000071511700531646034455 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public abstract class BTreeRangeSingleOperation : BTreeRangeOperation { protected readonly BTreeRangeSingle _single; public BTreeRangeSingleOperation(BTreeRangeSingle single) { _single = single; } } } BTreeRangeSingleIntersect.cs0000644000175000017500000000122411700531646034451 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public class BTreeRangeSingleIntersect : BTreeRangeSingleOperation { public BTreeRangeSingleIntersect(BTreeRangeSingle single) : base(single) { } protected override IBTreeRange Execute(BTreeRangeSingle single) { return BTreeAlgebra.Intersect(_single, single); } protected override IBTreeRange Execute(BTreeRangeUnion union) { return BTreeAlgebra.Intersect(union, _single); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/BTreeAlgebra.cs0000644000175000017500000000722311700531646032013 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// internal class BTreeAlgebra { public static IBTreeRange Intersect(BTreeRangeUnion union, BTreeRangeSingle single ) { SortedCollection4 collection = NewBTreeRangeSingleCollection(); CollectIntersections(collection, union, single); return ToRange(collection); } public static IBTreeRange Intersect(BTreeRangeUnion union1, BTreeRangeUnion union2 ) { SortedCollection4 collection = NewBTreeRangeSingleCollection(); IEnumerator ranges = union1.Ranges(); while (ranges.MoveNext()) { BTreeRangeSingle current = (BTreeRangeSingle)ranges.Current; CollectIntersections(collection, union2, current); } return ToRange(collection); } private static void CollectIntersections(SortedCollection4 collection, BTreeRangeUnion union, BTreeRangeSingle single) { IEnumerator ranges = union.Ranges(); while (ranges.MoveNext()) { BTreeRangeSingle current = (BTreeRangeSingle)ranges.Current; if (single.Overlaps(current)) { collection.Add(single.Intersect(current)); } } } public static IBTreeRange Intersect(BTreeRangeSingle single1, BTreeRangeSingle single2 ) { BTreePointer first = BTreePointer.Max(single1.First(), single2.First()); BTreePointer end = BTreePointer.Min(single1.End(), single2.End()); return single1.NewBTreeRangeSingle(first, end); } public static IBTreeRange Union(BTreeRangeUnion union1, BTreeRangeUnion union2) { IEnumerator ranges = union1.Ranges(); IBTreeRange merged = union2; while (ranges.MoveNext()) { merged = merged.Union((IBTreeRange)ranges.Current); } return merged; } public static IBTreeRange Union(BTreeRangeUnion union, BTreeRangeSingle single) { if (single.IsEmpty()) { return union; } SortedCollection4 sorted = NewBTreeRangeSingleCollection(); sorted.Add(single); BTreeRangeSingle range = single; IEnumerator ranges = union.Ranges(); while (ranges.MoveNext()) { BTreeRangeSingle current = (BTreeRangeSingle)ranges.Current; if (CanBeMerged(current, range)) { sorted.Remove(range); range = Merge(current, range); sorted.Add(range); } else { sorted.Add(current); } } return ToRange(sorted); } private static IBTreeRange ToRange(SortedCollection4 sorted) { if (1 == sorted.Size()) { return (IBTreeRange)sorted.SingleElement(); } return new BTreeRangeUnion(sorted); } private static SortedCollection4 NewBTreeRangeSingleCollection() { return new SortedCollection4(BTreeRangeSingle.Comparison); } public static IBTreeRange Union(BTreeRangeSingle single1, BTreeRangeSingle single2 ) { if (single1.IsEmpty()) { return single2; } if (single2.IsEmpty()) { return single1; } if (CanBeMerged(single1, single2)) { return Merge(single1, single2); } return new BTreeRangeUnion(new BTreeRangeSingle[] { single1, single2 }); } private static BTreeRangeSingle Merge(BTreeRangeSingle range1, BTreeRangeSingle range2 ) { return range1.NewBTreeRangeSingle(BTreePointer.Min(range1.First(), range2.First() ), BTreePointer.Max(range1.End(), range2.End())); } private static bool CanBeMerged(BTreeRangeSingle range1, BTreeRangeSingle range2) { return range1.Overlaps(range2) || range1.Adjacent(range2); } } } BTreeRangeUnionIntersect.cs0000644000175000017500000000121211700531646034315 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public class BTreeRangeUnionIntersect : BTreeRangeUnionOperation { public BTreeRangeUnionIntersect(BTreeRangeUnion union) : base(union) { } protected override IBTreeRange Execute(BTreeRangeSingle range) { return BTreeAlgebra.Intersect(_union, range); } protected override IBTreeRange Execute(BTreeRangeUnion union) { return BTreeAlgebra.Intersect(_union, union); } } } BTreeRangeSingleUnion.cs0000644000175000017500000000120411700531646033577 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public class BTreeRangeSingleUnion : BTreeRangeSingleOperation { public BTreeRangeSingleUnion(BTreeRangeSingle single) : base(single) { } protected override IBTreeRange Execute(BTreeRangeSingle single) { return BTreeAlgebra.Union(_single, single); } protected override IBTreeRange Execute(BTreeRangeUnion union) { return BTreeAlgebra.Union(union, _single); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/BTreeRangeOperation.cs0000644000175000017500000000145011700531646033367 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public abstract class BTreeRangeOperation : IBTreeRangeVisitor { private IBTreeRange _resultingRange; public BTreeRangeOperation() : base() { } public virtual IBTreeRange Dispatch(IBTreeRange range) { range.Accept(this); return _resultingRange; } public void Visit(BTreeRangeSingle single) { _resultingRange = Execute(single); } public void Visit(BTreeRangeUnion union) { _resultingRange = Execute(union); } protected abstract IBTreeRange Execute(BTreeRangeUnion union); protected abstract IBTreeRange Execute(BTreeRangeSingle single); } } BTreeRangeUnionUnion.cs0000644000175000017500000000117411700531646033454 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public class BTreeRangeUnionUnion : BTreeRangeUnionOperation { public BTreeRangeUnionUnion(BTreeRangeUnion union) : base(union) { } protected override IBTreeRange Execute(BTreeRangeUnion union) { return BTreeAlgebra.Union(_union, union); } protected override IBTreeRange Execute(BTreeRangeSingle single) { return BTreeAlgebra.Union(_union, single); } } } BTreeRangeUnionOperation.cs0000644000175000017500000000070511700531646034323 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/Algebra/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree.Algebra { /// public abstract class BTreeRangeUnionOperation : BTreeRangeOperation { protected readonly BTreeRangeUnion _union; public BTreeRangeUnionOperation(BTreeRangeUnion union) { _union = union; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeRemove.cs0000644000175000017500000000204411700531646030352 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeRemove : BTreeUpdate { public BTreeRemove(Transaction transaction, object obj) : base(transaction, obj) { } protected override void Committed(BTree btree) { btree.NotifyRemoveListener(new TransactionContext(_transaction, GetObject())); } public override string ToString() { return "(-) " + base.ToString(); } public override bool IsRemove() { return true; } protected override object GetCommittedObject() { return No4.Instance; } protected override void AdjustSizeOnRemovalByOtherTransaction(BTree btree, BTreeNode node) { // The size was reduced for this entry, let's change back. btree.SizeChanged(_transaction, node, +1); } protected override int SizeDiff() { return 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeRangeUnion.cs0000644000175000017500000000664111700531646031171 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree { public class BTreeRangeUnion : IBTreeRange { private readonly BTreeRangeSingle[] _ranges; public BTreeRangeUnion(BTreeRangeSingle[] ranges) : this(ToSortedCollection(ranges )) { } public BTreeRangeUnion(SortedCollection4 sorted) { if (null == sorted) { throw new ArgumentNullException(); } _ranges = ToArray(sorted); } public virtual void Accept(IBTreeRangeVisitor visitor) { visitor.Visit(this); } public virtual bool IsEmpty() { for (int i = 0; i < _ranges.Length; i++) { if (!_ranges[i].IsEmpty()) { return false; } } return true; } private static SortedCollection4 ToSortedCollection(BTreeRangeSingle[] ranges) { if (null == ranges) { throw new ArgumentNullException(); } SortedCollection4 collection = new SortedCollection4(BTreeRangeSingle.Comparison); for (int i = 0; i < ranges.Length; i++) { BTreeRangeSingle range = ranges[i]; if (!range.IsEmpty()) { collection.Add(range); } } return collection; } private static BTreeRangeSingle[] ToArray(SortedCollection4 collection) { return (BTreeRangeSingle[])collection.ToArray(new BTreeRangeSingle[collection.Size ()]); } public virtual IBTreeRange ExtendToFirst() { throw new NotImplementedException(); } public virtual IBTreeRange ExtendToLast() { throw new NotImplementedException(); } public virtual IBTreeRange ExtendToLastOf(IBTreeRange upperRange) { throw new NotImplementedException(); } public virtual IBTreeRange Greater() { throw new NotImplementedException(); } public virtual IBTreeRange Intersect(IBTreeRange range) { if (null == range) { throw new ArgumentNullException(); } return new BTreeRangeUnionIntersect(this).Dispatch(range); } public virtual IEnumerator Pointers() { return Iterators.Concat(Iterators.Map(_ranges, new _IFunction4_77())); } private sealed class _IFunction4_77 : IFunction4 { public _IFunction4_77() { } public object Apply(object range) { return ((IBTreeRange)range).Pointers(); } } public virtual IEnumerator Keys() { return Iterators.Concat(Iterators.Map(_ranges, new _IFunction4_85())); } private sealed class _IFunction4_85 : IFunction4 { public _IFunction4_85() { } public object Apply(object range) { return ((IBTreeRange)range).Keys(); } } public virtual int Size() { int size = 0; for (int i = 0; i < _ranges.Length; i++) { size += _ranges[i].Size(); } return size; } public virtual IBTreeRange Smaller() { throw new NotImplementedException(); } public virtual IBTreeRange Union(IBTreeRange other) { if (null == other) { throw new ArgumentNullException(); } return new BTreeRangeUnionUnion(this).Dispatch(other); } public virtual IEnumerator Ranges() { return new ArrayIterator4(_ranges); } public virtual BTreePointer LastPointer() { throw new NotImplementedException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/IBTreeRange.cs0000644000175000017500000000164511700531646030270 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { public interface IBTreeRange { /// /// Iterates through all the valid pointers in /// this range. /// /// /// Iterates through all the valid pointers in /// this range. /// /// an Iterator4 over BTreePointer value IEnumerator Pointers(); IEnumerator Keys(); int Size(); IBTreeRange Greater(); IBTreeRange Union(IBTreeRange other); IBTreeRange ExtendToLast(); IBTreeRange Smaller(); IBTreeRange ExtendToFirst(); IBTreeRange Intersect(IBTreeRange range); IBTreeRange ExtendToLastOf(IBTreeRange upperRange); bool IsEmpty(); void Accept(IBTreeRangeVisitor visitor); BTreePointer LastPointer(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeUpdate.cs0000644000175000017500000001046011700531646030340 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { public abstract class BTreeUpdate : BTreePatch { protected Db4objects.Db4o.Internal.Btree.BTreeUpdate _next; public BTreeUpdate(Transaction transaction, object obj) : base(transaction, obj) { } protected virtual bool HasNext() { return _next != null; } public override BTreePatch ForTransaction(Transaction trans) { if (_transaction == trans) { return this; } if (_next == null) { return null; } return _next.ForTransaction(trans); } public virtual Db4objects.Db4o.Internal.Btree.BTreeUpdate RemoveFor(Transaction trans ) { if (_transaction == trans) { return _next; } if (_next == null) { return this; } return _next.RemoveFor(trans); } public virtual void Append(Db4objects.Db4o.Internal.Btree.BTreeUpdate patch) { if (_transaction == patch._transaction) { // don't allow two patches for the same transaction throw new ArgumentException(); } if (!HasNext()) { _next = patch; } else { _next.Append(patch); } } protected virtual void ApplyKeyChange(object obj) { _object = obj; if (HasNext()) { _next.ApplyKeyChange(obj); } } protected abstract void Committed(BTree btree); public override object Commit(Transaction trans, BTree btree, BTreeNode node) { Db4objects.Db4o.Internal.Btree.BTreeUpdate patch = (Db4objects.Db4o.Internal.Btree.BTreeUpdate )ForTransaction(trans); if (patch is BTreeCancelledRemoval) { object obj = patch.GetCommittedObject(); ApplyKeyChange(obj); } else { if (patch is BTreeRemove) { RemovedBy(trans, btree, node); patch.Committed(btree); return No4.Instance; } } return InternalCommit(trans, btree); } protected object InternalCommit(Transaction trans, BTree btree) { if (_transaction == trans) { Committed(btree); if (HasNext()) { return _next; } return GetCommittedObject(); } if (HasNext()) { SetNextIfPatch(_next.InternalCommit(trans, btree)); } return this; } private void SetNextIfPatch(object newNext) { if (newNext is Db4objects.Db4o.Internal.Btree.BTreeUpdate) { _next = (Db4objects.Db4o.Internal.Btree.BTreeUpdate)newNext; } else { _next = null; } } protected abstract object GetCommittedObject(); public override object Rollback(Transaction trans, BTree btree) { if (_transaction == trans) { if (HasNext()) { return _next; } return GetObject(); } if (HasNext()) { SetNextIfPatch(_next.Rollback(trans, btree)); } return this; } public override object Key(Transaction trans) { BTreePatch patch = ForTransaction(trans); if (patch == null) { return GetObject(); } if (patch.IsRemove()) { return No4.Instance; } return patch.GetObject(); } public virtual Db4objects.Db4o.Internal.Btree.BTreeUpdate ReplacePatch(BTreePatch patch, Db4objects.Db4o.Internal.Btree.BTreeUpdate update) { if (patch == this) { update._next = _next; return update; } if (_next == null) { throw new InvalidOperationException(); } _next = _next.ReplacePatch(patch, update); return this; } public virtual void RemovedBy(Transaction trans, BTree btree, BTreeNode node) { if (trans != _transaction) { AdjustSizeOnRemovalByOtherTransaction(btree, node); } if (HasNext()) { _next.RemovedBy(trans, btree, node); } } protected abstract void AdjustSizeOnRemovalByOtherTransaction(BTree btree, BTreeNode node); public override int SizeDiff(Transaction trans) { Db4objects.Db4o.Internal.Btree.BTreeUpdate patchForTransaction = (Db4objects.Db4o.Internal.Btree.BTreeUpdate )ForTransaction(trans); if (patchForTransaction == null) { return 1; } return patchForTransaction.SizeDiff(); } protected abstract int SizeDiff(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeIterator.cs0000644000175000017500000000235111700531646030707 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeIterator : IEnumerator { private readonly Transaction _transaction; private readonly BTree _bTree; private BTreePointer _currentPointer; private bool _beyondEnd; public BTreeIterator(Transaction trans, BTree bTree) { _transaction = trans; _bTree = bTree; } public virtual object Current { get { if (_currentPointer == null) { throw new InvalidOperationException(); } return _currentPointer.Key(); } } public virtual bool MoveNext() { if (_beyondEnd) { return false; } if (BeforeFirst()) { _currentPointer = _bTree.FirstPointer(_transaction); } else { _currentPointer = _currentPointer.Next(); } _beyondEnd = (_currentPointer == null); return !_beyondEnd; } private bool BeforeFirst() { return _currentPointer == null; } public virtual void Reset() { throw new NotSupportedException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeAdd.cs0000644000175000017500000000267311700531646027615 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeAdd : BTreePatch { public BTreeAdd(Transaction transaction, object obj) : base(transaction, obj) { } protected virtual object RolledBack(BTree btree) { btree.NotifyRemoveListener(new TransactionContext(_transaction, GetObject())); return No4.Instance; } public override string ToString() { return "(+) " + base.ToString(); } public override object Commit(Transaction trans, BTree btree, BTreeNode node) { if (_transaction == trans) { return GetObject(); } return this; } public override BTreePatch ForTransaction(Transaction trans) { if (_transaction == trans) { return this; } return null; } public override object Key(Transaction trans) { if (_transaction != trans) { return No4.Instance; } return GetObject(); } public override object Rollback(Transaction trans, BTree btree) { if (_transaction == trans) { return RolledBack(btree); } return this; } public override bool IsAdd() { return true; } public override int SizeDiff(Transaction trans) { return _transaction == trans ? 1 : 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreePointer.cs0000644000175000017500000001144211700531646030537 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public sealed class BTreePointer { public static Db4objects.Db4o.Internal.Btree.BTreePointer Max(Db4objects.Db4o.Internal.Btree.BTreePointer x, Db4objects.Db4o.Internal.Btree.BTreePointer y) { if (x == null) { return x; } if (y == null) { return y; } if (x.CompareTo(y) > 0) { return x; } return y; } public static Db4objects.Db4o.Internal.Btree.BTreePointer Min(Db4objects.Db4o.Internal.Btree.BTreePointer x, Db4objects.Db4o.Internal.Btree.BTreePointer y) { if (x == null) { return y; } if (y == null) { return x; } if (x.CompareTo(y) < 0) { return x; } return y; } private readonly BTreeNode _node; private readonly int _index; private readonly Transaction _transaction; private readonly ByteArrayBuffer _nodeReader; public BTreePointer(Transaction transaction, ByteArrayBuffer nodeReader, BTreeNode node, int index) { if (transaction == null || node == null) { throw new ArgumentNullException(); } _transaction = transaction; _nodeReader = nodeReader; _node = node; _index = index; } public int Index() { return _index; } public BTreeNode Node() { return _node; } public object Key() { return _node.Key(_transaction, _nodeReader, _index); } public Db4objects.Db4o.Internal.Btree.BTreePointer Next() { int indexInMyNode = _index + 1; while (indexInMyNode < _node.Count()) { if (_node.IndexIsValid(_transaction, indexInMyNode)) { return new Db4objects.Db4o.Internal.Btree.BTreePointer(_transaction, _nodeReader, _node, indexInMyNode); } indexInMyNode++; } int newIndex = -1; BTreeNode nextNode = _node; ByteArrayBuffer nextReader = null; while (newIndex == -1) { nextNode = nextNode.NextNode(); if (nextNode == null) { return null; } nextReader = nextNode.PrepareRead(_transaction); newIndex = nextNode.FirstKeyIndex(_transaction); } Btree().ConvertCacheEvictedNodesToReadMode(); return new Db4objects.Db4o.Internal.Btree.BTreePointer(_transaction, nextReader, nextNode, newIndex); } public Db4objects.Db4o.Internal.Btree.BTreePointer Previous() { int indexInMyNode = _index - 1; while (indexInMyNode >= 0) { if (_node.IndexIsValid(_transaction, indexInMyNode)) { return new Db4objects.Db4o.Internal.Btree.BTreePointer(_transaction, _nodeReader, _node, indexInMyNode); } indexInMyNode--; } int newIndex = -1; BTreeNode previousNode = _node; ByteArrayBuffer previousReader = null; while (newIndex == -1) { previousNode = previousNode.PreviousNode(); if (previousNode == null) { return null; } previousReader = previousNode.PrepareRead(_transaction); newIndex = previousNode.LastKeyIndex(_transaction); } return new Db4objects.Db4o.Internal.Btree.BTreePointer(_transaction, previousReader , previousNode, newIndex); } public override bool Equals(object obj) { if (this == obj) { return true; } if (!(obj is Db4objects.Db4o.Internal.Btree.BTreePointer)) { return false; } Db4objects.Db4o.Internal.Btree.BTreePointer other = (Db4objects.Db4o.Internal.Btree.BTreePointer )obj; if (_index != other._index) { return false; } return _node.Equals(other._node); } public override int GetHashCode() { return _node.GetHashCode(); } public override string ToString() { return "BTreePointer(index=" + _index + ", node=" + _node + ")"; } public int CompareTo(Db4objects.Db4o.Internal.Btree.BTreePointer y) { if (null == y) { throw new ArgumentNullException(); } if (Btree() != y.Btree()) { throw new ArgumentException(); } return Btree().CompareKeys(_transaction.Context(), Key(), y.Key()); } private BTree Btree() { return _node.Btree(); } public static bool LessThan(Db4objects.Db4o.Internal.Btree.BTreePointer x, Db4objects.Db4o.Internal.Btree.BTreePointer y) { return Db4objects.Db4o.Internal.Btree.BTreePointer.Min(x, y) == x && !Equals(x, y ); } public static bool Equals(Db4objects.Db4o.Internal.Btree.BTreePointer x, Db4objects.Db4o.Internal.Btree.BTreePointer y) { if (x == null) { return y == null; } return x.Equals(y); } public bool IsValid() { return _node.IndexIsValid(_transaction, _index); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/IBTreeStructureListener.cs0000644000175000017500000000075711700531646032745 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public interface IBTreeStructureListener { void NotifySplit(Transaction trans, BTreeNode originalNode, BTreeNode newRightNode ); void NotifyDeleted(Transaction trans, BTreeNode node); void NotifyCountChanged(Transaction trans, BTreeNode node, int diff); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeRangePointerIterator.cs0000644000175000017500000000063711700531646033232 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { public class BTreeRangePointerIterator : AbstractBTreeRangeIterator { public BTreeRangePointerIterator(BTreeRangeSingle range) : base(range) { } public override object Current { get { return CurrentPointer(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/FieldIndexKeyImpl.cs0000644000175000017500000000232711700531646031505 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// /// Composite key for field indexes, first compares on the actual /// indexed field _value and then on the _parentID (which is a /// reference to the containing object). /// /// /// Composite key for field indexes, first compares on the actual /// indexed field _value and then on the _parentID (which is a /// reference to the containing object). /// /// public class FieldIndexKeyImpl : IFieldIndexKey { private readonly object _value; private readonly int _parentID; public FieldIndexKeyImpl(int parentID, object value) { _parentID = parentID; _value = value; } public virtual int ParentID() { return _parentID; } public virtual object Value() { return _value; } public override string ToString() { return "FieldIndexKey(" + _parentID + ", " + SafeString(_value) + ")"; } private string SafeString(object value) { if (null == value) { return "null"; } return value.ToString(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeNode.cs0000644000175000017500000010100611700531646030000 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Marshall; using Sharpen; namespace Db4objects.Db4o.Internal.Btree { /// /// We work with BTreeNode in two states: /// - deactivated: never read, no valid members, ID correct or 0 if new /// - write: real representation of keys, values and children in arrays /// The write state can be detected with canWrite(). /// /// /// We work with BTreeNode in two states: /// - deactivated: never read, no valid members, ID correct or 0 if new /// - write: real representation of keys, values and children in arrays /// The write state can be detected with canWrite(). States can be changed /// as needed with prepareRead() and prepareWrite(). /// /// public sealed class BTreeNode : LocalPersistentBase { private const int CountLeafAnd3LinkLength = (Const4.IntLength * 4) + 1; private const int SlotLeadingLength = Const4.LeadingLength + CountLeafAnd3LinkLength; internal readonly BTree _btree; private int _count; private bool _isLeaf; private object[] _keys; /// Can contain BTreeNode or Integer for ID of BTreeNode private object[] _children; private int _parentID; private int _previousID; private int _nextID; private bool _dead; public BTreeNode(BTree btree, int count, bool isLeaf, int parentID, int previousID , int nextID) { _btree = btree; _parentID = parentID; _previousID = previousID; _nextID = nextID; _count = count; _isLeaf = isLeaf; PrepareArrays(); } public BTreeNode(int id, BTree btree) { _btree = btree; SetID(id); SetStateDeactivated(); } public BTreeNode(Transaction trans, Db4objects.Db4o.Internal.Btree.BTreeNode firstChild , Db4objects.Db4o.Internal.Btree.BTreeNode secondChild) : this(firstChild._btree , 2, false, 0, 0, 0) { _keys[0] = firstChild._keys[0]; _children[0] = firstChild; _keys[1] = secondChild._keys[0]; _children[1] = secondChild; Write(trans.SystemTransaction()); firstChild.SetParentID(trans, GetID()); secondChild.SetParentID(trans, GetID()); } public BTree Btree() { return _btree; } /// /// the split node if this node is split /// or this if the first key has changed /// public Db4objects.Db4o.Internal.Btree.BTreeNode Add(Transaction trans, IPreparedComparison preparedComparison, object obj) { ByteArrayBuffer reader = PrepareRead(trans); Searcher s = Search(trans, preparedComparison, reader); if (_isLeaf) { PrepareWrite(trans); SetStateDirty(); if (WasRemoved(trans, s)) { CancelRemoval(trans, obj, s.Cursor()); return null; } if (s.Count() > 0 && !s.BeforeFirst()) { s.MoveForward(); } PrepareInsert(s.Cursor()); _keys[s.Cursor()] = ApplyNewAddPatch(trans, obj); } else { Db4objects.Db4o.Internal.Btree.BTreeNode childNode = Child(reader, s.Cursor()); Db4objects.Db4o.Internal.Btree.BTreeNode childNodeOrSplit = childNode.Add(trans, preparedComparison, obj); if (childNodeOrSplit == null) { return null; } PrepareWrite(trans); SetStateDirty(); _keys[s.Cursor()] = childNode._keys[0]; if (childNode != childNodeOrSplit) { int splitCursor = s.Cursor() + 1; PrepareInsert(splitCursor); _keys[splitCursor] = childNodeOrSplit._keys[0]; _children[splitCursor] = childNodeOrSplit; } } if (MustSplit()) { return Split(trans); } if (s.Cursor() == 0) { return this; } return null; } private bool MustSplit() { return _count >= _btree.NodeSize(); } private BTreeAdd ApplyNewAddPatch(Transaction trans, object obj) { SizeIncrement(trans); return new BTreeAdd(trans, obj); } private void CancelRemoval(Transaction trans, object obj, int index) { BTreeUpdate patch = (BTreeUpdate)KeyPatch(index); BTreeUpdate nextPatch = patch.RemoveFor(trans); _keys[index] = NewCancelledRemoval(trans, patch.GetObject(), obj, nextPatch); SizeIncrement(trans); } private BTreePatch NewCancelledRemoval(Transaction trans, object originalObject, object currentObject, BTreeUpdate existingPatches) { return new BTreeCancelledRemoval(trans, originalObject, currentObject, existingPatches ); } private void SizeIncrement(Transaction trans) { _btree.SizeChanged(trans, this, 1); } private bool WasRemoved(Transaction trans, Searcher s) { if (!s.FoundMatch()) { return false; } BTreePatch patch = KeyPatch(trans, s.Cursor()); return patch != null && patch.IsRemove(); } internal BTreeNodeSearchResult SearchLeaf(Transaction trans, IPreparedComparison preparedComparison, SearchTarget target) { ByteArrayBuffer reader = PrepareRead(trans); Searcher s = Search(trans, preparedComparison, reader, target); if (!_isLeaf) { return Child(reader, s.Cursor()).SearchLeaf(trans, preparedComparison, target); } if (!s.FoundMatch() || target == SearchTarget.Any || target == SearchTarget.Highest) { return new BTreeNodeSearchResult(trans, reader, Btree(), s, this); } if (target == SearchTarget.Lowest) { BTreeNodeSearchResult res = FindLowestLeafMatch(trans, preparedComparison, s.Cursor () - 1); if (res != null) { return res; } return CreateMatchingSearchResult(trans, reader, s.Cursor()); } throw new InvalidOperationException(); } private BTreeNodeSearchResult FindLowestLeafMatch(Transaction trans, IPreparedComparison preparedComparison, int index) { return FindLowestLeafMatch(trans, preparedComparison, PrepareRead(trans), index); } private BTreeNodeSearchResult FindLowestLeafMatch(Transaction trans, IPreparedComparison preparedComparison, ByteArrayBuffer reader, int index) { if (index >= 0) { if (!CompareEquals(preparedComparison, trans, reader, index)) { return null; } if (index > 0) { BTreeNodeSearchResult res = FindLowestLeafMatch(trans, preparedComparison, reader , index - 1); if (res != null) { return res; } return CreateMatchingSearchResult(trans, reader, index); } } Db4objects.Db4o.Internal.Btree.BTreeNode node = PreviousNode(); if (node != null) { ByteArrayBuffer nodeReader = node.PrepareRead(trans); BTreeNodeSearchResult res = node.FindLowestLeafMatch(trans, preparedComparison, nodeReader , node.LastIndex()); if (res != null) { return res; } } if (index < 0) { return null; } return CreateMatchingSearchResult(trans, reader, index); } private bool CompareEquals(IPreparedComparison preparedComparison, Transaction trans , ByteArrayBuffer reader, int index) { if (CanWrite()) { return CompareInWriteMode(preparedComparison, index) == 0; } return CompareInReadMode(trans, preparedComparison, reader, index) == 0; } private BTreeNodeSearchResult CreateMatchingSearchResult(Transaction trans, ByteArrayBuffer reader, int index) { return new BTreeNodeSearchResult(trans, reader, Btree(), this, index, true); } public bool CanWrite() { return _keys != null; } internal Db4objects.Db4o.Internal.Btree.BTreeNode Child(int index) { if (_children[index] is Db4objects.Db4o.Internal.Btree.BTreeNode) { return (Db4objects.Db4o.Internal.Btree.BTreeNode)_children[index]; } return ProduceChild(index, ((int)_children[index])); } internal Db4objects.Db4o.Internal.Btree.BTreeNode Child(ByteArrayBuffer reader, int index) { if (ChildLoaded(index)) { return (Db4objects.Db4o.Internal.Btree.BTreeNode)_children[index]; } return ProduceChild(index, ChildID(reader, index)); } private Db4objects.Db4o.Internal.Btree.BTreeNode ProduceChild(int index, int childID ) { Db4objects.Db4o.Internal.Btree.BTreeNode child = _btree.ProduceNode(childID); if (_children != null) { _children[index] = child; } return child; } private int ChildID(ByteArrayBuffer reader, int index) { if (_children == null) { SeekChild(reader, index); return reader.ReadInt(); } return ChildID(index); } private int ChildID(int index) { if (ChildLoaded(index)) { return ((Db4objects.Db4o.Internal.Btree.BTreeNode)_children[index]).GetID(); } return ((int)_children[index]); } private bool ChildLoaded(int index) { if (_children == null) { return false; } return _children[index] is Db4objects.Db4o.Internal.Btree.BTreeNode; } private bool ChildCanSupplyFirstKey(int index) { if (!ChildLoaded(index)) { return false; } return ((Db4objects.Db4o.Internal.Btree.BTreeNode)_children[index]).CanWrite(); } public void Commit(Transaction trans) { CommitOrRollback(trans, true); } internal void CommitOrRollback(Transaction trans, bool isCommit) { if (DTrace.enabled) { DTrace.BtreeNodeCommitOrRollback.Log(GetID()); } if (_dead) { return; } if (!_isLeaf) { return; } if (!IsDirty(trans)) { return; } object keyZero = _keys[0]; object[] tempKeys = new object[_btree.NodeSize()]; int count = 0; for (int i = 0; i < _count; i++) { object key = _keys[i]; BTreePatch patch = KeyPatch(i); if (patch != null) { key = isCommit ? patch.Commit(trans, _btree, this) : patch.Rollback(trans, _btree ); } if (key != No4.Instance) { tempKeys[count] = key; count++; } } _keys = tempKeys; _count = count; if (FreeIfEmpty(trans)) { return; } SetStateDirty(); // TODO: Merge nodes here on low _count value. if (_keys[0] != keyZero) { TellParentAboutChangedKey(trans); } } private bool FreeIfEmpty(Transaction trans) { return FreeIfEmpty(trans, _count); } private bool FreeIfEmpty(Transaction trans, int count) { if (count > 0) { return false; } if (IsRoot()) { return false; } Free((LocalTransaction)trans); return true; } private bool IsRoot() { return _btree.Root() == this; } public override bool Equals(object obj) { if (this == obj) { return true; } if (!(obj is Db4objects.Db4o.Internal.Btree.BTreeNode)) { return false; } Db4objects.Db4o.Internal.Btree.BTreeNode other = (Db4objects.Db4o.Internal.Btree.BTreeNode )obj; return GetID() == other.GetID(); } public override int GetHashCode() { return GetID(); } public override void Free(LocalTransaction trans) { _dead = true; if (!IsRoot()) { Db4objects.Db4o.Internal.Btree.BTreeNode parent = _btree.ProduceNode(_parentID); parent.RemoveChild(trans, this); } PointPreviousTo(trans, _nextID); PointNextTo(trans, _previousID); base.Free((LocalTransaction)trans); _btree.RemoveNode(this); _btree.NotifyDeleted(trans, this); } internal void HoldChildrenAsIDs() { if (_children == null) { return; } for (int i = 0; i < _count; i++) { if (_children[i] is Db4objects.Db4o.Internal.Btree.BTreeNode) { _children[i] = ((Db4objects.Db4o.Internal.Btree.BTreeNode)_children[i]).GetID(); } } } private void RemoveChild(Transaction trans, Db4objects.Db4o.Internal.Btree.BTreeNode child) { PrepareWrite(trans); SetStateDirty(); int id = child.GetID(); for (int i = 0; i < _count; i++) { if (ChildID(i) == id) { if (FreeIfEmpty(trans, _count - 1)) { return; } Remove(i); if (i < 1) { TellParentAboutChangedKey(trans); } if (_count == 0) { // root node empty case only, have to turn it into a leaf _isLeaf = true; } return; } } throw new InvalidOperationException("child not found"); } private void KeyChanged(Transaction trans, Db4objects.Db4o.Internal.Btree.BTreeNode child) { PrepareWrite(trans); SetStateDirty(); int id = child.GetID(); for (int i = 0; i < _count; i++) { if (ChildID(i) == id) { _keys[i] = child._keys[0]; _children[i] = child; KeyChanged(trans, i); return; } } throw new InvalidOperationException("child not found"); } private void TellParentAboutChangedKey(Transaction trans) { if (!IsRoot()) { Db4objects.Db4o.Internal.Btree.BTreeNode parent = _btree.ProduceNode(_parentID); parent.KeyChanged(trans, this); } } private bool IsDirty(Transaction trans) { if (!CanWrite()) { return false; } for (int i = 0; i < _count; i++) { if (KeyPatch(trans, i) != null) { return true; } } return false; } private int CompareInWriteMode(IPreparedComparison preparedComparison, int index) { return -preparedComparison.CompareTo(Key(index)); } private int CompareInReadMode(Transaction trans, IPreparedComparison preparedComparison , ByteArrayBuffer reader, int index) { SeekKey(reader, index); return -preparedComparison.CompareTo(KeyHandler().ReadIndexEntry(trans.Context(), reader)); } public int Count() { return _count; } private int EntryLength() { int len = KeyHandler().LinkLength(); if (!_isLeaf) { len += Const4.IdLength; } return len; } public int FirstKeyIndex(Transaction trans) { for (int ix = 0; ix < _count; ix++) { if (IndexIsValid(trans, ix)) { return ix; } } return -1; } public int LastKeyIndex(Transaction trans) { for (int ix = _count - 1; ix >= 0; ix--) { if (IndexIsValid(trans, ix)) { return ix; } } return -1; } public bool IndexIsValid(Transaction trans, int index) { if (!CanWrite()) { return true; } BTreePatch patch = KeyPatch(index); if (patch == null) { return true; } return patch.Key(trans) != No4.Instance; } private object FirstKey(Transaction trans) { int index = FirstKeyIndex(trans); if (-1 == index) { return No4.Instance; } return InternalKey(trans, index); } public override byte GetIdentifier() { return Const4.BtreeNode; } private void PrepareInsert(int pos) { if (pos > LastIndex()) { _count++; return; } int len = _count - pos; System.Array.Copy(_keys, pos, _keys, pos + 1, len); if (_children != null) { System.Array.Copy(_children, pos, _children, pos + 1, len); } _count++; } private void Remove(int pos) { if (DTrace.enabled) { DTrace.BtreeNodeRemove.Log(GetID()); } int len = _count - pos; _count--; System.Array.Copy(_keys, pos + 1, _keys, pos, len); _keys[_count] = null; if (_children != null) { System.Array.Copy(_children, pos + 1, _children, pos, len); _children[_count] = null; } } internal object Key(int index) { object obj = _keys[index]; if (obj is BTreePatch) { return ((BTreePatch)obj).GetObject(); } return obj; } public object Key(Transaction trans, int index) { return Key(trans, PrepareRead(trans), index); } internal object Key(Transaction trans, ByteArrayBuffer reader, int index) { if (CanWrite()) { return InternalKey(trans, index); } if (reader == null) { reader = PrepareRead(trans); } if (CanWrite()) { return InternalKey(trans, index); } SeekKey(reader, index); return KeyHandler().ReadIndexEntry(trans.Context(), reader); } private object InternalKey(Transaction trans, int index) { BTreePatch patch = KeyPatch(index); if (patch == null) { return _keys[index]; } return patch.Key(trans); } private BTreePatch KeyPatch(int index) { object obj = _keys[index]; if (obj is BTreePatch) { return (BTreePatch)obj; } return null; } internal BTreePatch KeyPatch(Transaction trans, int index) { object obj = _keys[index]; if (obj is BTreePatch) { return ((BTreePatch)obj).ForTransaction(trans); } return null; } private IIndexable4 KeyHandler() { return _btree.KeyHandler(); } public override int OwnLength() { return SlotLeadingLength + (_count * EntryLength()) + Const4.BracketsBytes; } internal ByteArrayBuffer PrepareRead(Transaction trans) { BTreeNodeCacheEntry cacheEntry = Btree().CacheEntry(this); if (CanWrite()) { return null; } if (IsNew()) { return null; } Transaction systemTransaction = trans.SystemTransaction(); ByteArrayBuffer buffer = cacheEntry.Buffer(); if (buffer != null) { // Cache hit, still unread buffer.Seek(0); Read(systemTransaction, buffer); cacheEntry.Buffer(null); _btree.AddToProcessing(this); return null; } buffer = ProduceReadBuffer(systemTransaction); ReadNodeHeader(buffer); cacheEntry.Buffer(buffer); return buffer; } internal void PrepareWrite(Transaction trans) { if (_dead) { return; } BTreeNodeCacheEntry cacheEntry = Btree().CacheEntry(this); if (CanWrite()) { return; } ByteArrayBuffer buffer = cacheEntry.Buffer(); if (buffer != null) { buffer.Seek(0); Read(trans.SystemTransaction(), buffer); cacheEntry.Buffer(null); } else { Read(trans.SystemTransaction()); } _btree.AddToProcessing(this); } private void PrepareArrays() { if (CanWrite()) { return; } _keys = new object[_btree.NodeSize()]; if (!_isLeaf) { _children = new object[_btree.NodeSize()]; } } private void ReadNodeHeader(ByteArrayBuffer reader) { _count = reader.ReadInt(); byte leafByte = reader.ReadByte(); _isLeaf = (leafByte == 1); _parentID = reader.ReadInt(); _previousID = reader.ReadInt(); _nextID = reader.ReadInt(); } public override void ReadThis(Transaction trans, ByteArrayBuffer reader) { ReadNodeHeader(reader); PrepareArrays(); bool isInner = !_isLeaf; for (int i = 0; i < _count; i++) { _keys[i] = KeyHandler().ReadIndexEntry(trans.Context(), reader); if (isInner) { _children[i] = reader.ReadInt(); } } } public void Remove(Transaction trans, int index) { if (!_isLeaf) { throw new InvalidOperationException(); } PrepareWrite(trans); SetStateDirty(); object obj = null; BTreePatch patch = KeyPatch(index); if (patch == null) { obj = _keys[index]; } else { BTreePatch transPatch = patch.ForTransaction(trans); if (transPatch != null) { obj = transPatch.GetObject(); } else { // There could be more than one patch with different object // identities. We have no means to determine a "best" object // so we just take any one. Could be problematic. obj = patch.GetObject(); } } Remove(trans, obj, index); } public bool Remove(Transaction trans, object obj, int index) { if (!_isLeaf) { throw new InvalidOperationException(); } PrepareWrite(trans); SetStateDirty(); BTreePatch patch = KeyPatch(index); // no patch, no problem, can remove if (patch == null) { _keys[index] = ApplyNewRemovePatch(trans, obj); KeyChanged(trans, index); return true; } BTreePatch transPatch = patch.ForTransaction(trans); if (transPatch != null) { if (transPatch.IsAdd()) { CancelAdding(trans, index); return true; } if (transPatch.IsCancelledRemoval()) { BTreeRemove removePatch = ApplyNewRemovePatch(trans, transPatch.GetObject()); _keys[index] = ((BTreeUpdate)patch).ReplacePatch(transPatch, removePatch); KeyChanged(trans, index); return true; } } else { // If the patch is a removal of a cancelled removal for another // transaction, we need one for this transaction also. if (!patch.IsAdd()) { ((BTreeUpdate)patch).Append(ApplyNewRemovePatch(trans, obj)); return true; } } return false; } public void Remove(Transaction trans, IPreparedComparison preparedComparison, object obj, int index) { if (Remove(trans, obj, index)) { return; } // now we try if removal is OK for the next element in this node if (index != LastIndex()) { if (CompareInWriteMode(preparedComparison, index + 1) != 0) { return; } Remove(trans, preparedComparison, obj, index + 1); return; } // nothing else worked so far, move on to the next node, try there Db4objects.Db4o.Internal.Btree.BTreeNode node = NextNode(); if (node == null) { return; } node.PrepareWrite(trans); if (node.CompareInWriteMode(preparedComparison, 0) != 0) { return; } node.Remove(trans, preparedComparison, obj, 0); } private void CancelAdding(Transaction trans, int index) { _btree.NotifyRemoveListener(new TransactionContext(trans, KeyPatch(index).GetObject ())); if (FreeIfEmpty(trans, _count - 1)) { SizeDecrement(trans); return; } Remove(index); KeyChanged(trans, index); SizeDecrement(trans); } private void SizeDecrement(Transaction trans) { _btree.SizeChanged(trans, this, -1); } private int LastIndex() { return _count - 1; } private BTreeRemove ApplyNewRemovePatch(Transaction trans, object key) { SizeDecrement(trans); return new BTreeRemove(trans, key); } private void KeyChanged(Transaction trans, int index) { if (index == 0) { TellParentAboutChangedKey(trans); } } internal void Rollback(Transaction trans) { CommitOrRollback(trans, false); } private Searcher Search(Transaction trans, IPreparedComparison preparedComparison , ByteArrayBuffer reader) { return Search(trans, preparedComparison, reader, SearchTarget.Any); } private Searcher Search(Transaction trans, IPreparedComparison preparedComparison , ByteArrayBuffer reader, SearchTarget target) { Searcher s = new Searcher(target, _count); if (CanWrite()) { while (s.Incomplete()) { s.ResultIs(CompareInWriteMode(preparedComparison, s.Cursor())); } } else { while (s.Incomplete()) { s.ResultIs(CompareInReadMode(trans, preparedComparison, reader, s.Cursor())); } } return s; } private void SeekAfterKey(ByteArrayBuffer reader, int ix) { SeekKey(reader, ix); reader._offset += KeyHandler().LinkLength(); } private void SeekChild(ByteArrayBuffer reader, int ix) { SeekAfterKey(reader, ix); } private void SeekKey(ByteArrayBuffer reader, int ix) { reader._offset = SlotLeadingLength + (EntryLength() * ix); } private Db4objects.Db4o.Internal.Btree.BTreeNode Split(Transaction trans) { Db4objects.Db4o.Internal.Btree.BTreeNode res = new Db4objects.Db4o.Internal.Btree.BTreeNode (_btree, _btree._halfNodeSize, _isLeaf, _parentID, GetID(), _nextID); System.Array.Copy(_keys, _btree._halfNodeSize, res._keys, 0, _btree._halfNodeSize ); for (int i = _btree._halfNodeSize; i < _keys.Length; i++) { _keys[i] = null; } if (_children != null) { res._children = new object[_btree.NodeSize()]; System.Array.Copy(_children, _btree._halfNodeSize, res._children, 0, _btree._halfNodeSize ); for (int i = _btree._halfNodeSize; i < _children.Length; i++) { _children[i] = null; } } _count = _btree._halfNodeSize; res.Write(trans.SystemTransaction()); _btree.AddNode(res); int splitID = res.GetID(); PointNextTo(trans, splitID); SetNextID(trans, splitID); if (_children != null) { for (int i = 0; i < _btree._halfNodeSize; i++) { if (res._children[i] == null) { break; } res.Child(i).SetParentID(trans, splitID); } } _btree.NotifySplit(trans, this, res); return res; } private void PointNextTo(Transaction trans, int id) { if (_nextID != 0) { NextNode().SetPreviousID(trans, id); } } private void PointPreviousTo(Transaction trans, int id) { if (_previousID != 0) { PreviousNode().SetNextID(trans, id); } } public Db4objects.Db4o.Internal.Btree.BTreeNode PreviousNode() { if (_previousID == 0) { return null; } return _btree.ProduceNode(_previousID); } public Db4objects.Db4o.Internal.Btree.BTreeNode NextNode() { if (_nextID == 0) { return null; } return _btree.ProduceNode(_nextID); } internal BTreePointer FirstPointer(Transaction trans) { ByteArrayBuffer reader = PrepareRead(trans); if (_isLeaf) { return LeafFirstPointer(trans, reader); } return BranchFirstPointer(trans, reader); } private BTreePointer BranchFirstPointer(Transaction trans, ByteArrayBuffer reader ) { for (int i = 0; i < _count; i++) { BTreePointer childFirstPointer = Child(reader, i).FirstPointer(trans); if (childFirstPointer != null) { return childFirstPointer; } } return null; } private BTreePointer LeafFirstPointer(Transaction trans, ByteArrayBuffer reader) { int index = FirstKeyIndex(trans); if (index == -1) { return null; } return new BTreePointer(trans, reader, this, index); } public BTreePointer LastPointer(Transaction trans) { ByteArrayBuffer reader = PrepareRead(trans); if (_isLeaf) { return LeafLastPointer(trans, reader); } return BranchLastPointer(trans, reader); } private BTreePointer BranchLastPointer(Transaction trans, ByteArrayBuffer reader) { for (int i = _count - 1; i >= 0; i--) { BTreePointer childLastPointer = Child(reader, i).LastPointer(trans); if (childLastPointer != null) { return childLastPointer; } } return null; } private BTreePointer LeafLastPointer(Transaction trans, ByteArrayBuffer reader) { int index = LastKeyIndex(trans); if (index == -1) { return null; } return new BTreePointer(trans, reader, this, index); } public void Purge() { if (_dead) { _keys = null; _children = null; return; } if (!IsPatched()) { return; } HoldChildrenAsIDs(); _btree.AddNode(this); } private bool IsPatched() { if (_dead) { return false; } if (!CanWrite()) { return false; } for (int i = 0; i < _count; i++) { if (_keys[i] is BTreePatch) { return true; } } return false; } private void SetParentID(Transaction trans, int id) { PrepareWrite(trans); SetStateDirty(); _parentID = id; } private void SetPreviousID(Transaction trans, int id) { PrepareWrite(trans); SetStateDirty(); _previousID = id; } private void SetNextID(Transaction trans, int id) { PrepareWrite(trans); SetStateDirty(); _nextID = id; } public void TraverseKeys(Transaction trans, IVisitor4 visitor) { ByteArrayBuffer reader = PrepareRead(trans); if (_isLeaf) { for (int i = 0; i < _count; i++) { object obj = Key(trans, reader, i); if (obj != No4.Instance) { visitor.Visit(obj); } } } else { for (int i = 0; i < _count; i++) { Child(reader, i).TraverseKeys(trans, visitor); } } } public override bool WriteObjectBegin() { if (_dead) { return false; } if (!CanWrite()) { return false; } return base.WriteObjectBegin(); } public override void WriteThis(Transaction trans, ByteArrayBuffer buffer) { int count = 0; int startOffset = buffer._offset; IContext context = trans.Context(); buffer.IncrementOffset(CountLeafAnd3LinkLength); if (_isLeaf) { for (int i = 0; i < _count; i++) { object obj = InternalKey(trans, i); if (obj != No4.Instance) { count++; KeyHandler().WriteIndexEntry(context, buffer, obj); } } } else { for (int i = 0; i < _count; i++) { if (ChildCanSupplyFirstKey(i)) { Db4objects.Db4o.Internal.Btree.BTreeNode child = (Db4objects.Db4o.Internal.Btree.BTreeNode )_children[i]; object childKey = child.FirstKey(trans); if (childKey != No4.Instance) { count++; KeyHandler().WriteIndexEntry(context, buffer, childKey); buffer.WriteIDOf(trans, child); } } else { count++; KeyHandler().WriteIndexEntry(context, buffer, Key(i)); buffer.WriteIDOf(trans, _children[i]); } } } int endOffset = buffer._offset; buffer._offset = startOffset; buffer.WriteInt(count); buffer.WriteByte(_isLeaf ? (byte)1 : (byte)0); buffer.WriteInt(_parentID); buffer.WriteInt(_previousID); buffer.WriteInt(_nextID); buffer._offset = endOffset; } public override string ToString() { if (_count == 0) { return "Node " + GetID() + " not loaded"; } string str = "\nBTreeNode"; str += "\nid: " + GetID(); str += "\nparent: " + _parentID; str += "\nprevious: " + _previousID; str += "\nnext: " + _nextID; str += "\ncount:" + _count; str += "\nleaf:" + _isLeaf + "\n"; if (CanWrite()) { str += " { "; bool first = true; for (int i = 0; i < _count; i++) { if (_keys[i] != null) { if (!first) { str += ", "; } str += _keys[i].ToString(); first = false; } } str += " }"; } return str; } public void DebugLoadFully(Transaction trans) { PrepareWrite(trans); if (_isLeaf) { return; } for (int i = 0; i < _count; ++i) { if (_children[i] is int) { _children[i] = Btree().ProduceNode(((int)_children[i])); } ((Db4objects.Db4o.Internal.Btree.BTreeNode)_children[i]).DebugLoadFully(trans); } } public static void DefragIndex(DefragmentContextImpl context, IIndexable4 keyHandler ) { // count int count = context.ReadInt(); // leafByte byte leafByte = context.ReadByte(); bool isLeaf = (leafByte == 1); context.CopyID(); // parent ID context.CopyID(); // previous ID context.CopyID(); // next ID for (int i = 0; i < count; i++) { keyHandler.DefragIndexEntry(context); if (!isLeaf) { context.CopyID(); } } } public bool IsLeaf() { return _isLeaf; } /// This traversal goes over all nodes, not just leafs internal void TraverseAllNodes(Transaction trans, IVisitor4 command) { ByteArrayBuffer reader = PrepareRead(trans); command.Visit(this); if (_isLeaf) { return; } for (int childIdx = 0; childIdx < _count; childIdx++) { Child(reader, childIdx).TraverseAllNodes(trans, command); } } public int Size(Transaction trans) { PrepareRead(trans); if (!CanWrite()) { return _count; } int size = 0; for (int i = 0; i < _count; i++) { BTreePatch keyPatch = KeyPatch(i); if (keyPatch != null) { size += keyPatch.SizeDiff(trans); } else { size++; } } return size; } public override Db4objects.Db4o.Internal.Slots.SlotChangeFactory SlotChangeFactory () { return _btree.SlotChangeFactory(); } public override ITransactionalIdSystem IdSystem(Transaction trans) { return _btree.IdSystem(trans); } public void ToReadMode() { if (IsNew()) { return; } if (!CanWrite()) { return; } if (IsDirty()) { return; } if (IsPatched()) { return; } _keys = null; _children = null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeRangeSingle.cs0000644000175000017500000001360511700531646031320 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Btree.Algebra; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeRangeSingle : IBTreeRange { private sealed class _IComparison4_14 : IComparison4 { public _IComparison4_14() { } public int Compare(object x, object y) { Db4objects.Db4o.Internal.Btree.BTreeRangeSingle xRange = (Db4objects.Db4o.Internal.Btree.BTreeRangeSingle )x; Db4objects.Db4o.Internal.Btree.BTreeRangeSingle yRange = (Db4objects.Db4o.Internal.Btree.BTreeRangeSingle )y; return xRange.First().CompareTo(yRange.First()); } } public static readonly IComparison4 Comparison = new _IComparison4_14(); private readonly Db4objects.Db4o.Internal.Transaction _transaction; private readonly BTree _btree; private readonly BTreePointer _first; private readonly BTreePointer _end; public BTreeRangeSingle(Db4objects.Db4o.Internal.Transaction transaction, BTree btree , BTreePointer first, BTreePointer end) { if (transaction == null || btree == null) { throw new ArgumentNullException(); } _transaction = transaction; _btree = btree; _first = first; _end = end; } public virtual void Accept(IBTreeRangeVisitor visitor) { visitor.Visit(this); } public virtual bool IsEmpty() { return BTreePointer.Equals(_first, _end); } public virtual int Size() { if (IsEmpty()) { return 0; } // TODO: This was an attempt to improve size calculation. // Since all nodes are read, there is no improvement. // BTreeNode currentNode = _first.node(); // int sizeOnFirst = currentNode.count() - _first.index(); // // BTreeNode endNode = _end == null ? null : _end.node(); // int substractForEnd = // (endNode == null) ? 0 : (endNode.count() - _end.index()); // // int size = sizeOnFirst - substractForEnd; // while(! currentNode.equals(endNode)){ // currentNode = currentNode.nextNode(); // if(currentNode == null){ // break; // } // currentNode.prepareRead(transaction()); // size += currentNode.count(); // } // return size; int size = 0; IEnumerator i = Keys(); while (i.MoveNext()) { ++size; } return size; } public virtual IEnumerator Pointers() { return new BTreeRangePointerIterator(this); } public virtual IEnumerator Keys() { return new BTreeRangeKeyIterator(this); } public BTreePointer End() { return _end; } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return _transaction; } public virtual BTreePointer First() { return _first; } public virtual IBTreeRange Greater() { return NewBTreeRangeSingle(_end, null); } public virtual IBTreeRange Union(IBTreeRange other) { if (null == other) { throw new ArgumentNullException(); } return new BTreeRangeSingleUnion(this).Dispatch(other); } public virtual bool Adjacent(Db4objects.Db4o.Internal.Btree.BTreeRangeSingle range ) { return BTreePointer.Equals(_end, range._first) || BTreePointer.Equals(range._end, _first); } public virtual bool Overlaps(Db4objects.Db4o.Internal.Btree.BTreeRangeSingle range ) { return FirstOverlaps(this, range) || FirstOverlaps(range, this); } private bool FirstOverlaps(Db4objects.Db4o.Internal.Btree.BTreeRangeSingle x, Db4objects.Db4o.Internal.Btree.BTreeRangeSingle y) { return BTreePointer.LessThan(y._first, x._end) && BTreePointer.LessThan(x._first, y._end); } public virtual IBTreeRange ExtendToFirst() { return NewBTreeRangeSingle(FirstBTreePointer(), _end); } public virtual IBTreeRange ExtendToLast() { return NewBTreeRangeSingle(_first, null); } public virtual IBTreeRange Smaller() { return NewBTreeRangeSingle(FirstBTreePointer(), _first); } public virtual Db4objects.Db4o.Internal.Btree.BTreeRangeSingle NewBTreeRangeSingle (BTreePointer first, BTreePointer end) { return new Db4objects.Db4o.Internal.Btree.BTreeRangeSingle(Transaction(), _btree, first, end); } public virtual IBTreeRange NewEmptyRange() { return NewBTreeRangeSingle(null, null); } private BTreePointer FirstBTreePointer() { return Btree().FirstPointer(Transaction()); } private BTree Btree() { return _btree; } public virtual IBTreeRange Intersect(IBTreeRange range) { if (null == range) { throw new ArgumentNullException(); } return new BTreeRangeSingleIntersect(this).Dispatch(range); } public virtual IBTreeRange ExtendToLastOf(IBTreeRange range) { Db4objects.Db4o.Internal.Btree.BTreeRangeSingle rangeImpl = CheckRangeArgument(range ); return NewBTreeRangeSingle(_first, rangeImpl._end); } public override string ToString() { return "BTreeRangeSingle(first=" + _first + ", end=" + _end + ")"; } private Db4objects.Db4o.Internal.Btree.BTreeRangeSingle CheckRangeArgument(IBTreeRange range) { if (null == range) { throw new ArgumentNullException(); } Db4objects.Db4o.Internal.Btree.BTreeRangeSingle rangeImpl = (Db4objects.Db4o.Internal.Btree.BTreeRangeSingle )range; if (Btree() != rangeImpl.Btree()) { throw new ArgumentException(); } return rangeImpl; } public virtual BTreePointer LastPointer() { if (_end == null) { return Btree().LastPointer(Transaction()); } return _end.Previous(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/SearchTarget.cs0000644000175000017500000000143111700531646030546 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Btree { /// public sealed class SearchTarget { public static readonly Db4objects.Db4o.Internal.Btree.SearchTarget Lowest = new Db4objects.Db4o.Internal.Btree.SearchTarget ("Lowest"); public static readonly Db4objects.Db4o.Internal.Btree.SearchTarget Any = new Db4objects.Db4o.Internal.Btree.SearchTarget ("Any"); public static readonly Db4objects.Db4o.Internal.Btree.SearchTarget Highest = new Db4objects.Db4o.Internal.Btree.SearchTarget("Highest"); private readonly string _target; public SearchTarget(string target) { _target = target; } public override string ToString() { return _target; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeNodeSearchResult.cs0000644000175000017500000000443511700531646032335 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public class BTreeNodeSearchResult { private readonly Transaction _transaction; private readonly BTree _btree; private readonly BTreePointer _pointer; private readonly bool _foundMatch; internal BTreeNodeSearchResult(Transaction transaction, BTree btree, BTreePointer pointer, bool foundMatch) { if (null == transaction || null == btree) { throw new ArgumentNullException(); } _transaction = transaction; _btree = btree; _pointer = pointer; _foundMatch = foundMatch; } internal BTreeNodeSearchResult(Transaction trans, ByteArrayBuffer nodeReader, BTree btree, BTreeNode node, int cursor, bool foundMatch) : this(trans, btree, PointerOrNull (trans, nodeReader, node, cursor), foundMatch) { } internal BTreeNodeSearchResult(Transaction trans, ByteArrayBuffer nodeReader, BTree btree, Searcher searcher, BTreeNode node) : this(trans, btree, NextPointerIf(PointerOrNull (trans, nodeReader, node, searcher.Cursor()), searcher.IsGreater()), searcher.FoundMatch ()) { } private static BTreePointer NextPointerIf(BTreePointer pointer, bool condition) { if (null == pointer) { return null; } if (condition) { return pointer.Next(); } return pointer; } private static BTreePointer PointerOrNull(Transaction trans, ByteArrayBuffer nodeReader , BTreeNode node, int cursor) { return node == null ? null : new BTreePointer(trans, nodeReader, node, cursor); } public virtual IBTreeRange CreateIncludingRange(Db4objects.Db4o.Internal.Btree.BTreeNodeSearchResult end) { BTreePointer firstPointer = FirstValidPointer(); BTreePointer endPointer = end._foundMatch ? end._pointer.Next() : end.FirstValidPointer (); return new BTreeRangeSingle(_transaction, _btree, firstPointer, endPointer); } public virtual BTreePointer FirstValidPointer() { if (null == _pointer) { return null; } if (_pointer.IsValid()) { return _pointer; } return _pointer.Next(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/IFieldIndexKey.cs0000644000175000017500000000030611700531646030767 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Btree { public interface IFieldIndexKey { int ParentID(); object Value(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreeRangeKeyIterator.cs0000644000175000017500000000063711700531646032342 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { internal class BTreeRangeKeyIterator : AbstractBTreeRangeIterator { public BTreeRangeKeyIterator(BTreeRangeSingle range) : base(range) { } public override object Current { get { return CurrentPointer().Key(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/AbstractBTreeRangeIterator.cs0000644000175000017500000000230211700531646033344 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { public abstract class AbstractBTreeRangeIterator : IEnumerator { private readonly BTreeRangeSingle _range; private BTreePointer _cursor; private BTreePointer _current; public AbstractBTreeRangeIterator(BTreeRangeSingle range) { _range = range; _cursor = range.First(); } public virtual bool MoveNext() { if (ReachedEnd(_cursor)) { _current = null; return false; } _current = _cursor; _cursor = _cursor.Next(); return true; } public virtual void Reset() { _cursor = _range.First(); } protected virtual BTreePointer CurrentPointer() { if (null == _current) { throw new InvalidOperationException(); } return _current; } private bool ReachedEnd(BTreePointer cursor) { if (cursor == null) { return true; } if (_range.End() == null) { return false; } return _range.End().Equals(cursor); } public abstract object Current { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/IBTreeRangeVisitor.cs0000644000175000017500000000046411700531646031646 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { /// public interface IBTreeRangeVisitor { void Visit(BTreeRangeSingle range); void Visit(BTreeRangeUnion union); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/FieldIndexKeyHandler.cs0000644000175000017500000000644111700531646032162 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Btree { /// public class FieldIndexKeyHandler : IIndexable4 { private readonly IIndexable4 _valueHandler; private readonly IDHandler _parentIdHandler; public FieldIndexKeyHandler(IIndexable4 delegate_) { _parentIdHandler = new IDHandler(); _valueHandler = delegate_; } public virtual int LinkLength() { return _valueHandler.LinkLength() + Const4.IntLength; } public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer a_reader) { // TODO: could read int directly here with a_reader.readInt() int parentID = ReadParentID(context, a_reader); object objPart = _valueHandler.ReadIndexEntry(context, a_reader); if (parentID < 0) { objPart = null; parentID = -parentID; } return new FieldIndexKeyImpl(parentID, objPart); } private int ReadParentID(IContext context, ByteArrayBuffer a_reader) { return ((int)_parentIdHandler.ReadIndexEntry(context, a_reader)); } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj) { IFieldIndexKey composite = (IFieldIndexKey)obj; int parentID = composite.ParentID(); object value = composite.Value(); if (value == null) { parentID = -parentID; } _parentIdHandler.Write(parentID, writer); _valueHandler.WriteIndexEntry(context, writer, composite.Value()); } public virtual IIndexable4 ValueHandler() { return _valueHandler; } public virtual void DefragIndexEntry(DefragmentContextImpl context) { _parentIdHandler.DefragIndexEntry(context); _valueHandler.DefragIndexEntry(context); } public virtual IPreparedComparison PrepareComparison(IContext context, object fieldIndexKey ) { IFieldIndexKey source = (IFieldIndexKey)fieldIndexKey; IPreparedComparison preparedValueComparison = _valueHandler.PrepareComparison(context , source.Value()); IPreparedComparison preparedParentIdComparison = _parentIdHandler.NewPrepareCompare (source.ParentID()); return new _IPreparedComparison_67(preparedValueComparison, preparedParentIdComparison ); } private sealed class _IPreparedComparison_67 : IPreparedComparison { public _IPreparedComparison_67(IPreparedComparison preparedValueComparison, IPreparedComparison preparedParentIdComparison) { this.preparedValueComparison = preparedValueComparison; this.preparedParentIdComparison = preparedParentIdComparison; } public int CompareTo(object obj) { IFieldIndexKey target = (IFieldIndexKey)obj; try { int delegateResult = preparedValueComparison.CompareTo(target.Value()); if (delegateResult != 0) { return delegateResult; } } catch (IllegalComparisonException) { } // can happen, is expected return preparedParentIdComparison.CompareTo(target.ParentID()); } private readonly IPreparedComparison preparedValueComparison; private readonly IPreparedComparison preparedParentIdComparison; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTreePatch.cs0000644000175000017500000000226311700531646030157 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Internal.Btree { public abstract class BTreePatch { protected readonly Transaction _transaction; protected object _object; public BTreePatch(Transaction transaction, object obj) { _transaction = transaction; _object = obj; } public abstract object Commit(Transaction trans, BTree btree, BTreeNode node); public abstract Db4objects.Db4o.Internal.Btree.BTreePatch ForTransaction(Transaction trans); public virtual object GetObject() { return _object; } public virtual bool IsAdd() { return false; } public virtual bool IsCancelledRemoval() { return false; } public virtual bool IsRemove() { return false; } public abstract object Key(Transaction trans); public abstract object Rollback(Transaction trans, BTree btree); public override string ToString() { if (_object == null) { return "[NULL]"; } return _object.ToString(); } public abstract int SizeDiff(Transaction trans); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Btree/BTree.cs0000644000175000017500000005350511700531646027204 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Caching; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Btree { /// public class BTree : LocalPersistentBase, ITransactionParticipant, IBTreeStructureListener { private readonly BTreeConfiguration _config; private const byte BtreeVersion = (byte)1; private const int DefragmentIncrementOffset = 1 + Const4.IntLength * 2; private readonly IIndexable4 _keyHandler; private BTreeNode _root; /// All instantiated nodes are held in this tree. /// All instantiated nodes are held in this tree. private TreeIntObject _nodes; private int _size; private IVisitor4 _removeListener; private sealed class _TransactionLocal_40 : TransactionLocal { public _TransactionLocal_40() { } // version byte // size, node size public override object InitialValueFor(Transaction transaction) { return 0; } } private readonly TransactionLocal _sizeDeltaInTransaction = new _TransactionLocal_40 (); protected IQueue4 _processing; private int _nodeSize; internal int _halfNodeSize; private IBTreeStructureListener _structureListener; private readonly ICache4 _nodeCache; private TreeIntObject _evictedFromCache; private bool _disposed; public BTree(Transaction trans, BTreeConfiguration config, int id, IIndexable4 keyHandler , int treeNodeSize) : base(config._idSystem) { _config = config; if (null == keyHandler) { throw new ArgumentNullException(); } _nodeSize = treeNodeSize; _nodeCache = CacheFactory.NewLRUIntCache(config._cacheSize); _halfNodeSize = _nodeSize / 2; _nodeSize = _halfNodeSize * 2; _keyHandler = keyHandler; SetID(id); if (IsNew()) { SetStateDirty(); _root = new BTreeNode(this, 0, true, 0, 0, 0); _root.Write(trans.SystemTransaction()); AddNode(_root); Write(trans.SystemTransaction()); } else { SetStateDeactivated(); } } public BTree(Transaction trans, BTreeConfiguration config, IIndexable4 keyHandler ) : this(trans, config, 0, keyHandler) { } public BTree(Transaction trans, BTreeConfiguration config, int id, IIndexable4 keyHandler ) : this(trans, config, id, keyHandler, Config(trans).BTreeNodeSize()) { } public BTree(Transaction trans, int id, IIndexable4 keyHandler) : this(trans, BTreeConfiguration .Default, id, keyHandler) { } public BTree(Transaction trans, int id, IIndexable4 keyHandler, int nodeSize) : this (trans, BTreeConfiguration.Default, id, keyHandler, nodeSize) { } public virtual BTreeNode Root() { return _root; } public virtual int NodeSize() { return _nodeSize; } public virtual void Add(Transaction trans, object key) { KeyCantBeNull(key); IPreparedComparison preparedComparison = _keyHandler.PrepareComparison(trans.Context (), key); Add(trans, preparedComparison, key); } public virtual void Add(Transaction trans, IPreparedComparison preparedComparison , object key) { EnsureActive(trans); Enlist(trans); BTreeNode rootOrSplit = _root.Add(trans, preparedComparison, key); if (rootOrSplit != null && rootOrSplit != _root) { EnsureDirty(trans); _root = new BTreeNode(trans, _root, rootOrSplit); _root.Write(trans.SystemTransaction()); AddNode(_root); } ConvertCacheEvictedNodesToReadMode(); } public virtual object Remove(Transaction trans, object key) { BTreePointer bTreePointer = SearchPointer(trans, key); if (bTreePointer == null) { return null; } object result = bTreePointer.Key(); Enlist(trans); IPreparedComparison preparedComparison = KeyHandler().PrepareComparison(trans.Context (), key); BTreeNode node = bTreePointer.Node(); node.Remove(trans, preparedComparison, key, bTreePointer.Index()); ConvertCacheEvictedNodesToReadMode(); return result; } public virtual IBTreeRange SearchRange(Transaction trans, object key) { KeyCantBeNull(key); return SearchRange(trans, KeyHandler().PrepareComparison(trans.Context(), key)); } public virtual BTreePointer SearchPointer(Transaction trans, object key) { EnsureActive(trans); KeyCantBeNull(key); IPreparedComparison preparedComparison = KeyHandler().PrepareComparison(trans.Context (), key); BTreeNodeSearchResult start = SearchLeaf(trans, preparedComparison, SearchTarget. Lowest); BTreePointer bTreePointer = start.FirstValidPointer(); if (bTreePointer == null) { ConvertCacheEvictedNodesToReadMode(); return null; } object found = bTreePointer.Key(); ConvertCacheEvictedNodesToReadMode(); if (preparedComparison.CompareTo(found) == 0) { return bTreePointer; } return null; } public virtual object Search(Transaction trans, object key) { BTreePointer bTreePointer = SearchPointer(trans, key); if (bTreePointer != null) { return bTreePointer.Key(); } return null; } private IBTreeRange SearchRange(Transaction trans, IPreparedComparison preparedComparison ) { EnsureActive(trans); // TODO: Optimize the following. // Part of the search operates against the same nodes. // As long as the bounds are on one node, the search // should walk the nodes in one go. BTreeNodeSearchResult start = SearchLeaf(trans, preparedComparison, SearchTarget. Lowest); BTreeNodeSearchResult end = SearchLeaf(trans, preparedComparison, SearchTarget.Highest ); IBTreeRange range = start.CreateIncludingRange(end); ConvertCacheEvictedNodesToReadMode(); return range; } private void KeyCantBeNull(object key) { if (null == key) { throw new ArgumentNullException(); } } public virtual IIndexable4 KeyHandler() { return _keyHandler; } public virtual BTreeNodeSearchResult SearchLeaf(Transaction trans, object key, SearchTarget target) { return SearchLeaf(trans, _keyHandler.PrepareComparison(trans.Context(), key), target ); } public virtual BTreeNodeSearchResult SearchLeaf(Transaction trans, IPreparedComparison preparedComparison, SearchTarget target) { EnsureActive(trans); BTreeNodeSearchResult result = _root.SearchLeaf(trans, preparedComparison, target ); ConvertCacheEvictedNodesToReadMode(); return result; } public virtual void Commit(Transaction transaction) { if (_disposed) { return; } UpdateSize(transaction); CommitNodes(transaction); FinishTransaction(transaction); ConvertCacheEvictedNodesToReadMode(); } private void UpdateSize(Transaction transaction) { ByRef sizeInTransaction = SizeIn(transaction); int sizeModification = (((int)sizeInTransaction.value)); if (sizeModification == 0) { return; } EnsureDirty(transaction); _size += sizeModification; sizeInTransaction.value = 0; } private ByRef SizeIn(Transaction trans) { return trans.Get(_sizeDeltaInTransaction); } private void CommitNodes(Transaction trans) { ProcessEachNode(new _IProcedure4_237(trans)); } private sealed class _IProcedure4_237 : IProcedure4 { public _IProcedure4_237(Transaction trans) { this.trans = trans; } public void Apply(object node) { ((BTreeNode)node).Commit(trans); } private readonly Transaction trans; } private void ProcessEachNode(IProcedure4 action) { if (_nodes == null) { return; } ProcessAllNodes(); while (_processing.HasNext()) { action.Apply((BTreeNode)_processing.Next()); } _processing = null; } public virtual void Rollback(Transaction trans) { RollbackNodes(trans); FinishTransaction(trans); ConvertCacheEvictedNodesToReadMode(); } private void FinishTransaction(Transaction trans) { Transaction systemTransaction = trans.SystemTransaction(); WriteAllNodes(systemTransaction); Write(systemTransaction); Purge(); } private void RollbackNodes(Transaction trans) { ProcessEachNode(new _IProcedure4_266(trans)); } private sealed class _IProcedure4_266 : IProcedure4 { public _IProcedure4_266(Transaction trans) { this.trans = trans; } public void Apply(object node) { ((BTreeNode)node).Rollback(trans); } private readonly Transaction trans; } private void WriteAllNodes(Transaction systemTransaction) { if (_nodes == null) { return; } _nodes.Traverse(new _IVisitor4_275(systemTransaction)); } private sealed class _IVisitor4_275 : IVisitor4 { public _IVisitor4_275(Transaction systemTransaction) { this.systemTransaction = systemTransaction; } public void Visit(object obj) { ((BTreeNode)((TreeIntObject)obj).GetObject()).Write(systemTransaction); } private readonly Transaction systemTransaction; } private void Purge() { if (_nodes == null) { return; } Tree temp = _nodes; _nodes = null; _root.HoldChildrenAsIDs(); AddNode(_root); temp.Traverse(new _IVisitor4_294()); for (IEnumerator entryIter = _nodeCache.GetEnumerator(); entryIter.MoveNext(); ) { BTreeNodeCacheEntry entry = ((BTreeNodeCacheEntry)entryIter.Current); entry._node.HoldChildrenAsIDs(); } } private sealed class _IVisitor4_294 : IVisitor4 { public _IVisitor4_294() { } public void Visit(object obj) { BTreeNode node = (BTreeNode)((TreeIntObject)obj).GetObject(); node.Purge(); } } private void ProcessAllNodes() { _processing = new NonblockingQueue(); _nodes.Traverse(new _IVisitor4_311(this)); } private sealed class _IVisitor4_311 : IVisitor4 { public _IVisitor4_311(BTree _enclosing) { this._enclosing = _enclosing; } public void Visit(object node) { this._enclosing._processing.Add(((TreeIntObject)node).GetObject()); } private readonly BTree _enclosing; } private void EnsureActive(Transaction trans) { if (!IsActive()) { Read(trans.SystemTransaction()); } } private void EnsureDirty(Transaction trans) { EnsureActive(trans); Enlist(trans); SetStateDirty(); } private void Enlist(Transaction trans) { if (CanEnlistWithTransaction()) { ((LocalTransaction)trans).Enlist(this); } } protected virtual bool CanEnlistWithTransaction() { return _config._canEnlistWithTransaction; } public override byte GetIdentifier() { return Const4.Btree; } public virtual void SetRemoveListener(IVisitor4 vis) { _removeListener = vis; } public override int OwnLength() { return 1 + Const4.ObjectLength + (Const4.IntLength * 2) + Const4.IdLength; } public virtual BTreeNode ProduceNode(int id) { if (DTrace.enabled) { DTrace.BtreeProduceNode.Log(id); } TreeIntObject addtio = new TreeIntObject(id); _nodes = (TreeIntObject)((TreeIntObject)Tree.Add(_nodes, addtio)); TreeIntObject tio = (TreeIntObject)addtio.AddedOrExisting(); BTreeNode node = (BTreeNode)tio.GetObject(); if (node == null) { node = CacheEntry(new BTreeNode(id, this))._node; tio.SetObject(node); AddToProcessing(node); } return node; } internal virtual void AddNode(BTreeNode node) { _nodes = (TreeIntObject)((TreeIntObject)Tree.Add(_nodes, new TreeIntObject(node.GetID (), node))); AddToProcessing(node); } internal virtual void AddToProcessing(BTreeNode node) { if (_processing != null) { _processing.Add(node); } } internal virtual void RemoveNode(BTreeNode node) { _nodes = (TreeIntObject)((TreeInt)_nodes.RemoveLike(new TreeInt(node.GetID()))); } internal virtual void NotifyRemoveListener(object obj) { if (_removeListener != null) { _removeListener.Visit(obj); } } public override void ReadThis(Transaction a_trans, ByteArrayBuffer a_reader) { a_reader.IncrementOffset(1); // first byte is version, for possible future format changes _size = a_reader.ReadInt(); _nodeSize = a_reader.ReadInt(); _halfNodeSize = NodeSize() / 2; _root = ProduceNode(a_reader.ReadInt()); } public override void WriteThis(Transaction trans, ByteArrayBuffer a_writer) { a_writer.WriteByte(BtreeVersion); a_writer.WriteInt(_size); a_writer.WriteInt(NodeSize()); a_writer.WriteIDOf(trans, _root); } public virtual int Size(Transaction trans) { // This implementation of size will not work accurately for multiple // transactions. If two transactions call clear and both commit, _size // can end up negative. // For multiple transactions the size patches only are an estimate. EnsureActive(trans); return _size + (((int)SizeIn(trans).value)); } public virtual void TraverseKeys(Transaction trans, IVisitor4 visitor) { EnsureActive(trans); if (_root == null) { return; } _root.TraverseKeys(trans, visitor); ConvertCacheEvictedNodesToReadMode(); } public virtual void SizeChanged(Transaction transaction, BTreeNode node, int changeBy ) { NotifyCountChanged(transaction, node, changeBy); ByRef sizeInTransaction = SizeIn(transaction); sizeInTransaction.value = (((int)sizeInTransaction.value)) + changeBy; } public virtual void Dispose(Transaction transaction) { } public virtual BTreePointer FirstPointer(Transaction trans) { EnsureActive(trans); if (null == _root) { return null; } BTreePointer pointer = _root.FirstPointer(trans); ConvertCacheEvictedNodesToReadMode(); return pointer; } public virtual BTreePointer LastPointer(Transaction trans) { EnsureActive(trans); if (null == _root) { return null; } BTreePointer pointer = _root.LastPointer(trans); ConvertCacheEvictedNodesToReadMode(); return pointer; } public virtual Db4objects.Db4o.Internal.Btree.BTree DebugLoadFully(Transaction trans ) { EnsureActive(trans); _root.DebugLoadFully(trans); return this; } private void TraverseAllNodes(Transaction trans, IVisitor4 command) { EnsureActive(trans); _root.TraverseAllNodes(trans, command); } public virtual void DefragIndex(DefragmentContextImpl context) { context.IncrementOffset(DefragmentIncrementOffset); context.CopyID(); } public virtual void DefragIndexNode(DefragmentContextImpl context) { BTreeNode.DefragIndex(context, _keyHandler); } public virtual void DefragBTree(IDefragmentServices services) { DefragmentContextImpl.ProcessCopy(services, GetID(), new _ISlotCopyHandler_481(this )); services.TraverseAllIndexSlots(this, new _IVisitor4_486(this, services)); ConvertCacheEvictedNodesToReadMode(); } private sealed class _ISlotCopyHandler_481 : ISlotCopyHandler { public _ISlotCopyHandler_481(BTree _enclosing) { this._enclosing = _enclosing; } public void ProcessCopy(DefragmentContextImpl context) { this._enclosing.DefragIndex(context); } private readonly BTree _enclosing; } private sealed class _IVisitor4_486 : IVisitor4 { public _IVisitor4_486(BTree _enclosing, IDefragmentServices services) { this._enclosing = _enclosing; this.services = services; } public void Visit(object obj) { int id = ((int)obj); DefragmentContextImpl.ProcessCopy(services, id, new _ISlotCopyHandler_489(this)); } private sealed class _ISlotCopyHandler_489 : ISlotCopyHandler { public _ISlotCopyHandler_489(_IVisitor4_486 _enclosing) { this._enclosing = _enclosing; } public void ProcessCopy(DefragmentContextImpl context) { this._enclosing._enclosing.DefragIndexNode(context); } private readonly _IVisitor4_486 _enclosing; } private readonly BTree _enclosing; private readonly IDefragmentServices services; } internal virtual int CompareKeys(IContext context, object key1, object key2) { IPreparedComparison preparedComparison = _keyHandler.PrepareComparison(context, key1 ); return preparedComparison.CompareTo(key2); } private static Config4Impl Config(Transaction trans) { if (null == trans) { throw new ArgumentNullException(); } return trans.Container().ConfigImpl; } public override void Free(LocalTransaction systemTrans) { _disposed = true; FreeAllNodeIds(systemTrans, AllNodeIds(systemTrans)); base.Free((LocalTransaction)systemTrans); } private void FreeAllNodeIds(LocalTransaction systemTrans, IEnumerator allNodeIDs) { ITransactionalIdSystem idSystem = IdSystem(systemTrans); while (allNodeIDs.MoveNext()) { int id = ((int)allNodeIDs.Current); idSystem.NotifySlotDeleted(id, SlotChangeFactory()); } } public virtual IEnumerator AllNodeIds(Transaction systemTrans) { Collection4 allNodeIDs = new Collection4(); TraverseAllNodes(systemTrans, new _IVisitor4_527(allNodeIDs)); return allNodeIDs.GetEnumerator(); } private sealed class _IVisitor4_527 : IVisitor4 { public _IVisitor4_527(Collection4 allNodeIDs) { this.allNodeIDs = allNodeIDs; } public void Visit(object node) { allNodeIDs.Add(((BTreeNode)node).GetID()); } private readonly Collection4 allNodeIDs; } public virtual IBTreeRange AsRange(Transaction trans) { return new BTreeRangeSingle(trans, this, FirstPointer(trans), null); } private void TraverseAllNodes(IVisitor4 visitor) { if (_nodes == null) { return; } _nodes.Traverse(new _IVisitor4_543(visitor)); } private sealed class _IVisitor4_543 : IVisitor4 { public _IVisitor4_543(IVisitor4 visitor) { this.visitor = visitor; } public void Visit(object obj) { visitor.Visit(((TreeIntObject)obj).GetObject()); } private readonly IVisitor4 visitor; } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append("BTree "); sb.Append(GetID()); sb.Append(" Active Nodes: \n"); TraverseAllNodes(new _IVisitor4_555(sb)); return sb.ToString(); } private sealed class _IVisitor4_555 : IVisitor4 { public _IVisitor4_555(StringBuilder sb) { this.sb = sb; } public void Visit(object obj) { sb.Append(obj); sb.Append("\n"); } private readonly StringBuilder sb; } public virtual void StructureListener(IBTreeStructureListener listener) { _structureListener = listener; } public virtual void NotifySplit(Transaction trans, BTreeNode originalNode, BTreeNode newRightNode) { if (_structureListener != null) { _structureListener.NotifySplit(trans, originalNode, newRightNode); } } public virtual void NotifyDeleted(Transaction trans, BTreeNode node) { if (_structureListener != null) { _structureListener.NotifyDeleted(trans, node); } } public virtual void NotifyCountChanged(Transaction trans, BTreeNode node, int diff ) { if (_structureListener != null) { _structureListener.NotifyCountChanged(trans, node, diff); } } public virtual IEnumerator Iterator(Transaction trans) { return new BTreeIterator(trans, this); } public virtual void Clear(Transaction transaction) { BTreePointer currentPointer = FirstPointer(transaction); while (currentPointer != null && currentPointer.IsValid()) { BTreeNode node = currentPointer.Node(); int index = currentPointer.Index(); node.Remove(transaction, index); currentPointer = currentPointer.Next(); } } public virtual ICache4 NodeCache() { return _nodeCache; } internal virtual BTreeNodeCacheEntry CacheEntry(BTreeNode node) { return ((BTreeNodeCacheEntry)_nodeCache.Produce(node.GetID(), new _IFunction4_605 (node), new _IProcedure4_609(this))); } private sealed class _IFunction4_605 : IFunction4 { public _IFunction4_605(BTreeNode node) { this.node = node; } public object Apply(object id) { return new BTreeNodeCacheEntry(node); } private readonly BTreeNode node; } private sealed class _IProcedure4_609 : IProcedure4 { public _IProcedure4_609(BTree _enclosing) { this._enclosing = _enclosing; } public void Apply(object entry) { this._enclosing.EvictedFromCache(((BTreeNodeCacheEntry)entry)._node); } private readonly BTree _enclosing; } public override Db4objects.Db4o.Internal.Slots.SlotChangeFactory SlotChangeFactory () { return _config._slotChangeFactory; } public virtual void EvictedFromCache(BTreeNode node) { _evictedFromCache = ((TreeIntObject)Tree.Add(_evictedFromCache, new TreeIntObject (node.GetID(), node))); } public virtual void ConvertCacheEvictedNodesToReadMode() { if (_evictedFromCache == null) { return; } Tree.Traverse(_evictedFromCache, new _IVisitor4_628()); _evictedFromCache = null; } private sealed class _IVisitor4_628 : IVisitor4 { public _IVisitor4_628() { } public void Visit(object treeIntObject) { ((BTreeNode)((TreeIntObject)treeIntObject)._object).ToReadMode(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/SharedIndexedFields.cs0000644000175000017500000000073311700531646030773 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class SharedIndexedFields { public readonly VersionFieldMetadata _version = new VersionFieldMetadata(); public readonly UUIDFieldMetadata _uUID = new UUIDFieldMetadata(); public readonly CommitTimestampFieldMetadata _commitTimestamp = new CommitTimestampFieldMetadata (); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Mapping/0000755000175000017500000000000011700531646026176 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Mapping/MappingNotFoundException.cs0000644000175000017500000000104711700531646033456 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Mapping { /// [System.Serializable] public class MappingNotFoundException : Exception { private const long serialVersionUID = -1771324770287654802L; private int _id; public MappingNotFoundException(int id) { this._id = id; } public virtual int Id() { return _id; } public override string ToString() { return base.ToString() + " : " + _id; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Mapping/MappedIDPair.cs0000644000175000017500000000102311700531646030760 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Mapping { /// public class MappedIDPair { private int _orig; private int _mapped; public MappedIDPair(int orig, int mapped) { _orig = orig; _mapped = mapped; } public virtual int Orig() { return _orig; } public virtual int Mapped() { return _mapped; } public override string ToString() { return _orig + "->" + _mapped; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Mapping/IdSource.cs0000644000175000017500000000067211700531646030247 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Internal.Mapping { public class IdSource { private readonly IQueue4 _queue; public IdSource(IQueue4 queue) { _queue = queue; } public virtual bool HasMoreIds() { return _queue.HasNext(); } public virtual int NextId() { return ((int)_queue.Next()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Mapping/MappedIDPairHandler.cs0000644000175000017500000000424011700531646032262 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Mapping; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Mapping { /// public class MappedIDPairHandler : IIndexable4 { private readonly IntHandler _origHandler; private readonly IntHandler _mappedHandler; public MappedIDPairHandler() { _origHandler = new IntHandler(); _mappedHandler = new IntHandler(); } public virtual void DefragIndexEntry(DefragmentContextImpl context) { throw new NotImplementedException(); } public virtual int LinkLength() { return _origHandler.LinkLength() + _mappedHandler.LinkLength(); } public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer reader) { int origID = ReadID(context, reader); int mappedID = ReadID(context, reader); return new MappedIDPair(origID, mappedID); } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer reader, object obj) { MappedIDPair mappedIDs = (MappedIDPair)obj; _origHandler.WriteIndexEntry(context, reader, mappedIDs.Orig()); _mappedHandler.WriteIndexEntry(context, reader, mappedIDs.Mapped()); } private int ReadID(IContext context, ByteArrayBuffer a_reader) { return ((int)_origHandler.ReadIndexEntry(context, a_reader)); } public virtual IPreparedComparison PrepareComparison(IContext context, object source ) { MappedIDPair sourceIDPair = (MappedIDPair)source; int sourceID = sourceIDPair.Orig(); return new _IPreparedComparison_50(sourceID); } private sealed class _IPreparedComparison_50 : IPreparedComparison { public _IPreparedComparison_50(int sourceID) { this.sourceID = sourceID; } public int CompareTo(object target) { MappedIDPair targetIDPair = (MappedIDPair)target; int targetID = targetIDPair.Orig(); return sourceID == targetID ? 0 : (sourceID < targetID ? -1 : 1); } private readonly int sourceID; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Mapping/IIDMapping.cs0000644000175000017500000000166611700531646030457 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Mapping { /// A mapping from db4o file source IDs/addresses to target IDs/addresses, used for defragmenting. /// /// A mapping from db4o file source IDs/addresses to target IDs/addresses, used for defragmenting. /// /// public interface IIDMapping { /// a mapping for the given id. if it does refer to a system handler or the empty reference (0), returns the given id. /// /// if the given id does not refer to a system handler or the empty reference (0) and if no mapping is found /// /// int StrictMappedID(int oldID); void MapIDs(int oldID, int newID, bool isClassID); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/LockedTree.cs0000644000175000017500000000330011700531646027147 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class LockedTree { private Tree _tree; private int _version; public virtual void Add(Tree tree) { Changed(); _tree = _tree == null ? tree : _tree.Add(tree); } private void Changed() { _version++; } public virtual void Clear() { Changed(); _tree = null; } public virtual Tree Find(int key) { return TreeInt.Find(_tree, key); } public virtual void Read(ByteArrayBuffer buffer, IReadable template) { Clear(); _tree = new TreeReader(buffer, template).Read(); Changed(); } public virtual void TraverseLocked(IVisitor4 visitor) { int currentVersion = _version; Tree.Traverse(_tree, visitor); if (_version != currentVersion) { throw new InvalidOperationException(); } } public virtual void TraverseMutable(IVisitor4 visitor) { Collection4 currentContent = new Collection4(); TraverseLocked(new _IVisitor4_51(currentContent)); IEnumerator i = currentContent.GetEnumerator(); while (i.MoveNext()) { visitor.Visit(i.Current); } } private sealed class _IVisitor4_51 : IVisitor4 { public _IVisitor4_51(Collection4 currentContent) { this.currentContent = currentContent; } public void Visit(object obj) { currentContent.Add(obj); } private readonly Collection4 currentContent; } public virtual bool IsEmpty() { return _tree == null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ClassMetadataRepository.cs0000644000175000017500000004423511700531646031750 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Metadata; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// public sealed class ClassMetadataRepository : PersistentBase { private Collection4 _classes; private Hashtable4 _creating; private readonly Transaction _systemTransaction; private Hashtable4 _classMetadataByBytes; private Hashtable4 _classMetadataByClass; private Hashtable4 _classMetadataByName; private Hashtable4 _classMetadataByID; private int _classMetadataCreationDepth; private IQueue4 _initClassMetadataOnUp; private readonly PendingClassInits _classInits; public ClassMetadataRepository(Transaction systemTransaction) { _systemTransaction = systemTransaction; _initClassMetadataOnUp = new NonblockingQueue(); _classInits = new PendingClassInits(_systemTransaction); } public void AddClassMetadata(ClassMetadata clazz) { Container().SetDirtyInSystemTransaction(this); _classes.Add(clazz); if (clazz.StateUnread()) { _classMetadataByBytes.Put(clazz.i_nameBytes, clazz); } else { _classMetadataByClass.Put(clazz.ClassReflector(), clazz); } RegisterClassMetadataById(clazz); } private void RegisterClassMetadataById(ClassMetadata clazz) { if (clazz.GetID() == 0) { clazz.Write(_systemTransaction); } _classMetadataByID.Put(clazz.GetID(), clazz); } private byte[] AsBytes(string str) { return Container().StringIO().Write(str); } public void AttachQueryNode(string fieldName, IVisitor4 visitor) { ClassMetadataIterator i = Iterator(); while (i.MoveNext()) { ClassMetadata classMetadata = i.CurrentClass(); if (!classMetadata.IsInternal()) { classMetadata.TraverseAllAspects(new _TraverseFieldCommand_65(fieldName, visitor, classMetadata)); } } } private sealed class _TraverseFieldCommand_65 : TraverseFieldCommand { public _TraverseFieldCommand_65(string fieldName, IVisitor4 visitor, ClassMetadata classMetadata) { this.fieldName = fieldName; this.visitor = visitor; this.classMetadata = classMetadata; } protected override void Process(FieldMetadata field) { if (field.CanAddToQuery(fieldName)) { visitor.Visit(new object[] { classMetadata, field }); } } private readonly string fieldName; private readonly IVisitor4 visitor; private readonly ClassMetadata classMetadata; } public void IterateTopLevelClasses(IVisitor4 visitor) { ClassMetadataIterator i = Iterator(); while (i.MoveNext()) { ClassMetadata classMetadata = i.CurrentClass(); if (!classMetadata.IsInternal()) { if (classMetadata.GetAncestor() == null) { visitor.Visit(classMetadata); } } } } internal void CheckChanges() { IEnumerator i = _classes.GetEnumerator(); while (i.MoveNext()) { ((ClassMetadata)i.Current).CheckChanges(); } } internal bool CreateClassMetadata(ClassMetadata clazz, IReflectClass reflectClazz ) { bool result = false; _classMetadataCreationDepth++; try { IReflectClass parentReflectClazz = reflectClazz.GetSuperclass(); ClassMetadata parentClazz = null; if (parentReflectClazz != null && !parentReflectClazz.Equals(Container()._handlers .IclassObject)) { parentClazz = ProduceClassMetadata(parentReflectClazz); } result = Container().CreateClassMetadata(clazz, reflectClazz, parentClazz); } finally { _classMetadataCreationDepth--; } InitClassMetadataOnUp(); return result; } private void EnsureAllClassesRead() { bool allClassesRead = false; while (!allClassesRead) { Collection4 unreadClasses = new Collection4(); int numClasses = _classes.Size(); IEnumerator classIter = _classes.GetEnumerator(); while (classIter.MoveNext()) { ClassMetadata clazz = (ClassMetadata)classIter.Current; if (clazz.StateUnread()) { unreadClasses.Add(clazz); } } IEnumerator unreadIter = unreadClasses.GetEnumerator(); while (unreadIter.MoveNext()) { ClassMetadata clazz = (ClassMetadata)unreadIter.Current; clazz = ReadClassMetadata(clazz, null); if (clazz.ClassReflector() == null) { clazz.ForceRead(); } } allClassesRead = (_classes.Size() == numClasses); } ApplyReadAs(); } internal bool FieldExists(string field) { ClassMetadataIterator i = Iterator(); while (i.MoveNext()) { if (i.CurrentClass().FieldMetadataForName(field) != null) { return true; } } return false; } public Collection4 ForInterface(IReflectClass claxx) { Collection4 col = new Collection4(); ClassMetadataIterator i = Iterator(); while (i.MoveNext()) { ClassMetadata clazz = i.CurrentClass(); IReflectClass candidate = clazz.ClassReflector(); if (!candidate.IsInterface()) { if (claxx.IsAssignableFrom(candidate)) { col.Add(clazz); IEnumerator j = new Collection4(col).GetEnumerator(); while (j.MoveNext()) { ClassMetadata existing = (ClassMetadata)j.Current; if (existing != clazz) { ClassMetadata higher = clazz.GetHigherHierarchy(existing); if (higher != null) { if (higher == clazz) { col.Remove(existing); } else { col.Remove(clazz); } } } } } } } return col; } public override byte GetIdentifier() { return Const4.Yapclasscollection; } internal ClassMetadata GetActiveClassMetadata(IReflectClass reflectClazz) { return (ClassMetadata)_classMetadataByClass.Get(reflectClazz); } internal ClassMetadata ClassMetadataForReflectClass(IReflectClass reflectClazz) { ClassMetadata cached = (ClassMetadata)_classMetadataByClass.Get(reflectClazz); if (cached != null) { return cached; } return ReadClassMetadata(reflectClazz); } private ClassMetadata ReadClassMetadata(IReflectClass reflectClazz) { ClassMetadata clazz = (ClassMetadata)_classMetadataByBytes.Remove(GetNameBytes(reflectClazz .GetName())); if (clazz == null) { return null; } return ReadClassMetadata(clazz, reflectClazz); } internal ClassMetadata ProduceClassMetadata(IReflectClass reflectClazz) { ClassMetadata classMetadata = ClassMetadataForReflectClass(reflectClazz); if (classMetadata != null) { return classMetadata; } ClassMetadata classBeingCreated = (ClassMetadata)_creating.Get(reflectClazz); if (classBeingCreated != null) { return classBeingCreated; } ClassMetadata newClassMetadata = new ClassMetadata(Container(), reflectClazz); _creating.Put(reflectClazz, newClassMetadata); try { if (!CreateClassMetadata(newClassMetadata, reflectClazz)) { return null; } // ObjectContainerBase#createClassMetadata may add the ClassMetadata already, // so we have to check again if (!IsRegistered(reflectClazz)) { AddClassMetadata(newClassMetadata); _classInits.Process(newClassMetadata); } else { RegisterClassMetadataById(newClassMetadata); if (newClassMetadata.AspectsAreNull()) { _classInits.Process(newClassMetadata); } } Container().SetDirtyInSystemTransaction(this); } finally { _creating.Remove(reflectClazz); } return newClassMetadata; } private bool IsRegistered(IReflectClass reflectClazz) { return _classMetadataByClass.Get(reflectClazz) != null; } internal ClassMetadata ClassMetadataForId(int id) { ClassMetadata classMetadata = (ClassMetadata)_classMetadataByID.Get(id); if (null == classMetadata) { return null; } return ReadClassMetadata(classMetadata, null); } public int ClassMetadataIdForName(string name) { ClassMetadata classMetadata = (ClassMetadata)_classMetadataByBytes.Get(GetNameBytes (name)); if (classMetadata == null) { classMetadata = FindInitializedClassByName(name); } if (classMetadata != null) { return classMetadata.GetID(); } return 0; } public ClassMetadata GetClassMetadata(string name) { ClassMetadata classMetadata = (ClassMetadata)_classMetadataByBytes.Remove(GetNameBytes (name)); if (classMetadata == null) { classMetadata = FindInitializedClassByName(name); } if (classMetadata != null) { classMetadata = ReadClassMetadata(classMetadata, null); } return classMetadata; } private ClassMetadata FindInitializedClassByName(string name) { ClassMetadata classMetadata = (ClassMetadata)_classMetadataByName.Get(name); if (classMetadata != null) { return classMetadata; } ClassMetadataIterator i = Iterator(); while (i.MoveNext()) { classMetadata = (ClassMetadata)i.Current; if (name.Equals(classMetadata.GetName())) { _classMetadataByName.Put(name, classMetadata); return classMetadata; } } return null; } public int GetClassMetadataID(string name) { ClassMetadata clazz = (ClassMetadata)_classMetadataByBytes.Get(GetNameBytes(name) ); if (clazz != null) { return clazz.GetID(); } return 0; } internal byte[] GetNameBytes(string name) { return AsBytes(ResolveAliasRuntimeName(name)); } private string ResolveAliasRuntimeName(string name) { return Container().ConfigImpl.ResolveAliasRuntimeName(name); } public void InitOnUp(Transaction systemTrans) { _classMetadataCreationDepth++; systemTrans.Container().ShowInternalClasses(true); try { IEnumerator i = _classes.GetEnumerator(); while (i.MoveNext()) { ((ClassMetadata)i.Current).InitOnUp(systemTrans); } } finally { systemTrans.Container().ShowInternalClasses(false); _classMetadataCreationDepth--; } InitClassMetadataOnUp(); } internal void InitTables(int size) { _classes = new Collection4(); _classMetadataByBytes = new Hashtable4(size); if (size < 16) { size = 16; } _classMetadataByClass = new Hashtable4(size); _classMetadataByName = new Hashtable4(size); _classMetadataByID = new Hashtable4(size); _creating = new Hashtable4(1); } private void InitClassMetadataOnUp() { if (_classMetadataCreationDepth != 0) { return; } ClassMetadata clazz = (ClassMetadata)_initClassMetadataOnUp.Next(); while (clazz != null) { clazz.InitOnUp(_systemTransaction); clazz = (ClassMetadata)_initClassMetadataOnUp.Next(); } } public ClassMetadataIterator Iterator() { return new ClassMetadataIterator(this, new ArrayIterator4(_classes.ToArray())); } private class ClassIDIterator : MappingIterator { public ClassIDIterator(Collection4 classes) : base(classes.GetEnumerator()) { } protected override object Map(object current) { return ((ClassMetadata)current).GetID(); } } public IEnumerator Ids() { return new ClassMetadataRepository.ClassIDIterator(_classes); } public override int OwnLength() { return Const4.ObjectLength + Const4.IntLength + (_classes.Size() * Const4.IdLength ); } internal void Purge() { IEnumerator i = _classes.GetEnumerator(); while (i.MoveNext()) { ((ClassMetadata)i.Current).Purge(); } } public sealed override void ReadThis(Transaction trans, ByteArrayBuffer buffer) { int classCount = buffer.ReadInt(); InitTables(classCount); ObjectContainerBase container = Container(); int[] ids = ReadMetadataIds(buffer, classCount); ByteArrayBuffer[] metadataSlots = container.ReadSlotBuffers(trans, ids); for (int i = 0; i < classCount; ++i) { ClassMetadata classMetadata = new ClassMetadata(container, null); classMetadata.SetID(ids[i]); _classes.Add(classMetadata); _classMetadataByID.Put(ids[i], classMetadata); byte[] name = classMetadata.ReadName1(trans, metadataSlots[i]); if (name != null) { _classMetadataByBytes.Put(name, classMetadata); } } ApplyReadAs(); } private int[] ReadMetadataIds(ByteArrayBuffer buffer, int classCount) { int[] ids = new int[classCount]; for (int i = 0; i < classCount; ++i) { ids[i] = buffer.ReadInt(); } return ids; } internal Hashtable4 ClassByBytes() { return _classMetadataByBytes; } private void ApplyReadAs() { Hashtable4 readAs = Container().ConfigImpl.ReadAs(); IEnumerator i = readAs.Iterator(); while (i.MoveNext()) { IEntry4 entry = (IEntry4)i.Current; string dbName = (string)entry.Key(); string useName = (string)entry.Value(); byte[] dbbytes = GetNameBytes(dbName); byte[] useBytes = GetNameBytes(useName); if (ClassByBytes().Get(useBytes) == null) { ClassMetadata clazz = (ClassMetadata)ClassByBytes().Get(dbbytes); if (clazz != null) { clazz.i_nameBytes = useBytes; clazz.SetConfig(ConfigClass(dbName)); ClassByBytes().Remove(dbbytes); ClassByBytes().Put(useBytes, clazz); } } } } private Config4Class ConfigClass(string name) { return Container().ConfigImpl.ConfigClass(name); } public ClassMetadata ReadClassMetadata(ClassMetadata classMetadata, IReflectClass clazz) { if (classMetadata == null) { throw new ArgumentNullException(); } if (!classMetadata.StateUnread()) { return classMetadata; } _classMetadataCreationDepth++; try { classMetadata.CreateConfigAndConstructor(_classMetadataByBytes, clazz); IReflectClass claxx = classMetadata.ClassReflector(); if (claxx != null) { _classMetadataByClass.Put(claxx, classMetadata); classMetadata.ReadThis(); classMetadata.CheckChanges(); _initClassMetadataOnUp.Add(classMetadata); } } finally { _classMetadataCreationDepth--; } InitClassMetadataOnUp(); return classMetadata; } public void CheckAllClassChanges() { IEnumerator i = _classMetadataByID.Keys(); while (i.MoveNext()) { int classMetadataID = ((int)i.Current); ClassMetadataForId(classMetadataID); } } public void RefreshClasses() { ClassMetadataRepository rereader = new ClassMetadataRepository(_systemTransaction ); rereader._id = _id; rereader.Read(Container().SystemTransaction()); IEnumerator i = rereader._classes.GetEnumerator(); while (i.MoveNext()) { ClassMetadata clazz = (ClassMetadata)i.Current; RefreshClass(clazz); } i = _classes.GetEnumerator(); while (i.MoveNext()) { ClassMetadata clazz = (ClassMetadata)i.Current; clazz.Refresh(); } } private void RefreshClass(ClassMetadata clazz) { if (_classMetadataByID.Get(clazz.GetID()) == null) { _classes.Add(clazz); _classMetadataByID.Put(clazz.GetID(), clazz); RefreshClassCache(clazz, null); } } public void RefreshClassCache(ClassMetadata clazz, IReflectClass oldReflector) { if (clazz.StateUnread()) { _classMetadataByBytes.Put(clazz.ReadName(_systemTransaction), clazz); } else { if (oldReflector != null) { _classMetadataByClass.Remove(oldReflector); } _classMetadataByClass.Put(clazz.ClassReflector(), clazz); } } internal void ReReadClassMetadata(ClassMetadata clazz) { if (clazz != null) { ReReadClassMetadata(clazz._ancestor); clazz.ReadName(_systemTransaction); clazz.ForceRead(); clazz.SetStateClean(); clazz.BitFalse(Const4.CheckedChanges); clazz.BitFalse(Const4.Reading); clazz.BitFalse(Const4.Continue); clazz.BitFalse(Const4.Dead); clazz.CheckChanges(); } } public IStoredClass[] StoredClasses() { EnsureAllClassesRead(); IStoredClass[] sclasses = new IStoredClass[_classes.Size()]; _classes.ToArray(sclasses); return sclasses; } public void WriteAllClasses() { Collection4 deadClasses = new Collection4(); IStoredClass[] storedClasses = StoredClasses(); for (int i = 0; i < storedClasses.Length; i++) { ClassMetadata clazz = (ClassMetadata)storedClasses[i]; clazz.SetStateDirty(); if (clazz.StateDead()) { deadClasses.Add(clazz); clazz.SetStateOK(); } } for (int i = 0; i < storedClasses.Length; i++) { ClassMetadata clazz = (ClassMetadata)storedClasses[i]; clazz.Write(_systemTransaction); } IEnumerator it = deadClasses.GetEnumerator(); while (it.MoveNext()) { ((ClassMetadata)it.Current).SetStateDead(); } } public override void WriteThis(Transaction trans, ByteArrayBuffer buffer) { buffer.WriteInt(_classes.Size()); IEnumerator i = _classes.GetEnumerator(); while (i.MoveNext()) { buffer.WriteIDOf(trans, i.Current); } } public override string ToString() { string str = "Active:\n"; IEnumerator i = _classes.GetEnumerator(); while (i.MoveNext()) { ClassMetadata clazz = (ClassMetadata)i.Current; str += clazz.GetID() + " " + clazz + "\n"; } return str; } internal ObjectContainerBase Container() { return _systemTransaction.Container(); } public override void SetID(int id) { if (Container().IsClient) { base.SetID(id); return; } if (_id == 0) { SystemData().ClassCollectionID(id); } base.SetID(id); } private SystemData SystemData() { return LocalSystemTransaction().LocalContainer().SystemData(); } private LocalTransaction LocalSystemTransaction() { return ((LocalTransaction)_systemTransaction); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IComparable4.cs0000644000175000017500000000165211700531646027400 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// Interface for comparison support in queries. /// Interface for comparison support in queries. public interface IComparable4 { /// /// creates a prepared comparison to compare multiple objects /// against one single object. /// /// /// creates a prepared comparison to compare multiple objects /// against one single object. /// /// the context of the comparison /// /// the object that is to be compared /// against multiple other objects /// /// the prepared comparison IPreparedComparison PrepareComparison(IContext context, object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IIndexableTypeHandler.cs0000644000175000017500000000154011700531646031276 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public interface IIndexableTypeHandler : IIndexable4, ITypeHandler4 { object IndexEntryToObject(IContext context, object indexEntry); /// /// object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer writer); /// /// object ReadIndexEntry(IObjectIdContext context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ICommittedCallbackDispatcher.cs0000644000175000017500000000051611700531646032616 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public interface ICommittedCallbackDispatcher { bool WillDispatchCommitted(); void DispatchCommitted(CallbackObjectInfoCollections committedInfo); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config4Field.cs0000644000175000017500000000426111700531646027372 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { public class Config4Field : Config4Abstract, IObjectField, IDeepClone { private readonly Config4Class _configClass; private bool _used; private static readonly KeySpec IndexedKey = new KeySpec(TernaryBool.Unspecified); protected Config4Field(Config4Class a_class, KeySpecHashtable4 config) : base(config ) { _configClass = a_class; } internal Config4Field(Config4Class a_class, string a_name) { _configClass = a_class; SetName(a_name); } private Config4Class ClassConfig() { return _configClass; } internal override string ClassName() { return ClassConfig().GetName(); } public virtual object DeepClone(object param) { return new Db4objects.Db4o.Internal.Config4Field((Config4Class)param, _config); } public virtual void Rename(string newName) { ClassConfig().Config().Rename(Renames.ForField(ClassName(), GetName(), newName)); SetName(newName); } public virtual void Indexed(bool flag) { PutThreeValued(IndexedKey, flag); } public virtual void InitOnUp(Transaction systemTrans, FieldMetadata fieldMetadata ) { ObjectContainerBase anyStream = systemTrans.Container(); if (!anyStream.MaintainsIndices()) { return; } if (!fieldMetadata.SupportsIndex()) { Indexed(false); } TernaryBool indexedFlag = _config.GetAsTernaryBool(IndexedKey); if (indexedFlag.DefiniteNo()) { fieldMetadata.DropIndex((LocalTransaction)systemTrans); return; } if (UseExistingIndex(systemTrans, fieldMetadata)) { return; } if (!indexedFlag.DefiniteYes()) { return; } fieldMetadata.CreateIndex(); } private bool UseExistingIndex(Transaction systemTrans, FieldMetadata fieldMetadata ) { return fieldMetadata.GetIndex(systemTrans) != null; } public virtual void Used(bool flag) { _used = flag; } public virtual bool Used() { return _used; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/WriteUpdateProcessor.cs0000644000175000017500000000507311700531646031274 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// internal class WriteUpdateProcessor { private readonly LocalTransaction _transaction; private readonly int _id; private readonly ClassMetadata _clazz; private readonly ArrayType _typeInfo; private int _cascade = 0; public WriteUpdateProcessor(LocalTransaction transaction, int id, ClassMetadata clazz , ArrayType typeInfo) { _transaction = transaction; _id = id; _clazz = clazz; _typeInfo = typeInfo; } public virtual void Run() { _transaction.CheckSynchronization(); if (DTrace.enabled) { DTrace.WriteUpdateAdjustIndexes.Log(_id); } if (AlreadyHandled()) { return; } // TODO: Try to get rid of getting the slot here because it // will invoke reading a pointer from the file system. // It may be possible to figure out the readd case // by asking the IdSystem in a smarter way. Slot slot = _transaction.IdSystem().CurrentSlot(_id); if (HandledAsReAdd(slot)) { return; } if (_clazz.CanUpdateFast()) { return; } StatefulBuffer objectBytes = Container().ReadStatefulBufferBySlot(_transaction, _id , slot); DeleteMembers(objectBytes); } private LocalObjectContainer Container() { return _transaction.LocalContainer(); } private void DeleteMembers(StatefulBuffer objectBytes) { ObjectHeader oh = new ObjectHeader(_clazz, objectBytes); DeleteInfo info = (DeleteInfo)TreeInt.Find(_transaction._delete, _id); if (info != null) { if (info._cascade > _cascade) { _cascade = info._cascade; } } objectBytes.SetCascadeDeletes(_cascade); DeleteContextImpl context = new DeleteContextImpl(objectBytes, oh, _clazz.ClassReflector (), null); _clazz.DeleteMembers(context, _typeInfo, true); } private bool HandledAsReAdd(Slot slot) { if (!Slot.IsNull(slot)) { return false; } _clazz.AddToIndex(_transaction, _id); return true; } private bool AlreadyHandled() { TreeInt newNode = new TreeInt(_id); _transaction._writtenUpdateAdjustedIndexes = Tree.Add(_transaction._writtenUpdateAdjustedIndexes , newNode); return !newNode.WasAddedToTree(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IBlockConverter.cs0000644000175000017500000000063011700531646030164 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// public interface IBlockConverter { int BytesToBlocks(long bytes); int BlockAlignedBytes(int bytes); int BlocksToBytes(int blocks); Slot ToBlockedLength(Slot slot); Slot ToNonBlockedLength(Slot slot); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TreeReader.cs0000644000175000017500000000376311700531646027165 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public sealed class TreeReader { private readonly IReadable i_template; private readonly ByteArrayBuffer i_bytes; private int i_current = 0; private int i_levels = 0; private int i_size; private bool i_orderOnRead; public TreeReader(ByteArrayBuffer a_bytes, IReadable a_template) : this(a_bytes, a_template, false) { } public TreeReader(ByteArrayBuffer a_bytes, IReadable a_template, bool a_orderOnRead ) { i_template = a_template; i_bytes = a_bytes; i_orderOnRead = a_orderOnRead; } public Tree Read() { return Read(i_bytes.ReadInt()); } public Tree Read(int a_size) { i_size = a_size; if (i_size > 0) { if (i_orderOnRead) { Tree tree = null; for (int i = 0; i < i_size; i++) { tree = Tree.Add(tree, (Tree)i_template.Read(i_bytes)); } return tree; } while ((1 << i_levels) < (i_size + 1)) { i_levels++; } return LinkUp(null, i_levels); } return null; } private Tree LinkUp(Tree a_preceding, int a_level) { Tree node = (Tree)i_template.Read(i_bytes); i_current++; node._preceding = a_preceding; node._subsequent = LinkDown(a_level + 1); node.CalculateSize(); if (i_current < i_size) { return LinkUp(node, a_level - 1); } return node; } private Tree LinkDown(int a_level) { if (i_current < i_size) { i_current++; if (a_level < i_levels) { Tree preceding = LinkDown(a_level + 1); Tree node = (Tree)i_template.Read(i_bytes); node._preceding = preceding; node._subsequent = LinkDown(a_level + 1); node.CalculateSize(); return node; } return (Tree)i_template.Read(i_bytes); } return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IntMatcher.cs0000644000175000017500000000173611700531646027177 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public abstract class IntMatcher { public abstract bool Match(int i); private sealed class _IntMatcher_13 : IntMatcher { public _IntMatcher_13() { } public override bool Match(int i) { return i == 0; } } public static readonly IntMatcher Zero = new _IntMatcher_13(); private sealed class _IntMatcher_19 : IntMatcher { public _IntMatcher_19() { } public override bool Match(int i) { return i > 0; } } public static readonly IntMatcher Positive = new _IntMatcher_19(); private sealed class _IntMatcher_25 : IntMatcher { public _IntMatcher_25() { } public override bool Match(int i) { return i < 0; } } public static readonly IntMatcher Negative = new _IntMatcher_25(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IReadWriteable.cs0000644000175000017500000000041011700531646027750 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public interface IReadWriteable : IReadable { void Write(ByteArrayBuffer buffer); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IReadsObjectIds.cs0000644000175000017500000000047011700531646030071 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal { /// public interface IReadsObjectIds { ObjectID ReadObjectID(IInternalReadContext context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ArrayType.cs0000644000175000017500000000205311700531646027052 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal { /// public class ArrayType { public static readonly Db4objects.Db4o.Internal.ArrayType None = new Db4objects.Db4o.Internal.ArrayType (0); public static readonly Db4objects.Db4o.Internal.ArrayType PlainArray = new Db4objects.Db4o.Internal.ArrayType (3); public static readonly Db4objects.Db4o.Internal.ArrayType MultidimensionalArray = new Db4objects.Db4o.Internal.ArrayType(4); private ArrayType(int value) { _value = value; } private readonly int _value; public virtual int Value() { return _value; } public static Db4objects.Db4o.Internal.ArrayType ForValue(int value) { switch (value) { case 0: { return None; } case 3: { return PlainArray; } case 4: { return MultidimensionalArray; } default: { throw new ArgumentException(); } } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Null.cs0000644000175000017500000000264511700531646026053 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public class Null : IIndexable4, IPreparedComparison { public static readonly Db4objects.Db4o.Internal.Null Instance = new Db4objects.Db4o.Internal.Null (); private Null() { } public virtual int CompareTo(object a_obj) { if (a_obj == null) { return 0; } return -1; } public virtual int LinkLength() { return 0; } public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer a_reader) { return null; } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer a_writer, object a_object) { } // do nothing public virtual void DefragIndexEntry(DefragmentContextImpl context) { } // do nothing public virtual IPreparedComparison PrepareComparison(IContext context, object obj_ ) { return new _IPreparedComparison_43(); } private sealed class _IPreparedComparison_43 : IPreparedComparison { public _IPreparedComparison_43() { } public int CompareTo(object obj) { if (obj == null) { return 0; } if (obj is Db4objects.Db4o.Internal.Null) { return 0; } return -1; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/StoredFieldImpl.cs0000644000175000017500000000412211700531646030157 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// public class StoredFieldImpl : IStoredField { private readonly Transaction _transaction; private readonly Db4objects.Db4o.Internal.FieldMetadata _fieldMetadata; public StoredFieldImpl(Transaction transaction, Db4objects.Db4o.Internal.FieldMetadata fieldMetadata) { _transaction = transaction; _fieldMetadata = fieldMetadata; } public virtual void CreateIndex() { lock (Lock()) { _fieldMetadata.CreateIndex(); } } public virtual void DropIndex() { lock (Lock()) { _fieldMetadata.DropIndex(); } } private object Lock() { return _transaction.Container().Lock(); } public virtual Db4objects.Db4o.Internal.FieldMetadata FieldMetadata() { return _fieldMetadata; } public virtual object Get(object onObject) { return _fieldMetadata.Get(_transaction, onObject); } public virtual string GetName() { return _fieldMetadata.GetName(); } public virtual IReflectClass GetStoredType() { return _fieldMetadata.GetStoredType(); } public virtual bool HasIndex() { return _fieldMetadata.HasIndex(); } public virtual bool IsArray() { return _fieldMetadata.IsArray(); } public virtual void Rename(string name) { lock (Lock()) { _fieldMetadata.Rename(name); } } public virtual void TraverseValues(IVisitor4 visitor) { _fieldMetadata.TraverseValues(_transaction, visitor); } public override int GetHashCode() { return _fieldMetadata.GetHashCode(); } public override bool Equals(object obj) { if (obj == null) { return false; } if (GetType() != obj.GetType()) { return false; } return _fieldMetadata.Equals(((Db4objects.Db4o.Internal.StoredFieldImpl)obj)._fieldMetadata ); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/CommitTimestampSupport.cs0000644000175000017500000001720711700531646031652 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { public class CommitTimestampSupport { private BTree _idToTimestamp; private BTree _timestampToId; private readonly LocalObjectContainer _container; public CommitTimestampSupport(LocalObjectContainer container) { _container = container; } public virtual void EnsureInitialized() { IdToTimestamp(); } public virtual BTree IdToTimestamp() { if (_idToTimestamp != null) { return _idToTimestamp; } if (!_container.Config().GenerateCommitTimestamps().DefiniteYes()) { return null; } Initialize(); return _idToTimestamp; } public virtual BTree TimestampToId() { if (_timestampToId != null) { return _timestampToId; } if (!_container.Config().GenerateCommitTimestamps().DefiniteYes()) { return null; } Initialize(); return _timestampToId; } private void Initialize() { int idToTimestampIndexId = _container.SystemData().IdToTimestampIndexId(); int timestampToIdIndexId = _container.SystemData().TimestampToIdIndexId(); _idToTimestamp = new BTree(_container.SystemTransaction(), idToTimestampIndexId, new CommitTimestampSupport.TimestampEntryById()); _timestampToId = new BTree(_container.SystemTransaction(), timestampToIdIndexId, new CommitTimestampSupport.IdEntryByTimestamp()); if (idToTimestampIndexId != _idToTimestamp.GetID()) { StoreBtreesIds(); } EventRegistryFactory.ForObjectContainer(_container).Committing += new System.EventHandler (new _IEventListener4_69(this).OnEvent); } private sealed class _IEventListener4_69 { public _IEventListener4_69(CommitTimestampSupport _enclosing) { this._enclosing = _enclosing; } public void OnEvent(object sender, Db4objects.Db4o.Events.CommitEventArgs args) { LocalTransaction trans = (LocalTransaction)((CommitEventArgs)args).Transaction(); long transactionTimestamp = trans.Timestamp(); long commitTimestamp = (transactionTimestamp > 0) ? transactionTimestamp : this._enclosing ._container.GenerateTimeStampId(); Transaction sysTrans = trans.SystemTransaction(); this.AddTimestamp(sysTrans, ((CommitEventArgs)args).Added.GetEnumerator(), commitTimestamp ); this.AddTimestamp(sysTrans, ((CommitEventArgs)args).Updated.GetEnumerator(), commitTimestamp ); this.AddTimestamp(sysTrans, ((CommitEventArgs)args).Deleted.GetEnumerator(), 0); } private void AddTimestamp(Transaction trans, IEnumerator it, long commitTimestamp ) { while (it.MoveNext()) { IObjectInfo objInfo = (IObjectInfo)it.Current; CommitTimestampSupport.TimestampEntry te = new CommitTimestampSupport.TimestampEntry ((int)objInfo.GetInternalID(), commitTimestamp); CommitTimestampSupport.TimestampEntry oldEntry = (CommitTimestampSupport.TimestampEntry )this._enclosing._idToTimestamp.Remove(trans, te); if (oldEntry != null) { this._enclosing._timestampToId.Remove(trans, oldEntry); } if (commitTimestamp != 0) { this._enclosing._idToTimestamp.Add(trans, te); this._enclosing._timestampToId.Add(trans, te); } } } private readonly CommitTimestampSupport _enclosing; } private void StoreBtreesIds() { _container.SystemData().IdToTimestampIndexId(_idToTimestamp.GetID()); _container.SystemData().TimestampToIdIndexId(_timestampToId.GetID()); _container.GetFileHeader().WriteVariablePart(_container); } public class TimestampEntry : IFieldIndexKey { public readonly int objectId; public readonly long commitTimestamp; public override string ToString() { return "TimestampEntry [objectId=" + objectId + ", commitTimestamp=" + commitTimestamp + "]"; } public TimestampEntry(int objectId, long commitTimestamp) { this.objectId = objectId; this.commitTimestamp = commitTimestamp; } public virtual int ParentID() { return objectId; } public virtual long GetCommitTimestamp() { return commitTimestamp; } public virtual object Value() { return commitTimestamp; } } private class TimestampEntryById : IIndexable4 { public virtual IPreparedComparison PrepareComparison(IContext context, object first ) { return new _IPreparedComparison_139(first); } private sealed class _IPreparedComparison_139 : IPreparedComparison { public _IPreparedComparison_139(object first) { this.first = first; } public int CompareTo(object second) { return IntHandler.Compare(((CommitTimestampSupport.TimestampEntry)first).objectId , ((CommitTimestampSupport.TimestampEntry)second).objectId); } private readonly object first; } public virtual int LinkLength() { return Const4.IntLength + Const4.LongLength; } public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer reader) { return new CommitTimestampSupport.TimestampEntry(reader.ReadInt(), reader.ReadLong ()); } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj) { writer.WriteInt(((CommitTimestampSupport.TimestampEntry)obj).ParentID()); writer.WriteLong(((CommitTimestampSupport.TimestampEntry)obj).GetCommitTimestamp( )); } public virtual void DefragIndexEntry(DefragmentContextImpl context) { // we are storing ids in the btree, so the order will change when the ids change // to properly defrag the btree we need to readd all the entries throw new NotSupportedException(); } } private sealed class IdEntryByTimestamp : CommitTimestampSupport.TimestampEntryById { public override IPreparedComparison PrepareComparison(IContext context, object first ) { return new _IPreparedComparison_168(first); } private sealed class _IPreparedComparison_168 : IPreparedComparison { public _IPreparedComparison_168(object first) { this.first = first; } public int CompareTo(object second) { int result = LongHandler.Compare(((CommitTimestampSupport.TimestampEntry)first).commitTimestamp , ((CommitTimestampSupport.TimestampEntry)second).commitTimestamp); if (result != 0) { return result; } return IntHandler.Compare(((CommitTimestampSupport.TimestampEntry)first).objectId , ((CommitTimestampSupport.TimestampEntry)second).objectId); } private readonly object first; } } public virtual long VersionForId(int id) { if (IdToTimestamp() == null || id == 0) { return 0; } CommitTimestampSupport.TimestampEntry te = (CommitTimestampSupport.TimestampEntry )IdToTimestamp().Search(_container.SystemTransaction(), new CommitTimestampSupport.TimestampEntry (id, 0)); if (te == null) { return 0; } return te.GetCommitTimestamp(); } public virtual void Put(Transaction trans, int objectId, long version) { CommitTimestampSupport.TimestampEntry te = new CommitTimestampSupport.TimestampEntry (objectId, version); IdToTimestamp().Add(trans, te); TimestampToId().Add(trans, te); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/EventDispatchers.cs0000644000175000017500000001065211700531646030411 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// public sealed class EventDispatchers { private sealed class _IEventDispatcher_11 : IEventDispatcher { public _IEventDispatcher_11() { } public bool Dispatch(Transaction trans, object obj, int eventID) { return true; } public bool HasEventRegistered(int eventID) { return false; } } public static readonly IEventDispatcher NullDispatcher = new _IEventDispatcher_11 (); private static readonly string[] events = new string[] { "objectCanDelete", "objectOnDelete" , "objectOnActivate", "objectOnDeactivate", "objectOnNew", "objectOnUpdate", "objectCanActivate" , "objectCanDeactivate", "objectCanNew", "objectCanUpdate" }; internal const int CanDelete = 0; internal const int Delete = 1; internal const int Activate = 2; internal const int Deactivate = 3; internal const int New = 4; public const int Update = 5; internal const int CanActivate = 6; internal const int CanDeactivate = 7; internal const int CanNew = 8; internal const int CanUpdate = 9; internal const int DeleteCount = 2; internal const int Count = 10; private class EventDispatcherImpl : IEventDispatcher { private readonly IReflectMethod[] methods; public EventDispatcherImpl(IReflectMethod[] methods_) { methods = methods_; } public virtual bool HasEventRegistered(int eventID) { return methods[eventID] != null; } public virtual bool Dispatch(Transaction trans, object obj, int eventID) { if (methods[eventID] == null) { return true; } object[] parameters = new object[] { trans.ObjectContainer() }; ObjectContainerBase container = trans.Container(); int stackDepth = container.StackDepth(); int topLevelCallId = container.TopLevelCallId(); container.StackDepth(0); try { object res = methods[eventID].Invoke(obj, parameters); if (res is bool) { return ((bool)res); } } finally { container.StackDepth(stackDepth); container.TopLevelCallId(topLevelCallId); } return true; } } public static IEventDispatcher ForClass(ObjectContainerBase container, IReflectClass classReflector) { if (container == null || classReflector == null) { throw new ArgumentNullException(); } if (!container.DispatchsEvents()) { return NullDispatcher; } int count = EventCountFor(container); if (count == 0) { return NullDispatcher; } IReflectMethod[] handlers = EventHandlerTableFor(container, classReflector); return HasEventHandler(handlers) ? new EventDispatchers.EventDispatcherImpl(handlers ) : NullDispatcher; } private static IReflectMethod[] EventHandlerTableFor(ObjectContainerBase container , IReflectClass classReflector) { IReflectClass[] parameterClasses = new IReflectClass[] { container._handlers.IclassObjectcontainer }; IReflectMethod[] methods = new IReflectMethod[Count]; for (int i = Count - 1; i >= 0; i--) { IReflectMethod method = classReflector.GetMethod(events[i], parameterClasses); if (null == method) { method = classReflector.GetMethod(ToPascalCase(events[i]), parameterClasses); } if (method != null) { methods[i] = method; } } return methods; } private static bool HasEventHandler(IReflectMethod[] methods) { return Iterators.Any(Iterators.Iterate(methods), new _IPredicate4_118()); } private sealed class _IPredicate4_118 : IPredicate4 { public _IPredicate4_118() { } public bool Match(object candidate) { return candidate != null; } } private static int EventCountFor(ObjectContainerBase container) { CallBackMode callbackMode = container.ConfigImpl.CallbackMode(); if (callbackMode == CallBackMode.All) { return Count; } if (callbackMode == CallBackMode.DeleteOnly) { return DeleteCount; } return 0; } private static string ToPascalCase(string name) { return Sharpen.Runtime.Substring(name, 0, 1).ToUpper() + Sharpen.Runtime.Substring (name, 1); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/LazyObjectReference.cs0000644000175000017500000000245611700531646031026 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class LazyObjectReference : IObjectInfo { private readonly Transaction _transaction; private readonly int _id; public LazyObjectReference(Transaction transaction, int id) { _transaction = transaction; _id = id; } public virtual long GetInternalID() { return _id; } public virtual object GetObject() { lock (ContainerLock()) { return Reference().GetObject(); } } public virtual Db4oUUID GetUUID() { lock (ContainerLock()) { return Reference().GetUUID(); } } public virtual long GetVersion() { return GetCommitTimestamp(); } public virtual long GetCommitTimestamp() { lock (ContainerLock()) { return Reference().GetCommitTimestamp(); } } public virtual ObjectReference Reference() { HardObjectReference hardRef = _transaction.Container().GetHardObjectReferenceById (_transaction, _id); return hardRef._reference; } private object ContainerLock() { _transaction.Container().CheckClosed(); return _transaction.Container().Lock(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/0000755000175000017500000000000011700531646026633 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/FileHeader2.cs0000644000175000017500000000751511700531646031244 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; using Sharpen; namespace Db4objects.Db4o.Internal.Fileheader { /// public class FileHeader2 : NewFileHeaderBase { private static readonly int BlocksizeOffset = AccessTimeOffset + Const4.LongLength; public static readonly int HeaderLength = BlocksizeOffset + (Const4.IntLength * 5 ) + 1; private int _transactionPointerAddress = 0; // The header format is: // (byte) 'd' // (byte) 'b' // (byte) '4' // (byte) 'o' // (byte) headerVersion // (int) headerLock // (long) openTime // (long) accessTime // (int) blockSize // (int) classCollectionID // (byte) idSystemType // (int) variable part address // (int) variable part length // (int) transaction pointer address public override int Length() { return HeaderLength; } protected override void Read(LocalObjectContainer container, ByteArrayBuffer reader ) { NewTimerFileLock(container); OldEncryptionOff(container); CheckThreadFileLock(container, reader); reader.Seek(BlocksizeOffset); container.BlockSizeReadFromFile(reader.ReadInt()); SystemData systemData = container.SystemData(); systemData.ClassCollectionID(reader.ReadInt()); container.SystemData().IdSystemType(reader.ReadByte()); _variablePart = CreateVariablePart(container); int variablePartAddress = reader.ReadInt(); int variablePartLength = reader.ReadInt(); _variablePart.Read(variablePartAddress, variablePartLength); _transactionPointerAddress = reader.ReadInt(); if (_transactionPointerAddress != 0) { ByteArrayBuffer buffer = new ByteArrayBuffer(TransactionPointerLength); buffer.Read(container, _transactionPointerAddress, 0); systemData.TransactionPointer1(buffer.ReadInt()); systemData.TransactionPointer2(buffer.ReadInt()); } } public override void WriteFixedPart(LocalObjectContainer file, bool startFileLockingThread , bool shuttingDown, StatefulBuffer writer, int blockSize) { SystemData systemData = file.SystemData(); writer.Append(Signature); writer.WriteByte(Version()); writer.WriteInt((int)TimeToWrite(_timerFileLock.OpenTime(), shuttingDown)); writer.WriteLong(TimeToWrite(_timerFileLock.OpenTime(), shuttingDown)); writer.WriteLong(TimeToWrite(Runtime.CurrentTimeMillis(), shuttingDown)); writer.WriteInt(blockSize); writer.WriteInt(systemData.ClassCollectionID()); writer.WriteByte(systemData.IdSystemType()); writer.WriteInt(((FileHeaderVariablePart2)_variablePart).Address()); writer.WriteInt(((FileHeaderVariablePart2)_variablePart).Length()); writer.WriteInt(_transactionPointerAddress); writer.Write(); if (shuttingDown) { WriteVariablePart(file, true); } else { file.SyncFiles(); } if (startFileLockingThread) { file.ThreadPool().Start("db4o lock thread", _timerFileLock); } } public override void WriteTransactionPointer(Transaction systemTransaction, int transactionPointer ) { if (_transactionPointerAddress == 0) { LocalObjectContainer file = ((LocalTransaction)systemTransaction).LocalContainer( ); _transactionPointerAddress = file.AllocateSafeSlot(TransactionPointerLength).Address (); file.WriteHeader(false, false); } WriteTransactionPointer(systemTransaction, transactionPointer, _transactionPointerAddress , 0); } protected override byte Version() { return (byte)2; } protected override NewFileHeaderBase CreateNew() { return new FileHeader2(); } public override FileHeaderVariablePart CreateVariablePart(LocalObjectContainer file ) { return new FileHeaderVariablePart2(file); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/FileHeaderVariablePart.cs0000644000175000017500000000341011700531646033445 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Slots; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Fileheader { /// public abstract class FileHeaderVariablePart { protected readonly LocalObjectContainer _container; public abstract IRunnable Commit(bool shuttingDown); public abstract void Read(int variablePartAddress, int variablePartLength); protected FileHeaderVariablePart(LocalObjectContainer container) { _container = container; } public byte GetIdentifier() { return Const4.Header; } protected Db4objects.Db4o.Internal.SystemData SystemData() { return _container.SystemData(); } protected Slot AllocateSlot(int length) { Slot reusedSlot = _container.FreespaceManager().AllocateSafeSlot(length); if (reusedSlot != null) { return reusedSlot; } return _container.AppendBytes(length); } public virtual void ReadIdentity(LocalTransaction trans) { LocalObjectContainer file = trans.LocalContainer(); Db4oDatabase identity = Debug4.staticIdentity ? Db4oDatabase.StaticIdentity : (Db4oDatabase )file.GetByID(trans, SystemData().IdentityId()); if (null != identity) { file.Activate(trans, identity, new FixedActivationDepth(2)); SystemData().Identity(identity); } } // TODO: What now? // Apparently we get this state after defragment // and defragment then sets the identity. // If we blindly generate a new identity here, // ObjectUpdateFileSizeTestCase reports trouble. public abstract int MarshalledLength(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/TimerFileLock.cs0000644000175000017500000000232511700531646031655 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Fileheader { /// public abstract class TimerFileLock : IRunnable { public static TimerFileLock ForFile(LocalObjectContainer file) { return new TimerFileLockDisabled(); } public abstract void CheckHeaderLock(); public abstract void CheckOpenTime(); public abstract bool LockFile(); public abstract long OpenTime(); public abstract void SetAddresses(int baseAddress, int openTimeOffset, int accessTimeOffset ); /// public abstract void Start(); public abstract void WriteHeaderLock(); public abstract void WriteOpenTime(); /// public abstract void Close(); /// public abstract void CheckIfOtherSessionAlive(LocalObjectContainer container, int address, int offset, long lastAccessTime); public abstract void Run(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/FileHeader1.cs0000644000175000017500000000464311700531646031242 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; namespace Db4objects.Db4o.Internal.Fileheader { /// public class FileHeader1 : NewFileHeaderBase { private static readonly int TransactionPointerOffset = AccessTimeOffset + Const4. LongLength; private static readonly int BlocksizeOffset = TransactionPointerOffset + (Const4. IntLength * 2); public static readonly int HeaderLength = TransactionPointerOffset + (Const4.IntLength * 6); // The header format is: // (byte) 'd' // (byte) 'b' // (byte) '4' // (byte) 'o' // (byte) headerVersion // (int) headerLock // (long) openTime // (long) accessTime // (int) Transaction pointer 1 // (int) Transaction pointer 2 // (int) blockSize // (int) classCollectionID // (int) freespaceID // (int) variablePartID public override int Length() { return HeaderLength; } protected override void Read(LocalObjectContainer file, ByteArrayBuffer reader) { NewTimerFileLock(file); OldEncryptionOff(file); CheckThreadFileLock(file, reader); reader.Seek(TransactionPointerOffset); file.SystemData().TransactionPointer1(reader.ReadInt()); file.SystemData().TransactionPointer2(reader.ReadInt()); reader.Seek(BlocksizeOffset); file.BlockSizeReadFromFile(reader.ReadInt()); SystemData systemData = file.SystemData(); systemData.ClassCollectionID(reader.ReadInt()); reader.ReadInt(); // was freespace ID, can no longer be read _variablePart = CreateVariablePart(file); int variablePartId = reader.ReadInt(); _variablePart.Read(variablePartId, 0); } public override void WriteFixedPart(LocalObjectContainer file, bool startFileLockingThread , bool shuttingDown, StatefulBuffer writer, int blockSize) { throw new InvalidOperationException(); } public override void WriteTransactionPointer(Transaction systemTransaction, int transactionPointer ) { throw new InvalidOperationException(); } protected override NewFileHeaderBase CreateNew() { return new FileHeader1(); } protected override byte Version() { return (byte)1; } public override FileHeaderVariablePart CreateVariablePart(LocalObjectContainer file ) { return new FileHeaderVariablePart1(file); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/NewFileHeaderBase.cs0000644000175000017500000000634711700531646032431 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Fileheader { /// public abstract class NewFileHeaderBase : FileHeader { protected static readonly byte[] Signature = new byte[] { (byte)'d', (byte)'b', ( byte)'4', (byte)'o' }; protected static readonly int HeaderLockOffset = Signature.Length + 1; protected static readonly int OpenTimeOffset = HeaderLockOffset + Const4.IntLength; protected static readonly int AccessTimeOffset = OpenTimeOffset + Const4.LongLength; protected TimerFileLock _timerFileLock; protected FileHeaderVariablePart _variablePart; /// public override void Close() { if (_timerFileLock == null) { return; } _timerFileLock.Close(); } protected virtual void NewTimerFileLock(LocalObjectContainer file) { _timerFileLock = TimerFileLock.ForFile(file); _timerFileLock.SetAddresses(0, OpenTimeOffset, AccessTimeOffset); } protected abstract NewFileHeaderBase CreateNew(); protected abstract byte Version(); /// public sealed override void InitNew(LocalObjectContainer file) { NewTimerFileLock(file); OldEncryptionOff(file); _variablePart = CreateVariablePart(file); WriteVariablePart(file); } public abstract FileHeaderVariablePart CreateVariablePart(LocalObjectContainer file ); protected virtual void OldEncryptionOff(LocalObjectContainer file) { file._handlers.OldEncryptionOff(); } public sealed override void WriteVariablePart(LocalObjectContainer file, bool shuttingDown ) { if (!IsInitalized()) { return; } IRunnable commitHook = Commit(shuttingDown); file.SyncFiles(); commitHook.Run(); file.SyncFiles(); } private bool IsInitalized() { return _variablePart != null; } protected override FileHeader NewOnSignatureMatch(LocalObjectContainer file, ByteArrayBuffer reader) { if (SignatureMatches(reader, Signature, Version())) { return CreateNew(); } return null; } public override void CompleteInterruptedTransaction(LocalObjectContainer container ) { SystemData systemData = container.SystemData(); container.IdSystem().CompleteInterruptedTransaction(systemData.TransactionPointer1 (), systemData.TransactionPointer2()); } protected virtual void CheckThreadFileLock(LocalObjectContainer container, ByteArrayBuffer reader) { reader.Seek(AccessTimeOffset); long lastAccessTime = reader.ReadLong(); if (FileHeader.LockedByOtherSession(container, lastAccessTime)) { _timerFileLock.CheckIfOtherSessionAlive(container, 0, AccessTimeOffset, lastAccessTime ); } } public override void ReadIdentity(LocalObjectContainer container) { _variablePart.ReadIdentity((LocalTransaction)container.SystemTransaction()); } public override IRunnable Commit(bool shuttingDown) { return _variablePart.Commit(shuttingDown); } } } FileHeaderVariablePart1.cs0000644000175000017500000000373411700531646033460 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; using Db4objects.Db4o.Internal.Slots; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Fileheader { /// public class FileHeaderVariablePart1 : FileHeaderVariablePart { private const int Length = 1 + (Const4.IntLength * 4) + Const4.LongLength + Const4 .AddedLength; private int _id; public FileHeaderVariablePart1(LocalObjectContainer container, int id) : base(container ) { // The variable part format is: // (int) converter version // (byte) freespace system used // (int) freespace address // (int) identity ID // (long) versionGenerator // (int) uuid index ID _id = id; } public FileHeaderVariablePart1(LocalObjectContainer container) : this(container, 0) { } public virtual int OwnLength() { return Length; } public virtual void ReadThis(ByteArrayBuffer buffer) { SystemData().ConverterVersion(buffer.ReadInt()); SystemData().FreespaceSystem(buffer.ReadByte()); buffer.ReadInt(); // was BTreeFreespaceId, converted to slot, can no longer be used SystemData().IdentityId(buffer.ReadInt()); SystemData().LastTimeStampID(buffer.ReadLong()); SystemData().UuidIndexId(buffer.ReadInt()); } public virtual void WriteThis(ByteArrayBuffer buffer) { throw new InvalidOperationException(); } public override IRunnable Commit(bool shuttingDown) { throw new InvalidOperationException(); } public virtual int Id() { return _id; } public override void Read(int variablePartID, int unused) { _id = variablePartID; Slot slot = _container.ReadPointerSlot(_id); ByteArrayBuffer buffer = _container.ReadBufferBySlot(slot); ReadThis(buffer); } public override int MarshalledLength() { return OwnLength(); } } } FileHeaderVariablePart3.cs0000644000175000017500000000210711700531646033453 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; namespace Db4objects.Db4o.Internal.Fileheader { /// public class FileHeaderVariablePart3 : FileHeaderVariablePart2 { public FileHeaderVariablePart3(LocalObjectContainer container) : base(container) { } public override int OwnLength() { return base.OwnLength() + Const4.IntLength * 2; } protected override void ReadBuffer(ByteArrayBuffer buffer, bool versionsAreConsistent ) { base.ReadBuffer(buffer, versionsAreConsistent); SystemData systemData = SystemData(); systemData.IdToTimestampIndexId(buffer.ReadInt()); systemData.TimestampToIdIndexId(buffer.ReadInt()); } protected override void WriteBuffer(ByteArrayBuffer buffer, bool shuttingDown) { base.WriteBuffer(buffer, shuttingDown); SystemData systemData = SystemData(); buffer.WriteInt(systemData.IdToTimestampIndexId()); buffer.WriteInt(systemData.TimestampToIdIndexId()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/FileHeader.cs0000644000175000017500000001060311700531646031152 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Fileheader { /// public abstract class FileHeader { public const int TransactionPointerLength = Const4.IntLength * 2; private static readonly FileHeader[] AvailableFileHeaders = new FileHeader[] { new FileHeader1(), new FileHeader2(), new FileHeader3() }; public static NewFileHeaderBase NewCurrentFileHeader() { return new FileHeader3(); } private static int ReaderLength() { int length = AvailableFileHeaders[0].Length(); for (int i = 1; i < AvailableFileHeaders.Length; i++) { length = Math.Max(length, AvailableFileHeaders[i].Length()); } return length; } /// public static FileHeader Read(LocalObjectContainer file) { ByteArrayBuffer reader = PrepareFileHeaderReader(file); FileHeader header = DetectFileHeader(file, reader); if (header == null) { Exceptions4.ThrowRuntimeException(Db4objects.Db4o.Internal.Messages.IncompatibleFormat , file.ToString()); } else { header.Read(file, reader); } return header; } public virtual FileHeader Convert(LocalObjectContainer file) { FileHeader3 fileHeader = new FileHeader3(); fileHeader.InitNew(file); return fileHeader; } private static ByteArrayBuffer PrepareFileHeaderReader(LocalObjectContainer file) { ByteArrayBuffer reader = new ByteArrayBuffer(ReaderLength()); reader.Read(file, 0, 0); return reader; } private static FileHeader DetectFileHeader(LocalObjectContainer file, ByteArrayBuffer reader) { for (int i = 0; i < AvailableFileHeaders.Length; i++) { reader.Seek(0); FileHeader result = AvailableFileHeaders[i].NewOnSignatureMatch(file, reader); if (result != null) { return result; } } return null; } /// public abstract void Close(); /// public abstract void InitNew(LocalObjectContainer file); public abstract void CompleteInterruptedTransaction(LocalObjectContainer container ); public abstract int Length(); protected abstract FileHeader NewOnSignatureMatch(LocalObjectContainer file, ByteArrayBuffer reader); protected virtual long TimeToWrite(long time, bool shuttingDown) { return shuttingDown ? 0 : time; } protected abstract void Read(LocalObjectContainer file, ByteArrayBuffer reader); protected virtual bool SignatureMatches(ByteArrayBuffer reader, byte[] signature, byte version) { for (int i = 0; i < signature.Length; i++) { if (reader.ReadByte() != signature[i]) { return false; } } return reader.ReadByte() == version; } // TODO: freespaceID should not be passed here, it should be taken from SystemData public abstract void WriteFixedPart(LocalObjectContainer file, bool startFileLockingThread , bool shuttingDown, StatefulBuffer writer, int blockSize); public abstract void WriteTransactionPointer(Transaction systemTransaction, int transactionPointer ); protected virtual void WriteTransactionPointer(Transaction systemTransaction, int transactionPointer, int address, int offset) { StatefulBuffer bytes = new StatefulBuffer(systemTransaction, address, TransactionPointerLength ); bytes.MoveForward(offset); bytes.WriteInt(transactionPointer); bytes.WriteInt(transactionPointer); // Dangerous write. // On corruption transaction pointers will not be the same and nothing will happen. bytes.Write(); } public virtual void WriteVariablePart(LocalObjectContainer file) { WriteVariablePart(file, false); } public abstract void WriteVariablePart(LocalObjectContainer file, bool shuttingDown ); public static bool LockedByOtherSession(LocalObjectContainer container, long lastAccessTime ) { return container.NeedsLockFileThread() && (lastAccessTime != 0); } public abstract void ReadIdentity(LocalObjectContainer container); public abstract IRunnable Commit(bool shuttingDown); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/FileHeader3.cs0000644000175000017500000000125111700531646031234 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; namespace Db4objects.Db4o.Internal.Fileheader { /// public class FileHeader3 : FileHeader2 { public override FileHeaderVariablePart CreateVariablePart(LocalObjectContainer file ) { return new FileHeaderVariablePart3(file); } protected override byte Version() { return (byte)3; } protected override NewFileHeaderBase CreateNew() { return new FileHeader3(); } public override FileHeader Convert(LocalObjectContainer file) { return this; } } } FileHeaderVariablePart2.cs0000644000175000017500000001761211700531646033461 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; using Db4objects.Db4o.Internal.Slots; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Fileheader { /// public class FileHeaderVariablePart2 : FileHeaderVariablePart { private const int ChecksumLength = Const4.LongLength; private const int SingleLength = ChecksumLength + (Const4.IntLength * 8) + Const4 .LongLength + 1 + Const4.AddedLength; private int _address; private int _length; public FileHeaderVariablePart2(LocalObjectContainer container, int address, int length ) : base(container) { // The variable part format is: // (long) checksum // (int) address of InMemoryIdSystem slot // (int) length of InMemoryIdSystem slot // (int) address of InMemoryFreespace // (int) length of InMemoryFreespace // (int) BTreeFreespace id // (int) converter version // (int) uuid index ID // (int) identity ID // (long) versionGenerator // (byte) freespace system used _address = address; _length = length; } public FileHeaderVariablePart2(LocalObjectContainer container) : this(container, 0, 0) { } public override IRunnable Commit(bool shuttingDown) { int length = OwnLength(); if (_address == 0 || _length < length) { Slot slot = AllocateSlot(MarshalledLength(length)); _address = slot.Address(); _length = length; } ByteArrayBuffer buffer = new ByteArrayBuffer(length); Marshall(buffer, shuttingDown); WriteToFile(0, buffer); return new _IRunnable_65(this, length, buffer); } private sealed class _IRunnable_65 : IRunnable { public _IRunnable_65(FileHeaderVariablePart2 _enclosing, int length, ByteArrayBuffer buffer) { this._enclosing = _enclosing; this.length = length; this.buffer = buffer; } public void Run() { this._enclosing.WriteToFile(length * 2, buffer); } private readonly FileHeaderVariablePart2 _enclosing; private readonly int length; private readonly ByteArrayBuffer buffer; } private int MarshalledLength(int length) { return length * 4; } private void WriteToFile(int startAdress, ByteArrayBuffer buffer) { _container.WriteEncrypt(buffer, _address, startAdress); _container.WriteEncrypt(buffer, _address, startAdress + _length); } public virtual int OwnLength() { return SingleLength; } public virtual int Address() { return _address; } public virtual int Length() { return _length; } public override void Read(int address, int length) { _address = address; _length = length; ByteArrayBuffer buffer = _container.ReadBufferBySlot(new Slot(address, MarshalledLength (length))); bool versionsAreConsistent = VersionsAreConsistentAndSeek(buffer); // TODO: Diagnostic message if versions aren't consistent. ReadBuffer(buffer, versionsAreConsistent); } protected virtual void ReadBuffer(ByteArrayBuffer buffer, bool versionsAreConsistent ) { buffer.IncrementOffset(ChecksumLength); SystemData systemData = SystemData(); systemData.IdSystemSlot(ReadSlot(buffer, false)); systemData.InMemoryFreespaceSlot(ReadSlot(buffer, !versionsAreConsistent)); systemData.BTreeFreespaceId(buffer.ReadInt()); systemData.ConverterVersion(buffer.ReadInt()); systemData.UuidIndexId(buffer.ReadInt()); systemData.IdentityId(buffer.ReadInt()); systemData.LastTimeStampID(buffer.ReadLong()); systemData.FreespaceSystem(buffer.ReadByte()); } private Slot ReadSlot(ByteArrayBuffer buffer, bool readZero) { Slot slot = new Slot(buffer.ReadInt(), buffer.ReadInt()); if (readZero) { return Slot.Zero; } return slot; } private void Marshall(ByteArrayBuffer buffer, bool shuttingDown) { int checkSumOffset = buffer.Offset(); buffer.IncrementOffset(ChecksumLength); int checkSumBeginOffset = buffer.Offset(); WriteBuffer(buffer, shuttingDown); int checkSumEndOffSet = buffer.Offset(); byte[] bytes = buffer._buffer; int length = checkSumEndOffSet - checkSumBeginOffset; long checkSum = CRC32.CheckSum(bytes, checkSumBeginOffset, length); buffer.Seek(checkSumOffset); buffer.WriteLong(checkSum); buffer.Seek(checkSumEndOffSet); } protected virtual void WriteBuffer(ByteArrayBuffer buffer, bool shuttingDown) { SystemData systemData = SystemData(); WriteSlot(buffer, systemData.IdSystemSlot(), false); WriteSlot(buffer, systemData.InMemoryFreespaceSlot(), !shuttingDown); buffer.WriteInt(systemData.BTreeFreespaceId()); buffer.WriteInt(systemData.ConverterVersion()); buffer.WriteInt(systemData.UuidIndexId()); Db4oDatabase identity = systemData.Identity(); buffer.WriteInt(identity == null ? 0 : identity.GetID(_container.SystemTransaction ())); buffer.WriteLong(systemData.LastTimeStampID()); buffer.WriteByte(systemData.FreespaceSystem()); } private void WriteSlot(ByteArrayBuffer buffer, Slot slot, bool writeZero) { if (writeZero || slot == null) { buffer.WriteInt(0); buffer.WriteInt(0); return; } buffer.WriteInt(slot.Address()); buffer.WriteInt(slot.Length()); } private bool CheckSumOK(ByteArrayBuffer buffer, int offset) { int initialOffSet = buffer.Offset(); int length = OwnLength(); length -= ChecksumLength; buffer.Seek(offset); long readCheckSum = buffer.ReadLong(); int checkSumBeginOffset = buffer.Offset(); byte[] bytes = buffer._buffer; long calculatedCheckSum = CRC32.CheckSum(bytes, checkSumBeginOffset, length); buffer.Seek(initialOffSet); return calculatedCheckSum == readCheckSum; } private bool VersionsAreConsistentAndSeek(ByteArrayBuffer buffer) { byte[] bytes = buffer._buffer; int length = OwnLength(); int[] offsets = Offsets(); bool different = false; for (int i = 0; i < length; i++) { byte b = bytes[offsets[0] + i]; for (int j = 1; j < 4; j++) { if (b != bytes[offsets[j] + i]) { different = true; break; } } } if (!different) { // The following line cements our checksum algorithm in stone. // Things should be safe enough if we remove the throw. // If all four versions of the header are the same, // it's bound to be OK. (unless all bytes are zero or // greyed out by some kind of overwriting algorithm.) int firstOffset = 0; if (!CheckSumOK(buffer, firstOffset)) { throw new Db4oFileHeaderCorruptionException(); } return true; } bool firstPairDiffers = false; bool secondPairDiffers = false; for (int i = 0; i < length; i++) { if (bytes[offsets[0] + i] != bytes[offsets[1] + i]) { firstPairDiffers = true; } if (bytes[offsets[2] + i] != bytes[offsets[3] + i]) { secondPairDiffers = true; } } if (!secondPairDiffers) { if (CheckSumOK(buffer, offsets[2])) { buffer.Seek(offsets[2]); return false; } } if (firstPairDiffers) { // Should never ever happen, we are toast. // We could still try to use any random version of // the header but which one? // Maybe the first of the second pair could be an // option for a recovery tool, or it could try all // versions. throw new Db4oFileHeaderCorruptionException(); } if (!CheckSumOK(buffer, 0)) { throw new Db4oFileHeaderCorruptionException(); } return false; } private int[] Offsets() { return new int[] { 0, OwnLength(), OwnLength() * 2, OwnLength() * 3 }; } public override int MarshalledLength() { return MarshalledLength(OwnLength()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Fileheader/TimerFileLockDisabled.cs0000644000175000017500000000207411700531646033306 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Fileheader; namespace Db4objects.Db4o.Internal.Fileheader { /// public class TimerFileLockDisabled : TimerFileLock { public override void CheckHeaderLock() { } public override void CheckOpenTime() { } public override void Close() { } public override bool LockFile() { return false; } public override long OpenTime() { return 0; } public override void Run() { } public override void SetAddresses(int baseAddress, int openTimeOffset, int accessTimeOffset ) { } public override void Start() { } public override void WriteHeaderLock() { } public override void WriteOpenTime() { } /// public override void CheckIfOtherSessionAlive(LocalObjectContainer container, int address, int offset, long lastAccessTime) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/0000755000175000017500000000000011700531646025707 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/SlotChange.cs0000644000175000017500000001332611700531646030272 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Slots { /// public class SlotChange : TreeInt { private class SlotChangeOperation { private readonly string _type; public SlotChangeOperation(string type) { _type = type; } internal static readonly SlotChange.SlotChangeOperation create = new SlotChange.SlotChangeOperation ("create"); internal static readonly SlotChange.SlotChangeOperation update = new SlotChange.SlotChangeOperation ("update"); internal static readonly SlotChange.SlotChangeOperation delete = new SlotChange.SlotChangeOperation ("delete"); public override string ToString() { return _type; } } private SlotChange.SlotChangeOperation _firstOperation; private SlotChange.SlotChangeOperation _currentOperation; protected Slot _newSlot; public SlotChange(int id) : base(id) { } public override object ShallowClone() { SlotChange sc = new SlotChange(0); sc.NewSlot(_newSlot); return base.ShallowCloneInternal(sc); } public virtual void AccumulateFreeSlot(TransactionalIdSystemImpl idSystem, FreespaceCommitter freespaceCommitter, bool forFreespace) { if (ForFreespace() != forFreespace) { return; } if (_firstOperation == SlotChange.SlotChangeOperation.create) { return; } if (_currentOperation == SlotChange.SlotChangeOperation.update || _currentOperation == SlotChange.SlotChangeOperation.delete) { Slot slot = ModifiedSlotInParentIdSystem(idSystem); if (Slot.IsNull(slot)) { slot = idSystem.CommittedSlot(_key); } // No old slot at all can be the case if the object // has been deleted by another transaction and we add it again. if (!Slot.IsNull(slot)) { freespaceCommitter.DelayedFree(slot, FreeToSystemFreespaceSystem()); } } } protected virtual bool ForFreespace() { return false; } protected virtual Slot ModifiedSlotInParentIdSystem(TransactionalIdSystemImpl idSystem ) { return idSystem.ModifiedSlotInParentIdSystem(_key); } public virtual bool IsDeleted() { return SlotModified() && _newSlot.IsNull(); } public virtual bool IsNew() { return _firstOperation == SlotChange.SlotChangeOperation.create; } private bool IsFreeOnRollback() { return !Slot.IsNull(_newSlot); } public bool SlotModified() { return _newSlot != null; } /// FIXME: Check where pointers should be freed on commit. /// /// FIXME: Check where pointers should be freed on commit. /// This should be triggered in this class. /// public virtual Slot NewSlot() { // private final boolean isFreePointerOnCommit() { // return isBitSet(FREE_POINTER_ON_COMMIT_BIT); // } return _newSlot; } public override object Read(ByteArrayBuffer reader) { SlotChange change = new SlotChange(reader.ReadInt()); Slot newSlot = new Slot(reader.ReadInt(), reader.ReadInt()); change.NewSlot(newSlot); return change; } public virtual void Rollback(IFreespaceManager freespaceManager) { if (IsFreeOnRollback()) { freespaceManager.Free(_newSlot); } } public override void Write(ByteArrayBuffer writer) { if (SlotModified()) { writer.WriteInt(_key); writer.WriteInt(_newSlot.Address()); writer.WriteInt(_newSlot.Length()); } } public void WritePointer(LocalObjectContainer container) { if (SlotModified()) { container.WritePointer(_key, _newSlot); } } private void NewSlot(Slot slot) { _newSlot = slot; } public virtual void NotifySlotUpdated(IFreespaceManager freespaceManager, Slot slot ) { if (DTrace.enabled) { DTrace.NotifySlotUpdated.LogLength(_key, slot); } FreePreviouslyModifiedSlot(freespaceManager); _newSlot = slot; Operation(SlotChange.SlotChangeOperation.update); } protected virtual void FreePreviouslyModifiedSlot(IFreespaceManager freespaceManager ) { if (Slot.IsNull(_newSlot)) { return; } Free(freespaceManager, _newSlot); _newSlot = null; } protected virtual void Free(IFreespaceManager freespaceManager, Slot slot) { if (slot.IsNull()) { return; } if (freespaceManager == null) { return; } freespaceManager.Free(slot); } private void Operation(SlotChange.SlotChangeOperation operation) { if (_firstOperation == null) { _firstOperation = operation; } _currentOperation = operation; } public virtual void NotifySlotCreated(Slot slot) { if (DTrace.enabled) { DTrace.NotifySlotCreated.Log(_key); DTrace.NotifySlotCreated.LogLength(slot); } Operation(SlotChange.SlotChangeOperation.create); _newSlot = slot; } public virtual void NotifyDeleted(IFreespaceManager freespaceManager) { if (DTrace.enabled) { DTrace.NotifySlotDeleted.Log(_key); } Operation(SlotChange.SlotChangeOperation.delete); FreePreviouslyModifiedSlot(freespaceManager); _newSlot = Slot.Zero; } public virtual bool RemoveId() { return false; } public override string ToString() { string str = "id: " + _key; if (_newSlot != null) { str += " newSlot: " + _newSlot; } return str; } protected virtual bool FreeToSystemFreespaceSystem() { return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/FreespaceSlotChange.cs0000644000175000017500000000057111700531646032106 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Slots { /// public class FreespaceSlotChange : IdSystemSlotChange { public FreespaceSlotChange(int id) : base(id) { } protected override bool ForFreespace() { return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/Slot.cs0000644000175000017500000000564711700531646027173 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Slots { /// public class Slot { private readonly int _address; private readonly int _length; public static readonly Db4objects.Db4o.Internal.Slots.Slot Zero = new Db4objects.Db4o.Internal.Slots.Slot (0, 0); public const int New = -1; public const int Update = -2; public Slot(int address, int length) { _address = address; _length = length; } public virtual int Address() { return _address; } public virtual int Length() { return _length; } public override bool Equals(object obj) { if (obj == this) { return true; } if (!(obj is Db4objects.Db4o.Internal.Slots.Slot)) { return false; } Db4objects.Db4o.Internal.Slots.Slot other = (Db4objects.Db4o.Internal.Slots.Slot) obj; return (_address == other._address) && (Length() == other.Length()); } public override int GetHashCode() { return _address ^ Length(); } public virtual Db4objects.Db4o.Internal.Slots.Slot SubSlot(int offset) { return new Db4objects.Db4o.Internal.Slots.Slot(_address + offset, Length() - offset ); } public override string ToString() { return "[A:" + _address + ",L:" + Length() + "]"; } public virtual Db4objects.Db4o.Internal.Slots.Slot Truncate(int requiredLength) { return new Db4objects.Db4o.Internal.Slots.Slot(_address, requiredLength); } public static int MarshalledLength = Const4.IntLength * 2; public virtual int CompareByAddress(Db4objects.Db4o.Internal.Slots.Slot slot) { // FIXME: This is the wrong way around !!! // Fix here and in all referers. int res = slot._address - _address; if (res != 0) { return res; } return slot.Length() - Length(); } public virtual int CompareByLength(Db4objects.Db4o.Internal.Slots.Slot slot) { // FIXME: This is the wrong way around !!! // Fix here and in all referers. int res = slot.Length() - Length(); if (res != 0) { return res; } return slot._address - _address; } public virtual bool IsDirectlyPreceding(Db4objects.Db4o.Internal.Slots.Slot other ) { return _address + Length() == other._address; } public virtual Db4objects.Db4o.Internal.Slots.Slot Append(Db4objects.Db4o.Internal.Slots.Slot slot) { return new Db4objects.Db4o.Internal.Slots.Slot(Address(), _length + slot.Length() ); } public virtual bool IsNull() { return Address() == 0 || Length() == 0; } public virtual bool IsNew() { return _address == New; } public virtual bool IsUpdate() { return _address == Update; } public static bool IsNull(Db4objects.Db4o.Internal.Slots.Slot slot) { return slot == null || slot.IsNull(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/SlotChangeFactory.cs0000644000175000017500000000317711700531646031625 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Slots { /// public class SlotChangeFactory { private SlotChangeFactory() { } public virtual SlotChange NewInstance(int id) { return new SlotChange(id); } public static readonly Db4objects.Db4o.Internal.Slots.SlotChangeFactory UserObjects = new Db4objects.Db4o.Internal.Slots.SlotChangeFactory(); private sealed class _SlotChangeFactory_20 : Db4objects.Db4o.Internal.Slots.SlotChangeFactory { public _SlotChangeFactory_20() { } public override SlotChange NewInstance(int id) { return new SystemSlotChange(id); } } public static readonly Db4objects.Db4o.Internal.Slots.SlotChangeFactory SystemObjects = new _SlotChangeFactory_20(); private sealed class _SlotChangeFactory_26 : Db4objects.Db4o.Internal.Slots.SlotChangeFactory { public _SlotChangeFactory_26() { } public override SlotChange NewInstance(int id) { return new IdSystemSlotChange(id); } } public static readonly Db4objects.Db4o.Internal.Slots.SlotChangeFactory IdSystem = new _SlotChangeFactory_26(); private sealed class _SlotChangeFactory_32 : Db4objects.Db4o.Internal.Slots.SlotChangeFactory { public _SlotChangeFactory_32() { } public override SlotChange NewInstance(int id) { return new FreespaceSlotChange(id); } } public static readonly Db4objects.Db4o.Internal.Slots.SlotChangeFactory FreeSpace = new _SlotChangeFactory_32(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/SystemSlotChange.cs0000644000175000017500000000151011700531646031467 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Slots { /// public class SystemSlotChange : SlotChange { public SystemSlotChange(int id) : base(id) { } public override void AccumulateFreeSlot(TransactionalIdSystemImpl idSystem, FreespaceCommitter freespaceCommitter, bool forFreespace) { base.AccumulateFreeSlot(idSystem, freespaceCommitter, forFreespace); } // FIXME: If we are doing a delete, we should also free our pointer here. protected override Slot ModifiedSlotInParentIdSystem(TransactionalIdSystemImpl idSystem ) { return null; } public override bool RemoveId() { return _newSlot == Slot.Zero; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/Pointer4.cs0000644000175000017500000000105311700531646027741 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Slots { /// public class Pointer4 { public readonly int _id; public readonly Slot _slot; public Pointer4(int id, Slot slot) { _id = id; _slot = slot; } public virtual int Address() { return _slot.Address(); } public virtual int Id() { return _id; } public virtual int Length() { return _slot.Length(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/ReferencedSlot.cs0000644000175000017500000000262111700531646031143 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Slots { /// public class ReferencedSlot : TreeInt { private Db4objects.Db4o.Internal.Slots.Slot _slot; private int _references; public ReferencedSlot(int a_key) : base(a_key) { } public override object ShallowClone() { Db4objects.Db4o.Internal.Slots.ReferencedSlot rs = new Db4objects.Db4o.Internal.Slots.ReferencedSlot (_key); rs._slot = _slot; rs._references = _references; return base.ShallowCloneInternal(rs); } public virtual void PointTo(Db4objects.Db4o.Internal.Slots.Slot slot) { _slot = slot; } public virtual Tree Free(LocalObjectContainer file, Tree treeRoot, Db4objects.Db4o.Internal.Slots.Slot slot) { file.Free(_slot.Address(), _slot.Length()); if (RemoveReferenceIsLast()) { if (treeRoot != null) { return treeRoot.RemoveNode(this); } } PointTo(slot); return treeRoot; } public virtual bool AddReferenceIsFirst() { _references++; return (_references == 1); } public virtual bool RemoveReferenceIsLast() { _references--; return _references < 1; } public virtual Db4objects.Db4o.Internal.Slots.Slot Slot() { return _slot; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Slots/IdSystemSlotChange.cs0000644000175000017500000000246011700531646031751 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Slots { /// public class IdSystemSlotChange : SystemSlotChange { private Collection4 _freed; public IdSystemSlotChange(int id) : base(id) { } protected override void Free(IFreespaceManager freespaceManager, Slot slot) { if (slot.IsNull()) { return; } if (_freed == null) { _freed = new Collection4(); } _freed.Add(slot); } public override void AccumulateFreeSlot(TransactionalIdSystemImpl idSystem, FreespaceCommitter freespaceCommitter, bool forFreespace) { if (ForFreespace() != forFreespace) { return; } base.AccumulateFreeSlot(idSystem, freespaceCommitter, forFreespace); if (_freed == null) { return; } IEnumerator iterator = _freed.GetEnumerator(); while (iterator.MoveNext()) { freespaceCommitter.DelayedFree((Slot)iterator.Current, FreeToSystemFreespaceSystem ()); } } protected override bool FreeToSystemFreespaceSystem() { return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/0000755000175000017500000000000011700531646026343 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/DoubleHandler.cs0000644000175000017500000000426411700531646031410 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { /// public class DoubleHandler : LongHandler { private static readonly double Defaultvalue = System.Convert.ToDouble(0); public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToDouble(obj); } public override object DefaultValue() { return Defaultvalue; } public override Type PrimitiveJavaClass() { return typeof(double); } /// public override object Read(MarshallerFamily mf, StatefulBuffer buffer, bool redirect ) { return mf._primitive.ReadDouble(buffer); } internal override object Read1(ByteArrayBuffer buffer) { return PrimitiveMarshaller().ReadDouble(buffer); } public override void Write(object a_object, ByteArrayBuffer a_bytes) { a_bytes.WriteLong(Platform4.DoubleToLong(((double)a_object))); } public override object Read(IReadContext context) { long l = (long)base.Read(context); return Platform4.LongToDouble(l); } public override void Write(IWriteContext context, object obj) { context.WriteLong(Platform4.DoubleToLong(((double)obj))); } public override IPreparedComparison InternalPrepareComparison(object source) { double sourceDouble = ((double)source); return new _IPreparedComparison_55(sourceDouble); } private sealed class _IPreparedComparison_55 : IPreparedComparison { public _IPreparedComparison_55(double sourceDouble) { this.sourceDouble = sourceDouble; } public int CompareTo(object target) { if (target == null) { return 1; } double targetDouble = ((double)target); return sourceDouble == targetDouble ? 0 : (sourceDouble < targetDouble ? -1 : 1); } private readonly double sourceDouble; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Versions/0000755000175000017500000000000011700531646030153 5ustar00meebeymeebey00000000000000OpenTypeHandler7.cs0000644000175000017500000000733011700531646033556 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Versions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers.Versions { public class OpenTypeHandler7 : OpenTypeHandler { public OpenTypeHandler7(ObjectContainerBase container) : base(container) { } public override object Read(IReadContext readContext) { IInternalReadContext context = (IInternalReadContext)readContext; int payloadOffset = context.ReadInt(); if (payloadOffset == 0) { context.NotifyNullReferenceSkipped(); return null; } int savedOffSet = context.Offset(); try { ITypeHandler4 typeHandler = ReadTypeHandler(context, payloadOffset); if (typeHandler == null) { return null; } if (IsPlainObject(typeHandler)) { return ReadPlainObject(readContext); } SeekSecondaryOffset(context, typeHandler); return context.ReadAtCurrentSeekPosition(typeHandler); } finally { context.Seek(savedOffSet); } } public override void Defragment(IDefragmentContext context) { int payLoadOffSet = context.ReadInt(); if (payLoadOffSet == 0) { return; } int savedOffSet = context.Offset(); context.Seek(payLoadOffSet); int classMetadataId = context.CopyIDReturnOriginalID(); ITypeHandler4 typeHandler = CorrectTypeHandlerVersionFor(context, classMetadataId ); if (typeHandler != null) { if (IsPlainObject(typeHandler)) { context.CopySlotlessID(); } else { SeekSecondaryOffset(context, typeHandler); context.Defragment(typeHandler); } } context.Seek(savedOffSet); } private object ReadPlainObject(IReadContext context) { int id = context.ReadInt(); Transaction transaction = context.Transaction(); object obj = transaction.ObjectForIdFromCache(id); if (obj != null) { return obj; } obj = new object(); AddReference(context, obj, id); return obj; } private void AddReference(IContext context, object obj, int id) { Transaction transaction = context.Transaction(); ObjectReference @ref = new _ObjectReference_74(id); @ref.ClassMetadata(transaction.Container().ClassMetadataForID(Handlers4.UntypedId )); @ref.SetObjectWeak(transaction.Container(), obj); transaction.AddNewReference(@ref); } private sealed class _ObjectReference_74 : ObjectReference { public _ObjectReference_74(int baseArg1) : base(baseArg1) { this._firstUpdate = true; } internal bool _firstUpdate; public override void WriteUpdate(Transaction transaction, IUpdateDepth updatedepth ) { if (!this._firstUpdate) { base.WriteUpdate(transaction, updatedepth); return; } this._firstUpdate = false; ObjectContainerBase container = transaction.Container(); this.SetStateClean(); MarshallingContext context = new MarshallingContext(transaction, this, updatedepth , false); Handlers4.Write(this.ClassMetadata().TypeHandler(), context, this.GetObject()); int length = this.Container().BlockConverter().BlockAlignedBytes(context.MarshalledLength ()); Slot slot = context.AllocateNewSlot(length); Pointer4 pointer = new Pointer4(this.GetID(), slot); ByteArrayBuffer buffer = context.ToWriteBuffer(pointer); container.WriteUpdate(transaction, pointer, this.ClassMetadata(), ArrayType.None, buffer); if (this.IsActive()) { this.SetStateClean(); } } } } } OpenTypeHandler0.cs0000644000175000017500000000625211700531646033551 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Versions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.IO; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Versions; using Db4objects.Db4o.Internal.Mapping; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers.Versions { /// public class OpenTypeHandler0 : OpenTypeHandler2 { public OpenTypeHandler0(ObjectContainerBase container) : base(container) { } public override object Read(IReadContext context) { return context.ReadObject(); } public override ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { int id = 0; int offset = context.Offset(); try { id = context.ReadInt(); } catch (Exception) { } context.Seek(offset); if (id != 0) { StatefulBuffer reader = context.Container().ReadStatefulBufferById(context.Transaction (), id); if (reader != null) { ObjectHeader oh = new ObjectHeader(context.Container(), reader); try { if (oh.ClassMetadata() != null) { context.Buffer(reader); return oh.ClassMetadata().SeekCandidateHandler(context); } } catch (Exception e) { } } } // TODO: Check Exception Types // Errors typically occur, if classes don't match return null; } public override ObjectID ReadObjectID(IInternalReadContext context) { int id = context.ReadInt(); return id == 0 ? ObjectID.IsNull : new ObjectID(id); } public override void Defragment(IDefragmentContext context) { int sourceId = context.SourceBuffer().ReadInt(); if (sourceId == 0) { context.TargetBuffer().WriteInt(0); return; } int targetId = 0; try { targetId = context.MappedID(sourceId); } catch (MappingNotFoundException) { targetId = CopyDependentSlot(context, sourceId); } context.TargetBuffer().WriteInt(targetId); } private int CopyDependentSlot(IDefragmentContext context, int sourceId) { try { ByteArrayBuffer sourceBuffer = context.SourceBufferById(sourceId); Slot targetPayloadSlot = context.AllocateTargetSlot(sourceBuffer.Length()); int targetId = context.Services().TargetNewId(); context.Services().MapIDs(sourceId, targetId, false); context.Services().Mapping().MapId(targetId, targetPayloadSlot); DefragmentContextImpl payloadContext = new DefragmentContextImpl(sourceBuffer, (DefragmentContextImpl )context); int clazzId = payloadContext.CopyIDReturnOriginalID(); ITypeHandler4 payloadHandler = payloadContext.TypeHandlerForId(clazzId); ITypeHandler4 versionedPayloadHandler = HandlerRegistry.CorrectHandlerVersion(payloadContext , payloadHandler); versionedPayloadHandler.Defragment(payloadContext); payloadContext.WriteToTarget(targetPayloadSlot.Address()); return targetId; } catch (IOException ioexc) { throw new Db4oIOException(ioexc); } } } } OpenTypeHandler2.cs0000644000175000017500000000123411700531646033546 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Versions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Versions; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers.Versions { /// public class OpenTypeHandler2 : OpenTypeHandler7 { public OpenTypeHandler2(ObjectContainerBase container) : base(container) { } protected override void SeekSecondaryOffset(IReadBuffer buffer, ITypeHandler4 typeHandler ) { if (Handlers4.HandlesPrimitiveArray(typeHandler)) { buffer.Seek(buffer.ReadInt()); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/StringBufferHandler.cs0000644000175000017500000000105011700531646032564 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Text; using Db4objects.Db4o.Internal.Handlers; namespace Db4objects.Db4o.Internal.Handlers { public sealed class StringBufferHandler : StringBasedValueTypeHandlerBase { public StringBufferHandler() : base(typeof(StringBuilder)) { } protected override string ConvertObject(object obj) { return ((StringBuilder)obj).ToString(); } protected override object ConvertString(string str) { return new StringBuilder(str); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/ShortHandler0.cs0000644000175000017500000000066511700531646031356 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class ShortHandler0 : ShortHandler { public override object Read(IReadContext context) { short value = (short)base.Read(context); if (value == short.MaxValue) { return null; } return value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/IFieldAwareTypeHandler.cs0000644000175000017500000000165411700531646033154 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// public interface IFieldAwareTypeHandler : IReferenceTypeHandler, IVersionedTypeHandler , ICascadingTypeHandler, IVirtualAttributeHandler { void AddFieldIndices(ObjectIdContextImpl context); void CollectIDs(CollectIdContext context, IPredicate4 predicate); void DeleteMembers(DeleteContextImpl deleteContext, bool isUpdate); void ReadVirtualAttributes(ObjectReferenceContext context); void ClassMetadata(Db4objects.Db4o.Internal.ClassMetadata classMetadata); bool SeekToField(ObjectHeaderContext context, ClassAspect aspect); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/IntHandler.cs0000644000175000017500000000527511700531646030733 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { /// public class IntHandler : PrimitiveHandler { private static readonly int Defaultvalue = 0; public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToInt(obj); } public override object DefaultValue() { return Defaultvalue; } public override Type PrimitiveJavaClass() { return typeof(int); } public override int LinkLength() { return Const4.IntLength; } /// public override object Read(MarshallerFamily mf, StatefulBuffer writer, bool redirect ) { return mf._primitive.ReadInteger(writer); } internal override object Read1(ByteArrayBuffer a_bytes) { return a_bytes.ReadInt(); } public override void Write(object obj, ByteArrayBuffer writer) { Write(((int)obj), writer); } public virtual void Write(int intValue, ByteArrayBuffer writer) { WriteInt(intValue, writer); } public static void WriteInt(int a_int, ByteArrayBuffer a_bytes) { a_bytes.WriteInt(a_int); } public override void DefragIndexEntry(DefragmentContextImpl context) { context.IncrementIntSize(); } public override object Read(IReadContext context) { return context.ReadInt(); } public override void Write(IWriteContext context, object obj) { context.WriteInt(((int)obj)); } public override IPreparedComparison InternalPrepareComparison(object source) { return NewPrepareCompare(((int)source)); } public virtual IPreparedComparison NewPrepareCompare(int i) { return new IntHandler.PreparedIntComparison(this, i); } public static int Compare(int first, int second) { if (first == second) { return 0; } return first > second ? 1 : -1; } public sealed class PreparedIntComparison : IPreparedComparison { private readonly int _sourceInt; public PreparedIntComparison(IntHandler _enclosing, int sourceInt) { this._enclosing = _enclosing; this._sourceInt = sourceInt; } public int CompareTo(object target) { if (target == null) { return 1; } int targetInt = ((int)target); return IntHandler.Compare(this._sourceInt, targetInt); } private readonly IntHandler _enclosing; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/CharHandler.cs0000644000175000017500000000436011700531646031050 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public sealed class CharHandler : PrimitiveHandler { internal const int Length = Const4.CharBytes + Const4.AddedLength; private static readonly char Defaultvalue = (char)0; public override object DefaultValue() { return Defaultvalue; } public override int LinkLength() { return Length; } public override Type PrimitiveJavaClass() { return typeof(char); } internal override object Read1(ByteArrayBuffer a_bytes) { byte b1 = a_bytes.ReadByte(); byte b2 = a_bytes.ReadByte(); char ret = (char)((b1 & unchecked((int)(0xff))) | ((b2 & unchecked((int)(0xff))) << 8)); return ret; } public override void Write(object a_object, ByteArrayBuffer a_bytes) { char char_ = ((char)a_object); a_bytes.WriteByte((byte)(char_ & unchecked((int)(0xff)))); a_bytes.WriteByte((byte)(char_ >> 8)); } public override object Read(IReadContext context) { byte b1 = context.ReadByte(); byte b2 = context.ReadByte(); char charValue = (char)((b1 & unchecked((int)(0xff))) | ((b2 & unchecked((int)(0xff ))) << 8)); return charValue; } public override void Write(IWriteContext context, object obj) { char charValue = ((char)obj); context.WriteBytes(new byte[] { (byte)(charValue & unchecked((int)(0xff))), (byte )(charValue >> 8) }); } public override IPreparedComparison InternalPrepareComparison(object source) { char sourceChar = ((char)source); return new _IPreparedComparison_90(sourceChar); } private sealed class _IPreparedComparison_90 : IPreparedComparison { public _IPreparedComparison_90(char sourceChar) { this.sourceChar = sourceChar; } public int CompareTo(object target) { if (target == null) { return 1; } char targetChar = ((char)target); return sourceChar == targetChar ? 0 : (sourceChar < targetChar ? -1 : 1); } private readonly char sourceChar; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/PlainObjectHandler.cs0000644000175000017500000000153311700531646032364 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// Tyehandler for naked plain objects (java.lang.Object). /// Tyehandler for naked plain objects (java.lang.Object). public class PlainObjectHandler : IReferenceTypeHandler { public virtual void Defragment(IDefragmentContext context) { } /// public virtual void Delete(IDeleteContext context) { } public virtual void Activate(IReferenceActivationContext context) { } public virtual void Write(IWriteContext context, object obj) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/HandlerVersion.cs0000644000175000017500000000116511700531646031620 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Handlers { /// public class HandlerVersion { public readonly int _number; public static readonly Db4objects.Db4o.Internal.Handlers.HandlerVersion Invalid = new Db4objects.Db4o.Internal.Handlers.HandlerVersion(-1); public HandlerVersion(int number) { _number = number; } public override bool Equals(object obj) { if (this == obj) { return true; } return ((Db4objects.Db4o.Internal.Handlers.HandlerVersion)obj)._number == _number; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/LongHandler0.cs0000644000175000017500000000066011700531646031151 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class LongHandler0 : LongHandler { public override object Read(IReadContext context) { long value = (long)base.Read(context); if (value == long.MaxValue) { return null; } return value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/DateHandlerBase.cs0000644000175000017500000000531311700531646031642 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { /// Shared (java/.net) logic for Date handling. /// Shared (java/.net) logic for Date handling. public abstract class DateHandlerBase : LongHandler { public override object Coerce(IReflectClass claxx, object obj) { return ClassReflector().IsAssignableFrom(claxx) ? obj : No4.Instance; } public abstract object CopyValue(object from, object to); public abstract override object DefaultValue(); public abstract override object NullRepresentationInUntypedArrays(); public override Type PrimitiveJavaClass() { return null; } protected override Type JavaClass() { return DefaultValue().GetType(); } /// public override object Read(MarshallerFamily mf, StatefulBuffer writer, bool redirect ) { return mf._primitive.ReadDate(writer); } internal override object Read1(ByteArrayBuffer a_bytes) { return PrimitiveMarshaller().ReadDate(a_bytes); } public override void Write(object a_object, ByteArrayBuffer a_bytes) { // TODO: This is a temporary fix to prevent exceptions with // Marshaller.LEGACY. if (a_object == null) { a_object = new DateTime(0); } a_bytes.WriteLong(((DateTime)a_object).Ticks); } public static string Now() { return Platform4.Format(Platform4.Now(), true); } public override object Read(IReadContext context) { long milliseconds = ((long)base.Read(context)); return new DateTime(milliseconds); } public override void Write(IWriteContext context, object obj) { long milliseconds = ((DateTime)obj).Ticks; base.Write(context, milliseconds); } public override IPreparedComparison InternalPrepareComparison(object source) { long sourceDate = ((DateTime)source).Ticks; return new _IPreparedComparison_69(sourceDate); } private sealed class _IPreparedComparison_69 : IPreparedComparison { public _IPreparedComparison_69(long sourceDate) { this.sourceDate = sourceDate; } public int CompareTo(object target) { if (target == null) { return 1; } long targetDate = ((DateTime)target).Ticks; return sourceDate == targetDate ? 0 : (sourceDate < targetDate ? -1 : 1); } private readonly long sourceDate; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/FloatHandler0.cs0000644000175000017500000000066011700531646031317 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class FloatHandler0 : FloatHandler { public override object Read(IReadContext context) { float value = (float)base.Read(context); if (float.IsNaN(value)) { return null; } return value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/IntHandler0.cs0000644000175000017500000000066311700531646031007 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { /// public class IntHandler0 : IntHandler { public override object Read(IReadContext context) { int i = context.ReadInt(); if (i == int.MaxValue) { return null; } return i; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/LongHandler.cs0000644000175000017500000000615311700531646031074 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { /// public class LongHandler : PrimitiveHandler { private static readonly long Defaultvalue = System.Convert.ToInt64(0); public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToLong(obj); } public override object DefaultValue() { return Defaultvalue; } public override Type PrimitiveJavaClass() { return typeof(long); } public override int LinkLength() { return Const4.LongLength; } /// public override object Read(MarshallerFamily mf, StatefulBuffer buffer, bool redirect ) { return mf._primitive.ReadLong(buffer); } internal override object Read1(ByteArrayBuffer a_bytes) { return a_bytes.ReadLong(); } public override void Write(object obj, ByteArrayBuffer buffer) { WriteLong(buffer, ((long)obj)); } public static void WriteLong(IWriteBuffer buffer, long val) { if (Deploy.debug && Deploy.debugLong) { string l_s = " " + val; new LatinStringIO().Write(buffer, Sharpen.Runtime.Substring(l_s, l_s.Length - Const4 .LongBytes)); } else { for (int i = 0; i < Const4.LongBytes; i++) { buffer.WriteByte((byte)(val >> ((Const4.LongBytes - 1 - i) * 8))); } } } public static long ReadLong(IReadBuffer buffer) { long ret = 0; if (Deploy.debug && Deploy.debugLong) { ret = long.Parse(new LatinStringIO().Read(buffer, Const4.LongBytes).Trim()); } else { for (int i = 0; i < Const4.LongBytes; i++) { ret = (ret << 8) + (buffer.ReadByte() & unchecked((int)(0xff))); } } return ret; } public override object Read(IReadContext context) { return context.ReadLong(); } public override void Write(IWriteContext context, object obj) { context.WriteLong(((long)obj)); } public static int Compare(long first, long second) { if (first == second) { return 0; } return first > second ? 1 : -1; } public override IPreparedComparison InternalPrepareComparison(object source) { long sourceLong = ((long)source); return new _IPreparedComparison_102(sourceLong); } private sealed class _IPreparedComparison_102 : IPreparedComparison { public _IPreparedComparison_102(long sourceLong) { this.sourceLong = sourceLong; } public int CompareTo(object target) { if (target == null) { return 1; } long targetLong = ((long)target); return LongHandler.Compare(sourceLong, targetLong); } private readonly long sourceLong; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/ShortHandler.cs0000644000175000017500000000514211700531646031271 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { public class ShortHandler : PrimitiveHandler { internal const int Length = Const4.ShortBytes + Const4.AddedLength; private static readonly short Defaultvalue = (short)0; public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToShort(obj); } public override object DefaultValue() { return Defaultvalue; } public override int LinkLength() { return Length; } public override Type PrimitiveJavaClass() { return typeof(short); } /// public override object Read(MarshallerFamily mf, StatefulBuffer buffer, bool redirect ) { return mf._primitive.ReadShort(buffer); } internal override object Read1(ByteArrayBuffer buffer) { return PrimitiveMarshaller().ReadShort(buffer); } public override void Write(object a_object, ByteArrayBuffer a_bytes) { WriteShort(((short)a_object), a_bytes); } internal static void WriteShort(int a_short, ByteArrayBuffer a_bytes) { for (int i = 0; i < Const4.ShortBytes; i++) { a_bytes._buffer[a_bytes._offset++] = (byte)(a_short >> ((Const4.ShortBytes - 1 - i) * 8)); } } public override object Read(IReadContext context) { int value = ((context.ReadByte() & unchecked((int)(0xff))) << 8) + (context.ReadByte () & unchecked((int)(0xff))); return (short)value; } public override void Write(IWriteContext context, object obj) { int shortValue = ((short)obj); context.WriteBytes(new byte[] { (byte)(shortValue >> 8), (byte)shortValue }); } public override IPreparedComparison InternalPrepareComparison(object source) { short sourceShort = ((short)source); return new _IPreparedComparison_86(sourceShort); } private sealed class _IPreparedComparison_86 : IPreparedComparison { public _IPreparedComparison_86(short sourceShort) { this.sourceShort = sourceShort; } public int CompareTo(object target) { if (target == null) { return 1; } short targetShort = ((short)target); return sourceShort == targetShort ? 0 : (sourceShort < targetShort ? -1 : 1); } private readonly short sourceShort; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/NetTypeHandler.cs0000644000175000017500000000502711700531646031564 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { /// public abstract class NetTypeHandler : PrimitiveHandler, INetType { private int i_linkLength; public virtual string DotNetClassName() { string className = this.GetType().FullName; int pos = className.IndexOf(".Net"); if (pos >= 0) { return "System." + Sharpen.Runtime.Substring(className, pos + 4) + ", mscorlib"; } return DefaultValue().GetType().FullName; } public override void RegisterReflector(IReflector reflector) { base.RegisterReflector(reflector); byte[] bytes = new byte[65]; for (int i = 0; i < bytes.Length; i++) { bytes[i] = 55; } // TODO: Why 55? This is a '7'. Remove. Write(PrimitiveNull(), bytes, 0); for (int i = 0; i < bytes.Length; i++) { if (bytes[i] == 55) { i_linkLength = i; break; } } } public virtual int GetID() { return TypeID(); } // This method is needed for NetSimpleTypeHandler only during // initalisation and overloaded there. No abstract declaration // here, so we don't have to implement the methods on .NET. public virtual string GetName() { return DotNetClassName(); } public override int LinkLength() { return i_linkLength; } public override Type PrimitiveJavaClass() { return DefaultValue().GetType(); } protected override Type JavaClass() { return base.JavaClass(); } public abstract object Read(byte[] bytes, int offset); /// internal override object Read1(ByteArrayBuffer a_bytes) { int offset = a_bytes._offset; object ret = Read(a_bytes._buffer, a_bytes._offset); a_bytes._offset = offset + LinkLength(); return ret; } public abstract int TypeID(); public abstract void Write(object obj, byte[] bytes, int offset); public override void Write(object a_object, ByteArrayBuffer a_bytes) { int offset = a_bytes._offset; if (a_object != null) { Write(a_object, a_bytes._buffer, a_bytes._offset); } a_bytes._offset = offset + LinkLength(); } public override IPreparedComparison InternalPrepareComparison(object obj) { throw new NotImplementedException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/StringHandler0.cs0000644000175000017500000000417511700531646031525 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { /// public class StringHandler0 : StringHandler { public override object Read(IReadContext context) { ByteArrayBuffer buffer = (ByteArrayBuffer)((IInternalReadContext)context).ReadIndirectedBuffer (); if (buffer == null) { return null; } return ReadString(context, buffer); } public override void Delete(IDeleteContext context) { context.DefragmentRecommended(); } public override void Defragment(IDefragmentContext context) { int sourceAddress = context.SourceBuffer().ReadInt(); int length = context.SourceBuffer().ReadInt(); if (sourceAddress == 0 && length == 0) { context.TargetBuffer().WriteInt(0); context.TargetBuffer().WriteInt(0); return; } int targetAddress = 0; try { targetAddress = context.CopySlotToNewMapped(sourceAddress, length); } catch (IOException exc) { throw new Db4oIOException(exc); } context.TargetBuffer().WriteInt(targetAddress); context.TargetBuffer().WriteInt(length); } /// /// public override object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer buffer) { return buffer.Container().ReadWriterByAddress(buffer.Transaction(), buffer.ReadInt (), buffer.ReadInt()); } /// /// public override object ReadIndexEntry(IObjectIdContext context) { return context.Transaction().Container().ReadWriterByAddress(context.Transaction( ), context.ReadInt(), context.ReadInt()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/NetType.cs0000644000175000017500000000045511700531646030266 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Handlers { internal interface INetType { object DefaultValue(); int TypeID(); void Write(object obj, byte[] bytes, int offset); object Read(byte[] bytes, int offset); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/FloatHandler.cs0000644000175000017500000000420211700531646031233 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { public class FloatHandler : IntHandler { private static readonly float Defaultvalue = System.Convert.ToSingle(0); public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToFloat(obj); } public override object DefaultValue() { return Defaultvalue; } public override Type PrimitiveJavaClass() { return typeof(float); } /// public override object Read(MarshallerFamily mf, StatefulBuffer writer, bool redirect ) { return mf._primitive.ReadFloat(writer); } internal override object Read1(ByteArrayBuffer a_bytes) { return PrimitiveMarshaller().ReadFloat(a_bytes); } public override void Write(object a_object, ByteArrayBuffer a_bytes) { WriteInt(Sharpen.Runtime.FloatToIntBits(((float)a_object)), a_bytes); } public override object Read(IReadContext context) { return Sharpen.Runtime.IntBitsToFloat(context.ReadInt()); } public override void Write(IWriteContext context, object obj) { context.WriteInt(Sharpen.Runtime.FloatToIntBits(((float)obj))); } public override IPreparedComparison InternalPrepareComparison(object source) { float sourceFloat = ((float)source); return new _IPreparedComparison_54(sourceFloat); } private sealed class _IPreparedComparison_54 : IPreparedComparison { public _IPreparedComparison_54(float sourceFloat) { this.sourceFloat = sourceFloat; } public int CompareTo(object target) { if (target == null) { return 1; } float targetFloat = ((float)target); return sourceFloat == targetFloat ? 0 : (sourceFloat < targetFloat ? -1 : 1); } private readonly float sourceFloat; } } } StringBasedValueTypeHandlerBase.cs0000644000175000017500000000432211700531646034751 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { public abstract class StringBasedValueTypeHandlerBase : IValueTypeHandler, IBuiltinTypeHandler , IVariableLengthTypeHandler, IQueryableTypeHandler, IComparable4 { public readonly Type _clazz; private IReflectClass _classReflector; public StringBasedValueTypeHandlerBase(Type clazz) { _clazz = clazz; } public virtual void Defragment(IDefragmentContext context) { StringHandler(context).Defragment(context); } /// public virtual void Delete(IDeleteContext context) { StringHandler(context).Delete(context); } public virtual object Read(IReadContext context) { object read = StringHandler(context).Read(context); if (null == read) { return null; } return ConvertString((string)read); } public virtual void Write(IWriteContext context, object obj) { StringHandler(context).Write(context, ConvertObject((object)obj)); } private Db4objects.Db4o.Internal.Handlers.StringHandler StringHandler(IContext context ) { return Handlers(context)._stringHandler; } private HandlerRegistry Handlers(IContext context) { return ((IInternalObjectContainer)context.ObjectContainer()).Handlers; } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { return StringHandler(context).PrepareComparison(context, obj); } public virtual IReflectClass ClassReflector() { return _classReflector; } public virtual void RegisterReflector(IReflector reflector) { _classReflector = reflector.ForClass(_clazz); } public virtual bool DescendsIntoMembers() { return false; } protected abstract string ConvertObject(object obj); protected abstract object ConvertString(string str); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/ByteHandler.cs0000644000175000017500000000362611700531646031102 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { public sealed class ByteHandler : PrimitiveHandler { internal const int Length = 1 + Const4.AddedLength; private static readonly byte Defaultvalue = (byte)0; public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToByte(obj); } public override object DefaultValue() { return Defaultvalue; } public override int LinkLength() { return Length; } public override Type PrimitiveJavaClass() { return typeof(byte); } internal override object Read1(ByteArrayBuffer a_bytes) { byte ret = a_bytes.ReadByte(); return ret; } public override void Write(object a_object, ByteArrayBuffer a_bytes) { a_bytes.WriteByte(((byte)a_object)); } public override object Read(IReadContext context) { byte byteValue = context.ReadByte(); return byteValue; } public override void Write(IWriteContext context, object obj) { context.WriteByte(((byte)obj)); } public override IPreparedComparison InternalPrepareComparison(object source) { byte sourceByte = ((byte)source); return new _IPreparedComparison_82(sourceByte); } private sealed class _IPreparedComparison_82 : IPreparedComparison { public _IPreparedComparison_82(byte sourceByte) { this.sourceByte = sourceByte; } public int CompareTo(object target) { if (target == null) { return 1; } byte targetByte = ((byte)target); return sourceByte == targetByte ? 0 : (sourceByte < targetByte ? -1 : 1); } private readonly byte sourceByte; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/PrimitiveHandler.cs0000644000175000017500000001150711700531646032144 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// public abstract class PrimitiveHandler : IValueTypeHandler, IIndexableTypeHandler , IBuiltinTypeHandler, IQueryableTypeHandler { protected IReflectClass _classReflector; private IReflectClass _primitiveClassReflector; private object _primitiveNull; public virtual object Coerce(IReflectClass claxx, object obj) { return IsAssignableFrom(claxx) ? obj : No4.Instance; } private bool IsAssignableFrom(IReflectClass claxx) { return ClassReflector().IsAssignableFrom(claxx) || PrimitiveClassReflector().IsAssignableFrom (claxx); } public abstract object DefaultValue(); public virtual void Delete(IDeleteContext context) { context.Seek(context.Offset() + LinkLength()); } public object IndexEntryToObject(IContext context, object indexEntry) { return indexEntry; } public abstract Type PrimitiveJavaClass(); protected virtual Type JavaClass() { return Platform4.NullableTypeFor(PrimitiveJavaClass()); } public virtual bool DescendsIntoMembers() { return false; } public virtual object PrimitiveNull() { if (_primitiveNull == null) { IReflectClass claxx = (_primitiveClassReflector == null ? _classReflector : _primitiveClassReflector ); _primitiveNull = claxx.NullValue(); } return _primitiveNull; } /// /// /// /// public virtual object Read(MarshallerFamily mf, StatefulBuffer buffer, bool redirect ) { return Read1(buffer); } /// internal abstract object Read1(ByteArrayBuffer reader); public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer buffer) { try { return Read1(buffer); } catch (CorruptionException) { } return null; } /// public object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer statefulBuffer ) { return Read(mf, statefulBuffer, true); } /// /// public virtual object ReadIndexEntry(IObjectIdContext context) { return Read(context); } public virtual IReflectClass ClassReflector() { return _classReflector; } public virtual IReflectClass PrimitiveClassReflector() { return _primitiveClassReflector; } public virtual void RegisterReflector(IReflector reflector) { _classReflector = reflector.ForClass(JavaClass()); Type clazz = PrimitiveJavaClass(); if (clazz != null) { _primitiveClassReflector = reflector.ForClass(clazz); } } public abstract void Write(object a_object, ByteArrayBuffer a_bytes); public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer a_writer, object a_object) { if (a_object == null) { a_object = PrimitiveNull(); } Write(a_object, a_writer); } // redundant, only added to make Sun JDK 1.2's java happy :( public abstract int LinkLength(); public void Defragment(IDefragmentContext context) { context.IncrementOffset(LinkLength()); } public virtual void DefragIndexEntry(DefragmentContextImpl context) { try { Read1(context.SourceBuffer()); Read1(context.TargetBuffer()); } catch (CorruptionException) { Exceptions4.VirtualException(); } } protected virtual Db4objects.Db4o.Internal.Marshall.PrimitiveMarshaller PrimitiveMarshaller () { return MarshallerFamily.Current()._primitive; } public virtual void Write(IWriteContext context, object obj) { throw new NotImplementedException(); } public virtual object Read(IReadContext context) { throw new NotImplementedException(); } public virtual object NullRepresentationInUntypedArrays() { return PrimitiveNull(); } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { if (obj == null) { return Null.Instance; } return InternalPrepareComparison(obj); } public abstract IPreparedComparison InternalPrepareComparison(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/StringHandler.cs0000644000175000017500000002010211700531646031431 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// public class StringHandler : IValueTypeHandler, IIndexableTypeHandler, IBuiltinTypeHandler , IVariableLengthTypeHandler, IQueryableTypeHandler { private IReflectClass _classReflector; public virtual IReflectClass ClassReflector() { return _classReflector; } public virtual void Delete(IDeleteContext context) { } // do nothing, we are in a slot indirection anyway, the // buffer position does not need to be changed. internal virtual byte GetIdentifier() { return Const4.Yapstring; } public virtual bool DescendsIntoMembers() { return false; } public object IndexEntryToObject(IContext context, object indexEntry) { if (indexEntry is Slot) { Slot slot = (Slot)indexEntry; indexEntry = context.Transaction().Container().DecryptedBufferByAddress(slot.Address (), slot.Length()); } return ReadStringNoDebug(context, (IReadBuffer)indexEntry); } /// This readIndexEntry method reads from the parent slot. /// This readIndexEntry method reads from the parent slot. /// /// public virtual object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer buffer) { int payLoadOffSet = buffer.ReadInt(); int length = buffer.ReadInt(); if (payLoadOffSet == 0) { return null; } return buffer.ReadPayloadWriter(payLoadOffSet, length); } /// /// public virtual object ReadIndexEntry(IObjectIdContext context) { int payLoadOffSet = context.ReadInt(); int length = context.ReadInt(); if (payLoadOffSet == 0) { return null; } return ((StatefulBuffer)context.Buffer()).ReadPayloadWriter(payLoadOffSet, length ); } /// This readIndexEntry method reads from the actual index in the file. /// This readIndexEntry method reads from the actual index in the file. public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer reader) { Slot s = new Slot(reader.ReadInt(), reader.ReadInt()); if (IsInvalidSlot(s)) { return null; } return s; } private bool IsInvalidSlot(Slot slot) { return slot.IsNull(); } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object entry) { if (entry == null) { writer.WriteInt(0); writer.WriteInt(0); return; } if (entry is StatefulBuffer) { StatefulBuffer entryAsWriter = (StatefulBuffer)entry; writer.WriteInt(entryAsWriter.GetAddress()); writer.WriteInt(entryAsWriter.Length()); return; } if (entry is Slot) { Slot s = (Slot)entry; writer.WriteInt(s.Address()); writer.WriteInt(s.Length()); return; } throw new ArgumentException(); } public void WriteShort(Transaction trans, string str, ByteArrayBuffer buffer) { StringIo(trans.Container()).WriteLengthAndString(buffer, str); } internal virtual ByteArrayBuffer Val(object obj, IContext context) { if (obj is ByteArrayBuffer) { return (ByteArrayBuffer)obj; } ObjectContainerBase oc = context.Transaction().Container(); if (obj is string) { return WriteToBuffer((IInternalObjectContainer)oc, (string)obj); } if (obj is Slot) { Slot s = (Slot)obj; return oc.DecryptedBufferByAddress(s.Address(), s.Length()); } return null; } /// /// returns: -x for left is greater and +x for right is greater /// FIXME: The returned value is the wrong way around. /// /// /// returns: -x for left is greater and +x for right is greater /// FIXME: The returned value is the wrong way around. /// TODO: You will need collators here for different languages. /// internal int Compare(ByteArrayBuffer a_compare, ByteArrayBuffer a_with) { if (a_compare == null) { if (a_with == null) { return 0; } return -1; } if (a_with == null) { return 1; } return Compare(a_compare._buffer, a_with._buffer); } public static int Compare(byte[] compare, byte[] with) { int min = compare.Length < with.Length ? compare.Length : with.Length; int start = Const4.IntLength; for (int i = start; i < min; i++) { if (compare[i] != with[i]) { return compare[i] - with[i]; } } return compare.Length - with.Length; } public virtual void DefragIndexEntry(DefragmentContextImpl context) { context.CopyAddress(); // length context.IncrementIntSize(); } public virtual void Write(IWriteContext context, object obj) { InternalWrite((IInternalObjectContainer)context.ObjectContainer(), context, (string )obj); } protected static void InternalWrite(IInternalObjectContainer objectContainer, IWriteBuffer buffer, string str) { StringIo(objectContainer).WriteLengthAndString(buffer, str); } public static ByteArrayBuffer WriteToBuffer(IInternalObjectContainer container, string str) { ByteArrayBuffer buffer = new ByteArrayBuffer(StringIo(container).Length(str)); InternalWrite(container, buffer, str); return buffer; } protected static LatinStringIO StringIo(IContext context) { return StringIo((IInternalObjectContainer)context.ObjectContainer()); } protected static LatinStringIO StringIo(IInternalObjectContainer objectContainer) { return objectContainer.Container.StringIO(); } public static string ReadString(IContext context, IReadBuffer buffer) { string str = ReadStringNoDebug(context, buffer); return str; } public static string ReadStringNoDebug(IContext context, IReadBuffer buffer) { return Intern(context, StringIo(context).ReadLengthAndString(buffer)); } protected static string Intern(IContext context, string str) { if (context.ObjectContainer().Ext().Configure().InternStrings()) { return string.Intern(str); } return str; } public virtual object Read(IReadContext context) { return ReadString(context, context); } public virtual void Defragment(IDefragmentContext context) { context.IncrementOffset(LinkLength()); } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { ByteArrayBuffer sourceBuffer = Val(obj, context); return new _IPreparedComparison_229(this, context, sourceBuffer); } private sealed class _IPreparedComparison_229 : IPreparedComparison { public _IPreparedComparison_229(StringHandler _enclosing, IContext context, ByteArrayBuffer sourceBuffer) { this._enclosing = _enclosing; this.context = context; this.sourceBuffer = sourceBuffer; } public int CompareTo(object target) { ByteArrayBuffer targetBuffer = this._enclosing.Val(target, context); return this._enclosing.Compare(sourceBuffer, targetBuffer); } private readonly StringHandler _enclosing; private readonly IContext context; private readonly ByteArrayBuffer sourceBuffer; } public virtual int LinkLength() { return Const4.IndirectionLength; } public virtual void RegisterReflector(IReflector reflector) { _classReflector = reflector.ForClass(typeof(string)); } } } IVariableLengthTypeHandler.cs0000644000175000017500000000061611700531646033756 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// /// marker interface for TypeHandlers where the slot /// length can change, depending on the object stored /// /// public interface IVariableLengthTypeHandler : ITypeHandler4 { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/BooleanHandler.cs0000644000175000017500000000462711700531646031560 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { /// public sealed class BooleanHandler : PrimitiveHandler { internal const int Length = 1 + Const4.AddedLength; private const byte True = (byte)'T'; private const byte False = (byte)'F'; private const byte Null = (byte)'N'; private static readonly bool Defaultvalue = false; public override object DefaultValue() { return Defaultvalue; } public override int LinkLength() { return Length; } public override Type PrimitiveJavaClass() { return typeof(bool); } internal override object Read1(ByteArrayBuffer a_bytes) { byte ret = a_bytes.ReadByte(); if (ret == True) { return true; } if (ret == False) { return false; } return null; } public override void Write(object obj, ByteArrayBuffer buffer) { buffer.WriteByte(GetEncodedByteValue(obj)); } private byte GetEncodedByteValue(object obj) { if (obj == null) { return Null; } if (((bool)obj)) { return True; } return False; } public override object Read(IReadContext context) { byte ret = context.ReadByte(); if (ret == True) { return true; } if (ret == False) { return false; } return null; } public override void Write(IWriteContext context, object obj) { context.WriteByte(GetEncodedByteValue(obj)); } public override object NullRepresentationInUntypedArrays() { return null; } public override IPreparedComparison InternalPrepareComparison(object source) { bool sourceBoolean = ((bool)source); return new _IPreparedComparison_111(sourceBoolean); } private sealed class _IPreparedComparison_111 : IPreparedComparison { public _IPreparedComparison_111(bool sourceBoolean) { this.sourceBoolean = sourceBoolean; } public int CompareTo(object target) { if (target == null) { return 1; } bool targetBoolean = ((bool)target); return sourceBoolean == targetBoolean ? 0 : (sourceBoolean ? 1 : -1); } private readonly bool sourceBoolean; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/DateHandler0.cs0000644000175000017500000000075411700531646031133 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { /// public class DateHandler0 : DateHandler { public override object Read(IReadContext context) { long value = context.ReadLong(); if (value == long.MaxValue) { return PrimitiveNull(); } return new DateTime(value); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/0000755000175000017500000000000011700531646027421 5ustar00meebeymeebey00000000000000MultidimensionalArrayIterator.cs0000644000175000017500000000312611700531646035721 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class MultidimensionalArrayIterator : IEnumerator { private readonly IReflectArray _reflectArray; private readonly object[] _array; private int _currentElement; private IEnumerator _delegate; public MultidimensionalArrayIterator(IReflectArray reflectArray, object[] array) { _reflectArray = reflectArray; _array = array; Reset(); } public virtual object Current { get { if (_delegate == null) { return _array[_currentElement]; } return _delegate.Current; } } public virtual bool MoveNext() { if (_delegate != null) { if (_delegate.MoveNext()) { return true; } _delegate = null; } _currentElement++; if (_currentElement >= _array.Length) { return false; } object obj = _array[_currentElement]; Type clazz = obj.GetType(); if (clazz.IsArray) { if (clazz.GetElementType().IsArray) { _delegate = new Db4objects.Db4o.Internal.Handlers.Array.MultidimensionalArrayIterator (_reflectArray, (object[])obj); } else { _delegate = new ReflectArrayIterator(_reflectArray, obj); } return MoveNext(); } return true; } public virtual void Reset() { _currentElement = -1; _delegate = null; } } } ArrayVersionHelper5.cs0000644000175000017500000000060711700531646033545 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayVersionHelper5 : ArrayVersionHelper { public override bool HasNullBitmap(ArrayInfo info) { return !info.Primitive(); } } } MultidimensionalArrayHandler0.cs0000644000175000017500000000255011700531646035565 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class MultidimensionalArrayHandler0 : MultidimensionalArrayHandler3 { protected override ArrayVersionHelper CreateVersionHelper() { return new ArrayVersionHelper0(); } public override object Read(IReadContext readContext) { IInternalReadContext context = (IInternalReadContext)readContext; ByteArrayBuffer buffer = (ByteArrayBuffer)context.ReadIndirectedBuffer(); if (buffer == null) { return null; } // With the following line we ask the context to work with // a different buffer. Should this logic ever be needed by // a user handler, it should be implemented by using a Queue // in the UnmarshallingContext. // The buffer has to be set back from the outside! See below IReadBuffer contextBuffer = context.Buffer(buffer); object array = base.Read(context); // The context buffer has to be set back. context.Buffer(contextBuffer); return array; } public override void Defragment(IDefragmentContext context) { ArrayHandler0.Defragment(context, this); } } } MultidimensionalArrayHandler.cs0000644000175000017500000000751311700531646035511 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers.Array { /// n-dimensional array /// public class MultidimensionalArrayHandler : ArrayHandler { public MultidimensionalArrayHandler(ITypeHandler4 a_handler, bool a_isPrimitive) : base(a_handler, a_isPrimitive) { } public MultidimensionalArrayHandler() { } // required for reflection cloning public sealed override IEnumerator AllElements(ObjectContainerBase container, object array) { return AllElementsMultidimensional(ArrayReflector(container), array); } public static IEnumerator AllElementsMultidimensional(IReflectArray reflectArray, object array) { return new MultidimensionalArrayIterator(reflectArray, (object[])array); } protected static int ElementCount(int[] a_dim) { int elements = a_dim[0]; for (int i = 1; i < a_dim.Length; i++) { elements = elements * a_dim[i]; } return elements; } public sealed override byte Identifier() { return Const4.Yaparrayn; } protected override ArrayInfo NewArrayInfo() { return new MultidimensionalArrayInfo(); } protected override void ReadDimensions(ArrayInfo info, IReadBuffer buffer) { ReadDimensions(info, buffer, buffer.ReadInt()); } private void ReadDimensions(ArrayInfo info, IReadBuffer buffer, int dimensionCount ) { int[] dim = new int[dimensionCount]; for (int i = 0; i < dim.Length; i++) { dim[i] = buffer.ReadInt(); } ((MultidimensionalArrayInfo)info).Dimensions(dim); info.ElementCount(ElementCount(dim)); } protected override void ReadElements(IReadContext context, ArrayInfo info, object array) { if (array == null) { return; } object[] objects = new object[info.ElementCount()]; ReadInto(context, info, objects); ArrayReflector(Container(context)).Shape(objects, 0, array, ((MultidimensionalArrayInfo )info).Dimensions(), 0); } protected override void WriteDimensions(IWriteContext context, ArrayInfo info) { int[] dim = ((MultidimensionalArrayInfo)info).Dimensions(); context.WriteInt(dim.Length); for (int i = 0; i < dim.Length; i++) { context.WriteInt(dim[i]); } } protected override void WriteElements(IWriteContext context, object obj, ArrayInfo info) { IEnumerator objects = AllElements(Container(context), obj); if (HasNullBitmap(info)) { BitMap4 nullBitMap = new BitMap4(info.ElementCount()); IReservedBuffer nullBitMapBuffer = context.Reserve(nullBitMap.MarshalledLength()); int currentElement = 0; while (objects.MoveNext()) { object current = objects.Current; if (current == null) { nullBitMap.SetTrue(currentElement); } else { context.WriteObject(DelegateTypeHandler(), current); } currentElement++; } nullBitMapBuffer.WriteBytes(nullBitMap.Bytes()); } else { while (objects.MoveNext()) { context.WriteObject(DelegateTypeHandler(), objects.Current); } } } protected override void AnalyzeDimensions(ObjectContainerBase container, object obj , ArrayInfo info) { int[] dim = ArrayReflector(container).Dimensions(obj); ((MultidimensionalArrayInfo)info).Dimensions(dim); info.ElementCount(ElementCount(dim)); } public override ITypeHandler4 UnversionedTemplate() { return new Db4objects.Db4o.Internal.Handlers.Array.MultidimensionalArrayHandler(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/ArrayVersionHelper.cs0000644000175000017500000000452611700531646033543 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayVersionHelper { public virtual int ClassIDFromInfo(ObjectContainerBase container, ArrayInfo info) { ClassMetadata classMetadata = container.ProduceClassMetadata(info.ReflectClass()); if (classMetadata == null) { return 0; } return classMetadata.GetID(); } public virtual int ClassIdToMarshalledClassId(int classID, bool primitive) { return classID; } public virtual IReflectClass ClassReflector(IReflector reflector, ClassMetadata classMetadata , bool isPrimitive) { return isPrimitive ? Handlers4.PrimitiveClassReflector(classMetadata, reflector) : classMetadata.ClassReflector(); } public virtual bool UseJavaHandling() { return true; } public virtual bool HasNullBitmap(ArrayInfo info) { if (info.Nullable()) { return true; } return !info.Primitive(); } public virtual bool IsPreVersion0Format(int elementCount) { return false; } public virtual bool IsPrimitive(IReflector reflector, IReflectClass claxx, ClassMetadata classMetadata) { return claxx.IsPrimitive(); } public virtual IReflectClass ReflectClassFromElementsEntry(ObjectContainerBase container , ArrayInfo info, int classID) { if (classID == 0) { return null; } ClassMetadata classMetadata = container.ClassMetadataForID(classID); if (classMetadata == null) { return null; } return ClassReflector(container.Reflector(), classMetadata, info.Primitive()); } public virtual void WriteTypeInfo(IWriteContext context, ArrayInfo info) { BitMap4 typeInfoBitmap = new BitMap4(2); typeInfoBitmap.Set(0, info.Primitive()); typeInfoBitmap.Set(1, info.Nullable()); context.WriteByte(typeInfoBitmap.GetByte(0)); } public virtual void ReadTypeInfo(Transaction trans, IReadBuffer buffer, ArrayInfo info, int classID) { BitMap4 typeInfoBitmap = new BitMap4(buffer.ReadByte()); info.Primitive(typeInfoBitmap.IsTrue(0)); info.Nullable(typeInfoBitmap.IsTrue(1)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/ArrayHandler.cs0000644000175000017500000004572711700531646032343 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Handlers.Array { /// This is the latest version, the one that should be used. /// This is the latest version, the one that should be used. /// public class ArrayHandler : ICascadingTypeHandler, IComparable4, IValueTypeHandler , IVariableLengthTypeHandler, IVersionedTypeHandler, IQueryableTypeHandler { private ITypeHandler4 _handler; private bool _usePrimitiveClassReflector; protected readonly ArrayVersionHelper _versionHelper; public ArrayHandler() { _versionHelper = CreateVersionHelper(); } public ArrayHandler(ITypeHandler4 handler, bool usePrimitiveClassReflector) : this () { _handler = handler; _usePrimitiveClassReflector = usePrimitiveClassReflector; } protected virtual ArrayVersionHelper CreateVersionHelper() { return new ArrayVersionHelper(); } protected virtual IReflectArray ArrayReflector(ObjectContainerBase container) { return container.Reflector().Array(); } public virtual IEnumerator AllElements(ObjectContainerBase container, object a_object ) { return AllElements(ArrayReflector(container), a_object); } public static IEnumerator AllElements(IReflectArray reflectArray, object array) { return new ReflectArrayIterator(reflectArray, array); } public void CascadeActivation(IActivationContext context) { if (!Handlers4.IsCascading(_handler)) { return; } ObjectContainerBase container = context.Container(); IEnumerator all = AllElements(container, context.TargetObject()); while (all.MoveNext()) { context.CascadeActivationToChild(all.Current); } } internal virtual ObjectContainerBase Container(Transaction trans) { return trans.Container(); } public virtual void CollectIDs(QueryingReadContext context) { ITypeHandler4 handler = HandlerRegistry.CorrectHandlerVersion(context, _handler); ForEachElement(context, new _IRunnable_71(context, handler)); } private sealed class _IRunnable_71 : IRunnable { public _IRunnable_71(QueryingReadContext context, ITypeHandler4 handler) { this.context = context; this.handler = handler; } public void Run() { context.ReadId(handler); } private readonly QueryingReadContext context; private readonly ITypeHandler4 handler; } protected virtual ArrayInfo ForEachElement(AbstractBufferContext context, IRunnable elementRunnable) { ArrayInfo info = NewArrayInfo(); WithContent(context, new _IRunnable_80(this, context, info, elementRunnable)); return info; } private sealed class _IRunnable_80 : IRunnable { public _IRunnable_80(ArrayHandler _enclosing, AbstractBufferContext context, ArrayInfo info, IRunnable elementRunnable) { this._enclosing = _enclosing; this.context = context; this.info = info; this.elementRunnable = elementRunnable; } public void Run() { if (context.Buffer() == null) { return; } if (this._enclosing.IsUntypedByteArray(context)) { return; } this._enclosing.ReadInfo(context.Transaction(), context, info); int elementCount = info.ElementCount(); elementCount -= this._enclosing.ReducedCountForNullBitMap(info, context); for (int i = 0; i < elementCount; i++) { elementRunnable.Run(); } } private readonly ArrayHandler _enclosing; private readonly AbstractBufferContext context; private readonly ArrayInfo info; private readonly IRunnable elementRunnable; } protected virtual void WithContent(AbstractBufferContext context, IRunnable runnable ) { runnable.Run(); } private int ReducedCountForNullBitMap(ArrayInfo info, IReadBuffer context) { if (!HasNullBitmap(info)) { return 0; } return ReducedCountForNullBitMap(info.ElementCount(), ReadNullBitmap(context, info .ElementCount())); } private int ReducedCountForNullBitMap(int count, BitMap4 bitMap) { int nullCount = 0; for (int i = 0; i < count; i++) { if (bitMap.IsTrue(i)) { nullCount++; } } return nullCount; } /// public virtual void Delete(IDeleteContext context) { if (!CascadeDelete(context)) { return; } ForEachElement((AbstractBufferContext)context, new _IRunnable_127(this, context)); } private sealed class _IRunnable_127 : IRunnable { public _IRunnable_127(ArrayHandler _enclosing, IDeleteContext context) { this._enclosing = _enclosing; this.context = context; } public void Run() { this._enclosing._handler.Delete(context); } private readonly ArrayHandler _enclosing; private readonly IDeleteContext context; } private bool CascadeDelete(IDeleteContext context) { // FIXME: ValueType could reference objects, shouldn't they be deleted too? return context.CascadeDelete() && Handlers4.IsCascading(_handler); } // FIXME: This code has not been called in any test case when the // new ArrayMarshaller was written. // Apparently it only frees slots. // For now the code simply returns without freeing. /// public void DeletePrimitiveEmbedded(StatefulBuffer buffer, PrimitiveTypeMetadata classPrimitive) { buffer.ReadInt(); //int address = a_bytes.readInt(); buffer.ReadInt(); } //int length = a_bytes.readInt(); public override bool Equals(object obj) { if (!(obj is Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler)) { return false; } Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler other = (Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler )obj; if (other.Identifier() != Identifier()) { return false; } if (_handler == null) { return other._handler == null; } return _handler.Equals(other._handler) && _usePrimitiveClassReflector == other._usePrimitiveClassReflector; } public override int GetHashCode() { if (_handler == null) { return HashcodeForNull; } int hc = _handler.GetHashCode() >> 7; return _usePrimitiveClassReflector ? hc : -hc; } protected virtual bool HandleAsByteArray(object obj) { return obj.GetType() == typeof(byte[]); return obj is byte[]; } public virtual byte Identifier() { return Const4.Yaparray; } public virtual IReflectClass PrimitiveClassReflector(IReflector reflector) { return Handlers4.PrimitiveClassReflector(_handler, reflector); } protected virtual object ReadCreate(Transaction trans, IReadBuffer buffer, ArrayInfo info) { ReadInfo(trans, buffer, info); IReflectClass clazz = NewInstanceReflectClass(trans.Reflector(), info); if (clazz == null) { return null; } return NewInstance(ArrayReflector(Container(trans)), info, clazz); } protected object NewInstance(IReflectArray arrayReflector, ArrayInfo info, IReflectClass clazz) { return arrayReflector.NewInstance(clazz, info); } protected IReflectClass NewInstanceReflectClass(IReflector reflector, ArrayInfo info ) { if (_usePrimitiveClassReflector) { return PrimitiveClassReflector(reflector); } return info.ReflectClass(); } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return this; } protected virtual void ReadInfo(Transaction trans, IReadBuffer buffer, ArrayInfo info) { int classID = buffer.ReadInt(); if (IsPreVersion0Format(classID)) { throw new UnsupportedOldFormatException(); } else { _versionHelper.ReadTypeInfo(trans, buffer, info, classID); ReflectClassFromElementsEntry(Container(trans), info, classID); ReadDimensions(info, buffer); } if (Debug4.ExceedsMaximumArrayEntries(info.ElementCount(), _usePrimitiveClassReflector )) { info.ElementCount(0); } } protected virtual void ReadDimensions(ArrayInfo info, IReadBuffer buffer) { info.ElementCount(buffer.ReadInt()); } protected virtual bool IsPreVersion0Format(int elementCount) { return _versionHelper.IsPreVersion0Format(elementCount); } private void ReflectClassFromElementsEntry(ObjectContainerBase container, ArrayInfo info, int classID) { info.ReflectClass(_versionHelper.ReflectClassFromElementsEntry(container, info, classID )); } protected IReflectClass ClassReflector(IReflector reflector, Db4objects.Db4o.Internal.ClassMetadata classMetadata, bool isPrimitive) { return _versionHelper.ClassReflector(reflector, classMetadata, isPrimitive); } public static IEnumerator Iterator(IReflectClass claxx, object obj) { IReflectArray reflectArray = claxx.Reflector().Array(); if (reflectArray.IsNDimensional(claxx)) { return MultidimensionalArrayHandler.AllElementsMultidimensional(reflectArray, obj ); } return Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler.AllElements(reflectArray , obj); } protected virtual bool UseJavaHandling() { return _versionHelper.UseJavaHandling(); } protected virtual int ClassIDFromInfo(ObjectContainerBase container, ArrayInfo info ) { return _versionHelper.ClassIDFromInfo(container, info); } private int MarshalledClassID(ObjectContainerBase container, ArrayInfo info) { return ClassIdToMarshalledClassId(ClassIDFromInfo(container, info), info.Primitive ()); } public int ClassIdToMarshalledClassId(int classID, bool primitive) { return _versionHelper.ClassIdToMarshalledClassId(classID, primitive); } protected bool IsPrimitive(IReflector reflector, IReflectClass claxx, Db4objects.Db4o.Internal.ClassMetadata classMetadata) { return _versionHelper.IsPrimitive(reflector, claxx, classMetadata); } private IReflectClass ComponentType(ObjectContainerBase container, object obj) { return ArrayReflector(container).GetComponentType(container.Reflector().ForObject (obj)); } public virtual void Defragment(IDefragmentContext context) { if (context.ClassMetadata().HasIdentity()) { DefragmentSlot(context); } else { context.IncrementOffset(LinkLength()); } } public void DefragmentSlot(IDefragmentContext context) { if (IsUntypedByteArray(context)) { return; } int classIdOffset = context.TargetBuffer().Offset(); ArrayInfo info = NewArrayInfo(); ReadInfo(context.Transaction(), context, info); DefragmentWriteMappedClassId(context, info, classIdOffset); int elementCount = info.ElementCount(); if (HasNullBitmap(info)) { BitMap4 bitMap = ReadNullBitmap(context, elementCount); elementCount -= ReducedCountForNullBitMap(elementCount, bitMap); } ITypeHandler4 correctTypeHandlerVersion = CorrectHandlerVersion(context, _handler , info); for (int i = 0; i < elementCount; i++) { context.Defragment(correctTypeHandlerVersion); } } private ITypeHandler4 CorrectHandlerVersion(IDefragmentContext context, ITypeHandler4 handler, ArrayInfo info) { Db4objects.Db4o.Internal.ClassMetadata classMetadata = ClassMetadata(context, info ); return HandlerRegistry.CorrectHandlerVersion(context, handler, classMetadata); } private Db4objects.Db4o.Internal.ClassMetadata ClassMetadata(IDefragmentContext context , ArrayInfo info) { int classMetadataId = ClassIDFromInfo(Container(context), info); return Container(context).ClassMetadataForID(classMetadataId); } private void DefragmentWriteMappedClassId(IDefragmentContext context, ArrayInfo info , int classIdOffset) { ByteArrayBuffer targetBuffer = context.TargetBuffer(); int currentOffset = targetBuffer.Offset(); targetBuffer.Seek(classIdOffset); int classID = ClassIDFromInfo(Container(context), info); int mappedID = context.MappedID(classID); int marshalledMappedId = ClassIdToMarshalledClassId(mappedID, info.Primitive()); targetBuffer.WriteInt(marshalledMappedId); targetBuffer.Seek(currentOffset); } private bool IsUntypedByteArray(IBufferContext context) { return Handlers4.IsUntyped(_handler) && HandleAsByteArray(context); } protected virtual bool HandleAsByteArray(IBufferContext context) { int offset = context.Offset(); ArrayInfo info = NewArrayInfo(); ReadInfo(context.Transaction(), context, info); bool isByteArray = context.Transaction().Reflector().ForClass(typeof(byte)).Equals (info.ReflectClass()); context.Seek(offset); return isByteArray; } public virtual object Read(IReadContext context) { ArrayInfo info = NewArrayInfo(); object array = ReadCreate(context.Transaction(), context, info); ReadElements(context, info, array); return array; } protected virtual void ReadElements(IReadContext context, ArrayInfo info, object array) { ReadInto(context, info, array); } protected virtual ArrayInfo NewArrayInfo() { return new ArrayInfo(); } protected void ReadInto(IReadContext context, ArrayInfo info, object array) { if (array == null) { return; } if (HandleAsByteArray(array)) { context.ReadBytes((byte[])array); // byte[] performance optimisation return; } if (HasNullBitmap(info)) { BitMap4 nullBitMap = ReadNullBitmap(context, info.ElementCount()); for (int i = 0; i < info.ElementCount(); i++) { object obj = nullBitMap.IsTrue(i) ? null : context.ReadObject(_handler); ArrayReflector(Container(context)).Set(array, i, obj); } } else { for (int i = 0; i < info.ElementCount(); i++) { ArrayReflector(Container(context)).Set(array, i, context.ReadObject(_handler)); } } } protected virtual BitMap4 ReadNullBitmap(IReadBuffer context, int length) { return context.ReadBitMap(length); } protected bool HasNullBitmap(ArrayInfo info) { return _versionHelper.HasNullBitmap(info); } public virtual void Write(IWriteContext context, object obj) { ArrayInfo info = NewArrayInfo(); Analyze(Container(context), obj, info); WriteInfo(context, info); WriteElements(context, obj, info); } protected virtual void WriteElements(IWriteContext context, object obj, ArrayInfo info) { if (HandleAsByteArray(obj)) { context.WriteBytes((byte[])obj); } else { // byte[] performance optimisation if (HasNullBitmap(info)) { BitMap4 nullItems = NullItemsMap(ArrayReflector(Container(context)), obj); WriteNullBitmap(context, nullItems); for (int i = 0; i < info.ElementCount(); i++) { if (!nullItems.IsTrue(i)) { context.WriteObject(_handler, ArrayReflector(Container(context)).Get(obj, i)); } } } else { for (int i = 0; i < info.ElementCount(); i++) { context.WriteObject(_handler, ArrayReflector(Container(context)).Get(obj, i)); } } } } protected virtual void WriteInfo(IWriteContext context, ArrayInfo info) { WriteHeader(context, info); WriteDimensions(context, info); } private void WriteHeader(IWriteContext context, ArrayInfo info) { context.WriteInt(MarshalledClassID(Container(context), info)); _versionHelper.WriteTypeInfo(context, info); } protected virtual void WriteDimensions(IWriteContext context, ArrayInfo info) { context.WriteInt(info.ElementCount()); } protected void Analyze(ObjectContainerBase container, object obj, ArrayInfo info) { // TODO: Move as much analysis as possible to ReflectArray#analyze() ArrayReflector(container).Analyze(obj, info); IReflectClass claxx = ComponentType(container, obj); Db4objects.Db4o.Internal.ClassMetadata classMetadata = container.ProduceClassMetadata (claxx); bool primitive = IsPrimitive(container.Reflector(), claxx, classMetadata); if (primitive) { claxx = classMetadata.ClassReflector(); } info.Primitive(primitive); info.ReflectClass(claxx); AnalyzeDimensions(container, obj, info); } protected virtual void AnalyzeDimensions(ObjectContainerBase container, object obj , ArrayInfo info) { info.ElementCount(ArrayReflector(container).GetLength(obj)); } private void WriteNullBitmap(IWriteBuffer context, BitMap4 bitMap) { context.WriteBytes(bitMap.Bytes()); } protected virtual BitMap4 NullItemsMap(IReflectArray reflector, object array) { int arrayLength = reflector.GetLength(array); BitMap4 nullBitMap = new BitMap4(arrayLength); for (int i = 0; i < arrayLength; i++) { if (reflector.Get(array, i) == null) { nullBitMap.Set(i, true); } } return nullBitMap; } internal virtual ObjectContainerBase Container(IContext context) { return context.Transaction().Container(); } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { return new PreparedArrayContainsComparison(context, this, _handler, obj); } public virtual int LinkLength() { return Const4.IndirectionLength; } public virtual ITypeHandler4 UnversionedTemplate() { return new Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler(); } public virtual object DeepClone(object context) { TypeHandlerCloneContext typeHandlerCloneContext = (TypeHandlerCloneContext)context; Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler original = (Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler )typeHandlerCloneContext.original; Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler cloned = (Db4objects.Db4o.Internal.Handlers.Array.ArrayHandler )Reflection4.NewInstance(this); cloned._usePrimitiveClassReflector = original._usePrimitiveClassReflector; cloned._handler = typeHandlerCloneContext.CorrectHandlerVersion(original.DelegateTypeHandler ()); return cloned; } public virtual ITypeHandler4 DelegateTypeHandler() { return _handler; } private const int HashcodeForNull = 9141078; public override string ToString() { return "ArrayHandler(isPrimitive=" + _usePrimitiveClassReflector + ", handler=" + _handler + ")"; } public virtual bool DescendsIntoMembers() { return true; } } } ArrayVersionHelper3.cs0000644000175000017500000000561211700531646033544 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayVersionHelper3 : ArrayVersionHelper5 { public override int ClassIDFromInfo(ObjectContainerBase container, ArrayInfo info ) { ClassMetadata classMetadata = container.ProduceClassMetadata(info.ReflectClass()); if (classMetadata == null) { // TODO: This one is a terrible low-frequency blunder !!! // If YapClass-ID == 99999 then we will get IGNORE back. // Discovered on adding the primitives return Const4.IgnoreId; } return classMetadata.GetID(); } public override int ClassIdToMarshalledClassId(int classID, bool primitive) { if (primitive) { classID -= Const4.Primitive; } return -classID; } public override IReflectClass ClassReflector(IReflector reflector, ClassMetadata classMetadata, bool isPrimitive) { IReflectClass primitiveClaxx = Handlers4.PrimitiveClassReflector(classMetadata, reflector ); if (primitiveClaxx != null) { return primitiveClaxx; } return base.ClassReflector(reflector, classMetadata, isPrimitive); } public override bool HasNullBitmap(ArrayInfo info) { return false; } public override bool IsPrimitive(IReflector reflector, IReflectClass claxx, ClassMetadata classMetadata) { return Handlers4.PrimitiveClassReflector(classMetadata, reflector) != null; return claxx.IsPrimitive(); } public override IReflectClass ReflectClassFromElementsEntry(ObjectContainerBase container , ArrayInfo info, int classID) { if (classID == Const4.IgnoreId) { // TODO: Here is a low-frequency mistake, extremely unlikely. // If classID == 99999 by accident then we will get ignore. return null; } info.Primitive(false); if (UseJavaHandling()) { if (classID < Const4.Primitive) { info.Primitive(true); classID -= Const4.Primitive; } } classID = -classID; ClassMetadata classMetadata = container.ClassMetadataForID(classID); if (classMetadata != null) { return ClassReflector(container.Reflector(), classMetadata, info.Primitive()); } return null; } public sealed override bool UseJavaHandling() { return !Deploy.csharp; } public override void WriteTypeInfo(IWriteContext context, ArrayInfo info) { } // do nothing, the byte for additional type information was added after format 3 public override void ReadTypeInfo(Transaction trans, IReadBuffer buffer, ArrayInfo info, int classID) { } // do nothing, the byte for additional type information was added after format 3 } } MultidimensionalArrayHandler3.cs0000644000175000017500000000061411700531646035567 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers.Array; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class MultidimensionalArrayHandler3 : MultidimensionalArrayHandler { protected override ArrayVersionHelper CreateVersionHelper() { return new ArrayVersionHelper3(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/ArrayHandler3.cs0000644000175000017500000000055511700531646032414 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers.Array; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayHandler3 : ArrayHandler5 { protected override ArrayVersionHelper CreateVersionHelper() { return new ArrayVersionHelper3(); } } } ReflectArrayIterator.cs0000644000175000017500000000122411700531646033765 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers.Array { /// internal sealed class ReflectArrayIterator : IndexedIterator { private readonly object _array; private readonly IReflectArray _reflectArray; public ReflectArrayIterator(IReflectArray reflectArray, object array) : base(reflectArray .GetLength(array)) { _reflectArray = reflectArray; _array = array; } protected override object Get(int index) { return _reflectArray.Get(_array, index); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/ArrayHandler0.cs0000644000175000017500000000603211700531646032405 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayHandler0 : ArrayHandler1 { protected override ArrayVersionHelper CreateVersionHelper() { return new ArrayVersionHelper0(); } protected override void WithContent(AbstractBufferContext context, IRunnable runnable ) { int address = context.ReadInt(); int length = context.ReadInt(); if (address == 0) { return; } IReadBuffer temp = context.Buffer(); ByteArrayBuffer indirectedBuffer = Container(context).DecryptedBufferByAddress(address , length); context.Buffer(indirectedBuffer); runnable.Run(); context.Buffer(temp); } /// public override void Delete(IDeleteContext context) { context.ReadSlot(); context.DefragmentRecommended(); } public override object Read(IReadContext readContext) { IInternalReadContext context = (IInternalReadContext)readContext; ByteArrayBuffer buffer = (ByteArrayBuffer)context.ReadIndirectedBuffer(); if (buffer == null) { return null; } // With the following line we ask the context to work with // a different buffer. Should this logic ever be needed by // a user handler, it should be implemented by using a Queue // in the UnmarshallingContext. // The buffer has to be set back from the outside! See below IReadBuffer contextBuffer = context.Buffer(buffer); object array = base.Read(context); // The context buffer has to be set back. context.Buffer(contextBuffer); return array; } public static void Defragment(IDefragmentContext context, ArrayHandler handler) { int sourceAddress = context.SourceBuffer().ReadInt(); int length = context.SourceBuffer().ReadInt(); if (sourceAddress == 0 && length == 0) { context.TargetBuffer().WriteInt(0); context.TargetBuffer().WriteInt(0); return; } Slot slot = context.AllocateMappedTargetSlot(sourceAddress, length); ByteArrayBuffer sourceBuffer = null; try { sourceBuffer = context.SourceBufferByAddress(sourceAddress, length); } catch (IOException exc) { throw new Db4oIOException(exc); } DefragmentContextImpl payloadContext = new DefragmentContextImpl(sourceBuffer, (DefragmentContextImpl )context); handler.DefragmentSlot(payloadContext); payloadContext.WriteToTarget(slot.Address()); context.TargetBuffer().WriteInt(slot.Address()); context.TargetBuffer().WriteInt(length); } public override void Defragment(IDefragmentContext context) { Defragment(context, this); } } } ArrayVersionHelper0.cs0000644000175000017500000000056011700531646033536 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers.Array; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayVersionHelper0 : ArrayVersionHelper3 { public override bool IsPreVersion0Format(int elementCount) { return elementCount >= 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/ArrayHandler1.cs0000644000175000017500000000072711700531646032413 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayHandler1 : ArrayHandler3 { protected override bool HandleAsByteArray(IBufferContext context) { return false; } protected override bool HandleAsByteArray(object obj) { return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/Array/ArrayHandler5.cs0000644000175000017500000000055411700531646032415 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers.Array; namespace Db4objects.Db4o.Internal.Handlers.Array { /// public class ArrayHandler5 : ArrayHandler { protected override ArrayVersionHelper CreateVersionHelper() { return new ArrayVersionHelper5(); } } } NullFieldAwareTypeHandler.cs0000644000175000017500000000404511700531646033614 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// public class NullFieldAwareTypeHandler : IFieldAwareTypeHandler { public static readonly IFieldAwareTypeHandler Instance = new NullFieldAwareTypeHandler (); public virtual void AddFieldIndices(ObjectIdContextImpl context) { } public virtual void ClassMetadata(Db4objects.Db4o.Internal.ClassMetadata classMetadata ) { } public virtual void CollectIDs(CollectIdContext context, IPredicate4 predicate) { } public virtual void DeleteMembers(DeleteContextImpl deleteContext, bool isUpdate) { } public virtual void ReadVirtualAttributes(ObjectReferenceContext context) { } public virtual bool SeekToField(ObjectHeaderContext context, ClassAspect aspect) { return false; } public virtual void Defragment(IDefragmentContext context) { } /// public virtual void Delete(IDeleteContext context) { } public virtual void Activate(IReferenceActivationContext context) { } public virtual void Write(IWriteContext context, object obj) { } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { return null; } public virtual ITypeHandler4 UnversionedTemplate() { return null; } public virtual object DeepClone(object context) { return null; } public virtual void CascadeActivation(IActivationContext context) { } public virtual void CollectIDs(QueryingReadContext context) { } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/DoubleHandler0.cs0000644000175000017500000000066511700531646031471 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class DoubleHandler0 : DoubleHandler { public override object Read(IReadContext context) { double value = (double)base.Read(context); if (double.IsNaN(value)) { return null; } return value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/TypeHandlerPredicatePair.cs0000644000175000017500000000077211700531646033554 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// public class TypeHandlerPredicatePair { public readonly ITypeHandlerPredicate _predicate; public readonly ITypeHandler4 _typeHandler; public TypeHandlerPredicatePair(ITypeHandlerPredicate predicate, ITypeHandler4 typeHandler ) { _predicate = predicate; _typeHandler = typeHandler; } } } StandardReferenceTypeHandler.cs0000644000175000017500000005354711700531646034350 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Metadata; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Handlers { /// public class StandardReferenceTypeHandler : IFieldAwareTypeHandler, IIndexableTypeHandler , IReadsObjectIds { private const int HashcodeForNull = 72483944; private Db4objects.Db4o.Internal.ClassMetadata _classMetadata; public StandardReferenceTypeHandler(Db4objects.Db4o.Internal.ClassMetadata classMetadata ) { ClassMetadata(classMetadata); } public StandardReferenceTypeHandler() { } public virtual void Defragment(IDefragmentContext context) { TraverseAllAspects(context, new _MarshallingInfoTraverseAspectCommand_35(context, EnsureFieldList(context))); } private sealed class _MarshallingInfoTraverseAspectCommand_35 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_35(IDefragmentContext context, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; } protected override int InternalDeclaredAspectCount(Db4objects.Db4o.Internal.ClassMetadata classMetadata) { return context.ReadInt(); } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (!isNull) { aspect.DefragAspect(context); } } public override bool Accept(ClassAspect aspect) { return aspect.IsEnabledOn(context); } private readonly IDefragmentContext context; } /// public virtual void Delete(IDeleteContext context) { context.DeleteObject(); } public void ActivateAspects(UnmarshallingContext context) { BooleanByRef schemaUpdateDetected = new BooleanByRef(); ContextState savedState = context.SaveState(); ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_63(context , schemaUpdateDetected, EnsureFieldList(context)); // TODO: cant the aspect handle it itself? // Probably no because old aspect versions might not be able // to handle null... TraverseAllAspects(context, command); if (schemaUpdateDetected.value) { context.RestoreState(savedState); command = new _MarshallingInfoTraverseAspectCommand_94(context, EnsureFieldList(context )); TraverseAllAspects(context, command); } } private sealed class _MarshallingInfoTraverseAspectCommand_63 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_63(UnmarshallingContext context, BooleanByRef schemaUpdateDetected, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; this.schemaUpdateDetected = schemaUpdateDetected; } public override bool Accept(ClassAspect aspect) { return aspect.IsEnabledOn(context); } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (aspect is FieldMetadata) { FieldMetadata field = (FieldMetadata)aspect; if (field.Updating()) { schemaUpdateDetected.value = true; } if (isNull) { if (field.GetStoredType() == null || !field.GetStoredType().IsPrimitive()) { field.Set(context.PersistentObject(), null); } return; } } aspect.Activate(context); } private readonly UnmarshallingContext context; private readonly BooleanByRef schemaUpdateDetected; } private sealed class _MarshallingInfoTraverseAspectCommand_94 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_94(UnmarshallingContext context, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { FieldMetadata field = (FieldMetadata)aspect; if (!isNull) { field.AttemptUpdate(context); } } public override bool Accept(ClassAspect aspect) { return aspect is FieldMetadata; } private readonly UnmarshallingContext context; } public virtual void Activate(IReferenceActivationContext context) { ActivateAspects((UnmarshallingContext)context); } public virtual void Write(IWriteContext context, object obj) { MarshallAspects(obj, (MarshallingContext)context); } public virtual void MarshallAspects(object obj, MarshallingContext context) { Transaction trans = context.Transaction(); ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_122(context , obj, trans, EnsureFieldList(context)); TraverseAllAspects(context, command); } private sealed class _MarshallingInfoTraverseAspectCommand_122 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_122(MarshallingContext context, object obj, Transaction trans, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; this.obj = obj; this.trans = trans; } protected override int InternalDeclaredAspectCount(Db4objects.Db4o.Internal.ClassMetadata classMetadata) { int aspectCount = classMetadata._aspects.Length; context.WriteDeclaredAspectCount(aspectCount); return aspectCount; } public override bool Accept(ClassAspect aspect) { return aspect.IsEnabledOn(context); } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { object marshalledObject = obj; if (aspect is FieldMetadata) { FieldMetadata field = (FieldMetadata)aspect; marshalledObject = field.GetOrCreate(trans, obj); if (marshalledObject == null) { context.IsNull(currentSlot, true); field.AddIndexEntry(trans, context.ObjectID(), null); return; } } aspect.Marshall(context, marshalledObject); } public override void ProcessAspectOnMissingClass(ClassAspect aspect, int currentSlot ) { ((MarshallingContext)context).IsNull(currentSlot, true); } private readonly MarshallingContext context; private readonly object obj; private readonly Transaction trans; } public virtual IPreparedComparison PrepareComparison(IContext context, object source ) { if (source == null) { return Null.Instance; } if (source is int) { int id = ((int)source); return new StandardReferenceTypeHandler.PreparedComparisonImpl(id, null); } if (source is TransactionContext) { TransactionContext tc = (TransactionContext)source; object obj = tc._object; int id = IdFor(obj, tc._transaction); return new StandardReferenceTypeHandler.PreparedComparisonImpl(id, ReflectClassFor (obj)); } return PlatformComparisonFor(source); } private IPreparedComparison PlatformComparisonFor(object source) { if (source == null) { return new _IPreparedComparison_179(); } //TODO: Move the comparable wrapping to a .Net specific StandardStructHandler if (source is IComparable) { return new _IPreparedComparison_187(source); } throw new IllegalComparisonException(); } private sealed class _IPreparedComparison_179 : IPreparedComparison { public _IPreparedComparison_179() { } public int CompareTo(object obj) { return obj == null ? 0 : -1; } } private sealed class _IPreparedComparison_187 : IPreparedComparison { public _IPreparedComparison_187(object source) { this.source = source; } public int CompareTo(object obj) { if (obj == null) { return 1; } IComparable self = (IComparable)source; return self.CompareTo(obj); } private readonly object source; } private IReflectClass ReflectClassFor(object obj) { return ClassMetadata().Reflector().ForObject(obj); } private int IdFor(object @object, Transaction inTransaction) { return Stream().GetID(inTransaction, @object); } private ObjectContainerBase Stream() { return ClassMetadata().Container(); } public sealed class PreparedComparisonImpl : IPreparedComparison { private readonly int _id; private readonly IReflectClass _claxx; public PreparedComparisonImpl(int id, IReflectClass claxx) { _id = id; _claxx = claxx; } public int CompareTo(object obj) { if (obj is TransactionContext) { obj = ((TransactionContext)obj)._object; } if (obj == null) { return _id == 0 ? 0 : 1; } if (obj is int) { int targetInt = ((int)obj); return _id == targetInt ? 0 : (_id < targetInt ? -1 : 1); } if (_claxx != null) { if (_claxx.IsAssignableFrom(_claxx.Reflector().ForObject(obj))) { return 0; } } throw new IllegalComparisonException(); } } public void TraverseAllAspects(IMarshallingInfo context, ITraverseAspectCommand command ) { ClassMetadata classMetadata = ClassMetadata(); AssertClassMetadata(context.ClassMetadata()); classMetadata.TraverseAllAspects(command); } protected virtual IMarshallingInfo EnsureFieldList(IMarshallingInfo context) { return context; } private void AssertClassMetadata(ClassMetadata contextMetadata) { } // if (contextMetadata != classMetadata()) { // throw new IllegalStateException("expecting '" + classMetadata() + "', got '" + contextMetadata + "'"); // } public virtual ClassMetadata ClassMetadata() { return _classMetadata; } public virtual void ClassMetadata(ClassMetadata classMetadata) { _classMetadata = classMetadata; } public override bool Equals(object obj) { if (!(obj is StandardReferenceTypeHandler)) { return false; } StandardReferenceTypeHandler other = (StandardReferenceTypeHandler)obj; if (ClassMetadata() == null) { return other.ClassMetadata() == null; } return ClassMetadata().Equals(other.ClassMetadata()); } public override int GetHashCode() { if (ClassMetadata() != null) { return ClassMetadata().GetHashCode(); } return HashcodeForNull; } public virtual ITypeHandler4 UnversionedTemplate() { return new StandardReferenceTypeHandler(null); } public virtual object DeepClone(object context) { TypeHandlerCloneContext typeHandlerCloneContext = (TypeHandlerCloneContext)context; StandardReferenceTypeHandler cloned = (StandardReferenceTypeHandler)Reflection4.NewInstance (this); if (typeHandlerCloneContext.original is StandardReferenceTypeHandler) { StandardReferenceTypeHandler original = (StandardReferenceTypeHandler)typeHandlerCloneContext .original; cloned.ClassMetadata(original.ClassMetadata()); } else { // New logic: ClassMetadata takes the responsibility in // #correctHandlerVersion() to set the // ClassMetadata directly on cloned handler. // if(_classMetadata == null){ // throw new IllegalStateException(); // } cloned.ClassMetadata(_classMetadata); } return cloned; } public virtual void CollectIDs(CollectIdContext context, IPredicate4 predicate) { ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_311(predicate , context, EnsureFieldList(context)); TraverseAllAspects(context, command); } private sealed class _MarshallingInfoTraverseAspectCommand_311 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_311(IPredicate4 predicate, CollectIdContext context, IMarshallingInfo baseArg1) : base(baseArg1) { this.predicate = predicate; this.context = context; } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (isNull) { return; } if (predicate.Match(aspect)) { aspect.CollectIDs(context); } else { aspect.IncrementOffset(context); } } private readonly IPredicate4 predicate; private readonly CollectIdContext context; } public virtual void CascadeActivation(IActivationContext context) { AssertClassMetadata(context.ClassMetadata()); context.CascadeActivationToTarget(); } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { if (ClassMetadata().IsArray()) { return this; } return null; } /// public virtual void CollectIDs(QueryingReadContext context) { if (CollectIDsByTypehandlerAspect(context)) { return; } CollectIDsByInstantiatingCollection(context); } /// private bool CollectIDsByTypehandlerAspect(QueryingReadContext context) { BooleanByRef aspectFound = new BooleanByRef(false); CollectIdContext subContext = CollectIdContext.ForID(context.Transaction(), context .Collector(), context.CollectionID()); ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_349(this , aspectFound, subContext, EnsureFieldList(subContext)); TraverseAllAspects(subContext, command); return aspectFound.value; } private sealed class _MarshallingInfoTraverseAspectCommand_349 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_349(StandardReferenceTypeHandler _enclosing , BooleanByRef aspectFound, CollectIdContext subContext, IMarshallingInfo baseArg1 ) : base(baseArg1) { this._enclosing = _enclosing; this.aspectFound = aspectFound; this.subContext = subContext; } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (isNull) { return; } if (this._enclosing.IsCollectIdTypehandlerAspect(aspect)) { aspectFound.value = true; aspect.CollectIDs(subContext); } else { aspect.IncrementOffset(subContext); } } private readonly StandardReferenceTypeHandler _enclosing; private readonly BooleanByRef aspectFound; private readonly CollectIdContext subContext; } private bool IsCollectIdTypehandlerAspect(ClassAspect aspect) { if (!(aspect is TypeHandlerAspect)) { return false; } ITypeHandler4 typehandler = ((TypeHandlerAspect)aspect)._typeHandler; return Handlers4.IsCascading(typehandler); } /// private void CollectIDsByInstantiatingCollection(QueryingReadContext context) { int id = context.CollectionID(); if (id == 0) { return; } Transaction transaction = context.Transaction(); ObjectContainerBase container = context.Container(); object obj = container.GetByID(transaction, id); if (obj == null) { return; } // FIXME: [TA] review activation depth int depth = DepthUtil.AdjustDepthToBorders(2); container.Activate(transaction, obj, container.ActivationDepthProvider().ActivationDepth (depth, ActivationMode.Activate)); Platform4.ForEachCollectionElement(obj, new _IVisitor4_390(context)); } private sealed class _IVisitor4_390 : IVisitor4 { public _IVisitor4_390(QueryingReadContext context) { this.context = context; } public void Visit(object elem) { context.Add(elem); } private readonly QueryingReadContext context; } public virtual void ReadVirtualAttributes(ObjectReferenceContext context) { ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_398(context , EnsureFieldList(context)); TraverseAllAspects(context, command); } private sealed class _MarshallingInfoTraverseAspectCommand_398 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_398(ObjectReferenceContext context, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (!isNull) { if (aspect is VirtualFieldMetadata) { ((VirtualFieldMetadata)aspect).ReadVirtualAttribute(context); } else { aspect.IncrementOffset(context); } } } private readonly ObjectReferenceContext context; } public virtual void AddFieldIndices(ObjectIdContextImpl context) { ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_414(context , EnsureFieldList(context)); TraverseAllAspects(context, command); } private sealed class _MarshallingInfoTraverseAspectCommand_414 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_414(ObjectIdContextImpl context, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (aspect is FieldMetadata) { FieldMetadata field = (FieldMetadata)aspect; if (isNull) { field.AddIndexEntry(context.Transaction(), context.ObjectId(), null); } else { field.AddFieldIndex(context); } } else { aspect.IncrementOffset(context.Buffer()); } } public override bool Accept(ClassAspect aspect) { return aspect.IsEnabledOn(context); } private readonly ObjectIdContextImpl context; } public virtual void DeleteMembers(DeleteContextImpl context, bool isUpdate) { ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_438(context , isUpdate, EnsureFieldList(context)); TraverseAllAspects(context, command); } private sealed class _MarshallingInfoTraverseAspectCommand_438 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_438(DeleteContextImpl context, bool isUpdate, IMarshallingInfo baseArg1) : base(baseArg1) { this.context = context; this.isUpdate = isUpdate; } protected override void ProcessAspect(ClassAspect aspect, int currentSlot, bool isNull ) { if (isNull) { if (aspect is FieldMetadata) { FieldMetadata field = (FieldMetadata)aspect; field.RemoveIndexEntry(context.Transaction(), context.ObjectId(), null); } return; } aspect.Delete(context, isUpdate); } private readonly DeleteContextImpl context; private readonly bool isUpdate; } public virtual bool SeekToField(ObjectHeaderContext context, ClassAspect aspect) { BooleanByRef found = new BooleanByRef(false); ITraverseAspectCommand command = new _MarshallingInfoTraverseAspectCommand_456(aspect , found, EnsureFieldList(context)); TraverseAllAspects(context, command); return found.value; } private sealed class _MarshallingInfoTraverseAspectCommand_456 : MarshallingInfoTraverseAspectCommand { public _MarshallingInfoTraverseAspectCommand_456(ClassAspect aspect, BooleanByRef found, IMarshallingInfo baseArg1) : base(baseArg1) { this.aspect = aspect; this.found = found; } public override bool Accept(ClassAspect aspect) { return aspect.IsEnabledOn(this._marshallingInfo); } protected override void ProcessAspect(ClassAspect curField, int currentSlot, bool isNull) { if (curField == aspect) { found.value = !isNull; this.Cancel(); return; } if (!isNull) { curField.IncrementOffset(this._marshallingInfo.Buffer()); } } private readonly ClassAspect aspect; private readonly BooleanByRef found; } public object IndexEntryToObject(IContext context, object indexEntry) { if (indexEntry == null) { return null; } int id = ((int)indexEntry); return ((ObjectContainerBase)context.ObjectContainer()).GetByID2(context.Transaction (), id); } public void DefragIndexEntry(DefragmentContextImpl context) { context.CopyID(); } public object ReadIndexEntry(IContext context, ByteArrayBuffer a_reader) { return a_reader.ReadInt(); } /// public object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer statefulBuffer ) { return ReadIndexEntry(statefulBuffer.Transaction().Context(), statefulBuffer); } /// /// public virtual object ReadIndexEntry(IObjectIdContext context) { return context.ReadInt(); } public virtual int LinkLength() { return Const4.IdLength; } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer a_writer, object a_object) { if (a_object == null) { a_writer.WriteInt(0); return; } a_writer.WriteInt(((int)a_object)); } public virtual ITypeHandler4 DelegateTypeHandler(IContext context) { return ClassMetadata().DelegateTypeHandler(context); } public virtual ObjectID ReadObjectID(IInternalReadContext context) { return ObjectID.Read(context); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/IVirtualAttributeHandler.cs0000644000175000017500000000046011700531646033613 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Handlers { /// public interface IVirtualAttributeHandler { void ReadVirtualAttributes(ObjectReferenceContext context); } } StandardReferenceTypeHandler0.cs0000644000175000017500000000233611700531646034416 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { /// public class StandardReferenceTypeHandler0 : StandardReferenceTypeHandler { protected override IMarshallingInfo EnsureFieldList(IMarshallingInfo context) { return new _IMarshallingInfo_16(context); } private sealed class _IMarshallingInfo_16 : IMarshallingInfo { public _IMarshallingInfo_16(IMarshallingInfo context) { this.context = context; } public void DeclaredAspectCount(int count) { context.DeclaredAspectCount(count); } public int DeclaredAspectCount() { return context.DeclaredAspectCount(); } public bool IsNull(int fieldIndex) { return false; } public ClassMetadata ClassMetadata() { return context.ClassMetadata(); } public IReadBuffer Buffer() { return context.Buffer(); } public void BeginSlot() { context.BeginSlot(); } private readonly IMarshallingInfo context; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Transaction.cs0000644000175000017500000002235411700531646027425 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// public abstract class Transaction { private IContext _context; internal Tree _delete; protected readonly Db4objects.Db4o.Internal.Transaction _systemTransaction; /// /// This is the inside representation to operate against, the actual /// file-based ObjectContainerBase or the client. /// /// /// This is the inside representation to operate against, the actual /// file-based ObjectContainerBase or the client. For all calls /// against this ObjectContainerBase the method signatures that take /// a transaction have to be used. /// private readonly ObjectContainerBase _container; /// This is the outside representation to the user. /// /// This is the outside representation to the user. This ObjectContainer /// should use this transaction as it's main user transation, so it also /// allows using the method signatures on ObjectContainer without a /// transaction. /// private IObjectContainer _objectContainer; private List4 _transactionListeners; private readonly IReferenceSystem _referenceSystem; private readonly IDictionary _locals = new Hashtable(); public Transaction(ObjectContainerBase container, Db4objects.Db4o.Internal.Transaction systemTransaction, IReferenceSystem referenceSystem) { // contains DeleteInfo nodes _container = container; _systemTransaction = systemTransaction; _referenceSystem = referenceSystem; } /// Retrieves the value of a transaction local variables. /// /// Retrieves the value of a transaction local variables. /// If this is the first time the variable is accessed /// TransactionLocal.InitialValueFor(Transaction) /// /// will provide the initial value. /// public virtual ByRef Get(TransactionLocal local) { ByRef existing = (ByRef)_locals[local]; if (null != existing) { return existing; } ByRef initialValue = ByRef.NewInstance(local.InitialValueFor(this)); _locals[local] = initialValue; return initialValue; } public void CheckSynchronization() { } public virtual void AddTransactionListener(ITransactionListener listener) { _transactionListeners = new List4(_transactionListeners, listener); } protected void ClearAll() { Clear(); _transactionListeners = null; _locals.Clear(); } protected abstract void Clear(); public virtual void Close(bool rollbackOnClose) { if (Container() != null) { CheckSynchronization(); Container().ReleaseSemaphores(this); DiscardReferenceSystem(); } if (rollbackOnClose) { Rollback(); } ITransactionalIdSystem idSystem = IdSystem(); if (idSystem != null) { idSystem.Close(); } } protected virtual void DiscardReferenceSystem() { if (_referenceSystem != null) { Container().ReferenceSystemRegistry().RemoveReferenceSystem(_referenceSystem); } } public abstract void Commit(); protected virtual void CommitTransactionListeners() { CheckSynchronization(); if (_transactionListeners != null) { IEnumerator i = new Iterator4Impl(_transactionListeners); while (i.MoveNext()) { ((ITransactionListener)i.Current).PreCommit(); } _transactionListeners = null; } } protected virtual bool IsSystemTransaction() { return _systemTransaction == null; } public virtual bool Delete(ObjectReference @ref, int id, int cascade) { CheckSynchronization(); if (@ref != null) { if (!_container.FlagForDelete(@ref)) { return false; } } if (DTrace.enabled) { DTrace.TransDelete.Log(id); } DeleteInfo info = (DeleteInfo)TreeInt.Find(_delete, id); if (info == null) { info = new DeleteInfo(id, @ref, cascade); _delete = Tree.Add(_delete, info); return true; } info._reference = @ref; if (cascade > info._cascade) { info._cascade = cascade; } return true; } public virtual void DontDelete(int a_id) { if (DTrace.enabled) { DTrace.TransDontDelete.Log(a_id); } if (_delete == null) { return; } _delete = TreeInt.RemoveLike((TreeInt)_delete, a_id); } public abstract void ProcessDeletes(); public virtual IReferenceSystem ReferenceSystem() { if (_referenceSystem != null) { return _referenceSystem; } return ParentTransaction().ReferenceSystem(); } public IReflector Reflector() { return Container().Reflector(); } public abstract void Rollback(); protected virtual void RollBackTransactionListeners() { CheckSynchronization(); if (_transactionListeners != null) { IEnumerator i = new Iterator4Impl(_transactionListeners); while (i.MoveNext()) { ((ITransactionListener)i.Current).PostRollback(); } _transactionListeners = null; } } internal virtual bool SupportsVirtualFields() { return true; } public virtual Db4objects.Db4o.Internal.Transaction SystemTransaction() { if (_systemTransaction != null) { return _systemTransaction; } return this; } public override string ToString() { return Container().ToString(); } public abstract void WriteUpdateAdjustIndexes(int id, ClassMetadata clazz, ArrayType typeInfo); public ObjectContainerBase Container() { return _container; } public virtual Db4objects.Db4o.Internal.Transaction ParentTransaction() { return _systemTransaction; } public virtual void RollbackReferenceSystem() { ReferenceSystem().Rollback(); } public virtual void CommitReferenceSystem() { ReferenceSystem().Commit(); } public virtual void AddNewReference(ObjectReference @ref) { ReferenceSystem().AddNewReference(@ref); } public object ObjectForIdFromCache(int id) { ObjectReference @ref = ReferenceForId(id); if (@ref == null) { return null; } object candidate = @ref.GetObject(); if (candidate == null) { RemoveReference(@ref); } return candidate; } public ObjectReference ReferenceForId(int id) { ObjectReference @ref = ReferenceSystem().ReferenceForId(id); if (@ref != null) { if (@ref.GetObject() == null) { RemoveReference(@ref); return null; } return @ref; } if (ParentTransaction() != null) { return ParentTransaction().ReferenceForId(id); } return null; } public ObjectReference ReferenceForObject(object obj) { ObjectReference @ref = ReferenceSystem().ReferenceForObject(obj); if (@ref != null) { return @ref; } if (ParentTransaction() != null) { return ParentTransaction().ReferenceForObject(obj); } return null; } public void RemoveReference(ObjectReference @ref) { ReferenceSystem().RemoveReference(@ref); // setting the ID to minus 1 ensures that the // gc mechanism does not kill the new YapObject @ref.SetID(-1); Platform4.KillYapRef(@ref.GetObjectReference()); } public void RemoveObjectFromReferenceSystem(object obj) { ObjectReference @ref = ReferenceForObject(obj); if (@ref != null) { RemoveReference(@ref); } } public virtual void SetOutSideRepresentation(IObjectContainer objectContainer) { _objectContainer = objectContainer; } public virtual IObjectContainer ObjectContainer() { if (_objectContainer != null) { return _objectContainer; } return _container; } public virtual IContext Context() { if (_context == null) { _context = new _IContext_295(this); } return _context; } private sealed class _IContext_295 : IContext { public _IContext_295(Transaction _enclosing) { this._enclosing = _enclosing; } public IObjectContainer ObjectContainer() { return this._enclosing.ObjectContainer(); } public Db4objects.Db4o.Internal.Transaction Transaction() { return this._enclosing; } private readonly Transaction _enclosing; } protected virtual void TraverseDelete(IVisitor4 deleteVisitor) { if (_delete == null) { return; } _delete.Traverse(deleteVisitor); _delete = null; } public virtual object Wrap(object value) { if (value is int) { return value; } return new TransactionContext(this, value); } public abstract ITransactionalIdSystem IdSystem(); public abstract long VersionForId(int id); public abstract long GenerateTransactionTimestamp(long forcedTimeStamp); public abstract void UseDefaultTransactionTimestamp(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IO/0000755000175000017500000000000011700531646025112 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IO/BlockSizeImpl.cs0000644000175000017500000000117511700531646030154 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.Internal.IO { public class BlockSizeImpl : IBlockSize { private readonly ListenerRegistry _listenerRegistry = ListenerRegistry.NewInstance (); private int _value; public virtual void Register(IListener4 listener) { _listenerRegistry.Register(listener); } public virtual void Set(int newValue) { _value = newValue; _listenerRegistry.NotifyListeners(_value); } public virtual int Value() { return _value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/DefragmentContextImpl.cs0000644000175000017500000002626511700531646031410 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Mapping; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public sealed class DefragmentContextImpl : IReadWriteBuffer, IDefragmentContext { private ByteArrayBuffer _source; private ByteArrayBuffer _target; private IDefragmentServices _services; private readonly ObjectHeader _objectHeader; private int _declaredAspectCount; private int _currentParentSourceID; public DefragmentContextImpl(ByteArrayBuffer source, Db4objects.Db4o.Internal.DefragmentContextImpl context) : this(source, context._services, context._objectHeader) { } public DefragmentContextImpl(ByteArrayBuffer source, IDefragmentServices services ) : this(source, services, null) { } public DefragmentContextImpl(ByteArrayBuffer source, IDefragmentServices services , ObjectHeader header) { _source = source; _services = services; _target = new ByteArrayBuffer(Length()); _source.CopyTo(_target, 0, 0, Length()); _objectHeader = header; } public DefragmentContextImpl(Db4objects.Db4o.Internal.DefragmentContextImpl parentContext , ObjectHeader header) { _source = parentContext._source; _target = parentContext._target; _services = parentContext._services; _objectHeader = header; } public int Offset() { return _source.Offset(); } public void Seek(int offset) { _source.Seek(offset); _target.Seek(offset); } public void IncrementOffset(int numBytes) { _source.IncrementOffset(numBytes); _target.IncrementOffset(numBytes); } public void IncrementIntSize() { IncrementOffset(Const4.IntLength); } public int CopySlotlessID() { return CopyUnindexedId(false); } public int CopyUnindexedID() { return CopyUnindexedId(true); } private int CopyUnindexedId(bool doRegister) { int orig = _source.ReadInt(); // TODO: There is no test case for the zero case if (orig == 0) { _target.WriteInt(0); return 0; } int mapped = -1; try { mapped = _services.StrictMappedID(orig); } catch (MappingNotFoundException) { mapped = _services.TargetNewId(); _services.MapIDs(orig, mapped, false); if (doRegister) { _services.RegisterUnindexed(orig); } } _target.WriteInt(mapped); return mapped; } public int CopyID() { // This code is slightly redundant. // The profiler shows it's a hotspot. // The following would be non-redudant. // return copy(false, false); int id = _source.ReadInt(); return WriteMappedID(id); } public int CopyID(bool flipNegative) { int id = _source.ReadInt(); return InternalCopyID(flipNegative, id); } public int CopyIDReturnOriginalID() { return CopyIDReturnOriginalID(false); } public int CopyIDReturnOriginalID(bool flipNegative) { int id = _source.ReadInt(); InternalCopyID(flipNegative, id); bool flipped = flipNegative && (id < 0); if (flipped) { return -id; } return id; } private int InternalCopyID(bool flipNegative, int id) { bool flipped = flipNegative && (id < 0); if (flipped) { id = -id; } int mapped = _services.MappedID(id); if (flipped) { mapped = -mapped; } _target.WriteInt(mapped); return mapped; } public void ReadBegin(byte identifier) { _source.ReadBegin(identifier); _target.ReadBegin(identifier); } public byte ReadByte() { byte value = _source.ReadByte(); _target.IncrementOffset(1); return value; } public void ReadBytes(byte[] bytes) { _source.ReadBytes(bytes); _target.IncrementOffset(bytes.Length); } public int ReadInt() { int value = _source.ReadInt(); _target.IncrementOffset(Const4.IntLength); return value; } public void WriteInt(int value) { _source.IncrementOffset(Const4.IntLength); _target.WriteInt(value); } public void Write(LocalObjectContainer file, int address) { file.WriteBytes(_target, address, 0); } public void IncrementStringOffset(LatinStringIO sio) { IncrementStringOffset(sio, _source); IncrementStringOffset(sio, _target); } private void IncrementStringOffset(LatinStringIO sio, ByteArrayBuffer buffer) { sio.ReadLengthAndString(buffer); } public ByteArrayBuffer SourceBuffer() { return _source; } public ByteArrayBuffer TargetBuffer() { return _target; } public IIDMapping Mapping() { return _services; } public Db4objects.Db4o.Internal.Transaction SystemTrans() { return Transaction(); } public IDefragmentServices Services() { return _services; } public static void ProcessCopy(IDefragmentServices context, int sourceID, ISlotCopyHandler command) { ByteArrayBuffer sourceReader = context.SourceBufferByID(sourceID); ProcessCopy(context, sourceID, command, sourceReader); } public static void ProcessCopy(IDefragmentServices services, int sourceID, ISlotCopyHandler command, ByteArrayBuffer sourceReader) { int targetID = services.StrictMappedID(sourceID); Slot targetSlot = services.AllocateTargetSlot(sourceReader.Length()); services.Mapping().MapId(targetID, targetSlot); Db4objects.Db4o.Internal.DefragmentContextImpl context = new Db4objects.Db4o.Internal.DefragmentContextImpl (sourceReader, services); command.ProcessCopy(context); services.TargetWriteBytes(context, targetSlot.Address()); } public void WriteByte(byte value) { _source.IncrementOffset(1); _target.WriteByte(value); } public long ReadLong() { long value = _source.ReadLong(); _target.IncrementOffset(Const4.LongLength); return value; } public void WriteLong(long value) { _source.IncrementOffset(Const4.LongLength); _target.WriteLong(value); } public BitMap4 ReadBitMap(int bitCount) { BitMap4 value = _source.ReadBitMap(bitCount); _target.IncrementOffset(value.MarshalledLength()); return value; } public void ReadEnd() { _source.ReadEnd(); _target.ReadEnd(); } public int WriteMappedID(int originalID) { int mapped = _services.MappedID(originalID); _target.WriteInt(mapped); return mapped; } public int Length() { return _source.Length(); } public Db4objects.Db4o.Internal.Transaction Transaction() { return Services().SystemTrans(); } public ObjectContainerBase Container() { return Transaction().Container(); } public ITypeHandler4 TypeHandlerForId(int id) { return Container().TypeHandlerForClassMetadataID(id); } public int HandlerVersion() { return _objectHeader.HandlerVersion(); } public bool IsLegacyHandlerVersion() { return HandlerVersion() == 0; } public int MappedID(int origID) { return Mapping().StrictMappedID(origID); } public IObjectContainer ObjectContainer() { return Container(); } /// only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. /// /// /// only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. /// Doesn't need to work with modern IdSystems. /// public Slot AllocateTargetSlot(int length) { return _services.AllocateTargetSlot(length); } /// only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. /// /// /// only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. /// Doesn't need to work with modern IdSystems. /// public Slot AllocateMappedTargetSlot(int sourceAddress, int length) { Slot slot = AllocateTargetSlot(length); _services.MapIDs(sourceAddress, slot.Address(), false); return slot; } /// public int CopySlotToNewMapped(int sourceAddress, int length) { Slot slot = AllocateMappedTargetSlot(sourceAddress, length); ByteArrayBuffer sourceBuffer = SourceBufferByAddress(sourceAddress, length); TargetWriteBytes(slot.Address(), sourceBuffer); return slot.Address(); } public void TargetWriteBytes(int address, ByteArrayBuffer buffer) { _services.TargetWriteBytes(buffer, address); } /// public ByteArrayBuffer SourceBufferByAddress(int sourceAddress, int length) { ByteArrayBuffer sourceBuffer = _services.SourceBufferByAddress(sourceAddress, length ); return sourceBuffer; } /// public ByteArrayBuffer SourceBufferById(int sourceId) { ByteArrayBuffer sourceBuffer = _services.SourceBufferByID(sourceId); return sourceBuffer; } public void WriteToTarget(int address) { _services.TargetWriteBytes(this, address); } public void WriteBytes(byte[] bytes) { _target.WriteBytes(bytes); _source.IncrementOffset(bytes.Length); } public IReadBuffer Buffer() { return _source; } public void Defragment(ITypeHandler4 handler) { ITypeHandler4 typeHandler = HandlerRegistry.CorrectHandlerVersion(this, handler); if (Handlers4.UseDedicatedSlot(this, typeHandler)) { if (Handlers4.HasClassIndex(typeHandler)) { CopyID(); } else { CopyUnindexedID(); } return; } typeHandler.Defragment(this); } public void BeginSlot() { } // do nothing public Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _objectHeader.ClassMetadata(); } public bool IsNull(int fieldIndex) { return _objectHeader._headerAttributes.IsNull(fieldIndex); } public int DeclaredAspectCount() { return _declaredAspectCount; } public void DeclaredAspectCount(int count) { _declaredAspectCount = count; } public Db4objects.Db4o.Internal.Marshall.SlotFormat SlotFormat() { return Db4objects.Db4o.Internal.Marshall.SlotFormat.ForHandlerVersion(HandlerVersion ()); } public void CurrentParentSourceID(int id) { _currentParentSourceID = id; } public int ConsumeCurrentParentSourceID() { int id = _currentParentSourceID; _currentParentSourceID = 0; return id; } public void CopyAddress() { int sourceEntryAddress = _source.ReadInt(); int sourceId = ConsumeCurrentParentSourceID(); int sourceObjectAddress = _services.SourceAddressByID(sourceId); int entryOffset = sourceEntryAddress - sourceObjectAddress; int targetObjectAddress = _services.TargetAddressByID(_services.StrictMappedID(sourceId )); _target.WriteInt(targetObjectAddress + entryOffset); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TransactionObjectCarrier.cs0000644000175000017500000000202611700531646032056 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal { /// TODO: Check if all time-consuming stuff is overridden! internal class TransactionObjectCarrier : LocalTransaction { private readonly ITransactionalIdSystem _idSystem; internal TransactionObjectCarrier(ObjectContainerBase container, Transaction parentTransaction , ITransactionalIdSystem idSystem, IReferenceSystem referenceSystem) : base(container , parentTransaction, idSystem, referenceSystem) { _idSystem = idSystem; } public override void Commit() { } // do nothing internal override bool SupportsVirtualFields() { return false; } public override long VersionForId(int id) { return 0; } public override Db4objects.Db4o.Internal.CommitTimestampSupport CommitTimestampSupport () { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/VirtualAttributes.cs0000644000175000017500000000136511700531646030634 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class VirtualAttributes : IShallowClone { public Db4oDatabase i_database; public long i_version; public long i_uuid; // FIXME: should be named "uuidLongPart" or even better "creationTime" public virtual object ShallowClone() { VirtualAttributes va = new VirtualAttributes(); va.i_database = i_database; va.i_version = i_version; va.i_uuid = i_uuid; return va; } internal virtual bool SuppliesUUID() { return i_database != null && i_uuid != 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectContainerFactory.cs0000644000175000017500000000170711700531646031540 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; namespace Db4objects.Db4o.Internal { public class ObjectContainerFactory { /// public static IEmbeddedObjectContainer OpenObjectContainer(IEmbeddedConfiguration config, string databaseFileName) { IConfiguration legacyConfig = Db4oLegacyConfigurationBridge.AsLegacy(config); Config4Impl.AssertIsNotTainted(legacyConfig); EmitDebugInfo(); IEmbeddedObjectContainer oc = new IoAdaptedObjectContainer(legacyConfig, databaseFileName ); ((EmbeddedConfigurationImpl)config).ApplyConfigurationItems(oc); Db4objects.Db4o.Internal.Messages.LogMsg(legacyConfig, 5, databaseFileName); return oc; } private static void EmitDebugInfo() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/DisabledBlockConverter.cs0000644000175000017500000000124411700531646031505 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// public class DisabledBlockConverter : IBlockConverter { public virtual int BlockAlignedBytes(int bytes) { return bytes; } public virtual int BlocksToBytes(int blocks) { return blocks; } public virtual int BytesToBlocks(long bytes) { return (int)bytes; } public virtual Slot ToBlockedLength(Slot slot) { return slot; } public virtual Slot ToNonBlockedLength(Slot slot) { return slot; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/FieldIndexException.cs0000644000175000017500000000262311700531646031027 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { [System.Serializable] public class FieldIndexException : Exception { private string _className; private string _fieldName; public FieldIndexException(FieldMetadata field) : this(null, null, field) { } public FieldIndexException(string msg, FieldMetadata field) : this(msg, null, field ) { } public FieldIndexException(Exception cause, FieldMetadata field) : this(null, cause , field) { } public FieldIndexException(string msg, Exception cause, FieldMetadata field) : this (msg, cause, field.ContainingClass().GetName(), field.GetName()) { } public FieldIndexException(string msg, Exception cause, string className, string fieldName) : base(EnhancedMessage(msg, className, fieldName), cause) { _className = className; _fieldName = fieldName; } public virtual string ClassName() { return _className; } public virtual string FieldName() { return _fieldName; } private static string EnhancedMessage(string msg, string className, string fieldName ) { string enhancedMessage = "Field index for " + className + "#" + fieldName; if (msg != null) { enhancedMessage += ": " + msg; } return enhancedMessage; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IoAdaptedObjectContainer.cs0000644000175000017500000002350311700531646031761 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { /// public class IoAdaptedObjectContainer : LocalObjectContainer, IEmbeddedObjectContainer { private readonly string _fileName; private BlockAwareBin _file; private volatile BlockAwareBin _backupFile; private object _fileLock; private readonly IFreespaceFiller _freespaceFiller; /// internal IoAdaptedObjectContainer(IConfiguration config, string fileName) : base( config) { _fileLock = new object(); _fileName = fileName; _freespaceFiller = CreateFreespaceFiller(); Open(); } /// /// protected sealed override void OpenImpl() { Config4Impl configImpl = ConfigImpl; IStorage storage = configImpl.Storage; bool isNew = !storage.Exists(FileName()); if (isNew) { LogMsg(14, FileName()); CheckReadOnly(); _handlers.OldEncryptionOff(); } bool readOnly = configImpl.IsReadOnly(); bool lockFile = Debug4.lockFile && configImpl.LockFile() && (!readOnly); if (NeedsLockFileThread()) { IBin fileBin = storage.Open(new BinConfiguration(FileName(), false, 0, false, configImpl .BlockSize())); IBin synchronizedBin = new SynchronizedBin(fileBin); _file = new BlockAwareBin(synchronizedBin); } else { IBin bin = storage.Open(new BinConfiguration(FileName(), lockFile, 0, readOnly, configImpl .BlockSize())); if (configImpl.AsynchronousSync()) { bin = new ThreadedSyncBin(bin); } _file = new BlockAwareBin(bin); } if (isNew) { ConfigureNewFile(); if (configImpl.ReservedStorageSpace() > 0) { Reserve(configImpl.ReservedStorageSpace()); } CommitTransaction(); WriteHeader(true, false); } else { ReadThis(); } } /// /// public override void Backup(IStorage targetStorage, string path) { WithEnvironment(new _IRunnable_76(this, targetStorage, path)); } private sealed class _IRunnable_76 : IRunnable { public _IRunnable_76(IoAdaptedObjectContainer _enclosing, IStorage targetStorage, string path) { this._enclosing = _enclosing; this.targetStorage = targetStorage; this.path = path; } public void Run() { lock (this._enclosing._lock) { this._enclosing.CheckClosed(); if (this._enclosing._backupFile != null) { throw new BackupInProgressException(); } this._enclosing._backupFile = new BlockAwareBin(targetStorage.Open(new BinConfiguration (path, true, this._enclosing._file.Length(), false, this._enclosing._blockConverter .BlocksToBytes(1)))); } long pos = 0; byte[] buffer = new byte[8192]; while (true) { lock (this._enclosing._lock) { int read = this._enclosing._file.Read(pos, buffer); if (read <= 0) { break; } this._enclosing._backupFile.Write(pos, buffer, read); pos += read; } // Let the database engine continue to do // some work if it likes to. Runtime4.Sleep(1); } lock (this._enclosing._lock) { try { Db4objects.Db4o.Internal.IoAdaptedObjectContainer.SyncAndClose(this._enclosing._backupFile ); } finally { this._enclosing._backupFile = null; } } } private readonly IoAdaptedObjectContainer _enclosing; private readonly IStorage targetStorage; private readonly string path; } public override void BlockSize(int size) { CreateBlockConverter(size); _file.BlockSize(size); } public override byte BlockSize() { return (byte)_file.BlockSize(); } protected override void ShutdownDataStorage() { lock (_fileLock) { try { CloseFileHeader(); } finally { CloseDatabaseFile(); } } } private void CloseDatabaseFile() { try { SyncAndClose(_file); } finally { _file = null; } } private static void SyncAndClose(IBin bin) { if (bin != null) { try { bin.Sync(); } finally { bin.Close(); } } } private void CloseFileHeader() { try { if (_fileHeader != null) { _fileHeader.Close(); } } finally { _fileHeader = null; } } public override void CloseTransaction(Transaction transaction, bool isSystemTransaction , bool rollbackOnClose) { transaction.Close(rollbackOnClose); } public override void Commit1(Transaction trans) { EnsureLastSlotWritten(); base.Commit1(trans); } private void CheckXBytes(int newAddress, int newAddressOffset, int length) { if (Debug4.xbytes && Deploy.overwrite) { try { byte[] checkXBytes = new byte[length]; _file.BlockRead(newAddress, newAddressOffset, checkXBytes); for (int i = 0; i < checkXBytes.Length; i++) { if (checkXBytes[i] != Const4.Xbyte) { string msg = "XByte corruption adress:" + newAddress + " length:" + length + " starting:" + i; throw new Db4oException(msg); } } } catch (Exception e) { Sharpen.Runtime.PrintStackTrace(e); } } } public override long FileLength() { return _file.Length(); } public override string FileName() { return _fileName; } /// public override void ReadBytes(byte[] bytes, int address, int length) { ReadBytes(bytes, address, 0, length); } /// public override void ReadBytes(byte[] bytes, int address, int addressOffset, int length) { if (DTrace.enabled) { DTrace.ReadBytes.LogLength(address + addressOffset, length); } int bytesRead = _file.BlockRead(address, addressOffset, bytes, length); CheckReadCount(bytesRead, length); } private void CheckReadCount(int bytesRead, int expected) { if (bytesRead != expected) { throw new IncompatibleFileFormatException(); } } /// public override void Reserve(int byteCount) { CheckReadOnly(); lock (_lock) { Slot slot = AllocateSlot(byteCount); ZeroReservedSlot(slot); Free(slot); } } private void ZeroReservedSlot(Slot slot) { ZeroFile(_file, slot); ZeroFile(_backupFile, slot); } private void ZeroFile(BlockAwareBin io, Slot slot) { if (io == null) { return; } byte[] zeroBytes = new byte[1024]; int left = slot.Length(); int offset = 0; while (left > zeroBytes.Length) { io.BlockWrite(slot.Address(), offset, zeroBytes, zeroBytes.Length); offset += zeroBytes.Length; left -= zeroBytes.Length; } if (left > 0) { io.BlockWrite(slot.Address(), offset, zeroBytes, left); } } public override void SyncFiles() { _file.Sync(); } public override void SyncFiles(IRunnable runnable) { _file.Sync(runnable); } public override void WriteBytes(ByteArrayBuffer buffer, int blockedAddress, int addressOffset ) { if (Deploy.debug && !Deploy.flush) { return; } if (Debug4.xbytes && Deploy.overwrite) { if (buffer.CheckXBytes()) { CheckXBytes(blockedAddress, addressOffset, buffer.Length()); } else { buffer.CheckXBytes(true); } } if (DTrace.enabled) { DTrace.WriteBytes.LogLength(blockedAddress + addressOffset, buffer.Length()); } _file.BlockWrite(blockedAddress, addressOffset, buffer._buffer, buffer.Length()); if (_backupFile != null) { _backupFile.BlockWrite(blockedAddress, addressOffset, buffer._buffer, buffer.Length ()); } } public override void OverwriteDeletedBytes(int address, int length) { if (_freespaceFiller == null) { return; } if (address > 0 && length > 0) { if (DTrace.enabled) { DTrace.WriteXbytes.LogLength(address, length); } BlockAwareBinWindow window = new BlockAwareBinWindow(_file, address, length); try { CreateFreespaceFiller().Fill(window); } catch (IOException e) { Sharpen.Runtime.PrintStackTrace(e); } finally { window.Disable(); } } } public virtual BlockAwareBin TimerFile() { return _file; } private IFreespaceFiller CreateFreespaceFiller() { return Config().FreespaceFiller(); } private class XByteFreespaceFiller : IFreespaceFiller { /// public virtual void Fill(BlockAwareBinWindow io) { io.Write(0, XBytes(io.Length())); } private byte[] XBytes(int len) { byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { bytes[i] = Const4.Xbyte; } return bytes; } } protected override void FatalStorageShutdown() { if (_file != null) { _file.Close(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config4Abstract.cs0000644000175000017500000000536411700531646030117 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public abstract class Config4Abstract { protected KeySpecHashtable4 _config; private static readonly KeySpec CascadeOnActivateKey = new KeySpec(TernaryBool.Unspecified ); private static readonly KeySpec CascadeOnDeleteKey = new KeySpec(TernaryBool.Unspecified ); private static readonly KeySpec CascadeOnUpdateKey = new KeySpec(TernaryBool.Unspecified ); private static readonly KeySpec NameKey = new KeySpec(null); public Config4Abstract() : this(new KeySpecHashtable4(10)) { } protected Config4Abstract(KeySpecHashtable4 config) { _config = (KeySpecHashtable4)config.DeepClone(this); } public virtual void CascadeOnActivate(bool flag) { PutThreeValued(CascadeOnActivateKey, flag); } public virtual void CascadeOnDelete(bool flag) { PutThreeValued(CascadeOnDeleteKey, flag); } public virtual void CascadeOnUpdate(bool flag) { PutThreeValued(CascadeOnUpdateKey, flag); } protected virtual void PutThreeValued(KeySpec spec, bool flag) { _config.Put(spec, TernaryBool.ForBoolean(flag)); } protected virtual void PutThreeValuedInt(KeySpec spec, bool flag) { _config.Put(spec, flag ? 1 : -1); } public virtual TernaryBool CascadeOnActivate() { return Cascade(CascadeOnActivateKey); } public virtual TernaryBool CascadeOnDelete() { return Cascade(CascadeOnDeleteKey); } public virtual TernaryBool CascadeOnUpdate() { return Cascade(CascadeOnUpdateKey); } private TernaryBool Cascade(KeySpec spec) { return _config.GetAsTernaryBool(spec); } internal abstract string ClassName(); /// Will raise an exception if argument class doesn't match this class - violates equals() contract in favor of failing fast. /// /// Will raise an exception if argument class doesn't match this class - violates equals() contract in favor of failing fast. /// public override bool Equals(object obj) { if (this == obj) { return true; } if (null == obj) { return false; } if (GetType() != obj.GetType()) { Exceptions4.ShouldNeverHappen(); } return GetName().Equals(((Db4objects.Db4o.Internal.Config4Abstract)obj).GetName() ); } public override int GetHashCode() { return GetName().GetHashCode(); } public virtual string GetName() { return _config.GetAsString(NameKey); } protected virtual void SetName(string name) { _config.Put(NameKey, name); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/MarshallingBuffer.cs0000644000175000017500000002273211700531646030533 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Sharpen; namespace Db4objects.Db4o.Internal { /// public class MarshallingBuffer : IWriteBuffer { private const int SizeNeeded = Const4.LongLength; private const int NoParent = -int.MaxValue; private ByteArrayBuffer _delegate; private int _lastOffSet; private int _addressInParent = NoParent; private List4 _children; private FieldMetadata _indexedField; public virtual int Length() { return Offset(); } public virtual int Offset() { if (_delegate == null) { return 0; } return _delegate.Offset(); } public virtual void WriteByte(byte b) { PrepareWrite(); _delegate.WriteByte(b); } public virtual void WriteBytes(byte[] bytes) { PrepareWrite(bytes.Length); _delegate.WriteBytes(bytes); } public virtual void WriteInt(int i) { PrepareWrite(); _delegate.WriteInt(i); } public virtual void WriteLong(long l) { PrepareWrite(); _delegate.WriteLong(l); } private void PrepareWrite() { PrepareWrite(SizeNeeded); } public virtual void PrepareWrite(int sizeNeeded) { if (_delegate == null) { _delegate = new ByteArrayBuffer(sizeNeeded); } _lastOffSet = _delegate.Offset(); if (RemainingSize() < sizeNeeded) { Resize(sizeNeeded); } } private int RemainingSize() { return _delegate.Length() - _delegate.Offset(); } private void Resize(int sizeNeeded) { int newSize = _delegate.Length() * 2; if (newSize - _lastOffSet < sizeNeeded) { newSize += sizeNeeded; } ByteArrayBuffer temp = new ByteArrayBuffer(newSize); temp.Seek(_lastOffSet); _delegate.CopyTo(temp, 0, 0, _delegate.Length()); _delegate = temp; } public virtual void TransferLastWriteTo(MarshallingBuffer other, bool storeLengthInLink ) { other.AddressInParent(_lastOffSet, storeLengthInLink); int length = _delegate.Offset() - _lastOffSet; other.PrepareWrite(length); int otherOffset = other._delegate.Offset(); System.Array.Copy(_delegate._buffer, _lastOffSet, other._delegate._buffer, otherOffset , length); _delegate.Seek(_lastOffSet); other._delegate.Seek(otherOffset + length); other._lastOffSet = otherOffset; } private void AddressInParent(int offset, bool storeLengthInLink) { _addressInParent = storeLengthInLink ? offset : -offset; } public virtual void TransferContentTo(ByteArrayBuffer buffer) { TransferContentTo(buffer, Length()); } public virtual void TransferContentTo(ByteArrayBuffer buffer, int length) { if (_delegate == null) { return; } System.Array.Copy(_delegate._buffer, 0, buffer._buffer, buffer._offset, length); buffer._offset += length; } public virtual ByteArrayBuffer TestDelegate() { return _delegate; } public virtual MarshallingBuffer AddChild() { return AddChild(true, false); } public virtual MarshallingBuffer AddChild(bool reserveLinkSpace, bool storeLengthInLink ) { MarshallingBuffer child = new MarshallingBuffer(); child.AddressInParent(Offset(), storeLengthInLink); _children = new List4(_children, child); if (reserveLinkSpace) { ReserveChildLinkSpace(storeLengthInLink); } return child; } public virtual void ReserveChildLinkSpace(bool storeLengthInLink) { int length = storeLengthInLink ? Const4.IntLength * 2 : Const4.IntLength; PrepareWrite(length); _delegate.IncrementOffset(length); } public virtual void MergeChildren(MarshallingContext context, int masterAddress, int linkOffset) { MergeChildren(context, masterAddress, this, this, linkOffset); } private static void MergeChildren(MarshallingContext context, int masterAddress, MarshallingBuffer writeBuffer, MarshallingBuffer parentBuffer, int linkOffset) { if (parentBuffer._children == null) { return; } IEnumerator i = new Iterator4Impl(parentBuffer._children); while (i.MoveNext()) { Merge(context, masterAddress, writeBuffer, parentBuffer, (MarshallingBuffer)i.Current , linkOffset); } } private static void Merge(MarshallingContext context, int masterAddress, MarshallingBuffer writeBuffer, MarshallingBuffer parentBuffer, MarshallingBuffer childBuffer, int linkOffset) { int childPosition = writeBuffer.Offset(); writeBuffer.Reserve(childBuffer.BlockedLength()); MergeChildren(context, masterAddress, writeBuffer, childBuffer, linkOffset); int savedWriteBufferOffset = writeBuffer.Offset(); writeBuffer.Seek(childPosition); childBuffer.TransferContentTo(writeBuffer._delegate); writeBuffer.Seek(savedWriteBufferOffset); parentBuffer.WriteLink(childBuffer, childPosition + linkOffset, childBuffer.UnblockedLength ()); childBuffer.WriteIndex(context, masterAddress, childPosition + linkOffset); } public virtual void Seek(int offset) { _delegate.Seek(offset); } public virtual IReservedBuffer Reserve(int length) { PrepareWrite(length); IReservedBuffer reservedBuffer = new _IReservedBuffer_178(this); _delegate.Seek(_delegate.Offset() + length); return reservedBuffer; } private sealed class _IReservedBuffer_178 : IReservedBuffer { public _IReservedBuffer_178(MarshallingBuffer _enclosing) { this._enclosing = _enclosing; this.reservedOffset = this._enclosing._delegate.Offset(); } private readonly int reservedOffset; public void WriteBytes(byte[] bytes) { int currentOffset = this._enclosing._delegate.Offset(); this._enclosing._delegate.Seek(this.reservedOffset); this._enclosing._delegate.WriteBytes(bytes); this._enclosing._delegate.Seek(currentOffset); } private readonly MarshallingBuffer _enclosing; } private void WriteLink(MarshallingBuffer child, int position, int length) { int offset = Offset(); _delegate.Seek(child.AddressInParent()); _delegate.WriteInt(position); if (child.StoreLengthInLink()) { _delegate.WriteInt(length); } _delegate.Seek(offset); } private void WriteIndex(MarshallingContext context, int masterAddress, int position ) { if (_indexedField != null) { // for now this is a String index only, it takes the entire slot. StatefulBuffer buffer = new StatefulBuffer(context.Transaction(), UnblockedLength ()); int blockedPosition = context.Container().BlockConverter().BytesToBlocks(position ); int indexID = masterAddress + blockedPosition; buffer.SetID(indexID); buffer.Address(indexID); TransferContentTo(buffer, UnblockedLength()); _indexedField.AddIndexEntry(context.Transaction(), context.ObjectID(), buffer); } } private int AddressInParent() { if (!HasParent()) { throw new InvalidOperationException(); } if (_addressInParent < 0) { return -_addressInParent; } return _addressInParent; } public virtual void DebugDecrementLastOffset(int count) { _lastOffSet -= count; } public virtual bool HasParent() { return _addressInParent != NoParent; } private bool StoreLengthInLink() { return _addressInParent > 0; } public virtual void RequestIndexEntry(FieldMetadata fieldMetadata) { _indexedField = fieldMetadata; } public virtual MarshallingBuffer CheckBlockAlignment(MarshallingContext context, MarshallingBuffer precedingBuffer, IntByRef precedingLength) { _lastOffSet = Offset(); if (DoBlockAlign()) { precedingBuffer.BlockAlign(context, precedingLength.value); } if (precedingBuffer != null) { precedingLength.value += precedingBuffer.Length(); } precedingBuffer = this; if (_children != null) { IEnumerator i = new Iterator4Impl(_children); while (i.MoveNext()) { precedingBuffer = ((MarshallingBuffer)i.Current).CheckBlockAlignment(context, precedingBuffer , precedingLength); } } return precedingBuffer; } private void BlockAlign(MarshallingContext context, int precedingLength) { int totalLength = context.Container().BlockConverter().BlockAlignedBytes(precedingLength + Length()); int newLength = totalLength - precedingLength; BlockAlign(newLength); } public virtual int MarshalledLength() { int length = Length(); if (_children != null) { IEnumerator i = new Iterator4Impl(_children); while (i.MoveNext()) { length += ((MarshallingBuffer)i.Current).MarshalledLength(); } } return length; } private void BlockAlign(int length) { if (_delegate == null) { return; } if (length > _delegate.Length()) { int sizeNeeded = length - _delegate.Offset(); PrepareWrite(sizeNeeded); } _delegate.Seek(length); } private bool DoBlockAlign() { return HasParent(); } // For now we block align every linked entry. Indexes could be created late. private int BlockedLength() { return Length(); } private int UnblockedLength() { // This is only valid after checkBlockAlignMent has been called. return _lastOffSet; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/0000755000175000017500000000000011700531646026167 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/IFieldAccessor.cs0000644000175000017500000000052311700531646031335 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Reflect { /// 7.7 public interface IFieldAccessor { void Set(IReflectField field, object onObject, object value); object Get(IReflectField field, object onObject); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/LenientFieldAccessor.cs0000644000175000017500000000124311700531646032543 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal.Reflect; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Reflect { /// 7.7 public class LenientFieldAccessor : IFieldAccessor { public virtual object Get(IReflectField field, object onObject) { try { return field.Get(onObject); } catch (Db4oException) { return null; } } public virtual void Set(IReflectField field, object onObject, object value) { try { field.Set(onObject, value); } catch (Db4oException) { } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/StrictFieldAccessor.cs0000644000175000017500000000077611700531646032427 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Reflect; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Reflect { /// 7.7 public class StrictFieldAccessor : IFieldAccessor { public virtual object Get(IReflectField field, object onObject) { return field.Get(onObject); } public virtual void Set(IReflectField field, object onObject, object value) { field.Set(onObject, value); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/ReflectClasses.cs0000644000175000017500000000052711700531646031424 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Reflect { public class ReflectClasses { public static bool AreEqual(Type expected, IReflectClass actual) { return actual.Reflector().ForClass(expected) == actual; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/Generic/0000755000175000017500000000000011700531646027543 5ustar00meebeymeebey00000000000000KnownClassesCollector.cs0000644000175000017500000000512211700531646034274 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflect/Generic/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Internal.Reflect.Generic { public class KnownClassesCollector { private readonly ObjectContainerBase _container; private readonly KnownClassesRepository _repository; public KnownClassesCollector(ObjectContainerBase container, KnownClassesRepository repository) { _container = container; _repository = repository; } public virtual IReflectClass[] Collect() { Collection4 classes = new Collection4(); CollectKnownClasses(classes); return (IReflectClass[])classes.ToArray(new IReflectClass[classes.Size()]); } private void CollectKnownClasses(Collection4 classes) { IListener4 collectingListener = NewCollectingClassListener(classes); _repository.AddListener(collectingListener); try { CollectKnownClasses(classes, Iterators.Copy(_repository.Classes())); } finally { _repository.RemoveListener(collectingListener); } } private IListener4 NewCollectingClassListener(Collection4 classes) { return new _IListener4_37(this, classes); } private sealed class _IListener4_37 : IListener4 { public _IListener4_37(KnownClassesCollector _enclosing, Collection4 classes) { this._enclosing = _enclosing; this.classes = classes; } public void OnEvent(object addedClass) { this._enclosing.CollectKnownClass(classes, ((IReflectClass)addedClass)); } private readonly KnownClassesCollector _enclosing; private readonly Collection4 classes; } private void CollectKnownClasses(Collection4 collector, IEnumerator knownClasses) { while (knownClasses.MoveNext()) { IReflectClass clazz = (IReflectClass)knownClasses.Current; CollectKnownClass(collector, clazz); } } private void CollectKnownClass(Collection4 classes, IReflectClass clazz) { if (IsInternalClass(clazz)) { return; } if (!HasIdentity(clazz)) { return; } if (clazz.IsArray()) { return; } classes.Add(clazz); } private bool IsInternalClass(IReflectClass clazz) { return _container._handlers.IclassInternal.IsAssignableFrom(clazz); } private bool HasIdentity(IReflectClass clazz) { ClassMetadata clazzMeta = _container.ClassMetadataForReflectClass(clazz); return clazzMeta == null || clazzMeta.HasIdentity(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/0000755000175000017500000000000011700531646025710 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/IDb4oQueryExecutionListener.cs0000644000175000017500000000041211700531646033555 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query; namespace Db4objects.Db4o.Internal.Query { public interface IDb4oQueryExecutionListener { void NotifyQueryExecuted(NQOptimizationInfo info); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/0000755000175000017500000000000011700531646027667 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEEndsWith.cs0000644000175000017500000000124211700531646032170 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEEndsWith : QEStringCmp { /// for C/S messaging only public QEEndsWith() { } public QEEndsWith(bool caseSensitive_) : base(caseSensitive_) { } protected override bool CompareStrings(string candidate, string constraint) { int lastIndex = candidate.LastIndexOf(constraint); if (lastIndex == -1) { return false; } return lastIndex == candidate.Length - constraint.Length; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConUnconditional.cs0000644000175000017500000000132011700531646033601 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QConUnconditional : QCon { private bool _value; public QConUnconditional() { } public QConUnconditional(Transaction trans, bool value) : base(trans) { // cannot be final for C/S unmarshalling // C/S only _value = value; } internal override void EvaluateSimpleExec(QCandidates a_candidates) { a_candidates.Filter(this); } internal override bool Evaluate(QCandidate a_candidate) { return _value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEMulti.cs0000644000175000017500000000321311700531646031535 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEMulti : QE { private Collection4 i_evaluators = new Collection4(); // used by .net LINQ tests public virtual IEnumerable Evaluators() { return i_evaluators; } internal override QE Add(QE evaluator) { i_evaluators.Ensure(evaluator); return this; } public override bool Identity() { bool ret = false; IEnumerator i = i_evaluators.GetEnumerator(); while (i.MoveNext()) { if (((QE)i.Current).Identity()) { ret = true; } else { return false; } } return ret; } internal override bool IsDefault() { return false; } internal override bool Evaluate(QConObject a_constraint, QCandidate a_candidate, object a_value) { IEnumerator i = i_evaluators.GetEnumerator(); while (i.MoveNext()) { if (((QE)i.Current).Evaluate(a_constraint, a_candidate, a_value)) { return true; } } return false; } public override void IndexBitMap(bool[] bits) { IEnumerator i = i_evaluators.GetEnumerator(); while (i.MoveNext()) { ((QE)i.Current).IndexBitMap(bits); } } public override bool SupportsIndex() { IEnumerator i = i_evaluators.GetEnumerator(); while (i.MoveNext()) { if (!((QE)i.Current).SupportsIndex()) { return false; } } return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QQuery.cs0000644000175000017500000000131211700531646031441 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query.Processor { /// QQuery is the users hook on our graph. /// /// QQuery is the users hook on our graph. /// A QQuery is defined by it's constraints. /// /// public class QQuery : QQueryBase, IQuery { public QQuery() { } public QQuery(Transaction a_trans, Db4objects.Db4o.Internal.Query.Processor.QQuery a_parent, string a_field) : base(a_trans, a_parent, a_field) { } // C/S only } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QCandidate.cs0000644000175000017500000005314211700531646032220 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Query.Processor { /// Represents an actual object in the database. /// /// Represents an actual object in the database. Forms a tree structure, indexed /// by id. Can have dependents that are doNotInclude'd in the query result when /// this is doNotInclude'd. /// /// public class QCandidate : TreeInt, ICandidate { internal ByteArrayBuffer _bytes; internal readonly QCandidates _candidates; private List4 _dependants; internal bool _include = true; private object _member; private Tree _pendingJoins; private Db4objects.Db4o.Internal.Query.Processor.QCandidate _root; private Db4objects.Db4o.Internal.ClassMetadata _classMetadata; private FieldMetadata _fieldMetadata; private int _handlerVersion; private QCandidate(QCandidates qcandidates) : base(0) { // db4o ID is stored in _key; // db4o byte stream storing the object // Dependent candidates // whether to include in the result set // may use id for optimisation ??? // Possible pending joins on children // The evaluation root to compare all ORs // the ClassMetadata of this object // temporary field and member for one field during evaluation // null denotes null object _candidates = qcandidates; } public QCandidate(QCandidates candidates, object member, int id) : base(id) { if (DTrace.enabled) { DTrace.CreateCandidate.Log(id); } _candidates = candidates; _member = member; _include = true; if (id == 0) { _key = candidates.GenerateCandidateId(); } } public override object ShallowClone() { Db4objects.Db4o.Internal.Query.Processor.QCandidate qcan = new Db4objects.Db4o.Internal.Query.Processor.QCandidate (_candidates); qcan.SetBytes(_bytes); qcan._dependants = _dependants; qcan._include = _include; qcan._member = _member; qcan._pendingJoins = _pendingJoins; qcan._root = _root; qcan._classMetadata = _classMetadata; qcan._fieldMetadata = _fieldMetadata; return base.ShallowCloneInternal(qcan); } internal virtual void AddDependant(Db4objects.Db4o.Internal.Query.Processor.QCandidate a_candidate) { _dependants = new List4(_dependants, a_candidate); } private void CheckInstanceOfCompare() { if (_member is ICompare) { _member = ((ICompare)_member).Compare(); LocalObjectContainer stream = Container(); _classMetadata = stream.ClassMetadataForReflectClass(stream.Reflector().ForObject (_member)); _key = stream.GetID(Transaction(), _member); if (_key == 0) { SetBytes(null); } else { SetBytes(stream.ReadBufferById(Transaction(), _key)); } } } internal virtual bool CreateChild(QCandidates a_candidates) { if (!_include) { return false; } if (_fieldMetadata != null) { ITypeHandler4 handler = _fieldMetadata.GetHandler(); if (handler != null) { QueryingReadContext queryingReadContext = new QueryingReadContext(Transaction(), MarshallerFamily().HandlerVersion(), _bytes, _key); ITypeHandler4 arrayElementHandler = Handlers4.ArrayElementHandler(handler, queryingReadContext ); if (arrayElementHandler != null) { int offset = queryingReadContext.Offset(); bool outerRes = true; // The following construct is worse than not ideal. // For each constraint it completely reads the // underlying structure again. The structure could b // kept fairly easy. TODO: Optimize! IEnumerator i = a_candidates.IterateConstraints(); while (i.MoveNext()) { QCon qcon = (QCon)i.Current; QField qf = qcon.GetField(); if (qf == null || qf.Name().Equals(_fieldMetadata.GetName())) { QCon tempParent = qcon.Parent(); qcon.SetParent(null); QCandidates candidates = new QCandidates(a_candidates.i_trans, null, qf); candidates.AddConstraint(qcon); qcon.SetCandidates(candidates); ReadArrayCandidates(handler, queryingReadContext.Buffer(), arrayElementHandler, candidates ); queryingReadContext.Seek(offset); bool isNot = qcon.IsNot(); if (isNot) { qcon.RemoveNot(); } candidates.Evaluate(); ByRef pending = ByRef.NewInstance(); bool[] innerRes = new bool[] { isNot }; candidates.Traverse(new _IVisitor4_160(innerRes, isNot, pending)); // Collect all pending subresults. // We need to change // the // constraint here, so // our // pending collector // uses // the right // comparator. // We only keep one // pending result // for // all array // elements. // and memorize, // whether we had a // true or a false // result. // or both. if (isNot) { qcon.Not(); } // In case we had pending subresults, we // need to communicate // them up to our root. if (((Tree)pending.value) != null) { ((Tree)pending.value).Traverse(new _IVisitor4_229(this)); } if (!innerRes[0]) { // Again this could be double triggering. // // We want to clean up the "No route" // at some stage. qcon.Visit(GetRoot(), qcon.Evaluator().Not(false)); outerRes = false; } qcon.SetParent(tempParent); } } return outerRes; } // We may get simple types here too, if the YapField was null // in the higher level simple evaluation. Evaluate these // immediately. if (Handlers4.IsQueryLeaf(handler)) { a_candidates.i_currentConstraint.Visit(this); return true; } } } if (_fieldMetadata == null) { return false; } if (_fieldMetadata is NullFieldMetadata) { return false; } _classMetadata.SeekToField(Transaction(), _bytes, _fieldMetadata); Db4objects.Db4o.Internal.Query.Processor.QCandidate candidate = ReadSubCandidate( a_candidates); if (candidate == null) { return false; } // fast early check for ClassMetadata if (a_candidates.i_classMetadata != null && a_candidates.i_classMetadata.IsStronglyTyped ()) { ITypeHandler4 handler = _fieldMetadata.GetHandler(); if (Handlers4.IsUntyped(handler)) { handler = TypeHandlerFor(candidate); } if (handler == null) { return false; } } AddDependant(a_candidates.Add(candidate)); return true; } private sealed class _IVisitor4_160 : IVisitor4 { public _IVisitor4_160(bool[] innerRes, bool isNot, ByRef pending) { this.innerRes = innerRes; this.isNot = isNot; this.pending = pending; } public void Visit(object obj) { Db4objects.Db4o.Internal.Query.Processor.QCandidate cand = (Db4objects.Db4o.Internal.Query.Processor.QCandidate )obj; if (cand.Include()) { innerRes[0] = !isNot; } if (cand._pendingJoins != null) { cand._pendingJoins.Traverse(new _IVisitor4_173(pending)); } } private sealed class _IVisitor4_173 : IVisitor4 { public _IVisitor4_173(ByRef pending) { this.pending = pending; } public void Visit(object a_object) { QPending newPending = ((QPending)a_object).InternalClonePayload(); newPending.ChangeConstraint(); QPending oldPending = (QPending)Tree.Find(((Tree)pending.value), newPending); if (oldPending != null) { if (oldPending._result != newPending._result) { oldPending._result = QPending.Both; } } else { pending.value = Tree.Add(((Tree)pending.value), newPending); } } private readonly ByRef pending; } private readonly bool[] innerRes; private readonly bool isNot; private readonly ByRef pending; } private sealed class _IVisitor4_229 : IVisitor4 { public _IVisitor4_229(QCandidate _enclosing) { this._enclosing = _enclosing; } public void Visit(object a_object) { this._enclosing.GetRoot().Evaluate((QPending)a_object); } private readonly QCandidate _enclosing; } private ITypeHandler4 TypeHandlerFor(Db4objects.Db4o.Internal.Query.Processor.QCandidate candidate) { Db4objects.Db4o.Internal.ClassMetadata classMetadata = candidate.ReadClassMetadata (); if (classMetadata != null) { return classMetadata.TypeHandler(); } return null; } private void ReadArrayCandidates(ITypeHandler4 typeHandler, IReadBuffer buffer, ITypeHandler4 arrayElementHandler, QCandidates candidates) { if (!Handlers4.IsCascading(arrayElementHandler)) { return; } SlotFormat slotFormat = SlotFormat.ForHandlerVersion(_handlerVersion); slotFormat.DoWithSlotIndirection(buffer, typeHandler, new _IClosure4_318(this, arrayElementHandler , buffer, candidates)); } private sealed class _IClosure4_318 : IClosure4 { public _IClosure4_318(QCandidate _enclosing, ITypeHandler4 arrayElementHandler, IReadBuffer buffer, QCandidates candidates) { this._enclosing = _enclosing; this.arrayElementHandler = arrayElementHandler; this.buffer = buffer; this.candidates = candidates; } public object Run() { QueryingReadContext context = null; if (Handlers4.HandleAsObject(arrayElementHandler)) { // TODO: Code is similar to FieldMetadata.collectIDs. Try to refactor to one place. int collectionID = buffer.ReadInt(); ByteArrayBuffer arrayElementBuffer = this._enclosing.Container().ReadBufferById(this ._enclosing.Transaction(), collectionID); ObjectHeader objectHeader = ObjectHeader.ScrollBufferToContent(this._enclosing.Container (), arrayElementBuffer); context = new QueryingReadContext(this._enclosing.Transaction(), candidates, this ._enclosing._handlerVersion, arrayElementBuffer, collectionID); objectHeader.ClassMetadata().CollectIDs(context); } else { context = new QueryingReadContext(this._enclosing.Transaction(), candidates, this ._enclosing._handlerVersion, buffer, 0); ((ICascadingTypeHandler)arrayElementHandler).CollectIDs(context); } Tree.Traverse(context.Ids(), new _IVisitor4_336(candidates)); IEnumerator i = context.ObjectsWithoutId(); while (i.MoveNext()) { object obj = i.Current; candidates.Add(new Db4objects.Db4o.Internal.Query.Processor.QCandidate(candidates , obj, 0)); } return null; } private sealed class _IVisitor4_336 : IVisitor4 { public _IVisitor4_336(QCandidates candidates) { this.candidates = candidates; } public void Visit(object obj) { TreeInt idNode = (TreeInt)obj; candidates.Add(new Db4objects.Db4o.Internal.Query.Processor.QCandidate(candidates , null, idNode._key)); } private readonly QCandidates candidates; } private readonly QCandidate _enclosing; private readonly ITypeHandler4 arrayElementHandler; private readonly IReadBuffer buffer; private readonly QCandidates candidates; } internal virtual void DoNotInclude() { Include(false); if (_dependants != null) { IEnumerator i = new Iterator4Impl(_dependants); _dependants = null; while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCandidate)i.Current).DoNotInclude(); } } } internal virtual bool Evaluate(QConObject a_constraint, QE a_evaluator) { if (a_evaluator.Identity()) { return a_evaluator.Evaluate(a_constraint, this, null); } if (_member == null) { _member = Value(); } return a_evaluator.Evaluate(a_constraint, this, a_constraint.Translate(_member)); } internal virtual bool Evaluate(QPending a_pending) { QPending oldPending = (QPending)Tree.Find(_pendingJoins, a_pending); if (oldPending == null) { a_pending.ChangeConstraint(); _pendingJoins = Tree.Add(_pendingJoins, a_pending.InternalClonePayload()); return true; } _pendingJoins = _pendingJoins.RemoveNode(oldPending); oldPending._join.EvaluatePending(this, oldPending, a_pending._result); return false; } internal virtual IReflectClass ClassReflector() { ReadClassMetadata(); if (_classMetadata == null) { return null; } return _classMetadata.ClassReflector(); } internal virtual bool FieldIsAvailable() { return ClassReflector() != null; } // / ****** public virtual IObjectContainer ObjectContainer() { return Container(); } public virtual object GetObject() { object obj = Value(true); if (obj is ByteArrayBuffer) { ByteArrayBuffer reader = (ByteArrayBuffer)obj; int offset = reader._offset; obj = ReadString(reader); reader._offset = offset; } return obj; } public virtual string ReadString(ByteArrayBuffer buffer) { return StringHandler.ReadString(Transaction().Context(), buffer); } internal virtual Db4objects.Db4o.Internal.Query.Processor.QCandidate GetRoot() { return _root == null ? this : _root; } internal LocalObjectContainer Container() { return Transaction().LocalContainer(); } internal LocalTransaction Transaction() { return _candidates.i_trans; } public virtual bool Include() { return _include; } /// For external interface use only. /// /// For external interface use only. Call doNotInclude() internally so /// dependancies can be checked. /// public virtual void Include(bool flag) { // TODO: // Internal and external flag may need to be handled seperately. _include = flag; } public override Tree OnAttemptToAddDuplicate(Tree oldNode) { _size = 0; _root = (Db4objects.Db4o.Internal.Query.Processor.QCandidate)oldNode; return oldNode; } private IReflectClass MemberClass() { return Transaction().Reflector().ForObject(_member); } internal virtual IPreparedComparison PrepareComparison(ObjectContainerBase container , object constraint) { IContext context = container.Transaction.Context(); if (_fieldMetadata != null) { return _fieldMetadata.PrepareComparison(context, constraint); } if (_classMetadata != null) { return _classMetadata.PrepareComparison(context, constraint); } IReflector reflector = container.Reflector(); Db4objects.Db4o.Internal.ClassMetadata classMetadata = null; if (_bytes != null) { classMetadata = container.ProduceClassMetadata(reflector.ForObject(constraint)); } else { if (_member != null) { classMetadata = container.ClassMetadataForReflectClass(reflector.ForObject(_member )); } } if (classMetadata != null) { if (_member != null && _member.GetType().IsArray) { ITypeHandler4 arrayElementTypehandler = classMetadata.TypeHandler(); if (reflector.Array().IsNDimensional(MemberClass())) { MultidimensionalArrayHandler mah = new MultidimensionalArrayHandler(arrayElementTypehandler , false); return mah.PrepareComparison(context, _member); } ArrayHandler ya = new ArrayHandler(arrayElementTypehandler, false); return ya.PrepareComparison(context, _member); } return classMetadata.PrepareComparison(context, constraint); } return null; } private void Read() { if (_include) { if (_bytes == null) { if (_key > 0) { if (DTrace.enabled) { DTrace.CandidateRead.Log(_key); } SetBytes(Container().ReadBufferById(Transaction(), _key)); if (_bytes == null) { Include(false); } } else { Include(false); } } } } private int CurrentOffSet() { return _bytes._offset; } private Db4objects.Db4o.Internal.Query.Processor.QCandidate ReadSubCandidate(QCandidates candidateCollection) { Read(); if (_bytes == null || _fieldMetadata == null) { return null; } int offset = CurrentOffSet(); QueryingReadContext context = NewQueryingReadContext(); ITypeHandler4 handler = HandlerRegistry.CorrectHandlerVersion(context, _fieldMetadata .GetHandler()); Db4objects.Db4o.Internal.Query.Processor.QCandidate subCandidate = candidateCollection .ReadSubCandidate(context, handler); Seek(offset); if (subCandidate != null) { subCandidate._root = GetRoot(); return subCandidate; } return null; } private void Seek(int offset) { _bytes._offset = offset; } private QueryingReadContext NewQueryingReadContext() { return new QueryingReadContext(Transaction(), _handlerVersion, _bytes, _key); } private void ReadThis(bool a_activate) { Read(); ObjectContainerBase container = Transaction().Container(); _member = container.TryGetByID(Transaction(), _key); if (_member != null && (a_activate || _member is ICompare)) { container.Activate(Transaction(), _member); CheckInstanceOfCompare(); } } internal virtual Db4objects.Db4o.Internal.ClassMetadata ReadClassMetadata() { if (_classMetadata == null) { Read(); if (_bytes != null) { Seek(0); ObjectContainerBase stream = Container(); ObjectHeader objectHeader = new ObjectHeader(stream, _bytes); _classMetadata = objectHeader.ClassMetadata(); if (_classMetadata != null) { if (stream._handlers.IclassCompare.IsAssignableFrom(_classMetadata.ClassReflector ())) { ReadThis(false); } } } } return _classMetadata; } public override string ToString() { string str = "QCandidate "; if (_classMetadata != null) { str += "\n YapClass " + _classMetadata.GetName(); } if (_fieldMetadata != null) { str += "\n YapField " + _fieldMetadata.GetName(); } if (_member != null) { str += "\n Member " + _member.ToString(); } if (_root != null) { str += "\n rooted by:\n"; str += _root.ToString(); } else { str += "\n ROOT"; } return str; } internal virtual void UseField(QField a_field) { Read(); if (_bytes == null) { _fieldMetadata = null; return; } ReadClassMetadata(); _member = null; if (a_field == null) { _fieldMetadata = null; return; } if (_classMetadata == null) { _fieldMetadata = null; return; } _fieldMetadata = FieldMetadataFrom(a_field, _classMetadata); if (_fieldMetadata == null) { FieldNotFound(); return; } HandlerVersion handlerVersion = _classMetadata.SeekToField(Transaction(), _bytes, _fieldMetadata); if (handlerVersion == HandlerVersion.Invalid) { FieldNotFound(); return; } _handlerVersion = handlerVersion._number; } private FieldMetadata FieldMetadataFrom(QField qField, Db4objects.Db4o.Internal.ClassMetadata type) { FieldMetadata existingField = qField.GetFieldMetadata(); if (existingField != null) { return existingField; } FieldMetadata field = type.FieldMetadataForName(qField.Name()); if (field != null) { field.Alive(); } return field; } private void FieldNotFound() { if (_classMetadata.HoldsAnyClass()) { // retry finding the field on reading the value _fieldMetadata = null; } else { // we can't get a value for the field, comparisons should definitely run against null _fieldMetadata = new NullFieldMetadata(); } _handlerVersion = HandlerRegistry.HandlerVersion; } internal virtual object Value() { return Value(false); } // TODO: This is only used for Evaluations. Handling may need // to be different for collections also. internal virtual object Value(bool a_activate) { if (_member == null) { if (_fieldMetadata == null) { ReadThis(a_activate); } else { int offset = CurrentOffSet(); _member = _fieldMetadata.Read(NewQueryingReadContext()); Seek(offset); CheckInstanceOfCompare(); } } return _member; } internal virtual void SetBytes(ByteArrayBuffer bytes) { _bytes = bytes; } private Db4objects.Db4o.Internal.Marshall.MarshallerFamily MarshallerFamily() { return Db4objects.Db4o.Internal.Marshall.MarshallerFamily.Version(_handlerVersion ); } public override bool Duplicates() { return _root != null; } public virtual void ClassMetadata(Db4objects.Db4o.Internal.ClassMetadata classMetadata ) { _classMetadata = classMetadata; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEEqual.cs0000644000175000017500000000051511700531646031514 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEEqual : QEAbstract { public override void IndexBitMap(bool[] bits) { bits[QE.Equal] = true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QCandidates.cs0000644000175000017500000003662011700531646032405 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Diagnostic; using Db4objects.Db4o.Internal.Fieldindex; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Query.Processor { /// /// Holds the tree of /// QCandidate /// objects and the list of /// QCon /// during query evaluation. /// The query work (adding and removing nodes) happens here. /// Candidates during query evaluation. /// QCandidate /// objects are stored in i_root /// /// public sealed class QCandidates : IVisitor4 { public readonly LocalTransaction i_trans; public Tree i_root; private List4 _constraints; internal ClassMetadata i_classMetadata; private QField _field; internal QCon i_currentConstraint; private IDGenerator _idGenerator; private bool _loadedFromClassIndex; internal QCandidates(LocalTransaction a_trans, ClassMetadata a_classMetadata, QField a_field) { // Transaction necessary as reference to stream // root of the QCandidate tree // collection of all constraints // possible class information // possible field information // current executing constraint, only set where needed i_trans = a_trans; i_classMetadata = a_classMetadata; _field = a_field; if (a_field == null || a_field._fieldMetadata == null || !(a_field._fieldMetadata .GetHandler() is StandardReferenceTypeHandler)) { return; } ClassMetadata yc = ((StandardReferenceTypeHandler)a_field._fieldMetadata.GetHandler ()).ClassMetadata(); if (i_classMetadata == null) { i_classMetadata = yc; } else { yc = i_classMetadata.GetHigherOrCommonHierarchy(yc); if (yc != null) { i_classMetadata = yc; } } } public QCandidate Add(QCandidate candidate) { i_root = Tree.Add(i_root, candidate); if (candidate._size == 0) { // This means that the candidate was already present // and QCandidate does not allow duplicates. // In this case QCandidate#isDuplicateOf will have // placed the existing QCandidate in the i_root // variable of the new candidate. We return it here: return candidate.GetRoot(); } return candidate; } internal void AddConstraint(QCon a_constraint) { _constraints = new List4(_constraints, a_constraint); } public QCandidate ReadSubCandidate(QueryingReadContext context, ITypeHandler4 handler ) { ObjectID objectID = ObjectID.NotPossible; try { int offset = context.Offset(); if (handler is IReadsObjectIds) { objectID = ((IReadsObjectIds)handler).ReadObjectID(context); } if (objectID.IsValid()) { return new QCandidate(this, null, objectID._id); } if (objectID == ObjectID.NotPossible) { context.Seek(offset); object obj = context.Read(handler); if (obj != null) { QCandidate candidate = new QCandidate(this, obj, context.Container().GetID(context .Transaction(), obj)); candidate.ClassMetadata(context.Container().ClassMetadataForObject(obj)); return candidate; } } } catch (Exception) { } // FIXME: Catchall return null; } internal void Collect(Db4objects.Db4o.Internal.Query.Processor.QCandidates a_candidates ) { IEnumerator i = IterateConstraints(); while (i.MoveNext()) { QCon qCon = (QCon)i.Current; SetCurrentConstraint(qCon); qCon.Collect(a_candidates); } SetCurrentConstraint(null); } internal void Execute() { if (DTrace.enabled) { DTrace.QueryProcess.Log(); } FieldIndexProcessorResult result = ProcessFieldIndexes(); if (result.FoundIndex()) { i_root = result.ToQCandidate(this); } else { LoadFromClassIndex(); } Evaluate(); } public IEnumerator ExecuteSnapshot(Collection4 executionPath) { IIntIterator4 indexIterator = new IntIterator4Adaptor(IterateIndex(ProcessFieldIndexes ())); Tree idRoot = TreeInt.AddAll(null, indexIterator); IEnumerator snapshotIterator = new TreeKeyIterator(idRoot); IEnumerator singleObjectQueryIterator = SingleObjectSodaProcessor(snapshotIterator ); return MapIdsToExecutionPath(singleObjectQueryIterator, executionPath); } private IEnumerator SingleObjectSodaProcessor(IEnumerator indexIterator) { return Iterators.Map(indexIterator, new _IFunction4_159(this)); } private sealed class _IFunction4_159 : IFunction4 { public _IFunction4_159(QCandidates _enclosing) { this._enclosing = _enclosing; } public object Apply(object current) { int id = ((int)current); QCandidate candidate = new QCandidate(this._enclosing, null, id); this._enclosing.i_root = candidate; this._enclosing.Evaluate(); if (!candidate.Include()) { return Iterators.Skip; } return current; } private readonly QCandidates _enclosing; } public IEnumerator ExecuteLazy(Collection4 executionPath) { IEnumerator indexIterator = IterateIndex(ProcessFieldIndexes()); IEnumerator singleObjectQueryIterator = SingleObjectSodaProcessor(indexIterator); return MapIdsToExecutionPath(singleObjectQueryIterator, executionPath); } private IEnumerator IterateIndex(FieldIndexProcessorResult result) { if (result.NoMatch()) { return Iterators.EmptyIterator; } if (result.FoundIndex()) { return result.IterateIDs(); } if (!i_classMetadata.HasClassIndex()) { return Iterators.EmptyIterator; } return BTreeClassIndexStrategy.Iterate(i_classMetadata, i_trans); } private IEnumerator MapIdsToExecutionPath(IEnumerator singleObjectQueryIterator, Collection4 executionPath) { if (executionPath == null) { return singleObjectQueryIterator; } IEnumerator res = singleObjectQueryIterator; IEnumerator executionPathIterator = executionPath.GetEnumerator(); while (executionPathIterator.MoveNext()) { string fieldName = (string)executionPathIterator.Current; res = Iterators.Concat(Iterators.Map(res, new _IFunction4_205(this, fieldName))); } return res; } private sealed class _IFunction4_205 : IFunction4 { public _IFunction4_205(QCandidates _enclosing, string fieldName) { this._enclosing = _enclosing; this.fieldName = fieldName; } public object Apply(object current) { int id = ((int)current); CollectIdContext context = CollectIdContext.ForID(this._enclosing.i_trans, id); if (context == null) { return Iterators.Skip; } context.ClassMetadata().CollectIDs(context, fieldName); return new TreeKeyIterator(context.Ids()); } private readonly QCandidates _enclosing; private readonly string fieldName; } public ObjectContainerBase Stream() { return i_trans.Container(); } public int ClassIndexEntryCount() { return i_classMetadata.IndexEntryCount(i_trans); } private FieldIndexProcessorResult ProcessFieldIndexes() { if (_constraints == null) { return FieldIndexProcessorResult.NoIndexFound; } return new FieldIndexProcessor(this).Run(); } internal void Evaluate() { if (_constraints == null) { return; } ForEachConstraint(new _IProcedure4_243(this)); ForEachConstraint(new _IProcedure4_251()); ForEachConstraint(new _IProcedure4_257()); ForEachConstraint(new _IProcedure4_263()); ForEachConstraint(new _IProcedure4_269()); ForEachConstraint(new _IProcedure4_275()); } private sealed class _IProcedure4_243 : IProcedure4 { public _IProcedure4_243(QCandidates _enclosing) { this._enclosing = _enclosing; } public void Apply(object arg) { QCon qCon = (QCon)arg; qCon.SetCandidates(this._enclosing); qCon.EvaluateSelf(); } private readonly QCandidates _enclosing; } private sealed class _IProcedure4_251 : IProcedure4 { public _IProcedure4_251() { } public void Apply(object arg) { ((QCon)arg).EvaluateSimpleChildren(); } } private sealed class _IProcedure4_257 : IProcedure4 { public _IProcedure4_257() { } public void Apply(object arg) { ((QCon)arg).EvaluateEvaluations(); } } private sealed class _IProcedure4_263 : IProcedure4 { public _IProcedure4_263() { } public void Apply(object arg) { ((QCon)arg).EvaluateCreateChildrenCandidates(); } } private sealed class _IProcedure4_269 : IProcedure4 { public _IProcedure4_269() { } public void Apply(object arg) { ((QCon)arg).EvaluateCollectChildren(); } } private sealed class _IProcedure4_275 : IProcedure4 { public _IProcedure4_275() { } public void Apply(object arg) { ((QCon)arg).EvaluateChildren(); } } private void ForEachConstraint(IProcedure4 proc) { IEnumerator i = IterateConstraints(); while (i.MoveNext()) { QCon constraint = (QCon)i.Current; if (!constraint.ProcessedByIndex()) { proc.Apply(constraint); } } } internal bool IsEmpty() { bool[] ret = new bool[] { true }; Traverse(new _IVisitor4_295(ret)); return ret[0]; } private sealed class _IVisitor4_295 : IVisitor4 { public _IVisitor4_295(bool[] ret) { this.ret = ret; } public void Visit(object obj) { if (((QCandidate)obj)._include) { ret[0] = false; } } private readonly bool[] ret; } internal bool Filter(IVisitor4 a_host) { if (i_root != null) { i_root.Traverse(a_host); i_root = i_root.Filter(new _IPredicate4_308()); } return i_root != null; } private sealed class _IPredicate4_308 : IPredicate4 { public _IPredicate4_308() { } public bool Match(object a_candidate) { return ((QCandidate)a_candidate)._include; } } internal int GenerateCandidateId() { if (_idGenerator == null) { _idGenerator = new IDGenerator(); } return -_idGenerator.Next(); } public IEnumerator IterateConstraints() { if (_constraints == null) { return Iterators.EmptyIterator; } return new Iterator4Impl(_constraints); } internal sealed class TreeIntBuilder { public TreeInt tree; public void Add(TreeInt node) { tree = (TreeInt)((TreeInt)Tree.Add(tree, node)); } } internal void LoadFromClassIndex() { if (!IsEmpty()) { return; } QCandidates.TreeIntBuilder result = new QCandidates.TreeIntBuilder(); IClassIndexStrategy index = i_classMetadata.Index(); index.TraverseAll(i_trans, new _IVisitor4_346(this, result)); i_root = result.tree; DiagnosticProcessor dp = i_trans.Container()._handlers.DiagnosticProcessor(); if (dp.Enabled() && !IsClassOnlyQuery()) { dp.LoadedFromClassIndex(i_classMetadata); } _loadedFromClassIndex = true; } private sealed class _IVisitor4_346 : IVisitor4 { public _IVisitor4_346(QCandidates _enclosing, QCandidates.TreeIntBuilder result) { this._enclosing = _enclosing; this.result = result; } public void Visit(object obj) { result.Add(new QCandidate(this._enclosing, null, ((int)obj))); } private readonly QCandidates _enclosing; private readonly QCandidates.TreeIntBuilder result; } internal void SetCurrentConstraint(QCon a_constraint) { i_currentConstraint = a_constraint; } internal void Traverse(IVisitor4 a_visitor) { if (i_root != null) { i_root.Traverse(a_visitor); } } // FIXME: This method should go completely. // We changed the code to create the QCandidates graph in two steps: // (1) call fitsIntoExistingConstraintHierarchy to determine whether // or not we need more QCandidates objects // (2) add all constraints // This method tries to do both in one, which results in missing // constraints. Not all are added to all QCandiates. // Right methodology is in // QQueryBase#createCandidateCollection // and // QQueryBase#createQCandidatesList internal bool TryAddConstraint(QCon a_constraint) { if (_field != null) { QField qf = a_constraint.GetField(); if (qf != null) { if (_field.Name() != null && !_field.Name().Equals(qf.Name())) { return false; } } } if (i_classMetadata == null || a_constraint.IsNullConstraint()) { AddConstraint(a_constraint); return true; } ClassMetadata yc = a_constraint.GetYapClass(); if (yc != null) { yc = i_classMetadata.GetHigherOrCommonHierarchy(yc); if (yc != null) { i_classMetadata = yc; AddConstraint(a_constraint); return true; } } AddConstraint(a_constraint); return false; } public void Visit(object a_tree) { QCandidate parent = (QCandidate)a_tree; if (parent.CreateChild(this)) { return; } // No object found. // All children constraints are necessarily false. // Check immediately. IEnumerator i = IterateConstraints(); while (i.MoveNext()) { ((QCon)i.Current).VisitOnNull(parent.GetRoot()); } } public override string ToString() { StringBuilder sb = new StringBuilder(); i_root.Traverse(new _IVisitor4_430(sb)); return sb.ToString(); } private sealed class _IVisitor4_430 : IVisitor4 { public _IVisitor4_430(StringBuilder sb) { this.sb = sb; } public void Visit(object obj) { QCandidate candidate = (QCandidate)obj; sb.Append(" "); sb.Append(candidate._key); } private readonly StringBuilder sb; } public Transaction Transaction() { return i_trans; } public bool WasLoadedFromClassIndex() { return _loadedFromClassIndex; } public bool FitsIntoExistingConstraintHierarchy(QCon constraint) { if (_field != null) { QField qf = constraint.GetField(); if (qf != null) { if (_field.Name() != null && !_field.Name().Equals(qf.Name())) { return false; } } } if (i_classMetadata == null || constraint.IsNullConstraint()) { return true; } ClassMetadata classMetadata = constraint.GetYapClass(); if (classMetadata == null) { return false; } classMetadata = i_classMetadata.GetHigherOrCommonHierarchy(classMetadata); if (classMetadata == null) { return false; } i_classMetadata = classMetadata; return true; } private bool IsClassOnlyQuery() { if (((List4)_constraints._next) != null) { return false; } if (!(_constraints._element is QConClass)) { return false; } return !((QCon)_constraints._element).HasChildren(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QQueryBase.cs0000644000175000017500000007253611700531646032254 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Types; using Sharpen.Util; namespace Db4objects.Db4o.Internal.Query.Processor { /// QQuery is the users hook on our graph. /// /// QQuery is the users hook on our graph. /// A QQuery is defined by it's constraints. /// NOTE: This is just a 'partial' base class to allow for variant implementations /// in db4oj and db4ojdk1.2. It assumes that itself is an instance of QQuery /// and should never be used explicitly. /// /// public abstract class QQueryBase : IInternalQuery, IUnversioned { [System.NonSerialized] internal Db4objects.Db4o.Internal.Transaction _trans; private Collection4 i_constraints = new Collection4(); private QQuery i_parent; private string i_field; [System.NonSerialized] private QueryEvaluationMode _evaluationMode; private int _prefetchDepth; private int _prefetchCount; private int _evaluationModeAsInt; private IQueryComparator _comparator; [System.NonSerialized] private readonly QQuery _this; private IList _orderings; protected QQueryBase() { // C/S only _this = Cast(this); } protected QQueryBase(Db4objects.Db4o.Internal.Transaction a_trans, QQuery a_parent , string a_field) { _this = Cast(this); _trans = a_trans; i_parent = a_parent; i_field = a_field; } public virtual void CaptureQueryResultConfig() { Config4Impl config = _trans.Container().Config(); _evaluationMode = config.EvaluationMode(); _prefetchDepth = config.PrefetchDepth(); _prefetchCount = config.PrefetchObjectCount(); } internal virtual void AddConstraint(QCon a_constraint) { i_constraints.Add(a_constraint); } private void AddConstraint(Collection4 col, object obj) { if (AttachToExistingConstraints(col, obj, true)) { return; } if (AttachToExistingConstraints(col, obj, false)) { return; } QConObject newConstraint = new QConObject(_trans, null, null, obj); AddConstraint(newConstraint); col.Add(newConstraint); } private bool AttachToExistingConstraints(Collection4 newConstraintsCollector, object obj, bool onlyForPaths) { bool found = false; IEnumerator j = IterateConstraints(); while (j.MoveNext()) { QCon existingConstraint = (QCon)j.Current; BooleanByRef removeExisting = new BooleanByRef(false); if (!onlyForPaths || (existingConstraint is QConPath)) { QCon newConstraint = existingConstraint.ShareParent(obj, removeExisting); if (newConstraint != null) { newConstraintsCollector.Add(newConstraint); AddConstraint(newConstraint); if (removeExisting.value) { RemoveConstraint(existingConstraint); } found = true; if (!onlyForPaths) { break; } } } } return found; } /// Search for slot that corresponds to class. /// /// Search for slot that corresponds to class.
If not found add it. ///
Constrain it.
///
public virtual IConstraint Constrain(object example) { lock (StreamLock()) { IReflectClass claxx = ReflectClassForClass(example); if (claxx != null) { return AddClassConstraint(claxx); } QConEvaluation eval = Platform4.EvaluationCreate(_trans, example); if (eval != null) { return AddEvaluationToAllConstraints(eval); } Collection4 constraints = new Collection4(); AddConstraint(constraints, example); return ToConstraint(constraints); } } private IConstraint AddEvaluationToAllConstraints(QConEvaluation eval) { if (i_constraints.Size() == 0) { _trans.Container().ClassCollection().IterateTopLevelClasses(new _IVisitor4_139(this )); } IEnumerator i = IterateConstraints(); while (i.MoveNext()) { ((QCon)i.Current).AddConstraint(eval); } // FIXME: should return valid Constraint object return null; } private sealed class _IVisitor4_139 : IVisitor4 { public _IVisitor4_139(QQueryBase _enclosing) { this._enclosing = _enclosing; } public void Visit(object obj) { ClassMetadata classMetadata = (ClassMetadata)obj; QConClass qcc = new QConClass(this._enclosing._trans, classMetadata.ClassReflector ()); this._enclosing.AddConstraint(qcc); this._enclosing.ToConstraint(this._enclosing.i_constraints).Or(qcc); } private readonly QQueryBase _enclosing; } private IConstraint AddClassConstraint(IReflectClass claxx) { if (IsTheObjectClass(claxx)) { return null; } if (claxx.IsInterface()) { return AddInterfaceConstraint(claxx); } Collection4 newConstraints = IntroduceClassConstrain(claxx); if (newConstraints.IsEmpty()) { QConClass qcc = new QConClass(_trans, claxx); AddConstraint(qcc); return qcc; } return ToConstraint(newConstraints); } private Collection4 IntroduceClassConstrain(IReflectClass claxx) { Collection4 newConstraints = new Collection4(); IEnumerator existingConstraints = IterateConstraints(); while (existingConstraints.MoveNext()) { QCon existingConstraint = (QConObject)existingConstraints.Current; BooleanByRef removeExisting = new BooleanByRef(false); QCon newConstraint = existingConstraint.ShareParentForClass(claxx, removeExisting ); if (newConstraint != null) { newConstraints.Add(newConstraint); AddConstraint(newConstraint); if (removeExisting.value) { RemoveConstraint(existingConstraint); } } } return newConstraints; } private bool IsTheObjectClass(IReflectClass claxx) { return claxx.Equals(Stream()._handlers.IclassObject); } private IConstraint AddInterfaceConstraint(IReflectClass claxx) { Collection4 classes = Stream().ClassCollection().ForInterface(claxx); if (classes.Size() == 0) { QConClass qcc = new QConClass(_trans, null, null, claxx); AddConstraint(qcc); return qcc; } IEnumerator i = classes.GetEnumerator(); IConstraint constr = null; while (i.MoveNext()) { ClassMetadata classMetadata = (ClassMetadata)i.Current; IReflectClass classMetadataClaxx = classMetadata.ClassReflector(); if (classMetadataClaxx != null) { if (!classMetadataClaxx.IsInterface()) { if (constr == null) { constr = Constrain(classMetadataClaxx); } else { constr = constr.Or(Constrain(classMetadata.ClassReflector())); } } } } return constr; } private IReflectClass ReflectClassForClass(object example) { if (example is IReflectClass) { return (IReflectClass)example; } if (example is Type) { return _trans.Reflector().ForClass((Type)example); } return null; } public virtual IConstraints Constraints() { lock (StreamLock()) { IConstraint[] constraints = new IConstraint[i_constraints.Size()]; i_constraints.ToArray(constraints); return new QConstraints(_trans, constraints); } } public virtual IQuery Descend(string a_field) { lock (StreamLock()) { QQuery query = new QQuery(_trans, _this, a_field); IntByRef run = new IntByRef(1); if (!Descend1(query, a_field, run)) { // try to add unparented nodes on the second run, // if not added in the first run and a descendant // was not found if (run.value == 1) { run.value = 2; if (!Descend1(query, a_field, run)) { new QConUnconditional(_trans, false).Attach(query, a_field); } } } return query; } } private bool Descend1(QQuery query, string fieldName, IntByRef run) { if (run.value == 2 || i_constraints.Size() == 0) { // On the second run we are really creating a second independant // query network that is not joined to other higher level // constraints. // Let's see how this works out. We may need to join networks. run.value = 0; // prevent a double run of this code Stream().ClassCollection().AttachQueryNode(fieldName, new _IVisitor4_275(this)); } CheckConstraintsEvaluationMode(); BooleanByRef foundClass = new BooleanByRef(false); IEnumerator i = IterateConstraints(); while (i.MoveNext()) { if (((QCon)i.Current).Attach(query, fieldName)) { foundClass.value = true; } } return foundClass.value; } private sealed class _IVisitor4_275 : IVisitor4 { public _IVisitor4_275(QQueryBase _enclosing) { this._enclosing = _enclosing; this.untypedFieldConstraintCollected = false; } internal bool untypedFieldConstraintCollected; public void Visit(object obj) { object[] pair = ((object[])obj); ClassMetadata containingClass = (ClassMetadata)pair[0]; FieldMetadata field = (FieldMetadata)pair[1]; if (this.IsTyped(field)) { this.AddFieldConstraint(containingClass, field); return; } if (this.untypedFieldConstraintCollected) { return; } this.AddFieldConstraint(containingClass, field); this.untypedFieldConstraintCollected = true; } private bool IsTyped(FieldMetadata field) { return !Handlers4.IsUntyped(field.GetHandler()); } private void AddFieldConstraint(ClassMetadata containingClass, FieldMetadata field ) { QConClass qcc = new QConClass(this._enclosing._trans, null, field.QField(this._enclosing ._trans), containingClass.ClassReflector()); this._enclosing.AddConstraint(qcc); this._enclosing.ToConstraint(this._enclosing.i_constraints).Or(qcc); } private readonly QQueryBase _enclosing; } public virtual IObjectSet Execute() { lock (StreamLock()) { return ((IObjectSet)TriggeringQueryEvents(new _IClosure4_331(this))); } } private sealed class _IClosure4_331 : IClosure4 { public _IClosure4_331(QQueryBase _enclosing) { this._enclosing = _enclosing; } public object Run() { return new ObjectSetFacade(this._enclosing.GetQueryResult()); } private readonly QQueryBase _enclosing; } public virtual void ExecuteLocal(IdListQueryResult result) { CheckConstraintsEvaluationMode(); QQueryBase.CreateCandidateCollectionResult r = CreateCandidateCollection(); bool checkDuplicates = r.checkDuplicates; bool topLevel = r.topLevel; List4 candidateCollection = r.candidateCollection; if (candidateCollection != null) { Collection4 executionPath = topLevel ? null : FieldPathFromTop(); IEnumerator i = new Iterator4Impl(candidateCollection); while (i.MoveNext()) { ((QCandidates)i.Current).Execute(); } if (((List4)candidateCollection._next) != null) { checkDuplicates = true; } if (checkDuplicates) { result.CheckDuplicates(); } ObjectContainerBase stream = Stream(); i = new Iterator4Impl(candidateCollection); while (i.MoveNext()) { QCandidates candidates = (QCandidates)i.Current; if (topLevel) { candidates.Traverse(result); } else { candidates.Traverse(new _IVisitor4_374(this, executionPath, stream, result)); } } } Sort(result); } private sealed class _IVisitor4_374 : IVisitor4 { public _IVisitor4_374(QQueryBase _enclosing, Collection4 executionPath, ObjectContainerBase stream, IdListQueryResult result) { this._enclosing = _enclosing; this.executionPath = executionPath; this.stream = stream; this.result = result; } public void Visit(object a_object) { QCandidate candidate = (QCandidate)a_object; if (candidate.Include()) { TreeInt ids = new TreeInt(candidate._key); ByRef idsNew = new ByRef(); IEnumerator itPath = executionPath.GetEnumerator(); while (itPath.MoveNext()) { idsNew.value = null; string fieldName = (string)(itPath.Current); if (ids != null) { ids.Traverse(new _IVisitor4_385(this, stream, fieldName, idsNew)); } ids = (TreeInt)((TreeInt)idsNew.value); } if (ids != null) { ids.Traverse(new _IVisitor4_406(result)); } } } private sealed class _IVisitor4_385 : IVisitor4 { public _IVisitor4_385(_IVisitor4_374 _enclosing, ObjectContainerBase stream, string fieldName, ByRef idsNew) { this._enclosing = _enclosing; this.stream = stream; this.fieldName = fieldName; this.idsNew = idsNew; } public void Visit(object treeInt) { int id = ((TreeInt)treeInt)._key; StatefulBuffer reader = stream.ReadStatefulBufferById(this._enclosing._enclosing. _trans, id); if (reader != null) { ObjectHeader oh = new ObjectHeader(stream, reader); CollectIdContext context = new CollectIdContext(this._enclosing._enclosing._trans , oh, reader); oh.ClassMetadata().CollectIDs(context, fieldName); Tree.Traverse(context.Ids(), new _IVisitor4_394(idsNew)); } } private sealed class _IVisitor4_394 : IVisitor4 { public _IVisitor4_394(ByRef idsNew) { this.idsNew = idsNew; } public void Visit(object node) { idsNew.value = TreeInt.Add(((TreeInt)idsNew.value), ((TreeInt)node)._key); } private readonly ByRef idsNew; } private readonly _IVisitor4_374 _enclosing; private readonly ObjectContainerBase stream; private readonly string fieldName; private readonly ByRef idsNew; } private sealed class _IVisitor4_406 : IVisitor4 { public _IVisitor4_406(IdListQueryResult result) { this.result = result; } public void Visit(object treeInt) { result.AddKeyCheckDuplicates(((TreeInt)treeInt)._key); } private readonly IdListQueryResult result; } private readonly QQueryBase _enclosing; private readonly Collection4 executionPath; private readonly ObjectContainerBase stream; private readonly IdListQueryResult result; } private void TriggerQueryOnFinished() { Stream().Callbacks().QueryOnFinished(_trans, Cast(this)); } private void TriggerQueryOnStarted() { Stream().Callbacks().QueryOnStarted(_trans, Cast(this)); } public virtual IEnumerator ExecuteLazy() { CheckConstraintsEvaluationMode(); QQueryBase.CreateCandidateCollectionResult r = CreateCandidateCollection(); Collection4 executionPath = ExecutionPath(r); IEnumerator candidateCollection = new Iterator4Impl(r.candidateCollection); MappingIterator executeCandidates = new _MappingIterator_438(executionPath, candidateCollection ); CompositeIterator4 resultingIDs = new CompositeIterator4(executeCandidates); if (!r.checkDuplicates) { return resultingIDs; } return CheckDuplicates(resultingIDs); } private sealed class _MappingIterator_438 : MappingIterator { public _MappingIterator_438(Collection4 executionPath, IEnumerator baseArg1) : base (baseArg1) { this.executionPath = executionPath; } protected override object Map(object current) { return ((QCandidates)current).ExecuteLazy(executionPath); } private readonly Collection4 executionPath; } public virtual IQueryResult GetQueryResult() { lock (StreamLock()) { if (i_constraints.Size() == 0) { return ExecuteAllObjectsQuery(); } IQueryResult result = ExecuteClassOnlyQuery(); if (result != null) { return result; } OptimizeJoins(); return ExecuteQuery(); } } protected IQueryResult ExecuteQuery() { return Stream().ExecuteQuery(_this); } private IQueryResult ExecuteAllObjectsQuery() { return Stream().QueryAllObjects(_trans); } protected virtual ObjectContainerBase Stream() { return _trans.Container(); } public virtual IInternalObjectContainer Container { get { return Stream(); } } private IQueryResult ExecuteClassOnlyQuery() { ClassMetadata clazz = SingleClassConstraint(); if (null == clazz) { return null; } IQueryResult queryResult = Stream().ClassOnlyQuery(this, clazz); Sort(queryResult); return queryResult; } private ClassMetadata SingleClassConstraint() { if (RequiresSort()) { return null; } QConClass clazzconstr = ClassConstraint(); if (clazzconstr == null) { return null; } ClassMetadata clazz = clazzconstr._classMetadata; if (clazz == null) { return null; } if (clazzconstr.HasChildren() || clazz.IsArray()) { return null; } return clazz; } private QConClass ClassConstraint() { if (i_constraints.Size() != 1) { return null; } IConstraint constr = SingleConstraint(); if (constr.GetType() != typeof(QConClass)) { return null; } return (QConClass)constr; } private IConstraint SingleConstraint() { return (IConstraint)i_constraints.SingleElement(); } public class CreateCandidateCollectionResult { public readonly bool checkDuplicates; public readonly bool topLevel; public readonly List4 candidateCollection; public CreateCandidateCollectionResult(List4 candidateCollection_, bool checkDuplicates_ , bool topLevel_) { candidateCollection = candidateCollection_; topLevel = topLevel_; checkDuplicates = checkDuplicates_; } } public virtual IEnumerator ExecuteSnapshot() { QQueryBase.CreateCandidateCollectionResult r = CreateCandidateCollection(); Collection4 executionPath = ExecutionPath(r); IEnumerator candidatesIterator = new Iterator4Impl(r.candidateCollection); Collection4 snapshots = new Collection4(); while (candidatesIterator.MoveNext()) { QCandidates candidates = (QCandidates)candidatesIterator.Current; snapshots.Add(candidates.ExecuteSnapshot(executionPath)); } IEnumerator snapshotsIterator = snapshots.GetEnumerator(); CompositeIterator4 resultingIDs = new CompositeIterator4(snapshotsIterator); if (!r.checkDuplicates) { return resultingIDs; } return CheckDuplicates(resultingIDs); } public virtual object TriggeringQueryEvents(IClosure4 closure) { TriggerQueryOnStarted(); try { return closure.Run(); } finally { TriggerQueryOnFinished(); } } private IEnumerator CheckDuplicates(CompositeIterator4 executeAllCandidates) { return Iterators.Filter(executeAllCandidates, new _IPredicate4_573()); } private sealed class _IPredicate4_573 : IPredicate4 { public _IPredicate4_573() { this.ids = new TreeInt(0); } private TreeInt ids; public bool Match(object current) { int id = ((int)current); if (this.ids.Find(id) != null) { return false; } this.ids = (TreeInt)((TreeInt)this.ids.Add(new TreeInt(id))); return true; } } private Collection4 ExecutionPath(QQueryBase.CreateCandidateCollectionResult r) { return r.topLevel ? null : FieldPathFromTop(); } public virtual void CheckConstraintsEvaluationMode() { IEnumerator constraints = IterateConstraints(); while (constraints.MoveNext()) { ((QConObject)constraints.Current).SetEvaluationMode(); } } private Collection4 FieldPathFromTop() { QQueryBase q = this; Collection4 fieldPath = new Collection4(); while (q.i_parent != null) { fieldPath.Prepend(q.i_field); q = q.i_parent; } return fieldPath; } private void LogConstraints() { } public virtual QQueryBase.CreateCandidateCollectionResult CreateCandidateCollection () { List4 candidatesList = CreateQCandidatesList(); bool checkDuplicates = false; bool topLevel = true; IEnumerator i = IterateConstraints(); while (i.MoveNext()) { QCon constraint = (QCon)i.Current; QCon old = constraint; constraint = constraint.GetRoot(); if (constraint != old) { checkDuplicates = true; topLevel = false; } ClassMetadata classMetadata = constraint.GetYapClass(); if (classMetadata == null) { break; } AddConstraintToCandidatesList(candidatesList, constraint); } return new QQueryBase.CreateCandidateCollectionResult(candidatesList, checkDuplicates , topLevel); } private void AddConstraintToCandidatesList(List4 candidatesList, QCon qcon) { if (candidatesList == null) { return; } IEnumerator j = new Iterator4Impl(candidatesList); while (j.MoveNext()) { QCandidates candidates = (QCandidates)j.Current; candidates.AddConstraint(qcon); } } private List4 CreateQCandidatesList() { List4 candidatesList = null; IEnumerator i = IterateConstraints(); while (i.MoveNext()) { QCon constraint = (QCon)i.Current; constraint = constraint.GetRoot(); ClassMetadata classMetadata = constraint.GetYapClass(); if (classMetadata == null) { continue; } if (ConstraintCanBeAddedToExisting(candidatesList, constraint)) { continue; } QCandidates candidates = new QCandidates((LocalTransaction)_trans, classMetadata, null); candidatesList = new List4(candidatesList, candidates); } return candidatesList; } private bool ConstraintCanBeAddedToExisting(List4 candidatesList, QCon constraint ) { IEnumerator j = new Iterator4Impl(candidatesList); while (j.MoveNext()) { QCandidates candidates = (QCandidates)j.Current; if (candidates.FitsIntoExistingConstraintHierarchy(constraint)) { return true; } } return false; } public Transaction Transaction() { return _trans; } public virtual IEnumerator IterateConstraints() { // clone the collection first to avoid // InvalidIteratorException as i_constraints might be // modified during the execution of callee return new Collection4(i_constraints).GetEnumerator(); } public virtual IQuery OrderAscending() { if (i_parent == null) { throw new InvalidOperationException("Cannot apply ordering at top level."); } lock (StreamLock()) { AddOrdering(SodaQueryComparator.Direction.Ascending); return _this; } } public virtual IQuery OrderDescending() { if (i_parent == null) { throw new InvalidOperationException("Cannot apply ordering at top level."); } lock (StreamLock()) { AddOrdering(SodaQueryComparator.Direction.Descending); return _this; } } private void AddOrdering(SodaQueryComparator.Direction direction) { AddOrdering(direction, new ArrayList()); } protected void AddOrdering(SodaQueryComparator.Direction direction, IList path) { if (i_field != null) { path.Add(i_field); } if (i_parent != null) { i_parent.AddOrdering(direction, path); return; } string[] fieldPath = ReverseFieldPath(path); RemoveExistingOrderingFor(fieldPath); Orderings().Add(new SodaQueryComparator.Ordering(direction, fieldPath)); } private void RemoveExistingOrderingFor(string[] fieldPath) { for (IEnumerator orderingIter = Orderings().GetEnumerator(); orderingIter.MoveNext (); ) { SodaQueryComparator.Ordering ordering = ((SodaQueryComparator.Ordering)orderingIter .Current); if (Arrays.Equals(ordering.FieldPath(), fieldPath)) { Orderings().Remove(ordering); break; } } } /// Public so it can be used by the LINQ test cases. /// Public so it can be used by the LINQ test cases. public IList Orderings() { if (null == _orderings) { _orderings = new ArrayList(); } return _orderings; } private string[] ReverseFieldPath(IList path) { string[] reversedPath = new string[path.Count]; for (int i = 0; i < reversedPath.Length; i++) { reversedPath[i] = ((string)path[path.Count - i - 1]); } return reversedPath; } public virtual void Marshall() { CheckConstraintsEvaluationMode(); _evaluationModeAsInt = _evaluationMode.AsInt(); IEnumerator i = IterateConstraints(); while (i.MoveNext()) { ((QCon)i.Current).GetRoot().Marshall(); } } public virtual void Unmarshall(Transaction a_trans) { _evaluationMode = QueryEvaluationMode.FromInt(_evaluationModeAsInt); _trans = a_trans; IEnumerator i = IterateConstraints(); while (i.MoveNext()) { ((QCon)i.Current).Unmarshall(a_trans); } } internal virtual void RemoveConstraint(QCon a_constraint) { i_constraints.Remove(a_constraint); } internal virtual IConstraint ToConstraint(Collection4 constraints) { if (constraints.Size() == 1) { return (IConstraint)constraints.SingleElement(); } else { if (constraints.Size() > 0) { IConstraint[] constraintArray = new IConstraint[constraints.Size()]; constraints.ToArray(constraintArray); return new QConstraints(_trans, constraintArray); } } return null; } protected virtual object StreamLock() { return Stream().Lock(); } public virtual IQuery SortBy(IQueryComparator comparator) { _comparator = comparator; return _this; } private void Sort(IQueryResult result) { if (_orderings != null) { result.SortIds(NewSodaQueryComparator()); } if (_comparator != null) { result.Sort(_comparator); } } private IIntComparator NewSodaQueryComparator() { return new SodaQueryComparator((LocalObjectContainer)this.Transaction().Container (), ExtentType(), ((SodaQueryComparator.Ordering[])Sharpen.Collections.ToArray(_orderings , new SodaQueryComparator.Ordering[_orderings.Count]))); } private ClassMetadata ExtentType() { return ClassConstraint().GetYapClass(); } // cheat emulating '(QQuery)this' private static QQuery Cast(QQueryBase obj) { return (QQuery)obj; } public virtual bool RequiresSort() { if (_comparator != null || _orderings != null) { return true; } return false; } public virtual IQueryComparator Comparator() { return _comparator; } public virtual QueryEvaluationMode EvaluationMode() { return _evaluationMode; } public virtual void EvaluationMode(QueryEvaluationMode mode) { _evaluationMode = mode; } private void OptimizeJoins() { if (!HasOrJoins()) { RemoveJoins(); } } private bool HasOrJoins() { return ForEachConstraintRecursively(new _IFunction4_855()); } private sealed class _IFunction4_855 : IFunction4 { public _IFunction4_855() { } public object Apply(object obj) { QCon constr = (QCon)obj; IEnumerator joinIter = constr.IterateJoins(); while (joinIter.MoveNext()) { QConJoin join = (QConJoin)joinIter.Current; if (join.IsOr()) { return true; } } return false; } } private void RemoveJoins() { ForEachConstraintRecursively(new _IFunction4_871()); } private sealed class _IFunction4_871 : IFunction4 { public _IFunction4_871() { } public object Apply(object obj) { QCon constr = (QCon)obj; constr.i_joins = null; return false; } } private bool ForEachConstraintRecursively(IFunction4 block) { IQueue4 queue = new NoDuplicatesQueue(new NonblockingQueue()); IEnumerator constrIter = IterateConstraints(); while (constrIter.MoveNext()) { queue.Add(constrIter.Current); } while (queue.HasNext()) { QCon constr = (QCon)queue.Next(); bool cancel = (bool)block.Apply(constr); if (cancel) { return true; } IEnumerator childIter = constr.IterateChildren(); while (childIter.MoveNext()) { queue.Add(childIter.Current); } IEnumerator joinIter = constr.IterateJoins(); while (joinIter.MoveNext()) { queue.Add(joinIter.Current); } } return false; } public virtual int PrefetchDepth() { return _prefetchDepth; } public virtual int PrefetchCount() { return _prefetchCount; } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append("QQueryBase\n"); IEnumerator i = IterateConstraints(); while (i.MoveNext()) { QCon constraint = (QCon)i.Current; sb.Append(constraint); sb.Append("\n"); } return sb.ToString(); } public virtual QQuery Parent() { return i_parent; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QCon.cs0000644000175000017500000004770411700531646031072 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Internal.Query.Processor { /// Base class for all constraints on queries. /// Base class for all constraints on queries. /// public abstract class QCon : IConstraint, IVisitor4, IUnversioned { internal static readonly IDGenerator idGenerator = new IDGenerator(); [System.NonSerialized] internal QCandidates i_candidates; private Collection4 i_childrenCandidates; protected List4 _children; protected QE i_evaluator = QE.Default; private int i_id; internal Collection4 i_joins; protected Db4objects.Db4o.Internal.Query.Processor.QCon i_parent; private bool i_removed = false; [System.NonSerialized] internal Db4objects.Db4o.Internal.Transaction i_trans; [System.NonSerialized] private bool _processedByIndex; public QCon() { } internal QCon(Db4objects.Db4o.Internal.Transaction a_trans) { //Used for query debug only. // our candidate object tree // collection of QCandidates to collect children elements and to // execute children. For convenience we hold them in the constraint, // so we can do collection and execution in two steps // all subconstraints // for evaluation // ID handling for fast find of QConstraint objects in // pending OR evaluations // ANDs and ORs on this constraint // the parent of this constraint or null, if this is a root // prevents circular calls on removal // our transaction to get a stream object anywhere // whether or not this constraint was used to get the initial set // in the FieldIndexProcessor // C/S only i_id = idGenerator.Next(); i_trans = a_trans; } internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon AddConstraint(Db4objects.Db4o.Internal.Query.Processor.QCon a_child) { _children = new List4(_children, a_child); return a_child; } public virtual ObjectContainerBase Container() { return Transaction().Container(); } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return i_trans; } internal virtual void AddJoin(QConJoin a_join) { if (i_joins == null) { i_joins = new Collection4(); } i_joins.Add(a_join); } internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon AddSharedConstraint (QField a_field, object a_object) { QConObject newConstraint = new QConObject(i_trans, this, a_field, a_object); AddConstraint(newConstraint); return newConstraint; } public virtual IConstraint And(IConstraint andWith) { lock (StreamLock()) { return Join(andWith, true); } } internal virtual bool Attach(QQuery query, string a_field) { Db4objects.Db4o.Internal.Query.Processor.QCon qcon = this; ClassMetadata yc = GetYapClass(); bool[] foundField = new bool[] { false }; ForEachChildField(a_field, new _IVisitor4_104(foundField, query)); if (foundField[0]) { return true; } QField qf = null; if (yc == null || yc.HoldsAnyClass()) { int[] count = new int[] { 0 }; FieldMetadata[] yfs = new FieldMetadata[] { null }; i_trans.Container().ClassCollection().AttachQueryNode(a_field, new _IVisitor4_122 (yfs, count)); if (count[0] == 0) { return false; } if (count[0] == 1) { qf = yfs[0].QField(i_trans); } else { qf = new QField(i_trans, a_field, null, 0, 0); } } else { if (yc.IsTranslated()) { i_trans.Container()._handlers.DiagnosticProcessor().DescendIntoTranslator(yc, a_field ); } FieldMetadata yf = yc.FieldMetadataForName(a_field); if (yf != null) { qf = yf.QField(i_trans); } if (qf == null) { qf = new QField(i_trans, a_field, null, 0, 0); } } QConPath qcp = new QConPath(i_trans, qcon, qf); query.AddConstraint(qcp); qcon.AddConstraint(qcp); return true; } private sealed class _IVisitor4_104 : IVisitor4 { public _IVisitor4_104(bool[] foundField, QQuery query) { this.foundField = foundField; this.query = query; } public void Visit(object obj) { foundField[0] = true; query.AddConstraint((Db4objects.Db4o.Internal.Query.Processor.QCon)obj); } private readonly bool[] foundField; private readonly QQuery query; } private sealed class _IVisitor4_122 : IVisitor4 { public _IVisitor4_122(FieldMetadata[] yfs, int[] count) { this.yfs = yfs; this.count = count; } public void Visit(object obj) { yfs[0] = (FieldMetadata)((object[])obj)[1]; count[0]++; } private readonly FieldMetadata[] yfs; private readonly int[] count; } public virtual bool CanBeIndexLeaf() { return false; } public virtual bool CanLoadByIndex() { // virtual return false; } internal virtual void CheckLastJoinRemoved() { if (i_joins.Size() == 0) { i_joins = null; } } /// internal virtual void Collect(QCandidates candidates) { } // virtual public virtual IConstraint Contains() { throw NotSupported(); } internal virtual void CreateCandidates(Collection4 a_candidateCollection) { IEnumerator j = a_candidateCollection.GetEnumerator(); while (j.MoveNext()) { QCandidates candidates = (QCandidates)j.Current; if (candidates.TryAddConstraint(this)) { i_candidates = candidates; return; } } i_candidates = new QCandidates((LocalTransaction)i_trans, GetYapClass(), GetField ()); i_candidates.AddConstraint(this); a_candidateCollection.Add(i_candidates); } internal virtual void DoNotInclude(QCandidate a_root) { if (DTrace.enabled) { DTrace.Donotinclude.Log(Id()); } if (i_parent != null) { i_parent.Visit1(a_root, this, false); } else { a_root.DoNotInclude(); } } public virtual IConstraint Equal() { throw NotSupported(); } /// internal virtual bool Evaluate(QCandidate candidate) { throw Exceptions4.VirtualException(); } internal virtual void EvaluateChildren() { IEnumerator i = i_childrenCandidates.GetEnumerator(); while (i.MoveNext()) { ((QCandidates)i.Current).Evaluate(); } } internal virtual void EvaluateCollectChildren() { if (DTrace.enabled) { DTrace.CollectChildren.Log(Id()); } IEnumerator i = i_childrenCandidates.GetEnumerator(); while (i.MoveNext()) { ((QCandidates)i.Current).Collect(i_candidates); } } internal virtual void EvaluateCreateChildrenCandidates() { i_childrenCandidates = new Collection4(); IEnumerator i = IterateChildren(); while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).CreateCandidates(i_childrenCandidates ); } } internal virtual void EvaluateEvaluations() { IEnumerator i = IterateChildren(); while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).EvaluateEvaluationsExec (i_candidates, true); } } /// /// internal virtual void EvaluateEvaluationsExec(QCandidates candidates, bool rereadObject ) { } // virtual internal virtual void EvaluateSelf() { i_candidates.Filter(this); } internal virtual void EvaluateSimpleChildren() { // TODO: sort the constraints for YapFields first, // so we stay with the same YapField if (_children == null) { return; } IEnumerator i = IterateChildren(); while (i.MoveNext()) { Db4objects.Db4o.Internal.Query.Processor.QCon qcon = (Db4objects.Db4o.Internal.Query.Processor.QCon )i.Current; i_candidates.SetCurrentConstraint(qcon); qcon.SetCandidates(i_candidates); qcon.EvaluateSimpleExec(i_candidates); } i_candidates.SetCurrentConstraint(null); } /// internal virtual void EvaluateSimpleExec(QCandidates candidates) { } // virtual internal virtual void ExchangeConstraint(Db4objects.Db4o.Internal.Query.Processor.QCon a_exchange, Db4objects.Db4o.Internal.Query.Processor.QCon a_with) { List4 previous = null; List4 current = _children; while (current != null) { if (current._element == a_exchange) { if (previous == null) { _children = ((List4)current._next); } else { previous._next = ((List4)current._next); } } previous = current; current = ((List4)current._next); } _children = new List4(_children, a_with); } internal virtual void ForEachChildField(string name, IVisitor4 visitor) { IEnumerator i = IterateChildren(); while (i.MoveNext()) { object obj = i.Current; if (obj is QConObject) { if (((QConObject)obj).GetField().Name().Equals(name)) { visitor.Visit(obj); } } } } public virtual QField GetField() { return null; } public virtual object GetObject() { throw NotSupported(); } internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon GetRoot() { if (i_parent != null) { return i_parent.GetRoot(); } return this; } internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon ProduceTopLevelJoin () { if (!HasJoins()) { return this; } IEnumerator i = IterateJoins(); if (i_joins.Size() == 1) { i.MoveNext(); return ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).ProduceTopLevelJoin (); } Collection4 col = new Collection4(); while (i.MoveNext()) { col.Ensure(((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).ProduceTopLevelJoin ()); } i = col.GetEnumerator(); i.MoveNext(); Db4objects.Db4o.Internal.Query.Processor.QCon qcon = (Db4objects.Db4o.Internal.Query.Processor.QCon )i.Current; if (col.Size() == 1) { return qcon; } while (i.MoveNext()) { qcon = (Db4objects.Db4o.Internal.Query.Processor.QCon)qcon.And((IConstraint)i.Current ); } return qcon; } internal virtual ClassMetadata GetYapClass() { return null; } public virtual IConstraint Greater() { throw NotSupported(); } public virtual bool HasChildren() { return _children != null; } public virtual bool HasParent() { return i_parent != null; } public virtual Db4objects.Db4o.Internal.Query.Processor.QCon Parent() { return i_parent; } public virtual bool HasJoins() { if (i_joins == null) { return false; } return i_joins.Size() > 0; } public virtual bool HasObjectInParentPath(object obj) { if (i_parent != null) { return i_parent.HasObjectInParentPath(obj); } return false; } public virtual IConstraint Identity() { throw NotSupported(); } public virtual IConstraint ByExample() { throw NotSupported(); } public virtual int IdentityID() { return 0; } internal virtual bool IsNot() { return i_evaluator is QENot; } internal virtual bool IsNullConstraint() { return false; } public virtual IEnumerator IterateJoins() { if (i_joins == null) { return Iterators.EmptyIterator; } return i_joins.GetEnumerator(); } public virtual IEnumerator IterateChildren() { if (_children == null) { return Iterators.EmptyIterator; } return new Iterator4Impl(_children); } internal virtual IConstraint Join(IConstraint a_with, bool a_and) { if (!(a_with is Db4objects.Db4o.Internal.Query.Processor.QCon)) { // TODO: one of our STOr test cases somehow carries // the same constraint twice. This may be a result // of a funny AND. Check! return null; } if (a_with == this) { return this; } return Join1((Db4objects.Db4o.Internal.Query.Processor.QCon)a_with, a_and); } internal virtual IConstraint Join1(Db4objects.Db4o.Internal.Query.Processor.QCon a_with, bool a_and) { if (a_with is QConstraints) { int j = 0; Collection4 joinHooks = new Collection4(); IConstraint[] constraints = ((QConstraints)a_with).ToArray(); for (j = 0; j < constraints.Length; j++) { joinHooks.Ensure(((Db4objects.Db4o.Internal.Query.Processor.QCon)constraints[j]). JoinHook()); } IConstraint[] joins = new IConstraint[joinHooks.Size()]; j = 0; IEnumerator i = joinHooks.GetEnumerator(); while (i.MoveNext()) { joins[j++] = Join((IConstraint)i.Current, a_and); } return new QConstraints(i_trans, joins); } Db4objects.Db4o.Internal.Query.Processor.QCon myHook = JoinHook(); Db4objects.Db4o.Internal.Query.Processor.QCon otherHook = a_with.JoinHook(); if (myHook == otherHook) { // You might like to check out, what happens, if you // remove this line. It seems to open a bug in an // StOr testcase. return myHook; } QConJoin cj = new QConJoin(i_trans, myHook, otherHook, a_and); myHook.AddJoin(cj); otherHook.AddJoin(cj); return cj; } internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon JoinHook() { return ProduceTopLevelJoin(); } public virtual IConstraint Like() { throw NotSupported(); } public virtual IConstraint StartsWith(bool caseSensitive) { throw NotSupported(); } public virtual IConstraint EndsWith(bool caseSensitive) { throw NotSupported(); } internal virtual void Log(string indent) { } // System.out.println(indent + "JOINS"); // joins += join.i_id + " "; // System.out.println(joins); // System.out.println(indent + getClass().getName() + " " + i_id + " " + i_debugField + " " + joins ); // System.out.println(indent + "CONSTRAINTS"); internal virtual string LogObject() { return string.Empty; } internal virtual void Marshall() { IEnumerator i = IterateChildren(); while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).Marshall(); } } public virtual IConstraint Not() { lock (StreamLock()) { if (!(i_evaluator is QENot)) { i_evaluator = new QENot(i_evaluator); } return this; } } private Exception NotSupported() { return new Exception("Not supported."); } /// public virtual bool OnSameFieldAs(Db4objects.Db4o.Internal.Query.Processor.QCon other ) { return false; } public virtual IConstraint Or(IConstraint orWith) { lock (StreamLock()) { return Join(orWith, false); } } internal virtual bool Remove() { if (!i_removed) { i_removed = true; RemoveChildrenJoins(); return true; } return false; } internal virtual void RemoveChildrenJoins() { if (!HasJoins()) { return; } Collection4 toBeRemoved = CollectJoinsToBeRemoved(); i_joins.RemoveAll(toBeRemoved); CheckLastJoinRemoved(); } private Collection4 CollectJoinsToBeRemoved() { Collection4 toBeRemoved = new Collection4(); IEnumerator joinIter = IterateJoins(); while (joinIter.MoveNext()) { QConJoin join = (QConJoin)joinIter.Current; if (join.RemoveForParent(this)) { toBeRemoved.Add(join); } } return toBeRemoved; } internal virtual void RemoveJoin(QConJoin a_join) { i_joins.Remove(a_join); CheckLastJoinRemoved(); } internal virtual void RemoveNot() { if (IsNot()) { i_evaluator = ((QENot)i_evaluator).Evaluator(); } } public virtual void SetCandidates(QCandidates a_candidates) { i_candidates = a_candidates; } internal virtual void SetParent(Db4objects.Db4o.Internal.Query.Processor.QCon a_newParent ) { i_parent = a_newParent; } /// /// internal virtual Db4objects.Db4o.Internal.Query.Processor.QCon ShareParent(object obj, BooleanByRef removeExisting) { // virtual return null; } /// /// internal virtual QConClass ShareParentForClass(IReflectClass claxx, BooleanByRef removeExisting) { // virtual return null; } public virtual IConstraint Smaller() { throw NotSupported(); } protected virtual object StreamLock() { return i_trans.Container().Lock(); } internal virtual void Unmarshall(Db4objects.Db4o.Internal.Transaction a_trans) { if (i_trans != null) { return; } i_trans = a_trans; UnmarshallParent(a_trans); UnmarshallJoins(a_trans); UnmarshallChildren(a_trans); } private void UnmarshallParent(Db4objects.Db4o.Internal.Transaction a_trans) { if (i_parent != null) { i_parent.Unmarshall(a_trans); } } private void UnmarshallChildren(Db4objects.Db4o.Internal.Transaction a_trans) { IEnumerator i = IterateChildren(); while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).Unmarshall(a_trans); } } private void UnmarshallJoins(Db4objects.Db4o.Internal.Transaction a_trans) { if (HasJoins()) { IEnumerator i = IterateJoins(); while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).Unmarshall(a_trans); } } } public virtual void Visit(object obj) { QCandidate qc = (QCandidate)obj; Visit1(qc.GetRoot(), this, Evaluate(qc)); } internal virtual void Visit(QCandidate a_root, bool res) { Visit1(a_root, this, i_evaluator.Not(res)); } internal virtual void Visit1(QCandidate root, Db4objects.Db4o.Internal.Query.Processor.QCon reason, bool res) { // The a_reason parameter makes it eays to distinguish // between calls from above (a_reason == this) and below. if (HasJoins()) { // this should probably be on the Join IEnumerator i = IterateJoins(); while (i.MoveNext()) { root.Evaluate(new QPending((QConJoin)i.Current, this, res)); } } else { if (!res) { DoNotInclude(root); } } } internal void VisitOnNull(QCandidate a_root) { // TODO: It may be more efficient to rule out // all possible keepOnNull issues when starting // evaluation. IEnumerator i = IterateChildren(); while (i.MoveNext()) { ((Db4objects.Db4o.Internal.Query.Processor.QCon)i.Current).VisitOnNull(a_root); } if (VisitSelfOnNull()) { Visit(a_root, IsNullConstraint()); } } internal virtual bool VisitSelfOnNull() { return true; } public virtual QE Evaluator() { return i_evaluator; } public virtual void SetProcessedByIndex() { InternalSetProcessedByIndex(); } protected virtual void InternalSetProcessedByIndex() { _processedByIndex = true; if (i_joins != null) { IEnumerator i = i_joins.GetEnumerator(); while (i.MoveNext()) { ((QConJoin)i.Current).SetProcessedByIndex(); } } } public virtual bool ProcessedByIndex() { return _processedByIndex; } public virtual int ChildrenCount() { return List4.Size(_children); } public virtual int Id() { return i_id; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QField.cs0000644000175000017500000000652311700531646031370 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QField : IVisitor4, IUnversioned { [System.NonSerialized] internal Transaction i_trans; private string i_name; [System.NonSerialized] internal FieldMetadata _fieldMetadata; private int i_classMetadataID; private int _fieldHandle; public QField() { } public QField(Transaction a_trans, string name, FieldMetadata fieldMetadata, int classMetadataID, int a_index) { // C/S only i_trans = a_trans; i_name = name; _fieldMetadata = fieldMetadata; i_classMetadataID = classMetadataID; _fieldHandle = a_index; if (_fieldMetadata != null) { if (!_fieldMetadata.Alive()) { _fieldMetadata = null; } } } public virtual string Name() { return i_name; } internal virtual object Coerce(object a_object) { IReflectClass claxx = null; if (a_object != null) { if (a_object is IReflectClass) { claxx = (IReflectClass)a_object; } else { claxx = i_trans.Reflector().ForObject(a_object); } } else { // TODO: Review this line for NullableArrayHandling return a_object; } if (_fieldMetadata == null) { return a_object; } return _fieldMetadata.Coerce(claxx, a_object); } internal virtual ClassMetadata GetFieldType() { if (_fieldMetadata != null) { return _fieldMetadata.FieldType(); } return null; } public virtual FieldMetadata GetFieldMetadata() { return _fieldMetadata; } internal virtual bool IsArray() { return _fieldMetadata != null && Handlers4.HandlesArray(_fieldMetadata.GetHandler ()); } internal virtual bool IsClass() { return _fieldMetadata == null || Handlers4.HandlesClass(_fieldMetadata.GetHandler ()); } internal virtual bool IsQueryLeaf() { return _fieldMetadata != null && Handlers4.IsQueryLeaf(_fieldMetadata.GetHandler( )); } internal virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { if (_fieldMetadata != null) { return _fieldMetadata.PrepareComparison(context, obj); } if (obj == null) { return Null.Instance; } ClassMetadata yc = i_trans.Container().ProduceClassMetadata(i_trans.Reflector().ForObject (obj)); FieldMetadata yf = yc.FieldMetadataForName(Name()); if (yf != null) { return yf.PrepareComparison(context, obj); } return null; } internal virtual void Unmarshall(Transaction a_trans) { if (i_classMetadataID != 0) { ClassMetadata yc = a_trans.Container().ClassMetadataForID(i_classMetadataID); _fieldMetadata = (FieldMetadata)yc._aspects[_fieldHandle]; } } public virtual void Visit(object obj) { ((QCandidate)obj).UseField(this); } public override string ToString() { if (_fieldMetadata != null) { return "QField " + _fieldMetadata.ToString(); } return base.ToString(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEAbstract.cs0000644000175000017500000000070611700531646032212 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public abstract class QEAbstract : QE { internal override QE Add(QE evaluator) { QE qe = new QEMulti(); qe.Add(this); qe.Add(evaluator); return qe; } internal override bool IsDefault() { return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/IInternalQuery.cs0000644000175000017500000000043611700531646033134 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Query.Processor { /// public interface IInternalQuery { IInternalObjectContainer Container { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConJoin.cs0000644000175000017500000000623711700531646031706 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// Join constraint on queries /// public class QConJoin : QCon { private bool i_and; private QCon i_constraint1; private QCon i_constraint2; public QConJoin() { } internal QConJoin(Transaction a_trans, QCon a_c1, QCon a_c2, bool a_and) : base(a_trans ) { // FIELDS MUST BE PUBLIC TO BE REFLECTED ON UNDER JDK <= 1.1 // C/S i_constraint1 = a_c1; i_constraint2 = a_c2; i_and = a_and; } public virtual QCon Constraint2() { return i_constraint2; } public virtual QCon Constraint1() { return i_constraint1; } internal override void DoNotInclude(QCandidate a_root) { Constraint1().DoNotInclude(a_root); Constraint2().DoNotInclude(a_root); } internal override void ExchangeConstraint(QCon a_exchange, QCon a_with) { base.ExchangeConstraint(a_exchange, a_with); if (a_exchange == Constraint1()) { i_constraint1 = a_with; } if (a_exchange == Constraint2()) { i_constraint2 = a_with; } } internal virtual void EvaluatePending(QCandidate a_root, QPending a_pending, int a_secondResult) { bool res = i_evaluator.Not(i_and ? ((a_pending._result + a_secondResult) > 0) : ( a_pending._result + a_secondResult) > QPending.False); if (HasJoins()) { IEnumerator i = IterateJoins(); while (i.MoveNext()) { Db4objects.Db4o.Internal.Query.Processor.QConJoin qcj = (Db4objects.Db4o.Internal.Query.Processor.QConJoin )i.Current; a_root.Evaluate(new QPending(qcj, this, res)); } } else { if (!res) { Constraint1().DoNotInclude(a_root); Constraint2().DoNotInclude(a_root); } } } public virtual QCon GetOtherConstraint(QCon a_constraint) { if (a_constraint == Constraint1()) { return Constraint2(); } else { if (a_constraint == Constraint2()) { return Constraint1(); } } throw new ArgumentException(); } internal override string LogObject() { return string.Empty; } internal virtual bool RemoveForParent(QCon a_constraint) { if (i_and) { QCon other = GetOtherConstraint(a_constraint); other.RemoveJoin(this); // prevents circular call other.Remove(); return true; } return false; } public override string ToString() { string str = "QConJoin " + (i_and ? "AND " : "OR"); if (Constraint1() != null) { str += "\n " + Constraint1(); } if (Constraint2() != null) { str += "\n " + Constraint2(); } return str; } public virtual bool IsOr() { return !i_and; } public override void SetProcessedByIndex() { if (ProcessedByIndex()) { return; } base.SetProcessedByIndex(); Constraint1().SetProcessedByIndex(); Constraint2().SetProcessedByIndex(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConObject.cs0000644000175000017500000003000311700531646032201 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Query.Processor { /// Object constraint on queries /// public class QConObject : QCon { private object i_object; private int i_objectID; [System.NonSerialized] internal ClassMetadata _classMetadata; private int i_classMetadataID; private QField i_field; [System.NonSerialized] internal IPreparedComparison _preparedComparison; private IObjectAttribute i_attributeProvider; [System.NonSerialized] private bool _checkClassMetadataOnly = false; public QConObject() { } public QConObject(Transaction a_trans, QCon a_parent, QField a_field, object a_object ) : base(a_trans) { // the constraining object // cache for the db4o object ID // the YapClass // needed for marshalling the request // C/S only i_parent = a_parent; if (a_object is ICompare) { a_object = ((ICompare)a_object).Compare(); } i_object = a_object; i_field = a_field; } private void AssociateYapClass(Transaction a_trans, object a_object) { if (a_object == null) { } else { //It seems that we need not result the following field //i_object = null; //i_comparator = Null.INSTANCE; //i_classMetadata = null; // FIXME: Setting the YapClass to null will prevent index use // If the field is typed we can guess the right one with the // following line. However this does break some SODA test cases. // Revisit! // if(i_field != null){ // i_classMetadata = i_field.getYapClass(); // } _classMetadata = a_trans.Container().ProduceClassMetadata(a_trans.Reflector().ForObject (a_object)); if (_classMetadata != null) { i_object = _classMetadata.GetComparableObject(a_object); if (a_object != i_object) { i_attributeProvider = _classMetadata.Config().QueryAttributeProvider(); _classMetadata = a_trans.Container().ProduceClassMetadata(a_trans.Reflector().ForObject (i_object)); } if (_classMetadata != null) { _classMetadata.CollectConstraints(a_trans, this, i_object, new _IVisitor4_84(this )); } else { AssociateYapClass(a_trans, null); } } else { AssociateYapClass(a_trans, null); } } } private sealed class _IVisitor4_84 : IVisitor4 { public _IVisitor4_84(QConObject _enclosing) { this._enclosing = _enclosing; } public void Visit(object obj) { this._enclosing.AddConstraint((QCon)obj); } private readonly QConObject _enclosing; } public override bool CanBeIndexLeaf() { return i_object == null || ((_classMetadata != null && _classMetadata.IsValueType ()) || Evaluator().Identity()); } public override bool CanLoadByIndex() { if (i_field == null) { return false; } if (i_field._fieldMetadata == null) { return false; } if (!i_field._fieldMetadata.HasIndex()) { return false; } if (!i_evaluator.SupportsIndex()) { return false; } return i_field._fieldMetadata.CanLoadByIndex(); } internal override bool Evaluate(QCandidate a_candidate) { try { return a_candidate.Evaluate(this, i_evaluator); } catch (Exception e) { return false; } } internal override void EvaluateEvaluationsExec(QCandidates a_candidates, bool rereadObject ) { if (i_field.IsQueryLeaf()) { bool hasEvaluation = false; IEnumerator i = IterateChildren(); while (i.MoveNext()) { if (i.Current is QConEvaluation) { hasEvaluation = true; break; } } if (hasEvaluation) { a_candidates.Traverse(i_field); IEnumerator j = IterateChildren(); while (j.MoveNext()) { ((QCon)j.Current).EvaluateEvaluationsExec(a_candidates, false); } } } } internal override void EvaluateSelf() { if (DTrace.enabled) { DTrace.EvaluateSelf.Log(Id()); } if (_classMetadata != null) { if (!(_classMetadata is PrimitiveTypeMetadata)) { if (!i_evaluator.Identity() && (_classMetadata.TypeHandler() is StandardReferenceTypeHandler )) { _checkClassMetadataOnly = true; } object transactionalObject = _classMetadata.WrapWithTransactionContext(Transaction (), i_object); _preparedComparison = _classMetadata.PrepareComparison(Context(), transactionalObject ); } } base.EvaluateSelf(); _checkClassMetadataOnly = false; } private IContext Context() { return Transaction().Context(); } internal override void Collect(QCandidates a_candidates) { if (i_field.IsClass()) { a_candidates.Traverse(i_field); a_candidates.Filter(i_candidates); } } internal override void EvaluateSimpleExec(QCandidates a_candidates) { // TODO: The following can be skipped if we used the index on // this field to load the objects, if hasOrdering() is false if (i_field.IsQueryLeaf() || IsNullConstraint()) { a_candidates.Traverse(i_field); PrepareComparison(i_field); a_candidates.Filter(this); } } internal virtual IPreparedComparison PrepareComparison(QCandidate candidate) { if (_preparedComparison != null) { return _preparedComparison; } return candidate.PrepareComparison(Container(), i_object); } internal override ClassMetadata GetYapClass() { return _classMetadata; } public override QField GetField() { return i_field; } internal virtual int GetObjectID() { if (i_objectID == 0) { i_objectID = i_trans.Container().GetID(i_trans, i_object); if (i_objectID == 0) { i_objectID = -1; } } return i_objectID; } public override bool HasObjectInParentPath(object obj) { if (obj == i_object) { return true; } return base.HasObjectInParentPath(obj); } public override int IdentityID() { if (i_evaluator.Identity()) { int id = GetObjectID(); if (id != 0) { if (!(i_evaluator is QENot)) { return id; } } } return 0; } internal override bool IsNullConstraint() { return i_object == null; } internal override void Log(string indent) { } internal override string LogObject() { return string.Empty; } internal override void Marshall() { base.Marshall(); GetObjectID(); if (_classMetadata != null) { i_classMetadataID = _classMetadata.GetID(); } } public override bool OnSameFieldAs(QCon other) { if (!(other is Db4objects.Db4o.Internal.Query.Processor.QConObject)) { return false; } return i_field == ((Db4objects.Db4o.Internal.Query.Processor.QConObject)other).i_field; } internal virtual void PrepareComparison(QField a_field) { if (IsNullConstraint() & !a_field.IsArray()) { _preparedComparison = Null.Instance; } else { _preparedComparison = a_field.PrepareComparison(Context(), i_object); } } internal override void RemoveChildrenJoins() { base.RemoveChildrenJoins(); _children = null; } internal override QCon ShareParent(object a_object, BooleanByRef removeExisting) { if (i_parent == null) { return null; } object obj = i_field.Coerce(a_object); if (obj == No4.Instance) { return null; } return i_parent.AddSharedConstraint(i_field, obj); } internal override QConClass ShareParentForClass(IReflectClass a_class, BooleanByRef removeExisting) { if (i_parent == null) { return null; } QConClass newConstraint = new QConClass(i_trans, i_parent, i_field, a_class); i_parent.AddConstraint(newConstraint); return newConstraint; } internal object Translate(object candidate) { if (i_attributeProvider != null) { i_candidates.i_trans.Container().Activate(i_candidates.i_trans, candidate); return i_attributeProvider.Attribute(candidate); } return candidate; } internal override void Unmarshall(Transaction trans) { if (i_trans != null) { return; } base.Unmarshall(trans); if (i_object == null) { _preparedComparison = Null.Instance; } if (i_classMetadataID != 0) { _classMetadata = trans.Container().ClassMetadataForID(i_classMetadataID); } if (i_field != null) { i_field.Unmarshall(trans); } if (i_objectID > 0) { object obj = trans.Container().TryGetByID(trans, i_objectID); if (obj != null) { i_object = obj; } } } public override void Visit(object obj) { QCandidate qc = (QCandidate)obj; bool res = true; bool processed = false; if (_checkClassMetadataOnly) { ClassMetadata yc = qc.ReadClassMetadata(); if (yc != null) { res = i_evaluator.Not(_classMetadata.GetHigherHierarchy(yc) == _classMetadata); processed = true; } } if (!processed) { res = Evaluate(qc); } Visit1(qc.GetRoot(), this, res); } public override IConstraint Contains() { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QEContains(true)); return this; } } public override IConstraint Equal() { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QEEqual()); return this; } } public override object GetObject() { return i_object; } public override IConstraint Greater() { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QEGreater()); return this; } } public override IConstraint Identity() { lock (StreamLock()) { if (i_object == null) { return this; } GetObjectID(); // TODO: this may not be correct for NOT // It may be necessary to add an if(i_evaluator.identity()) RemoveChildrenJoins(); i_evaluator = i_evaluator.Add(new QEIdentity()); return this; } } public override IConstraint ByExample() { lock (StreamLock()) { AssociateYapClass(i_trans, i_object); return this; } } internal virtual void SetEvaluationMode() { if ((i_object == null) || EvaluationModeAlreadySet()) { return; } int id = GetObjectID(); if (id < 0) { ByExample(); } else { _classMetadata = i_trans.Container().ProduceClassMetadata(i_trans.Reflector().ForObject (i_object)); Identity(); } } internal virtual bool EvaluationModeAlreadySet() { return _classMetadata != null; } public override IConstraint Like() { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QEContains(false)); return this; } } public override IConstraint Smaller() { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QESmaller()); return this; } } public override IConstraint StartsWith(bool caseSensitive) { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QEStartsWith(caseSensitive)); return this; } } public override IConstraint EndsWith(bool caseSensitive) { lock (StreamLock()) { i_evaluator = i_evaluator.Add(new QEEndsWith(caseSensitive)); return this; } } public override string ToString() { string str = "QConObject "; if (i_object != null) { str += i_object.ToString(); } return str; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConEvaluation.cs0000644000175000017500000000527511700531646033117 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QConEvaluation : QCon { [System.NonSerialized] private object i_evaluation; private byte[] i_marshalledEvaluation; private int i_marshalledID; public QConEvaluation() { } public QConEvaluation(Transaction a_trans, object a_evaluation) : base(a_trans) { // C/S only i_evaluation = a_evaluation; } internal override void EvaluateEvaluationsExec(QCandidates a_candidates, bool rereadObject ) { if (rereadObject) { a_candidates.Traverse(new _IVisitor4_31()); } a_candidates.Filter(this); } private sealed class _IVisitor4_31 : IVisitor4 { public _IVisitor4_31() { } public void Visit(object a_object) { ((QCandidate)a_object).UseField(null); } } internal override void Marshall() { base.Marshall(); if (!Platform4.UseNativeSerialization()) { MarshallUsingDb4oFormat(); } else { try { i_marshalledEvaluation = Platform4.Serialize(i_evaluation); } catch (Exception) { MarshallUsingDb4oFormat(); } } } private void MarshallUsingDb4oFormat() { SerializedGraph serialized = Serializer.Marshall(Container(), i_evaluation); i_marshalledEvaluation = serialized._bytes; i_marshalledID = serialized._id; } internal override void Unmarshall(Transaction a_trans) { if (i_trans == null) { base.Unmarshall(a_trans); if (i_marshalledID > 0 || !Platform4.UseNativeSerialization()) { i_evaluation = Serializer.Unmarshall(Container(), i_marshalledEvaluation, i_marshalledID ); } else { i_evaluation = Platform4.Deserialize(i_marshalledEvaluation); } } } public override void Visit(object obj) { QCandidate candidate = (QCandidate)obj; // force activation outside the try block // so any activation errors bubble up ForceActivation(candidate); try { Platform4.EvaluationEvaluate(i_evaluation, candidate); } catch (Exception) { candidate.Include(false); } // TODO: implement Exception callback for the user coder // at least for test cases if (!candidate._include) { DoNotInclude(candidate.GetRoot()); } } private void ForceActivation(QCandidate candidate) { candidate.GetObject(); } internal virtual bool SupportsIndex() { return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QPending.cs0000644000175000017500000000312711700531646031726 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// internal class QPending : Tree { internal readonly QConJoin _join; internal QCon _constraint; internal int _result; internal const int False = -4; internal const int Both = 1; internal const int True = 2; internal QPending(QConJoin a_join, QCon a_constraint, bool a_firstResult) { // Constants, so QConJoin.evaluatePending is made easy: _join = a_join; _constraint = a_constraint; _result = a_firstResult ? True : False; } public override int Compare(Tree a_to) { return _constraint.Id() - ((Db4objects.Db4o.Internal.Query.Processor.QPending)a_to )._constraint.Id(); } internal virtual void ChangeConstraint() { _constraint = _join.GetOtherConstraint(_constraint); } public override object ShallowClone() { Db4objects.Db4o.Internal.Query.Processor.QPending pending = InternalClonePayload( ); base.ShallowCloneInternal(pending); return pending; } internal virtual Db4objects.Db4o.Internal.Query.Processor.QPending InternalClonePayload () { Db4objects.Db4o.Internal.Query.Processor.QPending pending = new Db4objects.Db4o.Internal.Query.Processor.QPending (_join, _constraint, false); pending._result = _result; return pending; } public override object Key() { throw new NotImplementedException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConstraints.cs0000644000175000017500000000641111700531646032650 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query.Processor { /// Array of constraints for queries. /// /// Array of constraints for queries. /// Necessary to be returned to Query#constraints() /// /// public class QConstraints : QCon, IConstraints { private IConstraint[] i_constraints; internal QConstraints(Transaction a_trans, IConstraint[] constraints) : base(a_trans ) { i_constraints = constraints; } internal override IConstraint Join(IConstraint a_with, bool a_and) { lock (StreamLock()) { if (!(a_with is QCon)) { return null; } // resolving multiple constraints happens in QCon for // a_with, so we simply turn things around return ((QCon)a_with).Join1(this, a_and); } } public virtual IConstraint[] ToArray() { lock (StreamLock()) { return i_constraints; } } public override IConstraint Contains() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Contains(); } return this; } } public override IConstraint Equal() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Equal(); } return this; } } public override IConstraint Greater() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Greater(); } return this; } } public override IConstraint Identity() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Identity(); } return this; } } public override IConstraint Not() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Not(); } return this; } } public override IConstraint Like() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Like(); } return this; } } public override IConstraint StartsWith(bool caseSensitive) { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].StartsWith(caseSensitive); } return this; } } public override IConstraint EndsWith(bool caseSensitive) { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].EndsWith(caseSensitive); } return this; } } public override IConstraint Smaller() { lock (StreamLock()) { for (int i = 0; i < i_constraints.Length; i++) { i_constraints[i].Smaller(); } return this; } } public override object GetObject() { lock (StreamLock()) { object[] objects = new object[i_constraints.Length]; for (int i = 0; i < i_constraints.Length; i++) { objects[i] = i_constraints[i].GetObject(); } return objects; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEContains.cs0000644000175000017500000000104411700531646032221 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEContains : QEStringCmp { /// for C/S messaging only public QEContains() { } public QEContains(bool caseSensitive_) : base(caseSensitive_) { } protected override bool CompareStrings(string candidate, string constraint) { return candidate.IndexOf(constraint) > -1; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConPath.cs0000644000175000017500000000771511700531646031705 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Query.Processor { /// /// Placeholder for a constraint, only necessary to attach children /// to the query graph. /// /// /// Placeholder for a constraint, only necessary to attach children /// to the query graph. /// Added upon a call to Query#descend(), if there is no /// other place to hook up a new constraint. /// /// public class QConPath : QConClass { public QConPath() { } internal QConPath(Transaction a_trans, QCon a_parent, QField a_field) : base(a_trans , a_parent, a_field, null) { if (a_field != null) { _classMetadata = a_field.GetFieldType(); } } public override bool CanLoadByIndex() { return false; } internal override bool Evaluate(QCandidate a_candidate) { if (!a_candidate.FieldIsAvailable()) { VisitOnNull(a_candidate.GetRoot()); } return true; } internal override void EvaluateSelf() { } // do nothing internal override bool IsNullConstraint() { return !HasChildren(); } internal override QConClass ShareParentForClass(IReflectClass a_class, BooleanByRef removeExisting) { if (i_parent == null) { return null; } QConClass newConstraint = new QConClass(i_trans, i_parent, GetField(), a_class); Morph(removeExisting, newConstraint, a_class); return newConstraint; } internal override QCon ShareParent(object a_object, BooleanByRef removeExisting) { if (i_parent == null) { return null; } object obj = GetField().Coerce(a_object); if (obj == No4.Instance) { QCon falseConstraint = new QConUnconditional(i_trans, false); Morph(removeExisting, falseConstraint, ReflectClassForObject(obj)); return falseConstraint; } QConObject newConstraint = new QConObject(i_trans, i_parent, GetField(), obj); Morph(removeExisting, newConstraint, ReflectClassForObject(obj)); return newConstraint; } private IReflectClass ReflectClassForObject(object obj) { return i_trans.Reflector().ForObject(obj); } // Our QConPath objects are just placeholders to fields, // so the parents are reachable. // If we find a "real" constraint, we throw the QPath // out and replace it with the other constraint. private void Morph(BooleanByRef removeExisting, QCon newConstraint, IReflectClass claxx) { bool mayMorph = true; if (claxx != null) { ClassMetadata yc = i_trans.Container().ProduceClassMetadata(claxx); if (yc != null) { IEnumerator i = IterateChildren(); while (i.MoveNext()) { QField qf = ((QCon)i.Current).GetField(); if (!yc.HasField(i_trans.Container(), qf.Name())) { mayMorph = false; break; } } } } // } if (mayMorph) { IEnumerator j = IterateChildren(); while (j.MoveNext()) { newConstraint.AddConstraint((QCon)j.Current); } if (HasJoins()) { IEnumerator k = IterateJoins(); while (k.MoveNext()) { QConJoin qcj = (QConJoin)k.Current; qcj.ExchangeConstraint(this, newConstraint); newConstraint.AddJoin(qcj); } } i_parent.ExchangeConstraint(this, newConstraint); removeExisting.value = true; } else { i_parent.AddConstraint(newConstraint); } } internal sealed override bool VisitSelfOnNull() { return false; } public override string ToString() { return "QConPath " + base.ToString(); } public override void SetProcessedByIndex() { if (ChildrenCount() <= 1) { InternalSetProcessedByIndex(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEIdentity.cs0000644000175000017500000000110511700531646032232 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEIdentity : QEEqual { private int i_objectID; public override bool Identity() { return true; } internal override bool Evaluate(QConObject a_constraint, QCandidate a_candidate, object a_value) { if (i_objectID == 0) { i_objectID = a_constraint.GetObjectID(); } return a_candidate._key == i_objectID; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QE.cs0000644000175000017500000000421011700531646030520 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Internal.Query.Processor { /// Query Evaluator - Represents such things as >, >=, <, <=, EQUAL, LIKE, etc. /// /// Query Evaluator - Represents such things as >, >=, <, <=, EQUAL, LIKE, etc. /// /// public class QE : IUnversioned { internal static readonly QE Default = new QE(); public const int Nulls = 0; public const int Smaller = 1; public const int Equal = 2; public const int Greater = 3; internal virtual QE Add(QE evaluator) { return evaluator; } public virtual bool Identity() { return false; } internal virtual bool IsDefault() { return true; } internal virtual bool Evaluate(QConObject constraint, QCandidate candidate, object obj) { IPreparedComparison prepareComparison = constraint.PrepareComparison(candidate); if (obj == null) { return prepareComparison is Null; } if (prepareComparison is PreparedArrayContainsComparison) { return ((PreparedArrayContainsComparison)prepareComparison).IsEqual(obj); } return prepareComparison.CompareTo(obj) == 0; } public override bool Equals(object obj) { return obj != null && obj.GetType() == this.GetType(); } public override int GetHashCode() { return GetType().GetHashCode(); } // overridden in QENot internal virtual bool Not(bool res) { return res; } /// Specifies which part of the index to take. /// /// Specifies which part of the index to take. /// Array elements: /// [0] - smaller /// [1] - equal /// [2] - greater /// [3] - nulls /// /// public virtual void IndexBitMap(bool[] bits) { bits[QE.Equal] = true; } public virtual bool SupportsIndex() { return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QESmaller.cs0000644000175000017500000000153711700531646032051 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QESmaller : QEAbstract { internal override bool Evaluate(QConObject constraint, QCandidate candidate, object obj) { if (obj == null) { return false; } IPreparedComparison preparedComparison = constraint.PrepareComparison(candidate); if (preparedComparison is PreparedArrayContainsComparison) { return ((PreparedArrayContainsComparison)preparedComparison).IsGreaterThan(obj); } return preparedComparison.CompareTo(obj) > 0; } public override void IndexBitMap(bool[] bits) { bits[QE.Smaller] = true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEStartsWith.cs0000644000175000017500000000105211700531646032556 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEStartsWith : QEStringCmp { /// for C/S messaging only public QEStartsWith() { } public QEStartsWith(bool caseSensitive_) : base(caseSensitive_) { } protected override bool CompareStrings(string candidate, string constraint) { return candidate.IndexOf(constraint) == 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QENot.cs0000644000175000017500000000244311700531646031207 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QENot : QE { private QE i_evaluator; public QENot() { } internal QENot(QE a_evaluator) { // CS i_evaluator = a_evaluator; } internal override QE Add(QE evaluator) { if (!(evaluator is Db4objects.Db4o.Internal.Query.Processor.QENot)) { i_evaluator = i_evaluator.Add(evaluator); } return this; } public virtual QE Evaluator() { return i_evaluator; } public override bool Identity() { return i_evaluator.Identity(); } internal override bool IsDefault() { return false; } internal override bool Evaluate(QConObject a_constraint, QCandidate a_candidate, object a_value) { return !i_evaluator.Evaluate(a_constraint, a_candidate, a_value); } internal override bool Not(bool res) { return !res; } public override void IndexBitMap(bool[] bits) { i_evaluator.IndexBitMap(bits); for (int i = 0; i < 4; i++) { bits[i] = !bits[i]; } } public override bool SupportsIndex() { return i_evaluator.SupportsIndex(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEGreater.cs0000644000175000017500000000153711700531646032043 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public class QEGreater : QEAbstract { internal override bool Evaluate(QConObject constraint, QCandidate candidate, object obj) { if (obj == null) { return false; } IPreparedComparison preparedComparison = constraint.PrepareComparison(candidate); if (preparedComparison is PreparedArrayContainsComparison) { return ((PreparedArrayContainsComparison)preparedComparison).IsSmallerThan(obj); } return preparedComparison.CompareTo(obj) < 0; } public override void IndexBitMap(bool[] bits) { bits[QE.Greater] = true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QConClass.cs0000644000175000017500000000707411700531646032054 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Query.Processor { /// Class constraint on queries /// public class QConClass : QConObject { [System.NonSerialized] private IReflectClass _claxx; private string _className; private bool i_equal; public QConClass() { } internal QConClass(Transaction a_trans, QCon a_parent, QField a_field, IReflectClass claxx) : base(a_trans, a_parent, a_field, null) { // C/S if (claxx != null) { _classMetadata = a_trans.Container().ProduceClassMetadata(claxx); if (claxx.Equals(a_trans.Container()._handlers.IclassObject)) { _classMetadata = (ClassMetadata)_classMetadata.TypeHandler(); } } _claxx = claxx; } internal QConClass(Transaction trans, IReflectClass claxx) : this(trans, null, null , claxx) { } public virtual string GetClassName() { return _claxx == null ? null : _claxx.GetName(); } public override bool CanBeIndexLeaf() { return false; } internal override bool Evaluate(QCandidate a_candidate) { bool res = true; IReflectClass claxx = a_candidate.ClassReflector(); if (claxx == null) { res = false; } else { res = i_equal ? _claxx.Equals(claxx) : _claxx.IsAssignableFrom(claxx); } return i_evaluator.Not(res); } internal override void EvaluateSelf() { // optimization for simple class queries: // No instantiation of objects, if not necessary. // Does not handle the special comparison of the // Compare interface. // if (i_candidates.WasLoadedFromClassIndex()) { if (i_evaluator.IsDefault()) { if (!HasJoins()) { if (_classMetadata != null && i_candidates.i_classMetadata != null) { if (_classMetadata.GetHigherHierarchy(i_candidates.i_classMetadata) == _classMetadata) { return; } } } } } i_candidates.Filter(this); } public override IConstraint Equal() { lock (StreamLock()) { i_equal = true; return this; } } internal override bool IsNullConstraint() { return false; } internal override string LogObject() { return string.Empty; } internal override void Marshall() { base.Marshall(); if (_claxx != null) { _className = Container().Config().ResolveAliasRuntimeName(_claxx.GetName()); } } public override string ToString() { string str = "QConClass "; if (_claxx != null) { str += _claxx.GetName() + " "; } return str + base.ToString(); } internal override void Unmarshall(Transaction a_trans) { if (i_trans == null) { base.Unmarshall(a_trans); if (_className != null) { _className = Container().Config().ResolveAliasStoredName(_className); _claxx = a_trans.Reflector().ForName(_className); } } } internal override void SetEvaluationMode() { IEnumerator children = IterateChildren(); while (children.MoveNext()) { object child = children.Current; if (child is QConObject) { ((QConObject)child).SetEvaluationMode(); } } } public override void SetProcessedByIndex() { } // do nothing, QConClass needs to stay in the evaluation graph. } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Processor/QEStringCmp.cs0000644000175000017500000000237611700531646032362 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal.Query.Processor { /// public abstract class QEStringCmp : QEAbstract { private bool caseSensitive; /// for C/S messaging only public QEStringCmp() { } public QEStringCmp(bool caseSensitive_) { caseSensitive = caseSensitive_; } internal override bool Evaluate(QConObject constraint, QCandidate candidate, object obj) { if (obj != null) { if (obj is ByteArrayBuffer) { obj = candidate.ReadString((ByteArrayBuffer)obj); } string candidateStringValue = obj.ToString(); string stringConstraint = constraint.GetObject().ToString(); if (!caseSensitive) { candidateStringValue = candidateStringValue.ToLower(); stringConstraint = stringConstraint.ToLower(); } return CompareStrings(candidateStringValue, stringConstraint); } return constraint.GetObject() == null; } public override bool SupportsIndex() { return false; } protected abstract bool CompareStrings(string candidate, string constraint); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/0000755000175000017500000000000011700531646027166 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/IQueryResult.cs0000644000175000017500000000107011700531646032130 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query.Result { /// public interface IQueryResult : IEnumerable { object Get(int index); IIntIterator4 IterateIDs(); object Lock(); IExtObjectContainer ObjectContainer(); int IndexOf(int id); int Size(); void Sort(IQueryComparator cmp); void SortIds(IIntComparator cmp); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/StatefulQueryResult.cs0000644000175000017500000000423411700531646033534 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query.Result { /// public class StatefulQueryResult : IEnumerable { private readonly IQueryResult _delegate; private readonly Iterable4Adaptor _iterable; public StatefulQueryResult(IQueryResult queryResult) { _delegate = queryResult; _iterable = new Iterable4Adaptor(queryResult); } public virtual object Get(int index) { lock (Lock()) { return _delegate.Get(index); } } public virtual long[] GetIDs() { lock (Lock()) { long[] ids = new long[Size()]; int i = 0; IIntIterator4 iterator = _delegate.IterateIDs(); while (iterator.MoveNext()) { ids[i++] = iterator.CurrentInt(); } return ids; } } public virtual bool HasNext() { lock (Lock()) { return _iterable.HasNext(); } } public virtual object Next() { lock (Lock()) { return _iterable.Next(); } } public virtual void Reset() { lock (Lock()) { _iterable.Reset(); } } public virtual int Size() { lock (Lock()) { return _delegate.Size(); } } public virtual void Sort(IQueryComparator cmp) { lock (Lock()) { _delegate.Sort(cmp); } } public virtual object Lock() { return _delegate.Lock(); } internal virtual IExtObjectContainer ObjectContainer() { return _delegate.ObjectContainer(); } public virtual int IndexOf(object a_object) { lock (Lock()) { int id = (int)ObjectContainer().GetID(a_object); if (id <= 0) { return -1; } return _delegate.IndexOf(id); } } public virtual IEnumerator IterateIDs() { lock (Lock()) { return _delegate.IterateIDs(); } } public virtual IEnumerator GetEnumerator() { lock (Lock()) { return _delegate.GetEnumerator(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/AbstractQueryResult.cs0000644000175000017500000001060211700531646033504 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query.Result { /// public abstract class AbstractQueryResult : IQueryResult { protected readonly Db4objects.Db4o.Internal.Transaction _transaction; public AbstractQueryResult(Db4objects.Db4o.Internal.Transaction transaction) { _transaction = transaction; } public object Activate(object obj) { Stream().Activate(_transaction, obj); return obj; } public object ActivatedObject(int id) { ObjectContainerBase stream = Stream(); object ret = stream.GetActivatedObjectFromCache(_transaction, id); if (ret != null) { return ret; } return stream.ReadActivatedObjectNotInCache(_transaction, id); } public virtual object Lock() { ObjectContainerBase stream = Stream(); stream.CheckClosed(); return stream.Lock(); } public virtual ObjectContainerBase Stream() { return _transaction.Container(); } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return _transaction; } public virtual IExtObjectContainer ObjectContainer() { return Transaction().ObjectContainer().Ext(); } public virtual IEnumerator GetEnumerator() { return new _MappingIterator_56(this, IterateIDs()); } private sealed class _MappingIterator_56 : MappingIterator { public _MappingIterator_56(AbstractQueryResult _enclosing, IEnumerator baseArg1) : base(baseArg1) { this._enclosing = _enclosing; } protected override object Map(object current) { if (current == null) { return Iterators.Skip; } lock (this._enclosing.Lock()) { object obj = this._enclosing.ActivatedObject(((int)current)); if (obj == null) { return Iterators.Skip; } return obj; } } private readonly AbstractQueryResult _enclosing; } public virtual Db4objects.Db4o.Internal.Query.Result.AbstractQueryResult SupportSize () { return this; } public virtual Db4objects.Db4o.Internal.Query.Result.AbstractQueryResult SupportSort () { return this; } public virtual Db4objects.Db4o.Internal.Query.Result.AbstractQueryResult SupportElementAccess () { return this; } protected virtual int KnownSize() { return Size(); } public virtual Db4objects.Db4o.Internal.Query.Result.AbstractQueryResult ToIdList () { IdListQueryResult res = new IdListQueryResult(Transaction(), KnownSize()); IIntIterator4 i = IterateIDs(); while (i.MoveNext()) { res.Add(i.CurrentInt()); } return res; } protected virtual Db4objects.Db4o.Internal.Query.Result.AbstractQueryResult ToIdTree () { return new IdTreeQueryResult(Transaction(), IterateIDs()); } public virtual Config4Impl Config() { return Stream().Config(); } public virtual int Size() { throw new NotImplementedException(); } public virtual void Sort(IQueryComparator cmp) { throw new NotImplementedException(); } public virtual void SortIds(IIntComparator cmp) { throw new NotImplementedException(); } public virtual object Get(int index) { throw new NotImplementedException(); } /// public virtual int GetId(int i) { throw new NotImplementedException(); } public virtual int IndexOf(int id) { throw new NotImplementedException(); } /// public virtual void LoadFromClassIndex(ClassMetadata c) { throw new NotImplementedException(); } /// public virtual void LoadFromClassIndexes(ClassMetadataIterator i) { throw new NotImplementedException(); } /// public virtual void LoadFromIdReader(IEnumerator ids) { throw new NotImplementedException(); } /// public virtual void LoadFromQuery(QQuery q) { throw new NotImplementedException(); } public abstract IIntIterator4 IterateIDs(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/IdListQueryResult.cs0000644000175000017500000001316211700531646033135 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Query.Result { /// public class IdListQueryResult : AbstractQueryResult, IVisitor4 { private Tree _candidates; private bool _checkDuplicates; public IntArrayList _ids; public IdListQueryResult(Transaction trans, int initialSize) : base(trans) { _ids = new IntArrayList(initialSize); } public IdListQueryResult(Transaction trans) : this(trans, 0) { } public override IIntIterator4 IterateIDs() { return _ids.IntIterator(); } public override object Get(int index) { lock (Lock()) { return ActivatedObject(GetId(index)); } } public override int GetId(int index) { if (index < 0 || index >= Size()) { throw new Db4oRecoverableException(new IndexOutOfRangeException()); } return _ids.Get(index); } public void CheckDuplicates() { _checkDuplicates = true; } public virtual void Visit(object a_tree) { QCandidate candidate = (QCandidate)a_tree; if (candidate.Include()) { AddKeyCheckDuplicates(candidate._key); } } public virtual void AddKeyCheckDuplicates(int a_key) { if (_checkDuplicates) { TreeInt newNode = new TreeInt(a_key); _candidates = Tree.Add(_candidates, newNode); if (newNode._size == 0) { return; } } Add(a_key); } public override void Sort(IQueryComparator cmp) { Algorithms4.Sort(new _ISortable4_74(this, cmp)); } private sealed class _ISortable4_74 : ISortable4 { public _ISortable4_74(IdListQueryResult _enclosing, IQueryComparator cmp) { this._enclosing = _enclosing; this.cmp = cmp; } public void Swap(int leftIndex, int rightIndex) { this._enclosing._ids.Swap(leftIndex, rightIndex); } public int Size() { return this._enclosing.Size(); } public int Compare(int leftIndex, int rightIndex) { return cmp.Compare(this._enclosing.Get(leftIndex), this._enclosing.Get(rightIndex )); } private readonly IdListQueryResult _enclosing; private readonly IQueryComparator cmp; } public override void SortIds(IIntComparator cmp) { Algorithms4.Sort(new _ISortable4_88(this, cmp)); } private sealed class _ISortable4_88 : ISortable4 { public _ISortable4_88(IdListQueryResult _enclosing, IIntComparator cmp) { this._enclosing = _enclosing; this.cmp = cmp; } public void Swap(int leftIndex, int rightIndex) { this._enclosing._ids.Swap(leftIndex, rightIndex); } public int Size() { return this._enclosing.Size(); } public int Compare(int leftIndex, int rightIndex) { return cmp.Compare(this._enclosing._ids.Get(leftIndex), this._enclosing._ids.Get( rightIndex)); } private readonly IdListQueryResult _enclosing; private readonly IIntComparator cmp; } public override void LoadFromClassIndex(ClassMetadata clazz) { IClassIndexStrategy index = clazz.Index(); if (index is BTreeClassIndexStrategy) { BTree btree = ((BTreeClassIndexStrategy)index).Btree(); _ids = new IntArrayList(btree.Size(Transaction())); } index.TraverseAll(_transaction, new _IVisitor4_107(this)); } private sealed class _IVisitor4_107 : IVisitor4 { public _IVisitor4_107(IdListQueryResult _enclosing) { this._enclosing = _enclosing; } public void Visit(object a_object) { this._enclosing.Add(((int)a_object)); } private readonly IdListQueryResult _enclosing; } public override void LoadFromQuery(QQuery query) { query.ExecuteLocal(this); } public override void LoadFromClassIndexes(ClassMetadataIterator iter) { // duplicates because of inheritance hierarchies ByRef duplicates = new ByRef(); while (iter.MoveNext()) { ClassMetadata classMetadata = iter.CurrentClass(); if (classMetadata.GetName() != null) { IReflectClass claxx = classMetadata.ClassReflector(); if (claxx == null || !(Stream()._handlers.IclassInternal.IsAssignableFrom(claxx))) { IClassIndexStrategy index = classMetadata.Index(); index.TraverseAll(_transaction, new _IVisitor4_130(this, duplicates)); } } } } private sealed class _IVisitor4_130 : IVisitor4 { public _IVisitor4_130(IdListQueryResult _enclosing, ByRef duplicates) { this._enclosing = _enclosing; this.duplicates = duplicates; } public void Visit(object obj) { int id = ((int)obj); TreeInt newNode = new TreeInt(id); duplicates.value = Tree.Add(((Tree)duplicates.value), newNode); if (newNode.Size() != 0) { this._enclosing.Add(id); } } private readonly IdListQueryResult _enclosing; private readonly ByRef duplicates; } public override void LoadFromIdReader(IEnumerator ids) { while (ids.MoveNext()) { Add(((int)ids.Current)); } } public virtual void Add(int id) { _ids.Add(id); } public override int IndexOf(int id) { return _ids.IndexOf(id); } public override int Size() { return _ids.Size(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/HybridQueryResult.cs0000644000175000017500000000501211700531646033161 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query.Result { /// public class HybridQueryResult : AbstractQueryResult { private AbstractQueryResult _delegate; public HybridQueryResult(Transaction transaction, QueryEvaluationMode mode) : base (transaction) { _delegate = ForMode(transaction, mode); } private static AbstractQueryResult ForMode(Transaction transaction, QueryEvaluationMode mode) { if (mode == QueryEvaluationMode.Lazy) { return new LazyQueryResult(transaction); } if (mode == QueryEvaluationMode.Snapshot) { return new SnapShotQueryResult(transaction); } return new IdListQueryResult(transaction); } public override object Get(int index) { _delegate = _delegate.SupportElementAccess(); return _delegate.Get(index); } public override int GetId(int index) { _delegate = _delegate.SupportElementAccess(); return _delegate.GetId(index); } public override int IndexOf(int id) { _delegate = _delegate.SupportElementAccess(); return _delegate.IndexOf(id); } public override IIntIterator4 IterateIDs() { return _delegate.IterateIDs(); } public override IEnumerator GetEnumerator() { return _delegate.GetEnumerator(); } public override void LoadFromClassIndex(ClassMetadata clazz) { _delegate.LoadFromClassIndex(clazz); } public override void LoadFromClassIndexes(ClassMetadataIterator iterator) { _delegate.LoadFromClassIndexes(iterator); } public override void LoadFromIdReader(IEnumerator reader) { _delegate.LoadFromIdReader(reader); } public override void LoadFromQuery(QQuery query) { if (query.RequiresSort()) { _delegate = new IdListQueryResult(Transaction()); } _delegate.LoadFromQuery(query); } public override int Size() { _delegate = _delegate.SupportSize(); return _delegate.Size(); } public override void Sort(IQueryComparator cmp) { _delegate = _delegate.SupportSort(); _delegate.Sort(cmp); } public override void SortIds(IIntComparator cmp) { _delegate = _delegate.SupportSort(); _delegate.SortIds(cmp); } } } AbstractLateQueryResult.cs0000644000175000017500000000562711700531646034246 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Query.Result { /// public abstract class AbstractLateQueryResult : AbstractQueryResult { protected IEnumerable _iterable; public AbstractLateQueryResult(Transaction transaction) : base(transaction) { } public override AbstractQueryResult SupportSize() { return ToIdTree(); } public override AbstractQueryResult SupportSort() { return ToIdList(); } public override AbstractQueryResult SupportElementAccess() { return ToIdList(); } protected override int KnownSize() { return 0; } public override IIntIterator4 IterateIDs() { if (_iterable == null) { throw new InvalidOperationException(); } return new IntIterator4Adaptor(_iterable); } public override AbstractQueryResult ToIdList() { return ToIdTree().ToIdList(); } public virtual bool SkipClass(ClassMetadata classMetadata) { if (classMetadata.GetName() == null) { return true; } IReflectClass claxx = classMetadata.ClassReflector(); if (Stream()._handlers.IclassInternal.IsAssignableFrom(claxx)) { return true; } return false; } protected virtual IEnumerable ClassIndexesIterable(ClassMetadataIterator classCollectionIterator ) { return Iterators.ConcatMap(Iterators.Iterable(classCollectionIterator), new _IFunction4_61 (this)); } private sealed class _IFunction4_61 : IFunction4 { public _IFunction4_61(AbstractLateQueryResult _enclosing) { this._enclosing = _enclosing; } public object Apply(object current) { ClassMetadata classMetadata = (ClassMetadata)current; if (this._enclosing.SkipClass(classMetadata)) { return Iterators.Skip; } return this._enclosing.ClassIndexIterable(classMetadata); } private readonly AbstractLateQueryResult _enclosing; } protected virtual IEnumerable ClassIndexIterable(ClassMetadata clazz) { return new _IEnumerable_73(this, clazz); } private sealed class _IEnumerable_73 : IEnumerable { public _IEnumerable_73(AbstractLateQueryResult _enclosing, ClassMetadata clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public IEnumerator GetEnumerator() { return this._enclosing.ClassIndexIterator(clazz); } private readonly AbstractLateQueryResult _enclosing; private readonly ClassMetadata clazz; } public virtual IEnumerator ClassIndexIterator(ClassMetadata clazz) { return BTreeClassIndexStrategy.Iterate(clazz, Transaction()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/SnapShotQueryResult.cs0000644000175000017500000000325111700531646033502 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; namespace Db4objects.Db4o.Internal.Query.Result { /// public class SnapShotQueryResult : AbstractLateQueryResult { public SnapShotQueryResult(Transaction transaction) : base(transaction) { } public override void LoadFromClassIndex(ClassMetadata clazz) { CreateSnapshot(ClassIndexIterable(clazz)); } public override void LoadFromClassIndexes(ClassMetadataIterator classCollectionIterator ) { CreateSnapshot(ClassIndexesIterable(classCollectionIterator)); } public override void LoadFromQuery(QQuery query) { IEnumerator _iterator = query.ExecuteSnapshot(); _iterable = new _IEnumerable_29(_iterator); } private sealed class _IEnumerable_29 : IEnumerable { public _IEnumerable_29(IEnumerator _iterator) { this._iterator = _iterator; } public IEnumerator GetEnumerator() { _iterator.Reset(); return _iterator; } private readonly IEnumerator _iterator; } private void CreateSnapshot(IEnumerable iterable) { Tree ids = TreeInt.AddAll(null, new IntIterator4Adaptor(iterable)); _iterable = new _IEnumerable_39(ids); } private sealed class _IEnumerable_39 : IEnumerable { public _IEnumerable_39(Tree ids) { this.ids = ids; } public IEnumerator GetEnumerator() { return new TreeKeyIterator(ids); } private readonly Tree ids; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/IdTreeQueryResult.cs0000644000175000017500000000162611700531646033123 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Result; namespace Db4objects.Db4o.Internal.Query.Result { /// public class IdTreeQueryResult : AbstractQueryResult { private Tree _ids; public IdTreeQueryResult(Transaction transaction, IIntIterator4 ids) : base(transaction ) { _ids = TreeInt.AddAll(null, ids); } public override IIntIterator4 IterateIDs() { return new IntIterator4Adaptor(new TreeKeyIterator(_ids)); } public override int Size() { if (_ids == null) { return 0; } return _ids.Size(); } public override AbstractQueryResult SupportSort() { return ToIdList(); } public override AbstractQueryResult SupportElementAccess() { return ToIdList(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/Result/LazyQueryResult.cs0000644000175000017500000000212211700531646032656 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; namespace Db4objects.Db4o.Internal.Query.Result { /// public class LazyQueryResult : AbstractLateQueryResult { public LazyQueryResult(Transaction trans) : base(trans) { } public override void LoadFromClassIndex(ClassMetadata clazz) { _iterable = ClassIndexIterable(clazz); } public override void LoadFromClassIndexes(ClassMetadataIterator classCollectionIterator ) { _iterable = ClassIndexesIterable(classCollectionIterator); } public override void LoadFromQuery(QQuery query) { _iterable = new _IEnumerable_28(query); } private sealed class _IEnumerable_28 : IEnumerable { public _IEnumerable_28(QQuery query) { this.query = query; } public IEnumerator GetEnumerator() { return query.ExecuteLazy(); } private readonly QQuery query; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/NQOptimizationInfo.cs0000644000175000017500000000146511700531646032006 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Query { public class NQOptimizationInfo { private Db4objects.Db4o.Query.Predicate _predicate; private string _message; private object _optimized; public NQOptimizationInfo(Db4objects.Db4o.Query.Predicate predicate, string message , object optimized) { this._predicate = predicate; this._message = message; this._optimized = optimized; } public virtual string Message() { return _message; } public virtual object Optimized() { return _optimized; } public virtual Db4objects.Db4o.Query.Predicate Predicate() { return _predicate; } public override string ToString() { return Message() + "/" + Optimized(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/PredicateEvaluation.cs0000644000175000017500000000106611700531646032172 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query { /// [System.Serializable] public class PredicateEvaluation : IEvaluation { public Predicate _predicate; public PredicateEvaluation() { } public PredicateEvaluation(Predicate predicate) { // CS _predicate = predicate; } public virtual void Evaluate(ICandidate candidate) { candidate.Include(_predicate.AppliesTo(candidate.GetObject())); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/SodaQueryComparator.cs0000644000175000017500000001470611700531646032213 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query; namespace Db4objects.Db4o.Internal.Query { public class SodaQueryComparator : IComparer, IIntComparator { public class Ordering { private SodaQueryComparator.Direction _direction; private string[] _fieldPath; [System.NonSerialized] internal IList _resolvedPath; public Ordering(SodaQueryComparator.Direction direction, string[] fieldPath) { _direction = direction; _fieldPath = fieldPath; } public virtual SodaQueryComparator.Direction Direction() { return _direction; } public virtual string[] FieldPath() { return _fieldPath; } } public class Direction { public static readonly SodaQueryComparator.Direction Ascending = new SodaQueryComparator.Direction (0); public static readonly SodaQueryComparator.Direction Descending = new SodaQueryComparator.Direction (1); private int value; private Direction() { } private Direction(int value) { this.value = value; } public override bool Equals(object obj) { return ((SodaQueryComparator.Direction)obj).value == value; } public override string ToString() { return this.Equals(Ascending) ? "ASCENDING" : "DESCENDING"; } } private readonly LocalObjectContainer _container; private readonly LocalTransaction _transaction; private readonly ClassMetadata _extentType; private readonly SodaQueryComparator.Ordering[] _orderings; private readonly IDictionary _bufferCache = new Hashtable(); private readonly IDictionary _fieldValueCache = new Hashtable(); public SodaQueryComparator(LocalObjectContainer container, Type extentType, SodaQueryComparator.Ordering [] orderings) : this(container, container.ProduceClassMetadata(container.Reflector ().ForClass(extentType)), orderings) { } public SodaQueryComparator(LocalObjectContainer container, ClassMetadata extent, SodaQueryComparator.Ordering[] orderings) { _container = container; _transaction = ((LocalTransaction)_container.Transaction); _extentType = extent; _orderings = orderings; ResolveFieldPaths(orderings); } private void ResolveFieldPaths(SodaQueryComparator.Ordering[] orderings) { for (int fieldPathIndex = 0; fieldPathIndex < orderings.Length; ++fieldPathIndex) { SodaQueryComparator.Ordering fieldPath = orderings[fieldPathIndex]; fieldPath._resolvedPath = ResolveFieldPath(fieldPath.FieldPath()); } } public virtual IList Sort(long[] ids) { ArrayList idList = ListFrom(ids); idList.Sort(this); return idList; } private ArrayList ListFrom(long[] ids) { ArrayList idList = new ArrayList(ids.Length); for (int idIndex = 0; idIndex < ids.Length; ++idIndex) { long id = ids[idIndex]; idList.Add((int)id); } return idList; } private IList ResolveFieldPath(string[] fieldPath) { IList fields = new ArrayList(fieldPath.Length); ClassMetadata currentType = _extentType; for (int fieldNameIndex = 0; fieldNameIndex < fieldPath.Length; ++fieldNameIndex) { string fieldName = fieldPath[fieldNameIndex]; FieldMetadata field = currentType.FieldMetadataForName(fieldName); currentType = field.FieldType(); fields.Add(field); } return fields; } public virtual int Compare(object x, object y) { return Compare(((int)x), ((int)y)); } public virtual int Compare(int x, int y) { for (int orderingIndex = 0; orderingIndex < _orderings.Length; ++orderingIndex) { SodaQueryComparator.Ordering ordering = _orderings[orderingIndex]; int result = CompareByField(x, y, ordering._resolvedPath); if (result != 0) { return ordering.Direction().Equals(SodaQueryComparator.Direction.Ascending) ? result : -result; } } return 0; } private int CompareByField(int x, int y, IList path) { object xFieldValue = GetFieldValue(x, path); object yFieldValue = GetFieldValue(y, path); FieldMetadata field = ((FieldMetadata)path[path.Count - 1]); return field.PrepareComparison(_transaction.Context(), xFieldValue).CompareTo(yFieldValue ); } private object GetFieldValue(int id, IList path) { for (int i = 0; i < path.Count - 1; ++i) { object obj = GetFieldValue(id, ((FieldMetadata)path[i])); if (null == obj) { return null; } id = _container.GetID(_transaction, obj); } return GetFieldValue(id, ((FieldMetadata)path[path.Count - 1])); } internal class FieldValueKey { private int _id; private FieldMetadata _field; public FieldValueKey(int id, FieldMetadata field) { _id = id; _field = field; } public override int GetHashCode() { return _field.GetHashCode() ^ _id; } public override bool Equals(object obj) { SodaQueryComparator.FieldValueKey other = (SodaQueryComparator.FieldValueKey)obj; return _field == other._field && _id == other._id; } } private object GetFieldValue(int id, FieldMetadata field) { SodaQueryComparator.FieldValueKey key = new SodaQueryComparator.FieldValueKey(id, field); object cachedValue = _fieldValueCache[key]; if (null != cachedValue) { return cachedValue; } object fieldValue = ReadFieldValue(id, field); _fieldValueCache[key] = fieldValue; return fieldValue; } private object ReadFieldValue(int id, FieldMetadata field) { ByteArrayBuffer buffer = BufferFor(id); HandlerVersion handlerVersion = field.ContainingClass().SeekToField(_transaction, buffer, field); if (handlerVersion == HandlerVersion.Invalid) { return null; } QueryingReadContext context = new QueryingReadContext(_transaction, handlerVersion ._number, buffer, id); return field.Read(context); } private ByteArrayBuffer BufferFor(int id) { ByteArrayBuffer cachedBuffer = ((ByteArrayBuffer)_bufferCache[id]); if (null != cachedBuffer) { return cachedBuffer; } ByteArrayBuffer buffer = _container.ReadBufferById(_transaction, id); _bufferCache[id] = buffer; return buffer; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/IDb4oEnhancedFilter.cs0000644000175000017500000000045011700531646031733 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query { /// FIXME: Rename to Db4oEnhancedPredicate public interface IDb4oEnhancedFilter { void OptimizeQuery(IQuery query); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Query/IDb4oNQOptimizer.cs0000644000175000017500000000036411700531646031305 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query { public interface IDb4oNQOptimizer { object Optimize(IQuery query, Predicate filter); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Callbacks/0000755000175000017500000000000011700531646026462 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Callbacks/NullCallbacks.cs0000644000175000017500000000463611700531646031534 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Callbacks { public class NullCallbacks : ICallbacks { public virtual void QueryOnFinished(Transaction transaction, IQuery query) { } public virtual void QueryOnStarted(Transaction transaction, IQuery query) { } public virtual bool ObjectCanNew(Transaction transaction, object obj) { return true; } public virtual bool ObjectCanActivate(Transaction transaction, object obj) { return true; } public virtual bool ObjectCanUpdate(Transaction transaction, IObjectInfo objectInfo ) { return true; } public virtual bool ObjectCanDelete(Transaction transaction, IObjectInfo objectInfo ) { return true; } public virtual bool ObjectCanDeactivate(Transaction transaction, IObjectInfo objectInfo ) { return true; } public virtual void ObjectOnNew(Transaction transaction, IObjectInfo obj) { } public virtual void ObjectOnActivate(Transaction transaction, IObjectInfo obj) { } public virtual void ObjectOnUpdate(Transaction transaction, IObjectInfo obj) { } public virtual void ObjectOnDelete(Transaction transaction, IObjectInfo obj) { } public virtual void ObjectOnDeactivate(Transaction transaction, IObjectInfo obj) { } public virtual void ObjectOnInstantiate(Transaction transaction, IObjectInfo obj) { } public virtual void CommitOnStarted(Transaction transaction, CallbackObjectInfoCollections objectInfoCollections) { } public virtual void CommitOnCompleted(Transaction transaction, CallbackObjectInfoCollections objectInfoCollections, bool isOwnCommit) { } public virtual bool CaresAboutCommitting() { return false; } public virtual bool CaresAboutCommitted() { return false; } public virtual void ClassOnRegistered(ClassMetadata clazz) { } public virtual bool CaresAboutDeleting() { return false; } public virtual bool CaresAboutDeleted() { return false; } public virtual void CloseOnStarted(IObjectContainer container) { } public virtual void OpenOnFinished(IObjectContainer container) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Callbacks/ICallbacks.cs0000644000175000017500000000325311700531646031004 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Callbacks { public interface ICallbacks { bool ObjectCanNew(Transaction transaction, object obj); bool ObjectCanActivate(Transaction transaction, object obj); bool ObjectCanUpdate(Transaction transaction, IObjectInfo objectInfo); bool ObjectCanDelete(Transaction transaction, IObjectInfo objectInfo); bool ObjectCanDeactivate(Transaction transaction, IObjectInfo objectInfo); void ObjectOnActivate(Transaction transaction, IObjectInfo obj); void ObjectOnNew(Transaction transaction, IObjectInfo obj); void ObjectOnUpdate(Transaction transaction, IObjectInfo obj); void ObjectOnDelete(Transaction transaction, IObjectInfo obj); void ObjectOnDeactivate(Transaction transaction, IObjectInfo obj); void ObjectOnInstantiate(Transaction transaction, IObjectInfo obj); void QueryOnStarted(Transaction transaction, IQuery query); void QueryOnFinished(Transaction transaction, IQuery query); bool CaresAboutCommitting(); bool CaresAboutCommitted(); void ClassOnRegistered(ClassMetadata clazz); void CommitOnStarted(Transaction transaction, CallbackObjectInfoCollections objectInfoCollections ); void CommitOnCompleted(Transaction transaction, CallbackObjectInfoCollections objectInfoCollections , bool isOwnCommit); bool CaresAboutDeleting(); bool CaresAboutDeleted(); void OpenOnFinished(IObjectContainer container); void CloseOnStarted(IObjectContainer container); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/PersistentIntegerArray.cs0000644000175000017500000000346611700531646031620 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Sharpen; namespace Db4objects.Db4o.Internal { /// public class PersistentIntegerArray : LocalPersistentBase { private readonly Db4objects.Db4o.Internal.Slots.SlotChangeFactory _slotChangeFactory; private int[] _ints; public PersistentIntegerArray(Db4objects.Db4o.Internal.Slots.SlotChangeFactory slotChangeFactory , ITransactionalIdSystem idSystem, int[] arr) : base(idSystem) { _slotChangeFactory = slotChangeFactory; _ints = new int[arr.Length]; System.Array.Copy(arr, 0, _ints, 0, arr.Length); } public PersistentIntegerArray(Db4objects.Db4o.Internal.Slots.SlotChangeFactory slotChangeFactory , ITransactionalIdSystem idSystem, int id) : base(idSystem) { _slotChangeFactory = slotChangeFactory; SetID(id); } public override byte GetIdentifier() { return Const4.IntegerArray; } public override int OwnLength() { return (Const4.IntLength * (Size() + 1)) + Const4.AddedLength; } public override void ReadThis(Transaction trans, ByteArrayBuffer reader) { int length = reader.ReadInt(); _ints = new int[length]; for (int i = 0; i < length; i++) { _ints[i] = reader.ReadInt(); } } public override void WriteThis(Transaction trans, ByteArrayBuffer writer) { writer.WriteInt(Size()); for (int i = 0; i < _ints.Length; i++) { writer.WriteInt(_ints[i]); } } private int Size() { return _ints.Length; } public virtual int[] Array() { return _ints; } public override Db4objects.Db4o.Internal.Slots.SlotChangeFactory SlotChangeFactory () { return _slotChangeFactory; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Delete/0000755000175000017500000000000011700531646026005 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Delete/DeleteContextImpl.cs0000644000175000017500000000607411700531646031734 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Diagnostic; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Delete { /// public class DeleteContextImpl : ObjectHeaderContext, IDeleteContext, IObjectIdContext { private readonly IReflectClass _fieldClass; private readonly Config4Field _fieldConfig; public DeleteContextImpl(Db4objects.Db4o.Internal.StatefulBuffer buffer, ObjectHeader objectHeader, IReflectClass fieldClass, Config4Field fieldConfig) : base(buffer .Transaction(), buffer, objectHeader) { _fieldClass = fieldClass; _fieldConfig = fieldConfig; } public DeleteContextImpl(Db4objects.Db4o.Internal.Delete.DeleteContextImpl parentContext , IReflectClass fieldClass, Config4Field fieldConfig) : this(parentContext.StatefulBuffer (), parentContext._objectHeader, fieldClass, fieldConfig) { } public virtual void CascadeDeleteDepth(int depth) { StatefulBuffer().SetCascadeDeletes(depth); } private Db4objects.Db4o.Internal.StatefulBuffer StatefulBuffer() { return ((Db4objects.Db4o.Internal.StatefulBuffer)Buffer()); } public virtual int CascadeDeleteDepth() { return StatefulBuffer().CascadeDeletes(); } public virtual bool CascadeDelete() { return CascadeDeleteDepth() > 0; } public virtual void DefragmentRecommended() { DiagnosticProcessor dp = Container()._handlers.DiagnosticProcessor(); if (dp.Enabled()) { dp.DefragmentRecommended(DefragmentRecommendation.DefragmentRecommendationReason. DeleteEmbeded); } } public virtual Slot ReadSlot() { return new Slot(Buffer().ReadInt(), Buffer().ReadInt()); } public virtual void Delete(ITypeHandler4 handler) { ITypeHandler4 correctHandlerVersion = HandlerRegistry.CorrectHandlerVersion(this, handler); int preservedCascadeDepth = CascadeDeleteDepth(); CascadeDeleteDepth(AdjustedDepth()); if (Handlers4.HandleAsObject(correctHandlerVersion)) { DeleteObject(); } else { correctHandlerVersion.Delete(this); } CascadeDeleteDepth(preservedCascadeDepth); } public virtual void DeleteObject() { int id = Buffer().ReadInt(); if (CascadeDelete()) { Container().DeleteByID(Transaction(), id, CascadeDeleteDepth()); } } private int AdjustedDepth() { if (Platform4.IsStruct(_fieldClass)) { return 1; } if (_fieldConfig == null) { return CascadeDeleteDepth(); } if (_fieldConfig.CascadeOnDelete().DefiniteYes()) { return 1; } if (_fieldConfig.CascadeOnDelete().DefiniteNo()) { return 0; } return CascadeDeleteDepth(); } public virtual int ObjectId() { return StatefulBuffer().GetID(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Delete/IDeleteContext.cs0000644000175000017500000000115711700531646031220 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Delete { /// public interface IDeleteContext : IContext, IReadBuffer, IHandlerVersionContext { bool CascadeDelete(); int CascadeDeleteDepth(); void Delete(ITypeHandler4 handler); void DeleteObject(); bool IsLegacyHandlerVersion(); void DefragmentRecommended(); Slot ReadSlot(); int ObjectId(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/0000755000175000017500000000000011700531646026500 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/SlotHandler.cs0000644000175000017500000000202311700531646031243 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Freespace { /// public abstract class SlotHandler : IIndexable4 { protected Slot _current; public virtual void DefragIndexEntry(DefragmentContextImpl context) { throw new NotImplementedException(); } public virtual int LinkLength() { return Slot.MarshalledLength; } public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer reader) { return new Slot(reader.ReadInt(), reader.ReadInt()); } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj) { Slot slot = (Slot)obj; writer.WriteInt(slot.Address()); writer.WriteInt(slot.Length()); } public abstract IPreparedComparison PrepareComparison(IContext arg1, object arg2); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/FreespaceManagerIx.cs0000644000175000017500000000421011700531646032515 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { /// Old freespacemanager, before version 7.0. /// /// Old freespacemanager, before version 7.0. /// If it is still in use freespace is dropped. /// BTreeFreespaceManager /// should be used instead. /// public class FreespaceManagerIx : AbstractFreespaceManager { public FreespaceManagerIx(int discardLimit) : base(null, discardLimit) { } public override Slot AllocateSafeSlot(int length) { return null; } public override void FreeSafeSlot(Slot slot) { } // do nothing public override void BeginCommit() { } public override void EndCommit() { } public override int SlotCount() { throw new InvalidOperationException(); } public override void Free(Slot slot) { } // Should no longer be used: Should not happen. public override void FreeSelf() { } // do nothing, freespace is dropped. public override Slot AllocateSlot(int length) { // implementation is no longer present, no freespace returned. return null; } public override void MigrateTo(IFreespaceManager fm) { } // do nothing, freespace is dropped. public override void Traverse(IVisitor4 visitor) { throw new InvalidOperationException(); } public override void Start(int id) { } public override byte SystemType() { return FmIx; } public override void Write(LocalObjectContainer container) { } public override void Commit() { } public override void Listener(IFreespaceListener listener) { } public override bool IsStarted() { return false; } public override Slot AllocateTransactionLogSlot(int length) { return null; } public override void Read(LocalObjectContainer container, Slot slot) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/IFreespaceManager.cs0000644000175000017500000000176311700531646032337 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { /// public interface IFreespaceManager { void BeginCommit(); void EndCommit(); int SlotCount(); void Free(Slot slot); void FreeSelf(); int TotalFreespace(); Slot AllocateTransactionLogSlot(int length); Slot AllocateSlot(int length); void MigrateTo(IFreespaceManager fm); void Read(LocalObjectContainer container, Slot slot); void Start(int id); byte SystemType(); void Traverse(IVisitor4 visitor); void Write(LocalObjectContainer container); void Commit(); Slot AllocateSafeSlot(int length); void FreeSafeSlot(Slot slot); void Listener(IFreespaceListener listener); void SlotFreed(Slot slot); bool IsStarted(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/BTreeFreespaceManager.cs0000644000175000017500000001734511700531646033153 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { /// public class BTreeFreespaceManager : AbstractFreespaceManager { private readonly LocalObjectContainer _file; private InMemoryFreespaceManager _delegate; private BTree _slotsByAddress; private BTree _slotsByLength; private PersistentIntegerArray _idArray; private int _delegationRequests; private IFreespaceListener _listener = NullFreespaceListener.Instance; private ITransactionalIdSystem _idSystem; public BTreeFreespaceManager(LocalObjectContainer file, IProcedure4 slotFreedCallback , int discardLimit) : base(slotFreedCallback, discardLimit) { _file = file; _delegate = new InMemoryFreespaceManager(slotFreedCallback, discardLimit); _idSystem = file.SystemData().FreespaceIdSystem(); } private void AddSlot(Slot slot) { _slotsByLength.Add(Transaction(), slot); _slotsByAddress.Add(Transaction(), slot); _listener.SlotAdded(slot.Length()); } public override Slot AllocateSafeSlot(int length) { return _delegate.AllocateSafeSlot(length); } public override void BeginCommit() { BeginDelegation(); } private void BeginDelegation() { _delegationRequests++; } public override void Commit() { _slotsByAddress.Commit(Transaction()); _slotsByLength.Commit(Transaction()); } private void CreateBTrees(int addressID, int lengthID) { BTreeConfiguration config = new BTreeConfiguration(_idSystem, SlotChangeFactory.FreeSpace , 64, false); _slotsByAddress = new BTree(Transaction(), config, addressID, new AddressKeySlotHandler ()); _slotsByLength = new BTree(Transaction(), config, lengthID, new LengthKeySlotHandler ()); } public override void EndCommit() { EndDelegation(); } private void EndDelegation() { _delegationRequests--; } public override void Free(Slot slot) { if (!IsStarted()) { return; } if (IsDelegating()) { _delegate.Free(slot); return; } try { BeginDelegation(); if (DTrace.enabled) { DTrace.FreespacemanagerBtreeFree.LogLength(slot.Address(), slot.Length()); } Slot[] remove = new Slot[2]; Slot newFreeSlot = slot; BTreePointer pointer = SearchBTree(_slotsByAddress, slot, SearchTarget.Lowest); BTreePointer previousPointer = pointer != null ? pointer.Previous() : _slotsByAddress .LastPointer(Transaction()); if (previousPointer != null) { Slot previousSlot = (Slot)previousPointer.Key(); if (previousSlot.IsDirectlyPreceding(newFreeSlot)) { remove[0] = previousSlot; newFreeSlot = previousSlot.Append(newFreeSlot); } } if (pointer != null) { Slot nextSlot = (Slot)pointer.Key(); if (newFreeSlot.IsDirectlyPreceding(nextSlot)) { remove[1] = nextSlot; newFreeSlot = newFreeSlot.Append(nextSlot); } } for (int i = 0; i < remove.Length; i++) { if (remove[i] != null) { RemoveSlot(remove[i]); } } if (!CanDiscard(newFreeSlot.Length())) { AddSlot(newFreeSlot); } SlotFreed(slot); } finally { EndDelegation(); } } public override void FreeSelf() { _slotsByAddress.Free(Transaction()); _slotsByLength.Free(Transaction()); } public override void FreeSafeSlot(Slot slot) { _delegate.FreeSafeSlot(slot); } public override Slot AllocateSlot(int length) { if (!IsStarted()) { return null; } if (IsDelegating()) { return _delegate.AllocateSlot(length); } try { BeginDelegation(); BTreePointer pointer = SearchBTree(_slotsByLength, new Slot(0, length), SearchTarget .Highest); if (pointer == null) { return null; } Slot slot = (Slot)pointer.Key(); RemoveSlot(slot); int remainingLength = slot.Length() - length; if (SplitRemainder(remainingLength)) { AddSlot(slot.SubSlot(length)); slot = slot.Truncate(length); } if (DTrace.enabled) { DTrace.FreespacemanagerGetSlot.LogLength(slot.Address(), slot.Length()); } return slot; } finally { EndDelegation(); } } private void InitializeExisting(int id) { _idArray = new PersistentIntegerArray(SlotChangeFactory.FreeSpace, _idSystem, id); _idArray.Read(Transaction()); int[] ids = _idArray.Array(); int addressId = ids[0]; int lengthID = ids[1]; CreateBTrees(addressId, lengthID); _slotsByAddress.Read(Transaction()); _slotsByLength.Read(Transaction()); _delegate.Read(_file, _file.SystemData().InMemoryFreespaceSlot()); } private void InitializeNew() { CreateBTrees(0, 0); _slotsByAddress.Write(Transaction()); _slotsByLength.Write(Transaction()); int[] ids = new int[] { _slotsByAddress.GetID(), _slotsByLength.GetID() }; _idArray = new PersistentIntegerArray(SlotChangeFactory.FreeSpace, _idSystem, ids ); _idArray.Write(Transaction()); _file.SystemData().BTreeFreespaceId(_idArray.GetID()); } private bool IsDelegating() { return _delegationRequests > 0; } public virtual void Read(LocalObjectContainer container, int freeSpaceID) { } // do nothing // reading happens in start( ) private void RemoveSlot(Slot slot) { _slotsByLength.Remove(Transaction(), slot); _slotsByAddress.Remove(Transaction(), slot); _listener.SlotRemoved(slot.Length()); } private BTreePointer SearchBTree(BTree bTree, Slot slot, SearchTarget target) { BTreeNodeSearchResult searchResult = bTree.SearchLeaf(Transaction(), slot, target ); return searchResult.FirstValidPointer(); } public override int SlotCount() { return _slotsByAddress.Size(Transaction()) + _delegate.SlotCount(); } public override void Start(int id) { try { BeginDelegation(); if (id == 0) { InitializeNew(); } else { InitializeExisting(id); } } finally { EndDelegation(); } } public override bool IsStarted() { return _idArray != null; } public override byte SystemType() { return FmBtree; } public override string ToString() { return _slotsByLength.ToString(); } public override int TotalFreespace() { return base.TotalFreespace() + _delegate.TotalFreespace(); } public override void Traverse(IVisitor4 visitor) { _slotsByAddress.TraverseKeys(Transaction(), visitor); } public override void MigrateTo(IFreespaceManager fm) { base.MigrateTo(fm); _delegate.MigrateTo(fm); } public override void Write(LocalObjectContainer container) { try { BeginDelegation(); _delegate.Write(container); container.SystemData().BTreeFreespaceId(_idArray.GetID()); } finally { EndDelegation(); } } public override void Listener(IFreespaceListener listener) { _listener = listener; } private LocalTransaction Transaction() { return (LocalTransaction)_file.SystemTransaction(); } public override Slot AllocateTransactionLogSlot(int length) { return _delegate.AllocateTransactionLogSlot(length); } public override void Read(LocalObjectContainer container, Slot slot) { } // do nothing // everything happens in start } } InMemoryFreespaceManager.cs0000644000175000017500000002045311700531646033624 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { public class InMemoryFreespaceManager : AbstractFreespaceManager { private readonly TreeIntObject _finder = new TreeIntObject(0); private Tree _freeByAddress; private Tree _freeBySize; private IFreespaceListener _listener = NullFreespaceListener.Instance; public InMemoryFreespaceManager(IProcedure4 slotFreedCallback, int discardLimit) : base(slotFreedCallback, discardLimit) { } private void AddFreeSlotNodes(int address, int length) { FreeSlotNode addressNode = new FreeSlotNode(address); addressNode.CreatePeer(length); _freeByAddress = Tree.Add(_freeByAddress, addressNode); AddToFreeBySize(addressNode._peer); } private void AddToFreeBySize(FreeSlotNode node) { _freeBySize = Tree.Add(_freeBySize, node); _listener.SlotAdded(node._key); } public override Slot AllocateTransactionLogSlot(int length) { FreeSlotNode sizeNode = (FreeSlotNode)Tree.Last(_freeBySize); if (sizeNode == null || sizeNode._key < length) { return null; } // We can just be appending to the end of the file, using one // really big contigous slot that keeps growing. Let's limit. int limit = length + 100; if (sizeNode._key > limit) { return AllocateSlot(limit); } RemoveFromBothTrees(sizeNode); return new Slot(sizeNode._peer._key, sizeNode._key); } public override Slot AllocateSafeSlot(int length) { return AllocateSlot(length); } public override void FreeSafeSlot(Slot slot) { Free(slot); } public override void BeginCommit() { } // do nothing public override void Commit() { } // do nothing public override void EndCommit() { } // do nothing public override void Free(Slot slot) { int address = slot.Address(); if (address <= 0) { throw new ArgumentException(); } int length = slot.Length(); if (DTrace.enabled) { DTrace.FreespacemanagerRamFree.LogLength(address, length); } _finder._key = address; FreeSlotNode sizeNode; FreeSlotNode addressnode = (FreeSlotNode)Tree.FindSmaller(_freeByAddress, _finder ); if ((addressnode != null) && ((addressnode._key + addressnode._peer._key) == address )) { sizeNode = addressnode._peer; RemoveFromFreeBySize(sizeNode); sizeNode._key += length; FreeSlotNode secondAddressNode = (FreeSlotNode)Tree.FindGreaterOrEqual(_freeByAddress , _finder); if ((secondAddressNode != null) && (address + length == secondAddressNode._key)) { sizeNode._key += secondAddressNode._peer._key; RemoveFromBothTrees(secondAddressNode._peer); } sizeNode.RemoveChildren(); AddToFreeBySize(sizeNode); } else { addressnode = (FreeSlotNode)Tree.FindGreaterOrEqual(_freeByAddress, _finder); if ((addressnode != null) && (address + length == addressnode._key)) { sizeNode = addressnode._peer; RemoveFromBothTrees(sizeNode); sizeNode._key += length; addressnode._key = address; addressnode.RemoveChildren(); sizeNode.RemoveChildren(); _freeByAddress = Tree.Add(_freeByAddress, addressnode); AddToFreeBySize(sizeNode); } else { if (CanDiscard(length)) { return; } AddFreeSlotNodes(address, length); } } SlotFreed(slot); } public override void FreeSelf() { } // Do nothing. // The RAM manager frees itself on reading. public override Slot AllocateSlot(int length) { _finder._key = length; _finder._object = null; _freeBySize = FreeSlotNode.RemoveGreaterOrEqual((FreeSlotNode)_freeBySize, _finder ); if (_finder._object == null) { return null; } FreeSlotNode node = (FreeSlotNode)_finder._object; _listener.SlotRemoved(node._key); int blocksFound = node._key; int address = node._peer._key; _freeByAddress = _freeByAddress.RemoveNode(node._peer); int remainingBlocks = blocksFound - length; if (SplitRemainder(remainingBlocks)) { AddFreeSlotNodes(address + length, remainingBlocks); } else { length = blocksFound; } if (DTrace.enabled) { DTrace.FreespacemanagerGetSlot.LogLength(address, length); } return new Slot(address, length); } internal virtual int MarshalledLength() { return TreeInt.MarshalledLength((TreeInt)_freeBySize); } private void Read(ByteArrayBuffer reader) { FreeSlotNode.sizeLimit = DiscardLimit(); _freeBySize = new TreeReader(reader, new FreeSlotNode(0), true).Read(); ByRef addressTree = ByRef.NewInstance(); if (_freeBySize != null) { _freeBySize.Traverse(new _IVisitor4_176(addressTree)); } _freeByAddress = ((Tree)addressTree.value); } private sealed class _IVisitor4_176 : IVisitor4 { public _IVisitor4_176(ByRef addressTree) { this.addressTree = addressTree; } public void Visit(object a_object) { FreeSlotNode node = ((FreeSlotNode)a_object)._peer; addressTree.value = Tree.Add(((Tree)addressTree.value), node); } private readonly ByRef addressTree; } public override void Read(LocalObjectContainer container, Slot slot) { if (Slot.IsNull(slot)) { return; } ByteArrayBuffer buffer = container.ReadBufferBySlot(slot); if (buffer == null) { return; } Read(buffer); container.Free(slot); } private void RemoveFromBothTrees(FreeSlotNode sizeNode) { RemoveFromFreeBySize(sizeNode); _freeByAddress = _freeByAddress.RemoveNode(sizeNode._peer); } private void RemoveFromFreeBySize(FreeSlotNode node) { _freeBySize = _freeBySize.RemoveNode(node); _listener.SlotRemoved(node._key); } public override int SlotCount() { return Tree.Size(_freeByAddress); } public override void Start(int id) { } // this is done in read(), nothing to do here public override byte SystemType() { return FmRam; } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append("RAM FreespaceManager\n"); sb.Append("Address Index\n"); _freeByAddress.Traverse(new InMemoryFreespaceManager.ToStringVisitor(sb)); sb.Append("Length Index\n"); _freeBySize.Traverse(new InMemoryFreespaceManager.ToStringVisitor(sb)); return sb.ToString(); } public override void Traverse(IVisitor4 visitor) { if (_freeByAddress == null) { return; } _freeByAddress.Traverse(new _IVisitor4_236(visitor)); } private sealed class _IVisitor4_236 : IVisitor4 { public _IVisitor4_236(IVisitor4 visitor) { this.visitor = visitor; } public void Visit(object a_object) { FreeSlotNode fsn = (FreeSlotNode)a_object; int address = fsn._key; int length = fsn._peer._key; visitor.Visit(new Slot(address, length)); } private readonly IVisitor4 visitor; } public override void Write(LocalObjectContainer container) { Slot slot = container.AllocateSlot(MarshalledLength()); while (slot.Length() < MarshalledLength()) { // This can happen if DatabaseGrowthSize is configured. // Allocating a slot may produce an additional entry // in this FreespaceManager. container.Free(slot); slot = container.AllocateSlot(MarshalledLength()); } ByteArrayBuffer buffer = new ByteArrayBuffer(slot.Length()); TreeInt.Write(buffer, (TreeInt)_freeBySize); container.WriteEncrypt(buffer, slot.Address(), 0); container.SystemData().InMemoryFreespaceSlot(slot); } internal sealed class ToStringVisitor : IVisitor4 { private readonly StringBuilder _sb; internal ToStringVisitor(StringBuilder sb) { _sb = sb; } public void Visit(object obj) { _sb.Append(obj); _sb.Append("\n"); } } public override void Listener(IFreespaceListener listener) { _listener = listener; } public override bool IsStarted() { return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/IFreespaceListener.cs0000644000175000017500000000037611700531646032551 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Freespace { /// public interface IFreespaceListener { void SlotAdded(int size); void SlotRemoved(int size); } } AbstractFreespaceManager.cs0000644000175000017500000001376411700531646033637 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { public abstract class AbstractFreespaceManager : IFreespaceManager { public const byte FmDebug = 127; public const byte FmDefault = 0; public const byte FmLegacyRam = 1; public const byte FmRam = 2; public const byte FmIx = 3; public const byte FmBtree = 4; private const int IntsInSlot = 12; public const int RemainderSizeLimit = 20; public static byte CheckType(byte systemType) { if (systemType == FmDefault) { return FmRam; } return systemType; } protected IProcedure4 _slotFreedCallback; private readonly int _discardLimit; public AbstractFreespaceManager(IProcedure4 slotFreedCallback, int discardLimit) { _slotFreedCallback = slotFreedCallback; _discardLimit = discardLimit; } public static Db4objects.Db4o.Internal.Freespace.AbstractFreespaceManager CreateNew (LocalObjectContainer file) { return CreateNew(file, file.SystemData().FreespaceSystem()); } public static Db4objects.Db4o.Internal.Freespace.AbstractFreespaceManager CreateNew (LocalObjectContainer file, byte systemType) { systemType = CheckType(systemType); int unblockedDiscardLimit = file.ConfigImpl.DiscardFreeSpace(); int blockedDiscardLimit = unblockedDiscardLimit == int.MaxValue ? unblockedDiscardLimit : file.BlockConverter().BytesToBlocks(unblockedDiscardLimit); IProcedure4 slotFreedCallback = new _IProcedure4_50(file); switch (systemType) { case FmIx: { return new FreespaceManagerIx(blockedDiscardLimit); } case FmBtree: { return new BTreeFreespaceManager(file, slotFreedCallback, blockedDiscardLimit); } default: { return new InMemoryFreespaceManager(slotFreedCallback, blockedDiscardLimit); break; } } } private sealed class _IProcedure4_50 : IProcedure4 { public _IProcedure4_50(LocalObjectContainer file) { this.file = file; } public void Apply(object slot) { file.OverwriteDeletedBlockedSlot(((Slot)slot)); } private readonly LocalObjectContainer file; } public static int InitSlot(LocalObjectContainer file) { int address = file.AllocateSlot(SlotLength()).Address(); SlotEntryToZeroes(file, address); return address; } public virtual void MigrateTo(IFreespaceManager fm) { Traverse(new _IVisitor4_72(fm)); } private sealed class _IVisitor4_72 : IVisitor4 { public _IVisitor4_72(IFreespaceManager fm) { this.fm = fm; } public void Visit(object obj) { fm.Free((Slot)obj); } private readonly IFreespaceManager fm; } internal static void SlotEntryToZeroes(LocalObjectContainer file, int address) { StatefulBuffer writer = new StatefulBuffer(file.SystemTransaction(), address, SlotLength ()); for (int i = 0; i < IntsInSlot; i++) { writer.WriteInt(0); } writer.WriteEncrypt(); } internal static int SlotLength() { return Const4.IntLength * IntsInSlot; } public virtual int TotalFreespace() { IntByRef mint = new IntByRef(); Traverse(new _IVisitor4_97(mint)); return mint.value; } private sealed class _IVisitor4_97 : IVisitor4 { public _IVisitor4_97(IntByRef mint) { this.mint = mint; } public void Visit(object obj) { Slot slot = (Slot)obj; mint.value += slot.Length(); } private readonly IntByRef mint; } protected virtual int DiscardLimit() { return _discardLimit; } protected bool SplitRemainder(int length) { if (CanDiscard(length)) { return false; } return length > RemainderSizeLimit; } internal bool CanDiscard(int length) { return length == 0 || length < DiscardLimit(); } public static void Migrate(IFreespaceManager oldFM, IFreespaceManager newFM) { oldFM.MigrateTo(newFM); oldFM.FreeSelf(); } public virtual void DebugCheckIntegrity() { IntByRef lastStart = new IntByRef(); IntByRef lastEnd = new IntByRef(); Traverse(new _IVisitor4_129(lastEnd, lastStart)); } private sealed class _IVisitor4_129 : IVisitor4 { public _IVisitor4_129(IntByRef lastEnd, IntByRef lastStart) { this.lastEnd = lastEnd; this.lastStart = lastStart; } public void Visit(object obj) { Slot slot = (Slot)obj; if (slot.Address() <= lastEnd.value) { throw new InvalidOperationException(); } lastStart.value = slot.Address(); lastEnd.value = slot.Address() + slot.Length(); } private readonly IntByRef lastEnd; private readonly IntByRef lastStart; } public static bool MigrationRequired(byte systemType) { return systemType == FmLegacyRam || systemType == FmIx; } public virtual void SlotFreed(Slot slot) { if (_slotFreedCallback == null) { return; } _slotFreedCallback.Apply(slot); } public abstract Slot AllocateSafeSlot(int arg1); public abstract Slot AllocateSlot(int arg1); public abstract Slot AllocateTransactionLogSlot(int arg1); public abstract void BeginCommit(); public abstract void Commit(); public abstract void EndCommit(); public abstract void Free(Slot arg1); public abstract void FreeSafeSlot(Slot arg1); public abstract void FreeSelf(); public abstract bool IsStarted(); public abstract void Listener(IFreespaceListener arg1); public abstract void Read(LocalObjectContainer arg1, Slot arg2); public abstract int SlotCount(); public abstract void Start(int arg1); public abstract byte SystemType(); public abstract void Traverse(IVisitor4 arg1); public abstract void Write(LocalObjectContainer arg1); } } BlockAwareFreespaceManager.cs0000644000175000017500000000672611700531646034106 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { /// public class BlockAwareFreespaceManager : IFreespaceManager { private readonly IFreespaceManager _delegate; private readonly IBlockConverter _blockConverter; public BlockAwareFreespaceManager(IFreespaceManager delegate_, IBlockConverter blockConverter ) { _delegate = delegate_; _blockConverter = blockConverter; } public virtual Slot AllocateSlot(int length) { Slot slot = _delegate.AllocateSlot(_blockConverter.BytesToBlocks(length)); if (slot == null) { return null; } return _blockConverter.ToNonBlockedLength(slot); } public virtual Slot AllocateSafeSlot(int length) { Slot slot = _delegate.AllocateSafeSlot(_blockConverter.BytesToBlocks(length)); if (slot == null) { return null; } return _blockConverter.ToNonBlockedLength(slot); } public virtual void BeginCommit() { _delegate.BeginCommit(); } public virtual void Commit() { _delegate.Commit(); } public virtual void EndCommit() { _delegate.EndCommit(); } public virtual void Free(Slot slot) { _delegate.Free(_blockConverter.ToBlockedLength(slot)); } public virtual void FreeSelf() { _delegate.FreeSelf(); } public virtual void FreeSafeSlot(Slot slot) { _delegate.FreeSafeSlot(_blockConverter.ToBlockedLength(slot)); } public virtual void Listener(IFreespaceListener listener) { _delegate.Listener(listener); } public virtual void MigrateTo(IFreespaceManager fm) { throw new InvalidOperationException(); } public virtual int SlotCount() { return _delegate.SlotCount(); } public virtual void Start(int id) { throw new InvalidOperationException(); } public virtual byte SystemType() { return _delegate.SystemType(); } public virtual int TotalFreespace() { return _blockConverter.BlocksToBytes(_delegate.TotalFreespace()); } public virtual void Traverse(IVisitor4 visitor) { _delegate.Traverse(new _IVisitor4_89(this, visitor)); } private sealed class _IVisitor4_89 : IVisitor4 { public _IVisitor4_89(BlockAwareFreespaceManager _enclosing, IVisitor4 visitor) { this._enclosing = _enclosing; this.visitor = visitor; } public void Visit(object slot) { visitor.Visit(this._enclosing._blockConverter.ToNonBlockedLength(((Slot)slot))); } private readonly BlockAwareFreespaceManager _enclosing; private readonly IVisitor4 visitor; } public virtual void Write(LocalObjectContainer container) { _delegate.Write(container); } public virtual void SlotFreed(Slot slot) { _delegate.SlotFreed(slot); } public virtual bool IsStarted() { return _delegate.IsStarted(); } public virtual Slot AllocateTransactionLogSlot(int length) { Slot slot = _delegate.AllocateTransactionLogSlot(_blockConverter.BytesToBlocks(length )); if (slot == null) { return null; } return _blockConverter.ToNonBlockedLength(slot); } public virtual void Read(LocalObjectContainer container, Slot slot) { throw new InvalidOperationException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/NullFreespaceListener.cs0000644000175000017500000000110011700531646033255 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Freespace; namespace Db4objects.Db4o.Internal.Freespace { /// public class NullFreespaceListener : IFreespaceListener { public static readonly IFreespaceListener Instance = new Db4objects.Db4o.Internal.Freespace.NullFreespaceListener (); private NullFreespaceListener() { } public virtual void SlotAdded(int size) { } // do nothing; public virtual void SlotRemoved(int size) { } // do nothing } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/FreeSlotNode.cs0000644000175000017500000000723011700531646031362 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Freespace { /// public sealed class FreeSlotNode : TreeInt { internal static int sizeLimit; internal Db4objects.Db4o.Internal.Freespace.FreeSlotNode _peer; internal FreeSlotNode(int a_key) : base(a_key) { } public override object ShallowClone() { Db4objects.Db4o.Internal.Freespace.FreeSlotNode frslot = new Db4objects.Db4o.Internal.Freespace.FreeSlotNode (_key); frslot._peer = _peer; return base.ShallowCloneInternal(frslot); } internal void CreatePeer(int a_key) { _peer = new Db4objects.Db4o.Internal.Freespace.FreeSlotNode(a_key); _peer._peer = this; } public override bool Duplicates() { return true; } public sealed override int OwnLength() { return Const4.IntLength * 2; } internal static Tree RemoveGreaterOrEqual(Db4objects.Db4o.Internal.Freespace.FreeSlotNode a_in, TreeIntObject a_finder) { if (a_in == null) { return null; } int cmp = a_in._key - a_finder._key; if (cmp == 0) { a_finder._object = a_in; // the highest node in the hierarchy !!! return a_in.Remove(); } if (cmp > 0) { a_in._preceding = RemoveGreaterOrEqual((Db4objects.Db4o.Internal.Freespace.FreeSlotNode )((Tree)a_in._preceding), a_finder); if (a_finder._object != null) { a_in._size--; return a_in; } a_finder._object = a_in; return a_in.Remove(); } a_in._subsequent = RemoveGreaterOrEqual((Db4objects.Db4o.Internal.Freespace.FreeSlotNode )((Tree)a_in._subsequent), a_finder); if (a_finder._object != null) { a_in._size--; } return a_in; } public override object Read(ByteArrayBuffer buffer) { int size = buffer.ReadInt(); int address = buffer.ReadInt(); if (size > sizeLimit) { Db4objects.Db4o.Internal.Freespace.FreeSlotNode node = new Db4objects.Db4o.Internal.Freespace.FreeSlotNode (size); node.CreatePeer(address); if (Deploy.debug && Debug4.xbytes) { DebugCheckBuffer(buffer, node); } return node; } return null; } private void DebugCheckBuffer(ByteArrayBuffer buffer, Db4objects.Db4o.Internal.Freespace.FreeSlotNode node) { if (!(buffer is StatefulBuffer)) { return; } Transaction trans = ((StatefulBuffer)buffer).Transaction(); if (!(trans.Container() is IoAdaptedObjectContainer)) { return; } StatefulBuffer checker = trans.Container().CreateStatefulBuffer(trans, node._peer ._key, node._key); checker.Read(); for (int i = 0; i < node._key; i++) { if (checker.ReadByte() != (byte)'X') { Sharpen.Runtime.Out.WriteLine("!!! Free space corruption at:" + node._peer._key); break; } } } public sealed override void Write(ByteArrayBuffer a_writer) { // byte order: size, address a_writer.WriteInt(_key); a_writer.WriteInt(_peer._key); } // public static final void debug(FreeSlotNode a_node){ // if(a_node == null){ // return; // } // System.out.println("Address:" + a_node.i_key); // System.out.println("Length:" + a_node.i_peer.i_key); // debug((FreeSlotNode)a_node.i_preceding); // debug((FreeSlotNode)a_node.i_subsequent); // } public override string ToString() { return base.ToString(); string str = "FreeSlotNode " + _key; if (_peer != null) { str += " peer: " + _peer._key; } return str; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/NullFreespaceManager.cs0000644000175000017500000000340011700531646033047 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Freespace { /// public class NullFreespaceManager : IFreespaceManager { public static readonly IFreespaceManager Instance = new Db4objects.Db4o.Internal.Freespace.NullFreespaceManager (); private NullFreespaceManager() { } public virtual Slot AllocateSlot(int length) { return null; } public virtual Slot AllocateSafeSlot(int length) { return null; } public virtual void BeginCommit() { } public virtual void Commit() { } public virtual void EndCommit() { } public virtual void Free(Slot slot) { } public virtual void FreeSelf() { } public virtual void FreeSafeSlot(Slot slot) { } public virtual void Listener(IFreespaceListener listener) { } public virtual void MigrateTo(IFreespaceManager fm) { } public virtual int SlotCount() { return 0; } public virtual void SlotFreed(Slot slot) { } public virtual void Start(int id) { } public virtual byte SystemType() { return 0; } public virtual int TotalFreespace() { return 0; } public virtual void Traverse(IVisitor4 visitor) { } public virtual void Write(LocalObjectContainer container) { } public virtual bool IsStarted() { return false; } public virtual Slot AllocateTransactionLogSlot(int length) { return null; } public virtual void Read(LocalObjectContainer container, Slot slot) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/AddressKeySlotHandler.cs0000644000175000017500000000220311700531646033222 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Freespace { /// public class AddressKeySlotHandler : SlotHandler { public virtual int CompareTo(object obj) { return _current.CompareByAddress((Slot)obj); } public override IPreparedComparison PrepareComparison(IContext context, object slot ) { Slot sourceSlot = (Slot)slot; return new _IPreparedComparison_21(sourceSlot); } private sealed class _IPreparedComparison_21 : IPreparedComparison { public _IPreparedComparison_21(Slot sourceSlot) { this.sourceSlot = sourceSlot; } public int CompareTo(object obj) { Slot targetSlot = (Slot)obj; // FIXME: The comparison method in #compareByAddress is the wrong way around. // Fix there and here after other references are fixed. return -sourceSlot.CompareByAddress(targetSlot); } private readonly Slot sourceSlot; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Freespace/LengthKeySlotHandler.cs0000644000175000017500000000217711700531646033070 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Freespace { /// public class LengthKeySlotHandler : SlotHandler { public virtual int CompareTo(object obj) { return _current.CompareByLength((Slot)obj); } public override IPreparedComparison PrepareComparison(IContext context, object slot ) { Slot sourceSlot = (Slot)slot; return new _IPreparedComparison_21(sourceSlot); } private sealed class _IPreparedComparison_21 : IPreparedComparison { public _IPreparedComparison_21(Slot sourceSlot) { this.sourceSlot = sourceSlot; } public int CompareTo(object obj) { Slot targetSlot = (Slot)obj; // FIXME: The comparison method in #compareByLength is the wrong way around. // Fix there and here after other references are fixed. return -sourceSlot.CompareByLength(targetSlot); } private readonly Slot sourceSlot; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Replication/0000755000175000017500000000000011700531646027054 5ustar00meebeymeebey00000000000000IDb4oReplicationReference.cs0000644000175000017500000000046311700531646034241 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Replication/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Internal.Replication { /// public interface IDb4oReplicationReference { Db4oDatabase SignaturePart(); long LongPart(); long Version(); } } IDb4oReplicationReferenceProvider.cs0000644000175000017500000000046711700531646035760 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Replication/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Replication; namespace Db4objects.Db4o.Internal.Replication { /// public interface IDb4oReplicationReferenceProvider { IDb4oReplicationReference ReferenceFor(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/SystemInfoFileImpl.cs0000644000175000017500000000210311700531646030650 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; namespace Db4objects.Db4o.Internal { /// public class SystemInfoFileImpl : ISystemInfo { private LocalObjectContainer _file; public SystemInfoFileImpl(LocalObjectContainer file) { _file = file; } public virtual int FreespaceEntryCount() { if (!HasFreespaceManager()) { return 0; } return FreespaceManager().SlotCount(); } private bool HasFreespaceManager() { return FreespaceManager() != null; } private IFreespaceManager FreespaceManager() { return _file.FreespaceManager(); } public virtual long FreespaceSize() { if (!HasFreespaceManager()) { return 0; } long blockSize = _file.BlockSize(); long blockedSize = FreespaceManager().TotalFreespace(); return blockSize * blockedSize; } public virtual long TotalSize() { return _file.FileLength(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TypeHandlerAspect.cs0000644000175000017500000001245011700531646030513 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class TypeHandlerAspect : ClassAspect { public readonly ITypeHandler4 _typeHandler; private readonly ClassMetadata _ownerMetadata; public TypeHandlerAspect(ClassMetadata classMetadata, ITypeHandler4 typeHandler) { if (Handlers4.IsValueType(typeHandler)) { throw new InvalidOperationException(); } _ownerMetadata = classMetadata; _typeHandler = typeHandler; } public override bool Equals(object obj) { if (obj == this) { return true; } if (obj == null || obj.GetType() != GetType()) { return false; } Db4objects.Db4o.Internal.TypeHandlerAspect other = (Db4objects.Db4o.Internal.TypeHandlerAspect )obj; return _typeHandler.Equals(other._typeHandler); } public override int GetHashCode() { return _typeHandler.GetHashCode(); } public override string GetName() { return _typeHandler.GetType().FullName; } public override void CascadeActivation(IActivationContext context) { if (!Handlers4.IsCascading(_typeHandler)) { return; } Handlers4.CascadeActivation(context, _typeHandler); } public override void CollectIDs(CollectIdContext context) { if (!Handlers4.IsCascading(_typeHandler)) { IncrementOffset(context); return; } context.SlotFormat().DoWithSlotIndirection(context, new _IClosure4_58(this, context )); } private sealed class _IClosure4_58 : IClosure4 { public _IClosure4_58(TypeHandlerAspect _enclosing, CollectIdContext context) { this._enclosing = _enclosing; this.context = context; } public object Run() { QueryingReadContext queryingReadContext = new QueryingReadContext(context.Transaction (), context.HandlerVersion(), context.Buffer(), 0, context.Collector()); ((ICascadingTypeHandler)this._enclosing._typeHandler).CollectIDs(queryingReadContext ); return null; } private readonly TypeHandlerAspect _enclosing; private readonly CollectIdContext context; } public override void DefragAspect(IDefragmentContext context) { context.SlotFormat().DoWithSlotIndirection(context, new _IClosure4_68(this, context )); } private sealed class _IClosure4_68 : IClosure4 { public _IClosure4_68(TypeHandlerAspect _enclosing, IDefragmentContext context) { this._enclosing = _enclosing; this.context = context; } public object Run() { this._enclosing._typeHandler.Defragment(context); return null; } private readonly TypeHandlerAspect _enclosing; private readonly IDefragmentContext context; } public override int LinkLength() { return Const4.IndirectionLength; } public override void Marshall(MarshallingContext context, object obj) { context.CreateIndirectionWithinSlot(); if (IsNotHandlingConcreteType(context)) { _typeHandler.Write(context, obj); return; } if (_typeHandler is IInstantiatingTypeHandler) { IInstantiatingTypeHandler instantiating = (IInstantiatingTypeHandler)_typeHandler; instantiating.WriteInstantiation(context, obj); instantiating.Write(context, obj); } else { _typeHandler.Write(context, obj); } } private bool IsNotHandlingConcreteType(MarshallingContext context) { return context.ClassMetadata() != _ownerMetadata; } public override Db4objects.Db4o.Internal.Marshall.AspectType AspectType() { return Db4objects.Db4o.Internal.Marshall.AspectType.Typehandler; } public override void Activate(UnmarshallingContext context) { if (!CheckEnabled(context)) { return; } context.SlotFormat().DoWithSlotIndirection(context, new _IClosure4_110(this, context )); } private sealed class _IClosure4_110 : IClosure4 { public _IClosure4_110(TypeHandlerAspect _enclosing, UnmarshallingContext context) { this._enclosing = _enclosing; this.context = context; } public object Run() { Handlers4.Activate(context, this._enclosing._typeHandler); return null; } private readonly TypeHandlerAspect _enclosing; private readonly UnmarshallingContext context; } public override void Delete(DeleteContextImpl context, bool isUpdate) { context.SlotFormat().DoWithSlotIndirection(context, new _IClosure4_119(this, context )); } private sealed class _IClosure4_119 : IClosure4 { public _IClosure4_119(TypeHandlerAspect _enclosing, DeleteContextImpl context) { this._enclosing = _enclosing; this.context = context; } public object Run() { this._enclosing._typeHandler.Delete(context); return null; } private readonly TypeHandlerAspect _enclosing; private readonly DeleteContextImpl context; } public override void Deactivate(IActivationContext context) { CascadeActivation(context); } public override bool CanBeDisabled() { return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/LocalTransaction.cs0000644000175000017500000003247111700531646030401 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal { /// public class LocalTransaction : Transaction { private readonly IdentitySet4 _participants = new IdentitySet4(); internal Tree _writtenUpdateAdjustedIndexes; protected readonly LocalObjectContainer _file; private readonly ICommittedCallbackDispatcher _committedCallbackDispatcher; private readonly ITransactionalIdSystem _idSystem; private Db4objects.Db4o.Internal.CommitTimestampSupport _commitTimestampSupport = null; private long _timestamp; public LocalTransaction(ObjectContainerBase container, Transaction parentTransaction , ITransactionalIdSystem idSystem, IReferenceSystem referenceSystem) : base(container , parentTransaction, referenceSystem) { _file = (LocalObjectContainer)container; _committedCallbackDispatcher = new _ICommittedCallbackDispatcher_35(this); _idSystem = idSystem; } private sealed class _ICommittedCallbackDispatcher_35 : ICommittedCallbackDispatcher { public _ICommittedCallbackDispatcher_35(LocalTransaction _enclosing) { this._enclosing = _enclosing; } public bool WillDispatchCommitted() { return this._enclosing.Callbacks().CaresAboutCommitted(); } public void DispatchCommitted(CallbackObjectInfoCollections committedInfo) { this._enclosing.Callbacks().CommitOnCompleted(this._enclosing, committedInfo, false ); } private readonly LocalTransaction _enclosing; } public virtual Config4Impl Config() { return Container().Config(); } public virtual LocalObjectContainer LocalContainer() { return _file; } public override void Commit() { if (IsSystemTransaction()) { CommitTimestampSupport().EnsureInitialized(); } Commit(_committedCallbackDispatcher); } public virtual void Commit(ICommittedCallbackDispatcher dispatcher) { lock (Container().Lock()) { DispatchCommittingCallback(); if (!DoCommittedCallbacks(dispatcher)) { CommitListeners(); CommitImpl(); CommitClearAll(); } else { CommitListeners(); Collection4 deleted = CollectCommittedCallbackDeletedInfo(); CommitImpl(); CallbackObjectInfoCollections committedInfo = CollectCommittedCallbackInfo(deleted ); CommitClearAll(); dispatcher.DispatchCommitted(CallbackObjectInfoCollections.Emtpy == committedInfo ? committedInfo : new CallbackObjectInfoCollections(committedInfo.added, committedInfo .updated, new ObjectInfoCollectionImpl(deleted))); } } } private void DispatchCommittingCallback() { if (DoCommittingCallbacks()) { Callbacks().CommitOnStarted(this, CollectCommittingCallbackInfo()); } } private bool DoCommittedCallbacks(ICommittedCallbackDispatcher dispatcher) { if (IsSystemTransaction()) { return false; } return dispatcher.WillDispatchCommitted(); } private bool DoCommittingCallbacks() { if (IsSystemTransaction()) { return false; } return Callbacks().CaresAboutCommitting(); } public virtual void Enlist(ITransactionParticipant participant) { if (null == participant) { throw new ArgumentNullException(); } CheckSynchronization(); if (!_participants.Contains(participant)) { _participants.Add(participant); } } private void CommitImpl() { if (DTrace.enabled) { DTrace.TransCommit.LogInfo("server == " + Container().IsServer() + ", systemtrans == " + IsSystemTransaction()); } CommitClassMetadata(); CommitParticipants(); Container().WriteDirtyClassMetadata(); IdSystem().Commit(new FreespaceCommitter(LocalContainer().FreespaceManager())); } private void CommitListeners() { CommitParentListeners(); CommitTransactionListeners(); } private void CommitParentListeners() { if (_systemTransaction != null) { ParentLocalTransaction().CommitListeners(); } } private void CommitParticipants() { if (ParentLocalTransaction() != null) { ParentLocalTransaction().CommitParticipants(); } IEnumerator iterator = _participants.GetEnumerator(); while (iterator.MoveNext()) { ((ITransactionParticipant)iterator.Current).Commit(this); } } private void CommitClassMetadata() { Container().ProcessPendingClassUpdates(); Container().WriteDirtyClassMetadata(); Container().ClassCollection().Write(Container().SystemTransaction()); } private Db4objects.Db4o.Internal.LocalTransaction ParentLocalTransaction() { return (Db4objects.Db4o.Internal.LocalTransaction)_systemTransaction; } private void CommitClearAll() { if (_systemTransaction != null) { ParentLocalTransaction().CommitClearAll(); } ClearAll(); } protected override void Clear() { IdSystem().Clear(); DisposeParticipants(); _participants.Clear(); } private void DisposeParticipants() { IEnumerator iterator = _participants.ValuesIterator(); while (iterator.MoveNext()) { ((ITransactionParticipant)iterator.Current).Dispose(this); } } public override void Rollback() { lock (Container().Lock()) { RollbackParticipants(); IdSystem().Rollback(); RollBackTransactionListeners(); ClearAll(); } } private void RollbackParticipants() { IEnumerator iterator = _participants.ValuesIterator(); while (iterator.MoveNext()) { ((ITransactionParticipant)iterator.Current).Rollback(this); } } public virtual void FlushFile() { if (DTrace.enabled) { DTrace.TransFlush.Log(); } _file.SyncFiles(); } public override void ProcessDeletes() { if (_delete == null) { _writtenUpdateAdjustedIndexes = null; return; } while (_delete != null) { Tree delete = _delete; _delete = null; delete.Traverse(new _IVisitor4_225(this)); } // if the object has been deleted // We need to hold a hard reference here, otherwise we can get // intermediate garbage collection kicking in. // This means the object was gc'd. // Let's try to read it again, but this may fail in // CS mode if another transaction has deleted it. _writtenUpdateAdjustedIndexes = null; } private sealed class _IVisitor4_225 : IVisitor4 { public _IVisitor4_225(LocalTransaction _enclosing) { this._enclosing = _enclosing; } public void Visit(object a_object) { DeleteInfo info = (DeleteInfo)a_object; if (this._enclosing.LocalContainer().IsDeleted(this._enclosing, info._key)) { return; } object obj = null; if (info._reference != null) { obj = info._reference.GetObject(); } if (obj == null || info._reference.GetID() < 0) { HardObjectReference hardRef = this._enclosing.Container().GetHardObjectReferenceById (this._enclosing, info._key); if (hardRef == HardObjectReference.Invalid) { return; } info._reference = hardRef._reference; info._reference.FlagForDelete(this._enclosing.Container().TopLevelCallId()); obj = info._reference.GetObject(); } this._enclosing.Container().Delete3(this._enclosing, info._reference, obj, info._cascade , false); } private readonly LocalTransaction _enclosing; } public override void WriteUpdateAdjustIndexes(int id, ClassMetadata clazz, ArrayType typeInfo) { new WriteUpdateProcessor(this, id, clazz, typeInfo).Run(); } private ICallbacks Callbacks() { return Container().Callbacks(); } private Collection4 CollectCommittedCallbackDeletedInfo() { Collection4 deleted = new Collection4(); CollectCallBackInfo(new _ICallbackInfoCollector_275(this, deleted)); return deleted; } private sealed class _ICallbackInfoCollector_275 : ICallbackInfoCollector { public _ICallbackInfoCollector_275(LocalTransaction _enclosing, Collection4 deleted ) { this._enclosing = _enclosing; this.deleted = deleted; } public void Deleted(int id) { IObjectInfo @ref = this._enclosing.FrozenReferenceFor(id); if (@ref != null) { deleted.Add(@ref); } } public void Updated(int id) { } public void Added(int id) { } private readonly LocalTransaction _enclosing; private readonly Collection4 deleted; } private CallbackObjectInfoCollections CollectCommittedCallbackInfo(Collection4 deleted ) { if (!IdSystem().IsDirty()) { return CallbackObjectInfoCollections.Emtpy; } Collection4 added = new Collection4(); Collection4 updated = new Collection4(); CollectCallBackInfo(new _ICallbackInfoCollector_298(this, added, updated)); return NewCallbackObjectInfoCollections(added, updated, deleted); } private sealed class _ICallbackInfoCollector_298 : ICallbackInfoCollector { public _ICallbackInfoCollector_298(LocalTransaction _enclosing, Collection4 added , Collection4 updated) { this._enclosing = _enclosing; this.added = added; this.updated = updated; } public void Added(int id) { added.Add(this._enclosing.LazyReferenceFor(id)); } public void Updated(int id) { updated.Add(this._enclosing.LazyReferenceFor(id)); } public void Deleted(int id) { } private readonly LocalTransaction _enclosing; private readonly Collection4 added; private readonly Collection4 updated; } private CallbackObjectInfoCollections CollectCommittingCallbackInfo() { if (!IdSystem().IsDirty()) { return CallbackObjectInfoCollections.Emtpy; } Collection4 added = new Collection4(); Collection4 deleted = new Collection4(); Collection4 updated = new Collection4(); CollectCallBackInfo(new _ICallbackInfoCollector_321(this, added, updated, deleted )); return NewCallbackObjectInfoCollections(added, updated, deleted); } private sealed class _ICallbackInfoCollector_321 : ICallbackInfoCollector { public _ICallbackInfoCollector_321(LocalTransaction _enclosing, Collection4 added , Collection4 updated, Collection4 deleted) { this._enclosing = _enclosing; this.added = added; this.updated = updated; this.deleted = deleted; } public void Added(int id) { added.Add(this._enclosing.LazyReferenceFor(id)); } public void Updated(int id) { updated.Add(this._enclosing.LazyReferenceFor(id)); } public void Deleted(int id) { IObjectInfo @ref = this._enclosing.FrozenReferenceFor(id); if (@ref != null) { deleted.Add(@ref); } } private readonly LocalTransaction _enclosing; private readonly Collection4 added; private readonly Collection4 updated; private readonly Collection4 deleted; } private CallbackObjectInfoCollections NewCallbackObjectInfoCollections(Collection4 added, Collection4 updated, Collection4 deleted) { return new CallbackObjectInfoCollections(new ObjectInfoCollectionImpl(added), new ObjectInfoCollectionImpl(updated), new ObjectInfoCollectionImpl(deleted)); } private void CollectCallBackInfo(ICallbackInfoCollector collector) { IdSystem().CollectCallBackInfo(collector); } public override ITransactionalIdSystem IdSystem() { return _idSystem; } public virtual IObjectInfo FrozenReferenceFor(int id) { ObjectReference @ref = ReferenceForId(id); if (@ref != null) { return new FrozenObjectInfo(this, @ref, true); } @ref = Container().PeekReference(SystemTransaction(), id, new FixedActivationDepth (0), true); if (@ref == null || @ref.GetObject() == null) { return null; } return new FrozenObjectInfo(SystemTransaction(), @ref, true); } public virtual LazyObjectReference LazyReferenceFor(int id) { return new LazyObjectReference(this, id); } public override long VersionForId(int id) { return CommitTimestampSupport().VersionForId(id); } public virtual Db4objects.Db4o.Internal.CommitTimestampSupport CommitTimestampSupport () { if (!IsSystemTransaction()) { throw new InvalidOperationException(); } if (_commitTimestampSupport == null) { _commitTimestampSupport = new Db4objects.Db4o.Internal.CommitTimestampSupport(LocalContainer ()); } return _commitTimestampSupport; } public override long GenerateTransactionTimestamp(long forcedTimeStamp) { if (forcedTimeStamp > 0) { _timestamp = forcedTimeStamp; } else { _timestamp = LocalContainer().GenerateTimeStampId(); } return _timestamp; } public override void UseDefaultTransactionTimestamp() { _timestamp = 0; } public virtual long Timestamp() { return _timestamp; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ReflectException.cs0000644000175000017500000000211111700531646030370 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Internal { /// /// db4o-specific exception.
///
/// This exception is thrown when one of the db4o reflection methods fails. ///
/// /// db4o-specific exception.
///
/// This exception is thrown when one of the db4o reflection methods fails. ///
/// Db4objects.Db4o.Reflect [System.Serializable] public class ReflectException : Db4oRecoverableException { public ReflectException(string msg, Exception cause) : base(msg, cause) { } /// Constructor with the cause exception /// cause exception public ReflectException(Exception cause) : base(cause) { } /// Constructor with message /// detailed explanation public ReflectException(string message) : base(message) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Collections/0000755000175000017500000000000011700531646027061 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Collections/BigSetTypeHandler.cs0000644000175000017500000000550411700531646032731 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Collections; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Collections { /// public class BigSetTypeHandler : IReferenceTypeHandler, ICascadingTypeHandler { public virtual void Defragment(IDefragmentContext context) { int pos = context.Offset(); int id = context.ReadInt(); BTree bTree = NewBTree(context, id); DefragmentServicesImpl services = (DefragmentServicesImpl)context.Services(); IDMappingCollector collector = new IDMappingCollector(); services.RegisterBTreeIDs(bTree, collector); collector.Flush(services); context.Seek(pos); context.CopyID(); bTree.DefragBTree(services); } /// public virtual void Delete(IDeleteContext context) { InvalidBigSet(context); int id = context.ReadInt(); FreeBTree(context, id); } private void InvalidBigSet(IDeleteContext context) { IBigSetPersistence bigSet = (IBigSetPersistence)context.Transaction().ObjectForIdFromCache (context.ObjectId()); if (bigSet != null) { bigSet.Invalidate(); } } private void FreeBTree(IDeleteContext context, int id) { BTree bTree = NewBTree(context, id); bTree.Free(SystemTransaction(context)); bTree = null; } private static LocalTransaction SystemTransaction(IContext context) { return (LocalTransaction)context.Transaction().SystemTransaction(); } private BTree NewBTree(IContext context, int id) { return new BTree(SystemTransaction(context), id, new IDHandler()); } public virtual void Write(IWriteContext context, object obj) { IBigSetPersistence bigSet = (IBigSetPersistence)obj; bigSet.Write(context); } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { // TODO Auto-generated method stub return null; } public virtual void Activate(IReferenceActivationContext context) { IBigSetPersistence bigSet = (IBigSetPersistence)context.PersistentObject(); bigSet.Read(context); } public virtual void CascadeActivation(IActivationContext context) { } // TODO Auto-generated method stub public virtual void CollectIDs(QueryingReadContext context) { } // TODO Auto-generated method stub public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { // TODO Auto-generated method stub return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Collections/BigSet.cs0000644000175000017500000001072211700531646030567 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Collections; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Collections { /// public partial class BigSet : Db4objects.Db4o.Collections.ISet, IBigSetPersistence { private Db4objects.Db4o.Internal.Btree.BTree _bTree; private Db4objects.Db4o.Internal.Transaction _transaction; public BigSet(LocalObjectContainer db) { if (db == null) { return; } _transaction = db.Transaction; _bTree = BTreeManager().NewBTree(); } private ObjectContainerBase Container() { return Transaction().Container(); } public virtual bool Add(E obj) { lock (Lock()) { int id = GetID(obj); if (id == 0) { Add(Store(obj)); return true; } if (Contains(id)) { return false; } Add(id); return true; } } private int Store(E obj) { return Container().Store(_transaction, obj, Container().UpdateDepthProvider().Unspecified (NullModifiedObjectQuery.Instance)); } private void Add(int id) { BTreeForUpdate().Add(_transaction, id); } private int GetID(object obj) { return (int)Container().GetID(obj); } public virtual bool AddAll(IEnumerable iterable) { bool result = false; foreach (E element in iterable) { if (Add(element)) { result = true; } } return result; } public virtual void Clear() { lock (Lock()) { BTreeForUpdate().Clear(Transaction()); } } public virtual bool Contains(object obj) { int id = GetID(obj); if (id == 0) { return false; } return Contains(id); } private bool Contains(int id) { lock (Lock()) { IBTreeRange range = BTree().SearchRange(Transaction(), id); return !range.IsEmpty(); } } public virtual bool IsEmpty { get { return Count == 0; } } private IEnumerator BTreeIterator() { return new SynchronizedIterator4(BTree().Iterator(Transaction()), Lock()); } public virtual bool Remove(object obj) { lock (Lock()) { if (!Contains(obj)) { return false; } int id = GetID(obj); BTreeForUpdate().Remove(Transaction(), id); return true; } } public virtual int Count { get { lock (Lock()) { return BTree().Size(Transaction()); } } } public virtual object[] ToArray() { throw new NotSupportedException(); } public virtual T[] ToArray(T[] a) { throw new NotSupportedException(); } public virtual void Write(IWriteContext context) { int id = BTree().GetID(); if (id == 0) { BTree().Write(SystemTransaction()); } context.WriteInt(BTree().GetID()); } public virtual void Read(IReadContext context) { int id = context.ReadInt(); if (_bTree != null) { AssertCurrentBTreeId(id); return; } _transaction = context.Transaction(); _bTree = BTreeManager().ProduceBTree(id); } private BigSetBTreeManager BTreeManager() { return new BigSetBTreeManager(_transaction); } private void AssertCurrentBTreeId(int id) { if (id != _bTree.GetID()) { throw new InvalidOperationException(); } } private Db4objects.Db4o.Internal.Transaction Transaction() { return _transaction; } private Db4objects.Db4o.Internal.Transaction SystemTransaction() { return Container().SystemTransaction(); } public virtual void Invalidate() { _bTree = null; } private Db4objects.Db4o.Internal.Btree.BTree BTree() { if (_bTree == null) { throw new InvalidOperationException(); } return _bTree; } private Db4objects.Db4o.Internal.Btree.BTree BTreeForUpdate() { Db4objects.Db4o.Internal.Btree.BTree bTree = BTree(); BTreeManager().EnsureIsManaged(bTree); return bTree; } private object Element(int id) { object obj = Container().GetByID(Transaction(), id); Container().Activate(obj); return obj; } private object Lock() { return Container().Lock(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Collections/IBigSetPersistence.cs0000644000175000017500000000045711700531646033111 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Collections { public interface IBigSetPersistence { void Write(IWriteContext context); void Read(IReadContext context); void Invalidate(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Collections/BigSetBTreeManager.cs0000644000175000017500000000435111700531646033005 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Handlers; namespace Db4objects.Db4o.Internal.Collections { /// public class BigSetBTreeManager { private sealed class _TransactionLocal_14 : TransactionLocal { public _TransactionLocal_14() { } public override object InitialValueFor(Transaction transaction) { return new Hashtable(); } } private static readonly TransactionLocal _bTreesInTransaction = new _TransactionLocal_14 (); private readonly Transaction _transaction; internal BigSetBTreeManager(Transaction transaction) { _transaction = transaction; } internal virtual BTree ProduceBTree(int id) { AssertValidBTreeId(id); BTree bTree = ExistingBTreeInTransactionWith(id); if (null == bTree) { bTree = NewBTreeWithId(id); RegisterBTreeInTransaction(bTree); } return bTree; } internal virtual BTree NewBTree() { BTree bTree = NewBTreeWithId(0); bTree.Write(SystemTransaction()); RegisterBTreeInTransaction(bTree); return bTree; } internal virtual void EnsureIsManaged(BTree tree) { RegisterBTreeInTransaction(tree); } private BTree NewBTreeWithId(int id) { return NewBTreeWithId(id, SystemTransaction()); } private Transaction SystemTransaction() { return _transaction.SystemTransaction(); } private static BTree NewBTreeWithId(int id, Transaction systemTransaction) { return new BTree(systemTransaction, id, new IntHandler()); } private static void AssertValidBTreeId(int id) { if (id <= 0) { throw new ArgumentException(); } } private void RegisterBTreeInTransaction(BTree tree) { AssertValidBTreeId(tree.GetID()); BTreesIn(_transaction)[tree.GetID()] = tree; } private BTree ExistingBTreeInTransactionWith(int id) { return ((BTree)BTreesIn(_transaction)[id]); } private static IDictionary BTreesIn(Transaction transaction) { return ((IDictionary)transaction.Get(_bTreesInTransaction).value); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/HandlerVersionRegistry.cs0000644000175000017500000000473211700531646031614 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class HandlerVersionRegistry { private readonly HandlerRegistry _registry; private readonly Hashtable4 _versions = new Hashtable4(); public HandlerVersionRegistry(HandlerRegistry registry) { _registry = registry; } public virtual void Put(ITypeHandler4 handler, int version, ITypeHandler4 replacement ) { _versions.Put(new HandlerVersionRegistry.HandlerVersionKey(this, handler, version ), replacement); } public virtual ITypeHandler4 CorrectHandlerVersion(ITypeHandler4 originalHandler, int version) { if (version >= HandlerRegistry.HandlerVersion) { return originalHandler; } if (originalHandler == null) { return null; } // HandlerVersionKey with null key will throw NPE. ITypeHandler4 replacement = (ITypeHandler4)_versions.Get(new HandlerVersionRegistry.HandlerVersionKey (this, GenericTemplate(originalHandler), version)); if (replacement == null) { return CorrectHandlerVersion(originalHandler, version + 1); } if (replacement is IVersionedTypeHandler) { return (ITypeHandler4)((IVersionedTypeHandler)replacement).DeepClone(new TypeHandlerCloneContext (_registry, originalHandler, version)); } return replacement; } private ITypeHandler4 GenericTemplate(ITypeHandler4 handler) { if (handler is IVersionedTypeHandler) { return ((IVersionedTypeHandler)handler).UnversionedTemplate(); } return handler; } private class HandlerVersionKey { private readonly ITypeHandler4 _handler; private readonly int _version; public HandlerVersionKey(HandlerVersionRegistry _enclosing, ITypeHandler4 handler , int version) { this._enclosing = _enclosing; this._handler = handler; this._version = version; } public override int GetHashCode() { return this._handler.GetHashCode() + this._version * 4271; } public override bool Equals(object obj) { HandlerVersionRegistry.HandlerVersionKey other = (HandlerVersionRegistry.HandlerVersionKey )obj; return this._handler.Equals(other._handler) && this._version == other._version; } private readonly HandlerVersionRegistry _enclosing; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/0000755000175000017500000000000011700531646025322 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/TransactionalIdSystemImpl.cs0000644000175000017500000001261511700531646032764 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Ids { /// public class TransactionalIdSystemImpl : ITransactionalIdSystem { private IdSlotChanges _slotChanges; private Db4objects.Db4o.Internal.Ids.TransactionalIdSystemImpl _parentIdSystem; private readonly IClosure4 _globalIdSystem; public TransactionalIdSystemImpl(IClosure4 freespaceManager, IClosure4 globalIdSystem , Db4objects.Db4o.Internal.Ids.TransactionalIdSystemImpl parentIdSystem) { _globalIdSystem = globalIdSystem; _slotChanges = new IdSlotChanges(this, freespaceManager); _parentIdSystem = parentIdSystem; } public virtual void CollectCallBackInfo(ICallbackInfoCollector collector) { if (!_slotChanges.IsDirty()) { return; } _slotChanges.TraverseSlotChanges(new _IVisitor4_31(collector)); } private sealed class _IVisitor4_31 : IVisitor4 { public _IVisitor4_31(ICallbackInfoCollector collector) { this.collector = collector; } public void Visit(object slotChange) { int id = ((TreeInt)slotChange)._key; if (((SlotChange)slotChange).IsDeleted()) { if (!((SlotChange)slotChange).IsNew()) { collector.Deleted(id); } } else { if (((SlotChange)slotChange).IsNew()) { collector.Added(id); } else { collector.Updated(id); } } } private readonly ICallbackInfoCollector collector; } public virtual bool IsDirty() { return _slotChanges.IsDirty(); } public virtual void Commit(FreespaceCommitter freespaceCommitter) { IVisitable slotChangeVisitable = new _IVisitable_52(this); freespaceCommitter.TransactionalIdSystem(this); AccumulateFreeSlots(freespaceCommitter, false); GlobalIdSystem().Commit(slotChangeVisitable, freespaceCommitter); } private sealed class _IVisitable_52 : IVisitable { public _IVisitable_52(TransactionalIdSystemImpl _enclosing) { this._enclosing = _enclosing; } public void Accept(IVisitor4 visitor) { this._enclosing.TraverseSlotChanges(visitor); } private readonly TransactionalIdSystemImpl _enclosing; } public virtual void AccumulateFreeSlots(FreespaceCommitter accumulator, bool forFreespace ) { _slotChanges.AccumulateFreeSlots(accumulator, forFreespace, IsSystemIdSystem()); if (_parentIdSystem != null) { _parentIdSystem.AccumulateFreeSlots(accumulator, forFreespace); } } private bool IsSystemIdSystem() { return _parentIdSystem == null; } public virtual void CompleteInterruptedTransaction(int transactionId1, int transactionId2 ) { GlobalIdSystem().CompleteInterruptedTransaction(transactionId1, transactionId2); } public virtual Slot CommittedSlot(int id) { if (id == 0) { return null; } return GlobalIdSystem().CommittedSlot(id); } public virtual Slot CurrentSlot(int id) { Slot slot = ModifiedSlot(id); if (slot != null) { return slot; } return CommittedSlot(id); } public virtual Slot ModifiedSlot(int id) { if (id == 0) { return null; } SlotChange change = _slotChanges.FindSlotChange(id); if (change != null) { if (change.SlotModified()) { return change.NewSlot(); } } return ModifiedSlotInParentIdSystem(id); } public Slot ModifiedSlotInParentIdSystem(int id) { if (_parentIdSystem == null) { return null; } return _parentIdSystem.ModifiedSlot(id); } public virtual void Rollback() { _slotChanges.Rollback(); } public virtual void Clear() { _slotChanges.Clear(); } public virtual bool IsDeleted(int id) { return _slotChanges.IsDeleted(id); } public virtual void NotifySlotUpdated(int id, Slot slot, SlotChangeFactory slotChangeFactory ) { _slotChanges.NotifySlotUpdated(id, slot, slotChangeFactory); } private void TraverseSlotChanges(IVisitor4 visitor) { if (_parentIdSystem != null) { _parentIdSystem.TraverseSlotChanges(visitor); } _slotChanges.TraverseSlotChanges(visitor); } public virtual int NewId(SlotChangeFactory slotChangeFactory) { int id = AcquireId(); _slotChanges.ProduceSlotChange(id, slotChangeFactory).NotifySlotCreated(null); return id; } private int AcquireId() { return GlobalIdSystem().NewId(); } public virtual int PrefetchID() { int id = AcquireId(); _slotChanges.AddPrefetchedID(id); return id; } public virtual void PrefetchedIDConsumed(int id) { _slotChanges.PrefetchedIDConsumed(id); } public virtual void NotifySlotCreated(int id, Slot slot, SlotChangeFactory slotChangeFactory ) { _slotChanges.NotifySlotCreated(id, slot, slotChangeFactory); } public virtual void NotifySlotDeleted(int id, SlotChangeFactory slotChangeFactory ) { _slotChanges.NotifySlotDeleted(id, slotChangeFactory); } private IIdSystem GlobalIdSystem() { return ((IIdSystem)_globalIdSystem.Run()); } public virtual void Close() { _slotChanges.FreePrefetchedIDs(GlobalIdSystem()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/IIdSystem.cs0000644000175000017500000000107211700531646027523 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Ids { /// public interface IIdSystem { int NewId(); Slot CommittedSlot(int id); void ReturnUnusedIds(IVisitable visitable); void Close(); void CompleteInterruptedTransaction(int transactionId1, int transactionId2); void Commit(IVisitable slotChanges, FreespaceCommitter freespaceCommitter); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/TransportIdSystem.cs0000644000175000017500000000362711700531646031337 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Ids { /// public sealed class TransportIdSystem : ITransactionalIdSystem { private readonly LocalObjectContainer _container; public TransportIdSystem(LocalObjectContainer localObjectContainer) { _container = localObjectContainer; } public int NewId(SlotChangeFactory slotChangeFactory) { return _container.AllocatePointerSlot(); } public void NotifySlotCreated(int id, Slot slot, SlotChangeFactory slotChangeFactory ) { WritePointer(id, slot); } private void WritePointer(int id, Slot slot) { _container.WritePointer(id, slot); } public void NotifySlotUpdated(int id, Slot slot, SlotChangeFactory slotChangeFactory ) { WritePointer(id, slot); } public void NotifySlotDeleted(int id, SlotChangeFactory slotChangeFactory) { WritePointer(id, Slot.Zero); } public void Commit(FreespaceCommitter accumulator) { } // don't do anything public Slot CurrentSlot(int id) { return CommittedSlot(id); } public void CollectCallBackInfo(ICallbackInfoCollector collector) { } // do nothing public void Clear() { } // TODO Auto-generated method stub public Slot CommittedSlot(int id) { return _container.ReadPointerSlot(id); } public bool IsDeleted(int id) { return false; } public bool IsDirty() { return false; } public int PrefetchID() { return 0; } public void PrefetchedIDConsumed(int id) { } public void Rollback() { } public void Close() { } public void AccumulateFreeSlots(FreespaceCommitter freespaceCommitter, bool forFreespace ) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/SequentialIdGenerator.cs0000644000175000017500000000446111700531646032114 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Ids { /// public class SequentialIdGenerator { private readonly int _minValidId; private readonly int _maxValidId; private int _idGenerator; private bool _overflow; private int _lastIdGenerator; private readonly IFunction4 _findFreeId; public SequentialIdGenerator(IFunction4 findFreeId, int initialValue, int minValidId , int maxValidId) { _findFreeId = findFreeId; _minValidId = minValidId; _maxValidId = maxValidId; InitializeGenerator(initialValue); } public SequentialIdGenerator(IFunction4 findFreeId, int minValidId, int maxValidId ) : this(findFreeId, minValidId - 1, minValidId, maxValidId) { } public virtual void Read(ByteArrayBuffer buffer) { InitializeGenerator(buffer.ReadInt()); } private void InitializeGenerator(int val) { if (val < 0) { _overflow = true; _idGenerator = -val; } else { _idGenerator = val; } _lastIdGenerator = _idGenerator; } public virtual void Write(ByteArrayBuffer buffer) { buffer.WriteInt(PersistentGeneratorValue()); } public virtual int PersistentGeneratorValue() { return _overflow ? -_idGenerator : _idGenerator; } public virtual int NewId() { AdjustIdGenerator(_idGenerator); if (!_overflow) { return _idGenerator; } int id = (((int)_findFreeId.Apply(_idGenerator))); if (id > 0) { AdjustIdGenerator(id - 1); return id; } id = (((int)_findFreeId.Apply(_minValidId))); if (id > 0) { AdjustIdGenerator(id - 1); return id; } throw new Db4oFatalException("Out of IDs"); } private void AdjustIdGenerator(int id) { if (id == _maxValidId) { _idGenerator = _minValidId; _overflow = true; return; } _idGenerator = id + 1; } public virtual int MarshalledLength() { return Const4.IntLength; } public virtual bool IsDirty() { return _idGenerator != _lastIdGenerator; } public virtual void SetClean() { _lastIdGenerator = _idGenerator; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/InMemoryIdSystem.cs0000644000175000017500000002015411700531646031074 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Ids { /// public class InMemoryIdSystem : IStackableIdSystem { private readonly LocalObjectContainer _container; private IdSlotTree _ids; private Slot _slot; private readonly SequentialIdGenerator _idGenerator; private int _childId; /// for testing purposes only. /// for testing purposes only. public InMemoryIdSystem(LocalObjectContainer container, int maxValidId) { _container = container; _idGenerator = new SequentialIdGenerator(new _IFunction4_32(this, maxValidId), _container .Handlers.LowestValidId(), maxValidId); } private sealed class _IFunction4_32 : IFunction4 { public _IFunction4_32(InMemoryIdSystem _enclosing, int maxValidId) { this._enclosing = _enclosing; this.maxValidId = maxValidId; } public object Apply(object start) { return this._enclosing.FindFreeId((((int)start)), maxValidId); } private readonly InMemoryIdSystem _enclosing; private readonly int maxValidId; } public InMemoryIdSystem(LocalObjectContainer container) : this(container, int.MaxValue ) { ReadThis(); } private void ReadThis() { SystemData systemData = _container.SystemData(); _slot = systemData.IdSystemSlot(); if (!Slot.IsNull(_slot)) { ByteArrayBuffer buffer = _container.ReadBufferBySlot(_slot); _childId = buffer.ReadInt(); _idGenerator.Read(buffer); _ids = (IdSlotTree)new TreeReader(buffer, new IdSlotTree(0, null)).Read(); } } public virtual void Close() { } // do nothing public virtual void Commit(IVisitable slotChanges, FreespaceCommitter freespaceCommitter ) { Slot oldSlot = _slot; Slot reservedSlot = AllocateSlot(false, EstimatedSlotLength(EstimateMappingCount( slotChanges))); // No more operations against the FreespaceManager. // Time to free old slots. freespaceCommitter.Commit(); slotChanges.Accept(new _IVisitor4_69(this)); WriteThis(reservedSlot); FreeSlot(oldSlot); } private sealed class _IVisitor4_69 : IVisitor4 { public _IVisitor4_69(InMemoryIdSystem _enclosing) { this._enclosing = _enclosing; } public void Visit(object slotChange) { if (!((SlotChange)slotChange).SlotModified()) { return; } if (((SlotChange)slotChange).RemoveId()) { this._enclosing._ids = (IdSlotTree)Tree.RemoveLike(this._enclosing._ids, new TreeInt (((TreeInt)slotChange)._key)); return; } if (DTrace.enabled) { DTrace.SlotCommitted.LogLength(((TreeInt)slotChange)._key, ((SlotChange)slotChange ).NewSlot()); } this._enclosing._ids = ((IdSlotTree)Tree.Add(this._enclosing._ids, new IdSlotTree (((TreeInt)slotChange)._key, ((SlotChange)slotChange).NewSlot()))); } private readonly InMemoryIdSystem _enclosing; } private Slot AllocateSlot(bool appendToFile, int slotLength) { if (!appendToFile) { Slot slot = _container.FreespaceManager().AllocateSafeSlot(slotLength); if (slot != null) { return slot; } } return _container.AppendBytes(slotLength); } private int EstimateMappingCount(IVisitable slotChanges) { IntByRef count = new IntByRef(); count.value = _ids == null ? 0 : _ids.Size(); slotChanges.Accept(new _IVisitor4_103(count)); return count.value; } private sealed class _IVisitor4_103 : IVisitor4 { public _IVisitor4_103(IntByRef count) { this.count = count; } public void Visit(object slotChange) { if (!((SlotChange)slotChange).SlotModified() || ((SlotChange)slotChange).RemoveId ()) { return; } count.value++; } private readonly IntByRef count; } private void WriteThis(Slot reservedSlot) { // We need a little dance here to keep filling free slots // with X bytes. The FreespaceManager would do it immediately // upon the free call, but then our CrashSimulatingTestCase // fails because we have the Xses in the file before flushing. Slot xByteSlot = null; int slotLength = SlotLength(); if (reservedSlot.Length() >= slotLength) { _slot = reservedSlot; reservedSlot = null; } else { _slot = AllocateSlot(true, slotLength); } ByteArrayBuffer buffer = new ByteArrayBuffer(_slot.Length()); buffer.WriteInt(_childId); _idGenerator.Write(buffer); TreeInt.Write(buffer, _ids); _container.WriteBytes(buffer, _slot.Address(), 0); _container.SystemData().IdSystemSlot(_slot); IRunnable commitHook = _container.CommitHook(); _container.SyncFiles(commitHook); FreeSlot(reservedSlot); } private void FreeSlot(Slot slot) { if (Slot.IsNull(slot)) { return; } IFreespaceManager freespaceManager = _container.FreespaceManager(); if (freespaceManager == null) { return; } freespaceManager.FreeSafeSlot(slot); } private int SlotLength() { return TreeInt.MarshalledLength(_ids) + _idGenerator.MarshalledLength() + Const4. IdLength; } private int EstimatedSlotLength(int estimatedCount) { IdSlotTree template = _ids; if (template == null) { template = new IdSlotTree(0, new Slot(0, 0)); } return template.MarshalledLength(estimatedCount) + _idGenerator.MarshalledLength( ) + Const4.IdLength; } public virtual Slot CommittedSlot(int id) { IdSlotTree idSlotMapping = (IdSlotTree)Tree.Find(_ids, new TreeInt(id)); if (idSlotMapping == null) { throw new InvalidIDException(id); } return idSlotMapping.Slot(); } public virtual void CompleteInterruptedTransaction(int address, int length) { } // do nothing public virtual int NewId() { int id = _idGenerator.NewId(); _ids = ((IdSlotTree)Tree.Add(_ids, new IdSlotTree(id, Slot.Zero))); return id; } private int FindFreeId(int start, int end) { if (_ids == null) { return start; } IntByRef lastId = new IntByRef(); IntByRef freeId = new IntByRef(); Tree.Traverse(_ids, new TreeInt(start), new _ICancellableVisitor4_204(lastId, start , freeId)); if (freeId.value > 0) { return freeId.value; } if (lastId.value < end) { return Math.Max(start, lastId.value + 1); } return 0; } private sealed class _ICancellableVisitor4_204 : ICancellableVisitor4 { public _ICancellableVisitor4_204(IntByRef lastId, int start, IntByRef freeId) { this.lastId = lastId; this.start = start; this.freeId = freeId; } public bool Visit(object node) { int id = ((TreeInt)node)._key; if (lastId.value == 0) { if (id > start) { freeId.value = start; return false; } lastId.value = id; return true; } if (id > lastId.value + 1) { freeId.value = lastId.value + 1; return false; } lastId.value = id; return true; } private readonly IntByRef lastId; private readonly int start; private readonly IntByRef freeId; } public virtual void ReturnUnusedIds(IVisitable visitable) { visitable.Accept(new _IVisitor4_233(this)); } private sealed class _IVisitor4_233 : IVisitor4 { public _IVisitor4_233(InMemoryIdSystem _enclosing) { this._enclosing = _enclosing; } public void Visit(object obj) { this._enclosing._ids = (IdSlotTree)Tree.RemoveLike(this._enclosing._ids, new TreeInt ((((int)obj)))); } private readonly InMemoryIdSystem _enclosing; } public virtual int ChildId() { return _childId; } public virtual void ChildId(int id) { _childId = id; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/PointerBasedIdSystem.cs0000644000175000017500000000561011700531646031714 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Internal.Transactionlog; namespace Db4objects.Db4o.Internal.Ids { /// public sealed class PointerBasedIdSystem : IIdSystem { internal readonly TransactionLogHandler _transactionLogHandler; private readonly LocalObjectContainer _container; public PointerBasedIdSystem(LocalObjectContainer container) { _container = container; _transactionLogHandler = NewTransactionLogHandler(container); } public int NewId() { return _container.AllocatePointerSlot(); } public Slot CommittedSlot(int id) { return _container.ReadPointerSlot(id); } public void Commit(IVisitable slotChanges, FreespaceCommitter freespaceCommitter) { Slot reservedSlot = _transactionLogHandler.AllocateSlot(false, CountSlotChanges(slotChanges )); freespaceCommitter.Commit(); _transactionLogHandler.ApplySlotChanges(slotChanges, CountSlotChanges(slotChanges ), reservedSlot); } private int CountSlotChanges(IVisitable slotChanges) { IntByRef slotChangeCount = new IntByRef(); slotChanges.Accept(new _IVisitor4_40(slotChangeCount)); return slotChangeCount.value; } private sealed class _IVisitor4_40 : IVisitor4 { public _IVisitor4_40(IntByRef slotChangeCount) { this.slotChangeCount = slotChangeCount; } public void Visit(object slotChange) { if (((SlotChange)slotChange).SlotModified()) { slotChangeCount.value++; } } private readonly IntByRef slotChangeCount; } public void ReturnUnusedIds(IVisitable visitable) { visitable.Accept(new _IVisitor4_51(this)); } private sealed class _IVisitor4_51 : IVisitor4 { public _IVisitor4_51(PointerBasedIdSystem _enclosing) { this._enclosing = _enclosing; } public void Visit(object id) { this._enclosing._container.Free((((int)id)), Const4.PointerLength); } private readonly PointerBasedIdSystem _enclosing; } private TransactionLogHandler NewTransactionLogHandler(LocalObjectContainer container ) { bool fileBased = container.Config().FileBasedTransactionLog() && container is IoAdaptedObjectContainer; if (!fileBased) { return new EmbeddedTransactionLogHandler(container); } string fileName = ((IoAdaptedObjectContainer)container).FileName(); return new FileBasedTransactionLogHandler(container, fileName); } public void Close() { _transactionLogHandler.Close(); } public void CompleteInterruptedTransaction(int transactionId1, int transactionId2 ) { _transactionLogHandler.CompleteInterruptedTransaction(transactionId1, transactionId2 ); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/FreespaceCommitter.cs0000644000175000017500000000403511700531646031434 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Ids { /// public class FreespaceCommitter { public static readonly Db4objects.Db4o.Internal.Ids.FreespaceCommitter DoNothing = new FreespaceCommitter.NullFreespaceCommitter(); private readonly IList _freeToUserFreespaceSystem = new ArrayList(); private readonly IList _freeToSystemFreespaceSystem = new ArrayList(); private readonly IFreespaceManager _freespaceManager; private ITransactionalIdSystem _transactionalIdSystem; public FreespaceCommitter(IFreespaceManager freespaceManager) { _freespaceManager = freespaceManager == null ? NullFreespaceManager.Instance : freespaceManager; } public virtual void Commit() { Apply(_freeToUserFreespaceSystem); _freespaceManager.BeginCommit(); _freespaceManager.Commit(); _transactionalIdSystem.AccumulateFreeSlots(this, true); Apply(_freeToSystemFreespaceSystem); _freespaceManager.EndCommit(); } private void Apply(IList toFree) { for (IEnumerator slotIter = toFree.GetEnumerator(); slotIter.MoveNext(); ) { Slot slot = ((Slot)slotIter.Current); _freespaceManager.Free(slot); } toFree.Clear(); } public virtual void TransactionalIdSystem(ITransactionalIdSystem transactionalIdSystem ) { _transactionalIdSystem = transactionalIdSystem; } private class NullFreespaceCommitter : FreespaceCommitter { public NullFreespaceCommitter() : base(NullFreespaceManager.Instance) { } public override void Commit() { } // do nothing } public virtual void DelayedFree(Slot slot, bool freeToSystemFreeSpaceSystem) { if (freeToSystemFreeSpaceSystem) { _freeToSystemFreespaceSystem.Add(slot); } else { _freeToUserFreespaceSystem.Add(slot); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/IdSlotTree.cs0000644000175000017500000000244311700531646027672 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Ids { /// public class IdSlotTree : TreeInt { private readonly Db4objects.Db4o.Internal.Slots.Slot _slot; public IdSlotTree(int id, Db4objects.Db4o.Internal.Slots.Slot slot) : base(id) { _slot = slot; } public virtual Db4objects.Db4o.Internal.Slots.Slot Slot() { return _slot; } public override Tree OnAttemptToAddDuplicate(Tree oldNode) { _preceding = ((Tree)oldNode._preceding); _subsequent = ((Tree)oldNode._subsequent); _size = oldNode._size; return this; } public override int OwnLength() { return Const4.IntLength * 3; } // _key, _slot._address, _slot._length public override object Read(ByteArrayBuffer buffer) { int id = buffer.ReadInt(); Db4objects.Db4o.Internal.Slots.Slot slot = new Db4objects.Db4o.Internal.Slots.Slot (buffer.ReadInt(), buffer.ReadInt()); return new Db4objects.Db4o.Internal.Ids.IdSlotTree(id, slot); } public override void Write(ByteArrayBuffer buffer) { buffer.WriteInt(_key); buffer.WriteInt(_slot.Address()); buffer.WriteInt(_slot.Length()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/BTreeIdSystem.cs0000644000175000017500000002022011700531646030330 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Ids { /// public class BTreeIdSystem : IStackableIdSystem { private const int BtreeIdIndex = 0; private const int IdGeneratorIndex = 1; private const int ChildIdIndex = 2; private readonly LocalObjectContainer _container; private readonly IStackableIdSystem _parentIdSystem; private readonly ITransactionalIdSystem _transactionalIdSystem; private readonly SequentialIdGenerator _idGenerator; private BTree _bTree; private PersistentIntegerArray _persistentState; public BTreeIdSystem(LocalObjectContainer container, IStackableIdSystem parentIdSystem , int maxValidId) { _container = container; _parentIdSystem = parentIdSystem; _transactionalIdSystem = container.NewTransactionalIdSystem(null, new _IClosure4_40 (parentIdSystem)); int persistentArrayId = parentIdSystem.ChildId(); if (persistentArrayId == 0) { InitializeNew(); } else { InitializeExisting(persistentArrayId); } _idGenerator = new SequentialIdGenerator(new _IFunction4_52(this), IdGeneratorValue (), _container.Handlers.LowestValidId(), maxValidId); } private sealed class _IClosure4_40 : IClosure4 { public _IClosure4_40(IStackableIdSystem parentIdSystem) { this.parentIdSystem = parentIdSystem; } public object Run() { return parentIdSystem; } private readonly IStackableIdSystem parentIdSystem; } private sealed class _IFunction4_52 : IFunction4 { public _IFunction4_52(BTreeIdSystem _enclosing) { this._enclosing = _enclosing; } public object Apply(object start) { return this._enclosing.FindFreeId((((int)start))); } private readonly BTreeIdSystem _enclosing; } public BTreeIdSystem(LocalObjectContainer container, IStackableIdSystem idSystem) : this(container, idSystem, int.MaxValue) { } private void InitializeExisting(int persistentArrayId) { _persistentState = new PersistentIntegerArray(SlotChangeFactory.IdSystem, _transactionalIdSystem , persistentArrayId); _persistentState.Read(Transaction()); _bTree = new BTree(Transaction(), BTreeConfiguration(), BTreeId(), new BTreeIdSystem.IdSlotMappingHandler ()); } private Db4objects.Db4o.Internal.Btree.BTreeConfiguration BTreeConfiguration() { return new Db4objects.Db4o.Internal.Btree.BTreeConfiguration(_transactionalIdSystem , SlotChangeFactory.IdSystem, 64, false); } private int IdGeneratorValue() { return _persistentState.Array()[IdGeneratorIndex]; } private void IdGeneratorValue(int value) { _persistentState.Array()[IdGeneratorIndex] = value; } private int BTreeId() { return _persistentState.Array()[BtreeIdIndex]; } private void InitializeNew() { _bTree = new BTree(Transaction(), BTreeConfiguration(), new BTreeIdSystem.IdSlotMappingHandler ()); int idGeneratorValue = _container.Handlers.LowestValidId() - 1; _persistentState = new PersistentIntegerArray(SlotChangeFactory.IdSystem, _transactionalIdSystem , new int[] { _bTree.GetID(), idGeneratorValue, 0 }); _persistentState.Write(Transaction()); _parentIdSystem.ChildId(_persistentState.GetID()); } private int FindFreeId(int start) { throw new NotImplementedException(); } public virtual void Close() { } public virtual Slot CommittedSlot(int id) { IdSlotMapping mapping = (IdSlotMapping)_bTree.Search(Transaction(), new IdSlotMapping (id, 0, 0)); if (mapping == null) { throw new InvalidIDException(id); } return mapping.Slot(); } public virtual void CompleteInterruptedTransaction(int transactionId1, int transactionId2 ) { } // do nothing public virtual int NewId() { int id = _idGenerator.NewId(); _bTree.Add(Transaction(), new IdSlotMapping(id, 0, 0)); return id; } private Db4objects.Db4o.Internal.Transaction Transaction() { return _container.SystemTransaction(); } public virtual void Commit(IVisitable slotChanges, FreespaceCommitter freespaceCommitter ) { _container.FreespaceManager().BeginCommit(); slotChanges.Accept(new _IVisitor4_129(this)); // TODO: Maybe we want a BTree that doesn't allow duplicates. // Then we could do the following in one step without removing first. _bTree.Commit(Transaction()); IdGeneratorValue(_idGenerator.PersistentGeneratorValue()); if (_idGenerator.IsDirty()) { _idGenerator.SetClean(); _persistentState.SetStateDirty(); } if (_persistentState.IsDirty()) { _persistentState.Write(Transaction()); } _container.FreespaceManager().EndCommit(); _transactionalIdSystem.Commit(freespaceCommitter); _transactionalIdSystem.Clear(); } private sealed class _IVisitor4_129 : IVisitor4 { public _IVisitor4_129(BTreeIdSystem _enclosing) { this._enclosing = _enclosing; } public void Visit(object slotChange) { if (!((SlotChange)slotChange).SlotModified()) { return; } this._enclosing._bTree.Remove(this._enclosing.Transaction(), new IdSlotMapping((( TreeInt)slotChange)._key, 0, 0)); if (((SlotChange)slotChange).RemoveId()) { return; } this._enclosing._bTree.Add(this._enclosing.Transaction(), new IdSlotMapping(((TreeInt )slotChange)._key, ((SlotChange)slotChange).NewSlot())); if (DTrace.enabled) { DTrace.SlotMapped.LogLength(((TreeInt)slotChange)._key, ((SlotChange)slotChange). NewSlot()); } } private readonly BTreeIdSystem _enclosing; } public virtual void ReturnUnusedIds(IVisitable visitable) { visitable.Accept(new _IVisitor4_167(this)); } private sealed class _IVisitor4_167 : IVisitor4 { public _IVisitor4_167(BTreeIdSystem _enclosing) { this._enclosing = _enclosing; } public void Visit(object id) { this._enclosing._bTree.Remove(this._enclosing.Transaction(), new IdSlotMapping((( (int)id)), 0, 0)); } private readonly BTreeIdSystem _enclosing; } public class IdSlotMappingHandler : IIndexable4 { public virtual void DefragIndexEntry(DefragmentContextImpl context) { throw new NotImplementedException(); } public virtual object ReadIndexEntry(IContext context, ByteArrayBuffer buffer) { return IdSlotMapping.Read(buffer); } public virtual void WriteIndexEntry(IContext context, ByteArrayBuffer buffer, object mapping) { ((IdSlotMapping)mapping).Write(buffer); } public virtual IPreparedComparison PrepareComparison(IContext context, object sourceMapping ) { return new _IPreparedComparison_190(sourceMapping); } private sealed class _IPreparedComparison_190 : IPreparedComparison { public _IPreparedComparison_190(object sourceMapping) { this.sourceMapping = sourceMapping; } public int CompareTo(object targetMapping) { return ((IdSlotMapping)sourceMapping)._id == ((IdSlotMapping)targetMapping)._id ? 0 : (((IdSlotMapping)sourceMapping)._id < ((IdSlotMapping)targetMapping)._id ? - 1 : 1); } private readonly object sourceMapping; } public int LinkLength() { return Const4.IntLength * 3; } } public virtual ITransactionalIdSystem FreespaceIdSystem() { return _transactionalIdSystem; } public virtual int ChildId() { return _persistentState.Array()[ChildIdIndex]; } public virtual void ChildId(int id) { _persistentState.Array()[ChildIdIndex] = id; _persistentState.SetStateDirty(); } public virtual void TraverseIds(IVisitor4 visitor) { _bTree.TraverseKeys(_container.SystemTransaction(), visitor); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/ITransactionalIdSystem.cs0000644000175000017500000000203111700531646032242 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Ids { /// public interface ITransactionalIdSystem { void CollectCallBackInfo(ICallbackInfoCollector collector); bool IsDirty(); void Commit(FreespaceCommitter freespaceCommitter); Slot CommittedSlot(int id); Slot CurrentSlot(int id); void AccumulateFreeSlots(FreespaceCommitter freespaceCommitter, bool forFreespace ); void Rollback(); void Clear(); bool IsDeleted(int id); void NotifySlotUpdated(int id, Slot slot, SlotChangeFactory slotChangeFactory); void NotifySlotCreated(int id, Slot slot, SlotChangeFactory slotChangeFactory); void NotifySlotDeleted(int id, SlotChangeFactory slotChangeFactory); int NewId(SlotChangeFactory slotChangeFactory); int PrefetchID(); void PrefetchedIDConsumed(int id); void Close(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/StandardIdSystemFactory.cs0000644000175000017500000000435311700531646032430 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; namespace Db4objects.Db4o.Internal.Ids { /// public class StandardIdSystemFactory { public const byte Legacy = 0; public const byte PointerBased = 1; public const byte StackedBtree = 2; public const byte Default = StackedBtree; public const byte InMemory = 3; public const byte Custom = 4; public const byte SingleBtree = 5; public static IIdSystem NewInstance(LocalObjectContainer localContainer) { SystemData systemData = localContainer.SystemData(); byte idSystemType = systemData.IdSystemType(); switch (idSystemType) { case Legacy: { return new PointerBasedIdSystem(localContainer); } case PointerBased: { return new PointerBasedIdSystem(localContainer); } case StackedBtree: { InMemoryIdSystem inMemoryIdSystem = new InMemoryIdSystem(localContainer); BTreeIdSystem bTreeIdSystem = new BTreeIdSystem(localContainer, inMemoryIdSystem); systemData.FreespaceIdSystem(bTreeIdSystem.FreespaceIdSystem()); return new BTreeIdSystem(localContainer, bTreeIdSystem); } case SingleBtree: { InMemoryIdSystem smallInMemoryIdSystem = new InMemoryIdSystem(localContainer); BTreeIdSystem smallBTreeIdSystem = new BTreeIdSystem(localContainer, smallInMemoryIdSystem ); systemData.FreespaceIdSystem(smallBTreeIdSystem.FreespaceIdSystem()); return smallBTreeIdSystem; } case InMemory: { return new InMemoryIdSystem(localContainer); } case Custom: { IIdSystemFactory customIdSystemFactory = localContainer.ConfigImpl.CustomIdSystemFactory (); if (customIdSystemFactory == null) { throw new Db4oFatalException("Custom IdSystem configured but no factory was found. See IdSystemConfiguration#useCustomSystem()" ); } return customIdSystemFactory.NewInstance(localContainer); } default: { return new PointerBasedIdSystem(localContainer); break; } } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/IdSlotMapping.cs0000644000175000017500000000234411700531646030366 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Ids { /// public class IdSlotMapping { public int _id; public int _address; public int _length; public IdSlotMapping(int id, int address, int length) { // persistent and indexed in DatabaseIdMapping, don't change the name _id = id; _address = address; _length = length; } public IdSlotMapping(int id, Db4objects.Db4o.Internal.Slots.Slot slot) : this(id, slot.Address(), slot.Length()) { } public virtual Db4objects.Db4o.Internal.Slots.Slot Slot() { return new Db4objects.Db4o.Internal.Slots.Slot(_address, _length); } public virtual void Write(ByteArrayBuffer buffer) { buffer.WriteInt(_id); buffer.WriteInt(_address); buffer.WriteInt(_length); } public static Db4objects.Db4o.Internal.Ids.IdSlotMapping Read(ByteArrayBuffer buffer ) { return new Db4objects.Db4o.Internal.Ids.IdSlotMapping(buffer.ReadInt(), buffer.ReadInt (), buffer.ReadInt()); } public override string ToString() { return string.Empty + _id + ":" + _address + "," + _length; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/IdSlotChanges.cs0000644000175000017500000001035311700531646030342 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Ids { public class IdSlotChanges { private readonly LockedTree _slotChanges = new LockedTree(); private readonly TransactionalIdSystemImpl _idSystem; private readonly IClosure4 _freespaceManager; private TreeInt _prefetchedIDs; public IdSlotChanges(TransactionalIdSystemImpl idSystem, IClosure4 freespaceManager ) { _idSystem = idSystem; _freespaceManager = freespaceManager; } public void AccumulateFreeSlots(FreespaceCommitter freespaceCommitter, bool forFreespace , bool traverseMutable) { IVisitor4 visitor = new _IVisitor4_27(this, freespaceCommitter, forFreespace); if (traverseMutable) { _slotChanges.TraverseMutable(visitor); } else { _slotChanges.TraverseLocked(visitor); } } private sealed class _IVisitor4_27 : IVisitor4 { public _IVisitor4_27(IdSlotChanges _enclosing, FreespaceCommitter freespaceCommitter , bool forFreespace) { this._enclosing = _enclosing; this.freespaceCommitter = freespaceCommitter; this.forFreespace = forFreespace; } public void Visit(object obj) { ((SlotChange)obj).AccumulateFreeSlot(this._enclosing._idSystem, freespaceCommitter , forFreespace); } private readonly IdSlotChanges _enclosing; private readonly FreespaceCommitter freespaceCommitter; private readonly bool forFreespace; } public virtual void Clear() { _slotChanges.Clear(); } public virtual void Rollback() { _slotChanges.TraverseLocked(new _IVisitor4_44(this)); } private sealed class _IVisitor4_44 : IVisitor4 { public _IVisitor4_44(IdSlotChanges _enclosing) { this._enclosing = _enclosing; } public void Visit(object slotChange) { ((SlotChange)slotChange).Rollback(this._enclosing.FreespaceManager()); } private readonly IdSlotChanges _enclosing; } public virtual bool IsDeleted(int id) { SlotChange slot = FindSlotChange(id); if (slot == null) { return false; } return slot.IsDeleted(); } public virtual SlotChange ProduceSlotChange(int id, SlotChangeFactory slotChangeFactory ) { if (DTrace.enabled) { DTrace.ProduceSlotChange.Log(id); } SlotChange slot = slotChangeFactory.NewInstance(id); _slotChanges.Add(slot); return (SlotChange)slot.AddedOrExisting(); } public SlotChange FindSlotChange(int id) { return (SlotChange)_slotChanges.Find(id); } public virtual void TraverseSlotChanges(IVisitor4 visitor) { _slotChanges.TraverseLocked(visitor); } public virtual bool IsDirty() { return !_slotChanges.IsEmpty(); } public virtual void ReadSlotChanges(ByteArrayBuffer buffer) { _slotChanges.Read(buffer, new SlotChange(0)); } public virtual void AddPrefetchedID(int id) { _prefetchedIDs = ((TreeInt)Tree.Add(_prefetchedIDs, new TreeInt(id))); } public virtual void PrefetchedIDConsumed(int id) { _prefetchedIDs = ((TreeInt)_prefetchedIDs.RemoveLike(new TreeInt(id))); } internal void FreePrefetchedIDs(IIdSystem idSystem) { if (_prefetchedIDs == null) { return; } idSystem.ReturnUnusedIds(_prefetchedIDs); _prefetchedIDs = null; } public virtual void NotifySlotCreated(int id, Slot slot, SlotChangeFactory slotChangeFactory ) { ProduceSlotChange(id, slotChangeFactory).NotifySlotCreated(slot); } internal virtual void NotifySlotUpdated(int id, Slot slot, SlotChangeFactory slotChangeFactory ) { ProduceSlotChange(id, slotChangeFactory).NotifySlotUpdated(FreespaceManager(), slot ); } public virtual void NotifySlotDeleted(int id, SlotChangeFactory slotChangeFactory ) { ProduceSlotChange(id, slotChangeFactory).NotifyDeleted(FreespaceManager()); } private IFreespaceManager FreespaceManager() { return ((IFreespaceManager)_freespaceManager.Run()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Ids/IStackableIdSystem.cs0000644000175000017500000000043211700531646031334 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Ids; namespace Db4objects.Db4o.Internal.Ids { /// public interface IStackableIdSystem : IIdSystem { int ChildId(); void ChildId(int id); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Serializer.cs0000644000175000017500000000446711700531646027256 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal { /// public class Serializer { public static StatefulBuffer Marshall(Transaction ta, object obj) { SerializedGraph serialized = Marshall(ta.Container(), obj); StatefulBuffer buffer = new StatefulBuffer(ta, serialized.Length()); buffer.Append(serialized._bytes); buffer.UseSlot(serialized._id, 0, serialized.Length()); return buffer; } public static SerializedGraph Marshall(ObjectContainerBase serviceProvider, object obj) { MemoryBin memoryBin = new MemoryBin(223, GrowthStrategy()); TransportObjectContainer carrier = NewTransportObjectContainer(serviceProvider, memoryBin ); carrier.ProduceClassMetadata(carrier.Reflector().ForObject(obj)); carrier.Store(obj); int id = (int)carrier.GetID(obj); carrier.Close(); return new SerializedGraph(id, memoryBin.Data()); } private static ConstantGrowthStrategy GrowthStrategy() { return new ConstantGrowthStrategy(300); } private static TransportObjectContainer NewTransportObjectContainer(ObjectContainerBase serviceProvider, MemoryBin memoryBin) { TransportObjectContainer container = new TransportObjectContainer(serviceProvider , memoryBin); container.DeferredOpen(); return container; } public static object Unmarshall(ObjectContainerBase serviceProvider, StatefulBuffer buffer) { return Unmarshall(serviceProvider, buffer._buffer, buffer.GetID()); } public static object Unmarshall(ObjectContainerBase serviceProvider, SerializedGraph serialized) { return Unmarshall(serviceProvider, serialized._bytes, serialized._id); } public static object Unmarshall(ObjectContainerBase serviceProvider, byte[] bytes , int id) { if (id <= 0) { return null; } MemoryBin memoryBin = new MemoryBin(bytes, GrowthStrategy()); TransportObjectContainer carrier = NewTransportObjectContainer(serviceProvider, memoryBin ); object obj = carrier.GetByID(id); carrier.Activate(carrier.Transaction, obj, new FullActivationDepth()); carrier.Close(); return obj; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IInternalObjectContainer.cs0000644000175000017500000000257211700531646032017 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Internal.Events; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// public partial interface IInternalObjectContainer : IExtObjectContainer { void Callbacks(ICallbacks cb); ICallbacks Callbacks(); ObjectContainerBase Container { get; } Db4objects.Db4o.Internal.Transaction Transaction { get; } NativeQueryHandler GetNativeQueryHandler(); ClassMetadata ClassMetadataForReflectClass(IReflectClass reflectClass); ClassMetadata ClassMetadataForName(string name); ClassMetadata ClassMetadataForID(int id); HandlerRegistry Handlers { get; } Config4Impl ConfigImpl { get; } object SyncExec(IClosure4 block); int InstanceCount(ClassMetadata clazz, Db4objects.Db4o.Internal.Transaction trans ); bool IsClient { get; } void StoreAll(Db4objects.Db4o.Internal.Transaction trans, IEnumerator objects); IUpdateDepthProvider UpdateDepthProvider(); EventRegistryImpl NewEventRegistry(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/0000755000175000017500000000000011700531646025506 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinNode.cs0000644000175000017500000000411511700531646027507 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Qlin; namespace Db4objects.Db4o.Internal.Qlin { /// public abstract class QLinNode : IQLin { public virtual IQLin Equal(object obj) { throw new QLinException("#equal() is not supported on this node"); } public virtual IQLin StartsWith(string @string) { throw new QLinException("#startsWith() is not supported on this node"); } public virtual IQLin Smaller(object obj) { throw new QLinException("#smaller() is not supported on this node"); } public virtual IQLin Greater(object obj) { throw new QLinException("#greater() is not supported on this node"); } public virtual object SingleOrDefault(object defaultValue) { IObjectSet collection = Select(); // TODO: Change to #isEmpty here after decafs, so the size doesn#t need to be calculated if (collection.Count == 0) { return defaultValue; } if (collection.Count > 1) { // Consider: Use a more specific exception if a query does not return // the expected result throw new QLinException("Expected one or none. Found: " + collection.Count); } // The following would be the right way to work against // a collection but for now it won't decaf. // return collection.iterator().next(); // This is the ugly old db4o interface, where a Collection is // an iterator directly. For now it's convenient but we don't // really want to use this in the future. // Update #single() in the same way. return collection.Next(); } public virtual object Single() { IObjectSet collection = Select(); if (collection.Count != 1) { throw new QLinException("Expected exactly one. Found: " + collection.Count); } return collection.Next(); } public abstract IQLin Limit(int arg1); public abstract IQLin OrderBy(object arg1, QLinOrderByDirection arg2); public abstract IObjectSet Select(); public abstract IQLin Where(object arg1); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinSodaNode.cs0000644000175000017500000000107011700531646030313 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Qlin; namespace Db4objects.Db4o.Internal.Qlin { /// public abstract class QLinSodaNode : QLinNode { protected abstract QLinRoot Root(); public override IQLin Where(object expression) { return new QLinField(Root(), expression); } public override IQLin OrderBy(object expression, QLinOrderByDirection direction) { return new QLinOrderBy(Root(), expression, direction); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinSubNode.cs0000644000175000017500000000135011700531646030157 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Qlin { /// public abstract class QLinSubNode : QLinSodaNode { protected readonly QLinRoot _root; public QLinSubNode(QLinRoot root) { _root = root; } protected override QLinRoot Root() { return _root; } protected virtual IQuery Query() { return Root().Query(); } public override IQLin Limit(int size) { Root().Limit(size); return this; } public override IObjectSet Select() { return Root().Select(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinOrderBy.cs0000644000175000017500000000115111700531646030165 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Qlin { /// public class QLinOrderBy : QLinSubNode { private readonly IQuery _node; public QLinOrderBy(QLinRoot root, object expression, QLinOrderByDirection direction ) : base(root) { _node = root.Descend(expression); if (direction == QLinSupport.Ascending()) { _node.OrderAscending(); } else { _node.OrderDescending(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinRoot.cs0000644000175000017500000000331011700531646027541 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Qlin { /// public class QLinRoot : QLinSodaNode { private readonly QQuery _query; private int _limit = -1; public QLinRoot(IQuery query, Type clazz) { _query = (QQuery)query; query.Constrain(clazz); QLinSupport.Context(clazz); } public virtual IQuery Query() { return _query; } public override IObjectSet Select() { if (_limit == -1) { return _query.Execute(); } IQueryResult queryResult = _query.GetQueryResult(); IdListQueryResult limitedResult = new IdListQueryResult(_query.Transaction(), _limit ); int counter = 0; IIntIterator4 i = queryResult.IterateIDs(); while (i.MoveNext()) { if (counter++ >= _limit) { break; } limitedResult.Add(i.CurrentInt()); } return new ObjectSetFacade(limitedResult); } public override IQLin Limit(int size) { if (size < 1) { throw new QLinException("Limit must be greater that 0"); } _limit = size; return this; } protected override Db4objects.Db4o.Internal.Qlin.QLinRoot Root() { return this; } internal virtual IQuery Descend(object expression) { // TODO: Implement deep descend return Query().Descend(QLinSupport.Field(expression).GetName()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinConstraint.cs0000644000175000017500000000065311700531646030751 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Qlin { /// public class QLinConstraint : QLinSubNode { private readonly IConstraint _constraint; public QLinConstraint(QLinRoot root, IConstraint constraint) : base(root) { _constraint = constraint; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Qlin/QLinField.cs0000644000175000017500000000232411700531646027645 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Qlin { /// public class QLinField : QLinSubNode { private readonly IQuery _node; public QLinField(QLinRoot root, object expression) : base(root) { _node = root.Descend(expression); } public override IQLin Equal(object obj) { IConstraint constraint = _node.Constrain(obj); constraint.Equal(); return new QLinConstraint(((QLinRoot)_root), constraint); } public override IQLin StartsWith(string @string) { IConstraint constraint = _node.Constrain(@string); constraint.StartsWith(true); return new QLinConstraint(((QLinRoot)_root), constraint); } public override IQLin Smaller(object obj) { IConstraint constraint = _node.Constrain(obj); constraint.Smaller(); return new QLinConstraint(((QLinRoot)_root), constraint); } public override IQLin Greater(object obj) { IConstraint constraint = _node.Constrain(obj); constraint.Greater(); return new QLinConstraint(((QLinRoot)_root), constraint); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ClassMetadataIterator.cs0000644000175000017500000000145411700531646031356 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// TODO: remove this class or make it private to ClassMetadataRepository public class ClassMetadataIterator : MappingIterator { private readonly ClassMetadataRepository i_collection; internal ClassMetadataIterator(ClassMetadataRepository a_collection, IEnumerator iterator) : base(iterator) { i_collection = a_collection; } public virtual ClassMetadata CurrentClass() { return (ClassMetadata)Current; } protected override object Map(object current) { return i_collection.ReadClassMetadata((ClassMetadata)current, null); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Const4.cs0000644000175000017500000001443411700531646026312 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Internal { /// TODO: Split into separate enums with defined range and values. public sealed partial class Const4 { public const byte Yapfileversion = 4; public const byte Yapbegin = (byte)'{'; public const byte Yapfile = (byte)'Y'; public const byte Yapid = (byte)'#'; public const byte Yappointer = (byte)'>'; public const byte Yapclasscollection = (byte)'A'; public const byte Yapclass = (byte)'C'; public const byte Yapfield = (byte)'F'; public const byte Yapobject = (byte)'O'; public const byte Yaparray = (byte)'N'; public const byte Yaparrayn = (byte)'Z'; public const byte Yapindex = (byte)'X'; public const byte Yapstring = (byte)'S'; public const byte Yaplong = (byte)'l'; public const byte Yapinteger = (byte)'i'; public const byte Yapboolean = (byte)'='; public const byte Yapdouble = (byte)'d'; public const byte Yapbyte = (byte)'b'; public const byte Yapshort = (byte)'s'; public const byte Yapchar = (byte)'c'; public const byte Yapfloat = (byte)'f'; public const byte Yapend = (byte)'}'; public const byte Yapnull = (byte)'0'; public const byte Btree = (byte)'T'; public const byte BtreeNode = (byte)'B'; public const byte Header = (byte)'H'; public const byte IntegerArray = (byte)'I'; public const byte BtreeList = (byte)'L'; public const int IdentifierLength = (Deploy.debug && Deploy.identifiers) ? 1 : 0; public const int BracketsBytes = (Deploy.debug && Deploy.brackets) ? 1 : 0; public const int BracketsLength = BracketsBytes * 2; public const int LeadingLength = IdentifierLength + BracketsBytes; public const int AddedLength = IdentifierLength + BracketsLength; public const int ShortBytes = 2; public const int IntegerBytes = (Deploy.debug && Deploy.debugLong) ? 11 : 4; public const int LongBytes = (Deploy.debug && Deploy.debugLong) ? 20 : 8; public const int CharBytes = 2; public const int Unspecified = int.MinValue + 100; public const int IntLength = IntegerBytes + AddedLength; public const int IdLength = IntLength; public const int LongLength = LongBytes + AddedLength; public const int IndirectionLength = IntLength + IdLength; public const int WriteLoop = (IntegerBytes - 1) * 8; public const int ObjectLength = AddedLength; public const int PointerLength = (IntLength * 2) + AddedLength; public const int MessageLength = IntLength * 2 + 1; public const byte SystemTrans = (byte)'s'; public const byte UserTrans = (byte)'u'; public const byte Xbyte = (byte)'X'; public const int IgnoreId = -99999; public const int Primitive = -2000000000; public const int TypeArray = 3; public const int TypeNarray = 4; public const int None = 0; public const int State = 1; public const int Activation = 2; public const int Transient = -1; public const int AddMembersToIdTreeOnly = 0; public const int AddToIdTree = 1; public const int LockTimeInterval = 1000; public const int ServerSocketTimeout = Debug4.longTimeOuts ? 1000000 : 600000; public const int ClientSocketTimeout = ServerSocketTimeout; public const int MaximumBlockSize = 70000000; public const int MaximumArrayEntries = 7000000; public const int MaximumArrayEntriesPrimitive = MaximumArrayEntries * 100; public static readonly Type ClassCompare = typeof(ICompare); public static readonly Type ClassDb4otype = typeof(IDb4oType); public static readonly Type ClassDb4otypeimpl = typeof(IDb4oTypeImpl); public static readonly Type ClassInternal = typeof(IInternal4); public static readonly Type ClassUnversioned = typeof(IUnversioned); public static readonly Type ClassObject = new object().GetType(); public static readonly Type ClassObjectcontainer = typeof(IObjectContainer); public static readonly Type ClassStaticfield = new StaticField().GetType(); public static readonly Type ClassStaticclass = new StaticClass().GetType(); public static readonly Type ClassTransientclass = typeof(ITransientClass); public static readonly string EmbeddedClientUser = "embedded client"; public const int Clean = 0; public const int Active = 1; public const int Processing = 2; public const int CachedDirty = 3; public const int Continue = 4; public const int StaticFieldsStored = 5; public const int CheckedChanges = 6; public const int Dead = 7; public const int Reading = 8; public const int Activating = 9; public const int Old = -1; public const int New = 1; public static readonly UnicodeStringIO stringIO = new UnicodeStringIO(); public static readonly Type[] EssentialClasses = new Type[] { ClassStaticfield, ClassStaticclass }; public static readonly string VirtualFieldPrefix = "v4o"; public const int InvalidObjectId = 1; public const int DefaultMaxStackDepth = 20; // make sure we don't fall over the -1 cliff // TODO: Is this the right place for the knowledge, that an indirection // within a slot is an address and a length? // debug constants // TODO: This one is a terrible low-frequency blunder in YapArray.writeClass!!! // If YapClass-ID == 99999 (not very likely) then we will get IGNORE_ID. Change // to -Integer.MAX_VALUE or protect 99999 in YapFile.getPointerSlot() // This is a hard coded 2 Gig-Limit for YapClass-IDs. // TODO: get rid of magic numbers like this one // array type information // message levels // Use if > NONE: normal messages // if > STATE: state messages // if > ACTIVATION: activation messages // Timings // 10 minutes until clients are disconnected, (5 minutes until they get pinged) // TODO: Consider to make configurable // 70 MB // 7 Million // 70 MB for byte arrays // bits in PersistentBase.i_state // and reuse in other classes // system classes that need to get loaded first // StaticClass should load Staticfield // TODO: remove unnecessary } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectContainerSession.cs0000644000175000017500000003372711700531646031563 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Internal.Events; using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Internal { /// public partial class ObjectContainerSession : IInternalObjectContainer, ITransientClass , IObjectContainerSpec { protected readonly ObjectContainerBase _server; protected readonly Db4objects.Db4o.Internal.Transaction _transaction; private bool _closed = false; public ObjectContainerSession(ObjectContainerBase server, Db4objects.Db4o.Internal.Transaction trans) { _server = server; _transaction = trans; } public ObjectContainerSession(ObjectContainerBase server) : this(server, server.NewUserTransaction ()) { _transaction.SetOutSideRepresentation(this); } /// /// /// /// public virtual void Backup(string path) { throw new NotSupportedException(); } /// /// /// public virtual void Backup(IStorage storage, string path) { throw new NotSupportedException(); } /// /// public virtual void Bind(object obj, long id) { _server.Bind(_transaction, obj, id); } public virtual Config4Impl ConfigImpl { get { // internal interface method doesn't need to lock return _server.ConfigImpl; } } public virtual IConfiguration Configure() { // FIXME: Consider throwing NotSupportedException here. // throw new NotSupportedException(); lock (Lock()) { CheckClosed(); return _server.Configure(); } } public virtual object Descend(object obj, string[] path) { lock (Lock()) { CheckClosed(); return _server.Descend(_transaction, obj, path); } } private void CheckClosed() { if (IsClosed()) { throw new DatabaseClosedException(); } } /// /// public virtual object GetByID(long id) { lock (Lock()) { CheckClosed(); return _server.GetByID(_transaction, id); } } /// /// public virtual object GetByUUID(Db4oUUID uuid) { lock (Lock()) { CheckClosed(); return _server.GetByUUID(_transaction, uuid); } } public virtual long GetID(object obj) { lock (Lock()) { CheckClosed(); return _server.GetID(_transaction, obj); } } public virtual IObjectInfo GetObjectInfo(object obj) { lock (Lock()) { CheckClosed(); return _server.GetObjectInfo(_transaction, obj); } } // TODO: Db4oDatabase is shared between embedded clients. // This should work, since there is an automatic bind // replacement. Replication test cases will tell. public virtual Db4oDatabase Identity() { lock (Lock()) { CheckClosed(); return _server.Identity(); } } public virtual bool IsActive(object obj) { lock (Lock()) { CheckClosed(); return _server.IsActive(_transaction, obj); } } public virtual bool IsCached(long id) { lock (Lock()) { CheckClosed(); return _server.IsCached(_transaction, id); } } public virtual bool IsClosed() { lock (Lock()) { return _closed == true; } } /// public virtual bool IsStored(object obj) { lock (Lock()) { CheckClosed(); return _server.IsStored(_transaction, obj); } } public virtual IReflectClass[] KnownClasses() { lock (Lock()) { CheckClosed(); return _server.KnownClasses(); } } public virtual object Lock() { return _server.Lock(); } public virtual object PeekPersisted(object @object, int depth, bool committed) { lock (Lock()) { CheckClosed(); return _server.PeekPersisted(_transaction, @object, ActivationDepthProvider().ActivationDepth (depth, ActivationMode.Peek), committed); } } public virtual void Purge() { lock (Lock()) { CheckClosed(); _server.Purge(); } } public virtual void Purge(object obj) { lock (Lock()) { CheckClosed(); _server.Purge(_transaction, obj); } } public virtual GenericReflector Reflector() { lock (Lock()) { CheckClosed(); return _server.Reflector(); } } public virtual void Refresh(object obj, int depth) { lock (Lock()) { CheckClosed(); _server.Refresh(_transaction, obj, depth); } } public virtual void ReleaseSemaphore(string name) { CheckClosed(); _server.ReleaseSemaphore(_transaction, name); } public virtual void Store(object obj, int depth) { lock (Lock()) { CheckClosed(); _server.Store(_transaction, obj, (depth == Const4.Unspecified ? (IUpdateDepth)UpdateDepthProvider ().Unspecified(NullModifiedObjectQuery.Instance) : (IUpdateDepth)UpdateDepthProvider ().ForDepth(depth))); } } public virtual bool SetSemaphore(string name, int waitForAvailability) { CheckClosed(); return _server.SetSemaphore(_transaction, name, waitForAvailability); } public virtual IStoredClass StoredClass(object clazz) { lock (Lock()) { CheckClosed(); return _server.StoredClass(_transaction, clazz); } } public virtual IStoredClass[] StoredClasses() { lock (Lock()) { CheckClosed(); return _server.StoredClasses(_transaction); } } public virtual ISystemInfo SystemInfo() { lock (Lock()) { CheckClosed(); return _server.SystemInfo(); } } public virtual long Version() { lock (Lock()) { CheckClosed(); return _server.Version(); } } /// /// public virtual void Activate(object obj) { lock (Lock()) { CheckClosed(); _server.Activate(_transaction, obj); } } /// /// public virtual void Activate(object obj, int depth) { lock (Lock()) { CheckClosed(); _server.Activate(_transaction, obj, ActivationDepthProvider().ActivationDepth(depth , ActivationMode.Activate)); } } private IActivationDepthProvider ActivationDepthProvider() { return _server.ActivationDepthProvider(); } /// public virtual bool Close() { lock (Lock()) { if (IsClosed()) { return false; } if (!_server.IsClosed()) { if (!_server.ConfigImpl.IsReadOnly()) { Commit(); } } _server.Callbacks().CloseOnStarted(this); _server.CloseTransaction(_transaction, false, false); _closed = true; return true; } } /// /// /// /// public virtual void Commit() { lock (Lock()) { CheckClosed(); _server.Commit(_transaction); } } /// public virtual void Deactivate(object obj, int depth) { lock (Lock()) { CheckClosed(); _server.Deactivate(_transaction, obj, depth); } } /// public virtual void Deactivate(object obj) { Deactivate(obj, 1); } /// /// /// public virtual void Delete(object obj) { lock (Lock()) { CheckClosed(); _server.Delete(_transaction, obj); } } public virtual IExtObjectContainer Ext() { return (IExtObjectContainer)this; } /// /// public virtual IObjectSet QueryByExample(object template) { lock (Lock()) { CheckClosed(); return _server.QueryByExample(_transaction, template); } } /// public virtual IQuery Query() { lock (Lock()) { CheckClosed(); return _server.Query(_transaction); } } /// /// public virtual IObjectSet Query(Type clazz) { lock (Lock()) { CheckClosed(); return _server.Query(_transaction, clazz); } } /// /// public virtual IObjectSet Query(Predicate predicate) { lock (Lock()) { CheckClosed(); return _server.Query(_transaction, predicate); } } /// /// public virtual IObjectSet Query(Predicate predicate, IQueryComparator comparator) { lock (Lock()) { CheckClosed(); return _server.Query(_transaction, predicate, comparator); } } /// /// /// public virtual void Rollback() { lock (Lock()) { CheckClosed(); _server.Rollback(_transaction); } } /// /// public virtual void Store(object obj) { lock (Lock()) { CheckClosed(); _server.Store(_transaction, obj); } } public virtual ObjectContainerBase Container { get { return _server; } } public virtual Db4objects.Db4o.Internal.Transaction Transaction { get { return _transaction; } } public virtual void Callbacks(ICallbacks cb) { lock (Lock()) { CheckClosed(); _server.Callbacks(cb); } } public virtual ICallbacks Callbacks() { lock (Lock()) { CheckClosed(); return _server.Callbacks(); } } public NativeQueryHandler GetNativeQueryHandler() { lock (Lock()) { CheckClosed(); return _server.GetNativeQueryHandler(); } } public virtual ClassMetadata ClassMetadataForReflectClass(IReflectClass reflectClass ) { return _server.ClassMetadataForReflectClass(reflectClass); } public virtual ClassMetadata ClassMetadataForName(string name) { return _server.ClassMetadataForName(name); } public virtual ClassMetadata ClassMetadataForID(int id) { return _server.ClassMetadataForID(id); } public virtual HandlerRegistry Handlers { get { return _server.Handlers; } } public virtual object SyncExec(IClosure4 block) { return _server.SyncExec(block); } public virtual int InstanceCount(ClassMetadata clazz, Db4objects.Db4o.Internal.Transaction trans) { return _server.InstanceCount(clazz, trans); } public virtual bool IsClient { get { return true; } } public virtual void StoreAll(Db4objects.Db4o.Internal.Transaction transaction, IEnumerator objects) { _server.StoreAll(transaction, objects); } public virtual IUpdateDepthProvider UpdateDepthProvider() { return ConfigImpl.UpdateDepthProvider(); } public virtual IObjectContainer OpenSession() { lock (Lock()) { return new Db4objects.Db4o.Internal.ObjectContainerSession(_server); } } public virtual EventRegistryImpl NewEventRegistry() { return new EventRegistryImpl(); } public virtual IQLin From(Type clazz) { return new QLinRoot(Query(), clazz); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/CallbackObjectInfoCollections.cs0000644000175000017500000000174211700531646032774 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class CallbackObjectInfoCollections { public readonly IObjectInfoCollection added; public readonly IObjectInfoCollection updated; public readonly IObjectInfoCollection deleted; public static readonly Db4objects.Db4o.Internal.CallbackObjectInfoCollections Emtpy = Empty(); public CallbackObjectInfoCollections(IObjectInfoCollection added_, IObjectInfoCollection updated_, IObjectInfoCollection deleted_) { added = added_; updated = updated_; deleted = deleted_; } private static Db4objects.Db4o.Internal.CallbackObjectInfoCollections Empty() { return new Db4objects.Db4o.Internal.CallbackObjectInfoCollections(ObjectInfoCollectionImpl .Empty, ObjectInfoCollectionImpl.Empty, ObjectInfoCollectionImpl.Empty); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ShutDownRunnable.cs0000644000175000017500000000163211700531646030376 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { internal class ShutDownRunnable : IRunnable { private Collection4 _containers = new Collection4(); public volatile bool dontRemove = false; public virtual void Ensure(ObjectContainerBase container) { _containers.Ensure(container); } public virtual void Remove(ObjectContainerBase container) { _containers.Remove(container); } public virtual void Run() { dontRemove = true; Collection4 copy = new Collection4(_containers); IEnumerator i = copy.GetEnumerator(); while (i.MoveNext()) { ((ObjectContainerBase)i.Current).ShutdownHook(); } } public virtual int Size() { return _containers.Size(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/LocalPersistentBase.cs0000644000175000017500000000200311700531646031033 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// public abstract class LocalPersistentBase : PersistentBase { private readonly ITransactionalIdSystem _idSystem; public LocalPersistentBase(ITransactionalIdSystem idSystem) { _idSystem = idSystem; } public LocalPersistentBase() : this(null) { } public override ITransactionalIdSystem IdSystem(Transaction trans) { if (_idSystem != null) { return _idSystem; } return base.IdSystem(trans); } protected override ByteArrayBuffer ReadBufferById(Transaction trans) { Slot slot = IdSystem(trans).CurrentSlot(GetID()); if (DTrace.enabled) { DTrace.SlotRead.LogLength(GetID(), slot); } return ((LocalObjectContainer)trans.Container()).ReadBufferBySlot(slot); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TranslatedAspect.cs0000644000175000017500000001115211700531646030373 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { public sealed class TranslatedAspect : FieldMetadata { private IObjectTranslator _translator; public TranslatedAspect(ClassMetadata containingClass, string name) : this(containingClass ) { Init(name); } public TranslatedAspect(ClassMetadata containingClass, IObjectTranslator translator ) : this(containingClass) { InitializeTranslator(translator); } private TranslatedAspect(ClassMetadata containingClass) : base(containingClass) { SetAvailable(); } public void InitializeTranslator(IObjectTranslator translator) { _translator = translator; InitializeFieldName(); InitializeFieldType(); } public override bool Alive() { return true; } private void InitializeFieldName() { Init(FieldNameFor(_translator)); } private void InitializeFieldType() { ObjectContainerBase stream = ContainingClass().Container(); IReflectClass storedClass = stream.Reflector().ForClass(TranslatorStoredClass(_translator )); Configure(storedClass, false); IReflectClass baseType = Handlers4.BaseType(storedClass); stream.ShowInternalClasses(true); try { _fieldType = stream.ProduceClassMetadata(baseType); } finally { stream.ShowInternalClasses(false); } if (null == _fieldType) { throw new InvalidOperationException("Cannot produce class metadata for " + baseType + "!"); } } public static string FieldNameFor(IObjectTranslator translator) { return translator.GetType().FullName; } public override bool CanUseNullBitmap() { return false; } public override void Deactivate(IActivationContext context) { if (context.Depth().RequiresActivation()) { CascadeActivation(context); } SetOn(context.Transaction(), context.TargetObject(), null); } public override object GetOn(Transaction a_trans, object a_OnObject) { try { return _translator.OnStore(a_trans.ObjectContainer(), a_OnObject); } catch (ReflectException e) { throw; } catch (Exception e) { throw new ReflectException(e); } } public override object GetOrCreate(Transaction a_trans, object a_OnObject) { return GetOn(a_trans, a_OnObject); } public override void Activate(UnmarshallingContext context) { object obj = Read(context); // Activation of members is necessary on purpose here. // Classes like Hashtable need fully activated members // to be able to calculate hashCode() if (obj != null) { context.Container().Activate(context.Transaction(), obj, context.ActivationDepth( )); } SetOn(context.Transaction(), context.PersistentObject(), obj); } internal override void Refresh() { } // do nothing private void SetOn(Transaction trans, object a_onObject, object toSet) { try { _translator.OnActivate(trans.ObjectContainer(), a_onObject, toSet); } catch (Exception e) { throw new ReflectException(e); } } protected override object IndexEntryFor(object indexEntry) { return indexEntry; } protected override IIndexable4 IndexHandler(ObjectContainerBase stream) { return (IIndexable4)GetHandler(); } public override bool Equals(object obj) { if (obj == this) { return true; } if (obj == null || obj.GetType() != GetType()) { return false; } Db4objects.Db4o.Internal.TranslatedAspect other = (Db4objects.Db4o.Internal.TranslatedAspect )obj; return _translator.Equals(other._translator); } public override int GetHashCode() { return _translator.GetHashCode(); } public override Db4objects.Db4o.Internal.Marshall.AspectType AspectType() { return Db4objects.Db4o.Internal.Marshall.AspectType.Translator; } public bool IsObjectConstructor() { return _translator is IObjectConstructor; } public object Construct(ObjectReferenceContext context) { ContextState contextState = context.SaveState(); bool fieldHasValue = ContainingClass().SeekToField(context, this); try { return ((IObjectConstructor)_translator).OnInstantiate(context.Container(), fieldHasValue ? Read(context) : null); } finally { context.RestoreState(contextState); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/AbstractBufferContext.cs0000644000175000017500000000403611700531646031377 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public abstract class AbstractBufferContext : IBufferContext, IHandlerVersionContext { private IReadBuffer _buffer; private readonly Db4objects.Db4o.Internal.Transaction _transaction; public AbstractBufferContext(Db4objects.Db4o.Internal.Transaction transaction, IReadBuffer buffer) { _transaction = transaction; _buffer = buffer; } public virtual IReadBuffer Buffer(IReadBuffer buffer) { IReadBuffer temp = _buffer; _buffer = buffer; return temp; } public virtual IReadBuffer Buffer() { return _buffer; } public virtual byte ReadByte() { return _buffer.ReadByte(); } public virtual void ReadBytes(byte[] bytes) { _buffer.ReadBytes(bytes); } public virtual int ReadInt() { return _buffer.ReadInt(); } public virtual long ReadLong() { return _buffer.ReadLong(); } public virtual int Offset() { return _buffer.Offset(); } public virtual void Seek(int offset) { _buffer.Seek(offset); } public virtual ObjectContainerBase Container() { return _transaction.Container(); } public virtual IObjectContainer ObjectContainer() { return Container(); } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return _transaction; } public abstract int HandlerVersion(); public virtual bool IsLegacyHandlerVersion() { return HandlerVersion() == 0; } public virtual BitMap4 ReadBitMap(int bitCount) { return _buffer.ReadBitMap(bitCount); } public virtual Db4objects.Db4o.Internal.Marshall.SlotFormat SlotFormat() { return Db4objects.Db4o.Internal.Marshall.SlotFormat.ForHandlerVersion(HandlerVersion ()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/StoredClassImpl.cs0000644000175000017500000000603611700531646030207 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class StoredClassImpl : IStoredClass { private readonly Transaction _transaction; private readonly ClassMetadata _classMetadata; public StoredClassImpl(Transaction transaction, ClassMetadata classMetadata) { if (classMetadata == null) { throw new ArgumentException(); } _transaction = transaction; _classMetadata = classMetadata; } public virtual long[] GetIDs() { return _classMetadata.GetIDs(_transaction); } public virtual string GetName() { return _classMetadata.GetName(); } public virtual IStoredClass GetParentStoredClass() { ClassMetadata parentClassMetadata = _classMetadata.GetAncestor(); if (parentClassMetadata == null) { return null; } return new Db4objects.Db4o.Internal.StoredClassImpl(_transaction, parentClassMetadata ); } public virtual IStoredField[] GetStoredFields() { IStoredField[] fieldMetadata = _classMetadata.GetStoredFields(); IStoredField[] storedFields = new IStoredField[fieldMetadata.Length]; for (int i = 0; i < fieldMetadata.Length; i++) { storedFields[i] = new StoredFieldImpl(_transaction, (FieldMetadata)fieldMetadata[ i]); } return storedFields; } public virtual bool HasClassIndex() { return _classMetadata.HasClassIndex(); } public virtual void Rename(string newName) { IInternalObjectContainer container = (IInternalObjectContainer)_transaction.ObjectContainer (); container.SyncExec(new _IClosure4_56(this, newName)); } private sealed class _IClosure4_56 : IClosure4 { public _IClosure4_56(StoredClassImpl _enclosing, string newName) { this._enclosing = _enclosing; this.newName = newName; } public object Run() { this._enclosing._classMetadata.Rename(newName); return null; } private readonly StoredClassImpl _enclosing; private readonly string newName; } public virtual IStoredField StoredField(string name, object type) { FieldMetadata fieldMetadata = (FieldMetadata)_classMetadata.StoredField(name, type ); if (fieldMetadata == null) { return null; } return new StoredFieldImpl(_transaction, fieldMetadata); } public override int GetHashCode() { return _classMetadata.GetHashCode(); } public override bool Equals(object obj) { if (obj == null) { return false; } if (GetType() != obj.GetType()) { return false; } return _classMetadata.Equals(((Db4objects.Db4o.Internal.StoredClassImpl)obj)._classMetadata ); } public override string ToString() { return "StoredClass(" + _classMetadata + ")"; } public virtual int InstanceCount() { return _classMetadata.InstanceCount(_transaction); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/PendingClassInits.cs0000644000175000017500000000442311700531646030516 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { internal class PendingClassInits { private readonly Transaction _systemTransaction; private Collection4 _pending = new Collection4(); private IQueue4 _members = new NonblockingQueue(); private IQueue4 _statics = new NonblockingQueue(); private IQueue4 _writes = new NonblockingQueue(); private IQueue4 _inits = new NonblockingQueue(); private bool _running = false; internal PendingClassInits(Transaction systemTransaction) { _systemTransaction = systemTransaction; } internal virtual void Process(ClassMetadata newClassMetadata) { if (_pending.Contains(newClassMetadata)) { return; } ClassMetadata ancestor = newClassMetadata.GetAncestor(); if (ancestor != null) { Process(ancestor); } _pending.Add(newClassMetadata); _members.Add(newClassMetadata); if (_running) { return; } _running = true; try { CheckInits(); _pending = new Collection4(); } finally { _running = false; } } private void InitializeAspects() { while (_members.HasNext()) { ClassMetadata classMetadata = ((ClassMetadata)_members.Next()); classMetadata.InitializeAspects(); _statics.Add(classMetadata); } } private void CheckStatics() { InitializeAspects(); while (_statics.HasNext()) { ClassMetadata classMetadata = ((ClassMetadata)_statics.Next()); classMetadata.StoreStaticFieldValues(_systemTransaction, true); _writes.Add(classMetadata); InitializeAspects(); } } private void CheckWrites() { CheckStatics(); while (_writes.HasNext()) { ClassMetadata classMetadata = ((ClassMetadata)_writes.Next()); classMetadata.SetStateDirty(); classMetadata.Write(_systemTransaction); _inits.Add(classMetadata); CheckStatics(); } } private void CheckInits() { CheckWrites(); while (_inits.HasNext()) { ClassMetadata classMetadata = ((ClassMetadata)_inits.Next()); classMetadata.InitConfigOnUp(_systemTransaction); CheckWrites(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/PreparedArrayContainsComparison.cs0000644000175000017500000000346411700531646033434 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class PreparedArrayContainsComparison : IPreparedComparison { private readonly ArrayHandler _arrayHandler; private readonly IPreparedComparison _preparedComparison; private ObjectContainerBase _container; public PreparedArrayContainsComparison(IContext context, ArrayHandler arrayHandler , ITypeHandler4 typeHandler, object obj) { _arrayHandler = arrayHandler; _preparedComparison = Handlers4.PrepareComparisonFor(typeHandler, context, obj); _container = context.Transaction().Container(); } public virtual int CompareTo(object obj) { // We never expect this call // TODO: The callers of this class should be refactored to pass a matcher and // to expect a PreparedArrayComparison. throw new InvalidOperationException(); } public virtual bool IsEqual(object array) { return IsMatch(array, IntMatcher.Zero); } public virtual bool IsGreaterThan(object array) { return IsMatch(array, IntMatcher.Positive); } public virtual bool IsSmallerThan(object array) { return IsMatch(array, IntMatcher.Negative); } private bool IsMatch(object array, IntMatcher matcher) { if (array == null) { return false; } IEnumerator i = _arrayHandler.AllElements(_container, array); while (i.MoveNext()) { if (matcher.Match(_preparedComparison.CompareTo(i.Current))) { return true; } } return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectReference.cs0000644000175000017500000006146411700531646030172 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Activation; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; using Sharpen; namespace Db4objects.Db4o.Internal { /// A weak reference to an known object. /// /// A weak reference to an known object. /// "Known" ~ has been stored and/or retrieved within a transaction. /// References the corresponding ClassMetaData along with further metadata: /// internal id, UUID/version information, ... /// /// public class ObjectReference : Identifiable, IObjectInfo, IActivator { private Db4objects.Db4o.Internal.ClassMetadata _class; private object _object; private Db4objects.Db4o.Internal.VirtualAttributes _virtualAttributes; private Db4objects.Db4o.Internal.ObjectReference _idPreceding; private Db4objects.Db4o.Internal.ObjectReference _idSubsequent; private int _idSize; private Db4objects.Db4o.Internal.ObjectReference _hcPreceding; private Db4objects.Db4o.Internal.ObjectReference _hcSubsequent; private int _hcSize; public int _hcHashcode; private int _lastTopLevelCallId; public ObjectReference() { } public ObjectReference(int id) { // redundant hashCode _id = id; if (DTrace.enabled) { DTrace.ObjectReferenceCreated.Log(id); } } public ObjectReference(Db4objects.Db4o.Internal.ClassMetadata classMetadata, int id) : this(id) { _class = classMetadata; } public virtual void Activate(ActivationPurpose purpose) { ActivateOn(Container().Transaction, purpose); } public virtual void ActivateOn(Db4objects.Db4o.Internal.Transaction transaction, ActivationPurpose purpose) { if (Activating()) { return; } try { Activating(true); ObjectContainerBase container = transaction.Container(); if (!(container.ActivationDepthProvider() is ITransparentActivationDepthProvider)) { return; } ITransparentActivationDepthProvider provider = (ITransparentActivationDepthProvider )container.ActivationDepthProvider(); if (ActivationPurpose.Write == purpose) { lock (container.Lock()) { provider.AddModified(GetObject(), transaction); } } if (IsActive()) { return; } lock (container.Lock()) { Activate(transaction, GetObject(), new DescendingActivationDepth(provider, ActivationMode .Activate)); } } finally { Activating(false); } } private bool Activating() { return BitIsTrue(Const4.Activating); } private void Activating(bool isActivating) { if (isActivating) { BitTrue(Const4.Activating); } else { BitFalse(Const4.Activating); } } public virtual void Activate(Db4objects.Db4o.Internal.Transaction ta, object obj, IActivationDepth depth) { ObjectContainerBase container = ta.Container(); ActivateInternal(container.ActivationContextFor(ta, obj, depth)); container.ActivatePending(ta); } internal virtual void ActivateInternal(IActivationContext context) { if (null == context) { throw new ArgumentNullException(); } if (!context.Depth().RequiresActivation()) { return; } ObjectContainerBase container = context.Container(); if (context.Depth().Mode().IsRefresh()) { LogActivation(container, "refresh"); } else { if (IsActive()) { _class.CascadeActivation(context); return; } LogActivation(container, "activate"); } ReadForActivation(context); } private void ReadForActivation(IActivationContext context) { Read(context.Transaction(), null, context.TargetObject(), context.Depth(), Const4 .AddMembersToIdTreeOnly, false); } private void LogActivation(ObjectContainerBase container, string @event) { LogEvent(container, @event, Const4.Activation); } private void LogEvent(ObjectContainerBase container, string @event, int level) { if (container.ConfigImpl.MessageLevel() > level) { container.Message(string.Empty + GetID() + " " + @event + " " + _class.GetName()); } } /// return false if class not completely initialized, otherwise true internal virtual bool ContinueSet(Db4objects.Db4o.Internal.Transaction trans, IUpdateDepth updateDepth) { if (!BitIsTrue(Const4.Continue)) { return true; } if (!_class.StateOK()) { return false; } if (!_class.AspectsAreInitialized()) { return false; } if (DTrace.enabled) { DTrace.Continueset.Log(GetID()); } BitFalse(Const4.Continue); MarshallingContext context = new MarshallingContext(trans, this, updateDepth, true ); Handlers4.Write(ClassMetadata().TypeHandler(), context, GetObject()); Pointer4 pointer = context.AllocateSlot(); ByteArrayBuffer buffer = context.ToWriteBuffer(pointer); ObjectContainerBase container = trans.Container(); container.WriteNew(trans, pointer, _class, buffer); object obj = _object; ObjectOnNew(trans, obj); if (_class.HasIdentity()) { _object = container.NewWeakReference(this, obj); } SetStateClean(); EndProcessing(); return true; } private void ObjectOnNew(Db4objects.Db4o.Internal.Transaction transaction, object obj) { ObjectContainerBase container = transaction.Container(); container.Callbacks().ObjectOnNew(transaction, this); _class.DispatchEvent(transaction, obj, EventDispatchers.New); } public virtual void Deactivate(Db4objects.Db4o.Internal.Transaction trans, IActivationDepth depth) { if (!depth.RequiresActivation()) { return; } object obj = GetObject(); if (obj == null) { return; } ObjectContainerBase container = trans.Container(); LogActivation(container, "deactivate"); SetStateDeactivated(); _class.Deactivate(trans, this, depth); } public virtual byte GetIdentifier() { return Const4.Yapobject; } public virtual long GetInternalID() { return GetID(); } public virtual object GetObject() { if (Platform4.HasWeakReferences()) { return Platform4.GetYapRefObject(_object); } return _object; } public virtual object GetObjectReference() { return _object; } public virtual ObjectContainerBase Container() { if (_class == null) { throw new InvalidOperationException(); } return _class.Container(); } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return Container().Transaction; } public virtual Db4oUUID GetUUID() { Db4objects.Db4o.Internal.VirtualAttributes va = VirtualAttributes(Transaction()); if (va != null && va.i_database != null) { return new Db4oUUID(va.i_uuid, va.i_database.i_signature); } return null; } public virtual long GetVersion() { return GetCommitTimestamp(); } public virtual long GetCommitTimestamp() { lock (Container().Lock()) { return Container().SystemTransaction().VersionForId(GetID()); } } public Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _class; } public virtual void ClassMetadata(Db4objects.Db4o.Internal.ClassMetadata classMetadata ) { if (_class == classMetadata) { return; } if (_class != null) { throw new InvalidOperationException("Object types aren't supposed to change!"); } _class = classMetadata; } public virtual int OwnLength() { throw Exceptions4.ShouldNeverBeCalled(); } public virtual Db4objects.Db4o.Internal.VirtualAttributes ProduceVirtualAttributes () { if (_virtualAttributes == null) { _virtualAttributes = new Db4objects.Db4o.Internal.VirtualAttributes(); } return _virtualAttributes; } internal void PeekPersisted(Db4objects.Db4o.Internal.Transaction trans, IActivationDepth depth) { SetObject(Read(trans, depth, Const4.Transient, false)); } internal object Read(Db4objects.Db4o.Internal.Transaction trans, IActivationDepth instantiationDepth, int addToIDTree, bool checkIDTree) { return Read(trans, null, null, instantiationDepth, addToIDTree, checkIDTree); } public object Read(Db4objects.Db4o.Internal.Transaction trans, ByteArrayBuffer buffer , object obj, IActivationDepth instantiationDepth, int addToIDTree, bool checkIDTree ) { UnmarshallingContext context = new UnmarshallingContext(trans, buffer, this, addToIDTree , checkIDTree); context.PersistentObject(obj); context.ActivationDepth(instantiationDepth); return context.Read(); } public virtual object ReadPrefetch(Db4objects.Db4o.Internal.Transaction trans, ByteArrayBuffer buffer, int addToIDTree) { UnmarshallingContext context = new UnmarshallingContext(trans, buffer, this, addToIDTree , false); context.ActivationDepth(new FixedActivationDepth(1, ActivationMode.Prefetch)); return context.Read(); } public void ReadThis(Db4objects.Db4o.Internal.Transaction trans, ByteArrayBuffer buffer) { } public virtual void SetObjectWeak(ObjectContainerBase container, object obj) { if (_object != null) { Platform4.KillYapRef(_object); } _object = container.NewWeakReference(this, obj); } public virtual void SetObject(object obj) { _object = obj; } internal void Store(Db4objects.Db4o.Internal.Transaction trans, Db4objects.Db4o.Internal.ClassMetadata classMetadata, object obj) { _object = obj; _class = classMetadata; int id = trans.Container().IdForNewUserObject(trans); SetID(id); // will be ended in continueset() BeginProcessing(); BitTrue(Const4.Continue); } public virtual void FlagForDelete(int callId) { _lastTopLevelCallId = -callId; } public virtual bool IsFlaggedForDelete() { return _lastTopLevelCallId < 0; } public virtual void FlagAsHandled(int callId) { _lastTopLevelCallId = callId; } public bool IsFlaggedAsHandled(int callID) { return _lastTopLevelCallId == callID; } public bool IsValid() { return IsValidId(GetID()) && GetObject() != null; } public static bool IsValidId(int id) { return id > 0; } public virtual Db4objects.Db4o.Internal.VirtualAttributes VirtualAttributes() { return _virtualAttributes; } public virtual Db4objects.Db4o.Internal.VirtualAttributes VirtualAttributes(Db4objects.Db4o.Internal.Transaction trans, bool lastCommitted) { if (trans == null) { return _virtualAttributes; } lock (trans.Container().Lock()) { if (_virtualAttributes == null) { if (_class.HasVirtualAttributes()) { _virtualAttributes = new Db4objects.Db4o.Internal.VirtualAttributes(); _class.ReadVirtualAttributes(trans, this, lastCommitted); } } else { if (!_virtualAttributes.SuppliesUUID()) { if (_class.HasVirtualAttributes()) { _class.ReadVirtualAttributes(trans, this, lastCommitted); } } } return _virtualAttributes; } } public virtual Db4objects.Db4o.Internal.VirtualAttributes VirtualAttributes(Db4objects.Db4o.Internal.Transaction trans) { return VirtualAttributes(trans, false); } public virtual void SetVirtualAttributes(Db4objects.Db4o.Internal.VirtualAttributes at) { _virtualAttributes = at; } public virtual void WriteThis(Db4objects.Db4o.Internal.Transaction trans, ByteArrayBuffer buffer) { } public virtual void WriteUpdate(Db4objects.Db4o.Internal.Transaction transaction, IUpdateDepth updatedepth) { ContinueSet(transaction, updatedepth); // make sure, a concurrent new, possibly triggered by objectOnNew // is written to the file // preventing recursive if (!BeginProcessing()) { return; } object obj = GetObject(); if (!ObjectCanUpdate(transaction, obj) || !IsActive() || obj == null || !ClassMetadata ().IsModified(obj)) { EndProcessing(); return; } MarshallingContext context = new MarshallingContext(transaction, this, updatedepth , false); if (context.UpdateDepth().Negative()) { EndProcessing(); return; } ObjectContainerBase container = transaction.Container(); LogEvent(container, "update", Const4.State); SetStateClean(); context.PurgeFieldIndexEntriesOnUpdate(transaction, container._handlers.ArrayType (obj)); Handlers4.Write(_class.TypeHandler(), context, obj); if (context.UpdateDepth().CanSkip(this)) { EndProcessing(); return; } Pointer4 pointer = context.AllocateSlot(); ByteArrayBuffer buffer = context.ToWriteBuffer(pointer); container.WriteUpdate(transaction, pointer, _class, container._handlers.ArrayType (obj), buffer); if (IsActive()) { SetStateClean(); } EndProcessing(); container.Callbacks().ObjectOnUpdate(transaction, this); ClassMetadata().DispatchEvent(transaction, obj, EventDispatchers.Update); } protected virtual bool ObjectCanUpdate(Db4objects.Db4o.Internal.Transaction transaction , object obj) { ObjectContainerBase container = transaction.Container(); return container.Callbacks().ObjectCanUpdate(transaction, this) && _class.DispatchEvent (transaction, obj, EventDispatchers.CanUpdate); } public virtual void Ref_init() { Hc_init(); Id_init(); } /// HCTREE public virtual Db4objects.Db4o.Internal.ObjectReference Hc_add(Db4objects.Db4o.Internal.ObjectReference newRef) { if (newRef.GetObject() == null) { return this; } newRef.Hc_init(); return Hc_add1(newRef); } private void Hc_init() { _hcPreceding = null; _hcSubsequent = null; _hcSize = 1; _hcHashcode = Hc_getCode(GetObject()); } private Db4objects.Db4o.Internal.ObjectReference Hc_add1(Db4objects.Db4o.Internal.ObjectReference newRef) { int cmp = Hc_compare(newRef); if (cmp < 0) { if (_hcPreceding == null) { _hcPreceding = newRef; _hcSize++; } else { _hcPreceding = _hcPreceding.Hc_add1(newRef); if (_hcSubsequent == null) { return Hc_rotateRight(); } return Hc_balance(); } } else { if (_hcSubsequent == null) { _hcSubsequent = newRef; _hcSize++; } else { _hcSubsequent = _hcSubsequent.Hc_add1(newRef); if (_hcPreceding == null) { return Hc_rotateLeft(); } return Hc_balance(); } } return this; } private Db4objects.Db4o.Internal.ObjectReference Hc_balance() { int cmp = _hcSubsequent._hcSize - _hcPreceding._hcSize; if (cmp < -2) { return Hc_rotateRight(); } else { if (cmp > 2) { return Hc_rotateLeft(); } else { _hcSize = _hcPreceding._hcSize + _hcSubsequent._hcSize + 1; return this; } } } private void Hc_calculateSize() { if (_hcPreceding == null) { if (_hcSubsequent == null) { _hcSize = 1; } else { _hcSize = _hcSubsequent._hcSize + 1; } } else { if (_hcSubsequent == null) { _hcSize = _hcPreceding._hcSize + 1; } else { _hcSize = _hcPreceding._hcSize + _hcSubsequent._hcSize + 1; } } } private int Hc_compare(Db4objects.Db4o.Internal.ObjectReference toRef) { int cmp = toRef._hcHashcode - _hcHashcode; if (cmp == 0) { cmp = toRef._id - _id; } return cmp; } public virtual Db4objects.Db4o.Internal.ObjectReference Hc_find(object obj) { return Hc_find(Hc_getCode(obj), obj); } private Db4objects.Db4o.Internal.ObjectReference Hc_find(int id, object obj) { int cmp = id - _hcHashcode; if (cmp < 0) { if (_hcPreceding != null) { return _hcPreceding.Hc_find(id, obj); } } else { if (cmp > 0) { if (_hcSubsequent != null) { return _hcSubsequent.Hc_find(id, obj); } } else { if (obj == GetObject()) { return this; } if (_hcPreceding != null) { Db4objects.Db4o.Internal.ObjectReference inPreceding = _hcPreceding.Hc_find(id, obj ); if (inPreceding != null) { return inPreceding; } } if (_hcSubsequent != null) { return _hcSubsequent.Hc_find(id, obj); } } } return null; } public static int Hc_getCode(object obj) { int hcode = Runtime.IdentityHashCode(obj); if (hcode < 0) { hcode = ~hcode; } return hcode; } private Db4objects.Db4o.Internal.ObjectReference Hc_rotateLeft() { Db4objects.Db4o.Internal.ObjectReference tree = _hcSubsequent; _hcSubsequent = tree._hcPreceding; Hc_calculateSize(); tree._hcPreceding = this; if (tree._hcSubsequent == null) { tree._hcSize = 1 + _hcSize; } else { tree._hcSize = 1 + _hcSize + tree._hcSubsequent._hcSize; } return tree; } private Db4objects.Db4o.Internal.ObjectReference Hc_rotateRight() { Db4objects.Db4o.Internal.ObjectReference tree = _hcPreceding; _hcPreceding = tree._hcSubsequent; Hc_calculateSize(); tree._hcSubsequent = this; if (tree._hcPreceding == null) { tree._hcSize = 1 + _hcSize; } else { tree._hcSize = 1 + _hcSize + tree._hcPreceding._hcSize; } return tree; } private Db4objects.Db4o.Internal.ObjectReference Hc_rotateSmallestUp() { if (_hcPreceding != null) { _hcPreceding = _hcPreceding.Hc_rotateSmallestUp(); return Hc_rotateRight(); } return this; } public virtual Db4objects.Db4o.Internal.ObjectReference Hc_remove(Db4objects.Db4o.Internal.ObjectReference findRef) { if (this == findRef) { return Hc_remove(); } int cmp = Hc_compare(findRef); if (cmp <= 0) { if (_hcPreceding != null) { _hcPreceding = _hcPreceding.Hc_remove(findRef); } } if (cmp >= 0) { if (_hcSubsequent != null) { _hcSubsequent = _hcSubsequent.Hc_remove(findRef); } } Hc_calculateSize(); return this; } public virtual void Hc_traverse(IVisitor4 visitor) { if (_hcPreceding != null) { _hcPreceding.Hc_traverse(visitor); } if (_hcSubsequent != null) { _hcSubsequent.Hc_traverse(visitor); } // Traversing the leaves first allows to add ObjectReference // nodes to different ReferenceSystem trees during commit visitor.Visit(this); } private Db4objects.Db4o.Internal.ObjectReference Hc_remove() { if (_hcSubsequent != null && _hcPreceding != null) { _hcSubsequent = _hcSubsequent.Hc_rotateSmallestUp(); _hcSubsequent._hcPreceding = _hcPreceding; _hcSubsequent.Hc_calculateSize(); return _hcSubsequent; } if (_hcSubsequent != null) { return _hcSubsequent; } return _hcPreceding; } /// IDTREE public virtual Db4objects.Db4o.Internal.ObjectReference Id_add(Db4objects.Db4o.Internal.ObjectReference newRef) { newRef.Id_init(); return Id_add1(newRef); } private void Id_init() { _idPreceding = null; _idSubsequent = null; _idSize = 1; } private Db4objects.Db4o.Internal.ObjectReference Id_add1(Db4objects.Db4o.Internal.ObjectReference newRef) { int cmp = newRef._id - _id; if (cmp < 0) { if (_idPreceding == null) { _idPreceding = newRef; _idSize++; } else { _idPreceding = _idPreceding.Id_add1(newRef); if (_idSubsequent == null) { return Id_rotateRight(); } return Id_balance(); } } else { if (cmp > 0) { if (_idSubsequent == null) { _idSubsequent = newRef; _idSize++; } else { _idSubsequent = _idSubsequent.Id_add1(newRef); if (_idPreceding == null) { return Id_rotateLeft(); } return Id_balance(); } } } return this; } private Db4objects.Db4o.Internal.ObjectReference Id_balance() { int cmp = _idSubsequent._idSize - _idPreceding._idSize; if (cmp < -2) { return Id_rotateRight(); } else { if (cmp > 2) { return Id_rotateLeft(); } else { _idSize = _idPreceding._idSize + _idSubsequent._idSize + 1; return this; } } } private void Id_calculateSize() { if (_idPreceding == null) { if (_idSubsequent == null) { _idSize = 1; } else { _idSize = _idSubsequent._idSize + 1; } } else { if (_idSubsequent == null) { _idSize = _idPreceding._idSize + 1; } else { _idSize = _idPreceding._idSize + _idSubsequent._idSize + 1; } } } public virtual Db4objects.Db4o.Internal.ObjectReference Id_find(int id) { int cmp = id - _id; if (cmp > 0) { if (_idSubsequent != null) { return _idSubsequent.Id_find(id); } } else { if (cmp < 0) { if (_idPreceding != null) { return _idPreceding.Id_find(id); } } else { return this; } } return null; } private Db4objects.Db4o.Internal.ObjectReference Id_rotateLeft() { Db4objects.Db4o.Internal.ObjectReference tree = _idSubsequent; _idSubsequent = tree._idPreceding; Id_calculateSize(); tree._idPreceding = this; if (tree._idSubsequent == null) { tree._idSize = _idSize + 1; } else { tree._idSize = _idSize + 1 + tree._idSubsequent._idSize; } return tree; } private Db4objects.Db4o.Internal.ObjectReference Id_rotateRight() { Db4objects.Db4o.Internal.ObjectReference tree = _idPreceding; _idPreceding = tree._idSubsequent; Id_calculateSize(); tree._idSubsequent = this; if (tree._idPreceding == null) { tree._idSize = _idSize + 1; } else { tree._idSize = _idSize + 1 + tree._idPreceding._idSize; } return tree; } private Db4objects.Db4o.Internal.ObjectReference Id_rotateSmallestUp() { if (_idPreceding != null) { _idPreceding = _idPreceding.Id_rotateSmallestUp(); return Id_rotateRight(); } return this; } public virtual Db4objects.Db4o.Internal.ObjectReference Id_remove(Db4objects.Db4o.Internal.ObjectReference @ref) { int cmp = @ref._id - _id; if (cmp < 0) { if (_idPreceding != null) { _idPreceding = _idPreceding.Id_remove(@ref); } } else { if (cmp > 0) { if (_idSubsequent != null) { _idSubsequent = _idSubsequent.Id_remove(@ref); } } else { if (this == @ref) { return Id_remove(); } return this; } } Id_calculateSize(); return this; } private Db4objects.Db4o.Internal.ObjectReference Id_remove() { if (_idSubsequent != null && _idPreceding != null) { _idSubsequent = _idSubsequent.Id_rotateSmallestUp(); _idSubsequent._idPreceding = _idPreceding; _idSubsequent.Id_calculateSize(); return _idSubsequent; } if (_idSubsequent != null) { return _idSubsequent; } return _idPreceding; } public override string ToString() { try { int id = GetID(); string str = "ObjectReference\nID=" + id; object obj = GetObject(); if (obj == null && _class != null) { ObjectContainerBase container = _class.Container(); if (container != null && id > 0) { obj = container.PeekPersisted(container.Transaction, id, container.DefaultActivationDepth (ClassMetadata()), true).ToString(); } } if (obj == null) { str += "\nfor [null]"; } else { string objToString = string.Empty; try { objToString = obj.ToString(); } catch (Exception) { } if (ClassMetadata() != null) { IReflectClass claxx = ClassMetadata().Reflector().ForObject(obj); str += "\n" + claxx.GetName(); } str += "\n" + objToString; } return str; } catch (Exception) { } return "ObjectReference " + GetID(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TypeHandlerConfiguration.cs0000644000175000017500000000311311700531646032077 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public abstract class TypeHandlerConfiguration { protected readonly Config4Impl _config; private ITypeHandler4 _listTypeHandler; private ITypeHandler4 _mapTypeHandler; public abstract void Apply(); public TypeHandlerConfiguration(Config4Impl config) { _config = config; } protected virtual void ListTypeHandler(ITypeHandler4 listTypeHandler) { _listTypeHandler = listTypeHandler; } protected virtual void MapTypeHandler(ITypeHandler4 mapTypehandler) { _mapTypeHandler = mapTypehandler; } protected virtual void RegisterCollection(Type clazz) { RegisterListTypeHandlerFor(clazz); } protected virtual void RegisterMap(Type clazz) { RegisterMapTypeHandlerFor(clazz); } protected virtual void IgnoreFieldsOn(Type clazz) { _config.RegisterTypeHandler(new SingleClassTypeHandlerPredicate(clazz), IgnoreFieldsTypeHandler .Instance); } private void RegisterListTypeHandlerFor(Type clazz) { RegisterTypeHandlerFor(clazz, _listTypeHandler); } private void RegisterMapTypeHandlerFor(Type clazz) { RegisterTypeHandlerFor(clazz, _mapTypeHandler); } protected virtual void RegisterTypeHandlerFor(Type clazz, ITypeHandler4 typeHandler ) { _config.RegisterTypeHandler(new SingleClassTypeHandlerPredicate(clazz), typeHandler ); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/HardObjectReference.cs0000644000175000017500000000231111700531646030753 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal { /// public class HardObjectReference { public static readonly Db4objects.Db4o.Internal.HardObjectReference Invalid = new Db4objects.Db4o.Internal.HardObjectReference(null, null); public readonly ObjectReference _reference; public readonly object _object; public HardObjectReference(ObjectReference @ref, object obj) { _reference = @ref; _object = obj; } public static Db4objects.Db4o.Internal.HardObjectReference PeekPersisted(Transaction trans, int id, int depth) { object obj = trans.Container().PeekPersisted(trans, id, ActivationDepthProvider(trans ).ActivationDepth(depth, ActivationMode.Peek), true); if (obj == null) { return null; } ObjectReference @ref = trans.ReferenceForId(id); return new Db4objects.Db4o.Internal.HardObjectReference(@ref, obj); } private static IActivationDepthProvider ActivationDepthProvider(Transaction trans ) { return trans.Container().ActivationDepthProvider(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IVersionedTypeHandler.cs0000644000175000017500000000050711700531646031343 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public interface IVersionedTypeHandler : ITypeHandler4, IDeepClone { ITypeHandler4 UnversionedTemplate(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IEventDispatcher.cs0000644000175000017500000000044611700531646030337 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { public interface IEventDispatcher { bool Dispatch(Transaction trans, object obj, int eventID); bool HasEventRegistered(int eventID); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/0000755000175000017500000000000011700531646026010 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/CommonConfigurationImpl.cs0000644000175000017500000001155711700531646033152 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o.Config; using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Config { public class CommonConfigurationImpl : ICommonConfiguration { private readonly Config4Impl _config; public CommonConfigurationImpl(Config4Impl config) { _config = config; } public virtual int ActivationDepth { get { return _config.ActivationDepth(); } set { int depth = value; _config.ActivationDepth(depth); } } public virtual void Add(IConfigurationItem configurationItem) { _config.Add(configurationItem); } public virtual void AddAlias(IAlias alias) { _config.AddAlias(alias); } public virtual void RemoveAlias(IAlias alias) { _config.RemoveAlias(alias); } public virtual bool AllowVersionUpdates { set { bool flag = value; _config.AllowVersionUpdates(flag); } } public virtual bool AutomaticShutDown { set { bool flag = value; _config.AutomaticShutDown(flag); } } public virtual int BTreeNodeSize { set { int size = value; _config.BTreeNodeSize(size); } } public virtual bool Callbacks { set { bool flag = value; _config.Callbacks(flag); } } public virtual void CallbackMode(CallBackMode mode) { _config.CallbackMode(mode); } public virtual bool CallConstructors { set { bool flag = value; _config.CallConstructors(flag); } } public virtual bool DetectSchemaChanges { set { bool flag = value; _config.DetectSchemaChanges(flag); } } public virtual IDiagnosticConfiguration Diagnostic { get { return _config.Diagnostic(); } } public virtual bool ExceptionsOnNotStorable { set { bool flag = value; _config.ExceptionsOnNotStorable(flag); } } public virtual bool InternStrings { set { bool flag = value; _config.InternStrings(flag); } } public virtual void MarkTransient(string attributeName) { _config.MarkTransient(attributeName); } public virtual int MessageLevel { set { int level = value; _config.MessageLevel(level); } } public virtual IObjectClass ObjectClass(object clazz) { return _config.ObjectClass(clazz); } public virtual bool OptimizeNativeQueries { get { return _config.OptimizeNativeQueries(); } set { bool optimizeNQ = value; _config.OptimizeNativeQueries(optimizeNQ); } } public virtual IQueryConfiguration Queries { get { return _config.Queries(); } } public virtual void ReflectWith(IReflector reflector) { _config.ReflectWith(reflector); } public virtual TextWriter OutStream { set { TextWriter outStream = value; _config.SetOut(outStream); } } public virtual IStringEncoding StringEncoding { set { IStringEncoding encoding = value; _config.StringEncoding(encoding); } } public virtual bool TestConstructors { set { bool flag = value; _config.TestConstructors(flag); } } public virtual int UpdateDepth { set { int depth = value; _config.UpdateDepth(depth); } } public virtual bool WeakReferences { set { bool flag = value; _config.WeakReferences(flag); } } public virtual int WeakReferenceCollectionInterval { set { int milliseconds = value; _config.WeakReferenceCollectionInterval(milliseconds); } } public virtual void RegisterTypeHandler(ITypeHandlerPredicate predicate, ITypeHandler4 typeHandler) { _config.RegisterTypeHandler(predicate, typeHandler); } public virtual IEnvironmentConfiguration Environment { get { return new _IEnvironmentConfiguration_139(this); } } private sealed class _IEnvironmentConfiguration_139 : IEnvironmentConfiguration { public _IEnvironmentConfiguration_139(CommonConfigurationImpl _enclosing) { this._enclosing = _enclosing; } public void Add(object service) { this._enclosing._config.EnvironmentContributions().Add(service); } private readonly CommonConfigurationImpl _enclosing; } public virtual void NameProvider(INameProvider provider) { _config.NameProvider(provider); } public virtual int MaxStackDepth { get { return _config.MaxStackDepth(); } set { int maxStackDepth = value; _config.MaxStackDepth(maxStackDepth); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/FileConfigurationImpl.cs0000644000175000017500000000504711700531646032576 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Config { internal class FileConfigurationImpl : IFileConfiguration { private readonly Config4Impl _config; public FileConfigurationImpl(Config4Impl config) { _config = config; } public virtual int BlockSize { set { int bytes = value; _config.BlockSize(bytes); } } public virtual int DatabaseGrowthSize { set { int bytes = value; _config.DatabaseGrowthSize(bytes); } } public virtual void DisableCommitRecovery() { _config.DisableCommitRecovery(); } public virtual IFreespaceConfiguration Freespace { get { return _config.Freespace(); } } public virtual ConfigScope GenerateUUIDs { set { ConfigScope setting = value; _config.GenerateUUIDs(setting); } } public virtual ConfigScope GenerateVersionNumbers { set { ConfigScope setting = value; _config.GenerateVersionNumbers(setting); } } public virtual bool GenerateCommitTimestamps { set { bool setting = value; _config.GenerateCommitTimestamps(setting); } } /// public virtual IStorage Storage { get { return _config.Storage; } set { IStorage factory = value; _config.Storage = factory; } } public virtual bool LockDatabaseFile { set { bool flag = value; _config.LockDatabaseFile(flag); } } /// /// public virtual long ReserveStorageSpace { set { long byteCount = value; _config.ReserveStorageSpace(byteCount); } } /// public virtual string BlobPath { set { string path = value; _config.SetBlobPath(path); } } public virtual bool ReadOnly { set { bool flag = value; _config.ReadOnly(flag); } } public virtual bool RecoveryMode { set { bool flag = value; _config.RecoveryMode(flag); } } public virtual bool AsynchronousSync { set { bool flag = value; _config.AsynchronousSync(flag); } } } } ILegacyConfigurationProvider.cs0000644000175000017500000000035111700531646034037 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Config { public interface ILegacyConfigurationProvider { Config4Impl Legacy(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/IdSystemConfigurationImpl.cs0000644000175000017500000000162111700531646033452 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Config { /// public class IdSystemConfigurationImpl : IIdSystemConfiguration { private readonly Config4Impl _config; public IdSystemConfigurationImpl(Config4Impl config) { _config = config; } public virtual void UsePointerBasedSystem() { _config.UsePointerBasedIdSystem(); } public virtual void UseStackedBTreeSystem() { _config.UseStackedBTreeIdSystem(); } public virtual void UseInMemorySystem() { _config.UseInMemoryIdSystem(); } public virtual void UseCustomSystem(IIdSystemFactory factory) { _config.UseCustomIdSystem(factory); } public virtual void UseSingleBTreeSystem() { _config.UseSingleBTreeIdSystem(); } } } Db4oLegacyConfigurationBridge.cs0000644000175000017500000000200211700531646034034 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; namespace Db4objects.Db4o.Internal.Config { public class Db4oLegacyConfigurationBridge { public static IEmbeddedConfiguration AsEmbeddedConfiguration(IConfiguration legacy ) { return new EmbeddedConfigurationImpl(legacy); } public static ICommonConfiguration AsCommonConfiguration(IConfiguration config) { return new CommonConfigurationImpl((Config4Impl)config); } public static Config4Impl AsLegacy(object config) { return ((ILegacyConfigurationProvider)config).Legacy(); } public static IFileConfiguration AsFileConfiguration(IConfiguration config) { return new FileConfigurationImpl((Config4Impl)config); } public static IIdSystemConfiguration AsIdSystemConfiguration(IConfiguration config ) { return new IdSystemConfigurationImpl((Config4Impl)config); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/CacheConfigurationImpl.cs0000644000175000017500000000110211700531646032706 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Config { /// public class CacheConfigurationImpl : ICacheConfiguration { private readonly Config4Impl _config; public CacheConfigurationImpl(Config4Impl config) { _config = config; } [System.ObsoleteAttribute(@"since 7.14 BTrees have their own LRU cache now.")] public virtual int SlotCacheSize { set { int size = value; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config/EmbeddedConfigurationImpl.cs0000644000175000017500000000355211700531646033407 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; namespace Db4objects.Db4o.Internal.Config { public class EmbeddedConfigurationImpl : IEmbeddedConfiguration, ILegacyConfigurationProvider { private readonly Config4Impl _legacy; private IList _configItems; public EmbeddedConfigurationImpl(IConfiguration legacy) { _legacy = (Config4Impl)legacy; } public virtual ICacheConfiguration Cache { get { return new CacheConfigurationImpl(_legacy); } } public virtual IFileConfiguration File { get { return new FileConfigurationImpl(_legacy); } } public virtual ICommonConfiguration Common { get { return Db4oLegacyConfigurationBridge.AsCommonConfiguration(Legacy()); } } public virtual Config4Impl Legacy() { return _legacy; } public virtual void AddConfigurationItem(IEmbeddedConfigurationItem configItem) { if (_configItems != null && _configItems.Contains(configItem)) { return; } configItem.Prepare(this); if (_configItems == null) { _configItems = new ArrayList(); } _configItems.Add(configItem); } public virtual void ApplyConfigurationItems(IEmbeddedObjectContainer container) { if (_configItems == null) { return; } for (IEnumerator configItemIter = _configItems.GetEnumerator(); configItemIter.MoveNext (); ) { IEmbeddedConfigurationItem configItem = ((IEmbeddedConfigurationItem)configItemIter .Current); configItem.Apply(container); } } public virtual IIdSystemConfiguration IdSystem { get { return new IdSystemConfigurationImpl(_legacy); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/CommitTimestampFieldMetadata.cs0000644000175000017500000000435111700531646032656 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public class CommitTimestampFieldMetadata : VirtualFieldMetadata { internal CommitTimestampFieldMetadata() : base(Handlers4.LongId, new LongHandler( )) { SetName(VirtualField.CommitTimestamp); } /// public override void AddFieldIndex(ObjectIdContextImpl context) { } public override void AddIndexEntry(Transaction trans, int parentID, object indexEntry ) { } public override void RemoveIndexEntry(Transaction trans, int parentID, object indexEntry ) { } public override void Delete(DeleteContextImpl context, bool isUpdate) { } internal override void Instantiate1(ObjectReferenceContext context) { } internal override void Marshall(Transaction trans, ObjectReference @ref, IWriteBuffer buffer, bool isMigrating, bool isNew) { } public override int LinkLength() { return 0; } public override void DefragAspect(IDefragmentContext context) { } internal override void MarshallIgnore(IWriteBuffer buffer) { } public override void Activate(UnmarshallingContext context) { } // do nothing. public override BTree GetIndex(Transaction trans) { return ((LocalTransaction)trans.SystemTransaction()).CommitTimestampSupport().TimestampToId (); } public override bool HasIndex() { return true; } protected override IFieldIndexKey CreateFieldIndexKey(int parentID, object indexEntry ) { return new CommitTimestampSupport.TimestampEntry(parentID, ((long)indexEntry)); } internal int counter = 0; public override object Read(IObjectIdContext context) { int objectId = context.ObjectId(); long version = context.Transaction().SystemTransaction().VersionForId(objectId); return version; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectTypeMetadata.cs0000644000175000017500000000125211700531646030643 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { public class ObjectTypeMetadata : PrimitiveTypeMetadata { public ObjectTypeMetadata(ObjectContainerBase container, ITypeHandler4 handler, int id, IReflectClass classReflector) : base(container, handler, id, classReflector ) { } public override object Instantiate(UnmarshallingContext context) { object @object = new object(); OnInstantiate(context, @object); return @object; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/FieldMetadataState.cs0000644000175000017500000000171111700531646030617 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { /// internal class FieldMetadataState { private readonly string _info; private FieldMetadataState(string info) { _info = info; } internal static readonly Db4objects.Db4o.Internal.FieldMetadataState NotLoaded = new Db4objects.Db4o.Internal.FieldMetadataState("not loaded"); internal static readonly Db4objects.Db4o.Internal.FieldMetadataState Unavailable = new Db4objects.Db4o.Internal.FieldMetadataState("unavailable"); internal static readonly Db4objects.Db4o.Internal.FieldMetadataState Available = new Db4objects.Db4o.Internal.FieldMetadataState("available"); internal static readonly Db4objects.Db4o.Internal.FieldMetadataState Updating = new Db4objects.Db4o.Internal.FieldMetadataState("updating"); public override string ToString() { return _info; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/FieldMetadata.cs0000644000175000017500000010223411700531646027620 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Reflect; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class FieldMetadata : ClassAspect, IStoredField { private ClassMetadata _containingClass; private string _name; protected bool _isArray; private bool _isNArray; private bool _isPrimitive; private IReflectField _reflectField; private FieldMetadataState _state = FieldMetadataState.NotLoaded; private Config4Field _config; private IDb4oTypeImpl _db4oType; private int _linkLength; private BTree _index; protected ClassMetadata _fieldType; protected int _fieldTypeID; internal static readonly Db4objects.Db4o.Internal.FieldMetadata[] EmptyArray = new Db4objects.Db4o.Internal.FieldMetadata[0]; public FieldMetadata(ClassMetadata classMetadata) { _containingClass = classMetadata; } protected Type TranslatorStoredClass(IObjectTranslator translator) { try { return translator.StoredClass(); } catch (Exception e) { throw new ReflectException(e); } } internal FieldMetadata(ClassMetadata containingClass, IReflectField field, ClassMetadata fieldType) : this(containingClass) { Init(field.GetName()); _reflectField = field; _fieldType = fieldType; _fieldTypeID = fieldType.GetID(); // TODO: beautify !!! possibly pull up isPrimitive to ReflectField bool isPrimitive = field is GenericField ? ((GenericField)field).IsPrimitive() : false; Configure(field.GetFieldType(), isPrimitive); CheckDb4oType(); SetAvailable(); } protected virtual void SetAvailable() { _state = FieldMetadataState.Available; } protected FieldMetadata(int fieldTypeID) { _fieldTypeID = fieldTypeID; } public FieldMetadata(ClassMetadata containingClass, string name, int fieldTypeID, bool primitive, bool isArray, bool isNArray) : this(containingClass) { Init(name, fieldTypeID, primitive, isArray, isNArray); } protected FieldMetadata(ClassMetadata containingClass, string name) : this(containingClass ) { Init(name); } /// public virtual void AddFieldIndex(ObjectIdContextImpl context) { if (!HasIndex()) { IncrementOffset(context); return; } try { AddIndexEntry(context.Transaction(), context.ObjectId(), ReadIndexEntry(context)); } catch (CorruptionException exc) { throw new FieldIndexException(exc, this); } } protected void AddIndexEntry(StatefulBuffer a_bytes, object indexEntry) { AddIndexEntry(a_bytes.Transaction(), a_bytes.GetID(), indexEntry); } public virtual void AddIndexEntry(Transaction trans, int parentID, object indexEntry ) { if (!HasIndex()) { return; } BTree index = GetIndex(trans); index.Add(trans, CreateFieldIndexKey(parentID, indexEntry)); } protected virtual IFieldIndexKey CreateFieldIndexKey(int parentID, object indexEntry ) { object convertedIndexEntry = IndexEntryFor(indexEntry); return new FieldIndexKeyImpl(parentID, convertedIndexEntry); } protected virtual object IndexEntryFor(object indexEntry) { return _reflectField.IndexEntry(indexEntry); } public virtual bool CanUseNullBitmap() { return true; } /// /// public object ReadIndexEntry(IObjectIdContext context) { IIndexableTypeHandler indexableTypeHandler = (IIndexableTypeHandler)HandlerRegistry .CorrectHandlerVersion(context, GetHandler()); return indexableTypeHandler.ReadIndexEntry(context); } public virtual void RemoveIndexEntry(Transaction trans, int parentID, object indexEntry ) { if (!HasIndex()) { return; } BTree index = GetIndex(trans); if (index == null) { return; } index.Remove(trans, CreateFieldIndexKey(parentID, indexEntry)); } //TODO: Split into command query separation. public virtual bool Alive() { if (_state == FieldMetadataState.Available) { return true; } if (_state == FieldMetadataState.NotLoaded) { return Load(); } return _state == FieldMetadataState.Available; } private bool Load() { if (_fieldType == null) { // this may happen if the local ClassMetadataRepository // has not been updated from the server and presumably // in some refactoring cases. // We try to heal the problem by re-reading the class. // This could be dangerous, if the class type of a field // has been modified. // TODO: add class refactoring features _fieldType = DetectFieldType(); CheckFieldTypeID(); } CheckCorrectTypeForField(); if (_fieldType == null || _reflectField == null) { _state = FieldMetadataState.Unavailable; _reflectField = null; return false; } if (Updating()) { return false; } SetAvailable(); CheckDb4oType(); return true; } private bool ShouldStoreField() { return !_reflectField.IsTransient() || (_containingClass != null && _containingClass .ShouldStoreTransientFields()); } public virtual bool Updating() { return _state == FieldMetadataState.Updating; } private void CheckFieldTypeID() { int id = _fieldType != null ? _fieldType.GetID() : 0; if (_fieldTypeID == 0) { _fieldTypeID = id; return; } if (id > 0 && id != _fieldTypeID) { // wrong type, refactoring, field should be turned off // TODO: it would be cool to log something here _fieldType = null; } } internal virtual bool CanAddToQuery(string fieldName) { if (!Alive()) { return false; } return fieldName.Equals(GetName()) && ContainingClass() != null && !ContainingClass ().IsInternal(); } private bool CanHold(IReflectClass type) { if (type == null) { throw new ArgumentNullException(); } ITypeHandler4 typeHandler = GetHandler(); if (typeHandler is IQueryableTypeHandler) { if (((IQueryableTypeHandler)typeHandler).DescendsIntoMembers()) { return true; } } IReflectClass classReflector = FieldType().ClassReflector(); if (classReflector.IsCollection()) { return true; } return classReflector.IsAssignableFrom(type); } public virtual GenericReflector Reflector() { ObjectContainerBase container = Container(); if (container == null) { return null; } return container.Reflector(); } public virtual object Coerce(IReflectClass valueClass, object value) { if (value == null) { return _isPrimitive ? No4.Instance : value; } if (valueClass == null) { throw new ArgumentNullException(); } if (GetHandler() is PrimitiveHandler) { return ((PrimitiveHandler)GetHandler()).Coerce(valueClass, value); } if (!CanHold(valueClass)) { return No4.Instance; } return value; } public bool CanLoadByIndex() { return Handlers4.CanLoadFieldByIndex(GetHandler()); } public sealed override void CascadeActivation(IActivationContext context) { if (!Alive()) { return; } object cascadeTo = CascadingTarget(context); if (cascadeTo == null) { return; } IActivationContext cascadeContext = context.ForObject(cascadeTo); ClassMetadata classMetadata = cascadeContext.ClassMetadata(); if (classMetadata == null) { return; } EnsureObjectIsActive(cascadeContext); Handlers4.CascadeActivation(cascadeContext, classMetadata.TypeHandler()); } private void EnsureObjectIsActive(IActivationContext context) { if (!context.Depth().Mode().IsActivate()) { return; } if (Handlers4.IsValueType(GetHandler())) { return; } ObjectContainerBase container = context.Container(); ClassMetadata classMetadata = container.ClassMetadataForObject(context.TargetObject ()); if (classMetadata == null || !classMetadata.HasIdentity()) { return; } if (container.IsActive(context.TargetObject())) { return; } container.StillToActivate(context.Descend()); } protected object CascadingTarget(IActivationContext context) { if (context.Depth().Mode().IsDeactivate()) { if (null == _reflectField) { return null; } return FieldAccessor().Get(_reflectField, context.TargetObject()); } return GetOrCreate(context.Transaction(), context.TargetObject()); } private void CheckDb4oType() { if (_reflectField != null) { if (Container()._handlers.IclassDb4otype.IsAssignableFrom(_reflectField.GetFieldType ())) { _db4oType = HandlerRegistry.GetDb4oType(_reflectField.GetFieldType()); } } } internal virtual void CollectConstraints(Transaction trans, QConObject a_parent, object a_template, IVisitor4 a_visitor) { object obj = GetOn(trans, a_template); if (obj != null) { Collection4 objs = Platform4.FlattenCollection(trans.Container(), obj); IEnumerator j = objs.GetEnumerator(); while (j.MoveNext()) { obj = j.Current; if (obj != null) { if (_isPrimitive && !_isArray) { object nullValue = _reflectField.GetFieldType().NullValue(); if (obj.Equals(nullValue)) { return; } } if (Platform4.IgnoreAsConstraint(obj)) { return; } if (!a_parent.HasObjectInParentPath(obj)) { QConObject constraint = new QConObject(trans, a_parent, QField(trans), obj); constraint.ByExample(); a_visitor.Visit(constraint); } } } } } /// public sealed override void CollectIDs(CollectIdContext context) { if (!Alive()) { IncrementOffset(context.Buffer()); return; } ITypeHandler4 handler = HandlerRegistry.CorrectHandlerVersion(context, GetHandler ()); Handlers4.CollectIdsInternal(context, handler, LinkLength(), true); } internal virtual void Configure(IReflectClass clazz, bool isPrimitive) { _isArray = clazz.IsArray(); if (_isArray) { IReflectArray reflectArray = Reflector().Array(); _isNArray = reflectArray.IsNDimensional(clazz); _isPrimitive = reflectArray.GetComponentType(clazz).IsPrimitive(); } else { _isPrimitive = isPrimitive | clazz.IsPrimitive(); } } protected ITypeHandler4 WrapHandlerToArrays(ITypeHandler4 handler) { if (handler == null) { return null; } if (_isNArray) { return new MultidimensionalArrayHandler(handler, ArraysUsePrimitiveClassReflector ()); } if (_isArray) { return new ArrayHandler(handler, ArraysUsePrimitiveClassReflector()); } return handler; } private bool ArraysUsePrimitiveClassReflector() { return _isPrimitive; } public override void Deactivate(IActivationContext context) { if (!Alive() || !ShouldStoreField()) { return; } bool isEnumClass = _containingClass.IsEnum(); if (_isPrimitive && !_isArray) { if (!isEnumClass) { object nullValue = _reflectField.GetFieldType().NullValue(); FieldAccessor().Set(_reflectField, context.TargetObject(), nullValue); } return; } if (context.Depth().RequiresActivation()) { CascadeActivation(context); } if (!isEnumClass) { FieldAccessor().Set(_reflectField, context.TargetObject(), null); } } private IFieldAccessor FieldAccessor() { return _containingClass.FieldAccessor(); } /// public override void Delete(DeleteContextImpl context, bool isUpdate) { if (!CheckAlive(context)) { return; } try { RemoveIndexEntry(context); if (isUpdate) { IncrementOffset(context); return; } StatefulBuffer buffer = (StatefulBuffer)context.Buffer(); DeleteContextImpl childContext = new DeleteContextImpl(context, GetStoredType(), _config); context.SlotFormat().DoWithSlotIndirection(buffer, GetHandler(), new _IClosure4_445 (this, childContext)); } catch (CorruptionException exc) { throw new FieldIndexException(exc, this); } } private sealed class _IClosure4_445 : IClosure4 { public _IClosure4_445(FieldMetadata _enclosing, DeleteContextImpl childContext) { this._enclosing = _enclosing; this.childContext = childContext; } public object Run() { childContext.Delete(this._enclosing.GetHandler()); return null; } private readonly FieldMetadata _enclosing; private readonly DeleteContextImpl childContext; } /// /// private void RemoveIndexEntry(DeleteContextImpl context) { if (!HasIndex()) { return; } int offset = context.Offset(); object obj = ReadIndexEntry(context); RemoveIndexEntry(context.Transaction(), context.ObjectId(), obj); context.Seek(offset); } public override bool Equals(object obj) { if (!(obj is Db4objects.Db4o.Internal.FieldMetadata)) { return false; } Db4objects.Db4o.Internal.FieldMetadata other = (Db4objects.Db4o.Internal.FieldMetadata )obj; other.Alive(); Alive(); return other._isPrimitive == _isPrimitive && other._fieldType == _fieldType && other ._name.Equals(_name); } public override int GetHashCode() { return _name.GetHashCode(); } public object Get(object onObject) { return Get(null, onObject); } public object Get(Transaction trans, object onObject) { if (_containingClass == null) { return null; } ObjectContainerBase container = Container(); if (container == null) { return null; } lock (container.Lock()) { // FIXME: The following is not really transactional. // This will work OK for normal C/S and for // single local mode but the transaction will // be wrong for MTOC. if (trans == null) { trans = container.Transaction; } container.CheckClosed(); ObjectReference @ref = trans.ReferenceForObject(onObject); if (@ref == null) { return null; } int id = @ref.GetID(); if (id <= 0) { return null; } UnmarshallingContext context = new UnmarshallingContext(trans, @ref, Const4.AddToIdTree , false); context.ActivationDepth(new LegacyActivationDepth(1)); return context.ReadFieldValue(this); } } public override string GetName() { return _name; } public ClassMetadata FieldType() { // alive needs to be checked by all callers: Done return _fieldType; } public virtual ITypeHandler4 GetHandler() { if (_fieldType == null) { return null; } // alive needs to be checked by all callers: Done return WrapHandlerToArrays(_fieldType.TypeHandler()); } public virtual int FieldTypeID() { // alive needs to be checked by all callers: Done return _fieldTypeID; } public virtual object GetOn(Transaction trans, object onObject) { if (Alive()) { return FieldAccessor().Get(_reflectField, onObject); } return null; } /// /// dirty hack for com.db4o.types some of them (BlobImpl) need to be set automatically /// TODO: Derive from FieldMetadata for Db4oTypes /// public virtual object GetOrCreate(Transaction trans, object onObject) { if (!Alive()) { return null; } object obj = FieldAccessor().Get(_reflectField, onObject); if (_db4oType != null && obj == null) { obj = _db4oType.CreateDefault(trans); FieldAccessor().Set(_reflectField, onObject, obj); } return obj; } public ClassMetadata ContainingClass() { // alive needs to be checked by all callers: Done return _containingClass; } public virtual IReflectClass GetStoredType() { if (_reflectField == null) { return null; } return Handlers4.BaseType(_reflectField.GetFieldType()); } public virtual ObjectContainerBase Container() { if (_containingClass == null) { return null; } return _containingClass.Container(); } public virtual bool HasConfig() { return _config != null; } public virtual bool HasIndex() { return _index != null; } public void Init(string name) { _name = name; InitConfiguration(name); } internal void InitConfiguration(string name) { Config4Class containingClassConfig = _containingClass.Config(); if (containingClassConfig == null) { return; } _config = containingClassConfig.ConfigField(name); } public virtual void Init(string name, int fieldTypeID, bool isPrimitive, bool isArray , bool isNArray) { _fieldTypeID = fieldTypeID; _isPrimitive = isPrimitive; _isArray = isArray; _isNArray = isNArray; Init(name); LoadFieldTypeById(); Alive(); } private bool _initialized = false; internal void InitConfigOnUp(Transaction trans) { if (_initialized) { return; } _initialized = true; if (_config != null) { _config.InitOnUp(trans, this); } } public override void Activate(UnmarshallingContext context) { if (!CheckAlive(context)) { return; } if (!ShouldStoreField()) { IncrementOffset(context); return; } object toSet = Read(context); InformAboutTransaction(toSet, context.Transaction()); Set(context.PersistentObject(), toSet); } public virtual void AttemptUpdate(UnmarshallingContext context) { if (!Updating()) { IncrementOffset(context); return; } int savedOffset = context.Offset(); try { object toSet = context.Read(GetHandler()); if (toSet != null) { Set(context.PersistentObject(), toSet); } } catch (Exception) { // FIXME: COR-547 Diagnostics here please. context.Buffer().Seek(savedOffset); IncrementOffset(context); } } private bool CheckAlive(IAspectVersionContext context) { if (!CheckEnabled(context)) { return false; } bool alive = Alive(); if (!alive) { IncrementOffset((IReadBuffer)context); } return alive; } private void InformAboutTransaction(object obj, Transaction trans) { if (_db4oType != null && obj != null) { ((IDb4oTypeImpl)obj).SetTrans(trans); } } public virtual bool IsArray() { return _isArray; } public override int LinkLength() { Alive(); if (_linkLength == 0) { _linkLength = CalculateLinkLength(); } return _linkLength; } private int CalculateLinkLength() { return Handlers4.CalculateLinkLength(GetHandler()); } public virtual void LoadFieldTypeById() { _fieldType = Container().ClassMetadataForID(_fieldTypeID); } private ClassMetadata DetectFieldType() { IReflectClass claxx = _containingClass.ClassReflector(); if (claxx == null) { return null; } _reflectField = claxx.GetDeclaredField(_name); if (_reflectField == null) { return null; } IReflectClass fieldType = _reflectField.GetFieldType(); if (fieldType == null) { return null; } return Handlers4.ErasedFieldType(Container(), fieldType); } protected virtual ITypeHandler4 TypeHandlerForClass(ObjectContainerBase container , IReflectClass fieldType) { container.ShowInternalClasses(true); try { return container.TypeHandlerForClass(Handlers4.BaseType(fieldType)); } finally { container.ShowInternalClasses(false); } } private void CheckCorrectTypeForField() { ClassMetadata currentFieldType = DetectFieldType(); if (currentFieldType == null) { _reflectField = null; _state = FieldMetadataState.Unavailable; return; } if (currentFieldType == _fieldType && Handlers4.BaseType(_reflectField.GetFieldType ()).IsPrimitive() == _isPrimitive) { return; } // special case when migrating from type handler ids // to class metadata ids which caused // any interface metadata id to be mapped to UNTYPED_ID if (Handlers4.IsUntyped(currentFieldType.TypeHandler()) && Handlers4.IsUntyped(_fieldType .TypeHandler())) { return; } // FIXME: COR-547 Diagnostics here please. _state = FieldMetadataState.Updating; } private IUpdateDepth AdjustUpdateDepthForCascade(object obj, IUpdateDepth updateDepth ) { return updateDepth.AdjustUpdateDepthForCascade(_containingClass.IsCollection(obj) ); } private bool CascadeOnUpdate(Config4Class parentClassConfiguration) { return ((parentClassConfiguration != null && (parentClassConfiguration.CascadeOnUpdate ().DefiniteYes())) || (_config != null && (_config.CascadeOnUpdate().DefiniteYes ()))); } public override void Marshall(MarshallingContext context, object obj) { // alive needs to be checked by all callers: Done IUpdateDepth updateDepth = context.UpdateDepth(); if (obj != null && CascadeOnUpdate(context.ClassConfiguration())) { context.UpdateDepth(AdjustUpdateDepthForCascade(obj, updateDepth)); } context.WriteObjectWithCurrentState(GetHandler(), obj); context.UpdateDepth(updateDepth); if (HasIndex()) { context.AddIndexEntry(this, obj); } } public virtual bool NeedsArrayAndPrimitiveInfo() { return true; } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { if (!Alive()) { return null; } return Handlers4.PrepareComparisonFor(GetHandler(), context, obj); } public virtual Db4objects.Db4o.Internal.Query.Processor.QField QField(Transaction a_trans) { int classMetadataID = 0; if (_containingClass != null) { classMetadataID = _containingClass.GetID(); } return new Db4objects.Db4o.Internal.Query.Processor.QField(a_trans, _name, this, classMetadataID, _handle); } public virtual object Read(IObjectIdContext context) { if (!CanReadFromSlot((IAspectVersionContext)context)) { IncrementOffset(context); return null; } return context.Read(GetHandler()); } private bool CanReadFromSlot(IAspectVersionContext context) { if (!IsEnabledOn(context)) { return false; } if (Alive()) { return true; } return _state != FieldMetadataState.NotLoaded; } internal virtual void Refresh() { ClassMetadata newFieldType = DetectFieldType(); if (newFieldType != null && newFieldType.Equals(_fieldType)) { return; } _reflectField = null; _state = FieldMetadataState.Unavailable; } // FIXME: needs test case public virtual void Rename(string newName) { ObjectContainerBase container = Container(); if (!container.IsClient) { _name = newName; _containingClass.SetStateDirty(); _containingClass.Write(container.SystemTransaction()); } else { Exceptions4.ThrowRuntimeException(58); } } public virtual void Set(object onObject, object obj) { // TODO: remove the following if and check callers if (null == _reflectField) { return; } FieldAccessor().Set(_reflectField, onObject, obj); } internal virtual void SetName(string a_name) { _name = a_name; } internal virtual bool SupportsIndex() { return Alive() && (GetHandler() is IIndexable4) && (!Handlers4.IsUntyped(GetHandler ())); } public void TraverseValues(IVisitor4 userVisitor) { if (!Alive()) { return; } TraverseValues(Container().Transaction, userVisitor); } public void TraverseValues(Transaction transaction, IVisitor4 userVisitor) { if (!Alive()) { return; } AssertHasIndex(); ObjectContainerBase stream = transaction.Container(); if (stream.IsClient) { Exceptions4.ThrowRuntimeException(Db4objects.Db4o.Internal.Messages.ClientServerUnsupported ); } lock (stream.Lock()) { IContext context = transaction.Context(); _index.TraverseKeys(transaction, new _IVisitor4_866(this, userVisitor, context)); } } private sealed class _IVisitor4_866 : IVisitor4 { public _IVisitor4_866(FieldMetadata _enclosing, IVisitor4 userVisitor, IContext context ) { this._enclosing = _enclosing; this.userVisitor = userVisitor; this.context = context; } public void Visit(object obj) { IFieldIndexKey key = (IFieldIndexKey)obj; userVisitor.Visit(((IIndexableTypeHandler)this._enclosing.GetHandler()).IndexEntryToObject (context, key.Value())); } private readonly FieldMetadata _enclosing; private readonly IVisitor4 userVisitor; private readonly IContext context; } private void AssertHasIndex() { if (!HasIndex()) { Exceptions4.ThrowRuntimeException(Db4objects.Db4o.Internal.Messages.OnlyForIndexedFields ); } } public override string ToString() { StringBuilder sb = new StringBuilder(); if (_containingClass != null) { sb.Append(_containingClass.GetName()); sb.Append("."); } sb.Append(GetName()); return sb.ToString(); } private void InitIndex(Transaction systemTrans) { InitIndex(systemTrans, 0); } public virtual void InitIndex(Transaction systemTrans, int id) { if (_index != null) { throw new InvalidOperationException(); } if (systemTrans.Container().IsClient) { return; } _index = NewBTree(systemTrans, id); } protected BTree NewBTree(Transaction systemTrans, int id) { ObjectContainerBase stream = systemTrans.Container(); IIndexable4 indexHandler = IndexHandler(stream); if (indexHandler == null) { return null; } return new BTree(systemTrans, id, new FieldIndexKeyHandler(indexHandler)); } protected virtual IIndexable4 IndexHandler(ObjectContainerBase stream) { if (_reflectField == null) { return null; } IReflectClass indexType = _reflectField.IndexType(); ITypeHandler4 classHandler = TypeHandlerForClass(stream, indexType); if (!(classHandler is IIndexable4)) { return null; } return (IIndexable4)classHandler; } /// public virtual BTree GetIndex(Transaction trans) { return _index; } public virtual bool IsVirtual() { return false; } public virtual bool IsPrimitive() { return _isPrimitive; } public virtual IBTreeRange Search(Transaction transaction, object value) { AssertHasIndex(); object transActionalValue = Handlers4.WrapWithTransactionContext(transaction, value , GetHandler()); BTreeNodeSearchResult lowerBound = SearchLowerBound(transaction, transActionalValue ); BTreeNodeSearchResult upperBound = SearchUpperBound(transaction, transActionalValue ); return lowerBound.CreateIncludingRange(upperBound); } private BTreeNodeSearchResult SearchUpperBound(Transaction transaction, object value ) { return SearchBound(transaction, int.MaxValue, value); } private BTreeNodeSearchResult SearchLowerBound(Transaction transaction, object value ) { return SearchBound(transaction, 0, value); } private BTreeNodeSearchResult SearchBound(Transaction transaction, int parentID, object keyPart) { return GetIndex(transaction).SearchLeaf(transaction, CreateFieldIndexKey(parentID , keyPart), SearchTarget.Lowest); } public virtual bool RebuildIndexForClass(LocalObjectContainer stream, ClassMetadata classMetadata) { // FIXME: BTree traversal over index here. long[] ids = classMetadata.GetIDs(); for (int i = 0; i < ids.Length; i++) { RebuildIndexForObject(stream, classMetadata, (int)ids[i]); } return ids.Length > 0; } /// protected virtual void RebuildIndexForObject(LocalObjectContainer stream, ClassMetadata classMetadata, int objectId) { StatefulBuffer writer = stream.ReadStatefulBufferById(stream.SystemTransaction(), objectId); if (writer != null) { RebuildIndexForWriter(stream, writer, objectId); } } protected virtual void RebuildIndexForWriter(LocalObjectContainer stream, StatefulBuffer writer, int objectId) { ObjectHeader oh = new ObjectHeader(stream, writer); object obj = ReadIndexEntryForRebuild(writer, oh); AddIndexEntry(stream.SystemTransaction(), objectId, obj); } private object ReadIndexEntryForRebuild(StatefulBuffer writer, ObjectHeader oh) { ClassMetadata classMetadata = oh.ClassMetadata(); if (classMetadata == null) { return DefaultValueForFieldType(); } ObjectIdContextImpl context = new ObjectIdContextImpl(writer.Transaction(), writer , oh, writer.GetID()); if (!classMetadata.SeekToField(context, this)) { return DefaultValueForFieldType(); } try { return ReadIndexEntry(context); } catch (CorruptionException exc) { throw new FieldIndexException(exc, this); } } private object DefaultValueForFieldType() { ITypeHandler4 handler = _fieldType.TypeHandler(); return (handler is PrimitiveHandler) ? ((PrimitiveHandler)handler).PrimitiveNull( ) : null; } public void DropIndex(LocalTransaction systemTrans) { if (_index == null) { return; } ObjectContainerBase stream = systemTrans.Container(); if (stream.ConfigImpl.MessageLevel() > Const4.None) { stream.Message("dropping index " + ToString()); } _index.Free(systemTrans); stream.SetDirtyInSystemTransaction(ContainingClass()); _index = null; } public override void DefragAspect(IDefragmentContext context) { if (!CanDefragment()) { throw new InvalidOperationException("Field '" + ToString() + "' cannot be defragmented at this time." ); } ITypeHandler4 correctTypeHandlerVersion = HandlerRegistry.CorrectHandlerVersion(context , GetHandler(), _fieldType); context.SlotFormat().DoWithSlotIndirection(context, correctTypeHandlerVersion, new _IClosure4_1029(context, correctTypeHandlerVersion)); } private sealed class _IClosure4_1029 : IClosure4 { public _IClosure4_1029(IDefragmentContext context, ITypeHandler4 correctTypeHandlerVersion ) { this.context = context; this.correctTypeHandlerVersion = correctTypeHandlerVersion; } public object Run() { context.Defragment(correctTypeHandlerVersion); return null; } private readonly IDefragmentContext context; private readonly ITypeHandler4 correctTypeHandlerVersion; } private bool CanDefragment() { if (Alive() || Updating()) { return true; } if (_fieldType == null || GetHandler() == null) { return false; } return !_fieldType.StateDead(); } public virtual void CreateIndex() { if (HasIndex()) { return; } LocalObjectContainer container = (LocalObjectContainer)Container(); if (container.ConfigImpl.MessageLevel() > Const4.None) { container.Message("creating index " + ToString()); } InitIndex(container.SystemTransaction()); container.SetDirtyInSystemTransaction(ContainingClass()); Reindex(container); } private void Reindex(LocalObjectContainer container) { ClassMetadata clazz = ContainingClass(); if (RebuildIndexForClass(container, clazz)) { container.SystemTransaction().Commit(); } } public override Db4objects.Db4o.Internal.Marshall.AspectType AspectType() { return Db4objects.Db4o.Internal.Marshall.AspectType.Field; } // overriden in VirtualFieldMetadata public override bool CanBeDisabled() { return true; } public virtual void DropIndex() { DropIndex((LocalTransaction)Container().SystemTransaction()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ICallbackInfoCollector.cs0000644000175000017500000000035511700531646031425 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { public interface ICallbackInfoCollector { void Added(int id); void Updated(int id); void Deleted(int id); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/0000755000175000017500000000000011700531646026704 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/DepthUtil.cs0000644000175000017500000000066711700531646031146 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Activation { public sealed class DepthUtil { public static int AdjustDepthToBorders(int depth) { int depthBorder = 2; // TODO when can min value actually occur? if (depth > int.MinValue && depth < depthBorder) { return depthBorder; } return depth; } private DepthUtil() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/FixedUpdateDepth.cs0000644000175000017500000000426211700531646032426 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public abstract class FixedUpdateDepth : IUpdateDepth { private int _depth; private bool _tpMode = false; public FixedUpdateDepth(int depth) { _depth = depth; } public virtual void TpMode(bool tpMode) { _tpMode = tpMode; } public virtual bool TpMode() { return _tpMode; } public virtual bool SufficientDepth() { return _depth > 0; } public virtual bool Negative() { // should never happen? return _depth < 0; } public override string ToString() { return GetType().FullName + ": " + _depth; } public virtual IUpdateDepth Adjust(ClassMetadata clazz) { if (clazz.CascadesOnDeleteOrUpdate()) { return AdjustDepthToBorders().Descend(); } return Descend(); } public virtual bool IsBroaderThan(Db4objects.Db4o.Internal.Activation.FixedUpdateDepth other) { return _depth > other._depth; } // TODO code duplication in fixed activation/update depth public virtual Db4objects.Db4o.Internal.Activation.FixedUpdateDepth AdjustDepthToBorders () { return ForDepth(DepthUtil.AdjustDepthToBorders(_depth)); } public virtual IUpdateDepth AdjustUpdateDepthForCascade(bool isCollection) { int minimumUpdateDepth = isCollection ? 2 : 1; if (_depth < minimumUpdateDepth) { return ForDepth(minimumUpdateDepth); } return this; } public virtual IUpdateDepth Descend() { return ForDepth(_depth - 1); } public override bool Equals(object other) { if (this == other) { return true; } if (other == null || GetType() != other.GetType()) { return false; } return _depth == ((Db4objects.Db4o.Internal.Activation.FixedUpdateDepth)other)._depth; } public override int GetHashCode() { return _depth; } protected abstract Db4objects.Db4o.Internal.Activation.FixedUpdateDepth ForDepth( int depth); public abstract bool CanSkip(ObjectReference arg1); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/IActivationDepth.cs0000644000175000017500000000076711700531646032444 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { /// Controls how deep an object graph is activated. /// Controls how deep an object graph is activated. public interface IActivationDepth { ActivationMode Mode(); bool RequiresActivation(); IActivationDepth Descend(ClassMetadata metadata); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/TPFixedUpdateDepth.cs0000644000175000017500000000153511700531646032672 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Internal.Activation { public class TPFixedUpdateDepth : FixedUpdateDepth { private IModifiedObjectQuery _query; public TPFixedUpdateDepth(int depth, IModifiedObjectQuery query) : base(depth) { _query = query; } public override bool CanSkip(ObjectReference @ref) { ClassMetadata clazz = @ref.ClassMetadata(); return clazz.Reflector().ForClass(typeof(IActivatable)).IsAssignableFrom(clazz.ClassReflector ()) && !_query.IsModified(@ref.GetObject()); } protected override FixedUpdateDepth ForDepth(int depth) { return new Db4objects.Db4o.Internal.Activation.TPFixedUpdateDepth(depth, _query); } } } TPUnspecifiedUpdateDepth.cs0000644000175000017500000000147511700531646034015 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Internal.Activation { public class TPUnspecifiedUpdateDepth : UnspecifiedUpdateDepth { private readonly IModifiedObjectQuery _query; internal TPUnspecifiedUpdateDepth(IModifiedObjectQuery query) { _query = query; } public override bool CanSkip(ObjectReference @ref) { ClassMetadata clazz = @ref.ClassMetadata(); return clazz.Reflector().ForClass(typeof(IActivatable)).IsAssignableFrom(clazz.ClassReflector ()) && !_query.IsModified(@ref.GetObject()); } protected override FixedUpdateDepth ForDepth(int depth) { return new TPFixedUpdateDepth(depth, _query); } } } DescendingActivationDepth.cs0000644000175000017500000000125711700531646034233 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class DescendingActivationDepth : ActivationDepthImpl { private readonly IActivationDepthProvider _provider; public DescendingActivationDepth(IActivationDepthProvider provider, ActivationMode mode) : base(mode) { _provider = provider; } public override IActivationDepth Descend(ClassMetadata metadata) { return _provider.ActivationDepthFor(metadata, _mode); } public override bool RequiresActivation() { return true; } } } NonDescendingActivationDepth.cs0000644000175000017500000000120511700531646034677 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { /// Transparent Activation strategy. /// Transparent Activation strategy. public class NonDescendingActivationDepth : ActivationDepthImpl { public NonDescendingActivationDepth(ActivationMode mode) : base(mode) { } public override IActivationDepth Descend(ClassMetadata metadata) { return this; } public override bool RequiresActivation() { return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/TPUpdateDepthProvider.cs0000644000175000017500000000100511700531646033415 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class TPUpdateDepthProvider : IUpdateDepthProvider { public virtual FixedUpdateDepth ForDepth(int depth) { return new TPFixedUpdateDepth(depth, NullModifiedObjectQuery.Instance); } public virtual UnspecifiedUpdateDepth Unspecified(IModifiedObjectQuery query) { return new TPUnspecifiedUpdateDepth(query); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/UnknownActivationDepth.cs0000644000175000017500000000140111700531646033675 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class UnknownActivationDepth : IActivationDepth { public static readonly IActivationDepth Instance = new Db4objects.Db4o.Internal.Activation.UnknownActivationDepth (); private UnknownActivationDepth() { } public virtual ActivationMode Mode() { throw new InvalidOperationException(); } public virtual IActivationDepth Descend(ClassMetadata metadata) { throw new InvalidOperationException(); } public virtual bool RequiresActivation() { throw new InvalidOperationException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/UnspecifiedUpdateDepth.cs0000644000175000017500000000207711700531646033627 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public abstract class UnspecifiedUpdateDepth : IUpdateDepth { protected UnspecifiedUpdateDepth() { } public virtual bool SufficientDepth() { return true; } public virtual bool Negative() { return true; } public override string ToString() { return GetType().FullName; } public virtual IUpdateDepth Adjust(ClassMetadata clazz) { FixedUpdateDepth depth = (FixedUpdateDepth)ForDepth(clazz.UpdateDepthFromConfig() ).Descend(); return depth; } public virtual IUpdateDepth AdjustUpdateDepthForCascade(bool isCollection) { throw new InvalidOperationException(); } public virtual IUpdateDepth Descend() { throw new InvalidOperationException(); } protected abstract FixedUpdateDepth ForDepth(int depth); public abstract bool CanSkip(ObjectReference arg1); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/LegacyActivationDepth.cs0000644000175000017500000000341211700531646033446 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { /// /// Activates an object graph to a specific depth respecting any /// activation configuration settings that might be in effect. /// /// /// Activates an object graph to a specific depth respecting any /// activation configuration settings that might be in effect. /// public class LegacyActivationDepth : ActivationDepthImpl { private readonly int _depth; public LegacyActivationDepth(int depth) : this(depth, ActivationMode.Activate) { } public LegacyActivationDepth(int depth, ActivationMode mode) : base(mode) { _depth = depth; } public override IActivationDepth Descend(ClassMetadata metadata) { if (null == metadata) { return new Db4objects.Db4o.Internal.Activation.LegacyActivationDepth(_depth - 1, _mode); } return new Db4objects.Db4o.Internal.Activation.LegacyActivationDepth(DescendDepth (metadata), _mode); } private int DescendDepth(ClassMetadata metadata) { int depth = ConfiguredActivationDepth(metadata) - 1; if (metadata.IsStruct()) { // We also have to instantiate structs completely every time. return Math.Max(1, depth); } return depth; } private int ConfiguredActivationDepth(ClassMetadata metadata) { Config4Class config = metadata.ConfigOrAncestorConfig(); if (config != null && _mode.IsActivate()) { return config.AdjustActivationDepth(_depth); } return _depth; } public override bool RequiresActivation() { return _depth > 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/ActivatableBase.cs0000644000175000017500000000163411700531646032251 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Internal.Activation { public abstract class ActivatableBase : IActivatable { [System.NonSerialized] private IActivator _activator; public virtual void Bind(IActivator activator) { if (_activator == activator) { return; } if (activator != null && _activator != null) { throw new InvalidOperationException(); } _activator = activator; } public virtual void Activate(ActivationPurpose purpose) { if (_activator == null) { return; } _activator.Activate(purpose); } protected virtual void ActivateForRead() { Activate(ActivationPurpose.Read); } protected virtual void ActivateForWrite() { Activate(ActivationPurpose.Write); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/FixedActivationDepth.cs0000644000175000017500000000261011700531646033300 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { /// /// Activates a fixed depth of the object graph regardless of /// any existing activation depth configuration settings. /// /// /// Activates a fixed depth of the object graph regardless of /// any existing activation depth configuration settings. /// public class FixedActivationDepth : ActivationDepthImpl { private readonly int _depth; public FixedActivationDepth(int depth, ActivationMode mode) : base(mode) { _depth = depth; } public FixedActivationDepth(int depth) : this(depth, ActivationMode.Activate) { } public override bool RequiresActivation() { return _depth > 0; } public override IActivationDepth Descend(ClassMetadata metadata) { if (_depth < 1) { return this; } return new Db4objects.Db4o.Internal.Activation.FixedActivationDepth(_depth - 1, _mode ); } // TODO code duplication in fixed activation/update depth public virtual Db4objects.Db4o.Internal.Activation.FixedActivationDepth AdjustDepthToBorders () { return new Db4objects.Db4o.Internal.Activation.FixedActivationDepth(DepthUtil.AdjustDepthToBorders (_depth)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/IUpdateDepthProvider.cs0000644000175000017500000000050511700531646033266 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public interface IUpdateDepthProvider { UnspecifiedUpdateDepth Unspecified(IModifiedObjectQuery query); FixedUpdateDepth ForDepth(int depth); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/IUpdateDepth.cs0000644000175000017500000000073011700531646031553 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public interface IUpdateDepth { bool SufficientDepth(); bool Negative(); IUpdateDepth Adjust(ClassMetadata clazz); IUpdateDepth AdjustUpdateDepthForCascade(bool isCollection); IUpdateDepth Descend(); bool CanSkip(ObjectReference @ref); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/ActivationContext4.cs0000644000175000017500000000600611700531646032767 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Activation { /// public class ActivationContext4 : IActivationContext { private readonly Db4objects.Db4o.Internal.Transaction _transaction; private readonly object _targetObject; private readonly IActivationDepth _depth; public ActivationContext4(Db4objects.Db4o.Internal.Transaction transaction, object obj, IActivationDepth depth) { if (null == obj) { throw new ArgumentNullException(); } _transaction = transaction; _targetObject = obj; _depth = depth; } public virtual void CascadeActivationToTarget() { IActivationContext context = ClassMetadata().DescendOnCascadingActivation() ? Descend () : this; CascadeActivation(context); } public virtual void CascadeActivationToChild(object obj) { if (obj == null) { return; } IActivationContext cascadingContext = ForObject(obj); Db4objects.Db4o.Internal.ClassMetadata classMetadata = cascadingContext.ClassMetadata (); if (classMetadata == null || !classMetadata.HasIdentity()) { return; } CascadeActivation(cascadingContext.Descend()); } private void CascadeActivation(IActivationContext context) { IActivationDepth depth = context.Depth(); if (!depth.RequiresActivation()) { return; } if (depth.Mode().IsDeactivate()) { Container().StillToDeactivate(_transaction, context.TargetObject(), depth, false); } else { // FIXME: [TA] do we really need to check for isValueType here? Db4objects.Db4o.Internal.ClassMetadata classMetadata = context.ClassMetadata(); if (classMetadata.IsStruct()) { classMetadata.CascadeActivation(context); } else { Container().StillToActivate(context); } } } public virtual ObjectContainerBase Container() { return _transaction.Container(); } public virtual object TargetObject() { return _targetObject; } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return Container().ClassMetadataForObject(_targetObject); } public virtual IActivationDepth Depth() { return _depth; } public virtual IObjectContainer ObjectContainer() { return Container(); } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return _transaction; } public virtual IActivationContext ForObject(object newTargetObject) { return new Db4objects.Db4o.Internal.Activation.ActivationContext4(Transaction(), newTargetObject, Depth()); } public virtual IActivationContext Descend() { return new Db4objects.Db4o.Internal.Activation.ActivationContext4(Transaction(), TargetObject(), Depth().Descend(ClassMetadata())); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/IFixedDepth.cs0000644000175000017500000000036511700531646031374 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public interface IFixedDepth { IFixedDepth AdjustDepthToBorders(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/FullActivationDepth.cs0000644000175000017500000000127611700531646033152 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { /// Activates the full object graph. /// Activates the full object graph. public class FullActivationDepth : ActivationDepthImpl { public FullActivationDepth(ActivationMode mode) : base(mode) { } public FullActivationDepth() : this(ActivationMode.Activate) { } public override IActivationDepth Descend(ClassMetadata metadata) { return this; } public override bool RequiresActivation() { return true; } } } IActivationDepthProvider.cs0000644000175000017500000000263311700531646034072 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { /// Factory for ActivationDepth strategies. /// Factory for ActivationDepth strategies. public interface IActivationDepthProvider { /// Returns an ActivationDepth suitable for the specified class and activation mode. /// /// Returns an ActivationDepth suitable for the specified class and activation mode. /// /// root class that's being activated /// activation mode /// an appropriate ActivationDepth for the class and activation mode IActivationDepth ActivationDepthFor(ClassMetadata classMetadata, ActivationMode mode ); /// Returns an ActivationDepth that will activate at most *depth* levels. /// /// Returns an ActivationDepth that will activate at most *depth* levels. /// A special case is Integer.MAX_VALUE (int.MaxValue for .net) for which a /// FullActivationDepth object must be returned. /// /// /// /// IActivationDepth ActivationDepth(int depth, ActivationMode mode); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/LegacyFixedUpdateDepth.cs0000644000175000017500000000107211700531646033547 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class LegacyFixedUpdateDepth : FixedUpdateDepth { public LegacyFixedUpdateDepth(int depth) : base(depth) { } public override bool CanSkip(ObjectReference @ref) { return false; } protected override FixedUpdateDepth ForDepth(int depth) { return new Db4objects.Db4o.Internal.Activation.LegacyFixedUpdateDepth(depth); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/ActivationMode.cs0000644000175000017500000000310711700531646032142 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Activation { public sealed class ActivationMode { public static readonly Db4objects.Db4o.Internal.Activation.ActivationMode Activate = new Db4objects.Db4o.Internal.Activation.ActivationMode(); public static readonly Db4objects.Db4o.Internal.Activation.ActivationMode Deactivate = new Db4objects.Db4o.Internal.Activation.ActivationMode(); public static readonly Db4objects.Db4o.Internal.Activation.ActivationMode Peek = new Db4objects.Db4o.Internal.Activation.ActivationMode(); public static readonly Db4objects.Db4o.Internal.Activation.ActivationMode Prefetch = new Db4objects.Db4o.Internal.Activation.ActivationMode(); public static readonly Db4objects.Db4o.Internal.Activation.ActivationMode Refresh = new Db4objects.Db4o.Internal.Activation.ActivationMode(); private ActivationMode() { } public override string ToString() { if (IsActivate()) { return "ACTIVATE"; } if (IsDeactivate()) { return "DEACTIVATE"; } if (IsPrefetch()) { return "PREFETCH"; } if (IsRefresh()) { return "REFRESH"; } return "PEEK"; } public bool IsDeactivate() { return this == Deactivate; } public bool IsActivate() { return this == Activate; } public bool IsPeek() { return this == Peek; } public bool IsPrefetch() { return this == Prefetch; } public bool IsRefresh() { return this == Refresh; } } } ITransparentActivationDepthProvider.cs0000644000175000017500000000113711700531646036312 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Internal.Activation { /// public interface ITransparentActivationDepthProvider : IActivationDepthProvider { void EnableTransparentPersistenceSupportFor(IInternalObjectContainer container, IRollbackStrategy withRollbackStrategy); void AddModified(object @object, Transaction inTransaction); void RemoveModified(object @object, Transaction inTransaction); } } NullModifiedObjectQuery.cs0000644000175000017500000000075511700531646033713 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class NullModifiedObjectQuery : IModifiedObjectQuery { public static readonly IModifiedObjectQuery Instance = new Db4objects.Db4o.Internal.Activation.NullModifiedObjectQuery (); private NullModifiedObjectQuery() { } public virtual bool IsModified(object @ref) { return false; } } } LegacyUnspecifiedUpdateDepth.cs0000644000175000017500000000131411700531646034666 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class LegacyUnspecifiedUpdateDepth : UnspecifiedUpdateDepth { public static readonly Db4objects.Db4o.Internal.Activation.LegacyUnspecifiedUpdateDepth Instance = new Db4objects.Db4o.Internal.Activation.LegacyUnspecifiedUpdateDepth (); private LegacyUnspecifiedUpdateDepth() { } public override bool CanSkip(ObjectReference @ref) { return false; } protected override FixedUpdateDepth ForDepth(int depth) { return new LegacyFixedUpdateDepth(depth); } } } LegacyUpdateDepthProvider.cs0000644000175000017500000000075511700531646034232 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class LegacyUpdateDepthProvider : IUpdateDepthProvider { public virtual FixedUpdateDepth ForDepth(int depth) { return new LegacyFixedUpdateDepth(depth); } public virtual UnspecifiedUpdateDepth Unspecified(IModifiedObjectQuery query) { return LegacyUnspecifiedUpdateDepth.Instance; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/ActivationDepthImpl.cs0000644000175000017500000000111011700531646033134 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public abstract class ActivationDepthImpl : IActivationDepth { protected readonly ActivationMode _mode; protected ActivationDepthImpl(ActivationMode mode) { _mode = mode; } public virtual ActivationMode Mode() { return _mode; } public abstract IActivationDepth Descend(ClassMetadata arg1); public abstract bool RequiresActivation(); } } LegacyActivationDepthProvider.cs0000644000175000017500000000226411700531646035106 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Internal.Activation { public class LegacyActivationDepthProvider : IActivationDepthProvider { public static readonly IActivationDepthProvider Instance = new LegacyActivationDepthProvider (); public virtual IActivationDepth ActivationDepthFor(ClassMetadata classMetadata, ActivationMode mode) { if (mode.IsPrefetch()) { return new LegacyActivationDepth(1, mode); } int globalLegacyActivationDepth = ConfigImpl(classMetadata).ActivationDepth(); Config4Class config = classMetadata.ConfigOrAncestorConfig(); int defaultDepth = null == config ? globalLegacyActivationDepth : config.AdjustActivationDepth (globalLegacyActivationDepth); return new LegacyActivationDepth(defaultDepth, mode); } public virtual IActivationDepth ActivationDepth(int depth, ActivationMode mode) { return new LegacyActivationDepth(depth, mode); } private Config4Impl ConfigImpl(ClassMetadata classMetadata) { return classMetadata.Container().ConfigImpl; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/IModifiedObjectQuery.cs0000644000175000017500000000031111700531646033234 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Activation { public interface IModifiedObjectQuery { bool IsModified(object obj); } } TransparentActivationDepthProviderImpl.cs0000644000175000017500000001630711700531646037030 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Activation/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Events; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Internal.Activation { public class TransparentActivationDepthProviderImpl : IActivationDepthProvider, ITransparentActivationDepthProvider { public virtual IActivationDepth ActivationDepth(int depth, ActivationMode mode) { if (int.MaxValue == depth) { return new FullActivationDepth(mode); } return new FixedActivationDepth(depth, mode); } public virtual IActivationDepth ActivationDepthFor(ClassMetadata classMetadata, ActivationMode mode) { if (IsTAAware(classMetadata)) { return new NonDescendingActivationDepth(mode); } if (mode.IsPrefetch()) { return new FixedActivationDepth(1, mode); } return new DescendingActivationDepth(this, mode); } private bool IsTAAware(ClassMetadata classMetadata) { GenericReflector reflector = classMetadata.Reflector(); return reflector.ForClass(typeof(IActivatable)).IsAssignableFrom(classMetadata.ClassReflector ()); } private IRollbackStrategy _rollbackStrategy; public bool _transparentPersistenceIsEnabled; public virtual void EnableTransparentPersistenceSupportFor(IInternalObjectContainer container, IRollbackStrategy rollbackStrategy) { FlushOnQueryStarted(container); _rollbackStrategy = rollbackStrategy; _transparentPersistenceIsEnabled = true; } private void FlushOnQueryStarted(IInternalObjectContainer container) { IEventRegistry registry = EventRegistryFactory.ForObjectContainer(container); registry.QueryStarted += new System.EventHandler (new _IEventListener4_46(this).OnEvent); } private sealed class _IEventListener4_46 { public _IEventListener4_46(TransparentActivationDepthProviderImpl _enclosing) { this._enclosing = _enclosing; } public void OnEvent(object sender, Db4objects.Db4o.Events.QueryEventArgs args) { this._enclosing.ObjectsModifiedIn(this._enclosing.TransactionFrom(args)).Flush(); } private readonly TransparentActivationDepthProviderImpl _enclosing; } protected virtual Transaction TransactionFrom(EventArgs args) { return (Transaction)((TransactionalEventArgs)args).Transaction(); } public virtual void AddModified(object @object, Transaction transaction) { if (!_transparentPersistenceIsEnabled) { return; } ObjectsModifiedIn(transaction).Add(@object); } public virtual void RemoveModified(object @object, Transaction transaction) { if (!_transparentPersistenceIsEnabled) { return; } ObjectsModifiedIn(transaction).Remove(@object); } private sealed class _TransactionLocal_73 : TransactionLocal { public _TransactionLocal_73(TransparentActivationDepthProviderImpl _enclosing) { this._enclosing = _enclosing; } public override object InitialValueFor(Transaction transaction) { TransparentActivationDepthProviderImpl.ObjectsModifiedInTransaction objectsModifiedInTransaction = new TransparentActivationDepthProviderImpl.ObjectsModifiedInTransaction(transaction ); transaction.AddTransactionListener(new _ITransactionListener_77(this, objectsModifiedInTransaction )); return objectsModifiedInTransaction; } private sealed class _ITransactionListener_77 : ITransactionListener { public _ITransactionListener_77(_TransactionLocal_73 _enclosing, TransparentActivationDepthProviderImpl.ObjectsModifiedInTransaction objectsModifiedInTransaction) { this._enclosing = _enclosing; this.objectsModifiedInTransaction = objectsModifiedInTransaction; } public void PostRollback() { objectsModifiedInTransaction.Rollback(this._enclosing._enclosing._rollbackStrategy ); } public void PreCommit() { objectsModifiedInTransaction.Flush(); } private readonly _TransactionLocal_73 _enclosing; private readonly TransparentActivationDepthProviderImpl.ObjectsModifiedInTransaction objectsModifiedInTransaction; } private readonly TransparentActivationDepthProviderImpl _enclosing; } private readonly TransactionLocal _objectsModifiedInTransaction; private TransparentActivationDepthProviderImpl.ObjectsModifiedInTransaction ObjectsModifiedIn (Transaction transaction) { return ((TransparentActivationDepthProviderImpl.ObjectsModifiedInTransaction)transaction .Get(_objectsModifiedInTransaction).value); } private sealed class ObjectsModifiedInTransaction { private readonly IdentitySet4 _removedAfterModified = new IdentitySet4(); private readonly IdentitySet4 _modified = new IdentitySet4(); private readonly Transaction _transaction; public ObjectsModifiedInTransaction(Transaction transaction) { _transaction = transaction; } public void Add(object @object) { if (Contains(@object)) { return; } _modified.Add(@object); } public void Remove(object @object) { if (!Contains(@object)) { return; } _modified.Remove(@object); _removedAfterModified.Add(@object); } private bool Contains(object @object) { return _modified.Contains(@object); } public void Flush() { StoreModifiedObjects(); _modified.Clear(); } private void StoreModifiedObjects() { ObjectContainerBase container = _transaction.Container(); container.StoreAll(_transaction, _modified.ValuesIterator(), container.UpdateDepthProvider ().Unspecified(new _IModifiedObjectQuery_132(this))); _transaction.ProcessDeletes(); } private sealed class _IModifiedObjectQuery_132 : IModifiedObjectQuery { public _IModifiedObjectQuery_132(ObjectsModifiedInTransaction _enclosing) { this._enclosing = _enclosing; } public bool IsModified(object obj) { return this._enclosing.Contains(obj); } private readonly ObjectsModifiedInTransaction _enclosing; } public void Rollback(IRollbackStrategy rollbackStrategy) { ApplyRollbackStrategy(rollbackStrategy); _modified.Clear(); } private void ApplyRollbackStrategy(IRollbackStrategy rollbackStrategy) { if (null == rollbackStrategy) { return; } ApplyRollbackStrategy(rollbackStrategy, _modified.ValuesIterator()); ApplyRollbackStrategy(rollbackStrategy, _removedAfterModified.ValuesIterator()); } private void ApplyRollbackStrategy(IRollbackStrategy rollbackStrategy, IEnumerator values) { IObjectContainer objectContainer = _transaction.ObjectContainer(); while (values.MoveNext()) { rollbackStrategy.Rollback(objectContainer, values.Current); } } } public TransparentActivationDepthProviderImpl() { _objectsModifiedInTransaction = new _TransactionLocal_73(this); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectID.cs0000644000175000017500000000324611700531646026562 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal { /// public class ObjectID { public readonly int _id; private sealed class _ObjectID_15 : Db4objects.Db4o.Internal.ObjectID { public _ObjectID_15(int baseArg1) : base(baseArg1) { } public override string ToString() { return "ObjectID.IS_NULL"; } } public static readonly Db4objects.Db4o.Internal.ObjectID IsNull = new _ObjectID_15 (-1); private sealed class _ObjectID_21 : Db4objects.Db4o.Internal.ObjectID { public _ObjectID_21(int baseArg1) : base(baseArg1) { } public override string ToString() { return "ObjectID.NOT_POSSIBLE"; } } public static readonly Db4objects.Db4o.Internal.ObjectID NotPossible = new _ObjectID_21 (-2); private sealed class _ObjectID_27 : Db4objects.Db4o.Internal.ObjectID { public _ObjectID_27(int baseArg1) : base(baseArg1) { } public override string ToString() { return "ObjectID.IGNORE"; } } public static readonly Db4objects.Db4o.Internal.ObjectID Ignore = new _ObjectID_27 (-3); public ObjectID(int id) { _id = id; } public virtual bool IsValid() { return _id > 0; } public static Db4objects.Db4o.Internal.ObjectID Read(IInternalReadContext context ) { int id = context.ReadInt(); return id == 0 ? Db4objects.Db4o.Internal.ObjectID.IsNull : new Db4objects.Db4o.Internal.ObjectID (id); } public override string ToString() { return "ObjectID(" + _id + ")"; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/BlobImpl.cs0000644000175000017500000001636411700531646026644 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Types; using Sharpen; using Sharpen.IO; namespace Db4objects.Db4o.Internal { /// /// Transfer of blobs to and from the db4o system, /// if users use the Blob Db4oType. /// /// /// Transfer of blobs to and from the db4o system, /// if users use the Blob Db4oType. /// /// com.db4o.internal.blobs /// public class BlobImpl : IBlob, System.ICloneable, IDb4oTypeImpl { public const int CopybufferLength = 4096; public string fileName; public string i_ext; [System.NonSerialized] private Sharpen.IO.File i_file; [System.NonSerialized] private IBlobStatus i_getStatusFrom; public int i_length; [System.NonSerialized] private double i_status = Status.Unused; [System.NonSerialized] private ObjectContainerBase i_stream; [System.NonSerialized] private Transaction i_trans; /// public virtual int AdjustReadDepth(int depth) { return 1; } private string CheckExt(Sharpen.IO.File file) { string name = file.GetName(); int pos = name.LastIndexOf("."); if (pos > 0) { i_ext = Sharpen.Runtime.Substring(name, pos); return Sharpen.Runtime.Substring(name, 0, pos); } i_ext = string.Empty; return name; } /// private static void Copy(Sharpen.IO.File from, Sharpen.IO.File to) { System.IO.File.Copy(from, to); } public virtual object CreateDefault(Transaction a_trans) { BlobImpl bi = null; bi = (BlobImpl)this.MemberwiseClone(); bi.SetTrans(a_trans); return bi; } /// public virtual FileInputStream GetClientInputStream() { return new FileInputStream(i_file); } /// public virtual FileOutputStream GetClientOutputStream() { return new FileOutputStream(i_file); } public virtual string GetFileName() { return fileName; } public virtual int GetLength() { return i_length; } public virtual double GetStatus() { if (i_status == Status.Processing && i_getStatusFrom != null) { return i_getStatusFrom.GetStatus(); } if (i_status == Status.Unused) { if (i_length > 0) { i_status = Status.Available; } } return i_status; } public virtual void GetStatusFrom(IBlobStatus from) { i_getStatusFrom = from; } public virtual bool HasClassIndex() { return false; } /// public virtual void ReadFrom(Sharpen.IO.File file) { if (!file.Exists()) { throw new IOException(Db4objects.Db4o.Internal.Messages.Get(41, file.GetAbsolutePath ())); } i_length = (int)file.Length(); CheckExt(file); if (i_stream.IsClient) { i_file = file; ((IBlobTransport)i_stream).ReadBlobFrom(i_trans, this); } else { ReadLocal(file); } } /// public virtual void ReadLocal(Sharpen.IO.File file) { bool copied = false; if (fileName == null) { Sharpen.IO.File newFile = new Sharpen.IO.File(ServerPath(), file.GetName()); if (!newFile.Exists()) { Copy(file, newFile); copied = true; fileName = newFile.GetName(); } } if (!copied) { Copy(file, ServerFile(CheckExt(file), true)); } lock (i_stream.Lock()) { i_stream.StoreInternal(i_trans, this, false); } i_status = Status.Completed; } /// public virtual Sharpen.IO.File ServerFile(string promptName, bool writeToServer) { lock (i_stream.Lock()) { i_stream.Activate(i_trans, this, new FixedActivationDepth(2)); } string path = ServerPath(); i_stream.ConfigImpl.EnsureDirExists(path); if (writeToServer) { if (fileName == null) { if (promptName != null) { fileName = promptName; } else { fileName = "b_" + Runtime.CurrentTimeMillis(); } string tryPath = fileName + i_ext; int i = 0; while (new Sharpen.IO.File(path, tryPath).Exists()) { tryPath = fileName + "_" + i++ + i_ext; if (i == 99) { // should never happen i_status = Status.Error; throw new IOException(Db4objects.Db4o.Internal.Messages.Get(40)); } } fileName = tryPath; lock (i_stream.Lock()) { i_stream.StoreInternal(i_trans, this, false); } } } else { if (fileName == null) { throw new IOException(Db4objects.Db4o.Internal.Messages.Get(38)); } } string lastTryPath = path + Sharpen.IO.File.separator + fileName; if (!writeToServer) { if (!(new Sharpen.IO.File(lastTryPath).Exists())) { throw new IOException(Db4objects.Db4o.Internal.Messages.Get(39)); } } return new Sharpen.IO.File(lastTryPath); } /// private string ServerPath() { string path = i_stream.ConfigImpl.BlobPath(); if (path == null) { path = "blobs"; } i_stream.ConfigImpl.EnsureDirExists(path); return path; } public virtual void SetStatus(double status) { i_status = status; } public virtual void SetTrans(Transaction a_trans) { i_trans = a_trans; i_stream = a_trans.Container(); } /// public virtual void WriteLocal(Sharpen.IO.File file) { Copy(ServerFile(null, false), file); i_status = Status.Completed; } /// public virtual void WriteTo(Sharpen.IO.File file) { if (GetStatus() == Status.Unused) { throw new IOException(Db4objects.Db4o.Internal.Messages.Get(43)); } if (i_stream.IsClient) { i_file = file; i_status = Status.Queued; ((IBlobTransport)i_stream).WriteBlobTo(i_trans, this); } else { WriteLocal(file); } } public virtual void SetObjectReference(ObjectReference objectReference) { } // not necessary /// public virtual void DeleteFile() { if (GetStatus() == Status.Unused) { throw new IOException(Db4objects.Db4o.Internal.Messages.Get(43)); } if (i_stream.IsClient) { ((IBlobTransport)i_stream).DeleteBlobFile(i_trans, this); } else { ServerFile(null, false).Delete(); } fileName = null; i_ext = null; i_length = 0; SetStatus(Status.Unused); lock (i_stream.Lock()) { i_stream.StoreInternal(i_trans, this, false); } } object System.ICloneable.Clone() { return MemberwiseClone(); } } } #endif // !SILVERLIGHT smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Transactionlog/0000755000175000017500000000000011700531646027572 5ustar00meebeymeebey00000000000000TransactionLogHandler.cs0000644000175000017500000000546111700531646034275 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Transactionlog/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal.Transactionlog { /// public abstract class TransactionLogHandler { protected readonly LocalObjectContainer _container; protected TransactionLogHandler(LocalObjectContainer container) { _container = container; } protected virtual LocalObjectContainer LocalContainer() { return _container; } protected void FlushDatabaseFile() { _container.SyncFiles(); } protected void AppendSlotChanges(ByteArrayBuffer writer, IVisitable slotChangeVisitable ) { slotChangeVisitable.Accept(new _IVisitor4_30(writer)); } private sealed class _IVisitor4_30 : IVisitor4 { public _IVisitor4_30(ByteArrayBuffer writer) { this.writer = writer; } public void Visit(object obj) { ((SlotChange)obj).Write(writer); } private readonly ByteArrayBuffer writer; } protected virtual bool WriteSlots(IVisitable slotChangeTree) { BooleanByRef ret = new BooleanByRef(); slotChangeTree.Accept(new _IVisitor4_39(this, ret)); return ret.value; } private sealed class _IVisitor4_39 : IVisitor4 { public _IVisitor4_39(TransactionLogHandler _enclosing, BooleanByRef ret) { this._enclosing = _enclosing; this.ret = ret; } public void Visit(object obj) { ((SlotChange)obj).WritePointer(this._enclosing._container); ret.value = true; } private readonly TransactionLogHandler _enclosing; private readonly BooleanByRef ret; } protected int TransactionLogSlotLength(int slotChangeCount) { // slotchanges * 3 for ID, address, length // 2 ints for slotlength and count return ((slotChangeCount * 3) + 2) * Const4.IntLength; } public abstract Slot AllocateSlot(bool append, int slotChangeCount); public abstract void ApplySlotChanges(IVisitable slotChangeTree, int slotChangeCount , Slot reservedSlot); public abstract void CompleteInterruptedTransaction(int transactionId1, int transactionId2 ); public abstract void Close(); protected virtual void ReadWriteSlotChanges(ByteArrayBuffer buffer) { LockedTree slotChanges = new LockedTree(); slotChanges.Read(buffer, new SlotChange(0)); if (WriteSlots(new _IVisitable_65(slotChanges))) { FlushDatabaseFile(); } } private sealed class _IVisitable_65 : IVisitable { public _IVisitable_65(LockedTree slotChanges) { this.slotChanges = slotChanges; } public void Accept(IVisitor4 visitor) { slotChanges.TraverseMutable(visitor); } private readonly LockedTree slotChanges; } } } EmbeddedTransactionLogHandler.cs0000644000175000017500000000622711700531646035710 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Transactionlog/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Internal.Transactionlog; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Transactionlog { /// public class EmbeddedTransactionLogHandler : TransactionLogHandler { public EmbeddedTransactionLogHandler(LocalObjectContainer container) : base(container ) { } public override void CompleteInterruptedTransaction(int transactionId1, int transactionId2 ) { if (transactionId1 <= 0 || transactionId1 != transactionId2) { return; } StatefulBuffer bytes = new StatefulBuffer(_container.SystemTransaction(), transactionId1 , Const4.IntLength); bytes.Read(); int length = bytes.ReadInt(); if (length > 0) { bytes = new StatefulBuffer(_container.SystemTransaction(), transactionId1, length ); bytes.Read(); bytes.IncrementOffset(Const4.IntLength); ReadWriteSlotChanges(bytes); } _container.WriteTransactionPointer(0); FlushDatabaseFile(); } public override Slot AllocateSlot(bool appendToFile, int slotChangeCount) { int transactionLogByteCount = TransactionLogSlotLength(slotChangeCount); IFreespaceManager freespaceManager = _container.FreespaceManager(); if (!appendToFile && freespaceManager != null) { Slot slot = freespaceManager.AllocateTransactionLogSlot(transactionLogByteCount); if (slot != null) { return slot; } } return _container.AppendBytes(transactionLogByteCount); } private void FreeSlot(Slot slot) { if (slot == null) { return; } if (_container.FreespaceManager() == null) { return; } _container.FreespaceManager().FreeSafeSlot(slot); } public override void ApplySlotChanges(IVisitable slotChangeTree, int slotChangeCount , Slot reservedSlot) { if (slotChangeCount > 0) { Slot transactionLogSlot = SlotLongEnoughForLog(slotChangeCount, reservedSlot) ? reservedSlot : AllocateSlot(true, slotChangeCount); StatefulBuffer buffer = new StatefulBuffer(_container.SystemTransaction(), transactionLogSlot ); buffer.WriteInt(transactionLogSlot.Length()); buffer.WriteInt(slotChangeCount); AppendSlotChanges(buffer, slotChangeTree); buffer.Write(); IRunnable commitHook = _container.CommitHook(); FlushDatabaseFile(); _container.WriteTransactionPointer(transactionLogSlot.Address()); FlushDatabaseFile(); if (WriteSlots(slotChangeTree)) { FlushDatabaseFile(); } _container.WriteTransactionPointer(0); commitHook.Run(); FlushDatabaseFile(); if (transactionLogSlot != reservedSlot) { FreeSlot(transactionLogSlot); } } FreeSlot(reservedSlot); } private bool SlotLongEnoughForLog(int slotChangeCount, Slot slot) { return slot != null && slot.Length() >= TransactionLogSlotLength(slotChangeCount); } public override void Close() { } // do nothing } } FileBasedTransactionLogHandler.cs0000644000175000017500000001132011700531646036023 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Transactionlog/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Foundation.IO; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Internal.Transactionlog; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Transactionlog { /// public class FileBasedTransactionLogHandler : TransactionLogHandler { internal const int LockInt = int.MaxValue - 1; private IBin _lockFile; private IBin _logFile; private readonly string _fileName; public FileBasedTransactionLogHandler(LocalObjectContainer container, string fileName ) : base(container) { _fileName = fileName; } public static string LogFileName(string fileName) { return fileName + ".log"; } public static string LockFileName(string fileName) { return fileName + ".lock"; } private IBin OpenBin(string fileName) { return new FileStorage().Open(new BinConfiguration(fileName, _container.Config(). LockFile(), 0, false)); } public override void CompleteInterruptedTransaction(int transactionId1, int transactionId2 ) { if (!System.IO.File.Exists(LockFileName(_fileName))) { return; } if (!LockFileSignalsInterruptedTransaction()) { return; } ByteArrayBuffer buffer = new ByteArrayBuffer(Const4.IntLength); OpenLogFile(); Read(_logFile, buffer); int length = buffer.ReadInt(); if (length > 0) { buffer = new ByteArrayBuffer(length); Read(_logFile, buffer); buffer.IncrementOffset(Const4.IntLength); ReadWriteSlotChanges(buffer); } DeleteLockFile(); CloseLogFile(); DeleteLogFile(); } private bool LockFileSignalsInterruptedTransaction() { OpenLockFile(); ByteArrayBuffer buffer = NewLockFileBuffer(); Read(_lockFile, buffer); for (int i = 0; i < 2; i++) { int checkInt = buffer.ReadInt(); if (checkInt != LockInt) { CloseLockFile(); return false; } } CloseLockFile(); return true; } public override void Close() { if (!LogsOpened()) { return; } CloseLockFile(); CloseLogFile(); DeleteLockFile(); DeleteLogFile(); } private void CloseLockFile() { SyncAndClose(_lockFile); _lockFile = null; } private void SyncAndClose(IBin bin) { try { bin.Sync(); } finally { bin.Close(); } } private void CloseLogFile() { SyncAndClose(_logFile); _logFile = null; } private void DeleteLockFile() { File4.Delete(LockFileName(_fileName)); } private void DeleteLogFile() { File4.Delete(LogFileName(_fileName)); } public override Slot AllocateSlot(bool append, int slotChangeCount) { // do nothing return null; } public override void ApplySlotChanges(IVisitable slotChangeTree, int slotChangeCount , Slot reservedSlot) { if (slotChangeCount < 1) { return; } IRunnable commitHook = _container.CommitHook(); FlushDatabaseFile(); EnsureLogAndLock(); int length = TransactionLogSlotLength(slotChangeCount); ByteArrayBuffer logBuffer = new ByteArrayBuffer(length); logBuffer.WriteInt(length); logBuffer.WriteInt(slotChangeCount); AppendSlotChanges(logBuffer, slotChangeTree); Write(_logFile, logBuffer); _logFile.Sync(); WriteToLockFile(LockInt); WriteSlots(slotChangeTree); commitHook.Run(); FlushDatabaseFile(); WriteToLockFile(0); } private void WriteToLockFile(int lockSignal) { ByteArrayBuffer lockBuffer = NewLockFileBuffer(); lockBuffer.WriteInt(lockSignal); lockBuffer.WriteInt(lockSignal); Write(_lockFile, lockBuffer); _lockFile.Sync(); } private ByteArrayBuffer NewLockFileBuffer() { return new ByteArrayBuffer(LockFileBufferLength()); } private int LockFileBufferLength() { return Const4.LongLength * 2; } private void EnsureLogAndLock() { if (_container.Config().IsReadOnly()) { return; } if (LogsOpened()) { return; } OpenLockFile(); OpenLogFile(); } private void OpenLogFile() { _logFile = OpenBin(LogFileName(_fileName)); } private void OpenLockFile() { _lockFile = OpenBin(LockFileName(_fileName)); } private bool LogsOpened() { return _lockFile != null; } private void Read(IBin storage, ByteArrayBuffer buffer) { storage.Read(0, buffer._buffer, buffer.Length()); } private void Write(IBin storage, ByteArrayBuffer buffer) { storage.Write(0, buffer._buffer, buffer.Length()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IReadable.cs0000644000175000017500000000042511700531646026743 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public interface IReadable { object Read(ByteArrayBuffer buffer); int MarshalledLength(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Reflection4.cs0000644000175000017500000001442011700531646027311 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using System.Text; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Sharpen; namespace Db4objects.Db4o.Internal { /// /// Use the methods in this class for system classes only, since they /// are not ClassLoader or Reflector-aware. /// TODO: this class should go to foundation.reflect, along with ReflectException and ReflectPlatform /// public class Reflection4 { public static object InvokeStatic(Type clazz, string methodName) { return Invoke(clazz, methodName, null, null, null); } /// public static object Invoke(object obj, string methodName) { return Invoke(obj.GetType(), methodName, null, null, obj); } /// public static object Invoke(object obj, string methodName, object[] @params) { Type[] paramClasses = new Type[@params.Length]; for (int i = 0; i < @params.Length; i++) { paramClasses[i] = @params[i].GetType(); } return Invoke(obj.GetType(), methodName, paramClasses, @params, obj); } /// public static object Invoke(object obj, string methodName, Type[] paramClasses, object [] @params) { return Invoke(obj.GetType(), methodName, paramClasses, @params, obj); } /// public static object Invoke(Type clazz, string methodName, Type[] paramClasses, object [] @params) { return Invoke(clazz, methodName, paramClasses, @params, null); } private static object Invoke(Type clazz, string methodName, Type[] paramClasses, object[] @params, object onObject) { return Invoke(@params, onObject, GetMethod(clazz, methodName, paramClasses)); } /// public static object Invoke(string className, string methodName, Type[] paramClasses , object[] @params, object onObject) { MethodInfo method = GetMethod(className, methodName, paramClasses); return Invoke(@params, onObject, method); } /// public static object Invoke(object[] @params, object onObject, MethodInfo method) { if (method == null) { return null; } Platform4.SetAccessible(method); try { return method.Invoke(onObject, @params); } catch (TargetInvocationException e) { throw new ReflectException(e.InnerException); } catch (ArgumentException e) { throw new ReflectException(e); } catch (MemberAccessException e) { throw new ReflectException(e); } } /// calling this method "method" will break C# conversion with the old converter /// public static MethodInfo GetMethod(string className, string methodName, Type[] paramClasses ) { Type clazz = ReflectPlatform.ForName(className); if (clazz == null) { return null; } return GetMethod(clazz, methodName, paramClasses); } public static MethodInfo GetMethod(Type clazz, string methodName, Type[] paramClasses ) { Type curclazz = clazz; while (curclazz != null) { try { return Sharpen.Runtime.GetDeclaredMethod(curclazz, methodName, paramClasses); } catch (Exception) { } curclazz = curclazz.BaseType; } return null; } /// public static object Invoke(object obj, string methodName, Type signature, object value) { return Invoke(obj, methodName, new Type[] { signature }, new object[] { value }); } public static FieldInfo GetField(Type clazz, string name) { Type curclazz = clazz; while (curclazz != null) { try { FieldInfo field = Sharpen.Runtime.GetDeclaredField(curclazz, name); Platform4.SetAccessible(field); if (field != null) { return field; } } catch (Exception) { } curclazz = curclazz.BaseType; } return null; } /// public static object GetFieldValue(object obj, string fieldName) { try { return GetField(obj.GetType(), fieldName).GetValue(obj); } catch (Exception e) { throw new ReflectException(e); } } public static object NewInstance(object template) { try { return System.Activator.CreateInstance(template.GetType()); } catch (Exception e) { throw new ReflectException(e); } } public static string Dump(object obj) { return DumpPreventRecursion(obj, new IdentitySet4(), 2); } private static string DumpPreventRecursion(object obj, IdentitySet4 dumped, int stackLimit ) { stackLimit--; if (obj == null) { return "null"; } Type clazz = obj.GetType(); if (Platform4.IsSimple(clazz)) { return obj.ToString(); } StringBuilder sb = new StringBuilder(); sb.Append(clazz.FullName); sb.Append(" ("); sb.Append(Runtime.IdentityHashCode(obj)); sb.Append(")"); if (dumped.Contains(obj) || stackLimit <= 0) { return sb.ToString(); } dumped.Add(obj); FieldInfo[] fields = Sharpen.Runtime.GetDeclaredFields(clazz); for (int fieldIndex = 0; fieldIndex < fields.Length; ++fieldIndex) { FieldInfo field = fields[fieldIndex]; Platform4.SetAccessible(field); try { if (field.GetValue(null) == field.GetValue(obj)) { continue; } } catch (Exception) { } // static field.getModifiers() wouldn't sharpen sb.Append("\n"); sb.Append("\t"); sb.Append(field.Name); sb.Append(": "); try { sb.Append(DumpPreventRecursion(field.GetValue(obj), dumped, stackLimit)); } catch (Exception e) { sb.Append("Exception caught: "); sb.Append(e); } } return sb.ToString(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IPersistent.cs0000644000175000017500000000060011700531646027377 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public interface IPersistent { byte GetIdentifier(); int OwnLength(); void ReadThis(Transaction trans, ByteArrayBuffer reader); void WriteThis(Transaction trans, ByteArrayBuffer writer); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/BlockSizeBlockConverter.cs0000644000175000017500000000166211700531646031667 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// public sealed class BlockSizeBlockConverter : IBlockConverter { private readonly int _blockSize; public BlockSizeBlockConverter(int blockSize) { _blockSize = blockSize; } public int BytesToBlocks(long bytes) { return (int)((bytes + _blockSize - 1) / _blockSize); } public int BlockAlignedBytes(int bytes) { return BytesToBlocks(bytes) * _blockSize; } public int BlocksToBytes(int blocks) { return blocks * _blockSize; } public Slot ToBlockedLength(Slot slot) { return new Slot(slot.Address(), BytesToBlocks(slot.Length())); } public Slot ToNonBlockedLength(Slot slot) { return new Slot(slot.Address(), BlocksToBytes(slot.Length())); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/0000755000175000017500000000000011700531646026346 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ObjectHeaderAttributes.cs0000644000175000017500000000112511700531646033262 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Marshall { /// public class ObjectHeaderAttributes { private readonly int _fieldCount; private readonly BitMap4 _nullBitMap; public ObjectHeaderAttributes(ByteArrayBuffer reader) { _fieldCount = reader.ReadInt(); _nullBitMap = reader.ReadBitMap(_fieldCount); } public virtual bool IsNull(int fieldIndex) { return _nullBitMap.IsTrue(fieldIndex); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ClassMarshaller0.cs0000644000175000017500000000252411700531646032040 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Convert.Conversions; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class ClassMarshaller0 : ClassMarshaller { protected override void ReadIndex(ObjectContainerBase stream, ClassMetadata clazz , ByteArrayBuffer reader) { int indexID = reader.ReadInt(); if (!stream.MaintainsIndices() || !(stream is LocalObjectContainer)) { return; } if (Btree(clazz) != null) { return; } clazz.Index().Read(stream, ValidIndexId(indexID)); if (IsOldClassIndex(indexID)) { new ClassIndexesToBTrees_5_5().Convert((LocalObjectContainer)stream, indexID, Btree (clazz)); stream.SetDirtyInSystemTransaction(clazz); } } private BTree Btree(ClassMetadata clazz) { return BTreeClassIndexStrategy.Btree(clazz); } private int ValidIndexId(int indexID) { return IsOldClassIndex(indexID) ? 0 : -indexID; } private bool IsOldClassIndex(int indexID) { return indexID > 0; } protected override int IndexIDForWriting(int indexID) { return indexID; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/RawFieldSpec.cs0000644000175000017500000000412511700531646031207 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { public class RawFieldSpec { private readonly AspectType _type; private readonly string _name; private readonly int _fieldTypeID; private readonly bool _isPrimitive; private readonly bool _isArray; private readonly bool _isNArray; private readonly bool _isVirtual; private int _indexID; public RawFieldSpec(AspectType aspectType, string name, int fieldTypeID, byte attribs ) { _type = aspectType; _name = name; _fieldTypeID = fieldTypeID; BitMap4 bitmap = new BitMap4(attribs); _isPrimitive = bitmap.IsTrue(0); _isArray = bitmap.IsTrue(1); _isNArray = bitmap.IsTrue(2); _isVirtual = false; _indexID = 0; } public RawFieldSpec(AspectType aspectType, string name) { _type = aspectType; _name = name; _fieldTypeID = 0; _isPrimitive = false; _isArray = false; _isNArray = false; _isVirtual = true; _indexID = 0; } public virtual string Name() { return _name; } public virtual int FieldTypeID() { return _fieldTypeID; } public virtual bool IsPrimitive() { return _isPrimitive; } public virtual bool IsArray() { return _isArray; } public virtual bool IsNArray() { return _isNArray; } public virtual bool IsVirtual() { return _isVirtual; } public virtual bool IsVirtualField() { return IsVirtual() && IsField(); } public virtual bool IsField() { return _type.IsField(); } public virtual int IndexID() { return _indexID; } internal virtual void IndexID(int indexID) { _indexID = indexID; } public override string ToString() { return "RawFieldSpec(" + Name() + ")"; } public virtual bool IsFieldMetadata() { return _type.IsFieldMetadata(); } public virtual bool IsTranslator() { return _type.IsTranslator(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ContextState.cs0000644000175000017500000000043211700531646031321 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Marshall { /// public class ContextState { public readonly int _offset; public ContextState(int offset) { _offset = offset; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/FieldMarshaller1.cs0000644000175000017500000000513211700531646032015 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class FieldMarshaller1 : FieldMarshaller0 { private bool HasBTreeIndex(FieldMetadata field) { return !field.IsVirtual(); } public override void Write(Transaction trans, ClassMetadata clazz, ClassAspect aspect , ByteArrayBuffer writer) { base.Write(trans, clazz, aspect, writer); if (!(aspect is FieldMetadata)) { return; } FieldMetadata field = (FieldMetadata)aspect; if (!HasBTreeIndex(field)) { return; } writer.WriteIDOf(trans, field.GetIndex(trans)); } protected override RawFieldSpec ReadSpec(AspectType aspectType, ObjectContainerBase stream, ByteArrayBuffer reader) { RawFieldSpec spec = base.ReadSpec(aspectType, stream, reader); if (spec == null) { return null; } if (spec.IsVirtual()) { return spec; } int indexID = reader.ReadInt(); spec.IndexID(indexID); return spec; } protected override FieldMetadata FromSpec(RawFieldSpec spec, ObjectContainerBase stream, ClassMetadata containingClass) { FieldMetadata actualField = base.FromSpec(spec, stream, containingClass); if (spec == null) { return null; } if (spec.IndexID() != 0) { actualField.InitIndex(stream.SystemTransaction(), spec.IndexID()); } return actualField; } public override int MarshalledLength(ObjectContainerBase stream, ClassAspect aspect ) { int len = base.MarshalledLength(stream, aspect); if (!(aspect is FieldMetadata)) { return len; } FieldMetadata field = (FieldMetadata)aspect; if (!HasBTreeIndex(field)) { return len; } return len + Const4.IdLength; } public override void Defrag(ClassMetadata classMetadata, ClassAspect aspect, LatinStringIO sio, DefragmentContextImpl context) { base.Defrag(classMetadata, aspect, sio, context); if (!(aspect is FieldMetadata)) { return; } FieldMetadata field = (FieldMetadata)aspect; if (field.IsVirtual()) { return; } if (field.HasIndex()) { BTree index = field.GetIndex(context.SystemTrans()); int targetIndexID = context.CopyID(); if (targetIndexID != 0) { index.DefragBTree(context.Services()); } } else { context.WriteInt(0); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/UnmarshallingContext.cs0000644000175000017500000001124111700531646033045 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// Wraps the low-level details of reading a Buffer, which in turn is a glorified byte array. /// /// Wraps the low-level details of reading a Buffer, which in turn is a glorified byte array. /// /// public class UnmarshallingContext : ObjectReferenceContext, IHandlerVersionContext , IReferenceActivationContext { private object _object; private int _addToIDTree; private bool _checkIDTree; public UnmarshallingContext(Transaction transaction, ByteArrayBuffer buffer, ObjectReference @ref, int addToIDTree, bool checkIDTree) : base(transaction, buffer, null, @ref ) { _addToIDTree = addToIDTree; _checkIDTree = checkIDTree; } public UnmarshallingContext(Transaction transaction, ObjectReference @ref, int addToIDTree , bool checkIDTree) : this(transaction, null, @ref, addToIDTree, checkIDTree) { } public virtual object Read() { if (!BeginProcessing()) { return _object; } ReadBuffer(ObjectId()); if (Buffer() == null) { EndProcessing(); return _object; } ClassMetadata classMetadata = ReadObjectHeader(); if (classMetadata == null) { InvalidSlot(); EndProcessing(); return _object; } _reference.ClassMetadata(classMetadata); AdjustActivationDepth(); if (_checkIDTree) { object objectInCacheFromClassCreation = Transaction().ObjectForIdFromCache(ObjectId ()); if (objectInCacheFromClassCreation != null) { _object = objectInCacheFromClassCreation; EndProcessing(); return _object; } } if (PeekPersisted()) { _object = ClassMetadata().InstantiateTransient(this); } else { _object = ClassMetadata().Instantiate(this); } EndProcessing(); return _object; } private void InvalidSlot() { if (Container().Config().RecoveryMode()) { return; } throw new InvalidSlotException("id: " + ObjectId()); } private void AdjustActivationDepth() { if (UnknownActivationDepth.Instance == _activationDepth) { _activationDepth = Container().DefaultActivationDepth(ClassMetadata()); } } private IActivationDepthProvider ActivationDepthProvider() { return Container().ActivationDepthProvider(); } public virtual object ReadFullyActivatedObjectForKeys(ITypeHandler4 handler) { object obj = ReadObject(handler); if (obj == null) { return obj; } IActivationDepth activationDepth = ActivationDepthProvider().ActivationDepth(int.MaxValue , ActivationMode.Activate); Container().Activate(Transaction(), obj, activationDepth); return obj; } public virtual object ReadFieldValue(FieldMetadata field) { ReadBuffer(ObjectId()); if (Buffer() == null) { return null; } ClassMetadata classMetadata = ReadObjectHeader(); if (classMetadata == null) { return null; } return ReadFieldValue(classMetadata, field); } private object ReadFieldValue(ClassMetadata classMetadata, FieldMetadata field) { if (!classMetadata.SeekToField(this, field)) { return null; } return field.Read(this); } private ClassMetadata ReadObjectHeader() { _objectHeader = new ObjectHeader(Container(), ByteArrayBuffer()); ClassMetadata classMetadata = _objectHeader.ClassMetadata(); if (classMetadata == null) { return null; } return classMetadata; } private void ReadBuffer(int id) { if (Buffer() == null && id > 0) { Buffer(Container().ReadBufferById(Transaction(), id)); } } private bool BeginProcessing() { return _reference.BeginProcessing(); } private void EndProcessing() { _reference.EndProcessing(); } public virtual void SetStateClean() { _reference.SetStateClean(); } public virtual object PersistentObject() { return _object; } public virtual void SetObjectWeak(object obj) { _reference.SetObjectWeak(Container(), obj); } protected override bool PeekPersisted() { return _addToIDTree == Const4.Transient; } public virtual Config4Class ClassConfig() { return ClassMetadata().Config(); } public virtual void PersistentObject(object obj) { _object = obj; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ClassMarshaller.cs0000644000175000017500000001476211700531646031767 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public abstract class ClassMarshaller { public MarshallerFamily _family; public virtual RawClassSpec ReadSpec(Transaction trans, ByteArrayBuffer reader) { byte[] nameBytes = ReadName(trans, reader); string className = trans.Container().StringIO().Read(nameBytes); ReadMetaClassID(reader); // skip int ancestorID = reader.ReadInt(); reader.IncrementOffset(Const4.IntLength); // index ID int numFields = reader.ReadInt(); return new RawClassSpec(className, ancestorID, numFields); } public virtual void Write(Transaction trans, ClassMetadata clazz, ByteArrayBuffer writer) { writer.WriteShortString(trans, clazz.NameToWrite()); int intFormerlyKnownAsMetaClassID = 0; writer.WriteInt(intFormerlyKnownAsMetaClassID); writer.WriteIDOf(trans, clazz._ancestor); WriteIndex(trans, clazz, writer); writer.WriteInt(clazz.DeclaredAspectCount()); clazz.TraverseDeclaredAspects(new _IProcedure4_39(this, trans, clazz, writer)); } private sealed class _IProcedure4_39 : IProcedure4 { public _IProcedure4_39(ClassMarshaller _enclosing, Transaction trans, ClassMetadata clazz, ByteArrayBuffer writer) { this._enclosing = _enclosing; this.trans = trans; this.clazz = clazz; this.writer = writer; } public void Apply(object arg) { this._enclosing._family._field.Write(trans, clazz, (ClassAspect)arg, writer); } private readonly ClassMarshaller _enclosing; private readonly Transaction trans; private readonly ClassMetadata clazz; private readonly ByteArrayBuffer writer; } protected virtual void WriteIndex(Transaction trans, ClassMetadata clazz, ByteArrayBuffer writer) { int indexID = clazz.Index().Write(trans); writer.WriteInt(IndexIDForWriting(indexID)); } protected abstract int IndexIDForWriting(int indexID); public byte[] ReadName(Transaction trans, ByteArrayBuffer reader) { return ReadName(trans.Container().StringIO(), reader); } public int ReadMetaClassID(ByteArrayBuffer reader) { return reader.ReadInt(); } private byte[] ReadName(LatinStringIO sio, ByteArrayBuffer reader) { byte[] nameBytes = sio.Bytes(reader); reader.IncrementOffset(nameBytes.Length); nameBytes = Platform4.UpdateClassName(nameBytes); return nameBytes; } public void Read(ObjectContainerBase stream, ClassMetadata clazz, ByteArrayBuffer reader) { clazz.SetAncestor(stream.ClassMetadataForID(reader.ReadInt())); // if(clazz.callConstructor()){ // // The logic further down checks the ancestor YapClass, whether // // or not it is allowed, not to call constructors. The ancestor // // YapClass may possibly have not been loaded yet. // clazz.createConstructor(true); // } clazz.CheckType(); ReadIndex(stream, clazz, reader); clazz._aspects = ReadAspects(stream, reader, clazz); } protected abstract void ReadIndex(ObjectContainerBase stream, ClassMetadata clazz , ByteArrayBuffer reader); private ClassAspect[] ReadAspects(ObjectContainerBase stream, ByteArrayBuffer reader , ClassMetadata clazz) { ClassAspect[] aspects = new ClassAspect[reader.ReadInt()]; for (int i = 0; i < aspects.Length; i++) { aspects[i] = _family._field.Read(stream, clazz, reader); aspects[i].SetHandle(i); } return aspects; } public virtual int MarshalledLength(ObjectContainerBase stream, ClassMetadata clazz ) { IntByRef len = new IntByRef(stream.StringIO().ShortLength(clazz.NameToWrite()) + Const4.ObjectLength + (Const4.IntLength * 2) + (Const4.IdLength)); len.value += clazz.Index().OwnLength(); clazz.TraverseDeclaredAspects(new _IProcedure4_108(this, len, stream)); return len.value; } private sealed class _IProcedure4_108 : IProcedure4 { public _IProcedure4_108(ClassMarshaller _enclosing, IntByRef len, ObjectContainerBase stream) { this._enclosing = _enclosing; this.len = len; this.stream = stream; } public void Apply(object arg) { len.value += this._enclosing._family._field.MarshalledLength(stream, (ClassAspect )arg); } private readonly ClassMarshaller _enclosing; private readonly IntByRef len; private readonly ObjectContainerBase stream; } public virtual void Defrag(ClassMetadata classMetadata, LatinStringIO sio, DefragmentContextImpl context, int classIndexID) { ReadName(sio, context.SourceBuffer()); ReadName(sio, context.TargetBuffer()); int metaClassID = 0; context.WriteInt(metaClassID); // ancestor ID context.CopyID(); context.WriteInt((classMetadata.HasClassIndex() ? IndexIDForWriting(classIndexID) : 0)); int aspectCount = context.ReadInt(); if (aspectCount > classMetadata.DeclaredAspectCount()) { throw new InvalidOperationException(); } IntByRef processedAspectCount = new IntByRef(0); classMetadata.TraverseDeclaredAspects(new _IProcedure4_136(this, processedAspectCount , aspectCount, classMetadata, sio, context)); } private sealed class _IProcedure4_136 : IProcedure4 { public _IProcedure4_136(ClassMarshaller _enclosing, IntByRef processedAspectCount , int aspectCount, ClassMetadata classMetadata, LatinStringIO sio, DefragmentContextImpl context) { this._enclosing = _enclosing; this.processedAspectCount = processedAspectCount; this.aspectCount = aspectCount; this.classMetadata = classMetadata; this.sio = sio; this.context = context; } public void Apply(object arg) { if (processedAspectCount.value >= aspectCount) { return; } ClassAspect aspect = (ClassAspect)arg; this._enclosing._family._field.Defrag(classMetadata, aspect, sio, context); processedAspectCount.value++; } private readonly ClassMarshaller _enclosing; private readonly IntByRef processedAspectCount; private readonly int aspectCount; private readonly ClassMetadata classMetadata; private readonly LatinStringIO sio; private readonly DefragmentContextImpl context; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/AspectVersionContextImpl.cs0000644000175000017500000000175411700531646033660 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class AspectVersionContextImpl : IAspectVersionContext { private readonly int _declaredAspectCount; private AspectVersionContextImpl(int count) { _declaredAspectCount = count; } public virtual int DeclaredAspectCount() { return _declaredAspectCount; } public virtual void DeclaredAspectCount(int count) { throw new InvalidOperationException(); } public static readonly Db4objects.Db4o.Internal.Marshall.AspectVersionContextImpl AlwaysEnabled = new Db4objects.Db4o.Internal.Marshall.AspectVersionContextImpl( int.MaxValue); public static readonly Db4objects.Db4o.Internal.Marshall.AspectVersionContextImpl CheckAlwaysEnabled = new Db4objects.Db4o.Internal.Marshall.AspectVersionContextImpl (int.MaxValue - 1); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IAspectVersionContext.cs0000644000175000017500000000041211700531646033135 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Marshall { /// public interface IAspectVersionContext { int DeclaredAspectCount(); void DeclaredAspectCount(int count); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IFieldMarshaller.cs0000644000175000017500000000143011700531646032042 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public interface IFieldMarshaller { void Write(Transaction trans, ClassMetadata clazz, ClassAspect aspect, ByteArrayBuffer writer); RawFieldSpec ReadSpec(ObjectContainerBase stream, ByteArrayBuffer reader); FieldMetadata Read(ObjectContainerBase stream, ClassMetadata clazz, ByteArrayBuffer reader); int MarshalledLength(ObjectContainerBase stream, ClassAspect aspect); void Defrag(ClassMetadata classMetadata, ClassAspect aspect, LatinStringIO sio, DefragmentContextImpl context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ObjectReferenceContext.cs0000644000175000017500000000240311700531646033266 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Marshall { public class ObjectReferenceContext : ObjectHeaderContext, IObjectIdContext { protected readonly Db4objects.Db4o.Internal.ObjectReference _reference; public ObjectReferenceContext(Transaction transaction, IReadBuffer buffer, ObjectHeader objectHeader, Db4objects.Db4o.Internal.ObjectReference reference) : base(transaction , buffer, objectHeader) { _reference = reference; } public virtual int ObjectId() { return _reference.GetID(); } public override Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { Db4objects.Db4o.Internal.ClassMetadata classMetadata = _reference.ClassMetadata(); if (classMetadata == null) { throw new InvalidOperationException(); } return classMetadata; } public virtual Db4objects.Db4o.Internal.ObjectReference ObjectReference() { return _reference; } protected virtual Db4objects.Db4o.Internal.ByteArrayBuffer ByteArrayBuffer() { return (Db4objects.Db4o.Internal.ByteArrayBuffer)Buffer(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/SlotFormat2.cs0000644000175000017500000000077011700531646031055 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public class SlotFormat2 : SlotFormat { protected override int HandlerVersion() { return 2; } public override bool IsIndirectedWithinSlot(ITypeHandler4 handler) { return Handlers4.IsVariableLength(handler); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/MarshallingContext.cs0000644000175000017500000002231311700531646032504 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public class MarshallingContext : IMarshallingInfo, IWriteContext { private const int HeaderLength = Const4.LeadingLength + Const4.IdLength + 1 + Const4 .IntLength; private readonly Db4objects.Db4o.Internal.Transaction _transaction; private readonly ObjectReference _reference; private IUpdateDepth _updateDepth; private readonly bool _isNew; private readonly BitMap4 _nullBitMap; private readonly MarshallingBuffer _writeBuffer; private MarshallingBuffer _currentBuffer; private ByteArrayBuffer _debugPrepend; private object _currentMarshalledObject; private object _currentIndexEntry; private int _declaredAspectCount; public MarshallingContext(Db4objects.Db4o.Internal.Transaction trans, ObjectReference @ref, IUpdateDepth updateDepth, bool isNew) { // YapClass ID // Marshaller Version // number of fields _transaction = trans; _reference = @ref; _nullBitMap = new BitMap4(AspectCount()); _updateDepth = ClassMetadata().AdjustUpdateDepth(trans, updateDepth); _isNew = isNew; _writeBuffer = new MarshallingBuffer(); _currentBuffer = _writeBuffer; } private int AspectCount() { return ClassMetadata().AspectCount(); } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _reference.ClassMetadata(); } public virtual bool IsNew() { return _isNew; } public virtual bool IsNull(int fieldIndex) { // TODO Auto-generated method stub return false; } public virtual void IsNull(int fieldIndex, bool flag) { _nullBitMap.Set(fieldIndex, flag); } public virtual Db4objects.Db4o.Internal.Transaction Transaction() { return _transaction; } public virtual Slot AllocateNewSlot(int length) { if (_transaction is LocalTransaction) { return LocalContainer().AllocateSlotForNewUserObject(_transaction, ObjectID(), length ); } return new Slot(Slot.New, length); } private Slot AllocateUpdateSlot(int length) { if (_transaction is LocalTransaction) { return LocalContainer().AllocateSlotForUserObjectUpdate(Transaction(), ObjectID() , length); } return new Slot(Slot.Update, length); } private LocalObjectContainer LocalContainer() { return ((LocalTransaction)Transaction()).LocalContainer(); } public virtual Pointer4 AllocateSlot() { int length = Container().BlockConverter().BlockAlignedBytes(MarshalledLength()); Slot slot = IsNew() ? AllocateNewSlot(length) : AllocateUpdateSlot(length); return new Pointer4(ObjectID(), slot); } public virtual ByteArrayBuffer ToWriteBuffer(Pointer4 pointer) { ByteArrayBuffer buffer = new ByteArrayBuffer(pointer.Length()); _writeBuffer.MergeChildren(this, pointer.Address(), WriteBufferOffset()); WriteObjectClassID(buffer, ClassMetadata().GetID()); buffer.WriteByte(HandlerRegistry.HandlerVersion); buffer.WriteInt(AspectCount()); buffer.WriteBitMap(_nullBitMap); _writeBuffer.TransferContentTo(buffer); return buffer; } private int WriteBufferOffset() { return HeaderLength + _nullBitMap.MarshalledLength(); } public virtual int MarshalledLength() { int length = WriteBufferOffset(); _writeBuffer.CheckBlockAlignment(this, null, new IntByRef(length)); return length + _writeBuffer.MarshalledLength() + Const4.BracketsBytes; } public virtual int RequiredLength(MarshallingBuffer buffer, bool align) { if (!align) { return buffer.Length(); } return Container().BlockConverter().BlockAlignedBytes(buffer.Length()); } private void WriteObjectClassID(ByteArrayBuffer reader, int id) { reader.WriteInt(-id); } public virtual object GetObject() { return _reference.GetObject(); } public virtual Config4Class ClassConfiguration() { return ClassMetadata().Config(); } public virtual IUpdateDepth UpdateDepth() { return _updateDepth; } public virtual void UpdateDepth(IUpdateDepth depth) { _updateDepth = depth; } public virtual int ObjectID() { return _reference.GetID(); } public virtual object CurrentIndexEntry() { // TODO Auto-generated method stub return null; } public virtual ObjectContainerBase Container() { return Transaction().Container(); } public virtual IObjectContainer ObjectContainer() { return Transaction().ObjectContainer(); } public virtual void WriteByte(byte b) { PreWrite(); _currentBuffer.WriteByte(b); PostWrite(); } public virtual void WriteBytes(byte[] bytes) { PreWrite(); _currentBuffer.WriteBytes(bytes); PostWrite(); } public virtual void WriteInt(int i) { PreWrite(); _currentBuffer.WriteInt(i); PostWrite(); } public virtual void WriteLong(long l) { PreWrite(); _currentBuffer.WriteLong(l); PostWrite(); } private void PreWrite() { } private void PostWrite() { } public virtual void CreateChildBuffer(bool storeLengthInLink) { MarshallingBuffer childBuffer = _currentBuffer.AddChild(false, storeLengthInLink); _currentBuffer.ReserveChildLinkSpace(storeLengthInLink); _currentBuffer = childBuffer; } public virtual void BeginSlot() { _currentBuffer = _writeBuffer; } public virtual void WriteDeclaredAspectCount(int count) { _writeBuffer.WriteInt(count); } public virtual void DebugPrependNextWrite(ByteArrayBuffer prepend) { } public virtual void DebugWriteEnd(byte b) { _currentBuffer.WriteByte(b); } public virtual void WriteObject(object obj) { int id = Container().StoreInternal(Transaction(), obj, _updateDepth, true); WriteInt(id); _currentMarshalledObject = obj; _currentIndexEntry = id; } public virtual void WriteObject(ITypeHandler4 handler, object obj) { MarshallingContextState state = CurrentState(); WriteObjectWithCurrentState(handler, obj); RestoreState(state); } public virtual void WriteObjectWithCurrentState(ITypeHandler4 handler, object obj ) { if (Handlers4.UseDedicatedSlot(this, handler)) { WriteObject(obj); } else { if (obj == null) { WriteNullReference(handler); } else { CreateIndirectionWithinSlot(handler); handler.Write(this, obj); } } } private void WriteNullReference(ITypeHandler4 handler) { if (IsIndirectedWithinSlot(handler)) { WriteNullLink(); return; } Handlers4.Write(handler, this, Handlers4.NullRepresentationInUntypedArrays(handler )); } private void WriteNullLink() { WriteInt(0); WriteInt(0); } public virtual void AddIndexEntry(FieldMetadata fieldMetadata, object obj) { if (!_currentBuffer.HasParent()) { object indexEntry = (obj == _currentMarshalledObject) ? _currentIndexEntry : obj; if (_isNew || !UpdateDepth().CanSkip(_reference)) { fieldMetadata.AddIndexEntry(Transaction(), ObjectID(), indexEntry); } return; } _currentBuffer.RequestIndexEntry(fieldMetadata); } public virtual void PurgeFieldIndexEntriesOnUpdate(Db4objects.Db4o.Internal.Transaction transaction, ArrayType arrayType) { if (!UpdateDepth().CanSkip(_reference)) { transaction.WriteUpdateAdjustIndexes(_reference.GetID(), _reference.ClassMetadata (), arrayType); } } public virtual ObjectReference Reference() { return _reference; } public virtual void CreateIndirectionWithinSlot(ITypeHandler4 handler) { if (IsIndirectedWithinSlot(handler)) { CreateIndirectionWithinSlot(); } } public virtual void CreateIndirectionWithinSlot() { CreateChildBuffer(true); } private bool IsIndirectedWithinSlot(ITypeHandler4 handler) { return SlotFormat.Current().IsIndirectedWithinSlot(handler); } // FIXME: This method was just temporarily added to fulfill contract of MarshallingInfo // It will go, the buffer is never needed in new marshalling. public virtual IReadBuffer Buffer() { return null; } public virtual MarshallingContextState CurrentState() { return new MarshallingContextState(_currentBuffer); } public virtual void RestoreState(MarshallingContextState state) { _currentBuffer = state._buffer; } public virtual IReservedBuffer Reserve(int length) { PreWrite(); IReservedBuffer reservedBuffer = _currentBuffer.Reserve(length); PostWrite(); return reservedBuffer; } public virtual int DeclaredAspectCount() { return _declaredAspectCount; } public virtual void DeclaredAspectCount(int count) { _declaredAspectCount = count; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ClassMarshaller1.cs0000644000175000017500000000107511700531646032041 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class ClassMarshaller1 : ClassMarshaller { protected override void ReadIndex(ObjectContainerBase stream, ClassMetadata clazz , ByteArrayBuffer reader) { int indexID = reader.ReadInt(); clazz.Index().Read(stream, -indexID); } protected override int IndexIDForWriting(int indexID) { return -indexID; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ObjectHeader.cs0000644000175000017500000000654711700531646031230 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public sealed class ObjectHeader { private readonly Db4objects.Db4o.Internal.ClassMetadata _classMetadata; public readonly MarshallerFamily _marshallerFamily; public readonly ObjectHeaderAttributes _headerAttributes; private int _handlerVersion; public ObjectHeader(ObjectContainerBase container, IReadWriteBuffer reader) : this (container, null, reader) { } public ObjectHeader(Db4objects.Db4o.Internal.ClassMetadata classMetadata, IReadWriteBuffer reader) : this(null, classMetadata, reader) { } private ObjectHeader(ObjectContainerBase container, Db4objects.Db4o.Internal.ClassMetadata classMetadata, IReadWriteBuffer reader) { int classID = reader.ReadInt(); _marshallerFamily = ReadMarshallerFamily(reader, classID); classID = NormalizeID(classID); _classMetadata = (classMetadata != null ? classMetadata : container.ClassMetadataForID (classID)); // This check has been added to cope with defragment in debug mode: SlotDefragment#setIdentity() // will trigger calling this constructor with a source db class metadata and a target db stream, // thus _classMetadata==null. There may be a better solution, since this call is just meant to // skip the object header. _headerAttributes = SlotFormat().ReadHeaderAttributes((ByteArrayBuffer)reader); } public static Db4objects.Db4o.Internal.Marshall.ObjectHeader Defrag(DefragmentContextImpl context) { ByteArrayBuffer source = context.SourceBuffer(); ByteArrayBuffer target = context.TargetBuffer(); Db4objects.Db4o.Internal.Marshall.ObjectHeader header = new Db4objects.Db4o.Internal.Marshall.ObjectHeader (context.Services().SystemTrans().Container(), null, source); int newID = context.Mapping().StrictMappedID(header.ClassMetadata().GetID()); Db4objects.Db4o.Internal.Marshall.SlotFormat slotFormat = header.SlotFormat(); slotFormat.WriteObjectClassID(target, newID); slotFormat.SkipMarshallerInfo(target); slotFormat.ReadHeaderAttributes(target); return header; } private Db4objects.Db4o.Internal.Marshall.SlotFormat SlotFormat() { return Db4objects.Db4o.Internal.Marshall.SlotFormat.ForHandlerVersion(HandlerVersion ()); } private MarshallerFamily ReadMarshallerFamily(IReadWriteBuffer reader, int classID ) { bool marshallerAware = MarshallerAware(classID); _handlerVersion = 0; if (marshallerAware) { _handlerVersion = reader.ReadByte(); } MarshallerFamily marshallerFamily = MarshallerFamily.Version(_handlerVersion); return marshallerFamily; } private bool MarshallerAware(int id) { return id < 0; } private int NormalizeID(int id) { return (id < 0 ? -id : id); } public Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _classMetadata; } public int HandlerVersion() { return _handlerVersion; } public static Db4objects.Db4o.Internal.Marshall.ObjectHeader ScrollBufferToContent (LocalObjectContainer container, ByteArrayBuffer buffer) { return new Db4objects.Db4o.Internal.Marshall.ObjectHeader(container, buffer); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/SlotFormatCurrent.cs0000644000175000017500000000120211700531646032325 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public class SlotFormatCurrent : SlotFormat { protected override int HandlerVersion() { return HandlerRegistry.HandlerVersion; } public override bool IsIndirectedWithinSlot(ITypeHandler4 handler) { if (Handlers4.IsUntyped(handler)) { return false; } return Handlers4.IsVariableLength(handler) && Handlers4.IsValueType(handler); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/AbstractReadContext.cs0000644000175000017500000001007411700531646032603 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public abstract class AbstractReadContext : AbstractBufferContext, IInternalReadContext { protected IActivationDepth _activationDepth = UnknownActivationDepth.Instance; private bool _lastReferenceReadWasReallyNull = false; protected AbstractReadContext(Transaction transaction, IReadBuffer buffer) : base (transaction, buffer) { } protected AbstractReadContext(Transaction transaction) : this(transaction, null) { } public object Read(ITypeHandler4 handlerType) { return ReadObject(handlerType); } public object ReadObject(ITypeHandler4 handlerType) { if (null == handlerType) { throw new ArgumentNullException(); } ITypeHandler4 handler = HandlerRegistry.CorrectHandlerVersion(this, handlerType); return SlotFormat().DoWithSlotIndirection(this, handler, new _IClosure4_38(this, handler)); } private sealed class _IClosure4_38 : IClosure4 { public _IClosure4_38(AbstractReadContext _enclosing, ITypeHandler4 handler) { this._enclosing = _enclosing; this.handler = handler; } public object Run() { return this._enclosing.ReadAtCurrentSeekPosition(handler); } private readonly AbstractReadContext _enclosing; private readonly ITypeHandler4 handler; } public virtual object ReadAtCurrentSeekPosition(ITypeHandler4 handler) { if (Handlers4.UseDedicatedSlot(this, handler)) { return ReadObject(); } return Handlers4.ReadValueType(this, handler); } public object ReadObject() { int objectId = ReadInt(); if (objectId == 0) { _lastReferenceReadWasReallyNull = true; return null; } _lastReferenceReadWasReallyNull = false; if (objectId == Const4.InvalidObjectId) { return null; } ClassMetadata classMetadata = ClassMetadataForObjectId(objectId); if (null == classMetadata) { // TODO: throw here return null; } IActivationDepth depth = ActivationDepth().Descend(classMetadata); if (PeekPersisted()) { return Container().PeekPersisted(Transaction(), objectId, depth, false); } object obj = Container().GetByID2(Transaction(), objectId); if (null == obj) { return null; } // this is OK for boxed value types. They will not be added // to the list, since they will not be found in the ID tree. Container().StillToActivate(Container().ActivationContextFor(Transaction(), obj, depth)); return obj; } private ClassMetadata ClassMetadataForObjectId(int objectId) { // TODO: This method is *very* costly as is, since it reads // the whole slot once and doesn't reuse it. Optimize. HardObjectReference hardRef = Container().GetHardObjectReferenceById(Transaction( ), objectId); if (null == hardRef || hardRef._reference == null) { // com.db4o.db4ounit.common.querying.CascadeDeleteDeleted return null; } return hardRef._reference.ClassMetadata(); } protected virtual bool PeekPersisted() { return false; } public virtual IActivationDepth ActivationDepth() { return _activationDepth; } public virtual void ActivationDepth(IActivationDepth depth) { _activationDepth = depth; } public virtual IReadWriteBuffer ReadIndirectedBuffer() { int address = ReadInt(); int length = ReadInt(); if (address == 0) { return null; } return Container().DecryptedBufferByAddress(address, length); } public virtual bool LastReferenceReadWasReallyNull() { return _lastReferenceReadWasReallyNull; } public virtual void NotifyNullReferenceSkipped() { _lastReferenceReadWasReallyNull = true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IMarshallingInfo.cs0000644000175000017500000000066111700531646032066 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public interface IMarshallingInfo : IAspectVersionContext { Db4objects.Db4o.Internal.ClassMetadata ClassMetadata(); IReadBuffer Buffer(); void BeginSlot(); bool IsNull(int fieldIndex); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/PrimitiveMarshaller0.cs0000644000175000017500000000400511700531646032737 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { public class PrimitiveMarshaller0 : PrimitiveMarshaller { public override bool UseNormalClassRead() { return true; } public override DateTime ReadDate(ByteArrayBuffer bytes) { long value = bytes.ReadLong(); if (value == long.MaxValue) { return MarshallingConstants0.NullDate; } return new DateTime(value); } public override object ReadInteger(ByteArrayBuffer bytes) { int value = bytes.ReadInt(); if (value == int.MaxValue) { return null; } return value; } public override object ReadFloat(ByteArrayBuffer bytes) { float value = UnmarshallFloat(bytes); if (float.IsNaN(value)) { return null; } return value; } public override object ReadDouble(ByteArrayBuffer buffer) { double value = UnmarshalDouble(buffer); if (double.IsNaN(value)) { return null; } return value; } public override object ReadLong(ByteArrayBuffer buffer) { long value = buffer.ReadLong(); if (value == long.MaxValue) { return null; } return value; } public override object ReadShort(ByteArrayBuffer buffer) { short value = UnmarshallShort(buffer); if (value == short.MaxValue) { return null; } return value; } public static double UnmarshalDouble(ByteArrayBuffer buffer) { return Platform4.LongToDouble(buffer.ReadLong()); } public static float UnmarshallFloat(ByteArrayBuffer buffer) { return Sharpen.Runtime.IntBitsToFloat(buffer.ReadInt()); } public static short UnmarshallShort(ByteArrayBuffer buffer) { int ret = 0; for (int i = 0; i < Const4.ShortBytes; i++) { ret = (ret << 8) + (buffer._buffer[buffer._offset++] & unchecked((int)(0xff))); } return (short)ret; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IHandlerVersionContext.cs0000644000175000017500000000051211700531646033274 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public interface IHandlerVersionContext : IContext { int HandlerVersion(); Db4objects.Db4o.Internal.Marshall.SlotFormat SlotFormat(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/MarshallerFamily.cs0000644000175000017500000000751411700531646032140 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Convert.Conversions; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// /// Represents a db4o file format version, assembles all the marshallers /// needed to read/write this specific version. /// /// /// Represents a db4o file format version, assembles all the marshallers /// needed to read/write this specific version. /// A marshaller knows how to read/write certain types of values from/to its /// representation on disk for a given db4o file format version. /// Responsibilities are somewhat overlapping with TypeHandler's. /// /// public class MarshallerFamily { public class FamilyVersion { public const int PreMarshaller = 0; public const int Marshaller = 1; public const int BtreeFieldIndexes = 2; public const int ClassAspects = 3; } private static int CurrentVersion = MarshallerFamily.FamilyVersion.ClassAspects; public readonly ClassMarshaller _class; public readonly IFieldMarshaller _field; public readonly PrimitiveMarshaller _primitive; private readonly int _converterVersion; private readonly int _handlerVersion; private static readonly MarshallerFamily[] allVersions; static MarshallerFamily() { allVersions = new MarshallerFamily[HandlerRegistry.HandlerVersion + 1]; allVersions[0] = new MarshallerFamily(0, 0, new ClassMarshaller0(), new FieldMarshaller0 (), new PrimitiveMarshaller0()); // LEGACY => before 5.4 allVersions[1] = new MarshallerFamily(ClassIndexesToBTrees_5_5.Version, 1, new ClassMarshaller1 (), new FieldMarshaller0(), new PrimitiveMarshaller1()); allVersions[2] = new MarshallerFamily(FieldIndexesToBTrees_5_7.Version, 2, new ClassMarshaller2 (), new FieldMarshaller1(), new PrimitiveMarshaller1()); for (int i = 3; i < allVersions.Length; i++) { allVersions[i] = LatestFamily(i); } } public MarshallerFamily(int converterVersion, int handlerVersion, ClassMarshaller classMarshaller, IFieldMarshaller fieldMarshaller, PrimitiveMarshaller primitiveMarshaller ) { _converterVersion = converterVersion; _handlerVersion = handlerVersion; _class = classMarshaller; _class._family = this; _field = fieldMarshaller; _primitive = primitiveMarshaller; _primitive._family = this; } public static MarshallerFamily LatestFamily(int version) { return new MarshallerFamily(ClassAspects_7_4.Version, version, new ClassMarshaller2 (), new FieldMarshaller2(), new PrimitiveMarshaller1()); } public static MarshallerFamily Version(int n) { CheckIfVersionIsTooNew(n); return allVersions[n]; } private static void CheckIfVersionIsTooNew(int n) { if (n > allVersions.Length) { throw new IncompatibleFileFormatException("Databasefile was created with a newer db4o version. Marshaller version: " + n); } } public static MarshallerFamily Current() { if (CurrentVersion < MarshallerFamily.FamilyVersion.BtreeFieldIndexes) { throw new InvalidOperationException("Using old marshaller versions to write database files is not supported, source code has been removed." ); } return Version(CurrentVersion); } public static MarshallerFamily ForConverterVersion(int n) { MarshallerFamily result = allVersions[0]; for (int i = 1; i < allVersions.Length; i++) { if (allVersions[i]._converterVersion > n) { return result; } result = allVersions[i]; } return result; } public virtual int HandlerVersion() { return _handlerVersion; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ObjectHeaderContext.cs0000644000175000017500000000272511700531646032567 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class ObjectHeaderContext : AbstractReadContext, IMarshallingInfo, IHandlerVersionContext { protected ObjectHeader _objectHeader; private int _declaredAspectCount; public ObjectHeaderContext(Transaction transaction, IReadBuffer buffer, ObjectHeader objectHeader) : base(transaction, buffer) { _objectHeader = objectHeader; } public ObjectHeaderAttributes HeaderAttributes() { return _objectHeader._headerAttributes; } public bool IsNull(int fieldIndex) { return HeaderAttributes().IsNull(fieldIndex); } public override int HandlerVersion() { return _objectHeader.HandlerVersion(); } public virtual void BeginSlot() { } // do nothing public virtual ContextState SaveState() { return new ContextState(Offset()); } public virtual void RestoreState(ContextState state) { Seek(state._offset); } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _objectHeader.ClassMetadata(); } public virtual int DeclaredAspectCount() { return _declaredAspectCount; } public virtual void DeclaredAspectCount(int count) { _declaredAspectCount = count; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/FieldMarshaller0.cs0000644000175000017500000000742611700531646032024 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public class FieldMarshaller0 : AbstractFieldMarshaller { public override int MarshalledLength(ObjectContainerBase stream, ClassAspect aspect ) { int len = stream.StringIO().ShortLength(aspect.GetName()); if (aspect is FieldMetadata) { FieldMetadata field = (FieldMetadata)aspect; if (field.NeedsArrayAndPrimitiveInfo()) { len += 1; } if (!(field is VirtualFieldMetadata)) { len += Const4.IdLength; } } return len; } protected override RawFieldSpec ReadSpec(AspectType aspectType, ObjectContainerBase stream, ByteArrayBuffer reader) { string name = StringHandler.ReadStringNoDebug(stream.Transaction.Context(), reader ); if (!aspectType.IsFieldMetadata()) { return new RawFieldSpec(aspectType, name); } if (name.IndexOf(Const4.VirtualFieldPrefix) == 0) { if (stream._handlers.VirtualFieldByName(name) != null) { return new RawFieldSpec(aspectType, name); } } int fieldTypeID = reader.ReadInt(); byte attribs = reader.ReadByte(); return new RawFieldSpec(aspectType, name, fieldTypeID, attribs); } public sealed override FieldMetadata Read(ObjectContainerBase stream, ClassMetadata containingClass, ByteArrayBuffer reader) { RawFieldSpec spec = ReadSpec(stream, reader); return FromSpec(spec, stream, containingClass); } protected virtual FieldMetadata FromSpec(RawFieldSpec spec, ObjectContainerBase stream , ClassMetadata containingClass) { if (spec == null) { return null; } string name = spec.Name(); if (spec.IsVirtualField()) { return stream._handlers.VirtualFieldByName(name); } if (spec.IsTranslator()) { return new TranslatedAspect(containingClass, name); } if (spec.IsField()) { return new FieldMetadata(containingClass, name, spec.FieldTypeID(), spec.IsPrimitive (), spec.IsArray(), spec.IsNArray()); } return new UnknownTypeHandlerAspect(containingClass, name); } public override void Write(Transaction trans, ClassMetadata clazz, ClassAspect aspect , ByteArrayBuffer writer) { writer.WriteShortString(trans, aspect.GetName()); if (!(aspect is FieldMetadata)) { return; } FieldMetadata field = (FieldMetadata)aspect; field.Alive(); if (field.IsVirtual()) { return; } ITypeHandler4 handler = field.GetHandler(); if (handler is StandardReferenceTypeHandler) { // TODO: ensure there is a test case, to make this happen if (((StandardReferenceTypeHandler)handler).ClassMetadata().GetID() == 0) { trans.Container().NeedsUpdate(clazz); } } writer.WriteInt(field.FieldTypeID()); BitMap4 bitmap = new BitMap4(3); bitmap.Set(0, field.IsPrimitive()); bitmap.Set(1, Handlers4.HandlesArray(handler)); bitmap.Set(2, Handlers4.HandlesMultidimensionalArray(handler)); // keep the order writer.WriteByte(bitmap.GetByte(0)); } public override void Defrag(ClassMetadata classMetadata, ClassAspect aspect, LatinStringIO sio, DefragmentContextImpl context) { context.IncrementStringOffset(sio); if (!(aspect is FieldMetadata)) { return; } if (((FieldMetadata)aspect).IsVirtual()) { return; } // handler ID context.CopyID(); // skip primitive/array/narray attributes context.IncrementOffset(1); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IInternalReadContext.cs0000644000175000017500000000135611700531646032730 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public interface IInternalReadContext : IReadContext, IHandlerVersionContext { IReadBuffer Buffer(IReadBuffer buffer); IReadBuffer Buffer(); ObjectContainerBase Container(); int Offset(); object Read(ITypeHandler4 handler); object ReadAtCurrentSeekPosition(ITypeHandler4 handler); IReadWriteBuffer ReadIndirectedBuffer(); void Seek(int offset); int HandlerVersion(); void NotifyNullReferenceSkipped(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/AbstractFieldMarshaller.cs0000644000175000017500000000205611700531646033422 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public abstract class AbstractFieldMarshaller : IFieldMarshaller { protected abstract RawFieldSpec ReadSpec(AspectType aspectType, ObjectContainerBase stream, ByteArrayBuffer reader); public virtual RawFieldSpec ReadSpec(ObjectContainerBase stream, ByteArrayBuffer reader) { return ReadSpec(AspectType.Field, stream, reader); } public abstract void Defrag(ClassMetadata arg1, ClassAspect arg2, LatinStringIO arg3 , DefragmentContextImpl arg4); public abstract int MarshalledLength(ObjectContainerBase arg1, ClassAspect arg2); public abstract FieldMetadata Read(ObjectContainerBase arg1, ClassMetadata arg2, ByteArrayBuffer arg3); public abstract void Write(Transaction arg1, ClassMetadata arg2, ClassAspect arg3 , ByteArrayBuffer arg4); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/UnknownTypeHandlerAspect.cs0000644000175000017500000000130211700531646033630 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Marshall { public class UnknownTypeHandlerAspect : FieldMetadata { public UnknownTypeHandlerAspect(ClassMetadata containingClass, string name) : base (containingClass, name) { } public override void DefragAspect(IDefragmentContext context) { throw new InvalidOperationException("Type handler for '" + ContainingClass() + "' could not be found. Defragment cannot proceed. " + " Please ensure all required types are available and try again."); } public override bool Alive() { return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/SlotFormat0.cs0000644000175000017500000000142211700531646031046 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public class SlotFormat0 : SlotFormat { protected override int HandlerVersion() { return 0; } public override bool IsIndirectedWithinSlot(ITypeHandler4 handler) { return false; } public override void WriteObjectClassID(ByteArrayBuffer buffer, int id) { buffer.WriteInt(id); } public override void SkipMarshallerInfo(ByteArrayBuffer reader) { } public override ObjectHeaderAttributes ReadHeaderAttributes(ByteArrayBuffer reader ) { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/SlotFormat.cs0000644000175000017500000000560611700531646030776 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public abstract class SlotFormat { private static readonly Hashtable4 _versions = new Hashtable4(); private static readonly Db4objects.Db4o.Internal.Marshall.SlotFormat CurrentSlotFormat = new SlotFormatCurrent(); static SlotFormat() { new SlotFormat0(); new SlotFormat2(); } protected SlotFormat() { _versions.Put(HandlerVersion(), this); } public static Db4objects.Db4o.Internal.Marshall.SlotFormat ForHandlerVersion(int handlerVersion) { if (handlerVersion == HandlerRegistry.HandlerVersion) { return CurrentSlotFormat; } if (handlerVersion < 0 || handlerVersion > CurrentSlotFormat.HandlerVersion()) { throw new ArgumentException(); } Db4objects.Db4o.Internal.Marshall.SlotFormat slotFormat = (Db4objects.Db4o.Internal.Marshall.SlotFormat )_versions.Get(handlerVersion); if (slotFormat != null) { return slotFormat; } return ForHandlerVersion(handlerVersion + 1); } public override bool Equals(object obj) { if (!(obj is Db4objects.Db4o.Internal.Marshall.SlotFormat)) { return false; } return HandlerVersion() == ((Db4objects.Db4o.Internal.Marshall.SlotFormat)obj).HandlerVersion (); } public override int GetHashCode() { return HandlerVersion(); } protected abstract int HandlerVersion(); public abstract bool IsIndirectedWithinSlot(ITypeHandler4 handler); public static Db4objects.Db4o.Internal.Marshall.SlotFormat Current() { return CurrentSlotFormat; } public virtual object DoWithSlotIndirection(IReadBuffer buffer, ITypeHandler4 typeHandler , IClosure4 closure) { if (!IsIndirectedWithinSlot(typeHandler)) { return closure.Run(); } return DoWithSlotIndirection(buffer, closure); } public virtual object DoWithSlotIndirection(IReadBuffer buffer, IClosure4 closure ) { int payLoadOffset = buffer.ReadInt(); buffer.ReadInt(); // length, not used int savedOffset = buffer.Offset(); object res = null; if (payLoadOffset != 0) { buffer.Seek(payLoadOffset); res = closure.Run(); } buffer.Seek(savedOffset); return res; } public virtual void WriteObjectClassID(ByteArrayBuffer buffer, int id) { buffer.WriteInt(-id); } public virtual void SkipMarshallerInfo(ByteArrayBuffer reader) { reader.IncrementOffset(1); } public virtual ObjectHeaderAttributes ReadHeaderAttributes(ByteArrayBuffer reader ) { return new ObjectHeaderAttributes(reader); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/RawClassSpec.cs0000644000175000017500000000122511700531646031227 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Marshall { /// public class RawClassSpec { private readonly string _name; private readonly int _superClassID; private readonly int _numFields; public RawClassSpec(string name, int superClassID, int numFields) { _name = name; _superClassID = superClassID; _numFields = numFields; } public virtual string Name() { return _name; } public virtual int SuperClassID() { return _superClassID; } public virtual int NumFields() { return _numFields; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/PrimitiveMarshaller1.cs0000644000175000017500000000203511700531646032741 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { public class PrimitiveMarshaller1 : PrimitiveMarshaller { public override bool UseNormalClassRead() { return false; } public override DateTime ReadDate(ByteArrayBuffer bytes) { return new DateTime(bytes.ReadLong()); } public override object ReadInteger(ByteArrayBuffer bytes) { return bytes.ReadInt(); } public override object ReadFloat(ByteArrayBuffer bytes) { return PrimitiveMarshaller0.UnmarshallFloat(bytes); } public override object ReadDouble(ByteArrayBuffer buffer) { return PrimitiveMarshaller0.UnmarshalDouble(buffer); } public override object ReadLong(ByteArrayBuffer buffer) { return buffer.ReadLong(); } public override object ReadShort(ByteArrayBuffer buffer) { return PrimitiveMarshaller0.UnmarshallShort(buffer); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/AspectType.cs0000644000175000017500000000257311700531646030765 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Marshall { /// public class AspectType { public readonly byte _id; public static readonly Db4objects.Db4o.Internal.Marshall.AspectType Field = new Db4objects.Db4o.Internal.Marshall.AspectType ((byte)1); public static readonly Db4objects.Db4o.Internal.Marshall.AspectType Translator = new Db4objects.Db4o.Internal.Marshall.AspectType((byte)2); public static readonly Db4objects.Db4o.Internal.Marshall.AspectType Typehandler = new Db4objects.Db4o.Internal.Marshall.AspectType((byte)3); private AspectType(byte id) { _id = id; } public static Db4objects.Db4o.Internal.Marshall.AspectType ForByte(byte b) { switch (b) { case 1: { return Field; } case 2: { return Translator; } case 3: { return Typehandler; } default: { throw new ArgumentException(); } } } public virtual bool IsFieldMetadata() { return IsField() || IsTranslator(); } public virtual bool IsTranslator() { return this == Db4objects.Db4o.Internal.Marshall.AspectType.Translator; } public virtual bool IsField() { return this == Db4objects.Db4o.Internal.Marshall.AspectType.Field; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/PrimitiveMarshaller.cs0000644000175000017500000000132711700531646032663 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { public abstract class PrimitiveMarshaller { public MarshallerFamily _family; public abstract bool UseNormalClassRead(); public abstract DateTime ReadDate(ByteArrayBuffer bytes); public abstract object ReadShort(ByteArrayBuffer buffer); public abstract object ReadInteger(ByteArrayBuffer buffer); public abstract object ReadFloat(ByteArrayBuffer buffer); public abstract object ReadDouble(ByteArrayBuffer buffer); public abstract object ReadLong(ByteArrayBuffer buffer); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/FieldMarshaller2.cs0000644000175000017500000000227411700531646032022 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class FieldMarshaller2 : FieldMarshaller1 { private const int AspectTypeTagLength = 1; public override int MarshalledLength(ObjectContainerBase stream, ClassAspect aspect ) { return base.MarshalledLength(stream, aspect) + AspectTypeTagLength; } protected override RawFieldSpec ReadSpec(AspectType aspectType, ObjectContainerBase stream, ByteArrayBuffer reader) { return base.ReadSpec(AspectType.ForByte(reader.ReadByte()), stream, reader); } public override void Write(Transaction trans, ClassMetadata clazz, ClassAspect aspect , ByteArrayBuffer writer) { writer.WriteByte(aspect.AspectType()._id); base.Write(trans, clazz, aspect, writer); } public override void Defrag(ClassMetadata classMetadata, ClassAspect aspect, LatinStringIO sio, DefragmentContextImpl context) { context.ReadByte(); base.Defrag(classMetadata, aspect, sio, context); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/QueryingReadContext.cs0000644000175000017500000001001111700531646032632 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal.Marshall { /// public class QueryingReadContext : AbstractReadContext, IHandlerVersionContext, IAspectVersionContext , IObjectIdContext { private readonly QCandidates _candidates; private readonly int _collectionID; private readonly int _handlerVersion; private IdObjectCollector _collector; private int _declaredAspectCount; private int _id; private QueryingReadContext(Transaction transaction, QCandidates candidates, int handlerVersion, IReadBuffer buffer, int collectionID, IdObjectCollector collector ) : base(transaction, buffer) { _candidates = candidates; _activationDepth = new LegacyActivationDepth(0); _collectionID = collectionID; _handlerVersion = handlerVersion; _collector = collector; } public QueryingReadContext(Transaction transaction, QCandidates candidates, int handlerVersion , IReadBuffer buffer, int collectionID) : this(transaction, candidates, handlerVersion , buffer, collectionID, new IdObjectCollector()) { } public QueryingReadContext(Transaction transaction, int handlerVersion, IReadBuffer buffer, int id) : this(transaction, null, handlerVersion, buffer, 0) { _id = id; } public QueryingReadContext(Transaction transaction, int handlerVersion, IReadBuffer buffer, int collectionID, IdObjectCollector collector) : this(transaction, null , handlerVersion, buffer, collectionID, collector) { } public virtual int CollectionID() { return _collectionID; } public virtual QCandidates Candidates() { return _candidates; } public override int HandlerVersion() { return _handlerVersion; } private void AddId(int id) { _collector.AddId(id); } public virtual TreeInt Ids() { return _collector.Ids(); } public virtual void Add(object obj) { int id = GetID(obj); if (id > 0) { AddId(id); return; } AddObjectWithoutId(obj); } private int GetID(object obj) { return Container().GetID(Transaction(), obj); } public virtual void ReadId(ITypeHandler4 handler) { ObjectID objectID = ObjectID.NotPossible; try { int offset = Offset(); if (handler is IReadsObjectIds) { objectID = ((IReadsObjectIds)handler).ReadObjectID(this); } if (objectID.IsValid()) { AddId(objectID._id); return; } if (objectID == ObjectID.NotPossible) { Seek(offset); // FIXME: there's no point in activating the object // just find its id // type handlers know how to do it object obj = Read(handler); if (obj != null) { int id = (int)GetID(obj); if (id > 0) { AddId(id); } else { AddObjectWithoutId(obj); } } } } catch (Exception) { } } // FIXME: Catchall private void AddObjectWithoutId(object obj) { _collector.Add(obj); } public virtual void SkipId(ITypeHandler4 handler) { if (handler is IReadsObjectIds) { ((IReadsObjectIds)handler).ReadObjectID(this); return; } // TODO: Optimize for just doing a seek here. Read(handler); } public virtual IEnumerator ObjectsWithoutId() { return _collector.Objects(); } public virtual int DeclaredAspectCount() { return _declaredAspectCount; } public virtual void DeclaredAspectCount(int count) { _declaredAspectCount = count; } public virtual IdObjectCollector Collector() { return _collector; } public virtual int ObjectId() { return _id; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/CollectIdContext.cs0000644000175000017500000000403211700531646032103 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class CollectIdContext : ObjectHeaderContext { private readonly IdObjectCollector _collector; public CollectIdContext(Transaction transaction, IdObjectCollector collector, ObjectHeader oh, IReadBuffer buffer) : base(transaction, buffer, oh) { _collector = collector; } public CollectIdContext(Transaction transaction, ObjectHeader oh, IReadBuffer buffer ) : this(transaction, new IdObjectCollector(), oh, buffer) { } public static Db4objects.Db4o.Internal.Marshall.CollectIdContext ForID(Transaction transaction, int id) { return ForID(transaction, new IdObjectCollector(), id); } public static Db4objects.Db4o.Internal.Marshall.CollectIdContext ForID(Transaction transaction, IdObjectCollector collector, int id) { StatefulBuffer reader = transaction.Container().ReadStatefulBufferById(transaction , id); if (reader == null) { return null; } ObjectHeader oh = new ObjectHeader(transaction.Container(), reader); return new Db4objects.Db4o.Internal.Marshall.CollectIdContext(transaction, collector , oh, reader); } public virtual void AddId() { int id = ReadInt(); if (id <= 0) { return; } AddId(id); } private void AddId(int id) { _collector.AddId(id); } public override Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _objectHeader.ClassMetadata(); } public virtual TreeInt Ids() { return _collector.Ids(); } public virtual void ReadID(IReadsObjectIds objectIDHandler) { ObjectID objectID = objectIDHandler.ReadObjectID(this); if (objectID.IsValid()) { AddId(objectID._id); } } public virtual IdObjectCollector Collector() { return _collector; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IdObjectCollector.cs0000644000175000017500000000126711700531646032235 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Marshall { /// public class IdObjectCollector { private TreeInt _ids; private List4 _objects; public virtual void AddId(int id) { _ids = (TreeInt)((TreeInt)Tree.Add(_ids, new TreeInt(id))); } public virtual TreeInt Ids() { return _ids; } public virtual void Add(object obj) { _objects = new List4(_objects, obj); } public virtual IEnumerator Objects() { return new Iterator4Impl(_objects); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ObjectIdContextImpl.cs0000644000175000017500000000114311700531646032546 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class ObjectIdContextImpl : ObjectHeaderContext, IObjectIdContext { private readonly int _id; public ObjectIdContextImpl(Transaction transaction, IReadBuffer buffer, ObjectHeader objectHeader, int id) : base(transaction, buffer, objectHeader) { _id = id; } public virtual int ObjectId() { return _id; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/ClassMarshaller2.cs0000644000175000017500000000115211700531646032036 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public class ClassMarshaller2 : ClassMarshaller { protected override void ReadIndex(ObjectContainerBase stream, ClassMetadata clazz , ByteArrayBuffer reader) { int indexID = reader.ReadInt(); if (indexID == 0) { return; } clazz.Index().Read(stream, indexID); } protected override int IndexIDForWriting(int indexID) { return indexID; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/IObjectIdContext.cs0000644000175000017500000000045311700531646032040 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Marshall { /// public interface IObjectIdContext : IHandlerVersionContext, IInternalReadContext { int ObjectId(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Marshall/MarshallingContextState.cs0000644000175000017500000000056111700531646033506 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Marshall { /// public class MarshallingContextState { internal readonly MarshallingBuffer _buffer; public MarshallingContextState(MarshallingBuffer buffer) { _buffer = buffer; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ISlotCopyHandler.cs0000644000175000017500000000041311700531646030313 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public interface ISlotCopyHandler { void ProcessCopy(DefragmentContextImpl context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectInfoCollectionImpl.cs0000644000175000017500000000124411700531646032013 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Internal { /// public sealed class ObjectInfoCollectionImpl : IObjectInfoCollection { public static readonly IObjectInfoCollection Empty = new Db4objects.Db4o.Internal.ObjectInfoCollectionImpl (Iterators.EmptyIterable); public IEnumerable _collection; public ObjectInfoCollectionImpl(IEnumerable collection) { _collection = collection; } public IEnumerator GetEnumerator() { return _collection.GetEnumerator(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/HandlerRegistry.cs0000644000175000017500000004575411700531646030257 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Handlers.Versions; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Replication; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// /// TODO: This class was written to make ObjectContainerBase /// leaner, so TransportObjectContainer has less members. /// All functionality of this class should become part of /// ObjectContainerBase and the functionality in /// ObjectContainerBase should delegate to independent /// modules without circular references. /// public sealed class HandlerRegistry { public const byte HandlerVersion = (byte)10; private readonly ObjectContainerBase _container; private static readonly IDb4oTypeImpl[] _db4oTypes = new IDb4oTypeImpl[] { new BlobImpl () }; private ITypeHandler4 _openArrayHandler; private ITypeHandler4 _openMultiDimensionalArrayHandler; private ITypeHandler4 _openTypeHandler; public StringHandler _stringHandler; private Hashtable4 _mapIdToTypeInfo = NewHashtable(); private Hashtable4 _mapReflectorToClassMetadata = NewHashtable(); private int _highestBuiltinTypeID = Handlers4.AnyArrayNId + 1; private readonly VirtualFieldMetadata[] _virtualFields = new VirtualFieldMetadata [3]; private readonly Hashtable4 _mapReflectorToTypeHandler = NewHashtable(); private SharedIndexedFields _indexes; internal IDb4oReplicationReferenceProvider _replicationReferenceProvider; private readonly Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor _diagnosticProcessor; public bool i_encrypt; internal byte[] i_encryptor; internal int i_lastEncryptorByte; internal readonly GenericReflector _reflector; private readonly HandlerVersionRegistry _handlerVersions; private LatinStringIO _stringIO; public IReflectClass IclassCompare; internal IReflectClass IclassDb4otype; internal IReflectClass IclassDb4otypeimpl; public IReflectClass IclassInternal; internal IReflectClass IclassUnversioned; public IReflectClass IclassObject; internal IReflectClass IclassObjectcontainer; public IReflectClass IclassStaticclass; public IReflectClass IclassString; internal IReflectClass IclassTransientclass; private PrimitiveTypeMetadata _untypedArrayMetadata; private PrimitiveTypeMetadata _untypedMultiDimensionalMetadata; internal HandlerRegistry(ObjectContainerBase container, byte stringEncoding, GenericReflector reflector) { // this is the master container and not valid // for TransportObjectContainer _handlerVersions = new HandlerVersionRegistry(this); _stringIO = BuiltInStringEncoding.StringIoForEncoding(stringEncoding, container.ConfigImpl .StringEncoding()); _container = container; container._handlers = this; _reflector = reflector; _diagnosticProcessor = container.ConfigImpl.DiagnosticProcessor(); InitClassReflectors(reflector); _indexes = new SharedIndexedFields(); _virtualFields[0] = _indexes._version; _virtualFields[1] = _indexes._uUID; _virtualFields[2] = _indexes._commitTimestamp; RegisterBuiltinHandlers(); RegisterPlatformTypes(); InitArrayHandlers(); Platform4.RegisterPlatformHandlers(container); } private void InitArrayHandlers() { ITypeHandler4 elementHandler = OpenTypeHandler(); _untypedArrayMetadata = new PrimitiveTypeMetadata(Container(), new ArrayHandler(elementHandler , false), Handlers4.AnyArrayId, IclassObject); _openArrayHandler = _untypedArrayMetadata.TypeHandler(); MapTypeInfo(Handlers4.AnyArrayId, _untypedArrayMetadata, null); _untypedMultiDimensionalMetadata = new PrimitiveTypeMetadata(Container(), new MultidimensionalArrayHandler (elementHandler, false), Handlers4.AnyArrayNId, IclassObject); _openMultiDimensionalArrayHandler = _untypedMultiDimensionalMetadata.TypeHandler( ); MapTypeInfo(Handlers4.AnyArrayNId, _untypedMultiDimensionalMetadata, null); } private void RegisterPlatformTypes() { NetTypeHandler[] handlers = Platform4.Types(_container.Reflector()); for (int i = 0; i < handlers.Length; i++) { RegisterNetTypeHandler(handlers[i]); } } public void RegisterNetTypeHandler(NetTypeHandler handler) { handler.RegisterReflector(_reflector); IGenericConverter converter = (handler is IGenericConverter) ? (IGenericConverter )handler : null; RegisterBuiltinHandler(handler.GetID(), handler, true, handler.GetName(), converter ); } private void RegisterBuiltinHandlers() { IntHandler intHandler = new IntHandler(); RegisterBuiltinHandler(Handlers4.IntId, intHandler); RegisterHandlerVersion(intHandler, 0, new IntHandler0()); LongHandler longHandler = new LongHandler(); RegisterBuiltinHandler(Handlers4.LongId, longHandler); RegisterHandlerVersion(longHandler, 0, new LongHandler0()); FloatHandler floatHandler = new FloatHandler(); RegisterBuiltinHandler(Handlers4.FloatId, floatHandler); RegisterHandlerVersion(floatHandler, 0, new FloatHandler0()); BooleanHandler booleanHandler = new BooleanHandler(); RegisterBuiltinHandler(Handlers4.BooleanId, booleanHandler); // TODO: Are we missing a boolean handler version? DoubleHandler doubleHandler = new DoubleHandler(); RegisterBuiltinHandler(Handlers4.DoubleId, doubleHandler); RegisterHandlerVersion(doubleHandler, 0, new DoubleHandler0()); ByteHandler byteHandler = new ByteHandler(); RegisterBuiltinHandler(Handlers4.ByteId, byteHandler); // TODO: Are we missing a byte handler version? CharHandler charHandler = new CharHandler(); RegisterBuiltinHandler(Handlers4.CharId, charHandler); // TODO: Are we missing a char handler version? ShortHandler shortHandler = new ShortHandler(); RegisterBuiltinHandler(Handlers4.ShortId, shortHandler); RegisterHandlerVersion(shortHandler, 0, new ShortHandler0()); _stringHandler = new StringHandler(); RegisterBuiltinHandler(Handlers4.StringId, _stringHandler); RegisterHandlerVersion(_stringHandler, 0, new StringHandler0()); DateHandler dateHandler = new DateHandler(); RegisterBuiltinHandler(Handlers4.DateId, dateHandler); RegisterHandlerVersion(dateHandler, 0, new DateHandler0()); RegisterUntypedHandlers(); RegisterCompositeHandlerVersions(); } private void RegisterUntypedHandlers() { _openTypeHandler = new Db4objects.Db4o.Internal.OpenTypeHandler(Container()); PrimitiveTypeMetadata classMetadata = new ObjectTypeMetadata(Container(), _openTypeHandler , Handlers4.UntypedId, IclassObject); Map(Handlers4.UntypedId, classMetadata, IclassObject); RegisterHandlerVersion(_openTypeHandler, 0, new OpenTypeHandler0(Container())); RegisterHandlerVersion(_openTypeHandler, 2, new OpenTypeHandler2(Container())); RegisterHandlerVersion(_openTypeHandler, 7, new OpenTypeHandler7(Container())); } private void RegisterCompositeHandlerVersions() { RegisterHandlerVersion(new StandardReferenceTypeHandler(), 0, new StandardReferenceTypeHandler0 ()); ArrayHandler arrayHandler = new ArrayHandler(); RegisterHandlerVersion(arrayHandler, 0, new ArrayHandler0()); RegisterHandlerVersion(arrayHandler, 1, new ArrayHandler1()); RegisterHandlerVersion(arrayHandler, 3, new ArrayHandler3()); RegisterHandlerVersion(arrayHandler, 5, new ArrayHandler5()); MultidimensionalArrayHandler multidimensionalArrayHandler = new MultidimensionalArrayHandler (); RegisterHandlerVersion(multidimensionalArrayHandler, 0, new MultidimensionalArrayHandler0 ()); RegisterHandlerVersion(multidimensionalArrayHandler, 3, new MultidimensionalArrayHandler3 ()); } private void RegisterBuiltinHandler(int id, IBuiltinTypeHandler handler) { RegisterBuiltinHandler(id, handler, true, null, null); } private void RegisterBuiltinHandler(int id, IBuiltinTypeHandler typeHandler, bool registerPrimitiveClass, string primitiveName, IGenericConverter converter) { typeHandler.RegisterReflector(_reflector); if (primitiveName == null) { primitiveName = typeHandler.ClassReflector().GetName(); } if (registerPrimitiveClass) { _reflector.RegisterPrimitiveClass(id, primitiveName, converter); } IReflectClass classReflector = typeHandler.ClassReflector(); PrimitiveTypeMetadata classMetadata = new PrimitiveTypeMetadata(Container(), typeHandler , id, classReflector); Map(id, classMetadata, classReflector); if (typeHandler is PrimitiveHandler) { IReflectClass primitiveClassReflector = ((PrimitiveHandler)typeHandler).PrimitiveClassReflector (); if (primitiveClassReflector != null) { MapPrimitive(0, classMetadata, primitiveClassReflector); } } } private void Map(int id, PrimitiveTypeMetadata classMetadata, IReflectClass classReflector ) { // TODO: remove when _mapIdToClassMetadata is gone MapTypeInfo(id, classMetadata, classReflector); MapPrimitive(id, classMetadata, classReflector); if (id > _highestBuiltinTypeID) { _highestBuiltinTypeID = id; } } private void MapTypeInfo(int id, ClassMetadata classMetadata, IReflectClass classReflector ) { _mapIdToTypeInfo.Put(id, new HandlerRegistry.TypeInfo(classMetadata, classReflector )); } private void MapPrimitive(int id, ClassMetadata classMetadata, IReflectClass classReflector ) { MapClassToTypeHandler(classReflector, classMetadata.TypeHandler()); if (classReflector != null) { _mapReflectorToClassMetadata.Put(classReflector, classMetadata); } } private void MapClassToTypeHandler(IReflectClass classReflector, ITypeHandler4 typeHandler ) { _mapReflectorToTypeHandler.Put(classReflector, typeHandler); } public void RegisterHandlerVersion(ITypeHandler4 handler, int version, ITypeHandler4 replacement) { if (replacement is IBuiltinTypeHandler) { ((IBuiltinTypeHandler)replacement).RegisterReflector(_reflector); } _handlerVersions.Put(handler, version, replacement); } public ITypeHandler4 CorrectHandlerVersion(ITypeHandler4 handler, int version) { return _handlerVersions.CorrectHandlerVersion(handler, version); } public static ITypeHandler4 CorrectHandlerVersion(IHandlerVersionContext context, ITypeHandler4 typeHandler, ClassMetadata classMetadata) { ITypeHandler4 correctHandlerVersion = CorrectHandlerVersion(context, typeHandler); if (typeHandler != correctHandlerVersion) { CorrectClassMetadataOn(correctHandlerVersion, classMetadata); if (correctHandlerVersion is ArrayHandler) { ArrayHandler arrayHandler = (ArrayHandler)correctHandlerVersion; CorrectClassMetadataOn(arrayHandler.DelegateTypeHandler(), classMetadata); } } return correctHandlerVersion; } private static void CorrectClassMetadataOn(ITypeHandler4 typeHandler, ClassMetadata classMetadata) { if (typeHandler is StandardReferenceTypeHandler) { StandardReferenceTypeHandler handler = (StandardReferenceTypeHandler)typeHandler; handler.ClassMetadata(classMetadata); } } internal Db4objects.Db4o.Internal.ArrayType ArrayType(object obj) { IReflectClass claxx = Reflector().ForObject(obj); if (!claxx.IsArray()) { return Db4objects.Db4o.Internal.ArrayType.None; } if (IsNDimensional(claxx)) { return Db4objects.Db4o.Internal.ArrayType.MultidimensionalArray; } return Db4objects.Db4o.Internal.ArrayType.PlainArray; } public void Decrypt(ByteArrayBuffer reader) { if (i_encrypt) { int encryptorOffSet = i_lastEncryptorByte; byte[] bytes = reader._buffer; for (int i = reader.Length() - 1; i >= 0; i--) { bytes[i] += i_encryptor[encryptorOffSet]; if (encryptorOffSet == 0) { encryptorOffSet = i_lastEncryptorByte; } else { encryptorOffSet--; } } } } public void Encrypt(ByteArrayBuffer reader) { if (i_encrypt) { byte[] bytes = reader._buffer; int encryptorOffSet = i_lastEncryptorByte; for (int i = reader.Length() - 1; i >= 0; i--) { bytes[i] -= i_encryptor[encryptorOffSet]; if (encryptorOffSet == 0) { encryptorOffSet = i_lastEncryptorByte; } else { encryptorOffSet--; } } } } public void OldEncryptionOff() { i_encrypt = false; i_encryptor = null; i_lastEncryptorByte = 0; Container().ConfigImpl.OldEncryptionOff(); } public IReflectClass ClassForID(int id) { HandlerRegistry.TypeInfo typeInfo = TypeInfoForID(id); if (typeInfo == null) { return null; } return typeInfo.classReflector; } private HandlerRegistry.TypeInfo TypeInfoForID(int id) { return (HandlerRegistry.TypeInfo)_mapIdToTypeInfo.Get(id); } private void InitClassReflectors(GenericReflector reflector) { IclassCompare = reflector.ForClass(Const4.ClassCompare); IclassDb4otype = reflector.ForClass(Const4.ClassDb4otype); IclassDb4otypeimpl = reflector.ForClass(Const4.ClassDb4otypeimpl); IclassInternal = reflector.ForClass(Const4.ClassInternal); IclassUnversioned = reflector.ForClass(Const4.ClassUnversioned); IclassObject = reflector.ForClass(Const4.ClassObject); IclassObjectcontainer = reflector.ForClass(Const4.ClassObjectcontainer); IclassStaticclass = reflector.ForClass(Const4.ClassStaticclass); IclassString = reflector.ForClass(typeof(string)); IclassTransientclass = reflector.ForClass(Const4.ClassTransientclass); Platform4.RegisterCollections(reflector); } internal void InitEncryption(Config4Impl a_config) { if (a_config.Encrypt() && a_config.Password() != null && a_config.Password().Length > 0) { i_encrypt = true; i_encryptor = new byte[a_config.Password().Length]; for (int i = 0; i < i_encryptor.Length; i++) { i_encryptor[i] = (byte)(a_config.Password()[i] & unchecked((int)(0xff))); } i_lastEncryptorByte = a_config.Password().Length - 1; return; } OldEncryptionOff(); } internal static IDb4oTypeImpl GetDb4oType(IReflectClass clazz) { for (int i = 0; i < _db4oTypes.Length; i++) { if (clazz.IsInstance(_db4oTypes[i])) { return _db4oTypes[i]; } } return null; } public ClassMetadata ClassMetadataForId(int id) { HandlerRegistry.TypeInfo typeInfo = TypeInfoForID(id); if (typeInfo == null) { return null; } return typeInfo.classMetadata; } internal ClassMetadata ClassMetadataForClass(IReflectClass clazz) { if (clazz == null) { return null; } if (clazz.IsArray()) { return IsNDimensional(clazz) ? _untypedMultiDimensionalMetadata : _untypedArrayMetadata; } return (ClassMetadata)_mapReflectorToClassMetadata.Get(clazz); } public ITypeHandler4 OpenTypeHandler() { return _openTypeHandler; } public ITypeHandler4 OpenArrayHandler(IReflectClass clazz) { if (clazz.IsArray()) { if (IsNDimensional(clazz)) { return _openMultiDimensionalArrayHandler; } return _openArrayHandler; } return null; } private bool IsNDimensional(IReflectClass clazz) { return Reflector().Array().IsNDimensional(clazz); } public ITypeHandler4 TypeHandlerForClass(IReflectClass clazz) { if (clazz == null) { return null; } if (clazz.IsArray()) { if (IsNDimensional(clazz)) { return _openMultiDimensionalArrayHandler; } return _openArrayHandler; } ITypeHandler4 cachedTypeHandler = (ITypeHandler4)_mapReflectorToTypeHandler.Get(clazz ); if (cachedTypeHandler != null) { return cachedTypeHandler; } ITypeHandler4 configuredTypeHandler = ConfiguredTypeHandler(clazz); if (Handlers4.IsValueType(configuredTypeHandler)) { return configuredTypeHandler; } return null; } public bool IsSystemHandler(int id) { return id > 0 && id <= _highestBuiltinTypeID; } public int LowestValidId() { return _highestBuiltinTypeID + 1; } public VirtualFieldMetadata VirtualFieldByName(string name) { for (int i = 0; i < _virtualFields.Length; i++) { if (name.Equals(_virtualFields[i].GetName())) { return _virtualFields[i]; } } return null; } public SharedIndexedFields Indexes() { return _indexes; } public LatinStringIO StringIO() { return _stringIO; } public void StringIO(LatinStringIO io) { _stringIO = io; } private GenericReflector Reflector() { return Container().Reflector(); } private ObjectContainerBase Container() { return _container; } private static Hashtable4 NewHashtable() { return new Hashtable4(32); } public ITypeHandler4 ConfiguredTypeHandler(IReflectClass claxx) { object cachedHandler = _mapReflectorToTypeHandler.Get(claxx); if (null != cachedHandler) { return (ITypeHandler4)cachedHandler; } ITypeHandler4 typeHandler = Container().ConfigImpl.TypeHandlerForClass(claxx, HandlerVersion ); if (typeHandler is IBuiltinTypeHandler) { ((IBuiltinTypeHandler)typeHandler).RegisterReflector(Reflector()); } if (Handlers4.IsValueType(typeHandler)) { MapClassToTypeHandler(claxx, typeHandler); } return typeHandler; } public static ITypeHandler4 CorrectHandlerVersion(IHandlerVersionContext context, ITypeHandler4 handler) { int version = context.HandlerVersion(); if (version >= HandlerVersion) { return handler; } return context.Transaction().Container().Handlers.CorrectHandlerVersion(handler, version); } public bool IsTransient(IReflectClass claxx) { return IclassTransientclass.IsAssignableFrom(claxx) || Platform4.IsTransient(claxx ); } public void TreatAsOpenType(Type clazz) { MapClassToTypeHandler(ReflectClassFor(clazz), OpenTypeHandler()); } private IReflectClass ReflectClassFor(Type clazz) { return Container().Reflector().ForClass(clazz); } public Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor DiagnosticProcessor () { return _diagnosticProcessor; } private class TypeInfo { public ClassMetadata classMetadata; public IReflectClass classReflector; public TypeInfo(ClassMetadata classMetadata_, IReflectClass classReflector_) { // TODO: remove when no longer needed in HandlerRegistry classMetadata = classMetadata_; classReflector = classReflector_; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/NullFieldMetadata.cs0000644000175000017500000000111711700531646030451 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal { /// public class NullFieldMetadata : FieldMetadata { public NullFieldMetadata() : base(null) { } /// public virtual IPreparedComparison PrepareComparison(object obj) { return Null.Instance; } public sealed override object Read(IObjectIdContext context) { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IDefragmentContext.cs0000644000175000017500000000266211700531646030672 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { public interface IDefragmentContext : IBufferContext, IMarshallingInfo, IHandlerVersionContext { ITypeHandler4 TypeHandlerForId(int id); int CopyID(); int CopyIDReturnOriginalID(); int CopySlotlessID(); int CopyUnindexedID(); void Defragment(ITypeHandler4 handler); int HandlerVersion(); void IncrementOffset(int length); bool IsLegacyHandlerVersion(); int MappedID(int origID); ByteArrayBuffer SourceBuffer(); ByteArrayBuffer TargetBuffer(); Slot AllocateTargetSlot(int length); Slot AllocateMappedTargetSlot(int sourceAddress, int length); /// int CopySlotToNewMapped(int sourceAddress, int length); /// ByteArrayBuffer SourceBufferByAddress(int sourceAddress, int length); /// ByteArrayBuffer SourceBufferById(int sourceId); void TargetWriteBytes(int address, ByteArrayBuffer buffer); IDefragmentServices Services(); ObjectContainerBase Container(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/LocalObjectContainer.cs0000644000175000017500000007276411700531646031176 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Convert; using Db4objects.Db4o.Internal.Events; using Db4objects.Db4o.Internal.Fileheader; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Qlin; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Qlin; using Sharpen; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { /// public abstract class LocalObjectContainer : ExternalObjectContainer, IInternalObjectContainer , IEmbeddedObjectContainer { protected FileHeader _fileHeader; private readonly Collection4 _dirtyClassMetadata = new Collection4(); private IFreespaceManager _freespaceManager; private bool i_isServer = false; private Lock4 _semaphoresLock = new Lock4(); private Hashtable4 _semaphores; private int _blockEndAddress; private Db4objects.Db4o.Internal.SystemData _systemData; private IIdSystem _idSystem; private readonly byte[] _pointerBuffer = new byte[Const4.PointerLength]; protected readonly ByteArrayBuffer _pointerIo = new ByteArrayBuffer(Const4.PointerLength ); internal LocalObjectContainer(IConfiguration config) : base(config) { } public override Transaction NewTransaction(Transaction parentTransaction, IReferenceSystem referenceSystem, bool isSystemTransaction) { ITransactionalIdSystem systemIdSystem = null; if (!isSystemTransaction) { systemIdSystem = SystemTransaction().IdSystem(); } IClosure4 idSystem = new _IClosure4_58(this); ITransactionalIdSystem transactionalIdSystem = NewTransactionalIdSystem(systemIdSystem , idSystem); return new LocalTransaction(this, parentTransaction, transactionalIdSystem, referenceSystem ); } private sealed class _IClosure4_58 : IClosure4 { public _IClosure4_58(LocalObjectContainer _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing.IdSystem(); } private readonly LocalObjectContainer _enclosing; } public virtual ITransactionalIdSystem NewTransactionalIdSystem(ITransactionalIdSystem systemIdSystem, IClosure4 idSystem) { return new TransactionalIdSystemImpl(new _IClosure4_69(this), idSystem, (TransactionalIdSystemImpl )systemIdSystem); } private sealed class _IClosure4_69 : IClosure4 { public _IClosure4_69(LocalObjectContainer _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing.FreespaceManager(); } private readonly LocalObjectContainer _enclosing; } public virtual IFreespaceManager FreespaceManager() { return _freespaceManager; } public virtual void BlockSizeReadFromFile(int size) { BlockSize(size); SetRegularEndAddress(FileLength()); } public virtual void SetRegularEndAddress(long address) { _blockEndAddress = _blockConverter.BytesToBlocks(address); } protected sealed override void Close2() { try { if (!_config.IsReadOnly()) { CommitTransaction(); Shutdown(); } } finally { ShutdownObjectContainer(); } } public override void Commit1(Transaction trans) { trans.Commit(); } internal virtual void ConfigureNewFile() { BlockSize(ConfigImpl.BlockSize()); _fileHeader = FileHeader.NewCurrentFileHeader(); SetRegularEndAddress(_fileHeader.Length()); NewSystemData(ConfigImpl.FreespaceSystem(), ConfigImpl.IdSystemType()); SystemData().ConverterVersion(Converter.Version); CreateStringIO(_systemData.StringEncoding()); CreateIdSystem(); InitializeClassMetadataRepository(); InitalizeWeakReferenceSupport(); GenerateNewIdentity(); AbstractFreespaceManager blockedFreespaceManager = AbstractFreespaceManager.CreateNew (this); InstallFreespaceManager(blockedFreespaceManager); InitNewClassCollection(); InitializeEssentialClasses(); _fileHeader.InitNew(this); blockedFreespaceManager.Start(0); } private void NewSystemData(byte freespaceSystemType, byte idSystemType) { _systemData = new Db4objects.Db4o.Internal.SystemData(); _systemData.StringEncoding(ConfigImpl.Encoding()); _systemData.FreespaceSystem(freespaceSystemType); _systemData.IdSystemType(idSystemType); } public override int ConverterVersion() { return _systemData.ConverterVersion(); } public override long CurrentVersion() { return _timeStampIdGenerator.Last(); } internal virtual void InitNewClassCollection() { // overridden in YapObjectCarrier to do nothing ClassCollection().InitTables(1); } public BTree CreateBTreeClassIndex(int id) { return new BTree(_transaction, id, new IDHandler()); } public AbstractQueryResult NewQueryResult(Transaction trans) { return NewQueryResult(trans, Config().EvaluationMode()); } public sealed override AbstractQueryResult NewQueryResult(Transaction trans, QueryEvaluationMode mode) { if (trans == null) { throw new ArgumentNullException(); } if (mode == QueryEvaluationMode.Immediate) { return new IdListQueryResult(trans); } return new HybridQueryResult(trans, mode); } public sealed override bool Delete4(Transaction transaction, ObjectReference @ref , object obj, int cascade, bool userCall) { int id = @ref.GetID(); StatefulBuffer reader = ReadStatefulBufferById(transaction, id); if (reader != null) { if (obj != null) { if ((!ShowInternalClasses()) && Const4.ClassInternal.IsAssignableFrom(obj.GetType ())) { return false; } } reader.SetCascadeDeletes(cascade); transaction.IdSystem().NotifySlotDeleted(id, SlotChangeFactory.UserObjects); ClassMetadata classMetadata = @ref.ClassMetadata(); classMetadata.Delete(reader, obj); return true; } return false; } public abstract long FileLength(); public abstract string FileName(); public virtual void Free(Slot slot) { if (slot.IsNull()) { return; } // TODO: This should really be an IllegalArgumentException but old database files // with index-based FreespaceManagers appear to deliver zeroed slots. // throw new IllegalArgumentException(); if (_freespaceManager == null) { // Can happen on early free before freespacemanager // is up, during conversion. return; } if (DTrace.enabled) { DTrace.FileFree.LogLength(slot.Address(), slot.Length()); } _freespaceManager.Free(slot); } public virtual void Free(int address, int a_length) { Free(new Slot(address, a_length)); } public virtual void GenerateNewIdentity() { lock (_lock) { SetIdentity(Db4oDatabase.Generate()); } } public override AbstractQueryResult QueryAllObjects(Transaction trans) { return GetAll(trans, Config().EvaluationMode()); } public virtual AbstractQueryResult GetAll(Transaction trans, QueryEvaluationMode mode) { AbstractQueryResult queryResult = NewQueryResult(trans, mode); queryResult.LoadFromClassIndexes(ClassCollection().Iterator()); return queryResult; } public virtual int AllocatePointerSlot() { int id = AllocateSlot(Const4.PointerLength).Address(); if (!IsValidPointer(id)) { return AllocatePointerSlot(); } // write a zero pointer first // to prevent delete interaction trouble WritePointer(id, Slot.Zero); if (DTrace.enabled) { DTrace.GetPointerSlot.Log(id); } return id; } protected virtual bool IsValidPointer(int id) { // We have to make sure that object IDs do not collide // with built-in type IDs. return !_handlers.IsSystemHandler(id); } public virtual Slot AllocateSlot(int length) { if (length <= 0) { throw new ArgumentException(); } if (_freespaceManager != null && _freespaceManager.IsStarted()) { Slot slot = _freespaceManager.AllocateSlot(length); if (slot != null) { if (DTrace.enabled) { DTrace.GetSlot.LogLength(slot.Address(), slot.Length()); } return slot; } while (GrowDatabaseByConfiguredSize()) { slot = _freespaceManager.AllocateSlot(length); if (slot != null) { if (DTrace.enabled) { DTrace.GetSlot.LogLength(slot.Address(), slot.Length()); } return slot; } } } Slot appendedSlot = AppendBytes(length); if (DTrace.enabled) { DTrace.GetSlot.LogLength(appendedSlot.Address(), appendedSlot.Length()); } return appendedSlot; } private bool GrowDatabaseByConfiguredSize() { int reservedStorageSpace = ConfigImpl.DatabaseGrowthSize(); if (reservedStorageSpace <= 0) { return false; } int reservedBlocks = _blockConverter.BytesToBlocks(reservedStorageSpace); int reservedBytes = _blockConverter.BlocksToBytes(reservedBlocks); Slot slot = new Slot(_blockEndAddress, reservedBlocks); if (Debug4.xbytes && Deploy.overwrite) { OverwriteDeletedBlockedSlot(slot); } else { WriteBytes(new ByteArrayBuffer(reservedBytes), _blockEndAddress, 0); } _freespaceManager.Free(_blockConverter.ToNonBlockedLength(slot)); _blockEndAddress += reservedBlocks; return true; } public Slot AppendBytes(long bytes) { int blockCount = _blockConverter.BytesToBlocks(bytes); int blockedStartAddress = _blockEndAddress; int blockedEndAddress = _blockEndAddress + blockCount; CheckBlockedAddress(blockedEndAddress); _blockEndAddress = blockedEndAddress; Slot slot = new Slot(blockedStartAddress, blockCount); if (Debug4.xbytes && Deploy.overwrite) { OverwriteDeletedBlockedSlot(slot); } return _blockConverter.ToNonBlockedLength(slot); } private void CheckBlockedAddress(int blockedAddress) { if (blockedAddress < 0) { SwitchToReadOnlyMode(); throw new DatabaseMaximumSizeReachedException(); } } private void SwitchToReadOnlyMode() { _config.ReadOnly(true); } // When a file gets opened, it uses the file size to determine where // new slots can be appended. If this method would not be called, the // freespace system could already contain a slot that points beyond // the end of the file and this space could be allocated and used twice, // for instance if a slot was allocated and freed without ever being // written to file. internal virtual void EnsureLastSlotWritten() { if (_blockEndAddress > _blockConverter.BytesToBlocks(FileLength())) { StatefulBuffer writer = CreateStatefulBuffer(SystemTransaction(), _blockEndAddress - 1, BlockSize()); writer.Write(); } } public override Db4oDatabase Identity() { return _systemData.Identity(); } public virtual void SetIdentity(Db4oDatabase identity) { lock (Lock()) { _systemData.Identity(identity); // The dirty TimeStampIdGenerator triggers writing of // the variable part of the systemdata. We need to // make it dirty here, so the new identity is persisted: _timeStampIdGenerator.Generate(); _fileHeader.WriteVariablePart(this); } } internal override bool IsServer() { return i_isServer; } public sealed override int IdForNewUserObject(Transaction trans) { return trans.IdSystem().NewId(SlotChangeFactory.UserObjects); } public override void RaiseCommitTimestamp(long minimumVersion) { lock (Lock()) { _timeStampIdGenerator.SetMinimumNext(minimumVersion); } } public override StatefulBuffer ReadStatefulBufferById(Transaction a_ta, int a_id) { return ReadStatefulBufferById(a_ta, a_id, false); } public override ByteArrayBuffer[] ReadSlotBuffers(Transaction transaction, int[] ids) { ByteArrayBuffer[] buffers = new ByteArrayBuffer[ids.Length]; for (int i = 0; i < ids.Length; ++i) { if (ids[i] == 0) { buffers[i] = null; } else { buffers[i] = ReadBufferById(transaction, ids[i]); } } return buffers; } public override ByteArrayBuffer ReadBufferById(Transaction trans, int id) { return ReadBufferById(trans, id, false); } public sealed override ByteArrayBuffer ReadBufferById(Transaction trans, int id, bool lastCommitted) { if (id <= 0) { throw new ArgumentException(); } Slot slot = lastCommitted ? trans.IdSystem().CommittedSlot(id) : trans.IdSystem() .CurrentSlot(id); if (DTrace.enabled) { DTrace.SlotRead.LogLength(id, slot); } return ReadBufferBySlot(slot); } public override StatefulBuffer ReadStatefulBufferById(Transaction trans, int id, bool lastCommitted) { if (id <= 0) { throw new ArgumentException(); } Slot slot = lastCommitted ? trans.IdSystem().CommittedSlot(id) : trans.IdSystem() .CurrentSlot(id); if (DTrace.enabled) { DTrace.SlotRead.LogLength(id, slot); } return ReadStatefulBufferBySlot(trans, id, slot); } public virtual ByteArrayBuffer ReadBufferBySlot(Slot slot) { if (Slot.IsNull(slot)) { return null; } if (DTrace.enabled) { DTrace.ReadSlot.LogLength(slot.Address(), slot.Length()); } ByteArrayBuffer buffer = new ByteArrayBuffer(slot.Length()); buffer.ReadEncrypt(this, slot.Address()); return buffer; } public virtual StatefulBuffer ReadStatefulBufferBySlot(Transaction trans, int id, Slot slot) { if (Slot.IsNull(slot)) { return null; } if (DTrace.enabled) { DTrace.ReadSlot.LogLength(slot.Address(), slot.Length()); } StatefulBuffer buffer = CreateStatefulBuffer(trans, slot.Address(), slot.Length() ); buffer.SetID(id); buffer.ReadEncrypt(this, slot.Address()); return buffer; } protected override bool DoFinalize() { return _fileHeader != null; } /// internal virtual void ReadThis() { NewSystemData(AbstractFreespaceManager.FmLegacyRam, StandardIdSystemFactory.Legacy ); BlockSizeReadFromFile(1); _fileHeader = FileHeader.Read(this); if (Config().GenerateCommitTimestamps().IsUnspecified()) { Config().GenerateCommitTimestamps(_systemData.IdToTimestampIndexId() != 0); } CreateStringIO(_systemData.StringEncoding()); CreateIdSystem(); InitializeClassMetadataRepository(); InitalizeWeakReferenceSupport(); SetNextTimeStampId(SystemData().LastTimeStampID()); ClassCollection().SetID(_systemData.ClassCollectionID()); ClassCollection().Read(SystemTransaction()); Converter.Convert(new ConversionStage.ClassCollectionAvailableStage(this)); _fileHeader.ReadIdentity(this); if (_config.IsReadOnly()) { return; } if (!ConfigImpl.CommitRecoveryDisabled()) { _fileHeader.CompleteInterruptedTransaction(this); } IFreespaceManager blockedFreespaceManager = AbstractFreespaceManager.CreateNew(this , _systemData.FreespaceSystem()); InstallFreespaceManager(blockedFreespaceManager); blockedFreespaceManager.Read(this, _systemData.InMemoryFreespaceSlot()); blockedFreespaceManager.Start(_systemData.BTreeFreespaceId()); _fileHeader = _fileHeader.Convert(this); if (FreespaceMigrationRequired(blockedFreespaceManager)) { MigrateFreespace(blockedFreespaceManager); } WriteHeader(true, false); if (Converter.Convert(new ConversionStage.SystemUpStage(this))) { _systemData.ConverterVersion(Converter.Version); _fileHeader.WriteVariablePart(this); Transaction.Commit(); } } private void InstallFreespaceManager(IFreespaceManager blockedFreespaceManager) { _freespaceManager = BlockSize() == 1 ? blockedFreespaceManager : new BlockAwareFreespaceManager (blockedFreespaceManager, _blockConverter); } protected virtual void CreateIdSystem() { _idSystem = StandardIdSystemFactory.NewInstance(this); } private bool FreespaceMigrationRequired(IFreespaceManager freespaceManager) { if (freespaceManager == null) { return false; } byte readSystem = _systemData.FreespaceSystem(); byte configuredSystem = ConfigImpl.FreespaceSystem(); if (freespaceManager.SystemType() == configuredSystem) { return false; } if (configuredSystem != 0) { return true; } return AbstractFreespaceManager.MigrationRequired(readSystem); } private void MigrateFreespace(IFreespaceManager oldFreespaceManager) { IFreespaceManager newFreespaceManager = AbstractFreespaceManager.CreateNew(this, ConfigImpl.FreespaceSystem()); newFreespaceManager.Start(0); SystemData().FreespaceSystem(ConfigImpl.FreespaceSystem()); InstallFreespaceManager(newFreespaceManager); AbstractFreespaceManager.Migrate(oldFreespaceManager, newFreespaceManager); _fileHeader.WriteVariablePart(this); } public sealed override void ReleaseSemaphore(string name) { ReleaseSemaphore(null, name); } public sealed override void ReleaseSemaphore(Transaction trans, string name) { lock (_lock) { if (_semaphores == null) { return; } } _semaphoresLock.Run(new _IClosure4_574(this, trans, name)); } private sealed class _IClosure4_574 : IClosure4 { public _IClosure4_574(LocalObjectContainer _enclosing, Transaction trans, string name) { this._enclosing = _enclosing; this.trans = trans; this.name = name; } public object Run() { Transaction transaction = this._enclosing.CheckTransaction(trans); if (this._enclosing._semaphores != null && transaction == this._enclosing._semaphores .Get(name)) { this._enclosing._semaphores.Remove(name); } this._enclosing._semaphoresLock.Awake(); return null; } private readonly LocalObjectContainer _enclosing; private readonly Transaction trans; private readonly string name; } public override void ReleaseSemaphores(Transaction trans) { if (_semaphores != null) { Hashtable4 semaphores = _semaphores; _semaphoresLock.Run(new _IClosure4_588(this, semaphores, trans)); } } private sealed class _IClosure4_588 : IClosure4 { public _IClosure4_588(LocalObjectContainer _enclosing, Hashtable4 semaphores, Transaction trans) { this._enclosing = _enclosing; this.semaphores = semaphores; this.trans = trans; } public object Run() { semaphores.ForEachKeyForIdentity(new _IVisitor4_589(semaphores), trans); this._enclosing._semaphoresLock.Awake(); return null; } private sealed class _IVisitor4_589 : IVisitor4 { public _IVisitor4_589(Hashtable4 semaphores) { this.semaphores = semaphores; } public void Visit(object a_object) { semaphores.Remove(a_object); } private readonly Hashtable4 semaphores; } private readonly LocalObjectContainer _enclosing; private readonly Hashtable4 semaphores; private readonly Transaction trans; } public sealed override void Rollback1(Transaction trans) { trans.Rollback(); } public sealed override void SetDirtyInSystemTransaction(PersistentBase a_object) { a_object.SetStateDirty(); a_object.CacheDirty(_dirtyClassMetadata); } public sealed override bool SetSemaphore(string name, int timeout) { return SetSemaphore(null, name, timeout); } public sealed override bool SetSemaphore(Transaction trans, string name, int timeout ) { if (name == null) { throw new ArgumentNullException(); } lock (_lock) { if (_semaphores == null) { _semaphores = new Hashtable4(10); } } BooleanByRef acquired = new BooleanByRef(); _semaphoresLock.Run(new _IClosure4_625(this, trans, name, acquired, timeout)); return acquired.value; } private sealed class _IClosure4_625 : IClosure4 { public _IClosure4_625(LocalObjectContainer _enclosing, Transaction trans, string name, BooleanByRef acquired, int timeout) { this._enclosing = _enclosing; this.trans = trans; this.name = name; this.acquired = acquired; this.timeout = timeout; } public object Run() { try { Transaction transaction = this._enclosing.CheckTransaction(trans); object candidateTransaction = this._enclosing._semaphores.Get(name); if (trans == candidateTransaction) { acquired.value = true; return null; } if (candidateTransaction == null) { this._enclosing._semaphores.Put(name, transaction); acquired.value = true; return null; } long endtime = Runtime.CurrentTimeMillis() + timeout; long waitTime = timeout; while (waitTime > 0) { this._enclosing._semaphoresLock.Awake(); this._enclosing._semaphoresLock.Snooze(waitTime); if (this._enclosing.ClassCollection() == null) { acquired.value = false; return null; } candidateTransaction = this._enclosing._semaphores.Get(name); if (candidateTransaction == null) { this._enclosing._semaphores.Put(name, transaction); acquired.value = true; return null; } waitTime = endtime - Runtime.CurrentTimeMillis(); } acquired.value = false; return null; } finally { this._enclosing._semaphoresLock.Awake(); } } private readonly LocalObjectContainer _enclosing; private readonly Transaction trans; private readonly string name; private readonly BooleanByRef acquired; private readonly int timeout; } public virtual void SetServer(bool flag) { i_isServer = flag; } public abstract void SyncFiles(); public abstract void SyncFiles(IRunnable runnable); protected override string DefaultToString() { return FileName(); } public override void Shutdown() { WriteHeader(false, true); } public void CommitTransaction() { _transaction.Commit(); } public abstract void WriteBytes(ByteArrayBuffer buffer, int blockedAddress, int addressOffset ); public sealed override void WriteDirtyClassMetadata() { WriteCachedDirty(); } private void WriteCachedDirty() { IEnumerator i = _dirtyClassMetadata.GetEnumerator(); while (i.MoveNext()) { PersistentBase dirty = (PersistentBase)i.Current; dirty.Write(SystemTransaction()); dirty.NotCachedDirty(); } _dirtyClassMetadata.Clear(); } public void WriteEncrypt(ByteArrayBuffer buffer, int address, int addressOffset) { _handlers.Encrypt(buffer); WriteBytes(buffer, address, addressOffset); _handlers.Decrypt(buffer); } public virtual void WriteHeader(bool startFileLockingThread, bool shuttingDown) { if (shuttingDown) { _freespaceManager.Write(this); _freespaceManager = null; } StatefulBuffer writer = CreateStatefulBuffer(SystemTransaction(), 0, _fileHeader. Length()); _fileHeader.WriteFixedPart(this, startFileLockingThread, shuttingDown, writer, BlockSize ()); if (shuttingDown) { EnsureLastSlotWritten(); } SyncFiles(); } public sealed override void WriteNew(Transaction trans, Pointer4 pointer, ClassMetadata classMetadata, ByteArrayBuffer buffer) { WriteEncrypt(buffer, pointer.Address(), 0); if (classMetadata == null) { return; } classMetadata.AddToIndex(trans, pointer.Id()); } // This is a reroute of writeBytes to write the free blocks // unchecked. public abstract void OverwriteDeletedBytes(int address, int length); public virtual void OverwriteDeletedBlockedSlot(Slot slot) { OverwriteDeletedBytes(slot.Address(), _blockConverter.BlocksToBytes(slot.Length() )); } public void WriteTransactionPointer(int pointer) { _fileHeader.WriteTransactionPointer(SystemTransaction(), pointer); } public Slot AllocateSlotForUserObjectUpdate(Transaction trans, int id, int length ) { Slot slot = AllocateSlot(length); trans.IdSystem().NotifySlotUpdated(id, slot, SlotChangeFactory.UserObjects); return slot; } public Slot AllocateSlotForNewUserObject(Transaction trans, int id, int length) { Slot slot = AllocateSlot(length); trans.IdSystem().NotifySlotCreated(id, slot, SlotChangeFactory.UserObjects); return slot; } public sealed override void WriteUpdate(Transaction trans, Pointer4 pointer, ClassMetadata classMetadata, ArrayType arrayType, ByteArrayBuffer buffer) { int address = pointer.Address(); if (address == 0) { address = AllocateSlotForUserObjectUpdate(trans, pointer.Id(), pointer.Length()). Address(); } WriteEncrypt(buffer, address, 0); } public virtual void SetNextTimeStampId(long val) { _timeStampIdGenerator.SetMinimumNext(val); } public override ISystemInfo SystemInfo() { return new SystemInfoFileImpl(this); } public virtual FileHeader GetFileHeader() { return _fileHeader; } public virtual void InstallDebugFreespaceManager(IFreespaceManager manager) { _freespaceManager = manager; } public virtual Db4objects.Db4o.Internal.SystemData SystemData() { return _systemData; } public override long[] GetIDsForClass(Transaction trans, ClassMetadata clazz) { IntArrayList ids = new IntArrayList(); clazz.Index().TraverseAll(trans, new _IVisitor4_792(ids)); return ids.AsLong(); } private sealed class _IVisitor4_792 : IVisitor4 { public _IVisitor4_792(IntArrayList ids) { this.ids = ids; } public void Visit(object obj) { ids.Add(((int)obj)); } private readonly IntArrayList ids; } public override IQueryResult ClassOnlyQuery(QQueryBase query, ClassMetadata clazz ) { if (!clazz.HasClassIndex()) { return new IdListQueryResult(query.Transaction()); } AbstractQueryResult queryResult = NewQueryResult(query.Transaction()); queryResult.LoadFromClassIndex(clazz); return queryResult; } public override IQueryResult ExecuteQuery(QQuery query) { AbstractQueryResult queryResult = NewQueryResult(query.Transaction()); queryResult.LoadFromQuery(query); return queryResult; } public virtual LocalTransaction LocalSystemTransaction() { return (LocalTransaction)SystemTransaction(); } public override int InstanceCount(ClassMetadata clazz, Transaction trans) { lock (Lock()) { return clazz.IndexEntryCount(trans); } } public override IObjectContainer OpenSession() { lock (Lock()) { return new ObjectContainerSession(this); } } public override bool IsDeleted(Transaction trans, int id) { return trans.IdSystem().IsDeleted(id); } public virtual void WritePointer(int id, Slot slot) { if (DTrace.enabled) { DTrace.WritePointer.Log(id); DTrace.WritePointer.LogLength(slot); } _pointerIo.Seek(0); _pointerIo.WriteInt(slot.Address()); _pointerIo.WriteInt(slot.Length()); WriteBytes(_pointerIo, id, 0); } public virtual Slot DebugReadPointerSlot(int id) { return null; } public Slot ReadPointerSlot(int id) { if (!IsValidId(id)) { throw new InvalidIDException(id); } ReadBytes(_pointerBuffer, id, Const4.PointerLength); int address = (_pointerBuffer[3] & 255) | (_pointerBuffer[2] & 255) << 8 | (_pointerBuffer [1] & 255) << 16 | _pointerBuffer[0] << 24; int length = (_pointerBuffer[7] & 255) | (_pointerBuffer[6] & 255) << 8 | (_pointerBuffer [5] & 255) << 16 | _pointerBuffer[4] << 24; if (!IsValidSlot(address, length)) { throw new InvalidSlotException(address, length, id); } return new Slot(address, length); } private bool IsValidId(int id) { return FileLength() >= id; } private bool IsValidSlot(int address, int length) { // just in case overflow long fileLength = FileLength(); bool validAddress = fileLength >= address; bool validLength = fileLength >= length; bool validSlot = fileLength >= (address + length); return validAddress && validLength && validSlot; } protected override void CloseIdSystem() { if (_idSystem != null) { _idSystem.Close(); } } public virtual IIdSystem IdSystem() { return _idSystem; } public virtual IRunnable CommitHook() { _systemData.LastTimeStampID(_timeStampIdGenerator.Last()); return _fileHeader.Commit(false); } public Slot AllocateSafeSlot(int length) { Slot reusedSlot = FreespaceManager().AllocateSafeSlot(length); if (reusedSlot != null) { return reusedSlot; } return AppendBytes(length); } public override EventRegistryImpl NewEventRegistry() { return new EventRegistryImpl(); } public virtual IQLin From(Type clazz) { return new QLinRoot(Query(), clazz); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IQueryResultIteratorFactory.cs0000644000175000017500000000045011700531646032610 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Internal.Query.Result; namespace Db4objects.Db4o.Internal { public interface IQueryResultIteratorFactory { IEnumerator NewInstance(AbstractQueryResult result); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/MessageOutput.cs0000644000175000017500000000211211700531646027733 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; namespace Db4objects.Db4o.Internal { internal sealed class MessageOutput { internal readonly TextWriter stream; internal MessageOutput(ObjectContainerBase a_stream, string msg) { stream = a_stream.ConfigImpl.OutStream(); Print(msg, true); } internal MessageOutput(string a_StringParam, int a_intParam, TextWriter a_stream, bool header) { stream = a_stream; Print(Db4objects.Db4o.Internal.Messages.Get(a_intParam, a_StringParam), header); } internal MessageOutput(string a_StringParam, int a_intParam, TextWriter a_stream) : this(a_StringParam, a_intParam, a_stream, true) { } private void Print(string msg, bool header) { if (stream != null) { if (header) { stream.WriteLine("[" + Db4oFactory.Version() + " " + DateHandlerBase.Now() + "] " ); } stream.WriteLine(" " + msg); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectContainerBase.cs0000644000175000017500000021475611700531646031015 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Events; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Metadata; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Internal.Replication; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Internal.Threading; using Db4objects.Db4o.Internal.Weakref; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Typehandlers; using Db4objects.Db4o.Types; using Sharpen; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { /// public abstract partial class ObjectContainerBase : System.IDisposable, ITransientClass , IInternal4, IObjectContainerSpec, IInternalObjectContainer { protected ClassMetadataRepository _classCollection; protected Config4Impl _config; private int _stackDepth; private readonly int _maxStackDepth; private readonly Db4objects.Db4o.Internal.References.ReferenceSystemRegistry _referenceSystemRegistry = new Db4objects.Db4o.Internal.References.ReferenceSystemRegistry(); private Tree _justPeeked; protected object _lock; private List4 _pendingClassUpdates; internal int _showInternalClasses = 0; private List4 _stillToActivate; private List4 _stillToDeactivate; private List4 _stillToSet; private bool _handlingStackLimitPendings = false; private Db4objects.Db4o.Internal.Transaction _systemTransaction; protected Db4objects.Db4o.Internal.Transaction _transaction; public HandlerRegistry _handlers; internal int _replicationCallState; internal IWeakReferenceSupport _references; private NativeQueryHandler _nativeQueryHandler; private ICallbacks _callbacks = new NullCallbacks(); protected readonly TimeStampIdGenerator _timeStampIdGenerator = new TimeStampIdGenerator (); private int _topLevelCallId = 1; private IntIdGenerator _topLevelCallIdGenerator = new IntIdGenerator(); private readonly IEnvironment _environment; private IReferenceSystemFactory _referenceSystemFactory; private string _name; protected IBlockConverter _blockConverter = new DisabledBlockConverter(); protected ObjectContainerBase(IConfiguration config) { // Collection of all classes // if (_classCollection == null) the engine is down. // the Configuration context for this ObjectContainer // Counts the number of toplevel calls into YapStream // currently used to resolve self-linking concurrency problems // in cylic links, stores only ClassMetadata objects // a value greater than 0 indicates class implementing the // "Internal" interface are visible in queries and can // be used. // used for ClassMetadata and ClassMetadataRepository // may be parent or equal to i_trans // used for Objects // all the per-YapStream references that we don't // want created in YapobjectCarrier // One of three constants in ReplicationHandler: NONE, OLD, NEW // Detailed replication variables are stored in i_handlers. // Call state has to be maintained here, so YapObjectCarrier (who shares i_handlers) does // not accidentally think it operates in a replication call. // weak reference management _lock = new object(); _config = (Config4Impl)config; _environment = CreateEnvironment(_config); _maxStackDepth = _config.MaxStackDepth(); } private IEnvironment CreateEnvironment(Config4Impl config) { ArrayList bindings = new ArrayList(); Sharpen.Collections.AddAll(bindings, config.EnvironmentContributions()); bindings.Add(this); // my(ObjectContainer.class) bindings.Add(config); // my(Configuration.class) return Environments.NewConventionBasedEnvironment(Sharpen.Collections.ToArray(bindings )); } protected virtual IEnvironment Environment() { return _environment; } /// protected void Open() { WithEnvironment(new _IRunnable_129(this)); } private sealed class _IRunnable_129 : IRunnable { public _IRunnable_129(ObjectContainerBase _enclosing) { this._enclosing = _enclosing; } public void Run() { bool ok = false; lock (this._enclosing._lock) { try { this._enclosing._name = this._enclosing.ConfigImpl.NameProvider().Name(this._enclosing ); this._enclosing.InitializeReferenceSystemFactory(this._enclosing._config); this._enclosing.InitializeTransactions(); this._enclosing.Initialize1(this._enclosing._config); this._enclosing.OpenImpl(); this._enclosing.InitializePostOpen(); this._enclosing.Callbacks().OpenOnFinished(this._enclosing); ok = true; } finally { if (!ok) { // TODO: This will swallow the causing exception if // an exception occurs during shutdown. this._enclosing.ShutdownObjectContainer(); } } } } private readonly ObjectContainerBase _enclosing; } private void InitializeReferenceSystemFactory(Config4Impl config) { _referenceSystemFactory = config.ReferenceSystemFactory(); } public virtual void WithEnvironment(IRunnable runnable) { Environments.RunWith(_environment, runnable); } /// protected abstract void OpenImpl(); public virtual IActivationDepth DefaultActivationDepth(ClassMetadata classMetadata ) { return ActivationDepthProvider().ActivationDepthFor(classMetadata, ActivationMode .Activate); } public virtual IActivationDepthProvider ActivationDepthProvider() { return ConfigImpl.ActivationDepthProvider(); } public void Activate(Db4objects.Db4o.Internal.Transaction trans, object obj) { lock (_lock) { Activate(trans, obj, DefaultActivationDepthForObject(obj)); } } public void Deactivate(Db4objects.Db4o.Internal.Transaction trans, object obj) { Deactivate(trans, obj, 1); } private IActivationDepth DefaultActivationDepthForObject(object obj) { ClassMetadata classMetadata = ClassMetadataForObject(obj); return DefaultActivationDepth(classMetadata); } public void Activate(Db4objects.Db4o.Internal.Transaction trans, object obj, IActivationDepth depth) { lock (_lock) { AsTopLevelCall(new _IFunction4_189(this, obj, depth), trans); } } private sealed class _IFunction4_189 : IFunction4 { public _IFunction4_189(ObjectContainerBase _enclosing, object obj, IActivationDepth depth) { this._enclosing = _enclosing; this.obj = obj; this.depth = depth; } public object Apply(object trans) { this._enclosing.StillToActivate(this._enclosing.ActivationContextFor(((Db4objects.Db4o.Internal.Transaction )trans), obj, depth)); this._enclosing.ActivatePending(((Db4objects.Db4o.Internal.Transaction)trans)); return null; } private readonly ObjectContainerBase _enclosing; private readonly object obj; private readonly IActivationDepth depth; } internal sealed class PendingActivation { public readonly ObjectReference @ref; public readonly IActivationDepth depth; public PendingActivation(ObjectReference ref_, IActivationDepth depth_) { this.@ref = ref_; this.depth = depth_; } } internal void ActivatePending(Transaction ta) { while (_stillToActivate != null) { // TODO: Optimize! A lightweight int array would be faster. IEnumerator i = new Iterator4Impl(_stillToActivate); _stillToActivate = null; while (i.MoveNext()) { ObjectContainerBase.PendingActivation item = (ObjectContainerBase.PendingActivation )i.Current; ObjectReference @ref = item.@ref; object obj = @ref.GetObject(); if (obj == null) { ta.RemoveReference(@ref); } else { @ref.ActivateInternal(ActivationContextFor(ta, obj, item.depth)); } } } } /// /// public virtual void Backup(string path) { Backup(ConfigImpl.Storage, path); } public virtual ActivationContext4 ActivationContextFor(Transaction ta, object obj , IActivationDepth depth) { return new ActivationContext4(ta, obj, depth); } /// /// public void Bind(Transaction trans, object obj, long id) { lock (_lock) { if (obj == null) { throw new ArgumentNullException(); } if (DTrace.enabled) { DTrace.Bind.Log(id, " ihc " + Runtime.IdentityHashCode(obj)); } trans = CheckTransaction(trans); int intID = (int)id; object oldObject = GetByID(trans, id); if (oldObject == null) { throw new ArgumentException("id"); } ObjectReference @ref = trans.ReferenceForId(intID); if (@ref == null) { throw new ArgumentException("obj"); } if (ReflectorForObject(obj) == @ref.ClassMetadata().ClassReflector()) { ObjectReference newRef = Bind2(trans, @ref, obj); newRef.VirtualAttributes(trans, false); } else { throw new Db4oException(Db4objects.Db4o.Internal.Messages.Get(57)); } } } public ObjectReference Bind2(Transaction trans, ObjectReference oldRef, object obj ) { int id = oldRef.GetID(); trans.RemoveReference(oldRef); ObjectReference newRef = new ObjectReference(ClassMetadataForObject(obj), id); newRef.SetObjectWeak(this, obj); newRef.SetStateDirty(); trans.ReferenceSystem().AddExistingReference(newRef); return newRef; } public virtual ClassMetadata ClassMetadataForObject(object obj) { return ProduceClassMetadata(ReflectorForObject(obj)); } public abstract byte BlockSize(); private bool BreakDeleteForEnum(ObjectReference reference, bool userCall) { return false; if (userCall) { return false; } if (reference == null) { return false; } return Platform4.IsEnum(Reflector(), reference.ClassMetadata().ClassReflector()); } internal virtual bool CanUpdate() { return true; } /// public void CheckClosed() { if (_classCollection == null) { throw new DatabaseClosedException(); } } /// protected void CheckReadOnly() { if (_config.IsReadOnly()) { throw new DatabaseReadOnlyException(); } } internal void ProcessPendingClassUpdates() { if (_pendingClassUpdates == null) { return; } IEnumerator i = new Iterator4Impl(_pendingClassUpdates); while (i.MoveNext()) { ClassMetadata classMetadata = (ClassMetadata)i.Current; classMetadata.SetStateDirty(); classMetadata.Write(_systemTransaction); } _pendingClassUpdates = null; } public Transaction CheckTransaction() { return CheckTransaction(null); } public Transaction CheckTransaction(Transaction ta) { CheckClosed(); if (ta != null) { return ta; } return Transaction; } public bool Close() { lock (_lock) { Callbacks().CloseOnStarted(this); if (DTrace.enabled) { DTrace.CloseCalled.Log(this.ToString()); } Close1(); return true; } } protected virtual void HandleExceptionOnClose(Exception exc) { FatalException(exc); } private void Close1() { if (IsClosed()) { return; } ProcessPendingClassUpdates(); if (StateMessages()) { LogMsg(2, ToString()); } Close2(); } protected abstract void Close2(); public void ShutdownObjectContainer() { if (DTrace.enabled) { DTrace.Close.Log(); } LogMsg(3, ToString()); lock (_lock) { CloseUserTransaction(); CloseSystemTransaction(); CloseIdSystem(); StopSession(); ShutdownDataStorage(); } } protected abstract void CloseIdSystem(); protected void CloseUserTransaction() { CloseTransaction(_transaction, false, false); } protected void CloseSystemTransaction() { CloseTransaction(_systemTransaction, true, false); } public abstract void CloseTransaction(Transaction transaction, bool isSystemTransaction , bool rollbackOnClose); protected abstract void ShutdownDataStorage(); /// /// public void Commit(Transaction trans) { lock (_lock) { if (DTrace.enabled) { DTrace.Commit.Log(); } CheckReadOnly(); AsTopLevelCall(new _IFunction4_399(this), trans); } } private sealed class _IFunction4_399 : IFunction4 { public _IFunction4_399(ObjectContainerBase _enclosing) { this._enclosing = _enclosing; } public object Apply(object trans) { this._enclosing.Commit1(((Transaction)trans)); ((Transaction)trans).CommitReferenceSystem(); return null; } private readonly ObjectContainerBase _enclosing; } private object AsTopLevelStore(IFunction4 block, Transaction trans) { trans = CheckTransaction(trans); object result = AsTopLevelCall(block, trans); if (_stackDepth == 0) { trans.ProcessDeletes(); } return result; } // should never happen - just to make compiler happy public virtual void FatalShutdown(Exception origExc) { try { StopSession(); FatalStorageShutdown(); } catch (Exception exc) { throw new CompositeDb4oException(new Exception[] { origExc, exc }); } Platform4.ThrowUncheckedException(origExc); } protected abstract void FatalStorageShutdown(); public abstract void Commit1(Transaction trans); public virtual IConfiguration Configure() { return ConfigImpl; } public virtual Config4Impl Config() { return ConfigImpl; } public abstract int ConverterVersion(); public abstract AbstractQueryResult NewQueryResult(Transaction trans, QueryEvaluationMode mode); protected void CreateStringIO(byte encoding) { StringIO(BuiltInStringEncoding.StringIoForEncoding(encoding, ConfigImpl.StringEncoding ())); } protected void InitializeTransactions() { _systemTransaction = NewSystemTransaction(); _transaction = NewUserTransaction(); } public abstract Transaction NewTransaction(Transaction parentTransaction, IReferenceSystem referenceSystem, bool isSystemTransaction); public virtual Transaction NewUserTransaction() { return NewTransaction(SystemTransaction(), CreateReferenceSystem(), false); } public virtual Transaction NewSystemTransaction() { return NewTransaction(null, CreateReferenceSystem(), true); } public abstract long CurrentVersion(); public virtual bool CreateClassMetadata(ClassMetadata classMeta, IReflectClass clazz , ClassMetadata superClassMeta) { return classMeta.Init(superClassMeta); } /// allows special handling for all Db4oType objects. /// /// allows special handling for all Db4oType objects. /// Redirected here from #set() so only instanceof check is necessary /// in the #set() method. /// /// object if handled here and #set() should not continue processing public virtual IDb4oType Db4oTypeStored(Transaction trans, object obj) { if (!(obj is Db4oDatabase)) { return null; } Db4oDatabase database = (Db4oDatabase)obj; if (trans.ReferenceForObject(obj) != null) { return database; } ShowInternalClasses(true); try { return database.Query(trans); } finally { ShowInternalClasses(false); } } /// public void Deactivate(Transaction trans, object obj, int depth) { lock (_lock) { AsTopLevelCall(new _IFunction4_516(this, obj, depth), trans); } } private sealed class _IFunction4_516 : IFunction4 { public _IFunction4_516(ObjectContainerBase _enclosing, object obj, int depth) { this._enclosing = _enclosing; this.obj = obj; this.depth = depth; } public object Apply(object trans) { this._enclosing.DeactivateInternal(((Transaction)trans), obj, this._enclosing.ActivationDepthProvider ().ActivationDepth(depth, ActivationMode.Deactivate)); return null; } private readonly ObjectContainerBase _enclosing; private readonly object obj; private readonly int depth; } private void DeactivateInternal(Transaction trans, object obj, IActivationDepth depth ) { StillToDeactivate(trans, obj, depth, true); DeactivatePending(trans); } private void DeactivatePending(Transaction trans) { while (_stillToDeactivate != null) { IEnumerator i = new Iterator4Impl(_stillToDeactivate); _stillToDeactivate = null; while (i.MoveNext()) { ObjectContainerBase.PendingActivation item = (ObjectContainerBase.PendingActivation )i.Current; item.@ref.Deactivate(trans, item.depth); } } } /// /// public void Delete(Transaction trans, object obj) { if (null == obj) { throw new ArgumentNullException(); } lock (Lock()) { trans = CheckTransaction(trans); CheckReadOnly(); Delete1(trans, obj, true); UnregisterFromTransparentPersistence(trans, obj); trans.ProcessDeletes(); } } public void Delete1(Transaction trans, object obj, bool userCall) { if (obj == null) { return; } ObjectReference @ref = trans.ReferenceForObject(obj); if (@ref == null) { return; } if (userCall) { GenerateCallIDOnTopLevel(); } AsTopLevelCall(new _IFunction4_565(this, @ref, obj, userCall), trans); } private sealed class _IFunction4_565 : IFunction4 { public _IFunction4_565(ObjectContainerBase _enclosing, ObjectReference @ref, object obj, bool userCall) { this._enclosing = _enclosing; this.@ref = @ref; this.obj = obj; this.userCall = userCall; } public object Apply(object trans) { this._enclosing.Delete2(((Transaction)trans), @ref, obj, 0, userCall); return null; } private readonly ObjectContainerBase _enclosing; private readonly ObjectReference @ref; private readonly object obj; private readonly bool userCall; } public void Delete2(Transaction trans, ObjectReference @ref, object obj, int cascade , bool userCall) { // This check is performed twice, here and in delete3, intentionally. if (BreakDeleteForEnum(@ref, userCall)) { return; } if (obj is Entry) { if (!FlagForDelete(@ref)) { return; } Delete3(trans, @ref, obj, cascade, userCall); return; } trans.Delete(@ref, @ref.GetID(), cascade); } internal void Delete3(Transaction trans, ObjectReference @ref, object obj, int cascade , bool userCall) { // The passed reference can be null, when calling from Transaction. if (@ref == null || !@ref.BeginProcessing()) { return; } // This check is performed twice, here and in delete2, intentionally. if (BreakDeleteForEnum(@ref, userCall)) { @ref.EndProcessing(); return; } if (!@ref.IsFlaggedForDelete()) { @ref.EndProcessing(); return; } ClassMetadata yc = @ref.ClassMetadata(); // We have to end processing temporarily here, otherwise the can delete callback // can't do anything at all with this object. @ref.EndProcessing(); ActivateForDeletionCallback(trans, yc, @ref, obj); if (!ObjectCanDelete(trans, yc, @ref)) { return; } @ref.BeginProcessing(); if (DTrace.enabled) { DTrace.Delete.Log(@ref.GetID()); } if (Delete4(trans, @ref, obj, cascade, userCall)) { ObjectOnDelete(trans, yc, @ref); if (ConfigImpl.MessageLevel() > Const4.State) { Message(string.Empty + @ref.GetID() + " delete " + @ref.ClassMetadata().GetName() ); } } @ref.EndProcessing(); } private void UnregisterFromTransparentPersistence(Transaction trans, object obj) { if (!(ActivationDepthProvider() is ITransparentActivationDepthProvider)) { return; } ITransparentActivationDepthProvider provider = (ITransparentActivationDepthProvider )ActivationDepthProvider(); provider.RemoveModified(obj, trans); } private void ActivateForDeletionCallback(Transaction trans, ClassMetadata classMetadata , ObjectReference @ref, object obj) { if (!@ref.IsActive() && (CaresAboutDeleting(classMetadata) || CaresAboutDeleted(classMetadata ))) { // Activate Objects for Callbacks, because in C/S mode Objects are not activated on the Server // FIXME: [TA] review activation depth IActivationDepth depth = classMetadata.AdjustCollectionDepthToBorders(new FixedActivationDepth (1)); Activate(trans, obj, depth); } } private bool CaresAboutDeleting(ClassMetadata yc) { return this._callbacks.CaresAboutDeleting() || yc.HasEventRegistered(SystemTransaction (), EventDispatchers.CanDelete); } private bool CaresAboutDeleted(ClassMetadata yc) { return this._callbacks.CaresAboutDeleted() || yc.HasEventRegistered(SystemTransaction (), EventDispatchers.Delete); } private bool ObjectCanDelete(Transaction transaction, ClassMetadata yc, IObjectInfo objectInfo) { return Callbacks().ObjectCanDelete(transaction, objectInfo) && yc.DispatchEvent(transaction , objectInfo.GetObject(), EventDispatchers.CanDelete); } private void ObjectOnDelete(Transaction transaction, ClassMetadata yc, IObjectInfo reference) { Callbacks().ObjectOnDelete(transaction, reference); yc.DispatchEvent(transaction, reference.GetObject(), EventDispatchers.Delete); } public abstract bool Delete4(Transaction ta, ObjectReference @ref, object obj, int a_cascade, bool userCall); internal virtual object Descend(Transaction trans, object obj, string[] path) { lock (_lock) { trans = CheckTransaction(trans); ObjectReference @ref = trans.ReferenceForObject(obj); if (@ref == null) { return null; } string fieldName = path[0]; if (fieldName == null) { return null; } ClassMetadata classMetadata = @ref.ClassMetadata(); ByRef foundField = new ByRef(); classMetadata.TraverseAllAspects(new _TraverseFieldCommand_693(fieldName, foundField )); FieldMetadata field = (FieldMetadata)foundField.value; if (field == null) { return null; } object child = @ref.IsActive() ? field.Get(trans, obj) : DescendMarshallingContext (trans, @ref).ReadFieldValue(field); if (path.Length == 1) { return child; } if (child == null) { return null; } string[] subPath = new string[path.Length - 1]; System.Array.Copy(path, 1, subPath, 0, path.Length - 1); return Descend(trans, child, subPath); } } private sealed class _TraverseFieldCommand_693 : TraverseFieldCommand { public _TraverseFieldCommand_693(string fieldName, ByRef foundField) { this.fieldName = fieldName; this.foundField = foundField; } protected override void Process(FieldMetadata field) { if (field.CanAddToQuery(fieldName)) { foundField.value = field; } } private readonly string fieldName; private readonly ByRef foundField; } private UnmarshallingContext DescendMarshallingContext(Transaction trans, ObjectReference @ref) { UnmarshallingContext context = new UnmarshallingContext(trans, @ref, Const4.AddToIdTree , false); context.ActivationDepth(ActivationDepthProvider().ActivationDepth(1, ActivationMode .Activate)); return context; } public virtual bool DetectSchemaChanges() { // overriden in YapClient return ConfigImpl.DetectSchemaChanges(); } public virtual bool DispatchsEvents() { return true; } protected virtual bool DoFinalize() { return true; } internal void ShutdownHook() { if (IsClosed()) { return; } if (AllOperationsCompleted()) { Db4objects.Db4o.Internal.Messages.LogErr(ConfigImpl, 50, ToString(), null); Close(); } else { ShutdownObjectContainer(); if (OperationIsProcessing()) { Db4objects.Db4o.Internal.Messages.LogErr(ConfigImpl, 24, null, null); } } } private bool OperationIsProcessing() { return _stackDepth > 0; } private bool AllOperationsCompleted() { return _stackDepth == 0; } internal virtual void FatalException(int msgID) { FatalException(null, msgID); } internal void FatalException(Exception t) { FatalException(t, Db4objects.Db4o.Internal.Messages.FatalMsgId); } internal void FatalException(Exception t, int msgID) { if (DTrace.enabled) { DTrace.FatalException.Log(t.ToString()); } Db4objects.Db4o.Internal.Messages.LogErr(ConfigImpl, (msgID == Db4objects.Db4o.Internal.Messages .FatalMsgId ? 18 : msgID), null, t); if (!IsClosed()) { ShutdownObjectContainer(); } throw new Db4oException(Db4objects.Db4o.Internal.Messages.Get(msgID)); } private bool ConfiguredForAutomaticShutDown() { return (ConfigImpl == null || ConfigImpl.AutomaticShutDown()); } internal virtual void Gc() { _references.Purge(); } public IObjectSet QueryByExample(Transaction trans, object template) { lock (_lock) { trans = CheckTransaction(trans); IQueryResult res = ((IQueryResult)AsTopLevelCall(new _IFunction4_810(this, template ), trans)); return new ObjectSetFacade(res); } } private sealed class _IFunction4_810 : IFunction4 { public _IFunction4_810(ObjectContainerBase _enclosing, object template) { this._enclosing = _enclosing; this.template = template; } public object Apply(object trans) { return this._enclosing.QueryByExampleInternal(((Transaction)trans), template); } private readonly ObjectContainerBase _enclosing; private readonly object template; } private IQueryResult QueryByExampleInternal(Transaction trans, object template) { if (template == null || template.GetType() == Const4.ClassObject || template == Const4 .ClassObject) { return QueryAllObjects(trans); } IQuery q = Query(trans); q.Constrain(template).ByExample(); return ExecuteQuery((QQuery)q); } public abstract AbstractQueryResult QueryAllObjects(Transaction ta); /// public object TryGetByID(Transaction ta, long id) { try { return GetByID(ta, id); } catch (InvalidSlotException) { } catch (InvalidIDException) { } // can happen return null // can happen return null return null; } /// /// public object GetByID(Transaction ta, long id) { lock (_lock) { if (id <= 0 || id >= int.MaxValue) { throw new ArgumentException(); } CheckClosed(); ta = CheckTransaction(ta); BeginTopLevelCall(); try { return GetByID2(ta, (int)id); } catch (Db4oRecoverableException exc) { throw; } catch (OutOfMemoryException e) { throw new Db4oRecoverableException(e); } catch (Exception e) { throw new Db4oRecoverableException(e); } finally { // Never shut down for getById() // There may be OutOfMemoryErrors or similar // The user may want to catch and continue working. EndTopLevelCall(); } } } public virtual object GetByID2(Transaction ta, int id) { object obj = ta.ObjectForIdFromCache(id); if (obj != null) { // Take care about handling the returned candidate reference. // If you loose the reference, weak reference management might // also. return obj; } return new ObjectReference(id).Read(ta, new LegacyActivationDepth(0), Const4.AddToIdTree , true); } public object GetActivatedObjectFromCache(Transaction ta, int id) { object obj = ta.ObjectForIdFromCache(id); if (obj == null) { return null; } Activate(ta, obj); return obj; } public object ReadActivatedObjectNotInCache(Transaction trans, int id) { object obj = AsTopLevelCall(new _IFunction4_892(id), trans); ActivatePending(trans); return obj; } private sealed class _IFunction4_892 : IFunction4 { public _IFunction4_892(int id) { this.id = id; } public object Apply(object trans) { return new ObjectReference(id).Read(((Transaction)trans), UnknownActivationDepth. Instance, Const4.AddToIdTree, true); } private readonly int id; } public object GetByUUID(Transaction trans, Db4oUUID uuid) { lock (_lock) { if (uuid == null) { return null; } HardObjectReference hardRef = GetHardReferenceBySignature(CheckTransaction(trans) , uuid.GetLongPart(), uuid.GetSignaturePart()); return hardRef._object; } } public virtual HardObjectReference GetHardReferenceBySignature(Transaction trans, long uuid, byte[] signature) { return UUIDIndex().GetHardObjectReferenceBySignature(trans, uuid, signature); } public int GetID(Transaction trans, object obj) { lock (_lock) { trans = CheckTransaction(trans); CheckClosed(); if (obj == null) { return 0; } ObjectReference yo = trans.ReferenceForObject(obj); if (yo != null) { return yo.GetID(); } return 0; } } public IObjectInfo GetObjectInfo(Transaction trans, object obj) { lock (_lock) { trans = CheckTransaction(trans); return trans.ReferenceForObject(obj); } } public HardObjectReference GetHardObjectReferenceById(Transaction trans, int id) { if (id <= 0) { return HardObjectReference.Invalid; } ObjectReference @ref = trans.ReferenceForId(id); if (@ref != null) { // Take care about handling the returned candidate reference. // If you loose the reference, weak reference management might also. object candidate = @ref.GetObject(); if (candidate != null) { return new HardObjectReference(@ref, candidate); } trans.RemoveReference(@ref); } @ref = new ObjectReference(id); object readObject = @ref.Read(trans, new LegacyActivationDepth(0), Const4.AddToIdTree , true); if (readObject == null) { return HardObjectReference.Invalid; } // check class creation side effect and simply retry recursively // if it hits: if (readObject != @ref.GetObject()) { return GetHardObjectReferenceById(trans, id); } return new HardObjectReference(@ref, readObject); } public StatefulBuffer CreateStatefulBuffer(Transaction trans, int address, int length ) { if (Debug4.ExceedsMaximumBlockSize(length)) { return null; } return new StatefulBuffer(trans, address, length); } public Transaction SystemTransaction() { return _systemTransaction; } public Transaction Transaction { get { return _transaction; } } public ClassMetadata ClassMetadataForReflectClass(IReflectClass claxx) { if (null == claxx) { throw new ArgumentNullException(); } if (HideClassForExternalUse(claxx)) { return null; } ClassMetadata classMetadata = _handlers.ClassMetadataForClass(claxx); if (classMetadata != null) { return classMetadata; } return _classCollection.ClassMetadataForReflectClass(claxx); } // TODO: Some ReflectClass implementations could hold a // reference to ClassMetadata to improve lookup performance here. public virtual ClassMetadata ProduceClassMetadata(IReflectClass claxx) { if (null == claxx) { throw new ArgumentNullException(); } if (HideClassForExternalUse(claxx)) { return null; } ClassMetadata classMetadata = _handlers.ClassMetadataForClass(claxx); if (classMetadata != null) { return classMetadata; } return _classCollection.ProduceClassMetadata(claxx); } /// /// Differentiating getActiveClassMetadata from getYapClass is a tuning /// optimization: If we initialize a YapClass, #set3() has to check for /// the possibility that class initialization associates the currently /// stored object with a previously stored static object, causing the /// object to be known afterwards. /// /// /// Differentiating getActiveClassMetadata from getYapClass is a tuning /// optimization: If we initialize a YapClass, #set3() has to check for /// the possibility that class initialization associates the currently /// stored object with a previously stored static object, causing the /// object to be known afterwards. /// In this call we only return active YapClasses, initialization /// is not done on purpose /// internal ClassMetadata GetActiveClassMetadata(IReflectClass claxx) { if (HideClassForExternalUse(claxx)) { return null; } return _classCollection.GetActiveClassMetadata(claxx); } private bool HideClassForExternalUse(IReflectClass claxx) { if ((!ShowInternalClasses()) && _handlers.IclassInternal.IsAssignableFrom(claxx)) { return true; } return false; } public virtual int ClassMetadataIdForName(string name) { return _classCollection.ClassMetadataIdForName(name); } public virtual ClassMetadata ClassMetadataForName(string name) { return ClassMetadataForID(ClassMetadataIdForName(name)); } public virtual ClassMetadata ClassMetadataForID(int id) { if (DTrace.enabled) { DTrace.ClassmetadataById.Log(id); } if (id == 0) { return null; } ClassMetadata classMetadata = _handlers.ClassMetadataForId(id); if (classMetadata != null) { return classMetadata; } return _classCollection.ClassMetadataForId(id); } public virtual HandlerRegistry Handlers { get { return _handlers; } } public virtual bool NeedsLockFileThread() { if (!Platform4.NeedsLockFileThread()) { return false; } if (ConfigImpl.IsReadOnly()) { return false; } return ConfigImpl.LockFile(); } protected virtual bool HasShutDownHook() { return ConfigImpl.AutomaticShutDown(); } protected virtual void Initialize1(IConfiguration config) { _config = InitializeConfig(config); _handlers = new HandlerRegistry(this, ConfigImpl.Encoding(), ConfigImpl.Reflector ()); if (_references != null) { Gc(); _references.Stop(); } _references = WeakReferenceSupportFactory.ForObjectContainer(this); if (HasShutDownHook()) { Platform4.AddShutDownHook(this); } _handlers.InitEncryption(ConfigImpl); _stillToSet = null; } private Config4Impl InitializeConfig(IConfiguration config) { Config4Impl impl = ((Config4Impl)config); impl.Container(this); impl.Reflector().SetTransaction(SystemTransaction()); impl.Reflector().Configuration(new ReflectorConfigurationImpl(impl)); impl.Taint(); return impl; } public virtual IReferenceSystem CreateReferenceSystem() { IReferenceSystem referenceSystem = _referenceSystemFactory.NewReferenceSystem(this ); _referenceSystemRegistry.AddReferenceSystem(referenceSystem); return referenceSystem; } protected virtual void InitalizeWeakReferenceSupport() { _references.Start(); } protected virtual void InitializeClassMetadataRepository() { _classCollection = new ClassMetadataRepository(_systemTransaction); } private void InitializePostOpen() { _showInternalClasses = 100000; InitializePostOpenExcludingTransportObjectContainer(); _showInternalClasses = 0; } protected virtual void InitializePostOpenExcludingTransportObjectContainer() { InitializeEssentialClasses(); Rename(ConfigImpl); _classCollection.InitOnUp(_systemTransaction); if (ConfigImpl.DetectSchemaChanges()) { if (!ConfigImpl.IsReadOnly()) { _systemTransaction.Commit(); } } ConfigImpl.ApplyConfigurationItems(this); } internal virtual void InitializeEssentialClasses() { for (int i = 0; i < Const4.EssentialClasses.Length; i++) { ProduceClassMetadata(Reflector().ForClass(Const4.EssentialClasses[i])); } } internal bool IsActive(Transaction trans, object obj) { lock (_lock) { trans = CheckTransaction(trans); if (obj != null) { ObjectReference @ref = trans.ReferenceForObject(obj); if (@ref != null) { return @ref.IsActive(); } } return false; } } public virtual bool IsCached(Transaction trans, long id) { lock (_lock) { trans = CheckTransaction(trans); return trans.ObjectForIdFromCache((int)id) != null; } } /// /// overridden in ClientObjectContainer /// The method allows checking whether will make it easier to refactor than /// an "instanceof YapClient" check. /// /// /// overridden in ClientObjectContainer /// The method allows checking whether will make it easier to refactor than /// an "instanceof YapClient" check. /// public virtual bool IsClient { get { return false; } } public bool IsClosed() { lock (_lock) { // this is set to null in close2 and is therefore our check for down. return _classCollection == null; } } internal virtual bool IsServer() { return false; } public bool IsStored(Transaction trans, object obj) { lock (_lock) { trans = CheckTransaction(trans); if (obj == null) { return false; } ObjectReference @ref = trans.ReferenceForObject(obj); if (@ref == null) { return false; } return !IsDeleted(trans, @ref.GetID()); } } public virtual IReflectClass[] KnownClasses() { lock (_lock) { CheckClosed(); return Reflector().KnownClasses(); } } public virtual ITypeHandler4 TypeHandlerForClass(IReflectClass claxx) { if (HideClassForExternalUse(claxx)) { return null; } ITypeHandler4 typeHandler = _handlers.TypeHandlerForClass(claxx); if (typeHandler != null) { return typeHandler; } return _classCollection.ProduceClassMetadata(claxx).TypeHandler(); } public virtual ITypeHandler4 TypeHandlerForClassMetadataID(int id) { if (id < 1) { return null; } ClassMetadata classMetadata = ClassMetadataForID(id); if (classMetadata == null) { return null; } return classMetadata.TypeHandler(); } public virtual object Lock() { return _lock; } public void LogMsg(int code, string msg) { Db4objects.Db4o.Internal.Messages.LogMsg(ConfigImpl, code, msg); } public virtual bool MaintainsIndices() { return true; } internal virtual void Message(string msg) { new MessageOutput(this, msg); } public void NeedsUpdate(ClassMetadata classMetadata) { _pendingClassUpdates = new List4(_pendingClassUpdates, classMetadata); } public virtual long GenerateTimeStampId() { return _timeStampIdGenerator.Generate(); } public abstract int IdForNewUserObject(Transaction trans); /// public virtual object PeekPersisted(Transaction trans, object obj, IActivationDepth depth, bool committed) { // TODO: peekPersisted is not stack overflow safe, if depth is too high. lock (_lock) { CheckClosed(); return AsTopLevelCall(new _IFunction4_1271(this, obj, committed, depth), trans); } } private sealed class _IFunction4_1271 : IFunction4 { public _IFunction4_1271(ObjectContainerBase _enclosing, object obj, bool committed , IActivationDepth depth) { this._enclosing = _enclosing; this.obj = obj; this.committed = committed; this.depth = depth; } public object Apply(object trans) { trans = this._enclosing.CheckTransaction(((Transaction)trans)); ObjectReference @ref = ((Transaction)trans).ReferenceForObject(obj); trans = committed ? this._enclosing._systemTransaction : ((Transaction)trans); object cloned = null; if (@ref != null) { cloned = this._enclosing.PeekPersisted(((Transaction)trans), @ref.GetID(), depth, true); } return cloned; } private readonly ObjectContainerBase _enclosing; private readonly object obj; private readonly bool committed; private readonly IActivationDepth depth; } public object PeekPersisted(Transaction trans, int id, IActivationDepth depth, bool resetJustPeeked) { if (resetJustPeeked) { _justPeeked = null; } else { TreeInt ti = new TreeInt(id); TreeIntObject tio = (TreeIntObject)Tree.Find(_justPeeked, ti); if (tio != null) { return tio._object; } } ObjectReference @ref = PeekReference(trans, id, depth, resetJustPeeked); return @ref.GetObject(); } public virtual ObjectReference PeekReference(Transaction trans, int id, IActivationDepth depth, bool resetJustPeeked) { ObjectReference @ref = new ObjectReference(id); @ref.PeekPersisted(trans, depth); if (resetJustPeeked) { _justPeeked = null; } return @ref; } internal virtual void Peeked(int id, object obj) { _justPeeked = Tree.Add(_justPeeked, new TreeIntObject(id, obj)); } public virtual void Purge() { lock (_lock) { CheckClosed(); Runtime.Gc(); Runtime.RunFinalization(); Runtime.Gc(); Gc(); _classCollection.Purge(); } } public void Purge(Transaction trans, object obj) { lock (_lock) { trans = CheckTransaction(trans); trans.RemoveObjectFromReferenceSystem(obj); } } internal void RemoveFromAllReferenceSystems(object obj) { if (obj == null) { return; } if (obj is ObjectReference) { _referenceSystemRegistry.RemoveReference((ObjectReference)obj); return; } _referenceSystemRegistry.RemoveObject(obj); } public NativeQueryHandler GetNativeQueryHandler() { lock (_lock) { if (null == _nativeQueryHandler) { _nativeQueryHandler = new NativeQueryHandler(this); } return _nativeQueryHandler; } } public IObjectSet Query(Transaction trans, Predicate predicate) { return Query(trans, predicate, (IQueryComparator)null); } public IObjectSet Query(Transaction trans, Predicate predicate, IQueryComparator comparator) { lock (_lock) { return GetNativeQueryHandler().Execute(Query(trans), predicate, comparator); } } public IObjectSet Query(Transaction trans, Type clazz) { return QueryByExample(trans, clazz); } public IQuery Query(Transaction ta) { return new QQuery(CheckTransaction(ta), null, null); } public abstract void RaiseCommitTimestamp(long minimumTimestamp); /// public abstract void ReadBytes(byte[] a_bytes, int a_address, int a_length); /// public abstract void ReadBytes(byte[] bytes, int address, int addressOffset, int length); /// public ByteArrayBuffer DecryptedBufferByAddress(int address, int length) { ByteArrayBuffer reader = RawBufferByAddress(address, length); _handlers.Decrypt(reader); return reader; } public virtual ByteArrayBuffer RawBufferByAddress(int address, int length) { CheckAddress(address); ByteArrayBuffer reader = new ByteArrayBuffer(length); ReadBytes(reader._buffer, address, length); return reader; } /// private void CheckAddress(int address) { if (address <= 0) { throw new ArgumentException("Invalid address offset: " + address); } } /// public StatefulBuffer ReadWriterByAddress(Transaction a_trans, int address, int length ) { CheckAddress(address); StatefulBuffer reader = CreateStatefulBuffer(a_trans, address, length); reader.ReadEncrypt(this, address); return reader; } public abstract StatefulBuffer ReadStatefulBufferById(Transaction trans, int id); public abstract StatefulBuffer ReadStatefulBufferById(Transaction trans, int id, bool lastCommitted); public abstract ByteArrayBuffer ReadBufferById(Transaction trans, int id); public abstract ByteArrayBuffer ReadBufferById(Transaction trans, int id, bool lastCommitted ); public abstract ByteArrayBuffer[] ReadSlotBuffers(Transaction trans, int[] ids); private void Reboot() { Commit(null); Close(); Open(); } public virtual GenericReflector Reflector() { return _handlers._reflector; } public void Refresh(Transaction trans, object obj, int depth) { lock (_lock) { RefreshInternal(trans, obj, depth); } } protected virtual void RefreshInternal(Transaction trans, object obj, int depth) { Activate(trans, obj, RefreshActivationDepth(depth)); } private IActivationDepth RefreshActivationDepth(int depth) { return ActivationDepthProvider().ActivationDepth(depth, ActivationMode.Refresh); } public abstract void ReleaseSemaphore(string name); public virtual void FlagAsHandled(ObjectReference @ref) { @ref.FlagAsHandled(_topLevelCallId); } internal virtual bool FlagForDelete(ObjectReference @ref) { if (@ref == null) { return false; } if (HandledInCurrentTopLevelCall(@ref)) { return false; } @ref.FlagForDelete(_topLevelCallId); return true; } public abstract void ReleaseSemaphores(Transaction ta); internal virtual void Rename(Config4Impl config) { bool renamedOne = false; if (config.Rename() != null) { renamedOne = ApplyRenames(config); } _classCollection.CheckChanges(); if (renamedOne) { Reboot(); } } protected virtual bool ApplyRenames(Config4Impl config) { bool renamed = false; IEnumerator i = config.Rename().GetEnumerator(); while (i.MoveNext()) { Rename ren = (Rename)i.Current; if (AlreadyApplied(ren)) { continue; } if (ApplyRename(ren)) { renamed = true; } } return renamed; } private bool ApplyRename(Rename ren) { if (ren.IsField()) { return ApplyFieldRename(ren); } return ApplyClassRename(ren); } private bool ApplyClassRename(Rename ren) { ClassMetadata classToRename = _classCollection.GetClassMetadata(ren.rFrom); if (classToRename == null) { return false; } ClassMetadata existing = _classCollection.GetClassMetadata(ren.rTo); if (existing != null) { LogMsg(9, "class " + ren.rTo); return false; } classToRename.SetName(ren.rTo); CommitRenameFor(ren, classToRename); return true; } private bool ApplyFieldRename(Rename ren) { ClassMetadata parentClass = _classCollection.GetClassMetadata(ren.rClass); if (parentClass == null) { return false; } if (!parentClass.RenameField(ren.rFrom, ren.rTo)) { return false; } CommitRenameFor(ren, parentClass); return true; } private void CommitRenameFor(Rename rename, ClassMetadata classMetadata) { SetDirtyInSystemTransaction(classMetadata); LogMsg(8, rename.rFrom + " to " + rename.rTo); DeleteInverseRenames(rename); // store the rename, so we only do it once Store(SystemTransaction(), rename); } private void DeleteInverseRenames(Rename rename) { // delete all that rename from the new name // to allow future backswitching IObjectSet inverseRenames = QueryInverseRenames(rename); while (inverseRenames.HasNext()) { Delete(SystemTransaction(), inverseRenames.Next()); } } private IObjectSet QueryInverseRenames(Rename ren) { return QueryByExample(SystemTransaction(), Renames.ForInverseQBE(ren)); } private bool AlreadyApplied(Rename ren) { return QueryByExample(SystemTransaction(), ren).Count != 0; } public bool HandledInCurrentTopLevelCall(ObjectReference @ref) { return @ref.IsFlaggedAsHandled(_topLevelCallId); } public abstract void Reserve(int byteCount); public void Rollback(Transaction trans) { lock (_lock) { trans = CheckTransaction(trans); CheckReadOnly(); Rollback1(trans); trans.RollbackReferenceSystem(); } } public abstract void Rollback1(Transaction trans); /// public virtual void Send(object obj) { // TODO: implement throw new NotSupportedException(); } /// /// public void Store(Transaction trans, object obj) { Store(trans, obj, UpdateDepthProvider().Unspecified(NullModifiedObjectQuery.Instance )); } /// /// public int Store(Transaction trans, object obj, IUpdateDepth depth) { lock (_lock) { try { ShowInternalClasses(true); return StoreInternal(trans, obj, depth, true); } finally { ShowInternalClasses(false); } } } /// /// public int StoreInternal(Transaction trans, object obj, bool checkJustSet) { return StoreInternal(trans, obj, UpdateDepthProvider().Unspecified(NullModifiedObjectQuery .Instance), checkJustSet); } /// /// public virtual int StoreInternal(Transaction trans, object obj, IUpdateDepth depth , bool checkJustSet) { CheckReadOnly(); return (((int)AsTopLevelStore(new _IFunction4_1599(this, obj, depth, checkJustSet ), trans))); } private sealed class _IFunction4_1599 : IFunction4 { public _IFunction4_1599(ObjectContainerBase _enclosing, object obj, IUpdateDepth depth, bool checkJustSet) { this._enclosing = _enclosing; this.obj = obj; this.depth = depth; this.checkJustSet = checkJustSet; } public object Apply(object trans) { return this._enclosing.StoreAfterReplication(((Transaction)trans), obj, depth, checkJustSet ); } private readonly ObjectContainerBase _enclosing; private readonly object obj; private readonly IUpdateDepth depth; private readonly bool checkJustSet; } public int StoreAfterReplication(Transaction trans, object obj, IUpdateDepth depth , bool checkJust) { if (obj is IDb4oType) { IDb4oType db4oType = Db4oTypeStored(trans, obj); if (db4oType != null) { return GetID(trans, db4oType); } } return Store2(trans, obj, depth, checkJust); } public void StoreByNewReplication(IDb4oReplicationReferenceProvider referenceProvider , object obj) { lock (_lock) { _replicationCallState = Const4.New; _handlers._replicationReferenceProvider = referenceProvider; try { Store2(CheckTransaction(), obj, UpdateDepthProvider().ForDepth(1), false); } finally { _replicationCallState = Const4.None; _handlers._replicationReferenceProvider = null; } } } public virtual void CheckStillToSet() { List4 postponedStillToSet = null; while (_stillToSet != null) { IEnumerator i = new Iterator4Impl(_stillToSet); _stillToSet = null; while (i.MoveNext()) { ObjectContainerBase.PendingSet item = (ObjectContainerBase.PendingSet)i.Current; ObjectReference @ref = item.@ref; Transaction trans = item.transaction; if (!@ref.ContinueSet(trans, item.depth)) { postponedStillToSet = new List4(postponedStillToSet, item); } } } _stillToSet = postponedStillToSet; } internal virtual void NotStorable(IReflectClass claxx, object obj) { if (!ConfigImpl.ExceptionsOnNotStorable()) { return; } if (claxx == null) { throw new ObjectNotStorableException(obj.ToString()); } if (_handlers.IsTransient(claxx)) { return; } throw new ObjectNotStorableException(claxx); } public int Store2(Transaction trans, object obj, IUpdateDepth updateDepth, bool checkJustSet ) { if (obj == null || (obj is ITransientClass)) { return 0; } ObjectAnalyzer analyzer = new ObjectAnalyzer(this, obj); analyzer.Analyze(trans); if (analyzer.NotStorable()) { return 0; } ObjectReference @ref = analyzer.ObjectReference(); if (@ref == null) { ClassMetadata classMetadata = analyzer.ClassMetadata(); if (!ObjectCanNew(trans, classMetadata, obj)) { return 0; } @ref = new ObjectReference(); @ref.Store(trans, classMetadata, obj); trans.AddNewReference(@ref); if (obj is IDb4oTypeImpl) { ((IDb4oTypeImpl)obj).SetTrans(trans); } if (ConfigImpl.MessageLevel() > Const4.State) { Message(string.Empty + @ref.GetID() + " new " + @ref.ClassMetadata().GetName()); } FlagAsHandled(@ref); StillToSet(trans, @ref, updateDepth); } else { if (@ref.IsFlaggedAsHandled(_topLevelCallId)) { AssertNotInCallback(); } if (CanUpdate()) { if (checkJustSet) { if ((!@ref.IsNew()) && HandledInCurrentTopLevelCall(@ref)) { return @ref.GetID(); } } if (updateDepth.SufficientDepth()) { FlagAsHandled(@ref); @ref.WriteUpdate(trans, updateDepth); } } } ProcessPendingClassUpdates(); return @ref.GetID(); } private void AssertNotInCallback() { if (InCallback.Value()) { throw new Db4oIllegalStateException("Objects must not be updated in callback"); } } private bool ObjectCanNew(Transaction transaction, ClassMetadata yc, object obj) { return Callbacks().ObjectCanNew(transaction, obj) && yc.DispatchEvent(transaction , obj, EventDispatchers.CanNew); } public abstract void SetDirtyInSystemTransaction(PersistentBase a_object); public abstract bool SetSemaphore(string name, int timeout); public abstract bool SetSemaphore(Transaction trans, string name, int timeout); public abstract void ReleaseSemaphore(Transaction trans, string name); internal virtual void StringIO(LatinStringIO io) { _handlers.StringIO(io); } internal bool ShowInternalClasses() { return IsServer() || _showInternalClasses > 0; } /// /// Objects implementing the "Internal4" marker interface are /// not visible to queries, unless this flag is set to true. /// /// /// Objects implementing the "Internal4" marker interface are /// not visible to queries, unless this flag is set to true. /// The caller should reset the flag after the call. /// public virtual void ShowInternalClasses(bool show) { lock (this) { if (show) { _showInternalClasses++; } else { _showInternalClasses--; } if (_showInternalClasses < 0) { _showInternalClasses = 0; } } } private bool StackIsSmall() { return _stackDepth < _maxStackDepth; } internal virtual bool StateMessages() { return true; } // overridden to do nothing in YapObjectCarrier internal List4 StillTo1(Transaction trans, List4 still, object obj, IActivationDepth depth) { if (obj == null || !depth.RequiresActivation()) { return still; } ObjectReference @ref = trans.ReferenceForObject(obj); if (@ref != null) { if (HandledInCurrentTopLevelCall(@ref)) { return still; } FlagAsHandled(@ref); return new List4(still, new ObjectContainerBase.PendingActivation(@ref, depth)); } IReflectClass clazz = ReflectorForObject(obj); if (clazz.IsArray()) { if (!clazz.GetComponentType().IsPrimitive()) { IEnumerator arr = ArrayHandler.Iterator(clazz, obj); while (arr.MoveNext()) { object current = arr.Current; if (current == null) { continue; } ClassMetadata classMetadata = ClassMetadataForObject(current); still = StillTo1(trans, still, current, depth.Descend(classMetadata)); } } return still; } else { if (obj is Entry) { still = StillTo1(trans, still, ((Entry)obj).key, depth); still = StillTo1(trans, still, ((Entry)obj).value, depth); } else { if (depth.Mode().IsDeactivate()) { // Special handling to deactivate .net structs ClassMetadata metadata = ClassMetadataForObject(obj); if (metadata != null && metadata.IsStruct()) { metadata.ForceDeactivation(trans, depth, obj); } } } } return still; } public void StillToActivate(IActivationContext context) { // TODO: We don't want the simple classes to search the hc_tree // Kick them out here. // if (a_object != null) { // Class clazz = a_object.getClass(); // if(! clazz.isPrimitive()){ if (ProcessedByImmediateActivation(context)) { return; } _stillToActivate = StillTo1(context.Transaction(), _stillToActivate, context.TargetObject (), context.Depth()); } private bool ProcessedByImmediateActivation(IActivationContext context) { if (!StackIsSmall()) { return false; } if (!context.Depth().RequiresActivation()) { return true; } ObjectReference @ref = context.Transaction().ReferenceForObject(context.TargetObject ()); if (@ref == null) { return false; } if (HandledInCurrentTopLevelCall(@ref)) { return true; } FlagAsHandled(@ref); IncStackDepth(); try { @ref.ActivateInternal(context); } finally { DecStackDepth(); } return true; } private int DecStackDepth() { int i = _stackDepth--; if (StackIsSmall() && !_handlingStackLimitPendings) { _handlingStackLimitPendings = true; try { HandleStackLimitPendings(); } finally { _handlingStackLimitPendings = false; } } return i; } private void HandleStackLimitPendings() { CheckStillToSet(); } // activatePending(); // deactivatePending(); private int IncStackDepth() { return _stackDepth++; } public void StillToDeactivate(Transaction trans, object a_object, IActivationDepth a_depth, bool a_forceUnknownDeactivate) { _stillToDeactivate = StillTo1(trans, _stillToDeactivate, a_object, a_depth); } internal class PendingSet { public readonly Transaction transaction; public readonly ObjectReference @ref; public readonly IUpdateDepth depth; public PendingSet(Transaction transaction_, ObjectReference ref_, IUpdateDepth depth_ ) { this.transaction = transaction_; this.@ref = ref_; this.depth = depth_; } } internal virtual void StillToSet(Transaction transaction, ObjectReference @ref, IUpdateDepth updateDepth) { if (StackIsSmall()) { if (@ref.ContinueSet(transaction, updateDepth)) { return; } } _stillToSet = new List4(_stillToSet, new ObjectContainerBase.PendingSet(transaction , @ref, updateDepth)); } protected void StopSession() { if (HasShutDownHook()) { Platform4.RemoveShutDownHook(this); } _classCollection = null; if (_references != null) { _references.Stop(); } _systemTransaction = null; _transaction = null; } public IStoredClass StoredClass(Transaction trans, object clazz) { lock (_lock) { trans = CheckTransaction(trans); IReflectClass claxx = ReflectorUtils.ReflectClassFor(Reflector(), clazz); if (claxx == null) { return null; } ClassMetadata classMetadata = ClassMetadataForReflectClass(claxx); if (classMetadata == null) { return null; } return new StoredClassImpl(trans, classMetadata); } } public virtual IStoredClass[] StoredClasses(Transaction trans) { lock (_lock) { trans = CheckTransaction(trans); IStoredClass[] classMetadata = _classCollection.StoredClasses(); IStoredClass[] storedClasses = new IStoredClass[classMetadata.Length]; for (int i = 0; i < classMetadata.Length; i++) { storedClasses[i] = new StoredClassImpl(trans, (ClassMetadata)classMetadata[i]); } return storedClasses; } } public virtual LatinStringIO StringIO() { return _handlers.StringIO(); } public abstract ISystemInfo SystemInfo(); private void BeginTopLevelCall() { if (DTrace.enabled) { DTrace.BeginTopLevelCall.Log(); } GenerateCallIDOnTopLevel(); IncStackDepth(); } private void EndTopLevelCall() { if (DTrace.enabled) { DTrace.EndTopLevelCall.Log(); } DecStackDepth(); GenerateCallIDOnTopLevel(); } private void GenerateCallIDOnTopLevel() { if (_stackDepth == 0) { _topLevelCallId = _topLevelCallIdGenerator.Next(); } } public virtual int StackDepth() { return _stackDepth; } public virtual void StackDepth(int depth) { _stackDepth = depth; } public virtual int TopLevelCallId() { return _topLevelCallId; } public virtual void TopLevelCallId(int id) { _topLevelCallId = id; } public virtual long Version() { lock (_lock) { return CurrentVersion(); } } public abstract void Shutdown(); public abstract void WriteDirtyClassMetadata(); public abstract void WriteNew(Transaction trans, Pointer4 pointer, ClassMetadata classMetadata, ByteArrayBuffer buffer); public abstract void WriteUpdate(Transaction trans, Pointer4 pointer, ClassMetadata classMetadata, ArrayType arrayType, ByteArrayBuffer buffer); public virtual ICallbacks Callbacks() { return _callbacks; } public virtual void Callbacks(ICallbacks cb) { if (cb == null) { throw new ArgumentException(); } _callbacks = cb; } public virtual Config4Impl ConfigImpl { get { return _config; } } public virtual UUIDFieldMetadata UUIDIndex() { return _handlers.Indexes()._uUID; } public virtual VersionFieldMetadata VersionIndex() { return _handlers.Indexes()._version; } public virtual CommitTimestampFieldMetadata CommitTimestampIndex() { return _handlers.Indexes()._commitTimestamp; } public virtual ClassMetadataRepository ClassCollection() { return _classCollection; } public abstract long[] GetIDsForClass(Transaction trans, ClassMetadata clazz); public abstract IQueryResult ClassOnlyQuery(QQueryBase queryBase, ClassMetadata clazz ); public abstract IQueryResult ExecuteQuery(QQuery query); public virtual void ReplicationCallState(int state) { _replicationCallState = state; } public virtual ReferenceSystemRegistry ReferenceSystemRegistry() { return _referenceSystemRegistry; } public virtual ObjectContainerBase Container { get { return this; } } public virtual void DeleteByID(Transaction transaction, int id, int cascadeDeleteDepth ) { if (id <= 0) { throw new ArgumentException("ID: " + id); } // return; if (cascadeDeleteDepth <= 0) { return; } object obj = GetByID2(transaction, id); if (obj == null) { return; } cascadeDeleteDepth--; IReflectClass claxx = ReflectorForObject(obj); if (claxx.IsCollection()) { cascadeDeleteDepth += 1; } ObjectReference @ref = transaction.ReferenceForId(id); if (@ref == null) { return; } Delete2(transaction, @ref, obj, cascadeDeleteDepth, false); } internal virtual IReflectClass ReflectorForObject(object obj) { return Reflector().ForObject(obj); } public virtual object SyncExec(IClosure4 block) { lock (_lock) { CheckClosed(); return block.Run(); } } public virtual void StoreAll(Transaction transaction, IEnumerator objects) { while (objects.MoveNext()) { Store(transaction, objects.Current); } } public virtual void StoreAll(Transaction transaction, IEnumerator objects, IUpdateDepth depth) { while (objects.MoveNext()) { Store(transaction, objects.Current, depth); } } public virtual void WithTransaction(Transaction transaction, IRunnable runnable) { lock (_lock) { Transaction old = _transaction; _transaction = transaction; try { runnable.Run(); } finally { _transaction = old; } } } public virtual IThreadPool4 ThreadPool() { return ((IThreadPool4)Environment().Provide(typeof(IThreadPool4))); } public virtual object NewWeakReference(ObjectReference referent, object obj) { return _references.NewWeakReference(referent, obj); } public sealed override string ToString() { if (_name != null) { return _name; } return DefaultToString(); } protected abstract string DefaultToString(); public abstract bool IsDeleted(Transaction trans, int id); public abstract void BlockSize(int size); public virtual IBlockConverter BlockConverter() { return _blockConverter; } protected virtual void CreateBlockConverter(int blockSize) { if (blockSize == 1) { _blockConverter = new DisabledBlockConverter(); } else { _blockConverter = new BlockSizeBlockConverter(blockSize); } } public virtual IUpdateDepthProvider UpdateDepthProvider() { return ConfigImpl.UpdateDepthProvider(); } public virtual void ReplaceClassMetadataRepository(ClassMetadataRepository repository ) { _classCollection = repository; } public long GenerateTransactionTimestamp(long forcedTimestamp) { lock (Lock()) { return CheckTransaction().GenerateTransactionTimestamp(forcedTimestamp); } } public void UseDefaultTransactionTimestamp() { lock (Lock()) { CheckTransaction().UseDefaultTransactionTimestamp(); } } public abstract void Activate(object arg1, int arg2); public abstract void Commit(); public abstract void Deactivate(object arg1, int arg2); public abstract void Delete(object arg1); public abstract IExtObjectContainer Ext(); public abstract IQuery Query(); public abstract IObjectSet Query(Type arg1); public abstract IObjectSet Query(Predicate arg1); public abstract IObjectSet Query(Predicate arg1, IQueryComparator arg2); public abstract IObjectSet QueryByExample(object arg1); public abstract void Rollback(); public abstract void Store(object arg1); public abstract void Activate(object arg1); public abstract void Backup(IStorage arg1, string arg2); public abstract void Bind(object arg1, long arg2); public abstract void Deactivate(object arg1); public abstract object Descend(object arg1, string[] arg2); public abstract object GetByID(long arg1); public abstract object GetByUUID(Db4oUUID arg1); public abstract long GetID(object arg1); public abstract IObjectInfo GetObjectInfo(object arg1); public abstract Db4oDatabase Identity(); public abstract bool IsActive(object arg1); public abstract bool IsCached(long arg1); public abstract bool IsStored(object arg1); public abstract IObjectContainer OpenSession(); public abstract object PeekPersisted(object arg1, int arg2, bool arg3); public abstract void Purge(object arg1); public abstract void Refresh(object arg1, int arg2); public abstract void Store(object arg1, int arg2); public abstract IStoredClass StoredClass(object arg1); public abstract IStoredClass[] StoredClasses(); public abstract int InstanceCount(ClassMetadata arg1, Transaction arg2); public abstract EventRegistryImpl NewEventRegistry(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/0000755000175000017500000000000011700531646026137 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/ICache4.cs0000644000175000017500000000212211700531646027663 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Internal.Caching { /// public interface ICache4 : IEnumerable { /// /// Retrieves the value associated to the /// key /// from the cache. If the value is not yet /// cached /// producer /// will be called to produce it. If the cache needs to discard a value /// finalizer /// will be given a chance to process it. /// /// the key for the value - must never change - cannot be null /// will be called if value not yet in the cache - can only be null when the value is found in the cache /// /// will be called if a page needs to be discarded - can be null /// /// the cached value object Produce(object key, IFunction4 producer, IProcedure4 finalizer); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/LRU2QLongCache.cs0000644000175000017500000000435111700531646031102 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// /// Simplified version of the algorithm taken from here: /// http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2641 /// internal class LRU2QLongCache : ICache4 { private readonly CircularLongBuffer4 _am; private readonly CircularLongBuffer4 _a1; private readonly IDictionary _slots; private readonly int _maxSize; private readonly int _a1_threshold; internal LRU2QLongCache(int maxSize) { _maxSize = maxSize; _a1_threshold = _maxSize / 4; _am = new CircularLongBuffer4(_maxSize); _a1 = new CircularLongBuffer4(_maxSize); _slots = new Hashtable(maxSize); } public virtual object Produce(object key, IFunction4 producer, IProcedure4 finalizer ) { if (_am.Remove((((long)key)))) { _am.AddFirst((((long)key))); return _slots[((long)key)]; } if (_a1.Remove((((long)key)))) { _am.AddFirst((((long)key))); return _slots[((long)key)]; } if (_slots.Count >= _maxSize) { DiscardPage(finalizer); } object value = producer.Apply(((long)key)); _slots[((long)key)] = value; _a1.AddFirst((((long)key))); return value; } private void DiscardPage(IProcedure4 finalizer) { if (_a1.Size() >= _a1_threshold) { DiscardPageFrom(_a1, finalizer); } else { DiscardPageFrom(_am, finalizer); } } private void DiscardPageFrom(CircularLongBuffer4 list, IProcedure4 finalizer) { Discard(list.RemoveLast(), finalizer); } private void Discard(long key, IProcedure4 finalizer) { if (null != finalizer) { finalizer.Apply(_slots[key]); } Sharpen.Collections.Remove(_slots, key); } public override string ToString() { return "LRU2QCache(am=" + ToString(_am) + ", a1=" + ToString(_a1) + ")"; } private string ToString(IEnumerable buffer) { return Iterators.ToString(buffer); } public virtual IEnumerator GetEnumerator() { return _slots.Values.GetEnumerator(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/IPurgeableCache4.cs0000644000175000017500000000103111700531646031510 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// public interface IPurgeableCache4 : ICache4 { /// Removes the cached value with the specified key from this cache. /// Removes the cached value with the specified key from this cache. /// /// the purged value or null object Purge(object key); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/LRUCache.cs0000644000175000017500000000274711700531646030066 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// internal class LRUCache : IPurgeableCache4 { private readonly IDictionary _slots; private readonly CircularBuffer4 _lru; private readonly int _maxSize; internal LRUCache(int size) { _maxSize = size; _slots = new Hashtable(size); _lru = new CircularBuffer4(size); } public virtual object Produce(object key, IFunction4 producer, IProcedure4 finalizer ) { object value = _slots[key]; if (value == null) { object newValue = producer.Apply(key); if (newValue == null) { return null; } if (_slots.Count >= _maxSize) { object discarded = Sharpen.Collections.Remove(_slots, _lru.RemoveLast()); if (null != finalizer) { finalizer.Apply(discarded); } } _slots[key] = newValue; _lru.AddFirst(key); return newValue; } _lru.Remove(key); // O(N) _lru.AddFirst(key); return value; } public virtual IEnumerator GetEnumerator() { return _slots.Values.GetEnumerator(); } public virtual object Purge(object key) { object removed = Sharpen.Collections.Remove(_slots, key); if (removed == null) { return null; } _lru.Remove(key); return removed; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/LRUIntCache.cs0000644000175000017500000000775311700531646030543 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// internal class LRUIntCache : IPurgeableCache4 { private class Entry { internal readonly int _key; internal readonly object _value; internal LRUIntCache.Entry _previous; internal LRUIntCache.Entry _next; public Entry(int key, object value) { _key = key; _value = value; } public override string ToString() { return string.Empty + _key; } } private readonly Hashtable4 _slots; private readonly int _maxSize; private int _size; private LRUIntCache.Entry _first; private LRUIntCache.Entry _last; internal LRUIntCache(int size) { _maxSize = size; _slots = new Hashtable4(size); } public virtual object Produce(object key, IFunction4 producer, IProcedure4 finalizer ) { int intKey = (((int)key)); if (_last == null) { object lastValue = producer.Apply(((int)key)); if (lastValue == null) { return null; } _size = 1; LRUIntCache.Entry lastEntry = new LRUIntCache.Entry(intKey, lastValue); _slots.Put(intKey, lastEntry); _first = lastEntry; _last = lastEntry; return lastValue; } LRUIntCache.Entry entry = (LRUIntCache.Entry)_slots.Get(intKey); if (entry == null) { if (_size >= _maxSize) { LRUIntCache.Entry oldEntry = (LRUIntCache.Entry)_slots.Remove(_last._key); _last = oldEntry._previous; _last._next = null; if (null != finalizer) { finalizer.Apply((object)oldEntry._value); } _size--; } object newValue = producer.Apply(((int)key)); if (newValue == null) { return null; } _size++; LRUIntCache.Entry newEntry = new LRUIntCache.Entry(intKey, newValue); _slots.Put(intKey, newEntry); _first._previous = newEntry; newEntry._next = _first; _first = newEntry; return newValue; } if (_first == entry) { return ((object)entry._value); } LRUIntCache.Entry previous = entry._previous; entry._previous = null; if (_last == entry) { _last = previous; } previous._next = entry._next; if (previous._next != null) { previous._next._previous = previous; } _first._previous = entry; entry._next = _first; _first = entry; return ((object)entry._value); } public virtual IEnumerator GetEnumerator() { IEnumerator i = new _IEnumerator_108(this); return i; } private sealed class _IEnumerator_108 : IEnumerator { public _IEnumerator_108(LRUIntCache _enclosing) { this._enclosing = _enclosing; this._cursor = this._enclosing._first; } private LRUIntCache.Entry _cursor; private LRUIntCache.Entry _current; public object Current { get { return this._current._value; } } public bool MoveNext() { if (this._cursor == null) { this._current = null; return false; } this._current = this._cursor; this._cursor = this._cursor._next; return true; } public void Reset() { this._cursor = this._enclosing._first; this._current = null; } private readonly LRUIntCache _enclosing; } public virtual object Purge(object key) { int intKey = (((int)key)); LRUIntCache.Entry entry = (LRUIntCache.Entry)_slots.Remove(intKey); if (entry == null) { return null; } _size--; if (_first == entry) { _first = entry._next; } if (_last == entry) { _last = entry._previous; } if (entry._previous != null) { entry._previous._next = entry._next; } if (entry._next != null) { entry._next._previous = entry._previous; } return ((object)entry._value); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/CacheStatistics.cs0000644000175000017500000000272511700531646031552 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// public class CacheStatistics : ICache4 { private readonly ICache4 _delegate; private int _calls; private int _misses; public CacheStatistics(ICache4 delegate_) { _delegate = delegate_; } public virtual object Produce(object key, IFunction4 producer, IProcedure4 onDiscard ) { _calls++; IFunction4 delegateProducer = new _IFunction4_26(this, producer); return _delegate.Produce(key, delegateProducer, onDiscard); } private sealed class _IFunction4_26 : IFunction4 { public _IFunction4_26(CacheStatistics _enclosing, IFunction4 producer) { this._enclosing = _enclosing; this.producer = producer; } public object Apply(object arg) { this._enclosing._misses++; return producer.Apply(arg); } private readonly CacheStatistics _enclosing; private readonly IFunction4 producer; } public virtual IEnumerator GetEnumerator() { return _delegate.GetEnumerator(); } public virtual int Calls() { return _calls; } public virtual int Misses() { return _misses; } public override string ToString() { return "Cache statistics Calls:" + _calls + " Misses:" + _misses; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/LRU2QCache.cs0000644000175000017500000000432511700531646030263 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// /// Simplified version of the algorithm taken from here: /// http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2641 /// internal class LRU2QCache : ICache4 { private readonly CircularBuffer4 _am; private readonly CircularBuffer4 _a1; private readonly IDictionary _slots; private readonly int _maxSize; private readonly int _a1_threshold; internal LRU2QCache(int maxSize) { _maxSize = maxSize; _a1_threshold = _maxSize / 4; _am = new CircularBuffer4(_maxSize); _a1 = new CircularBuffer4(_maxSize); _slots = new Hashtable(maxSize); } public virtual object Produce(object key, IFunction4 producer, IProcedure4 finalizer ) { if (key == null) { throw new ArgumentNullException(); } if (_am.Remove(key)) { _am.AddFirst(key); return _slots[key]; } if (_a1.Remove(key)) { _am.AddFirst(key); return _slots[key]; } if (_slots.Count >= _maxSize) { DiscardPage(finalizer); } object value = producer.Apply(key); _slots[key] = value; _a1.AddFirst(key); return value; } private void DiscardPage(IProcedure4 finalizer) { if (_a1.Size() >= _a1_threshold) { DiscardPageFrom(_a1, finalizer); } else { DiscardPageFrom(_am, finalizer); } } private void DiscardPageFrom(CircularBuffer4 list, IProcedure4 finalizer) { Discard(list.RemoveLast(), finalizer); } private void Discard(object key, IProcedure4 finalizer) { if (null != finalizer) { finalizer.Apply(_slots[key]); } Sharpen.Collections.Remove(_slots, key); } public override string ToString() { return "LRU2QCache(am=" + ToString(_am) + ", a1=" + ToString(_a1) + ")"; } private string ToString(IEnumerable buffer) { return Iterators.ToString(buffer); } public virtual IEnumerator GetEnumerator() { return _slots.Values.GetEnumerator(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/NullCache4.cs0000644000175000017500000000101311700531646030403 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// public class NullCache4 : ICache4 { public virtual object Produce(object key, IFunction4 producer, IProcedure4 onDiscard ) { return producer.Apply(key); } public virtual IEnumerator GetEnumerator() { return Iterators.EmptyIterator; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/LRULongCache.cs0000644000175000017500000001002011700531646030665 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// internal class LRULongCache : IPurgeableCache4 { private class Entry { internal readonly long _key; internal readonly object _value; internal LRULongCache.Entry _previous; internal LRULongCache.Entry _next; public Entry(long key, object value) { _key = key; _value = value; } public override string ToString() { return string.Empty + _key; } } private readonly Hashtable4 _slots; private readonly int _maxSize; private int _size; private LRULongCache.Entry _first; private LRULongCache.Entry _last; internal LRULongCache(int size) { _maxSize = size; _slots = new Hashtable4(size); } public virtual object Produce(object key, IFunction4 producer, IProcedure4 finalizer ) { long longKey = (((long)key)); if (_last == null) { object lastValue = producer.Apply(((long)key)); if (lastValue == null) { return null; } _size = 1; LRULongCache.Entry lastEntry = new LRULongCache.Entry(longKey, lastValue); _slots.Put(longKey, lastEntry); _first = lastEntry; _last = lastEntry; return lastValue; } LRULongCache.Entry entry = (LRULongCache.Entry)_slots.Get(longKey); if (entry == null) { if (_size >= _maxSize) { LRULongCache.Entry oldEntry = (LRULongCache.Entry)_slots.Remove(_last._key); _last = oldEntry._previous; _last._next = null; if (null != finalizer) { finalizer.Apply((object)oldEntry._value); } _size--; } object newValue = producer.Apply(((long)key)); if (newValue == null) { return null; } _size++; LRULongCache.Entry newEntry = new LRULongCache.Entry(longKey, newValue); _slots.Put(longKey, newEntry); _first._previous = newEntry; newEntry._next = _first; _first = newEntry; return newValue; } if (_first == entry) { return ((object)entry._value); } LRULongCache.Entry previous = entry._previous; entry._previous = null; if (_last == entry) { _last = previous; } previous._next = entry._next; if (previous._next != null) { previous._next._previous = previous; } _first._previous = entry; entry._next = _first; _first = entry; return ((object)entry._value); } public virtual IEnumerator GetEnumerator() { IEnumerator i = new _IEnumerator_108(this); return i; } private sealed class _IEnumerator_108 : IEnumerator { public _IEnumerator_108(LRULongCache _enclosing) { this._enclosing = _enclosing; this._cursor = this._enclosing._first; } private LRULongCache.Entry _cursor; private LRULongCache.Entry _current; public object Current { get { return this._current._value; } } public bool MoveNext() { if (this._cursor == null) { this._current = null; return false; } this._current = this._cursor; this._cursor = this._cursor._next; return true; } public void Reset() { this._cursor = this._enclosing._first; this._current = null; } private readonly LRULongCache _enclosing; } public virtual object Purge(object key) { long longKey = (((long)key)); LRULongCache.Entry entry = (LRULongCache.Entry)_slots.Remove(longKey); if (entry == null) { return null; } _size--; if (_first == entry) { _first = entry._next; } if (_last == entry) { _last = entry._previous; } if (entry._previous != null) { entry._previous._next = entry._next; } if (entry._next != null) { entry._next._previous = entry._previous; } return ((object)entry._value); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/LRU2QXCache.cs0000644000175000017500000000552711700531646030420 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// /// Full version of the algorithm taken from here: /// http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2641 /// internal class LRU2QXCache : ICache4 { private readonly IDictionary _slots; private readonly CircularBuffer4 _am; private readonly CircularBuffer4 _a1in; private readonly CircularBuffer4 _a1out; private readonly int _maxSize; private readonly int _inSize; public LRU2QXCache(int maxSize) { // 'eden': long-term lru queue // 'nursery': short-term fifo queue, entry point for all new items // 'backlog': fifo queue, elements may not be backed in _slots or may overlap with _am // invariant: |_slots| = |_am| + |_a1in| <= _maxSize _maxSize = maxSize; _inSize = _maxSize / 4; _slots = new Hashtable(_maxSize); _am = new CircularBuffer4(_maxSize); _a1in = new CircularBuffer4(_maxSize); _a1out = new CircularBuffer4(_maxSize / 2); } public virtual object Produce(object key, IFunction4 producer, IProcedure4 finalizer ) { if (key == null) { throw new ArgumentNullException(); } if (_am.Remove(key)) { _am.AddFirst(key); return _slots[key]; } if (_a1out.Contains(key)) { ReclaimFor(key, producer, finalizer); _am.AddFirst(key); return _slots[key]; } if (_a1in.Contains(key)) { return _slots[key]; } ReclaimFor(key, producer, finalizer); _a1in.AddFirst(key); return _slots[key]; } private void ReclaimFor(object key, IFunction4 producer, IProcedure4 finalizer) { if (_slots.Count < _maxSize) { _slots[key] = producer.Apply(key); return; } if (_a1in.Size() > _inSize) { object lastKey = _a1in.RemoveLast(); Discard(lastKey, finalizer); if (_a1out.IsFull()) { _a1out.RemoveLast(); } _a1out.AddFirst(lastKey); } else { object lastKey = _am.RemoveLast(); Discard(lastKey, finalizer); } _slots[key] = producer.Apply(key); } public virtual IEnumerator GetEnumerator() { return _slots.Values.GetEnumerator(); } public override string ToString() { return "LRU2QXCache(am=" + ToString(_am) + ", a1in=" + ToString(_a1in) + ", a1out=" + ToString(_a1out) + ")" + " - " + _slots.Count; } private void Discard(object key, IProcedure4 finalizer) { object removed = Sharpen.Collections.Remove(_slots, key); if (finalizer != null) { finalizer.Apply(removed); } } private string ToString(IEnumerable buffer) { return Iterators.ToString(buffer); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Caching/CacheFactory.cs0000644000175000017500000000145711700531646031030 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Internal.Caching { /// public class CacheFactory { public static ICache4 New2QCache(int size) { return new LRU2QCache(size); } public static ICache4 New2QLongCache(int size) { return new LRU2QLongCache(size); } public static ICache4 New2QXCache(int size) { return new LRU2QXCache(size); } public static IPurgeableCache4 NewLRUCache(int size) { return new LRUCache(size); } public static IPurgeableCache4 NewLRUIntCache(int size) { return new LRUIntCache(size); } public static IPurgeableCache4 NewLRULongCache(int size) { return new LRULongCache(size); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Messages.cs0000644000175000017500000001344711700531646026712 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public sealed class Messages { public const int IncompatibleFormat = 17; public const int ClosedOrOpenFailed = 20; public const int FailedToShutdown = 28; public const int FatalMsgId = 44; public const int NotImplemented = 49; public const int OldDatabaseFormat = 65; public const int OnlyForIndexedFields = 66; public const int ClientServerUnsupported = 67; public const int CouldNotOpenPort = 30; public const int ServerListeningOnPort = 31; private static string[] i_messages; public static string Get(int a_code) { return Get(a_code, null); } public static string Get(int a_code, string param) { if (a_code < 0) { return param; } Load(); if (i_messages == null || a_code > i_messages.Length - 1) { return "msg[" + a_code + "]"; } string msg = i_messages[a_code]; if (param != null) { int pos = msg.IndexOf("%", 0); if (pos > -1) { msg = Sharpen.Runtime.Substring(msg, 0, pos) + "'" + param + "'" + Sharpen.Runtime.Substring (msg, pos + 1); } } return msg; } private static void Load() { if (i_messages == null) { i_messages = new string[] { string.Empty, "blocksize should be between 1 and 127" , "% close request", "% closed", "Exception opening %", "% opened O.K.", "Class %: Instantiation failed. \n Check custom ObjectConstructor code." , "Class %: Instantiation failed.\n Add a constructor for use with db4o, ideally with zero arguments." , "renaming %", "rename not possible. % already exists", "rename failed", "File close failed." , "File % not available for readwrite access.", "File read access failed.", "File not found: % Creating new file" , "Creation of file failed: %", "File write failed.", "File format incompatible: %" , "Uncaught Exception. Engine closed.", "writing log for %", "% is closed. close() was called or open() failed." , "Filename not specified.", "The database file is locked by another process.", "Class not available: %. Check CLASSPATH settings.", "finalized while performing a task.\n DO NOT USE CTRL + C OR System.exit() TO STOP THE ENGINE." , "Please mail the following to exception@db4o.com:\n ", "", "Creation of lock file failed: %" , "Previous session was not shut down correctly", "This method call is only possible on stored objects" , "Could not open port: %", "Server listening on port: %", "Client % connected." , "Client % timed out and closed.", "Connection closed by client %.", "Connection closed by server. %." , "% connected to server.", "The directory % can neither be found nor created.", "This blob was never stored.", "Blob file % not available.", "Failure finding blob filename." , "File does not exist %.", "Failed to connect to server.", "No blob data stored." , "Uncaught Exception. db4o engine closed.", "Add constructor that won't throw exceptions, configure constructor calls, configure exceptionsOnNotStorable(false) or provide a translator to class % and make sure the class is deployed to the server with the same package/namespace + assembly name." , "This method can only be called before opening the database file.", "AccessibleObject#setAccessible() is not available. Private fields can not be stored." , "ObjectTranslator could not be installed: %.", "Not implemented", "% closed by ShutdownHook." , string.Empty, "Add at least one ObjectContainer to the Cluster", "Unsupported Operation" , "Database password does not match user-provided password.", "Thread interrupted." , "Password can not be null.", "Classes does not match.", "rename() needs to be executed on the server." , "Primitive types like % can not be stored directly. Store and retrieve them in wrapper objects." , "Backups can not be run from clients and memory files.", "Backup in progress." , "Only use persisted first class objects as keys for IdentityHashMap.", "This functionality is only available from version 5.0 onwards." , "By convention a Predicate needs the following method: public boolean match(ExtentClass extent){}" , "Old database file format detected. To allow automatic updates call Db4o.configure().allowVersionUpdates(true)." , "This functionality is only available for indexed fields.", "This functionality is not supported for db4o clients in Client/Server mode." , "Invalid address: %", "Maximum file size reached" }; } } // unused // 5 // 10 // 15 // 20 // 25 // 30 // 35 // 40 // 45 // 50 // removed, can be reused // 55 // 60 // 65 // 66 // 67 // 69 public static void LogErr(IConfiguration config, int code, string msg, Exception t) { TextWriter ps = ((Config4Impl)SafeConfig(config)).ErrStream(); new MessageOutput(msg, code, ps); if (t != null) { new MessageOutput(null, 25, ps); Sharpen.Runtime.PrintStackTrace(t, ps); new MessageOutput(null, 26, ps, false); } } [System.ObsoleteAttribute(@"uses deprecated api")] private static IConfiguration SafeConfig(IConfiguration config) { if (config != null) { return config; } return Db4oFactory.Configure(); } public static void LogMsg(IConfiguration config, int code, string msg) { Config4Impl c4i = (Config4Impl)config; if (c4i.MessageLevel() > Const4.None) { new MessageOutput(msg, code, c4i.OutStream()); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IllegalComparisonException.cs0000644000175000017500000000041311700531646032413 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Internal { /// [System.Serializable] public class IllegalComparisonException : Db4oRecoverableException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ExternalObjectContainer.cs0000644000175000017500000001217411700531646031713 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal { /// public abstract class ExternalObjectContainer : ObjectContainerBase { public ExternalObjectContainer(IConfiguration config) : base(config) { } public sealed override void Activate(object obj) { Activate(null, obj); } /// public sealed override void Activate(object obj, int depth) { Activate(null, obj, ActivationDepthProvider().ActivationDepth(depth, ActivationMode .Activate)); } public sealed override void Deactivate(object obj) { Deactivate(null, obj); } /// /// public sealed override void Bind(object obj, long id) { Bind(null, obj, id); } /// /// public sealed override void Commit() { Commit(null); } /// public sealed override void Deactivate(object obj, int depth) { Deactivate(null, obj, depth); } public sealed override void Delete(object a_object) { Delete(null, a_object); } public override object Descend(object obj, string[] path) { return Descend(null, obj, path); } public override IExtObjectContainer Ext() { return this; } /// public sealed override IObjectSet QueryByExample(object template) { return QueryByExample(null, template); } /// /// public sealed override object GetByID(long id) { return GetByID(null, id); } public sealed override object GetByUUID(Db4oUUID uuid) { return GetByUUID(null, uuid); } public sealed override long GetID(object obj) { return GetID(null, obj); } public sealed override IObjectInfo GetObjectInfo(object obj) { return GetObjectInfo(null, obj); } public override bool IsActive(object obj) { return IsActive(null, obj); } public override bool IsCached(long id) { return IsCached(null, id); } public override bool IsStored(object obj) { return IsStored(null, obj); } /// public sealed override object PeekPersisted(object obj, int depth, bool committed ) { return PeekPersisted(null, obj, ActivationDepthProvider().ActivationDepth(depth, ActivationMode.Peek), committed); } public sealed override void Purge(object obj) { Purge(null, obj); } public override IQuery Query() { return Query((Transaction)null); } public sealed override IObjectSet Query(Type clazz) { return QueryByExample(clazz); } public sealed override IObjectSet Query(Predicate predicate) { return Query(predicate, (IQueryComparator)null); } public sealed override IObjectSet Query(Predicate predicate, IQueryComparator comparator ) { return Query(null, predicate, comparator); } public sealed override void Refresh(object obj, int depth) { Refresh(null, obj, depth); } public sealed override void Rollback() { Rollback(null); } /// /// public sealed override void Store(object obj) { Store(obj, Const4.Unspecified); } /// /// public sealed override void Store(object obj, int depth) { Store(null, obj, depth == Const4.Unspecified ? (IUpdateDepth)UpdateDepthProvider( ).Unspecified(NullModifiedObjectQuery.Instance) : (IUpdateDepth)UpdateDepthProvider ().ForDepth(depth)); } public sealed override IStoredClass StoredClass(object clazz) { return StoredClass(null, clazz); } public override IStoredClass[] StoredClasses() { return StoredClasses(null); } /// /// /// public abstract override void Backup(IStorage targetStorage, string path); public abstract override Db4oDatabase Identity(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/SerializedGraph.cs0000644000175000017500000000165611700531646030217 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class SerializedGraph { public readonly int _id; public readonly byte[] _bytes; public SerializedGraph(int id, byte[] bytes) { _id = id; _bytes = bytes; } public virtual int Length() { return _bytes.Length; } public virtual int MarshalledLength() { return (Const4.IntLength * 2) + Length(); } public virtual void Write(ByteArrayBuffer buffer) { buffer.WriteInt(_id); buffer.WriteInt(Length()); buffer.Append(_bytes); } public static Db4objects.Db4o.Internal.SerializedGraph Read(ByteArrayBuffer buffer ) { int id = buffer.ReadInt(); int length = buffer.ReadInt(); return new Db4objects.Db4o.Internal.SerializedGraph(id, buffer.ReadBytes(length)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TransactionLocal.cs0000644000175000017500000000076011700531646030375 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// A transaction local variable. /// A transaction local variable. /// Transaction.Get(TransactionLocal) /// public class TransactionLocal { public virtual object InitialValueFor(Transaction transaction) { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Config4Impl.cs0000644000175000017500000010567411700531646027262 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Config; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Messaging; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Typehandlers; using Sharpen; namespace Db4objects.Db4o.Internal { /// Configuration template for creating new db4o files /// public sealed partial class Config4Impl : IConfiguration, IDeepClone, IMessageSender , IFreespaceConfiguration, IQueryConfiguration, IClientServerConfiguration { private KeySpecHashtable4 _config = new KeySpecHashtable4(50); private static readonly KeySpec ActivationDepthKey = new KeySpec(5); private static readonly KeySpec ActivationDepthProviderKey = new KeySpec(LegacyActivationDepthProvider .Instance); private static readonly KeySpec UpdateDepthProviderKey = new KeySpec(new LegacyUpdateDepthProvider ()); private static readonly KeySpec AllowVersionUpdatesKey = new KeySpec(false); private static readonly KeySpec AsynchronousSyncKey = new KeySpec(false); private static readonly KeySpec AutomaticShutdownKey = new KeySpec(true); private static readonly KeySpec BlocksizeKey = new KeySpec((byte)1); private static readonly KeySpec BlobPathKey = new KeySpec(null); private static readonly KeySpec BtreeNodeSizeKey = new KeySpec(201); private static readonly KeySpec CallbacksKey = new KeySpec(CallBackMode.All); private static readonly KeySpec CallConstructorsKey = new KeySpec(TernaryBool.Unspecified ); private static readonly KeySpec ConfigurationItemsKey = new KeySpec(null); private static readonly KeySpec ConfiguredReflectorKey = new KeySpec(null); private static readonly KeySpec ClassActivationDepthConfigurableKey = new KeySpec (true); private static readonly KeySpec ClassloaderKey = new KeySpec(null); private sealed class _IDeferred_75 : KeySpec.IDeferred { public _IDeferred_75() { } // TODO: consider setting default to 8, it's more efficient with freespace. public object Evaluate() { return Config4Impl.DefaultClientServerFactory(); } } private static readonly KeySpec ClientServerFactoryKey = new KeySpec(new _IDeferred_75 ()); private static readonly KeySpec DatabaseGrowthSizeKey = new KeySpec(0); private static readonly KeySpec DetectSchemaChangesKey = new KeySpec(true); private sealed class _IDeferred_85 : KeySpec.IDeferred { public _IDeferred_85() { } public object Evaluate() { return new Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor(); } } private static readonly KeySpec DiagnosticKey = new KeySpec(new _IDeferred_85()); private static readonly KeySpec DisableCommitRecoveryKey = new KeySpec(false); private static readonly KeySpec DiscardFreespaceKey = new KeySpec(0); private static readonly IStringEncoding DefaultStringEncoding = StringEncodings.Unicode (); private static readonly KeySpec StringEncodingKey = new KeySpec(DefaultStringEncoding ); private static readonly KeySpec EncodingKey = new KeySpec(BuiltInStringEncoding.EncodingByteForEncoding (DefaultStringEncoding)); private static readonly KeySpec EncryptKey = new KeySpec(false); private sealed class _IDeferred_103 : KeySpec.IDeferred { public _IDeferred_103() { } public object Evaluate() { return new ArrayList(); } } private static readonly KeySpec EnvironmentContributionsKey = new KeySpec(new _IDeferred_103 ()); private static readonly KeySpec ExceptionalClassesKey = new KeySpec(null); private static readonly KeySpec ExceptionsOnNotStorableKey = new KeySpec(true); private static readonly KeySpec FileBasedTransactionLogKey = new KeySpec(false); private static readonly KeySpec FreespaceFillerKey = new KeySpec(null); private static readonly KeySpec FreespaceSystemKey = new KeySpec(AbstractFreespaceManager .FmDefault); private static readonly KeySpec GenerateUuidsKey = new KeySpec(ConfigScope.Individually ); private static readonly KeySpec GenerateCommitTimestampsKey = new KeySpec(TernaryBool .Unspecified); private static readonly KeySpec IdSystemKey = new KeySpec(StandardIdSystemFactory .Default); private static readonly KeySpec IdSystemCustomFactoryKey = new KeySpec(null); private static readonly KeySpec QueryEvaluationModeKey = new KeySpec(QueryEvaluationMode .Immediate); private static readonly KeySpec LockFileKey = new KeySpec(true); private static readonly KeySpec MessageRecipientKey = new KeySpec(null); private static readonly KeySpec OptimizeNqKey = new KeySpec(true); private static readonly KeySpec OutstreamKey = new KeySpec(null); private static readonly KeySpec PasswordKey = new KeySpec((string)null); private static readonly KeySpec ClientQueryResultIteratorFactoryKey = new KeySpec (null); private static readonly KeySpec PrefetchIdCountKey = new KeySpec(10); private static readonly KeySpec PrefetchObjectCountKey = new KeySpec(10); private static readonly KeySpec PrefetchDepthKey = new KeySpec(0); public const int PrefetchSlotCacheSizeFactor = 10; private const int MaximumPrefetchSlotCacheSize = 10000; private static readonly KeySpec PrefetchSlotCacheSizeKey = new KeySpec(0); private sealed class _IDeferred_155 : KeySpec.IDeferred { public _IDeferred_155() { } // for playing with different strategies of prefetching // object public object Evaluate() { return new Hashtable4(16); } } private static readonly KeySpec ReadAsKey = new KeySpec(new _IDeferred_155()); private static readonly KeySpec RecoveryModeKey = new KeySpec(false); private static readonly KeySpec ReflectorKey = new KeySpec(null); private static readonly KeySpec RenameKey = new KeySpec(null); private static readonly KeySpec ReservedStorageSpaceKey = new KeySpec(0); private static readonly KeySpec SingleThreadedClientKey = new KeySpec(false); private static readonly KeySpec TestConstructorsKey = new KeySpec(true); private static readonly KeySpec TimeoutClientSocketKey = new KeySpec(Const4.ClientSocketTimeout ); private static readonly KeySpec TimeoutServerSocketKey = new KeySpec(Const4.ServerSocketTimeout ); private static readonly KeySpec UpdateDepthKey = new KeySpec(1); private static readonly KeySpec WeakReferenceCollectionIntervalKey = new KeySpec( 1000); private static readonly KeySpec WeakReferencesKey = new KeySpec(true); private static readonly KeySpec StorageFactoryKey = new KeySpec(new CachingStorage (new FileStorage())); private static readonly KeySpec AliasesKey = new KeySpec(null); private static readonly KeySpec BatchMessagesKey = new KeySpec(true); private static readonly KeySpec MaxBatchQueueSizeKey = new KeySpec(int.MaxValue); private static readonly KeySpec TaintedKey = new KeySpec(false); private sealed class _IReferenceSystemFactory_193 : IReferenceSystemFactory { public _IReferenceSystemFactory_193() { } public IReferenceSystem NewReferenceSystem(IInternalObjectContainer container) { return new TransactionalReferenceSystem(); } } private static readonly KeySpec ReferenceSystemFactoryKey = new KeySpec(new _IReferenceSystemFactory_193 ()); private sealed class _INameProvider_199 : INameProvider { public _INameProvider_199() { } public string Name(IObjectContainer db) { return null; } } private static readonly KeySpec NameProviderKey = new KeySpec(new _INameProvider_199 ()); private static readonly KeySpec MaxStackDepthKey = new KeySpec("Dalvik".Equals(Runtime .GetProperty("java.vm.name")) ? 2 : Const4.DefaultMaxStackDepth); private ObjectContainerBase _container; private bool _internStrings; private int _messageLevel; private bool _readOnly; private Collection4 _registeredTypeHandlers; private System.EventHandler _prefetchSettingsChanged; private bool _prefetchSlotCacheSizeModifiedExternally; // TODO find a better place to do this, and use AndroidConfiguration instead. // is null in the global configuration until deepClone is called // The following are very frequently being asked for, so they show up in the profiler. // Let's keep them out of the Hashtable. public int ActivationDepth() { return _config.GetAsInt(ActivationDepthKey); } // FIXME: circular cs dependancy. Improve. public void ActivationDepth(int depth) { _config.Put(ActivationDepthKey, depth); } public void Add(IConfigurationItem item) { item.Prepare(this); SafeConfigurationItems().Put(item, item); } /// /// Returns an iterator for all /// Db4objects.Db4o.Config.IConfigurationItem /// /// instances /// added. /// /// Add(Db4objects.Db4o.Config.IConfigurationItem) /// /// the iterator public IEnumerator ConfigurationItemsIterator() { Hashtable4 items = ConfigurationItems(); if (items == null) { return Iterators.EmptyIterator; } return items.Keys(); } private Hashtable4 SafeConfigurationItems() { Hashtable4 items = ConfigurationItems(); if (items == null) { items = new Hashtable4(16); _config.Put(ConfigurationItemsKey, items); } return items; } public void AllowVersionUpdates(bool flag) { _config.Put(AllowVersionUpdatesKey, flag); } private Hashtable4 ConfigurationItems() { return (Hashtable4)_config.Get(ConfigurationItemsKey); } public void ApplyConfigurationItems(IInternalObjectContainer container) { Hashtable4 items = ConfigurationItems(); if (items == null) { return; } IEnumerator i = items.Iterator(); while (i.MoveNext()) { IEntry4 entry = (IEntry4)i.Current; IConfigurationItem item = (IConfigurationItem)entry.Value(); item.Apply(container); } } public void AutomaticShutDown(bool flag) { _config.Put(AutomaticShutdownKey, flag); } public void BlockSize(int bytes) { if (bytes < 1 || bytes > 127) { throw new ArgumentException(); } GlobalSettingOnly(); _config.Put(BlocksizeKey, (byte)bytes); } public void BTreeNodeSize(int size) { _config.Put(BtreeNodeSizeKey, size); } public void BTreeCacheHeight(int height) { } public void Callbacks(bool turnOn) { CallbackMode(turnOn ? CallBackMode.All : CallBackMode.None); } public void CallbackMode(CallBackMode mode) { _config.Put(CallbacksKey, mode); } public void CallConstructors(bool flag) { _config.Put(CallConstructorsKey, TernaryBool.ForBoolean(flag)); } public void ClassActivationDepthConfigurable(bool turnOn) { _config.Put(ClassActivationDepthConfigurableKey, turnOn); } public Config4Class ConfigClass(string className) { Config4Class config = (Config4Class)ExceptionalClasses().Get(className); return config; } private bool IsIgnoredClass(string className) { Type[] ignore = IgnoredClasses(); for (int i = 0; i < ignore.Length; i++) { if (ignore[i].FullName.Equals(className)) { return true; } } return false; } private Type[] IgnoredClasses() { return new Type[] { typeof(StaticClass), typeof(StaticField) }; } public object DeepClone(object param) { Config4Impl ret = new Config4Impl(); Config4Impl.ConfigDeepCloneContext context = new Config4Impl.ConfigDeepCloneContext (this, ret); ret._config = (KeySpecHashtable4)_config.DeepClone(context); ret._internStrings = _internStrings; ret._messageLevel = _messageLevel; ret._readOnly = _readOnly; if (_registeredTypeHandlers != null) { ret._registeredTypeHandlers = (Collection4)_registeredTypeHandlers.DeepClone(context ); } return ret; } public void Container(ObjectContainerBase container) { _container = container; } public void DatabaseGrowthSize(int bytes) { _config.Put(DatabaseGrowthSizeKey, bytes); } public int DatabaseGrowthSize() { return _config.GetAsInt(DatabaseGrowthSizeKey); } public void DetectSchemaChanges(bool flag) { _config.Put(DetectSchemaChangesKey, flag); } public void DisableCommitRecovery() { _config.Put(DisableCommitRecoveryKey, true); } public void DiscardSmallerThan(int byteCount) { if (byteCount < 0) { throw new ArgumentException(); } _config.Put(DiscardFreespaceKey, byteCount); } [System.ObsoleteAttribute] public void Encrypt(bool flag) { GlobalSettingOnly(); _config.Put(EncryptKey, flag); } internal void OldEncryptionOff() { _config.Put(EncryptKey, false); } /// internal void EnsureDirExists(string path) { Sharpen.IO.File file = new Sharpen.IO.File(path); if (!file.Exists()) { file.Mkdirs(); } if (file.Exists() && file.IsDirectory()) { } else { throw new IOException(Db4objects.Db4o.Internal.Messages.Get(37, path)); } } internal TextWriter ErrStream() { TextWriter outStream = OutStreamOrNull(); return outStream == null ? Sharpen.Runtime.Err : outStream; } public void ExceptionsOnNotStorable(bool flag) { _config.Put(ExceptionsOnNotStorableKey, flag); } public IFreespaceConfiguration Freespace() { return this; } public void FreespaceFiller(IFreespaceFiller freespaceFiller) { _config.Put(FreespaceFillerKey, freespaceFiller); } public IFreespaceFiller FreespaceFiller() { return (IFreespaceFiller)_config.Get(FreespaceFillerKey); } public void GenerateUUIDs(ConfigScope scope) { _config.Put(GenerateUuidsKey, scope); } public void GenerateVersionNumbers(ConfigScope scope) { if (scope == ConfigScope.Individually) { throw new NotSupportedException(); } GenerateCommitTimestamps(scope == ConfigScope.Globally); } public void GenerateCommitTimestamps(bool flag) { _config.Put(GenerateCommitTimestampsKey, TernaryBool.ForBoolean(flag)); } public IMessageSender GetMessageSender() { return this; } private void GlobalSettingOnly() { if (_container != null) { throw new GlobalOnlyConfigException(); } } public void InternStrings(bool doIntern) { _internStrings = doIntern; } public void Io(IoAdapter adapter) { GlobalSettingOnly(); Storage = new IoAdapterStorage(adapter); } public void LockDatabaseFile(bool flag) { _config.Put(LockFileKey, flag); } public void MarkTransient(string marker) { Platform4.MarkTransient(marker); } public void MessageLevel(int level) { _messageLevel = level; if (OutStream() == null) { SetOut(Sharpen.Runtime.Out); } } public void OptimizeNativeQueries(bool optimizeNQ) { _config.Put(OptimizeNqKey, optimizeNQ); } public bool OptimizeNativeQueries() { return _config.GetAsBoolean(OptimizeNqKey); } public IObjectClass ObjectClass(object clazz) { string className = null; if (clazz is string) { className = (string)clazz; } else { IReflectClass claxx = ReflectorFor(clazz); if (claxx == null) { return null; } className = claxx.GetName(); } if (ReflectPlatform.FullyQualifiedName(typeof(object)).Equals(className)) { throw new ArgumentException("Configuration of the Object class is not supported." ); } Hashtable4 xClasses = ExceptionalClasses(); Config4Class c4c = (Config4Class)xClasses.Get(className); if (c4c == null) { c4c = new Config4Class(this, className); xClasses.Put(className, c4c); } return c4c; } private TextWriter OutStreamOrNull() { return (TextWriter)_config.Get(OutstreamKey); } public TextWriter OutStream() { TextWriter outStream = OutStreamOrNull(); return outStream == null ? Sharpen.Runtime.Out : outStream; } [System.ObsoleteAttribute] public void Password(string pw) { GlobalSettingOnly(); _config.Put(PasswordKey, pw); } public void ReadOnly(bool flag) { _readOnly = flag; } public GenericReflector Reflector() { GenericReflector reflector = (GenericReflector)_config.Get(ReflectorKey); if (reflector == null) { IReflector configuredReflector = (IReflector)_config.Get(ConfiguredReflectorKey); if (configuredReflector == null) { configuredReflector = Platform4.CreateReflector(ClassLoader()); _config.Put(ConfiguredReflectorKey, configuredReflector); } reflector = new GenericReflector(configuredReflector); _config.Put(ReflectorKey, reflector); } // TODO: transaction assignment has been moved to YapStreamBase#initialize1(). // implement better, more generic solution as described in COR-288 // if(! reflector.hasTransaction() && i_stream != null){ // reflector.setTransaction(i_stream.getSystemTransaction()); // } return reflector; } public void ReflectWith(IReflector reflect) { if (_container != null) { Exceptions4.ThrowRuntimeException(46); } // see readable message for code in Messages.java if (reflect == null) { throw new ArgumentNullException(); } _config.Put(ConfiguredReflectorKey, reflect); _config.Put(ReflectorKey, null); } public void RefreshClasses() { throw new NotImplementedException(); } internal void Rename(Db4objects.Db4o.Rename a_rename) { Collection4 renameCollection = Rename(); if (renameCollection == null) { renameCollection = new Collection4(); _config.Put(RenameKey, renameCollection); } renameCollection.Add(a_rename); } /// public void ReserveStorageSpace(long byteCount) { int reservedStorageSpace = (int)byteCount; if (reservedStorageSpace < 0) { reservedStorageSpace = 0; } _config.Put(ReservedStorageSpaceKey, reservedStorageSpace); if (_container != null) { _container.Reserve(reservedStorageSpace); } } /// The ConfigImpl also is our messageSender public void Send(object obj) { if (_container != null) { _container.Send(obj); } } /// public void SetBlobPath(string path) { EnsureDirExists(path); _config.Put(BlobPathKey, path); } public void SetMessageRecipient(IMessageRecipient messageRecipient) { _config.Put(MessageRecipientKey, messageRecipient); } [System.ObsoleteAttribute] public void SetOut(TextWriter outStream) { _config.Put(OutstreamKey, outStream); if (_container != null) { _container.LogMsg(19, Db4oFactory.Version()); } else { Db4objects.Db4o.Internal.Messages.LogMsg(this, 19, Db4oFactory.Version()); } } public void SingleThreadedClient(bool flag) { _config.Put(SingleThreadedClientKey, flag); } public IStringEncoding StringEncoding() { return (IStringEncoding)_config.Get(StringEncodingKey); } public void StringEncoding(IStringEncoding encoding) { _config.Put(StringEncodingKey, encoding); _config.Put(EncodingKey, BuiltInStringEncoding.EncodingByteForEncoding(encoding)); } public void TestConstructors(bool flag) { _config.Put(TestConstructorsKey, flag); } public void TimeoutClientSocket(int milliseconds) { _config.Put(TimeoutClientSocketKey, milliseconds); } public void TimeoutServerSocket(int milliseconds) { _config.Put(TimeoutServerSocketKey, milliseconds); } public void UpdateDepth(int depth) { if (depth < 0) { throw new ArgumentException("update depth must not be negative"); } Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor dp = DiagnosticProcessor( ); if (dp.Enabled()) { dp.CheckUpdateDepth(depth); } _config.Put(UpdateDepthKey, depth); } public void UseBTreeSystem() { _config.Put(FreespaceSystemKey, AbstractFreespaceManager.FmBtree); } public void UseRamSystem() { _config.Put(FreespaceSystemKey, AbstractFreespaceManager.FmRam); } [System.ObsoleteAttribute] public void UseIndexSystem() { throw new NotSupportedException(); } public void WeakReferenceCollectionInterval(int milliseconds) { _config.Put(WeakReferenceCollectionIntervalKey, milliseconds); } public void WeakReferences(bool flag) { _config.Put(WeakReferencesKey, flag); } private Collection4 Aliases() { Collection4 aliasesCollection = (Collection4)_config.Get(AliasesKey); if (null == aliasesCollection) { aliasesCollection = new Collection4(); _config.Put(AliasesKey, aliasesCollection); } return aliasesCollection; } public void AddAlias(IAlias alias) { if (null == alias) { throw new ArgumentNullException("alias"); } Aliases().Add(alias); } public void RemoveAlias(IAlias alias) { if (null == alias) { throw new ArgumentNullException("alias"); } Aliases().Remove(alias); } public string ResolveAliasRuntimeName(string runtimeType) { Collection4 configuredAliases = Aliases(); if (null == configuredAliases) { return runtimeType; } IEnumerator i = configuredAliases.GetEnumerator(); while (i.MoveNext()) { string resolved = ((IAlias)i.Current).ResolveRuntimeName(runtimeType); if (null != resolved) { return resolved; } } return runtimeType; } public string ResolveAliasStoredName(string storedType) { Collection4 configuredAliases = Aliases(); if (null == configuredAliases) { return storedType; } IEnumerator i = configuredAliases.GetEnumerator(); while (i.MoveNext()) { string resolved = ((IAlias)i.Current).ResolveStoredName(storedType); if (null != resolved) { return resolved; } } return storedType; } internal IReflectClass ReflectorFor(object clazz) { return ReflectorUtils.ReflectClassFor(Reflector(), clazz); } public bool AllowVersionUpdates() { return _config.GetAsBoolean(AllowVersionUpdatesKey); } public bool AutomaticShutDown() { return _config.GetAsBoolean(AutomaticShutdownKey); } public byte BlockSize() { return _config.GetAsByte(BlocksizeKey); } public int BTreeNodeSize() { return _config.GetAsInt(BtreeNodeSizeKey); } public string BlobPath() { return _config.GetAsString(BlobPathKey); } public CallBackMode CallbackMode() { return (CallBackMode)_config.Get(CallbacksKey); } public TernaryBool CallConstructors() { return _config.GetAsTernaryBool(CallConstructorsKey); } internal bool ClassActivationDepthConfigurable() { return _config.GetAsBoolean(ClassActivationDepthConfigurableKey); } internal object ClassLoader() { return _config.Get(ClassloaderKey); } public bool DetectSchemaChanges() { return _config.GetAsBoolean(DetectSchemaChangesKey); } public bool CommitRecoveryDisabled() { return _config.GetAsBoolean(DisableCommitRecoveryKey); } public IDiagnosticConfiguration Diagnostic() { return (IDiagnosticConfiguration)_config.Get(DiagnosticKey); } public Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor DiagnosticProcessor () { return (Db4objects.Db4o.Internal.Diagnostic.DiagnosticProcessor)_config.Get(DiagnosticKey ); } public int DiscardFreeSpace() { return _config.GetAsInt(DiscardFreespaceKey); } internal byte Encoding() { return _config.GetAsByte(EncodingKey); } internal bool Encrypt() { return _config.GetAsBoolean(EncryptKey); } public Hashtable4 ExceptionalClasses() { Hashtable4 exceptionalClasses = (Hashtable4)_config.Get(ExceptionalClassesKey); if (exceptionalClasses == null) { exceptionalClasses = new Hashtable4(16); _config.Put(ExceptionalClassesKey, exceptionalClasses); } return exceptionalClasses; } public bool ExceptionsOnNotStorable() { return _config.GetAsBoolean(ExceptionsOnNotStorableKey); } internal byte FreespaceSystem() { return _config.GetAsByte(FreespaceSystemKey); } public ConfigScope GenerateUUIDs() { return (ConfigScope)_config.Get(GenerateUuidsKey); } public TernaryBool GenerateCommitTimestamps() { return (TernaryBool)_config.Get(GenerateCommitTimestampsKey); } public bool InternStrings() { return _internStrings; } public bool LockFile() { return _config.GetAsBoolean(LockFileKey); } public int MessageLevel() { return _messageLevel; } public IMessageRecipient MessageRecipient() { return (IMessageRecipient)_config.Get(MessageRecipientKey); } internal bool OptimizeNQ() { return _config.GetAsBoolean(OptimizeNqKey); } internal string Password() { return _config.GetAsString(PasswordKey); } public void PrefetchIDCount(int prefetchIDCount) { _config.Put(PrefetchIdCountKey, prefetchIDCount); } public int PrefetchIDCount() { return _config.GetAsInt(PrefetchIdCountKey); } public void PrefetchObjectCount(int prefetchObjectCount) { _config.Put(PrefetchObjectCountKey, prefetchObjectCount); EnsurePrefetchSlotCacheSize(); } public int PrefetchObjectCount() { return _config.GetAsInt(PrefetchObjectCountKey); } public Hashtable4 ReadAs() { return (Hashtable4)_config.Get(ReadAsKey); } public bool IsReadOnly() { return _readOnly; } public void RecoveryMode(bool flag) { _config.Put(RecoveryModeKey, flag); } public bool RecoveryMode() { return _config.GetAsBoolean(RecoveryModeKey); } internal Collection4 Rename() { return (Collection4)_config.Get(RenameKey); } public int ReservedStorageSpace() { return _config.GetAsInt(ReservedStorageSpaceKey); } public bool SingleThreadedClient() { return _config.GetAsBoolean(SingleThreadedClientKey); } public bool TestConstructors() { return _config.GetAsBoolean(TestConstructorsKey); } public int TimeoutClientSocket() { return _config.GetAsInt(TimeoutClientSocketKey); } public int TimeoutServerSocket() { return _config.GetAsInt(TimeoutServerSocketKey); } public int UpdateDepth() { return _config.GetAsInt(UpdateDepthKey); } public int WeakReferenceCollectionInterval() { return _config.GetAsInt(WeakReferenceCollectionIntervalKey); } public bool WeakReferences() { return _config.GetAsBoolean(WeakReferencesKey); } public IoAdapter Io() { throw new NotImplementedException(); } public IStorage Storage { get { return (IStorage)_config.Get(StorageFactoryKey); } set { IStorage factory = value; _config.Put(StorageFactoryKey, factory); } } public IQueryConfiguration Queries() { return this; } public void EvaluationMode(QueryEvaluationMode mode) { _config.Put(QueryEvaluationModeKey, mode); } public QueryEvaluationMode EvaluationMode() { return (QueryEvaluationMode)_config.Get(QueryEvaluationModeKey); } public void QueryResultIteratorFactory(IQueryResultIteratorFactory factory) { _config.Put(ClientQueryResultIteratorFactoryKey, factory); } public IQueryResultIteratorFactory QueryResultIteratorFactory() { return (IQueryResultIteratorFactory)_config.Get(ClientQueryResultIteratorFactoryKey ); } public IClientServerConfiguration ClientServer() { return this; } public void BatchMessages(bool flag) { _config.Put(BatchMessagesKey, flag); } public bool BatchMessages() { return _config.GetAsBoolean(BatchMessagesKey); } public void MaxBatchQueueSize(int maxSize) { _config.Put(MaxBatchQueueSizeKey, maxSize); } public int MaxBatchQueueSize() { return _config.GetAsInt(MaxBatchQueueSizeKey); } public void ActivationDepthProvider(IActivationDepthProvider provider) { _config.Put(ActivationDepthProviderKey, provider); } public void UpdateDepthProvider(IUpdateDepthProvider provider) { _config.Put(UpdateDepthProviderKey, provider); } public IActivationDepthProvider ActivationDepthProvider() { return (IActivationDepthProvider)_config.Get(ActivationDepthProviderKey); } public IUpdateDepthProvider UpdateDepthProvider() { return (IUpdateDepthProvider)_config.Get(UpdateDepthProviderKey); } public void RegisterTypeHandler(ITypeHandlerPredicate predicate, ITypeHandler4 typeHandler ) { if (_registeredTypeHandlers == null) { _registeredTypeHandlers = new Collection4(); } _registeredTypeHandlers.Add(new TypeHandlerPredicatePair(predicate, typeHandler)); } public ITypeHandler4 TypeHandlerForClass(IReflectClass classReflector, byte handlerVersion ) { if (_registeredTypeHandlers == null) { return null; } IEnumerator i = _registeredTypeHandlers.GetEnumerator(); while (i.MoveNext()) { TypeHandlerPredicatePair pair = (TypeHandlerPredicatePair)i.Current; if (pair._predicate.Match(classReflector)) { return pair._typeHandler; } } return null; } public class ConfigDeepCloneContext { public readonly Config4Impl _orig; public readonly Config4Impl _cloned; public ConfigDeepCloneContext(Config4Impl orig, Config4Impl cloned) { _orig = orig; _cloned = cloned; } } public void Factory(ILegacyClientServerFactory factory) { _config.Put(ClientServerFactoryKey, factory); } public ILegacyClientServerFactory ClientServerFactory() { return (ILegacyClientServerFactory)_config.Get(ClientServerFactoryKey); } public ICacheConfiguration Cache() { return new CacheConfigurationImpl(this); } public bool FileBasedTransactionLog() { return _config.GetAsBoolean(FileBasedTransactionLogKey); } public void FileBasedTransactionLog(bool flag) { _config.Put(FileBasedTransactionLogKey, flag); } private bool IsTainted() { return _config.GetAsBoolean(TaintedKey); } public void Taint() { _config.Put(TaintedKey, true); } public static void AssertIsNotTainted(IConfiguration config) { if (((Config4Impl)config).IsTainted()) { throw new ArgumentException("Configuration already used."); } } public void PrefetchDepth(int prefetchDepth) { _config.Put(PrefetchDepthKey, prefetchDepth); EnsurePrefetchSlotCacheSize(); } private void EnsurePrefetchSlotCacheSize() { if (!_prefetchSlotCacheSizeModifiedExternally) { PrefetchSlotCacheSize(CalculatedPrefetchSlotcacheSize()); _prefetchSlotCacheSizeModifiedExternally = false; } } public int PrefetchDepth() { return _config.GetAsInt(PrefetchDepthKey); } public IList EnvironmentContributions() { return (IList)_config.Get(EnvironmentContributionsKey); } public void PrefetchSlotCacheSize(int slotCacheSize) { _prefetchSlotCacheSizeModifiedExternally = true; _config.Put(PrefetchSlotCacheSizeKey, slotCacheSize); if (null != _prefetchSettingsChanged) _prefetchSettingsChanged(null, EventArgs.Empty ); } public int PrefetchSlotCacheSize() { return _config.GetAsInt(PrefetchSlotCacheSizeKey); } private int CalculatedPrefetchSlotcacheSize() { long calculated = (long)PrefetchDepth() * PrefetchObjectCount() * PrefetchSlotCacheSizeFactor; if (calculated > MaximumPrefetchSlotCacheSize) { calculated = MaximumPrefetchSlotCacheSize; } return (int)calculated; } public event System.EventHandler PrefetchSettingsChanged { add { _prefetchSettingsChanged = (System.EventHandler)System.Delegate.Combine (_prefetchSettingsChanged, value); } remove { _prefetchSettingsChanged = (System.EventHandler)System.Delegate.Remove (_prefetchSettingsChanged, value); } } public void ReferenceSystemFactory(IReferenceSystemFactory referenceSystemFactory ) { _config.Put(ReferenceSystemFactoryKey, referenceSystemFactory); } public IReferenceSystemFactory ReferenceSystemFactory() { return (IReferenceSystemFactory)_config.Get(ReferenceSystemFactoryKey); } public void NameProvider(INameProvider provider) { _config.Put(NameProviderKey, provider); } public INameProvider NameProvider() { return (INameProvider)_config.Get(NameProviderKey); } public void UsePointerBasedIdSystem() { _config.Put(IdSystemKey, StandardIdSystemFactory.PointerBased); } public void UseStackedBTreeIdSystem() { _config.Put(IdSystemKey, StandardIdSystemFactory.StackedBtree); } public void UseSingleBTreeIdSystem() { _config.Put(IdSystemKey, StandardIdSystemFactory.SingleBtree); } public byte IdSystemType() { return _config.GetAsByte(IdSystemKey); } public void UseInMemoryIdSystem() { _config.Put(IdSystemKey, StandardIdSystemFactory.InMemory); } public void UseCustomIdSystem(IIdSystemFactory factory) { _config.Put(IdSystemKey, StandardIdSystemFactory.Custom); _config.Put(IdSystemCustomFactoryKey, factory); } public IIdSystemFactory CustomIdSystemFactory() { return (IIdSystemFactory)_config.Get(IdSystemCustomFactoryKey); } public void AsynchronousSync(bool flag) { _config.Put(AsynchronousSyncKey, flag); } public bool AsynchronousSync() { return _config.GetAsBoolean(AsynchronousSyncKey); } public int MaxStackDepth() { return _config.GetAsInt(MaxStackDepthKey); } public void MaxStackDepth(int maxStackDepth) { _config.Put(MaxStackDepthKey, maxStackDepth); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/0000755000175000017500000000000011700531646026223 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/0000755000175000017500000000000011700531646030533 5ustar00meebeymeebey00000000000000CommonConversions.cs0000644000175000017500000000216111700531646034464 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Convert; using Db4objects.Db4o.Internal.Convert.Conversions; namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public class CommonConversions { public static void Register(Converter converter) { converter.Register(ClassIndexesToBTrees_5_5.Version, new ClassIndexesToBTrees_5_5 ()); converter.Register(FieldIndexesToBTrees_5_7.Version, new FieldIndexesToBTrees_5_7 ()); converter.Register(ClassAspects_7_4.Version, new ClassAspects_7_4()); converter.Register(ReindexNetDateTime_7_8.Version, new ReindexNetDateTime_7_8()); converter.Register(DropEnumClassIndexes_7_10.Version, new DropEnumClassIndexes_7_10 ()); converter.Register(DropGuidClassIndexes_7_12.Version, new DropGuidClassIndexes_7_12 ()); converter.Register(DropDateTimeOffsetClassIndexes_7_12.Version, new DropDateTimeOffsetClassIndexes_7_12 ()); converter.Register(VersionNumberToCommitTimestamp_8_0.Version, new VersionNumberToCommitTimestamp_8_0 ()); } } } DropDateTimeOffsetClassIndexes_7_12.cs0000644000175000017500000000040111700531646037524 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public partial class DropDateTimeOffsetClassIndexes_7_12 { public const int Version = 11; } } ReindexNetDateTime_7_8.cs0000644000175000017500000000036311700531646035144 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public partial class ReindexNetDateTime_7_8 { public const int Version = 8; } } DropGuidClassIndexes_7_12.cs0000644000175000017500000000036711700531646035564 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public partial class DropGuidClassIndexes_7_12 { public const int Version = 10; } } FieldIndexesToBTrees_5_7.cs0000644000175000017500000000205411700531646035431 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Convert; namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public class FieldIndexesToBTrees_5_7 : Conversion { public const int Version = 6; public override void Convert(ConversionStage.SystemUpStage stage) { stage.File().ClassCollection().WriteAllClasses(); RebuildUUIDIndex(stage.File()); FreeOldUUIDMetaIndex(stage.File()); } private void RebuildUUIDIndex(LocalObjectContainer file) { UUIDFieldMetadata uuid = file.UUIDIndex(); ClassMetadataIterator i = file.ClassCollection().Iterator(); while (i.MoveNext()) { ClassMetadata clazz = i.CurrentClass(); if (clazz.GenerateUUIDs()) { uuid.RebuildIndexForClass(file, clazz); } } } /// private void FreeOldUUIDMetaIndex(LocalObjectContainer file) { } // updating removed here to allow removing MetaIndex class } } VersionNumberToCommitTimestamp_8_0.cs0000644000175000017500000000545411700531646037617 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Convert; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public class VersionNumberToCommitTimestamp_8_0 : Conversion { public const int Version = 12; private VersionFieldMetadata versionFieldMetadata; public override void Convert(ConversionStage.SystemUpStage stage) { LocalObjectContainer container = stage.File(); if (!container.Config().GenerateCommitTimestamps().DefiniteYes()) { return; } container.ClassCollection().WriteAllClasses(); BuildCommitTimestampIndex(container); container.SystemTransaction().Commit(); } private void BuildCommitTimestampIndex(LocalObjectContainer container) { versionFieldMetadata = container.Handlers.Indexes()._version; ClassMetadataIterator i = container.ClassCollection().Iterator(); while (i.MoveNext()) { ClassMetadata clazz = i.CurrentClass(); if (clazz.HasVersionField() && !clazz.IsStruct()) { RebuildIndexForClass(container, clazz); } } } public virtual bool RebuildIndexForClass(LocalObjectContainer container, ClassMetadata classMetadata) { long[] ids = classMetadata.GetIDs(); for (int i = 0; i < ids.Length; i++) { RebuildIndexForObject(container, (int)ids[i]); } return ids.Length > 0; } /// protected virtual void RebuildIndexForObject(LocalObjectContainer container, int objectId) { StatefulBuffer writer = container.ReadStatefulBufferById(container.SystemTransaction (), objectId); if (writer != null) { RebuildIndexForWriter(container, writer, objectId); } } protected virtual void RebuildIndexForWriter(LocalObjectContainer container, StatefulBuffer buffer, int objectId) { ObjectHeader objectHeader = new ObjectHeader(container, buffer); ObjectIdContextImpl context = new ObjectIdContextImpl(container.SystemTransaction (), buffer, objectHeader, objectId); ClassMetadata classMetadata = context.ClassMetadata(); if (classMetadata.IsStruct()) { // We don't keep version information for structs. return; } if (classMetadata.SeekToField(container.SystemTransaction(), buffer, versionFieldMetadata ) != HandlerVersion.Invalid) { long version = ((long)versionFieldMetadata.Read(context)); if (version != 0) { LocalTransaction t = (LocalTransaction)container.SystemTransaction(); t.CommitTimestampSupport().Put(container.SystemTransaction(), objectId, version); } } } } } ClassIndexesToBTrees_5_5.cs0000644000175000017500000000202311700531646035445 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Convert; namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public class ClassIndexesToBTrees_5_5 : Conversion { public const int Version = 5; public virtual void Convert(LocalObjectContainer container, int classIndexId, BTree bTree) { Transaction trans = container.SystemTransaction(); ByteArrayBuffer reader = container.ReadBufferById(trans, classIndexId); if (reader == null) { return; } int entries = reader.ReadInt(); for (int i = 0; i < entries; i++) { bTree.Add(trans, reader.ReadInt()); } } public override void Convert(ConversionStage.SystemUpStage stage) { // calling #storedClasses forces reading all classes // That's good enough to load them all and to call the // above convert method. stage.File().StoredClasses(); } } } DropEnumClassIndexes_7_10.cs0000644000175000017500000000036711700531646035576 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Convert.Conversions { /// * public partial class DropEnumClassIndexes_7_10 { public const int Version = 9; } } ClassAspects_7_4.cs0000644000175000017500000000064411700531646034050 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Convert; namespace Db4objects.Db4o.Internal.Convert.Conversions { /// public class ClassAspects_7_4 : Conversion { public const int Version = 7; public override void Convert(ConversionStage.SystemUpStage stage) { stage.File().ClassCollection().WriteAllClasses(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Converter.cs0000644000175000017500000000436311700531646030527 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Internal.Convert; using Db4objects.Db4o.Internal.Convert.Conversions; namespace Db4objects.Db4o.Internal.Convert { /// public class Converter { public const int Version = VersionNumberToCommitTimestamp_8_0.Version; public static bool Convert(ConversionStage stage) { if (!NeedsConversion(stage.ConverterVersion())) { return false; } return Instance().RunConversions(stage); } private static Db4objects.Db4o.Internal.Convert.Converter _instance; private IDictionary _conversions; private int _minimumVersion = int.MaxValue; private Converter() { _conversions = new Hashtable(); // TODO: There probably will be Java and .NET conversions // Create Platform4.registerConversions() method ann // call from here when needed. CommonConversions.Register(this); } public static Db4objects.Db4o.Internal.Convert.Converter Instance() { if (_instance == null) { _instance = new Db4objects.Db4o.Internal.Convert.Converter(); } return _instance; } public virtual Conversion ConversionFor(int version) { return ((Conversion)_conversions[version]); } private static bool NeedsConversion(int converterVersion) { return converterVersion < Version; } public virtual void Register(int introducedVersion, Conversion conversion) { if (_conversions.Contains(introducedVersion)) { throw new InvalidOperationException(); } if (introducedVersion < _minimumVersion) { _minimumVersion = introducedVersion; } _conversions[introducedVersion] = conversion; } public virtual bool RunConversions(ConversionStage stage) { int startingVersion = Math.Max(stage.ConverterVersion() + 1, _minimumVersion); for (int version = startingVersion; version <= Version; version++) { Conversion conversion = ConversionFor(version); if (conversion == null) { throw new InvalidOperationException("Could not find a conversion for version " + version); } stage.Accept(conversion); } return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/Conversion.cs0000644000175000017500000000073411700531646030703 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Convert; namespace Db4objects.Db4o.Internal.Convert { /// public abstract class Conversion { /// public virtual void Convert(ConversionStage.ClassCollectionAvailableStage stage) { } /// public virtual void Convert(ConversionStage.SystemUpStage stage) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Convert/ConversionStage.cs0000644000175000017500000000217511700531646031670 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Convert; namespace Db4objects.Db4o.Internal.Convert { /// public abstract class ConversionStage { public sealed class ClassCollectionAvailableStage : ConversionStage { public ClassCollectionAvailableStage(LocalObjectContainer file) : base(file) { } public override void Accept(Conversion conversion) { conversion.Convert(this); } } public sealed class SystemUpStage : ConversionStage { public SystemUpStage(LocalObjectContainer file) : base(file) { } public override void Accept(Conversion conversion) { conversion.Convert(this); } } private LocalObjectContainer _file; protected ConversionStage(LocalObjectContainer file) { _file = file; } public virtual LocalObjectContainer File() { return _file; } public virtual int ConverterVersion() { return _file.SystemData().ConverterVersion(); } public abstract void Accept(Conversion conversion); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Threading/0000755000175000017500000000000011700531646026510 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Threading/ThreadPool4Impl.cs0000644000175000017500000000545711700531646032021 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections.Generic; using Db4objects.Db4o.Internal.Threading; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Threading { public class ThreadPool4Impl : IThreadPool4 { private System.EventHandler _uncaughtException; private readonly IList _activeThreads = new List(); /// public virtual void Join(int timeoutMilliseconds) { foreach (Thread thread in ActiveThreads()) { thread.Join(timeoutMilliseconds); } } public virtual void StartLowPriority(string taskName, IRunnable task) { Thread thread = ThreadFor(taskName, task); ActivateThread(thread); } public virtual void Start(string taskName, IRunnable task) { Thread thread = ThreadFor(taskName, task); ActivateThread(thread); } private Thread ThreadFor(string threadName, IRunnable task) { Thread thread = new Thread(new _IRunnable_41(this, task), threadName); thread.SetDaemon(true); return thread; } private sealed class _IRunnable_41 : IRunnable { public _IRunnable_41(ThreadPool4Impl _enclosing, IRunnable task) { this._enclosing = _enclosing; this.task = task; } public void Run() { try { task.Run(); } catch (Exception e) { this._enclosing.TriggerUncaughtExceptionEvent(e); } finally { this._enclosing.Dispose(Thread.CurrentThread()); } } private readonly ThreadPool4Impl _enclosing; private readonly IRunnable task; } private void ActivateThread(Thread thread) { AddActiveThread(thread); thread.Start(); } private Thread[] ActiveThreads() { lock (_activeThreads) { return Sharpen.Collections.ToArray(_activeThreads, new Thread[_activeThreads.Count ]); } } private void AddActiveThread(Thread thread) { lock (_activeThreads) { _activeThreads.Add(thread); } } protected virtual void Dispose(Thread thread) { lock (_activeThreads) { _activeThreads.Remove(thread); } } protected virtual void TriggerUncaughtExceptionEvent(Exception e) { if (null != _uncaughtException) _uncaughtException(null, new UncaughtExceptionEventArgs (e)); } public virtual event System.EventHandler UncaughtException { add { _uncaughtException = (System.EventHandler)System.Delegate.Combine (_uncaughtException, value); } remove { _uncaughtException = (System.EventHandler)System.Delegate.Remove (_uncaughtException, value); } } } } UncaughtExceptionEventArgs.cs0000644000175000017500000000065511700531646034242 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Threading/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Threading { public class UncaughtExceptionEventArgs : EventArgs { private System.Exception _exception; public UncaughtExceptionEventArgs(System.Exception e) { _exception = e; } public virtual System.Exception Exception { get { return _exception; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Threading/IThreadPool4.cs0000644000175000017500000000072211700531646031276 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Threading { public interface IThreadPool4 { void Start(string taskName, IRunnable task); void StartLowPriority(string taskName, IRunnable task); event System.EventHandler UncaughtException; /// void Join(int timeoutMilliseconds); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/NullTransactionListener.cs0000644000175000017500000000072711700531646031766 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Internal { public class NullTransactionListener : ITransactionListener { public static readonly ITransactionListener Instance = new Db4objects.Db4o.Internal.NullTransactionListener (); private NullTransactionListener() { } public virtual void PostRollback() { } public virtual void PreCommit() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/OpenTypeHandler.cs0000644000175000017500000002434511700531646030203 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Handlers.Versions; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { public class OpenTypeHandler : IReferenceTypeHandler, IValueTypeHandler, IBuiltinTypeHandler , ICascadingTypeHandler, ILinkLengthAware { private const int Hashcode = 1003303143; private ObjectContainerBase _container; public OpenTypeHandler(ObjectContainerBase container) { _container = container; } internal virtual ObjectContainerBase Container() { return _container; } public virtual IReflectClass ClassReflector() { return Container().Handlers.IclassObject; } public virtual void CascadeActivation(IActivationContext context) { object targetObject = context.TargetObject(); if (IsPlainObject(targetObject)) { return; } ITypeHandler4 typeHandler = TypeHandlerForObject(targetObject); Handlers4.CascadeActivation(context, typeHandler); } /// public virtual void Delete(IDeleteContext context) { int payLoadOffset = context.ReadInt(); if (context.IsLegacyHandlerVersion()) { context.DefragmentRecommended(); return; } if (payLoadOffset <= 0) { return; } int linkOffset = context.Offset(); context.Seek(payLoadOffset); int classMetadataID = context.ReadInt(); ITypeHandler4 typeHandler = Container().ClassMetadataForID(classMetadataID).TypeHandler (); if (typeHandler != null) { context.Delete(typeHandler); } context.Seek(linkOffset); } public virtual int GetID() { return Handlers4.UntypedId; } public virtual bool HasField(ObjectContainerBase a_stream, string a_path) { return a_stream.ClassCollection().FieldExists(a_path); } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { int payLoadOffSet = context.ReadInt(); if (payLoadOffSet == 0) { return null; } context.Seek(payLoadOffSet); int classMetadataID = context.ReadInt(); ClassMetadata classMetadata = context.Container().ClassMetadataForID(classMetadataID ); if (classMetadata == null) { return null; } return classMetadata.ReadCandidateHandler(context); } public virtual ObjectID ReadObjectID(IInternalReadContext context) { int payloadOffset = context.ReadInt(); if (payloadOffset == 0) { return ObjectID.IsNull; } int savedOffset = context.Offset(); ITypeHandler4 typeHandler = ReadTypeHandler(context, payloadOffset); if (typeHandler == null) { context.Seek(savedOffset); return ObjectID.IsNull; } SeekSecondaryOffset(context, typeHandler); if (typeHandler is IReadsObjectIds) { ObjectID readObjectID = ((IReadsObjectIds)typeHandler).ReadObjectID(context); context.Seek(savedOffset); return readObjectID; } context.Seek(savedOffset); return ObjectID.NotPossible; } public virtual void Defragment(IDefragmentContext context) { int payLoadOffSet = context.ReadInt(); if (payLoadOffSet == 0) { return; } int savedOffSet = context.Offset(); context.Seek(payLoadOffSet); try { int classMetadataId = context.CopyIDReturnOriginalID(); ITypeHandler4 typeHandler = CorrectTypeHandlerVersionFor(context, classMetadataId ); if (typeHandler == null) { return; } SeekSecondaryOffset(context, typeHandler); if (IsPlainObject(typeHandler)) { context.Defragment(new PlainObjectHandler()); } else { context.Defragment(typeHandler); } } finally { context.Seek(savedOffSet); } } protected virtual ITypeHandler4 CorrectTypeHandlerVersionFor(IDefragmentContext context , int classMetadataId) { ITypeHandler4 typeHandler = context.TypeHandlerForId(classMetadataId); if (null == typeHandler) { return null; } ClassMetadata classMetadata = Container(context).ClassMetadataForID(classMetadataId ); return HandlerRegistry.CorrectHandlerVersion(context, typeHandler, classMetadata); } protected virtual ObjectContainerBase Container(IDefragmentContext context) { return context.Transaction().Container(); } protected virtual ITypeHandler4 ReadTypeHandler(IInternalReadContext context, int payloadOffset) { context.Seek(payloadOffset); ITypeHandler4 typeHandler = Container().TypeHandlerForClassMetadataID(context.ReadInt ()); return HandlerRegistry.CorrectHandlerVersion(context, typeHandler); } /// /// protected virtual void SeekSecondaryOffset(IReadBuffer buffer, ITypeHandler4 typeHandler ) { } // do nothing, no longer needed in current implementation. public virtual object Read(IReadContext readContext) { IInternalReadContext context = (IInternalReadContext)readContext; int payloadOffset = context.ReadInt(); if (payloadOffset == 0) { context.NotifyNullReferenceSkipped(); return null; } int savedOffSet = context.Offset(); try { ITypeHandler4 typeHandler = ReadTypeHandler(context, payloadOffset); if (typeHandler == null) { return null; } SeekSecondaryOffset(context, typeHandler); if (IsPlainObject(typeHandler)) { return context.ReadAtCurrentSeekPosition(new PlainObjectHandler()); } return context.ReadAtCurrentSeekPosition(typeHandler); } finally { context.Seek(savedOffSet); } } public virtual void Activate(IReferenceActivationContext context) { } // throw new IllegalStateException(); public virtual void CollectIDs(QueryingReadContext readContext) { IInternalReadContext context = (IInternalReadContext)readContext; int payloadOffset = context.ReadInt(); if (payloadOffset == 0) { return; } int savedOffSet = context.Offset(); try { ITypeHandler4 typeHandler = ReadTypeHandler(context, payloadOffset); if (typeHandler == null) { return; } SeekSecondaryOffset(context, typeHandler); if (IsPlainObject(typeHandler)) { readContext.Collector().AddId(readContext.ReadInt()); return; } CollectIdContext collectIdContext = new _CollectIdContext_201(readContext, readContext .Transaction(), readContext.Collector(), null, readContext.Buffer()); Handlers4.CollectIdsInternal(collectIdContext, context.Container().Handlers.CorrectHandlerVersion (typeHandler, context.HandlerVersion()), 0, false); } finally { context.Seek(savedOffSet); } } private sealed class _CollectIdContext_201 : CollectIdContext { public _CollectIdContext_201(QueryingReadContext readContext, Transaction baseArg1 , IdObjectCollector baseArg2, ObjectHeader baseArg3, IReadBuffer baseArg4) : base (baseArg1, baseArg2, baseArg3, baseArg4) { this.readContext = readContext; } public override int HandlerVersion() { return readContext.HandlerVersion(); } public override SlotFormat SlotFormat() { return new _SlotFormatCurrent_207(); } private sealed class _SlotFormatCurrent_207 : SlotFormatCurrent { public _SlotFormatCurrent_207() { } public override bool IsIndirectedWithinSlot(ITypeHandler4 handler) { return false; } } private readonly QueryingReadContext readContext; } public virtual ITypeHandler4 ReadTypeHandlerRestoreOffset(IInternalReadContext context ) { int savedOffset = context.Offset(); int payloadOffset = context.ReadInt(); ITypeHandler4 typeHandler = payloadOffset == 0 ? null : ReadTypeHandler(context, payloadOffset); context.Seek(savedOffset); return typeHandler; } public virtual void Write(IWriteContext context, object obj) { if (obj == null) { context.WriteInt(0); return; } MarshallingContext marshallingContext = (MarshallingContext)context; ClassMetadata classMetadata = ClassMetadataFor(obj); if (classMetadata == null) { context.WriteInt(0); return; } MarshallingContextState state = marshallingContext.CurrentState(); marshallingContext.CreateChildBuffer(false); context.WriteInt(classMetadata.GetID()); WriteObject(context, classMetadata.TypeHandler(), obj); marshallingContext.RestoreState(state); } private ClassMetadata ClassMetadataFor(object obj) { return Container().ClassMetadataForObject(obj); } private void WriteObject(IWriteContext context, ITypeHandler4 typeHandler, object obj) { if (IsPlainObject(obj)) { context.WriteObject(new PlainObjectHandler(), obj); return; } if (Handlers4.UseDedicatedSlot(context, typeHandler)) { context.WriteObject(obj); } else { typeHandler.Write(context, obj); } } private bool IsPlainObject(object obj) { if (obj == null) { return false; } return obj.GetType() == Const4.ClassObject; } public static bool IsPlainObject(ITypeHandler4 typeHandler) { return typeHandler.GetType() == typeof(Db4objects.Db4o.Internal.OpenTypeHandler) || typeHandler.GetType() == typeof(OpenTypeHandler0) || typeHandler.GetType() == typeof(OpenTypeHandler2) || typeHandler.GetType() == typeof(OpenTypeHandler7); } public virtual ITypeHandler4 TypeHandlerForObject(object obj) { return ClassMetadataFor(obj).TypeHandler(); } public override bool Equals(object obj) { return obj is Db4objects.Db4o.Internal.OpenTypeHandler && !(obj is InterfaceTypeHandler ); } public override int GetHashCode() { return Hashcode; } public virtual void RegisterReflector(IReflector reflector) { } // nothing to do public virtual int LinkLength() { return Const4.IdLength; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TreeIntObject.cs0000644000175000017500000000424111700531646027634 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public class TreeIntObject : TreeInt { public object _object; public TreeIntObject(int a_key) : base(a_key) { } public TreeIntObject(int a_key, object a_object) : base(a_key) { _object = a_object; } public override object ShallowClone() { return ShallowCloneInternal(new Db4objects.Db4o.Internal.TreeIntObject(_key)); } protected override Tree ShallowCloneInternal(Tree tree) { Db4objects.Db4o.Internal.TreeIntObject tio = (Db4objects.Db4o.Internal.TreeIntObject )base.ShallowCloneInternal(tree); tio._object = _object; return tio; } public virtual object GetObject() { return _object; } public virtual void SetObject(object obj) { _object = obj; } public override object Read(ByteArrayBuffer a_bytes) { int key = a_bytes.ReadInt(); object obj = null; if (_object is TreeInt) { obj = new TreeReader(a_bytes, (IReadable)_object).Read(); } else { obj = ((IReadable)_object).Read(a_bytes); } return new Db4objects.Db4o.Internal.TreeIntObject(key, obj); } public override void Write(ByteArrayBuffer a_writer) { a_writer.WriteInt(_key); if (_object == null) { a_writer.WriteInt(0); } else { if (_object is TreeInt) { TreeInt.Write(a_writer, (TreeInt)_object); } else { ((IReadWriteable)_object).Write(a_writer); } } } public override int OwnLength() { if (_object == null) { return Const4.IntLength * 2; } return Const4.IntLength + ((IReadable)_object).MarshalledLength(); } internal override bool VariableLength() { return true; } public static Db4objects.Db4o.Internal.TreeIntObject Add(Db4objects.Db4o.Internal.TreeIntObject tree, int key, object value) { return ((Db4objects.Db4o.Internal.TreeIntObject)Tree.Add(tree, new Db4objects.Db4o.Internal.TreeIntObject (key, value))); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IModificationAware.cs0000644000175000017500000000032611700531646030631 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { /// public interface IModificationAware { bool IsModified(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ObjectAnalyzer.cs0000644000175000017500000000464111700531646030053 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal { /// internal class ObjectAnalyzer { private readonly ObjectContainerBase _container; private readonly object _obj; private Db4objects.Db4o.Internal.ClassMetadata _classMetadata; private Db4objects.Db4o.Internal.ObjectReference _ref; private bool _notStorable; internal ObjectAnalyzer(ObjectContainerBase container, object obj) { _container = container; _obj = obj; } internal virtual void Analyze(Transaction trans) { _ref = trans.ReferenceForObject(_obj); if (_ref != null) { _classMetadata = _ref.ClassMetadata(); return; } IReflectClass claxx = _container.Reflector().ForObject(_obj); if (claxx == null) { NotStorable(_obj, claxx); return; } if (!DetectClassMetadata(trans, claxx)) { return; } if (IsValueType(_classMetadata)) { NotStorable(_obj, _classMetadata.ClassReflector()); } } private bool DetectClassMetadata(Transaction trans, IReflectClass claxx) { _classMetadata = _container.GetActiveClassMetadata(claxx); if (_classMetadata != null) { if (!_classMetadata.IsStorable()) { NotStorable(_obj, claxx); return false; } return true; } _classMetadata = _container.ProduceClassMetadata(claxx); if (_classMetadata == null || !_classMetadata.IsStorable()) { NotStorable(_obj, claxx); return false; } // The following may return a reference if the object is held // in a static variable somewhere ( often: Enums) that gets // stored or associated on initialization of the ClassMetadata. _ref = trans.ReferenceForObject(_obj); return true; } private void NotStorable(object obj, IReflectClass claxx) { _container.NotStorable(claxx, obj); _notStorable = true; } internal virtual bool NotStorable() { return _notStorable; } private bool IsValueType(Db4objects.Db4o.Internal.ClassMetadata classMetadata) { return classMetadata.IsValueType(); } internal virtual Db4objects.Db4o.Internal.ObjectReference ObjectReference() { return _ref; } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _classMetadata; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ClassAspect.cs0000644000175000017500000000400511700531646027336 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public abstract class ClassAspect { protected int _handle; private int _disabledFromAspectCountVersion = AspectVersionContextImpl.AlwaysEnabled .DeclaredAspectCount(); // used for identification when sending in C/S mode public abstract Db4objects.Db4o.Internal.Marshall.AspectType AspectType(); public abstract string GetName(); public abstract void CascadeActivation(IActivationContext context); public abstract int LinkLength(); public void IncrementOffset(IReadBuffer buffer) { buffer.Seek(buffer.Offset() + LinkLength()); } public abstract void DefragAspect(IDefragmentContext context); public abstract void Marshall(MarshallingContext context, object child); public abstract void CollectIDs(CollectIdContext context); public virtual void SetHandle(int handle) { _handle = handle; } public abstract void Activate(UnmarshallingContext context); public abstract void Delete(DeleteContextImpl context, bool isUpdate); public abstract bool CanBeDisabled(); protected virtual bool CheckEnabled(IAspectVersionContext context) { if (!IsEnabledOn(context)) { IncrementOffset((IReadBuffer)context); return false; } return true; } public virtual void DisableFromAspectCountVersion(int aspectCount) { if (!CanBeDisabled()) { return; } if (aspectCount < _disabledFromAspectCountVersion) { _disabledFromAspectCountVersion = aspectCount; } } public bool IsEnabledOn(IAspectVersionContext context) { return _disabledFromAspectCountVersion > context.DeclaredAspectCount(); } public abstract void Deactivate(IActivationContext context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/InterfaceTypeHandler.cs0000644000175000017500000000065011700531646031173 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { public sealed class InterfaceTypeHandler : OpenTypeHandler { public InterfaceTypeHandler(ObjectContainerBase container) : base(container) { } public override bool Equals(object obj) { return obj is Db4objects.Db4o.Internal.InterfaceTypeHandler; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/InCallback.cs0000644000175000017500000000125711700531646027122 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { /// public class InCallback { private sealed class _DynamicVariable_12 : DynamicVariable { public _DynamicVariable_12() { } protected override object DefaultValue() { return false; } } private static readonly DynamicVariable _inCallback = new _DynamicVariable_12(); public static bool Value() { return (((bool)_inCallback.Value)); } public static void Run(IRunnable runnable) { _inCallback.With(true, runnable); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/ITransactionParticipant.cs0000644000175000017500000000054011700531646031726 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public interface ITransactionParticipant { void Commit(Transaction transaction); void Rollback(Transaction transaction); void Dispose(Transaction transaction); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IDb4oTypeImpl.cs0000644000175000017500000000070011700531646027514 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// marker interface for special db4o datatypes /// public interface IDb4oTypeImpl : ITransactionAware { object CreateDefault(Transaction trans); bool HasClassIndex(); void SetObjectReference(ObjectReference @ref); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/VersionFieldMetadata.cs0000644000175000017500000000332011700531646031162 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public class VersionFieldMetadata : VirtualFieldMetadata { internal VersionFieldMetadata() : base(Handlers4.LongId, new LongHandler()) { SetName(VirtualField.Version); } /// public override void AddFieldIndex(ObjectIdContextImpl context) { StatefulBuffer buffer = (StatefulBuffer)context.Buffer(); buffer.WriteLong(context.Transaction().Container().GenerateTimeStampId()); } public override void Delete(DeleteContextImpl context, bool isUpdate) { context.Seek(context.Offset() + LinkLength()); } internal override void Instantiate1(ObjectReferenceContext context) { context.ObjectReference().VirtualAttributes().i_version = context.ReadLong(); } internal override void Marshall(Transaction trans, ObjectReference @ref, IWriteBuffer buffer, bool isMigrating, bool isNew) { VirtualAttributes attr = @ref.VirtualAttributes(); if (!isMigrating) { attr.i_version = trans.Container().GenerateTimeStampId(); } if (attr == null) { buffer.WriteLong(0); } else { buffer.WriteLong(attr.i_version); } } public override int LinkLength() { return Const4.LongLength; } internal override void MarshallIgnore(IWriteBuffer buffer) { buffer.WriteLong(0); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IObjectContainerSpec.cs0000644000175000017500000000107711700531646031134 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { /// Workaround to provide the Java 5 version with a hook to add ExtObjectContainer. /// /// /// Workaround to provide the Java 5 version with a hook to add ExtObjectContainer. /// (Generic method declarations won't match ungenerified YapStreamBase implementations /// otherwise and implementing it directly kills .NET conversion.) /// /// public interface IObjectContainerSpec { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/0000755000175000017500000000000011700531646026664 5ustar00meebeymeebey00000000000000TransactionalReferenceSystemBase.cs0000644000175000017500000000344211700531646035560 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal.References { /// public abstract class TransactionalReferenceSystemBase { protected readonly IReferenceSystem _committedReferences; protected IReferenceSystem _newReferences; public TransactionalReferenceSystemBase() { CreateNewReferences(); _committedReferences = NewReferenceSystem(); } private IReferenceSystem NewReferenceSystem() { return new HashcodeReferenceSystem(); } public abstract void AddExistingReference(ObjectReference @ref); public abstract void AddNewReference(ObjectReference @ref); public abstract void Commit(); protected virtual void TraverseNewReferences(IVisitor4 visitor) { _newReferences.TraverseReferences(visitor); } protected virtual void CreateNewReferences() { _newReferences = NewReferenceSystem(); } public virtual ObjectReference ReferenceForId(int id) { ObjectReference @ref = _newReferences.ReferenceForId(id); if (@ref != null) { return @ref; } return _committedReferences.ReferenceForId(id); } public virtual ObjectReference ReferenceForObject(object obj) { ObjectReference @ref = _newReferences.ReferenceForObject(obj); if (@ref != null) { return @ref; } return _committedReferences.ReferenceForObject(obj); } public abstract void RemoveReference(ObjectReference @ref); public abstract void Rollback(); public virtual void TraverseReferences(IVisitor4 visitor) { TraverseNewReferences(visitor); _committedReferences.TraverseReferences(visitor); } } } ReferenceSystemRegistry.cs0000644000175000017500000000522211700531646033771 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal.References { /// public class ReferenceSystemRegistry { private readonly Collection4 _referenceSystems = new Collection4(); public virtual void RemoveId(int id) { RemoveReference(new _IReferenceSource_17(id)); } private sealed class _IReferenceSource_17 : ReferenceSystemRegistry.IReferenceSource { public _IReferenceSource_17(int id) { this.id = id; } public ObjectReference ReferenceFrom(IReferenceSystem referenceSystem) { return referenceSystem.ReferenceForId(id); } private readonly int id; } public virtual void RemoveObject(object obj) { RemoveReference(new _IReferenceSource_25(obj)); } private sealed class _IReferenceSource_25 : ReferenceSystemRegistry.IReferenceSource { public _IReferenceSource_25(object obj) { this.obj = obj; } public ObjectReference ReferenceFrom(IReferenceSystem referenceSystem) { return referenceSystem.ReferenceForObject(obj); } private readonly object obj; } public virtual void RemoveReference(ObjectReference reference) { RemoveReference(new _IReferenceSource_33(reference)); } private sealed class _IReferenceSource_33 : ReferenceSystemRegistry.IReferenceSource { public _IReferenceSource_33(ObjectReference reference) { this.reference = reference; } public ObjectReference ReferenceFrom(IReferenceSystem referenceSystem) { return reference; } private readonly ObjectReference reference; } private void RemoveReference(ReferenceSystemRegistry.IReferenceSource referenceSource ) { IEnumerator i = _referenceSystems.GetEnumerator(); while (i.MoveNext()) { IReferenceSystem referenceSystem = (IReferenceSystem)i.Current; ObjectReference reference = referenceSource.ReferenceFrom(referenceSystem); if (reference != null) { referenceSystem.RemoveReference(reference); } } } public virtual void AddReferenceSystem(IReferenceSystem referenceSystem) { _referenceSystems.Add(referenceSystem); } public virtual bool RemoveReferenceSystem(IReferenceSystem referenceSystem) { bool res = _referenceSystems.Remove(referenceSystem); referenceSystem.Discarded(); return res; } private interface IReferenceSource { ObjectReference ReferenceFrom(IReferenceSystem referenceSystem); } } } IReferenceSystemFactory.cs0000644000175000017500000000054111700531646033700 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal.References { /// public interface IReferenceSystemFactory { IReferenceSystem NewReferenceSystem(IInternalObjectContainer container); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/IReferenceSystem.cs0000644000175000017500000000115711700531646032433 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.References { /// public interface IReferenceSystem { void AddNewReference(ObjectReference @ref); void AddExistingReference(ObjectReference @ref); void Commit(); ObjectReference ReferenceForId(int id); ObjectReference ReferenceForObject(object obj); void RemoveReference(ObjectReference @ref); void Rollback(); void TraverseReferences(IVisitor4 visitor); void Discarded(); } } HashcodeReferenceSystem.cs0000644000175000017500000000606111700531646033701 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal.References { /// public class HashcodeReferenceSystem : IReferenceSystem { private ObjectReference _hashCodeTree; private ObjectReference _idTree; public virtual void AddNewReference(ObjectReference @ref) { AddReference(@ref); } public virtual void AddExistingReference(ObjectReference @ref) { AddReference(@ref); } private void AddReference(ObjectReference @ref) { @ref.Ref_init(); IdAdd(@ref); HashCodeAdd(@ref); } public virtual void Commit() { } // do nothing private void HashCodeAdd(ObjectReference @ref) { if (_hashCodeTree == null) { _hashCodeTree = @ref; return; } _hashCodeTree = _hashCodeTree.Hc_add(@ref); } private void IdAdd(ObjectReference @ref) { if (DTrace.enabled) { DTrace.IdTreeAdd.Log(@ref.GetID()); } if (_idTree == null) { _idTree = @ref; return; } _idTree = _idTree.Id_add(@ref); } public virtual ObjectReference ReferenceForId(int id) { if (DTrace.enabled) { DTrace.GetYapobject.Log(id); } if (_idTree == null) { return null; } if (!ObjectReference.IsValidId(id)) { return null; } return _idTree.Id_find(id); } public virtual ObjectReference ReferenceForObject(object obj) { if (_hashCodeTree == null) { return null; } return _hashCodeTree.Hc_find(obj); } public virtual void RemoveReference(ObjectReference @ref) { if (DTrace.enabled) { DTrace.ReferenceRemoved.Log(@ref.GetID()); } if (_hashCodeTree != null) { _hashCodeTree = _hashCodeTree.Hc_remove(@ref); } if (_idTree != null) { _idTree = _idTree.Id_remove(@ref); } } public virtual void Rollback() { } // do nothing public virtual void TraverseReferences(IVisitor4 visitor) { if (_hashCodeTree == null) { return; } _hashCodeTree.Hc_traverse(visitor); } public override string ToString() { BooleanByRef found = new BooleanByRef(); StringBuilder str = new StringBuilder("HashcodeReferenceSystem {"); TraverseReferences(new _IVisitor4_117(found, str)); str.Append("}"); return str.ToString(); } private sealed class _IVisitor4_117 : IVisitor4 { public _IVisitor4_117(BooleanByRef found, StringBuilder str) { this.found = found; this.str = str; } public void Visit(object obj) { if (found.value) { str.Append(", "); } ObjectReference @ref = (ObjectReference)obj; str.Append(@ref.GetID()); found.value = true; } private readonly BooleanByRef found; private readonly StringBuilder str; } public virtual void Discarded() { } // do nothing } } TransactionalReferenceSystem.cs0000644000175000017500000000273011700531646034764 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/References/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; namespace Db4objects.Db4o.Internal.References { /// public class TransactionalReferenceSystem : TransactionalReferenceSystemBase, IReferenceSystem { public override void Commit() { TraverseNewReferences(new _IVisitor4_16(this)); CreateNewReferences(); } private sealed class _IVisitor4_16 : IVisitor4 { public _IVisitor4_16(TransactionalReferenceSystem _enclosing) { this._enclosing = _enclosing; } public void Visit(object obj) { ObjectReference oref = (ObjectReference)obj; if (oref.GetObject() != null) { this._enclosing._committedReferences.AddExistingReference(oref); } } private readonly TransactionalReferenceSystem _enclosing; } public override void AddExistingReference(ObjectReference @ref) { _committedReferences.AddExistingReference(@ref); } public override void AddNewReference(ObjectReference @ref) { _newReferences.AddNewReference(@ref); } public override void RemoveReference(ObjectReference @ref) { _newReferences.RemoveReference(@ref); _committedReferences.RemoveReference(@ref); } public override void Rollback() { CreateNewReferences(); } public virtual void Discarded() { } // do nothing; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/FrozenObjectInfo.cs0000644000175000017500000000420011700531646030334 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { public class FrozenObjectInfo : IObjectInfo { private readonly Db4oDatabase _sourceDatabase; private readonly long _uuidLongPart; private readonly long _id; private readonly long _commitTimestamp; private readonly object _object; public FrozenObjectInfo(object @object, long id, Db4oDatabase sourceDatabase, long uuidLongPart, long commitTimestamp) { _sourceDatabase = sourceDatabase; _uuidLongPart = uuidLongPart; _id = id; _commitTimestamp = commitTimestamp; _object = @object; } private FrozenObjectInfo(ObjectReference @ref, VirtualAttributes virtualAttributes ) : this(@ref == null ? null : @ref.GetObject(), @ref == null ? -1 : @ref.GetID( ), virtualAttributes == null ? null : virtualAttributes.i_database, virtualAttributes == null ? -1 : virtualAttributes.i_uuid, virtualAttributes == null ? 0 : virtualAttributes .i_version) { } public FrozenObjectInfo(Transaction trans, ObjectReference @ref, bool committed) : this(@ref, IsInstantiatedReference(@ref) ? @ref.VirtualAttributes(trans, committed ) : null) { } private static bool IsInstantiatedReference(ObjectReference @ref) { return @ref != null && @ref.GetObject() != null; } public virtual long GetInternalID() { return _id; } public virtual object GetObject() { return _object; } public virtual Db4oUUID GetUUID() { if (_sourceDatabase == null) { return null; } return new Db4oUUID(_uuidLongPart, _sourceDatabase.GetSignature()); } public virtual long GetVersion() { return GetCommitTimestamp(); } public virtual long GetCommitTimestamp() { return _commitTimestamp; } public virtual long SourceDatabaseId(Transaction trans) { if (_sourceDatabase == null) { return -1; } return _sourceDatabase.GetID(trans); } public virtual long UuidLongPart() { return _uuidLongPart; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Events/0000755000175000017500000000000011700531646026047 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Events/EventRegistryImpl.cs0000644000175000017500000004770111700531646032043 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Internal.Events; using Db4objects.Db4o.Query; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Events { /// public class EventRegistryImpl : ICallbacks, IEventRegistry { protected System.EventHandler _queryStarted; protected System.EventHandler _queryFinished; protected System.EventHandler _creating; protected System.EventHandler _activating; protected System.EventHandler _updating; protected System.EventHandler _deleting; protected System.EventHandler _deactivating; protected System.EventHandler _created; protected System.EventHandler _activated; protected System.EventHandler _updated; protected System.EventHandler _deleted; protected System.EventHandler _deactivated; protected System.EventHandler _committing; protected System.EventHandler _committed; protected System.EventHandler _instantiated; protected System.EventHandler _classRegistered; protected System.EventHandler _closing; protected System.EventHandler _opened; // Callbacks implementation public virtual void QueryOnFinished(Transaction transaction, IQuery query) { if (!(_queryFinished != null)) { return; } WithExceptionHandling(new _IRunnable_50(this, transaction, query)); } private sealed class _IRunnable_50 : IRunnable { public _IRunnable_50(EventRegistryImpl _enclosing, Transaction transaction, IQuery query) { this._enclosing = _enclosing; this.transaction = transaction; this.query = query; } public void Run() { if (null != this._enclosing._queryFinished) this._enclosing._queryFinished(null, new QueryEventArgs(transaction, query)); } private readonly EventRegistryImpl _enclosing; private readonly Transaction transaction; private readonly IQuery query; } public virtual void QueryOnStarted(Transaction transaction, IQuery query) { if (!(_queryStarted != null)) { return; } WithExceptionHandling(new _IRunnable_59(this, transaction, query)); } private sealed class _IRunnable_59 : IRunnable { public _IRunnable_59(EventRegistryImpl _enclosing, Transaction transaction, IQuery query) { this._enclosing = _enclosing; this.transaction = transaction; this.query = query; } public void Run() { if (null != this._enclosing._queryStarted) this._enclosing._queryStarted(null, new QueryEventArgs(transaction, query)); } private readonly EventRegistryImpl _enclosing; private readonly Transaction transaction; private readonly IQuery query; } public virtual bool ObjectCanNew(Transaction transaction, object obj) { return TriggerCancellableObjectEventArgsInCallback(transaction, _creating, null, obj); } public virtual bool ObjectCanActivate(Transaction transaction, object obj) { return TriggerCancellableObjectEventArgsInCallback(transaction, _activating, null , obj); } public virtual bool ObjectCanUpdate(Transaction transaction, IObjectInfo objectInfo ) { return TriggerCancellableObjectEventArgsInCallback(transaction, _updating, objectInfo , objectInfo.GetObject()); } public virtual bool ObjectCanDelete(Transaction transaction, IObjectInfo objectInfo ) { return TriggerCancellableObjectEventArgsInCallback(transaction, _deleting, objectInfo , objectInfo.GetObject()); } public virtual bool ObjectCanDeactivate(Transaction transaction, IObjectInfo objectInfo ) { return TriggerCancellableObjectEventArgsInCallback(transaction, _deactivating, objectInfo , objectInfo.GetObject()); } public virtual void ObjectOnActivate(Transaction transaction, IObjectInfo obj) { TriggerObjectInfoEventInCallback(transaction, _activated, obj); } public virtual void ObjectOnNew(Transaction transaction, IObjectInfo obj) { TriggerObjectInfoEventInCallback(transaction, _created, obj); } public virtual void ObjectOnUpdate(Transaction transaction, IObjectInfo obj) { TriggerObjectInfoEventInCallback(transaction, _updated, obj); } public virtual void ObjectOnDelete(Transaction transaction, IObjectInfo obj) { TriggerObjectInfoEventInCallback(transaction, _deleted, obj); } public virtual void ClassOnRegistered(ClassMetadata clazz) { if (!(_classRegistered != null)) { return; } WithExceptionHandling(new _IRunnable_104(this, clazz)); } private sealed class _IRunnable_104 : IRunnable { public _IRunnable_104(EventRegistryImpl _enclosing, ClassMetadata clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public void Run() { if (null != this._enclosing._classRegistered) this._enclosing._classRegistered(null, new ClassEventArgs(clazz)); } private readonly EventRegistryImpl _enclosing; private readonly ClassMetadata clazz; } public virtual void ObjectOnDeactivate(Transaction transaction, IObjectInfo obj) { TriggerObjectInfoEventInCallback(transaction, _deactivated, obj); } public virtual void ObjectOnInstantiate(Transaction transaction, IObjectInfo obj) { TriggerObjectInfoEventInCallback(transaction, _instantiated, obj); } public virtual void CommitOnStarted(Transaction transaction, CallbackObjectInfoCollections objectInfoCollections) { if (!(_committing != null)) { return; } WithExceptionHandlingInCallback(new _IRunnable_121(this, transaction, objectInfoCollections )); } private sealed class _IRunnable_121 : IRunnable { public _IRunnable_121(EventRegistryImpl _enclosing, Transaction transaction, CallbackObjectInfoCollections objectInfoCollections) { this._enclosing = _enclosing; this.transaction = transaction; this.objectInfoCollections = objectInfoCollections; } public void Run() { if (null != this._enclosing._committing) this._enclosing._committing(null, new CommitEventArgs (transaction, objectInfoCollections, false)); } private readonly EventRegistryImpl _enclosing; private readonly Transaction transaction; private readonly CallbackObjectInfoCollections objectInfoCollections; } public virtual void CommitOnCompleted(Transaction transaction, CallbackObjectInfoCollections objectInfoCollections, bool isOwnCommit) { if (!(_committed != null)) { return; } WithExceptionHandlingInCallback(new _IRunnable_132(this, transaction, objectInfoCollections , isOwnCommit)); } private sealed class _IRunnable_132 : IRunnable { public _IRunnable_132(EventRegistryImpl _enclosing, Transaction transaction, CallbackObjectInfoCollections objectInfoCollections, bool isOwnCommit) { this._enclosing = _enclosing; this.transaction = transaction; this.objectInfoCollections = objectInfoCollections; this.isOwnCommit = isOwnCommit; } public void Run() { if (null != this._enclosing._committed) this._enclosing._committed(null, new CommitEventArgs (transaction, objectInfoCollections, isOwnCommit)); } private readonly EventRegistryImpl _enclosing; private readonly Transaction transaction; private readonly CallbackObjectInfoCollections objectInfoCollections; private readonly bool isOwnCommit; } public virtual void CloseOnStarted(IObjectContainer container) { if (!(_closing != null)) { return; } WithExceptionHandlingInCallback(new _IRunnable_143(this, container)); } private sealed class _IRunnable_143 : IRunnable { public _IRunnable_143(EventRegistryImpl _enclosing, IObjectContainer container) { this._enclosing = _enclosing; this.container = container; } public void Run() { if (null != this._enclosing._closing) this._enclosing._closing(null, new ObjectContainerEventArgs (container)); } private readonly EventRegistryImpl _enclosing; private readonly IObjectContainer container; } public virtual void OpenOnFinished(IObjectContainer container) { if (!(_opened != null)) { return; } WithExceptionHandlingInCallback(new _IRunnable_154(this, container)); } private sealed class _IRunnable_154 : IRunnable { public _IRunnable_154(EventRegistryImpl _enclosing, IObjectContainer container) { this._enclosing = _enclosing; this.container = container; } public void Run() { if (null != this._enclosing._opened) this._enclosing._opened(null, new ObjectContainerEventArgs (container)); } private readonly EventRegistryImpl _enclosing; private readonly IObjectContainer container; } public virtual event System.EventHandler QueryFinished { add { _queryFinished = (System.EventHandler)System.Delegate.Combine (_queryFinished, value); } remove { _queryFinished = (System.EventHandler)System.Delegate.Remove (_queryFinished, value); } } public virtual event System.EventHandler QueryStarted { add { _queryStarted = (System.EventHandler)System.Delegate.Combine (_queryStarted, value); } remove { _queryStarted = (System.EventHandler)System.Delegate.Remove (_queryStarted, value); } } public virtual event System.EventHandler Creating { add { _creating = (System.EventHandler )System.Delegate.Combine(_creating, value); } remove { _creating = (System.EventHandler )System.Delegate.Remove(_creating, value); } } public virtual event System.EventHandler Activating { add { _activating = (System.EventHandler )System.Delegate.Combine(_activating, value); } remove { _activating = (System.EventHandler )System.Delegate.Remove(_activating, value); } } public virtual event System.EventHandler Updating { add { _updating = (System.EventHandler )System.Delegate.Combine(_updating, value); } remove { _updating = (System.EventHandler )System.Delegate.Remove(_updating, value); } } public virtual event System.EventHandler Deleting { add { _deleting = (System.EventHandler )System.Delegate.Combine(_deleting, value); } remove { _deleting = (System.EventHandler )System.Delegate.Remove(_deleting, value); } } public virtual event System.EventHandler Deactivating { add { _deactivating = (System.EventHandler )System.Delegate.Combine(_deactivating, value); } remove { _deactivating = (System.EventHandler )System.Delegate.Remove(_deactivating, value); } } public virtual event System.EventHandler Created { add { _created = (System.EventHandler)System.Delegate.Combine (_created, value); } remove { _created = (System.EventHandler)System.Delegate.Remove (_created, value); } } public virtual event System.EventHandler Activated { add { _activated = (System.EventHandler)System.Delegate.Combine (_activated, value); } remove { _activated = (System.EventHandler)System.Delegate.Remove (_activated, value); } } public virtual event System.EventHandler Updated { add { _updated = (System.EventHandler)System.Delegate.Combine (_updated, value); } remove { _updated = (System.EventHandler)System.Delegate.Remove (_updated, value); } } public virtual event System.EventHandler Deleted { add { _deleted = (System.EventHandler)System.Delegate.Combine (_deleted, value); } remove { _deleted = (System.EventHandler)System.Delegate.Remove (_deleted, value); } } public virtual event System.EventHandler Deactivated { add { _deactivated = (System.EventHandler)System.Delegate.Combine (_deactivated, value); } remove { _deactivated = (System.EventHandler)System.Delegate.Remove (_deactivated, value); } } public virtual event System.EventHandler Committing { add { _committing = (System.EventHandler)System.Delegate.Combine (_committing, value); } remove { _committing = (System.EventHandler)System.Delegate.Remove (_committing, value); } } public virtual event System.EventHandler Committed { add { _committed = (System.EventHandler)System.Delegate.Combine (_committed, value); OnCommittedListenerAdded(); } remove { _committed = (System.EventHandler)System.Delegate.Remove (_committed, value); } } public virtual event System.EventHandler ClassRegistered { add { _classRegistered = (System.EventHandler)System.Delegate.Combine (_classRegistered, value); } remove { _classRegistered = (System.EventHandler)System.Delegate.Remove (_classRegistered, value); } } public virtual event System.EventHandler Instantiated { add { _instantiated = (System.EventHandler) System.Delegate.Combine(_instantiated, value); } remove { _instantiated = (System.EventHandler) System.Delegate.Remove(_instantiated, value); } } public virtual event System.EventHandler Closing { add { _closing = (System.EventHandler) System.Delegate.Combine(_closing, value); } remove { _closing = (System.EventHandler) System.Delegate.Remove(_closing, value); } } protected virtual void OnCommittedListenerAdded() { } // do nothing public virtual bool CaresAboutCommitting() { return (_committing != null); } public virtual bool CaresAboutCommitted() { return (_committed != null); } public virtual bool CaresAboutDeleting() { return (_deleting != null); } public virtual bool CaresAboutDeleted() { return (_deleted != null); } internal virtual bool TriggerCancellableObjectEventArgsInCallback(Transaction transaction , System.EventHandler e, IObjectInfo objectInfo, object o) { if (!(e != null)) { return true; } CancellableObjectEventArgs args = new CancellableObjectEventArgs(transaction, objectInfo , o); WithExceptionHandlingInCallback(new _IRunnable_258(e, args)); return !args.IsCancelled; } private sealed class _IRunnable_258 : IRunnable { public _IRunnable_258(System.EventHandler e, CancellableObjectEventArgs args) { this.e = e; this.args = args; } public void Run() { if (null != e) e(null, args); } private readonly System.EventHandler e; private readonly CancellableObjectEventArgs args; } internal virtual void TriggerObjectInfoEventInCallback(Transaction transaction, System.EventHandler< ObjectInfoEventArgs> e, IObjectInfo o) { if (!(e != null)) { return; } WithExceptionHandlingInCallback(new _IRunnable_270(e, transaction, o)); } private sealed class _IRunnable_270 : IRunnable { public _IRunnable_270(System.EventHandler e, Transaction transaction , IObjectInfo o) { this.e = e; this.transaction = transaction; this.o = o; } public void Run() { if (null != e) e(null, new ObjectInfoEventArgs(transaction, o)); } private readonly System.EventHandler e; private readonly Transaction transaction; private readonly IObjectInfo o; } private void WithExceptionHandlingInCallback(IRunnable runnable) { try { InCallback.Run(runnable); } catch (Db4oException e) { throw; } catch (Exception x) { throw new EventException(x); } } private void WithExceptionHandling(IRunnable runnable) { try { runnable.Run(); } catch (Db4oException e) { throw; } catch (Exception x) { throw new EventException(x); } } public virtual event System.EventHandler Opened { add { _opened = (System.EventHandler)System.Delegate.Combine (_opened, value); } remove { _opened = (System.EventHandler)System.Delegate.Remove (_opened, value); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/StatefulBuffer.cs0000644000175000017500000001246011700531646030056 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; using Sharpen; namespace Db4objects.Db4o.Internal { /// /// public for .NET conversion reasons /// TODO: Split this class for individual usecases. /// /// /// public for .NET conversion reasons /// TODO: Split this class for individual usecases. Only use the member /// variables needed for the respective usecase. /// /// public sealed class StatefulBuffer : ByteArrayBuffer { internal Db4objects.Db4o.Internal.Transaction _trans; private int _address; private int _addressOffset; private int _cascadeDelete; private int _id; private int _length; public StatefulBuffer(Db4objects.Db4o.Internal.Transaction trans, int initialBufferSize ) { _trans = trans; _length = initialBufferSize; _buffer = new byte[_length]; } public StatefulBuffer(Db4objects.Db4o.Internal.Transaction trans, int address, int length) : this(trans, length) { _address = address; } public StatefulBuffer(Db4objects.Db4o.Internal.Transaction trans, Db4objects.Db4o.Internal.Slots.Slot slot) : this(trans, slot.Address(), slot.Length()) { } public StatefulBuffer(Db4objects.Db4o.Internal.Transaction trans, Pointer4 pointer ) : this(trans, pointer._slot) { _id = pointer._id; } public void DebugCheckBytes() { } // Db4o.log("!!! YapBytes.debugCheckBytes not all bytes used"); // This is normal for writing The FreeSlotArray, becauce one // slot is possibly reserved by it's own pointer. public int GetAddress() { return _address; } public int GetID() { return _id; } public override int Length() { return _length; } public ObjectContainerBase Container() { return _trans.Container(); } public LocalObjectContainer File() { return ((LocalTransaction)_trans).LocalContainer(); } public Db4objects.Db4o.Internal.Transaction Transaction() { return _trans; } public byte[] GetWrittenBytes() { byte[] bytes = new byte[_offset]; System.Array.Copy(_buffer, 0, bytes, 0, _offset); return bytes; } /// public void Read() { Container().ReadBytes(_buffer, _address, _addressOffset, _length); } public Db4objects.Db4o.Internal.StatefulBuffer ReadStatefulBuffer() { int length = ReadInt(); if (length == 0) { return null; } Db4objects.Db4o.Internal.StatefulBuffer yb = new Db4objects.Db4o.Internal.StatefulBuffer (_trans, length); System.Array.Copy(_buffer, _offset, yb._buffer, 0, length); _offset += length; return yb; } public void RemoveFirstBytes(int aLength) { _length -= aLength; byte[] temp = new byte[_length]; System.Array.Copy(_buffer, aLength, temp, 0, _length); _buffer = temp; _offset -= aLength; if (_offset < 0) { _offset = 0; } } public void Address(int address) { _address = address; } public void SetID(int id) { _id = id; } public void SetTransaction(Db4objects.Db4o.Internal.Transaction aTrans) { _trans = aTrans; } public void UseSlot(int adress) { _address = adress; _offset = 0; } // FIXME: FB remove public void UseSlot(int address, int length) { UseSlot(new Db4objects.Db4o.Internal.Slots.Slot(address, length)); } public void UseSlot(Db4objects.Db4o.Internal.Slots.Slot slot) { _address = slot.Address(); _offset = 0; if (slot.Length() > _buffer.Length) { _buffer = new byte[slot.Length()]; } _length = slot.Length(); } // FIXME: FB remove public void UseSlot(int id, int adress, int length) { _id = id; UseSlot(adress, length); } public void Write() { File().WriteBytes(this, _address, _addressOffset); } public void WriteEncrypt() { File().WriteEncrypt(this, _address, _addressOffset); } public ByteArrayBuffer ReadPayloadWriter(int offset, int length) { Db4objects.Db4o.Internal.StatefulBuffer payLoad = new Db4objects.Db4o.Internal.StatefulBuffer (_trans, 0, length); System.Array.Copy(_buffer, offset, payLoad._buffer, 0, length); TransferPayLoadAddress(payLoad, offset); return payLoad; } private void TransferPayLoadAddress(Db4objects.Db4o.Internal.StatefulBuffer toWriter , int offset) { int blockedOffset = offset / Container().BlockSize(); toWriter._address = _address + blockedOffset; toWriter._id = toWriter._address; toWriter._addressOffset = _addressOffset; } public void MoveForward(int length) { _addressOffset += length; } public override string ToString() { return "id " + _id + " adr " + _address + " len " + _length; } public Db4objects.Db4o.Internal.Slots.Slot Slot() { return new Db4objects.Db4o.Internal.Slots.Slot(_address, _length); } public Pointer4 Pointer() { return new Pointer4(_id, Slot()); } public int CascadeDeletes() { return _cascadeDelete; } public void SetCascadeDeletes(int depth) { _cascadeDelete = depth; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TypeHandlerCloneContext.cs0000644000175000017500000000137711700531646031707 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class TypeHandlerCloneContext { private readonly HandlerRegistry handlerRegistry; public readonly ITypeHandler4 original; private readonly int version; public TypeHandlerCloneContext(HandlerRegistry handlerRegistry_, ITypeHandler4 original_ , int version_) { handlerRegistry = handlerRegistry_; original = original_; version = version_; } public virtual ITypeHandler4 CorrectHandlerVersion(ITypeHandler4 typeHandler) { return handlerRegistry.CorrectHandlerVersion(typeHandler, version); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/SystemData.cs0000644000175000017500000000777011700531646027223 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// public class SystemData { private int _classCollectionID; private int _converterVersion; private Slot _inMemoryFreespaceSlot; private int _bTreeFreespaceId; private byte _freespaceSystem; private Db4oDatabase _identity; private int _identityId; private long _lastTimeStampID; private byte _stringEncoding; private int _uuidIndexId; private byte _idSystemType; private int _transactionPointer1; private int _transactionPointer2; private Slot _idSystemSlot; private int _idToTimestampIndexId; private int _timestampToIdIndexId; public virtual Slot IdSystemSlot() { return _idSystemSlot; } public virtual void IdSystemSlot(Slot slot) { _idSystemSlot = slot; } private ITransactionalIdSystem _freespaceIdSystem; public virtual void IdSystemType(byte idSystem) { _idSystemType = idSystem; } public virtual byte IdSystemType() { return _idSystemType; } public virtual int ClassCollectionID() { return _classCollectionID; } public virtual void ClassCollectionID(int id) { _classCollectionID = id; } public virtual int ConverterVersion() { return _converterVersion; } public virtual void ConverterVersion(int version) { _converterVersion = version; } public virtual int BTreeFreespaceId() { return _bTreeFreespaceId; } public virtual void BTreeFreespaceId(int id) { _bTreeFreespaceId = id; } public virtual Slot InMemoryFreespaceSlot() { return _inMemoryFreespaceSlot; } public virtual void InMemoryFreespaceSlot(Slot slot) { _inMemoryFreespaceSlot = slot; } public virtual byte FreespaceSystem() { return _freespaceSystem; } public virtual void FreespaceSystem(byte freespaceSystemtype) { _freespaceSystem = freespaceSystemtype; } public virtual Db4oDatabase Identity() { return _identity; } public virtual void Identity(Db4oDatabase identityObject) { _identity = identityObject; } public virtual long LastTimeStampID() { return _lastTimeStampID; } public virtual void LastTimeStampID(long id) { _lastTimeStampID = id; } public virtual byte StringEncoding() { return _stringEncoding; } public virtual void StringEncoding(byte encodingByte) { _stringEncoding = encodingByte; } public virtual int UuidIndexId() { return _uuidIndexId; } public virtual void UuidIndexId(int id) { _uuidIndexId = id; } public virtual void IdentityId(int id) { _identityId = id; } public virtual int IdentityId() { return _identityId; } public virtual void TransactionPointer1(int pointer) { _transactionPointer1 = pointer; } public virtual void TransactionPointer2(int pointer) { _transactionPointer2 = pointer; } public virtual int TransactionPointer1() { return _transactionPointer1; } public virtual int TransactionPointer2() { return _transactionPointer2; } public virtual void FreespaceIdSystem(ITransactionalIdSystem transactionalIdSystem ) { _freespaceIdSystem = transactionalIdSystem; } public virtual ITransactionalIdSystem FreespaceIdSystem() { return _freespaceIdSystem; } public virtual void IdToTimestampIndexId(int idToTimestampIndexId) { _idToTimestampIndexId = idToTimestampIndexId; } public virtual int IdToTimestampIndexId() { return _idToTimestampIndexId; } public virtual void TimestampToIdIndexId(int timestampToIdIndexId) { _timestampToIdIndexId = timestampToIdIndexId; } public virtual int TimestampToIdIndexId() { return _timestampToIdIndexId; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IDHandler.cs0000644000175000017500000000067311700531646026732 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; namespace Db4objects.Db4o.Internal { /// public class IDHandler : IntHandler { public override void DefragIndexEntry(DefragmentContextImpl context) { int sourceId = context.CopyIDReturnOriginalID(true); context.CurrentParentSourceID(sourceId); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Identifiable.cs0000644000175000017500000000341311700531646027512 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal { /// public abstract class Identifiable { protected int _id; protected int _state = 2; // DIRTY and ACTIVE public bool BeginProcessing() { if (BitIsTrue(Const4.Processing)) { return false; } BitTrue(Const4.Processing); return true; } internal void BitFalse(int bitPos) { _state &= ~(1 << bitPos); } internal bool BitIsFalse(int bitPos) { return (_state | (1 << bitPos)) != _state; } internal bool BitIsTrue(int bitPos) { return (_state | (1 << bitPos)) == _state; } internal void BitTrue(int bitPos) { _state |= (1 << bitPos); } public virtual void EndProcessing() { BitFalse(Const4.Processing); } public virtual int GetID() { return _id; } public bool IsActive() { return BitIsTrue(Const4.Active); } public virtual bool IsDirty() { return BitIsTrue(Const4.Active) && (!BitIsTrue(Const4.Clean)); } public bool IsNew() { return GetID() == 0; } public virtual void SetID(int id) { if (DTrace.enabled) { DTrace.PersistentbaseSetId.Log(id); } _id = id; } public void SetStateClean() { BitTrue(Const4.Active); BitTrue(Const4.Clean); } public void SetStateDeactivated() { BitFalse(Const4.Active); } public virtual void SetStateDirty() { BitTrue(Const4.Active); BitFalse(Const4.Clean); } public override int GetHashCode() { if (IsNew()) { throw new InvalidOperationException(); } return GetID(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/PersistentBase.cs0000644000175000017500000000776511700531646030104 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Internal { /// public abstract class PersistentBase : Identifiable, IPersistent, ILinkLengthAware { internal virtual void CacheDirty(Collection4 col) { if (!BitIsTrue(Const4.CachedDirty)) { BitTrue(Const4.CachedDirty); col.Add(this); } } public virtual void Free(LocalTransaction trans) { IdSystem(trans.SystemTransaction()).NotifySlotDeleted(GetID(), SlotChangeFactory( )); } public int LinkLength() { return Const4.IdLength; } internal void NotCachedDirty() { BitFalse(Const4.CachedDirty); } public virtual void Read(Transaction trans) { if (!BeginProcessing()) { return; } try { Read(trans, ProduceReadBuffer(trans)); } finally { EndProcessing(); } } protected virtual void Read(Transaction trans, ByteArrayBuffer reader) { ReadThis(trans, reader); SetStateOnRead(reader); } protected ByteArrayBuffer ProduceReadBuffer(Transaction trans) { return ReadBufferById(trans); } protected virtual ByteArrayBuffer ReadBufferById(Transaction trans) { return trans.Container().ReadBufferById(trans, GetID()); } internal virtual void SetStateOnRead(ByteArrayBuffer reader) { if (BitIsTrue(Const4.CachedDirty)) { SetStateDirty(); } else { SetStateClean(); } } public virtual void Write(Transaction trans) { if (!WriteObjectBegin()) { return; } try { LocalObjectContainer container = (LocalObjectContainer)trans.Container(); if (DTrace.enabled) { DTrace.PersistentOwnLength.Log(GetID()); } int length = OwnLength(); length = container.BlockConverter().BlockAlignedBytes(length); Slot slot = container.AllocateSlot(length); if (IsNew()) { SetID(IdSystem(trans).NewId(SlotChangeFactory())); IdSystem(trans).NotifySlotCreated(_id, slot, SlotChangeFactory()); } else { IdSystem(trans).NotifySlotUpdated(_id, slot, SlotChangeFactory()); } if (DTrace.enabled) { DTrace.PersistentBaseNewSlot.LogLength(GetID(), slot); } ByteArrayBuffer writer = ProduceWriteBuffer(trans, length); WriteToFile(trans, writer, slot); } finally { EndProcessing(); } } public virtual ITransactionalIdSystem IdSystem(Transaction trans) { return trans.IdSystem(); } protected virtual ByteArrayBuffer ProduceWriteBuffer(Transaction trans, int length ) { return NewWriteBuffer(length); } protected virtual ByteArrayBuffer NewWriteBuffer(int length) { return new ByteArrayBuffer(length); } private void WriteToFile(Transaction trans, ByteArrayBuffer writer, Slot slot) { if (DTrace.enabled) { DTrace.PersistentbaseWrite.Log(GetID()); } LocalObjectContainer container = (LocalObjectContainer)trans.Container(); WriteThis(trans, writer); container.WriteEncrypt(writer, slot.Address(), 0); if (IsActive()) { SetStateClean(); } } public virtual bool WriteObjectBegin() { if (IsDirty()) { return BeginProcessing(); } return false; } public virtual void WriteOwnID(Transaction trans, ByteArrayBuffer writer) { Write(trans); writer.WriteInt(GetID()); } public virtual Db4objects.Db4o.Internal.Slots.SlotChangeFactory SlotChangeFactory () { return Db4objects.Db4o.Internal.Slots.SlotChangeFactory.SystemObjects; } public abstract byte GetIdentifier(); public abstract int OwnLength(); public abstract void ReadThis(Transaction arg1, ByteArrayBuffer arg2); public abstract void WriteThis(Transaction arg1, ByteArrayBuffer arg2); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Renames.cs0000644000175000017500000000104211700531646026521 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Internal { public class Renames { public static Rename ForField(string className, string name, string newName) { return new Rename(className, name, newName); } public static Rename ForClass(string name, string newName) { return new Rename(string.Empty, name, newName); } public static Rename ForInverseQBE(Rename ren) { return new Rename(ren.rClass, null, ren.rFrom); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/TreeInt.cs0000644000175000017500000001317411700531646026512 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Query.Processor; namespace Db4objects.Db4o.Internal { /// Base class for balanced trees. /// Base class for balanced trees. /// public class TreeInt : Tree, IReadWriteable { public static Db4objects.Db4o.Internal.TreeInt Add(Db4objects.Db4o.Internal.TreeInt tree, int value) { return (Db4objects.Db4o.Internal.TreeInt)((Db4objects.Db4o.Internal.TreeInt)Tree. Add(tree, new Db4objects.Db4o.Internal.TreeInt(value))); } public static Db4objects.Db4o.Internal.TreeInt RemoveLike(Db4objects.Db4o.Internal.TreeInt tree, int value) { return (Db4objects.Db4o.Internal.TreeInt)Tree.RemoveLike(tree, new Db4objects.Db4o.Internal.TreeInt (value)); } public static Tree AddAll(Tree tree, IIntIterator4 iter) { if (!iter.MoveNext()) { return tree; } Db4objects.Db4o.Internal.TreeInt firstAdded = new Db4objects.Db4o.Internal.TreeInt (iter.CurrentInt()); tree = Tree.Add(tree, firstAdded); while (iter.MoveNext()) { tree = tree.Add(new Db4objects.Db4o.Internal.TreeInt(iter.CurrentInt())); } return tree; } public int _key; public TreeInt(int a_key) { this._key = a_key; } public override int Compare(Tree a_to) { return _key - ((Db4objects.Db4o.Internal.TreeInt)a_to)._key; } internal virtual Tree DeepClone() { return new Db4objects.Db4o.Internal.TreeInt(_key); } public override bool Duplicates() { return false; } public static Db4objects.Db4o.Internal.TreeInt Find(Tree a_in, int a_key) { if (a_in == null) { return null; } return ((Db4objects.Db4o.Internal.TreeInt)a_in).Find(a_key); } public Db4objects.Db4o.Internal.TreeInt Find(int a_key) { int cmp = _key - a_key; if (cmp < 0) { if (((Tree)_subsequent) != null) { return ((Db4objects.Db4o.Internal.TreeInt)((Tree)_subsequent)).Find(a_key); } } else { if (cmp > 0) { if (((Tree)_preceding) != null) { return ((Db4objects.Db4o.Internal.TreeInt)((Tree)_preceding)).Find(a_key); } } else { return this; } } return null; } public virtual object Read(ByteArrayBuffer buffer) { return new Db4objects.Db4o.Internal.TreeInt(buffer.ReadInt()); } public virtual void Write(ByteArrayBuffer buffer) { buffer.WriteInt(_key); } public static void Write(ByteArrayBuffer buffer, Db4objects.Db4o.Internal.TreeInt tree) { Write(buffer, tree, tree == null ? 0 : tree.Size()); } public static void Write(ByteArrayBuffer buffer, Db4objects.Db4o.Internal.TreeInt tree, int size) { if (tree == null) { buffer.WriteInt(0); return; } buffer.WriteInt(size); tree.Traverse(new _IVisitor4_97(buffer)); } private sealed class _IVisitor4_97 : IVisitor4 { public _IVisitor4_97(ByteArrayBuffer buffer) { this.buffer = buffer; } public void Visit(object a_object) { ((Db4objects.Db4o.Internal.TreeInt)a_object).Write(buffer); } private readonly ByteArrayBuffer buffer; } public virtual int OwnLength() { return Const4.IntLength; } internal virtual bool VariableLength() { return false; } internal virtual QCandidate ToQCandidate(QCandidates candidates) { QCandidate qc = new QCandidate(candidates, null, _key); qc._preceding = ToQCandidate((Db4objects.Db4o.Internal.TreeInt)((Tree)_preceding) , candidates); qc._subsequent = ToQCandidate((Db4objects.Db4o.Internal.TreeInt)((Tree)_subsequent ), candidates); qc._size = _size; return qc; } public static QCandidate ToQCandidate(Db4objects.Db4o.Internal.TreeInt tree, QCandidates candidates) { if (tree == null) { return null; } return tree.ToQCandidate(candidates); } public override string ToString() { return string.Empty + _key; } protected override Tree ShallowCloneInternal(Tree tree) { Db4objects.Db4o.Internal.TreeInt treeint = (Db4objects.Db4o.Internal.TreeInt)base .ShallowCloneInternal(tree); treeint._key = _key; return treeint; } public override object ShallowClone() { Db4objects.Db4o.Internal.TreeInt treeint = new Db4objects.Db4o.Internal.TreeInt(_key ); return ShallowCloneInternal(treeint); } public static int MarshalledLength(Db4objects.Db4o.Internal.TreeInt a_tree) { if (a_tree == null) { return Const4.IntLength; } return a_tree.MarshalledLength(); } public int MarshalledLength() { if (VariableLength()) { IntByRef length = new IntByRef(Const4.IntLength); Traverse(new _IVisitor4_152(length)); return length.value; } return MarshalledLength(Size()); } private sealed class _IVisitor4_152 : IVisitor4 { public _IVisitor4_152(IntByRef length) { this.length = length; } public void Visit(object obj) { length.value += ((Db4objects.Db4o.Internal.TreeInt)obj).OwnLength(); } private readonly IntByRef length; } public int MarshalledLength(int size) { return Const4.IntLength + (size * OwnLength()); } public override object Key() { return _key; } public override bool Equals(object obj) { Db4objects.Db4o.Internal.TreeInt other = (Db4objects.Db4o.Internal.TreeInt)obj; return other._key == _key; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/UUIDFieldMetadata.cs0000644000175000017500000002077111700531646030314 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public class UUIDFieldMetadata : VirtualFieldMetadata { internal UUIDFieldMetadata() : base(Handlers4.LongId, new LongHandler()) { SetName(Const4.VirtualFieldPrefix + "uuid"); } /// public override void AddFieldIndex(ObjectIdContextImpl context) { LocalTransaction transaction = (LocalTransaction)context.Transaction(); LocalObjectContainer localContainer = (LocalObjectContainer)transaction.Container (); Slot oldSlot = transaction.IdSystem().CommittedSlot(context.ObjectId()); int savedOffset = context.Offset(); int db4oDatabaseIdentityID = context.ReadInt(); long uuid = context.ReadLong(); context.Seek(savedOffset); bool isnew = (oldSlot.IsNull()); if ((uuid == 0 || db4oDatabaseIdentityID == 0) && context.ObjectId() > 0 && !isnew) { UUIDFieldMetadata.DatabaseIdentityIDAndUUID identityAndUUID = ReadDatabaseIdentityIDAndUUID (localContainer, context.ClassMetadata(), oldSlot, false); db4oDatabaseIdentityID = identityAndUUID.databaseIdentityID; uuid = identityAndUUID.uuid; } if (db4oDatabaseIdentityID == 0) { db4oDatabaseIdentityID = localContainer.Identity().GetID(transaction); } if (uuid == 0) { uuid = localContainer.GenerateTimeStampId(); } StatefulBuffer writer = (StatefulBuffer)context.Buffer(); writer.WriteInt(db4oDatabaseIdentityID); writer.WriteLong(uuid); if (isnew) { AddIndexEntry(writer, uuid); } } internal class DatabaseIdentityIDAndUUID { public int databaseIdentityID; public long uuid; public DatabaseIdentityIDAndUUID(int databaseIdentityID_, long uuid_) { databaseIdentityID = databaseIdentityID_; uuid = uuid_; } } /// private UUIDFieldMetadata.DatabaseIdentityIDAndUUID ReadDatabaseIdentityIDAndUUID (ObjectContainerBase container, ClassMetadata classMetadata, Slot oldSlot, bool checkClass) { if (DTrace.enabled) { DTrace.RereadOldUuid.LogLength(oldSlot.Address(), oldSlot.Length()); } ByteArrayBuffer reader = container.DecryptedBufferByAddress(oldSlot.Address(), oldSlot .Length()); if (checkClass) { ClassMetadata realClass = ClassMetadata.ReadClass(container, reader); if (realClass != classMetadata) { return null; } } if (classMetadata.SeekToField(container.Transaction, reader, this) == HandlerVersion .Invalid) { return null; } return new UUIDFieldMetadata.DatabaseIdentityIDAndUUID(reader.ReadInt(), reader.ReadLong ()); } public override void Delete(DeleteContextImpl context, bool isUpdate) { if (isUpdate) { context.Seek(context.Offset() + LinkLength()); return; } context.Seek(context.Offset() + Const4.IntLength); long longPart = context.ReadLong(); if (longPart > 0) { if (context.Container().MaintainsIndices()) { RemoveIndexEntry(context.Transaction(), context.ObjectId(), longPart); } } } public override bool HasIndex() { return true; } public override BTree GetIndex(Transaction transaction) { EnsureIndex(transaction); return base.GetIndex(transaction); } /// protected override void RebuildIndexForObject(LocalObjectContainer container, ClassMetadata classMetadata, int objectId) { Slot slot = container.SystemTransaction().IdSystem().CurrentSlot(objectId); UUIDFieldMetadata.DatabaseIdentityIDAndUUID data = ReadDatabaseIdentityIDAndUUID( container, classMetadata, slot, true); if (null == data) { return; } AddIndexEntry(container.LocalSystemTransaction(), objectId, data.uuid); } private void EnsureIndex(Transaction transaction) { if (null == transaction) { throw new ArgumentNullException(); } if (null != base.GetIndex(transaction)) { return; } LocalObjectContainer file = ((LocalObjectContainer)transaction.Container()); SystemData sd = file.SystemData(); if (sd == null) { // too early, in new file, try again later. return; } InitIndex(transaction, sd.UuidIndexId()); if (sd.UuidIndexId() == 0) { sd.UuidIndexId(base.GetIndex(transaction).GetID()); file.GetFileHeader().WriteVariablePart(file); } } internal override void Instantiate1(ObjectReferenceContext context) { int dbID = context.ReadInt(); Transaction trans = context.Transaction(); ObjectContainerBase container = trans.Container(); container.ShowInternalClasses(true); try { Db4oDatabase db = (Db4oDatabase)container.GetByID2(trans, dbID); if (db != null && db.i_signature == null) { container.Activate(trans, db, new FixedActivationDepth(2)); } VirtualAttributes va = context.ObjectReference().VirtualAttributes(); va.i_database = db; va.i_uuid = context.ReadLong(); } finally { container.ShowInternalClasses(false); } } public override int LinkLength() { return Const4.LongLength + Const4.IdLength; } internal override void Marshall(Transaction trans, ObjectReference @ref, IWriteBuffer buffer, bool isMigrating, bool isNew) { VirtualAttributes attr = @ref.VirtualAttributes(); ObjectContainerBase container = trans.Container(); bool doAddIndexEntry = isNew && container.MaintainsIndices(); int dbID = 0; bool linkToDatabase = (attr != null && attr.i_database == null) ? true : !isMigrating; if (linkToDatabase) { Db4oDatabase db = ((IInternalObjectContainer)container).Identity(); if (db == null) { // can happen on early classes like Metaxxx, no problem attr = null; } else { if (attr.i_database == null) { attr.i_database = db; // TODO: Should be check for ! client instead of instanceof if (container is LocalObjectContainer) { attr.i_uuid = container.GenerateTimeStampId(); doAddIndexEntry = true; } } db = attr.i_database; if (db != null) { dbID = db.GetID(trans); } } } else { if (attr != null) { dbID = attr.i_database.GetID(trans); } } buffer.WriteInt(dbID); if (attr == null) { buffer.WriteLong(0); return; } buffer.WriteLong(attr.i_uuid); if (doAddIndexEntry) { AddIndexEntry(trans, @ref.GetID(), attr.i_uuid); } } internal override void MarshallIgnore(IWriteBuffer buffer) { buffer.WriteInt(0); buffer.WriteLong(0); } public HardObjectReference GetHardObjectReferenceBySignature(Transaction transaction , long longPart, byte[] signature) { IBTreeRange range = Search(transaction, longPart); IEnumerator keys = range.Keys(); while (keys.MoveNext()) { IFieldIndexKey current = (IFieldIndexKey)keys.Current; HardObjectReference hardRef = GetHardObjectReferenceById(transaction, current.ParentID (), signature); if (null != hardRef) { return hardRef; } } return HardObjectReference.Invalid; } protected HardObjectReference GetHardObjectReferenceById(Transaction transaction, int parentId, byte[] signature) { HardObjectReference hardRef = transaction.Container().GetHardObjectReferenceById( transaction, parentId); if (hardRef._reference == null) { return null; } VirtualAttributes vad = hardRef._reference.VirtualAttributes(transaction, false); if (!Arrays4.Equals(signature, vad.i_database.i_signature)) { return null; } return hardRef; } public override void DefragAspect(IDefragmentContext context) { // database id context.CopyID(); // uuid context.IncrementOffset(Const4.LongLength); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/0000755000175000017500000000000011700531646026331 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/DelegatingStringIO.cs0000644000175000017500000000443611700531646032351 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Encoding { /// public class DelegatingStringIO : LatinStringIO { private readonly IStringEncoding _encoding; public DelegatingStringIO(IStringEncoding encoding) { _encoding = encoding; } private string Decode(byte[] bytes, int start, int length) { return _encoding.Decode(bytes, start, length); } private byte[] Encode(string str) { return _encoding.Encode(str); } public override byte EncodingByte() { if (_encoding is BuiltInStringEncoding) { return BuiltInStringEncoding.EncodingByteForEncoding(_encoding); } return 0; } public override int Length(string str) { return Encode(str).Length + Const4.ObjectLength + Const4.IntLength; } public override string Read(IReadBuffer buffer, int length) { byte[] bytes = new byte[length]; buffer.ReadBytes(bytes); return Decode(bytes, 0, bytes.Length); } public override string Read(byte[] bytes) { return Decode(bytes, 0, bytes.Length); } public override int ShortLength(string str) { return Encode(str).Length + Const4.IntLength; } public override void Write(IWriteBuffer buffer, string str) { buffer.WriteBytes(Encode(str)); } public override byte[] Write(string str) { return Encode(str); } /// /// Note the different implementation when compared to LatinStringIO and UnicodeStringIO: /// Instead of writing the length of the string, UTF8StringIO writes the length of the /// byte array. /// /// /// Note the different implementation when compared to LatinStringIO and UnicodeStringIO: /// Instead of writing the length of the string, UTF8StringIO writes the length of the /// byte array. /// public override void WriteLengthAndString(IWriteBuffer buffer, string str) { if (str == null) { buffer.WriteInt(0); return; } byte[] bytes = Encode(str); buffer.WriteInt(bytes.Length); buffer.WriteBytes(bytes); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/UnicodeStringIO.cs0000644000175000017500000000425611700531646031674 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Encoding { /// public sealed class UnicodeStringIO : LatinStringIO { protected override int BytesPerChar() { return 2; } public override byte EncodingByte() { return BuiltInStringEncoding.EncodingByteForEncoding(new UnicodeStringEncoding()); } public override int Length(string str) { return (str.Length * 2) + Const4.ObjectLength + Const4.IntLength; } public override string Read(IReadBuffer buffer, int length) { char[] chars = new char[length]; for (int ii = 0; ii < length; ii++) { chars[ii] = (char)((buffer.ReadByte() & unchecked((int)(0xff))) | ((buffer.ReadByte () & unchecked((int)(0xff))) << 8)); } return new string(chars, 0, length); } public override string Read(byte[] bytes) { int length = bytes.Length / 2; char[] chars = new char[length]; int j = 0; for (int ii = 0; ii < length; ii++) { chars[ii] = (char)((bytes[j++] & unchecked((int)(0xff))) | ((bytes[j++] & unchecked( (int)(0xff))) << 8)); } return new string(chars, 0, length); } public override int ShortLength(string str) { return (str.Length * 2) + Const4.IntLength; } public override void Write(IWriteBuffer buffer, string str) { int length = str.Length; char[] chars = new char[length]; Sharpen.Runtime.GetCharsForString(str, 0, length, chars, 0); for (int i = 0; i < length; i++) { buffer.WriteByte((byte)(chars[i] & unchecked((int)(0xff)))); buffer.WriteByte((byte)(chars[i] >> 8)); } } public override byte[] Write(string str) { int length = str.Length; char[] chars = new char[length]; Sharpen.Runtime.GetCharsForString(str, 0, length, chars, 0); byte[] bytes = new byte[length * 2]; int j = 0; for (int i = 0; i < length; i++) { bytes[j++] = (byte)(chars[i] & unchecked((int)(0xff))); bytes[j++] = (byte)(chars[i] >> 8); } return bytes; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/LatinStringEncoding.cs0000644000175000017500000000135111700531646032565 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Internal.Encoding; namespace Db4objects.Db4o.Internal.Encoding { /// public class LatinStringEncoding : BuiltInStringEncoding { public override string Decode(byte[] bytes, int start, int length) { throw new NotImplementedException(); } // special StringIO, should never be called public override byte[] Encode(string str) { throw new NotImplementedException(); } // special StringIO, should never be called protected override LatinStringIO CreateStringIo(IStringEncoding encoding) { return new LatinStringIO(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/BuiltInStringEncoding.cs0000644000175000017500000000350511700531646033067 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Internal.Encoding; namespace Db4objects.Db4o.Internal.Encoding { /// public abstract class BuiltInStringEncoding : IStringEncoding { /// keep the position in the array. /// /// keep the position in the array. /// Information is used to look up encodings. /// private static readonly BuiltInStringEncoding[] AllEncodings = new BuiltInStringEncoding [] { null, new LatinStringEncoding(), new UnicodeStringEncoding(), new UTF8StringEncoding () }; public static byte EncodingByteForEncoding(IStringEncoding encoding) { for (int i = 1; i < AllEncodings.Length; i++) { if (encoding.GetType() == AllEncodings[i].GetType()) { return (byte)i; } } return 0; } public static LatinStringIO StringIoForEncoding(byte encodingByte, IStringEncoding encoding) { if (encodingByte < 0 || encodingByte > AllEncodings.Length) { throw new ArgumentException(); } if (encodingByte == 0) { if (encoding is BuiltInStringEncoding) { Sharpen.Runtime.Out.WriteLine("Warning! Database was created with a custom string encoding but no custom string encoding is configured for this session." ); } return new DelegatingStringIO(encoding); } BuiltInStringEncoding builtInEncoding = AllEncodings[encodingByte]; return builtInEncoding.CreateStringIo(encoding); } protected virtual LatinStringIO CreateStringIo(IStringEncoding encoding) { return new DelegatingStringIO(encoding); } public abstract string Decode(byte[] arg1, int arg2, int arg3); public abstract byte[] Encode(string arg1); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/LatinStringIO.cs0000644000175000017500000000504211700531646031347 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Marshall; using Sharpen; namespace Db4objects.Db4o.Internal.Encoding { /// public class LatinStringIO { public virtual byte[] Bytes(ByteArrayBuffer buffer) { int len = buffer.ReadInt(); len = BytesPerChar() * len; byte[] res = new byte[len]; System.Array.Copy(buffer._buffer, buffer._offset, res, 0, len); return res; } protected virtual int BytesPerChar() { return 1; } public virtual byte EncodingByte() { return BuiltInStringEncoding.EncodingByteForEncoding(new LatinStringEncoding()); } public virtual int Length(string str) { return str.Length + Const4.ObjectLength + Const4.IntLength; } public virtual string Read(IReadBuffer buffer, int length) { char[] chars = new char[length]; for (int ii = 0; ii < length; ii++) { chars[ii] = (char)(buffer.ReadByte() & unchecked((int)(0xff))); } return new string(chars, 0, length); } public virtual string Read(byte[] bytes) { char[] chars = new char[bytes.Length]; for (int i = 0; i < bytes.Length; i++) { chars[i] = (char)(bytes[i] & unchecked((int)(0xff))); } return new string(chars, 0, bytes.Length); } public virtual string ReadLengthAndString(IReadBuffer buffer) { int length = buffer.ReadInt(); if (length == 0) { return string.Empty; } return Read(buffer, length); } public virtual int ShortLength(string str) { return str.Length + Const4.IntLength; } public virtual void Write(IWriteBuffer buffer, string str) { int length = str.Length; char[] chars = new char[length]; Sharpen.Runtime.GetCharsForString(str, 0, length, chars, 0); for (int i = 0; i < length; i++) { buffer.WriteByte((byte)(chars[i] & unchecked((int)(0xff)))); } } public virtual byte[] Write(string str) { int length = str.Length; char[] chars = new char[length]; Sharpen.Runtime.GetCharsForString(str, 0, length, chars, 0); byte[] bytes = new byte[length]; for (int i = 0; i < length; i++) { bytes[i] = (byte)(chars[i] & unchecked((int)(0xff))); } return bytes; } public virtual void WriteLengthAndString(IWriteBuffer buffer, string str) { if (str == null) { buffer.WriteInt(0); return; } buffer.WriteInt(str.Length); Write(buffer, str); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Encoding/UnicodeStringEncoding.cs0000644000175000017500000000064111700531646033105 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Internal.Encoding; namespace Db4objects.Db4o.Internal.Encoding { /// public class UnicodeStringEncoding : LatinStringEncoding { protected override LatinStringIO CreateStringIo(IStringEncoding encoding) { return new UnicodeStringIO(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/PrimitiveTypeMetadata.cs0000644000175000017500000001331211700531646031405 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Metadata; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public class PrimitiveTypeMetadata : ClassMetadata { private const int HashcodeForNull = 283636383; public PrimitiveTypeMetadata(ObjectContainerBase container, ITypeHandler4 handler , int id, IReflectClass classReflector) : base(container, classReflector) { _aspects = FieldMetadata.EmptyArray; _typeHandler = handler; _id = id; } public PrimitiveTypeMetadata(ObjectContainerBase container) : base(container) { _typeHandler = null; } public override void CascadeActivation(IActivationContext context) { } // Override // do nothing internal sealed override void AddToIndex(Transaction trans, int id) { } // Override // Primitive Indices will be created later. internal override bool AllowsQueries() { return false; } internal override void CacheDirty(Collection4 col) { } // do nothing public override bool DescendOnCascadingActivation() { return false; } /// public override void Delete(IDeleteContext context) { if (context.IsLegacyHandlerVersion()) { context.ReadInt(); context.DefragmentRecommended(); } } internal override void DeleteMembers(DeleteContextImpl context, ArrayType arrayType , bool isUpdate) { if (arrayType == ArrayType.PlainArray) { new ArrayHandler(TypeHandler(), true).DeletePrimitiveEmbedded((StatefulBuffer)context .Buffer(), this); } else { if (arrayType == ArrayType.MultidimensionalArray) { new MultidimensionalArrayHandler(TypeHandler(), true).DeletePrimitiveEmbedded((StatefulBuffer )context.Buffer(), this); } } } public override bool HasClassIndex() { return false; } public override object Instantiate(UnmarshallingContext context) { object obj = context.PersistentObject(); if (obj == null) { obj = context.Read(TypeHandler()); context.SetObjectWeak(obj); } context.SetStateClean(); return obj; } public override object InstantiateTransient(UnmarshallingContext context) { return Handlers4.ReadValueType(context, CorrectHandlerVersion(context)); } internal override void InstantiateFields(UnmarshallingContext context) { throw new NotImplementedException(); } public override bool IsArray() { return _id == Handlers4.AnyArrayId || _id == Handlers4.AnyArrayNId; } public override bool HasIdentity() { return false; } public override bool IsStronglyTyped() { return false; } public override IPreparedComparison PrepareComparison(IContext context, object source ) { return Handlers4.PrepareComparisonFor(TypeHandler(), context, source); } public override ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { if (IsArray()) { return TypeHandler(); } return null; } // @Override // public ObjectID readObjectID(InternalReadContext context){ // if(_handler instanceof ClassMetadata){ // return ((ClassMetadata)_handler).readObjectID(context); // } // if(Handlers4.handlesArray(_handler)){ // // TODO: Here we should theoretically read through the array and collect candidates. // // The respective construct is wild: "Contains query through an array in an array." // // Ignore for now. // return ObjectID.IGNORE; // } // return ObjectID.NOT_POSSIBLE; // } internal override void RemoveFromIndex(Transaction ta, int id) { } // do nothing public sealed override bool WriteObjectBegin() { return false; } public override string ToString() { return GetType().FullName + "(" + TypeHandler() + ")"; } public override void Defragment(IDefragmentContext context) { CorrectHandlerVersion(context).Defragment(context); } public override object WrapWithTransactionContext(Transaction transaction, object value) { return value; } public override ITypeHandler4 DelegateTypeHandler(IContext context) { return TypeHandler(); } public override bool Equals(object obj) { if (!(obj is Db4objects.Db4o.Internal.PrimitiveTypeMetadata)) { return false; } Db4objects.Db4o.Internal.PrimitiveTypeMetadata other = (Db4objects.Db4o.Internal.PrimitiveTypeMetadata )obj; if (TypeHandler() == null) { return other.TypeHandler() == null; } return TypeHandler().Equals(other.TypeHandler()); } public override int GetHashCode() { if (TypeHandler() == null) { return HashcodeForNull; } return TypeHandler().GetHashCode(); } public virtual object DeepClone(object context) { throw new InvalidOperationException(); } protected override IAspectTraversalStrategy DetectAspectTraversalStrategy() { return new _IAspectTraversalStrategy_178(); } private sealed class _IAspectTraversalStrategy_178 : IAspectTraversalStrategy { public _IAspectTraversalStrategy_178() { } public void TraverseAllAspects(ITraverseAspectCommand command) { } } // do nothing } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IBuiltinTypeHandler.cs0000644000175000017500000000054411700531646031014 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { /// public interface IBuiltinTypeHandler : ITypeHandler4 { void RegisterReflector(IReflector reflector); IReflectClass ClassReflector(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/IReadWriteBuffer.cs0000644000175000017500000000060611700531646030265 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal { /// public interface IReadWriteBuffer : IReadBuffer, IWriteBuffer { void IncrementOffset(int numBytes); void IncrementIntSize(); int Length(); void ReadBegin(byte identifier); void ReadEnd(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Weakref/0000755000175000017500000000000011700531646026167 5ustar00meebeymeebey00000000000000WeakReferenceSupportFactory.cs0000644000175000017500000000207411700531646034075 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Weakref/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Weakref; namespace Db4objects.Db4o.Internal.Weakref { public class WeakReferenceSupportFactory { public static IWeakReferenceSupport ForObjectContainer(ObjectContainerBase container ) { if (!Platform4.HasWeakReferences()) { return DisabledWeakReferenceSupport(); } if (!container.ConfigImpl.WeakReferences()) { return DisabledWeakReferenceSupport(); } return new EnabledWeakReferenceSupport(container); } public static IWeakReferenceSupport DisabledWeakReferenceSupport() { return new _IWeakReferenceSupport_22(); } private sealed class _IWeakReferenceSupport_22 : IWeakReferenceSupport { public _IWeakReferenceSupport_22() { } public void Stop() { } public void Start() { } public void Purge() { } public object NewWeakReference(ObjectReference referent, object obj) { return obj; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Weakref/IWeakReferenceSupport.cs0000644000175000017500000000050411700531646032731 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Internal.Weakref { public interface IWeakReferenceSupport { object NewWeakReference(ObjectReference referent, object obj); void Purge(); void Start(); void Stop(); } } EnabledWeakReferenceSupport.cs0000644000175000017500000000377511700531646034031 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Weakref/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Weakref; using Sharpen.Lang; namespace Db4objects.Db4o.Internal.Weakref { internal class EnabledWeakReferenceSupport : IWeakReferenceSupport { private readonly object _queue; private readonly ObjectContainerBase _container; private SimpleTimer _timer; internal EnabledWeakReferenceSupport(ObjectContainerBase container) { _container = container; _queue = Platform4.CreateReferenceQueue(); } public virtual object NewWeakReference(ObjectReference referent, object obj) { return Platform4.CreateActiveObjectReference(_queue, referent, obj); } public virtual void Purge() { Platform4.PollReferenceQueue(_container, _queue); } public virtual void Start() { if (_timer != null) { return; } if (!_container.ConfigImpl.WeakReferences()) { return; } if (_container.ConfigImpl.WeakReferenceCollectionInterval() <= 0) { return; } _timer = new SimpleTimer(new EnabledWeakReferenceSupport.Collector(this), _container .ConfigImpl.WeakReferenceCollectionInterval()); _container.ThreadPool().Start("db4o WeakReference collector", _timer); } public virtual void Stop() { if (_timer == null) { return; } _timer.Stop(); _timer = null; } private sealed class Collector : IRunnable { public void Run() { try { this._enclosing.Purge(); } catch (DatabaseClosedException) { } catch (Exception e) { // can happen, no stack trace // don't bring down the thread Sharpen.Runtime.PrintStackTrace(e); } } internal Collector(EnabledWeakReferenceSupport _enclosing) { this._enclosing = _enclosing; } private readonly EnabledWeakReferenceSupport _enclosing; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Internal/Exceptions4.cs0000644000175000017500000000303711700531646027342 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Internal { /// public class Exceptions4 { public static void ThrowRuntimeException(int code) { ThrowRuntimeException(code, null, null); } public static void ThrowRuntimeException(int code, Exception cause) { ThrowRuntimeException(code, null, cause); } public static void ThrowRuntimeException(int code, string msg) { ThrowRuntimeException(code, msg, null); } public static void ThrowRuntimeException(int code, string msg, Exception cause) { ThrowRuntimeException(code, msg, cause, true); } [System.ObsoleteAttribute] public static void ThrowRuntimeException(int code, string msg, Exception cause, bool doLog) { if (doLog) { Db4objects.Db4o.Internal.Messages.LogErr(Db4oFactory.Configure(), code, msg, cause ); } throw new Db4oException(Db4objects.Db4o.Internal.Messages.Get(code, msg)); } /// public static void CatchAllExceptDb4oException(Exception exc) { if (exc is Db4oException) { throw (Db4oException)exc; } } public static Exception ShouldNeverBeCalled() { throw new Exception(); } public static void ShouldNeverHappen() { throw new Exception(); } public static Exception VirtualException() { throw new Exception(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/0000755000175000017500000000000011700531646025135 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IQueue4.cs0000644000175000017500000000142411700531646026746 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public interface IQueue4 { void Add(object obj); object Next(); bool HasNext(); /// Returns the next object in the queue that matches the specified condition. /// /// /// Returns the next object in the queue that matches the specified condition. /// The operation is always NON-BLOCKING. /// /// the object must satisfy to be returned /// the object satisfying the condition or null if none does object NextMatching(IPredicate4 condition); IEnumerator Iterator(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IClosure4.cs0000644000175000017500000000024611700531646027277 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public interface IClosure4 { object Run(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/NoDuplicatesQueue.cs0000644000175000017500000000156711700531646031074 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class NoDuplicatesQueue : IQueue4 { private IQueue4 _queue; private Hashtable4 _seen; public NoDuplicatesQueue(IQueue4 queue) { _queue = queue; _seen = new Hashtable4(); } public virtual void Add(object obj) { if (_seen.ContainsKey(obj)) { return; } _queue.Add(obj); _seen.Put(obj, obj); } public virtual bool HasNext() { return _queue.HasNext(); } public virtual IEnumerator Iterator() { return _queue.Iterator(); } public virtual object Next() { return _queue.Next(); } public virtual object NextMatching(IPredicate4 condition) { return _queue.NextMatching(condition); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ISet4.cs0000644000175000017500000000055611700531646026422 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Foundation { public interface ISet4 : IEnumerable { bool Add(object obj); void Clear(); bool Contains(object obj); bool IsEmpty(); IEnumerator GetEnumerator(); bool Remove(object obj); int Size(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IListener4.cs0000644000175000017500000000032011700531646027441 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IListener4 { void OnEvent(object @event); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Tree.cs0000644000175000017500000003267211700531646026375 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public abstract class Tree : IShallowClone, IDeepClone, IVisitable { public Tree _preceding; public int _size = 1; public Tree _subsequent; public static Tree Add(Tree oldTree, Tree newTree) { if (oldTree == null) { return newTree; } return (Tree)((Tree)oldTree).Add(newTree); } public Tree Add(Tree newNode) { return Add(newNode, Compare(newNode)); } /// /// On adding a node to a tree, if it already exists, and if /// Tree#duplicates() returns false, #isDuplicateOf() will be /// called. /// /// /// On adding a node to a tree, if it already exists, and if /// Tree#duplicates() returns false, #isDuplicateOf() will be /// called. The added node can then be asked for the node that /// prevails in the tree using #duplicateOrThis(). This mechanism /// allows doing find() and add() in one run. /// public virtual Tree Add(Tree newNode, int cmp) { if (cmp < 0) { if (_subsequent == null) { _subsequent = newNode; _size++; } else { _subsequent = _subsequent.Add(newNode); if (_preceding == null) { return (Tree)RotateLeft(); } return (Tree)Balance(); } } else { if (cmp > 0 || ((Tree)newNode).Duplicates()) { if (_preceding == null) { _preceding = newNode; _size++; } else { _preceding = _preceding.Add(newNode); if (_subsequent == null) { return (Tree)RotateRight(); } return (Tree)Balance(); } } else { return (Tree)((Tree)newNode).OnAttemptToAddDuplicate(this); } } return (Tree)this; } /// /// On adding a node to a tree, if it already exists, and if /// Tree#duplicates() returns false, #onAttemptToAddDuplicate() /// will be called and the existing node will be stored in /// this._preceding. /// /// /// On adding a node to a tree, if it already exists, and if /// Tree#duplicates() returns false, #onAttemptToAddDuplicate() /// will be called and the existing node will be stored in /// this._preceding. /// This node node can then be asked for the node that prevails /// in the tree on adding, using the #addedOrExisting() method. /// This mechanism allows doing find() and add() in one run. /// public virtual Tree AddedOrExisting() { if (WasAddedToTree()) { return this; } return _preceding; } public virtual bool WasAddedToTree() { return _size != 0; } public Tree Balance() { int cmp = _subsequent.Nodes() - _preceding.Nodes(); if (cmp < -2) { return RotateRight(); } else { if (cmp > 2) { return RotateLeft(); } else { SetSizeOwnPrecedingSubsequent(); return this; } } } public virtual Tree BalanceCheckNulls() { if (_subsequent == null) { if (_preceding == null) { SetSizeOwn(); return this; } return RotateRight(); } else { if (_preceding == null) { return RotateLeft(); } } return Balance(); } public virtual void CalculateSize() { if (_preceding == null) { if (_subsequent == null) { SetSizeOwn(); } else { SetSizeOwnSubsequent(); } } else { if (_subsequent == null) { SetSizeOwnPreceding(); } else { SetSizeOwnPrecedingSubsequent(); } } } /// /// returns 0, if keys are equal /// uses this - other /// returns positive if this is greater than a_to /// returns negative if this is smaller than a_to /// public abstract int Compare(Tree a_to); public static Tree DeepClone(Tree a_tree, object a_param) { if (a_tree == null) { return null; } Tree newNode = (Tree)a_tree.DeepClone(a_param); newNode._size = a_tree._size; newNode._preceding = Tree.DeepClone(((Tree)a_tree._preceding), a_param); newNode._subsequent = Tree.DeepClone(((Tree)a_tree._subsequent), a_param); return newNode; } public virtual object DeepClone(object a_param) { return ShallowClone(); } public virtual bool Duplicates() { return true; } public Tree Filter(IPredicate4 a_filter) { if (_preceding != null) { _preceding = _preceding.Filter(a_filter); } if (_subsequent != null) { _subsequent = _subsequent.Filter(a_filter); } if (!a_filter.Match(this)) { return Remove(); } return this; } public static Tree Find(Tree inTree, Tree template) { if (inTree == null) { return null; } return inTree.Find(template); } public Tree Find(Tree template) { Tree current = this; while (true) { int comparisonResult = current.Compare(template); if (comparisonResult == 0) { return current; } if (comparisonResult < 0) { current = ((Tree)current._subsequent); } else { current = ((Tree)current._preceding); } if (current == null) { return null; } } } public static Tree FindGreaterOrEqual(Tree a_in, Tree a_finder) { if (a_in == null) { return null; } int cmp = a_in.Compare(a_finder); if (cmp == 0) { return a_in; } // the highest node in the hierarchy !!! if (cmp > 0) { Tree node = FindGreaterOrEqual(((Tree)a_in._preceding), a_finder); if (node != null) { return node; } return a_in; } return FindGreaterOrEqual(((Tree)a_in._subsequent), a_finder); } public static Tree FindSmaller(Tree a_in, Tree a_node) { if (a_in == null) { return null; } int cmp = a_in.Compare(a_node); if (cmp < 0) { Tree node = FindSmaller(((Tree)a_in._subsequent), a_node); if (node != null) { return node; } return a_in; } return FindSmaller(((Tree)a_in._preceding), a_node); } public Tree First() { if (_preceding == null) { return this; } return _preceding.First(); } public static Tree Last(Tree tree) { if (tree == null) { return null; } return tree.Last(); } public Tree Last() { if (_subsequent == null) { return this; } return _subsequent.Last(); } public virtual Tree OnAttemptToAddDuplicate(Tree oldNode) { _size = 0; _preceding = oldNode; return oldNode; } /// the number of nodes in this tree for balancing public virtual int Nodes() { return _size; } public virtual int OwnSize() { return 1; } public virtual Tree Remove() { if (_subsequent != null && _preceding != null) { _subsequent = _subsequent.RotateSmallestUp(); _subsequent._preceding = _preceding; _subsequent.CalculateSize(); return _subsequent; } if (_subsequent != null) { return _subsequent; } return _preceding; } public virtual void RemoveChildren() { _preceding = null; _subsequent = null; SetSizeOwn(); } public virtual Tree RemoveFirst() { if (_preceding == null) { return _subsequent; } _preceding = _preceding.RemoveFirst(); CalculateSize(); return this; } public static Tree RemoveLike(Tree from, Tree a_find) { if (from == null) { return null; } return from.RemoveLike(a_find); } public Tree RemoveLike(Tree a_find) { int cmp = Compare(a_find); if (cmp == 0) { return (Tree)Remove(); } if (cmp > 0) { if (_preceding != null) { _preceding = _preceding.RemoveLike(a_find); } } else { if (_subsequent != null) { _subsequent = _subsequent.RemoveLike(a_find); } } CalculateSize(); return (Tree)this; } public Tree RemoveNode(Tree a_tree) { if (this == a_tree) { return Remove(); } int cmp = Compare(a_tree); if (cmp >= 0) { if (_preceding != null) { _preceding = _preceding.RemoveNode(a_tree); } } if (cmp <= 0) { if (_subsequent != null) { _subsequent = _subsequent.RemoveNode(a_tree); } } CalculateSize(); return this; } public Tree RotateLeft() { Tree tree = _subsequent; _subsequent = ((Tree)tree._preceding); CalculateSize(); tree._preceding = this; if (((Tree)tree._subsequent) == null) { tree.SetSizeOwnPlus(this); } else { tree.SetSizeOwnPlus(this, ((Tree)tree._subsequent)); } return tree; } public Tree RotateRight() { Tree tree = _preceding; _preceding = ((Tree)tree._subsequent); CalculateSize(); tree._subsequent = this; if (((Tree)tree._preceding) == null) { tree.SetSizeOwnPlus(this); } else { tree.SetSizeOwnPlus(this, ((Tree)tree._preceding)); } return tree; } private Tree RotateSmallestUp() { if (_preceding != null) { _preceding = _preceding.RotateSmallestUp(); return RotateRight(); } return this; } public void SetSizeOwn() { _size = OwnSize(); } public void SetSizeOwnPrecedingSubsequent() { _size = OwnSize() + _preceding._size + _subsequent._size; } public void SetSizeOwnPreceding() { _size = OwnSize() + _preceding._size; } public void SetSizeOwnSubsequent() { _size = OwnSize() + _subsequent._size; } public void SetSizeOwnPlus(Tree tree) { _size = OwnSize() + tree._size; } public void SetSizeOwnPlus(Tree tree1, Tree tree2) { _size = OwnSize() + tree1._size + tree2._size; } public static int Size(Tree a_tree) { if (a_tree == null) { return 0; } return a_tree.Size(); } /// the number of objects represented. public virtual int Size() { return _size; } public static void Traverse(Tree tree, IVisitor4 visitor) { if (tree == null) { return; } tree.Traverse(visitor); } /// Traverses a tree with a starting point node. /// /// Traverses a tree with a starting point node. /// If there is no exact match for the starting node, the next higher will be taken. /// public static void Traverse(Tree tree, Tree startingNode, ICancellableVisitor4 visitor ) { if (tree == null) { return; } tree.Traverse(startingNode, visitor); } private bool Traverse(Tree startingNode, ICancellableVisitor4 visitor) { if (startingNode != null) { int cmp = Compare(startingNode); if (cmp < 0) { if (_subsequent != null) { return _subsequent.Traverse(startingNode, visitor); } return true; } else { if (cmp > 0) { if (_preceding != null) { if (!_preceding.Traverse(startingNode, visitor)) { return false; } } } } } else { if (_preceding != null) { if (!_preceding.Traverse(null, visitor)) { return false; } } } if (!visitor.Visit(this)) { return false; } if (_subsequent != null) { if (!_subsequent.Traverse(null, visitor)) { return false; } } return true; } public void Traverse(IVisitor4 visitor) { if (_preceding != null) { _preceding.Traverse(visitor); } visitor.Visit((Tree)this); if (_subsequent != null) { _subsequent.Traverse(visitor); } } public void TraverseFromLeaves(IVisitor4 a_visitor) { if (_preceding != null) { _preceding.TraverseFromLeaves(a_visitor); } if (_subsequent != null) { _subsequent.TraverseFromLeaves(a_visitor); } a_visitor.Visit(this); } // Keep the debug method to debug the depth // public final void debugLeafDepth(int currentDepth){ // currentDepth++; // if(_preceding == null && _subsequent == null){ // System.out.println("" + currentDepth + " tree leaf depth."); // return; // } // if (_preceding != null){ // _preceding.debugLeafDepth(currentDepth); // } // if(_subsequent != null){ // _subsequent.debugLeafDepth(currentDepth); // } // } protected virtual Tree ShallowCloneInternal(Tree tree) { tree._preceding = _preceding; tree._size = _size; tree._subsequent = _subsequent; return tree; } public virtual object ShallowClone() { throw new NotImplementedException(); } public abstract object Key(); public virtual object Root() { return this; } public virtual void Accept(IVisitor4 visitor) { Traverse(new _IVisitor4_513(visitor)); } private sealed class _IVisitor4_513 : IVisitor4 { public _IVisitor4_513(IVisitor4 visitor) { this.visitor = visitor; } public void Visit(object obj) { Tree tree = (Tree)obj; visitor.Visit(tree.Key()); } private readonly IVisitor4 visitor; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/FlatteningIterator.cs0000644000175000017500000000302311700531646031267 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class FlatteningIterator : CompositeIterator4 { private class IteratorStack { public readonly IEnumerator iterator; public readonly FlatteningIterator.IteratorStack next; public IteratorStack(IEnumerator iterator_, FlatteningIterator.IteratorStack next_ ) { iterator = iterator_; next = next_; } } private FlatteningIterator.IteratorStack _stack; public FlatteningIterator(IEnumerator iterators) : base(iterators) { } public override bool MoveNext() { if (null == _currentIterator) { if (null == _stack) { _currentIterator = _iterators; } else { _currentIterator = Pop(); } } if (!_currentIterator.MoveNext()) { if (_currentIterator == _iterators) { return false; } _currentIterator = null; return MoveNext(); } object current = _currentIterator.Current; if (current is IEnumerator) { Push(_currentIterator); _currentIterator = NextIterator(current); return MoveNext(); } return true; } private void Push(IEnumerator currentIterator) { _stack = new FlatteningIterator.IteratorStack(currentIterator, _stack); } private IEnumerator Pop() { IEnumerator iterator = _stack.iterator; _stack = _stack.next; return iterator; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ArrayIterator4.cs0000644000175000017500000000066411700531646030346 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class ArrayIterator4 : IndexedIterator { private readonly object[] _elements; public ArrayIterator4(object[] elements) : base(elements.Length) { _elements = elements; } protected override object Get(int index) { return _elements[index]; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/CircularIntBuffer4.cs0000644000175000017500000001020111700531646031113 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. /// /// A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. /// public class CircularIntBuffer4 : IEnumerable { private const int Empty = -1; private readonly int[] _buffer; private int _head; private int _tail; public CircularIntBuffer4(int size) { _buffer = new int[size + 1]; } public virtual int Size() { return Index(_tail - _head); } public virtual void AddFirst(int value) { int newHead = CircularIndex(_head - 1); if (newHead == _tail) { throw new InvalidOperationException(); } _head = newHead; _buffer[Index(_head)] = value; } private int CircularIndex(int index) { return index % _buffer.Length; } private int Index(int i) { return i < 0 ? _buffer.Length + i : i; } public virtual int RemoveLast() { AssertNotEmpty(); _tail = CircularIndex(_tail - 1); return Erase(_tail); } private void AssertNotEmpty() { if (IsEmpty()) { throw new InvalidOperationException(); } } public virtual bool IsEmpty() { return Index(_head) == Index(_tail); } public virtual bool IsFull() { return CircularIndex(_head - 1) == _tail; } public virtual int RemoveFirst() { AssertNotEmpty(); int erased = Erase(_head); _head = CircularIndex(_head + 1); return erased; } private int Erase(int index) { int bufferIndex = Index(index); int erasedValue = _buffer[bufferIndex]; _buffer[bufferIndex] = Empty; return erasedValue; } public virtual bool Remove(int value) { int idx = IndexOf(value); if (idx >= 0) { RemoveAt(idx); return true; } return false; } public virtual bool Contains(int value) { return IndexOf(value) >= 0; } private int IndexOf(int value) { int current = Index(_head); int tail = Index(_tail); while (current != tail) { if (value == _buffer[current]) { break; } current = CircularIndex(current + 1); } return (current == tail ? -1 : current); } private void RemoveAt(int index) { if (Index(_tail - 1) == index) { RemoveLast(); return; } if (index == Index(_head)) { RemoveFirst(); return; } int current = index; int tail = Index(_tail); while (current != tail) { int next = CircularIndex(current + 1); _buffer[current] = _buffer[next]; current = next; } _tail = CircularIndex(_tail - 1); } public virtual IEnumerator GetEnumerator() { int tail = Index(_tail); int head = Index(_head); // TODO: detect concurrent modification and throw IllegalStateException return new _IEnumerator_123(this, head, tail); } private sealed class _IEnumerator_123 : IEnumerator { public _IEnumerator_123(CircularIntBuffer4 _enclosing, int head, int tail) { this._enclosing = _enclosing; this.head = head; this.tail = tail; this._index = head; this._current = Iterators.NoElement; } private int _index; private object _current; public object Current { get { if (this._current == Iterators.NoElement) { throw new InvalidOperationException(); } return this._current; } } public bool MoveNext() { if (this._index == tail) { return false; } this._current = this._enclosing._buffer[this._index]; this._index = this._enclosing.CircularIndex(this._index + 1); return true; } public void Reset() { throw new NotImplementedException(); } private readonly CircularIntBuffer4 _enclosing; private readonly int head; private readonly int tail; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/NonblockingQueue.cs0000644000175000017500000000475311700531646030745 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// Unbounded queue. /// Unbounded queue. /// public class NonblockingQueue : IQueue4 { private List4 _insertionPoint; private List4 _next; public void Add(object obj) { List4 newNode = new List4(null, obj); if (_insertionPoint == null) { _next = newNode; } else { _insertionPoint._next = newNode; } _insertionPoint = newNode; } public object Next() { if (_next == null) { return null; } object ret = ((object)_next._element); RemoveNext(); return ret; } private void RemoveNext() { _next = ((List4)_next._next); if (_next == null) { _insertionPoint = null; } } public virtual object NextMatching(IPredicate4 condition) { if (null == condition) { throw new ArgumentNullException(); } List4 current = _next; List4 previous = null; while (null != current) { object element = ((object)current._element); if (condition.Match(element)) { if (previous == null) { RemoveNext(); } else { previous._next = ((List4)current._next); } return element; } previous = current; current = ((List4)current._next); } return null; } public bool HasNext() { return _next != null; } public virtual IEnumerator Iterator() { List4 origInsertionPoint = _insertionPoint; List4 origNext = _next; return new _Iterator4Impl_82(this, origInsertionPoint, origNext, _next); } private sealed class _Iterator4Impl_82 : Iterator4Impl { public _Iterator4Impl_82(NonblockingQueue _enclosing, List4 origInsertionPoint, List4 origNext, List4 baseArg1) : base(baseArg1) { this._enclosing = _enclosing; this.origInsertionPoint = origInsertionPoint; this.origNext = origNext; } public override bool MoveNext() { if (origInsertionPoint != this._enclosing._insertionPoint || origNext != this._enclosing ._next) { throw new InvalidOperationException(); } return base.MoveNext(); } private readonly NonblockingQueue _enclosing; private readonly List4 origInsertionPoint; private readonly List4 origNext; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Hashtable4.cs0000644000175000017500000001233411700531646027446 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class Hashtable4 : HashtableBase, IDeepClone, IMap4 { public Hashtable4(int size) : base(size) { } public Hashtable4() : this(1) { } /// protected Hashtable4(IDeepClone cloneOnlyCtor) : base(cloneOnlyCtor) { } public virtual object DeepClone(object obj) { return DeepCloneInternal(new Db4objects.Db4o.Foundation.Hashtable4((IDeepClone)null ), obj); } public virtual void ForEachKeyForIdentity(IVisitor4 visitor, object obj) { for (int i = 0; i < _table.Length; i++) { HashtableIntEntry entry = _table[i]; while (entry != null) { if (entry._object == obj) { visitor.Visit(entry.Key()); } entry = entry._next; } } } public virtual object Get(byte[] key) { int intKey = HashtableByteArrayEntry.Hash(key); return GetFromObjectEntry(intKey, key); } public virtual object Get(int key) { HashtableIntEntry entry = _table[key & _mask]; while (entry != null) { if (entry._key == key) { return entry._object; } entry = entry._next; } return null; } public virtual object Get(object key) { if (key == null) { return null; } return GetFromObjectEntry(key.GetHashCode(), key); } public virtual object Get(long key) { return GetFromLongEntry((int)key, key); } public virtual bool ContainsKey(object key) { if (null == key) { return false; } return null != GetObjectEntry(key.GetHashCode(), key); } public virtual bool ContainsAllKeys(IEnumerable collection) { return ContainsAllKeys(collection.GetEnumerator()); } public virtual bool ContainsAllKeys(IEnumerator iterator) { while (iterator.MoveNext()) { if (!ContainsKey(iterator.Current)) { return false; } } return true; } public virtual void Put(byte[] key, object value) { PutEntry(new HashtableByteArrayEntry(key, value)); } public virtual void Put(int key, object value) { PutEntry(new HashtableIntEntry(key, value)); } public virtual void Put(long key, object value) { PutEntry(new HashtableLongEntry(key, value)); } public virtual void Put(object key, object value) { if (null == key) { throw new ArgumentNullException(); } PutEntry(new HashtableObjectEntry(key, value)); } public virtual object Remove(object objectKey) { int intKey = objectKey.GetHashCode(); return RemoveObjectEntry(intKey, objectKey); } public virtual object Remove(long longKey) { return RemoveLongEntry((int)longKey, longKey); } public virtual object Remove(byte[] key) { int intKey = HashtableByteArrayEntry.Hash(key); return RemoveObjectEntry(intKey, key); } public virtual object Remove(int key) { return RemoveIntEntry(key); } /// /// Iterates through all the /// entries /// . /// /// /// /// IEntry4 /// iterator /// /// HashtableBase.Values() /// /// #see /// HashtableBase.ValuesIterator() /// public virtual IEnumerator Iterator() { return HashtableIterator(); } protected virtual Db4objects.Db4o.Foundation.Hashtable4 DeepCloneInternal(Db4objects.Db4o.Foundation.Hashtable4 ret, object obj) { ret._mask = _mask; ret._maximumSize = _maximumSize; ret._size = _size; ret._tableSize = _tableSize; ret._table = new HashtableIntEntry[_tableSize]; for (int i = 0; i < _tableSize; i++) { if (_table[i] != null) { ret._table[i] = (HashtableIntEntry)_table[i].DeepClone(obj); } } return ret; } private object GetFromObjectEntry(int intKey, object objectKey) { HashtableObjectEntry entry = GetObjectEntry(intKey, objectKey); return entry == null ? null : entry._object; } private HashtableObjectEntry GetObjectEntry(int intKey, object objectKey) { HashtableObjectEntry entry = (HashtableObjectEntry)_table[intKey & _mask]; while (entry != null) { if (entry._key == intKey && entry.HasKey(objectKey)) { return entry; } entry = (HashtableObjectEntry)entry._next; } return null; } private object GetFromLongEntry(int intKey, long longKey) { HashtableLongEntry entry = GetLongEntry(intKey, longKey); return entry == null ? null : entry._object; } private HashtableLongEntry GetLongEntry(int intKey, long longKey) { HashtableLongEntry entry = (HashtableLongEntry)_table[intKey & _mask]; while (entry != null) { if (entry._key == intKey && entry._longKey == longKey) { return entry; } entry = (HashtableLongEntry)entry._next; } return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/TreeNodeIterator.cs0000644000175000017500000000060411700531646030703 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class TreeNodeIterator : AbstractTreeIterator { public TreeNodeIterator(Tree tree) : base(tree) { } protected override object CurrentValue(Tree tree) { return tree.Root(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IShallowClone.cs0000644000175000017500000000031511700531646030166 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IShallowClone { object ShallowClone(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntIterators.cs0000644000175000017500000000213611700531646030115 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class IntIterators { public static IFixedSizeIntIterator4 ForInts(int[] array, int count) { return new IntIterator4Impl(array, count); } public static IIntIterator4 ForLongs(long[] ids) { return new _IIntIterator4_10(ids); } private sealed class _IIntIterator4_10 : IIntIterator4 { public _IIntIterator4_10(long[] ids) { this.ids = ids; this._next = 0; } internal int _next; internal int _current; public int CurrentInt() { return this._current; } public object Current { get { return this._current; } } public bool MoveNext() { if (this._next < ids.Length) { this._current = (int)ids[this._next]; ++this._next; return true; } return false; } public void Reset() { throw new NotImplementedException(); } private readonly long[] ids; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntIterator4Impl.cs0000644000175000017500000000177711700531646030652 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class IntIterator4Impl : IFixedSizeIntIterator4 { private readonly int _count; private int[] _content; private int _current; public IntIterator4Impl(int[] content, int count) { _content = content; _count = count; Reset(); } public virtual int CurrentInt() { if (_content == null || _current == _count) { throw new InvalidOperationException(); } return _content[_current]; } public virtual object Current { get { return CurrentInt(); } } public virtual bool MoveNext() { if (_current < _count - 1) { _current++; return true; } _content = null; return false; } public virtual void Reset() { _current = -1; } public virtual int Size() { return _count; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SingleValueIterator.cs0000644000175000017500000000146411700531646031421 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class SingleValueIterator : IEnumerator { private object _value; private bool _moved; public SingleValueIterator(object value) { _value = value; } public virtual object Current { get { if (!_moved || _value == Iterators.NoElement) { throw new InvalidOperationException(); } return _value; } } public virtual bool MoveNext() { if (!_moved) { _moved = true; return true; } _value = Iterators.NoElement; return false; } public virtual void Reset() { throw new NotImplementedException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/KeySpecHashtable4.cs0000644000175000017500000000340011700531646030724 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class KeySpecHashtable4 : IDeepClone { private SynchronizedHashtable4 _delegate; private KeySpecHashtable4(SynchronizedHashtable4 delegate_) { _delegate = delegate_; } public KeySpecHashtable4(int size) : this(new SynchronizedHashtable4(size)) { } public virtual void Put(KeySpec spec, byte value) { _delegate.Put(spec, value); } public virtual void Put(KeySpec spec, bool value) { _delegate.Put(spec, value); } public virtual void Put(KeySpec spec, int value) { _delegate.Put(spec, value); } public virtual void Put(KeySpec spec, object value) { _delegate.Put(spec, value); } public virtual byte GetAsByte(KeySpec spec) { return ((byte)Get(spec)); } public virtual bool GetAsBoolean(KeySpec spec) { return ((bool)Get(spec)); } public virtual int GetAsInt(KeySpec spec) { return ((int)Get(spec)); } public virtual TernaryBool GetAsTernaryBool(KeySpec spec) { return (TernaryBool)Get(spec); } public virtual string GetAsString(KeySpec spec) { return (string)Get(spec); } public virtual object Get(KeySpec spec) { lock (this) { object value = _delegate.Get(spec); if (value == null) { value = spec.DefaultValue(); if (value != null) { _delegate.Put(spec, value); } } return value; } } public virtual object DeepClone(object obj) { return new Db4objects.Db4o.Foundation.KeySpecHashtable4((SynchronizedHashtable4)_delegate .DeepClone(obj)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IIntObjectVisitor.cs0000644000175000017500000000034211700531646031035 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IIntObjectVisitor { void Visit(int anInt, object anObject); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/BlockingQueueStoppedException.cs0000644000175000017500000000063611700531646033444 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; namespace Db4objects.Db4o.Foundation { /// [System.Serializable] public class BlockingQueueStoppedException : Exception { public BlockingQueueStoppedException() : base() { if (DTrace.enabled) { DTrace.BlockingQueueStoppedException.Log(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IObjectPool.cs0000644000175000017500000000032311700531646027633 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public interface IObjectPool { object BorrowObject(); void ReturnObject(object o); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IDeepClone.cs0000644000175000017500000000103111700531646027426 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// Deep clone /// public interface IDeepClone { /// /// The parameter allows passing one new object so parent /// references can be corrected on children. /// /// /// The parameter allows passing one new object so parent /// references can be corrected on children. /// object DeepClone(object context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Iterator4Impl.cs0000644000175000017500000000175611700531646030174 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class Iterator4Impl : IEnumerator { private readonly List4 _first; private List4 _next; private object _current; public Iterator4Impl(List4 first) { _first = first; _next = first; _current = Iterators.NoElement; } public virtual bool MoveNext() { if (_next == null) { _current = Iterators.NoElement; return false; } _current = ((object)_next._element); _next = ((List4)_next._next); return true; } public virtual object Current { get { if (Iterators.NoElement == _current) { throw new InvalidOperationException(); } return (object)_current; } } public virtual void Reset() { _next = _first; _current = Iterators.NoElement; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/TimeoutBlockingQueue.cs0000644000175000017500000000145111700531646031571 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { public class TimeoutBlockingQueue : PausableBlockingQueue, ITimeoutBlockingQueue4 { private long expirationDate; private readonly long maxTimeToRemainPaused; public TimeoutBlockingQueue(long maxTimeToRemainPaused) { this.maxTimeToRemainPaused = maxTimeToRemainPaused; } public override bool Pause() { Reset(); return base.Pause(); } public virtual void Check() { long now = Runtime.CurrentTimeMillis(); if (now > expirationDate) { Resume(); } } public virtual void Reset() { expirationDate = Runtime.CurrentTimeMillis() + maxTimeToRemainPaused; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Iterable4Adaptor.cs0000644000175000017500000000310411700531646030610 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; namespace Db4objects.Db4o.Foundation { /// /// Adapts Iterable4/Iterator4 iteration model (moveNext, current) to the old db4o /// and jdk model (hasNext, next). /// /// /// Adapts Iterable4/Iterator4 iteration model (moveNext, current) to the old db4o /// and jdk model (hasNext, next). /// /// public class Iterable4Adaptor { private static readonly object EofMarker = new object(); private static readonly object MoveNextMarker = new object(); private readonly IEnumerable _delegate; private IEnumerator _iterator; private object _current = MoveNextMarker; public Iterable4Adaptor(IEnumerable delegate_) { _delegate = delegate_; } public virtual bool HasNext() { if (_current == MoveNextMarker) { return MoveNext(); } return _current != EofMarker; } public virtual object Next() { if (!HasNext()) { throw new InvalidOperationException(); } object returnValue = _current; _current = MoveNextMarker; return returnValue; } protected virtual bool MoveNext() { if (null == _iterator) { _iterator = _delegate.GetEnumerator(); } if (_iterator.MoveNext()) { _current = _iterator.Current; return true; } _current = EofMarker; return false; } public virtual void Reset() { _iterator = null; _current = MoveNextMarker; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/BlockingQueue.cs0000644000175000017500000001452411700531646030227 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { /// public class BlockingQueue : IBlockingQueue4 { protected NonblockingQueue _queue = new NonblockingQueue(); protected Lock4 _lock = new Lock4(); protected bool _stopped; public virtual void Add(object obj) { if (obj == null) { throw new ArgumentException(); } _lock.Run(new _IClosure4_20(this, obj)); } private sealed class _IClosure4_20 : IClosure4 { public _IClosure4_20(BlockingQueue _enclosing, object obj) { this._enclosing = _enclosing; this.obj = obj; } public object Run() { this._enclosing._queue.Add(obj); this._enclosing._lock.Awake(); return null; } private readonly BlockingQueue _enclosing; private readonly object obj; } public virtual bool HasNext() { return (((bool)_lock.Run(new _IClosure4_30(this)))); } private sealed class _IClosure4_30 : IClosure4 { public _IClosure4_30(BlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing._queue.HasNext(); } private readonly BlockingQueue _enclosing; } public virtual IEnumerator Iterator() { return ((IEnumerator)_lock.Run(new _IClosure4_38(this))); } private sealed class _IClosure4_38 : IClosure4 { public _IClosure4_38(BlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing._queue.Iterator(); } private readonly BlockingQueue _enclosing; } /// public virtual object Next(long timeout) { return (object)_lock.Run(new _IClosure4_46(this, timeout)); } private sealed class _IClosure4_46 : IClosure4 { public _IClosure4_46(BlockingQueue _enclosing, long timeout) { this._enclosing = _enclosing; this.timeout = timeout; } public object Run() { return this._enclosing.UnsafeWaitForNext(timeout) ? this._enclosing.UnsafeNext() : null; } private readonly BlockingQueue _enclosing; private readonly long timeout; } public virtual int DrainTo(Collection4 target) { return (((int)_lock.Run(new _IClosure4_54(this, target)))); } private sealed class _IClosure4_54 : IClosure4 { public _IClosure4_54(BlockingQueue _enclosing, Collection4 target) { this._enclosing = _enclosing; this.target = target; } public object Run() { this._enclosing.UnsafeWaitForNext(); int i = 0; while (this._enclosing.HasNext()) { i++; target.Add(this._enclosing.UnsafeNext()); } return i; } private readonly BlockingQueue _enclosing; private readonly Collection4 target; } /// public virtual bool WaitForNext(long timeout) { return (((bool)_lock.Run(new _IClosure4_68(this, timeout)))); } private sealed class _IClosure4_68 : IClosure4 { public _IClosure4_68(BlockingQueue _enclosing, long timeout) { this._enclosing = _enclosing; this.timeout = timeout; } public object Run() { return this._enclosing.UnsafeWaitForNext(timeout); } private readonly BlockingQueue _enclosing; private readonly long timeout; } /// public virtual object Next() { return (object)_lock.Run(new _IClosure4_76(this)); } private sealed class _IClosure4_76 : IClosure4 { public _IClosure4_76(BlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing.UnsafeWaitForNext(); return this._enclosing.UnsafeNext(); } private readonly BlockingQueue _enclosing; } public virtual void Stop() { _lock.Run(new _IClosure4_85(this)); } private sealed class _IClosure4_85 : IClosure4 { public _IClosure4_85(BlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing._stopped = true; this._enclosing._lock.Awake(); return null; } private readonly BlockingQueue _enclosing; } public virtual object NextMatching(IPredicate4 condition) { return _lock.Run(new _IClosure4_95(this, condition)); } private sealed class _IClosure4_95 : IClosure4 { public _IClosure4_95(BlockingQueue _enclosing, IPredicate4 condition) { this._enclosing = _enclosing; this.condition = condition; } public object Run() { return this._enclosing._queue.NextMatching(condition); } private readonly BlockingQueue _enclosing; private readonly IPredicate4 condition; } /// public virtual void WaitForNext() { _lock.Run(new _IClosure4_103(this)); } private sealed class _IClosure4_103 : IClosure4 { public _IClosure4_103(BlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing.UnsafeWaitForNext(); return null; } private readonly BlockingQueue _enclosing; } /// protected virtual void UnsafeWaitForNext() { UnsafeWaitForNext(long.MaxValue); } /// protected virtual bool UnsafeWaitForNext(long timeout) { long timeLeft = timeout; long now = Runtime.CurrentTimeMillis(); while (timeLeft > 0) { if (_queue.HasNext()) { return true; } if (_stopped) { throw new BlockingQueueStoppedException(); } _lock.Snooze(timeLeft); long l = now; now = Runtime.CurrentTimeMillis(); timeLeft -= now - l; } return false; } private object UnsafeNext() { return _queue.Next(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Arrays4.cs0000644000175000017500000000506411700531646027016 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { /// public class Arrays4 { public static int[] CopyOf(int[] src, int newLength) { int[] copy = new int[newLength]; System.Array.Copy(src, 0, copy, 0, Math.Min(src.Length, newLength)); return copy; } public static int IndexOfIdentity(object[] array, object element) { for (int i = 0; i < array.Length; i++) { if (array[i] == element) { return i; } } return -1; } public static int IndexOfEquals(object[] array, object expected) { for (int i = 0; i < array.Length; ++i) { if (expected.Equals(array[i])) { return i; } } return -1; } public static int IndexOf(int[] array, int element) { for (int i = 0; i < array.Length; i++) { if (array[i] == element) { return i; } } return -1; } public static bool Equals(byte[] x, byte[] y) { if (x == y) { return true; } if (x == null) { return false; } if (x.Length != y.Length) { return false; } for (int i = 0; i < x.Length; i++) { if (y[i] != x[i]) { return false; } } return true; } public static bool Equals(object[] x, object[] y) { if (x == y) { return true; } if (x == null) { return false; } if (x.Length != y.Length) { return false; } for (int i = 0; i < x.Length; i++) { if (!ObjectsAreEqual(y[i], x[i])) { return false; } } return true; } private static bool ObjectsAreEqual(object x, object y) { if (x == y) { return true; } if (x == null || y == null) { return false; } return x.Equals(y); } public static bool ContainsInstanceOf(object[] array, Type klass) { if (array == null) { return false; } for (int i = 0; i < array.Length; ++i) { if (klass.IsInstanceOfType(array[i])) { return true; } } return false; } public static void Fill(object[] array, object value) { for (int i = 0; i < array.Length; ++i) { array[i] = value; } } public static Collection4 AsList(object[] arr) { Collection4 coll = new Collection4(); for (int arrIdx = 0; arrIdx < arr.Length; arrIdx++) { coll.Add(arr[arrIdx]); } return coll; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntIdGenerator.cs0000644000175000017500000000052011700531646030337 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public class IntIdGenerator { private int _current = 1; public virtual int Next() { _current++; if (_current < 0) { _current = 1; } return _current; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/DynamicVariable.cs0000644000175000017500000000262111700531646030517 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { /// A dynamic variable is a value associated to a specific thread and scope. /// /// /// A dynamic variable is a value associated to a specific thread and scope. /// The value is brought into scope with the /// With(object, IClosure4) /// method. /// public class DynamicVariable { public static DynamicVariable NewInstance() { return new DynamicVariable(); } private readonly ThreadLocal _value = new ThreadLocal(); public virtual object Value { get { object value = _value.Get(); return value == null ? DefaultValue() : value; } set { _value.Set(value); } } protected virtual object DefaultValue() { return null; } public virtual object With(object value, IClosure4 block) { object previous = _value.Get(); _value.Set(value); try { return block.Run(); } finally { _value.Set(previous); } } public virtual void With(object value, IRunnable block) { object previous = _value.Get(); _value.Set(value); try { block.Run(); } finally { _value.Set(previous); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IPredicate4.cs0000644000175000017500000000032211700531646027556 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IPredicate4 { bool Match(object candidate); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableLongEntry.cs0000644000175000017500000000237711700531646031232 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class HashtableLongEntry : HashtableIntEntry { public long _longKey; internal HashtableLongEntry(long key, object obj) : base((int)key, obj) { // FIELDS ARE PUBLIC SO THEY CAN BE REFLECTED ON IN JDKs <= 1.1 _longKey = key; } public HashtableLongEntry() : base() { } public override object Key() { return _longKey; } public override object DeepClone(object obj) { return DeepCloneInternal(new Db4objects.Db4o.Foundation.HashtableLongEntry(), obj ); } protected override HashtableIntEntry DeepCloneInternal(HashtableIntEntry entry, object obj) { ((Db4objects.Db4o.Foundation.HashtableLongEntry)entry)._longKey = _longKey; return base.DeepCloneInternal(entry, obj); } public override bool SameKeyAs(HashtableIntEntry other) { return other is Db4objects.Db4o.Foundation.HashtableLongEntry ? ((Db4objects.Db4o.Foundation.HashtableLongEntry )other)._longKey == _longKey : false; } public override string ToString() { return string.Empty + _longKey + ": " + _object; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntArrayList.cs0000644000175000017500000000372311700531646030056 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { /// public class IntArrayList : IEnumerable { protected int[] i_content; private int i_count; public IntArrayList() : this(10) { } public IntArrayList(int initialSize) { i_content = new int[initialSize]; } public virtual void Add(int a_value) { EnsureCapacity(); i_content[i_count++] = a_value; } public virtual void Add(int index, int a_value) { EnsureCapacity(); System.Array.Copy(i_content, index, i_content, index + 1, i_count - index); i_content[index] = a_value; i_count++; } private void EnsureCapacity() { if (i_count >= i_content.Length) { int inc = i_content.Length / 2; if (inc < 10) { inc = 10; } int[] temp = new int[i_content.Length + inc]; System.Array.Copy(i_content, 0, temp, 0, i_content.Length); i_content = temp; } } public virtual int IndexOf(int a_value) { for (int i = 0; i < i_count; i++) { if (i_content[i] == a_value) { return i; } } return -1; } public virtual int Size() { return i_count; } public virtual long[] AsLong() { long[] longs = new long[i_count]; for (int i = 0; i < i_count; i++) { longs[i] = i_content[i]; } return longs; } public virtual IIntIterator4 IntIterator() { return IntIterators.ForInts(i_content, i_count); } public virtual IEnumerator GetEnumerator() { return IntIterator(); } public virtual int Get(int index) { return i_content[index]; } public virtual void Swap(int left, int right) { if (left != right) { int swap = i_content[left]; i_content[left] = i_content[right]; i_content[right] = swap; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Stack4.cs0000644000175000017500000000133311700531646026615 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class Stack4 { private List4 _tail; public virtual void Push(object obj) { _tail = new List4(_tail, obj); } public virtual object Peek() { if (_tail == null) { return null; } return _tail._element; } public virtual object Pop() { if (_tail == null) { throw new InvalidOperationException(); } object res = _tail._element; _tail = ((List4)_tail._next); return res; } public virtual bool IsEmpty() { return _tail == null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableIntEntry.cs0000644000175000017500000000303111700531646031051 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class HashtableIntEntry : IEntry4, IDeepClone { public int _key; public object _object; public Db4objects.Db4o.Foundation.HashtableIntEntry _next; internal HashtableIntEntry(int key, object obj) { // FIELDS ARE PUBLIC SO THEY CAN BE REFLECTED ON IN JDKs <= 1.1 _key = key; _object = obj; } public HashtableIntEntry() { } public virtual object Key() { return _key; } public virtual object Value() { return _object; } public virtual object DeepClone(object obj) { return DeepCloneInternal(new Db4objects.Db4o.Foundation.HashtableIntEntry(), obj); } public virtual bool SameKeyAs(Db4objects.Db4o.Foundation.HashtableIntEntry other) { return _key == other._key; } protected virtual Db4objects.Db4o.Foundation.HashtableIntEntry DeepCloneInternal( Db4objects.Db4o.Foundation.HashtableIntEntry entry, object obj) { entry._key = _key; entry._next = _next; if (_object is IDeepClone) { entry._object = ((IDeepClone)_object).DeepClone(obj); } else { entry._object = _object; } if (_next != null) { entry._next = (Db4objects.Db4o.Foundation.HashtableIntEntry)_next.DeepClone(obj); } return entry; } public override string ToString() { return string.Empty + _key + ": " + _object; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IBlock4.cs0000644000175000017500000000024211700531646026711 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public interface IBlock4 { void Run(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntIterator4Adaptor.cs0000644000175000017500000000144611700531646031334 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class IntIterator4Adaptor : IIntIterator4 { private readonly IEnumerator _iterator; public IntIterator4Adaptor(IEnumerator iterator) { _iterator = iterator; } public IntIterator4Adaptor(IEnumerable iterable) : this(iterable.GetEnumerator()) { } public virtual int CurrentInt() { return ((int)Current); } public virtual object Current { get { return _iterator.Current; } } public virtual bool MoveNext() { return _iterator.MoveNext(); } public virtual void Reset() { _iterator.Reset(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IVisitor4.cs0000644000175000017500000000031211700531646027314 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IVisitor4 { void Visit(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IBlockingQueue4.cs0000644000175000017500000000342411700531646030421 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public interface IBlockingQueue4 : IQueue4 { /// ///

/// Returns the next queued item or waits for it to be available for the /// maximum of timeout miliseconds. ///

/// ///

/// Returns the next queued item or waits for it to be available for the /// maximum of timeout miliseconds. /// /// maximum time to wait for the next avilable item in miliseconds /// /// /// the next item or null if timeout is /// reached /// /// /// if the /// Stop() /// is called. /// /// object Next(long timeout); void Stop(); ///

///

/// Removes all the available elements in the queue to the colletion passed /// as argument. ///

/// ///

/// Removes all the available elements in the queue to the colletion passed /// as argument. ///

/// It will block until at least one element is available. /// /// /// the number of elements added to the list. /// /// if the /// Stop() /// is called. /// /// int DrainTo(Collection4 list); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntByRef.cs0000644000175000017500000000065211700531646027151 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { ///

Useful as "out" or "by ref" function parameter. /// Useful as "out" or "by ref" function parameter. public sealed class IntByRef { public int value; public IntByRef(int initialValue) { value = initialValue; } public IntByRef() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableIterator.cs0000644000175000017500000000270511700531646031075 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class HashtableIterator : IEnumerator { private readonly HashtableIntEntry[] _table; private HashtableIntEntry _currentEntry; private int _currentIndex; public HashtableIterator(HashtableIntEntry[] table) { _table = table; Reset(); } private void CheckInvalidTable() { if (_table == null || _table.Length == 0) { PositionBeyondLast(); } } public virtual object Current { get { if (_currentEntry == null) { throw new InvalidOperationException(); } return _currentEntry; } } public virtual bool MoveNext() { if (IsBeyondLast()) { return false; } if (_currentEntry != null) { _currentEntry = _currentEntry._next; } while (_currentEntry == null) { if (_currentIndex >= _table.Length) { PositionBeyondLast(); return false; } _currentEntry = _table[_currentIndex++]; } return true; } public virtual void Reset() { _currentEntry = null; _currentIndex = 0; CheckInvalidTable(); } private bool IsBeyondLast() { return _currentIndex == -1; } private void PositionBeyondLast() { _currentIndex = -1; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/FilteredIterator.cs0000644000175000017500000000101311700531646030727 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class FilteredIterator : MappingIterator { private readonly IPredicate4 _filter; public FilteredIterator(IEnumerator iterator, IPredicate4 filter) : base(iterator ) { _filter = filter; } protected override object Map(object current) { return _filter.Match(current) ? current : Iterators.Skip; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/AutoStopWatch.cs0000644000175000017500000000036711700531646030237 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class AutoStopWatch : StopWatch { public AutoStopWatch() { Start(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/CompositeIterable4.cs0000644000175000017500000000142411700531646031163 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class CompositeIterable4 : IEnumerable { private readonly IEnumerable _iterables; public CompositeIterable4(IEnumerable iterables) { _iterables = iterables; } public virtual IEnumerator GetEnumerator() { return new _CompositeIterator4_15(_iterables.GetEnumerator()); } private sealed class _CompositeIterator4_15 : CompositeIterator4 { public _CompositeIterator4_15(IEnumerator baseArg1) : base(baseArg1) { } protected override IEnumerator NextIterator(object current) { return ((IEnumerable)current).GetEnumerator(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IFunction4.cs0000644000175000017500000000031511700531646027445 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IFunction4 { object Apply(object arg); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Runnable4.cs0000644000175000017500000000062011700531646027314 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { /// public class Runnable4 { private sealed class _IRunnable_10 : IRunnable { public _IRunnable_10() { } public void Run() { } } public static readonly IRunnable DoNothing = new _IRunnable_10(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/TimeStampIdGenerator.cs0000644000175000017500000000350311700531646031514 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Sharpen; namespace Db4objects.Db4o.Foundation { /// public class TimeStampIdGenerator { public const int BitsReservedForCounter = 15; public const int CounterLimit = 64; private long _counter; private long _lastTime; public static long IdToMilliseconds(long id) { return id >> BitsReservedForCounter; } public static long MillisecondsToId(long milliseconds) { return milliseconds << BitsReservedForCounter; } public TimeStampIdGenerator(long minimumNext) { InternalSetMinimumNext(minimumNext); } public TimeStampIdGenerator() : this(0) { } public virtual long Generate() { long t = Now(); if (t > _lastTime) { _lastTime = t; _counter = 0; return MillisecondsToId(t); } UpdateTimeOnCounterLimitOverflow(); _counter++; UpdateTimeOnCounterLimitOverflow(); return Last(); } protected virtual long Now() { return Runtime.CurrentTimeMillis(); } private void UpdateTimeOnCounterLimitOverflow() { if (_counter < CounterLimit) { return; } long timeIncrement = _counter / CounterLimit; _lastTime += timeIncrement; _counter -= (timeIncrement * CounterLimit); } public virtual long Last() { return MillisecondsToId(_lastTime) + _counter; } public virtual bool SetMinimumNext(long newMinimum) { if (newMinimum <= Last()) { return false; } InternalSetMinimumNext(newMinimum); return true; } private void InternalSetMinimumNext(long newNext) { _lastTime = IdToMilliseconds(newNext); long timePart = MillisecondsToId(_lastTime); _counter = newNext - timePart; UpdateTimeOnCounterLimitOverflow(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IPausableBlockingQueue4.cs0000644000175000017500000000254611700531646032102 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public interface IPausableBlockingQueue4 : IBlockingQueue4 { /// ///

/// Pauses the queue, making calls to /// IQueue4.Next() /// block /// until /// Resume() /// is called. ///

/// whether or not this call changed the state of the queue. bool Pause(); /// ///

/// Resumes the queue, releasing blocked calls to /// IQueue4.Next() /// that can reach a next queue item.. ///

/// whether or not this call changed the state of the queue. bool Resume(); bool IsPaused(); /// ///

/// Returns the next element in queue if there is one available, returns null /// otherwise. ///

/// ///

/// Returns the next element in queue if there is one available, returns null /// otherwise. ///

/// This method will not never block, regardless of the queue being paused or /// no elements are available. /// /// next element, if available and queue not paused. object TryNext(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/PausableBlockingQueue.cs0000644000175000017500000000350011700531646031674 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class PausableBlockingQueue : BlockingQueue, IPausableBlockingQueue4 { private volatile bool _paused = false; public virtual bool Pause() { if (_paused) { return false; } _paused = true; return true; } public virtual bool Resume() { return (((bool)_lock.Run(new _IClosure4_17(this)))); } private sealed class _IClosure4_17 : IClosure4 { public _IClosure4_17(PausableBlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { if (!this._enclosing._paused) { return false; } this._enclosing._paused = false; this._enclosing._lock.Awake(); return true; } private readonly PausableBlockingQueue _enclosing; } public virtual bool IsPaused() { return _paused; } /// protected override bool UnsafeWaitForNext(long timeout) { bool hasNext = base.UnsafeWaitForNext(timeout); while (_paused && !_stopped) { _lock.Snooze(timeout); } if (_stopped) { throw new BlockingQueueStoppedException(); } return hasNext; } public virtual object TryNext() { return _lock.Run(new _IClosure4_46(this)); } private sealed class _IClosure4_46 : IClosure4 { public _IClosure4_46(PausableBlockingQueue _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing.IsPaused() ? null : this._enclosing.HasNext() ? this._enclosing .Next() : null; } private readonly PausableBlockingQueue _enclosing; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SynchronizedHashtable4.cs0000644000175000017500000000157411700531646032052 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class SynchronizedHashtable4 : IDeepClone { private readonly Hashtable4 _delegate; private SynchronizedHashtable4(Hashtable4 delegate_) { _delegate = delegate_; } public SynchronizedHashtable4(int size) : this(new Hashtable4(size)) { } public virtual object DeepClone(object obj) { lock (this) { return new Db4objects.Db4o.Foundation.SynchronizedHashtable4((Hashtable4)_delegate .DeepClone(obj)); } } public virtual void Put(object key, object value) { lock (this) { _delegate.Put(key, value); } } public virtual object Get(object key) { lock (this) { return _delegate.Get(key); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/CompositeIterator4.cs0000644000175000017500000000277711700531646031241 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class CompositeIterator4 : IEnumerator { protected readonly IEnumerator _iterators; protected IEnumerator _currentIterator; public CompositeIterator4(IEnumerator[] iterators) : this(new ArrayIterator4(iterators )) { } public CompositeIterator4(IEnumerator iterators) { if (null == iterators) { throw new ArgumentNullException(); } _iterators = iterators; } public virtual bool MoveNext() { if (null == _currentIterator) { if (!_iterators.MoveNext()) { return false; } _currentIterator = NextIterator(_iterators.Current); } if (!_currentIterator.MoveNext()) { _currentIterator = null; return MoveNext(); } return true; } public virtual void Reset() { ResetIterators(); _currentIterator = null; _iterators.Reset(); } private void ResetIterators() { _iterators.Reset(); while (_iterators.MoveNext()) { NextIterator(_iterators.Current).Reset(); } } public virtual IEnumerator CurrentIterator() { return _currentIterator; } public virtual object Current { get { return _currentIterator.Current; } } protected virtual IEnumerator NextIterator(object current) { return (IEnumerator)current; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/DelegatingBlockingQueue.cs0000644000175000017500000000213111700531646032202 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class DelegatingBlockingQueue : IBlockingQueue4 { private IBlockingQueue4 queue; /// public virtual object Next(long timeout) { return queue.Next(timeout); } public virtual object Next() { return queue.Next(); } public virtual void Add(object obj) { queue.Add(obj); } public virtual bool HasNext() { return queue.HasNext(); } public virtual object NextMatching(IPredicate4 condition) { return queue.NextMatching(condition); } public virtual IEnumerator Iterator() { return queue.Iterator(); } public DelegatingBlockingQueue(IBlockingQueue4 queue) { this.queue = queue; } public virtual void Stop() { queue.Stop(); } public virtual int DrainTo(Collection4 list) { return queue.DrainTo(list); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ThreadLocal4.cs0000644000175000017500000000253411700531646027736 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { ///

/// ThreadLocal implementation for less capable platforms such as JRE 1.1 and /// Silverlight. /// /// /// ThreadLocal implementation for less capable platforms such as JRE 1.1 and /// Silverlight. /// This class is not intended to be used directly, use /// DynamicVariable /// . /// WARNING: This implementation might leak Thread references unless /// Set(object) /// is called with null on the right thread to clean it up. This /// behavior is currently guaranteed by /// DynamicVariable /// . /// public class ThreadLocal4 { private readonly IDictionary _values = new Hashtable(); public virtual void Set(object value) { lock (this) { if (value == null) { Sharpen.Collections.Remove(_values, Thread.CurrentThread()); } else { _values[Thread.CurrentThread()] = value; } } } public virtual object Get() { lock (this) { return _values[Thread.CurrentThread()]; } } protected object InitialValue() { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ICancellableVisitor4.cs0000644000175000017500000000040111700531646031421 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public interface ICancellableVisitor4 { /// true to continue traversal, false otherwise bool Visit(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ListenerRegistry.cs0000644000175000017500000000166111700531646031006 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class ListenerRegistry { public static ListenerRegistry NewInstance() { return new ListenerRegistry(); } private IdentitySet4 _listeners; public virtual void Register(IListener4 listener) { if (_listeners == null) { _listeners = new IdentitySet4(); } _listeners.Add(listener); } public virtual void NotifyListeners(object @event) { if (_listeners == null) { return; } IEnumerator i = _listeners.GetEnumerator(); while (i.MoveNext()) { ((IListener4)i.Current).OnEvent(@event); } } public virtual void Remove(IListener4 listener) { if (_listeners == null) { return; } _listeners.Remove(listener); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IVisitable.cs0000644000175000017500000000037011700531646027517 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public interface IVisitable { void Accept(IVisitor4 visitor); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashSet4.cs0000644000175000017500000000211711700531646027110 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class HashSet4 : ISet4 { private Hashtable4 _map; public HashSet4() : this(1) { } public HashSet4(int count) { _map = new Hashtable4(count); } public virtual bool Add(object obj) { if (_map.ContainsKey(obj)) { return false; } _map.Put(obj, obj); return true; } public virtual void Clear() { _map.Clear(); } public virtual bool Contains(object obj) { return _map.ContainsKey(obj); } public virtual bool IsEmpty() { return _map.Size() == 0; } public virtual IEnumerator GetEnumerator() { return _map.Values().GetEnumerator(); } public virtual bool Remove(object obj) { return _map.Remove(obj) != null; } public virtual int Size() { return _map.Size(); } public override string ToString() { return Iterators.Join(_map.Keys(), "{", "}", ", "); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/TreeKeyIterator.cs0000644000175000017500000000060111700531646030543 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class TreeKeyIterator : AbstractTreeIterator { public TreeKeyIterator(Tree tree) : base(tree) { } protected override object CurrentValue(Tree tree) { return tree.Key(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IMap4.cs0000644000175000017500000000061611700531646026401 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Foundation { /// public interface IMap4 { int Size(); object Get(object key); void Put(object key, object value); bool ContainsKey(object key); object Remove(object key); IEnumerable Values(); void Clear(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableIdentityEntry.cs0000644000175000017500000000102311700531646032107 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { /// public class HashtableIdentityEntry : HashtableIntEntry { public HashtableIdentityEntry(object obj) : base(Runtime.IdentityHashCode(obj), obj ) { } public override bool SameKeyAs(HashtableIntEntry other) { if (!base.SameKeyAs(other)) { return false; } return other._object == _object; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/LongByRef.cs0000644000175000017500000000065711700531646027323 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// Useful as "out" or "by ref" function parameter. /// Useful as "out" or "by ref" function parameter. public sealed class LongByRef { public long value; public LongByRef(long initialValue) { value = initialValue; } public LongByRef() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SubTypePredicate.cs0000644000175000017500000000065411700531646030705 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class SubTypePredicate : IPredicate4 { private readonly Type _class; public SubTypePredicate(Type clazz) { _class = clazz; } public virtual bool Match(object candidate) { return _class.IsInstanceOfType(candidate); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ISortable4.cs0000644000175000017500000000043711700531646027440 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface ISortable4 { int Size(); int Compare(int leftIndex, int rightIndex); void Swap(int leftIndex, int rightIndex); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/StopWatch.cs0000644000175000017500000000152011700531646027376 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { public class StopWatch { private long _started; private long _elapsed; public StopWatch() { } public virtual void Start() { _started = Runtime.CurrentTimeMillis(); } public virtual void Stop() { _elapsed = Peek(); } public virtual long Peek() { return Runtime.CurrentTimeMillis() - _started; } public virtual long Elapsed() { return _elapsed; } public static long Time(IBlock4 block) { Db4objects.Db4o.Foundation.StopWatch stopWatch = new Db4objects.Db4o.Foundation.StopWatch (); stopWatch.Start(); block.Run(); stopWatch.Stop(); return stopWatch.Elapsed(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Pair.cs0000644000175000017500000000276511700531646026371 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public class Pair { public static Db4objects.Db4o.Foundation.Pair Of(object first, object second) { return new Db4objects.Db4o.Foundation.Pair(first, second); } public object first; public object second; public Pair(object first, object second) { this.first = first; this.second = second; } public override string ToString() { return "Pair.of(" + first + ", " + second + ")"; } public override int GetHashCode() { int prime = 31; int result = 1; result = prime * result + ((first == null) ? 0 : first.GetHashCode()); result = prime * result + ((second == null) ? 0 : second.GetHashCode()); return result; } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (GetType() != obj.GetType()) { return false; } Db4objects.Db4o.Foundation.Pair other = (Db4objects.Db4o.Foundation.Pair)obj; if (first == null) { if (other.first != null) { return false; } } else { if (!first.Equals(other.first)) { return false; } } if (second == null) { if (other.second != null) { return false; } } else { if (!second.Equals(other.second)) { return false; } } return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Environments.cs0000644000175000017500000001014611700531646030155 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { public partial class Environments { private static readonly DynamicVariable _current = DynamicVariable.NewInstance(); public static object My(Type service) { IEnvironment environment = Current(); if (null == environment) { throw new InvalidOperationException(); } return environment.Provide(service); } private static IEnvironment Current() { return ((IEnvironment)_current.Value); } public static void RunWith(IEnvironment environment, IRunnable runnable) { _current.With(environment, runnable); } public static IEnvironment NewClosedEnvironment(object[] bindings) { return new _IEnvironment_32(bindings); } private sealed class _IEnvironment_32 : IEnvironment { public _IEnvironment_32(object[] bindings) { this.bindings = bindings; } public object Provide(Type service) { for (int bindingIndex = 0; bindingIndex < bindings.Length; ++bindingIndex) { object binding = bindings[bindingIndex]; if (service.IsInstanceOfType(binding)) { return (object)binding; } } return null; } private readonly object[] bindings; } public static IEnvironment NewCachingEnvironmentFor(IEnvironment environment) { return new _IEnvironment_48(environment); } private sealed class _IEnvironment_48 : IEnvironment { public _IEnvironment_48(IEnvironment environment) { this.environment = environment; this._bindings = new Hashtable(); } private readonly IDictionary _bindings; public object Provide(Type service) { object existing = this._bindings[service]; if (null != existing) { return (object)existing; } object binding = environment.Provide(service); if (null == binding) { return null; } this._bindings[service] = binding; return binding; } private readonly IEnvironment environment; } public static IEnvironment NewConventionBasedEnvironment(object[] bindings) { return NewCachingEnvironmentFor(Compose(new IEnvironment[] { NewClosedEnvironment (bindings), new Environments.ConventionBasedEnvironment() })); } public static IEnvironment NewConventionBasedEnvironment() { return NewCachingEnvironmentFor(new Environments.ConventionBasedEnvironment()); } public static IEnvironment Compose(IEnvironment[] environments) { return new _IEnvironment_75(environments); } private sealed class _IEnvironment_75 : IEnvironment { public _IEnvironment_75(IEnvironment[] environments) { this.environments = environments; } public object Provide(Type service) { for (int eIndex = 0; eIndex < environments.Length; ++eIndex) { IEnvironment e = environments[eIndex]; object binding = e.Provide(service); if (null != binding) { return binding; } } return null; } private readonly IEnvironment[] environments; } private sealed class ConventionBasedEnvironment : IEnvironment { public object Provide(Type service) { return Resolve(service); } /// /// Resolves a service interface to its default implementation using the /// db4o namespace convention: /// interface foo.bar.Baz /// default implementation foo.internal.bar.BazImpl /// /// the convention based type name for the requested service private object Resolve(Type service) { string className = DefaultImplementationFor(service); object binding = ReflectPlatform.CreateInstance(className); if (null == binding) { throw new ArgumentException("Cant find default implementation for " + service.ToString () + ": " + className); } return (object)binding; } } // ignore convention for internal types } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Runtime4.cs0000644000175000017500000000342511700531646027177 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { /// A collection of static methods that should be part of the runtime environment but are not. /// /// A collection of static methods that should be part of the runtime environment but are not. /// /// public class Runtime4 { /// sleeps without checked exceptions public static void Sleep(long millis) { try { Thread.Sleep(millis); } catch (Exception) { } } /// sleeps with implicit exception /// public static void SleepThrowsOnInterrupt(long millis) { try { Thread.Sleep(millis); } catch (Exception e) { throw new RuntimeInterruptedException(e.ToString()); } } /// /// Keeps executing a block of code until it either returns true or millisecondsTimeout /// elapses. /// /// /// Keeps executing a block of code until it either returns true or millisecondsTimeout /// elapses. /// public static bool Retry(long millisecondsTimeout, IClosure4 block) { return Retry(millisecondsTimeout, 1, block); } public static bool Retry(long millisecondsTimeout, int millisecondsBetweenRetries , IClosure4 block) { StopWatch watch = new AutoStopWatch(); do { if ((((bool)block.Run()))) { return true; } Sleep(millisecondsBetweenRetries); } while (watch.Peek() < millisecondsTimeout); return false; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IComparison4.cs0000644000175000017500000000055511700531646030000 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IComparison4 { /// /// Returns negative number if x < y /// Returns zero if x == y /// Returns positive number if x > y /// int Compare(object x, object y); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/TernaryBool.cs0000644000175000017500000000444011700531646027726 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// yes/no/dontknow data type /// [System.Serializable] public sealed class TernaryBool { private const int NoId = -1; private const int YesId = 1; private const int UnspecifiedId = 0; public static readonly Db4objects.Db4o.Foundation.TernaryBool No = new Db4objects.Db4o.Foundation.TernaryBool (NoId); public static readonly Db4objects.Db4o.Foundation.TernaryBool Yes = new Db4objects.Db4o.Foundation.TernaryBool (YesId); public static readonly Db4objects.Db4o.Foundation.TernaryBool Unspecified = new Db4objects.Db4o.Foundation.TernaryBool (UnspecifiedId); private readonly int _value; private TernaryBool(int value) { _value = value; } public bool BooleanValue(bool defaultValue) { switch (_value) { case NoId: { return false; } case YesId: { return true; } default: { return defaultValue; break; } } } public bool IsUnspecified() { return this == Unspecified; } public bool DefiniteYes() { return this == Yes; } public bool DefiniteNo() { return this == No; } public static Db4objects.Db4o.Foundation.TernaryBool ForBoolean(bool value) { return (value ? Yes : No); } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } Db4objects.Db4o.Foundation.TernaryBool tb = (Db4objects.Db4o.Foundation.TernaryBool )obj; return _value == tb._value; } public override int GetHashCode() { return _value; } private object ReadResolve() { switch (_value) { case NoId: { return No; } case YesId: { return Yes; } default: { return Unspecified; break; } } } public override string ToString() { switch (_value) { case NoId: { return "NO"; } case YesId: { return "YES"; } default: { return "UNSPECIFIED"; break; } } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/KeySpec.cs0000644000175000017500000000147611700531646027037 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class KeySpec { public interface IDeferred { object Evaluate(); } private object _defaultValue; public KeySpec(byte defaultValue) { _defaultValue = defaultValue; } public KeySpec(int defaultValue) { _defaultValue = defaultValue; } public KeySpec(bool defaultValue) { _defaultValue = defaultValue; } public KeySpec(object defaultValue) { _defaultValue = defaultValue; } public virtual object DefaultValue() { if (_defaultValue is KeySpec.IDeferred) { return ((KeySpec.IDeferred)_defaultValue).Evaluate(); } return _defaultValue; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SortedCollection4.cs0000644000175000017500000000305711700531646031031 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class SortedCollection4 { private readonly IComparison4 _comparison; private Tree _tree; public SortedCollection4(IComparison4 comparison) { if (null == comparison) { throw new ArgumentNullException(); } _comparison = comparison; _tree = null; } public virtual object SingleElement() { if (1 != Size()) { throw new InvalidOperationException(); } return _tree.Key(); } public virtual void AddAll(IEnumerator iterator) { while (iterator.MoveNext()) { Add(iterator.Current); } } public virtual void Add(object element) { _tree = Tree.Add(_tree, new TreeObject(element, _comparison)); } public virtual void Remove(object element) { _tree = Tree.RemoveLike(_tree, new TreeObject(element, _comparison)); } public virtual object[] ToArray(object[] array) { Tree.Traverse(_tree, new _IVisitor4_43(array)); return array; } private sealed class _IVisitor4_43 : IVisitor4 { public _IVisitor4_43(object[] array) { this.array = array; this.i = 0; } internal int i; public void Visit(object obj) { array[this.i++] = ((TreeObject)obj).Key(); } private readonly object[] array; } public virtual int Size() { return Tree.Size(_tree); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IProcedure4.cs0000644000175000017500000000031611700531646027611 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IProcedure4 { void Apply(object value); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IdentityHashtable4.cs0000644000175000017500000000301211700531646031151 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { public class IdentityHashtable4 : HashtableBase, IMap4 { public IdentityHashtable4() { } public IdentityHashtable4(int size) : base(size) { } public virtual bool Contains(object obj) { return GetEntry(obj) != null; } public virtual object Remove(object obj) { if (null == obj) { throw new ArgumentNullException(); } return RemoveIntEntry(Runtime.IdentityHashCode(obj)); } public virtual bool ContainsKey(object key) { return GetEntry(key) != null; } public virtual object Get(object key) { HashtableIntEntry entry = GetEntry(key); return (entry == null ? null : entry._object); } private HashtableIntEntry GetEntry(object key) { return FindWithSameKey(new IdentityHashtable4.IdentityEntry(key)); } public virtual void Put(object key, object value) { if (null == key) { throw new ArgumentNullException(); } PutEntry(new IdentityHashtable4.IdentityEntry(key, value)); } public class IdentityEntry : HashtableObjectEntry { public IdentityEntry(object obj) : this(obj, null) { } public IdentityEntry(object key, object value) : base(Runtime.IdentityHashCode(key ), key, value) { } public override bool HasKey(object key) { return _objectKey == key; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/CircularLongBuffer4.cs0000644000175000017500000001022011700531646031261 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. /// /// A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. /// public class CircularLongBuffer4 : IEnumerable { private const int Empty = -1; private readonly long[] _buffer; private int _head; private int _tail; public CircularLongBuffer4(int size) { _buffer = new long[size + 1]; } public virtual int Size() { return Index(_tail - _head); } public virtual void AddFirst(long value) { int newHead = CircularIndex(_head - 1); if (newHead == _tail) { throw new InvalidOperationException(); } _head = newHead; _buffer[Index(_head)] = value; } private int CircularIndex(int index) { return index % _buffer.Length; } private int Index(int i) { return i < 0 ? _buffer.Length + i : i; } public virtual long RemoveLast() { AssertNotEmpty(); _tail = CircularIndex(_tail - 1); return Erase(_tail); } private void AssertNotEmpty() { if (IsEmpty()) { throw new InvalidOperationException(); } } public virtual bool IsEmpty() { return Index(_head) == Index(_tail); } public virtual bool IsFull() { return CircularIndex(_head - 1) == _tail; } public virtual long RemoveFirst() { AssertNotEmpty(); long erased = Erase(_head); _head = CircularIndex(_head + 1); return erased; } private long Erase(int index) { int bufferIndex = Index(index); long erasedValue = _buffer[bufferIndex]; _buffer[bufferIndex] = Empty; return erasedValue; } public virtual bool Remove(long value) { int idx = IndexOf(value); if (idx >= 0) { RemoveAt(idx); return true; } return false; } public virtual bool Contains(long value) { return IndexOf(value) >= 0; } private int IndexOf(long value) { int current = Index(_head); int tail = Index(_tail); while (current != tail) { if (value == _buffer[current]) { break; } current = CircularIndex(current + 1); } return (current == tail ? -1 : current); } private void RemoveAt(int index) { if (Index(_tail - 1) == index) { RemoveLast(); return; } if (index == Index(_head)) { RemoveFirst(); return; } int current = index; int tail = Index(_tail); while (current != tail) { int next = CircularIndex(current + 1); _buffer[current] = _buffer[next]; current = next; } _tail = CircularIndex(_tail - 1); } public virtual IEnumerator GetEnumerator() { int tail = Index(_tail); int head = Index(_head); // TODO: detect concurrent modification and throw IllegalStateException return new _IEnumerator_122(this, head, tail); } private sealed class _IEnumerator_122 : IEnumerator { public _IEnumerator_122(CircularLongBuffer4 _enclosing, int head, int tail) { this._enclosing = _enclosing; this.head = head; this.tail = tail; this._index = head; this._current = Iterators.NoElement; } private int _index; private object _current; public object Current { get { if (this._current == Iterators.NoElement) { throw new InvalidOperationException(); } return this._current; } } public bool MoveNext() { if (this._index == tail) { return false; } this._current = this._enclosing._buffer[this._index]; this._index = this._enclosing.CircularIndex(this._index + 1); return true; } public void Reset() { throw new NotImplementedException(); } private readonly CircularLongBuffer4 _enclosing; private readonly int head; private readonly int tail; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IndexedIterator.cs0000644000175000017500000000225311700531646030560 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Foundation { /// /// Basic functionality for implementing iterators for /// fixed length structures whose elements can be efficiently /// accessed by a numeric index. /// /// /// Basic functionality for implementing iterators for /// fixed length structures whose elements can be efficiently /// accessed by a numeric index. /// public abstract class IndexedIterator : IEnumerator { private readonly int _length; private int _next; public IndexedIterator(int length) { _length = length; _next = -1; } public virtual bool MoveNext() { if (_next < LastIndex()) { ++_next; return true; } // force exception on unexpected call to current _next = _length; return false; } public virtual object Current { get { return Get(_next); } } public virtual void Reset() { _next = -1; } protected abstract object Get(int index); private int LastIndex() { return _length - 1; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Algorithms4.cs0000644000175000017500000000725411700531646027671 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class Algorithms4 { private const int QsortLengthThreshold = 7; public static void Sort(ISortable4 sortable) { Sort(sortable, 0, sortable.Size()); } public static void Sort(ISortable4 sortable, int start, int end) { int length = end - start; if (length < QsortLengthThreshold) { InsertionSort(sortable, start, end); return; } Qsort(sortable, start, end); } public static void Qsort(ISortable4 sortable, int start, int end) { int length = end - start; int middle = start + length / 2; if (length > 7) { int bottom = start; int top = end - 1; if (length > 40) { length /= 8; bottom = MiddleValueIndex(sortable, bottom, bottom + length, bottom + (2 * length )); middle = MiddleValueIndex(sortable, middle - length, middle, middle + length); top = MiddleValueIndex(sortable, top - (2 * length), top - length, top); } middle = MiddleValueIndex(sortable, bottom, middle, top); } int a; int b; int c; int d; a = b = start; c = d = end - 1; while (true) { while (b <= c && sortable.Compare(b, middle) <= 0) { if (sortable.Compare(b, middle) == 0) { middle = NewPartionIndex(middle, a, b); Swap(sortable, a++, b); } b++; } while (c >= b && sortable.Compare(c, middle) >= 0) { if (sortable.Compare(c, middle) == 0) { middle = NewPartionIndex(middle, c, d); Swap(sortable, c, d--); } c--; } if (b > c) { break; } middle = NewPartionIndex(middle, b, c); Swap(sortable, b++, c--); } length = Math.Min(a - start, b - a); Swap(sortable, start, b - length, length); length = Math.Min(d - c, end - 1 - d); Swap(sortable, b, end - length, length); length = b - a; if (length > 0) { Sort(sortable, start, start + length); } length = d - c; if (length > 0) { Sort(sortable, end - length, end); } } public static void InsertionSort(ISortable4 sortable, int start, int end) { for (int i = start + 1; i < end; i++) { for (int j = i; j > start && sortable.Compare(j - 1, j) > 0; j--) { Swap(sortable, j - 1, j); } } } private static int NewPartionIndex(int oldPartionIndex, int leftSwapIndex, int rightSwapIndex ) { if (leftSwapIndex == oldPartionIndex) { return rightSwapIndex; } else { if (rightSwapIndex == oldPartionIndex) { return leftSwapIndex; } } return oldPartionIndex; } private static int MiddleValueIndex(ISortable4 sortable, int a, int b, int c) { if (sortable.Compare(a, b) < 0) { if (sortable.Compare(b, c) < 0) { return b; } else { if (sortable.Compare(a, c) < 0) { return c; } else { return a; } } } else { if (sortable.Compare(b, c) > 0) { return b; } else { if (sortable.Compare(a, c) > 0) { return c; } else { return a; } } } } private static void Swap(ISortable4 sortable, int left, int right) { if (left == right) { return; } sortable.Swap(left, right); } private static void Swap(ISortable4 sortable, int from, int to, int length) { while (length-- > 0) { Swap(sortable, from++, to++); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SynchronizedIterator4.cs0000644000175000017500000000134211700531646031741 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Foundation { public class SynchronizedIterator4 : IEnumerator { private readonly IEnumerator _delegate; private readonly object _lock; public SynchronizedIterator4(IEnumerator delegate_, object Lock) { _delegate = delegate_; _lock = Lock; } public virtual object Current { get { lock (_lock) { return _delegate.Current; } } } public virtual bool MoveNext() { lock (_lock) { return _delegate.MoveNext(); } } public virtual void Reset() { lock (_lock) { _delegate.Reset(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ISequence4.cs0000644000175000017500000000103411700531646027427 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Foundation { /// public interface ISequence4 : IEnumerable { bool Add(object element); void AddAll(IEnumerable iterable); bool IsEmpty(); object Get(int index); int Size(); void Clear(); bool Remove(object obj); bool Contains(object obj); bool ContainsAll(IEnumerable iter); object[] ToArray(); object[] ToArray(object[] array); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IArrayFactory.cs0000644000175000017500000000027111700531646030203 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public interface IArrayFactory { object[] NewArray(int size); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/BooleanByRef.cs0000755000175000017500000000066311700531646030003 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// Useful as "out" or "by ref" function parameter. /// Useful as "out" or "by ref" function parameter. public class BooleanByRef { public bool value; public BooleanByRef() : this(false) { } public BooleanByRef(bool value_) { value = value_; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IIntComparator.cs0000644000175000017500000000061311700531646030357 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// /// Non boxing/unboxing version of /// System.Collections.IComparer<T> /// /// for /// faster id comparisons. /// public interface IIntComparator { int Compare(int x, int y); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/List4.cs0000644000175000017500000000232711700531646026467 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Foundation { /// simplest possible linked list /// public sealed class List4 : IUnversioned { /// next element in list public Db4objects.Db4o.Foundation.List4 _next; /// carried object public object _element; /// db4o constructor to be able to store objects of this class public List4() { } public List4(object element) { // TODO: encapsulate field access _element = element; } public List4(Db4objects.Db4o.Foundation.List4 next, object element) { _next = next; _element = element; } internal bool Holds(object obj) { if (obj == null) { return _element == null; } return ((object)obj).Equals(_element); } public static int Size(Db4objects.Db4o.Foundation.List4 list) { int counter = 0; Db4objects.Db4o.Foundation.List4 nextList = list; while (nextList != null) { counter++; nextList = ((Db4objects.Db4o.Foundation.List4)nextList._next); } return counter; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/BitMap4.cs0000644000175000017500000000330611700531646026726 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Sharpen; namespace Db4objects.Db4o.Foundation { /// public sealed class BitMap4 { private readonly byte[] _bits; public BitMap4(int numBits) { _bits = new byte[ByteCount(numBits)]; } /// "readFrom buffer" constructor public BitMap4(byte[] buffer, int pos, int numBits) : this(numBits) { System.Array.Copy(buffer, pos, _bits, 0, _bits.Length); } public BitMap4(byte singleByte) { _bits = new byte[] { singleByte }; } public bool IsTrue(int bit) { return (((_bits[ArrayOffset(bit)]) >> (ByteOffset(bit) & 0x1f)) & 1) != 0; } public bool IsFalse(int bit) { return !IsTrue(bit); } public int MarshalledLength() { return _bits.Length; } public void SetFalse(int bit) { _bits[ArrayOffset(bit)] &= (byte)~BitMask(bit); } public void Set(int bit, bool val) { if (val) { SetTrue(bit); } else { SetFalse(bit); } } public void SetTrue(int bit) { _bits[ArrayOffset(bit)] |= BitMask(bit); } public void WriteTo(byte[] bytes, int pos) { System.Array.Copy(_bits, 0, bytes, pos, _bits.Length); } private byte ByteOffset(int bit) { return (byte)(bit % 8); } private int ArrayOffset(int bit) { return bit / 8; } private byte BitMask(int bit) { return (byte)(1 << ByteOffset(bit)); } private int ByteCount(int numBits) { return (numBits + 7) / 8; } public byte GetByte(int index) { return _bits[index]; } public byte[] Bytes() { return _bits; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SimpleTimer.cs0000644000175000017500000000261511700531646027722 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { /// public sealed class SimpleTimer : IRunnable { private readonly IRunnable _runnable; private readonly long _interval; private Lock4 _lock; public volatile bool stopped = false; public SimpleTimer(IRunnable runnable, long interval) { _runnable = runnable; _interval = interval; _lock = new Lock4(); } public void Stop() { stopped = true; _lock.Run(new _IClosure4_27(this)); } private sealed class _IClosure4_27 : IClosure4 { public _IClosure4_27(SimpleTimer _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing._lock.Awake(); return null; } private readonly SimpleTimer _enclosing; } public void Run() { while (!stopped) { _lock.Run(new _IClosure4_37(this)); if (!stopped) { _runnable.Run(); } } } private sealed class _IClosure4_37 : IClosure4 { public _IClosure4_37(SimpleTimer _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing._lock.Snooze(this._enclosing._interval); return null; } private readonly SimpleTimer _enclosing; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Iterators.cs0000644000175000017500000003346111700531646027447 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Text; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// Iterator primitives (concat, map, reduce, filter, etc...). /// Iterator primitives (concat, map, reduce, filter, etc...). /// public partial class Iterators { /// /// Constant indicating that the current element in a /// Map(IEnumerator, IFunction4) /// operation /// should be skipped. /// public static readonly object Skip = new object(); private sealed class _IEnumerator_20 : IEnumerator { public _IEnumerator_20() { } public object Current { get { throw new InvalidOperationException(); } } public bool MoveNext() { return false; } public void Reset() { } } public static readonly IEnumerator EmptyIterator = new _IEnumerator_20(); private sealed class _IEnumerable_34 : IEnumerable { public _IEnumerable_34() { } // do nothing public IEnumerator GetEnumerator() { return Iterators.EmptyIterator; } } public static readonly IEnumerable EmptyIterable = new _IEnumerable_34(); internal static readonly object NoElement = new object(); /// /// Generates /// Tuple /// items with indexes starting at 0. /// /// the iterable to be enumerated public static IEnumerable Enumerate(IEnumerable iterable) { return new _IEnumerable_48(iterable); } private sealed class _IEnumerable_48 : IEnumerable { public _IEnumerable_48(IEnumerable iterable) { this.iterable = iterable; } public IEnumerator GetEnumerator() { return new EnumerateIterator(iterable.GetEnumerator()); } private readonly IEnumerable iterable; } public static bool Any(IEnumerator iterator, IPredicate4 condition) { while (iterator.MoveNext()) { if (condition.Match(iterator.Current)) { return true; } } return false; } public static IEnumerator Concat(IEnumerator[] array) { return Concat(Iterate((object[])array)); } public static IEnumerator Concat(IEnumerator iterators) { return new CompositeIterator4(iterators); } public static IEnumerable Concat(IEnumerable[] iterables) { return Concat(Iterable(iterables)); } public static IEnumerable Concat(IEnumerable iterables) { return new CompositeIterable4(iterables); } public static IEnumerator Concat(IEnumerator first, IEnumerator second) { return Concat(new IEnumerator[] { first, second }); } public static IEnumerable ConcatMap(IEnumerable iterable, IFunction4 function) { return Concat(Map(iterable, function)); } /// /// Returns a new iterator which yields the result of applying the function /// to every element in the original iterator. /// /// /// Returns a new iterator which yields the result of applying the function /// to every element in the original iterator. /// Skip /// can be returned from function to indicate the current /// element should be skipped. /// /// /// /// public static IEnumerator Map(IEnumerator iterator, IFunction4 function) { return new FunctionApplicationIterator(iterator, function); } public static IEnumerator Map(object[] array, IFunction4 function) { return Map(new ArrayIterator4(array), function); } public static IEnumerator Filter(object[] array, IPredicate4 predicate) { return Filter(new ArrayIterator4(array), predicate); } public static IEnumerable Filter(IEnumerable source, IPredicate4 predicate) { return new _IEnumerable_112(source, predicate); } private sealed class _IEnumerable_112 : IEnumerable { public _IEnumerable_112(IEnumerable source, IPredicate4 predicate) { this.source = source; this.predicate = predicate; } public IEnumerator GetEnumerator() { return Iterators.Filter(source.GetEnumerator(), predicate); } private readonly IEnumerable source; private readonly IPredicate4 predicate; } public static IEnumerator Filter(IEnumerator iterator, IPredicate4 predicate) { return new FilteredIterator(iterator, predicate); } public static IEnumerable SingletonIterable(object element) { return new _IEnumerable_124(element); } private sealed class _IEnumerable_124 : IEnumerable { public _IEnumerable_124(object element) { this.element = element; } public IEnumerator GetEnumerator() { return Iterators.SingletonIterator(element); } private readonly object element; } public static IEnumerable Append(IEnumerable front, object last) { return Concat(Iterable(new object[] { front, SingletonIterable(last) })); } public static IEnumerator Iterator(IEnumerable iterable) { return iterable.GetEnumerator(); } public static IEnumerator Iterate(object[] array) { return new ArrayIterator4(array); } public static IEnumerator Revert(IEnumerator iterator) { iterator.Reset(); List4 tail = null; while (iterator.MoveNext()) { tail = new List4(tail, iterator.Current); } return Iterate(tail); } public static IEnumerator Iterate(List4 list) { if (list == null) { return EmptyIterator; } Collection4 collection = new Collection4(); while (list != null) { collection.Add(list._element); list = ((List4)list._next); } return collection.GetEnumerator(); } public static int Size(IEnumerable iterable) { return Size(iterable.GetEnumerator()); } public static object Next(IEnumerator iterator) { if (!iterator.MoveNext()) { throw new InvalidOperationException(); } return iterator.Current; } public static int Size(IEnumerator iterator) { int count = 0; while (iterator.MoveNext()) { ++count; } return count; } public static string ToString(IEnumerable i) { return ToString(i.GetEnumerator()); } public static string ToString(IEnumerator i) { return Join(i, "[", "]", ", "); } public static string Join(IEnumerable i, string separator) { return Join(i.GetEnumerator(), separator); } public static string Join(IEnumerator i, string separator) { return Join(i, string.Empty, string.Empty, separator); } public static string Join(IEnumerator i, string prefix, string suffix, string separator ) { StringBuilder sb = new StringBuilder(); sb.Append(prefix); if (i.MoveNext()) { sb.Append(i.Current); while (i.MoveNext()) { sb.Append(separator); sb.Append(i.Current); } } sb.Append(suffix); return sb.ToString(); } public static object[] ToArray(IEnumerator tests) { return ToArray(tests, new _IArrayFactory_230()); } private sealed class _IArrayFactory_230 : IArrayFactory { public _IArrayFactory_230() { } public object[] NewArray(int size) { return new object[size]; } } public static object[] ToArray(IEnumerator tests, IArrayFactory factory) { Collection4 elements = new Collection4(tests); return elements.ToArray(factory.NewArray(elements.Size())); } /// Yields a flat sequence of elements. /// /// Yields a flat sequence of elements. Any /// IEnumerable /// or /// IEnumerator /// found in the original sequence is recursively flattened. /// /// original sequence public static IEnumerator Flatten(IEnumerator iterator) { return new FlatteningIterator(iterator); } public static IEnumerable Map(IEnumerable iterable, IFunction4 function) { return new _IEnumerable_253(iterable, function); } private sealed class _IEnumerable_253 : IEnumerable { public _IEnumerable_253(IEnumerable iterable, IFunction4 function) { this.iterable = iterable; this.function = function; } public IEnumerator GetEnumerator() { return Iterators.Map(iterable.GetEnumerator(), function); } private readonly IEnumerable iterable; private readonly IFunction4 function; } public static IEnumerable CrossProduct(IEnumerable iterables) { return CrossProduct((IEnumerable[])ToArray(iterables.GetEnumerator(), new _IArrayFactory_261 ())); } private sealed class _IArrayFactory_261 : IArrayFactory { public _IArrayFactory_261() { } public object[] NewArray(int size) { return new IEnumerable[size]; } } public static IEnumerable CrossProduct(IEnumerable[] iterables) { return CrossProduct(iterables, 0, Iterators.EmptyIterable); } private static IEnumerable CrossProduct(IEnumerable[] iterables, int level, IEnumerable row) { if (level == iterables.Length - 1) { return Map(iterables[level], new _IFunction4_276(row)); } return ConcatMap(iterables[level], new _IFunction4_284(iterables, level, row)); } private sealed class _IFunction4_276 : IFunction4 { public _IFunction4_276(IEnumerable row) { this.row = row; } public object Apply(object arg) { return Iterators.Append(row, arg); } private readonly IEnumerable row; } private sealed class _IFunction4_284 : IFunction4 { public _IFunction4_284(IEnumerable[] iterables, int level, IEnumerable row) { this.iterables = iterables; this.level = level; this.row = row; } public object Apply(object arg) { return Iterators.CrossProduct(iterables, level + 1, Iterators.Append(row, arg)); } private readonly IEnumerable[] iterables; private readonly int level; private readonly IEnumerable row; } public static IEnumerable Iterable(object[] objects) { return new _IEnumerable_292(objects); } private sealed class _IEnumerable_292 : IEnumerable { public _IEnumerable_292(object[] objects) { this.objects = objects; } public IEnumerator GetEnumerator() { return Iterators.Iterate(objects); } private readonly object[] objects; } public static IEnumerator SingletonIterator(object element) { return new SingleValueIterator(element); } public static IEnumerable Iterable(IEnumerator iterator) { return new _IEnumerable_304(iterator); } private sealed class _IEnumerable_304 : IEnumerable { public _IEnumerable_304(IEnumerator iterator) { this.iterator = iterator; } public IEnumerator GetEnumerator() { return iterator; } private readonly IEnumerator iterator; } public static IEnumerator Copy(IEnumerator iterator) { return new Collection4(iterator).GetEnumerator(); } public static IEnumerator Take(int count, IEnumerator iterator) { return new _IEnumerator_316(count, iterator); } private sealed class _IEnumerator_316 : IEnumerator { public _IEnumerator_316(int count, IEnumerator iterator) { this.count = count; this.iterator = iterator; this._taken = 0; } private int _taken; public object Current { get { if (this._taken > count) { throw new InvalidOperationException(); } return iterator.Current; } } public bool MoveNext() { if (this._taken < count) { if (!iterator.MoveNext()) { this._taken = count; return false; } ++this._taken; return true; } return false; } public void Reset() { throw new NotImplementedException(); } private readonly int count; private readonly IEnumerator iterator; } public static IEnumerator Range(int fromInclusive, int toExclusive) { if (toExclusive < fromInclusive) { throw new ArgumentException(); } return Take(toExclusive - fromInclusive, Series(fromInclusive - 1, new _IFunction4_350 ()).GetEnumerator()); } private sealed class _IFunction4_350 : IFunction4 { public _IFunction4_350() { } public object Apply(object i) { return (((int)i)) + 1; } } public static IEnumerable Series(object seed, IFunction4 function) { return new _IEnumerable_356(seed, function); } private sealed class _IEnumerable_356 : IEnumerable { public _IEnumerable_356(object seed, IFunction4 function) { this.seed = seed; this.function = function; } public IEnumerator GetEnumerator() { return new _IEnumerator_358(seed, function); } private sealed class _IEnumerator_358 : IEnumerator { public _IEnumerator_358(object seed, IFunction4 function) { this.seed = seed; this.function = function; this._current = seed; } private object _current; public object Current { get { return this._current; } } public bool MoveNext() { this._current = function.Apply(this._current); return true; } public void Reset() { this._current = seed; } private readonly object seed; private readonly IFunction4 function; } private readonly object seed; private readonly IFunction4 function; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableBase.cs0000644000175000017500000001422111700531646030152 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class HashtableBase { private const float Fill = 0.5F; public int _tableSize; public int _mask; public int _maximumSize; public int _size; public HashtableIntEntry[] _table; public HashtableBase(int size) { // FIELDS ARE PUBLIC SO THEY CAN BE REFLECTED ON IN JDKs <= 1.1 size = NewSize(size); // legacy for .NET conversion _tableSize = 1; while (_tableSize < size) { _tableSize = _tableSize << 1; } _mask = _tableSize - 1; _maximumSize = (int)(_tableSize * Fill); _table = new HashtableIntEntry[_tableSize]; } public HashtableBase() : this(1) { } /// protected HashtableBase(IDeepClone cloneOnlyCtor) { } public virtual void Clear() { _size = 0; Arrays4.Fill(_table, null); } private int NewSize(int size) { return (int)(size / Fill); } public virtual int Size() { return _size; } protected virtual HashtableIntEntry FindWithSameKey(HashtableIntEntry newEntry) { HashtableIntEntry existing = _table[EntryIndex(newEntry)]; while (null != existing) { if (existing.SameKeyAs(newEntry)) { return existing; } existing = existing._next; } return null; } protected virtual int EntryIndex(HashtableIntEntry entry) { return entry._key & _mask; } protected virtual void PutEntry(HashtableIntEntry newEntry) { HashtableIntEntry existing = FindWithSameKey(newEntry); if (null != existing) { Replace(existing, newEntry); } else { Insert(newEntry); } } private void Insert(HashtableIntEntry newEntry) { _size++; if (_size > _maximumSize) { IncreaseSize(); } int index = EntryIndex(newEntry); newEntry._next = _table[index]; _table[index] = newEntry; } private void Replace(HashtableIntEntry existing, HashtableIntEntry newEntry) { newEntry._next = existing._next; HashtableIntEntry entry = _table[EntryIndex(existing)]; if (entry == existing) { _table[EntryIndex(existing)] = newEntry; } else { while (entry._next != existing) { entry = entry._next; } entry._next = newEntry; } } private void IncreaseSize() { _tableSize = _tableSize << 1; _maximumSize = _maximumSize << 1; _mask = _tableSize - 1; HashtableIntEntry[] temp = _table; _table = new HashtableIntEntry[_tableSize]; for (int i = 0; i < temp.Length; i++) { Reposition(temp[i]); } } protected virtual Db4objects.Db4o.Foundation.HashtableIterator HashtableIterator( ) { return new Db4objects.Db4o.Foundation.HashtableIterator(_table); } private void Reposition(HashtableIntEntry entry) { HashtableIntEntry currentEntry = entry; HashtableIntEntry nextEntry = null; while (currentEntry != null) { nextEntry = currentEntry._next; currentEntry._next = _table[EntryIndex(currentEntry)]; _table[EntryIndex(currentEntry)] = currentEntry; currentEntry = nextEntry; } } public virtual IEnumerator Keys() { return Iterators.Map(HashtableIterator(), new _IFunction4_133()); } private sealed class _IFunction4_133 : IFunction4 { public _IFunction4_133() { } public object Apply(object current) { return ((IEntry4)current).Key(); } } public virtual IEnumerable Values() { return new _IEnumerable_141(this); } private sealed class _IEnumerable_141 : IEnumerable { public _IEnumerable_141(HashtableBase _enclosing) { this._enclosing = _enclosing; } public IEnumerator GetEnumerator() { return this._enclosing.ValuesIterator(); } private readonly HashtableBase _enclosing; } /// Iterates through all the values. /// Iterates through all the values. /// value iterator public virtual IEnumerator ValuesIterator() { return Iterators.Map(HashtableIterator(), new _IFunction4_154()); } private sealed class _IFunction4_154 : IFunction4 { public _IFunction4_154() { } public object Apply(object current) { return ((IEntry4)current).Value(); } } public override string ToString() { return Iterators.Join(HashtableIterator(), "{", "}", ", "); } protected virtual void RemoveEntry(HashtableIntEntry predecessor, HashtableIntEntry entry) { if (predecessor != null) { predecessor._next = entry._next; } else { _table[EntryIndex(entry)] = entry._next; } _size--; } protected virtual object RemoveObjectEntry(int intKey, object objectKey) { HashtableObjectEntry entry = (HashtableObjectEntry)_table[intKey & _mask]; HashtableObjectEntry predecessor = null; while (entry != null) { if (entry._key == intKey && entry.HasKey(objectKey)) { RemoveEntry(predecessor, entry); return entry._object; } predecessor = entry; entry = (HashtableObjectEntry)entry._next; } return null; } protected virtual object RemoveLongEntry(int intKey, long longKey) { HashtableLongEntry entry = (HashtableLongEntry)_table[intKey & _mask]; HashtableLongEntry predecessor = null; while (entry != null) { if (entry._key == intKey && entry._longKey == longKey) { RemoveEntry(predecessor, entry); return entry._object; } predecessor = entry; entry = (HashtableLongEntry)entry._next; } return null; } protected virtual object RemoveIntEntry(int key) { HashtableIntEntry entry = _table[key & _mask]; HashtableIntEntry predecessor = null; while (entry != null) { if (entry._key == key) { RemoveEntry(predecessor, entry); return entry._object; } predecessor = entry; entry = entry._next; } return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/RuntimeInterruptedException.cs0000644000175000017500000000044011700531646033212 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Foundation { [System.Serializable] public class RuntimeInterruptedException : Exception { public RuntimeInterruptedException(string msg) : base(msg) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Collection4.cs0000644000175000017500000002220211700531646027641 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Foundation { /// Fast linked list for all usecases. /// Fast linked list for all usecases. /// public class Collection4 : ISequence4, IEnumerable, IDeepClone, IUnversioned { private List4 _first; private List4 _last; private int _size; private int _version; public Collection4() { } public Collection4(object[] elements) { AddAll(elements); } public Collection4(IEnumerable other) { AddAll(other); } public Collection4(IEnumerator iterator) { AddAll(iterator); } public virtual object SingleElement() { if (Size() != 1) { throw new InvalidOperationException(); } return ((object)_first._element); } /// Adds an element to the end of this collection. /// Adds an element to the end of this collection. /// public bool Add(object element) { DoAdd(element); Changed(); return true; } public void Prepend(object element) { DoPrepend(element); Changed(); } private void DoPrepend(object element) { if (_first == null) { DoAdd(element); } else { _first = new List4(_first, element); _size++; } } private void DoAdd(object element) { if (_last == null) { _first = new List4(element); _last = _first; } else { _last._next = new List4(element); _last = ((List4)_last._next); } _size++; } public void AddAll(object[] elements) { AssertNotNull(elements); for (int i = 0; i < elements.Length; i++) { Add(elements[i]); } } public void AddAll(IEnumerable other) { AssertNotNull(other); AddAll(other.GetEnumerator()); } public void AddAll(IEnumerator iterator) { AssertNotNull(iterator); while (iterator.MoveNext()) { Add(iterator.Current); } } public void Clear() { _first = null; _last = null; _size = 0; Changed(); } public bool Contains(object element) { return Find(element) != null; } public virtual bool ContainsAll(IEnumerable iter) { return ContainsAll(iter.GetEnumerator()); } public virtual bool ContainsAll(IEnumerator iter) { AssertNotNull(iter); while (iter.MoveNext()) { if (!Contains(iter.Current)) { return false; } } return true; } /// tests if the object is in the Collection. /// tests if the object is in the Collection. == comparison. public bool ContainsByIdentity(object element) { IEnumerator i = InternalIterator(); while (i.MoveNext()) { object current = i.Current; if (current == element) { return true; } } return false; } private List4 Find(object obj) { List4 current = _first; while (current != null) { if (current.Holds(obj)) { return current; } current = ((List4)current._next); } return null; } private List4 FindByIdentity(object obj) { List4 current = _first; while (current != null) { if (((object)current._element) == obj) { return current; } current = ((List4)current._next); } return null; } /// /// returns the first object found in the Collections that equals() the /// passed object /// public object Get(object element) { List4 holder = Find(element); return holder == null ? null : ((object)holder._element); } public virtual object DeepClone(object newParent) { Db4objects.Db4o.Foundation.Collection4 col = new Db4objects.Db4o.Foundation.Collection4 (); object element = null; IEnumerator i = InternalIterator(); while (i.MoveNext()) { element = i.Current; if (element is IDeepClone) { col.Add(((IDeepClone)element).DeepClone(newParent)); } else { col.Add(element); } } return col; } /// makes sure the passed object is in the Collection. /// makes sure the passed object is in the Collection. equals() comparison. public object Ensure(object element) { List4 list = Find(element); if (list == null) { Add(element); return element; } return ((object)list._element); } /// /// Iterates through the collection in reversed insertion order which happens /// to be the fastest. /// /// /// Iterates through the collection in reversed insertion order which happens /// to be the fastest. /// /// public IEnumerator GetEnumerator() { return _first == null ? Iterators.EmptyIterator : new Collection4Iterator(this, _first ); } public virtual object Get(int index) { if (index < 0) { throw new ArgumentException(); } List4 cur = _first; while (index > 0 && cur != null) { cur = ((List4)cur._next); index--; } if (cur == null) { throw new ArgumentException(); } return ((object)cur._element); } /// /// Removes all the elements from this collection that are returned by /// iterable. /// /// /// Removes all the elements from this collection that are returned by /// iterable. /// /// public virtual void RemoveAll(IEnumerable iterable) { RemoveAll(iterable.GetEnumerator()); } /// /// Removes all the elements from this collection that are returned by /// iterator. /// /// /// Removes all the elements from this collection that are returned by /// iterator. /// public virtual void RemoveAll(IEnumerator iterator) { while (iterator.MoveNext()) { Remove(iterator.Current); } } /// /// removes an object from the Collection equals() comparison returns the /// removed object or null, if none found /// public virtual bool Remove(object a_object) { List4 previous = null; List4 current = _first; while (current != null) { if (current.Holds(a_object)) { _size--; AdjustOnRemoval(previous, current); Changed(); return true; } previous = current; current = ((List4)current._next); } return false; } public virtual void Replace(object oldObject, object newObject) { List4 list = Find(oldObject); if (list != null) { list._element = newObject; } } public virtual void ReplaceByIdentity(object oldObject, object newObject) { List4 list = FindByIdentity(oldObject); if (list != null) { list._element = newObject; } } private void AdjustOnRemoval(List4 previous, List4 removed) { if (removed == _first) { _first = ((List4)removed._next); } else { previous._next = ((List4)removed._next); } if (removed == _last) { _last = previous; } } public int Size() { return _size; } public virtual int IndexOf(object obj) { int index = 0; List4 current = _first; while (current != null) { if (current.Holds(obj)) { return index; } index++; current = ((List4)current._next); } return -1; } public bool IsEmpty() { return _size == 0; } /// This is a non reflection implementation for more speed. /// /// This is a non reflection implementation for more speed. In contrast to /// the JDK behaviour, the passed array has to be initialized to the right /// length. /// public object[] ToArray(object[] array) { int j = 0; IEnumerator i = InternalIterator(); while (i.MoveNext()) { array[j++] = i.Current; } return array; } public object[] ToArray() { int j = 0; object[] array = new object[Size()]; IEnumerator i = InternalIterator(); while (i.MoveNext()) { array[j++] = i.Current; } return array; } public override string ToString() { return Iterators.ToString(InternalIterator()); } private void Changed() { ++_version; } internal virtual int Version() { return _version; } private void AssertNotNull(object element) { if (element == null) { throw new ArgumentNullException(); } } /// /// Leaner iterator for faster iteration (but unprotected against /// concurrent modifications). /// /// /// Leaner iterator for faster iteration (but unprotected against /// concurrent modifications). /// private IEnumerator InternalIterator() { return new Iterator4Impl(_first); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/CircularBuffer4.cs0000644000175000017500000001021311700531646030443 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. /// /// A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. /// public class CircularBuffer4 : IEnumerable { private readonly object[] _buffer; private int _head; private int _tail; public CircularBuffer4(int size) { _buffer = (object[])new object[size + 1]; } public virtual int Size() { return Index(_tail - _head); } public virtual void AddFirst(object value) { int newHead = CircularIndex(_head - 1); if (newHead == _tail) { throw new InvalidOperationException(); } _head = newHead; _buffer[Index(_head)] = value; } private int CircularIndex(int index) { return index % _buffer.Length; } private int Index(int i) { return i < 0 ? _buffer.Length + i : i; } public virtual object RemoveLast() { AssertNotEmpty(); _tail = CircularIndex(_tail - 1); return Erase(_tail); } private void AssertNotEmpty() { if (IsEmpty()) { throw new InvalidOperationException(); } } public virtual bool IsEmpty() { return Index(_head) == Index(_tail); } public virtual bool IsFull() { return CircularIndex(_head - 1) == _tail; } public virtual object RemoveFirst() { AssertNotEmpty(); object erased = Erase(_head); _head = CircularIndex(_head + 1); return erased; } private object Erase(int index) { int bufferIndex = Index(index); object erasedValue = _buffer[bufferIndex]; _buffer[bufferIndex] = null; return erasedValue; } public virtual bool Remove(object value) { int idx = IndexOf(value); if (idx >= 0) { RemoveAt(idx); return true; } return false; } public virtual bool Contains(object value) { return IndexOf(value) >= 0; } private int IndexOf(object value) { int current = Index(_head); int tail = Index(_tail); while (current != tail) { if (((object)value).Equals(_buffer[current])) { break; } current = CircularIndex(current + 1); } return (current == tail ? -1 : current); } private void RemoveAt(int index) { if (Index(_tail - 1) == index) { RemoveLast(); return; } if (index == Index(_head)) { RemoveFirst(); return; } int current = index; int tail = Index(_tail); while (current != tail) { int next = CircularIndex(current + 1); _buffer[current] = _buffer[next]; current = next; } _tail = CircularIndex(_tail - 1); } public virtual IEnumerator GetEnumerator() { int tail = Index(_tail); int head = Index(_head); // TODO: detect concurrent modification and throw IllegalStateException return new _IEnumerator_121(this, head, tail); } private sealed class _IEnumerator_121 : IEnumerator { public _IEnumerator_121(CircularBuffer4 _enclosing, int head, int tail) { this._enclosing = _enclosing; this.head = head; this.tail = tail; this._index = head; this._current = Iterators.NoElement; } private int _index; private object _current; public object Current { get { if (this._current == Iterators.NoElement) { throw new InvalidOperationException(); } return this._current; } } public bool MoveNext() { if (this._index == tail) { return false; } this._current = this._enclosing._buffer[this._index]; this._index = this._enclosing.CircularIndex(this._index + 1); return true; } public void Reset() { throw new NotImplementedException(); } private readonly CircularBuffer4 _enclosing; private readonly int head; private readonly int tail; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ITimeoutBlockingQueue4.cs0000644000175000017500000000040511700531646031764 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public interface ITimeoutBlockingQueue4 : IPausableBlockingQueue4 { void Check(); void Reset(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/NativeCollections.cs0000644000175000017500000000104711700531646031113 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class NativeCollections { public static IList Filter(IList items, IPredicate4 predicate) { IList filtered = new ArrayList(); for (IEnumerator itemIter = items.GetEnumerator(); itemIter.MoveNext(); ) { object item = itemIter.Current; if (predicate.Match(item)) { filtered.Add(item); } } return filtered; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableByteArrayEntry.cs0000644000175000017500000000217111700531646032225 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { internal class HashtableByteArrayEntry : HashtableObjectEntry { public HashtableByteArrayEntry(byte[] bytes, object value) : base(Hash(bytes), bytes , value) { } public HashtableByteArrayEntry() : base() { } public override object DeepClone(object obj) { return DeepCloneInternal(new Db4objects.Db4o.Foundation.HashtableByteArrayEntry() , obj); } public override bool HasKey(object key) { if (key is byte[]) { return AreEqual((byte[])Key(), (byte[])key); } return false; } internal static int Hash(byte[] bytes) { int ret = 0; for (int i = 0; i < bytes.Length; i++) { ret = ret * 31 + bytes[i]; } return ret; } internal static bool AreEqual(byte[] lhs, byte[] rhs) { if (rhs.Length != lhs.Length) { return false; } for (int i = 0; i < rhs.Length; i++) { if (rhs[i] != lhs[i]) { return false; } } return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IEnvironment.cs0000644000175000017500000000031211700531646030075 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Foundation { public interface IEnvironment { object Provide(Type service); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IEntry4.cs0000644000175000017500000000032311700531646026760 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// public interface IEntry4 { object Key(); object Value(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/EnumerateIterator.cs0000644000175000017500000000145611700531646031131 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class EnumerateIterator : MappingIterator { public sealed class Tuple { public readonly int index; public readonly object value; public Tuple(int index_, object value_) { index = index_; value = value_; } } private int _index; public EnumerateIterator(IEnumerator iterator) : base(iterator) { _index = 0; } public override bool MoveNext() { if (base.MoveNext()) { ++_index; return true; } return false; } protected override object Map(object current) { return new EnumerateIterator.Tuple(_index, current); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/InvalidIteratorException.cs0000644000175000017500000000037711700531646032452 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Foundation { /// [System.Serializable] public class InvalidIteratorException : InvalidOperationException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Collections4.cs0000644000175000017500000000321311700531646030025 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class Collections4 { public static ISequence4 UnmodifiableList(ISequence4 orig) { return new Collections4.UnmodifiableSequence4(orig); } private class UnmodifiableSequence4 : ISequence4 { private ISequence4 _sequence; public UnmodifiableSequence4(ISequence4 sequence) { _sequence = sequence; } public virtual bool Add(object element) { throw new NotSupportedException(); } public virtual void AddAll(IEnumerable iterable) { throw new NotSupportedException(); } public virtual bool IsEmpty() { return _sequence.IsEmpty(); } public virtual IEnumerator GetEnumerator() { return _sequence.GetEnumerator(); } public virtual object Get(int index) { return _sequence.Get(index); } public virtual int Size() { return _sequence.Size(); } public virtual void Clear() { throw new NotSupportedException(); } public virtual bool Remove(object obj) { throw new NotSupportedException(); } public virtual bool Contains(object obj) { return _sequence.Contains(obj); } public virtual bool ContainsAll(IEnumerable iter) { return _sequence.ContainsAll(iter); } public virtual object[] ToArray() { return _sequence.ToArray(); } public virtual object[] ToArray(object[] array) { return _sequence.ToArray(array); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IdentitySet4.cs0000644000175000017500000000167011700531646030021 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4objects.Db4o.Foundation { /// public class IdentitySet4 : HashtableBase, IEnumerable { public IdentitySet4() { } public IdentitySet4(int size) : base(size) { } public virtual bool Contains(object obj) { return FindWithSameKey(new HashtableIdentityEntry(obj)) != null; } public virtual void Add(object obj) { if (null == obj) { throw new ArgumentNullException(); } PutEntry(new HashtableIdentityEntry(obj)); } public virtual void Remove(object obj) { if (null == obj) { throw new ArgumentNullException(); } RemoveIntEntry(Runtime.IdentityHashCode(obj)); } public virtual IEnumerator GetEnumerator() { return ValuesIterator(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ByRef.cs0000644000175000017500000000111711700531646026473 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// Useful as "out" or "by reference" function parameter. /// Useful as "out" or "by reference" function parameter. public class ByRef { public static ByRef NewInstance(object initialValue) { ByRef instance = new ByRef(); instance.value = initialValue; return instance; } public static ByRef NewInstance() { return new ByRef(); } public object value; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/TreeObject.cs0000644000175000017500000000111411700531646027507 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class TreeObject : Tree { private readonly object _object; private readonly IComparison4 _function; public TreeObject(object @object, IComparison4 function) { _object = @object; _function = function; } public override int Compare(Tree tree) { return _function.Compare(_object, tree.Key()); } public override object Key() { return _object; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/FunctionApplicationIterator.cs0000644000175000017500000000120511700531646033145 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class FunctionApplicationIterator : MappingIterator { private readonly IFunction4 _function; public FunctionApplicationIterator(IEnumerator iterator, IFunction4 function) : base (iterator) { if (null == function) { throw new ArgumentNullException(); } _function = function; } protected override object Map(object current) { return _function.Apply(current); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IntArrayByRef.cs0000644000175000017500000000044411700531646030147 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public class IntArrayByRef { public int[] value; public IntArrayByRef(int[] initialValue) { value = initialValue; } public IntArrayByRef() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/HashtableObjectEntry.cs0000644000175000017500000000304011700531646031525 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class HashtableObjectEntry : HashtableIntEntry { public object _objectKey; internal HashtableObjectEntry(int a_hash, object a_key, object a_object) : base(a_hash , a_object) { // FIELDS ARE PUBLIC SO THEY CAN BE REFLECTED ON IN JDKs <= 1.1 _objectKey = a_key; } internal HashtableObjectEntry(object a_key, object a_object) : base(a_key.GetHashCode (), a_object) { _objectKey = a_key; } public HashtableObjectEntry() : base() { } public override object Key() { return _objectKey; } public override object DeepClone(object obj) { return DeepCloneInternal(new Db4objects.Db4o.Foundation.HashtableObjectEntry(), obj ); } protected override HashtableIntEntry DeepCloneInternal(HashtableIntEntry entry, object obj) { ((Db4objects.Db4o.Foundation.HashtableObjectEntry)entry)._objectKey = _objectKey; return base.DeepCloneInternal(entry, obj); } public virtual bool HasKey(object key) { return _objectKey.Equals(key); } public override bool SameKeyAs(HashtableIntEntry other) { return other is Db4objects.Db4o.Foundation.HashtableObjectEntry ? HasKey(((Db4objects.Db4o.Foundation.HashtableObjectEntry )other)._objectKey) : false; } public override string ToString() { return string.Empty + _objectKey + ": " + _object; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IFixedSizeIntIterator4.cs0000644000175000017500000000034611700531646031743 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public interface IFixedSizeIntIterator4 : IIntIterator4 { int Size(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/Collection4Iterator.cs0000644000175000017500000000167711700531646031370 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public class Collection4Iterator : Iterator4Impl { private readonly Collection4 _collection; private readonly int _initialVersion; public Collection4Iterator(Collection4 collection, List4 first) : base(first) { _collection = collection; _initialVersion = CurrentVersion(); } public override bool MoveNext() { Validate(); return base.MoveNext(); } public override object Current { get { Validate(); return base.Current; } } private void Validate() { if (_initialVersion != CurrentVersion()) { // FIXME: change to ConcurrentModificationException throw new InvalidIteratorException(); } } private int CurrentVersion() { return _collection.Version(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/SimpleObjectPool.cs0000644000175000017500000000157211700531646030703 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class SimpleObjectPool : IObjectPool { private readonly object[] _objects; private int _available; public SimpleObjectPool(object[] objects) { int length = objects.Length; _objects = new object[length]; for (int i = 0; i < length; ++i) { _objects[length - i - 1] = objects[i]; } _available = length; } public virtual object BorrowObject() { if (_available == 0) { throw new InvalidOperationException(); } return (object)_objects[--_available]; } public virtual void ReturnObject(object o) { if (_available == _objects.Length) { throw new InvalidOperationException(); } _objects[_available++] = o; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/MappingIterator.cs0000644000175000017500000000221011700531646030564 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public abstract class MappingIterator : IEnumerator { private readonly IEnumerator _iterator; private object _current; public MappingIterator(IEnumerator iterator) { if (null == iterator) { throw new ArgumentNullException(); } _iterator = iterator; _current = Iterators.NoElement; } protected abstract object Map(object current); public virtual bool MoveNext() { do { if (!_iterator.MoveNext()) { _current = Iterators.NoElement; return false; } _current = Map(_iterator.Current); } while (_current == Iterators.Skip); return true; } public virtual void Reset() { _current = Iterators.NoElement; _iterator.Reset(); } public virtual object Current { get { if (Iterators.NoElement == _current) { throw new InvalidOperationException(); } return _current; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/ObjectByRef.cs0000755000175000017500000000065511700531646027633 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// Useful as "out" or "by ref" function parameter. /// Useful as "out" or "by ref" function parameter. public sealed class ObjectByRef { public object value; public ObjectByRef() { } public ObjectByRef(object value_) { value = value_; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/AbstractTreeIterator.cs0000644000175000017500000000333311700531646031563 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { /// public abstract class AbstractTreeIterator : IEnumerator { private readonly Tree _tree; private Stack4 _stack; public AbstractTreeIterator(Tree tree) { _tree = tree; } public virtual object Current { get { if (_stack == null) { throw new InvalidOperationException(); } Tree tree = Peek(); if (tree == null) { return null; } return CurrentValue(tree); } } private Tree Peek() { return (Tree)_stack.Peek(); } public virtual void Reset() { _stack = null; } public virtual bool MoveNext() { if (_stack == null) { InitStack(); return _stack != null; } Tree current = Peek(); if (current == null) { return false; } if (PushPreceding(((Tree)current._subsequent))) { return true; } while (true) { _stack.Pop(); Tree parent = Peek(); if (parent == null) { return false; } if (current == ((Tree)parent._preceding)) { return true; } current = parent; } } private void InitStack() { if (_tree == null) { return; } _stack = new Stack4(); PushPreceding(_tree); } private bool PushPreceding(Tree node) { if (node == null) { return false; } while (node != null) { _stack.Push(node); node = ((Tree)node._preceding); } return true; } protected abstract object CurrentValue(Tree tree); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/PrimitiveCodec.cs0000644000175000017500000000376211700531646030402 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Sharpen.IO; namespace Db4objects.Db4o.Foundation { public sealed class PrimitiveCodec { public const int IntLength = 4; public const int LongLength = 8; public static int ReadInt(byte[] buffer, int offset) { offset += 3; return (buffer[offset] & 255) | (buffer[--offset] & 255) << 8 | (buffer[--offset] & 255) << 16 | buffer[--offset] << 24; } public static int ReadInt(ByteArrayInputStream @in) { return (@in.Read() << 24) | ((@in.Read() & 255) << 16) | ((@in.Read() & 255) << 8 ) | (@in.Read() & 255); } public static void WriteInt(byte[] buffer, int offset, int val) { offset += 3; buffer[offset] = (byte)val; buffer[--offset] = (byte)(val >>= 8); buffer[--offset] = (byte)(val >>= 8); buffer[--offset] = (byte)(val >> 8); } public static void WriteInt(ByteArrayOutputStream @out, int val) { @out.Write((byte)(val >> 24)); @out.Write((byte)(val >> 16)); @out.Write((byte)(val >> 8)); @out.Write((byte)val); } public static void WriteLong(byte[] buffer, long val) { WriteLong(buffer, 0, val); } public static void WriteLong(byte[] buffer, int offset, long val) { for (int i = 0; i < LongLength; i++) { buffer[offset++] = (byte)(val >> ((7 - i) * 8)); } } public static void WriteLong(ByteArrayOutputStream @out, long val) { for (int i = 0; i < LongLength; i++) { @out.Write((byte)(val >> ((7 - i) * 8))); } } public static long ReadLong(byte[] buffer, int offset) { long ret = 0; for (int i = 0; i < LongLength; i++) { ret = (ret << 8) + (buffer[offset++] & unchecked((int)(0xff))); } return ret; } public static long ReadLong(ByteArrayInputStream @in) { long ret = 0; for (int i = 0; i < LongLength; i++) { ret = (ret << 8) + ((byte)@in.Read() & unchecked((int)(0xff))); } return ret; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/No4.cs0000644000175000017500000000041111700531646026120 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class No4 : IInternal4 { public static readonly No4 Instance = new No4(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IPreparedComparison.cs0000644000175000017500000000126011700531646031371 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { /// /// a prepared comparison, to compare multiple objects /// with one single object. /// /// /// a prepared comparison, to compare multiple objects /// with one single object. /// public interface IPreparedComparison { /// /// return a negative int, zero or a positive int if /// the object being held in 'this' is smaller, equal /// or greater than the passed object.

/// Typical implementation: return this.object - obj; ///
int CompareTo(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Foundation/IIntIterator4.cs0000644000175000017500000000036311700531646030127 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Foundation { /// public interface IIntIterator4 : IEnumerator { int CurrentInt(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Db4oVersion.cs0000644000175000017500000000055411700531646025520 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o { /// public class Db4oVersion { public static readonly string Name = "8.0.183.14430"; public const int Major = 8; public const int Minor = 0; public const int Iteration = 183; public const int Revision = 14430; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/0000755000175000017500000000000011700531646023333 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/NotTransparentActivationEnabled.cs0000644000175000017500000000170511700531646032144 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Internal; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.TA { public class NotTransparentActivationEnabled : DiagnosticBase { private ClassMetadata _class; public NotTransparentActivationEnabled(ClassMetadata clazz) { _class = clazz; } public override string Problem() { return "An object of class " + _class + " was stored. Instances of this class very likely are not subject to transparent activation."; } public override object Reason() { return _class; } public override string Solution() { return "Use a TA aware class with equivalent functionality or ensure that this class provides a sensible implementation of the " + typeof(IActivatable).FullName + " interface and the implicit TA hooks, either manually or by applying instrumentation."; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/IRollbackStrategy.cs0000644000175000017500000000157111700531646027253 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.TA { /// Interface defining rollback behavior when Transparent Persistence mode is on. /// /// Interface defining rollback behavior when Transparent Persistence mode is on. /// /// TransparentPersistenceSupport public interface IRollbackStrategy { /// Method to be called per TP-enabled object when the transaction is rolled back. /// /// Method to be called per TP-enabled object when the transaction is rolled back. /// /// current ObjectContainer /// TP-enabled object void Rollback(IObjectContainer container, object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/TransactionalActivator.cs0000644000175000017500000000160211700531646030340 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Activation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.TA { /// /// An /// Db4objects.Db4o.Activation.IActivator /// /// implementation that activates an object on a specific /// transaction. /// /// internal sealed class TransactionalActivator : IActivator { private readonly Transaction _transaction; private readonly ObjectReference _objectReference; public TransactionalActivator(Transaction transaction, ObjectReference objectReference ) { _objectReference = objectReference; _transaction = transaction; } public void Activate(ActivationPurpose purpose) { _objectReference.ActivateOn(_transaction, purpose); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/TransparentActivationSupport.cs0000644000175000017500000002306211700531646031605 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Activation; using Db4objects.Db4o.Config; using Db4objects.Db4o.Events; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Diagnostic; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.TA { /// /// Configuration item that enables Transparent Activation Mode for this /// session. /// /// /// Configuration item that enables Transparent Activation Mode for this /// session. TA mode should be switched on explicitly for manual TA implementation: ///

/// commonConfiguration.Add(new TransparentActivationSupport()); ///
/// public class TransparentActivationSupport : IConfigurationItem { // TODO: unbindOnClose should be configurable public virtual void Prepare(IConfiguration configuration) { } // Nothing to do... /// /// Configures the just opened ObjectContainer by setting event listeners, /// which will be triggered when activation or de-activation is required. /// /// /// Configures the just opened ObjectContainer by setting event listeners, /// which will be triggered when activation or de-activation is required. /// /// the ObjectContainer to configure /// TransparentPersistenceSupport.Apply(Db4objects.Db4o.Internal.IInternalObjectContainer) /// public virtual void Apply(IInternalObjectContainer container) { if (IsTransparentActivationEnabledOn(container)) { return; } TransparentActivationDepthProviderImpl provider = new TransparentActivationDepthProviderImpl (); SetActivationDepthProvider(container, provider); IEventRegistry registry = EventRegistryFor(container); registry.Instantiated += new System.EventHandler (new _IEventListener4_45(this).OnEvent); registry.Created += new System.EventHandler (new _IEventListener4_50(this).OnEvent); registry.Closing += new System.EventHandler (new _IEventListener4_56(this).OnEvent); TransparentActivationSupport.TADiagnosticProcessor processor = new TransparentActivationSupport.TADiagnosticProcessor (this, container); registry.ClassRegistered += new System.EventHandler (new _IEventListener4_67(processor).OnEvent); } private sealed class _IEventListener4_45 { public _IEventListener4_45(TransparentActivationSupport _enclosing) { this._enclosing = _enclosing; } public void OnEvent(object sender, Db4objects.Db4o.Events.ObjectInfoEventArgs args ) { this._enclosing.BindActivatableToActivator((ObjectEventArgs)args); } private readonly TransparentActivationSupport _enclosing; } private sealed class _IEventListener4_50 { public _IEventListener4_50(TransparentActivationSupport _enclosing) { this._enclosing = _enclosing; } public void OnEvent(object sender, Db4objects.Db4o.Events.ObjectInfoEventArgs args ) { this._enclosing.BindActivatableToActivator((ObjectEventArgs)args); } private readonly TransparentActivationSupport _enclosing; } private sealed class _IEventListener4_56 { public _IEventListener4_56(TransparentActivationSupport _enclosing) { this._enclosing = _enclosing; } public void OnEvent(object sender, Db4objects.Db4o.Events.ObjectContainerEventArgs args) { IInternalObjectContainer objectContainer = (IInternalObjectContainer)((ObjectContainerEventArgs )args).ObjectContainer; this._enclosing.UnbindAll(objectContainer); if (!this._enclosing.IsEmbeddedClient(objectContainer)) { this._enclosing.SetActivationDepthProvider(objectContainer, null); } } private readonly TransparentActivationSupport _enclosing; } private sealed class _IEventListener4_67 { public _IEventListener4_67(TransparentActivationSupport.TADiagnosticProcessor processor ) { this.processor = processor; } public void OnEvent(object sender, Db4objects.Db4o.Events.ClassEventArgs args) { ClassEventArgs cea = (ClassEventArgs)args; processor.OnClassRegistered(cea.ClassMetadata()); } private readonly TransparentActivationSupport.TADiagnosticProcessor processor; } public static bool IsTransparentActivationEnabledOn(IInternalObjectContainer container ) { return ActivationProvider(container) is ITransparentActivationDepthProvider; } private void SetActivationDepthProvider(IInternalObjectContainer container, IActivationDepthProvider provider) { container.ConfigImpl.ActivationDepthProvider(provider); } private IEventRegistry EventRegistryFor(IObjectContainer container) { return EventRegistryFactory.ForObjectContainer(container); } private void UnbindAll(IInternalObjectContainer container) { Db4objects.Db4o.Internal.Transaction transaction = container.Transaction; // FIXME should that ever happen? if (transaction == null) { return; } IReferenceSystem referenceSystem = transaction.ReferenceSystem(); referenceSystem.TraverseReferences(new _IVisitor4_95(this)); } private sealed class _IVisitor4_95 : IVisitor4 { public _IVisitor4_95(TransparentActivationSupport _enclosing) { this._enclosing = _enclosing; } public void Visit(object obj) { this._enclosing.Unbind((ObjectReference)obj); } private readonly TransparentActivationSupport _enclosing; } private void Unbind(ObjectReference objectReference) { object obj = objectReference.GetObject(); if (obj == null || !(obj is IActivatable)) { return; } Bind(obj, null); } private void BindActivatableToActivator(ObjectEventArgs oea) { object obj = oea.Object; if (obj is IActivatable) { Db4objects.Db4o.Internal.Transaction transaction = (Db4objects.Db4o.Internal.Transaction )oea.Transaction(); ObjectReference objectReference = transaction.ReferenceForObject(obj); Bind(obj, ActivatorForObject(transaction, objectReference)); } } private void Bind(object activatable, IActivator activator) { ((IActivatable)activatable).Bind(activator); } private IActivator ActivatorForObject(Db4objects.Db4o.Internal.Transaction transaction , ObjectReference objectReference) { if (IsEmbeddedClient(transaction)) { return new TransactionalActivator(transaction, objectReference); } return objectReference; } private bool IsEmbeddedClient(Db4objects.Db4o.Internal.Transaction transaction) { return IsEmbeddedClient(transaction.ObjectContainer()); } internal virtual Db4objects.Db4o.Internal.Transaction Transaction(EventArgs args) { return (Db4objects.Db4o.Internal.Transaction)((TransactionalEventArgs)args).Transaction (); } protected static IActivationDepthProvider ActivationProvider(IInternalObjectContainer container) { return container.ConfigImpl.ActivationDepthProvider(); } private bool IsEmbeddedClient(IObjectContainer objectContainer) { return objectContainer is ObjectContainerSession; } private sealed class TADiagnosticProcessor { private readonly IInternalObjectContainer _container; public TADiagnosticProcessor(TransparentActivationSupport _enclosing, IInternalObjectContainer container) { this._enclosing = _enclosing; this._container = container; } public void OnClassRegistered(ClassMetadata clazz) { // if(Platform4.isDb4oClass(clazz.getName())) { // return; // } IReflectClass reflectClass = clazz.ClassReflector(); if (this.ActivatableClass().IsAssignableFrom(reflectClass)) { return; } if (this.HasNoActivatingFields(reflectClass)) { return; } NotTransparentActivationEnabled diagnostic = new NotTransparentActivationEnabled( clazz); DiagnosticProcessor processor = this._container.Handlers.DiagnosticProcessor(); processor.OnDiagnostic(diagnostic); } private IReflectClass ActivatableClass() { return this._container.Reflector().ForClass(typeof(IActivatable)); } private bool HasNoActivatingFields(IReflectClass clazz) { IReflectClass curClass = clazz; while (curClass != null) { IReflectField[] fields = curClass.GetDeclaredFields(); if (!this.HasNoActivatingFields(fields)) { return false; } curClass = curClass.GetSuperclass(); } return true; } private bool HasNoActivatingFields(IReflectField[] fields) { for (int i = 0; i < fields.Length; i++) { if (this.IsActivating(fields[i])) { return false; } } return true; } private bool IsActivating(IReflectField field) { IReflectClass fieldType = field.GetFieldType(); return fieldType != null && !fieldType.IsPrimitive(); } private readonly TransparentActivationSupport _enclosing; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/DeactivatingRollbackStrategy.cs0000644000175000017500000000132411700531646031461 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.TA { /// RollbackStrategy to deactivate all activated objects on rollback. /// RollbackStrategy to deactivate all activated objects on rollback. /// TransparentPersistenceSupport public class DeactivatingRollbackStrategy : IRollbackStrategy { /// deactivates each object. /// deactivates each object. public virtual void Rollback(IObjectContainer container, object obj) { container.Ext().Deactivate(obj); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/IActivatableInstrumented.cs0000644000175000017500000000076211700531646030621 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.TA { /// /// Marker interface to declare a class already implements the required TA/TP hooks /// and does not want to be instrumented further. /// /// /// Marker interface to declare a class already implements the required TA/TP hooks /// and does not want to be instrumented further. /// public interface IActivatableInstrumented { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/TransparentPersistenceSupport.cs0000644000175000017500000000501411700531646031765 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.TA { /// /// Enables Transparent Persistence and Transparent Activation behaviours for /// the current session. /// /// /// Enables Transparent Persistence and Transparent Activation behaviours for /// the current session. ///

/// commonConfiguration.Add(new TransparentPersistenceSupport()); ///
/// Db4objects.Db4o.TA.TransparentActivationSupport /// public class TransparentPersistenceSupport : TransparentActivationSupport { private readonly IRollbackStrategy _rollbackStrategy; /// Creates a new instance of TransparentPersistenceSupport class /// /// RollbackStrategy interface implementation, which /// defines the actions to be taken on the object when the transaction is rolled back. /// public TransparentPersistenceSupport(IRollbackStrategy rollbackStrategy) { _rollbackStrategy = rollbackStrategy; } /// /// Creates a new instance of TransparentPersistenceSupport class /// with no rollback strategies defined. /// /// /// Creates a new instance of TransparentPersistenceSupport class /// with no rollback strategies defined. /// public TransparentPersistenceSupport() : this(null) { } /// Configures current ObjectContainer to support Transparent Activation and Transparent Persistence /// /// public override void Apply(IInternalObjectContainer container) { base.Apply(container); EnableTransparentPersistenceFor(container); } private void EnableTransparentPersistenceFor(IInternalObjectContainer container) { ITransparentActivationDepthProvider provider = (ITransparentActivationDepthProvider )ActivationProvider(container); provider.EnableTransparentPersistenceSupportFor(container, _rollbackStrategy); } public override void Prepare(IConfiguration configuration) { base.Prepare(configuration); ((Config4Impl)configuration).UpdateDepthProvider(new TPUpdateDepthProvider()); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/TA/IActivatable.cs0000644000175000017500000001251611700531646026217 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Activation; namespace Db4objects.Db4o.TA { /// /// IActivatable must be implemented by classes in order to support /// Transparent Activation. ///
///
/// The IActivatable interface may be added to persistent classes by hand /// or by using the db4o instrumentation (Db4oTools). ///
/// /// IActivatable must be implemented by classes in order to support /// Transparent Activation. ///
///
/// The IActivatable interface may be added to persistent classes by hand /// or by using the db4o instrumentation (Db4oTools). For further /// information on the enhancer see: ///
///
/// http://developer.db4o.com/Resources/view.aspx/Reference/Implementation_Strategies/Enhancement_Tools/Enhancement_For_.NET. ///
///
/// The basic idea for Transparent Activation is as follows: ///
/// Objects have an activation depth of 0, i.e. by default they are not /// activated at all. Whenever a method is called on such an object, the /// first thing to do before actually executing the method body is to /// activate the object to level 1, i.e. populating its direct members. ///
///
/// To illustrate this approach, we will use the following simple class. ///
///
/// /// public class Item { ///
   private Item _next;

///    public Item(Item next) {
///       _next = next;
///    }

///    public Item Next {
///      get {
///       return _next;
///      }
///    }
/// }

/// The basic sequence of actions to get the above scheme to work is the /// following:
///
/// - Whenever an object is instantiated from db4o, the database registers an /// activator for this object. To enable this, the object has to implement the /// IActivatable interface and provide the according Bind(IActivator) method. The /// default implementation of the bind method will simply store the given /// activator reference for later use.
///
/// /// public class Item implements IActivatable {
///    transient IActivator _activator;

///    public void Bind(IActivator activator) {
///       if (null != _activator) {
///          throw new IllegalStateException();
///       }
///       _activator = activator;
///    }

///    // ...
/// }

/// - The first action in every method body of an activatable object should be a /// call to the corresponding IActivator's Activate() method. (Note that this is /// not enforced by any interface, it is rather a convention, and other /// implementations are possible.)
///
/// /// public class Item implements IActivatable {
///    public void Activate() {
///       if (_activator == null) return;
///       _activator.Activate();
///    }

///    public Item Next() {
///      get {
///       Activate();
///       return _next;
///      }
///    }
/// }

/// - The Activate() method will check whether the object is already activated. /// If this is not the case, it will request the container to activate the object /// to level 1 and set the activated flag accordingly.
///
/// To instruct db4o to actually use these hooks (i.e. to register the database /// when instantiating an object), TransparentActivationSupport has to be /// registered with the db4o configuration.
///
/// /// ICommonConfiguration config = ...
/// config.Add(new TransparentActivationSupport());

///
///
public interface IActivatable { /// called by db4o upon instantiation. /// /// called by db4o upon instantiation.
///
/// The recommended implementation of this method is to store the passed /// Db4objects.Db4o.Activation.IActivator /// /// in a transient field of the object. ///
/// the Activator void Bind(IActivator activator); /// should be called by every reading field access of an object. /// /// should be called by every reading field access of an object.
///
/// The recommended implementation of this method is to call /// Db4objects.Db4o.Activation.IActivator.Activate(Db4objects.Db4o.Activation.ActivationPurpose) /// /// on the /// Db4objects.Db4o.Activation.IActivator /// /// that was previously passed to /// Bind(Db4objects.Db4o.Activation.IActivator) /// /// . ///
/// TODO void Activate(ActivationPurpose purpose); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Debug4.cs0000644000175000017500000000713311700531646024474 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o { /// public sealed class Debug4 { /// indexes all fields public const bool indexAllFields = false; /// prints query graph information to the console public const bool queries = false; /// /// allows faking the Db4oDatabase identity object, so the first /// stored object in the debugger is the actually persisted object /// Changing this setting to true will fail some tests that expect /// database files to have identity /// public const bool staticIdentity = queries; /// prints more stack traces public const bool atHome = false; /// makes C/S timeouts longer, so C/S does not time out in the debugger public const bool longTimeOuts = false; /// turns freespace debuggin on public const bool freespace = Deploy.debug; /// /// fills deleted slots with 'X' and overrides any configured /// freespace filler /// public const bool xbytes = freespace; /// /// checks monitor conditions to make sure only the thread /// with the global monitor is allowed entry to the core /// public const bool checkSychronization = false; /// /// makes sure a configuration entry is generated for each persistent /// class /// public const bool configureAllClasses = indexAllFields; /// /// makes sure a configuration entry is generated for each persistent /// field /// public const bool configureAllFields = indexAllFields; /// allows turning weak references off public const bool weakReferences = true; /// prints all communicated messages to the console public const bool messages = false; /// allows turning NIO off on Java public const bool nio = true; /// allows overriding the file locking mechanism to turn it off public const bool lockFile = true; public static void Expect(bool cond) { if (!cond) { throw new Exception("Should never happen"); } } public static void EnsureLock(object obj) { } public static bool ExceedsMaximumBlockSize(int a_length) { if (a_length > Const4.MaximumBlockSize) { return true; } return false; } public static bool ExceedsMaximumArrayEntries(int a_entries, bool a_primitive) { if (a_entries > (a_primitive ? Const4.MaximumArrayEntriesPrimitive : Const4.MaximumArrayEntries )) { return true; } return false; } public static void ReadBegin(IReadBuffer buffer, byte identifier) { } public static void ReadEnd(IReadBuffer buffer) { if (Deploy.debug && Deploy.brackets) { if (buffer.ReadByte() != Const4.Yapend) { throw new Exception("Debug.readEnd() YAPEND expected"); } } } public static void WriteBegin(IWriteBuffer buffer, byte identifier) { } public static void WriteEnd(IWriteBuffer buffer) { if (Deploy.debug && Deploy.brackets) { if (buffer is MarshallingContext) { ((MarshallingContext)buffer).DebugWriteEnd(Const4.Yapend); return; } buffer.WriteByte(Const4.Yapend); } } private Debug4() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Db4oFactory.cs0000644000175000017500000005117211700531646025504 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; namespace Db4objects.Db4o { /// factory class to start db4o database engines. /// /// factory class to start db4o database engines. ///

This class provides static methods to
/// - open single-user databases /// OpenFile(string) ///
/// - open db4o servers /// OpenServer(string, int) ///
/// - connect to db4o servers /// OpenClient(string, int, string, string) /// ///
/// - provide access to the global configuration context /// Configure() ///
/// - print the version number of this db4o version /// Main(java.lang.String[]) /// ///
/// ExtDb4o for extended functionality. public class Db4oFactory { internal static readonly Config4Impl i_config = new Config4Impl(); static Db4oFactory() { Platform4.GetDefaultConfiguration(i_config); } /// prints the version name of this db4o version to System.out. /// /// prints the version name of this db4o version to System.out. /// public static void Main(string[] args) { Sharpen.Runtime.Out.WriteLine(Version()); } /// /// returns the global db4o /// IConfiguration /// context /// for the running CLR session. ///

/// The /// IConfiguration /// can be overriden in each /// ObjectContainer /// .

///
/// /// the global /// configuration /// context /// /// public static IConfiguration Configure() { return i_config; } /// /// Creates a fresh /// IConfiguration /// instance. /// /// a fresh, independent configuration with all options set to their default values /// [System.ObsoleteAttribute(@"Use Db4oEmbedded.NewConfiguration() instead.")] public static IConfiguration NewConfiguration() { Config4Impl config = new Config4Impl(); Platform4.GetDefaultConfiguration(config); return config; } /// /// Creates a clone of the global db4o /// IConfiguration /// . /// /// /// a fresh configuration with all option values set to the values /// currently configured for the global db4o configuration context /// [System.ObsoleteAttribute(@"use explicit configuration via Db4oEmbedded.NewConfiguration() instead" )] public static IConfiguration CloneConfiguration() { return (Config4Impl)((IDeepClone)Db4oFactory.Configure()).DeepClone(null); } /// /// Operates just like /// /// Db4objects.Db4o.Db4oFactory.OpenClient /// , but uses /// the global db4o /// IConfiguration /// context. /// opens an /// IObjectContainer /// client and connects it to the specified named server and port. ///

/// The server needs to /// allow access /// for the specified user and password. ///

/// A client /// IObjectContainer /// can be cast to /// IExtClient /// to use extended /// IExtObjectContainer /// /// and /// IExtClient /// methods. ///

/// This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in /// Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients. ///
/// /// a custom /// IConfiguration /// instance to be obtained via /// /// Db4objects.Db4o.Db4oEmbedded.NewConfiguration /// /// /// the host name /// the port the server is using /// the user name /// the user password /// /// an open /// IObjectContainer /// /// /// Db4objects.Db4o.IObjectServer.GrantAccess /// /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// open operation failed because the database file /// is in old format and /// /// Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates /// /// /// is set to false. /// /// /// password supplied for the connection is /// invalid. /// public static IObjectContainer OpenClient(string hostName, int port, string user, string password) { return OpenClient(Db4oFactory.CloneConfiguration(), hostName, port, user, password ); } /// /// opens an /// IObjectContainer /// client and connects it to the specified named server and port. ///

/// The server needs to /// allow access /// for the specified user and password. ///

/// A client /// IObjectContainer /// can be cast to /// IExtClient /// to use extended /// IExtObjectContainer /// /// and /// IExtClient /// methods. ///

/// This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in /// Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients. ///
/// /// a custom /// IConfiguration /// instance to be obtained via /// /// Db4objects.Db4o.Db4oEmbedded.NewConfiguration /// /// /// the host name /// the port the server is using /// the user name /// the user password /// /// an open /// IObjectContainer /// /// /// Db4objects.Db4o.IObjectServer.GrantAccess /// /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// open operation failed because the database file /// is in old format and /// /// Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates /// /// /// is set to false. /// /// /// password supplied for the connection is /// invalid. /// public static IObjectContainer OpenClient(IConfiguration config, string hostName, int port, string user, string password) { return ((Config4Impl)config).ClientServerFactory().OpenClient(config, hostName, port , user, password); } /// /// Operates just like /// Db4oFactory.OpenFile /// , but uses /// the global db4o /// IConfiguration /// context. /// opens an /// IObjectContainer /// on the specified database file for local use. ///

A database file can only be opened once, subsequent attempts to open /// another /// IObjectContainer /// against the same file will result in /// a /// DatabaseFileLockedException /// .

/// Database files can only be accessed for readwrite access from one process /// at one time. All versions except for db4o mobile edition use an /// internal mechanism to lock the database file for other processes. ///

/// ///
/// an absolute or relative path to the database file /// /// an open /// IObjectContainer /// /// /// IConfiguration.ReadOnly /// IConfiguration.Encrypt /// IConfiguration.Password /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// /// the required database file is locked by /// another process. /// /// /// /// runtime /// configuration /// is not compatible /// with the configuration of the database file. /// /// /// /// open operation failed because the database file /// is in old format and /// /// IConfiguration.AllowVersionUpdates /// /// is set to false. /// /// /// database was configured as read-only. /// public static IObjectContainer OpenFile(string databaseFileName) { return Db4oFactory.OpenFile(CloneConfiguration(), databaseFileName); } /// /// opens an /// IObjectContainer /// on the specified database file for local use. ///

A database file can only be opened once, subsequent attempts to open /// another /// IObjectContainer /// against the same file will result in /// a /// DatabaseFileLockedException /// .

/// Database files can only be accessed for readwrite access from one process /// at one time. All versions except for db4o mobile edition use an /// internal mechanism to lock the database file for other processes. ///

/// ///
/// /// a custom /// IConfiguration /// instance to be obtained via /// Db4oFactory.NewConfiguration /// /// /// an absolute or relative path to the database file /// /// an open /// IObjectContainer /// /// /// IConfiguration.ReadOnly /// IConfiguration.Encrypt /// IConfiguration.Password /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// /// the required database file is locked by /// another process. /// /// /// /// runtime /// configuration /// is not compatible /// with the configuration of the database file. /// /// /// /// open operation failed because the database file /// is in old format and /// /// IConfiguration.AllowVersionUpdates /// /// /// /// is set to false. /// /// /// /// database was configured as read-only. /// /// public static IObjectContainer OpenFile(IConfiguration config, string databaseFileName ) { return ObjectContainerFactory.OpenObjectContainer(Db4oLegacyConfigurationBridge.AsEmbeddedConfiguration (config), databaseFileName); } /// /// Operates just like /// /// Db4objects.Db4o.Db4oFactory.OpenServer /// /// , but uses /// the global db4o /// IConfiguration /// context. /// Opens an /// IObjectServer /// on the specified database file and port. ///

/// If the server does not need to listen on a port because it will only be used /// in embedded mode with /// /// Db4objects.Db4o.IObjectServer.OpenClient /// /// , specify '0' as the /// port number. ///

This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in /// Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients. ///
/// an absolute or relative path to the database file /// /// the port to be used, or 0, if the server should not open a port, /// because it will only be used with /// /// Db4objects.Db4o.IObjectServer.OpenClient /// /// . /// Specify a value < 0 if an arbitrary free port should be chosen - see /// /// Db4objects.Db4o.Ext.IExtObjectServer.Port /// /// . /// /// /// an /// IObjectServer /// listening /// on the specified port. /// /// /// Db4objects.Db4o.Config.IConfiguration.ReadOnly /// /// /// Db4objects.Db4o.Config.IConfiguration.Encrypt /// /// /// Db4objects.Db4o.Config.IConfiguration.Password /// /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// the required database file is locked by /// another process. /// /// /// runtime /// configuration /// is not compatible /// with the configuration of the database file. /// /// /// open operation failed because the database file /// is in old format and /// /// Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates /// /// /// is set to false. /// /// /// database was configured as read-only. /// public static IObjectServer OpenServer(string databaseFileName, int port) { return OpenServer(CloneConfiguration(), databaseFileName, port); } /// /// opens an /// IObjectServer /// on the specified database file and port. ///

/// If the server does not need to listen on a port because it will only be used /// in embedded mode with /// /// Db4objects.Db4o.IObjectServer.OpenClient /// /// , specify '0' as the /// port number. ///

This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in /// Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients. ///
/// /// a custom /// IConfiguration /// instance to be obtained via /// /// Db4objects.Db4o.Db4oEmbedded.NewConfiguration /// /// /// an absolute or relative path to the database file /// /// the port to be used, or 0, if the server should not open a port, /// because it will only be used with /// /// Db4objects.Db4o.IObjectServer.OpenClient /// /// . /// Specify a value < 0 if an arbitrary free port should be chosen - see /// /// Db4objects.Db4o.Ext.IExtObjectServer.Port /// /// . /// /// /// an /// IObjectServer /// listening /// on the specified port. /// /// /// Db4objects.Db4o.Config.IConfiguration.ReadOnly /// /// /// Db4objects.Db4o.Config.IConfiguration.Encrypt /// /// /// Db4objects.Db4o.Config.IConfiguration.Password /// /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// the required database file is locked by /// another process. /// /// /// runtime /// configuration /// is not compatible /// with the configuration of the database file. /// /// /// open operation failed because the database file /// is in old format and /// /// Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates /// /// /// is set to false. /// /// /// database was configured as read-only. /// public static IObjectServer OpenServer(IConfiguration config, string databaseFileName , int port) { return ((Config4Impl)config).ClientServerFactory().OpenServer(config, databaseFileName , port); } /// returns the version name of the used db4o version. /// /// returns the version name of the used db4o version. ///

///
/// version information as a String. public static string Version() { return "db4o " + Db4oVersion.Name; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Messaging/0000755000175000017500000000000011700531646024744 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Messaging/IMessageSender.cs0000644000175000017500000000274611700531646030142 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Messaging { /// message sender for client/server messaging. /// /// message sender for client/server messaging. ///

db4o allows using the client/server TCP connection to send /// messages from the client to the server. Any object that can be /// stored to a db4o database file may be used as a message.

/// For an example see Reference documentation:
/// http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Messaging
/// http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution

/// See Also:
/// Db4objects.Db4o.Config.IClientServerConfiguration.GetMessageSender() /// /// ,
/// IMessageRecipient /// ,
/// Db4objects.Db4o.Config.IClientServerConfiguration.SetMessageRecipient(IMessageRecipient) /// ///
public interface IMessageSender { /// sends a message to the server. /// sends a message to the server. /// the message parameter, any object may be used. void Send(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Messaging/IMessageRecipient.cs0000644000175000017500000000333111700531646030633 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Messaging; namespace Db4objects.Db4o.Messaging { /// message recipient for client/server messaging. /// /// message recipient for client/server messaging. ///

db4o allows using the client/server TCP connection to send /// messages from the client to the server. Any object that can be /// stored to a db4o database file may be used as a message.

/// For an example see Reference documentation:
/// http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Messaging
/// http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution

/// See Also:
/// ClientServerConfiguration.setMessageRecipient(MessageRecipient) /// ,
/// IMessageSender /// ,
/// Db4objects.Db4o.Config.IClientServerConfiguration.GetMessageSender() /// /// ,
/// MessageRecipientWithContext ///
///
public interface IMessageRecipient { /// the method called upon the arrival of messages. /// the method called upon the arrival of messages. /// contextual information for the message. /// the message received. void ProcessMessage(IMessageContext context, object message); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Messaging/IMessageContext.cs0000644000175000017500000000176411700531646030345 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Messaging; namespace Db4objects.Db4o.Messaging { /// Additional message-related information. /// Additional message-related information. public interface IMessageContext { /// The container the message was dispatched to. /// The container the message was dispatched to. IObjectContainer Container { get; } /// The sender of the current message. /// /// The sender of the current message. /// The reference can be used to send a reply to it. /// IMessageSender Sender { get; } /// The transaction the current message has been sent with. /// The transaction the current message has been sent with. Db4objects.Db4o.Internal.Transaction Transaction { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/0000755000175000017500000000000011700531646023336 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/Crypt/0000755000175000017500000000000011700531646024437 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/Crypt/db4o_xtea.txt0000644000175000017500000000022311700531646027046 0ustar00meebeymeebey00000000000000You can find an db4o IoAdapter based implementation of the XTEA encryption algorithm here: http://developer.db4o.com/ProjectSpaces/view.aspx/XTEA smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/MemoryBin.cs0000644000175000017500000000534311700531646025573 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.IO; using Sharpen; using Sharpen.Lang; namespace Db4objects.Db4o.IO { public class MemoryBin : IBin { private byte[] _bytes; private int _length; private IGrowthStrategy _growthStrategy; public MemoryBin(int initialSize, IGrowthStrategy growthStrategy) : this(new byte [initialSize], growthStrategy) { } public MemoryBin(byte[] bytes, IGrowthStrategy growthStrategy) { _bytes = bytes; _length = bytes.Length; _growthStrategy = growthStrategy; } public virtual long Length() { return _length; } public virtual long BufferSize() { return _bytes.Length; } /// public virtual int Read(long pos, byte[] bytes, int length) { long avail = _length - pos; if (avail <= 0) { return -1; } int read = Math.Min((int)avail, length); System.Array.Copy(_bytes, (int)pos, bytes, 0, read); return read; } /// public virtual void Sync() { } public virtual int SyncRead(long position, byte[] bytes, int bytesToRead) { return Read(position, bytes, bytesToRead); } public virtual void Close() { } /// Returns a copy of the raw data contained in this bin for external processing. /// /// /// Returns a copy of the raw data contained in this bin for external processing. /// Access to the data is not guarded by synchronisation. If this method is called /// while the MemoryBin is in use, it is possible that the returned byte array is /// not consistent. /// public virtual byte[] Data() { byte[] data = new byte[_length]; System.Array.Copy(_bytes, 0, data, 0, _length); return data; } /// for internal processing only. /// for internal processing only. /// public virtual void Write(long pos, byte[] buffer, int length) { if (pos + length > _bytes.Length) { long newSize = _growthStrategy.NewSize(_bytes.Length, pos + length); // if (pos + length > newSize) { // newSize = pos + length; // } byte[] temp = new byte[(int)newSize]; System.Array.Copy(_bytes, 0, temp, 0, _length); _bytes = temp; } System.Array.Copy(buffer, 0, _bytes, (int)pos, length); pos += length; if (pos > _length) { _length = (int)pos; } } public virtual void Sync(IRunnable runnable) { runnable.Run(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/NonFlushingStorage.cs0000644000175000017500000000210211700531646027437 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// /// Storage adapter that does not pass flush calls /// on to its delegate. /// /// /// Storage adapter that does not pass flush calls /// on to its delegate. /// You can use this /// IStorage /// for improved db4o /// speed at the risk of corrupted database files in /// case of system failure. /// public class NonFlushingStorage : StorageDecorator { public NonFlushingStorage(IStorage storage) : base(storage) { } protected override IBin Decorate(BinConfiguration config, IBin storage) { return new NonFlushingStorage.NonFlushingBin(storage); } private class NonFlushingBin : BinDecorator { public NonFlushingBin(IBin storage) : base(storage) { } public override void Sync() { } public override void Sync(IRunnable runnable) { runnable.Run(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/MemoryStorage.cs0000644000175000017500000000556411700531646026474 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using System.IO; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// /// IStorage /// implementation that produces /// IBin /// instances /// that operate in memory. /// Use this /// IStorage /// to work with db4o as an in-memory database. /// public class MemoryStorage : IStorage { private readonly IDictionary _bins = new Hashtable(); private readonly IGrowthStrategy _growthStrategy; public MemoryStorage() : this(new DoublingGrowthStrategy()) { } public MemoryStorage(IGrowthStrategy growthStrategy) { _growthStrategy = growthStrategy; } /// /// returns true if a MemoryBin with the given URI name already exists /// in this Storage. /// /// /// returns true if a MemoryBin with the given URI name already exists /// in this Storage. /// public virtual bool Exists(string uri) { return _bins.Contains(uri); } /// opens a MemoryBin for the given URI (name can be freely chosen). /// opens a MemoryBin for the given URI (name can be freely chosen). /// public virtual IBin Open(BinConfiguration config) { IBin storage = ProduceStorage(config); return config.ReadOnly() ? new ReadOnlyBin(storage) : storage; } /// Returns the memory bin for the given URI for external use. /// Returns the memory bin for the given URI for external use. public virtual MemoryBin Bin(string uri) { return ((MemoryBin)_bins[uri]); } /// Registers the given bin for this storage with the given URI. /// Registers the given bin for this storage with the given URI. public virtual void Bin(string uri, MemoryBin bin) { _bins[uri] = bin; } private IBin ProduceStorage(BinConfiguration config) { IBin storage = Bin(config.Uri()); if (null != storage) { return storage; } MemoryBin newStorage = new MemoryBin(new byte[(int)config.InitialLength()], _growthStrategy ); _bins[config.Uri()] = newStorage; return newStorage; } /// public virtual void Delete(string uri) { Sharpen.Collections.Remove(_bins, uri); } /// public virtual void Rename(string oldUri, string newUri) { MemoryBin bin = ((MemoryBin)Sharpen.Collections.Remove(_bins, oldUri)); if (bin == null) { throw new IOException("Bin not found: " + oldUri); } _bins[newUri] = bin; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/PagingMemoryStorage.cs0000644000175000017500000000553111700531646027614 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using System.IO; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// /// IStorage /// implementation that produces /// IBin /// instances /// that operate in memory. /// Use this /// IStorage /// to work with db4o as an in-memory database. /// public class PagingMemoryStorage : IStorage { private const int DefaultPagesize = 4096; private readonly IDictionary _binsByUri = new Hashtable(); private readonly int _pageSize; public PagingMemoryStorage() : this(DefaultPagesize) { } public PagingMemoryStorage(int pageSize) { _pageSize = pageSize; } /// /// returns true if a MemoryBin with the given URI name already exists /// in this Storage. /// /// /// returns true if a MemoryBin with the given URI name already exists /// in this Storage. /// public virtual bool Exists(string uri) { return _binsByUri.Contains(uri); } /// opens a MemoryBin for the given URI (name can be freely chosen). /// opens a MemoryBin for the given URI (name can be freely chosen). /// public virtual IBin Open(BinConfiguration config) { IBin bin = ProduceBin(config); return config.ReadOnly() ? new ReadOnlyBin(bin) : bin; } /// Returns the memory bin for the given URI for external use. /// Returns the memory bin for the given URI for external use. public virtual IBin Bin(string uri) { return ((IBin)_binsByUri[uri]); } /// Registers the given bin for this storage with the given URI. /// Registers the given bin for this storage with the given URI. public virtual void Bin(string uri, IBin bin) { _binsByUri[uri] = bin; } private IBin ProduceBin(BinConfiguration config) { IBin storage = Bin(config.Uri()); if (null != storage) { return storage; } IBin newStorage = new PagingMemoryBin(_pageSize, config.InitialLength()); _binsByUri[config.Uri()] = newStorage; return newStorage; } /// public virtual void Delete(string uri) { Sharpen.Collections.Remove(_binsByUri, uri); } /// public virtual void Rename(string oldUri, string newUri) { IBin bin = ((IBin)Sharpen.Collections.Remove(_binsByUri, oldUri)); if (bin == null) { throw new IOException("Bin not found: " + oldUri); } _binsByUri[newUri] = bin; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/CachedIoAdapter.cs0000644000175000017500000003550711700531646026637 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal.Fileheader; using Sharpen; namespace Db4objects.Db4o.IO { /// /// CachedIoAdapter is an IOAdapter for random access files, which caches data /// for IO access. /// /// /// CachedIoAdapter is an IOAdapter for random access files, which caches data /// for IO access. Its functionality is similar to OS cache.
/// Example:
/// delegateAdapter = new RandomAccessFileAdapter();
/// config.Io(new CachedIoAdapter(delegateAdapter));
///
public class CachedIoAdapter : IoAdapter { private CachedIoAdapter.Page _head; private CachedIoAdapter.Page _tail; private long _position; private int _pageSize; private int _pageCount; private long _fileLength; private long _filePointer; private IoAdapter _io; private bool _readOnly; private static int DefaultPageSize = 1024; private static int DefaultPageCount = 64; /// /// Creates an instance of CachedIoAdapter with the default page size and /// page count. /// /// /// Creates an instance of CachedIoAdapter with the default page size and /// page count. /// /// delegate IO adapter (RandomAccessFileAdapter by default) public CachedIoAdapter(IoAdapter ioAdapter) : this(ioAdapter, DefaultPageSize, DefaultPageCount ) { } /// /// Creates an instance of CachedIoAdapter with a custom page size and page /// count.
///
/// delegate IO adapter (RandomAccessFileAdapter by default) /// cache page size /// allocated amount of pages public CachedIoAdapter(IoAdapter ioAdapter, int pageSize, int pageCount) { // private Hashtable4 _posPageMap = new Hashtable4(PAGE_COUNT); _io = ioAdapter; _pageSize = pageSize; _pageCount = pageCount; } /// Creates an instance of CachedIoAdapter with extended parameters.
/// database file path /// determines if the file should be locked /// initial file length, new writes will start from this point /// /// /// /// if the file should be used in read-onlyt mode. /// /// delegate IO adapter (RandomAccessFileAdapter by default) /// cache page size /// allocated amount of pages /// public CachedIoAdapter(string path, bool lockFile, long initialLength, bool readOnly , IoAdapter io, int pageSize, int pageCount) { _readOnly = readOnly; _pageSize = pageSize; _pageCount = pageCount; InitCache(); InitIOAdaptor(path, lockFile, initialLength, readOnly, io); _position = initialLength; _filePointer = initialLength; _fileLength = _io.GetLength(); } /// Creates and returns a new CachedIoAdapter
/// database file path /// determines if the file should be locked /// initial file length, new writes will start from this point /// /// public override IoAdapter Open(string path, bool lockFile, long initialLength, bool readOnly) { return new Db4objects.Db4o.IO.CachedIoAdapter(path, lockFile, initialLength, readOnly , _io, _pageSize, _pageCount); } /// Deletes the database file /// file path public override void Delete(string path) { _io.Delete(path); } /// Checks if the file exists /// file path public override bool Exists(string path) { return _io.Exists(path); } /// private void InitIOAdaptor(string path, bool lockFile, long initialLength, bool readOnly , IoAdapter io) { _io = io.Open(path, lockFile, initialLength, readOnly); } private void InitCache() { _head = new CachedIoAdapter.Page(_pageSize); _head._prev = null; CachedIoAdapter.Page page = _head; CachedIoAdapter.Page next = _head; for (int i = 0; i < _pageCount - 1; ++i) { next = new CachedIoAdapter.Page(_pageSize); page._next = next; next._prev = page; page = next; } _tail = next; } /// Reads the file into the buffer using pages from cache. /// /// Reads the file into the buffer using pages from cache. If the next page /// is not cached it will be read from the file. /// /// destination buffer /// how many bytes to read /// public override int Read(byte[] buffer, int length) { long startAddress = _position; int bytesToRead = length; int totalRead = 0; while (bytesToRead > 0) { CachedIoAdapter.Page page = GetPage(startAddress, true); int readBytes = page.Read(buffer, totalRead, startAddress, bytesToRead); MovePageToHead(page); if (readBytes <= 0) { break; } bytesToRead -= readBytes; startAddress += readBytes; totalRead += readBytes; } _position = startAddress; return totalRead == 0 ? -1 : totalRead; } /// Writes the buffer to cache using pages /// source buffer /// how many bytes to write /// public override void Write(byte[] buffer, int length) { ValidateReadOnly(); long startAddress = _position; int bytesToWrite = length; int bufferOffset = 0; while (bytesToWrite > 0) { // page doesn't need to loadFromDisk if the whole page is dirty bool loadFromDisk = (bytesToWrite < _pageSize) || (startAddress % _pageSize != 0); CachedIoAdapter.Page page = GetPage(startAddress, loadFromDisk); page.EnsureEndAddress(GetLength()); int writtenBytes = page.Write(buffer, bufferOffset, startAddress, bytesToWrite); FlushIfHeaderBlockPage(page); MovePageToHead(page); bytesToWrite -= writtenBytes; startAddress += writtenBytes; bufferOffset += writtenBytes; } long endAddress = startAddress; _position = endAddress; _fileLength = Math.Max(endAddress, _fileLength); } private void FlushIfHeaderBlockPage(CachedIoAdapter.Page page) { if (ContainsHeaderBlock(page)) { FlushPage(page); } } private void ValidateReadOnly() { if (_readOnly) { throw new Db4oIOException(); } } /// Flushes cache to a physical storage /// public override void Sync() { ValidateReadOnly(); FlushAllPages(); _io.Sync(); } /// Returns the file length /// public override long GetLength() { return _fileLength; } /// Flushes and closes the file /// public override void Close() { try { FlushAllPages(); } finally { _io.Close(); } } public override IoAdapter DelegatedIoAdapter() { return _io.DelegatedIoAdapter(); } /// private CachedIoAdapter.Page GetPage(long startAddress, bool loadFromDisk) { CachedIoAdapter.Page page = GetPageFromCache(startAddress); if (page != null) { if (ContainsHeaderBlock(page)) { GetPageFromDisk(page, startAddress); } page.EnsureEndAddress(_fileLength); return page; } // in case that page is not found in the cache page = GetFreePageFromCache(); if (loadFromDisk) { GetPageFromDisk(page, startAddress); } else { ResetPageAddress(page, startAddress); } return page; } private bool ContainsHeaderBlock(CachedIoAdapter.Page page) { return page.StartAddress() <= FileHeader1.HeaderLength; } private void ResetPageAddress(CachedIoAdapter.Page page, long startAddress) { page.StartAddress(startAddress); page.EndAddress(startAddress + _pageSize); } /// private CachedIoAdapter.Page GetFreePageFromCache() { if (!_tail.IsFree()) { FlushPage(_tail); } // _posPageMap.remove(new Long(tail.startPosition / PAGE_SIZE)); return _tail; } /// private CachedIoAdapter.Page GetPageFromCache(long pos) { CachedIoAdapter.Page page = _head; while (page != null) { if (page.Contains(pos)) { return page; } page = page._next; } return null; } // Page page = (Page) _posPageMap.get(new Long(pos/PAGE_SIZE)); // return page; /// private void FlushAllPages() { CachedIoAdapter.Page node = _head; while (node != null) { FlushPage(node); node = node._next; } } /// private void FlushPage(CachedIoAdapter.Page page) { if (!page._dirty) { return; } IoSeek(page.StartAddress()); WritePageToDisk(page); return; } /// private void GetPageFromDisk(CachedIoAdapter.Page page, long pos) { long startAddress = pos - pos % _pageSize; page.StartAddress(startAddress); IoSeek(page._startAddress); int count = IoRead(page); if (count > 0) { page.EndAddress(startAddress + count); } else { page.EndAddress(startAddress); } } // _posPageMap.put(new Long(page.startPosition / PAGE_SIZE), page); /// private int IoRead(CachedIoAdapter.Page page) { int count = _io.Read(page._buffer); if (count > 0) { _filePointer = page._startAddress + count; } return count; } private void MovePageToHead(CachedIoAdapter.Page page) { if (page == _head) { return; } if (page == _tail) { CachedIoAdapter.Page tempTail = _tail._prev; tempTail._next = null; _tail._next = _head; _tail._prev = null; _head._prev = page; _head = _tail; _tail = tempTail; } else { page._prev._next = page._next; page._next._prev = page._prev; page._next = _head; _head._prev = page; page._prev = null; _head = page; } } /// private void WritePageToDisk(CachedIoAdapter.Page page) { ValidateReadOnly(); try { _io.Write(page._buffer, page.Size()); _filePointer = page.EndAddress(); page._dirty = false; } catch (Db4oIOException e) { _readOnly = true; throw; } } /// Moves the pointer to the specified file position /// position within the file /// public override void Seek(long pos) { _position = pos; } /// private void IoSeek(long pos) { if (_filePointer != pos) { _io.Seek(pos); _filePointer = pos; } } private class Page { internal byte[] _buffer; internal long _startAddress = -1; internal long _endAddress; internal readonly int _bufferSize; internal bool _dirty; internal CachedIoAdapter.Page _prev; internal CachedIoAdapter.Page _next; private byte[] zeroBytes; public Page(int size) { _bufferSize = size; _buffer = new byte[_bufferSize]; } internal virtual void EnsureEndAddress(long fileLength) { long bufferEndAddress = _startAddress + _bufferSize; if (_endAddress < bufferEndAddress && fileLength > _endAddress) { long newEndAddress = Math.Min(fileLength, bufferEndAddress); if (zeroBytes == null) { zeroBytes = new byte[_bufferSize]; } System.Array.Copy(zeroBytes, 0, _buffer, (int)(_endAddress - _startAddress), (int )(newEndAddress - _endAddress)); _endAddress = newEndAddress; } } internal virtual long EndAddress() { return _endAddress; } internal virtual void StartAddress(long address) { _startAddress = address; } internal virtual long StartAddress() { return _startAddress; } internal virtual void EndAddress(long address) { _endAddress = address; } internal virtual int Size() { return (int)(_endAddress - _startAddress); } internal virtual int Read(byte[] @out, int outOffset, long startAddress, int length ) { int bufferOffset = (int)(startAddress - _startAddress); int pageAvailbeDataSize = (int)(_endAddress - startAddress); int readBytes = Math.Min(pageAvailbeDataSize, length); if (readBytes <= 0) { // meaning reach EOF return -1; } System.Array.Copy(_buffer, bufferOffset, @out, outOffset, readBytes); return readBytes; } internal virtual int Write(byte[] data, int dataOffset, long startAddress, int length ) { int bufferOffset = (int)(startAddress - _startAddress); int pageAvailabeBufferSize = _bufferSize - bufferOffset; int writtenBytes = Math.Min(pageAvailabeBufferSize, length); System.Array.Copy(data, dataOffset, _buffer, bufferOffset, writtenBytes); long endAddress = startAddress + writtenBytes; if (endAddress > _endAddress) { _endAddress = endAddress; } _dirty = true; return writtenBytes; } internal virtual bool Contains(long address) { return (_startAddress != -1 && address >= _startAddress && address < _startAddress + _bufferSize); } internal virtual bool IsFree() { return _startAddress == -1; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/IGrowthStrategy.cs0000644000175000017500000000117011700531646026772 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.IO { /// Strategy for file/byte array growth. /// Strategy for file/byte array growth. public interface IGrowthStrategy { /// /// returns the incremented size after the growth /// strategy has been applied /// /// the original size /// /// the new size, after the growth strategy has been /// applied, must be bigger than curSize /// long NewSize(long curSize, long requiredSize); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/IStorage.cs0000644000175000017500000000331411700531646025403 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// /// Base interface for Storage adapters that open a /// IBin /// to store db4o database data to. /// /// public interface IStorage { /// /// opens a /// IBin /// to store db4o database data. /// /// IBin Open(BinConfiguration config); /// returns true if a Bin (file or memory) exists with the passed name. /// returns true if a Bin (file or memory) exists with the passed name. bool Exists(string uri); /// Deletes the bin for the given URI from the storage. /// Deletes the bin for the given URI from the storage. /// 7.9 /// bin URI /// if the bin could not be deleted void Delete(string uri); /// Renames the bin for the given old URI to the new URI. /// /// Renames the bin for the given old URI to the new URI. If a bin for the new URI /// exists, it will be overwritten. /// /// 7.9 /// URI of the existing bin /// future URI of the bin /// if the bin could not be deleted void Rename(string oldUri, string newUri); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/ThreadedSyncBin.cs0000644000175000017500000000650311700531646026677 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { public class ThreadedSyncBin : BinDecorator { private const int OneSecond = 1000; private volatile IRunnable _syncRunnable; private volatile bool _closed; private readonly Thread _thread; private readonly Lock4 _lock = new Lock4(); public ThreadedSyncBin(IBin bin) : base(bin) { _thread = new Thread(new _IRunnable_23(this), "ThreadedSyncBin"); _thread.Start(); } private sealed class _IRunnable_23 : IRunnable { public _IRunnable_23(ThreadedSyncBin _enclosing) { this._enclosing = _enclosing; } public void Run() { IClosure4 closure = new _IClosure4_25(this); while (true) { this._enclosing._lock.Run(closure); if (this._enclosing._closed) { return; } } } private sealed class _IClosure4_25 : IClosure4 { public _IClosure4_25(_IRunnable_23 _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing._enclosing.RunSyncRunnable(); this._enclosing._enclosing._lock.Snooze(Db4objects.Db4o.IO.ThreadedSyncBin.OneSecond ); return null; } private readonly _IRunnable_23 _enclosing; } private readonly ThreadedSyncBin _enclosing; } public override void Close() { WaitForPendingSync(); _closed = true; _lock.Run(new _IClosure4_46(this)); base.Close(); } private sealed class _IClosure4_46 : IClosure4 { public _IClosure4_46(ThreadedSyncBin _enclosing) { this._enclosing = _enclosing; } public object Run() { this._enclosing._lock.Awake(); return null; } private readonly ThreadedSyncBin _enclosing; } private void WaitForPendingSync() { while (_syncRunnable != null) { if (Thread.CurrentThread() == _thread) { return; } } } public override long Length() { WaitForPendingSync(); return base.Length(); } public override int Read(long position, byte[] buffer, int bytesToRead) { WaitForPendingSync(); return base.Read(position, buffer, bytesToRead); } public override void Write(long position, byte[] bytes, int bytesToWrite) { WaitForPendingSync(); base.Write(position, bytes, bytesToWrite); } public override void Sync() { WaitForPendingSync(); base.Sync(); } public override void Sync(IRunnable runnable) { WaitForPendingSync(); _lock.Run(new _IClosure4_85(this, runnable)); } private sealed class _IClosure4_85 : IClosure4 { public _IClosure4_85(ThreadedSyncBin _enclosing, IRunnable runnable) { this._enclosing = _enclosing; this.runnable = runnable; } public object Run() { this._enclosing._syncRunnable = runnable; this._enclosing._lock.Awake(); return null; } private readonly ThreadedSyncBin _enclosing; private readonly IRunnable runnable; } internal void RunSyncRunnable() { IRunnable runnable = _syncRunnable; if (runnable != null) { base.Sync(); runnable.Run(); base.Sync(); _syncRunnable = null; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/CachingBin.cs0000644000175000017500000002420511700531646025655 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal.Caching; using Sharpen; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// internal class CachingBin : BinDecorator { private readonly int _pageSize; private readonly ICache4 _cache; private readonly IObjectPool _pagePool; private long _fileLength; private sealed class _IProcedure4_22 : IProcedure4 { public _IProcedure4_22(CachingBin _enclosing) { this._enclosing = _enclosing; } public void Apply(object discardedPage) { this._enclosing.FlushPage(((CachingBin.Page)discardedPage)); this._enclosing._pagePool.ReturnObject(((CachingBin.Page)discardedPage)); } private readonly CachingBin _enclosing; } private IProcedure4 _onDiscardPage; /// public CachingBin(IBin bin, ICache4 cache, int pageCount, int pageSize) : base(bin ) { _onDiscardPage = new _IProcedure4_22(this); _producerFromDisk = new _IFunction4_138(this); _producerFromPool = new _IFunction4_147(this); _pageSize = pageSize; _pagePool = new SimpleObjectPool(NewPagePool(pageCount)); _cache = cache; _fileLength = _bin.Length(); } private CachingBin.Page[] NewPagePool(int pageCount) { CachingBin.Page[] pages = new CachingBin.Page[pageCount]; for (int i = 0; i < pages.Length; ++i) { pages[i] = new CachingBin.Page(_pageSize); } return pages; } /// Reads the file into the buffer using pages from cache. /// /// Reads the file into the buffer using pages from cache. If the next page /// is not cached it will be read from the file. /// /// /// /// start position to read /// /// destination buffer /// how many bytes to read /// public override int Read(long pos, byte[] buffer, int length) { return ReadInternal(pos, buffer, length, false); } private int ReadInternal(long pos, byte[] buffer, int length, bool syncRead) { long startAddress = pos; int bytesToRead = length; int totalRead = 0; while (bytesToRead > 0) { CachingBin.Page page = syncRead ? SyncReadPage(startAddress) : GetPage(startAddress , _producerFromDisk); int readBytes = page.Read(buffer, totalRead, startAddress, bytesToRead); if (readBytes <= 0) { break; } bytesToRead -= readBytes; startAddress += readBytes; totalRead += readBytes; } return totalRead == 0 ? -1 : totalRead; } /// Writes the buffer to cache using pages /// start position to write /// source buffer /// how many bytes to write /// public override void Write(long pos, byte[] buffer, int length) { long startAddress = pos; int bytesToWrite = length; int bufferOffset = 0; while (bytesToWrite > 0) { // page doesn't need to loadFromDisk if the whole page is dirty bool loadFromDisk = (bytesToWrite < _pageSize) || (startAddress % _pageSize != 0); CachingBin.Page page = GetPage(startAddress, loadFromDisk); int writtenBytes = page.Write(buffer, bufferOffset, startAddress, bytesToWrite); bytesToWrite -= writtenBytes; startAddress += writtenBytes; bufferOffset += writtenBytes; } long endAddress = startAddress; _fileLength = Math.Max(endAddress, _fileLength); } /// Flushes cache to a physical storage /// public override void Sync() { FlushAllPages(); base.Sync(); } public override void Sync(IRunnable runnable) { FlushAllPages(); base.Sync(new _IRunnable_119(this, runnable)); } private sealed class _IRunnable_119 : IRunnable { public _IRunnable_119(CachingBin _enclosing, IRunnable runnable) { this._enclosing = _enclosing; this.runnable = runnable; } public void Run() { runnable.Run(); this._enclosing.FlushAllPages(); } private readonly CachingBin _enclosing; private readonly IRunnable runnable; } public override int SyncRead(long position, byte[] bytes, int bytesToRead) { return ReadInternal(position, bytes, bytesToRead, true); } /// Returns the file length /// public override long Length() { return _fileLength; } private sealed class _IFunction4_138 : IFunction4 { public _IFunction4_138(CachingBin _enclosing) { this._enclosing = _enclosing; } public object Apply(object pageAddress) { // in case that page is not found in the cache CachingBin.Page newPage = ((CachingBin.Page)this._enclosing._pagePool.BorrowObject ()); this._enclosing.LoadPage(newPage, ((long)pageAddress)); return newPage; } private readonly CachingBin _enclosing; } internal readonly IFunction4 _producerFromDisk; private sealed class _IFunction4_147 : IFunction4 { public _IFunction4_147(CachingBin _enclosing) { this._enclosing = _enclosing; } public object Apply(object pageAddress) { // in case that page is not found in the cache CachingBin.Page newPage = ((CachingBin.Page)this._enclosing._pagePool.BorrowObject ()); this._enclosing.ResetPageAddress(newPage, ((long)pageAddress)); return newPage; } private readonly CachingBin _enclosing; } internal readonly IFunction4 _producerFromPool; /// private CachingBin.Page GetPage(long startAddress, bool loadFromDisk) { IFunction4 producer = loadFromDisk ? _producerFromDisk : _producerFromPool; return GetPage(startAddress, producer); } private CachingBin.Page GetPage(long startAddress, IFunction4 producer) { CachingBin.Page page = ((CachingBin.Page)_cache.Produce(PageAddressFor(startAddress ), producer, _onDiscardPage)); page.EnsureEndAddress(_fileLength); return page; } private CachingBin.Page SyncReadPage(long startAddress) { CachingBin.Page page = new CachingBin.Page(_pageSize); LoadPage(page, startAddress); page.EnsureEndAddress(_fileLength); return page; } private long PageAddressFor(long startAddress) { return (startAddress / _pageSize) * _pageSize; } private void ResetPageAddress(CachingBin.Page page, long startAddress) { page._startAddress = startAddress; page._endAddress = startAddress + _pageSize; } /// protected virtual void FlushAllPages() { for (IEnumerator pIter = _cache.GetEnumerator(); pIter.MoveNext(); ) { CachingBin.Page p = ((CachingBin.Page)pIter.Current); FlushPage(p); } } /// private void FlushPage(CachingBin.Page page) { if (!page._dirty) { return; } WritePageToDisk(page); } /// private void LoadPage(CachingBin.Page page, long pos) { long startAddress = pos - pos % _pageSize; page._startAddress = startAddress; int count = _bin.Read(page._startAddress, page._buffer, page._bufferSize); if (count > 0) { page._endAddress = startAddress + count; } else { page._endAddress = startAddress; } } /// private void WritePageToDisk(CachingBin.Page page) { base.Write(page._startAddress, page._buffer, page.Size()); page._dirty = false; } private class Page { public readonly byte[] _buffer; public long _startAddress = -1; public long _endAddress; public readonly int _bufferSize; public bool _dirty; private byte[] zeroBytes; public Page(int size) { _bufferSize = size; _buffer = new byte[_bufferSize]; } internal virtual void EnsureEndAddress(long fileLength) { long bufferEndAddress = _startAddress + _bufferSize; if (_endAddress < bufferEndAddress && fileLength > _endAddress) { long newEndAddress = Math.Min(fileLength, bufferEndAddress); if (zeroBytes == null) { zeroBytes = new byte[_bufferSize]; } System.Array.Copy(zeroBytes, 0, _buffer, (int)(_endAddress - _startAddress), (int )(newEndAddress - _endAddress)); _endAddress = newEndAddress; } } internal virtual int Size() { return (int)(_endAddress - _startAddress); } internal virtual int Read(byte[] @out, int outOffset, long startAddress, int length ) { int bufferOffset = (int)(startAddress - _startAddress); int pageAvailbeDataSize = (int)(_endAddress - startAddress); int readBytes = Math.Min(pageAvailbeDataSize, length); if (readBytes <= 0) { // meaning reach EOF return -1; } System.Array.Copy(_buffer, bufferOffset, @out, outOffset, readBytes); return readBytes; } internal virtual int Write(byte[] data, int dataOffset, long startAddress, int length ) { int bufferOffset = (int)(startAddress - _startAddress); int pageAvailabeBufferSize = _bufferSize - bufferOffset; int writtenBytes = Math.Min(pageAvailabeBufferSize, length); System.Array.Copy(data, dataOffset, _buffer, bufferOffset, writtenBytes); long endAddress = startAddress + writtenBytes; if (endAddress > _endAddress) { _endAddress = endAddress; } _dirty = true; return writtenBytes; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/IoAdapter.cs0000644000175000017500000001262011700531646025536 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// Base class for database file adapters, both for file and memory databases. /// /// Base class for database file adapters, both for file and memory databases. /// [System.ObsoleteAttribute(@"Use classes that implement instead. The new functionality has been split: is the factory class to open adapters. is the actual implementation of IO access." )] public abstract class IoAdapter { private const int CopySize = 4096; private int _blockSize; /// converts address and address offset to an absolute address protected long RegularAddress(int blockAddress, int blockAddressOffset) { if (0 == _blockSize) { throw new InvalidOperationException(); } return (long)blockAddress * _blockSize + blockAddressOffset; } /// copies a block within a file in block mode /// public virtual void BlockCopy(int oldAddress, int oldAddressOffset, int newAddress , int newAddressOffset, int length) { Copy(RegularAddress(oldAddress, oldAddressOffset), RegularAddress(newAddress, newAddressOffset ), length); } /// sets the read/write pointer in the file using block mode /// public virtual void BlockSeek(int address) { BlockSeek(address, 0); } /// sets the read/write pointer in the file using block mode /// public virtual void BlockSeek(int address, int offset) { Seek(RegularAddress(address, offset)); } /// outside call to set the block size of this adapter public virtual void BlockSize(int blockSize) { if (blockSize < 1) { throw new ArgumentException(); } _blockSize = blockSize; } /// implement to close the adapter /// public abstract void Close(); /// copies a block within a file in absolute mode /// public virtual void Copy(long oldAddress, long newAddress, int length) { if (DTrace.enabled) { DTrace.IoCopy.LogLength(newAddress, length); } if (length > CopySize) { byte[] buffer = new byte[CopySize]; int pos = 0; while (pos + CopySize < length) { Copy(buffer, oldAddress + pos, newAddress + pos); pos += CopySize; } oldAddress += pos; newAddress += pos; length -= pos; } Copy(new byte[length], oldAddress, newAddress); } /// private void Copy(byte[] buffer, long oldAddress, long newAddress) { Seek(oldAddress); Read(buffer); Seek(newAddress); Write(buffer); } /// deletes the given path from whatever 'file system' is addressed public abstract void Delete(string path); /// checks whether a file exists public abstract bool Exists(string path); /// implement to return the absolute length of the file /// public abstract long GetLength(); /// implement to open the file /// public abstract IoAdapter Open(string path, bool lockFile, long initialLength, bool readOnly); /// reads a buffer at the seeked address /// the number of bytes read and returned /// public virtual int Read(byte[] buffer) { return Read(buffer, buffer.Length); } /// implement to read a buffer at the seeked address /// public abstract int Read(byte[] bytes, int length); /// implement to set the read/write pointer in the file, absolute mode /// public abstract void Seek(long pos); /// implement to flush the file contents to storage /// public abstract void Sync(); /// writes a buffer to the seeked address /// public virtual void Write(byte[] bytes) { Write(bytes, bytes.Length); } /// implement to write a buffer at the seeked address /// public abstract void Write(byte[] buffer, int length); /// returns the block size currently used public virtual int BlockSize() { return _blockSize; } /// Delegated IO Adapter /// reference to itself public virtual IoAdapter DelegatedIoAdapter() { return this; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/BinDecorator.cs0000644000175000017500000000415711700531646026247 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// Wrapper baseclass for all classes that wrap Bin. /// /// Wrapper baseclass for all classes that wrap Bin. /// Each class that adds functionality to a Bin must /// extend this class to allow db4o to access the /// delegate instance with /// StorageDecorator.Decorate(BinConfiguration, IBin) /// /// . /// public class BinDecorator : IBin { protected readonly IBin _bin; /// Default constructor. /// Default constructor. /// /// the /// IBin /// that is to be wrapped. /// public BinDecorator(IBin bin) { _bin = bin; } /// /// closes the BinDecorator and the underlying /// IBin /// . /// public virtual void Close() { _bin.Close(); } /// public virtual long Length() { return _bin.Length(); } /// IBin.Read(long, byte[], int) public virtual int Read(long position, byte[] bytes, int bytesToRead) { return _bin.Read(position, bytes, bytesToRead); } /// IBin.Sync() public virtual void Sync() { _bin.Sync(); } /// IBin.SyncRead(long, byte[], int) /// public virtual int SyncRead(long position, byte[] bytes, int bytesToRead) { return _bin.SyncRead(position, bytes, bytesToRead); } /// IBin.Write(long, byte[], int) public virtual void Write(long position, byte[] bytes, int bytesToWrite) { _bin.Write(position, bytes, bytesToWrite); } public virtual void Sync(IRunnable runnable) { _bin.Sync(runnable); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/PagingMemoryBin.cs0000644000175000017500000000617511700531646026725 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.IO; using Sharpen; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// internal class PagingMemoryBin : IBin { private readonly int _pageSize; private IList _pages = new ArrayList(); private int _lastPageLength; public PagingMemoryBin(int pageSize) : this(pageSize, 0) { } public PagingMemoryBin(int pageSize, long initialLength) { _pageSize = pageSize; EnsureLength(initialLength); } public virtual long Length() { if (_pages.Count == 0) { return 0; } return (_pages.Count - 1) * _pageSize + _lastPageLength; } /// public virtual int Read(long pos, byte[] buffer, int length) { long avail = Length() - pos; if (avail <= 0) { return -1; } int bytesToRead = Math.Min((int)avail, length); int offset = PageOffset(pos); int pageIdx = PageIdx(pos); int bytesRead = 0; while (bytesRead < bytesToRead) { byte[] curPage = ((byte[])_pages[pageIdx]); int chunkLength = Math.Min(length - bytesRead, _pageSize - offset); System.Array.Copy(curPage, offset, buffer, bytesRead, chunkLength); bytesRead += chunkLength; pageIdx++; offset = 0; } return bytesToRead; } /// public virtual void Sync() { } public virtual int SyncRead(long position, byte[] bytes, int bytesToRead) { return Read(position, bytes, bytesToRead); } public virtual void Close() { } /// public virtual void Write(long pos, byte[] buffer, int length) { EnsureLength(pos + length); int offset = PageOffset(pos); int pageIdx = PageIdx(pos); int bytesWritten = 0; while (bytesWritten < length) { byte[] curPage = ((byte[])_pages[pageIdx]); int chunkLength = Math.Min(length - bytesWritten, _pageSize - offset); System.Array.Copy(buffer, bytesWritten, curPage, offset, chunkLength); bytesWritten += chunkLength; pageIdx++; offset = 0; } } private void EnsureLength(long length) { if (length <= 0) { return; } long lastPos = length - 1; int lastPosPageIdx = PageIdx(lastPos); int lastPosPageLength = PageOffset(lastPos) + 1; if (lastPosPageIdx == _pages.Count - 1) { _lastPageLength = Math.Max(lastPosPageLength, _lastPageLength); return; } if (lastPosPageIdx < _pages.Count) { return; } for (int newPageIdx = _pages.Count; newPageIdx <= lastPosPageIdx; newPageIdx++) { _pages.Add(new byte[_pageSize]); } _lastPageLength = lastPosPageLength; } private int PageIdx(long pos) { return (int)(pos / _pageSize); } private int PageOffset(long pos) { return (int)(pos % _pageSize); } public virtual void Sync(IRunnable runnable) { runnable.Run(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/CachingStorage.cs0000644000175000017500000000625011700531646026551 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.IO { /// /// Caching storage adapter to cache db4o database data in memory /// until the underlying /// IBin /// is instructed to flush its /// data when /// IBin.Sync() /// is called.

/// You can override the /// NewCache() /// method if you want to /// work with a different caching strategy. ///
public class CachingStorage : StorageDecorator { private static int DefaultPageCount = 64; private static int DefaultPageSize = 1024; private int _pageCount; private int _pageSize; /// /// default constructor to create a Caching storage with the default /// page count of 64 and the default page size of 1024. /// /// /// default constructor to create a Caching storage with the default /// page count of 64 and the default page size of 1024. /// /// /// the /// IStorage /// to be cached. /// public CachingStorage(IStorage storage) : this(storage, DefaultPageCount, DefaultPageSize ) { } /// /// constructor to set up a CachingStorage with a configured page count /// and page size /// /// /// the /// IStorage /// to be cached. /// /// the number of pages the cache should use. /// the size of the pages the cache should use. public CachingStorage(IStorage storage, int pageCount, int pageSize) : base(storage ) { _pageCount = pageCount; _pageSize = pageSize; } /// opens a Bin for the given URI. /// opens a Bin for the given URI. /// public override IBin Open(BinConfiguration config) { IBin storage = base.Open(config); if (config.ReadOnly()) { return new ReadOnlyBin(new CachingStorage.NonFlushingCachingBin(storage, NewCache (), _pageCount, _pageSize)); } return new CachingBin(storage, NewCache(), _pageCount, _pageSize); } /// /// override this method if you want to work with a different caching /// strategy than the default LRU2Q cache. /// /// /// override this method if you want to work with a different caching /// strategy than the default LRU2Q cache. /// protected virtual ICache4 NewCache() { return CacheFactory.NewLRULongCache(_pageCount); } private sealed class NonFlushingCachingBin : CachingBin { /// public NonFlushingCachingBin(IBin bin, ICache4 cache, int pageCount, int pageSize ) : base(bin, cache, pageCount, pageSize) { } protected override void FlushAllPages() { } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/FileStorage.cs0000644000175000017500000001107011700531646026070 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation.IO; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Sharpen.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// /// Storage adapter to store db4o database data to physical /// files on hard disc. /// /// /// Storage adapter to store db4o database data to physical /// files on hard disc. /// public class FileStorage : IStorage { /// /// opens a /// IBin /// on the specified URI (file system path). /// /// public virtual IBin Open(BinConfiguration config) { return new FileStorage.FileBin(config); } /// returns true if the specified file system path already exists. /// returns true if the specified file system path already exists. public virtual bool Exists(string uri) { Sharpen.IO.File file = new Sharpen.IO.File(uri); return file.Exists() && file.Length() > 0; } public class FileBin : IBin { private readonly string _path; private RandomAccessFile _file; /// public FileBin(BinConfiguration config) { bool ok = false; try { _path = new Sharpen.IO.File(config.Uri()).GetCanonicalPath(); _file = RandomAccessFileFactory.NewRandomAccessFile(_path, config.ReadOnly(), config .LockFile()); if (config.InitialLength() > 0) { Write(config.InitialLength() - 1, new byte[] { 0 }, 1); } ok = true; } catch (IOException e) { throw new Db4oIOException(e); } finally { if (!ok) { Close(); } } } /// public virtual void Close() { Platform4.UnlockFile(_path, _file); try { if (!IsClosed()) { _file.Close(); } } catch (IOException e) { throw new Db4oIOException(e); } finally { _file = null; } } internal virtual bool IsClosed() { return _file == null; } /// public virtual long Length() { try { return _file.Length(); } catch (IOException e) { throw new Db4oIOException(e); } } /// public virtual int Read(long pos, byte[] bytes, int length) { try { Seek(pos); if (DTrace.enabled) { DTrace.FileRead.LogLength(pos, length); } return _file.Read(bytes, 0, length); } catch (IOException e) { throw new Db4oIOException(e); } } /// internal virtual void Seek(long pos) { if (DTrace.enabled) { DTrace.RegularSeek.Log(pos); } _file.Seek(pos); } /// public virtual void Sync() { try { _file.GetFD().Sync(); } catch (IOException e) { throw new Db4oIOException(e); } } public virtual int SyncRead(long position, byte[] bytes, int bytesToRead) { return Read(position, bytes, bytesToRead); } /// public virtual void Write(long pos, byte[] buffer, int length) { CheckClosed(); try { Seek(pos); if (DTrace.enabled) { DTrace.FileWrite.LogLength(pos, length); } _file.Write(buffer, 0, length); } catch (IOException e) { throw new Db4oIOException(e); } } private void CheckClosed() { if (IsClosed()) { throw new Db4oIOException(); } } public virtual void Sync(IRunnable runnable) { Sync(); runnable.Run(); Sync(); } } /// public virtual void Delete(string uri) { File4.Delete(uri); } /// public virtual void Rename(string oldUri, string newUri) { System.IO.File.Move(oldUri, newUri); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/IoAdapterStorage.cs0000644000175000017500000000434711700531646027072 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// public class IoAdapterStorage : IStorage { private readonly IoAdapter _io; public IoAdapterStorage(IoAdapter io) { _io = io; } public virtual bool Exists(string uri) { return _io.Exists(uri); } /// public virtual IBin Open(BinConfiguration config) { IoAdapterStorage.IoAdapterBin bin = new IoAdapterStorage.IoAdapterBin(_io.Open(config .Uri(), config.LockFile(), config.InitialLength(), config.ReadOnly())); ((IBlockSize)Environments.My(typeof(IBlockSize))).Register(bin); return bin; } internal class IoAdapterBin : IBin, IListener4 { private readonly IoAdapter _io; public IoAdapterBin(IoAdapter io) { _io = io; } public virtual void Close() { _io.Close(); } public virtual long Length() { return _io.GetLength(); } public virtual int Read(long position, byte[] buffer, int bytesToRead) { _io.Seek(position); return _io.Read(buffer, bytesToRead); } public virtual void Sync() { _io.Sync(); } public virtual int SyncRead(long position, byte[] bytes, int bytesToRead) { return Read(position, bytes, bytesToRead); } public virtual void Write(long position, byte[] bytes, int bytesToWrite) { _io.Seek(position); _io.Write(bytes, bytesToWrite); } public virtual void BlockSize(int blockSize) { _io.BlockSize(blockSize); } public virtual void OnEvent(object @event) { BlockSize((((int)@event))); } public virtual void Sync(IRunnable runnable) { Sync(); runnable.Run(); Sync(); } } /// public virtual void Delete(string uri) { _io.Delete(uri); } /// public virtual void Rename(string oldUri, string newUri) { throw new NotImplementedException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/StorageDecorator.cs0000644000175000017500000000241511700531646027136 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// Wrapper base class for all classes that wrap Storage. /// /// Wrapper base class for all classes that wrap Storage. /// Each class that adds functionality to a Storage must /// extend this class. /// /// public class StorageDecorator : IStorage { protected readonly IStorage _storage; public StorageDecorator(IStorage storage) { _storage = storage; } public virtual bool Exists(string uri) { return _storage.Exists(uri); } /// public virtual IBin Open(BinConfiguration config) { return Decorate(config, _storage.Open(config)); } protected virtual IBin Decorate(BinConfiguration config, IBin bin) { return bin; } /// public virtual void Delete(string uri) { _storage.Delete(uri); } /// public virtual void Rename(string oldUri, string newUri) { _storage.Rename(oldUri, newUri); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/BlockAwareBin.cs0000644000175000017500000001415411700531646026335 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// public class BlockAwareBin : BinDecorator { private const int CopySize = 4096; private bool _readOnly; private readonly IBlockSize _blockSize = ((IBlockSize)Environments.My(typeof(IBlockSize ))); public BlockAwareBin(IBin bin) : base(bin) { } /// converts address and address offset to an absolute address protected long RegularAddress(int blockAddress, int blockAddressOffset) { if (0 == BlockSize()) { throw new InvalidOperationException(); } return (long)blockAddress * BlockSize() + blockAddressOffset; } /// copies a block within a file in block mode /// public virtual void BlockCopy(int oldAddress, int oldAddressOffset, int newAddress , int newAddressOffset, int length) { Copy(RegularAddress(oldAddress, oldAddressOffset), RegularAddress(newAddress, newAddressOffset ), length); } /// copies a block within a file in absolute mode /// public virtual void Copy(long oldAddress, long newAddress, int length) { if (DTrace.enabled) { DTrace.IoCopy.LogLength(newAddress, length); } if (length > CopySize) { byte[] buffer = new byte[CopySize]; int pos = 0; while (pos + CopySize < length) { Copy(buffer, oldAddress + pos, newAddress + pos); pos += CopySize; } oldAddress += pos; newAddress += pos; length -= pos; } Copy(new byte[length], oldAddress, newAddress); } /// private void Copy(byte[] buffer, long oldAddress, long newAddress) { Read(oldAddress, buffer); Write(oldAddress, buffer); } /// reads a buffer at the seeked address /// the number of bytes read and returned /// public virtual int BlockRead(int address, int offset, byte[] buffer) { return BlockRead(address, offset, buffer, buffer.Length); } /// implement to read a buffer at the seeked address /// public virtual int BlockRead(int address, int offset, byte[] bytes, int length) { return Read(RegularAddress(address, offset), bytes, length); } /// reads a buffer at the seeked address /// the number of bytes read and returned /// public virtual int BlockRead(int address, byte[] buffer) { return BlockRead(address, 0, buffer, buffer.Length); } /// implement to read a buffer at the seeked address /// public virtual int BlockRead(int address, byte[] bytes, int length) { return BlockRead(address, 0, bytes, length); } /// reads a buffer at the seeked address /// the number of bytes read and returned /// public virtual int Read(long pos, byte[] buffer) { return Read(pos, buffer, buffer.Length); } /// reads a buffer at the seeked address /// the number of bytes read and returned /// public virtual void BlockWrite(int address, int offset, byte[] buffer) { BlockWrite(address, offset, buffer, buffer.Length); } /// implement to read a buffer at the seeked address /// public virtual void BlockWrite(int address, int offset, byte[] bytes, int length) { Write(RegularAddress(address, offset), bytes, length); } /// reads a buffer at the seeked address /// the number of bytes read and returned /// public virtual void BlockWrite(int address, byte[] buffer) { BlockWrite(address, 0, buffer, buffer.Length); } /// implement to read a buffer at the seeked address /// public virtual void BlockWrite(int address, byte[] bytes, int length) { BlockWrite(address, 0, bytes, length); } public override void Sync() { ValidateReadOnly(); try { base.Sync(); } catch (Db4oIOException e) { _readOnly = true; throw; } } public override void Sync(IRunnable runnable) { ValidateReadOnly(); try { base.Sync(runnable); } catch (Db4oIOException e) { _readOnly = true; throw; } } /// writes a buffer to the seeked address /// public virtual void Write(long pos, byte[] bytes) { ValidateReadOnly(); try { Write(pos, bytes, bytes.Length); } catch (Db4oIOException e) { _readOnly = true; throw; } } private void ValidateReadOnly() { if (_readOnly) { throw new EmergencyShutdownReadOnlyException(); } } /// returns the block size currently used public virtual int BlockSize() { return _blockSize.Value(); } /// outside call to set the block size of this adapter public virtual void BlockSize(int blockSize) { if (blockSize < 1) { throw new ArgumentException(); } _blockSize.Set(blockSize); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/BinConfiguration.cs0000644000175000017500000000243011700531646027124 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.IO { /// public class BinConfiguration { private readonly string _uri; private readonly bool _lockFile; private readonly long _initialLength; private readonly bool _readOnly; private readonly int _blockSize; public BinConfiguration(string uri, bool lockFile, long initialLength, bool readOnly ) : this(uri, lockFile, initialLength, readOnly, 1) { } public BinConfiguration(string uri, bool lockFile, long initialLength, bool readOnly , int blockSize) { _uri = uri; _lockFile = lockFile; _initialLength = initialLength; _readOnly = readOnly; _blockSize = blockSize; } public virtual string Uri() { return _uri; } public virtual bool LockFile() { return _lockFile; } public virtual long InitialLength() { return _initialLength; } public virtual bool ReadOnly() { return _readOnly; } public virtual int BlockSize() { return _blockSize; } public override string ToString() { return "BinConfiguration(Uri: " + _uri + ", Locked: " + _lockFile + ", ReadOnly: " + _readOnly + ", BlockSize: " + _blockSize + ")"; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/VanillaIoAdapter.cs0000644000175000017500000000355311700531646027052 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// base class for IoAdapters that delegate to other IoAdapters (decorator pattern) /// [System.ObsoleteAttribute(@"use / instead.")] public abstract class VanillaIoAdapter : IoAdapter { protected IoAdapter _delegate; public VanillaIoAdapter(IoAdapter delegateAdapter) { _delegate = delegateAdapter; } /// protected VanillaIoAdapter(IoAdapter delegateAdapter, string path, bool lockFile, long initialLength, bool readOnly) : this(delegateAdapter.Open(path, lockFile, initialLength , readOnly)) { } /// public override void Close() { _delegate.Close(); } public override void Delete(string path) { _delegate.Delete(path); } public override bool Exists(string path) { return _delegate.Exists(path); } /// public override long GetLength() { return _delegate.GetLength(); } /// public override int Read(byte[] bytes, int length) { return _delegate.Read(bytes, length); } /// public override void Seek(long pos) { _delegate.Seek(pos); } /// public override void Sync() { _delegate.Sync(); } /// public override void Write(byte[] buffer, int length) { _delegate.Write(buffer, length); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/DoublingGrowthStrategy.cs0000644000175000017500000000105311700531646030345 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// Strategy for file/byte array growth that will always double the current size /// public class DoublingGrowthStrategy : IGrowthStrategy { public virtual long NewSize(long curSize, long requiredSize) { if (curSize == 0) { return requiredSize; } long newSize = curSize; while (newSize < requiredSize) { newSize *= 2; } return newSize; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/IBin.cs0000644000175000017500000000527211700531646024514 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// /// Representation of a container for storage of db4o /// database data (to file, to memory). /// /// /// Representation of a container for storage of db4o /// database data (to file, to memory). /// public interface IBin { /// returns the length of the Bin (on disc, in memory). /// returns the length of the Bin (on disc, in memory). long Length(); /// /// reads a given number of bytes into an array of bytes at an /// offset position. /// /// /// reads a given number of bytes into an array of bytes at an /// offset position. /// /// the offset position to read at /// the byte array to read bytes into /// the number of bytes to be read /// int Read(long position, byte[] bytes, int bytesToRead); /// /// writes a given number of bytes from an array of bytes at /// an offset position /// /// the offset position to write at /// the array of bytes to write /// the number of bytes to write void Write(long position, byte[] bytes, int bytesToWrite); /// /// flushes the buffer content to the physical storage /// media. /// /// /// flushes the buffer content to the physical storage /// media. /// void Sync(); /// runs the Runnable between two calls to sync(); void Sync(IRunnable runnable); /// /// reads a given number of bytes into an array of bytes at an /// offset position. /// /// /// reads a given number of bytes into an array of bytes at an /// offset position. In contrast to the normal /// Read(long, byte[], int) /// method, the Bin should ensure direct access to the raw storage medium. /// No caching should take place. /// /// the offset position to read at /// the byte array to read bytes into /// the number of bytes to be read /// int SyncRead(long position, byte[] bytes, int bytesToRead); /// closes the Bin. /// closes the Bin. void Close(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/ReadOnlyBin.cs0000644000175000017500000000064511700531646026040 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// public class ReadOnlyBin : BinDecorator { public ReadOnlyBin(IBin storage) : base(storage) { } public override void Write(long position, byte[] bytes, int bytesToWrite) { throw new Db4oIOException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/BlockAwareBinWindow.cs0000644000175000017500000000466211700531646027530 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// Bounded handle into an IoAdapter: Can only access a restricted area. /// Bounded handle into an IoAdapter: Can only access a restricted area. /// public class BlockAwareBinWindow { private BlockAwareBin _bin; private int _blockOff; private int _len; private bool _disabled; /// The delegate I/O adapter /// The block offset address into the I/O adapter that maps to the start index (0) of this window /// /// The size of this window in bytes public BlockAwareBinWindow(BlockAwareBin io, int blockOff, int len) { _bin = io; _blockOff = blockOff; _len = len; _disabled = false; } /// Size of this I/O adapter window in bytes. public virtual int Length() { return _len; } /// Offset in bytes relative to the window start /// Data to write into the window starting from the given offset /// /// public virtual void Write(int off, byte[] data) { CheckBounds(off, data); _bin.BlockWrite(_blockOff + off, data); } /// Offset in bytes relative to the window start /// Data buffer to read from the window starting from the given offset /// /// /// public virtual int Read(int off, byte[] data) { CheckBounds(off, data); return _bin.BlockRead(_blockOff + off, data); } /// Disable IO Adapter Window public virtual void Disable() { _disabled = true; } /// Flush IO Adapter Window public virtual void Flush() { if (!_disabled) { _bin.Sync(); } } private void CheckBounds(int off, byte[] data) { if (_disabled) { throw new InvalidOperationException(); } if (data == null || off < 0 || off + data.Length > _len) { throw new ArgumentException(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/IBlockSize.cs0000644000175000017500000000113211700531646025660 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.IO { /// Block size registry. /// /// Block size registry. /// Accessible through the environment. /// /// Db4objects.Db4o.Foundation.Environments.My(System.Type<T>) /// /// 7.7 public interface IBlockSize { void Register(IListener4 listener); void Set(int newValue); int Value(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/ConstantGrowthStrategy.cs0000644000175000017500000000153711700531646030402 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// Strategy for file/byte array growth by a constant factor public class ConstantGrowthStrategy : IGrowthStrategy { private readonly int _growth; /// The constant growth size public ConstantGrowthStrategy(int growth) { _growth = growth; } /// /// returns the incremented size after the growth /// strategy has been applied /// /// the original size /// the new size public virtual long NewSize(long curSize, long requiredSize) { long newSize = curSize; while (newSize < requiredSize) { newSize += _growth; } return newSize; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/RandomAccessFileAdapter.cs0000644000175000017500000000727011700531646030336 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Sharpen.IO; namespace Db4objects.Db4o.IO { /// IO adapter for random access files. /// IO adapter for random access files. [System.ObsoleteAttribute(@"Use instead.")] public class RandomAccessFileAdapter : IoAdapter { private string _path; private RandomAccessFile _delegate; public RandomAccessFileAdapter() { } /// protected RandomAccessFileAdapter(string path, bool lockFile, long initialLength, bool readOnly) { bool ok = false; try { _path = new Sharpen.IO.File(path).GetCanonicalPath(); _delegate = RandomAccessFileFactory.NewRandomAccessFile(_path, readOnly, lockFile ); if (initialLength > 0) { _delegate.Seek(initialLength - 1); _delegate.Write(new byte[] { 0 }); } ok = true; } catch (IOException e) { throw new Db4oIOException(e); } finally { if (!ok) { Close(); } } } /// public override void Close() { // FIXME: This is a temporary quickfix for a bug in Android. // Remove after Android has been fixed. try { if (_delegate != null) { _delegate.Seek(0); } } catch (IOException) { } // ignore Platform4.UnlockFile(_path, _delegate); try { if (_delegate != null) { _delegate.Close(); } } catch (IOException e) { throw new Db4oIOException(e); } } public override void Delete(string path) { new Sharpen.IO.File(path).Delete(); } public override bool Exists(string path) { Sharpen.IO.File existingFile = new Sharpen.IO.File(path); return existingFile.Exists() && existingFile.Length() > 0; } /// public override long GetLength() { try { return _delegate.Length(); } catch (IOException e) { throw new Db4oIOException(e); } } /// public override IoAdapter Open(string path, bool lockFile, long initialLength, bool readOnly) { return new Db4objects.Db4o.IO.RandomAccessFileAdapter(path, lockFile, initialLength , readOnly); } /// public override int Read(byte[] bytes, int length) { try { return _delegate.Read(bytes, 0, length); } catch (IOException e) { throw new Db4oIOException(e); } } /// public override void Seek(long pos) { if (DTrace.enabled) { DTrace.RegularSeek.Log(pos); } try { _delegate.Seek(pos); } catch (IOException e) { throw new Db4oIOException(e); } } /// public override void Sync() { try { _delegate.GetFD().Sync(); } catch (IOException e) { throw new Db4oIOException(e); } } /// public override void Write(byte[] buffer, int length) { try { _delegate.Write(buffer, 0, length); } catch (IOException e) { throw new Db4oIOException(e); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IO/SynchronizedBin.cs0000644000175000017500000000177511700531646027007 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// public class SynchronizedBin : BinDecorator { public SynchronizedBin(IBin bin) : base(bin) { } public override void Close() { lock (_bin) { base.Close(); } } public override long Length() { lock (_bin) { return base.Length(); } } public override int Read(long position, byte[] buffer, int bytesToRead) { lock (_bin) { return base.Read(position, buffer, bytesToRead); } } public override void Write(long position, byte[] bytes, int bytesToWrite) { lock (_bin) { base.Write(position, bytes, bytesToWrite); } } public override void Sync() { lock (_bin) { base.Sync(); } } public override void Sync(IRunnable runnable) { lock (_bin) { base.Sync(runnable); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Rename.cs0000644000175000017500000000146211700531646024570 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o { /// /// Renaming actions are stored to the database file to make /// sure that they are only performed once. /// /// /// Renaming actions are stored to the database file to make /// sure that they are only performed once. /// /// /// public sealed class Rename : IInternal4 { public string rClass; public string rFrom; public string rTo; public Rename() { } public Rename(string aClass, string aFrom, string aTo) { rClass = aClass; rFrom = aFrom; rTo = aTo; } public bool IsField() { return rClass.Length != 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/0000755000175000017500000000000011700531646024413 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/0000755000175000017500000000000011700531646025303 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/AbstractReflectArray.cs0000644000175000017500000000700511700531646031703 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect; using Sharpen.Lang.Reflect; namespace Db4objects.Db4o.Reflect.Core { /// public abstract class AbstractReflectArray : IReflectArray { protected readonly IReflector _reflector; public AbstractReflectArray(IReflector reflector) { _reflector = reflector; } public abstract object NewInstance(IReflectClass componentType, int[] dimensions); public abstract object NewInstance(IReflectClass componentType, int length); public virtual int[] Dimensions(object arr) { int count = 0; IReflectClass claxx = _reflector.ForObject(arr); while (claxx.IsArray()) { count++; claxx = claxx.GetComponentType(); } int[] dim = new int[count]; for (int i = 0; i < count; i++) { try { dim[i] = GetLength(arr); arr = Get(arr, 0); } catch (Exception) { return dim; } } return dim; } public virtual int Flatten(object a_shaped, int[] a_dimensions, int a_currentDimension , object[] a_flat, int a_flatElement) { if (a_currentDimension == (a_dimensions.Length - 1)) { for (int i = 0; i < a_dimensions[a_currentDimension]; i++) { a_flat[a_flatElement++] = GetNoExceptions(a_shaped, i); } } else { for (int i = 0; i < a_dimensions[a_currentDimension]; i++) { a_flatElement = Flatten(GetNoExceptions(a_shaped, i), a_dimensions, a_currentDimension + 1, a_flat, a_flatElement); } } return a_flatElement; } public virtual object Get(object onArray, int index) { return Sharpen.Runtime.GetArrayValue(onArray, index); } public virtual IReflectClass GetComponentType(IReflectClass a_class) { while (a_class.IsArray()) { a_class = a_class.GetComponentType(); } return a_class; } public virtual int GetLength(object array) { return Sharpen.Runtime.GetArrayLength(array); } private object GetNoExceptions(object onArray, int index) { try { return Get(onArray, index); } catch (Exception) { return null; } } public virtual bool IsNDimensional(IReflectClass a_class) { return a_class.GetComponentType().IsArray(); } public virtual void Set(object onArray, int index, object element) { if (element == null) { try { Sharpen.Runtime.SetArrayValue(onArray, index, element); } catch (Exception) { } } else { // This can happen on primitive arrays // and we are fine with ignoring it. // TODO: check if it's a primitive array first and don't ignore exceptions Sharpen.Runtime.SetArrayValue(onArray, index, element); } } public virtual int Shape(object[] a_flat, int a_flatElement, object a_shaped, int [] a_dimensions, int a_currentDimension) { if (a_currentDimension == (a_dimensions.Length - 1)) { for (int i = 0; i < a_dimensions[a_currentDimension]; i++) { Set(a_shaped, i, a_flat[a_flatElement++]); } } else { for (int i = 0; i < a_dimensions[a_currentDimension]; i++) { a_flatElement = Shape(a_flat, a_flatElement, Get(a_shaped, i), a_dimensions, a_currentDimension + 1); } } return a_flatElement; } public abstract void Analyze(object arg1, ArrayInfo arg2); public abstract object NewInstance(IReflectClass arg1, ArrayInfo arg2); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/PlatformReflectConstructor.cs0000644000175000017500000000131011700531646033164 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Reflect.Core { public class PlatformReflectConstructor : IReflectConstructor { private static readonly IReflectClass[] ParameterTypes = new IReflectClass[] { }; private Type _clazz; public PlatformReflectConstructor(Type clazz) { _clazz = clazz; } public virtual IReflectClass[] GetParameterTypes() { return ParameterTypes; } public virtual object NewInstance(object[] parameters) { return ReflectPlatform.CreateInstance(_clazz); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/ReflectorUtils.cs0000644000175000017500000000252411700531646030603 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect.Core { /// public class ReflectorUtils { public static IReflectClass ReflectClassFor(IReflector reflector, object clazz) { if (clazz is IReflectClass) { return (IReflectClass)clazz; } if (clazz is Type) { return reflector.ForClass((Type)clazz); } if (clazz is string) { return reflector.ForName((string)clazz); } return reflector.ForObject(clazz); } public static IReflectField Field(IReflectClass claxx, string name) { while (claxx != null) { try { return claxx.GetDeclaredField(name); } catch (Exception) { } claxx = claxx.GetSuperclass(); } return null; } public static void ForEachField(IReflectClass claxx, IProcedure4 procedure) { while (claxx != null) { IReflectField[] declaredFields = claxx.GetDeclaredFields(); for (int reflectFieldIndex = 0; reflectFieldIndex < declaredFields.Length; ++reflectFieldIndex) { IReflectField reflectField = declaredFields[reflectFieldIndex]; procedure.Apply(reflectField); } claxx = claxx.GetSuperclass(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/ConstructorSupport.cs0000644000175000017500000000723211700531646031560 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Reflect.Core { public class ConstructorSupport { public static ReflectConstructorSpec CreateConstructor(IConstructorAwareReflectClass claxx, Type clazz, IReflectorConfiguration config, IReflectConstructor[] constructors ) { if (claxx == null) { return ReflectConstructorSpec.InvalidConstructor; } if (claxx.IsAbstract() || claxx.IsInterface()) { return ReflectConstructorSpec.InvalidConstructor; } if (!Platform4.CallConstructor()) { bool skipConstructor = !config.CallConstructor(claxx); if (!claxx.IsCollection()) { IReflectConstructor serializableConstructor = SkipConstructor(claxx, skipConstructor , config.TestConstructors()); if (serializableConstructor != null) { return new ReflectConstructorSpec(serializableConstructor, null); } } } if (!config.TestConstructors()) { return new ReflectConstructorSpec(new PlatformReflectConstructor(clazz), null); } if (ReflectPlatform.CreateInstance(clazz) != null) { return new ReflectConstructorSpec(new PlatformReflectConstructor(clazz), null); } Tree sortedConstructors = SortConstructorsByParamsCount(constructors); return FindConstructor(claxx, sortedConstructors); } private static ReflectConstructorSpec FindConstructor(IReflectClass claxx, Tree sortedConstructors ) { if (sortedConstructors == null) { return ReflectConstructorSpec.InvalidConstructor; } IEnumerator iter = new TreeNodeIterator(sortedConstructors); while (iter.MoveNext()) { object current = iter.Current; IReflectConstructor constructor = (IReflectConstructor)((TreeIntObject)current)._object; object[] args = NullArgumentsFor(constructor); object res = constructor.NewInstance(args); if (res != null) { return new ReflectConstructorSpec(constructor, args); } } return ReflectConstructorSpec.InvalidConstructor; } private static object[] NullArgumentsFor(IReflectConstructor constructor) { IReflectClass[] paramTypes = constructor.GetParameterTypes(); object[] @params = new object[paramTypes.Length]; for (int j = 0; j < @params.Length; j++) { @params[j] = paramTypes[j].NullValue(); } return @params; } private static Tree SortConstructorsByParamsCount(IReflectConstructor[] constructors ) { Tree sortedConstructors = null; // sort constructors by parameter count for (int i = 0; i < constructors.Length; i++) { int parameterCount = constructors[i].GetParameterTypes().Length; sortedConstructors = Tree.Add(sortedConstructors, new TreeIntObject(i + constructors .Length * parameterCount, constructors[i])); } return sortedConstructors; } public static IReflectConstructor SkipConstructor(IConstructorAwareReflectClass claxx , bool skipConstructor, bool testConstructor) { if (!skipConstructor) { return null; } IReflectConstructor serializableConstructor = claxx.GetSerializableConstructor(); if (serializableConstructor == null) { return null; } if (!testConstructor || Deploy.csharp) { return serializableConstructor; } object obj = serializableConstructor.NewInstance((object[])null); if (obj != null) { return serializableConstructor; } return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/ReflectConstructorSpec.cs0000644000175000017500000000400011700531646032271 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Reflect.Core { /// /// a spec holding a constructor, it's arguments /// and information, if the constructor can instantiate /// objects. /// /// /// a spec holding a constructor, it's arguments /// and information, if the constructor can instantiate /// objects. /// public class ReflectConstructorSpec { private IReflectConstructor _constructor; private object[] _args; private TernaryBool _canBeInstantiated; public static readonly Db4objects.Db4o.Reflect.Core.ReflectConstructorSpec UnspecifiedConstructor = new Db4objects.Db4o.Reflect.Core.ReflectConstructorSpec(TernaryBool.Unspecified ); public static readonly Db4objects.Db4o.Reflect.Core.ReflectConstructorSpec InvalidConstructor = new Db4objects.Db4o.Reflect.Core.ReflectConstructorSpec(TernaryBool.No); public ReflectConstructorSpec(IReflectConstructor constructor, object[] args) { _constructor = constructor; _args = args; _canBeInstantiated = TernaryBool.Yes; } private ReflectConstructorSpec(TernaryBool canBeInstantiated) { _canBeInstantiated = canBeInstantiated; _constructor = null; } /// creates a new instance. /// creates a new instance. /// the newly created instance. public virtual object NewInstance() { if (_constructor == null) { return null; } return _constructor.NewInstance(_args); } /// /// returns true if an instance can be instantiated /// with the constructor, otherwise false. /// /// /// returns true if an instance can be instantiated /// with the constructor, otherwise false. /// public virtual TernaryBool CanBeInstantiated() { return _canBeInstantiated; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/IReflectConstructor.cs0000644000175000017500000000103111700531646031570 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect.Core { /// Reflection Constructor representation. /// /// Reflection Constructor representation ///

See documentation for System.Reflection API. ///
/// IReflector public interface IReflectConstructor { IReflectClass[] GetParameterTypes(); object NewInstance(object[] parameters); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Core/IConstructorAwareReflectClass.cs0000644000175000017500000000046711700531646033552 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Reflect.Core { public interface IConstructorAwareReflectClass : IReflectClass { IReflectConstructor GetSerializableConstructor(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflectClass.cs0000644000175000017500000000465611700531646027440 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// Reflection Class representation. /// /// Reflection Class representation ///

See documentation for System.Reflection API. ///
/// IReflector public interface IReflectClass { IReflectClass GetComponentType(); IReflectField[] GetDeclaredFields(); IReflectField GetDeclaredField(string name); /// Returns the ReflectClass instance being delegated to. /// /// Returns the ReflectClass instance being delegated to. /// If there's no delegation it should return this. /// /// delegate or this IReflectClass GetDelegate(); IReflectMethod GetMethod(string methodName, IReflectClass[] paramClasses); string GetName(); IReflectClass GetSuperclass(); bool IsAbstract(); bool IsArray(); bool IsAssignableFrom(IReflectClass type); bool IsCollection(); bool IsInstance(object obj); bool IsInterface(); bool IsPrimitive(); object NewInstance(); IReflector Reflector(); object NullValue(); /// /// Calling this method may change the internal state of the class, even if a usable /// constructor has been found on earlier invocations. /// /// /// Calling this method may change the internal state of the class, even if a usable /// constructor has been found on earlier invocations. /// /// true, if instances of this class can be created, false otherwise bool EnsureCanBeInstantiated(); /// /// We need this for replication, to find out if a class needs to be traversed /// or if it simply can be copied across. /// /// /// We need this for replication, to find out if a class needs to be traversed /// or if it simply can be copied across. For now we will simply return /// the classes that are /// IsPrimitive() /// and /// Db4objects.Db4o.Internal.Platform4.IsSimple(System.Type<T>) /// /// We can think about letting users add an Immutable annotation. /// bool IsImmutable(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflectField.cs0000644000175000017500000000273211700531646027407 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// Reflection Field representation. /// /// Reflection Field representation ///

See documentation for System.Reflection API. ///
/// IReflector public interface IReflectField { object Get(object onObject); string GetName(); /// /// The ReflectClass returned by this method should have been /// provided by the parent reflector. /// /// /// The ReflectClass returned by this method should have been /// provided by the parent reflector. /// /// the ReflectClass representing the field type as provided by the parent reflector /// IReflectClass GetFieldType(); bool IsPublic(); bool IsStatic(); bool IsTransient(); void Set(object onObject, object value); /// /// The ReflectClass returned by this method should have been /// provided by the parent reflector. /// /// /// The ReflectClass returned by this method should have been /// provided by the parent reflector. /// /// the ReflectClass representing the index type as provided by the parent reflector /// IReflectClass IndexType(); object IndexEntry(object orig); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/ArrayInfo.cs0000644000175000017500000000171111700531646026634 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// public class ArrayInfo { private int _elementCount; private bool _primitive; private bool _nullable; private IReflectClass _reflectClass; public virtual int ElementCount() { return _elementCount; } public virtual void ElementCount(int count) { _elementCount = count; } public virtual bool Primitive() { return _primitive; } public virtual void Primitive(bool flag) { _primitive = flag; } public virtual bool Nullable() { return _nullable; } public virtual void Nullable(bool flag) { _nullable = flag; } public virtual IReflectClass ReflectClass() { return _reflectClass; } public virtual void ReflectClass(IReflectClass claxx) { _reflectClass = claxx; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflectClassPredicate.cs0000644000175000017500000000142111700531646031244 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// Predicate representation. /// Predicate representation. /// Db4objects.Db4o.Query.Predicate /// IReflector public interface IReflectClassPredicate { /// Match method definition. /// /// Match method definition. Used to select correct /// results from an object set. /// /// item to be matched to the criteria /// true, if the requirements are met bool Match(IReflectClass item); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/MultidimensionalArrayInfo.cs0000644000175000017500000000063511700531646032076 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// public class MultidimensionalArrayInfo : ArrayInfo { private int[] _dimensions; public virtual void Dimensions(int[] dim) { _dimensions = dim; } public virtual int[] Dimensions() { return _dimensions; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflectorConfiguration.cs0000644000175000017500000000041611700531646031531 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { public interface IReflectorConfiguration { bool TestConstructors(); bool CallConstructor(IReflectClass clazz); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflectArray.cs0000644000175000017500000000225711700531646027444 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// Reflection Array representation. /// /// Reflection Array representation ///

See documentation for System.Reflection API. ///
/// IReflector public interface IReflectArray { void Analyze(object obj, ArrayInfo info); int[] Dimensions(object arr); int Flatten(object a_shaped, int[] a_dimensions, int a_currentDimension, object[] a_flat, int a_flatElement); object Get(object onArray, int index); IReflectClass GetComponentType(IReflectClass a_class); int GetLength(object array); bool IsNDimensional(IReflectClass a_class); object NewInstance(IReflectClass componentType, ArrayInfo info); object NewInstance(IReflectClass componentType, int length); object NewInstance(IReflectClass componentType, int[] dimensions); void Set(object onArray, int index, object element); int Shape(object[] a_flat, int a_flatElement, object a_shaped, int[] a_dimensions , int a_currentDimension); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/0000755000175000017500000000000011700531646025767 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericClass.cs0000644000175000017500000002001711700531646030660 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericClass : IReflectClass, IDeepClone { private static readonly GenericField[] NoFields = new GenericField[0]; private readonly GenericReflector _reflector; private readonly IReflectClass _delegate; private readonly string _name; private Db4objects.Db4o.Reflect.Generic.GenericClass _superclass; private Db4objects.Db4o.Reflect.Generic.GenericClass _array; private bool _isPrimitive; private int _isCollection; protected IGenericConverter _converter; private GenericField[] _fields = NoFields; private int _declaredFieldCount = -1; private int _fieldCount = -1; private readonly int _hashCode; public GenericClass(GenericReflector reflector, IReflectClass delegateClass, string name, Db4objects.Db4o.Reflect.Generic.GenericClass superclass) { _reflector = reflector; _delegate = delegateClass; _name = name; _superclass = superclass; _hashCode = _name.GetHashCode(); } public virtual Db4objects.Db4o.Reflect.Generic.GenericClass ArrayClass() { if (_array != null) { return _array; } _array = new GenericArrayClass(_reflector, this, _name, _superclass); return _array; } public virtual object DeepClone(object obj) { GenericReflector reflector = (GenericReflector)obj; Db4objects.Db4o.Reflect.Generic.GenericClass superClass = null; if (_superclass != null) { _superclass = (Db4objects.Db4o.Reflect.Generic.GenericClass)reflector.ForName(_superclass .GetName()); } Db4objects.Db4o.Reflect.Generic.GenericClass ret = new Db4objects.Db4o.Reflect.Generic.GenericClass (reflector, _delegate, _name, superClass); GenericField[] fields = new GenericField[_fields.Length]; for (int i = 0; i < fields.Length; i++) { fields[i] = (GenericField)_fields[i].DeepClone(reflector); } ret.InitFields(fields); return ret; } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } Db4objects.Db4o.Reflect.Generic.GenericClass otherGC = (Db4objects.Db4o.Reflect.Generic.GenericClass )obj; if (_hashCode != otherGC.GetHashCode()) { return false; } return _name.Equals(otherGC._name); } public virtual IReflectClass GetComponentType() { if (_delegate != null) { return _delegate.GetComponentType(); } return null; } // TODO: consider that classes may have two fields of // the same name after refactoring. public virtual IReflectField GetDeclaredField(string name) { if (_delegate != null) { return _delegate.GetDeclaredField(name); } for (int i = 0; i < _fields.Length; i++) { if (_fields[i].GetName().Equals(name)) { return _fields[i]; } } return null; } public virtual IReflectField[] GetDeclaredFields() { if (_delegate != null) { return _delegate.GetDeclaredFields(); } return _fields; } public virtual IReflectClass GetDelegate() { if (_delegate != null) { return _delegate; } return this; } internal virtual int GetFieldCount() { if (_fieldCount != -1) { return _fieldCount; } _fieldCount = 0; if (_superclass != null) { _fieldCount = _superclass.GetFieldCount(); } if (_declaredFieldCount == -1) { _declaredFieldCount = GetDeclaredFields().Length; } _fieldCount += _declaredFieldCount; return _fieldCount; } public virtual IReflectMethod GetMethod(string methodName, IReflectClass[] paramClasses ) { if (_delegate != null) { return _delegate.GetMethod(methodName, paramClasses); } return null; } public virtual string GetName() { return _name; } public virtual IReflectClass GetSuperclass() { if (_superclass != null) { return _superclass; } if (_delegate == null) { return _reflector.ForClass(typeof(object)); } IReflectClass delegateSuperclass = _delegate.GetSuperclass(); if (delegateSuperclass != null) { _superclass = _reflector.EnsureDelegate(delegateSuperclass); } return _superclass; } public override int GetHashCode() { return _hashCode; } public virtual void InitFields(GenericField[] fields) { int startIndex = 0; if (_superclass != null) { startIndex = _superclass.GetFieldCount(); } _fields = fields; for (int i = 0; i < _fields.Length; i++) { _fields[i].SetIndex(startIndex + i); } } // TODO: Consider: Will this method still be necessary // once constructor logic is pushed into the reflectors? public virtual bool IsAbstract() { if (_delegate != null) { return _delegate.IsAbstract(); } return false; } public virtual bool IsArray() { if (_delegate != null) { return _delegate.IsArray(); } return false; } public virtual bool IsAssignableFrom(IReflectClass subclassCandidate) { if (subclassCandidate == null) { return false; } if (Equals(subclassCandidate)) { return true; } if (_delegate != null) { if (subclassCandidate is Db4objects.Db4o.Reflect.Generic.GenericClass) { subclassCandidate = ((Db4objects.Db4o.Reflect.Generic.GenericClass)subclassCandidate ).GetDelegate(); } return _delegate.IsAssignableFrom(subclassCandidate); } if (!(subclassCandidate is Db4objects.Db4o.Reflect.Generic.GenericClass)) { return false; } return IsAssignableFrom(subclassCandidate.GetSuperclass()); } public virtual bool IsCollection() { if (_isCollection == 1) { return true; } if (_isCollection == -1) { return false; } _isCollection = _reflector.IsCollection(this) ? 1 : -1; return IsCollection(); } public virtual bool IsInstance(object candidate) { if (_delegate != null) { return _delegate.IsInstance(candidate); } if (!(candidate is GenericObject)) { return false; } return IsAssignableFrom(((GenericObject)candidate)._class); } public virtual bool IsInterface() { if (_delegate != null) { return _delegate.IsInterface(); } return false; } public virtual bool IsPrimitive() { if (_delegate != null) { return _delegate.IsPrimitive(); } return _isPrimitive; } public virtual object NewInstance() { if (_delegate != null) { return _delegate.NewInstance(); } return new GenericObject(this); } public virtual IReflector Reflector() { if (_delegate != null) { return _delegate.Reflector(); } return _reflector; } internal virtual void SetConverter(IGenericConverter converter) { _converter = converter; } internal virtual void SetDeclaredFieldCount(int count) { _declaredFieldCount = count; } internal virtual void SetPrimitive() { _isPrimitive = true; } public override string ToString() { return "GenericClass " + _name; } public virtual string ToString(object obj) { if (_converter == null) { return "(G) " + GetName(); } return _converter.ToString((GenericObject)obj); } public virtual bool EnsureCanBeInstantiated() { if (_delegate != null) { return _delegate.EnsureCanBeInstantiated(); } return true; } public virtual object NullValue() { if (_delegate == null) { return null; } return _delegate.NullValue(); } public virtual bool IsImmutable() { if (_delegate != null) { return _delegate.IsImmutable(); } return IsPrimitive(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericVirtualField.cs0000644000175000017500000000164211700531646032210 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericVirtualField : GenericField { public GenericVirtualField(string name) : base(name, null, false) { } public override object DeepClone(object obj) { return new Db4objects.Db4o.Reflect.Generic.GenericVirtualField(GetName()); } public override object Get(object onObject) { return null; } public override IReflectClass GetFieldType() { return null; } public override bool IsPublic() { return false; } public override bool IsStatic() { return true; } public override bool IsTransient() { return true; } public override void Set(object onObject, object value) { } // do nothing } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericObject.cs0000644000175000017500000000232311700531646031021 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericObject : IComparable { internal readonly GenericClass _class; private object[] _values; public GenericObject(GenericClass clazz) { _class = clazz; } private void EnsureValuesInitialized() { if (_values == null) { _values = new object[_class.GetFieldCount()]; } } public virtual void Set(int index, object value) { EnsureValuesInitialized(); _values[index] = value; } /// /// the value of the field at index, based on the fields obtained GenericClass.getDeclaredFields /// public virtual object Get(int index) { EnsureValuesInitialized(); return _values[index]; } public override string ToString() { if (_class == null) { return base.ToString(); } return _class.ToString(this); } public virtual GenericClass GetGenericClass() { return _class; } public virtual int CompareTo(object o) { return 0; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/IGenericConverter.cs0000644000175000017500000000046711700531646031702 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public interface IGenericConverter { string ToString(GenericObject obj); string ToString(GenericArray array); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericArrayReflector.cs0000644000175000017500000000576411700531646032553 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericArrayReflector : IReflectArray { private readonly IReflectArray _delegate; public GenericArrayReflector(GenericReflector reflector) { _delegate = reflector.GetDelegate().Array(); } public virtual void Analyze(object obj, ArrayInfo info) { _delegate.Analyze(obj, info); } public virtual int[] Dimensions(object arr) { return _delegate.Dimensions(arr); } public virtual int Flatten(object a_shaped, int[] a_dimensions, int a_currentDimension , object[] a_flat, int a_flatElement) { return _delegate.Flatten(a_shaped, a_dimensions, a_currentDimension, a_flat, a_flatElement ); } public virtual object Get(object onArray, int index) { if (onArray is GenericArray) { return ((GenericArray)onArray)._data[index]; } return _delegate.Get(onArray, index); } public virtual IReflectClass GetComponentType(IReflectClass claxx) { claxx = claxx.GetDelegate(); if (claxx is GenericClass) { return claxx; } return _delegate.GetComponentType(claxx); } public virtual int GetLength(object array) { if (array is GenericArray) { return ((GenericArray)array).GetLength(); } return _delegate.GetLength(array); } public virtual bool IsNDimensional(IReflectClass a_class) { if (a_class is GenericArrayClass) { return false; } return _delegate.IsNDimensional(a_class.GetDelegate()); } public virtual object NewInstance(IReflectClass componentType, ArrayInfo info) { componentType = componentType.GetDelegate(); if (componentType is GenericClass) { int length = info.ElementCount(); return new GenericArray(((GenericClass)componentType).ArrayClass(), length); } return _delegate.NewInstance(componentType, info); } public virtual object NewInstance(IReflectClass componentType, int length) { componentType = componentType.GetDelegate(); if (componentType is GenericClass) { return new GenericArray(((GenericClass)componentType).ArrayClass(), length); } return _delegate.NewInstance(componentType, length); } public virtual object NewInstance(IReflectClass componentType, int[] dimensions) { return _delegate.NewInstance(componentType.GetDelegate(), dimensions); } public virtual void Set(object onArray, int index, object element) { if (onArray is GenericArray) { ((GenericArray)onArray)._data[index] = element; return; } _delegate.Set(onArray, index, element); } public virtual int Shape(object[] a_flat, int a_flatElement, object a_shaped, int [] a_dimensions, int a_currentDimension) { return _delegate.Shape(a_flat, a_flatElement, a_shaped, a_dimensions, a_currentDimension ); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/IReflectClassBuilder.cs0000644000175000017500000000111711700531646032310 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect.Generic { /// public interface IReflectClassBuilder { IReflectClass CreateClass(string name, IReflectClass superClass, int fieldCount); IReflectField CreateField(IReflectClass parentType, string fieldName, IReflectClass fieldType, bool isVirtual, bool isPrimitive, bool isArray, bool isNArray); void InitFields(IReflectClass clazz, IReflectField[] fields); IReflectField[] FieldArray(int length); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericField.cs0000644000175000017500000000423211700531646030637 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericField : IReflectField, IDeepClone { private readonly string _name; private readonly GenericClass _type; private readonly bool _primitive; private int _index = -1; public GenericField(string name, IReflectClass clazz, bool primitive) { _name = name; _type = (GenericClass)clazz; _primitive = primitive; } public virtual object DeepClone(object obj) { IReflector reflector = (IReflector)obj; IReflectClass newReflectClass = null; if (_type != null) { newReflectClass = reflector.ForName(_type.GetName()); } return new Db4objects.Db4o.Reflect.Generic.GenericField(_name, newReflectClass, _primitive ); } public virtual object Get(object onObject) { //TODO Consider: Do we need to check that onObject is an instance of the DataClass this field is a member of? return ((GenericObject)onObject).Get(_index); } public virtual string GetName() { return _name; } public virtual IReflectClass GetFieldType() { return _type; } public virtual bool IsPublic() { return true; } public virtual bool IsPrimitive() { return _primitive; } public virtual bool IsStatic() { //FIXME Consider static fields. return false; } public virtual bool IsTransient() { return false; } public virtual void Set(object onObject, object value) { // FIXME: Consider enabling type checking. // The following will fail with arrays. // if (!_type.isInstance(value)) throw new RuntimeException(); //TODO Consider: is this checking really necessary? ((GenericObject)onObject).Set(_index, value); } internal virtual void SetIndex(int index) { _index = index; } public virtual object IndexEntry(object orig) { return orig; } public virtual IReflectClass IndexType() { return GetFieldType(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericArray.cs0000644000175000017500000000140411700531646030670 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericArray { internal GenericClass _clazz; internal object[] _data; public GenericArray(GenericClass clazz, int size) { _clazz = clazz; _data = new object[size]; } public virtual IEnumerator Iterator() { return Iterators.Iterate(_data); } internal virtual int GetLength() { return _data.Length; } public override string ToString() { if (_clazz == null) { return base.ToString(); } return _clazz.ToString(this); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/KnownClassesRepository.cs0000644000175000017500000002321411700531646033032 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class KnownClassesRepository { private static readonly Hashtable4 Primitives; static KnownClassesRepository() { Primitives = new Hashtable4(); Type[] primitiveArray = Platform4.PrimitiveTypes(); for (int primitiveIndex = 0; primitiveIndex < primitiveArray.Length; ++primitiveIndex) { Type primitive = primitiveArray[primitiveIndex]; RegisterPrimitive(primitive); } } private static void RegisterPrimitive(Type primitive) { Primitives.Put(ReflectPlatform.FullyQualifiedName(Platform4.NullableTypeFor(primitive )), primitive); } private ObjectContainerBase _stream; private Transaction _trans; private IReflectClassBuilder _builder; private readonly ListenerRegistry _listeners = ListenerRegistry.NewInstance(); private readonly Hashtable4 _classByName = new Hashtable4(); private readonly Hashtable4 _classByID = new Hashtable4(); private Collection4 _pendingClasses = new Collection4(); private readonly Collection4 _classes = new Collection4(); public KnownClassesRepository(IReflectClassBuilder builder) { _builder = builder; } public virtual void SetTransaction(Transaction trans) { if (trans != null) { _trans = trans; _stream = trans.Container(); } } public virtual void Register(IReflectClass clazz) { Register(clazz.GetName(), clazz); } public virtual IReflectClass ForID(int id) { lock (_stream.Lock()) { if (_stream.Handlers.IsSystemHandler(id)) { return _stream.Handlers.ClassForID(id); } return EnsureClassAvailability(id); } } public virtual IReflectClass ForName(string className) { IReflectClass clazz = LookupByName(className); if (clazz != null) { return clazz; } if (_stream == null) { return null; } lock (_stream.Lock()) { if (_stream.ClassCollection() == null) { return null; } int classID = _stream.ClassMetadataIdForName(className); if (classID <= 0) { return null; } return InitializeClass(classID, className); } } private IReflectClass InitializeClass(int classID, string className) { IReflectClass newClazz = EnsureClassInitialised(classID); _classByName.Put(className, newClazz); return newClazz; } private void ReadAll() { ForEachClassId(new _IProcedure4_102(this)); ForEachClassId(new _IProcedure4_105(this)); } private sealed class _IProcedure4_102 : IProcedure4 { public _IProcedure4_102(KnownClassesRepository _enclosing) { this._enclosing = _enclosing; } public void Apply(object id) { this._enclosing.EnsureClassAvailability((((int)id))); } private readonly KnownClassesRepository _enclosing; } private sealed class _IProcedure4_105 : IProcedure4 { public _IProcedure4_105(KnownClassesRepository _enclosing) { this._enclosing = _enclosing; } public void Apply(object id) { this._enclosing.EnsureClassRead((((int)id))); } private readonly KnownClassesRepository _enclosing; } private void ForEachClassId(IProcedure4 procedure) { for (IEnumerator ids = _stream.ClassCollection().Ids(); ids.MoveNext(); ) { procedure.Apply((int)ids.Current); } } private IReflectClass EnsureClassAvailability(int id) { if (id == 0) { return null; } IReflectClass ret = (IReflectClass)_classByID.Get(id); if (ret != null) { return ret; } ByteArrayBuffer classreader = _stream.ReadStatefulBufferById(_trans, id); ClassMarshaller marshaller = MarshallerFamily()._class; RawClassSpec spec = marshaller.ReadSpec(_trans, classreader); string className = spec.Name(); ret = LookupByName(className); if (ret != null) { _classByID.Put(id, ret); _pendingClasses.Add(id); return ret; } ReportMissingClass(className); ret = _builder.CreateClass(className, EnsureClassAvailability(spec.SuperClassID() ), spec.NumFields()); // step 1 only add to _classByID, keep the class out of _classByName and _classes _classByID.Put(id, ret); _pendingClasses.Add(id); return ret; } private void ReportMissingClass(string className) { _stream.Handlers.DiagnosticProcessor().ClassMissed(className); } private void EnsureClassRead(int id) { IReflectClass clazz = LookupByID(id); ByteArrayBuffer classreader = _stream.ReadStatefulBufferById(_trans, id); ClassMarshaller classMarshaller = MarshallerFamily()._class; RawClassSpec classInfo = classMarshaller.ReadSpec(_trans, classreader); string className = classInfo.Name(); // Having the class in the _classByName Map for now indicates // that the class is fully read. This is breakable if we start // returning GenericClass'es in other methods like forName // even if a native class has not been found if (LookupByName(className) != null) { return; } // step 2 add the class to _classByName and _classes to denote reading is completed Register(className, clazz); int numFields = classInfo.NumFields(); IReflectField[] fields = _builder.FieldArray(numFields); IFieldMarshaller fieldMarshaller = MarshallerFamily()._field; for (int i = 0; i < numFields; i++) { RawFieldSpec fieldInfo = fieldMarshaller.ReadSpec(_stream, classreader); string fieldName = fieldInfo.Name(); IReflectClass fieldClass = ReflectClassForFieldSpec(fieldInfo, _stream.Reflector( )); if (null == fieldClass && (fieldInfo.IsField() && !fieldInfo.IsVirtual())) { throw new InvalidOperationException("Could not read field type for '" + className + "." + fieldName + "'"); } fields[i] = _builder.CreateField(clazz, fieldName, fieldClass, fieldInfo.IsVirtual (), fieldInfo.IsPrimitive(), fieldInfo.IsArray(), fieldInfo.IsNArray()); } _builder.InitFields(clazz, fields); } private void Register(string className, IReflectClass clazz) { if (LookupByName(className) != null) { throw new ArgumentException(); } _classByName.Put(className, clazz); _classes.Add(clazz); _listeners.NotifyListeners(clazz); } private IReflectClass ReflectClassForFieldSpec(RawFieldSpec fieldInfo, IReflector reflector) { if (fieldInfo.IsVirtualField()) { return VirtualFieldByName(fieldInfo.Name()).ClassReflector(reflector); } int fieldTypeID = fieldInfo.FieldTypeID(); switch (fieldTypeID) { case Handlers4.UntypedId: { // need to take care of special handlers here return ObjectClass(); } case Handlers4.AnyArrayId: { return ArrayClass(ObjectClass()); } default: { IReflectClass fieldClass = ForID(fieldTypeID); if (null != fieldClass) { return NormalizeFieldClass(fieldInfo, fieldClass); } break; break; } } return null; } private IReflectClass NormalizeFieldClass(RawFieldSpec fieldInfo, IReflectClass fieldClass ) { // TODO: why the following line is necessary? IReflectClass theClass = _stream.Reflector().ForName(fieldClass.GetName()); if (fieldInfo.IsPrimitive()) { theClass = PrimitiveClass(theClass); } if (fieldInfo.IsArray()) { theClass = ArrayClass(theClass); } return theClass; } private IReflectClass ObjectClass() { return _stream.Reflector().ForClass(typeof(object)); } private VirtualFieldMetadata VirtualFieldByName(string fieldName) { return _stream.Handlers.VirtualFieldByName(fieldName); } private Db4objects.Db4o.Internal.Marshall.MarshallerFamily MarshallerFamily() { return Db4objects.Db4o.Internal.Marshall.MarshallerFamily.ForConverterVersion(_stream .ConverterVersion()); } private IReflectClass EnsureClassInitialised(int id) { IReflectClass ret = EnsureClassAvailability(id); while (_pendingClasses.Size() > 0) { Collection4 pending = _pendingClasses; _pendingClasses = new Collection4(); IEnumerator i = pending.GetEnumerator(); while (i.MoveNext()) { EnsureClassRead(((int)i.Current)); } } return ret; } public virtual IEnumerator Classes() { ReadAll(); return _classes.GetEnumerator(); } public virtual void Register(int id, IReflectClass clazz) { _classByID.Put(id, clazz); } public virtual IReflectClass LookupByID(int id) { return (IReflectClass)_classByID.Get(id); } public virtual IReflectClass LookupByName(string name) { return (IReflectClass)_classByName.Get(name); } private IReflectClass ArrayClass(IReflectClass clazz) { object proto = clazz.Reflector().Array().NewInstance(clazz, 0); return clazz.Reflector().ForObject(proto); } private IReflectClass PrimitiveClass(IReflectClass baseClass) { Type primitive = (Type)Primitives.Get(baseClass.GetName()); if (primitive != null) { return baseClass.Reflector().ForClass(primitive); } return baseClass; } public virtual void AddListener(IListener4 listener) { _listeners.Register(listener); } public virtual void RemoveListener(IListener4 listener) { _listeners.Remove(listener); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericReflector.cs0000644000175000017500000003661311700531646031551 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Reflect.Generic; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// /// db4o provides GenericReflector as a wrapper around specific /// reflector (delegate). /// /// /// db4o provides GenericReflector as a wrapper around specific /// reflector (delegate). GenericReflector is set when an /// ObjectContainer is opened. All subsequent reflector /// calls are routed through this interface.

/// An instance of GenericReflector can be obtained through /// Db4objects.Db4o.Ext.IExtObjectContainer.Reflector() /// /// .

/// GenericReflector keeps list of known classes in memory. /// When the GenericReflector is called, it first checks its list of /// known classes. If the class cannot be found, the task is /// transferred to the delegate reflector. If the delegate fails as /// well, generic objects are created, which hold simulated /// "field values" in an array of objects.

/// Generic reflector makes possible the following usecases:
    ///
  • running a db4o server without deploying application classes;
  • ///
  • running db4o on Java dialects without reflection (J2ME CLDC, MIDP);
  • ///
  • easier access to stored objects where classes or fields are not available;
  • ///
  • running refactorings in the reflector;
  • ///
  • building interfaces to db4o from any programming language.
///

/// One of the live usecases is ObjectManager, which uses GenericReflector /// to read C# objects from Java. ///
public class GenericReflector : IReflector, IDeepClone { private KnownClassesRepository _repository; private IReflector _delegate; private GenericArrayReflector _array; private Collection4 _collectionPredicates = new Collection4(); private readonly Hashtable4 _classByClass = new Hashtable4(); private Transaction _trans; private ObjectContainerBase _stream; /// Creates an instance of GenericReflector /// transaction /// /// delegate reflector, /// providing specific reflector functionality. For example /// public GenericReflector(Transaction trans, IReflector delegateReflector) { // todo: Why have this when there is already the _repository by name? Redundant _repository = new KnownClassesRepository(new GenericClassBuilder(this, delegateReflector )); SetTransaction(trans); _delegate = delegateReflector; if (_delegate != null) { _delegate.SetParent(this); } } public GenericReflector(IReflector delegateReflector) : this(null, delegateReflector ) { } /// Creates a clone of provided object /// object to copy /// copy of the submitted object public virtual object DeepClone(object obj) { Db4objects.Db4o.Reflect.Generic.GenericReflector myClone = new Db4objects.Db4o.Reflect.Generic.GenericReflector (null, (IReflector)_delegate.DeepClone(this)); myClone._collectionPredicates = (Collection4)_collectionPredicates.DeepClone(myClone ); // Interesting, adding the following messes things up. // Keep the code, since it may make sense to carry the // global reflectors into a running db4o session. // Iterator4 i = _classes.iterator(); // while(i.hasNext()){ // GenericClass clazz = (GenericClass)i.next(); // clazz = (GenericClass)clazz.deepClone(myClone); // myClone._classByName.put(clazz.getName(), clazz); // myClone._classes.add(clazz); // } return myClone; } internal virtual ObjectContainerBase GetStream() { return _stream; } /// If there is a transaction assosiated with the current refector. /// If there is a transaction assosiated with the current refector. /// true if there is a transaction assosiated with the current refector. public virtual bool HasTransaction() { return _trans != null; } /// Associated a transaction with the current reflector. /// Associated a transaction with the current reflector. /// public virtual void SetTransaction(Transaction trans) { if (trans != null) { _trans = trans; _stream = trans.Container(); } _repository.SetTransaction(trans); } /// generic reflect array instance. public virtual IReflectArray Array() { if (_array == null) { _array = new GenericArrayReflector(this); } return _array; } internal virtual Db4objects.Db4o.Reflect.Generic.GenericClass EnsureDelegate(IReflectClass clazz) { if (clazz == null) { return null; } Db4objects.Db4o.Reflect.Generic.GenericClass claxx = (Db4objects.Db4o.Reflect.Generic.GenericClass )_repository.LookupByName(clazz.GetName()); if (claxx == null) { // We don't have to worry about the superclass, it can be null // because handling is delegated anyway claxx = GenericClass(clazz); _repository.Register(claxx); } return claxx; } private Db4objects.Db4o.Reflect.Generic.GenericClass GenericClass(IReflectClass clazz ) { Db4objects.Db4o.Reflect.Generic.GenericClass ret; string name = clazz.GetName(); if (name.Equals(ReflectPlatform.FullyQualifiedName(typeof(GenericArray)))) { // special case, comparing name because can't compare class == class directly with ReflectClass ret = new GenericArrayClass(this, clazz, name, null); } else { ret = new Db4objects.Db4o.Reflect.Generic.GenericClass(this, clazz, name, null); } return ret; } /// Returns a ReflectClass instance for the specified class /// class /// a ReflectClass instance for the specified class /// Db4objects.Db4o.Reflect.IReflectClass /// public virtual IReflectClass ForClass(Type clazz) { if (clazz == null) { return null; } IReflectClass claxx = (IReflectClass)_classByClass.Get(clazz); if (claxx != null) { return claxx; } if (!clazz.IsArray && ReflectPlatform.IsNamedClass(clazz)) { claxx = ForName(ReflectPlatform.FullyQualifiedName(clazz)); if (claxx != null) { _classByClass.Put(clazz, claxx); return claxx; } } claxx = _delegate.ForClass(clazz); if (claxx == null) { return null; } claxx = EnsureDelegate(claxx); _classByClass.Put(clazz, claxx); return claxx; } /// Returns a ReflectClass instance for the specified class name /// class name /// a ReflectClass instance for the specified class name /// Db4objects.Db4o.Reflect.IReflectClass /// public virtual IReflectClass ForName(string className) { return ((IReflectClass)WithLock(new _IClosure4_190(this, className))); } private sealed class _IClosure4_190 : IClosure4 { public _IClosure4_190(GenericReflector _enclosing, string className) { this._enclosing = _enclosing; this.className = className; } public object Run() { IReflectClass clazz = this._enclosing._repository.LookupByName(className); if (clazz != null) { return clazz; } clazz = this._enclosing._delegate.ForName(className); if (clazz != null) { return this._enclosing.EnsureDelegate(clazz); } return this._enclosing._repository.ForName(className); } private readonly GenericReflector _enclosing; private readonly string className; } /// Returns a ReflectClass instance for the specified class object /// class object /// a ReflectClass instance for the specified class object /// Db4objects.Db4o.Reflect.IReflectClass /// public virtual IReflectClass ForObject(object obj) { if (obj is GenericObject) { return ForGenericObject((GenericObject)obj); } if (obj is GenericArray) { return ((GenericArray)obj)._clazz; } return _delegate.ForObject(obj); } private IReflectClass ForGenericObject(GenericObject genericObject) { Db4objects.Db4o.Reflect.Generic.GenericClass claxx = genericObject._class; if (claxx == null) { throw new InvalidOperationException(); } string name = claxx.GetName(); if (name == null) { throw new InvalidOperationException(); } Db4objects.Db4o.Reflect.Generic.GenericClass existingClass = (Db4objects.Db4o.Reflect.Generic.GenericClass )ForName(name); if (existingClass == null) { _repository.Register(claxx); return claxx; } // TODO: Using .equals() here would be more consistent with // the equals() method in GenericClass. if (existingClass != claxx) { throw new InvalidOperationException(); } return claxx; } /// Returns delegate reflector /// delegate reflector public virtual IReflector GetDelegate() { return _delegate; } /// Determines if a candidate ReflectClass is a collection /// candidate ReflectClass /// true if a candidate ReflectClass is a collection. public virtual bool IsCollection(IReflectClass candidate) { //candidate = candidate.getDelegate(); IEnumerator i = _collectionPredicates.GetEnumerator(); while (i.MoveNext()) { if (((IReflectClassPredicate)i.Current).Match(candidate)) { return true; } } return _delegate.IsCollection(candidate.GetDelegate()); } //TODO: will need knowledge for .NET collections here // possibility: call registercollection with strings /// Register a class as a collection /// class to be registered public virtual void RegisterCollection(Type clazz) { RegisterCollection(ClassPredicate(clazz)); } /// Register a predicate as a collection /// predicate to be registered public virtual void RegisterCollection(IReflectClassPredicate predicate) { _collectionPredicates.Add(predicate); } private IReflectClassPredicate ClassPredicate(Type clazz) { IReflectClass collectionClass = ForClass(clazz); IReflectClassPredicate predicate = new _IReflectClassPredicate_290(collectionClass ); return predicate; } private sealed class _IReflectClassPredicate_290 : IReflectClassPredicate { public _IReflectClassPredicate_290(IReflectClass collectionClass) { this.collectionClass = collectionClass; } public bool Match(IReflectClass candidate) { return collectionClass.IsAssignableFrom(candidate); } private readonly IReflectClass collectionClass; } /// Register a class /// class public virtual void Register(Db4objects.Db4o.Reflect.Generic.GenericClass clazz) { WithLock(new _IClosure4_303(this, clazz)); } private sealed class _IClosure4_303 : IClosure4 { public _IClosure4_303(GenericReflector _enclosing, Db4objects.Db4o.Reflect.Generic.GenericClass clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public object Run() { string name = clazz.GetName(); if (this._enclosing._repository.LookupByName(name) == null) { this._enclosing._repository.Register(clazz); } return null; } private readonly GenericReflector _enclosing; private readonly Db4objects.Db4o.Reflect.Generic.GenericClass clazz; } /// Returns an array of classes known to the reflector /// an array of classes known to the reflector public virtual IReflectClass[] KnownClasses() { return ((IReflectClass[])WithLock(new _IClosure4_319(this))); } private sealed class _IClosure4_319 : IClosure4 { public _IClosure4_319(GenericReflector _enclosing) { this._enclosing = _enclosing; } public object Run() { return new KnownClassesCollector(this._enclosing._stream, this._enclosing._repository ).Collect(); } private readonly GenericReflector _enclosing; } /// Registers primitive class /// class id /// class name /// class converter public virtual void RegisterPrimitiveClass(int id, string name, IGenericConverter converter) { WithLock(new _IClosure4_333(this, id, converter, name)); } private sealed class _IClosure4_333 : IClosure4 { public _IClosure4_333(GenericReflector _enclosing, int id, IGenericConverter converter , string name) { this._enclosing = _enclosing; this.id = id; this.converter = converter; this.name = name; } public object Run() { Db4objects.Db4o.Reflect.Generic.GenericClass existing = (Db4objects.Db4o.Reflect.Generic.GenericClass )this._enclosing._repository.LookupByID(id); if (existing != null) { if (null != converter) { } else { // existing.setSecondClass(); existing.SetConverter(null); } return null; } IReflectClass clazz = this._enclosing._delegate.ForName(name); Db4objects.Db4o.Reflect.Generic.GenericClass claxx = null; if (clazz != null) { claxx = this._enclosing.EnsureDelegate(clazz); } else { claxx = new Db4objects.Db4o.Reflect.Generic.GenericClass(this._enclosing, null, name , null); this._enclosing.Register(claxx); claxx.InitFields(new GenericField[] { new GenericField(null, null, true) }); claxx.SetConverter(converter); } // claxx.setSecondClass(); claxx.SetPrimitive(); this._enclosing._repository.Register(id, claxx); return null; } private readonly GenericReflector _enclosing; private readonly int id; private readonly IGenericConverter converter; private readonly string name; } /// method stub: generic reflector does not have a parent public virtual void SetParent(IReflector reflector) { } // do nothing, the generic reflector does not have a parant public virtual void Configuration(IReflectorConfiguration config) { if (_delegate != null) { _delegate.Configuration(config); } } private object WithLock(IClosure4 block) { if (_stream == null || _stream.IsClosed()) { return block.Run(); } return _stream.SyncExec(block); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/CollectionUpdateDepthEntry.cs0000644000175000017500000000066611700531646033573 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect.Generic { internal class CollectionUpdateDepthEntry { internal readonly IReflectClassPredicate _predicate; internal readonly int _depth; internal CollectionUpdateDepthEntry(IReflectClassPredicate predicate, int depth) { _predicate = predicate; _depth = depth; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericArrayClass.cs0000644000175000017500000000175011700531646031662 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericArrayClass : GenericClass { public GenericArrayClass(GenericReflector reflector, IReflectClass delegateClass, string name, GenericClass superclass) : base(reflector, delegateClass, name, superclass ) { } public override IReflectClass GetComponentType() { return GetDelegate(); } public override bool IsArray() { return true; } public override bool IsInstance(object candidate) { if (!(candidate is GenericArray)) { return false; } return IsAssignableFrom(((GenericArray)candidate)._clazz); } public override string ToString(object obj) { if (_converter == null) { return "(GA) " + GetName(); } return _converter.ToString((GenericArray)obj); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/Generic/GenericClassBuilder.cs0000644000175000017500000000266511700531646032200 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Reflect.Generic { /// public class GenericClassBuilder : IReflectClassBuilder { private GenericReflector _reflector; private IReflector _delegate; public GenericClassBuilder(GenericReflector reflector, IReflector delegate_) : base () { _reflector = reflector; _delegate = delegate_; } public virtual IReflectClass CreateClass(string name, IReflectClass superClass, int fieldCount) { IReflectClass nativeClass = _delegate.ForName(name); GenericClass clazz = new GenericClass(_reflector, nativeClass, name, (GenericClass )superClass); clazz.SetDeclaredFieldCount(fieldCount); return clazz; } public virtual IReflectField CreateField(IReflectClass parentType, string fieldName , IReflectClass fieldType, bool isVirtual, bool isPrimitive, bool isArray, bool isNArray) { if (isVirtual) { return new GenericVirtualField(fieldName); } return new GenericField(fieldName, fieldType, isPrimitive); } public virtual void InitFields(IReflectClass clazz, IReflectField[] fields) { ((GenericClass)clazz).InitFields((GenericField[])fields); } public virtual IReflectField[] FieldArray(int length) { return new GenericField[length]; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflectMethod.cs0000644000175000017500000000113311700531646027576 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// Reflection Method representation. /// /// Reflection Method representation ///

See documentation for System.Reflection API. ///
/// IReflector public interface IReflectMethod { /// object Invoke(object onObject, object[] parameters); IReflectClass GetReturnType(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Reflect/IReflector.cs0000644000175000017500000000310511700531646026777 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect { /// root of the reflection implementation API. /// /// root of the reflection implementation API. ///

The open reflection interface is supplied to allow to implement /// custom reflection functionality.

/// Use /// /// Db4o.Configure().ReflectWith(IReflect reflector) /// /// to register the use of your implementation before opening database /// files. ///
public interface IReflector : IDeepClone { void Configuration(IReflectorConfiguration config); /// /// returns an ReflectArray object. /// /// /// returns an ReflectArray object. /// IReflectArray Array(); /// returns an ReflectClass for a Class IReflectClass ForClass(Type clazz); /// /// returns an ReflectClass class reflector for a class name or null /// if no such class is found /// IReflectClass ForName(string className); /// returns an ReflectClass for an object or null if the passed object is null. /// /// returns an ReflectClass for an object or null if the passed object is null. /// IReflectClass ForObject(object obj); bool IsCollection(IReflectClass clazz); void SetParent(IReflector reflector); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/0000755000175000017500000000000011700531646024134 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/IQueryComparator.cs0000644000175000017500000000107711700531646027736 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Query { /// /// This interface is not used in .NET. /// public interface IQueryComparator { /// Implement to compare two arguments for sorting. /// /// Implement to compare two arguments for sorting. /// Return a negative value, zero, or a positive value if /// the first argument is smaller, equal or greater than /// the second. /// int Compare(object first, object second); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/ICandidate.cs0000644000175000017500000000361511700531646026455 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Query { /// /// candidate for /// IEvaluation /// callbacks. ///

/// During /// query execution /// all registered /// IEvaluation /// callback /// handlers are called with /// ICandidate /// proxies that represent the persistent objects that /// meet all other /// IQuery /// criteria. ///

/// A /// ICandidate /// provides access to the persistent object it /// represents and allows to specify, whether it is to be included in the /// Db4objects.Db4o.IObjectSet /// resultset. ///
public interface ICandidate { /// /// returns the persistent object that is represented by this query /// ICandidate /// . /// /// Object the persistent object. object GetObject(); /// /// specify whether the Candidate is to be included in the /// Db4objects.Db4o.IObjectSet /// resultset. ///

/// This method may be called multiple times. The last call prevails. ///
/// inclusion. void Include(bool flag); /// /// returns the /// Db4objects.Db4o.IObjectContainer /// the Candidate object is stored in. /// /// /// the /// Db4objects.Db4o.IObjectContainer /// IObjectContainer ObjectContainer(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/Predicate.cs0000644000175000017500000001340111700531646026362 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Query { /// Base class for native queries. /// /// Base class for native queries. ///

Native Queries provide the ability to run one or more lines /// of code against all instances of a class. Native query expressions should /// return true to mark specific instances as part of the result set. /// db4o will attempt to optimize native query expressions and run them /// against indexes and without instantiating actual objects, where this is /// possible.

/// The syntax of the enclosing object for the native query expression varies /// slightly, depending on the language version used. Here are some examples, /// how a simple native query will look like in some of the programming languages and /// dialects that db4o supports:

/// /// // C# .NET 2.0
/// IList <Cat> cats = db.Query <Cat> (delegate(Cat cat) {
///    return cat.Name == "Occam";
/// });
///
///
/// // Java JDK 5
/// List <Cat> cats = db.query(new Predicate<Cat>() {
///    public boolean match(Cat cat) {
///       return cat.getName().equals("Occam");
///    }
/// });
///
///
/// // Java JDK 1.2 to 1.4
/// List cats = db.query(new Predicate() {
///    public boolean match(Cat cat) {
///       return cat.getName().equals("Occam");
///    }
/// });
///
///
/// // Java JDK 1.1
/// ObjectSet cats = db.query(new CatOccam());
///
/// public static class CatOccam extends Predicate {
///    public boolean match(Cat cat) {
///       return cat.getName().equals("Occam");
///    }
/// });
///
///
/// // C# .NET 1.1
/// IList cats = db.Query(new CatOccam());
///
/// public class CatOccam : Predicate {
///    public boolean Match(Cat cat) {
///       return cat.Name == "Occam";
///    }
/// });
///
///
/// Summing up the above:
/// In order to run a Native Query, you can
/// - use the delegate notation for .NET 2.0.
/// - extend the Predicate class for all other language dialects

/// A class that extends Predicate is required to /// implement the #match() / #Match() method, following the native query /// conventions:
/// - The name of the method is "#match()" (Java) / "#Match()" (.NET).
/// - The method must be public public.
/// - The method returns a boolean.
/// - The method takes one parameter.
/// - The Type (.NET) / Class (Java) of the parameter specifies the extent.
/// - For all instances of the extent that are to be included into the /// resultset of the query, the match method should return true. For all /// instances that are not to be included, the match method should return /// false.

///
[System.Serializable] public abstract class Predicate { /// public for implementation reasons, please ignore. /// public for implementation reasons, please ignore. public static readonly string PredicatemethodName = "match"; private Type _extentType; [System.NonSerialized] private MethodInfo cachedFilterMethod = null; public Predicate() : this(null) { } public Predicate(Type extentType) { _extentType = extentType; } public virtual MethodInfo GetFilterMethod() { if (cachedFilterMethod != null) { return cachedFilterMethod; } MethodInfo[] methods = GetType().GetMethods(); for (int methodIdx = 0; methodIdx < methods.Length; methodIdx++) { MethodInfo method = methods[methodIdx]; if ((!method.Name.Equals(PredicatePlatform.PredicatemethodName)) || Sharpen.Runtime.GetParameterTypes (method).Length != 1) { continue; } cachedFilterMethod = method; string targetName = Sharpen.Runtime.GetParameterTypes(method)[0].FullName; if (!"java.lang.Object".Equals(targetName)) { break; } } if (cachedFilterMethod == null) { throw new ArgumentException("Invalid predicate."); } return cachedFilterMethod; } /// public for implementation reasons, please ignore. /// public for implementation reasons, please ignore. public virtual Type ExtentType() { if (_extentType == null) { _extentType = FilterParameterType(); } return _extentType; } private Type FilterParameterType() { return (Type)Sharpen.Runtime.GetParameterTypes(GetFilterMethod())[0]; } /// public for implementation reasons, please ignore. /// public for implementation reasons, please ignore. public virtual bool AppliesTo(object candidate) { try { MethodInfo filterMethod = GetFilterMethod(); Platform4.SetAccessible(filterMethod); object ret = filterMethod.Invoke(this, new object[] { candidate }); return ((bool)ret); } catch (Exception) { // TODO: log this exception somewhere? // e.printStackTrace(); return false; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/IQuery.cs0000644000175000017500000001367011700531646025710 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Query { /// handle to a node in a S.O.D.A. /// /// handle to a node in a S.O.D.A. query graph. ///

/// A node in the query graph can represent multiple /// classes, one class or an attribute of a class.

The graph /// is automatically extended with attributes of added constraints /// (see /// Constrain(object) /// ) and upon calls to /// Descend(string) /// that request nodes that do not yet exist. ///

/// References to joined nodes in the query graph can be obtained /// by "walking" along the nodes of the graph with the method /// Descend(string) /// . ///

/// Execute() /// evaluates the entire graph against all persistent objects. ///

/// Execute() /// can be called from any /// IQuery /// node /// of the graph. It will return an /// Db4objects.Db4o.IObjectSet /// filled with /// objects of the class/classes that the node, it was called from, /// represents.

/// Note:
/// Native queries /// are the recommended main query /// interface of db4o.
///
public interface IQuery { /// adds a constraint to this node. /// /// adds a constraint to this node. ///

/// If the constraint contains attributes that are not yet /// present in the query graph, the query graph is extended /// accordingly. ///

/// Special behaviour for: ///
    ///
  • class /// System.Type<T> /// : confine the result to objects of one /// class or to objects implementing an interface.
  • ///
  • interface /// IEvaluation /// : run /// evaluation callbacks against all candidates.
  • ///
///
/// the constraint to be added to this Query. /// /// /// IConstraint /// a new /// IConstraint /// for this /// query node or null for objects implementing the /// IEvaluation /// interface. /// IConstraint Constrain(object constraint); /// /// returns a /// IConstraints /// object that holds an array of all constraints on this node. /// /// /// /// IConstraints /// on this query node. /// IConstraints Constraints(); /// returns a reference to a descendant node in the query graph. /// /// returns a reference to a descendant node in the query graph. ///

If the node does not exist, it will be created. ///

/// All classes represented in the query node are tested, whether /// they contain a field with the specified field name. The /// descendant Query node will be created from all possible candidate /// classes. ///
/// path to the descendant. /// /// descendant /// IQuery /// node /// IQuery Descend(string fieldName); /// /// executes the /// IQuery /// . /// /// /// /// Db4objects.Db4o.IObjectSet /// - the result of the /// IQuery /// . /// IObjectSet Execute(); /// /// adds an ascending ordering criteria to this node of /// the query graph. /// /// /// adds an ascending ordering criteria to this node of /// the query graph. ///

/// If multiple ordering criteria are applied, the chronological /// order of method calls is relevant: criteria created by 'earlier' calls are /// considered more significant, i.e. 'later' criteria only have an effect /// for elements that are considered equal by all 'earlier' criteria. ///

///

/// As an example, consider a type with two int fields, and an instance set /// {(a:1,b:3),(a:2,b:2),(a:1,b:2),(a:2,b:3)}. The call sequence [orderAscending(a), /// orderDescending(b)] will result in [(a:1,b:3),(a:1,b:2),(a:2,b:3),(a:2,b:2)]. ///

///
/// /// this /// IQuery /// object to allow the chaining of method calls. /// IQuery OrderAscending(); /// /// adds a descending order criteria to this node of /// the query graph. /// /// /// adds a descending order criteria to this node of /// the query graph. ///

/// For semantics of multiple calls setting ordering criteria, see /// OrderAscending() /// . ///
/// /// this /// IQuery /// object to allow the chaining of method calls. /// IQuery OrderDescending(); /// Sort the resulting ObjectSet by the given comparator. /// Sort the resulting ObjectSet by the given comparator. /// The comparator to apply. /// /// this /// IQuery /// object to allow the chaining of method calls. /// IQuery SortBy(IQueryComparator comparator); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/IEvaluation.cs0000644000175000017500000000347611700531646026715 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Query { /// for implementation of callback evaluations. /// /// for implementation of callback evaluations. ///

/// To constrain a /// IQuery /// node with your own callback /// Evaluation, construct an object that implements the /// Evaluation interface and register it by passing it /// to /// IQuery.Constrain(object) /// . ///

/// Evaluations are called as the last step during query execution, /// after all other constraints have been applied. Evaluations in higher /// level /// IQuery /// nodes in the query graph are called first. ///

Java client/server only:
/// db4o first attempts to use Java Serialization to allow to pass final /// variables to the server. Please make sure that all variables that are /// used within the /// Evaluate(ICandidate) /// method are Serializable. This may include /// the class an anonymous Evaluation object is created in. If db4o is /// not successful at using Serialization, the Evaluation is transported /// to the server in a db4o /// Db4objects.Db4o.IO.MemoryBin /// . In this case final variables can /// not be restored. ///
public interface IEvaluation { /// /// callback method during /// query execution /// . /// /// reference to the candidate persistent object. void Evaluate(ICandidate candidate); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/IConstraint.cs0000644000175000017500000002631511700531646026727 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Query { /// /// constraint to limit the objects returned upon /// query execution /// . ///

/// Constraints are constructed by calling /// Db4objects.Db4o.Query.IQuery.Constrain /// /// . ///

/// Constraints can be joined with the methods /// Db4objects.Db4o.Query.IConstraint.And /// /// and /// Db4objects.Db4o.Query.IConstraint.Or /// /// . ///

/// The methods to modify the constraint evaluation algorithm may /// be merged, to construct combined evaluation rules. /// Examples: ///
    ///
  • Constraint.Smaller().Equal() for "smaller or equal"
  • ///
  • Constraint.Not().Like() for "not like"
  • ///
  • Constraint.Not().Greater().Equal() for "not greater or equal"
  • ///
///
public interface IConstraint { /// links two Constraints for AND evaluation. /// /// links two Constraints for AND evaluation. /// For example:
/// query.Constrain(typeof(Pilot));
/// query.Descend("points").Constrain(101).Smaller().And(query.Descend("name").Constrain("Test Pilot0"));
/// will retrieve all pilots with points less than 101 and name as "Test Pilot0"
///
/// /// the other /// Db4objects.Db4o.Query.IConstraint /// /// /// a new /// Db4objects.Db4o.Query.IConstraint /// , that can be used for further calls /// to /// And /// and /// Or /// IConstraint And(IConstraint with); /// links two Constraints for OR evaluation. /// /// links two Constraints for OR evaluation. /// For example:

/// query.Constrain(typeof(Pilot));
/// query.Descend("points").Constrain(101).Greater().Or(query.Descend("name").Constrain("Test Pilot0"));
/// will retrieve all pilots with points more than 101 or pilots with the name "Test Pilot0"
///
/// /// the other /// Db4objects.Db4o.Query.IConstraint /// /// /// a new /// Db4objects.Db4o.Query.IConstraint /// , that can be used for further calls /// to /// And /// and /// Or /// IConstraint Or(IConstraint with); /// /// Used in conjunction with /// Db4objects.Db4o.Query.IConstraint.Smaller /// /// or /// Db4objects.Db4o.Query.IConstraint.Greater /// /// to create constraints /// like "smaller or equal", "greater or equal". /// For example:
/// query.Constrain(typeof(Pilot));
/// query.Descend("points").Constrain(101).Smaller().Equal();
/// will return all pilots with points <= 101.
///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Equal(); /// sets the evaluation mode to >. /// /// sets the evaluation mode to >. /// For example:
/// query.Constrain(typeof(Pilot));
/// query.Descend("points").Constrain(101).Greater()
/// will return all pilots with points > 101.
///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Greater(); /// sets the evaluation mode to <. /// /// sets the evaluation mode to <. /// For example:
/// query.Constrain(typeof(Pilot));
/// query.Descend("points").Constrain(101).Smaller()
/// will return all pilots with points < 101.
///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Smaller(); /// sets the evaluation mode to identity comparison. /// /// sets the evaluation mode to identity comparison. In this case only /// objects having the same database identity will be included in the result set. /// For example:
/// Pilot pilot = new Pilot("Test Pilot1", 100);
/// Car car = new Car("BMW", pilot);
/// container.Store(car);
/// // Change the name, the pilot instance stays the same
/// pilot.SetName("Test Pilot2");
/// // create a new car
/// car = new Car("Ferrari", pilot);
/// container.Store(car);
/// IQuery query = container.Query();
/// query.Constrain(typeof(Car));
/// // All cars having pilot with the same database identity
/// // will be retrieved. As we only created Pilot object once
/// // it should mean all car objects
/// query.Descend("_pilot").Constrain(pilot).Identity();

///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Identity(); /// set the evaluation mode to object comparison (query by example). /// set the evaluation mode to object comparison (query by example). /// /// this /// IConstraint /// to allow the chaining of method calls. /// IConstraint ByExample(); /// sets the evaluation mode to "like" comparison. /// /// sets the evaluation mode to "like" comparison. This mode will include /// all objects having the constrain expression somewhere inside the string field. /// For example:
/// Pilot pilot = new Pilot("Test Pilot1", 100);
/// container.Store(pilot);
/// ...
/// query.Constrain(typeof(Pilot));
/// // All pilots with the name containing "est" will be retrieved
/// query.Descend("name").Constrain("est").Like();
///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Like(); /// Sets the evaluation mode to string contains comparison. /// /// Sets the evaluation mode to string contains comparison. The contains comparison is case sensitive.
/// For example:
/// Pilot pilot = new Pilot("Test Pilot1", 100);
/// container.Store(pilot);
/// ...
/// query.Constrain(typeof(Pilot));
/// // All pilots with the name containing "est" will be retrieved
/// query.Descend("name").Constrain("est").Contains();
/// Like() for case insensitive string comparison ///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Contains(); /// sets the evaluation mode to string StartsWith comparison. /// /// sets the evaluation mode to string StartsWith comparison. /// For example:
/// Pilot pilot = new Pilot("Test Pilot0", 100);
/// container.Store(pilot);
/// ...
/// query.Constrain(typeof(Pilot));
/// query.Descend("name").Constrain("Test").StartsWith(true);
///
/// comparison will be case sensitive if true, case insensitive otherwise /// /// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint StartsWith(bool caseSensitive); /// sets the evaluation mode to string EndsWith comparison. /// /// sets the evaluation mode to string EndsWith comparison. /// For example:
/// Pilot pilot = new Pilot("Test Pilot0", 100);
/// container.Store(pilot);
/// ...
/// query.Constrain(typeof(Pilot));
/// query.Descend("name").Constrain("T0").EndsWith(false);
///
/// comparison will be case sensitive if true, case insensitive otherwise /// /// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint EndsWith(bool caseSensitive); /// turns on Not() comparison. /// /// turns on Not() comparison. All objects not fullfilling the constrain condition will be returned. /// For example:
/// Pilot pilot = new Pilot("Test Pilot1", 100);
/// container.Store(pilot);
/// ...
/// query.Constrain(typeof(Pilot));
/// query.Descend("name").Constrain("t0").EndsWith(true).Not();
///
/// /// this /// Db4objects.Db4o.Query.IConstraint /// to allow the chaining of method calls. /// IConstraint Not(); /// /// returns the Object the query graph was constrained with to /// create this /// IConstraint /// . /// /// Object the constraining object. object GetObject(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Query/IConstraints.cs0000644000175000017500000000167311700531646027112 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Query { /// /// set of /// IConstraint /// objects. ///

This extension of the /// IConstraint /// interface allows /// setting the evaluation mode of all contained /// IConstraint /// objects with single calls. ///

/// See also /// IQuery.Constraints() /// . ///
public interface IConstraints : IConstraint { /// /// returns an array of the contained /// IConstraint /// objects. /// /// /// an array of the contained /// IConstraint /// objects. /// IConstraint[] ToArray(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/StaticClass.cs0000644000175000017500000000066511700531646025602 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o { /// /// public class StaticClass : IInternal4 { public string name; public StaticField[] fields; public StaticClass() { } public StaticClass(string name_, StaticField[] fields_) { name = name_; fields = fields_; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IBlobStatus.cs0000644000175000017500000000035411700531646025553 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o { /// /// com.db4o.internal.blobs public interface IBlobStatus { double GetStatus(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/ITransactionListener.cs0000644000175000017500000000053011700531646027460 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o { /// /// allows registration with a transaction to be notified of /// commit and rollback /// /// public interface ITransactionListener { void PreCommit(); void PostRollback(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/CorruptionException.cs0000644000175000017500000000042511700531646027402 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o { /// [System.Serializable] public class CorruptionException : Exception { // TODO implement exception basics (message, etc.) } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IInternal4.cs0000644000175000017500000000053711700531646025334 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o { /// Marker interface to denote that a class is used for db4o internals. /// Marker interface to denote that a class is used for db4o internals. /// public interface IInternal4 { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Collections/0000755000175000017500000000000011700531646025305 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Collections/ArrayDictionary4.cs0000644000175000017500000001346211700531646031032 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections.Generic; using Db4objects.Db4o.Activation; using Sharpen; using Sharpen.Util; namespace Db4objects.Db4o.Collections { /// Transparent activatable IDictionary implementation. /// /// /// Transparent activatable IDictionary implementation. Implements IDictionary interface /// using two arrays to store keys and values. ///
///
/// When instantiated as a result of a query, all the internal members /// are NOT activated at all. When internal members are required to /// perform an operation, the instance transparently activates all the /// members. ///
/// System.Collections.IDictionary /// /// Db4objects.Db4o.TA.IActivatable /// public partial class ArrayDictionary4 { private K[] _keys; private V[] _values; private int _size; [System.NonSerialized] private IActivator _activator; /// /// Initializes a new collection with the initial capacity = 16. /// public ArrayDictionary4() : this(16) { } /// /// Initializes a collection of the specified initial capacity. /// public ArrayDictionary4(int initialCapacity) { InitializeBackingArray(initialCapacity); } /// activate basic implementation. /// activate basic implementation. /// Db4objects.Db4o.TA.IActivatable public virtual void Activate(ActivationPurpose purpose) { if (_activator != null) { _activator.Activate(purpose); } } /// bind basic implementation. /// bind basic implementation. /// Db4objects.Db4o.TA.IActivatable public virtual void Bind(IActivator activator) { if (_activator == activator) { return; } if (activator != null && _activator != null) { throw new InvalidOperationException(); } _activator = activator; } /// System.Collections.Generic.IDictionary implementation but transparently activates /// the members as required. /// System.Collections.Generic.IDictionary implementation but transparently activates /// the members as required. /// /// Db4objects.Db4o.TA.IActivatable /// public virtual void Clear() { Activate(ActivationPurpose.Write); _size = 0; Arrays.Fill(_keys, DefaultKeyValue()); Arrays.Fill(_values, DefaultValue()); } private bool ContainsKeyImpl(K key) { Activate(ActivationPurpose.Read); return IndexOfKey(key) != -1; } private V ValueAt(int index) { return _values[index]; } private K KeyAt(int i) { return _keys[i]; } private V Replace(int index, V value) { V oldValue = ValueAt(index); _values[index] = value; return oldValue; } /// Returns the number of elements in the collection. /// Returns the number of elements in the collection. The collection gets activated. /// /// Db4objects.Db4o.TA.IActivatable /// public virtual int Count { get { Activate(ActivationPurpose.Read); return _size; } } /// Returns the values of the collection. /// Returns the values of the collection. The collection gets activated. /// /// Db4objects.Db4o.TA.IActivatable /// public virtual ICollection Values { get { Activate(ActivationPurpose.Read); List list = new List(); for (int i = 0; i < _size; i++) { list.Add(ValueAt(i)); } return list; } } /// Returns the hash code of the collection. /// Returns the hash code of the collection. Collection members /// get activated as required. /// /// Db4objects.Db4o.TA.IActivatable /// public override int GetHashCode() { int hashCode = 0; foreach (KeyValuePair entry in this) { hashCode += entry.GetHashCode(); } return hashCode; } private void InitializeBackingArray(int length) { _keys = AllocateKeyStorage(length); _values = AllocateValueStorage(length); } private void Insert(K key, V value) { EnsureCapacity(); _keys[_size] = key; _values[_size] = value; _size++; } private void EnsureCapacity() { if (_size == _keys.Length) { int count = _keys.Length * 2; K[] newKeys = AllocateKeyStorage(count); V[] newValues = AllocateValueStorage(count); System.Array.Copy(_keys, 0, newKeys, 0, _size); System.Array.Copy(_values, 0, newValues, 0, _size); _keys = newKeys; _values = newValues; } } private V Delete(int index) { Activate(ActivationPurpose.Write); V value = ValueAt(index); for (int i = index; i < _size - 1; i++) { _keys[i] = _keys[i + 1]; _values[i] = _values[i + 1]; } _size--; _keys[_size] = DefaultKeyValue(); _values[_size] = DefaultValue(); return value; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Collections/CollectionFactory.cs0000644000175000017500000000463011700531646031262 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Collections; namespace Db4objects.Db4o.Collections { /// /// Collection factory with methods to create collections with behaviour /// that is optimized for db4o.

/// Example usage:
/// CollectionFactory.forObjectContainer(objectContainer).newBigSet(); ///
public class CollectionFactory { private readonly IObjectContainer _objectContainer; private CollectionFactory(IObjectContainer objectContainer) { _objectContainer = objectContainer; } /// returns a collection factory for an ObjectContainer /// - the ObjectContainer /// the CollectionFactory public static Db4objects.Db4o.Collections.CollectionFactory ForObjectContainer(IObjectContainer objectContainer) { if (IsClient(objectContainer)) { throw new NotSupportedException("CollectionFactory is not yet available for Client/Server." ); } return new Db4objects.Db4o.Collections.CollectionFactory(objectContainer); } /// /// creates a new BigSet.

/// Characteristics of BigSet:
/// - It is optimized by using a BTree of IDs of persistent objects.
/// - It can only hold persistent first class objects (no primitives, no strings, no objects that are not persistent)
/// - Objects are activated upon getting them from the BigSet. ///
/// /// creates a new BigSet.

/// Characteristics of BigSet:
/// - It is optimized by using a BTree of IDs of persistent objects.
/// - It can only hold persistent first class objects (no primitives, no strings, no objects that are not persistent)
/// - Objects are activated upon getting them from the BigSet. ///

/// BigSet is recommend whenever one object references a huge number of other objects and sorting is not required. ///
/// public virtual Db4objects.Db4o.Collections.ISet NewBigSet() { return new BigSet((LocalObjectContainer)_objectContainer); } private static bool IsClient(IObjectContainer oc) { return ((IInternalObjectContainer)oc).IsClient; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Collections/ArrayList4.cs0000644000175000017500000002006011700531646027630 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using System; using System.Collections.Generic; using Db4objects.Db4o.Activation; using Sharpen; using Sharpen.Util; namespace Db4objects.Db4o.Collections { /// Transparent activatable ArrayList implementation. /// /// /// Transparent activatable ArrayList implementation. Implements IList /// interface using an array to store elements. Each ArrayList4 instance /// has a capacity, which indicates the size of the internal array. ///
///
/// When instantiated as a result of a query, all the internal members /// are NOT activated at all. When internal members are required to /// perform an operation, the instance transparently activates all the /// members. ///
/// System.Collections.ArrayList /// /// Db4objects.Db4o.TA.IActivatable /// public partial class ArrayList4 { private E[] elements; private int listSize; [System.NonSerialized] private IActivator _activator; /// activate basic implementation. /// activate basic implementation. /// Db4objects.Db4o.TA.IActivatable public virtual void Activate(ActivationPurpose purpose) { if (_activator != null) { _activator.Activate(purpose); } } /// bind basic implementation. /// bind basic implementation. /// Db4objects.Db4o.TA.IActivatable public virtual void Bind(IActivator activator) { if (_activator == activator) { return; } if (activator != null && _activator != null) { throw new InvalidOperationException(); } _activator = activator; } /// /// Initializes a new collection with the initial capacity = 10. /// public ArrayList4() : this(10) { } /// /// Initializes a collection with the members of the parameter collection. /// public ArrayList4(ICollection c) { E[] data = CollectionToArray(c); elements = AllocateStorage(data.Length); listSize = data.Length; System.Array.Copy(data, 0, elements, 0, data.Length); } /// /// Initializes a collection of the specified initial capacity. /// public ArrayList4(int initialCapacity) { if (initialCapacity < 0) { throw new ArgumentException(); } elements = AllocateStorage(initialCapacity); listSize = 0; } /// Inserts an element into the collection /// at the specified index. /// Inserts an element into the collection /// at the specified index. /// Db4objects.Db4o.TA.IActivatable /// internal virtual void Add(int index, E element) { CheckIndex(index, 0, Count); EnsureCapacity(Count + 1); ArrayCopyElements(index, index + 1, listSize - index); elements[index] = element; IncreaseSize(1); MarkModified(); } private void ArrayCopyElements(int sourceIndex, int targetIndex, int length) { ActivateForWrite(); System.Array.Copy(elements, sourceIndex, elements, targetIndex, length); } internal bool AddAllImpl(int index, E[] toBeAdded) { CheckIndex(index, 0, Count); int length = toBeAdded.Length; if (length == 0) { return false; } EnsureCapacity(Count + length); ArrayCopyElements(index, index + length, Count - index); System.Array.Copy(toBeAdded, 0, elements, index, length); IncreaseSize(length); MarkModified(); return true; } /// Removes all elements from the collection. /// Removes all elements from the collection. /// Db4objects.Db4o.TA.IActivatable /// public virtual void Clear() { int size = Count; ActivateForWrite(); Arrays.Fill(elements, 0, size, DefaultValue()); SetSize(0); MarkModified(); } /// Resizes the collection capacity to the specified size if the /// current capacity is less than the parameter value. /// Resizes the collection capacity to the specified size if the /// current capacity is less than the parameter value. /// Db4objects.Db4o.TA.IActivatable /// public virtual void EnsureCapacity(int minCapacity) { Activate(ActivationPurpose.Read); if (minCapacity <= Capacity()) { return; } Resize(minCapacity); } private int Capacity() { return elements.Length; } /// Returns the collection element at the specified index. /// Returns the collection element at the specified index. /// Db4objects.Db4o.TA.IActivatable /// public virtual E Get(int index) { CheckIndex(index, 0, Count - 1); return elements[index]; } /// Removes the collection element at the specified index. /// Removes the collection element at the specified index. /// Db4objects.Db4o.TA.IActivatable /// internal virtual E RemoveImpl(int index) { int size = Count; E element = this[index]; ArrayCopyElements(index + 1, index, size - index - 1); elements[size - 1] = DefaultValue(); DecreaseSize(1); MarkModified(); return element; } private void RemoveRangeImpl(int fromIndex, int count) { int size = Count; int toIndex = fromIndex + count; if ((fromIndex < 0 || fromIndex >= size || toIndex > size || toIndex < fromIndex)) { throw new IndexOutOfRangeException(); } if (count == 0) { return; } System.Array.Copy(elements, toIndex, elements, fromIndex, size - toIndex); Arrays.Fill(elements, size - count, size, DefaultValue()); DecreaseSize(count); MarkModified(); } /// Replaces the collection element with the specified object at the specified index. /// Replaces the collection element with the specified object at the specified index. /// Db4objects.Db4o.TA.IActivatable /// internal virtual E Set(int index, E element) { E oldValue = this[index]; ActivateForWrite(); elements[index] = element; return oldValue; } /// Returns the size of the collection. /// Returns the size of the collection. /// Db4objects.Db4o.TA.IActivatable /// public virtual int Count { get { Activate(ActivationPurpose.Read); return listSize; } } /// Resizes the collection to its actual size. /// Resizes the collection to its actual size. /// Db4objects.Db4o.TA.IActivatable /// public virtual void TrimExcess() { ActivateForWrite(); Resize(Count); } private void Resize(int minCapacity) { MarkModified(); E[] temp = AllocateStorage(minCapacity); System.Array.Copy(elements, 0, temp, 0, Count); elements = temp; } internal virtual void SetSize(int count) { listSize = count; } internal virtual void IncreaseSize(int count) { listSize += count; } internal virtual void DecreaseSize(int count) { listSize -= count; } internal virtual void MarkModified() { ++modCount; } private void ActivateForWrite() { Activate(ActivationPurpose.Write); } } } #endif // !SILVERLIGHT smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/0000755000175000017500000000000011700531646023732 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/IQLin.cs0000644000175000017500000000357011700531646025242 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Qlin; namespace Db4objects.Db4o.Qlin { /// a node in a QLin ("Coolin") query. /// /// a node in a QLin ("Coolin") query. /// QLin is a new experimental query interface. /// We would really like to have LINQ for Java instead. /// /// 8.0 public interface IQLin { /// adds a where node to this QLin query. /// adds a where node to this QLin query. /// can be any of the following: IQLin Where(object expression); /// /// executes the QLin query and returns the result /// as an /// Db4objects.Db4o.IObjectSet /// . /// Note that ObjectSet extends List and Iterable /// on the platforms that support these interfaces. /// You may want to use these interfaces instead of /// working directly against an ObjectSet. /// IObjectSet Select(); // FIXME: The return value should not be as closely bound to db4o. // Collection is mutable, it's not nice. // Discuss !!! IQLin Equal(object obj); IQLin StartsWith(string @string); IQLin Limit(int size); IQLin Smaller(object obj); IQLin Greater(object obj); /// orders the query by the expression. /// /// orders the query by the expression. /// Use the /// QLinSupport.Ascending() /// and /// QLinSupport.Descending() /// helper methods to set the direction. /// IQLin OrderBy(object expression, QLinOrderByDirection direction); object SingleOrDefault(object defaultValue); object Single(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/Prototypes.cs0000644000175000017500000003344511700531646026462 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Qlin { /// creates prototype objects for classes. /// /// creates prototype objects for classes. Each field on prototype objects is set /// to a newly created object or primitive that can be identified either by it's /// identity or by an int ID that is generated by the system. Creation of fields /// is recursed to the depth specified in the constructor.
///
/// Allows analyzing expressions called on prototype objects to find the /// underlying field that delivers the return value of the expression. Passed /// expressions should not have side effects on objects, otherwise the /// "prototype world" will no longer work.
///
/// We plan to supply an ImmutableFieldClassLoader to instrument the code to /// throw on every modification. This ClassLoader could also supply information /// about all the method calls involved.
///
/// For now our approach only works if expressions are directly backed by a /// single field.
///
/// We were inspired for this approach when we saw that Thomas Mueller managed to /// map expressions to fields for his JaQu query interface, Kudos! /// http://www.h2database.com/html/jaqu.html
///
/// We took the idea a bit further and made it work for all primitives except for /// boolean and we plan to also get deeper expressions, collections and /// interfaces working nicely. ///
public class Prototypes { private readonly IReflector _reflector; private readonly Hashtable4 _prototypes = new Hashtable4(); private readonly bool _ignoreTransient; private readonly int _recursionDepth; public Prototypes(IReflector reflector, int recursionDepth, bool ignoreTransient) { _reflector = reflector; _recursionDepth = recursionDepth; _ignoreTransient = ignoreTransient; } public Prototypes() : this(DefaultReflector(), 5, false) { } /// returns a prototype object for a specific class. /// returns a prototype object for a specific class. public virtual object PrototypeForClass(Type clazz) { if (clazz == null) { throw new PrototypesException("Class can not be null"); } IReflectClass claxx = _reflector.ForClass(clazz); if (claxx == null) { throw new PrototypesException("Not found in the reflector: " + clazz); } string className = claxx.GetName(); Prototypes.Prototype prototype = (Prototypes.Prototype)_prototypes.Get(className); if (prototype != null) { return prototype.Object(); } prototype = new Prototypes.Prototype(this, claxx); _prototypes.Put(className, prototype); return prototype.Object(); } /// /// analyzes the passed expression and tries to find the path to the /// backing field that is accessed. /// /// /// analyzes the passed expression and tries to find the path to the /// backing field that is accessed. /// public virtual IEnumerator BackingFieldPath(Type clazz, object expression) { return BackingFieldPath(_reflector.ForClass(clazz), expression); } /// /// analyzes the passed expression and tries to find the path to the /// backing field that is accessed. /// /// /// analyzes the passed expression and tries to find the path to the /// backing field that is accessed. /// public virtual IEnumerator BackingFieldPath(IReflectClass claxx, object expression ) { return BackingFieldPath(claxx.GetName(), expression); } /// /// analyzes the passed expression and tries to find the path to the /// backing field that is accessed. /// /// /// analyzes the passed expression and tries to find the path to the /// backing field that is accessed. /// public virtual IEnumerator BackingFieldPath(string className, object expression) { Prototypes.Prototype prototype = (Prototypes.Prototype)_prototypes.Get(className); if (prototype == null) { return null; } return prototype.BackingFieldPath(_reflector, expression); } private class Prototype { private readonly IdentityHashtable4 _fieldsByIdentity = new IdentityHashtable4(); private readonly Hashtable4 _fieldsByIntId = new Hashtable4(); private readonly object _object; private int intIdGenerator; public Prototype(Prototypes _enclosing, IReflectClass claxx) { this._enclosing = _enclosing; this._object = (object)claxx.NewInstance(); if (this._object == null) { throw new PrototypesException("Prototype could not be created for class " + claxx .GetName()); } this.Analyze(this._object, claxx, this._enclosing._recursionDepth, null); } private void Analyze(object @object, IReflectClass claxx, int depth, List4 parentPath ) { if (depth < 0) { return; } ReflectorUtils.ForEachField(claxx, new _IProcedure4_130(this, parentPath, claxx, @object, depth)); } private sealed class _IProcedure4_130 : IProcedure4 { public _IProcedure4_130(Prototype _enclosing, List4 parentPath, IReflectClass claxx , object @object, int depth) { this._enclosing = _enclosing; this.parentPath = parentPath; this.claxx = claxx; this.@object = @object; this.depth = depth; } public void Apply(object field) { if (((IReflectField)field).IsStatic()) { return; } if (this._enclosing._enclosing._ignoreTransient && ((IReflectField)field).IsTransient ()) { return; } IReflectClass fieldType = ((IReflectField)field).GetFieldType(); List4 path = new List4(parentPath, ((IReflectField)field)); Prototypes.IntegerConverter converter = Prototypes.IntegerConverterforClassName(claxx .Reflector(), fieldType.GetName()); if (converter != null) { int id = ++this._enclosing.intIdGenerator; object integerRepresentation = converter.FromInteger(id); if (!Prototypes.TrySetField(((IReflectField)field), @object, integerRepresentation )) { return; } this._enclosing._fieldsByIntId.Put(id, new Pair(integerRepresentation, path)); return; } if (!fieldType.IsPrimitive()) { object identityInstance = fieldType.NewInstance(); if (identityInstance == null) { return; } if (!Prototypes.TrySetField(((IReflectField)field), @object, identityInstance)) { return; } this._enclosing._fieldsByIdentity.Put(identityInstance, path); this._enclosing.Analyze(identityInstance, claxx, depth - 1, path); } } private readonly Prototype _enclosing; private readonly List4 parentPath; private readonly IReflectClass claxx; private readonly object @object; private readonly int depth; } public virtual object Object() { return this._object; } public virtual IEnumerator BackingFieldPath(IReflector reflector, object expression ) { if (expression == null) { return null; } IReflectClass claxx = reflector.ForObject(expression); if (claxx == null) { return null; } Prototypes.IntegerConverter converter = Prototypes.IntegerConverterforClassName(reflector , claxx.GetName()); if (converter != null) { Pair entry = (Pair)this._fieldsByIntId.Get(converter.ToInteger(expression)); if (entry == null) { return null; } if (entry.first.Equals(expression)) { return this.AsIterator((List4)entry.second); } return null; } if (claxx.IsPrimitive()) { return null; } return this.AsIterator((List4)this._fieldsByIdentity.Get(expression)); } private IEnumerator AsIterator(List4 lastElement) { return Iterators.Revert(Iterators.Map(Iterators.Iterate(lastElement), new _IFunction4_198 ())); } private sealed class _IFunction4_198 : IFunction4 { public _IFunction4_198() { } public object Apply(object field) { return ((IReflectField)field).GetName(); } } private readonly Prototypes _enclosing; } private static Prototypes.IntegerConverter IntegerConverterforClassName(IReflector reflector, string className) { if (_integerConverters == null) { _integerConverters = new Hashtable4(); Prototypes.IntegerConverter[] converters = new Prototypes.IntegerConverter[] { new _IntegerConverter_211(), new _IntegerConverter_215(), new _IntegerConverter_219( ), new _IntegerConverter_223(), new _IntegerConverter_227(), new _IntegerConverter_231 (), new _IntegerConverter_235(), new _IntegerConverter_239() }; for (int converterIndex = 0; converterIndex < converters.Length; ++converterIndex) { Prototypes.IntegerConverter converter = converters[converterIndex]; _integerConverters.Put(converter.PrimitiveName(), converter); if (!converter.PrimitiveName().Equals(converter.WrapperName(reflector))) { _integerConverters.Put(converter.WrapperName(reflector), converter); } } } return (Prototypes.IntegerConverter)_integerConverters.Get(className); } private sealed class _IntegerConverter_211 : Prototypes.IntegerConverter { public _IntegerConverter_211() { } public override string PrimitiveName() { return typeof(int).FullName; } public override object FromInteger(int i) { return i; } } private sealed class _IntegerConverter_215 : Prototypes.IntegerConverter { public _IntegerConverter_215() { } public override string PrimitiveName() { return typeof(long).FullName; } public override object FromInteger(int i) { return System.Convert.ToInt64(i); } } private sealed class _IntegerConverter_219 : Prototypes.IntegerConverter { public _IntegerConverter_219() { } public override string PrimitiveName() { return typeof(double).FullName; } public override object FromInteger(int i) { return System.Convert.ToDouble(i); } } private sealed class _IntegerConverter_223 : Prototypes.IntegerConverter { public _IntegerConverter_223() { } public override string PrimitiveName() { return typeof(float).FullName; } public override object FromInteger(int i) { return System.Convert.ToSingle(i); } } private sealed class _IntegerConverter_227 : Prototypes.IntegerConverter { public _IntegerConverter_227() { } public override string PrimitiveName() { return typeof(byte).FullName; } public override object FromInteger(int i) { return (byte)i; } } private sealed class _IntegerConverter_231 : Prototypes.IntegerConverter { public _IntegerConverter_231() { } public override string PrimitiveName() { return typeof(char).FullName; } public override object FromInteger(int i) { return (char)i; } } private sealed class _IntegerConverter_235 : Prototypes.IntegerConverter { public _IntegerConverter_235() { } public override string PrimitiveName() { return typeof(short).FullName; } public override object FromInteger(int i) { return (short)i; } } private sealed class _IntegerConverter_239 : Prototypes.IntegerConverter { public _IntegerConverter_239() { } public override string PrimitiveName() { return typeof(string).FullName; } public override object FromInteger(int i) { return Prototypes.StringIdentifier + i; } public override int ToInteger(object obj) { if (!(obj is string)) { return -1; } string str = (string)obj; if (str.Length < Prototypes.StringIdentifier.Length) { return -1; } if (str.IndexOf(Prototypes.StringIdentifier) != 0) { return -1; } return int.Parse(Sharpen.Runtime.Substring(str, Prototypes.StringIdentifier.Length )); } } private static Hashtable4 _integerConverters; private abstract class IntegerConverter { public virtual string WrapperName(IReflector reflector) { return reflector.ForObject(FromInteger(1)).GetName(); } public abstract string PrimitiveName(); public abstract object FromInteger(int i); public virtual int ToInteger(object obj) { return int.Parse(((object)obj).ToString()); } } private static readonly string StringIdentifier = "QLinIdentity"; // Strings get prepended the following, so we can also use strings // without restrictions in queries. public virtual IReflector Reflector() { return _reflector; } // We could always use this, but we want to make users of this class // aware that they have control over the reflector and that it is // important. public static IReflector DefaultReflector() { return new GenericReflector(Platform4.ReflectorForType(typeof(Prototypes))); } private static bool TrySetField(IReflectField field, object onObject, object value ) { try { field.Set(onObject, value); } catch { return false; } return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/QLinOrderByDirection.cs0000644000175000017500000000262411700531646030260 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Qlin { /// /// Internal implementation class, access should not be necessary, /// except for implementors. /// /// /// Internal implementation class, access should not be necessary, /// except for implementors. /// Use the static methods in /// QLinSupport /// /// QLinSupport.Ascending() /// and /// QLinSupport.Descending() /// /// public class QLinOrderByDirection { private readonly string _direction; private readonly bool _ascending; private QLinOrderByDirection(string direction, bool ascending) { _direction = direction; _ascending = ascending; } internal static readonly Db4objects.Db4o.Qlin.QLinOrderByDirection Ascending = new Db4objects.Db4o.Qlin.QLinOrderByDirection("ascending", true); internal static readonly Db4objects.Db4o.Qlin.QLinOrderByDirection Descending = new Db4objects.Db4o.Qlin.QLinOrderByDirection("descending", false); public virtual bool IsAscending() { return _ascending; } public virtual bool IsDescending() { return !_ascending; } public override string ToString() { return _direction; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/PrototypesException.cs0000644000175000017500000000062411700531646030332 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Qlin { /// exception for the the Prototypes world. /// exception for the the Prototypes world. [System.Serializable] public class PrototypesException : Exception { public PrototypesException(string message) : base(message) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/QLinException.cs0000644000175000017500000000076411700531646027012 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Qlin { /// /// exceptions to signal improper use of the /// IQLin /// query interface. /// [System.Serializable] public class QLinException : Db4oException { public QLinException(string message) : base(message) { } public QLinException(Exception cause) : base(cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/QLinSupport.cs0000644000175000017500000001136511700531646026527 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Qlin { /// /// static import support class for /// IQLin /// queries. /// /// 8.0 public class QLinSupport { /// /// returns a prototype object for a specific class /// to be passed to the where expression of a QLin /// query. /// /// /// returns a prototype object for a specific class /// to be passed to the where expression of a QLin /// query. /// /// IQLin.Where(object) public static object Prototype(Type clazz) { try { return _prototypes.PrototypeForClass(clazz); } catch (PrototypesException ex) { throw new QLinException(ex); } } /// sets the context for the next query on this thread. /// /// sets the context for the next query on this thread. /// This method should never have to be called manually. /// The framework should set the context up. /// public static void Context(IReflectClass claxx) { _context.Value = claxx; } /// sets the context for the next query on this thread. /// /// sets the context for the next query on this thread. /// This method should never have to be called manually. /// The framework should set the context up. /// public static void Context(Type clazz) { _context.Value = ReflectorUtils.ReflectClassFor(_prototypes.Reflector(), clazz); } /// /// shortcut for the /// Prototype(System.Type<T>) /// method. /// public static object P(Type clazz) { return Prototype(clazz); } /// /// parameter for /// IQLin.OrderBy(object, QLinOrderByDirection) /// /// public static QLinOrderByDirection Ascending() { return QLinOrderByDirection.Ascending; } /// /// parameter for /// IQLin.OrderBy(object, QLinOrderByDirection) /// /// public static QLinOrderByDirection Descending() { return QLinOrderByDirection.Descending; } /// public for implementors, do not use directly public static IEnumerator BackingFieldPath(object expression) { CheckForNull(expression); if (expression is IReflectField) { return Iterators.Iterate(new string[] { ((IReflectField)expression).GetName() }); } IEnumerator path = _prototypes.BackingFieldPath(((IReflectClass)_context.Value), expression); if (path != null) { return path; } return Iterators.Iterate(new string[] { FieldByFieldName(expression).GetName() }); } /// converts an expression to a single field. /// converts an expression to a single field. public static IReflectField Field(object expression) { CheckForNull(expression); if (expression is IReflectField) { return (IReflectField)expression; } IEnumerator path = _prototypes.BackingFieldPath(((IReflectClass)_context.Value), expression); if (path != null) { if (path.MoveNext()) { expression = path.Current; } if (path.MoveNext()) { path.Reset(); throw new QLinException("expression can not be converted to a single field. It evaluates to: " + Iterators.Join(path, "[", "]", ", ")); } } return FieldByFieldName(expression); } private static IReflectField FieldByFieldName(object expression) { if (expression is string) { IReflectField field = ReflectorUtils.Field(((IReflectClass)_context.Value), (string )expression); if (field != null) { return field; } } throw new QLinException("expression can not be mapped to a field"); } private static void CheckForNull(object expression) { if (expression == null) { throw new QLinException("expression can not be null"); } } private const bool IgnoreTransientFields = true; private const int RecursionDepth = 4; private static readonly Prototypes _prototypes = new Prototypes(Prototypes.DefaultReflector (), RecursionDepth, IgnoreTransientFields); private static readonly DynamicVariable _context = DynamicVariable.NewInstance(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Qlin/IQLinable.cs0000644000175000017500000000114511700531646026062 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Qlin; namespace Db4objects.Db4o.Qlin { /// support for the new experimental QLin ("Coolin") query interface. /// /// support for the new experimental QLin ("Coolin") query interface. /// We would really like to have LINQ for Java instead. /// /// 8.0 public interface IQLinable { /// /// starts a /// IQLin /// query against a class. /// IQLin From(Type clazz); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Types/0000755000175000017500000000000011700531646024133 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Types/ITransientClass.cs0000644000175000017500000000052411700531646027531 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Types { /// Marker interface to denote that a class should not be stored by db4o. /// Marker interface to denote that a class should not be stored by db4o. public interface ITransientClass { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Types/IDb4oType.cs0000644000175000017500000000043411700531646026226 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Types { /// marker interface for all special db4o types. /// marker interface for all special db4o types. public interface IDb4oType { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Types/IUnversioned.cs0000644000175000017500000000052711700531646027100 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Types { /// /// marker interface to denote that version numbers and UUIDs should /// not be generated for a class that implements this interface /// /// public interface IUnversioned { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Types/IBlob.cs0000644000175000017500000001340111700531646025450 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Types; namespace Db4objects.Db4o.Types { /// /// the db4o Blob type to store blobs independent of the main database /// file and allows to perform asynchronous upload and download operations. /// /// /// the db4o Blob type to store blobs independent of the main database /// file and allows to perform asynchronous upload and download operations. ///

/// Usage:
/// - Define Blob fields on your user classes.
/// - As soon as an object of your class is stored, db4o automatically /// takes care that the Blob field is set.
/// - Call readFrom to read a blob file into the db4o system.
/// - Call writeTo to write a blob file from within the db4o system.
/// - getStatus may help you to determine, whether data has been /// previously stored. It may also help you to track the completion /// of the current process. ///

/// db4o client/server carries out all blob operations in a separate /// thread on a specially dedicated socket. One socket is used for /// all blob operations and operations are queued. Your application /// may continue to access db4o while a blob is transferred in the /// background. ///
public interface IBlob : IDb4oType { /// returns the name of the file the blob was stored to. /// /// returns the name of the file the blob was stored to. ///

The method may return null, if the file was never /// stored. ///
/// String the name of the file. string GetFileName(); /// returns the status after the last read- or write-operation. /// /// returns the status after the last read- or write-operation. ///

The status value returned may be any of the following:
/// Db4objects.Db4o.Ext.Status.Unused /// no data was ever stored to the Blob field.
/// Db4objects.Db4o.Ext.Status.Available /// /// available data was previously stored to the Blob field.
/// Db4objects.Db4o.Ext.Status.Queued /// an operation was triggered and is waiting for it's turn in the Blob queue.
/// Db4objects.Db4o.Ext.Status.Completed /// /// the last operation on this field was completed successfully.
/// Db4objects.Db4o.Ext.Status.Processing /// /// for internal use only.
/// Db4objects.Db4o.Ext.Status.Error /// the last operation failed.
/// or a double between 0 and 1 that signifies the current completion percentage of the currently /// running operation.

the five /// Db4objects.Db4o.Ext.Status /// constants defined in this interface or a double /// between 0 and 1 that signifies the completion of the currently running operation.

///
/// status - the current status /// constants double GetStatus(); /// reads a file into the db4o system and stores it as a blob. /// /// reads a file into the db4o system and stores it as a blob. ///

/// In Client/Server mode db4o will open an additional socket and /// process writing data in an additional thread. ///

///
/// the file the blob is to be read from. /// in case of errors void ReadFrom(Sharpen.IO.File file); /// reads a file into the db4o system and stores it as a blob. /// /// reads a file into the db4o system and stores it as a blob. ///

/// db4o will use the local file system in Client/Server mode also. ///

///
/// the file the blob is to be read from. /// in case of errors void ReadLocal(Sharpen.IO.File file); /// writes stored blob data to a file. /// /// writes stored blob data to a file. ///

/// db4o will use the local file system in Client/Server mode also. ///

///
/// /// in case of errors and in case no blob /// data was stored /// /// the file the blob is to be written to. void WriteLocal(Sharpen.IO.File file); /// writes stored blob data to a file. /// /// writes stored blob data to a file. ///

/// In Client/Server mode db4o will open an additional socket and /// process writing data in an additional thread. ///

///
/// /// in case of errors and in case no blob /// data was stored /// /// the file the blob is to be written to. void WriteTo(Sharpen.IO.File file); /// Deletes the current file stored in this BLOB. /// Deletes the current file stored in this BLOB. /// /// in case of errors and in case no /// data was stored /// void DeleteFile(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/0000755000175000017500000000000011700531646024234 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ICommonConfiguration.cs0000644000175000017500000007077611700531646030675 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o.Config; using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Config { /// /// Common configuration methods, applicable for /// embedded, client and server use of db4o.

/// In Client/Server use it is good practice to configure the /// client and the server in exactly the same way. ///
/// /// Common configuration methods, applicable for /// embedded, client and server use of db4o.

/// In Client/Server use it is good practice to configure the /// client and the server in exactly the same way. ///
/// 7.5 public interface ICommonConfiguration { /// adds a new Alias for a class, namespace or package. /// /// adds a new Alias for a class, namespace or package. ///

Aliases can be used to persist classes in the running /// application to different persistent classes in a database file /// or on a db4o server. ///

Two simple Alias implementations are supplied along with /// db4o:
/// - /// TypeAlias /// provides an #equals() resolver to match /// names directly.
/// - /// WildcardAlias /// allows simple pattern matching /// with one single '*' wildcard character.
///
/// It is possible to create /// own complex /// IAlias /// constructs by creating own resolvers /// that implement the /// IAlias /// interface. ///

/// Examples of concrete usecases: ///

/// /// // Creating an Alias for a single class
/// Db4o.configure().addAlias(
///   new TypeAlias("com.f1.Pilot", "com.f1.Driver"));
///

/// // Accessing a .NET assembly from a Java package
/// Db4o.configure().addAlias(
///   new WildcardAlias(
///     "Tutorial.F1.*, Tutorial",
///     "com.f1.*"));
///

/// // Mapping a Java package onto another
/// Db4o.configure().addAlias(
///   new WildcardAlias(
///     "com.f1.*",
///     "com.f1.client*"));
///

Aliases that translate the persistent name of a class to /// a name that already exists as a persistent name in the database /// (or on the server) are not permitted and will throw an exception /// when the database file is opened. ///

Aliases should be configured before opening a database file /// or connecting to a server.

/// In client/server environment it is good practice to configure the /// client and the server in exactly the same way. ///
void AddAlias(IAlias alias); /// /// Removes an alias previously added with /// IConfiguration.AddAlias(IAlias) /// . /// /// the alias to remove void RemoveAlias(IAlias alias); /// sets the activation depth to the specified value. /// /// sets the activation depth to the specified value. ///

Why activation?
/// When objects are instantiated from the database, the instantiation of member /// objects needs to be limited to a certain depth. Otherwise a single object /// could lead to loading the complete database into memory, if all objects where /// reachable from a single root object.

/// db4o uses the concept "depth", the number of field-to-field hops an object /// is away from another object. The preconfigured "activation depth" db4o uses /// in the default setting is 5. ///

Whenever an application iterates through the /// IObjectSet /// of a query result, the result objects /// will be activated to the configured activation depth.

/// A concrete example with the preconfigured activation depth of 5:
///
		/// // Object foo is the result of a query, it is delivered by the ObjectSet
		/// object foo = objectSet.Next();
/// foo.member1.member2.member3.member4.member5 will be a valid object
/// foo, member1, member2, member3 and member4 will be activated
/// member5 will be deactivated, all of it's members will be null
/// member5 can be activated at any time by calling /// IObjectContainer.Activate(member5, depth) /// /// . ///

/// Note that raising the global activation depth will consume more memory and /// have negative effects on the performance of first-time retrievals. Lowering /// the global activation depth needs more individual activation work but can /// increase performance of queries.

/// IObjectContainer.Deactivate(object, depth) /// /// can be used to manually free memory by deactivating objects.

/// In client/server environment it is good practice to configure the /// client and the server in exactly the same way.

. ///
/// configuring classes individually /// /// gets the configured activation depth. /// sets the activation depth to the specified value. /// /// sets the activation depth to the specified value. ///

Why activation?
/// When objects are instantiated from the database, the instantiation of member /// objects needs to be limited to a certain depth. Otherwise a single object /// could lead to loading the complete database into memory, if all objects where /// reachable from a single root object.

/// db4o uses the concept "depth", the number of field-to-field hops an object /// is away from another object. The preconfigured "activation depth" db4o uses /// in the default setting is 5. ///

Whenever an application iterates through the /// IObjectSet /// of a query result, the result objects /// will be activated to the configured activation depth.

/// A concrete example with the preconfigured activation depth of 5:
///
		/// // Object foo is the result of a query, it is delivered by the ObjectSet
		/// object foo = objectSet.Next();
/// foo.member1.member2.member3.member4.member5 will be a valid object
/// foo, member1, member2, member3 and member4 will be activated
/// member5 will be deactivated, all of it's members will be null
/// member5 can be activated at any time by calling /// IObjectContainer.Activate(member5, depth) /// /// . ///

/// Note that raising the global activation depth will consume more memory and /// have negative effects on the performance of first-time retrievals. Lowering /// the global activation depth needs more individual activation work but can /// increase performance of queries.

/// IObjectContainer.Deactivate(object, depth) /// /// can be used to manually free memory by deactivating objects.

/// In client/server environment it is good practice to configure the /// client and the server in exactly the same way.

. ///
/// configuring classes individually /// /// gets the configured activation depth. int ActivationDepth { get; set; } /// /// adds ConfigurationItems to be applied when /// an ObjectContainer or ObjectServer is opened. /// /// /// adds ConfigurationItems to be applied when /// an ObjectContainer or ObjectServer is opened. /// /// the ConfigurationItem void Add(IConfigurationItem configurationItem); /// turns automatic database file format version updates on. /// /// turns automatic database file format version updates on. ///

Upon db4o database file format version changes, /// db4o can automatically update database files to the /// current version. db4objects does not provide functionality /// to reverse this process. It is not ensured that updated /// database files can be read with older db4o versions. /// In some cases (Example: using ObjectManager) it may not be /// desirable to update database files automatically therefore /// automatic updating is turned off by default for /// security reasons. ///

Call this method to turn automatic database file /// version updating on. ///

If automatic updating is turned off, db4o will refuse /// to open database files that use an older database file format.

/// In client/server environment it is good practice to configure the /// client and the server in exactly the same way. ///
bool AllowVersionUpdates { set; } /// turns automatic shutdown of the engine on and off. /// /// turns automatic shutdown of the engine on and off. /// The default and recommended setting is true.

///
bool AutomaticShutDown { set; } /// configures the size of BTree nodes in indexes. /// /// configures the size of BTree nodes in indexes. ///

Default setting: 100 ///
Lower values will allow a lower memory footprint /// and more efficient reading and writing of small slots. ///
Higher values will reduce the overall number of /// read and write operations and allow better performance /// at the cost of more RAM use.

/// In client/server environment it is good practice to configure the /// client and the server in exactly the same way. ///
/// the number of elements held in one BTree node. int BTreeNodeSize { set; } /// turns callback methods on and off. /// /// turns callback methods on and off. ///

Callbacks are turned on by default.

/// A tuning hint: If callbacks are not used, you can turn this feature off, to /// prevent db4o from looking for callback methods in persistent classes. This will /// increase the performance on system startup.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way. ///
/// false to turn callback methods off /// Using callbacks bool Callbacks { set; } /// /// advises db4o to try instantiating objects with/without calling /// constructors. /// /// /// advises db4o to try instantiating objects with/without calling /// constructors. ///

/// Not all .NET-environments support this feature. db4o will /// attempt, to follow the setting as good as the enviroment supports. /// This setting may also be overridden for individual classes in /// Db4objects.Db4o.Config.IObjectClass.CallConstructor /// /// . ///

The default setting depends on the features supported by your current environment.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way. ///

///
/// Db4objects.Db4o.Config.IObjectClass.CallConstructor /// bool CallConstructors { set; } /// /// tuning feature: configures whether db4o checks all persistent classes upon system /// startup, for added or removed fields. /// /// /// tuning feature: configures whether db4o checks all persistent classes upon system /// startup, for added or removed fields. ///

If this configuration setting is set to false while a database is /// being created, members of classes will not be detected and stored. ///

This setting can be set to false in a production environment after /// all persistent classes have been stored at least once and classes will not /// be modified any further in the future.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way. ///

Default value:
/// true ///
/// the desired setting bool DetectSchemaChanges { set; } /// returns the configuration interface for diagnostics. /// returns the configuration interface for diagnostics. /// the configuration interface for diagnostics. IDiagnosticConfiguration Diagnostic { get; } /// configures whether Exceptions are to be thrown, if objects can not be stored. /// /// /// configures whether Exceptions are to be thrown, if objects can not be stored. ///

db4o requires the presence of a constructor that can be used to /// instantiate objects. If no default public constructor is present, all /// available constructors are tested, whether an instance of the class can /// be instantiated. Null is passed to all constructor parameters. /// The first constructor that is successfully tested will /// be used throughout the running db4o session. If an instance of the class /// can not be instantiated, the object will not be stored. By default, /// execution will be stopped with an Exception. This method can /// be used to configure db4o to not throw an /// ObjectNotStorableException /// /// if an object can not be stored. ///

/// The default for this setting is true.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way.

///
/// true to throw Exceptions if objects can not be stored. bool ExceptionsOnNotStorable { set; } /// configures db4o to call Intern() on strings upon retrieval. /// /// configures db4o to call Intern on strings upon retrieval if set to true. /// In client/server environment the setting should be used on both /// client and server. /// bool InternStrings { set; } // TODO: refactor to use provider? /// allows to mark fields as transient with custom attributes. /// /// allows to mark fields as transient with custom attributes. ///

.NET only: Call this method with the attribute name that you /// wish to use to mark fields as transient. Multiple transient attributes /// are possible by calling this method multiple times with different /// attribute names.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way.

///
/// /// - the fully qualified name of the attribute, including /// it's namespace /// TODO: can we provide meaningful java side semantics for this one? /// TODO: USE A CLASS!!!!!! /// void MarkTransient(string attributeName); /// sets the detail level of db4o messages. /// /// sets the detail level of db4o messages. Messages will be output to the /// configured output /// TextWriter /// . ///

/// Level 0 - no messages
/// Level 1 - open and close messages
/// Level 2 - messages for new, update and delete
/// Level 3 - messages for activate and deactivate

/// When using client-server and the level is set to 0, the server will override this and set it to 1. To get around this you can set the level to -1. This has the effect of not returning any messages.

/// In client-server environment this setting can be used on client or on server /// depending on which information do you want to track (server side provides more /// detailed information).

///
/// integer from 0 to 3 /// TODO: replace int with enumeration /// int MessageLevel { set; } /// /// returns an /// IObjectClass /// object /// to configure the specified class. ///

/// The clazz parameter can be any of the following:
/// - a fully qualified classname as a String.
/// - a Class object.
/// - any other object to be used as a template.

///
/// class name, Class object, or example object.

/// /// an instance of an /// IObjectClass /// object for configuration. /// IObjectClass ObjectClass(object clazz); /// /// If set to true, db4o will try to optimize native queries /// dynamically at query execution time, otherwise it will /// run native queries in unoptimized mode as SODA evaluations. /// /// /// If set to true, db4o will try to optimize native queries /// dynamically at query execution time, otherwise it will /// run native queries in unoptimized mode as SODA evaluations. /// The following assemblies should be available for native query switch to take effect: /// Db4objects.Db4o.NativeQueries.dll, Db4objects.Db4o.Instrumentation.dll. ///

The default setting is true.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way.

///
/// Db4objects.Db4o.Config.ICommonConfiguration.OptimizeNativeQueries /// /// If set to true, db4o will try to optimize native queries /// dynamically at query execution time, otherwise it will /// run native queries in unoptimized mode as SODA evaluations. /// /// /// If set to true, db4o will try to optimize native queries /// dynamically at query execution time, otherwise it will /// run native queries in unoptimized mode as SODA evaluations. /// The following assemblies should be available for native query switch to take effect: /// Db4objects.Db4o.NativeQueries.dll, Db4objects.Db4o.Instrumentation.dll. ///

The default setting is true.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way.

///
/// Db4objects.Db4o.Config.ICommonConfiguration.OptimizeNativeQueries bool OptimizeNativeQueries { get; set; } /// returns the Query configuration interface. /// returns the Query configuration interface. IQueryConfiguration Queries { get; } /// configures the use of a specially designed reflection implementation. /// /// configures the use of a specially designed reflection implementation. ///

/// db4o internally uses java.lang.reflect.* by default. On platforms that /// do not support this package, customized implementations may be written /// to supply all the functionality of the interfaces in the com.db4o.reflect /// package. This method can be used to install a custom reflection /// implementation.

/// In client-server environment this setting should be used on both the client and /// the server side (reflector class must be available)

///
void ReflectWith(IReflector reflector); /// /// Assigns a /// TextWriter /// where db4o is to print its event messages. ///

Messages are useful for debugging purposes and for learning /// to understand, how db4o works. The message level can be raised with /// IConfiguration.MessageLevel(int) /// to produce more detailed messages. ///

Use outStream(System.out) to print messages to the /// console.

/// In client-server environment this setting should be used on the same side /// where /// IConfiguration.MessageLevel(int) /// is used.

///
/// the new PrintStream for messages. /// MessageLevel(int) TextWriter OutStream { set; } /// configures the string encoding to be used. /// /// configures the string encoding to be used. ///

The string encoding can not be changed in the lifetime of a /// database file. To set up the database with the correct string encoding, /// this configuration needs to be set correctly before a database /// file is created with the first call to /// Db4objects.Db4o.Db4oFactory.OpenFile /// /// or /// Db4objects.Db4o.Db4oFactory.OpenServer /// /// . ///

For subsequent open calls, db4o remembers built-in /// string encodings. If a custom encoding is used (an encoding that is /// not supplied from within the db4o library), the correct encoding /// needs to be configured correctly again for all subsequent calls /// that open database files. ///

/// In client-server mode, the server and all clients need to have the same string encoding.

/// Example:
/// config.StringEncoding = StringEncodings.Utf8(); ///
/// Db4objects.Db4o.Config.Encoding.StringEncodings /// IStringEncoding StringEncoding { set; } /// /// tuning feature: configures whether db4o should try to instantiate one instance /// of each persistent class on system startup. /// /// /// tuning feature: configures whether db4o should try to instantiate one instance /// of each persistent class on system startup. ///

In a production environment this setting can be set to false, /// if all persistent classes have public default constructors. ///

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way.

/// Default value:
/// true ///
/// the desired setting bool TestConstructors { set; } /// specifies the global updateDepth. /// /// specifies the global updateDepth. ///

see the documentation of /// /// for further details.

/// The value be may be overridden for individual classes.

/// The default setting is 1: Only the object passed to /// Db4objects.Db4o.IObjectContainer.Store(object) /// /// will be updated.

/// In a client/server environment it is good practice to configure the /// client and the server in exactly the same way.

///
/// the depth of the desired update. /// IObjectClass.UpdateDepth(int) /// IObjectClass.CascadeOnUpdate(bool) /// /// Using callbacks int UpdateDepth { set; } /// turns weak reference management on or off. /// /// turns weak reference management on or off. ///

/// This method must be called before opening a database. ///

/// Performance may be improved by running db4o without using weak /// references durring memory management at the cost of higher /// memory consumption or by alternatively implementing a manual /// memory management scheme using /// Db4objects.Db4o.Ext.IExtObjectContainer.Purge(object) /// ///

Setting the value to false causes db4o to use hard /// references to objects, preventing the garbage collection process /// from disposing of unused objects. ///

The default setting is true. ///

Ignored on JDKs before 1.2. ///
bool WeakReferences { set; } /// configures the timer for WeakReference collection. /// /// configures the timer for WeakReference collection. ///

The default setting is 1000 milliseconds. ///

Configure this setting to zero to turn WeakReference /// collection off. ///

Ignored on JDKs before 1.2.

///
/// the time in milliseconds int WeakReferenceCollectionInterval { set; } /// /// allows registering special TypeHandlers for customized marshalling /// and customized comparisons. /// /// /// allows registering special TypeHandlers for customized marshalling /// and customized comparisons. /// /// /// to specify for which classes and versions the /// TypeHandler is to be used. /// /// to be used for the classes that match the predicate. void RegisterTypeHandler(ITypeHandlerPredicate predicate, ITypeHandler4 typeHandler ); /// Db4objects.Db4o.Foundation.IEnvironment /// IEnvironmentConfiguration Environment { get; } /// /// Registers a /// INameProvider /// that assigns a custom name to the database to be used in /// object.ToString() /// . /// void NameProvider(INameProvider provider); ///

Sets the max stack depth that will be used for recursive storing and activating an object. ///

/// ///

Sets the max stack depth that will be used for recursive storing and activating an object. ///

The default value is set to /// Db4objects.Db4o.Internal.Const4.DefaultMaxStackDepth /// ///

On Android platform, we recomend setting this to 2. /// /// the desired max stack depth. ///

gets the configured max stack depth. /// gets the configured max stack depth. /// the configured max stack depth. int MaxStackDepth { get; set; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ConfigScope.cs0000644000175000017500000000707511700531646026773 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Config { /// /// Defines a scope of applicability of a config setting.

/// Some of the configuration settings can be either:

/// - enabled globally;
/// - enabled individually for a specified class;
/// - disabled.

///
/// IConfiguration.GenerateUUIDs(ConfigScope) /// /// IConfiguration.GenerateVersionNumbers(ConfigScope) /// [System.Serializable] public sealed class ConfigScope { public const int DisabledId = -1; public const int IndividuallyId = 1; public const int GloballyId = int.MaxValue; private static readonly string DisabledName = "disabled"; private static readonly string IndividuallyName = "individually"; private static readonly string GloballyName = "globally"; /// Marks a configuration feature as globally disabled. /// Marks a configuration feature as globally disabled. public static readonly Db4objects.Db4o.Config.ConfigScope Disabled = new Db4objects.Db4o.Config.ConfigScope (DisabledId, DisabledName); /// Marks a configuration feature as individually configurable. /// Marks a configuration feature as individually configurable. public static readonly Db4objects.Db4o.Config.ConfigScope Individually = new Db4objects.Db4o.Config.ConfigScope (IndividuallyId, IndividuallyName); /// Marks a configuration feature as globally enabled. /// Marks a configuration feature as globally enabled. public static readonly Db4objects.Db4o.Config.ConfigScope Globally = new Db4objects.Db4o.Config.ConfigScope (GloballyId, GloballyName); private readonly int _value; private readonly string _name; private ConfigScope(int value, string name) { _value = value; _name = name; } /// /// Checks if the current configuration scope is globally /// enabled or disabled. /// /// /// Checks if the current configuration scope is globally /// enabled or disabled. /// /// - default result /// /// false if disabled, true if globally enabled, default /// value otherwise /// public bool ApplyConfig(TernaryBool defaultValue) { switch (_value) { case DisabledId: { return false; } case GloballyId: { return !defaultValue.DefiniteNo(); } default: { return defaultValue.DefiniteYes(); break; } } } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } Db4objects.Db4o.Config.ConfigScope tb = (Db4objects.Db4o.Config.ConfigScope)obj; return _value == tb._value; } public override int GetHashCode() { return _value; } private object ReadResolve() { switch (_value) { case DisabledId: { return Disabled; } case IndividuallyId: { return Individually; } default: { return Globally; break; } } } public override string ToString() { return _name; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IQueryConfiguration.cs0000644000175000017500000001576511700531646030547 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// interface to configure the querying settings to be used by the query processor. /// /// /// interface to configure the querying settings to be used by the query processor. ///

All settings can be configured after opening an ObjectContainer. /// In a Client/Server setup the client-side configuration will be used. ///
public interface IQueryConfiguration { /// configures the query processor evaluation mode. /// /// configures the query processor evaluation mode. ///

The db4o query processor can run in three modes:
/// - Immediate mode
/// - Snapshot mode
/// - Lazy mode

/// In Immediate mode, a query will be fully evaluated when /// Db4objects.Db4o.Query.IQuery.Execute() /// /// /// is called. The complete /// Db4objects.Db4o.IObjectSet /// of all matching IDs is /// generated immediately.

/// In Snapshot mode, the /// Db4objects.Db4o.Query.IQuery.Execute() /// /// call will trigger all index /// processing immediately. A snapshot of the current state of all relevant indexes /// is taken for further processing by the SODA query processor. All non-indexed /// constraints and all evaluations will be run when the user application iterates /// through the resulting /// Db4objects.Db4o.IObjectSet /// .

/// In Lazy mode, the /// Db4objects.Db4o.Query.IQuery.Execute() /// /// call will only create an Iterator /// against the best index found. Further query processing (including all index /// processing) will happen when the user application iterates through the resulting /// Db4objects.Db4o.IObjectSet /// .

/// Advantages and disadvantages of the individual modes:

/// Immediate mode
/// + If the query is intended to iterate through the entire resulting /// Db4objects.Db4o.IObjectSet /// , /// this mode will be slightly faster than the others.
/// + The query will process without intermediate side effects from changed /// objects (by the caller or by other transactions).
/// - Query processing can block the server for a long time.
/// - In comparison to the other modes it will take longest until the first results /// are returned.
/// - The ObjectSet will require a considerate amount of memory to hold the IDs of /// all found objects.

/// Snapshot mode
/// + Index processing will happen without possible side effects from changes made /// by the caller or by other transaction.
/// + Since index processing is fast, a server will not be blocked for a long time.
/// - The entire candidate index will be loaded into memory. It will stay there /// until the query ObjectSet is garbage collected. In a C/S setup, the memory will /// be used on the server side.

/// Lazy mode
/// + The call to /// Db4objects.Db4o.Query.IQuery.Execute() /// /// will return very fast. First results can be /// made available to the application before the query is fully processed.
/// + A query will consume hardly any memory at all because no intermediate ID /// representation is ever created.
/// - Lazy queries check candidates when iterating through the resulting /// Db4objects.Db4o.IObjectSet /// . /// In doing so the query processor takes changes into account that may have happened /// since the Query#execute()call: committed changes from other transactions, and /// uncommitted changes from the calling transaction. There is a wide range /// of possible side effects. The underlying index may have changed. Objects themselves /// may have changed in the meanwhile. There even is the chance of creating an endless /// loop, if the caller of the iterates through the /// Db4objects.Db4o.IObjectSet /// and changes each /// object in a way that it is placed at the end of the index: The same objects can be /// revisited over and over. In lazy mode it can make sense to work in a way one would /// work with collections to avoid concurrent modification exceptions. For instance one /// could iterate through the /// Db4objects.Db4o.IObjectSet /// first and store all objects to a temporary /// other collection representation before changing objects and storing them back to db4o.

/// Note: Some method calls against a lazy /// Db4objects.Db4o.IObjectSet /// will require the query /// processor to create a snapshot or to evaluate the query fully. An example of such /// a call is /// Db4objects.Db4o.IObjectSet.Count() /// /// . ///

/// The default query evaluation mode is Immediate mode. ///

/// Recommendations:
/// - Lazy mode can be an excellent choice for single transaction read use, /// to keep memory consumption as low as possible.
/// - Client/Server applications with the risk of concurrent modifications should prefer /// Snapshot mode to avoid side effects from other transactions. ///

/// To change the evaluationMode, pass any of the three static /// QueryEvaluationMode /// constants from the /// QueryEvaluationMode /// class to this method:
/// - /// QueryEvaluationMode.Immediate ///
/// - /// QueryEvaluationMode.Snapshot ///
/// - /// QueryEvaluationMode.Lazy ///

/// This setting must be issued from the client side. ///
void EvaluationMode(QueryEvaluationMode mode); /// EvaluationMode(QueryEvaluationMode) /// /// the currently configured query evaluation mode QueryEvaluationMode EvaluationMode(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IEmbeddedConfiguration.cs0000644000175000017500000000163111700531646031116 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// Configuration interface for db4o in embedded use. /// Configuration interface for db4o in embedded use. /// 7.5 public interface IEmbeddedConfiguration : IFileConfigurationProvider, ICommonConfigurationProvider , ICacheConfigurationProvider, IIdSystemConfigurationProvider { /// /// adds ConfigurationItems to be applied when /// a networking /// EmbeddedObjectContainer /// is opened. /// /// /// the /// IEmbeddedConfigurationItem /// /// 7.12 void AddConfigurationItem(IEmbeddedConfigurationItem configItem); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IFreespaceConfiguration.cs0000644000175000017500000000750011700531646031323 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// interface to configure the freespace system to be used. /// /// interface to configure the freespace system to be used. ///

All methods should be called before opening database files. /// If db4o is instructed to exchange the system /// ( /// UseBTreeSystem() /// , /// UseRamSystem() /// ) /// this will happen on opening the database file.

/// By default the ram based system will be used. ///
public interface IFreespaceConfiguration { /// /// tuning feature: configures the minimum size of free space slots in the database file /// that are to be reused. /// /// /// tuning feature: configures the minimum size of free space slots in the database file /// that are to be reused. ///

When objects are updated or deleted, the space previously occupied in the /// database file is marked as "free", so it can be reused. db4o maintains two lists /// in RAM, sorted by address and by size. Adjacent entries are merged. After a large /// number of updates or deletes have been executed, the lists can become large, causing /// RAM consumption and performance loss for maintenance. With this method you can /// specify an upper bound for the byte slot size to discard. ///

Pass Integer.MAX_VALUE to this method to discard all free slots for /// the best possible startup time.

/// The downside of setting this value: Database files will necessarily grow faster. ///

Default value:
/// 0 all space is reused ///
/// Slots with this size or smaller will be lost. void DiscardSmallerThan(int byteCount); /// /// Configure a way to overwrite freed space in the database file with custom /// (for example: random) bytes. /// /// /// Configure a way to overwrite freed space in the database file with custom /// (for example: random) bytes. Will slow down I/O operation. /// The value of this setting may be cached internally and can thus not be /// reliably set after an object container has been opened. /// /// The freespace overwriting callback to use void FreespaceFiller(IFreespaceFiller freespaceFiller); /// configures db4o to use a BTree-based freespace system. /// /// configures db4o to use a BTree-based freespace system. ///

Advantages
/// - ACID, no freespace is lost on abnormal system termination
/// - low memory consumption
///
Disadvantages
/// - slower than the RAM-based system, since freespace information /// is written during every commit
///
void UseBTreeSystem(); /// discontinued freespace system, only available before db4o 7.0. /// discontinued freespace system, only available before db4o 7.0. [System.ObsoleteAttribute(@"Please use the BTree freespace system instead by calling UseBTreeSystem() ." )] void UseIndexSystem(); /// configures db4o to use a RAM-based freespace system. /// /// configures db4o to use a RAM-based freespace system. ///

Advantages
/// - best performance
///
Disadvantages
/// - upon abnormal system termination all freespace is lost
/// - memory consumption
///
void UseRamSystem(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IObjectConstructor.cs0000644000175000017500000000331711700531646030354 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// interface to allow instantiating objects by calling specific constructors. /// /// /// /// interface to allow instantiating objects by calling specific constructors. ///

/// By writing classes that implement this interface, it is possible to /// define which constructor is to be used during the instantiation of a stored object. ///

/// Before starting a db4o session, translator classes that implement the /// ObjectConstructor or /// IObjectTranslator /// need to be registered.

/// Example:
/// /// IConfiguration config = Db4oFactory.Configure();
/// IObjectClass oc = config.ObjectClass("Namespace.ClassName");
/// oc.Translate(new FooTranslator()); ///


///
public interface IObjectConstructor : IObjectTranslator { /// db4o calls this method when a stored object needs to be instantiated. /// /// db4o calls this method when a stored object needs to be instantiated. ///

///
/// the ObjectContainer used /// /// the object stored with /// ObjectTranslator.onStore /// /// . /// /// the instantiated object. object OnInstantiate(IObjectContainer container, object storedObject); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ICacheConfiguration.cs0000644000175000017500000000132111700531646030424 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config { /// Interface to configure the cache configurations. /// Interface to configure the cache configurations. public interface ICacheConfiguration { /// /// configures the size of the slot cache to hold a number of /// slots in the cache. /// /// /// configures the size of the slot cache to hold a number of /// slots in the cache. /// /// the number of slots [System.ObsoleteAttribute(@"since 7.14 BTrees have their own LRU cache now.")] int SlotCacheSize { set; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ILegacyClientServerFactory.cs0000644000175000017500000000211511700531646031755 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// public interface ILegacyClientServerFactory { /// /// /// IObjectContainer OpenClient(IConfiguration config, string hostName, int port, string user, string password); /// /// /// /// /// IObjectServer OpenServer(IConfiguration config, string databaseFileName, int port ); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IFreespaceFiller.cs0000644000175000017500000000124311700531646027727 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.Config { /// Callback hook for overwriting freed space in the database file. /// Callback hook for overwriting freed space in the database file. public interface IFreespaceFiller { /// Called to overwrite freed space in the database file. /// Called to overwrite freed space in the database file. /// Handle for the freed slot /// void Fill(BlockAwareBinWindow io); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/GlobalOnlyConfigException.cs0000644000175000017500000000201211700531646031625 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Config { /// /// db4o-specific exception.

/// This exception is thrown when a global configuration /// setting is attempted on an open object container. ///
/// /// db4o-specific exception.

/// This exception is thrown when a global configuration /// setting is attempted on an open object container. ///
/// IConfiguration.BlockSize(int) /// IConfiguration.Encrypt(bool) /// IConfiguration.Io(Db4objects.Db4o.IO.IoAdapter) /// /// IConfiguration.Password(string) [System.Serializable] public class GlobalOnlyConfigException : Db4oRecoverableException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ICompare.cs0000644000175000017500000000122611700531646026263 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config { /// allows special comparison behaviour during query evaluation. /// /// allows special comparison behaviour during query evaluation. ///

db4o will use the Object returned by the /// Compare() /// method for all query comparisons. ///
public interface ICompare { /// return the Object to be compared during query evaluation. /// return the Object to be compared during query evaluation. object Compare(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IEnvironmentConfiguration.cs0000644000175000017500000000147211700531646031734 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config { /// Configures the environment (set of services) used by db4o. /// Configures the environment (set of services) used by db4o. /// Db4objects.Db4o.Foundation.IEnvironment /// /// Db4objects.Db4o.Foundation.Environments.My(System.Type<T>) /// public interface IEnvironmentConfiguration { /// Contributes a service to the db4o environment. /// Contributes a service to the db4o environment. /// void Add(object service); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IIdSystemConfigurationProvider.cs0000644000175000017500000000126111700531646032700 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// A configuration provider that provides access /// to the IdSystem-related configuration methods. /// /// /// A configuration provider that provides access /// to the IdSystem-related configuration methods. /// public interface IIdSystemConfigurationProvider { /// Access to the IdSystem-related configuration methods. /// Access to the IdSystem-related configuration methods. IIdSystemConfiguration IdSystem { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IFileConfiguration.cs0000644000175000017500000003115211700531646030305 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.Config { /// /// File-related configuration methods, applicable /// for db4o embedded use and on the server in a /// Client/Server setup. /// /// /// File-related configuration methods, applicable /// for db4o embedded use and on the server in a /// Client/Server setup. /// /// 7.5 /// IFileConfigurationProvider.File() /// public interface IFileConfiguration { /// sets the storage data blocksize for new ObjectContainers. /// /// sets the storage data blocksize for new ObjectContainers. ///

The standard setting is 1 allowing for a maximum /// database file size of 2GB. This value can be increased /// to allow larger database files, although some space will /// be lost to padding because the size of some stored objects /// will not be an exact multiple of the block size. A /// recommended setting for large database files is 8, since /// internal pointers have this length.

/// This setting is only effective when the database is first created. ///
/// the size in bytes from 1 to 127 int BlockSize { set; } /// /// configures the size database files should grow in bytes, when no /// free slot is found within. /// /// /// configures the size database files should grow in bytes, when no /// free slot is found within. ///

Tuning setting. ///

Whenever no free slot of sufficient length can be found /// within the current database file, the database file's length /// is extended. This configuration setting configures by how much /// it should be extended, in bytes.

/// This configuration setting is intended to reduce fragmentation. /// Higher values will produce bigger database files and less /// fragmentation.

/// To extend the database file, a single byte array is created /// and written to the end of the file in one write operation. Be /// aware that a high setting will require allocating memory for /// this byte array. ///
/// amount of bytes int DatabaseGrowthSize { set; } /// turns commit recovery off. /// /// turns commit recovery off. ///

db4o uses a two-phase commit algorithm. In a first step all intended /// changes are written to a free place in the database file, the "transaction commit /// record". In a second step the /// actual changes are performed. If the system breaks down during commit, the /// commit process is restarted when the database file is opened the next time. /// On very rare occasions (possibilities: hardware failure or editing the database /// file with an external tool) the transaction commit record may be broken. In this /// case, this method can be used to try to open the database file without commit /// recovery. The method should only be used in emergency situations after consulting /// db4o support. ///
void DisableCommitRecovery(); /// returns the freespace configuration interface. /// returns the freespace configuration interface. IFreespaceConfiguration Freespace { get; } /// configures db4o to generate UUIDs for stored objects. /// /// configures db4o to generate UUIDs for stored objects. /// This setting should be used when the database is first created.

///
/// the scope for UUID generation: disabled, generate for all classes, or configure individually /// ConfigScope GenerateUUIDs { set; } /// configures db4o to generate version numbers for stored objects. /// /// configures db4o to generate version numbers for stored objects. /// This setting should be used when the database is first created. /// /// the scope for version number generation: disabled, generate for all classes, or configure individually /// [System.ObsoleteAttribute(@"As of version 8.0 please use GenerateCommitTimestamps(bool) instead." )] ConfigScope GenerateVersionNumbers { set; } /// /// Configures db4o to generate commit timestamps for all stored objects.
///
/// All the objects commited within a transaction will share the same commit timestamp. ///
/// /// Configures db4o to generate commit timestamps for all stored objects.
///
/// All the objects commited within a transaction will share the same commit timestamp. ///
/// This setting should be used when the database is first created.
///
/// Afterwards you can access the object's commit timestamp like this:
///
///
		/// ObjectContainer container = ...;
		/// ObjectInfo objectInfo = container.ext().getObjectInfo(obj);
		/// long commitTimestamp = objectInfo.getVersion();
		/// 
///
/// /// if true, commit timetamps will be generated for all stored /// objects. If you already have commit timestamps for stored /// objects and later set this flag to false, although you wont be /// able to access them, the commit timestamps will still be taking /// space in your file container. The only way to free that space /// is defragmenting the container. /// /// 8.0 bool GenerateCommitTimestamps { set; } /// allows to configure db4o to use a customized byte IO storage mechanism. /// /// allows to configure db4o to use a customized byte IO storage mechanism. ///

You can implement the interface /// Db4objects.Db4o.IO.IStorage /// to /// write your own. Possible usecases could be improved performance /// with a native library, mirrored write to two files, encryption or /// read-on-write fail-safety control.

///
/// - the storage /// Db4objects.Db4o.IO.FileStorage /// Db4objects.Db4o.IO.CachingStorage /// /// Db4objects.Db4o.IO.MemoryStorage /// /// /// /// returns the configured /// Db4objects.Db4o.IO.IStorage /// . /// /// IStorage Storage { get; set; } /// can be used to turn the database file locking thread off. /// /// can be used to turn the database file locking thread off. ///

Caution!
If database file /// locking is turned off, concurrent write access to the same /// database file from different sessions will corrupt the /// database file immediately.

This method /// has no effect on open ObjectContainers. It will only affect how /// ObjectContainers are opened.

/// The default setting is true.

/// ///
bool LockDatabaseFile { set; } /// tuning feature only: reserves a number of bytes in database files. /// /// tuning feature only: reserves a number of bytes in database files. ///

The global setting is used for the creation of new database /// files. ///

Without this setting, storage space will be allocated /// continuously as required. However, allocation of a fixed number /// of bytes at one time makes it more likely that the database will be /// stored in one chunk on the mass storage. Less read/write head movement /// can result in improved performance.

/// Note:
Allocated space will be lost on abnormal termination /// of the database engine (hardware crash, VM crash). A Defragment run /// will recover the lost space. For the best possible performance, this /// method should be called before the Defragment run to configure the /// allocation of storage space to be slightly greater than the anticipated /// database file size. ///

/// Default configuration: 0

///
/// the number of bytes to reserve /// /// long ReserveStorageSpace { set; } /// /// configures the path to be used to store and read /// Blob data. /// /// /// configures the path to be used to store and read /// Blob data. ///

///
/// the path to be used /// string BlobPath { set; } /// turns readOnly mode on and off. /// /// turns readOnly mode on and off. ///

This method configures the mode in which subsequent calls to /// Db4objects.Db4o.Db4oEmbedded.OpenFile(IEmbeddedConfiguration, string) /// /// will open files. ///

Readonly mode allows to open an unlimited number of reading /// processes on one database file. It is also convenient /// for deploying db4o database files on CD-ROM.

///
/// /// true for configuring readOnly mode for subsequent /// calls to /// Db4o.openFile() /// . /// TODO: this is rather embedded + client than base? /// bool ReadOnly { set; } /// /// turns recovery mode on and off.

/// Recovery mode can be used to try to retrieve as much as possible /// out of an already corrupted database. ///
/// /// turns recovery mode on and off.

/// Recovery mode can be used to try to retrieve as much as possible /// out of an already corrupted database. In recovery mode internal /// checks are more relaxed. Null or invalid objects may be returned /// instead of throwing exceptions.

/// Use this method with care as a last resort to get data out of a /// corrupted database. ///
/// true to turn recover mode on. bool RecoveryMode { set; } /// /// turns asynchronous sync on and off.

/// One of the most costly operations during commit is the call to /// flush the buffers of the database file. ///
/// /// turns asynchronous sync on and off.

/// One of the most costly operations during commit is the call to /// flush the buffers of the database file. In regular mode the /// commit call has to wait until this operation has completed. /// When asynchronous sync is turned on, the sync operation will /// run in a dedicated thread, blocking all other file access /// until it has completed. This way the commit call can return /// immediately. This will allow db4o and other processes to /// continue running side-by-side while the flush call executes. /// Use this setting with care: It means that you can not be sure /// when a commit call has actually made the changes of a /// transaction durable (flushed through OS and file system /// buffers). The latency time until flushing happens is extremely /// short. The dedicated sync thread does nothing else /// except for calling sync and writing the header of the database /// file when needed. A setup with this option still guarantees /// ACID transaction processing: A database file always will be /// either in the state before commit or in the state after /// commit. Corruption can not occur. You can just not rely /// on the transaction already having been applied when the /// commit() call returns. ///
bool AsynchronousSync { set; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IObjectTranslator.cs0000644000175000017500000000426611700531646030164 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; namespace Db4objects.Db4o.Config { /// translator interface to translate objects on storage and activation. /// /// translator interface to translate objects on storage and activation. ///

/// By writing classes that implement this interface, it is possible to /// define how application classes are to be converted to be stored more efficiently. ///

/// Before starting a db4o session, translator classes need to be registered. An example:
/// /// IObjectClass oc = config.ObjectClass("Namespace.ClassName");
/// oc.Translate(new FooTranslator()); ///


///
public interface IObjectTranslator { /// db4o calls this method during storage and query evaluation. /// db4o calls this method during storage and query evaluation. /// the ObjectContainer used /// the Object to be translated /// /// return the object to store.
It needs to be of the class /// StoredClass() /// . ///
object OnStore(IObjectContainer container, object applicationObject); /// db4o calls this method during activation. /// db4o calls this method during activation. /// the ObjectContainer used /// the object to set the members on /// the object that was stored void OnActivate(IObjectContainer container, object applicationObject, object storedObject ); /// return the Class you are converting to. /// return the Class you are converting to. /// /// the Class of the object you are returning with the method /// OnStore(Db4objects.Db4o.IObjectContainer, object) /// /// Type StoredClass(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IConfigurationItem.cs0000644000175000017500000000243411700531646030325 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Config { /// /// Implement this interface for configuration items that encapsulate /// a batch of configuration settings or that need to be applied /// to ObjectContainers after they are opened. /// /// /// Implement this interface for configuration items that encapsulate /// a batch of configuration settings or that need to be applied /// to ObjectContainers after they are opened. /// public interface IConfigurationItem { /// Gives a chance for the item to augment the configuration. /// Gives a chance for the item to augment the configuration. /// the configuration that the item was added to void Prepare(IConfiguration configuration); /// Gives a chance for the item to configure the just opened ObjectContainer. /// /// Gives a chance for the item to configure the just opened ObjectContainer. /// /// the ObjectContainer to configure void Apply(IInternalObjectContainer container); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IFileConfigurationProvider.cs0000644000175000017500000000122511700531646032016 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// A configuration provider that provides access /// to the file-related configuration methods. /// /// /// A configuration provider that provides access /// to the file-related configuration methods. /// public interface IFileConfigurationProvider { /// Access to the file-related configuration methods. /// Access to the file-related configuration methods. IFileConfiguration File { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/TypeAlias.cs0000644000175000017500000000360411700531646026461 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Config { /// /// a simple Alias for a single Class or Type, using equals on /// the names in the resolve method. /// /// /// a simple Alias for a single Class or Type, using equals on /// the names in the resolve method. ///

See /// IAlias /// for concrete examples. ///
public class TypeAlias : IAlias { private readonly string _storedType; private readonly string _runtimeType; /// /// pass the stored name as the first /// parameter and the desired runtime name as the second parameter. /// /// /// pass the stored name as the first /// parameter and the desired runtime name as the second parameter. /// public TypeAlias(string storedType, string runtimeType) { if (null == storedType || null == runtimeType) { throw new ArgumentException(); } _storedType = storedType; _runtimeType = runtimeType; } public TypeAlias(Type storedClass, Type runtimeClass) : this(ReflectPlatform.FullyQualifiedName (storedClass), ReflectPlatform.FullyQualifiedName(runtimeClass)) { } /// returns the stored type name if the alias was written for the passed runtime type name /// public virtual string ResolveRuntimeName(string runtimeTypeName) { return _runtimeType.Equals(runtimeTypeName) ? _storedType : null; } /// returns the runtime type name if the alias was written for the passed stored type name /// public virtual string ResolveStoredName(string storedTypeName) { return _storedType.Equals(storedTypeName) ? _runtimeType : null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/SimpleNameProvider.cs0000644000175000017500000000112211700531646030324 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// Assigns a fixed, pre-defined name to the given /// Db4objects.Db4o.IObjectContainer /// . /// public class SimpleNameProvider : INameProvider { private readonly string _name; public SimpleNameProvider(string name) { _name = name; } public virtual string Name(IObjectContainer db) { return _name; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/Entry.cs0000644000175000017500000000054211700531646025665 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// public class Entry : ICompare, IInternal4 { public object key; public object value; public virtual object Compare() { return key; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IEmbeddedConfigurationItem.cs0000644000175000017500000000250611700531646031737 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// Implement this interface for configuration items that encapsulate /// a batch of configuration settings or that need to be applied /// to EmbeddedObjectContainers after they are opened. /// /// /// Implement this interface for configuration items that encapsulate /// a batch of configuration settings or that need to be applied /// to EmbeddedObjectContainers after they are opened. /// /// 7.12 public interface IEmbeddedConfigurationItem { /// Gives a chance for the item to augment the configuration. /// Gives a chance for the item to augment the configuration. /// the configuration that the item was added to void Prepare(IEmbeddedConfiguration configuration); /// Gives a chance for the item to configure the just opened ObjectContainer. /// /// Gives a chance for the item to configure the just opened ObjectContainer. /// /// the ObjectContainer to configure void Apply(IEmbeddedObjectContainer db); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IAlias.cs0000644000175000017500000000537111700531646025733 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config { /// /// Implement this interface when implementing special custom Aliases /// for classes, packages or namespaces. /// /// /// /// Implement this interface when implementing special custom Aliases /// for classes, packages or namespaces. ///

Aliases can be used to persist classes in the running /// application to different persistent classes in a database file /// or on a db4o server. ///

Two simple Alias implementations are supplied along with /// db4o:
/// - /// TypeAlias /// provides an #equals() resolver to match /// names directly.
/// - /// WildcardAlias /// allows simple pattern matching /// with one single '*' wildcard character.
///
/// It is possible to create /// own complex /// IAlias /// constructs by creating own resolvers /// that implement the /// IAlias /// interface. ///

/// Examples of concrete usecases: ///

/// /// // Creating an Alias for a single class
/// ICommonConfiguration.AddAlias(
///   new TypeAlias("Tutorial.Pilot", "Tutorial.Driver"));
///

/// // Accessing a Java package from a .NET assembly
/// ICommonConfiguration.AddAlias(
///   new WildcardAlias(
///     "com.f1.*",
///     "Tutorial.F1.*, Tutorial"));
///

/// // Using a different local .NET assembly
/// ICommonConfiguration.AddAlias(
///   new WildcardAlias(
///     "Tutorial.F1.*, F1Race",
///     "Tutorial.F1.*, Tutorial"));
///

///
///

Aliases that translate the persistent name of a class to /// a name that already exists as a persistent name in the database /// (or on the server) are not permitted and will throw an exception /// when the database file is opened. ///

Aliases should be configured before opening a database file /// or connecting to a server. /// ///
public interface IAlias { /// return the stored name for a runtime name or null if not handled. /// return the stored name for a runtime name or null if not handled. string ResolveRuntimeName(string runtimeTypeName); /// return the runtime name for a stored name or null if not handled. /// return the runtime name for a stored name or null if not handled. string ResolveStoredName(string storedTypeName); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/QueryEvaluationMode.cs0000644000175000017500000001027411700531646030531 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Config { /// /// This class provides static constants for the query evaluation /// modes that db4o supports. /// /// /// This class provides static constants for the query evaluation /// modes that db4o supports. ///

For detailed documentation please see /// IQueryConfiguration.EvaluationMode(QueryEvaluationMode) /// /// ///
public class QueryEvaluationMode { private readonly string _id; private QueryEvaluationMode(string id) { _id = id; } /// Constant for immediate query evaluation. /// /// Constant for immediate query evaluation. The query is executed fully /// when /// Db4objects.Db4o.Query.IQuery.Execute() /// /// is called. ///

For detailed documentation please see /// IQueryConfiguration.EvaluationMode(QueryEvaluationMode) /// /// ///
public static readonly Db4objects.Db4o.Config.QueryEvaluationMode Immediate = new Db4objects.Db4o.Config.QueryEvaluationMode("IMMEDIATE"); /// Constant for snapshot query evaluation. /// /// Constant for snapshot query evaluation. When /// Db4objects.Db4o.Query.IQuery.Execute() /// /// is called, /// the query processor chooses the best indexes, does all index processing /// and creates a snapshot of the index at this point in time. Non-indexed /// constraints are evaluated lazily when the application iterates through /// the /// Db4objects.Db4o.IObjectSet /// resultset of the query. ///

For detailed documentation please see /// IQueryConfiguration.EvaluationMode(QueryEvaluationMode) /// /// ///
public static readonly Db4objects.Db4o.Config.QueryEvaluationMode Snapshot = new Db4objects.Db4o.Config.QueryEvaluationMode("SNAPSHOT"); /// Constant for lazy query evaluation. /// /// Constant for lazy query evaluation. When /// Db4objects.Db4o.Query.IQuery.Execute() /// /// is called, the /// query processor only chooses the best index and creates an iterator on /// this index. Indexes and constraints are evaluated lazily when the /// application iterates through the /// Db4objects.Db4o.IObjectSet /// resultset of the query. ///

For detailed documentation please see /// IQueryConfiguration.EvaluationMode(QueryEvaluationMode) /// /// ///
public static readonly Db4objects.Db4o.Config.QueryEvaluationMode Lazy = new Db4objects.Db4o.Config.QueryEvaluationMode ("LAZY"); private static readonly Db4objects.Db4o.Config.QueryEvaluationMode[] Modes = new Db4objects.Db4o.Config.QueryEvaluationMode[] { Db4objects.Db4o.Config.QueryEvaluationMode .Immediate, Db4objects.Db4o.Config.QueryEvaluationMode.Snapshot, Db4objects.Db4o.Config.QueryEvaluationMode .Lazy }; /// internal method, ignore please. /// internal method, ignore please. public virtual int AsInt() { for (int i = 0; i < Modes.Length; i++) { if (Modes[i] == this) { return i; } } throw new InvalidOperationException(); } /// internal method, ignore please. /// internal method, ignore please. public static Db4objects.Db4o.Config.QueryEvaluationMode FromInt(int i) { return Modes[i]; } public override string ToString() { return _id; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ICommonConfigurationProvider.cs0000644000175000017500000000144611700531646032374 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// A configuration provider that provides access to /// the common configuration methods that can be called /// for embedded, server and client use of db4o. /// /// /// A configuration provider that provides access to /// the common configuration methods that can be called /// for embedded, server and client use of db4o. /// /// 7.5 public interface ICommonConfigurationProvider { /// Access to the common configuration methods. /// Access to the common configuration methods. ICommonConfiguration Common { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/INameProvider.cs0000644000175000017500000000162511700531646027273 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Config { /// A provider for custom database names. /// A provider for custom database names. public interface INameProvider { /// /// Derives a name for the given /// Db4objects.Db4o.IObjectContainer /// . This method will be called when /// database startup has completed, i.e. the method will see a completely initialized /// Db4objects.Db4o.IObjectContainer /// . /// Any code invoked during the startup process (for example /// IConfigurationItem /// instances) will still /// see the default naming. /// string Name(IObjectContainer db); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/TNull.cs0000644000175000017500000000102611700531646025620 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// public class TNull : IObjectTranslator { public virtual object OnStore(IObjectContainer con, object @object) { return null; } public virtual void OnActivate(IObjectContainer con, object @object, object members ) { } public virtual Type StoredClass() { return typeof(object); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IObjectField.cs0000644000175000017500000001377711700531646027065 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config { /// configuration interface for fields of classes. /// /// configuration interface for fields of classes. ///

/// Use /// IObjectClass.ObjectField(string) /// to access this setting.

///
public interface IObjectField { /// sets cascaded activation behaviour. /// /// sets cascaded activation behaviour. ///

/// Setting cascadeOnActivate to true will result in the activation /// of the object attribute stored in this field if the parent object /// is activated. ///

/// The default setting is false.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// whether activation is to be cascaded to the member object. /// Why activation? /// IObjectClass.CascadeOnActivate(bool) /// /// Db4objects.Db4o.IObjectContainer.Activate(object, int) /// /// Using callbacks void CascadeOnActivate(bool flag); /// sets cascaded delete behaviour. /// /// sets cascaded delete behaviour. ///

/// Setting cascadeOnDelete to true will result in the deletion of /// the object attribute stored in this field on the parent object /// if the parent object is passed to /// Db4objects.Db4o.IObjectContainer.Delete(object) /// /// . ///

/// Caution !
/// This setting will also trigger deletion of the old member object, on /// calls to /// /// . /// An example of the behaviour can be found in /// IObjectClass.CascadeOnDelete(bool) /// ///

/// The default setting is false.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// whether deletes are to be cascaded to the member object. /// IObjectClass.CascadeOnDelete(bool) /// /// Db4objects.Db4o.IObjectContainer.Delete(object) /// /// Using callbacks void CascadeOnDelete(bool flag); /// sets cascaded update behaviour. /// /// sets cascaded update behaviour. ///

/// Setting cascadeOnUpdate to true will result in the update /// of the object attribute stored in this field if the parent object /// is passed to /// Db4objects.Db4o.IObjectContainer.Store(object) /// /// . ///

/// The default setting is false.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// whether updates are to be cascaded to the member object. /// com.db4o.ObjectContainer#set /// IObjectClass.CascadeOnUpdate(bool) /// /// IObjectClass.UpdateDepth(int) /// Using callbacks void CascadeOnUpdate(bool flag); /// turns indexing on or off. /// /// turns indexing on or off. ///

Field indices dramatically improve query performance but they may /// considerably reduce storage and update performance.
The best benchmark whether /// or not an index on a field achieves the desired result is the completed application /// - with a data load that is typical for it's use.

This configuration setting /// is only checked when the /// Db4objects.Db4o.IObjectContainer /// is opened. If the /// setting is set to true and an index does not exist, the index will be /// created. If the setting is set to false and an index does exist the /// index will be dropped.

/// In client-server environment this setting should be used on both /// client and server.

/// If this setting is applied to an open ObjectContainer it will take an effect on the next /// time ObjectContainer is opened.

///
/// /// specify true or false to turn indexing on for /// this field /// void Indexed(bool flag); /// renames a field of a stored class. /// /// renames a field of a stored class. ///

Use this method to refactor classes. ///

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can NOT be applied to an open object container.

///
/// the new field name. void Rename(string newName); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IObjectClass.cs0000644000175000017500000004011111700531646027065 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// configuration interface for classes. /// /// configuration interface for classes. ///

/// Use the global /// ICommonConfiguration.ObjectClass(object) /// /// to configure /// object class settings. ///
public interface IObjectClass { /// /// advises db4o to try instantiating objects of this class with/without /// calling constructors. /// /// /// advises db4o to try instantiating objects of this class with/without /// calling constructors. ///

/// Not all .NET-environments support this feature. db4o will /// attempt, to follow the setting as good as the enviroment supports. ///

/// This setting may also be set globally for all classes in /// Db4objects.Db4o.Config.IConfiguration.CallConstructors /// /// .

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// /// - specify true, to request calling constructors, specify /// false to request not calling constructors. /// /// Db4objects.Db4o.Config.IConfiguration.CallConstructors /// void CallConstructor(bool flag); /// sets cascaded activation behaviour. /// /// sets cascaded activation behaviour. ///

/// Setting cascadeOnActivate to true will result in the activation /// of all member objects if an instance of this class is activated. ///

/// The default setting is false.

/// In client-server environment this setting should be used on both /// client and server.

/// Can be applied to an open ObjectContainer.

///
/// whether activation is to be cascaded to member objects. /// IObjectField.CascadeOnActivate(bool) /// /// Db4objects.Db4o.IObjectContainer.Activate(object, int) /// /// Using callbacks /// Why activation? void CascadeOnActivate(bool flag); /// sets cascaded delete behaviour. /// /// sets cascaded delete behaviour. ///

/// Setting CascadeOnDelete to true will result in the deletion of /// all member objects of instances of this class, if they are /// passed to /// Db4objects.Db4o.IObjectContainer.Delete /// /// . ///

/// Caution !
/// This setting will also trigger deletion of old member objects, on /// calls to /// Db4objects.Db4o.IObjectContainer.Store /// /// .

/// An example of the behaviour:
/// /// ObjectContainer con;
/// Bar bar1 = new Bar();
/// Bar bar2 = new Bar();
/// foo.bar = bar1;
/// con.Store(foo); // bar1 is stored as a member of foo
/// foo.bar = bar2;
/// con.Store(foo); // bar2 is stored as a member of foo ///

The last statement will also delete bar1 from the /// ObjectContainer, no matter how many other stored objects hold references /// to bar1. ///

/// The default setting is false.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// whether deletes are to be cascaded to member objects. /// Db4objects.Db4o.Config.IObjectField.CascadeOnDelete /// /// Db4objects.Db4o.IObjectContainer.Delete /// /// Using callbacks void CascadeOnDelete(bool flag); /// sets cascaded update behaviour. /// /// sets cascaded update behaviour. ///

/// Setting cascadeOnUpdate to true will result in the update /// of all member objects if a stored instance of this class is passed /// to /// Db4objects.Db4o.IObjectContainer.Store(object) /// /// .

/// The default setting is false. Setting it to true /// may result in serious performance degradation.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// whether updates are to be cascaded to member objects. /// IObjectField.CascadeOnUpdate(bool) /// /// com.db4o.ObjectContainer#set /// Using callbacks void CascadeOnUpdate(bool flag); /// registers an attribute provider for special query behavior. /// /// registers an attribute provider for special query behavior. ///

The query processor will compare the object returned by the /// attribute provider instead of the actual object, both for the constraint /// and the candidate persistent object.

/// In client-server environment this setting should be used on both /// client and server.

///
/// the attribute provider to be used [System.ObsoleteAttribute(@"since version 7.0")] void Compare(IObjectAttribute attributeProvider); /// /// Must be called before databases are created or opened /// so that db4o will control versions and generate UUIDs /// for objects of this class, which is required for using replication. /// /// /// Must be called before databases are created or opened /// so that db4o will control versions and generate UUIDs /// for objects of this class, which is required for using replication. /// /// [System.ObsoleteAttribute(@"As of version 8.0 please use GenerateUUIDs(bool) and IFileConfiguration.GenerateCommitTimestamps(bool) instead" )] void EnableReplication(bool setting); /// generate UUIDs for stored objects of this class. /// /// generate UUIDs for stored objects of this class. /// This setting should be used before the database is first created.

///
/// void GenerateUUIDs(bool setting); /// generate version numbers for stored objects of this class. /// /// generate version numbers for stored objects of this class. /// This setting should be used before the database is first created.

///
/// [System.ObsoleteAttribute(@"As of version 8.0 please use IFileConfiguration.GenerateCommitTimestamps(bool) instead" )] void GenerateVersionNumbers(bool setting); /// turns the class index on or off. /// /// turns the class index on or off. ///

db4o maintains an index for each class to be able to /// deliver all instances of a class in a query. If the class /// index is never needed, it can be turned off with this method /// to improve the performance to create and delete objects of /// a class. ///

Common cases where a class index is not needed:
/// - The application always works with sub classes or super classes.
/// - There are convenient field indexes that will always find instances /// of a class.
/// - The application always works with IDs.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
void Indexed(bool flag); /// sets the maximum activation depth to the desired value. /// /// sets the maximum activation depth to the desired value. ///

A class specific setting overrides the /// global setting ///

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// the desired maximum activation depth /// Why activation? /// CascadeOnActivate(bool) void MaximumActivationDepth(int depth); /// sets the minimum activation depth to the desired value. /// /// sets the minimum activation depth to the desired value. ///

A class specific setting overrides the /// global setting ///

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// the desired minimum activation depth /// Why activation? /// CascadeOnActivate(bool) void MinimumActivationDepth(int depth); /// gets the configured minimum activation depth. /// /// gets the configured minimum activation depth. /// In client-server environment this setting should be used on both /// client and server.

///
/// the configured minimum activation depth. int MinimumActivationDepth(); /// /// returns an /// IObjectField /// object /// to configure the specified field. ///

///
/// the name of the field to be configured.

/// /// an instance of an /// IObjectField /// object for configuration. /// IObjectField ObjectField(string fieldName); /// turns on storing static field values for this class. /// /// turns on storing static field values for this class. ///

By default, static field values of classes are not stored /// to the database file. By turning the setting on for a specific class /// with this switch, all non-simple-typed static field values of this /// class are stored the first time an object of the class is stored, and /// restored, every time a database file is opened afterwards, after /// class meta information is loaded for this class (which can happen /// by querying for a class or by loading an instance of a class).

/// To update a static field value, once it is stored, you have to the following /// in this order:
/// (1) open the database file you are working agains
/// (2) make sure the class metadata is loaded
/// objectContainer.Query().Constrain(typeof(Foo));
/// (3) change the static member
/// (4) store the static member explicitely
/// objectContainer.Store(Foo.staticMember); ///

The setting will be ignored for simple types. ///

Use this setting for constant static object members. ///

This option will slow down the process of opening database /// files and the stored objects will occupy space in the database file. ///

In client-server environment this setting should be used on both /// client and server.

/// This setting can NOT be applied to an open object container.

///
void PersistStaticFieldValues(); /// renames a stored class. /// /// renames a stored class. ///

Use this method to refactor classes. ///

In client-server environment this setting should be used on both /// client and server.

/// This setting can NOT be applied to an open object container.

///
/// the new fully qualified class name. void Rename(string newName); /// allows to specify if transient fields are to be stored. /// /// allows to specify if transient fields are to be stored. ///
The default for every class is false.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// whether or not transient fields are to be stored. void StoreTransientFields(bool flag); /// registers a translator for this class. /// /// registers a translator for this class. ///

///

The use of an /// IObjectTranslator /// is not /// compatible with the use of an /// internal class ObjectMarshaller.

/// In client-server environment this setting should be used on both /// client and server.

/// This setting can be applied to an open object container.

///
/// /// this may be an /// IObjectTranslator /// or an /// IObjectConstructor /// /// IObjectTranslator /// IObjectConstructor void Translate(IObjectTranslator translator); /// specifies the updateDepth for this class. /// /// specifies the updateDepth for this class. ///

see the documentation of /// Db4objects.Db4o.IObjectContainer.Store(object) /// /// for further details.

/// The default setting is 0: Only the object passed to /// Db4objects.Db4o.IObjectContainer.Store(object) /// /// will be updated.

/// In client-server environment this setting should be used on both /// client and server.

///
/// the depth of the desired update for this class. /// IConfiguration.UpdateDepth(int) /// CascadeOnUpdate(bool) /// IObjectField.CascadeOnUpdate(bool) /// /// Using callbacks void UpdateDepth(int depth); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IIdSystemConfiguration.cs0000644000175000017500000000407211700531646031170 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// Interface to configure the IdSystem. /// Interface to configure the IdSystem. public interface IIdSystemConfiguration { /// configures db4o to store IDs as pointers. /// configures db4o to store IDs as pointers. void UsePointerBasedSystem(); /// /// configures db4o to use a stack of two BTreeIdSystems on /// top of an InMemoryIdSystem. /// /// /// configures db4o to use a stack of two BTreeIdSystems on /// top of an InMemoryIdSystem. This setup is scalable for /// large numbers of IDs. It is the default configuration /// when new databases are created. /// void UseStackedBTreeSystem(); /// /// configures db4o to use a single BTreeIdSystem on /// top of an InMemoryIdSystem. /// /// /// configures db4o to use a single BTreeIdSystem on /// top of an InMemoryIdSystem. This setup is suitable for /// smaller databases with a small number of IDs. /// For larger numbers of IDs call /// UseStackedBTreeSystem() /// . /// void UseSingleBTreeSystem(); /// configures db4o to use an in-memory ID system. /// /// configures db4o to use an in-memory ID system. /// All IDs get written to the database file on every commit. /// void UseInMemorySystem(); /// configures db4o to use a custom ID system. /// /// configures db4o to use a custom ID system. /// Pass an /// IIdSystemFactory /// that creates the IdSystem. /// Note that this factory has to be configured every time you /// open a database that you configured to use a custom IdSystem. /// void UseCustomSystem(IIdSystemFactory factory); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IClientServerConfiguration.cs0000644000175000017500000001435511700531646032041 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Messaging; namespace Db4objects.Db4o.Config { /// Client/Server configuration interface. /// Client/Server configuration interface. public interface IClientServerConfiguration { /// /// Sets the number of IDs to be pre-allocated in the database for new /// objects created on the client. /// /// /// Sets the number of IDs to be pre-allocated in the database for new /// objects created on the client. /// This setting should be used on the client side. In embedded mode this setting /// has no effect. /// /// The number of IDs to be prefetched void PrefetchIDCount(int prefetchIDCount); /// Sets the number of objects to be prefetched for an ObjectSet. /// /// Sets the number of objects to be prefetched for an ObjectSet. /// This setting should be used on the server side. /// /// The number of objects to be prefetched void PrefetchObjectCount(int prefetchObjectCount); /// Sets the depth to which prefetched objects are activated. /// /// Sets the depth to which prefetched objects are activated. /// This setting should be used on the client side. /// /// void PrefetchDepth(int prefetchDepth); /// Sets the slot cache size to the given value. /// Sets the slot cache size to the given value. /// void PrefetchSlotCacheSize(int slotCacheSize); /// sets the MessageRecipient to receive Client Server messages. /// /// sets the MessageRecipient to receive Client Server messages.
///
/// This setting should be used on the server side.

///
/// the MessageRecipient to be used void SetMessageRecipient(IMessageRecipient messageRecipient); /// returns the MessageSender for this Configuration context. /// /// returns the MessageSender for this Configuration context. /// This setting should be used on the client side. /// /// MessageSender IMessageSender GetMessageSender(); /// /// configures the time a client waits for a message response /// from the server. /// /// /// configures the time a client waits for a message response /// from the server.
///
/// Default value: 600000ms (10 minutes)
///
/// It is recommended to use the same values for /// TimeoutClientSocket(int) /// and /// TimeoutServerSocket(int) /// . ///
/// This setting can be used on both client and server.

///
/// time in milliseconds void TimeoutClientSocket(int milliseconds); /// configures the timeout of the serverside socket. /// /// configures the timeout of the serverside socket.
///
/// The serverside handler waits for messages to arrive from the client. /// If no more messages arrive for the duration configured in this /// setting, the client will be disconnected. ///
/// Clients send PING messages to the server at an interval of /// Math.min(timeoutClientSocket(), timeoutServerSocket()) / 2 /// and the server will respond to keep connections alive. ///
/// Decrease this setting if you want clients to disconnect faster. ///
/// Increase this setting if you have a large number of clients and long /// running queries and you are getting disconnected clients that you /// would like to wait even longer for a response from the server. ///
/// Default value: 600000ms (10 minutes)
///
/// It is recommended to use the same values for /// TimeoutClientSocket(int) /// and /// TimeoutServerSocket(int) /// . ///
/// This setting can be used on both client and server.

///
/// time in milliseconds void TimeoutServerSocket(int milliseconds); /// /// configures the client messaging system to be single threaded /// or multithreaded. /// /// /// configures the client messaging system to be single threaded /// or multithreaded. ///

Recommended settings:
/// - true for low resource systems.
/// - false for best asynchronous performance and fast /// GUI response. ///

Default value:
/// - .NET Compactframework: true
/// - all other platforms: false

/// This setting can be used on both client and server.

///
/// the desired setting void SingleThreadedClient(bool flag); /// Configures to batch messages between client and server. /// /// Configures to batch messages between client and server. By default, batch /// mode is enabled.

/// This setting can be used on both client and server.

///
/// false, to turn message batching off. void BatchMessages(bool flag); /// Configures the maximum memory buffer size for batched message. /// /// Configures the maximum memory buffer size for batched message. If the /// size of batched messages is greater than maxSize, batched /// messages will be sent to server.

/// This setting can be used on both client and server.

///
/// void MaxBatchQueueSize(int maxSize); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/WildcardAlias.cs0000644000175000017500000000631111700531646027267 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// Wildcard Alias functionality to create aliases for packages, /// namespaces or multiple similar named classes. /// /// /// Wildcard Alias functionality to create aliases for packages, /// namespaces or multiple similar named classes. One single '*' /// wildcard character is supported in the names. ///

See /// IAlias /// for concrete examples. ///
public class WildcardAlias : IAlias { private readonly WildcardAlias.WildcardPattern _storedPattern; private readonly WildcardAlias.WildcardPattern _runtimePattern; /// /// Create a WildcardAlias with two patterns, the /// stored pattern and the pattern that is to be used /// at runtime. /// /// /// Create a WildcardAlias with two patterns, the /// stored pattern and the pattern that is to be used /// at runtime. One single '*' is allowed as a wildcard /// character. /// public WildcardAlias(string storedPattern, string runtimePattern) { if (null == storedPattern) { throw new ArgumentNullException("storedPattern"); } if (null == runtimePattern) { throw new ArgumentNullException("runtimePattern"); } _storedPattern = new WildcardAlias.WildcardPattern(storedPattern); _runtimePattern = new WildcardAlias.WildcardPattern(runtimePattern); } /// resolving is done through simple pattern matching public virtual string ResolveRuntimeName(string runtimeTypeName) { return Resolve(_runtimePattern, _storedPattern, runtimeTypeName); } /// resolving is done through simple pattern matching public virtual string ResolveStoredName(string storedTypeName) { return Resolve(_storedPattern, _runtimePattern, storedTypeName); } private string Resolve(WildcardAlias.WildcardPattern from, WildcardAlias.WildcardPattern to, string typeName) { string match = from.Matches(typeName); return match != null ? to.Inject(match) : null; } internal class WildcardPattern { private string _head; private string _tail; public WildcardPattern(string pattern) { string[] parts = Split(pattern); _head = parts[0]; _tail = parts[1]; } public virtual string Inject(string s) { return _head + s + _tail; } public virtual string Matches(string s) { if (!s.StartsWith(_head) || !s.EndsWith(_tail)) { return null; } return Sharpen.Runtime.Substring(s, _head.Length, s.Length - _tail.Length); } private void InvalidPattern() { throw new ArgumentException("only one '*' character"); } internal virtual string[] Split(string pattern) { int index = pattern.IndexOf('*'); if (-1 == index || index != pattern.LastIndexOf('*')) { InvalidPattern(); } return new string[] { Sharpen.Runtime.Substring(pattern, 0, index), Sharpen.Runtime.Substring (pattern, index + 1) }; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IIdSystemFactory.cs0000644000175000017500000000115111700531646027763 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; namespace Db4objects.Db4o.Config { /// Factory interface to create a custom IdSystem. /// Factory interface to create a custom IdSystem. /// public interface IIdSystemFactory { /// creates /// /// IIdSystem NewInstance(LocalObjectContainer container); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IConfiguration.cs0000644000175000017500000012065211700531646027511 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o.Config; using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.IO; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Config { /// configuration interface. /// /// configuration interface. ///

This interface contains methods to configure db4o.

/// The global Configuration context is available with /// Db4objects.Db4o.Db4oFactory.Configure() /// /// . /// When an ObjectContainer or ObjectServer is opened, the global Configuration /// context is cloned and copied into the ObjectContainer/ObjectServer. /// That means every ObjectContainer/ObjectServer gets it's own copy of /// configuration settings.

/// Most configuration settings should be set before opening an /// ObjectContainer/ObjectServer. ///

Some configuration settings can be modified on an open /// ObjectContainer/ObjectServer. The local Configuration context is /// available with /// Db4objects.Db4o.Ext.IExtObjectContainer.Configure() /// /// and /// Db4objects.Db4o.Ext.IExtObjectServer.Configure() /// /// . ///
public interface IConfiguration { /// sets the activation depth to the specified value. /// /// sets the activation depth to the specified value. ///

Why activation?
/// When objects are instantiated from the database, the instantiation of member /// objects needs to be limited to a certain depth. Otherwise a single object /// could lead to loading the complete database into memory, if all objects where /// reachable from a single root object.

/// db4o uses the concept "depth", the number of field-to-field hops an object /// is away from another object. The preconfigured "activation depth" db4o uses /// in the default setting is 5. ///

Whenever an application iterates through the /// IObjectSet /// of a query result, the result objects /// will be activated to the configured activation depth.

/// A concrete example with the preconfigured activation depth of 5:
///
		/// // Object foo is the result of a query, it is delivered by the ObjectSet
		/// object foo = objectSet.Next();
/// foo.member1.member2.member3.member4.member5 will be a valid object
/// foo, member1, member2, member3 and member4 will be activated
/// member5 will be deactivated, all of it's members will be null
/// member5 can be activated at any time by calling /// IObjectContainer.Activate(member5, depth) /// /// . ///

/// Note that raising the global activation depth will consume more memory and /// have negative effects on the performance of first-time retrievals. Lowering /// the global activation depth needs more individual activation work but can /// increase performance of queries.

/// IObjectContainer.Deactivate(object, depth) /// /// can be used to manually free memory by deactivating objects.

/// In client/server environment the same setting should be used on both /// client and server

. ///
/// the desired global activation depth. /// /// configuring classes individually /// /// /// gets the configured activation depth. void ActivationDepth(int depth); /// gets the configured activation depth. /// gets the configured activation depth. /// the configured activation depth. int ActivationDepth(); /// /// adds ConfigurationItems to be applied when /// an ObjectContainer or ObjectServer is opened. /// /// /// adds ConfigurationItems to be applied when /// an ObjectContainer or ObjectServer is opened. /// /// the ConfigurationItem void Add(IConfigurationItem configurationItem); /// adds a new Alias for a class, namespace or package. /// /// /// adds a new Alias for a class, namespace or package. ///
///
/// Aliases can be used to persist classes in the running application /// to different persistent classes in a database file or on a db4o /// server. ///
///
/// Two simple Alias implementations are supplied along with db4o: ///
/// - /// TypeAlias /// provides an #equals() resolver to match names directly. ///
/// - /// WildcardAlias /// allows simple pattern matching with one single '*' wildcard /// character. ///
///
/// It is possible to create own complex /// IAlias /// constructs by creating own resolvers that implement the /// IAlias /// interface. ///
///
/// Four examples of concrete usecases: ///
///
/// /// // Creating an Alias for a single class ///
/// Db4oFactory.Configure().AddAlias( ///
  new TypeAlias("Tutorial.F1.Pilot", "Tutorial.F1.Driver"));
///

/// // Accessing a Java package from a .NET assembly
/// Db4o.configure().addAlias(
///   new WildcardAlias(
///     "com.f1.*",
///     "Tutorial.F1.*, Tutorial"));
///

/// // Using a different local .NET assembly
/// Db4o.configure().addAlias(
///   new WildcardAlias(
///     "Tutorial.F1.*, Tutorial",
///     "Tutorial.F1.*, RaceClient"));
///
///

Aliases that translate the persistent name of a class to /// a name that already exists as a persistent name in the database /// (or on the server) are not permitted and will throw an exception /// when the database file is opened. ///

Aliases should be configured before opening a database file /// or connecting to a server. ///
void AddAlias(IAlias alias); /// /// Removes an alias previously added with /// AddAlias(IAlias) /// . /// /// the alias to remove void RemoveAlias(IAlias alias); /// turns automatic database file format version updates on. /// /// turns automatic database file format version updates on. ///

Upon db4o database file format version changes, /// db4o can automatically update database files to the /// current version. db4objects does not provide functionality /// to reverse this process. It is not ensured that updated /// database files can be read with older db4o versions. /// In some cases (Example: using ObjectManager) it may not be /// desirable to update database files automatically therefore /// automatic updating is turned off by default for /// security reasons. ///

Call this method to turn automatic database file /// version updating on. ///

If automatic updating is turned off, db4o will refuse /// to open database files that use an older database file format.

/// In client-server environment this setting should be used on both client /// and server. ///
void AllowVersionUpdates(bool flag); /// turns automatic shutdown of the engine on and off. /// /// turns automatic shutdown of the engine on and off. /// /// whether db4o should shut down automatically. void AutomaticShutDown(bool flag); /// sets the storage data blocksize for new ObjectContainers. /// /// sets the storage data blocksize for new ObjectContainers. ///

The standard setting is 1 allowing for a maximum /// database file size of 2GB. This value can be increased /// to allow larger database files, although some space will /// be lost to padding because the size of some stored objects /// will not be an exact multiple of the block size. A /// recommended setting for large database files is 8, since /// internal pointers have this length.

/// This setting is only effective when the database is first created, in /// client-server environment in most cases it means that the setting /// should be used on the server side. ///
/// the size in bytes from 1 to 127 /// void BlockSize(int bytes); /// configures the size of BTree nodes in indexes. /// /// configures the size of BTree nodes in indexes. ///

Default setting: 100 ///
Lower values will allow a lower memory footprint /// and more efficient reading and writing of small slots. ///
Higher values will reduce the overall number of /// read and write operations and allow better performance /// at the cost of more RAM use.

/// This setting should be used on both client and server in /// client-server environment. ///
/// the number of elements held in one BTree node. void BTreeNodeSize(int size); /// configures caching of BTree nodes. /// /// configures caching of BTree nodes. ///

Clean BTree nodes will be unloaded on #commit and /// #rollback unless they are configured as cached here. ///

Default setting: 0 ///
Possible settings: 1, 2 or 3 ///

The potential number of cached BTree nodes can be /// calculated with the following formula:
/// maxCachedNodes = bTreeNodeSize ^ bTreeCacheHeight

/// This setting should be used on both client and server in /// client-server environment. ///
/// the height of the cache from the root void BTreeCacheHeight(int height); /// returns the Cache configuration interface. /// returns the Cache configuration interface. ICacheConfiguration Cache(); /// turns callback methods on and off. /// /// turns callback methods on and off. ///

Callbacks are turned on by default.

/// A tuning hint: If callbacks are not used, you can turn this feature off, to /// prevent db4o from looking for callback methods in persistent classes. This will /// increase the performance on system startup.

/// In client/server environment this setting should be used on both /// client and server. ///
/// false to turn callback methods off /// Using callbacks void Callbacks(bool flag); /// /// advises db4o to try instantiating objects with/without calling /// constructors. /// /// /// advises db4o to try instantiating objects with/without calling /// constructors. ///

/// Not all .NET-environments support this feature. db4o will /// attempt, to follow the setting as good as the enviroment supports. /// This setting may also be overridden for individual classes in /// Db4objects.Db4o.Config.IObjectClass.CallConstructor /// /// . ///

The default setting depends on the features supported by your current environment.

/// In client/server environment this setting should be used on both /// client and server. ///

///
/// /// - specify true, to request calling constructors, specify /// false to request not calling constructors. /// /// Db4objects.Db4o.Config.IObjectClass.CallConstructor /// void CallConstructors(bool flag); /// /// turns /// individual class activation depth configuration /// /// on /// and off. ///

This feature is turned on by default.

/// In client/server environment this setting should be used on both /// client and server.

///
/// /// false to turn the possibility to individually configure class /// activation depths off /// /// Why activation? void ClassActivationDepthConfigurable(bool flag); /// returns client/server configuration interface. /// returns client/server configuration interface. IClientServerConfiguration ClientServer(); /// /// configures the size database files should grow in bytes, when no /// free slot is found within. /// /// /// configures the size database files should grow in bytes, when no /// free slot is found within. ///

Tuning setting. ///

Whenever no free slot of sufficient length can be found /// within the current database file, the database file's length /// is extended. This configuration setting configures by how much /// it should be extended, in bytes.

/// This configuration setting is intended to reduce fragmentation. /// Higher values will produce bigger database files and less /// fragmentation.

/// To extend the database file, a single byte array is created /// and written to the end of the file in one write operation. Be /// aware that a high setting will require allocating memory for /// this byte array. ///
/// amount of bytes void DatabaseGrowthSize(int bytes); /// /// tuning feature: configures whether db4o checks all persistent classes upon system /// startup, for added or removed fields. /// /// /// tuning feature: configures whether db4o checks all persistent classes upon system /// startup, for added or removed fields. ///

If this configuration setting is set to false while a database is /// being created, members of classes will not be detected and stored. ///

This setting can be set to false in a production environment after /// all persistent classes have been stored at least once and classes will not /// be modified any further in the future.

/// In a client/server environment this setting should be configured both on the /// client and and on the server. ///

Default value:
/// true ///
/// the desired setting void DetectSchemaChanges(bool flag); /// returns the configuration interface for diagnostics. /// returns the configuration interface for diagnostics. /// the configuration interface for diagnostics. IDiagnosticConfiguration Diagnostic(); /// turns commit recovery off. /// /// turns commit recovery off. ///

db4o uses a two-phase commit algorithm. In a first step all intended /// changes are written to a free place in the database file, the "transaction commit /// record". In a second step the /// actual changes are performed. If the system breaks down during commit, the /// commit process is restarted when the database file is opened the next time. /// On very rare occasions (possibilities: hardware failure or editing the database /// file with an external tool) the transaction commit record may be broken. In this /// case, this method can be used to try to open the database file without commit /// recovery. The method should only be used in emergency situations after consulting /// db4o support. ///
void DisableCommitRecovery(); /// configures the use of encryption. /// /// configures the use of encryption. ///

This method needs to be called before a database file /// is created with the first /// Db4objects.Db4o.Db4oFactory.OpenFile(string) /// /// . ///

If encryption is set to true, /// you need to supply a password to seed the encryption mechanism.

/// db4o database files keep their encryption format after creation.

///
/// /// true for turning encryption on, false for turning encryption /// off. /// /// Password(string) /// [System.ObsoleteAttribute(@"use a custom encrypting instead")] void Encrypt(bool flag); /// configures whether Exceptions are to be thrown, if objects can not be stored. /// /// /// configures whether Exceptions are to be thrown, if objects can not be stored. ///

db4o requires the presence of a constructor that can be used to /// instantiate objects. If no default public constructor is present, all /// available constructors are tested, whether an instance of the class can /// be instantiated. Null is passed to all constructor parameters. /// The first constructor that is successfully tested will /// be used throughout the running db4o session. If an instance of the class /// can not be instantiated, the object will not be stored. By default, /// execution will continue without any message or error. This method can /// be used to configure db4o to throw an /// ObjectNotStorableException /// /// if an object can not be stored. ///

/// The default for this setting is true.

/// In client/server environment this setting should be used on both /// client and server.

///
/// false to not throw Exceptions if objects can not be stored (fail silently). /// void ExceptionsOnNotStorable(bool flag); /// returns the freespace configuration interface. /// returns the freespace configuration interface. IFreespaceConfiguration Freespace(); /// configures db4o to generate UUIDs for stored objects. /// /// configures db4o to generate UUIDs for stored objects. /// This setting should be used when the database is first created.

///
/// the scope for UUID generation: disabled, generate for all classes, or configure individually /// void GenerateUUIDs(ConfigScope setting); /// configures db4o to generate version numbers for stored objects. /// /// configures db4o to generate version numbers for stored objects. /// This setting should be used when the database is first created. /// /// the scope for version number generation: disabled, generate for all classes, or configure individually /// [System.ObsoleteAttribute(@"As of version 8.0 please use GenerateCommitTimestamps(bool) instead." )] void GenerateVersionNumbers(ConfigScope setting); /// /// Configures db4o to generate commit timestamps for all stored objects.
///
/// All the objects commited within a transaction will share the same commit timestamp. ///
/// /// Configures db4o to generate commit timestamps for all stored objects.
///
/// All the objects commited within a transaction will share the same commit timestamp. ///
/// This setting should be used when the database is first created.
///
/// Afterwards you can access the object's commit timestamp like this:
///
///
		/// ObjectContainer container = ...;
		/// ObjectInfo objectInfo = container.ext().getObjectInfo(obj);
		/// long commitTimestamp = objectInfo.getVersion();
		/// 
///
/// /// if true, commit timetamps will be generated for all stored /// objects. If you already have commit timestamps for stored /// objects and later set this flag to false, although you wont be /// able to access them, the commit timestamps will still be taking /// space in your file container. The only way to free that space /// is defragmenting the container. /// /// 8.0 void GenerateCommitTimestamps(bool flag); /// configures db4o to call #intern() on strings upon retrieval. /// /// configures db4o to call #intern() on strings upon retrieval. /// In client/server environment the setting should be used on both /// client and server. /// /// true to intern strings void InternStrings(bool flag); /// returns true if strings will be interned. /// returns true if strings will be interned. bool InternStrings(); /// allows to configure db4o to use a customized byte IO adapter. /// /// allows to configure db4o to use a customized byte IO adapter. ///

Derive from the abstract class /// Db4objects.Db4o.IO.IoAdapter /// to /// write your own. Possible usecases could be improved performance /// with a native library, mirrored write to two files, encryption or /// read-on-write fail-safety control.

An example of a custom /// io adapter can be found in xtea_db4o community project:
/// http://developer.db4o.com/ProjectSpaces/view.aspx/XTEA

/// In client-server environment this setting should be used on the server /// (adapter class must be available)

///
/// - the IoAdapter /// [System.ObsoleteAttribute(@"Use Storage(Db4objects.Db4o.IO.IStorage) instead.")] void Io(IoAdapter adapter); /// allows to configure db4o to use a customized byte IO storage mechanism. /// /// allows to configure db4o to use a customized byte IO storage mechanism. ///

Implement the interface /// Db4objects.Db4o.IO.IStorage /// to /// write your own. Possible usecases could be improved performance /// with a native library, mirrored write to two files, encryption or /// read-on-write fail-safety control.

///
/// - the factory /// Db4objects.Db4o.IO.CachingStorage /// /// Db4objects.Db4o.IO.MemoryStorage /// /// Db4objects.Db4o.IO.FileStorage /// Db4objects.Db4o.IO.StorageDecorator /// /// /// /// returns the configured /// Db4objects.Db4o.IO.IStorage /// IStorage Storage { get; set; } /// /// returns the configured /// Db4objects.Db4o.IO.IoAdapter /// . /// /// [System.ObsoleteAttribute(@"Use Storage() instead.")] IoAdapter Io(); /// allows to mark fields as transient with custom attributes. /// /// allows to mark fields as transient with custom attributes. ///

.NET only: Call this method with the attribute name that you /// wish to use to mark fields as transient. Multiple transient attributes /// are possible by calling this method multiple times with different /// attribute names.

/// In client/server environment the setting should be used on both /// client and server.

///
/// /// - the fully qualified name of the attribute, including /// it's namespace /// void MarkTransient(string attributeName); /// sets the detail level of db4o messages. /// /// sets the detail level of db4o messages. Messages will be output to the /// configured output /// TextWriter /// . ///

/// Level 0 - no messages
/// Level 1 - open and close messages
/// Level 2 - messages for new, update and delete
/// Level 3 - messages for activate and deactivate

/// When using client-server and the level is set to 0, the server will override this and set it to 1. To get around this you can set the level to -1. This has the effect of not returning any messages.

/// In client-server environment this setting can be used on client or on server /// depending on which information do you want to track (server side provides more /// detailed information).

///
/// integer from 0 to 3 /// SetOut(System.IO.TextWriter) void MessageLevel(int level); /// can be used to turn the database file locking thread off. /// /// false to turn database file locking off. /// void LockDatabaseFile(bool flag); /// /// returns an /// IObjectClass /// object /// to configure the specified class. ///

/// The clazz parameter can be any of the following:
/// - a fully qualified classname as a String.
/// - a Class object.
/// - any other object to be used as a template.

///
/// class name, Class object, or example object.

/// /// an instance of an /// IObjectClass /// object for configuration. /// IObjectClass ObjectClass(object clazz); /// /// If set to true, db4o will try to optimize native queries /// dynamically at query execution time, otherwise it will /// run native queries in unoptimized mode as SODA evaluations. /// /// /// If set to true, db4o will try to optimize native queries /// dynamically at query execution time, otherwise it will /// run native queries in unoptimized mode as SODA evaluations. /// The following assemblies should be available for native query switch to take effect: /// Db4objects.Db4o.NativeQueries.dll, Db4objects.Db4o.Instrumentation.dll. ///

The default setting is true.

/// In client-server environment this setting should be used on both client and server.

///
/// /// true, if db4o should try to optimize /// native queries at query execution time, false otherwise /// /// /// Db4objects.Db4o.Config.ICommonConfiguration.OptimizeNativeQueries void OptimizeNativeQueries(bool optimizeNQ); /// indicates whether Native Queries will be optimized dynamically. /// indicates whether Native Queries will be optimized dynamically. /// /// boolean true if Native Queries will be optimized /// dynamically. /// /// OptimizeNativeQueries() bool OptimizeNativeQueries(); /// protects the database file with a password. /// /// protects the database file with a password. ///

To set a password for a database file, this method needs to be /// called before a database file is created with the first /// Db4objects.Db4o.Db4oFactory.OpenFile(string) /// /// . ///

All further attempts to open /// the file, are required to set the same password.

The password /// is used to seed the encryption mechanism, which makes it impossible /// to read the database file without knowing the password.

///
/// the password to be used. /// [System.ObsoleteAttribute(@"use a custom encrypting instead")] void Password(string pass); /// returns the Query configuration interface. /// returns the Query configuration interface. IQueryConfiguration Queries(); /// turns readOnly mode on and off. /// /// turns readOnly mode on and off. ///

This method configures the mode in which subsequent calls to /// Db4o.openFile() /// will open files. ///

Readonly mode allows to open an unlimited number of reading /// processes on one database file. It is also convenient /// for deploying db4o database files on CD-ROM.

/// In client-server environment this setting should be used on the server side /// in embedded mode and ONLY on client side in networked mode.

///
/// /// true for configuring readOnly mode for subsequent /// calls to /// Db4o.openFile() /// . /// void ReadOnly(bool flag); /// /// turns recovery mode on and off.

/// Recovery mode can be used to try to retrieve as much as possible /// out of an already corrupted database. ///
/// /// turns recovery mode on and off.

/// Recovery mode can be used to try to retrieve as much as possible /// out of an already corrupted database. In recovery mode internal /// checks are more relaxed. Null or invalid objects may be returned /// instead of throwing exceptions.

/// Use this method with care as a last resort to get data out of a /// corrupted database. ///
/// true to turn recover mode on. void RecoveryMode(bool flag); /// configures the use of a specially designed reflection implementation. /// /// configures the use of a specially designed reflection implementation. ///

/// db4o internally uses System.Reflection by default. On platforms that /// do not support this package, customized implementations may be written /// to supply all the functionality of the interfaces in System.Reflection /// namespace. This method can be used to install a custom reflection /// implementation. /// ///
void ReflectWith(IReflector reflector); /// tuning feature only: reserves a number of bytes in database files. /// /// tuning feature only: reserves a number of bytes in database files. ///

The global setting is used for the creation of new database /// files. Continous calls on an ObjectContainer Configuration context /// (see /// Db4objects.Db4o.Ext.IExtObjectContainer.Configure() /// /// ) will /// continually allocate space. ///

The allocation of a fixed number of bytes at one time /// makes it more likely that the database will be stored in one /// chunk on the mass storage. Less read/write head movement can result /// in improved performance.

/// Note:
Allocated space will be lost on abnormal termination /// of the database engine (hardware crash, VM crash). A Defragment run /// will recover the lost space. For the best possible performance, this /// method should be called before the Defragment run to configure the /// allocation of storage space to be slightly greater than the anticipated /// database file size. ///

/// In client-server environment this setting should be used on the server side.

/// Default configuration: 0

///
/// the number of bytes to reserve /// /// void ReserveStorageSpace(long byteCount); /// /// configures the path to be used to store and read /// Blob data. /// /// /// configures the path to be used to store and read /// Blob data. ///

/// In client-server environment this setting should be used on the /// server side.

///
/// the path to be used /// void SetBlobPath(string path); /// /// Assigns a /// TextWriter /// where db4o is to print its event messages. ///

Messages are useful for debugging purposes and for learning /// to understand, how db4o works. The message level can be raised with /// MessageLevel(int) /// to produce more detailed messages. ///

Use setOut(System.out) to print messages to the /// console.

/// In client-server environment this setting should be used on the same side /// where /// MessageLevel(int) /// is used.

///
/// the new PrintStream for messages. /// MessageLevel(int) void SetOut(TextWriter outStream); /// configures the string encoding to be used. /// /// configures the string encoding to be used. ///

The string encoding can not be changed in the lifetime of a /// database file. To set up the database with the correct string encoding, /// this configuration needs to be set correctly before a database /// file is created with the first call to /// Db4objects.Db4o.Db4oFactory.OpenFile /// /// or /// Db4objects.Db4o.Db4oFactory.OpenServer /// /// . ///

For subsequent open calls, db4o remembers built-in /// string encodings. If a custom encoding is used (an encoding that is /// not supplied from within the db4o library), the correct encoding /// needs to be configured correctly again for all subsequent calls /// that open database files. ///

Example:
/// config.StringEncoding(StringEncodings.Utf8()); ///
/// Db4objects.Db4o.Config.Encoding.StringEncodings /// void StringEncoding(IStringEncoding encoding); /// /// tuning feature: configures whether db4o should try to instantiate one instance /// of each persistent class on system startup. /// /// /// tuning feature: configures whether db4o should try to instantiate one instance /// of each persistent class on system startup. ///

In a production environment this setting can be set to false, /// if all persistent classes have public default constructors. ///

/// In client-server environment this setting should be used on both client and server /// side.

/// Default value:
/// true ///
/// the desired setting void TestConstructors(bool flag); /// specifies the global updateDepth. /// /// specifies the global updateDepth. ///

see the documentation of /// /// for further details.

/// The value be may be overridden for individual classes.

/// The default setting is 1: Only the object passed to /// com.db4o.ObjectContainer#set /// will be updated.

/// In client-server environment this setting should be used on both client and /// server sides.

///
/// the depth of the desired update. /// IObjectClass.UpdateDepth(int) /// IObjectClass.CascadeOnUpdate(bool) /// /// Using callbacks void UpdateDepth(int depth); /// turns weak reference management on or off. /// /// turns weak reference management on or off. ///

/// This method must be called before opening a database. ///

/// Performance may be improved by running db4o without using weak /// references durring memory management at the cost of higher /// memory consumption or by alternatively implementing a manual /// memory management scheme using /// IExtObjectContainer.Purge ///

Setting the value to false causes db4o to use hard /// references to objects, preventing the garbage collection process /// from disposing of unused objects. ///

The default setting is true. ///
void WeakReferences(bool flag); /// configures the timer for WeakReference collection. /// /// configures the timer for WeakReference collection. ///

The default setting is 1000 milliseconds. ///

Configure this setting to zero to turn WeakReference /// collection off. /// ///
/// the time in milliseconds void WeakReferenceCollectionInterval(int milliseconds); /// /// allows registering special TypeHandlers for customized marshalling /// and customized comparisons. /// /// /// allows registering special TypeHandlers for customized marshalling /// and customized comparisons. /// /// /// to specify for which classes and versions the /// TypeHandler is to be used. /// /// to be used for the classes that match the predicate. void RegisterTypeHandler(ITypeHandlerPredicate predicate, ITypeHandler4 typeHandler ); /// ICommonConfiguration.MaxStackDepth() /// int MaxStackDepth(); /// void MaxStackDepth(int maxStackDepth); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/IObjectAttribute.cs0000644000175000017500000000117511700531646027772 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config { /// generic interface to allow returning an attribute of an object. /// generic interface to allow returning an attribute of an object. public interface IObjectAttribute { /// generic method to return an attribute of a parent object. /// generic method to return an attribute of a parent object. /// the parent object /// Object - the attribute object Attribute(object parent); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/ICacheConfigurationProvider.cs0000644000175000017500000000123411700531646032142 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// /// A configuration provider that provides access /// to the cache-related configuration methods. /// /// /// A configuration provider that provides access /// to the cache-related configuration methods. /// public interface ICacheConfigurationProvider { /// Access to the cache-related configuration methods. /// Access to the cache-related configuration methods. ICacheConfiguration Cache { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/Encoding/0000755000175000017500000000000011700531646025762 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/Encoding/StringEncodings.cs0000644000175000017500000000135411700531646031414 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Config.Encoding; using Db4objects.Db4o.Internal.Encoding; namespace Db4objects.Db4o.Config.Encoding { /// All built in String encodings /// Db4objects.Db4o.Config.IConfiguration.StringEncoding(IStringEncoding) public class StringEncodings { public static IStringEncoding Utf8() { return new UTF8StringEncoding(); } public static IStringEncoding Unicode() { return new UnicodeStringEncoding(); } public static IStringEncoding Latin() { return new LatinStringEncoding(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Config/Encoding/IStringEncoding.cs0000644000175000017500000000202511700531646031336 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Config.Encoding { /// /// encodes a String to a byte array and decodes a String /// from a part of a byte array /// public interface IStringEncoding { /// called when a string is to be encoded to a byte array. /// called when a string is to be encoded to a byte array. /// the string to encode /// the encoded byte array byte[] Encode(string str); /// called when a byte array is to be decoded to a string. /// called when a byte array is to be decoded to a string. /// the byte array /// the start offset in the byte array /// the length of the encoded string in the byte array /// the string string Decode(byte[] bytes, int start, int length); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/User.cs0000644000175000017500000000063211700531646024275 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o { /// /// public class User : IInternal4 { public string name; public string password; public User() { } public User(string name_, string password_) { name = name_; password = password_; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Activation/0000755000175000017500000000000011700531646025130 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Activation/IActivator.cs0000644000175000017500000000244011700531646027524 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Activation; namespace Db4objects.Db4o.Activation { /// /// Activator interface.
///

/// Db4objects.Db4o.TA.IActivatable /// objects need to have a reference to /// an Activator implementation, which is called /// by Transparent Activation, when a request is received to /// activate the host object. ///
/// Transparent Activation framework. /// public interface IActivator { /// Method to be called to activate the host object. /// Method to be called to activate the host object. /// /// for which purpose is the object being activated? /// ActivationPurpose.Write /// will cause the object /// to be saved on the next /// Db4objects.Db4o.IObjectContainer.Commit() /// /// operation. /// void Activate(ActivationPurpose purpose); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Activation/ActivationPurpose.cs0000644000175000017500000000025211700531646031135 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Activation { public enum ActivationPurpose { Read, Write } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/0000755000175000017500000000000011700531646025103 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/FirstPassCommand.cs0000644000175000017500000000461611700531646030656 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Metadata; namespace Db4objects.Db4o.Defragment { /// /// First step in the defragmenting process: Allocates pointer slots in the target file for /// each ID (but doesn't fill them in, yet) and registers the mapping from source pointer address /// to target pointer address. /// /// /// First step in the defragmenting process: Allocates pointer slots in the target file for /// each ID (but doesn't fill them in, yet) and registers the mapping from source pointer address /// to target pointer address. /// /// public sealed class FirstPassCommand : IPassCommand { private IDMappingCollector _collector = new IDMappingCollector(); public void ProcessClass(DefragmentServicesImpl context, ClassMetadata classMetadata , int id, int classIndexID) { _collector.CreateIDMapping(context, id, true); classMetadata.TraverseAllAspects(new _TraverseFieldCommand_24(this, context)); } private sealed class _TraverseFieldCommand_24 : TraverseFieldCommand { public _TraverseFieldCommand_24(FirstPassCommand _enclosing, DefragmentServicesImpl context) { this._enclosing = _enclosing; this.context = context; } protected override void Process(FieldMetadata field) { if (!field.IsVirtual() && field.HasIndex()) { this._enclosing.ProcessBTree(context, field.GetIndex(context.SystemTrans())); } } private readonly FirstPassCommand _enclosing; private readonly DefragmentServicesImpl context; } public void ProcessObjectSlot(DefragmentServicesImpl context, ClassMetadata classMetadata , int sourceID) { _collector.CreateIDMapping(context, sourceID, false); } /// public void ProcessClassCollection(DefragmentServicesImpl context) { _collector.CreateIDMapping(context, context.SourceClassCollectionID(), false); } public void ProcessBTree(DefragmentServicesImpl context, BTree btree) { context.RegisterBTreeIDs(btree, _collector); } public void Flush(DefragmentServicesImpl context) { _collector.Flush(context); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/IStoredClassFilter.cs0000644000175000017500000000103011700531646031131 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Defragment { /// Filter for StoredClass instances. /// Filter for StoredClass instances. public interface IStoredClassFilter { /// StoredClass instance to be checked /// true, if the given StoredClass instance should be accepted, false otherwise. /// bool Accept(IStoredClass storedClass); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/PassCommand.cs0000644000175000017500000000254011700531646027640 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Defragment { /// Implements one step in the defragmenting process. /// Implements one step in the defragmenting process. /// internal interface IPassCommand { /// /// void ProcessObjectSlot(DefragmentServicesImpl context, ClassMetadata classMetadata , int id); /// /// void ProcessClass(DefragmentServicesImpl context, ClassMetadata classMetadata, int id, int classIndexID); /// /// void ProcessClassCollection(DefragmentServicesImpl context); /// /// void ProcessBTree(DefragmentServicesImpl context, BTree btree); void Flush(DefragmentServicesImpl context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/Defragment.cs0000644000175000017500000003475711700531646027526 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Mapping; namespace Db4objects.Db4o.Defragment { /// defragments database files. /// /// defragments database files. ///
///
/// db4o structures storage inside database files as free and occupied /// slots, very much like a file system - and just like a file system it /// can be fragmented. ///
///
/// The simplest way to defragment a database file: ///
///
/// Defragment.Defrag("sample.yap"); /// ///
///
/// This will move the file to "sample.yap.backup", then create a /// defragmented version of this file in the original position, using a /// temporary file "sample.yap.mapping". If the backup file already /// exists, this will throw an exception and no action will be taken. ///
///
/// For more detailed configuration of the defragmentation process, /// provide a DefragmentConfig instance: ///
///
/// /// DefragmentConfig config=new /// DefragmentConfig("sample.yap","sample.bap",new /// BTreeIDMapping("sample.map")); ///
/// config.ForceBackupDelete(true); ///
/// config.StoredClassFilter(new AvailableClassFilter()); ///
/// config.Db4oConfig(db4oConfig); ///
/// Defragment.Defrag(config); ///
///
///
/// This will move the file to "sample.bap", then create a defragmented /// version of this file in the original position, using a temporary /// file "sample.map" for BTree mapping. If the backup file already /// exists, it will be deleted. The defragmentation process will skip /// all classes that have instances stored within the yap file, but that /// are not available on the class path (through the current /// classloader). Custom db4o configuration options are read from the /// IConfiguration /// passed as db4oConfig. /// Note: /// For some specific, non-default configuration settings like UUID /// generation, etc., you /// must /// pass an appropriate db4o configuration, just like you'd use it /// within your application for normal database operation. ///
public class Defragment { /// /// Renames the file at the given original path to a backup file and then /// builds a defragmented version of the file in the original place. /// /// /// Renames the file at the given original path to a backup file and then /// builds a defragmented version of the file in the original place. /// /// The path to the file to be defragmented. /// if the original file cannot be moved to the backup location /// public static void Defrag(string origPath) { Defrag(new DefragmentConfig(origPath), new Defragment.NullListener()); } /// /// Renames the file at the given original path to the given backup file and /// then builds a defragmented version of the file in the original place. /// /// /// Renames the file at the given original path to the given backup file and /// then builds a defragmented version of the file in the original place. /// /// The path to the file to be defragmented. /// The path to the backup file to be created. /// if the original file cannot be moved to the backup location /// public static void Defrag(string origPath, string backupPath) { Defrag(new DefragmentConfig(origPath, backupPath), new Defragment.NullListener()); } /// /// Renames the file at the configured original path to the configured backup /// path and then builds a defragmented version of the file in the original /// place. /// /// /// Renames the file at the configured original path to the configured backup /// path and then builds a defragmented version of the file in the original /// place. /// /// The configuration for this defragmentation run. /// if the original file cannot be moved to the backup location /// public static void Defrag(DefragmentConfig config) { Defrag(config, new Defragment.NullListener()); } /// /// Renames the file at the configured original path to the configured backup /// path and then builds a defragmented version of the file in the original /// place. /// /// /// Renames the file at the configured original path to the configured backup /// path and then builds a defragmented version of the file in the original /// place. /// /// The configuration for this defragmentation run. /// /// A listener for status notifications during the defragmentation /// process. /// /// if the original file cannot be moved to the backup location /// public static void Defrag(DefragmentConfig config, IDefragmentListener listener) { IStorage storage = config.Db4oConfig().Storage; EnsureFileExists(storage, config.OrigPath()); IStorage backupStorage = config.BackupStorage(); if (backupStorage.Exists(config.BackupPath())) { if (!config.ForceBackupDelete()) { throw new IOException("Could not use '" + config.BackupPath() + "' as backup path - file exists." ); } } // Always delete, because !exists can indicate length == 0 backupStorage.Delete(config.BackupPath()); MoveToBackup(config); if (config.FileNeedsUpgrade()) { UpgradeFile(config); } DefragmentServicesImpl services = new DefragmentServicesImpl(config, listener); try { FirstPass(services, config); services.CommitIds(); SecondPass(services, config); services.CommitIds(); DefragUnindexed(services); services.CommitIds(); services.DefragIdToTimestampBtree(); services.ReplaceClassMetadataRepository(); } catch (CorruptionException exc) { Sharpen.Runtime.PrintStackTrace(exc); } finally { services.Close(); } } /// private static void MoveToBackup(DefragmentConfig config) { IStorage origStorage = config.Db4oConfig().Storage; if (origStorage == config.BackupStorage()) { origStorage.Rename(config.OrigPath(), config.BackupPath()); return; } CopyBin(origStorage, config.BackupStorage(), config.OrigPath(), config.BackupPath ()); origStorage.Delete(config.OrigPath()); } /// private static void CopyBin(IStorage sourceStorage, IStorage targetStorage, string sourcePath, string targetPath) { IBin origBin = sourceStorage.Open(new BinConfiguration(sourcePath, true, 0, true) ); try { IBin backupBin = targetStorage.Open(new BinConfiguration(targetPath, true, origBin .Length(), false)); try { byte[] buffer = new byte[4096]; int bytesRead = -1; int pos = 0; while ((bytesRead = origBin.Read(pos, buffer, buffer.Length)) >= 0) { backupBin.Write(pos, buffer, bytesRead); pos += bytesRead; } } finally { SyncAndClose(backupBin); } } finally { SyncAndClose(origBin); } } private static void SyncAndClose(IBin bin) { try { bin.Sync(); } finally { bin.Close(); } } /// private static void EnsureFileExists(IStorage storage, string origPath) { if (!storage.Exists(origPath)) { throw new IOException("Source database file '" + origPath + "' does not exist."); } } /// private static void UpgradeFile(DefragmentConfig config) { CopyBin(config.BackupStorage(), config.BackupStorage(), config.BackupPath(), config .TempPath()); IConfiguration db4oConfig = (IConfiguration)((Config4Impl)config.Db4oConfig()).DeepClone (null); db4oConfig.Storage = config.BackupStorage(); db4oConfig.AllowVersionUpdates(true); IObjectContainer db = Db4oFactory.OpenFile(db4oConfig, config.TempPath()); db.Close(); } private static void DefragUnindexed(DefragmentServicesImpl services) { IdSource unindexedIDs = services.UnindexedIDs(); while (unindexedIDs.HasMoreIds()) { int origID = unindexedIDs.NextId(); DefragmentContextImpl.ProcessCopy(services, origID, new _ISlotCopyHandler_208()); } } private sealed class _ISlotCopyHandler_208 : ISlotCopyHandler { public _ISlotCopyHandler_208() { } public void ProcessCopy(DefragmentContextImpl context) { ClassMetadata.DefragObject(context); } } /// /// private static void FirstPass(DefragmentServicesImpl context, DefragmentConfig config ) { // System.out.println("FIRST"); Pass(context, config, new FirstPassCommand()); } /// /// private static void SecondPass(DefragmentServicesImpl context, DefragmentConfig config ) { // System.out.println("SECOND"); Pass(context, config, new SecondPassCommand(config.ObjectCommitFrequency())); } /// /// private static void Pass(DefragmentServicesImpl context, DefragmentConfig config, IPassCommand command) { command.ProcessClassCollection(context); IStoredClass[] classes = context.StoredClasses(DefragmentServicesImpl.Sourcedb); for (int classIdx = 0; classIdx < classes.Length; classIdx++) { ClassMetadata classMetadata = (ClassMetadata)classes[classIdx]; if (!config.StoredClassFilter().Accept(classMetadata)) { continue; } ProcessClass(context, classMetadata, command); command.Flush(context); if (config.ObjectCommitFrequency() > 0) { context.TargetCommit(); } } BTree uuidIndex = context.SourceUuidIndex(); if (uuidIndex != null) { command.ProcessBTree(context, uuidIndex); } command.Flush(context); context.TargetCommit(); } // TODO order of class index/object slot processing is crucial: // - object slots before field indices (object slots register addresses for // use by string indices) // - class index before object slots, otherwise phantom btree entries from // deletions appear in the source class index?!? // reproducable with SelectiveCascadingDeleteTestCase and ObjectSetTestCase // - investigate. /// /// private static void ProcessClass(DefragmentServicesImpl context, ClassMetadata curClass , IPassCommand command) { ProcessClassIndex(context, curClass, command); if (!ParentHasIndex(curClass)) { ProcessObjectsForClass(context, curClass, command); } ProcessClassAndFieldIndices(context, curClass, command); } private static bool ParentHasIndex(ClassMetadata curClass) { ClassMetadata parentClass = curClass.GetAncestor(); while (parentClass != null) { if (parentClass.HasClassIndex()) { return true; } parentClass = parentClass.GetAncestor(); } return false; } private static void ProcessObjectsForClass(DefragmentServicesImpl context, ClassMetadata curClass, IPassCommand command) { context.TraverseAll(curClass, new _IVisitor4_284(command, context, curClass)); } private sealed class _IVisitor4_284 : IVisitor4 { public _IVisitor4_284(IPassCommand command, DefragmentServicesImpl context, ClassMetadata curClass) { this.command = command; this.context = context; this.curClass = curClass; } public void Visit(object obj) { int id = ((int)obj); try { // FIXME bubble up exceptions command.ProcessObjectSlot(context, curClass, id); } catch (CorruptionException e) { Sharpen.Runtime.PrintStackTrace(e); } catch (IOException e) { Sharpen.Runtime.PrintStackTrace(e); } } private readonly IPassCommand command; private readonly DefragmentServicesImpl context; private readonly ClassMetadata curClass; } /// /// private static void ProcessClassAndFieldIndices(DefragmentServicesImpl context, ClassMetadata curClass, IPassCommand command) { int sourceClassIndexID = 0; int targetClassIndexID = 0; if (curClass.HasClassIndex()) { sourceClassIndexID = curClass.Index().Id(); targetClassIndexID = context.MappedID(sourceClassIndexID, -1); } command.ProcessClass(context, curClass, curClass.GetID(), targetClassIndexID); } /// /// private static void ProcessClassIndex(DefragmentServicesImpl context, ClassMetadata curClass, IPassCommand command) { if (curClass.HasClassIndex()) { BTreeClassIndexStrategy indexStrategy = (BTreeClassIndexStrategy)curClass.Index(); BTree btree = indexStrategy.Btree(); command.ProcessBTree(context, btree); } } internal class NullListener : IDefragmentListener { public virtual void NotifyDefragmentInfo(DefragmentInfo info) { } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/IIdMapping.cs0000644000175000017500000000404311700531646027414 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Defragment { /// The ID mapping used internally during a defragmentation run. /// The ID mapping used internally during a defragmentation run. /// Defragment public interface IIdMapping { /// Returns a previously registered mapping ID for the given ID if it exists. /// /// Returns a previously registered mapping ID for the given ID if it exists. /// /// The original ID /// The mapping ID for the given original ID or 0, if none has been registered. /// int MappedId(int origId); /// Registers a mapping for the given IDs. /// Registers a mapping for the given IDs. /// The original ID /// The ID to be mapped to the original ID. /// true if the given original ID specifies a class slot, false otherwise. /// void MapId(int origId, int mappedId, bool isClassId); /// Maps an ID to a slot /// /// void MapId(int id, Slot slot); /// provides a Visitable of all mappings of IDs to slots. /// provides a Visitable of all mappings of IDs to slots. IVisitable SlotChanges(); /// Prepares the mapping for use. /// Prepares the mapping for use. /// void Open(); /// Shuts down the mapping after use. /// Shuts down the mapping after use. void Close(); /// returns the slot address for an ID int AddressForId(int id); void Commit(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/DatabaseIdMapping.cs0000644000175000017500000001427111700531646030734 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Mapping; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Defragment { /// Database based mapping for IDs during a defragmentation run. /// /// Database based mapping for IDs during a defragmentation run. /// Use this mapping to keep memory consumption lower than when /// using the /// InMemoryIdMapping /// . /// /// Defragment public class DatabaseIdMapping : AbstractIdMapping { private string _fileName; private LocalObjectContainer _mappingDb; private BTree _idTree; private BTree _slotTree; private MappedIDPair _cache = new MappedIDPair(0, 0); private DatabaseIdMapping.BTreeSpec _treeSpec = null; private int _commitFrequency = 0; private int _idInsertCount = 0; private int _slotInsertCount = 0; /// Will maintain the ID mapping as a BTree in the file with the given path. /// /// /// Will maintain the ID mapping as a BTree in the file with the given path. /// If a file exists in this location, it will be DELETED. /// Node size and cache height of the tree will be the default values used by /// the BTree implementation. The tree will never commit. /// /// The location where the BTree file should be created. public DatabaseIdMapping(string fileName) : this(fileName, null, 0) { } /// Will maintain the ID mapping as a BTree in the file with the given path. /// /// /// Will maintain the ID mapping as a BTree in the file with the given path. /// If a file exists in this location, it will be DELETED. /// /// The location where the BTree file should be created. /// The size of a BTree node /// The number of inserts after which a commit should be issued (<=0: never commit) /// public DatabaseIdMapping(string fileName, int nodeSize, int commitFrequency) : this (fileName, new DatabaseIdMapping.BTreeSpec(nodeSize), commitFrequency) { } private DatabaseIdMapping(string fileName, DatabaseIdMapping.BTreeSpec treeSpec, int commitFrequency) { // <=0 : never commit _fileName = fileName; _treeSpec = treeSpec; _commitFrequency = commitFrequency; } public override int MappedId(int oldID) { if (_cache.Orig() == oldID) { return _cache.Mapped(); } int classID = MappedClassID(oldID); if (classID != 0) { return classID; } IBTreeRange range = _idTree.SearchRange(Trans(), new MappedIDPair(oldID, 0)); IEnumerator pointers = range.Pointers(); if (pointers.MoveNext()) { BTreePointer pointer = (BTreePointer)pointers.Current; _cache = (MappedIDPair)pointer.Key(); return _cache.Mapped(); } return 0; } protected override void MapNonClassIDs(int origID, int mappedID) { _cache = new MappedIDPair(origID, mappedID); _idTree.Add(Trans(), _cache); if (_commitFrequency > 0) { _idInsertCount++; if (_commitFrequency == _idInsertCount) { _idTree.Commit(Trans()); _idInsertCount = 0; } } } /// public override void Open() { _mappingDb = DefragmentServicesImpl.FreshTempFile(_fileName, 1); _idTree = (_treeSpec == null ? new BTree(Trans(), 0, new MappedIDPairHandler()) : new BTree(Trans(), 0, new MappedIDPairHandler(), _treeSpec.NodeSize())); _slotTree = (_treeSpec == null ? new BTree(Trans(), 0, new BTreeIdSystem.IdSlotMappingHandler ()) : new BTree(Trans(), 0, new BTreeIdSystem.IdSlotMappingHandler(), _treeSpec. NodeSize())); } public override void Close() { _mappingDb.Close(); } private Transaction Trans() { return _mappingDb.SystemTransaction(); } private class BTreeSpec { private int _nodeSize; public BTreeSpec(int nodeSize) { _nodeSize = nodeSize; } public virtual int NodeSize() { return _nodeSize; } } public override void MapId(int id, Slot slot) { _slotTree.Add(Trans(), new IdSlotMapping(id, slot.Address(), slot.Length())); if (_commitFrequency > 0) { _slotInsertCount++; if (_commitFrequency == _slotInsertCount) { _slotTree.Commit(Trans()); _slotInsertCount = 0; } } } public override IVisitable SlotChanges() { return new _IVisitable_137(this); } private sealed class _IVisitable_137 : IVisitable { public _IVisitable_137(DatabaseIdMapping _enclosing) { this._enclosing = _enclosing; } public void Accept(IVisitor4 outSideVisitor) { this._enclosing._slotTree.TraverseKeys(this._enclosing.Trans(), new _IVisitor4_139 (outSideVisitor)); } private sealed class _IVisitor4_139 : IVisitor4 { public _IVisitor4_139(IVisitor4 outSideVisitor) { this.outSideVisitor = outSideVisitor; } public void Visit(object idSlotMapping) { SlotChange slotChange = new SlotChange(((IdSlotMapping)idSlotMapping)._id); slotChange.NotifySlotCreated(((IdSlotMapping)idSlotMapping).Slot()); outSideVisitor.Visit(slotChange); } private readonly IVisitor4 outSideVisitor; } private readonly DatabaseIdMapping _enclosing; } public override int AddressForId(int id) { IBTreeRange range = _slotTree.SearchRange(Trans(), new IdSlotMapping(id, 0, 0)); IEnumerator pointers = range.Pointers(); if (pointers.MoveNext()) { BTreePointer pointer = (BTreePointer)pointers.Current; return ((IdSlotMapping)pointer.Key())._address; } return 0; } public override void Commit() { _mappingDb.Commit(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/IDefragmentListener.cs0000644000175000017500000000154711700531646031334 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; namespace Db4objects.Db4o.Defragment { /// Listener for defragmentation process messages. /// Listener for defragmentation process messages. /// Defragment public interface IDefragmentListener { /// /// This method will be called when the defragment process encounters /// file layout anomalies during the defragmentation process. /// /// /// This method will be called when the defragment process encounters /// file layout anomalies during the defragmentation process. /// /// The message from the defragmentation process. void NotifyDefragmentInfo(DefragmentInfo info); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/IDefragmentServices.cs0000644000175000017500000000315711700531646031331 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Mapping; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Defragment { /// Encapsulates services involving source and target database files during defragmenting. /// /// Encapsulates services involving source and target database files during defragmenting. /// /// public interface IDefragmentServices : IIDMapping { /// ByteArrayBuffer SourceBufferByAddress(int address, int length); /// ByteArrayBuffer TargetBufferByAddress(int address, int length); ByteArrayBuffer SourceBufferByID(int sourceID); Slot AllocateTargetSlot(int targetLength); void TargetWriteBytes(ByteArrayBuffer targetPointerReader, int targetAddress); Transaction SystemTrans(); void TargetWriteBytes(DefragmentContextImpl context, int targetAddress); void TraverseAllIndexSlots(BTree tree, IVisitor4 visitor4); void RegisterBTreeIDs(BTree tree, IDMappingCollector collector); ClassMetadata ClassMetadataForId(int id); int MappedID(int id); void RegisterUnindexed(int id); IdSource UnindexedIDs(); int SourceAddressByID(int sourceID); int TargetAddressByID(int sourceID); int TargetNewId(); IIdMapping Mapping(); void CommitIds(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/DefragmentServicesImpl.cs0000644000175000017500000003735411700531646032050 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Mapping; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Internal.Slots; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Defragment { /// public class DefragmentServicesImpl : IDefragmentServices { public abstract class DbSelector { internal DbSelector() { } internal abstract LocalObjectContainer Db(DefragmentServicesImpl context); internal virtual Db4objects.Db4o.Internal.Transaction Transaction(DefragmentServicesImpl context) { return Db(context).SystemTransaction(); } } private sealed class _DbSelector_39 : DefragmentServicesImpl.DbSelector { public _DbSelector_39() { } internal override LocalObjectContainer Db(DefragmentServicesImpl context) { return context._sourceDb; } } public static readonly DefragmentServicesImpl.DbSelector Sourcedb = new _DbSelector_39 (); private sealed class _DbSelector_45 : DefragmentServicesImpl.DbSelector { public _DbSelector_45() { } internal override LocalObjectContainer Db(DefragmentServicesImpl context) { return context._targetDb; } } public static readonly DefragmentServicesImpl.DbSelector Targetdb = new _DbSelector_45 (); private readonly LocalObjectContainer _sourceDb; private readonly LocalObjectContainer _targetDb; private readonly IIdMapping _mapping; private IDefragmentListener _listener; private IQueue4 _unindexed = new NonblockingQueue(); private DefragmentConfig _defragConfig; /// public DefragmentServicesImpl(DefragmentConfig defragConfig, IDefragmentListener listener) { _listener = listener; Config4Impl originalConfig = (Config4Impl)defragConfig.Db4oConfig(); IStorage storage = defragConfig.BackupStorage(); if (defragConfig.ReadOnly()) { storage = new NonFlushingStorage(storage); } Config4Impl sourceConfig = PrepareConfig(originalConfig, storage, defragConfig.ReadOnly ()); _sourceDb = (LocalObjectContainer)Db4oFactory.OpenFile(sourceConfig, defragConfig .TempPath()).Ext(); _sourceDb.ShowInternalClasses(true); defragConfig.Db4oConfig().BlockSize(_sourceDb.BlockSize()); if (!originalConfig.GenerateCommitTimestamps().DefiniteNo()) { defragConfig.Db4oConfig().GenerateCommitTimestamps(_sourceDb.Config().GenerateCommitTimestamps ().DefiniteYes()); } _targetDb = FreshTargetFile(defragConfig); _mapping = defragConfig.Mapping(); _mapping.Open(); _defragConfig = defragConfig; } private Config4Impl PrepareConfig(Config4Impl originalConfig, IStorage storage, bool readOnly) { Config4Impl sourceConfig = (Config4Impl)originalConfig.DeepClone(null); sourceConfig.WeakReferences(false); sourceConfig.Storage = storage; sourceConfig.ReadOnly(readOnly); return sourceConfig; } /// internal static LocalObjectContainer FreshTempFile(string fileName, int blockSize ) { FileStorage storage = new FileStorage(); storage.Delete(fileName); IConfiguration db4oConfig = DefragmentConfig.VanillaDb4oConfig(blockSize); db4oConfig.ObjectClass(typeof(IdSlotMapping)).ObjectField("_id").Indexed(true); db4oConfig.Storage = storage; return (LocalObjectContainer)Db4oFactory.OpenFile(db4oConfig, fileName).Ext(); } /// internal static LocalObjectContainer FreshTargetFile(DefragmentConfig config) { config.Db4oConfig().Storage.Delete(config.OrigPath()); return (LocalObjectContainer)Db4oFactory.OpenFile(config.ClonedDb4oConfig(), config .OrigPath()); } public virtual int MappedID(int oldID, int defaultID) { int mapped = InternalMappedID(oldID); return (mapped != 0 ? mapped : defaultID); } /// public virtual int StrictMappedID(int oldID) { int mapped = InternalMappedID(oldID); if (mapped == 0) { throw new MappingNotFoundException(oldID); } return mapped; } public virtual int MappedID(int id) { if (id == 0) { return 0; } int mapped = InternalMappedID(id); if (mapped == 0) { _listener.NotifyDefragmentInfo(new DefragmentInfo("No mapping found for ID " + id )); return Const4.InvalidObjectId; } return mapped; } /// private int InternalMappedID(int oldID) { if (oldID == 0) { return 0; } int mappedId = _mapping.MappedId(oldID); if (mappedId == 0 && _sourceDb.Handlers.IsSystemHandler(oldID)) { return oldID; } return mappedId; } public virtual void MapIDs(int oldID, int newID, bool isClassID) { _mapping.MapId(oldID, newID, isClassID); } public virtual void Close() { _sourceDb.Close(); _targetDb.Close(); _mapping.Close(); } public virtual ByteArrayBuffer BufferByID(DefragmentServicesImpl.DbSelector selector , int id) { Slot slot = CommittedSlot(selector, id); return BufferByAddress(selector, slot.Address(), slot.Length()); } private Slot CommittedSlot(DefragmentServicesImpl.DbSelector selector, int id) { return selector.Db(this).IdSystem().CommittedSlot(id); } /// public virtual ByteArrayBuffer SourceBufferByAddress(int address, int length) { return BufferByAddress(Sourcedb, address, length); } /// public virtual ByteArrayBuffer TargetBufferByAddress(int address, int length) { return BufferByAddress(Targetdb, address, length); } public virtual ByteArrayBuffer BufferByAddress(DefragmentServicesImpl.DbSelector selector, int address, int length) { return selector.Db(this).DecryptedBufferByAddress(address, length); } /// public virtual StatefulBuffer TargetStatefulBufferByAddress(int address, int length ) { return _targetDb.ReadWriterByAddress(Targetdb.Transaction(this), address, length); } public virtual Slot AllocateTargetSlot(int length) { return _targetDb.AllocateSlot(length); } public virtual void TargetWriteBytes(DefragmentContextImpl context, int address) { context.Write(_targetDb, address); } public virtual void TargetWriteBytes(ByteArrayBuffer reader, int address) { _targetDb.WriteBytes(reader, address, 0); } public virtual IStoredClass[] StoredClasses(DefragmentServicesImpl.DbSelector selector ) { LocalObjectContainer db = selector.Db(this); db.ShowInternalClasses(true); try { return db.ClassCollection().StoredClasses(); } finally { db.ShowInternalClasses(false); } } public virtual LatinStringIO StringIO() { return _sourceDb.StringIO(); } public virtual void TargetCommit() { _targetDb.Commit(); } public virtual ITypeHandler4 SourceHandler(int id) { return _sourceDb.TypeHandlerForClassMetadataID(id); } public virtual int SourceClassCollectionID() { return _sourceDb.ClassCollection().GetID(); } private Hashtable4 _classIndices = new Hashtable4(16); public virtual int ClassIndexID(ClassMetadata classMetadata) { return ClassIndex(classMetadata).Id(); } public virtual void TraverseAll(ClassMetadata classMetadata, IVisitor4 command) { if (!classMetadata.HasClassIndex()) { return; } classMetadata.Index().TraverseAll(Sourcedb.Transaction(this), command); } public virtual void TraverseAllIndexSlots(ClassMetadata classMetadata, IVisitor4 command) { IEnumerator slotIDIter = classMetadata.Index().AllSlotIDs(Sourcedb.Transaction(this )); while (slotIDIter.MoveNext()) { command.Visit(slotIDIter.Current); } } public virtual void TraverseAllIndexSlots(BTree btree, IVisitor4 command) { IEnumerator slotIDIter = btree.AllNodeIds(Sourcedb.Transaction(this)); while (slotIDIter.MoveNext()) { command.Visit(slotIDIter.Current); } } public virtual void RegisterBTreeIDs(BTree btree, IDMappingCollector collector) { collector.CreateIDMapping(this, btree.GetID(), false); TraverseAllIndexSlots(btree, new _IVisitor4_244(this, collector)); } private sealed class _IVisitor4_244 : IVisitor4 { public _IVisitor4_244(DefragmentServicesImpl _enclosing, IDMappingCollector collector ) { this._enclosing = _enclosing; this.collector = collector; } public void Visit(object obj) { int id = ((int)obj); collector.CreateIDMapping(this._enclosing, id, false); } private readonly DefragmentServicesImpl _enclosing; private readonly IDMappingCollector collector; } public virtual int DatabaseIdentityID(DefragmentServicesImpl.DbSelector selector) { LocalObjectContainer db = selector.Db(this); Db4oDatabase identity = db.Identity(); if (identity == null) { return 0; } return identity.GetID(selector.Transaction(this)); } private IClassIndexStrategy ClassIndex(ClassMetadata classMetadata) { IClassIndexStrategy classIndex = (IClassIndexStrategy)_classIndices.Get(classMetadata ); if (classIndex == null) { classIndex = new BTreeClassIndexStrategy(classMetadata); _classIndices.Put(classMetadata, classIndex); classIndex.Initialize(_targetDb); } return classIndex; } public virtual Db4objects.Db4o.Internal.Transaction SystemTrans() { return Sourcedb.Transaction(this); } public virtual void CopyIdentity() { _targetDb.SetIdentity(_sourceDb.Identity()); } public virtual void ReplaceClassMetadataRepository() { Db4objects.Db4o.Internal.Transaction systemTransaction = _targetDb.SystemTransaction (); // Can't use strictMappedID because the repository ID can // be lower than HandlerRegisrtry _highestBuiltinTypeID and // the ClassRepository ID would be treated as a system handler // and the unmapped ID would be returned. int newRepositoryId = _mapping.MappedId(SourceClassCollectionID()); int sourceIdentityID = DatabaseIdentityID(DefragmentServicesImpl.Sourcedb); int targetIdentityID = _mapping.MappedId(sourceIdentityID); int targetUuidIndexID = _mapping.MappedId(SourceUuidIndexID()); int oldIdentityId = _targetDb.SystemData().Identity().GetID(systemTransaction); int oldRepositoryId = _targetDb.ClassCollection().GetID(); ClassMetadataRepository oldRepository = _targetDb.ClassCollection(); ClassMetadataRepository newRepository = new ClassMetadataRepository(systemTransaction ); newRepository.SetID(newRepositoryId); newRepository.Read(systemTransaction); newRepository.InitOnUp(systemTransaction); _targetDb.SystemData().ClassCollectionID(newRepositoryId); _targetDb.ReplaceClassMetadataRepository(newRepository); _targetDb.SystemData().UuidIndexId(targetUuidIndexID); Db4oDatabase identity = (Db4oDatabase)_targetDb.GetByID(systemTransaction, targetIdentityID ); _targetDb.SetIdentity(identity); ClassMetadataIterator iterator = oldRepository.Iterator(); while (iterator.MoveNext()) { ClassMetadata classMetadata = iterator.CurrentClass(); BTreeClassIndexStrategy index = (BTreeClassIndexStrategy)classMetadata.Index(); index.Btree().Free(_targetDb.LocalSystemTransaction()); FreeById(classMetadata.GetID()); } FreeById(oldIdentityId); FreeById(oldRepositoryId); } public virtual void DefragIdToTimestampBtree() { if (_sourceDb.SystemData().IdToTimestampIndexId() == 0) { return; } LocalTransaction targetTransaction = (LocalTransaction)_targetDb.SystemTransaction (); LocalTransaction sourceTransaction = (LocalTransaction)_sourceDb.SystemTransaction (); CommitTimestampSupport target = targetTransaction.CommitTimestampSupport(); CommitTimestampSupport source = sourceTransaction.CommitTimestampSupport(); if (source.IdToTimestamp() == null) { return; } source.IdToTimestamp().TraverseKeys(sourceTransaction, new _IVisitor4_336(this, target , targetTransaction)); } private sealed class _IVisitor4_336 : IVisitor4 { public _IVisitor4_336(DefragmentServicesImpl _enclosing, CommitTimestampSupport target , LocalTransaction targetTransaction) { this._enclosing = _enclosing; this.target = target; this.targetTransaction = targetTransaction; } public void Visit(object te) { int mappedID = this._enclosing.MappedID(((CommitTimestampSupport.TimestampEntry)te ).ParentID()); target.Put(targetTransaction, mappedID, ((CommitTimestampSupport.TimestampEntry)te ).GetCommitTimestamp()); } private readonly DefragmentServicesImpl _enclosing; private readonly CommitTimestampSupport target; private readonly LocalTransaction targetTransaction; } private void FreeById(int id) { _targetDb.SystemTransaction().IdSystem().NotifySlotDeleted(id, SlotChangeFactory. SystemObjects); } public virtual ByteArrayBuffer SourceBufferByID(int sourceID) { return BufferByID(Sourcedb, sourceID); } public virtual BTree SourceUuidIndex() { if (SourceUuidIndexID() == 0) { return null; } return _sourceDb.UUIDIndex().GetIndex(SystemTrans()); } public virtual void TargetUuidIndexID(int id) { _targetDb.SystemData().UuidIndexId(id); } public virtual int SourceUuidIndexID() { return _sourceDb.SystemData().UuidIndexId(); } public virtual int SourceIdToTimestampIndexID() { return _sourceDb.SystemData().IdToTimestampIndexId(); } public virtual ClassMetadata ClassMetadataForId(int id) { return _sourceDb.ClassMetadataForID(id); } public virtual void RegisterUnindexed(int id) { _unindexed.Add(id); } public virtual IdSource UnindexedIDs() { return new IdSource(_unindexed); } public virtual ObjectHeader SourceObjectHeader(ByteArrayBuffer buffer) { return new ObjectHeader(_sourceDb, buffer); } public virtual int BlockSize() { return _sourceDb.BlockSize(); } public virtual int SourceAddressByID(int sourceID) { return CommittedSlot(Sourcedb, sourceID).Address(); } public virtual int TargetAddressByID(int sourceID) { return _mapping.AddressForId(sourceID); } public virtual bool Accept(IStoredClass klass) { return this._defragConfig.StoredClassFilter().Accept(klass); } public virtual int TargetNewId() { return _targetDb.IdSystem().NewId(); } public virtual IIdMapping Mapping() { return _mapping; } public virtual void CommitIds() { FreespaceCommitter freespaceCommitter = new FreespaceCommitter(_targetDb.FreespaceManager ()); freespaceCommitter.TransactionalIdSystem(SystemTrans().IdSystem()); _targetDb.IdSystem().Commit(Mapping().SlotChanges(), freespaceCommitter); freespaceCommitter.Commit(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/DefragmentInfo.cs0000644000175000017500000000146511700531646030330 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Defragment { /// A message from the defragmentation process. /// /// A message from the defragmentation process. This is a stub only /// and will be refined. /// Currently instances of these class will only be created and sent /// to registered listeners when invalid IDs are encountered during /// the defragmentation process. These probably are harmless and the /// result of a user-initiated delete operation. /// /// Defragment public class DefragmentInfo { private string _msg; public DefragmentInfo(string msg) { _msg = msg; } public override string ToString() { return _msg; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/AbstractIdMapping.cs0000644000175000017500000000251111700531646030765 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Defragment { /// Base class for defragment ID mappings. /// Base class for defragment ID mappings. /// Defragment public abstract class AbstractIdMapping : IIdMapping { private Hashtable4 _classIDs = new Hashtable4(); public void MapId(int origID, int mappedID, bool isClassID) { if (isClassID) { MapClassIDs(origID, mappedID); return; } MapNonClassIDs(origID, mappedID); } protected virtual int MappedClassID(int origID) { object obj = _classIDs.Get(origID); if (obj == null) { return 0; } return ((int)obj); } private void MapClassIDs(int oldID, int newID) { _classIDs.Put(oldID, newID); } protected abstract void MapNonClassIDs(int origID, int mappedID); public abstract int AddressForId(int arg1); public abstract void Close(); public abstract void Commit(); public abstract void MapId(int arg1, Slot arg2); public abstract int MappedId(int arg1); public abstract void Open(); public abstract IVisitable SlotChanges(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/DefragmentConfig.cs0000644000175000017500000002221211700531646030633 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; namespace Db4objects.Db4o.Defragment { /// Configuration for a defragmentation run. /// Configuration for a defragmentation run. /// Defragment public class DefragmentConfig { public const bool Debug = false; public static readonly string BackupSuffix = "backup"; private string _origPath; private string _backupPath; private string _tempPath; private IIdMapping _mapping; private IConfiguration _config; private IStoredClassFilter _storedClassFilter = null; private bool _forceBackupDelete = false; private bool _readOnly = true; private int _objectCommitFrequency; private IStorage _backupStorage; /// Creates a configuration for a defragmentation run. /// /// Creates a configuration for a defragmentation run. The backup and mapping /// file paths are generated from the original path by appending the default /// suffixes. All properties other than the provided paths are set to FALSE /// by default. /// /// /// The path to the file to be defragmented. Must exist and must be /// a valid db4o file. /// public DefragmentConfig(string origPath) : this(origPath, origPath + "." + BackupSuffix ) { } /// Creates a configuration for a defragmentation run with in-memory mapping. /// /// /// Creates a configuration for a defragmentation run with in-memory mapping. /// All properties other than the provided paths are set to FALSE by default. /// /// /// The path to the file to be defragmented. Must exist and must be /// a valid db4o file. /// /// /// The path to the backup of the original file. No file should /// exist at this position, otherwise it will be OVERWRITTEN if forceBackupDelete() /// is set to true! /// public DefragmentConfig(string origPath, string backupPath) : this(origPath, backupPath , new InMemoryIdMapping()) { } /// Creates a configuration for a defragmentation run. /// /// Creates a configuration for a defragmentation run. All properties other /// than the provided paths are set to FALSE by default. /// /// /// The path to the file to be defragmented. Must exist and must be /// a valid db4o file. /// /// /// The path to the backup of the original file. No file should /// exist at this position, otherwise it will be OVERWRITTEN if forceBackupDelete() /// is set to true! /// /// /// The Id mapping to be used internally. Pass either a /// InMemoryIdMapping /// for fastest defragment or a /// DatabaseIdMapping /// for low memory consumption. /// public DefragmentConfig(string origPath, string backupPath, IIdMapping mapping) { _origPath = origPath; _backupPath = backupPath; _mapping = mapping; } /// The path to the file to be defragmented. public virtual string OrigPath() { return _origPath; } /// The path to the backup of the original file. public virtual string BackupPath() { return _backupPath; } /// The temporary ID mapping used internally. For internal use only. public virtual IIdMapping Mapping() { return _mapping; } /// /// The /// IStoredClassFilter /// used to select stored class extents to /// be included into the defragmented file. /// public virtual IStoredClassFilter StoredClassFilter() { return (_storedClassFilter == null ? Nullfilter : _storedClassFilter); } /// /// The /// IStoredClassFilter /// used to select stored class extents to /// be included into the defragmented file. /// public virtual void StoredClassFilter(IStoredClassFilter storedClassFilter) { _storedClassFilter = storedClassFilter; } /// true, if an existing backup file should be deleted, false otherwise. public virtual bool ForceBackupDelete() { return _forceBackupDelete; } /// true, if an existing backup file should be deleted, false otherwise. /// public virtual void ForceBackupDelete(bool forceBackupDelete) { _forceBackupDelete = forceBackupDelete; } /// /// allows turning on and off readonly mode.

/// When changed classes are likely to be detected defragment, it may be required /// to open the original database in read/write mode. ///
/// /// allows turning on and off readonly mode.

/// When changed classes are likely to be detected defragment, it may be required /// to open the original database in read/write mode.

/// Readonly mode is the default setting. ///
/// false, to turn off readonly mode. public virtual void ReadOnly(bool flag) { _readOnly = flag; } /// true, if the original database file is to be opened in readonly mode. public virtual bool ReadOnly() { return _readOnly; } /// /// The db4o /// IConfiguration /// to be applied /// during the defragment process. /// public virtual IConfiguration Db4oConfig() { if (_config == null) { _config = VanillaDb4oConfig(1); } return _config; } /// /// The db4o /// IConfiguration /// to be applied /// during the defragment process. /// [System.ObsoleteAttribute(@"since 7.9: use Db4oConfig(Db4objects.Db4o.Config.IEmbeddedConfiguration) instead" )] public virtual void Db4oConfig(IConfiguration config) { _config = config; } /// /// The db4o /// IEmbeddedConfiguration /// to be applied /// during the defragment process. /// /// 7.9 public virtual void Db4oConfig(IEmbeddedConfiguration config) { _config = ((EmbeddedConfigurationImpl)config).Legacy(); } public virtual int ObjectCommitFrequency() { return _objectCommitFrequency; } /// /// The number of processed object (slots) that should trigger an /// intermediate commit of the target file. Default: 0, meaning: never. /// public virtual void ObjectCommitFrequency(int objectCommitFrequency) { _objectCommitFrequency = objectCommitFrequency; } /// /// Instruct the defragment process to upgrade the source file to the current db4o /// version prior to defragmenting it. /// /// /// Instruct the defragment process to upgrade the source file to the current db4o /// version prior to defragmenting it. Use this option if your source file has been created /// with an older db4o version than the one you are using. /// /// The location for an intermediate, upgraded version of the source file. /// public virtual void UpgradeFile(string tempPath) { _tempPath = tempPath; } public virtual bool FileNeedsUpgrade() { return _tempPath != null; } public virtual string TempPath() { return (_tempPath != null ? _tempPath : _backupPath); } public virtual int BlockSize() { return ((Config4Impl)Db4oConfig()).BlockSize(); } protected class NullFilter : IStoredClassFilter { public virtual bool Accept(IStoredClass storedClass) { return true; } } private static readonly IStoredClassFilter Nullfilter = new DefragmentConfig.NullFilter (); public static IConfiguration VanillaDb4oConfig(int blockSize) { IConfiguration config = Db4oFactory.NewConfiguration(); config.WeakReferences(false); config.BlockSize(blockSize); return config; } public virtual IConfiguration ClonedDb4oConfig() { return (IConfiguration)((Config4Impl)Db4oConfig()).DeepClone(null); } public virtual void BackupStorage(IStorage backupStorage) { _backupStorage = backupStorage; } public virtual IStorage BackupStorage() { if (_backupStorage != null) { return _backupStorage; } return _config.Storage; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/IDMappingCollector.cs0000644000175000017500000000234511700531646031115 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Defragment { public class IDMappingCollector { private const int IdBatchSize = 4096; private TreeInt _ids; internal virtual void CreateIDMapping(DefragmentServicesImpl context, int objectID , bool isClassID) { if (BatchFull()) { Flush(context); } _ids = TreeInt.Add(_ids, (isClassID ? -objectID : objectID)); } private bool BatchFull() { return _ids != null && _ids.Size() == IdBatchSize; } public virtual void Flush(DefragmentServicesImpl context) { if (_ids == null) { return; } IEnumerator idIter = new TreeKeyIterator(_ids); while (idIter.MoveNext()) { int objectID = ((int)idIter.Current); bool isClassID = false; if (objectID < 0) { objectID = -objectID; isClassID = true; } // seen object ids don't come by here anymore - any other candidates? context.MapIDs(objectID, context.TargetNewId(), isClassID); } context.Mapping().Commit(); _ids = null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/InMemoryIdMapping.cs0000644000175000017500000000544511700531646030772 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Defragment { /// In-memory mapping for IDs during a defragmentation run. /// /// In-memory mapping for IDs during a defragmentation run. /// This is faster than the /// DatabaseIdMapping /// but /// it uses more memory. If you have OutOfMemory conditions /// with this id mapping, use the /// DatabaseIdMapping /// instead. /// /// Defragment public class InMemoryIdMapping : AbstractIdMapping { private IdSlotTree _idsToSlots; private Tree _tree; public override int MappedId(int oldID) { int classID = MappedClassID(oldID); if (classID != 0) { return classID; } TreeIntObject res = (TreeIntObject)TreeInt.Find(_tree, oldID); if (res != null) { return ((int)res._object); } return 0; } public override void Open() { } public override void Close() { } protected override void MapNonClassIDs(int origID, int mappedID) { _tree = Tree.Add(_tree, new TreeIntObject(origID, mappedID)); } public override int AddressForId(int id) { IdSlotTree node = (IdSlotTree)_idsToSlots.Find(id); if (node == null) { throw new InvalidOperationException(); } return node.Slot().Address(); } public override void MapId(int id, Slot slot) { IdSlotTree idSlotMapping = new IdSlotTree(id, slot); _idsToSlots = ((IdSlotTree)Tree.Add(_idsToSlots, idSlotMapping)); } public override IVisitable SlotChanges() { return new _IVisitable_62(this); } private sealed class _IVisitable_62 : IVisitable { public _IVisitable_62(InMemoryIdMapping _enclosing) { this._enclosing = _enclosing; } public void Accept(IVisitor4 outSideVisitor) { Tree.Traverse(this._enclosing._idsToSlots, new _IVisitor4_64(outSideVisitor)); } private sealed class _IVisitor4_64 : IVisitor4 { public _IVisitor4_64(IVisitor4 outSideVisitor) { this.outSideVisitor = outSideVisitor; } public void Visit(object idSlotMapping) { SlotChange slotChange = new SlotChange(((TreeInt)idSlotMapping)._key); slotChange.NotifySlotCreated(((IdSlotTree)idSlotMapping).Slot()); outSideVisitor.Visit(slotChange); } private readonly IVisitor4 outSideVisitor; } private readonly InMemoryIdMapping _enclosing; } public override void Commit() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Defragment/SecondPassCommand.cs0000644000175000017500000001237711700531646031005 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Defragment { /// /// Second step in the defragmenting process: Fills in target file pointer slots, copies /// content slots from source to target and triggers ID remapping therein by calling the /// appropriate db4o/marshaller defrag() implementations. /// /// /// Second step in the defragmenting process: Fills in target file pointer slots, copies /// content slots from source to target and triggers ID remapping therein by calling the /// appropriate db4o/marshaller defrag() implementations. During the process, the actual address /// mappings for the content slots are registered for use with string indices. /// /// internal sealed class SecondPassCommand : IPassCommand { protected readonly int _objectCommitFrequency; protected int _objectCount = 0; public SecondPassCommand(int objectCommitFrequency) { _objectCommitFrequency = objectCommitFrequency; } /// /// public void ProcessClass(DefragmentServicesImpl services, ClassMetadata classMetadata , int id, int classIndexID) { if (services.MappedID(id, -1) == -1) { Sharpen.Runtime.Err.WriteLine("MAPPING NOT FOUND: " + id); } DefragmentContextImpl.ProcessCopy(services, id, new _ISlotCopyHandler_34(classMetadata , classIndexID)); } private sealed class _ISlotCopyHandler_34 : ISlotCopyHandler { public _ISlotCopyHandler_34(ClassMetadata classMetadata, int classIndexID) { this.classMetadata = classMetadata; this.classIndexID = classIndexID; } public void ProcessCopy(DefragmentContextImpl context) { classMetadata.DefragClass(context, classIndexID); } private readonly ClassMetadata classMetadata; private readonly int classIndexID; } /// /// public void ProcessObjectSlot(DefragmentServicesImpl services, ClassMetadata classMetadata , int id) { ByteArrayBuffer sourceBuffer = services.SourceBufferByID(id); DefragmentContextImpl.ProcessCopy(services, id, new _ISlotCopyHandler_43(this, services ), sourceBuffer); } private sealed class _ISlotCopyHandler_43 : ISlotCopyHandler { public _ISlotCopyHandler_43(SecondPassCommand _enclosing, DefragmentServicesImpl services) { this._enclosing = _enclosing; this.services = services; } public void ProcessCopy(DefragmentContextImpl context) { ClassMetadata.DefragObject(context); if (this._enclosing._objectCommitFrequency > 0) { this._enclosing._objectCount++; if (this._enclosing._objectCount == this._enclosing._objectCommitFrequency) { services.TargetCommit(); services.Mapping().Commit(); this._enclosing._objectCount = 0; } } } private readonly SecondPassCommand _enclosing; private readonly DefragmentServicesImpl services; } /// /// public void ProcessClassCollection(DefragmentServicesImpl services) { DefragmentContextImpl.ProcessCopy(services, services.SourceClassCollectionID(), new _ISlotCopyHandler_59(services)); } private sealed class _ISlotCopyHandler_59 : ISlotCopyHandler { public _ISlotCopyHandler_59(DefragmentServicesImpl services) { this.services = services; } public void ProcessCopy(DefragmentContextImpl context) { int acceptedClasses = 0; int numClassesOffset = context.TargetBuffer().Offset(); acceptedClasses = this.CopyAcceptedClasses(context, acceptedClasses); this.WriteIntAt(context.TargetBuffer(), numClassesOffset, acceptedClasses); } private int CopyAcceptedClasses(DefragmentContextImpl context, int acceptedClasses ) { int numClasses = context.ReadInt(); for (int classIdx = 0; classIdx < numClasses; classIdx++) { int classId = context.SourceBuffer().ReadInt(); if (!this.Accept(classId)) { continue; } ++acceptedClasses; context.WriteMappedID(classId); } return acceptedClasses; } private void WriteIntAt(ByteArrayBuffer target, int offset, int value) { int currentOffset = target.Offset(); target.Seek(offset); target.WriteInt(value); target.Seek(currentOffset); } private bool Accept(int classId) { return services.Accept(services.ClassMetadataForId(classId)); } private readonly DefragmentServicesImpl services; } /// /// public void ProcessBTree(DefragmentServicesImpl context, BTree btree) { btree.DefragBTree(context); } public void Flush(DefragmentServicesImpl context) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IObjectServer.cs0000644000175000017500000000640211700531646026066 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o { /// the db4o server interface. /// /// the db4o server interface. ///

- db4o servers can be opened with /// Db4oFactory.OpenServer(string, int) /// /// .
/// - Direct in-memory connections to servers can be made with /// OpenClient() ///
/// - TCP connections are available through /// Db4oFactory.OpenClient(string, int, string, string) /// /// . ///

Before connecting clients over TCP, you have to /// GrantAccess(string, string) /// to the username and password combination /// that you want to use. ///
/// Db4o.openServer /// ExtObjectServer for extended functionality /// public interface IObjectServer : System.IDisposable { /// /// closes the /// /// and writes all cached data. ///

///
/// /// true - denotes that the last instance connected to the /// used database file was closed. /// bool Close(); /// /// returns an /// /// with extended functionality. ///

Use this method as a convenient accessor to extended methods. /// Every /// /// can be casted to an /// Db4objects.Db4o.Ext.IExtObjectServer /// /// . ///

The functionality is split to two interfaces to allow newcomers to /// focus on the essential methods. ///
IExtObjectServer Ext(); /// grants client access to the specified user with the specified password. /// /// grants client access to the specified user with the specified password. ///

If the user already exists, the password is changed to /// the specified password.

///
/// the name of the user /// the password to be used void GrantAccess(string userName, string password); /// opens a client against this server. /// /// opens a client against this server. ///

A client opened with this method operates within the same VM /// as the server. Since an embedded client can use direct communication, without /// an in-between socket connection, performance will be better than a client /// opened with /// Db4oFactory.OpenClient(string, int, string, string) /// ///

Every client has it's own transaction and uses it's own cache /// for it's own version of all peristent objects. ///
IObjectContainer OpenClient(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/0000755000175000017500000000000011700531646024572 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IWriteContext.cs0000644000175000017500000000372511700531646027700 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Marshall { /// /// this interface is passed to internal class /// Db4objects.Db4o.Typehandlers.ITypeHandler4 /// /// during marshaling /// and provides methods to marshal objects. /// public interface IWriteContext : IContext, IWriteBuffer { /// /// makes sure the object is stored and writes the ID of /// the object to the context. /// /// /// makes sure the object is stored and writes the ID of /// the object to the context. /// Use this method for first class objects only (objects that /// have an identity in the database). If the object can potentially /// be a primitive type, do not use this method but use /// a matching /// IWriteBuffer /// method instead. /// /// the object to write. void WriteObject(object obj); /// /// writes sub-objects, in cases where the /// Db4objects.Db4o.Typehandlers.ITypeHandler4 /// /// is known. /// /// typehandler to be used to write the object. /// the object to write void WriteObject(ITypeHandler4 handler, object obj); /// /// reserves a buffer with a specific length at the current /// position, to be written in a later step. /// /// /// reserves a buffer with a specific length at the current /// position, to be written in a later step. /// /// the length to be reserved. /// the ReservedBuffer IReservedBuffer Reserve(int length); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IContext.cs0000644000175000017500000000111311700531646026652 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Marshall { /// /// common functionality for /// IReadContext /// and /// IWriteContext /// and /// Db4objects.Db4o.Internal.Delete.IDeleteContext /// /// /// public interface IContext { IObjectContainer ObjectContainer(); Db4objects.Db4o.Internal.Transaction Transaction(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IReferenceActivationContext.cs0000644000175000017500000000062111700531646032516 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Marshall { /// this interface is passed to reference type handlers. /// this interface is passed to reference type handlers. public interface IReferenceActivationContext : IReadContext { object PersistentObject(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IReadContext.cs0000644000175000017500000000210111700531646027444 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Marshall { /// /// this interface is passed to internal class /// Db4objects.Db4o.Typehandlers.ITypeHandler4 /// /// when instantiating objects. /// public interface IReadContext : IContext, IReadBuffer { /// /// Interprets the current position in the context as /// an ID and returns the object with this ID. /// /// /// Interprets the current position in the context as /// an ID and returns the object with this ID. /// /// the object object ReadObject(); /// /// reads sub-objects, in cases where the /// Db4objects.Db4o.Typehandlers.ITypeHandler4 /// /// is known. /// object ReadObject(ITypeHandler4 handler); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IBufferContext.cs0000644000175000017500000000040611700531646030010 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Marshall { /// public interface IBufferContext : IReadBuffer, IContext { IReadBuffer Buffer(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IReservedBuffer.cs0000644000175000017500000000157311700531646030151 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Marshall { /// a reserved buffer within a write buffer. /// /// a reserved buffer within a write buffer. /// The usecase this class was written for: A null bitmap should be at the /// beginning of a slot to allow lazy processing. During writing the content /// of the null bitmap is not yet fully known until all members are processed. /// With the Reservedbuffer the space in the slot can be occupied and writing /// can happen after all members are processed. /// public interface IReservedBuffer { /// writes a byte array to the reserved buffer. /// writes a byte array to the reserved buffer. /// the byte array. void WriteBytes(byte[] bytes); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IReadBuffer.cs0000644000175000017500000000330511700531646027240 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Marshall { /// /// a buffer interface with methods to read and to position /// the read pointer in the buffer. /// /// /// a buffer interface with methods to read and to position /// the read pointer in the buffer. /// public interface IReadBuffer { /// returns the current offset in the buffer /// the offset int Offset(); BitMap4 ReadBitMap(int bitCount); /// reads a byte from the buffer. /// reads a byte from the buffer. /// the byte byte ReadByte(); /// reads an array of bytes from the buffer. /// /// reads an array of bytes from the buffer. /// The length of the array that is passed as a parameter specifies the /// number of bytes that are to be read. The passed bytes buffer parameter /// is directly filled. /// /// the byte array to read the bytes into. void ReadBytes(byte[] bytes); /// reads an int from the buffer. /// reads an int from the buffer. /// the int int ReadInt(); /// reads a long from the buffer. /// reads a long from the buffer. /// the long long ReadLong(); /// positions the read pointer at the specified position /// the desired position in the buffer void Seek(int offset); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Marshall/IWriteBuffer.cs0000644000175000017500000000162711700531646027464 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Marshall { /// a buffer interface with write methods. /// a buffer interface with write methods. public interface IWriteBuffer { /// writes a single byte to the buffer. /// writes a single byte to the buffer. /// the byte void WriteByte(byte b); /// writes an array of bytes to the buffer /// the byte array void WriteBytes(byte[] bytes); /// writes an int to the buffer. /// writes an int to the buffer. /// the int void WriteInt(int i); /// writes a long to the buffer /// the long void WriteLong(long l); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/0000755000175000017500000000000011700531646023567 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IExtObjectContainer.cs0000644000175000017500000006454311700531646027775 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4objects.Db4o.Ext { /// /// extended functionality for the /// IObjectContainer /// interface. ///

Every db4o /// IObjectContainer /// always is an ExtObjectContainer so a cast is possible.

/// ObjectContainer.ext() /// is a convenient method to perform the cast.

/// The ObjectContainer functionality is split to two interfaces to allow newcomers to /// focus on the essential methods. ///
public partial interface IExtObjectContainer : IObjectContainer { /// activates an object with the current activation strategy. /// /// activates an object with the current activation strategy. /// In regular activation mode the object will be activated to the /// global activation depth, ( see /// Db4objects.Db4o.Config.IConfiguration.ActivationDepth() /// /// ) /// and all configured settings for /// Db4objects.Db4o.Config.IObjectClass.MaximumActivationDepth(int) /// /// /// and /// Db4objects.Db4o.Config.IObjectClass.MaximumActivationDepth(int) /// /// will be respected.

/// In Transparent Activation Mode ( see /// Db4objects.Db4o.TA.TransparentActivationSupport /// /// ) /// the parameter object will only be activated, if it does not implement /// Db4objects.Db4o.TA.IActivatable /// . All referenced members that do not implement /// Db4objects.Db4o.TA.IActivatable /// will also be activated. Any /// Db4objects.Db4o.TA.IActivatable /// objects /// along the referenced graph will break cascading activation. ///
/// /// void Activate(object obj); /// deactivates an object. /// /// deactivates an object. /// Only the passed object will be deactivated, i.e, no object referenced by this /// object will be deactivated. /// /// the object to be deactivated. void Deactivate(object obj); /// backs up a database file of an open ObjectContainer. /// /// backs up a database file of an open ObjectContainer. ///

While the backup is running, the ObjectContainer can continue to be /// used. Changes that are made while the backup is in progress, will be applied to /// the open ObjectContainer and to the backup.

/// While the backup is running, the ObjectContainer should not be closed.

/// If a file already exists at the specified path, it will be overwritten.

/// The /// Db4objects.Db4o.IO.IStorage /// used for backup is the one configured for this container. ///
/// a fully qualified path /// db4o database file was closed or failed to open. /// /// /// is thrown when the operation is not supported in current /// configuration/environment /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// void Backup(string path); /// backs up a database file of an open ObjectContainer. /// /// backs up a database file of an open ObjectContainer. ///

While the backup is running, the ObjectContainer can continue to be /// used. Changes that are made while the backup is in progress, will be applied to /// the open ObjectContainer and to the backup.

/// While the backup is running, the ObjectContainer should not be closed.

/// If a file already exists at the specified path, it will be overwritten.

/// This method is intended for cross-storage backups, i.e. backup from an in-memory /// database to a file. ///
/// /// the /// Db4objects.Db4o.IO.IStorage /// to be used for backup /// /// a fully qualified path /// db4o database file was closed or failed to open. /// /// /// is thrown when the operation is not supported in current /// configuration/environment /// /// I/O operation failed or was unexpectedly interrupted. /// /// /// void Backup(IStorage targetStorage, string path); /// binds an object to an internal object ID. /// /// binds an object to an internal object ID. ///

This method uses the ID parameter to load the /// corresponding stored object into memory and replaces this memory /// reference with the object parameter. The method may be used to replace /// objects or to reassociate an object with it's stored instance /// after closing and opening a database file. A subsequent call to /// set(Object) /// is /// necessary to update the stored object.

/// Requirements:
- The ID needs to be a valid internal object ID, /// previously retrieved with /// getID(Object) /// .
/// - The object parameter needs to be of the same class as the stored object.

///
/// GetID(object) /// the object that is to be bound /// the internal id the object is to be bound to /// db4o database file was closed or failed to open. /// /// /// when the provided id is outside the scope of the /// database IDs. /// /// /// void Bind(object obj, long id); /// returns the Configuration context for this ObjectContainer. /// /// returns the Configuration context for this ObjectContainer. ///

/// Upon opening an ObjectContainer with any of the factory methods in the /// Db4o class /// , the global /// IConfiguration /// context /// is copied into the ObjectContainer. The /// IConfiguration /// can be modified individually for /// each ObjectContainer without any effects on the global settings.

///
/// /// /// IConfiguration /// the Configuration /// context for this ObjectContainer /// /// Db4objects.Db4o.Db4oFactory.Configure() /// IConfiguration Configure(); /// returns a member at the specific path without activating intermediate objects. /// /// /// returns a member at the specific path without activating intermediate objects. ///

/// This method allows navigating from a persistent object to it's members in a /// performant way without activating or instantiating intermediate objects. ///
/// the parent object that is to be used as the starting point. /// an array of field names to navigate by /// the object at the specified path or null if no object is found object Descend(object obj, string[] path); /// returns the stored object for an internal ID. /// /// returns the stored object for an internal ID. ///

This is the fastest method for direct access to objects. Internal /// IDs can be obtained with /// getID(Object) /// . /// Objects will not be activated by this method. They will be returned in the /// activation state they are currently in, in the local cache.

/// Passing invalid id values to this method may result in all kinds of /// exceptions being thrown. OutOfMemoryError and arithmetic exceptions /// may occur. If an application is known to use invalid IDs, it is /// recommended to call this method within a catch-all block. ///
/// the internal ID /// /// the object associated with the passed ID or null, /// if no object is associated with this ID in this ObjectContainer. /// /// Why activation? /// /// db4o database file was closed or failed to open. /// /// /// when the provided id is outside the scope of the /// file length. /// /// /// object GetByID(long Id); /// /// returns a stored object for a /// Db4oUUID /// . ///

/// This method is intended for replication and for long-term /// external references to objects. To get a /// Db4oUUID /// for an /// object use /// GetObjectInfo(object) /// and /// IObjectInfo.GetUUID() /// .

/// Objects will not be activated by this method. They will be returned in the /// activation state they are currently in, in the local cache.

///
/// the UUID /// the object for the UUID /// Why activation? /// /// I/O operation failed or was unexpectedly interrupted. /// /// db4o database file was closed or failed to open. /// /// /// object GetByUUID(Db4oUUID uuid); /// returns the internal unique object ID. /// /// returns the internal unique object ID. ///

db4o assigns an internal ID to every object that is stored. IDs are /// guaranteed to be unique within one ObjectContainer. /// An object carries the same ID in every db4o session. Internal IDs can /// be used to look up objects with the very fast /// getByID /// method.

/// Internal IDs will change when a database is defragmented. Use /// GetObjectInfo(object) /// , /// IObjectInfo.GetUUID() /// and /// GetByUUID(Db4oUUID) /// for long-term external references to /// objects.

///
/// any object /// /// the associated internal ID or 0, if the passed /// object is not stored in this ObjectContainer. /// long GetID(object obj); /// /// returns the /// IObjectInfo /// for a stored object. ///

This method will return null, if the passed /// object is not stored to this ObjectContainer.

///
/// the stored object /// /// the /// IObjectInfo /// /// IObjectInfo GetObjectInfo(object obj); /// returns the Db4oDatabase object for this ObjectContainer. /// returns the Db4oDatabase object for this ObjectContainer. /// the Db4oDatabase identity object for this ObjectContainer. Db4oDatabase Identity(); /// tests if an object is activated. /// /// tests if an object is activated. ///

isActive returns false if an object is not /// stored within the ObjectContainer.

///
/// to be tested

/// true if the passed object is active. bool IsActive(object obj); /// tests if an object with this ID is currently cached. /// /// tests if an object with this ID is currently cached. ///

///
/// the internal ID bool IsCached(long Id); /// tests if this ObjectContainer is closed. /// /// tests if this ObjectContainer is closed. ///

///
/// true if this ObjectContainer is closed. bool IsClosed(); /// tests if an object is stored in this ObjectContainer. /// /// tests if an object is stored in this ObjectContainer. ///

///
/// to be tested

/// true if the passed object is stored. /// db4o database file was closed or failed to open. /// /// bool IsStored(object obj); /// /// returns all class representations that are known to this /// ObjectContainer because they have been used or stored. /// /// /// returns all class representations that are known to this /// ObjectContainer because they have been used or stored. /// /// /// all class representations that are known to this /// ObjectContainer because they have been used or stored. /// IReflectClass[] KnownClasses(); /// returns the main synchronization lock. /// /// returns the main synchronization lock. ///

/// Synchronize over this object to ensure exclusive access to /// the ObjectContainer.

/// Handle the use of this functionality with extreme care, /// since deadlocks can be produced with just two lines of code. ///
/// Object the ObjectContainer lock object object Lock(); /// opens a new ObjectContainer on top of this ObjectContainer. /// /// opens a new ObjectContainer on top of this ObjectContainer. /// The ObjectContainer will have it's own transaction and /// it's own reference system. /// /// the new ObjectContainer session. /// 8.0 IObjectContainer OpenSession(); /// /// returns a transient copy of a persistent object with all members set /// to the values that are currently stored to the database. /// /// /// returns a transient copy of a persistent object with all members set /// to the values that are currently stored to the database. ///

/// The returned objects have no connection to the database.

/// With the committed parameter it is possible to specify, /// whether the desired object should contain the committed values or the /// values that were set by the running transaction with /// Db4objects.Db4o.IObjectContainer.Store(object) /// /// . ///

A possible use case for this feature:
/// An application might want to check all changes applied to an object /// by the running transaction.

///
/// the object that is to be cloned /// the member depth to which the object is to be instantiated /// whether committed or set values are to be returned /// the object object PeekPersisted(object @object, int depth, bool committed); /// unloads all clean indices from memory and frees unused objects. /// /// unloads all clean indices from memory and frees unused objects. ///

Call commit() and purge() consecutively to achieve the best /// result possible. This method can have a negative impact /// on performance since indices will have to be reread before further /// inserts, updates or queries can take place. ///
void Purge(); /// unloads a specific object from the db4o reference mechanism. /// /// unloads a specific object from the db4o reference mechanism. ///

db4o keeps references to all newly stored and /// instantiated objects in memory, to be able to manage object identities. ///

With calls to this method it is possible to remove an object from the /// reference mechanism, to allow it to be garbage collected. You are not required to /// call this method in the .NET and JDK 1.2 versions, since objects are /// referred to by weak references and garbage collection happens /// automatically.

An object removed with purge(Object) is not /// "known" to the ObjectContainer afterwards, so this method may also be /// used to create multiple copies of objects.

purge(Object) has /// no influence on the persistence state of objects. "Purged" objects can be /// reretrieved with queries.

///
/// the object to be removed from the reference mechanism. void Purge(object obj); /// Return the reflector currently being used by db4objects. /// Return the reflector currently being used by db4objects. /// the current Reflector. GenericReflector Reflector(); /// refreshs all members on a stored object to the specified depth. /// /// refreshs all members on a stored object to the specified depth. ///

If a member object is not activated, it will be activated by this method. ///

The isolation used is READ COMMITTED. This method will read all objects /// and values that have been committed by other transactions.

///
/// the object to be refreshed. /// /// the member /// depth /// to which refresh is to cascade. /// void Refresh(object obj, int depth); /// releases a semaphore, if the calling transaction is the owner. /// releases a semaphore, if the calling transaction is the owner. /// the name of the semaphore to be released. void ReleaseSemaphore(string name); /// deep update interface to store or update objects. /// /// deep update interface to store or update objects. ///

In addition to the normal storage interface, /// ObjectContainer#set(Object) /// , /// this method allows a manual specification of the depth, the passed object is to be updated.

///
/// the object to be stored or updated. /// the depth to which the object is to be updated /// com.db4o.ObjectContainer#set void Store(object obj, int depth); /// attempts to set a semaphore. /// /// attempts to set a semaphore. ///

/// Semaphores are transient multi-purpose named flags for /// ObjectContainers /// . ///

/// A transaction that successfully sets a semaphore becomes /// the owner of the semaphore. Semaphores can only be owned /// by a single transaction at one point in time.

/// This method returns true, if the transaction already owned /// the semaphore before the method call or if it successfully /// acquires ownership of the semaphore.

/// The waitForAvailability parameter allows to specify a time /// in milliseconds to wait for other transactions to release /// the semaphore, in case the semaphore is already owned by /// another transaction.

/// Semaphores are released by the first occurrence of one of the /// following:
/// - the transaction releases the semaphore with /// ReleaseSemaphore(string) ///
- the transaction is closed with /// Db4objects.Db4o.IObjectContainer.Close() /// ///
- C/S only: the corresponding /// Db4objects.Db4o.IObjectServer /// is /// closed.
- C/S only: the client /// Db4objects.Db4o.IObjectContainer /// looses the connection and is timed /// out.

Semaphores are set immediately. They are independant of calling /// Db4objects.Db4o.IObjectContainer.Commit() /// /// or /// Db4objects.Db4o.IObjectContainer.Rollback() /// /// .

Possible use cases /// for semaphores:
- prevent other clients from inserting a singleton at the same time. /// A suggested name for the semaphore: "SINGLETON_" + Object#getClass().getName().
- lock /// objects. A suggested name: "LOCK_" + /// getID(Object) ///
- /// generate a unique client ID. A suggested name: "CLIENT_" + /// System.currentTimeMillis().

///
/// the name of the semaphore to be set /// /// the time in milliseconds to wait for other /// transactions to release the semaphore. The parameter may be zero, if /// the method is to return immediately. /// /// /// boolean flag ///
true, if the semaphore could be set or if the /// calling transaction already owned the semaphore. ///
false, if the semaphore is owned by another /// transaction. ///
bool SetSemaphore(string name, int waitForAvailability); /// /// returns a /// IStoredClass /// meta information object. ///

/// There are three options how to use this method.
/// Any of the following parameters are possible:
/// - a fully qualified class name.
/// - a Class object.
/// - any object to be used as a template.

///
/// class name, Class object, or example object.

/// /// an instance of an /// IStoredClass /// meta information object. /// IStoredClass StoredClass(object clazz); /// /// returns an array of all /// IStoredClass /// meta information objects. /// IStoredClass[] StoredClasses(); /// /// returns the /// ISystemInfo /// for this ObjectContainer. ///

The /// ISystemInfo /// supplies methods that provide /// information about system state and system settings of this /// ObjectContainer. ///
/// /// the /// ISystemInfo /// for this ObjectContainer. /// ISystemInfo SystemInfo(); /// returns the current transaction serial number. /// /// returns the current transaction serial number. ///

This serial number can be used to query for modified objects /// and for replication purposes. ///
/// the current transaction serial number. long Version(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/InvalidSlotException.cs0000644000175000017500000000253411700531646030231 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when db4o reads slot /// information which is not valid (length or address). ///
/// /// db4o-specific exception.

/// This exception is thrown when db4o reads slot /// information which is not valid (length or address). ///
[System.Serializable] public class InvalidSlotException : Db4oRecoverableException { /// Constructor allowing to specify a detailed message. /// Constructor allowing to specify a detailed message. /// message public InvalidSlotException(string msg) : base(msg) { } /// Constructor allowing to specify the address, length and id. /// Constructor allowing to specify the address, length and id. /// offending address /// offending length /// id where the address and length were read. public InvalidSlotException(int address, int length, int id) : base("address: " + address + ", length : " + length + ", id : " + id) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/EmergencyShutdownReadOnlyException.cs0000644000175000017500000000101111700531646033076 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// A previous IO exception has switched the database file /// to read-only mode for controlled shutdown. /// /// /// A previous IO exception has switched the database file /// to read-only mode for controlled shutdown. /// [System.Serializable] public class EmergencyShutdownReadOnlyException : Db4oIOException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IStoredField.cs0000644000175000017500000000663411700531646026444 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Ext { /// the internal representation of a field on a stored class. /// the internal representation of a field on a stored class. public interface IStoredField { /// creates an index on this field at runtime. /// creates an index on this field at runtime. void CreateIndex(); /// drops an existing index on this field at runtime. /// drops an existing index on this field at runtime. void DropIndex(); /// returns the field value on the passed object. /// /// returns the field value on the passed object. ///

This method will also work, if the field is not present in the current /// version of the class. ///

It is recommended to use this method for refactoring purposes, if fields /// are removed and the field values need to be copied to other fields. ///
object Get(object onObject); /// returns the name of the field. /// returns the name of the field. string GetName(); /// returns the Class (Java) / Type (.NET) of the field. /// /// returns the Class (Java) / Type (.NET) of the field. ///

For array fields this method will return the type of the array. /// Use /// IsArray() /// to detect arrays. ///
IReflectClass GetStoredType(); /// returns true if the field is an array. /// returns true if the field is an array. bool IsArray(); /// modifies the name of this stored field. /// /// modifies the name of this stored field. ///

After renaming one or multiple fields the ObjectContainer has /// to be closed and reopened to allow internal caches to be refreshed.

///
/// the new name void Rename(string name); /// /// specialized highspeed API to collect all values of a field for all instances /// of a class, if the field is indexed. /// /// /// specialized highspeed API to collect all values of a field for all instances /// of a class, if the field is indexed. ///

The field values will be taken directly from the index without the /// detour through class indexes or object instantiation. ///

/// If this method is used to get the values of a first class object index, /// deactivated objects will be passed to the visitor. ///
/// the visitor to be called with each index value. void TraverseValues(IVisitor4 visitor); /// Returns whether this field has an index or not. /// Returns whether this field has an index or not. /// true if this field has an index. bool HasIndex(); // will need for replication. Requested for 3.0 // // /** // * sets the field value on the passed object. // * @param onObject // * @param fieldValue // */ // public void set(Object onObject, Object fieldValue); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oException.cs0000644000175000017500000000361411700531646026571 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Ext { /// /// db4o exception wrapper: Exceptions occurring during internal processing /// will be proliferated to the client calling code encapsulated in an exception /// of this type. /// /// /// db4o exception wrapper: Exceptions occurring during internal processing /// will be proliferated to the client calling code encapsulated in an exception /// of this type. The original exception, if any, is available through /// Db4oException#getCause(). /// [System.Serializable] public class Db4oException : Exception { /// Simple constructor public Db4oException() : this(null, null) { } /// Constructor with an exception message specified /// exception message public Db4oException(string msg) : this(msg, null) { } /// Constructor with an exception cause specified /// exception cause public Db4oException(Exception cause) : this(null, cause) { } /// /// Constructor with an exception message selected /// from the internal message collection. /// /// /// Constructor with an exception message selected /// from the internal message collection. /// /// internal db4o message number public Db4oException(int messageConstant) : this(Db4objects.Db4o.Internal.Messages .Get(messageConstant)) { } /// Constructor with an exception message and cause specified /// exception message /// exception cause public Db4oException(string msg, Exception cause) : base(msg, cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IObjectInfoCollection.cs0000644000175000017500000000073411700531646030271 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Ext { /// /// Interface to an iterable collection /// IObjectInfo /// objects.

/// ObjectInfoCollection is used reference a number of stored objects. ///
/// IObjectInfo public interface IObjectInfoCollection : IEnumerable { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oUnexpectedException.cs0000644000175000017500000000064711700531646030621 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Ext { /// Unexpected fatal error is encountered. /// Unexpected fatal error is encountered. [System.Serializable] public class Db4oUnexpectedException : Exception { public Db4oUnexpectedException(Exception cause) : base(cause.Message, cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/CompositeDb4oException.cs0000644000175000017500000000054311700531646030452 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Ext { [System.Serializable] public partial class CompositeDb4oException : Exception { public readonly Exception[] _exceptions; public CompositeDb4oException(Exception[] exceptions) { _exceptions = exceptions; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/DatabaseMaximumSizeReachedException.cs0000644000175000017500000000160511700531646033150 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when the database file reaches the /// maximum allowed size. ///
/// /// db4o-specific exception.

/// This exception is thrown when the database file reaches the /// maximum allowed size. Upon throwing the exception the database is /// switched to the read-only mode.
/// The maximum database size is configurable /// and can reach up to 254GB. ///
/// Db4objects.Db4o.Config.IConfiguration.BlockSize(int) /// [System.Serializable] public class DatabaseMaximumSizeReachedException : Db4oRecoverableException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IDb4oCallback.cs0000644000175000017500000000062211700531646026434 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Ext { /// generic callback interface. /// generic callback interface. public interface IDb4oCallback { /// the callback method /// the object passed to the callback method void Callback(object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/DatabaseFileLockedException.cs0000644000175000017500000000264211700531646031427 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// this Exception is thrown during any of the db4o open calls /// if the database file is locked by another process. ///
/// /// db4o-specific exception.

/// this Exception is thrown during any of the db4o open calls /// if the database file is locked by another process. ///
/// Db4objects.Db4o.Db4oFactory.OpenFile(string) /// [System.Serializable] public class DatabaseFileLockedException : Db4oFatalException { /// Constructor with a database description message /// message, which can help to identify the database /// public DatabaseFileLockedException(string databaseDescription) : base(databaseDescription ) { } /// Constructor with a database description and cause exception /// database description /// previous exception caused DatabaseFileLockedException public DatabaseFileLockedException(string databaseDescription, Exception cause) : base(databaseDescription, cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oRecoverableException.cs0000644000175000017500000000116611700531646030743 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { [System.Serializable] public class Db4oRecoverableException : Db4oException { public Db4oRecoverableException() : base() { } public Db4oRecoverableException(int messageConstant) : base(messageConstant) { } public Db4oRecoverableException(string msg, Exception cause) : base(msg, cause) { } public Db4oRecoverableException(string msg) : base(msg) { } public Db4oRecoverableException(Exception cause) : base(cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oUUID.cs0000644000175000017500000000637111700531646025404 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Text; namespace Db4objects.Db4o.Ext { /// a unique universal identify for an object. /// /// a unique universal identify for an object.

The db4o UUID consists of /// two parts:
- an indexed long for fast access,
- the signature of the /// IObjectContainer /// the object was created with. ///

Db4oUUIDs are valid representations of objects over multiple /// ObjectContainers ///
public class Db4oUUID { private readonly long longPart; private readonly byte[] signaturePart; /// constructs a Db4oUUID from a long part and a signature part /// the long part /// the signature part public Db4oUUID(long longPart_, byte[] signaturePart_) { longPart = longPart_; signaturePart = signaturePart_; } /// returns the long part of this UUID. /// /// returns the long part of this UUID.

To uniquely identify an object /// universally, db4o uses an indexed long and a reference to the /// Db4oDatabase object it was created on. ///
/// the long part of this UUID. public virtual long GetLongPart() { return longPart; } /// returns the signature part of this UUID. /// /// returns the signature part of this UUID.



To uniquely /// identify an object universally, db4o uses an indexed long and a reference to /// the Db4oDatabase singleton object of the /// IObjectContainer /// it was created on. This method /// returns the signature of the Db4oDatabase object of the ObjectContainer: the /// signature of the origin ObjectContainer. ///
/// the signature of the Db4oDatabase for this UUID. public virtual byte[] GetSignaturePart() { return signaturePart; } public override bool Equals(object o) { if (this == o) { return true; } if (o == null || GetType() != o.GetType()) { return false; } Db4objects.Db4o.Ext.Db4oUUID other = (Db4objects.Db4o.Ext.Db4oUUID)o; if (longPart != other.longPart) { return false; } if (signaturePart == null) { return other.signaturePart == null; } if (signaturePart.Length != other.signaturePart.Length) { return false; } for (int i = 0; i < signaturePart.Length; i++) { if (signaturePart[i] != other.signaturePart[i]) { return false; } } return true; } public override int GetHashCode() { return (int)(longPart ^ ((longPart) >> (32 & 0x1f))); } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append(GetType().FullName); sb.Append(" sig: "); for (int i = 0; i < signaturePart.Length; i++) { char c = (char)signaturePart[i]; sb.Append(c); } sb.Append(" long: "); sb.Append(longPart); return sb.ToString(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Status.cs0000644000175000017500000000103111700531646025374 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Ext { /// Static constants to describe the status of objects. /// Static constants to describe the status of objects. public class Status { public const double Unused = -1.0; public const double Available = -2.0; public const double Queued = -3.0; public const double Completed = -4.0; public const double Processing = -5.0; public const double Error = -99.0; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/BackupInProgressException.cs0000644000175000017500000000103511700531646031215 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// db4o-specific exception. /// /// db4o-specific exception.

/// This exception is thrown when the current /// backup /// process encounters another backup process already running. ///
[System.Serializable] public class BackupInProgressException : Db4oRecoverableException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IExtObjectServer.cs0000644000175000017500000000652711700531646027317 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Ext { /// extended functionality for the ObjectServer interface. /// /// extended functionality for the ObjectServer interface. ///

Every ObjectServer also always is an ExtObjectServer /// so a cast is possible.

/// Db4objects.Db4o.IObjectServer.Ext() /// /// is a convenient method to perform the cast.

/// The functionality is split to two interfaces to allow newcomers to /// focus on the essential methods. ///
public interface IExtObjectServer : IObjectServer { /// backs up the database file used by the ObjectServer. /// /// backs up the database file used by the ObjectServer. ///

While the backup is running, the ObjectServer can continue to be /// used. Changes that are made while the backup is in progress, will be applied to /// the open ObjectServer and to the backup.

/// While the backup is running, the ObjectContainer should not be closed.

/// If a file already exists at the specified path, it will be overwritten.

///
/// a fully qualified path /// void Backup(string path); /// returns the number of connected clients. /// returns the number of connected clients. int ClientCount(); /// /// returns the /// Db4objects.Db4o.Config.IConfiguration /// /// context for this ObjectServer. ///

/// Upon opening an ObjectServer with any of the factory methods in the /// Db4objects.Db4o.Db4oFactory /// class, the global /// Db4objects.Db4o.Config.IConfiguration /// /// context /// is copied into the ObjectServer. The /// Db4objects.Db4o.Config.IConfiguration /// /// can be modified individually for /// each ObjectServer without any effects on the global settings.

///
/// the Configuration context for this ObjectServer /// Db4objects.Db4o.Db4oFactory.Configure() /// IConfiguration Configure(); /// returns the ObjectContainer used by the server. /// /// returns the ObjectContainer used by the server. ///

///
/// the ObjectContainer used by the server IObjectContainer ObjectContainer(); /// removes client access permissions for the specified user. /// /// removes client access permissions for the specified user. ///

///
/// the name of the user void RevokeAccess(string userName); /// The local port this server uses, 0 if disconnected or in embedded mode int Port(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IncompatibleFileFormatException.cs0000644000175000017500000000140211700531646032351 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when the database file format /// is not compatible with the applied configuration. ///
/// /// db4o-specific exception.

/// This exception is thrown when the database file format /// is not compatible with the applied configuration. ///
[System.Serializable] public class IncompatibleFileFormatException : Db4oFatalException { public IncompatibleFileFormatException() : base() { } public IncompatibleFileFormatException(string message) : base(message) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oFileHeaderCorruptionException.cs0000644000175000017500000000035511700531646032566 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { [System.Serializable] public class Db4oFileHeaderCorruptionException : Db4oFatalException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IExtClient.cs0000644000175000017500000000171211700531646026127 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// extended client functionality for the /// IExtObjectContainer /// interface. ///

Both /// Db4o.openClient() /// /// methods always /// return an ExtClient object so a cast is possible.

/// The ObjectContainer functionality is split into multiple interfaces to allow newcomers to /// focus on the essential methods. ///
public interface IExtClient : IExtObjectContainer { /// checks if the client is currently connected to a server. /// checks if the client is currently connected to a server. /// true if the client is alive. bool IsAlive(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IObjectCallbacks.cs0000644000175000017500000001110711700531646027235 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Ext { /// callback methods. /// /// callback methods. ///

/// This interface only serves as a list of all available callback methods. /// Every method is called individually, independantly of implementing this interface.

/// Using callbacks
/// Simply implement one or more of the listed methods in your application classes to /// do tasks before activation, deactivation, delete, new or update, to cancel the /// action about to be performed and to respond to the performed task. ///

Callback methods are typically used for: ///
- cascaded delete ///
- cascaded update ///
- cascaded activation ///
- restoring transient members on instantiation ///

Callback methods follow regular calling conventions. Methods in superclasses /// need to be called explicitely. ///

All method calls are implemented to occur only once, upon one event. ///
public interface IObjectCallbacks { /// called before an Object is activated. /// called before an Object is activated. /// the ObjectContainer the object is stored in. /// /// false to prevent activation. bool ObjectCanActivate(IObjectContainer container); /// called before an Object is deactivated. /// called before an Object is deactivated. /// the ObjectContainer the object is stored in. /// /// false to prevent deactivation. bool ObjectCanDeactivate(IObjectContainer container); /// called before an Object is deleted. /// /// called before an Object is deleted. ///

In a client/server setup this callback method will be executed on /// the server. ///
/// the ObjectContainer the object is stored in. /// /// false to prevent the object from being deleted. bool ObjectCanDelete(IObjectContainer container); /// called before an Object is stored the first time. /// called before an Object is stored the first time. /// the ObjectContainer is about to be stored to. /// /// false to prevent the object from being stored. bool ObjectCanNew(IObjectContainer container); /// called before a persisted Object is updated. /// called before a persisted Object is updated. /// the ObjectContainer the object is stored in. /// /// false to prevent the object from being updated. bool ObjectCanUpdate(IObjectContainer container); /// called upon activation of an object. /// called upon activation of an object. /// the ObjectContainer the object is stored in. /// void ObjectOnActivate(IObjectContainer container); /// called upon deactivation of an object. /// called upon deactivation of an object. /// the ObjectContainer the object is stored in. /// void ObjectOnDeactivate(IObjectContainer container); /// called after an object was deleted. /// /// called after an object was deleted. ///

In a client/server setup this callback method will be executed on /// the server. ///
/// the ObjectContainer the object was stored in. /// void ObjectOnDelete(IObjectContainer container); /// called after a new object was stored. /// called after a new object was stored. /// the ObjectContainer the object is stored to. /// void ObjectOnNew(IObjectContainer container); /// called after an object was updated. /// called after an object was updated. /// the ObjectContainer the object is stored in. /// void ObjectOnUpdate(IObjectContainer container); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/OldFormatException.cs0000644000175000017500000000143111700531646027663 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when an old file format was detected /// and /// Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates(bool) /// /// is set to false. ///
[System.Serializable] public class OldFormatException : Db4oFatalException { /// Constructor with the default message. /// Constructor with the default message. public OldFormatException() : base(Db4objects.Db4o.Internal.Messages.OldDatabaseFormat ) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/VirtualField.cs0000644000175000017500000000153311700531646026512 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Ext { /// intended for future virtual fields on classes. /// /// intended for future virtual fields on classes. Currently only /// the constant for the virtual version field is found here. /// /// public class VirtualField { /// /// the field name of the virtual version field, to be used /// for querying. /// /// /// the field name of the virtual version field, to be used /// for querying. /// public static readonly string Version = Const4.VirtualFieldPrefix + "version"; public static readonly string CommitTimestamp = Const4.VirtualFieldPrefix + "commitTimestamp"; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/DatabaseClosedException.cs0000644000175000017500000000133611700531646030636 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// db4o-specific exception. /// /// db4o-specific exception.

/// This exception is thrown when the object container required for /// the current operation was closed or failed to open. ///
/// Db4objects.Db4o.Db4oFactory.OpenFile(string) /// /// Db4objects.Db4o.IObjectContainer.Close() /// [System.Serializable] public class DatabaseClosedException : Db4oFatalException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/InvalidIDException.cs0000644000175000017500000000234311700531646027602 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when the supplied object ID /// is incorrect (outside the scope of the database IDs). ///
/// /// db4o-specific exception.

/// This exception is thrown when the supplied object ID /// is incorrect (outside the scope of the database IDs). ///
/// IExtObjectContainer.Bind(object, long) /// /// IExtObjectContainer.GetByID(long) /// [System.Serializable] public class InvalidIDException : Db4oRecoverableException { /// Constructor allowing to specify the exception cause /// cause exception public InvalidIDException(Exception cause) : base(cause) { } /// Constructor allowing to specify the offending id /// the offending id public InvalidIDException(int id) : base("id: " + id) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IExtObjectSet.cs0000644000175000017500000000314611700531646026576 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o.Ext { /// /// extended functionality for the /// IObjectSet /// interface. ///

Every db4o /// IObjectSet /// always is an ExtObjectSet so a cast is possible.

/// Db4objects.Db4o.IObjectSet.Ext() /// is a convenient method to perform the cast.

/// The ObjectSet functionality is split to two interfaces to allow newcomers to /// focus on the essential methods. ///
public interface IExtObjectSet : IObjectSet { /// returns an array of internal IDs that correspond to the contained objects. /// /// /// returns an array of internal IDs that correspond to the contained objects. ///

///
/// IExtObjectContainer.GetID(object) /// /// IExtObjectContainer.GetByID(long) /// long[] GetIDs(); /// returns the item at position [index] in this ObjectSet. /// /// returns the item at position [index] in this ObjectSet. ///

/// The object will be activated. ///
/// the index position in this ObjectSet. /// the activated object. object Get(int index); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oIOException.cs0000644000175000017500000000173011700531646027016 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when a system IO exception /// is encounted by db4o process. ///
/// /// db4o-specific exception.

/// This exception is thrown when a system IO exception /// is encounted by db4o process. ///
[System.Serializable] public class Db4oIOException : Db4oFatalException { /// Constructor. /// Constructor. public Db4oIOException() : base() { } public Db4oIOException(string message) : base(message) { } /// Constructor allowing to specify the causing exception /// exception cause public Db4oIOException(Exception cause) : base(cause.Message, cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IObjectInfo.cs0000644000175000017500000000700211700531646026250 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// interface to the internal reference that an ObjectContainer /// holds for a stored object. /// /// /// interface to the internal reference that an ObjectContainer /// holds for a stored object. /// public interface IObjectInfo { /// returns the internal db4o ID. /// returns the internal db4o ID. long GetInternalID(); /// returns the object that is referenced. /// /// returns the object that is referenced. ///

This method may return null, if the object has /// been garbage collected. ///
/// /// the referenced object or null, if the object has /// been garbage collected. /// object GetObject(); /// returns a UUID representation of the referenced object. /// /// returns a UUID representation of the referenced object. /// UUID generation has to be turned on, in order to be able /// to use this feature: /// Db4objects.Db4o.Config.IConfiguration.GenerateUUIDs(Db4objects.Db4o.Config.ConfigScope) /// /// /// the UUID of the referenced object. Db4oUUID GetUUID(); /// /// returns the transaction serial number ("version") the referenced object /// was stored with last. /// /// /// returns the transaction serial number ("version") the referenced object /// was stored with last. Version number generation has to be turned on, in /// order to be able to use this feature: /// Db4objects.Db4o.Config.IConfiguration.GenerateVersionNumbers(Db4objects.Db4o.Config.ConfigScope) /// ///
/// This feature was replaced by /// GetCommitTimestamp() /// . The main /// difference is that the old version mechamism used to assign a serial /// timestamp to the object upon storing time, and the new commiTimestamp /// approach, assigns it upon commit time.
///
/// the version number. [System.ObsoleteAttribute(@"As of version 8.0 please use GetCommitTimestamp() instead." )] long GetVersion(); /// /// The serial timestamp the object is assigned to when it is commited.
///
/// You need to enable this feature before using it in /// Db4objects.Db4o.Config.IFileConfiguration.GenerateCommitTimestamps(bool) /// .
///
/// All the objects commited within the same transaction will receive the same commitTimestamp.
///
/// db4o replication system (dRS) relies on this feature.
///
/// the serial timestamp that was given to the object upon commit. /// Db4objects.Db4o.Config.IFileConfiguration.GenerateCommitTimestamps(bool) /// 8.0 long GetCommitTimestamp(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/DatabaseReadOnlyException.cs0000644000175000017500000000126111700531646031137 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when a write operation is attempted /// on a database in a read-only mode. ///
/// /// db4o-specific exception.

/// This exception is thrown when a write operation is attempted /// on a database in a read-only mode. ///
/// [System.Serializable] public class DatabaseReadOnlyException : Db4oRecoverableException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/ISystemInfo.cs0000644000175000017500000000317611700531646026336 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Ext { /// provides information about system state and system settings. /// provides information about system state and system settings. public interface ISystemInfo { /// returns the number of entries in the Freespace Manager. /// /// returns the number of entries in the Freespace Manager. ///

A high value for the number of freespace entries /// is an indication that the database is fragmented and /// that defragment should be run. ///
/// the number of entries in the Freespace Manager. int FreespaceEntryCount(); /// returns the freespace size in the database in bytes. /// /// returns the freespace size in the database in bytes. ///

When db4o stores modified objects, it allocates /// a new slot for it. During commit the old slot is freed. /// Free slots are collected in the freespace manager, so /// they can be reused for other objects. ///

This method returns a sum of the size of all /// free slots in the database file. ///

To reclaim freespace run defragment. ///
/// the freespace size in the database in bytes. long FreespaceSize(); /// Returns the total size of the database on disk. /// Returns the total size of the database on disk. /// total size of database on disk long TotalSize(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/ObjectNotStorableException.cs0000644000175000017500000000201011700531646031351 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Ext { /// /// this Exception is thrown, if objects can not be stored and if /// db4o is configured to throw Exceptions on storage failures. /// /// /// this Exception is thrown, if objects can not be stored and if /// db4o is configured to throw Exceptions on storage failures. /// /// Db4objects.Db4o.Config.IConfiguration.ExceptionsOnNotStorable(bool) [System.Serializable] public class ObjectNotStorableException : Db4oRecoverableException { public ObjectNotStorableException(IReflectClass a_class) : base(Db4objects.Db4o.Internal.Messages .Get(a_class.IsPrimitive() ? 59 : 45, a_class.GetName())) { } public ObjectNotStorableException(string message) : base(message) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/UnsupportedOldFormatException.cs0000644000175000017500000000077711700531646032150 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// This exception is thrown while reading old database /// files for which support has been dropped. /// /// /// This exception is thrown while reading old database /// files for which support has been dropped. /// [System.Serializable] public class UnsupportedOldFormatException : Db4oFatalException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oDatabase.cs0000644000175000017500000001653011700531646026340 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Query; using Db4objects.Db4o.Types; using Sharpen; namespace Db4objects.Db4o.Ext { /// Class to identify a database by it's signature. /// /// Class to identify a database by it's signature. ///

db4o UUID handling uses a reference to the Db4oDatabase object, that /// represents the database an object was created on. ///
/// /// public class Db4oDatabase : IDb4oType, IInternal4 { public static readonly Db4objects.Db4o.Ext.Db4oDatabase StaticIdentity = Debug4.staticIdentity ? new Db4objects.Db4o.Ext.Db4oDatabase(new byte[] { (byte)'d', (byte)'e', (byte )'b', (byte)'u', (byte)'g' }, 1) : null; public const int StaticId = -1; /// Field is public for implementation reasons, DO NOT TOUCH! public byte[] i_signature; /// /// Field is public for implementation reasons, DO NOT TOUCH! /// This field is badly named, it really is the creation time. /// /// /// Field is public for implementation reasons, DO NOT TOUCH! /// This field is badly named, it really is the creation time. /// public long i_uuid; private static readonly string CreationtimeField = "i_uuid"; /// cached ObjectContainer for getting the own ID. /// cached ObjectContainer for getting the own ID. [System.NonSerialized] private ObjectContainerBase i_stream; /// cached ID, only valid in combination with i_objectContainer [System.NonSerialized] private int i_id; /// constructor for persistence public Db4oDatabase() { } /// constructor for comparison and to store new ones public Db4oDatabase(byte[] signature, long creationTime) { // TODO: change to _creationTime with PersistentFormatUpdater // FIXME: make sure signature is null i_signature = signature; i_uuid = creationTime; } /// generates a new Db4oDatabase object with a unique signature. /// generates a new Db4oDatabase object with a unique signature. public static Db4objects.Db4o.Ext.Db4oDatabase Generate() { StatefulBuffer writer = new StatefulBuffer(null, 300); new LatinStringIO().Write(writer, SignatureGenerator.GenerateSignature()); return new Db4objects.Db4o.Ext.Db4oDatabase(writer.GetWrittenBytes(), Runtime.CurrentTimeMillis ()); } /// comparison by signature. /// comparison by signature. public override bool Equals(object obj) { if (obj == this) { return true; } if (obj == null || this.GetType() != obj.GetType()) { return false; } Db4objects.Db4o.Ext.Db4oDatabase other = (Db4objects.Db4o.Ext.Db4oDatabase)obj; if (null == other.i_signature || null == this.i_signature) { return false; } return Arrays4.Equals(other.i_signature, this.i_signature); } public override int GetHashCode() { return i_signature.GetHashCode(); } /// gets the db4o ID, and may cache it for performance reasons. /// gets the db4o ID, and may cache it for performance reasons. /// the db4o ID for the ObjectContainer public virtual int GetID(Transaction trans) { ObjectContainerBase stream = trans.Container(); if (stream != i_stream) { i_stream = stream; i_id = Bind(trans); } return i_id; } public virtual long GetCreationTime() { return i_uuid; } /// returns the unique signature public virtual byte[] GetSignature() { return i_signature; } public override string ToString() { return "db " + i_signature; } public virtual bool IsOlderThan(Db4objects.Db4o.Ext.Db4oDatabase peer) { if (peer == this) { throw new ArgumentException(); } if (i_uuid != peer.i_uuid) { return i_uuid < peer.i_uuid; } // the above logic has failed, both are the same // age but we still want to distinguish in some // way, to have an order in the ReplicationRecord // The following is arbitrary, it only needs to // be repeatable. // Let's distinguish by signature length if (i_signature.Length != peer.i_signature.Length) { return i_signature.Length < peer.i_signature.Length; } for (int i = 0; i < i_signature.Length; i++) { if (i_signature[i] != peer.i_signature[i]) { return i_signature[i] < peer.i_signature[i]; } } // This should never happen. // FIXME: Add a message and move to Messages. // throw new Exception(); } /// make sure this Db4oDatabase is stored. /// make sure this Db4oDatabase is stored. Return the ID. public virtual int Bind(Transaction trans) { ObjectContainerBase stream = trans.Container(); Db4objects.Db4o.Ext.Db4oDatabase stored = (Db4objects.Db4o.Ext.Db4oDatabase)stream .Db4oTypeStored(trans, this); if (stored == null) { return StoreAndGetId(trans); } if (stored == this) { return stream.GetID(trans, this); } if (i_uuid == 0) { i_uuid = stored.i_uuid; } stream.ShowInternalClasses(true); try { int id = stream.GetID(trans, stored); stream.Bind(trans, this, id); return id; } finally { stream.ShowInternalClasses(false); } } private int StoreAndGetId(Transaction trans) { ObjectContainerBase stream = trans.Container(); stream.ShowInternalClasses(true); try { stream.Store2(trans, this, stream.UpdateDepthProvider().ForDepth(2), false); return stream.GetID(trans, this); } finally { stream.ShowInternalClasses(false); } } /// find a Db4oDatabase with the same signature as this one public virtual Db4objects.Db4o.Ext.Db4oDatabase Query(Transaction trans) { // showInternalClasses(true); has to be set for this method to be successful if (i_uuid > 0) { // try fast query over uuid (creation time) first Db4objects.Db4o.Ext.Db4oDatabase res = Query(trans, true); if (res != null) { return res; } } // if not found, try to find with signature return Query(trans, false); } private Db4objects.Db4o.Ext.Db4oDatabase Query(Transaction trans, bool constrainByUUID ) { ObjectContainerBase stream = trans.Container(); IQuery q = stream.Query(trans); q.Constrain(GetType()); if (constrainByUUID) { q.Descend(CreationtimeField).Constrain(i_uuid); } IObjectSet objectSet = q.Execute(); while (objectSet.HasNext()) { Db4objects.Db4o.Ext.Db4oDatabase storedDatabase = (Db4objects.Db4o.Ext.Db4oDatabase )objectSet.Next(); stream.Activate(null, storedDatabase, new FixedActivationDepth(4)); if (storedDatabase.Equals(this)) { return storedDatabase; } } return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oIllegalStateException.cs0000644000175000017500000000126311700531646031062 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// The requested operation is not valid in the current state but the database /// continues to operate. /// /// /// The requested operation is not valid in the current state but the database /// continues to operate. /// [System.Serializable] public class Db4oIllegalStateException : Db4oRecoverableException { public Db4oIllegalStateException(string message) : base(message) { } public Db4oIllegalStateException(Exception cause) : base(cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/Db4oFatalException.cs0000644000175000017500000000112211700531646027531 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { [System.Serializable] public class Db4oFatalException : Db4oException { public Db4oFatalException() : base() { } public Db4oFatalException(int messageConstant) : base(messageConstant) { } public Db4oFatalException(string msg, Exception cause) : base(msg, cause) { } public Db4oFatalException(string msg) : base(msg) { } public Db4oFatalException(Exception cause) : base(cause) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/InvalidPasswordException.cs0000644000175000017500000000116211700531646031106 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// /// db4o-specific exception.

/// This exception is thrown when a client tries to connect /// to a server with a wrong password or null password. ///
/// /// db4o-specific exception.

/// This exception is thrown when a client tries to connect /// to a server with a wrong password or null password. ///
[System.Serializable] public class InvalidPasswordException : Db4oRecoverableException { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Ext/IStoredClass.cs0000644000175000017500000000602711700531646026462 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Ext { /// the internal representation of a stored class. /// the internal representation of a stored class. public interface IStoredClass { /// returns the name of this stored class. /// returns the name of this stored class. string GetName(); /// returns an array of IDs of all stored object instances of this stored class. /// /// returns an array of IDs of all stored object instances of this stored class. /// long[] GetIDs(); /// returns the StoredClass for the parent of the class, this StoredClass represents. /// /// returns the StoredClass for the parent of the class, this StoredClass represents. /// IStoredClass GetParentStoredClass(); /// returns all stored fields of this stored class. /// returns all stored fields of this stored class. IStoredField[] GetStoredFields(); /// returns true if this StoredClass has a class index. /// returns true if this StoredClass has a class index. bool HasClassIndex(); /// renames this stored class. /// /// renames this stored class. ///

After renaming one or multiple classes the ObjectContainer has /// to be closed and reopened to allow internal caches to be refreshed. ///

.NET: As the name you should provide [Classname, Assemblyname]

///
/// the new name void Rename(string name); // TODO: add field creation /// returns an existing stored field of this stored class. /// returns an existing stored field of this stored class. /// the name of the field /// /// the type of the field. /// There are four possibilities how to supply the type:
/// - a Class object. (.NET: a Type object)
/// - a fully qualified classname.
/// - any object to be used as a template.

/// - null, if the first found field should be returned. /// /// /// the /// IStoredField /// IStoredField StoredField(string name, object type); /// /// Returns the number of instances of this class that have been persisted to the /// database, as seen by the transaction (container) that produces this StoredClass /// instance. /// /// /// Returns the number of instances of this class that have been persisted to the /// database, as seen by the transaction (container) that produces this StoredClass /// instance. /// /// The number of instances int InstanceCount(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IBlobTransport.cs0000644000175000017500000000103311700531646026257 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using Db4objects.Db4o.Internal; namespace Db4objects.Db4o { /// public interface IBlobTransport { /// void WriteBlobTo(Transaction trans, BlobImpl blob); /// void ReadBlobFrom(Transaction trans, BlobImpl blob); void DeleteBlobFile(Transaction trans, BlobImpl blob); } } #endif // !SILVERLIGHT smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IObjectSet.cs0000644000175000017500000000562411700531646025360 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o { /// /// An ObjectSet is a representation for a set of objects returned /// by a query. /// /// /// An ObjectSet is a representation for a set of objects returned /// by a query. ///

ObjectSet extends the system collection interfaces /// java.util.List/System.Collections.IList where they are available. It is /// recommended, never to reference ObjectSet directly in code but to use /// List / IList instead. ///

Note that the underlying /// IObjectContainer /// of an ObjectSet /// needs to remain open as long as an ObjectSet is used. This is necessary /// for lazy instantiation. The objects in an ObjectSet are only instantiated /// when they are actually being used by the application. ///
/// for extended functionality. public interface IObjectSet : IList, IEnumerable { /// returns an ObjectSet with extended functionality. /// /// returns an ObjectSet with extended functionality. ///

Every ObjectSet that db4o provides can be casted to /// an ExtObjectSet. This method is supplied for your convenience /// to work without a cast. ///

The ObjectSet functionality is split to two interfaces /// to allow newcomers to focus on the essential methods. ///
IExtObjectSet Ext(); /// returns true if the ObjectSet has more elements. /// /// returns true if the ObjectSet has more elements. /// /// /// boolean - true if the ObjectSet has more /// elements. /// bool HasNext(); /// returns the next object in the ObjectSet. /// /// returns the next object in the ObjectSet. ///

/// Before returning the Object, next() triggers automatic activation of the /// Object with the respective /// global /// or /// class specific /// /// setting.

///
/// the next object in the ObjectSet. object Next(); /// resets the ObjectSet cursor before the first element. /// /// resets the ObjectSet cursor before the first element. ///

A subsequent call to next() will return the first element. ///
void Reset(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/StaticField.cs0000644000175000017500000000064311700531646025554 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o { /// /// public class StaticField : IInternal4 { public string name; public object value; public StaticField() { } public StaticField(string name_, object value_) { name = name_; value = value_; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Deploy.cs0000644000175000017500000000101011700531646024602 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o { /// public sealed class Deploy { /// turning debug on makes the file format human readable public const bool debug = false; public const bool overwrite = true; public const bool brackets = true; public const bool identifiers = true; public const bool flush = true; public const bool debugLong = true; public const bool csharp = true; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/DTrace.cs0000644000175000017500000005117311700531646024527 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.IO; using System.Text; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Slots; using Sharpen.IO; namespace Db4objects.Db4o { /// public class DTrace { public static bool enabled = false; public static bool writeToLogFile = false; public static bool writeToConsole = true; private static readonly string logFilePath = "C://"; private static string logFileName; private static readonly object Lock = new object(); private static readonly LatinStringIO stringIO = new LatinStringIO(); public static RandomAccessFile _logFile; private static int Unused = -1; private static void BreakPoint() { if (enabled) { int xxx = 1; } } private static void Configure() { if (enabled) { } } // addRange(15); // breakOnEvent(540); // // addRangeWithEnd(448, 460); // addRangeWithLength(770,53); // breakOnEvent(125); // trackEventsWithoutRange(); // turnAllOffExceptFor(new DTrace[] {WRITE_BYTES}); // turnAllOffExceptFor(new DTrace[] { // PERSISTENT_OWN_LENGTH, // }); // turnAllOffExceptFor(new DTrace[] { // GET_SLOT, // FILE_FREE, // TRANS_COMMIT, // }); // turnAllOffExceptFor(new DTrace[] {WRITE_BYTES}); // turnAllOffExceptFor(new DTrace[] {BTREE_NODE_REMOVE, BTREE_NODE_COMMIT_OR_ROLLBACK YAPMETA_SET_ID}); private static void Init() { if (enabled) { AddToClassIndex = new Db4objects.Db4o.DTrace(true, true, "add to class index tree" , true); BeginTopLevelCall = new Db4objects.Db4o.DTrace(true, true, "begin top level call" , true); Bind = new Db4objects.Db4o.DTrace(true, true, "bind", true); BlockingQueueStoppedException = new Db4objects.Db4o.DTrace(true, true, "blocking queue stopped exception" , true); BtreeNodeRemove = new Db4objects.Db4o.DTrace(true, true, "btreenode remove", true ); BtreeNodeCommitOrRollback = new Db4objects.Db4o.DTrace(true, true, "btreenode commit or rollback" , true); BtreeProduceNode = new Db4objects.Db4o.DTrace(true, true, "btree produce node", true ); CandidateRead = new Db4objects.Db4o.DTrace(true, true, "candidate read", true); ClassmetadataById = new Db4objects.Db4o.DTrace(true, true, "classmetadata by id", true); ClassmetadataInit = new Db4objects.Db4o.DTrace(true, true, "classmetadata init", true); ClientMessageLoopException = new Db4objects.Db4o.DTrace(true, true, "client message loop exception" , true); Close = new Db4objects.Db4o.DTrace(true, true, "close", true); CloseCalled = new Db4objects.Db4o.DTrace(true, true, "close called", true); CollectChildren = new Db4objects.Db4o.DTrace(true, true, "collect children", true ); Commit = new Db4objects.Db4o.DTrace(false, false, "commit", true); Continueset = new Db4objects.Db4o.DTrace(true, true, "continueset", true); CreateCandidate = new Db4objects.Db4o.DTrace(true, true, "create candidate", true ); Delete = new Db4objects.Db4o.DTrace(true, true, "delete", true); Donotinclude = new Db4objects.Db4o.DTrace(true, true, "donotinclude", true); EndTopLevelCall = new Db4objects.Db4o.DTrace(true, true, "end top level call", true ); EvaluateSelf = new Db4objects.Db4o.DTrace(true, true, "evaluate self", true); FatalException = new Db4objects.Db4o.DTrace(true, true, "fatal exception", true); Free = new Db4objects.Db4o.DTrace(true, true, "free", true); FileFree = new Db4objects.Db4o.DTrace(true, true, "fileFree", true); FileRead = new Db4objects.Db4o.DTrace(true, true, "fileRead", true); FileWrite = new Db4objects.Db4o.DTrace(true, true, "fileWrite", true); FreespacemanagerGetSlot = new Db4objects.Db4o.DTrace(true, true, "FreespaceManager getSlot" , true); FreespacemanagerRamFree = new Db4objects.Db4o.DTrace(true, true, "InMemoryfreespaceManager free" , true); FreespacemanagerBtreeFree = new Db4objects.Db4o.DTrace(true, true, "BTreeFreeSpaceManager free" , true); FreeOnCommit = new Db4objects.Db4o.DTrace(true, true, "trans freeOnCommit", true); FreeOnRollback = new Db4objects.Db4o.DTrace(true, true, "trans freeOnRollback", true ); FreePointerOnRollback = new Db4objects.Db4o.DTrace(true, true, "freePointerOnRollback" , true); GetPointerSlot = new Db4objects.Db4o.DTrace(true, true, "getPointerSlot", true); GetSlot = new Db4objects.Db4o.DTrace(true, true, "getSlot", true); GetFreespaceRam = new Db4objects.Db4o.DTrace(true, true, "getFreespaceRam", true); GetYapobject = new Db4objects.Db4o.DTrace(true, true, "get ObjectReference", true ); IdTreeAdd = new Db4objects.Db4o.DTrace(true, true, "id tree add", true); IdTreeRemove = new Db4objects.Db4o.DTrace(true, true, "id tree remove", true); IoCopy = new Db4objects.Db4o.DTrace(true, true, "io copy", true); JustSet = new Db4objects.Db4o.DTrace(true, true, "just set", true); NewInstance = new Db4objects.Db4o.DTrace(true, true, "newInstance", true); NotifySlotCreated = new Db4objects.Db4o.DTrace(true, true, "notifySlotCreated", true ); NotifySlotUpdated = new Db4objects.Db4o.DTrace(true, true, "notify Slot updated", true); NotifySlotDeleted = new Db4objects.Db4o.DTrace(true, true, "notifySlotDeleted", true ); ObjectReferenceCreated = new Db4objects.Db4o.DTrace(true, true, "new ObjectReference" , true); PersistentBaseNewSlot = new Db4objects.Db4o.DTrace(true, true, "PersistentBase new slot" , true); PersistentOwnLength = new Db4objects.Db4o.DTrace(true, true, "Persistent own length" , true); PersistentbaseWrite = new Db4objects.Db4o.DTrace(true, true, "persistentbase write" , true); PersistentbaseSetId = new Db4objects.Db4o.DTrace(true, true, "persistentbase setid" , true); ProduceSlotChange = new Db4objects.Db4o.DTrace(true, true, "produce slot change", true); QueryProcess = new Db4objects.Db4o.DTrace(true, true, "query process", true); ReadArrayWrapper = new Db4objects.Db4o.DTrace(true, true, "read array wrapper", true ); ReadBytes = new Db4objects.Db4o.DTrace(true, true, "readBytes", true); ReadSlot = new Db4objects.Db4o.DTrace(true, true, "read slot", true); ReferenceRemoved = new Db4objects.Db4o.DTrace(true, true, "reference removed", true ); RegularSeek = new Db4objects.Db4o.DTrace(true, true, "regular seek", true); RemoveFromClassIndex = new Db4objects.Db4o.DTrace(true, true, "trans removeFromClassIndexTree" , true); RereadOldUuid = new Db4objects.Db4o.DTrace(true, true, "reread old uuid", true); ServerMessageLoopException = new Db4objects.Db4o.DTrace(true, true, "server message loop exception" , true); SlotMapped = new Db4objects.Db4o.DTrace(true, true, "slot mapped", true); SlotCommitted = new Db4objects.Db4o.DTrace(true, true, "slot committed", true); SlotFreeOnCommit = new Db4objects.Db4o.DTrace(true, true, "slot free on commit", true); SlotFreeOnRollbackId = new Db4objects.Db4o.DTrace(true, true, "slot free on rollback id" , true); SlotFreeOnRollbackAddress = new Db4objects.Db4o.DTrace(true, true, "slot free on rollback address" , true); SlotRead = new Db4objects.Db4o.DTrace(true, true, "slot read", true); TransCommit = new Db4objects.Db4o.DTrace(true, true, "trans commit", true); TransDelete = new Db4objects.Db4o.DTrace(true, true, "trans delete", true); TransDontDelete = new Db4objects.Db4o.DTrace(true, true, "trans dontDelete", true ); TransFlush = new Db4objects.Db4o.DTrace(true, true, "trans flush", true); WriteBytes = new Db4objects.Db4o.DTrace(true, true, "writeBytes", true); WritePointer = new Db4objects.Db4o.DTrace(true, true, "write pointer", true); WriteUpdateAdjustIndexes = new Db4objects.Db4o.DTrace(true, true, "trans writeUpdateDeleteMembers" , true); WriteXbytes = new Db4objects.Db4o.DTrace(true, true, "writeXBytes", true); Configure(); } } private static void TrackEventsWithoutRange() { _trackEventsWithoutRange = true; } private DTrace(bool enabled_, bool break_, string tag_, bool log_) { if (enabled) { _enabled = enabled_; _break = break_; _tag = tag_; _log = log_; if (all == null) { all = new Db4objects.Db4o.DTrace[100]; } all[current++] = this; } } private bool _enabled; private bool _break; private bool _log; private string _tag; private static long[] _rangeStart; private static long[] _rangeEnd; private static int _rangeCount; public static long _eventNr; private static long[] _breakEventNrs; private static int _breakEventCount; private static bool _breakAfterEvent; private static bool _trackEventsWithoutRange; public static Db4objects.Db4o.DTrace AddToClassIndex; public static Db4objects.Db4o.DTrace BeginTopLevelCall; public static Db4objects.Db4o.DTrace Bind; public static Db4objects.Db4o.DTrace BlockingQueueStoppedException; public static Db4objects.Db4o.DTrace BtreeNodeCommitOrRollback; public static Db4objects.Db4o.DTrace BtreeNodeRemove; public static Db4objects.Db4o.DTrace BtreeProduceNode; public static Db4objects.Db4o.DTrace CandidateRead; public static Db4objects.Db4o.DTrace ClassmetadataById; public static Db4objects.Db4o.DTrace ClassmetadataInit; public static Db4objects.Db4o.DTrace ClientMessageLoopException; public static Db4objects.Db4o.DTrace Close; public static Db4objects.Db4o.DTrace CloseCalled; public static Db4objects.Db4o.DTrace CollectChildren; public static Db4objects.Db4o.DTrace Commit; public static Db4objects.Db4o.DTrace Continueset; public static Db4objects.Db4o.DTrace CreateCandidate; public static Db4objects.Db4o.DTrace Delete; public static Db4objects.Db4o.DTrace Donotinclude; public static Db4objects.Db4o.DTrace EndTopLevelCall; public static Db4objects.Db4o.DTrace EvaluateSelf; public static Db4objects.Db4o.DTrace FatalException; public static Db4objects.Db4o.DTrace FileFree; public static Db4objects.Db4o.DTrace FileRead; public static Db4objects.Db4o.DTrace FileWrite; public static Db4objects.Db4o.DTrace Free; public static Db4objects.Db4o.DTrace FreespacemanagerGetSlot; public static Db4objects.Db4o.DTrace FreespacemanagerRamFree; public static Db4objects.Db4o.DTrace FreespacemanagerBtreeFree; public static Db4objects.Db4o.DTrace FreeOnCommit; public static Db4objects.Db4o.DTrace FreeOnRollback; public static Db4objects.Db4o.DTrace FreePointerOnRollback; public static Db4objects.Db4o.DTrace GetSlot; public static Db4objects.Db4o.DTrace GetPointerSlot; public static Db4objects.Db4o.DTrace GetFreespaceRam; public static Db4objects.Db4o.DTrace GetYapobject; public static Db4objects.Db4o.DTrace IdTreeAdd; public static Db4objects.Db4o.DTrace IdTreeRemove; public static Db4objects.Db4o.DTrace IoCopy; public static Db4objects.Db4o.DTrace JustSet; public static Db4objects.Db4o.DTrace NewInstance; public static Db4objects.Db4o.DTrace NotifySlotCreated; public static Db4objects.Db4o.DTrace NotifySlotUpdated; public static Db4objects.Db4o.DTrace NotifySlotDeleted; public static Db4objects.Db4o.DTrace ObjectReferenceCreated; public static Db4objects.Db4o.DTrace PersistentBaseNewSlot; public static Db4objects.Db4o.DTrace PersistentOwnLength; public static Db4objects.Db4o.DTrace PersistentbaseSetId; public static Db4objects.Db4o.DTrace PersistentbaseWrite; public static Db4objects.Db4o.DTrace ProduceSlotChange; public static Db4objects.Db4o.DTrace QueryProcess; public static Db4objects.Db4o.DTrace ReadArrayWrapper; public static Db4objects.Db4o.DTrace ReadBytes; public static Db4objects.Db4o.DTrace ReadSlot; public static Db4objects.Db4o.DTrace ReferenceRemoved; public static Db4objects.Db4o.DTrace RegularSeek; public static Db4objects.Db4o.DTrace RemoveFromClassIndex; public static Db4objects.Db4o.DTrace RereadOldUuid; public static Db4objects.Db4o.DTrace ServerMessageLoopException; public static Db4objects.Db4o.DTrace SlotMapped; public static Db4objects.Db4o.DTrace SlotCommitted; public static Db4objects.Db4o.DTrace SlotFreeOnCommit; public static Db4objects.Db4o.DTrace SlotFreeOnRollbackId; public static Db4objects.Db4o.DTrace SlotFreeOnRollbackAddress; public static Db4objects.Db4o.DTrace SlotRead; public static Db4objects.Db4o.DTrace TransCommit; public static Db4objects.Db4o.DTrace TransDontDelete; public static Db4objects.Db4o.DTrace TransDelete; public static Db4objects.Db4o.DTrace TransFlush; public static Db4objects.Db4o.DTrace WriteBytes; public static Db4objects.Db4o.DTrace WritePointer; public static Db4objects.Db4o.DTrace WriteXbytes; public static Db4objects.Db4o.DTrace WriteUpdateAdjustIndexes; static DTrace() { Init(); } private static Db4objects.Db4o.DTrace[] all; private static int current; public virtual void Log() { if (enabled) { Log(Unused); } } public virtual void Log(string msg) { if (enabled) { Log(Unused, msg); } } public virtual void Log(long p) { if (enabled) { LogLength(p, 1); } } public virtual void LogInfo(string info) { if (enabled) { LogEnd(Unused, Unused, 0, info); } } public virtual void Log(long p, string info) { if (enabled) { LogEnd(Unused, p, 0, info); } } public virtual void LogLength(long start, long length) { if (enabled) { LogLength(Unused, start, length); } } public virtual void LogLength(long id, long start, long length) { if (enabled) { LogEnd(id, start, start + length - 1); } } public virtual void LogLength(Slot slot) { if (enabled) { LogLength(Unused, slot); } } public virtual void LogLength(long id, Slot slot) { if (enabled) { if (slot == null) { return; } LogLength(id, slot.Address(), slot.Length()); } } public virtual void LogEnd(long start, long end) { if (enabled) { LogEnd(Unused, start, end); } } public virtual void LogEnd(long id, long start, long end) { if (enabled) { LogEnd(id, start, end, null); } } public virtual void LogEnd(long id, long start, long end, string info) { // if(! Deploy.log){ // return; // } if (enabled) { if (!_enabled) { return; } bool inRange = false; if (_rangeCount == 0) { inRange = true; } for (int i = 0; i < _rangeCount; i++) { // Case 0 ID in range if (id >= _rangeStart[i] && id <= _rangeEnd[i]) { inRange = true; break; } // Case 1 start in range if (start >= _rangeStart[i] && start <= _rangeEnd[i]) { inRange = true; break; } if (end != 0) { // Case 2 end in range if (end >= _rangeStart[i] && end <= _rangeEnd[i]) { inRange = true; break; } // Case 3 start before range, end after range if (start <= _rangeStart[i] && end >= _rangeEnd[i]) { inRange = true; break; } } } if (inRange || (_trackEventsWithoutRange && (start == Unused))) { if (_log) { _eventNr++; StringBuilder sb = new StringBuilder(":"); sb.Append(FormatInt(_eventNr, 6)); sb.Append(":"); sb.Append(FormatInt(id)); sb.Append(":"); sb.Append(FormatInt(start)); sb.Append(":"); if (end != 0 && start != end) { sb.Append(FormatInt(end)); sb.Append(":"); sb.Append(FormatInt(end - start + 1)); } else { sb.Append(FormatUnused()); sb.Append(":"); sb.Append(FormatUnused()); } sb.Append(":"); if (info != null) { sb.Append(" " + info + " "); sb.Append(":"); } sb.Append(" "); sb.Append(_tag); LogToOutput(sb.ToString()); } if (_break) { if (_breakEventCount > 0) { for (int i = 0; i < _breakEventCount; i++) { if (_breakEventNrs[i] == _eventNr) { BreakPoint(); break; } } if (_breakAfterEvent) { for (int i = 0; i < _breakEventCount; i++) { if (_breakEventNrs[i] <= _eventNr) { BreakPoint(); break; } } } } else { BreakPoint(); } } } } } private string FormatUnused() { return FormatInt(Unused); } private static void LogToOutput(string msg) { if (enabled) { LogToFile(msg); LogToConsole(msg); } } private static void LogToConsole(string msg) { if (enabled) { if (writeToConsole) { Sharpen.Runtime.Out.WriteLine(msg); } } } private static void LogToFile(string msg) { if (enabled) { if (!writeToLogFile) { return; } lock (Lock) { if (_logFile == null) { try { _logFile = new RandomAccessFile(LogFile(), "rw"); LogToFile("\r\n\r\n ********** BEGIN LOG ********** \r\n\r\n "); } catch (IOException e) { Sharpen.Runtime.PrintStackTrace(e); } } msg = DateHandlerBase.Now() + "\r\n" + msg + "\r\n"; byte[] bytes = stringIO.Write(msg); try { _logFile.Write(bytes); } catch (IOException e) { Sharpen.Runtime.PrintStackTrace(e); } } } } private static string LogFile() { if (enabled) { if (logFileName != null) { return logFileName; } logFileName = "db4oDTrace_" + DateHandlerBase.Now() + "_" + SignatureGenerator.GenerateSignature () + ".log"; logFileName = logFileName.Replace(' ', '_'); logFileName = logFileName.Replace(':', '_'); logFileName = logFileName.Replace('-', '_'); return logFilePath + logFileName; } return null; } public static void AddRange(long pos) { if (enabled) { AddRangeWithEnd(pos, pos); } } public static void AddRangeWithLength(long start, long length) { if (enabled) { AddRangeWithEnd(start, start + length - 1); } } public static void AddRangeWithEnd(long start, long end) { if (enabled) { if (_rangeStart == null) { _rangeStart = new long[1000]; _rangeEnd = new long[1000]; } _rangeStart[_rangeCount] = start; _rangeEnd[_rangeCount] = end; _rangeCount++; } } // private static void breakFromEvent(long eventNr){ // breakOnEvent(eventNr); // _breakAfterEvent = true; // } private static void BreakOnEvent(long eventNr) { if (enabled) { if (_breakEventNrs == null) { _breakEventNrs = new long[100]; } _breakEventNrs[_breakEventCount] = eventNr; _breakEventCount++; } } private string FormatInt(long i, int len) { if (enabled) { string str = " "; if (i != Unused) { str += i + " "; } return Sharpen.Runtime.Substring(str, str.Length - len); } return null; } private string FormatInt(long i) { if (enabled) { return FormatInt(i, 10); } return null; } private static void TurnAllOffExceptFor(Db4objects.Db4o.DTrace[] these) { if (enabled) { for (int i = 0; i < all.Length; i++) { if (all[i] == null) { break; } bool turnOff = true; for (int j = 0; j < these.Length; j++) { if (all[i] == these[j]) { turnOff = false; break; } } if (turnOff) { all[i]._break = false; all[i]._enabled = false; all[i]._log = false; } } } } public static void NoWarnings() { BreakOnEvent(0); TrackEventsWithoutRange(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/ITransactionAware.cs0000644000175000017500000000036611700531646026741 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; namespace Db4objects.Db4o { /// public interface ITransactionAware { void SetTrans(Transaction a_trans); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Constraints/0000755000175000017500000000000011700531646025336 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Constraints/ConstraintViolationException.cs0000644000175000017500000000133611700531646033560 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Constraints { /// Base class for all constraint exceptions. /// Base class for all constraint exceptions. [System.Serializable] public class ConstraintViolationException : Db4oRecoverableException { /// /// ConstraintViolationException constructor with a specific /// message. /// /// /// ConstraintViolationException constructor with a specific /// message. /// /// exception message public ConstraintViolationException(string msg) : base(msg) { } } } UniqueFieldValueConstraintViolationException.cs0000644000175000017500000000265611700531646036637 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Constraints/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Constraints; namespace Db4objects.Db4o.Constraints { /// /// db4o-specific exception.

/// This exception can be thrown by a /// UniqueFieldValueConstraint /// on commit. ///
/// Db4objects.Db4o.Config.IObjectField.Indexed(bool) /// /// Db4objects.Db4o.Config.IConfiguration.Add(Db4objects.Db4o.Config.IConfigurationItem) /// [System.Serializable] public class UniqueFieldValueConstraintViolationException : ConstraintViolationException { /// /// Constructor with a message composed from the class and field /// name of the entity causing the exception. /// /// /// Constructor with a message composed from the class and field /// name of the entity causing the exception. /// /// class, which caused the exception /// field, which caused the exception public UniqueFieldValueConstraintViolationException(string className, string fieldName ) : base("class: " + className + " field: " + fieldName) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Constraints/UniqueFieldValueConstraint.cs0000644000175000017500000001105211700531646033140 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Config; using Db4objects.Db4o.Constraints; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Constraints { /// configures a field of a class to allow unique values only. /// configures a field of a class to allow unique values only. public class UniqueFieldValueConstraint : IConfigurationItem { protected readonly object _clazz; protected readonly string _fieldName; /// constructor to create a UniqueFieldValueConstraint. /// constructor to create a UniqueFieldValueConstraint. /// can be a class (Java) / Type (.NET) / instance of the class / fully qualified class name /// /// the name of the field that is to be unique. public UniqueFieldValueConstraint(object clazz, string fieldName) { _clazz = clazz; _fieldName = fieldName; } public virtual void Prepare(IConfiguration configuration) { } // Nothing to do... /// internal method, public for implementation reasons. /// internal method, public for implementation reasons. public virtual void Apply(IInternalObjectContainer objectContainer) { if (objectContainer.IsClient) { throw new InvalidOperationException(GetType().FullName + " should be configured on the server." ); } EventRegistryFactory.ForObjectContainer(objectContainer).Committing += new System.EventHandler (new _IEventListener4_46(this, objectContainer).OnEvent); } private sealed class _IEventListener4_46 { public _IEventListener4_46(UniqueFieldValueConstraint _enclosing, IInternalObjectContainer objectContainer) { this._enclosing = _enclosing; this.objectContainer = objectContainer; } private FieldMetadata _fieldMetaData; private void EnsureSingleOccurence(Transaction trans, IObjectInfoCollection col) { IEnumerator i = col.GetEnumerator(); while (i.MoveNext()) { IObjectInfo objectInfo = (IObjectInfo)i.Current; if (this.ReflectClass() != this._enclosing.ReflectorFor(trans, objectInfo.GetObject ())) { continue; } object obj = this.ObjectFor(trans, objectInfo); object fieldValue = this.FieldMetadata().GetOn(trans, obj); if (fieldValue == null) { continue; } IBTreeRange range = this.FieldMetadata().Search(trans, fieldValue); if (range.Size() > 1) { throw new UniqueFieldValueConstraintViolationException(this.ClassMetadata().GetName (), this.FieldMetadata().GetName()); } } } private bool IsClassMetadataAvailable() { return null != this.ClassMetadata(); } private FieldMetadata FieldMetadata() { if (this._fieldMetaData != null) { return this._fieldMetaData; } this._fieldMetaData = this.ClassMetadata().FieldMetadataForName(this._enclosing._fieldName ); return this._fieldMetaData; } private ClassMetadata ClassMetadata() { return objectContainer.ClassMetadataForReflectClass(this.ReflectClass()); } private IReflectClass ReflectClass() { return ReflectorUtils.ReflectClassFor(objectContainer.Reflector(), this._enclosing ._clazz); } public void OnEvent(object sender, Db4objects.Db4o.Events.CommitEventArgs args) { if (!this.IsClassMetadataAvailable()) { return; } CommitEventArgs commitEventArgs = (CommitEventArgs)args; Transaction trans = (Transaction)commitEventArgs.Transaction(); this.EnsureSingleOccurence(trans, commitEventArgs.Added); this.EnsureSingleOccurence(trans, commitEventArgs.Updated); } private object ObjectFor(Transaction trans, IObjectInfo info) { int id = (int)info.GetInternalID(); HardObjectReference @ref = HardObjectReference.PeekPersisted(trans, id, 1); return @ref._object; } private readonly UniqueFieldValueConstraint _enclosing; private readonly IInternalObjectContainer objectContainer; } private IReflectClass ReflectorFor(Transaction trans, object obj) { return trans.Container().Reflector().ForObject(obj); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/0000755000175000017500000000000011700531646024273 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/ICancellableEventArgs.cs0000644000175000017500000000157311700531646030745 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Events { /// Argument for events related to cancellable actions. /// Argument for events related to cancellable actions. /// IEventRegistry public interface ICancellableEventArgs { /// Queries if the action was already cancelled by some event listener. /// Queries if the action was already cancelled by some event listener. bool IsCancelled { get; } /// Cancels the action related to this event. /// /// Cancels the action related to this event. /// Although the related action will be cancelled all the registered /// listeners will still receive the event. /// void Cancel(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/EventException.cs0000644000175000017500000000155611700531646027571 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Events { /// /// db4o-specific exception.

/// Exception thrown during event dispatching if a client /// provided event handler throws.

/// The exception thrown by the client can be retrieved by /// calling EventException.InnerException. ///
/// /// db4o-specific exception.

/// Exception thrown during event dispatching if a client /// provided event handler throws.

/// The exception thrown by the client can be retrieved by /// calling EventException.InnerException. ///
[System.Serializable] public class EventException : Db4oRecoverableException { public EventException(Exception exc) : base(exc) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/ObjectContainerEventArgs.cs0000644000175000017500000000122411700531646031511 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; namespace Db4objects.Db4o.Events { /// Arguments for container related events. /// Arguments for container related events. /// IEventRegistry public class ObjectContainerEventArgs : EventArgs { private readonly IObjectContainer _container; public ObjectContainerEventArgs(IObjectContainer container) { _container = container; } public virtual IObjectContainer ObjectContainer { get { return _container; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/CommitEventArgs.cs0000644000175000017500000000232611700531646027674 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Events { /// Arguments for commit time related events. /// Arguments for commit time related events. /// IEventRegistry public class CommitEventArgs : TransactionalEventArgs { private readonly CallbackObjectInfoCollections _collections; private readonly bool _isOwnCommit; public CommitEventArgs(Transaction transaction, CallbackObjectInfoCollections collections , bool isOwnCommit) : base(transaction) { _collections = collections; _isOwnCommit = isOwnCommit; } /// Returns a iteration public virtual IObjectInfoCollection Added { get { return _collections.added; } } public virtual IObjectInfoCollection Deleted { get { return _collections.deleted; } } public virtual IObjectInfoCollection Updated { get { return _collections.updated; } } public virtual bool IsOwnCommit() { return _isOwnCommit; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/EventRegistryFactory.cs0000644000175000017500000000265011700531646030767 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Events; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Callbacks; using Db4objects.Db4o.Internal.Events; namespace Db4objects.Db4o.Events { /// /// Provides an interface for getting an /// IEventRegistry /// from an /// Db4objects.Db4o.IObjectContainer /// . /// public class EventRegistryFactory { /// /// Returns an /// IEventRegistry /// for registering events with the specified container. /// public static IEventRegistry ForObjectContainer(IObjectContainer objectContainer) { if (null == objectContainer) { throw new ArgumentNullException(); } IInternalObjectContainer container = ((IInternalObjectContainer)objectContainer); ICallbacks callbacks = container.Callbacks(); if (callbacks is IEventRegistry) { return (IEventRegistry)callbacks; } if (callbacks is NullCallbacks) { EventRegistryImpl impl = container.NewEventRegistry(); container.Callbacks(impl); return impl; } // TODO: create a MulticastingCallbacks and register both // the current one and the new one throw new ArgumentException(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/CancellableObjectEventArgs.cs0000644000175000017500000000315711700531646031763 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Events { /// Argument for object related events which can be cancelled. /// Argument for object related events which can be cancelled. /// IEventRegistry /// ICancellableEventArgs public class CancellableObjectEventArgs : ObjectInfoEventArgs, ICancellableEventArgs { private bool _cancelled; private object _object; /// Creates a new instance for the specified object. /// Creates a new instance for the specified object. public CancellableObjectEventArgs(Transaction transaction, IObjectInfo objectInfo , object obj) : base(transaction, objectInfo) { _object = obj; } /// ICancellableEventArgs.Cancel() public virtual void Cancel() { _cancelled = true; } /// ICancellableEventArgs.IsCancelled() /// public virtual bool IsCancelled { get { return _cancelled; } } public override object Object { get { return _object; } } public override IObjectInfo Info { get { IObjectInfo info = base.Info; if (null == info) { throw new InvalidOperationException(); } return info; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/ObjectEventArgs.cs0000644000175000017500000000152111700531646027646 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Events; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Events { /// Arguments for object related events. /// Arguments for object related events. /// IEventRegistry public abstract class ObjectEventArgs : TransactionalEventArgs { /// Creates a new instance for the specified object. /// Creates a new instance for the specified object. protected ObjectEventArgs(Transaction transaction) : base(transaction) { } /// The object that triggered this event. /// The object that triggered this event. public abstract object Object { get; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/TransactionalEventArgs.cs0000644000175000017500000000111511700531646031241 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; namespace Db4objects.Db4o.Events { public class TransactionalEventArgs : EventArgs { private readonly Db4objects.Db4o.Internal.Transaction _transaction; public TransactionalEventArgs(Db4objects.Db4o.Internal.Transaction transaction) { _transaction = transaction; } public virtual object Transaction() { return _transaction; } public virtual IObjectContainer ObjectContainer() { return _transaction.ObjectContainer(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/StringEventArgs.cs0000644000175000017500000000062411700531646027711 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Events { /// 7.12 public class StringEventArgs : EventArgs { public StringEventArgs(string message) { _message = message; } public virtual string Message { get { return _message; } } private readonly string _message; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/IEventRegistry.cs0000644000175000017500000003226411700531646027554 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Events { /// /// Provides a way to register event handlers for specific IObjectContainer events.
/// EventRegistry methods represent events available for registering callbacks. /// EventRegistry instance can be obtained from EventRegistryFactory. /// EventRegistry registry = EventRegistryFactory.ForObjectContainer(container); /// A new callback can be registered for an event with the following code: /// /// private static void OnCreated(object sender, ObjectInfoEventArgs args) /// { /// Object obj = args.Object; /// if (obj is Pilot) /// { /// Console.WriteLine(obj.ToString()); /// } /// } /// registry.Created+=new System.EventHandler<ObjectInfoEventArgs>(OnCreated); /// /// EventRegistryFactory ///
public interface IEventRegistry { /// /// This event is fired upon a query start and can be used to gather /// query statistics. /// /// /// This event is fired upon a query start and can be used to gather /// query statistics. /// The query object is available from /// QueryEventArgs /// event parameter.
///
/// event /// QueryEventArgs event System.EventHandler QueryStarted; /// /// This event is fired upon a query end and can be used to gather /// query statistics. /// /// /// This event is fired upon a query end and can be used to gather /// query statistics. /// The query object is available from /// QueryEventArgs /// event parameter.
///
/// event /// QueryEventArgs event System.EventHandler QueryFinished; /// This event is fired before an object is saved for the first time. /// /// This event is fired before an object is saved for the first time. /// The object can be obtained from /// CancellableObjectEventArgs /// event parameter. The action can be cancelled using /// CancellableObjectEventArgs.Cancel() /// /// /// event /// CancellableObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Store(object) /// event System.EventHandler Creating; /// This event is fired before an object is activated. /// /// This event is fired before an object is activated. /// The object can be obtained from /// CancellableObjectEventArgs /// event parameter. The action can be cancelled using /// CancellableObjectEventArgs.Cancel() /// /// /// event /// CancellableObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Activate(object, int) /// event System.EventHandler Activating; /// This event is fired before an object is updated. /// /// This event is fired before an object is updated. /// The object can be obtained from /// CancellableObjectEventArgs /// event parameter. The action can be cancelled using /// CancellableObjectEventArgs.Cancel() /// /// /// event /// CancellableObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Store(object) /// event System.EventHandler Updating; /// This event is fired before an object is deleted. /// /// This event is fired before an object is deleted. /// The object can be obtained from /// CancellableObjectEventArgs /// event parameter. The action can be cancelled using /// CancellableObjectEventArgs.Cancel() /// ///

/// Note, that this event is not available in networked client/server /// mode and will throw an exception when attached to a client ObjectContainer. ///
/// event /// CancellableObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Delete(object) /// event System.EventHandler Deleting; /// This event is fired before an object is deactivated. /// /// This event is fired before an object is deactivated. /// The object can be obtained from /// CancellableObjectEventArgs /// event parameter. The action can be cancelled using /// CancellableObjectEventArgs.Cancel() /// /// /// event /// CancellableObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Deactivate(object, int) /// event System.EventHandler Deactivating; /// This event is fired after an object is activated. /// /// This event is fired after an object is activated. /// The object can be obtained from the /// ObjectInfoEventArgs /// event parameter.

/// The event can be used to trigger some post-activation /// functionality. ///
/// event /// ObjectInfoEventArgs /// Db4objects.Db4o.IObjectContainer.Activate(object, int) /// event System.EventHandler Activated; /// This event is fired after an object is created (saved for the first time). /// /// /// This event is fired after an object is created (saved for the first time). /// The object can be obtained from the /// ObjectInfoEventArgs /// event parameter.

/// The event can be used to trigger some post-creation /// functionality. ///
/// event /// ObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Store(object) /// event System.EventHandler Created; /// This event is fired after an object is updated. /// /// This event is fired after an object is updated. /// The object can be obtained from the /// ObjectInfoEventArgs /// event parameter.

/// The event can be used to trigger some post-update /// functionality. ///
/// event /// ObjectInfoEventArgs /// Db4objects.Db4o.IObjectContainer.Store(object) /// event System.EventHandler Updated; /// This event is fired after an object is deleted. /// /// This event is fired after an object is deleted. /// The object can be obtained from the /// ObjectInfoEventArgs /// event parameter.

/// The event can be used to trigger some post-deletion /// functionality.

/// Note, that this event is not available in networked client/server /// mode and will throw an exception when attached to a client ObjectContainer. ///
/// event /// ObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Delete(object) /// event System.EventHandler Deleted; /// This event is fired after an object is deactivated. /// /// This event is fired after an object is deactivated. /// The object can be obtained from the /// ObjectInfoEventArgs /// event parameter.

/// The event can be used to trigger some post-deactivation /// functionality. ///
/// event /// ObjectEventArgs /// Db4objects.Db4o.IObjectContainer.Delete(object) /// event System.EventHandler Deactivated; /// This event is fired just before a transaction is committed. /// /// This event is fired just before a transaction is committed. /// The transaction and a list of the modified objects can /// be obtained from the /// CommitEventArgs /// event parameter.

/// Committing event gives a user a chance to interrupt the commit /// and rollback the transaction. ///
/// event /// CommitEventArgs /// Db4objects.Db4o.IObjectContainer.Commit() /// event System.EventHandler Committing; /// This event is fired after a transaction has been committed. /// /// This event is fired after a transaction has been committed. /// The transaction and a list of the modified objects can /// be obtained from the /// CommitEventArgs /// event parameter.

/// The event can be used to trigger some post-commit functionality. ///
/// event /// CommitEventArgs /// Db4objects.Db4o.IObjectContainer.Commit() /// event System.EventHandler Committed; /// This event is fired when a persistent object is instantiated. /// /// This event is fired when a persistent object is instantiated. /// The object can be obtained from the /// ObjectInfoEventArgs /// event parameter. /// /// event /// ObjectInfoEventArgs event System.EventHandler Instantiated; /// This event is fired when a new class is registered with metadata. /// /// This event is fired when a new class is registered with metadata. /// The class information can be obtained from /// ClassEventArgs /// event parameter. /// /// event /// ClassEventArgs event System.EventHandler ClassRegistered; /// /// This event is fired when the /// Db4objects.Db4o.IObjectContainer.Close() /// /// is /// called. /// /// event event System.EventHandler Closing; /// /// This event is fired when the /// Db4objects.Db4o.IObjectContainer /// has /// finished its startup procedure. /// /// event event System.EventHandler Opened; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/ObjectInfoEventArgs.cs0000644000175000017500000000114411700531646030463 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Events { public class ObjectInfoEventArgs : ObjectEventArgs { private readonly IObjectInfo _info; public ObjectInfoEventArgs(Transaction transaction, IObjectInfo info) : base(transaction ) { _info = info; } public override object Object { get { return _info.GetObject(); } } public virtual IObjectInfo Info { get { return _info; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/QueryEventArgs.cs0000644000175000017500000000203111700531646027542 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Events; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Events { /// /// Arguments for /// Db4objects.Db4o.Query.IQuery /// related events. /// /// IEventRegistry public class QueryEventArgs : TransactionalEventArgs { private IQuery _query; /// /// Creates a new instance for the specified /// Db4objects.Db4o.Query.IQuery /// instance. /// public QueryEventArgs(Transaction transaction, IQuery q) : base(transaction) { _query = q; } /// /// The /// Db4objects.Db4o.Query.IQuery /// which triggered the event. /// public virtual IQuery Query { get { return _query; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Events/ClassEventArgs.cs0000644000175000017500000000067011700531646027511 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Events { public class ClassEventArgs : EventArgs { private Db4objects.Db4o.Internal.ClassMetadata _clazz; public ClassEventArgs(Db4objects.Db4o.Internal.ClassMetadata clazz) { _clazz = clazz; } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _clazz; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/IEmbeddedObjectContainer.cs0000644000175000017500000000327411700531646030160 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; namespace Db4objects.Db4o { /// /// Represents a local ObjectContainer attached to a /// database file. /// /// /// Represents a local ObjectContainer attached to a /// database file. /// /// 7.10 public interface IEmbeddedObjectContainer : IObjectContainer { /// backs up a database file of an open ObjectContainer. /// /// backs up a database file of an open ObjectContainer. ///

While the backup is running, the ObjectContainer can continue to be /// used. Changes that are made while the backup is in progress, will be applied to /// the open ObjectContainer and to the backup.

/// While the backup is running, the ObjectContainer should not be closed.

/// If a file already exists at the specified path, it will be overwritten.

/// The /// Db4objects.Db4o.IO.IStorage /// used for backup is the one configured for this container. ///
/// a fully qualified path /// db4o database file was closed or failed to open. /// /// /// is thrown when the operation is not supported in current /// configuration/environment /// /// I/O operation failed or was unexpectedly interrupted. /// void Backup(string path); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Db4oEmbedded.cs0000644000175000017500000001215511700531646025564 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; namespace Db4objects.Db4o { /// Factory class to open db4o instances in embedded /// mode. /// Factory class to open db4o instances in embedded mode. /// /// Db4objects.Db4o.CS.Db4oClientServer in /// Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o /// clients. /// 7.5 public class Db4oEmbedded { /// /// Creates a fresh /// IEmbeddedConfiguration /// instance. /// /// a fresh, independent configuration with all options set to their default values /// public static IEmbeddedConfiguration NewConfiguration() { return new EmbeddedConfigurationImpl(Db4oFactory.NewConfiguration()); } /// /// opens an /// IObjectContainer /// on the specified database file for local use. ///
///
/// A database file can only be opened once, subsequent attempts to /// open another /// IObjectContainer /// against the same file will result in a /// DatabaseFileLockedException /// . ///
///
/// Database files can only be accessed for readwrite access from one /// process at one time. All versions except for db4o mobile edition /// use an internal mechanism to lock the database file for other /// processes. ///
///
///
/// /// a custom /// IConfiguration /// instance to be obtained via /// newConfiguration /// /// an absolute or relative path to the database /// file /// /// an open /// IObjectContainer /// /// /// Db4objects.Db4o.Config.IConfiguration.ReadOnly /// Db4objects.Db4o.Config.IConfiguration.Encrypt /// /// /// Db4objects.Db4o.Config.IConfiguration.Password /// I/O operation failed or was unexpectedly /// interrupted. /// the required database file is locked by /// another process. /// /// runtime /// configuration /// is not compatible with the configuration of the database file. /// /// /// open operation failed because the database file is in old format /// and /// /// Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates /// is set to false. /// /// database was configured as read-only. /// public static IEmbeddedObjectContainer OpenFile(IEmbeddedConfiguration config, string databaseFileName) { if (null == config) { throw new ArgumentNullException(); } return ObjectContainerFactory.OpenObjectContainer(config, databaseFileName); } /// /// Same as calling /// OpenFile(Db4objects.Db4o.Config.IEmbeddedConfiguration, string) /// /// with a fresh configuration ( /// NewConfiguration() /// ). /// /// an absolute or relative path to the database file /// OpenFile(Db4objects.Db4o.Config.IEmbeddedConfiguration, string) /// /// /// /// /// /// public static IEmbeddedObjectContainer OpenFile(string databaseFileName) { return OpenFile(NewConfiguration(), databaseFileName); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/0000755000175000017500000000000011700531646025471 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/Internal/0000755000175000017500000000000011700531646027245 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/Internal/KeyValueHandlerPair.cs0000644000175000017500000000074711700531646033443 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers.Internal { /// public class KeyValueHandlerPair { public readonly ITypeHandler4 _keyHandler; public readonly ITypeHandler4 _valueHandler; public KeyValueHandlerPair(ITypeHandler4 keyHandler, ITypeHandler4 valueHandler) { _keyHandler = keyHandler; _valueHandler = valueHandler; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/ITypeHandlerPredicate.cs0000644000175000017500000000154311700531646032174 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Typehandlers { /// /// Predicate to be able to select if a specific TypeHandler is /// applicable for a specific Type. /// /// /// Predicate to be able to select if a specific TypeHandler is /// applicable for a specific Type. /// public interface ITypeHandlerPredicate { /// /// return true if a TypeHandler is to be used for a specific /// Type /// /// /// the Type passed by db4o that is to /// be tested by this predicate. /// /// /// true if the TypeHandler is to be used for a specific /// Type. /// bool Match(IReflectClass classReflector); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/ITypeFamilyTypeHandler.cs0000644000175000017500000000046011700531646032354 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { /// public interface ITypeFamilyTypeHandler : IQueryableTypeHandler, ILinkLengthAware { } } SingleClassTypeHandlerPredicate.cs0000644000175000017500000000133011700531646034126 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { /// allows installing a Typehandler for a single class. /// allows installing a Typehandler for a single class. public sealed class SingleClassTypeHandlerPredicate : ITypeHandlerPredicate { private readonly Type _class; public SingleClassTypeHandlerPredicate(Type clazz) { _class = clazz; } public bool Match(IReflectClass candidate) { IReflectClass reflectClass = candidate.Reflector().ForClass(_class); return candidate == reflectClass; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/ICascadingTypeHandler.cs0000644000175000017500000000234511700531646032151 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { /// TypeHandler for objects with members. /// TypeHandler for objects with members. public interface ICascadingTypeHandler : ITypeHandler4 { /// /// will be called during activation if the handled /// object is already active /// /// void CascadeActivation(IActivationContext context); /// /// will be called during querying to ask for the handler /// to be used to collect children of the handled object /// /// /// ITypeHandler4 ReadCandidateHandler(QueryingReadContext context); /// /// will be called during querying to ask for IDs of member /// objects of the handled object. /// /// /// will be called during querying to ask for IDs of member /// objects of the handled object. /// /// void CollectIDs(QueryingReadContext context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/IQueryableTypeHandler.cs0000644000175000017500000000037111700531646032223 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { public interface IQueryableTypeHandler : ITypeHandler4 { bool DescendsIntoMembers(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/IValueTypeHandler.cs0000644000175000017500000000104511700531646031345 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { public interface IValueTypeHandler : ITypeHandler4 { /// gets called when an value type is to be read from the database. /// gets called when an value type is to be read from the database. /// /// the read value type object Read(IReadContext context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/IgnoreFieldsTypeHandler.cs0000644000175000017500000000272511700531646032540 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { /// Typehandler that ignores all fields on a class public class IgnoreFieldsTypeHandler : IReferenceTypeHandler, ICascadingTypeHandler { public static readonly ITypeHandler4 Instance = new Db4objects.Db4o.Typehandlers.IgnoreFieldsTypeHandler (); private IgnoreFieldsTypeHandler() { } public virtual void Defragment(IDefragmentContext context) { } // do nothing /// public virtual void Delete(IDeleteContext context) { } // do nothing public virtual void Activate(IReferenceActivationContext context) { } public virtual void Write(IWriteContext context, object obj) { } public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { return null; } public virtual void CascadeActivation(IActivationContext context) { } // do nothing public virtual void CollectIDs(QueryingReadContext context) { } // do nothing public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/IReferenceTypeHandler.cs0000644000175000017500000000075211700531646032173 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { public interface IReferenceTypeHandler : ITypeHandler4 { /// gets called when an object is to be activated. /// gets called when an object is to be activated. /// void Activate(IReferenceActivationContext context); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/MapTypeHandler.cs0000644000175000017500000001152411700531646030700 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; using Db4objects.Db4o.Typehandlers.Internal; namespace Db4objects.Db4o.Typehandlers { /// Typehandler for classes that implement IDictionary. /// Typehandler for classes that implement IDictionary. public class MapTypeHandler : IReferenceTypeHandler, ICascadingTypeHandler, IVariableLengthTypeHandler { public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { // TODO Auto-generated method stub return null; } public virtual void Write(IWriteContext context, object obj) { IDictionary map = (IDictionary)obj; KeyValueHandlerPair handlers = DetectKeyValueTypeHandlers(Container(context), map ); WriteClassMetadataIds(context, handlers); WriteElementCount(context, map); WriteElements(context, map, handlers); } public virtual void Activate(IReferenceActivationContext context) { UnmarshallingContext unmarshallingContext = (UnmarshallingContext)context; IDictionary map = (IDictionary)unmarshallingContext.PersistentObject(); map.Clear(); KeyValueHandlerPair handlers = ReadKeyValueTypeHandlers(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { object key = unmarshallingContext.ReadFullyActivatedObjectForKeys(handlers._keyHandler ); if (key == null && !unmarshallingContext.LastReferenceReadWasReallyNull()) { continue; } object value = context.ReadObject(handlers._valueHandler); map[key] = value; } } private void WriteElementCount(IWriteContext context, IDictionary map) { context.WriteInt(map.Count); } private void WriteElements(IWriteContext context, IDictionary map, KeyValueHandlerPair handlers) { IEnumerator elements = map.Keys.GetEnumerator(); while (elements.MoveNext()) { object key = elements.Current; context.WriteObject(handlers._keyHandler, key); context.WriteObject(handlers._valueHandler, map[key]); } } private ObjectContainerBase Container(IContext context) { return ((IInternalObjectContainer)context.ObjectContainer()).Container; } /// public virtual void Delete(IDeleteContext context) { if (!context.CascadeDelete()) { return; } KeyValueHandlerPair handlers = ReadKeyValueTypeHandlers(context, context); int elementCount = context.ReadInt(); for (int i = elementCount; i > 0; i--) { handlers._keyHandler.Delete(context); handlers._valueHandler.Delete(context); } } public virtual void Defragment(IDefragmentContext context) { KeyValueHandlerPair handlers = ReadKeyValueTypeHandlers(context, context); int elementCount = context.ReadInt(); for (int i = elementCount; i > 0; i--) { context.Defragment(handlers._keyHandler); context.Defragment(handlers._valueHandler); } } public void CascadeActivation(IActivationContext context) { IDictionary map = (IDictionary)context.TargetObject(); IEnumerator keys = (map).Keys.GetEnumerator(); while (keys.MoveNext()) { object key = keys.Current; context.CascadeActivationToChild(key); context.CascadeActivationToChild(map[key]); } } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return this; } public virtual void CollectIDs(QueryingReadContext context) { KeyValueHandlerPair handlers = ReadKeyValueTypeHandlers(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { context.ReadId(handlers._keyHandler); context.SkipId(handlers._valueHandler); } } private void WriteClassMetadataIds(IWriteContext context, KeyValueHandlerPair handlers ) { context.WriteInt(0); context.WriteInt(0); } private KeyValueHandlerPair ReadKeyValueTypeHandlers(IReadBuffer buffer, IContext context) { buffer.ReadInt(); buffer.ReadInt(); ITypeHandler4 untypedHandler = (ITypeHandler4)Container(context).Handlers.OpenTypeHandler (); return new KeyValueHandlerPair(untypedHandler, untypedHandler); } private KeyValueHandlerPair DetectKeyValueTypeHandlers(IInternalObjectContainer container , IDictionary map) { ITypeHandler4 untypedHandler = (ITypeHandler4)container.Handlers.OpenTypeHandler( ); return new KeyValueHandlerPair(untypedHandler, untypedHandler); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/CollectionTypeHandler.cs0000755000175000017500000001023111700531646032253 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { /// TypeHandler for Collections. /// /// TypeHandler for Collections. /// On the .NET side, usage is restricted to instances of IList. /// public partial class CollectionTypeHandler : IReferenceTypeHandler, ICascadingTypeHandler , IVariableLengthTypeHandler, IQueryableTypeHandler { public virtual IPreparedComparison PrepareComparison(IContext context, object obj ) { // TODO Auto-generated method stub return null; } public virtual void Write(IWriteContext context, object obj) { ICollection collection = (ICollection)obj; ITypeHandler4 elementHandler = DetectElementTypeHandler(Container(context), collection ); WriteElementClassMetadataId(context, elementHandler); WriteElementCount(context, collection); WriteElements(context, collection, elementHandler); } public virtual void Activate(IReferenceActivationContext context) { ICollection collection = (ICollection)((UnmarshallingContext)context).PersistentObject (); ClearCollection(collection); ITypeHandler4 elementHandler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { object element = context.ReadObject(elementHandler); AddToCollection(collection, element); } } private void WriteElementCount(IWriteContext context, ICollection collection) { context.WriteInt(collection.Count); } private void WriteElements(IWriteContext context, ICollection collection, ITypeHandler4 elementHandler) { IEnumerator elements = collection.GetEnumerator(); while (elements.MoveNext()) { context.WriteObject(elementHandler, elements.Current); } } private ObjectContainerBase Container(IContext context) { return ((IInternalObjectContainer)context.ObjectContainer()).Container; } /// public virtual void Delete(IDeleteContext context) { if (!context.CascadeDelete()) { return; } ITypeHandler4 handler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = elementCount; i > 0; i--) { handler.Delete(context); } } public virtual void Defragment(IDefragmentContext context) { ITypeHandler4 handler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { handler.Defragment(context); } } public void CascadeActivation(IActivationContext context) { IEnumerator all = ((ICollection)context.TargetObject()).GetEnumerator(); while (all.MoveNext()) { context.CascadeActivationToChild(all.Current); } } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return this; } public virtual void CollectIDs(QueryingReadContext context) { ITypeHandler4 elementHandler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { context.ReadId(elementHandler); } } private void WriteElementClassMetadataId(IWriteContext context, ITypeHandler4 elementHandler ) { context.WriteInt(0); } private ITypeHandler4 ReadElementTypeHandler(IReadBuffer buffer, IContext context ) { buffer.ReadInt(); return (ITypeHandler4)Container(context).Handlers.OpenTypeHandler(); } private ITypeHandler4 DetectElementTypeHandler(IInternalObjectContainer container , ICollection collection) { return (ITypeHandler4)container.Handlers.OpenTypeHandler(); } public virtual bool DescendsIntoMembers() { return true; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/IActivationContext.cs0000644000175000017500000000122111700531646031573 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { public interface IActivationContext : IContext { void CascadeActivationToTarget(); void CascadeActivationToChild(object obj); ObjectContainerBase Container(); object TargetObject(); Db4objects.Db4o.Internal.ClassMetadata ClassMetadata(); IActivationDepth Depth(); IActivationContext ForObject(object newTargetObject); IActivationContext Descend(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/IInstantiatingTypeHandler.cs0000644000175000017500000000217311700531646033110 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { public interface IInstantiatingTypeHandler : IReferenceTypeHandler { object Instantiate(IReadContext context); /// gets called when an object is to be written to the database. /// /// gets called when an object is to be written to the database. /// The method must only write data necessary to re instantiate the object, usually /// the immutable bits of information held by the object. For value /// types that means their complete state. /// Mutable state (only allowed in reference types) must be handled /// during /// IReferenceTypeHandler.Activate(Db4objects.Db4o.Marshall.IReferenceActivationContext) /// /// /// /// the object void WriteInstantiation(IWriteContext context, object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o/Typehandlers/ITypeHandler4.cs0000644000175000017500000000324511700531646030440 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Typehandlers { /// /// handles reading, writing, deleting, defragmenting and /// comparisons for types of objects.

/// Custom Typehandlers can be implemented to alter the default /// behaviour of storing all non-transient fields of an object.

///
/// /// /// Db4objects.Db4o.Config.IConfiguration.RegisterTypeHandler(ITypeHandlerPredicate, ITypeHandler4) /// /// /// public interface ITypeHandler4 { /// gets called when an object gets deleted. /// gets called when an object gets deleted. /// /// Db4objects.Db4o.Ext.Db4oIOException /// void Delete(IDeleteContext context); /// gets called when an object gets defragmented. /// gets called when an object gets defragmented. /// void Defragment(IDefragmentContext context); /// gets called when an object is to be written to the database. /// gets called when an object is to be written to the database. /// /// the object void Write(IWriteContext context, object obj); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o-2010.csproj0000644000175000017500000021742712652472053024651 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Library Properties Db4objects.Db4o Db4objects.Db4o v4.5 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;NET_3_5;NET_4_0;MONO prompt 4 bin\Debug\Db4objects.Db4o.xml 1591;1572;1573;1574;0419 full true bin\Release\ TRACE;NET_3_5;NET_4_0;MONO prompt 4 1591;1572;1573;1574;0419 bin\Release\Db4objects.Db4o.xml true 3.5 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/0000755000175000017500000000000011700531646021543 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/0000755000175000017500000000000011700531646023143 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Collections.cs0000644000175000017500000000231711700531646025753 0ustar00meebeymeebey00000000000000 using System.Collections; using System.Collections.Generic; namespace Sharpen { public class Collections { public static void AddAll(System.Collections.IList list, System.Collections.IEnumerable added) { foreach (object o in added) { list.Add(o); } } public static bool AddAll(ICollection list, System.Collections.Generic.IEnumerable added) { foreach (T o in added) { list.Add(o); } return true; } public static object Remove(IDictionary dictionary, object key) { object removed = dictionary[key]; dictionary.Remove(key); return removed; } public static object[] ToArray(ICollection collection) { object[] result = new object[collection.Count]; collection.CopyTo(result, 0); return result; } public static T[] ToArray(ICollection collection, T[] result) { collection.CopyTo(result, 0); return result; } public static T[] ToArray(ICollection collection, T[] result) { collection.CopyTo(result, 0); return result; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/0000755000175000017500000000000011700531646023452 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/RandomAccessFile.cs0000644000175000017500000000453311700531646027150 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using System.IO; using System.Runtime.InteropServices; namespace Sharpen.IO { public class RandomAccessFile { private readonly FileStream _stream; #if !CF && !MONO && !SILVERLIGHT #if NET_4_0 [System.Security.SecuritySafeCritical] #endif [DllImport("kernel32.dll", SetLastError = true)] static extern int FlushFileBuffers(Microsoft.Win32.SafeHandles.SafeFileHandle fileHandle); #endif public RandomAccessFile(String file, bool readOnly, bool lockFile) { _stream = new FileStream(file, FileMode.OpenOrCreate, readOnly ? FileAccess.Read : FileAccess.ReadWrite, lockFile ? FileShare.None : FileShare.ReadWrite ); } public RandomAccessFile(String file, String fileMode) : this(file, fileMode.Equals("r"), true) { } public FileStream Stream { get { return _stream; } } public void Close() { _stream.Close(); } public long Length() { return _stream.Length; } public int Read(byte[] bytes, int offset, int length) { return _stream.Read(bytes, offset, length); } public void Read(byte[] bytes) { _stream.Read(bytes, 0, bytes.Length); } public void Seek(long pos) { _stream.Seek(pos, SeekOrigin.Begin); } #if NET_4_0 [System.Security.SecuritySafeCritical] #endif public void Sync() { _stream.Flush(); #if !CF && !MONO && !SILVERLIGHT FlushFileBuffers(_stream.SafeFileHandle); #endif } public RandomAccessFile GetFD() { return this; } public void Write(byte[] bytes) { Write(bytes, 0, bytes.Length); } public void Write(byte[] bytes, int offset, int length) { try { _stream.Write(bytes, offset, length); } catch (NotSupportedException e) { throw new IOException("Not supported", e); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/IOutputStream.cs0000644000175000017500000000032111700531646026562 0ustar00meebeymeebey00000000000000namespace Sharpen.IO { public interface IOutputStream { void Write(int i); void Write(byte[] bytes); void Write(byte[] bytes, int offset, int length); void Flush(); void Close(); } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/IFilenameFilter.cs0000644000175000017500000000023311700531646026776 0ustar00meebeymeebey00000000000000using System; namespace Sharpen.IO { public interface IFilenameFilter { bool Accept(Sharpen.IO.File dir, String name); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/ByteArrayInputStream.cs0000644000175000017500000000042511700531646030100 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.IO; namespace Sharpen.IO { public class ByteArrayInputStream : InputStream { public ByteArrayInputStream(byte[] initial) : base(new MemoryStream(initial)) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/StreamAdaptor.cs0000644000175000017500000000057311700531646026554 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System.IO; namespace Sharpen.IO { public abstract class StreamAdaptor { protected readonly Stream _stream; public StreamAdaptor(Stream stream) { _stream = stream; } public Stream UnderlyingStream { get { return _stream; } } public void Close() { _stream.Close(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/OutputStream.cs0000644000175000017500000000110211700531646026447 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System.IO; namespace Sharpen.IO { public class OutputStream : StreamAdaptor, IOutputStream { public OutputStream(Stream stream) : base(stream) { } public void Write(int i) { _stream.WriteByte((byte)i); } public void Write(byte[] bytes) { _stream.Write(bytes, 0, bytes.Length); } public void Write(byte[] bytes, int offset, int length) { _stream.Write(bytes, offset, length); } public void Flush() { _stream.Flush(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/IInputStream.cs0000644000175000017500000000027011700531646026364 0ustar00meebeymeebey00000000000000namespace Sharpen.IO { public interface IInputStream { int Read(); int Read(byte[] bytes); int Read(byte[] bytes, int offset, int length); void Close(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/InputStream.cs0000644000175000017500000000120311700531646026250 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System.IO; namespace Sharpen.IO { public class InputStream : StreamAdaptor, IInputStream { public InputStream(Stream stream) : base(stream) { } public int Read() { return _stream.ReadByte(); } public int Read(byte[] bytes) { return Read(bytes, 0, bytes.Length); } public int Read(byte[] bytes, int offset, int length) { return TranslateReadReturnValue(_stream.Read(bytes, offset, length)); } internal static int TranslateReadReturnValue(int read) { return (0 == read) ? -1 : read; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/FileInputStream.cs0000644000175000017500000000045711700531646027062 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.IO; namespace Sharpen.IO { public class FileInputStream : InputStream { public FileInputStream(File file) : base(new FileStream(file.GetPath(), FileMode.Open, FileAccess.Read)) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/ByteArrayOutputStream.cs0000644000175000017500000000124311700531646030300 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.IO; namespace Sharpen.IO { public class ByteArrayOutputStream : OutputStream { public ByteArrayOutputStream() : base(new MemoryStream()) { } public ByteArrayOutputStream(int size) : base(new MemoryStream(size)) { } public int Size() { return (int)Stream.Length; } public void WriteTo(OutputStream stream) { Stream.WriteTo(stream.UnderlyingStream); } public byte[] ToByteArray() { return Stream.ToArray(); } private MemoryStream Stream { get { return (MemoryStream)UnderlyingStream; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/BufferedOutputStream.cs0000644000175000017500000000136211700531646030122 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; namespace Sharpen.IO { public class BufferedOutputStream : IOutputStream { private IOutputStream _stream; public BufferedOutputStream(IOutputStream stream) { _stream = stream; } public BufferedOutputStream(IOutputStream stream, int bufferSize) { _stream = stream; } public void Write(int i) { _stream.Write(i); } public void Write(byte[] bytes) { _stream.Write(bytes); } public void Write(byte[] bytes, int offset, int length) { _stream.Write(bytes, offset, length); } public void Flush() { _stream.Flush(); } public void Close() { _stream.Close(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/FileOutputStream.cs0000644000175000017500000000046511700531646027262 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.IO; namespace Sharpen.IO { public class FileOutputStream : OutputStream { public FileOutputStream(File file) : base(new FileStream(file.GetPath(), FileMode.Create, FileAccess.Write)) { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/BufferedInputStream.cs0000644000175000017500000000127111700531646027720 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; namespace Sharpen.IO { public class BufferedInputStream : IInputStream { private IInputStream _stream; public BufferedInputStream(IInputStream stream) { _stream = stream; } public BufferedInputStream(IInputStream stream, int bufferSize) { _stream = stream; } public int Read() { return _stream.Read(); } public int Read(byte[] bytes) { return _stream.Read(bytes); } public int Read(byte[] bytes, int offset, int length) { return _stream.Read(bytes, offset, length); } public void Close() { _stream.Close(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/IO/File.cs0000644000175000017500000000626111700531646024665 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Collections.Generic; using System.IO; using Db4objects.Db4o.IO; namespace Sharpen.IO { public class File { public static readonly char separatorChar = Path.DirectorySeparatorChar; public static readonly string separator = separatorChar.ToString(); private readonly string _path; public File(string path) { _path = path; } public static implicit operator string(File file) { return file.GetAbsolutePath(); } public File(string dir, string file) { _path = dir == null ? file : Path.Combine(dir, file); } public virtual bool Delete() { #if SILVERLIGHT return SilverlightIO.Delete(_path); #else if (Exists()) { System.IO.File.Delete(_path); return !Exists(); } return false; #endif } public bool Exists() { #if CF string path = RemoveTrailingSlash(_path); #elif SILVERLIGHT string path = _path; return SilverlightIO.Exists(path); #else string path = _path; #endif return System.IO.File.Exists(path) || Directory.Exists(path); } private static string RemoveTrailingSlash(string path) { return (path.EndsWith("\\") || path.EndsWith("/")) ? path.Remove(path.Length - 1, 1) : path; } public string GetCanonicalPath() { return Path.GetFullPath(_path); } public File GetCanonicalFile() { return new File(GetCanonicalPath()); } public string GetAbsolutePath() { #if SILVERLIGHT return _path; #else return Path.GetFullPath(_path); #endif } public string GetName() { int index = _path.LastIndexOf(separator); return _path.Substring(index + 1); } public string GetPath() { return _path; } public bool IsDirectory() { #if CF || SILVERLIGHT return Exists(); #else return (System.IO.File.GetAttributes(_path) & FileAttributes.Directory) != 0; #endif } public long Length() { #if SILVERLIGHT return SilverlightIO.Length(_path); #else return new FileInfo(_path).Length; #endif } public string[] List() { #if SILVERLIGHT throw new NotImplementedException(); #else return Directory.GetFiles(_path); #endif } public bool Mkdir() { if (Exists()) { return false; } Directory.CreateDirectory(_path); return Exists(); } public bool Mkdirs() { if (Exists()) { return false; } int pos = _path.LastIndexOf(separator); if (pos > 0) { new File(_path.Substring(0, pos)).Mkdirs(); } return Mkdir(); } public void RenameTo(File file) { new FileInfo(_path).MoveTo(file.GetPath()); } public File[] ListFiles(IFilenameFilter filter) { String[] ss = List(); if (ss == null) return null; List v = new List(); for (int i = 0; i < ss.Length; i++) { if ((filter == null) || filter.Accept(this, ss[i])) { v.Add(new File(ss[i], this)); } } return v.ToArray(); } public override string ToString() { return _path; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Text/0000755000175000017500000000000011700531646024067 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Text/DecimalFormat.cs0000644000175000017500000000067711700531646027137 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; namespace Sharpen.Text { public class DecimalFormat { private string _format; public DecimalFormat(string format) { _format = format; } public string Format(double number) { Double temp = (Double)number; return temp.ToString(_format); } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Net/0000755000175000017500000000000011700531646023671 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Net/Socket.cs0000644000175000017500000000632611700531646025457 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.IO; using System.Net; using Sharpen.IO; using NativeSocket=System.Net.Sockets.Socket; using System.Net.Sockets; namespace Sharpen.Net { public class Socket : SocketWrapper { #if SILVERLIGHT public Socket(string hostName, int port) { } } #else public Socket(string hostName, int port) { NativeSocket socket = new NativeSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(new IPEndPoint(Resolve(hostName), port)); Initialize(socket); _toString = StringRepresentation(); } private static IPAddress Resolve(string hostName) { IPHostEntry found = Dns.GetHostEntry(hostName); foreach (IPAddress address in found.AddressList) { if (address.AddressFamily == AddressFamily.InterNetwork) { return address; } } throw new IOException("couldn't find suitable address for name '" + hostName + "'"); } public Socket(NativeSocket socket) { Initialize(socket); } public IInputStream GetInputStream() { return _in; } public IOutputStream GetOutputStream() { return _out; } public int GetPort() { return ((IPEndPoint) _delegate.RemoteEndPoint).Port; } override protected void Initialize(NativeSocket socket) { base.Initialize(socket); NetworkStream stream = new NetworkStream(_delegate); #if CF _in = new SocketInputStream(this); #else _in = new InputStream(stream); #endif _out = new OutputStream(stream); } public override string ToString() { return _toString; } private string StringRepresentation() { return ((IPEndPoint)_delegate.LocalEndPoint).Port + " => "+ UnderlyingSocket.RemoteEndPoint; } private IInputStream _in; private IOutputStream _out; private readonly string _toString; } #if CF internal class SocketInputStream : IInputStream { private readonly Socket _socket; public SocketInputStream(Socket socket) { _socket = socket; } public int Read() { byte[] buffer = new byte[1]; if (1 != Read(buffer)) { return -1; } return (int) buffer[0]; } public int Read(byte[] bytes) { return Read(bytes, 0, bytes.Length); } public int Read(byte[] bytes, int offset, int length) { try { if (_socket.SoTimeout > 0) { if (!UnderlyingSocket.Poll(_socket.SoTimeout*1000, SelectMode.SelectRead)) { throw new IOException("read timeout"); } } return InputStream.TranslateReadReturnValue( UnderlyingSocket.Receive(bytes, offset, length, SocketFlags.None)); } catch (ObjectDisposedException x) { throw new IOException(x.Message, x); } catch (SocketException x) { throw new IOException(x.Message, x); } } public void Close() { // nothing to do } private System.Net.Sockets.Socket UnderlyingSocket { get { return _socket.UnderlyingSocket; } } } #endif // CF #endif // SILVERLIGHT } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Net/ServerSocket.cs0000644000175000017500000000173411700531646026644 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.Net; using System.Net.Sockets; using NativeSocket=System.Net.Sockets.Socket; namespace Sharpen.Net { public class ServerSocket : SocketWrapper { public ServerSocket(int port) { #if !SILVERLIGHT try { NativeSocket socket = new NativeSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(new IPEndPoint(IPAddress.Any, port)); int maxPendingConnections = 42; socket.Listen(maxPendingConnections); Initialize(socket); } catch (SocketException e) { throw new System.IO.IOException(e.Message); } #endif } #if !SILVERLIGHT public Socket Accept() { return new Socket(_delegate.Accept()); } public int GetLocalPort() { return ((IPEndPoint)_delegate.LocalEndPoint).Port; } #endif } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Net/SocketWrapper.cs0000644000175000017500000000224311700531646027012 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.Net.Sockets; using NativeSocket=System.Net.Sockets.Socket; namespace Sharpen.Net { public class SocketWrapper { protected NativeSocket _delegate; #if CF || SILVERLIGHT private int _soTimeout = 0; public int SoTimeout { get { return _soTimeout; } } #endif public NativeSocket UnderlyingSocket { get { return _delegate; } } protected virtual void Initialize(NativeSocket socket) { _delegate = socket; } public void SetSoTimeout(int timeout) { #if !CF && !SILVERLIGHT _delegate.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout); _delegate.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, timeout); #else _soTimeout = timeout; #endif } public void Close() { if (_delegate.Connected) { try { _delegate.Shutdown(SocketShutdown.Both); } catch (Exception) { } } _delegate.Close(); } public bool IsConnected() { return _delegate.Connected; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/0000755000175000017500000000000011700531646024024 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/Runnable.cs0000644000175000017500000000021111700531646026113 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ namespace Sharpen.Lang { public interface IRunnable { void Run(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/TypeReference.cs0000644000175000017500000001523211700531646027116 0ustar00meebeymeebey00000000000000/* Copyright (C) 2005 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using System.Text; namespace Sharpen.Lang { public abstract class TypeReference { public static TypeReference FromString(string s) { if (null == s) throw new ArgumentNullException("s"); return new TypeReferenceParser(s).Parse(); } public static TypeReference FromType(Type type) { if (null == type) throw new ArgumentNullException("type"); return FromString(type.AssemblyQualifiedName); } public abstract string SimpleName { get; } public abstract AssemblyName AssemblyName { get; } public abstract Type Resolve(); public abstract void AppendTypeName(StringBuilder builder); public override string ToString() { return GetUnversionedName(); } public string GetUnversionedName() { StringBuilder builder = new StringBuilder(); AppendUnversionedName(builder); return builder.ToString(); } internal virtual void AppendUnversionedName(StringBuilder builder) { AppendTypeName(builder); AppendUnversionedAssemblyName(builder); } protected void AppendUnversionedAssemblyName(StringBuilder builder) { AssemblyName assemblyName = AssemblyName; if (null == assemblyName) return; builder.Append(", "); builder.Append(assemblyName.Name); } } public partial class SimpleTypeReference : TypeReference { protected string _simpleName; protected AssemblyName _assemblyName; internal SimpleTypeReference(string simpleName) { _simpleName = simpleName; } public override string SimpleName { get { return _simpleName; } } public override AssemblyName AssemblyName { get { return _assemblyName; } } public override Type Resolve() { return _assemblyName == null ? Type.GetType(SimpleName) : ResolveAssembly().GetType(SimpleName); } public override void AppendTypeName(StringBuilder builder) { builder.Append(SimpleName); } public override bool Equals(object obj) { SimpleTypeReference other = obj as SimpleTypeReference; if (null == other) return false; return _simpleName == other._simpleName; } internal void SetSimpleName(string simpleName) { _simpleName = simpleName; } internal void SetAssemblyName(AssemblyName assemblyName) { _assemblyName = assemblyName; } private Assembly ResolveAssembly() { #if SILVERLIGHT return ResolveAssemblySilverlight(); #else if (null == _assemblyName.Version) { return LoadUnversionedAssembly(_assemblyName); } Assembly found; try { found = Assembly.Load(_assemblyName); } catch (Exception) { AssemblyName unversioned = (AssemblyName)_assemblyName.Clone(); unversioned.Version = null; found = LoadUnversionedAssembly(unversioned); } return found; #endif } private Assembly LoadUnversionedAssembly(AssemblyName unversioned) { #if CF || SILVERLIGHT return Assembly.Load(unversioned); #else Assembly found = Assembly.LoadWithPartialName(unversioned.FullName); return found == null ? Assembly.Load(unversioned) : found; #endif } } public abstract class QualifiedTypeReference : TypeReference { protected TypeReference _elementType; protected QualifiedTypeReference(TypeReference elementType) { _elementType = elementType; } public override string SimpleName { get { return _elementType.SimpleName; } } public override AssemblyName AssemblyName { get { return _elementType.AssemblyName; } } public override void AppendTypeName(StringBuilder builder) { _elementType.AppendTypeName(builder); AppendQualifier(builder); } protected abstract void AppendQualifier(StringBuilder builder); } public class PointerTypeReference : QualifiedTypeReference { public PointerTypeReference(TypeReference elementType) : base(elementType) { } protected override void AppendQualifier(StringBuilder builder) { builder.Append('*'); } public override Type Resolve() { #if !CF return _elementType.Resolve().MakePointerType(); #else StringBuilder builder = new StringBuilder(); AppendTypeName(builder); return _elementType.Resolve().Assembly.GetType(builder.ToString(), true); #endif } } public class ArrayTypeReference : QualifiedTypeReference { public static Type MakeArrayType(Type elementType, int rank) { #if !CF if (rank == 1) return elementType.MakeArrayType(); return elementType.MakeArrayType(rank); #else if (rank == 1) return Array.CreateInstance(elementType, 0).GetType(); return Array.CreateInstance(elementType, new int[rank]).GetType(); #endif } private readonly int _rank; internal ArrayTypeReference(TypeReference elementType, int rank) : base(elementType) { _rank = rank; } public int Rank { get { return _rank; } } public override Type Resolve() { return MakeArrayType(_elementType.Resolve(), _rank); } protected override void AppendQualifier(StringBuilder builder) { builder.Append('['); for (int i = 1; i < _rank; ++i) { builder.Append(','); } builder.Append(']'); } } public class GenericTypeReference : SimpleTypeReference { private readonly TypeReference[] _genericArguments; internal GenericTypeReference(string simpleName, TypeReference[] genericArguments) : base(simpleName) { _genericArguments = genericArguments; } public TypeReference[] GenericArguments { get { return _genericArguments; } } public override Type Resolve() { Type baseType = base.Resolve(); return _genericArguments.Length > 0 ? baseType.MakeGenericType(Resolve(_genericArguments)) : baseType; } static Type[] Resolve(TypeReference[] typeRefs) { Type[] types = new Type[typeRefs.Length]; for (int i = 0; i < types.Length; ++i) { types[i] = typeRefs[i].Resolve(); } return types; } public override void AppendTypeName(StringBuilder builder) { builder.Append(_simpleName); AppendUnversionedGenericArguments(builder); } private void AppendUnversionedGenericArguments(StringBuilder builder) { if (_genericArguments.Length == 0) return; builder.Append("["); for (int i = 0; i < _genericArguments.Length; ++i) { if (i > 0) builder.Append(", "); builder.Append("["); _genericArguments[i].AppendUnversionedName(builder); builder.Append("]"); } builder.Append("]"); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/Thread.cs0000644000175000017500000000457611700531646025576 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Threading; namespace Sharpen.Lang { public class Thread : IRunnable { private IRunnable _target; private string _name; private System.Threading.Thread _thread; private bool _isDaemon; public Thread() { _target = this; } public Thread(IRunnable target, string name) { _target = target; SetName(name); } public Thread(IRunnable target) { _target = target; } public Thread(System.Threading.Thread thread) { _thread = thread; } public static Thread CurrentThread() { return new Thread(System.Threading.Thread.CurrentThread); } public virtual void Run() { } public void SetName(string name) { _name = name; #if !CF if (_thread != null && name != null) { try { _thread.Name = _name; } catch { } } #endif } public string GetName() { #if !CF return _thread != null ? _thread.Name : _name; #else return ""; #endif } public static void Sleep(long milliseconds) { System.Threading.Thread.Sleep((int)milliseconds); } public void Start() { _thread = new System.Threading.Thread(EntryPoint); _thread.IsBackground = _isDaemon; if (_name != null) { SetName(_name); } _thread.Start(); } public void Join() { if (_thread == null) return; _thread.Join(); } public void Join(int millisecondsTimeout) { if (_thread == null) return; _thread.Join(millisecondsTimeout); } public void SetDaemon(bool isDaemon) { _isDaemon = isDaemon; } public override bool Equals(object obj) { Thread other = (obj as Thread); if (other == null) return false; if (other == this) return true; if (_thread == null) return false; return _thread == other._thread; } public override int GetHashCode() { return _thread == null ? 37 : _thread.GetHashCode(); } private void EntryPoint() { try { _target.Run(); } catch (Exception e) { // don't let an unhandled exception bring // the process down Runtime.PrintStackTrace(e); } } public bool IsDaemon() { return _thread != null ? _thread.IsBackground : _isDaemon; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/SimpleTypeReference.Silverlight.cs0000644000175000017500000000463511700531646032570 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System; using System.Collections.Generic; using System.Reflection; using System.Threading; using System.Windows; using System.Windows.Resources; #endif namespace Sharpen.Lang { public partial class SimpleTypeReference { #if SILVERLIGHT private Assembly ResolveAssemblySilverlight() { if (!_assemblyCache.Contains(_assemblyName.Name)) { Assembly assembly = IsInUIThread() ? LoadAssembly(_assemblyName.Name) : LoadAssemblyInUIThread(_assemblyName.Name); _assemblyCache[_assemblyName.Name] = assembly; return assembly; } return _assemblyCache[_assemblyName.Name]; } private static bool IsInUIThread() { return Deployment.Current.CheckAccess(); } private static Assembly LoadAssemblyInUIThread(string assemblyName) { Assembly assembly = null; using (EventWaitHandle wait = new ManualResetEvent(false)) { Deployment.Current.Dispatcher.BeginInvoke(delegate { assembly = LoadAssembly(assemblyName); wait.Set(); }); wait.WaitOne(); } return assembly; } private static Assembly LoadAssembly(string assemblyName) { StreamResourceInfo resourceInfo = Application.GetResourceStream(AssemblyUriFor(assemblyName)); return new AssemblyPart().Load(resourceInfo.Stream); } private static Uri AssemblyUriFor(string assemblyName) { return new Uri(assemblyName + ".dll", UriKind.Relative); } private static readonly AssemblyCache _assemblyCache = new AssemblyCache(typeof(Type).Assembly); } sealed class AssemblyCache { public AssemblyCache(params Assembly[] preCachedAssemblies) { foreach (var assembly in preCachedAssemblies) { _cache[new AssemblyName(assembly.FullName).Name] = assembly; } } public Assembly this[string assemblyName] { get { return _cache[assemblyName]; } set { _cache[assemblyName] = value; } } public bool Contains(string assemblyName) { return _cache.ContainsKey(assemblyName); } private IDictionary _cache = new Dictionary(); #endif } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/Reflect.cs0000755000175000017500000000031011700531646025734 0ustar00meebeymeebey00000000000000namespace Sharpen.Lang.Reflect { // this namespace just exists because of a bug // in sharpen that makes it fail to realize that // a mapped namespace is not being used class __fixme__ { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/TypeReferenceParser.cs0000644000175000017500000001346211700531646030276 0ustar00meebeymeebey00000000000000/* Copyright (C) 2005 Versant Inc. http://www.db4o.com */ using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; namespace Sharpen.Lang { internal class TypeReferenceParser { private readonly TypeReferenceLexer _lexer; private readonly Stack _stack = new Stack(); public TypeReferenceParser(string input) { _lexer = new TypeReferenceLexer(input); } public TypeReference Parse() { SimpleTypeReference str = ParseSimpleTypeReference(); TypeReference returnValue = ParseQualifiedTypeReference(str); Token token = NextToken(); if (null != token) { switch (token.Kind) { case TokenKind.Comma: str.SetAssemblyName(ParseAssemblyName()); break; default: UnexpectedToken(TokenKind.Comma, token); break; } } return returnValue; } private TypeReference ParseQualifiedTypeReference(TypeReference elementType) { TypeReference returnValue = elementType; Token token; while (null != (token = NextToken())) { switch (token.Kind) { case TokenKind.LBrack: returnValue = ParseArrayTypeReference(returnValue); break; case TokenKind.PointerQualifier: returnValue = new PointerTypeReference(returnValue); break; default: Push(token); return returnValue; } } return returnValue; } private TypeReference ParseArrayTypeReference(TypeReference str) { int rank = 1; Token token = NextToken(); while (null != token && token.Kind == TokenKind.Comma) { ++rank; token = NextToken(); } AssertTokenKind(TokenKind.RBrack, token); return new ArrayTypeReference(str, rank); } private SimpleTypeReference ParseSimpleTypeReference() { Token id = Expect(TokenKind.Id); Token t = NextToken(); if (null == t) return new SimpleTypeReference(id.Value); while (TokenKind.NestedQualifier == t.Kind) { Token nestedId = Expect(TokenKind.Id); id.Value += "+" + nestedId.Value; t = NextToken(); if (null == t) return new SimpleTypeReference(id.Value); } if (t.Kind == TokenKind.GenericQualifier) { return ParseGenericTypeReference(id); } Push(t); return new SimpleTypeReference(id.Value); } private SimpleTypeReference ParseGenericTypeReference(Token id) { return InternalParseGenericTypeReference(id, 0); } private SimpleTypeReference InternalParseGenericTypeReference(Token id, int count) { Token argcToken = Expect(TokenKind.Number); id.Value += "`" + argcToken.Value; int argc = int.Parse(argcToken.Value); Token t = NextToken(); while (TokenKind.NestedQualifier == t.Kind) { Token nestedId = Expect(TokenKind.Id); id.Value += "+" + nestedId.Value; t = NextToken(); } if (IsInnerGenericTypeReference(t)) { return InternalParseGenericTypeReference(id, argc + count); } TypeReference[] args = new TypeReference[0]; if (!IsOpenGenericTypeDefinition(t)) { args = new TypeReference[argc + count]; AssertTokenKind(TokenKind.LBrack, t); for (int i = 0; i < args.Length; ++i) { if (i > 0) Expect(TokenKind.Comma); Expect(TokenKind.LBrack); args[i] = Parse(); Expect(TokenKind.RBrack); } Expect(TokenKind.RBrack); } else { Push(t); } return new GenericTypeReference(id.Value, args); } private static bool IsOpenGenericTypeDefinition(Token t) { return t.Kind != TokenKind.LBrack; } private static bool IsInnerGenericTypeReference(Token t) { return TokenKind.GenericQualifier == t.Kind; } public AssemblyName ParseAssemblyName() { Token simpleName = Expect(TokenKind.Id); AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = simpleName.Value; if (!CommaIdEquals()) return assemblyName; Token version = Expect(TokenKind.VersionNumber); assemblyName.Version = new Version(version.Value); if (!CommaIdEquals()) return assemblyName; Token culture = Expect(TokenKind.Id); if ("neutral" == culture.Value) { assemblyName.CultureInfo = CultureInfo.InvariantCulture; } else { #if SILVERLIGHT assemblyName.CultureInfo = CultureInfo.InvariantCulture; #else assemblyName.CultureInfo = CultureInfo.CreateSpecificCulture(culture.Value); #endif } if (!CommaIdEquals()) return assemblyName; Token token = NextToken(); if ("null" != token.Value) { assemblyName.SetPublicKeyToken(ParsePublicKeyToken(token.Value)); } return assemblyName; } static byte[] ParsePublicKeyToken(string token) { int len = token.Length / 2; byte[] bytes = new byte[len]; for (int i = 0; i < len; ++i) { bytes[i] = byte.Parse(token.Substring(i * 2, 2), NumberStyles.HexNumber); } return bytes; } private bool CommaIdEquals() { Token token = NextToken(); if (null == token) return false; if (token.Kind != TokenKind.Comma) { Push(token); return false; } AssertTokenKind(TokenKind.Comma, token); Expect(TokenKind.Id); Expect(TokenKind.Equals); return true; } Token Expect(TokenKind expected) { Token actual = NextToken(); AssertTokenKind(expected, actual); return actual; } private static void AssertTokenKind(TokenKind expected, Token actual) { if (null == actual || actual.Kind != expected) { UnexpectedToken(expected, actual); } } private static void UnexpectedToken(TokenKind expectedKind, Token actual) { throw new ArgumentException(string.Format("Unexpected Token: '{0}' (Expected kind: '{1}')", actual, expectedKind)); } private void Push(Token token) { _stack.Push(token); } private Token NextToken() { return _stack.Count > 0 ? _stack.Pop() : _lexer.NextToken(); } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/IdentityHashCodeProvider.cs0000644000175000017500000000233011700531646031254 0ustar00meebeymeebey00000000000000/* Copyright (C) 2005 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; namespace Sharpen.Lang { public class IdentityHashCodeProvider { #if !CF public static int IdentityHashCode(object obj) { return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj); } #else public static int IdentityHashCode(object obj) { if (obj == null) return 0; return (int) _hashMethod.Invoke(null, new object[] { obj }); } private static MethodInfo _hashMethod = GetIdentityHashCodeMethod(); private static MethodInfo GetIdentityHashCodeMethod() { Assembly assembly = typeof(object).Assembly; try { Type t = assembly.GetType("System.PInvoke.EE"); return t.GetMethod( "Object_GetHashCode", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); } catch (Exception e) { } // We may be running the CF app on .NET Framework 1.1 // for profiling, let's give that a chance try { Type t = assembly.GetType( "System.Runtime.CompilerServices.RuntimeHelpers"); return t.GetMethod( "GetHashCode", BindingFlags.Public | BindingFlags.Static); } catch { } return null; } #endif } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/ThreadLocal.cs0000644000175000017500000000144311700531646026537 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace Sharpen.Lang { #if CF class ThreadLocal : Db4objects.Db4o.Foundation.ThreadLocal4 { } #else class ThreadLocal { [ThreadStatic] private static Dictionary _locals; public object Get() { object value; if (Locals.TryGetValue(this, out value)) return value; return null; } public void Set(object value) { if (value == null) Locals.Remove(this); else Locals[this] = value; } private static Dictionary Locals { get { Dictionary value = _locals; if (value == null) _locals = value = new Dictionary(); return value; } } } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Lang/TypeReferenceLexer.cs0000644000175000017500000000662411700531646030123 0ustar00meebeymeebey00000000000000/* Copyright (C) 2005 Versant Inc. http://www.db4o.com */ using System; using System.Text; namespace Sharpen.Lang { internal enum TokenKind { Comma, Equals, Id, Number, VersionNumber, GenericQualifier, NestedQualifier, LBrack, RBrack, PointerQualifier } internal class Token { public TokenKind Kind; public string Value; public Token(TokenKind kind, string value) { this.Kind = kind; this.Value = value; //Console.WriteLine(this); } public override string ToString() { return string.Format("Token(Kind: {0}, Value: '{1}')", Kind, Value); } } internal class TypeReferenceLexer { string _input; int _index; StringBuilder _buffer; // TODO: get rid of StringBuilder and use string.Substring public TypeReferenceLexer(string input) { if (null == input) throw new ArgumentNullException("input"); _input = input; _index = 0; _buffer = new StringBuilder(input.Length); } bool AtEOF { get { return _index == _input.Length; } } public Token NextToken() { if (AtEOF) return null; char ch = Peek(); switch (ch) { case '*': return ConsumeSingleCharToken(ch, TokenKind.PointerQualifier); case '+': return ConsumeSingleCharToken(ch, TokenKind.NestedQualifier); case '[': return ConsumeSingleCharToken(ch, TokenKind.LBrack); case ']': return ConsumeSingleCharToken(ch, TokenKind.RBrack); case '=': return ConsumeSingleCharToken(ch, TokenKind.Equals); case ',': return ConsumeSingleCharToken(ch, TokenKind.Comma); case '`': return ConsumeSingleCharToken(ch, TokenKind.GenericQualifier); case ' ': Consume(); return NextToken(); default: if (IsIdStart(ch)) return Id(); if (char.IsDigit(ch)) return NumberOrVersion(); break; } throw new Exception(string.Format("Unexpected char '{0}'", ch)); } private static bool IsIdStart(char ch) { switch (ch) { case '_': case '<': // c# compiler generated classes return true; } return char.IsLetter(ch); } private Token Id() { do { char ch = Peek(); if (!char.IsLetterOrDigit(ch) && '.' != ch && '-' != ch && '_' != ch && '<' != ch && '>' != ch && ':' != ch && ' ' != ch) // assembly names can contain spaces { break; } ConsumeAndBuffer(ch); } while (!AtEOF); return TokenFromBuffer(TokenKind.Id); } private Token NumberOrVersion() { TokenKind kind = TokenKind.Number; do { char ch = Peek(); if ('.' == ch) { kind = TokenKind.VersionNumber; } else { if (!IsHexDigit(ch)) { break; } } ConsumeAndBuffer(ch); } while (!AtEOF); return TokenFromBuffer(kind); } private static bool IsHexDigit(char ch) { return char.IsDigit(ch) || IsHexLetter(ch); } private static bool IsHexLetter(char ch) { return (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f'); } private void ConsumeAndBuffer(char ch) { Consume(); _buffer.Append(ch); } private Token TokenFromBuffer(TokenKind kind) { Token token = new Token(kind, _buffer.ToString()); _buffer.Length = 0; return token; } private Token ConsumeSingleCharToken(char ch, TokenKind kind) { Consume(); return new Token(kind, new string(ch, 1)); } void Consume() { ++_index; } char Peek() { return _input[_index]; } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Runtime.cs0000644000175000017500000001524011700531646025117 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.IO; using System.Reflection; using System.Threading; using Sharpen.Lang; namespace Sharpen { public class Runtime { private static long DIFFERENCE_IN_TICKS = 62135604000000; private static long RATIO = 10000; public static TextWriter Out { get { return Console.Out; } } public static TextWriter Err { get { return Console.Error; } } public static object GetArrayValue(object array, int i) { return ((Array)array).GetValue(i); } public static int GetArrayLength(object array) { return ((Array) array).Length; } public static void SetArrayValue(object array, int index, object value) { ((Array)array).SetValue(value, index); } private const BindingFlags AllMembers = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; private const BindingFlags DeclaredMembers = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; private const BindingFlags DeclaredMembersIncludingStatic = DeclaredMembers | BindingFlags.Static; public static FieldInfo GetDeclaredField(Type type, string name) { return type.GetField(name, DeclaredMembersIncludingStatic); } public static FieldInfo[] GetDeclaredFields(Type type) { return type.GetFields(DeclaredMembersIncludingStatic); } public static MethodInfo GetDeclaredMethod(Type type, string name, Type[] parameterTypes) { return type.GetMethod(name, DeclaredMembers, null, parameterTypes, null); } public static MethodInfo GetMethod(Type type, string name, Type[] parameterTypes) { return type.GetMethod(name, AllMembers, null, parameterTypes, null); } public static Type[] GetParameterTypes(MethodBase method) { ParameterInfo[] parameters = method.GetParameters(); Type[] types = new Type[parameters.Length]; for (int i=0; i _elements = new List(); #else private readonly ArrayList _elements = new ArrayList(); #endif public HashSet() { } public HashSet(ICollection initialValues) { AddAll(initialValues); } public bool Add(object o) { if (Contains(o)) return false; _elements.Add(o); return true; } public bool AddAll(ICollection c) { bool changed = false; foreach (object o in c) { changed |= Add(o); } return changed; } public void Clear() { _elements.Clear(); } public bool Contains(object o) { return _elements.Contains(o); } public bool ContainsAll(ICollection c) { foreach (object o in c) { if (!Contains(o)) { return false; } } return true; } public bool IsEmpty { get { return _elements.Count == 0; } } public bool Remove(object o) { if (!Contains(o)) return false; _elements.Remove(o); return true; } public bool RemoveAll(ICollection c) { bool changed = false; foreach (object o in c) { changed |= Remove(o); } return changed; } public void CopyTo(Array array, int index) { #if SILVERLIGHT object[] objectArray = new object[array.Length]; int idx = 0; foreach (var a in array) { objectArray[idx++] = a; } _elements.CopyTo(objectArray, index); #else _elements.CopyTo(array, index); #endif } public int Count { get { return _elements.Count; } } public bool IsSynchronized { get { return false; } } public object SyncRoot { get { #if SILVERLIGHT throw new InvalidOperationException(); #else return _elements.SyncRoot; #endif } } public IEnumerator GetEnumerator() { return _elements.GetEnumerator(); } int IList.Add(object value) { ((ISet) this).Add(value); return 0; } void IList.Remove(object value) { ((ISet)this).Remove(value); } int IList.IndexOf(object value) { throw new NotImplementedException(); } void IList.Insert(int index, object value) { throw new NotImplementedException(); } void IList.RemoveAt(int index) { throw new NotImplementedException(); } object IList.this[int index] { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } bool IList.IsReadOnly { get { return false; } } bool IList.IsFixedSize { get { return false; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Util/Arrays.cs0000755000175000017500000000150111700531646025650 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace Sharpen.Util { public class Arrays { public static void Fill(T[] array, T value) { for (int i=0; i(T[] array, int fromIndex, int toIndex, T value) { for (int i = fromIndex; i < toIndex; ++i) { array[i] = value; } } public static bool Equals(T[] x, T[] y) { if (x == null) return y == null; if (y == null) return false; if (x.Length != y.Length) return false; for (int i = 0; i < x.Length; ++i) { if (!object.Equals(x[i], y[i])) return false; } return true; } public static List AsList(T[] array) { return new List(array); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Sharpen/Util/ISet.cs0000644000175000017500000000037411700531646025257 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Text; namespace Sharpen.Util { public interface ISet: ICollection { bool Add(object element); bool Remove(object element); bool Contains(object element); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/net/0000755000175000017500000000000011700531646022331 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/net/Compat.cs0000644000175000017500000000023011700531646024076 0ustar00meebeymeebey00000000000000/* Copyright (C) 2005 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o { #if !CF /// public class Compat { } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/net/SerializationConstructor.cs0000644000175000017500000000161511700531646027746 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect.Core; namespace Db4objects.Db4o.Reflect.Net { #if !CF && !SILVERLIGHT /// Constructs objects by using System.Runtime.Serialization.FormatterServices.GetUninitializedObject /// and bypasses calls to user contructors this way. Not available on CompactFramework /// public class SerializationConstructor : IReflectConstructor { private Type _type; public SerializationConstructor(Type type){ _type = type; } public virtual IReflectClass[] GetParameterTypes() { return null; } #if NET_4_0 [System.Security.SecurityCritical] #endif public virtual object NewInstance(object[] parameters) { return System.Runtime.Serialization.FormatterServices.GetUninitializedObject(_type); } } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/net/TSerializable.cs0000644000175000017500000000252011700531646025411 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.IO; using Sharpen.Lang; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { #if !CF && !SILVERLIGHT using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; /// /// translator for types that are marked with the Serializable attribute. /// The Serializable translator is provided to allow persisting objects that /// do not supply a convenient constructor. The use of this translator is /// recommended only if:
/// - the persistent type will never be refactored
/// - querying for type members is not necessary
///
public class TSerializable : IObjectConstructor { public Object OnStore(IObjectContainer objectContainer, Object obj) { MemoryStream memoryStream = new MemoryStream(); new BinaryFormatter().Serialize(memoryStream, obj); return memoryStream.GetBuffer(); } public void OnActivate(IObjectContainer objectContainer, Object obj, Object members) { } public Object OnInstantiate(IObjectContainer objectContainer, Object obj) { MemoryStream memoryStream = new MemoryStream((byte[])obj); return new BinaryFormatter().Deserialize(memoryStream); } public System.Type StoredClass() { return typeof(byte[]); } } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/net/Lock4.cs0000644000175000017500000000104211700531646023631 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Threading; #if !CF namespace Db4objects.Db4o.Foundation { public class Lock4 { public void Awake() { Monitor.Pulse(this); } public Object Run(IClosure4 closure) { lock (this) { return closure.Run(); } } public void Snooze(long timeout) { Monitor.Wait(this, (int)timeout); } } } #endif smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/0000755000175000017500000000000011700531646024315 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Diagnostic/0000755000175000017500000000000011700531646026401 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Diagnostic/DiagnosticToTrace.cs0000644000175000017500000000223111700531646032274 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Diagnostic { #if !CF /// prints Diagnostic messsages to the Console. /// /// prints Diagnostic messsages to System.Diagnostics.Trace. /// Install this /// Db4objects.Db4o.Diagnostic.IDiagnosticListener /// /// with:
/// commonConfig.Diagnostic.AddListener(new DiagnosticToTrace());
///
/// Db4objects.Db4o.Diagnostic.DiagnosticConfiguration /// public class DiagnosticToTrace : Db4objects.Db4o.Diagnostic.IDiagnosticListener { /// redirects Diagnostic messages to System.Diagnostics.Trace /// redirects Diagnostic messages to the Console. public virtual void OnDiagnostic(Db4objects.Db4o.Diagnostic.IDiagnostic d) { #if !SILVERLIGHT System.Diagnostics.Trace.WriteLine(d.ToString()); #endif } } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/0000755000175000017500000000000011700531646026071 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/0000755000175000017500000000000011700531646027631 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/UShortHandler.cs0000644000175000017500000000312011700531646032676 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class UShortHandler : IntegralTypeHandler { public override Object DefaultValue(){ return (ushort)0; } public override Object Read(byte[] bytes, int offset){ offset += 1; return (ushort) (bytes[offset] & 255 | (bytes[--offset] & 255) << 8); } public override int TypeID(){ return 24; } public override void Write(Object obj, byte[] bytes, int offset){ ushort us = (ushort)obj; offset += 2; bytes[--offset] = (byte)us; bytes[--offset] = (byte)(us >>= 8); } public override object Read(IReadContext context) { byte[] bytes = new byte[2]; context.ReadBytes(bytes); return (ushort)( bytes[1] & 255 | (bytes[0] & 255) << 8 ); } public override void Write(IWriteContext context, object obj) { ushort us = (ushort)obj; context.WriteBytes( new byte[] { (byte)(us>>8), (byte)us, }); } public override IPreparedComparison InternalPrepareComparison(object obj) { return new PreparedComparisonFor(((ushort)obj)); } } } WeakReferenceHandler.cs0000644000175000017500000000115711700531646034111 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Handlers { internal class WeakReferenceHandler { private readonly WeakReference _reference; public object ObjectReference; internal WeakReferenceHandler(Object queue, Object objectRef, Object obj) { _reference = new WeakReference(obj, false); ObjectReference = objectRef; ((WeakReferenceHandlerQueue)queue).Add(this); } public object Get() { return _reference.Target; } public bool IsAlive { get { return _reference.IsAlive; } } } }PreparedComparisonFor.cs0000644000175000017500000000106111700531646034343 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Internal.Handlers { internal class PreparedComparisonFor : IPreparedComparison where T : IComparable { private readonly T _source; public PreparedComparisonFor(T source) { _source = source; } public int CompareTo(object obj) { T target = ((T)obj); return _source.CompareTo(target); } } } IntegralTypeHandler.cs0000644000175000017500000000031311700531646034003 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Handlers { abstract public class IntegralTypeHandler : NetTypeHandler { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/DecimalHandler.cs0000644000175000017500000000535411700531646033023 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class DecimalHandler : IntegralTypeHandler { public override Object DefaultValue(){ return (decimal)0; } public override Object Read(byte[] bytes, int offset){ int[] ints = new int[4]; offset += 3; for(int i = 0; i < 4; i ++){ ints[i] = (bytes[offset] & 255 | (bytes[--offset] & 255) << 8 | (bytes[--offset] & 255) << 16 | bytes[--offset] << 24); offset +=7; } return new Decimal(ints); } public override int TypeID(){ return 21; } public override void Write(Object obj, byte[] bytes, int offset){ decimal dec = (decimal)obj; int[] ints = Decimal.GetBits(dec); offset += 4; for(int i = 0; i < 4; i ++){ bytes[--offset] = (byte)ints[i]; bytes[--offset] = (byte)(ints[i] >>= 8); bytes[--offset] = (byte)(ints[i] >>= 8); bytes[--offset] = (byte)(ints[i] >>= 8); offset += 8; } } public override object Read(IReadContext context) { byte[] bytes = new byte[16]; int[] ints = new int[4]; int offset = 4; context.ReadBytes(bytes); for (int i = 0; i < 4; i++) { ints[i] = ( bytes[--offset] & 255 | (bytes[--offset] & 255) << 8 | (bytes[--offset] & 255) << 16 | (bytes[--offset] & 255) << 24 ); offset += 8; } return new Decimal(ints); } public override void Write(IWriteContext context, object obj) { decimal dec = (decimal)obj; byte[] bytes = new byte[16]; int offset = 4; int[] ints = Decimal.GetBits(dec); for (int i = 0; i < 4; i++) { bytes[--offset] = (byte)ints[i]; bytes[--offset] = (byte)(ints[i] >>= 8); bytes[--offset] = (byte)(ints[i] >>= 8); bytes[--offset] = (byte)(ints[i] >>= 8); offset += 8; } context.WriteBytes(bytes); } public override IPreparedComparison InternalPrepareComparison(object obj) { return new PreparedComparisonFor(((decimal) obj)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/SByteHandler.cs0000644000175000017500000000244611700531646032512 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Internal.Handlers { public class SByteHandler : IntegralTypeHandler { public override object Coerce(IReflectClass claxx, object obj) { return Coercion4.ToSByte(obj); } public override Object DefaultValue(){ return (sbyte)0; } public override Object Read(byte[] bytes, int offset){ return (sbyte) ((bytes[offset]) - 128) ; } public override int TypeID(){ return 20; } public override void Write(Object obj, byte[] bytes, int offset){ bytes[offset] = (byte)(((sbyte)obj) + 128); } public override object Read(IReadContext context) { return (sbyte)(context.ReadByte() - 128); } public override void Write(IWriteContext context, object obj) { context.WriteByte((byte)(((sbyte)obj) + 128)); } public override IPreparedComparison InternalPrepareComparison(object obj) { return new PreparedComparisonFor(((sbyte)obj)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/UIntHandler.cs0000644000175000017500000000357311700531646032345 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class UIntHandler : IntegralTypeHandler { public override Object DefaultValue(){ return (uint)0; } public override Object Read(byte[] bytes, int offset){ offset += 3; return (uint) (bytes[offset] & 255 | (bytes[--offset] & 255) << 8 | (bytes[--offset] & 255) << 16 | bytes[--offset] << 24); } public override int TypeID(){ return 22; } public override void Write(Object obj, byte[] bytes, int offset){ uint ui = (uint)obj; offset += 4; bytes[--offset] = (byte)ui; bytes[--offset] = (byte)(ui >>= 8); bytes[--offset] = (byte)(ui >>= 8); bytes[--offset] = (byte)(ui >>= 8); } public override object Read(IReadContext context) { byte[] bytes = new byte[4]; context.ReadBytes(bytes); return (uint)( bytes[3] & 255 | (bytes[2] & 255) << 8 | (bytes[1] & 255) << 16 | (bytes[0] & 255) << 24 ); } public override void Write(IWriteContext context, object obj) { uint ui = (uint)obj; context.WriteBytes( new byte[] { (byte)(ui>>24), (byte)(ui>>16), (byte)(ui>>8), (byte)ui, }); } public override IPreparedComparison InternalPrepareComparison(object obj) { return new PreparedComparisonFor(((uint)obj)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/ULongHandler.cs0000644000175000017500000000426111700531646032505 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { public class ULongHandler : IntegralTypeHandler { public override Object DefaultValue(){ return (ulong)0; } public override void Write(object obj, byte[] bytes, int offset){ ulong ul = (ulong)obj; for (int i = 0; i < 8; i++){ bytes[offset++] = (byte)(int)(ul >> (7 - i) * 8); } } public override int TypeID(){ return 23; } public override Object Read(byte[] bytes, int offset){ ulong ul = 0; for (int i = 0; i < 8; i++) { ul = (ul << 8) + (ulong)(bytes[offset++] & 255); } return ul; } public override object Read(IReadContext context) { byte[] bytes = new byte[8]; context.ReadBytes(bytes); return (ulong)( (ulong)bytes[7] & 255 | (ulong)(bytes[6] & 255) << 8 | (ulong)(bytes[5] & 255) << 16 | (ulong)(bytes[4] & 255) << 24 | (ulong)(bytes[3] & 255) << 32 | (ulong)(bytes[2] & 255) << 40 | (ulong)(bytes[1] & 255) << 48 | (ulong)(bytes[0] & 255) << 56 ); } public override void Write(IWriteContext context, object obj) { ulong ui = (ulong)obj; context.WriteBytes( new byte[] { (byte)(ui>>56), (byte)(ui>>48), (byte)(ui>>40), (byte)(ui>>32), (byte)(ui>>24), (byte)(ui>>16), (byte)(ui>>8), (byte)ui, }); } public override IPreparedComparison InternalPrepareComparison(object obj) { return new PreparedComparisonFor(((ulong)obj)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/DateTimeHandler6.cs0000644000175000017500000000160311700531646033240 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Internal.Handlers { class DateTimeHandler6 : DateTimeHandler { protected override object ReadKind(IReadContext context, DateTime dateTime) { return dateTime; } protected override void WriteKind(IWriteContext context, DateTime dateTime) { // do nothing } protected override DateTime ReadKind (DateTime dateTime, byte[] bytes, int offset) { return dateTime; } protected override void WriteKind(DateTime dateTime, byte[] bytes, int offset) { // do nothing } //public override int LinkLength() //{ // return base.LinkLength() - Const4.LongLength; //} } } WeakReferenceHandlerQueue.cs0000644000175000017500000000271011700531646035112 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Internal.Handlers { internal class WeakReferenceHandlerQueue { private List4 _list; internal void Add(WeakReferenceHandler reference) { lock(this){ _list = new List4(_list, reference); } } internal void Poll(ObjectContainerBase objectContainer) { List4 remove = null; lock(this){ System.Collections.IEnumerator i = new Iterator4Impl(_list); _list = null; while(i.MoveNext()){ WeakReferenceHandler refHandler = (WeakReferenceHandler)i.Current; if(refHandler.IsAlive){ _list = new List4(_list, refHandler); }else{ remove = new List4(remove, refHandler.ObjectReference); } } } System.Collections.IEnumerator j = new Iterator4Impl(remove); while (j.MoveNext()) { lock (objectContainer.Lock()) { if (objectContainer.IsClosed()) { return; } objectContainer.RemoveFromAllReferenceSystems(j.Current); } } } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/DateTimeHandler.cs0000644000175000017500000000476311700531646033164 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Marshall; using Sharpen; namespace Db4objects.Db4o.Internal.Handlers { public class DateTimeHandler : StructHandler { public override Object DefaultValue() { return DateTime.MinValue; } public override Object Read(byte[] bytes, int offset) { long ticks = 0; for (int i = 0; i < 8; i++) { ticks = (ticks << 8) + (bytes[offset++] & 255); } return ReadKind(new DateTime(ticks), bytes, offset); } protected virtual DateTime ReadKind (DateTime dateTime, byte[] bytes, int offset) { int kind = 0; for (int i = 0; i < 4; i++) { kind = (kind << 8) + (bytes[offset++] & 255); } return DateTime.SpecifyKind(dateTime, (DateTimeKind)kind); } public override int TypeID() { return 25; } public override void Write(object obj, byte[] bytes, int offset) { long ticks = ((DateTime)obj).Ticks; for (int i = 0; i < 8; i++) { bytes[offset++] = (byte)(int)(ticks >> (7 - i) * 8); } WriteKind((DateTime)obj, bytes, offset); } protected virtual void WriteKind(DateTime dateTime, byte[] bytes, int offset) { int kind = (int) dateTime.Kind; for (int i = 0; i < 4; i++) { bytes[offset++] = (byte)(int)(kind >> (3 - i) * 8); } } public override object Read(IReadContext context) { long ticks = context.ReadLong(); DateTime dateTime = new DateTime(ticks); return ReadKind(context, dateTime); } protected virtual object ReadKind(IReadContext context, DateTime dateTime) { DateTimeKind kind = (DateTimeKind) context.ReadInt(); return DateTime.SpecifyKind(dateTime, kind); } public override void Write(IWriteContext context, object obj) { DateTime dateTime = (DateTime)obj; long ticks = dateTime.Ticks; context.WriteLong(ticks); WriteKind(context, dateTime); } protected virtual void WriteKind(IWriteContext context, DateTime dateTime) { context.WriteInt((int) dateTime.Kind); } public override IPreparedComparison InternalPrepareComparison(object obj) { return new PreparedComparisonFor(((DateTime)obj)); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/DateHandler.cs0000644000175000017500000000113411700531646032332 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Handlers { public class DateHandler : DateHandlerBase { public override object DefaultValue() { return DateTime.MinValue; } public override object PrimitiveNull() { return DateTime.MinValue; } public override object NullRepresentationInUntypedArrays() { return null; } public override object CopyValue(object from, object to) { // nothing to do since we already have a immutable // copy return from; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Handlers/StructHandler.cs0000644000175000017500000000031411700531646032740 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Handlers { abstract public class StructHandler : NetTypeHandler { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/TagAttribute.cs0000644000175000017500000000070411700531646031020 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal { [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] public class TagAttribute : Attribute { public TagAttribute(string tag) { this.tag = tag; } public string Tag { get { return tag; } } private string tag; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/0000755000175000017500000000000011700531646027455 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/Emitters/0000755000175000017500000000000011700531646031251 5ustar00meebeymeebey00000000000000SetFieldEmitter.cs0000644000175000017500000000312511700531646034553 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/Emitters/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; #if !CF using System.Reflection.Emit; #endif namespace Db4objects.Db4o.Internal.Reflect.Emitters { #if !CF class SetFieldEmitter : Emitter { public SetFieldEmitter(FieldInfo field) : base(field, typeof(void), new Type[] { typeof(object), typeof(object) }) { } public Setter Emit() { EmitMethodBody(); return (Setter) CreateDelegate(); } private void EmitMethodBody() { if (_field.IsStatic) { EmitLoadValue(); _il.Emit(OpCodes.Stsfld, _field); } else { EmitLoadTargetObject(_field.DeclaringType); EmitLoadValue(); _il.Emit(OpCodes.Stfld, _field); } _il.Emit(OpCodes.Ret); } private void EmitLoadValue() { if (_field.FieldType.IsValueType) { EmitLoadValueType(); } else { EmitLoadReferenceType(); } } private void EmitLoadReferenceType() { _il.Emit(OpCodes.Ldarg_1); _il.Emit(OpCodes.Castclass, _field.FieldType); } private void EmitLoadValueType() { Type fieldType = _field.FieldType; _il.Emit(OpCodes.Ldarg_1); Label nonNull = _il.DefineLabel(); _il.Emit(OpCodes.Brtrue_S, nonNull); _il.DeclareLocal(fieldType); _il.Emit(OpCodes.Ldloc_0); Label end = _il.DefineLabel(); _il.Emit(OpCodes.Br_S, end); _il.MarkLabel(nonNull); _il.Emit(OpCodes.Ldarg_1); _il.Emit(OpCodes.Unbox, fieldType); _il.Emit(OpCodes.Ldobj, fieldType); _il.MarkLabel(end); } } #endif } AccessorFactory.cs0000644000175000017500000000276111700531646034621 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/Emittersusing System; using System.Collections.Generic; using System.Reflection; namespace Db4objects.Db4o.Internal.Reflect.Emitters { #if !CF public delegate void Setter(object o, object value); public delegate object Getter(object o); public static class AccessorFactory { private static readonly Dictionary _getters = new Dictionary(); private static readonly Dictionary _setters = new Dictionary(); public static Setter SetterFor(FieldInfo field) { return Produce(_setters, field, EmitSetter); } public static Getter GetterFor(FieldInfo field) { return Produce(_getters, field, EmitGetter); } private delegate TEmitter Producer(FieldInfo field); private static TEmitter Produce(Dictionary cache, FieldInfo field, Producer producer) { TEmitter emitter; lock (cache) { if (!cache.TryGetValue(field, out emitter)) { emitter = producer(field); cache[field] = emitter; } } return emitter; } private static Setter EmitSetter(FieldInfo field) { try { return new SetFieldEmitter(field).Emit(); } catch { return delegate { }; } } private static Getter EmitGetter(FieldInfo field) { try { return new GetFieldEmitter(field).Emit(); } catch { return delegate { return null; }; } } } #endif } GetFieldEmitter.cs0000644000175000017500000000203011700531646034531 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/Emitters/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; #if !CF using System.Reflection.Emit; #endif using System.Runtime.CompilerServices; namespace Db4objects.Db4o.Internal.Reflect.Emitters { #if !CF class GetFieldEmitter : Emitter { public GetFieldEmitter(FieldInfo field) : base(field, typeof(object), new Type[] { typeof(object) }) { } public Getter Emit() { EmitMethodBody(); return (Getter)CreateDelegate (); } private void EmitMethodBody() { if (_field.IsStatic) { // make sure type is initialized before // accessing any static fields RuntimeHelpers.RunClassConstructor(_field.DeclaringType.TypeHandle); _il.Emit(OpCodes.Ldsfld, _field); } else { EmitLoadTargetObject(_field.DeclaringType); _il.Emit(OpCodes.Ldfld, _field); } EmitReturn(); } protected void EmitReturn() { BoxIfNeeded(_field.FieldType); _il.Emit(OpCodes.Ret); } } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/Emitters/Emitter.cs0000644000175000017500000000226611700531646033217 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; #if !CF using System.Reflection.Emit; #endif namespace Db4objects.Db4o.Internal.Reflect.Emitters { #if !CF internal class Emitter { private readonly DynamicMethod _dynamicMethod; protected readonly FieldInfo _field; protected readonly ILGenerator _il; public Emitter(FieldInfo field, Type returnType, Type[] paramTypes) { _field = field; _dynamicMethod = new DynamicMethod(_field.DeclaringType.Name + "$" + _field.Name, returnType, paramTypes, _field.DeclaringType); _il = _dynamicMethod.GetILGenerator(); } protected void BoxIfNeeded(Type type) { if (!type.IsValueType) return; _il.Emit(OpCodes.Box, type); } protected void EmitLoadTargetObject(Type expectedType) { _il.Emit(OpCodes.Ldarg_0); // target object is the first argument if (expectedType.IsValueType) { _il.Emit(OpCodes.Unbox, expectedType); } else { _il.Emit(OpCodes.Castclass, expectedType); } } protected Delegate CreateDelegate() { return _dynamicMethod.CreateDelegate(typeof(T)); } } #endif }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Reflect/FastNetReflector.cs0000644000175000017500000000345611700531646033226 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal.Reflect.Emitters; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Internal.Reflect { #if !CF public class FastNetReflector : NetReflector { override protected IReflectClass CreateClass(Type forType) { return new FastNetClass(Parent(), this, forType); } public override object DeepClone(object obj) { return new FastNetReflector(); } } class FastNetClass : NetClass { public FastNetClass(IReflector reflector, NetReflector netReflector, Type clazz) : base(reflector, netReflector, clazz) { } protected override IReflectField CreateField(FieldInfo field) { return new FastNetField(_reflector, field); } } class FastNetField : NetField { private Getter _getter; private Setter _setter; public FastNetField(IReflector reflector, FieldInfo field) : base(reflector, field) { } public override object Get(object onObject) { if (null == _getter) _getter = AccessorFactory.GetterFor(_field); try { return _getter(onObject); } catch (FieldAccessException) { _getter = _field.GetValue; return _getter(onObject); } catch (Exception e) { throw new Db4oException(e); } } public override void Set(object onObject, object attribute) { if (null == _setter) _setter = AccessorFactory.SetterFor(_field); try { _setter(onObject, attribute); } catch (FieldAccessException) { _setter = _field.SetValue; _setter(onObject, attribute); } catch (Exception e) { throw new Db4oException(e); } } } #endif } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/0000755000175000017500000000000011700531646027176 5ustar00meebeymeebey00000000000000QueryOptimizationFailureHandler.cs0000644000175000017500000000073411700531646035774 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Query { public class QueryOptimizationFailureEventArgs : System.EventArgs { System.Exception _reason; public QueryOptimizationFailureEventArgs(System.Exception e) { _reason = e; } public System.Exception Reason { get { return _reason; } } } public delegate void QueryOptimizationFailureHandler(object sender, QueryOptimizationFailureEventArgs args); }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/NativeQueryHandler.cs0000644000175000017500000001673211700531646033310 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.IO; using System.Reflection; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Query; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Diagnostic; namespace Db4objects.Db4o.Internal.Query { public class NativeQueryHandler { private IObjectContainer _container; private INQOptimizer _builder; public event QueryExecutionHandler QueryExecution; public event QueryOptimizationFailureHandler QueryOptimizationFailure; public NativeQueryHandler(IObjectContainer container) { _container = container; } public virtual Db4objects.Db4o.IObjectSet Execute(Db4objects.Db4o.Query.IQuery query, Db4objects.Db4o.Query.Predicate predicate, Db4objects.Db4o.Query.IQueryComparator comparator) { Db4objects.Db4o.Query.IQuery q = ConfigureQuery(query, predicate); q.SortBy(comparator); return q.Execute(); } public virtual System.Collections.Generic.IList Execute(Db4objects.Db4o.Query.IQuery query, System.Predicate match, Db4objects.Db4o.Query.IQueryComparator comparator) { #if CF return ExecuteUnoptimized(QueryForExtent(query, comparator), match); #else // XXX: check GetDelegateList().Length // only 1 delegate must be allowed // although we could use it as a filter chain // (and) return ExecuteImpl(query, match, match.Target, match.Method, match, comparator); #endif } public static System.Collections.Generic.IList ExecuteEnhancedFilter(IObjectContainer container, IDb4oEnhancedFilter predicate) { return NQHandler(container).ExecuteEnhancedFilter(predicate); } public System.Collections.Generic.IList ExecuteEnhancedFilter(IDb4oEnhancedFilter filter) { IQuery query = _container.Query(); query.Constrain(typeof(T)); filter.OptimizeQuery(query); OnQueryExecution(filter, QueryExecutionKind.PreOptimized); return WrapQueryResult(query); } private static NativeQueryHandler NQHandler(IObjectContainer container) { return ((ObjectContainerBase)container).GetNativeQueryHandler(); } private System.Collections.Generic.IList ExecuteImpl( Db4objects.Db4o.Query.IQuery query, object originalPredicate, object matchTarget, System.Reflection.MethodBase matchMethod, System.Predicate match, Db4objects.Db4o.Query.IQueryComparator comparator) { Db4objects.Db4o.Query.IQuery q = QueryForExtent(query, comparator); try { if (OptimizeNativeQueries()) { OptimizeQuery(q, matchTarget, matchMethod); OnQueryExecution(originalPredicate, QueryExecutionKind.DynamicallyOptimized); return WrapQueryResult(q); } } catch(FileNotFoundException fnfe) { NativeQueryOptimizerNotLoaded(fnfe); } catch(TargetInvocationException tie) { NativeQueryOptimizerNotLoaded(tie); } catch(TypeLoadException tle) { NativeQueryOptimizerNotLoaded(tle); } catch (System.Exception e) { OnQueryOptimizationFailure(e); NativeQueryUnoptimized(e); } return ExecuteUnoptimized(q, match); } private void NativeQueryUnoptimized(Exception e) { DiagnosticProcessor dp = Container()._handlers.DiagnosticProcessor(); if (dp.Enabled()) dp.NativeQueryUnoptimized(null, e); } private void NativeQueryOptimizerNotLoaded(Exception exception) { DiagnosticProcessor dp = Container()._handlers.DiagnosticProcessor(); if (dp.Enabled()) dp.NativeQueryOptimizerNotLoaded(Db4o.Diagnostic.NativeQueryOptimizerNotLoaded.NqNotPresent, exception); } private System.Collections.Generic.IList ExecuteUnoptimized(IQuery q, Predicate match) { q.Constrain(new GenericPredicateEvaluation(match)); OnQueryExecution(match, QueryExecutionKind.Unoptimized); return WrapQueryResult(q); } private Db4objects.Db4o.Query.IQuery QueryForExtent(Db4objects.Db4o.Query.IQuery query, Db4objects.Db4o.Query.IQueryComparator comparator) { query.Constrain(typeof(Extent)); query.SortBy(comparator); return query; } private static System.Collections.Generic.IList WrapQueryResult(Db4objects.Db4o.Query.IQuery query) { IQueryResult queryResult = ((QQuery)query).GetQueryResult(); return new GenericObjectSetFacade(queryResult); } private Db4objects.Db4o.Query.IQuery ConfigureQuery(Db4objects.Db4o.Query.IQuery query, Db4objects.Db4o.Query.Predicate predicate) { IDb4oEnhancedFilter filter = predicate as IDb4oEnhancedFilter; if (null != filter) { filter.OptimizeQuery(query); OnQueryExecution(predicate, QueryExecutionKind.PreOptimized); return query; } query.Constrain(predicate.ExtentType()); try { if (OptimizeNativeQueries()) { OptimizeQuery(query, predicate, predicate.GetFilterMethod()); OnQueryExecution(predicate, QueryExecutionKind.DynamicallyOptimized); return query; } } catch (System.Exception e) { OnQueryOptimizationFailure(e); if (OptimizeNativeQueries()) { DiagnosticProcessor dp = Container()._handlers.DiagnosticProcessor(); if (dp.Enabled()) dp.NativeQueryUnoptimized(predicate, e); } } query.Constrain(new Db4objects.Db4o.Internal.Query.PredicateEvaluation(predicate)); OnQueryExecution(predicate, QueryExecutionKind.Unoptimized); return query; } private ObjectContainerBase Container() { return ((ObjectContainerBase)_container); } private bool OptimizeNativeQueries() { return _container.Ext().Configure().OptimizeNativeQueries(); } void OptimizeQuery(Db4objects.Db4o.Query.IQuery q, object predicate, System.Reflection.MethodBase filterMethod) { if (_builder == null) _builder = NQOptimizerFactory.CreateExpressionBuilder(); _builder.Optimize(q, predicate, filterMethod); } private void OnQueryExecution(object predicate, QueryExecutionKind kind) { if (null == QueryExecution) return; QueryExecution(this, new QueryExecutionEventArgs(predicate, kind)); } private void OnQueryOptimizationFailure(System.Exception e) { if (null == QueryOptimizationFailure) return; QueryOptimizationFailure(this, new QueryOptimizationFailureEventArgs(e)); } } class GenericPredicateEvaluation : DelegateEnvelope, Db4objects.Db4o.Query.IEvaluation { public GenericPredicateEvaluation() { // for db4o c/s when CallConstructors == true } public GenericPredicateEvaluation(System.Predicate predicate) : base(predicate) { } public void Evaluate(Db4objects.Db4o.Query.ICandidate candidate) { // use starting _ for PascalCase conversion purposes System.Predicate _predicate = (System.Predicate)GetContent(); candidate.Include(_predicate((T)candidate.GetObject())); } } } GenericObjectSetFacade.cs0000644000175000017500000001013711700531646033713 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal.Query.Result; namespace Db4objects.Db4o.Internal.Query { /// /// List based objectSet implementation /// /// public class GenericObjectSetFacade : System.Collections.Generic.IList { public readonly StatefulQueryResult _delegate; public GenericObjectSetFacade(IQueryResult qr) { _delegate = new StatefulQueryResult(qr); } #region IList Members public bool IsReadOnly { get { return true; } } public T this[int index] { get { return (T)_delegate.Get(index); } set { throw new NotSupportedException(); } } public void RemoveAt(int index) { throw new NotSupportedException(); } public void Insert(int index, T value) { throw new NotSupportedException(); } public bool Remove(T value) { throw new NotSupportedException(); } public bool Contains(T value) { return IndexOf(value) >= 0; } public void Clear() { throw new NotSupportedException(); } public int IndexOf(T value) { return _delegate.IndexOf(value); } public void Add(T value) { throw new NotSupportedException(); } public bool IsFixedSize { get { return true; } } #endregion #region ICollection Members public bool IsSynchronized { get { return true; } } public int Count { get { return _delegate.Size(); } } public void CopyTo(T[] array, int index) { lock (this.SyncRoot) { int i = 0; int s = this.Count; while (i < s) { array[index + i] = this[i]; i++; } } } public object SyncRoot { get { return _delegate.Lock(); } } #endregion #region IEnumerable Members class ObjectSetImplEnumerator : System.Collections.IEnumerator, System.Collections.Generic.IEnumerator { System.Collections.Generic.IList _result; int _next = 0; public ObjectSetImplEnumerator(System.Collections.Generic.IList result) { _result = result; } public void Reset() { _next = 0; } object System.Collections.IEnumerator.Current { get { return _result[_next - 1]; } } public bool MoveNext() { if (_next < _result.Count) { ++_next; return true; } return false; } public T Current { get { return _result[_next - 1]; } } public void Dispose() { } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return new ObjectSetImplEnumerator(this); } #endregion #region IEnumerable implementation public System.Collections.Generic.IEnumerator GetEnumerator() { return new ObjectSetImplEnumerator(this); } #endregion } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/INQOptimizer.cs0000755000175000017500000000031111700531646032055 0ustar00meebeymeebey00000000000000using System.Reflection; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query { public interface INQOptimizer { void Optimize(IQuery q, object predicate, MethodBase method); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/ObjectSetFacade.cs0000644000175000017500000000714611700531646032503 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal.Query.Result; namespace Db4objects.Db4o.Internal.Query { /// /// List based objectSet implementation /// /// public class ObjectSetFacade : IExtObjectSet, System.Collections.IList { public readonly StatefulQueryResult _delegate; public ObjectSetFacade(IQueryResult qr) { _delegate = new StatefulQueryResult(qr); } #region IObjectSet Members public Object Get(int index) { return _delegate.Get(index); } public void Sort(Db4objects.Db4o.Query.IQueryComparator cmp) { _delegate.Sort(cmp); } public long[] GetIDs() { return _delegate.GetIDs(); } public IExtObjectSet Ext() { return this; } public bool MoveNext() { return Enumerator().MoveNext(); } private IEnumerator _enumerator; private IEnumerator Enumerator() { if (null == _enumerator) { _enumerator = GetEnumerator(); } return _enumerator; } public object Current { get { return Enumerator().Current; } } public bool HasNext() { return _delegate.HasNext(); } public Object Next() { return _delegate.Next(); } public void Reset() { _delegate.Reset(); } public int Size() { return _delegate.Size(); } private Object Lock() { return _delegate.Lock(); } private IObjectContainer ObjectContainer() { return _delegate.ObjectContainer(); } public StatefulQueryResult Delegate_() { return _delegate; } #endregion #region IList Members public bool IsReadOnly { get { return true; } } public object this[int index] { get { return _delegate.Get(index); } set { throw new NotSupportedException(); } } public void RemoveAt(int index) { throw new NotSupportedException(); } public void Insert(int index, object value) { throw new NotSupportedException(); } public void Remove(object value) { throw new NotSupportedException(); } public bool Contains(object value) { return IndexOf(value) >= 0; } public void Clear() { throw new NotSupportedException(); } public int IndexOf(object value) { return _delegate.IndexOf(value); } public int Add(object value) { throw new NotSupportedException(); } public bool IsFixedSize { get { return true; } } #endregion #region ICollection Members public bool IsSynchronized { get { return true; } } public int Count { get { return Size(); } } public void CopyTo(Array array, int index) { lock (Lock()) { int i = 0; int s = _delegate.Size(); while (i < s) { array.SetValue(_delegate.Get(i), index + i); i++; } } } public object SyncRoot { get { return Lock(); } } #endregion public System.Collections.IEnumerator GetEnumerator() { IEnumerator enumerator = _delegate.GetEnumerator(); object current; while (MoveNext(enumerator, out current)) { yield return current; } } private bool MoveNext(IEnumerator enumerator, out object current) { lock (_delegate.Lock()) { if (enumerator.MoveNext()) { current = enumerator.Current; return true; } } current = null; return false; } } } SilverlightArrayListExtensions.cs0000644000175000017500000000042511700531646035656 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Queryusing System.Collections; namespace Db4objects.Db4o.Internal.Query { #if SILVERLIGHT public static class SilverlightArrayListExtensions { public static void Sort(this ArrayList self, IComparer comparer) { self.Sort(comparer.Compare); } } #endif } QueryExecutionHandler.cs0000644000175000017500000000126111700531646033735 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Query { public enum QueryExecutionKind { Unoptimized, DynamicallyOptimized, PreOptimized } public class QueryExecutionEventArgs : System.EventArgs { private object _predicate; private QueryExecutionKind _kind; public QueryExecutionEventArgs(object predicate, QueryExecutionKind kind) { _predicate = predicate; _kind = kind; } public object Predicate { get { return _predicate; } } public QueryExecutionKind ExecutionKind { get { return _kind; } } } public delegate void QueryExecutionHandler(object sender, QueryExecutionEventArgs args); }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/NQOptimizerFactory.cs0000644000175000017500000000061211700531646033275 0ustar00meebeymeebey00000000000000/* Copyright (C) 2006 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Query { using System; public class NQOptimizerFactory { public static INQOptimizer CreateExpressionBuilder() { Type type = Type.GetType("Db4objects.Db4o.NativeQueries.NQOptimizer, Db4objects.Db4o.NativeQueries", true); return (INQOptimizer)Activator.CreateInstance(type); } } } EvaluationDelegateWrapper.cs0000644000175000017500000000413711700531646034556 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Query/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using Db4objects.Db4o; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Query { // TODO: Use DelegateEnvelope to build a generic delegate translator internal class DelegateEnvelope { System.Type _delegateType; object _target; System.Type _type; string _method; [NonSerialized] Delegate _content; public DelegateEnvelope() { } public DelegateEnvelope(Delegate content) { _content = content; Marshal(); } protected Delegate GetContent() { if (null == _content) { _content = Unmarshal(); } return _content; } private void Marshal() { _delegateType = _content.GetType(); _target = _content.Target; _method = _content.Method.Name; _type = _content.Method.DeclaringType; } private Delegate Unmarshal() { if (null == _target) { return Delegate.CreateDelegate(_delegateType, null, _type.GetMethod(_method, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public)); } return Delegate.CreateDelegate(_delegateType, _target, _target.GetType().GetMethod(_method, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)); } } internal class EvaluationDelegateWrapper : DelegateEnvelope, IEvaluation { public EvaluationDelegateWrapper() { } public EvaluationDelegateWrapper(EvaluationDelegate evaluation) : base(evaluation) { } EvaluationDelegate GetEvaluationDelegate() { return (EvaluationDelegate)GetContent(); } public void Evaluate(ICandidate candidate) { // use starting _ for PascalCase conversion purposes EvaluationDelegate _evaluation = GetEvaluationDelegate(); _evaluation(candidate); } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/ReflectPlatform.cs0000644000175000017500000000211611700531646031511 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using Sharpen.Lang; namespace Db4objects.Db4o.Internal { public class ReflectPlatform { public static Type ForName(string typeName) { try { return TypeReference.FromString(typeName).Resolve(); } catch { return null; } } public static object CreateInstance(string typeName) { return ReflectPlatform.CreateInstance(ForName(typeName)); } public static object CreateInstance(Type type) { try { return Activator.CreateInstance(type); } catch { return null; } } public static string FullyQualifiedName(Type type) { return TypeReference.FromType(type).GetUnversionedName(); } public static bool IsNamedClass(Type type) { return true; } public static string SimpleName(Type type) { return type.Name; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Platform4.cs0000644000175000017500000005441011700531646030274 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; using Db4objects.Db4o.Config; using Db4objects.Db4o.Config.Attributes; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Db4o.Reflect.Net; using Db4objects.Db4o.Typehandlers; using Sharpen.IO; namespace Db4objects.Db4o.Internal { /// public class Platform4 { private static readonly LegacyDb4oAssemblyNameMapper _assemlbyNameMapper = new LegacyDb4oAssemblyNameMapper(); private static List _containersToBeShutdown; private static readonly object _shutdownStreamsLock = new object(); public static object[] CollectionToArray(ObjectContainerBase stream, object obj) { Collection4 col = FlattenCollection(stream, obj); object[] ret = new object[col.Size()]; col.ToArray(ret); return ret; } internal static void AddShutDownHook(ObjectContainerBase container) { lock (_shutdownStreamsLock) { if (_containersToBeShutdown == null) { _containersToBeShutdown = new List(); #if !CF && !SILVERLIGHT AppDomain.CurrentDomain.ProcessExit += OnShutDown; AppDomain.CurrentDomain.DomainUnload += OnShutDown; #endif } _containersToBeShutdown.Add(container); } } internal static byte[] Serialize(Object obj) { throw new NotSupportedException(); } internal static Object Deserialize(byte[] bytes) { throw new NotSupportedException(); } internal static bool CanSetAccessible() { return true; } internal static IReflector CreateReflector(Object config) { #if USE_FAST_REFLECTOR && !CF && !SILVERLIGHT return new Db4objects.Db4o.Internal.Reflect.FastNetReflector(); #else return new NetReflector(); #endif } public static IReflector ReflectorForType(Type typeInstance) { #if USE_FAST_REFLECTOR && !CF && !SILVERLIGHT return new Db4objects.Db4o.Internal.Reflect.FastNetReflector(); #else return new NetReflector(); #endif } internal static Object CreateReferenceQueue() { return new WeakReferenceHandlerQueue(); } public static Object CreateWeakReference(Object obj) { return new WeakReference(obj, false); } internal static Object CreateActiveObjectReference(Object referenceQueue, Object yapObject, Object obj) { return new WeakReferenceHandler(referenceQueue, yapObject, obj); } internal static long DoubleToLong(double a_double) { #if CF || SILVERLIGHT byte[] bytes = BitConverter.GetBytes(a_double); return BitConverter.ToInt64(bytes, 0); #else return BitConverter.DoubleToInt64Bits(a_double); #endif } internal static QConEvaluation EvaluationCreate(Transaction a_trans, Object example) { if (example is IEvaluation || example is EvaluationDelegate) { return new QConEvaluation(a_trans, example); } return null; } internal static void EvaluationEvaluate(Object a_evaluation, ICandidate a_candidate) { IEvaluation eval = a_evaluation as IEvaluation; if (eval != null) { eval.Evaluate(a_candidate); } else { // use starting _ for PascalCase conversion purposes EvaluationDelegate _ed = a_evaluation as EvaluationDelegate; if (_ed != null) { _ed(a_candidate); } } } internal static Config4Class ExtendConfiguration(IReflectClass clazz, IConfiguration config, Config4Class classConfig) { Type t = GetNetType(clazz); if (t == null) { return classConfig; } ConfigurationIntrospector a = new ConfigurationIntrospector(t, classConfig, config); a.Apply(); return a.ClassConfiguration; } internal static Collection4 FlattenCollection(ObjectContainerBase stream, Object obj) { Collection4 collection41 = new Collection4(); FlattenCollection1(stream, obj, collection41); return collection41; } internal static void FlattenCollection1(ObjectContainerBase stream, Object obj, Collection4 collection4) { Array arr = obj as Array; if (arr != null) { IReflectArray reflectArray = stream.Reflector().Array(); Object[] flat = new Object[arr.Length]; reflectArray.Flatten(obj, reflectArray.Dimensions(obj), 0, flat, 0); for (int i = 0; i < flat.Length; i++) { FlattenCollection1(stream, flat[i], collection4); } } else { // If obj implements IEnumerable, add all elements to collection4 IEnumerator enumerator = GetCollectionEnumerator(obj, true); // Add elements to collection if conversion was succesful if (enumerator != null) { if (enumerator is IDictionaryEnumerator) { IDictionaryEnumerator dictEnumerator = enumerator as IDictionaryEnumerator; while (enumerator.MoveNext()) { FlattenCollection1(stream, dictEnumerator.Key, collection4); } } else { while (enumerator.MoveNext()) { // recursive call to flatten Collections in Collections FlattenCollection1(stream, enumerator.Current, collection4); } } } else { // If obj is not a Collection, it still needs to be collected. collection4.Add(obj); } } } internal static void ForEachCollectionElement(Object obj, IVisitor4 visitor) { IEnumerator enumerator = GetCollectionEnumerator(obj, false); if (enumerator != null) { // If obj is a map (IDictionary in .NET speak) call Visit() with the key // otherwise use the element itself if (enumerator is IDictionaryEnumerator) { IDictionaryEnumerator dictEnumerator = enumerator as IDictionaryEnumerator; while (enumerator.MoveNext()) { visitor.Visit(dictEnumerator.Key); } } else { while (enumerator.MoveNext()) { visitor.Visit(enumerator.Current); } } } } internal static String Format(DateTime date, bool showSeconds) { String fmt = "yyyy-MM-dd"; if (showSeconds) { fmt += " HH:mm:ss"; } return date.ToString(fmt); } internal static IEnumerator GetCollectionEnumerator(object obj, bool allowArray) { IEnumerable enumerable = obj as IEnumerable; if (enumerable == null) return null; if (obj is string) return null; if (!allowArray && obj is Array) return null; return enumerable.GetEnumerator(); } internal static void GetDefaultConfiguration(Config4Impl config) { if (IsCompact()) { config.SingleThreadedClient(true); } Translate(config, typeof(Delegate), new TNull()); Translate(config, typeof(Type), new TType()); // TODO: unnecessary? Translate(config, typeof(Type).GetType(), new TType()); #if !CF && !SILVERLIGHT if (IsMono()) { Translate(config, new Exception(), new TSerializable()); } #endif #if !SILVERLIGHT Translate(config, new ArrayList(), new TList()); Translate(config, new Hashtable(), new TDictionary()); Translate(config, new Queue(), new TQueue()); Translate(config, new Stack(), new TStack()); #endif Translate(config, CultureInfo.InvariantCulture, new TCultureInfo()); if (!IsCompact()) { Translate(config, "System.Collections.SortedList, mscorlib", new TDictionary()); } new TypeHandlerConfigurationDotNet(config).Apply(); config.ObjectClass(typeof (ActivatableBase)).Indexed(false); } public static bool IsCompact() { #if CF || SILVERLIGHT return true; #else return false; #endif } internal static bool IsMono() { return null != Type.GetType("System.MonoType, mscorlib"); } public static Object GetTypeForClass(Object obj) { return obj; } internal static Object GetYapRefObject(Object obj) { WeakReferenceHandler refHandler = obj as WeakReferenceHandler; if (refHandler != null) { return refHandler.Get(); } return obj; } internal static bool HasCollections() { return true; } public static bool NeedsLockFileThread() { return false; } public static bool HasWeakReferences() { return true; } internal static bool IgnoreAsConstraint(Object obj) { Type t = obj.GetType(); if (t.IsEnum) { if (System.Convert.ToInt32(obj) == 0) { return true; } } return false; } internal static bool IsCollectionTranslator(Config4Class config4class) { if (config4class != null) { IObjectTranslator ot = config4class.GetTranslator(); if (ot != null) { #if SILVERLIGHT return false; #else return ot is TList || ot is TDictionary || ot is TQueue || ot is TStack; #endif } } return false; } public static bool IsConnected(Sharpen.Net.Socket socket) { if (socket == null) { return false; } return socket.IsConnected(); } internal static bool IsStruct(IReflectClass claxx) { if (claxx == null) { return false; } System.Type netClass = GetNetType(claxx); if (netClass == null) { return false; } return netClass.IsValueType; } internal static void KillYapRef(Object obj) { WeakReferenceHandler yr = obj as WeakReferenceHandler; if (yr != null) { yr.ObjectReference = null; } } internal static double LongToDouble(long l) { #if CF || SILVERLIGHT byte[] bytes = BitConverter.GetBytes(l); return BitConverter.ToDouble(bytes, 0); #else return BitConverter.Int64BitsToDouble(l); #endif } internal static void LockFile(string path, object file) { #if !CF && !SILVERLIGHT try { FileStream stream = ((RandomAccessFile) file).Stream; stream.Lock(0, 1); } catch (IOException x) { throw new DatabaseFileLockedException(path,x); } #endif } internal static void UnlockFile(string path, object file) { // do nothing. C# RAF is unlocked automatically upon closing } internal static void MarkTransient(String marker) { NetField.MarkTransient(marker); } internal static bool CallConstructor() { return false; } internal static void PollReferenceQueue(Object container, Object referenceQueue) { ((WeakReferenceHandlerQueue)referenceQueue).Poll((ObjectContainerBase)container); } public static void RegisterCollections(GenericReflector reflector) { // reflector.RegisterCollectionUpdateDepth( // typeof(IDictionary), // 3); } internal static void RemoveShutDownHook(ObjectContainerBase container) { lock (_shutdownStreamsLock) { if (_containersToBeShutdown != null) { _containersToBeShutdown.Remove(container); } } } public static void SetAccessible(Object obj) { // do nothing } private static void OnShutDown(object sender, EventArgs args) { lock (_shutdownStreamsLock) { foreach (ObjectContainerBase container in _containersToBeShutdown.ToArray()) { container.ShutdownHook(); // this will remove the stream for the list } } } public static bool StoreStaticFieldValues(IReflector reflector, IReflectClass clazz) { return false; } private static void Translate(IConfiguration config, object obj, IObjectTranslator translator) { config.ObjectClass(obj).Translate(translator); } public static byte[] UpdateClassName(byte[] nameBytes) { return _assemlbyNameMapper.MappedNameFor(nameBytes); } public static Object WeakReferenceTarget(Object weakRef) { WeakReference wr = weakRef as WeakReference; if (wr != null) { return wr.Target; } return weakRef; } internal static object WrapEvaluation(object evaluation) { #if CF || SILVERLIGHT // FIXME: How to better support EvaluationDelegate on the CompactFramework? return evaluation; #else return (evaluation is EvaluationDelegate) ? new EvaluationDelegateWrapper((EvaluationDelegate)evaluation) : evaluation; #endif } public static bool IsTransient(IReflectClass clazz) { Type type = GetNetType(clazz); if (null == type) return false; return IsTransient(type); } public static bool IsTransient(Type type) { return type.IsPointer || type.IsSubclassOf(typeof(Delegate)) #if CF || SILVERLIGHT ; #else || type == typeof(System.Reflection.Pointer); #endif } private static Type GetNetType(IReflectClass clazz) { if (null == clazz) { return null; } NetClass netClass = clazz as NetClass; if (null != netClass) { return netClass.GetNetType(); } IReflectClass claxx = clazz.GetDelegate(); if (claxx == clazz) { return null; } return GetNetType(claxx); } public static NetTypeHandler[] Types(IReflector reflector) { return new NetTypeHandler[] { new SByteHandler(), new DecimalHandler(), new UIntHandler(), new ULongHandler(), new UShortHandler(), }; } public static bool IsSimple(Type a_class) { for (int i1 = 0; i1 < SIMPLE_CLASSES.Length; i1++) { if (a_class == SIMPLE_CLASSES[i1]) { return true; } } return false; } private static Type[] SIMPLE_CLASSES = { typeof(Int32), typeof(Int64), typeof(Single), typeof(Boolean), typeof(Double), typeof(Byte), typeof(Char), typeof(Int16), typeof(String), }; public static DateTime Now() { return DateTime.Now; } internal static bool IsJavaEnum(IReflector genericReflector, IReflectClass iReflectClass) { return false; } internal static bool IsEnum(IReflector genericReflector, IReflectClass iReflectClass) { Type type = GetNetType(iReflectClass); if(type == null) { return false; } return type.IsEnum; } public static bool UseNativeSerialization() { return false; } public static void RegisterPlatformHandlers(ObjectContainerBase container) { EnumTypeHandler enumTypeHandler = new EnumTypeHandler(); container.ConfigImpl.RegisterTypeHandler(new EnumTypeHandlerPredicate(), enumTypeHandler); container.Handlers.RegisterHandlerVersion(enumTypeHandler, 4, new StandardReferenceTypeHandler()); container.Handlers.RegisterHandlerVersion(enumTypeHandler, 0, new StandardReferenceTypeHandler0()); GuidTypeHandler guidTypeHandler = new GuidTypeHandler(); container.ConfigImpl.RegisterTypeHandler(new SingleClassTypeHandlerPredicate(typeof(Guid)), guidTypeHandler); container.Handlers.RegisterHandlerVersion(guidTypeHandler, 8, new StandardReferenceTypeHandler()); DateTimeHandler dateTimeHandler = new DateTimeHandler(); container.Handlers.RegisterNetTypeHandler(dateTimeHandler); container.Handlers.RegisterHandlerVersion(dateTimeHandler, 6, new DateTimeHandler6()); #if !CF DateTimeOffsetTypeHandler dateTimeOffsetHandler = new DateTimeOffsetTypeHandler(); container.ConfigImpl.RegisterTypeHandler(new SingleClassTypeHandlerPredicate(typeof(DateTimeOffset)), dateTimeOffsetHandler); container.Handlers.RegisterHandlerVersion(dateTimeOffsetHandler, 9, new StandardReferenceTypeHandler()); #endif } public static Type[] PrimitiveTypes() { return PRIMITIVE_TYPES; } public static object NullValue(Type type) { if(_nullValues == null) { InitNullValues(); } return _nullValues.Get(type); } private static void InitNullValues() { _nullValues = new Hashtable4(); _nullValues.Put(typeof(int), 0); _nullValues.Put(typeof(uint), (uint)0); _nullValues.Put(typeof(byte), (byte)0); _nullValues.Put(typeof(short), (short)0); _nullValues.Put(typeof(float), (float)0); _nullValues.Put(typeof(double), (double)0); _nullValues.Put(typeof(ulong), (ulong)0); _nullValues.Put(typeof(long), (long)0); _nullValues.Put(typeof(bool), false); _nullValues.Put(typeof(char), (char)0); _nullValues.Put(typeof(sbyte), (sbyte)0); _nullValues.Put(typeof(decimal), (decimal)0); _nullValues.Put(typeof(ushort), (ushort)0); _nullValues.Put(typeof(DateTime), DateTime.MinValue); } private static Hashtable4 _nullValues; public static Type NullableTypeFor(Type primitiveType) { if(_primitive2Wrapper == null) InitPrimitive2Wrapper(); Type wrapperClazz = (Type)_primitive2Wrapper.Get(primitiveType); if(wrapperClazz==null) throw new NotImplementedException(); return wrapperClazz; } private static void InitPrimitive2Wrapper() { _primitive2Wrapper = new Hashtable4(); foreach (Type type in PRIMITIVE_TYPES) { _primitive2Wrapper.Put(type, ConcreteNullableTypeFor(type)); } } private static Type ConcreteNullableTypeFor(Type type) { return typeof (Nullable<>).MakeGenericType(type); } private static Hashtable4 _primitive2Wrapper; private static readonly Type[] PRIMITIVE_TYPES = new Type[] { typeof(int), typeof(uint), typeof(byte), typeof(short), typeof(float), typeof(double), typeof(ulong), typeof(long), typeof(bool), typeof(char), typeof(sbyte), typeof(decimal), typeof(ushort), typeof(DateTime), }; public static void ThrowUncheckedException(Exception exc) { throw exc; } public static sbyte ToSByte(byte b) { return (sbyte)b; } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Collections/0000755000175000017500000000000011700531646030347 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Collections/BigSet.cs0000644000175000017500000000263011700531646032054 0ustar00meebeymeebey00000000000000/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ using System.Collections; using System.Collections.Generic; namespace Db4objects.Db4o.Internal.Collections { public partial class BigSet { #region Implementation of ICollection void ICollection.Add(E item) { Add(item); } bool ICollection.Contains(E item) { return Contains(item); } void ICollection.CopyTo(E[] array, int arrayIndex) { throw new System.NotImplementedException(); } bool ICollection.Remove(E item) { return Remove(item); } public bool IsReadOnly { get { return false; } } IEnumerator IEnumerable.GetEnumerator() { IEnumerator iterator = BTreeIterator(); while (iterator.MoveNext()) { yield return (E)Element((int) iterator.Current); } } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } #endregion #region Implementation of ISet bool Db4o.Collections.ISet.RemoveAll(IEnumerable es) { bool result = false; foreach (E e in es) { if (Remove(e)) { result = true; } } return result; } bool Db4o.Collections.ISet.ContainsAll(IEnumerable es) { foreach (E e in es) { if (!Contains(e)) { return false; } } return true; } #endregion } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/IInternalObjectContainer.cs0000644000175000017500000000036411700531646033302 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Internal { public partial interface IInternalObjectContainer { void WithEnvironment(Action4 action); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Const4.cs0000644000175000017500000000032211700531646027567 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal { public sealed partial class Const4 { public const int MaxStackDepth = 20; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/ObjectContainerSession.cs0000644000175000017500000000443011700531646033036 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal { /// public partial class ObjectContainerSession { void System.IDisposable.Dispose() { Close(); } public IObjectSet Query(Db4objects.Db4o.Query.Predicate match, System.Collections.IComparer comparer) { return _server.Query(_transaction, match, new ComparerAdaptor(comparer)); } public System.Collections.Generic.IList Query(Predicate match) { return _server.Query(_transaction, match); } public System.Collections.Generic.IList Query(Predicate match, System.Collections.Generic.IComparer comparer) { return _server.Query(_transaction, match, comparer); } public System.Collections.Generic.IList Query(Predicate match, System.Comparison comparison) { return _server.Query(_transaction, match, comparison); } public System.Collections.Generic.IList Query(System.Type extent) { return _server.Query(_transaction, extent, null); } public System.Collections.Generic.IList Query(System.Type extent, System.Collections.Generic.IComparer comparer) { return _server.Query(_transaction, extent, comparer); } public System.Collections.Generic.IList Query() { return Query(typeof(Extent)); } public System.Collections.Generic.IList Query(System.Collections.Generic.IComparer comparer) { return Query(typeof(Extent), comparer); } public void WithEnvironment(Action4 action) { _server.WithEnvironment(new RunnableAction(action)); } } } TypeHandlerConfigurationDotNet.cs0000644000175000017500000000766011700531646034437 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections.Generic; using Db4objects.Db4o.Collections; using Db4objects.Db4o.Internal.Collections; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Internal { class TypeHandlerConfigurationDotNet : TypeHandlerConfiguration { public TypeHandlerConfigurationDotNet(Config4Impl config) : base(config) { ListTypeHandler(new CollectionTypeHandler()); MapTypeHandler(new MapTypeHandler()); } public override void Apply() { #if !SILVERLIGHT RegisterCollection(typeof(System.Collections.ArrayList)); RegisterCollection(typeof (System.Collections.CollectionBase)); RegisterMap(typeof (System.Collections.Hashtable)); RegisterMap(typeof (System.Collections.Specialized.HybridDictionary)); #if !CF RegisterMap(typeof (System.Collections.DictionaryBase)); #endif #endif RegisterGenericTypeHandlers(); RegisterBigSetTypeHandler(); RegisterSystemArrayTypeHandler(); } private void RegisterBigSetTypeHandler() { RegisterGenericTypeHandler(typeof(BigSet<>), new BigSetTypeHandler()); } private void RegisterGenericTypeHandlers() { GenericCollectionTypeHandler handler = new GenericCollectionTypeHandler(); handler.RegisterSupportedTypesWith(delegate(Type type) { RegisterGenericTypeHandler(type, handler); }); #if NET_3_5 && ! CF _config.Reflector().RegisterCollection(new GenericCollectionTypePredicate(typeof(HashSet<>))); #endif Type[] dictionaryTypes = new Type[] { typeof(ActivatableDictionary<,>), typeof(Dictionary<,>), #if !SILVERLIGHT typeof(SortedList<,>), #if !CF typeof(SortedDictionary<,>), #endif #endif }; _config.RegisterTypeHandler(new GenericTypeHandlerPredicate(dictionaryTypes), new MapTypeHandler()); } private void RegisterGenericTypeHandler(Type genericTypeDefinition, ITypeHandler4 handler) { _config.RegisterTypeHandler(new GenericTypeHandlerPredicate(genericTypeDefinition), handler); } internal class GenericTypeHandlerPredicate : ITypeHandlerPredicate { private readonly Type[] _genericTypes; internal GenericTypeHandlerPredicate(params Type[] genericType) { _genericTypes = genericType; } public bool Match(IReflectClass classReflector) { Type type = NetReflector.ToNative(classReflector); if (type == null) { return false; } if (!type.IsGenericType) { return false; } return ((IList) _genericTypes).Contains(type.GetGenericTypeDefinition()); } } private void RegisterSystemArrayTypeHandler() { _config.RegisterTypeHandler(new SystemArrayPredicate(), new SystemArrayTypeHandler()); } internal class GenericCollectionTypePredicate : IReflectClassPredicate { private readonly Type _type; internal GenericCollectionTypePredicate(Type t) { _type = t; } public bool Match(IReflectClass classReflector) { Type type = NetReflector.ToNative(classReflector); if (type == null) { return false; } if (!type.IsGenericType) { return false; } return _type == type.GetGenericTypeDefinition(); } } } } LegacyDb4oAssemblyNameMapper.cs0000644000175000017500000000517011700531646033727 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System.Text; using Db4objects.Db4o.Internal.Encoding; namespace Db4objects.Db4o.Internal { internal class LegacyDb4oAssemblyNameMapper { static LegacyDb4oAssemblyNameMapper() { LatinStringIO stringIO = new UnicodeStringIO(); oldAssemblies = new byte[oldAssemblyNames.Length][]; for (int i = 0; i < oldAssemblyNames.Length; i++) { oldAssemblies[i] = stringIO.Write(oldAssemblyNames[i]); } } internal byte[] MappedNameFor(byte[] nameBytes) { for (int i = 0; i < oldAssemblyNames.Length; i++) { byte[] assemblyName = oldAssemblies[i]; int j = assemblyName.Length - 1; for (int k = nameBytes.Length - 1; k >= 0; k--) { if (nameBytes[k] != assemblyName[j]) { break; } j--; if (j < 0) { return UpdateInternalClassName(nameBytes, i); } } } return nameBytes; } private static byte[] UpdateInternalClassName(byte[] bytes, int candidateMatchingAssemblyIndex) { UnicodeStringIO io = new UnicodeStringIO(); string typeFQN = io.Read(bytes); string[] assemblyNameParts = typeFQN.Split(','); if (assemblyNameParts[1].Trim() != oldAssemblyNames[candidateMatchingAssemblyIndex]) { return bytes; } string typeName = assemblyNameParts[0]; return io.Write(FullyQualifiedNameFor(typeName).ToString()); } private static StringBuilder FullyQualifiedNameFor(string typeName) { StringBuilder typeNameBuffer = new StringBuilder(typeName); ApplyNameSpaceRenamings(typeNameBuffer); typeNameBuffer.Append(", "); typeNameBuffer.Append(GetCurrentAssemblyName()); return typeNameBuffer; } private static void ApplyNameSpaceRenamings(StringBuilder typeNameBuffer) { foreach (string[] renaming in NamespaceRenamings) { typeNameBuffer.Replace(renaming[0], renaming[1]); } } private static string GetCurrentAssemblyName() { return typeof(Platform4).Assembly.GetName().Name; } private static readonly string[] oldAssemblyNames = new string[] { "db4o-4.0-net1", "db4o-4.0-compact1" }; private static readonly byte[][] oldAssemblies; private static readonly string[][] NamespaceRenamings = new string[][] { new string[] { "com.db4o.ext", "Db4objects.Db4o.Ext"}, new string[] { "com.db4o.inside", "Db4objects.Db4o.Internal"}, new string[] { "com.db4o", "Db4objects.Db4o"}, }; } } GenericTypeHandlerPredicate.cs0000644000175000017500000000136611700531646033704 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/* Copyright (C) 2008 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; using Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.native.Db4objects.Db4o.Internal { public class GenericTypeHandlerPredicate : ITypeHandlerPredicate { private readonly Type _genericType; public GenericTypeHandlerPredicate(Type genericType) { _genericType = genericType; } public bool Match(IReflectClass classReflector) { Type type = NetReflector.ToNative(classReflector); if (type == null) { return false; } if (!type.IsGenericType) { return false; } return type.GetGenericTypeDefinition() == _genericType; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Marshall/0000755000175000017500000000000011700531646027634 5ustar00meebeymeebey00000000000000MarshallingConstants0.cs0000644000175000017500000000026211700531646034322 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Marshallusing System; namespace Db4objects.Db4o.Internal.Marshall { public class MarshallingConstants0 { public static readonly DateTime NullDate = DateTime.MinValue; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/ObjectContainerBase.cs0000644000175000017500000001461211700531646032270 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System.Collections.Generic; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal { using System; using Query; using Query.Result; using Query.Processor; using Ext; public partial class ObjectContainerBase { void IDisposable.Dispose() { Close(); } public IObjectSet Query(Predicate match, System.Collections.IComparer comparer) { if (null == match) throw new ArgumentNullException("match"); return Query(null, match, new ComparerAdaptor(comparer)); } class GenericComparerAdaptor : IQueryComparator { private readonly IComparer _comparer; public GenericComparerAdaptor(IComparer comparer) { _comparer = comparer; } public int Compare(object first, object second) { return _comparer.Compare((T)first, (T)second); } } class GenericComparisonAdaptor : DelegateEnvelope, IQueryComparator { public GenericComparisonAdaptor(Comparison comparer) : base(comparer) { } public int Compare(object first, object second) { Comparison _comparer = (Comparison)GetContent(); return _comparer((T)first, (T)second); } } public IList Query(Predicate match) { return Query(null, match); } public IList Query(Transaction trans, Predicate match) { return ExecuteNativeQuery(trans, match, null); } public IList Query(Predicate match, IComparer comparer) { return Query(null, match, comparer); } public IList Query(Transaction trans, Predicate match, IComparer comparer) { IQueryComparator comparator = null != comparer ? new GenericComparerAdaptor(comparer) : null; return ExecuteNativeQuery(trans, match, comparator); } public IList Query(Predicate match, Comparison comparison) { return Query(null, match, comparison); } public IList Query(Transaction trans, Predicate match, Comparison comparison) { IQueryComparator comparator = null != comparison ? new GenericComparisonAdaptor(comparison) : null; return ExecuteNativeQuery(trans, match, comparator); } public IList Query(Type extent) { return Query(null, extent, null); } public IList Query(Transaction trans, Type extent) { return Query(trans, extent, null); } public IList Query(Type extent, IComparer comparer) { return Query(null, extent, comparer); } public IList Query(Transaction trans, Type extent, IComparer comparer) { lock (Lock()) { trans = CheckTransaction(trans); QQuery query = (QQuery)Query(trans); query.Constrain(extent); if (null != comparer) query.SortBy(new GenericComparerAdaptor(comparer)); IQueryResult queryResult = query.GetQueryResult(); return new GenericObjectSetFacade(queryResult); } } public IList Query() { return Query(typeof(Extent)); } public IList Query(IComparer comparer) { return Query(typeof(Extent), comparer); } private IList ExecuteNativeQuery(Transaction trans, Predicate match, IQueryComparator comparator) { if (null == match) throw new ArgumentNullException("match"); lock (Lock()) { IQuery query = Query(CheckTransaction(trans)); return (IList) ((QQuery)query).TriggeringQueryEvents(Closures4.ForDelegate( delegate() { return GetNativeQueryHandler().Execute(query, match, comparator); })); } } public delegate R SyncExecClosure(); public R SyncExec(SyncExecClosure closure) { return (R)SyncExec(new SyncExecClosure4(closure)); } public class SyncExecClosure4 : IClosure4 { private readonly SyncExecClosure _closure; public SyncExecClosure4(SyncExecClosure closure) { _closure = closure; } #region Implementation of IClosure4 public object Run() { return _closure.Invoke(); } #endregion } private object AsTopLevelCall(IFunction4 block, Transaction trans) { trans = CheckTransaction(trans); BeginTopLevelCall(); try { return block.Apply(trans); } catch(Db4oRecoverableException exc) { throw; } catch(SystemException exc) { throw; } catch(Exception exc) { FatalShutdown(exc); } finally { EndTopLevelCall(); } // should never happen - just to make compiler happy throw new Db4oException(); } public void WithEnvironment(Action4 action) { WithEnvironment(new RunnableAction(action)); } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Config4Impl.cs0000644000175000017500000000145311700531646030536 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Internal { public partial class Config4Impl { private static ILegacyClientServerFactory DefaultClientServerFactory() { Assembly csAssembly = Assembly.Load(ClientServerAssemblyName()); return (ILegacyClientServerFactory) Activator.CreateInstance(csAssembly.GetType("Db4objects.Db4o.CS.Internal.Config.LegacyClientServerFactoryImpl")); } private static string ClientServerAssemblyName() { Assembly db4oAssembly = typeof(IObjectContainer).Assembly; string db4oAssemblySimpleName = db4oAssembly.GetName().Name; return db4oAssembly.FullName.Replace(db4oAssemblySimpleName, "Db4objects.Db4o.CS"); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/0000755000175000017500000000000011700531646027511 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/Conversions/0000755000175000017500000000000011700531646032021 5ustar00meebeymeebey00000000000000DropDateTimeOffsetClassIndexes_7_12.cs0000644000175000017500000000076011700531646041022 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Internal.Convert.Conversions { public partial class DropDateTimeOffsetClassIndexes_7_12 : DropClassIndexesConversion { protected override bool Accept(ClassMetadata classmetadata) { #if CF || SILVERLIGHT return false; #else return NetReflector.ToNative(classmetadata.ClassReflector()) == typeof(DateTimeOffset); #endif } } } ReindexNetDateTime_7_8.cs0000644000175000017500000000262311700531646036433 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2004 - 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Internal.Convert.Conversions { partial class ReindexNetDateTime_7_8 : Conversion { public override void Convert(ConversionStage.SystemUpStage stage) { ReindexDateTimeFields(stage); } private static void ReindexDateTimeFields(ConversionStage stage) { DateTimeFieldReindexer reindexer = new DateTimeFieldReindexer(); ClassMetadataIterator i = stage.File().ClassCollection().Iterator(); while (i.MoveNext()) { ClassMetadata classmetadata = i.CurrentClass(); classmetadata.TraverseDeclaredFields(reindexer); } } private class DateTimeFieldReindexer : IProcedure4 { public void Apply(object field) { if (!((FieldMetadata)field).HasIndex()) { return; } ReindexDateTimeField(((FieldMetadata)field)); } private static void ReindexDateTimeField(IStoredField field) { IReflectClass claxx = field.GetStoredType(); if (claxx == null) { return; } Type t = NetReflector.ToNative(claxx); if (t == typeof(DateTime) || t == typeof(DateTime?)) { field.DropIndex(); field.CreateIndex(); } } } } } DropGuidClassIndexes_7_12.cs0000644000175000017500000000064411700531646037050 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Internal.Convert.Conversions { public partial class DropGuidClassIndexes_7_12 : DropClassIndexesConversion { protected override bool Accept(ClassMetadata classmetadata) { return NetReflector.ToNative(classmetadata.ClassReflector()) == typeof(Guid); } } } DropEnumClassIndexes_7_10.cs0000644000175000017500000000071011700531646037054 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Internal.Convert.Conversions { public partial class DropEnumClassIndexes_7_10 : DropClassIndexesConversion { protected override bool Accept(ClassMetadata classmetadata) { Type type = NetReflector.ToNative(classmetadata.ClassReflector()); return type != null ? type.IsEnum : false; } } } DropClassIndexesConversion.cs0000644000175000017500000000116411700531646037553 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Convert/Conversions/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Internal.Convert.Conversions { public abstract class DropClassIndexesConversion : Conversion { public override void Convert(ConversionStage.SystemUpStage stage) { LocalObjectContainer file = stage.File(); ClassMetadataIterator i = file.ClassCollection().Iterator(); while (i.MoveNext()) { ClassMetadata classmetadata = i.CurrentClass(); if (Accept(classmetadata)) { classmetadata.DropClassIndex(); } } } protected abstract bool Accept(ClassMetadata classmetadata); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/ComparerAdaptor.cs0000644000175000017500000000104211700531646031500 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.Text; namespace Db4objects.Db4o.Internal { class ComparerAdaptor : Db4objects.Db4o.Query.IQueryComparator { private System.Collections.IComparer _comparer; public ComparerAdaptor(System.Collections.IComparer comparer) { _comparer = comparer; } public int Compare(object first, object second) { return _comparer.Compare(first, second); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Encoding/0000755000175000017500000000000011700531646027617 5ustar00meebeymeebey00000000000000UTF8StringEncoding.cs0000644000175000017500000000101611700531646033451 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Internal/Encoding/* Copyright (C) 2008 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Internal.Encoding { public class UTF8StringEncoding : BuiltInStringEncoding { public override byte[] Encode(String str) { return System.Text.Encoding.UTF8.GetBytes(str); } public override String Decode(byte[] bytes, int start, int length) { return System.Text.Encoding.UTF8.GetString(bytes, start, length); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/0000755000175000017500000000000011700531646026423 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/RunnableAction.cs0000644000175000017500000000057111700531646031661 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using Sharpen.Lang; namespace Db4objects.Db4o.Foundation { public delegate void Action4(); public class RunnableAction : IRunnable { private readonly Action4 _action; public RunnableAction(Action4 action) { _action = action; } public void Run() { _action(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/Coercion4.cs0000644000175000017500000000355711700531646030611 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Foundation { public class Coercion4 { public static object ToByte(object obj) { if (obj is byte) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToByte(null); return Db4objects.Db4o.Foundation.No4.Instance; } public static object ToSByte(object obj) { if (obj is sbyte) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToSByte(null); return Db4objects.Db4o.Foundation.No4.Instance; } public static object ToShort(object obj) { if (obj is short) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToInt16(null); return Db4objects.Db4o.Foundation.No4.Instance; } public static object ToInt(object obj) { if (obj is int) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToInt32(null); return Db4objects.Db4o.Foundation.No4.Instance; } public static object ToLong(object obj) { if (obj is long) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToInt64(null); return Db4objects.Db4o.Foundation.No4.Instance; } public static object ToFloat(object obj) { if (obj is float) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToSingle(null); return Db4objects.Db4o.Foundation.No4.Instance; } public static object ToDouble(object obj) { if (obj is double) return obj; IConvertible convertible = obj as IConvertible; if (null != convertible) return convertible.ToDouble(null); return Db4objects.Db4o.Foundation.No4.Instance; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/SignatureGenerator.cs0000644000175000017500000000165511700531646032571 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Foundation { public sealed class SignatureGenerator { private static Random _random = new Random(); private static int _counter; public static string GenerateSignature() { string signature = ToHexString(Environment.TickCount); signature += Pad(ToHexString(_random.Next())); signature += Guid.NewGuid(); signature += ToHexString(_counter++); return signature; } private static string ToHexString(int i) { return i.ToString("X"); } private static string ToHexString(long l) { return l.ToString("X"); } private static string Pad(String str) { return (str + "XXXXXXXX").Substring(0, 8); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/IO/0000755000175000017500000000000011700531646026732 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/IO/File4.cs0000644000175000017500000000114111700531646030221 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using System; using System.IO; namespace Db4objects.Db4o.Foundation.IO { public class File4 { public static void Delete(string file) { if (File.Exists(file)) { File.Delete(file); } } public static void Copy(string from, string to) { File.Copy(from, to, true); } public static long Size(string filePath) { return new System.IO.FileInfo(filePath).Length; } } } #endif smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/Collections/0000755000175000017500000000000011700531646030701 5ustar00meebeymeebey00000000000000CollectionInitializer.cs0000644000175000017500000001436611700531646035462 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/Collections/* Copyright (C) 2008 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; #if CF using System.Reflection; #endif namespace Db4objects.Db4o.Foundation.Collections { public interface ICollectionInitializer { void Clear(); void Add(object o); void FinishAdding(); int Count(); } public sealed class CollectionInitializer { private static readonly Dictionary _initializerByType = new Dictionary(); static CollectionInitializer() { _initializerByType[typeof (ICollection<>)] = typeof (CollectionInitializerImpl<>); _initializerByType[typeof(Stack<>)] = typeof(StackInitializer<>); _initializerByType[typeof(Queue<>)] = typeof(QueueInitializer<>); #if NET_3_5 && ! CF _initializerByType[typeof (HashSet<>)] = typeof (HashSetInitializer<>); #endif } public static ICollectionInitializer For(object destination) { if (IsNonGenericList(destination)) { return new ListInitializer((IList)destination); } return InitializerFor(destination); } private static ICollectionInitializer InitializerFor(object destination) { Type destinationType = destination.GetType(); if (!destinationType.IsGenericType) { throw new ArgumentException("Unknown collection: " + destination); } Type containerType = GenericContainerTypeFor(destination); if (containerType != null) { return GetInitializer(destination, _initializerByType[containerType]); } throw new ArgumentException("Unknown collection: " + destination); } private static Type GenericContainerTypeFor(object destination) { Type containerType = destination.GetType().GetGenericTypeDefinition(); while (containerType != null && !_initializerByType.ContainsKey(containerType)) { foreach (Type interfaceType in containerType.GetInterfaces()) { if (!interfaceType.IsGenericType) { continue; } Type genericInterfaceType = interfaceType.GetGenericTypeDefinition(); if (_initializerByType.ContainsKey(genericInterfaceType)) { return genericInterfaceType; } } containerType = containerType.BaseType; } return containerType; } private static ICollectionInitializer GetInitializer(object destination, Type initializerType) { ICollectionInitializer initializer = null; Type containedElementType = ContainerElementTypeFor(destination); if (containedElementType != null) { Type genericProtocolType = initializerType.MakeGenericType(containedElementType); initializer = InstantiateInitializer(destination, genericProtocolType); } return initializer; } private static bool IsNonGenericList(object destination) { return !destination.GetType().IsGenericType && destination is IList; } private static ICollectionInitializer InstantiateInitializer(object destination, Type genericProtocolType) { #if !CF return (ICollectionInitializer) Activator.CreateInstance(genericProtocolType, destination); #else ConstructorInfo constructor = genericProtocolType.GetConstructors()[0]; return (ICollectionInitializer) constructor.Invoke(new object[] {destination}); #endif } private static Type ContainerElementTypeFor(object destination) { Type containerType = destination.GetType(); return containerType.GetGenericArguments()[0]; } private sealed class ListInitializer : ICollectionInitializer { private readonly IList _list; public ListInitializer(IList list) { _list = list; } public void Clear() { _list.Clear(); } public void Add(object o) { _list.Add(o); } public int Count() { return _list.Count; } public void FinishAdding() { } } private sealed class CollectionInitializerImpl : ICollectionInitializer { private readonly ICollection _collection; public CollectionInitializerImpl(ICollection collection) { _collection = collection; } public void Clear() { _collection.Clear(); } public int Count() { return _collection.Count; } public void Add(object o) { _collection.Add((T)o); } public void FinishAdding() { } } private sealed class StackInitializer : ICollectionInitializer { private readonly Stack _stack; private readonly Stack _tempStack; public StackInitializer(Stack stack) { _stack= stack; _tempStack = new Stack(); } public void Clear() { _tempStack.Clear(); _stack.Clear(); } public int Count() { return _stack.Count; } public void Add(object o) { _tempStack.Push((T) o); } public void FinishAdding() { foreach(T item in _tempStack) { _stack.Push(item); } _tempStack.Clear(); } } private sealed class QueueInitializer : ICollectionInitializer { private readonly Queue _queue; public QueueInitializer(Queue queue) { _queue = queue; } public void Clear() { _queue.Clear(); } public int Count() { return _queue.Count; } public void Add(object o) { _queue.Enqueue((T) o); } public void FinishAdding() { } } #if NET_3_5 && ! CF private sealed class HashSetInitializer : ICollectionInitializer { private readonly HashSet _hashSet; public HashSetInitializer(HashSet stack) { _hashSet = stack; } public void Clear() { _hashSet.Clear(); } public void Add(object o) { _hashSet.Add((T)o); } public int Count() { return _hashSet.Count; } public void FinishAdding() { } } #endif } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/My.cs0000644000175000017500000000040011700531646027331 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { public class My { public static TService Instance { get { return (TService)Environments.My(typeof(TService)); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/CRC32.cs0000644000175000017500000000254311700531646027532 0ustar00meebeymeebey00000000000000namespace Db4objects.Db4o.Foundation { public class CRC32 { private static uint[] crcTable; static CRC32() { BuildCRCTable(); } private static void BuildCRCTable() { uint Crc32Polynomial = 0xEDB88320; uint i; uint j; uint crc; crcTable = new uint[256]; for (i = 0; i <= 255; i++) { crc = i; for (j = 8; j > 0; j--) { if ((crc & 1) == 1) { crc = ((crc) >> (1 & 0x1f)) ^ Crc32Polynomial; } else { crc = crc >> (1 & 0x1f); } } crcTable[i] = crc; } } public static long CheckSum(byte[] buffer, int start, int count) { uint temp1; uint temp2; int i = start; uint crc = 0xFFFFFFFF; while (count-- != 0) { temp1 = (crc) >> (8 & 0x1f); temp2 = crcTable[(crc ^ buffer[i++]) & 0xFF]; crc = temp1 ^ temp2; } return (long)~crc & 0xFFFFFFFFL; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/Environments.cs0000644000175000017500000000174211700531646031445 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Foundation { public partial class Environments { public static string DefaultImplementationFor(Type type) { string implName = ("." + type.Name.Substring(1) + "Impl"); if (type.Namespace.IndexOf(".Internal.") > 0) return type.Namespace + implName + ", " + AssemblyNameFor(type); int lastDot = type.Namespace.LastIndexOf('.'); string typeName = type.Namespace.Substring(0, lastDot) + ".Internal." + type.Namespace.Substring(lastDot + 1) + implName; return typeName + ", " + AssemblyNameFor(type); } private static string AssemblyNameFor(Type type) { #if SILVERLIGHT string fullyQualifiedTypeName = type.AssemblyQualifiedName; int assemblyNameSeparator = fullyQualifiedTypeName.IndexOf(','); return fullyQualifiedTypeName.Substring(assemblyNameSeparator + 1); #else return type.Assembly.GetName().Name; #endif } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/Iterators.cs0000644000175000017500000000245211700531646030731 0ustar00meebeymeebey00000000000000using System.Collections; using System.Collections.Generic; namespace Db4objects.Db4o.Foundation { public delegate B Function(A a); public struct Tuple { public A a; public B b; public Tuple(A a, B b) { this.a = a; this.b = b; } } public partial class Iterators { public static IEnumerator Map(System.Array array, IFunction4 function) { return Map(array.GetEnumerator(), function); } public static IEnumerable Cast(IEnumerable source) { foreach (object o in source) yield return (T) o; } public static IEnumerable> Zip(IEnumerable @as, IEnumerable bs) { return Zip(Cast(@as), Cast(bs)); } public static IEnumerable> Zip(IEnumerable @as, IEnumerable bs) { IEnumerator bsEnumerator = bs.GetEnumerator(); foreach (A a in @as) { if (!bsEnumerator.MoveNext()) { yield break; } yield return new Tuple(a, bsEnumerator.Current); } } public static IEnumerable Unique(IEnumerable enumerable) { Hashtable seen = new Hashtable(); foreach (object item in enumerable) { if (seen.ContainsKey(item)) continue; seen.Add(item, item); yield return item; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Foundation/Closures4.cs0000644000175000017500000000104211700531646030632 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Foundation { class Closures4 { public delegate object Closure(); public static IClosure4 ForDelegate(Closure @delegate) { return new Closure4OverDelegate(@delegate); } internal class Closure4OverDelegate : IClosure4 { private Closure _delegate; public Closure4OverDelegate(Closure @delegate) { _delegate = @delegate; } public object Run() { return _delegate(); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/IO/0000755000175000017500000000000011700531646024624 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/IO/RandomAccessFileFactory.cs0000644000175000017500000000221111700531646031641 0ustar00meebeymeebey00000000000000using System; using System.IO; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Sharpen.IO; using File=Sharpen.IO.File; namespace Db4objects.Db4o.IO { public class RandomAccessFileFactory { public static RandomAccessFile NewRandomAccessFile(String path, bool readOnly, bool lockFile) { RandomAccessFile raf = null; bool ok = false; try { raf = new RandomAccessFile(path, readOnly, lockFile); if (lockFile) { Platform4.LockFile(path, raf); } ok = true; return raf; } catch (IOException x) { if (new File(path).Exists()) { throw new DatabaseFileLockedException(path, x); } throw new Db4oIOException(x); } finally { if(!ok && raf != null) { raf.Close(); } } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/0000755000175000017500000000000011700531646025701 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/Net/0000755000175000017500000000000011700531646026427 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/Net/NetField.cs0000644000175000017500000000577011700531646030461 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.Reflect.Net { public class NetField : IReflectField { private readonly IReflector _reflector; protected readonly FieldInfo _field; private static IList _transientMarkers; public NetField(IReflector reflector, FieldInfo field) { _reflector = reflector; _field = field; } public override string ToString() { return string.Format("NetField({0})", _field); } public virtual string GetName() { return _field.Name; } public virtual IReflectClass GetFieldType() { return _reflector.ForClass(_field.FieldType); } public virtual bool IsPublic() { return _field.IsPublic; } public virtual bool IsStatic() { return _field.IsStatic; } public virtual bool IsTransient() { return IsTransient(_field); } public virtual void SetAccessible() { } public virtual object Get(object onObject) { try { return _field.GetValue(onObject); } catch(Exception e) { throw new Db4oException(e); } } public virtual void Set(object onObject, object attribute) { try { _field.SetValue(onObject, attribute); } catch(Exception e) { throw new Db4oException(e); } } public object IndexEntry(object orig) { return orig; } public IReflectClass IndexType() { return GetFieldType(); } public static bool IsTransient(FieldInfo field) { if (field.IsNotSerialized) return true; if (field.IsDefined(typeof(TransientAttribute), true)) return true; if (_transientMarkers == null) return false; return CheckForTransient(field.GetCustomAttributes(true)); } private static bool CheckForTransient(object[] attributes) { if (attributes == null) return false; foreach (object attribute in attributes) { string attributeName = attribute.GetType().FullName; if (_transientMarkers.Contains(attributeName)) return true; } return false; } public static void MarkTransient(Type attributeType) { MarkTransient(attributeType.FullName); } public static void MarkTransient(string attributeName) { if (_transientMarkers == null) { _transientMarkers = new List(); } else if (_transientMarkers.Contains(attributeName)) { return; } _transientMarkers.Add(attributeName); } public static void ResetTransientMarkers() { _transientMarkers = null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/Net/NetMethod.cs0000644000175000017500000000215211700531646030645 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Reflect.Net { public class NetMethod : Db4objects.Db4o.Reflect.IReflectMethod { private readonly System.Reflection.MethodInfo method; private readonly Db4objects.Db4o.Reflect.IReflector _reflector; public NetMethod(Db4objects.Db4o.Reflect.IReflector reflector, System.Reflection.MethodInfo method) { _reflector = reflector; this.method = method; } public Db4objects.Db4o.Reflect.IReflectClass GetReturnType() { return _reflector.ForClass(method.ReturnType); } public virtual object Invoke(object onObject, object[] parameters) { try { return method.Invoke(onObject, parameters); } catch (System.Reflection.TargetInvocationException e) { throw new Db4objects.Db4o.Internal.ReflectException(e.InnerException); } #if CF catch (System.Exception e) { throw new Db4objects.Db4o.Internal.ReflectException(e); } #endif } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/Net/NetReflector.cs0000644000175000017500000001053411700531646031355 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Reflect.Net { public class NetReflector : IReflector { protected IReflector _parent; private IReflectArray _array; private IReflectorConfiguration _config; public NetReflector(IReflectorConfiguration config) { _config = config; } public NetReflector() : this(new DefaultConfiguration()) { } public virtual IReflectArray Array() { if(_array == null) { _array = new NetArray(Parent()); } return _array; } public virtual object DeepClone(object obj) { return new NetReflector(_config); } public virtual IReflectClass ForClass(Type forType) { if(forType == null) { return null; } Type underlyingType = GetUnderlyingType(forType); if (underlyingType.IsPrimitive) { return CreateClass(forType); } return CreateClass(underlyingType); } protected virtual IReflectClass CreateClass(Type type) { if(type == null) { return null; } return new NetClass(Parent(), this, type); } private static Type GetUnderlyingType(Type type) { if(type == null) { return null; } Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null) { return underlyingType; } return type; } public virtual IReflectClass ForName(string className) { try { Type type = ReflectPlatform.ForName(className); if (type == null) return null; return ForClass(type); } catch { } return null; } public virtual IReflectClass ForObject(object a_object) { if (a_object == null) { return null; } return Parent().ForClass(a_object.GetType()); } public virtual bool IsCollection(IReflectClass candidate) { if (candidate.IsArray()) { return false; } NetClass netClass = candidate as NetClass; if (null == netClass) { return false; } return typeof(System.Collections.ICollection).IsAssignableFrom(netClass.GetNetType()); } public virtual bool MethodCallsSupported() { return true; } public static IReflectClass[] ToMeta(IReflector reflector, Type[] clazz) { IReflectClass[] claxx = null; if (clazz != null) { claxx = new IReflectClass[clazz.Length]; for (int i = 0; i < clazz.Length; i++) { if (clazz[i] != null) { claxx[i] = reflector.ForClass(clazz[i]); } } } return claxx; } public static Type[] ToNative(IReflectClass[] claxx) { Type[] clazz = null; if (claxx != null) { clazz = new Type[claxx.Length]; for (int i = 0; i < claxx.Length; i++) { if (claxx[i] != null) { IReflectClass reflectClass = claxx[i]; clazz[i] = ToNative(reflectClass); } } } return clazz; } public static Type ToNative(IReflectClass reflectClass) { NetClass netClass = reflectClass.GetDelegate() as NetClass; if(netClass == null) { return null; } return netClass.GetNetType(); } public virtual void SetParent(IReflector reflector) { _parent = reflector; } public virtual void Configuration(IReflectorConfiguration config) { _config = config; } public virtual IReflectorConfiguration Configuration() { return _config; } public virtual object NullValue(IReflectClass clazz) { return Platform4.NullValue(ToNative(clazz)); } protected IReflector Parent() { if(_parent == null) { return this; } return _parent; } private class DefaultConfiguration : IReflectorConfiguration { public bool TestConstructors() { return false; } public bool CallConstructor(IReflectClass clazz) { return false; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/Net/NetConstructor.cs0000644000175000017500000000207111700531646031752 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ namespace Db4objects.Db4o.Reflect.Net { /// Reflection implementation for Constructor to map to .NET reflection. public class NetConstructor : Db4objects.Db4o.Reflect.Core.IReflectConstructor { private readonly Db4objects.Db4o.Reflect.IReflector reflector; private readonly System.Reflection.ConstructorInfo constructor; public NetConstructor(Db4objects.Db4o.Reflect.IReflector reflector, System.Reflection.ConstructorInfo constructor) { this.reflector = reflector; this.constructor = constructor; Db4objects.Db4o.Internal.Platform4.SetAccessible(constructor); } public virtual Db4objects.Db4o.Reflect.IReflectClass[] GetParameterTypes() { return Db4objects.Db4o.Reflect.Net.NetReflector.ToMeta(reflector, Sharpen.Runtime.GetParameterTypes(constructor)); } public virtual object NewInstance(object[] parameters) { try { return constructor.Invoke(parameters); } catch { return null; } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Reflect/Net/NetArray.cs0000644000175000017500000000723611700531646030513 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Reflect.Net { public class NetArray : Db4objects.Db4o.Reflect.Core.AbstractReflectArray { public NetArray(IReflector reflector) : base(reflector) { } private static Type GetNetType(IReflectClass clazz) { return ((NetClass)clazz).GetNetType(); } public override void Analyze(object obj, ArrayInfo info) { info.Nullable(IsNullableType(obj.GetType())); } private bool IsNullableType(Type type) { if (type.IsArray) { return IsNullableType(type.GetElementType()); } Type underlyingType = Nullable.GetUnderlyingType(type); return underlyingType != null; } public override object NewInstance(IReflectClass componentType, ArrayInfo info) { Type type = GetNetType(componentType); if (info.Nullable()) { type = NullableType(type); } MultidimensionalArrayInfo multiDimensionalInfo = info as MultidimensionalArrayInfo; if (multiDimensionalInfo == null) { return System.Array.CreateInstance(type, info.ElementCount()); } int[] dimensions = multiDimensionalInfo.Dimensions(); if (dimensions.Length == 1) { return UnfoldArrayCreation(type, dimensions, 0); } return UnfoldArrayCreation(GetArrayType(type, dimensions.Length - 1), dimensions, 0); } private Type NullableType(Type type) { if(IsNullableType(type)) { return type; } return typeof(Nullable<>).MakeGenericType(new Type[] { type }); } public override object NewInstance(IReflectClass componentType, int[] dimensions) { Type type = GetNetType(componentType); if (dimensions.Length == 1) { return UnfoldArrayCreation(type, dimensions, 0); } return UnfoldArrayCreation(GetArrayType(type, dimensions.Length - 1), dimensions, 0); } private static object UnfoldArrayCreation(Type type, int[] dimensions, int dimensionIndex) { int length = dimensions[dimensionIndex]; Array array = Array.CreateInstance(type, length); if (dimensionIndex == dimensions.Length - 1) { return array; } for (int i=0; iReflection implementation for Class to map to .NET reflection. /// Reflection implementation for Class to map to .NET reflection. public class NetClass : IConstructorAwareReflectClass { protected readonly IReflector _reflector; private readonly NetReflector _netReflector; private readonly Type _type; private ReflectConstructorSpec _constructor; private string _name; private IReflectField[] _fields; public NetClass(IReflector reflector, NetReflector netReflector, Type clazz) { if(reflector == null) { throw new ArgumentNullException("reflector"); } if(netReflector == null) { throw new ArgumentNullException("netReflector"); } _reflector = reflector; _netReflector = netReflector; _type = clazz; _constructor = ReflectConstructorSpec.UnspecifiedConstructor; } public virtual IReflectClass GetComponentType() { return _reflector.ForClass(_type.GetElementType()); } private IReflectConstructor[] GetDeclaredConstructors() { ConstructorInfo[] constructors = _type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); IReflectConstructor[] reflectors = new IReflectConstructor[constructors.Length]; for (int i = 0; i < constructors.Length; i++) { reflectors[i] = new NetConstructor(_reflector, constructors[i]); } return reflectors; } public virtual IReflectField GetDeclaredField(string name) { foreach (IReflectField field in GetDeclaredFields()) { if (field.GetName() == name) return field; } return null; } public virtual IReflectField[] GetDeclaredFields() { if (_fields == null) { _fields = CreateDeclaredFieldsArray(); } return _fields; } private IReflectField[] CreateDeclaredFieldsArray() { FieldInfo[] fields = Sharpen.Runtime.GetDeclaredFields(_type); IReflectField[] reflectors = new IReflectField[fields.Length]; for (int i = 0; i < reflectors.Length; i++) { reflectors[i] = CreateField(fields[i]); } return reflectors; } protected virtual IReflectField CreateField(FieldInfo field) { return new NetField(_reflector, field); } public virtual IReflectClass GetDelegate() { return this; } public virtual IReflectMethod GetMethod(string methodName, IReflectClass[] paramClasses) { try { Type[] parameterTypes = NetReflector.ToNative(paramClasses); MethodInfo method = GetMethod(_type, methodName, parameterTypes); if (method == null) { return null; } return new NetMethod(_reflector, method); } catch { return null; } } private static MethodInfo GetMethod(Type type, string methodName, Type[] parameterTypes) { MethodInfo found = Sharpen.Runtime.GetDeclaredMethod(type, methodName, parameterTypes); if (found != null) return found; Type baseType = type.BaseType; if (null == baseType) return null; return GetMethod(baseType, methodName, parameterTypes); } public virtual string GetName() { if (_name == null) { _name = TypeReference.FromType(_type).GetUnversionedName(); } return _name; } public virtual IReflectClass GetSuperclass() { return _reflector.ForClass(_type.BaseType); } public virtual bool IsAbstract() { return _type.IsAbstract; } public virtual bool IsArray() { return _type.IsArray; } public virtual bool IsAssignableFrom(IReflectClass type) { if (!(type is NetClass)) { return false; } return _type.IsAssignableFrom(((NetClass)type).GetNetType()); } public virtual bool IsInstance(object obj) { return _type.IsInstanceOfType(obj); } public virtual bool IsInterface() { return _type.IsInterface; } public virtual bool IsCollection() { return _reflector.IsCollection(this); } public virtual bool IsPrimitive() { return _type.IsPrimitive || _type == typeof(DateTime) || _type == typeof(decimal); } public virtual object NewInstance() { CreateConstructor(); return _constructor.NewInstance(); } public virtual Type GetNetType() { return _type; } public virtual IReflector Reflector() { return _reflector; } public virtual IReflectConstructor GetSerializableConstructor() { #if !CF && !SILVERLIGHT return new SerializationConstructor(GetNetType()); #else return null; #endif } public override string ToString() { return "NetClass(" + _type + ")"; } public virtual object NullValue() { return _netReflector.NullValue(this); } private void CreateConstructor() { if(!_constructor.CanBeInstantiated().IsUnspecified()) { return; } _constructor = ConstructorSupport.CreateConstructor(this, _type, _netReflector.Configuration(), GetDeclaredConstructors()); } public virtual bool EnsureCanBeInstantiated() { CreateConstructor(); return _constructor.CanBeInstantiated().DefiniteYes(); } public bool IsImmutable() { return IsPrimitive() || Platform4.IsSimple(_type); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Query/0000755000175000017500000000000011700531646025422 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Query/EvaluationDelegate.cs0000644000175000017500000000026511700531646031516 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Query { public delegate void EvaluationDelegate(ICandidate candidate); } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Query/PredicatePlatform.cs0000755000175000017500000000106211700531646031360 0ustar00meebeymeebey00000000000000using System; namespace Db4objects.Db4o.Query { using System.Reflection; public sealed class PredicatePlatform { public static readonly string PredicatemethodName = "Match"; public static bool IsFilterMethod(MethodInfo method) { if (method.GetParameters().Length != 1) return false; return method.Name == PredicatemethodName; } public static T GetField(Object obj, string fieldName) { return (T) obj.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj); } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Query/ISodaQueryFactory.cs0000644000175000017500000000123611700531646031330 0ustar00meebeymeebey00000000000000using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Query { public interface ISodaQueryFactory { /// /// creates a new SODA /// Query /// . ///

/// Linq queries are the recommended main db4o query interface. ///

/// Use /// QueryByExample(Object template) /// for simple Query-By-Example.

///
/// a new IQuery object IQuery Query(); } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/IObjectContainer.cs0000644000175000017500000005645311700531646030043 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 1010 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; namespace Db4objects.Db4o { /// the interface to a db4o database, stand-alone or client/server. /// /// the interface to a db4o database, stand-alone or client/server. ///

The IObjectContainer interface provides methods /// to store, query and delete objects and to commit and rollback /// transactions.

/// An IObjectContainer can either represent a stand-alone database /// or a connection to a /// db4o server /// . ///

An IObjectContainer also represents a transaction. All work /// with db4o always is transactional. Both /// Db4objects.Db4o.IObjectContainer.Commit /// and /// Db4objects.Db4o.IObjectContainer.Rollback /// start new transactions immediately. For working /// against the same database with multiple transactions, open a db4o server /// with /// Db4objects.Db4o.Db4o.OpenServer /// and /// connect locally /// or /// over TCP /// . ///
/// IExtObjectContainer for extended functionality. /// public interface IObjectContainer : System.IDisposable, ISodaQueryFactory { /// activates all members on a stored object to the specified depth. /// /// activates all members on a stored object to the specified depth. ///

/// See /// "Why activation" /// for an explanation why activation is necessary.

/// The activate method activates a graph of persistent objects in memory. /// Only deactivated objects in the graph will be touched: their /// fields will be loaded from the database. /// The activate methods starts from a /// root object and traverses all member objects to the depth specified by the /// depth parameter. The depth parameter is the distance in "field hops" /// (object.field.field) away from the root object. The nodes at 'depth' level /// away from the root (for a depth of 3: object.member.member) will be instantiated /// but deactivated, their fields will be null. /// The activation depth of individual classes can be overruled /// with the methods /// MaximumActivationDepth() /// /// and /// MinimumActivationDepth() /// /// in the /// ObjectClass interface /// .

/// A successful call to activate triggers Activating and Activated callback methods, /// which can be used for cascaded activation.

///
/// Why activation? /// Using callbacks /// the object to be activated. /// /// the member /// depth /// to which activate is to cascade. /// void Activate(object obj, int depth); /// closes this IObjectContainer. /// /// closes this IObjectContainer. ///

A call to Close() automatically performs a /// Commit() /// . ///

Note that every session opened with Db4oFactory.OpenFile() requires one /// Close()call, even if the same filename was used multiple times.

/// Use while(!Close()){} to kill all sessions using this container.

///
/// /// success - true denotes that the last used instance of this container /// and the database file were closed. /// bool Close(); /// commits the running transaction. /// /// commits the running transaction. ///

Transactions are back-to-back. A call to commit will starts /// a new transaction immedidately. ///
void Commit(); /// deactivates a stored object by setting all members to NULL. /// /// /// deactivates a stored object by setting all members to NULL. ///
Primitive types will be set to their default values. /// Calls to this method save memory. /// The method has no effect, if the passed object is not stored in the /// IObjectContainer.

/// Deactivate() triggers Deactivating and Deactivated callbacks. ///

/// Be aware that calling this method with a depth parameter greater than /// 1 sets members on member objects to null. This may have side effects /// in other places of the application.

///
/// Using callbacks /// Why activation? /// the object to be deactivated. /// /// the member /// depth /// /// to which deactivate is to cascade. /// void Deactivate(object obj, int depth); /// deletes a stored object permanently. /// /// deletes a stored object permanently. ///

Note that this method has to be called for every single object /// individually. Delete does not recurse to object members. Simple /// and array member types are destroyed. ///

Object members of the passed object remain untouched, unless /// cascaded deletes are /// configured for the class /// or for /// one of the member fields /// . ///

The method has no effect, if /// the passed object is not stored in the IObjectContainer. ///

A subsequent call to /// Store() with the same object newly stores the object /// to the IObjectContainer.

/// Delete() triggers Deleting and Deleted callbacks, /// which can be also used for cascaded deletes.

///
/// Db4objects.Db4o.Config.IObjectClass.CascadeOnDelete /// /// Db4objects.Db4o.Config.IObjectField.CascadeOnDelete /// /// Using callbacks /// /// the object to be deleted from the /// IObjectContainer.
/// void Delete(object obj); /// returns an IObjectContainer with extended functionality. /// /// returns an IObjectContainer with extended functionality. ///

Every IObjectContainer that db4o provides can be casted to /// an IExtObjectContainer. This method is supplied for your convenience /// to work without a cast. ///

The IObjectContainer functionality is split to two interfaces /// to allow newcomers to focus on the essential methods.

///
/// this, casted to IExtObjectContainer Db4objects.Db4o.Ext.IExtObjectContainer Ext(); /// Query-By-Example interface to retrieve objects. /// /// Query-By-Example interface to retrieve objects. ///

QueryByExample() creates an /// IObjectSet /// containing /// all objects in the IObjectContainer that match the passed /// template object.

/// Calling QueryByExample(null) returns all objects stored in the /// IObjectContainer.


/// Query Evaluation ///
All non-null members of the template object are compared against /// all stored objects of the same class. /// Primitive type members are ignored if they are 0 or false respectively. ///

Arrays and all supported Collection classes are /// evaluated for containment. Differences in Length/Count/Size() are /// ignored. ///

Consult the documentation of the IConfiguration package to /// configure class-specific behaviour.


/// Returned Objects
/// The objects returned in the /// IObjectSet /// are instantiated /// and activated to the preconfigured depth of 5. The /// activation depth /// may be configured /// globally /// or /// individually for classes /// . ///

/// db4o keeps track of all instantiatied objects. Queries will return /// references to these objects instead of instantiating them a second time. ///

/// Objects newly activated by QueryByExample() can respond to the Activating callback /// method. ///

///
/// object to be used as an example to find all matching objects.

/// /// /// /// IObjectSet /// containing all found objects.

///
/// Why activation? /// Using callbacks Db4objects.Db4o.IObjectSet QueryByExample(object template); /// /// creates a new SODA /// Query /// . ///

/// Linq queries are the recommended main db4o query interface. ///

/// Use /// QueryByExample(Object template) /// for simple Query-By-Example.

///
/// a new IQuery object Db4objects.Db4o.Query.IQuery Query(); /// queries for all instances of a class. /// queries for all instances of a class. /// the class to query for. /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// Db4objects.Db4o.IObjectSet Query(System.Type clazz); /// Native Query Interface. /// /// Native Query Interface. ///

Native Queries allow typesafe, compile-time checked and refactorable /// querying, following object-oriented principles. Native Queries expressions /// are written as if one or more lines of code would be run against all /// instances of a class. A Native Query expression should return true to mark /// specific instances as part of the result set. /// db4o will attempt to optimize native query expressions and execute them /// against indexes and without instantiating actual objects, where this is /// possible.

/// Example:

/// ///
/// IList <Cat> cats = db.Query <Cat> (delegate(Cat cat) {
///    return cat.Name == "Occam";
/// });
///
/// Summing up the above:
/// In order to run a Native Query, you can use the delegate notation /// with a delegate method taking the extend type as a parameter and /// returning bool. True is returned for the objects that are to be included in the result.
///

///
/// /// the /// Db4objects.Db4o.Query.Predicate /// containing the native query expression. /// /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// Db4objects.Db4o.IObjectSet Query(Db4objects.Db4o.Query.Predicate predicate); /// Native Query Interface. /// /// Native Query Interface. Queries as with /// Db4objects.Db4o.IObjectContainer.Query(Predicate) /// , /// but will sort the resulting /// Db4objects.Db4o.IObjectSet /// according to the given /// Db4objects.Db4o.Query.IQueryComparator /// . /// /// /// the /// Db4objects.Db4o.Query.Predicate /// containing the native query expression. /// /// /// the /// Db4objects.Db4o.Query.IQueryComparator /// specifiying the sort order of the result /// /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// Db4objects.Db4o.IObjectSet Query(Db4objects.Db4o.Query.Predicate predicate, Db4objects.Db4o.Query.IQueryComparator comparator); /// Native Query Interface. /// /// Native Query Interface. Queries as with /// Db4objects.Db4o.IObjectContainer.Query(Predicate) /// , /// but will sort the resulting /// Db4objects.Db4o.IObjectSet /// according to the given /// System.Collections.IComparer /// . /// /// /// the /// Db4objects.Db4o.Query.Predicate /// containing the native query expression. /// /// /// the /// System.Collections.IComparer /// specifiying the sort order of the result /// /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// Db4objects.Db4o.IObjectSet Query(Db4objects.Db4o.Query.Predicate predicate, System.Collections.IComparer comparer); /// rolls back the running transaction. /// /// rolls back the running transaction. ///

Transactions are back-to-back. A call to rollback will starts /// a new transaction immedidately. ///

rollback will not restore modified objects in memory. They /// can be refreshed from the database by calling /// Db4objects.Db4o.Ext.IExtObjectContainer.Refresh /// /// . ///
void Rollback(); /// newly stores objects or updates stored objects. /// /// newly stores objects or updates stored objects. ///

An object not yet stored in the IObjectContainer will be /// stored when it is passed to Store(). An object already stored /// in the IObjectContainer will be updated. ///

Updates
/// - will affect all simple type object members.
/// - links to object members that are already stored will be updated.
/// - new object members will be newly stored. The algorithm traverses down /// new members, as long as further new members are found.
/// - object members that are already stored will not be updated /// themselves.
Every object member needs to be updated individually with a /// call to Store() unless a deep /// global /// or /// class-specific /// update depth was configured or cascaded updates were /// defined in the class /// or in /// one of the member fields /// . /// Depending if the passed object is newly stored or updated, Creating/Created or /// Updaing/Updated callback method is triggered. /// Callbacks /// might also be used for cascaded updates.

///
/// the object to be stored or updated. /// IExtObjectContainer#Store(object, depth) /// /// Db4objects.Db4o.Config.IConfiguration.UpdateDepth /// /// Db4objects.Db4o.Config.IObjectClass.UpdateDepth /// /// Db4objects.Db4o.Config.IObjectClass.CascadeOnUpdate /// /// Db4objects.Db4o.Config.IObjectField.CascadeOnUpdate /// /// Using callbacks void Store(object obj); /// .NET 2.0 Native Query interface. /// /// Native Query Interface. ///

Native Queries allow typesafe, compile-time checked and refactorable /// querying, following object-oriented principles. Native Queries expressions /// are written as if one or more lines of code would be run against all /// instances of a class. A Native Query expression should return true to mark /// specific instances as part of the result set. /// db4o will attempt to optimize native query expressions and execute them /// against indexes and without instantiating actual objects, where this is /// possible.

/// Example:

/// ///
/// IList <Cat> cats = db.Query <Cat> (delegate(Cat cat) {
///    return cat.Name == "Occam";
/// });
///
/// Summing up the above:
/// In order to run a Native Query, you can use the delegate notation /// with a delegate method taking the extend type as a parameter and /// returning bool. True is returned for the objects that are to be included in the result.
///

///
/// /// use an anonymous delegate that takes a single paramter and returns /// a bool value, see the syntax example above /// /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// System.Collections.Generic.IList Query(System.Predicate match); /// Native Query Interface. /// /// Native Query Interface. Queries as with /// Db4objects.Db4o.IObjectContainer.Query(Predicate) /// , /// but will sort the resulting /// Db4objects.Db4o.IObjectSet /// according to the given /// System.Collections.Generic.IComparer /// . /// /// /// the /// Db4objects.Db4o.Query.Predicate /// containing the native query expression. /// /// /// the /// System.Collections.Generic.IComparer /// specifiying the sort order of the result /// /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// System.Collections.Generic.IList Query(System.Predicate match, System.Collections.Generic.IComparer comparer); /// Native Query Interface. /// /// Native Query Interface. Queries as with /// Db4objects.Db4o.IObjectContainer.Query(Predicate) /// , /// but will sort the resulting /// Db4objects.Db4o.IObjectSet /// according to the given /// System.Comparison /// . /// /// /// the /// Db4objects.Db4o.Query.Predicate /// containing the native query expression. /// /// /// the /// System.Comparison /// specifiying the sort order of the result /// /// /// the /// Db4objects.Db4o.IObjectSet /// returned by the query. /// System.Collections.Generic.IList Query(System.Predicate match, System.Comparison comparison); /// /// queries for all instances of the type extent, returning /// a IList of ElementType which must be assignable from /// extent. /// System.Collections.Generic.IList Query(System.Type extent); /// /// queries for all instances of the type extent. /// System.Collections.Generic.IList Query(); /// /// queries for all instances of the type extent sorting with the specified comparer. /// System.Collections.Generic.IList Query(System.Collections.Generic.IComparer comparer); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/0000755000175000017500000000000011700531646026573 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/ArrayDictionary4.cs0000644000175000017500000001066211700531646032317 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Collections { public partial class ArrayDictionary4 : IDictionary, IActivatable { public bool IsReadOnly { get { return false; } } void ICollection>.Add(KeyValuePair item) { Add(item.Key, item.Value); } public void Add(K key, V value) { Activate(ActivationPurpose.Read); int index = IndexOfKey(key); if (index != -1) { throw new ArgumentException(string.Format("Key {0} already exists", key)); } Activate(ActivationPurpose.Write); Insert(key, value); } public bool Remove(K key) { Activate(ActivationPurpose.Read); int index = IndexOfKey(key); if (index == -1) return false; Delete(index); return true; } bool ICollection>.Contains(KeyValuePair pair) { Activate(ActivationPurpose.Read); int index = IndexOfKey(pair.Key); if (index == -1) return false; KeyValuePair thisKeyValuePair = new KeyValuePair(pair.Key, ValueAt(index)); return EqualityComparer>.Default.Equals(thisKeyValuePair, pair); } void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException(); if (arrayIndex < 0) throw new ArgumentOutOfRangeException(); if (arrayIndex >= array.Length || Count > (array.Length - arrayIndex)) throw new ArgumentException(); for (int i = 0; i < Count; i++) { KeyValuePair keyValuePair = new KeyValuePair(KeyAt(i), ValueAt(i)); array[arrayIndex + i] = keyValuePair; } } bool ICollection>.Remove(KeyValuePair pair) { if (!((ICollection>)this).Contains(pair)) return false; return Remove(pair.Key); } public bool TryGetValue(K key, out V value) { Activate(ActivationPurpose.Read); int index = IndexOfKey(key); if (index == -1) { value = default(V); return false; } value = ValueAt(index); return true; } public V this[K key] { get { Activate(ActivationPurpose.Read); int index = IndexOfKey(key); if (index == -1) throw new KeyNotFoundException(); return ValueAt(index); } set { Activate(ActivationPurpose.Read); int index = IndexOfKey(key); if (index == -1) { Add(key, value); } else { Activate(ActivationPurpose.Write); Replace(index, value); } } } public ICollection Keys { get { Activate(ActivationPurpose.Read); K[] keys = new K[_size]; Array.Copy(_keys, keys, _size); return keys; } } public bool ContainsKey(K key) { return ContainsKeyImpl(key); } public IEnumerator> GetEnumerator() { Activate(ActivationPurpose.Read); for (int i = 0; i < _size; ++i) { yield return new KeyValuePair(KeyAt(i), ValueAt(i)); } } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable>)this).GetEnumerator(); } private int IndexOfKey(K key) { if (key == null) throw new ArgumentNullException(); return Array.IndexOf(_keys, key); } #region Sharpen Helpers private static K DefaultKeyValue() { return default(K); } private static V DefaultValue() { return default(V); } private static K[] AllocateKeyStorage(int length) { return new K[length]; } private static V[] AllocateValueStorage(int length) { return new V[length]; } #endregion } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/ActivatableDictionary.cs0000644000175000017500000001433111700531646033371 0ustar00meebeymeebey00000000000000/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; #if !CF && !SILVERLIGHT using System.Reflection; using System.Runtime.Serialization; #endif using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Collections { [Serializable] public class ActivatableDictionary : ActivatableBase, IDictionary, IDictionary #if !CF && !SILVERLIGHT ,ISerializable ,IDeserializationCallback #endif { public ActivatableDictionary() { } public ActivatableDictionary(IEqualityComparer comparer) { _dictionary = new Dictionary(comparer); } public ActivatableDictionary(IDictionary dictionary, IEqualityComparer comparer) { _dictionary = new Dictionary(dictionary, comparer); } public ActivatableDictionary(IDictionary dictionary) { _dictionary = new Dictionary(dictionary); } public ActivatableDictionary(int capacity) { _dictionary = new Dictionary(capacity); } public ActivatableDictionary(int capacity, IEqualityComparer comparer) { _dictionary = new Dictionary(capacity, comparer); } #if !CF && !SILVERLIGHT protected ActivatableDictionary(SerializationInfo info, StreamingContext context) { Type type = typeof(Dictionary); ConstructorInfo ctor = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(SerializationInfo), typeof(StreamingContext) }, null); _dictionary = (IDictionary)ctor.Invoke(new object[] { info, context }); } #endif #region Implementation of IEnumerable public IEnumerator> GetEnumerator() { ActivateForRead(); return _dictionary.GetEnumerator(); } public void Remove(object key) { Remove((TKey) key); } object IDictionary.this[object key] { get { return this[(TKey) key]; } set { this[(TKey) key] = (TValue) value; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #region Implementation of ICollection> public void Add(KeyValuePair item) { ActivateForWrite(); _dictionary.Add(item); } public bool Contains(object key) { return ContainsKey( (TKey) key); } public void Add(object key, object value) { Add( (TKey) key, (TValue) value); } public void Clear() { ActivateForWrite(); _dictionary.Clear(); } IDictionaryEnumerator IDictionary.GetEnumerator() { ActivateForRead(); return Cast().GetEnumerator(); } public bool Contains(KeyValuePair item) { ActivateForRead(); return _dictionary.Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { ActivateForRead(); _dictionary.CopyTo(array, arrayIndex); } public bool Remove(KeyValuePair item) { ActivateForWrite(); return _dictionary.Remove(item); } public void CopyTo(Array array, int index) { ActivateForRead(); Cast().CopyTo(array, index); } public int Count { get { ActivateForRead(); return _dictionary.Count; } } public object SyncRoot { get { return Cast().SyncRoot; } } public bool IsSynchronized { get { return Cast().IsSynchronized; } } ICollection IDictionary.Values { get { return Values; } } public bool IsReadOnly { get { return _dictionary.IsReadOnly; } } public bool IsFixedSize { get { return Cast().IsFixedSize; } } #endregion #region Implementation of IDictionary public bool ContainsKey(TKey key) { ActivateForRead(); return _dictionary.ContainsKey(key); } public void Add(TKey key, TValue value) { ActivateForWrite(); _dictionary.Add(key, value); } public bool Remove(TKey key) { ActivateForWrite(); return _dictionary.Remove(key); } public bool TryGetValue(TKey key, out TValue value) { ActivateForRead(); return _dictionary.TryGetValue(key, out value); } public TValue this[TKey key] { get { ActivateForRead(); return _dictionary[key]; } set { ActivateForWrite(); _dictionary[key] = value; } } public ICollection Keys { get { ActivateForRead(); return _dictionary.Keys; } } ICollection IDictionary.Keys { get { ActivateForRead(); return Cast().Keys; } } ICollection IDictionary.Values { get { ActivateForRead(); return _dictionary.Values; } } #endregion #region Dictionary methods public Dictionary.ValueCollection Values { get { ActivateForRead(); return ((Dictionary) _dictionary).Values; } } public bool ContainsValue(TValue value) { ActivateForRead(); return Cast>().ContainsValue(value); } public IEqualityComparer Comparer { get { return Cast>().Comparer; } } #endregion #if !CF && !SILVERLIGHT #region Implementation of ISerializable #if NET_4_0 [System.Security.SecurityCritical] #endif public void GetObjectData(SerializationInfo info, StreamingContext context) { ActivateForRead(); Cast().GetObjectData(info, context); } #endregion #region Implementation of IDeserializationCallback public void OnDeserialization(object sender) { Cast().OnDeserialization(sender); } #endregion #endif private T Cast() { return (T)_dictionary; } private readonly IDictionary _dictionary = new Dictionary(); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/IActivatableCollection.cs0000644000175000017500000000040211700531646033462 0ustar00meebeymeebey00000000000000/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ using System.Collections.Generic; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Collections { public interface IActivatableCollection : ICollection, IActivatable { } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/ISet.cs0000644000175000017500000000051411700531646027766 0ustar00meebeymeebey00000000000000/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ using System.Collections.Generic; namespace Db4objects.Db4o.Collections { public interface ISet : ICollection { bool IsEmpty { get; } bool AddAll(IEnumerable ts); bool RemoveAll(IEnumerable ts); bool ContainsAll(IEnumerable ts); } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/ActivatableList.cs0000644000175000017500000001613511700531646032203 0ustar00meebeymeebey00000000000000/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using Db4objects.Db4o.Activation; using Db4objects.Db4o.Internal.Activation; namespace Db4objects.Db4o.Collections { public class ActivatableList : ActivatableBase, IList, IActivatableCollection { public ActivatableList() { } public ActivatableList(IEnumerable source) { _list = new List(source); } public ActivatableList(int capacity) { _list = new List(capacity); } public ReadOnlyCollection AsReadOnly() { ActivateForRead(); return AsList().AsReadOnly(); } public IEnumerator GetEnumerator() { Activate(ActivationPurpose.Read); return _list.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Add(T item) { ActivateForWrite(); AsList().Add(item); } public void AddRange(IEnumerable collection) { ActivateForWrite(); AsList().AddRange(collection); } public int BinarySearch(T item) { ActivateForRead(); return AsList().BinarySearch(item); } public int BinarySearch(int index, int count, T item, IComparer comparer) { ActivateForRead(); return AsList().BinarySearch(index, count, item, comparer); } public int BinarySearch(T item, IComparer comparer) { ActivateForRead(); return AsList().BinarySearch(item, comparer); } public void Clear() { ActivateForWrite(); AsList().Clear(); } public bool Contains(T item) { ActivateForRead(); return AsList().Contains(item); } public void CopyTo(T[] array, int arrayIndex) { ActivateForRead(); AsList().CopyTo(array, arrayIndex); } public void CopyTo(T[] array) { ActivateForRead(); AsList().CopyTo(array); } public void CopyTo(int index, T[] array, int arrayIndex, int count) { ActivateForRead(); AsList().CopyTo(index, array, arrayIndex, count); } public override bool Equals(object obj) { ActivateForRead(); return AsList().Equals(obj); } #if !SILVERLIGHT public bool Exists(Predicate match) { ActivateForRead(); return AsList().Exists(match); } public T Find(Predicate match) { ActivateForRead(); return AsList().Find(match); } public List FindAll(Predicate match) { ActivateForRead(); return AsList().FindAll(match); } public int FindIndex(Predicate match) { ActivateForRead(); return AsList().FindIndex(match); } public int FindIndex(int startIndex, Predicate match) { ActivateForRead(); return AsList().FindIndex(startIndex, match); } public int FindIndex(int startIndex, int count, Predicate match) { ActivateForRead(); return AsList().FindIndex(startIndex, count, match); } public T FindLast(Predicate match) { ActivateForRead(); return AsList().FindLast(match); } public int FindLastIndex(Predicate match) { ActivateForRead(); return AsList().FindLastIndex(match); } public int FindLastIndex(int startIndex, Predicate match) { ActivateForRead(); return AsList().FindLastIndex(startIndex, match); } public int FindLastIndex(int startIndex, int count, Predicate match) { ActivateForRead(); return AsList().FindLastIndex(startIndex, count, match); } #endif public void ForEach(Action action) { ActivateForRead(); AsList().ForEach(action); } public List GetRange(int index, int count) { ActivateForRead(); return AsList().GetRange(index, count); } public int IndexOf(T item) { ActivateForRead(); return AsList().IndexOf(item); } public int IndexOf(T item, int index) { ActivateForRead(); return AsList().IndexOf(item, index); } public int IndexOf(T item, int index, int count) { ActivateForRead(); return AsList().IndexOf(item, index, count); } public void InsertRange(int index, IEnumerable collection) { ActivateForWrite(); AsList().InsertRange(index, collection); } public int LastIndexOf(T item) { ActivateForRead(); return AsList().LastIndexOf(item); } public int LastIndexOf(T item, int index) { ActivateForRead(); return AsList().LastIndexOf(item, index); } public int LastIndexOf(T item, int index, int count) { ActivateForRead(); return AsList().LastIndexOf(item, index, count); } #if !SILVERLIGHT public int RemoveAll(Predicate match) { ActivateForWrite(); return AsList().RemoveAll(match); } #endif public void RemoveRange(int index, int count) { ActivateForWrite(); AsList().RemoveRange(index, count); } public void Reverse() { ActivateForWrite(); AsList().Reverse(); } public void Reverse(int index, int count) { ActivateForWrite(); AsList().Reverse(index, count); } public void Sort() { ActivateForWrite(); AsList().Sort(); } public void Sort(IComparer comparer) { ActivateForWrite(); AsList().Sort(comparer); } public void Sort(int index, int count, IComparer comparer) { ActivateForWrite(); AsList().Sort(index, count, comparer); } public void Sort(Comparison comparison) { ActivateForWrite(); AsList().Sort(comparison); } public T[] ToArray() { ActivateForRead(); return AsList().ToArray(); } public void TrimExcess() { ActivateForWrite(); AsList().TrimExcess(); } #if !SILVERLIGHT public bool TrueForAll(Predicate match) { ActivateForRead(); return AsList().TrueForAll(match); } public List ConvertAll(Converter converter) { ActivateForRead(); return AsList().ConvertAll(converter); } #endif public bool Remove(T item) { ActivateForWrite(); return AsList().Remove(item); } public int Count { get { ActivateForRead(); return AsList().Count; } } public int Capacity { get { ActivateForRead(); return AsList().Capacity; } set { ActivateForWrite(); AsList().Capacity = value; } } public bool IsReadOnly { get { ActivateForRead(); return AsIList().IsReadOnly; } } public void Insert(int index, T item) { ActivateForWrite(); AsList().Insert(index, item); } public void RemoveAt(int index) { ActivateForWrite(); AsList().RemoveAt(index); } public T this[int index] { get { ActivateForRead(); return AsList()[index]; } set { ActivateForWrite(); AsList()[index] = value; } } private List AsList() { if (_list == null) { _list = new List(); } return _list; } private IList AsIList() { return AsList(); } private List _list; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Collections/ArrayList4.cs0000644000175000017500000001636011700531646031126 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Db4o.Collections { public partial class ArrayList4 : IList, IList, IActivatable { #region Instance Variables [NonSerialized] private int modCount; #endregion public int IndexOf(E item) { return Array.IndexOf(GetElements(), item, 0, listSize); } public void Insert(int index, E item) { Add(index, item); } public int Add(object value) { CheckObjectType(value); Add((E) value); return Count - 1; } public bool Contains(object value) { CheckObjectType(value); return IndexOf(value) != -1; } public int IndexOf(object value) { CheckObjectType(value); IList self = this; return self.IndexOf((E) value); } public void Insert(int index, object value) { CheckObjectType(value); Insert(index, (E) value); } public void Remove(object value) { CheckObjectType(value); Remove((E)value); } public void RemoveAt(int index) { RemoveImpl(index); } object IList.this[int index] { get { return Get(index); } set { Set(index, (E) value); } } public E this[int index] { get { return Get(index); } set { Set(index, value); } } public void Add(E item) { Add(Count, item); } public bool Contains(E item) { return Contains((object) item); } public void CopyTo(E[] array, int arrayIndex) { CopyTo((Array) array, arrayIndex); } public bool Remove(E item) { int index = IndexOf(item); if (index == -1) return false; RemoveAt(index); return true; } public void CopyTo(Array array, int index) { if (null == array) throw new ArgumentNullException(); if (array.Rank != 1) throw new ArgumentException(); Array.Copy(GetElements(), 0, array, index, listSize); } public object SyncRoot { get { throw new NotSupportedException(); } } public bool IsSynchronized { get { return false; } } public bool IsReadOnly { get { return false; } } public bool IsFixedSize { get { return false; } } public IEnumerator GetEnumerator() { Activate(ActivationPurpose.Read); int version = modCount; int size = listSize; for (int i = 0; i < size; ++i) { if (version != modCount) { throw new InvalidOperationException(); } yield return elements[i]; }; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable) this).GetEnumerator(); } public override string ToString() { return String.Format("ArrayList4<{0}> (Count={1})", typeof(E).Name, Count); } #region Facility methods public void AddRange(IEnumerable collection) { } public int BinarySearch(E item) { return Array.BinarySearch(GetElements(), item); } public int BinarySearch(E item, IComparer comparer) { return Array.BinarySearch(GetElements(), item, comparer); } public int BinarySearch(int index, int count, E item, IComparer comparer) { return Array.BinarySearch(GetElements(), index, count, item, comparer); } #if !CF public ArrayList4 ConvertAll(Converter converter) { return new ArrayList4(Array.ConvertAll(GetElements(), converter)); } public bool Exists(Predicate match) { return Array.Exists(GetElements(), match); } public E Find(Predicate match) { return Array.Find(GetElements(), match); } public ArrayList4 FindAll(Predicate match) { return new ArrayList4(Array.FindAll(GetElements(), match)); } public int FindIndex(int startIndex, int count, Predicate match) { return Array.FindIndex(GetElements(), startIndex, count, match); } public E FindLast(Predicate match) { return Array.FindLast(GetElements(), match); } public int FindLastIndex(int startIndex, int count, Predicate match) { return Array.FindLastIndex(GetElements(), startIndex, count, match); } public void ForEach(Action action) { Array.ForEach(GetElements(), action); } #endif public void InsertRange(int index, IEnumerable collection) { AddAllImpl(index, new List(collection).ToArray()); } public void RemoveRange(int index, int count) { RemoveRangeImpl(index, count); } public void Sort(int index, int count, IComparer comparer) { Array.Sort(GetElements(), index, count, comparer); } public E[] ToArray() { E[] items = GetElements(); return items == null ? items : (E[]) items.Clone(); } public bool TrueForAll(Predicate match) { return Array.TrueForAll(GetElements(), match); } #endregion #region Sharpen Helper Methods private static E[] CollectionToArray(ICollection coll) { return new List(coll).ToArray(); } internal static void CheckIndex(int index, int from, int to) { if (index < from || index > to) { throw new ArgumentOutOfRangeException(String.Format("Index {0} must be in the range[{1} - {2}]", index, from, to)); } } private static E[] AllocateStorage(int size) { return new E[size]; } private static E DefaultValue() { return default(E); } #endregion #region Helper Methods private static void CheckObjectType(object value) { if (!(value is E)) { throw new ArgumentException(); } } private E[] GetElements() { Activate(ActivationPurpose.Read); return elements; } #endregion } } #endif smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/0000755000175000017500000000000011700531646025522 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TCultureInfo.cs0000644000175000017500000000132011700531646030430 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Globalization; using Sharpen.Lang; using Db4objects.Db4o; namespace Db4objects.Db4o.Config { /// public class TCultureInfo : IObjectConstructor { public Object OnInstantiate(IObjectContainer store, object stored) { return new CultureInfo((string)stored); } public Object OnStore(IObjectContainer store, object obj) { CultureInfo culture = (CultureInfo)obj; return culture.Name; } public void OnActivate(IObjectContainer container, object applicationObject, object storedObject) { } public Type StoredClass() { return typeof(string); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TClass.cs0000644000175000017500000000023711700531646027244 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using Sharpen.Lang; using Db4objects.Db4o; namespace Db4objects.Db4o.Config { }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TTransient.cs0000644000175000017500000000131511700531646030144 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using Sharpen.Lang; using Db4objects.Db4o.Config; namespace Db4objects.Db4o.Config { /// public class TTransient : IObjectConstructor { public void OnActivate(IObjectContainer objectContainer, object obj, object members) { } public object OnStore(IObjectContainer objectContainer, object obj) { return null; } public System.Type StoredClass() { return typeof(object); } public object OnInstantiate(IObjectContainer objectContainer, object storedObject) { return null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TStack.cs0000644000175000017500000000217211700531646027244 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using System; using System.Collections; namespace Db4objects.Db4o.Config { /// public class TStack : IObjectTranslator { public void OnActivate(IObjectContainer objectContainer, object obj, object members){ Stack stack = (Stack)obj; if(members != null){ object[] elements = (object[]) members; for(int i = elements.Length - 1; i >= 0 ; i--){ stack.Push(elements[i]); } } } public Object OnStore(IObjectContainer objectContainer, object obj){ Stack stack = (Stack)obj; int count = stack.Count; object[] elements = new object[count]; IEnumerator e = stack.GetEnumerator(); e.Reset(); for(int i = 0; i < count; i++){ e.MoveNext(); elements[i] = e.Current; } return elements; } public System.Type StoredClass(){ return typeof(object[]); } } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TQueue.cs0000644000175000017500000000170011700531646027257 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if !SILVERLIGHT using System; using System.Collections; namespace Db4objects.Db4o.Config { /// public class TQueue : IObjectTranslator { public void OnActivate(IObjectContainer objectContainer, object obj, object members) { Queue queue = (Queue) obj; queue.Clear(); if (members != null) { object[] elements = (object[])members; for (int i = 0; i < elements.Length; i++) { queue.Enqueue(elements[i]); } } } public Object OnStore(IObjectContainer objectContainer, object obj) { Queue queue = (Queue)obj; int count = queue.Count; object[] elements = new object[count]; IEnumerator e = queue.GetEnumerator(); e.Reset(); for (int i = 0; i < count; i++) { e.MoveNext(); elements[i] = e.Current; } return elements; } public System.Type StoredClass() { return typeof(object[]); } } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/Attributes/0000755000175000017500000000000011700531646027650 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/Attributes/IDb4oAttribute.cs0000644000175000017500000000036011700531646032763 0ustar00meebeymeebey00000000000000/* Copyright (C) 2006 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o.Config.Attributes { interface IDb4oAttribute { void Apply (object subject, ConfigurationIntrospector introspector); } } ConfigurationIntrospector.cs0000644000175000017500000000267611700531646035356 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/Attributes/* Copyright (C) 2006 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Config.Attributes { class ConfigurationIntrospector { private readonly Type _type; private Config4Class _classConfig; private readonly IConfiguration _config; public ConfigurationIntrospector(Type type, Config4Class classConfig, IConfiguration config) { if (null == type) throw new ArgumentNullException("type"); if (null == config) throw new ArgumentNullException("config"); _type = type; _classConfig = classConfig; _config = config; } public Type Type { get { return _type; } } public Config4Class ClassConfiguration { get { if (null == _classConfig) { _classConfig = (Config4Class)_config.ObjectClass(_type); } return _classConfig; } } public IConfiguration IConfiguration { get { return _config; } } public void Apply() { Apply(_type); foreach (FieldInfo field in _type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) Apply(field); } private void Apply(ICustomAttributeProvider provider) { foreach (object o in provider.GetCustomAttributes(false)) { IDb4oAttribute attr = o as IDb4oAttribute; if (null == attr) continue; attr.Apply(provider, this); } } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/Attributes/IndexedAttribute.cs0000644000175000017500000000074211700531646033446 0ustar00meebeymeebey00000000000000/* Copyright (C) 2006 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; namespace Db4objects.Db4o.Config.Attributes { [AttributeUsage(AttributeTargets.Field)] public class IndexedAttribute : Attribute, IDb4oAttribute { void IDb4oAttribute.Apply(object subject, ConfigurationIntrospector introspector) { FieldInfo field = (FieldInfo)subject; introspector.ClassConfiguration.ObjectField(field.Name).Indexed(true); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TDictionary.cs0000644000175000017500000000255311700531646030307 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Sharpen.Lang; using Db4objects.Db4o; namespace Db4objects.Db4o.Config { /// public class TDictionary : IObjectTranslator { public void OnActivate(IObjectContainer objectContainer, object obj, object members){ IDictionary dict = (IDictionary)obj; dict.Clear(); if(members != null){ Entry[] entries = (Entry[]) members; for(int i = 0; i < entries.Length; i++){ if(entries[i].key != null && entries[i].value != null){ dict[entries[i].key] = entries[i].value; } } } } public Object OnStore(IObjectContainer objectContainer, object obj){ IDictionary dict = (IDictionary)obj; Entry[] entries = new Entry[dict.Count]; IDictionaryEnumerator e = dict.GetEnumerator(); e.Reset(); for(int i = 0; i < dict.Count; i++){ e.MoveNext(); entries[i] = new Entry(); entries[i].key = e.Key; entries[i].value = e.Value; } return entries; } public System.Type StoredClass(){ return typeof(Entry[]); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TType.cs0000644000175000017500000000201611700531646027115 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using Sharpen.Lang; using Db4objects.Db4o; namespace Db4objects.Db4o.Config { /// public class TType : IObjectConstructor { public void OnActivate(IObjectContainer objectContainer, object obj, object members) { } public Object OnInstantiate(IObjectContainer objectContainer, object obj) { if (obj != null) { try { return TypeReference.FromString((string) obj).Resolve(); } catch { } } return null; } public Object OnStore(IObjectContainer objectContainer, object obj) { if (obj == null) return null; return TypeReference.FromType((Type)obj).GetUnversionedName(); } public Type StoredClass() { return typeof(string); } } }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Config/TList.cs0000644000175000017500000000202511700531646027107 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Sharpen.Lang; using Db4objects.Db4o; namespace Db4objects.Db4o.Config { /// public class TList : IObjectTranslator { public void OnActivate(IObjectContainer objectContainer, object obj, object members){ IList list = (IList)obj; list.Clear(); if(members != null){ object[] elements = (object[]) members; for(int i = 0; i < elements.Length; i++){ list.Add(elements[i]); } } } public Object OnStore(IObjectContainer objectContainer, object obj){ IList list = (IList)obj; object[] elements = new object[list.Count]; for(int i = 0; i < list.Count; i++){ elements[i] = list[i]; } return elements; } public System.Type StoredClass(){ return typeof(object[]); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Defragment/0000755000175000017500000000000011700531646026371 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Defragment/AvailableTypeFilter.cs0000644000175000017500000000101111700531646032601 0ustar00meebeymeebey00000000000000/* Copyright (C) 2007 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o.Ext; using System; namespace Db4objects.Db4o.Defragment { public class AvailableTypeFilter : IStoredClassFilter { /// StoredClass instance to be checked /// true, if the given StoredClass instance should be accepted, false otherwise. /// public bool Accept(IStoredClass storedClass) { return System.Type.GetType(storedClass.GetName(),false)!=null; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/TransientAttribute.cs0000644000175000017500000000111411700531646030474 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; namespace Db4objects.Db4o { /// /// Marks a field or event as transient. /// /// /// Transient fields are not stored by db4o. ///
/// If you don't want a field to be stored by db4o, /// simply mark it with this attribute. ///
/// [AttributeUsage(AttributeTargets.Field | AttributeTargets.Event)] public class TransientAttribute : Attribute { public TransientAttribute() { } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Dynamic.cs0000644000175000017500000000240311700531646026227 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 Versant Inc. http://www.db4o.com */ using System; using System.Reflection; namespace Db4objects.Db4o { /// public class Dynamic { private const BindingFlags AllMembers = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; public static object GetProperty(object obj, string prop){ if(obj != null){ Type type = TypeForObject(obj); try { PropertyInfo pi = type.GetProperty(prop, AllMembers); return pi.GetValue(obj,null); } catch { } } return null; } public static void SetProperty(object obj, string prop, object val){ if(obj != null){ Type type = TypeForObject(obj); try { PropertyInfo pi = type.GetProperty(prop, AllMembers); pi.SetValue(obj, val, null); } catch { } } } private static Type TypeForObject(object obj){ Type type = obj as Type; if(type != null){ return type; } return obj.GetType(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/0000755000175000017500000000000011700531646026757 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/EnumTypeHandler.cs0000644000175000017500000001323511700531646032356 0ustar00meebeymeebey00000000000000/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Typehandlers { public class EnumTypeHandler : IValueTypeHandler, ITypeFamilyTypeHandler, IIndexableTypeHandler { private class PreparedEnumComparison : IPreparedComparison { private readonly long _enumValue; public PreparedEnumComparison(object obj) { if (obj is TransactionContext) { obj = ((TransactionContext)obj)._object; } if (obj == null) return; _enumValue = ToLong(obj); } public int CompareTo(object obj) { if (obj is TransactionContext) { obj = ((TransactionContext)obj)._object; } if (obj == null) return 1; long other = ToLong(obj); if (_enumValue == other) return 0; if (_enumValue < other) return -1; return 1; } private static long ToLong(object obj) { if (obj is IndexEntry) { return ((IndexEntry)obj).EnumValue; } return Convert.ToInt64(obj); } } public IPreparedComparison PrepareComparison(IContext context, object obj) { return new PreparedEnumComparison(obj); } public void Delete(IDeleteContext context) { int offset = context.Offset() + Const4.IdLength + Const4.LongLength; context.Seek(offset); } public void Defragment(IDefragmentContext context) { context.CopyID(); context.IncrementOffset(Const4.LongLength); } public object Read(IReadContext context) { int classId = context.ReadInt(); long enumValue = context.ReadLong(); return ToEnum(context, classId, enumValue); } public void Write(IWriteContext context, object obj) { int classId = ClassMetadataIdFor(context, obj); context.WriteInt(classId); context.WriteLong(Convert.ToInt64(obj)); } public bool DescendsIntoMembers() { return false; } public int LinkLength() { return Const4.IdLength + Const4.LongLength; } public object ReadIndexEntry(IContext context, ByteArrayBuffer reader) { return new IndexEntry(reader.ReadInt(), reader.ReadLong()); } public void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj) { IndexEntry indexEntry = obj as IndexEntry; if (indexEntry == null) { indexEntry = new IndexEntry(ClassMetadataIdFor(context, obj), Convert.ToInt64(obj)); } writer.WriteInt(indexEntry.ClassMetadataId); writer.WriteLong(indexEntry.EnumValue); } public void DefragIndexEntry(DefragmentContextImpl context) { context.IncrementOffset(Const4.LongLength); } private static int ClassMetadataIdFor(IContext context, object obj) { IReflectClass claxx = Container(context).Reflector().ForObject(obj); ClassMetadata clazz = Container(context).ProduceClassMetadata(claxx); //TODO: Handle clazz == null!! Must not happen! return clazz.GetID(); } private static ITypeHandler4 StringTypeHandler(IContext context) { return Container(context).Handlers.TypeHandlerForClass(Container(context).Ext().Reflector().ForClass(typeof(string))); } private static ObjectContainerBase Container(IContext context) { return ((IInternalObjectContainer)context.ObjectContainer()).Container; } public object IndexEntryToObject(IContext context, object indexEntry) { IndexEntry entry = (IndexEntry) indexEntry; return ToEnum(context, entry.ClassMetadataId, entry.EnumValue); } public object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer statefulBuffer) { return new IndexEntry(statefulBuffer.ReadInt(), statefulBuffer.ReadLong()); } public object ReadIndexEntry(IObjectIdContext context) { return new IndexEntry(context.ReadInt(), context.ReadLong()); } private static object ToEnum(IContext context, int classId, long enumValue) { ClassMetadata clazz = Container(context).ClassMetadataForID(classId); Type enumType = NetReflector.ToNative(clazz.ClassReflector()); return Enum.ToObject(enumType, enumValue); } private class IndexEntry { private readonly long _enumValue; private readonly int _classMetadataId; internal IndexEntry(int classMetadataId, long enumValue) { _classMetadataId = classMetadataId; _enumValue = enumValue; } internal long EnumValue { get { return _enumValue; } } internal int ClassMetadataId { get { return _classMetadataId; } } } } public class EnumTypeHandlerPredicate : ITypeHandlerPredicate { public bool Match(IReflectClass classReflector) { Type type = NetReflector.ToNative(classReflector); if(type == null) { return false; } return type.IsEnum; } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/GuidTypeHandler.cs0000644000175000017500000000636711700531646032352 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ /* Copyright (C) 2009 Judah Himango */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.native.Db4objects.Db4o.Typehandlers; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Db4o.Typehandlers { /// /// DB4O type handler for efficiently storing and activating System.Guid values. /// /// Judah Himango public class GuidTypeHandler: IValueTypeHandler, IQueryableTypeHandler, IIndexableTypeHandler { private const int GuidSize = 16; #region IValueTypeHandler Members public object Read(IReadContext context) { return ReadFrom(context); } #endregion #region ITypeHandler4 Members public bool CanHold(IReflectClass type) { return NetReflector.ToNative(type).Equals(typeof (Guid)); } public void Defragment(IDefragmentContext context) { IncrementOffset(context); } public void Delete(IDeleteContext context) { context.Seek(context.Offset() + GuidSize); } public void Write(IWriteContext context, object obj) { WriteGuid(obj, context); } #endregion #region IComparable4 Members public IPreparedComparison PrepareComparison(IContext context, object obj) { return new ComparablePreparedComparison(obj); } #endregion #region IQueryableTypeHandler Members public bool DescendsIntoMembers() { return false; } #endregion #region IIndexableTypeHandler Members public int LinkLength() { return GuidSize; } public object ReadIndexEntry(IContext context, ByteArrayBuffer reader) { return ReadFrom(reader); } public void WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj) { WriteGuid(obj, writer); } public void DefragIndexEntry(DefragmentContextImpl context) { IncrementOffset(context); } public object IndexEntryToObject(IContext context, object indexEntry) { if (indexEntry.GetType() != typeof(Guid)) { throw new InvalidOperationException(); } return indexEntry; } public object ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer buffer) { return ReadFrom(buffer); } public object ReadIndexEntry(IObjectIdContext context) { return ReadFrom(context); } #endregion private static Guid ReadFrom(IReadBuffer buffer) { byte[] guidBytes = new byte[GuidSize]; buffer.ReadBytes(guidBytes); return new Guid(guidBytes); } private static void WriteGuid(object obj, IWriteBuffer context) { Guid id = (Guid)obj; context.WriteBytes(id.ToByteArray()); } private static void IncrementOffset(IDefragmentContext context) { context.IncrementOffset(GuidSize); } } }GenericCollectionTypeHandler.cs0000644000175000017500000001501511700531646034761 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Foundation.Collections; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; namespace Db4objects.Db4o.Typehandlers { public class GenericCollectionTypeHandler : IReferenceTypeHandler, ICascadingTypeHandler, IVariableLengthTypeHandler, IQueryableTypeHandler { public virtual IPreparedComparison PrepareComparison(IContext context, object obj) { return null; } public virtual void Write(IWriteContext context, object obj) { ICollectionInitializer initializer = CollectionInitializer.For(obj); IEnumerable enumerable = (IEnumerable)obj; ClassMetadata elementType = DetectElementTypeErasingNullables(Container(context), enumerable); WriteElementTypeHandlerId(context, elementType); WriteElementCount(context, initializer); WriteElements(context, enumerable, elementType.TypeHandler()); } public virtual void Activate(IReferenceActivationContext context) { object collection = context.PersistentObject(); ICollectionInitializer initializer = CollectionInitializer.For(collection); initializer.Clear(); ReadElements(context, initializer, ReadElementTypeHandler(context, context)); initializer.FinishAdding(); } public virtual void Delete(IDeleteContext context) { if (!context.CascadeDelete()) return; ITypeHandler4 handler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = elementCount; i > 0; i--) { handler.Delete(context); } } public virtual void Defragment(IDefragmentContext context) { DefragmentElementHandlerId(context); ITypeHandler4 handler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { context.Defragment(handler); } } public void CascadeActivation(IActivationContext context) { IEnumerable collection = ((IEnumerable)context.TargetObject()); // TODO: detect the element type // and return immediately when it's a primitive foreach (object item in collection) { context.CascadeActivationToChild(item); } } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return this; } public virtual void CollectIDs(QueryingReadContext context) { ITypeHandler4 elementHandler = ReadElementTypeHandler(context, context); int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { context.ReadId(elementHandler); } } private static void DefragmentElementHandlerId(IDefragmentContext context) { int offset = context.Offset(); context.CopyID(); context.Seek(offset); } private static ITypeHandler4 OpenTypeHandlerFrom(IContext context) { return context.Transaction().Container().Handlers.OpenTypeHandler(); } private static void ReadElements(IReadContext context, ICollectionInitializer initializer, ITypeHandler4 elementHandler) { int elementCount = context.ReadInt(); for (int i = 0; i < elementCount; i++) { initializer.Add(context.ReadObject(elementHandler)); } } private static void WriteElementTypeHandlerId(IWriteContext context, ClassMetadata type) { context.WriteInt(type.GetID()); } private static void WriteElementCount(IWriteBuffer context, ICollectionInitializer initializer) { context.WriteInt(initializer.Count()); } private static void WriteElements(IWriteContext context, IEnumerable enumerable, ITypeHandler4 elementHandler) { IEnumerator elements = enumerable.GetEnumerator(); while (elements.MoveNext()) { context.WriteObject(elementHandler, elements.Current); } } private static ObjectContainerBase Container(IContext context) { return ((IInternalObjectContainer)context.ObjectContainer()).Container; } private static ITypeHandler4 ReadElementTypeHandler(IReadBuffer buffer, IContext context) { int elementTypeId = buffer.ReadInt(); if (elementTypeId == 0) return OpenTypeHandlerFrom(context); ITypeHandler4 elementHandler = Container(context).TypeHandlerForClassMetadataID(elementTypeId); return elementHandler ?? OpenTypeHandlerFrom(context); } private static ClassMetadata DetectElementTypeErasingNullables(ObjectContainerBase container, IEnumerable collection) { Type elementType = ElementTypeOf(collection); if (IsNullableInstance(elementType)) { return container.ClassMetadataForReflectClass(container.Handlers.IclassObject); } return container.ProduceClassMetadata(container.Reflector().ForClass(elementType)); } private static bool IsNullableInstance(Type elementType) { return elementType.IsGenericType && (elementType.GetGenericTypeDefinition() == typeof(Nullable<>)); } private static Type ElementTypeOf(IEnumerable collection) { Type genericCollectionType = GenericCollectionTypeFor(collection.GetType()); return genericCollectionType.GetGenericArguments()[0]; } private static Type GenericCollectionTypeFor(Type type) { if (type == null) { throw new InvalidOperationException(); } if (IsGenericCollectionType(type)) { return type; } return GenericCollectionTypeFor(type.BaseType); } private static bool IsGenericCollectionType(Type type) { return type.IsGenericType && Array.IndexOf(_supportedCollections, type.GetGenericTypeDefinition()) >= 0; } public bool DescendsIntoMembers() { return true; } public void RegisterSupportedTypesWith(Action registrationAction) { foreach (Type collectionType in _supportedCollections) { registrationAction(collectionType); } } private static readonly Type[] _supportedCollections = new Type[] { typeof(List<>), typeof(LinkedList<>), typeof(Stack<>), typeof(Queue<>), typeof(System.Collections.ObjectModel.Collection<>), typeof(ActivatableList<>), #if NET_3_5 && ! CF typeof(HashSet<>), #endif }; } } DateTimeOffsetTypeHandler.cs0000644000175000017500000000577711700531646034252 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if !CF using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.native.Db4objects.Db4o.Typehandlers; namespace Db4objects.Db4o.Typehandlers { public class DateTimeOffsetTypeHandler : IValueTypeHandler, IQueryableTypeHandler, IIndexableTypeHandler { #region Implementation of ITypeHandler4 void ITypeHandler4.Delete(IDeleteContext context) { context.Seek(context.Offset() + LinkLength()); } void ITypeHandler4.Defragment(IDefragmentContext context) { IncrementOffset(context); } void ITypeHandler4.Write(IWriteContext context, object obj) { Write(context, (DateTimeOffset)obj); } bool IQueryableTypeHandler.DescendsIntoMembers() { return false; } object IValueTypeHandler.Read(IReadContext context) { return ReadFrom(context); } #endregion #region Implementation of IComparable4 IPreparedComparison IComparable4.PrepareComparison(IContext context, object obj) { return new ComparablePreparedComparison(obj); } #endregion #region Implementation of ILinkLengthAware int ILinkLengthAware.LinkLength() { return LinkLength(); } #endregion #region Implementation of IIndexable4 object IIndexable4.ReadIndexEntry(IContext context, ByteArrayBuffer reader) { return ReadFrom(reader); } void IIndexable4.WriteIndexEntry(IContext context, ByteArrayBuffer writer, object obj) { Write(writer, (DateTimeOffset) obj); } void IIndexable4.DefragIndexEntry(DefragmentContextImpl context) { IncrementOffset(context); } #endregion #region Implementation of IIndexableTypeHandler object IIndexableTypeHandler.IndexEntryToObject(IContext context, object indexEntry) { if (indexEntry.GetType() != typeof(DateTimeOffset)) { throw new InvalidOperationException(); } return indexEntry; } object IIndexableTypeHandler.ReadIndexEntryFromObjectSlot(MarshallerFamily mf, StatefulBuffer buffer) { return ReadFrom(buffer); } object IIndexableTypeHandler.ReadIndexEntry(IObjectIdContext context) { return ReadFrom(context); } #endregion private static void Write(IWriteBuffer context, DateTimeOffset dateTimeOffset) { context.WriteLong(dateTimeOffset.Ticks); context.WriteLong(dateTimeOffset.Offset.Ticks); } private static DateTimeOffset ReadFrom(IReadBuffer buffer) { long ticks = buffer.ReadLong(); long timeSpanTicks = buffer.ReadLong(); return new DateTimeOffset(ticks, new TimeSpan(timeSpanTicks)); } private static void IncrementOffset(IDefragmentContext context) { context.IncrementOffset(LinkLength()); } private static int LinkLength() { return Const4.LongLength + Const4.LongLength; } } } #endifComparablePreparedComparison.cs0000644000175000017500000000121711700531646035013 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.native.Db4objects.Db4o.Typehandlers { sealed internal class ComparablePreparedComparison : IPreparedComparison where T : IComparable { public ComparablePreparedComparison(object source) { if (source is TransactionContext) { source = ((TransactionContext)source)._object; } _source = (IComparable)source; } public int CompareTo(object obj) { return _source.CompareTo(obj); } private readonly IComparable _source; } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/CollectionTypeHandler.cs0000644000175000017500000000062111700531646033540 0ustar00meebeymeebey00000000000000/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ using System.Collections; namespace Db4objects.Db4o.Typehandlers { public partial class CollectionTypeHandler { private void AddToCollection(ICollection collection, object element) { ((IList)collection).Add(element); } private void ClearCollection(ICollection collection) { ((IList)collection).Clear(); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Db4objects.Db4o/Typehandlers/SystemArrayTypeHandler.cs0000644000175000017500000001122511700531646033732 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Activation; using Db4objects.Db4o.Internal.Delete; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Marshall; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; using Db4objects.Db4o.Internal.Handlers.Array; namespace Db4objects.Db4o.Typehandlers { public class SystemArrayTypeHandler : ICascadingTypeHandler, IVariableLengthTypeHandler, IValueTypeHandler { public virtual IPreparedComparison PrepareComparison(IContext context, object obj) { return ReadArrayHandler(context).PrepareComparison(context, obj); } public virtual void Write(IWriteContext context, object obj) { Array collection = (Array) obj; ClassMetadata elementType = DetectElementTypeHandler(Container(context), collection); WriteElementTypeId(context, elementType); new ArrayHandler(elementType.TypeHandler(), false).Write(context, obj); } public virtual object Read(IReadContext context) { return ReadArrayHandler(context).Read(context); } private static ArrayHandler ReadArrayHandler(IContext context) { ITypeHandler4 handler = ReadElementTypeHandler((IReadBuffer)context, context); return new ArrayHandler(handler, false); } public virtual void Delete(IDeleteContext context) { ReadArrayHandler(context).Delete(context); } public virtual void Defragment(IDefragmentContext context) { DefragmentElementHandlerId(context); ReadArrayHandler(context).Defragment(context); } public void CascadeActivation(IActivationContext context) { ICollection collection = ((ICollection)context.TargetObject()); foreach (object item in collection) { context.CascadeActivationToChild(item); } } public virtual ITypeHandler4 ReadCandidateHandler(QueryingReadContext context) { return this; } public virtual void CollectIDs(QueryingReadContext context) { ReadArrayHandler(context).CollectIDs(context); } private static void DefragmentElementHandlerId(IDefragmentContext context) { int offset = context.Offset(); context.CopyID(); context.Seek(offset); } private static ITypeHandler4 OpenTypeHandlerFrom(IContext context) { return context.Transaction().Container().Handlers.OpenTypeHandler(); } private static void WriteElementTypeId(IWriteContext context, ClassMetadata elementType) { context.WriteInt(elementType.GetID()); } private static ObjectContainerBase Container(IContext context) { return ((IInternalObjectContainer)context.ObjectContainer()).Container; } private static ITypeHandler4 ReadElementTypeHandler(IReadBuffer buffer, IContext context) { int elementHandlerId = buffer.ReadInt(); if (elementHandlerId == 0) return OpenTypeHandlerFrom(context); ITypeHandler4 elementHandler = Container(context).TypeHandlerForClassMetadataID(elementHandlerId); return elementHandler ?? OpenTypeHandlerFrom(context); } private static ClassMetadata DetectElementTypeHandler(ObjectContainerBase container, Array collection) { Type elementType = ElementTypeOf(collection); return container.ProduceClassMetadata(container.Reflector().ForClass(elementType)); } private static bool IsNullableInstance(Type elementType) { return elementType.IsGenericType && (elementType.GetGenericTypeDefinition() == typeof(Nullable<>)); } private static Type ElementTypeOf(Array array) { return array.GetType().GetElementType(); } } internal class SystemArrayPredicate : ITypeHandlerPredicate { public bool Match(IReflectClass classReflector) { if(classReflector == null) { return false; } Type type = NetReflector.ToNative(classReflector); return type == typeof(System.Array); } } } smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/0000755000175000017500000000000011700531646024037 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/System/0000755000175000017500000000000011700531646025323 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/System/NonSerialized.cs0000644000175000017500000000030711700531646030420 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using Db4objects.Db4o; #if SILVERLIGHT namespace System { public class NonSerialized : TransientAttribute { } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/System/Collections/0000755000175000017500000000000011700531646027601 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/System/Collections/Hashtable.cs0000644000175000017500000000062011700531646032021 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System.Collections.Generic; namespace System.Collections { public class Hashtable : Dictionary { public Hashtable() { } public Hashtable(int capacity) : base(capacity) { } public bool Contains(object key) { return ContainsKey(key); } } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/System/Collections/ArrayList.cs0000644000175000017500000000046511700531646032047 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System.Collections.Generic; namespace System.Collections { public class ArrayList : List { public ArrayList(int capacity) : base(capacity) { } public ArrayList() { } } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/System/Serializable.cs0000644000175000017500000000024311700531646030257 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT namespace System { public class Serializable : Attribute { } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/0000755000175000017500000000000011700531646026611 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Internal/0000755000175000017500000000000011700531646030365 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Internal/BlobImpl.cs0000644000175000017500000000156411700531646032422 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT namespace Db4objects.Db4o.Internal { public class BlobImpl : IDb4oTypeImpl { public void SetTrans(Transaction a_trans) { throw new System.NotImplementedException(); } public bool CanBind() { throw new System.NotImplementedException(); } public object CreateDefault(Transaction trans) { throw new System.NotImplementedException(); } public bool HasClassIndex() { throw new System.NotImplementedException(); } public void SetObjectReference(ObjectReference @ref) { throw new System.NotImplementedException(); } public object StoredTo(Transaction trans) { throw new System.NotImplementedException(); } public void PreDeactivate() { throw new System.NotImplementedException(); } } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Foundation/0000755000175000017500000000000011700531646030717 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Foundation/IO/0000755000175000017500000000000011700531646031226 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Foundation/IO/File4.cs0000644000175000017500000000211211700531646032514 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System; using System.IO; using System.IO.IsolatedStorage; namespace Db4objects.Db4o.Foundation.IO { public class File4 { public static void Delete(string file) { IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication(); if (storageFile.FileExists(file)) { storageFile.DeleteFile(file); } } public static void Copy(string from, string to) { throw new NotImplementedException(); } public static bool Exists(string file) { IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication(); return storageFile.FileExists(file); } public static long Size(string filePath) { using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream fileStream = storageFile.OpenFile(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { return fileStream.Length; } } } } } #endif smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/IO/0000755000175000017500000000000011700531646027120 5ustar00meebeymeebey00000000000000IsolatedStorageStorage.cs0000644000175000017500000000525011700531646034010 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/IO/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System.Collections.Generic; using System.IO.IsolatedStorage; using System.IO; namespace Db4objects.Db4o.IO { public class IsolatedStorageStorage : IStorage { private static readonly IsolatedStorageFile _store = IsolatedStorageFile.GetUserStoreForApplication(); private static readonly IDictionary _openBins = new Dictionary(); #region IStorage Members public IBin Open(BinConfiguration config) { IsolatedStorageFileBin bin = new IsolatedStorageFileBin(config, _store); AddToOpenBinsCollection(bin); RegisterForOnCloseEvent(bin); return bin; } public bool Exists(string uri) { return _store.FileExists(uri) && FileSize(uri) > 0; } public void Delete(string uri) { if (_store.FileExists(uri)) { _store.DeleteFile(uri); } } public void Rename(string oldUri, string newUri) { if (_store.FileExists(oldUri)) { Copy(oldUri, newUri); Delete(oldUri); } } private static void Copy(string from, string to) { using (IsolatedStorageFileStream fromStream = _store.OpenFile(from, FileMode.Open, FileAccess.Read, FileShare.None)) { using(IsolatedStorageFileStream toStream = _store.OpenFile(to, FileMode.CreateNew, FileAccess.Write, FileShare.None)) { byte []buffer = new byte[1024 * 1024]; int count = fromStream.Read(buffer, 0, buffer.Length); while (count > 0) { toStream.Write(buffer, 0, count); count = fromStream.Read(buffer, 0, buffer.Length); } } } } #endregion public static long FileSize(string uri) { lock (_openBins) { if (IsBinAlreadyOpen(uri)) { IsolatedStorageFileBin bin = _openBins[uri]; return bin.Length(); } using (IsolatedStorageFileStream fileStream = _store.OpenFile(uri, FileMode.Open, FileAccess.Read, FileShare.None)) { return fileStream.Length; } } } private static bool IsBinAlreadyOpen(string uri) { return _openBins.ContainsKey(uri); } private static void RegisterForOnCloseEvent(IsolatedStorageFileBin bin) { bin.OnClose += (sender, arg) => RemoveFromOpenBinCollection(((IsolatedStorageFileBin)sender).Path); } private static void RemoveFromOpenBinCollection(string path) { lock (_openBins) { if (_openBins.ContainsKey(path)) { _openBins.Remove(path); } } } private static void AddToOpenBinsCollection(IsolatedStorageFileBin bin) { _openBins[bin.Path] = bin; } } } #endif smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/IO/SilverlightIO.cs0000644000175000017500000000204411700531646032173 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System; using System.IO; using System.IO.IsolatedStorage; namespace Db4objects.Db4o.IO { public static class SilverlightIO { public static bool Exists(string path) { return ExistsIn(IsolatedStorageFile.GetUserStoreForApplication(), path); } private static bool ExistsIn(IsolatedStorageFile storage, string path) { return storage.FileExists(path); } public static bool Delete(string path) { IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); if (ExistsIn(storage, path)) { storage.DeleteFile(path); return !ExistsIn(storage, path); } return false; } public static long Length(string path) { IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream fileStream = storage.OpenFile(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { return fileStream.Length; } } } } #endifIsolatedStorageFileBin.cs0000644000175000017500000001073311700531646033716 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/IO/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using System; using System.IO; using System.IO.IsolatedStorage; using Db4objects.Db4o.Ext; using Sharpen.Lang; using Sharpen.Util; namespace Db4objects.Db4o.IO { class IsolatedStorageFileBin : IBin { private readonly IsolatedStorageFileStream _fileStream; private string _fullPath; internal IsolatedStorageFileBin(BinConfiguration config, IsolatedStorageFile store) { Action cleanUp = Close; try { _fileStream = OpenFile(config, store); cleanUp = () => {}; } catch (IsolatedStorageException e) { ThrowMappedException(e, config.Uri(), store); } finally { cleanUp(); } } internal string Path { get { return _fullPath; } } private static void ThrowMappedException(Exception e, string path, IsolatedStorageFile store) { if (store.FileExists(path)) { throw new DatabaseFileLockedException(path, e); } throw new Db4oIOException(e); } private IsolatedStorageFileStream OpenFile(BinConfiguration config, IsolatedStorageFile store) { _fullPath = config.Uri(); string path = config.Uri(); IsolatedStorageFileStream stream = new IsolatedStorageFileStream(path, FileModeFor(store, path), FileAccessFor(config), FileShareFor(config), store); Fill(stream, config.InitialLength(), 0); return stream; } private static FileMode FileModeFor(IsolatedStorageFile store, string path) { return store.FileExists(path) ? FileMode.Open : FileMode.CreateNew; } private static void Fill(Stream stream, long length, byte value) { if (length > 0) { byte[] bytes = new byte[length]; Arrays.Fill(bytes, value); stream.Write(bytes, 0, bytes.Length); } } private static FileShare FileShareFor(BinConfiguration config) { return config.LockFile() ? FileShare.None : FileShare.ReadWrite; } private static FileAccess FileAccessFor(BinConfiguration config) { return config.ReadOnly() ? FileAccess.Read : FileAccess.ReadWrite; } #region IBin Members public long Length() { return _fileStream.Length; } public int Read(long position, byte[] bytes, int bytesToRead) { try { Seek(position); return _fileStream.Read(bytes, 0, bytesToRead); } catch (IOException e) { throw new Db4oIOException(e); } } public void Write(long position, byte[] bytes, int bytesToWrite) { try { Seek(position); _fileStream.Write(bytes, 0, bytesToWrite); } catch (NotSupportedException e) { throw new Db4oIOException(e); } } public void Sync() { _fileStream.Flush(); } public void Sync(IRunnable runnable) { Sync(); runnable.Run(); Sync(); } public int SyncRead(long position, byte[] bytes, int bytesToRead) { return Read(position, bytes, bytesToRead); } public void Close() { if (_fileStream != null) { _fileStream.Close(); RaiseOnCloseEvent(); } } #endregion private void Seek(long position) { if (DTrace.enabled) { DTrace.RegularSeek.Log(position); } _fileStream.Seek(position, SeekOrigin.Begin); } private void RaiseOnCloseEvent() { Action onClose = OnClose; if (onClose != null) { onClose(this, EventArgs.Empty); } } internal event Action OnClose; } } #endif smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Config/0000755000175000017500000000000011700531646030016 5ustar00meebeymeebey00000000000000SilverlightSupport.cs0000644000175000017500000000135211700531646034160 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/Silverlight/Db4objects.Db4o/Config/* Copyright (C) 2010 Versant Inc. http://www.db4o.com */ #if SILVERLIGHT using Db4objects.Db4o.IO; namespace Db4objects.Db4o.Config { /// /// Configures the database to be used in a Silverlight application. /// /// /// This configuration item basically configures db4o to use Silverlight isolatad storage. /// If your Silverlight application may run "out of browser" you may want to not add this. /// public class SilverlightSupport : IEmbeddedConfigurationItem { public void Prepare(IEmbeddedConfiguration configuration) { configuration.File.Storage = new IsolatedStorageStorage(); } public void Apply(IEmbeddedObjectContainer db) { } } } #endifsmuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/compact/0000755000175000017500000000000011700531646023171 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/db4o-net/Db4objects.Db4o/native/compact/Lock4.cs0000644000175000017500000000475611700531646024510 0ustar00meebeymeebey00000000000000/* Copyright (C) 2009 Versant Inc. http://www.db4o.com */ using System; using System.Threading; namespace Db4objects.Db4o.Foundation { #if CF public class Lock4 { private volatile Thread lockedByThread; private volatile Thread waitReleased; private volatile Thread closureReleased; readonly AutoResetEvent waitEvent = new AutoResetEvent(false); readonly AutoResetEvent closureEvent = new AutoResetEvent(false); public void Awake() { AwakeWait(); } public Object Run(IClosure4 closure4) { EnterClosure(); try { return closure4.Run(); } finally { AwakeClosure(); } } public void Snooze(long timeout) { AwakeClosure(); WaitWait(timeout); EnterClosure(); } private void EnterClosure() { while (lockedByThread != Thread.CurrentThread) { while (!SetLock()) { WaitClosure(); } } } private void AwakeClosure() { lock (this) { RemoveLock(); closureReleased = Thread.CurrentThread; closureEvent.Set(); Thread.Sleep(0); if (closureReleased == Thread.CurrentThread) { closureEvent.Reset(); } } } private void AwakeWait() { lock (this) { waitReleased = Thread.CurrentThread; waitEvent.Set(); Thread.Sleep(0); if (waitReleased == Thread.CurrentThread) { waitEvent.Reset(); } } } private void WaitWait(long timeout) { waitEvent.WaitOne((int) timeout, false); waitReleased = Thread.CurrentThread; } private void WaitClosure() { closureEvent.WaitOne(); closureReleased = Thread.CurrentThread; } private bool SetLock() { lock (this) { if (lockedByThread == null) { lockedByThread = Thread.CurrentThread; return true; } return false; } } private void RemoveLock() { lock (this) { if (lockedByThread == Thread.CurrentThread) { lockedByThread = null; } } } } #endif }smuxi-1.1/lib/db4o-net/Db4objects.Db4o/.monolipse0000644000175000017500000000027211700531646022264 0ustar00meebeymeebey00000000000000 cs library /db4o.net/bin smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o-2008.csproj0000755000175000017500000021440212546452727024661 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Library Properties Db4objects.Db4o Db4objects.Db4o v3.5 512 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;NET_3_5 prompt 4 bin\Debug\Db4objects.Db4o.xml 1591;1572;1573;1574;0419; full true bin\Release\ TRACE;NET_3_5 prompt 4 1591;1572;1573;1574;0419; bin\Release\Db4objects.Db4o.xml true 3.5 smuxi-1.1/lib/db4o-net/Db4objects.Db4o/Db4objects.Db4o-Silverlight-2008.csproj0000644000175000017500000022112511700531646027135 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o Db4objects.Db4o v3.5 false true true true ../db4objects.snk true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 smuxi-1.1/lib/StarkSoftProxy/0000755000175000017500000000000014011526500017040 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/StarkSoftProxy/EventArgs/0000755000175000017500000000000012204443216020742 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/StarkSoftProxy/EventArgs/CreateConnectionAsyncCompletedEventArgs.cs0000644000175000017500000000446712204443216031201 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Net.Sockets; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Event arguments class for the EncryptAsyncCompleted event. /// public class CreateConnectionAsyncCompletedEventArgs : AsyncCompletedEventArgs { private TcpClient _proxyConnection; /// /// Constructor. /// /// Exception information generated by the event. /// Cancelled event flag. This flag is set to true if the event was cancelled. /// Proxy Connection. The initialized and open TcpClient proxy connection. public CreateConnectionAsyncCompletedEventArgs(Exception error, bool cancelled, TcpClient proxyConnection) : base(error, cancelled, null) { _proxyConnection = proxyConnection; } /// /// The proxy connection. /// public TcpClient ProxyConnection { get { return _proxyConnection; } } } } smuxi-1.1/lib/StarkSoftProxy/Exceptions/0000755000175000017500000000000012204443216021165 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/StarkSoftProxy/Exceptions/ProxyException.cs0000644000175000017500000000475012204443216024522 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Runtime.Serialization; namespace Starksoft.Net.Proxy { /// /// This exception is thrown when a general, unexpected proxy error. /// [Serializable()] public class ProxyException : Exception { /// /// Constructor. /// public ProxyException() { } /// /// Constructor. /// /// Exception message text. public ProxyException(string message) : base(message) { } /// /// Constructor. /// /// Exception message text. /// The inner exception object. public ProxyException(string message, Exception innerException) : base(message, innerException) { } /// /// Constructor. /// /// Serialization information. /// Stream context information. protected ProxyException(SerializationInfo info, StreamingContext context) : base(info, context) { } } }smuxi-1.1/lib/StarkSoftProxy/Socks4aProxyClient.cs0000644000175000017500000002571212204443216023112 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace Starksoft.Net.Proxy { /// /// Socks4a connection proxy class. This class implements the Socks4a standard proxy protocol /// which is an extension of the Socks4 protocol /// /// /// In Socks version 4A if the client cannot resolve the destination host's domain name /// to find its IP address the server will attempt to resolve it. /// public class Socks4aProxyClient : Socks4ProxyClient { private const string PROXY_NAME = "SOCKS4a"; /// /// Default constructor. /// public Socks4aProxyClient() : base() { } /// /// Creates a Socks4 proxy client object using the supplied TcpClient object connection. /// /// An open TcpClient object with an established connection. public Socks4aProxyClient(TcpClient tcpClient) : base(tcpClient) { } /// /// Create a Socks4a proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy user identification information for an IDENTD server. public Socks4aProxyClient(string proxyHost, string proxyUserId) : base(proxyHost, proxyUserId) { } /// /// Create a Socks4a proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy user identification information. public Socks4aProxyClient(string proxyHost, int proxyPort, string proxyUserId) : base(proxyHost, proxyPort, proxyUserId) { } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks4aProxyClient(string proxyHost) : base(proxyHost) { } /// /// Create a Socks4a proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks4aProxyClient(string proxyHost, int proxyPort) : base(proxyHost, proxyPort) { } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS4a' public override string ProxyName { get { return PROXY_NAME; } } /// /// Sends a command to the proxy server. /// /// Proxy server data stream. /// Proxy byte command to execute. /// Destination host name or IP address. /// Destination port number /// IDENTD user ID value. /// /// This method override the SendCommand message in the Sock4ProxyClient object. The override adds support for the /// Socks4a extensions which allow the proxy client to optionally command the proxy server to resolve the /// destination host IP address. /// internal override void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId) { // PROXY SERVER REQUEST //Please read SOCKS4.protocol first for an description of the version 4 //protocol. This extension is intended to allow the use of SOCKS on hosts //which are not capable of resolving all domain names. // //In version 4, the client sends the following packet to the SOCKS server //to request a CONNECT or a BIND operation: // // +----+----+----+----+----+----+----+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+ // # of bytes: 1 1 2 4 variable 1 // //VN is the SOCKS protocol version number and should be 4. CD is the //SOCKS command code and should be 1 for CONNECT or 2 for BIND. NULL //is a byte of all zero bits. // //For version 4A, if the client cannot resolve the destination host's //domain name to find its IP address, it should set the first three bytes //of DSTIP to NULL and the last byte to a non-zero value. (This corresponds //to IP address 0.0.0.x, with x nonzero. As decreed by IANA -- The //Internet Assigned Numbers Authority -- such an address is inadmissible //as a destination IP address and thus should never occur if the client //can resolve the domain name.) Following the NULL byte terminating //USERID, the client must sends the destination domain name and termiantes //it with another NULL byte. This is used for both CONNECT and BIND requests. // //A server using protocol 4A must check the DSTIP in the request packet. //If it represent address 0.0.0.x with nonzero x, the server must read //in the domain name that the client sends in the packet. The server //should resolve the domain name and make connection to the destination //host if it can. // //SOCKSified sockd may pass domain names that it cannot resolve to //the next-hop SOCKS server. // userId needs to be a zero length string so that the GetBytes method // works properly if (userId == null) userId = ""; byte[] destIp = {0,0,0,1}; // build the invalid ip address as specified in the 4a protocol byte[] destPort = GetDestinationPortBytes(destinationPort); byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId); byte[] hostBytes = ASCIIEncoding.ASCII.GetBytes(destinationHost); byte[] request = new byte[10 + userIdBytes.Length + hostBytes.Length]; // set the bits on the request byte array request[0] = SOCKS4_VERSION_NUMBER; request[1] = command; destPort.CopyTo(request, 2); destIp.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); // copy the userid to the request byte array request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId hostBytes.CopyTo(request, 9 + userIdBytes.Length); // copy the host name to the request byte array request[9 + userIdBytes.Length + hostBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId // send the connect request proxy.Write(request, 0, request.Length); // wait for the proxy server to send a response base.WaitForData(proxy); // PROXY SERVER RESPONSE // The SOCKS server checks to see whether such a request should be granted // based on any combination of source IP address, destination IP address, // destination port number, the userid, and information it may obtain by // consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS // server makes a connection to the specified port of the destination host. // A reply packet is sent to the client when this connection is established, // or when the request is rejected or the operation fails. // // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // # of bytes: 1 1 2 4 // // VN is the version of the reply code and should be 0. CD is the result // code with one of the following values: // // 90: request granted // 91: request rejected or failed // 92: request rejected becuase SOCKS server cannot connect to // identd on the client // 93: request rejected because the client program and identd // report different user-ids // // The remaining fields are ignored. // // The SOCKS server closes its connection immediately after notifying // the client of a failed or rejected request. For a successful request, // the SOCKS server gets ready to relay traffic on both directions. This // enables the client to do I/O on its connection as if it were directly // connected to the application server. // create an 8 byte response array byte[] response = new byte[8]; // read the resonse from the network stream proxy.Read(response, 0, 8); // evaluate the reply code for an error condition if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED) HandleProxyCommandError(response, destinationHost, destinationPort); } } } smuxi-1.1/lib/StarkSoftProxy/.travis.yml0000644000175000017500000000063212254365454021172 0ustar00meebeymeebey00000000000000language: c install: - sudo apt-get update > /dev/null - sudo apt-get install mono-devel > /dev/null script: - xbuild StarkSoftProxy.csproj notifications: irc: channels: "chat.freenode.net#smuxi-devel" skip_join: true template: - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" - "Build details : %{build_url}" smuxi-1.1/lib/StarkSoftProxy/StarkSoftProxy.csproj0000644000175000017500000000415112652472053023261 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {3F8CF2C1-EA37-444F-8693-A3A00B1131D2} Library StarkSoftProxy StarkSoftProxy v4.5 true full false bin\Debug DEBUG; prompt 4 false none false bin\Release prompt 4 false smuxi-1.1/lib/StarkSoftProxy/ProxyClientFactory.cs0000644000175000017500000002113412204443216023204 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace Starksoft.Net.Proxy { /// /// The type of proxy. /// public enum ProxyType { /// /// No Proxy specified. Note this option will cause an exception to be thrown if used to create a proxy object by the factory. /// None, /// /// HTTP Proxy /// Http, /// /// SOCKS v4 Proxy /// Socks4, /// /// SOCKS v4a Proxy /// Socks4a, /// /// SOCKS v5 Proxy /// Socks5 } /// /// Factory class for creating new proxy client objects. /// /// /// /// // create an instance of the client proxy factory /// ProxyClientFactory factory = new ProxyClientFactory(); /// /// // use the proxy client factory to generically specify the type of proxy to create /// // the proxy factory method CreateProxyClient returns an IProxyClient object /// IProxyClient proxy = factory.CreateProxyClient(ProxyType.Http, "localhost", 6588); /// /// // create a connection through the proxy to www.starksoft.com over port 80 /// System.Net.Sockets.TcpClient tcpClient = proxy.CreateConnection("www.starksoft.com", 80); /// /// public class ProxyClientFactory { /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(); case ProxyType.Socks4: return new Socks4ProxyClient(); case ProxyType.Socks4a: return new Socks4aProxyClient(); case ProxyType.Socks5: return new Socks5ProxyClient(); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects using an existing TcpClient connection object. /// /// The type of proxy client to create. /// Open TcpClient object. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, TcpClient tcpClient) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(tcpClient); case ProxyType.Socks4: return new Socks4ProxyClient(tcpClient); case ProxyType.Socks4a: return new Socks4aProxyClient(tcpClient); case ProxyType.Socks5: return new Socks5ProxyClient(tcpClient); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// The proxy host or IP address. /// The proxy port number. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, string proxyHost, int proxyPort) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(proxyHost, proxyPort); case ProxyType.Socks4: return new Socks4ProxyClient(proxyHost, proxyPort); case ProxyType.Socks4a: return new Socks4aProxyClient(proxyHost, proxyPort); case ProxyType.Socks5: return new Socks5ProxyClient(proxyHost, proxyPort); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// The proxy host or IP address. /// The proxy port number. /// The proxy username. This parameter is only used by Socks4 and Socks5 proxy objects. /// The proxy user password. This parameter is only used Socks5 proxy objects. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, string proxyHost, int proxyPort, string proxyUsername, string proxyPassword) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(proxyHost, proxyPort); case ProxyType.Socks4: return new Socks4ProxyClient(proxyHost, proxyPort, proxyUsername); case ProxyType.Socks4a: return new Socks4aProxyClient(proxyHost, proxyPort, proxyUsername); case ProxyType.Socks5: return new Socks5ProxyClient(proxyHost, proxyPort, proxyUsername, proxyPassword); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// Open TcpClient object. /// The proxy host or IP address. /// The proxy port number. /// The proxy username. This parameter is only used by Socks4 and Socks5 proxy objects. /// The proxy user password. This parameter is only used Socks5 proxy objects. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, TcpClient tcpClient, string proxyHost, int proxyPort, string proxyUsername, string proxyPassword) { IProxyClient c = CreateProxyClient(type, proxyHost, proxyPort, proxyUsername, proxyPassword); c.TcpClient = tcpClient; return c; } } } smuxi-1.1/lib/StarkSoftProxy/HttpProxyClient.cs0000644000175000017500000004343512254365454022540 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net.Sockets; using System.Threading; using System.Globalization; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// HTTP connection proxy class. This class implements the HTTP standard proxy protocol. /// /// You can use this class to set up a connection to an HTTP proxy server. Calling the /// CreateConnection() method initiates the proxy connection and returns a standard /// System.Net.Socks.TcpClient object that can be used as normal. The proxy plumbing /// is all handled for you. /// /// /// /// /// public class HttpProxyClient : IProxyClient { private string _proxyHost; private int _proxyPort; private HttpResponseCodes _respCode; private string _respText; private TcpClient _tcpClient; private const int HTTP_PROXY_DEFAULT_PORT = 8080; private const string HTTP_PROXY_CONNECT_CMD = "CONNECT {0}:{1} HTTP/1.0\r\nHost: {0}:{1}\r\n\r\n"; private const int WAIT_FOR_DATA_INTERVAL = 50; // 50 ms private const int WAIT_FOR_DATA_TIMEOUT = 15000; // 15 seconds private const string PROXY_NAME = "HTTP"; private enum HttpResponseCodes { None = 0, Continue = 100, SwitchingProtocols = 101, OK = 200, Created = 201, Accepted = 202, NonAuthoritiveInformation = 203, NoContent = 204, ResetContent = 205, PartialContent = 206, MultipleChoices = 300, MovedPermanetly = 301, Found = 302, SeeOther = 303, NotModified = 304, UserProxy = 305, TemporaryRedirect = 307, BadRequest = 400, Unauthorized = 401, PaymentRequired = 402, Forbidden = 403, NotFound = 404, MethodNotAllowed = 405, NotAcceptable = 406, ProxyAuthenticantionRequired = 407, RequestTimeout = 408, Conflict = 409, Gone = 410, PreconditionFailed = 411, RequestEntityTooLarge = 413, RequestURITooLong = 414, UnsupportedMediaType = 415, RequestedRangeNotSatisfied = 416, ExpectationFailed = 417, InternalServerError = 500, NotImplemented = 501, BadGateway = 502, ServiceUnavailable = 503, GatewayTimeout = 504, HTTPVersionNotSupported = 505 } /// /// Constructor. /// public HttpProxyClient() { } /// /// Creates a HTTP proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public HttpProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Constructor. The default HTTP proxy port 8080 is used. /// /// Host name or IP address of the proxy. public HttpProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = HTTP_PROXY_DEFAULT_PORT; } /// /// Constructor. /// /// Host name or IP address of the proxy server. /// Port number for the proxy server. public HttpProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port number for the proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'HTTP' public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // send connection command to proxy host for the specified destination host and port SendConnectionCommand(destinationHost, destinationPort); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (SocketException ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } private void SendConnectionCommand(string host, int port) { NetworkStream stream = _tcpClient.GetStream(); // PROXY SERVER REQUEST // ======================================================================= //CONNECT starksoft.com:443 HTTP/1.0 //HOST starksoft.com:443 //[... other HTTP header lines ending with if required]> // // Last Empty Line string connectCmd = String.Format(CultureInfo.InvariantCulture, HTTP_PROXY_CONNECT_CMD, host, port.ToString(CultureInfo.InvariantCulture)); byte[] request = ASCIIEncoding.ASCII.GetBytes(connectCmd); // send the connect request stream.Write(request, 0, request.Length); // wait for the proxy server to respond WaitForData(stream); // PROXY SERVER RESPONSE // ======================================================================= //HTTP/1.0 200 Connection Established //[.... other HTTP header lines ending with .. //ignore all of them] // // Last Empty Line // create an byte response array byte[] response = new byte[_tcpClient.ReceiveBufferSize]; StringBuilder sbuilder = new StringBuilder(); int bytes = 0; long total = 0; do { bytes = stream.Read(response, 0, _tcpClient.ReceiveBufferSize); total += bytes; sbuilder.Append(System.Text.ASCIIEncoding.UTF8.GetString(response, 0, bytes)); } while (stream.DataAvailable); ParseResponse(sbuilder.ToString()); // evaluate the reply code for an error condition if (_respCode != HttpResponseCodes.OK) HandleProxyCommandError(host, port); } private void HandleProxyCommandError(string host, int port) { string msg; switch (_respCode) { case HttpResponseCodes.None: msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} failed to return a recognized HTTP response code. Server response: {2}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), _respText); break; case HttpResponseCodes.BadGateway: //HTTP/1.1 502 Proxy Error (The specified Secure Sockets Layer (SSL) port is not allowed. ISA Server is not configured to allow SSL requests from this port. Most Web browsers use port 443 for SSL requests.) msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} responded with a 502 code - Bad Gateway. If you are connecting to a Microsoft ISA destination please refer to knowledge based article Q283284 for more information. Server response: {2}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), _respText); break; default: msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} responded with a {2} code - {3}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), ((int)_respCode).ToString(CultureInfo.InvariantCulture), _respText); break; } // throw a new application exception throw new ProxyException(msg); } private void WaitForData(NetworkStream stream) { int sleepTime = 0; while (!stream.DataAvailable) { Thread.Sleep(WAIT_FOR_DATA_INTERVAL); sleepTime += WAIT_FOR_DATA_INTERVAL; if (sleepTime > WAIT_FOR_DATA_TIMEOUT) throw new ProxyException(String.Format("A timeout while waiting for the proxy server at {0} on port {1} to respond.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient) )); } } private void ParseResponse(string response) { string[] data = null; // get rid of the LF character if it exists and then split the string on all CR data = response.Replace('\n', ' ').Split('\r'); ParseCodeAndText(data[0]); } private void ParseCodeAndText(string line) { int begin = 0; int end = 0; string val = null; if (line.IndexOf("HTTP") == -1) throw new ProxyException(String.Format("No HTTP response received from proxy destination. Server response: {0}.", line)); begin = line.IndexOf(" ") + 1; end = line.IndexOf(" ", begin); val = line.Substring(begin, end - begin); Int32 code = 0; if (!Int32.TryParse(val, out code)) throw new ProxyException(String.Format("An invalid response code was received from proxy destination. Server response: {0}.", line)); _respCode = (HttpResponseCodes)code; _respText = line.Substring(end + 1).Trim(); } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The HttpProxy object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/StarkSoftProxy/Utils.cs0000644000175000017500000000174512204443216020502 0ustar00meebeymeebey00000000000000using System; using System.Text; using System.Globalization; using System.Net.Sockets; namespace Starksoft.Net.Proxy { internal static class Utils { internal static string GetHost(TcpClient client) { if (client == null) throw new ArgumentNullException("client"); string host = ""; try { host = ((System.Net.IPEndPoint)client.Client.RemoteEndPoint).Address.ToString(); } catch { }; return host; } internal static string GetPort(TcpClient client) { if (client == null) throw new ArgumentNullException("client"); string port = ""; try { port = ((System.Net.IPEndPoint)client.Client.RemoteEndPoint).Port.ToString(CultureInfo.InvariantCulture); } catch { }; return port; } } } smuxi-1.1/lib/StarkSoftProxy/Socks4ProxyClient.cs0000644000175000017500000006030612204443216022747 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Globalization; using System.IO; using System.Threading; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Socks4 connection proxy class. This class implements the Socks4 standard proxy protocol. /// /// /// This class implements the Socks4 proxy protocol standard for TCP communciations. /// public class Socks4ProxyClient : IProxyClient { private const int WAIT_FOR_DATA_INTERVAL = 50; // 50 ms private const int WAIT_FOR_DATA_TIMEOUT = 15000; // 15 seconds private const string PROXY_NAME = "SOCKS4"; private TcpClient _tcpClient; private string _proxyHost; private int _proxyPort; private string _proxyUserId; /// /// Default Socks4 proxy port. /// internal const int SOCKS_PROXY_DEFAULT_PORT = 1080; /// /// Socks4 version number. /// internal const byte SOCKS4_VERSION_NUMBER = 4; /// /// Socks4 connection command value. /// internal const byte SOCKS4_CMD_CONNECT = 0x01; /// /// Socks4 bind command value. /// internal const byte SOCKS4_CMD_BIND = 0x02; /// /// Socks4 reply request grant response value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_GRANTED = 90; /// /// Socks4 reply request rejected or failed response value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_OR_FAILED = 91; /// /// Socks4 reply request rejected becauase the proxy server can not connect to the IDENTD server value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_CANNOT_CONNECT_TO_IDENTD = 92; /// /// Socks4 reply request rejected because of a different IDENTD server. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_DIFFERENT_IDENTD = 93; /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// public Socks4ProxyClient() { } /// /// Creates a Socks4 proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public Socks4ProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy user identification information. public Socks4ProxyClient(string proxyHost, string proxyUserId) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyUserId == null) throw new ArgumentNullException("proxyUserId"); _proxyHost = proxyHost; _proxyPort = SOCKS_PROXY_DEFAULT_PORT; _proxyUserId = proxyUserId; } /// /// Create a Socks4 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy user identification information. public Socks4ProxyClient(string proxyHost, int proxyPort, string proxyUserId) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); if (proxyUserId == null) throw new ArgumentNullException("proxyUserId"); _proxyHost = proxyHost; _proxyPort = proxyPort; _proxyUserId = proxyUserId; } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks4ProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = SOCKS_PROXY_DEFAULT_PORT; } /// /// Create a Socks4 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks4ProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port used to connect to proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS4' virtual public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets proxy user identification information. /// public string ProxyUserId { get { return _proxyUserId; } set { _proxyUserId = value; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a TCP connection to the destination host through the proxy server /// host. /// /// Destination host name or IP address of the destination server. /// Port number to connect to on the destination server. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { if (String.IsNullOrEmpty(destinationHost)) throw new ArgumentNullException("destinationHost"); if (destinationPort <= 0 || destinationPort > 65535) throw new ArgumentOutOfRangeException("destinationPort", "port must be greater than zero and less than 65535"); try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // send connection command to proxy host for the specified destination host and port SendCommand(_tcpClient.GetStream(), SOCKS4_CMD_CONNECT, destinationHost, destinationPort, _proxyUserId); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } /// /// Sends a command to the proxy server. /// /// Proxy server data stream. /// Proxy byte command to execute. /// Destination host name or IP address. /// Destination port number /// IDENTD user ID value. internal virtual void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId) { // PROXY SERVER REQUEST // The client connects to the SOCKS server and sends a CONNECT request when // it wants to establish a connection to an application server. The client // includes in the request packet the IP address and the port number of the // destination host, and userid, in the following format. // // +----+----+----+----+----+----+----+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+ // # of bytes: 1 1 2 4 variable 1 // // VN is the SOCKS protocol version number and should be 4. CD is the // SOCKS command code and should be 1 for CONNECT request. NULL is a byte // of all zero bits. // userId needs to be a zero length string so that the GetBytes method // works properly if (userId == null) userId = ""; byte[] destIp = GetIPAddressBytes(destinationHost); byte[] destPort = GetDestinationPortBytes(destinationPort); byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId); byte[] request = new byte[9 + userIdBytes.Length]; // set the bits on the request byte array request[0] = SOCKS4_VERSION_NUMBER; request[1] = command; destPort.CopyTo(request, 2); destIp.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId // send the connect request proxy.Write(request, 0, request.Length); // wait for the proxy server to respond WaitForData(proxy); // PROXY SERVER RESPONSE // The SOCKS server checks to see whether such a request should be granted // based on any combination of source IP address, destination IP address, // destination port number, the userid, and information it may obtain by // consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS // server makes a connection to the specified port of the destination host. // A reply packet is sent to the client when this connection is established, // or when the request is rejected or the operation fails. // // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // # of bytes: 1 1 2 4 // // VN is the version of the reply code and should be 0. CD is the result // code with one of the following values: // // 90: request granted // 91: request rejected or failed // 92: request rejected becuase SOCKS server cannot connect to // identd on the client // 93: request rejected because the client program and identd // report different user-ids // // The remaining fields are ignored. // // The SOCKS server closes its connection immediately after notifying // the client of a failed or rejected request. For a successful request, // the SOCKS server gets ready to relay traffic on both directions. This // enables the client to do I/O on its connection as if it were directly // connected to the application server. // create an 8 byte response array byte[] response = new byte[8]; // read the resonse from the network stream proxy.Read(response, 0, 8); // evaluate the reply code for an error condition if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED) HandleProxyCommandError(response, destinationHost, destinationPort); } /// /// Translate the host name or IP address to a byte array. /// /// Host name or IP address. /// Byte array representing IP address in bytes. internal byte[] GetIPAddressBytes(string destinationHost) { IPAddress ipAddr = null; // if the address doesn't parse then try to resolve with dns if (!IPAddress.TryParse(destinationHost, out ipAddr)) { try { ipAddr = Dns.GetHostEntry(destinationHost).AddressList[0]; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "A error occurred while attempting to DNS resolve the host name {0}.", destinationHost), ex); } } // return address bytes return ipAddr.GetAddressBytes(); } /// /// Translate the destination port value to a byte array. /// /// Destination port. /// Byte array representing an 16 bit port number as two bytes. internal byte[] GetDestinationPortBytes(int value) { byte[] array = new byte[2]; array[0] = Convert.ToByte(value / 256); array[1] = Convert.ToByte(value % 256); return array; } /// /// Receive a byte array from the proxy server and determine and handle and errors that may have occurred. /// /// Proxy server command response as a byte array. /// Destination host. /// Destination port number. internal void HandleProxyCommandError(byte[] response, string destinationHost, int destinationPort) { if (response == null) throw new ArgumentNullException("response"); // extract the reply code byte replyCode = response[1]; // extract the ip v4 address (4 bytes) byte[] ipBytes = new byte[4]; for (int i = 0; i < 4; i++) ipBytes[i] = response[i + 4]; // convert the ip address to an IPAddress object IPAddress ipAddr = new IPAddress(ipBytes); // extract the port number big endian (2 bytes) byte[] portBytes = new byte[2]; portBytes[0] = response[3]; portBytes[1] = response[2]; Int16 port = BitConverter.ToInt16(portBytes, 0); // translate the reply code error number to human readable text string proxyErrorText; switch (replyCode) { case SOCKS4_CMD_REPLY_REQUEST_REJECTED_OR_FAILED: proxyErrorText = "connection request was rejected or failed"; break; case SOCKS4_CMD_REPLY_REQUEST_REJECTED_CANNOT_CONNECT_TO_IDENTD: proxyErrorText = "connection request was rejected because SOCKS destination cannot connect to identd on the client"; break; case SOCKS4_CMD_REPLY_REQUEST_REJECTED_DIFFERENT_IDENTD: proxyErrorText = "connection request rejected because the client program and identd report different user-ids"; break; default: proxyErrorText = String.Format(CultureInfo.InvariantCulture, "proxy client received an unknown reply with the code value '{0}' from the proxy destination", replyCode.ToString(CultureInfo.InvariantCulture)); break; } // build the exeception message string string exceptionMsg = String.Format(CultureInfo.InvariantCulture, "The {0} concerning destination host {1} port number {2}. The destination reported the host as {3} port {4}.", proxyErrorText, destinationHost, destinationPort, ipAddr.ToString(), port.ToString(CultureInfo.InvariantCulture)); // throw a new application exception throw new ProxyException(exceptionMsg); } internal void WaitForData(NetworkStream stream) { int sleepTime = 0; while (!stream.DataAvailable) { Thread.Sleep(WAIT_FOR_DATA_INTERVAL); sleepTime += WAIT_FOR_DATA_INTERVAL; if (sleepTime > WAIT_FOR_DATA_TIMEOUT) throw new ProxyException("A timeout while waiting for the proxy destination to respond."); } } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port /// using the supplied open TcpClient object with an open connection to proxy server. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns TcpClient object that can be used normally to communicate /// with the destination server. /// /// /// This instructs the proxy server to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The Socks4/4a object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/StarkSoftProxy/IProxyClient.cs0000644000175000017500000000771512204443216021776 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace Starksoft.Net.Proxy { /// /// Proxy client interface. This is the interface that all proxy clients must implement. /// public interface IProxyClient { /// /// Event handler for CreateConnectionAsync method completed. /// event EventHandler CreateConnectionAsyncCompleted; /// /// Gets or sets proxy host name or IP address. /// string ProxyHost { get; set; } /// /// Gets or sets proxy port number. /// int ProxyPort { get; set; } /// /// Gets String representing the name of the proxy. /// string ProxyName { get; } /// /// Gets or set the TcpClient object if one was specified in the constructor. /// TcpClient TcpClient { get; set; } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// TcpClient CreateConnection(string destinationHost, int destinationPort); /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// void CreateConnectionAsync(string destinationHost, int destinationPort); } } smuxi-1.1/lib/StarkSoftProxy/Socks5ProxyClient.cs0000644000175000017500000007740612631015626022765 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Collections.Generic; using System.Globalization; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Socks5 connection proxy class. This class implements the Socks5 standard proxy protocol. /// /// /// This implementation supports TCP proxy connections with a Socks v5 server. /// public class Socks5ProxyClient : IProxyClient { private string _proxyHost; private int _proxyPort; private string _proxyUserName; private string _proxyPassword; private SocksAuthentication _proxyAuthMethod; private TcpClient _tcpClient; private const string PROXY_NAME = "SOCKS5"; private const int SOCKS5_DEFAULT_PORT = 1080; private const byte SOCKS5_VERSION_NUMBER = 5; private const byte SOCKS5_RESERVED = 0x00; private const byte SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED = 0x00; private const byte SOCKS5_AUTH_METHOD_GSSAPI = 0x01; private const byte SOCKS5_AUTH_METHOD_USERNAME_PASSWORD = 0x02; private const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_BEGIN = 0x03; private const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_END = 0x7f; private const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_BEGIN = 0x80; private const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_END = 0xfe; private const byte SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS = 0xff; private const byte SOCKS5_CMD_CONNECT = 0x01; private const byte SOCKS5_CMD_BIND = 0x02; private const byte SOCKS5_CMD_UDP_ASSOCIATE = 0x03; private const byte SOCKS5_CMD_REPLY_SUCCEEDED = 0x00; private const byte SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE = 0x01; private const byte SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET = 0x02; private const byte SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE = 0x03; private const byte SOCKS5_CMD_REPLY_HOST_UNREACHABLE = 0x04; private const byte SOCKS5_CMD_REPLY_CONNECTION_REFUSED = 0x05; private const byte SOCKS5_CMD_REPLY_TTL_EXPIRED = 0x06; private const byte SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED = 0x07; private const byte SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED = 0x08; private const byte SOCKS5_ADDRTYPE_IPV4 = 0x01; private const byte SOCKS5_ADDRTYPE_DOMAIN_NAME = 0x03; private const byte SOCKS5_ADDRTYPE_IPV6 = 0x04; /// /// Authentication itemType. /// private enum SocksAuthentication { /// /// No authentication used. /// None, /// /// Username and password authentication. /// UsernamePassword } /// /// Create a Socks5 proxy client object. /// public Socks5ProxyClient() { } /// /// Creates a Socks5 proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public Socks5ProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Create a Socks5 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks5ProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = SOCKS5_DEFAULT_PORT; } /// /// Create a Socks5 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks5ProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Create a Socks5 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy authentication user name. /// Proxy authentication password. public Socks5ProxyClient(string proxyHost, string proxyUserName, string proxyPassword) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyUserName == null) throw new ArgumentNullException("proxyUserName"); if (proxyPassword == null) throw new ArgumentNullException("proxyPassword"); _proxyHost = proxyHost; _proxyPort = SOCKS5_DEFAULT_PORT; _proxyUserName = proxyUserName; _proxyPassword = proxyPassword; } /// /// Create a Socks5 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy authentication user name. /// Proxy authentication password. public Socks5ProxyClient(string proxyHost, int proxyPort, string proxyUserName, string proxyPassword) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); if (proxyUserName == null) throw new ArgumentNullException("proxyUserName"); if (proxyPassword == null) throw new ArgumentNullException("proxyPassword"); _proxyHost = proxyHost; _proxyPort = proxyPort; _proxyUserName = proxyUserName; _proxyPassword = proxyPassword; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port used to connect to proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS5' public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets proxy authentication user name. /// public string ProxyUserName { get { return _proxyUserName; } set { _proxyUserName = value; } } /// /// Gets or sets proxy authentication password. /// public string ProxyPassword { get { return _proxyPassword; } set { _proxyPassword = value; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address of the destination server. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { if (String.IsNullOrEmpty(destinationHost)) throw new ArgumentNullException("destinationHost"); if (destinationPort <= 0 || destinationPort > 65535) throw new ArgumentOutOfRangeException("destinationPort", "port must be greater than zero and less than 65535"); try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // determine which authentication method the client would like to use DetermineClientAuthMethod(); // negotiate which authentication methods are supported / accepted by the server NegotiateServerAuthMethod(); // send a connect command to the proxy server for destination host and port SendCommand(SOCKS5_CMD_CONNECT, destinationHost, destinationPort); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } private void DetermineClientAuthMethod() { // set the authentication itemType used based on values inputed by the user if (_proxyUserName != null && _proxyPassword != null) _proxyAuthMethod = SocksAuthentication.UsernamePassword; else _proxyAuthMethod = SocksAuthentication.None; } private void NegotiateServerAuthMethod() { // get a reference to the network stream NetworkStream stream = _tcpClient.GetStream(); // SERVER AUTHENTICATION REQUEST // The client connects to the server, and sends a version // identifier/method selection message: // // +----+----------+----------+ // |VER | NMETHODS | METHODS | // +----+----------+----------+ // | 1 | 1 | 1 to 255 | // +----+----------+----------+ var haveUserPass = !String.IsNullOrEmpty(_proxyUserName) && !String.IsNullOrEmpty(_proxyPassword); var authRequest = new List(); authRequest.Add(SOCKS5_VERSION_NUMBER); if (haveUserPass) { authRequest.Add(2); authRequest.Add(SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED); authRequest.Add(SOCKS5_AUTH_METHOD_USERNAME_PASSWORD); } else { authRequest.Add(1); authRequest.Add(SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED); } // send the request to the server specifying authentication types supported by the client. stream.Write(authRequest.ToArray(), 0, authRequest.Count); // SERVER AUTHENTICATION RESPONSE // The server selects from one of the methods given in METHODS, and // sends a METHOD selection message: // // +----+--------+ // |VER | METHOD | // +----+--------+ // | 1 | 1 | // +----+--------+ // // If the selected METHOD is X'FF', none of the methods listed by the // client are acceptable, and the client MUST close the connection. // // The values currently defined for METHOD are: // * X'00' NO AUTHENTICATION REQUIRED // * X'01' GSSAPI // * X'02' USERNAME/PASSWORD // * X'03' to X'7F' IANA ASSIGNED // * X'80' to X'FE' RESERVED FOR PRIVATE METHODS // * X'FF' NO ACCEPTABLE METHODS // receive the server response byte[] response = new byte[2]; stream.Read(response, 0, response.Length); // the first byte contains the socks version number (e.g. 5) // the second byte contains the auth method acceptable to the proxy server byte acceptedAuthMethod = response[1]; // if the server does not accept any of our supported authenication methods then throw an error if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS) { _tcpClient.Close(); throw new ProxyException("The proxy destination does not accept the supported proxy client authentication methods."); } // if the server accepts a username and password authentication and none is provided by the user then throw an error if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_USERNAME_PASSWORD && _proxyAuthMethod == SocksAuthentication.None) { _tcpClient.Close(); throw new ProxyException("The proxy destination requires a username and password for authentication."); } if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_USERNAME_PASSWORD) { // USERNAME / PASSWORD SERVER REQUEST // Once the SOCKS V5 server has started, and the client has selected the // Username/Password Authentication protocol, the Username/Password // subnegotiation begins. This begins with the client producing a // Username/Password request: // // +----+------+----------+------+----------+ // |VER | ULEN | UNAME | PLEN | PASSWD | // +----+------+----------+------+----------+ // | 1 | 1 | 1 to 255 | 1 | 1 to 255 | // +----+------+----------+------+----------+ byte[] credentials = new byte[_proxyUserName.Length + _proxyPassword.Length + 3]; credentials[0] = 1; credentials[1] = (byte)_proxyUserName.Length; Array.Copy(ASCIIEncoding.ASCII.GetBytes(_proxyUserName), 0, credentials, 2, _proxyUserName.Length); credentials[_proxyUserName.Length + 2] = (byte)_proxyPassword.Length; Array.Copy(ASCIIEncoding.ASCII.GetBytes(_proxyPassword), 0, credentials, _proxyUserName.Length + 3, _proxyPassword.Length); // USERNAME / PASSWORD SERVER RESPONSE // The server verifies the supplied UNAME and PASSWD, and sends the // following response: // // +----+--------+ // |VER | STATUS | // +----+--------+ // | 1 | 1 | // +----+--------+ // // A STATUS field of X'00' indicates success. If the server returns a // `failure' (STATUS value other than X'00') status, it MUST close the // connection. stream.Write(credentials, 0, credentials.Length); byte[] crResponse = new byte[2]; stream.Read(crResponse, 0, crResponse.Length); if (crResponse[1] != 0) { _tcpClient.Close(); throw new ProxyException("Proxy authentification failure!"); } } } private byte GetDestAddressType(string host) { IPAddress ipAddr = null; bool result = IPAddress.TryParse(host, out ipAddr); if (!result) return SOCKS5_ADDRTYPE_DOMAIN_NAME; switch (ipAddr.AddressFamily) { case AddressFamily.InterNetwork: return SOCKS5_ADDRTYPE_IPV4; case AddressFamily.InterNetworkV6: return SOCKS5_ADDRTYPE_IPV6; default: throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "The host addess {0} of type '{1}' is not a supported address type. The supported types are InterNetwork and InterNetworkV6.", host, Enum.GetName(typeof(AddressFamily), ipAddr.AddressFamily))); } } private byte[] GetDestAddressBytes(byte addressType, string host) { switch (addressType) { case SOCKS5_ADDRTYPE_IPV4: case SOCKS5_ADDRTYPE_IPV6: return IPAddress.Parse(host).GetAddressBytes(); case SOCKS5_ADDRTYPE_DOMAIN_NAME: // create a byte array to hold the host name bytes plus one byte to store the length byte[] bytes = new byte[host.Length + 1]; // if the address field contains a fully-qualified domain name. The first // octet of the address field contains the number of octets of name that // follow, there is no terminating NUL octet. bytes[0] = Convert.ToByte(host.Length); Encoding.ASCII.GetBytes(host).CopyTo(bytes, 1); return bytes; default: return null; } } private byte[] GetDestPortBytes(int value) { byte[] array = new byte[2]; array[0] = Convert.ToByte(value / 256); array[1] = Convert.ToByte(value % 256); return array; } private void SendCommand(byte command, string destinationHost, int destinationPort) { NetworkStream stream = _tcpClient.GetStream(); byte addressType = GetDestAddressType(destinationHost); byte[] destAddr = GetDestAddressBytes(addressType, destinationHost); byte[] destPort = GetDestPortBytes(destinationPort); // The connection request is made up of 6 bytes plus the // length of the variable address byte array // // +----+-----+-------+------+----------+----------+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ // // * VER protocol version: X'05' // * CMD // * CONNECT X'01' // * BIND X'02' // * UDP ASSOCIATE X'03' // * RSV RESERVED // * ATYP address itemType of following address // * IP V4 address: X'01' // * DOMAINNAME: X'03' // * IP V6 address: X'04' // * DST.ADDR desired destination address // * DST.PORT desired destination port in network octet order byte[] request = new byte[4 + destAddr.Length + 2]; request[0] = SOCKS5_VERSION_NUMBER; request[1] = command; request[2] = SOCKS5_RESERVED; request[3] = addressType; destAddr.CopyTo(request, 4); destPort.CopyTo(request, 4 + destAddr.Length); // send connect request. stream.Write(request, 0, request.Length); // PROXY SERVER RESPONSE // +----+-----+-------+------+----------+----------+ // |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ // // * VER protocol version: X'05' // * REP Reply field: // * X'00' succeeded // * X'01' general SOCKS server failure // * X'02' connection not allowed by ruleset // * X'03' Network unreachable // * X'04' Host unreachable // * X'05' Connection refused // * X'06' TTL expired // * X'07' Command not supported // * X'08' Address itemType not supported // * X'09' to X'FF' unassigned //* RSV RESERVED //* ATYP address itemType of following address byte[] response = new byte[255]; // read proxy server response var responseSize = stream.Read(response, 0, response.Length); byte replyCode = response[1]; // evaluate the reply code for an error condition if (responseSize < 2 || replyCode != SOCKS5_CMD_REPLY_SUCCEEDED) HandleProxyCommandError(response, destinationHost, destinationPort ); } private void HandleProxyCommandError(byte[] response, string destinationHost, int destinationPort) { string proxyErrorText; byte replyCode = response[1]; byte addrType = response[3]; string addr = ""; Int16 port = 0; switch (addrType) { case SOCKS5_ADDRTYPE_DOMAIN_NAME: int addrLen = Convert.ToInt32(response[4]); byte[] addrBytes = new byte[addrLen]; for (int i = 0; i < addrLen; i++) addrBytes[i] = response[i + 5]; addr = System.Text.ASCIIEncoding.ASCII.GetString(addrBytes); byte[] portBytesDomain = new byte[2]; portBytesDomain[0] = response[6 + addrLen]; portBytesDomain[1] = response[5 + addrLen]; port = BitConverter.ToInt16(portBytesDomain, 0); break; case SOCKS5_ADDRTYPE_IPV4: byte[] ipv4Bytes = new byte[4]; for (int i = 0; i < 4; i++) ipv4Bytes[i] = response[i + 4]; IPAddress ipv4 = new IPAddress(ipv4Bytes); addr = ipv4.ToString(); byte[] portBytesIpv4 = new byte[2]; portBytesIpv4[0] = response[9]; portBytesIpv4[1] = response[8]; port = BitConverter.ToInt16(portBytesIpv4, 0); break; case SOCKS5_ADDRTYPE_IPV6: byte[] ipv6Bytes = new byte[16]; for (int i = 0; i < 16; i++) ipv6Bytes[i] = response[i + 4]; IPAddress ipv6 = new IPAddress(ipv6Bytes); addr = ipv6.ToString(); byte[] portBytesIpv6 = new byte[2]; portBytesIpv6[0] = response[21]; portBytesIpv6[1] = response[20]; port = BitConverter.ToInt16(portBytesIpv6, 0); break; } switch (replyCode) { case SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE: proxyErrorText = "a general socks destination failure occurred"; break; case SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET: proxyErrorText = "the connection is not allowed by proxy destination rule set"; break; case SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE: proxyErrorText = "the network was unreachable"; break; case SOCKS5_CMD_REPLY_HOST_UNREACHABLE: proxyErrorText = "the host was unreachable"; break; case SOCKS5_CMD_REPLY_CONNECTION_REFUSED: proxyErrorText = "the connection was refused by the remote network"; break; case SOCKS5_CMD_REPLY_TTL_EXPIRED: proxyErrorText = "the time to live (TTL) has expired"; break; case SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED: proxyErrorText = "the command issued by the proxy client is not supported by the proxy destination"; break; case SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED: proxyErrorText = "the address type specified is not supported"; break; default: proxyErrorText = String.Format(CultureInfo.InvariantCulture, "that an unknown reply with the code value '{0}' was received by the destination", replyCode.ToString(CultureInfo.InvariantCulture)); break; } string exceptionMsg = String.Format(CultureInfo.InvariantCulture, "The {0} concerning destination host {1} port number {2}. The destination reported the host as {3} port {4}.", proxyErrorText, destinationHost, destinationPort, addr, port.ToString(CultureInfo.InvariantCulture)); throw new ProxyException(exceptionMsg); } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns TcpClient object that can be used normally to communicate /// with the destination server. /// /// /// This method instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The Socks4 object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/JabbR/0000775000175000017500000000000014011526500015040 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/JabbR/JabbR/0000775000175000017500000000000014011526500016020 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/JabbR/JabbR/Models/0000775000175000017500000000000014011526500017243 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/JabbR/JabbR/Models/ClientMessage.cs0000644000175000017500000000030412204443201022306 0ustar00meebeymeebey00000000000000namespace JabbR.Models { public class ClientMessage { public string Id { get; set; } public string Content { get; set; } public string Room { get; set; } } }smuxi-1.1/lib/JabbR/JabbR/Models/ClientNotification.cs0000644000175000017500000000037212204443201023355 0ustar00meebeymeebey00000000000000namespace JabbR.Models { public class ClientNotification { public string Room { get; set; } public string ImageUrl { get; set; } public string Source { get; set; } public string Content { get; set; } } }smuxi-1.1/lib/JabbR/JabbR.Client/0000775000175000017500000000000014011526500017235 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/JabbR/JabbR.Client/JabbRClient.cs0000644000175000017500000003251612245370026021717 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Threading; using System.Threading.Tasks; using JabbR.Client.Models; using JabbR.Models; using Microsoft.AspNet.SignalR.Client; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Client.Hubs; using Microsoft.AspNet.SignalR.Client.Transports; namespace JabbR.Client { public class JabbRClient : IJabbRClient { private readonly IAuthenticationProvider _authenticationProvider; private readonly Func _transportFactory; private IHubProxy _chat; private HubConnection _connection; public JabbRClient(string url) : this(url, authenticationProvider: null, transportFactory: () => new AutoTransport(new DefaultHttpClient())) { } public JabbRClient(string url, IAuthenticationProvider authenticationProvider, Func transportFactory) { SourceUrl = url; _authenticationProvider = authenticationProvider ?? new DefaultAuthenticationProvider(url); _transportFactory = transportFactory; TraceLevel = TraceLevels.All; } public event Action MessageReceived; public event Action> LoggedOut; public event Action UserJoined; public event Action UserLeft; public event Action Kicked; public event Action PrivateMessage; public event Action UserTyping; public event Action GravatarChanged; public event Action MeMessageReceived; public event Action UsernameChanged; public event Action NoteChanged; public event Action FlagChanged; public event Action TopicChanged; public event Action OwnerAdded; public event Action OwnerRemoved; public event Action AddMessageContent; public event Action JoinedRoom; // Global public event Action RoomCountChanged; public event Action UserActivityChanged; public event Action> UsersInactive; public string SourceUrl { get; private set; } public bool AutoReconnect { get; set; } public TextWriter TraceWriter { get; set; } public TraceLevels TraceLevel { get; set; } public HubConnection Connection { get { return _connection; } } public ICredentials Credentials { get { return _connection.Credentials; } set { _connection.Credentials = value; } } public event Action Disconnected { add { _connection.Closed += value; } remove { _connection.Closed -= value; } } public event Action StateChanged { add { _connection.StateChanged += value; } remove { _connection.StateChanged -= value; } } public Task Connect(string name, string password) { var taskCompletionSource = new TaskCompletionSource(); _authenticationProvider.Connect(name, password) .Then(connection => { _connection = connection; if (TraceWriter != null) { _connection.TraceWriter = TraceWriter; } _connection.TraceLevel = TraceLevel; _chat = _connection.CreateHubProxy("chat"); SubscribeToEvents(); return _connection.Start(_transportFactory()); }) .Then(tcs => LogOn(tcs), taskCompletionSource) .Catch(ex => taskCompletionSource.TrySetException(ex)); return taskCompletionSource.Task; } private void LogOn(TaskCompletionSource tcs) { IDisposable logOn = null; Action callback = logOnInfo => { if (logOn != null) { logOn.Dispose(); } tcs.TrySetResult(logOnInfo); }; // Wait for the logOn callback to get triggered logOn = _chat.On>(ClientEvents.LogOn, rooms => { callback(new LogOnInfo { Rooms = rooms, UserId = (string)_chat["id"] }); }); // Join JabbR _chat.Invoke("Join").ContinueWith(task => { if (task.IsFaulted) { tcs.TrySetUnwrappedException(task.Exception); } else if (task.IsCanceled) { tcs.TrySetCanceled(); } }, TaskContinuationOptions.NotOnRanToCompletion); } public Task GetUserInfo() { return _chat.Invoke("GetUserInfo"); } public Task LogOut() { return _chat.Invoke("LogOut"); } public Task Send(string message, string roomName) { return _chat.Invoke("Send", message, roomName); } public Task Send(ClientMessage message) { return _chat.Invoke("Send", message); } public Task PostNotification(ClientNotification notification, bool executeContentProviders) { return _chat.Invoke("PostNotification", notification, executeContentProviders); } public Task PostNotification(ClientNotification notification) { return _chat.Invoke("PostNotification", notification); } public Task CreateRoom(string roomName) { var tcs = new TaskCompletionSource(); IDisposable createRoom = null; createRoom = _chat.On(ClientEvents.RoomCreated, room => { createRoom.Dispose(); tcs.SetResult(null); }); SendCommand("create {0}", roomName).ContinueWithNotComplete(tcs); return tcs.Task; } public Task JoinRoom(string roomName) { var tcs = new TaskCompletionSource(); IDisposable joinRoom = null; joinRoom = _chat.On(ClientEvents.JoinRoom, room => { joinRoom.Dispose(); tcs.SetResult(null); }); SendCommand("join {0}", roomName).ContinueWithNotComplete(tcs); return tcs.Task; } public Task LeaveRoom(string roomName) { return SendCommand("leave {0}", roomName); } public Task SetFlag(string countryCode) { return SendCommand("flag {0}", countryCode); } public Task SetNote(string noteText) { return SendCommand("note {0}", noteText); } public Task SendPrivateMessage(string userName, string message) { return SendCommand("msg {0} {1}", userName, message); } public Task Kick(string userName, string roomName) { return SendCommand("kick {0} {1}", userName, roomName); } public Task CheckStatus() { return _chat.Invoke("CheckStatus"); } public Task SetTyping(string roomName) { return _chat.Invoke("Typing", roomName); } public Task> GetPreviousMessages(string fromId) { return _chat.Invoke>("GetPreviousMessages", fromId); } public Task GetRoomInfo(string roomName) { return _chat.Invoke("GetRoomInfo", roomName); } public Task> GetRooms() { return _chat.Invoke>("GetRooms"); } public void Disconnect() { _connection.Stop(); } private void SubscribeToEvents() { if (AutoReconnect) { Disconnected += OnDisconnected; } _chat.On(ClientEvents.AddMessage, (message, room) => { Execute(MessageReceived, messageReceived => messageReceived(message, room)); }); _chat.On>(ClientEvents.LogOut, rooms => { Execute(LoggedOut, loggedOut => loggedOut(rooms)); }); _chat.On(ClientEvents.AddUser, (user, room, isOwner) => { Execute(UserJoined, userJoined => userJoined(user, room, isOwner)); }); _chat.On(ClientEvents.Leave, (user, room) => { Execute(UserLeft, userLeft => userLeft(user, room)); }); _chat.On(ClientEvents.Kick, room => { Execute(Kicked, kicked => kicked(room)); }); _chat.On(ClientEvents.UpdateRoomCount, (room, count) => { Execute(RoomCountChanged, roomCountChanged => roomCountChanged(room, count)); }); _chat.On(ClientEvents.UpdateActivity, user => { Execute(UserActivityChanged, userActivityChanged => userActivityChanged(user)); }); _chat.On(ClientEvents.SendPrivateMessage, (from, to, message) => { Execute(PrivateMessage, privateMessage => privateMessage(from, to, message)); }); _chat.On>(ClientEvents.MarkInactive, (users) => { Execute(UsersInactive, usersInactive => usersInactive(users)); }); _chat.On(ClientEvents.SetTyping, (user, room) => { Execute(UserTyping, userTyping => userTyping(user, room)); }); _chat.On(ClientEvents.GravatarChanged, (user, room) => { Execute(GravatarChanged, gravatarChanged => gravatarChanged(user, room)); }); _chat.On(ClientEvents.MeMessageReceived, (user, content, room) => { Execute(MeMessageReceived, meMessageReceived => meMessageReceived(user, content, room)); }); _chat.On(ClientEvents.UsernameChanged, (oldUserName, user, room) => { Execute(UsernameChanged, usernameChanged => usernameChanged(oldUserName, user, room)); }); _chat.On(ClientEvents.NoteChanged, (user, room) => { Execute(NoteChanged, noteChanged => noteChanged(user, room)); }); _chat.On(ClientEvents.FlagChanged, (user, room) => { Execute(FlagChanged, flagChanged => flagChanged(user, room)); }); _chat.On(ClientEvents.TopicChanged, (room) => { Execute(TopicChanged, topicChanged => topicChanged(room)); }); _chat.On(ClientEvents.OwnerAdded, (user, room) => { Execute(OwnerAdded, ownerAdded => ownerAdded(user, room)); }); _chat.On(ClientEvents.OwnerRemoved, (user, room) => { Execute(OwnerRemoved, ownerRemoved => ownerRemoved(user, room)); }); _chat.On(ClientEvents.AddMessageContent, (messageId, extractedContent, roomName) => { Execute(AddMessageContent, addMessageContent => addMessageContent(messageId, extractedContent, roomName)); }); _chat.On(ClientEvents.JoinRoom, (room) => { Execute(JoinedRoom, joinedRoom => joinedRoom(room)); }); } private void OnDisconnected() { TaskAsyncHelper.Delay(TimeSpan.FromSeconds(5)).Then(() => { _connection.Start(_transportFactory()).Then(() => { // Join JabbR _chat.Invoke("Join", false); }); }); } private static void Execute(T handlers, Action action) where T : class { Task.Factory.StartNew(() => { if (handlers != null) { action(handlers); } }).Catch(); } private Task SendCommand(string command, params object[] args) { return _chat.Invoke("Send", String.Format("/" + command, args), ""); } } } smuxi-1.1/lib/JabbR/JabbR.Client/IAuthenticationProvider.cs0000644000175000017500000000057412204443201024371 0ustar00meebeymeebey00000000000000using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Hubs; namespace JabbR.Client { /// /// Interface that wraps SignalR's IClientTransport and provides a way to add authentication information /// public interface IAuthenticationProvider { Task Connect(string userName, string password); } } smuxi-1.1/lib/JabbR/JabbR.Client/Properties/0000775000175000017500000000000014011526500021371 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/JabbR/JabbR.Client/Properties/AssemblyInfo.cs0000644000175000017500000000051412204443201024307 0ustar00meebeymeebey00000000000000using System.Reflection; [assembly: AssemblyTitle("JabbR.Client")] [assembly: AssemblyDescription(".NET Client for JabbR (https://github.com/davidfowl/JabbR)")] [assembly: AssemblyCompany("David Fowler")] [assembly: AssemblyProduct("JabbR.Client")] [assembly: AssemblyVersion("0.1")] [assembly: AssemblyFileVersion("1.0.0.0")] smuxi-1.1/lib/JabbR/JabbR.Client/HttpHelper.cs0000644000175000017500000001012112204443201021632 0ustar00meebeymeebey00000000000000// // Copyright 2011-2013 Microsoft Open Technologies, Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; namespace JabbR.Client { internal static class HttpHelper { [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task GetHttpResponseAsync(this HttpWebRequest request) { try { return Task.Factory.FromAsync(request.BeginGetResponse, ar => (HttpWebResponse)request.EndGetResponse(ar), null); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task GetHttpRequestStreamAsync(this HttpWebRequest request) { try { return Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } public static Task GetAsync(string url, Action requestPreparer) { HttpWebRequest request = CreateWebRequest(url); if (requestPreparer != null) { requestPreparer(request); } return request.GetHttpResponseAsync(); } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Callers check for null return.")] public static string ReadAsString(this HttpWebResponse response) { try { using (response) { using (Stream stream = response.GetResponseStream()) { var reader = new StreamReader(stream); return reader.ReadToEnd(); } } } catch (Exception ex) { #if NET35 Debug.WriteLine(String.Format(System.Globalization.CultureInfo.InvariantCulture, "Failed to read response: {0}", ex)); #else Debug.WriteLine("Failed to read response: {0}", ex); #endif // Swallow exceptions when reading the response stream and just try again. return null; } } private static HttpWebRequest CreateWebRequest(string url) { HttpWebRequest request = null; #if WINDOWS_PHONE request = (HttpWebRequest)WebRequest.Create(url); request.AllowReadStreamBuffering = false; #elif SILVERLIGHT request = (HttpWebRequest)System.Net.Browser.WebRequestCreator.ClientHttp.Create(new Uri(url)); request.AllowReadStreamBuffering = false; #else request = (HttpWebRequest)WebRequest.Create(url); #endif return request; } } } smuxi-1.1/lib/JabbR/JabbR.Client/DefaultAuthenticationProvider.cs0000644000175000017500000000464512204443201025570 0ustar00meebeymeebey00000000000000using System; using System.Net; using System.Security; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Hubs; namespace JabbR.Client { public class DefaultAuthenticationProvider : IAuthenticationProvider { private readonly string _url; public DefaultAuthenticationProvider(string url) { _url = url; } public Task Connect(string userName, string password) { var content = String.Format("username={0}&password={1}", Uri.EscapeUriString(userName), Uri.EscapeUriString(password)); var contentBytes = Encoding.ASCII.GetBytes(content); var authUri = new UriBuilder(_url) { Path = "account/login" }; var cookieJar = new CookieContainer(); var request = (HttpWebRequest)WebRequest.Create(authUri.Uri); request.CookieContainer = cookieJar; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = contentBytes.Length; return request.GetHttpRequestStreamAsync() .Then(stream => stream.WriteAsync(contentBytes).Then(() => stream.Dispose())) .Then(() => request.GetHttpResponseAsync()) .Then(response => { var respStatusCode = response.StatusCode; if (respStatusCode < HttpStatusCode.OK || respStatusCode > (HttpStatusCode)299) { throw new WebException(String.Format("Response status code does not indicate success: {0}", respStatusCode)); } // Verify the cookie var cookie = cookieJar.GetCookies(new Uri(_url)); if (cookie == null || cookie["jabbr.id"] == null) { throw new SecurityException("Didn't get a cookie from JabbR! Ensure your User Name/Password are correct"); } // Create a hub connection and give it our cookie jar var connection = new HubConnection(_url) { CookieContainer = cookieJar }; return connection; }); } } } smuxi-1.1/lib/JabbR/JabbR.Client/JabbR.Client.csproj0000644000175000017500000000750112652472053022671 0ustar00meebeymeebey00000000000000 Debug AnyCPU 8.0.30703 2.0 {A4A1D183-FD80-4DBD-806F-883DDADD4967} Library Properties JabbR.Client JabbR.Client v4.5 512 ..\ true true full false bin\Debug\ DEBUG;TRACE prompt 4 false pdbonly true bin\Release\ TRACE prompt 4 false Models\ClientMessage.cs Models\ClientNotification.cs {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Newtonsoft.Json {EB46B9C6-EE37-48F9-835E-E49580E40E0A} Microsoft.AspNet.SignalR.Client smuxi-1.1/lib/JabbR/JabbR.Client/TaskAsyncHelper.cs0000644000175000017500000012056312204443201022627 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Infrastructure; namespace JabbR.Client { internal static class TaskAsyncHelper { private static readonly Task _emptyTask = MakeTask(null); private static readonly Task _trueTask = MakeTask(true); private static readonly Task _falseTask = MakeTask(false); private static Task MakeTask(T value) { return FromResult(value); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Empty { get { return _emptyTask; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task True { get { return _trueTask; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task False { get { return _falseTask; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task OrEmpty(this Task task) { return task ?? Empty; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task OrEmpty(this Task task) { return task ?? TaskCache.Empty; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromAsync(Func beginMethod, Action endMethod, object state) { try { return Task.Factory.FromAsync(beginMethod, endMethod, state); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromAsync(Func beginMethod, Func endMethod, object state) { try { return Task.Factory.FromAsync(beginMethod, endMethod, state); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Series(Func[] tasks, object[] state) { Task prev = TaskAsyncHelper.Empty; Task finalTask = TaskAsyncHelper.Empty; for (int i = 0; i < tasks.Length; i++) { prev = finalTask; finalTask = prev.Then(tasks[i], state[i]); } return finalTask; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static TTask Catch(this TTask task) where TTask : Task { return Catch(task, ex => { }); } #if PERFCOUNTERS public static TTask Catch(this TTask task, params IPerformanceCounter[] counters) where TTask : Task { return Catch(task, _ => { if (counters == null) { return; } for (var i = 0; i < counters.Length; i++) { counters[i].Increment(); } }); } #endif [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static TTask Catch(this TTask task, Action handler, object state) where TTask : Task { if (task != null && task.Status != TaskStatus.RanToCompletion) { if (task.Status == TaskStatus.Faulted) { ExecuteOnFaulted(handler, state, task.Exception); } else { AttachFaultedContinuation(task, handler, state); } } return task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static void AttachFaultedContinuation(TTask task, Action handler, object state) where TTask : Task { task.ContinueWith(innerTask => { ExecuteOnFaulted(handler, state, innerTask.Exception); }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static void ExecuteOnFaulted(Action handler, object state, AggregateException exception) { // observe Exception #if !WINDOWS_PHONE && !SILVERLIGHT && !NETFX_CORE && !ANDROID && !IOS Trace.TraceError("SignalR exception thrown by Task: {0}", exception); #endif handler(exception, state); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static TTask Catch(this TTask task, Action handler) where TTask : Task { return task.Catch((ex, state) => ((Action)state).Invoke(ex), handler); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task ContinueWithNotComplete(this Task task, Action action) { if (task.IsCanceled) { action(); } else if (task.IsFaulted) { action(); } else { task.ContinueWith(t => { if (t.IsFaulted || t.IsCanceled) { action(); } }, TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.NotOnRanToCompletion); } return task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static void ContinueWithNotComplete(this Task task, TaskCompletionSource tcs) { task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } }, TaskContinuationOptions.NotOnRanToCompletion); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static void ContinueWith(this Task task, TaskCompletionSource tcs) { task.ContinueWith(t => { if (t.IsFaulted) { tcs.TrySetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(null); } }, TaskContinuationOptions.ExecuteSynchronously); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static void ContinueWith(this Task task, TaskCompletionSource tcs) { task.ContinueWith(t => { if (t.IsFaulted) { tcs.TrySetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(t.Result); } }); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Return(this Task[] tasks) { return Then(tasks, () => { }); } // Then extesions [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor); default: return RunTask(task, successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor); default: return TaskRunners.RunTask(task, successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task[] tasks, Action successor) { if (tasks.Length == 0) { return FromMethod(successor); } var tcs = new TaskCompletionSource(); Task.Factory.ContinueWhenAll(tasks, completedTasks => { var faulted = completedTasks.FirstOrDefault(t => t.IsFaulted); if (faulted != null) { tcs.SetUnwrappedException(faulted.Exception); return; } var cancelled = completedTasks.FirstOrDefault(t => t.IsCanceled); if (cancelled != null) { tcs.SetCanceled(); return; } successor(); tcs.SetResult(null); }); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1); default: return GenericDelegates.ThenWithArgs(task, successor, arg1); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor, T1 arg1, T2 arg2) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1, arg2); default: return GenericDelegates.ThenWithArgs(task, successor, arg1, arg2); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1); default: return GenericDelegates.ThenWithArgs(task, successor, arg1) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor, T1 arg1, T2 arg2) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1, arg2); default: return GenericDelegates.ThenWithArgs(task, successor, arg1, arg2) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func> successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners>.RunTask(task, t => successor(t.Result)) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners.RunTask(task, t => successor(t.Result)); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result, arg1); default: return GenericDelegates.ThenWithArgs(task, successor, arg1); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor); default: return TaskRunners.RunTask(task, successor) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func> successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor); default: return TaskRunners>.RunTask(task, successor) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners.RunTask(task, successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners.RunTask(task, t => successor(t.Result)) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func, T1, Task> successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, task, arg1); default: return GenericDelegates, T1, object>.ThenWithArgs(task, successor, arg1) .FastUnwrap(); } } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed to the caller")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Finally(this Task task, Action next, object state) { try { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: next(state); return task; case TaskStatus.RanToCompletion: return FromMethod(next, state); default: return RunTaskSynchronously(task, next, state, onlyOnSuccess: false); } } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task RunSynchronously(this Task task, Action successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor); default: return RunTaskSynchronously(task, state => ((Action)state).Invoke(), successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task FastUnwrap(this Task task) { var innerTask = (task.Status == TaskStatus.RanToCompletion) ? task.Result : null; return innerTask ?? task.Unwrap(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task FastUnwrap(this Task> task) { var innerTask = (task.Status == TaskStatus.RanToCompletion) ? task.Result : null; return innerTask ?? task.Unwrap(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Delay(TimeSpan timeOut) { #if NETFX_CORE return Task.Delay(timeOut); #else var tcs = new TaskCompletionSource(); var timer = new Timer(tcs.SetResult, null, timeOut, TimeSpan.FromMilliseconds(-1)); return tcs.Task.ContinueWith(_ => { timer.Dispose(); }, TaskContinuationOptions.ExecuteSynchronously); #endif } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Action func) { try { func(); return Empty; } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Action func, T1 arg) { try { func(arg); return Empty; } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Action func, T1 arg1, T2 arg2) { try { func(arg1, arg2); return Empty; } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func) { try { return func(); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func> func) { try { return func(); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func) { try { return FromResult(func()); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg) { try { return func(arg); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg1, T2 arg2) { try { return func(arg1, arg2); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func> func, T1 arg) { try { return func(arg); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg) { try { return FromResult(func(arg)); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func> func, T1 arg1, T2 arg2) { try { return func(arg1, arg2); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg1, T2 arg2) { try { return FromResult(func(arg1, arg2)); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task FromResult(T value) { var tcs = new TaskCompletionSource(); tcs.SetResult(value); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static Task FromError(Exception e) { return FromError(e); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static Task FromError(Exception e) { var tcs = new TaskCompletionSource(); tcs.SetUnwrappedException(e); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static void SetUnwrappedException(this TaskCompletionSource tcs, Exception e) { var aggregateException = e as AggregateException; if (aggregateException != null) { tcs.SetException(aggregateException.InnerExceptions); } else { tcs.SetException(e); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static bool TrySetUnwrappedException(this TaskCompletionSource tcs, Exception e) { var aggregateException = e as AggregateException; if (aggregateException != null) { return tcs.TrySetException(aggregateException.InnerExceptions); } else { return tcs.TrySetException(e); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static Task Canceled() { var tcs = new TaskCompletionSource(); tcs.SetCanceled(); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static Task Canceled() { var tcs = new TaskCompletionSource(); tcs.SetCanceled(); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] private static Task RunTask(Task task, Action successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } else { try { successor(); tcs.SetResult(null); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static Task RunTaskSynchronously(Task task, Action next, object state, bool onlyOnSuccess = true) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { try { if (t.IsFaulted) { if (!onlyOnSuccess) { next(state); } tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { if (!onlyOnSuccess) { next(state); } tcs.SetCanceled(); } else { next(state); tcs.SetResult(null); } } catch (Exception ex) { tcs.SetUnwrappedException(ex); } }, TaskContinuationOptions.ExecuteSynchronously); return tcs.Task; } private static class TaskRunners { [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] internal static Task RunTask(Task task, Action successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } else { try { successor(t.Result); tcs.SetResult(null); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] internal static Task RunTask(Task task, Func successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } else { try { tcs.SetResult(successor()); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] internal static Task RunTask(Task task, Func, TResult> successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (task.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (task.IsCanceled) { tcs.SetCanceled(); } else { try { tcs.SetResult(successor(t)); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } } private static class GenericDelegates { internal static Task ThenWithArgs(Task task, Action successor, T1 arg1) { return RunTask(task, () => successor(arg1)); } internal static Task ThenWithArgs(Task task, Action successor, T1 arg1, T2 arg2) { return RunTask(task, () => successor(arg1, arg2)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1) { return TaskRunners.RunTask(task, () => successor(arg1)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1, T2 arg2) { return TaskRunners.RunTask(task, () => successor(arg1, arg2)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1) { return TaskRunners.RunTask(task, t => successor(t.Result, arg1)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1) { return TaskRunners.RunTask(task, () => successor(arg1)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1, T2 arg2) { return TaskRunners.RunTask(task, () => successor(arg1, arg2)); } internal static Task> ThenWithArgs(Task task, Func> successor, T1 arg1) { return TaskRunners>.RunTask(task, t => successor(t.Result, arg1)); } internal static Task> ThenWithArgs(Task task, Func, T1, Task> successor, T1 arg1) { return TaskRunners>.RunTask(task, t => successor(t, arg1)); } } private static class TaskCache { public static Task Empty = MakeTask(default(T)); } } }smuxi-1.1/lib/JabbR/JabbR.Client/StreamExtensions.cs0000644000175000017500000000446012204443201023077 0ustar00meebeymeebey00000000000000// // Copyright 2011-2013 Microsoft Open Technologies, Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading.Tasks; namespace JabbR.Client { internal static class StreamExtensions { [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task ReadAsync(this Stream stream, byte[] buffer) { #if NETFX_CORE return stream.ReadAsync(buffer, 0, buffer.Length); #else try { return Task.Factory.FromAsync((cb, state) => stream.BeginRead(buffer, 0, buffer.Length, cb, state), ar => stream.EndRead(ar), null); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } #endif } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared class.")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task WriteAsync(this Stream stream, byte[] buffer) { #if NETFX_CORE return stream.WriteAsync(buffer, 0, buffer.Length); #else try { return Task.Factory.FromAsync((cb, state) => stream.BeginWrite(buffer, 0, buffer.Length, cb, state), ar => stream.EndWrite(ar), null); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } #endif } } } smuxi-1.1/lib/JabbR/JabbR.Client/IJabbRClient.cs0000644000175000017500000000462712204443201022021 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Net; using System.Threading.Tasks; using JabbR.Client.Models; using JabbR.Models; using Microsoft.AspNet.SignalR.Client; namespace JabbR.Client { public interface IJabbRClient { event Action MessageReceived; event Action> LoggedOut; event Action UserJoined; event Action UserLeft; event Action Kicked; event Action PrivateMessage; event Action UserTyping; event Action GravatarChanged; event Action MeMessageReceived; event Action UsernameChanged; event Action NoteChanged; event Action FlagChanged; event Action TopicChanged; event Action OwnerAdded; event Action OwnerRemoved; event Action AddMessageContent; event Action JoinedRoom; event Action RoomCountChanged; event Action UserActivityChanged; event Action> UsersInactive; event Action Disconnected; event Action StateChanged; string SourceUrl { get; } bool AutoReconnect { get; set; } ICredentials Credentials { get; set; } Task Connect(string name, string password); Task GetUserInfo(); Task LogOut(); Task Send(string message, string roomName); Task Send(ClientMessage message); Task CreateRoom(string roomName); Task JoinRoom(string roomName); Task LeaveRoom(string roomName); Task SetFlag(string countryCode); Task SetNote(string noteText); Task SendPrivateMessage(string userName, string message); Task Kick(string userName, string roomName); Task CheckStatus(); Task SetTyping(string roomName); Task PostNotification(ClientNotification notification); Task PostNotification(ClientNotification notification, bool executeContentProviders); Task> GetPreviousMessages(string fromId); Task GetRoomInfo(string roomName); Task> GetRooms(); void Disconnect(); } } smuxi-1.1/lib/JabbR/JabbR.Client/Models/0000775000175000017500000000000014011526500020460 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/JabbR/JabbR.Client/Models/User.cs0000644000175000017500000000116712204443201021726 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace JabbR.Client.Models { public class User { public string Name { get; set; } public string Hash { get; set; } public bool Active { get; set; } public UserStatus Status { get; set; } public string Note { get; set; } public string AfkNote { get; set; } public bool IsAfk { get; set; } public string Flag { get; set; } public string Country { get; set; } public DateTime LastActivity { get; set; } public bool IsAdmin { get; set; } } } smuxi-1.1/lib/JabbR/JabbR.Client/Models/LogOnInfo.cs0000644000175000017500000000044512204443201022640 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace JabbR.Client.Models { public class LogOnInfo { public string UserId { get; set; } public IEnumerable Rooms { get; set; } public LogOnInfo() { Rooms = new List(); } } } smuxi-1.1/lib/JabbR/JabbR.Client/Models/UserStatus.cs0000644000175000017500000000017612204443201023131 0ustar00meebeymeebey00000000000000namespace JabbR.Client.Models { public enum UserStatus { Active, Inactive, Offline } } smuxi-1.1/lib/JabbR/JabbR.Client/Models/Message.cs0000644000175000017500000000046212204443201022371 0ustar00meebeymeebey00000000000000using System; namespace JabbR.Client.Models { public class Message { public bool HtmlEncoded { get; set; } public string Id { get; set; } public string Content { get; set; } public DateTimeOffset When { get; set; } public User User { get; set; } } } smuxi-1.1/lib/JabbR/JabbR.Client/Models/Room.cs0000644000175000017500000000102112204443201021711 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace JabbR.Client.Models { public class Room { public string Name { get; set; } public int Count { get; set; } public bool Private { get; set; } public string Topic { get; set; } public bool Closed { get; set; } public string Welcome { get; set; } public IEnumerable Users { get; set; } public IEnumerable Owners { get; set; } public IEnumerable RecentMessages { get; set; } } } smuxi-1.1/lib/JabbR/JabbR.Client/ClientEvents.cs0000644000175000017500000000301112204443201022156 0ustar00meebeymeebey00000000000000namespace JabbR.Client { public static class ClientEvents { public static readonly string AddMessage = "addMessage"; public static readonly string AddMessageContent = "addMessageContent"; public static readonly string AddUser = "addUser"; public static readonly string Leave = "leave"; public static readonly string LogOn = "logOn"; public static readonly string LogOut = "logOut"; public static readonly string Kick = "kick"; public static readonly string UpdateRoomCount = "updateRoomCount"; public static readonly string UpdateActivity = "updateActivity"; public static readonly string MarkInactive = "markInactive"; public static readonly string SendPrivateMessage = "sendPrivateMessage"; public static readonly string SetTyping = "setTyping"; public static readonly string JoinRoom = "joinRoom"; public static readonly string RoomCreated = "roomCreated"; public static readonly string GravatarChanged = "changeGravatar"; public static readonly string MeMessageReceived = "sendMeMessage"; public static readonly string UsernameChanged = "changeUserName"; public static readonly string NoteChanged = "changeNote"; public static readonly string FlagChanged = "changeFlag"; public static readonly string TopicChanged = "changeTopic"; public static readonly string OwnerAdded = "addOwner"; public static readonly string OwnerRemoved = "removeOwner"; } } smuxi-1.1/lib/Makefile.am0000664000175000017500000004152214011525324016123 0ustar00meebeymeebey00000000000000SUBDIRS = $(MESSAGINGMENU_SHARP_SUBDIR) if WITH_MESSAGINGMENU_SHARP_INCLUDED MESSAGINGMENU_SHARP_SUBDIR = messagingmenu-sharp else # HACK: override DIST_SUBDIRS so distcheck/distclean works on systems without # libmessaging-menu-dev installed DIST_SUBDIRS = $(SUBDIRS) endif OUTPUT_DIR = $(top_builddir)/bin/$(PROFILE) OBJECT_DIR = $(OUTPUT_DIR)/obj SOURCE_PATTERNS = *.cs */*.cs */*/*.cs */*/*/*.cs */*/*/*/*.cs */*/*/*/*/*.cs XBUILD_FLAGS += /p:Configuration=Debug /p:SignAssembly=false /p:WarningLevel=0 /p:Warn=0 /p:OutputPath=$(abspath $(OUTPUT_DIR)) /p:BaseIntermediateOutputPath=$(abspath $(OBJECT_DIR))/ /p:IntermediateOutputPath=$(abspath $(OBJECT_DIR))/ /p:DocumentationFile= SERVICESTACK_TEXT_SUBDIR = ServiceStack.Text SERVICESTACK_TEXT_SRCDIR = $(srcdir)/$(SERVICESTACK_TEXT_SUBDIR)/src/ServiceStack.Text SERVICESTACK_TEXT_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SERVICESTACK_TEXT_SRCDIR)/$(pattern))) SERVICESTACK_TEXT_EXTRA_FILES = $(SERVICESTACK_TEXT_BUILD_FILE) SERVICESTACK_TEXT_ASSEMBLY_NAME = ServiceStack.Text.dll SERVICESTACK_TEXT_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SERVICESTACK_TEXT_ASSEMBLY_NAME) SERVICESTACK_TEXT_BUILD_FILE = $(SERVICESTACK_TEXT_SRCDIR)/ServiceStack.Text.csproj SERVICESTACK_TEXT_XBUILD_FLAGS = $(XBUILD_FLAGS) SERVICESTACK_SUBDIR = ServiceStack SERVICESTACK_SRCDIR = $(srcdir)/$(SERVICESTACK_SUBDIR) SERVICESTACK_INTERFACES_SRCDIR = $(srcdir)/$(SERVICESTACK_SUBDIR)/src/ServiceStack.Interfaces SERVICESTACK_INTERFACES_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SERVICESTACK_INTERFACES_SRCDIR)/$(pattern))) SERVICESTACK_INTERFACES_EXTRA_FILES = $(SERVICESTACK_INTERFACES_BUILD_FILE) SERVICESTACK_INTERFACES_ASSEMBLY_NAME = ServiceStack.Interfaces.dll SERVICESTACK_INTERFACES_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SERVICESTACK_INTERFACES_ASSEMBLY_NAME) SERVICESTACK_INTERFACES_BUILD_FILE = $(SERVICESTACK_INTERFACES_SRCDIR)/ServiceStack.Interfaces.csproj SERVICESTACK_INTERFACES_XBUILD_FLAGS = $(XBUILD_FLAGS) SERVICESTACK_COMMON_SRCDIR = $(srcdir)/$(SERVICESTACK_SUBDIR)/src/ServiceStack.Common SERVICESTACK_COMMON_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SERVICESTACK_COMMON_SRCDIR)/$(pattern))) SERVICESTACK_COMMON_EXTRA_FILES = $(SERVICESTACK_COMMON_BUILD_FILE) SERVICESTACK_COMMON_ASSEMBLY_NAME = ServiceStack.Common.dll SERVICESTACK_COMMON_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SERVICESTACK_COMMON_ASSEMBLY_NAME) SERVICESTACK_COMMON_BUILD_FILE = $(SERVICESTACK_COMMON_SRCDIR)/ServiceStack.Common.csproj SERVICESTACK_COMMON_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="MONOTOUCH" EXTRA_SERVICESTACK_LIBS = \ $(SERVICESTACK_TEXT_ASSEMBLY_TARGET) $(SERVICESTACK_TEXT_ASSEMBLY_TARGET).mdb \ $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET) $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET).mdb \ $(SERVICESTACK_COMMON_ASSEMBLY_TARGET) $(SERVICESTACK_COMMON_ASSEMBLY_TARGET).mdb JSON_SUBDIR = Newtonsoft.Json JSON_SRCDIR = $(srcdir)/$(JSON_SUBDIR)/Src/Newtonsoft.Json JSON_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(JSON_SRCDIR)/$(pattern))) JSON_EXTRA_FILES = \ $(JSON_BUILD_FILE) \ $(JSON_SRCDIR)/Dynamic.snk JSON_CLEAN_FILES = $(OBJECT_DIR)/Newtonsoft.Json.Dynamic.snk JSON_ASSEMBLY_NAME = Newtonsoft.Json.dll JSON_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(JSON_ASSEMBLY_NAME) JSON_BUILD_FILE = $(JSON_SRCDIR)/Newtonsoft.Json.csproj JSON_XBUILD_FLAGS = $(XBUILD_FLAGS) TWITTERIZER_SUBDIR = Twitterizer TWITTERIZER_SRCDIR = $(srcdir)/$(TWITTERIZER_SUBDIR)/Twitterizer2 TWITTERIZER_SOURCE_FILES = $(foreach pattern, ../*.cs $(SOURCE_PATTERNS), $(wildcard $(TWITTERIZER_SRCDIR)/$(pattern))) TWITTERIZER_EXTRA_FILES = \ $(TWITTERIZER_BUILD_FILE) \ $(TWITTERIZER_SRCDIR)/Twitterizer2.snk \ $(TWITTERIZER_SRCDIR)/../CommonAssemblyInfo.cs \ $(TWITTERIZER_SRCDIR)/../GettingStarted.txt \ $(TWITTERIZER_SRCDIR)/../Json.NET.license.txt \ $(TWITTERIZER_SRCDIR)/../Twitterizer2.license.txt TWITTERIZER_CLEAN_FILES = \ $(OUTPUT_DIR)/.license.txt \ $(OUTPUT_DIR)/Twitterizer2.license.txt \ $(OUTPUT_DIR)/Json.NET.license.txt \ $(OUTPUT_DIR)/GettingStarted.txt TWITTERIZER_ASSEMBLY_NAME = Twitterizer2.dll TWITTERIZER_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(TWITTERIZER_ASSEMBLY_NAME) TWITTERIZER_BUILD_FILE = $(TWITTERIZER_SRCDIR)/Twitterizer2.csproj TWITTERIZER_XBUILD_FLAGS = $(XBUILD_FLAGS) /p:PostBuildEvent= TWITTERIZER_STREAMING_SRCDIR = $(srcdir)/$(TWITTERIZER_SUBDIR)/Twitterizer2.Streaming TWITTERIZER_STREAMING_SOURCE_FILES = $(foreach pattern, ../*.cs $(SOURCE_PATTERNS), $(wildcard $(TWITTERIZER_STREAMING_SRCDIR)/$(pattern))) TWITTERIZER_STREAMING_EXTRA_FILES = $(TWITTERIZER_STREAMING_BUILD_FILE) TWITTERIZER_STREAMING_ASSEMBLY_NAME = Twitterizer2.Streaming.dll TWITTERIZER_STREAMING_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(TWITTERIZER_STREAMING_ASSEMBLY_NAME) TWITTERIZER_STREAMING_BUILD_FILE = $(TWITTERIZER_STREAMING_SRCDIR)/Twitterizer2.Streaming.csproj TWITTERIZER_STREAMING_XBUILD_FLAGS = $(XBUILD_FLAGS) JABBER_NET_SUBDIR = agsxmpp/agsxmpp JABBER_NET_SRCDIR = $(srcdir)/$(JABBER_NET_SUBDIR) JABBER_NET_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(JABBER_NET_SRCDIR)/$(pattern))) JABBER_NET_EXTRA_FILES = $(JABBER_NET_SRCDIR)/agsxmpp.csproj JABBER_NET_CLEAN_FILES = $(wildcard $(OBJECT_DIR)/*.bmp) JABBER_NET_ASSEMBLY_NAME = agsxmpp.dll JABBER_NET_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(JABBER_NET_ASSEMBLY_NAME) JABBER_NET_BUILD_FILE = $(JABBER_NET_SRCDIR)/agsxmpp.csproj JABBER_NET_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="TRACE,DEBUG,SSL,STRINGPREP,MONO" STARKSOFTPROXY_SUBDIR = StarkSoftProxy STARKSOFTPROXY_SRCDIR = $(srcdir)/$(STARKSOFTPROXY_SUBDIR) STARKSOFTPROXY_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(STARKSOFTPROXY_SRCDIR)/$(pattern))) STARKSOFTPROXY_EXTRA_FILES = $(STARKSOFTPROXY_SRCDIR)/StarkSoftProxy.csproj STARKSOFTPROXY_CLEAN_FILES = STARKSOFTPROXY_ASSEMBLY_NAME = StarkSoftProxy.dll STARKSOFTPROXY_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(STARKSOFTPROXY_ASSEMBLY_NAME) STARKSOFTPROXY_BUILD_FILE = $(STARKSOFTPROXY_SRCDIR)/StarkSoftProxy.csproj STARKSOFTPROXY_XBUILD_FLAGS = $(XBUILD_FLAGS) SMARTIRC4NET_SUBDIR = SmartIrc4net SMARTIRC4NET_SRCDIR = $(srcdir)/$(SMARTIRC4NET_SUBDIR) SMARTIRC4NET_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SMARTIRC4NET_SRCDIR)/$(pattern))) SMARTIRC4NET_EXTRA_FILES = $(SMARTIRC4NET_SRCDIR)/SmartIrc4net.csproj SMARTIRC4NET_CLEAN_FILES = SMARTIRC4NET_ASSEMBLY_NAME = Meebey.SmartIrc4net.dll SMARTIRC4NET_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SMARTIRC4NET_ASSEMBLY_NAME) SMARTIRC4NET_BUILD_FILE = $(SMARTIRC4NET_SRCDIR)/SmartIrc4net.csproj SMARTIRC4NET_XBUILD_FLAGS = $(XBUILD_FLAGS) DB4O_SUBDIR = db4o-net DB4O_SRCDIR = $(srcdir)/$(DB4O_SUBDIR)/Db4objects.Db4o DB4O_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(DB4O_SRCDIR)/$(pattern))) DB4O_EXTRA_FILES = $(DB4O_BUILD_FILE) DB4O_ASSEMBLY_NAME = Db4objects.Db4o.dll DB4O_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(DB4O_ASSEMBLY_NAME) DB4O_BUILD_FILE = $(DB4O_SRCDIR)/Db4objects.Db4o-2008.csproj DB4O_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="NET_3_5,MONO,EMBEDDED" #DB4O_INSTR_SRCDIR = $(srcdir)/$(DB4O_SUBDIR)/Db4objects.Db4o.Instrumentation #DB4O_INSTR_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(DB4O_INSTR_SRCDIR)/$(pattern))) #DB4O_INSTR_ASSEMBLY_NAME = Db4objects.Db4o.Instrumentation.dll #DB4O_INSTR_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(DB4O_INSTR_ASSEMBLY_NAME) #DB4O_INSTR_BUILD_FILE = $(DB4O_INSTR_SRCDIR)/Db4objects.Db4o.Instrumentation-2008.csproj #DB4O_INSTR_XBUILD_FLAGS = $(DB4O_XBUILD_FLAGS) #DB4O_NQ_SRCDIR = $(srcdir)/$(DB4O_SUBDIR)/Db4objects.Db4o.NativeQueries #DB4O_NQ_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(DB4O_NQ_SRCDIR)/$(pattern))) #DB4O_NQ_ASSEMBLY_NAME = Db4objects.Db4o.NativeQueries.dll #DB4O_NQ_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(DB4O_NQ_ASSEMBLY_NAME) #DB4O_NQ_BUILD_FILE = $(DB4O_NQ_SRCDIR)/Db4objects.Db4o.NativeQueries-2008.csproj #DB4O_NQ_XBUILD_FLAGS = $(DB4O_XBUILD_FLAGS) SIGNALR_CLIENT_SUBDIR = SignalR SIGNALR_CLIENT_SRCDIR = $(srcdir)/$(SIGNALR_CLIENT_SUBDIR)/src/Microsoft.AspNet.SignalR.Client SIGNALR_CLIENT_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SIGNALR_CLIENT_SRCDIR)/$(pattern))) \ $(foreach file, ../Common/CommonAssemblyInfo.cs ../Common/CommonVersionInfo.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/CancellationTokenExtensions.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/DisposableAction.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/Disposer.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/ExceptionsExtensions.cs ../Microsoft.AspNet.SignalR.Core/TaskAsyncHelper.cs, $(SIGNALR_CLIENT_SRCDIR)/$(file)) SIGNALR_CLIENT_EXTRA_FILES = \ $(SIGNALR_CLIENT_BUILD_FILE) \ $(SIGNALR_CLIENT_SRCDIR)/Resources.resx \ $(SIGNALR_CLIENT_SRCDIR)/../Common/Microsoft.AspNet.SignalR.targets #SIGNALR_CLIENT_CLEAN_FILES = $(OBJECT_DIR)/Newtonsoft.Json.Dynamic.snk SIGNALR_CLIENT_ASSEMBLY_NAME = Microsoft.AspNet.SignalR.Client.dll SIGNALR_CLIENT_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SIGNALR_CLIENT_ASSEMBLY_NAME) SIGNALR_CLIENT_BUILD_FILE = $(SIGNALR_CLIENT_SRCDIR)/Microsoft.AspNet.SignalR.Client.csproj SIGNALR_CLIENT_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="MONO" JABBR_CLIENT_SUBDIR = JabbR JABBR_CLIENT_SRCDIR = $(srcdir)/$(JABBR_CLIENT_SUBDIR)/JabbR.Client JABBR_CLIENT_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(JABBR_CLIENT_SRCDIR)/$(pattern))) JABBR_CLIENT_EXTRA_FILES = \ $(JABBR_CLIENT_BUILD_FILE) \ $(JABBR_CLIENT_SRCDIR)/../JabbR/Models/ClientMessage.cs \ $(JABBR_CLIENT_SRCDIR)/../JabbR/Models/ClientNotification.cs #JABBR_CLIENT_CLEAN_FILES = $(OBJECT_DIR)/Newtonsoft.Json.Dynamic.snk JABBR_CLIENT_ASSEMBLY_NAME = JabbR.Client.dll JABBR_CLIENT_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(JABBR_CLIENT_ASSEMBLY_NAME) JABBR_CLIENT_BUILD_FILE = $(JABBR_CLIENT_SRCDIR)/JabbR.Client.csproj JABBR_CLIENT_XBUILD_FLAGS = $(XBUILD_FLAGS) # magic automake variables if ENABLE_ENGINE_TWITTER EXTRA_JSON_LIBS = \ $(JSON_ASSEMBLY_TARGET) $(JSON_ASSEMBLY_TARGET).mdb EXTRA_TWITTER_LIBS = \ $(TWITTERIZER_ASSEMBLY_TARGET) $(TWITTERIZER_ASSEMBLY_TARGET).mdb \ $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET) $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET).mdb endif if ENABLE_ENGINE_XMPP EXTRA_XMPP_LIBS = \ $(JABBER_NET_ASSEMBLY_TARGET) $(JABBER_NET_ASSEMBLY_TARGET).mdb endif if ENABLE_ENGINE_JABBR EXTRA_JSON_LIBS = \ $(JSON_ASSEMBLY_TARGET) $(JSON_ASSEMBLY_TARGET).mdb EXTRA_JABBR_LIBS = \ $(SIGNALR_CLIENT_ASSEMBLY_TARGET) $(SIGNALR_CLIENT_ASSEMBLY_TARGET).mdb \ $(JABBR_CLIENT_ASSEMBLY_TARGET) $(JABBR_CLIENT_ASSEMBLY_TARGET).mdb endif if ENABLE_ENGINE_IRC EXTRA_IRC_LIBS = \ $(SMARTIRC4NET_ASSEMBLY_TARGET) $(SMARTIRC4NET_ASSEMBLY_TARGET).mdb endif EXTRA_PROXY_LIBS = \ $(STARKSOFTPROXY_ASSEMBLY_TARGET) $(STARKSOFTPROXY_ASSEMBLY_TARGET).mdb if BUNDLE_DB4O EXTRA_DB4O_LIBS = \ $(DB4O_ASSEMBLY_TARGET) $(DB4O_ASSEMBLY_TARGET).mdb # $(DB4O_INSTR_ASSEMBLY_TARGET) $(DB4O_INSTR_ASSEMBLY_TARGET).mdb \ # $(DB4O_NQ_ASSEMBLY_TARGET) $(DB4O_NQ_ASSEMBLY_TARGET).mdb endif pkgappdir = $(pkglibdir) pkgapp_DATA = \ $(EXTRA_SERVICESTACK_LIBS) \ $(EXTRA_JSON_LIBS) \ $(EXTRA_TWITTER_LIBS) \ $(EXTRA_XMPP_LIBS) \ $(EXTRA_DB4O_LIBS) \ $(EXTRA_IRC_LIBS) \ $(EXTRA_PROXY_LIBS) \ $(EXTRA_JABBR_LIBS) EXTRA_DIST = \ $(SERVICESTACK_TEXT_SRCDIR) $(SERVICESTACK_TEXT_EXTRA_FILES) \ $(SERVICESTACK_INTERFACES_SRCDIR) $(SERVICESTACK_INTERFACES_EXTRA_FILES) \ $(SERVICESTACK_COMMON_SRCDIR) $(SERVICESTACK_COMMON_EXTRA_FILES) \ $(JSON_SRCDIR) $(JSON_EXTRA_FILES) \ $(TWITTERIZER_SRCDIR) $(TWITTERIZER_EXTRA_FILES) \ $(TWITTERIZER_STREAMING_SRCDIR) $(TWITTERIZER_STREAMING_EXTRA_FILES) \ $(JABBER_NET_SRCDIR) $(JABBER_NET_EXTRA_FILES) \ $(DB4O_SRCDIR) $(DB4O_EXTRA_FILES) \ $(STARKSOFTPROXY_SRCDIR) $(STARKSOFTPROXY_EXTRA_FILES) \ $(SMARTIRC4NET_SRCDIR) $(SMARTIRC4NET_EXTRA_FILES) \ $(SIGNALR_CLIENT_SOURCE_FILES) $(SIGNALR_CLIENT_EXTRA_FILES) \ $(JABBR_CLIENT_SOURCE_FILES) $(JABBR_CLIENT_EXTRA_FILES) # $(SERVICESTACK_TEXT_SOURCE_FILES) $(SERVICESTACK_TEXT_BUILD_FILE) \ # $(SERVICESTACK_INTERFACES_SOURCE_FILES) $(SERVICESTACK_INTERFACES_BUILD_FILE) \ # $(SERVICESTACK_COMMON_SOURCE_FILES) $(SERVICESTACK_COMMON_BUILD_FILE) \ # $(JSON_SOURCE_FILES) $(JSON_BUILD_FILE) $(JSON_SRCDIR)/Dynamic.snk \ # $(TWITTERIZER_SOURCE_FILES) $(TWITTERIZER_EXTRA_FILES) $(TWITTERIZER_BUILD_FILE) \ # $(JABBER_NET_SOURCE_FILES) $(JABBER_NET_EXTRA_FILES) $(JABBER_NET_BUILD_FILE) \ # $(DB4O_SOURCE_FILES) $(DB4O_BUILD_FILE) \ # $(DB4O_INSTR_SOURCE_FILES) $(DB4O_INSTR_BUILD_FILE) \ # $(DB4O_NQ_SOURCE_FILES) $(DB4O_NQ_BUILD_FILE) CLEANFILES = \ $(JSON_CLEAN_FILES) \ $(JABBER_NET_CLEAN_FILES) \ $(TWITTERIZER_CLEAN_FILES) \ $(SIGNALR_CLIENT_CLEAN_FILES) \ $(SMARTIRC4NET_CLEAN_FILES) \ $(STARKSOFTPROXY_CLEAN_FILES) \ $(JABBR_CLIENT_CLEAN_FILES) # end of magic $(SERVICESTACK_TEXT_ASSEMBLY_TARGET) $(SERVICESTACK_TEXT_ASSEMBLY_TARGET).mdb: $(SERVICESTACK_TEXT_BUILD_FILE) $(SERVICESTACK_TEXT_SOURCE_FILES) $(XBUILD) $(SERVICESTACK_TEXT_XBUILD_FLAGS) $(SERVICESTACK_TEXT_BUILD_FILE) $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET) $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET).mdb: $(SERVICESTACK_INTERFACES_BUILD_FILE) $(SERVICESTACK_INTERFACES_SOURCE_FILES) $(XBUILD) $(SERVICESTACK_INTERFACES_XBUILD_FLAGS) $(SERVICESTACK_INTERFACES_BUILD_FILE) $(SERVICESTACK_COMMON_ASSEMBLY_TARGET) $(SERVICESTACK_COMMON_ASSEMBLY_TARGET).mdb: $(SERVICESTACK_TEXT_ASSEMBLY_TARGET) $(SERVICESTACK_COMMON_BUILD_FILE) $(SERVICESTACK_COMMON_SOURCE_FILES) $(XBUILD) $(SERVICESTACK_COMMON_XBUILD_FLAGS) $(SERVICESTACK_COMMON_BUILD_FILE) $(JSON_ASSEMBLY_TARGET) $(JSON_ASSEMBLY_TARGET).mdb: $(JSON_BUILD_FILE) $(JSON_SOURCE_FILES) $(XBUILD) $(JSON_XBUILD_FLAGS) $(JSON_BUILD_FILE) $(TWITTERIZER_ASSEMBLY_TARGET) $(TWITTERIZER_ASSEMBLY_TARGET).mdb: $(TWITTERIZER_BUILD_FILE) $(TWITTERIZER_SOURCE_FILES) $(XBUILD) $(TWITTERIZER_XBUILD_FLAGS) $(TWITTERIZER_BUILD_FILE) $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET) $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET).mdb: $(TWITTERIZER_STREAMING_BUILD_FILE) $(TWITTERIZER_STREAMING_SOURCE_FILES) $(XBUILD) $(TWITTERIZER_STREAMING_XBUILD_FLAGS) $(TWITTERIZER_STREAMING_BUILD_FILE) $(JABBER_NET_ASSEMBLY_TARGET) $(JABBER_NET_ASSEMBLY_TARGET).mdb: $(JABBER_NET_BUILD_FILE) $(JABBER_NET_SOURCE_FILES) $(XBUILD) $(JABBER_NET_XBUILD_FLAGS) $(JABBER_NET_BUILD_FILE) $(SMARTIRC4NET_ASSEMBLY_TARGET) $(SMARTIRC4NET_ASSEMBLY_TARGET).mdb: $(SMARTIRC4NET_BUILD_FILE) $(SMARTIRC4NET_SOURCE_FILES) $(XBUILD) $(SMARTIRC4NET_XBUILD_FLAGS) $(SMARTIRC4NET_BUILD_FILE) $(STARKSOFTPROXY_ASSEMBLY_TARGET) $(STARKSOFTPROXY_ASSEMBLY_TARGET).mdb: $(STARKSOFTPROXY_BUILD_FILE) $(STARKSOFTPROXY_SOURCE_FILES) $(XBUILD) $(STARKSOFTPROXY_XBUILD_FLAGS) $(STARKSOFTPROXY_BUILD_FILE) $(DB4O_ASSEMBLY_TARGET) $(DB4O_ASSEMBLY_TARGET).mdb: $(DB4O_BUILD_FILE) $(DB4O_SOURCE_FILES) $(XBUILD) $(DB4O_XBUILD_FLAGS) $(DB4O_BUILD_FILE) #$(DB4O_INSTR_ASSEMBLY_TARGET) $(DB4O_INSTR_ASSEMBLY_TARGET).mdb: $(DB4O_INSTR_BUILD_FILE) $(DB4O_INSTR_SOURCE_FILES) # $(XBUILD) $(DB4O_INSTR_XBUILD_FLAGS) $(DB4O_INSTR_BUILD_FILE) #$(DB4O_NQ_ASSEMBLY_TARGET) $(DB4O_NQ_ASSEMBLY_TARGET).mdb: $(DB4O_NQ_BUILD_FILE) $(DB4O_NQ_SOURCE_FILES) # $(XBUILD) $(DB4O_NQ_XBUILD_FLAGS) $(DB4O_NQ_BUILD_FILE) $(SIGNALR_CLIENT_ASSEMBLY_TARGET) $(SIGNALR_CLIENT_ASSEMBLY_TARGET).mdb: $(SIGNALR_CLIENT_BUILD_FILE) $(SIGNALR_CLIENT_SOURCE_FILES) $(XBUILD) $(SIGNALR_CLIENT_XBUILD_FLAGS) $(SIGNALR_CLIENT_BUILD_FILE) $(JABBR_CLIENT_ASSEMBLY_TARGET) $(JABBR_CLIENT_ASSEMBLY_TARGET).mdb: $(JABBR_CLIENT_BUILD_FILE) $(JABBR_CLIENT_SOURCE_FILES) $(XBUILD) $(JABBR_CLIENT_XBUILD_FLAGS) $(JABBR_CLIENT_BUILD_FILE) clean-local: $(XBUILD) $(SERVICESTACK_TEXT_XBUILD_FLAGS) /t:Clean $(SERVICESTACK_TEXT_BUILD_FILE) $(XBUILD) $(SERVICESTACK_INTERFACES_XBUILD_FLAGS) /t:Clean $(SERVICESTACK_INTERFACES_BUILD_FILE) $(XBUILD) $(SERVICESTACK_COMMON_XBUILD_FLAGS) /t:Clean $(SERVICESTACK_COMMON_BUILD_FILE) if ENABLE_ENGINE_IRC $(XBUILD) $(SMARTIRC4NET_XBUILD_FLAGS) /t:Clean $(SMARTIRC4NET_BUILD_FILE) endif $(XBUILD) $(STARKSOFTPROXY_XBUILD_FLAGS) /t:Clean $(STARKSOFTPROXY_BUILD_FILE) if ENABLE_ENGINE_TWITTER $(XBUILD) $(JSON_XBUILD_FLAGS) /t:Clean $(JSON_BUILD_FILE) $(XBUILD) $(TWITTERIZER_XBUILD_FLAGS) /t:Clean $(TWITTERIZER_BUILD_FILE) $(XBUILD) $(TWITTERIZER_STREAMING_XBUILD_FLAGS) /t:Clean $(TWITTERIZER_STREAMING_BUILD_FILE) endif if ENABLE_ENGINE_XMPP $(XBUILD) $(JABBER_NET_XBUILD_FLAGS) /t:Clean $(JABBER_NET_BUILD_FILE) endif if ENABLE_ENGINE_JABBR $(XBUILD) $(JSON_XBUILD_FLAGS) /t:Clean $(JSON_BUILD_FILE) $(XBUILD) $(SIGNALR_CLIENT_XBUILD_FLAGS) /t:Clean $(SIGNALR_CLIENT_BUILD_FILE) $(XBUILD) $(JABBR_CLIENT_XBUILD_FLAGS) /t:Clean $(JABBR_CLIENT_BUILD_FILE) endif if BUNDLE_DB4O $(XBUILD) $(DB4O_XBUILD_FLAGS) /t:Clean $(DB4O_BUILD_FILE) # $(XBUILD) $(DB4O_INSTR_XBUILD_FLAGS) /t:Clean $(DB4O_INSTR_BUILD_FILE) # $(XBUILD) $(DB4O_NQ_XBUILD_FLAGS) /t:Clean $(DB4O_NQ_BUILD_FILE) endif # filter all .git files/directories from tarball dist-hook: for GIT_DIR in $$(find $(distdir) -name ".git"); do \ echo "filtering $$GIT_DIR from tarball..."; \ chmod -R u+w $(distdir)/$$GIR_DIR; \ rm -rf $$GIT_DIR; \ done smuxi-1.1/lib/Makefile.in0000664000175000017500000012213714011526471016142 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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 = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-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 \ tags-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 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)$(pkgappdir)" DATA = $(pkgapp_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in 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@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ /p:Configuration=Debug \ /p:SignAssembly=false /p:WarningLevel=0 /p:Warn=0 \ /p:OutputPath=$(abspath $(OUTPUT_DIR)) \ /p:BaseIntermediateOutputPath=$(abspath $(OBJECT_DIR))/ \ /p:IntermediateOutputPath=$(abspath $(OBJECT_DIR))/ \ /p:DocumentationFile= XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ SUBDIRS = $(MESSAGINGMENU_SHARP_SUBDIR) @WITH_MESSAGINGMENU_SHARP_INCLUDED_TRUE@MESSAGINGMENU_SHARP_SUBDIR = messagingmenu-sharp # HACK: override DIST_SUBDIRS so distcheck/distclean works on systems without # libmessaging-menu-dev installed @WITH_MESSAGINGMENU_SHARP_INCLUDED_FALSE@DIST_SUBDIRS = $(SUBDIRS) OUTPUT_DIR = $(top_builddir)/bin/$(PROFILE) OBJECT_DIR = $(OUTPUT_DIR)/obj SOURCE_PATTERNS = *.cs */*.cs */*/*.cs */*/*/*.cs */*/*/*/*.cs */*/*/*/*/*.cs SERVICESTACK_TEXT_SUBDIR = ServiceStack.Text SERVICESTACK_TEXT_SRCDIR = $(srcdir)/$(SERVICESTACK_TEXT_SUBDIR)/src/ServiceStack.Text SERVICESTACK_TEXT_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SERVICESTACK_TEXT_SRCDIR)/$(pattern))) SERVICESTACK_TEXT_EXTRA_FILES = $(SERVICESTACK_TEXT_BUILD_FILE) SERVICESTACK_TEXT_ASSEMBLY_NAME = ServiceStack.Text.dll SERVICESTACK_TEXT_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SERVICESTACK_TEXT_ASSEMBLY_NAME) SERVICESTACK_TEXT_BUILD_FILE = $(SERVICESTACK_TEXT_SRCDIR)/ServiceStack.Text.csproj SERVICESTACK_TEXT_XBUILD_FLAGS = $(XBUILD_FLAGS) SERVICESTACK_SUBDIR = ServiceStack SERVICESTACK_SRCDIR = $(srcdir)/$(SERVICESTACK_SUBDIR) SERVICESTACK_INTERFACES_SRCDIR = $(srcdir)/$(SERVICESTACK_SUBDIR)/src/ServiceStack.Interfaces SERVICESTACK_INTERFACES_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SERVICESTACK_INTERFACES_SRCDIR)/$(pattern))) SERVICESTACK_INTERFACES_EXTRA_FILES = $(SERVICESTACK_INTERFACES_BUILD_FILE) SERVICESTACK_INTERFACES_ASSEMBLY_NAME = ServiceStack.Interfaces.dll SERVICESTACK_INTERFACES_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SERVICESTACK_INTERFACES_ASSEMBLY_NAME) SERVICESTACK_INTERFACES_BUILD_FILE = $(SERVICESTACK_INTERFACES_SRCDIR)/ServiceStack.Interfaces.csproj SERVICESTACK_INTERFACES_XBUILD_FLAGS = $(XBUILD_FLAGS) SERVICESTACK_COMMON_SRCDIR = $(srcdir)/$(SERVICESTACK_SUBDIR)/src/ServiceStack.Common SERVICESTACK_COMMON_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SERVICESTACK_COMMON_SRCDIR)/$(pattern))) SERVICESTACK_COMMON_EXTRA_FILES = $(SERVICESTACK_COMMON_BUILD_FILE) SERVICESTACK_COMMON_ASSEMBLY_NAME = ServiceStack.Common.dll SERVICESTACK_COMMON_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SERVICESTACK_COMMON_ASSEMBLY_NAME) SERVICESTACK_COMMON_BUILD_FILE = $(SERVICESTACK_COMMON_SRCDIR)/ServiceStack.Common.csproj SERVICESTACK_COMMON_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="MONOTOUCH" EXTRA_SERVICESTACK_LIBS = \ $(SERVICESTACK_TEXT_ASSEMBLY_TARGET) $(SERVICESTACK_TEXT_ASSEMBLY_TARGET).mdb \ $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET) $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET).mdb \ $(SERVICESTACK_COMMON_ASSEMBLY_TARGET) $(SERVICESTACK_COMMON_ASSEMBLY_TARGET).mdb JSON_SUBDIR = Newtonsoft.Json JSON_SRCDIR = $(srcdir)/$(JSON_SUBDIR)/Src/Newtonsoft.Json JSON_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(JSON_SRCDIR)/$(pattern))) JSON_EXTRA_FILES = \ $(JSON_BUILD_FILE) \ $(JSON_SRCDIR)/Dynamic.snk JSON_CLEAN_FILES = $(OBJECT_DIR)/Newtonsoft.Json.Dynamic.snk JSON_ASSEMBLY_NAME = Newtonsoft.Json.dll JSON_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(JSON_ASSEMBLY_NAME) JSON_BUILD_FILE = $(JSON_SRCDIR)/Newtonsoft.Json.csproj JSON_XBUILD_FLAGS = $(XBUILD_FLAGS) TWITTERIZER_SUBDIR = Twitterizer TWITTERIZER_SRCDIR = $(srcdir)/$(TWITTERIZER_SUBDIR)/Twitterizer2 TWITTERIZER_SOURCE_FILES = $(foreach pattern, ../*.cs $(SOURCE_PATTERNS), $(wildcard $(TWITTERIZER_SRCDIR)/$(pattern))) TWITTERIZER_EXTRA_FILES = \ $(TWITTERIZER_BUILD_FILE) \ $(TWITTERIZER_SRCDIR)/Twitterizer2.snk \ $(TWITTERIZER_SRCDIR)/../CommonAssemblyInfo.cs \ $(TWITTERIZER_SRCDIR)/../GettingStarted.txt \ $(TWITTERIZER_SRCDIR)/../Json.NET.license.txt \ $(TWITTERIZER_SRCDIR)/../Twitterizer2.license.txt TWITTERIZER_CLEAN_FILES = \ $(OUTPUT_DIR)/.license.txt \ $(OUTPUT_DIR)/Twitterizer2.license.txt \ $(OUTPUT_DIR)/Json.NET.license.txt \ $(OUTPUT_DIR)/GettingStarted.txt TWITTERIZER_ASSEMBLY_NAME = Twitterizer2.dll TWITTERIZER_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(TWITTERIZER_ASSEMBLY_NAME) TWITTERIZER_BUILD_FILE = $(TWITTERIZER_SRCDIR)/Twitterizer2.csproj TWITTERIZER_XBUILD_FLAGS = $(XBUILD_FLAGS) /p:PostBuildEvent= TWITTERIZER_STREAMING_SRCDIR = $(srcdir)/$(TWITTERIZER_SUBDIR)/Twitterizer2.Streaming TWITTERIZER_STREAMING_SOURCE_FILES = $(foreach pattern, ../*.cs $(SOURCE_PATTERNS), $(wildcard $(TWITTERIZER_STREAMING_SRCDIR)/$(pattern))) TWITTERIZER_STREAMING_EXTRA_FILES = $(TWITTERIZER_STREAMING_BUILD_FILE) TWITTERIZER_STREAMING_ASSEMBLY_NAME = Twitterizer2.Streaming.dll TWITTERIZER_STREAMING_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(TWITTERIZER_STREAMING_ASSEMBLY_NAME) TWITTERIZER_STREAMING_BUILD_FILE = $(TWITTERIZER_STREAMING_SRCDIR)/Twitterizer2.Streaming.csproj TWITTERIZER_STREAMING_XBUILD_FLAGS = $(XBUILD_FLAGS) JABBER_NET_SUBDIR = agsxmpp/agsxmpp JABBER_NET_SRCDIR = $(srcdir)/$(JABBER_NET_SUBDIR) JABBER_NET_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(JABBER_NET_SRCDIR)/$(pattern))) JABBER_NET_EXTRA_FILES = $(JABBER_NET_SRCDIR)/agsxmpp.csproj JABBER_NET_CLEAN_FILES = $(wildcard $(OBJECT_DIR)/*.bmp) JABBER_NET_ASSEMBLY_NAME = agsxmpp.dll JABBER_NET_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(JABBER_NET_ASSEMBLY_NAME) JABBER_NET_BUILD_FILE = $(JABBER_NET_SRCDIR)/agsxmpp.csproj JABBER_NET_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="TRACE,DEBUG,SSL,STRINGPREP,MONO" STARKSOFTPROXY_SUBDIR = StarkSoftProxy STARKSOFTPROXY_SRCDIR = $(srcdir)/$(STARKSOFTPROXY_SUBDIR) STARKSOFTPROXY_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(STARKSOFTPROXY_SRCDIR)/$(pattern))) STARKSOFTPROXY_EXTRA_FILES = $(STARKSOFTPROXY_SRCDIR)/StarkSoftProxy.csproj STARKSOFTPROXY_CLEAN_FILES = STARKSOFTPROXY_ASSEMBLY_NAME = StarkSoftProxy.dll STARKSOFTPROXY_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(STARKSOFTPROXY_ASSEMBLY_NAME) STARKSOFTPROXY_BUILD_FILE = $(STARKSOFTPROXY_SRCDIR)/StarkSoftProxy.csproj STARKSOFTPROXY_XBUILD_FLAGS = $(XBUILD_FLAGS) SMARTIRC4NET_SUBDIR = SmartIrc4net SMARTIRC4NET_SRCDIR = $(srcdir)/$(SMARTIRC4NET_SUBDIR) SMARTIRC4NET_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SMARTIRC4NET_SRCDIR)/$(pattern))) SMARTIRC4NET_EXTRA_FILES = $(SMARTIRC4NET_SRCDIR)/SmartIrc4net.csproj SMARTIRC4NET_CLEAN_FILES = SMARTIRC4NET_ASSEMBLY_NAME = Meebey.SmartIrc4net.dll SMARTIRC4NET_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SMARTIRC4NET_ASSEMBLY_NAME) SMARTIRC4NET_BUILD_FILE = $(SMARTIRC4NET_SRCDIR)/SmartIrc4net.csproj SMARTIRC4NET_XBUILD_FLAGS = $(XBUILD_FLAGS) DB4O_SUBDIR = db4o-net DB4O_SRCDIR = $(srcdir)/$(DB4O_SUBDIR)/Db4objects.Db4o DB4O_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(DB4O_SRCDIR)/$(pattern))) DB4O_EXTRA_FILES = $(DB4O_BUILD_FILE) DB4O_ASSEMBLY_NAME = Db4objects.Db4o.dll DB4O_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(DB4O_ASSEMBLY_NAME) DB4O_BUILD_FILE = $(DB4O_SRCDIR)/Db4objects.Db4o-2008.csproj DB4O_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="NET_3_5,MONO,EMBEDDED" #DB4O_INSTR_SRCDIR = $(srcdir)/$(DB4O_SUBDIR)/Db4objects.Db4o.Instrumentation #DB4O_INSTR_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(DB4O_INSTR_SRCDIR)/$(pattern))) #DB4O_INSTR_ASSEMBLY_NAME = Db4objects.Db4o.Instrumentation.dll #DB4O_INSTR_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(DB4O_INSTR_ASSEMBLY_NAME) #DB4O_INSTR_BUILD_FILE = $(DB4O_INSTR_SRCDIR)/Db4objects.Db4o.Instrumentation-2008.csproj #DB4O_INSTR_XBUILD_FLAGS = $(DB4O_XBUILD_FLAGS) #DB4O_NQ_SRCDIR = $(srcdir)/$(DB4O_SUBDIR)/Db4objects.Db4o.NativeQueries #DB4O_NQ_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(DB4O_NQ_SRCDIR)/$(pattern))) #DB4O_NQ_ASSEMBLY_NAME = Db4objects.Db4o.NativeQueries.dll #DB4O_NQ_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(DB4O_NQ_ASSEMBLY_NAME) #DB4O_NQ_BUILD_FILE = $(DB4O_NQ_SRCDIR)/Db4objects.Db4o.NativeQueries-2008.csproj #DB4O_NQ_XBUILD_FLAGS = $(DB4O_XBUILD_FLAGS) SIGNALR_CLIENT_SUBDIR = SignalR SIGNALR_CLIENT_SRCDIR = $(srcdir)/$(SIGNALR_CLIENT_SUBDIR)/src/Microsoft.AspNet.SignalR.Client SIGNALR_CLIENT_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(SIGNALR_CLIENT_SRCDIR)/$(pattern))) \ $(foreach file, ../Common/CommonAssemblyInfo.cs ../Common/CommonVersionInfo.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/CancellationTokenExtensions.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/DisposableAction.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/Disposer.cs ../Microsoft.AspNet.SignalR.Core/Infrastructure/ExceptionsExtensions.cs ../Microsoft.AspNet.SignalR.Core/TaskAsyncHelper.cs, $(SIGNALR_CLIENT_SRCDIR)/$(file)) SIGNALR_CLIENT_EXTRA_FILES = \ $(SIGNALR_CLIENT_BUILD_FILE) \ $(SIGNALR_CLIENT_SRCDIR)/Resources.resx \ $(SIGNALR_CLIENT_SRCDIR)/../Common/Microsoft.AspNet.SignalR.targets #SIGNALR_CLIENT_CLEAN_FILES = $(OBJECT_DIR)/Newtonsoft.Json.Dynamic.snk SIGNALR_CLIENT_ASSEMBLY_NAME = Microsoft.AspNet.SignalR.Client.dll SIGNALR_CLIENT_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(SIGNALR_CLIENT_ASSEMBLY_NAME) SIGNALR_CLIENT_BUILD_FILE = $(SIGNALR_CLIENT_SRCDIR)/Microsoft.AspNet.SignalR.Client.csproj SIGNALR_CLIENT_XBUILD_FLAGS = $(XBUILD_FLAGS) /property:DefineConstants="MONO" JABBR_CLIENT_SUBDIR = JabbR JABBR_CLIENT_SRCDIR = $(srcdir)/$(JABBR_CLIENT_SUBDIR)/JabbR.Client JABBR_CLIENT_SOURCE_FILES = $(foreach pattern, $(SOURCE_PATTERNS), $(wildcard $(JABBR_CLIENT_SRCDIR)/$(pattern))) JABBR_CLIENT_EXTRA_FILES = \ $(JABBR_CLIENT_BUILD_FILE) \ $(JABBR_CLIENT_SRCDIR)/../JabbR/Models/ClientMessage.cs \ $(JABBR_CLIENT_SRCDIR)/../JabbR/Models/ClientNotification.cs #JABBR_CLIENT_CLEAN_FILES = $(OBJECT_DIR)/Newtonsoft.Json.Dynamic.snk JABBR_CLIENT_ASSEMBLY_NAME = JabbR.Client.dll JABBR_CLIENT_ASSEMBLY_TARGET = $(OUTPUT_DIR)/$(JABBR_CLIENT_ASSEMBLY_NAME) JABBR_CLIENT_BUILD_FILE = $(JABBR_CLIENT_SRCDIR)/JabbR.Client.csproj JABBR_CLIENT_XBUILD_FLAGS = $(XBUILD_FLAGS) @ENABLE_ENGINE_JABBR_TRUE@EXTRA_JSON_LIBS = \ @ENABLE_ENGINE_JABBR_TRUE@ $(JSON_ASSEMBLY_TARGET) $(JSON_ASSEMBLY_TARGET).mdb # magic automake variables @ENABLE_ENGINE_TWITTER_TRUE@EXTRA_JSON_LIBS = \ @ENABLE_ENGINE_TWITTER_TRUE@ $(JSON_ASSEMBLY_TARGET) $(JSON_ASSEMBLY_TARGET).mdb @ENABLE_ENGINE_TWITTER_TRUE@EXTRA_TWITTER_LIBS = \ @ENABLE_ENGINE_TWITTER_TRUE@ $(TWITTERIZER_ASSEMBLY_TARGET) $(TWITTERIZER_ASSEMBLY_TARGET).mdb \ @ENABLE_ENGINE_TWITTER_TRUE@ $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET) $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET).mdb @ENABLE_ENGINE_XMPP_TRUE@EXTRA_XMPP_LIBS = \ @ENABLE_ENGINE_XMPP_TRUE@ $(JABBER_NET_ASSEMBLY_TARGET) $(JABBER_NET_ASSEMBLY_TARGET).mdb @ENABLE_ENGINE_JABBR_TRUE@EXTRA_JABBR_LIBS = \ @ENABLE_ENGINE_JABBR_TRUE@ $(SIGNALR_CLIENT_ASSEMBLY_TARGET) $(SIGNALR_CLIENT_ASSEMBLY_TARGET).mdb \ @ENABLE_ENGINE_JABBR_TRUE@ $(JABBR_CLIENT_ASSEMBLY_TARGET) $(JABBR_CLIENT_ASSEMBLY_TARGET).mdb @ENABLE_ENGINE_IRC_TRUE@EXTRA_IRC_LIBS = \ @ENABLE_ENGINE_IRC_TRUE@ $(SMARTIRC4NET_ASSEMBLY_TARGET) $(SMARTIRC4NET_ASSEMBLY_TARGET).mdb EXTRA_PROXY_LIBS = \ $(STARKSOFTPROXY_ASSEMBLY_TARGET) $(STARKSOFTPROXY_ASSEMBLY_TARGET).mdb @BUNDLE_DB4O_TRUE@EXTRA_DB4O_LIBS = \ @BUNDLE_DB4O_TRUE@ $(DB4O_ASSEMBLY_TARGET) $(DB4O_ASSEMBLY_TARGET).mdb # $(DB4O_INSTR_ASSEMBLY_TARGET) $(DB4O_INSTR_ASSEMBLY_TARGET).mdb \ # $(DB4O_NQ_ASSEMBLY_TARGET) $(DB4O_NQ_ASSEMBLY_TARGET).mdb pkgappdir = $(pkglibdir) pkgapp_DATA = \ $(EXTRA_SERVICESTACK_LIBS) \ $(EXTRA_JSON_LIBS) \ $(EXTRA_TWITTER_LIBS) \ $(EXTRA_XMPP_LIBS) \ $(EXTRA_DB4O_LIBS) \ $(EXTRA_IRC_LIBS) \ $(EXTRA_PROXY_LIBS) \ $(EXTRA_JABBR_LIBS) EXTRA_DIST = \ $(SERVICESTACK_TEXT_SRCDIR) $(SERVICESTACK_TEXT_EXTRA_FILES) \ $(SERVICESTACK_INTERFACES_SRCDIR) $(SERVICESTACK_INTERFACES_EXTRA_FILES) \ $(SERVICESTACK_COMMON_SRCDIR) $(SERVICESTACK_COMMON_EXTRA_FILES) \ $(JSON_SRCDIR) $(JSON_EXTRA_FILES) \ $(TWITTERIZER_SRCDIR) $(TWITTERIZER_EXTRA_FILES) \ $(TWITTERIZER_STREAMING_SRCDIR) $(TWITTERIZER_STREAMING_EXTRA_FILES) \ $(JABBER_NET_SRCDIR) $(JABBER_NET_EXTRA_FILES) \ $(DB4O_SRCDIR) $(DB4O_EXTRA_FILES) \ $(STARKSOFTPROXY_SRCDIR) $(STARKSOFTPROXY_EXTRA_FILES) \ $(SMARTIRC4NET_SRCDIR) $(SMARTIRC4NET_EXTRA_FILES) \ $(SIGNALR_CLIENT_SOURCE_FILES) $(SIGNALR_CLIENT_EXTRA_FILES) \ $(JABBR_CLIENT_SOURCE_FILES) $(JABBR_CLIENT_EXTRA_FILES) # $(SERVICESTACK_TEXT_SOURCE_FILES) $(SERVICESTACK_TEXT_BUILD_FILE) \ # $(SERVICESTACK_INTERFACES_SOURCE_FILES) $(SERVICESTACK_INTERFACES_BUILD_FILE) \ # $(SERVICESTACK_COMMON_SOURCE_FILES) $(SERVICESTACK_COMMON_BUILD_FILE) \ # $(JSON_SOURCE_FILES) $(JSON_BUILD_FILE) $(JSON_SRCDIR)/Dynamic.snk \ # $(TWITTERIZER_SOURCE_FILES) $(TWITTERIZER_EXTRA_FILES) $(TWITTERIZER_BUILD_FILE) \ # $(JABBER_NET_SOURCE_FILES) $(JABBER_NET_EXTRA_FILES) $(JABBER_NET_BUILD_FILE) \ # $(DB4O_SOURCE_FILES) $(DB4O_BUILD_FILE) \ # $(DB4O_INSTR_SOURCE_FILES) $(DB4O_INSTR_BUILD_FILE) \ # $(DB4O_NQ_SOURCE_FILES) $(DB4O_NQ_BUILD_FILE) CLEANFILES = \ $(JSON_CLEAN_FILES) \ $(JABBER_NET_CLEAN_FILES) \ $(TWITTERIZER_CLEAN_FILES) \ $(SIGNALR_CLIENT_CLEAN_FILES) \ $(SMARTIRC4NET_CLEAN_FILES) \ $(STARKSOFTPROXY_CLEAN_FILES) \ $(JABBR_CLIENT_CLEAN_FILES) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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) --foreign lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkgappDATA: $(pkgapp_DATA) @$(NORMAL_INSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgappdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgappdir)" || 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)$(pkgappdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgappdir)" || exit $$?; \ done uninstall-pkgappDATA: @$(NORMAL_UNINSTALL) @list='$(pkgapp_DATA)'; test -n "$(pkgappdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgappdir)'; $(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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; \ $(am__define_uniq_tagged_files); \ 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-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgappdir)"; 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: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 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-local 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-pkgappDATA 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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgappDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-local cscopelist-am ctags \ ctags-am dist-hook distclean distclean-generic 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-pkgappDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkgappDATA .PRECIOUS: Makefile # end of magic $(SERVICESTACK_TEXT_ASSEMBLY_TARGET) $(SERVICESTACK_TEXT_ASSEMBLY_TARGET).mdb: $(SERVICESTACK_TEXT_BUILD_FILE) $(SERVICESTACK_TEXT_SOURCE_FILES) $(XBUILD) $(SERVICESTACK_TEXT_XBUILD_FLAGS) $(SERVICESTACK_TEXT_BUILD_FILE) $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET) $(SERVICESTACK_INTERFACES_ASSEMBLY_TARGET).mdb: $(SERVICESTACK_INTERFACES_BUILD_FILE) $(SERVICESTACK_INTERFACES_SOURCE_FILES) $(XBUILD) $(SERVICESTACK_INTERFACES_XBUILD_FLAGS) $(SERVICESTACK_INTERFACES_BUILD_FILE) $(SERVICESTACK_COMMON_ASSEMBLY_TARGET) $(SERVICESTACK_COMMON_ASSEMBLY_TARGET).mdb: $(SERVICESTACK_TEXT_ASSEMBLY_TARGET) $(SERVICESTACK_COMMON_BUILD_FILE) $(SERVICESTACK_COMMON_SOURCE_FILES) $(XBUILD) $(SERVICESTACK_COMMON_XBUILD_FLAGS) $(SERVICESTACK_COMMON_BUILD_FILE) $(JSON_ASSEMBLY_TARGET) $(JSON_ASSEMBLY_TARGET).mdb: $(JSON_BUILD_FILE) $(JSON_SOURCE_FILES) $(XBUILD) $(JSON_XBUILD_FLAGS) $(JSON_BUILD_FILE) $(TWITTERIZER_ASSEMBLY_TARGET) $(TWITTERIZER_ASSEMBLY_TARGET).mdb: $(TWITTERIZER_BUILD_FILE) $(TWITTERIZER_SOURCE_FILES) $(XBUILD) $(TWITTERIZER_XBUILD_FLAGS) $(TWITTERIZER_BUILD_FILE) $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET) $(TWITTERIZER_STREAMING_ASSEMBLY_TARGET).mdb: $(TWITTERIZER_STREAMING_BUILD_FILE) $(TWITTERIZER_STREAMING_SOURCE_FILES) $(XBUILD) $(TWITTERIZER_STREAMING_XBUILD_FLAGS) $(TWITTERIZER_STREAMING_BUILD_FILE) $(JABBER_NET_ASSEMBLY_TARGET) $(JABBER_NET_ASSEMBLY_TARGET).mdb: $(JABBER_NET_BUILD_FILE) $(JABBER_NET_SOURCE_FILES) $(XBUILD) $(JABBER_NET_XBUILD_FLAGS) $(JABBER_NET_BUILD_FILE) $(SMARTIRC4NET_ASSEMBLY_TARGET) $(SMARTIRC4NET_ASSEMBLY_TARGET).mdb: $(SMARTIRC4NET_BUILD_FILE) $(SMARTIRC4NET_SOURCE_FILES) $(XBUILD) $(SMARTIRC4NET_XBUILD_FLAGS) $(SMARTIRC4NET_BUILD_FILE) $(STARKSOFTPROXY_ASSEMBLY_TARGET) $(STARKSOFTPROXY_ASSEMBLY_TARGET).mdb: $(STARKSOFTPROXY_BUILD_FILE) $(STARKSOFTPROXY_SOURCE_FILES) $(XBUILD) $(STARKSOFTPROXY_XBUILD_FLAGS) $(STARKSOFTPROXY_BUILD_FILE) $(DB4O_ASSEMBLY_TARGET) $(DB4O_ASSEMBLY_TARGET).mdb: $(DB4O_BUILD_FILE) $(DB4O_SOURCE_FILES) $(XBUILD) $(DB4O_XBUILD_FLAGS) $(DB4O_BUILD_FILE) #$(DB4O_INSTR_ASSEMBLY_TARGET) $(DB4O_INSTR_ASSEMBLY_TARGET).mdb: $(DB4O_INSTR_BUILD_FILE) $(DB4O_INSTR_SOURCE_FILES) # $(XBUILD) $(DB4O_INSTR_XBUILD_FLAGS) $(DB4O_INSTR_BUILD_FILE) #$(DB4O_NQ_ASSEMBLY_TARGET) $(DB4O_NQ_ASSEMBLY_TARGET).mdb: $(DB4O_NQ_BUILD_FILE) $(DB4O_NQ_SOURCE_FILES) # $(XBUILD) $(DB4O_NQ_XBUILD_FLAGS) $(DB4O_NQ_BUILD_FILE) $(SIGNALR_CLIENT_ASSEMBLY_TARGET) $(SIGNALR_CLIENT_ASSEMBLY_TARGET).mdb: $(SIGNALR_CLIENT_BUILD_FILE) $(SIGNALR_CLIENT_SOURCE_FILES) $(XBUILD) $(SIGNALR_CLIENT_XBUILD_FLAGS) $(SIGNALR_CLIENT_BUILD_FILE) $(JABBR_CLIENT_ASSEMBLY_TARGET) $(JABBR_CLIENT_ASSEMBLY_TARGET).mdb: $(JABBR_CLIENT_BUILD_FILE) $(JABBR_CLIENT_SOURCE_FILES) $(XBUILD) $(JABBR_CLIENT_XBUILD_FLAGS) $(JABBR_CLIENT_BUILD_FILE) clean-local: $(XBUILD) $(SERVICESTACK_TEXT_XBUILD_FLAGS) /t:Clean $(SERVICESTACK_TEXT_BUILD_FILE) $(XBUILD) $(SERVICESTACK_INTERFACES_XBUILD_FLAGS) /t:Clean $(SERVICESTACK_INTERFACES_BUILD_FILE) $(XBUILD) $(SERVICESTACK_COMMON_XBUILD_FLAGS) /t:Clean $(SERVICESTACK_COMMON_BUILD_FILE) @ENABLE_ENGINE_IRC_TRUE@ $(XBUILD) $(SMARTIRC4NET_XBUILD_FLAGS) /t:Clean $(SMARTIRC4NET_BUILD_FILE) $(XBUILD) $(STARKSOFTPROXY_XBUILD_FLAGS) /t:Clean $(STARKSOFTPROXY_BUILD_FILE) @ENABLE_ENGINE_TWITTER_TRUE@ $(XBUILD) $(JSON_XBUILD_FLAGS) /t:Clean $(JSON_BUILD_FILE) @ENABLE_ENGINE_TWITTER_TRUE@ $(XBUILD) $(TWITTERIZER_XBUILD_FLAGS) /t:Clean $(TWITTERIZER_BUILD_FILE) @ENABLE_ENGINE_TWITTER_TRUE@ $(XBUILD) $(TWITTERIZER_STREAMING_XBUILD_FLAGS) /t:Clean $(TWITTERIZER_STREAMING_BUILD_FILE) @ENABLE_ENGINE_XMPP_TRUE@ $(XBUILD) $(JABBER_NET_XBUILD_FLAGS) /t:Clean $(JABBER_NET_BUILD_FILE) @ENABLE_ENGINE_JABBR_TRUE@ $(XBUILD) $(JSON_XBUILD_FLAGS) /t:Clean $(JSON_BUILD_FILE) @ENABLE_ENGINE_JABBR_TRUE@ $(XBUILD) $(SIGNALR_CLIENT_XBUILD_FLAGS) /t:Clean $(SIGNALR_CLIENT_BUILD_FILE) @ENABLE_ENGINE_JABBR_TRUE@ $(XBUILD) $(JABBR_CLIENT_XBUILD_FLAGS) /t:Clean $(JABBR_CLIENT_BUILD_FILE) @BUNDLE_DB4O_TRUE@ $(XBUILD) $(DB4O_XBUILD_FLAGS) /t:Clean $(DB4O_BUILD_FILE) # $(XBUILD) $(DB4O_INSTR_XBUILD_FLAGS) /t:Clean $(DB4O_INSTR_BUILD_FILE) # $(XBUILD) $(DB4O_NQ_XBUILD_FLAGS) /t:Clean $(DB4O_NQ_BUILD_FILE) # filter all .git files/directories from tarball dist-hook: for GIT_DIR in $$(find $(distdir) -name ".git"); do \ echo "filtering $$GIT_DIR from tarball..."; \ chmod -R u+w $(distdir)/$$GIR_DIR; \ rm -rf $$GIT_DIR; \ 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: smuxi-1.1/lib/Twitterizer/0000775000175000017500000000000014011526500016414 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/CommonAssemblyInfo.cs0000644000175000017500000000623512253423361022522 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // //----------------------------------------------------------------------- using System; using System.Reflection; using System.Runtime.InteropServices; using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Twitterizer")] [assembly: AssemblyDescription("Twitter integration library")] #if DEBUG [assembly: AssemblyConfiguration("Debug")] #else [assembly: AssemblyConfiguration("Release")] #endif [assembly: AssemblyCompany("Twitterizer Group (www.twitterizer.net)")] [assembly: AssemblyProduct("Twitterizer")] [assembly: AssemblyCopyright("2010 Patrick 'Ricky' Smith (www.ricky-dev.com)")] [assembly: AssemblyTrademark("")] [assembly: AssemblyVersion("2.4.2.*")] [assembly: AssemblyFileVersion("2.4.2.0")] [assembly: AssemblyInformationalVersion("2.4.2")] #if !SILVERLIGHT [assembly: AllowPartiallyTrustedCallers] #endif [assembly: CLSCompliant(true)] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)]smuxi-1.1/lib/Twitterizer/Json.NET.license.txt0000644000175000017500000000205211655552527022154 0ustar00meebeymeebey00000000000000Copyright (c) 2007 James Newton-King 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.smuxi-1.1/lib/Twitterizer/GettingStarted.txt0000644000175000017500000000434612132510633022114 0ustar00meebeymeebey00000000000000 ___ ___ ___ ___ __ __ ___ __ _ _ _ | | | | | | |__ |__) | / |__ |__) | | | |/\| | | | |___ | \ | /_ |___ | \ _|_|_ Q) Which files do I need? A) More than likely, you only need Twitterizer2.dll and Newtonsoft.Json.dll Q) What exactly are all these files? A) Twitterizer2.dll This is the main binary which contains the core class library. This file is required for all addon libraries. Twitterizer2.Data.dll This is an additional library that provides data conversion functionality. For example, with it you can quickly generate DataTables from any Twitterizer2 collection. This file is not necessary for most projects. Newtonsoft.Json.dll This is JSON.NET, developed by James Newton-King. You do not need to add a reference in your project to this library, but it must be placed in your project's bin folder along with Twitterizer2.dll. More information can be found here: http://james.newtonking.com/pages/json-net.aspx Twitterizer2.Async.dll This is an addon library that allows developers to call Twitterizer2 methods asynchronously. This file is not necessary for most projects. Twitterizer2.Streaming.dll This is an addon library that provides access to the Streaming API. This file is not necessary for most projects. Twitterizer.OAuth.dll This is a standalone library that provides access to our OAuth request signing functionality without using Twitterizer2. _DO_NOT_ include this file in your project if you are using Twitterizer2.dll. All of the functionality found in this library is available within Twitterizer2.dll. This file is not necessary for most projects. Twitterizer2lite.dll This is a slimmed down version of the Twitterizer2.dll file built with the client profile as the target framework. It will lack some extra pieces of functionality, such as the built-in data caching and support for application configuration settings. _DO_NOT_ include this file in your project if you are using Twitterizer2.dll. This file is not necessary for most projects. Q) What about the license files? A) The license files must accompany the dlls. That means that they must be distributed along with your application.smuxi-1.1/lib/Twitterizer/Twitterizer2.license.txt0000644000175000017500000000275211655552527023243 0ustar00meebeymeebey00000000000000Copyright (c) 2010, Patrick "Ricky" Smith All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name Twitterizer nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.smuxi-1.1/lib/Twitterizer/Twitterizer2/0000755000175000017500000000000012652476423021051 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Twitterizer2.cd0000644000175000017500000001664612132510633023775 0ustar00meebeymeebey00000000000000 AAACAAAQACAAgAAAAEAAAAAAAAEBAgACAgAACAAIAAA= Methods\DirectMessage\TwitterDirectMessage.cs AQQDAAQAAgAAAABAAAAQAAAAwAEEAAAIAkEACAApAAA= Methods\Tweets\TwitterStatus.cs AEASQAAkCAIwwAAAdAoJICQAABCEEAACAiAgAABiSAA= Methods\User\TwitterUser.cs QAQDYAAAAIAgAKAABgAAAAQAASEkCAAQAQAAAAQAAAI= Methods\List\TwitterList.cs Methods\Geo\Coordinate.cs AAAAAAAAAEAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAA= Methods\Geo\Coordinate.cs ACACAAAAAAAACIAAAAAAIAQAACIAAAAIAAAAAAAAABA= Methods\Geo\TwitterPlace.cs AAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAQAAAAAAAAA= Methods\Geo\TwitterBoundingBox.cs AAAAAAAAAAAAAAAAAAAAAAAAACAAAIAAAAAAAAAAAAA= Methods\Tweets\Entities\TwitterEntity.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA= Methods\Tweets\Entities\TwitterUrlEntity.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAA= Methods\Tweets\Entities\TwitterHashTagEntity.cs AAAAQAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAA= Methods\Tweets\Entities\TwitterMentionEntity.cs AAAAAAAAAAAAAIAAAAAAAAAAIAAAAAAAAAAAAAAAAAA= Methods\Geo\TwitterGeo.cs AYAAAAAAAgAAAAAAAgBAAAQAAAAAAAAAgAAAAAABAAA= TwitterResponse.cs AAAAAAAAAAAAAAAAAAAAAgAAEAACAAQAAAAAAAAAAAA= OAuth\OAuthTokens.cs AAAAAAAgAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAEA= Core\RateLimit.cs gAAAABAAAAAAAAAAAAEAAAAgAgEAAAAgAAAEAAAAABA= Core\RequestResult.cs smuxi-1.1/lib/Twitterizer/Twitterizer2/Twitterizer2.csproj0000644000175000017500000004606112652472053024713 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {2FDC3492-6B9E-4771-9755-7892C9CB1E96} Library Properties Twitterizer Twitterizer2 512 false Twitterizer2.snk 3.5 false publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false true ..\..\twitterizer\ true v4.5 true full false ..\Debug\Twitterizer2\Full\ DEBUG;TRACE prompt 4 ..\Debug\Twitterizer2\Full\Twitterizer2.XML AllRules.ruleset pdbonly true ..\Release\net40\ TRACE prompt 4 ..\Release\net40\Twitterizer2.XML AllRules.ruleset true bin\Mono-Debug\ TRACE;DEBUG;MONO_2_4 bin\Debug\Twitterizer2.XML full AnyCPU prompt AllRules.ruleset bin\Mono-Release\ TRACE;MONO_2_4 true pdbonly AnyCPU prompt AllRules.ruleset true bin\CCNET\ DEBUG;TRACE bin\Debug\Twitterizer2.XML full AnyCPU prompt AllRules.ruleset OnBuildSuccess CommonAssemblyInfo.cs Code Designer False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true GettingStarted.txt Twitterizer2.license.txt {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Newtonsoft.Json smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/0000755000175000017500000000000012132510633022435 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/0000755000175000017500000000000012503640373023156 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/TwitterPlaceCollection.cs0000644000175000017500000001250612132510633030125 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter place collection class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Newtonsoft.Json; using Twitterizer.Core; /// /// The Twitter Place Collection class. A collection of objects. /// #if !SILVERLIGHT [Serializable] #endif [JsonConverter(typeof(TwitterPlaceCollection.Converter))] [JsonObject] public class TwitterPlaceCollection : TwitterCollection, ITwitterObject { /// /// Converts json data to a . /// #if !SILVERLIGHT internal class Converter : JsonConverter #else public class Converter : JsonConverter #endif { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof(TwitterPlaceCollection); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { TwitterPlaceCollection result = new TwitterPlaceCollection(); reader.Read(); reader.Read(); bool hasReachedTheQuery = false; while (reader.Read()) { if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "query") { hasReachedTheQuery = true; } if (hasReachedTheQuery) continue; if (reader.TokenType == JsonToken.StartObject) { result.Add(serializer.Deserialize(reader)); } } return result; } /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // TODO: Implement this. // throw new NotImplementedException(); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/ReverseGeocodeCommand.cs0000644000175000017500000001060412132510633027677 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The reverse geocode command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The reverse geocode command class. Performs a reverse geocode lookup. /// #if !SILVERLIGHT [Serializable] #endif internal class ReverseGeocodeCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The latitude. /// The longitude. /// The options. public ReverseGeocodeCommand(double latitude, double longitude, TwitterPlaceLookupOptions options) : base(HTTPVerb.GET, "geo/reverse_geocode.json", null, options) { this.Latitude = latitude; this.Longitude = longitude; } /// /// Gets or sets the latitude. /// /// The latitude. public double Latitude { get; set; } /// /// Gets or sets the longitude. /// /// The longitude. public double Longitude { get; set; } /// /// Initializes the command. /// public override void Init() { NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat; this.RequestParameters.Add("lat", this.Latitude.ToString(nfi)); this.RequestParameters.Add("long", this.Longitude.ToString(nfi)); TwitterPlaceLookupOptions options = this.OptionalProperties as TwitterPlaceLookupOptions; if (options == null) return; if (!string.IsNullOrEmpty(options.Accuracy)) { this.RequestParameters.Add("accuracy", options.Accuracy); } if (!string.IsNullOrEmpty(options.Granularity)) { this.RequestParameters.Add("granularity", options.Granularity); } if (options.MaxResults != null) { this.RequestParameters.Add("max_results", options.MaxResults.Value.ToString(nfi)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/Coordinate.cs0000644000175000017500000001426112503640373025600 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The coordinate class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.ObjectModel; using System.Linq; using System.Runtime.Serialization; using Newtonsoft.Json; /// /// Represents a single point on planet earth. /// #if !SILVERLIGHT [Serializable] #endif [DataContract] public class Coordinate { /// /// Gets or sets the latitude. /// /// The latitude. public double Latitude { get; set; } /// /// Gets or sets the longitude. /// /// The longitude. public double Longitude { get; set; } /// /// Reads a json array of coordinates and converts it into a collection of coordinate objects. /// #if !SILVERLIGHT internal class Converter : JsonConverter #else public class Converter : JsonConverter #endif { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof(Collection); } /// /// Reads the json. /// /// The reader. /// Type of the object. /// The existing value. /// The serializer. /// A deserialized public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { Collection result = existingValue as Collection; if (result == null) result = new Collection(); int startDepth = reader.Depth; if (reader.TokenType != JsonToken.StartArray) { return null; } //int depth = reader.Depth + 1; double count = 1; while (reader.Read() && reader.Depth > startDepth) { if (new[] { JsonToken.StartArray, JsonToken.EndArray }.Contains(reader.TokenType)) continue; int itemIndex = Convert.ToInt32(Math.Ceiling(count / 2) - 1); if (count % 2 > 0) { result.Add(new Coordinate()); result[itemIndex].Latitude = Convert.ToDouble(reader.Value); } else { result[itemIndex].Longitude = Convert.ToDouble(reader.Value); } count++; } return result; } catch { return null; } } /// /// Writes the json. /// /// The writer. /// The value. /// The serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // TODO: Implement this. writer.WriteNull(); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/TwitterPlace.cs0000644000175000017500000001675212253423361026125 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter place class //----------------------------------------------------------------------- namespace Twitterizer { using System; using Newtonsoft.Json; using Twitterizer.Core; /// /// The twitter place class. Represents a place or area. /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] #if !SILVERLIGHT [Serializable] #endif [System.Diagnostics.DebuggerDisplay("{FullName} ({Id})")] public sealed class TwitterPlace : TwitterObject { /// /// Gets or sets the country code. /// /// The country code. [JsonProperty(PropertyName = "country_code")] public string CountryCode { get; set; } /// /// Gets or sets the type of the place. /// /// The type of the place. [JsonProperty(PropertyName = "place_type")] public string PlaceType { get; set; } /// /// Gets or sets the address of the data. /// /// The address of the data. [JsonProperty(PropertyName = "url")] public string DataAddress { get; set; } /// /// Gets or sets the country. /// /// The country. [JsonProperty(PropertyName = "country")] public string Country { get; set; } /// /// Gets or sets the address of the street. /// /// The address of the street. [JsonProperty(PropertyName = "street_address")] public string StreetAddress { get; set; } /// /// Gets or sets the postal code. /// /// The postal code. /// [JsonProperty(PropertyName = "postal_code")] public string PostalCode { get; set; } /// /// Gets or sets the phone number in the preferred local format for the place, include long distance code. /// /// The phone number. /// [JsonProperty(PropertyName = "phone")] public string Phone { get; set; } /// /// Gets or sets the locality. /// /// The locality. /// [JsonProperty(PropertyName = "locality")] public string Locality { get; set; } /// /// Gets or sets the region. /// /// The region. /// [JsonProperty(PropertyName = "region")] public string Region { get; set; } /// /// Gets or sets the iso3 country code. /// /// The iso3 country code. /// [JsonProperty(PropertyName = "iso3")] public string Iso3CountryCode { get; set; } /// /// Gets or sets the full name. /// /// The full name. [JsonProperty(PropertyName = "full_name")] public string FullName { get; set; } /// /// Gets or sets the name of the place. /// /// The name of the place. [JsonProperty(PropertyName = "name")] public string Name { get; set; } /// /// Gets or sets the place id. /// /// The place id. [JsonProperty(PropertyName = "id")] public string Id { get; set; } /// /// Gets or sets an ID or comma separated list of IDs representing the place in the applications place database. /// /// The app ids. [JsonProperty(PropertyName = "app:id")] public string AppIds { get; set; } /// /// Gets or sets the bounding box. /// /// The bounding box. [JsonProperty(PropertyName = "bounding_box")] public TwitterBoundingBox BoundingBox { get; set; } /// /// Retrieves a place based on the specified coordinates. /// /// The latitude. /// The longitude. /// The options. /// A collection of matched items. public static TwitterResponse Lookup(double latitude, double longitude, TwitterPlaceLookupOptions options) { Commands.ReverseGeocodeCommand command = new Twitterizer.Commands.ReverseGeocodeCommand(latitude, longitude, options); return CommandPerformer.PerformAction(command); } /// /// Retrieves a place based on the specified coordinates. /// /// The latitude. /// The longitude. /// A collection of matched items. public static TwitterResponse Lookup(double latitude, double longitude) { return Lookup(latitude, longitude, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/TwitterPlaceLookupOptions.cs0000644000175000017500000000665411655552527030707 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter place lookup options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Provides a payload for optional parameters for the method. /// public class TwitterPlaceLookupOptions : OptionalProperties { /// /// A hint on the "region" in which to search. If a number, then this is a radius in meters, but it can also take a string that is suffixed with ft to specify feet. If this is not passed in, then it is assumed to be 0m. If coming from a device, in practice, this value is whatever accuracy the device has measuring its location (whether it be coming from a GPS, WiFi triangulation, etc.). /// public string Accuracy { get; set; } /// /// The minimal granularity of data to return. If this is not passed in, then neighborhood is assumed. city can also be passed. /// public string Granularity { get; set; } /// /// A hint as to the number of results to return. This does not guarantee that the number of results returned will equal max_results, but instead informs how many "nearby" results to return. Ideally, only pass in the number of places you intend to display to the user here. /// public int? MaxResults { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/TwitterBoundingBox.cs0000644000175000017500000000604212132510633027301 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter bounding box class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.ObjectModel; using Newtonsoft.Json; using Twitterizer.Core; /// /// The twitter bounding box class. Represents a series of latitude and longitude coordinates that represents an area. /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] #if !SILVERLIGHT [Serializable] #endif public class TwitterBoundingBox : TwitterObject { /// /// Gets or sets the type. /// /// The type of bounding box. [JsonProperty(PropertyName = "type")] public string Type { get; set; } /// /// Gets or sets the coordinates. /// /// The coordinates. [JsonProperty(PropertyName = "coordinates")] [JsonConverter(typeof(Coordinate.Converter))] public Collection Coordinates { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Geo/TwitterGeo.cs0000644000175000017500000000676212132510633025606 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The geo location class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.ObjectModel; using Newtonsoft.Json; /// /// Lists the possible types of geographic boundaries. /// public enum TwitterGeoShapeType { /// /// A single point. Expect one coordinate. /// Point, /// /// A line, or multiple lines joined end-to-end. /// LineString, /// /// A polygon-shaped area. /// Polygon, /// /// A circle represented by a single point (the center) and the radius. /// CircleByCenterPoint } /// /// Represents a geological area /// #if !SILVERLIGHT [Serializable] #endif public class TwitterGeo { /// /// Gets or sets the type of the shape. /// /// The type of the shape. [JsonProperty(PropertyName = "type")] public TwitterGeoShapeType ShapeType { get; set; } /// /// Gets or sets the coordinates. /// /// The coordinates. [JsonProperty(PropertyName = "coordinates")] [JsonConverter(typeof(Coordinate.Converter))] public Collection Coordinates { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/TwitterResultTypeEnum.cs0000644000175000017500000000525411655552527027343 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter result type enumeration //----------------------------------------------------------------------- namespace Twitterizer { /// /// The Twitter Result Type Enumeration /// public enum TwitterResultType { /// /// In a future release this will become the default value. Include both popular and real time results in the response. /// Mixed, /// /// The current default value. Return only the most recent results in the response. /// Recent, /// /// Return only the most popular results in the response. /// Popular } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/0000755000175000017500000000000012253423361024036 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/TwitterRateLimitStatus.cs0000644000175000017500000001152612132510633031046 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter rate limit status class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Newtonsoft.Json; using Twitterizer.Core; /// /// The Twitter Rate Limit Status class /// #if !SILVERLIGHT [Serializable] #endif [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public class TwitterRateLimitStatus : TwitterObject { #region API Properties /// /// Gets or sets the remaining hits. /// /// The remaining hits. [JsonProperty(PropertyName = "remaining_hits")] public int RemainingHits { get; set; } /// /// Gets or sets the hourly limit. /// /// The hourly limit. [JsonProperty(PropertyName = "hourly_limit")] public int HourlyLimit { get; set; } /// /// Gets or sets the UTC string value of the time rate limiting will reset. /// /// The reset time string. [JsonProperty(PropertyName = "reset_time")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime ResetTime { get; set; } #endregion /// /// Gets the rate limiting status status for the authenticated user. /// /// The OAuth tokens. /// The options. /// /// A instance. /// public static TwitterResponse GetStatus(OAuthTokens tokens, OptionalProperties options) { Commands.RateLimitStatusCommand command = new Twitterizer.Commands.RateLimitStatusCommand(tokens, options); TwitterResponse result = Core.CommandPerformer.PerformAction(command); return result; } /// /// Gets the rate limiting status status based on the application's IP address. /// /// The OAuth tokens. /// /// A instance. /// public static TwitterResponse GetStatus(OAuthTokens tokens) { return GetStatus(tokens, null); } /// /// Gets the rate limiting status status based on the application's IP address. /// /// /// A instance. /// public static TwitterResponse GetStatus() { return GetStatus(null, null); } } }smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileCommand.cs0000644000175000017500000000655612132510633030436 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; /// /// The update profile command class. /// sealed class UpdateProfileCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public UpdateProfileCommand(OAuthTokens tokens, UpdateProfileOptions options) : base(HTTPVerb.POST, "account/update_profile.json", tokens, options) { } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); UpdateProfileOptions options = this.OptionalProperties as UpdateProfileOptions; if (options == null) { return; } this.RequestParameters.Add("name", options.Name); this.RequestParameters.Add("description", options.Description); this.RequestParameters.Add("location", options.Location); this.RequestParameters.Add("url", options.Url); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileBackgroundImageCommand.cs0000644000175000017500000001023612253423361033374 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile background image command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; /// /// /// #if !SILVERLIGHT [Serializable] #endif internal sealed class UpdateProfileBackgroundImageCommand : TwitterCommand { private readonly byte[] imageData; /// /// Initializes a new instance of the class. /// /// The tokens. /// The image. /// The options. public UpdateProfileBackgroundImageCommand(OAuthTokens tokens, byte[] image, UpdateProfileBackgroundImageOptions options) : base(HTTPVerb.POST, "", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if ((options == null && (image == null || image.Length == 0)) || (options != null && !options.UseImage)) { throw new ArgumentException("Image data cannot be null or zero length."); } if (image != null && image.Length > 102400) { throw new ArgumentException("Image cannot exceed 800Kb in size."); } this.imageData = image; this.Multipart = true; } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("image", this.imageData); this.RequestParameters.Add("include_entities", "true"); UpdateProfileBackgroundImageOptions options = this.OptionalProperties as UpdateProfileBackgroundImageOptions; if (options == null) return; this.RequestParameters.Add("use", options.UseImage ? "1" : "0"); if (options.Tiled.HasValue) this.RequestParameters.Add("tiled", options.Tiled.Value ? "1" : "0"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileImageCommand.cs0000644000175000017500000000715712253423361031404 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile image command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; #if !SILVERLIGHT [Serializable] #endif internal class UpdateProfileImageCommand : TwitterCommand { private readonly byte[] imageData; /// /// Initializes a new instance of the class. /// /// The tokens. /// The image. /// The options. public UpdateProfileImageCommand(OAuthTokens tokens, byte[] image, OptionalProperties options) : base(HTTPVerb.POST, "account/update_profile_image.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (image == null || image.Length == 0) { throw new ArithmeticException("Image data cannot be null or zero length."); } if (image.Length > 716800) { throw new ArithmeticException("Image cannot exceed 700Kb in size."); } this.imageData = image; this.Multipart = true; } /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("image", this.imageData); this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileColorsCommand.cs0000644000175000017500000001272312253423361031616 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile colors command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; #if !SILVERLIGHT using System.Drawing; #endif using Twitterizer.Core; /// /// Sets one or more hex values that control the color scheme of the authenticating user's profile page on twitter.com /// [AuthorizedCommand] #if !SILVERLIGHT [Serializable] #endif internal class UpdateProfileColorsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public UpdateProfileColorsCommand(OAuthTokens tokens, UpdateProfileColorsOptions options) : base(HTTPVerb.POST, "account/update_profile_colors.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (options == null) { throw new ArgumentNullException("options"); } } /// /// Initializes the command. /// public override void Init() { UpdateProfileColorsOptions options = (UpdateProfileColorsOptions)this.OptionalProperties; #if !SILVERLIGHT if (options.BackgroundColor != Color.Empty) { this.RequestParameters.Add("profile_background_color", ColorTranslator.ToHtml(options.BackgroundColor)); } #else if (options.BackgroundColor != null) { this.RequestParameters.Add("profile_background_color", options.BackgroundColor); } #endif #if !SILVERLIGHT if (options.TextColor != Color.Empty) { this.RequestParameters.Add("profile_text_color", ColorTranslator.ToHtml(options.TextColor)); } #else if (options.TextColor != null) { this.RequestParameters.Add("profile_text_color", options.TextColor); } #endif #if !SILVERLIGHT if (options.LinkColor != Color.Empty) { this.RequestParameters.Add("profile_link_color", ColorTranslator.ToHtml(options.LinkColor)); } #else if (options.LinkColor != null) { this.RequestParameters.Add("profile_link_color", options.LinkColor); } #endif #if !SILVERLIGHT if (options.SidebarFillColor != Color.Empty) { this.RequestParameters.Add("profile_sidebar_fill_color", ColorTranslator.ToHtml(options.SidebarFillColor)); } #else if (options.SidebarFillColor != null) { this.RequestParameters.Add("profile_sidebar_fill_color", options.SidebarFillColor); } #endif #if !SILVERLIGHT if (options.SidebarBorderColor != Color.Empty) { this.RequestParameters.Add("profile_sidebar_border_color", ColorTranslator.ToHtml(options.SidebarBorderColor)); } #else if (options.SidebarBorderColor != null) { this.RequestParameters.Add("profile_sidebar_border_color", options.SidebarBorderColor); } #endif } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/RateLimitStatusCommand.cs0000644000175000017500000000574112132510633030764 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The rate limit status command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; /// /// The rate limit status command class. /// #if !SILVERLIGHT [System.Serializable] #endif internal sealed class RateLimitStatusCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public RateLimitStatusCommand(OAuthTokens requestTokens, OptionalProperties options) : base(HTTPVerb.GET, "account/rate_limit_status.json", requestTokens, options) { } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileOptions.cs0000644000175000017500000000605512132510633030505 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile options class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.Generic; using System.Linq; using System.Text; /// /// Optional properties for the class. /// public class UpdateProfileOptions : OptionalProperties { /// /// Gets or sets the name. /// /// The name. public string Name { get; set; } /// /// Gets or sets the URL. /// /// The URL. public string Url { get; set; } /// /// Gets or sets the location. /// /// The location. public string Location { get; set; } /// /// Gets or sets the description. /// /// The description. public string Description { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileColorsOptions.cs0000644000175000017500000001151712253423361031673 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile colors options class. //----------------------------------------------------------------------- namespace Twitterizer { #if !SILVERLIGHT using System.Drawing; #endif /// /// Optional properties for the .Profile*Colors methods. /// public class UpdateProfileColorsOptions : OptionalProperties { #if !SILVERLIGHT /// /// Initializes a new instance of the class. /// public UpdateProfileColorsOptions() { BackgroundColor = Color.Empty; TextColor = Color.Empty; LinkColor = Color.Empty; SidebarFillColor = Color.Empty; SidebarBorderColor = Color.Empty; } /// /// Gets or sets the color of the background. /// /// The color of the background. public Color BackgroundColor { get; set; } /// /// Gets or sets the color of the text. /// /// The color of the text. public Color TextColor { get; set; } /// /// Gets or sets the color of the link. /// /// The color of the link. public Color LinkColor { get; set; } /// /// Gets or sets the color of the sidebar fill. /// /// The color of the sidebar fill. public Color SidebarFillColor { get; set; } /// /// Gets or sets the color of the sidebar border. /// /// The color of the sidebar border. public Color SidebarBorderColor { get; set; } #else /// /// Gets or sets the color of the background. /// /// The color of the background. public string BackgroundColor { get; set; } /// /// Gets or sets the color of the text. /// /// The color of the text. public string TextColor { get; set; } /// /// Gets or sets the color of the link. /// /// The color of the link. public string LinkColor { get; set; } /// /// Gets or sets the color of the sidebar fill. /// /// The color of the sidebar fill. public string SidebarFillColor { get; set; } /// /// Gets or sets the color of the sidebar border. /// /// The color of the sidebar border. public string SidebarBorderColor { get; set; } #endif } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/UpdateProfileBackgroundImageOptions.cs0000644000175000017500000000621612253423361033454 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update profile background image command class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// An options class for updating the user's profile background image. /// #if !SILVERLIGHT [Serializable] #endif public sealed class UpdateProfileBackgroundImageOptions : OptionalProperties { /// /// Gets or sets a value indicating whether or not to tile the background image. /// /// true if tiled; otherwise, false. public bool? Tiled { get; set; } /// /// Gets or sets a value indicating whether to display the profile background image or not. /// /// true to use an image; otherwise, false. public bool UseImage { get; set; } /// /// Initializes a new instance of the class. /// public UpdateProfileBackgroundImageOptions() { this.UseImage = true; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/VerifyCredentialsOptions.cs0000644000175000017500000000557312132510633031370 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The verify credentials command class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The Verify Credentials Options class. Provides a payload for optional parameters for the Verify Credentials Command. /// #if !SILVERLIGHT [System.Serializable] #endif public class VerifyCredentialsOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public VerifyCredentialsOptions() { this.IncludeEntities = false; } /// /// Gets or sets a value indicating whether [include entities]. /// /// true if [include entities]; otherwise, false. public bool IncludeEntities { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/VerifyCredentialsCommand.cs0000644000175000017500000000643412253423361031315 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The verify credentials optional parameters class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Core; /// /// The verify credentials command class. /// [AuthorizedCommand] #if !SILVERLIGHT [System.Serializable] #endif internal class VerifyCredentialsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public VerifyCredentialsCommand(OAuthTokens requestTokens, VerifyCredentialsOptions options) : base(HTTPVerb.GET, "account/verify_credentials.json", requestTokens, options) { } /// /// Initializes the command. /// public override void Init() { VerifyCredentialsOptions options = this.OptionalProperties as VerifyCredentialsOptions; if (options == null) return; if (options.IncludeEntities) { this.RequestParameters.Add("include_entities", "true"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Account/TwitterAccount.cs0000644000175000017500000001734612132510633027352 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterAccount class. //----------------------------------------------------------------------- namespace Twitterizer { using Twitterizer.Core; /// /// Provides methods to request and modify details of an authorized user's account details. /// public static class TwitterAccount { /// /// Verifies the user's credentials. /// /// The tokens. /// The options. /// public static TwitterResponse VerifyCredentials(OAuthTokens tokens, VerifyCredentialsOptions options) { Commands.VerifyCredentialsCommand command = new Commands.VerifyCredentialsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Verifies the user's credentials. /// /// The tokens. /// public static TwitterResponse VerifyCredentials(OAuthTokens tokens) { return VerifyCredentials(tokens, null); } /// /// Sets one or more hex values that control the color scheme of the authenticating user's profile page on twitter.com /// /// The tokens. /// The options. /// /// The user, with updated data, as a /// public static TwitterResponse UpdateProfileColors(OAuthTokens tokens, UpdateProfileColorsOptions options) { Commands.UpdateProfileColorsCommand command = new Twitterizer.Commands.UpdateProfileColorsCommand(tokens, options); return CommandPerformer.PerformAction(command); } /// /// Updates the authenticating user's profile image. /// /// The tokens. /// The image data. /// The options. /// /// The user, with updated data, as a /// public static TwitterResponse UpdateProfileImage(OAuthTokens tokens, byte[] imageData, OptionalProperties options = null) { Commands.UpdateProfileImageCommand command = new Twitterizer.Commands.UpdateProfileImageCommand(tokens, imageData, options); return CommandPerformer.PerformAction(command); } /// /// Updates the authenticating user's profile image. /// /// The tokens. /// The image location. /// The options. /// /// The user, with updated data, as a /// public static TwitterResponse UpdateProfileImage(OAuthTokens tokens, string imageLocation, OptionalProperties options = null) { return UpdateProfileImage(tokens, System.IO.File.ReadAllBytes(imageLocation), options); } /// /// Updates the authenticating user's profile background image. This method can also be used to enable or disable the profile background image. /// /// The tokens. /// The image data. /// The options. /// public static TwitterResponse UpdateProfileBackgroundImage(OAuthTokens tokens, byte[] imageData = null, UpdateProfileBackgroundImageOptions options = null) { if (imageData == null && options == null) { throw new System.ArgumentNullException("imageData", "You must provide image data or indicate you wish to not use any image in the options argument."); } Commands.UpdateProfileBackgroundImageCommand command = new Twitterizer.Commands.UpdateProfileBackgroundImageCommand(tokens, imageData, options); return CommandPerformer.PerformAction(command); } /// /// Updates the authenticating user's profile background image. This method can also be used to enable or disable the profile background image. /// /// The tokens. /// The image location. /// The options. /// public static TwitterResponse UpdateProfileBackgroundImage(OAuthTokens tokens, string imageLocation, UpdateProfileBackgroundImageOptions options = null) { return UpdateProfileBackgroundImage(tokens, System.IO.File.ReadAllBytes(imageLocation), options); } /// /// Sets values that users are able to set under the "Account" tab of their settings page. Only the parameters specified will be updated. /// /// The tokens. /// The options. /// /// public static TwitterResponse UpdateProfile(OAuthTokens tokens, UpdateProfileOptions options) { Commands.UpdateProfileCommand command = new Commands.UpdateProfileCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/0000755000175000017500000000000012503640373023362 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/FriendsCommand.cs0000644000175000017500000000736012503640373026610 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The command to obtain followers of a user. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The command to obtain followers of a user. /// #if !SILVERLIGHT [Serializable] #endif internal sealed class FriendsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public FriendsCommand(OAuthTokens tokens, FriendsOptions options) : base(HTTPVerb.GET, "statuses/friends.json", tokens, options) { this.DeserializationHandler = TwitterUserCollection.DeserializeWrapper; } /// /// Initializes the command. /// public override void Init() { // Default values this.RequestParameters.Add("cursor", "-1"); FriendsOptions options = this.OptionalProperties as FriendsOptions; if (options == null) { return; } if (options.UserId > 0) this.RequestParameters.Add("user_id", options.UserId.ToString("#")); if (!string.IsNullOrEmpty(options.ScreenName)) this.RequestParameters.Add("screen_name", options.ScreenName); // Override the default if (options.Cursor != 0) this.RequestParameters["cursor"] = options.Cursor.ToString(CultureInfo.CurrentCulture); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/TwitterUserCollection.cs0000644000175000017500000000761212132510633030225 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The collection class containing zero or more TwitterUser objects. //----------------------------------------------------------------------- namespace Twitterizer { using Twitterizer.Core; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Runtime.Serialization; /// /// The TwitterUserCollection class. /// #if !SILVERLIGHT [System.Serializable] #endif [DataContract] public class TwitterUserCollection : TwitterCollection, ITwitterObject { /// /// Gets or sets the next cursor. /// /// The next cursor. [DataMember] public long NextCursor { get; internal set; } /// /// Gets or sets the previous cursor. /// /// The previous cursor. [DataMember] public long PreviousCursor { get; internal set; } /// /// Gets or sets information about the user's rate usage. /// /// The rate limiting object. [DataMember] public RateLimiting RateLimiting { get; internal set; } /// /// Deserializes the specified value. /// /// The value. /// internal static TwitterUserCollection DeserializeWrapper(JObject value) { if (value == null || value.SelectToken("users") == null) { return null; } TwitterUserCollection result = JsonConvert.DeserializeObject(value.SelectToken("users").ToString()); result.NextCursor = value.SelectToken("next_cursor").Value(); result.PreviousCursor = value.SelectToken("previous_cursor").Value(); return result; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/FollowersOptions.cs0000644000175000017500000000567612132510633027250 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The follower options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The followers options class. Provides a payload for optional parameters of the FollowersCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class FollowersOptions : OptionalProperties { /// /// Gets or sets the ID of the user for whom to request a list of followers. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the screen name of the user for whom to request a list of followers. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/RetweetedByCommand.cs0000644000175000017500000000754512132510633027437 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweeted by command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; /// /// The retweeted by command class. /// /// http://dev.twitter.com/doc/get/statuses/:id/retweeted_by [AuthorizedCommandAttribute] internal class RetweetedByCommand : TwitterCommand { public RetweetedByCommand(OAuthTokens tokens, decimal statusId, RetweetedByOptions options) : base(HTTPVerb.GET, string.Format("statuses/{0}/retweeted_by.json", statusId), tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (statusId <= 0) { throw new ArgumentNullException("statusId", "Status ID is required."); } } /// /// Inits this instance. /// public override void Init() { RetweetedByOptions options = this.OptionalProperties as RetweetedByOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.Count > 1) { this.RequestParameters.Add("count", options.Count.ToString()); } if (options.IncludeEntities) { this.RequestParameters.Add("include_entities", "true"); } if (options.TrimUser) { this.RequestParameters.Add("trim_user", "true"); } if (options.Page > 0) { this.RequestParameters.Add("page", options.Page.ToString()); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/LookupUsersOptions.cs0000644000175000017500000000226712253423361027565 0ustar00meebeymeebey00000000000000namespace Twitterizer { using System.Collections.ObjectModel; /// /// Provides optional parameters for user lookup methods. /// public class LookupUsersOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public LookupUsersOptions() { this.ScreenNames = new Collection(); this.UserIds = new TwitterIdCollection(); } /// /// Gets or sets the screen names. /// /// The screen names. public Collection ScreenNames { get; set; } /// /// Gets or sets the user ids. /// /// The user ids. public TwitterIdCollection UserIds { get; set; } /// /// Gets or sets a value indicating whether [include entities]. /// /// true if [include entities]; otherwise, false. public bool IncludeEntities { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/UserSearchCommand.cs0000644000175000017500000000774412132510633027261 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The user search command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The User Search Command class. /// internal sealed class UserSearchCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The query. /// The options. public UserSearchCommand(OAuthTokens tokens, string query, UserSearchOptions options) : base(HTTPVerb.GET, "users/search.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(query)) { throw new ArgumentNullException("query"); } this.Query = query; } /// /// Gets or sets the query. /// /// The query. public string Query { get; set; } /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("q", this.Query); UserSearchOptions options = this.OptionalProperties as UserSearchOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.NumberPerPage > 0) this.RequestParameters.Add("per_page", options.NumberPerPage.ToString(CultureInfo.InvariantCulture)); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/LookupUsersCommand.cs0000644000175000017500000001014712132510633027477 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The user lookup command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Linq; /// /// The Lookup Users command class. /// #if !SILVERLIGHT [Serializable] #endif internal sealed class LookupUsersCommand : Core.TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public LookupUsersCommand(OAuthTokens tokens, LookupUsersOptions options) : base(HTTPVerb.GET, "users/lookup.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (options == null) { throw new ArgumentNullException("options"); } if (options.ScreenNames.Count == 0 && options.UserIds.Count == 0) { throw new ArgumentException("At least one screen name or user id must be specified."); } } /// /// Inits this instance. /// public override void Init() { LookupUsersOptions options = this.OptionalProperties as LookupUsersOptions; if (options == null) { throw new NullReferenceException("The optional parameters class is not valid for this command."); } if (options.UserIds.Count > 0) this.RequestParameters.Add("user_id", string.Join(",", options.UserIds.Where(id => id > 0).Select(id => id.ToString()).ToArray())); if (options.ScreenNames.Count > 0) this.RequestParameters.Add("screen_name", string.Join(",", options.ScreenNames.ToArray())); if (options.IncludeEntities) this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/TwitterUser.cs0000644000175000017500000005702712503640373026225 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterUser class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Diagnostics; #if !SILVERLIGHT using System.Drawing; #endif using Newtonsoft.Json; using Core; using System.Runtime.Serialization; /// [JsonObject(MemberSerialization.OptIn)] [DebuggerDisplay("@{ScreenName}")] #if !SILVERLIGHT [Serializable] #endif [DataContract] public class TwitterUser : TwitterObject { #region Properties /// /// Gets or sets the User ID. /// /// The User ID. [DataMember, JsonProperty(PropertyName = "id")] public decimal Id { get; set; } /// /// Gets or sets the string id. /// /// The string id. [DataMember, JsonProperty(PropertyName = "id_str")] public string StringId { get; set; } /// /// Gets or sets the name of the user. /// /// The name of the user. [DataMember, JsonProperty(PropertyName = "name")] public string Name { get; set; } /// /// Gets or sets the location. /// /// The location. [DataMember, JsonProperty(PropertyName = "location")] public string Location { get; set; } /// /// Gets or sets the description. /// /// The description. [DataMember, JsonProperty(PropertyName = "description")] public string Description { get; set; } /// /// Gets or sets a value indicating whether the user has not altered the theme or background of their profile. /// /// false if the user has altered the theme or background of their profile; otherwise, true. [DataMember, JsonProperty(PropertyName = "default_profile")] public bool IsDefaultProfile { get; set; } /// /// Gets or sets a value indicating whether the user has not uploaded their own avatar and a default egg avatar is used instead. /// /// false if the user has uploaded their own avatar and a default egg avatar is used instead; otherwise, true. [DataMember, JsonProperty(PropertyName = "default_profile_image")] public bool IsDefaultProfileImage { get; set; } /// /// Gets or sets a value indicating whether this user is a translator. /// /// true if this user is translator; otherwise, false. [DataMember, JsonProperty(PropertyName = "is_translator")] public bool IsTranslator { get; set; } /// /// Gets or sets the status. /// /// The status. [DataMember, JsonProperty(PropertyName = "status")] public TwitterStatus Status { get; set; } /// /// Gets or sets the created date. /// /// The created date. [JsonProperty(PropertyName = "created_at")] [JsonConverter(typeof(TwitterizerDateConverter))] [DataMember] public DateTime? CreatedDate { get; set; } /// /// Gets or sets the time zone. /// /// The time zone. [DataMember, JsonProperty(PropertyName = "time_zone")] public string TimeZone { get; set; } /// /// Gets or sets the number of followers. /// /// The number of followers. [DataMember, JsonProperty(PropertyName = "followers_count")] public long? NumberOfFollowers { get; set; } /// /// Gets or sets the number of statuses. /// /// The number of statuses. [DataMember, JsonProperty(PropertyName = "statuses_count")] public long NumberOfStatuses { get; set; } /// /// Gets or sets the number of friends. /// /// The number of friends. [DataMember, JsonProperty(PropertyName = "friends_count")] public long NumberOfFriends { get; set; } /// /// Gets or sets a value indicating whether the user has enabled contributors access to his or her account. /// /// The is contributors enabled value. [DataMember, JsonProperty(PropertyName = "contributors_enabled")] public bool IsContributorsEnabled { get; set; } /// /// Gets or sets the language. /// /// The language. [DataMember, JsonProperty(PropertyName = "lang")] public string Language { get; set; } /// /// Gets or sets the screenname. /// /// The screenname. [DataMember, JsonProperty(PropertyName = "screen_name")] public string ScreenName { get; set; } /// /// Gets or sets the number of favorites. /// /// The number of favorites. [DataMember, JsonProperty(PropertyName = "favourites_count")] public long NumberOfFavorites { get; set; } /// /// Gets or sets a value indicating whether this user is protected. /// /// /// true if this user is protected; otherwise, false. /// [DataMember, JsonProperty(PropertyName = "protected")] public bool IsProtected { get; set; } /// /// Gets or sets a value indicating whether this user is geo enabled. /// /// /// true if this user is geo enabled; otherwise, false. /// [DataMember, JsonProperty(PropertyName = "geo_enabled")] public bool? IsGeoEnabled { get; set; } /// /// Gets or sets the countries the user is withheld from. /// /// The countries withheld from. /// See also: https://dev.twitter.com/blog/new-withheld-content-fields-api-responses [DataMember, JsonProperty(PropertyName = "withheld_in_countries")] public string CountriesWithheld { get; set; } /// /// Gets or sets a value that indicates whether the content being withheld is the "status" or a "user." /// /// The withheld scope. /// See also: https://dev.twitter.com/blog/new-withheld-content-fields-api-responses [DataMember, JsonProperty(PropertyName = "withheld_scope")] public string WithheldScope { get; set; } /// /// Gets or sets the time zone offset. /// /// The time zone offset. /// Also called the Coordinated Universal Time (UTC) offset. [DataMember, JsonProperty(PropertyName = "utc_offset")] public double? TimeZoneOffset { get; set; } /// /// Gets or sets the user's website. /// /// The website address. [DataMember, JsonProperty(PropertyName = "url")] public string Website { get; set; } /// /// Gets or sets the listed count. /// /// The listed count. [DataMember, JsonProperty(PropertyName = "listed_count")] public int ListedCount { get; set; } /// /// Gets or sets a value indicating whether [follow request sent]. /// /// true if [follow request sent]; otherwise, false. [DataMember, JsonProperty(PropertyName = "follow_request_sent")] public bool? FollowRequestSent { get; set; } /// /// Gets or sets a value indicating whether the user is verified. /// /// true if the user is verified; otherwise, false. [DataMember, JsonProperty(PropertyName = "verified")] public bool? Verified { get; set; } #region Profile Layout Properties /// /// Gets or sets the color of the profile background. /// /// The color of the profile background. [DataMember, JsonProperty(PropertyName = "profile_background_color")] public string ProfileBackgroundColorString { get; set; } #if !SILVERLIGHT /// /// Gets the color of the profile background. /// /// The color of the profile background. [DataMember] public Color ProfileBackgroundColor { get { return ConversionUtility.FromTwitterString(this.ProfileBackgroundColorString); } } #endif /// /// Gets or sets a value indicating whether this user's profile background image is tiled. /// /// /// true if this user's profile background image is tiled; otherwise, false. /// [DataMember, JsonProperty(PropertyName = "profile_background_tile")] public bool? IsProfileBackgroundTiled { get; set; } /// /// Gets or sets the color of the profile link. /// /// The color of the profile link. [DataMember, JsonProperty(PropertyName = "profile_link_color")] public string ProfileLinkColorString { get; set; } #if !SILVERLIGHT /// /// Gets the color of the profile link. /// /// The color of the profile link. [DataMember] public Color ProfileLinkColor { get { return ConversionUtility.FromTwitterString(this.ProfileLinkColorString); } } #endif /// /// Gets or sets the profile background image location. /// /// The profile background image location. [DataMember, JsonProperty(PropertyName = "profile_background_image_url")] public string ProfileBackgroundImageLocation { get; set; } /// /// Gets or sets a value indicating whether the user wants their uploaded background image to be used. /// /// true if the user wants their uploaded background image to be used; otherwise, false. [DataMember, JsonProperty(PropertyName = "profile_use_background_image")] public bool UseProfileBackgroundImage { get; set; } /// /// Gets or sets the HTTPS-based URL pointing to the standard web representation of the user's uploaded profile banner. /// /// By adding a final path element of the URL, you can obtain different image sizes optimized for specific displays. See also: https://dev.twitter.com/docs/user-profile-images-and-banners /// The profile banner location. [DataMember, JsonProperty(PropertyName = "profile_banner_url")] public string ProfileBannerLocation { get; set; } /// /// Gets or sets the color of the profile text. /// /// The color of the profile text. [DataMember, JsonProperty(PropertyName = "profile_text_color")] public string ProfileTextColorString { get; set; } #if !SILVERLIGHT /// /// Gets the color of the profile text. /// /// The color of the profile text. [DataMember] public Color ProfileTextColor { get { return ConversionUtility.FromTwitterString(this.ProfileTextColorString); } } #endif /// /// Gets or sets the profile image location. /// /// The profile image location. [DataMember, JsonProperty(PropertyName = "profile_image_url")] public string ProfileImageLocation { get; set; } /// /// Gets or sets the secure profile image location (https). /// /// The profile image location. [DataMember, JsonProperty(PropertyName = "profile_image_url_https")] public string ProfileImageSecureLocation { get; set; } /// /// Gets or sets the color of the profile sidebar border. /// /// The color of the profile sidebar border. [DataMember, JsonProperty(PropertyName = "profile_sidebar_border_color")] public string ProfileSidebarBorderColorString { get; set; } #if !SILVERLIGHT /// /// Gets the color of the profile sidebar border. /// /// The color of the profile sidebar border. [DataMember] public Color ProfileSidebarBorderColor { get { return ConversionUtility.FromTwitterString(this.ProfileSidebarBorderColorString); } } #endif /// /// Gets or sets the profile sidebar fill color string. /// /// The profile sidebar fill color string. [DataMember, JsonProperty(PropertyName = "profile_sidebar_fill_color")] public string ProfileSidebarFillColorString { get; set; } #if !SILVERLIGHT /// /// Gets the color of the profile sidebar fill. /// /// The color of the profile sidebar fill. [DataMember] public Color ProfileSidebarFillColor { get { return ConversionUtility.FromTwitterString(this.ProfileSidebarFillColorString); } } #endif #endregion #endregion /// /// public static TwitterResponse Show(OAuthTokens tokens, decimal id, OptionalProperties options) { Commands.ShowUserCommand command = new Commands.ShowUserCommand(tokens, id, string.Empty, options); return Core.CommandPerformer.PerformAction(command); } /// /// public static TwitterResponse Show(decimal id, OptionalProperties options) { return Show(null, id, options); } /// /// public static TwitterResponse Show(OAuthTokens tokens, decimal id) { return Show(tokens, id, null); } /// /// public static TwitterResponse Show(decimal id) { return Show(null, id, null); } /// /// public static TwitterResponse Show(OAuthTokens tokens, string username, OptionalProperties options) { Commands.ShowUserCommand command = new Commands.ShowUserCommand(tokens, 0, username, options); return Core.CommandPerformer.PerformAction(command); } /// /// public static TwitterResponse Show(string username, OptionalProperties options) { return Show(null, username, options); } /// /// public static TwitterResponse Show(OAuthTokens tokens, string username) { return Show(tokens, username, null); } /// /// public static TwitterResponse Show(string username) { return Show(null, username, null); } /// /// public static TwitterResponse Search(OAuthTokens tokens, string query, UserSearchOptions options) { Commands.UserSearchCommand command = new Commands.UserSearchCommand(tokens, query, options); return Core.CommandPerformer.PerformAction(command); } /// /// public static TwitterResponse Search(OAuthTokens tokens, string query) { return Search(tokens, query, null); } /// /// Return up to 100 users worth of extended information, specified by either ID, screen name, or combination of the two. /// /// The tokens. /// The options. /// public static TwitterResponse Lookup(OAuthTokens tokens, LookupUsersOptions options) { Commands.LookupUsersCommand command = new Commands.LookupUsersCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } #region Retweeted By /// /// Show user objects of up to 100 members who retweeted the status. /// /// The tokens. /// The status id. /// The options. /// A collection of user objects. public static TwitterResponse RetweetedBy(OAuthTokens tokens, decimal statusId, RetweetedByOptions options) { Commands.RetweetedByCommand command = new Commands.RetweetedByCommand(tokens, statusId, options); return Core.CommandPerformer.PerformAction(command); } /// /// Show user objects of up to 100 members who retweeted the status. /// /// The tokens. /// The status id. /// A collection of user objects. public static TwitterResponse RetweetedBy(OAuthTokens tokens, decimal statusId) { return RetweetedBy(tokens, statusId, null); } /// /// Show user ids of up to 100 members who retweeted the status. /// /// The tokens. /// The status id. /// The options. /// A collection of user ids. public static TwitterResponse RetweetedByIds(OAuthTokens tokens, decimal statusId, RetweetedByIdsOptions options) { Commands.RetweetedByIdsCommand command = new Commands.RetweetedByIdsCommand(tokens, statusId, options); return Core.CommandPerformer.PerformAction(command); } /// /// Show user ids of up to 100 members who retweeted the status. /// /// The tokens. /// The status id. /// A collection of user ids. public static TwitterResponse RetweetedByIds(OAuthTokens tokens, decimal statusId) { return RetweetedByIds(tokens, statusId, null); } #endregion } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/UserSearchOptions.cs0000644000175000017500000000537012132510633027327 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The user search options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The user search options class. Provides a payload for optional parameters of the UserSearchCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class UserSearchOptions : OptionalProperties { /// /// Gets or sets the number per page. Cannot be greater than 20. /// /// The number per page. public int NumberPerPage { get; set; } /// /// Gets or sets the page of results to retrieve. /// /// The page of results to retrieve. public int Page { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/ShowUserCommand.cs0000644000175000017500000001007712503640373026774 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The 'Show User' command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The Show User Command /// /// http://dev.twitter.com/doc/get/users/show #if !SILVERLIGHT [Serializable] #endif internal sealed class ShowUserCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The user id. /// The username. /// The options. public ShowUserCommand(OAuthTokens tokens, decimal userId, string username, OptionalProperties options) : base(HTTPVerb.GET, "users/show.json", tokens, options) { if ((userId <= 0 && string.IsNullOrEmpty(username)) || (userId > 0 && !string.IsNullOrEmpty(username))) { throw new ArgumentException("Either userId or username must be supplied, but not both."); } this.UserId = userId; this.Username = username; } /// /// Gets or sets the user ID. /// /// The user ID. public decimal UserId { get; set; } /// /// Gets or sets the name of the user. /// /// The name of the user. public string Username { get; set; } /// /// Inits this instance. /// public override void Init() { if (this.UserId > 0) this.RequestParameters.Add("user_id", this.UserId.ToString("#")); if (!string.IsNullOrEmpty(this.Username)) this.RequestParameters.Add("screen_name", this.Username); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/SuggestedUsersCommand.cs0000644000175000017500000000676212132510633030170 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The suggested users command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; /// /// The suggested users command class /// /// http://dev.twitter.com/doc/get/users/suggestions/:slug internal class SuggestedUsersCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The category slug. /// The options. public SuggestedUsersCommand(OAuthTokens tokens, string categorySlug, OptionalProperties options) : base(HTTPVerb.GET, string.Format("users/suggestions/{0}.json", categorySlug), tokens, options) { if (string.IsNullOrEmpty(categorySlug)) { throw new ArgumentNullException("categorySlug", "A category slug is required"); } this.Slug = categorySlug; } /// /// Gets or sets the slug. /// /// The slug. public string Slug { get; set; } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("slug", this.Slug); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/RetweetedByIdsCommand.cs0000644000175000017500000000760212132510633030071 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Fabien Warniez // The retweeted by ids command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; /// /// The retweeted by ids command class. /// /// http://dev.twitter.com/doc/get/statuses/:id/retweeted_by/ids [AuthorizedCommandAttribute] internal class RetweetedByIdsCommand : TwitterCommand { public RetweetedByIdsCommand(OAuthTokens tokens, decimal statusId, RetweetedByIdsOptions options) : base(HTTPVerb.GET, string.Format("statuses/{0}/retweeted_by/ids.json", statusId), tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (statusId <= 0) { throw new ArgumentNullException("statusId", "Status ID is required."); } } /// /// Inits this instance. /// public override void Init() { RetweetedByIdsOptions options = this.OptionalProperties as RetweetedByIdsOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.Count > 1) { this.RequestParameters.Add("count", options.Count.ToString()); } if (options.IncludeEntities) { this.RequestParameters.Add("include_entities", "true"); } if (options.TrimUser) { this.RequestParameters.Add("trim_user", "true"); } if (options.Page > 0) { this.RequestParameters.Add("page", options.Page.ToString()); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/SuggestedUserCategoriesCommand.cs0000644000175000017500000000607312132510633032006 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The suggested user categories command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; /// /// The suggested users categories command /// /// http://dev.twitter.com/doc/get/users/suggestions #if !SILVERLIGHT [Serializable] #endif internal class SuggestedUserCategoriesCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public SuggestedUserCategoriesCommand(OAuthTokens tokens, OptionalProperties options) : base(HTTPVerb.GET, "users/suggestions.json", tokens, options) { } /// /// Inits this instance. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/RetweetedByIdsOptions.cs0000644000175000017500000000660512132510633030150 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // The retweeted by ids options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional properties class for the method. /// /// public class RetweetedByIdsOptions : OptionalProperties { /// /// Specifies the number of records to retrieve. Must be less than or equal to 100. /// /// The count. public int Count { get; set; } /// /// Specifies the page of results to retrieve. /// /// The page. public int Page { get; set; } /// /// When set to true each tweet returned in a timeline will include a user object including only the status authors numerical ID. Omit this parameter to receive the complete user object. /// /// true if [trim user]; otherwise, false. public bool TrimUser { get; set; } /// /// Gets or sets a value indicating whether entities should be included in the results. /// /// true if entities should be included; otherwise, false. public bool IncludeEntities { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/FriendsOptions.cs0000644000175000017500000000560112132510633026652 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The friends options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The friends options class. Provides a payload for optional parameters of the class. /// #if !SILVERLIGHT [System.Serializable] #endif public class FriendsOptions : OptionalProperties { /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the user's screen name. /// /// The screen name of the user. public string ScreenName { get; set; } /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/FollowersCommand.cs0000644000175000017500000001050212503640373027162 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The command to obtain followers of a user. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The command to obtain followers of a user. /// #if !SILVERLIGHT [Serializable] #endif internal sealed class FollowersCommand : Core.TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public FollowersCommand(OAuthTokens tokens, FollowersOptions options) : base(HTTPVerb.GET, "statuses/followers.json", tokens, options) { if (tokens == null && options == null) { throw new ArgumentException("You must provide an authorization token or specify a user."); } if (tokens == null && options != null && options.UserId <= 0 && string.IsNullOrEmpty(options.ScreenName)) { throw new ArgumentException("Either a user id or screen name (but not both) must be supplied (using the options parameter) when called unauthorized."); } this.DeserializationHandler = TwitterUserCollection.DeserializeWrapper; } /// /// Initializes the command. /// public override void Init() { // Default values this.RequestParameters.Add("cursor", "-1"); // Handle optional parameters FollowersOptions options = this.OptionalProperties as FollowersOptions; if (options == null) { return; } if (options.UserId > 0) this.RequestParameters.Add("user_id", options.UserId.ToString("#")); if (!string.IsNullOrEmpty(options.ScreenName)) this.RequestParameters.Add("screen_name", options.ScreenName); // Override the default if (options.Cursor != 0) this.RequestParameters["cursor"] = options.Cursor.ToString(CultureInfo.CurrentCulture); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/TwitterUserCategory.cs0000644000175000017500000001467712132510633027720 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterUserCategory and TwitterUserCategoryCollection classes. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Newtonsoft.Json; using Twitterizer.Core; /// /// Represents a suggested user category /// #if !SILVERLIGHT [Serializable] #endif public class TwitterUserCategory : Core.TwitterObject { /// /// Gets or sets the name. /// /// The name. [JsonProperty(PropertyName = "name")] public string Name { get; set; } /// /// Gets or sets the slug. /// /// The slug. [JsonProperty(PropertyName = "slug")] public string Slug { get; set; } /// /// Gets or sets the number of users. /// Only available in list of categories. /// /// The number of users. [JsonProperty(PropertyName = "size")] public int NumberOfUsers { get; set; } /// /// Gets or sets the users. /// Users are only returned for a single category. /// /// The users. [JsonProperty(PropertyName = "users")] public TwitterUserCollection Users { get; set; } /// /// Access to Twitter's suggested user list. This returns the list of suggested user categories. The category can be used in the users/suggestions/category endpoint to get the users in that category. /// /// The tokens. /// The options. /// A collection of categories without user data. public static TwitterResponse SuggestedUserCategories(OAuthTokens tokens, OptionalProperties options) { Commands.SuggestedUserCategoriesCommand command = new Commands.SuggestedUserCategoriesCommand(tokens, options); return CommandPerformer.PerformAction(command); } /// /// Access to Twitter's suggested user list. This returns the list of suggested user categories. The category can be used in the users/suggestions/category endpoint to get the users in that category. /// /// The tokens. /// /// A collection of categories without user data. /// public static TwitterResponse SuggestedUserCategories(OAuthTokens tokens) { return SuggestedUserCategories(tokens, null); } /// /// Access the users in a given category of the Twitter suggested user list. /// /// The tokens. /// The category slug. /// The options. /// /// It is recommended that end clients cache this data for no more than one hour. public static TwitterResponse SuggestedUsers(OAuthTokens tokens, string categorySlug, OptionalProperties options) { Commands.SuggestedUsersCommand command = new Commands.SuggestedUsersCommand(tokens, categorySlug, options); return CommandPerformer.PerformAction(command); } /// /// Access the users in a given category of the Twitter suggested user list. /// /// The tokens. /// The category slug. /// /// It is recommended that end clients cache this data for no more than one hour. public static TwitterResponse SuggestedUsers(OAuthTokens tokens, string categorySlug) { return SuggestedUsers(tokens, categorySlug, null); } } /// /// Represents a suggested category /// #if !SILVERLIGHT [Serializable] #endif public class TwitterUserCategoryCollection : Core.TwitterCollection, ITwitterObject { // This intentionally left blank. // Check out Girl Talk. He's a great DJ. } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/RetweetedByOptions.cs0000644000175000017500000000646712132510633027516 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweeted by options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional parameters for the class. /// public class RetweetedByOptions : OptionalProperties { /// /// Specifies the number of records to retrieve. Must be less than or equal to 100. /// /// The count. public int Count { get; set; } /// /// Specifies the page of results to retrieve. /// /// The page. public int Page { get; set; } /// /// When set to true each tweet returned in a timeline will include a user object including only the status authors numerical ID. Omit this parameter to receive the complete user object. /// /// true if [trim user]; otherwise, false. public bool TrimUser { get; set; } /// /// Gets or sets a value indicating whether entities should be included in the results. /// /// true if entities should be included; otherwise, false. public bool IncludeEntities { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/User/TwitterUser.xml0000644000175000017500000002611612132510633026404 0ustar00meebeymeebey00000000000000 The TwitterUser class represents a twitter user account and provides methods for interacting with user-centric API methods. Returns extended information of a given user, specified by ID or screen name as per the required id parameter. The author's most recent status will be returned inline. A new instance of the class. This method interacts with the users/show API endpoint. Documentation can be found here: http://dev.twitter.com/doc/get/users/show Indicates that a required argument was not supplied. Indicates that an argument supplied was not valid. The tokens. The user id. Optional parameters for runtime configuration settings. // Declare the user's id variable decimal userId = 1; // Declare the options object for configuration settings OptionalProperties options = new OptionalProperties(); // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(tokens, userId, options); '-- Declare the user's id variable Dim userId As decimal = 1 '-- Declare the options object for configuration settings Dim options As new OptionalProperties() '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(tokens, userId, options) The user id. Optional parameters for runtime configuration settings. // Declare the user's id variable decimal userId = 1; // Declare the options object for configuration settings OptionalProperties options = new OptionalProperties(); // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(userId, options); '-- Declare the user's id variable Dim userId As decimal = 1 '-- Declare the options object for configuration settings Dim options As new OptionalProperties() '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(userId, options) The tokens. The user id. // Declare the user's id variable decimal userId = 1; // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(tokens, userId); '-- Declare the user's id variable Dim userId As decimal = 1 '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(tokens, userId) The user id. // Declare the user's id variable decimal userId = 1; // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(userId); '-- Declare the user's id variable Dim userId As decimal = 1 '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(userId) The tokens. The user name. The options. // Declare the username variable string userName = "twit_er_izer"; // Declare the options object for configuration settings OptionalProperties options = new OptionalProperties(); // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(tokens, userName, options); '-- Declare the user's id variable Dim UserName As String = "twit_er_izer" '-- Declare the options object for configuration settings Dim options As new OptionalProperties() '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(tokens, UserName, options) The tokens. The user name. // Declare the username variable string userName = "twit_er_izer"; // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(tokens, userName); '-- Declare the user's id variable Dim UserName As String = "twit_er_izer" '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(tokens, UserName, options) The user name. The options. // Declare the username variable string userName = "twit_er_izer"; // Declare the options object for configuration settings OptionalProperties options = new OptionalProperties(); // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(userName, options); '-- Declare the user's id variable Dim UserName As String = "twit_er_izer" '-- Declare the options object for configuration settings Dim options As new OptionalProperties() '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(UserName, options) The user name. // Declare the username variable string userName = "twit_er_izer"; // Declare our user variable and fetch the user's details TwitterResponse<TwitterUser> user = TwitterUser.Show(userName); '-- Declare the user's id variable Dim UserName As String = "twit_er_izer" '-- Declare our user variable and fetch the user's details Dim user As TwitterResponse(Of TwitterUser) = TwitterUser.Show(UserName) Run a search for users similar to the Find People button on Twitter.com; the same results returned by people search on Twitter.com will be returned by using this API. This method interacts with the users/search API endpoint. Documentation can be found here: http://dev.twitter.com/doc/get/users/search Indicates that a required argument was not supplied. Indicates that an argument supplied was not valid. A instance. The OAuth access tokens. The search query. Optional parameters. // Declare the search query string query = "from:twit_er_izer @twitterapi"; // Declare the optional parameter object UserSearchOptions options = new UserSearchOptions(); options.NumberPerPage = 10; options.Page = 2; // Perform the search TwitterResponse<TwitterUserCollection> searchResults = TwitterUser.Search(oauthTokens, query, options); '-- Declare the search query Dim Query As String = "from:twit_er_izer @twitterapi" '-- Declare the optional parameter object Dim options As new UserSearchOptions() options.NumberPerPage = 10 options.Page = 2 '-- Perform the search Dim searchResults As TwitterResponse(Of TwitterUserCollection) = TwitterUser.Search(oauthTokens, query, options) The OAuth access tokens. The search query. // Declare the search query string query = "from:twit_er_izer @twitterapi"; // Perform the search TwitterResponse<TwitterUserCollection> searchResults = TwitterUser.Search(oauthTokens, query); '-- Declare the search query Dim Query As String = "from:twit_er_izer @twitterapi" '-- Perform the search Dim searchResults As TwitterResponse(Of TwitterUserCollection) = TwitterUser.Search(oauthTokens, query) smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Spam/0000755000175000017500000000000012503640373023344 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Spam/ReportSpamCommand.cs0000644000175000017500000000754012503640373027274 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterAccount class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System.Globalization; using Twitterizer.Core; using System; internal class ReportSpamCommand : TwitterCommand { /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the name of the screen. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Initializes a new instance of the class. /// /// The tokens. /// The user id. /// Name of the screen. /// The options. public ReportSpamCommand(OAuthTokens tokens, decimal userId, string screenName, OptionalProperties options) : base(HTTPVerb.POST, "report_spam.json", tokens, options) { if (string.IsNullOrEmpty(screenName) && userId <= 0) { throw new ArgumentException("A screen name or user id is required."); } this.ScreenName = screenName; this.UserId = userId; } /// /// Inits this instance. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.ScreenName)) { this.RequestParameters.Add("screen_name", this.ScreenName); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Spam/TwitterSpam.cs0000644000175000017500000001063012253423361026154 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterSpam class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Provides methods for reporting users and tweets as inappropriate or spam. /// public class TwitterSpam { /// /// Blocks the user and reports them for spam/abuse. /// /// The tokens. /// The user id. /// The options. /// The user details. public static TwitterResponse ReportUser(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.ReportSpamCommand command = new Commands.ReportSpamCommand(tokens, userId, string.Empty, options); return Core.CommandPerformer.PerformAction(command); } /// /// Blocks the user and reports them for spam/abuse. /// /// The tokens. /// The user id. /// The user details. public static TwitterResponse ReportUser(OAuthTokens tokens, decimal userId) { return ReportUser(tokens, userId, null); } /// /// Blocks the user and reports them for spam/abuse. /// /// The tokens. /// The user's screen name. /// The options. /// The user details. public static TwitterResponse ReportUser(OAuthTokens tokens, string screenName, OptionalProperties options) { Commands.ReportSpamCommand command = new Commands.ReportSpamCommand(tokens, 0, screenName, options); return Core.CommandPerformer.PerformAction(command); } /// /// Blocks the user and reports them for spam/abuse. /// /// The tokens. /// The user's screen name. /// The user details. public static TwitterResponse ReportUser(OAuthTokens tokens, string screenName) { return ReportUser(tokens, screenName, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/0000755000175000017500000000000012652472053023722 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/RetweetsOptions.cs0000644000175000017500000000501612132510633027417 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweets options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The Retweets Options class. Provides a payload for optional parameters for the Retweets Command /// #if !SILVERLIGHT [System.Serializable] #endif public class RetweetsOptions : OptionalProperties { /// /// Gets or sets the count of statuses to return. /// /// The number of statuses to return. public int Count { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/RetweetCommand.cs0000644000175000017500000000712612132510633027163 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweet command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The retweet command class. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class RetweetCommand : TwitterCommand { /// /// The base address to the API method. /// private const string Path = "statuses/retweet/{0}.json"; #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status id. /// The options. public RetweetCommand(OAuthTokens tokens, decimal statusId, OptionalProperties options) : base( HTTPVerb.POST, string.Format(CultureInfo.InvariantCulture, Path, statusId), tokens, options) { if (statusId <= 0) { throw new ArgumentException("Status ID is invalid", "statusId"); } if (tokens == null) { throw new ArgumentNullException("tokens"); } } #endregion /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/TwitterStatusCollection.cs0000644000175000017500000000517012132510633031124 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The collection of TwitterStatus objects. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Runtime.Serialization; using Twitterizer.Core; /// /// The TwitterStatusCollection class. /// #if !SILVERLIGHT [Serializable] #endif [DataContract] public class TwitterStatusCollection : TwitterCollection, ITwitterObject { /// /// Gets or sets the current page number. /// /// The current page number. [DataMember] public int Page { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/StatusUpdateOptions.cs0000644000175000017500000000741612253423361030256 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The status update options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The Status Update Options class /// #if !SILVERLIGHT [System.Serializable] #endif public sealed class StatusUpdateOptions : OptionalProperties { /// /// Gets or sets the in reply to status id. /// /// The in reply to status id. public decimal InReplyToStatusId { get; set; } /// /// Gets or sets the latitude. /// /// The latitude. public double Latitude { get; set; } /// /// Gets or sets the longitude. /// /// The longitude. public double Longitude { get; set; } /// /// Gets or sets a value indicating whether or not to put a pin on the exact coordinates a tweet has been sent from. /// /// true to put a pin on the exact coordinates; otherwise, false. public bool PlacePin { get; set; } /// /// Gets or sets a place in the world. These IDs can be retrieved from geo/reverse_geocode. /// /// The place id. public string PlaceId { get; set; } /// /// Gets or sets a value indicating whether links should be wrapped with Twitter's t.co link wrapper. /// /// true if [wrap links]; otherwise, false. /// More information is available here: https://dev.twitter.com/docs/tco-link-wrapper/faq public bool WrapLinks { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/TwitterStatus.cs0000644000175000017500000006063212652472053027126 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterStatus class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Linq; using System.Diagnostics; using Newtonsoft.Json; using Twitterizer.Core; using Twitterizer.Entities; using System.Runtime.Serialization; /// [JsonObject(MemberSerialization.OptIn)] #if !SILVERLIGHT [Serializable] #endif [DebuggerDisplay("{User.ScreenName}/{Text}")] [DataContract] public class TwitterStatus : TwitterObject { #region Properties /// /// Gets or sets the status id. /// /// The status id. [DataMember, JsonProperty(PropertyName = "id")] public decimal Id { get; set; } /// /// Gets or sets the string id. /// /// The string id. [DataMember, JsonProperty(PropertyName = "id_str")] public string StringId { get; set; } /// /// Gets or sets a value indicating whether this status message is truncated. /// /// /// true if this status message is truncated; otherwise, false. /// [DataMember, JsonProperty(PropertyName = "truncated")] public bool? IsTruncated { get; set; } /// /// Gets or sets the created date. /// /// The created date. [DataMember] [JsonProperty(PropertyName = "created_at")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime CreatedDate { get; set; } /// /// Gets or sets the source. /// /// The source. [DataMember, JsonProperty(PropertyName = "source")] public string Source { get; set; } /// /// Gets or sets the screenName the status is in reply to. /// /// The screenName. [DataMember, JsonProperty(PropertyName = "in_reply_to_screen_name")] public string InReplyToScreenName { get; set; } /// /// Gets or sets the user id the status is in reply to. /// /// The user id. [DataMember, JsonProperty(PropertyName = "in_reply_to_user_id")] public decimal? InReplyToUserId { get; set; } /// /// Gets or sets the status id the status is in reply to. /// /// The status id. [DataMember, JsonProperty(PropertyName = "in_reply_to_status_id")] public decimal? InReplyToStatusId { get; set; } /// /// Gets or sets a value indicating whether the authenticated user has favorited this status. /// /// /// true if this instance is favorited; otherwise, false. /// [DataMember, JsonProperty(PropertyName = "favorited")] public bool? IsFavorited { get; set; } /// /// Gets the favorite count string. /// /// /// The Number of favorites. /// [DataMember, JsonProperty(PropertyName = "favorite_count")] public string FavoriteCountString { get; set; } /// /// Gets the Favorite count. /// /// /// The Number of favorites. /// [DataMember] public int? FavoriteCount { get { if (string.IsNullOrEmpty(this.FavoriteCountString)) return null; int parsedResult; if ( this.FavoriteCountString.EndsWith("+") && !int.TryParse(this.FavoriteCountString.Substring(0, this.FavoriteCountString.Length - 1), out parsedResult) ) { return null; } if (!int.TryParse(this.FavoriteCountString, out parsedResult)) { return null; } return parsedResult; } } /// /// Gets or sets the text of the status. /// /// The status text. [DataMember, JsonProperty(PropertyName = "text")] public string Text { get; set; } /// /// Gets or sets the user. /// /// The user that posted this status. [DataMember, JsonProperty(PropertyName = "user")] public TwitterUser User { get; set; } /// /// Gets or sets the retweeted status. /// /// The retweeted status. [DataMember, JsonProperty(PropertyName = "retweeted_status")] public TwitterStatus RetweetedStatus { get; set; } /// /// Gets or sets the place. /// /// The place. [DataMember, JsonProperty(PropertyName = "place")] public TwitterPlace Place { get; set; } /// /// Gets or sets the geo location data. /// /// The geo location data. [DataMember, JsonProperty(PropertyName = "geo")] public TwitterGeo Geo { get; set; } /// /// Gets or sets the entities. /// /// The entities. [DataMember] [JsonProperty(PropertyName = "entities")] [JsonConverter(typeof(Entities.TwitterEntityCollection.Converter))] public Entities.TwitterEntityCollection Entities { get; set; } /// /// Gets or sets the retweet count string. /// /// The retweet count. [DataMember, JsonProperty(PropertyName = "retweet_count")] public string RetweetCountString { get; set; } /// /// Gets the retweet count. /// /// The retweet count. [DataMember] public int? RetweetCount { get { if (string.IsNullOrEmpty(this.RetweetCountString)) return null; int parsedResult; if ( this.RetweetCountString.EndsWith("+") && !int.TryParse(this.RetweetCountString.Substring(0, this.RetweetCountString.Length - 1), out parsedResult) ) { return null; } if (!int.TryParse(this.RetweetCountString, out parsedResult)) { return null; } return parsedResult; } } /// /// Gets a value indicating that the number of retweets exceeds the reported value in RetweetCount. For example, "more than 100" /// /// The retweet count plus indicator. [DataMember] public bool? RetweetCountPlus { get { if (string.IsNullOrEmpty(this.RetweetCountString)) return null; return this.RetweetCountString.EndsWith("+"); } } /// /// Gets or sets a value indicating whether this is retweeted. /// /// true if retweeted; otherwise, false. [DataMember, JsonProperty(PropertyName = "retweeted")] public bool Retweeted { get; set; } /// /// Gets or sets the quoted tweet. /// /// The quoted tweet. [DataMember, JsonProperty(PropertyName = "quoted_status")] public TwitterStatus QuotedStatus { get; set; } /// /// Gets or sets the quoted tweet id. /// /// The status id. [DataMember, JsonProperty(PropertyName = "quoted_status_id")] public decimal? QuotedStatusId { get; set; } /// /// Gets or sets the quoted tweet string id. /// /// The string id. [DataMember, JsonProperty(PropertyName = "quoted_status_id_str")] public string QuotedStatusStringId { get; set; } #endregion /// /// Returns the status text with HTML links to users, urls, and hashtags. /// /// public string LinkifiedText() { return LinkifiedText(Entities, Text); } internal static string LinkifiedText(TwitterEntityCollection entities, string text) { if (entities == null || entities.Count == 0) { return text; } string linkedText = text; var entitiesSorted = entities.OrderBy(e => e.StartIndex).Reverse(); foreach (TwitterEntity entity in entitiesSorted) { if (entity is TwitterHashTagEntity) { TwitterHashTagEntity tagEntity = (TwitterHashTagEntity)entity; linkedText = string.Format( "{0}{1}{2}", linkedText.Substring(0, entity.StartIndex), tagEntity.Text, linkedText.Substring(entity.EndIndex)); } if (entity is TwitterUrlEntity) { TwitterUrlEntity urlEntity = (TwitterUrlEntity)entity; linkedText = string.Format( "{0}{1}{2}", linkedText.Substring(0, entity.StartIndex), urlEntity.Url, linkedText.Substring(entity.EndIndex)); } if (entity is TwitterMentionEntity) { TwitterMentionEntity mentionEntity = (TwitterMentionEntity)entity; linkedText = string.Format( "{0}@{1}{2}", linkedText.Substring(0, entity.StartIndex), mentionEntity.ScreenName, linkedText.Substring(entity.EndIndex)); } } return linkedText; } /// /// Updates the authenticating user's status. A status update with text identical to the authenticating user's text identical to the authenticating user's current status will be ignored to prevent duplicates. /// /// The tokens. /// The status text. /// A object of the newly created status. public static TwitterResponse Update(OAuthTokens tokens, string text) { return Update(tokens, text, null); } /// /// Updates the authenticating user's status. A status update with text identical to the authenticating user's text identical to the authenticating user's current status will be ignored to prevent duplicates. /// /// The tokens. /// The status text. /// The options. /// /// A object of the newly created status. /// public static TwitterResponse Update(OAuthTokens tokens, string text, StatusUpdateOptions options) { return CommandPerformer.PerformAction(new Commands.UpdateStatusCommand(tokens, text, options)); } /// /// Updates the authenticating user's status. A status update with text identical to the authenticating user's text identical to the authenticating user's current status will be ignored to prevent duplicates. /// /// The tokens. /// The status text. /// The file to upload, as a byte array. /// The options. /// /// A object of the newly created status. /// public static TwitterResponse UpdateWithMedia(OAuthTokens tokens, string text, byte[] fileData, StatusUpdateOptions options = null) { return CommandPerformer.PerformAction(new Commands.UpdateWithMediaCommand(tokens, text, fileData, options)); } /// /// Updates the authenticating user's status. A status update with text identical to the authenticating user's text identical to the authenticating user's current status will be ignored to prevent duplicates. /// /// The tokens. /// The status text. /// The file location. /// The options. /// /// A object of the newly created status. /// public static TwitterResponse UpdateWithMedia(OAuthTokens tokens, string text, string fileLocation, StatusUpdateOptions options = null) { return UpdateWithMedia(tokens, text, System.IO.File.ReadAllBytes(fileLocation), options); } /// /// Deletes the specified status. /// /// The oauth tokens. /// The status id. /// The options. /// /// A object of the deleted status. /// public static TwitterResponse Delete(OAuthTokens tokens, decimal id, OptionalProperties options) { Commands.DeleteStatusCommand command = new Twitterizer.Commands.DeleteStatusCommand(tokens, id, options); return CommandPerformer.PerformAction(command); } /// /// Deletes the specified status. /// /// The oauth tokens. /// The status id. /// A object of the deleted status. public static TwitterResponse Delete(OAuthTokens tokens, decimal id) { return Delete(tokens, id, null); } /// /// Returns a single status, with user information, specified by the id parameter. /// /// The tokens. /// The status id. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal statusId, OptionalProperties options) { return CommandPerformer.PerformAction(new Commands.ShowStatusCommand(tokens, statusId, options)); } /// /// Returns a single status, with user information, specified by the id parameter. /// /// The tokens. /// The status id. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal statusId) { return Show(tokens, statusId, null); } /// /// Returns a single status, with user information, specified by the id parameter. /// /// The status id. /// A instance. public static TwitterResponse Show(decimal statusId) { return Show(null, statusId); } /// /// Retweets a tweet. Requires the id parameter of the tweet you are retweeting. (say that 5 times fast) /// /// The tokens. /// The status id. /// The options. /// A representing the newly created tweet. public static TwitterResponse Retweet(OAuthTokens tokens, decimal statusId, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.RetweetCommand(tokens, statusId, options)); } /// /// Retweets a tweet. Requires the id parameter of the tweet you are retweeting. (say that 5 times fast) /// /// The tokens. /// The status id. /// A representing the newly created tweet. public static TwitterResponse Retweet(OAuthTokens tokens, decimal statusId) { return Retweet(tokens, statusId, null); } /// /// Returns up to 100 of the first retweets of a given tweet. /// /// The tokens. /// The status id. /// The options. /// /// A instance. /// public static TwitterResponse Retweets(OAuthTokens tokens, decimal statusId, RetweetsOptions options) { return CommandPerformer.PerformAction( new Commands.RetweetsCommand(tokens, statusId, options)); } /// /// Returns up to 100 of the first retweets of a given tweet. /// /// The tokens. /// The status id. /// A instance. public static TwitterResponse Retweets(OAuthTokens tokens, decimal statusId) { return Retweets(tokens, statusId, null); } /// /// Retweets a tweet. Requires the id parameter of the tweet you are retweeting. (say that 5 times fast) /// /// The tokens. /// The options. /// /// A representing the newly created tweet. /// public TwitterResponse Retweet(OAuthTokens tokens, OptionalProperties options) { return Retweet(tokens, this.Id, options); } /// /// Retweets a tweet. Requires the id parameter of the tweet you are retweeting. (say that 5 times fast) /// /// The tokens. /// /// A representing the newly created tweet. /// public TwitterResponse Retweet(OAuthTokens tokens) { return Retweet(tokens, this.Id, null); } /// /// Deletes the status. /// /// The oauth tokens. /// The options. /// /// A object of the deleted status. /// public TwitterResponse Delete(OAuthTokens tokens, OptionalProperties options) { return Delete(tokens, this.Id, options); } /// /// Deletes the status. /// /// The oauth tokens. /// /// A object of the deleted status. /// public TwitterResponse Delete(OAuthTokens tokens) { return Delete(tokens, this.Id, null); } /// /// Shows Related Results of a tweet. Requires the id parameter of the tweet you are getting results for. /// /// The tokens. /// The status id. /// A representing the newly created tweet. /// public static TwitterResponse RelatedResultsShow(OAuthTokens tokens, decimal statusId) { return CommandPerformer.PerformAction( new Commands.RelatedResultsCommand(tokens, statusId, null)); } /// /// Shows Related Results of a tweet. Requires the id parameter of the tweet you are getting results for. /// /// The tokens. /// The status id. /// The options. /// A representing the newly created tweet. public static TwitterResponse RelatedResultsShow(OAuthTokens tokens, decimal statusId, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.RelatedResultsCommand(tokens, statusId, options)); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/RetweetsCommand.cs0000644000175000017500000001005412503640373027347 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweets command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The retweets command class. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class RetweetsCommand : TwitterCommand { /// /// Gets or sets the status id. /// /// The status id. public decimal StatusId { get; set; } #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status id. /// The options. public RetweetsCommand(OAuthTokens tokens, decimal statusId, RetweetsOptions options) : base( HTTPVerb.GET, string.Format(CultureInfo.InvariantCulture, "statuses/retweets/{0}.json", statusId), tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (statusId <= 0) { throw new ArgumentNullException("statusId"); } this.StatusId = statusId; } #endregion /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("id", this.StatusId.ToString("#")); RetweetsOptions options = this.OptionalProperties as RetweetsOptions; if (options == null) { return; } if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/UpdateWithmediaCommand.cs0000644000175000017500000001125312652472053030630 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Daan Timmer // The command to update the user's status. (a.k.a. post a new tweet) //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The command to update the user's status. (a.k.a. post a new tweet) /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class UpdateWithMediaCommand : TwitterCommand { /// /// Gets or sets the status text. /// /// The status text. public string Text { get; set; } /// /// Gets or sets the file location. /// /// The file location. public byte[] File { get; set; } /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status text. /// The file to upload, as a byte array. /// The optional properties. public UpdateWithMediaCommand(OAuthTokens tokens, string text, byte[] fileData, StatusUpdateOptions optionalProperties) : base(HTTPVerb.POST, "Set below", tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(text)) { throw new ArgumentNullException("text"); } if (fileData == null || fileData.Length == 0) { throw new ArgumentException("file"); } this.SetCommandUri("statuses/update_with_media.json"); this.Text = text; this.File = fileData; this.Multipart = true; } /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("status", this.Text); this.RequestParameters.Add("media[]", this.File); StatusUpdateOptions options = this.OptionalProperties as StatusUpdateOptions; if (options != null) { if (options.InReplyToStatusId > 0) this.RequestParameters.Add("in_reply_to_status_id", options.InReplyToStatusId.ToString("#")); if (options.Latitude != 0) this.RequestParameters.Add("lat", options.Latitude.ToString()); if (options.Longitude != 0) this.RequestParameters.Add("long", options.Longitude.ToString()); if (!string.IsNullOrEmpty(options.PlaceId)) this.RequestParameters.Add("place_id", options.PlaceId); if (options.PlacePin) this.RequestParameters.Add("display_coordinates", "true"); } } } }smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/RelatedResultsCommand.cs0000644000175000017500000000710212132510633030500 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCpH DAMAGE. // // Edgardo Vega and Ricky Smith // The related results command. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Related Results Command. /// [AuthorizedCommandAttribute] internal sealed class RelatedResultsCommand : TwitterCommand { /// /// The base address to the API method. /// private const string Path = "related_results/show/{0}.json"; /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status id. /// The options. public RelatedResultsCommand(OAuthTokens tokens, decimal statusId, OptionalProperties options) : base( HTTPVerb.GET, string.Format(CultureInfo.InvariantCulture, Path, statusId), tokens, options) { if (statusId <= 0) { throw new ArgumentException("Status ID is invalid", "statusId"); } if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/RetweetsOfMeOptions.cs0000644000175000017500000000615412132510633030172 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweets of me options class. //----------------------------------------------------------------------- namespace Twitterizer { using Twitterizer.Core; /// /// The Retweets of Me options class. Provides optional parameters for the RetweetsOfMeCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class RetweetsOfMeOptions : OptionalProperties { /// /// Gets or sets the since status id. /// /// The since status id. public decimal SinceStatusId { get; set; } /// /// Gets or sets the max status id. /// /// The max status id. public decimal MaxStatusId { get; set; } /// /// Gets or sets the count of tweets to return. /// /// The count of tweets. public int Count { get; set; } /// /// Gets or sets the page number to return. /// /// The page number. public int Page { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/TwitterStatus.xml0000644000175000017500000000217211655552527027323 0ustar00meebeymeebey00000000000000 The TwitterStatus class represents a twitter status (also refered to as a tweet) and provides methods for interacting with status-centric API methods. Destroys the status specified by the required statusId parameter. The oauth tokens. The status id. The freshly deleted status represented by a TwitterStatus object. This method interacts with the users/destroy API endpoint. Documentation can be found here: http://dev.twitter.com/doc/post/statuses/destroy Usage note: The authenticating user must be the author of the specified status. Optional parameters for runtime configuration settings. smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/0000755000175000017500000000000012253423361025501 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/TwitterHashTagEntity.cs0000644000175000017500000000500012253423361032122 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter hash tag entity class //----------------------------------------------------------------------- namespace Twitterizer.Entities { /// /// Represents a pre-parsed hash tag in a value. /// #if !SILVERLIGHT [System.Serializable] #endif public class TwitterHashTagEntity : TwitterEntity { /// /// Gets or sets the hash tag text. /// /// The hash tag text. public string Text { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/TwitterMentionEntity.cs0000644000175000017500000000554512253423361032232 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter metions entity class. //----------------------------------------------------------------------- namespace Twitterizer.Entities { /// /// Represents mention of a user within a value. /// #if !SILVERLIGHT [System.Serializable] #endif public class TwitterMentionEntity : TwitterEntity { /// /// Gets or sets the user's screen name. /// /// The user's screen name. public string ScreenName { get; set; } /// /// Gets or sets the user's name. /// /// The user's name. public string Name { get; set; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/TwitterMediaEntity.cs0000644000175000017500000001575412253423361031643 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter url entity class //----------------------------------------------------------------------- namespace Twitterizer.Entities { using System.Collections.Generic; using System; /// /// Represents a pre-parsed media entity located within the body of a . /// /// #if !SILVERLIGHT [Serializable] #endif public class TwitterMediaEntity : TwitterUrlEntity { /// /// The list of currently available and supported media types. /// /// public enum MediaTypes { /// /// (default) Indicates the media type returned is unsupported. /// Unknown, /// /// Indicates the media type returned is a photo. /// Photo } /// /// Gets or sets the type of the media. /// /// The type of the media. /// public MediaTypes MediaType { get; set; } /// /// Gets or sets the id. /// /// The id. /// public decimal Id { get; set; } /// /// Gets or sets the id string. /// /// The id string. /// public string IdString { get; set; } /// /// Gets or sets the media URL. /// /// The media URL. /// public string MediaUrl { get; set; } /// /// Gets or sets the media URL secure. /// /// The media URL secure. /// public string MediaUrlSecure { get; set; } /// /// Gets or sets the sizes. /// /// The sizes. /// public List Sizes { get; set; } /// /// Represents the display size of a media entity. /// /// public class MediaSize { /// /// The enumerated types of reszing that could be applied to the media entity. /// /// public enum MediaSizeResizes { /// /// Indicates that the resizing method was unrecognized. /// Unknown, /// /// Indicates that the media entity was cropped. /// Crop, /// /// Indicates that the media entity was resized to fit without cropping. /// Fit } /// /// The list of recognized media sizes. /// /// public enum MediaSizes { /// /// (default) Indicates that the size provided by the API was unrecognized. /// Unknown, /// /// Indicates that the media entity is a thumbnail size. /// Thumb, /// /// Indicates that the media entity is a small size. /// Small, /// /// Indicates that the media entity is a medium size. /// Medium, /// /// Indicates that the media entity is a large size. /// Large } /// /// Gets or sets the size. /// /// The size. /// public MediaSizes Size { get; set; } /// /// Gets or sets the width. /// /// The width. /// public int Width { get; set; } /// /// Gets or sets the height. /// /// The height. /// public int Height { get; set; } /// /// Gets or sets the resize. /// /// The resize. /// public MediaSizeResizes Resize { get; set; } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/TwitterEntity.cs0000644000175000017500000000546612132510633030675 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter entity class //----------------------------------------------------------------------- namespace Twitterizer.Entities { using System; /// /// The base class for twitter entities that describe tweet text. /// #if !SILVERLIGHT [Serializable] #endif public class TwitterEntity { /// /// Initializes a new instance of the class. /// internal TwitterEntity() { } /// /// Gets or sets the start index. /// /// The start index. public int StartIndex { get; set; } /// /// Gets or sets the end index. /// /// The end index. public int EndIndex { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/TwitterEntityCollection.cs0000644000175000017500000005445312253423361032716 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter entity collection class //----------------------------------------------------------------------- using System.Collections.Generic; namespace Twitterizer.Entities { using System; using System.Linq; using System.Collections.ObjectModel; using Newtonsoft.Json; using System.Linq.Expressions; using System.Reflection; using System.Globalization; /// /// Represents multiple objects. /// #if !SILVERLIGHT [Serializable] #endif public class TwitterEntityCollection : Collection { /// /// The Json converter for data. /// #if !SILVERLIGHT internal class Converter : JsonConverter #else public class Converter : JsonConverter #endif { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof(TwitterEntityCollection); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing value of object being read. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { TwitterEntityCollection result = existingValue as TwitterEntityCollection; if (result == null) result = new TwitterEntityCollection(); int startDepth = reader.Depth; string entityType = string.Empty; TwitterEntity entity = null; try { if (reader.TokenType == JsonToken.StartArray) reader.Read(); while (reader.Read() && reader.Depth > startDepth) { if (reader.TokenType == JsonToken.PropertyName && reader.Depth == startDepth + 1) { entityType = (string)reader.Value; continue; } switch (entityType) { case "urls": if (reader.TokenType == JsonToken.StartObject) entity = new TwitterUrlEntity(); TwitterUrlEntity tue = entity as TwitterUrlEntity; if (tue != null) { ReadFieldValue(reader, "url", entity, () => tue.Url); ReadFieldValue(reader, "display_url", entity, () => tue.DisplayUrl); ReadFieldValue(reader, "expanded_url", entity, () => tue.ExpandedUrl); } break; case "user_mentions": if (reader.TokenType == JsonToken.StartObject) entity = new TwitterMentionEntity(); TwitterMentionEntity tme = entity as TwitterMentionEntity; if (tme != null) { ReadFieldValue(reader, "screen_name", entity, () => tme.ScreenName); ReadFieldValue(reader, "name", entity, () => tme.Name); ReadFieldValue(reader, "id", entity, () => tme.UserId); } break; case "hashtags": if (reader.TokenType == JsonToken.StartObject) entity = new TwitterHashTagEntity(); TwitterHashTagEntity the = entity as TwitterHashTagEntity; if (the != null) { ReadFieldValue(reader, "text", entity, () => the.Text); } break; case "media": // Move to object start and parse the entity reader.Read(); entity = parseMediaEntity(reader); break; } // Read the indicies (for all entities except Media) if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "indices" && entity != null) { reader.Read(); reader.Read(); entity.StartIndex = Convert.ToInt32((long)reader.Value); reader.Read(); entity.EndIndex = Convert.ToInt32((long)reader.Value); } if ((reader.TokenType == JsonToken.EndObject && entity != null) || entity is TwitterMediaEntity) { result.Add(entity); entity = null; } } } catch { } return result; } /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. /// This is a best attempt to recreate the structure created by the Twitter API. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { TwitterEntityCollection entities = (TwitterEntityCollection)value; writer.WriteStartObject(); { WriteEntity(writer, entities.OfType().ToList(), "hashtags", (w, e) => { w.WritePropertyName("text"); w.WriteValue(e.Text); }); WriteEntity(writer, entities.OfType().ToList(), "user_mentions", (w, e) => { w.WritePropertyName("screen_name"); w.WriteValue(e.ScreenName); w.WritePropertyName("name"); w.WriteValue(e.Name); w.WritePropertyName("id"); w.WriteValue(e.UserId); }); WriteEntity(writer, entities.OfType().ToList(), "urls", (w, e) => { w.WritePropertyName("url"); w.WriteValue(e.Url); w.WritePropertyName("display_url"); w.WriteValue(e.DisplayUrl); w.WritePropertyName("expanded_url"); w.WriteValue(e.ExpandedUrl); }); WriteEntity(writer, entities.OfType().ToList(), "media", WriteMediaEntity); writer.WriteEndObject(); } } /// /// Writes the media entity. /// /// The w. /// The e. private static void WriteMediaEntity(JsonWriter w, TwitterMediaEntity e) { w.WritePropertyName("type"); switch (e.MediaType) { case TwitterMediaEntity.MediaTypes.Unknown: w.WriteNull(); break; case TwitterMediaEntity.MediaTypes.Photo: w.WriteValue("photo"); break; default: break; } w.WritePropertyName("sizes"); w.WriteStartObject(); { foreach (var item in e.Sizes) { w.WritePropertyName(item.Size.ToString().ToLower()); w.WriteStartObject(); { w.WritePropertyName("h"); w.WriteValue(item.Height); w.WritePropertyName("w"); w.WriteValue(item.Width); w.WritePropertyName("resize"); w.WriteValue(item.Resize == TwitterMediaEntity.MediaSize.MediaSizeResizes.Fit ? "fit" : "crop"); w.WriteEndObject(); } } w.WriteEndObject(); } w.WritePropertyName("id"); w.WriteValue(e.Id); w.WritePropertyName("id_str"); w.WriteValue(e.IdString); w.WritePropertyName("media_url"); w.WriteValue(e.MediaUrl); w.WritePropertyName("media_url_https"); w.WriteValue(e.MediaUrlSecure); w.WritePropertyName("url"); w.WriteValue(e.Url); w.WritePropertyName("display_url"); w.WriteValue(e.DisplayUrl); w.WritePropertyName("expanded_url"); w.WriteValue(e.ExpandedUrl); } /// /// Writes an entity. /// /// /// The writer. /// The entities. /// Name of the entity. /// The details action. private static void WriteEntity(JsonWriter writer, IEnumerable entities, string entityName, Action detailsAction) where T : TwitterEntity { // Note to people reading this code: Extra brackets exist to group code by json hierarchy. You're welcome. writer.WritePropertyName(entityName); writer.WriteStartArray(); { foreach (var item in entities) { writer.WriteStartObject(); { writer.WritePropertyName("indices"); writer.WriteStartArray(); { writer.WriteValue(item.StartIndex); writer.WriteValue(item.EndIndex); writer.WriteEndArray(); } detailsAction(writer, item); writer.WriteEndObject(); } } writer.WriteEndArray(); } } /// /// Parses the media entity. /// /// The reader. /// public TwitterMediaEntity parseMediaEntity(JsonReader reader) { try { if (reader.TokenType != JsonToken.StartObject) return null; TwitterMediaEntity entity = new TwitterMediaEntity(); int startDepth = reader.Depth; // Start looping through all of the child nodes while (reader.Read() && reader.Depth >= startDepth) { // If the current node isn't a property, skip it if (reader.TokenType != JsonToken.PropertyName) { continue; } string fieldName = reader.Value as string; if (string.IsNullOrEmpty(fieldName)) { continue; } switch (fieldName) { case "type": entity.MediaType = string.IsNullOrEmpty((string)reader.Value) ? TwitterMediaEntity.MediaTypes.Unknown : TwitterMediaEntity.MediaTypes.Photo; break; case "sizes": entity.Sizes = new List(); break; case "large": case "medium": case "small": case "thumb": if (reader.TokenType != JsonToken.PropertyName) { break; } TwitterMediaEntity.MediaSize newSize = new TwitterMediaEntity.MediaSize(); switch ((string)reader.Value) { case "large": newSize.Size = TwitterMediaEntity.MediaSize.MediaSizes.Large; break; case "medium": newSize.Size = TwitterMediaEntity.MediaSize.MediaSizes.Medium; break; case "small": newSize.Size = TwitterMediaEntity.MediaSize.MediaSizes.Small; break; case "thumb": newSize.Size = TwitterMediaEntity.MediaSize.MediaSizes.Thumb; break; default: break; } int sizeDepth = reader.Depth; // Loop through all of the properties of the size and read their values while (reader.Read() && sizeDepth < reader.Depth) { if (reader.TokenType != JsonToken.PropertyName) { continue; } ReadFieldValue(reader, "h", newSize, () => newSize.Height); ReadFieldValue(reader, "w", newSize, () => newSize.Width); if (reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "resize") { reader.Read(); newSize.Resize = string.IsNullOrEmpty((string)reader.Value) ? TwitterMediaEntity.MediaSize.MediaSizeResizes.Unknown : ((string)reader.Value == "fit" ? TwitterMediaEntity.MediaSize.MediaSizeResizes.Fit : TwitterMediaEntity.MediaSize.MediaSizeResizes.Crop); } } entity.Sizes.Add(newSize); break; case "indices": reader.Read(); reader.Read(); entity.StartIndex = Convert.ToInt32((long)reader.Value); reader.Read(); entity.EndIndex = Convert.ToInt32((long)reader.Value); break; default: break; } ReadFieldValue(reader, "id", entity, () => entity.Id); ReadFieldValue(reader, "id_str", entity, () => entity.IdString); ReadFieldValue(reader, "media_url", entity, () => entity.MediaUrl); ReadFieldValue(reader, "media_url_https", entity, () => entity.MediaUrlSecure); ReadFieldValue(reader, "url", entity, () => entity.Url); ReadFieldValue(reader, "display_url", entity, () => entity.DisplayUrl); ReadFieldValue(reader, "expanded_url", entity, () => entity.ExpandedUrl); } return entity; } catch { return null; } } private bool ReadFieldValue(JsonReader reader, string fieldName, ref T result) { try { if (reader.TokenType != JsonToken.PropertyName) return false; if ((string)reader.Value != fieldName) return false; reader.Read(); if (reader.ValueType == typeof(T)) { result = (T)reader.Value; } else { #if !SILVERLIGHT result = (T)Convert.ChangeType(reader.Value, typeof(T)); #endif #if SILVERLIGHT result = (T)Convert.ChangeType(reader.Value, typeof(T), CultureInfo.InvariantCulture); #endif } return true; } catch { return false; } } private void ReadFieldValue(JsonReader reader, string fieldName, TSource source, Expression> property) where TSource : class { try { if (reader == null || source == null) { return /*false*/; } var expr = (MemberExpression)property.Body; var prop = (PropertyInfo)expr.Member; TProperty value = (TProperty)prop.GetValue(source, null); if (ReadFieldValue(reader, fieldName, ref value)) { prop.SetValue(source, value, null); return /*true*/; } return /*false*/; } catch { return /*false*/; } } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/Entities/TwitterUrlEntity.cs0000644000175000017500000000570012253423361031354 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter url entity class //----------------------------------------------------------------------- namespace Twitterizer.Entities { /// /// Represents a pre-parsed url located within the body of a . /// #if !SILVERLIGHT [System.Serializable] #endif public class TwitterUrlEntity : TwitterEntity { /// /// Gets or sets the URL parsed from the tweet text. /// /// The parsed URL. public string Url { get; set; } /// /// Gets or sets the Display URL parsed from the tweet text. /// /// The parsed Display URL. public string DisplayUrl { get; set; } /// /// Gets or sets the Expanded URL parsed from the tweet text. /// /// The parsed Expanded URL. public string ExpandedUrl { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/TwitterRelatedTweetsCollection.cs0000644000175000017500000000470412132510633032417 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The collection of TwitterRelatedTweets objects. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Twitterizer.Core; #if !SILVERLIGHT /// /// Represents a collection of . /// /// [Serializable] #endif public class TwitterRelatedTweetsCollection : TwitterCollection, ITwitterObject { } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/RetweetsOfMeCommand.cs0000644000175000017500000000760512503640373030126 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweets of me command. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Retweets Of Me Command. /// [AuthorizedCommandAttribute] internal sealed class RetweetsOfMeCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public RetweetsOfMeCommand(OAuthTokens tokens, RetweetsOfMeOptions options) : base(HTTPVerb.GET, "statuses/retweets_of_me.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } #endregion /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); RetweetsOfMeOptions options = this.OptionalProperties as RetweetsOfMeOptions; if (options == null) { return; } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/UpdateStatusCommand.cs0000644000175000017500000001136712503640373030203 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The command to update the user's status. (a.k.a. post a new tweet) //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The command to update the user's status. (a.k.a. post a new tweet) /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class UpdateStatusCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status text. /// The optional properties. public UpdateStatusCommand(OAuthTokens tokens, string text, StatusUpdateOptions optionalProperties) : base(HTTPVerb.POST, "statuses/update.json", tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(text)) { throw new ArgumentNullException("text"); } this.Text = text; } #region Properties /// /// Gets or sets the status text. /// /// The status text. public string Text { get; set; } #endregion /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("status", this.Text); StatusUpdateOptions options = this.OptionalProperties as StatusUpdateOptions; if (options != null) { NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat; if (options.InReplyToStatusId > 0) this.RequestParameters.Add("in_reply_to_status_id", options.InReplyToStatusId.ToString("#")); if (options.Latitude != 0) this.RequestParameters.Add("lat", options.Latitude.ToString(nfi)); if (options.Longitude != 0) this.RequestParameters.Add("long", options.Longitude.ToString(nfi)); if (!string.IsNullOrEmpty(options.PlaceId)) this.RequestParameters.Add("place_id", options.PlaceId); if (options.PlacePin) this.RequestParameters.Add("display_coordinates", "true"); if (options.WrapLinks) this.RequestParameters.Add("wrap_links", "true"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/TwitterRelatedTweets.cs0000644000175000017500000000676212132510633030411 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The related tweets object. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Diagnostics; using Newtonsoft.Json; /// /// The related tweets object. Represents the result from the related_results/show/:id.json endpoint. /// /// [JsonObject(MemberSerialization.OptIn)] #if !SILVERLIGHT [Serializable] #endif [DebuggerDisplay("{GroupName}/{ResultType}")] public class TwitterRelatedTweets : Core.TwitterObject { /// /// Gets or sets the results. /// /// The results. [JsonProperty(PropertyName = "results")] public TwitterStatusCollection Results { get; set; } /// /// Gets or sets the type of the result. /// /// The type of the result. [JsonProperty(PropertyName = "resultType")] public string ResultType { get; set; } /// /// Gets or sets the name of the group. /// /// The name of the group. [JsonProperty(PropertyName = "groupName")] public string GroupName { get; set; } /// /// Gets or sets the score. /// /// The score. [JsonProperty(PropertyName = "score")] public decimal Score { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/DeleteStatusCommand.cs0000644000175000017500000000664612132510633030160 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The command class to delete a status update. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The command class to delete a status update. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class DeleteStatusCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The tokens. /// The status id. /// The options. public DeleteStatusCommand(OAuthTokens tokens, decimal id, OptionalProperties options) : base( HTTPVerb.POST, string.Format(CultureInfo.InvariantCulture, "statuses/destroy/{0}.json", id), tokens, options) { this.Id = id; } #endregion /// /// Gets or sets the status id. /// /// The status id. public decimal Id { get; set; } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Tweets/ShowStatusCommand.cs0000644000175000017500000000663112132510633027670 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Show Status Command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The Show Status Command /// #if !SILVERLIGHT [Serializable] #endif internal sealed class ShowStatusCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status id. /// The options. public ShowStatusCommand(OAuthTokens requestTokens, decimal statusId, OptionalProperties options) : base( HTTPVerb.GET, string.Format(CultureInfo.InvariantCulture, "statuses/show/{0}.json", statusId), requestTokens, options) { if (statusId <= 0) { throw new ArgumentNullException("statusId"); } } #endregion /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/0000755000175000017500000000000012503640373025163 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/ShowDirectMessageCommand.cs0000644000175000017500000000645312253423361032377 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2011, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Show Direct Message Command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; /// /// /// /// internal sealed class ShowDirectMessageCommand : Core.TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The id. /// The options. /// internal ShowDirectMessageCommand(OAuthTokens tokens, decimal id, OptionalProperties options) : base(HTTPVerb.GET, string.Format("direct_messages/{0}.json", id), tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens", "The tokens parameter is required."); } if (id <= 0) { throw new ArgumentOutOfRangeException("id", "The id parameter must be greater than zero."); } } /// /// Inits this instance. /// /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/TwitterDirectMessageCollection.cs0000644000175000017500000000457012132510633033627 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Direct Message Collection class //----------------------------------------------------------------------- namespace Twitterizer { using Twitterizer.Core; using System; /// /// The Direct Message Collection class /// #if !SILVERLIGHT [Serializable] #endif public class TwitterDirectMessageCollection : TwitterCollection, ITwitterObject { } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/DirectMessagesSentCommand.cs0000644000175000017500000001007412503640373032547 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Direct Messages Sent Command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The Direct Messages Sent Command class /// [AuthorizedCommand] #if !SILVERLIGHT [Serializable] #endif internal sealed class DirectMessagesSentCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public DirectMessagesSentCommand(OAuthTokens tokens, DirectMessagesSentOptions options) : base(HTTPVerb.GET, "direct_messages/sent.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Initializes the command. /// public override void Init() { DirectMessagesSentOptions options = this.OptionalProperties as DirectMessagesSentOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); if (options.IncludeEntites) this.RequestParameters.Add("include_entities", "true"); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/TwitterDirectMessage.cs0000644000175000017500000003140412253423361031614 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The direct message entity class //----------------------------------------------------------------------- namespace Twitterizer { using System; using Newtonsoft.Json; using Twitterizer.Core; /// /// The Direct Message Entity Class /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] #if !SILVERLIGHT [Serializable] #endif public class TwitterDirectMessage : TwitterObject { #region Properties /// /// Gets or sets the direct message id. /// /// The direct message id. [JsonProperty(PropertyName = "id")] public decimal Id { get; set; } /// /// Gets or sets the sender id. /// /// The sender id. [JsonProperty(PropertyName = "sender_id")] public decimal SenderId { get; set; } /// /// Gets or sets the direct message text. /// /// The direct message text. [JsonProperty(PropertyName = "text")] public string Text { get; set; } /// /// Gets or sets the recipient id. /// /// The recipient id. [JsonProperty(PropertyName = "recipient_id")] public decimal RecipientId { get; set; } /// /// Gets or sets the created date. /// /// The created date. [JsonProperty(PropertyName = "created_at")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime CreatedDate { get; set; } /// /// Gets or sets the name of the sender screen. /// /// The name of the sender screen. [JsonProperty(PropertyName = "sender_screen_name")] public string SenderScreenName { get; set; } /// /// Gets or sets the name of the recipient screen. /// /// The name of the recipient screen. [JsonProperty(PropertyName = "recipient_screen_name")] public string RecipientScreenName { get; set; } /// /// Gets or sets the sender. /// /// The sender. [JsonProperty(PropertyName = "sender")] public TwitterUser Sender { get; set; } /// /// Gets or sets the recipient. /// /// The recipient. [JsonProperty(PropertyName = "recipient")] public TwitterUser Recipient { get; set; } /// /// Gets or sets the entities. /// /// The entities. [JsonProperty(PropertyName = "entities")] [JsonConverter(typeof(Entities.TwitterEntityCollection.Converter))] public Entities.TwitterEntityCollection Entities { get; set; } #endregion /// /// Returns a list of the 20 most recent direct messages sent to the authenticating user. /// /// The tokens. /// A instance. public static TwitterResponse DirectMessages(OAuthTokens tokens) { return DirectMessages(tokens, null); } /// /// Returns a list of the 20 most recent direct messages sent to the authenticating user. /// /// The tokens. /// The options. /// /// A instance. /// public static TwitterResponse DirectMessages(OAuthTokens tokens, DirectMessagesOptions options) { return CommandPerformer.PerformAction(new Commands.DirectMessagesCommand(tokens, options)); } /// /// Returns a list of the 20 most recent direct messages sent by the authenticating user. /// /// The tokens. /// /// A instance. /// public static TwitterResponse DirectMessagesSent(OAuthTokens tokens) { return DirectMessagesSent(tokens, null); } /// /// Sends a new direct message to the specified user from the authenticating user. /// /// The OAuth tokens. /// The user id. /// The text of your direct message. /// The options. /// /// A instance. /// public static TwitterResponse Send(OAuthTokens tokens, decimal userId, string text, OptionalProperties options) { Commands.SendDirectMessageCommand command = new Commands.SendDirectMessageCommand(tokens, text, userId, options); TwitterResponse result = Core.CommandPerformer.PerformAction(command); return result; } /// /// Sends a new direct message to the specified user from the authenticating user. /// /// The OAuth tokens. /// The user id. /// The text of your direct message. /// /// A instance. /// public static TwitterResponse Send(OAuthTokens tokens, decimal userId, string text) { return Send(tokens, userId, text, null); } /// /// Sends a new direct message to the specified user from the authenticating user. /// /// The OAuth tokens. /// The user's screen name. /// The message text. /// The options. /// A object of the created direct message. public static TwitterResponse Send(OAuthTokens tokens, string screenName, string text, OptionalProperties options) { Commands.SendDirectMessageCommand command = new Commands.SendDirectMessageCommand(tokens, text, screenName, options); TwitterResponse result = Core.CommandPerformer.PerformAction(command); return result; } /// /// Sends a new direct message to the specified user from the authenticating user. /// /// The OAuth tokens. /// The user's screen name. /// The message text. /// A object of the created direct message. public static TwitterResponse Send(OAuthTokens tokens, string screenName, string text) { return Send(tokens, screenName, text, null); } /// /// Returns a list of the 20 most recent direct messages sent by the authenticating user. /// /// The tokens. /// The options. /// /// A instance. /// public static TwitterResponse DirectMessagesSent(OAuthTokens tokens, DirectMessagesSentOptions options) { return CommandPerformer.PerformAction(new Commands.DirectMessagesSentCommand(tokens, options)); } /// /// Deletes this direct message. /// /// The tokens. /// The options. /// /// A instance. /// public TwitterResponse Delete(OAuthTokens tokens, OptionalProperties options) { Commands.DeleteDirectMessageCommand command = new Commands.DeleteDirectMessageCommand(tokens, this.Id, options); TwitterResponse result = Core.CommandPerformer.PerformAction(command); return result; } /// /// Deletes this direct message. /// /// The tokens. /// The direct message id. /// The options. /// /// A instance. /// public static TwitterResponse Delete(OAuthTokens tokens, decimal id, OptionalProperties options) { Commands.DeleteDirectMessageCommand command = new Commands.DeleteDirectMessageCommand(tokens, id, options); TwitterResponse result = Core.CommandPerformer.PerformAction(command); return result; } /// /// Returns a single direct message, specified by an id parameter. Like the /1/direct_messages.format request, this method will include the user objects of the sender and recipient. /// /// The tokens. /// The id. /// The options. /// /// public static TwitterResponse Show(OAuthTokens tokens, decimal id, OptionalProperties options) { Commands.ShowDirectMessageCommand command = new Commands.ShowDirectMessageCommand(tokens, id, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns the status text with HTML links to users, urls, and hashtags. /// /// public string LinkifiedText() { return TwitterStatus.LinkifiedText(Entities, Text); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/DirectMessagesOptions.cs0000644000175000017500000000715112253423361031772 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The direct messages options class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The direct messages options class. Provides a payload for the command. /// #if !SILVERLIGHT [Serializable] #endif public sealed class DirectMessagesOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public DirectMessagesOptions() { this.Page = 1; } /// /// Gets or sets the minimum (earliest) status id to request. /// /// The since id. public decimal SinceStatusId { get; set; } /// /// Gets or sets the max (latest) status id to request. /// /// The max id. public decimal MaxStatusId { get; set; } /// /// Gets or sets the number of messages to request. /// /// The number of messages to request. public int Count { get; set; } /// /// Gets or sets the page number to request. /// /// The page number. public int Page { get; set; } /// /// Gets or sets whether to include entities in the request. /// /// Boolean. public bool IncludeEntites { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/SendDirectMessageCommand.cs0000644000175000017500000001350112503640373032342 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Send Direct Message Command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Send Direct Message Command class /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class SendDirectMessageCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The message text. /// The user id. /// The options. public SendDirectMessageCommand(OAuthTokens tokens, string text, decimal userId, OptionalProperties options) : this(tokens, text, options) { if (userId <= 0) { throw new ArgumentException("User Id must be supplied", "userId"); } this.RecipientUserId = userId; } /// /// Initializes a new instance of the class. /// /// The tokens. /// The message text. /// Name of the user. /// The options. public SendDirectMessageCommand(OAuthTokens tokens, string text, string userName, OptionalProperties options) : this(tokens, text, options) { if (string.IsNullOrEmpty(userName)) { throw new ArgumentNullException("userName"); } this.RecipientUserName = userName; } /// /// Initializes a new instance of the class. /// /// The tokens. /// The message text. /// The options. private SendDirectMessageCommand(OAuthTokens tokens, string text, OptionalProperties options) : base(HTTPVerb.POST, "direct_messages/new.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(text)) { throw new ArgumentNullException("text"); } this.Text = text; } #region Properties /// /// Gets or sets the status text. /// /// The status text. public string Text { get; set; } /// /// Gets or sets the recipient user id. /// /// The recipient user id. public decimal RecipientUserId { get; set; } /// /// Gets or sets the name of the recipient user. /// /// The name of the recipient user. public string RecipientUserName { get; set; } #endregion /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("text", this.Text); if (this.RecipientUserId > 0) this.RequestParameters.Add("user_id", this.RecipientUserId.ToString("#")); if (!string.IsNullOrEmpty(this.RecipientUserName) && this.RecipientUserId <= 0) this.RequestParameters.Add("screen_name", this.RecipientUserName); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/DeleteDirectMessageCommand.cs0000644000175000017500000000720512132510633032650 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Delete Direct Message Command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Delete Direct Message Command class. /// [AuthorizedCommand] #if !SILVERLIGHT [Serializable] #endif internal sealed class DeleteDirectMessageCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The status id. /// The options. public DeleteDirectMessageCommand(OAuthTokens tokens, decimal id, OptionalProperties options) : base(HTTPVerb.POST, string.Format(CultureInfo.InvariantCulture, "direct_messages/destroy/{0}.json", id), tokens, options) { if (id <= 0) { throw new ArgumentException("The message id is invalid", "id"); } if (tokens == null) { throw new ArgumentNullException("tokens"); } this.Id = id; } #endregion /// /// Gets or sets the status id. /// /// The status id. public decimal Id { get; set; } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/DirectMessagesCommand.cs0000644000175000017500000001003212503640373031707 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Direct Messages Command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The Direct Messages Command /// [AuthorizedCommandAttribute] internal sealed class DirectMessagesCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public DirectMessagesCommand(OAuthTokens tokens, DirectMessagesOptions options) : base(HTTPVerb.GET, "direct_messages.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } #endregion /// /// Initializes the command. /// public override void Init() { DirectMessagesOptions options = this.OptionalProperties as DirectMessagesOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); if (options.IncludeEntites) this.RequestParameters.Add("include_entities", "true"); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/DirectMessage/DirectMessagesSentOptions.cs0000644000175000017500000000721012253423361032620 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The direct messages sent options class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The direct messages sent options class. Provides a payload for the command. /// #if !SILVERLIGHT [System.Serializable] #endif public sealed class DirectMessagesSentOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public DirectMessagesSentOptions() { this.Page = 1; } /// /// Gets or sets the minimum (earliest) status id to request. /// /// The since id. public decimal SinceStatusId { get; set; } /// /// Gets or sets the max (latest) status id to request. /// /// The max id. public decimal MaxStatusId { get; set; } /// /// Gets or sets the number of messages to request. /// /// The number of messages to request. public int Count { get; set; } /// /// Gets or sets the page number to request. /// /// The page number. public int Page { get; set; } /// /// Gets or sets whether to include entities in the request. /// /// Boolean. public bool IncludeEntites { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Notification/0000755000175000017500000000000012503640373025072 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Notification/NotificationLeaveCommand.cs0000644000175000017500000001007512503640373032326 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The notification leave command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The notification leave command class. /// sealed class NotificationLeaveCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The user id. /// Name of the screen. /// The options. public NotificationLeaveCommand(OAuthTokens tokens, decimal userId, string screenName, OptionalProperties options) : base(HTTPVerb.POST, "notifications/leave.json", tokens, options) { if (userId <= 0 && string.IsNullOrEmpty(screenName)) { throw new ArgumentNullException("userId", "User ID or Screen name must be supplied"); } this.UserId = userId; this.ScreenName = screenName; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the name of the screen. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } if (!string.IsNullOrEmpty(this.ScreenName)) { this.RequestParameters.Add("screen_name", this.ScreenName); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Notification/NotificationFollowCommand.cs0000644000175000017500000001010312503640373032524 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The notification follow command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The notification follow command class. /// sealed class NotificationFollowCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The user id. /// Name of the screen. /// The options. public NotificationFollowCommand(OAuthTokens tokens, decimal userId, string screenName, OptionalProperties options) : base(HTTPVerb.POST, "notifications/follow.json", tokens, options) { if (userId <= 0 && string.IsNullOrEmpty(screenName)) { throw new ArgumentNullException("userId", "User ID or Screen name must be supplied"); } this.UserId = userId; this.ScreenName = screenName; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the name of the screen. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } if (!string.IsNullOrEmpty(this.ScreenName)) { this.RequestParameters.Add("screen_name", this.ScreenName); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Notification/TwitterNotification.cs0000644000175000017500000001616712132510633031436 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter notification class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Provides methods to update a user's preferences on notifications. For example, whether a user will be notified on mention via SMS. /// public static class TwitterNotification { /// /// Enables device notifications for updates from the specified user. Returns the specified user when successful. /// /// The tokens. /// The user id. /// The options. /// public static TwitterResponse Follow(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.NotificationFollowCommand command = new Commands.NotificationFollowCommand(tokens, userId, string.Empty, options); return Core.CommandPerformer.PerformAction(command); } /// /// Enables device notifications for updates from the specified user. Returns the specified user when successful. /// /// The tokens. /// The user id. /// public static TwitterResponse Follow(OAuthTokens tokens, decimal userId) { return Follow(tokens, userId, null); } /// /// Enables device notifications for updates from the specified user. Returns the specified user when successful. /// /// The tokens. /// The user's screen name. /// The options. /// public static TwitterResponse Follow(OAuthTokens tokens, string screenName, OptionalProperties options) { Commands.NotificationFollowCommand command = new Commands.NotificationFollowCommand(tokens, 0, screenName, options); return Core.CommandPerformer.PerformAction(command); } /// /// Enables device notifications for updates from the specified user. Returns the specified user when successful. /// /// The tokens. /// The user's screen name. /// public static TwitterResponse Follow(OAuthTokens tokens, string screenName) { return Follow(tokens, screenName, null); } /// /// Disables notifications for updates from the specified user to the authenticating user. Returns the specified user when successful. /// /// The tokens. /// The user id. /// The options. /// public static TwitterResponse Leave(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.NotificationLeaveCommand command = new Commands.NotificationLeaveCommand(tokens, userId, string.Empty, options); return Core.CommandPerformer.PerformAction(command); } /// /// Disables notifications for updates from the specified user to the authenticating user. Returns the specified user when successful. /// /// The tokens. /// The user id. /// public static TwitterResponse Leave(OAuthTokens tokens, decimal userId) { return Follow(tokens, userId, null); } /// /// Disables notifications for updates from the specified user to the authenticating user. Returns the specified user when successful. /// /// The tokens. /// The user's screen name. /// The options. /// public static TwitterResponse Leave(OAuthTokens tokens, string screenName, OptionalProperties options) { Commands.NotificationLeaveCommand command = new Commands.NotificationLeaveCommand(tokens, 0, screenName, options); return Core.CommandPerformer.PerformAction(command); } /// /// Disables notifications for updates from the specified user to the authenticating user. Returns the specified user when successful. /// /// The tokens. /// The user's screen name. /// public static TwitterResponse Leave(OAuthTokens tokens, string screenName) { return Follow(tokens, screenName, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/SavedSearches/0000755000175000017500000000000012132510633025155 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/SavedSearches/CreateSavedSearchCommand.cs0000644000175000017500000000752512132510633032330 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The create saved search command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Create Saved Search Command class. Creates the Saved Search with the query provided as the authenticating user. Returns the saved search when successful. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class CreateSavedSearchCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The query. /// The options. public CreateSavedSearchCommand(OAuthTokens tokens, string query, OptionalProperties options) : base(HTTPVerb.POST, "saved_searches/create.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (String.IsNullOrEmpty(query)) { throw new ArgumentException("Query is required."); } this.Query = query; } /// /// Gets or sets the query. /// /// The query. public string Query { get; internal set; } /// /// Initializes the command. /// public override void Init() { if (!String.IsNullOrEmpty(this.Query)) { this.RequestParameters.Add("query", this.Query.ToString(CultureInfo.InvariantCulture)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/SavedSearches/DeleteSavedSearchCommand.cs0000644000175000017500000000721212132510633032320 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The delete saved search command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The delete saved search command class. /// Deletes the saved search specified in the ID parameter as the authenticating user. /// Returns the deleted saved search in the requested format when successful. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class DeleteSavedSearchCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The savedsearch id. /// The options. /// public DeleteSavedSearchCommand(OAuthTokens tokens, decimal savedsearchId, OptionalProperties options) : base(HTTPVerb.POST, string.Format(CultureInfo.InvariantCulture.NumberFormat, "saved_searches/destroy/{0}.json", savedsearchId), tokens, options) { if (savedsearchId <= 0) { throw new ArgumentException("Saved Search Id is required."); } if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/SavedSearches/TwitterSavedSearch.cs0000644000175000017500000001641112132510633031262 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The twitter saved search class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Twitterizer.Core; /// /// The TwitterSavedSearch class. Provides static methods for manipulating saved searches tweets. /// #if !SILVERLIGHT [Serializable] #endif public sealed class TwitterSavedSearch : TwitterObject { ///// ///// Prevents a default instance of the TwitterSavedSearch class from being created. ///// //private TwitterSavedSearch() //{ //} /// /// Gets or sets the Id. /// /// The Id of the saved search. public decimal Id { get; set; } /// /// Gets or sets the name. /// /// The name of the saved search. public string Name { get; set; } /// /// Gets or sets the query. /// /// The query. public string Query { get; set; } /// /// Gets or sets the position. /// /// The position. public int? Position { get; set; } /// /// Gets or sets the created at date time. /// /// The created at. public DateTime CreatedAt { get; set; } /// /// Creates the saved search specified in the query parameter as the authenticating user. /// /// The tokens. /// The query. /// The options. /// The saved search when successful. public static TwitterResponse Create(OAuthTokens tokens, string query, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.CreateSavedSearchCommand(tokens, query, options)); } /// /// Creates the saved search specified in the query parameter as the authenticating user. /// /// The tokens. /// The query. /// The saved search when successful. public static TwitterResponse Create(OAuthTokens tokens, string query) { return Create(tokens, query, null); } /// /// Deletes the saved search specified in the ID parameter as the authenticating user. /// /// The tokens. /// The saved search id. /// The options. /// The deleted saved search in the requested format when successful. public static TwitterResponse Delete(OAuthTokens tokens, decimal savedsearchId, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.DeleteSavedSearchCommand(tokens, savedsearchId, options)); } /// /// Deletes the saved search specified in the ID parameter as the authenticating user. /// /// The tokens. /// The saved search id. /// /// The deleted saved search in the requested format when successful /// public static TwitterResponse Delete(OAuthTokens tokens, decimal savedsearchId) { return Delete(tokens, savedsearchId, null); } /// /// Returns the the authenticating user's saved search queries in the requested format. /// /// The tokens. /// The options. /// The saved searches public static TwitterResponse SavedSearches(OAuthTokens tokens, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.SavedSearchesCommand(tokens, options)); } /// /// Returns the the authenticating user's saved search queries in the requested format. /// /// The tokens. /// The saved searches public static TwitterResponse SavedSearches(OAuthTokens tokens) { return SavedSearches(tokens, null); } /// /// Returns the the authenticating user's saved search queries in the requested format. /// /// The options. /// The saved searches public static TwitterResponse SavedSearches(OptionalProperties options) { return SavedSearches(null, options); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/SavedSearches/TwitterSavedSearchCollection.cs0000644000175000017500000000460112132510633033274 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The collection of TwitterSavedSearch objects. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Twitterizer.Core; /// /// The TwitterSavedSearchCollection class. /// #if !SILVERLIGHT [Serializable] #endif public class TwitterSavedSearchCollection : TwitterCollection, ITwitterObject { } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/SavedSearches/SavedSearchesCommand.cs0000644000175000017500000000623212132510633031526 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The saved searches command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Saved Searches Command class. Returns the saved searches collection when successful. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class SavedSearchesCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public SavedSearchesCommand(OAuthTokens tokens, OptionalProperties options) : base(HTTPVerb.GET, "saved_searches.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/0000755000175000017500000000000012253423361023701 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TwitterTrendLocationCollection.cs0000644000175000017500000001746512253423361032411 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The twitter trend location collection class. //----------------------------------------------------------------------- using Twitterizer.Core; namespace Twitterizer { using System; using Newtonsoft.Json; /// /// The TwitterTrendLocationCollection class. Represents multiple elements. /// [JsonConverter(typeof(TwitterTrendLocationCollection.Converter))] #if !SILVERLIGHT [Serializable] #endif public class TwitterTrendLocationCollection : Core.TwitterCollection, ITwitterObject { /// /// The Json converter class for the TwitterTrendLocationCollection object /// #if !SILVERLIGHT internal class Converter : JsonConverter #else public class Converter : JsonConverter #endif { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof(TwitterTrendLocationCollection); } /// /// Reads the json. /// /// The reader. /// Type of the object. /// The existing value. /// The serializer. /// A collection of items. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { TwitterTrendLocationCollection result = existingValue as TwitterTrendLocationCollection; if (result == null) result = new TwitterTrendLocationCollection(); int initialDepth = reader.Depth; while (reader.Read() && reader.Depth > initialDepth) { if (reader.TokenType == JsonToken.StartObject && reader.Depth >= 1) result.Add(new TwitterTrendLocation()); if (reader.TokenType == JsonToken.PropertyName) { switch ((string)reader.Value) { case "name": reader.Read(); result[result.Count - 1].Name = (string)reader.Value; continue; case "woeid": reader.Read(); result[result.Count - 1].WOEID = int.Parse(reader.Value.ToString()); continue; case "placeType": int placetypeDepth = reader.Depth; while (reader.Read() && reader.Depth > placetypeDepth) { if (reader.TokenType == JsonToken.StartObject && reader.Depth >= 2) result[result.Count - 1].PlaceType = new TwitterTrendLocationPlaceType(); if (reader.TokenType == JsonToken.PropertyName) { switch ((string)reader.Value) { case "name": reader.Read(); result[result.Count - 1].PlaceType.Name = (string)reader.Value; continue; case "code": reader.Read(); result[result.Count - 1].PlaceType.Code = int.Parse(reader.Value.ToString()); continue; } } } continue; case "country": reader.Read(); result[result.Count - 1].Country = (string)reader.Value; continue; case "url": reader.Read(); result[result.Count - 1].URL = (string)reader.Value; continue; case "countryCode": reader.Read(); result[result.Count - 1].CountryCode = (string)reader.Value; continue; } } } return result; } /// /// Writes the json. /// /// The writer. /// The value. /// The serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // TODO: Implement this. // throw new System.NotImplementedException(); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TwitterTrendLocationPlaceType.cs0000644000175000017500000000537712253423361032203 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The Twitter Trend Location class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Runtime.Serialization; using Twitterizer.Core; /// /// The TwitterTrendLocation class. /// #if !SILVERLIGHT [Serializable] #endif [DataContract] public class TwitterTrendLocationPlaceType { /// /// Gets or sets the name. /// /// The name of the place type. [DataMember] public string Name { get; set; } /// /// Gets or sets the code. /// /// The code of the place type. [DataMember] public int Code { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/WeeklyTrendsCommand.cs0000644000175000017500000000676012253423361030160 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The trends command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; using System.Globalization; /// /// The create list command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class WeeklyTrendsCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public WeeklyTrendsCommand(OAuthTokens tokens, TrendsOptions options) : base( HTTPVerb.GET, "trends/weekly.json", tokens, options) { } #endregion /// /// Initializes the command. /// public override void Init() { TrendsOptions options = this.OptionalProperties as TrendsOptions; if (options == null) { return; } if (!String.IsNullOrEmpty(options.Date)) this.RequestParameters.Add("date", options.Date); if (options.ExcludeHashTags) { this.RequestParameters.Add("exclude", "hashtags"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TwitterTrend.cs0000644000175000017500000002205712253423361026675 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Twitter Trend class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Runtime.Serialization; using Twitterizer.Core; /// /// The TwitterTrend class. /// #if !SILVERLIGHT [Serializable] #endif [DataContract] public class TwitterTrend : TwitterObject { /// /// Gets or sets the name. /// /// The name of the trend. [DataMember] public string Name { get; set; } /// /// Gets or sets the address. /// /// The address. [DataMember] public string Address { get; set; } /// /// Gets or sets the search query. /// /// The search query. [DataMember] public string SearchQuery { get; set; } /// /// Gets or sets the promoted content value. /// /// Promoted Content. [DataMember] public string PromotedContent { get; set; } /// /// Gets or sets the events. /// /// The events. [DataMember] public string Events { get; set; } /// /// Gets the trends with the specified WOEID. /// /// The request tokens. /// The WOEID. /// The options. /// /// A collection of objects. /// public static TwitterResponse Trends(OAuthTokens tokens, int WoeID, LocalTrendsOptions options) { Commands.TrendsCommand command = new Twitterizer.Commands.TrendsCommand(tokens, WoeID, options); return Core.CommandPerformer.PerformAction(command); } /// /// Gets the current trends. /// /// The request tokens. /// The WOEID. /// /// A collection of objects. /// public static TwitterResponse Trends(OAuthTokens tokens, int WoeID) { return Trends(tokens, WoeID, null); } /// /// Gets the trends with the specified WOEID. /// /// The WOEID. /// The options. /// /// A collection of objects. /// public static TwitterResponse Trends(int WoeID, LocalTrendsOptions options) { return Trends(null, WoeID, options); } /// /// Gets the current trends. /// /// The WOEID. /// /// A collection of objects. /// public static TwitterResponse Trends(int WoeID) { return Trends(null, WoeID, null); } /// /// Gets the locations where trends are available. /// /// The request tokens. /// The options. /// /// A collection of objects. /// public static TwitterResponse Available(OAuthTokens tokens, AvailableTrendsOptions options) { Commands.AvailableTrendsCommand command = new Twitterizer.Commands.AvailableTrendsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Gets the locations where trends are available. /// /// The options. /// /// A collection of objects. /// public static TwitterResponse Available(AvailableTrendsOptions options) { return Available(null, options); } /// /// Gets the locations where trends are available. /// /// /// A collection of objects. /// public static TwitterResponse Available() { return Available(null, null); } /// /// Gets the daily global trends /// /// The request tokens. /// The options. public static TwitterResponse Daily(OAuthTokens tokens, TrendsOptions options) { Commands.DailyTrendsCommand command = new Twitterizer.Commands.DailyTrendsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Gets the daily global trends /// /// The options. public static TwitterResponse Daily(TrendsOptions options) { return Daily(null, options); } /// /// Gets the daily global trends /// public static TwitterResponse Daily() { return Daily(null, null); } /// /// Gets the weekly global trends /// /// The request tokens. /// The options. public static TwitterResponse Weekly(OAuthTokens tokens, TrendsOptions options) { Commands.WeeklyTrendsCommand command = new Twitterizer.Commands.WeeklyTrendsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Gets the weekly global trends /// /// The options. public static TwitterResponse Weekly(TrendsOptions options) { return Weekly(null, options); } /// /// Gets the weekly global trends /// public static TwitterResponse Weekly() { return Weekly(null, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TwitterTrendDictionary.cs0000644000175000017500000001644512253423361030727 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter trend collection class. //----------------------------------------------------------------------- using Twitterizer.Core; namespace Twitterizer { using System; using Newtonsoft.Json; using System.Globalization; /// /// The TwitterTrendCollection class. Represents multiple elements. /// [JsonConverter(typeof(TwitterTrendDictionary.Converter))] #if !SILVERLIGHT [Serializable] #endif public class TwitterTrendDictionary : Core.TwitterDictionary, ITwitterObject { /// /// Gets or sets as of date. /// [JsonProperty(PropertyName = "as_of")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime AsOf { get; set; } /// /// The Json converter class for the TwitterTrendCollection object /// #if !SILVERLIGHT internal class Converter : JsonConverter #else public class Converter : JsonConverter #endif { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof(TwitterTrendDictionary); } #if !SILVERLIGHT static readonly string[] dateformats = { "yyyy-MM-dd HH:mm", "yyyy-MM-dd" }; #endif /// /// Reads the json. /// /// The reader. /// Type of the object. /// The existing value. /// The serializer. /// A collection of items. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { TwitterTrendDictionary result = existingValue as TwitterTrendDictionary; if (result == null) result = new TwitterTrendDictionary(); int initialDepth = reader.Depth; if (reader.TokenType == JsonToken.StartArray) reader.Read(); while (reader.Read() && reader.Depth > initialDepth) { if (reader.TokenType == JsonToken.PropertyName && reader.Depth == 1) { #if !SILVERLIGHT switch ((string)reader.Value) { //TODO these two datetime converters don't seem to convert. case "as_of": reader.Read(); var c = new TwitterizerDateConverter(); result.AsOf = (DateTime)c.ReadJson(reader, typeof(DateTime), null, serializer); continue; case "trends": reader.Read(); while (reader.Read() && reader.Depth >= 3) { if (reader.TokenType == JsonToken.PropertyName && reader.Depth == 3) { try { var date = DateTime.ParseExact(reader.Value.ToString(), dateformats, CultureInfo.InvariantCulture, DateTimeStyles.None); result.Add(date, new TwitterTrendCollection()); var converter = new TwitterTrendCollection.Converter(); result[date] = (TwitterTrendCollection)converter.ReadJson(reader, typeof(TwitterTrendCollection), null, serializer); } catch { //bad date format return null; } } } continue; } #endif } } return result; } /// /// Writes the json. /// /// The writer. /// The value. /// The serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // TODO: Implement this. // throw new System.NotImplementedException(); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TwitterTrendCollection.cs0000644000175000017500000002064112253423361030706 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter trend collection class. //----------------------------------------------------------------------- using Twitterizer.Core; namespace Twitterizer { using System; using Newtonsoft.Json; /// /// The TwitterTrendCollection class. Represents multiple elements. /// [JsonConverter(typeof(TwitterTrendCollection.Converter))] #if !SILVERLIGHT [Serializable] #endif public class TwitterTrendCollection : Core.TwitterCollection, ITwitterObject { /// /// Gets or sets the as of date. /// [JsonProperty(PropertyName = "as_of")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime AsOf { get; set; } /// /// Gets or sets the created at date. /// [JsonProperty(PropertyName = "created_at")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime CreatedAt { get; set; } /// /// Gets or sets the location. /// public TwitterTrendLocationCollection Locations { get; set; } /// /// The Json converter class for the TwitterTrendCollection object /// #if !SILVERLIGHT internal class Converter : JsonConverter #else public class Converter : JsonConverter #endif { /// /// Determines whether this instance can convert the specified object type. /// /// Type of the object. /// /// true if this instance can convert the specified object type; otherwise, false. /// public override bool CanConvert(Type objectType) { return objectType == typeof(TwitterTrendCollection); } /// /// Reads the json. /// /// The reader. /// Type of the object. /// The existing value. /// The serializer. /// A collection of items. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { TwitterTrendCollection result = existingValue as TwitterTrendCollection; if (result == null) result = new TwitterTrendCollection(); int initialDepth = reader.Depth; while (reader.Read() && reader.Depth > initialDepth) { if (reader.TokenType == JsonToken.PropertyName && reader.Depth == initialDepth + 2) { switch ((string)reader.Value) { //TODO these two datetime converters don't seem to convert. case "as_of": reader.Read(); var c = new TwitterizerDateConverter(); result.AsOf = (DateTime)c.ReadJson(reader, typeof(DateTime), null, serializer); continue; case "created_at": reader.Read(); var d = new TwitterizerDateConverter(); result.CreatedAt = (DateTime)d.ReadJson(reader, typeof(DateTime), null, serializer); continue; case "locations": reader.Read(); var e = new TwitterTrendLocationCollection.Converter(); result.Locations = (TwitterTrendLocationCollection)e.ReadJson(reader, typeof(TwitterTrendLocationCollection), null, serializer); continue; } } #if !SILVERLIGHT if (reader.TokenType == JsonToken.StartObject && reader.Depth > initialDepth + 1) #else if (reader.TokenType == JsonToken.StartObject && reader.Depth > initialDepth + 2) #endif result.Add(new TwitterTrend()); if (reader.TokenType == JsonToken.PropertyName) { switch ((string)reader.Value) { case "query": reader.Read(); result[result.Count - 1].SearchQuery = (string)reader.Value; continue; case "name": reader.Read(); result[result.Count - 1].Name = (string)reader.Value; continue; case "url": reader.Read(); result[result.Count - 1].Address = (string)reader.Value; continue; case "promoted_content": reader.Read(); result[result.Count - 1].PromotedContent = (string)reader.Value; continue; case "events": reader.Read(); result[result.Count - 1].Events = (string)reader.Value; continue; } } } return result; } /// /// Writes the json. /// /// The writer. /// The value. /// The serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // TODO: Implement this. // throw new System.NotImplementedException(); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TrendsOptions.cs0000644000175000017500000000502212253423361027042 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The daily trends options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The trends options class. Provides a payload for optional parameters for the TrendsCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class TrendsOptions : LocalTrendsOptions { /// /// Gets or sets a value indicating whether to set the start date of the returned trends (Format "yyyy-MM-dd") /// public string Date { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/AvailableTrendsCommand.cs0000644000175000017500000000671712253423361030602 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The available trends command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; using System.Globalization; /// /// The create list command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class AvailableTrendsCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public AvailableTrendsCommand(OAuthTokens tokens, AvailableTrendsOptions options) : base( HTTPVerb.GET, "trends/available.json", tokens, options) { } #endregion public override void Init() { AvailableTrendsOptions options = this.OptionalProperties as AvailableTrendsOptions; if (options == null) { return; } if (options.Lat != null) this.RequestParameters.Add("lat", options.Lat.ToString()); if (options.Long != null) this.RequestParameters.Add("long", options.Long.ToString()); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/LocalTrendsOptions.cs0000644000175000017500000000511212253423361030015 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The trends options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The trends options class. Provides a payload for optional parameters for the TrendsCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class LocalTrendsOptions : OptionalProperties { /// /// Gets or sets a value indicating whether [exclude hash tags]. /// /// true if [exclude hash tags]; otherwise, false. public bool ExcludeHashTags { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/AvailableTrendsOptions.cs0000644000175000017500000000534112253423361030647 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The available trends options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The available trends options class. Provides a payload for optional parameters for the AvailableTrendsCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class AvailableTrendsOptions : OptionalProperties { /// /// Gets or sets a value indicating how to order the list nearest to furthest. /// public double? Lat { get; set; } /// /// Gets or sets a value indicating how to order the list nearest to furthest. /// public double? Long { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/DailyTrendsCommand.cs0000644000175000017500000000674612253423361027766 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The trends command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; using System.Globalization; /// /// The create list command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class DailyTrendsCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public DailyTrendsCommand(OAuthTokens tokens, TrendsOptions options) : base( HTTPVerb.GET, "trends/daily.json", tokens, options) { } #endregion /// /// Initializes the command. /// public override void Init() { TrendsOptions options = this.OptionalProperties as TrendsOptions; if (options == null) { return; } if (!String.IsNullOrEmpty(options.Date)) this.RequestParameters.Add("date", options.Date); if (options.ExcludeHashTags) { this.RequestParameters.Add("exclude", "hashtags"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TwitterTrendLocation.cs0000644000175000017500000000716612253423361030372 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The Twitter Trend Location class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Runtime.Serialization; using Twitterizer.Core; /// /// The TwitterTrendLocation class. /// #if !SILVERLIGHT [Serializable] #endif [DataContract] public class TwitterTrendLocation : TwitterObject { /// /// Gets or sets the name. /// /// The name of the location. [DataMember] public string Name { get; set; } /// /// Gets or sets the place type. /// /// The Place Type of the location. [DataMember] public TwitterTrendLocationPlaceType PlaceType { get; set; } /// /// Gets or sets the WOEID. /// /// The WOEID of the location. [DataMember] public int WOEID { get; set; } /// /// Gets or sets the Country. /// /// The Country of the location. [DataMember] public string Country { get; set; } /// /// Gets or sets the URL. /// /// The URL of the location. [DataMember] public string URL { get; set; } /// /// Gets or sets the Country Code. /// /// The Country Code of the location. [DataMember] public string CountryCode { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Trends/TrendsCommand.cs0000644000175000017500000000673412253423361027000 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The trends command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer; using Twitterizer.Core; using System.Globalization; /// /// The create list command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class TrendsCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The WOEID. /// The options. public TrendsCommand(OAuthTokens tokens, int WOEID, LocalTrendsOptions options) : base( HTTPVerb.GET, string.Format(CultureInfo.InvariantCulture, "trends/{0}.json", WOEID), tokens, options) { } #endregion /// /// Initializes the command. /// public override void Init() { LocalTrendsOptions options = this.OptionalProperties as LocalTrendsOptions; if (options == null) { return; } if (options.ExcludeHashTags) { this.RequestParameters.Add("exclude", "hashtags"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/0000755000175000017500000000000012503640373023357 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/ListMembershipsOptions.cs0000644000175000017500000000523412253423361030376 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The list membership command class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional parameters for the class /// public class ListMembershipsOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } /// /// Gets or sets filtered to owned lists. /// /// Whether to filter to owned lists. public bool FilterToOwnedLists { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/TwitterList.cs0000644000175000017500000006543412253423361026216 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter list entity class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Diagnostics; using System.Runtime.Serialization; using Newtonsoft.Json; using Twitterizer.Core; /// /// The twitter list entity class /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [DebuggerDisplay("TwitterList = {FullName}")] #if !SILVERLIGHT [Serializable] #endif [DataContract] public class TwitterList : TwitterObject { #region API properties /// /// Gets or sets the id. /// /// The list id. [JsonProperty(PropertyName = "id")] [DataMember] public long Id { get; set; } /// /// Gets or sets the name. /// /// The list name. [JsonProperty(PropertyName = "name")] [DataMember] public string Name { get; set; } /// /// Gets or sets the full name. /// /// The full name. [JsonProperty(PropertyName = "full_name")] [DataMember] public string FullName { get; set; } /// /// Gets or sets the slug. /// /// The list slug. [JsonProperty(PropertyName = "slug")] [DataMember] public string Slug { get; set; } /// /// Gets or sets the description. /// /// The description. [JsonProperty(PropertyName = "description")] [DataMember] public string Description { get; set; } /// /// Gets or sets the number of subscribers. /// /// The number of subscribers. [JsonProperty(PropertyName = "subscriber_count")] [DataMember] public int NumberOfSubscribers { get; set; } /// /// Gets or sets the number of members. /// /// The number of members. [JsonProperty(PropertyName = "member_count")] [DataMember] public int NumberOfMembers { get; set; } /// /// Gets or sets the absolute path. /// /// The absolute path. [JsonProperty(PropertyName = "uri")] [DataMember] public string AbsolutePath { get; set; } /// /// Gets or sets the mode. /// /// The list mode. [JsonProperty(PropertyName = "mode")] [DataMember] public string Mode { get; set; } /// /// Gets or sets the user that owns the list. /// /// The owning user. [JsonProperty(PropertyName = "user")] [DataMember] public TwitterUser User { get; set; } #endregion #region Calculated Properties /// /// Gets a value indicating whether this instance is public. /// /// true if this instance is public; otherwise, false. [DataMember] public bool IsPublic { get { return this.Mode == "public"; } } #endregion /// /// Creates a new list for the authenticated user. Accounts are limited to 20 lists. /// /// The oauth tokens. /// The username. /// The list name. /// if set to true creates a public list. /// The description. /// The options. /// A instance. [Obsolete("The username parameter is no longer required.")] public static TwitterResponse New(OAuthTokens tokens, string username, string name, bool isPublic, string description, OptionalProperties options) { return New(tokens, name, isPublic, description, options); } /// /// Creates a new list for the authenticated user. Accounts are limited to 20 lists. /// /// The oauth tokens. /// The list name. /// if set to true creates a public list. /// The description. /// The options. /// A instance. public static TwitterResponse New(OAuthTokens tokens, string name, bool isPublic, string description, OptionalProperties options) { Commands.CreateListCommand command = new Twitterizer.Commands.CreateListCommand(tokens, name, options) { IsPublic = isPublic, Description = description }; return Core.CommandPerformer.PerformAction(command); } /// /// Creates a new list for the authenticated user. Accounts are limited to 20 lists. /// /// The oauth tokens. /// The username. /// The list name. /// if set to true creates a public list. /// The description. /// A instance. /// public static TwitterResponse New(OAuthTokens tokens, string username, string name, bool isPublic, string description) { return New(tokens, name, isPublic, description, null); } /// /// Updates the specified list. /// /// The oauth tokens. /// The username. /// The list id. /// The options. /// A instance. [Obsolete("The username parameter is no longer required.")] public static TwitterResponse Update(OAuthTokens tokens, string username, string listId, UpdateListOptions options) { return Update(tokens, listId, options); } /// /// Updates the specified list. /// /// The oauth tokens. /// The list id. /// The options. /// A instance. /// public static TwitterResponse Update(OAuthTokens tokens, string listId, UpdateListOptions options) { Commands.UpdateListCommand command = new Twitterizer.Commands.UpdateListCommand(tokens, listId, options); return Core.CommandPerformer.PerformAction(command); } /// /// List the lists of the specified user. Private lists will be included if the authenticated users is the same as the user who's lists are being returned. /// /// The tokens. /// The options. /// /// A instance. /// public static TwitterResponse GetLists(OAuthTokens tokens, GetListsOptions options = null) { Commands.GetListsCommand command = new Twitterizer.Commands.GetListsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns the specified list. Private lists will only be shown if the authenticated user owns the specified list. /// /// The tokens. /// The slug. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, string slug) { return Show(tokens, slug, null); } /// /// Returns the specified list. Private lists will only be shown if the authenticated user owns the specified list. /// /// The tokens. /// The slug. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, string slug, OptionalProperties options) { Commands.GetListCommand command = new Twitterizer.Commands.GetListCommand(tokens, slug, -1, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns the specified list. Private lists will only be shown if the authenticated user owns the specified list. /// /// The tokens. /// The list id. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal listId) { return Show(tokens, listId, null); } /// /// Returns the specified list. Private lists will only be shown if the authenticated user owns the specified list. /// /// The tokens. /// The list id. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal listId, OptionalProperties options) { Commands.GetListCommand command = new Twitterizer.Commands.GetListCommand(tokens, string.Empty, listId, options); return Core.CommandPerformer.PerformAction(command); } /// /// Deletes the specified list. Must be owned by the authenticated user. /// /// The tokens. /// The username. /// The list id or slug. /// The options. /// A instance. public static TwitterResponse Delete(OAuthTokens tokens, string username, string listIdOrSlug, OptionalProperties options) { Commands.DeleteListCommand command = new Twitterizer.Commands.DeleteListCommand(tokens, username, listIdOrSlug, options); return Core.CommandPerformer.PerformAction(command); } /// /// Show tweet timeline for members of the specified list. /// /// The tokens. /// The username. /// The list id or slug. /// The options. /// /// A instance. /// public static TwitterResponse GetStatuses(OAuthTokens tokens, string username, string listIdOrSlug, ListStatusesOptions options) { Commands.ListStatusesCommand command = new Twitterizer.Commands.ListStatusesCommand(tokens, username, listIdOrSlug, options); return Core.CommandPerformer.PerformAction(command); } /// /// List the lists the specified user has been added to. /// /// The tokens. /// The screenname. /// The options. /// /// A instance. /// public static TwitterResponse GetMemberships(OAuthTokens tokens, string screenname, ListMembershipsOptions options) { Commands.ListMembershipsCommand command = new Twitterizer.Commands.ListMembershipsCommand(tokens, screenname, options); return Core.CommandPerformer.PerformAction(command); } /// /// List the lists the specified user has been added to. /// /// The tokens. /// The screenname. /// /// A instance. /// public static TwitterResponse GetMemberships(OAuthTokens tokens, string screenname) { return GetMemberships(tokens, screenname, null); } /// /// List the lists the specified user has been added to. /// /// The tokens. /// The userid. /// The options. /// /// A instance. /// public static TwitterResponse GetMemberships(OAuthTokens tokens, decimal userid, ListMembershipsOptions options) { Commands.ListMembershipsCommand command = new Twitterizer.Commands.ListMembershipsCommand(tokens, userid, options); return Core.CommandPerformer.PerformAction(command); } /// /// List the lists the specified user has been added to. /// /// The tokens. /// The userid. /// /// A instance. /// public static TwitterResponse GetMemberships(OAuthTokens tokens, decimal userid) { return GetMemberships(tokens, userid, null); } /// /// List the lists the specified user follows. /// /// The tokens. /// Name of the user. /// The options. /// /// A instance. /// public static TwitterResponse GetSubscriptions(OAuthTokens tokens, string userName, GetListSubscriptionsOptions options) { Commands.GetListSubscriptionsCommand command = new Twitterizer.Commands.GetListSubscriptionsCommand(tokens, userName, options); return Core.CommandPerformer.PerformAction(command); } /// /// List the lists the specified user follows. /// /// The tokens. /// Name of the user. /// /// A instance. /// public static TwitterResponse GetSubscriptions(OAuthTokens tokens, string userName) { return GetSubscriptions(tokens, userName, null); } /// /// Returns the members of the specified list. /// /// The tokens. /// The username. /// The list id or slug. /// The options. /// /// A collection of users as . /// public static TwitterResponse GetMembers(OAuthTokens tokens, string username, string listIdOrSlug, GetListMembersOptions options) { Commands.GetListMembersCommand command = new Twitterizer.Commands.GetListMembersCommand(tokens, username, listIdOrSlug, options); return CommandPerformer.PerformAction(command); } /// /// Returns the members of the specified list. /// /// The tokens. /// The username. /// The list id or slug. /// A collection of users as . /// public static TwitterResponse GetMembers(OAuthTokens tokens, string username, string listIdOrSlug) { return GetMembers(tokens, username, listIdOrSlug, null); } /// /// Add a member to a list. The authenticated user must own the list to be able to add members to it. Lists are limited to having 500 members. /// /// The tokens. /// The username of the list owner. /// The list id. /// The user id to add. /// The options. /// /// A representing the list the user was added to, or null. /// public static TwitterResponse AddMember(OAuthTokens tokens, string ownerUsername, string listId, decimal userIdToAdd, OptionalProperties options) { Commands.AddListMemberCommand command = new Twitterizer.Commands.AddListMemberCommand(tokens, ownerUsername, listId, userIdToAdd, options); return CommandPerformer.PerformAction(command); } /// /// Add a member to a list. The authenticated user must own the list to be able to add members to it. Lists are limited to having 500 members. /// /// The tokens. /// The username of the list owner. /// The list id. /// The user id to add. /// /// A representing the list the user was added to, or null. /// public static TwitterResponse AddMember(OAuthTokens tokens, string ownerUsername, string listId, decimal userIdToAdd) { return AddMember(tokens, ownerUsername, listId, userIdToAdd, null); } /// /// Removes the specified member from the list. The authenticated user must be the list's owner to remove members from the list. /// /// The tokens. /// The username of the list owner. /// The list id. /// The user id to add. /// The options. /// /// A representing the list the user was added to, or null. /// public static TwitterResponse RemoveMember(OAuthTokens tokens, string ownerUsername, string listId, decimal userIdToAdd, OptionalProperties options) { Commands.RemoveListMemberCommand command = new Twitterizer.Commands.RemoveListMemberCommand(tokens, ownerUsername, listId, userIdToAdd, options); return CommandPerformer.PerformAction(command); } /// /// Removes the specified member from the list. The authenticated user must be the list's owner to remove members from the list. /// /// The tokens. /// The username of the list owner. /// The list id. /// The user id to add. /// /// A representing the list the user was added to, or null. /// public static TwitterResponse RemoveMember(OAuthTokens tokens, string ownerUsername, string listId, decimal userIdToAdd) { return RemoveMember(tokens, ownerUsername, listId, userIdToAdd, null); } /// /// Check if a user is a member of the specified list. /// /// The tokens. /// The username of the list owner. /// The list id. /// The user id. /// The options. /// /// The user's details, if they are a member of the list, otherwise null. /// public static TwitterResponse CheckMembership(OAuthTokens tokens, string ownerUsername, string listId, decimal userId, OptionalProperties options) { Commands.CheckListMembershipCommand command = new Twitterizer.Commands.CheckListMembershipCommand( tokens, ownerUsername, listId, userId, options); return CommandPerformer.PerformAction(command); } /// /// Check if a user is a member of the specified list. /// /// The tokens. /// The username of the list owner. /// The list id. /// The user id. /// /// The user's details, if they are a member of the list, otherwise null. /// public static TwitterResponse CheckMembership(OAuthTokens tokens, string ownerUsername, string listId, decimal userId) { return CheckMembership(tokens, ownerUsername, listId, userId, null); } /// /// Subscribes the specified tokens. /// /// The tokens. /// The list id. /// public static TwitterResponse Subscribe(OAuthTokens tokens, decimal listId) { return Subscribe(tokens, listId, null); } /// /// Subscribes the specified tokens. /// /// The tokens. /// The list id. /// The optional properties. /// public static TwitterResponse Subscribe(OAuthTokens tokens, decimal listId, OptionalProperties optionalProperties) { Commands.CreateListMembershipCommand command = new Commands.CreateListMembershipCommand(tokens, listId, optionalProperties); return CommandPerformer.PerformAction(command); } /// /// Unsubscribes the authenticated user from the specified list. /// /// The tokens. /// The list id. /// The optional properties. /// /// public static TwitterResponse UnSubscribe(OAuthTokens tokens, decimal listId, OptionalProperties optionalProperties) { Commands.DestroyListSubscriber command = new Commands.DestroyListSubscriber(tokens, listId, optionalProperties); return CommandPerformer.PerformAction(command); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListCommand.cs0000644000175000017500000001043412503640373026562 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get list command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The create list command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class GetListCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The slug. /// The list id. /// The options. /// /// public GetListCommand(OAuthTokens requestTokens, string slug, decimal listId, OptionalProperties options) : base( HTTPVerb.GET, "lists/show.json", requestTokens, options) { if (Tokens == null) { throw new ArgumentNullException("requestTokens"); } if (!string.IsNullOrEmpty(slug) ^ listId > 0) { throw new ArgumentException("You must supply a list id number or slug, but not both."); } this.ListId = listId; this.Slug = slug; } /// /// Gets or sets the list id. /// /// The list id. public decimal ListId { get; set; } /// /// Gets or sets the slug. /// /// The slug. public string Slug { get; set; } /// /// Initializes the command. /// public override void Init() { if (ListId > 0) { this.RequestParameters.Add("list_id", this.ListId.ToString("#")); } if (!string.IsNullOrEmpty(this.Slug)) { this.RequestParameters.Add("slug", this.Slug); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListsCommand.cs0000644000175000017500000000720512132510633026740 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get lists command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Twitterizer; using Twitterizer.Core; /// /// The get lists command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class GetListsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. /// public GetListsCommand(OAuthTokens requestTokens, GetListsOptions options) : base(HTTPVerb.GET, "lists.json", requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } this.DeserializationHandler = TwitterListCollection.Deserialize; } /// /// Initializes the command. /// public override void Init() { GetListsOptions options = this.OptionalProperties as GetListsOptions; if (options == null || options.Cursor == 0) { this.RequestParameters.Add("cursor", "-1"); } else { this.RequestParameters.Add("cursor", options.Cursor.ToString(CultureInfo.InvariantCulture)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/AddListMemberCommand.cs0000644000175000017500000001027312503640373027664 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The add list member command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// Add a member to a list. The authenticated user must own the list to be able to add members to it. Lists are limited to having 500 members. /// [AuthorizedCommand] #if !SILVERLIGHT [Serializable] #endif internal class AddListMemberCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The owner username. /// The list id. /// The user id. /// The options. public AddListMemberCommand(OAuthTokens requestTokens, string ownerUsername, string listId, decimal userId, OptionalProperties options) : base(HTTPVerb.POST, string.Format(CultureInfo.CurrentCulture, "{0}/{1}/members.json", ownerUsername, listId), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } if (string.IsNullOrEmpty(ownerUsername)) { throw new ArgumentNullException("ownerUsername"); } if (string.IsNullOrEmpty(listId)) { throw new ArgumentNullException("listId"); } if (userId <= 0) { throw new ArgumentNullException("userId"); } this.UserId = userId; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("id", this.UserId.ToString("#")); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/DestroyListSubscriber.cs0000644000175000017500000000226312503640373030222 0ustar00meebeymeebey00000000000000namespace Twitterizer.Commands { [Core.AuthorizedCommand] internal class DestroyListSubscriber : Core.TwitterCommand { /// /// Gets or sets the list id. /// /// The list id. /// public decimal ListId { get; set; } /// /// Initializes a new instance of the class. /// /// The tokens. /// The list id. /// The options. /// public DestroyListSubscriber(OAuthTokens tokens, decimal listId, OptionalProperties options) : base(HTTPVerb.POST, "lists/subscribers/destroy.json", tokens, options) { this.ListId = listId; } /// /// Inits this instance. /// /// public override void Init() { this.RequestParameters.Add("list_id", this.ListId.ToString("#")); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/TwitterListCollection.cs0000644000175000017500000000674612132510633030226 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter list collection class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Twitterizer.Core; using Newtonsoft.Json.Linq; using Newtonsoft.Json; /// /// The twitter list collection class. /// #if !SILVERLIGHT [Serializable] #endif public class TwitterListCollection : Core.TwitterCollection, ITwitterObject { /// /// Gets or sets the next cursor. /// /// The next cursor. public int NextCursor { get; set; } /// /// Gets or sets the previous cursor. /// /// The previous cursor. public int PreviousCursor { get; set; } /// /// Gets or sets information about the user's rate usage. /// /// The rate limiting object. public RateLimiting RateLimiting { get; set; } /// /// Deserializes the specified value. /// /// The value. /// internal static TwitterListCollection Deserialize(JObject value) { if (value == null || value.First == null || value.First.First == null) return null; return JsonConvert.DeserializeObject(value.First.First.ToString()); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListMembersOptions.cs0000644000175000017500000000502512132510633030143 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // Optional parameters for the GetListMembers methods. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Provides optional parameters for the method. /// public class GetListMembersOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/UpdateListCommand.cs0000644000175000017500000001033312253423361027261 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update list command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The update list command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class UpdateListCommand : TwitterCommand { private readonly string id; #region Constructors /// /// Initializes a new instance of the class. /// /// The tokens. /// The id. /// The options. /// public UpdateListCommand(OAuthTokens tokens, string id, UpdateListOptions options) : base( HTTPVerb.POST, "lists/update.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(id)) { throw new ArgumentNullException("id"); } this.id = id; } #endregion /// /// Initializes the command. /// public override void Init() { if (!string.IsNullOrEmpty(id)) this.RequestParameters.Add("list_id", id); UpdateListOptions options = this.OptionalProperties as UpdateListOptions; if (options == null) { return; } if (!string.IsNullOrEmpty(options.Name)) { this.RequestParameters.Add("name", options.Name); } if (options.IsPublic != null) { this.RequestParameters.Add("mode", options.IsPublic.Value ? "public" : "private"); } if (!string.IsNullOrEmpty(options.Description)) { this.RequestParameters.Add("description", options.Description); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/ListStatusesCommand.cs0000644000175000017500000001124312253423361027653 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get list statuses command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The get list statuses command class /// internal sealed class ListStatusesCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The username. /// The list id or slug. /// The options. /// public ListStatusesCommand(OAuthTokens requestTokens, string username, string listIdOrSlug, ListStatusesOptions options) : base(HTTPVerb.GET, string.Format("{0}/lists/{1}/statuses.json", username, listIdOrSlug), requestTokens, options) { if (string.IsNullOrEmpty(username)) { throw new ArgumentNullException("username"); } if (string.IsNullOrEmpty(listIdOrSlug)) { throw new ArgumentNullException("listIdOrSlug"); } } /// /// Initializes the command. /// public override void Init() { ListStatusesOptions options = this.OptionalProperties as ListStatusesOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.SinceId > 0) { this.RequestParameters.Add("since_id", options.SinceId.ToString(CultureInfo.InvariantCulture)); } if (options.MaxId > 0) { this.RequestParameters.Add("max_id", options.MaxId.ToString(CultureInfo.InvariantCulture)); } if (options.ItemsPerPage > 0) { this.RequestParameters.Add("per_page", options.ItemsPerPage.ToString(CultureInfo.InvariantCulture)); } if (options.IncludeEntites) { this.RequestParameters.Add("include_entities", "true"); } if (options.IncludeRetweets) { this.RequestParameters.Add("include_rts", "true"); } this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListMembersCommand.cs0000644000175000017500000001011412132510633030061 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get list members command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// Returns the members of the specified list. /// [AuthorizedCommand] internal class GetListMembersCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The username. /// The list id or slug. /// The options. public GetListMembersCommand(OAuthTokens requestTokens, string username, string listIdOrSlug, GetListMembersOptions options) : base(HTTPVerb.GET, string.Format(CultureInfo.CurrentCulture, "{0}/{1}/members.json", username, listIdOrSlug), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } if (string.IsNullOrEmpty(username)) { throw new ArgumentNullException("username"); } if (string.IsNullOrEmpty(listIdOrSlug)) { throw new ArgumentNullException("listIdOrSlug"); } this.DeserializationHandler = TwitterUserCollection.DeserializeWrapper; } /// /// Initializes the command. /// public override void Init() { GetListMembersOptions options = this.OptionalProperties as GetListMembersOptions; if (options == null || options.Cursor == 0) { this.RequestParameters.Add("cursor", "-1"); } else { this.RequestParameters.Add("cursor", options.Cursor.ToString(CultureInfo.InvariantCulture)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListSubscriptionsOptions.cs0000644000175000017500000000473112132510633031423 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get list subscriptions options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional parameters for the class. /// public class GetListSubscriptionsOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/RemoveListMemberCommand.cs0000644000175000017500000001026512503640373030432 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The add list member command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// Removes the specified member from the list. The authenticated user must be the list's owner to remove members from the list. /// [AuthorizedCommand] #if !SILVERLIGHT [Serializable] #endif internal class RemoveListMemberCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The owner username. /// The list id. /// The user id. /// The options. public RemoveListMemberCommand(OAuthTokens requestTokens, string ownerUsername, string listId, decimal userId, OptionalProperties options) : base(HTTPVerb.DELETE, string.Format(CultureInfo.CurrentCulture, "{0}/{1}/members.json", ownerUsername, listId), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } if (string.IsNullOrEmpty(ownerUsername)) { throw new ArgumentNullException("ownerUsername"); } if (string.IsNullOrEmpty(listId)) { throw new ArgumentNullException("listId"); } if (userId <= 0) { throw new ArgumentNullException("userId"); } this.UserId = userId; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("id", this.UserId.ToString("#")); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/DeleteListCommand.cs0000644000175000017500000000740312132510633027240 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The delete list command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The create list command class /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class DeleteListCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The username. /// The list id or slug. /// The options. public DeleteListCommand(OAuthTokens requestTokens, string username, string listIdOrSlug, OptionalProperties options) : base( HTTPVerb.DELETE, string.Format(CultureInfo.CurrentCulture, "{0}/lists/{1}.json", username, listIdOrSlug), requestTokens, options) { if (Tokens == null) { throw new ArgumentNullException("requestTokens"); } if (string.IsNullOrEmpty(username)) { throw new ArgumentNullException("username"); } if (string.IsNullOrEmpty(listIdOrSlug)) { throw new ArgumentNullException("listIdOrSlug"); } } #endregion /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListSubscriptionsCommand.cs0000644000175000017500000000737112132510633031351 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get list subscriptions command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The create list command class /// [AuthorizedCommandAttribute] internal sealed class GetListSubscriptionsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// Name of the user. /// The options. /// public GetListSubscriptionsCommand(OAuthTokens requestTokens, string userName, GetListSubscriptionsOptions options) : base(HTTPVerb.GET, string.Format("{0}/lists/subscriptions.json", userName), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } this.DeserializationHandler = TwitterListCollection.Deserialize; } /// /// Initializes the command. /// public override void Init() { GetListSubscriptionsOptions options = this.OptionalProperties as GetListSubscriptionsOptions; if (options == null || options.Cursor <= 0) { this.RequestParameters.Add("cursor", "-1"); } else this.RequestParameters.Add("cursor", options.Cursor.ToString(CultureInfo.CurrentCulture)); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/ListStatusesOptions.cs0000644000175000017500000000670012253423361027732 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The list statuses options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The list statuses options class. Provides a payload for the ListStatusesCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public sealed class ListStatusesOptions : OptionalProperties { /// /// Gets or sets the since id. /// /// The since id. public long SinceId { get; set; } /// /// Gets or sets the max id. /// /// The max id. public long MaxId { get; set; } /// /// Gets or sets the number of items per page to request. /// /// The number of items per page. public int ItemsPerPage { get; set; } /// /// Gets or sets the page. /// /// The page number. public int Page { get; set; } /// /// Gets or sets whether to include entities in the request. /// /// Boolean. public bool IncludeEntites { get; set; } /// /// Gets or sets whether to include entities in the request. /// /// Boolean. public bool IncludeRetweets { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/ListMembershipsCommand.cs0000644000175000017500000001251212503640373030320 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The list membership command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The list membership command class /// [AuthorizedCommandAttribute] internal sealed class ListMembershipsCommand : TwitterCommand { private readonly string screenname; private readonly decimal userid; /// /// Initializes a new instance of the class. /// /// The request tokens. /// The screenname. /// The options. public ListMembershipsCommand(OAuthTokens requestTokens, string screenname, ListMembershipsOptions options) : base( HTTPVerb.GET, "lists/memberships.json", requestTokens, options) { if (string.IsNullOrEmpty(screenname)) { throw new ArgumentNullException("screenname"); } if (Tokens == null) { throw new ArgumentNullException("requestTokens"); } this.DeserializationHandler = TwitterListCollection.Deserialize; this.screenname = screenname; } /// /// Initializes a new instance of the class. /// /// The request tokens. /// The screenname. /// The options. public ListMembershipsCommand(OAuthTokens requestTokens, decimal userid, ListMembershipsOptions options) : base( HTTPVerb.GET, "lists/memberships.json", requestTokens, options) { if (userid <= 0) { throw new ArgumentNullException("userid"); } if (Tokens == null) { throw new ArgumentNullException("requestTokens"); } this.DeserializationHandler = TwitterListCollection.Deserialize; this.userid = userid; } /// /// Initializes the command. /// public override void Init() { if (!String.IsNullOrEmpty(screenname)) this.RequestParameters.Add("screen_name", screenname); if (userid > 0) this.RequestParameters.Add("user_id", userid.ToString("#")); ListMembershipsOptions options = this.OptionalProperties as ListMembershipsOptions; if (options != null) { if (options.Cursor <= 0) this.RequestParameters.Add("cursor", "-1"); else this.RequestParameters.Add("cursor", options.Cursor.ToString(CultureInfo.CurrentCulture)); if (options.FilterToOwnedLists) this.RequestParameters.Add("filter_to_owned_lists", "true"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/UpdateListOptions.cs0000644000175000017500000000571312132510633027337 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The update list options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The UpdateListOptions class. Provides a payload for optional parameters for the UpdaetListCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class UpdateListOptions : OptionalProperties { /// /// Gets or sets the name of the list. /// /// The name of the list. public string Name { get; set; } /// /// Gets or sets a value indicating whether this instance is public. /// /// true if this instance is public; otherwise, false. public bool? IsPublic { get; set; } /// /// Gets or sets the description. /// /// The description. public string Description { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/CreateListMembershipCommand.cs0000644000175000017500000000236712503640373031270 0ustar00meebeymeebey00000000000000using System; using Twitterizer.Core; namespace Twitterizer.Commands { internal class CreateListMembershipCommand : TwitterCommand { private readonly decimal listId; /// /// Initializes a new instance of the class. /// /// The tokens. /// The list id. /// The options. public CreateListMembershipCommand(OAuthTokens tokens, decimal listId, OptionalProperties options) : base(HTTPVerb.POST, "/lists/subscribers/create.json", tokens, options) { if (tokens == null || !tokens.HasBothTokens) { throw new ArgumentNullException("tokens"); } if (listId <= 0) { throw new ArgumentNullException("listId"); } this.listId = listId; } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("list_id", this.listId.ToString("#")); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/CreateListCommand.cs0000644000175000017500000001056612132510633027245 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The create list command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// The create list command class /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class CreateListCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The name. /// The options. /// public CreateListCommand(OAuthTokens requestTokens, string name, OptionalProperties options) : base(HTTPVerb.POST, "lists/create.json", requestTokens, options) { if (Tokens == null) { throw new ArgumentNullException("requestTokens"); } if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException("name"); } this.Name = name; } #region API Properties /// /// Gets or sets the name of the list. /// /// The name of the list. public string Name { get; set; } /// /// Gets or sets a value indicating whether this instance is public. /// /// true if this instance is public; otherwise, false. public bool IsPublic { get; set; } /// /// Gets or sets the description. /// /// The description. public string Description { get; set; } #endregion /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("name", this.Name); this.RequestParameters.Add("mode", this.IsPublic ? "public" : "private"); if (!string.IsNullOrEmpty(this.Description)) { this.RequestParameters.Add("description", this.Description); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/GetListsOptions.cs0000644000175000017500000000455212132510633027017 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The get lists options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The Get Lists Options class /// public class GetListsOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/List/CheckListMembershipCommand.cs0000644000175000017500000000756012132510633031073 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The check list membership command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// Check if a user is a member of the specified list. /// [AuthorizedCommand] #if !SILVERLIGHT [Serializable] #endif internal class CheckListMembershipCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The owner username. /// The list id. /// The user id. /// The options. public CheckListMembershipCommand(OAuthTokens requestTokens, string ownerUsername, string listId, decimal userId, OptionalProperties options) : base(HTTPVerb.GET, string.Format(CultureInfo.CurrentCulture, "{0}/{1}/members/{2}.json", ownerUsername, listId, userId), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } if (string.IsNullOrEmpty(ownerUsername)) { throw new ArgumentNullException("ownerUsername"); } if (string.IsNullOrEmpty(listId)) { throw new ArgumentNullException("listId"); } if (userId <= 0) { throw new ArgumentNullException("userId"); } } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/0000755000175000017500000000000012503640373023476 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/TwitterBlock.cs0000644000175000017500000002762212132510633026444 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter block class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Provides methods for interacting with user blocks. /// public static class TwitterBlock { /// /// Blocks the user specified as the authenticating user. Destroys a friendship to the blocked user if it exists. /// /// The tokens. /// The user id. /// The options. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.CreateBlockCommand command = new Commands.CreateBlockCommand(tokens, string.Empty, userId, options); return Core.CommandPerformer.PerformAction(command); } /// /// Blocks the user specified as the authenticating user. Destroys a friendship to the blocked user if it exists. /// /// The tokens. /// The user id. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, decimal userId) { return Create(tokens, userId, null); } /// /// Blocks the user specified as the authenticating user. Destroys a friendship to the blocked user if it exists. /// /// The tokens. /// The user's screen name. /// The options. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, string screenName, OptionalProperties options) { Commands.CreateBlockCommand command = new Commands.CreateBlockCommand(tokens, screenName, -1, options); return Core.CommandPerformer.PerformAction(command); } /// /// Blocks the user specified as the authenticating user. Destroys a friendship to the blocked user if it exists. /// /// The tokens. /// The user's screen name. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, string screenName) { return Create(tokens, screenName, null); } /// /// Unblocks the user specified as the authenticating user. /// /// The tokens. /// The user id. /// The options. /// /// The unblocked user in the requested format when successful. /// public static TwitterResponse Destroy(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.DestroyBlockCommand command = new Commands.DestroyBlockCommand(tokens, string.Empty, userId, options); return Core.CommandPerformer.PerformAction(command); } /// /// Unblocks the user specified as the authenticating user. /// /// The tokens. /// The user id. /// /// The unblocked user in the requested format when successful. /// public static TwitterResponse Destroy(OAuthTokens tokens, decimal userId) { return Destroy(tokens, userId, null); } /// /// Unblocks the user specified as the authenticating user. /// /// The tokens. /// The user's screen name. /// The options. /// /// The unblocked user in the requested format when successful. /// public static TwitterResponse Destroy(OAuthTokens tokens, string screenName, OptionalProperties options) { Commands.DestroyBlockCommand command = new Commands.DestroyBlockCommand(tokens, screenName, -1, options); return Core.CommandPerformer.PerformAction(command); } /// /// Unblocks the user specified as the authenticating user. /// /// The tokens. /// The user's screen name. /// /// The unblocked user in the requested format when successful. /// public static TwitterResponse Destroy(OAuthTokens tokens, string screenName) { return Destroy(tokens, screenName, null); } /// /// Checks for a block against the the user specified as the authenticating user. /// /// The tokens. /// The user id. /// The options. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Exists(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.ExistsBlockCommand command = new Commands.ExistsBlockCommand(tokens, string.Empty, userId, options); return Core.CommandPerformer.PerformAction(command); } /// /// Checks for a block against the the user specified as the authenticating user. /// /// The tokens. /// The user id. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Exists(OAuthTokens tokens, decimal userId) { return Exists(tokens, userId, null); } /// /// Checks for a block against the the user specified as the authenticating user. /// /// The tokens. /// The user's screen name. /// The options. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Exists(OAuthTokens tokens, string screenName, OptionalProperties options) { Commands.ExistsBlockCommand command = new Commands.ExistsBlockCommand(tokens, screenName, -1, options); return Core.CommandPerformer.PerformAction(command); } /// /// Checks for a block against the the user specified as the authenticating user. /// /// The tokens. /// The user's screen name. /// /// The blocked user in the requested format when successful. /// public static TwitterResponse Exists(OAuthTokens tokens, string screenName) { return Exists(tokens, screenName, null); } /// /// Returns a collection of user objects that the authenticating user is blocking. /// /// The tokens. /// The options. /// public static TwitterResponse Blocking(OAuthTokens tokens, BlockingOptions options) { Commands.BlockingCommand command = new Commands.BlockingCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns a collection of user objects that the authenticating user is blocking. /// /// The tokens. /// /// public static TwitterResponse Blocking(OAuthTokens tokens) { return Blocking(tokens, null); } /// /// Returns an collection of user ids the authenticating user is blocking. /// /// The tokens. /// The options. /// A collection of user ids. public static TwitterResponse BlockingIds(OAuthTokens tokens, OptionalProperties options) { Commands.BlockingIdsCommand command = new Commands.BlockingIdsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns an collection of user ids the authenticating user is blocking. /// /// The tokens. /// A collection of user ids. public static TwitterResponse BlockingIds(OAuthTokens tokens) { return BlockingIds(tokens, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/BlockingIdsCommand.cs0000644000175000017500000000552012132510633027507 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The blocking ids command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; /// /// The blocking ids command class /// class BlockingIdsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public BlockingIdsCommand(OAuthTokens tokens, OptionalProperties options) : base(HTTPVerb.GET, "blocks/blocking/ids.json", tokens, options) { } /// /// Inits this instance. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/BlockingCommand.cs0000644000175000017500000000644612132510633027057 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The blocking command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System.Globalization; using Twitterizer.Core; /// /// The blocking command class. /// [AuthorizedCommand] sealed class BlockingCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public BlockingCommand(OAuthTokens tokens, BlockingOptions options) : base(HTTPVerb.GET, "blocks/blocking.json", tokens, options) { } /// /// Inits this instance. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); BlockingOptions options = this.OptionalProperties as BlockingOptions; if (options == null || options.Page <= 0) { this.RequestParameters.Add("page", "1"); } else { this.RequestParameters.Add("page", options.Page.ToString(CultureInfo.CurrentCulture)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/CreateBlockCommand.cs0000644000175000017500000001024712503640373027506 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The create block command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Collections.Generic; using System.Linq; using System.Text; using Twitterizer.Core; using System.Globalization; /// /// The create block command class. /// /// http://dev.twitter.com/doc/post/blocks/create internal class CreateBlockCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// Name of the screen. /// The user id. /// The options. public CreateBlockCommand(OAuthTokens tokens, string screenName, decimal userId, OptionalProperties options) : base(HTTPVerb.POST, "blocks/create.json", tokens, options) { if (string.IsNullOrEmpty(screenName) && userId <= 0) { throw new ArgumentException("A screen name or user id is required."); } this.ScreenName = screenName; this.UserId = userId; } /// /// Gets or sets the name of the screen. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Inits this instance. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.ScreenName)) { this.RequestParameters.Add("screen_name", this.ScreenName); } this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/DestroyBlockCommand.cs0000644000175000017500000001026012503640373027727 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The destroy block command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Collections.Generic; using System.Linq; using System.Text; using Twitterizer.Core; using System.Globalization; /// /// The destroy block command class. /// /// http://dev.twitter.com/doc/post/blocks/destroy internal class DestroyBlockCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// Name of the screen. /// The user id. /// The options. public DestroyBlockCommand(OAuthTokens tokens, string screenName, decimal userId, OptionalProperties options) : base(HTTPVerb.POST, "blocks/destroy.json", tokens, options) { if (string.IsNullOrEmpty(screenName) && userId <= 0) { throw new ArgumentException("A screen name or user id is required."); } this.ScreenName = screenName; this.UserId = userId; } /// /// Gets or sets the name of the screen. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Inits this instance. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.ScreenName)) { this.RequestParameters.Add("screen_name", this.ScreenName); } this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/ExistsBlockCommand.cs0000644000175000017500000001024712503640373027562 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The exists block command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Collections.Generic; using System.Linq; using System.Text; using Twitterizer.Core; using System.Globalization; /// /// The exists block command class. /// /// http://dev.twitter.com/doc/post/blocks/exists internal class ExistsBlockCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// Name of the screen. /// The user id. /// The options. public ExistsBlockCommand(OAuthTokens tokens, string screenName, decimal userId, OptionalProperties options) : base(HTTPVerb.GET, "blocks/exists.json", tokens, options) { if (string.IsNullOrEmpty(screenName) && userId <= 0) { throw new ArgumentException("A screen name or user id is required."); } this.ScreenName = screenName; this.UserId = userId; } /// /// Gets or sets the name of the screen. /// /// The name of the screen. public string ScreenName { get; set; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Inits this instance. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.ScreenName)) { this.RequestParameters.Add("screen_name", this.ScreenName); } this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Block/BlockingOptions.cs0000644000175000017500000000464112132510633027127 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The blocking options class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional parameters for the class. /// public class BlockingOptions : OptionalProperties { /// /// Gets or sets the page. /// /// The page. public int Page { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Search/0000755000175000017500000000000012503640373023651 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Search/SearchOptions.cs0000644000175000017500000001223012253423361026755 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The search options class //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The available search result type filter options. /// public enum SearchOptionsResultType { /// /// Use Twitter's default /// Default, /// /// Include both popular and real time results in the response. /// Mixed, /// /// Return only the most recent results in the response. /// Recent, /// /// Return only the most popular results in the response. /// Popular } /// /// The search options class. Provides a payload for optional parameters for the SearchCommand class. /// #if !SILVERLIGHT [Serializable] #endif public class SearchOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public SearchOptions() { UseSSL = true; } /// /// Gets or sets the language. /// /// The language. public string Language { get; set; } /// /// Gets or sets the locale. /// /// The locale. public string Locale { get; set; } /// /// Gets or sets the max id. /// /// The max id. public decimal MaxId { get; set; } /// /// Gets or sets the number per page. /// /// The number per page. public int Count { get; set; } /// /// Gets or sets the since id. /// /// The since id. public decimal SinceId { get; set; } /// /// Gets or sets the geo code string. /// The parameter value is specified by "latitude,longitude,radius", where radius units must be specified as either "mi" (miles) or "km" (kilometers). Note that you cannot use the near operator via the API to geocode arbitrary locations; however you can use this geocode parameter to search near geocodes directly. /// /// The geo code. public string GeoCode { get; set; } /// /// Gets or sets the until date. /// /// The until date. public DateTime UntilDate { get; set; } /// /// Gets or sets the type of the result. /// /// The type of the result. public SearchOptionsResultType ResultType { get; set; } /// /// Gets or sets whether to include some entities in the result. /// /// The type of the result. public bool IncludeEntities { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Search/TwitterSearch.cs0000644000175000017500000000775412253423361027003 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter search class //----------------------------------------------------------------------- namespace Twitterizer { /// /// The Twitter Search Class /// public static class TwitterSearch { /// /// Searches Twitter with the the specified query. /// /// The query. /// /// A instance. /// public static TwitterResponse Search(string query) { return Search(query, null); } /// /// Searches Twitter with the the specified query. /// /// The query. /// The options. /// /// A instance. /// public static TwitterResponse Search(string query, SearchOptions options) { return Search(null, query, options); } /// /// Searches Twitter with the the specified query. /// /// The tokens. /// The query. /// The options. /// /// A instance. /// public static TwitterResponse Search(OAuthTokens tokens, string query, SearchOptions options) { if (options == null) options = new SearchOptions(); Commands.SearchCommand command = new Twitterizer.Commands.SearchCommand(tokens, query, options); TwitterResponse results = Core.CommandPerformer.PerformAction(command); return results; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Search/TwitterSearchResultCollection.cs0000644000175000017500000001371712253423361032212 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter search result collection class //----------------------------------------------------------------------- using Twitterizer.Core; namespace Twitterizer { using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; /// /// The Twitter Search Result Collection class /// #if !SILVERLIGHT [Serializable] #endif public class TwitterSearchResultCollection : Core.TwitterCollection, ITwitterObject { /// /// Gets or sets the completed_in. /// /// The value. /// public double CompletedIn { get; internal set; } /// /// Gets or sets the max_id. /// /// The value. /// public long MaxId { get; internal set; } /// /// Gets or sets the max_id as a string. /// /// The value. /// public string MaxIdStr { get; internal set; } /// /// Gets or sets the since_id. /// /// The value. /// public long SinceId { get; internal set; } /// /// Gets or sets the since_id_str. /// /// The value. /// public string SinceIdStr { get; internal set; } /// /// Gets or sets the query. /// /// The value. /// public string Query { get; internal set; } /// /// Gets or sets the refresh URL. /// /// The value. /// public string RefreshUrl { get; internal set; } /// /// Gets or sets the next results URL. /// /// The value. /// public string NextResults { get; internal set; } /// /// Gets or sets the number of tweets. /// /// The value. /// public int SearchCount { get; internal set; } /// /// Deserializes the specified value. /// /// The value. /// internal static TwitterSearchResultCollection Deserialize(JObject value) { if (value == null || value["statuses"] == null) return null; TwitterSearchResultCollection result = JsonConvert.DeserializeObject(value["statuses"].ToString()); result.CompletedIn = value.SelectToken("search_metadata.completed_in").Value(); result.MaxId = value.SelectToken("search_metadata.max_id").Value(); result.MaxIdStr = value.SelectToken("search_metadata.max_id_str").Value(); result.SinceId = value.SelectToken("search_metadata.since_id").Value(); result.SinceIdStr = value.SelectToken("search_metadata.since_id_str").Value(); result.Query = value.SelectToken("search_metadata.query").Value(); result.RefreshUrl = value.SelectToken("search_metadata.refresh_url").Value(); // bugged Twitter API docs: https://dev.twitter.com/docs/api/1.1/get/search/tweets //result.NextResults = value.SelectToken("search_metadata.next_results").Value(); result.SearchCount = value.SelectToken("search_metadata.count").Value(); return result; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Search/SearchCommand.cs0000644000175000017500000001322712503640373026711 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The search command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Core; #if !SILVERLIGHT [Serializable] #endif [AuthorizedCommandAttribute] internal sealed class SearchCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The query. /// The options. public SearchCommand(OAuthTokens requestTokens, string query, SearchOptions options) : base(HTTPVerb.GET, "search/tweets.json", requestTokens, options) { if (string.IsNullOrEmpty(query)) { throw new ArgumentNullException("query"); } this.Query = query; this.DeserializationHandler = TwitterSearchResultCollection.Deserialize; } #endregion /// /// Gets or sets the query. /// /// The query. public string Query { get; set; } /// /// Initializes the command. /// public override void Init() { #if !SILVERLIGHT CultureInfo unitedStatesEnglishCulture = CultureInfo.GetCultureInfo("en-us"); #else CultureInfo unitedStatesEnglishCulture = CultureInfo.InvariantCulture; #endif this.RequestParameters.Add("q", this.Query); SearchOptions options = this.OptionalProperties as SearchOptions; if (options == null) { return; } if (!string.IsNullOrEmpty(options.Language)) { this.RequestParameters.Add("lang", options.Language); } if (!string.IsNullOrEmpty(options.Locale)) { this.RequestParameters.Add("locale", options.Locale); } if (options.MaxId > 0) { this.RequestParameters.Add("max_id", options.MaxId.ToString("#")); } if (options.Count > 0) { this.RequestParameters.Add("count", options.Count.ToString(unitedStatesEnglishCulture)); } if (options.SinceId > 0) { this.RequestParameters.Add("since_id", options.SinceId.ToString("#")); } if (!string.IsNullOrEmpty(options.GeoCode)) { this.RequestParameters.Add("geocode", options.GeoCode); } if (options.UntilDate > new DateTime()) { this.RequestParameters.Add("until", options.UntilDate.ToString("{0:yyyy-MM-dd}", unitedStatesEnglishCulture)); } switch (options.ResultType) { case SearchOptionsResultType.Mixed: this.RequestParameters.Add("result_type", "mixed"); break; case SearchOptionsResultType.Recent: this.RequestParameters.Add("result_type", "recent"); break; case SearchOptionsResultType.Popular: this.RequestParameters.Add("result_type", "popular"); break; } if (options.IncludeEntities) this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/0000755000175000017500000000000012503640373024537 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/IncomingFriendshipsCommand.cs0000644000175000017500000000647712132510633032336 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The incoming friendship command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System.Globalization; using Twitterizer.Core; class IncomingFriendshipsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public IncomingFriendshipsCommand(OAuthTokens tokens, IncomingFriendshipsOptions options) : base(HTTPVerb.GET, "friendships/incoming.json", tokens, options) { this.DeserializationHandler = TwitterCursorPagedIdCollection.DeserializeWrapper; } /// /// Inits this instance. /// public override void Init() { IncomingFriendshipsOptions options = this.OptionalProperties as IncomingFriendshipsOptions; if (options == null || options.Cursor == 0) { this.RequestParameters.Add("cursor", "-1"); } else { this.RequestParameters.Add("Cursor", options.Cursor.ToString(CultureInfo.CurrentCulture)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/UsersIdsOptions.cs0000644000175000017500000000566312132510633030206 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Edgardo Vega // Optional parameters for the Friendship Resource methods. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The Create Friendship Options class /// #if !SILVERLIGHT [System.Serializable] #endif public sealed class UsersIdsOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } /// /// Gets or sets the ID of the user for whom to request a list of followers. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the screen name of the user for whom to request a list of followers. /// /// The name of the screen. public string ScreenName { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/CreateFriendshipOptions.cs0000644000175000017500000000514012253423361031657 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ronak Patel // The create friendship options class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The Create Friendship Options class /// #if !SILVERLIGHT [System.Serializable] #endif public sealed class CreateFriendshipOptions : OptionalProperties { /// /// Gets or sets a value indicating whether to enable delivery of statuses from this user to the authenticated user's device /// /// true if follow; otherwise, false. public bool Follow { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/UpdateFriendshipOptions.cs0000644000175000017500000000621312253423361031700 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The update friendship options class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// The Update Friendship Options class /// #if !SILVERLIGHT [System.Serializable] #endif public sealed class UpdateFriendshipOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public UpdateFriendshipOptions() { DeviceNotifications = null; ShowRetweets = null; } /// /// Gets or sets a value indicating whether to enable delivery of statuses from this user to the authenticated user's device /// /// true if follow; otherwise, false. public bool? DeviceNotifications { get; set; } /// /// Gets or sets a value indicating whether to show retweets for this user /// /// true if follow; otherwise, false. public bool? ShowRetweets { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/OutgoingFriendshipsOptions.cs0000644000175000017500000000475312132510633032436 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The optional parameters for the incoming friendship command. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional properties for the class. /// public class OutgoingFriendshipsOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/OutgoingFriendshipsCommand.cs0000644000175000017500000000675412132510633032364 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The outgoing friendship command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System.Globalization; using Twitterizer.Core; /// /// Returns an array of numeric IDs for every user who has a pending request to follow the authenticating user. /// internal sealed class OutgoingFriendshipsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public OutgoingFriendshipsCommand(OAuthTokens tokens, OutgoingFriendshipsOptions options) : base(HTTPVerb.GET, "friendships/outgoing.json", tokens, options) { this.DeserializationHandler = TwitterCursorPagedIdCollection.DeserializeWrapper; } /// /// Inits this instance. /// public override void Init() { OutgoingFriendshipsOptions options = this.OptionalProperties as OutgoingFriendshipsOptions; if (options == null || options.Cursor == 0) { this.RequestParameters.Add("cursor", "-1"); } else { this.RequestParameters.Add("Cursor", options.Cursor.ToString(CultureInfo.CurrentCulture)); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/UpdateFriendshipCommand.cs0000644000175000017500000001310712503640373031625 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Direct Messages Sent Command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// Creates a friendship between the authenticated user and another user /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class UpdateFriendshipCommand : Core.TwitterCommand { /// /// The base address to the API method. /// private const string Path = "friendships/update.json"; /// /// Initializes a new instance of the class. /// /// The request tokens. /// The userid. /// The optional properties. public UpdateFriendshipCommand(OAuthTokens tokens, decimal userId, UpdateFriendshipOptions optionalProperties) : base(HTTPVerb.POST, Path, tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (userId <= 0) { throw new ArgumentException("userId"); } this.UserId = userId; } /// /// Initializes a new instance of the class. /// /// The request tokens. /// Name of the user. /// The optional properties. public UpdateFriendshipCommand(OAuthTokens tokens, string userName, UpdateFriendshipOptions optionalProperties) : base(HTTPVerb.POST, Path, tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(userName)) { throw new ArgumentNullException("userName"); } this.UserName = userName; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the username. /// /// The username. public string UserName { get; set; } /// /// Initializes the command. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.UserName)) { this.RequestParameters.Add("screen_name", this.UserName); } UpdateFriendshipOptions options = this.OptionalProperties as UpdateFriendshipOptions; if (options != null) { if (options.DeviceNotifications != null) this.RequestParameters.Add("device", (bool)options.DeviceNotifications ? "true" : "false"); if (options.ShowRetweets != null) this.RequestParameters.Add("retweets", (bool)options.ShowRetweets ? "true" : "false"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/FollowersIdsCommand.cs0000644000175000017500000000753612503640373031014 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Edgardo Vega // The Friendship Resources members command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// Returns the members of the specified list. /// [AuthorizedCommand] internal class FollowersIdsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public FollowersIdsCommand(OAuthTokens requestTokens, UsersIdsOptions options) : base(HTTPVerb.GET, string.Format(CultureInfo.CurrentCulture, "followers/ids.json"), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } this.DeserializationHandler = UserIdCollection.DeserializeWrapper; } /// /// Initializes the command. /// public override void Init() { UsersIdsOptions options = this.OptionalProperties as UsersIdsOptions; if (options == null) { this.RequestParameters.Add("cursor", "-1"); return; } if (options.UserId > 0) this.RequestParameters.Add("user_id", options.UserId.ToString("#")); if (!string.IsNullOrEmpty(options.ScreenName)) this.RequestParameters.Add("screen_name", options.ScreenName); this.RequestParameters.Add("cursor", options.Cursor > 0 ? options.Cursor.ToString(CultureInfo.InvariantCulture) : "-1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/TwitterFriendship.cs0000644000175000017500000006417312253423361030555 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterFriendship class. //----------------------------------------------------------------------- namespace Twitterizer { using Core; /// /// Provides interaction with the Twitter API to obtain and manage relationships between users. /// public static class TwitterFriendship { #region Followers /// /// Returns the authenticating user's followers, each with current status inline. /// /// The tokens. /// The options. /// /// A instance. /// public static TwitterResponse Followers(OAuthTokens tokens, FollowersOptions options) { Commands.FollowersCommand command = new Commands.FollowersCommand(tokens, options); return CommandPerformer.PerformAction(command); } /// /// Returns the authenticating user's followers, each with current status inline. /// /// The tokens. /// /// A instance. /// public static TwitterResponse Followers(OAuthTokens tokens) { return Followers(tokens, null); } /// /// Returns the authenticating user's followers, each with current status inline. /// /// The options. /// /// A instance. /// public static TwitterResponse Followers(FollowersOptions options) { return Followers(null, options); } #endregion #region Friends /// /// Returns a user's friends, each with current status inline. They are ordered by the order in which the user followed them, most recently followed first, 100 at a time. /// /// The tokens. /// The options. /// /// A instance. /// /// Please note that the result set isn't guaranteed to be 100 every time as suspended users will be filtered out. [System.Obsolete("This method is deprecated as it will only return information about users who have Tweeted recently. It is not a functional way to retrieve all of a users friends. Instead of using this method use a combination of friends/ids and users/lookup.")] public static TwitterResponse Friends(OAuthTokens tokens, FriendsOptions options) { Commands.FriendsCommand command = new Commands.FriendsCommand(tokens, options); return CommandPerformer.PerformAction(command); } /// /// Returns a user's friends, each with current status inline. They are ordered by the order in which the user followed them, most recently followed first, 100 at a time. /// /// The tokens. /// /// A instance. /// /// Please note that the result set isn't guaranteed to be 100 every time as suspended users will be filtered out. [System.Obsolete("This method is deprecated as it will only return information about users who have Tweeted recently. It is not a functional way to retrieve all of a users friends. Instead of using this method use a combination of friends/ids and users/lookup.")] public static TwitterResponse Friends(OAuthTokens tokens) { return Friends(tokens, null); } /// /// Returns a user's friends, each with current status inline. They are ordered by the order in which the user followed them, most recently followed first, 100 at a time. /// /// The options. /// /// A instance. /// /// Please note that the result set isn't guaranteed to be 100 every time as suspended users will be filtered out. [System.Obsolete("This method is deprecated as it will only return information about users who have Tweeted recently. It is not a functional way to retrieve all of a users friends. Instead of using this method use a combination of friends/ids and users/lookup.")] public static TwitterResponse Friends(FriendsOptions options) { return Friends(null, options); } #endregion #region Create Friendship /// /// Allows the authenticating users to follow the user specified in the userID parameter. /// /// The tokens. /// The user id. /// /// Returns the followed user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, decimal userId) { return Create(tokens, userId, null); } /// /// Allows the authenticating users to follow the user specified in the userID parameter. /// /// The tokens. /// The user id. /// The options. /// /// Returns the followed user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, decimal userId, CreateFriendshipOptions options) { Commands.CreateFriendshipCommand command = new Commands.CreateFriendshipCommand(tokens, userId, options); return CommandPerformer.PerformAction(command); } /// /// Allows the authenticating users to follow the user specified in the userName parameter. /// /// The tokens. /// The user name. /// /// Returns the followed user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, string userName) { return Create(tokens, userName, null); } /// /// Allows the authenticating users to follow the user specified in the userName parameter. /// /// The tokens. /// The user name. /// The options. /// /// Returns the followed user in the requested format when successful. /// public static TwitterResponse Create(OAuthTokens tokens, string userName, CreateFriendshipOptions options) { Commands.CreateFriendshipCommand command = new Commands.CreateFriendshipCommand(tokens, userName, options); return CommandPerformer.PerformAction(command); } #endregion #region Delete Friendship /// /// Allows the authenticating users to unfollow the user specified in the ID parameter. /// /// The tokens. /// The user id. /// /// Returns the unfollowed user in the requested format when successful. /// public static TwitterResponse Delete(OAuthTokens tokens, decimal userId) { return Delete(tokens, userId, null); } /// /// Allows the authenticating users to unfollow the user specified in the ID parameter. /// /// The tokens. /// The user id. /// The options. /// /// Returns the unfollowed user in the requested format when successful. /// public static TwitterResponse Delete(OAuthTokens tokens, decimal userId, OptionalProperties options) { Commands.DeleteFriendshipCommand command = new Commands.DeleteFriendshipCommand(tokens, userId, string.Empty, options); return CommandPerformer.PerformAction(command); } /// /// Allows the authenticating users to unfollow the user specified in the ID parameter. /// /// The tokens. /// The username. /// /// Returns the unfollowed user in the requested format when successful. /// public static TwitterResponse Delete(OAuthTokens tokens, string userName) { return Delete(tokens, userName, null); } /// /// Allows the authenticating users to unfollow the user specified in the ID parameter. /// /// The tokens. /// The username. /// The options. /// /// Returns the unfollowed user in the requested format when successful. /// public static TwitterResponse Delete(OAuthTokens tokens, string userName, OptionalProperties options) { Commands.DeleteFriendshipCommand command = new Commands.DeleteFriendshipCommand(tokens, 0, userName, options); return Core.CommandPerformer.PerformAction(command); } #endregion #region Show Friendship /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The target user id. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal targetUserId) { return Show(tokens, targetUserId, null); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The target user id. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal targetUserId, OptionalProperties options) { return Show(tokens, 0, targetUserId, options); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The source user id. /// The target user id. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal sourceUseId, decimal targetUserId) { return Show(tokens, sourceUseId, targetUserId, null); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The source user id. /// The target user id. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, decimal sourceUseId, decimal targetUserId, OptionalProperties options) { Commands.ShowFriendshipCommand command = new Twitterizer.Commands.ShowFriendshipCommand( tokens, sourceUseId, string.Empty, targetUserId, string.Empty, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The target user name. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, string targetUserName) { return Show(tokens, string.Empty, targetUserName, null); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The target user name. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, string targetUserName, OptionalProperties options) { return Show(tokens, string.Empty, targetUserName, options); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The source user name. /// The target user name. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, string sourceUserName, string targetUserName) { return Show(tokens, sourceUserName, targetUserName, null); } /// /// Returns detailed information about the relationship between two users. /// /// The tokens. /// The source user name. /// The target user name. /// The options. /// A instance. public static TwitterResponse Show(OAuthTokens tokens, string sourceUserName, string targetUserName, OptionalProperties options) { Commands.ShowFriendshipCommand command = new Twitterizer.Commands.ShowFriendshipCommand(tokens, 0, sourceUserName, 0, targetUserName, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns detailed information about the relationship between two users. /// /// The first user id. /// The second user id. /// /// A instance. /// public static TwitterResponse Show(decimal sourceUseId, decimal targetUserId) { return Show(null, sourceUseId, targetUserId, null); } /// /// Returns detailed information about the relationship between two users. /// /// The first username. /// The second username. /// /// A instance. /// public static TwitterResponse Show(string sourceUserName, string targetUserName) { return Show(null, sourceUserName, targetUserName, null); } #endregion #region User IDs lists /// /// Returns the numeric IDs for every user the specified user is friends with. /// /// The tokens. /// The options. /// /// A instance. /// public static TwitterResponse FriendsIds(OAuthTokens tokens, UsersIdsOptions options) { Commands.FriendsIdsCommand command = new Commands.FriendsIdsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns the numeric IDs for every user the specified user is friends with. /// /// The tokens. /// /// A instance. /// public static TwitterResponse FriendsIds(OAuthTokens tokens) { return FriendsIds(tokens, null); } /// /// Returns the numeric IDs for every user the specified user is following. /// /// The tokens. /// The options. /// /// A instance. /// public static TwitterResponse FollowersIds(OAuthTokens tokens, UsersIdsOptions options) { Commands.FollowersIdsCommand command = new Commands.FollowersIdsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns the numeric IDs for every user the specified user is following. /// /// The tokens. /// /// A instance. /// public static TwitterResponse FollowersIds(OAuthTokens tokens) { return FollowersIds(tokens, null); } #endregion /// /// Returns a collection of IDs for every user who has a pending request to follow the authenticating user. /// /// The tokens. /// The options. /// public static TwitterResponse IncomingRequests(OAuthTokens tokens, IncomingFriendshipsOptions options) { Commands.IncomingFriendshipsCommand command = new Commands.IncomingFriendshipsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns a collection of IDs for every user who has a pending request to follow the authenticating user. /// /// The tokens. /// public static TwitterResponse IncomingRequests(OAuthTokens tokens) { return IncomingRequests(tokens, null); } /// /// Returns a collection of IDs for every protected user for whom the authenticating user has a pending follow request. /// /// The tokens. /// The options. /// public static TwitterResponse OutgoingRequests(OAuthTokens tokens, OutgoingFriendshipsOptions options) { Commands.OutgoingFriendshipsCommand command = new Commands.OutgoingFriendshipsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns a collection of IDs for every protected user for whom the authenticating user has a pending follow request. /// /// The tokens. /// public static TwitterResponse OutgoingRequests(OAuthTokens tokens) { return OutgoingRequests(tokens, null); } /// /// Returns a collection of IDs that the user does not want to see retweets from. /// /// The tokens. /// The options. /// public static TwitterResponse NoRetweetIDs(OAuthTokens tokens, OptionalProperties options) { Commands.NoRetweetIDsCommand command = new Commands.NoRetweetIDsCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns a collection of IDs that the user does not want to see retweets from. /// /// The tokens. /// public static TwitterResponse NoRetweetIDs(OAuthTokens tokens) { return NoRetweetIDs(tokens, null); } /// /// Updates a friendship for a user. /// /// The tokens. /// The userid. /// The options. /// public static TwitterResponse Update(OAuthTokens tokens, decimal userid, UpdateFriendshipOptions options) { Commands.UpdateFriendshipCommand command = new Commands.UpdateFriendshipCommand(tokens, userid, options); return Core.CommandPerformer.PerformAction(command); } /// /// Updates a friendship for a user. /// /// The tokens. /// The userid. /// public static TwitterResponse Update(OAuthTokens tokens, decimal userid) { return Update(tokens, userid, null); } /// /// Updates a friendship for a user. /// /// The tokens. /// The screenname. /// The options. /// public static TwitterResponse Update(OAuthTokens tokens, string screenname, UpdateFriendshipOptions options) { Commands.UpdateFriendshipCommand command = new Commands.UpdateFriendshipCommand(tokens, screenname, options); return Core.CommandPerformer.PerformAction(command); } /// /// Updates a friendship for a user. /// /// The tokens. /// The screenname. /// public static TwitterResponse Update(OAuthTokens tokens, string screenname) { return Update(tokens, screenname, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/DeleteFriendshipCommand.cs0000644000175000017500000001055412503640373031610 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The delete friendship command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The delete friendship command class. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class DeleteFriendshipCommand : Core.TwitterCommand { /// /// The base address to the API method. /// private const string Path = "friendships/destroy.json"; /// /// Initializes a new instance of the class. /// /// The request tokens. /// The user id. /// The user name. /// The optional properties. public DeleteFriendshipCommand(OAuthTokens tokens, decimal userId, string userName, OptionalProperties optionalProperties) : base(HTTPVerb.POST, Path, tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (userId <= 0 && string.IsNullOrEmpty(userName)) { throw new ArgumentException("User ID or screen name is required."); } this.UserName = userName; this.UserId = userId; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; internal set; } /// /// Gets or sets the username. /// /// The username. public string UserName { get; internal set; } /// /// Initializes the command. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.UserName)) { this.RequestParameters.Add("screen_name", this.UserName); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/FriendsIdsCommand.cs0000644000175000017500000000751212503640373030424 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Edgardo Vega // The Friendship Resources members command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// Returns the members of the specified list. /// [AuthorizedCommand] internal class FriendsIdsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public FriendsIdsCommand(OAuthTokens requestTokens, UsersIdsOptions options) : base(HTTPVerb.GET, string.Format(CultureInfo.CurrentCulture, "friends/ids.json"), requestTokens, options) { if (requestTokens == null) { throw new ArgumentNullException("requestTokens"); } this.DeserializationHandler = UserIdCollection.DeserializeWrapper; } /// /// Initializes the command. /// public override void Init() { UsersIdsOptions options = this.OptionalProperties as UsersIdsOptions; if (options == null) { this.RequestParameters.Add("cursor", "-1"); return; } if (options.UserId > 0) this.RequestParameters.Add("user_id", options.UserId.ToString("#")); if (!string.IsNullOrEmpty(options.ScreenName)) this.RequestParameters.Add("screen_name", options.ScreenName); this.RequestParameters.Add("cursor", options.Cursor > 0 ? options.Cursor.ToString(CultureInfo.InvariantCulture) : "-1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/IncomingFriendshipsOptions.cs0000644000175000017500000000475212132510633032405 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The optional parameters for the incoming friendship command. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The optional properties for the class. /// public class IncomingFriendshipsOptions : OptionalProperties { /// /// Gets or sets the cursor. /// /// The cursor. public long Cursor { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/TwitterRelationship.cs0000644000175000017500000001026712253423361031116 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter relationship entity class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Diagnostics; using Newtonsoft.Json; using Twitterizer.Core; /// /// The Twitter Relationship entity class /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [DebuggerDisplay("TwitterRelationship = {Source} -> {Target}")] #if !SILVERLIGHT [Serializable] #endif public class TwitterRelationship : TwitterObject { /// /// Gets or sets the source. /// /// The source. [JsonProperty(PropertyName = "source")] public TwitterRelationshipUser Source { get; set; } /// /// Gets or sets the target. /// /// The target. [JsonProperty(PropertyName = "target")] public TwitterRelationshipUser Target { get; set; } /// /// Gets or sets the relationship. /// /// The relationship. [JsonProperty(PropertyName = "relationship")] public TwitterRelationship Relationship { get { return this; } set { if (value != null) { this.Target = value.Target; this.Source = value.Source; } } } /// /// Allows the authenticating users to unfollow the user specified. /// /// The tokens. /// /// Returns the unfollowed user in the requested format when successful. Returns a string describing the failure condition when unsuccessful. /// public TwitterResponse Delete(OAuthTokens tokens) { Commands.DeleteFriendshipCommand command = new Twitterizer.Commands.DeleteFriendshipCommand(tokens, this.Target.Id, string.Empty, null); return CommandPerformer.PerformAction(command); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/UserIdCollection.cs0000644000175000017500000001017612132510633030273 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Edgardo Vega // The twitter list collection class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Twitterizer.Core; /// /// The twitter list collection class. /// #if !SILVERLIGHT [Serializable] #endif public class UserIdCollection : TwitterIdCollection { /// /// Gets or sets the next cursor. /// /// The next cursor. public long NextCursor { get; set; } /// /// Gets or sets the previous cursor. /// /// The previous cursor. public long PreviousCursor { get; set; } /// /// Gets or sets information about the user's rate usage. /// /// The rate limiting object. public RateLimiting RateLimiting { get; set; } /// /// Deserializes the specified value. /// /// The value. /// internal static UserIdCollection DeserializeWrapper(JObject value) { if (value == null || value.SelectToken("ids") == null) return null; decimal[] parsedIds = JsonConvert.DeserializeObject(value.SelectToken("ids").ToString()); UserIdCollection result = new UserIdCollection { NextCursor = value.SelectToken("next_cursor").Value(), PreviousCursor = value.SelectToken("previous_cursor").Value() }; foreach (decimal t in parsedIds) { result.Add(t); } return result; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/CreateFriendshipCommand.cs0000644000175000017500000001253312503640373031610 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Direct Messages Sent Command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer; using Twitterizer.Core; /// /// Creates a friendship between the authenticated user and another user /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class CreateFriendshipCommand : Core.TwitterCommand { /// /// The base address to the API method. /// private const string Path = "friendships/create.json"; /// /// Initializes a new instance of the class. /// /// The request tokens. /// The userid. /// The optional properties. public CreateFriendshipCommand(OAuthTokens tokens, decimal userId, CreateFriendshipOptions optionalProperties) : base(HTTPVerb.POST, Path, tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (userId <= 0) { throw new ArgumentException("userId"); } this.UserId = userId; } /// /// Initializes a new instance of the class. /// /// The request tokens. /// Name of the user. /// The optional properties. public CreateFriendshipCommand(OAuthTokens tokens, string userName, CreateFriendshipOptions optionalProperties) : base(HTTPVerb.POST, Path, tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (string.IsNullOrEmpty(userName)) { throw new ArgumentNullException("userName"); } this.UserName = userName; } /// /// Gets or sets the user id. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the username. /// /// The username. public string UserName { get; set; } /// /// Initializes the command. /// public override void Init() { if (this.UserId > 0) { this.RequestParameters.Add("user_id", this.UserId.ToString("#")); } else if (!string.IsNullOrEmpty(this.UserName)) { this.RequestParameters.Add("screen_name", this.UserName); } CreateFriendshipOptions options = this.OptionalProperties as CreateFriendshipOptions; if (options != null) { if (options.Follow) this.RequestParameters.Add("follow", "true"); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/TwitterRelationshipUser.cs0000644000175000017500000001155012253423361031751 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The twitter relationship user class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Diagnostics; using Newtonsoft.Json; using Twitterizer.Core; /// /// The Twitter Relationship entity class /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] #if !SILVERLIGHT [Serializable] #endif public class TwitterRelationshipUser : TwitterObject { /// /// Gets or sets the ID. /// /// The ID. [JsonProperty(PropertyName = "id")] public decimal Id { get; set; } /// /// Gets or sets if Following. /// /// Is the user following. [JsonProperty(PropertyName = "following")] public bool Following { get; set; } /// /// Gets or sets the ScreenName. /// /// The users ScreenName. [JsonProperty(PropertyName = "screen_name")] public string ScreenName { get; set; } /// /// Gets or sets if followed by. /// /// Is the user being followed by. [JsonProperty(PropertyName = "followed_by")] public bool FollowedBy { get; set; } /// /// Gets or sets if notifications are enabled. /// /// Notifications enabled for this user. [JsonProperty(PropertyName = "notifications_enabled")] public bool? NotificationsEnabled { get; set; } /// /// Gets or sets if Can DM. /// /// Can the user be DM. [JsonProperty(PropertyName = "can_dm")] public bool CanDM { get; set; } /// /// Gets or sets if wants retweets. /// /// The user wants to see retweets. [JsonProperty(PropertyName = "want_retweets")] public bool? WantRetweets { get; set; } /// /// Gets or sets if marked as spam. /// /// If the user is marked as spam. [JsonProperty(PropertyName = "marked_spam")] public bool? MarkedSpam { get; set; } /// /// Gets or sets if all replies. /// /// If the user wants All Replies. [JsonProperty(PropertyName = "all_replies")] public bool? AllReplies { get; set; } /// /// Gets or sets if blocking. /// /// If the user is blocked. [JsonProperty(PropertyName = "blocking")] public bool? Blocking { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/NoRetweetIDsCommand.cs0000644000175000017500000000567612253423361030715 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The outgoing friendship command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System.Globalization; using Twitterizer.Core; /// /// Returns an array of numeric IDs for every user who has a pending request to follow the authenticating user. /// internal sealed class NoRetweetIDsCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public NoRetweetIDsCommand(OAuthTokens tokens, OptionalProperties options) : base(HTTPVerb.GET, "friendships/no_retweet_ids.json", tokens, options) { } /// /// Inits this instance. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Friendship/ShowFriendshipCommand.cs0000644000175000017500000001370712503640373031331 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The show friendship command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The show friendship command class. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class ShowFriendshipCommand : Core.TwitterCommand { /// /// The base address to the API method. /// private const string Path = "friendships/show.json"; /// /// Initializes a new instance of the class. /// /// The tokens. /// The source user id. /// Name of the source user. /// The target user id. /// Name of the target screen. /// The optional properties. public ShowFriendshipCommand(OAuthTokens tokens, decimal sourceUserId, string sourceUserName, decimal targetUserId, string targetScreenName, OptionalProperties optionalProperties) : base(HTTPVerb.GET, Path, tokens, optionalProperties) { // If the request is unauthorized if (tokens == null) { // Source information is required if (sourceUserId <= 0 && string.IsNullOrEmpty(sourceUserName)) { throw new ArgumentException("For unauthorized show friendship requests, a source and target are required."); } } // Target information is always required (one of the variables) if (targetUserId <= 0 && string.IsNullOrEmpty(targetScreenName)) { throw new ArgumentException("A target user id or screen name is required."); } this.SourceId = sourceUserId; this.SourceScreenName = sourceUserName; this.TargetId = targetUserId; this.TargetScreenName = targetScreenName; } #region API Parameters /// /// Gets or sets the id of the source user. /// /// The source id. public decimal SourceId { get; set; } /// /// Gets or sets the screenname of the source user. /// /// The screenname of the source user. public string SourceScreenName { get; set; } /// /// Gets or sets the id of the target user. /// /// The target id. public decimal TargetId { get; set; } /// /// Gets or sets the screenname of the target user. /// /// The screenname of the target user. public string TargetScreenName { get; set; } #endregion /// /// Initializes the command. /// public override void Init() { if (this.SourceId > 0) { this.RequestParameters.Add("source_id", this.SourceId.ToString("#")); } else if (!string.IsNullOrEmpty(this.SourceScreenName)) { this.RequestParameters.Add("source_screen_name", this.SourceScreenName); } if (this.TargetId > 0) { this.RequestParameters.Add("target_id", this.TargetId.ToString("#")); } else if (!string.IsNullOrEmpty(this.TargetScreenName)) { this.RequestParameters.Add("target_screen_name", this.TargetScreenName); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/0000755000175000017500000000000012503640373024212 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/RetweetedToMeCommand.cs0000644000175000017500000000757712503640373030575 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweeted by me command. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Retweeted By Me Command. /// [AuthorizedCommandAttribute] internal sealed class RetweetedToMeCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public RetweetedToMeCommand(OAuthTokens tokens, TimelineOptions options) : base(HTTPVerb.GET, "statuses/retweeted_to_me.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } #endregion /// /// Initializes the command. /// public override void Init() { TimelineOptions options = this.OptionalProperties as TimelineOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/TwitterTimeline.cs0000644000175000017500000003217012253423361027673 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The TwitterTimeline class //----------------------------------------------------------------------- namespace Twitterizer { using Twitterizer.Core; /// /// Provides interaction with timelines /// public static class TwitterTimeline { /// /// Returns the 20 most recent statuses, including retweets, posted by the authenticating user and that user's friends. This is the equivalent of /timeline/home on the Web. /// /// The tokens. /// The options. /// A collection of items. public static TwitterResponse HomeTimeline(OAuthTokens tokens, TimelineOptions options) { Commands.HomeTimelineCommand command = new Commands.HomeTimelineCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// The tokens. /// A collection of items. public static TwitterResponse HomeTimeline(OAuthTokens tokens) { return HomeTimeline(tokens, null); } /// The options. /// A collection of items. public static TwitterResponse HomeTimeline(TimelineOptions options) { return HomeTimeline(null, options); } /// /// Returns the 20 most recent statuses posted by the authenticating user. It is also possible to request another user's timeline by using the screen_name or user_id parameter. /// /// The oauth tokens. /// The options. /// /// A instance. /// public static TwitterResponse UserTimeline( OAuthTokens tokens, UserTimelineOptions options) { Commands.UserTimelineCommand command = new Commands.UserTimelineCommand(tokens, options); return Core.CommandPerformer.PerformAction(command); } /// /// Returns the 20 most recent statuses posted by the authenticating user. It is also possible to request another user's timeline by using the screen_name or user_id parameter. /// /// The oauth tokens. /// /// A instance. /// public static TwitterResponse UserTimeline( OAuthTokens tokens) { return UserTimeline(tokens, null); } /// /// Returns the 20 most recent statuses posted by the authenticating user. It is also possible to request another user's timeline by using the screen_name or user_id parameter. /// /// The options. /// /// A instance. /// public static TwitterResponse UserTimeline( UserTimelineOptions options) { return UserTimeline(null, options); } /// /// Gets the public timeline. /// /// A . public static TwitterResponse PublicTimeline() { return PublicTimeline((OAuthTokens)null); } /// /// Returns the 20 most recent statuses, including retweets if they exist, from non-protected users. The public timeline is cached for 60 seconds. /// /// The oauth tokens. /// /// A . /// public static TwitterResponse PublicTimeline(OAuthTokens tokens) { return PublicTimeline(tokens, null); } /// /// Returns the 20 most recent statuses, including retweets if they exist, from non-protected users. The public timeline is cached for 60 seconds. /// /// The properties. /// /// A . /// public static TwitterResponse PublicTimeline(OptionalProperties options) { return PublicTimeline(null, options); } /// /// Returns the 20 most recent statuses, including retweets if they exist, from non-protected users. The public timeline is cached for 60 seconds. /// /// The oauth tokens. /// The options. /// A . /// public static TwitterResponse PublicTimeline(OAuthTokens tokens, OptionalProperties options) { Commands.PublicTimelineCommand command = new Commands.PublicTimelineCommand(tokens, options); TwitterResponse result = CommandPerformer.PerformAction(command); return result; } /// /// Obtains the authorized user's friends timeline. /// /// The tokens. /// A . [System.Obsolete("This method is deprecated and has been replaced by the HomeTimeline method.")] public static TwitterResponse FriendTimeline(OAuthTokens tokens) { return FriendTimeline(tokens, null); } /// /// Obtains the authorized user's friends timeline. /// /// The tokens. /// The options. /// A . [System.Obsolete("This method is deprecated and has been replaced by the HomeTimeline method.")] public static TwitterResponse FriendTimeline(OAuthTokens tokens, TimelineOptions options) { Commands.FriendsTimelineCommand command = new Commands.FriendsTimelineCommand(tokens, options); return CommandPerformer.PerformAction(command); } /// /// Returns the 20 most recent tweets of the authenticated user that have been retweeted by others. /// /// The tokens. /// The options. /// A instance. public static TwitterResponse RetweetsOfMe(OAuthTokens tokens, RetweetsOfMeOptions options) { return CommandPerformer.PerformAction( new Commands.RetweetsOfMeCommand(tokens, options)); } /// /// Returns the 20 most recent tweets of the authenticated user that have been retweeted by others. /// /// The tokens. /// /// A instance. /// public static TwitterResponse RetweetsOfMe(OAuthTokens tokens) { return RetweetsOfMe(tokens, null); } /// /// Returns the 20 most recent retweets posted by the authenticating user. /// /// The tokens. /// The options. /// A instance. public static TwitterResponse RetweetedByMe(OAuthTokens tokens, TimelineOptions options) { return CommandPerformer.PerformAction( new Commands.RetweetedByMeCommand(tokens, options)); } /// /// Returns the 20 most recent retweets posted by the authenticating user. /// /// The tokens. /// /// A instance. /// public static TwitterResponse RetweetedByMe(OAuthTokens tokens) { return RetweetedByMe(tokens, null); } /// /// Returns the 20 most recent retweets posted by the authenticating user's friends. /// /// The tokens. /// The options. /// A instance. public static TwitterResponse RetweetedToMe(OAuthTokens tokens, TimelineOptions options) { return CommandPerformer.PerformAction( new Commands.RetweetedToMeCommand(tokens, options)); } /// /// Returns the 20 most recent retweets posted by the authenticating user's friends. /// /// The tokens. /// /// A instance. /// public static TwitterResponse RetweetedToMe(OAuthTokens tokens) { return RetweetedToMe(tokens, null); } /// /// Returns the 20 most recent mentions (status containing @username) for the authenticating user. /// /// The tokens. /// The options. /// A instance. public static TwitterResponse Mentions(OAuthTokens tokens, TimelineOptions options) { Commands.MentionsCommand command = new Commands.MentionsCommand(tokens, options); return CommandPerformer.PerformAction(command); } /// /// Returns the 20 most recent mentions (status containing @username) for the authenticating user. /// /// The tokens. /// /// A instance. /// public static TwitterResponse Mentions(OAuthTokens tokens) { return Mentions(tokens, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/RetweetedByMeCommand.cs0000644000175000017500000000767212503640373030561 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The retweeted by me command. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Retweeted By Me Command. /// [AuthorizedCommandAttribute] internal sealed class RetweetedByMeCommand : TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public RetweetedByMeCommand(OAuthTokens tokens, TimelineOptions options) : base(HTTPVerb.GET, "statuses/retweeted_by_me.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } #endregion /// /// Initializes the command. /// public override void Init() { TimelineOptions options = this.OptionalProperties as TimelineOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/PublicTimelineCommand.cs0000644000175000017500000000615712132510633030747 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The command to obtain the public timeline //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Twitterizer.Core; /// /// The Public Timeline Command class /// #if !SILVERLIGHT [Serializable] #endif internal sealed class PublicTimelineCommand : Core.TwitterCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public PublicTimelineCommand(OAuthTokens tokens, OptionalProperties options) : base(HTTPVerb.GET, "statuses/public_timeline.json", tokens, options) { } #endregion /// /// Initializes the command. /// public override void Init() { // Enable opt-in beta for entities this.RequestParameters.Add("include_entities", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/MentionsCommand.cs0000644000175000017500000000634312253423361027640 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The mentions command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using Core; /// /// The Mentions Command class /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class MentionsCommand : PagedTimelineCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public MentionsCommand(OAuthTokens tokens, TimelineOptions options) : base(HTTPVerb.GET, "statuses/mentions_timeline.json", tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Inits this instance. /// public override void Init() { TimelineOptions options = this.OptionalProperties as TimelineOptions; if (options == null) options = new TimelineOptions(); TimelineOptions.Init(this, options); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/PagedTimelineCommand.cs0000644000175000017500000001025312503640373030550 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The paged timeline command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System.Globalization; using Core; /// /// The Paged Timeline Command class. Provides common functionality for all of the paged timeline command classes. /// #if !SILVERLIGHT [System.Serializable] #endif internal abstract class PagedTimelineCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The HTTP method. /// The end point. /// The tokens. /// The optional properties. protected PagedTimelineCommand(HTTPVerb httpMethod, string endPoint, OAuthTokens tokens, OptionalProperties optionalProperties) : base(httpMethod, endPoint, tokens, optionalProperties) { } /// /// Initializes the command. /// public override void Init() { // Enable opt-in beta for entities this.RequestParameters.Add("include_entities", "true"); TimelineOptions options = this.OptionalProperties as TimelineOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); if (options.Count > 0) this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); if (options.IncludeRetweets) this.RequestParameters.Add("include_rts", "true"); this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/TimelineOptions.cs0000644000175000017500000001217412503640373027670 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The timeline options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The timeline options class. Provides optional parameters for timeline methods. /// #if !SILVERLIGHT [System.Serializable] #endif public class TimelineOptions : OptionalProperties { /// /// Initializes a new instance of the class. /// public TimelineOptions() { this.Page = 1; } /// /// Gets or sets the minimum (earliest) status id to request. /// /// The since id. public decimal SinceStatusId { get; set; } /// /// Gets or sets the max (latest) status id to request. /// /// The max id. public decimal MaxStatusId { get; set; } /// /// Gets or sets the number of messages to request. /// /// The number of messages to request. public int Count { get; set; } /// /// Gets or sets the page number to request. /// /// The page number. public int Page { get; set; } /// /// Gets or sets a value indicating whether user objects should contain only Id values. /// /// true if user objects should contain only Id values; otherwise, false. public bool SkipUser { get; set; } /// /// Gets or sets a value indicating whether [include retweets]. /// /// true if [include retweets]; otherwise, false. public bool IncludeRetweets { get; set; } /// /// Initializes the specified command. /// /// /// The command. /// The options. internal static void Init(Core.TwitterCommand command, TimelineOptions options) where T : Core.ITwitterObject { command.RequestParameters.Add("include_entities", "true"); if (options == null) options = new TimelineOptions(); if (options.Count > 0) command.RequestParameters.Add("count", options.Count.ToString()); if (options.IncludeRetweets) command.RequestParameters.Add("include_rts", "true"); if (options.MaxStatusId > 0) command.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); command.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString() : "1"); if (options.SinceStatusId > 0) command.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.SkipUser) command.RequestParameters.Add("trim_user", "true"); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/HomeTimelineCommand.cs0000644000175000017500000000651312253423361030422 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Home Timeline Command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Home Timeline Command /// #if !SILVERLIGHT [Serializable] #endif [AuthorizedCommandAttribute] internal sealed class HomeTimelineCommand : PagedTimelineCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The optional properties. public HomeTimelineCommand(OAuthTokens tokens, TimelineOptions optionalProperties) : base(HTTPVerb.GET, "statuses/home_timeline.json", tokens, optionalProperties) { if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Inits this instance. /// public override void Init() { TimelineOptions options = this.OptionalProperties as TimelineOptions; if (options == null) options = new TimelineOptions(); TimelineOptions.Init(this, options); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/UserTimelineOptions.cs0000644000175000017500000000542411655552527030541 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter timeline options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The UserTimelineOptions class. Provides a payload for optional parameters of the class. /// public class UserTimelineOptions : TimelineOptions { /// /// Gets or sets the ID of the user for whom to request a list of followers. /// /// The user id. public decimal UserId { get; set; } /// /// Gets or sets the screen name of the user for whom to request a list of followers. /// /// The name of the screen. public string ScreenName { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/UserTimelineCommand.cs0000644000175000017500000000756212503640373030457 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The user timeline command. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; /// /// The user timeline command. /// #if !SILVERLIGHT [Serializable] #endif internal sealed class UserTimelineCommand : PagedTimelineCommand { /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public UserTimelineCommand(OAuthTokens tokens, UserTimelineOptions options) : base(HTTPVerb.GET, "statuses/user_timeline.json", tokens, options) { if (tokens == null && options == null) { throw new ArgumentException("You must supply either OAuth tokens or identify a user in the TimelineOptions class."); } if (options != null && tokens == null && string.IsNullOrEmpty(options.ScreenName) && options.UserId <= 0) { throw new ArgumentException("You must specify a user's screen name or id for unauthorized requests."); } } /// /// Initializes the command. /// public override void Init() { UserTimelineOptions options = this.OptionalProperties as UserTimelineOptions; if (options == null) options = new UserTimelineOptions(); TimelineOptions.Init(this, options); if (options.UserId > 0) this.RequestParameters.Add("user_id", options.UserId.ToString("#")); if (!string.IsNullOrEmpty(options.ScreenName)) this.RequestParameters.Add("screen_name", options.ScreenName); } } }smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Timeline/FriendsTimelineCommand.cs0000644000175000017500000000613312253423361031122 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The friends timeline command class //----------------------------------------------------------------------- namespace Twitterizer.Commands { /// /// The Friends Timeline Command class /// internal sealed class FriendsTimelineCommand : PagedTimelineCommand { #region Constructors /// /// Initializes a new instance of the class. /// /// The request tokens. /// The options. public FriendsTimelineCommand(OAuthTokens tokens, TimelineOptions options) : base(HTTPVerb.GET, "statuses/friends_timeline.json", tokens, options) { } #endregion /// /// Inits this instance. /// public override void Init() { TimelineOptions options = this.OptionalProperties as TimelineOptions; if (options == null) options = new TimelineOptions(); TimelineOptions.Init(this, options); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Favorites/0000755000175000017500000000000012503640373024406 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Favorites/ListFavoritesCommand.cs0000644000175000017500000001052112503640373031031 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The list favorites command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The ListFavoritesCommand class. Returns the 20 most recent favorite statuses for the authenticating user or user specified by the ID parameter in the requested format. /// #if !SILVERLIGHT [Serializable] #endif internal sealed class ListFavoritesCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The options. public ListFavoritesCommand(OAuthTokens tokens, ListFavoritesOptions options) : base(HTTPVerb.GET, "favorites/list.json", tokens, options) { if (tokens == null && (options == null || string.IsNullOrEmpty(options.UserNameOrId))) { throw new ArgumentException("Valid tokens or user must be supplied."); } } /// /// Initializes the command. /// public override void Init() { this.RequestParameters.Add("include_entities", "true"); ListFavoritesOptions options = this.OptionalProperties as ListFavoritesOptions; if (options == null) { this.RequestParameters.Add("page", "1"); return; } this.RequestParameters.Add("page", options.Page > 0 ? options.Page.ToString(CultureInfo.InvariantCulture) : "1"); if (!string.IsNullOrEmpty(options.UserNameOrId)) { this.RequestParameters.Add("id", options.UserNameOrId); } if (options.Count > 0) { this.RequestParameters.Add("count", options.Count.ToString(CultureInfo.InvariantCulture)); } if (options.SinceStatusId > 0) this.RequestParameters.Add("since_id", options.SinceStatusId.ToString("#")); if (options.MaxStatusId > 0) this.RequestParameters.Add("max_id", options.MaxStatusId.ToString("#")); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Favorites/ListFavoritesOptions.cs0000644000175000017500000000663112253423361031113 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The list favorites options class. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The list favorites options class. Provides a payload for optional parameters of the ListFavoritesCommand class. /// #if !SILVERLIGHT [System.Serializable] #endif public class ListFavoritesOptions : OptionalProperties { /// /// Gets or sets the number of favorites to return. /// /// The number of favorites to return per page. public int Count { get;set; } /// /// Gets or sets the user name or id of the user for whom to return results for. /// /// The user name or id of the user for whom to return results for. public string UserNameOrId { get; set; } /// /// Gets or sets the page. /// /// The page number. public int Page { get; set; } /// /// Gets or sets the minimum (earliest) status id to request. /// /// The since id. public decimal SinceStatusId { get; set; } /// /// Gets or sets the max (latest) status id to request. /// /// The max id. public decimal MaxStatusId { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Favorites/DeleteFavoriteCommand.cs0000644000175000017500000000705512503640373031145 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The delete favorite command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The delete favoriate command class. /// Un-favorites the status specified in the ID parameter as the authenticating user. /// Returns the un-favorited status in the requested format when successful. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class DeleteFavoriteCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The status id. /// The options. public DeleteFavoriteCommand(OAuthTokens tokens, decimal statusId, OptionalProperties options) : base(HTTPVerb.POST, string.Format(CultureInfo.InvariantCulture.NumberFormat, "favorites/destroy.json?id={0}", statusId), tokens, options) { if (statusId <= 0) { throw new ArgumentException("Status Id is required."); } if (tokens == null) { throw new ArgumentNullException("tokens"); } } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Favorites/TwitterFavorite.cs0000644000175000017500000001436312253423361030104 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter favorite class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using Core; /// /// The TwitterFavorite class. Provides static methods for manipulating favorite tweets. /// #if !SILVERLIGHT [Serializable] #endif public sealed class TwitterFavorite : TwitterObject { /// /// Favorites the status specified in the ID parameter as the authenticating user. /// /// The tokens. /// The status id. /// The options. /// The favorite status when successful. public static TwitterResponse Create(OAuthTokens tokens, decimal statusId, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.CreateFavoriteCommand(tokens, statusId, options)); } /// /// Favorites the status specified in the ID parameter as the authenticating user. /// /// The tokens. /// The status id. /// The favorite status when successful. public static TwitterResponse Create(OAuthTokens tokens, decimal statusId) { return Create(tokens, statusId, null); } /// /// Un-favorites the status specified in the ID parameter as the authenticating user. /// /// The tokens. /// The status id. /// The options. /// The un-favorited status in the requested format when successful. public static TwitterResponse Delete(OAuthTokens tokens, decimal statusId, OptionalProperties options) { return CommandPerformer.PerformAction( new Commands.DeleteFavoriteCommand(tokens, statusId, options)); } /// /// Un-favorites the status specified in the ID parameter as the authenticating user. /// /// The tokens. /// The status id. /// /// The un-favorited status in the requested format when successful. /// public static TwitterResponse Delete(OAuthTokens tokens, decimal statusId) { return Delete(tokens, statusId, null); } /// /// Returns the 20 most recent favorite statuses for the authenticating user or user specified by the ID parameter in the requested format. /// /// The tokens. /// The options. /// The 20 most recent favorite statuses public static TwitterResponse List(OAuthTokens tokens, ListFavoritesOptions options) { return CommandPerformer.PerformAction( new Commands.ListFavoritesCommand(tokens, options)); } /// /// Returns the 20 most recent favorite statuses for the authenticating user or user specified by the ID parameter in the requested format. /// /// The tokens. /// The 20 most recent favorite statuses public static TwitterResponse List(OAuthTokens tokens) { return List(tokens, null); } /// /// Returns the 20 most recent favorite statuses for the authenticating user or user specified by the ID parameter in the requested format. /// /// The options. /// The 20 most recent favorite statuses public static TwitterResponse List(ListFavoritesOptions options) { return List(null, options); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Methods/Favorites/CreateFavoriteCommand.cs0000644000175000017500000000677012503640373031151 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The create favorite command class. //----------------------------------------------------------------------- namespace Twitterizer.Commands { using System; using System.Globalization; using Twitterizer.Core; /// /// The Create Favorite Command class. Favorites the status specified in the ID parameter as the authenticating user. Returns the favorite status when successful. /// [AuthorizedCommandAttribute] #if !SILVERLIGHT [Serializable] #endif internal sealed class CreateFavoriteCommand : TwitterCommand { /// /// Initializes a new instance of the class. /// /// The tokens. /// The status id. /// The options. public CreateFavoriteCommand(OAuthTokens tokens, decimal statusId, OptionalProperties options) : base(HTTPVerb.POST, string.Format(CultureInfo.InvariantCulture.NumberFormat, "favorites/create.json?id={0}", statusId), tokens, options) { if (tokens == null) { throw new ArgumentNullException("tokens"); } if (statusId <= 0) { throw new ArgumentException("Status Id is required."); } } /// /// Initializes the command. /// public override void Init() { } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Exceptions/0000755000175000017500000000000012503640373023162 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Exceptions/TwitterErrorDetails.cs0000644000175000017500000000642712132510633027475 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter error details class. Contains parsed details returned by twitter in an http response body. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Diagnostics; using System.Xml.Serialization; using Newtonsoft.Json; using Twitterizer.Core; /// /// Twitter Error Details class /// /// Often, twitter returns error details in the body of response. This class represents the data structure of the error for deserialization. [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [XmlRoot("hash")] #if !SILVERLIGHT [Serializable] #endif [DebuggerDisplay("@{ErrorMessage}")] public class TwitterErrorDetails : TwitterObject { /// /// Gets or sets the request path. /// /// The request path. [JsonProperty(PropertyName = "request")] [XmlElement("request")] public string RequestPath { get; set; } /// /// Gets or sets the error message. /// /// The error message. [JsonProperty(PropertyName = "error")] [XmlElement("error")] public string ErrorMessage { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Exceptions/TwitterizerException.cs0000644000175000017500000002165412503640373027734 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Text; #if !SILVERLIGHT using System.Runtime.Serialization; #endif using Core; /// /// The Twitterizer Exception /// /// #if !SILVERLIGHT [Serializable] #endif public class TwitterizerException : WebException { #region Constructors /// /// Initializes a new instance of the class. /// public TwitterizerException() { } /// /// Initializes a new instance of the class. /// /// The message. public TwitterizerException(string message) : base(message) { } /// /// Initializes a new instance of the class. /// /// The message. /// The inner exception. public TwitterizerException(string message, Exception innerException) : base(message, innerException) { if (innerException.GetType() == typeof(WebException)) { HttpWebResponse response = (HttpWebResponse)((WebException)innerException).Response; if (response == null) return; Stream responseStream = response.GetResponseStream(); if (responseStream == null) return; byte[] responseData = ConversionUtility.ReadStream(responseStream); this.ResponseBody = Encoding.UTF8.GetString(responseData, 0, responseData.Length); this.ParseRateLimitHeaders(response); if (response.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) { this.ErrorDetails = SerializationHelper.Deserialize(responseData, null); } #if !SILVERLIGHT else if (response.ContentType.StartsWith("text/xml", StringComparison.OrdinalIgnoreCase)) { // Try to deserialize as XML (specifically OAuth requests) System.Xml.Serialization.XmlSerializer ds = new System.Xml.Serialization.XmlSerializer(typeof(TwitterErrorDetails)); this.ErrorDetails = ds.Deserialize(new MemoryStream(responseData)) as TwitterErrorDetails; } #endif } } #if !SILVERLIGHT /// /// Initializes a new instance of the class. /// /// The serialization info. /// The streaming context. protected TwitterizerException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif #endregion /// /// Gets or sets the result. /// /// The result. public RequestResult Result { get; set; } /// /// Gets or sets the response body. /// /// The response body. public string ResponseBody { get; protected set; } /// /// Gets or sets the rate limits. /// /// The rate limits. public RateLimiting RateLimiting { get; protected set; } /// /// Gets or sets the error details. /// /// The error details. public TwitterErrorDetails ErrorDetails { get; protected set; } /// /// Gets the response that the remote host returned. /// /// /// If a response is available from the Internet resource, a instance that contains the error response from an Internet resource; otherwise, null. public new WebResponse Response { get { return InnerException == null ? null : ((WebException)this.InnerException).Response; } } /// /// Gets the bug report. /// /// The bug report. public string BugReport { get { StringBuilder reportBuilder = new StringBuilder(); reportBuilder.AppendFormat( @" --------------- ERROR MESSAGE --------------- {0} --------------- STACK TRACE ----------------- {1} --------------- RESPONSE BODY --------------- {2} ", this.Message, this.StackTrace, this.ResponseBody); reportBuilder.Append("--------------- HTTP HEADERS ----------------"); for (int i = 0; i < this.Response.Headers.Count; i++) { reportBuilder.AppendFormat( "{0} = \"{1}\"", this.Response.Headers.AllKeys[i], this.Response.Headers[this.Response.Headers.AllKeys[i]]); } return reportBuilder.ToString(); } } /// /// Parses the rate limit headers. /// /// The response. protected void ParseRateLimitHeaders(WebResponse response) { this.RateLimiting = new RateLimiting(); if (response.Headers.AllKeys.Contains("X-Rate-Limit-Limit") && !string.IsNullOrEmpty(response.Headers["X-Rate-Limit-Limit"])) { this.RateLimiting.Total = int.Parse(response.Headers["X-Rate-Limit-Limit"], CultureInfo.InvariantCulture); } if (response.Headers.AllKeys.Contains("X-Rate-Limit-Remaining") && !string.IsNullOrEmpty(response.Headers["X-Rate-Limit-Remaining"])) { this.RateLimiting.Remaining = int.Parse(response.Headers["X-Rate-Limit-Remaining"], CultureInfo.InvariantCulture); } if (!string.IsNullOrEmpty(response.Headers["X-Rate-Limit-Reset"]) && !string.IsNullOrEmpty(response.Headers["X-Rate-Limit-Reset"])) { this.RateLimiting.ResetDate = DateTime.SpecifyKind(new DateTime(1970, 1, 1, 0, 0, 0, 0) .AddSeconds(double.Parse(response.Headers["X-Rate-Limit-Reset"], CultureInfo.InvariantCulture)), DateTimeKind.Utc); } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Exceptions/CommandValidationException.cs0000644000175000017500000001720612132510633030760 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // Provides a means of reporting command validation failures. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Security.Permissions; using System.Text; using Twitterizer.Core; /// /// An exception class indicating that required parameters were missing from a command. /// /// The command type, derived from ITwitterObject. #if !SILVERLIGHT [Serializable] #endif public class CommandValidationException : Exception where T : ITwitterObject { #region Constructors /// /// Initializes a new instance of the class. /// public CommandValidationException() { // Add any type-specific logic, and supply the default message. } /// /// Initializes a new instance of the class. /// /// The message. public CommandValidationException(string message) : base(message) { // Add any type-specific logic. } /// /// Initializes a new instance of the class. /// /// The message. /// The inner exception. public CommandValidationException(string message, Exception innerException) : base(message, innerException) { // Add any type-specific logic for inner exceptions. } /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// /// The parameter is null. /// /// /// The class name is null or is zero (0). /// protected CommandValidationException( SerializationInfo info, StreamingContext context) : base(info, context) { // Implement type-specific serialization constructor logic. } #endregion /// /// Gets or sets the name of the method. /// /// The name of the method. public string MethodName { get; set; } /// /// Gets the name of the command. /// /// The name of the command. public string CommandName { get { return this.Command.GetType().ToString(); } } /// /// Gets the parameters. /// /// The parameters. public string Parameters { get { StringBuilder sb = new StringBuilder(); foreach (KeyValuePair item in this.Command.RequestParameters) { sb.AppendFormat("{0} = \"{1}\"\n", item.Key, item.Value); } return sb.ToString(); } } /// /// Gets or sets the command. /// /// The command. internal ICommand Command { get; set; } #region ISerializable Members /// /// When overridden in a derived class, sets the with information about the exception. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// /// The parameter is a null reference (Nothing in Visual Basic). /// /// /// /// /// public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) throw new ArgumentNullException("info"); base.GetObjectData(info, context); } #endregion } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Properties/0000755000175000017500000000000012253423361023173 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Properties/AssemblyInfo.cs0000644000175000017500000000435012253423361026117 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // //----------------------------------------------------------------------- using System.Runtime.InteropServices; // Uncomment this line for building a .NET 4.0 assembly // [assembly: SecurityRules(SecurityRuleSet.Level1)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("e8e37171-9c87-46e0-9e2e-c16c3ff570a5")]smuxi-1.1/lib/Twitterizer/Twitterizer2/Attributes/0000755000175000017500000000000012253423361023165 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Attributes/RateLimitedAttribute.cs0000644000175000017500000000464412253423361027613 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The rate limited attribute class. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// Identifies command classes that must enforce rate limiting. This will cause rate status to be queried before each command call. /// [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal sealed class RateLimitedAttribute : Attribute { } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Attributes/AuthorizedCommandAttribute.cs0000644000175000017500000000460712253423361031024 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The authorized command attribute class //----------------------------------------------------------------------- namespace Twitterizer.Core { using System; /// /// Indicates that a command class requires authorization tokens. /// [AttributeUsage(System.AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal sealed class AuthorizedCommandAttribute : System.Attribute { } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Settings.StyleCop0000644000175000017500000000307211655552527024341 0ustar00meebeymeebey00000000000000 NoMerge False False is False False smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/0000755000175000017500000000000012652472053021734 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterObject.cs0000644000175000017500000000652212132510633025047 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The base class for all data objects. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System.Collections.Generic; using Newtonsoft.Json; /// /// Represents the callback signature for asynchronous methods. /// /// /// The result. /// public delegate void TwitterAsyncCallback(T result) where T : ITwitterObject; /// /// The base object class /// #if !SILVERLIGHT [System.Serializable] #endif public class TwitterObject : ITwitterObject { /// /// The format that all twitter dates are in. /// protected const string DateFormat = "ddd MMM dd HH:mm:ss zz00 yyyy"; /// /// The format that all twitter search api dates are in. /// protected const string SearchDateFormat = "ddd, dd MMM yyyy HH:mm:ss +zz00"; /// /// Annotations are additional pieces of data, supplied by Twitter clients, in a non-structured dictionary. /// /// The annotations. [JsonProperty(PropertyName = "annotations")] public Dictionary Annotations { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/SerializationHelper.cs0000644000175000017500000001302612253423361026235 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The serialization helper class. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; /// /// The Serialization Helper class. Provides a simple interface for common serialization tasks. /// /// The type of object to be deserialized public static class SerializationHelper where T : ITwitterObject { /// /// The JavascriptConversionDelegate. The delegate is invokes when using the JavaScriptSerializer to manually construct a result object. /// /// Contains nested dictionary objects containing deserialized values for manual parsing. /// A strongly typed object representing the deserialized data of type T. /// public delegate T DeserializationHandler(JObject value); /// /// Deserializes the specified web response. /// /// The web response data. /// The deserialization handler. /// /// A strongly typed object representing the deserialized data of type /// public static T Deserialize(byte[] webResponseData, DeserializationHandler deserializationHandler) { return Deserialize(Encoding.UTF8.GetString(webResponseData, 0, webResponseData.Length), deserializationHandler); } /// /// Deserializes the specified web response. /// /// The web response data. /// /// A strongly typed object representing the deserialized data of type /// public static T Deserialize(byte[] webResponseData) { return Deserialize(Encoding.UTF8.GetString(webResponseData, 0, webResponseData.Length), null); } /// /// Deserializes the specified web response. /// /// The web response data. /// The deserialization handler. /// /// A strongly typed object representing the deserialized data of type /// public static T Deserialize(string webResponseData, DeserializationHandler deserializationHandler) { T resultObject; // Deserialize the results. if (deserializationHandler == null) { resultObject = JsonConvert.DeserializeObject(webResponseData); } else { resultObject = deserializationHandler((JObject)JsonConvert.DeserializeObject(webResponseData)); } return resultObject; } /// /// Deserializes the specified web response. /// /// The web response data. /// /// A strongly typed object representing the deserialized data of type /// public static T Deserialize(string webResponseData) { return Deserialize(webResponseData, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/NamespaceDoc.cs0000644000175000017500000000453511655552527024623 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The dummy file for supplying xml documentation for the Twitterizer.Core namespace. //----------------------------------------------------------------------- namespace Twitterizer.Core { /// /// The namespace contains abstract classes and interfaces /// [System.Runtime.CompilerServices.CompilerGenerated] internal class NamespaceDoc { } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterCursorPagedIdCollection.cs0000644000175000017500000000761312253423361030357 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter cursor paged id collection class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Core; /// /// Holds a collection of ID values that are broken into multiple pages. /// #if !SILVERLIGHT [Serializable] #endif public class TwitterCursorPagedIdCollection : Collection, ITwitterObject { /// /// Annotations are additional pieces of data, supplied by Twitter clients, in a non-structured dictionary. /// /// The annotations. public Dictionary Annotations { get; set; } /// /// Gets or sets the next cursor. /// /// The next cursor. public long NextCursor { get; set; } /// /// Gets or sets the previous cursor. /// /// The previous cursor. public long PreviousCursor { get; set; } /// /// Deserializes the specified value. /// /// The value. /// internal static TwitterCursorPagedIdCollection DeserializeWrapper(JObject value) { if (value == null || value.SelectToken("ids") == null) return null; TwitterCursorPagedIdCollection result = JsonConvert.DeserializeObject(value.SelectToken("ids").ToString()); result.NextCursor = value.SelectToken("next_cursor").Value(); result.PreviousCursor = value.SelectToken("previous_cursor").Value(); return result; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/AccessLevel.cs0000644000175000017500000000573312132510633024452 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The OAuth Token Access Level class. Provides information about the last request made. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Describes the access level of the OAuth Token /// public enum AccessLevel { /// /// The request may not be authenticated or the Access Level header was missing from the response. /// Unknown, /// /// The OAuth token has read access levels only. /// Read, /// /// The OAuth token has read write access only. /// ReadWrite, /// /// The OAuth token has read write and direct messages access. /// ReadWriteDirectMessage, /// /// There was no OAuth token access level available for reading in the response headers. /// Unavailable } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterizerDateConverter.cs0000644000175000017500000001030112253423361027273 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The date converter for Twitter API dates //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Globalization; /// /// Converts date strings returned by the Twitter API into /// public class TwitterizerDateConverter : Newtonsoft.Json.Converters.DateTimeConverterBase { /// /// The date pattern for most dates returned by the API /// protected const string DateFormat = "ddd MMM dd HH:mm:ss zz00 yyyy"; /// /// Reads the json. /// /// The reader. /// Type of the object. /// The existing value. /// The serializer. /// The parsed value as a DateTime, or null. public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { if (reader.Value == null || reader.Value.GetType() != typeof(string)) return new DateTime(); DateTime parsedDate; return DateTime.TryParseExact( (string)reader.Value, DateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate) ? parsedDate : new DateTime(); } /// /// Writes the json. /// /// The writer. /// The value. /// The serializer. public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) { if (value.GetType() != typeof(DateTime)) throw new ArgumentOutOfRangeException("value", "The value provided was not the expected data type."); writer.WriteValue(((DateTime)value).ToString(DateFormat, CultureInfo.InvariantCulture)); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterCollection.cs0000644000175000017500000000542212132510633025732 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The base class for object collections. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System; using System.Collections.ObjectModel; using System.Runtime.Serialization; /// /// The base class for object collections. /// /// The type of object stored in the collection. #if !SILVERLIGHT [Serializable] #endif [DataContract] public abstract class TwitterCollection : Collection where T : class, ITwitterObject { /// /// Gets or sets the annotations. /// /// The annotations. [DataMember] public System.Collections.Generic.Dictionary Annotations { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/CommandPerformer.cs0000644000175000017500000000522212132510633025512 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The command performer. //----------------------------------------------------------------------- namespace Twitterizer.Core { internal static class CommandPerformer { /// /// Performs the action. /// /// The command. /// The parsed result of the action. /// /// public static TwitterResponse PerformAction(ICommand command) where T : ITwitterObject { command.Init(); return command.ExecuteCommand(); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterCommand.cs0000644000175000017500000004471312652472053025235 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The base class for all command classes. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System; using System.Collections.Generic; using System.Globalization; using System.Net; using System.Linq; using System.Text; #if !SILVERLIGHT using System.Web; #endif using Twitterizer; using Newtonsoft.Json; /// /// The base command class. /// /// The business object the command should return. #if !SILVERLIGHT [Serializable] #endif internal abstract class TwitterCommand : ICommand where T : ITwitterObject { /// /// Initializes a new instance of the class. /// /// The method. /// The end point. /// The tokens. /// The optional properties. protected TwitterCommand(HTTPVerb method, string endPoint, OAuthTokens tokens, OptionalProperties optionalProperties) { this.RequestParameters = new Dictionary(); this.Verb = method; this.Tokens = tokens; this.OptionalProperties = optionalProperties ?? new OptionalProperties(); this.SetCommandUri(endPoint); } /// /// Gets or sets the optional properties. /// /// The optional properties. protected OptionalProperties OptionalProperties { get; set; } /// /// Gets or sets the API method URI. /// /// The URI for the API method. private Uri Uri { get; set; } /// /// Gets or sets the method. /// /// The method. private HTTPVerb Verb { get; set; } /// /// Gets or sets the request parameters. /// /// The request parameters. public Dictionary RequestParameters { get; set; } /// /// Gets or sets the serialization delegate. /// /// The serialization delegate. protected SerializationHelper.DeserializationHandler DeserializationHandler { get; set; } /// /// Gets the request tokens. /// /// The request tokens. internal OAuthTokens Tokens { get; private set; } /// /// Initializes the command. /// public abstract void Init(); /// /// Gets or sets a value indicating whether this is multipart. /// /// true if multipart; otherwise, false. protected bool Multipart { get; set; } /// /// Executes the command. /// /// The results of the command. public TwitterResponse ExecuteCommand() { TwitterResponse twitterResponse = new TwitterResponse(); if (this.OptionalProperties.UseSSL) { this.Uri = new Uri(this.Uri.AbsoluteUri.Replace("http://", "https://")); } // Loop through all of the custom attributes assigned to the command class foreach (Attribute attribute in this.GetType().GetCustomAttributes(false)) { if (attribute is AuthorizedCommandAttribute) { if (this.Tokens == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Tokens are required for the \"{0}\" command.", this.GetType())); } if (string.IsNullOrEmpty(this.Tokens.ConsumerKey) || string.IsNullOrEmpty(this.Tokens.ConsumerSecret) || string.IsNullOrEmpty(this.Tokens.AccessToken) || string.IsNullOrEmpty(this.Tokens.AccessTokenSecret)) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Token values cannot be null when executing the \"{0}\" command.", this.GetType())); } } else if (attribute is RateLimitedAttribute) { // Get the rate limiting status if (TwitterRateLimitStatus.GetStatus(this.Tokens).ResponseObject.RemainingHits == 0) { throw new TwitterizerException("You are being rate limited."); } } } // Prepare the query parameters Dictionary queryParameters = new Dictionary(); foreach (KeyValuePair item in this.RequestParameters) { queryParameters.Add(item.Key, item.Value); } // Declare the variable to be returned twitterResponse.ResponseObject = default(T); twitterResponse.RequestUrl = this.Uri.AbsoluteUri; RateLimiting rateLimiting; AccessLevel accessLevel; byte[] responseData; try { WebRequestBuilder requestBuilder = new WebRequestBuilder(this.Uri, this.Verb, this.Tokens) { Multipart = this.Multipart }; #if !SILVERLIGHT if (this.OptionalProperties != null) requestBuilder.Proxy = this.OptionalProperties.Proxy; #endif foreach (var item in queryParameters) { requestBuilder.Parameters.Add(item.Key, item.Value); } HttpWebResponse response = requestBuilder.ExecuteRequest(); if (response == null) { twitterResponse.Result = RequestResult.Unknown; return twitterResponse; } responseData = ConversionUtility.ReadStream(response.GetResponseStream()); twitterResponse.Content = Encoding.UTF8.GetString(responseData, 0, responseData.Length); twitterResponse.RequestUrl = requestBuilder.RequestUri.AbsoluteUri; #if !SILVERLIGHT // Parse the rate limiting HTTP Headers rateLimiting = ParseRateLimitHeaders(response.Headers); // Parse Access Level accessLevel = ParseAccessLevel(response.Headers); #else rateLimiting = null; accessLevel = AccessLevel.Unknown; #endif // Lookup the status code and set the status accordingly SetStatusCode(twitterResponse, response.StatusCode, rateLimiting); twitterResponse.RateLimiting = rateLimiting; twitterResponse.AccessLevel = accessLevel; } catch (WebException wex) { if (new[] { #if !SILVERLIGHT WebExceptionStatus.Timeout, WebExceptionStatus.ConnectionClosed, #endif WebExceptionStatus.ConnectFailure }.Contains(wex.Status)) { twitterResponse.Result = RequestResult.ConnectionFailure; twitterResponse.ErrorMessage = wex.Message; return twitterResponse; } // The exception response should always be an HttpWebResponse, but we check for good measure. HttpWebResponse exceptionResponse = wex.Response as HttpWebResponse; if (exceptionResponse == null) { throw; } responseData = ConversionUtility.ReadStream(exceptionResponse.GetResponseStream()); twitterResponse.Content = Encoding.UTF8.GetString(responseData, 0, responseData.Length); #if MONO_4_0 if (!String.IsNullOrEmpty(twitterResponse.Content)) { var responseContent = JsonConvert.DeserializeObject(twitterResponse.Content); if (responseContent != null && responseContent.errors != null) { var errors = responseContent.errors; if (errors != null && ((IEnumerable)errors).Any()) { foreach (var error in errors) twitterResponse.ErrorMessage += error.code + ":" + error.message + ";"; } } } #endif #if !SILVERLIGHT rateLimiting = ParseRateLimitHeaders(exceptionResponse.Headers); // Parse Access Level accessLevel = ParseAccessLevel(exceptionResponse.Headers); #else rateLimiting = null; accessLevel = AccessLevel.Unknown; #endif // Try to read the error message, if there is one. try { var errorDetails = SerializationHelper.Deserialize(twitterResponse.Content); twitterResponse.ErrorMessage = errorDetails.ErrorMessage; } catch (Exception) { // Occasionally, Twitter responds with XML error data even though we asked for json. // This is that scenario. We will deal with it by doing nothing. It's up to the developer to deal with it. } // Lookup the status code and set the status accordingly SetStatusCode(twitterResponse, exceptionResponse.StatusCode, rateLimiting); twitterResponse.RateLimiting = rateLimiting; twitterResponse.AccessLevel = accessLevel; if (wex.Status == WebExceptionStatus.UnknownError) throw; return twitterResponse; } try { twitterResponse.ResponseObject = SerializationHelper.Deserialize(responseData, this.DeserializationHandler); } catch (Newtonsoft.Json.JsonReaderException) { twitterResponse.ErrorMessage = "Unable to parse JSON"; twitterResponse.Result = RequestResult.Unknown; return twitterResponse; } catch (Newtonsoft.Json.JsonSerializationException) { twitterResponse.ErrorMessage = "Unable to parse JSON"; twitterResponse.Result = RequestResult.Unknown; return twitterResponse; } // Pass the current oauth tokens into the new object, so method calls from there will keep the authentication. twitterResponse.Tokens = this.Tokens; return twitterResponse; } /// /// Sets the status code. /// /// The twitter response. /// The status code. /// The rate limiting. private static void SetStatusCode(TwitterResponse twitterResponse, HttpStatusCode statusCode, RateLimiting rateLimiting) { switch (statusCode) { case HttpStatusCode.OK: twitterResponse.Result = RequestResult.Success; break; case HttpStatusCode.BadRequest: twitterResponse.Result = RequestResult.BadRequest; break; case (HttpStatusCode)420: //Rate Limited from Search/Trends API case (HttpStatusCode)429: twitterResponse.Result = RequestResult.RateLimited; break; case HttpStatusCode.Unauthorized: twitterResponse.Result = RequestResult.Unauthorized; break; case HttpStatusCode.NotFound: twitterResponse.Result = RequestResult.FileNotFound; break; case HttpStatusCode.ProxyAuthenticationRequired: twitterResponse.Result = RequestResult.ProxyAuthenticationRequired; break; case HttpStatusCode.RequestTimeout: twitterResponse.Result = RequestResult.TwitterIsOverloaded; break; case HttpStatusCode.Forbidden: twitterResponse.Result = RequestResult.Unauthorized; break; default: twitterResponse.Result = RequestResult.Unknown; break; } } /// /// Sets the command URI. /// /// The end point. protected void SetCommandUri(string endPoint) { if (endPoint.StartsWith("/")) throw new ArgumentException("The API endpoint cannot begin with a forward slash. This will result in 404 errors and headaches.", "endPoint"); this.Uri = new Uri(string.Concat(this.OptionalProperties.APIBaseAddress, endPoint)); } /// /// Parses the rate limit headers. /// /// The headers of the web response. /// An object that contains the rate-limiting info contained in the response headers private static RateLimiting ParseRateLimitHeaders(WebHeaderCollection responseHeaders) { RateLimiting rateLimiting = new RateLimiting(); if (responseHeaders.AllKeys.Any(x => x.Equals("X-Rate-Limit-Limit", StringComparison.InvariantCultureIgnoreCase))) { rateLimiting.Total = int.Parse(responseHeaders["X-Rate-Limit-Limit"], CultureInfo.InvariantCulture); } if (responseHeaders.AllKeys.Any(x => x.Equals("X-Rate-Limit-Remaining", StringComparison.InvariantCultureIgnoreCase))) { rateLimiting.Remaining = int.Parse(responseHeaders["X-Rate-Limit-Remaining"], CultureInfo.InvariantCulture); } if (!string.IsNullOrEmpty(responseHeaders["X-Rate-Limit-Reset"])) { rateLimiting.ResetDate = DateTime.SpecifyKind(new DateTime(1970, 1, 1, 0, 0, 0, 0) .AddSeconds(double.Parse(responseHeaders["X-Rate-Limit-Reset"], CultureInfo.InvariantCulture)), DateTimeKind.Utc); } else if(!string.IsNullOrEmpty(responseHeaders["Retry-After"])) { rateLimiting.ResetDate = DateTime.UtcNow.AddSeconds(Convert.ToInt32(responseHeaders["Retry-After"])); } return rateLimiting; } /// /// Parses the access level headers. /// /// The headers of the web response. /// An enum of the current access level of the OAuth Token being used. private AccessLevel ParseAccessLevel(WebHeaderCollection responseHeaders) { if (responseHeaders.AllKeys.Any( x => x.Equals("X-Access-Level", StringComparison.InvariantCultureIgnoreCase))) { switch (responseHeaders["X-Access-Level"].ToLower()) { case "read": return AccessLevel.Read; case "read-write": return AccessLevel.ReadWrite; case "read-write-privatemessages": case "read-write-directmessages": return AccessLevel.ReadWriteDirectMessage; } return AccessLevel.Unknown; } return AccessLevel.Unavailable; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/RateLimit.cs0000644000175000017500000000576012132510633024153 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // Contains information about the state of the user's available service usage. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// Provides data about the user's current rate limiting. /// #if !SILVERLIGHT [System.Serializable] #endif public class RateLimiting { /// /// Gets the remaining number of requests until requests are denied. /// /// The remaining requests. public int Remaining { get; internal set; } /// /// Gets the total number of requests allowed before requests are denied. /// /// The total number of requests. public int Total { get; internal set; } /// /// Gets the date the remaining number of requests will be reset. /// /// The reset date. public DateTime ResetDate { get; internal set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterDictionary.cs0000644000175000017500000000567412253423361025762 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The base class for object dictionaries. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System; using System.Collections.ObjectModel; using System.Runtime.Serialization; using System.Collections.Generic; /// /// The base class for object dictionaries. /// /// The type of key object stored in the collection. /// The type of value object stored in the collection. #if !SILVERLIGHT [Serializable] #endif [DataContract] public abstract class TwitterDictionary : Dictionary //where T : class, ITwitterObject where T2: class, ITwitterObject { /// /// Gets or sets the annotations. /// /// The annotations. [DataMember] public Dictionary Annotations { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterImage.cs0000644000175000017500000000634112132510633024662 0ustar00meebeymeebey00000000000000namespace Twitterizer { using System; using System.IO; /// /// The image type that is being uploaded. /// #if !SILVERLIGHT [Serializable] #endif public enum TwitterImageImageType { /// /// JPEG /// Jpeg, /// /// GIF /// Gif, /// /// PNG /// PNG } /// /// Represents an image for uploading. Used to upload new profile and background images. /// #if !SILVERLIGHT [Serializable] #endif public class TwitterImage { /// /// Gets or sets the filename. /// /// The filename. public string Filename { get; set; } /// /// Gets or sets the data. /// /// The data. public byte[] Data { get; set; } /// /// Gets or sets the type of the image. /// /// The type of the image. public TwitterImageImageType ImageType { get; set; } /// /// Gets the image's MIME type. /// /// public string GetMimeType() { switch (this.ImageType) { case TwitterImageImageType.Jpeg: return "image/jpeg"; case TwitterImageImageType.Gif: return "image/gif"; case TwitterImageImageType.PNG: return "image/png"; default: throw new ArgumentOutOfRangeException(); } } /// /// Reads a file from the disk and returns a instance for uploading. /// /// The file path. /// public static TwitterImage ReadFromDisk(string filePath) { if (!File.Exists(filePath)) { throw new ArgumentException(string.Format("File does not be exist: {0}.", filePath)); } TwitterImage newImage = new TwitterImage(); newImage.Data = File.ReadAllBytes(filePath); FileInfo imageFileInfo = new FileInfo(filePath); newImage.Filename = imageFileInfo.Name; switch (imageFileInfo.Extension.ToLower()) { case ".jpg": case ".jpeg": newImage.ImageType = TwitterImageImageType.Jpeg; break; case ".gif": newImage.ImageType = TwitterImageImageType.Gif; break; case ".png": newImage.ImageType = TwitterImageImageType.PNG; break; default: throw new Exception("File is not a recognized type. Must be jpg, png, or gif."); } return newImage; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/ConversionUtility.cs0000644000175000017500000001012712132510633025763 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The color translation helper class. //----------------------------------------------------------------------- namespace Twitterizer { #if !SILVERLIGHT using System.Drawing; #endif using System.IO; using System.Text.RegularExpressions; /// /// Provides common color converstion methods /// /// internal static class ConversionUtility { #if !SILVERLIGHT /// /// Converts the color string to a /// /// The value. /// A representation of the color, or null. internal static Color FromTwitterString(string value) { if (string.IsNullOrEmpty(value)) { return new Color(); } if (Regex.IsMatch(value, @"^#?[a-f0-9]{6}$", RegexOptions.IgnoreCase)) { return ColorTranslator.FromHtml(Regex.Replace(value, "^#?([a-f0-9]{6})$", "#$1", RegexOptions.IgnoreCase)); } return Color.FromName(value); } #endif /// /// Reads the stream into a byte array. /// /// The response stream. /// A byte array. internal static byte[] ReadStream(Stream responseStream) { byte[] data = new byte[32768]; byte[] buffer = new byte[32768]; using (MemoryStream ms = new MemoryStream()) { bool exit = false; while (!exit) { int read = responseStream.Read(buffer, 0, buffer.Length); if (read <= 0) { data = ms.ToArray(); exit = true; } else { ms.Write(buffer, 0, read); } } } return data; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/RequestResult.cs0000644000175000017500000000746012132510633025107 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter status class. Provides information about the last request made. //----------------------------------------------------------------------- namespace Twitterizer { /// /// Describes the result status of a request /// public enum RequestResult { /// /// The request was completed successfully /// Success, /// /// The URI requested is invalid or the resource requested, such as a user, does not exists. /// FileNotFound, /// /// The request was invalid. An accompanying error message will explain why. /// BadRequest, /// /// Authentication credentials were missing or incorrect. /// Unauthorized, /// /// Returned by the Search API when an invalid format is specified in the request. /// NotAcceptable, /// /// The authorized user, or client IP address, is being rate limited. /// RateLimited, /// /// Twitter is currently down. /// TwitterIsDown, /// /// Twitter is online, but is overloaded. Try again later. /// TwitterIsOverloaded, /// /// The request failed due to a connection issue or timeout. /// ConnectionFailure, /// /// Something unexpected happened. See the error message for additional information. /// Unknown, /// /// Failed to authenticate with the proxy. /// ProxyAuthenticationRequired } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/ITwitterObject.cs0000644000175000017500000000503012132510633025151 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The interface for all collections and business entities. //----------------------------------------------------------------------- namespace Twitterizer.Core { /// /// The ITwitterObject interface. /// /// public interface ITwitterObject { /// /// Annotations are additional pieces of data, supplied by Twitter clients, in a non-structured dictionary. /// /// The annotations. System.Collections.Generic.Dictionary Annotations { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/OptionalProperties.xml0000644000175000017500000000701612253423361026317 0ustar00meebeymeebey00000000000000 Provides a base class for method specific optional parameters, as well as properties for providing configuration settings at run time. Allows modification of the API endpoint addresses to enable SSL communication. The default value can be set at an application level by adding a Twitterizer2.EnableSSL application setting with the value true. For example: ]]> The current configured value. true if enabled, otherwise false. Default: false The default value can be set at an application level by adding a Twitterizer2.APIBaseAddress application setting with the base address as the value. For example: ]]> The API end point base address. Default: "http://api.twitter.com/1.1/" Allows run time enabling of API output caching. The default value can be set at an application level by adding a Twitterizer2.EnableCaching application setting with value true. For example: ]]> The currently configured value. true if enabled, otherwise false. Default: false Allows configuration of the sliding expiration timespan for output caching. The default value can be set at an application level by adding a Twitterizer2.CacheTimeout application setting with value equal to the number of seconds of the duration. For example: ]]> The duration that API output should be cached, on a sliding expiration, once enabled. Default: 5 minutes Allows overriding of the default proxy settings for API call requests. The supplied , or null. smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/TwitterIdCollection.cs0000644000175000017500000001123412253423361026212 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The twitter id collection class. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Core; /// /// Holds a collection of ID values /// #if !SILVERLIGHT [Serializable] #endif public class TwitterIdCollection : Collection, ITwitterObject { /// /// Initializes a new instance of the class. /// /// public TwitterIdCollection() { } /// /// Initializes a new instance of the class. /// /// The items. /// public TwitterIdCollection(List items) { items.ForEach(Add); } /// /// Annotations are additional pieces of data, supplied by Twitter clients, in a non-structured dictionary. /// /// The annotations. public Dictionary Annotations { get; set; } /// /// Performs an explicit conversion from to . /// /// The collection. /// The result of the conversion. /// public static explicit operator TwitterIdCollection (List collection) { TwitterIdCollection newCollection = new TwitterIdCollection(); foreach (var item in collection) { newCollection.Add(item); } return newCollection; } } /// /// Holds extension methods related to the class. /// /// public static class TwitterIdCollectionExtensions { /// /// Converts the collection to a class. /// /// The old. /// /// public static TwitterIdCollection ToIdCollection(this IEnumerable old) { TwitterIdCollection newCollection = new TwitterIdCollection(); foreach (var item in old) { newCollection.Add(item); } return newCollection; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/ICommand.cs0000644000175000017500000000566312132510633023752 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The interface that all valid commands must implement. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System.Collections.Generic; /// /// The ICommand interface. /// /// The Type of the BaseObject that the command returns /// public interface ICommand where T : ITwitterObject { /// /// Gets the request parameters. /// /// The request parameters. Dictionary RequestParameters { get; } /// /// Initializes the command. /// void Init(); /// /// Executes the command. /// /// The results of the command. /// TwitterResponse ExecuteCommand(); } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Core/OptionalProperties.cs0000644000175000017500000000672512274103753026135 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The base class for optional property classes //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Configuration; using System.Net; /// #if !SILVERLIGHT [Serializable] #endif public class OptionalProperties { /// /// Initializes a new instance of the class. /// public OptionalProperties() { // Set the default values for the properties // as of 14 Janary 2014 HTTPS is required and enforced: // https://dev.twitter.com/discussions/24239 this.UseSSL = true; this.APIBaseAddress = "https://api.twitter.com/1.1/"; } /// /// /// Allows configuration of the base address for API method requests for support for 3rd party 'twitter-like' APIs. /// public bool UseSSL { get; set; } /// public string APIBaseAddress { get; set; } #if !SILVERLIGHT /// public WebProxy Proxy { get; set; } #endif } } smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/0000755000175000017500000000000012253423361022057 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/OAuthUtility.cs0000644000175000017500000003656012253423361025024 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // Provides simple methods to simplify OAuth interaction. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Globalization; using System.IO; using System.Net; using System.Text; using System.Text.RegularExpressions; #if !SILVERLIGHT using System.Web; #endif /// public static class OAuthUtility { #region Public Methods /// /// Gets the request token. /// /// The consumer key. /// The consumer secret. /// The callback address. For PIN-based authentication "oob" should be supplied. /// public static OAuthTokenResponse GetRequestToken(string consumerKey, string consumerSecret, string callbackAddress) { if (string.IsNullOrEmpty(consumerKey)) { throw new ArgumentNullException("consumerKey"); } if (string.IsNullOrEmpty(consumerSecret)) { throw new ArgumentNullException("consumerSecret"); } if (string.IsNullOrEmpty(callbackAddress)) { throw new ArgumentNullException("callbackAddress", @"You must always provide a callback url when obtaining a request token. For PIN-based authentication, use ""oob"" as the callback url."); } WebRequestBuilder builder = new WebRequestBuilder( new Uri("https://api.twitter.com/oauth/request_token"), HTTPVerb.POST, new OAuthTokens { ConsumerKey = consumerKey, ConsumerSecret = consumerSecret }); if (!string.IsNullOrEmpty(callbackAddress)) { builder.Parameters.Add("oauth_callback", callbackAddress); } string responseBody = null; try { HttpWebResponse webResponse = builder.ExecuteRequest(); Stream responseStream = webResponse.GetResponseStream(); if (responseStream != null) responseBody = new StreamReader(responseStream).ReadToEnd(); } catch (WebException wex) { throw new TwitterizerException(wex.Message, wex); } return new OAuthTokenResponse { Token = ParseQuerystringParameter("oauth_token", responseBody), TokenSecret = ParseQuerystringParameter("oauth_token_secret", responseBody), VerificationString = ParseQuerystringParameter("oauth_verifier", responseBody) }; } /// /// Tries to the parse querystring parameter. /// /// Name of the parameter. /// The text. /// The value of the parameter or an empty string. /// private static string ParseQuerystringParameter(string parameterName, string text) { Match expressionMatch = Regex.Match(text, string.Format(@"{0}=(?[^&]+)", parameterName)); if (!expressionMatch.Success) { return string.Empty; } return expressionMatch.Groups["value"].Value; } #if !SILVERLIGHT /// /// Gets a new OAuth request token from the twitter api. /// /// The consumer key. /// The consumer secret. /// The callback address. For PIN-based authentication "oob" should be supplied. /// The proxy. /// /// A new instance. /// public static OAuthTokenResponse GetRequestToken(string consumerKey, string consumerSecret, string callbackAddress, WebProxy proxy) { if (string.IsNullOrEmpty(consumerKey)) { throw new ArgumentNullException("consumerKey"); } if (string.IsNullOrEmpty(consumerSecret)) { throw new ArgumentNullException("consumerSecret"); } if (string.IsNullOrEmpty(callbackAddress)) { throw new ArgumentNullException("callbackAddress", @"You must always provide a callback url when obtaining a request token. For PIN-based authentication, use ""oob"" as the callback url."); } WebRequestBuilder builder = new WebRequestBuilder( new Uri("https://api.twitter.com/oauth/request_token"), HTTPVerb.POST, new OAuthTokens { ConsumerKey = consumerKey, ConsumerSecret = consumerSecret }) { Proxy = proxy }; if (!string.IsNullOrEmpty(callbackAddress)) { builder.Parameters.Add("oauth_callback", callbackAddress); } string responseBody = null; try { HttpWebResponse webResponse = builder.ExecuteRequest(); Stream responseStream = webResponse.GetResponseStream(); if (responseStream != null) responseBody = new StreamReader(responseStream).ReadToEnd(); } catch (WebException wex) { throw new TwitterizerException(wex.Message, wex); } Match matchedValues = Regex.Match(responseBody, @"oauth_token=(?[^&]+)|oauth_token_secret=(?[^&]+)|oauth_verifier=(?[^&]+)"); return new OAuthTokenResponse { Token = matchedValues.Groups["token"].Value, TokenSecret = matchedValues.Groups["secret"].Value, VerificationString = matchedValues.Groups["verifier"].Value }; } #endif /// /// Gets the access token. /// /// The consumer key. /// The consumer secret. /// The request token. /// The pin number or verifier string. /// /// An class containing access token information. /// public static OAuthTokenResponse GetAccessToken(string consumerKey, string consumerSecret, string requestToken, string verifier) { if (string.IsNullOrEmpty(consumerKey)) { throw new ArgumentNullException("consumerKey"); } if (string.IsNullOrEmpty(consumerSecret)) { throw new ArgumentNullException("consumerSecret"); } if (string.IsNullOrEmpty(requestToken)) { throw new ArgumentNullException("requestToken"); } WebRequestBuilder builder = new WebRequestBuilder( new Uri("https://api.twitter.com/oauth/access_token"), HTTPVerb.GET, new OAuthTokens { ConsumerKey = consumerKey, ConsumerSecret = consumerSecret }); if (!string.IsNullOrEmpty(verifier)) { builder.Parameters.Add("oauth_verifier", verifier); } builder.Parameters.Add("oauth_token", requestToken); string responseBody; try { HttpWebResponse webResponse = builder.ExecuteRequest(); responseBody = new StreamReader(webResponse.GetResponseStream()).ReadToEnd(); } catch (WebException wex) { throw new TwitterizerException(wex.Message, wex); } OAuthTokenResponse response = new OAuthTokenResponse(); response.Token = Regex.Match(responseBody, @"oauth_token=([^&]+)").Groups[1].Value; response.TokenSecret = Regex.Match(responseBody, @"oauth_token_secret=([^&]+)").Groups[1].Value; response.UserId = long.Parse(Regex.Match(responseBody, @"user_id=([^&]+)").Groups[1].Value, CultureInfo.CurrentCulture); response.ScreenName = Regex.Match(responseBody, @"screen_name=([^&]+)").Groups[1].Value; return response; } #if !SILVERLIGHT /// /// Gets the access token. /// /// The consumer key. /// The consumer secret. /// The request token. /// The pin number or verifier string. /// The proxy. /// /// An class containing access token information. /// public static OAuthTokenResponse GetAccessToken(string consumerKey, string consumerSecret, string requestToken, string verifier, WebProxy proxy) { if (string.IsNullOrEmpty(consumerKey)) { throw new ArgumentNullException("consumerKey"); } if (string.IsNullOrEmpty(consumerSecret)) { throw new ArgumentNullException("consumerSecret"); } if (string.IsNullOrEmpty(requestToken)) { throw new ArgumentNullException("requestToken"); } WebRequestBuilder builder = new WebRequestBuilder( new Uri("https://api.twitter.com/oauth/access_token"), HTTPVerb.GET, new OAuthTokens { ConsumerKey = consumerKey, ConsumerSecret = consumerSecret }); builder.Proxy = proxy; if (!string.IsNullOrEmpty(verifier)) { builder.Parameters.Add("oauth_verifier", verifier); } builder.Parameters.Add("oauth_token", requestToken); string responseBody; try { HttpWebResponse webResponse = builder.ExecuteRequest(); responseBody = new StreamReader(webResponse.GetResponseStream()).ReadToEnd(); } catch (WebException wex) { throw new TwitterizerException(wex.Message, wex); } OAuthTokenResponse response = new OAuthTokenResponse(); response.Token = Regex.Match(responseBody, @"oauth_token=([^&]+)").Groups[1].Value; response.TokenSecret = Regex.Match(responseBody, @"oauth_token_secret=([^&]+)").Groups[1].Value; response.UserId = long.Parse(Regex.Match(responseBody, @"user_id=([^&]+)").Groups[1].Value, CultureInfo.CurrentCulture); response.ScreenName = Regex.Match(responseBody, @"screen_name=([^&]+)").Groups[1].Value; return response; } #endif #endregion /// /// Builds the authorization URI. /// /// The request token. /// A new instance. public static Uri BuildAuthorizationUri(string requestToken) { return BuildAuthorizationUri(requestToken, false); } /// /// Builds the authorization URI. /// /// The request token. /// if set to true, the authenticate url will be used. (See: "Sign in with Twitter") /// A new instance. public static Uri BuildAuthorizationUri(string requestToken, bool authenticate) { StringBuilder parameters = new StringBuilder("https://twitter.com/oauth/"); if (authenticate) { parameters.Append("authenticate"); } else { parameters.Append("authorize"); } parameters.AppendFormat("?oauth_token={0}", requestToken); return new Uri(parameters.ToString()); } #if !LITE && !SILVERLIGHT /// /// Adds the OAuth Echo header to the supplied web request. /// /// The request. /// The tokens. public static void AddOAuthEchoHeader(WebRequest request, OAuthTokens tokens) { WebRequestBuilder builder = new WebRequestBuilder( new Uri("https://api.twitter.com/1.1/account/verify_credentials.json"), HTTPVerb.POST, tokens); builder.PrepareRequest(); request.Headers.Add("X-Verify-Credentials-Authorization", builder.GenerateAuthorizationHeader()); request.Headers.Add("X-Auth-Service-Provider", "https://api.twitter.com/1.1/account/verify_credentials.json"); } #endif } } smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/OAuthTokens.cs0000644000175000017500000001064612132510633024614 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // Contains assembly information. //----------------------------------------------------------------------- namespace Twitterizer { /// #if !SILVERLIGHT [System.Serializable] #endif public class OAuthTokens { /// /// Gets or sets the access token. /// /// The access token. public string AccessToken { internal get; set; } /// /// Gets or sets the access token secret. /// /// The access token secret. public string AccessTokenSecret { internal get; set; } /// /// Gets or sets the consumer key. /// /// The consumer key. public string ConsumerKey { internal get; set; } /// /// Gets or sets the consumer secret. /// /// The consumer secret. public string ConsumerSecret { internal get; set; } /// /// Gets a value indicating whether this instance has consumer token values. /// /// /// true if this instance has consumer token; otherwise, false. /// public bool HasConsumerToken { get { return !string.IsNullOrEmpty(this.ConsumerKey) && !string.IsNullOrEmpty(this.ConsumerSecret); } } /// /// Gets a value indicating whether this instance has access token values. /// /// /// true if this instance has access token; otherwise, false. /// public bool HasAccessToken { get { return !string.IsNullOrEmpty(this.AccessToken) && !string.IsNullOrEmpty(this.AccessTokenSecret); } } /// /// Gets a value indicating whether this instance has values. This does not verify that the values are correct. /// /// /// true if this instance has values; otherwise, false. /// public bool HasBothTokens { get { return this.HasAccessToken && this.HasConsumerToken; } } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/XAuthUtility.cs0000644000175000017500000001175112253423361025030 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The xAuth Utility Class //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; using System.Text.RegularExpressions; using Twitterizer.Core; /// /// The XAuthUtility class. /// public static class XAuthUtility { /// /// Allows OAuth applications to directly exchange Twitter usernames and passwords for OAuth access tokens and secrets. /// /// The consumer key. /// The consumer secret. /// The username. /// The password. /// A instance. public static OAuthTokenResponse GetAccessTokens(string consumerKey, string consumerSecret, string username, string password) { if (string.IsNullOrEmpty(consumerKey)) { throw new ArgumentNullException("consumerKey"); } if (string.IsNullOrEmpty(consumerSecret)) { throw new ArgumentNullException("consumerSecret"); } if (string.IsNullOrEmpty(username)) { throw new ArgumentNullException("username"); } if (string.IsNullOrEmpty(password)) { throw new ArgumentNullException("password"); } OAuthTokenResponse response = new OAuthTokenResponse(); try { WebRequestBuilder builder = new WebRequestBuilder( new Uri("https://api.twitter.com/oauth/access_token"), HTTPVerb.POST, new OAuthTokens { ConsumerKey = consumerKey, ConsumerSecret = consumerSecret }); builder.Parameters.Add("x_auth_username", username); builder.Parameters.Add("x_auth_password", password); builder.Parameters.Add("x_auth_mode", "client_auth"); string responseBody = new StreamReader(builder.ExecuteRequest().GetResponseStream()).ReadToEnd(); response.Token = Regex.Match(responseBody, @"oauth_token=([^&]+)").Groups[1].Value; response.TokenSecret = Regex.Match(responseBody, @"oauth_token_secret=([^&]+)").Groups[1].Value; if (responseBody.Contains("user_id=")) response.UserId = long.Parse(Regex.Match(responseBody, @"user_id=([^&]+)").Groups[1].Value, CultureInfo.CurrentCulture); response.ScreenName = Regex.Match(responseBody, @"screen_name=([^&]+)").Groups[1].Value; } catch (WebException wex) { throw new TwitterizerException(wex.Message, wex); } return response; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/OAuthTokens.xml0000644000175000017500000000210111655552527025013 0ustar00meebeymeebey00000000000000 Contains security tokens nessisary for performing authorized actions against the Twitter API To perform authorized actions, you must create a new OAuthTokens variable and supply values for the , , , and properties, as follows: OAuthTokens tokens = new OAuthTokens(); tokens.AccessToken = "XXX"; tokens.AccessTokenSecret = "XXX"; tokens.ConsumerKey = "XXX"; tokens.ConsumerSecret = "XXX"; Dim tokens As new OAuthTokens(); tokens.AccessToken = "XXX" tokens.AccessTokenSecret = "XXX" tokens.ConsumerKey = "XXX" tokens.ConsumerSecret = "XXX" smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/OAuthUtility.xml0000644000175000017500000000637112132510633025207 0ustar00meebeymeebey00000000000000 A utility for handling authorization and request signatures for the OAuth protocol. Before you begin, you will need to register your application with Twitter. To authenticate a user, there are 3 steps you will take:
1) Obtain a Request Token
2) Authentication
3) Obtain an Access Token
First, you must obtain a request token from the API. string consumerKey = "XXX"; string consumerSecret = "XXX"; string callbackUrl = "http://example.com/callback.aspx"; // Obtain a request token OAuthTokenResponse requestToken = OAuthUtility.GetRequestToken(consumerKey, consumerSecret, callbackUrl); // Direct or instruct the user to the following address: Uri authorizationUri = OAuthUtility.BuildAuthorizationUri(requestToken.Token); Dim consumerKey As String = "XXX" Dim consumerSecret As String = "XXX" Dim callbackUrl As String = "http://example.com/callback.aspx" '-- Obtain a request token Dim requestToken As OAuthTokenResponse = OAuthUtility.GetRequestToken(consumerKey, consumerSecret, callbackUrl) '-- Direct or instruct the user to the following address: Dim authorizationUri As Uri = OAuthUtility.BuildAuthorizationUri(requestToken.Token) After the user has returned, you must obtain or reuse the request token and obtain the verifier value. For web applications, both values will be provided on the querystring to the callback url as oauth_token and oauth_verifier, respectively. For desktop and mobile applications, the verifier will be a numeric PIN supplied to the user. string consumerKey = "XXX"; string consumerSecret = "XXX"; string requestToken = "XXX"; string verifier = "XXX"; // Obtain the access token for this user. OAuthTokenResponse accessToken = OAuthUtility.GetAccessToken(consumerKey, consumerSecret, requestToken, verifier); // TODO: Save the access token to a database, session, xml file, or whereever my user data is stored. Dim consumerKey As String = "XXX" Dim consumerSecret As String = "XXX" Dim requestToken As String = "XXX" Dim verifier As String = "XXX" '-- Obtain the access token for this user. Dim accessToken As OAuthTokenResponse = OAuthUtility.GetAccessToken(consumerKey, consumerSecret, requestToken, verifier) '-- TODO: Save the access token to a database, session, xml file, or whereever my user data is stored.
smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/WebRequestBuilder.cs0000644000175000017500000006324112253423361026011 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // Provides the means of preparing and executing Anonymous and OAuth signed web requests. //----------------------------------------------------------------------- namespace Twitterizer { using System; using System.IO; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; #if SILVERLIGHT using System.Net.Browser; using System.Threading; using System.Windows.Threading; #endif /// /// Enumeration of the supported HTTP verbs supported by the /// public enum HTTPVerb { /// /// The HTTP GET method is used to retrieve data. /// GET, /// /// The HTTP POST method is used to transmit data. /// POST, /// /// The HTTP DELETE method is used to indicate that a resource should be deleted. /// DELETE } /// /// The Web Request Builder class. /// public sealed class WebRequestBuilder { /// /// Holds file data form performing multipart form posts. /// private byte[] formData; /// /// The HTTP Authorization realm. /// public const string Realm = "Twitter API"; /// /// Gets or sets the request URI. /// /// The request URI. public Uri RequestUri { get; set; } /// /// Gets or sets the parameters. /// /// The parameters. public Dictionary Parameters { get; private set; } /// /// Gets or sets the verb. /// /// The verb. public HTTPVerb Verb { get; set; } /// /// Gets or sets the oauth tokens. /// /// The tokens. public OAuthTokens Tokens { private get; set; } /// /// Gets or sets the UserAgent. /// /// The User Agent. private readonly string userAgent; /// /// Gets or sets the Basic Auth Credentials. /// /// The Basic Auth Credentials. private readonly NetworkCredential networkCredentials; /// /// Gets or sets the Multipart config /// /// Multipart public bool Multipart { get; set; } /// /// Gets or sets whether to use accept compression on this request /// /// UseCompression public bool UseCompression { get; set; } #if !SILVERLIGHT /// /// Gets or sets the proxy. /// /// The proxy. public WebProxy Proxy { get; set; } #endif /// /// Gets or sets a value indicating whether the request will be signed with an OAuth authorization header. /// /// true if [use O auth]; otherwise, false. public bool UseOAuth { get; private set; } /// /// OAuth Parameters key names to include in the Authorization header. /// private static readonly string[] OAuthParametersToIncludeInHeader = new[] { "oauth_version", "oauth_nonce", "oauth_timestamp", "oauth_signature_method", "oauth_consumer_key", "oauth_token", "oauth_verifier" // Leave signature omitted from the list, it is added manually // "oauth_signature", }; /// /// Parameters that may appear in the list, but should never be included in the header or the request. /// private static readonly string[] SecretParameters = new[] { "oauth_consumer_secret", "oauth_token_secret", "oauth_signature" }; /// /// Initializes a new instance of the class. /// /// The request URI. /// The http verb. /// The http user agent. /// The network credentials. /// public WebRequestBuilder(Uri requestUri, HTTPVerb verb, String userAgent, NetworkCredential networkCredentials) { if (requestUri == null) throw new ArgumentNullException("requestUri"); this.RequestUri = requestUri; this.Verb = verb; this.userAgent = userAgent; this.UseOAuth = false; if (networkCredentials != null) this.networkCredentials = networkCredentials; this.Parameters = new Dictionary(); if (string.IsNullOrEmpty(this.RequestUri.Query)) return; foreach (Match item in Regex.Matches(this.RequestUri.Query, @"(?[^&?=]+)=(?[^&?=]+)")) { this.Parameters.Add(item.Groups["key"].Value, item.Groups["value"].Value); } this.RequestUri = new Uri(this.RequestUri.AbsoluteUri.Replace(this.RequestUri.Query, "")); } /// /// Initializes a new instance of the class. /// /// The request URI. /// The verb. /// The tokens. /// The user agent. public WebRequestBuilder(Uri requestUri, HTTPVerb verb, OAuthTokens tokens, string userAgent = "") : this(requestUri, verb, userAgent, null) { this.Tokens = tokens; if (tokens != null) { if (string.IsNullOrEmpty(this.Tokens.ConsumerKey) || string.IsNullOrEmpty(this.Tokens.ConsumerSecret)) { throw new ArgumentException("Consumer key and secret are required for OAuth requests."); } if (string.IsNullOrEmpty(this.Tokens.AccessToken) ^ string.IsNullOrEmpty(this.Tokens.AccessTokenSecret)) { throw new ArgumentException("The access token is invalid. You must specify the key AND secret values."); } this.UseOAuth = true; } } /// /// Executes the request. /// /// public HttpWebResponse ExecuteRequest() { HttpWebRequest request = PrepareRequest(); #if !SILVERLIGHT return (HttpWebResponse)request.GetResponse(); #else request.AllowReadStreamBuffering = true; HttpWebResponse response = null; AutoResetEvent alldone = new AutoResetEvent(false); request.BeginGetResponse(param => { HttpWebRequest req = (HttpWebRequest)param.AsyncState; try { response = (HttpWebResponse)req.EndGetResponse(param); } catch (WebException we) { response = (HttpWebResponse)we.Response; } finally { alldone.Set(); } }, request); alldone.WaitOne(); return response; #endif } /// /// Prepares the request. It is not nessisary to call this method unless additional configuration is required. /// /// A object fully configured and ready for execution. public HttpWebRequest PrepareRequest() { SetupOAuth(); formData = null; string contentType = string.Empty; if (!Multipart) { //We don't add the parameters to the query if we are multipart-ing AddQueryStringParametersToUri(); } else { string dataBoundary = "--------------------r4nd0m"; contentType = "multipart/form-data; boundary=" + dataBoundary; formData = GetMultipartFormData(Parameters, dataBoundary); this.Verb = HTTPVerb.POST; } HttpWebRequest request; #if SILVERLIGHT request = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(this.RequestUri); if (this.RequestUri.Host.Contains("search.twitter.com") || this.RequestUri.Host.Contains("api.twitter.com")) //-- DG HACK FOR TWITTER QUERIES TO FIX BAD COOKIE DOMAIN= DATA BEING RETURNED FROM TWITTER. { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(this.RequestUri, new Cookie("k", "Twitterizer hack for bad twitter cookie")); } #else request = (HttpWebRequest)WebRequest.Create(this.RequestUri); if (this.UseCompression == true) request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; else request.AutomaticDecompression = DecompressionMethods.None; if (this.Proxy != null) request.Proxy = Proxy; #endif if (!this.UseOAuth && this.networkCredentials != null) { request.Credentials = this.networkCredentials; request.UseDefaultCredentials = false; } else { request.UseDefaultCredentials = true; } request.Method = this.Verb.ToString(); request.ContentLength = Multipart ? ((formData != null) ? formData.Length: 0) : 0; #if !SILVERLIGHT // No silverlight user-agent as Assembly.GetName() isn't supported and setting the request.UserAgent is also not supported. request.UserAgent = (string.IsNullOrEmpty(userAgent)) ? string.Format(CultureInfo.InvariantCulture, "Twitterizer/{0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) : userAgent; request.ServicePoint.Expect100Continue = false; #endif if (this.UseOAuth) { #if !SILVERLIGHT request.Headers.Add("Authorization", GenerateAuthorizationHeader()); #else request.Headers["Authorization"] = GenerateAuthorizationHeader(); #endif } if (Multipart) { //Parameters are not added to the query string, post them in the request body instead request.ContentType = contentType; #if !SILVERLIGHT using (Stream requestStream = request.GetRequestStream()) #else IAsyncResult getRequestStreamResult = request.BeginGetRequestStream( res => { }, null); using (Stream requestStream = request.EndGetRequestStream(getRequestStreamResult)) #endif { if (formData != null) { requestStream.Write(formData, 0, formData.Length); } } } return request; } /// /// Adds the parameters to request uri. /// private void AddQueryStringParametersToUri() { StringBuilder requestParametersBuilder = new StringBuilder(this.RequestUri.AbsoluteUri); requestParametersBuilder.Append(this.RequestUri.Query.Length == 0 ? "?" : "&"); Dictionary fieldsToInclude = new Dictionary(this.Parameters.Where(p => !OAuthParametersToIncludeInHeader.Contains(p.Key) && !SecretParameters.Contains(p.Key)).ToDictionary(p => p.Key, p => p.Value)); foreach (KeyValuePair item in fieldsToInclude) { if (item.Value is string) requestParametersBuilder.AppendFormat("{0}={1}&", item.Key, UrlEncode((string)item.Value)); } if (requestParametersBuilder.Length == 0) return; requestParametersBuilder.Remove(requestParametersBuilder.Length - 1, 1); this.RequestUri = new Uri(requestParametersBuilder.ToString()); } private byte[] GetMultipartFormData(Dictionary param, string boundary) { Stream formDataStream = new MemoryStream(); Encoding encoding = Encoding.UTF8; Dictionary fieldsToInclude = new Dictionary(param.Where(p => !OAuthParametersToIncludeInHeader.Contains(p.Key) && !SecretParameters.Contains(p.Key)).ToDictionary(p => p.Key, p => p.Value)); foreach (KeyValuePair kvp in fieldsToInclude) { if (kvp.Value.GetType() == typeof(byte[])) { //assume this to be a byte stream byte[] data = (byte[])kvp.Value; string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: application/octet-stream\r\n\r\n", boundary, kvp.Key, kvp.Key); byte[] headerBytes = encoding.GetBytes(header); formDataStream.Write(headerBytes, 0, headerBytes.Length); formDataStream.Write(data, 0, data.Length); } else { //this is normal text data string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n", boundary, kvp.Key, kvp.Value); byte[] headerBytes = encoding.GetBytes(header); formDataStream.Write(headerBytes, 0, headerBytes.Length); } } string footer = string.Format("\r\n--{0}--\r\n", boundary); formDataStream.Write(encoding.GetBytes(footer), 0, footer.Length); formDataStream.Position = 0; byte[] returndata = new byte[formDataStream.Length]; formDataStream.Read(returndata, 0, returndata.Length); formDataStream.Close(); return returndata; } #region OAuth Helper Methods /// /// Sets up the OAuth request details. /// private void SetupOAuth() { // We only sign oauth requests if (!this.UseOAuth) { return; } // Add the OAuth parameters this.Parameters.Add("oauth_version", "1.0"); this.Parameters.Add("oauth_nonce", GenerateNonce()); this.Parameters.Add("oauth_timestamp", GenerateTimeStamp()); this.Parameters.Add("oauth_signature_method", "HMAC-SHA1"); this.Parameters.Add("oauth_consumer_key", this.Tokens.ConsumerKey); this.Parameters.Add("oauth_consumer_secret", this.Tokens.ConsumerSecret); if (!string.IsNullOrEmpty(this.Tokens.AccessToken)) { this.Parameters.Add("oauth_token", this.Tokens.AccessToken); } if (!string.IsNullOrEmpty(this.Tokens.AccessTokenSecret)) { this.Parameters.Add("oauth_token_secret", this.Tokens.AccessTokenSecret); } string signature = GenerateSignature(); // Add the signature to the oauth parameters this.Parameters.Add("oauth_signature", signature); } /// /// Generates the signature. /// /// public string GenerateSignature() { IEnumerable> nonSecretParameters; if (Multipart) { nonSecretParameters = (from p in this.Parameters where (!SecretParameters.Contains(p.Key) && p.Key.StartsWith("oauth_")) select p); } else { nonSecretParameters = (from p in this.Parameters where (!SecretParameters.Contains(p.Key)) select p); } Uri urlForSigning = this.RequestUri; // Create the base string. This is the string that will be hashed for the signature. string signatureBaseString = string.Format( CultureInfo.InvariantCulture, "{0}&{1}&{2}", this.Verb.ToString().ToUpper(CultureInfo.InvariantCulture), UrlEncode(NormalizeUrl(urlForSigning)), UrlEncode(nonSecretParameters)); // Create our hash key (you might say this is a password) string key = string.Format( CultureInfo.InvariantCulture, "{0}&{1}", UrlEncode(this.Tokens.ConsumerSecret), UrlEncode(this.Tokens.AccessTokenSecret)); // Generate the hash HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(key)); byte[] signatureBytes = hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(signatureBaseString)); return Convert.ToBase64String(signatureBytes); } /// /// Generate the timestamp for the signature /// /// A timestamp value in a string. public static string GenerateTimeStamp() { // Default implementation of UNIX time of the current UTC time TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds, CultureInfo.CurrentCulture).ToString(CultureInfo.CurrentCulture); } /// /// Generate a nonce /// /// A random number between 123400 and 9999999 in a string. public static string GenerateNonce() { // Just a simple implementation of a random number between 123400 and 9999999 return new Random() .Next(123400, int.MaxValue) .ToString("X", CultureInfo.InvariantCulture); } /// /// Normalizes the URL. /// /// The URL to normalize. /// The normalized url string. public static string NormalizeUrl(Uri url) { string normalizedUrl = string.Format(CultureInfo.InvariantCulture, "{0}://{1}", url.Scheme, url.Host); if (!((url.Scheme == "http" && url.Port == 80) || (url.Scheme == "https" && url.Port == 443))) { normalizedUrl += ":" + url.Port; } normalizedUrl += url.AbsolutePath; return normalizedUrl; } /// /// Encodes a value for inclusion in a URL querystring. /// /// The value to Url encode /// Returns a Url encoded string public static string UrlEncode(string value) { if (string.IsNullOrEmpty(value)) { return string.Empty; } value = Uri.EscapeDataString(value); // UrlEncode escapes with lowercase characters (e.g. %2f) but oAuth needs %2F value = Regex.Replace(value, "(%[0-9a-f][0-9a-f])", c => c.Value.ToUpper()); // these characters are not escaped by UrlEncode() but needed to be escaped value = value .Replace("(", "%28") .Replace(")", "%29") .Replace("$", "%24") .Replace("!", "%21") .Replace("*", "%2A") .Replace("'", "%27"); // these characters are escaped by UrlEncode() but will fail if unescaped! value = value.Replace("%7E", "~"); return value; } /// /// Encodes a series of key/value pairs for inclusion in a URL querystring. /// /// The parameters. /// A string of all the keys and value pairs with the values encoded. private static string UrlEncode(IEnumerable> parameters) { StringBuilder parameterString = new StringBuilder(); var paramsSorted = from p in parameters orderby p.Key, p.Value select p; foreach (var item in paramsSorted) { if (item.Value is string) { if (parameterString.Length > 0) { parameterString.Append("&"); } parameterString.Append( string.Format( CultureInfo.InvariantCulture, "{0}={1}", UrlEncode(item.Key), UrlEncode((string)item.Value))); } } return UrlEncode(parameterString.ToString()); } /// /// Generates the authorization header. /// /// The string value of the HTTP header to be included for OAuth requests. public string GenerateAuthorizationHeader() { StringBuilder authHeaderBuilder = new StringBuilder(); authHeaderBuilder.AppendFormat("OAuth realm=\"{0}\"", Realm); var sortedParameters = from p in this.Parameters where OAuthParametersToIncludeInHeader.Contains(p.Key) orderby p.Key, UrlEncode( (p.Value is string) ? (string)p.Value : string.Empty) select p; foreach (var item in sortedParameters) { authHeaderBuilder.AppendFormat( ",{0}=\"{1}\"", UrlEncode(item.Key), UrlEncode(item.Value as string)); } authHeaderBuilder.AppendFormat(",oauth_signature=\"{0}\"", UrlEncode(this.Parameters["oauth_signature"] as string)); return authHeaderBuilder.ToString(); } #endregion } } smuxi-1.1/lib/Twitterizer/Twitterizer2/OAuth/OAuthTokenResponse.cs0000644000175000017500000000650012132510633026142 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The OAuth token response class. Represents tokens returned by the service. //----------------------------------------------------------------------- namespace Twitterizer { using System; /// /// Values returned by Twitter when getting a request token or an access token. /// #if !SILVERLIGHT [Serializable] #endif public class OAuthTokenResponse { /// /// Gets or sets the token. /// /// The token. public string Token { get; set; } /// /// Gets or sets the token secret. /// /// The token secret. public string TokenSecret { get; set; } /// /// Gets or sets the user ID. /// /// The user ID. public decimal UserId { get; set; } /// /// Gets or sets the screenname. /// /// The screenname. public string ScreenName { get; set; } /// /// Gets or sets the verification string. /// This is required when overriding the application's callback url. /// /// The verification string. public string VerificationString { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Information.cs0000644000175000017500000000537212253423361023662 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The information class which gives general information about the assembly. //----------------------------------------------------------------------- namespace Twitterizer { /// /// The information class which gives general information about the assembly. /// internal static class Information { /// /// Obtains the current assembly version. /// /// The assembly version string in the format (#.#.#.#) public static string AssemblyVersion() { #if !SILVERLIGHT return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); #else return System.Reflection.Assembly.GetExecutingAssembly().FullName.Split(',')[1].Split('=')[1]; #endif } } } smuxi-1.1/lib/Twitterizer/Twitterizer2/Twitterizer2.snk0000644000175000017500000000112411655552527024204 0ustar00meebeymeebey00000000000000$RSA2y JF! 逴U 1ph`mB=dWb2(HSgXw:8['}S0,* sH3R22~"g%V Rúu4a]Cl2Je/9d\zl A|uA1, \Vb$ȑ+@D ܣV3!$6$FĵxS" iИL Lti2aeekB:mS&ˤ'ex_㇕ԡE&.d-4ޥst:$P SgDŽ twitterizer $version$ $title$ $author$ $author$ http://www.twitterizer.net/license/ http://www.twitterizer.net/ http://www.twitterizer.net/twitterizer-icon-draft1.png false $description$ Fixed a few bugs with json.net dependency and json parsing. Now built for the client profile. Copyright 2012 Patrick "Ricky" Smith twitter twitterizer smuxi-1.1/lib/Twitterizer/Twitterizer2/Twitterizer2Inheritance.cd0000644000175000017500000001013611655552527026154 0ustar00meebeymeebey00000000000000 AAATUAQkDAIxwBBoZAIZIiQBABEAEAICEoAwBABgAAA= TwitterEntities\TwitterUser.cs AAAAAAAAAAAAAAAAAgAABAAAAAAAAAIAACAAgAADAAA= TwitterEntities\TwitterUserCollection.cs AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAABAAA= Core\BaseCollection.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= TwitterEntities\TwitterDirectMessageCollection.cs AAAAAAAAAAAAAAAAAgAABAAAAAAAAAIAACAAgAADAAA= TwitterEntities\TwitterListCollection.cs AIAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAA= TwitterEntities\TwitterStatusCollection.cs AAAAAAAAAAAAAAAAAgAAAAAAAAAAIAAAAAAAAAABAAA= Core\BaseObject.cs AAACAAAQACABgIAAAEAAAAAAABEBAAACAgAACAAIAAA= TwitterEntities\TwitterDirectMessage.cs QAQDQAAAAIAgAKAAAgAAAAQAACEAAAAQAQAAAAQAAAI= TwitterEntities\TwitterList.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIAACAAAAAAAAA= TwitterEntities\TwitterListWrapper.cs AAAAAAAAAAAAAQAAAAAAAAIEAAAAAAEAAAQAAAAAAAA= TwitterEntities\TwitterRateLimitStatus.cs AAAAAAAAAgAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA= TwitterEntities\TwitterRelationship.cs AQQDAAQAAgABAAAAICAAAAAEQAEAAAAIAgAACAAoAAA= TwitterEntities\TwitterStatus.cs smuxi-1.1/lib/Twitterizer/Twitterizer2/packages.config0000644000175000017500000000016612253423361024007 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/Twitterizer/Twitterizer2/TwitterResponse.cs0000644000175000017500000000400112253423361024542 0ustar00meebeymeebey00000000000000using System; namespace Twitterizer { /// /// The twitter response class provides details of the response from an api call to the twitter api. /// /// #if !SILVERLIGHT [Serializable] #endif public class TwitterResponse where T : Core.ITwitterObject { /// /// Gets or sets the object that represents the data returned by the request to Twitter. /// /// The response object. public T ResponseObject { get; set; } /// /// Gets or sets the result of the request. /// /// The result. public RequestResult Result { get; set; } /// /// Gets or sets the request URL. /// /// The request URL. public string RequestUrl { get; set; } /// /// Gets the raw json or xml response provided by Twitter. /// /// The response body. public string Content { get; set; } /// /// Gets or sets the error message returned by the Twitter. /// /// The error message. public string ErrorMessage { get; set; } /// /// Gets or sets the oauth tokens provided for the request. /// /// The tokens. internal OAuthTokens Tokens { get; set; } /// /// Gets or sets the rate limiting details. /// /// The rate limiting object. public RateLimiting RateLimiting { get; set; } /// /// Gets or sets the OAuth Token Access Level details. /// /// The access level. public AccessLevel AccessLevel { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/0000755000175000017500000000000012652476423023001 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/TwitterStreamEvent.cs0000644000175000017500000000301712253423361027137 0ustar00meebeymeebey00000000000000namespace Twitterizer.Streaming { using System; using Newtonsoft.Json; using Newtonsoft.Json.Converters; #if !SILVERLIGHT [System.Serializable] #endif public class TwitterStreamEvent { /// /// Gets or sets the type of the event. /// /// The type of the event. [JsonProperty(PropertyName = "event")] [JsonConverter(typeof(StringEnumConverter))] public TwitterSteamEvent EventType { get; set; } /// /// Gets or sets the source of the event. This is always the user who initiated the event. /// /// The source. public TwitterUser Source { get; set; } /// /// Gets or sets the target of the event. This is the user who was affected, or who owns the affected object. /// /// The source. public TwitterUser Target { get; set; } /// /// Gets or sets the target object. /// /// The target object. public Twitterizer.Core.TwitterObject TargetObject { get; set; } /// /// Gets or sets the creation date. /// /// The creation date. [JsonProperty(PropertyName = "created_at")] [JsonConverter(typeof(TwitterizerDateConverter))] public DateTime CreatedAt { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/SerializationHelper.cs0000644000175000017500000001145612253423361027302 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The serialization helper class. //----------------------------------------------------------------------- namespace Twitterizer.Core { using System.IO; using System.Net; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; /// /// The Serialization Helper class. Provides a simple interface for common serialization tasks. /// /// The type of object to be deserialized internal static class SerializationHelper where T : ITwitterObject { /// /// The JavascriptConversionDelegate. The delegate is invokes when using the JavaScriptSerializer to manually construct a result object. /// /// Contains nested dictionary objects containing deserialized values for manual parsing. /// A strongly typed object representing the deserialized data of type T public delegate T DeserializationHandler(JObject value); /// /// Deserializes the specified web response. /// /// The web response data. /// The deserialization handler. /// /// A strongly typed object representing the deserialized data of type /// public static T Deserialize(byte[] webResponseData, DeserializationHandler deserializationHandler) { T resultObject; // Deserialize the results. if (deserializationHandler == null) { #if !SILVERLIGHT resultObject = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(webResponseData)); #else resultObject = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(webResponseData, 0, webResponseData.Length)); #endif } else { #if !SILVERLIGHT resultObject = deserializationHandler((JObject)JsonConvert.DeserializeObject(Encoding.UTF8.GetString(webResponseData))); #else resultObject = deserializationHandler((JObject)JsonConvert.DeserializeObject(Encoding.UTF8.GetString(webResponseData, 0, webResponseData.Length))); #endif } return resultObject; } /// /// Deserializes the specified web response. /// /// The web response data. /// /// A strongly typed object representing the deserialized data of type /// public static T Deserialize(byte[] webResponseData) { return Deserialize(webResponseData, null); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/StreamOptions.cs0000644000175000017500000001011612253423361026124 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The Stream Options parameters class. //----------------------------------------------------------------------- namespace Twitterizer.Streaming { using System.Collections.Generic; public class StreamOptions { public StreamOptions() { this.Track = new List(); this.Locations = new List(); this.Follow = new List(); } /// /// Gets or sets the number of previous statuses to consider for delivery before transitioning to live stream delivery. /// /// The count. /// Currently disabled by Twitter. On unfiltered streams, all considered statuses are delivered, so the number requested is the number returned. On filtered streams, the number requested is the number of statuses that are applied to the filter predicate, and not the number of statuses returned. public int Count { get; set; } /// /// Gets or sets the user IDs that is to be referenced in the stream. /// /// The follow. public List Follow { get; set; } /// /// Gets or sets the keywords to track. /// /// The keywords to track. public List Track { get; set; } /// /// Gets or sets the locations. /// /// The locations. public List Locations { get; set; } /// /// Gets or sets whether to request the use of GZip compression on the stream. /// /// Boolean. /// Will use the recently introduced GZip compression to decrease bandwitdth. public bool UseCompression { get; set; } #if !SILVERLIGHT /// /// Gets or sets the proxy. /// /// /// The proxy. /// public System.Net.WebProxy Proxy { get; set; } #endif } }smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/Properties/0000755000175000017500000000000012132510633025116 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/Properties/AssemblyInfo.cs0000644000175000017500000000417112132510633030043 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // //----------------------------------------------------------------------- using System.Runtime.InteropServices; // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("54dbe0c0-0d70-42c1-8c71-a14f737183e8")] smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/Twitterizer2.Streaming.csproj0000644000175000017500000001247112652472053030571 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {AFDC57ED-C013-4581-9D06-54D8A42D696D} Library Properties Twitterizer2.Streaming Twitterizer2.Streaming v4.5 512 3.5 false publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false true ..\..\twitterizer\ true true full false ..\Debug\Twitterizer2\Full\ DEBUG;TRACE prompt 4 AllRules.ruleset AnyCPU pdbonly true ..\Release\net40\ TRACE prompt 4 AllRules.ruleset ..\Release\net40\Twitterizer2.Streaming.XML ..\Twitterizer2\Twitterizer2.snk CommonAssemblyInfo.cs False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {2FDC3492-6B9E-4771-9755-7892C9CB1E96} Twitterizer2 {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Newtonsoft.Json Twitterizer2.snk smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/TwitterStream.cs0000644000175000017500000006231012503640373026140 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010/2011, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // Ricky Smith // The Twitter Stream class //----------------------------------------------------------------------- namespace Twitterizer.Streaming { using System; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Threading; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Twitterizer.Core; /// /// The different stop reasons for stopping a stream. /// public enum StopReasons { StoppedByRequest, WebConnectionFailed, Unknown, Unauthorised, Forbidden, NotFound, NotAcceptable, TooLong, RangeUnacceptable, RateLimited, TwitterServerError, TwitterOverloaded } public delegate void InitUserStreamCallback(TwitterIdCollection friendIds); public delegate void StatusCreatedCallback(TwitterStatus status); public delegate void StatusDeletedCallback(TwitterStreamDeletedEvent status); public delegate void DirectMessageCreatedCallback(TwitterDirectMessage status); public delegate void DirectMessageDeletedCallback(TwitterStreamDeletedEvent status); public delegate void EventCallback(TwitterStreamEvent eventDetails); public delegate void StreamStoppedCallback(StopReasons stopreason); public delegate void RawJsonCallback(string json); /// /// The TwitterStream class. Provides an interface to real-time status changes. /// public class TwitterStream : IDisposable { private DirectMessageCreatedCallback directMessageCreatedCallback; private DirectMessageDeletedCallback directMessageDeletedCallback; private EventCallback eventCallback; private InitUserStreamCallback friendsCallback; private RawJsonCallback rawJsonCallback; private StatusCreatedCallback statusCreatedCallback; private StatusDeletedCallback statusDeletedCallback; /// /// The userAgent which shall be used in connections to Twitter (a must in the specs of the API) /// private string userAgent = null; /// /// This value is set to true to indicate that the stream connection should be closed. /// private bool stopReceived; private HttpWebRequest request; private StreamStoppedCallback streamStoppedCallback; /// /// Initializes a new instance of the class. /// /// The tokens. /// The user agent string which shall include the version of your client. /// The stream or user stream options to intially use when starting the stream. public TwitterStream(OAuthTokens tokens, string userAgent, StreamOptions streamoptions) { #if !SILVERLIGHT // No non-silverlight user-agent as Assembly.GetName() isn't supported and setting the request.UserAgent is also not supported. if (string.IsNullOrEmpty(userAgent)) { this.userAgent = string.Format( CultureInfo.InvariantCulture, "Twitterizer/{0}", Assembly.GetExecutingAssembly().GetName().Version); } else { this.userAgent = string.Format( CultureInfo.InvariantCulture, "{0} (via Twitterizer/{1})", userAgent, Assembly.GetExecutingAssembly().GetName().Version); } #endif Tokens = tokens; if (streamoptions != null) StreamOptions = streamoptions; } /// /// Gets or sets the tokens. /// /// The tokens. public OAuthTokens Tokens { get; set; } /// /// Gets or sets the stream options. /// /// The stream options. public StreamOptions StreamOptions { get; set; } /// /// Gets or sets the Basic Auth Credentials. /// /// The Basic Auth Credentials. public NetworkCredential NetworkCredentials { get; set; } #if !SILVERLIGHT /// /// Gets or sets the proxy. /// /// The proxy. public WebProxy Proxy { get; set; } #endif #region IDisposable Members /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { EndStream(); friendsCallback = null; streamStoppedCallback = null; statusCreatedCallback = null; statusDeletedCallback = null; directMessageCreatedCallback = null; directMessageDeletedCallback = null; eventCallback = null; rawJsonCallback = null; } #endregion /// /// Starts the user stream. /// public IAsyncResult StartUserStream( InitUserStreamCallback friendsCallback, StreamStoppedCallback streamStoppedCallback, StatusCreatedCallback statusCreatedCallback, StatusDeletedCallback statusDeletedCallback, DirectMessageCreatedCallback directMessageCreatedCallback, DirectMessageDeletedCallback directMessageDeletedCallback, EventCallback eventCallback, RawJsonCallback rawJsonCallback = null ) { if (request != null) { throw new InvalidOperationException("Stream is already open"); } WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/1.1/user.json"), HTTPVerb.GET, Tokens, userAgent); #if !SILVERLIGHT builder.Proxy = Proxy; #endif PrepareStreamOptions(builder); if (StreamOptions != null && StreamOptions is UserStreamOptions) { if ((StreamOptions as UserStreamOptions).AllReplies) builder.Parameters.Add("replies", "all"); } request = builder.PrepareRequest(); this.friendsCallback = friendsCallback; this.streamStoppedCallback = streamStoppedCallback; this.statusCreatedCallback = statusCreatedCallback; this.statusDeletedCallback = statusDeletedCallback; this.directMessageCreatedCallback = directMessageCreatedCallback; this.directMessageDeletedCallback = directMessageDeletedCallback; this.eventCallback = eventCallback; this.rawJsonCallback = rawJsonCallback; stopReceived = false; #if SILVERLIGHT request.AllowReadStreamBuffering = false; #else request.Timeout = 10000; #endif return request.BeginGetResponse(StreamCallback, request); } /// /// Starts the public stream. /// public IAsyncResult StartPublicStream( StreamStoppedCallback streamStoppedCallback, StatusCreatedCallback statusCreatedCallback, StatusDeletedCallback statusDeletedCallback, EventCallback eventCallback, RawJsonCallback rawJsonCallback = null ) { if (request != null) { throw new InvalidOperationException("Stream is already open"); } WebRequestBuilder builder; if (Tokens == null) builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1.1/statuses/filter.json"), HTTPVerb.POST, userAgent, NetworkCredentials); else builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1.1/statuses/filter.json"), HTTPVerb.POST, Tokens, userAgent); #if !SILVERLIGHT builder.Proxy = Proxy; #endif PrepareStreamOptions(builder); request = builder.PrepareRequest(); this.streamStoppedCallback = streamStoppedCallback; this.statusCreatedCallback = statusCreatedCallback; this.statusDeletedCallback = statusDeletedCallback; this.eventCallback = eventCallback; this.rawJsonCallback = rawJsonCallback; stopReceived = false; #if SILVERLIGHT request.AllowReadStreamBuffering = false; #endif return request.BeginGetResponse(StreamCallback, request); } /// /// Starts the sample stream. /// public IAsyncResult StartSampleStream( StreamStoppedCallback streamStoppedCallback, StatusCreatedCallback statusCreatedCallback, StatusDeletedCallback statusDeletedCallback, EventCallback eventCallback, RawJsonCallback rawJsonCallback = null ) { if (request != null) { throw new InvalidOperationException("Stream is already open"); } WebRequestBuilder builder; if (Tokens == null) builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1.1/statuses/sample.json"), HTTPVerb.POST, userAgent, NetworkCredentials); else builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1.1/statuses/sample.json"), HTTPVerb.POST, Tokens, userAgent); #if !SILVERLIGHT builder.Proxy = Proxy; #endif PrepareStreamOptions(builder); request = builder.PrepareRequest(); this.streamStoppedCallback = streamStoppedCallback; this.statusCreatedCallback = statusCreatedCallback; this.statusDeletedCallback = statusDeletedCallback; this.eventCallback = eventCallback; this.rawJsonCallback = rawJsonCallback; stopReceived = false; #if SILVERLIGHT request.AllowReadStreamBuffering = false; #endif return request.BeginGetResponse(StreamCallback, request); } /// /// Prepares the stream options. /// /// The builder. private void PrepareStreamOptions(WebRequestBuilder builder) { if (StreamOptions != null) { if (StreamOptions.Count > 0) builder.Parameters.Add("count", StreamOptions.Count.ToString()); if (StreamOptions.Follow != null && StreamOptions.Follow.Count > 0) builder.Parameters.Add("follow", string.Join(",", StreamOptions.Follow.ToArray())); if (StreamOptions.Locations != null && StreamOptions.Locations.Count > 0) builder.Parameters.Add("locations", string.Join(",", StreamOptions.Locations.Select((x, r) => x.ToString()).ToArray())); if (StreamOptions.Track != null && StreamOptions.Track.Count > 0) builder.Parameters.Add("track", string.Join(",", StreamOptions.Track.ToArray())); builder.UseCompression = StreamOptions.UseCompression; #if !SILVERLIGHT if (this.StreamOptions != null) builder.Proxy = this.StreamOptions.Proxy; #endif } } /// /// The callback handler for all streams /// /// The result. private void StreamCallback(IAsyncResult result) { HttpWebRequest req = (HttpWebRequest)result.AsyncState; HttpWebResponse response = null; try { response = (HttpWebResponse)req.EndGetResponse(result); if (response.StatusCode == HttpStatusCode.OK) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { try { // This will keep the count of open brackets // When { is encountered, the count is incremented // When } is encountered, the count is decremented int bracketCount = 0; // The blockBuilder will hold the string of the current block of json. StringBuilder blockBuilder = new StringBuilder(); while (!stopReceived && !reader.EndOfStream) { string lineOfData = reader.ReadLine(); if (stopReceived || lineOfData == null) { break; } for (int index = 0; index < lineOfData.Length; index++) { blockBuilder.Append(lineOfData[index]); if (!new[] { '{', '}' }.Contains(lineOfData[index])) { continue; } if (lineOfData[index] == '{') { bracketCount++; } if (lineOfData[index] == '}') { bracketCount--; } if (bracketCount == 0) { var blockbuilderstring = blockBuilder.ToString(); if (rawJsonCallback != null) { rawJsonCallback(blockbuilderstring); } ThreadPool.QueueUserWorkItem(delegate { ParseMessage(blockbuilderstring.Trim()); }); blockBuilder.Length = 0; } } } reader.Close(); OnStreamStopped(stopReceived ? StopReasons.StoppedByRequest : StopReasons.WebConnectionFailed); } catch { reader.Close(); OnStreamStopped(stopReceived ? StopReasons.StoppedByRequest : StopReasons.WebConnectionFailed); } } } } catch (WebException we) { HttpWebResponse httpResponse = we.Response as HttpWebResponse; if (httpResponse != null) { switch ((httpResponse).StatusCode) { case HttpStatusCode.Unauthorized: { OnStreamStopped(StopReasons.Unauthorised); break; } case HttpStatusCode.Forbidden: { OnStreamStopped(StopReasons.Forbidden); break; } case HttpStatusCode.NotFound: { OnStreamStopped(StopReasons.NotFound); break; } case HttpStatusCode.NotAcceptable: { OnStreamStopped(StopReasons.NotAcceptable); break; } case HttpStatusCode.RequestEntityTooLarge: { OnStreamStopped(StopReasons.TooLong); break; } case HttpStatusCode.RequestedRangeNotSatisfiable: { OnStreamStopped(StopReasons.RangeUnacceptable); break; } case (HttpStatusCode)420: //Rate Limited { OnStreamStopped(StopReasons.RateLimited); break; } case HttpStatusCode.InternalServerError: { OnStreamStopped(StopReasons.TwitterServerError); break; } case HttpStatusCode.ServiceUnavailable: { OnStreamStopped(StopReasons.TwitterOverloaded); break; } default: { OnStreamStopped(StopReasons.Unknown); break; } } } else { OnStreamStopped(StopReasons.Unknown); } } catch (Exception) { OnStreamStopped(StopReasons.WebConnectionFailed); } finally { req.Abort(); if (response != null) response.Close(); request = null; } } private static string ConvertJTokenToString(JToken token) { if (token != null) return token.ToString().Trim(); return null; } /// /// Parses the message. /// /// The p. private void ParseMessage(string p) { JObject obj = (JObject)JsonConvert.DeserializeObject(p); var friends = obj.SelectToken("friends", false); if (friends != null) { if (friendsCallback != null && friends.HasValues) { friendsCallback(JsonConvert.DeserializeObject(ConvertJTokenToString(friends))); } return; } var delete = obj.SelectToken("delete", false); if (delete != null) { var deletedStatus = delete.SelectToken("status", false); if (deletedStatus != null) { if (statusDeletedCallback != null && deletedStatus.HasValues) { statusDeletedCallback(JsonConvert.DeserializeObject(ConvertJTokenToString(deletedStatus))); } return; } var deletedDirectMessage = delete.SelectToken("direct_message", false); if (deletedDirectMessage != null) { if (directMessageDeletedCallback != null && deletedDirectMessage.HasValues) { directMessageDeletedCallback(JsonConvert.DeserializeObject(ConvertJTokenToString(deletedDirectMessage))); } return; } } var events = obj.SelectToken("event", false); if (events != null) { if (eventCallback != null) { var targetobject = obj.SelectToken("target_object", false); TwitterObject endtargetobject = null; if (targetobject != null) { if (targetobject.SelectToken("subscriber_count", false) != null) { endtargetobject = JsonConvert.DeserializeObject(targetobject.ToString()); } else if (targetobject.SelectToken("user", false) != null) { endtargetobject = JsonConvert.DeserializeObject(targetobject.ToString()); } } var endevent = JsonConvert.DeserializeObject(obj.ToString()); endevent.TargetObject = endtargetobject; this.eventCallback(endevent); } return; } var user = obj.SelectToken("user", false); if (user != null) { if (statusCreatedCallback != null && user.HasValues) { statusCreatedCallback(JsonConvert.DeserializeObject(ConvertJTokenToString(obj))); } return; } var directMessage = obj.SelectToken("direct_message", false); if (directMessage != null) { if (directMessageCreatedCallback != null && directMessage.HasValues) { directMessageCreatedCallback(JsonConvert.DeserializeObject(ConvertJTokenToString(directMessage))); } } } /// /// Called when the stream is stopped. /// /// The reason. /// /// private void OnStreamStopped(StopReasons reason) { if (streamStoppedCallback != null) streamStoppedCallback(reason); } /// /// Ends the stream. /// public void EndStream() { stopReceived = true; if (request != null) { request.Abort(); request = null; } } } }smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/TwitterStreamDeletedEvent.cs0000644000175000017500000000555312132510633030430 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The TwitterStreamDeletedEvent class //----------------------------------------------------------------------- namespace Twitterizer.Streaming { using System.Runtime.Serialization; using Newtonsoft.Json; public class TwitterStreamDeletedEvent { /// /// Gets or sets the user id of the event. This is always the user who initiated the event. /// /// The User Id. #if !SILVERLIGHT [DataMember] #endif [JsonProperty(PropertyName = "user_id")] public decimal UserId { get; set; } /// /// Gets or sets the id of the event. This is the status that was affected. /// /// The Direct Message or Status Id. #if !SILVERLIGHT [DataMember] #endif [JsonProperty(PropertyName = "id")] public decimal Id { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/TwitterSteamEvent.cs0000644000175000017500000000637512652472053026774 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; using System.Runtime.Serialization; namespace Twitterizer.Streaming { /// /// Describes the type of event that has occured on twitter /// public enum TwitterSteamEvent { Unknown, /// /// The source user has blocked the target user. /// [EnumMemberAttribute(Value="block")] Block, /// /// The source user has unblocked the target user. /// [EnumMemberAttribute(Value = "unblock")] Unblock, /// /// The source user has favorited the target users tweet. /// [EnumMemberAttribute(Value = "favorite")] Favorite, /// /// The source user has unfaovorited the target users tweet. /// [EnumMemberAttribute(Value = "unfavorite")] Unfavorite, /// /// The source user has followed the target user. /// [EnumMemberAttribute(Value = "follow")] Follow, /// /// The source user has unfollowed the target user. /// [EnumMemberAttribute(Value = "unfollow")] Unfollow, /// /// The source user has added the target user to the a list. /// [EnumMemberAttribute(Value = "list_member_added")] ListMemberAdded, /// /// The source user has removed the target user from a list. /// [EnumMemberAttribute(Value = "list_member_removed")] ListMemberRemoved, /// /// The source user has subscribed to a list. /// [EnumMemberAttribute(Value = "list_user_subscribed")] ListUserSubscribed, /// /// The source user has unsubscribed from a list. /// [EnumMemberAttribute(Value = "list_user_unsubscribed")] ListUserUnsubscribed, /// /// The source user created a list. /// [EnumMemberAttribute(Value = "list_created")] ListCreated, /// /// The source user update a lists properties. /// [EnumMemberAttribute(Value = "list_updated")] ListUpdated, /// /// The source user deleted a list. /// [EnumMemberAttribute(Value = "list_destroyed")] ListDestroyed, /// /// The source users profile was updated. /// [EnumMemberAttribute(Value = "user_update")] UserUpdated, /// /// The source users profile was updated. /// [EnumMemberAttribute(Value = "access_revoked")] AccessRevoked, /// /// The source users tweet was quoted. /// [EnumMemberAttribute(Value = "quoted_tweet")] QuotedTweet } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/Location.cs0000644000175000017500000000156312253423361025073 0ustar00meebeymeebey00000000000000namespace Twitterizer.Streaming { public class Location { /// /// Gets or sets the latitude. /// /// The latitude. public double Latitude { get; set; } /// /// Gets or sets the longitude. /// /// The longitude. public double Longitude { get; set; } /// /// Returns a that represents this instance. /// /// /// A that represents this instance. /// public override string ToString() { return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0},{1}", this.Longitude, this.Latitude); } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/UserStreamOptions.cs0000644000175000017500000000475412253423361026776 0ustar00meebeymeebey00000000000000//----------------------------------------------------------------------- // // This file is part of the Twitterizer library (http://www.twitterizer.net/) // // Copyright (c) 2010, Patrick "Ricky" Smith (ricky@digitally-born.com) // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this list // of conditions and the following disclaimer. // - Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // - Neither the name of the Twitterizer nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // David Golden // The User Stream Options parameters class. //----------------------------------------------------------------------- namespace Twitterizer.Streaming { public class UserStreamOptions : StreamOptions { /// /// Gets or sets whether to request all replies from the stream. /// /// Boolean. /// Will return all replies to a users stream (eg where the user doesn't follow both people replying to each other). public bool AllReplies { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/packages.config0000644000175000017500000000016612253423361025737 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/FilterStreamOptions.cs0000644000175000017500000000337211655552527027314 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Twitterizer.Streaming { public sealed class FilterStreamOptions { public FilterStreamOptions() { this.Track = new List(); this.Locations = new List(); this.Follow = new List(); } /// /// Gets or sets the number of previous statuses to consider for delivery before transitioning to live stream delivery. /// /// The count. /// On unfiltered streams, all considered statuses are delivered, so the number requested is the number returned. On filtered streams, the number requested is the number of statuses that are applied to the filter predicate, and not the number of statuses returned. public int Count { get; set; } /// /// Gets or sets the user IDs that is to be referenced in the stream. /// /// The follow. public List Follow { get; set; } /// /// Gets or sets the keywords to track. /// /// The keywords to track. public List Track { get; set; } /// /// Gets or sets the locations. /// /// The locations. public List Locations { get; set; } /// /// Gets or sets a value indicating whether [use SSL]. /// /// true if [use SSL]; otherwise, false. public bool UseSSL { get; set; } } } smuxi-1.1/lib/Twitterizer/Twitterizer2.Streaming/Twitterizer2.Streaming.nuspec0000644000175000017500000000134112253423361030553 0ustar00meebeymeebey00000000000000 twitterizer-streaming Twitterizer Steaming API $version$ $author$ $author$ http://www.twitterizer.net/license/ http://www.twitterizer.net/ http://www.twitterizer.net/twitterizer-icon-draft1.png false $description$ Full user streaming support. Copyright 2011 Patrick "Ricky" Smith twitter twitterizer streaming smuxi-1.1/lib/SignalR/0000775000175000017500000000000014011526500015417 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/0000775000175000017500000000000014011526500016206 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Common/0000775000175000017500000000000014011526500017436 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Common/CommonAssemblyInfo.cs0000644000175000017500000000143312204443213023531 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Reflection; using System.Resources; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyCompany("Microsoft Open Technologies, Inc.")] [assembly: AssemblyCopyright("© Microsoft Open Technologies, Inc. All rights reserved.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyConfiguration("")] [assembly: ComVisible(false)] [assembly: CLSCompliant(false)] [assembly: NeutralResourcesLanguage("en-US")]smuxi-1.1/lib/SignalR/src/Common/CommonVersionInfo.cs0000644000175000017500000000044112204443213023375 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Reflection; [assembly: AssemblyVersion("1.1.0")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.2")] smuxi-1.1/lib/SignalR/src/Common/Microsoft.AspNet.SignalR.targets0000644000175000017500000000334212204443213025526 0ustar00meebeymeebey00000000000000 $(ArtifactsDir)\$(MSBuildProjectName) $(ArtifactsDir)\$(MSBuildProjectName)\bin $(MSBuildThisFileDirectory)Microsoft.AspNet.SignalR.ruleset false 1591 true $(DefineConstants);CODE_ANALYSIS 11.0 $(DefineConstants);MONO $(DefineConstants);SIGNED true true $(KeyFile) GlobalSuppressions.cs smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/0000775000175000017500000000000014011526500024117 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/ConnectionExtensions.cs0000644000175000017500000000720112204443213030624 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Text; using Newtonsoft.Json; namespace Microsoft.AspNet.SignalR.Client { public static class ConnectionExtensions { public static T GetValue(this IConnection connection, string key) { if (connection == null) { throw new ArgumentNullException("connection"); } if (String.IsNullOrEmpty(key)) { throw new ArgumentNullException("key"); } lock (connection.Items) { object value; if (connection.Items.TryGetValue(key, out value)) { return (T)value; } } return default(T); } [SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times", Justification = "jsonWriter will not dispose the stringWriter")] public static string JsonSerializeObject(this IConnection connection, object value) { if (connection == null) { throw new ArgumentNullException("connection"); } var sb = new StringBuilder(0x100); using (var stringWriter = new StringWriter(sb, CultureInfo.InvariantCulture)) { using (var jsonWriter = new JsonTextWriter(stringWriter) { CloseOutput = false }) { jsonWriter.Formatting = connection.JsonSerializer.Formatting; connection.JsonSerializer.Serialize(jsonWriter, value); } return stringWriter.ToString(); } } [SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times", Justification = "jsonTextReader will not dispose the stringReader")] public static T JsonDeserializeObject(this IConnection connection, string jsonValue) { if (connection == null) { throw new ArgumentNullException("connection"); } using (var stringReader = new StringReader(jsonValue)) { using (var jsonTextReader = new JsonTextReader(stringReader) { CloseInput = false }) { return (T)connection.JsonSerializer.Deserialize(jsonTextReader, typeof(T)); } } } public static bool EnsureReconnecting(this IConnection connection) { if (connection == null) { throw new ArgumentNullException("connection"); } if (connection.ChangeState(ConnectionState.Connected, ConnectionState.Reconnecting)) { connection.OnReconnecting(); } return connection.State == ConnectionState.Reconnecting; } #if !WINDOWS_PHONE && !SILVERLIGHT && !NET35 public static IObservable AsObservable(this Connection connection) { return connection.AsObservable(value => value); } public static IObservable AsObservable(this Connection connection) { return connection.AsObservable(value => connection.JsonDeserializeObject(value)); } public static IObservable AsObservable(this Connection connection, Func selector) { return new ObservableConnection(connection, selector); } #endif } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Microsoft.AspNet.SignalR.Client.csproj0000644000175000017500000001541212652472053033267 0ustar00meebeymeebey00000000000000 Debug AnyCPU 8.0.30703 2.0 {EB46B9C6-EE37-48F9-835E-E49580E40E0A} Library Properties Microsoft.AspNet.SignalR.Client Microsoft.AspNet.SignalR.Client 512 true ..\..\ v4.5 true full false bin\Debug\ TRACE;DEBUG;CLIENT_NET4;NET4;MONO prompt 4 bin\Debug\Microsoft.AspNet.SignalR.Client.XML pdbonly true bin\Release\ TRACE;STABLE_VERSION prompt 4 bin\Release\Microsoft.AspNet.SignalR.Client.XML Properties\CommonAssemblyInfo.cs Properties\CommonVersionInfo.cs Infrastructure\CancellationTokenExtensions.cs Infrastructure\DisposableAction.cs Infrastructure\Disposer.cs Infrastructure\ExceptionsExtensions.cs Infrastructure\TaskAsyncHelper.cs True True Resources.resx ResXFileCodeGenerator Resources.Designer.cs Designer {A9AE40FF-1A21-414A-9FE7-3BE13644CC6D} Newtonsoft.Json smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Properties/0000775000175000017500000000000014011526500026253 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Properties/AssemblyInfo.cs0000644000175000017500000000043212204443213031173 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Reflection; [assembly: AssemblyTitle("Microsoft.AspNet.SignalR.Client")] [assembly: AssemblyDescription(".NET client for SignalR")] smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Connection.cs0000644000175000017500000006517112204443213026556 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Client.Infrastructure; using Microsoft.AspNet.SignalR.Client.Transports; using Microsoft.AspNet.SignalR.Infrastructure; using Newtonsoft.Json; using Newtonsoft.Json.Linq; #if (NET4 || NET45) using System.Security.Cryptography.X509Certificates; #endif namespace Microsoft.AspNet.SignalR.Client { /// /// Provides client connections for SignalR services. /// [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", Justification = "_disconnectCts is disposed on disconnect.")] public class Connection : IConnection { internal static readonly TimeSpan DefaultAbortTimeout = TimeSpan.FromSeconds(30); private static Version _assemblyVersion; private IClientTransport _transport; // Propagates notification that connection should be stopped. private CancellationTokenSource _disconnectCts; // The amount of time the client should attempt to reconnect before stopping. private TimeSpan _disconnectTimeout; // Provides a way to cancel the the timeout that stops a reconnect cycle private IDisposable _disconnectTimeoutOperation; // The default connection state is disconnected private ConnectionState _state; private KeepAliveData _keepAliveData; private Task _connectTask; private TextWriter _traceWriter; // Used to synchronize state changes private readonly object _stateLock = new object(); // Used to synchronize starting and stopping specifically private readonly object _startLock = new object(); // Used to ensure we don't write to the Trace TextWriter from multiple threads simultaneously private readonly object _traceLock = new object(); // Keeps track of when the last keep alive from the server was received private HeartbeatMonitor _monitor; //The json serializer for the connections private JsonSerializer _jsonSerializer = new JsonSerializer(); #if (NET4 || NET45) private readonly X509CertificateCollection certCollection = new X509CertificateCollection(); #endif /// /// Occurs when the has received data from the server. /// public event Action Received; /// /// Occurs when the has encountered an error. /// public event Action Error; /// /// Occurs when the is stopped. /// public event Action Closed; /// /// Occurs when the starts reconnecting after an error. /// public event Action Reconnecting; /// /// Occurs when the successfully reconnects after a timeout. /// public event Action Reconnected; /// /// Occurs when the state changes. /// public event Action StateChanged; /// /// Occurs when the is about to timeout /// public event Action ConnectionSlow; /// /// Initializes a new instance of the class. /// /// The url to connect to. public Connection(string url) : this(url, (string)null) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// The query string data to pass to the server. public Connection(string url, IDictionary queryString) : this(url, CreateQueryString(queryString)) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// The query string data to pass to the server. public Connection(string url, string queryString) { if (url == null) { throw new ArgumentNullException("url"); } if (url.Contains("?")) { throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Resources.Error_UrlCantContainQueryStringDirectly), "url"); } if (!url.EndsWith("/", StringComparison.Ordinal)) { url += "/"; } Url = url; QueryString = queryString; _disconnectTimeoutOperation = DisposableAction.Empty; Items = new Dictionary(StringComparer.OrdinalIgnoreCase); State = ConnectionState.Disconnected; TraceLevel = TraceLevels.All; TraceWriter = new DebugTextWriter(); Headers = new HeaderDictionary(this); } /// /// Object to store the various keep alive timeout values /// KeepAliveData IConnection.KeepAliveData { get { return _keepAliveData; } set { _keepAliveData = value; } } public TraceLevels TraceLevel { get; set; } public TextWriter TraceWriter { get { return _traceWriter; } set { if (value == null) { throw new ArgumentNullException("value"); } _traceWriter = value; } } /// /// Gets or sets the serializer used by the connection /// public JsonSerializer JsonSerializer { get { return _jsonSerializer; } set { if (value == null) { throw new ArgumentNullException("value"); } _jsonSerializer = value; } } /// /// Gets or sets the cookies associated with the connection. /// public CookieContainer CookieContainer { get; set; } /// /// Gets or sets authentication information for the connection. /// public ICredentials Credentials { get; set; } /// /// Gets and sets headers for the requests /// public IDictionary Headers { get; private set; } #if !SILVERLIGHT /// /// Gets of sets proxy information for the connection. /// public IWebProxy Proxy { get; set; } #endif /// /// Gets the url for the connection. /// public string Url { get; private set; } /// /// Gets or sets the last message id for the connection. /// public string MessageId { get; set; } /// /// Gets or sets the connection id for the connection. /// public string ConnectionId { get; set; } /// /// Gets or sets the connection token for the connection. /// public string ConnectionToken { get; set; } /// /// Gets or sets the groups token for the connection. /// public string GroupsToken { get; set; } /// /// Gets a dictionary for storing state for a the connection. /// public IDictionary Items { get; private set; } /// /// Gets the querystring specified in the ctor. /// public string QueryString { get; private set; } public IClientTransport Transport { get { return _transport; } } /// /// Gets the current of the connection. /// public ConnectionState State { get { return _state; } private set { lock (_stateLock) { if (_state != value) { var stateChange = new StateChange(oldState: _state, newState: value); _state = value; if (StateChanged != null) { StateChanged(stateChange); } } } } } /// /// Starts the . /// /// A task that represents when the connection has started. public Task Start() { return Start(new DefaultHttpClient()); } /// /// Starts the . /// /// The http client /// A task that represents when the connection has started. [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "This is disposed on close")] public Task Start(IHttpClient httpClient) { // Pick the best transport supported by the client return Start(new AutoTransport(httpClient)); } /// /// Starts the . /// /// The transport to use. /// A task that represents when the connection has started. public Task Start(IClientTransport transport) { lock (_startLock) { _connectTask = TaskAsyncHelper.Empty; _disconnectCts = new CancellationTokenSource(); if (!ChangeState(ConnectionState.Disconnected, ConnectionState.Connecting)) { return _connectTask; } _monitor = new HeartbeatMonitor(this, _stateLock); _transport = transport; _connectTask = Negotiate(transport); } return _connectTask; } protected virtual string OnSending() { return null; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The exception is flowed back to the caller via the tcs.")] private Task Negotiate(IClientTransport transport) { return transport.Negotiate(this) .Then(negotiationResponse => { VerifyProtocolVersion(negotiationResponse.ProtocolVersion); ConnectionId = negotiationResponse.ConnectionId; ConnectionToken = negotiationResponse.ConnectionToken; _disconnectTimeout = TimeSpan.FromSeconds(negotiationResponse.DisconnectTimeout); // If we have a keep alive if (negotiationResponse.KeepAliveTimeout != null) { _keepAliveData = new KeepAliveData(TimeSpan.FromSeconds(negotiationResponse.KeepAliveTimeout.Value)); } var data = OnSending(); return StartTransport(data); }) .ContinueWithNotComplete(() => Disconnect()); } private Task StartTransport(string data) { return _transport.Start(this, data, _disconnectCts.Token) .RunSynchronously(() => { ChangeState(ConnectionState.Connecting, ConnectionState.Connected); if (_keepAliveData != null) { // Start the monitor to check for server activity _monitor.Start(); } }); } private bool ChangeState(ConnectionState oldState, ConnectionState newState) { return ((IConnection)this).ChangeState(oldState, newState); } bool IConnection.ChangeState(ConnectionState oldState, ConnectionState newState) { lock (_stateLock) { // If we're in the expected old state then change state and return true if (_state == oldState) { Trace(TraceLevels.StateChanges, "ChangeState({0}, {1})", oldState, newState); State = newState; return true; } } // Invalid transition return false; } private static void VerifyProtocolVersion(string versionString) { Version version; if (String.IsNullOrEmpty(versionString) || !TryParseVersion(versionString, out version) || !(version.Major == 1 && version.Minor == 2)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_IncompatibleProtocolVersion, "1.2", versionString ?? "null")); } } /// /// Stops the and sends an abort message to the server. /// public void Stop() { Stop(DefaultAbortTimeout); } /// /// Stops the and sends an abort message to the server. /// The timeout /// [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "We don't want to raise the Start exception on Stop.")] public void Stop(TimeSpan timeout) { lock (_startLock) { // Wait for the connection to connect if (_connectTask != null) { try { _connectTask.Wait(timeout); } catch (Exception ex) { Trace(TraceLevels.Events, "Error: {0}", ex.GetBaseException()); } } lock (_stateLock) { // Do nothing if the connection is offline if (State != ConnectionState.Disconnected) { string connectionId = ConnectionId; Trace(TraceLevels.Events, "Stop"); // Dispose the heart beat monitor so we don't fire notifications when waiting to abort _monitor.Dispose(); _transport.Abort(this, timeout); Disconnect(); _disconnectCts.Dispose(); if (_transport != null) { Trace(TraceLevels.Events, "Transport.Dispose({0})", connectionId); _transport.Dispose(); _transport = null; } } } } } /// /// Stops the without sending an abort message to the server. /// This function is called after we receive a disconnect message from the server. /// void IConnection.Disconnect() { Disconnect(); } private void Disconnect() { lock (_stateLock) { // Do nothing if the connection is offline if (State != ConnectionState.Disconnected) { // Change state before doing anything else in case something later in the method throws State = ConnectionState.Disconnected; Trace(TraceLevels.StateChanges, "Disconnect"); _disconnectTimeoutOperation.Dispose(); _disconnectCts.Cancel(); _monitor.Dispose(); Trace(TraceLevels.Events, "Closed"); // Clear the state for this connection ConnectionId = null; ConnectionToken = null; GroupsToken = null; MessageId = null; // TODO: Do we want to trigger Closed if we are connecting? if (Closed != null) { Closed(); } } } } /// /// Sends data asynchronously over the connection. /// /// The data to send. /// A task that represents when the data has been sent. public Task Send(string data) { if (State == ConnectionState.Disconnected) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_StartMustBeCalledBeforeDataCanBeSent)); } if (State == ConnectionState.Connecting) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ConnectionHasNotBeenEstablished)); } return _transport.Send(this, data); } /// /// Sends an object that will be JSON serialized asynchronously over the connection. /// /// The value to serialize. /// A task that represents when the data has been sent. public Task Send(object value) { return Send(this.JsonSerializeObject(value)); } #if (NET4 || NET45) /// /// Adds a client certificate to the request /// /// Client Certificate public void AddClientCertificate(X509Certificate certificate) { lock (_stateLock) { if (State != ConnectionState.Disconnected) { throw new InvalidOperationException(Resources.Error_CertsCanOnlyBeAddedWhenDisconnected); } certCollection.Add(certificate); } } #endif public void Trace(TraceLevels level, string format, params object[] args) { lock (_traceLock) { if (TraceLevel.HasFlag(level)) { _traceWriter.WriteLine( DateTime.UtcNow.ToString("HH:mm:ss.fffffff", CultureInfo.InvariantCulture) + " - " + (ConnectionId ?? "null") + " - " + format, args); } } } [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "This is called by the transport layer")] void IConnection.OnReceived(JToken message) { OnMessageReceived(message); } [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "This is called by the transport layer")] protected virtual void OnMessageReceived(JToken message) { if (Received != null) { Received(message.ToString()); } } void IConnection.OnError(Exception error) { Trace(TraceLevels.Events, "OnError({0})", error); if (Error != null) { Error(error); } } void IConnection.OnReconnecting() { // Only allow the client to attempt to reconnect for a _disconnectTimout TimeSpan which is set by // the server during negotiation. // If the client tries to reconnect for longer the server will likely have deleted its ConnectionId // topic along with the contained disconnect message. _disconnectTimeoutOperation = SetTimeout(_disconnectTimeout, Disconnect); if (Reconnecting != null) { Reconnecting(); } } void IConnection.OnReconnected() { // Prevent the timeout set OnReconnecting from firing and stopping the connection if we have successfully // reconnected before the _disconnectTimeout delay. _disconnectTimeoutOperation.Dispose(); if (Reconnected != null) { Reconnected(); } ((IConnection)this).UpdateLastKeepAlive(); } void IConnection.OnConnectionSlow() { Trace(TraceLevels.Events, "OnConnectionSlow"); if (ConnectionSlow != null) { ConnectionSlow(); } } /// /// Sets LastKeepAlive to the current time /// void IConnection.UpdateLastKeepAlive() { if (_keepAliveData != null) { _keepAliveData.LastKeepAlive = DateTime.UtcNow; } } [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "This is called by the transport layer")] void IConnection.PrepareRequest(IRequest request) { #if WINDOWS_PHONE // http://msdn.microsoft.com/en-us/library/ff637320(VS.95).aspx request.UserAgent = CreateUserAgentString("SignalR.Client.WP7"); #else #if SILVERLIGHT // Useragent is not possible to set with Silverlight, not on the UserAgent property of the request nor in the Headers key/value in the request #else request.UserAgent = CreateUserAgentString("SignalR.Client"); #endif #endif if (Credentials != null) { request.Credentials = Credentials; } if (CookieContainer != null) { request.CookieContainer = CookieContainer; } #if !SILVERLIGHT if (Proxy != null) { request.Proxy = Proxy; } #endif request.SetRequestHeaders(Headers); #if (NET4 || NET45) && !MONO request.AddClientCerts(certCollection); #endif } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "Can be called via other clients.")] private static string CreateUserAgentString(string client) { if (_assemblyVersion == null) { #if NETFX_CORE _assemblyVersion = new Version("1.1.0"); #else _assemblyVersion = new AssemblyName(typeof(Connection).Assembly.FullName).Version; #endif } #if NETFX_CORE return String.Format(CultureInfo.InvariantCulture, "{0}/{1} ({2})", client, _assemblyVersion, "Unknown OS"); #else return String.Format(CultureInfo.InvariantCulture, "{0}/{1} ({2})", client, _assemblyVersion, Environment.OSVersion); #endif } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The Version constructor can throw exceptions of many different types. Failure is indicated by returning false.")] private static bool TryParseVersion(string versionString, out Version version) { #if WINDOWS_PHONE || NET35 try { version = new Version(versionString); return true; } catch { version = null; return false; } #else return Version.TryParse(versionString, out version); #endif } private static string CreateQueryString(IDictionary queryString) { return String.Join("&", queryString.Select(kvp => kvp.Key + "=" + kvp.Value).ToArray()); } // TODO: Refactor into a helper class private static IDisposable SetTimeout(TimeSpan delay, Action operation) { var cancellableInvoker = new ThreadSafeInvoker(); TaskAsyncHelper.Delay(delay).Then(() => cancellableInvoker.Invoke(operation)); // Disposing this return value will cancel the operation if it has not already been invoked. return new DisposableAction(() => cancellableInvoker.Invoke()); } /// /// Default text writer /// private class DebugTextWriter : TextWriter { public DebugTextWriter() : base(CultureInfo.InvariantCulture) { } public override void WriteLine(string value) { Debug.WriteLine(value); } #if NETFX_CORE public override void Write(char value) { // This is wrong we don't call it Debug.WriteLine(value); } #endif public override Encoding Encoding { get { return Encoding.UTF8; } } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/StateChange.cs0000644000175000017500000000203612204443213026634 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. namespace Microsoft.AspNet.SignalR.Client { /// /// Represents a change in the connection state. /// public class StateChange { /// /// Creates a new stance of . /// /// The old state of the connection. /// The new state of the connection. public StateChange(ConnectionState oldState, ConnectionState newState) { OldState = oldState; NewState = newState; } /// /// Gets the old state of the connection. /// public ConnectionState OldState { get; private set; } /// /// Gets the new state of the connection. /// public ConnectionState NewState { get; private set; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/ConnectionState.cs0000644000175000017500000000046412204443213027551 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. namespace Microsoft.AspNet.SignalR.Client { public enum ConnectionState { Connecting, Connected, Reconnecting, Disconnected } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/TraceLevels.cs0000644000175000017500000000037112204443213026657 0ustar00meebeymeebey00000000000000using System; namespace Microsoft.AspNet.SignalR.Client { [Flags] public enum TraceLevels { None = 0, Messages = 1, Events = 2, StateChanges = 4, All = Messages | Events | StateChanges } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/0000775000175000017500000000000014011526500026276 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/LongPolling/0000775000175000017500000000000014011526500030522 5ustar00meebeymeebey00000000000000NegotiateInitializer.cs0000644000175000017500000000407112204443213035116 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/LongPollingusing System; using System.Threading; using Microsoft.AspNet.SignalR.Client.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Transports { internal class NegotiateInitializer { private readonly ThreadSafeInvoker _callbackInvoker; private readonly Action _initializeCallback; private readonly Action _errorCallback; private readonly TimeSpan _assumeSuccessAfter; public NegotiateInitializer(Action initializeCallback, Action errorCallback, TimeSpan assumeSuccessAfter) { _initializeCallback = initializeCallback; _errorCallback = errorCallback; _assumeSuccessAfter = assumeSuccessAfter; _callbackInvoker = new ThreadSafeInvoker(); // Set default initialized function Initialized += () => { }; } public event Action Initialized; public void Initialize() { TaskAsyncHelper.Delay(_assumeSuccessAfter).Then(() => { _callbackInvoker.Invoke(() => { Initialized(); _initializeCallback(); }); }); } public void Complete() { _callbackInvoker.Invoke(() => { Initialized(); _initializeCallback(); }); } public void Complete(Exception exception) { _callbackInvoker.Invoke((cb, ex) => { Initialized(); cb(ex); }, _errorCallback, exception); } public void Abort(CancellationToken disconnectToken) { _callbackInvoker.Invoke((cb, token) => { Initialized(); #if NET35 || WINDOWS_PHONE cb(new OperationCanceledException(Resources.Error_ConnectionCancelled)); #else cb(new OperationCanceledException(Resources.Error_ConnectionCancelled, token)); #endif }, _errorCallback, disconnectToken); } } } PollingRequestHandler.cs0000644000175000017500000001250112237701046035252 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/LongPolling// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Transports { public class PollingRequestHandler { private IHttpClient _httpClient; private IRequest _currentRequest; private int _running; private object _stopLock; public PollingRequestHandler(IHttpClient httpClient) { _httpClient = httpClient; _running = 0; _stopLock = new object(); // Set default events ResolveUrl = () => ""; PrepareRequest = _ => { }; OnMessage = _ => { }; OnError = _ => { }; OnPolling = () => { }; OnAfterPoll = _ => TaskAsyncHelper.Empty; OnAbort = _ => { }; } /// /// Used to generate the Url that is posted to for the poll. /// public Func ResolveUrl { get; set; } /// /// Allows modification of the IRequest parameter before using it in a poll. /// public event Action PrepareRequest; /// /// Sends the string based message to the callback. /// public event Action OnMessage; /// /// If the poll errors OnError gets triggered and passes the exception. /// public event Action OnError; /// /// Triggers when the polling request is in flight /// public event Action OnPolling; /// /// Triggers before a new polling request is attempted. /// Passes in an exception if the Poll errored, null otherwise. /// Expects the return as a task in order to allow modification of timing for subsequent polls. /// public Func OnAfterPoll { get; set; } /// /// Fired when the current poll request was aborted, passing in the soon to be aborted request. /// public event Action OnAbort; /// /// Starts the Polling Request Handler. /// public void Start() { if (Interlocked.Exchange(ref _running, 1) == 0) { Poll(); } } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to user.")] private void Poll() { // This is to ensure that we do not accidently fire off another poll after being told to stop lock (_stopLock) { // Only poll if we're running if (_running == 0) { return; } // A url is required string url = ResolveUrl(); _httpClient.Post(url, request => { PrepareRequest(request); _currentRequest = request; // This is called just prior to posting the request to ensure that any in-flight polling request // is always executed before an OnAfterPoll OnPolling(); }, isLongRunning: true) .ContinueWith(task => { var next = TaskAsyncHelper.Empty; Exception exception = null; if (task.IsFaulted) { exception = task.Exception.Unwrap(); OnError(exception); } else { try { next = task.Result.ReadAsString().Then(raw => OnMessage(raw)); } catch (Exception ex) { exception = ex; OnError(exception); } } next.Finally(state => { OnAfterPoll((Exception)state).Then(() => Poll()); }, exception); }); } } /// /// Fully stops the Polling Request Handlers. /// public void Stop() { lock (_stopLock) { if (Interlocked.Exchange(ref _running, 0) == 1) { Abort(); } } } /// /// Aborts the currently active polling request, does not stop the Polling Request Handler. /// public void Abort() { OnAbort(_currentRequest); if (_currentRequest != null) { // This will no-op if the request is already finished _currentRequest.Abort(); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/TransportHelper.cs0000644000175000017500000001605612237701046031777 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Http; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Transports { public static class TransportHelper { public static Task GetNegotiationResponse(this IHttpClient httpClient, IConnection connection) { if (httpClient == null) { throw new ArgumentNullException("httpClient"); } if (connection == null) { throw new ArgumentNullException("connection"); } #if SILVERLIGHT || WINDOWS_PHONE string negotiateUrl = connection.Url + "negotiate?" + GetNoCacheUrlParam(); #else string negotiateUrl = connection.Url + "negotiate"; #endif negotiateUrl += AppendCustomQueryString(connection, negotiateUrl); return httpClient.Get(negotiateUrl, connection.PrepareRequest, isLongRunning: false) .Then(response => response.ReadAsString()) .Then(raw => { if (String.IsNullOrEmpty(raw)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ServerNegotiationFailed)); } return JsonConvert.DeserializeObject(raw); }); } [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "This is called by internally")] public static string GetReceiveQueryString(IConnection connection, string data, string transport) { if (connection == null) { throw new ArgumentNullException("connection"); } // ?transport={0}&connectionToken={1}&messageId={2}&groups={3}&connectionData={4}{5} var qsBuilder = new StringBuilder(); qsBuilder.Append("?transport=" + transport) .Append("&connectionToken=" + Uri.EscapeDataString(connection.ConnectionToken)); if (connection.MessageId != null) { qsBuilder.Append("&messageId=" + Uri.EscapeDataString(connection.MessageId)); } if (connection.GroupsToken != null) { qsBuilder.Append("&groupsToken=" + Uri.EscapeDataString(connection.GroupsToken)); } if (data != null) { qsBuilder.Append("&connectionData=" + data); } string customQuery = connection.QueryString; if (!String.IsNullOrEmpty(customQuery)) { qsBuilder.Append("&").Append(customQuery); } #if SILVERLIGHT || WINDOWS_PHONE qsBuilder.Append("&").Append(GetNoCacheUrlParam()); #endif return qsBuilder.ToString(); } public static string AppendCustomQueryString(IConnection connection, string baseUrl) { if (connection == null) { throw new ArgumentNullException("connection"); } if (baseUrl == null) { baseUrl = ""; } string appender = "", customQuery = connection.QueryString, qs = ""; if (!String.IsNullOrEmpty(customQuery)) { char firstChar = customQuery[0]; // If the custom query string already starts with an ampersand or question mark // then we dont have to use any appender, it can be empty. if (firstChar != '?' && firstChar != '&') { appender = "?"; if (baseUrl.Contains(appender)) { appender = "&"; } } qs += appender + customQuery; } return qs; } [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "This is called internally.")] [SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", Justification = "This is called internally.")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The client receives the exception in the OnError callback.")] public static void ProcessResponse(IConnection connection, string response, out bool timedOut, out bool disconnected) { if (connection == null) { throw new ArgumentNullException("connection"); } connection.UpdateLastKeepAlive(); timedOut = false; disconnected = false; if (String.IsNullOrEmpty(response)) { return; } try { var result = JValue.Parse(response); if (!result.HasValues) { return; } if (result["I"] != null) { connection.OnReceived(result); return; } timedOut = result.Value("T") == 1; disconnected = result.Value("D") == 1; if (disconnected) { return; } UpdateGroups(connection, groupsToken: result["G"]); var messages = result["M"] as JArray; if (messages != null) { foreach (JToken message in messages) { try { connection.OnReceived(message); } catch (Exception ex) { connection.OnError(ex); } } connection.MessageId = result["C"].Value(); } } catch (Exception ex) { connection.OnError(ex); } } private static void UpdateGroups(IConnection connection, JToken groupsToken) { if (groupsToken != null) { connection.GroupsToken = groupsToken.Value(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is used on Silverlight and Windows Phone")] private static string GetNoCacheUrlParam() { return "noCache=" + Guid.NewGuid().ToString(); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/AutoTransport.cs0000644000175000017500000001162012204443213031451 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Http; namespace Microsoft.AspNet.SignalR.Client.Transports { public class AutoTransport : IClientTransport { // Transport that's in use private IClientTransport _transport; private readonly IHttpClient _httpClient; private int _startIndex = 0; // List of transports in fallback order private readonly IList _transports; public AutoTransport(IHttpClient httpClient) { _httpClient = httpClient; _transports = new IClientTransport[] { #if NET45 new WebSocketTransport(httpClient), #endif new ServerSentEventsTransport(httpClient), new LongPollingTransport(httpClient) }; } public AutoTransport(IHttpClient httpClient, IList transports) { _httpClient = httpClient; _transports = transports; } /// /// Indicates whether or not the active transport supports keep alive /// public bool SupportsKeepAlive { get { return _transport != null ? _transport.SupportsKeepAlive : false; } } public string Name { get { if (_transport == null) { return null; } return _transport.Name; } } public Task Negotiate(IConnection connection) { var task = _httpClient.GetNegotiationResponse(connection); #if NET45 return task.Then(response => { if (!response.TryWebSockets) { _startIndex = 1; } return response; }); #else return task; #endif } public Task Start(IConnection connection, string data, CancellationToken disconnectToken) { var tcs = new TaskCompletionSource(); // Resolve the transport ResolveTransport(connection, data, disconnectToken, tcs, _startIndex); return tcs.Task; } private void ResolveTransport(IConnection connection, string data, CancellationToken disconnectToken, TaskCompletionSource tcs, int index) { // Pick the current transport IClientTransport transport = _transports[index]; transport.Start(connection, data, disconnectToken).ContinueWith(task => { if (task.IsFaulted) { // Make sure we observe the exception var ex = task.Exception.GetBaseException(); connection.Trace(TraceLevels.Events, "Auto: Failed to connect to using transport {0}. {1}", transport.Name, ex); // If that transport fails to initialize then fallback var next = index + 1; if (next < _transports.Count) { // Try the next transport ResolveTransport(connection, data, disconnectToken, tcs, next); } else { // If there's nothing else to try then just fail tcs.SetException(task.Exception); } } else { // Set the active transport _transport = transport; // Complete the process tcs.SetResult(null); } }, TaskContinuationOptions.ExecuteSynchronously); } public Task Send(IConnection connection, string data) { return _transport.Send(connection, data); } public void Abort(IConnection connection, TimeSpan timeout) { if (_transport != null) { _transport.Abort(connection, timeout); } } public void LostConnection(IConnection connection) { _transport.LostConnection(connection); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { if (_transport != null) { _transport.Dispose(); } } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/ServerSentEventsTransport.cs0000644000175000017500000002324312237701046034041 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Client.Infrastructure; using Microsoft.AspNet.SignalR.Client.Transports.ServerSentEvents; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Transports { public class ServerSentEventsTransport : HttpBasedTransport { private IRequest _request; public ServerSentEventsTransport() : this(new DefaultHttpClient()) { } public ServerSentEventsTransport(IHttpClient httpClient) : base(httpClient, "serverSentEvents") { ReconnectDelay = TimeSpan.FromSeconds(2); ConnectionTimeout = TimeSpan.FromSeconds(5); } /// /// Indicates whether or not the transport supports keep alive /// public override bool SupportsKeepAlive { get { return true; } } /// /// Time allowed before failing the connect request. /// public TimeSpan ConnectionTimeout { get; set; } /// /// The time to wait after a connection drops to try reconnecting. /// public TimeSpan ReconnectDelay { get; set; } protected override void OnStart(IConnection connection, string data, CancellationToken disconnectToken, Action initializeCallback, Action errorCallback) { OpenConnection(connection, data, disconnectToken, initializeCallback, errorCallback); } private void Reconnect(IConnection connection, string data, CancellationToken disconnectToken) { // Wait for a bit before reconnecting TaskAsyncHelper.Delay(ReconnectDelay).Then(() => { // FIX: Race if Connection is stopped and completely restarted between checking the token and calling // connection.EnsureReconnecting() if (!disconnectToken.IsCancellationRequested && connection.EnsureReconnecting()) { // Now attempt a reconnect OpenConnection(connection, data, disconnectToken, initializeCallback: null, errorCallback: null); } }); } [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "We will refactor later.")] [SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling", Justification = "We will refactor later.")] private void OpenConnection(IConnection connection, string data, CancellationToken disconnectToken, Action initializeCallback, Action errorCallback) { // If we're reconnecting add /connect to the url bool reconnecting = initializeCallback == null; var callbackInvoker = new ThreadSafeInvoker(); var requestDisposer = new Disposer(); var url = connection.Url + (reconnecting ? "reconnect" : "connect") + GetReceiveQueryString(connection, data); connection.Trace(TraceLevels.Events, "SSE: GET {0}", url); HttpClient.Get(url, req => { _request = req; connection.PrepareRequest(_request); _request.Accept = "text/event-stream"; }, isLongRunning: true).ContinueWith(task => { if (task.IsFaulted) { Exception exception = task.Exception.Unwrap(); if (!ExceptionHelper.IsRequestAborted(exception)) { if (errorCallback != null) { callbackInvoker.Invoke((cb, ex) => cb(ex), errorCallback, exception); } else if (reconnecting) { // Only raise the error event if we failed to reconnect connection.OnError(exception); Reconnect(connection, data, disconnectToken); } } requestDisposer.Dispose(); } else { var response = task.Result; Stream stream = response.GetStream(); var eventSource = new EventSourceStreamReader(connection, stream); bool stop = false; var esCancellationRegistration = disconnectToken.SafeRegister(state => { stop = true; ((IRequest)state).Abort(); }, _request); eventSource.Opened = () => { // If we're not reconnecting, then we're starting the transport for the first time. Trigger callback only on first start. if (!reconnecting) { callbackInvoker.Invoke(initializeCallback); } else if (connection.ChangeState(ConnectionState.Reconnecting, ConnectionState.Connected)) { // Raise the reconnect event if the connection comes back up connection.OnReconnected(); } }; eventSource.Message = sseEvent => { if (sseEvent.EventType == EventType.Data) { if (sseEvent.Data.Equals("initialized", StringComparison.OrdinalIgnoreCase)) { return; } bool timedOut; bool disconnected; TransportHelper.ProcessResponse(connection, sseEvent.Data, out timedOut, out disconnected); if (disconnected) { stop = true; connection.Disconnect(); } } }; eventSource.Closed = exception => { if (exception != null) { // Check if the request is aborted bool isRequestAborted = ExceptionHelper.IsRequestAborted(exception); if (!isRequestAborted) { // Don't raise exceptions if the request was aborted (connection was stopped). connection.OnError(exception); } } requestDisposer.Dispose(); esCancellationRegistration.Dispose(); response.Dispose(); if (stop) { CompleteAbort(); } else if (TryCompleteAbort()) { // Abort() was called, so don't reconnect } else { Reconnect(connection, data, disconnectToken); } }; eventSource.Start(); } }); var requestCancellationRegistration = disconnectToken.SafeRegister(state => { if (state != null) { // This will no-op if the request is already finished. ((IRequest)state).Abort(); } if (errorCallback != null) { callbackInvoker.Invoke((cb, token) => { #if NET35 || WINDOWS_PHONE cb(new OperationCanceledException(Resources.Error_ConnectionCancelled)); #else cb(new OperationCanceledException(Resources.Error_ConnectionCancelled, token)); #endif }, errorCallback, disconnectToken); } }, _request); requestDisposer.Set(requestCancellationRegistration); if (errorCallback != null) { TaskAsyncHelper.Delay(ConnectionTimeout).Then(() => { callbackInvoker.Invoke((conn, cb) => { // Abort the request before cancelling _request.Abort(); // Connection timeout occurred cb(new TimeoutException()); }, connection, errorCallback); }); } } public override void LostConnection(IConnection connection) { if (_request != null) { _request.Abort(); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/ServerSentEvents/0000775000175000017500000000000014011526500031563 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/ServerSentEvents/EventType.cs0000644000175000017500000000042112204443213034031 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. namespace Microsoft.AspNet.SignalR.Client.Transports.ServerSentEvents { public enum EventType { Id, Data } } EventSourceStreamReader.cs0000644000175000017500000000435612204443213036603 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/ServerSentEvents// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.IO; namespace Microsoft.AspNet.SignalR.Client.Transports.ServerSentEvents { /// /// Event source implementation for .NET. This isn't to the spec but it's enough to support SignalR's /// server. /// public class EventSourceStreamReader : AsyncStreamReader { private readonly ChunkBuffer _buffer; private readonly IConnection _connection; /// /// Invoked when there's a message if received in the stream. /// public Action Message { get; set; } /// /// Initializes a new instance of the class. /// /// The connection associated with this event source /// The stream to read event source payloads from. public EventSourceStreamReader(IConnection connection, Stream stream) : base(stream) { _connection = connection; _buffer = new ChunkBuffer(); Data = ProcessBuffer; } private void ProcessBuffer(ArraySegment readBuffer) { lock (BufferLock) { _buffer.Add(readBuffer); while (_buffer.HasChunks) { string line = _buffer.ReadLine(); // No new lines in the buffer so stop processing if (line == null) { break; } SseEvent sseEvent; if (!SseEvent.TryParse(line, out sseEvent)) { continue; } _connection.Trace(TraceLevels.Messages, "SSE: OnMessage({0})", sseEvent); OnMessage(sseEvent); } } } private void OnMessage(SseEvent sseEvent) { if (Message != null) { Message(sseEvent); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/ServerSentEvents/ChunkBuffer.cs0000644000175000017500000000327412204443213034321 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Text; namespace Microsoft.AspNet.SignalR.Client.Transports.ServerSentEvents { public class ChunkBuffer { private int _offset; private readonly StringBuilder _buffer; private readonly StringBuilder _lineBuilder; public ChunkBuffer() { _buffer = new StringBuilder(); _lineBuilder = new StringBuilder(); } public bool HasChunks { get { return _offset < _buffer.Length; } } public void Add(byte[] buffer, int length) { _buffer.Append(Encoding.UTF8.GetString(buffer, 0, length)); } public void Add(ArraySegment buffer) { _buffer.Append(Encoding.UTF8.GetString(buffer.Array, buffer.Offset, buffer.Count)); } public string ReadLine() { // Lock while reading so that we can make safe assuptions about the buffer indicies for (int i = _offset; i < _buffer.Length; i++, _offset++) { if (_buffer[i] == '\n') { _buffer.Remove(0, _offset + 1); string line = _lineBuilder.ToString().Trim(); #if WINDOWS_PHONE || NET35 _lineBuilder.Length = 0; #else _lineBuilder.Clear(); #endif _offset = 0; return line; } _lineBuilder.Append(_buffer[i]); } return null; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/ServerSentEvents/SseEvent.cs0000644000175000017500000000257412204443213033655 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; namespace Microsoft.AspNet.SignalR.Client.Transports.ServerSentEvents { public class SseEvent { public SseEvent(EventType type, string data) { EventType = type; Data = data; } public EventType EventType { get; private set; } public string Data { get; private set; } public override string ToString() { return EventType + ": " + Data; } public static bool TryParse(string line, out SseEvent sseEvent) { sseEvent = null; if (line == null) { throw new ArgumentNullException("line"); } if (line.StartsWith("data:", StringComparison.OrdinalIgnoreCase)) { string data = line.Substring("data:".Length).Trim(); sseEvent = new SseEvent(EventType.Data, data); return true; } else if (line.StartsWith("id:", StringComparison.OrdinalIgnoreCase)) { string data = line.Substring("id:".Length).Trim(); sseEvent = new SseEvent(EventType.Id, data); return true; } return false; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/HttpBasedTransport.cs0000644000175000017500000002012612237701046032427 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Infrastructure; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Transports { public abstract class HttpBasedTransport : IClientTransport { // The send query string private const string _sendQueryString = "?transport={0}&connectionToken={1}{2}"; // The transport name private readonly string _transport; // Used to complete the synchronous call to Abort() private ManualResetEvent _abortResetEvent = new ManualResetEvent(initialState: false); // Used to indicate whether Abort() has been called private bool _startedAbort; // Used to ensure that Abort() runs effectively only once // The _abortLock subsumes the _disposeLock and can be held upwards of 30 seconds private readonly object _abortLock = new object(); // Used to ensure the _abortResetEvent.Set() isn't called after disposal private bool _disposed; // Used to make checking _disposed and calling _abortResetEvent.Set() thread safe private readonly object _disposeLock = new object(); private readonly IHttpClient _httpClient; protected HttpBasedTransport(IHttpClient httpClient, string transport) { _httpClient = httpClient; _transport = transport; } public string Name { get { return _transport; } } /// /// Indicates whether or not the transport supports keep alive /// public abstract bool SupportsKeepAlive { get; } protected IHttpClient HttpClient { get { return _httpClient; } } public Task Negotiate(IConnection connection) { return _httpClient.GetNegotiationResponse(connection); } public Task Start(IConnection connection, string data, CancellationToken disconnectToken) { var tcs = new TaskCompletionSource(); OnStart(connection, data, disconnectToken, () => tcs.TrySetResult(null), exception => tcs.TrySetException(exception)); return tcs.Task; } protected abstract void OnStart(IConnection connection, string data, CancellationToken disconnectToken, Action initializeCallback, Action errorCallback); public Task Send(IConnection connection, string data) { if (connection == null) { throw new ArgumentNullException("connection"); } string url = connection.Url + "send"; string customQueryString = String.IsNullOrEmpty(connection.QueryString) ? String.Empty : "&" + connection.QueryString; url += String.Format(CultureInfo.InvariantCulture, _sendQueryString, _transport, Uri.EscapeDataString(connection.ConnectionToken), customQueryString); var postData = new Dictionary { { "data", data } }; return _httpClient.Post(url, connection.PrepareRequest, postData, isLongRunning: false) .Then(response => response.ReadAsString()) .Then(raw => { connection.Trace(TraceLevels.Messages, "OnMessage({0})", raw); if (!String.IsNullOrEmpty(raw)) { connection.OnReceived(JObject.Parse(raw)); } }) .Catch(connection.OnError); } public void Abort(IConnection connection, TimeSpan timeout) { if (connection == null) { throw new ArgumentNullException("connection"); } // Abort should never complete before any of its previous calls lock (_abortLock) { if (_disposed) { throw new ObjectDisposedException(GetType().Name); } // Ensure that an abort request is only made once if (!_startedAbort) { _startedAbort = true; string url = connection.Url + "abort" + String.Format(CultureInfo.InvariantCulture, _sendQueryString, _transport, Uri.EscapeDataString(connection.ConnectionToken), null); url += TransportHelper.AppendCustomQueryString(connection, url); _httpClient.Post(url, connection.PrepareRequest, isLongRunning: false).Catch((ex, state) => { // If there's an error making an http request set the reset event ((HttpBasedTransport)state).CompleteAbort(); }, this); if (!_abortResetEvent.WaitOne(timeout)) { connection.Trace(TraceLevels.Events, "Abort never fired"); } } } } protected void CompleteAbort() { lock (_disposeLock) { if (!_disposed) { // Make any future calls to Abort() no-op // Abort might still run, but any ongoing aborts will immediately complete _startedAbort = true; // Ensure any ongoing calls to Abort() complete _abortResetEvent.Set(); } } } protected bool TryCompleteAbort() { // Make sure we don't Set a disposed ManualResetEvent lock (_disposeLock) { if (_disposed) { // Don't try to continue receiving messages if the transport is disposed return true; } else if (_startedAbort) { _abortResetEvent.Set(); return true; } else { return false; } } } protected string GetReceiveQueryString(IConnection connection, string data) { return TransportHelper.GetReceiveQueryString(connection, data, _transport); } public abstract void LostConnection(IConnection connection); public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { // Wait for any ongoing aborts to complete // In practice, any aborts should have finished by the time Dispose is called lock (_abortLock) lock (_disposeLock) { if (!_disposed) { _abortResetEvent.Dispose(); _disposed = true; } } } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/LongPollingTransport.cs0000644000175000017500000002204312204443213032766 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Client.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Transports { public class LongPollingTransport : HttpBasedTransport { /// /// The time to wait after a connection drops to try reconnecting. /// public TimeSpan ReconnectDelay { get; set; } /// /// The time to wait after an error happens to continue polling. /// public TimeSpan ErrorDelay { get; set; } /// /// The time to wait after the initial connect http request before it is considered /// open. /// public TimeSpan ConnectDelay { get; set; } public LongPollingTransport() : this(new DefaultHttpClient()) { } public LongPollingTransport(IHttpClient httpClient) : base(httpClient, "longPolling") { ReconnectDelay = TimeSpan.FromSeconds(5); ErrorDelay = TimeSpan.FromSeconds(2); ConnectDelay = TimeSpan.FromSeconds(2); } /// /// Indicates whether or not the transport supports keep alive /// public override bool SupportsKeepAlive { get { return false; } } protected override void OnStart(IConnection connection, string data, CancellationToken disconnectToken, Action initializeCallback, Action errorCallback) { var requestHandler = new PollingRequestHandler(HttpClient); var negotiateInitializer = new NegotiateInitializer(initializeCallback, errorCallback, ConnectDelay); // Save the success and abort cases so we can remove them after transport is initialized Action initializeSuccess = message => { negotiateInitializer.Complete(); }; Action initializeAbort = request => { negotiateInitializer.Abort(disconnectToken); }; requestHandler.OnMessage += initializeSuccess; requestHandler.OnError += negotiateInitializer.Complete; requestHandler.OnAbort += initializeAbort; // Once we've initialized the connection we need to tear down the initializer functions negotiateInitializer.Initialized += () => { requestHandler.OnMessage -= initializeSuccess; requestHandler.OnError -= negotiateInitializer.Complete; requestHandler.OnAbort -= initializeAbort; }; // Add additional actions to each of the PollingRequestHandler events PollingSetup(connection, data, disconnectToken, requestHandler); requestHandler.Start(); // Start initialization, essentially if we have an assume sucess clause in our negotiateInitializer // then we will start the countdown from the point which we start initialization. negotiateInitializer.Initialize(); } [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "We will refactor later.")] private void PollingSetup(IConnection connection, string data, CancellationToken disconnectToken, PollingRequestHandler requestHandler) { // These are created new on each poll var reconnectInvoker = new ThreadSafeInvoker(); var requestDisposer = new Disposer(); requestHandler.ResolveUrl = () => { var url = connection.Url; if (connection.MessageId == null) { url += "connect"; } else if (IsReconnecting(connection)) { url += "reconnect"; } else { url += "poll"; } url += GetReceiveQueryString(connection, data); return url; }; requestHandler.PrepareRequest += req => { connection.PrepareRequest(req); }; requestHandler.OnMessage += message => { var shouldReconnect = false; var disconnectedReceived = false; connection.Trace(TraceLevels.Messages, "LP: OnMessage({0})", message); TransportHelper.ProcessResponse(connection, message, out shouldReconnect, out disconnectedReceived); if (IsReconnecting(connection)) { // If the timeout for the reconnect hasn't fired as yet just fire the // event here before any incoming messages are processed TryReconnect(connection, reconnectInvoker); } if (shouldReconnect) { // Transition into reconnecting state connection.EnsureReconnecting(); } if (disconnectedReceived) { connection.Disconnect(); } }; requestHandler.OnError += exception => { reconnectInvoker.Invoke(); // Transition into reconnecting state connection.EnsureReconnecting(); // Sometimes a connection might have been closed by the server before we get to write anything // so just try again and raise OnError. if (!ExceptionHelper.IsRequestAborted(exception) && !(exception is IOException)) { connection.OnError(exception); } else { requestHandler.Stop(); } }; requestHandler.OnPolling += () => { // Capture the cleanup within a closure so it can persist through multiple requests TryDelayedReconnect(connection, reconnectInvoker); requestDisposer.Set(disconnectToken.SafeRegister(state => { reconnectInvoker.Invoke(); requestHandler.Stop(); }, null)); }; requestHandler.OnAfterPoll = exception => { requestDisposer.Dispose(); if (TryCompleteAbort()) { // Abort() was called, so don't reconnect requestHandler.Stop(); } else { requestDisposer = new Disposer(); reconnectInvoker = new ThreadSafeInvoker(); if (exception != null) { // Delay polling by the error delay return TaskAsyncHelper.Delay(ErrorDelay); } } return TaskAsyncHelper.Empty; }; requestHandler.OnAbort += _ => { // Complete any ongoing calls to Abort() // If someone calls Abort() later, have it no-op CompleteAbort(); }; } private void TryDelayedReconnect(IConnection connection, ThreadSafeInvoker reconnectInvoker) { if (IsReconnecting(connection)) { TaskAsyncHelper.Delay(ReconnectDelay).Then(() => { TryReconnect(connection, reconnectInvoker); }); } } private static void TryReconnect(IConnection connection, ThreadSafeInvoker reconnectInvoker) { // Fire the reconnect event after the delay. reconnectInvoker.Invoke((conn) => FireReconnected(conn), connection); } private static void FireReconnected(IConnection connection) { // Mark the connection as connected if (connection.ChangeState(ConnectionState.Reconnecting, ConnectionState.Connected)) { connection.OnReconnected(); } } private static bool IsReconnecting(IConnection connection) { return connection.State == ConnectionState.Reconnecting; } public override void LostConnection(IConnection connection) { } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/AsyncStreamReader.cs0000644000175000017500000001331012204443213032176 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Transports { public class AsyncStreamReader { private readonly object _bufferLock = new object(); private readonly Stream _stream; private byte[] _readBuffer; private int _reading; private Action _setOpened; protected object BufferLock { get { return _bufferLock; } } /// /// Invoked when the stream is open. /// public Action Opened { get; set; } /// /// Invoked when the reader is closed while in the Processing state. /// public Action Closed { get; set; } /// /// Invoked when there's a message if received in the stream. /// public Action> Data { get; set; } /// /// Initializes a new instance of the class. /// /// The stream to read asynchronously payloads from. public AsyncStreamReader(Stream stream) { _stream = stream; } private bool Processing { get { return _reading == State.Processing; } } /// /// Starts the reader. /// public void Start() { if (Interlocked.CompareExchange(ref _reading, State.Processing, State.Initial) == State.Initial) { _setOpened = () => { OnOpened(); }; // FIX: Potential memory leak if Close is called between the CompareExchange and here. _readBuffer = new byte[4096]; // Start the process loop Process(); } } /// /// Closes the connection and the underlying stream. /// private void Close() { Close(exception: null); } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "The client receives the exception in the Close callback.")] private void Process() { Read: Task readTask; lock (_bufferLock) { if (Processing && _readBuffer != null) { readTask = _stream.ReadAsync(_readBuffer); } else { return; } } if (readTask.IsCompleted) { try { // Observe all exceptions readTask.Wait(); int read = readTask.Result; if (TryProcessRead(read)) { goto Read; } } catch (Exception ex) { Close(ex); } } else { ReadAsync(readTask); } } private void ReadAsync(Task readTask) { readTask.ContinueWith(task => { if (task.IsFaulted) { Close(task.Exception); } else if (task.IsCanceled) { Close(new OperationCanceledException()); } else { if (TryProcessRead(task.Result)) { Process(); } } }, TaskContinuationOptions.ExecuteSynchronously); } private bool TryProcessRead(int read) { Interlocked.Exchange(ref _setOpened, () => { }).Invoke(); if (read > 0) { // Put chunks in the buffer OnData(new ArraySegment(_readBuffer, 0, read)); return true; } else if (read == 0) { Close(); } return false; } private void Close(Exception exception) { var previousState = Interlocked.Exchange(ref _reading, State.Stopped); if (previousState != State.Stopped) { if (Closed != null) { if (exception != null) { exception = exception.Unwrap(); } Closed(exception); } lock (_bufferLock) { // Release the buffer _readBuffer = null; } } } private void OnOpened() { if (Opened != null) { Opened(); } } private void OnData(ArraySegment buffer) { if (Data != null) { Data(buffer); } } private static class State { public const int Initial = 0; public const int Processing = 1; public const int Stopped = 2; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Transports/IClientTransport.cs0000644000175000017500000000140112204443213032064 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; namespace Microsoft.AspNet.SignalR.Client.Transports { public interface IClientTransport : IDisposable { string Name { get; } bool SupportsKeepAlive { get; } Task Negotiate(IConnection connection); Task Start(IConnection connection, string data, CancellationToken disconnectToken); Task Send(IConnection connection, string data); void Abort(IConnection connection, TimeSpan timeout); void LostConnection(IConnection connection); } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Resources.resx0000644000175000017500000001560612204443213027003 0ustar00meebeymeebey00000000000000 text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 The connection was stopped before it could be started. The connection has not been established. Request headers cannot be set after the connection has started. You are using a version of the client that isn't compatible with the server. Client version {0}, server version {1}. A HubProxy cannot be added after the connection has been started. Server negotiation failed. The Start method must be called before data can be sent. Url cannot contain query string directly. Pass query string values in using available overload. smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/0000775000175000017500000000000014011526500027137 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/ThreadSafeInvoker.cs0000644000175000017500000000235012204443213033031 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Threading; namespace Microsoft.AspNet.SignalR.Client.Infrastructure { /// /// Allows for thread safe invocation of a delegate. /// internal class ThreadSafeInvoker { private int _invoked; public bool Invoke(Action action) { if (Interlocked.Exchange(ref _invoked, 1) == 0) { action(); return true; } return false; } public bool Invoke(Action action, T arg) { if (Interlocked.Exchange(ref _invoked, 1) == 0) { action(arg); return true; } return false; } public bool Invoke(Action action, T1 arg1, T2 arg2) { if (Interlocked.Exchange(ref _invoked, 1) == 0) { action(arg1, arg2); return true; } return false; } public bool Invoke() { return Invoke(() => { }); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/ExceptionHelper.cs0000644000175000017500000000301712204443213032564 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Net; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Infrastructure { internal static class ExceptionHelper { internal static bool IsRequestAborted(Exception exception) { exception = exception.Unwrap(); // Support an alternative way to propagate aborted requests if (exception is OperationCanceledException) { return true; } // There is a race in StreamExtensions where if the endMethod in ReadAsync is called before // the Stream is disposed, but executes after, Stream.EndRead will be called on a disposed object. // Since we call HttpWebRequest.Abort in several places while potentially reading the stream, // and we don't want to lock around HttpWebRequest.Abort and Stream.EndRead, we just swallow the // exception. // If the Stream is closed before the call to the endMethod, we expect an OperationCanceledException, // so this is a fairly rare race condition. if (exception is ObjectDisposedException) { return true; } var webException = exception as WebException; return (webException != null && webException.Status == WebExceptionStatus.RequestCanceled); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/ErrorExtensions.cs0000644000175000017500000000615512204443213032645 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Net; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client { public static class ErrorExtensions { /// /// Simplifies error recognition by unwrapping complex exceptions. /// /// The thrown exception. /// An unwrapped exception in the form of a SignalRError. [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "The IDisposable object is the return value.")] public static SignalRError GetError(this Exception ex) { ex = ex.Unwrap(); var wex = ex as WebException; var error = new SignalRError(ex); if (wex != null && wex.Response != null) { var response = wex.Response as HttpWebResponse; if (response != null) { error.SetResponse(response); error.StatusCode = response.StatusCode; Stream originStream = response.GetResponseStream(); if (originStream.CanRead) { // We need to copy the stream over and not consume it all on "ReadToEnd". If we consumed the entire stream GetError // would only be able to be called once per Exception, otherwise you get inconsistent ResponseBody results. Stream stream = Clone(originStream); // Consume our copied stream using (var sr = new StreamReader(stream)) { error.ResponseBody = sr.ReadToEnd(); } } } } return error; } [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "The return value of this private method is disposed in GetError.")] private static Stream Clone(Stream source) { var cloned = new MemoryStream(); #if NET35 // Copy up to 2048 bytes at a time byte[] buffer = new byte[2048]; // Maintains how many bytes were read int copiedBytes; // Read bytes and copy them into a buffer making sure not to trigger the dispose while ((copiedBytes = source.Read(buffer, 0, buffer.Length)) > 0) { // Write the copied bytes from the buffer into the cloned stream cloned.Write(buffer, 0, copiedBytes); } #else source.CopyTo(cloned); #endif // Move the stream pointers back to the original start locations if (source.CanSeek) { source.Seek(0, 0); } cloned.Seek(0, 0); return cloned; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/SignalRError.cs0000644000175000017500000000367712204443213032053 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Net; namespace Microsoft.AspNet.SignalR.Client { /// /// Represents errors that are thrown by the SignalR client /// public class SignalRError : IDisposable { private HttpWebResponse _response; /// /// Create custom SignalR based error. /// /// The exception to unwrap public SignalRError(Exception exception) { Exception = exception; } internal void SetResponse(HttpWebResponse response) { _response = response; } /// /// The status code of the error (if it was a WebException) /// public HttpStatusCode StatusCode { get; set; } /// /// The response body of the error, if it was a WebException and the response is readable /// public string ResponseBody { get; set; } /// /// The unwrapped underlying exception /// public Exception Exception { get; private set; } /// /// Allow a SignalRError to be directly written to an output stream /// /// Exception error public override string ToString() { return Exception.ToString(); } protected virtual void Dispose(bool disposing) { if (disposing) { if (_response != null) { _response.Close(); } } } /// /// Dispose of the response /// public void Dispose() { Dispose(true); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/UrlEncoder.cs0000644000175000017500000001033112204443213031525 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Text; namespace Microsoft.AspNet.SignalR.Infrastructure { // Taken from System.Net.Http.Formatting.Internal.UrlEncoder.cs (http://aspnetwebstack.codeplex.com/) /// /// Helpers for encoding URI query components. /// internal static class UrlEncoder { // The implementation below is ported from WebUtility for use in .Net 4 public static string UrlEncode(string str) { if (str == null) return null; byte[] bytes = Encoding.UTF8.GetBytes(str); byte[] encodedBytes = UrlEncode(bytes, 0, bytes.Length, alwaysCreateNewReturnValue: false); return Encoding.UTF8.GetString(encodedBytes, 0, encodedBytes.Length); } #region UrlEncode implementation private static byte[] UrlEncode(byte[] bytes, int offset, int count, bool alwaysCreateNewReturnValue) { byte[] encoded = UrlEncode(bytes, offset, count); return (alwaysCreateNewReturnValue && (encoded != null) && (encoded == bytes)) ? (byte[])encoded.Clone() : encoded; } private static byte[] UrlEncode(byte[] bytes, int offset, int count) { if (!ValidateUrlEncodingParameters(bytes, offset, count)) { return null; } int cSpaces = 0; int cUnsafe = 0; // count them first for (int i = 0; i < count; i++) { char ch = (char)bytes[offset + i]; if (ch == ' ') cSpaces++; else if (!IsUrlSafeChar(ch)) cUnsafe++; } // nothing to expand? if (cSpaces == 0 && cUnsafe == 0) return bytes; // expand not 'safe' characters into %XX, spaces to +s byte[] expandedBytes = new byte[count + cUnsafe * 2]; int pos = 0; for (int i = 0; i < count; i++) { byte b = bytes[offset + i]; char ch = (char)b; if (IsUrlSafeChar(ch)) { expandedBytes[pos++] = b; } else if (ch == ' ') { expandedBytes[pos++] = (byte)'+'; } else { expandedBytes[pos++] = (byte)'%'; expandedBytes[pos++] = (byte)IntToHex((b >> 4) & 0xf); expandedBytes[pos++] = (byte)IntToHex(b & 0x0f); } } return expandedBytes; } #endregion #region Helper methods private static char IntToHex(int n) { if (n <= 9) return (char)(n + (int)'0'); else return (char)(n - 10 + (int)'a'); } // Set of safe chars, from RFC 1738.4 minus '+' private static bool IsUrlSafeChar(char ch) { if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9') return true; switch (ch) { case '-': case '_': case '.': case '!': case '*': case '(': case ')': return true; } return false; } private static bool ValidateUrlEncodingParameters(byte[] bytes, int offset, int count) { if (bytes == null && count == 0) return false; if (bytes == null) { throw new ArgumentNullException("bytes"); } if (offset < 0 || offset > bytes.Length) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0 || offset + count > bytes.Length) { throw new ArgumentOutOfRangeException("count"); } return true; } #endregion } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Infrastructure/StreamExtensions.cs0000644000175000017500000000563012204443213033004 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading.Tasks; namespace Microsoft.AspNet.SignalR.Infrastructure { internal static class StreamExtensions { [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task ReadAsync(this Stream stream, byte[] buffer) { #if NETFX_CORE || NET45 return stream.ReadAsync(buffer, 0, buffer.Length); #else return FromAsync(cb => stream.BeginRead(buffer, 0, buffer.Length, cb, null), ar => stream.EndRead(ar)); #endif } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared class.")] public static Task WriteAsync(this Stream stream, byte[] buffer) { #if NETFX_CORE || NET45 return stream.WriteAsync(buffer, 0, buffer.Length); #else return FromAsync(cb => stream.BeginWrite(buffer, 0, buffer.Length, cb, null), WrapEndWrite(stream)); #endif } #if !(NETFX_CORE || NET45) private static Func WrapEndWrite(Stream stream) { return ar => { stream.EndWrite(ar); return null; }; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] private static Task FromAsync(Func begin, Func end) { var tcs = new TaskCompletionSource(); try { var result = begin(ar => { if (!ar.CompletedSynchronously) { CompleteAsync(tcs, ar, end); } }); if (result.CompletedSynchronously) { CompleteAsync(tcs, result, end); } } catch (Exception ex) { tcs.TrySetException(ex); } return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] private static void CompleteAsync(TaskCompletionSource tcs, IAsyncResult ar, Func end) { try { tcs.TrySetResult(end(ar)); } catch (OperationCanceledException) { tcs.TrySetCanceled(); } catch (Exception ex) { tcs.TrySetException(ex); } } #endif } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/HeaderDictionary.cs0000644000175000017500000000602512204443213027666 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Microsoft.AspNet.SignalR.Client { public class HeaderDictionary : IDictionary { private IDictionary _dictionary = new Dictionary(); private readonly IConnection _connection; public HeaderDictionary(IConnection connection) { _connection = connection; } public void Add(string key, string value) { EnsureConnnectionDisconnected(); _dictionary.Add(key, value); } public bool ContainsKey(string key) { return _dictionary.ContainsKey(key); } public ICollection Keys { get { return _dictionary.Keys; } } public bool Remove(string key) { EnsureConnnectionDisconnected(); return _dictionary.Remove(key); } public bool TryGetValue(string key, out string value) { return _dictionary.TryGetValue(key, out value); } public ICollection Values { get { return _dictionary.Values; } } public string this[string key] { get { return _dictionary[key]; } set { EnsureConnnectionDisconnected(); _dictionary[key] = value; } } public void Add(KeyValuePair item) { EnsureConnnectionDisconnected(); _dictionary.Add(item); } public void Clear() { EnsureConnnectionDisconnected(); _dictionary.Clear(); } public bool Contains(KeyValuePair item) { return _dictionary.Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { _dictionary.CopyTo(array, arrayIndex); } public int Count { get { return _dictionary.Count; } } public bool IsReadOnly { get { return _connection.State != ConnectionState.Disconnected || _dictionary.IsReadOnly; } } public bool Remove(KeyValuePair item) { EnsureConnnectionDisconnected(); return _dictionary.Remove(item); } public IEnumerator> GetEnumerator() { return _dictionary.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _dictionary.GetEnumerator(); } private void EnsureConnnectionDisconnected() { if (_connection.State != ConnectionState.Disconnected) { throw new InvalidOperationException(Resources.Error_HeadersCanOnlyBeSetWhenDisconnected); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Resources.Designer.cs0000644000175000017500000001460412204443213030163 0ustar00meebeymeebey00000000000000//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.18033 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Microsoft.AspNet.SignalR.Client { using System; using System.Reflection; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { #if NETFX_CORE var assembly = typeof(Resources).GetTypeInfo().Assembly; #else var assembly = typeof(Resources).Assembly; #endif global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.AspNet.SignalR.Client.Resources", assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Client Certificates cannot be added after the connection has started.. /// internal static string Error_CertsCanOnlyBeAddedWhenDisconnected { get { return ResourceManager.GetString("Error_CertsCanOnlyBeAddedWhenDisconnected", resourceCulture); } } /// /// Looks up a localized string similar to The connection was stopped before it could be started.. /// internal static string Error_ConnectionCancelled { get { return ResourceManager.GetString("Error_ConnectionCancelled", resourceCulture); } } /// /// Looks up a localized string similar to The connection has not been established.. /// internal static string Error_ConnectionHasNotBeenEstablished { get { return ResourceManager.GetString("Error_ConnectionHasNotBeenEstablished", resourceCulture); } } /// /// Looks up a localized string similar to Request headers cannot be set after the connection has started.. /// internal static string Error_HeadersCanOnlyBeSetWhenDisconnected { get { return ResourceManager.GetString("Error_HeadersCanOnlyBeSetWhenDisconnected", resourceCulture); } } /// /// Looks up a localized string similar to You are using a version of the client that isn't compatible with the server. Client version {0}, server version {1}.. /// internal static string Error_IncompatibleProtocolVersion { get { return ResourceManager.GetString("Error_IncompatibleProtocolVersion", resourceCulture); } } /// /// Looks up a localized string similar to A HubProxy cannot be added after the connection has been started.. /// internal static string Error_ProxiesCannotBeAddedConnectionStarted { get { return ResourceManager.GetString("Error_ProxiesCannotBeAddedConnectionStarted", resourceCulture); } } /// /// Looks up a localized string similar to Server negotiation failed.. /// internal static string Error_ServerNegotiationFailed { get { return ResourceManager.GetString("Error_ServerNegotiationFailed", resourceCulture); } } /// /// Looks up a localized string similar to The Start method must be called before data can be sent.. /// internal static string Error_StartMustBeCalledBeforeDataCanBeSent { get { return ResourceManager.GetString("Error_StartMustBeCalledBeforeDataCanBeSent", resourceCulture); } } /// /// Looks up a localized string similar to Url cannot contain query string directly. Pass query string values in using available overload.. /// internal static string Error_UrlCantContainQueryStringDirectly { get { return ResourceManager.GetString("Error_UrlCantContainQueryStringDirectly", resourceCulture); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/HeartBeatMonitor.cs0000644000175000017500000001140012204443213027650 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Threading; #if NETFX_CORE using Windows.System.Threading; #endif namespace Microsoft.AspNet.SignalR.Client { public class HeartbeatMonitor : IDisposable { #if !NETFX_CORE // Timer to determine when to notify the user and reconnect if required private Timer _timer; #else private ThreadPoolTimer _timer; #endif // Used to ensure that the Beat only executes when the connection is in the Connected state private readonly object _connectionStateLock; // Connection variable private readonly IConnection _connection; // To keep track of whether the user has been notified public bool HasBeenWarned { get; private set; } // To keep track of whether the client is already reconnecting public bool TimedOut { get; private set; } /// /// Initializes a new instance of the HeartBeatMonitor Class /// /// /// public HeartbeatMonitor(IConnection connection, object connectionStateLock) { _connection = connection; _connectionStateLock = connectionStateLock; } /// /// Updates LastKeepAlive and starts the timer /// public void Start() { _connection.UpdateLastKeepAlive(); HasBeenWarned = false; TimedOut = false; #if !NETFX_CORE _timer = new Timer(_ => Beat(), state: null, dueTime: _connection.KeepAliveData.CheckInterval, period: _connection.KeepAliveData.CheckInterval); #else _timer = ThreadPoolTimer.CreatePeriodicTimer((timer) => Beat(), period: _connection.KeepAliveData.CheckInterval); #endif } /// /// Callback function for the timer which determines if we need to notify the user or attempt to reconnect /// #if NETFX_CORE [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "Timer is not implemented on WinRT")] #endif private void Beat() { TimeSpan timeElapsed = DateTime.UtcNow - _connection.KeepAliveData.LastKeepAlive; Beat(timeElapsed); } /// /// Logic to determine if we need to notify the user or attempt to reconnect /// /// public void Beat(TimeSpan timeElapsed) { lock (_connectionStateLock) { if (_connection.State == ConnectionState.Connected) { if (timeElapsed >= _connection.KeepAliveData.Timeout) { if (!TimedOut) { // Connection has been lost _connection.Trace(TraceLevels.Events, "Connection Timed-out : Transport Lost Connection"); TimedOut = true; _connection.Transport.LostConnection(_connection); } } else if (timeElapsed >= _connection.KeepAliveData.TimeoutWarning) { if (!HasBeenWarned) { // Inform user and set HasBeenWarned to true _connection.Trace(TraceLevels.Events, "Connection Timeout Warning : Notifying user"); HasBeenWarned = true; _connection.OnConnectionSlow(); } } else { HasBeenWarned = false; TimedOut = false; } } } } /// /// Dispose off the timer /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// Dispose off the timer /// /// protected virtual void Dispose(bool disposing) { if (disposing) { if (_timer != null) { #if !NETFX_CORE _timer.Dispose(); _timer = null; #else _timer.Cancel(); _timer = null; #endif } } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/IConnection.cs0000644000175000017500000000366712204443213026671 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Net; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Http; using Microsoft.AspNet.SignalR.Client.Transports; using Newtonsoft.Json; using Newtonsoft.Json.Linq; #if (NET4 || NET45) using System.Security.Cryptography.X509Certificates; #endif namespace Microsoft.AspNet.SignalR.Client { public interface IConnection { KeepAliveData KeepAliveData { get; set; } string MessageId { get; set; } string GroupsToken { get; set; } IDictionary Items { get; } string ConnectionId { get; } string ConnectionToken { get; } string Url { get; } string QueryString { get; } ConnectionState State { get; } IClientTransport Transport { get; } bool ChangeState(ConnectionState oldState, ConnectionState newState); IDictionary Headers { get; } ICredentials Credentials { get; set; } CookieContainer CookieContainer { get; set; } JsonSerializer JsonSerializer { get; } [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Stop", Justification = "Works in VB.NET.")] void Stop(); void Disconnect(); Task Send(string data); void OnReceived(JToken data); void OnError(Exception ex); void OnReconnecting(); void OnReconnected(); void OnConnectionSlow(); void PrepareRequest(IRequest request); void UpdateLastKeepAlive(); #if (NET4 || NET45) void AddClientCertificate(X509Certificate certificate); #endif void Trace(TraceLevels level, string format, params object[] args); } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/0000775000175000017500000000000014011526500025020 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/IHubProxy.cs0000644000175000017500000000355512204443213027247 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { /// /// A client side proxy for a server side hub. /// public interface IHubProxy { /// /// Gets or sets state on the hub. /// /// The name of the field. /// The value of the field JToken this[string name] { get; set; } /// /// Executes a method on the server side hub asynchronously. /// /// The name of the method. /// The arguments /// A task that represents when invocation returned. Task Invoke(string method, params object[] args); /// /// Executes a method on the server side hub asynchronously. /// /// The type of result returned from the hub /// The name of the method. /// The arguments /// A task that represents when invocation returned. Task Invoke(string method, params object[] args); /// /// Registers an event for the hub. /// /// The name of the event /// A . Subscription Subscribe(string eventName); /// /// Gets the serializer used by the connection. /// JsonSerializer JsonSerializer { get; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/HubProxyExtensions.cs0000644000175000017500000003417512204443213031220 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using Microsoft.AspNet.SignalR.Client.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { /// /// Extensions to the . /// public static class HubProxyExtensions { /// /// Gets the value of a state variable. /// /// The type of the state variable /// The . /// The name of the state variable. /// The value of the state variable. public static T GetValue(this IHubProxy proxy, string name) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(name)) { throw new ArgumentNullException("name"); } return Convert(proxy[name], proxy.JsonSerializer); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer), Convert(args[1], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer), Convert(args[1], proxy.JsonSerializer), Convert(args[2], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer), Convert(args[1], proxy.JsonSerializer), Convert(args[2], proxy.JsonSerializer), Convert(args[3], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } #if !WINDOWS_PHONE && !SILVERLIGHT && !NET35 /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { return On(proxy, eventName, onData); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer), Convert(args[1], proxy.JsonSerializer), Convert(args[2], proxy.JsonSerializer), Convert(args[3], proxy.JsonSerializer), Convert(args[4], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer), Convert(args[1], proxy.JsonSerializer), Convert(args[2], proxy.JsonSerializer), Convert(args[3], proxy.JsonSerializer), Convert(args[4], proxy.JsonSerializer), Convert(args[5], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers for an event with the specified name and callback /// /// The . /// The name of the event. /// The callback /// An that represents this subscription. public static IDisposable On(this IHubProxy proxy, string eventName, Action onData) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } if (onData == null) { throw new ArgumentNullException("onData"); } Subscription subscription = proxy.Subscribe(eventName); Action> handler = args => { onData(Convert(args[0], proxy.JsonSerializer), Convert(args[1], proxy.JsonSerializer), Convert(args[2], proxy.JsonSerializer), Convert(args[3], proxy.JsonSerializer), Convert(args[4], proxy.JsonSerializer), Convert(args[5], proxy.JsonSerializer), Convert(args[6], proxy.JsonSerializer)); }; subscription.Received += handler; return new DisposableAction(() => subscription.Received -= handler); } /// /// Registers a event has an . /// /// The /// The name of the event. /// An . public static IObservable> Observe(this IHubProxy proxy, string eventName) { if (proxy == null) { throw new ArgumentNullException("proxy"); } if (String.IsNullOrEmpty(eventName)) { throw new ArgumentNullException("eventName"); } return new Hubservable(proxy, eventName); } #endif private static T Convert(JToken obj, JsonSerializer serializer) { if (obj == null) { return default(T); } return obj.ToObject(serializer); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/HubResult.cs0000644000175000017500000000235012204443213027263 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { /// /// Represents the result of a hub invocation. /// public class HubResult { /// /// The callback identifier /// [JsonProperty("I")] public string Id { get; set; } /// /// The return value of the hub /// [JsonProperty("R")] public JToken Result { get; set; } /// /// The error message returned from the hub invocation. /// [JsonProperty("E")] public string Error { get; set; } /// /// The caller state from this hub. /// [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly", Justification = "Type is used for serialization.")] [JsonProperty("S")] public IDictionary State { get; set; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/HubProxy.cs0000644000175000017500000001277712204443213027144 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { public class HubProxy : IHubProxy { private readonly string _hubName; private readonly IHubConnection _connection; private readonly Dictionary _state = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary _subscriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); public HubProxy(IHubConnection connection, string hubName) { _connection = connection; _hubName = hubName; } public JToken this[string name] { get { lock (_state) { JToken value; _state.TryGetValue(name, out value); return value; } } set { lock (_state) { _state[name] = value; } } } public JsonSerializer JsonSerializer { get { return _connection.JsonSerializer; } } public Subscription Subscribe(string eventName) { if (eventName == null) { throw new ArgumentNullException("eventName"); } Subscription subscription; if (!_subscriptions.TryGetValue(eventName, out subscription)) { subscription = new Subscription(); _subscriptions.Add(eventName, subscription); } return subscription; } public Task Invoke(string method, params object[] args) { return Invoke(method, args); } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flown to the caller")] public Task Invoke(string method, params object[] args) { if (method == null) { throw new ArgumentNullException("method"); } if (args == null) { throw new ArgumentNullException("args"); } var tokenifiedArguments = new JToken[args.Length]; for (int i = 0; i < tokenifiedArguments.Length; i++) { tokenifiedArguments[i] = JToken.FromObject(args[i], JsonSerializer); } var tcs = new TaskCompletionSource(); var callbackId = _connection.RegisterCallback(result => { if (result != null) { if (result.Error != null) { tcs.TrySetUnwrappedException(new InvalidOperationException(result.Error)); } else { try { if (result.State != null) { foreach (var pair in result.State) { this[pair.Key] = pair.Value; } } if (result.Result != null) { tcs.TrySetResult(result.Result.ToObject(JsonSerializer)); } else { tcs.TrySetResult(default(T)); } } catch (Exception ex) { // If we failed to set the result for some reason or to update // state then just fail the tcs. tcs.TrySetUnwrappedException(ex); } } } else { tcs.TrySetCanceled(); } }); var hubData = new HubInvocation { Hub = _hubName, Method = method, Args = tokenifiedArguments, CallbackId = callbackId }; if (_state.Count != 0) { hubData.State = _state; } var value = _connection.JsonSerializeObject(hubData); _connection.Send(value).ContinueWith(task => { if (task.IsCanceled) { tcs.TrySetCanceled(); } else if (task.IsFaulted) { tcs.TrySetUnwrappedException(task.Exception); } }, TaskContinuationOptions.NotOnRanToCompletion); return tcs.Task; } public void InvokeEvent(string eventName, IList args) { Subscription subscription; if (_subscriptions.TryGetValue(eventName, out subscription)) { subscription.OnReceived(args); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/Subscription.cs0000644000175000017500000000115012204443213030027 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { /// /// Represents a subscription to a hub method. /// public class Subscription { public event Action> Received; internal void OnReceived(IList data) { if (Received != null) { Received(data); } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/HubRegistrationData.cs0000644000175000017500000000042512204443213031252 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. namespace Microsoft.AspNet.SignalR.Client.Hubs { public class HubRegistrationData { public string Name { get; set; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/Hubservable.cs0000644000175000017500000000215512204443213027613 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using Newtonsoft.Json.Linq; using Microsoft.AspNet.SignalR.Client.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure; using System.Collections.Generic; namespace Microsoft.AspNet.SignalR.Client.Hubs { /// /// implementation of a hub event. /// public class Hubservable : IObservable> { private readonly string _eventName; private readonly IHubProxy _proxy; public Hubservable(IHubProxy proxy, string eventName) { _proxy = proxy; _eventName = eventName; } public IDisposable Subscribe(IObserver> observer) { var subscription = _proxy.Subscribe(_eventName); subscription.Received += observer.OnNext; return new DisposableAction(() => { subscription.Received -= observer.OnNext; }); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/HubConnection.cs0000644000175000017500000001540112204443213030105 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { /// /// A for interacting with Hubs. /// public class HubConnection : Connection, IHubConnection { private readonly Dictionary _hubs = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary> _callbacks = new Dictionary>(); private int _callbackId; /// /// Initializes a new instance of the class. /// /// The url to connect to. public HubConnection(string url) : this(url, useDefaultUrl: true) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// Determines if the default "/signalr" path should be appended to the specified url. public HubConnection(string url, bool useDefaultUrl) : base(GetUrl(url, useDefaultUrl)) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// The query string data to pass to the server. public HubConnection(string url, string queryString) : this(url, queryString, useDefaultUrl: true) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// The query string data to pass to the server. /// Determines if the default "/signalr" path should be appended to the specified url. public HubConnection(string url, string queryString, bool useDefaultUrl) : base(GetUrl(url, useDefaultUrl), queryString) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// The query string data to pass to the server. public HubConnection(string url, IDictionary queryString) : this(url, queryString, useDefaultUrl: true) { } /// /// Initializes a new instance of the class. /// /// The url to connect to. /// The query string data to pass to the server. /// Determines if the default "/signalr" path should be appended to the specified url. public HubConnection(string url, IDictionary queryString, bool useDefaultUrl) : base(GetUrl(url, useDefaultUrl), queryString) { } [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "")] protected override void OnMessageReceived(JToken message) { if (message["I"] != null) { var result = message.ToObject(JsonSerializer); Action callback; lock (_callbacks) { if (_callbacks.TryGetValue(result.Id, out callback)) { _callbacks.Remove(result.Id); } else { Debug.Assert(false, "Callback with id " + result.Id + " not found!"); } } if (callback != null) { callback(result); } } else { var invocation = message.ToObject(JsonSerializer); HubProxy hubProxy; if (_hubs.TryGetValue(invocation.Hub, out hubProxy)) { if (invocation.State != null) { foreach (var state in invocation.State) { hubProxy[state.Key] = state.Value; } } hubProxy.InvokeEvent(invocation.Method, invocation.Args); } base.OnMessageReceived(message); } } protected override string OnSending() { var data = _hubs.Select(p => new HubRegistrationData { Name = p.Key }); return this.JsonSerializeObject(data); } /// /// Creates an for the hub with the specified name. /// /// The name of the hub. /// A public IHubProxy CreateHubProxy(string hubName) { if (State != ConnectionState.Disconnected) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ProxiesCannotBeAddedConnectionStarted)); } HubProxy hubProxy; if (!_hubs.TryGetValue(hubName, out hubProxy)) { hubProxy = new HubProxy(this, hubName); _hubs[hubName] = hubProxy; } return hubProxy; } public string RegisterCallback(Action callback) { lock (_callbacks) { string id = _callbackId.ToString(CultureInfo.InvariantCulture); _callbacks[id] = callback; _callbackId++; return id; } } private static string GetUrl(string url, bool useDefaultUrl) { if (!url.EndsWith("/", StringComparison.Ordinal)) { url += "/"; } if (useDefaultUrl) { return url + "signalr"; } return url; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/HubInvocation.cs0000644000175000017500000000206312204443213030117 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.SignalR.Client.Hubs { public class HubInvocation { [JsonProperty("I")] public string CallbackId { get; set; } [JsonProperty("H")] public string Hub { get; set; } [JsonProperty("M")] public string Method { get; set; } [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "This type is used for serialization")] [JsonProperty("A")] public JToken[] Args { get; set; } [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly", Justification = "This type is used for serialization")] [JsonProperty("S", NullValueHandling = NullValueHandling.Ignore)] public Dictionary State { get; set; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Hubs/IHubConnection.cs0000644000175000017500000000050512204443213030215 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; namespace Microsoft.AspNet.SignalR.Client.Hubs { public interface IHubConnection : IConnection { string RegisterCallback(Action callback); } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/0000775000175000017500000000000014011526500025036 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/IResponse.cs0000644000175000017500000000124412204443213027274 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; using System.IO; namespace Microsoft.AspNet.SignalR.Client.Http { /// /// The http response. /// public interface IResponse : IDisposable { /// /// Gets the steam that represents the response body. /// /// [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "This could be expensive.")] Stream GetStream(); } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/HttpHelper.cs0000644000175000017500000001134412204443213027446 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client.Http { internal static class HttpHelper { [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task GetHttpResponseAsync(this HttpWebRequest request) { try { return Task.Factory.FromAsync(request.BeginGetResponse, ar => (HttpWebResponse)request.EndGetResponse(ar), null); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed back to the caller.")] public static Task GetHttpRequestStreamAsync(this HttpWebRequest request) { try { return Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } public static Task GetAsync(string url, Action requestPreparer) { HttpWebRequest request = CreateWebRequest(url); if (requestPreparer != null) { requestPreparer(request); } return request.GetHttpResponseAsync(); } public static Task PostAsync(string url, Action requestPreparer, IDictionary postData) { return PostInternal(url, requestPreparer, postData); } private static Task PostInternal(string url, Action requestPreparer, IDictionary postData) { HttpWebRequest request = CreateWebRequest(url); if (requestPreparer != null) { requestPreparer(request); } byte[] buffer = ProcessPostData(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; #if !WINDOWS_PHONE && !SILVERLIGHT // Set the content length if the buffer is non-null request.ContentLength = buffer != null ? buffer.LongLength : 0; #endif if (buffer == null) { // If there's nothing to be written to the request then just get the response return request.GetHttpResponseAsync(); } // Write the post data to the request stream return request.GetHttpRequestStreamAsync() .Then(stream => stream.WriteAsync(buffer).Then(() => stream.Dispose())) .Then(() => request.GetHttpResponseAsync()); } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.Text.StringBuilder.AppendFormat(System.String,System.Object[])", Justification = "This will never be localized.")] private static byte[] ProcessPostData(IDictionary postData) { if (postData == null || postData.Count == 0) { return null; } var sb = new StringBuilder(); foreach (var pair in postData) { if (sb.Length > 0) { sb.Append("&"); } if (String.IsNullOrEmpty(pair.Value)) { continue; } sb.AppendFormat("{0}={1}", pair.Key, UrlEncoder.UrlEncode(pair.Value)); } return Encoding.UTF8.GetBytes(sb.ToString()); } private static HttpWebRequest CreateWebRequest(string url) { HttpWebRequest request = null; #if WINDOWS_PHONE request = (HttpWebRequest)WebRequest.Create(url); request.AllowReadStreamBuffering = false; #elif SILVERLIGHT request = (HttpWebRequest)System.Net.Browser.WebRequestCreator.ClientHttp.Create(new Uri(url)); request.AllowReadStreamBuffering = false; #else request = (HttpWebRequest)WebRequest.Create(url); #endif return request; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/HttpWebResponseWrapper.cs0000644000175000017500000000154412204443213032025 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.IO; using System.Net; using System.Threading.Tasks; namespace Microsoft.AspNet.SignalR.Client.Http { public class HttpWebResponseWrapper : IResponse { private readonly HttpWebResponse _response; public HttpWebResponseWrapper(HttpWebResponse response) { _response = response; } public Stream GetStream() { return _response.GetResponseStream(); } protected virtual void Dispose(bool disposing) { if (disposing) { ((IDisposable)_response).Dispose(); } } public void Dispose() { Dispose(true); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/IHttpClient.cs0000644000175000017500000000340412237701046027563 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; namespace Microsoft.AspNet.SignalR.Client.Http { /// /// A client that can make http request. /// public interface IHttpClient { /// /// Makes an asynchronous http GET request to the specified url. /// /// The url to send the request to. /// A callback that initializes the request with default values. /// Indicates whether it is a long running request /// A . [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Performs a GET request")] Task Get(string url, Action prepareRequest, bool isLongRunning); /// /// Makes an asynchronous http POST request to the specified url. /// /// The url to send the request to. /// A callback that initializes the request with default values. /// form url encoded data. /// Indicates whether it is a long running request /// A . Task Post(string url, Action prepareRequest, IDictionary postData, bool isLongRunning); } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/HttpWebRequestWrapper.cs0000644000175000017500000001306612204443213031661 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Globalization; using System.Net; #if (NET4 || NET45) using System.Security.Cryptography.X509Certificates; #endif namespace Microsoft.AspNet.SignalR.Client.Http { public class HttpWebRequestWrapper : IRequest { private readonly HttpWebRequest _request; private IDictionary> _restrictedHeadersSet = new Dictionary>() { { HttpRequestHeader.Accept.ToString(), (request, value) => { request.Accept = value; } }, { HttpRequestHeader.ContentType.ToString(), (request, value) => { request.ContentType = value; } }, { HttpRequestHeader.ContentLength.ToString(), (request, value) => { request.ContentLength = Int32.Parse(value, CultureInfo.CurrentCulture); } }, { HttpRequestHeader.UserAgent.ToString(), (request, value) => { request.UserAgent = value; } }, #if (!WINDOWS_PHONE && !SILVERLIGHT) { HttpRequestHeader.Connection.ToString(), (request, value) => { request.Connection = value; } }, #if !MONO { HttpRequestHeader.Date.ToString(), (request, value) => {request.Date = DateTime.Parse(value, CultureInfo.CurrentCulture); } }, #endif { HttpRequestHeader.Expect.ToString(), (request, value) => {request.Expect = value;} }, { HttpRequestHeader.Host.ToString(), (request, value) => {request.Host = value; } }, { HttpRequestHeader.IfModifiedSince.ToString(), (request, value) => {request.IfModifiedSince = DateTime.Parse(value, CultureInfo.CurrentCulture);} }, { HttpRequestHeader.Referer.ToString(), (request, value) => { request.Referer = value; } }, { HttpRequestHeader.TransferEncoding.ToString(), (request, value) => { request.TransferEncoding = value; } }, #endif }; public HttpWebRequestWrapper(HttpWebRequest request) { _request = request; } public string UserAgent { get { return _request.UserAgent; } set { _request.UserAgent = value; } } public ICredentials Credentials { get { return _request.Credentials; } set { _request.Credentials = value; } } public CookieContainer CookieContainer { get { return _request.CookieContainer; } set { _request.CookieContainer = value; } } public string Accept { get { return _request.Accept; } set { _request.Accept = value; } } #if !SILVERLIGHT public IWebProxy Proxy { get { return _request.Proxy; } set { _request.Proxy = value; } } #endif public void Abort() { _request.Abort(); } public void SetRequestHeaders(IDictionary headers) { if (headers == null) { throw new ArgumentNullException("headers"); } foreach (KeyValuePair headerEntry in headers) { if (!_restrictedHeadersSet.Keys.Contains(headerEntry.Key)) { #if (!WINDOWS_PHONE && !SILVERLIGHT) _request.Headers.Add(headerEntry.Key, headerEntry.Value); #endif } else { Action setHeaderAction; if (_restrictedHeadersSet.TryGetValue(headerEntry.Key, out setHeaderAction)) { setHeaderAction.Invoke(_request, headerEntry.Value); } } } } #if (NET4 || NET45) && !MONO public void AddClientCerts(X509CertificateCollection certificates) { if (certificates == null) { throw new ArgumentNullException("certificates"); } _request.ClientCertificates = certificates; } #endif } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/IResponseExtensions.cs0000644000175000017500000000223412204443213031354 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Client.Transports; namespace Microsoft.AspNet.SignalR.Client.Http { public static class IResponseExtensions { public static Task ReadAsString(this IResponse response) { if (response == null) { throw new ArgumentNullException("response"); } var stream = response.GetStream(); var reader = new AsyncStreamReader(stream); var result = new StringBuilder(); var resultTcs = new TaskCompletionSource(); reader.Data = buffer => { result.Append(Encoding.UTF8.GetString(buffer.Array, buffer.Offset, buffer.Count)); }; reader.Closed = exception => { response.Dispose(); resultTcs.SetResult(result.ToString()); }; reader.Start(); return resultTcs.Task; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/IHttpClientExtensions.cs0000644000175000017500000000162012237701046031641 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Threading.Tasks; namespace Microsoft.AspNet.SignalR.Client.Http { public static class IHttpClientExtensions { public static Task Post(this IHttpClient client, string url, Action prepareRequest, bool isLongRunning) { if (client == null) { throw new ArgumentNullException("client"); } if (url == null) { throw new ArgumentNullException("url"); } if (prepareRequest == null) { throw new ArgumentNullException("prepareRequest"); } return client.Post(url, prepareRequest, postData: null, isLongRunning: isLongRunning); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/DefaultHttpClient.cs0000644000175000017500000000552712237701046030767 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Microsoft.AspNet.SignalR.Client.Http { /// /// The default implementation. /// public class DefaultHttpClient : IHttpClient { #if (!WINDOWS_PHONE && !SILVERLIGHT) private readonly string _shortRunningGroup; private readonly string _longRunningGroup; public DefaultHttpClient() { string id = Guid.NewGuid().ToString(); _shortRunningGroup = "SignalR-short-running-" + id; _longRunningGroup = "SignalR-long-running-" + id; } #endif /// /// Makes an asynchronous http GET request to the specified url. /// /// The url to send the request to. /// A callback that initializes the request with default values. /// Indicates whether it is a long running request /// A . public Task Get(string url, Action prepareRequest, bool isLongRunning) { return HttpHelper.GetAsync(url, request => { #if (!WINDOWS_PHONE && !SILVERLIGHT) request.ConnectionGroupName = isLongRunning ? _longRunningGroup : _shortRunningGroup; #endif var req = new HttpWebRequestWrapper(request); prepareRequest(req); } ).Then(response => (IResponse)new HttpWebResponseWrapper(response)); } /// /// Makes an asynchronous http POST request to the specified url. /// /// The url to send the request to. /// A callback that initializes the request with default values. /// form url encoded data. /// Indicates whether it is a long running request /// A . public Task Post(string url, Action prepareRequest, IDictionary postData, bool isLongRunning) { return HttpHelper.PostAsync(url, request => { #if (!WINDOWS_PHONE && !SILVERLIGHT) request.ConnectionGroupName = isLongRunning ? _longRunningGroup : _shortRunningGroup; #endif var req = new HttpWebRequestWrapper(request); prepareRequest(req); }, postData).Then(response => (IResponse)new HttpWebResponseWrapper(response)); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Http/IRequest.cs0000644000175000017500000000327212204443213027131 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Collections.Generic; using System.Collections.Specialized; using System.Net; #if (NET4 || NET45) using System.Security.Cryptography.X509Certificates; #endif namespace Microsoft.AspNet.SignalR.Client.Http { /// /// The http request /// public interface IRequest { /// /// The user agent for this request. /// string UserAgent { get; set; } /// /// The credentials for this request. /// ICredentials Credentials { get; set; } /// /// The cookies for this request. /// CookieContainer CookieContainer { get; set; } #if !SILVERLIGHT /// /// The proxy information for this request. /// IWebProxy Proxy { get; set; } #endif /// /// The accept header for this request. /// string Accept { get; set; } /// /// Aborts the request. /// void Abort(); /// /// Set Request Headers /// /// request headers void SetRequestHeaders(IDictionary headers); #if (NET4 || NET45) && !MONO /// /// Sets client certificates /// /// client certificates void AddClientCerts(X509CertificateCollection certificates); #endif } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/KeepAliveData.cs0000644000175000017500000000306312204443213027106 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; namespace Microsoft.AspNet.SignalR.Client { /// /// Class to store all the Keep Alive properties /// public class KeepAliveData { // Determines when we warn the developer that the connection may be lost private const double _keepAliveWarnAt = 2.0 / 3.0; public DateTime LastKeepAlive { get; set; } // Timeout to designate when to force the connection into reconnecting public TimeSpan Timeout { get; private set; } // Timeout to designate when to warn the developer that the connection may be dead or is hanging. public TimeSpan TimeoutWarning { get; private set; } // Frequency with which we check the keep alive. It must be short in order to not miss/pick up any changes public TimeSpan CheckInterval { get; private set; } public KeepAliveData(TimeSpan timeout) { Timeout = timeout; TimeoutWarning = TimeSpan.FromTicks((long)(Timeout.Ticks * _keepAliveWarnAt)); CheckInterval = TimeSpan.FromTicks((Timeout.Ticks - TimeoutWarning.Ticks) / 3); } public KeepAliveData(DateTime lastKeepAlive, TimeSpan timeout, TimeSpan timeoutWarning, TimeSpan checkInterval) { LastKeepAlive = lastKeepAlive; Timeout = timeout; TimeoutWarning = timeoutWarning; CheckInterval = checkInterval; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/ObservableConnection.cs0000644000175000017500000000323012204443213030547 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Globalization; using Microsoft.AspNet.SignalR.Client.Infrastructure; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR.Client { public class ObservableConnection : IObservable { private readonly Connection _connection; private readonly Func _convert; public ObservableConnection(Connection connection, Func convert) { if (connection == null) { throw new ArgumentNullException("connection"); } if (convert == null) { throw new ArgumentNullException("convert"); } _convert = convert; _connection = connection; } public IDisposable Subscribe(IObserver observer) { Action received = data => { observer.OnNext(_convert(data)); }; Action closed = () => { observer.OnCompleted(); }; Action error = ex => { observer.OnError(ex); }; _connection.Received += received; _connection.Closed += closed; _connection.Error += error; return new DisposableAction(() => { _connection.Received -= received; _connection.Closed -= closed; _connection.Error -= error; }); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/NegotiationResponse.cs0000644000175000017500000000124212204443213030443 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System.Diagnostics; namespace Microsoft.AspNet.SignalR.Client { [DebuggerDisplay("{ConnectionId} {Url} -> {ProtocolVersion}")] public class NegotiationResponse { public string ConnectionId { get; set; } public string ConnectionToken { get; set; } public string Url { get; set; } public string ProtocolVersion { get; set; } public double DisconnectTimeout { get; set; } public bool TryWebSockets { get; set; } public double? KeepAliveTimeout { get; set; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/0000775000175000017500000000000014011526500023571 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/Infrastructure/0000775000175000017500000000000014011526500026611 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/Infrastructure/Disposer.cs0000644000175000017500000000367012204443213030735 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Threading; namespace Microsoft.AspNet.SignalR.Infrastructure { /// /// Helper class to manage disposing a resource at an arbirtary time /// internal class Disposer : IDisposable { private static readonly object _disposedSentinel = new object(); private object _disposable; public void Set(IDisposable disposable) { if (disposable == null) { throw new ArgumentNullException("disposable"); } object originalFieldValue = Interlocked.CompareExchange(ref _disposable, disposable, null); if (originalFieldValue == null) { // this is the first call to Set() and Dispose() hasn't yet been called; do nothing } else if (originalFieldValue == _disposedSentinel) { // Dispose() has already been called, so we need to dispose of the object that was just added disposable.Dispose(); } else { #if !NET35 && !SILVERLIGHT && !NETFX_CORE // Set has been called multiple times, fail Debug.Fail("Multiple calls to Disposer.Set(IDisposable) without calling Disposer.Dispose()"); #endif } } protected virtual void Dispose(bool disposing) { if (disposing) { var disposable = Interlocked.Exchange(ref _disposable, _disposedSentinel) as IDisposable; if (disposable != null) { disposable.Dispose(); } } } public void Dispose() { Dispose(true); } } } CancellationTokenExtensions.cs0000644000175000017500000000600312204443213034534 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/Infrastructure// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Threading; namespace Microsoft.AspNet.SignalR.Infrastructure { internal static class CancellationTokenExtensions { public static IDisposable SafeRegister(this CancellationToken cancellationToken, Action callback, object state) { var callbackWrapper = new CancellationCallbackWrapper(callback, state); // Ensure delegate continues to use the C# Compiler static delegate caching optimization. CancellationTokenRegistration registration = cancellationToken.Register(s => Cancel(s), callbackWrapper, useSynchronizationContext: false); var disposeCancellationState = new DiposeCancellationState(callbackWrapper, registration); // Ensure delegate continues to use the C# Compiler static delegate caching optimization. return new DisposableAction(s => Dispose(s), disposeCancellationState); } private static void Cancel(object state) { ((CancellationCallbackWrapper)state).TryInvoke(); } private static void Dispose(object state) { ((DiposeCancellationState)state).TryDispose(); } private class DiposeCancellationState { private readonly CancellationCallbackWrapper _callbackWrapper; private readonly CancellationTokenRegistration _registration; public DiposeCancellationState(CancellationCallbackWrapper callbackWrapper, CancellationTokenRegistration registration) { _callbackWrapper = callbackWrapper; _registration = registration; } public void TryDispose() { // This normally waits until the callback is finished invoked but we don't care if (_callbackWrapper.TrySetInvoked()) { // Bug #1549, .NET 4.0 has a bug where this throws if the CTS _registration.Dispose(); } } } private class CancellationCallbackWrapper { private readonly Action _callback; private readonly object _state; private int _callbackInvoked; public CancellationCallbackWrapper(Action callback, object state) { _callback = callback; _state = state; } public bool TrySetInvoked() { return Interlocked.Exchange(ref _callbackInvoked, 1) == 0; } public void TryInvoke() { if (TrySetInvoked()) { _callback(_state); } } } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/Infrastructure/ExceptionsExtensions.cs0000644000175000017500000000136412204443213033344 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; namespace Microsoft.AspNet.SignalR.Infrastructure { internal static class ExceptionsExtensions { internal static Exception Unwrap(this Exception ex) { if (ex == null) { return null; } var next = ex.GetBaseException(); while (next.InnerException != null) { // On mono GetBaseException() doesn't seem to do anything // so just walk the inner exception chain. next = next.InnerException; } return next; } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/Infrastructure/DisposableAction.cs0000644000175000017500000000227512204443213032370 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Threading; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNet.SignalR.Infrastructure { internal class DisposableAction : IDisposable { [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields", Justification = "The client projects use this.")] public static readonly DisposableAction Empty = new DisposableAction(() => { }); private Action _action; private readonly object _state; public DisposableAction(Action action) : this(state => ((Action)state).Invoke(), state: action) { } public DisposableAction(Action action, object state) { _action = action; _state = state; } protected virtual void Dispose(bool disposing) { if (disposing) { Interlocked.Exchange(ref _action, (state) => { }).Invoke(_state); } } public void Dispose() { Dispose(true); } } } smuxi-1.1/lib/SignalR/src/Microsoft.AspNet.SignalR.Core/TaskAsyncHelper.cs0000644000175000017500000012311412204443213027161 0ustar00meebeymeebey00000000000000// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.md in the project root for license information. using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.SignalR.Infrastructure; namespace Microsoft.AspNet.SignalR { internal static class TaskAsyncHelper { private static readonly Task _emptyTask = MakeTask(null); private static readonly Task _trueTask = MakeTask(true); private static readonly Task _falseTask = MakeTask(false); private static Task MakeTask(T value) { return FromResult(value); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Empty { get { return _emptyTask; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task True { get { return _trueTask; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task False { get { return _falseTask; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task OrEmpty(this Task task) { return task ?? Empty; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task OrEmpty(this Task task) { return task ?? TaskCache.Empty; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromAsync(Func beginMethod, Action endMethod, object state) { try { return Task.Factory.FromAsync(beginMethod, endMethod, state); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromAsync(Func beginMethod, Func endMethod, object state) { try { return Task.Factory.FromAsync(beginMethod, endMethod, state); } catch (Exception ex) { return TaskAsyncHelper.FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Series(Func[] tasks, object[] state) { Task prev = TaskAsyncHelper.Empty; Task finalTask = TaskAsyncHelper.Empty; for (int i = 0; i < tasks.Length; i++) { prev = finalTask; finalTask = prev.Then(tasks[i], state[i]); } return finalTask; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static TTask Catch(this TTask task) where TTask : Task { return Catch(task, ex => { }); } #if PERFCOUNTERS public static TTask Catch(this TTask task, params IPerformanceCounter[] counters) where TTask : Task { return Catch(task, _ => { if (counters == null) { return; } for (var i = 0; i < counters.Length; i++) { counters[i].Increment(); } }); } #endif [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static TTask Catch(this TTask task, Action handler, object state) where TTask : Task { if (task != null && task.Status != TaskStatus.RanToCompletion) { if (task.Status == TaskStatus.Faulted) { ExecuteOnFaulted(handler, state, task.Exception); } else { AttachFaultedContinuation(task, handler, state); } } return task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static void AttachFaultedContinuation(TTask task, Action handler, object state) where TTask : Task { task.ContinueWith(innerTask => { ExecuteOnFaulted(handler, state, innerTask.Exception); }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static void ExecuteOnFaulted(Action handler, object state, AggregateException exception) { // observe Exception #if !WINDOWS_PHONE && !SILVERLIGHT && !NETFX_CORE Trace.TraceError("SignalR exception thrown by Task: {0}", exception); #endif handler(exception, state); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static TTask Catch(this TTask task, Action handler) where TTask : Task { return task.Catch((ex, state) => ((Action)state).Invoke(ex), handler); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task ContinueWithNotComplete(this Task task, Action action) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: try { action(); return task; } catch (Exception e) { return FromError(e); } case TaskStatus.RanToCompletion: return task; default: var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted || t.IsCanceled) { try { action(); if (t.IsFaulted) { tcs.TrySetUnwrappedException(t.Exception); } else { tcs.TrySetCanceled(); } } catch (Exception e) { tcs.TrySetException(e); } } else { tcs.TrySetResult(null); } }, TaskContinuationOptions.ExecuteSynchronously); return tcs.Task; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static void ContinueWithNotComplete(this Task task, TaskCompletionSource tcs) { task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } }, TaskContinuationOptions.NotOnRanToCompletion); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static void ContinueWith(this Task task, TaskCompletionSource tcs) { task.ContinueWith(t => { if (t.IsFaulted) { tcs.TrySetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(null); } }, TaskContinuationOptions.ExecuteSynchronously); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static void ContinueWith(this Task task, TaskCompletionSource tcs) { task.ContinueWith(t => { if (t.IsFaulted) { tcs.TrySetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(t.Result); } }); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Return(this Task[] tasks) { return Then(tasks, () => { }); } // Then extesions [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor); default: return RunTask(task, successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor); default: return TaskRunners.RunTask(task, successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task[] tasks, Action successor) { if (tasks.Length == 0) { return FromMethod(successor); } var tcs = new TaskCompletionSource(); Task.Factory.ContinueWhenAll(tasks, completedTasks => { var faulted = completedTasks.FirstOrDefault(t => t.IsFaulted); if (faulted != null) { tcs.SetUnwrappedException(faulted.Exception); return; } var cancelled = completedTasks.FirstOrDefault(t => t.IsCanceled); if (cancelled != null) { tcs.SetCanceled(); return; } successor(); tcs.SetResult(null); }); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1); default: return GenericDelegates.ThenWithArgs(task, successor, arg1); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor, T1 arg1, T2 arg2) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1, arg2); default: return GenericDelegates.ThenWithArgs(task, successor, arg1, arg2); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1); default: return GenericDelegates.ThenWithArgs(task, successor, arg1) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor, T1 arg1, T2 arg2) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, arg1, arg2); default: return GenericDelegates.ThenWithArgs(task, successor, arg1, arg2) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func> successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners>.RunTask(task, t => successor(t.Result)) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners.RunTask(task, t => successor(t.Result)); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result, arg1); default: return GenericDelegates.ThenWithArgs(task, successor, arg1); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor); default: return TaskRunners.RunTask(task, successor) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func> successor) { switch (task.Status) { case TaskStatus.Faulted: return FromError(task.Exception); case TaskStatus.Canceled: return Canceled(); case TaskStatus.RanToCompletion: return FromMethod(successor); default: return TaskRunners>.RunTask(task, successor) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Action successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners.RunTask(task, successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, task.Result); default: return TaskRunners.RunTask(task, t => successor(t.Result)) .FastUnwrap(); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Then(this Task task, Func, T1, Task> successor, T1 arg1) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor, task, arg1); default: return GenericDelegates, T1, object>.ThenWithArgs(task, successor, arg1) .FastUnwrap(); } } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are flowed to the caller")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Finally(this Task task, Action next, object state) { try { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: next(state); return task; case TaskStatus.RanToCompletion: return FromMethod(next, state); default: return RunTaskSynchronously(task, next, state, onlyOnSuccess: false); } } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task RunSynchronously(this Task task, Action successor) { switch (task.Status) { case TaskStatus.Faulted: case TaskStatus.Canceled: return task; case TaskStatus.RanToCompletion: return FromMethod(successor); default: return RunTaskSynchronously(task, state => ((Action)state).Invoke(), successor); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task FastUnwrap(this Task task) { var innerTask = (task.Status == TaskStatus.RanToCompletion) ? task.Result : null; return innerTask ?? task.Unwrap(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task FastUnwrap(this Task> task) { var innerTask = (task.Status == TaskStatus.RanToCompletion) ? task.Result : null; return innerTask ?? task.Unwrap(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task Delay(TimeSpan timeOut) { #if NETFX_CORE return Task.Delay(timeOut); #else var tcs = new TaskCompletionSource(); var timer = new Timer(tcs.SetResult, null, timeOut, TimeSpan.FromMilliseconds(-1)); return tcs.Task.ContinueWith(_ => { timer.Dispose(); }, TaskContinuationOptions.ExecuteSynchronously); #endif } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Action func) { try { func(); return Empty; } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Action func, T1 arg) { try { func(arg); return Empty; } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Action func, T1 arg1, T2 arg2) { try { func(arg1, arg2); return Empty; } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func) { try { return func(); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func> func) { try { return func(); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func) { try { return FromResult(func()); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg) { try { return func(arg); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg1, T2 arg2) { try { return func(arg1, arg2); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func> func, T1 arg) { try { return func(arg); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg) { try { return FromResult(func(arg)); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func> func, T1 arg1, T2 arg2) { try { return func(arg1, arg2); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] public static Task FromMethod(Func func, T1 arg1, T2 arg2) { try { return FromResult(func(arg1, arg2)); } catch (Exception ex) { return FromError(ex); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] public static Task FromResult(T value) { var tcs = new TaskCompletionSource(); tcs.SetResult(value); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static Task FromError(Exception e) { return FromError(e); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static Task FromError(Exception e) { var tcs = new TaskCompletionSource(); tcs.SetUnwrappedException(e); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static void SetUnwrappedException(this TaskCompletionSource tcs, Exception e) { var aggregateException = e as AggregateException; if (aggregateException != null) { tcs.SetException(aggregateException.InnerExceptions); } else { tcs.SetException(e); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] internal static bool TrySetUnwrappedException(this TaskCompletionSource tcs, Exception e) { var aggregateException = e as AggregateException; if (aggregateException != null) { return tcs.TrySetException(aggregateException.InnerExceptions); } else { return tcs.TrySetException(e); } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static Task Canceled() { var tcs = new TaskCompletionSource(); tcs.SetCanceled(); return tcs.Task; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static Task Canceled() { var tcs = new TaskCompletionSource(); tcs.SetCanceled(); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] private static Task RunTask(Task task, Action successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } else { try { successor(); tcs.SetResult(null); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "This is a shared file")] private static Task RunTaskSynchronously(Task task, Action next, object state, bool onlyOnSuccess = true) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { try { if (t.IsFaulted) { if (!onlyOnSuccess) { next(state); } tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { if (!onlyOnSuccess) { next(state); } tcs.SetCanceled(); } else { next(state); tcs.SetResult(null); } } catch (Exception ex) { tcs.SetUnwrappedException(ex); } }, TaskContinuationOptions.ExecuteSynchronously); return tcs.Task; } private static class TaskRunners { [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] internal static Task RunTask(Task task, Action successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } else { try { successor(t.Result); tcs.SetResult(null); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] internal static Task RunTask(Task task, Func successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (t.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (t.IsCanceled) { tcs.SetCanceled(); } else { try { tcs.SetResult(successor()); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions are set in a tcs")] internal static Task RunTask(Task task, Func, TResult> successor) { var tcs = new TaskCompletionSource(); task.ContinueWith(t => { if (task.IsFaulted) { tcs.SetUnwrappedException(t.Exception); } else if (task.IsCanceled) { tcs.SetCanceled(); } else { try { tcs.SetResult(successor(t)); } catch (Exception ex) { tcs.SetUnwrappedException(ex); } } }); return tcs.Task; } } private static class GenericDelegates { internal static Task ThenWithArgs(Task task, Action successor, T1 arg1) { return RunTask(task, () => successor(arg1)); } internal static Task ThenWithArgs(Task task, Action successor, T1 arg1, T2 arg2) { return RunTask(task, () => successor(arg1, arg2)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1) { return TaskRunners.RunTask(task, () => successor(arg1)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1, T2 arg2) { return TaskRunners.RunTask(task, () => successor(arg1, arg2)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1) { return TaskRunners.RunTask(task, t => successor(t.Result, arg1)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1) { return TaskRunners.RunTask(task, () => successor(arg1)); } internal static Task ThenWithArgs(Task task, Func successor, T1 arg1, T2 arg2) { return TaskRunners.RunTask(task, () => successor(arg1, arg2)); } internal static Task> ThenWithArgs(Task task, Func> successor, T1 arg1) { return TaskRunners>.RunTask(task, t => successor(t.Result, arg1)); } internal static Task> ThenWithArgs(Task task, Func, T1, Task> successor, T1 arg1) { return TaskRunners>.RunTask(task, t => successor(t, arg1)); } } private static class TaskCache { public static Task Empty = MakeTask(default(T)); } } } smuxi-1.1/lib/osx/0000775000175000017500000000000014011526500014671 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/osx/Info.plist.in0000644000175000017500000000200012250426634017246 0ustar00meebeymeebey00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable smuxi CFBundleIconFile smuxi.icns CFBundleIdentifier org.smuxi CFBundleInfoDictionaryVersion 6.0 CFBundleName Smuxi CFBundlePackageType APPL CFBundleShortVersionString @VERSION@ CFBundleSignature smxi CFBundleVersion @VERSION@ NSAppleScriptEnabled NO CFBundleURLTypes CFBundleURLName IRC CFBundleURLSchemes irc smuxi-1.1/lib/ServiceStack/0000775000175000017500000000000014011526500016446 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/0000775000175000017500000000000014011526500017235 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/0000755000175000017500000000000012652476423023071 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Reflection/0000755000175000017500000000000012146506550025154 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Reflection/StaticAccessors.cs0000644000175000017500000001460512146506550030606 0ustar00meebeymeebey00000000000000using System; using System.Reflection; namespace ServiceStack.Common.Reflection { #if MONOTOUCH || SILVERLIGHT public static class StaticAccessors { } #else using System.Linq.Expressions; public static class StaticAccessors { public static Func GetValueGetter(Type type, PropertyInfo propertyInfo) { if (type != propertyInfo.DeclaringType) { throw new ArgumentException(); } var instance = Expression.Parameter(typeof(object), "i"); var convertInstance = Expression.TypeAs(instance, propertyInfo.DeclaringType); var property = Expression.Property(convertInstance, propertyInfo); var convertProperty = Expression.TypeAs(property, typeof(object)); return Expression.Lambda>(convertProperty, instance).Compile(); } public static Func GetValueGetter(this PropertyInfo propertyInfo) { if (typeof(T) != propertyInfo.DeclaringType) { throw new ArgumentException(); } var instance = Expression.Parameter(propertyInfo.DeclaringType, "i"); var property = Expression.Property(instance, propertyInfo); var convert = Expression.TypeAs(property, typeof(object)); return Expression.Lambda>(convert, instance).Compile(); } public static Action GetValueSetter(this PropertyInfo propertyInfo) { if (typeof(T) != propertyInfo.DeclaringType) { throw new ArgumentException(); } var instance = Expression.Parameter(propertyInfo.DeclaringType, "i"); var argument = Expression.Parameter(typeof(object), "a"); var setterCall = Expression.Call( instance, propertyInfo.GetSetMethod(), Expression.Convert(argument, propertyInfo.PropertyType)); return Expression.Lambda> ( setterCall, instance, argument ).Compile(); } } #endif public static class StaticAccessors { /// /// Func to get the Strongly-typed field /// public static Func TypedGetPropertyFn(PropertyInfo pi) { var mi = pi.GetGetMethod(); return (Func)Delegate.CreateDelegate(typeof(Func), mi); } /// /// Required to cast the return ValueType to an object for caching /// public static Func ValueUnTypedGetPropertyFn(PropertyInfo pi) { var typedPropertyFn = TypedGetPropertyFn(pi); return x => typedPropertyFn(x); } public static Func ValueUnTypedGetPropertyTypeFn(PropertyInfo pi) { var mi = typeof(StaticAccessors).GetMethod("TypedGetPropertyFn"); var genericMi = mi.MakeGenericMethod(pi.PropertyType); var typedGetPropertyFn = (Delegate)genericMi.Invoke(null, new[] { pi }); #if MONOTOUCH || SILVERLIGHT return x => typedGetPropertyFn.Method.Invoke(x, new object[] { }); #else var typedMi = typedGetPropertyFn.Method; var paramFunc = Expression.Parameter(typeof(object), "oFunc"); var expr = Expression.Lambda> ( Expression.Convert( Expression.Call( Expression.Convert(paramFunc, typedMi.DeclaringType), typedMi ), typeof(object) ), paramFunc ); return expr.Compile(); #endif } public static Func UnTypedGetPropertyFn(PropertyInfo pi) { var typedPropertyFn = TypedGetPropertyFn(pi); return x => typedPropertyFn((TEntity)x); } /// /// Func to set the Strongly-typed field /// public static Action TypedSetPropertyFn(PropertyInfo pi) { var mi = pi.GetSetMethod(); return (Action)Delegate.CreateDelegate(typeof(Action), mi); } /// /// Required to cast the ValueType to an object for caching /// public static Action ValueUnTypedSetPropertyFn(PropertyInfo pi) { var typedPropertyFn = TypedSetPropertyFn(pi); return (x, y) => typedPropertyFn(x, (TId)y); } public static Action ValueUnTypedSetPropertyTypeFn(PropertyInfo pi) { var mi = typeof(StaticAccessors).GetMethod("TypedSetPropertyFn"); var genericMi = mi.MakeGenericMethod(pi.PropertyType); var typedSetPropertyFn = (Delegate)genericMi.Invoke(null, new[] { pi }); #if MONOTOUCH || SILVERLIGHT return (x, y) => typedSetPropertyFn.Method.Invoke(x, new[] { y }); #else var typedMi = typedSetPropertyFn.Method; var paramFunc = Expression.Parameter(typeof(object), "oFunc"); var paramValue = Expression.Parameter(typeof(object), "oValue"); var expr = Expression.Lambda>( Expression.Call( Expression.Convert(paramFunc, typedMi.DeclaringType), typedMi, Expression.Convert(paramValue, pi.PropertyType) ), paramFunc, paramValue ); return expr.Compile(); #endif } /// /// Required to cast the ValueType to an object for caching /// public static Action UnTypedSetPropertyFn(PropertyInfo pi) { var typedPropertyFn = TypedSetPropertyFn(pi); return (x, y) => typedPropertyFn((TEntity)x, (TId)y); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Reflection/PropertyAccessor.cs0000644000175000017500000000744012146506550031017 0ustar00meebeymeebey00000000000000using System; using System.Reflection; namespace ServiceStack.Common.Reflection { public static class PropertyAccessor { public static Func GetPropertyFn(string propertyName) { return new PropertyAccessor(propertyName).GetPropertyFn(); } //public static Func GetPropertyFnByType(Type type, string propertyName) //{ // var mi = typeof(PropertyAccessor).GetMethod("GetPropertyFn"); // var genericMi = mi.MakeGenericMethod(type); // var getPropertyFn = genericMi.Invoke(null, new object[] { propertyName }); // return (Func)getPropertyFn; //} public static Action SetPropertyFn(string propertyName) { return new PropertyAccessor(propertyName).SetPropertyFn(); } //public static Action SetPropertyFnByType(Type type, string propertyName) //{ // var mi = typeof(PropertyAccessor).GetMethod("SetPropertyFn"); // var genericMi = mi.MakeGenericMethod(type); // var setPropertyFn = genericMi.Invoke(null, new object[] { propertyName }); // return (Action)setPropertyFn; //} } public class PropertyAccessor { readonly PropertyInfo pi; public string Name { get; set; } public Type PropertyType { get; set; } private readonly Func getPropertyFn; private readonly Action setPropertyFn; public PropertyAccessor(string propertyName) { this.pi = typeof(TEntity).GetProperty(propertyName); this.Name = propertyName; this.PropertyType = pi.PropertyType; getPropertyFn = StaticAccessors.ValueUnTypedGetPropertyTypeFn(pi); setPropertyFn = StaticAccessors.ValueUnTypedSetPropertyTypeFn(pi); } public Func GetPropertyFn() { return getPropertyFn; } public Action SetPropertyFn() { return setPropertyFn; } /// /// Func to get the Strongly-typed field /// public Func TypedGetPropertyFn() { return StaticAccessors.TypedGetPropertyFn(pi); } /// /// Required to cast the return ValueType to an object for caching /// public Func ValueTypedGetPropertyFn() { return StaticAccessors.ValueUnTypedGetPropertyFn(pi); } public Func UnTypedGetPropertyFn() { return StaticAccessors.UnTypedGetPropertyFn(pi); } /// /// Func to set the Strongly-typed field /// public Action TypedSetPropertyFn() { return StaticAccessors.TypedSetPropertyFn(pi); } /// /// Required to cast the ValueType to an object for caching /// public Action ValueTypesSetPropertyFn() { return StaticAccessors.ValueUnTypedSetPropertyFn(pi); } /// /// Required to cast the ValueType to an object for caching /// public Action UnTypedSetPropertyFn() { return StaticAccessors.UnTypedSetPropertyFn(pi); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceStack.Common.csproj.user0000644000175000017500000000076112146506550031102 0ustar00meebeymeebey00000000000000 en-US false ProjectFiles smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/0000755000175000017500000000000012146506550024162 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/ReflectionUtils.cs0000644000175000017500000003711412146506550027632 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Reflection.Emit; using ServiceStack.Common.Support; using ServiceStack.Logging; using ServiceStack.Net30.Collections.Concurrent; namespace ServiceStack.Common.Utils { public class ReflectionUtils { public static readonly ILog Log = LogManager.GetLogger(typeof(ReflectionUtils)); /// /// Populate an object with Example data. /// /// /// public static object PopulateObject(object obj) { if (obj == null) return null; return PopulateObjectInternal(obj, new Dictionary(20)); } /// /// Populates the object with example data. /// /// /// Tracks how deeply nested we are /// private static object PopulateObjectInternal(object obj, Dictionary recursionInfo) { if (obj == null) return null; if (obj is string) return obj; // prevents it from dropping into the char[] Chars property. Sheesh var members = obj.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance); foreach (var info in members) { var fieldInfo = info as FieldInfo; var propertyInfo = info as PropertyInfo; if (fieldInfo != null || propertyInfo != null) { var memberType = fieldInfo != null ? fieldInfo.FieldType : propertyInfo.PropertyType; var value = CreateDefaultValue(memberType, recursionInfo); SetValue(fieldInfo, propertyInfo, obj, value); } } return obj; } private static readonly Dictionary DefaultValueTypes = new Dictionary(); public static object GetDefaultValue(Type type) { if (!type.IsValueType) return null; object defaultValue; lock (DefaultValueTypes) { if (!DefaultValueTypes.TryGetValue(type, out defaultValue)) { defaultValue = Activator.CreateInstance(type); DefaultValueTypes[type] = defaultValue; } } return defaultValue; } private static readonly ConcurrentDictionary AssignmentDefinitionCache = new ConcurrentDictionary(); public static AssignmentDefinition GetAssignmentDefinition(Type toType, Type fromType) { var cacheKey = toType.FullName + "<" + fromType.FullName; return AssignmentDefinitionCache.GetOrAdd(cacheKey, delegate { var definition = new AssignmentDefinition { ToType = toType, FromType = fromType, }; var members = fromType.GetMembers(BindingFlags.Public | BindingFlags.Instance); foreach (var info in members) { var fromPropertyInfo = info as PropertyInfo; if (fromPropertyInfo != null) { var toPropertyInfo = GetPropertyInfo(toType, fromPropertyInfo.Name); if (toPropertyInfo == null) continue; if (!fromPropertyInfo.CanRead) continue; if (!toPropertyInfo.CanWrite) continue; definition.AddMatch(fromPropertyInfo, toPropertyInfo); } var fromFieldInfo = info as FieldInfo; if (fromFieldInfo != null) { var toFieldInfo = GetFieldInfo(toType, fromFieldInfo.Name); if (toFieldInfo == null) continue; definition.AddMatch(fromFieldInfo, toFieldInfo); } } return definition; }); } public static To PopulateObject(To to, From from) { if (Equals(to, default(To)) || Equals(from, default(From))) return default(To); var assignmentDefinition = GetAssignmentDefinition(to.GetType(), from.GetType()); assignmentDefinition.Populate(to, from); return to; } public static To PopulateWithNonDefaultValues(To to, From from) { if (Equals(to, default(To)) || Equals(from, default(From))) return default(To); var assignmentDefinition = GetAssignmentDefinition(to.GetType(), from.GetType()); assignmentDefinition.PopulateWithNonDefaultValues(to, from); return to; } public static To PopulateFromPropertiesWithAttribute(To to, From from, Type attributeType) { if (Equals(to, default(To)) || Equals(from, default(From))) return default(To); var assignmentDefinition = GetAssignmentDefinition(to.GetType(), from.GetType()); assignmentDefinition.PopulateFromPropertiesWithAttribute(to, from, attributeType); return to; } public static void SetProperty(object obj, PropertyInfo propertyInfo, object value) { if (!propertyInfo.CanWrite) { Log.WarnFormat("Attempted to set read only property '{0}'", propertyInfo.Name); return; } var propertySetMetodInfo = propertyInfo.GetSetMethod(); if (propertySetMetodInfo != null) { propertySetMetodInfo.Invoke(obj, new[] { value }); } } public static object GetProperty(object obj, PropertyInfo propertyInfo) { if (propertyInfo == null || !propertyInfo.CanRead) return null; var getMethod = propertyInfo.GetGetMethod(); return getMethod != null ? getMethod.Invoke(obj, new object[0]) : null; } public static void SetValue(FieldInfo fieldInfo, PropertyInfo propertyInfo, object obj, object value) { try { if (IsUnsettableValue(fieldInfo, propertyInfo)) return; if (fieldInfo != null && !fieldInfo.IsLiteral) { fieldInfo.SetValue(obj, value); } else { SetProperty(obj, propertyInfo, value); } } catch (Exception ex) { var name = (fieldInfo != null) ? fieldInfo.Name : propertyInfo.Name; Log.DebugFormat("Could not set member: {0}. Error: {1}", name, ex.Message); } } public static bool IsUnsettableValue(FieldInfo fieldInfo, PropertyInfo propertyInfo) { if (propertyInfo != null && propertyInfo.ReflectedType != null) { // Properties on non-user defined classes should not be set // Currently we define those properties as properties declared on // types defined in mscorlib if (propertyInfo.DeclaringType.Assembly == typeof(object).Assembly) { return true; } } return false; } public static object[] CreateDefaultValues(IEnumerable types, Dictionary recursionInfo) { var values = new List(); foreach (var type in types) { values.Add(CreateDefaultValue(type, recursionInfo)); } return values.ToArray(); } private const int MaxRecursionLevelForDefaultValues = 2; // do not nest a single type more than this deep. public static object CreateDefaultValue(Type type, Dictionary recursionInfo) { if (type == typeof(string)) { return type.Name; } if (type.IsEnum) { #if SILVERLIGHT4 return Enum.ToObject(type, 0); #else return Enum.GetValues(type).GetValue(0); #endif } // If we have hit our recursion limit for this type, then return null int recurseLevel; // will get set to 0 if TryGetValue() fails recursionInfo.TryGetValue(type, out recurseLevel); if (recurseLevel > MaxRecursionLevelForDefaultValues) return null; recursionInfo[type] = recurseLevel + 1; // increase recursion level for this type try // use a try/finally block to make sure we decrease the recursion level for this type no matter which code path we take, { //when using KeyValuePair, TKey must be non-default to stuff in a Dictionary if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)) { var genericTypes = type.GetGenericArguments(); var valueType = Activator.CreateInstance(type, CreateDefaultValue(genericTypes[0], recursionInfo), CreateDefaultValue(genericTypes[1], recursionInfo)); return PopulateObjectInternal(valueType, recursionInfo); } if (type.IsValueType) { return Activator.CreateInstance(type); } if (type.IsArray) { return PopulateArray(type, recursionInfo); } var constructorInfo = type.GetConstructor(Type.EmptyTypes); var hasEmptyConstructor = constructorInfo != null; if (hasEmptyConstructor) { var value = constructorInfo.Invoke(new object[0]); #if !SILVERLIGHT && !MONOTOUCH && !XBOX Type[] interfaces = type.FindInterfaces((t, critera) => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(ICollection<>) , null); bool isGenericCollection = interfaces.Length > 0; if (isGenericCollection) { SetGenericCollection(interfaces[0], value, recursionInfo); } #endif //when the object might have nested properties such as enums with non-0 values, etc return PopulateObjectInternal(value, recursionInfo); } return null; } finally { recursionInfo[type] = recurseLevel; } } public static void SetGenericCollection(Type realisedListType, object genericObj, Dictionary recursionInfo) { var args = realisedListType.GetGenericArguments(); if (args.Length != 1) { Log.ErrorFormat("Found a generic list that does not take one generic argument: {0}", realisedListType); return; } var methodInfo = realisedListType.GetMethod("Add"); if (methodInfo != null) { var argValues = CreateDefaultValues(args, recursionInfo); methodInfo.Invoke(genericObj, argValues); } } public static Array PopulateArray(Type type, Dictionary recursionInfo) { var elementType = type.GetElementType(); var objArray = Array.CreateInstance(elementType, 1); var objElementType = CreateDefaultValue(elementType, recursionInfo); objArray.SetValue(objElementType, 0); return objArray; } //TODO: replace with InAssignableFrom public static bool CanCast(Type toType, Type fromType) { if (toType.IsInterface) { var interfaceList = fromType.GetInterfaces().ToList(); if (interfaceList.Contains(toType)) return true; } else { Type baseType = fromType; bool areSameTypes; do { areSameTypes = baseType == toType; } while (!areSameTypes && (baseType = fromType.BaseType) != null); if (areSameTypes) return true; } return false; } public static MemberInfo GetMemberInfo(Type fromType, string memberName) { var baseType = fromType; do { var members = baseType.GetMembers(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (var memberInfo in members) { if (memberInfo.Name == memberName) return memberInfo; } } while ((baseType = baseType.BaseType) != null); return null; } public static FieldInfo GetFieldInfo(Type fromType, string fieldName) { var baseType = fromType; do { var fieldInfos = baseType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (var fieldInfo in fieldInfos) { if (fieldInfo.Name == fieldName) return fieldInfo; } } while ((baseType = baseType.BaseType) != null); return null; } public static PropertyInfo GetPropertyInfo(Type fromType, string propertyName) { var baseType = fromType; do { var propertyInfos = baseType.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (var propertyInfo in propertyInfos) { if (propertyInfo.Name == propertyName) return propertyInfo; } } while ((baseType = baseType.BaseType) != null); return null; } public static IEnumerable> GetPropertyAttributes(Type fromType) where T : Attribute { var attributeType = typeof(T); var baseType = fromType; do { var propertyInfos = baseType.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (var propertyInfo in propertyInfos) { var attributes = propertyInfo.GetCustomAttributes(attributeType, true); foreach (T attribute in attributes) { yield return new KeyValuePair(propertyInfo, attribute); } } } while ((baseType = baseType.BaseType) != null); } public static object CreateInstance(Type type) { return Text.ReflectionExtensions.CreateInstance(type); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/CommandsUtils.cs0000644000175000017500000000724612146506550027304 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Threading; using ServiceStack.Common.Support; using ServiceStack.DesignPatterns.Command; namespace ServiceStack.Common.Utils { public class CommandsUtils { public static List ExecuteAsyncCommandList(TimeSpan timeout, params ICommandList[] commands) { return ExecuteAsyncCommandList(timeout, commands); } public static List ExecuteAsyncCommandList(TimeSpan timeout, IEnumerable> commands) { var results = new List(); var waitHandles = new List(); foreach (ICommandList command in commands) { var waitHandle = new AutoResetEvent(false); waitHandles.Add(waitHandle); var commandResultsHandler = new CommandResultsHandler(results, command, waitHandle); ThreadPool.QueueUserWorkItem(ExecuteCommandList, commandResultsHandler); } WaitAll(waitHandles.ToArray(), timeout); return results; } public static void WaitAll(WaitHandle[] waitHandles, TimeSpan timeout) { // throws an exception if there are no wait handles if (waitHandles != null && waitHandles.Length > 0) { #if !SILVERLIGHT && !MONOTOUCH && !XBOX if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA) { // WaitAll for multiple handles on an STA thread is not supported. // CurrentThread is ApartmentState.STA when run under unit tests foreach (WaitHandle waitHandle in waitHandles) { waitHandle.WaitOne(timeout, false); } } else { if (!WaitHandle.WaitAll(waitHandles, timeout, false)) { throw new TimeoutException(); } } #else if (!WaitHandle.WaitAll(waitHandles, timeout)) { throw new TimeoutException(); } #endif } } private static void ExecuteCommandList(object state) { var handler = (ICommandExec)state; handler.Execute(); } private static void ExecuteCommandExec(object state) { var command = (ICommandExec)state; command.Execute(); } public static void ExecuteAsyncCommandExec(TimeSpan timeout, IEnumerable commands) { foreach (ICommandExec command in commands) { ThreadPool.QueueUserWorkItem(ExecuteCommandExec, command); } } /// /// Provide the an option for the callee to block until all commands are executed /// /// /// public static List ExecuteAsyncCommandExec(IEnumerable commands) { var waitHandles = new List(); foreach (var command in commands) { var waitHandle = new AutoResetEvent(false); waitHandles.Add(waitHandle); var commandExecsHandler = new CommandExecsHandler(command, waitHandle); ThreadPool.QueueUserWorkItem(ExecuteCommandList, commandExecsHandler); } return waitHandles; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/AssertUtils.cs0000644000175000017500000000212312146506550026771 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Common.Utils { public static class AssertUtils { public static void AreNotNull(params T[] fields) where T : class { foreach (var field in fields) { if (field == null) { throw new ArgumentNullException(typeof(T).Name); } } } /// /// Asserts that the supplied arguments are not null. /// /// AssertUtils.AreNotNull(new Dictionary{ {"name",null} }); /// will throw new ArgumentNullException("name"); /// /// The field map. public static void AreNotNull(IDictionary fieldMap) { foreach (var pair in fieldMap) { if (pair.Value == null) { throw new ArgumentNullException(pair.Key); } } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/IdUtils.cs0000644000175000017500000001102612146506550026066 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.Common.Reflection; using ServiceStack.DesignPatterns.Model; namespace ServiceStack.Common.Utils { public static class IdUtils { internal static Func CanGetId; static IdUtils() { #if !SILVERLIGHT && !MONOTOUCH && !XBOX var hasIdInterfaces = typeof(T).FindInterfaces( (t, critera) => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IHasId<>), null); if (hasIdInterfaces.Length > 0) { CanGetId = HasId.GetId; return; } #endif if (typeof(T).IsClass && typeof(T).GetProperty(IdUtils.IdField) != null && typeof(T).GetProperty(IdUtils.IdField).GetGetMethod() != null) { CanGetId = HasPropertyId.GetId; } else { CanGetId = x => x.GetHashCode(); } } public static object GetId(T entity) { return CanGetId(entity); } } internal static class HasPropertyId { private static readonly Func GetIdFn; static HasPropertyId() { var pi = typeof(TEntity).GetProperty(IdUtils.IdField); GetIdFn = StaticAccessors.ValueUnTypedGetPropertyTypeFn(pi); } public static object GetId(TEntity entity) { return GetIdFn(entity); } } internal static class HasId { private static readonly Func GetIdFn; static HasId() { #if MONOTOUCH || SILVERLIGHT GetIdFn = HasPropertyId.GetId; #else var hasIdInterfaces = typeof(TEntity).FindInterfaces( (t, critera) => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IHasId<>), null); var genericArg = hasIdInterfaces[0].GetGenericArguments()[0]; var genericType = typeof(HasIdGetter<,>).MakeGenericType(typeof(TEntity), genericArg); var oInstanceParam = System.Linq.Expressions.Expression.Parameter(typeof(TEntity), "oInstanceParam"); var exprCallStaticMethod = System.Linq.Expressions.Expression.Call ( genericType, "GetId", new Type[0], oInstanceParam ); GetIdFn = System.Linq.Expressions.Expression.Lambda> ( exprCallStaticMethod, oInstanceParam ).Compile(); #endif } public static object GetId(TEntity entity) { return GetIdFn(entity); } } internal class HasIdGetter where TEntity : IHasId { public static object GetId(TEntity entity) { return entity.Id; } } public static class IdUtils { public const string IdField = "Id"; public static object GetObjectId(this object entity) { return entity.GetType().GetProperty(IdField).GetGetMethod().Invoke(entity, new object[0]); } public static object GetId(this T entity) { return IdUtils.GetId(entity); } public static string CreateUrn(object id) { return string.Format("urn:{0}:{1}", typeof(T).Name.ToLower(), id); } public static string CreateUrn(Type type, object id) { return string.Format("urn:{0}:{1}", type.Name.ToLower(), id); } public static string CreateUrn(this T entity) { var id = GetId(entity); return string.Format("urn:{0}:{1}", typeof(T).Name.ToLower(), id); } public static string CreateCacheKeyPath(string idValue) { if (idValue.Length < 4) { idValue = idValue.PadLeft(4, '0'); } idValue = idValue.Replace(" ", "-"); var rootDir = typeof(T).Name; var dir1 = idValue.Substring(0, 2); var dir2 = idValue.Substring(2, 2); var path = string.Format("{1}{0}{2}{0}{3}{0}{4}", Path.DirectorySeparatorChar, rootDir, dir1, dir2, idValue); return path; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/FuncUtils.cs0000644000175000017500000000237312146506550026432 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Logging; namespace ServiceStack.Common.Utils { public static class FuncUtils { private static readonly ILog Log = LogManager.GetLogger(typeof(FuncUtils)); /// /// Invokes the action provided and returns true if no excpetion was thrown. /// Otherwise logs the exception and returns false if an exception was thrown. /// /// The action. /// public static bool TryExec(Action action) { try { action(); return true; } catch (Exception ex) { Log.Error(ex.Message, ex); } return false; } public static T TryExec(Func func) { return TryExec(func, default(T)); } public static T TryExec(Func func, T defaultValue) { try { return func(); } catch (Exception ex) { Log.Error(ex.Message, ex); } return default(T); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/PathUtils.cs0000644000175000017500000000620012146506550026424 0ustar00meebeymeebey00000000000000using System; using System.IO; using System.Text; namespace ServiceStack.Common.Utils { public static class PathUtils { public static string MapAbsolutePath(string relativePath, string appendPartialPathModifier) { #if !SILVERLIGHT if (relativePath.StartsWith("~")) { var assemblyDirectoryPath = Path.GetDirectoryName(new Uri(typeof(PathUtils).Assembly.EscapedCodeBase).LocalPath); // Escape the assembly bin directory to the hostname directory var hostDirectoryPath = appendPartialPathModifier != null ? assemblyDirectoryPath + appendPartialPathModifier : assemblyDirectoryPath; return Path.GetFullPath(relativePath.Replace("~", hostDirectoryPath)); } #endif return relativePath; } /// /// Maps the path of a file in the context of a VS project /// /// the relative path /// the absolute path /// Assumes static content is two directories above the /bin/ directory, /// eg. in a unit test scenario the assembly would be in /bin/Debug/. public static string MapProjectPath(this string relativePath) { var mapPath = MapAbsolutePath(relativePath, string.Format("{0}..{0}..", Path.DirectorySeparatorChar)); return mapPath; } /// /// Maps the path of a file in a self-hosted scenario /// /// the relative path /// the absolute path /// Assumes static content is copied to /bin/ folder with the assemblies public static string MapAbsolutePath(this string relativePath) { var mapPath = MapAbsolutePath(relativePath, null); return mapPath; } /// /// Maps the path of a file in an Asp.Net hosted scenario /// /// the relative path /// the absolute path /// Assumes static content is in the parent folder of the /bin/ directory public static string MapHostAbsolutePath(this string relativePath) { var mapPath = MapAbsolutePath(relativePath, string.Format("{0}..", Path.DirectorySeparatorChar)); return mapPath; } internal static string CombinePaths(StringBuilder sb, params string[] paths) { foreach (var path in paths) { if (sb.Length > 0) sb.Append("/"); sb.Append(path.TrimStart('/', '\\')); } return sb.ToString(); } public static string CombinePaths(params string[] paths) { return CombinePaths(new StringBuilder(), paths); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Utils/PerfUtils.cs0000644000175000017500000000132012146506550026422 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.Diagnostics; namespace ServiceStack.Common.Utils { public static class PerfUtils { public static TimeSpan ToTimeSpan(this long fromTicks) { return TimeSpan.FromSeconds(fromTicks * 1d / Stopwatch.Frequency); } public static long Measure(long iterations, Action action) { GC.Collect(); var begin = Stopwatch.GetTimestamp(); for (var i = 0; i < iterations; i++) { action(); } var end = Stopwatch.GetTimestamp(); return (end - begin); } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/RequestContextExtensions.cs0000644000175000017500000000203512146506550030466 0ustar00meebeymeebey00000000000000using ServiceStack.ServiceHost; namespace ServiceStack.Common { public static class RequestContextExtensions { /// /// Store an entry in the IHttpRequest.Items Dictionary /// public static void SetItem(this IRequestContext requestContext, string key, object value) { if (requestContext == null) return; var httpReq = requestContext.Get(); if (httpReq != null) httpReq.Items[key] = value; } /// /// Get an entry from the IHttpRequest.Items Dictionary /// public static object GetItem(this IRequestContext requestContext, string key) { if (requestContext == null) return null; object value = null; var httpReq = requestContext.Get(); if (httpReq != null) httpReq.Items.TryGetValue(key, out value); return value; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/TypeExtensions.cs0000644000175000017500000000240712146506550026415 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Reflection; namespace ServiceStack.Common { public static class TypeExtensions { private static readonly Dictionary> TypePropertyNamesMap = new Dictionary>(); public static List GetPropertyNames(this Type type) { lock (TypePropertyNamesMap) { List propertyNames; if (!TypePropertyNamesMap.TryGetValue(type, out propertyNames)) { propertyNames = Extensions.EnumerableExtensions.ConvertAll(type.GetProperties(), x => x.Name); TypePropertyNamesMap[type] = propertyNames; } return propertyNames; } } public static List ToAttributes(this Type type) where T : Attribute { return type.GetCustomAttributes(typeof(T), true).SafeConvertAll(x => (T)x); } #if !SILVERLIGHT public static string GetAssemblyPath(this Type source) { var assemblyUri = new Uri(source.Assembly.EscapedCodeBase); return assemblyUri.LocalPath; } #endif } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ReflectionExtensions.cs0000644000175000017500000001640612146506550027572 0ustar00meebeymeebey00000000000000using System; using System.Diagnostics; using System.Linq; using System.Reflection; using ServiceStack.Common.Utils; namespace ServiceStack.Common { public static class ReflectionExtensions { public static To PopulateWith(this To to, From from) { return ReflectionUtils.PopulateObject(to, from); } public static To PopulateWithNonDefaultValues(this To to, From from) { return ReflectionUtils.PopulateWithNonDefaultValues(to, from); } public static To PopulateFromPropertiesWithAttribute(this To to, From from) { return ReflectionUtils.PopulateFromPropertiesWithAttribute(to, from, typeof(TAttr)); } public static T TranslateTo(this object from) where T : new() { var to = new T(); return to.PopulateWith(from); } public static TAttribute FirstAttribute(this Type type) { return type.FirstAttribute(true); } public static TAttribute FirstAttribute(this Type type, bool inherit) { var attrs = type.GetCustomAttributes(typeof(TAttribute), inherit); return (TAttribute)(attrs.Length > 0 ? attrs[0] : null); } public static TAttribute FirstAttribute(this PropertyInfo propertyInfo) { return propertyInfo.FirstAttribute(true); } public static TAttribute FirstAttribute(this PropertyInfo propertyInfo, bool inherit) { var attrs = propertyInfo.GetCustomAttributes(typeof(TAttribute), inherit); return (TAttribute)(attrs.Length > 0 ? attrs[0] : null); } public static bool IsGenericType(this Type type) { while (type != null) { if (type.IsGenericType) return true; type = type.BaseType; } return false; } public static Type FirstGenericTypeDefinition(this Type type) { while (type != null) { if (type.IsGenericType) return type.GetGenericTypeDefinition(); type = type.BaseType; } return null; } public static bool IsDynamic(this Assembly assembly) { #if MONOTOUCH return false; #else try { var isDyanmic = assembly is System.Reflection.Emit.AssemblyBuilder || string.IsNullOrEmpty(assembly.Location); return isDyanmic; } catch (NotSupportedException) { //Ignore assembly.Location not supported in a dynamic assembly. return true; } #endif } public static bool IsDebugBuild(this Assembly assembly) { return assembly.GetCustomAttributes(false) .OfType() .Select(attr => attr.IsJITTrackingEnabled) .FirstOrDefault(); } } } #if FALSE && DOTNET35 //Efficient POCO Translator from: http://www.yoda.arachsys.com/csharp/miscutil/ using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; namespace MiscUtil.Reflection { /// /// Generic class which copies to its target type from a source /// type specified in the Copy method. The types are specified /// separately to take advantage of type inference on generic /// method arguments. /// public static class PropertyCopy where TTarget : class, new() { /// /// Copies all readable properties from the source to a new instance /// of TTarget. /// public static TTarget CopyFrom(TSource source) where TSource : class { return PropertyCopier.Copy(source); } /// /// Static class to efficiently store the compiled delegate which can /// do the copying. We need a bit of work to ensure that exceptions are /// appropriately propagated, as the exception is generated at type initialization /// time, but we wish it to be thrown as an ArgumentException. /// private static class PropertyCopier where TSource : class { private static readonly Func copier; private static readonly Exception initializationException; internal static TTarget Copy(TSource source) { if (initializationException != null) { throw initializationException; } if (source == null) { throw new ArgumentNullException("source"); } return copier(source); } static PropertyCopier() { try { copier = BuildCopier(); initializationException = null; } catch (Exception e) { copier = null; initializationException = e; } } private static Func BuildCopier() { ParameterExpression sourceParameter = Expression.Parameter(typeof(TSource), "source"); var bindings = new List(); foreach (PropertyInfo sourceProperty in typeof(TSource).GetProperties()) { if (!sourceProperty.CanRead) { continue; } PropertyInfo targetProperty = typeof(TTarget).GetProperty(sourceProperty.Name); if (targetProperty == null) { throw new ArgumentException("Property " + sourceProperty.Name + " is not present and accessible in " + typeof(TTarget).FullName); } if (!targetProperty.CanWrite) { throw new ArgumentException("Property " + sourceProperty.Name + " is not writable in " + typeof(TTarget).FullName); } if (!targetProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType)) { throw new ArgumentException("Property " + sourceProperty.Name + " has an incompatible type in " + typeof(TTarget).FullName); } bindings.Add(Expression.Bind(targetProperty, Expression.Property(sourceParameter, sourceProperty))); } Expression initializer = Expression.MemberInit(Expression.New(typeof(TTarget)), bindings); return Expression.Lambda>(initializer, sourceParameter).Compile(); } } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/UrnId.cs0000644000175000017500000001071112146506550024432 0ustar00meebeymeebey00000000000000using System; using System.Text; namespace ServiceStack.Common { /// /// Creates a Unified Resource Name (URN) with the following formats: /// /// - urn:{TypeName}:{IdFieldValue} e.g. urn:UserSession:1 /// - urn:{TypeName}:{IdFieldName}:{IdFieldValue} e.g. urn:UserSession:UserId:1 /// /// public class UrnId { private const char FieldSeperator = ':'; private const char FieldPartsSeperator = '/'; public string TypeName { get; private set; } public string IdFieldValue { get; private set; } public string IdFieldName { get; private set; } const int HasNoIdFieldName = 3; const int HasIdFieldName = 4; private UrnId() { } public static UrnId Parse(string urnId) { var urnParts = urnId.Split(FieldSeperator); if (urnParts.Length == HasNoIdFieldName) { return new UrnId { TypeName = urnParts[1], IdFieldValue = urnParts[2] }; } if (urnParts.Length == HasIdFieldName) { return new UrnId { TypeName = urnParts[1], IdFieldName = urnParts[2], IdFieldValue = urnParts[3] }; } throw new ArgumentException("Cannot parse invalid urn: '{0}'", urnId); } public static string Create(string objectTypeName, string idFieldValue) { if (objectTypeName.Contains(FieldSeperator.ToString())) { throw new ArgumentException("objectTypeName cannot have the illegal characters: ':'", "objectTypeName"); } if (idFieldValue.Contains(FieldSeperator.ToString())) { throw new ArgumentException("idFieldValue cannot have the illegal characters: ':'", "idFieldValue"); } return string.Format("urn:{0}:{1}", objectTypeName, idFieldValue); } public static string CreateWithParts(string objectTypeName, params string[] keyParts) { if (objectTypeName.Contains(FieldSeperator.ToString())) { throw new ArgumentException("objectTypeName cannot have the illegal characters: ':'", "objectTypeName"); } var sb = new StringBuilder(); foreach (var keyPart in keyParts) { if (sb.Length > 0) sb.Append(FieldPartsSeperator); sb.Append(keyPart); } return string.Format("urn:{0}:{1}", objectTypeName, sb); } public static string CreateWithParts(params string[] keyParts) { return CreateWithParts(typeof(T).Name, keyParts); } public static string Create(string idFieldValue) { return Create(typeof(T), idFieldValue); } public static string Create(Type objectType, string idFieldValue) { if (idFieldValue.Contains(FieldSeperator.ToString())) { throw new ArgumentException("idFieldValue cannot have the illegal characters: ':'", "idFieldValue"); } return string.Format("urn:{0}:{1}", objectType.Name, idFieldValue); } public static string Create(string idFieldName, string idFieldValue) { return Create(typeof (T), idFieldName, idFieldValue); } public static string Create(Type objectType, string idFieldName, string idFieldValue) { if (idFieldValue.Contains(FieldSeperator.ToString())) { throw new ArgumentException("idFieldValue cannot have the illegal characters: ':'", "idFieldValue"); } if (idFieldName.Contains(FieldSeperator.ToString())) { throw new ArgumentException("idFieldName cannot have the illegal characters: ':'", "idFieldName"); } return string.Format("urn:{0}:{1}:{2}", objectType.Name, idFieldName, idFieldValue); } public static string GetStringId(string urn) { return Parse(urn).IdFieldValue; } public static Guid GetGuidId(string urn) { return new Guid(Parse(urn).IdFieldValue); } public static long GetLongId(string urn) { return long.Parse(Parse(urn).IdFieldValue); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/0000755000175000017500000000000012146506550024777 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/Rcon/0000755000175000017500000000000012146506550025700 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/Rcon/Packet.cs0000644000175000017500000000137612146506550027445 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ServiceStack.Messaging.Rcon { internal class Packet { /// /// True if the packet originated on the server. /// public bool FromServer { get; internal set; } /// /// True if the packet is a response from a sent packet. /// public bool IsResponse { get; internal set; } /// /// Sequence identifier. Unique to the connection. /// public uint Sequence { get; internal set; } /// /// Words. /// public byte[][] Words { get; internal set; } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/Rcon/Client.cs0000644000175000017500000002331012146506550027444 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace ServiceStack.Messaging.Rcon { /// /// Base rcon class. /// public class Client { #region Delegates /// /// Event delegate when disconnected from the server. /// /// public delegate void OnDisconnectedHandler(Client rcon); /// /// Delegate for async callbacks. /// /// /// public delegate void AsyncCallback(Client rcon, byte[] response); #endregion #region Events /// /// Disconnected event. /// public event OnDisconnectedHandler OnDisconnected; #endregion #region Fields /// /// Rcon connection socket. Always set to null when not connected. /// Socket _sock = null; /// /// Unique ID for each message. /// uint _sequenceID = 1; /// /// Registered callbacks. /// Dictionary _registeredCallbacks = new Dictionary(); #endregion #region Methods /// /// Create a new instance of rcon. /// /// Endpoint to connect to, usually the game server with query port. public Client(IPEndPoint rconEndpoint) { Endpoint = rconEndpoint; Connected = false; } /// /// Attempts to connect to the game server for rcon operations. /// /// True if connection established, false otherwise. public virtual bool Connect() { if (Connected) Disconnect(); Connected = false; _sequenceID = 1; try { _sock = new Socket(Endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _sock.Connect(Endpoint); var readEventArgs = new SocketAsyncEventArgs(); var state = new ClientSocketState(); readEventArgs.UserToken = state; readEventArgs.SetBuffer(state.Header, 0, state.Header.Length); readEventArgs.Completed += new EventHandler(readEventArgs_Completed); if (!_sock.ReceiveAsync(readEventArgs)) { ProcessReceive(_sock, readEventArgs); } Connected = true; return true; } catch (Exception ex) { LastException = ex; } Disconnect(); return false; } void readEventArgs_Completed(object sender, SocketAsyncEventArgs e) { ProcessReceive((Socket)sender, e); } void ProcessReceive(Socket readingSock, SocketAsyncEventArgs e) { var userToken = (ClientSocketState)e.UserToken; if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { if (!userToken.ReadHeader) { // if we've filled the buffer we can decode the header if (e.Offset + e.BytesTransferred == userToken.Header.Length) { userToken.ReadHeader = true; userToken.MessageLength = BitConverter.ToUInt32(userToken.Header, 4); userToken.CompleteMessage = new byte[userToken.MessageLength]; for (int i = 0; i < userToken.Header.Length; i++) { userToken.CompleteMessage[i] = userToken.Header[i]; } e.SetBuffer(userToken.CompleteMessage, userToken.Header.Length, userToken.CompleteMessage.Length - userToken.Header.Length); if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } else { if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } } else { if (e.Offset + e.BytesTransferred == userToken.MessageLength) { // copy buffer var fullPacket = userToken.CompleteMessage; // reset state userToken.ReadHeader = false; userToken.MessageLength = 0; // process the message ProcessPacket(fullPacket, userToken); // start listening for more packets e.SetBuffer(userToken.Header, 0, userToken.Header.Length); if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } else { if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } } } else { // socket disconnected Disconnect(); } } /// /// Processes a received packet. /// /// The packet. void ProcessPacket(byte[] packet, ClientSocketState userToken) { var packetObj = PacketCodec.DecodePacket(packet); if (_registeredCallbacks.ContainsKey(packetObj.Sequence)) { var callback = _registeredCallbacks[packetObj.Sequence]; _registeredCallbacks.Remove(packetObj.Sequence); if (packetObj.Words.Length < 3) { callback(this, null); } else { callback(this, packetObj.Words[2]); } } } /// /// Disconnects from rcon. /// public virtual void Disconnect() { Connected = false; _sequenceID = 1; if (_sock != null) { if (OnDisconnected != null) OnDisconnected(this); // these exceptions aren't really anything to worry about try { _sock.Close(); } catch (Exception) { } _sock = null; } } public void Call(T request, AsyncCallback callback) { _registeredCallbacks[_sequenceID] = callback; IMessage message = new Message(request); InternalSend(new byte[][]{ Encoding.UTF8.GetBytes(request.GetType().AssemblyQualifiedName), message.ToBytes() }); } /// /// Sends message to the server. /// /// Words to send. protected virtual void InternalSend(byte[][] words) { if (!Connected) { LastException = new NotConnectedException(); throw LastException; } var packet = PacketCodec.EncodePacket(false, false, _sequenceID++, words); try { var sendEventArgs = new SocketAsyncEventArgs(); sendEventArgs.Completed += new EventHandler(sendEventArgs_Completed); sendEventArgs.SetBuffer(packet, 0, packet.Length); _sock.SendAsync(sendEventArgs); } catch (Exception ex) { Disconnect(); LastException = ex; throw LastException; } } void sendEventArgs_Completed(object sender, SocketAsyncEventArgs e) { ProcessSend((Socket)sender, e); } void ProcessSend(Socket sock, SocketAsyncEventArgs e) { if (e.SocketError != SocketError.Success) { Disconnect(); } } #endregion #region Properties /// /// Game server endpoint. /// public IPEndPoint Endpoint { get; protected set; } /// /// Last exception that occured during operation. /// public Exception LastException { get; protected set; } /// /// Connected? /// public bool Connected { get; protected set; } /// /// Gets the next unique ID to be used for transmisson. Read this before sending to pair responses to sent messages. /// public uint SequenceID { get { return _sequenceID; } } #endregion } /// /// Exception thrown when attempting to send on a non-connected service client. /// public class NotConnectedException : Exception { } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/Rcon/PacketProcessingClient.cs0000644000175000017500000000644012146506550032636 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.Collections.Generic; using ServiceStack.Messaging; using System.Net.Sockets; using System.Text; namespace ServiceStack.Messaging.Rcon { /// /// Processing client used to interface with ServiceStack and allow a message to be processed. /// Not an actual client. /// internal class ProcessingClient : IMessageQueueClient { Packet thePacket; Socket theClient; Server theServer; bool givenPacket = false; public ProcessingClient(Packet packet, Socket client, Server server) { thePacket = packet; theClient = client; theServer = server; } public void Publish(T messageBody) { if (typeof(IMessage).IsAssignableFrom(typeof(T))) Publish((IMessage)messageBody); else Publish(new Message(messageBody)); } public void Publish(IMessage message) { var messageBytes = message.ToBytes(); Publish(new QueueNames(message.Body.GetType()).In, messageBytes); } public void Publish(IMessage message) { var messageBytes = message.ToBytes(); Publish(message.ToInQueueName(), messageBytes); } /// /// Publish the specified message into the durable queue @queueName /// /// /// public void Publish(string queueName, byte[] messageBytes) { theServer.Publish(queueName, messageBytes, theClient, thePacket.Sequence); } /// /// Publish the specified message into the transient queue @queueName /// /// /// public void Notify(string queueName, byte[] messageBytes) { theServer.Notify(queueName, messageBytes, theClient, thePacket.Sequence); } /// /// Synchronous blocking get. /// /// /// /// public byte[] Get(string queueName, TimeSpan? timeOut) { if (givenPacket) return null; var ret = thePacket.Words[1]; givenPacket = true; return ret; } /// /// Non blocking get message /// /// /// public byte[] GetAsync(string queueName) { return Get(queueName, TimeSpan.MinValue); } /// /// Blocking wait for notifications on any of the supplied channels /// /// /// public string WaitForNotifyOnAny(params string[] channelNames) { return null; } public void Dispose() { } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/Rcon/Server.cs0000644000175000017500000002515312146506550027503 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Linq; using System.Threading; using System.Text; using ServiceStack.Messaging; namespace ServiceStack.Messaging.Rcon { /// /// Hosting services via a binary-safe TCP-based protocol. /// public class Server : IMessageService { private readonly Dictionary handlerMap = new Dictionary(); private Dictionary messageHandlers = new Dictionary(); Socket _listener = null; IPEndPoint _localEndpoint = null; public Server(IPEndPoint localEndpoint) { _localEndpoint = localEndpoint; } #region IMessageService Members /// /// Factory to create consumers and producers that work with this service /// public IMessageFactory MessageFactory { get; private set; } /// /// Register DTOs and hanlders the MQ Host will process /// /// /// public void RegisterHandler(Func, object> processMessageFn) { RegisterHandler(processMessageFn, null); } public void RegisterHandler(Func, object> processMessageFn, Action, Exception> processExceptionEx) { if (handlerMap.ContainsKey(typeof(T))) { throw new ArgumentException("Message handler has already been registered for type: " + typeof(T).Name); } handlerMap[typeof(T)] = CreateMessageHandlerFactory(processMessageFn, processExceptionEx); } protected IMessageHandlerFactory CreateMessageHandlerFactory(Func, object> processMessageFn, Action, Exception> processExceptionEx) { return new MessageHandlerFactory(this, processMessageFn, processExceptionEx); } public IMessageHandlerStats GetStats() { return null; } /// /// Get Total Current Stats for all Message Handlers /// /// public string GetStatus() { return null; } /// /// Get a Stats dump /// /// public string GetStatsDescription() { return null; } /// /// Start the MQ Host. Stops the server and restarts if already started. /// public void Start() { if (this.messageHandlers.Count == 0) { foreach (var kvp in this.handlerMap) { this.messageHandlers[kvp.Key] = kvp.Value.CreateMessageHandler(); } } Stop(); _listener = new Socket(_localEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _listener.Bind(_localEndpoint); _listener.Listen(60); var acceptArgs = new SocketAsyncEventArgs(); acceptArgs.Completed += new EventHandler(acceptArgs_Completed); if (!_listener.AcceptAsync(acceptArgs)) { ProcessAccept(_listener, acceptArgs); } } /// /// Stop the MQ Host if not already stopped. /// public void Stop() { if (_listener != null) { _listener.Close(); _listener = null; } } #endregion public void Dispose() { if (_listener != null) { try { _listener.Shutdown(SocketShutdown.Send); _listener.Close(); } catch (Exception) { } } } public void Notify(string queueName, byte[] message, Socket client, uint sequenceID) { var words = new byte[][] { Encoding.UTF8.GetBytes("notify"), Encoding.UTF8.GetBytes(queueName), message }; var sendToClient = PacketCodec.EncodePacket(false, true, sequenceID, words); Send(sendToClient, client); } public void Publish(string queueName, byte[] message, Socket client, uint sequenceID) { var words = new byte[][] { Encoding.UTF8.GetBytes("publish"), Encoding.UTF8.GetBytes(queueName), message }; var sendToClient = PacketCodec.EncodePacket(false, true, sequenceID, words); Send(sendToClient, client); } void acceptArgs_Completed(object sender, SocketAsyncEventArgs e) { ProcessAccept((Socket)sender, e); } void ProcessAccept(Socket serverSock, SocketAsyncEventArgs e) { var newSocket = e.AcceptSocket; var readEventArgs = new SocketAsyncEventArgs(); var state = new ClientSocketState(); readEventArgs.UserToken = state; readEventArgs.SetBuffer(state.Header, 0, state.Header.Length); readEventArgs.Completed += new EventHandler(readEventArgs_Completed); if (!newSocket.ReceiveAsync(readEventArgs)) { ProcessReceive(newSocket, readEventArgs); } e.AcceptSocket = null; serverSock.AcceptAsync(e); } void readEventArgs_Completed(object sender, SocketAsyncEventArgs e) { ProcessReceive((Socket)sender, e); } void ProcessReceive(Socket readingSock, SocketAsyncEventArgs e) { var userToken = (ClientSocketState)e.UserToken; if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { if (!userToken.ReadHeader) { // if we've filled the buffer we can decode the header if (e.Offset + e.BytesTransferred == userToken.Header.Length) { userToken.ReadHeader = true; userToken.MessageLength = BitConverter.ToUInt32(userToken.Header, 4); userToken.CompleteMessage = new byte[userToken.MessageLength]; for (int i = 0; i < userToken.Header.Length; i++) { userToken.CompleteMessage[i] = userToken.Header[i]; } e.SetBuffer(userToken.CompleteMessage, userToken.Header.Length, userToken.CompleteMessage.Length - userToken.Header.Length); if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } else { if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } } else { if (e.Offset + e.BytesTransferred == userToken.MessageLength) { // copy buffer var fullPacket = userToken.CompleteMessage; // reset state userToken.ReadHeader = false; userToken.MessageLength = 0; // process the message ThreadPool.QueueUserWorkItem(delegate { ProcessPacket(fullPacket, readingSock, userToken); }); // start listening for more packets e.SetBuffer(userToken.Header, 0, userToken.Header.Length); if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } else { if (!readingSock.ReceiveAsync(e)) { ProcessReceive(readingSock, e); } } } } else { // socket disconnected ClientDisconnected(readingSock); } } /// /// Processes a received packet. /// /// The packet. void ProcessPacket(byte[] packet, Socket client, ClientSocketState userToken) { var packetObj = PacketCodec.DecodePacket(packet); #if !SILVERLIGHT var type = Type.GetType(Encoding.UTF8.GetString(packetObj.Words[0])); #else var bytes = packetObj.Words[0]; var type = Type.GetType(Encoding.UTF8.GetString(bytes, 0, bytes.Length)); #endif if (messageHandlers.ContainsKey(type)) { messageHandlers[type].Process(new ProcessingClient(packetObj, client, this)); } } void Send(byte[] data, Socket client) { var sendEventArgs = new SocketAsyncEventArgs(); sendEventArgs.Completed += new EventHandler(sendEventArgs_Completed); sendEventArgs.SetBuffer(data, 0, data.Length); client.SendAsync(sendEventArgs); } void sendEventArgs_Completed(object sender, SocketAsyncEventArgs e) { ProcessSend((Socket)sender, e); } void ProcessSend(Socket sock, SocketAsyncEventArgs e) { if (e.SocketError != SocketError.Success) { ClientDisconnected(sock); } } void ClientDisconnected(Socket sock) { if (sock != null) { try { sock.Shutdown(SocketShutdown.Send); } catch (Exception) { } try { sock.Close(); } catch (Exception) { } } } } public class ClientSocketState { public byte[] Header = new byte[8]; public byte[] CompleteMessage = new byte[0]; public bool ReadHeader = false; public uint MessageLength = 0; } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/Rcon/PacketCodec.cs0000644000175000017500000001167712146506550030410 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ServiceStack.Messaging.Rcon { /// /// Contains methods required for encoding and decoding rcon packets. /// internal class PacketCodec { /// /// Decodes a packet. /// /// The packet. /// A packet object. internal static Packet DecodePacket(byte[] packet) { var header = DecodeHeader(packet); var words = DecodeWords(packet); bool fromServer = false; if (header[0] > 0) fromServer = true; bool isResponse = false; if (header[1] > 0) isResponse = true; uint idNumber = 0; if (header[2] > 0) idNumber = header[2]; return new Packet() { FromServer = fromServer, IsResponse = isResponse, Sequence = idNumber, Words = words }; } /// /// Decodes the packet header. /// /// /// private static uint[] DecodeHeader(byte[] packet) { var x = BitConverter.ToUInt32(packet, 0); return new uint[] { x & 0x80000000, x & 0x40000000, x & 0x3FFFFFFF }; } /// /// Decodes words in a packet. /// /// /// private static byte[][] DecodeWords(byte[] packet) { var wordCount = BitConverter.ToUInt32(packet, 8); var words = new byte[wordCount][]; var wordIndex = 0; int offset = 12; for (int i = 0; i < wordCount; i++) { var wordLen = BitConverter.ToInt32(packet, offset); var word = new byte[wordLen]; for (int j = 0; j < wordLen; j++) { word[j] = packet[offset + 4 + j]; } words[wordIndex++] = word; offset += 5 + wordLen; } return words; } /// /// Encodes a packet for transmission to the server. /// /// /// /// /// /// internal static byte[] EncodePacket(bool fromServer, bool isResponse, uint id, byte[][] words) { /* * Packet format: * 0 - 3 = header * 4 - 7 = size of packet * 8 -11 = number of words * 12+ = words * * Word format: * 0 - 3 = word length * 4 - n = word * n+1 = null (0x0) */ var encodedHeader = EncodeHeader(fromServer, isResponse, id); var encodedWordCount = BitConverter.GetBytes((uint)words.Length); var encodedWords = EncodeWords(words); var encodedPacketSize = BitConverter.GetBytes((uint)(encodedHeader.Length + encodedWordCount.Length + encodedWords.Length + 4)); // +4 for the packet size indicator var packet = new List(); packet.AddRange(encodedHeader); packet.AddRange(encodedPacketSize); packet.AddRange(encodedWordCount); packet.AddRange(encodedWords); return packet.ToArray(); } /// /// Encodes a packet header. /// /// /// /// /// private static byte[] EncodeHeader(bool fromServer, bool isResponse, uint id) { uint header = id & 0x3FFFFFFF; if (fromServer) header += 0x80000000; if (isResponse) header += 0x40000000; return BitConverter.GetBytes(header); } /// /// Encodes words. /// /// /// private static byte[] EncodeWords(byte[][] words) { var wordPacket = new List(); foreach (var word in words) { var encodedWord = new List(); encodedWord.AddRange(word); encodedWord.Add(0); var encodedLength = BitConverter.GetBytes((uint)word.Length); wordPacket.AddRange(encodedLength); wordPacket.AddRange(encodedWord); } return wordPacket.ToArray(); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/MessageHandler.cs0000644000175000017500000002041512146506550030212 0ustar00meebeymeebey00000000000000using System; using System.Text; using ServiceStack.Common; using ServiceStack.Logging; using ServiceStack.Service; using ServiceStack.ServiceClient.Web; using ServiceStack.Text; using StringExtensions = ServiceStack.Common.StringExtensions; namespace ServiceStack.Messaging { /// /// Processes all messages in a Normal and Priority Queue. /// Expects to be called in 1 thread. i.e. Non Thread-Safe. /// /// public class MessageHandler : IMessageHandler, IDisposable { private static readonly ILog Log = LogManager.GetLogger(typeof(MessageHandler)); public const int DefaultRetryCount = 2; //Will be a total of 3 attempts private readonly IMessageService messageService; private readonly Func, object> processMessageFn; private readonly Action, Exception> processInExceptionFn; public Func ReplyClientFactory { get; set; } private readonly int retryCount; public int TotalMessagesProcessed { get; private set; } public int TotalMessagesFailed { get; private set; } public int TotalRetries { get; private set; } public int TotalNormalMessagesReceived { get; private set; } public int TotalPriorityMessagesReceived { get; private set; } public int TotalOutMessagesReceived { get; private set; } public string[] ProcessQueueNames { get; set; } public MessageHandler(IMessageService messageService, Func, object> processMessageFn) : this(messageService, processMessageFn, null, DefaultRetryCount) {} private IMessageQueueClient MqClient { get; set; } public MessageHandler(IMessageService messageService, Func, object> processMessageFn, Action, Exception> processInExceptionFn, int retryCount) { if (messageService == null) throw new ArgumentNullException("messageService"); if (processMessageFn == null) throw new ArgumentNullException("processMessageFn"); this.messageService = messageService; this.processMessageFn = processMessageFn; this.processInExceptionFn = processInExceptionFn ?? DefaultInExceptionHandler; this.retryCount = retryCount; this.ReplyClientFactory = ClientFactory.Create; this.ProcessQueueNames = new[] { QueueNames.Priority, QueueNames.In }; } public Type MessageType { get { return typeof(T); } } public void Process(IMessageQueueClient mqClient) { foreach (var processQueueName in ProcessQueueNames) { ProcessQueue(mqClient, processQueueName); } } public int ProcessQueue(IMessageQueueClient mqClient, string queueName, Func doNext = null) { var msgsProcessed = 0; try { byte[] messageBytes; while ((messageBytes = mqClient.GetAsync(queueName)) != null) { var message = messageBytes.ToMessage(); ProcessMessage(mqClient, message); this.TotalNormalMessagesReceived++; msgsProcessed++; if (doNext != null && !doNext()) return msgsProcessed; } } catch (Exception ex) { var lastEx = ex; Log.Error("Error serializing message from mq server: " + lastEx.Message, ex); } return msgsProcessed; } public IMessageHandlerStats GetStats() { return new MessageHandlerStats(typeof(T).Name, TotalMessagesProcessed, TotalMessagesFailed, TotalRetries, TotalNormalMessagesReceived, TotalPriorityMessagesReceived); } private void DefaultInExceptionHandler(IMessage message, Exception ex) { Log.Error("Message exception handler threw an error", ex); if (!(ex is UnRetryableMessagingException)) { if (message.RetryAttempts < retryCount) { message.RetryAttempts++; this.TotalRetries++; message.Error = new MessagingException(ex.Message, ex).ToMessageError(); MqClient.Publish(QueueNames.In, message.ToBytes()); return; } } MqClient.Publish(QueueNames.Dlq, message.ToBytes()); } public void ProcessMessage(IMessageQueueClient mqClient, Message message) { this.MqClient = mqClient; try { var response = processMessageFn(message); var responseEx = response as Exception; if (responseEx != null) throw responseEx; this.TotalMessagesProcessed++; //If there's no response publish the request message to its OutQ if (response == null) { var messageOptions = (MessageOption)message.Options; if (messageOptions.Has(MessageOption.NotifyOneWay)) { mqClient.Notify(QueueNames.Out, message.ToBytes()); } } else { //If there is a response send it to the typed response OutQ var mqReplyTo = message.ReplyTo; if (mqReplyTo == null) { var responseType = response.GetType(); #if __MonoCS__ // work around Mono 2.6.7 compiler bug: // System.Type.IsUserType' is inaccessible due to its protection level if (!StringExtensions.IsUserType(responseType)) return; #else if (!responseType.IsUserType()) return; #endif mqReplyTo = new QueueNames(responseType).In; } var replyClient = ReplyClientFactory(mqReplyTo); if (replyClient != null) { try { replyClient.SendOneWay(mqReplyTo, response); return; } catch (Exception ex) { Log.Error("Could not send response to '{0}' with client '{1}'" .Fmt(mqReplyTo, replyClient.GetType().Name), ex); var responseType = response.GetType(); #if __MonoCS__ if (!StringExtensions.IsUserType(responseType)) return; #else if (!responseType.IsUserType()) return; #endif mqReplyTo = new QueueNames(responseType).In; } } //Otherwise send to our trusty response Queue (inc if replyClient fails) var responseMessage = MessageFactory.Create(response); responseMessage.ReplyId = message.Id; mqClient.Publish(mqReplyTo, responseMessage.ToBytes()); } } catch (Exception ex) { try { TotalMessagesFailed++; processInExceptionFn(message, ex); } catch (Exception exHandlerEx) { Log.Error("Message exception handler threw an error", exHandlerEx); } } } public void Dispose() { var shouldDispose = messageService as IMessageHandlerDisposer; if (shouldDispose != null) shouldDispose.DisposeMessageHandler(this); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/InMemoryMessageQueueClient.cs0000644000175000017500000000261112146506550032536 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { public class InMemoryMessageQueueClient : IMessageQueueClient { private readonly MessageQueueClientFactory factory; public InMemoryMessageQueueClient(MessageQueueClientFactory factory) { this.factory = factory; } public void Publish(T messageBody) { factory.PublishMessage(QueueNames.In, new Message(messageBody)); } public void Publish(IMessage message) { factory.PublishMessage(QueueNames.In, message); } public void Publish(string queueName, byte[] messageBytes) { factory.PublishMessage(queueName, messageBytes); } public void Notify(string queueName, byte[] messageBytes) { factory.PublishMessage(queueName, messageBytes); } public byte[] GetAsync(string queueName) { return factory.GetMessageAsync(queueName); } public string WaitForNotifyOnAny(params string[] channelNames) { throw new NotImplementedException(); } public byte[] Get(string queueName, TimeSpan? timeOut) { throw new NotImplementedException(); } public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/InMemoryTransientMessageService.cs0000644000175000017500000000210312146506550033577 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.Collections; namespace ServiceStack.Messaging { public class InMemoryTransientMessageService : TransientMessageServiceBase { internal InMemoryTransientMessageFactory Factory { get; set; } public InMemoryTransientMessageService() : this(null) { } public InMemoryTransientMessageService(InMemoryTransientMessageFactory factory) { this.Factory = factory ?? new InMemoryTransientMessageFactory(this); this.Factory.MqFactory.MessageReceived += factory_MessageReceived; } void factory_MessageReceived(object sender, EventArgs e) { //var Factory = (MessageQueueClientFactory) sender; this.Start(); } public override IMessageFactory MessageFactory { get { return Factory; } } public MessageQueueClientFactory MessageQueueFactory { get { return Factory.MqFactory; } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/InMemoryTransientMessageFactory.cs0000644000175000017500000000427412146506550033621 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using ServiceStack.Logging; namespace ServiceStack.Messaging { public class InMemoryTransientMessageFactory : IMessageFactory { private static readonly ILog Log = LogManager.GetLogger(typeof(InMemoryTransientMessageFactory)); private readonly InMemoryTransientMessageService transientMessageService; internal MessageQueueClientFactory MqFactory { get; set; } public InMemoryTransientMessageFactory() : this(null) { } public InMemoryTransientMessageFactory(InMemoryTransientMessageService transientMessageService) { this.transientMessageService = transientMessageService ?? new InMemoryTransientMessageService(); this.MqFactory = new MessageQueueClientFactory(); } public IMessageProducer CreateMessageProducer() { return new InMemoryMessageProducer(this); } public IMessageQueueClient CreateMessageQueueClient() { return new InMemoryMessageQueueClient(MqFactory); } public IMessageService CreateMessageService() { return transientMessageService; } public void Dispose() { Log.DebugFormat("Disposing InMemoryTransientMessageFactory..."); } internal class InMemoryMessageProducer : IMessageProducer { private readonly InMemoryTransientMessageFactory parent; public InMemoryMessageProducer(InMemoryTransientMessageFactory parent) { this.parent = parent; } public void Publish(T messageBody) { Publish((IMessage)new Message(messageBody)); } public void Publish(IMessage message) { this.parent.transientMessageService.MessageQueueFactory.PublishMessage(QueueNames.In, message); } public void Dispose() { Log.DebugFormat("Disposing InMemoryMessageProducer..."); } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/MessageExtensions.cs0000644000175000017500000000576212146506550031004 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Reflection; using System.Threading; using ServiceStack.Text; namespace ServiceStack.Messaging { public static class MessageExtensions { public static string ToString(byte[] bytes) { #if !SILVERLIGHT return System.Text.Encoding.UTF8.GetString(bytes); #else return System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length); #endif } private static Dictionary ToMessageFnCache = new Dictionary(); internal static ToMessageDelegate GetToMessageFn(Type type) { ToMessageDelegate toMessageFn; ToMessageFnCache.TryGetValue(type, out toMessageFn); if (toMessageFn != null) return toMessageFn; var genericType = typeof(MessageExtensions<>).MakeGenericType(type); var mi = genericType.GetMethod("ConvertToMessage", BindingFlags.Public | BindingFlags.Static); toMessageFn = (ToMessageDelegate)Delegate.CreateDelegate(typeof(ToMessageDelegate), mi); Dictionary snapshot, newCache; do { snapshot = ToMessageFnCache; newCache = new Dictionary(ToMessageFnCache); newCache[type] = toMessageFn; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ToMessageFnCache, newCache, snapshot), snapshot)); return toMessageFn; } public static IMessage ToMessage(this byte[] bytes, Type ofType) { var msgFn = GetToMessageFn(ofType); var msg = msgFn(bytes); return msg; } public static Message ToMessage(this byte[] bytes) { var messageText = ToString(bytes); return JsonSerializer.DeserializeFromString>(messageText); } public static byte[] ToBytes(this IMessage message) { var serializedMessage = JsonSerializer.SerializeToString((object)message); return System.Text.Encoding.UTF8.GetBytes(serializedMessage); } public static byte[] ToBytes(this IMessage message) { var serializedMessage = JsonSerializer.SerializeToString(message); return System.Text.Encoding.UTF8.GetBytes(serializedMessage); } public static string ToInQueueName(this IMessage message) { return message.Priority > 0 ? QueueNames.Priority : QueueNames.In; } } internal delegate IMessage ToMessageDelegate(object param); internal static class MessageExtensions { public static IMessage ConvertToMessage(object oBytes) { var bytes = (byte[]) oBytes; return bytes.ToMessage(); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/MessageHandlerFactory.cs0000644000175000017500000000437612146506550031552 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { public class MessageHandlerFactory : IMessageHandlerFactory { public const int DefaultRetryCount = 2; //Will be a total of 3 attempts private readonly IMessageService messageService; public Func RequestFilter { get; set; } public Func ResponseFilter { get; set; } private readonly Func, object> processMessageFn; private readonly Action, Exception> processExceptionFn; public int RetryCount { get; set; } public MessageHandlerFactory(IMessageService messageService, Func, object> processMessageFn) : this(messageService, processMessageFn, null) { } public MessageHandlerFactory(IMessageService messageService, Func, object> processMessageFn, Action, Exception> processExceptionEx) { if (messageService == null) throw new ArgumentNullException("messageService"); if (processMessageFn == null) throw new ArgumentNullException("processMessageFn"); this.messageService = messageService; this.processMessageFn = processMessageFn; this.processExceptionFn = processExceptionEx; this.RetryCount = DefaultRetryCount; } public IMessageHandler CreateMessageHandler() { if (this.RequestFilter == null && this.ResponseFilter == null) { return new MessageHandler(messageService, processMessageFn, processExceptionFn, this.RetryCount); } return new MessageHandler(messageService, msg => { if (this.RequestFilter != null) msg = (IMessage) this.RequestFilter(msg); var result = this.processMessageFn(msg); if (this.ResponseFilter != null) result = this.ResponseFilter(result); return result; }, processExceptionFn, this.RetryCount); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/TransientMessageServiceBase.cs0000644000175000017500000001063512146506550032723 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ServiceStack.Messaging { public abstract class TransientMessageServiceBase : IMessageService, IMessageHandlerDisposer { private bool isRunning; public const int DefaultRetryCount = 2; //Will be a total of 3 attempts public int RetryCount { get; protected set; } public TimeSpan? RequestTimeOut { get; protected set; } public int PoolSize { get; protected set; } //use later public abstract IMessageFactory MessageFactory { get; } protected TransientMessageServiceBase() : this(DefaultRetryCount, null) { } protected TransientMessageServiceBase(int retryAttempts, TimeSpan? requestTimeOut) { this.RetryCount = retryAttempts; this.RequestTimeOut = requestTimeOut; } private readonly Dictionary handlerMap = new Dictionary(); private IMessageHandler[] messageHandlers; public void RegisterHandler(Func, object> processMessageFn) { RegisterHandler(processMessageFn, null); } public void RegisterHandler(Func, object> processMessageFn, Action, Exception> processExceptionEx) { if (handlerMap.ContainsKey(typeof(T))) { throw new ArgumentException("Message handler has already been registered for type: " + typeof(T).Name); } handlerMap[typeof(T)] = CreateMessageHandlerFactory(processMessageFn, processExceptionEx); } public IMessageHandlerStats GetStats() { var total = new MessageHandlerStats("All Handlers"); messageHandlers.ToList().ForEach(x => total.Add(x.GetStats())); return total; } public string GetStatus() { return isRunning ? "Started" : "Stopped"; } public string GetStatsDescription() { var sb = new StringBuilder("#MQ HOST STATS:\n"); sb.AppendLine("==============="); foreach (var messageHandler in messageHandlers) { sb.AppendLine(messageHandler.GetStats().ToString()); sb.AppendLine("---------------"); } return sb.ToString(); } protected IMessageHandlerFactory CreateMessageHandlerFactory( Func, object> processMessageFn, Action, Exception> processExceptionEx) { return new MessageHandlerFactory(this, processMessageFn, processExceptionEx) { RetryCount = RetryCount, }; } public virtual void Start() { if (isRunning) return; isRunning = true; this.messageHandlers = this.handlerMap.Values.ToList().ConvertAll( x => x.CreateMessageHandler()).ToArray(); using (var mqClient = MessageFactory.CreateMessageQueueClient()) { foreach (var handler in messageHandlers) { handler.Process(mqClient); } } this.Stop(); } public virtual void Stop() { isRunning = false; messageHandlers = null; } public virtual void Dispose() { Stop(); } public virtual void DisposeMessageHandler(IMessageHandler messageHandler) { lock (messageHandlers) { if (!isRunning) return; var allHandlersAreDisposed = true; for (var i = 0; i < messageHandlers.Length; i++) { if (messageHandlers[i] == messageHandler) { messageHandlers[i] = null; } allHandlersAreDisposed = allHandlersAreDisposed && messageHandlers[i] == null; } if (allHandlersAreDisposed) { Stop(); } } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/IMessageHandlerDisposer.cs0000644000175000017500000000025212146506550032031 0ustar00meebeymeebey00000000000000namespace ServiceStack.Messaging { public interface IMessageHandlerDisposer { void DisposeMessageHandler(IMessageHandler messageHandler); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/MessageQueueClientFactory.cs0000644000175000017500000000365112146506550032413 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Messaging { public class MessageQueueClientFactory : IMessageQueueClientFactory { public IMessageQueueClient CreateMessageQueueClient() { return new InMemoryMessageQueueClient(this); } readonly object syncLock = new object(); public event EventHandler MessageReceived; void InvokeMessageReceived(EventArgs e) { var received = MessageReceived; if (received != null) received(this, e); } private readonly Dictionary> queueMessageBytesMap = new Dictionary>(); public void PublishMessage(string queueName, IMessage message) { PublishMessage(queueName, message.ToBytes()); } public void PublishMessage(string queueName, byte[] messageBytes) { lock (syncLock) { Queue bytesQueue; if (!queueMessageBytesMap.TryGetValue(queueName, out bytesQueue)) { bytesQueue = new Queue(); queueMessageBytesMap[queueName] = bytesQueue; } bytesQueue.Enqueue(messageBytes); } InvokeMessageReceived(new EventArgs()); } public byte[] GetMessageAsync(string queueName) { lock (syncLock) { Queue bytesQueue; if (!queueMessageBytesMap.TryGetValue(queueName, out bytesQueue)) { return null; } var messageBytes = bytesQueue.Dequeue(); return messageBytes; } } public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/IMessageHandlerFactory.cs0000644000175000017500000000035612146506550031655 0ustar00meebeymeebey00000000000000namespace ServiceStack.Messaging { /// /// Encapsulates creating a new message handler /// public interface IMessageHandlerFactory { IMessageHandler CreateMessageHandler(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/ClientFactory.cs0000644000175000017500000000221412146506550030073 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Common; using ServiceStack.Service; using ServiceStack.ServiceClient.Web; namespace ServiceStack.Messaging { public static class ClientFactory { public static IOneWayClient Create(string endpointUrl) { if (endpointUrl.IsNullOrEmpty() || !endpointUrl.StartsWith("http")) return null; if (endpointUrl.IndexOf("format=") == -1 || endpointUrl.IndexOf("format=json") >= 0) return new JsonServiceClient(endpointUrl); if (endpointUrl.IndexOf("format=xml") >= 0) return new XmlServiceClient(endpointUrl); if (endpointUrl.IndexOf("format=jsv") >= 0) return new JsvServiceClient(endpointUrl); if (endpointUrl.IndexOf("format=soap11") >= 0) return new Soap11ServiceClient(endpointUrl); if (endpointUrl.IndexOf("format=soap12") >= 0) return new Soap12ServiceClient(endpointUrl); throw new NotImplementedException("could not find service client for " + endpointUrl); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Messaging/IMessageHandler.cs0000644000175000017500000000231012146506550030315 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { /// /// Single threaded message handler that can process all messages /// of a particular message type. /// public interface IMessageHandler { /// /// The type of the message this handler processes /// Type MessageType { get; } /// /// Process all messages pending /// /// void Process(IMessageQueueClient mqClient); /// /// Process messages from a single queue. /// /// /// The queue to process /// A predicate on whether to continue processing the next message if any /// int ProcessQueue(IMessageQueueClient mqClient, string queueName, Func doNext = null); /// /// Get Current Stats for this Message Handler /// /// IMessageHandlerStats GetStats(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/DirectoryInfoExtensions.cs0000644000175000017500000000264412146506550030257 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System.Collections.Generic; using System.IO; namespace ServiceStack.Common { public static class DirectoryInfoExtensions { public static IEnumerable GetMatchingFiles(this DirectoryInfo rootDirPath, string fileSearchPattern) { return GetMatchingFiles(rootDirPath.FullName, fileSearchPattern); } public static IEnumerable GetMatchingFiles(string rootDirPath, string fileSearchPattern) { var pending = new Queue(); pending.Enqueue(rootDirPath); string[] paths; while (pending.Count > 0) { rootDirPath = pending.Dequeue(); paths = Directory.GetFiles(rootDirPath, fileSearchPattern); foreach (var filePath in paths) { yield return filePath; } paths = Directory.GetDirectories(rootDirPath); foreach (var dirPath in paths) { var dirAttrs = File.GetAttributes(dirPath); var isRecurseSymLink = (dirAttrs & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint; if (!isRecurseSymLink) { pending.Enqueue(dirPath); } } } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/DisposableExtensions.cs0000644000175000017500000000237312146506550027563 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.Logging; namespace ServiceStack.Common { public static class DisposableExtensions { public static void Dispose(this IEnumerable resources, ILog log) { foreach (var disposable in resources) { try { disposable.Dispose(); } catch (Exception ex) { if (log != null) { log.Error(string.Format("Error disposing of '{0}'", disposable.GetType().FullName), ex); } } } } public static void Dispose(this IEnumerable resources) { Dispose(resources, null); } public static void Dispose(params IDisposable[] disposables) { Dispose(disposables, null); } public static void Run(this T disposable, Action runActionThenDispose) where T : IDisposable { using (disposable) { runActionThenDispose(disposable); } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Properties/0000755000175000017500000000000012146506550025216 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Properties/AssemblyInfo.cs0000644000175000017500000000311412146506550030137 0ustar00meebeymeebey00000000000000using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("ServiceStack.Common")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("ServiceStack")] [assembly: AssemblyProduct("ServiceStack.Common")] [assembly: AssemblyCopyright("Copyright © ServiceStack 2012")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("3871f659-64fb-4dfb-a49f-17dc2f8a47e2")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("3.9.8.0")] // CCB Custom [assembly: ContractNamespace("http://schemas.servicestack.net/types", ClrNamespace = "ServiceStack.Common.ServiceClient.Web")]smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/AssertExtensions.cs0000644000175000017500000000412612146506550026735 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; namespace ServiceStack.Common { public static class AssertExtensions { public static void ThrowOnFirstNull(params object[] objs) { foreach (var obj in objs) { ThrowIfNull(obj); } } public static void ThrowIfNull(this object obj) { ThrowIfNull(obj, null); } public static void ThrowIfNull(this object obj, string varName) { if (obj == null) throw new ArgumentNullException(varName ?? "object"); } public static void ThrowIfNullOrEmpty(this string strValue) { ThrowIfNullOrEmpty(strValue, null); } public static void ThrowIfNullOrEmpty(this string strValue, string varName) { if (string.IsNullOrEmpty(strValue)) throw new ArgumentNullException(varName ?? "string"); } public static void ThrowIfNullOrEmpty(this ICollection collection) { ThrowIfNullOrEmpty(collection, null); } public static void ThrowIfNullOrEmpty(this ICollection collection, string varName) { var fieldName = varName ?? "collection"; if (collection == null) throw new ArgumentNullException(fieldName); if (collection.Count == 0) throw new ArgumentException(fieldName + " is empty"); } public static void ThrowIfNullOrEmpty(this ICollection collection) { ThrowIfNullOrEmpty(collection, null); } public static void ThrowIfNullOrEmpty(this ICollection collection, string varName) { var fieldName = varName ?? "collection"; if (collection == null) throw new ArgumentNullException(fieldName); if (collection.Count == 0) throw new ArgumentException(fieldName + " is empty"); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/IPAddressExtensions.cs0000644000175000017500000001450012146506550027307 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using ServiceStack.Logging; namespace ServiceStack.Common.Extensions { /// /// Useful IPAddressExtensions from: /// http://blogs.msdn.com/knom/archive/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks.aspx /// /// public static class IPAddressExtensions { public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask) { var ipAdressBytes = address.GetAddressBytes(); var subnetMaskBytes = subnetMask.GetAddressBytes(); if (ipAdressBytes.Length != subnetMaskBytes.Length) throw new ArgumentException("Lengths of IP address and subnet mask do not match."); var broadcastAddress = new byte[ipAdressBytes.Length]; for (var i = 0; i < broadcastAddress.Length; i++) { broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255)); } return new IPAddress(broadcastAddress); } public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask) { var ipAdressBytes = address.GetAddressBytes(); var subnetMaskBytes = subnetMask.GetAddressBytes(); return new IPAddress(GetNetworkAddressBytes(ipAdressBytes, subnetMaskBytes)); } public static byte[] GetNetworkAddressBytes(byte[] ipAdressBytes, byte[] subnetMaskBytes) { if (ipAdressBytes.Length != subnetMaskBytes.Length) throw new ArgumentException("Lengths of IP address and subnet mask do not match."); var broadcastAddress = new byte[ipAdressBytes.Length]; for (var i = 0; i < broadcastAddress.Length; i++) { broadcastAddress[i] = (byte)(ipAdressBytes[i] & (subnetMaskBytes[i])); } return broadcastAddress; } public static bool IsInSameIpv6Subnet(this IPAddress address2, IPAddress address) { if (address2.AddressFamily != AddressFamily.InterNetworkV6 || address.AddressFamily != AddressFamily.InterNetworkV6) { throw new ArgumentException("Both IPAddress must be IPV6 addresses"); } var address1Bytes = address.GetAddressBytes(); var address2Bytes = address2.GetAddressBytes(); return IsInSameIpv6Subnet(address1Bytes, address2Bytes); } public static bool IsInSameIpv6Subnet(this byte[] address1Bytes, byte[] address2Bytes) { if (address1Bytes.Length != address2Bytes.Length) throw new ArgumentException("Lengths of IP addresses do not match."); for (var i = 0; i < 8; i++) { if (address1Bytes[i] != address2Bytes[i]) { return false; } } return true; } public static bool IsInSameIpv4Subnet(this IPAddress address2, IPAddress address, IPAddress subnetMask) { if (address2.AddressFamily != AddressFamily.InterNetwork || address.AddressFamily != AddressFamily.InterNetwork) { throw new ArgumentException("Both IPAddress must be IPV4 addresses"); } var network1 = address.GetNetworkAddress(subnetMask); var network2 = address2.GetNetworkAddress(subnetMask); return network1.Equals(network2); } public static bool IsInSameIpv4Subnet(this byte[] address1Bytes, byte[] address2Bytes, byte[] subnetMaskBytes) { if (address1Bytes.Length != address2Bytes.Length) throw new ArgumentException("Lengths of IP addresses do not match."); var network1Bytes = GetNetworkAddressBytes(address1Bytes, subnetMaskBytes); var network2Bytes = GetNetworkAddressBytes(address2Bytes, subnetMaskBytes); return network1Bytes.AreEqual(network2Bytes); } /// /// Gets the ipv4 addresses from all Network Interfaces that have Subnet masks. /// /// public static Dictionary GetAllNetworkInterfaceIpv4Addresses() { var map = new Dictionary(); try { #if !SILVERLIGHT foreach (var ni in NetworkInterface.GetAllNetworkInterfaces()) { foreach (var uipi in ni.GetIPProperties().UnicastAddresses) { if (uipi.Address.AddressFamily != AddressFamily.InterNetwork) continue; if (uipi.IPv4Mask == null) continue; //ignore 127.0.0.1 map[uipi.Address] = uipi.IPv4Mask; } } #endif } catch /*(NotImplementedException ex)*/ { //log.Warn("MONO does not support NetworkInterface.GetAllNetworkInterfaces(). Could not detect local ip subnets.", ex); } return map; } /// /// Gets the ipv6 addresses from all Network Interfaces. /// /// public static List GetAllNetworkInterfaceIpv6Addresses() { var list = new List(); try { #if !SILVERLIGHT foreach (var ni in NetworkInterface.GetAllNetworkInterfaces()) { foreach (var uipi in ni.GetIPProperties().UnicastAddresses) { if (uipi.Address.AddressFamily != AddressFamily.InterNetworkV6) continue; list.Add(uipi.Address); } } #endif } catch /*(NotImplementedException ex)*/ { //log.Warn("MONO does not support NetworkInterface.GetAllNetworkInterfaces(). Could not detect local ip subnets.", ex); } return list; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/EnumerableExtensions.cs0000644000175000017500000000646412146506550027562 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Common { public static class EnumerableExtensions { public static bool IsEmpty(this ICollection collection) { return collection == null || collection.Count == 0; } public static HashSet ToHashSet(this IEnumerable items) { return new HashSet(items); } public static List SafeConvertAll(this IEnumerable items, Func converter) { return items == null ? new List() : Extensions.EnumerableExtensions.ConvertAll(items, converter); } public static List ToObjects(this IEnumerable items) { var to = new List(); foreach (var item in items) { to.Add(item); } return to; } public static string FirstNonDefaultOrEmpty(this IEnumerable values) { foreach (var value in values) { if (!string.IsNullOrEmpty(value)) return value; } return null; } public static T FirstNonDefault(this IEnumerable values) { foreach (var value in values) { if (!Equals(value, default(T))) return value; } return default(T); } public static bool EquivalentTo(this IEnumerable thisList, IEnumerable otherList) { if (thisList == null || otherList == null) return thisList == otherList; var otherEnum = otherList.GetEnumerator(); foreach (var item in thisList) { if (!otherEnum.MoveNext()) return false; var thisIsDefault = Equals(item, default(T)); var otherIsDefault = Equals(otherEnum.Current, default(T)); if (thisIsDefault || otherIsDefault) { return thisIsDefault && otherIsDefault; } if (!item.Equals(otherEnum.Current)) return false; } var hasNoMoreLeftAsWell = !otherEnum.MoveNext(); return hasNoMoreLeftAsWell; } public static IEnumerable BatchesOf(this IEnumerable sequence, int batchSize) { var batch = new List(batchSize); foreach (var item in sequence) { batch.Add(item); if (batch.Count >= batchSize) { yield return batch.ToArray(); batch.Clear(); } } if (batch.Count > 0) { yield return batch.ToArray(); batch.Clear(); } } public static Dictionary ToSafeDictionary(this IEnumerable list, Func expr) { var map = new Dictionary(); if (list != null) { foreach (var item in list) { map[expr(item)] = item; } } return map; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ActionExecExtensions.cs0000644000175000017500000000630112146506550027513 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Threading; using ServiceStack.Common.Support; namespace ServiceStack.Common { public static class ActionExecExtensions { public static void ExecAllAndWait(this ICollection actions, TimeSpan timeout) { var waitHandles = new WaitHandle[actions.Count]; var i = 0; foreach (var action in actions) { waitHandles[i++] = action.BeginInvoke(null, null).AsyncWaitHandle; } WaitAll(waitHandles, timeout); } public static List ExecAsync(this IEnumerable actions) { var waitHandles = new List(); foreach (var action in actions) { var waitHandle = new AutoResetEvent(false); waitHandles.Add(waitHandle); var commandExecsHandler = new ActionExecHandler(action, waitHandle); ThreadPool.QueueUserWorkItem(x => ((ActionExecHandler)x).Execute(), commandExecsHandler); } return waitHandles; } public static bool WaitAll(this List waitHandles, int timeoutMs) { return WaitAll(waitHandles.ToArray(), timeoutMs); } public static bool WaitAll(this ICollection waitHandles, int timeoutMs) { return WaitAll(waitHandles.ToArray(), timeoutMs); } public static bool WaitAll(this ICollection waitHandles, TimeSpan timeout) { return WaitAll(waitHandles.ToArray(), (int)timeout.TotalMilliseconds); } #if !SILVERLIGHT && !MONOTOUCH && !XBOX public static bool WaitAll(this List asyncResults, TimeSpan timeout) { var waitHandles = asyncResults.ConvertAll(x => x.AsyncWaitHandle); return WaitAll(waitHandles.ToArray(), (int)timeout.TotalMilliseconds); } public static bool WaitAll(WaitHandle[] waitHandles, TimeSpan timeout) { return WaitAll(waitHandles, (int)timeout.TotalMilliseconds); } public static bool WaitAll(WaitHandle[] waitHandles, int timeOutMs) { // throws an exception if there are no wait handles if (waitHandles == null) throw new ArgumentNullException("waitHandles"); if (waitHandles.Length == 0) return true; if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA) { // WaitAll for multiple handles on an STA thread is not supported. // CurrentThread is ApartmentState.STA when run under unit tests var successfullyComplete = true; foreach (var waitHandle in waitHandles) { successfullyComplete = successfullyComplete && waitHandle.WaitOne(timeOutMs, false); } return successfullyComplete; } return WaitHandle.WaitAll(waitHandles, timeOutMs, false); } #endif } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceStack.Common.csproj0000644000175000017500000004372112652472053030132 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {982416DB-C143-4028-A0C3-CF41892D18D3} Library Properties ServiceStack.Common ServiceStack.Common 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true v4.5 True full False bin\Debug\ DEBUG;TRACE prompt 4 AllRules.ruleset pdbonly True bin\Release\ TRACE prompt 4 AllRules.ruleset bin\Release\ServiceStack.Common.XML True bin\MonoTouch\ DEBUG;TRACE full AnyCPU prompt 4 False AllRules.ruleset True bin\MonoTouch\ TRACE;DEBUG;MONOTOUCH full AnyCPU prompt 4 False AllRules.ruleset Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {579B3FDB-CDAD-44E1-8417-885C38E49A0E} ServiceStack.Text {42E1C8C0-A163-44CC-92B1-8F416F2C0B01} ServiceStack.Interfaces smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/0000755000175000017500000000000012146506550026335 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/HttpMethod.cs0000644000175000017500000000063612146506550030751 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceClient.Web { public static class HttpMethod { public const string Get = "GET"; public const string Post = "POST"; public const string Put = "PUT"; public const string Delete = "DELETE"; public const string Options = "OPTIONS"; public const string Head = "HEAD"; public const string Patch = "PATCH"; } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/WebRequestExtensions.cs0000644000175000017500000001750412146506550033041 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.IO; using System.Net; using System.Text; using ServiceStack.Common; using ServiceStack.Common.Web; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public static class WebRequestExtensions { public static string DownloadJsonFromUrl(this string url) { return url.DownloadUrl(ContentType.Json); } public static string DownloadXmlFromUrl(this string url) { return url.DownloadUrl(ContentType.Xml); } public static string DownloadCsvFromUrl(this string url) { return url.DownloadUrl(ContentType.Csv); } public static string DownloadUrl(this string url, string acceptContentType) { var webReq = (HttpWebRequest)WebRequest.Create(url); webReq.Accept = acceptContentType; using (var webRes = webReq.GetResponse()) return DownloadText(webRes); } public static string DownloadUrl(this string url) { var webReq = WebRequest.Create(url); using (var webRes = webReq.GetResponse()) return DownloadText(webRes); } public static byte[] DownloadBinaryFromUrl(this string url) { var webReq = WebRequest.Create(url); using (var webRes = webReq.GetResponse()) return DownloadBinary(webRes); } public static string PostJsonToUrl(this string url, string data) { return SendToUrl(url, HttpMethod.Post, Encoding.UTF8.GetBytes(data), ContentType.Json, ContentType.Json); } public static string PostJsonToUrl(this string url, object data) { return SendToUrl(url, HttpMethod.Post, Encoding.UTF8.GetBytes(data.ToJson()), ContentType.Json, ContentType.Json); } public static string PostToUrl(this string url, string data, string requestContentType = null, string acceptContentType = null) { return SendToUrl(url, HttpMethod.Post, Encoding.UTF8.GetBytes(data), requestContentType, acceptContentType); } public static string PutToUrl(this string url, string data, string requestContentType = null, string acceptContentType = null) { return SendToUrl(url, HttpMethod.Put, Encoding.UTF8.GetBytes(data), requestContentType, acceptContentType); } public static string PostToUrl(this string url, byte[] data, string requestContentType = null, string acceptContentType = null) { return SendToUrl(url, HttpMethod.Post, data, requestContentType, acceptContentType); } public static string PutToUrl(this string url, byte[] data, string requestContentType = null, string acceptContentType = null) { return SendToUrl(url, HttpMethod.Put, data, requestContentType, acceptContentType); } private static string SendToUrl(string url, string httpMethod, byte[] data, string requestContentType = null, string acceptContentType = null) { var webReq = (HttpWebRequest) WebRequest.Create(url); webReq.Method = httpMethod; if (requestContentType != null) webReq.ContentType = requestContentType; if (acceptContentType != null) webReq.Accept = acceptContentType; try { using (var req = webReq.GetRequestStream()) req.Write(data, 0, data.Length); } catch (Exception ex) { Console.WriteLine("Error sending Request: " + ex); throw; } try { using (var webRes = webReq.GetResponse()) return DownloadText(webRes); } catch (Exception ex) { Console.WriteLine("Error reading Response: " + ex); throw; } } public static string DownloadAsString(this string url) { var webReq = WebRequest.Create(url); using (var webRes = webReq.GetResponse()) return DownloadText(webRes); } public static string DownloadText(this WebResponse webRes) { using (var stream = webRes.GetResponseStream()) using (var reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } public static byte[] DownloadBinary(this WebResponse webRes) { using (var stream = webRes.GetResponseStream()) { return stream.ReadFully(); } } public static HttpWebResponse GetErrorResponse(this string url) { try { var webReq = WebRequest.Create(url); var webRes = webReq.GetResponse(); var strRes = webRes.DownloadText(); Console.WriteLine("Expected error, got: " + strRes); return null; } catch (WebException webEx) { return (HttpWebResponse)webEx.Response; } } public static WebResponse UploadFile(this WebRequest webRequest, FileInfo uploadFileInfo, string uploadFileMimeType) { using (var fileStream = uploadFileInfo.OpenRead()) { var fileName = uploadFileInfo.Name; webRequest.UploadFile(fileStream, fileName, uploadFileMimeType); } return webRequest.GetResponse(); } public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName, string mimeType) { var httpReq = (HttpWebRequest)webRequest; httpReq.UserAgent = Env.ServerUserAgent; httpReq.Method = "POST"; httpReq.AllowAutoRedirect = false; httpReq.KeepAlive = false; var boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); httpReq.ContentType = "multipart/form-data; boundary=" + boundary; var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); var headerTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{0}\"\r\nContent-Type: {1}\r\n\r\n"; var header = string.Format(headerTemplate, fileName, mimeType); var headerbytes = System.Text.Encoding.ASCII.GetBytes(header); httpReq.ContentLength = fileStream.Length + headerbytes.Length + boundarybytes.Length; using (Stream outputStream = httpReq.GetRequestStream()) { outputStream.Write(headerbytes, 0, headerbytes.Length); byte[] buffer = new byte[4096]; int byteCount; while ((byteCount = fileStream.Read(buffer, 0, 4096)) > 0) { outputStream.Write(buffer, 0, byteCount); } outputStream.Write(boundarybytes, 0, boundarybytes.Length); outputStream.Close(); } } public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName) { fileName.ThrowIfNull("fileName"); var mimeType = MimeTypes.GetMimeType(fileName); if (mimeType == null) throw new ArgumentException("Mime-type not found for file: " + fileName); UploadFile(webRequest, fileStream, fileName, mimeType); } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/WcfServiceClient.cs0000644000175000017500000003402512146506550032067 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.IO; using System.Net; using System.Xml; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; using ServiceStack.Common.Utils; using ServiceStack.ServiceInterface.ServiceModel; namespace ServiceStack.ServiceClient.Web { /// /// Adds the singleton instance of to an endpoint on the client. /// /// /// Based on http://megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/ /// public class CookieManagerEndpointBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { return; } /// /// Adds the singleton of the class to the client endpoint's message inspectors. /// /// The endpoint that is to be customized. /// The client runtime to be customized. public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { var cm = CookieManagerMessageInspector.Instance; cm.Uri = endpoint.ListenUri.AbsoluteUri; clientRuntime.MessageInspectors.Add(cm); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { return; } public void Validate(ServiceEndpoint endpoint) { return; } } /// /// Maintains a copy of the cookies contained in the incoming HTTP response received from any service /// and appends it to all outgoing HTTP requests. /// /// /// This class effectively allows to send any received HTTP cookies to different services, /// reproducing the same functionality available in ASMX Web Services proxies with the class. /// Based on http://megakemp.wordpress.com/2009/02/06/managing-shared-cookies-in-wcf/ /// public class CookieManagerMessageInspector : IClientMessageInspector { private static CookieManagerMessageInspector instance; private CookieContainer cookieContainer; public string Uri { get; set; } /// /// Initializes a new instance of the class. /// public CookieManagerMessageInspector() { cookieContainer = new CookieContainer(); Uri = "http://tempuri.org"; } public CookieManagerMessageInspector(string uri) { cookieContainer = new CookieContainer(); Uri = uri; } /// /// Gets the singleton instance. /// public static CookieManagerMessageInspector Instance { get { if (instance == null) { instance = new CookieManagerMessageInspector(); } return instance; } } /// /// Inspects a message after a reply message is received but prior to passing it back to the client application. /// /// The message to be transformed into types and handed back to the client application. /// Correlation state data. public void AfterReceiveReply(ref Message reply, object correlationState) { HttpResponseMessageProperty httpResponse = reply.Properties[HttpResponseMessageProperty.Name] as HttpResponseMessageProperty; if (httpResponse != null) { string cookie = httpResponse.Headers[HttpResponseHeader.SetCookie]; if (!string.IsNullOrEmpty(cookie)) { cookieContainer.SetCookies(new System.Uri(Uri), cookie); } } } /// /// Inspects a message before a request message is sent to a service. /// /// The message to be sent to the service. /// The client object channel. /// /// Null since no message correlation is used. /// public object BeforeSendRequest(ref Message request, IClientChannel channel) { HttpRequestMessageProperty httpRequest; // The HTTP request object is made available in the outgoing message only when // the Visual Studio Debugger is attacched to the running process if (!request.Properties.ContainsKey(HttpRequestMessageProperty.Name)) { request.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty()); } httpRequest = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; httpRequest.Headers.Add(HttpRequestHeader.Cookie, cookieContainer.GetCookieHeader(new System.Uri(Uri))); return null; } } public abstract class WcfServiceClient : IWcfServiceClient { const string XPATH_SOAP_FAULT = "/s:Fault"; const string XPATH_SOAP_FAULT_REASON = "/s:Fault/s:Reason"; const string NAMESPACE_SOAP = "http://www.w3.org/2003/05/soap-envelope"; const string NAMESPACE_SOAP_ALIAS = "s"; public string Uri { get; set; } public abstract void SetProxy(Uri proxyAddress); protected abstract MessageVersion MessageVersion { get; } protected abstract Binding Binding { get; } /// /// Specifies if cookies should be stored /// // CCB Custom public bool StoreCookies { get; set; } public WcfServiceClient() { // CCB Custom this.StoreCookies = true; } private static XmlNamespaceManager GetNamespaceManager(XmlDocument doc) { var nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace(NAMESPACE_SOAP_ALIAS, NAMESPACE_SOAP); return nsmgr; } private static Exception CreateException(Exception e, XmlReader reader) { var doc = new XmlDocument(); doc.Load(reader); var node = doc.SelectSingleNode(XPATH_SOAP_FAULT, GetNamespaceManager(doc)); if (node != null) { string errMsg = null; var nodeReason = doc.SelectSingleNode(XPATH_SOAP_FAULT_REASON, GetNamespaceManager(doc)); if (nodeReason != null) { errMsg = nodeReason.FirstChild.InnerXml; } return new Exception(string.Format("SOAP FAULT '{0}': {1}", errMsg, node.InnerXml), e); } return e; } private ServiceEndpoint SyncReply { get { var contract = new ContractDescription("ServiceStack.ServiceClient.Web.ISyncReply", "http://services.servicestack.net/"); var addr = new EndpointAddress(Uri); var endpoint = new ServiceEndpoint(contract, Binding, addr); return endpoint; } } public Message Send(object request) { return Send(request, request.GetType().Name); } public Message Send(object request, string action) { return Send(Message.CreateMessage(MessageVersion, action, request)); } public Message Send(XmlReader reader, string action) { return Send(Message.CreateMessage(MessageVersion, action, reader)); } public Message Send(Message message) { using (var client = new GenericProxy(SyncReply)) { // CCB Custom...add behavior to propagate cookies across SOAP method calls if (StoreCookies) client.ChannelFactory.Endpoint.Behaviors.Add(new CookieManagerEndpointBehavior()); var response = client.Proxy.Send(message); return response; } } public static T GetBody(Message message) { var buffer = message.CreateBufferedCopy(int.MaxValue); try { return buffer.CreateMessage().GetBody(); } catch (Exception ex) { throw CreateException(ex, buffer.CreateMessage().GetReaderAtBodyContents()); } } public T Send(object request) { try { var responseMsg = Send(request); var response = responseMsg.GetBody(); var responseStatus = GetResponseStatus(response); if (responseStatus != null && !string.IsNullOrEmpty(responseStatus.ErrorCode)) { throw new WebServiceException(responseStatus.Message, null) { StatusCode = 500, ResponseDto = response, StatusDescription = responseStatus.Message, }; } return response; } catch (WebServiceException webEx) { throw; } catch (Exception ex) { var webEx = ex as WebException ?? ex.InnerException as WebException; if (webEx == null) { throw new WebServiceException(ex.Message, ex) { StatusCode = 500, }; } var httpEx = webEx.Response as HttpWebResponse; throw new WebServiceException(webEx.Message, webEx) { StatusCode = httpEx != null ? (int)httpEx.StatusCode : 500 }; } } public ResponseStatus GetResponseStatus(object response) { if (response == null) return null; var hasResponseStatus = response as IHasResponseStatus; if (hasResponseStatus != null) return hasResponseStatus.ResponseStatus; var propertyInfo = response.GetType().GetProperty("ResponseStatus"); if (propertyInfo == null) return null; return ReflectionUtils.GetProperty(response, propertyInfo) as ResponseStatus; } public TResponse PostFile(string relativeOrAbsoluteUrl, FileInfo fileToUpload, string mimeType) { throw new NotImplementedException(); } public TResponse PostFile(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, string mimeType) { throw new NotImplementedException(); } public void SendOneWay(object request) { SendOneWay(request, request.GetType().Name); } public void SendOneWay(string relativeOrAbsoluteUrl, object request) { SendOneWay(Message.CreateMessage(MessageVersion, relativeOrAbsoluteUrl, request)); } public void SendOneWay(object request, string action) { SendOneWay(Message.CreateMessage(MessageVersion, action, request)); } public void SendOneWay(XmlReader reader, string action) { SendOneWay(Message.CreateMessage(MessageVersion, action, reader)); } public void SendOneWay(Message message) { using (var client = new GenericProxy(SyncReply)) { client.Proxy.SendOneWay(message); } } public void SendAsync(object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void SetCredentials(string userName, string password) { throw new NotImplementedException(); } public void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void Dispose() { } public TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, FileInfo fileToUpload, object request) { throw new NotImplementedException(); } public TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, object request) { throw new NotImplementedException(); } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/IDuplex.cs0000644000175000017500000000064612146506550030244 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.ServiceModel; using System.ServiceModel.Channels; namespace ServiceStack.ServiceClient.Web { [ServiceContract(Namespace = "http://services.servicestack.net/", CallbackContract = typeof(IDuplexCallback))] public interface IDuplex { [OperationContract(Action = "*", ReplyAction = "*")] void BeginSend(Message msg); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/IWcfServiceClient.cs0000644000175000017500000000126412146506550032177 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.ServiceModel.Channels; using ServiceStack.Service; using System.Xml; namespace ServiceStack.ServiceClient.Web { public interface IWcfServiceClient : IServiceClient { string Uri { get; set; } void SetProxy(Uri proxyAddress); Message Send(object request); Message Send(object request, string action); Message Send(XmlReader reader, string action); Message Send(Message message); void SendOneWay(object request, string action); void SendOneWay(XmlReader reader, string action); void SendOneWay(Message message); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/JsvRestClientAsync.cs0000644000175000017500000000545012146506550032425 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.Service; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public class JsvRestClientAsync : IRestClientAsync { public const string ContentType = "application/jsv"; public JsvRestClientAsync(string baseUri) : this() { this.BaseUri = baseUri.WithTrailingSlash(); } public JsvRestClientAsync() { this.client = new AsyncServiceClient { ContentType = ContentType, StreamSerializer = SerializeToStream, StreamDeserializer = TypeSerializer.DeserializeFromStream }; } public TimeSpan? Timeout { get { return this.client.Timeout; } set { this.client.Timeout = value; } } private static void SerializeToStream(IRequestContext requestContext, object dto, Stream stream) { TypeSerializer.SerializeToStream(dto, stream); } private readonly AsyncServiceClient client; public string BaseUri { get; set; } public void SetCredentials(string userName, string password) { this.client.SetCredentials(userName, password); } private string GetUrl(string relativeOrAbsoluteUrl) { return relativeOrAbsoluteUrl.StartsWith("http:") || relativeOrAbsoluteUrl.StartsWith("https:") ? relativeOrAbsoluteUrl : this.BaseUri + relativeOrAbsoluteUrl; } public void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Get, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Delete, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Post, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Put, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public void Dispose() {} } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/XLinqExtensions.cs0000644000175000017500000002166012146506550032004 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX // // ServiceStack: Useful extensions to simplify parsing xml with XLinq // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2010 Liquidbit Ltd. // // Licensed under the same terms of reddis and ServiceStack: new BSD license. // using System; using System.Collections.Generic; using System.Xml; using System.Xml.Linq; namespace ServiceStack.ServiceModel.Extensions { public static class XLinqExtensions { public static string GetString(this XElement el, string name) { return el == null ? null : GetElementValueOrDefault(el, name, x => x.Value); } public static bool GetBool(this XElement el, string name) { AssertElementHasValue(el, name); return (bool)GetElement(el, name); } public static bool GetBoolOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (bool)x); } public static bool? GetNullableBool(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (bool?)childEl; } public static int GetInt(this XElement el, string name) { AssertElementHasValue(el, name); return (int)GetElement(el, name); } public static int GetIntOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (int) x); } public static int? GetNullableInt(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (int?) childEl; } public static long GetLong(this XElement el, string name) { AssertElementHasValue(el, name); return (long)GetElement(el, name); } public static long GetLongOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (long)x); } public static long? GetNullableLong(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (long?)childEl; } public static decimal GetDecimal(this XElement el, string name) { AssertElementHasValue(el, name); return (decimal)GetElement(el, name); } public static decimal GetDecimalOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (decimal)x); } public static decimal? GetNullableDecimal(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (decimal?)childEl; } public static DateTime GetDateTime(this XElement el, string name) { AssertElementHasValue(el, name); return (DateTime)GetElement(el, name); } public static DateTime GetDateTimeOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (DateTime)x); } public static DateTime? GetNullableDateTime(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (DateTime?)childEl; } public static TimeSpan GetTimeSpan(this XElement el, string name) { AssertElementHasValue(el, name); return (TimeSpan)GetElement(el, name); } public static TimeSpan GetTimeSpanOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (TimeSpan)x); } public static TimeSpan? GetNullableTimeSpan(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (TimeSpan?)childEl; } public static Guid GetGuid(this XElement el, string name) { AssertElementHasValue(el, name); return (Guid)GetElement(el, name); } public static Guid GetGuidOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (Guid)x); } public static Guid? GetNullableGuid(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (Guid?)childEl; } public static T GetElementValueOrDefault(this XElement element, string name, Func converter) { if (converter == null) { throw new ArgumentNullException("converter"); } var el = GetElement(element, name); return el == null || string.IsNullOrEmpty(el.Value) ? default(T) : converter(el); } public static XElement GetElement(this XElement element, string name) { if (element == null) { throw new ArgumentNullException("element"); } if (name == null) { throw new ArgumentNullException("name"); } return element.AnyElement(name); } public static void AssertElementHasValue(this XElement element, string name) { if (element == null) { throw new ArgumentNullException("element"); } if (name == null) { throw new ArgumentNullException("name"); } var childEl = element.AnyElement(name); if (childEl == null || string.IsNullOrEmpty(childEl.Value)) { throw new ArgumentNullException(name, string.Format("{0} is required", name)); } } public static List GetValues(this IEnumerable els) { var values = new List(); foreach (var el in els) { values.Add(el.Value); } return values; } public static XAttribute AnyAttribute(this XElement element, string name) { if (element == null) return null; foreach (var attribute in element.Attributes()) { if (attribute.Name.LocalName == name) { return attribute; } } return null; } public static IEnumerable AllElements(this XElement element, string name) { var els = new List(); if (element == null) return els; foreach (var node in element.Nodes()) { if (node.NodeType != XmlNodeType.Element) continue; var childEl = (XElement)node; if (childEl.Name.LocalName == name) { els.Add(childEl); } } return els; } public static XElement AnyElement(this XElement element, string name) { if (element == null) return null; foreach (var node in element.Nodes()) { if (node.NodeType != XmlNodeType.Element) continue; var childEl = (XElement)node; if (childEl.Name.LocalName == name) { return childEl; } } return null; } public static XElement AnyElement(this IEnumerable elements, string name) { foreach (var element in elements) { if (element.Name.LocalName == name) { return element; } } return null; } public static IEnumerable AllElements(this IEnumerable elements, string name) { var els = new List(); foreach (var element in elements) { els.AddRange(AllElements(element, name)); } return els; } public static XElement FirstElement(this XElement element) { if (element.FirstNode.NodeType == XmlNodeType.Element) { return (XElement) element.FirstNode; } return null; } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/JsonServiceClient.cs0000644000175000017500000000257712146506550032270 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.ServiceHost; using ServiceStack.ServiceModel.Serialization; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public class JsonServiceClient : ServiceClientBase { public override string Format { get { return "json"; } } public JsonServiceClient() { } public JsonServiceClient(string baseUri) { SetBaseUri(baseUri); } public JsonServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri) : base(syncReplyBaseUri, asyncOneWayBaseUri) { } public override string ContentType { get { return String.Format("application/{0}", Format); } } public override void SerializeToStream(IRequestContext requestContext, object request, Stream stream) { JsonDataContractSerializer.Instance.SerializeToStream(request, stream); } public override T DeserializeFromStream(Stream stream) { return JsonDataContractDeserializer.Instance.DeserializeFromStream(stream); } public override StreamDeserializerDelegate StreamDeserializer { get { return JsonSerializer.DeserializeFromStream; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/IDuplexCallback.cs0000644000175000017500000000061212146506550031652 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.ServiceModel; using System.ServiceModel.Channels; namespace ServiceStack.ServiceClient.Web { [ServiceContract(Namespace = "http://services.servicestack.net/")] public interface IDuplexCallback { [OperationContract(Action = "*", ReplyAction = "*")] void OnMessageReceived(Message msg); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/AsyncServiceClient.cs0000644000175000017500000005076212146506550032433 0ustar00meebeymeebey00000000000000using System; using System.IO; using System.Net; using System.Text; using System.Threading; using ServiceStack.Logging; using ServiceStack.ServiceHost; using ServiceStack.Text; using ServiceStack.Common.Web; namespace ServiceStack.ServiceClient.Web { /** * Need to provide async request options * http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx */ public class AsyncServiceClient { private static readonly ILog Log = LogManager.GetLogger(typeof(AsyncServiceClient)); private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(60); private HttpWebRequest _webRequest = null; /// /// The request filter is called before any request. /// This request filter is executed globally. /// public static Action HttpWebRequestFilter { get; set; } /// /// The response action is called once the server response is available. /// It will allow you to access raw response information. /// This response action is executed globally. /// Note that you should NOT consume the response stream as this is handled by ServiceStack /// public static Action HttpWebResponseFilter { get; set; } /// /// Called before request resend, when the initial request required authentication /// public Action OnAuthenticationRequired { get; set; } const int BufferSize = 4096; public ICredentials Credentials { get; set; } public bool StoreCookies { get; set; } public CookieContainer CookieContainer { get; set; } /// /// The request filter is called before any request. /// This request filter only works with the instance where it was set (not global). /// public Action LocalHttpWebRequestFilter { get; set; } /// /// The response action is called once the server response is available. /// It will allow you to access raw response information. /// Note that you should NOT consume the response stream as this is handled by ServiceStack /// public Action LocalHttpWebResponseFilter { get; set; } public string BaseUri { get; set; } internal class RequestState : IDisposable { private bool _timedOut; // Pass the correct error back even on Async Calls public RequestState() { BufferRead = new byte[BufferSize]; TextData = new StringBuilder(); BytesData = new MemoryStream(BufferSize); WebRequest = null; ResponseStream = null; } public string HttpMethod; public string Url; public StringBuilder TextData; public MemoryStream BytesData; public byte[] BufferRead; public object Request; public HttpWebRequest WebRequest; public HttpWebResponse WebResponse; public Stream ResponseStream; public int Completed; public int RequestCount; public Timer Timer; public Action OnSuccess; public Action OnError; #if SILVERLIGHT public bool HandleCallbackOnUIThread { get; set; } #endif public void HandleSuccess(TResponse response) { if (this.OnSuccess == null) return; #if SILVERLIGHT if (this.HandleCallbackOnUIThread) System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => this.OnSuccess(response)); else this.OnSuccess(response); #else this.OnSuccess(response); #endif } public void HandleError(TResponse response, Exception ex) { if (this.OnError == null) return; Exception toReturn = ex; if (_timedOut) { #if SILVERLIGHT WebException we = new WebException("The request timed out", ex, WebExceptionStatus.RequestCanceled, null); #else WebException we = new WebException("The request timed out", ex, WebExceptionStatus.Timeout, null); #endif toReturn = we; } #if SILVERLIGHT if (this.HandleCallbackOnUIThread) System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => this.OnError(response, toReturn)); else this.OnError(response, toReturn); #else OnError(response, toReturn); #endif } public void StartTimer(TimeSpan timeOut) { this.Timer = new Timer(this.TimedOut, this, (int)timeOut.TotalMilliseconds, System.Threading.Timeout.Infinite); } public void TimedOut(object state) { if (Interlocked.Increment(ref Completed) == 1) { if (this.WebRequest != null) { _timedOut = true; this.WebRequest.Abort(); } } this.Timer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); this.Timer.Dispose(); this.Dispose(); } public void Dispose() { if (this.BytesData == null) return; this.BytesData.Dispose(); this.BytesData = null; } } public bool DisableAutoCompression { get; set; } public string UserName { get; set; } public string Password { get; set; } public void SetCredentials(string userName, string password) { this.UserName = userName; this.Password = password; } public TimeSpan? Timeout { get; set; } public string ContentType { get; set; } public StreamSerializerDelegate StreamSerializer { get; set; } public StreamDeserializerDelegate StreamDeserializer { get; set; } #if SILVERLIGHT public bool HandleCallbackOnUIThread { get; set; } public bool UseBrowserHttpHandling { get; set; } public bool ShareCookiesWithBrowser { get; set; } #endif public void SendAsync(string httpMethod, string absoluteUrl, object request, Action onSuccess, Action onError) { SendWebRequest(httpMethod, absoluteUrl, request, onSuccess, onError); } public void CancelAsync() { if (_webRequest != null) { // Request will be nulled after it throws an exception on its async methods // See - http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort _webRequest.Abort(); } } #if !SILVERLIGHT internal static void AllowAutoCompression(HttpWebRequest webRequest) { webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; } #endif private RequestState SendWebRequest(string httpMethod, string absoluteUrl, object request, Action onSuccess, Action onError) { if (httpMethod == null) throw new ArgumentNullException("httpMethod"); var requestUri = absoluteUrl; var httpGetOrDelete = (httpMethod == "GET" || httpMethod == "DELETE"); var hasQueryString = request != null && httpGetOrDelete; if (hasQueryString) { var queryString = QueryStringSerializer.SerializeToString(request); if (!string.IsNullOrEmpty(queryString)) { requestUri += "?" + queryString; } } #if SILVERLIGHT var creator = this.UseBrowserHttpHandling ? System.Net.Browser.WebRequestCreator.BrowserHttp : System.Net.Browser.WebRequestCreator.ClientHttp; var webRequest = (HttpWebRequest) creator.Create(new Uri(requestUri)); if (StoreCookies && !UseBrowserHttpHandling) { if (ShareCookiesWithBrowser) { if (CookieContainer == null) CookieContainer = new CookieContainer(); CookieContainer.SetCookies(new Uri(BaseUri), System.Windows.Browser.HtmlPage.Document.Cookies); } webRequest.CookieContainer = CookieContainer; } #else _webRequest = (HttpWebRequest)WebRequest.Create(requestUri); if (StoreCookies) { _webRequest.CookieContainer = CookieContainer; } #endif #if !SILVERLIGHT if (!DisableAutoCompression) { _webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); _webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; } #endif var requestState = new RequestState { HttpMethod = httpMethod, Url = requestUri, #if SILVERLIGHT WebRequest = webRequest, #else WebRequest = _webRequest, #endif Request = request, OnSuccess = onSuccess, OnError = onError, #if SILVERLIGHT HandleCallbackOnUIThread = HandleCallbackOnUIThread, #endif }; requestState.StartTimer(this.Timeout.GetValueOrDefault(DefaultTimeout)); #if SILVERLIGHT SendWebRequestAsync(httpMethod, request, requestState, webRequest); #else SendWebRequestAsync(httpMethod, request, requestState, _webRequest); #endif return requestState; } private void SendWebRequestAsync(string httpMethod, object request, RequestState requestState, HttpWebRequest webRequest) { var httpGetOrDelete = (httpMethod == "GET" || httpMethod == "DELETE"); webRequest.Accept = string.Format("{0}, */*", ContentType); #if !SILVERLIGHT webRequest.Method = httpMethod; #else //Methods others than GET and POST are only supported by Client request creator, see //http://msdn.microsoft.com/en-us/library/cc838250(v=vs.95).aspx if (this.UseBrowserHttpHandling && httpMethod != "GET" && httpMethod != "POST") { webRequest.Method = "POST"; webRequest.Headers[HttpHeaders.XHttpMethodOverride] = httpMethod; } else { webRequest.Method = httpMethod; } #endif if (this.Credentials != null) { webRequest.Credentials = this.Credentials; } ApplyWebRequestFilters(webRequest); try { if (!httpGetOrDelete && request != null) { webRequest.ContentType = ContentType; webRequest.BeginGetRequestStream(RequestCallback, requestState); } else { requestState.WebRequest.BeginGetResponse(ResponseCallback, requestState); } } catch (Exception ex) { // BeginGetRequestStream can throw if request was aborted HandleResponseError(ex, requestState); } } private void RequestCallback(IAsyncResult asyncResult) { var requestState = (RequestState)asyncResult.AsyncState; try { var req = requestState.WebRequest; var postStream = req.EndGetRequestStream(asyncResult); StreamSerializer(null, requestState.Request, postStream); postStream.Close(); requestState.WebRequest.BeginGetResponse(ResponseCallback, requestState); } catch (Exception ex) { HandleResponseError(ex, requestState); } } private void ResponseCallback(IAsyncResult asyncResult) { var requestState = (RequestState)asyncResult.AsyncState; try { var webRequest = requestState.WebRequest; requestState.WebResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult); ApplyWebResponseFilters(requestState.WebResponse); // Read the response into a Stream object. var responseStream = requestState.WebResponse.GetResponseStream(); requestState.ResponseStream = responseStream; responseStream.BeginRead(requestState.BufferRead, 0, BufferSize, ReadCallBack, requestState); return; } catch (Exception ex) { var firstCall = Interlocked.Increment(ref requestState.RequestCount) == 1; if (firstCall && WebRequestUtils.ShouldAuthenticate(ex, this.UserName, this.Password)) { try { requestState.WebRequest = (HttpWebRequest)WebRequest.Create(requestState.Url); requestState.WebRequest.AddBasicAuth(this.UserName, this.Password); if (OnAuthenticationRequired != null) { OnAuthenticationRequired(requestState.WebRequest); } SendWebRequestAsync( requestState.HttpMethod, requestState.Request, requestState, requestState.WebRequest); } catch (Exception /*subEx*/) { HandleResponseError(ex, requestState); } return; } HandleResponseError(ex, requestState); } } private void ReadCallBack(IAsyncResult asyncResult) { var requestState = (RequestState)asyncResult.AsyncState; try { var responseStream = requestState.ResponseStream; int read = responseStream.EndRead(asyncResult); if (read > 0) { requestState.BytesData.Write(requestState.BufferRead, 0, read); responseStream.BeginRead( requestState.BufferRead, 0, BufferSize, ReadCallBack, requestState); return; } Interlocked.Increment(ref requestState.Completed); var response = default(T); try { requestState.BytesData.Position = 0; using (var reader = requestState.BytesData) { response = (T)this.StreamDeserializer(typeof(T), reader); } #if SILVERLIGHT if (this.StoreCookies && this.ShareCookiesWithBrowser && !this.UseBrowserHttpHandling) { // browser cookies must be set on the ui thread System.Windows.Deployment.Current.Dispatcher.BeginInvoke( () => { var cookieHeader = this.CookieContainer.GetCookieHeader(new Uri(BaseUri)); System.Windows.Browser.HtmlPage.Document.Cookies = cookieHeader; }); } #endif requestState.HandleSuccess(response); } catch (Exception ex) { Log.Debug(string.Format("Error Reading Response Error: {0}", ex.Message), ex); requestState.HandleError(default(T), ex); } finally { responseStream.Close(); _webRequest = null; } } catch (Exception ex) { HandleResponseError(ex, requestState); } } private void HandleResponseError(Exception exception, RequestState requestState) { var webEx = exception as WebException; if (webEx != null #if !SILVERLIGHT && webEx.Status == WebExceptionStatus.ProtocolError #endif ) { var errorResponse = ((HttpWebResponse)webEx.Response); Log.Error(webEx); Log.DebugFormat("Status Code : {0}", errorResponse.StatusCode); Log.DebugFormat("Status Description : {0}", errorResponse.StatusDescription); var serviceEx = new WebServiceException(errorResponse.StatusDescription) { StatusCode = (int)errorResponse.StatusCode, }; try { using (var stream = errorResponse.GetResponseStream()) { //Uncomment to Debug exceptions: //var strResponse = new StreamReader(stream).ReadToEnd(); //Console.WriteLine("Response: " + strResponse); //stream.Position = 0; serviceEx.ResponseDto = this.StreamDeserializer(typeof(TResponse), stream); requestState.HandleError((TResponse)serviceEx.ResponseDto, serviceEx); } } catch (Exception innerEx) { // Oh, well, we tried Log.Debug(string.Format("WebException Reading Response Error: {0}", innerEx.Message), innerEx); requestState.HandleError(default(TResponse), new WebServiceException(errorResponse.StatusDescription, innerEx) { StatusCode = (int)errorResponse.StatusCode, }); } return; } var authEx = exception as AuthenticationException; if (authEx != null) { var customEx = WebRequestUtils.CreateCustomException(requestState.Url, authEx); Log.Debug(string.Format("AuthenticationException: {0}", customEx.Message), customEx); requestState.HandleError(default(TResponse), authEx); } Log.Debug(string.Format("Exception Reading Response Error: {0}", exception.Message), exception); requestState.HandleError(default(TResponse), exception); _webRequest = null; } private void ApplyWebResponseFilters(WebResponse webResponse) { if (!(webResponse is HttpWebResponse)) return; if (HttpWebResponseFilter != null) HttpWebResponseFilter((HttpWebResponse)webResponse); if (LocalHttpWebResponseFilter != null) LocalHttpWebResponseFilter((HttpWebResponse)webResponse); } private void ApplyWebRequestFilters(HttpWebRequest client) { if (LocalHttpWebRequestFilter != null) LocalHttpWebRequestFilter(client); if (HttpWebRequestFilter != null) HttpWebRequestFilter(client); } public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/IOneWay.cs0000644000175000017500000000060012146506550030173 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.ServiceModel; using System.ServiceModel.Channels; namespace ServiceStack.ServiceClient.Web { [ServiceContract(Namespace = "http://services.servicestack.net/")] public interface IOneWay { [OperationContract(Action = "*", IsOneWay = true)] void SendOneWay(Message requestMsg); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/ServiceClientBase.cs0000644000175000017500000007646312146506550032236 0ustar00meebeymeebey00000000000000using System; using System.IO; using System.Net; #if !(MONOTOUCH || SILVERLIGHT) using System.Web; #endif using ServiceStack.Common; using ServiceStack.Common.Web; using ServiceStack.Logging; using ServiceStack.Service; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { /** * Need to provide async request options * http://msdn.microsoft.com/en-us/library/86wf6409(VS.71).aspx */ public abstract class ServiceClientBase #if !SILVERLIGHT : IServiceClient, IRestClient #else : IServiceClient #endif { private static readonly ILog log = LogManager.GetLogger(typeof(ServiceClientBase)); /// /// The request filter is called before any request. /// This request filter is executed globally. /// private static Action httpWebRequestFilter; public static Action HttpWebRequestFilter { get { return httpWebRequestFilter; } set { httpWebRequestFilter = value; AsyncServiceClient.HttpWebRequestFilter = value; } } /// /// The response action is called once the server response is available. /// It will allow you to access raw response information. /// This response action is executed globally. /// Note that you should NOT consume the response stream as this is handled by ServiceStack /// private static Action httpWebResponseFilter; public static Action HttpWebResponseFilter { get { return httpWebResponseFilter; } set { httpWebResponseFilter = value; AsyncServiceClient.HttpWebResponseFilter = value; } } public const string DefaultHttpMethod = "POST"; readonly AsyncServiceClient asyncClient; protected ServiceClientBase() { this.HttpMethod = DefaultHttpMethod; this.CookieContainer = new CookieContainer(); asyncClient = new AsyncServiceClient { ContentType = ContentType, StreamSerializer = SerializeToStream, StreamDeserializer = StreamDeserializer, CookieContainer = this.CookieContainer, UserName = this.UserName, Password = this.Password, LocalHttpWebRequestFilter = this.LocalHttpWebRequestFilter, LocalHttpWebResponseFilter = this.LocalHttpWebResponseFilter }; this.StoreCookies = true; //leave #if SILVERLIGHT asyncClient.HandleCallbackOnUIThread = this.HandleCallbackOnUIThread = true; asyncClient.UseBrowserHttpHandling = this.UseBrowserHttpHandling = false; asyncClient.ShareCookiesWithBrowser = this.ShareCookiesWithBrowser = true; #endif } protected ServiceClientBase(string syncReplyBaseUri, string asyncOneWayBaseUri) : this() { this.SyncReplyBaseUri = syncReplyBaseUri; this.AsyncOneWayBaseUri = asyncOneWayBaseUri; } /// /// Sets all baseUri properties, using the Format property for the SyncReplyBaseUri and AsyncOneWayBaseUri /// /// Base URI of the service public void SetBaseUri(string baseUri) { this.BaseUri = baseUri; this.asyncClient.BaseUri = baseUri; this.SyncReplyBaseUri = baseUri.WithTrailingSlash() + Format + "/syncreply/"; this.AsyncOneWayBaseUri = baseUri.WithTrailingSlash() + Format + "/asynconeway/"; } /// /// Sets all baseUri properties allowing for a temporary override of the Format property /// /// Base URI of the service /// Override of the Format property for the service //Marked obsolete on 4/11/2012 [Obsolete("Please call the SetBaseUri(string baseUri) method, which uses the specific implementation's Format property.")] public void SetBaseUri(string baseUri, string format) { this.BaseUri = baseUri; this.asyncClient.BaseUri = baseUri; this.SyncReplyBaseUri = baseUri.WithTrailingSlash() + format + "/syncreply/"; this.AsyncOneWayBaseUri = baseUri.WithTrailingSlash() + format + "/asynconeway/"; } private bool _disableAutoCompression; /// /// Whether to Accept Gzip,Deflate Content-Encoding and to auto decompress responses /// public bool DisableAutoCompression { get { return _disableAutoCompression; } set { _disableAutoCompression = value; asyncClient.DisableAutoCompression = value; } } private string _username; /// /// The user name for basic authentication /// public string UserName { get { return _username; } set { _username = value; asyncClient.UserName = value; } } private string _password; /// /// The password for basic authentication /// public string Password { get { return _password; } set { _password = value; asyncClient.Password = value; } } /// /// Sets the username and the password for basic authentication. /// public void SetCredentials(string userName, string password) { this.UserName = userName; this.Password = password; } public string BaseUri { get; set; } public abstract string Format { get; } public string SyncReplyBaseUri { get; set; } public string AsyncOneWayBaseUri { get; set; } private TimeSpan? timeout; public TimeSpan? Timeout { get { return this.timeout; } set { this.timeout = value; this.asyncClient.Timeout = value; } } public abstract string ContentType { get; } public string HttpMethod { get; set; } #if !SILVERLIGHT public IWebProxy Proxy { get; set; } #endif #if SILVERLIGHT private bool handleCallbackOnUiThread; public bool HandleCallbackOnUIThread { get { return this.handleCallbackOnUiThread; } set { asyncClient.HandleCallbackOnUIThread = this.handleCallbackOnUiThread = value; } } private bool useBrowserHttpHandling; public bool UseBrowserHttpHandling { get { return this.useBrowserHttpHandling; } set { asyncClient.UseBrowserHttpHandling = this.useBrowserHttpHandling = value; } } private bool shareCookiesWithBrowser; public bool ShareCookiesWithBrowser { get { return this.shareCookiesWithBrowser; } set { asyncClient.ShareCookiesWithBrowser = this.shareCookiesWithBrowser = value; } } #endif private ICredentials credentials; /// /// Gets or sets authentication information for the request. /// Warning: It's recommened to use and for basic auth. /// This property is only used for IIS level authentication. /// public ICredentials Credentials { set { this.credentials = value; this.asyncClient.Credentials = value; } } /// /// Determines if the basic auth header should be sent with every request. /// By default, the basic auth header is only sent when "401 Unauthorized" is returned. /// public bool AlwaysSendBasicAuthHeader { get; set; } /// /// Specifies if cookies should be stored /// private bool storeCookies; public bool StoreCookies { get { return storeCookies; } set { asyncClient.StoreCookies = storeCookies = value; } } public CookieContainer CookieContainer { get; set; } /// /// Called before request resend, when the initial request required authentication /// private Action onAuthenticationRequired { get; set; } public Action OnAuthenticationRequired { get { return onAuthenticationRequired; } set { onAuthenticationRequired = value; asyncClient.OnAuthenticationRequired = value; } } /// /// The request filter is called before any request. /// This request filter only works with the instance where it was set (not global). /// private Action localHttpWebRequestFilter { get; set; } public Action LocalHttpWebRequestFilter { get { return localHttpWebRequestFilter; } set { localHttpWebRequestFilter = value; asyncClient.LocalHttpWebRequestFilter = value; } } /// /// The response action is called once the server response is available. /// It will allow you to access raw response information. /// Note that you should NOT consume the response stream as this is handled by ServiceStack /// private Action localHttpWebResponseFilter { get; set; } public Action LocalHttpWebResponseFilter { get { return localHttpWebResponseFilter; } set { localHttpWebResponseFilter = value; asyncClient.LocalHttpWebResponseFilter = value; } } public abstract void SerializeToStream(IRequestContext requestContext, object request, Stream stream); public abstract T DeserializeFromStream(Stream stream); public abstract StreamDeserializerDelegate StreamDeserializer { get; } #if !SILVERLIGHT public virtual TResponse Send(object request) { var requestUri = this.SyncReplyBaseUri.WithTrailingSlash() + request.GetType().Name; var client = SendRequest(requestUri, request); try { var webResponse = client.GetResponse(); return HandleResponse(webResponse); } catch (Exception ex) { TResponse response; if (!HandleResponseException(ex, requestUri, () => SendRequest(Web.HttpMethod.Post, requestUri, request), c => c.GetResponse(), out response)) { throw; } return response; } } private bool HandleResponseException(Exception ex, string requestUri, Func createWebRequest, Func getResponse, out TResponse response) { try { if (WebRequestUtils.ShouldAuthenticate(ex, this.UserName, this.Password)) { var client = createWebRequest(); client.AddBasicAuth(this.UserName, this.Password); if (OnAuthenticationRequired != null) { OnAuthenticationRequired(client); } var webResponse = getResponse(client); response = HandleResponse(webResponse); return true; } } catch (Exception subEx) { // Since we are effectively re-executing the call, // the new exception should be shown to the caller rather // than the old one. // The new exception is either this one or the one thrown // by the following method. HandleResponseException(subEx, requestUri); throw; } // If this doesn't throw, the calling method // should rethrow the original exception upon // return value of false. HandleResponseException(ex, requestUri); response = default(TResponse); return false; } private void HandleResponseException(Exception ex, string requestUri) { var webEx = ex as WebException; if (webEx != null && webEx.Status == WebExceptionStatus.ProtocolError) { var errorResponse = ((HttpWebResponse)webEx.Response); log.Error(webEx); log.DebugFormat("Status Code : {0}", errorResponse.StatusCode); log.DebugFormat("Status Description : {0}", errorResponse.StatusDescription); var serviceEx = new WebServiceException(errorResponse.StatusDescription) { StatusCode = (int)errorResponse.StatusCode, StatusDescription = errorResponse.StatusDescription, }; try { if (errorResponse.ContentType.MatchesContentType(ContentType)) { using (var stream = errorResponse.GetResponseStream()) { serviceEx.ResponseDto = DeserializeFromStream(stream); } } else { serviceEx.ResponseBody = errorResponse.GetResponseStream().ReadFully().FromUtf8Bytes(); } } catch (Exception innerEx) { // Oh, well, we tried throw new WebServiceException(errorResponse.StatusDescription, innerEx) { StatusCode = (int)errorResponse.StatusCode, StatusDescription = errorResponse.StatusDescription, }; } //Escape deserialize exception handling and throw here throw serviceEx; } var authEx = ex as AuthenticationException; if (authEx != null) { throw WebRequestUtils.CreateCustomException(requestUri, authEx); } } private WebRequest SendRequest(string requestUri, object request) { return SendRequest(HttpMethod ?? DefaultHttpMethod, requestUri, request); } private WebRequest SendRequest(string httpMethod, string requestUri, object request) { return PrepareWebRequest(httpMethod, requestUri, request, client => { using (var requestStream = client.GetRequestStream()) { SerializeToStream(null, request, requestStream); } }); } private WebRequest PrepareWebRequest(string httpMethod, string requestUri, object request, Action sendRequestAction) { if (httpMethod == null) throw new ArgumentNullException("httpMethod"); if (httpMethod == Web.HttpMethod.Get && request != null) { var queryString = QueryStringSerializer.SerializeToString(request); if (!string.IsNullOrEmpty(queryString)) { requestUri += "?" + queryString; } } var client = (HttpWebRequest)WebRequest.Create(requestUri); try { client.Accept = ContentType; client.Method = httpMethod; if (Proxy != null) client.Proxy = Proxy; if (this.Timeout.HasValue) client.Timeout = (int)this.Timeout.Value.TotalMilliseconds; if (this.credentials != null) client.Credentials = this.credentials; if (this.AlwaysSendBasicAuthHeader) client.AddBasicAuth(this.UserName, this.Password); if (!DisableAutoCompression) { client.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); client.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; } if (StoreCookies) { client.CookieContainer = CookieContainer; } ApplyWebRequestFilters(client); if (httpMethod != Web.HttpMethod.Get && httpMethod != Web.HttpMethod.Delete) { client.ContentType = ContentType; if (sendRequestAction != null) sendRequestAction(client); } } catch (AuthenticationException ex) { throw WebRequestUtils.CreateCustomException(requestUri, ex) ?? ex; } return client; } private void ApplyWebResponseFilters(WebResponse webResponse) { if (!(webResponse is HttpWebResponse)) return; if (HttpWebResponseFilter != null) HttpWebResponseFilter((HttpWebResponse)webResponse); if (LocalHttpWebResponseFilter != null) LocalHttpWebResponseFilter((HttpWebResponse)webResponse); } private void ApplyWebRequestFilters(HttpWebRequest client) { if (LocalHttpWebRequestFilter != null) LocalHttpWebRequestFilter(client); if (HttpWebRequestFilter != null) HttpWebRequestFilter(client); } #else private void SendRequest(string requestUri, object request, Action callback) { var isHttpGet = HttpMethod != null && HttpMethod.ToUpper() == "GET"; if (isHttpGet) { var queryString = QueryStringSerializer.SerializeToString(request); if (!string.IsNullOrEmpty(queryString)) { requestUri += "?" + queryString; } } SendRequest(HttpMethod ?? DefaultHttpMethod, requestUri, request, callback); } private void SendRequest(string httpMethod, string requestUri, object request, Action callback) { if (httpMethod == null) throw new ArgumentNullException("httpMethod"); var client = (HttpWebRequest)WebRequest.Create(requestUri); try { client.Accept = ContentType; client.Method = httpMethod; if (this.credentials != null) client.Credentials = this.credentials; if (this.AlwaysSendBasicAuthHeader) client.AddBasicAuth(this.UserName, this.Password); if (StoreCookies) { client.CookieContainer = CookieContainer; } if (this.LocalHttpWebRequestFilter != null) LocalHttpWebRequestFilter(client); if (HttpWebRequestFilter != null) HttpWebRequestFilter(client); if (httpMethod != Web.HttpMethod.Get && httpMethod != Web.HttpMethod.Delete) { client.ContentType = ContentType; client.BeginGetRequestStream(delegate(IAsyncResult target) { var webReq = (HttpWebRequest)target.AsyncState; var requestStream = webReq.EndGetRequestStream(target); SerializeToStream(null, request, requestStream); callback(client); }, null); } } catch (AuthenticationException ex) { throw WebRequestUtils.CreateCustomException(requestUri, ex) ?? ex; } } #endif private string GetUrl(string relativeOrAbsoluteUrl) { return relativeOrAbsoluteUrl.StartsWith("http:") || relativeOrAbsoluteUrl.StartsWith("https:") ? relativeOrAbsoluteUrl : this.BaseUri.CombineWith(relativeOrAbsoluteUrl); } #if !SILVERLIGHT private byte[] DownloadBytes(string requestUri, object request) { var webRequest = SendRequest(requestUri, request); using (var response = webRequest.GetResponse()) { ApplyWebResponseFilters(response); using (var stream = response.GetResponseStream()) return stream.ReadFully(); } } #else private void DownloadBytes(string requestUri, object request, Action callback = null) { SendRequest(requestUri, request, webRequest => webRequest.BeginGetResponse(delegate(IAsyncResult result) { var webReq = (HttpWebRequest)result.AsyncState; var response = (HttpWebResponse)webReq.EndGetResponse(result); using (var stream = response.GetResponseStream()) { var bytes = stream.ReadFully(); if (callback != null) { callback(bytes); } } }, null)); } #endif public virtual void SendOneWay(object request) { var requestUri = this.AsyncOneWayBaseUri.WithTrailingSlash() + request.GetType().Name; DownloadBytes(requestUri, request); } public virtual void SendOneWay(string relativeOrAbsoluteUrl, object request) { var requestUri = GetUrl(relativeOrAbsoluteUrl); DownloadBytes(requestUri, request); } public virtual void SendAsync(object request, Action onSuccess, Action onError) { var requestUri = this.SyncReplyBaseUri.WithTrailingSlash() + request.GetType().Name; asyncClient.SendAsync(Web.HttpMethod.Post, requestUri, request, onSuccess, onError); } public virtual void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { asyncClient.SendAsync(Web.HttpMethod.Get, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public virtual void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { asyncClient.SendAsync(Web.HttpMethod.Delete, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public virtual void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { asyncClient.SendAsync(Web.HttpMethod.Post, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public virtual void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { asyncClient.SendAsync(Web.HttpMethod.Put, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public virtual void CancelAsync() { asyncClient.CancelAsync(); } #if !SILVERLIGHT public virtual TResponse Send(string httpMethod, string relativeOrAbsoluteUrl, object request) { var requestUri = GetUrl(relativeOrAbsoluteUrl); var client = SendRequest(httpMethod, requestUri, request); try { var webResponse = client.GetResponse(); return HandleResponse(webResponse); } catch (Exception ex) { TResponse response; if (!HandleResponseException(ex, requestUri, () => SendRequest(httpMethod, requestUri, request), c => c.GetResponse(), out response)) { throw; } return response; } } public virtual TResponse Get(string relativeOrAbsoluteUrl) { return Send(Web.HttpMethod.Get, relativeOrAbsoluteUrl, null); } public virtual TResponse Delete(string relativeOrAbsoluteUrl) { return Send(Web.HttpMethod.Delete, relativeOrAbsoluteUrl, null); } public virtual TResponse Post(string relativeOrAbsoluteUrl, object request) { return Send(Web.HttpMethod.Post, relativeOrAbsoluteUrl, request); } public virtual TResponse Put(string relativeOrAbsoluteUrl, object request) { return Send(Web.HttpMethod.Put, relativeOrAbsoluteUrl, request); } public virtual TResponse Patch(string relativeOrAbsoluteUrl, object request) { return Send(Web.HttpMethod.Patch, relativeOrAbsoluteUrl, request); } public virtual TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, FileInfo fileToUpload, object request) { return PostFileWithRequest(relativeOrAbsoluteUrl, fileToUpload.OpenRead(), fileToUpload.Name, request); } public virtual TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, object request) { var requestUri = GetUrl(relativeOrAbsoluteUrl); var currentStreamPosition = fileToUpload.Position; Func createWebRequest = () => { var webRequest = PrepareWebRequest(Web.HttpMethod.Post, requestUri, null, null); var queryString = QueryStringSerializer.SerializeToString(request); #if !MONOTOUCH var nameValueCollection = HttpUtility.ParseQueryString(queryString); #endif var boundary = DateTime.Now.Ticks.ToString(); webRequest.ContentType = "multipart/form-data; boundary=" + boundary; boundary = "--" + boundary; var newLine = Environment.NewLine; using (var outputStream = webRequest.GetRequestStream()) { #if !MONOTOUCH foreach (var key in nameValueCollection.AllKeys) { outputStream.Write(boundary + newLine); outputStream.Write("Content-Disposition: form-data;name=\"{0}\"{1}{2}".FormatWith(key, newLine, newLine)); outputStream.Write(nameValueCollection[key] + newLine); } #endif outputStream.Write(boundary + newLine); outputStream.Write("Content-Disposition: form-data;name=\"{0}\";filename=\"{1}\"{2}{3}".FormatWith("upload", fileName, newLine, newLine)); var buffer = new byte[4096]; int byteCount; while ((byteCount = fileToUpload.Read(buffer, 0, 4096)) > 0) { outputStream.Write(buffer, 0, byteCount); } outputStream.Write(newLine); outputStream.Write(boundary + "--"); } return webRequest; }; try { var webRequest = createWebRequest(); var webResponse = webRequest.GetResponse(); return HandleResponse(webResponse); } catch (Exception ex) { TResponse response; // restore original position before retry fileToUpload.Seek(currentStreamPosition, SeekOrigin.Begin); if (!HandleResponseException(ex, requestUri, createWebRequest, c => c.GetResponse(), out response)) { throw; } return response; } } public virtual TResponse PostFile(string relativeOrAbsoluteUrl, FileInfo fileToUpload, string mimeType) { return PostFile(relativeOrAbsoluteUrl, fileToUpload.OpenRead(), fileToUpload.Name, mimeType); } public virtual TResponse PostFile(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, string mimeType) { var currentStreamPosition = fileToUpload.Position; var requestUri = GetUrl(relativeOrAbsoluteUrl); Func createWebRequest = () => PrepareWebRequest(Web.HttpMethod.Post, requestUri, null, null); try { var webRequest = createWebRequest(); webRequest.UploadFile(fileToUpload, fileName, mimeType); var webResponse = webRequest.GetResponse(); return HandleResponse(webResponse); } catch (Exception ex) { TResponse response; // restore original position before retry fileToUpload.Seek(currentStreamPosition, SeekOrigin.Begin); if (!HandleResponseException(ex, requestUri, createWebRequest, c => { c.UploadFile(fileToUpload, fileName, mimeType); return c.GetResponse(); }, out response)) { throw; } return response; } } private TResponse HandleResponse(WebResponse webResponse) { ApplyWebResponseFilters(webResponse); using (var responseStream = webResponse.GetResponseStream()) { var response = DeserializeFromStream(responseStream); return response; } } #endif public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/ISyncReply.cs0000644000175000017500000000060212146506550030723 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.ServiceModel; using System.ServiceModel.Channels; namespace ServiceStack.ServiceClient.Web { [ServiceContract(Namespace = "http://services.servicestack.net/")] public interface ISyncReply { [OperationContract(Action = "*", ReplyAction = "*")] Message Send(Message requestMsg); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/DictionaryExtensions.cs0000644000175000017500000000175712146506550033063 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.Collections.Generic; using System.Collections.Specialized; namespace ServiceStack.ServiceModel.Extensions { public static class DictionaryExtensions { public static Dictionary ToDictionary(this NameValueCollection nameValues) { var map = new Dictionary(); foreach (var key in nameValues.AllKeys) { if (key == null) { //occurs when no value is specified, e.g. 'path/to/page?debug' //throw new ArgumentNullException("key", "nameValues: " + nameValues); continue; } var values = nameValues.GetValues(key); if (values != null && values.Length > 0) { map[key] = values[0]; } } return map; } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/XmlServiceClient.cs0000644000175000017500000000253312146506550032107 0ustar00meebeymeebey00000000000000using System.IO; using ServiceStack.ServiceHost; using ServiceStack.ServiceModel.Serialization; using ServiceStack.Text; using System; namespace ServiceStack.ServiceClient.Web { public class XmlServiceClient : ServiceClientBase { public override string Format { get { return "xml"; } } public XmlServiceClient() { } public XmlServiceClient(string baseUri) { SetBaseUri(baseUri); } public XmlServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri) : base(syncReplyBaseUri, asyncOneWayBaseUri) {} public override string ContentType { get { return String.Format("application/{0}", Format); } } public override void SerializeToStream(IRequestContext requestContext, object request, Stream stream) { DataContractSerializer.Instance.SerializeToStream(request, stream); } public override T DeserializeFromStream(Stream stream) { return DataContractDeserializer.Instance.DeserializeFromStream(stream); } public override StreamDeserializerDelegate StreamDeserializer { get { return XmlSerializer.DeserializeFromStream; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/JsvServiceClient.cs0000644000175000017500000000272512146506550032114 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public class JsvServiceClient : ServiceClientBase { public override string Format { get { return "jsv"; } } public JsvServiceClient() { } public JsvServiceClient(string baseUri) { SetBaseUri(baseUri); } public JsvServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri) : base(syncReplyBaseUri, asyncOneWayBaseUri) { } public override string ContentType { get { return String.Format("application/{0}", Format); } } public override void SerializeToStream(IRequestContext requestContext, object request, Stream stream) { using (var writer = new StreamWriter(stream)) { TypeSerializer.SerializeToWriter(request, writer); } } public override T DeserializeFromStream(Stream stream) { using (var reader = new StreamReader(stream)) { return TypeSerializer.DeserializeFromReader(reader); } } public override StreamDeserializerDelegate StreamDeserializer { get { return TypeSerializer.DeserializeFromStream; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/WebRequestUtils.cs0000644000175000017500000000345112146506550031776 0ustar00meebeymeebey00000000000000using System; using System.Net; using System.Text; using ServiceStack.Common.Web; namespace ServiceStack.ServiceClient.Web { public class AuthenticationException : Exception { public AuthenticationException() { } public AuthenticationException(string message) : base(message) { } public AuthenticationException(string message, Exception innerException) : base(message, innerException) { } } internal static class WebRequestUtils { internal static AuthenticationException CreateCustomException(string uri, AuthenticationException ex) { if (uri.StartsWith("https")) { return new AuthenticationException( string.Format("Invalid remote SSL certificate, overide with: \nServicePointManager.ServerCertificateValidationCallback += ((sender, certificate, chain, sslPolicyErrors) => isValidPolicy);"), ex); } return null; } internal static bool ShouldAuthenticate(Exception ex, string userName, string password) { var webEx = ex as WebException; return (webEx != null && webEx.Response != null && ((HttpWebResponse) webEx.Response).StatusCode == HttpStatusCode.Unauthorized && !string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)); } internal static void AddBasicAuth(this WebRequest client, string userName, string password) { client.Headers[HttpHeaders.Authorization] = "basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(userName + ":" + password)); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/Soap11ServiceClient.cs0000644000175000017500000001050212146506550032406 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.Service; namespace ServiceStack.ServiceClient.Web { #if SILVERLIGHT || MONOTOUCH || XBOX public class Soap11ServiceClient : IServiceClient { public Soap11ServiceClient(string uri) { throw new NotImplementedException(); } public void Dispose() { throw new NotImplementedException(); } public void SetCredentials(string userName, string password) { throw new NotImplementedException(); } public void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void SendAsync(object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void SendOneWay(object request) { throw new NotImplementedException(); } public void SendOneWay(string relativeOrAbsoluteUrl, object request) { throw new NotImplementedException(); } public TResponse Send(object request) { throw new NotImplementedException(); } public TResponse PostFile(string relativeOrAbsoluteUrl, FileInfo fileToUpload, string mimeType) { throw new NotImplementedException(); } public TResponse PostFile(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, string mimeType) { throw new NotImplementedException(); } public TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, FileInfo fileToUpload, object request) { throw new NotImplementedException(); } public TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, object request) { throw new NotImplementedException(); } } #else using ServiceStack.Service; using System.ServiceModel; using System.ServiceModel.Channels; using ServiceStack.Text; public class Soap11ServiceClient : WcfServiceClient { private BasicHttpBinding binding; public Soap11ServiceClient(string uri) { this.Uri = uri.WithTrailingSlash() + "Soap11"; } private Binding BasicHttpBinding { get { if (this.binding == null) { this.binding = new BasicHttpBinding { MaxReceivedMessageSize = int.MaxValue, HostNameComparisonMode = HostNameComparisonMode.StrongWildcard }; } return this.binding; } } protected override Binding Binding { get { return this.BasicHttpBinding; } } protected override MessageVersion MessageVersion { get { return this.BasicHttpBinding.MessageVersion; } } public override void SetProxy(Uri proxyAddress) { var basicBinding = (BasicHttpBinding)Binding; basicBinding.ProxyAddress = proxyAddress; basicBinding.UseDefaultWebProxy = false; basicBinding.BypassProxyOnLocal = false; return; } } #endif }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/XmlRestClientAsync.cs0000644000175000017500000000547112146506550032426 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.Service; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public class XmlRestClientAsync : IRestClientAsync { public const string ContentType = "application/xml"; public XmlRestClientAsync(string baseUri) : this() { this.BaseUri = baseUri.WithTrailingSlash(); } public XmlRestClientAsync() { this.client = new AsyncServiceClient { ContentType = ContentType, StreamSerializer = SerializeToStream, StreamDeserializer = XmlSerializer.DeserializeFromStream }; } public TimeSpan? Timeout { get { return this.client.Timeout; } set { this.client.Timeout = value; } } private static void SerializeToStream(IRequestContext requestContext, object dto, Stream stream) { XmlSerializer.SerializeToStream(dto, stream); } private readonly AsyncServiceClient client; public string BaseUri { get; set; } public void SetCredentials(string userName, string password) { this.client.SetCredentials(userName, password); } private string GetUrl(string relativeOrAbsoluteUrl) { return relativeOrAbsoluteUrl.StartsWith("http:") || relativeOrAbsoluteUrl.StartsWith("https:") ? relativeOrAbsoluteUrl : this.BaseUri + relativeOrAbsoluteUrl; } public void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Get, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Delete, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Post, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Put, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/AuthDtos.cs0000644000175000017500000000153112146506550030417 0ustar00meebeymeebey00000000000000using ServiceStack.ServiceInterface.ServiceModel; namespace ServiceStack.Common.ServiceClient.Web { //Copy from ServiceStack.ServiceInterface.Auth to avoid deps public class Auth { public string provider { get; set; } public string State { get; set; } public string oauth_token { get; set; } public string oauth_verifier { get; set; } public string UserName { get; set; } public string Password { get; set; } public bool? RememberMe { get; set; } } public class AuthResponse { public AuthResponse() { this.ResponseStatus = new ResponseStatus(); } public string SessionId { get; set; } public string UserName { get; set; } public ResponseStatus ResponseStatus { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/Soap12ServiceClient.cs0000644000175000017500000001135012146506550032411 0ustar00meebeymeebey00000000000000using System; using System.IO; using ServiceStack.Service; using System.Net; namespace ServiceStack.ServiceClient.Web { #if SILVERLIGHT || MONOTOUCH || XBOX || ANDROID public class Soap12ServiceClient : IServiceClient { public Soap12ServiceClient(string uri) { throw new NotImplementedException(); } public void Dispose() { throw new NotImplementedException(); } public void SetCredentials(string userName, string password) { throw new NotImplementedException(); } public void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void SendAsync(object request, Action onSuccess, Action onError) { throw new NotImplementedException(); } public void SendOneWay(object request) { throw new NotImplementedException(); } public void SendOneWay(string relativeOrAbsoluteUrl, object request) { throw new NotImplementedException(); } public TResponse Send(object request) { throw new NotImplementedException(); } public TResponse PostFile(string relativeOrAbsoluteUrl, FileInfo fileToUpload, string mimeType) { throw new NotImplementedException(); } public TResponse PostFile(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, string mimeType) { throw new NotImplementedException(); } public TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, FileInfo fileToUpload, object request) { throw new NotImplementedException(); } public TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, object request) { throw new NotImplementedException(); } } #else using System.ServiceModel; using System.ServiceModel.Channels; using ServiceStack.Text; using ServiceStack.Service; public class Soap12ServiceClient : WcfServiceClient { public Soap12ServiceClient(string uri) { this.Uri = uri.WithTrailingSlash() + "Soap12"; this.StoreCookies = true; } private WSHttpBinding binding; private Binding WsHttpBinding { get { if (this.binding == null) { this.binding = new WSHttpBinding { MaxReceivedMessageSize = int.MaxValue, HostNameComparisonMode = HostNameComparisonMode.StrongWildcard, MaxBufferPoolSize = 524288, }; this.binding.Security.Mode = SecurityMode.None; // CCB Custom // Yes, you need this to manage cookies yourself. Seems counterintutive, but set to true, // it only means that the framework will manage cookie propagation for the same call, which is // not what we want. if (StoreCookies) this.binding.AllowCookies = false; } return this.binding; } } protected override Binding Binding { get { return this.WsHttpBinding; } } protected override MessageVersion MessageVersion { get { return MessageVersion.Default; } } public override void SetProxy(Uri proxyAddress) { var wsHttpBinding = (WSHttpBinding)Binding; wsHttpBinding.ProxyAddress = proxyAddress; wsHttpBinding.UseDefaultWebProxy = false; wsHttpBinding.BypassProxyOnLocal = false; return; } } #endif } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/GenericProxy.cs0000644000175000017500000000220512146506550031301 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.ServiceModel; using System.ServiceModel.Description; namespace ServiceStack.ServiceClient.Web { /// /// Generic Proxy for service calls. /// /// The service Contract public class GenericProxy : ClientBase where T : class { public GenericProxy() : base() { Initialize(); } public GenericProxy(string endpoint) : base(endpoint) { Initialize(); } public GenericProxy(ServiceEndpoint endpoint) : base(endpoint.Binding, endpoint.Address) { Initialize(); } public void Initialize() { //this.Endpoint.Behaviors.Add(new ServiceEndpointBehaviour()); } /// /// Returns the transparent proxy for the service call /// public T Proxy { get { return base.Channel; } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/WebServiceException.cs0000644000175000017500000000706512146506550032611 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.Common.Utils; using ServiceStack.ServiceInterface.ServiceModel; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public class WebServiceException : Exception { public WebServiceException() { } public WebServiceException(string message) : base(message) { } public WebServiceException(string message, Exception innerException) : base(message, innerException) { } public int StatusCode { get; set; } public string StatusDescription { get; set; } public object ResponseDto { get; set; } public string ResponseBody { get; set; } private string errorCode; private void ParseResponseDto() { if (ResponseDto == null) { errorCode = StatusDescription; return; } var jsv = TypeSerializer.SerializeToString(ResponseDto); var map = TypeSerializer.DeserializeFromString>(jsv); map = new Dictionary(map, StringComparer.InvariantCultureIgnoreCase); string responseStatus; if (!map.TryGetValue("ResponseStatus", out responseStatus)) return; var rsMap = TypeSerializer.DeserializeFromString>(responseStatus); if (rsMap == null) return; rsMap = new Dictionary(rsMap, StringComparer.InvariantCultureIgnoreCase); rsMap.TryGetValue("ErrorCode", out errorCode); rsMap.TryGetValue("Message", out errorMessage); rsMap.TryGetValue("StackTrace", out serverStackTrace); } public string ErrorCode { get { if (errorCode == null) { ParseResponseDto(); } return errorCode; } } private string errorMessage; public string ErrorMessage { get { if (errorMessage == null) { ParseResponseDto(); } return errorMessage; } } private string serverStackTrace; public string ServerStackTrace { get { if (serverStackTrace == null) { ParseResponseDto(); } return serverStackTrace; } } public ResponseStatus ResponseStatus { get { if (this.ResponseDto == null) return null; var hasResponseStatus = this.ResponseDto as IHasResponseStatus; if (hasResponseStatus != null) return hasResponseStatus.ResponseStatus; var propertyInfo = this.ResponseDto.GetType().GetProperty("ResponseStatus"); if (propertyInfo == null) return null; return ReflectionUtils.GetProperty(this.ResponseDto, propertyInfo) as ResponseStatus; } } public List GetFieldErrors() { var responseStatus = ResponseStatus; if (responseStatus != null) return responseStatus.Errors ?? new List(); return new List(); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceClient.Web/JsonRestClientAsync.cs0000644000175000017500000000553012146506550032573 0ustar00meebeymeebey00000000000000using System; using System.IO; using System.Threading; using ServiceStack.Service; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.ServiceClient.Web { public class JsonRestClientAsync : IRestClientAsync { public const string ContentType = "application/json"; public JsonRestClientAsync(string baseUri) : this() { this.BaseUri = baseUri.WithTrailingSlash(); } public JsonRestClientAsync() { this.client = new AsyncServiceClient { ContentType = ContentType, StreamSerializer = SerializeToStream, StreamDeserializer = JsonSerializer.DeserializeFromStream }; } public TimeSpan? Timeout { get { return this.client.Timeout; } set { this.client.Timeout = value; } } private static void SerializeToStream(IRequestContext requestContext, object dto, Stream stream) { JsonSerializer.SerializeToStream(dto, stream); } private readonly AsyncServiceClient client; public string BaseUri { get; set; } public void SetCredentials(string userName, string password) { this.client.SetCredentials(userName, password); } private string GetUrl(string relativeOrAbsoluteUrl) { return relativeOrAbsoluteUrl.StartsWith("http:") || relativeOrAbsoluteUrl.StartsWith("https:") ? relativeOrAbsoluteUrl : this.BaseUri + relativeOrAbsoluteUrl; } public void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Get, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Delete, GetUrl(relativeOrAbsoluteUrl), null, onSuccess, onError); } public void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Post, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError) { this.client.SendAsync(HttpMethod.Put, GetUrl(relativeOrAbsoluteUrl), request, onSuccess, onError); } public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Model.cs0000644000175000017500000000114212146506550024447 0ustar00meebeymeebey00000000000000using ServiceStack.Common.Utils; namespace ServiceStack { public static class Model { public static object ToId(this T entity) { return entity.GetId(); } public static string ToUrn(object id) { return IdUtils.CreateUrn(id); } public static string ToUrn(this T entity) { return entity.CreateUrn(); } public static string ToSafePathCacheKey(string idValue) { return IdUtils.CreateCacheKeyPath(idValue); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ByteArrayExtensions.cs0000644000175000017500000000075612146506550027403 0ustar00meebeymeebey00000000000000namespace ServiceStack.Common { public static class ByteArrayExtensions { public static bool AreEqual(this byte[] b1, byte[] b2) { if (b1 == b2) return true; if (b1 == null || b2 == null) return false; if (b1.Length != b2.Length) return false; for (var i = 0; i < b1.Length; i++) { if (b1[i] != b2[i]) return false; } return true; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/0000755000175000017500000000000012146506550025221 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/ReflectionExtensions.cs0000644000175000017500000000361112146506550031723 0ustar00meebeymeebey00000000000000using System; using System.Reflection; using Proxy = ServiceStack.Common.ReflectionExtensions; namespace ServiceStack.Common.Extensions { public static class ReflectionExtensions { public static To PopulateWith(this To to, From from) { return Proxy.PopulateWith(to, from); } public static To PopulateWithNonDefaultValues(this To to, From from) { return Proxy.PopulateWithNonDefaultValues(to, from); } public static To PopulateFromPropertiesWithAttribute(this To to, From from) { return Proxy.PopulateFromPropertiesWithAttribute(to, from); } public static T TranslateTo(this object from) where T : new() { return Proxy.TranslateTo(from); } public static TAttribute FirstAttribute(this Type type) { return Proxy.FirstAttribute(type); } public static TAttribute FirstAttribute(this Type type, bool inherit) { return Proxy.FirstAttribute(type, inherit); } public static TAttribute FirstAttribute(this PropertyInfo propertyInfo) { return Proxy.FirstAttribute(propertyInfo); } public static TAttribute FirstAttribute(this PropertyInfo propertyInfo, bool inherit) { return Proxy.FirstAttribute(propertyInfo, inherit); } public static bool IsGenericType(this Type type) { return Proxy.IsGenericType(type); } public static Type FirstGenericTypeDefinition(this Type type) { return Proxy.FirstGenericTypeDefinition(type); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/ITranslatorExtensions.cs0000644000175000017500000000115012146506550032067 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using ServiceStack.DesignPatterns.Translator; namespace ServiceStack.Common.Extensions { public static class TranslatorExtensions { // Methods public static List ParseAll(this ITranslator translator, IEnumerable from) { var list = new List(); if (from != null) { foreach (var local in from) { list.Add(translator.Parse(local)); } } return list; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/AssertExtensions.cs0000644000175000017500000000311712146506550031073 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using Proxy = ServiceStack.Common.AssertExtensions; namespace ServiceStack.Common.Extensions { public static class AssertExtensions { public static void ThrowOnFirstNull(params object[] objs) { Proxy.ThrowOnFirstNull(objs); } public static void ThrowIfNull(this object obj) { Proxy.ThrowIfNull(obj); } public static void ThrowIfNull(this object obj, string varName) { Proxy.ThrowIfNull(obj, varName); } public static void ThrowIfNullOrEmpty(this string strValue) { Proxy.ThrowIfNullOrEmpty(strValue); } public static void ThrowIfNullOrEmpty(this string strValue, string varName) { Proxy.ThrowIfNullOrEmpty(strValue, varName); } public static void ThrowIfNullOrEmpty(this ICollection collection) { Proxy.ThrowIfNullOrEmpty(collection); } public static void ThrowIfNullOrEmpty(this ICollection collection, string varName) { Proxy.ThrowIfNullOrEmpty(collection, varName); } public static void ThrowIfNullOrEmpty(this ICollection collection) { Proxy.ThrowIfNullOrEmpty(collection); } public static void ThrowIfNullOrEmpty(this ICollection collection, string varName) { Proxy.ThrowIfNullOrEmpty(collection, varName); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/EnumerableExtensions.cs0000644000175000017500000000722312146506550031713 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using Proxy = ServiceStack.Common.EnumerableExtensions; namespace ServiceStack.Common.Extensions { /// /// These extensions have a potential to conflict with the LINQ extensions methods so /// leaving the implmentation in the 'Extensions' sub-namespace to force explicit opt-in /// public static class EnumerableExtensions { public static void ForEach(this IEnumerable values, Action action) { foreach (var value in values) { action(value); } } public static List ConvertAll(this IEnumerable items, Func converter) { var list = new List(); foreach (var item in items) { list.Add(converter(item)); } return list; } public static object First(this IEnumerable items) { foreach (var item in items) { return item; } return null; } public static List ToList(this IEnumerable items) { var list = new List(); foreach (var item in items) { list.Add((To)item); } return list; } public static List ConvertAll(this IEnumerable items, Func converter) { var list = new List(); foreach (var item in items) { list.Add(converter(item)); } return list; } public static HashSet ToHashSet(this IEnumerable items) { return Proxy.ToHashSet(items); } public static List SafeConvertAll(this IEnumerable items, Func converter) { return Proxy.SafeConvertAll(items, converter); } public static List ToObjects(this IEnumerable items) { var to = new List(); foreach (var item in items) { to.Add(item); } return to; } public static string FirstNonDefaultOrEmpty(this IEnumerable values) { foreach (var value in values) { if (!string.IsNullOrEmpty(value)) return value; } return null; } public static T FirstNonDefault(this IEnumerable values) { foreach (var value in values) { if (!Equals(value, default(T))) return value; } return default(T); } public static bool EquivalentTo(this IEnumerable thisList, IEnumerable otherList) { if (thisList == null || otherList == null) return thisList == otherList; var otherEnum = otherList.GetEnumerator(); foreach (var item in thisList) { if (!otherEnum.MoveNext()) return false; var thisIsDefault = Equals(item, default(T)); var otherIsDefault = Equals(otherEnum.Current, default(T)); if (thisIsDefault || otherIsDefault) { return thisIsDefault && otherIsDefault; } if (!item.Equals(otherEnum.Current)) return false; } var hasNoMoreLeftAsWell = !otherEnum.MoveNext(); return hasNoMoreLeftAsWell; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/ActionExecExtensions.cs0000644000175000017500000000313412146506550031653 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Threading; using Proxy = ServiceStack.Common.ActionExecExtensions; namespace ServiceStack.Common.Extensions { public static class ExtensionsProxy { public static void ExecAllAndWait(this ICollection actions, TimeSpan timeout) { Proxy.ExecAllAndWait(actions, timeout); } public static List ExecAsync(this IEnumerable actions) { return Proxy.ExecAsync(actions); } public static bool WaitAll(this List waitHandles, int timeoutMs) { return Proxy.WaitAll(waitHandles, timeoutMs); } public static bool WaitAll(this ICollection waitHandles, int timeoutMs) { return Proxy.WaitAll(waitHandles, timeoutMs); } public static bool WaitAll(this ICollection waitHandles, TimeSpan timeout) { return Proxy.WaitAll(waitHandles, timeout); } #if !SILVERLIGHT && !MONOTOUCH && !XBOX public static bool WaitAll(this List asyncResults, TimeSpan timeout) { return Proxy.WaitAll(asyncResults, timeout); } #endif public static bool WaitAll(WaitHandle[] waitHandles, TimeSpan timeout) { return Proxy.WaitAll(waitHandles, timeout); } public static bool WaitAll(WaitHandle[] waitHandles, int timeOutMs) { return Proxy.WaitAll(waitHandles, timeOutMs); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/CollectionExtensions.cs0000644000175000017500000000126312146506550031725 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using Proxy = ServiceStack.Common; namespace ServiceStack.Common.Extensions { public static class CollectionExtensions { public static bool IsEmpty(this ICollection collection) { return collection == null || collection.Count == 0; } public static List ConvertAll(this ICollection items, Func converter) { var list = new List(); foreach (var item in items) { list.Add(converter(item)); } return list; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/ByteArrayExtensions.cs0000644000175000017500000000044512146506550031535 0ustar00meebeymeebey00000000000000using Proxy = ServiceStack.Common.ByteArrayExtensions; namespace ServiceStack.Common.Extensions { public static class ByteArrayExtensions { public static bool AreEqual(this byte[] b1, byte[] b2) { return Proxy.AreEqual(b1, b2); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/StringExtensions.cs0000644000175000017500000000604412146506550031102 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using Proxy = ServiceStack.Common.StringExtensions; namespace ServiceStack.Common.Extensions { public static class StringExtensions { public static T ToEnum(this string value) { return Proxy.ToEnum(value); } public static T ToEnumOrDefault(this string value, T defaultValue) { return Proxy.ToEnumOrDefault(value, defaultValue); } public static string SplitCamelCase(this string value) { return Proxy.SplitCamelCase(value); } public static string ToEnglish(this string camelCase) { return Proxy.ToEnglish(camelCase); } public static bool IsEmpty(this string value) { return Proxy.IsEmpty(value); } public static bool IsNullOrEmpty(this string value) { return Proxy.IsNullOrEmpty(value); } public static bool EqualsIgnoreCase(this string value, string other) { return Proxy.EqualsIgnoreCase(value, other); } public static string ReplaceFirst(this string haystack, string needle, string replacement) { return Proxy.ReplaceFirst(haystack, needle, replacement); } public static string ReplaceAll(this string haystack, string needle, string replacement) { return Proxy.ReplaceAll(haystack, needle, replacement); } public static bool ContainsAny(this string text, params string[] testMatches) { return Proxy.ContainsAny(text, testMatches); } public static string SafeVarName(this string text) { return Proxy.SafeVarName(text); } public static string Join(this List items) { return Proxy.Join(items); } public static string Join(this List items, string delimeter) { return Proxy.Join(items, delimeter); } public static bool Glob(this string value, string pattern) { int pos; for (pos = 0; pattern.Length != pos; pos++) { switch (pattern[pos]) { case '?': break; case '*': for (int i = value.Length; i >= pos; i--) { if (Glob(value.Substring(i), pattern.Substring(pos + 1))) return true; } return false; default: if (value.Length == pos || char.ToUpper(pattern[pos]) != char.ToUpper(value[pos])) { return false; } break; } } return value.Length == pos; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/DictionaryExtensions.cs0000644000175000017500000000173212146506550031740 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using Proxy = ServiceStack.Common.DictionaryExtensions; namespace ServiceStack.Common.Extensions { public static class DictionaryExtensions { public static TValue GetValueOrDefault(this Dictionary dictionary, TKey key) { return Proxy.GetValueOrDefault(dictionary, key); } public static void ForEach(this Dictionary dictionary, Action onEachFn) { Proxy.ForEach(dictionary, onEachFn); } public static bool EquivalentTo(this IDictionary thisMap, IDictionary otherMap) { return Proxy.EquivalentTo(thisMap, otherMap); } public static List ConvertAll(IDictionary map, Func createFn) { return Proxy.ConvertAll(map, createFn); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Extensions/IntExtensions.cs0000644000175000017500000000232412146506550030363 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using Proxy = ServiceStack.Common.IntExtensions; namespace ServiceStack.Common.Extensions { public static class IntExtensions { public static IEnumerable Times(this int times) { return Proxy.Times(times); } public static void Times(this int times, Action actionFn) { Proxy.Times(times, actionFn); } public static void Times(this int times, Action actionFn) { Proxy.Times(times, actionFn); } public static List TimesAsync(this int times, Action actionFn) { return Proxy.TimesAsync(times, actionFn); } public static List TimesAsync(this int times, Action actionFn) { return Proxy.TimesAsync(times, actionFn); } public static List Times(this int times, Func actionFn) { return Proxy.Times(times, actionFn); } public static List Times(this int times, Func actionFn) { return Proxy.Times(times, actionFn); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/0000755000175000017500000000000012146506550024536 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/ActionExecHandler.cs0000644000175000017500000000113112146506550030401 0ustar00meebeymeebey00000000000000using System; using System.Threading; using ServiceStack.DesignPatterns.Command; namespace ServiceStack.Common.Support { public class ActionExecHandler : ICommandExec { private readonly Action action; private readonly AutoResetEvent waitHandle; public ActionExecHandler(Action action, AutoResetEvent waitHandle) { this.action = action; this.waitHandle = waitHandle; } public bool Execute() { action(); waitHandle.Set(); return true; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/CommandResultsHandler.cs0000644000175000017500000000141212146506550031321 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using System.Threading; using ServiceStack.DesignPatterns.Command; namespace ServiceStack.Common.Support { public class CommandResultsHandler : ICommandExec { private readonly List results; private readonly ICommandList command; private readonly AutoResetEvent waitHandle; public CommandResultsHandler(List results, ICommandList command, AutoResetEvent waitHandle) { this.results = results; this.command = command; this.waitHandle = waitHandle; } public bool Execute() { results.AddRange(command.Execute()); waitHandle.Set(); return true; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/CommandExecsHandler.cs0000644000175000017500000000114712146506550030734 0ustar00meebeymeebey00000000000000using System.Threading; using ServiceStack.DesignPatterns.Command; namespace ServiceStack.Common.Support { public class CommandExecsHandler : ICommandExec { private readonly ICommandExec command; private readonly AutoResetEvent waitHandle; public CommandExecsHandler(ICommandExec command, AutoResetEvent waitHandle) { this.command = command; this.waitHandle = waitHandle; } public bool Execute() { command.Execute(); waitHandle.Set(); return true; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/NetGZipProvider.cs0000644000175000017500000000212612146506550030121 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.IO; using System.IO.Compression; using System.Text; using ServiceStack.CacheAccess; using ServiceStack.Text; namespace ServiceStack.Common.Support { public class NetGZipProvider : IGZipProvider { public byte[] GZip(string text) { var buffer = Encoding.UTF8.GetBytes(text); using (var ms = new MemoryStream()) using (var zipStream = new GZipStream(ms, CompressionMode.Compress)) { zipStream.Write(buffer, 0, buffer.Length); zipStream.Close(); return ms.ToArray(); } } public string GUnzip(byte[] gzBuffer) { using (var compressedStream = new MemoryStream(gzBuffer)) using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) { var utf8Bytes = zipStream.ReadFully(); return Encoding.UTF8.GetString(utf8Bytes); } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/AdapterBase.cs0000644000175000017500000000402712146506550027243 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Logging; namespace ServiceStack.Common.Support { /// /// Common functionality when creating adapters /// public abstract class AdapterBase { protected abstract ILog Log { get; } /// /// Executes the specified expression. /// /// /// The action. /// protected T Execute(Func action) { DateTime before = DateTime.Now; this.Log.DebugFormat("Executing action '{0}'", action.Method.Name); try { T result = action(); TimeSpan timeTaken = DateTime.Now - before; this.Log.DebugFormat("Action '{0}' executed. Took {1} ms.", action.Method.Name, timeTaken.TotalMilliseconds); return result; } catch (Exception ex) { this.Log.ErrorFormat("There was an error executing Action '{0}'. Message: {1}", action.Method.Name, ex.Message); throw; } } /// /// Executes the specified action (for void methods). /// /// The action. protected void Execute(Action action) { DateTime before = DateTime.Now; this.Log.DebugFormat("Executing action '{0}'", action.Method.Name); try { action(); TimeSpan timeTaken = DateTime.Now - before; this.Log.DebugFormat("Action '{0}' executed. Took {1} ms.", action.Method.Name, timeTaken.TotalMilliseconds); } catch (Exception ex) { this.Log.ErrorFormat("There was an error executing Action '{0}'. Message: {1}", action.Method.Name, ex.Message); throw; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/AssignmentDefinition.cs0000644000175000017500000001307612146506550031215 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using ServiceStack.Common.Utils; using ServiceStack.Logging; using ServiceStack.Net30.Collections.Concurrent; using ServiceStack.Text; namespace ServiceStack.Common.Support { public class AssignmentDefinition { private static readonly ILog Log = LogManager.GetLogger(typeof(AssignmentDefinition)); private ConcurrentDictionary PropertySetters = new ConcurrentDictionary(); private ConcurrentDictionary PropertyGetters = new ConcurrentDictionary(); public AssignmentDefinition() { this.PropertyInfoMap = new Dictionary(); this.FieldInfoMap = new Dictionary(); } public Type FromType { get; set; } public Type ToType { get; set; } //from => to public Dictionary PropertyInfoMap { get; set; } public Dictionary FieldInfoMap { get; set; } public void AddMatch(PropertyInfo fromPropertyInfo, PropertyInfo toPropertyInfo) { this.PropertyInfoMap[fromPropertyInfo] = toPropertyInfo; } public void AddMatch(FieldInfo fromFieldInfo, FieldInfo toFieldInfo) { this.FieldInfoMap[fromFieldInfo] = toFieldInfo; } public void PopulateFromPropertiesWithAttribute(object to, object from, Type attributeType) { var hasAttributePredicate = (Func) (x => x.GetCustomAttributes(attributeType, true).Length > 0); Populate(to, from, hasAttributePredicate, null); } public void PopulateWithNonDefaultValues(object to, object from) { var nonDefaultPredicate = (Func) (x => x != null && !Equals( x, ReflectionUtils.GetDefaultValue(x.GetType()) ) ); Populate(to, from, null, nonDefaultPredicate); } public void Populate(object to, object from) { Populate(to, from, null, null); } public void Populate(object to, object from, Func propertyInfoPredicate, Func valuePredicate) { foreach (var propertyEntry in PropertyInfoMap) { var fromPropertyInfo = propertyEntry.Key; var toPropertyInfo = propertyEntry.Value; if (propertyInfoPredicate != null) { if (!propertyInfoPredicate(fromPropertyInfo)) continue; } try { var getterFn = PropertyGetters.GetOrAdd(fromPropertyInfo.Name, fromPropertyInfo.GetPropertyGetterFn()); var fromValue = getterFn(from); if (valuePredicate != null) { if (!valuePredicate(fromValue)) continue; } if (fromPropertyInfo.PropertyType != toPropertyInfo.PropertyType) { if (fromPropertyInfo.PropertyType == typeof(string)) { fromValue = TypeSerializer.DeserializeFromString((string)fromValue, toPropertyInfo.PropertyType); } else if (toPropertyInfo.PropertyType == typeof(string)) { fromValue = TypeSerializer.SerializeToString(fromValue); } else { var listResult = TranslateListWithElements.TryTranslateToGenericICollection( fromPropertyInfo.PropertyType, toPropertyInfo.PropertyType, fromValue); if (listResult != null) { fromValue = listResult; } } } var setterFn = PropertySetters.GetOrAdd(toPropertyInfo.Name, toPropertyInfo.GetPropertySetterFn()); setterFn(to, fromValue); } catch (Exception ex) { Log.Warn(string.Format("Error trying to set properties {0}.{1} > {2}.{3}", FromType.FullName, fromPropertyInfo.Name, ToType.FullName, toPropertyInfo.Name), ex); } } foreach (var fieldEntry in FieldInfoMap) { var fromFieldInfo = fieldEntry.Key; var toFieldInfo = fieldEntry.Value; try { var fromValue = fromFieldInfo.GetValue(from); toFieldInfo.SetValue(to, fromValue); } catch (Exception ex) { Log.Warn(string.Format("Error trying to set fields {0}.{1} > {2}.{3}", FromType.FullName, fromFieldInfo.Name, ToType.FullName, toFieldInfo.Name), ex); } } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/PropertyInvoker.cs0000644000175000017500000000476412146506550030262 0ustar00meebeymeebey00000000000000using System; using System.Linq.Expressions; using System.Reflection; namespace ServiceStack.Common.Support { public delegate void PropertySetterDelegate(object instance, object value); public delegate object PropertyGetterDelegate(object instance); public static class PropertyInvoker { public static PropertySetterDelegate GetPropertySetterFn(this PropertyInfo propertyInfo) { var propertySetMethod = propertyInfo.GetSetMethod(); if (propertySetMethod == null) return null; #if MONOTOUCH || SILVERLIGHT || XBOX return (o, convertedValue) => { propertySetMethod.Invoke(o, new[] { convertedValue }); return; }; #else var instance = Expression.Parameter(typeof(object), "i"); var argument = Expression.Parameter(typeof(object), "a"); var instanceParam = Expression.Convert(instance, propertyInfo.DeclaringType); var valueParam = Expression.Convert(argument, propertyInfo.PropertyType); var setterCall = Expression.Call(instanceParam, propertyInfo.GetSetMethod(), valueParam); return Expression.Lambda(setterCall, instance, argument).Compile(); #endif } public static PropertyGetterDelegate GetPropertyGetterFn(this PropertyInfo propertyInfo) { var getMethodInfo = propertyInfo.GetGetMethod(); if (getMethodInfo == null) return null; #if MONOTOUCH || SILVERLIGHT || XBOX return o => propertyInfo.GetGetMethod().Invoke(o, new object[] { }); #else try { var oInstanceParam = Expression.Parameter(typeof(object), "oInstanceParam"); var instanceParam = Expression.Convert(oInstanceParam, propertyInfo.DeclaringType); var exprCallPropertyGetFn = Expression.Call(instanceParam, getMethodInfo); var oExprCallPropertyGetFn = Expression.Convert(exprCallPropertyGetFn, typeof(object)); var propertyGetFn = Expression.Lambda ( oExprCallPropertyGetFn, oInstanceParam ).Compile(); return propertyGetFn; } catch (Exception ex) { Console.Write(ex.Message); throw; } #endif } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/NetDeflateProvider.cs0000644000175000017500000000213712146506550030616 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.IO; using System.IO.Compression; using System.Text; using ServiceStack.CacheAccess; using ServiceStack.Text; namespace ServiceStack.Common.Support { public class NetDeflateProvider : IDeflateProvider { public byte[] Deflate(string text) { var buffer = Encoding.UTF8.GetBytes(text); using(var ms = new MemoryStream()) using (var zipStream = new DeflateStream(ms, CompressionMode.Compress)) { zipStream.Write(buffer, 0, buffer.Length); zipStream.Close(); return ms.ToArray(); } } public string Inflate(byte[] gzBuffer) { using (var compressedStream = new MemoryStream(gzBuffer)) using (var zipStream = new DeflateStream(compressedStream, CompressionMode.Decompress)) { var utf8Bytes = zipStream.ReadFully(); return Encoding.UTF8.GetString(utf8Bytes); } } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/InMemoryLogFactory.cs0000644000175000017500000001365212146506550030625 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Text; using ServiceStack.Logging; namespace ServiceStack.Common.Support { /// /// Note: InMemoryLog keeps all logs in memory, so don't use it long running exceptions /// /// Returns a thread-safe InMemoryLog which you can use while *TESTING* /// to provide a detailed analysis of your logs. /// public class InMemoryLogFactory : ILogFactory { public ILog GetLogger(Type type) { return new InMemoryLog(type.Name); } public ILog GetLogger(string typeName) { return new InMemoryLog(typeName); } } public class InMemoryLog : ILog { private readonly object syncLock = new object(); public string LoggerName { get; private set; } public StringBuilder CombinedLog { get; private set; } public List DebugEntries { get; set; } public List DebugExceptions { get; set; } public List InfoEntries { get; set; } public List InfoExceptions { get; set; } public List WarnEntries { get; set; } public List WarnExceptions { get; set; } public List ErrorEntries { get; set; } public List ErrorExceptions { get; set; } public List FatalEntries { get; set; } public List FatalExceptions { get; set; } public InMemoryLog(string loggerName) { this.LoggerName = loggerName; this.CombinedLog = new StringBuilder(); this.DebugEntries = new List(); this.DebugExceptions = new List(); this.InfoEntries = new List(); this.InfoExceptions = new List(); this.WarnEntries = new List(); this.WarnExceptions = new List(); this.ErrorEntries = new List(); this.ErrorExceptions = new List(); this.FatalEntries = new List(); this.FatalExceptions = new List(); } public bool HasExceptions { get { return this.DebugExceptions.Count > 0 || this.InfoExceptions.Count > 0 || this.WarnExceptions.Count > 0 || this.ErrorExceptions.Count > 0 || this.FatalExceptions.Count > 0; } } private void AppendToLog(ICollection logEntries, string format, params object[] args) { if (format == null) return; AppendToLog(logEntries, string.Format(format, args)); } private void AppendToLog(ICollection logEntries, object message) { if (message == null) return; AppendToLog(logEntries, message.ToString()); } private void AppendToLog( ICollection logEntries, ICollection logExceptions, object message, Exception ex) { if (ex != null) { lock (syncLock) { logExceptions.Add(ex); } } if (message == null) return; AppendToLog(logEntries, message.ToString()); } private void AppendToLog(ICollection logEntries, string message) { lock (this) { logEntries.Add(message); CombinedLog.AppendLine(message); } } public void Debug(object message) { AppendToLog(DebugEntries, message); } public void Debug(object message, Exception exception) { AppendToLog(DebugEntries, DebugExceptions, message, exception); } public void DebugFormat(string format, params object[] args) { AppendToLog(DebugEntries, format, args); } public void Error(object message) { AppendToLog(ErrorEntries, message); } public void Error(object message, Exception exception) { AppendToLog(ErrorEntries, ErrorExceptions, message, exception); } public void ErrorFormat(string format, params object[] args) { AppendToLog(ErrorEntries, format, args); } public void Fatal(object message) { AppendToLog(FatalEntries, message); } public void Fatal(object message, Exception exception) { AppendToLog(FatalEntries, FatalExceptions, message, exception); } public void FatalFormat(string format, params object[] args) { AppendToLog(FatalEntries, format, args); } public void Info(object message) { AppendToLog(InfoEntries, message); } public void Info(object message, Exception exception) { AppendToLog(InfoEntries, InfoExceptions, message, exception); } public void InfoFormat(string format, params object[] args) { AppendToLog(InfoEntries, format, args); } public void Warn(object message) { AppendToLog(WarnEntries, message); } public void Warn(object message, Exception exception) { AppendToLog(WarnEntries, WarnExceptions, message, exception); } public void WarnFormat(string format, params object[] args) { AppendToLog(WarnEntries, format, args); } public bool IsDebugEnabled { get { return true; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Support/LogicFacadeBase.cs0000644000175000017500000001057712146506550030013 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.DesignPatterns.Command; using ServiceStack.Logging; using ServiceStack.LogicFacade; namespace ServiceStack.Common.Support { public abstract class LogicFacadeBase : ILogicFacade { private readonly ILog log = LogManager.GetLogger(typeof(LogicFacadeBase)); internal class InitialisationContext : IInitContext { private readonly LogicFacadeBase logicFacade; /// /// Gets or sets the object that has been initialized only. /// public object InitialisedObject { get; set; } /// /// Determines whether this context is initialise only or not /// internal readonly InitOptions initOptions; /// /// Constructs a new InitialiseOnlyContext /// internal InitialisationContext(LogicFacadeBase logicFacade, InitOptions options) { this.logicFacade = logicFacade; this.initOptions = options; } /// /// Call to remove this current context and reveal the previous context (if any). /// public virtual void Dispose() { this.logicFacade.contexts.Pop(); } } /// /// Gets the current context (or null if none). /// private InitialisationContext CurrentContext { get { //TODO: check if '|| this.contexts.Count == 0)' is intended as it was throwing an exception if (this.contexts == null || this.contexts.Count == 0) { return null; } return this.contexts.Peek(); } } [ThreadStatic] internal Stack contexts; /// /// Checks if the current context is set to "initialize only". /// public bool IsCurrentlyInitializeOnly { get { return this.CurrentContext != null && ((int)(this.CurrentContext.initOptions & InitOptions.InitialiseOnly) != 0); } } public IInitContext AcquireInitContext(InitOptions initOptions) { if (this.contexts == null) { this.contexts = new Stack(); } var context = new InitialisationContext(this, initOptions); this.contexts.Push(context); return context; } /// /// Executes the specified action. /// /// /// The action. /// protected T Execute(ICommand action) { try { DateTime before = DateTime.Now; this.log.DebugFormat("Executing action '{0}'", action.GetType().Name); Init(action); if (this.CurrentContext != null) { this.CurrentContext.InitialisedObject = action; } if (this.IsCurrentlyInitializeOnly) { this.log.DebugFormat("Action '{0}' not executed (InitializedOnlyContext).", action.GetType().Name); return default(T); } else { T result = action.Execute(); TimeSpan timeTaken = DateTime.Now - before; this.log.DebugFormat("Action '{0}' executed. Took {1} ms.", action.GetType().Name, timeTaken.TotalMilliseconds); return result; } } catch (Exception ex) { log.ErrorFormat("Error executing action", ex); throw; } } protected abstract void Init(ICommand action); public virtual void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/0000755000175000017500000000000012146506550023577 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/MimeTypes.cs0000644000175000017500000000636112146506550026050 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Common.Web { public static class MimeTypes { public static Dictionary ExtensionMimeTypes = new Dictionary(); public const string Html = "text/html"; public const string Xml = "text/xml"; public const string Json = "text/json"; public const string Jsv = "text/jsv"; public const string Csv = "text/csv"; public const string ProtoBuf = "application/x-protobuf"; public const string JavaScript = "text/javascript"; public static string GetExtension(string mimeType) { switch (mimeType) { case ProtoBuf: return ".pbuf"; } var parts = mimeType.Split('/'); if (parts.Length == 1) return "." + parts[0]; if (parts.Length == 2) return "." + parts[1]; throw new NotSupportedException("Unknown mimeType: " + mimeType); } public static string GetMimeType(string fileNameOrExt) { fileNameOrExt.ThrowIfNullOrEmpty(); var parts = fileNameOrExt.Split('.'); var fileExt = parts[parts.Length - 1]; string mimeType; if (ExtensionMimeTypes.TryGetValue(fileExt, out mimeType)) { return mimeType; } switch (fileExt) { case "jpeg": case "gif": case "png": case "tiff": case "bmp": return "image/" + fileExt; case "jpg": return "image/jpeg"; case "tif": return "image/tiff"; case "htm": case "html": case "shtml": return "text/html"; case "js": return "text/javascript"; case "csv": case "css": case "sgml": return "text/" + fileExt; case "txt": return "text/plain"; case "wav": return "audio/wav"; case "mp3": return "audio/mpeg3"; case "mid": return "audio/midi"; case "qt": case "mov": return "video/quicktime"; case "mpg": return "video/mpeg"; case "avi": return "video/" + fileExt; case "rtf": return "application/" + fileExt; case "xls": return "application/x-excel"; case "doc": return "application/msword"; case "ppt": return "application/powerpoint"; case "gz": case "tgz": return "application/x-compressed"; default: return "application/" + fileExt; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpResult.cs0000644000175000017500000001757112146506550026257 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT using System; using System.Collections.Generic; using System.IO; using System.Net; using ServiceStack.Service; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.Common.Web { public class HttpResult : IHttpResult, IStreamWriter { public HttpResult() : this((object)null, null) { } public HttpResult(object response) : this(response, null) { } public HttpResult(object response, string contentType) : this(response, contentType, HttpStatusCode.OK) { } public HttpResult(HttpStatusCode statusCode, string statusDescription) : this() { StatusCode = statusCode; StatusDescription = statusDescription; } public HttpResult(object response, HttpStatusCode statusCode) : this(response, null, statusCode) { } public HttpResult(object response, string contentType, HttpStatusCode statusCode) { this.Headers = new Dictionary(); this.ResponseFilter = HttpResponseFilter.Instance; this.Response = response; this.ContentType = contentType; this.StatusCode = statusCode; } public HttpResult(FileInfo fileResponse) : this(fileResponse, false, MimeTypes.GetMimeType(fileResponse.Name)) { } public HttpResult(FileInfo fileResponse, bool asAttachment) : this(fileResponse, asAttachment, MimeTypes.GetMimeType(fileResponse.Name)) { } public HttpResult(FileInfo fileResponse, bool asAttachment, string contentType) : this(null, contentType, HttpStatusCode.OK) { this.FileInfo = fileResponse; if (!asAttachment) return; var headerValue = "attachment; " + "filename=\"" + fileResponse.Name + "\"; " + "size=" + fileResponse.Length + "; " + "creation-date=" + fileResponse.CreationTimeUtc.ToString("R").Replace(",", "") + "; " + "modification-date=" + fileResponse.LastWriteTimeUtc.ToString("R").Replace(",", "") + "; " + "read-date=" + fileResponse.LastAccessTimeUtc.ToString("R").Replace(",", ""); this.Headers = new Dictionary { { HttpHeaders.ContentDisposition, headerValue }, }; } public HttpResult(Stream responseStream, string contentType) : this(null, contentType, HttpStatusCode.OK) { this.ResponseStream = responseStream; } public HttpResult(string responseText, string contentType) : this(null, contentType, HttpStatusCode.OK) { this.ResponseText = responseText; } public string ResponseText { get; private set; } public Stream ResponseStream { get; private set; } public FileInfo FileInfo { get; private set; } public string ContentType { get; set; } public Dictionary Headers { get; private set; } public DateTime LastModified { set { this.Headers[HttpHeaders.LastModified] = value.ToUniversalTime().ToString("r"); } } public string Location { set { if (StatusCode == HttpStatusCode.OK) StatusCode = HttpStatusCode.Redirect; this.Headers[HttpHeaders.Location] = value; } } public void SetPermanentCookie(string name, string value) { SetCookie(name, value, DateTime.UtcNow.AddYears(20), null); } public void SetPermanentCookie(string name, string value, string path) { SetCookie(name, value, DateTime.UtcNow.AddYears(20), path); } public void SetSessionCookie(string name, string value) { SetSessionCookie(name, value, null); } public void SetSessionCookie(string name, string value, string path) { path = path ?? "/"; this.Headers[HttpHeaders.SetCookie] = string.Format("{0}={1};path=" + path, name, value); } public void SetCookie(string name, string value, TimeSpan expiresIn, string path) { var expiresAt = DateTime.UtcNow.Add(expiresIn); SetCookie(name, value, expiresAt, path); } public void SetCookie(string name, string value, DateTime expiresAt, string path) { path = path ?? "/"; var cookie = string.Format("{0}={1};expires={2};path={3}", name, value, expiresAt.ToString("R"), path); this.Headers[HttpHeaders.SetCookie] = cookie; } public void DeleteCookie(string name) { var cookie = string.Format("{0}=;expires={1};path=/", name, DateTime.UtcNow.AddDays(-1).ToString("R")); this.Headers[HttpHeaders.SetCookie] = cookie; } public IDictionary Options { get { return this.Headers; } } public int Status { get; set; } public HttpStatusCode StatusCode { get { return (HttpStatusCode) Status; } set { Status = (int) value; } } public string StatusDescription { get; set; } public object Response { get; set; } public IContentTypeWriter ResponseFilter { get; set; } public IRequestContext RequestContext { get; set; } public string View { get; set; } public string Template { get; set; } public void WriteTo(Stream responseStream) { if (this.FileInfo != null) { using (var fs = this.FileInfo.OpenRead()) { fs.WriteTo(responseStream); responseStream.Flush(); } return; } if (this.ResponseStream != null) { this.ResponseStream.WriteTo(responseStream); responseStream.Flush(); try { this.ResponseStream.Dispose(); } catch { /*ignore*/ } return; } if (this.ResponseText != null) { var bytes = System.Text.Encoding.UTF8.GetBytes(this.ResponseText); responseStream.Write(bytes, 0, bytes.Length); responseStream.Flush(); return; } if (this.ResponseFilter == null) throw new ArgumentNullException("ResponseFilter"); if (this.RequestContext == null) throw new ArgumentNullException("RequestContext"); var bytesResponse = this.Response as byte[]; if (bytesResponse != null) { responseStream.Write(bytesResponse, 0, bytesResponse.Length); return; } if (View != null) RequestContext.SetItem("View", View); if (Template != null) RequestContext.SetItem("Template", Template); ResponseFilter.SerializeToStream(this.RequestContext, this.Response, responseStream); } public static HttpResult Status201Created(object response, string newLocationUri) { return new HttpResult(response) { StatusCode = HttpStatusCode.Created, Headers = { { HttpHeaders.Location, newLocationUri }, } }; } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/SerializationContext.cs0000644000175000017500000000316612146506550030316 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Net; using ServiceStack.ServiceHost; namespace ServiceStack.Common.Web { public class SerializationContext : IRequestContext { public SerializationContext(string contentType) { this.ResponseContentType = this.ContentType = contentType; } public T Get() where T : class { return default(T); } public string GetHeader(string headerName) { return null; } public string IpAddress { get { throw new NotImplementedException(); } } public IDictionary Cookies { get { return new Dictionary(); } } public EndpointAttributes EndpointAttributes { get { return EndpointAttributes.None; } } public IRequestAttributes RequestAttributes { get { throw new NotImplementedException(); } } public string ContentType { get; set; } public string ResponseContentType { get; set; } public string CompressionType { get; set; } public string AbsoluteUri { get { throw new NotImplementedException(); } } public string PathInfo { get { throw new NotImplementedException(); } } public IFile[] Files { get { return new IFile[0]; } } public void Dispose() { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpError.cs0000644000175000017500000000736312146506550026070 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Net; using ServiceStack.ServiceHost; using ServiceStack.ServiceInterface.ServiceModel; namespace ServiceStack.Common.Web { public class HttpError : Exception, IHttpError { public HttpError() : this(null) {} public HttpError(string message) : this(HttpStatusCode.InternalServerError, message) {} public HttpError(HttpStatusCode statusCode, string errorCode) : this(statusCode, errorCode, null) { } public HttpError(int statusCode, string errorCode) : this(statusCode, errorCode, null) { } public HttpError(object responseDto, HttpStatusCode statusCode, string errorCode, string errorMessage) : this(statusCode, errorCode, errorMessage) { this.Response = responseDto; } public HttpError(object responseDto, int statusCode, string errorCode, string errorMessage) : this(statusCode, errorCode, errorMessage) { this.Response = responseDto; } public HttpError(HttpStatusCode statusCode, string errorCode, string errorMessage) : this((int)statusCode, errorCode, errorMessage){} public HttpError(int statusCode, string errorCode, string errorMessage) : base(errorMessage ?? errorCode) { this.ErrorCode = errorCode; this.Status = statusCode; this.Headers = new Dictionary(); this.StatusDescription = errorCode; } public HttpError(HttpStatusCode statusCode, Exception innerException) : this(innerException.Message, innerException) { this.StatusCode = statusCode; } public HttpError(string message, Exception innerException) : base(message, innerException) { if (innerException != null) { this.ErrorCode = innerException.GetType().Name; } this.Headers = new Dictionary(); } public string ErrorCode { get; set; } public string ContentType { get; set; } public Dictionary Headers { get; set; } public int Status { get; set; } public HttpStatusCode StatusCode { get { return (HttpStatusCode)Status; } set { Status = (int)value; } } public string StatusDescription { get; set; } public object Response { get; set; } public IContentTypeWriter ResponseFilter { get; set; } public IRequestContext RequestContext { get; set; } public IDictionary Options { get { return this.Headers; } } public ResponseStatus ResponseStatus { get { return this.Response.ToResponseStatus(); } } public List GetFieldErrors() { var responseStatus = ResponseStatus; if (responseStatus != null) return responseStatus.Errors ?? new List(); return new List(); } public static Exception NotFound(string message) { return new HttpError(HttpStatusCode.NotFound, message); } public static Exception Unauthorized(string message) { return new HttpError(HttpStatusCode.Unauthorized, message); } public static Exception Conflict(string message) { return new HttpError(HttpStatusCode.Conflict, message); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpResponseFilter.cs0000644000175000017500000003105512146506550027736 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; using System.Text; using ServiceStack.ServiceHost; using ServiceStack.ServiceModel.Serialization; using ServiceStack.Text; namespace ServiceStack.Common.Web { public class HttpResponseFilter : IContentTypeFilter { private static readonly UTF8Encoding UTF8EncodingWithoutBom = new UTF8Encoding(false); public static HttpResponseFilter Instance = new HttpResponseFilter(); public Dictionary ContentTypeSerializers = new Dictionary(); public Dictionary ContentTypeResponseSerializers = new Dictionary(); public Dictionary ContentTypeDeserializers = new Dictionary(); public HttpResponseFilter() { this.ContentTypeFormats = new Dictionary(); } public void ClearCustomFilters() { this.ContentTypeFormats = new Dictionary(); this.ContentTypeSerializers = new Dictionary(); this.ContentTypeDeserializers = new Dictionary(); } public Dictionary ContentTypeFormats { get; set; } public void Register(string contentType, StreamSerializerDelegate streamSerializer, StreamDeserializerDelegate streamDeserializer) { if (contentType.IsNullOrEmpty()) throw new ArgumentNullException("contentType"); var parts = contentType.Split('/'); var format = parts[parts.Length - 1]; this.ContentTypeFormats[format] = contentType; SetContentTypeSerializer(contentType, streamSerializer); SetContentTypeDeserializer(contentType, streamDeserializer); } public void Register(string contentType, ResponseSerializerDelegate responseSerializer, StreamDeserializerDelegate streamDeserializer) { if (contentType.IsNullOrEmpty()) throw new ArgumentNullException("contentType"); var parts = contentType.Split('/'); var format = parts[parts.Length - 1]; this.ContentTypeFormats[format] = contentType; this.ContentTypeResponseSerializers[contentType] = responseSerializer; SetContentTypeDeserializer(contentType, streamDeserializer); } public void SetContentTypeSerializer(string contentType, StreamSerializerDelegate streamSerializer) { this.ContentTypeSerializers[contentType] = streamSerializer; } public void SetContentTypeDeserializer(string contentType, StreamDeserializerDelegate streamDeserializer) { this.ContentTypeDeserializers[contentType] = streamDeserializer; } public string Serialize(string contentType, object response) { switch (contentType) { case ContentType.Xml: return XmlSerializer.SerializeToString(response); case ContentType.Json: return JsonDataContractSerializer.Instance.SerializeToString(response); case ContentType.Jsv: return TypeSerializer.SerializeToString(response); default: throw new NotSupportedException("ContentType not supported: " + contentType); } } public byte[] SerializeToBytes(IRequestContext requestContext, object response) { var contentType = requestContext.ResponseContentType; StreamSerializerDelegate responseStreamWriter; if (this.ContentTypeSerializers.TryGetValue(contentType, out responseStreamWriter) || this.ContentTypeSerializers.TryGetValue(ContentType.GetRealContentType(contentType), out responseStreamWriter)) { using (var ms = new MemoryStream()) { responseStreamWriter(requestContext, response, ms); ms.Position = 0; return ms.ToArray(); } } ResponseSerializerDelegate responseWriter; if (this.ContentTypeResponseSerializers.TryGetValue(contentType, out responseWriter) || this.ContentTypeResponseSerializers.TryGetValue(ContentType.GetRealContentType(contentType), out responseWriter)) { using (var ms = new MemoryStream()) { var httpRes = new HttpResponseStreamWrapper(ms); responseWriter(requestContext, response, httpRes); ms.Position = 0; return ms.ToArray(); } } var contentTypeAttr = ContentType.GetEndpointAttributes(contentType); switch (contentTypeAttr) { case EndpointAttributes.Xml: return XmlSerializer.SerializeToString(response).ToUtf8Bytes(); case EndpointAttributes.Json: return JsonDataContractSerializer.Instance.SerializeToString(response).ToUtf8Bytes(); case EndpointAttributes.Jsv: return TypeSerializer.SerializeToString(response).ToUtf8Bytes(); } throw new NotSupportedException("ContentType not supported: " + contentType); } public string SerializeToString(IRequestContext requestContext, object response) { var contentType = requestContext.ResponseContentType; StreamSerializerDelegate responseStreamWriter; if (this.ContentTypeSerializers.TryGetValue(contentType, out responseStreamWriter) || this.ContentTypeSerializers.TryGetValue(ContentType.GetRealContentType(contentType), out responseStreamWriter)) { using (var ms = new MemoryStream()) { responseStreamWriter(requestContext, response, ms); ms.Position = 0; var result = new StreamReader(ms, UTF8EncodingWithoutBom).ReadToEnd(); return result; } } ResponseSerializerDelegate responseWriter; if (this.ContentTypeResponseSerializers.TryGetValue(contentType, out responseWriter) || this.ContentTypeResponseSerializers.TryGetValue(ContentType.GetRealContentType(contentType), out responseWriter)) { using (var ms = new MemoryStream()) { var httpRes = new HttpResponseStreamWrapper(ms); responseWriter(requestContext, response, httpRes); ms.Position = 0; var result = new StreamReader(ms, UTF8EncodingWithoutBom).ReadToEnd(); return result; } } var contentTypeAttr = ContentType.GetEndpointAttributes(contentType); switch (contentTypeAttr) { case EndpointAttributes.Xml: return XmlSerializer.SerializeToString(response); case EndpointAttributes.Json: return JsonDataContractSerializer.Instance.SerializeToString(response); case EndpointAttributes.Jsv: return TypeSerializer.SerializeToString(response); } throw new NotSupportedException("ContentType not supported: " + contentType); } public void SerializeToStream(IRequestContext requestContext, object response, Stream responseStream) { var contentType = requestContext.ResponseContentType; var serializer = GetResponseSerializer(contentType); if (serializer == null) throw new NotSupportedException("ContentType not supported: " + contentType); var httpRes = new HttpResponseStreamWrapper(responseStream); serializer(requestContext, response, httpRes); } public void SerializeToResponse(IRequestContext requestContext, object response, IHttpResponse httpResponse) { var contentType = requestContext.ResponseContentType; var serializer = GetResponseSerializer(contentType); if (serializer == null) throw new NotSupportedException("ContentType not supported: " + contentType); serializer(requestContext, response, httpResponse); } public ResponseSerializerDelegate GetResponseSerializer(string contentType) { ResponseSerializerDelegate responseWriter; if (this.ContentTypeResponseSerializers.TryGetValue(contentType, out responseWriter)|| this.ContentTypeResponseSerializers.TryGetValue(ContentType.GetRealContentType(contentType), out responseWriter)) { return responseWriter; } var serializer = GetStreamSerializer(contentType); if (serializer == null) return null; return (httpReq, dto, httpRes) => serializer(httpReq, dto, httpRes.OutputStream); } public StreamSerializerDelegate GetStreamSerializer(string contentType) { StreamSerializerDelegate responseWriter; if (this.ContentTypeSerializers.TryGetValue(contentType, out responseWriter)|| this.ContentTypeSerializers.TryGetValue(ContentType.GetRealContentType(contentType), out responseWriter)) { return responseWriter; } var contentTypeAttr = ContentType.GetEndpointAttributes(contentType); switch (contentTypeAttr) { case EndpointAttributes.Xml: return (r, o, s) => XmlSerializer.SerializeToStream(o, s); case EndpointAttributes.Json: return (r, o, s) => JsonDataContractSerializer.Instance.SerializeToStream(o, s); case EndpointAttributes.Jsv: return (r, o, s) => TypeSerializer.SerializeToStream(o, s); } return null; } public object DeserializeFromString(string contentType, Type type, string request) { var contentTypeAttr = ContentType.GetEndpointAttributes(contentType); switch (contentTypeAttr) { case EndpointAttributes.Xml: return XmlSerializer.DeserializeFromString(request, type); case EndpointAttributes.Json: return JsonDataContractDeserializer.Instance.DeserializeFromString(request, type); case EndpointAttributes.Jsv: return TypeSerializer.DeserializeFromString(request, type); default: throw new NotSupportedException("ContentType not supported: " + contentType); } } public object DeserializeFromStream(string contentType, Type type, Stream fromStream) { var deserializer = GetStreamDeserializer(contentType); if (deserializer == null) throw new NotSupportedException("ContentType not supported: " + contentType); return deserializer(type, fromStream); } public StreamDeserializerDelegate GetStreamDeserializer(string contentType) { StreamDeserializerDelegate streamReader; var realContentType = contentType.Split(';')[0].Trim(); if (this.ContentTypeDeserializers.TryGetValue(realContentType, out streamReader)) { return streamReader; } var contentTypeAttr = ContentType.GetEndpointAttributes(contentType); switch (contentTypeAttr) { case EndpointAttributes.Xml: return XmlSerializer.DeserializeFromStream; case EndpointAttributes.Json: return JsonDataContractDeserializer.Instance.DeserializeFromStream; case EndpointAttributes.Jsv: return TypeSerializer.DeserializeFromStream; } return null; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/EndPoint.cs0000644000175000017500000000045512146506550025652 0ustar00meebeymeebey00000000000000namespace ServiceStack.Common.Web { public class EndPoint { public string Host { get; private set; } public int Port { get; private set; } public EndPoint(string host, int port) { Host = host; Port = port; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpHeaders.cs0000644000175000017500000000320412146506550026340 0ustar00meebeymeebey00000000000000namespace ServiceStack.Common.Web { public static class HttpHeaders { public const string XParamOverridePrefix = "X-Param-Override-"; public const string XHttpMethodOverride = "X-Http-Method-Override"; public const string XUserAuthId = "X-UAId"; public const string XForwardedFor = "X-Forwarded-For"; public const string XRealIp = "X-Real-IP"; public const string Referer = "Referer"; public const string CacheControl = "Cache-Control"; public const string IfModifiedSince = "If-Modified-Since"; public const string LastModified = "Last-Modified"; public const string Accept = "Accept"; public const string AcceptEncoding = "Accept-Encoding"; public const string ContentType = "Content-Type"; public const string ContentEncoding = "Content-Encoding"; public const string ContentLength = "Content-Length"; public const string ContentDisposition = "Content-Disposition"; public const string Location = "Location"; public const string SetCookie = "Set-Cookie"; public const string ETag = "ETag"; public const string Authorization = "Authorization"; public const string WwwAuthenticate = "WWW-Authenticate"; public const string AllowOrigin = "Access-Control-Allow-Origin"; public const string AllowMethods = "Access-Control-Allow-Methods"; public const string AllowHeaders = "Access-Control-Allow-Headers"; public const string AllowCredentials = "Access-Control-Allow-Credentials"; } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/EndpointType.cs0000644000175000017500000000032012146506550026543 0ustar00meebeymeebey00000000000000namespace ServiceStack.Common.Web { public enum EndpointType { None, Xml, Json, Jsv, Csv, ProtoBuf, Soap11, Soap12, } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/CompressedFileResult.cs0000644000175000017500000000356212146506550030237 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; using ServiceStack.Common.Extensions; using ServiceStack.Configuration; using ServiceStack.Service; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.Common.Web { public class CompressedFileResult : IStreamWriter, IHasOptions { public const int Adler32ChecksumLength = 4; public const string DefaultContentType = MimeTypes.Xml; public string FilePath { get; private set; } public Dictionary Headers { get; private set; } public IDictionary Options { get { return this.Headers; } } public CompressedFileResult(string filePath) : this(filePath, CompressionTypes.Deflate) { } public CompressedFileResult(string filePath, string compressionType) : this(filePath, compressionType, DefaultContentType) { } public CompressedFileResult(string filePath, string compressionType, string contentMimeType) { if (!CompressionTypes.IsValid(compressionType)) { throw new ArgumentException("Must be either 'deflate' or 'gzip'", compressionType); } this.FilePath = filePath; this.Headers = new Dictionary { { HttpHeaders.ContentType, contentMimeType }, { HttpHeaders.ContentEncoding, compressionType }, }; } public void WriteTo(Stream responseStream) { using (var fs = new FileStream(this.FilePath, FileMode.Open, FileAccess.Read)) { fs.Position = Adler32ChecksumLength; fs.WriteTo(responseStream); responseStream.Flush(); } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpResponseStreamWrapper.cs0000644000175000017500000000335512146506550031307 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using System.IO; using System.Text; using ServiceStack.Common.Utils; using ServiceStack.ServiceHost; namespace ServiceStack.Common.Web { public class HttpResponseStreamWrapper : IHttpResponse { private static readonly UTF8Encoding UTF8EncodingWithoutBom = new UTF8Encoding(false); public HttpResponseStreamWrapper(Stream stream) { this.OutputStream = stream; this.Headers = new Dictionary(); } public Dictionary Headers { get; set; } public object OriginalResponse { get { return null; } } public int StatusCode { set; private get; } public string StatusDescription { set; private get; } public string ContentType { get; set; } public ICookies Cookies { get; set; } public void AddHeader(string name, string value) { this.Headers[name] = value; } public void Redirect(string url) { this.Headers[HttpHeaders.Location] = url; } public Stream OutputStream { get; private set; } public void Write(string text) { var bytes = UTF8EncodingWithoutBom.GetBytes(text); OutputStream.Write(bytes, 0, bytes.Length); } public void Close() { if (IsClosed) return; OutputStream.Close(); IsClosed = true; } public void End() { Close(); } public void Flush() { OutputStream.Flush(); } public bool IsClosed { get; private set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/CompressedResult.cs0000644000175000017500000000450012146506550027430 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.IO; using System.Net; using ServiceStack.Service; using ServiceStack.ServiceHost; namespace ServiceStack.Common.Web { public class CompressedResult : IStreamWriter, IHttpResult { public const int Adler32ChecksumLength = 4; public const string DefaultContentType = MimeTypes.Xml; public byte[] Contents { get; private set; } public string ContentType { get; set; } public Dictionary Headers { get; private set; } public int Status { get; set; } public HttpStatusCode StatusCode { get { return (HttpStatusCode)Status; } set { Status = (int)value; } } public string StatusDescription { get; set; } public object Response { get { return this.Contents; } set { throw new NotImplementedException(); } } public IContentTypeWriter ResponseFilter { get; set; } public IRequestContext RequestContext { get; set; } public IDictionary Options { get { return this.Headers; } } public CompressedResult(byte[] contents) : this(contents, CompressionTypes.Deflate) { } public CompressedResult(byte[] contents, string compressionType) : this(contents, compressionType, DefaultContentType) { } public CompressedResult(byte[] contents, string compressionType, string contentMimeType) { if (!CompressionTypes.IsValid(compressionType)) { throw new ArgumentException("Must be either 'deflate' or 'gzip'", compressionType); } this.StatusCode = HttpStatusCode.OK; this.ContentType = contentMimeType; this.Contents = contents; this.Headers = new Dictionary { { HttpHeaders.ContentEncoding, compressionType }, }; } public void WriteTo(Stream responseStream) { responseStream.Write(this.Contents, 0, this.Contents.Length); //stream.Write(this.Contents, Adler32ChecksumLength, this.Contents.Length - Adler32ChecksumLength); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpMethods.cs0000644000175000017500000000225412146506550026374 0ustar00meebeymeebey00000000000000using System; using ServiceStack.ServiceHost; namespace ServiceStack.Common.Web { public static class HttpMethods { public const string Get = "GET"; public const string Put = "PUT"; public const string Post = "POST"; public const string Delete = "DELETE"; public const string Head = "HEAD"; public const string Options = "OPTIONS"; public const string Patch = "PATCH"; public static EndpointAttributes GetEndpointAttribute(string httpMethod) { switch (httpMethod.ToUpper()) { case Get: return EndpointAttributes.HttpGet; case Put: return EndpointAttributes.HttpPut; case Post: return EndpointAttributes.HttpPost; case Delete: return EndpointAttributes.HttpDelete; case Patch: return EndpointAttributes.HttpPatch; case Head: return EndpointAttributes.HttpHead; } return EndpointAttributes.None; } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/HttpResultExtensions.cs0000644000175000017500000000550212146506550030326 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Common.Utils; using ServiceStack.ServiceHost; using ServiceStack.ServiceInterface.ServiceModel; namespace ServiceStack.Common.Web { public static class HttpResultExtensions { /// /// Shortcut to get the ResponseDTO whether it's bare or inside a IHttpResult /// /// /// public static object ToDto(this object response) { if (response == null) return null; var httpResult = response as IHttpResult; return httpResult != null ? httpResult.Response : response; } /// /// Alias of ToDto /// public static object ToResponseDto(this object response) { return ToDto(response); } /// /// Shortcut to get the ResponseDTO whether it's bare or inside a IHttpResult /// /// /// TResponse if found; otherwise null public static TResponse ToDto(this object response) where TResponse : class { if (response == null) return default(TResponse); var httpResult = response as IHttpResult; return (httpResult != null ? httpResult.Response : response) as TResponse; } /// /// Alias of ToDto /// public static TResponse ToResponseDto(this object response) where TResponse : class { return ToDto(response); } /// /// Shortcut to get the ResponseStatus whether it's bare or inside a IHttpResult /// /// /// public static ResponseStatus ToResponseStatus(this object response) { if (response == null) return null; var hasResponseStatus = response as IHasResponseStatus; if (hasResponseStatus != null) return hasResponseStatus.ResponseStatus; var propertyInfo = response.GetType().GetProperty("ResponseStatus"); if (propertyInfo == null) return null; return ReflectionUtils.GetProperty(response, propertyInfo) as ResponseStatus; } /// /// Whether the response is an IHttpError or Exception /// /// /// public static bool IsErrorResponse(this object response) { return response != null && (response is IHttpError || response is Exception); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/ContentType.cs0000644000175000017500000001362612146506550026412 0ustar00meebeymeebey00000000000000using System; using ServiceStack.ServiceHost; using ServiceStack.Text; namespace ServiceStack.Common.Web { public static class ContentType { public const string Utf8Suffix = "; charset=utf-8"; public const string HeaderContentType = "Content-Type"; public const string FormUrlEncoded = "application/x-www-form-urlencoded"; public const string MultiPartFormData = "multipart/form-data"; public const string Html = "text/html"; public const string JsonReport = "text/jsonreport"; public const string Xml = "application/xml"; public const string XmlText = "text/xml"; public const string Soap11 = " text/xml; charset=utf-8"; public const string Soap12 = " application/soap+xml"; public const string Json = "application/json"; public const string JsonText = "text/json"; public const string JavaScript = "application/javascript"; public const string Jsv = "application/jsv"; public const string JsvText = "text/jsv"; public const string Csv = "text/csv"; public const string Yaml = "application/yaml"; public const string YamlText = "text/yaml"; public const string PlainText = "text/plain"; public const string MarkdownText = "text/markdown"; public const string ProtoBuf = "application/x-protobuf"; public const string MsgPack = "application/x-msgpack"; public const string Bson = "application/bson"; public const string Binary = "application/octet-stream"; public static EndpointAttributes GetEndpointAttributes(string contentType) { if (contentType == null) return EndpointAttributes.None; var realContentType = GetRealContentType(contentType); switch (realContentType) { case Json: case JsonText: return EndpointAttributes.Json; case Xml: case XmlText: return EndpointAttributes.Xml; case Html: return EndpointAttributes.Html; case Jsv: case JsvText: return EndpointAttributes.Jsv; case Yaml: case YamlText: return EndpointAttributes.Yaml; case Csv: return EndpointAttributes.Csv; case Soap11: return EndpointAttributes.Soap11; case Soap12: return EndpointAttributes.Soap12; } return EndpointAttributes.None; } public static string GetRealContentType(string contentType) { return contentType == null ? null : contentType.Split(';')[0].Trim(); } public static bool MatchesContentType(this string contentType, string matchesContentType) { return GetRealContentType(contentType) == GetRealContentType(matchesContentType); } public static bool IsBinary(this string contentType) { var realContentType = GetRealContentType(contentType); switch (realContentType) { case ProtoBuf: case MsgPack: case Binary: case Bson: return true; } var primaryType = realContentType.SplitOnFirst('/')[0]; switch (primaryType) { case "image": case "audio": case "video": return true; } return false; } public static Feature GetFeature(string contentType) { if (contentType == null) return Feature.None; var realContentType = GetRealContentType(contentType); switch (realContentType) { case Json: case JsonText: return Feature.Json; case Xml: case XmlText: return Feature.Xml; case Html: return Feature.Html; case Jsv: case JsvText: return Feature.Jsv; case Csv: return Feature.Csv; case Soap11: return Feature.Soap11; case Soap12: return Feature.Soap12; } return Feature.None; } public static string GetContentFormat(EndpointType endpointType) { return endpointType.ToString().ToLower(); } public static string GetContentFormat(string contentType) { if (contentType == null) return contentType; var parts = contentType.Split('/'); return parts[parts.Length - 1]; } public static string ToContentFormat(this string contentType) { return GetContentFormat(contentType); } public static string GetContentType(EndpointType endpointType) { switch (endpointType) { case EndpointType.Soap11: case EndpointType.Soap12: case EndpointType.Xml: return Xml; case EndpointType.Json: return Json; case EndpointType.Jsv: return JsvText; case EndpointType.ProtoBuf: return ProtoBuf; default: return null; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Web/CompressionTypes.cs0000644000175000017500000000233712146506550027461 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Common.Web { public static class CompressionTypes { public static readonly string[] AllCompressionTypes = new[] { Deflate, GZip }; public const string Default = Deflate; public const string Deflate = "deflate"; public const string GZip = "gzip"; public static bool IsValid(string compressionType) { return compressionType == Deflate || compressionType == GZip; } public static void AssertIsValid(string compressionType) { if (!IsValid(compressionType)) { throw new NotSupportedException(compressionType + " is not a supported compression type. Valid types: gzip, deflate."); } } public static string GetExtension(string compressionType) { switch (compressionType) { case Deflate: case GZip: return "." + compressionType; default: throw new NotSupportedException( "Unknown compressionType: " + compressionType); } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Expressions/0000755000175000017500000000000012146506550025404 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Expressions/DelegateFactory.cs0000644000175000017500000000523612146506550031003 0ustar00meebeymeebey00000000000000using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace ServiceStack.Common.Expressions { public static class DelegateFactory { /* * MethodInfo method = typeof(String).GetMethod("StartsWith", new[] { typeof(string) }); LateBoundMethod callback = DelegateFactory.Create(method); string foo = "this is a test"; bool result = (bool) callback(foo, new[] { "this" }); result.ShouldBeTrue(); */ public delegate object LateBoundMethod(object target, object[] arguments); public static LateBoundMethod Create(MethodInfo method) { ParameterExpression instanceParameter = Expression.Parameter(typeof(object), "target"); ParameterExpression argumentsParameter = Expression.Parameter(typeof(object[]), "arguments"); MethodCallExpression call = Expression.Call( Expression.Convert(instanceParameter, method.DeclaringType), method, CreateParameterExpressions(method, argumentsParameter)); Expression lambda = Expression.Lambda( Expression.Convert(call, typeof(object)), instanceParameter, argumentsParameter); return lambda.Compile(); } private static Expression[] CreateParameterExpressions(MethodInfo method, Expression argumentsParameter) { return method.GetParameters().Select((parameter, index) => Expression.Convert( Expression.ArrayIndex(argumentsParameter, Expression.Constant(index)), parameter.ParameterType)).ToArray(); } public delegate void LateBoundVoid(object target, object[] arguments); public static LateBoundVoid CreateVoid(MethodInfo method) { ParameterExpression instanceParameter = Expression.Parameter(typeof(object), "target"); ParameterExpression argumentsParameter = Expression.Parameter(typeof(object[]), "arguments"); MethodCallExpression call = Expression.Call( Expression.Convert(instanceParameter, method.DeclaringType), method, CreateParameterExpressions(method, argumentsParameter)); var lambda = Expression.Lambda( Expression.Convert(call, method.ReturnParameter.ParameterType), instanceParameter, argumentsParameter); return lambda.Compile(); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/README.md0000644000175000017500000000071712146506550024346 0ustar00meebeymeebey00000000000000# The ServiceStack.Common project This project holds common, generic and use-ful functionality that is commonly shared amongst other ServiceStack .NET projects # ServiceStack.ServiceClient.Web Holds the C# web sync / async REST, RPC and SOAP service clients. # Messaging A In-memory implmentation of a Transient Message Queue service publisher and consumer. Note: The ServiceStack.Redis C# client uses these classes to provide a Redis back end. smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/StringExtensions.cs0000644000175000017500000001362412146506550026745 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Text.RegularExpressions; using ServiceStack.Common.Utils; using ServiceStack.Text; using ServiceStack.Text.Common; namespace ServiceStack.Common { public static class StringExtensions { static readonly Regex RegexSplitCamelCase = new Regex("([A-Z]|[0-9]+)", #if !SILVERLIGHT && !MONOTOUCH && !XBOX RegexOptions.Compiled #else RegexOptions.None #endif ); public static T ToEnum(this string value) { return (T)Enum.Parse(typeof(T), value, true); } public static T ToEnumOrDefault(this string value, T defaultValue) { if (String.IsNullOrEmpty(value)) return defaultValue; return (T)Enum.Parse(typeof(T), value, true); } public static string SplitCamelCase(this string value) { return RegexSplitCamelCase.Replace(value, " $1").TrimStart(); } public static string ToEnglish(this string camelCase) { var ucWords = camelCase.SplitCamelCase().ToLower(); return ucWords[0].ToString(CultureInfo.InvariantCulture).ToUpper() + ucWords.Substring(1); } public static bool IsEmpty(this string value) { return String.IsNullOrEmpty(value); } public static bool IsNullOrEmpty(this string value) { return String.IsNullOrEmpty(value); } public static bool EqualsIgnoreCase(this string value, string other) { return String.Equals(value, other, StringComparison.CurrentCultureIgnoreCase); } public static string ReplaceFirst(this string haystack, string needle, string replacement) { var pos = haystack.IndexOf(needle); if (pos < 0) return haystack; return haystack.Substring(0, pos) + replacement + haystack.Substring(pos + needle.Length); } public static string ReplaceAll(this string haystack, string needle, string replacement) { int pos; // Avoid a possible infinite loop if (needle == replacement) return haystack; while ((pos = haystack.IndexOf(needle)) > 0) { haystack = haystack.Substring(0, pos) + replacement + haystack.Substring(pos + needle.Length); } return haystack; } public static bool ContainsAny(this string text, params string[] testMatches) { foreach (var testMatch in testMatches) { if (text.Contains(testMatch)) return true; } return false; } private static readonly Regex InvalidVarCharsRegEx = new Regex(@"[^A-Za-z0-9]", #if !SILVERLIGHT && !MONOTOUCH && !XBOX RegexOptions.Compiled #else RegexOptions.None #endif ); public static string SafeVarName(this string text) { if (String.IsNullOrEmpty(text)) return null; return InvalidVarCharsRegEx.Replace(text, "_"); } public static string Join(this List items) { return String.Join(JsWriter.ItemSeperatorString, items.ToArray()); } public static string Join(this List items, string delimeter) { return String.Join(delimeter, items.ToArray()); } public static string CombineWith(this string path, params string[] thesePaths) { if (thesePaths.Length == 1 && thesePaths[0] == null) return path; return PathUtils.CombinePaths(new StringBuilder(path.TrimEnd('/','\\')), thesePaths); } public static string ToParentPath(this string path) { var pos = path.LastIndexOf('/'); if (pos == -1) return "/"; var parentPath = path.Substring(0, pos); return parentPath; } public static string RemoveCharFlags(this string text, bool[] charFlags) { if (text == null) return null; var copy = text.ToCharArray(); var nonWsPos = 0; for (var i = 0; i < text.Length; i++) { var @char = text[i]; if (@char < charFlags.Length && charFlags[@char]) continue; copy[nonWsPos++] = @char; } return new String(copy, 0, nonWsPos); } public static string ToNullIfEmpty(this string text) { return String.IsNullOrEmpty(text) ? null : text; } private static char[] SystemTypeChars = new[] { '<', '>', '+' }; public static bool IsUserType(this Type type) { return type.IsClass && type.Namespace != null && !type.Namespace.StartsWith("System.") && type.Name.IndexOfAny(SystemTypeChars) == -1; } public static bool IsInt(this string text) { if (string.IsNullOrEmpty(text)) return false; int ret; return int.TryParse(text, out ret); } public static int ToInt(this string text) { return int.Parse(text); } public static int ToInt(this string text, int defaultValue) { int ret; return int.TryParse(text, out ret) ? ret : defaultValue; } public static long ToInt64(this string text) { return long.Parse(text); } public static long ToInt64(this string text, long defaultValue) { long ret; return long.TryParse(text, out ret) ? ret : defaultValue; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/0000755000175000017500000000000012146506550025443 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serialization/0000755000175000017500000000000012146506550030260 5ustar00meebeymeebey00000000000000StringMapTypeDeserializer.cs0000644000175000017500000001141712146506550035645 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serializationusing System; using System.Collections.Generic; using System.Runtime.Serialization; using ServiceStack.Common; using ServiceStack.Common.Utils; using ServiceStack.Logging; using ServiceStack.Text; using ServiceStack.Text.Common; using ServiceStack.Text.Jsv; namespace ServiceStack.ServiceModel.Serialization { /// /// Serializer cache of delegates required to create a type from a string map (e.g. for REST urls) /// public class StringMapTypeDeserializer { private static readonly ILog Log = LogManager.GetLogger(typeof(StringMapTypeDeserializer)); internal class PropertySerializerEntry { public PropertySerializerEntry(SetPropertyDelegate propertySetFn, ParseStringDelegate propertyParseStringFn) { PropertySetFn = propertySetFn; PropertyParseStringFn = propertyParseStringFn; } public SetPropertyDelegate PropertySetFn; public ParseStringDelegate PropertyParseStringFn; public Type PropertyType; } private readonly Type type; private readonly Dictionary propertySetterMap = new Dictionary(StringComparer.InvariantCultureIgnoreCase); public StringMapTypeDeserializer(Type type) { this.type = type; if (type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable<>))) return; foreach (var propertyInfo in type.GetProperties()) { var propertySetFn = JsvDeserializeType.GetSetPropertyMethod(type, propertyInfo); var propertyType = propertyInfo.PropertyType; var propertyParseStringFn = JsvReader.GetParseFn(propertyType); var propertySerializer = new PropertySerializerEntry(propertySetFn, propertyParseStringFn) { PropertyType = propertyType }; var attr = propertyInfo.FirstAttribute(); if (attr != null && attr.Name != null) { propertySetterMap[attr.Name] = propertySerializer; } propertySetterMap[propertyInfo.Name] = propertySerializer; } } public object PopulateFromMap(object instance, IDictionary keyValuePairs) { string propertyName = null; string propertyTextValue = null; PropertySerializerEntry propertySerializerEntry = null; try { if (instance == null) instance = ReflectionUtils.CreateInstance(type); foreach (var pair in keyValuePairs) { propertyName = pair.Key; propertyTextValue = pair.Value; if (!propertySetterMap.TryGetValue(propertyName, out propertySerializerEntry)) { if (propertyName != "format" && propertyName != "callback" && propertyName != "debug") { Log.WarnFormat("Property '{0}' does not exist on type '{1}'", propertyName, type.FullName); } continue; } var value = propertySerializerEntry.PropertyParseStringFn(propertyTextValue); if (value == null) { Log.WarnFormat("Could not create instance on '{0}' for property '{1}' with text value '{2}'", instance, propertyName, propertyTextValue); continue; } propertySerializerEntry.PropertySetFn(instance, value); } return instance; } catch (Exception ex) { var serializationException = new SerializationException("KeyValueDataContractDeserializer: Error converting to type: " + ex.Message, ex); if (propertyName != null) { serializationException.Data.Add("propertyName", propertyName); } if (propertyTextValue != null) { serializationException.Data.Add("propertyValueString", propertyTextValue); } if (propertySerializerEntry != null && propertySerializerEntry.PropertyType != null) { serializationException.Data.Add("propertyType", propertySerializerEntry.PropertyType); } throw serializationException; } } public object CreateFromMap(IDictionary keyValuePairs) { return PopulateFromMap(null, keyValuePairs); } } }DataContractSerializer.cs0000644000175000017500000000637512146506550035144 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serializationusing System; using System.IO; using System.Runtime.Serialization; using System.Text; using System.Xml; using ServiceStack.DesignPatterns.Serialization; #if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.IO.Compression; #endif namespace ServiceStack.ServiceModel.Serialization { public class DataContractSerializer : IStringSerializer { private static readonly Encoding Encoding = Encoding.UTF8;// new UTF8Encoding(true); public static DataContractSerializer Instance = new DataContractSerializer(); public string Parse(XmlDto from, bool indentXml) { try { using (var ms = new MemoryStream()) { var serializer = new System.Runtime.Serialization.DataContractSerializer(from.GetType()); #if !SILVERLIGHT && !MONOTOUCH && !XBOX using (var xw = new XmlTextWriter(ms, Encoding)) { if (indentXml) { xw.Formatting = Formatting.Indented; } serializer.WriteObject(xw, from); xw.Flush(); #else serializer.WriteObject(ms, from); #endif ms.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(ms)) { return reader.ReadToEnd(); } #if !SILVERLIGHT && !MONOTOUCH && !XBOX } #endif } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", from.GetType().FullName), ex); } } public string Parse(XmlDto from) { return Parse(from, false); } public void SerializeToStream(object obj, Stream stream) { #if !SILVERLIGHT && !MONOTOUCH && !XBOX using (var xw = new XmlTextWriter(stream, Encoding)) { var serializer = new System.Runtime.Serialization.DataContractSerializer(obj.GetType()); serializer.WriteObject(xw, obj); } #else var serializer = new System.Runtime.Serialization.DataContractSerializer(obj.GetType()); serializer.WriteObject(stream, obj); #endif } #if !SILVERLIGHT && !MONOTOUCH && !XBOX public void CompressToStream(XmlDto from, Stream stream) { using (var deflateStream = new DeflateStream(stream, CompressionMode.Compress)) using (var xw = new XmlTextWriter(deflateStream, Encoding)) { var serializer = new System.Runtime.Serialization.DataContractSerializer(from.GetType()); serializer.WriteObject(xw, from); xw.Flush(); } } public byte[] Compress(XmlDto from) { using (var ms = new MemoryStream()) { CompressToStream(from, ms); return ms.ToArray(); } } #endif } } XmlSerializableSerializer.cs0000644000175000017500000000260712146506550035656 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serialization#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.IO; using System.Runtime.Serialization; using System.Text; using System.Xml; using ServiceStack.DesignPatterns.Serialization; using ServiceStack.ServiceModel.Support; namespace ServiceStack.ServiceModel.Serialization { public class XmlSerializableSerializer : IStringSerializer { public static XmlSerializableSerializer Instance = new XmlSerializableSerializer(); public string Parse(XmlDto from) { try { using (var ms = new MemoryStream()) { using (XmlWriter xw = new XmlTextWriter(ms, Encoding.UTF8)) { var ser = new XmlSerializerWrapper(from.GetType()); ser.WriteObject(xw, from); xw.Flush(); ms.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(ms)) { return reader.ReadToEnd(); } } } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", from.GetType().FullName), ex); } } } } #endifJsonDataContractDeserializer.cs0000644000175000017500000000577412146506550036311 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serializationusing System; using System.IO; using System.Runtime.Serialization; using System.Text; using ServiceStack.DesignPatterns.Serialization; using ServiceStack.Text; namespace ServiceStack.ServiceModel.Serialization { public class JsonDataContractDeserializer { public static JsonDataContractDeserializer Instance = new JsonDataContractDeserializer(); public ITextSerializer TextSerializer { get; set; } public bool UseBcl { get; set; } public object DeserializeFromString(string json, Type returnType) { if (TextSerializer != null) return TextSerializer.DeserializeFromString(json, returnType); #if !SILVERLIGHT && !MONOTOUCH && !XBOX if (!UseBcl) return JsonSerializer.DeserializeFromString(json, returnType); try { using (var ms = new MemoryStream()) { var bytes = Encoding.UTF8.GetBytes(json); ms.Write(bytes, 0, bytes.Length); ms.Position = 0; var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(returnType); return serializer.ReadObject(ms); } } catch (Exception ex) { throw new SerializationException("JsonDataContractDeserializer: Error converting to type: " + ex.Message, ex); } #else return JsonSerializer.DeserializeFromString(json, returnType); #endif } public T DeserializeFromString(string json) { if (TextSerializer != null) return TextSerializer.DeserializeFromString(json); if (UseBcl) return (T)DeserializeFromString(json, typeof(T)); return JsonSerializer.DeserializeFromString(json); } public T DeserializeFromStream(Stream stream) { if (TextSerializer != null) return TextSerializer.DeserializeFromStream(stream); #if !SILVERLIGHT && !MONOTOUCH && !XBOX if (UseBcl) { var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(stream); } #endif return JsonSerializer.DeserializeFromStream(stream); } public object DeserializeFromStream(Type type, Stream stream) { if (TextSerializer != null) return TextSerializer.DeserializeFromStream(type, stream); #if !SILVERLIGHT && !MONOTOUCH && !XBOX if (UseBcl) { var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(type); return serializer.ReadObject(stream); } #endif return JsonSerializer.DeserializeFromStream(type, stream); } } } XmlSerializableDeserializer.cs0000644000175000017500000000463612146506550036173 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serialization#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.IO; using System.Text; using System.Xml; using System.Runtime.Serialization; using ServiceStack.DesignPatterns.Serialization; namespace ServiceStack.ServiceModel.Serialization { public class XmlSerializableDeserializer : IStringDeserializer { public static XmlSerializableDeserializer Instance = new XmlSerializableDeserializer(); public To Parse(string xml) { var type = typeof(To); return (To)Parse(xml, type); } public object Parse(string xml, Type type) { try { var bytes = Encoding.UTF8.GetBytes(xml); using (var reader = XmlDictionaryReader.CreateTextReader(bytes, new XmlDictionaryReaderQuotas())) { var serializer = new System.Xml.Serialization.XmlSerializer(type); return serializer.Deserialize(reader); } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", type.FullName), ex); } } public To Parse(TextReader from) { var type = typeof(To); try { using (from) { var serializer = new System.Xml.Serialization.XmlSerializer(type); return (To)serializer.Deserialize(from); } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", type.FullName), ex); } } public To Parse(Stream from) { var type = typeof(To); try { using (var reader = XmlDictionaryReader.CreateTextReader(from, new XmlDictionaryReaderQuotas())) { var serializer = new System.Xml.Serialization.XmlSerializer(type); return (To)serializer.Deserialize(reader); } } catch (Exception ex) { throw new SerializationException(string.Format("Error serializing object of type {0}", type.FullName), ex); } } } } #endif KeyValueDataContractDeserializer.cs0000644000175000017500000000274312146506550037116 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serialization#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.Collections.Generic; using System.Collections.Specialized; namespace ServiceStack.ServiceModel.Serialization { public class KeyValueDataContractDeserializer { public static KeyValueDataContractDeserializer Instance = new KeyValueDataContractDeserializer(); public object Parse(NameValueCollection nameValues, Type returnType) { return Parse(nameValues.ToDictionary(), returnType); } readonly Dictionary typeStringMapSerializerMap = new Dictionary(); public object Parse(IDictionary keyValuePairs, Type returnType) { StringMapTypeDeserializer stringMapTypeDeserializer; lock (typeStringMapSerializerMap) { if (!typeStringMapSerializerMap.TryGetValue(returnType, out stringMapTypeDeserializer)) { stringMapTypeDeserializer = new StringMapTypeDeserializer(returnType); typeStringMapSerializerMap.Add(returnType, stringMapTypeDeserializer); } } return stringMapTypeDeserializer.CreateFromMap(keyValuePairs); } public To Parse(IDictionary keyValuePairs) { return (To)Parse(keyValuePairs, typeof(To)); } } } #endifDataContractDeserializer.cs0000644000175000017500000000447612146506550035455 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serializationusing System; using System.IO; using System.Text; using System.Runtime.Serialization; using System.Xml; using ServiceStack.DesignPatterns.Serialization; namespace ServiceStack.ServiceModel.Serialization { public class DataContractDeserializer : IStringDeserializer { /// /// Default MaxStringContentLength is 8k, and throws an exception when reached /// #if !SILVERLIGHT && !MONOTOUCH && !XBOX private readonly XmlDictionaryReaderQuotas quotas; #endif public static DataContractDeserializer Instance = new DataContractDeserializer( #if !SILVERLIGHT && !MONOTOUCH && !XBOX new XmlDictionaryReaderQuotas { MaxStringContentLength = 1024 * 1024, } #endif ); public DataContractDeserializer( #if !SILVERLIGHT && !MONOTOUCH && !XBOX XmlDictionaryReaderQuotas quotas=null #endif ) { #if !SILVERLIGHT && !MONOTOUCH && !XBOX this.quotas = quotas; #endif } public object Parse(string xml, Type type) { try { var bytes = Encoding.UTF8.GetBytes(xml); #if MONOTOUCH using (var reader = XmlDictionaryReader.CreateTextReader(bytes, null)) #elif SILVERLIGHT using (var reader = XmlDictionaryReader.CreateTextReader(bytes, XmlDictionaryReaderQuotas.Max)) #else using (var reader = XmlDictionaryReader.CreateTextReader(bytes, this.quotas)) #endif { var serializer = new System.Runtime.Serialization.DataContractSerializer(type); return serializer.ReadObject(reader); } } catch (Exception ex) { throw new SerializationException("DeserializeDataContract: Error converting type: " + ex.Message, ex); } } public T Parse(string xml) { var type = typeof(T); return (T)Parse(xml, type); } public T DeserializeFromStream(Stream stream) { var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(T)); return (T)serializer.ReadObject(stream); } } } JsonDataContractSerializer.cs0000644000175000017500000000464612146506550035775 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Serializationusing System; using System.IO; using System.Runtime.Serialization; using ServiceStack.DesignPatterns.Serialization; using ServiceStack.Text; namespace ServiceStack.ServiceModel.Serialization { public class JsonDataContractSerializer { public static JsonDataContractSerializer Instance = new JsonDataContractSerializer(); public ITextSerializer TextSerializer { get; set; } public static void UseSerializer(ITextSerializer textSerializer) { Instance.TextSerializer = textSerializer; JsonDataContractDeserializer.Instance.TextSerializer = textSerializer; } public bool UseBcl { get; set; } public string SerializeToString(T obj) { if (TextSerializer != null) return TextSerializer.SerializeToString(obj); #if !SILVERLIGHT && !MONOTOUCH && !XBOX if (!UseBcl) return JsonSerializer.SerializeToString(obj); if (obj == null) return null; var type = obj.GetType(); try { using (var ms = new MemoryStream()) { var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(type); serializer.WriteObject(ms, obj); ms.Position = 0; using (var sr = new StreamReader(ms)) { return sr.ReadToEnd(); } } } catch (Exception ex) { throw new SerializationException("JsonDataContractSerializer: Error converting type: " + ex.Message, ex); } #else return JsonSerializer.SerializeToString(obj); #endif } public void SerializeToStream(T obj, Stream stream) { if (TextSerializer != null) { TextSerializer.SerializeToStream(obj, stream); } #if !SILVERLIGHT && !MONOTOUCH && !XBOX else if (UseBcl) { var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType()); serializer.WriteObject(stream, obj); } #endif else { JsonSerializer.SerializeToStream(obj, stream); } } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Validation/0000755000175000017500000000000012146506550027535 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Validation/ValidationError.cs0000644000175000017500000001235212146506550033173 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Text; using ServiceStack.Common.Extensions; namespace ServiceStack.Validation { /// /// The exception which is thrown when a validation error occured. /// This validation is serialized in a extra clean and human-readable way by ServiceStack. /// public class ValidationError : ArgumentException { private readonly string errorCode; public string ErrorMessage { get; private set; } public ValidationError(string errorCode) : this(errorCode, errorCode.SplitCamelCase()) { } public ValidationError(ValidationErrorResult validationResult) : base(validationResult.ErrorMessage) { this.errorCode = validationResult.ErrorCode; this.ErrorMessage = validationResult.ErrorMessage; this.Violations = validationResult.Errors; } public ValidationError(ValidationErrorField validationError) : this(validationError.ErrorCode, validationError.ErrorMessage) { this.Violations.Add(validationError); } public ValidationError(string errorCode, string errorMessage) : base(errorMessage) { this.errorCode = errorCode; this.ErrorMessage = errorMessage; this.Violations = new List(); } /// /// Returns the first error code /// /// The error code. public string ErrorCode { get { return this.errorCode; } } public override string Message { get { //If there is only 1 validation error than we just show the error message if (this.Violations.Count == 0) return this.ErrorMessage; if (this.Violations.Count == 1) return this.ErrorMessage ?? this.Violations[0].ErrorMessage; var sb = new StringBuilder(this.ErrorMessage).AppendLine(); foreach (var error in this.Violations) { if (!string.IsNullOrEmpty(error.ErrorMessage)) { var fieldLabel = error.FieldName != null ? string.Format(" [{0}]", error.FieldName) : null; sb.AppendFormat("\n - {0}{1}", error.ErrorMessage, fieldLabel); } else { var fieldLabel = error.FieldName != null ? ": " + error.FieldName : null; sb.AppendFormat("\n - {0}{1}", error.ErrorCode, fieldLabel); } } return sb.ToString(); } } public IList Violations { get; private set; } /// /// Used if we need to serialize this exception to XML /// /// public string ToXml() { var sb = new StringBuilder(); sb.Append(""); foreach (ValidationErrorField error in this.Violations) { sb.Append("") .AppendFormat("{0}", error.ErrorCode) .AppendFormat("{0}", error.FieldName) .AppendFormat("{0}", error.ErrorMessage) .Append(""); } sb.Append(""); return sb.ToString(); } public static ValidationError CreateException(Enum errorCode) { return new ValidationError(errorCode.ToString()); } public static ValidationError CreateException(Enum errorCode, string errorMessage) { return new ValidationError(errorCode.ToString(), errorMessage); } public static ValidationError CreateException(Enum errorCode, string errorMessage, string fieldName) { return CreateException(errorCode.ToString(), errorMessage, fieldName); } public static ValidationError CreateException(string errorCode) { return new ValidationError(errorCode); } public static ValidationError CreateException(string errorCode, string errorMessage) { return new ValidationError(errorCode, errorMessage); } public static ValidationError CreateException(string errorCode, string errorMessage, string fieldName) { var error = new ValidationErrorField(errorCode, fieldName, errorMessage); return new ValidationError(new ValidationErrorResult(new List { error })); } public static ValidationError CreateException(ValidationErrorField error) { return new ValidationError(error); } public static void ThrowIfNotValid(ValidationErrorResult validationResult) { if (!validationResult.IsValid) { throw new ValidationError(validationResult); } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Validation/ValidationErrorResult.cs0000644000175000017500000000723512146506550034376 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.Common.Extensions; namespace ServiceStack.Validation { /// /// Encapsulates a validation result. /// public class ValidationErrorResult { public static ValidationErrorResult Success { get { return new ValidationErrorResult(); } } /// /// Gets or sets the success code. /// /// The success code. public string SuccessCode { get; protected set; } /// /// Gets or sets the error code. /// /// The error code. public string ErrorCode { get; set; } /// /// Gets or sets the success message. /// /// The success message. public string SuccessMessage { get; set; } /// /// Gets or sets the error message. /// /// The error message. public string ErrorMessage { get; set; } public virtual string Message { get { return Errors.Count > 0 ? ErrorMessage : SuccessMessage; } } /// /// The errors generated by the validation. /// public IList Errors { get; protected set; } /// /// Returns True if the validation was successful (errors list is empty). /// public virtual bool IsValid { get { return this.Errors.Count == 0; } } /// /// Constructs a new ValidationResult /// public ValidationErrorResult() : this(new List()) { } /// /// Constructs a new ValidationResult /// /// A list of validation results public ValidationErrorResult(IList errors) : this(errors, null, null) { } /// /// Initializes a new instance of the class. /// /// The errors. /// The success code. /// The error code. public ValidationErrorResult(IList errors, string successCode, string errorCode) { this.Errors = errors ?? new List(); if (successCode != null) { this.SuccessCode = successCode; this.SuccessMessage = successCode.SplitCamelCase(); } if (errorCode != null) { this.ErrorCode = errorCode; } else { if (this.Errors.Count > 0) { this.ErrorCode = this.Errors[0].ErrorCode; this.ErrorMessage = this.Errors[0].ErrorMessage; } } if (this.ErrorMessage == null && this.ErrorCode != null) { this.ErrorMessage = this.ErrorCode.ToEnglish(); } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Validation/ValidationErrorField.cs0000644000175000017500000000227112146506550034136 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Common.Extensions; namespace ServiceStack.Validation { public class ValidationErrorField { public ValidationErrorField(string errorCode, string fieldName) : this(errorCode, fieldName, null) {} public ValidationErrorField(string errorCode) : this(errorCode, null, null) { } public ValidationErrorField(Enum errorCode) : this(errorCode.ToString(), null, null) { } public ValidationErrorField(Enum errorCode, string fieldName) : this(errorCode.ToString(), fieldName, null) { } public ValidationErrorField(Enum errorCode, string fieldName, string errorMessage) : this(errorCode.ToString(), fieldName, errorMessage) { } public ValidationErrorField(string errorCode, string fieldName, string errorMessage) { this.ErrorCode = errorCode; this.FieldName = fieldName; this.ErrorMessage = errorMessage ?? errorCode.ToEnglish(); } public string ErrorCode { get; set; } public string ErrorMessage { get; set; } public string FieldName { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Support/0000755000175000017500000000000012146506550027117 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/Support/XmlSerializableWrapper.cs0000644000175000017500000000760212146506550034103 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.Runtime.Serialization; using System.Xml; using System.Xml.Serialization; namespace ServiceStack.ServiceModel.Support { public sealed class XmlSerializerWrapper : XmlObjectSerializer { System.Xml.Serialization.XmlSerializer serializer; string defaultNS; readonly Type objectType; public XmlSerializerWrapper(Type type) : this(type, null, null) { } public XmlSerializerWrapper(Type type, string name, string ns) { this.objectType = type; if (!String.IsNullOrEmpty(ns)) { this.defaultNS = ns; this.serializer = new System.Xml.Serialization.XmlSerializer(type, ns); } else { this.defaultNS = GetNamespace(type); this.serializer = new System.Xml.Serialization.XmlSerializer(type); } } public override bool IsStartObject(XmlDictionaryReader reader) { throw new NotImplementedException(); } public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName) { throw new NotImplementedException(); } public override void WriteEndObject(XmlDictionaryWriter writer) { throw new NotImplementedException(); } public override void WriteObjectContent(XmlDictionaryWriter writer, object graph) { throw new NotImplementedException(); } public override void WriteStartObject(XmlDictionaryWriter writer, object graph) { throw new NotImplementedException(); } public override void WriteObject(XmlDictionaryWriter writer, object graph) { this.serializer.Serialize(writer, graph); } public override object ReadObject(XmlDictionaryReader reader) { string readersNS; readersNS = (String.IsNullOrEmpty(reader.NamespaceURI)) ? "" : reader.NamespaceURI; if (String.Compare(this.defaultNS, readersNS) != 0) { this.serializer = new System.Xml.Serialization.XmlSerializer(this.objectType, readersNS); this.defaultNS = readersNS; } return (this.serializer.Deserialize(reader)); } /// /// Gets the namespace from an attribute marked on the type's definition /// /// /// Namespace of type public static string GetNamespace(Type type) { Attribute[] attrs = (Attribute[])type.GetCustomAttributes(typeof(DataContractAttribute), true); if (attrs.Length > 0) { DataContractAttribute dcAttr = (DataContractAttribute)attrs[0]; return dcAttr.Namespace; } attrs = (Attribute[])type.GetCustomAttributes(typeof(XmlRootAttribute), true); if (attrs.Length > 0) { XmlRootAttribute xmlAttr = (XmlRootAttribute)attrs[0]; return xmlAttr.Namespace; } attrs = (Attribute[])type.GetCustomAttributes(typeof(XmlTypeAttribute), true); if (attrs.Length > 0) { XmlTypeAttribute xmlAttr = (XmlTypeAttribute)attrs[0]; return xmlAttr.Namespace; } attrs = (Attribute[])type.GetCustomAttributes(typeof(XmlElementAttribute), true); if (attrs.Length > 0) { XmlElementAttribute xmlAttr = (XmlElementAttribute)attrs[0]; return xmlAttr.Namespace; } return null; } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/XLinqExtensions.cs0000644000175000017500000002415512146506550031114 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX // // ServiceStack: Useful extensions to simplify parsing xml with XLinq // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2012 ServiceStack // // Licensed under the new BSD license. // using System; using System.Collections.Generic; using System.Xml; using System.Xml.Linq; namespace ServiceStack.ServiceModel { public static class XLinqExtensions { public static string GetString(this XElement el, string name) { return el == null ? null : GetElementValueOrDefault(el, name, x => x.Value); } public static string GetStringAttributeOrDefault(this XElement element, string name) { var attr = AnyAttribute(element, name); return attr == null ? null : GetAttributeValueOrDefault(attr, name, x => x.Value); } public static bool GetBool(this XElement el, string name) { AssertElementHasValue(el, name); return (bool)GetElement(el, name); } public static bool GetBoolOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (bool)x); } public static bool? GetNullableBool(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (bool?)childEl; } public static int GetInt(this XElement el, string name) { AssertElementHasValue(el, name); return (int)GetElement(el, name); } public static int GetIntOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (int)x); } public static int? GetNullableInt(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (int?)childEl; } public static long GetLong(this XElement el, string name) { AssertElementHasValue(el, name); return (long)GetElement(el, name); } public static long GetLongOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (long)x); } public static long? GetNullableLong(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (long?)childEl; } public static decimal GetDecimal(this XElement el, string name) { AssertElementHasValue(el, name); return (decimal)GetElement(el, name); } public static decimal GetDecimalOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (decimal)x); } public static decimal? GetNullableDecimal(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (decimal?)childEl; } public static DateTime GetDateTime(this XElement el, string name) { AssertElementHasValue(el, name); return (DateTime)GetElement(el, name); } public static DateTime GetDateTimeOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (DateTime)x); } public static DateTime? GetNullableDateTime(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (DateTime?)childEl; } public static TimeSpan GetTimeSpan(this XElement el, string name) { AssertElementHasValue(el, name); return (TimeSpan)GetElement(el, name); } public static TimeSpan GetTimeSpanOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (TimeSpan)x); } public static TimeSpan? GetNullableTimeSpan(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (TimeSpan?)childEl; } public static Guid GetGuid(this XElement el, string name) { AssertElementHasValue(el, name); return (Guid)GetElement(el, name); } public static Guid GetGuidOrDefault(this XElement el, string name) { return GetElementValueOrDefault(el, name, x => (Guid)x); } public static Guid? GetNullableGuid(this XElement el, string name) { var childEl = GetElement(el, name); return childEl == null || string.IsNullOrEmpty(childEl.Value) ? null : (Guid?)childEl; } public static T GetElementValueOrDefault(this XElement element, string name, Func converter) { if (converter == null) { throw new ArgumentNullException("converter"); } var el = GetElement(element, name); return el == null || string.IsNullOrEmpty(el.Value) ? default(T) : converter(el); } public static XElement GetElement(this XElement element, string name) { if (element == null) { throw new ArgumentNullException("element"); } if (name == null) { throw new ArgumentNullException("name"); } return element.AnyElement(name); } public static T GetAttributeValueOrDefault(this XAttribute attr, string name, Func converter) { if (converter == null) { throw new ArgumentNullException("converter"); } return attr == null || string.IsNullOrEmpty(attr.Value) ? default(T) : converter(attr); } public static void AssertExactlyOneResult(this XElement queryListItems, string referenceNumber, string formType) { int count = Convert.ToInt32(queryListItems.AnyAttribute("ItemCount").Value); if (count == 0) throw new InvalidOperationException(string.Format("There is no {0} for with a deal reference number {1}", formType, referenceNumber)); if (count > 1) throw new InvalidOperationException( string.Format("There are more than one {0}s with deal reference number {1}", formType, referenceNumber)); } public static void AssertElementHasValue(this XElement element, string name) { if (element == null) { throw new ArgumentNullException("element"); } if (name == null) { throw new ArgumentNullException("name"); } var childEl = element.AnyElement(name); if (childEl == null || string.IsNullOrEmpty(childEl.Value)) { throw new ArgumentNullException(name, string.Format("{0} is required", name)); } } public static List GetValues(this IEnumerable els) { var values = new List(); foreach (var el in els) { values.Add(el.Value); } return values; } public static XAttribute AnyAttribute(this XElement element, string name) { if (element == null) return null; foreach (var attribute in element.Attributes()) { if (attribute.Name.LocalName == name) { return attribute; } } return null; } public static IEnumerable AllElements(this XElement element, string name) { var els = new List(); if (element == null) return els; foreach (var node in element.Nodes()) { if (node.NodeType != XmlNodeType.Element) continue; var childEl = (XElement)node; if (childEl.Name.LocalName == name) { els.Add(childEl); } } return els; } public static XElement AnyElement(this XElement element, string name) { if (element == null) return null; foreach (var node in element.Nodes()) { if (node.NodeType != XmlNodeType.Element) continue; var childEl = (XElement)node; if (childEl.Name.LocalName == name) { return childEl; } } return null; } public static XElement AnyElement(this IEnumerable elements, string name) { foreach (var element in elements) { if (element.Name.LocalName == name) { return element; } } return null; } public static IEnumerable AllElements(this IEnumerable elements, string name) { var els = new List(); foreach (var element in elements) { els.AddRange(AllElements(element, name)); } return els; } public static XElement FirstElement(this XElement element) { if (element.FirstNode.NodeType == XmlNodeType.Element) { return (XElement)element.FirstNode; } return null; } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ServiceModel/DictionaryExtensions.cs0000644000175000017500000000270712146506550032165 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.Collections.Generic; using System.Collections.Specialized; namespace ServiceStack.ServiceModel { public static class DictionaryExtensions { public static Dictionary ToDictionary(this NameValueCollection nameValues) { if (nameValues == null) return new Dictionary(); var map = new Dictionary(); foreach (var key in nameValues.AllKeys) { if (key == null) { //occurs when no value is specified, e.g. 'path/to/page?debug' //throw new ArgumentNullException("key", "nameValues: " + nameValues); continue; } var values = nameValues.GetValues(key); if (values != null && values.Length > 0) { map[key] = values[0]; } } return map; } public static NameValueCollection ToNameValueCollection(this Dictionary map) { if (map == null) return new NameValueCollection(); var nameValues = new NameValueCollection(); foreach (var item in map) { nameValues.Add(item.Key, item.Value); } return nameValues; } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/DictionaryExtensions.cs0000644000175000017500000000356312146506550027605 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.Common.Extensions; namespace ServiceStack.Common { public static class DictionaryExtensions { public static TValue GetValueOrDefault(this Dictionary dictionary, TKey key) { return dictionary.ContainsKey(key) ? dictionary[key] : default(TValue); } public static void ForEach(this Dictionary dictionary, Action onEachFn) { foreach (var entry in dictionary) { onEachFn(entry.Key, entry.Value); } } public static bool EquivalentTo(this IDictionary thisMap, IDictionary otherMap) { if (thisMap == null || otherMap == null) return thisMap == otherMap; if (thisMap.Count != otherMap.Count) return false; foreach (var entry in thisMap) { V otherValue; if (!otherMap.TryGetValue(entry.Key, out otherValue)) return false; if (!Equals(entry.Value, otherValue)) return false; } return true; } public static List ConvertAll(IDictionary map, Func createFn) { var list = new List(); map.ForEach((kvp) => list.Add(createFn(kvp.Key, kvp.Value))); return list; } public static V GetOrAdd(this Dictionary map, K key, Func createFn) { //simulate ConcurrentDictionary.GetOrAdd lock (map) { V val; if (!map.TryGetValue(key, out val)) map[key] = val = createFn(key); return val; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ModelConfig.cs0000644000175000017500000000037012146506550025577 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Common.Utils; namespace ServiceStack { public class ModelConfig { public static void Id(Func getIdFn) { IdUtils.CanGetId = getIdFn; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/StreamExtensions.cs0000644000175000017500000000602612146506550026730 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !XBOX using System; using System.IO; using System.Text; using ServiceStack.CacheAccess; using ServiceStack.Common.Support; using ServiceStack.Common.Web; using ServiceStack.Text; namespace ServiceStack.Common { public static class StreamExtensions { #if !MONOTOUCH /// /// Compresses the specified text using the default compression method: Deflate /// /// The text. /// Type of the compression. /// public static byte[] Compress(this string text, string compressionType) { if (compressionType == CompressionTypes.Deflate) return Deflate(text); if (compressionType == CompressionTypes.GZip) return GZip(text); throw new NotSupportedException(compressionType); } public static IDeflateProvider DeflateProvider = new NetDeflateProvider(); public static IGZipProvider GZipProvider = new NetGZipProvider(); /// /// Decompresses the specified gz buffer using the default compression method: Inflate /// /// The gz buffer. /// Type of the compression. /// public static string Decompress(this byte[] gzBuffer, string compressionType) { if (compressionType == CompressionTypes.Deflate) return Inflate(gzBuffer); if (compressionType == CompressionTypes.GZip) return GUnzip(gzBuffer); throw new NotSupportedException(compressionType); } public static byte[] Deflate(this string text) { return DeflateProvider.Deflate(text); } public static string Inflate(this byte[] gzBuffer) { return DeflateProvider.Inflate(gzBuffer); } public static byte[] GZip(this string text) { return GZipProvider.GZip(text); } public static string GUnzip(this byte[] gzBuffer) { return GZipProvider.GUnzip(gzBuffer); } #endif public static string ToUtf8String(this Stream stream) { if (stream == null) throw new ArgumentNullException("stream"); using (var reader = new StreamReader(stream, Encoding.UTF8)) { return reader.ReadToEnd(); } } public static byte[] ToBytes(this Stream stream) { if (stream == null) throw new ArgumentNullException("stream"); return stream.ReadFully(); } public static void Write(this Stream stream, string text) { var bytes = Encoding.ASCII.GetBytes(text); stream.Write(bytes, 0, bytes.Length); } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/IntExtensions.cs0000644000175000017500000000371412146506550026230 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Common { public static class IntExtensions { public static IEnumerable Times(this int times) { for (var i=0; i < times; i++) { yield return i; } } public static void Times(this int times, Action actionFn) { for (var i = 0; i < times; i++) { actionFn(i); } } public static void Times(this int times, Action actionFn) { for (var i = 0; i < times; i++) { actionFn(); } } public static List TimesAsync(this int times, Action actionFn) { var asyncResults = new List(times); for (var i = 0; i < times; i++) { asyncResults.Add(actionFn.BeginInvoke(i, null, null)); } return asyncResults; } public static List TimesAsync(this int times, Action actionFn) { var asyncResults = new List(times); for (var i = 0; i < times; i++) { asyncResults.Add(actionFn.BeginInvoke(null, null)); } return asyncResults; } public static List Times(this int times, Func actionFn) { var list = new List(); for (var i=0; i < times; i++) { list.Add(actionFn()); } return list; } public static List Times(this int times, Func actionFn) { var list = new List(); for (var i=0; i < times; i++) { list.Add(actionFn(i)); } return list; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Net30/0000755000175000017500000000000012146506550023753 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Net30/ConcurrentQueue.cs0000644000175000017500000001615212146506550027436 0ustar00meebeymeebey00000000000000// IConcurrentCollection.cs // // Copyright (c) 2008 Jérémie "Garuma" Laval // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // using System; using System.Threading; using System.Collections; using System.Collections.Generic; using ServiceStack.Net30.Collections.Concurrent; namespace ServiceStack.Common.Net30 { public interface IProducerConsumerCollection : IEnumerable, ICollection, IEnumerable { bool TryAdd(T item); bool TryTake(out T item); T[] ToArray(); void CopyTo(T[] array, int index); } [System.Diagnostics.DebuggerDisplay ("Count={Count}")] public class ConcurrentQueue : IProducerConsumerCollection, IEnumerable, ICollection, IEnumerable { class Node { public T Value; public Node Next; } Node head = new Node (); Node tail; int count; class NodeObjectPool : ObjectPool { protected override Node Creator () { return new Node (); } } static readonly NodeObjectPool pool = new NodeObjectPool (); static Node ZeroOut (Node node) { node.Value = default(T); node.Next = null; return node; } public ConcurrentQueue () { tail = head; } public ConcurrentQueue (IEnumerable collection): this() { foreach (T item in collection) Enqueue (item); } public void Enqueue (T item) { Node node = pool.Take (); node.Value = item; Node oldTail = null; Node oldNext = null; bool update = false; while (!update) { oldTail = tail; oldNext = oldTail.Next; // Did tail was already updated ? if (tail == oldTail) { if (oldNext == null) { // The place is for us update = Interlocked.CompareExchange (ref tail.Next, node, null) == null; } else { // another Thread already used the place so give him a hand by putting tail where it should be Interlocked.CompareExchange (ref tail, oldNext, oldTail); } } } // At this point we added correctly our node, now we have to update tail. If it fails then it will be done by another thread Interlocked.CompareExchange (ref tail, node, oldTail); Interlocked.Increment (ref count); } bool IProducerConsumerCollection.TryAdd (T item) { Enqueue (item); return true; } public bool TryDequeue (out T result) { result = default (T); bool advanced = false; while (!advanced) { Node oldHead = head; Node oldTail = tail; Node oldNext = oldHead.Next; if (oldHead == head) { // Empty case ? if (oldHead == oldTail) { // This should be false then if (oldNext != null) { // If not then the linked list is mal formed, update tail Interlocked.CompareExchange (ref tail, oldNext, oldTail); } result = default (T); return false; } else { result = oldNext.Value; advanced = Interlocked.CompareExchange (ref head, oldNext, oldHead) == oldHead; if (advanced) pool.Release (ZeroOut (oldHead)); } } } Interlocked.Decrement (ref count); return true; } public bool TryPeek (out T result) { if (IsEmpty) { result = default (T); return false; } Node first = head.Next; result = first.Value; return true; } internal void Clear () { count = 0; tail = head = new Node (); } IEnumerator IEnumerable.GetEnumerator () { return (IEnumerator)InternalGetEnumerator (); } public IEnumerator GetEnumerator () { return InternalGetEnumerator (); } IEnumerator InternalGetEnumerator () { Node my_head = head; while ((my_head = my_head.Next) != null) { yield return my_head.Value; } } void ICollection.CopyTo (Array array, int index) { T[] dest = array as T[]; if (dest == null) return; CopyTo (dest, index); } public void CopyTo (T[] array, int index) { IEnumerator e = InternalGetEnumerator (); int i = index; while (e.MoveNext ()) { array [i++] = e.Current; } } public T[] ToArray () { T[] dest = new T [count]; CopyTo (dest, 0); return dest; } bool ICollection.IsSynchronized { get { return true; } } bool IProducerConsumerCollection.TryTake (out T item) { return TryDequeue (out item); } object syncRoot = new object(); object ICollection.SyncRoot { get { return syncRoot; } } public int Count { get { return count; } } public bool IsEmpty { get { return count == 0; } } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Net30/ConcurrentDictionary.cs0000644000175000017500000003240512146506550030456 0ustar00meebeymeebey00000000000000// ConcurrentDictionary.cs // // Copyright (c) 2009 Jérémie "Garuma" Laval // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // #if !NET_4_0 using System; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; using System.Diagnostics; namespace ServiceStack.Net30.Collections.Concurrent { public class ConcurrentDictionary : IDictionary, ICollection>, IEnumerable>, IDictionary, ICollection, IEnumerable { IEqualityComparer comparer; SplitOrderedList> internalDictionary; public ConcurrentDictionary () : this (EqualityComparer.Default) { } public ConcurrentDictionary (IEnumerable> collection) : this (collection, EqualityComparer.Default) { } public ConcurrentDictionary (IEqualityComparer comparer) { this.comparer = comparer; this.internalDictionary = new SplitOrderedList> (comparer); } public ConcurrentDictionary (IEnumerable> collection, IEqualityComparer comparer) : this (comparer) { foreach (KeyValuePair pair in collection) Add (pair.Key, pair.Value); } // Parameters unused public ConcurrentDictionary (int concurrencyLevel, int capacity) : this (EqualityComparer.Default) { } public ConcurrentDictionary (int concurrencyLevel, IEnumerable> collection, IEqualityComparer comparer) : this (collection, comparer) { } // Parameters unused public ConcurrentDictionary (int concurrencyLevel, int capacity, IEqualityComparer comparer) : this (comparer) { } void Add (TKey key, TValue value) { while (!TryAdd (key, value)); } void IDictionary.Add (TKey key, TValue value) { Add (key, value); } public bool TryAdd (TKey key, TValue value) { return internalDictionary.Insert (Hash (key), key, Make (key, value)); } void ICollection>.Add (KeyValuePair pair) { Add (pair.Key, pair.Value); } public TValue AddOrUpdate (TKey key, Func addValueFactory, Func updateValueFactory) { return internalDictionary.InsertOrUpdate (Hash (key), key, () => Make (key, addValueFactory (key)), (e) => Make (key, updateValueFactory (key, e.Value))).Value; } public TValue AddOrUpdate (TKey key, TValue addValue, Func updateValueFactory) { return AddOrUpdate (key, (_) => addValue, updateValueFactory); } TValue AddOrUpdate (TKey key, TValue addValue, TValue updateValue) { return internalDictionary.InsertOrUpdate (Hash (key), key, Make (key, addValue), Make (key, updateValue)).Value; } TValue GetValue (TKey key) { TValue temp; if (!TryGetValue (key, out temp)) throw new KeyNotFoundException (key.ToString ()); return temp; } public bool TryGetValue (TKey key, out TValue value) { KeyValuePair pair; bool result = internalDictionary.Find (Hash (key), key, out pair); value = pair.Value; return result; } public bool TryUpdate (TKey key, TValue newValue, TValue comparisonValue) { return internalDictionary.CompareExchange (Hash (key), key, Make (key, newValue), (e) => e.Value.Equals (comparisonValue)); } public TValue this[TKey key] { get { return GetValue (key); } set { AddOrUpdate (key, value, value); } } public TValue GetOrAdd (TKey key, Func valueFactory) { return internalDictionary.InsertOrGet (Hash (key), key, Make (key, default(TValue)), () => Make (key, valueFactory (key))).Value; } public TValue GetOrAdd (TKey key, TValue value) { return internalDictionary.InsertOrGet (Hash (key), key, Make (key, value), null).Value; } public bool TryRemove (TKey key, out TValue value) { KeyValuePair data; bool result = internalDictionary.Delete (Hash (key), key, out data); value = data.Value; return result; } bool Remove (TKey key) { TValue dummy; return TryRemove (key, out dummy); } bool IDictionary.Remove (TKey key) { return Remove (key); } bool ICollection>.Remove (KeyValuePair pair) { return Remove (pair.Key); } public bool ContainsKey (TKey key) { KeyValuePair dummy; return internalDictionary.Find (Hash (key), key, out dummy); } bool IDictionary.Contains (object key) { if (!(key is TKey)) return false; return ContainsKey ((TKey)key); } void IDictionary.Remove (object key) { if (!(key is TKey)) return; Remove ((TKey)key); } object IDictionary.this [object key] { get { if (!(key is TKey)) throw new ArgumentException ("key isn't of correct type", "key"); return this[(TKey)key]; } set { if (!(key is TKey) || !(value is TValue)) throw new ArgumentException ("key or value aren't of correct type"); this[(TKey)key] = (TValue)value; } } void IDictionary.Add (object key, object value) { if (!(key is TKey) || !(value is TValue)) throw new ArgumentException ("key or value aren't of correct type"); Add ((TKey)key, (TValue)value); } bool ICollection>.Contains (KeyValuePair pair) { return ContainsKey (pair.Key); } public KeyValuePair[] ToArray () { // This is most certainly not optimum but there is // not a lot of possibilities return new List> (this).ToArray (); } public void Clear() { // Pronk internalDictionary = new SplitOrderedList> (comparer); } public int Count { get { return internalDictionary.Count; } } public bool IsEmpty { get { return Count == 0; } } bool ICollection>.IsReadOnly { get { return false; } } bool IDictionary.IsReadOnly { get { return false; } } public ICollection Keys { get { return GetPart ((kvp) => kvp.Key); } } public ICollection Values { get { return GetPart ((kvp) => kvp.Value); } } ICollection IDictionary.Keys { get { return (ICollection)Keys; } } ICollection IDictionary.Values { get { return (ICollection)Values; } } ICollection GetPart (Func, T> extractor) { List temp = new List (); foreach (KeyValuePair kvp in this) temp.Add (extractor (kvp)); return temp.AsReadOnly (); } void ICollection.CopyTo (Array array, int startIndex) { KeyValuePair[] arr = array as KeyValuePair[]; if (arr == null) return; CopyTo (arr, startIndex, Count); } void CopyTo (KeyValuePair[] array, int startIndex) { CopyTo (array, startIndex, Count); } void ICollection>.CopyTo (KeyValuePair[] array, int startIndex) { CopyTo (array, startIndex); } void CopyTo (KeyValuePair[] array, int startIndex, int num) { foreach (var kvp in this) { array [startIndex++] = kvp; if (--num <= 0) return; } } public IEnumerator> GetEnumerator () { return GetEnumeratorInternal (); } IEnumerator IEnumerable.GetEnumerator () { return (IEnumerator)GetEnumeratorInternal (); } IEnumerator> GetEnumeratorInternal () { return internalDictionary.GetEnumerator (); } IDictionaryEnumerator IDictionary.GetEnumerator () { return new ConcurrentDictionaryEnumerator (GetEnumeratorInternal ()); } class ConcurrentDictionaryEnumerator : IDictionaryEnumerator { IEnumerator> internalEnum; public ConcurrentDictionaryEnumerator (IEnumerator> internalEnum) { this.internalEnum = internalEnum; } public bool MoveNext () { return internalEnum.MoveNext (); } public void Reset () { internalEnum.Reset (); } public object Current { get { return Entry; } } public DictionaryEntry Entry { get { KeyValuePair current = internalEnum.Current; return new DictionaryEntry (current.Key, current.Value); } } public object Key { get { return internalEnum.Current.Key; } } public object Value { get { return internalEnum.Current.Value; } } } object ICollection.SyncRoot { get { return this; } } bool IDictionary.IsFixedSize { get { return false; } } bool ICollection.IsSynchronized { get { return true; } } static KeyValuePair Make (U key, V value) { return new KeyValuePair (key, value); } uint Hash (TKey key) { return (uint)comparer.GetHashCode (key); } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Net30/Tuple.cs0000644000175000017500000002364012146506550025400 0ustar00meebeymeebey00000000000000#region (c)2009 Lokad - New BSD license // Copyright (c) Lokad 2009 // Company: http://www.lokad.com // This code is released under the terms of the new BSD licence #endregion #if !NET_4_0 && !SILVERLIGHT && !MONOTOUCH && !XBOX using System; using System.Collections.Generic; using System.Diagnostics; namespace ServiceStack.Net30 { public static class SystemUtil { internal static int GetHashCode(params object[] args) { unchecked { int result = 0; foreach (var o in args) { result = (result * 397) ^ (o != null ? o.GetHashCode() : 0); } return result; } } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false, AllowMultiple = false)] public sealed class ImmutableAttribute : Attribute { } /// /// Helper extensions for tuples /// public static class ExtendTuple { public static Triple Append(this Tuple tuple, T3 item) { return Tuple.From(tuple.Item1, tuple.Item2, item); } public static Quad Append(this Tuple tuple, T4 item) { return Tuple.From(tuple.Item1, tuple.Item2, tuple.Item3, item); } public static void AddTuple(this ICollection> collection, T1 first, T2 second) { collection.Add(Tuple.From(first, second)); } public static void AddTuple(this ICollection> collection, T1 first, T2 second) { collection.Add(Tuple.From(first, second)); } public static void AddTuple(this ICollection> collection, T1 first, T2 second, T3 third) { collection.Add(Tuple.From(first, second, third)); } public static void AddTuple(this ICollection> collection, T1 first, T2 second, T3 third, T4 fourth) { collection.Add(Tuple.From(first, second, third, fourth)); } } [Serializable] [Immutable] public sealed class Pair : Tuple { public Pair(TKey first, TValue second) : base(first, second) {} public TKey Key { get { return Item1; } } public TValue Value { get { return Item2; } } } [Serializable] [Immutable] public sealed class Quad : Tuple { public Quad(T1 first, T2 second, T3 third, T4 fourth) : base(first, second, third, fourth) { } } [Serializable] [Immutable] public sealed class Triple : Tuple { public Triple(T1 first, T2 second, T3 third) : base(first, second, third) { } } [Serializable] [Immutable] [DebuggerDisplay("({Item1},{Item2})")] public class Tuple : IEquatable> { readonly T1 _item1; public T1 Item1 { get { return _item1; } } readonly T2 _item2; public T2 Item2 { get { return _item2; } } public Tuple(T1 first, T2 second) { _item1 = first; _item2 = second; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) throw new NullReferenceException("obj is null"); if (ReferenceEquals(this, obj)) return true; if (!(obj is Tuple)) return false; return Equals((Tuple)obj); } public override string ToString() { return string.Format("({0},{1})", Item1, Item2); } public bool Equals(Tuple obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; return Equals(obj.Item1, Item1) && Equals(obj.Item2, Item2); } public override int GetHashCode() { return SystemUtil.GetHashCode(Item1, Item2); } public static bool operator ==(Tuple left, Tuple right) { return Equals(left, right); } public static bool operator !=(Tuple left, Tuple right) { return !Equals(left, right); } } [Serializable] [DebuggerDisplay("({Item1},{Item2},{Item3})")] public class Tuple : IEquatable> { readonly T1 _item1; public T1 Item1 { get { return _item1; } } readonly T2 _item2; public T2 Item2 { get { return _item2; } } readonly T3 _item3; public T3 Item3 { get { return _item3; } } public Tuple(T1 first, T2 second, T3 third) { _item1 = first; _item2 = second; _item3 = third; } public override string ToString() { return string.Format("({0},{1},{2})", Item1, Item2, Item3); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) throw new NullReferenceException("obj is null"); if (ReferenceEquals(this, obj)) return true; if (!(obj is Tuple)) return false; return Equals((Tuple)obj); } public bool Equals(Tuple obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; return Equals(obj.Item1, Item1) && Equals(obj.Item2, Item2) && Equals(obj.Item3, Item3); } public override int GetHashCode() { return SystemUtil.GetHashCode(Item1, Item2, Item3); } public static bool operator ==(Tuple left, Tuple right) { return Equals(left, right); } public static bool operator !=(Tuple left, Tuple right) { return !Equals(left, right); } } [Serializable] [DebuggerDisplay("({Item1},{Item2},{Item3},{Item4})")] [Immutable] public class Tuple : IEquatable> { readonly T1 _item1; public T1 Item1 { get { return _item1; } } readonly T2 _item2; public T2 Item2 { get { return _item2; } } readonly T3 _item3; public T3 Item3 { get { return _item3; } } readonly T4 _item4; public T4 Item4 { get { return _item4; } } public Tuple(T1 first, T2 second, T3 third, T4 fourth) { _item1 = first; _item2 = second; _item3 = third; _item4 = fourth; } public override string ToString() { return string.Format("({0},{1},{2},{3})", Item1, Item2, Item3, Item4); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) throw new NullReferenceException("obj is null"); if (ReferenceEquals(this, obj)) return true; if (!(obj is Tuple)) return false; return Equals((Tuple)obj); } public bool Equals(Tuple obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; return Equals(obj.Item1, Item1) && Equals(obj.Item2, Item2) && Equals(obj.Item3, Item3) && Equals(obj.Item4, Item4); } public override int GetHashCode() { return SystemUtil.GetHashCode(Item1, Item2, Item3, Item4); } public static bool operator ==(Tuple left, Tuple right) { return Equals(left, right); } public static bool operator !=(Tuple left, Tuple right) { return !Equals(left, right); } } public static class Tuple { public static Pair From(T1 first, T2 second) { return new Pair(first, second); } public static Tuple Create(T1 first, T2 second) { return new Pair(first, second); } public static Triple From(T1 first, T2 second, T3 third) { return new Triple(first, second, third); } public static Tuple Create(T1 first, T2 second, T3 third) { return new Triple(first, second, third); } public static Quad From(T1 first, T2 second, T3 third, T4 fourth) { return new Quad(first, second, third, fourth); } public static Tuple Create(T1 first, T2 second, T3 third, T4 fourth) { return new Quad(first, second, third, fourth); } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Net30/ObjectPool.cs0000644000175000017500000000577312146506550026356 0ustar00meebeymeebey00000000000000// ObjectPool.cs // // Copyright (c) 2011 Novell // // Authors: // Jérémie "garuma" Laval // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // #if !NET_4_0 using System; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; namespace ServiceStack.Net30.Collections.Concurrent { internal abstract class ObjectPool where T : class { const int capacity = 20; const int bit = 0x8000000; readonly T[] buffer; int addIndex; int removeIndex; public ObjectPool () { buffer = new T[capacity]; for (int i = 0; i < capacity; i++) buffer[i] = Creator (); addIndex = capacity - 1; } protected abstract T Creator (); public T Take () { if ((addIndex & ~bit) - 1 == removeIndex) return Creator (); int i; T result; int tries = 3; do { i = removeIndex; if ((addIndex & ~bit) - 1 == i || tries == 0) return Creator (); result = buffer[i % capacity]; } while (Interlocked.CompareExchange (ref removeIndex, i + 1, i) != i && --tries > -1); return result; } public void Release (T obj) { if (obj == null || addIndex - removeIndex >= capacity - 1) return; int i; int tries = 3; do { do { i = addIndex; } while ((i & bit) > 0); if (i - removeIndex >= capacity - 1) return; } while (Interlocked.CompareExchange (ref addIndex, i + 1 + bit, i) != i && --tries > 0); buffer[i % capacity] = obj; addIndex = addIndex - bit; } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/Net30/SplitOrderedList.cs0000644000175000017500000004475312146506550027553 0ustar00meebeymeebey00000000000000// SplitOrderedList.cs // // Copyright (c) 2010 Jérémie "Garuma" Laval // // 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 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // // #if !NET_4_0 using System; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; namespace ServiceStack.Net30.Collections.Concurrent { internal class SplitOrderedList { class Node { public bool Marked; public ulong Key; public TKey SubKey; public T Data; public Node Next; public Node Init (ulong key, TKey subKey, T data) { this.Key = key; this.SubKey = subKey; this.Data = data; this.Marked = false; this.Next = null; return this; } // Used to create dummy node public Node Init (ulong key) { this.Key = key; this.Data = default (T); this.Next = null; this.Marked = false; this.SubKey = default (TKey); return this; } // Used to create marked node public Node Init (Node wrapped) { this.Marked = true; this.Next = wrapped; this.Key = 0; this.Data = default (T); this.SubKey = default (TKey); return this; } } class NodeObjectPool : ObjectPool { protected override Node Creator () { return new Node (); } } static readonly NodeObjectPool pool = new NodeObjectPool (); const int MaxLoad = 5; const uint BucketSize = 512; Node head; Node tail; Node[] buckets = new Node [BucketSize]; int count; int size = 2; SimpleRwLock slim = new SimpleRwLock (); readonly IEqualityComparer comparer; public SplitOrderedList (IEqualityComparer comparer) { this.comparer = comparer; head = new Node ().Init (0); tail = new Node ().Init (ulong.MaxValue); head.Next = tail; SetBucket (0, head); } public int Count { get { return count; } } public T InsertOrUpdate (uint key, TKey subKey, Func addGetter, Func updateGetter) { Node current; bool result = InsertInternal (key, subKey, default (T), addGetter, out current); if (result) return current.Data; // FIXME: this should have a CAS-like behavior return current.Data = updateGetter (current.Data); } public T InsertOrUpdate (uint key, TKey subKey, T addValue, T updateValue) { Node current; if (InsertInternal (key, subKey, addValue, null, out current)) return current.Data; // FIXME: this should have a CAS-like behavior return current.Data = updateValue; } public bool Insert (uint key, TKey subKey, T data) { Node current; return InsertInternal (key, subKey, data, null, out current); } public T InsertOrGet (uint key, TKey subKey, T data, Func dataCreator) { Node current; InsertInternal (key, subKey, data, dataCreator, out current); return current.Data; } bool InsertInternal (uint key, TKey subKey, T data, Func dataCreator, out Node current) { Node node = pool.Take ().Init (ComputeRegularKey (key), subKey, data); uint b = key % (uint)size; Node bucket; if ((bucket = GetBucket (b)) == null) bucket = InitializeBucket (b); if (!ListInsert (node, bucket, out current, dataCreator)) return false; int csize = size; if (Interlocked.Increment (ref count) / csize > MaxLoad && (csize & 0x40000000) == 0) Interlocked.CompareExchange (ref size, 2 * csize, csize); current = node; return true; } public bool Find (uint key, TKey subKey, out T data) { Node node; uint b = key % (uint)size; data = default (T); Node bucket; if ((bucket = GetBucket (b)) == null) bucket = InitializeBucket (b); if (!ListFind (ComputeRegularKey (key), subKey, bucket, out node)) return false; data = node.Data; return !node.Marked; } public bool CompareExchange (uint key, TKey subKey, T data, Func check) { Node node; uint b = key % (uint)size; Node bucket; if ((bucket = GetBucket (b)) == null) bucket = InitializeBucket (b); if (!ListFind (ComputeRegularKey (key), subKey, bucket, out node)) return false; if (!check (node.Data)) return false; node.Data = data; return true; } public bool Delete (uint key, TKey subKey, out T data) { uint b = key % (uint)size; Node bucket; if ((bucket = GetBucket (b)) == null) bucket = InitializeBucket (b); if (!ListDelete (bucket, ComputeRegularKey (key), subKey, out data)) return false; Interlocked.Decrement (ref count); return true; } public IEnumerator GetEnumerator () { Node node = head.Next; while (node != tail) { while (node.Marked || (node.Key & 1) == 0) { node = node.Next; if (node == tail) yield break; } yield return node.Data; node = node.Next; } } Node InitializeBucket (uint b) { Node current; uint parent = GetParent (b); Node bucket; if ((bucket = GetBucket (parent)) == null) bucket = InitializeBucket (parent); Node dummy = pool.Take ().Init (ComputeDummyKey (b)); if (!ListInsert (dummy, bucket, out current, null)) return current; return SetBucket (b, dummy); } // Turn v's MSB off static uint GetParent (uint v) { uint t, tt; // Find MSB position in v var pos = (tt = v >> 16) > 0 ? (t = tt >> 8) > 0 ? 24 + logTable[t] : 16 + logTable[tt] : (t = v >> 8) > 0 ? 8 + logTable[t] : logTable[v]; return (uint)(v & ~(1 << pos)); } // Reverse integer bits and make sure LSB is set static ulong ComputeRegularKey (uint key) { return ComputeDummyKey (key) | 1; } // Reverse integer bits static ulong ComputeDummyKey (uint key) { return ((ulong)(((uint)reverseTable[key & 0xff] << 24) | ((uint)reverseTable[(key >> 8) & 0xff] << 16) | ((uint)reverseTable[(key >> 16) & 0xff] << 8) | ((uint)reverseTable[(key >> 24) & 0xff]))) << 1; } // Bucket storage is abstracted in a simple two-layer tree to avoid too much memory resize Node GetBucket (uint index) { if (index >= buckets.Length) return null; return buckets[index]; } Node SetBucket (uint index, Node node) { try { slim.EnterReadLock (); CheckSegment (index, true); Interlocked.CompareExchange (ref buckets[index], node, null); return buckets[index]; } finally { slim.ExitReadLock (); } } // When we run out of space for bucket storage, we use a lock-based array resize void CheckSegment (uint segment, bool readLockTaken) { if (segment < buckets.Length) return; if (readLockTaken) slim.ExitReadLock (); try { slim.EnterWriteLock (); while (segment >= buckets.Length) Array.Resize (ref buckets, buckets.Length * 2); } finally { slim.ExitWriteLock (); } if (readLockTaken) slim.EnterReadLock (); } Node ListSearch (ulong key, TKey subKey, ref Node left, Node h) { Node leftNodeNext = null, rightNode = null; do { Node t = h; Node tNext = t.Next; do { if (!tNext.Marked) { left = t; leftNodeNext = tNext; } t = tNext.Marked ? tNext.Next : tNext; if (t == tail) break; tNext = t.Next; } while (tNext.Marked || t.Key < key || (tNext.Key == key && !comparer.Equals (subKey, t.SubKey))); rightNode = t; if (leftNodeNext == rightNode) { if (rightNode != tail && rightNode.Next.Marked) continue; else return rightNode; } if (Interlocked.CompareExchange (ref left.Next, rightNode, leftNodeNext) == leftNodeNext) { pool.Release (leftNodeNext); if (rightNode != tail && rightNode.Next.Marked) continue; else return rightNode; } } while (true); } bool ListDelete (Node startPoint, ulong key, TKey subKey, out T data) { Node rightNode = null, rightNodeNext = null, leftNode = null; data = default (T); Node markedNode = null; do { rightNode = ListSearch (key, subKey, ref leftNode, startPoint); if (rightNode == tail || rightNode.Key != key) return false; data = rightNode.Data; rightNodeNext = rightNode.Next; if (!rightNodeNext.Marked) { if (markedNode == null) markedNode = pool.Take (); markedNode.Init (rightNodeNext); if (Interlocked.CompareExchange (ref rightNode.Next, markedNode, rightNodeNext) == rightNodeNext) break; } } while (true); if (Interlocked.CompareExchange (ref leftNode.Next, rightNodeNext, rightNode) != rightNode) ListSearch (rightNode.Key, subKey, ref leftNode, startPoint); else pool.Release (rightNode); return true; } bool ListInsert (Node newNode, Node startPoint, out Node current, Func dataCreator) { ulong key = newNode.Key; Node rightNode = null, leftNode = null; do { rightNode = current = ListSearch (key, newNode.SubKey, ref leftNode, startPoint); if (rightNode != tail && rightNode.Key == key && comparer.Equals (newNode.SubKey, rightNode.SubKey)) return false; newNode.Next = rightNode; if (dataCreator != null) newNode.Data = dataCreator (); if (Interlocked.CompareExchange (ref leftNode.Next, newNode, rightNode) == rightNode) return true; } while (true); } bool ListFind (ulong key, TKey subKey, Node startPoint, out Node data) { Node rightNode = null, leftNode = null; data = null; rightNode = ListSearch (key, subKey, ref leftNode, startPoint); data = rightNode; return rightNode != tail && rightNode.Key == key; } static readonly byte[] reverseTable = { 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255 }; static readonly byte[] logTable = { 0xFF, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; struct SimpleRwLock { const int RwWait = 1; const int RwWrite = 2; const int RwRead = 4; int rwlock; public void EnterReadLock () { SpinWait sw = new SpinWait (); do { while ((rwlock & (RwWrite | RwWait)) > 0) sw.SpinOnce (); if ((Interlocked.Add (ref rwlock, RwRead) & (RwWait | RwWait)) == 0) return; Interlocked.Add (ref rwlock, -RwRead); } while (true); } public void ExitReadLock () { Interlocked.Add (ref rwlock, -RwRead); } public void EnterWriteLock () { SpinWait sw = new SpinWait (); do { int state = rwlock; if (state < RwWrite) { if (Interlocked.CompareExchange (ref rwlock, RwWrite, state) == state) return; state = rwlock; } // We register our interest in taking the Write lock (if upgradeable it's already done) while ((state & RwWait) == 0 && Interlocked.CompareExchange (ref rwlock, state | RwWait, state) != state) state = rwlock; // Before falling to sleep while (rwlock > RwWait) sw.SpinOnce (); } while (true); } public void ExitWriteLock () { Interlocked.Add (ref rwlock, -RwWrite); } } } #if !NET_4_0 internal struct SpinWait { // The number of step until SpinOnce yield on multicore machine const int step = 10; const int maxTime = 200; static readonly bool isSingleCpu = (Environment.ProcessorCount == 1); int ntime; public void SpinOnce () { ntime += 1; if (isSingleCpu) { // On a single-CPU system, spinning does no good Thread.Sleep (0); } else { if (ntime % step == 0) Thread.Sleep (0); else // Multi-CPU system might be hyper-threaded, let other thread run Thread.SpinWait (Math.Min (ntime, maxTime) << 1); } } } #endif } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/HostContext.cs0000644000175000017500000000171312146506550025675 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web; namespace ServiceStack.Common { public class HostContext { public static HostContext Instance = new HostContext(); [ThreadStatic] public static IDictionary items; public virtual IDictionary Items { get { return items ?? (HttpContext.Current != null ? HttpContext.Current.Items : items = new Dictionary()); } set { items = value; } } public T GetOrCreate(Func createFn) { if (Items.Contains(typeof(T).Name)) return (T)Items[typeof(T).Name]; return (T) (Items[typeof(T).Name] = createFn()); } public void EndRequest() { items = null; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/EnumExtensions.cs0000644000175000017500000000610312146506550026375 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; namespace ServiceStack.Common { public static class EnumExtensions { /// /// Gets the textual description of the enum if it has one. e.g. /// /// /// enum UserColors /// { /// [Description("Bright Red")] /// BrightRed /// } /// UserColors.BrightRed.ToDescription(); /// /// /// /// public static string ToDescription(this Enum @enum) { var type = @enum.GetType(); var memInfo = type.GetMember(@enum.ToString()); if (memInfo != null && memInfo.Length > 0) { var attrs = memInfo[0].GetCustomAttributes( typeof(DescriptionAttribute), false); if (attrs != null && attrs.Length > 0) return ((DescriptionAttribute)attrs[0]).Description; } return @enum.ToString(); } public static List ToList(this Enum @enum) { #if !SILVERLIGHT4 return new List(Enum.GetNames(@enum.GetType())); #else return @enum.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList(); #endif } public static bool Has(this Enum type, T value) { try { return (((int)(object)type & (int)(object)value) == (int)(object)value); } catch { return false; } } public static bool Is(this Enum type, T value) { try { return (int)(object)type == (int)(object)value; } catch { return false; } } public static T Add(this Enum type, T value) { try { return (T)(object)(((int)(object)type | (int)(object)value)); } catch (Exception ex) { throw new ArgumentException( string.Format( "Could not append value from enumerated type '{0}'.", typeof(T).Name ), ex); } } public static T Remove(this Enum type, T value) { try { return (T)(object)(((int)(object)type & ~(int)(object)value)); } catch (Exception ex) { throw new ArgumentException( string.Format( "Could not remove value from enumerated type '{0}'.", typeof(T).Name ), ex); } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Common/ExecExtensions.cs0000644000175000017500000001052412146506550026357 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using ServiceStack.Logging; namespace ServiceStack.Common { public static class ExecExtensions { public static void LogError(Type declaringType, string clientMethodName, Exception ex) { var log = LogManager.GetLogger(declaringType); log.Error(string.Format("'{0}' threw an error on {1}: {2}", declaringType.FullName, clientMethodName, ex.Message), ex); } public static void ExecAll(this IEnumerable instances, Action action) { foreach (var instance in instances) { try { action(instance); } catch (Exception ex) { LogError(instance.GetType(), action.GetType().Name, ex); } } } public static void ExecAllWithFirstOut(this IEnumerable instances, Func action, ref TReturn firstResult) { foreach (var instance in instances) { try { var result = action(instance); if (!Equals(firstResult, default(TReturn))) { firstResult = result; } } catch (Exception ex) { LogError(instance.GetType(), action.GetType().Name, ex); } } } public static TReturn ExecReturnFirstWithResult(this IEnumerable instances, Func action) { foreach (var instance in instances) { try { var result = action(instance); if (!Equals(result, default(TReturn))) { return result; } } catch (Exception ex) { LogError(instance.GetType(), action.GetType().Name, ex); } } return default(TReturn); } public static void RetryUntilTrue(Func action, TimeSpan? timeOut) { var i = 0; var firstAttempt = DateTime.Now; while (timeOut == null || DateTime.Now - firstAttempt < timeOut.Value) { i++; if (action()) { return; } SleepBackOffMultiplier(i); } throw new TimeoutException(string.Format("Exceeded timeout of {0}", timeOut.Value)); } public static void RetryOnException(Action action, TimeSpan? timeOut) { var i = 0; Exception lastEx = null; var firstAttempt = DateTime.Now; while (timeOut == null || DateTime.Now - firstAttempt < timeOut.Value) { i++; try { action(); return; } catch (Exception ex) { lastEx = ex; SleepBackOffMultiplier(i); } } throw new TimeoutException(string.Format("Exceeded timeout of {0}", timeOut.Value), lastEx); } public static void RetryOnException(Action action, int maxRetries) { for (var i = 0; i < maxRetries; i++) { try { action(); break; } catch { if (i == maxRetries - 1) throw; SleepBackOffMultiplier(i); } } } private static void SleepBackOffMultiplier(int i) { //exponential/random retry back-off. var rand = new Random(Guid.NewGuid().GetHashCode()); var nextTry = rand.Next( (int)Math.Pow(i, 2), (int)Math.Pow(i + 1, 2) + 1); Thread.Sleep(nextTry); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/0000755000175000017500000000000012652476423023724 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/OrmLite/0000755000175000017500000000000012146506551025271 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/OrmLite/IDbConnectionFactory.cs0000644000175000017500000000031612146506551031626 0ustar00meebeymeebey00000000000000using System.Data; namespace ServiceStack.OrmLite { public interface IDbConnectionFactory { IDbConnection OpenDbConnection(); IDbConnection CreateDbConnection(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/OrmLite/DbConnectionFactory.cs0000644000175000017500000000124312146506551031515 0ustar00meebeymeebey00000000000000using System; using System.Data; namespace ServiceStack.OrmLite { public class DbConnectionFactory : IDbConnectionFactory { private readonly Func connectionFactoryFn; public DbConnectionFactory(Func connectionFactoryFn) { this.connectionFactoryFn = connectionFactoryFn; } public IDbConnection OpenDbConnection() { var dbConn = CreateDbConnection(); dbConn.Open(); return dbConn; } public IDbConnection CreateDbConnection() { return connectionFactoryFn(); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Configuration/0000755000175000017500000000000012146506550026524 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Configuration/IContainerAdapter.cs0000644000175000017500000000074412146506550032414 0ustar00meebeymeebey00000000000000namespace ServiceStack.Configuration { /// /// Allow delegation of dependencies to other IOC's /// public interface IContainerAdapter { /// /// Resolve Property Dependency /// /// /// T TryResolve(); /// /// Resolve Constructor Dependency /// /// /// T Resolve(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Configuration/IResourceManager.cs0000644000175000017500000000045512146506550032252 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.Configuration { public interface IResourceManager { string GetString(string name); IList GetList(string key); IDictionary GetDictionary(string key); T Get(string name, T defaultValue); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Configuration/IRelease.cs0000644000175000017500000000020212146506550030536 0ustar00meebeymeebey00000000000000namespace ServiceStack.Configuration { public interface IRelease { void Release(object instance); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Configuration/IFactoryProvider.cs0000644000175000017500000000044412146506550032310 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Configuration { public interface IFactoryProvider : IContainerAdapter, IDisposable { void Register(T provider); T Resolve(string name); T ResolveOptional(string name, T defaultValue); T Create(string name); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Configuration/ITypeFactory.cs0000644000175000017500000000021012146506550031426 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Configuration { public interface ITypeFactory { object CreateInstance(Type type); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/0000755000175000017500000000000012146506551026154 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestService.cs0000644000175000017500000000052112146506551031050 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// Utility interface that implements all Rest operations /// /// public interface IRestService : IRestGetService, IRestPostService, IRestPutService, IRestDeleteService, IRestPatchService { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRequiresRequestContext.cs0000644000175000017500000000035712146506551033336 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// Implement on services that need access to the RequestContext /// public interface IRequiresRequestContext { IRequestContext RequestContext { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHasRequestFilter.cs0000644000175000017500000000216712146506551032054 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX namespace ServiceStack.ServiceHost { /// /// This interface can be implemented by an attribute /// which adds an request filter for the specific request DTO the attribute marked. /// public interface IHasRequestFilter { /// /// Order in which Request Filters are executed. /// <0 Executed before global request filters /// >0 Executed after global request filters /// int Priority { get; } /// /// The request filter is executed before the service. /// /// The http request wrapper /// The http response wrapper /// The request DTO void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto); /// /// A new shallow copy of this filter is used on every request. /// /// IHasRequestFilter Copy(); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IContentTypeWriter.cs0000644000175000017500000000152712146506551032272 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.ServiceHost { public interface IContentTypeWriter { byte[] SerializeToBytes(IRequestContext requestContext, object response); string SerializeToString(IRequestContext requestContext, object response); void SerializeToStream(IRequestContext requestContext, object response, Stream toStream); void SerializeToResponse(IRequestContext requestContext, object response, IHttpResponse httpRes); ResponseSerializerDelegate GetResponseSerializer(string contentType); } public delegate string TextSerializerDelegate(object dto); public delegate void StreamSerializerDelegate(IRequestContext requestContext, object dto, Stream outputStream); public delegate void ResponseSerializerDelegate(IRequestContext requestContext, object dto, IHttpResponse httpRes); }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IServiceController.cs0000644000175000017500000000245412146506551032265 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.ServiceHost { /// /// Responsible for executing the operation within the specified context. /// /// The operation types. public interface IServiceController { /// /// Returns a list of operation types available in this service /// /// The operation types. IList OperationTypes { get; } /// /// Returns a list of ALL operation types available in this service /// /// The operation types. IList AllOperationTypes { get; } /// /// Returns the first matching RestPath /// /// /// /// IRestPath GetRestPathForRequest(string httpMethod, string pathInfo); /// /// Allow the registration of custom routes /// IServiceRoutes Routes { get; } /// /// Executes the DTO request under the supplied requestContext. /// /// /// /// object Execute(object request, IRequestContext requestContext); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRequestContext.cs0000644000175000017500000000120212146506551031604 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Net; namespace ServiceStack.ServiceHost { public interface IRequestContext : IDisposable { T Get() where T : class; string IpAddress { get; } string GetHeader(string headerName); IDictionary Cookies { get; } EndpointAttributes EndpointAttributes { get; } IRequestAttributes RequestAttributes { get; } string ContentType { get; } string ResponseContentType { get; } string CompressionType { get; } string AbsoluteUri { get; } string PathInfo { get; } IFile[] Files { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/RestServiceAttribute.cs0000644000175000017500000000324112146506551032625 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.ServiceHost { /// /// Used to decorate Request DTO's to associate a RESTful request /// path mapping with a service. Multiple attributes can be applied to /// each request DTO, to map multiple paths to the service. /// [Obsolete("Use [Route] instead of [RestService].")] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] public class RestServiceAttribute : RouteAttribute { /// /// Initializes an instance of the class. /// /// /// The path template to map to the request. See /// RestServiceAttribute.Path /// for details on the correct format. /// public RestServiceAttribute(string path) : base(path, null) { } /// /// Initializes an instance of the class. /// /// /// The path template to map to the request. See /// RestServiceAttribute.Path /// for details on the correct format. /// /// A comma-delimited list of HTTP verbs supported by the /// service. If unspecified, all verbs are assumed to be supported. public RestServiceAttribute(string path, string verbs) : base(path, verbs) { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IAsyncService.cs0000644000175000017500000000056512146506551031220 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// If the Service also implements this interface, /// IAsyncService.ExecuteAsync() will be used instead of IService.Execute() for /// EndpointAttributes.AsyncOneWay requests /// /// public interface IAsyncService { object ExecuteAsync(T request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRequestAttributes.cs0000644000175000017500000000024612146506551032315 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.ServiceHost { public interface IRequestAttributes { bool AcceptsGzip { get; } bool AcceptsDeflate { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/EndpointAttributes.cs0000644000175000017500000000250412146506551032333 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.ServiceHost { [Flags] public enum EndpointAttributes { None = 0, All = AllNetworkAccessTypes | AllSecurityModes | AllHttpMethods | AllCallStyles | AllEndpointTypes, AllNetworkAccessTypes = External | Localhost | LocalSubnet, AllSecurityModes = Secure | InSecure, AllHttpMethods = HttpHead | HttpGet | HttpPost | HttpPut | HttpDelete, AllCallStyles = AsyncOneWay | SyncReply, AllEndpointTypes = Soap11 | Soap12 | Xml | Json | Jsv | ProtoBuf | Csv, InternalNetworkAccess = Localhost | LocalSubnet, //Whether it came from an Internal or External address Localhost = 1 << 0, LocalSubnet = 1 << 1, External = 1 << 2, //Called over a secure or insecure channel Secure = 1 << 3, InSecure = 1 << 4, //HTTP request type HttpHead = 1 << 5, HttpGet = 1 << 6, HttpPost = 1 << 7, HttpPut = 1 << 8, HttpDelete = 1 << 9, HttpPatch = 1 << 10, //Future 11,12 //Call Styles AsyncOneWay = 1 << 13, SyncReply = 1 << 14, //Different endpoints Soap11 = 1 << 15, Soap12 = 1 << 16, //POX Xml = 1 << 17, //Javascript Json = 1 << 18, //Jsv i.e. TypeSerializer Jsv = 1 << 19, //e.g. protobuf-net ProtoBuf = 1 << 20, //e.g. text/csv Csv = 1 << 21, Html = 1 << 22, Yaml = 1 << 23, } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRequestLogger.cs0000644000175000017500000000322112146506551031402 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using ServiceStack.ServiceInterface.ServiceModel; namespace ServiceStack.ServiceHost { /// /// Log every service request /// public interface IRequestLogger { /// /// Turn On/Off Session Tracking /// bool EnableSessionTracking { get; set; } /// /// Turn On/Off Tracking of Responses /// bool EnableResponseTracking { get; set; } /// /// Turn On/Off Tracking of Exceptions /// bool EnableErrorTracking { get; set; } /// /// Limit access to /requestlogs service to role /// string[] RequiredRoles { get; set; } /// /// Don't log requests of these types. /// Type[] ExcludeRequestDtoTypes { get; set; } /// /// Don't log request bodys for services with sensitive information. /// By default Auth and Registration requests are hidden. /// Type[] HideRequestBodyForRequestDtoTypes { get; set; } /// /// Log a request /// /// The RequestContext /// Request DTO /// Response DTO or Exception /// How long did the Request take void Log(IRequestContext requestContext, object requestDto, object response, TimeSpan elapsed); /// /// View the most recent logs /// /// /// List GetLatestLogs(int? take); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRequiresRequestStream.cs0000644000175000017500000000051412146506551033140 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.ServiceHost { /// /// Implement on Request DTOs that need access to the raw Request Stream /// public interface IRequiresRequestStream { /// /// The raw Http Request Input Stream /// Stream RequestStream { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHttpRequest.cs0000644000175000017500000000426112146506551031107 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !XBOX using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; namespace ServiceStack.ServiceHost { /// /// A thin wrapper around ASP.NET or HttpListener's HttpRequest /// public interface IHttpRequest : IResolver { /// /// The underlying ASP.NET or HttpListener HttpRequest /// object OriginalRequest { get; } /// /// The name of the service being called (e.g. Request DTO Name) /// string OperationName { get; } /// /// The request ContentType /// string ContentType { get; } string HttpMethod { get; } string UserAgent { get; } IDictionary Cookies { get; } /// /// The expected Response ContentType for this request /// string ResponseContentType { get; set; } /// /// Attach any data to this request that all filters and services can access. /// Dictionary Items { get; } NameValueCollection Headers { get; } NameValueCollection QueryString { get; } NameValueCollection FormData { get; } /// /// The entire string contents of Request.InputStream /// /// string GetRawBody(); string RawUrl { get; } string AbsoluteUri { get; } /// /// The Remote Ip as reported by Request.UserHostAddress /// string UserHostAddress { get; } /// /// The Remote Ip as reported by X-Forwarded-For, X-Real-IP or Request.UserHostAddress /// string RemoteIp { get; } /// /// e.g. is https or not /// bool IsSecureConnection { get; } string[] AcceptTypes { get; } string PathInfo { get; } Stream InputStream { get; } long ContentLength { get; } /// /// Access to the multi-part/formdata files posted on this request /// IFile[] Files { get; } string ApplicationFilePath { get; } } } #endif smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHasOptions.cs0000644000175000017500000000024412146506551030703 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.ServiceHost { public interface IHasOptions { IDictionary Options { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestPutService.cs0000644000175000017500000000054312146506551031545 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// If the Service also implements this interface, /// IRestPutService.Put() will be used instead of IService.Execute() for /// EndpointAttributes.HttpPut requests /// /// public interface IRestPutService { object Put(T request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IServiceRoutes.cs0000644000175000017500000000467412146506551031431 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// Allow the registration of user-defined routes for services /// public interface IServiceRoutes { /// /// Maps the specified REST path to the specified request DTO. /// /// The type of request DTO to map /// the path to. /// The path to map the request DTO to. /// See RestServiceAttribute.Path /// for details on the correct format. /// The same instance; /// never . IServiceRoutes Add(string restPath); /// /// Maps the specified REST path to the specified request DTO, and /// specifies the HTTP verbs supported by the path. /// /// The type of request DTO to map /// the path to. /// The path to map the request DTO to. /// See RestServiceAttribute.Path /// for details on the correct format. /// /// The comma-delimited list of HTTP verbs supported by the path, /// such as "GET,PUT,DELETE". Specify empty or /// to indicate that all verbs are supported. /// /// The same instance; /// never . IServiceRoutes Add(string restPath, string verbs); /// /// Maps the specified REST path to the specified request DTO, /// specifies the HTTP verbs supported by the path, and indicates /// the default MIME type of the returned response. /// /// /// The type of request DTO to map the path to. /// /// The path to map the request DTO to. /// See RestServiceAttribute.Path /// for details on the correct format. /// /// The comma-delimited list of HTTP verbs supported by the path, /// such as "GET,PUT,DELETE". /// /// The same instance; /// never . IServiceRoutes Add(System.Type requestType, string restPath, string verbs); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IContentTypeFilter.cs0000644000175000017500000000102312146506551032232 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.ServiceHost { public interface IContentTypeFilter : IContentTypeWriter, IContentTypeReader { Dictionary ContentTypeFormats { get; } void Register(string contentType, StreamSerializerDelegate streamSerializer, StreamDeserializerDelegate streamDeserializer); void Register(string contentType, ResponseSerializerDelegate responseSerializer, StreamDeserializerDelegate streamDeserializer); void ClearCustomFilters(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IContentTypeReader.cs0000644000175000017500000000101712146506551032212 0ustar00meebeymeebey00000000000000using System; using System.IO; namespace ServiceStack.ServiceHost { public interface IContentTypeReader { object DeserializeFromString(string contentType, Type type, string request); object DeserializeFromStream(string contentType, Type type, Stream requestStream); StreamDeserializerDelegate GetStreamDeserializer(string contentType); } public delegate object TextDeserializerDelegate(Type type, string dto); public delegate object StreamDeserializerDelegate(Type type, Stream fromStream); }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestPostService.cs0000644000175000017500000000055012146506551031720 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// If the Service also implements this interface, /// IRestPostService.Post() will be used instead of IService.Execute() for /// EndpointAttributes.HttpPost requests /// /// public interface IRestPostService { object Post(T request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRequiresHttpRequest.cs0000644000175000017500000000034312146506551032624 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ServiceStack.ServiceHost { public interface IRequiresHttpRequest { IHttpRequest HttpRequest { get; set; } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/ICookies.cs0000644000175000017500000000047712146506551030220 0ustar00meebeymeebey00000000000000using System; using System.Net; namespace ServiceStack.ServiceHost { public interface ICookies { void DeleteCookie(string cookieName); void AddCookie(Cookie cookie); void AddPermanentCookie(string cookieName, string cookieValue); void AddSessionCookie(string cookieName, string cookieValue); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IService.cs0000644000175000017500000000046612146506551030222 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// Base interface all webservices need to implement. /// For simplicity this is the only interface you need to implement /// /// public interface IService { object Execute(T request); } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHasResponseFilter.cs0000644000175000017500000000205712146506551032220 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX namespace ServiceStack.ServiceHost { /// /// This interface can be implemented by an attribute /// which adds an response filter for the specific response DTO the attribute marked. /// public interface IHasResponseFilter { /// /// Order in which Response Filters are executed. /// <0 Executed before global response filters /// >0 Executed after global response filters /// int Priority { get; } /// /// The response filter is executed after the service /// /// The http request wrapper /// The http response wrapper void ResponseFilter(IHttpRequest req, IHttpResponse res, object response); /// /// A new shallow copy of this filter is used on every request. /// /// IHasResponseFilter Copy(); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestGetService.cs0000644000175000017500000000054312146506551031514 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// If the Service also implements this interface, /// IRestGetService.Get() will be used instead of IService.Execute() for /// EndpointAttributes.HttpGet requests /// /// public interface IRestGetService { object Get(T request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IFile.cs0000644000175000017500000000032612146506551027474 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.ServiceHost { public interface IFile { string FileName { get; } long ContentLength { get; } string ContentType { get; } Stream InputStream { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHttpResult.cs0000644000175000017500000000212012146506551030725 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using System.Net; namespace ServiceStack.ServiceHost { public interface IHttpResult : IHasOptions { /// /// The HTTP Response Status /// int Status { get; set; } /// /// The HTTP Response Status Code /// HttpStatusCode StatusCode { get; set; } /// /// The HTTP Status Description /// string StatusDescription { get; set; } /// /// The HTTP Response ContentType /// string ContentType { get; set; } /// /// Additional HTTP Headers /// Dictionary Headers { get; } /// /// Response DTO /// object Response { get; set; } /// /// if not provided, get's injected by ServiceStack /// IContentTypeWriter ResponseFilter { get; set; } /// /// Holds the request call context /// IRequestContext RequestContext { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IExpirable.cs0000644000175000017500000000023112146506551030523 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.WebHost.Endpoints.Support.Markdown { public interface IExpirable { DateTime? LastModified { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestPath.cs0000644000175000017500000000042212146506551030344 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.ServiceHost { public interface IRestPath { Type RequestType { get; } object CreateRequest(string pathInfo, Dictionary queryStringAndFormData, object fromInstance); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHttpResponse.cs0000644000175000017500000000252712146506551031260 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.ServiceHost { /// /// A thin wrapper around ASP.NET or HttpListener's HttpResponse /// public interface IHttpResponse { /// /// The underlying ASP.NET or HttpListener HttpResponse /// object OriginalResponse { get; } int StatusCode { set; } string StatusDescription { set; } string ContentType { get; set; } ICookies Cookies { get; } void AddHeader(string name, string value); void Redirect(string url); Stream OutputStream { get; } void Write(string text); /// /// Signal that this response has been handled and no more processing should be done. /// When used in a request or response filter, no more filters or processing is done on this request. /// void Close(); /// /// Calls Response.End() on ASP.NET HttpResponse otherwise is an alias for Close(). /// Useful when you want to prevent ASP.NET to provide it's own custom error page. /// void End(); /// /// Response.Flush() and OutputStream.Flush() seem to have different behaviour in ASP.NET /// void Flush(); /// /// Gets a value indicating whether this instance is closed. /// bool IsClosed { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/RouteAttribute.cs0000644000175000017500000001061612146506551031471 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ServiceStack.ServiceHost { /// /// Used to decorate Request DTO's to associate a RESTful request /// path mapping with a service. Multiple attributes can be applied to /// each request DTO, to map multiple paths to the service. /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] public class RouteAttribute : Attribute { /// /// Initializes an instance of the class. /// /// /// The path template to map to the request. See /// RouteAttribute.Path /// for details on the correct format. /// public RouteAttribute(string path) : this(path, null) { } /// /// Initializes an instance of the class. /// /// /// The path template to map to the request. See /// RouteAttribute.Path /// for details on the correct format. /// /// A comma-delimited list of HTTP verbs supported by the /// service. If unspecified, all verbs are assumed to be supported. public RouteAttribute(string path, string verbs) { Path = path; Verbs = verbs; } /// /// Gets or sets the path template to be mapped to the request. /// /// /// A value providing the path mapped to /// the request. Never . /// /// /// Some examples of valid paths are: /// /// /// "/Inventory" /// "/Inventory/{Category}/{ItemId}" /// "/Inventory/{ItemPath*}" /// /// /// Variables are specified within "{}" /// brackets. Each variable in the path is mapped to the same-named property /// on the request DTO. At runtime, ServiceStack will parse the /// request URL, extract the variable values, instantiate the request DTO, /// and assign the variable values into the corresponding request properties, /// prior to passing the request DTO to the service object for processing. /// /// It is not necessary to specify all request properties as /// variables in the path. For unspecified properties, callers may provide /// values in the query string. For example: the URL /// "http://services/Inventory?Category=Books&ItemId=12345" causes the same /// request DTO to be processed as "http://services/Inventory/Books/12345", /// provided that the paths "/Inventory" (which supports the first URL) and /// "/Inventory/{Category}/{ItemId}" (which supports the second URL) /// are both mapped to the request DTO. /// /// Please note that while it is possible to specify property values /// in the query string, it is generally considered to be less RESTful and /// less desirable than to specify them as variables in the path. Using the /// query string to specify property values may also interfere with HTTP /// caching. /// /// The final variable in the path may contain a "*" suffix /// to grab all remaining segments in the path portion of the request URL and assign /// them to a single property on the request DTO. /// For example, if the path "/Inventory/{ItemPath*}" is mapped to the request DTO, /// then the request URL "http://services/Inventory/Books/12345" will result /// in a request DTO whose ItemPath property contains "Books/12345". /// You may only specify one such variable in the path, and it must be positioned at /// the end of the path. /// public string Path { get; set; } /// /// Gets or sets a comma-delimited list of HTTP verbs supported by the service, such as /// "GET,PUT,POST,DELETE". /// /// /// A providing a comma-delimited list of HTTP verbs supported /// by the service, or empty if all verbs are supported. /// public string Verbs { get; set; } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestDeleteService.cs0000644000175000017500000000056212146506551032200 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// If the Service also implements this interface, /// IRestDeleteService.Delete() will be used instead of IService.Execute() for /// EndpointAttributes.HttpDelete requests /// /// public interface IRestDeleteService { object Delete(T request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/Feature.cs0000644000175000017500000000077312146506551030105 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.ServiceHost { [Flags] public enum Feature : int { None = 0, All = int.MaxValue, Soap = Soap11 | Soap12, Json = 1 << 0, Xml = 1 << 1, Jsv = 1 << 2, Soap11 = 1 << 3, Soap12 = 1 << 4, Csv = 1 << 5, Html = 1 << 6, CustomFormat = 1 << 7, Metadata = 1 << 8, Markdown = 1 << 9, Razor = 1 << 10, ProtoBuf = 1 << 11, } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IHttpError.cs0000644000175000017500000000022412146506551030543 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { public interface IHttpError : IHttpResult { string Message { get; } string ErrorCode { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/ServiceAttribute.cs0000644000175000017500000000706612146506551032000 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.ServiceHost { /// /// Used to decorate Request DTO's to alter the behaviour of a service. /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] public class ServiceAttribute : Attribute { /// /// Sets a single access restriction /// /// The restrict access to. public EndpointAttributes RestrictAccessTo { get { return this.RestrictAccessToScenarios.Length == 0 ? EndpointAttributes.All : this.RestrictAccessToScenarios[0]; } set { this.RestrictAccessToScenarios = new[] { value }; } } /// /// Set multiple access scenarios /// /// The restrict access to scenarios. public EndpointAttributes[] RestrictAccessToScenarios { get; private set; } public int? Version { get; set; } public ServiceAttribute() { this.RestrictAccessToScenarios = new EndpointAttributes[0]; } public ServiceAttribute(params EndpointAttributes[] restrictAccessToScenarios) : this() { if (restrictAccessToScenarios.Length == 0) { this.RestrictAccessTo = EndpointAttributes.All; return; } var scenarios = new List(); foreach (var restrictAccessToScenario in restrictAccessToScenarios) { var restrictAccessTo = EndpointAttributes.None; //Network access if (!HasAnyRestrictionsOf(restrictAccessToScenario, EndpointAttributes.AllNetworkAccessTypes)) { restrictAccessTo |= EndpointAttributes.AllNetworkAccessTypes; } else { restrictAccessTo |= (restrictAccessToScenario & EndpointAttributes.AllNetworkAccessTypes); } //Security if (!HasAnyRestrictionsOf(restrictAccessToScenario, EndpointAttributes.AllSecurityModes)) { restrictAccessTo |= EndpointAttributes.AllSecurityModes; } else { restrictAccessTo |= (restrictAccessToScenario & EndpointAttributes.AllSecurityModes); } //Http Method if (!HasAnyRestrictionsOf(restrictAccessToScenario, EndpointAttributes.AllHttpMethods)) { restrictAccessTo |= EndpointAttributes.AllHttpMethods; } else { restrictAccessTo |= (restrictAccessToScenario & EndpointAttributes.AllHttpMethods); } //Call style if (!HasAnyRestrictionsOf(restrictAccessToScenario, EndpointAttributes.AllCallStyles)) { restrictAccessTo |= EndpointAttributes.AllCallStyles; } else { restrictAccessTo |= (restrictAccessToScenario & EndpointAttributes.AllCallStyles); } //Endpoint if (!HasAnyRestrictionsOf(restrictAccessToScenario, EndpointAttributes.AllEndpointTypes)) { restrictAccessTo |= EndpointAttributes.AllEndpointTypes; } else { restrictAccessTo |= (restrictAccessToScenario & EndpointAttributes.AllEndpointTypes); } scenarios.Add(restrictAccessTo); } this.RestrictAccessToScenarios = scenarios.ToArray(); } static bool HasAnyRestrictionsOf(EndpointAttributes allRestrictions, EndpointAttributes restrictions) { return (allRestrictions & restrictions) != 0; } public ServiceAttribute(int version, params EndpointAttributes[] restrictAccessScenarios) : this(restrictAccessScenarios) { this.Version = version; } public bool HasNoAccessRestrictions { get { return this.RestrictAccessTo == EndpointAttributes.All; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IResolver.cs0000644000175000017500000000037712146506551030424 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { public interface IResolver { /// /// Resolve a dependency from the AppHost's IOC /// /// /// T TryResolve(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceHost/IRestPatchService.cs0000644000175000017500000000055312146506551032035 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceHost { /// /// If the Service also implements this interface, /// IRestPutService.Patch() will be used instead of IService.Execute() for /// EndpointAttributes.HttpPatch requests /// /// public interface IRestPatchService { object Patch(T request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/0000755000175000017500000000000012146506551025633 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/MessageFactory.cs0000644000175000017500000000423112146506551031076 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Reflection; using ServiceStack.DataAnnotations; namespace ServiceStack.Messaging { internal delegate IMessage MessageFactoryDelegate(object body); public static class MessageFactory { static readonly Dictionary CacheFn = new Dictionary(); public static IMessage Create(object response) { if (response == null) return null; var type = response.GetType(); MessageFactoryDelegate factoryFn; lock (CacheFn) CacheFn.TryGetValue(type, out factoryFn); if (factoryFn != null) return factoryFn(response); var genericMessageType = typeof(Message<>).MakeGenericType(type); var mi = genericMessageType.GetMethod("Create", BindingFlags.Public | BindingFlags.Static); factoryFn = (MessageFactoryDelegate) Delegate.CreateDelegate( typeof (MessageFactoryDelegate), mi); lock (CacheFn) CacheFn[type] = factoryFn; return factoryFn(response); } } public class Message : IMessage { public Guid Id { get; set; } public DateTime CreatedDate { get; set; } public long Priority { get; set; } public int RetryAttempts { get; set; } public Guid? ReplyId { get; set; } public string ReplyTo { get; set; } public int Options { get; set; } public MessageError Error { get; set; } public object Body { get; set; } } /// /// Basic implementation of IMessage[T] /// /// public class Message : Message, IMessage { public Message() { this.Id = Guid.NewGuid(); this.CreatedDate = DateTime.UtcNow; this.Options = (int) MessageOption.NotifyOneWay; } public Message(T body) : this() { Body = body; } public static IMessage Create(object oBody) { return new Message((T) oBody); } public T GetBody() { return (T)Body; } public override string ToString() { return string.Format("CreatedDate={0}, Id={1}, Type={2}, Retry={3}", this.CreatedDate, this.Id.ToString("N"), typeof(T).Name, this.RetryAttempts); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/IMessageService.cs0000644000175000017500000000343312146506551031203 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { /// /// Simple definition of an MQ Host /// public interface IMessageService : IDisposable { /// /// Factory to create consumers and producers that work with this service /// IMessageFactory MessageFactory { get; } /// /// Register DTOs and hanlders the MQ Host will process /// /// /// void RegisterHandler(Func, object> processMessageFn); /// /// Register DTOs and hanlders the MQ Host will process /// /// /// /// void RegisterHandler(Func, object> processMessageFn, Action, Exception> processExceptionEx); /// /// Get Total Current Stats for all Message Handlers /// /// IMessageHandlerStats GetStats(); /// /// Get the status of the service. Potential Statuses: Disposed, Stopped, Stopping, Starting, Started /// /// string GetStatus(); /// /// Get a Stats dump /// /// string GetStatsDescription(); /// /// Start the MQ Host if not already started. /// void Start(); /// /// Stop the MQ Host if not already stopped. /// void Stop(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/MessageHandlerStats.cs0000644000175000017500000000474012146506551032070 0ustar00meebeymeebey00000000000000using System.Text; namespace ServiceStack.Messaging { public interface IMessageHandlerStats { string Name { get; } int TotalMessagesProcessed { get; } int TotalMessagesFailed { get; } int TotalRetries { get; } int TotalNormalMessagesReceived { get; } int TotalPriorityMessagesReceived { get; } void Add(IMessageHandlerStats stats); } public class MessageHandlerStats : IMessageHandlerStats { public MessageHandlerStats(string name) { Name = name; } public MessageHandlerStats(string name, int totalMessagesProcessed, int totalMessagesFailed, int totalRetries, int totalNormalMessagesReceived, int totalPriorityMessagesReceived) { Name = name; TotalMessagesProcessed = totalMessagesProcessed; TotalMessagesFailed = totalMessagesFailed; TotalRetries = totalRetries; TotalNormalMessagesReceived = totalNormalMessagesReceived; TotalPriorityMessagesReceived = totalPriorityMessagesReceived; } public string Name { get; private set; } public int TotalMessagesProcessed { get; private set; } public int TotalMessagesFailed { get; private set; } public int TotalRetries { get; private set; } public int TotalNormalMessagesReceived { get; private set; } public int TotalPriorityMessagesReceived { get; private set; } public virtual void Add(IMessageHandlerStats stats) { TotalMessagesProcessed += stats.TotalMessagesProcessed; TotalMessagesFailed += stats.TotalMessagesFailed; TotalRetries += stats.TotalRetries; TotalNormalMessagesReceived += stats.TotalNormalMessagesReceived; TotalPriorityMessagesReceived += stats.TotalPriorityMessagesReceived; } public override string ToString() { var sb = new StringBuilder("Stats for " + Name); sb.AppendLine("\n---------------"); sb.AppendFormat("\nTotalNormalMessagesReceived: {0}", TotalNormalMessagesReceived); sb.AppendFormat("\nTotalPriorityMessagesReceived: {0}", TotalPriorityMessagesReceived); sb.AppendFormat("\nTotalProcessed: {0}", TotalMessagesProcessed); sb.AppendFormat("\nTotalRetries: {0}", TotalRetries); sb.AppendFormat("\nTotalFailed: {0}", TotalMessagesFailed); return sb.ToString(); } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/MessageError.cs0000644000175000017500000000044312146506551030561 0ustar00meebeymeebey00000000000000namespace ServiceStack.Messaging { /// /// An Error Message Type that can be easily serialized /// public class MessageError { public string ErrorCode { get; set; } public string Message { get; set; } public string StackTrace { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/IMessageQueueClient.cs0000644000175000017500000000235412146506551032027 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { public interface IMessageQueueClient : IMessageProducer { /// /// Publish the specified message into the durable queue @queueName /// /// /// void Publish(string queueName, byte[] messageBytes); /// /// Publish the specified message into the transient queue @queueName /// /// /// void Notify(string queueName, byte[] messageBytes); /// /// Synchronous blocking get. /// /// /// /// byte[] Get(string queueName, TimeSpan? timeOut); /// /// Non blocking get message /// /// /// byte[] GetAsync(string queueName); /// /// Blocking wait for notifications on any of the supplied channels /// /// /// string WaitForNotifyOnAny(params string[] channelNames); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/MessagingException.cs0000644000175000017500000000156312146506551031763 0ustar00meebeymeebey00000000000000using System; using System.Runtime.Serialization; namespace ServiceStack.Messaging { /// /// Base Exception for all ServiceStack.Messaging exceptions /// public class MessagingException : Exception { public MessagingException() { } public MessagingException(string message) : base(message) { } public MessagingException(string message, Exception innerException) : base(message, innerException) { } #if !SILVERLIGHT && !MONOTOUCH && !XBOX protected MessagingException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif public virtual MessageError ToMessageError() { return new MessageError { ErrorCode = GetType().Name, Message = this.Message, StackTrace = this.ToString(), //Also includes inner exception }; } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/QueueNames.cs0000644000175000017500000000405312146506551030234 0ustar00meebeymeebey00000000000000using System; using System.Text; namespace ServiceStack.Messaging { /// /// Util static generic class to create unique queue names for types /// /// public static class QueueNames { static QueueNames() { var utf8 = new UTF8Encoding(false); Priority = "mq:" + typeof(T).Name + ".priorityq"; PriorityBytes = utf8.GetBytes(Priority); In = "mq:" + typeof(T).Name + ".inq"; InBytes = utf8.GetBytes(In); Out = "mq:" + typeof(T).Name + ".outq"; OutBytes = utf8.GetBytes(Out); Dlq = "mq:" + typeof(T).Name + ".dlq"; DlqBytes = utf8.GetBytes(Dlq); } public static string Priority { get; private set; } public static byte[] PriorityBytes { get; private set; } public static string In { get; private set; } public static byte[] InBytes { get; private set; } public static string Out { get; private set; } public static byte[] OutBytes { get; private set; } public static string Dlq { get; private set; } public static byte[] DlqBytes { get; private set; } } /// /// Util class to create unique queue names for runtime types /// public class QueueNames { public static string TopicIn = "mq:topic:in"; public static string TopicOut = "mq:topic:out"; public static string QueuePrefix = ""; public static void SetQueuePrefix(string prefix) { TopicIn = prefix + "mq:topic:in"; TopicOut = prefix + "mq:topic:out"; QueuePrefix = prefix; } private readonly Type messageType; public QueueNames(Type messageType) { this.messageType = messageType; } public string Priority { get { return QueuePrefix + "mq:" + messageType.Name + ".priorityq"; } } public string In { get { return QueuePrefix + "mq:" + messageType.Name + ".inq"; } } public string Out { get { return QueuePrefix + "mq:" + messageType.Name + ".outq"; } } public string Dlq { get { return QueuePrefix + "mq:" + messageType.Name + ".dlq"; } } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/MessageOption.cs0000644000175000017500000000027512146506551030743 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { [Flags] public enum MessageOption : int { None = 0, All = int.MaxValue, NotifyOneWay = 1 << 0, } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/IMessage.cs0000644000175000017500000000104612146506551027660 0ustar00meebeymeebey00000000000000using System; using ServiceStack.DataAnnotations; using ServiceStack.DesignPatterns.Model; namespace ServiceStack.Messaging { public interface IMessage : IHasId { DateTime CreatedDate { get; } long Priority { get; set; } int RetryAttempts { get; set; } Guid? ReplyId { get; set; } string ReplyTo { get; set; } int Options { get; set; } MessageError Error { get; set; } object Body { get; set; } } public interface IMessage : IMessage { T GetBody(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/IMessageProducer.cs0000644000175000017500000000037612146506551031371 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Text; namespace ServiceStack.Messaging { public interface IMessageProducer : IDisposable { void Publish(T messageBody); void Publish(IMessage message); } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/IMessageQueueClientFactory.cs0000644000175000017500000000026112146506551033352 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { public interface IMessageQueueClientFactory : IDisposable { IMessageQueueClient CreateMessageQueueClient(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/IMessageFactory.cs0000644000175000017500000000025412146506551031210 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Messaging { public interface IMessageFactory : IMessageQueueClientFactory { IMessageProducer CreateMessageProducer(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Messaging/UnRetryableMessagingException.cs0000644000175000017500000000143512146506551034136 0ustar00meebeymeebey00000000000000using System; using System.Runtime.Serialization; namespace ServiceStack.Messaging { /// /// For messaging exceptions that should by-pass the messaging service's configured /// retry attempts and store the message straight into the DLQ /// public class UnRetryableMessagingException : MessagingException { public UnRetryableMessagingException() { } public UnRetryableMessagingException(string message) : base(message) { } public UnRetryableMessagingException(string message, Exception innerException) : base(message, innerException) { } #if !SILVERLIGHT && !MONOTOUCH && !XBOX protected UnRetryableMessagingException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Properties/0000755000175000017500000000000012146506551026052 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Properties/AssemblyInfo.cs0000644000175000017500000000311512146506551030774 0ustar00meebeymeebey00000000000000using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("ServiceStack.Interfaces")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("ServiceStack")] [assembly: AssemblyProduct("ServiceStack.Interfaces")] [assembly: AssemblyCopyright("Copyright © ServiceStack 2012")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("d13ebd2a-6589-453d-bf31-4c744a59e993")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("3.9.8.0")] [assembly: ContractNamespace("http://schemas.servicestack.net/types", ClrNamespace = "ServiceStack.ServiceInterface.ServiceModel")] smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/0000755000175000017500000000000012146506550025710 5ustar00meebeymeebey00000000000000IPersistenceProviderManagerFactory.cs0000644000175000017500000000026412146506550035115 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccessnamespace ServiceStack.DataAccess { public interface IPersistenceProviderManagerFactory { IPersistenceProviderManager CreateProviderManager(string connectionString); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IHasDbConnection.cs0000644000175000017500000000030412146506550031346 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using System.Data; namespace ServiceStack.DataAccess { public interface IHasDbConnection { IDbConnection DbConnection { get; } } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IQueryablePersistenceProvider.cs0000644000175000017500000000042712146506550034224 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using ServiceStack.DataAccess.Criteria; namespace ServiceStack.DataAccess { public interface IQueryablePersistenceProvider : IPersistenceProvider, IQueryable { IList GetAll(ICriteria criteria) where T : class, new(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IBasicPersistenceProvider.cs0000644000175000017500000000131412146506550033310 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IBasicPersistenceProvider : IDisposable { T GetById(object id) where T : class, new(); IList GetByIds(ICollection ids) where T : class, new(); T Store(T entity) where T : class, new(); void StoreAll(IEnumerable entities) where TEntity : class, new(); void Delete(T entity) where T : class, new(); void DeleteById(object id) where T : class, new(); void DeleteByIds(ICollection ids) where T : class, new(); void DeleteAll() where TEntity : class, new(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IQueryable.cs0000644000175000017500000000070312146506550030301 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IQueryable : IQueryableByExample, IQueryableByPredicate, IQueryableByComparer { //IList Query(); //IList Query(Type extent); //IList Query(Predicate match, IComparer comparer); //IList Query(Predicate match, Comparison comparison); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IQueryableByComparer.cs0000644000175000017500000000027012146506550032264 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IQueryableByComparer { IList Query(IComparer comparer); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IAggregatable.cs0000644000175000017500000000047112146506550030717 0ustar00meebeymeebey00000000000000namespace ServiceStack.DataAccess { public interface IAggregatable { double GetAvg(T entity, string fieldName); long GetCount(T entity, string fieldName); T GetMin(T entity, string fieldName); T GetMax(T entity, string fieldName); long GetSum(T entity, string fieldName); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IPersistenceProvider.cs0000644000175000017500000000146012146506550032350 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IPersistenceProvider : IBasicPersistenceProvider, IDisposable { IList GetAll() where T : class, new(); IList GetAllOrderedBy(string fieldName, bool sortAsc) where T : class, new(); T FindByValue(string name, object value) where T : class, new(); IList FindAllByValue(string name, object value) where T : class, new(); IList FindByValues(string name, ICollection values) where T : class, new(); void Flush(); IList StoreAll(IList entities) where T : class, new(); void DeleteAll(IList entities) where T : class, new(); ITransactionContext BeginTransaction(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/Criteria/0000755000175000017500000000000012146506550027452 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/Criteria/PagingCriteria.cs0000644000175000017500000000053712146506550032676 0ustar00meebeymeebey00000000000000namespace ServiceStack.DataAccess.Criteria { public class PagingCriteria : IPagingCriteria { public uint ResultOffset { get; private set; } public uint ResultLimit { get; private set; } public PagingCriteria(uint resultOffset, uint resultLimit) { this.ResultOffset = resultOffset; this.ResultLimit = resultLimit; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/Criteria/ICriteria.cs0000644000175000017500000000012512146506550031652 0ustar00meebeymeebey00000000000000namespace ServiceStack.DataAccess.Criteria { public interface ICriteria { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/Criteria/IPagingCriteria.cs0000644000175000017500000000024212146506550033000 0ustar00meebeymeebey00000000000000namespace ServiceStack.DataAccess.Criteria { public interface IPagingCriteria : ICriteria { uint ResultOffset { get; } uint ResultLimit { get; } } }IOrderDescendingCriteria.cs0000644000175000017500000000022712146506550034556 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/Criterianamespace ServiceStack.DataAccess.Criteria { public interface IOrderDescendingCriteria : ICriteria { string OrderedDescendingBy { get; } } }IOrderAscendingCriteria.cs0000644000175000017500000000022512146506550034404 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/Criterianamespace ServiceStack.DataAccess.Criteria { public interface IOrderAscendingCriteria : ICriteria { string OrderedAscendingBy { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IQueryableByPredicate.cs0000644000175000017500000000030512146506550032413 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IQueryableByPredicate { IList Query(Predicate match); } }IBasicPersistenceProvider.Generic.cs0000644000175000017500000000114712146506550034610 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccessusing System; using System.Collections; using System.Collections.Generic; namespace ServiceStack.DataAccess { /// /// For providers that want a cleaner API with a little more perf /// /// public interface IBasicPersistenceProvider : IDisposable { T GetById(object id); IList GetByIds(IEnumerable ids); IList GetAll(); T Store(T entity); void StoreAll(IEnumerable entities); void Delete(T entity); void DeleteById(object id); void DeleteByIds(IEnumerable ids); void DeleteAll(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/DataAccessException.cs0000644000175000017500000000106312146506550032111 0ustar00meebeymeebey00000000000000using System; using System.Runtime.Serialization; namespace ServiceStack.DataAccess { public class DataAccessException : Exception { public DataAccessException() { } public DataAccessException(string message) : base(message) { } public DataAccessException(string message, Exception innerException) : base(message, innerException) { } #if !SILVERLIGHT && !MONOTOUCH && !XBOX protected DataAccessException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IQueryableByExample.cs0000644000175000017500000000026512146506550032113 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IQueryableByExample { IList QueryByExample(object template); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IResultSet.cs0000644000175000017500000000031412146506550030300 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DataAccess { public interface IResultSet { long Offset { get; } long TotalCount { get; } IEnumerable Results { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/IPersistenceProviderManager.cs0000644000175000017500000000037212146506550033644 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAccess { /// /// Manages a connection to a persistance provider /// public interface IPersistenceProviderManager : IDisposable { IPersistenceProvider GetProvider(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAccess/ITransactionContext.cs0000644000175000017500000000026012146506550032200 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAccess { public interface ITransactionContext : IDisposable { bool Commit(); bool Rollback(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceStack.Interfaces.csproj0000644000175000017500000006056212652472053031622 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {42E1C8C0-A163-44CC-92B1-8F416F2C0B01} Library Properties ServiceStack ServiceStack.Interfaces 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true v4.5 True full False bin\Debug\ DEBUG;TRACE prompt 4 AllRules.ruleset True pdbonly True bin\Release\ TRACE prompt 4 AllRules.ruleset bin\Release\ServiceStack.Interfaces.XML bin\MONOTOUCH\ TRACE bin\Release\ServiceStack.Interfaces.XML True pdbonly AnyCPU bin\Release\ServiceStack.Interfaces.dll.CodeAnalysisLog.xml true GlobalSuppressions.cs prompt AllRules.ruleset ;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets false ;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules 4 Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/0000755000175000017500000000000012146506550026042 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICompressableCacheTextManager.cs0000644000175000017500000000043112146506550034203 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.CacheAccess { public interface ICompressableCacheTextManager : IHasCacheClient, ICacheHasContentType, ICacheClearable { object Resolve(string compressionType, string cacheKey, Func createCacheFn) where T : class; } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/IMemcachedClient.cs0000644000175000017500000001122512146506550031510 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.CacheAccess { /// /// A light interface over a cache client. /// This interface was inspired by Enyim.Caching.MemcachedClient /// /// Only the methods that are intended to be used are required, if you require /// extra functionality you can uncomment the unused methods below as they have been /// implemented in DdnMemcachedClient /// public interface IMemcachedClient : IDisposable { /// /// Removes the specified item from the cache. /// /// The identifier for the item to delete. /// /// true if the item was successfully removed from the cache; false otherwise. /// bool Remove(string key); /// /// Removes the cache for all the keys provided. /// /// The keys. void RemoveAll(IEnumerable keys); /// /// Retrieves the specified item from the cache. /// /// The identifier for the item to retrieve. /// /// The retrieved item, or null if the key was not found. /// object Get(string key); object Get(string key, out ulong lastModifiedValue); /// /// Increments the value of the specified key by the given amount. The operation is atomic and happens on the server. /// /// The identifier for the item to increment. /// The amount by which the client wants to increase the item. /// /// The new value of the item or -1 if not found. /// /// The item must be inserted into the cache before it can be changed. The item must be inserted as a . The operation only works with values, so -1 always indicates that the item was not found. long Increment(string key, uint amount); /// /// Increments the value of the specified key by the given amount. The operation is atomic and happens on the server. /// /// The identifier for the item to increment. /// The amount by which the client wants to decrease the item. /// /// The new value of the item or -1 if not found. /// /// The item must be inserted into the cache before it can be changed. The item must be inserted as a . The operation only works with values, so -1 always indicates that the item was not found. long Decrement(string key, uint amount); /// /// Inserts an item into the cache with a cache key to reference its location. /// /// The key used to reference the item. /// The object to be inserted into the cache. /// /// true if the item was successfully stored in the cache; false otherwise. /// /// The item does not expire unless it is removed due memory pressure. bool Add(string key, object value); bool Set(string key, object value); bool Replace(string key, object value); /// /// Inserts an item into the cache with a cache key to reference its location. /// /// The key used to reference the item. /// The object to be inserted into the cache. /// The time when the item is invalidated in the cache. /// true if the item was successfully stored in the cache; false otherwise. bool Add(string key, object value, DateTime expiresAt); bool Set(string key, object value, DateTime expiresAt); bool Replace(string key, object value, DateTime expiresAt); /// /// Removes all data from the cache. /// void FlushAll(); /// /// Retrieves multiple items from the cache. /// /// The list of identifiers for the items to retrieve. /// /// a Dictionary holding all items indexed by their key. /// IDictionary GetAll(IEnumerable keys); bool CheckAndSet(string key, object value, ulong lastModifiedValue); bool CheckAndSet(string key, object value, ulong lastModifiedValue, DateTime expiresAt); IDictionary GetAll(IEnumerable keys, out IDictionary lastModifiedValues); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICacheManager.cs0000644000175000017500000000046712146506550031007 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.CacheAccess { public interface ICacheManager : ICacheClearable, IHasCacheClient { T Resolve(string cacheKey, Func createCacheFn) where T : class; T Resolve(string cacheKey, TimeSpan expireIn, Func createCacheFn) where T : class; } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/IPersistenceProviderCache.cs0000644000175000017500000000136612146506550033433 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Collections.Generic; namespace ServiceStack.CacheAccess { public interface IPersistenceProviderCache { TEntity GetById(object entityId) where TEntity : class, new(); List GetByIds(ICollection entityIds) where TEntity : class, new(); void SetCache(TEntity entity) where TEntity : class, new(); void Store(TEntity entity) where TEntity : class, new(); void StoreAll(params TEntity[] entities) where TEntity : class, new(); void ClearAll(ICollection entityIds) where TEntity : class, new(); void Clear(params object[] entityIds) where TEntity : class, new(); } }ICompressableCacheTextManagerFactory.cs0000644000175000017500000000024612146506550035460 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccessnamespace ServiceStack.CacheAccess { public interface ICompressableCacheTextManagerFactory { ICompressableCacheTextManager Resolve(string contentType); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/IDeflateProvider.cs0000644000175000017500000000023612146506550031562 0ustar00meebeymeebey00000000000000namespace ServiceStack.CacheAccess { public interface IDeflateProvider { byte[] Deflate(string text); string Inflate(byte[] gzBuffer); } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ISession.cs0000644000175000017500000000131312146506550030123 0ustar00meebeymeebey00000000000000namespace ServiceStack.CacheAccess { /// /// A Users Session /// public interface ISession { /// /// Store any object at key /// /// /// object this[string key] { get; set; } /// /// Set a typed value at key /// /// /// /// void Set(string key, T value); /// /// Get a typed value at key /// /// /// /// T Get(string key); } }IPersistenceProviderCacheFactory.cs0000644000175000017500000000043312146506550034676 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccessusing ServiceStack.DataAccess; namespace ServiceStack.CacheAccess { public interface IPersistenceProviderCacheFactory { IPersistenceProviderCache Create(IPersistenceProviderManager providerManager); IPersistenceProviderCache Create(string conntectionString); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICacheClient.cs0000644000175000017500000001075512146506550030654 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.CacheAccess { /// /// A common interface implementation that is implemeneted by most cache providers /// public interface ICacheClient : IDisposable { /// /// Removes the specified item from the cache. /// /// The identifier for the item to delete. /// /// true if the item was successfully removed from the cache; false otherwise. /// bool Remove(string key); /// /// Removes the cache for all the keys provided. /// /// The keys. void RemoveAll(IEnumerable keys); /// /// Retrieves the specified item from the cache. /// /// /// The identifier for the item to retrieve. /// /// The retrieved item, or null if the key was not found. /// T Get(string key); /// /// Increments the value of the specified key by the given amount. /// The operation is atomic and happens on the server. /// A non existent value at key starts at 0 /// /// The identifier for the item to increment. /// The amount by which the client wants to increase the item. /// /// The new value of the item or -1 if not found. /// /// The item must be inserted into the cache before it can be changed. The item must be inserted as a . The operation only works with values, so -1 always indicates that the item was not found. long Increment(string key, uint amount); /// /// Increments the value of the specified key by the given amount. /// The operation is atomic and happens on the server. /// A non existent value at key starts at 0 /// /// The identifier for the item to increment. /// The amount by which the client wants to decrease the item. /// /// The new value of the item or -1 if not found. /// /// The item must be inserted into the cache before it can be changed. The item must be inserted as a . The operation only works with values, so -1 always indicates that the item was not found. long Decrement(string key, uint amount); /// /// Adds a new item into the cache at the specified cache key only if the cache is empty. /// /// The key used to reference the item. /// The object to be inserted into the cache. /// /// true if the item was successfully stored in the cache; false otherwise. /// /// The item does not expire unless it is removed due memory pressure. bool Add(string key, T value); /// /// Sets an item into the cache at the cache key specified regardless if it already exists or not. /// bool Set(string key, T value); /// /// Replaces the item at the cachekey specified only if an items exists at the location already. /// bool Replace(string key, T value); bool Add(string key, T value, DateTime expiresAt); bool Set(string key, T value, DateTime expiresAt); bool Replace(string key, T value, DateTime expiresAt); bool Add(string key, T value, TimeSpan expiresIn); bool Set(string key, T value, TimeSpan expiresIn); bool Replace(string key, T value, TimeSpan expiresIn); /// /// Invalidates all data on the cache. /// void FlushAll(); /// Retrieves multiple items from the cache. /// The default value of T is set for all keys that do not exist. /// /// The list of identifiers for the items to retrieve. /// /// a Dictionary holding all items indexed by their key. /// IDictionary GetAll(IEnumerable keys); /// /// Sets multiple items to the cache. /// /// /// The values. void SetAll(IDictionary values); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/IHasCacheClient.cs0000644000175000017500000000017012146506550031276 0ustar00meebeymeebey00000000000000namespace ServiceStack.CacheAccess { public interface IHasCacheClient { ICacheClient CacheClient { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICacheTextManagerFactory.cs0000644000175000017500000000021612146506550033174 0ustar00meebeymeebey00000000000000namespace ServiceStack.CacheAccess { public interface ICacheTextManagerFactory { ICacheTextManager Resolve(string contentType); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/IGZipProvider.cs0000644000175000017500000000022312146506550031063 0ustar00meebeymeebey00000000000000namespace ServiceStack.CacheAccess { public interface IGZipProvider { byte[] GZip(string text); string GUnzip(byte[] gzBuffer); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICacheTextManager.cs0000644000175000017500000000056012146506550031646 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.CacheAccess { public interface ICacheTextManager : IHasCacheClient, ICacheClearable { string ContentType { get; } string ResolveText(string cacheKey, Func createCacheFn) where T : class; string ResolveText(string cacheKey, TimeSpan expiresIn, Func createCacheFn) where T : class; } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ISessionFactory.cs0000644000175000017500000000134112146506550031454 0ustar00meebeymeebey00000000000000#if !SILVERLIGHT && !MONOTOUCH && !XBOX using ServiceStack.ServiceHost; namespace ServiceStack.CacheAccess { /// /// Retrieves a User Session /// public interface ISessionFactory { /// /// Gets the session for this request, creates one if it doesn't exist. /// /// /// /// ISession GetOrCreateSession(IHttpRequest httpReq, IHttpResponse httpRes); /// /// Gets the session for this request, creates one if it doesn't exist. /// Only for ASP.NET apps. Uses the HttpContext.Current singleton. /// ISession GetOrCreateSession(); } } #endifsmuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICacheClearable.cs0000644000175000017500000000032212146506550031275 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.CacheAccess { public interface ICacheClearable { void Clear(IEnumerable cacheKeys); void Clear(params string[] cacheKeys); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/CacheAccess/ICacheHasContentType.cs0000644000175000017500000000016712146506550032342 0ustar00meebeymeebey00000000000000namespace ServiceStack.CacheAccess { public interface ICacheHasContentType { string ContentType { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/0000755000175000017500000000000012146506550027004 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/DefaultAttribute.cs0000644000175000017500000000125112146506550032602 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAnnotations { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class DefaultAttribute : Attribute { public int IntValue { get; set; } public double DoubleValue { get; set; } public Type DefaultType { get; set; } public string DefaultValue { get; set; } public DefaultAttribute(int intValue) { this.IntValue = intValue; } public DefaultAttribute(double doubleValue) { this.DoubleValue = doubleValue; } public DefaultAttribute(Type defaultType, string defaultValue) { this.DefaultValue = defaultValue; this.DefaultType = defaultType; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/CompositeIndexAttribute.cs0000644000175000017500000000126312146506550034153 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.DataAnnotations { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class CompositeIndexAttribute : Attribute { public CompositeIndexAttribute() { this.FieldNames = new List(); } public CompositeIndexAttribute(params string[] fieldNames) { this.FieldNames = new List(fieldNames); } public CompositeIndexAttribute(bool unique, params string[] fieldNames) { this.Unique = unique; this.FieldNames = new List(fieldNames); } public List FieldNames { get; set; } public bool Unique { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/AutoIncrementAttribute.cs0000644000175000017500000000027612146506550034001 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAnnotations { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class AutoIncrementAttribute : Attribute { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/AliasAttribute.cs0000644000175000017500000000052512146506550032252 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAnnotations { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Struct)] public class AliasAttribute : Attribute { public string Name { get; set; } public AliasAttribute(string name) { this.Name = name; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/ReferencesAttribute.cs0000644000175000017500000000053312146506550033301 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAnnotations { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Struct)] public class ReferencesAttribute : Attribute { public Type Type { get; set; } public ReferencesAttribute(Type type) { this.Type = type; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DataAnnotations/IndexAttribute.cs0000644000175000017500000000057312146506550032273 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DataAnnotations { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class | AttributeTargets.Struct)] public class IndexAttribute : Attribute { public IndexAttribute() { } public IndexAttribute(bool unique) { Unique = unique; } public bool Unique { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Translators/0000755000175000017500000000000012146506551026232 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Translators/TranslateAttribute.cs0000644000175000017500000000255412146506551032410 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Text; namespace ServiceStack.Translators { /// /// This instructs the generator tool to generate translator methods for the types supplied. /// A {TypeName}.generated.cs partial class will be generated that contains the methods required /// to generate to and from that type. /// [AttributeUsage(AttributeTargets.Class)] public class TranslateAttribute : Attribute { public string SourceMethodPrefix { get; set; } public string TargetMethodPrefix { get; set; } public Type SourceType { get; set; } public Type TargetType { get; set; } public TranslateAttribute(Type targetType) : this(null, targetType) {} public TranslateAttribute(string sourceExtensionPrefix, Type targetType, string targetExtensionPrefix) : this(null, sourceExtensionPrefix, targetType, targetExtensionPrefix) { } protected TranslateAttribute(Type sourceType, Type targetType) { this.SourceType = sourceType; this.TargetType = targetType; } protected TranslateAttribute(Type sourceType, string sourceExtensionPrefix, Type targetType, string targetExtensionPrefix) { this.SourceType = sourceType; this.SourceMethodPrefix = sourceExtensionPrefix; this.TargetType = targetType; this.TargetMethodPrefix = targetExtensionPrefix; } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Translators/TranslateMemberAttribute.cs0000644000175000017500000000064612146506551033540 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Translators { /// /// This changes the default behaviour for the /// [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class TranslateMemberAttribute : Attribute { public string PropertyName { get; set; } public TranslateMemberAttribute(string toPropertyName) { this.PropertyName = toPropertyName; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Translators/TranslateExtensionAttribute.cs0000644000175000017500000000164412146506551034304 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Translators { /// /// This instructs the generator tool to generate translator extension methods for the types supplied. /// A {TypeName}.generated.cs static class will be generated that contains the extension methods required /// to generate to and from that type. /// /// The source type is what the type the attribute is decorated on which can only be resolved at runtime. /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class TranslateExtensionAttribute : TranslateAttribute { public TranslateExtensionAttribute(Type sourceType, Type targetType) : base(sourceType, targetType) {} public TranslateExtensionAttribute(Type sourceType, string sourceExtensionPrefix, Type targetType, string targetExtensionPrefix) :base(sourceType, sourceExtensionPrefix, targetType, targetExtensionPrefix) {} } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/0000755000175000017500000000000012146506551024764 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/IRedisSet.cs0000644000175000017500000000200312146506551027141 0ustar00meebeymeebey00000000000000// // https://github.com/mythz/ServiceStack.Redis // ServiceStack.Redis: ECMA CLI Binding to the Redis key-value storage system // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2010 Liquidbit Ltd. // // Licensed under the same terms of Redis and ServiceStack: new BSD license. // using System.Collections.Generic; using ServiceStack.DesignPatterns.Model; namespace ServiceStack.Redis { public interface IRedisSet : ICollection, IHasStringId { List GetRangeFromSortedSet(int startingFrom, int endingAt); HashSet GetAll(); string Pop(); void Move(string value, IRedisSet toSet); HashSet Intersect(params IRedisSet[] withSets); void StoreIntersect(params IRedisSet[] withSets); HashSet Union(params IRedisSet[] withSets); void StoreUnion(params IRedisSet[] withSets); HashSet Diff(IRedisSet[] withSets); void StoreDiff(IRedisSet fromSet, params IRedisSet[] withSets); string GetRandomEntry(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/ItemRef.cs0000644000175000017500000000022512146506551026645 0ustar00meebeymeebey00000000000000namespace ServiceStack.Redis { public class ItemRef { public string Id { get; set; } public string Item { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/Pipeline/0000755000175000017500000000000012146506551026531 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/Pipeline/IRedisPipelineShared.cs0000644000175000017500000000044312146506551033055 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Redis.Pipeline { /// /// Pipeline interface shared by typed and non-typed pipelines /// public interface IRedisPipelineShared : IDisposable, IRedisQueueCompletableOperation { void Flush(); bool Replay(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/Pipeline/IRedisPipeline.cs0000644000175000017500000000031412146506551031723 0ustar00meebeymeebey00000000000000namespace ServiceStack.Redis.Pipeline { /// /// Interface to redis pipeline /// public interface IRedisPipeline : IRedisPipelineShared, IRedisQueueableOperation { } }IRedisQueueCompletableOperation.cs0000644000175000017500000000145312146506551035221 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/Pipelineusing System; using System.Collections.Generic; namespace ServiceStack.Redis.Pipeline { /// /// Interface to operations that allow queued commands to be completed /// public interface IRedisQueueCompletableOperation { void CompleteVoidQueuedCommand(Action voidReadCommand); void CompleteIntQueuedCommand(Func intReadCommand); void CompleteLongQueuedCommand(Func longReadCommand); void CompleteBytesQueuedCommand(Func bytesReadCommand); void CompleteMultiBytesQueuedCommand(Func multiBytesReadCommand); void CompleteStringQueuedCommand(Func stringReadCommand); void CompleteMultiStringQueuedCommand(Func> multiStringReadCommand); void CompleteDoubleQueuedCommand(Func doubleReadCommand); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/Pipeline/IRedisQueueableOperation.cs0000644000175000017500000000526412146506551033760 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Redis.Pipeline { /// /// interface to operation that can queue commands /// public interface IRedisQueueableOperation { void QueueCommand(Action command); void QueueCommand(Action command, Action onSuccessCallback); void QueueCommand(Action command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func command); void QueueCommand(Func command, Action onSuccessCallback); void QueueCommand(Func command, Action onSuccessCallback, Action onErrorCallback); void QueueCommand(Func> command); void QueueCommand(Func> command, Action> onSuccessCallback); void QueueCommand(Func> command, Action> onSuccessCallback, Action onErrorCallback); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/IRedisHash.cs0000644000175000017500000000057012146506551027300 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using ServiceStack.DesignPatterns.Model; namespace ServiceStack.Redis { public interface IRedisHash : IDictionary, IHasStringId { bool AddIfNotExists(KeyValuePair item); void AddRange(IEnumerable> items); int IncrementValue(string key, int incrementBy); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/IRedisSortedSet.cs0000644000175000017500000000253712146506551030336 0ustar00meebeymeebey00000000000000// // https://github.com/mythz/ServiceStack.Redis // ServiceStack.Redis: ECMA CLI Binding to the Redis key-value storage system // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2010 Liquidbit Ltd. // // Licensed under the same terms of Redis and ServiceStack: new BSD license. // using System.Collections.Generic; using ServiceStack.DesignPatterns.Model; namespace ServiceStack.Redis { public interface IRedisSortedSet : ICollection, IHasStringId { List GetAll(); List GetRange(int startingRank, int endingRank); List GetRangeByScore(string fromStringScore, string toStringScore); List GetRangeByScore(string fromStringScore, string toStringScore, int? skip, int? take); List GetRangeByScore(double fromScore, double toScore); List GetRangeByScore(double fromScore, double toScore, int? skip, int? take); void RemoveRange(int fromRank, int toRank); void RemoveRangeByScore(double fromScore, double toScore); void StoreFromIntersect(params IRedisSortedSet[] ofSets); void StoreFromUnion(params IRedisSortedSet[] ofSets); int GetItemIndex(string value); double GetItemScore(string value); void IncrementItemScore(string value, double incrementByScore); string PopItemWithHighestScore(); string PopItemWithLowestScore(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/IRedisList.cs0000644000175000017500000000231012146506551027322 0ustar00meebeymeebey00000000000000// // https://github.com/mythz/ServiceStack.Redis // ServiceStack.Redis: ECMA CLI Binding to the Redis key-value storage system // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2010 Liquidbit Ltd. // // Licensed under the same terms of Redis and ServiceStack: new BSD license. // using System; using System.Collections.Generic; using ServiceStack.DesignPatterns.Model; namespace ServiceStack.Redis { public interface IRedisList : IList, IHasStringId { List GetAll(); List GetRange(int startingFrom, int endingAt); List GetRangeFromSortedList(int startingFrom, int endingAt); void RemoveAll(); void Trim(int keepStartingFrom, int keepEndingAt); int RemoveValue(string value); int RemoveValue(string value, int noOfMatches); void Prepend(string value); void Append(string value); string RemoveStart(); string BlockingRemoveStart(TimeSpan? timeOut); string RemoveEnd(); void Enqueue(string value); string Dequeue(); string BlockingDequeue(TimeSpan? timeOut); void Push(string value); string Pop(); string BlockingPop(TimeSpan? timeOut); string PopAndPush(IRedisList toList); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/IRedisClientCacheManager.cs0000644000175000017500000000227412146506551032055 0ustar00meebeymeebey00000000000000// // https://github.com/mythz/ServiceStack.Redis // ServiceStack.Redis: ECMA CLI Binding to the Redis key-value storage system // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2010 Liquidbit Ltd. // // Licensed under the same terms of Redis and ServiceStack: new BSD license. // using System; using ServiceStack.CacheAccess; namespace ServiceStack.Redis { public interface IRedisClientCacheManager : IDisposable { /// /// Returns a Read/Write client (The default) using the hosts defined in ReadWriteHosts /// /// IRedisClient GetClient(); /// /// Returns a ReadOnly client using the hosts defined in ReadOnlyHosts. /// /// IRedisClient GetReadOnlyClient(); /// /// Returns a Read/Write ICacheClient (The default) using the hosts defined in ReadWriteHosts /// /// ICacheClient GetCacheClient(); /// /// Returns a ReadOnly ICacheClient using the hosts defined in ReadOnlyHosts. /// /// ICacheClient GetReadOnlyCacheClient(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/IRedisTransaction.cs0000644000175000017500000000117712146506551030706 0ustar00meebeymeebey00000000000000// // https://github.com/mythz/ServiceStack.Redis // ServiceStack.Redis: ECMA CLI Binding to the Redis key-value storage system // // Authors: // Demis Bellot (demis.bellot@gmail.com) // // Copyright 2010 Liquidbit Ltd. // // Licensed under the same terms of Redis and ServiceStack: new BSD license. // using System; using ServiceStack.Redis.Pipeline; namespace ServiceStack.Redis { /// /// Interface to redis transaction /// public interface IRedisTransaction : IRedisTransactionBase, IRedisQueueableOperation, IDisposable { bool Commit(); void Rollback(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/Redis-annotated.png0000644000175000017500000102731012146506551030517 0ustar00meebeymeebey00000000000000PNG  IHDR,*gAMA aPLTE>?33!!!Gis>D?CD>&3f3ECDjohFA?jsj?GFEnsGpof3fGGAD>mDttff3HIHHHtDqmsGGrsGhjfmpjqodywmyxs=?=CGqnfpsf3ACGGJ_LbHtPdCpGsXlsGny+2:33@ G'O1V9f3\@^BcHlSt\w`zd?DEsnsysAADHftis=CGC>nsGGGsoksGqm3ff̐?>BozpftnwDq̙͔>ӖAӖj϶gHtnpgsls33fff˜ɛǢ̢ʫв՚É̙ױ࿨˚ՉΗ׍ڒҧزޒ̔Ғئڮϕ¹̙̘ûݼ̿ٴĔՊ̙؏ْߵ։=2tRNSS% pHYs(JtEXtSoftwarePaint.NET v3.5.87;]uIDATx^eu~&Ljge-q'Dd$nٸd*H<Xծ8Zkj9;hi;Vd[*MU$22*,Yȅ$2A\EAW|o{>s߹}_w}s޿;lzL=0SvCL=0S&l`ꁩ_L<>Lw4SL<SL=0y|2hꁩyҁz`|=0ad2SL=0aSL=0z`dz`Iz`tGSL=0͓L=0 '鎦z` 'z`ꁩ6O&M=06O:0S&lL;z`ꁩ<`ꁩ_L<>Lw4SL<SL=0y|2hꁩyҁz`|=0ad2ݑ ;GSe}lOt~k<>ZOOxrV۾jO?p[ >mZ_7ܡs wM;}wg<}挝9]*g/\9pؼc{pv(^IoK==R>N|:&wS'lV]ӷ1u'7G'&֬160:DGvȭ%o֏pP7?:5" 7ƋGUrNŅIl;N?FKy%7ۤ6/Pm3"6H_|^~ώv5oO^\GŸX;r:qsDU|% -z*| Kt܄Y^T!f~ [nSm}ArL,p-a'p ʪ7ߢx BNBG!BXE{@;fϬ?||yl9vv*ӡJ'iy`~r[G+ũ,Sx"qH@B~B(g6;o6LHSWJnZuٷwd'{v6께V1FXSi-pd<1Pty=Gc&IhƎ?9 ?raw(4F ;zϱc> L8yG#kk0;lW%66WlǺ[n6cB|H"m" {l~l'"/֡OQO<4| 9`l1~q3sj?W`4xP"||cv7sz>7o^I责{fOoNC6CI^Xbs0~MHw2 ~5&UԀp'lNW%6'(n,a،\H F;<6&`O[y1Nbc/>ňإ(XOD'̓&Ǫ!/\>Go7];F4/ i_Mu7Ff?w7y!|ޠy4T>uB`WlW6}Y&'\=tGYciaso07/ Z~L#izl~B\J7G%WuKOz9Zv*O%]Ś C+iDNC= ߕ j 7ek;"rc͏!>?+6Gī Ӈ>>'|ƪTFe+Tȋa9nqsi Թ^5&O4=6&F%YyoS)^6oD ߋE0: 6h±9d_1tbcwxtߘӐgh@ߔc0o=Ç5Eڣ6$< a393~J4p╄ [ݍkv\>љwƛerGwmi\͏2z{5ce @(̐(d(.[ ohH0`_B| ];%wm8yw`߲~NoBgylosQړ'Bnl>RT`;4yhhM7w&l [5KƑ'=8d _yMHk/ \ox^y[o=oFղce`VLƳx[=@D1̑爫o.mǎXA> )K0UvEڅI: _}{3$iZnUl4$ȎxEhv:GcsaƣވyEGbc*͢է7#UCr a+?~s8k_&.jĀW݄W =(ra3Gvj WΖ p<~4IPc˧!S4&ZB wp`hpP,!@O;9Z0%1ydbjl Kt";#ji -Kݙ8(g?Q>/Y;hgGPѥ!ljR5N#r0q ?<̗9 b)9㫚@I$MP' Q0/SfCմ/<aUt֞gQ*Y^ƃ7GO輵N\I'`s_6U< &jBB!7<6?tU|ӥ|&|N8Iק7 RTСye?vCa7Xa<UC ݣmY uLIx'+w\cn+‘WT6K:#Hg{;dņ%MFŧ: 5?&>=u$G?41>o2fy~8.yeO:t UVcs;%vc$ea&IO\pzKnx>aH6^ivj c[y6ع##N[9kw.b6/GU6Hʄ̓vy'lpڄYsy=yDV&l{v/=a󈅓&lڝ ؄ }Մ#Ơ2a;'lsG| G,6as\&l^`g&l0 />a;KOIPy^gkzEl>_m]a v5csI ־cR+CοMȐv,`"khn7#Q.}n[^ѓaF=6eȽ͟YT[ZUnl' >O!ZPg*;d5 @6R)-.sh&6 6mo_0"ui ٲOy~h,dW^!TȂuY]_M[m;Iד[p]fq܃'gPx&5sIK`3&b0h1U<:u6 kw70f\b{)fjT`pv3l}4ꠙ6@l"ۧlyM,Zm|!Iye=!GeI! 3>{;D\B2]u$pbcJvբزXlE-"U?3ܒ}D) j:F̳n0,Si~ퟟS}}\B{7NCyoJQi#ڮ㎛ᣁF_6dkWevfpŠ vIY& ovrWV_9&b7&Owgoen 5>2B(V[r{32g\60XDZQa6oyfǜ,[u^ʣkj[&L{ogŀ̨Kk΍^żY~nY\qgy0(r>٧oz~olN =R/xs^E\ŭ7o&K3eZo9{zŅuO0fv}^W7ScdF/XQ1QBtn8uJ`R`a#"sl~+[tuzplmcUrP68;QH_?IFڛ7WZT^v2_tUH^v~4۹IMl4NSx3ugy_r<-PDrԶ_ɑY8*In85J]/8 y6Wq7Qp uLs |ʜ%H:B94較ikM R7]BjrWL]_dg+@Zpj9);y{U3H{1?瑻]"~qPø] y @rt7/]Jk³~DW:p-ʐoHT nQsc^pvaicO3RCSjگ1tW~c6{Ww1t>oo%%[{;uؽq6>z}5X7vQBDYԮ?x$Ybm'9zA(qjg| ¬ISn[فզqp(JAm-"-ٵZ'c 6:MCʬ6:>ɝ煄;/bܗgP#l,{7{]f<Fe|,qe^*;K}FfhcO7y &Ąz%?%9*.ܥ׿~_۶arx[kKLmqZU,A7~:6s^F+nX9/OwRl'$s?H3: wr˪mcF خˑZW:YcYW%]>?[0ͱɾjv?ec>|B{rjxBDEdlGZJ0a m4]~}߼-̉>C|vz 6g gHldag/Wx3ݥӇՒ;KDLcYH3=&k7?ZXXg7՞ NHܿ x<'Kv]|x33fL~5r3ګ7 xo>u\7sޗu| 7k^6r(j+ hox=τ`e@`ALoY~kchv=~Kr$sErBpb3^,hqP:aEnww xRB,/Ih6H2f!o9Te}ϞYB걹r?ļx1/⣤lg~|iZiXx4z6fZTR o(9{/r31[b~ c3x3OyK4ʽ̫}-'_M,kׄ$x]\,,(fB!wY_t;-24䅱bU:黄Uzeʔ12سmzL0uh/{Heq̛9'MHHc\|T]Q %Lg$HAa[ڥRN{9ifn2esz\j a2jB+?gP|F+K mq~Nei7\&_զ:ǻEX67Z \YklbtJ #/˟ L]bq8 ~`F<_wZ躟C umq3ހbYS $N#e\>4 Tsɀ|6t6A*k?92┠n8= 6B|Nm{Ĕ5(9`/4^+.WT;RiIR`-B\)mn`$L@IG 9-j+0ct^bd{2cPcF9TPk(k5a㕡w=zcdWdR&|/*e;i# / ?'I)SnfX'ys 0o%Ꜯ˱pza#fE2\NEh LԃOD~v{҆PT(8%.XIYPf3{NH 6{e~]PWj Zoڥִa㵙F&B\8]"rO |ur"Ǜݬf-\E賴_'E:ug PaǼY9_Q(Bhw@{awV24ySphCk̇+ng.XƘ客w,ڪ-1{{ez1UlBaүt(X2Zp/Z*ET5MuMZ†I .{/ ܸXTĒmGR(uڴ:5;Hr 2(2oJvj_ N~ 2XA>Ϩ7wgMPPT8G&{߲ a3+v St8 @!e?\=-ow/ǜyE6c`KgJἸh8dd+4˳ qHlY2 g-t + 'C],.E)xqHx3@ 4LJa+z5ovU-Bl> m@'t*1Ldgcۗ!ݡlaHoϠ9 Sbο:qX I8C-r 3,s BCkerSx1onro'A%h\*Q7{tѦsn[͛uv V* fu4\}rrͲ4j=‚!4NP xjjtO"%A`[dwjNM4м1ȷ=>zcY%WgR! ^{ٴe:qP NʓxL}=Ro9Gx_\2dm D і4l4*S:#&X}d@Nu,|Q{mv`(cRL̊qDqcSJ1R )3]j{ ˣsXHQ(5w[G7I xJlk#viCAמ6[$a}@l"hęYcw) NvJ5J 3T@r0dD9C/7C1}ߐ}5Bu~@DW|A[뇽GE4]ʩu\nN\r_Z Ɍ@k?jB6dPPq) ;nhh ]d]L*d,r[7+a& (A(Pn:5G=5ݮ_V9뒬MJ Rə0²[Is"(/DcSAǨֶ!vde5 ;̈_i2pGZ~e{9~@(makw>,Zw[ i94-B/Og2@!M̲3X?X8|?6qUsUU:˽#_VE|+>E w"?P)"ٌmWtWW21 ӊiC. kjt]VE{QލByPk4>Pz]] rцrDiE+|YZ. ԽT*Uc n4n&˧oG!H@g#J!qUWlrZF8z˝UYMQȚKȰ]${I{'zsck oW%U2O䏌anB`Tf~Nrmz2ޡx uO]xS7DR?漩+qf KJ۟%цߺҽ>Mѐ20['fnc + Vc6k{U"3P)#"eHK}b Wݰ:X:HM/GlouF $[e1(e-qxWsWT*v[}A13p!EuU ʬMù@):? e%Ss,BAϨ %;݁?'0of;?w0 7]1[&'BcfBWX]ގj*`+>/ogS7h?Pf/?z\ʗC C bf d&wGoyZ #i&5[?ï.ƒ_[hrl T1RYtRa7>H5u续l/ޣ^I[`-ݣ'ndN2{Ohۼ$xY/GAok=i>qY`AdkcѪ>_MjGF߱>kj+C_(kw6iN9%E6_#G/wf%_-o]" */s}oF޿\%Vd]" ^[y#(8lAYuB~Wƕf~G&1l͔Oz?&'A? 7R"rVVP-ncB)̼Y_$懮e63a/һc faЎR:m$7_|E>樆<FGL3<\6@F]gЮpAcLjS%D1R gL.?1/Jg FkeÚ4׵U=~McyL-"Z3oI\+26~&Q/~uۘ+kxh3}$$ňvs^@ІaÙQ׿FfTjܢGh.{-fMܑLٷQU]%}eZfjCTr$܃Ւv,aFU]v y✑_|_46lQ^3Wc+#:_!i+ pkKQWS`!PXKЩy>}4C`ésy.(0vxAGgkзtsFd9Gl0o6= oDQ)SƋkHߨY=f6kVjiaTk!8~ x<ÔW}`ʛo# 2)t9}C? <(<xg.]h)kf`F% i12̀2CU>y[ Z:]uDU\vZ+:K*薻& hL4!3"ا'{vFu4FSgZXhܚGC4[WF߬7ZO?I#Xk+XnǰRd‡+K *cqâIktJC>D6#r#YfW8 Udc 5Yu9h;mcȪ B&ZWitݠdSNcA2\͠JGkAL3//Bf׋":5URg llCysonfՏGBg*X:>lOۆ1 uVir$Ÿswg-:UPfj2;d(A~j%E: ys݊QI`:.dy37{*lh}"͏&Lmi>D3Fu&&eMP7C Ht)3-4ʯ64H5zrV,#u U]6d].9KO̲'BٟQ~] Yޱ$es܎ dj I-^fdI*nZ" v3kv2yhIfpn/46mVk6V9 uhč#'vVcReM +:XO( e4ŭϬ%fJ!N=^D Eg.fsd \ tWqyW;NwժsMa:wc!xL5hGARovK> 9.*)9jqb&1KɃUjar^XOgUhnHbJ<2 p:ts&=!"oKhy$ L^U::G @ʥ UʃRY8_O}e3B>`$MEsAҦ:# ZU'v鵯)[Vʇ3koG >Ö1bDWWYj.51eT7S8^Icys\褋[gvv]RYiE*f@dqޔbfi+&] X|4BX]tjvMF 6_01BbʠJvSeH{5rP[@:+Ce!oXC9'Zϸ\ƺ;VkM?ʧef7(vs0g%2p0=rgdf{7@ñj9PZEC$sFGdp&*59cGfcPtQa3W8m[ =xUu972PI{@{ &uC*V&*JQoܸqJ (raV$3|nuY74VZcQ 66fȟ"}S{ s[1OG`@*+ʈ(*A3=elλ~ɝѕx|;7Z+bK =~!wf}hlS߷Go.*sZrg J}r ?WTW Ԙ.ikmWݨEu7ʏ5_?Di h-$8jJlF>y%3u3ӭ7똣 %mJf7e*6ˌrU핆y%3AyprsȷZ9ڵ9IXҝ"5jQ6JX]"7$ܵSDq{^In~񆟻:x13w]|v>tޫ^{uZ+%cv `'/›yHQXPei/g%'C9W6ٞ(AX~4VNo̩շW/w6`w'#39]~|Dg90A)V晻io'ꖒ ]'cf|v85qff>̲cюQH?ԠMNƝfW6{z|j /qRb[SEM/rKWd:<:5_=(nu Jgce]{y~yw7h+}^:忻2D2pH[]:* ;7Vwg)CE̟xFIo9S>-cOo۽`I Wˏ\Eւ{r7SUO@NSYE:n#iԶ=Wn6lC*fئggNx7׎,YA9ӁHIwn{^q_a oL݇aK h8BW̿a FC)r7-r,`pMmv؅)/ 6.ͅ7g7'nz+=HVcV`>$D~$+>wKS=.tfq gcA8'r/wcE2RQ{ 9 A_qulqCII3+hv_9݃Hz c=t7_$"R&jMrnW8-2ʾo D*ͷPgv١dY)%-,|$něI{fΡ梿6K{MpnJ6+wsYvQm^.jOȝY U9EO`'g" 6:Bw@f7"/jQ>1 hNJd@FBr& Ua;nupt7s6H8 :5H6+soy@LȆL7{ &q|_03KA{8+혆[Ynx eB'mv߮$Cgt||3 3nfYrE1AJ.ΩϜ!AZ[(J TZn_ĥ<|ӗؐdK涛É+>Br5_䤷h8^e!Ʉ݁9585g O[*8h$I}|s1!9,ehD0!ks%}&; %fI"wZ⭐g,w҆cxWٵ!C65{sev*?WTNYh}.$wT60gLօ`üCi/mu;fĬCj:B+ZNHx>,yNWSyOBx$E.x&`㰅A.7#~ɔ_Rs{2,ȷ.T1yBv]-nf}'B6j |_R~s"/[C\tl%j!|m e/=](:65)Ǫ-FY뎼9?/p9e0 tk79zQbe7sSܬVYQ#8琻 5ʝyq$%og̟x#ulxQ<96i=c0֮)re^{P442CL-9Tied< P[2+VOd {1znljN7+f8{ST2ԋNAL%rU7dGȊ2B'6,CX*gu~L?갲#X͢Zب7J}S>ڵ]6V:jNS/ :`Qak3̗7;:}/|,/O1sIRBZxg3D.*rזahV_GeI-y + 촸U:H@b|@h̛ s@`9͍Va](wxqEu: cϜ m[070vD*P G#)t6dkeW5 Z6hs)IcU(ΛǷQ0>͉rGsrNq<ۼ B0$$wT:}cCg&sLڄY4Id#t+Pۢ_Ȼx/g([ D%gEe@%+D]y[7ƒEv6j+;PFҾ{@17@BCB8V عu\VRdvMVmڊ+ 8a:R=h6U YAxV\ٞ7x
*'4$-{ǣe73rZn!Zys@g}v~@/u{,~킬YL%KSIB(nzl1&c=jTKެhiuMfR'놉6xs[ xgVCfhqiuȨMp܀gF3(Kp`n`!)˃4]lςA(u ]8Hƞfb* f1@q7#oȝ0u?Y$ -12̟4恭 /!'3TG AiĻIa;&L5iyx@v3ap]#}/HYC*sp@zeΝYIrN="~gF#n`0iԺJlϕwV56]uʦ>KT*X ld +ש7V]6烀\՟kc6} :Dav]%kLv@{] O@ٶ2n}s666K9$G2?b΋7t^{ŋ'qFքx+W]C:L ʲe8MtbklCeV M6a[LBSj>ܫMtDiGr!Yʒ )/sÊ=+65S0y쪠Dd6Qi(7BZ͎Mr>UZc|ouLyKK(83,ɜ1 7Fw&mgni̛]ou$Fs5C.OlnVu^u Zj+4\#T3baƣ/vϰ'S40I(g:6G9bKYE@ YkE-TYNDu=%Ԡ ȐAqnMŅ\Oૉ[#qcks:m( 'f%5U ~P¡S9Y:n(B9ƝЖWs95Gb]Ș(:AsR0g ['ALV.DbRa`]v`?xcL,wM/w8C #'G0Qg?Mr 4*=9@ /LdEa_4l_˸MWP((%&6 Ea:84]/p>v*h<{kDxs*0E,njuaz0%F 7GSa%wLyLӘ513%#K1Ai'NAAXOx3dY`X6%l91okN7T YʆO[hV溦%h!OC3ah-n> 7?D)`Y4l$ oDiCFJ(_QIX's[ǗsrGH> ut$>6on`߹9c |[;+ND@ ~SBn> hSM$zne--rG?8ibqL.[4uiq]7w;Pa6W1 gəc tDV ,&77m. aˏ ??bNowo5eGNCLΒ*DI9u^'gg3Ӈ><=fA{6-vMVl ژڶ7?*ҦI Mծz |neʕ5kbfRs?vJ'Ͽ!"'ϟZ:l}Dseӑ%L3#kSA:6URieobUO|vw?^O1ۀ +gsA7ҕab |75x]7ElYE588)8 xQoCl\؏7(u7ݱoƎ l &?MuM|_JMyϛ.e}(dFGk'`cם>rw ndrs2qҍ>DԚ?o%-RCrjɯRwNHg@\ohRǎct6Jf+2L͞O0Dlq( vFm-Xi0臽aeh_7 IѮ8W`RoF\2j8o>ٝm̝ ]W-8Θ%`"x}h69>wYcC{TVfq^5Yj]ӱYMU96agr\AE,94f;SzDH9 2} 6# "ʎ 78UY>J r^Eٶ BQWPOW!֫N=6E,tNe(1]e7 "}OBNɩ<9`1@1ب@R }جN\n]l5dp -Z/\2"S= JuOzys[b"Q겂z}?tI>:XA7T J @'sjSg0&Z`>ItUM`&0c34E\t8CcVVu a5ق m. أeV0 0aS'UNuyo)<#QQcI%ZX24X74G *Lb)#Jϗ|qh7q3s * [MŹ^1pY˛oݨ*G6v -Z h{kXTxqC`|7_"M ]RIJ4zS02R"WvRA^7ugPñ-sBWAz5,) !h.`}q?n}(rh9X B٣ftCd#ly3KNg 4շ[jS zDMF|^Z:"H~ÆUbر#e~SnN<^ ܿocכ>yi{.f v  M MNtMi8v~wijbaW2=R^Izc8l T^X*c0]<98ApS$d~ oL]{X=,hYJgMLiϤ5ܮJL$l*CNțaΠGܯh&\(0("mP!3ȅ,Wx X>:;5p>,rЈ:o*[ lQN΃XPE^lIOA5L]w!aZe^E]u[5adfh wyP}btg gb֍ҪӃoJ痸(IAX]tnؐ7n6RqeI96ѧ!** }[͉{r@%~.tNZg~(5M[igRKq5f]pk/xXրTÖbkN0m=)ac!fl!YiCAf:`WrL;]%>ô){7wZ_/Pg~kɵIT5[؆-lEk)&PnZg@eK}sK9 w_vh^{oL}B^I0:K GaY;MᗲMq&co_R_W'.->/31 ȃk#Vv.̛;;,SA bHBGorմSvfn9?U2/ uBi=?>7jto&l˜=}鍻.:D~E}TQGmhㅾs6:rI/TrPRCZBi_C&%<}1@}F=8RS9"?y1A(;J'V'csS> v`}WJEMqSX) WY@gm"ym 郂xC|jb<W#X;GN1 ..% :=N#&a8:Ch:~CF`56@qՋ߳d}79gě 2jďWc(os1 ojB!v\1L1Mm/_) ~X3[?O4_O\3/KEx9jjWwZt=I[ ,NDqjxJ!/~ӗ:GA:@rWB[&[ݦ*Af[#6 3ƚh<%NOΈk>3o|Z2Ec>ld]E4t7[J.40cIJNxv Be7?MVWWVԎ57f_΍l#W2\ԦT#ws8ڽ=?[?ruvOףAY:Ut m sN\/:Q)쩷RBǩ5Ts(]C`nI3{o8j^uvͭTj 4V  7wf+ƎQRD:-3yx:7#pĿNfh5E`j{W8Ҩ@OøY3Iרgf*L}c\Ж,;k)敎gFg@1dQyʷʤYtzXq ҕD}w2;!{3T]]F=8;i ϕL88_]5bKn8 գ3Y=0 5k0yGf]a%}8/@C|3Y4{)E;p-h.ݵ#Dvx-ml;,O:B_/sO{6?,A`KMXn]pUÛ12o l>;{{$`f_Q3xx;o'!y|n{yCtxUY`2v'KA;X˯_|t,yvm)ujh5HVJ3qP=pt_Lr9ǯ^)|Ϟ5{/>O')g<*=Rj4.-\0h)ZM*4n!ODۃ[ɿMF l`yS0DN) ~>+;ggj6K=k7fB 1TfYk۞_Ț^?HXC4\KC,oRߐ9+Pk|3ߛM~9N}cNl}M;۷C'?9~Y1$X_$1Lg}_KC67Bs<4vn,V[ĔZh[kYJOGs$>c{.Ja{>.7<1ҬWQdp%)kϛ]_#z vme8N[יmxMk(kqc/"}0@w>2J |t*Z,-H˟RW-"Fp~W#_C|3>UX?ؠBxWr{&ozpɬM #l0/g+Kمgo/OɧA0*E'[Syp7Qd]UelhÂM6}ڐ3_>O"I nPHWrx0#zjow3ؚ/o~eƳ79Z fm]GP4ԇ9}$1vF2p1EM>bM(6k#F0*+86݉Q6u#W/0}xh6(x(L& H%ɐ,]tEǪ+7ջ]//%r6rW別j((Ü41 ~5ġJ$gcslMz#'gtQ. BPȂb$Q+P8*"םMj IcjgQnmyx::k>Wrt  MPC2-ihKީM>_>|^Qd@L{uJlV^`{prrcjK$ =ԩru7`~ZbTB܏W㬞] Td}GNపNXe+SlC{Ɵ7A]ۦ &mu^7&bwj-he 3 YÐfmOě]~jk}~*ʏCNC!Zayĝ=XЀ4Ɖ'L۩\.S{[l7J#:Fُ[ʦm|(nEKpF`a0i3o DMR?z{}>M\^X}f8!p [е |*Lwo! >i| wU0rU`r,[c=ςEK$1`f..4H["?HU=ĝ6h#9Ǒr8I*!_H8_bJ5H: ɽH_ultaK;?*m#"V%ÁːSNha)U,}YOBd-ۋFo2fp(Uo/^l"'bAqrIH휳'@c'vh,WEb8NH^rζ:HUבl]MU=)q ɝy'8ȕK`e8J]]kd5Ov.C'8XKȯ'HgaW{tpf2犝2#"9;Q=l:?nL1Dp]@@8:6?$ NĶ8 )\1"8_@Z}3IpDU7lP)C8,b q ȽaeN;TKT\h+\=gzUf(!@oo$k(ޱҫ荆2=Ұ3FNTfߓ՚^sI|WD4Oe YTф +~ҕΛO=q C.cp'V^>12WP'nU8d؜,җERyt) +0d4^p"B**!+_q&P~&\NNXш]я p\y_SWPgDl -(!ݞHRÂE!hLU#G鄚}6 A,o 숤 {n* ک5Ъ2S!U[9 ppva; Cʹ0/ߌ8iH$wp'I7}_@8f(^mxA"Js拟'1s>q7 y+<7(toґ,˴K4!H/½ֈ9=hJf&vDaaS++–~H"] q tzj&%bWs]C%z: )k@l1ەqwŹbVBeU/9`\ "78͝n_ܺ~_U97 -#E a75w!6eJ A_1:tu9nJY5z e:T"b6)l80mz*qeEov=TFN_gj*”rݿ+o+9Sn!;URIf'|o.:_E0M7#xt7N0t9Ĕ2iߊYC:r h(uW1*+0K`L٧: BGd#$FA ngc6 S]KиݠWg hY݊[ YY#^ǾWD~I8I0O bB!A.pN1t,EU 蓿YtVEy s!osP1A5{Bliz0m Gb.PXr 7neX档O: .v+T#b*!'-%޾m0E4YK7V/>G?xGͽ l[棴ཡ="^5?7soYz D472䝀fs%x\˱RUFySbStc0|o6bƎdPV= lncw }xώ.z) YYn3F&.&_,/*,/g)_͡SCы3\C'gU,\E xGmY?jQMr4D90АXߠ l!6ΗhMsԺV7»Bò\L0xH#/h1Nw`+Nx`ێ\iۏ%'6ޤ37>uɱ3=z)muE[x߽rLnlŘxi-^-)`CTp:yB5EY49Nl~ zߪ*rWc;ݙmBdzS]Z@!+]o!H|v}?ю.i`Bے0Dӟ{6OB+E;WT˕H0eLjUP?K+~*D^5dRէJh*:pA[});}ޓxQxT3:E3H-, >s72G s+6q&<6]rl,,}lIqϑ8ó}P»L,"'w["ݒE>_j1̃.ePuҤ1!ZU*^DM &5D`asPHZ<9Ubˉ=F\oo2(xt&ObcAHG0@G]!53)SlԖ?<.P}C=mGΌXfC‚yMvR Î*^J\Mnݹ6fʫ6f8ag*-{LVw<9^,"-rH _t-e נ~YדR<\ئ=-t~p#Oއo#`Y&ٳڵf.HAwS \y$gX J$B&Q6i:\LJH;F!+9&|6ӭFzք͂ν'>5\obo[iE%pDʽUB>I &SpG{N/:;[z/hZL/*x;3 . ^Z״?Ύ<=LYj>OHxyFSaR jh>SBOa%9[}H|5#ߪﲲkdzPokb -"31Ԑɜ\0BΠqt2P| ;@K Wߙ|q`Ě1 C&( ǂ(gqNEY5)i䦹RG]K!9%^{ k~lXoPY50}+6۔ _񕍇~SrpC!pRȯԁ\։)Ө-f`fXP}Hoؿ#ͫ$ m`*أꓷp›гy$<5W~P<4`ؓ%^ ^MuT>ї'4#d+ Sᒷ^d` ϼ&ǛЅhi1 Iy.+d_[|U7^ùch =(OxvnH-r^>zas!`G[uvpP.3#^(R?OCfaj!{*pBp[~[6#o'c@zB\ss%ݺ/7]ёv{-! ~4G+a]s{U&U_#12>ͭri3NmJڟͻ$IJvJ-yn><%s9<5T9l ,#zn죣#w%)hWz:7q0L$UPTn?XΌ1cͶ.)<;Vcn?Gcopr}9SKɼ]؄if!pHKZE]U]K0 }J{Gv ҰYV0~89wPKڟ]C'sR:6fRTD05p,rN ZsޡF;R=rU[D*ᔵl'ًpڜ=_ T!GyR\,w=yp )c_N]!E6<ᨘ "˭!HC?]-RRxIj.cIaJHf/[܈ȇwqM.ڀ\OE>h:樟eA1gg/yz%R3&i H~㫒hG26Wo=IceCZ~\.Pth%@\Wk\ Q_irďN*\B98 4qp#\˹ s5h%<֨Yˇ8rTȻriuse0-^kQ#{FyrYb ݼPM`J% *')v[޿%}q 5^|d  7ywLߚYL:?9BRn}ɀMrcؾ1;Ax+MLK`*׍*{{}$p6f/ȫrs㫜É\ڶv=k)GſUvXMǬgW=t -^4 x,vJO%prwR=%' Oj-U KB\X?1ˆYZhuPQ:9#,0)3$qXsШxIVCcp,'ŲpN:K&CMH#xdr/ں'6ɍCwsۨRb^y>-9oh~G7F AfQaC68x2y#\h=ƌr8]K%SJxu]Oq)9|Q,Ռ!ؒ_RB f#=eg[޺gv}ɐMKa? UvaE gNet}Dv%=1?rDyH:UgBߦR;C빁kZEV?f࠶k[X4n(uتS74yUZ>'l~*դj{2Xiasn:dRpCίZ $,)nxhr8 o7s`–J+QBUG}agҽ*6IYm4L6M}8#ni?k˽7{pkRi%Rݓ!K,kϖ '\Bę̮Z]P .FխE[Khkڒr0أʯ!t>m:lNgDQL!bLR=4ycGw֗{gl^6 9Wվ%Ѯ055O˪# a(-)=v1lDY~]2 Kv+j #?l!9ߗ{^}Rp= [&K!>y6ۃ|]w?;s)pzG-;+n{W-aRUEIuo%Ll9faQ,l7{;Zb{ƹ.N1{~SW|S>#9*|KqI!"rJ\Uj ]r%O:t.@206T%|,.W컧B4K>K2sᤷAzSުKs|k]/z ,bXe^1?.Jέ,1}x[LtԙJ^9!ڻ]1N07))y7Pз=6BϤ:7ÙoY>NסBI/0+% k4~\8=l.A .&8wU.W7ІwCB]A 8~o[PO(Ñ{8 BV!=USNTڢq0|(%SyS3 ndLe8_Bjq8L&c)~_ }X)\8m4+pro[8;h1.D 91 KXG;?NԪIUX36f7Y\8mQn}5lT[R@M(%H/L'T>8Syuf70q>O *KˊǛWi}{asKg=+^y(b\'E"HڙΫy>݌~\2ZdUa}^f.zٸi.?lmES&oUڪ]}֩Yj[0B$@aa">5_";@YeXvͅ@ˋ7׮ojRn`Z3 hu~@AW}~oUڪ]mS^0e_:|;%Sq͕\BجW(kjRqg.,_;qWZt`G w"QSpp6ޤMJ#Kmc-ĥd)B780QbC·g;=b7(k47K581_|;e:LO,HH7c>#풏 P_6'.%Nypq f6eٸJ&lD/W][@\9o?;V Iq%nӗ#k"1`e*@BV7PrYrTW/$#(E*"dߦͣWI_ YK>%.7[М >$w#A6/̈́$ЃbtP,cDŽ`sy-M6e{XdU 9o]_SΛ-̵U6W 1GY$6Y$6&.%VĎ#'r=-}BVO9gro${Dߺ'MgdM9oX F--󦳩,Lr>Оk~$`ɶX(Wݓ&3dT"R9If0wr> ]Osd{Xd!\֡BG.I/]\Yn/ϊa-5nq}9\UntOڮߺ:'tVgρދ/$U_l^!ifƜ(T0Bq=QjGv ss#j?lB&g!}ge/brZOkRG(A wPkdсne+W 58K֗5 TJut׌Bf\ETb"Eymt4ȗhsmwŭ@^5qݿ:6ݫpr*6Kjp`NX׶xk5onz/ʾTؼ簗*lˏkZ2T`mIhoN8bM*J I |2ZOZSeR 4O<[HݓϫP妘70Lv'{sWX:\#`!bNc ˦%6L؜5!" yG~=k1ll}F HrRᑧM5ɵgD{%F٠U@<#&|Gۃ^s(by8l#9!Ǧo.擑4.^"% ݛ$6_`؜ɅWuZ[cAxs侨Zd6f{$ݧ%S܆ͣgjS^ڹrd{.o/?zǾWvy4x2W!D~v&k;ƣϹ:O#uzlY'ؐ9!ӈ#gl9ꞐZZBrAv6ڭVE/OCzIgB %Bru<#/6. }@uO=ph-픬g2o}B&6f+=ii[D/)v.*d͠*90c͠*ʢvC6l,.+~Dž̓*H.Z'3- aJAKOeё}6ڭRYt9[rHv+fXC5G#W:͑#Z]&oqQlZx}=qW#jd_ ;[OlMN*ԝ Fȉ}:Q(Wyq\ ĊQD[9|vPXYBDTW!j/*srsQ6N6wг~6:Ls${"HR.°NW, ,-9S7'l6| lO<6(g!+O/pmN${ZsB8);}Zs(IR-{f}V?ע8k[קRrF%+R#,`k`sS $thGL.1>9%4Ge@,Ju)<,RHQE=[f:{B3Y\ ;`Z%pTXy->C,GVA!eQaowChM1_e2A ]8ʺ'yL<-~I憺'\ S=8%76縧k~S'UW)L< ~IQ`E^>;z?] L:Hɫy;%G̈́s(B>FG;ک6V>āi=?h?Qẅ́ͣU>61DGA6ѐ;'B6EuG^/=~p{%B1#вJȍ˨w3a⴩7eQ~p 9f'WĞ.}Q7'wQ"w3aթW0(f*5T䣸BΫnAF>9tΛyS!tw})"nʴ(xK=>K=z%> *)uO]f+bV]ќ7ރ. oOCUC{LCV HmIu`'Tǝ!f< uey侼{W&%XuOfgjc)F&}WmCa R9oNH“=ʕY>դ \csب}^j l) !7qFa+3]d \ΩS/:SsSЋ,^;wt3w@fyC{7aT1w>L$N]6,SUS|NJ/jl>)saZ%.bxkuv%x!ȢTYm+ \9^Lo '2D cBI7G=WQ^ ]>R /sɽ{|KPI~QIuh$9ԭ?&>G_8I^~νpSyAL8s&2pٹ2~l}Z"X;EIE<@6! lԾkyӥחNVwy5TQLjG=x!b 'sS 9u;C0o~wz+јyx m?fSGd9ܐ դ"(MJa+uz~r jfO&͒:{R|NP~* RZs=G(B6:g©N>Ťw0%|»QgJ< < ofcΎ79{}M82Sk&>sEcc+7mwWg*q8u*n9a((,8Kx∜|X%O{.ɜg_˽ `>¹/|\/o&t染D 8Lfx3dPD Yg&>[lIXj㚖 ,JFsHFI 9(RPtAb98|G *֗{6;)Lϑә|g>GL|,q0:9Èإ&9g5`@M<-zqxIج V v a(,JFk8 ^6q yPG姠VpJJ!,R 9s9֗{٧o&9ŞgF v c3es9s#p5`6346W!$Uċ,JFk?TmYϴ2˽C|NEw3Zi.TEHGNYowCD^'K߿v]HOK5߁(X Y$ls7Sٕ[Q*rEl5|[-ԤZvroR FK06ɿμK?⶝|Bpo{o'OoNEb 'P"6kR*Dt%&l΋͍rGD,],qxҋvG'k¦vo^Þiz]Zdu_Z{_`$|/'k'?%AGoi|t7wx/ 58?5~A4tɹ}}H0L#ltuigȄ yKk\sɩ%]XnF9qLr;>%G\w:mLʹo;'98Yݵ_j[ )qЂ9Lgl`k 6_UTm-_\GڈRq 0$>3c5*4,- yΞ5[+w,x2hSM*K]Iu5jR!:[ M܅7Gs)֗{MP.H)u8s*:ΰq6cW( 5kl(!6Ic*U։mI}ڛWK58Qs.Kַnҡ&ӭ+zVOk~,,Y4o]> g3pX]5א7r|u յyB8/6IuTԤRl5a32[F/93x3-2$+*Wʶ@ p+..pg86 V%XoNI%}>J0Z7j8+76![1DŽMA+kRQ:ЊTyKJm0/ԄfJ t}=e>w ojf,;x.eip`~}TRه&ߌTKʽ&o;ێ>WYvP2ŧ@ԑŧbU!UO36:!psq˶&@* ͖NmH K洚TRg'2 j2/ۏ7?n!ܛkRXjR,դv\]$yK;+O=35_|*+6j{e <>ofF!PQPeX  #E[ofe GS9y޷&իX,DI)I3Zŧʉ+%92C4lS,b`sFf,fmaqVFB cI4OTvPgv q! Kx*6)֤>2˽[M*ԚTu-\WEŧJE\lŧ2asgYm> )(s/pD)Fe47~`10 m[V i=Uqy\M*C+qydanrWMf.5x]JV}tfnI%:))q9.> ;}4Ȫ}A{ܙ@9HuOkk,T̥͌h4=`vOT$f\( jR5g#{!8g`LT|jOLf3Q6ys;ص㛑GCan-m<)If>Btb8Fv4u/kkR5gI4lKtEo2-gDes er&LOXg[F3W ysXlNSNr5Zfy@"6w;iA-|ICi@cPXFͼKmQsa1ǢYmt֩S=FjR5gI=>Zd> c|sIJ @id=@pv*U\6:pp֫S/FkRR ŭs& M9nUdPs};]7 %"IŔN=*7lBA5'\Ymt'Ҁ0;M RjRפ=o*2<eoH#EVimx䋧?³S/Ls,?8у̧b/<9y^G>M}yz 'UF{r~vχ/l` (}mf-2Hij|fr_dTR\XT}Wno 6&!4?}n{ae#Yo%b|T!EFIT;|rč\Ăm0fC Mw>>M |бY1ׇ|@?֗{o>L<.3*H˫Օ6]MŤT0h{lpMn/!vq_~]]_4=@3tP,9pZA1}|0(#:#ά<bs6+7od ~Eؘ7Tp6 k{r`ЌqKR]4SmT3wݓ:jf@M2!@!=!< &D.DQ:bvdɏ{ąR-l!==k-G[C56Wi=Dӆ;y:Xzz3a*JWi6IMBB*ÈȎ #xs#\Z[jl <{ŧA|OW?Ru3VRaUڕ*<جWRI]Rd ˖s9sim*6Wf #}c762>Ы6f= C}$iBRU{~ 9h{RpahXB9_W*jxGfg\h)r_@p+6.Llرp3Wo.:67:gݓW42È|G}Ⱦ {+RnRfĎ@sywEFe]dhℽ?~$UY_.8p!ܳt(/޼/pBI{]x~HDs潼s~#y`0]@'U FjZT8a6fUSM_SFOc< l.= .ge'3"{㣼9'H^`ԢL،i3,r;onx B2aF)vrYq-+/oTEERrm/8PT"vV*>:=hM\Y ۬3x[_SFQ'F'bD+CX , wq/'PN~rZW󷾍v.gi 9卽uro7@osG*&Yj L%aOsÂBRmFYNT6ڭ٢"]E.9EJHe.f>Ymnwܛ48(ƅ?R1)SRN C6WfLK.U~9KA9AᒻiŇP{x$;Tjmy 4tYu *){Xf kYC7b &OqpgPR~ 6Ctdc[_)<2?g8fOhywG*&I gT(B2H^9Ft~?ON|^+߸'lQT_ro5DN1JӠiO(R1).kRaDx30PdÄIc?i+K9X 9r0,\8c9Yzas[V"ݴi #s& TZwGnKޓBM*Ir  &Im4͍j6*\WD C5/I+GnggY #I C/' %k>̵8 OֶR9Nolx3>THz3/SaUڕ*l&ls3iEr`PpI Id.hݴ٦y֮yf4ÿ~k4FunWs=AUᐪc_ӊ,YFKӰY?[ݴk1FTLUUᗩ0U&[@IU{1% F27-Bz/S\ջi7׉aUTLU +랤ܸOQRy|"Knf>LrxZDl{$H!~ZofGЋ%*U~Hͫ@X%VogT/K؂u=K=~$wWA3B#\E m1+2r-L5Mz7yKаYIEMcpRet~O-դ1[SU[/\NI,<6Z0;Sga.TVpo6Zq#[˽/Vf5M6Z^fe8xxś@X.+}{`:/~8sUR!1>S7q|Qy#OBS/}3cNv8)N=dB|I|Uyl}&T}IE_RUeYh-Vo}7iP_E +Im,X'B7]Aѯ?T8'=IKa߽vfXSaI#e\R=9ypl(ZPE\fՅxIEq甃SpͻhHЂ7Ku_VYs8,?\ݔD>{DUe~˽9NbynӢz_ Z&w(&)Փ)ě &"v*9!%Jh4E:)]rč5~n?l^%w7sD^8+OyRqܲ{voKz] NܽltʽN g&;ԇ5y*T.ޑ75 K XyQ q(? gzF^m{?Fp3,+t[fTPaMe,TeS8\[{tH~'TU٥ i#H;kDHM*7b>Ԛh/O8?ڕ+qjJ*T&2,4`Bn Sa$d?>8]++V}$jӐ:f\P\+mKUڤKfUT SIF)AN,$C,T\W"e-)ؕ0r [v6[kRiWh4d5%eD9=OWO͈;ByUHuZX1Z*lo7g8RM*4q Qd'Iƾ==2cNL2])}nn~c¾B}kZCe\z;ӉV<=mXT2Dƀ8 T{T_}{7{F56v{gъ1Mߜ2ɛz.:A2-藜CWAVq #^.G sGm;kGlBVҼqh}7[g<6Z;&;i7k-97mӷ %gy l7ǽatde o?݄%. 8Wow|C#$x=]z[_SݓmM.6Z ;)OߞܩL 8դP;on[ O7=_^Rh~/֗o.j_Cl疺'2i{ mio}7 ڵCKŤK4uUI U#R~h*i~z_ Viǭo$(s[rdH!QwБYc˽7?s91Q{֘IJZ^iPޜMlx&s.?mD}n{"(*Ǹz~sT5Y[_樯/lVg7k죠ZbXƛsŘFGSחY^疺'XEp0 #8X߉^cg,N3ܛy3@&D^72U7S"1NcM3`ܼ9_}~?Oæ-qP.gA^6 ;jM{C꣭/87Ⓔ\2lٛ\bBKQ&UcK0Ĕ.ux34!5nXҤB zR|NK53H!98cga{asm>.Q5NKŜBiP0'PSݓ mi0ɟKц8ЄAE>sMC, w(#9DZyX]ϐErMKu < ǫǂ-LțpP҄8`c9B$g)}6{dmOrAoB賑Իihܿ]]`\KCl0iP6F}4+"%M^rAR @2~eNr9&sH&#Bgw(4yCuvj1)#V/FG*4l֫WH ٭( Bxe%G}n|tedѪ ChzWUyE-OvyR4? ,M5Y^W;[>z7o^.\6ZNR*\pg8G鵷 $ b{^dyAxݴi,KPz2LkSMBقO8T5-Sc rУěǮyl~&IEXʌ͍r_p,΄ViBSS@/3fmX9>R5^ΓʚT\S{\|HStrdPrxsu'!'&eYIu53"Iq_YQ|ꙠԄ͍p0=ANuԄyDoi亳3)F޷(Gu|:/6kRqv1m nqrԙr%$(*>kS6&}B6ZQC ]X|on{UFIŤTg(Wj쵩6+U\Jb̂X#U,ԄͽY>TG[tX%ې0Vp΅/9{"=%xc*bRw:-ao7o%y9g_rfC6T5vl}&^,dN牓;QXZw~/X' ʑ2(B:}֗{'-@DdJ2(AZK2J*&GbY#TExNÄM>+Ւ[+c+He?D&B5>ʕNȫ!E4 vk+%f{"_vJ.fA9H12JnK3>ÊuO RgeΪy1͌wxÄܜWKpYUl Xu}' 񩞎A{; U(LANZ#ʽ)KE֞OC랠`c~c~:LeTLU6 +3R.;,4A-GEп{r~j?w96*m[cCM+s8N9I)$dA?rk1Tf %(Prh@N^^2J*&G.^oSaUڕl!jRprfu&7wYfY'db%Fʿ*ҮTy՝fzRuי[^QLTXߜT>_*m~'R;j'bsm܂ )E,徼 9.>" :.F9vl{ÅmTo:n2Wg{c-o[;]6U7;]48͈!ݓrcXLȯx1YdA!l*D1 'U2Ϲ(W=N#W_^'U7S*u cBܿIDZ\C%=|,<7._ Ȯwr=.Vrw1*cE6ǮYm"vGݓ8߂wqV%4eh$b`sf8~|YK_ygdr2ȷ"ź/*ڧ1oDhZ^/\ov˖gn@ꅃ+Vs.PIZBJ`ER= 'wF{G{@{{Szm7GMN6ZK{BX2, [&oHe@I\o~\$>@1Al4Ř:7ܧTI)e'܆gduc uO8fXtȷ@4ˏkZs9"Ѳ)!S1 5Honx'YMC_ȄͪDر'j$g/=\Esvi&l5ٺ }r4PYG3h\K{BS,-HT)7PsAd+Y M|^[WoJN]sɽI=AO/Ѕ'H'X xf-֤{b9o~C&rtBݓ.Y9[Fe/}VD}8hOVܛ"\͋S1)U5|hͻGІmWGlU>vT}[D}ȭt[_TeBŚT5uOP+Hnftֲ9fprOMN]e{u|N')!L;fF E [JTXHIU[p@EnSg!6Ft~6:8 }6~ z֗{ o&0 -^l@ѣ?$lg{˜,#@լ>I>[Ιl6H[!PQ9ʽR=AYk(/ٮ͜j~J}끩fUri~ B^{"18:hښu흰=#H{ͽ/ȾAWHS?UUo=Al ZS!^engv3./b=0U73cs1N峝67c[WDpZuBh.ml[=sRFHfMYBX9E0._ؼ0%k6:v序4m+!_+P_*#>VN%wFqֻțyҼyR.FG7|n+8G[~'oC_@urOџQ#w3='#FZCxٻ@B=W|rgw̆x=woյ[}]lYeъe+&ڨ~mUBk=䒦H^bv\MUr/OԎQֻi,Wڿ=֭SKSFa`n`n=욵 D!su飹V|rƏěǮYm">m% 9bsuMOMN]ʽKG9[_y*Fk,@ǸZB_T0q( 4 j,6za}[_\n><=\"mq5yY۠84u o>E>C=<{"Lܦ#st9^gȄu QEI¦E!ͽe(wg op{~ZW4N]g[xm "Iߌ6uO.TlŪg8W>Ս\O`ù բ^U_TBЉ7j=HXEfylgc]M*gלXNcAnf[NZkiDPz}X^X#{7Y:M/L~{s96a b#gGW$Ȯ+{5p?gQ3R7?Kb$=웠3!<CxvvodsۏrA-<(9S=y^|4$ȗ]f}}dg>70uo&RC͍$Ivor)D6wD0".{l)@ǯK(\{`F˭/ϟ;&sˆr㛫h\_Yd}z%>FW n!ܫ3>z7;9xԡ>"12ۯ4=Hy3>AgKҲG*/wߦoe>~u{O uO$y SXX76ZD&~g@' :}ʋͥWK7^b(hGw(G|tcTQğ|Q0{T]ܩKE x8Gi>-FX' SH_6?=FEUq8>2х1ySnj>Sdz 'v\J5I7} C\Av=?ܻ~ H/لcW\6)OBbDX-n1E@l*nE&씰ddv!z&j %pW^ܗTljXgnuO f?mb܂L`3EsuI2" M`. *sY|2ADJܗUleVcyB0Z; l,BAKY⣯.;}uwas(!6k3ꞰUvV N@hm-qJ2^6ڭ[']ƨn}̳&\?$Im!!ˠ憺'Q˝]ʜSa7,PEs',Q'lnƤ!n[uƺ'* RD`}͕ҥ ǐ 7&Hr'H> " 2[Fn#o'J-l VdqbƻjĽ5lˠ'Ԟ<8gꞐH ̇+$ɧQ'GJFe^6?n!^cvZd.l^%O\+XL{ap›i +2Pd>HW<ؼRr6v{Udv:pOzbrv.̈́uRdcQeP2(4Mb|wϺ'͉r-=Q'6#Ի9'N q6:=.ifz~uOIhΌR#_ XISv/PKw3a mt1D]h=h>,յQ=f{j2^x ǮymcKQx'!uDvK y> . Lؼdk6_B'^uOͼ0'L=mJ L<e\6E_Z%/aTJ3:q-MTi/r9kUO8l_ B>͍ L<5k6^*TzPV /r_r[/ Лc}kRiF'~BŦ߷x" XsŪ$ϒU(Wַn>ҟ>asN&!6k+kR!8^wr`X zcŖqTcyַn3դB?yjOC72٥6MhscM$+ O eQv IѺ8-]򑡲@MFY5HA mC]TtFN\;nOlMN]ʽ&nʴk؟Osv'ۏj7A>n^38?ϣwG'{vd̾}U[n],?*UwFGNU~v^꧚jRhg%;my|g%LЗݯ(HWh`"lVR4$YKKiKRE}9Z.>'.a3"iwmߏ )=%'7w*N0yԝ'&hJM_oM;s\/Qe-Hr@7#;9R]귀W_DӐ019rp-7v_ܗS|`}O@>R7?@}gGƏo7B;=̼|:/M}:5|]e.Hl^ę6T .ͻңče1j (M`iE9ߪ\[<9_~""U>[ q:ةPf۸O>Ÿmȇ_Y|;:xD@cہo@5B~uOh 3]Z~6ZCG#=٨] 8񶷓 "6R`"D2KQ^̾"g.R˩E֌&[[߽~+lp7!y9{w~L>G6(fxq{;z_ՅuO:e-6sBL{hE{B\77sch Fٻƭz1~D ot3qZ:E CG[O~']g2h' )1 Bل'漚IzS||N^ xL~b8 nr`<*タ(.*3i>3#|n^,WI[ &&R^ oRdVlneSueɨ_b'_:sx3#m뷑:׃8fh?I|3N l?C`<oܼo8 ެ;@c\I-F)x`)PHIyZ*p=T=?{,⊝Lz~l98''2|︅c8yB83P{[PD;hNIauO/ -Y}\I'/_>&^sv9)eOHq⊣q4b'c }{RnuOhO|}(soѡyYmWYyq \ٚ˞쪡 PS$Sdnl^%O\ DuOhvJ-f]6@^rggҬeO8|\Xb̋+% kN=g1c;lhS&n!H7KnqfYXBnʞHp~gH+Web's`ջu"'uc. d˙mt\eSY"S63+$s $=qpa )v26ɝFv%Nin&l^6&F4l{P&$+Zcr_'yTV̈́K2_X|[91 +\Zc#uY}ʞ$bsܹ埓6P̈́˲ߛFGCԵ_Dl[G-J"Aef/lNI@[HL<5k1DmT/X[͏x@H?`d\VWYom$wi*/ԻypYm1DcorRݓ(qqffоT99ҨIcw3afrhC2gޯdR3#.)KFKyE\8`$1h* %ߚI4 ̈́k|ߐFkr8Inn )v\g\?u}\uG#LؼDyl9(ȕ3/.@'Ifv9(3nD3NMzhl4ku_*5rux>T l>xe9W66kgTĎ}.o,'a${V^6ĝɓT{6:\ߧRVO5Wr/bGC皺&82hsΛ%Hv*XSO^ K ,dBtɐsXSնK?i_:ήOsnj>M_:#kj>S%3heM*^挼˕rdRx ymdčJ'ոIrқ7'&lF>-p֗{ě~7T=6Μ?~l/'5>vI3hM*IDN 1`f׼\D5'.# SH2yO9񶷣PRKIKxl}֩Lj)(eBԻ[*rcg` E61M6$tY13jRgÖeb{/E?4\s0EW*w"UqOn4)xMycWz{s7^EJ™6 0dbuVys:CNl>Zჹy{\5^˼ǿsVj"tfvJrbϼ/kWsC< ?'qPIcDW_杖SBTkw703{26բ"yĶZ ,a&lnbEo's`U]M*eXwnͣ'SΣhtT6,V,> bx<#j䏹8B`v<:9sga 6Ԥz\U"k@o9|9R[]6"tf(᠜>aU*{ş Ǜ|p+B@3fR4Ce \(1grx"ЪG>Ukg48%A~LOӁ%3e;3jqɞ=鷏FP , W L6W4[y/ 2?888l" etSGGX`h7=61T5| ?fwdH؄ {b?hNO砶y-z$Ҽө\Ofĵ|ӕ~vm/_J#[xj۵Om%&Gt)׼ 8771]+ęcu7Ff2f\CƄ_9#?un5_ hZSCxD$jaDŽ}y 6S/1%fT(Phxh= QԎqb|pjyl~W~K\Aq橷^+ z%zۮЛ>,B/KCkonav> "B ]:!ʐb!0 l>ӯ^>a+ {+MN~hE_~Мh^d/ >ҰyklKͯşG xͥL-. 0OYxscnbz ^,Z@G8o̎ofV,4951t1o:Oc^ƛ+ѯSD-J-%Csl^!:- VY#o~+S,pƙ9y3{?Ʈ<O$׌TzQp%MS4r6MD6q5BHj rC(hBHR"_9uIIHԲiB2)CkH cC}pZkgΐ{9s>s^k==~3S4:l~Sӯ2 xkM_&uVlbC>ԍ'1o6om!L&T f@Ioz|(2<վ":;pػ̲3t8|#CirS{6cӕEjht5+w_Mp-"y/PDǐ"Nb՟&6m` l o"YǤ7g6o,nқl@7}[€Ҝ3FpI/_{^DʯUS+0%ymI[Cʯ"sȡ2qȊ+򍽐.m4k"և`cx]\u&LqfdHH Ddzf-x)7;əNJn~ți9eC5'|WshuO0%V06oll+}2LZǗ yğ'gMohWlyPdYV0(áA_9HE:.VͱO+{/[l|7{`6-v (,~`pbbO'їޖYup64t"8 5,8C]l}ժ{jDR&.񆌼 Ꞑ2ӌ&{~8Q랄d(7*6{i$ Ǜ%sY gCc-) ,fK GReQ5 Z0+0s:uOF% 弡Sͱ_μƵ=?^Fu|HO;z\QDknkeepVh.@gD/ s҆_^rυ] 9N#t=ͺ:uOFꜺrU Z$-ugٱڸF坡M琣zNݓ`m&F*)+!NM7Kf}Dg }b΢=Ihbt`0]Mvf?פTe#o�|5vzkFP#vRbO ^wV|~~P㗞;[~ԣ[4=$%ۿ#F: 8S49ݭGæ97o|oh%Wg'Ȅ8:bYe5hzjR%rs?.ج|rt%I; :l.гgY@ p*UPQxmyNn2p&A|R h֢ yH |s@GճvvRm =?7;wF8e7Xg@qii\T6az}nBK͍y3Ił. v l#8T'o(ugf 䏋ϯdܷ] ׿|?z/`vߦ~jçzFD1e:o4݈짠Iy#!6ԉ!º'ёzrO}Ti3ܼ 0>ަp5MΙ3*ɮk=9,v]>|UQ%\,>0.EmZ 4ֽ̩A|o^@[7 ssHkt; gؠ9E^֨C]X 2_6+(,;iMlz榼Ћ h >THjs >bL#"*e @ *ܳXX7W8t'rE73o~{a&қ9I#ӳGَS<2f+|beP聙}t}h SrI\ѾT)Nt (Rb@".$fB߰#v}tސ:Xμ16W |Swq 4 &?!(ɛ 7Vo#MC(0;LDJ=vYlc%fJ+l;Y(H6Y6:lNtIzFB&v3 =bMEn=G^G|c5ĘS|?ܳZqq>wS97_!bē#`,꽫Xwƺj+q0U"8P'ʆf:,lyfsŁAC9&z 9B?̚Ƈ/?X wWvNGIϠtT0ެ~\g[8D()肉ܦ5s~vec9賒érsMasțڜIǑA/A)˭O봬^hϝ ۈi}oP7қ] m|J8 T:HZFSp~ vwui sfFH?4F?Îf9aSZJQ:*MIq{Pom?wW#|;WeNB98Vc %-"Pת&10wo)'[O\s)mA#'kM-V#(}:qCDg30 zs;+6W/+gB, p 'XHnt95!9NzD--\Aqnț'ߜ)]j4cݿ`WxG?p|H#qP``" -5xER,pwͤxlCZ/^IPg9,mx4mdz .cvVHo~ְybsPw\Ho6,l 2A<{N|9cźl1ߪl8sj͓gњTY~UW\qjW<*fSJ [N.f4`9361տ$Lni@3^\5wehΗ/94#O;,E>*h#ʉ86?w?pn7ON.ն;.u*֛(tʚs5 7kp[;rͬo> ȓ Q3$pyT tr'P6ya(Q8+ ɔW)!\Ef'ד*(-'Ʃ̛_@2{"4a3yn$/N 6H0 (73p]wÑ A=Z۝|Л_8]TMcs,;.b}SAo$s[f o|n~1_^VŽvzsAkRBM+\5fXC>P 4wϴe zT FfLail"`̢7k[}jj)TڇO8-l6#/ (s_$/ x"NsU#e縃 gQ?a4Of!^}/VFəlějR8%VJQ#9]M*~RCH냇a LdyaNPF33&,dV̛߾-ۃWV\Wŋyb7{>,v a0 ݗ9OˑkX)?獝\MxSas^3rh65tS-9@DBDcD27;ɅhIXvjƛհ]:}Tl.IE k=+/url%-z3E~4gdFaeތi3ŋD9H r?Mv5⬢-<Hs|rv#(kśK3¾Pv=MV&&Eꎋeµ@.oy4ȄW(wr^2l6YR @֩o4eyA7O>Da>,z8/Y;f^J>oCQ6ߢ7i5l"m`uhwg|/iX$[ٺ.ً>07g{dޜ՟&ՙ;HǢX/n؇[zκ"o?Yz9ZzCbх? `4EHq7V#j$֯6}l(mxͮKs]*߭MEosMl.IE,zv^ Li!-W. X7;lVuάE{|(ɳg0jH9aa制_aЀ07F_j\5C_դzۭZ|EoZz+o^@= u߻Jv̦"͝Xu^?L,w:V,4a7['NrMlդZ=fX`%^*F6K+=8Xfl;3@F˱<8D3L1lO,5nn+'D]T[y$_uEc}/]jB3Sz:)$Їa_ LZ3;Nxd^qq {vț clդ1td7ic;lVlNOЗ/WZZDE*jbفQF45֪֤:֤r^ouEOz3fϠϒa3ƒ3q^g2;ST25PFӐ Ѫ8'ՙKCꦣg 4eᣎ2;0If2#B%{Ziк}Z˸:z)xoYs]rΨ!Y𬷀y726gsv8XU%&5Sɽ\?Xo\/GT:3p~ 3Ĕq,Ԍ}t4  כ@ӄЦ6*zrǘLӨ{;lV|0Z\4 [TRb&2EP'aP~֐ PE,66~֍WJueH DO0M ':*OC vTGh 7wuO*xތ>Tc<xns\G 4f nWH:6\E&β܋$q"3TrS*.) %|ma> l3ǐ^l]>PȆ2e^U8/P9"zD{ a>f91*̲'x͆X߱L^AoTl4܆OzM|V6/].8X{6_ F nͤ$P&cb_=2%PBI44G:vP6aC؅±a /eN>2{FgTQ:lxݼ [3˞#gTfWd̟.^ φ,dq}ftw@Iy"౧t`g>X5WS"^s2QZaxk"v a3C_>䓯wg+H,Nb@%[b'U761ՍLͽGG!'&-t@bf$*]4Rpܛz/^W܁KT y1]9t\u2l or, `wz'ϥ}'m|I 󡃎9=gOc&sgγ/:TxNcfeڣs:Kr Sv2NO_mg ̨{Nuʞ1"g')vRݼ@4L3x3 'Ο/l V7Wo::wr/hN{7QhvOn>~dɭm <8%v`~ĿBzWx DZ[)W9SE[~{qSxuu^f<9~H\'Q|z+U> c*vR uP?7-X )ě{ |hlYJt<PS*#͠r£qfFfvOF,Ѕ9.6ONe压-^Fe 2L g sAMMugi<01Hm )9cqOh zolyaaмYҘtĽN)=GxMS f N[Sx}oE i>H0Ժ'N  `p)ȧhgZKѧֽkXw|83Cf-y YOMvMЬ ɱ,z濈|Zp]q-93&I]dHbg&-0IlC'~P_81KC F6TŊkZ<ЏO)΋ ׉[wĔQ'BϺU04ˬm "3]hBs6J9hww߄:0|9_otOyhӘAK@0b 'xa&:bM4y_^U046~k&#d?å 2|֬Nnu77# Ǩ 67E567{b}8.ow+>Z=RrHg痕6Igj}q:kXt5 ,4/.~W̚CuOY;/26s" ުS܎#v@Bv``ה7#*W)Gı3)G*3^9>٪9i-jdX" x'T+T䯠W^ٓa9Rp[D.MCsMvfhJVw~JoNsl֞tFݓZܧ͎}ͷb>!ذ*f H"Cr`޼ 8͛>4mY,=r,:ls>z'*Q}9o=ȵ ' G4%-b:x].?օH d>]Qf2<|W& .9\ tzczv"Yz9 yjHFp!5apQ'ܙ. |D%zI̐3C 4/-sdLměg8&Yn fҹ Ѹ< +Z3a6黟8͚2wYꮬ^uD[@қEMg (ďLBf9.`ɶ悺'oP@ P/6WBrd!FBgg箬f?,#SPӔIBnk+?=&}ݕ7v;bd=  9f@bJI}e'ͳC9f7:b6:4$5)l/Yv/̧!QF;g~m( eW!u׽cKL cW1 G $2cM]FKR*Ctܖ YRe4X wN9mZA=W "uh6&n HF\lYĊ׭v7M"~,?{,c1814W7͓iT8ǓIvYUT1KDYa ]Nd616ܺ\|b0CtU > &n!ctlQC;ƀ7rUY:l saJ&]wÞ2y3s LGF.g! l~Yrv 6 o|0HaKFv`5z/ 3 x_{ik}`[Rr#M*iUTwoěnMԠMhgF6͆Z>kx4koǛ9ee9 5zcJBo j;qľKtn~ZRw ̍as3r8,p]OSjdÔ0zPgㅧ9@׫鎗Â#UD=b$ZAY7of4ěm!v1(!Cly4 LOp86h]ZǚFjM9Ԝb7KErL "@+fhxjm$d>>WM#S>e6Ǵ+CyCഡtiW507S2;lf֜[UfP?v+ߪW͢;W~>ԧ!ٛ5vuC/s ^a?REͤi UQ݇ pqbsjnmvsw"/"N}Uՙ ;ں(UgZk8Л~/29'ylk 4 NTNfWb4Fshvkwz 8ȋT#N"B3$5OBjʺeR%/]:U0bf$3&P;WIwt=\hʷFY0,Pr%O)0dĈMrQ01d^vO|tvsB-_*͗y[7k0X5ԍ,*XA@Ұ87wrrya53D漜7RoI\o!/JjHN8Axt!LKX#E/mP:DIj+.o;TheŰ`~ߣ4c39fJ, N"KFʼO'8VkrsOC-܉N^.n} QAO\t҈7gNƣHجi$DNL2$f&Œ0D^&P)$"3x< )ث͢A6c#WR PF@,]-+u[rT 5;b^{"/Vcܪ QSEEĽRЋ ©uy )S?b7ŶTqFh1SM *:+!j垩z {-c_.:Nܰ[HӠHSxԩ ~#S;غ\gdGc]bH.*ЋZ;k7^H"r#/\P`ƛ'vhbd٩^*Jf5fVs&߁E,\؟>}8`)i弙j4~F<,Nu5&;yj(g }f+̛Qԝvs) ]7etެa4 HϒJ,8{cf՛<:7=!b3%pb&_jzP*9ɟyƒDկJVj H3[hhXFj}pJ c]'ʌ,Gi,lԏg)A*޳w?nĤ3Ky%)Ԡ\m*In 5O)|ߢgo\H3Kwkm~ 6o?2Ʌ ߛs~{d- EֳXI{:G{{<^Go2v`goΟ=w/{{aWVmibg6GL,~T` zrx'OccsX4dLIDjB9"tGsx3fa*%aOMjYd 24xv!Aw (Yxq?y!U! ъ~7hoZ0#oC̅M)G)z(m ,;(lF#]pAy /ʡ\*fcd3;IWLo>8 (:᥆9hwM&ßP1||~t?Ǵɘ*C >|`Ƞ;p9ۜJbljH$d)rFd 2h&JKH1X).ݭn*Cph%46eg}%K7C_ Uw`fw(moN،hyvKIkfm$rʙauƷu9.*z GkICl.R_NHv?+K[ hJ3<=fWtPXu'E~;Wo5\ޜ[#abb`BUY9ސfΩ!FV"8q:v'f=•S+iS# [# v.^= 9@|X-hEIk5$}gl-;*9[/a`/[I:}Ooڈ7#dzw؟AV/,h&qu]?>7 fʠ!z [nRoxGtx8ެ}J]000a(638PQN, ma?z4l[C3Q*I͌V P#Uj!yS* Ej ZzTc EGǛn6bvC֎QzKY3PIS i6g1R%>LpRb2,3BӛÞpSUhG\)U=2ՉpL>ާGfM˜" ) + tq dti6YỵcB >"is\|\yz3'1]F ;Ẃ[/).bj?®L'0fKX~yjzF If?nGj!/d H'vʺjr7k4QQHTt+Qm"7sF h0k㬓asSlN3킬1k23krf Ĭ7e{wICoҜi8}+G(7oC`dqmWw)|3{I24wH mI {bnEտ9oK,[6>]<9a7.#OHTc^'j\Yǐ,ToIoĉ"B(L]Ҩk&RXl+ZYhjN!W 8(|Ԍ?'$&fr!6 W5ڷ18;}pڷ5S(o8uU?+)L9 ihQfaOǺ!`}xؐ7O!=}42YMw 37SHY5v'yDwJnΖΉJlLjgy,7l(8]Q'?6h h C3z`\}T&r1 6~ <. S|VKKOphdITXuMKɴ5f✾c Fmacl>:a)S[ׁC)shjsd3n!@=[B3b$iǽ;كde&{;9T͓gyy5v3jRa5(OR=ʼٙ4Va $"c0gPG ǂNz?<9A+nP?CKo82DΙ9T\ _JAٚ)W\G[Rg̪9jxȫF7 =r-.Wce$ s.oƎ %/(x3CS83;ľ{{(uJhc1(mUjS_`vJvѝcLӘ ?C$l?W!IEMf;&E8$פBUz*>Q~@nș1(!"#^#F­g?.}^]ޜgTwpێk6IJ}'**ߪZ_Ak_tΔW31gpߔMEnS}< B@z+ ΁C C]?GgMPˀ[,n{1}XFoLM mVS''%~I$~:8sV*=?Le9q%JN;~AWPS%4/j9&QЇRЉ]*fisʉBCw36Cy}l*(rBqAdHl4uZot:BXNu~fJ9G-eeCA$zqW%#i \H89%enK@k$ճhț|?~W3)OԤڍp+թNU[ذ0jR* Fx/xݟ827Ԃ|uU8ج2˟S2:;.f: I5'*ZKR\|;; :8E|lkF{B0ʄy THj\@Xp3g fpczc5 5߽ֆʐN?6[k9L7YDDt(̈3܄̴feA0ɟM#?'jR]u5/:>zYnv0_?Kɲ9|Q'6m29ec]B4 7pVB fԦ kE$*։"z spRӕۗK!ִج, 5bC<&lk鰹V]eSP967kIE} T;­d!צ#R57t~L6m-M5IY& ʒEs!*TPKFF4+ՕD\zƫM* >SVn.=[-Ӷ%g|;lnQ`+E:.:lnͬ&^ /󬭥7uaəAZMmGxƺ2W\ ڽi'ݭ2z)3T;uTS0$^S cxfM+<1i*$aI6xjD7Qb|r4rۖqs&Z ]ē&݈:,N~F+t^H$o3P7MKoxd x;`am2#pʤANcc'8E__wl@5|͕ἓIKv A/2{#>o^ch7qe),;";,]!űE1w'i}ˋX Qk4WQ7A,Ta]2h0o&GOJ߾n5|nԯ4=x Nsd*αs 6'G†;zsy[y:lUrބΟ̫$t"$5)_U Nj<2-U}PbQ=GLGX@&!$.$N̎y3k=޼'l3Ɓ?ӂR_}+M$><)3u oUC> ϩ0gJt`PДfze>EsN, ? 7d^&7M#2L_YMHRfs]WtSm?Ͱyr 9/ WAqېSm#N\?qK}wgu1Vf gU%<és>Ν=ܶp,B2pԾ (ao 5'9*Lli:F쨴tZn7 !C{7gḪp)x±G~zU=І4g.+bv3޳7G-&x +L̒{C=3H3LV V!R"Xʫ|Q6s-asA랼2r'aNfɧ~ P7*6$}0fg@E8)'L҉=^8Io&5=yYvv`mAɃ[P`8oʏ+%% )x={>:<*~YAv^՗wzY4 gԈ9TmZK-$Yٲ EP#0ɺ 6W?ke=lgz<}nu'960/l\}bFN;>ط !OmdFT"M?uFsbrepQ"ϑx, @` ^K sܙiR!u{k>f >ˆd{T&}zsM}V`UZMܤ޹!01? Jq^cZgf>7eӨ8B&wجgPlnIT!o&2 l~fM7C@41PeLC,>.#ϙ4=jIPl\ kfBi`{XƑ< z }d~C BBl^]m+1=ӡel}0 $>vzm҄uf+K%\XQI[/ WFKB ?3Vx4V4Jsf(8r'6/%Ǒsu(ə3:nҠwoNЩPZV~mo;g0".6Y |#u $Ƥ>v0UP D;#bֻz>5(.P ^iX3ޜ5̪7͙{f9i&^YMig.yKybbhE[9͉0Y(83:I!*[vΌ.ݭl++>YEqcHդ&M҈7Fެze9Z"Xl{Sa ›4 xS3Mc~ۢXofpt1As'5L";zY09Oq.$giӖ9CEd2H"Zs^8}S;sZޕtMCjr6O!c*HSF Ro "`9q:n F_BPp`$MWIj+8+¢*Bյ1ҜX!xsn#:V g̛%G(|fhR`|&r6&ʫz)>\ by7 ։%S)jxFœp"RFr/% fz3ef :N'lS/JLm:9FAODp(t}{\2mV^:H[7 yXřʛ n+L q|8t& ZTYJ)KO9.!Ke4d6ii*wlE2f6Lp9jcsFݓHCtYNq^^ey ڗ&)Q#sm$USd|Ěɹ ò2Ef MٛU}(>Qj)zsAgPC1F!a@ u<3<ۏ2f ̎7Q ȫ{B3惄(<hR-6g##Oy-F077eV6e;BJ7!q'N 8C憼y~|cZqn '9j<ƿ{Xs~>c؆{Kx'.?jMκv/5aP|)de?;lf:{ǟ|W_}.3rjΛMpF1'ݸP?A %Z-9oҚ2ݍo.&G|$Skev\4ղ\@20䁎z,)i͜9F@NJ$txcٴۋ]qiJDJ >>eb5Swڎd ,;?-:ĨctI7Ybsn2|Gԋ,S/Zsڽ?G.ŨjU;k:Dg(\!:Pوz,:s$F++Jvй/*3iM l(]SI%Ul"YjbFc7;ɹR5Ҏ?85@#~⚞uOUy+w9oV--MQ}|G(- R[yO??';_XJn,Xp~w#Xz.i9a97LW:Ncnywnf iՐ>J|L$)b bGFvlֆ3ԯ܌7w+åX['m8vu"J 0~~ JgVQ*_x`vvtGKUҘC65)9Ղ77 }rN3{.o^s ?A}u CSP F .teGg>JV-"SMf^xtysMKK,4O##3jw1)^ֽl_9XE%qYe=(|xvoϡ˓A[_+3Љm*hwq\|rԅm43ha9@w !$}.zqgn ϝğ}j<{OpV0B`eQ Ý`3{ ?m}B^-2Y[ߧ~;l.>c 9dcs~7;#`m+N~:m|P MۄVSk4N}(0>qSفbyf4 um\a=.mODi j*Xs;|礽)6OqOwMn|Mc4 |m~h20`٩{2|>Y*.srͱo3%hN=j.4ŧ&6~'fԬ5Ga5Zow7sr2ɓ0SwV٧qlO\N;6ط >{&^Dj ,ل*7{A$05Zkþk(`x.o1߈A+@X >&ЛR8̔!YD@d,$m+OٽYz߮x+fIGJQmPfwl?MCؼ +f~ѨOEqM0sPFEd:a2bxJa_r#36H"6yxC_찙v^Һ'+7ŠF7KN]I/Oc .l!ҦgdwNߍ =8j.ɒ|#F d:Ey$Ɡܼ W44w>+iN3<,LeG`3O8@JNY1tjLdy ll<ѳR,n.M#7DIݓWaE}&|ك aڒ*4u ޤ@ 1s`ˮ6`v}Y*'u({*܉iߺ1μKo]fC?3{+$uXiJ킙a({`${Nxmo 7 <zZD7݋"as^9Bp6OFf4B㰟8k®`9RFlk ЩeOM`W6O"Wqz8&R:1ӧg4}~X>A%YF4ϠuODD`k_Pӄ8m;!X iBr5B5 qf##l;ER˛*ټad<ޜgм/:MY= QhM*:>ǹǴYy2>}H|}IBv?'UU7s!U XR/t?M!ehD'dx,SLuFBM"tbtBblnRidFl P16{b1j1>}7{RF8$Q۽uR}$|n,eO x*'`3Ս䟵llίIeuO@iNJzߨc4f'}:5Oq}c{''bstM*L2R#Zգ3F[˺FcJ&*"E190%j9E",4ըW@>sc~Τ(8T\MZQhkrv\s֪t#W*Rşk=iiL_沼]#~8Eϼ`x4:gG6Hcͯ]khZ#msWvWÁ>2l0,E} ;F[˲FctԯR%\#T9I82Zmf~7|ͥ؜_cy۷quǨ}_%Um,%l0F>!vw~7|t^|f{SJ[oZly*ty,czج__eca͓͊;Ѻ w9&o6,kZ5#ozW@f9c+?m߼훵{MJ/[c?o^9}9jG~MySc@L঱}-Wj#bJoZo'6|=v غդ7ńmasTMl*6l4Ğ57 v9VKyb Qh<&գw}OoN2 g^RrLLS{e<9~H,216ׯGw]r؀.SF6Ͷr@K:ky*Q}oas3r[dLFN`1Z7)'z{ O`9铽&8Me UOIc5z3@q|E[b{UD+W 7^X978#'p߾Sݵ1&߯RO]?ËB$Lgai##¶l8F3ڗcy\,O1 +&1˔=KN/aS)'bj+as6̻C̛xct -Θ%YХ:aMGn77F KW4bmpF^ůBKXK(!" =Lc3k fɏSׅFc,oɛs랐AץiBb&ïW{f-y)<oRl^q0aIPB3yptΘYKf鴚6wWN_ş*ǩ Rvݗ& ɥ~"gAD{Udȹ6%1o>lS%NU9樚Y?J[zdc+f[Ӻmo6l*DkMwas;\=8Xc(v\g:Fĩo QQ;+ DsPӨ1:q;blas6O!*$\{svON_97'c#;rd uO&:ޘQ猻^؜gͪYq? *yZXw 'ҟc9+p:޼7o]zɆa=o !V%ڎfq*TK3EmI9+@8܍KqQto߰U55y:߼4SvPp)LQeڶ4b=NŨqasPo*I%EH}M*H T(LP^Zji8جu9bH`svwkŀ3r暏#_4hfdz[._*]`ϬfuOKqasfٰU\ꯃTgaEWRLy"9ehQs x a#`͚JfZf=ެy'p8%J+u̍jXIu`WzEP7(MB K3I=+I t$l.ϩ:/c9HkpF IMQkW)4fMl.:K巣.%aG랐 &E[]eXNM* sW3]7.6U /iQ Ԙ\).6O?嬰c͕*1ڼTl!v~PE5?ؚc"oyXZD*^ cԸy\U#5 *JB|cfL!(+'9Q>i$*/:A/uOhP p*]ǀGB/? 5?3_ƣ|3}Z5|lͯ>Sn ybr87֬;vXh ~ckS߬y_kNoK7=r*6bkcާO֍(+%*IJ&ݚ&Dܮ݋^v""1` #Q(9ZZ EVFX _֬av$i`:>g$C|!6KwIZ=' Cxk} 4lF8gQ9R&h1s5v"ӵ{ ^9Z&Oxw}i!zRŭ\Zwc3"x>^DZk?M> /<'_=Rl^ Xo@ۏ 3-&mpߢ7~kͯ>Ɨ}e(-vyN|_ǟ= )J_!rWԕYvo޿C⸩okh-!N_>6eͿltͿP͐ lf8:'LjJ|Yvb~xpU㿭adP߂q/:e7'6O~ݻe۾S߬kĀ#q1`pٙf"|l0/?N:ٯYQ b3/yQ8tۑ"[lDVCjoJl^y$vfc1`b3UӡRJ9oBy9Dm&U+ߖs70hr}0!L`߭a oۂ+^6'#ľ3D=DZ û9:5h7d] Ӿy?R'x`krݏ9l@> yis!dLK52x3aoͿ^] o0OyuߟY#p_y hy7ĩw>BB x67,jOPv76֚3 #:F#yx/#<<4߄.dcu$7֘E(yr#iy~QNM%u0>+wT&هHǹ嗜Pbsބ'5mAVX؟3CN'vjDI^(aD>ll[5bKjP Bgcɗ}0C0i]> ~'+5IMJ?5F˕X֜73eC(`Jrwğ]n.lvh5ILї'Wjm|ZyR'V1WqMdAYp:9Jn{'5?щ(c}^-.i+%'wGĖ݇;o;?"qQC1+MQkZ`0\(\ӕZl >0%j|<|_kF%F*67IciƦK…Om#QFdhlVfɘ" r#{Cή_CG.m_~*6rͫkP g/OY["2HӢ W3a#fLlTן1y:QJet&&jiY~Բo;6ct[͓Ҽcb}f>g]T .Twb Kq#Qwu|O6Zsܨ39qg_hoJL:\7lBl^!;F'?N]G7u?dp-dv/{`+2c쿲iM,yzX~鹳EۭkѺ_;lnCʪI%ifƨJNnI|No>`%-C_Vѿ zasW..;lnGWĀ||dK ٥U<޼܋Я }/~ lO8QOn}a3.B޳v 6##Q RpY\)L֎q©?!tEv `NqdOC)=}>7ͅ]^1(as;qZI66z1C,XE4q$a11`DzD6?vZ|*4vuOp e,:0%H=Q*8:26w8^2yQACyU,n!D:=Ž0XV*ivY0cQi$:M/)a>t09c".BrTM||aw5Q+;0jS@P *%|4D9xPK|3aكx o ,ipV`3z7O7/G-ĖOB+!y )<)0-Y57-%b|o}%3sú'h'G^w?/g$BqΛ39o| j׬{ *i%p` /_%aQ(`^é)-{]WYҝ^0WP gZ(а#_b4Ӏٙ[cTތ? XG=jrvYl6]Cy Q4i/.~ofl 9\0ަ l{)R#-aèct cRhyۛg$;k&e><MWx~֍[oJjW`# OފVI!jͺӬyqE13>]6O9Fr`~7c89YsG8 5|y03qsȯrM|M< &xS$,bkV%o>NLf~W_%,7Cxpao~ c3 Rc(+6X`L=g4N|bc'n-'N @g=6v hS؎̼o?/4y9@e4'ٟOՔ7u"$ R1 /Imc#sy4!׆*Dh~ȑtK/zct$:lͺ0Rk`w[ ٱ$>A$ͣfIYz*ԛ);[T0L̛$ĝ{@luͺ=~/a3?6sho>1; Წ& oǬx@ɠ˕NHr]oae=Du{wrVJ^ź훷}vύCR9e<0v„X'IONoIg8 ,)K>bޜ&4#Shy㬙4O=#[3{9-3| M~L^smxsf #` RBz](fd?3`3gIYj)֛6kPb?.шYgl'f:mA ,f%͑B9~2`8-046e䑨۷;lxsgr>+w3d:K_5IK' 'ΒRsphb}dcI0F&eO8uqYp?2 jY'>ˑ8rM\m|eԹfi<b O MlQgafî;oՂAwLV9~r`3g8!-)Z8{bs73:ERKg򥪄Dm|y@JG³JYÉn9P~-l 4CwG&hk<^jJu޶luO$wSl(yV -Ɍ$uLEQd7;\|6;̬u?䫯]9''y>fO9om76ۘIRӛ5 :U&@;z@5WT42jR;C%e.9;(&'uVy AWB2 rø@/1 zdLtO,}36S}ώҁkpdV0T|ڴ@kͰyr VΛSPxA6Νd!7y3ycJp/CSΛ R2pSaӀyWVre|y s0C!TqZgJ? *t8\8-{ѹ6O!6ko=WydMrހj"q弩 c>jOPuo*l#5b@~fgez'$u22L 4&:k1W mQfu9.%Le'ŽmC4IIvh'2x92ls$ddii sܗJT"&4+о\fudOU/cL۴pOmTHEـJ~,ehW[꺚Y[`YKUef2dofC|ͼ(LƔ~uXcvyA򙍟`ƿ9onr,Fm5Q'EqZctzS\Ɡ{S>ƣ*03}i(}/rꟸLjfh\l`k*K6XoC ЁG;5,F8'A N:F}~S1Z'wv Ť#3W9 x(3R`y {7IBWy>v59 jA KHhq5'ʔH٧!o~o>x5c9dbmPqhO[y5r,﹈59>OX-0uPe,YvB1;$Uv_~běT+޷nzcZ̧`LyZ LSK4ZaD9MЛkR.jkѪ9oѴ&R}sfS˃$%f3Mƚ5NU^/P?o^8 < ޻uGi;t4Em&df,QAv9@03683o6vPc99Q؁H:cc'zoM;l6L<^-%I֤> o_ ު&{_%//MIǯl:ͭ 3W>C36.}5_Fjf;Ȑ?}%=6V9 6)L9n LTWMfβ43ʤG944F &U"1Jy3,uHi_cbhv\ٟf#W#`_gޏ"U3ЃێocnU |Ztq" FK0N9h*h9 QY͖OC|efhQ´؞eu o(`{C]bҶPF84o4摺\j$1J=s\wuOilj3T @1[RVUR]a0 =ï"UN8)1(=&Ȱ#MCM╔q^*<5$ 4~ȿfz)7+% JJPX2Dᘘ2a@./ Ls?`!:̩ [)E7{\/bsnǖv9ckڱb2gY9#}ɧ=]qWrI+eff:FUN)_AR\Zdf}gAg? %wfL Όœ5 4T`ެ SkФOÛ4"{D.Biێi;l.m agԯB7a$zrWD\Y@LIn~Ҭ- r:g{_nU$5њ6o2Wh]qF@s9٥׬FbjVvH U%\壣l'?N]5u?dp-dvƀYqEU b Ѻ'✕X'Ay 3w4B5bwATfº۸U5lv4<81Y,FBS̀`'gVOOJ'g<¦aif+펹f9*pĦ-lжasOf8E!-tippd{@t ~Αk\.Vxt WgӰsŬY Z<< E6$t aٛ4W:! OJt|pcכmU#c=q6WA,;GcםlOYr CF)oq&.}sI35Buajȴi|pҶ ]v.:Lg(z^IO(DFzǛdkQ.ݗz (Ǒq5FU5 4YY'X,tpS$-D'?ɫ0C<`s9; R[V[9 #Q^oRf0ق}"8Y4 ɚ 4g(hi±rR Y"шyJ^"FXщ杳H4lX~׬+܄_XډNa#us3G֛'yFȫ #qh;OTFn6F 6'?:C=֧zty48;+͖4̷jiM)mїS2FL4j=4{~iuV{RWA F` Hݍƨ`U` OumϠ|.h,KvIg=a'<)r.yY{XZniROob\Ո)fY!3ŝȁ.g7ٴ bRthȧ|b3jݓ1bQ1U HGv% ,Gzu>c4ĪpI YeqAAcGmPzsv] {Pfm[#mS}]o_{ )70]gfa>d5ˆ&L.lf U9PQكɜ=_9m2'JNFÞi3K){mcpO#ȧ=iY,efМٛD@~97ękk\y43'DQh5)j4F3 ;\eCY{uig(RW$9+zGe9}mMʾ ӚUqVkdPφu" SvIT֨iwB WaicݑhǬkv~;ֶ"o~usTs-a~r;uOH9FWꄜ-b'e|7pxCaB+cJk!/n;lɪhlu/nr*,1k]@̙I$h!fNJYjD[p{v;sfhi!{Ѻ Gne8v?fYD,0R'N8b',Ģ̢Ԫ"SiYV ,ٌ-b>6͎_GKz?_?l,6oKۭj=<N69F~ٶv}pvo`5O) 0g.,vRLD,B0@%'ez$Dy j&߳tpe93?%?`Hhֆu;:F3H掰LUbq|Kq, /3HS.q¿ b3%.Lk2҄fsVJosUp%*Ϭ ]tc_ü{޾{|k|Z`ھ>6o؆cѼ<)-*LDj8Dq'l>DY9KdW{^` z ht/6r`vKD }S?5g⼫@&m.:MF e?*Tcmoasn{yt>D66+ݦ~iLPA|>Ea*i{홰 דfoaH]_Ol^߆m\%Vn m| yJy973:lA Yf"M/< G?k""̷7jț'uzHzȫ AQ۽I5^AȹMj?FȻFD?=!y`a\yU369PQ4 Q)"|BkQv:9~HcC9司Q*pΛ]rnk4u?e`xն )Mm﷑#U'|gg'ʂWsͥS4Rp+.$ KI—q{00fO>mxmg)5Zk" DĉExDcs ;x qA'gImlHoZ&ʸV߀y3ڷ&$X橼U,lZ*v5{e hAA3_Һa((n2lIˋ$$ڷIP}7rԝs7??}# fl0B׈҉9z[.^VI%*9E1e\( @2R֤g,v:58mԙBRPFlLfԠϮIU)Xsk֤"A6E_3kPI.Aurvi\66I(/tlwfLE"C\fhDUgɧx CXw4 lg96WE|4M ̞?(y7$F 2ȸ"~ؿވ7#d]c߃&ASKl@ki4F[v˿ۆc4ݾ8ܚT>q۽bMo㠭%UsFjPKHӮ#ҀRJR𮖾4j N^&e —fάCh7X+C)=V*89؜$%w 6IxbkЊbxr1w ёQ2X5lZ$TlǨ=NQ'UjRxOc-c/Ծ5*} "{yM*I:SùԸՠzVJ\lv){,ZRs1]\jyJ6> SRU96l=c[AO4mN]Na~^voI%9=\$PI!6ۆvrjR] դ&fass} jRU3%26y!_U;AmicWԠ"W|5s]Jr6F2vըݗV qrpϼ~Vq~,`Sy*3(U Rm5$Fª@B!wH$1dYBw!xWD+G8-0qi aCb\K1w]}ݾqL]z^&n%d3sg{]eusJG8ksXug´lLo8"A3Z WD367F}w -}rv/Iu`^I\ԕyqeis*wB3OJiBT4@+3n!M~PVI)_ t-]xdv~a-m֨ [OMvwN~9Zwq۽Yk{T`5y&HĤ5Ԙ* )j!z4 VCJ[{x(fLcY25̆G yW߆z[cQ #QuwlGme;>Y/&.a U ]m4o)MA`ZO;$=(),ԻLR=q$ӑ bo.(Bا(\Fs 'li6F' 2Nm԰ݗPq3a$fKrj )\sl >lf_(oZ/!l^`AՍU N@MN ^vAA6/ ިcn^d>.d4fߴݗ&UP`sg@g*}M7aHѕ,qpAd> 4ƦHf6lc+6Ϋ!~zbn%@7s>i-f~Wzv\-{ W&7ĕy6k[UΫSHPn4{\c/ÂPtYDcgevXgmӬ 'i̫SH#* I ;"R5kߛ&-ۊ[O޼b}"ay|6ztw8B R. X/פ2 Q}s.Ӭc}z{+[ o'5,I)!\ uJ{۾S5٩8MdXs{OmlκgW+OSl~A>YM:e/.U{YvݛIv^!9daxZN\}C s~8!6i9O~:؜wݵ K9 f n9R<`ƆmtG$RoV{PFr M3]1[MC^Ū'ElZ< qڽD6\w/={* r0:q&ڐja,ISϒ9;!TTpgp>7x8['eH%03դOM ~_幌HɄy c}{FPI'`3:GT VTSA9%{ɺN1cǛY$unf=W< B.o*z@̚cF[Q-@ׇcDqh`Ln־#X%؜Q0M+= J`\~Yn6˖aؠ¹•=Wn R0X:Q&<fbr/ pP `=uTw͇# 7P:P+&—c︜;mؾ)ʯ{R˦#<7?[*ïNu1j0h\GI]fJ_K$0F4~B/gUقG3Ԉ'{b\6htPZvǿ勄&Նcw RiX/Ҵ}sDbK$A=:QmKM=V3-/o(0IiچrQhF ]ϑQ-۔눍4~"`V}q;[+};MY߹ֿ|s4l3o=O>ꫯ> ̫ЃQ&“^Ass>},ѦI>w n1Zєou㷻=W~>Vg2K"tNOܘDg Rs@S_11^8hO|_e;F1:1;&<[ 5l35/~ 6O!6νRҝ1Gj_37KD[(cii6F'}ǃ͓uPv)>=Mҳg`sV] /˸ YO_{@-τ'nl@K` c1='_h8hfU"|KQQ .{r]<%jc~M?*Ŧ)F+|?.wB14!O]H^z7^jAi2=GYPw2=s} 9LwTm3oTݗLl>`v; m|9QHh)05FNzͪєPD>j/CEigC3*L;?+c>JTrv-j|\ ̯3e=:iyy:FK?mmPwJƠ!!O2x?H0(AN^t.<<Mr~9BhNgϓ0asiͺv?ֶ7t, >z9X9!#85Nœ{~VX l^~P3"6SšhsޜZ`c8 Q?&6絯TGp+ߌ+xHEDVoj͙$ƈȓBF"ѨgvVgh/P޸į G*Uz*#{s}CQ!0ܳ'ϡإ?zy3}V,??rnǑ}N!]~G7Zpl*@WRG|½n92Y繕j<ʲut⋋:ǒmʰy[Gr\GSlmg=)h|z~N8rV>llnd?5.`bsWkͱ~ ٧ή<م>Er`3M@\~.BS,:l.>%V9W/+ˁͿG'}ىM+ D] 4 9c+?m߼K]>~kYv,;q^)}:oqU\jb$s{fYg/7qٰ<+D՚T,,Z)yl>C||J,7q^)}9oͫ`JkRښrC)c;?+VD^M3RsvM}sZ޴wesO 6U\*rrWfs bJՏx˺"o?ǽS'j|];?C>3F*9l )*W5K]|ΛjP͓ӟMVuE'mc3I*gKO]?ݐysNM*؊Vgpf]:XvOΫ@*LDljRH_OٙX^AΛj߳$XxU9RBЌ%;uJb{9yJb0fqWQٓ_c^䱴tYn\p~_S߫Ist¥sPCt{eXUbZQ{KusxO~ ^Tt7؉$(<=mFjV˝26P!<^ԬSٟJ@쟒0fq8!މì6*t1];lNmu1uPX=)as-9?/>K+lVhuYiϟC@bzE;,+O ypЙC4#4r'!#f>iBuK:asO׉\A(#ͥZ\:l^6cj͸WSa#wxXLYZ r^L@3=p&tf\Vh#Ju`0a^-=.3Jx 'ȳ)" Θ9o T `L\3 cѡ[:l^"6^*%٥bM9l;̓C[_R* V压gG gr, l 9)m0 T3*#\Y8$ָ%I:t-u\s}+;ג3a;nVq|ZpY|Ix32kD:+eg,h0 <,sm`4;> 9w<>[:l͵{DarDAG6O(7MMIoo9e/o\Hl#{t]td7_v@^s4Sd./,gga5WZ)9b'y~I [2Gb33L!9h(ϛO]}O(<՟YoBSkXy6 fzxQ(lo՜f7Rl?w?:tyT2=5sT{B YR+ДֽE ҟc\lNͯݎX p0D 0hfD2vs|7 1fAc{8Kh dz$[0{" 6;8Л_w_8os3>"5DIo>. Zf/7BrovKGyˑk:9DIeT.:L)` JzC@{ӒZoV@YzBkt|sNf;)fӛ);ՀN^g7Ao@1ۜ)Mvv4o[A3b'™A:47ç1luf#(o6t~,5w/sgԤLRv`-g^X{bB7}^WVsv04!D[ԕ#35Qjl'3άsJ4>AYsgx,g㲺銙s!6ϋ>c=\8>㗞;[4ea\J'ue'jgL9) yX֟4j>_a*TMeFz 9Y rgbZ9Ki2f?Q[Pg RǛ5F4={x7#L>H 9~w-o->W%ahlTx~?/;b[)6WmE[U(fRaCy> 35 D$ڿ ^ge >'lS[PviXM*Q:Xp6 U2$srs6/>h==2cÈbGiQ`lOXѸOY7- k|no'-/JǪŕKF5Met~|ؼԞx0\Kã4a̓NL6L{xlڼ:×G1yGfv@YZʵm {vAdנ %l/MdޗZ{5D},[З p!R/'8&O.(đ ~TPl_@N os~P {)5(1=v&n&lLbʿFHfzϗ[&sP,(ϏNv'{TS7{yP-{>e44n:(N7XG yuhSěx[}亣C6ڄ>JkAP/I.c[@e̪7WS,HZ]vǨz3ά(G[Տ~y.YFW&{2ZjaIDB82S|&r*t`{;@~協zUy<ҟCL,!d9zCϒ7ٝNF#տ.2o-h(f2*#E~ oh9TV!`feu۴vJ@rT:f@uJ J& 383FgQu5C#w )d۹Ϣ߿m[x)Y18׮Qr/ˑYb:OHVM*It]>N9ohF$P~>Ry[vx}?3&ݘa΅ė~y@/7?5|v=j1S(/t8F~{F|s<)6KfՐV# =ݒM8b$_0l'":c}#_229k&̃U|hfeFTvZ#`씛aE _]>z?['BjR)M0kqy{U9Bm8Í9?!͡@̔ n3&[ \*31 o;[q5|~`ue߳77z3=K4u?'!AqWU>cNU;g9-ov]04>bsϱ[}.griW۴"ohQYo&=w' Arڈnze a–UƜ՟臿f^S4gp\w| %ݳ ] _Vl Q XΟTC034q (rP>N—7bc;޽ngAYVϢG@5m=l֭G람s7FԭzXVSKT_VU*oT, :. ˌYfC3ǛV;GH{IĦ17kїA!Ž1O Aی5 f{mFi=PY{SO 6 |K*2kkbsAjR&{@uR'`Uli]X;Z"~,3MӋܗ/Xo&FAaAt^iVs[mxjD(}p5?*\'b+Ѯ^«&t~թ?ΑXC!qٙͪB-ԠVfV8||L$o2VQ60o~#|c/?Bq4n^|1U@wv#%:3ftmܛ"!]]8)7 %I)P2{%ȗ kb0@/RX10Pxm2oě?gFGn9`2lil 1~'"t078sczp®Ly3Kaύw_~ymMl.$̙8lf#v*-J0Fթq֪SUi(&̙L5|z?jsSu Y`[ 2o; ϛ밙_ѣEãξr97 ki>(-)u!y2枤 n2u_qb=d` zar-īWasClIVgR.M;:uk3ܕ'R25jZ?GL:u^f\ɟÝ:tkBav:!EK_T˽s9@xZ50y4gMƚ`2\ js1LL 2]Vu9Ζ9gh'6즳Yl9 tw]besSu"d΅y1{wyʾY;ln͙9{Bn؞d iOlT^mTM} Q?U'538?i2u?첔Z"o Ȟџx8˕]'H߷p3Upc*˙#/;( %7ˑldITmsyYSqA3fsl"6@ 68-wosTRB"/g@kbsZoNNFw7'~ƣFND ){hVƇ<,Y4 9]u*&-rBخRX'EU;Z$&Wp{4R)X$z'B5:yH? 'ng.CР/_A:gʫ4 V0Hofe46s})0 y<ς4KxK](ΦT ww0stGc(,2Jw6hP*1}9R$؁:5NHuuOF&9 $R uGS娈u9orq4PF#;=S9 =IgB@waZdršw3Rf*PE:HfN l pq@ u q}9b)ivrF*t23rro4O@;A^sʲ 9B;Sr](%rhTCoKx :͏?䫯D9IPD"'0_lv qIm<',̙3f/Nl iߥ5Ÿ%z:%m(~u/ t]^ &SA9ɺ7Mq2|/Wf 7H ݩa!з !d^zUlvl #m .硳ڟԬ@laެҜSGžakĺY;M#8U*`.IFGI^* ,/H'eAmp= qHbb q놠כmj uees99du3|fvfKrhW&l@~S幓]ч!R7SL}^=v؄b[^﷑98uGl'{eczx4&%o!6O,N^_DފTEN86w-R77FOSZHl}ڻB1'F]1IӟcuvOQˤ +?Ԯ3-|[v;~S/h:^ԠANob{ $&e7CAq*TDc.FvAOwrFu kUe0VϪHجX !yߑ]Dד挬"\dKޜo?Shf}$ ՛Yjj*=ͭENTp$C !(Iy͓ӟcvq38CnHK(Kf*L:W&CYg:v]%xNüm>$+<,Ʌ"3R<'G!غY8BE,[F ׸ˏiq 5H" )i:y;K\lW֊H1"'>;/!RL =5џU3Q<:=%l>PCۀ@UF -Cޝ_~r%Z//ZwsbT)e@(̑ 57O±r#YX6-T & ޜתz`3f1 7N- ̼0&/u7laNMmQoi]HPρX'jwuys5 3đ} m:"cs'T2*H1*rB"w eVwU['3-φڛ0 fơ=V&ǔ3\͹9I_|9W%k%N|w7ΌZ!hx3f^Epe>lVaVqL (eHp}4j_ěcA,H.@ gӐ(jcR,hBՖS2$J)Vo=IĻ\ DDη\aCt]9ٟq戟b Hz3_).UȄ̩sCo ˡα?h?gsB'K|\Y*t9b96Ӛ(uvIwnuĩT d;GRc2j?Fi4M 񆋘mȳzCr$:Ko4ST4جz3g|2,T)b5;އ;30 -I=XYxZ5ڣAA;KɕT:xޭ-N7찹HnVQ2iM T|ɫ wʡHIDATٟ͹yn8nK|T*bɳ@lR w"Yx30͜SC)I7kͱFcI\g6^|}, SM囎lr!!cw/RYej4d> '/'l@ƛ=:bɜB „DnA7i(Hפ'Ɂ)'C>i7v>Wn$,QV!!#"6 yB@,RfSUs m[ Q$׀$:)p`ʻtJ&#˴BąJݵwSMɠ!z3N%mf2Uwh͟&Sc3#7/x[[M oA'v*q|R&veǠM>,y59'"b#-Y#UkbsLxFXj@CA D}m+.^m⁔@X4 >2clx aa 1874sw=x0Ȝ7aW6MQxDW)Ly\/*{97K y54lh&LMý( 3Q< ^PyGnfF`sFsS1fɖ9l8 H#QLpeIF zܗ՛sgMls65BXDj@"onțGs&"NofC O0o[<o^+]:"as^ǡjQ-spOt;W*VɄͶ;ΘV՛X*}` 3Ĝ[y8o R?H; '*ELڐ+g4f`OCUt\C ff*sV:0 ;RohG[ݛa׌a8x"ENءE(tG*H&a(PbA҄l'+Y@nixAC 9 ҿ# 꽠))kQ6Yqbsެ4ʳ*C@[0[T:3Q HPȂ"rɆnÛQIrwU'BV.C<SkZ12oV%+uĭͥJVe}J7a$:Unx.h3Ԃ̖嚣u&D''ݧ)6/oasClɫެFBPi98srO\UG/5h :H*0+*<ȼyRsQ7{~)zVIۨ :Mr+O lYTg5(Y"s8rh/^Zz3sIpL:$^\L%c͊j 9#re/u%(26߼yuSSQ.轟)LMXuZ8wRebDF3b\ :h/f  E?WЛt8\F5C:DplC3h:玝zh{m.7ͫ@=]<; ̠0Xɠ_6OMݘ>bޜ;lnͩ8ș.˘nZC+w$eb)[o#ptԛȳ ǶϘ&RSH28L^`)sE *kV gBpiFd1dzET,5)tGgKb?c][YTzam@Gd=uV^AY Jډ\)Վ|j힐4 "?9s3/!ov5Ĭ ǥ{2#5jv 1'=+ ËfԯgY4|E} Lfx Y9o2jR>D2PgP Rh^2%v#g.Pn[Ut\@=^,z3nl!L0*َB,,]ysֽ*:ٙ2lZg?!4ks^ ~ v49ZzĈGn^9œGi6a3OFY(X/}+ >*s SWc ޲@{h B?APp;g981QjR%.\?0ww G) Ge1FN+` u\oJ1+Pg}68y6ۏSg=\_cDgۼ~f93gG}fab'epA2E8+28AInvXżgh < 1nlh/ςJcaldtt>:k楟$*;f\;5$TOO ^ wXvzsjRq"fH7o?_ ATiJC]w3s:T~F'sMOJP&93Ir#5=`ApUxqo>v~__}0"pŊKH * Ʉ|Ǜ#fM=!?k"jtfQaM #eޜOfjUEo^DAztyAaNY' oFЇ:i = b2 r%oD0Ɯ>Bۡ4cC<1~zsTe5vk"I"mfA%T7xWY$qs(IΞ)}2ߒm鎗{ܟ>=F(u\ɲ ٛYYbX~0wfid 3uK4 3 I7yA\H;ly926OLMNqq4WVaC 1 Ny}5,xs,s-moɲD]C%B+L4yaAY' 6Svb]:̂"#6OBpfm\zh 8;jW ټ6O!6/&)=E3s 9+;,CΝ$v@76us(/-Nf{?6 S!2ol#/eEOFs D3}.ܾmr)Wo+;7 K˜S ʛO]i6W/ &Vr͠ڌc3͸ 4"n0K]xfti}P57C޷8C;BEP־>Y_]'"VHجڨ&I%p7=ar \RpnIrrz3c}io 3 pf3ѦYP~Axj7&:0OwQ$V#iɟ֛BjhAg ruY^Zƶ ~D7F&Y̲_~_+fH-)9'r>@3yB1R;|M(6R k ec 7\$&}{li2aێ$StrO9nGmޜgPѹWM"Le54%¡(3ȩ@mN32 6J>G$З}&g!(ڈ%&dYzuy4T m4MfM*IC tc5@W ֵw?$2W}Y*L@prip\m/83#weZHM*.z:U TaCkYW(9_cbV?YFE0 ڕ : 6dFOg)|"Kh A}Y0=$#6krg".zLo&&H&Ʒ&5vV!C9.fM_73װgt3Y2s͂vje!t}WG)tG\YڣF O{n {yVZaL~ Z546jz4OylCyz˛x7}x o9Y/?Oϝso7#7m!| =.>O LCAGݻspV<J18fJӨ.KB7VrOa]o?N7|^7#*MHՉT#y"&alᕫTt:.Z<M{aM3?OB&Ÿftݓq#9Z9M;ޗ͢'nl4i5*՘Aĺ[_Aш|?",D9=dZyi ƛ\>l % x`o<*̧`*lw͜QlA 2Rj،|I: mA/O?Hvzi~>9rb1 ݏCdl *Pw,ioT obia^};ZojzLc/O 12LOxHReڣ"t#^-NF^CAA^SV`kډ5o b M9Đn!C(Sԃo ^}f4͈i`xiY񘑚L-ʴ(%0P2PxEl^YSC<l6qcpRo.Af|UYo5- O&ެ9%OC$>ֻ[[ ɭ&QT~­:l^6 3ő&0`=ljE6~/!ag Van[y4!(D WRܓi%4TG?7xH;1%H pk]ݹO@ʴ8 MY.t}›U޷Ii}n۲ܼy?sn}cތ{>HiaiPHGPQ))c34Z% xh"?0*sOMY!6Y^rT/%hHc7-G๑dNJzn[&E}f!< Y2{|JaLo?.iA2*(B)5hkdFE^?ԽP}$qH,Nss4erbW!rDTI>WgIEa4>M ԍ G)64퀒l1Yd73SfPnI[THǺ 3Z3asSlVܦٔ^b WV74 $'&v]ҧ&IN]^`f.~Xo۔O²dN=y*l "(B}eșUN?w6Խa}qSUQLXΕ}:w%!~T<3%}{2U?l|yz3gJSz}.vW Ge5K Q래 4$$MEJ xS8ѕSe\@NkZ^#cIEP)æp0|uon̛PIy鵝y 2'\8!!7{7>TlXDraBYʮbSf=NgcsO$ّ QYSN8IW ;Bnߥ}uyn4nEo?CT= i 4Av $nr k6p){ՙJIc((rybsFxSpi vb"Ex {@# V* {9RRKұڤ zZ" +4\S:a#n*1xZdeNQn)txvƹ~Ԋnr yy"= {9ӈKBh7nQNP+H9qҳ4q v-y'?7jz,ZŶ"^Q?D3Ӌgz7+ʒNiji#-\(C69y 8پe L؉T?)gmK2 F(3L)j=~vսLUohJ .S64& wOH XFöެU4MLSC-ݲdjorQ;I+OF̈́.… mv}@? MZEt7E@=H]suuzs{80{m/:CopXIg4(e欞#ʛtBSV#( t¡_5$b zfUD?aW9#%] .u4O<TBg@9Ѱ̛]8 b7k9/Eh!A`Ԉś'˟Ө3T6g{o'/1Q"ƾ.a"p="\ ~g~~[5qM3Z;^SO{CMNR4pJ w[3M t4x3DT߳m#y&͜IC"Le#74-qn- (vm  uBg`WdeL"cs Q랐A:⒐4jŗ)|dV{o733kh@$3NsQ$6IN&͌vg炐|#T>T3Ofh6~v 3)p$*T26op:i/!S'7X:tMysV޼Пy#|@9_\U)9fάЩ!v|~sur0u=1|~DelȭmggCf~a$K!TӕFTe&d(P\.:Qqy9F)o v}׆ɔ|t =Nn(ݛVF͛JAX o=}u' Y&6;s!B3sŞRiKVTĊ^8gux7嬖:G _^nٳ=2TE纚'^3)R1{谹x<қ/ EH}D7 "- ,fn%fA-qYsƀ_dTVK(00R`B ;3}u4O!ϝB~5h@bz% {ڒze!&_Lc#δ!gF "ë͇͘M(2Ϭ:* xcOaDP3іAfs+Rb:]nB zAMl.3o*'2Vbs"3 BY7t]X$t9&gU9Ot2Kn/;9ds"UF+9;qESA+ڕz:+ ]SS ⻮a}%-[Н?#.F>  i SO&ZZMjXU~6ft7?gAr٫&6kɩ{2BbBy"]usd ҌLUil,J4%톡udaY֏6S7^6l'odNf eLQb@\ω8`fqg *=R*K͘z%4\e18$@3Z4cDb9v[k/N:DSr7'Zl0gaBD*]vs3 Yq{谹!6'~ksU ̌hԗ*θ $`0چv$qys'Q9f^BfHFҨ- &]_¬zٟxsA#\`o{B6_JFSU\/zĈrș ] d!c_:lniY Ys4̞3.wi߳{ZoSjFbs,šb) L_ 9%QB1î&֯c2~xB EYK8ǾL#jw2N/04kK/V hLas)/fߕ5QaYґ!ͮ Xa YKof[owm2Kh_]j9?@?ـ LE~*f fHEI-Š9o&*_5;E)v7*o̤asr H'xo%_w?G%_?;=i]jys~mvs›M?-oUg_8&OƻY^ C8UkR+єoUof8iJ,9Kv%RtK_VzSM-V9|g#eߜө$L<!SZš!rE t 59}2sFдoI|*e::TG8FّPNouqDQiCrS~3!UQ%F́&gHo )XL_#Uv+lv_aysVx4,/K@%n2B.y^0E9h9oY;I _$(^O \ α:zWq#l+,Lif~;*QS,U&«!MǛ %jԟc}]lΫB¡ø^UowseaKBd|d3,3 J+ñ/G%x]tu9iFr.Zbs͚T;4"+\g" mirZD_$Av( ݱ9b.Lg +4[\n"q,_=J~qS?=Pڍ^4n A3c_t47͎c.=6W7`}\sok_4.m_<;ڇן_ Et kዘ +Ym κH{i@'zCcm';['B489& G;WXG~rIxb%X2qax AVxY}6# u-V?"3~{!^~she%Ü!lz#ێ{TKP]?T# f+Ӄ6mS{2YEt=@lz_p,{tf{#-_}= {ɟ>"@sJ4яG(drf$2C$ Ed"J}܌YNg\3oҤS2%8X*jUl]k$8͹X8\x˧ò$N ōP#^ɑc@we*Cd;*/s4sG?N‡p VW赾~S7?tS%d5|$9*6m!Ay#/iñOe2)xέ}{n;El)F^ q 19Y\J)|u&T&j=9}( "O֤"kT Rvm@lc㶱oٗ2Fԯ&,^ b+I&`gZm|b2kb? 07v{18O}ֲ-h[liϗÜs T6mA8bJa-E9=y1z:4 w<ڵ-`\HLcYnvۇ9 Jg57Ye_;\.[;AV7V;ׅ֬5Rl>H0r7uH63HR9)hX6HTl~k*a(A3Yi6U[-CLz{}H pk*@88BF؝ŰYIЦ ,#R[!M#1/B,Pd9nMzcN#Va,lU@Dh8%rtrP޿~rZ j5$6(60ͬ37l%}Z9jܖskOY /9fהrah3arb 8JRDKSELbg$PǸrv3 *=su|*4]!](PKZc3#­3d$eu^厌2fXv3'9užoVf6!M*6s}<&²{ Clk6P0ujlfhb:f^ KyC- {ꗄb'6l;`݈ YV%Mr*$ɹDCj'3E>@9< L.Nj םW.n&cQnEl< 6֭1r k6CbvogSl0\ l;ӇQhC^*Ze Z77(~TF\*ԲQR[9VMzӴfL_9vIkB_ӏXα;3c 0lU}ڂ 憡r~d@7P?0#]$\ɐY<:V*N$IK40Rk[vg<{unA\{"*yi`0MHf[McXGC&ƒYG ?}>%.;y6=jSAZ aY$}!#аꗄ*"MY1H]dz\`R"ǣG7#`sDƴ,Iϛ~n.>CI*-mG ne,Ia# 0DS@60]H["YdzR\.g,L\ruix茚cF'aKlLfyCY$)ГMpXϼ_$n^OP74hyn eJP?p-,1zR1kN2n1Щ2.D{p5XJv9GE}X{2kK=Aq6Pp%ٴ"|"߈_ڔAs4d/j7$5,oS wXhDX B/`Sn2Yk) 8$> <kDs1ؐ u K#YN0vh {u'^aU< phº@LYoL{XЮX]--R#ۆӞVaq1HbgG  'B]Ō֩'lMs :a +TnzU1DWD̟zHqh ֑C,5xwH{md|,1v]Ui=Mױڃ|cڅԫ-8N޻F* lP3D{c/Yl7SWë)Dq+KZsMCVʺdSaIvN wZb. E^9u|$D KՍٿrx[ бy^jId!-GF(> {i=ͪ?Xc"R)1Q<;-3UTkRSdDocyQUSNBq#ej泍i3##k1&:Cx_<>WDeMoe9.6I.K/:J6x2qf[($,.@كTJq伞0l4X9#+a6To.fרU//uD\OE OĊZm)3oyu\NfI K9NAs4)VHgרpnUE0EV=JtepPZ~Jp[.~zW1.&UV 0kBBebMА_q ^Qu^ɞjI3="2UN1`?MO`NOGOP9:uAs4's "G3>y 5Xa]x/܎:USk948B]Ĭ*e95p6HXȲ0Y-2Ʒ-AH1Fh{~FeP۝\pߣz0씅 Jr^bd7(X DT IWZ ?]LHbΘTtէ" mֿ?‡aTL"l#\QEWSb7I,n ⓟ5 ,c$zT%rXWuiQ5n@vz/~^ollLKbBa:v~ط_N 6wC.p0.>llmo۾)?ߧp^y4 Xs1fSbj\2'.MOkLeX>I{l<~Yès!M>k,PHc p2ӡ̉]1[cQ}X9S{qn]?e`Nz/avf&tp;QHu/oA9|8Rq9l0{qgOև 2zYMxf pm)׍vZIq>dW}L7YA$7Ƥɵo`F(xNA>8͍G}glbXax"7L$Z.זA5jطRCw9ak_J<{m_}o/ yǔGcf>V:v؞źoUoQ:t88o!.זjqL*XY"(PD/ ߰4ѽ{sF X96)3^HK53uǾraU /cs϶\@H&˵\7D@j5Y)zVF6VlV/`SmpNl}ESv#ےe7%$_|3V=O~^cO؃96K/x;.t/ׇ~s:$(#]ZĚd5<\S,7w ku#,86P 3ްwQhHn7e75tP7R5MbVqrɣxWPZڳߛ[58`\@cͺOR$S[Z{Ú$+' ;˜pm{3G۾?gڋff6TǏe7<)LS@S*G vf_)ADOc 9ǢuGñ-yòhRo*S+CZ׊:Gn&ߑ ^`}E&{".rW/ȿj2lɍDDuALkf[,9X_gl. 8 A(;20HarU7G9:tAGqQ~lm)ћw%\6nλR顢~[|4}s FK0πEB,Y &w;G[ԩܯզ복'1MsIH/ȿIaZ"c5_:k鱹(sK]j;wV9NAsUN#][Րu;x|"$%G+ Iz ,ȿI!Bm[e.tOPцGPG;{{걹Z_4_bxg>ה8t|RCS_zydgy|lG_ՕhϫZX+"} =6w_|j0yt4>j%əzV2όmg}^ro7o7OjG3ۮsZRJAڨヘ:ۇ{׿Zo=lnXd4ȺtѺgwٷL}~ٚY?aTa^oCN2[l۬{l>WTv.b>̇(S:L+eL@=hv9!kI&Wf'+ {޸oj)A[?lE~xհژk ZTT:S 4:>c= ^=3re jmLyu8}`tO%+!{B=ϣxǻ|j?ylߛdJ\r`RUW;KmLrHuZIl8cX^`n kD bQF zꞌ$ē0Z"`P΀5j7ϱo h6wX c\p]=XeO@ϊ=ۄQN^ӁWOssB^Ċ!,.8=| ;fs4%ewi-~sޡz3G'@@ jTvh2Nc_fSxe.j{{`^L =A 0iߥ"a :Ú/͉Me]ta:G ueA;ר2%APLўU ߻m/Y7 h9nE)٘ܳ TS_<箯 : 2 Gq.SGquOQwK~oI% Ql|+Ҹi}]܈JbX^7essK6gXdO@ehq2㸪a9p ]r,NHstj:߆O^oR%j7˓ mʽ7n!dn'dg`sF؆LĄ X*qh:'WL({'#>ỸMxR%,ah Bºx~? g^Zj%܆XdZ7wK0 uOXAԟXA4N?Fq.CG yݓtا8bwm%9Y'c ,&X(H~I-=6cs]_'u-4=稏5{2;[eR (QllLoL,~a/M$4 nS޳>T~?GPX6uOp)"GډFOǷ4sM"p6Z6ؽ *|T[:{L"&E(Q~mo3zwv˷?BhHDF)-Xh'J}[ۇ{׿Y|_uz4EupyqE }"yR62}.~OGcڟ̈{+XR )Z*w}fڡfiYo"yfc`ֶzYrxP[ق;TPA9dzK0$/Lŕ~|<6XTͰ`7{6'f&S!{"\/Wӫ:nȐ1Lp ^aة.{{-|z_"o5\0C1 %Rw9$ԂZ6_^ WxCod;+d9rgշu=JE9Bo&!m7<I#Fi-Y/'*a]N-J~Mtʁ ,Q۷CZA#f9o&ޒdN\x:lnrMM}V#BlH#>csА>WOU'+{V$CF(B!~FtM$lT^Jd5aR51+oʇd ӛk1Zljפŧzl;Ask׿| GgURQ؜s:yl+( >O*7^3AWC<Cڊ4&So74&5=G\'67fjJIVS^lc[;;Eh#xZdՓ7kM;޷gn=6Uy#?pf Tuߋ ؾ-%ۻHG-3;Ch6^n!PR{\hݥ6-դdqu(ܢd$(VOj鱹I.O+u[F2|%&͡R)j^CwXOzf7-Ѥ2,AwBעd?Gì;MVXx͵ܙ>j?כhRFa"&%CJHV1%a pm8~2l8G7{{Fn\g4G&T*hRvAVfC|Eu ;1,m9+:>z>%zC'/Qyg.f,w(!6'$p␒2M*쫴 ,T2D ܢdU-'jwhN~/?'?8o{5IcYP7פ*QqbӧDT'HxzT>=6 0ܾNHӾpi9jXyeT 7.j(P1ǂ)Y4Gg߃sHr w;~IUƣY,_L'߅` GX0U2&s MizV/ou^$z}/o;bBgq}&׀݈Sn$hVԬww>E;l~ФJpe+)n' ;jy0!'cXJzlf=>r6J 맞qTm-h58&)ITMz7[fd`sx6gs{(w3rI9tIөN۪߱=_GZդ"; %7'*T+Z3_umyKzl> ,qH~oENJ:G۾)s1!XOuٲ!p鞿eKO6z igO:}Ocs;cۇр?㫮)Վɸ"JdNj{K6@q-Q5ZfZsz[p8a؜'*Rv)ؓĄt7V4O)ȆFuF,R XîVp9cB'c>u߳<FQxjxduO:ƫ2bBQ=v|{rǿVϧzas4]{|<]^zlqzk.x(?8!tW!Pjh=6͝u|zSce~n>wn}KvFSy孅;5<\HLwzl2*vm֬fߦ~~~70>9ll͛og?l5Ps&N(=QN.SQ?<'ҦQ}8Q}9ߋ-'ny*lSiļu9l/ zClmCwo!U ]HsԿ梌8P(U2'R5w^m\_l.x0OJʫoͣ/Z YlKXj͞nĭ7!o#%jRypU'(6wWaOmS{2ZRퟩ5N|E͉>T*v4;݊MxOPZ[oyR ?~h8͂C=5n' 6x7klVt)!7{M/h as QuERℤ"{-XAs4sX>^~NraկK-T),P^nn5 ^sa<6?ġ[ko~e\"_<.y~OIr3Yޯ.v_? _ͷ͹}-g*Hr&=6樹OdԙxB9' Y74; F.$2wڮH[0Y{"-l 6?5a~61_g`<9u`¬Fb ;zefI`ky >%`c7}⻛?96_%Հ)#)`m}:GCr=4?\7 b89%'g'cԐ1aOl.  m,ɔ (Z74<{X Zc+!yKfNž'ś:b`-l>D i$f̃#^ zO0"e 9z;S[,q%w!Ǚ:6O;s 9*x}d.Ri Zl `if8RS{2=3S{޸/tw=vVc@dÁl736yi-,%-`mfqET729O3ج(T0BX +8OvdR~&o k6.{ajG$KXoi!=Bm)^3^C9Q uO0$SA+[hF3 3 &-8laMg)](-4tl A/Y*3ج~yS¨ B mSo@؛ӰWg?/Zj2WM5PKWwN'| 9j)M'BQCHzK~ڋt uOZHPڗd+m5~l)nnCFxywa}5S϶Kھ~~~nė^jvs:ފHİïogdL{oV7'w^ 7L9ޢZ6GsHzSʎ3+ٷʶXgo8Il0!f^lh.lt󌖿1 |OrT<, 6@- bV>;0u}}o`?f2|GblN}ci9R\:0YZ }a7f.|˗nyMl0άt@[fفD $8=@2Qc‡h5l%ɸOQͩ{lU0-HYbQ?Jڦ0L9B^K}'y%w~~kͣu~CW6++n!_Ĺ$8x'n5,ƻ@06?}*Т.F¡A_F<[-!|L7?{+XRq{XtTes)/x,+=Q> :]Qej?GIӐvv(fC[k|)|V0ΫM`E=7&ac"/x <^%A0Be緄4{l<0S.~mloJM2{Yu56ë@iL"sZ=Y$&9Of=ۄ ɦrfSnVlfߦ~~|,2o(#%KtS>{Lf=a\9BRTL2#t x)\:DeC;?-{{I)wl/l_+aiɫpYv>p)R%NiX:ލCbc I vgP2(V XtOXxeNꙈ"=\ 190asTnأwNf`LFh%7ˍnam8K:q:};g=D.j6 y,8sTHe| 5 icڣ̜cl̡W3Mb)Q~i$=hc:zWVDd 6 ɻ>7}ʦ{8ӗfMSrٽ1$|dIm<\ݓ<C?Ck~/݋;Z荇Wɒke<$l0ʱyy{wy,TUScsi ǘI#rɜ2 I9p~$Z Nȱ1& O(8^>fKddIyA.;N9p{J,qb5TĦ]JZF_VѿԨgy-9}׊}uߍ{s;-=MW0hi=rr..'uBcpcDKbxdHJ_*J=(qBC'tU㟦Sdy4\`TFلVlirj*j&N` +)Wl,grl!·oO?-Bpyqԅ#bsȅ*V[?؆sq*dX솕룊2ulMjР ])Psl1kWĥeZ!62;lVfgl̜a9i-Ϳ+ `;}ȭp81|SVݩ%ӕY>ߊqŒ^`?oJnZ1/=p:6ꠖ-]Ma} <;_rWu 08zñ׽n]T_胔CS3^g1=3oհM, Biv \KKj7l.2ߚ}.Q:G'83S $?,[U0*qp22_z~Ei9+=6v:SMt"l>dituߣ@K2 ]s("[l͌Wo`3~v^yߪ3fgdj0ZW-f IF o2w~s_#l.0ߒ\W!#fRUq*V&M9j$YBd/mo7W~c l>UHƥ܂c)gf7848Cޘςƌ^ Ml2m^෱ 6pEU֤2Ye"WԑzT`XѼ=6lZn~\xrn&u07wpz>c߾zʃ)W̋ľ@kusw_q/6y#$?+<'(l/sRш|Ց=7n;=6T~ 6" M r;cn M*HdS|MvPzln;o)On# W5Ə06/LP`#|>_:^\刺/^% <ן9Ք\&YN: 8PҶo}SCWʗWFl$41x)lJ% ` |-94)8Gcsɳz~l/-qboۀX[7 ߵw`'4px#wxU6o^} jh4>h#p؟/"vvؖʧt4y>_OT{5UX]- &̟nWcWph/޼8%zln͝SxK tffD%s$Oc99V=K|A?Fܪf5Li{6c3^'1جۂƵal9I١qL3ϟ4V6w 5|xΥTY6JݐҤ7𿁽,T`%Ii=bsws$[hR&s%4P&e Fv슿ޅT {A>!?^x:o^u379i_! =!pW_?MC0j˙mӯ Jaszt\8F^rHج\UP5d Nb!lvThϓ?i߼.I-ңړѣ걹!6w$?'is\*ӤKTU,*gk:2e2_} 7 96a3oßp3b'f[lmlAcr:Ut S^$nhDn[~Zoj|*VtbDb3HTFa^+%d Ib03N!75֤B@pM['zl.L+9%Ѥ:OT &9]D` x@}j&4ãрΙS˩%Q#ɞcY&Yа@llb3_ l"Jb9H*Nng"4~5,X'9ahUWPr\ "%a@jR!xs/HlDW(A7[lVP?1?ՔGRŠ9JP5gKicIЅfY3UM9J9Las38Eb[ll97o-c7u&uAst}k~V~NhW(B@d϶ M*[Z`U:,g_`7Ӥ*F}#{s|},JJ4>v!(x69 D-+Z -尪b!v7+,sn&:c%ci* 1ݾ$f(&7[q)k {7-Ih9tŚTq޺.G7k14kR4]B{&X,V &?' w\AJ2TF&y/(9?f,/ J-s6 c2 T'ʁ)/{ 4,]ښNl_ 7aidzli7I֤,=֣jy 9hU[(6^DPPҁ,f6N 9n$BmdЬLfklM6aBާQAsSjutiCҤH*_za| sִkzU \;9R*M OI5^.y8}8_/"t2oM^T&pjBEia jPl=G& 9.67դK8TȀ%5Tn9AnqHK~MI&ұnKA? z1!l7_Z jPfi.8TŖzf6͔,:E95*C J q7SeZ;"ўW=\꣄IF*)=-=GP_ |ڰ쭅͚'>sߟ }jMɪ'W~I]a*K,p+mߜΥܽsS &եRM*_Mg?YWz^Gcs(Oyy3L z˰ {߶pv3drc71X\H8< lf5KHv\gQ dd_ ( vJϥ@K ڵF^ߩ:G5kR%簔M\55 j=GAhy[T7 6Lsw([#wy=lb26Qv ـf:s~3yf9ezV:fkeyҤj:Cq5^yvq\S߻j͂d7I+ߵkॵf.FXtS5`?tR# 8gCQQn3mc3zIUtğ[~=6ݻf]c*"HX|ؚ#gG,]]f6K8Q6is)3Y&oFBWTobDiRAe=c3[S{_W6i2Q_ui{S :%Q9DSS4 yЪv걹l|,nGn~93*`q깟Z,33dLt,^g jx}\[/ AZ!o;bB^q['@g .5D!,ASElm Qnc;H Rih7_lhJV}JA2 FoN6$5 sf2WjhR?z wX9j.GΛz&jsm xJ+eb[31`R02n xi{Ħ+{pLP33Crb3TBB&LW'_%Qߓs>2&jH%K7B><=PD'۸vsF`("kTE.Qv"vB'}I E4t)Ei`7sn'ՂTl,j!P6mmΞ_ib#'ٹn.>6aBB&H lq-hځ|IcF~ǀYi K&rg%Ncn`vrf7 ~%ɑо P?TF%<*/!v"+Ro>7G ~ /|Q.(t5mz#R-̴@]k8?z5* $PFaGC"s͹|)M*0YFJ\=1d&ǝ!W}h#SuLN"MU$ KS~ =P@A *AR(A|PlG%Ay'_!?304p_ZKł&H/2PKOmn@f԰hK(QMi}XA`3>h5(͙4LFX*(sLr5 hX'MӐP`K9O sJ=ՎKH*XH"b& Td2zGCTIϚx{ixvO27:0nk 1*Ь0m | Ψstz}6tuOPv㲩,/{f~W7:Ih3pw.,/.itv›za|pvY+G5x5{18:5m g<33Q8'%(iTn!s]kF=)ԅH)HC"L39Zd~܀tASH"yRsHAb&487|A^8_6)XN$ 'fR?Yh3,o\YYL). c(}󑼮YziquO踪^. Ds`ɱ9GCXuc>ﱹM/tBlNSltp }7 s蜕2 SќL &NP5խ5$9h\Ac3B,ݓb:.(P iE∥ 6峮[}O|,,͆c]F'vsb6srkdg֐ }6UDt؜{u4tO&.1!ZxUT3"LG,JYfTdNgLvĥ'rVT~* 4<.A(il&Z̵Gܙkg8'rk C1*qVܱqRʀ`Ҩ3>''qR[`@-94 c!LHkiqk)'ƳIRblaܝk$l֦*=q&98K+28b)Qh3m"{u|\{IuroAyTN‹ף47;.\j5Cle Yӛdk(?Cxd $u&%bT0Vqg1Xv:MϱtOXDǥجvsVDɸĞC,SE"30Rʎ'&IU/6q\kR ӱ~Ix,͟17S|J7[GBa4J `Eϲ.7[D:S h3f n\vm5ǵl"yS9͂xBU\L,lRQ=@*E'Ն!o+(IԼyJU6k›hR}0.ʲULuO7EYD퍆vDg sEœslkxR?Sx".fbp;+."@[(5l*BUlټ*9lͥ*wEK8S#@ƎTVMgE70 ?MᕌZ Mg0e4PU8643j4R9M^2-M+ʊG^n,0,\&: eIYl2`AZL%]D֔mOl.0=CHstb;b3__A Xg^_/,l:q=@%kM v6d5]֣'M5p2%D( +%y`SS6taPt 4v rmS H3;~ۙ9DΒ//C= W8a:2'I9:t?l.'{8SIz*"{N+?HH!YդJ@ +QCw\M8YLfv6\U3(dԠ5 iC4`vfSmX8Käkd:F 6W郦Gf 1Z4mbpp9ZOq$7&UIo~>p֠20gh,;AܒI'F3kA $_ ZbjSbͩ|^d9+t<|ǻL\X&M_t6 \YM!s% JWG3õkfdgFb6's0"ܚ\HZfwdt?gӶs4{8S 8=6W~^߾-2('e}=Y^.^h2zY2i5Õ}D?OF)z4| b9:.4uOJCh`f\2 B=:N16'"&Ms+[Δ];8bqd Nc\x#X]Ͳ3ond7aҸQx{1ms4뒍L7lGWp=Bk/%) '2[#u@{Su4 epxW? i}#Jϵn/ W~5CyhݸFU f.T_sxfiYo2^&0Pv=3\0$+!;^TGDy-aʲbO(+M~dhc?>w`s$^iPMg Yfː7N7Y*; /* 2Q Fӑe`&TԕUg`E{^!5=6dGJb\@9mEv<]Sj7wqy{BCIh(j\翱;)H1bm\eCKiTGGL% 6;l =%MXɒharIdk=}y$q9+,u&°ppz_H,; h^)pyLMfÁilһ3cePK,>ӵqXiw,b}lbɶQշ(W?"ӾM~AB1gɧq,f|U[dK' 6XMp`G8,D7LNv1ǒ{v>5:N9z{+%K)D}/|Us0HÚ@9tc$v3ۦڍrxT[OH_hV@d%,>X !2OVwLr&;,7 m+ߒ6@ú;|& e8DfGr/:N+@B.-qн }x)bGxhR͌/1؜;e1F)hRUwyp\V,d.kRgjXˎCBwm7<i%n"G/h Ia nʃ.+Uh&2X{y (8.b196" b/$e'ȝA:G0a>hRU y#csOH+ u_9:ר^7M*y{i, B 8&GĎÖg8ֲBOoi0Nldb٦(ڶ-d~p#`g\ڧ9,.Â>gG4B/xdV{JEa kZ'zTs\ч5ZU[!ѐlW!J Ӈ9mq|X-+!yV}}Gqz,-XI=Aŷ,9<>QOCN(5BxZww[˿U=?u߹%bk_ay7N^ux'W_?MgVlGb'˽wqVݴU>(gحZN;ԇ׬(h4PUYh;؆qX'O3 pʁtTG&S4iHɋ% b'í_]owYΐWxu&|2z UVr<g‡?q|m7j!,ȖZofl{Z?G G> xΗşCG˸`%NυSoūeSmHK%)IZl6~s7it@z$-]zlnߠ-'zOI՚͝8w*tt,&F4I'xTɇ<H1NM+>.l~vw΃ƀk<R79l>+ 꿔i,P#\Kx֋\|h7O7°'~u!\O`VZ չS366\8>궥>,7 7/~Rݝ FķA+ձ Vhʼ$I*UJu g 0֬kdÂzYsUI6gғ.%YwnS6ɪ8w*tGwNd. lf*Vjr=c\:pirМ!`9ήɜʣ1}wv?D8mRM EV;Xq)cW_Hރ yKb뙡 [tܟPM,Yf+*2kyw6#^':F9llm~u8+a9عYOd'd=!iWz+\;u񦳴;u8;Q=۬kr^wI.ft>X3B|!9^ߺT&XBљak'Fl7zkas":ae0l+E[Ԯ=rEoLd2:H Uѕu']g Z؜JtnpXQH0q,X$?N?-¤sjf(\3qއqh{2kg[7yXxY]R'F"*LnqXI!_Ch-P]fvؓ DCXzFI?- 6wؼb6i EU OU `6r.g3r6w⎴]"iB;Z,3C2혨/ ;I~5:N9람9jo2M*Ԍ^#I,w3HC!zlm޷.,!{B 2J`m5F9랴MяߣXӌL(eK$x/Ȃ C%-|+M*PꡠI)M*ζD9p^ R[aw 'zO}s _>[?`>};e0@nek9j를+.Cݓݸ'Ꞁif&U+#23Ӣ`si,t͗C⥭ğgk^Ў'oz|p݈r'Ĩ"$LEc/Y(iS{=6{螠Oۦ׏:GC;uOF3oi憦g~,I8E?hR9|z,QYg5PbMCYM*TYXI@UTT*ny/I {"9 *څmzcs:ZsbQ}lݓ"eeO}jYBB",lr ~(J/MG[s_?ZG s6=tQ:)@J5m.Qh:c{\eI^fXf)VnHGDuL6Ꚑya#2XJYC{S̸ąAYO"o Qh׹؜J>!p{L>@>eeuOgchf|,^/Anq}LݓљjbQ0%{2ѕL_v9&ߑ3Hj=|&>~H mnl>OBTؼ?'޺wda{5:ӘоsWN͓@qZ\/tJ߂uT#E~O6¨ͪ}"§xgE1R"csITCNűSYĻwvs"#䋹aUL@lGJ=˜=DIjtO1aHaeoy֟pƶx=N=tOUm=!lیh5+M]A&Rbcsy״Ic57rg_K}+&`L,7ۿ@53nmv&UCĞ/o M*=y҅~o7;tF N9y4/&;ёw=6f˪{| ˡrzvaNߚӳc'_;zd2GVd7/q6 mG༃ӃDYMg 4٬a9^ֿ%T'y<>% [n}z32lC$WDiPs;RhYøsyc$31Un{r:>-kG}DasvUL8 8΂ꎔ4f0-FuΧus)zFsZ8 .Gg{lÕ˿9ݺ׬alKXםuTBO"ʷ\ĉpp9#e oah7i[>#9o{MP?P'RΛcp@،dЫ,4D %jTy4*4Ӥ; h0mn:IF(26x(O5NƐDO^7WF!_͠H;bod>Iy+ĚIIn^`ŗU;b`s)& Wha^nP7!ݓE̳*^?ln-֤}6|y2;"g[:yarIgI(K>In1M':F뱩ckZ}cc> k4BYZ3GbLb=o=gk=BD50ib6 +pPU<cs&UFd1dAZ6*>\> (7^Tc}cs/q1dk+f7(UN. V:b<|p42{Z{"qgXɮaLxͥTi0@ׇ:@wRwH}(PItiS7'a)]V{ln>ڸ;'<..S&c;8= Q޵2pPgLؼ.ҤBx܅߂U!cjR&UZDp[ѭëls9ZI.PYiЊBDsm:Qh_Plbh?'i5؜$Vŀ .OO|* !ʋ%p^WhRyu\k!,TTCg?.B+f́c7>RZ ,x5¸C6qÛG ei55a˶ͣ?~"Z?L@= Vםν»7U2 .$t^6C0>Ϟ랐\֠6)Lcñ=زbw10>YeMͣR$y~#FD*4k~2};7m+@k^fsO÷Y;\I=l?Qݻ!Xx0i-k:xfbswxB_vln.}u> uY1ӤJ鞨:y_77rR-RD&އ1G;k4iee2f||%vsqzl&=|Gf q9qR:;My8:&Ѭhvh4&oG~{*h'7Krupu`=65=|{lfz{+_}& vP އSc7gy7n(ps !FJ`!>ӿvn<&JؼuO|۹ͫj~l_UqdF)C& {L[ݸ|ۧgl^CI׺kgŞ9Z{"JOgBzN kEp޺'-\$ks4ћP[zl=DRŞg~Z7s6yldPs&t!a.,Ӆkn|uOR7̰T ?$ѳŵ"r6T(&0w.LŊbr/1*5]g~PI[be)bO]>˫=Tu+yW|*$ 7@'ӷ}|?+ۏSIu-^B))X̳{s #+(zdzr{Pw&U$ l"Ke0:1Pv~N(a%EH&E}fxza*}+v/A/ERتMXl6g7S)rHO^7^ҚT;Y+',ѤJI°.6ܴ;Hw$`~֍i4 ݓ槛ꖑPFaPJv%~MXT9f3LvIElmT$貌X09sՍi>n|D}Es3cweBU6u" i :nL]uc>7?GXȇ&%8%8a^,TF{7&#g>K8~l"kReuOpH:JiRF/IU& #,$̢0LsNO[mcsIZJ(BU 6gP۝R0csaSTC( 2M*6eK $ó@szHelJD +A/:AE(YI[6&O!:'⪸r$wE !\u Uܠ&I=67humZ󽘎kR ~Yv鞈oI&@EEbkQxxa U=65#_2csI1vKnVA☝BUͩἉ1Ofѱ_~uY`3#{֤"3; Uއva=獧ью_vYttO$RCcTKn PEi(T pco;.=f&}{|HbOΛjNn710i>%#[=m.cYwXp16'c5t}glΛ&&EDX4uOt, @I7CnEF:?7&heh(!|Maz oD9l&Rw>m]Ǵct1x8Y (LY,QjɓDY6kg,oYρ_=:4;i>?ǴL;5?csuM"a".&aUu)e!.kNep_#f&[Yy@w#G5ZdNj]ػ@hjM*ԖMOJH/Kռx¿]K[?) ͽ&RuX*|%z",9%e+)h7΄Ό 9` 0yo>-\f&0N#R3"iR퀞,L^JuDlƏ̱y_ >6޽{y19VP,@WXn֤ڣzULU$\ V>ˏ uvgF&|N6~\[Y5~u.r`'ÚTex;iRqjNIyTBN&G-yqZ~5?5MdܑT-Es׷2]1I_PM*IQp4T* U +csܥ};uhXY. 3L/7{.dw`0vy,fg1_w?uON_5?9YM(4@:IҤ&U@hI5Ѥ2{fi љ$1Q5y1;y+5K5Mb'VQM0|&&ۉJX+36 Տ)mns@pEÂbHK\0b/ll1Ymc .L~Z?j|O4M"QG 5 Ѥ&،Z Ōe B'Kؼ?u??Mc⯥bJ "sdn+ K%b"β(|,3M :M*WG@%7^&WXM1:@9oN<%ΉLNg#GC-f`Yo;C6SGqjnoүlx|u'r99M*Wψ =M*!#9${76yN:lM~xc?}kM(v$tSうI$EypdQGXd7UT`44ӁЎJX9uzFlnΗ3%Q zwqn!qs ^bB'g٪WTAy 0;?,"+0|6>_^U u&UN4D+XJRsDhRQ(>KpYN FM뱙΁}}.Mv&lҞmʖ#\uq-E^B9ew k4ߣ@I{ ؼalVV_Á#( pb7YKgA$hҪ[F+7z,63WFO5f΋ߊjͣb3?s UdM XjRuf*bIY&9դoݓSM(`:\l7o:,5(|vf̞ uo\ OcnNx|MMԨ[za+(RfQ>ԙ5[6VwxBV*KeJiHyaQ%fdGβJǒ:=cӤ ѥxnocxArfcp\^O!u}0\u?lik{Ӓn4݁w]б,sZb TY`Rq@,"0)b{oW_}Ͻ%=6lZ z7&@q@3 qY0bDW+uOf{a7SQxrsf[> o_}ijwC򙝊@|fmaMK*;GAZΌ1rjWy뼓;N]䮤3asw|฼ 5'{a A(8$GsTU'l>Kq`5N0vj2%9>ܝk΋Xqzl.l3qyU'Ǭ3v ZNvE'Vj~Z]9N3Xv+QFEX;/bwrǹTImN'j)"C;m1w ˫[{̓U~b7+FԤ 3F@hd7a6:esja0j^9{bqAT~"IvHI@r<8ȋ("朜̱.li3tOC޷g'ɣW6>5 5'Y{aoV;1v5$Y߆ifUBI9*ȨvsGĎcw@,Q_~T:Lx2Sg<{as9 r7AxH%3Dxrd޽/^s9P;1o޾c\TRߜ6TJțHR oV:SiM*dw#9(Y=0lHB ~GhXsYEODNm Lɞgi˙.:4=qY`= CN9‹4PI#JBH2ioEnje]͂H17s-i4 [E2, ):stϺi"}b G=G%x9;֎Izl6؜7S :sR#bQXb L)O۰sTSHN4*]ΑLLJ C ӂ40An}ڷ_,~(4ե WL({M1j,Z~a-IiU.Ox2x 7Zka#'?fym/5VCؘcsu;i GXTR,']rmV|6\GYim rوhՌϡ`V>V3R5PnwuQY@t=uLRM^1kJDLD͗K}9 l\YoщmmH緥lK@l|mN)'7I;7؎8؂a -yXbovYgpOJvgQa9朎O FIIp<H"+JB=,㞣ÑwT̋}O$\$7e%K4ZS? 9>sy 6&hx_P +n޵n;i~6_ 9zG:X,c=6bgsW>C(aFT`6s0U˱,e~ 1U߬ge<2tUY,f,؜ϒfF+E4A΃Dy#HyK @+l*FubJr1$؃@Gb\>*1@7he3F$Gq v3u 5PǎBnf@лKw]? ^\Ge+\{,e!Ż gǒ 2~,7G5qcs(6[>5π/n>v ms]xy{B0-z'[p}o#n&9@,S<ЉIqGV>/Rq k+R;]%=JZ$́v{q@k7kQϙoTDģLB:$I8l ~-d$z3Jah+/b7o?0ؽuugíz'8ܽ̋88:+^)[v?άJoʻqI7W$!YA:"}l7#Xv3j :gQGX͠)HKt^6Ab3k9mHjӍcs6/?fnvA"I}%ԃrvf''_5͵9; (ۿ+@>o<; <k”>{n/;0§q|ts⌱C6kR'Ru7=Iڠ ͩmr<ꃭTUѲщoYP1b&38$]˩=e~zq26wۘ,yo,u%܇iȼMp\ d~7Ye8Pw_pL4ۿoDBl9lvV1n<"lȾ`3_Z{Fps΍7ޏkb&HKсuj;$dP?kfg9or {Z\fԏސ$}S Fڀ͙me< 6sJ7،b Ugf%17$߹vsݜH{KsfrdgZyZzqFPι;p\wfF[gwm9q$Ȕ8:D[Kksѭ- pa=e$+ |k aAsV j: K0NY#clϥ7%'JeK۔Aɪ@LҼrb7ZHBNRd:;Y|]%}uۑȵb͡l;b(>'lB W [t^uD)59ed^fml7\T |/%?Wߜ{2)O w_wvHN} b7 !7*,&q fYQ'c6FC9tgC*q#6C`Ru^) Se:̹T Q:D0xa] B[_K`}zz֙ϑ39֐iݼ|m%)R$GF>^02=]y>_]v!]wqq@lDdڻ1͗ZuϞk3wc7]'XSvqu$^eNLYʂ&f?3 43r_˵6$iOwܝ|H\yUhtFf5q0;=r״/9e +Mę1B@J[ftP3lBBd3c<7w[}ǀz/of?1˯|;,E 3#ؔf2:񳦦]X{PL0 `ƿ=͌ ωO[:fp b2r)sb<n| d%Z ܚ^@ DHDmk\q 9Λ`3\ut'2l&zCA,ԱkIrȱ+݄ % U)Ʒa"\V#nbèvsQ~X>_^#p-s W4 }Jف/K$$更?N氎 wP ޸8m`"͟F?6اa)4Y46a۪IPC7[;z :~d-;hX p\lqdyT6%6%TX#܂#`~oVPUyF&P c6 Ml 3OL]j1U؈l<\AopNכ[6ӤrS2/[Ej֧ H$>jbPU_e;ޏк! JY81ȑA╿w>63X̔v匠!fQ x*S;k;a fqkΕ3V$@gԋ`8sHyN>A>|=n#k8yӧxDMKW`n`4k^QkYgZJ~f\s7+J96sMNJU#AA;@λ搵 fG<?>וa…oFī[f?3;3Wx@X58y b_?֫Xܫz;,fp4G &eK\⬦L =㊦'NMdS2unuә"~\ '$d9nz6fbXG_bcs ]i i.) #/r&O3p.K·fN.ͦ㗟EfחP7r:z'$L? sC~e`6y͎K\PN)/w:Dhƅ7$}U@<:RNl 7 ;f湟|d۠U' ̒ <+,S0 {Y~\FqjHPFqYI݇/hR}!QgEMI4JXFSa s:gWGLFՋe./^wL7 9E'wO|SZv<2 I/=t nK8-u!7C4!nD`h_`{K; +09 l>\Z~Wh8 6?{aO_2Gcd75ys09BbA՝/n8Xe)ןQG52KlxBY$lԤV*M*VjR] IK,mDdr"#$VLb;t?ytl[ʈ'%*x]˥f`c!9ƂƏP_bc"/+VJD*OۼI.lO6b{y~%TpÎu@# :|vC-s?% $bn3Dviu'9rl`ם㿌a!#!vٸ#8Cp'EQKGZ 14ן**Ƙ~ s&0դ[W ĴդjmtFZ$Sr.i&U͒#5ZX,POJUCiThwC&MFyHԜZS6K'fq0l3JD"@ Z<t+͖ss?Aae< ԡ|t3×n:G7޸i"P b0Mg%u UL8.67ҤBФ&hR }R*HLRْ%XUoV ֱQg7O$w)(q]qA[-iqiY`sYM\5zlӚTwB=~M7͘of~'VY`wpx?uwp1#ዛ "l5#y4Cv3J/_(L"`3]Lݒs9DΓѤT 7 WŖ a+-9,plIĔK~SɦU ]a9m7g Q|v)B2UR ? D84kJW:[Lpc3|i/>6\׶yfe~9*TPz 7,s3bP,Ӡm~ 埖98"#] n68`4P:+rnވߓ侧C!5f`i4o6)dـBA4igƕ![rT]yH X{lv-ɫ` hئg[ve1`6'ITf+J dfn_$|N٢csg20Ӡ[3/7RV:Jȱ@_H. 뜑f] l&lhy@RF6}fӵ_B HS"f "zlvɫĂM̾Y_ӚmL܍O%, J!Z2dS(E 1ԠhD^XDՉFy}9Aifq5/#*W+x4,΍$b6[?r4y^jh7|bQ wpTJ!*=6{+X@M*fRWtDQmRjHoɌVkJ +u=R]ynQ~zlfDBd[H5v$JqA:gDZJąTQ!"LW mi36tl7724FyͧKd1rchTol>g捐 (ѵnm«@EY~0-m(\ɘz*٦LPy4x*R9HlX~9M^#wLmw\X (휦s>gAQaraun"͝EE( TY߬7# j_"+7V24 9]1.d> 9Q = CE+豙NS~99M*ԕ8J.#!|j$7s]LE 9 MMZ\CMgxiLG6qz5U"ֵa9a"Lߌ I~!K0鵤kKb3(dbԠ︚MSc.$tI!=T"y )} 4u66)% Sg,@lL>C<& |e~w]Z{)S:W%HK4EFfv9g=MF^ا! 6' `J#6$U=<3 l dTMnQu;MV̀a`4)*b8װwl֬v!eqy'YnKZdqvHDIsulF*acÄccBi)T٪gvb,aܝ|HܘWAzw72)(S >͜ޞT݌u"{r@u5 vBIR68Ӓ ZX`xzVoyNBy FSݦBlBN$T(UuUOPUh%; T̡ϼNd.V|{ S~ =D3 ]`"^ &;Ĥk/ȳ,63\S1ص:r\4:4C9_};G,eœU80nvYI5(˛p>#OCɟCՌ 'XtM FzR{"/$VLͧKd1@-ߣcIjB%(*a3>|#o:+kU\c2&T #q(I\ϫ`Aii!w{e?-S{z27Zg9ef'g0Ɨ4WvͿ+/4Vqʳ]Ч[+,.^'&cww֮t6{&l|Zdk*s4;grd h/'N~6ьSbKs Mo 6#cs-GE{CB^)& [0|:~9hf>шazq34QLUv=d7.T)Y|.7WlHvYnn$(o&`~7꒟cJM! C$H@Xҝ5Cɸ8^Nfh+1۹csQ] KSM&69oDj ʱ9:KQ̧9f˭O.$^X^$n@1Kkv`pfc,[YϩI k<ϻ父@^mNdڃaP Ԝ2J}h]P9VB 5&ͮͭ>/YYfW$ʨFIɐȠ=mJ M!PvR4е̭;(~ )*ilHKRM*5.^sedAU9!_PlNnv] Tl٬CnƝvi9e6smxaI8j$7oLBr}$S Z~OVd:լlȠtIt]s9a9zn8_{i M*oM*֯h~ C*(F[i$``'[Hl:$fx&+ݏ\ 6͓ҵ.?gAi&`2#n~Eoz,nfN0t7i㾰>/I>'̨ui3[h7{^ʻɢfs,JB 5weZe=p}f_2Imv]4vҬ͑:Un $KI"bza9=UWJg0g 7eƫ1ͽIͰ54oO A"c?EQHkcEbMJ! s4,&N.Q(Ks? DqCDksi:HUTDn zA36Yc'SB\ Ѩ矲wD JsTp+&OTz|+"( lJ9;Ceqdr˦j͡l 27Irk}~ H|ѧk3'a[os$ 9`/}vDiy7o:Kw:33aw֗(\ϭ?M9[P "7#wO-olU֩z#bVgd2Fsf?8!x}өy'hWG5nff<}fp $*޼q{#v7t^\ؽuxFq4MUȝ[I-ގ܂yJ'{!TO-EE?ź's6VO,}ctضcSl mz\S7$$v7[?ВYע޵&^nSy꫃ŏVk7k(W33Q$wέ{#рav3}[5W yDY5S/\\,MRe^ ޔ鉥ne Å3 ΰK@y$xTbCqmQC-9>GlfřͰ9V*t?`ͫBi\ P93|"7XRj݌OhũkͱYgJ';P=Je"B`,*`}K,F0?-Yzlv&S{B{߷Ab!sY=1 #5ؚ(bxo65b 2VJb idla ӡfdP͡浟C Zx R54O4yp0w2v߀hK<"g5Ҁxq`+=ʛv^E]2{ݳAQZUX3"?YZ8Xc-(`gj[d!'9-ศu-F/0QΙ0c:TE|l:ki &.fq%q,C ZdC)D |ₐV6HNXr}r*S+bw,f | Nv3N|Vvq-/ͺTtOqIB1+qFrh6Պ@3 QcVulͽwAIz-?Hۋٸ48.Oe-rmE0ْZj7g!:WŐO39xhC'[c>bY*aԐ,GK3Z*ct[EӰ\RÌ) 8?WDa!(>Lrh|Zge?%'y>npeDO{a-K*^k6{ թԇUn:#&mwRVmlvĊ.ovswsyr۲d>#{;&&kM%5ꞈL*D|vsA>3Y}3k9lj*H͎wߨ1!Y u^`91Ewh.JkjO4Y2U 0. Q Yi8Bi~Uҥm"=0z#fmE5wi1GJIL!TBPח2AjtةշnZ}/xePjTre b rVg'<%tShACD?,ஈ^ߠR_6ol?yM:P͎,ƳI(]83ѳmf(n%p4BΣij~6D4C~7U=ٮw^L{\$,5:b a6W96}@A>BPVE3I 9<xIh 2fj؜)>7ȗQh*,O#]-R+u64HhlZf@iѰ`4j77qtOڌU$-6\(jvK6j1Av$6uXZWw} ^q6har$ף?_ VÀ$]Lַ!!L'YuYas |asi>Èe!0$V$)KNla^%!hKllnra056h=}_}SCkZZ%^Օ 틷[_7ovַNϩW_NWU?oBekz^ɩ͛d==5nĜjSt"U6d=.N_hs5͑"#H19 6g, R҆`D0yTJ91 ,ïDg:sT#0Y}%Is02i) ;2 lu8NսW2)9e9-e9&8ae!@[pY7N"C쉴򊎗2uDF9{’=49cFy i9<)njي?dHОQAc5{2w`:r$fUBLnu/P]u҉<:#Z lmf3`${ 2s U :=6hRdž%Uca)Mh`c8@,Qh+A*+`YȃrXْ8"R H{(PnJw\gJx>L41it5 qz_ y䑟ctO@9Al3VIZzJH%4M\b=6Wb6%~ +Ș3A?-yBb|UfK^mq[fˊ,AtV'6T4\{’=d=sƪrJ`崛$-Y)nw"< tyFi~,sudH̼ŀyճFꃗ W7ڻOߕD {Ipև$l$) . :l3h΂3I d>&#Iu@T?k 6;GsS]mىs 4ӨP;v &rfd!w F#{Nc-'"éȽqRtIi9Ձd[i+w$:csO/93ӋayAY7A_،|<aXܝKJ0vtYs:zl X9O Ŭ" ;)G-)"6l;*܋d4B[۫^ Zഉ|kQ:*u5 0yNʭO r]\X^$n*Ѯ ,0 rX0! OFLDAunVs\yfk>4ZR'=G/;Tb3y]:f_q`8hz}.G#h6S/8a.DN#~%JF'A ߀(6s1\49M;D61>#wL%hEmBbe]-mnNˊ1{q7 C]Jv$`4&T6艡lx4 I$yƌa ZqfBc [4THNp=AX)F{?WrL}QߢMÕc*`XB VٚЎ=SDO^NkBKx;Q׀E((x_yN 򄥰Tt  c*e63̡]iKe)II'$݉.wE-uE6w'!-47]Ҟ7Ldn[VGxa!I%%ɧSp$__ c24 +f(#严ynb2{4jaɊvY\I"b[wsvc5nlSU7eH25ĭ72LȦhvil'8!B2x_X) 3[jUbOII9Fm~6w(!/{ӤJtU{۪?݋kVbW$cɼ̅ ,|uax;#Nk2,԰&N hke;$ >-H{s18œ4$(Y *vd6~į(x8nܖlGiئ|*=Wk1~FEPU`WڶxY)d " U ذSPݐY}ɾ/63TjRplj:Gl{_Z1yʍ3QmUUELUi(х@G߼ ؊D Ƒ bHfQ24"_) vƮr=i\onGV֪I2c첒?ltO$YfM[of t,BVsmX aĸMq85ᙬd7.A~ 2MđPlў^Uks=pcsniX 18U2{Z9h*u/'gmz9@2&! e-NnpC똺XԮk^[SVr y_sZzb71Nu^Lf7sFjפe3q4U6+Fh g7nKp7fs d_JDeKtORT +H˔cs 6?uM(rkr/ԫ`UE7ͼd'WMKmϿ""wW8nF.?Jq5vǜ)+qbIn4I,afWd!drϙԃY`fb>rNvi\͹| M*N^5{l6g ԒN, bH $ l%ͫa`U86͙vshEڙ;ٶ]m~o&~l2q4f"wik.4iuOMø5L]`Yնd%&ĥ3Ugj#dn-n<f9r$sq-&$/0.ǕʵBج' tx)YQm?pzǘjB\aW|de%l7g3Ln -Ӥe \rgȁLji&;S 6s1m}Β9VUs~̮TFUF<5<$=6c (Z4Cso@1eRXM3i.PgYsInvs6[ӧ_!r Zo~~N'| oUZ*^蝬֫|}~7 zo^~vϩW_{׷^y[.ɹSVfvȩU}Lk(=b]8>hdyN}n ]t+[=&ucsٰ?rsY"#B o+]Ґph.i/iX%)}ɽoG}-wU^[X͡ج E'H3$e1j%mIj-:8jsqDrR|Nf7Kk>랜-H؜֥?9х ERm<,"i2k\SJ7eL|`ݸ/NDi,S9]+!7-:\=6buVvU$UuEp2.]:mx svsIgLݓ=ۢIĊOWX3̉Z& G'bb /=7lo_X(=ƣc|Q-I0e : KwAPnk[ >A 9IuKce+YJFro(֓.G Q̺бvv4=&uiiRtO0)<6eQvIC@5?lQ&$M xg+6Կqb5ږ6t"~1鼖z ߑOct.( FѦ M;yH8j`KPWp3)Or`r6Ob~.ܝQ^Ȕ![ΦPݜ{r(I>,& U[q",MN㻨bBc-р\zJܒ`@o!Ҷ 1 *=uцW~o"lD4i;j) Fgٵ6np˹׶x[;?|Y)l΄$? 7-+9 ӉC c~ ʕb1cBe9|a88}=,Jͯu5 {E38`4-YBˤ!c4oʩrlXܒH@45W+eD!sT3N!ܵ ;{_2K/mP~>WϭzR/E`a4 "Zdp3º܏: ̎3Z ńNMKsY!R '41X9OV]< I"wϴ𥰂R %-9p8 6\V]oNJ d!&щ\dO׿ɵ5Ge&G~n}.[>ѝB%uږ.wA$Ίc7Iwno>J>@ټs+c㫷f0W129"ziP >Y+D4iO<\X hĊ d!&щ\TNԿ tb"ߛUM< z$-&*[LBjfi~/m/`&șώ^Z{Fps΍C26>T:EvͻP" Jaa<ɡqavs&U^v qA;F<ͯߛP q߻mj rN<m~fM KS&(̅ ,|Đ\&;Nkw#c8m3ME0 Er5X#=?v3P kzPSntr/ɩ4^ X >]u4I p3bykD]8 ۱M1ڶs7ϭiY|st"<ѓD1d=[ϑ9T԰ya2%' 6Yxc7rI%u%v2O[w o9!wl: 94{V/0IU;TZ m:u>Չ7,5vu[/kʅc2kLMb{-.7bli}vE6wٷg}\޿e߮~h/p|1RK{)ODN. w  }[1^gg>{ڿ߫lYϱIMS'hh22"̰p,&h^n ӠV1Ǎ;G۲Pȭh.cG Yߦ{ Ѥ!. %Yb[W :;ǩ7gqP4Lٱ?|-΄2yp\v$-'9qu7+Wh7IY[V{g@=x=6;iu}zmMC3ax%ne Eg lXB ]&)wa;vgFB|Tj O JEа/}x5YJ^yZ^#XZ#{V.}>DϬrjRc>Q| R IU#eFYoI[WvYS&+wً $kTHUrAɹK5NR4$},oͥ5S=_\XZtSR,E,4wæS+{EETe<6ն@ B %ۿ'&3OiSm&5cE ;8kުkʇIH25r:bl`$-vw \C|tuOg2S~<JcsvVTccǧ$֤*yז݇/mS_l(=)ԤḰvFdn.դtOZin\ ҉:G:MCT#f4؏uwF3[R1aX1eN׿\V=[i5oRD{sqq3.fR`c-'`[-5'BW)|2ИPLNևg4Gx|48rWL})'6 r!/i .+<4Bn "xUGl1Of>\:~Ǵ|~{?6gnn${kShkKbP[@[jV@s䇐2.3DYݓ M*HiRm ͍|[VG7C kv-G8DnE+5ӧy=Ĩޡ =ݹGJ~NC3٬|aN_wK9=Ѥ*{1E.@eo5M**'p"n6ta?X^6y(&z邅Ti ^Ry:7PPd6MXw]^`ijaI c&<~Xs3{$i$`BtA}A J[1Jm h(~oͥAa|I>$-Vͯ=69mk8s:< %$yٚW;G[)sN N߳9.XQ.e:Ͷj'{6WP~}j c> 39I%yٺoy~>AU/v +H(*IHMz>{{)}@)ŝJ2*"lקefg'oHI,$yĠs^l:Bl~2A;=zl7*o|'uSޞS8s/̊O9Xc!pvcvw%WRh7 XJ>fs#[{^/׿챹F`Lbl>0~6،|'Ry`*) ʴd?'ڄƐc_n.'XDȥ1zKMx(g tנ]2oݏ#y9ZƫQiPԌf6HqzxLb5o1lUBKȰ9_)j&P$& .8-g.G5̥6w9 gN#pbOwY_ģQl6ŰYy^fņPowuO *X( e&X@ /pDZ96ຄW jڂ&(i8_0l:#T˼/?y sq.+2hc^*UBH{ L heB [¥{瘶pK {2[T{uCB#$݇ 5t'}; 2QIl|^o΋[#`7۾Ǐ OkuOH,Nf}%RkJĦo.G+~H`?i wHS=rC &ϣ%>R}I,aemYq xf^ek#ќ )`a{#;ڐ0C TGOeMрo9ۻ #QC{QޏX}۪=JgV_d/csVʺ,/s'{>l+h9oP˫ "Jd>yK8/%фqh:AVTasEDVFD+|*6;E_rUGc*zG7@y?L=SQl7Ojtk>{"6DAp#7\\0:`ºx`bx|汎<(W61BÇMgkjdD"?'Wz: 9=`{ a# C@~n x@t)h:G ӎc'6o(6&k~(ϙԋWVfy&\> 4Xv9 :|xۈ]7DLk왍ѠSN=6K7<fRX&Y~t3peinΌ8>6pFlO!$& PB0ظ$7Kuacv뱹}T焍vfjyb{i>豹xhRl k,1 @bi4X{l kɁs\O쟩O[!GHtO.m?,I:גKhM 䔦(Gf-޺1=l7Qo77i =_6X0- Q?/gNReè+c0 zlnU@N߻2kd&3|cd YZc9ot.Ymii|F ylܬfgWq;Dh=k&6:[kR% TdY֚]VBhYo>\>̨弜i$o;/ص-zl.39CD@8l F [Gm,ZeY{ΊO;/bwr鱹;;=y8`QT^~OjMY]^/ ~ B^u1,81!SIš@j њNf=s?v'[^gF9og ?Exk:؜irݓojRS);{ln7{sss 9. Ep6e=;/seWcsq˔XM*6 țFځ.cVo1??7gI22*E~bx-!4;/:qcsIt"8Pr[ܜ! a?Ӵ x7hU\VegH4 j}`-wHG_9ch(9 EmTDԢ"$Sݩ693oԗؙw\csa|`ݳs]t>ӹ: 9^=6?k;ykY{9j΋'zlH3q1*3k3ycs{46U"$/qR)h߼ rB7|ۧz}=6\W뱹=c{Ukڳ P{N_j˜%(|򦳡C[՞qxD䦕k ?HG\ec=Gtwi@1[h헒zl43i%랐~ y< @ 'DL8 6߂ aBSj96!-F3FܙܨSlt{à=*ټ BgFLL+ ~ m pNrި$Y-is33i3Sb{l.l^DKDd 7r^f,Nf}E.W7g᪲B7BRB/4ith<76[]csvTD (X[?ju'0n-Bdج@QGXLD4tZ|'$3SYZ\cs+=mP˯zP0ꞰM\*p`nQGa\6,$=pmj>nO0&:czl僯COGA͑%[T }u"DDK^MzL{dd [|`6ǻ2^e9yXfŷ}N2;g,Gtz"EJ! u4һa6Ӳy0ʱ0n(6w '-l%Dz!sT֊Dā;'N[OB 9,Ӣ tmuw<q?4?|Sf*G_4Xm0㙃N 1q|~NVWc+ nn-?l!lK)=ᤅ{%9Y 6@x6TZcH ?ciQFzZw^t ^P56߶9??;~`mO2y7}6?_>oU<2[c YM`7?og3/{'om_QPNUGwjrލl7^]w \-t|E@Ub7;elv{81Cxf 2O&t``3 $b{0.6 uO(`9< RaN)Q b"1csƟC9k yѹ/P{Aodf2Oo>T1yvw|b޾~;o;,= cvyg o}0fD?c+bsOٝ|/^g7`B[9:˞i|gb6>ot|{R| b>42˽u3 4t`6#^W{~-d=lݜ:<O 'M'O{'ef'~ إ`9ϫ)ckc|,eOY,p=x=67f]{lr\'6#qC̈́a#?a>X[sކfs? 5@?e+榰Yn=o}(7!㤻> ;Fî,Ư,p%%yV6|V?p7URvȱ/4ФZ;oLJ=s^Oe36ݔݜ4oV'O nė^͕y3=] 2we4Vo 1 #fiP7o .ov6?d,g|+ܭ?DT!l9̧!lƗ7獡T8N9QэY{;=6MlnjsoL6>/Q2\n 2&uOYf씧~4lj}Fh-P:u xDv|~E6Cq/n٩.d;L+ﱹ]ϧqw7C'HH=Na34c76\7l/ tq!-[}ttocz 6h͝gO+HLKb]GlKiJ ﺊXȲ3;*vaWM {o}=:~]]sӺ{{oC JKc\2a1aQo/jZnq]d9aV>CQcIҠ<M+qs"DO^G'[iSK#Np TngxsAVsf^g64?H4&/il3,|JfӸ5K7ԯT-ig-|b-%RͣgO#,>g: rNl PY'+""UR Mե{޸/&upm3cֶsfꮷЙiyV6K*K>~^/=f4>(RH\{@J0 LwO̷}:3^#_xn=?2K@K/~}l$g`R]l|`].U݌ԕ(.t 3몣"%,#f'^5 b'bMjToDwRf402ϥ-4Ɩ3ŷ}&sU?xn9?G9w~iC3k_qΉ51.~}l6 {L"`&.P^B6avR ]jm眼F{vŁH sQ?|X'Η6#иy~W [3,n #虶҃cJ;Է}&zqkIuR챹NCs4̍1}w^@f.]>ǟ;591w.~ﱹsw =v=ZOw@;`byft`,7ݾcUhԬF2c5(u'c}qVƲy&7{tYϱw^:䎓kao?XER[UuVƲ Uh-N>i>s"j|-з}}jVs=^(Z. ,@/ 7?i/g~ {tNn=+cw *4kS"$bi9+phD$V2c)lw Y> nYkq~@ۜZٹ}ǥ<2}Ǡ7TLX„ND^|́ Tߩ C$ RJ:Z)?żSշ}<]gw/~wh0de"3Zf2р2 &0Zz{øB._~l,J>UqH$K8A@ utiX_wVըfc$#8"pf/_V'qseVsG kj{4P^=ez &(mӼ ԩ~u.%3A^Fz"~2:=!fgT{ۜ4'!#VTRc:b<* ];άXv͏;4Y@s\6NgFej69}׊}γ;yD I^mv螀ҝmX[PePjMUU~,QrdVsٟA k7W4ưA6Հ&[J X6v3Jʕa<9Y[hf2 8] `(bR;m'"av36KDM(H"m )IRPbpO5{w>?g*ݚ`sKhr6 ŵ+Rf2o6RV33r6NgvMf眴/of6N.rk3H8{bBy^,ANAP'4#ɑ,TK"mHJePH%j$UiAsw<{twͧi$pa܂q#VoH5x#X{lugof03$L$4g04!2%#4p-l/mWn~\d8{3h%TP(A߶҃Sͭ\>SVO9iG=xͧ,{!|?af6;yb0?gƋW$jYY1n0h}[}-$c# ̈́7zg_#l.0}8/ TM9 vܾ({zln~TtG]l6@fI m7@608 5; ҉Y€^ Ml2ꨍ^෱ g|1(qh!csmdW9=G>&/]=7w 67coo[,0N#s }VW~jxBHFb߅f1ܔՑk"7n&pf=r ʩ cqf)g-t ϙNDwffF P~P7vyl+Tl>sw!YDgjLaB4Xv]%fhNW6Gź' 6ArW7޸nn2X&4KTp_F08 ]sQpl)+kͦ(TVj@M0 gz.llSo|OG|iӰG,=PJTe\C~ﱹ&#yiҊ]ڦ f3 p?kXofl^ syXV_M'@}ɭrk7X>$q4g:;irߖvR=67u8&Z(yW50Όͻ?1IV[6 qa(llvR-E6D|_ϽcJ+h豹Y;Vfo,foFﯾ{L yg5+iU g*=bA23V 2CÀz9`MOmb95{Mٙ>WcOk¶EvsVKNt͕+|-?$dP h~xk"c;f$89jSk6f[fE{RYkfigrV\t`z#C/|T{"306nh5MRD:uh ֺeȔtN~+cs͗*fNWd2M ffڄi茂8mKN]f3rYW<>z`IY &JNTGtLJcsS-(i( < uf59NjMpP֦l #`!H5-c@|ʣ֜JPV-`ﱹf2;VBj%O08'*C%%$Cai6ST6Cf:Yzf`7{?}:ԗF/2c*"Fe|ʰﱹ OZop=Φ>0qk1fu%lGPBdH7kX]PBF@lL>/DἹvGnG 2\`n?|9DZxUֺ+0]^oN},,<jTb&D0V&'&en7I3Ȝ7TɚT{dʢ1Hj~zlhzM>?gJC4RxALd1W1uZލU*i.IpC|6w(!6k8T&N#UQÓ7}tOX{"f|+ (߭&U翃^^XͪMrٔfkzP7K,J%14ġ!3\Q  *W/63kR\d`JF\|`ݳmCMjRq;뙔NXv^\u%ϔ.6Ѥr->?.=c7ܕϰ 6\8vǯo TՁB^t9%(*F%($L ߆IHB;ۥ\@dnqvŞ?ΛF}MgYGjxr\ObHT^Gm-kR9 vg w Ʊwaqan5 2:v59Y,1 (3͉LN׬zf)v|Tɞ9TRՃW~%Y|ǹ.>]1mM>?'F/(]صf&͘ޟGݪg,??\78C$`nk:۩ tBQfm5ӤڻqěP(Um==6g>?K&%ffH]/6We 12+ipflĐk0gK+a8#446)M*NKkR&`FH`豹z6s.Kb7od7_8(z< ƚ#ef)ږL:]6)t9AA諾% QWʦTPfȞa Ӥ&cJU0=<^{ޑ5c}Hl7Z8qO}ؽQb7@AiCw͕'&G7[M*i;yY~v0M*`3e3R1cso77>?I+6U|Z-ܠЧ:rfv-{Ri*Պ #83t+0猥܂g֤@gfJUzl =/9MZK MaFfc1LfIj˙_+h{Swg}:kX7loWo~{ 84!s3l끕9?[?:RU(H+j/rJCi.sxs2 *<ݹ tkl{ODi}Zyqfdw~ @- 6Blwms"3aʨSdf́ťl G439Kk3p47=*0D56;tK" v*ݓ:us?ci ର#w. +gKP pMxEt?~3qڤqzV~31V. Q,1[o4*9O+9LEykd⛗ۑzif6xW _'w~gЛHv}_N!ϫ+>:,YQ;sbs5>ul'gǛͨ=g(U_1 Ad6G*Ay.&foL5ۈ2/]2NJ(b;|Ƕ&WP2-|-kR^sS74CoV3Ia3,": ΙJgځKf *@fF҆{_LVULY$k@9_aǭEYN_tڸo&9[7, 8 D<>xwu=g1 Օk͸[91_d ڨi>b DQ;ֱn΃ †lr hQ;|WlO Ϯz;I~N7˾@X:8?O`EzizmD:Ҡh27grzc`xi^4V 2g:m9i `.@m. ](p_}2I~N2]!> vYmD}7m Tq~Q/3а\H[E6n_o=Aae;|W;dwOM䖽H~N): \&ҨfE89qj 8̈́*Y9*ܬ"i r#aZf yBeN OrUr gsD,\75@K`sa$j0 6'͡:ӣYrqs5 U~sDei0@q !wěK)-lxp(:9 nM ZjnkFy~kFL'P ~BsĂ5\Ut9ۂ ړ%\oH׆Ax"YMljF u4f7; fjIh}LYO!8f#ެ :uX#7s@j;Zf&9>=HwWEf&z[u#"`4>-ś3LǵWXS)Z|"^j`7S9˥S9(YCIS1#\͆._p ]8G Ǐlmi%#|m)0&vPV@!$([.{cx(``s{ن,1 Bvp3)o7g{Esl80>ěPYߞ\iJ\ͿsǷqre-J # (n_`@21 ءk46j: 6 6Q0?ެdU=OCeh%i3i<ҬP)YQhh:,|Qk7LC9|_企펷 _)/s<(Ɉ+tIV;s AM(#>Q@}#[gL<`ӠL hȲw tv0B HGLt@ Yslfh =7+` tO&Z7*Bt,kjW̮I5G.y^vnf#'O4G~^@5UBP PV=ogkdAOPoo( c<+ء%{b(Jf|d*jr=$:xO_T]ݒߌ21y~Bc I+fy;y;OC؏7]\ϠA9/sQ y0Tژ}-iR!ª9!r: Vam޹;H&cߧ΂ emkrX{j_>.Tj|;nHLͣ\4f@̌wk~-y KV@ͩ}a0zf"ֲ2z*W/1hs-q |jZk?pxkRDyʄǼ1l̀PCݫk&6�OAu L >Kg\as$x}| M>wwIH!J ˜ x`^> lOAob*2! Z<țoyބrGa#֙;_>:ԛoʹƪO`?lV#cV6ā? g-*}F^qpgih\YN.sn|Ǡ`s+sb+!r@A$KAR;ΊD =K'^ Pɓ] N@/΋uJZy*J b|U2cAɇݧ]\>7gD/y*QkD 1]+m C|އ N/#|&K_1|ˉi\nTAv՞܇͓a^@R!ٽGW3 +9Ea3+dQ@;T\#-ٿʅ6[*"i9 :biA uxJ$e<뷰aXf+e3>1 =3g4hiqVHK944|TbZ.<~i^홟nx ߂eO@* pwkB *fe|%_Sz?cȘd_ztzƴcZ 7(g4`pvpa >8l _SLp$w 6P{YBm0hqaS!!nq_b]XFإyBvw^ys_1>~_;*WmQKb:#$ƆuD.tX5X ?ֵ`DwUs9a苾Sloc6GSyPOV{j=Ҷ=q1Uc*[j&~ +0G/WncXB3՛Nf+J]1pȅW][{{lmW!|P`s  x3y6#{Cq72]w֮P4 ͋aJ Qx{h箉1˜y7%P+}SG9i۞rft GWNo),\]ٿ}E a f9fR ǫ`rʳLN`:S|>,JE(C,Fۚ5# ?YNM-ƛ)O~w﮽CoMxlkxrԅç>4E3{ I̽2 ŹYӕYN>!Q" s&iKVRaO韒߼vӟӧ!O? 9bۿ yxw}O*ʋrz{*"s~9\64ʠjrܣl&N/]AQFxϞlN7Bo}k;}W4g&U)RztAZdsr5=k@xBi@@'ml~w ݵӧOya\$ĽkpKi: 6BSRP3%'=w9B 3Z 7K YxΧ*ݓlΥ<191@Ŕ/bL߼l/Mg*ڀB̂Kp[_AwsFEly#yqtOW!VoX7Y[AL6"˃/҉ `׮qi)/U Ʌ+ ^vu73^VbT<,Mj)@~o{" gXW,-)068/XGiU.)z7c q#0lrr&v唾v)oǞ3y$7}i a.h-"$*) ,Mj)6yBXExzn{rZv 6 Tsq$g (BbhXL[`00(9Q66*gO[^|q}v?%T(]ȖYqhas}>LI({Y1(Q!JuO]AL&kW6 ̊+,&6+AuI nr)zAP$5XSy|4pf_b+oLC[r$cf?f:\ MPxp5Hь-ᅈ49jʍFͳ';:ç=gtQw 6Gd+=o@^]}F5mQcQo> &kb8 Yol\X\ \ g07<|ExYEFO5sdǥ/.<Ρhq1Vt"UF!!}W7#<3޳ߌ 6|Ǡ`sI~_*F(t@9N,kc(@*}yT\A!/M.e ` ^΋4{m^*x-"JyD}anff 0bUh~o+ѧf 3(PzsRͱ٭JߝysZٜU#:?G:KN)Vٰs8LXQx|GY-px|_-fr8s2 K`s vleF6ɁL?vNw7o͆1+82AxN*lQoif}/Fw^_ڼdzn,7zۚar3`3y͵TL n)RMٰy/[%#gޟg&e6J>n6FU§ 6Ulͣ!6'yÔ «l$tm_`q!7lhx/ajZ/[#ZF8~S6񜬮&3ŪǁpeTYͰ9|1y`W9vM* cjbs-/Vh=s\(R to qZ| 1u!ogP'ȗqOaP3Ne*t5ApZ9*jB5|Ewt%#$:M@XC᷉kr[q/@|LPlxs]>4ͮb>%^`;hRϩ3l`0;/ާ\H3k&3czY,_'i*PYUSF1JM*ENc|< 8o' wդϩ3IW@Eɜ\x;/mTo^on֟Ar_rs@n_X+h_Mj9} ˜K7[X3Yy56\yҥ̻`F}(;wnLc967h\'&GiB$34SV 2'~IG[lE}Xa7kR e+Uꡀxw 6G쌄nS'gB A r~I7 lQA#yV=^pEAfIGYSj6?ND'TB!sR/ڨ`s Kk{ʳz&mx`3y͵'y8/&؜xy7ώTe竣x-J{7X`AClN&OU@6&Uyvm4pWH~Ntw|6ՙ#T,yi~㊬J{%%cf؜N|=6i$jRUp~ߢ~{2?p}-c9%3L|[a6eN\:=H11(6}ns0|sIϩU/\c˒&vfGHʅq8[>1(:QL,U1AiRP ЫT-uAS@`9$K(d܃C34ledٰqoeo`spbE4s|DU~vNnټ%?`:{lqGѤ;]slo;/߾ꜱ9^6_tmGy1hgԨ͍̖E؜/1 1Ӿiö'«;"lcjux|m%39oL J`sҼUvlcuj̝L7 wiߛ.ĕ͆k4VWdv36I (@ W1e U|*!laŔc3ZgDA&k'! ~釟l]fk5ZB"Y9 6י^qiti$hnǭvt~4d>}׺<9oWƎbf ^6YAeLpb(_?6g& 1J=*0R$?'^+6әC)ڃ}qJ ըҶޤN j %ݓB>:-"U*5254AiI(l^Y&U"õ'~ `*Mn %yVTNFƌaLcY +LKEt6TyƦI!"qcݶIRDxd ]~]{8~T#Qi) ~ՐF)=s=R Ow^D2{j]yFDw`^iD7VSYJM*Sd %7 w քJ7FW}oW&:4 M#Wh- VӔkOOB|J%4{d]=rUϨ[p2۝g˺'9~()瞢*؍+iB^s4(~uOhPۨ}BYt b;+acІ ٗUu'v{W1?gs8AF*hI̢XӤU  XyZ|L.pI\Ȯ9'טk{_?lVwҤ*螐 >{ZR@odom;^;csv_}oa7w*+'n#W( $oi$΍iAJ\BNA- IcFj.\9TE e' 4-pcP9V&Ys VVjpjMN)M VO ]Y!= SwVw^ ;}VϠuOvLq!9CAA-Ԥ88^s 1(hUXm'VU&/lNl!Q~dx c@ "C%M޹;(@hZS.8oK1(ë#N~'?-!B;K /yVAmkP8H 4-&OJuCz}ִ`{1^ 6Y}>C;Tfx9Ew^OlvU?%}Ǡmkx-*?3ZZ2]k@Pw ھ&=%}ƉU{挿Bo|Ǡ*UXWG36'kF;7X>(67=^]j fLWlNxl1U9*/<+-GL(Ȅ㟲'| fæuOW! Z`sPs&Pk-3}BG"qkn{" dz#jLM2F+2>!6'_o q=^&H~N=>6[z$QOm 񼢏F{7. Ӊ斺'«z\OsB[lج7o~bЙVMORzɤ*SWf'«S;WĹD ΋DcN<JvjCEz~uuIU|Ǡm3Uk="+4%˝;&UMQ!!W}E{ w]֧!)E;5fn=ImDG $xw քW9|HfZ?T5\ }?C;/酐wqM*;F|kH* W?y 2+ (ãt\Qy'dduA67Rxt`GꞸjR8,jR!> %܈G$vKQ]EQ%΋!mI qfՖ*%>}dx. n4KSlq!VՎ=A!$ 1@5QJkkۏk(4ҤVO/46w\81~ln7*KAw[=i^[Nfy[CX:w BGmcsbyXmBŜ9^6_5\ McPxuE 6'= >`3['Dx|GTrx|UٰX*4 6/[e:Bj ]s;SbMU5Bٓҕ)FرRohRMNB6l0٬:fm`sorK0N ByAذߪФZ}o&"PY X" a'ToIdotc6jR!1nc&NF6~$UMgxBW;-mϝLc<2ubs5I{>6f$#IG6gtOCegAT=^< ʍ+ɌGa+ f[&L8E@/6k%Oæ{T]j!в|Ǡ-( -;$]4[K͘%yį:vۜfb /ی&*t |Ђ4*Tb3bG\y x_>4 WQ8as`^߼žT<NJbrEI|`sl^߾I&缩 $}B%ۤH+P1=w;w^tְ`7r`"?lVҤ0juOH<;Vq0q}6j<5(?g+2įO,7R4.Yט2 3~l.ZM* ӓo^T!Яh&;BI9ٰ}R%j}}nX ^ ~GiKk4k{+g^?w>&26 2;= <WgsxX(%]JU> xH isY0Q}E`sEf.'!ԡi4S(g1R:vlv4ȊyN}6,ţL}PAqMcIwK=( ]5DIk]TUy):wM xyJվc6G4*J|PӃ6U0Eg.tDw ھۊ&UNJV؜@};/|36'k1 *;W!VO]`s:Wlۆ"(6Wieڧƽ`s\v_#6I]8\"7um 65gٱVgi܎^W$at&L 8ﵔ`sps;6Mk{:*7J-bӤj9T{ilw?+6螰X V1ɪrJFkuO ,2D7> Q{$B%06yB 7ΛPz|uOʚT"A%\?fu昰2>+x4`MJzǥZ*_!vo_+,i{}㙖zKk0/2R湘!7]CjgI+gQP kP 6*TorK0" Fn{J#<}.'6l~v5KW56-a+!נJ-G91BOl{Y'qT!Q{:Y=;BQS4YYnEiP#'6Kl7ǻ AcԞYP 'F6'=FKF;ӻH4 ՠlmp'[|_ PЄH<x N!{Sq( 6`sZ>\SR"R`AV>`P,'cf'lρO@/'A%< ̦v =qSRnyOk\l@KcжDtOYw5>1؜OH` ulNGڶe}b LytcC]y`3'@TSe3&LٞnFNv,fGX1Gl%l 6')npo::Tll:6׎--6-&L._矝^r_lEW J`*&ZD^ ;!!6)K*0)3/; vEÓh*6 6Ejc3CbO#^76 @_TEx wO_$1(#4Bs"*ml󷴃eP ~6_ŞF V):h_VE|(W=on`f՚ M*f$K U Y;=ÒT>KasBu_iī7`@ z = _kIhE΄\MNHG> D'G/<)Oku)U/6Nݚd@@w䦜=MuO}a& hM+,V7m>p ~{9UUiRiRKpGZF݋:[vπfje :e䦜 ;my M=OIA*^ ? ##*kV7Kⶺ'6Y; _~Pv#\Y C :';T)~\_|ux R'7Quqz6b G.%p'&GiB3zy U?K8zb/2u#\@0j)ҡځ+evR8Y"N X._aEn lĬNOI`5=yH 'ZCz7?ah(š/s .bt բ;:1 6\{W`['n rS7K.gINlJ_nO_7ϱM01U6~MAp  6W:|O#&.M\ ց;&ez~9W{jp鶾c P-n:6lPo< dd,dxIZ髝+9-uVln{bXud~9|_K RN+Q)VB k L QT}ie:hRI~Nnx+6{5=)XlWU\PIE<\_}ӤZ013mf}*_+SE}S3ElS׸  t8knTM&8TyVC'^1zxNIT2UǷkk-C+!a36OX5y&wG R┣<g6lLO^0KФeg#L5~waz=^| *Mo{\3= k{,;3MqndKJYEjJ$Yj.\~T[˷G/;P>)9F5~$^zSLy9۹00ĦIVe1șcP9_~Ό&KM.~ }1<9/Zjsa*y~[(\gTQÛ!Z쟟jJP" ~op^N&@&L;/Bظ:]IY gQLGwAx}rͶ~]˿C7y&y)V"\7HnJs S΋mͩԟ׷}(߇SlvT_|6k`7N":us[0r# ;$rdx|ooxBBY>Z=ͩHbs:lO,s=rud܊Ct@XW(} 6s6"Cy`14TiC$`i63cS̝D͂ͩlٱRWU3 r`GQ~ZY7ޮftOPDi,o~ݢt;tN+ߥ{ĒTBY9Z;6S*?s9g2By؜L|{|y bdZ'E`ip5! uG)vC-k7O2I34ņ6 :+tH3OפdCJXf*$Cf<Օ ԝFoM(g3lN'= x2S"M­P(o~ 2`g*OV_a[`fuyTk/G@pXCn};4m18yƒוoj6Lo%3x.?n==U9Pu3kUՖi }ǟW?AQPdZ'U,_SIz P ;ҩMtO0-b&S#rͤsplq\XG#U½HNKmͥ7ꞄZ|v iDi:@T--G*3)d xI\B}?Ɍ+TddTi]iRe2sUFYbǕ³ 9ͷV' =4[xꞠ+4`V7KFl`<` b~]{RN_h0*ݑl suO(1g:|Y.bkZx}ǀͪR N֐}64`/=)߼L. 67Gs3l=)ED~~ff!柟{ !b)J6bs:lO+lX9|Mtyf椇i9bsBl)39LeɊh_= xAFO*U͂;0vl{1'Jx Ş7$V[=TgҿCOV}ݎd ^6E-(f6S'W5;cpL7#sÿ,y#۫zU| Rg(96leSq~>r'!d>}`cΛǷqhoJmN;L/?fJ]tؓJ}BaCjkaZaZ4o Ul[dy8 ͸F>/༹Fbn٤'@%v-`L'*_4+i_)9i\˶{C%$NasB VW^ 1+nE+EeGtdq*MԗJ}0pФƃ8rnfeY^6ئ H|"anl93;mmg5ŧ LaX?>48RC}E7?L)M), q)%{3l`SfR@%N`3URIaWx֙ΪsYSMc܌OAۚ, ƑMPGv.qַAҒƜY)^K> cԦ<&V;csI?afҜ.)qiR %#yP($(8(agѭ@=(,v i,Njcw|Ǡ [M/OI1sXքtQ6W/k g l,OGy43v琵&Y*|ϔ|Nܽ1lr^p1e>u& ̖f/6CwxFM j^]D{n=Xip31hn+ :atT;/Ѕ& 6gcPxR84QMze5W< ߻+;W!^_\`sʽӤm؜/S 6螔`=.3C)v:bs/oiIkW+\9fÖbs\G tO ^ ސtO|3vT6 :y%X G1~bL&=)5"(}u_l6F=1VO= ;mmx+xC?񵏇U4ɬ4Ow u98%^S٢̜e>6G= 9t=sc_as}ٖ>뎢{Lr'2?- ?R:F~ -E|-˃M6N@Hb@_SvslVq -*INd9PlxzKp!^-S\s 66%N~kO *QJ&T܂IMk< _fc[0fXl8'd$Lί4*XqG݋߂u U5Vȧ9H ӡ4o4ixof% 1ks61s@N()< nx蔱Y-Xt$0> )9k6,.KuXf0fꞨSX8uAYI@Alvg֋*F KL= wLYbmu'͙ѼkaR(۫#k*lf61b矋yxsG'rN>[mquxg[l`t<_zM9 'O"Xkױt:otuv3m;Gߨ _LPʄ[EƒmHM4{o;)0M]YgV>6݇2CY`nb/-3! [|nQ4HHpDx 6^PM=㟣n֑7; T?i?}*?K$b' #FV&<0tO*2O ωdު-bt<Џ?yK*\6|{<9o.R&  ݓ"Xm4ub2_tҨn2ϡL3~/c3<_*`uD>Ԥ2~_:uq撁n4Awے&P X<%\5&UƕCV:_c5g e5 ɵ.,U<.tI bP3ΈPÁ\P|~:!1hmB4" As@gIM*m&SJ*|ED*J}5|qXe{@#1!br[}ⷨ;|$o?d8w.EmTkY!h&NA%uэ0~l. "gM* 4^̲ezcrcPٴ*號S;;;y7!^֤=sC4VT{%ju;/ق}fפNLhv);M;9U EŢ56k5NTTq;/&F5VդB53BM;$1:u| 6 SI5r&M2Ţp)0ӤZhR)l ;;/ׂu}Vg5H/ft 9GǖNHS lbUbR~ܢTY,K Bp $U\΋Q`spJw h%Q}htFHG0jU 65Y}cnVQ5'؍H9i&\/BIzD;q b*tkF{ǽ`s\=68*^Gͱ`UJYTU5'N+U> _/DUP-E牮N(|ҨQ9~ pS/DU  )jR1[ULBJ 0EV!jH6O&$Q`s5\!WV[.XDD4BTkވ: 6DUݰ(' `% 95`;2]<í (b\B1/PC`.\9VgqxJ,e.jRR ̮~o '୓jn'4Cm.\+uO69|ǠmIĉWZN|!;[&U*V?3L42nƋI6k Hº~oPLb@3 ,]rj]2/]*{Z|TGsw ք*hM*H{Ԥ@|4fb@J`׷y"ќ |oFF'peQIͯ==gGs냹(!aJC`cІ́@A42T5Qs辊)4cpYy#\7_ҥKl=7M@$I]4"l};;fѤu['{n*(/в(i}C ꞐfyJhB`@E`\5"=;;fk+kZ=a1ݙb % Xe.\=B` &4`MRxV@&'>3pZw^ k, CyoGq1(`g0PwO%_\9luO'4bѰ=:ڤ߇SlvT_cs2NkPMzm{O|яꏛߨGϽT~TJBC˾cY}g }LM8٪>?hbC+6?zoT<͟{Tr"Pj@* E3'@]=82<&QnqU2R6O9~裍PN]yczΘg۝eyL-}=0ү[DYܼSw:u`Tnf<~&aIf!/ Dn$>dK7\ j'O*A|f+9FG@bd0LlyG?A_я~\]3G~NG?}>kjO=_n83~?zcoO>~/ս7>nmkpNѷ1hG>qFkb(c/AM?xc[DtY!"#Z AŇR8dU܂E@ep3u$S0~}35=:X6G C0ANR<'86M="cYp~'\Q{7CBdD|o{?%p(-67d|Ǡ'獣IƎL@d !rXUThB-Y+D-, p!0ywfX\eחz y̶o?~])H Qpy}O~Ɍo?5ym6\?:6G)1 on`_L(G?ӃDoͨF>A(dKcr[gم2 WW͌Ź߬^ o#m46l$*u| g@IJ脞c!a?qgȰ'J^w^\>z~|(xͪA_\c9"oQ=Z 6W3kh*9oމ'9[<atIćW!BAO,96@x-d> q ,3e`aP)sEJ\lnC7gO$yQ79KQ'7 07ck84Q7C{u l76f~1o~z3@507Exi41hn[Ҥ)3l.xm7>Mm0 ibaY lVώ99NK O|E $|z.6C1`Ϳ:(a~> ^:2l`^*_ИͰwM޴oUp'غ?7vf*^IE4Ok<}s]~ .'n wmH-"cж&Tbl=.S|Ӫ) _'?g|LG''QOx3;| a(a3x 6f>_]/!_˰ >1Dg7%eКa3 yf9T{Bx¹;)`r$ "|}Clw1h>e-Pr_4mFϙ?ktX$ ;^='wfln;GD//?)s6C\#ol6z3Aɱi -.%lccK%P⁛ {>Ή3w 1q>1gݞ)?gӹ zZ'oivꣀ7zUee.+A揫& 6b^~VT`ʂNkGgӴXH!YgJ0PSR,zL֮cjA. |1껰sp cЃBln:}%.=s`$rLRk87O?JN ;/׻e>9n;b@߆߁ p͘ ~Q8FoM"*--Rz!U> CMXƜ<~L|C{\yf(Y.%M*XFZ8 :~/> M N'G6]r(O/jsP$N~Μ2dB>Dow2~/}#jя0~]a\C) 0#Qza_ o;}.| f=?^@ 7i|'cPf7,[)[7KwVU\{,y)Ӏ4EOc5|@#iͣGG1Rf@ТO|Ǡm6|d/OҲa]{yplr{jtp}^:[t=}{ 6wa.!ܥ{|ykRўu:.7E5 ulNGڶGc_= 7TWً[>[FiCV6e|ǗW!&uT5dX;'өM9;.INbM*G3I24tI\7Z*0S`3Gso \m=⼹F$9ʚT7 M*ЍZV팯޷3͸gflNg<wʱP>UҤ%(ӤZ&\7UMff^}· {B9屲矝pYVIg^C6uE{V1hn[=ai&9j&29c.iOe6N#z| U%?'&l[ؼ(Zo>T\>Tw36y F"5 +4vhR1 U$E_UҗgؚṪG;/ƕyk38ϼ6?|H8W#I`V%Ir6R4V=\ N_6o^1;sFp-&ɶm`4%J|drZSߊ?p E0מSNsIi ,II*p6 :g=riX}Jw 6GJw,y jAs+mk6JZ[7ρ\: Tnm 7ـYDuЙPYcr)AQmk09 `6=g^~ի^s2jܸ6iXL'6<& )o T0F"H.rїƠRQ 9,kБYE9èp7*9X;2UY*xP:ïwg'_y㍪Fc{U\;mqGѤ +1r"}'7Q+g~Ku+r7)}w&Rn10 )ngtxSoяW(k~kdzϔc*y(cw Z_zidkVwxe{ͯ}Mgi X w_9O{tr &_;rbAAgv8[*GCǢ7t~< "4#6?/6\8e,Ŝ7k=yh@&D>!z2Cmnb^ ،Yt< ./s}W57/Sc 1 WBx{-s~…t~rou/B{ӾC!)^pPAf|Qq`G+s ]2rUBr#۫C~)D7BٕEuC3f7; f@Hiեi{_Soư'VsczT@ZO|`B gbzgp!|1yzK33-}S73_:7`{> ܧ 8_~xυW_$ q=a[WH8YfLᠮ[K?{gKK#6~i7C<.P]t+ ^zK':#iȂ<^?F4SxY5"ƪ_\~Ǧ3տN0(TN ox8)y9ܾǹx۫/=!{bg)OPW 1qr?x3{pc_06.a~؇ W A?ѭV,I#fyV?r6f 5;=9oy8?` \tO\f1樛$?N)e)%z_PF_)}߃Wx:-Y[ 469xz @_fX#ELF@bp`Wwo TPLωa{E[) K}D/ptW ?y 3]oFl) 1U؇ؕ26P[WpQ_lgʝtOfڍL1h{RҤ{3RA EOH9SS[ؘy><([~^7jP^sA̙͊L{s8B-e?[:r32U܇LW3lNIO:|ǠmMyUkZsY~QRg봛K>YY*ޜas !!X8l7OtGմD3sz>UYa;mYTkd!*?:)PR%31+y1AucnEw/3 D#k/;~>t#[g?lV+W^t5s=}|Vͭ=؋-~sy<@m6 ou'HN1gc(ؔHUW7f1q6gTʏ&j MYϱ& 2љ2CTk5uOv> <|Ǡ`s@9T):JD ac`6Ѳ`w^lKfo Ɗ"3oA6,cu[9LF19Sxx3Ȟ3zơ[RMY6};X{ZrGE5Sou'y[. f`yƝUoBs̹+Uܙ^d:T R'*c>y3XfPyu:d~f{K۫!s;ͳB* SQg~#r&%X\*R4)bڃVZ`pɃ yJ>l1{*9}EvWOu~ Ԏ2~3lvVXql+ f@]o׬r ;OPʵGP2G(5 Ύl6 UI LVC|.M%,+6o~?;r,.5 qY/PeLj#JO-j~ ^4\d(NiyFuR$ }(Mc,L^s&*6&5ͭ#71/-xޘgA5h >by8A'2*xn99OgO^C{I#ol\=sKz({ol7a. ՚䐈rZ!6}'$"̮y|A)3B]ۼY1j` yӠ 4soMHvg(@i {Ry;$(uHl-[21 HN*ysGkhE39gfᔲi(P#y~YXBuΟ3fvۘ̑m8Q˃66|ǓWJ)l&uVP92"2\ȆHT`.⤕UmzkwJJ_ݓ޺\> vyC9wcPFoTMYs7s%9\~s]>CI.:}ǠmID5a+b ̉hf# z. GU76}h_^11~7 sNju5~1ZWi07ޯ+d9h YyFX#R|lA[.UWFaT8k†2 rf% צO'ݏvo~3,jO-}&jw 2Ar1٤ ULL螀 `)Q~2=Ulf,A6in,_4QzꞨL3E͹ 2jc:'#ۼK֚SitdVpLL?Fnv~ @t%Җ&e|` 8|F÷7?G29SYQٸ9Wl?'ߙ!YɥsMRl)PoΜgc0XVkUv J65bQ{#rfv[%Qj^785s9=RQs6C:b@oGEfgBgr gmguOXC|`d PBw v7G{ڧ-qg~N6a%ēr#u淗Cc5y  o ܐsDF-GC=5JЬaYgpděY=aoNWvAh]tŞ9 Ik*I z4Zy22b;ŴW'6 ryJ8Lg$y5QUFɫt'&Y%:G<7y(ϤshLͅY OH=9f)f7; T}yoی(݃~bXS(8p `Ѐɓy3c iI3~ml0H}Gx.["ܥW}?x}fN aypesdv@ DJ:1qWNmۜ@b9QSy)Pfs%jt~voj6#mS/rp5>x| zʟbë+ qϿ;rp c`fQƧA393ƘP[Fיn6gt>Mjg /{YYξC l=8[,llƧܠ*4걙SL27 Ye̱u[m vΣl.38w*h'_ c^Ҷ/P4mP> v3A)SC&Q659P8lͨIoרb'B"'uzr˨Yk$:5B#칓iP>~Foͼ7˓3tgo&fR}cz84 #f5+ #=![CO&؀OiꞀIQxYk]TUTePDi74OæI ̬6p?fXyȈLA mnwԤ*yH,Wqp wAz}'ɇQ@g}LZ5N&fJdC8fZThNLCgpz=Pkh#OCsVT*.(sXmź͕TH#p8A.Z,%HA5Q|Ǡ ͻ('({ǷԤ=Z&ݥ{~śYqui`3HmA2h'8czvw$ l=ͮW9jݓ?̨qN93Yw^~{{|ezYZ4 3fsAPzM؁ϥjKTvK*;cD;i}$V 'WC ̼}'^P1sJǠ$Zu7fͼ$1g5tHqش)6Uc6GSyPOVO~o3ӥMfi0QCWD9D 4ڬ'c4ôk/)Ρ]«N߆lIXlٲ8u΋8Y5YsΖ@ fh *\Ea:J~s$ϒSIACf6㟣nlvpJؼ>N]9(῿ ֨~_(7 هwEp+taC|usLT ԩvT/WހcG2}ǗWa8cֵ(9&6kTOpD {10{)Y;{svtţSB#ǙFwc93n )@ WډBr9taxǏ z~\C7>Zc= hz=դ7x%ZjGNaf\%?CUN|}v(s [%|sT'uTl֧̈́6+殞zS{ɭU2mk]NcxԩǢgBh͂*Acde ̿Rϼ}1p}y5YM* x;{ǗpR".I`Sg)̼{L-5]&) J\TS9m+άAQրKfcrw/?_w/$":X ǜf$>&>6aiިdgƻaK  gU#Gt3滓?=Ӈo<+x힡@{y7u3Ҥ,m6>:Tx)I7T)a"ݵ3wJN(&w׮3H+W8}: 5dK2Xn6r93zD N,Wro p1Y{!K!HLy>S<,>$u,6 C7úۯ[O>cK Z]oɌ'O/-}pUɑT1U'1L^gS.^'<{)R6 6' 5[vX2m+K|Ҏ,LPD|Y,lƸ@c?믿(?}So[ӧ?t1_NܼÏG?pٝex ILg3(Mn4ÙklQui%P杊>kI*/!{ZLA_ꙟ"t)|CSCYCTSl:6kK)Ly?ǯ](xi;+o'^|4J,NMhziʢo"{T]!A?j  j|K4h-~R8h nAjzЙk͹W9CTE543iê̅7*}ݓz,L{asTY[uȚe.k+!Ѯ</`Mok\kOa6Xי aEu~s ]^-«^tѢhEc9˂`>tѯVQ~i*\轁D5K؍|l[`PU,u9`L~螤Cq'ǮZ`_ӒK>FiȕNt!^̮f(8;6F$OMW>K[I ֿ=ě9w9L@ #jEY;Tɬm0SCS"3c#܌D1Bt]-C7lR uOR&WXlf KlYir]3AqeFJ$md>."c掜.vE>y&j'V$RX YÄ) Q7sILN)Uo.F-sTPbhSVz#3P6k#\s;Źm-/E@"]˫qh߾p/l9  *l"Ym7p@Y\ -9B_NBWO1T{E8 H0Ȫ̏Ϝt1Ngu{*'@M $HgJ\!! 6sgH~NB2HS}o¢%F2M@7čfy\n;V-)䥬; Wmz*uO + jI\! Rɢo#YtOn+)lw{n&~s'H gfWP(HPAM9Ey,mMh ;-m(ģP&WpΊ,Z6+s  cac?FwglZN_{+W^~'OZȅƬ)%li-ͧ}rcl+6@߇]bsz ֿ~جJ_rK.ll=NLe!2 {>uvBb(*gߡS<}_6lVb-:dcDҷ㽽Hs{7|niD7q7~O[Z4ʊuk 2&bW/LWr*海h|Yf9m/>ymfG3k Z6=[UjPoh߇^<,ZvF*N pVz-jtnfe\ѫ=[(!R٢A nEH`3B&Vh6ک7bZ\e&rdK@-^+2>fU<*-9,:csYʩvB)qUt.Zcsp`󜞪ȅ4xvq?G,'~S*lhExF!^YSm6U`oCl7߈WgwrnЍX`3WtO"^lo{-$^s#Dl_YsBlȝSDa35:mq 6f'w7 Ert.`8Tc.һڶ^_=Q:&L|s#X Rֿu=,?KBZZݓe<eƎ' wzu',ti;~螴K]]/ܕӺO,PE  D3O<͢&۠ pA9&rЂ,'i֌o<:2W^ I<+L(*8( Mr)c7פbG:E#U!ko#߇͂W Csx!3x!ڼRZ$gl<:'Z;_ E5>f&#kuyE:[7!m=Td7XQݳr4s|cnuOkRP0 iScb}X|l7w 9$X :''2E5ȠM}5Lّe?mج ={¹Os/pMQ_'Yt4|w;>l-0u8M6k+6׭%פw7! #xuz ۹qf}(,3j,iuVhڊ3'xKv9uz"NQٔBT66On/Z 4;gtOkRb:SX; T1$ sw4{稛4R\=IK 3ۼ#XfF|K-ܝ;G.~"K;67hWlfSWa Awɢ4Qg߇Ek1+*ʧ7g.Z 6 61\hs͌&y6qH!tvA'7KLN)oNFGToa6iR[y5[Pg3{o0MrǢoCYs 6,45^ovoC& .L-Oo%JReI;$?'a1TM5~^Y~ yflԆC{4"8oJTG~0D$uoF| ucդǦA3שCK.R|,؜tk4ۚ&UZ[&LRJd=RR 9eT=E/ %*ĭf“eR<ص؆;&@!Y~&Քt(@_nx^rc X|wWlFM*YFaLlN$I}PZfU6?EjBI:(Bߣ8cƬ@/~Dd_%X|wGl浄Cc.jcbsZhTCI9mJ!q)xF2? ҃ߦo^rw^ornfs--tO181>lPk&iT_h$9IX 3*!%!?)A#PGYc3 M*ޱPYن3<%VveM*fOv#@M* "Tpsyq^7r ^orچT޺'~ӹPYي%I *;;IwjT։p^$];Xj uO6lV]K=O߇͂vlɶ:mk+6׭%4=!}εO߇^<\Ⱥh[gйm3t^o,[YhF h(_߇>،{bC|?46nkWlYK=>>z`*9't^eM*prilfC9*,t $8gآoW1ewwl6z쀓c߇~sE.$WLAc 6WJ("bs",L^_矝^r_@7@eL WlӯL0Cޅ^$~3[`Z9  ٕ+/]d`uObJ\8=tGEP&H礎Q7s۸aJSwf?RtOH)6n %$n't[tO4R+6=!`JDi * ֚s]swlnҞ+}+j3%[ڟt  !<s`"o@@ vqcJ52NQ4%#l4~lNf4Ŷ^_{x)H 4 -nW稛}z=Ooȶz/d\2cO((2ʆ@wgl^aqذmWJ"_ܲEߺMdcysi FS/`H',eC+6I Lh؜H`spjP59uNwGx}ۢ{ ~ƏoM"y?P 2ʆJ)jTt 8-n6>on .]1"@'ߍ^ȕT2eIOeR7鞐#K9bb,ԥ 6 G#t $b»y>p^&`" 3dMR?L3b/=;TscCM>$GMQ77i{Kgi>˨{׸{?0tRdMR6lL3{^5ET͂n`6Ruy9p߁!NtO`_b T7+\ZAJ8{0KFT)EY Yv z@iv/A%,<2u{6brN˩^ڵ0l X) *ffODG잖+>3k 7CuZi >w.A%<^7?G/46ݵRw[9~in@)꺐VTsyyqPω8wvݓ*Z7&w'A%<+ԙ`FEӘ9_'/frfgضԢݺ9Zn,"L~R޶\h[g+6(kb_4{,1tOm*5h/ #(Im>ūȣp UNXlf bsvâ<9o ̄TL+fI؞{^ p*<+:ҩ_BZll5wg/MWA;2-fl9D"/RPl*._m͒ q3CX1:5*x(3ru%W`Iޞ < D nGQf6]z`sC4t&$F "ҙ$ "bGwJ$es͈T%zS-5~lNu5m "=?>9D/+5&ЕpjHԴ鍮u3o~N)w2#2K}Rn _j̓WޖKU ?gqξ9="9JR)$NBQJȡ:[l 7ؽaTY{_k\"v*|4 l\?CɍOcYVEao,(TwW);>FN pVz-jtUW\yҥK'({)t F Z >}alc to+vIw=kT@>9~wf|^uQ0.6wGmhͮ'Jt6oSʰ( Dw03Sᚂ.ccw(vtOxMM*sV_yjc}iPPY8Bmgx$1 F~ Y:*0w/k8_C; 6׭s|/ ^۱f~&kD`t߇͂6lv=j(K:΅Q'\Oyڒ4'5ʥ/s6lh lץ͹S_b,xPYي%IV qJم|@ۻk;OY:$/O0Vi,rL~I`o(P)Txچ͖M͹1N 6 6۱kPa'=R^[~-v; o%Goՠ*``spl׸t\L^k+6_uA&yȘ\_c>>o絷^?~w暵MכsU.e߇><~wf=q10l ?G.?\s.IDATEMN 2&0Yݎ tO b G/mM3a߇q$&F,ZzB~ԪePXԄYDdlf)tO&k'Q(_-uzspJ!0>lPk+\zg`s6JD}iʾOk67=<9CMqt:AK vIm\,@b!e6lLaX!<ſq6lVVP=aiqt߫ag/._I N 6 6[#9=)yڊ'ז7'-JIhg/nG 6 6۱×M4#GuOP!!7o6K ܰw L.yވ"\aˢo$?gE~~˿򀹭H6{ .0|>28LqtcCP'=L4fp` ף{r/pTHGA(?K4.,lZ`ߗܱ=%śSVM**E<ݳC_[`?6I_>tf*UN4F3*uDQ㟣n`ppJͱmhsSC9ks^Iŧ6>{:o6w}yrLbHA@B@ +ۘ=Iֿ Yszmn*~sxɫ0M.1eC2:柣T~(qqbE-'n&܁;E3 I"/)c9RWQb:`^䑄! 6;`5<[77Ң/}+op7OonrޘT*1v@|I㳗Cy>6;Pf ~IՄ_9@UItؼ?ͦ勺'T*a"v2ݡD2N?Tn=c$v|1Yb"a۳;P~tÛ' 6[\{u3Z;u0%hI*ʻ0w&_ u8Wϒl%(rJX @BHʺ7F@5dU$V̪l1BX0lN{VKP,p6lyop`Jm bxCS. k6 62^.؜h4n/M8MtOHn0B1R(H+%!͒fuX`sVޜ7JĤ ) 63/T Gi_0D6h1QRڛD_zN`sJ-D[q Bgsf:nG_b^j= H@ 3 GbBaPZUjg?Λp'W02+ 7 Q/稛Z )5Ai]f1¶=Er ":9G' K\4nw]6lI?㟣n=,?{Bi5F2ۍ{*5~lihEmhl@Y~NA>\dTj.Њv[hM9 4)?`sʽ#m`bf9ݓ|7NIؔ w4͋90uO8&KoRj9??'',G9Z6GfQ~wpJZpʭ#ۺ;lq!6?SJy8}R=qJ 6G֣ C~on`՗WI\rg6)QE#,<9#<~=A|}(Y*```8{ԓWaF N Ǐl.'^Zaϴp9o[*ln-nɻTF#͢{2.<.4؛Wa)C9?^A#7(8ʻg.@)6` o 6淸iaV+K1E> ( @ `6쥟}]yLŶ 0ɍs稛%Tp5O(@ɜsՕ 6!]{R?GݺQ~NIIw'6eb'^ 67})ܧwjNy\sqrUD 7`spJ- V(?ZqvPUxoﻈ`=F*Z@9yκ')퇯T)^fQ*FmFu/UUN)%[Keil֣cQ[Q42B5S~(e ZN}Y6ϩפ\P tiR κބ)>xeVLmi.Y%x[@fcQ~+KtN~`P?݋{Q{>,M/U~tTa,w`sJ^GC$Bu]`ͥF!o.D??Gl,?">RXn)y'FAoC99TJ)W)` 6ᔲapĭ㟣nvhS{-L܁o:$# rrm} #k4f쪊!vv VʥH}Sc.6SJy8}stOm)j@ sr-RAz&Ɏ|#*6([q**`a3_@-RJl9d- ܱ]*ZL'pM`]899$^?2@Tlg 花icxp4͉ )s{nw"aH v )K(T~eK\ N,,U?o b"\~ 67)re_Ѿ,7~cf9$/>9mQ7 ߭ %3FpJy3iбY`Ť|׿ysmD 6i8oN_teΛ}QJIyսFɺ9jrޘOBr)tYLKjV]#N``u`` mNCrLwl(((1uשlll["SbYzd_hcV\H!ҩ ,b$|`sӨi8o( p" a@N ?,x6'w wPmT) Y4#)ͩHxs`ܢF1 %/6QP irna QTc AŊtmlvfԤ at 63´$ qA cLӅe/ 1 ]ҡžL*<8E:O<9f%qpJ 6Zj{RIUy|DJpap@1 T7Q# -ό&EL)#gq)%㟣.V |ʕ.]2yJ3UT:KN C)*L*L0~lv)~Q7NflK[˸I7yLJ|#ΫlI0h~/k@w~uQbF9ula >/q8uQȇ`sdK- ܤ9֙TtL*U$ 6G2T9=U<9fXw7; ěWn-}]ٳ`N)[KENc+%<l[ zy4R+=9vWIoL fnc8Wn- ǫӠH[=S,6 6͌lZR(rT4ALTLzXll͉a/<~ou@št7Y&_^mb3ł`6&`P r sI B27ł` 6`l~*0 I.v*&}S,6;`^/?>~lxuX=!F4OP$XusPsv|i hq{Rw6#kmT `JWADKOOPńVx 㟣n,\~NKjcȐf]k@ ^Mu3G'SH繊 <΃iE'(',]m`p*dK=Q )ҹ=γqEV8Ep!ւr}li/T~NݓL!%&Zާ{ (i;im5sP +`NLLZ2]l]gl^~.?5? )0&tS˂،$?,`b!?`{ymB$SH:Tn,},nO3;arv h?wQ7Ii8$Oc8}Rnv[)`zwM8?`Uyl=jפ,<,<uФ#KYQ a֯.744[(T3lll[ IE6D#,<9,< y{iREllLylf@oVMm =xc 3Mtf'lMMtuޜ7޷CRvcHtJiRm.;kRxlyz++ͪR7S flFM*\lV[52ޚT7{o5g@%NM=q弁`kR5OM7㟣N^d{?;}饗0=gP:QO݂sԉ 4noPj.`X$}m+ kRo["]͎&U|Q曟\>&PQn-5~lasm稛EU{ 6ǴnuЖɅӸ'נF pNlNoel^̑᝟.2f@9K9|}k>iZs`x砞6b}Zt&ըl~lN_Ul^ᛟCn1_k_@9o64`s"Mk ~/稥@7Vz۸hN(V6mstl;~ɭǤ4R+ھێkwt VɀJ3Yy@ѩ{dyl]*<ݓ6i8Wn- {S}MRv 1m~wzx[˫K DAu V\u3ͯ 8l3RV{*&Qw+ aw$ nUӯ̻f| \| Z؛y,Fl^*< id%{'o#MH`dW 71ɒ \:]5ՠ#<撢 XWFB7m.o h[R줽!m<`F~ZU@m%d@c?2x߇M]N2G$U #ج,sMRO 4K9>X,`{{! G'L&cfde-=N 6k~ygD9΄ZY^{ z臑epc!0-Z Ęsv kFAUł_mtkͣ4' W9 `hEcvgh87[T)(ނ1*u`s}?۾@ѤRX CX1:T)}[dI{J )Z@9^i&MNWV*`l{Ba֋iZ 60^z랬LC~`ysmV* thɭ;1D,͑ y͝\n(`FJ^/7 `s C&Sm_hR%U 6mx5GȲdT)Y@ylA|Nc4HĐ9ټQѡdRnI'pY&lr, ܙ;&9]ۙ>FlG.s2Y; |B2)(}6w46[@cG&0o|f>Dxjl-oZ>,Py)ӻw,}H z`s/fxS_Mn;8OPc g^L5XE@\8P#BjOFՂYҵxjRl};'n(DWoPΒ ʫzc,l׈'nlQdd lrn- ܭWjOcBנYv7l ɤ ^]ك겻߼olhө`sV{tomT W}|XeP\@}ryݏ;[HG>W>]3M:`s&|Cޓ&".>AȔ;rNp/, ^ l"y@I=Y@'GmvY*`CPCs ;`s'f&6lp[̟B9ZJŽZ@WGyoY\lvg[,<YL 6֣} _+J?-ODyǷ`LǪ~:.MlaY?={=c?}~Qڬsߩaۇ( 6oOg+NX>)NG|r^xOw8u?>7/~(~m<` ǥOYT.>v\tZTesu?ǎ{}\l=Ήr^lҕ U(nq%v\pesx\ߙ9>Ə\s{?~ĉ7_.Μ>Em?umMO{h~e\'Yzت-GӷuKG{$N_>~S=Oq_ { To_žs~KZ}8燭Nc˭k6g}Om~c~C;8ٗ?ߞ/tp皞-~y;ٿٿ'=>>99p7)s&1PYs9J9>o=ٖ!'җhc) [N㲜 Z{`9b=Lf?9?qi 2|_╗_$0S#MMoW<=u]7W_Ÿu0_.sE"Z-ku=K"pI𝾯ggR|h_u>G})|*USz HY5[}vph42A?(~Ãu,K~RlfO2A_h;}_'LQjfN?bG.6hZ`s'9;ٿSwήN3lNf?uGb. 6w# q-'#?xF 'ͣ_/K_Oɗmx<<)R3|mqm⥋)ŏřogř퓉C$w|*S6:.qA/Dx~ιUfhzQ+ҟ}BOas ps6<={+)}![6oC<*5[s'zY\{SwLdO>#m[x&v(qx‡Bm呋g).u7v&p=(ޫnxYd\:#ҶI=~l9+6Q|ݗj |f|oFA=}|$_y}W*]:t8`_xf,rzV[;*ȿ/pl?Ӌ u^}obm~j<[ p fjc;^qN7wn}%)0_]Ǿ_^>w\ܣ)v9u59ﺄ8=϶|9wBղ Z0L4,_j&oȶޤ=sq3fj 6W: lկ,~`ۜ|v: +lV K.Q_C\%grp zof <M[^Zykޣh +2!Y{19<*|ZRf~/7Dx=_l+ l~ŧk`󔲛l kf 0; `V ج/uk>*_MS`A7λ4 `{vw!l~w_'R߬|E 6wufHrw,cYۃ 㮧nl9^X 6s=bxMH*ˏ]BW^Rje*Y̱#]؂͡ySo~ߛfj=/!Scd` '1Gl.ɘ#CauO\MwЯӯ9W 6ɞmVs\e.'&8Y2?|جd]VtwY}@eO&kwdWn%'`m=W\{ pnшǏqk0_6HmeZ- ,V܎٨vmq-ߊwG|[:i4t6ĆYU=v fm"`Ѱwߝl.mD-tDl. ?lgU/iկ`\fuS_d| h4Tfmz~Wo|/֢lrtTנ] [e6-2maS: a1ם6i)~v7AI'z+`s 6wկyH,P-dl(,u6|)/$ʿ[3TYϙeon)i4lVM%2c46D&Rjm=o]@sCأxQftny+l`AV%Afsj~`MRl}3 lUQ3g6_G ef_<_~l&$lk |nxIJq4xUWج7>U+le$?h"+^5zi,nq k W`5ƍalY=xـ;~w8 +f4kxk:l-@f |l޾|EZ"q 6GUvgQl~ufv~~foxq6IhgـMJ뮞j'תI)g6 *g6ټ}ֿ9l<]sq*oRg67󪯿ɪ}+lRF6{ yhn%c;_TA]#Hu$bjf 0gsovKZΥ+YDK8h*<;QFγ!vX pf>{ 6iؿ'4Vy`_lw&D99WѰ?WG9_-6 GL[<$G J:OO 6W˖je٢j%NQX,֎o˷>P o\i*~ Y){ҷiy]o}r69I `Lٌ?1?{5-YNR  3⁵6T`J}RE49"Ff@GYqz[n.rr;Pae4,lWZ7tn+`Kto}"RhL lC, rVNH-/M/8'>?}9q AOH'%23rGX񂐦 lV|ȬږZpd@ -q؋ JԐh lٌh4N8 DFcb`s~}Yf+Wp|%U_ 67U!lϝ!K3?W*9Eaw3Te(97r7n~f߷P3WQp~@Tl~*^ȅ9WOa:>Yyms@l'ݬ;IؐzEX_3lgf;@a ws;o&bsq‡Ѱ."E1сn׿pwe# D8mlSReύ`G&$U 9%=ۢa㊥l~BڟOϕ6O޿3gsXSi``羋Ϳᶉ_s/s5[ l'pr 8`MpAnf `շ|Tfgp6Wu5e9maFl>ky 37h4p!2[@Ѐ\+o!U}`3T~&2O >Oa01]Ff/wkkoUQ" zaY/VTH_e`k,\QۨMNEY@QҀ+74s ljAE%Ff((b<*)S]oJr:V߭co9Z4a2* s6;zT6 lN:ږ9˚9XzDn}bu-._USr<hbP-m[-kul9'ǑxP,ϴߥt|h>i_Zȧڊqʙ8Y0,}tvO=l~?sfs_Ofs]8~ ~]Illkwl(40؜bq20W&8ewX\jsi>׍1ؼH%q!:ˠ 0w]׸d.vwAb`td |x: f_jƑ`seq`sՂ 2?z5lv.(`$} IZ 6sM] 6- 6}| `f{n=6x"hNmeylfٜ`sS38IMJ9/gw2`R lOlT ޭk/(w02MV.%lw?ǿ3`ѣG3|Z Loe pLDWFU4xbg>hnF٠u'PHhVf`sh[`54br[\fd,YkE GYGz"9j< 6 63`s܇6G8X6Xfգj Rɜ͉qٜ|NFlR5}Ÿ<M Lmjll.7eyQ]j4jB:8ѳ ' lffM599mNI"1` q-ɥ 63| $Q.lVExӑ9`3mSX1 6G 6o.4URTD⡍ul "] 롙5~^ogflYݧ Np2g6ũ3lf~tf|''lf3s#lng[9G|m`(s293WlΎ Ev@n HPJܶmG,7UgqV #כ">:*晄 UuLͰ wj5m'=8mӍ9ş4ƳWNWvpfsyyQ #zG/9l~ǚ4>7u>G9 |5_@f_?kM/k,o|$j3LM_5ml.lAC:(`YɿGWW-OF?C?p:[?vq`~ln$f?3z@Uf6Ma ~fnˇ;m5fu|se.> 6c`"i>hj0`ste7I\\#*АV|OBemٌ,c0v7m_R|oJ>ٓj>W*E33r& 6f@V3ֻ_+]'zz\|n?+w8k.m˜fؒ պs("/$Զ{:\][ȟ"9k*_rklߐN*fzf[>'6#̲xi4?3HbG~`?ۿu9xi1!sݿ_C\]sg昏W;|[E[|YL(Qڸ<my{9vq?vmp,-z_& 6Khs2lV!'>] v翇x7n9iGc)6;1z-AO%Xo;v~Wm>&nêud4|wP2ͬ; iB]s/C=y28l<iy  fP,ElBT/kx@: 8-l}e ba[\@P@a@)}ĀRNDf3_XMX)8猎>(){M?lfyX`s_5|e@!&`lVf=$2[lOBL`Pi >334Afgl. f6}5wBQiDw.-Sb>dfwMkD*>>=7F`> P>!`^F̟X\pMʟl^_رU d8{J0 )JpAUyPR?3`3P]/e"`'v:M0v~ ]M"el{#alV)E]Oi4@w~G|Z 20Vy:G]VnQҩrf3s63gr=+Vl>156 `3jMalI Ձe3"!`3|Y8!<0͗Bi40<}9Xĸ}%@feԢf٬ 1pOk`VԢRl~k_Zg*;j<{iv,g6_fl+6 h8f&d1O !/Px(2FmNfF.Fج尠â`_l lCLf93W(mp6{QJ `sE7e1&U:&)MN@`=l,54hr 2ج&ɲf٣ɑJ mKJfY&L`sgY9Zk9̿jց26 Cznf393WlV[J`96{; * L8߁9W@ ;Ewo @Qf#2 £_h(afl!C>ej:>6Sٚ, `G5lfMc0n!v/%h( 6 G틤0Vʔl~MB6cf6lf~=so[)oJW[鶁Y_3Wq6GX_W4#R-6 h@6[ZUm[J[ZG39yuٌ&3v:[ Ч2s#L>^l8e@G;(FI`3 6c)2?3`f3T _}q[5lѹ_ 0-ڒ.w*) 6k:;5?7g $L@-_2vo T7x3g6c:xQ[$0(F9yU/ߵm15]}Ps룝w ,f960YU+FnvAFqh4 m)xģҐ3D"fLItm( F)WnpfV9q63g6(4Ji4>ӕl!\U[쀞i{GzǪNj]ͱ&AAE'} +(fSpfk&s6Kjf+M8,?kTP,?*6-zL4LMTglfͿvLi4TV3g6UY‵)X>aAOW%GcfXq.L+mlNTE RN.&}"n"yǧw|ȅmtŞO>gz{ 6[1Rl@R➶g=XNZ=JUoz13p؝ټzX0gge `81LJ.WY2s#/%Xfy|49| 6_aյ g3g6T3#lYO 3\fg`d-fC`3/&7''@bInbo035`3˖UI!f{0 ULUmGL 663`3ͫQa':rKfl;fT t@: 393uƥ˲gZ2~lfYڭ\ 6Jo[u9,H4m+65΁wOV?Y2 Y̙͜ᶿQlګv+X_M ͫ{933*V~f]aXb2s6)ifFC)>L 63ؼ' 6kflHTݶז7svf|''lfy|4-0`3 6w-dlfY ,8 6/KW㏍oh` X]\.h1,dB͖flf97"`fl3lw$w%Vc뇏1،歗~9m<sCy[/ߦ ySTY9>8! 9|-$Xe\h[;}#C~>)Ǝ-dEU[tkRU&?w1hկZ~J`̧68LJ5Fcu?65&d[v'5M_rni4Fѣ*ӻ_ +7y'q !?E~,n'RO߯G+4bz;b$>7o М=əVnl94~O}מ~xlqF/Mz6펃jU~{FP83ܷ-h@VsNfp[~%I#_v~CTթNcٍɿcxeA.y DUVOM_,k^yO]t4x|78 KvI/0~PyxT첟$뱽bu{۸R}3,Wi86we|ll6fN-F/ێ??%n{+Z:R*?.nL30`Qq~ }`3w@m)Ȅϩ)x>Osqu x/Sܰ2*NcXȺ|5{-`s ftkƭ6'v50Ug6c2zUBH/bm@ר3 {ˆ8Ckvyh8zN#r#g6=1wڮ✝K 6ÿz\ǺO *:~¦ʌ<9lyf6ClWaLokw~KܿONU/6}3A~+(k+2cnч d`@p ng]OO ]טv{B$l~w[g抣9\M`9;&NKu~ R@>j(PgNz'_\"ǰZ=]̌Dv\6{X|j2KLo׊ǀSe6?~#:49SlNe6֯?S( :uuV#yvY} N>eEݏ`gA?E*ZU"sؗJqfsng!"=t6`z7 .dC>bMb8sv}|8b592 7G}sbu׊}gufw郞nͮ=$Λ ]~wW$s63g3Mlu8FvBv g?Xew=US6;yKfCWZ~ovPVvЎר,UlR+F];X/7e$gѠc;{}.I?#1md4]J$|u3g6[[3H1~| l~N^ʿGw'rfs~R&c._Dx ^{M_T\7ߜH6{͐= :y/̰ש0sέ9`s~PLAEVhhYQT 0V:jrsB=f3Ŝ;~VogÖ[lcX<(#] ,V*.Ժ9`2фW-: , !U&8k@>]s+d3C/J[- NG La]q3&Ams([~* g3d5 2Mm|nlw/G~ dEh4W"HgɜO!4돏 &_ɿd6B4]`35(8O3Շ失+ˑdmآc}fSHgr dN~rgz`6ۀYm 6b]KuWlHBa j3EjRup~gE!3RPϚ^ 2v{fK/Rƙ6Ylk؅&m 6j.}߰afKFCT}ShRjH?~L֫y`lf^ڿ`9h4k5 Yp,p)r61g3Yxpf3g6lvhe9Ҫ A1?&7yzKح~jog`l2oS\(c2V PnV\n[mCoټTvB "'*86z60+es196]70:d6CR?<Zw[vުS"RWq@Mv_ܠe(f5p<*b hPþpqGn}wwX#o? "뵏4ίs#==`sJ?h4SC][.C)pMv(̋8^ul6s&TRPilz"f 2+Fӏ[$UF|{rf3ͧ r|}m^mN7M̌bx@T`ymch@` jV L? 4qn} LlLP4߸/*-[ݮF|X^,i4 !nH :$TF=t2gsb3ӻE_Ki1)Ϗs&m V*s 6g6d);7z_g9NF`AlV3 LDg>i_]KNgaw.̇ H 63㙳[ pz Μkl2eM(g6sf3u۵}U2"!lPt,wA[Tl  6w)|Ql0g6B0͹ 6uONd66vrf*]_;g{F#=׿sfs9ֳLZ -?bd\D`L,.fT:gAX6T#ݛ' 6d':Hf qX l]n#׻?2g3,َ| SKfc_qmS @cwăw]cv{]O̙͜m\F'rARv6Ќl̝O/[ڤoa1Jy\uxֺB&^>MF_~|7g6_r 6yz 63Fv|K4Lq\Jj_efl- 6eOqfѣG=r/lfy =2n;v?_ 8fϸv?!) [U6~B_hH`}llixxQ7>zBvk334}clq}P~㮟1g6K~fd|kfs}H (ob4zmOv3Hۡ3d6K}1K͕gti@!Agl>*e|C4 6ӹƖlf.W͎HT%]ֿ5y ]%@/kʝ̜͢↕)sX_.ϜͫG 63`zԅ=6O/7?K?~6w'@h4U2DlT͐,3tœ3}8kY&y1pwlffIE=?٬qAral֋K@`0PjD8EfFCTӎ{eVb9 63Ll.&&.psXΙ͜l^ z\_p3Y~@"TuX/>-* 3㿙F#sNZ\M{8eb9GCg^m|sD?۶܊$[ǫ˚!j}.@"PlI?>`~ΫRp/Й=9Wפx }36:4:8}4K?6:i[m-1NBl.>,` <-=kf3><}@so "AdDcv8l~uAHfHd6KK|@_Μ̜͗ ɐLs/o3cs 6}]Ye>'4s͓_bs6wٿ;]|ߧ,/ɿOy]ٿ_>Y1  +3Xj(sX-Y;+89Merfs>=oFw.93--w=4Y9 63؜=x>>N߫@~#1'_s|(>yOTǧ;>?9NPt9>9v|,ϯIi:I?;媺]/WtO}ֳF dˇ<ν\KpܹAxyCmsy?_{Ɯݞ0_b2Mچi4gĹ | /#IAWͬy.`3 63``ylQlT: 6ͿM]M`47}40|/vhC*?wf2tmg.`3 63`3.pI=SXgƴ|x 63ؼf^">ի gUs(]!6n}( D?ru{őN7G:]3зb߱Mv`e{,cP\8ccLv`C~;ú/ 63`3 63߿}2/X^ 63lxЇ\Dž Sw}3;%ػ3lPځJ 6O?Ί:\ x`d_ہ~mL]b_ 63`3 63`f9b=>S/lf5ϟ66QbTt>rn3lf'O0X`yv`.`3 63`3 6/ly'ܑ.NP/lf5g|"NX!fl^3>+x/?֦xO4@a Lg 6+Z 3\fQveh(l~GbCYl mUz-ijB_ ,u3[N}оYx`Eֹ 63`3 63ؼ< 3_0`3k_zR.~؏/:6 6@H(;W8` j\e#t*D0Y!;;! O1e.p7^MgO O/ ^xYIkP>l=zT | ;i3lkDn1bNm]g}`E({m-dJ6d!6s6ny[1m-u1wrfjU\e ^}!}9\ljAoøcj>a|:߲e_7?9;sf]*#\bf[ށ\ez jʿc^~Aܦ}.Y'}:H_}rvY'>gҷ\bf9lw@w YN}^nygnqⅳfFW cF}LY#;j9x7~,;@mr8g\T~1 S1i*ʖLAosTs~Nz ŋqN.O}$y  邙!l'R|O ŋíE߻Gnr،$u;ZŹԟ\jcؿ~-]lh/XEr޾8ñʞ5'`8v _h|lعqxj,S۟>$V\C{ő{5ͬ?~s_~g}gX,ϡjcؿ<lV *|b83Lp6Z=`J'>wĻ{ 6_lw@w YQO*l1ϊ/>旟xakS<'z:q*z 2]V|fY{iCXAd 9^G}x`.z2w}DGՆX6icٗ`;o^sz^<szO}Yc l EK`,UuYgX9x-{GzGεc8'7|aIc?xG|W_ `Ni*Q@nnT3[VQ#C/cSmTmq`9rnJSvۋي a;Pl!w J_1Yt_so݇\ l32K`U:KWť+`2'_ a@dGJ:k7pDI9Նɂ ;$kjQ`8 HJh1~`y?܁O{Jgϣ?CK>}3YQ *Xŗ YsgJ{M͘Ru#mC mت4lc`o>P:q :Z k!@`جtܳuv`O_q7.}>]?t;2WF 6[fC*n?%\e !;?#֯  y(6jپtmqVEg7S:50f6dc L!X/긛Nnsy}`|v W 6o 0 د*n?&\eaY#Nfgl@'*uA0/8.EQ+kSe3Hmo= 8Z|z됂'icecnE,`ƶZn:d?q^qߴկ~q!q*vh^p~R챜=O6)oj'tl#ֳ?9ߙi3W~O_j2P9 w/vU CXznk>@]7쒀;k6S4=߃{A ;5W*g'<};|̲ʗ`sYs?9;|=2/;G9~^ϻ:rP۟е|>Syr0؜lfVh8:ͭ(([p4ĵڵG(,& DϦ=j},w=7Lg1RGln?W:gիWg~zxᬈ)Eh(Oʦ P=ݧ`sb2u9O{ /v/4;[%|^vw`3;fǵw ?xaYP۟XPuܝ?NS^ɱjZկQD| pgi$,cêH8YeM7eAhOt=}RcqcG$d;[.d/+ j]kwY{mh7mֽf\X{+gPO1ё/A(w.XPuܝ?U>.jc.C?۷;_!2Z-7ñly6PA=$r\ɬ+۾a=Mq?u+sd,{FOs*W*go88SYo [>6kи%21جh5P3p=i4t؆G<l~Gb9>n|?~&P۟"s}:_Y窿SɱS!"f`g 4IYQK?B֓7s~,~؏ԱůVYe+q%cg{Pm3cT00]Gl{ Q?L6tHtt.E>K%0?~ѣ1ԝ=n%0% ſ>- q$%9uh $2"\e:/9u.g~~܂Άf37d7tҺ t{L@+p_~K|l;?<]gz?k{s7~x?ߩ-0?f c~ܷQH WFH'r~ւF d!Uʂ4Zh`@)5Mm}@TE-v:3i)?'jsc@~1<}ri-67e nh <͸@`F)gnU$(< YͣYx1 }/)5@3 85:Z9~8`Ϗ%_ 6)rF!\eEg 63oZυkZϋלjSd2%,b>VU1=u.u=ZRt`398gj'PL@}'\b@ri`yA,Aq{:;@m'~q!q* h^p .K(IȭK wF/jQq>qtYO`=,HW ^۷/a 0< :16YPLFf>g}[n.Shݲ^˴fՌ_/;~$r5q`pJf2y2%uU^b|2{`B2\%)tjt_1r 0w׿eM@`?O0='WmFj7K Wl7%`3]\uVc5T9Q^">ի g* h@mV xi3(?* $O!Z3 *,s6TF 3g>N},N|O|ѻNo_jwݷJP#wfw\ͤ?tHpĉ p`ju&QB2{ISjx?cZuz/mvnHZGr|=kj3gNfoc|?Ɵo@~l& JZpeϞl2FDI`qSK W VM;RDg-;޹zl >mƠSmă@2 }ߡ+ mӧO5ngf~5@BZq :Z ܐ]\ 0lfJiP#}G4L1w3s< JZERR9~~%@mJڇ?;%_#PM;JF @);gr PKm? z/zLcK)gh[\l.4l2T4< l4LdJ G. ?-k,-js)rK)ex@~lN sjڶ(WQSa~-YUu1)zsnlsa2UEx|_ 8 )ۯ5|ߐ9*h-,.Ѩ@dW g)e(< =1б_܏ʔeM:ߝ%PIZE]D9~~B$@m؇<;%_A+UӮSr4t hSx5O$/_90W*zg_lmޫ`-<K߬P묿\kxy,%5f jN<~59a{3w5 SBiQz@ fM52:= *XGVZؼ qZZgy _ 63XDvc?%t?t/j)5@xhgr''rmFS2ƒ& fޝ~)a.sr$_xc@2':g777f\32υ Իbj&C w8jm3+_ 63j~Z?>c,%_f~[X-vV3pZ 6CPi3@vAlv?Haq\:hEd_ 63ؼDvc?%u]30z%w}s\{uxbpbpUR hmO 1* {?&ulO;=I8e`|ћ0jS>~r\y@2U@eg`W_}Uf 6ooog+H ߫b(c1#ֺ.[28q.`3S^jC>Ͷ~S~Q˃VTޭ*v=s8=a[~hc~ _ T?NJ g5Od{WJ= ͋ٿS[~n?Gi9@2UHrzng 6fɬ[,PlۀH|nD禲(G'6H`.`3Kk>fjSJ P"A;-jOcp2Mc$ P$s8lku4M^vK,ln:/ lFϙk( +5.7i0gffϔ@g9S|r%LcP`Yg@A UnƻqʎTmܹ 6Ox]b{5l6s@ow9Qqy_]wwvo ~tk^#,Z[ٻwuAcN\ln'<=/WRΌF<Ϻ(54OxO>Pw#/x,]%Q• s%_ 6J[riw#fIL@u0e69.=MgF8n4Upq=\BY~]-\ejSE1:}<`'U?CCgޅ |M>u P0LRBqohgN={,/3ΠS6xw)x;`2^,/'~<7%5h1T?5Xms .l¹LD_s!saS۟aPw+j귏9{gj/W3_ *XEQ"Em_ʓ[c %@m{2Py1wI*oJ}Wj@*;]p6;;3mc.r@L i˹=SZ`tKگǫX,؊ GS `żOzN} b /Qfosi *S~O 8Uc|(nOnp+Y jS t|͸@o'eUtRe;^nŋx 4Uֲ%~mw`3Θ}(N{ni\jX S{־L >?AmJ؇!^xuQטN >pr^ɍ4WF 6sɽwp2u%XeX=WuOޫUxBj  ?ooog>qS\cQl&$ Pb@ysDh]͔\O/j/u}%@mh*XO :jT$I!4%P)lVvd"KMJB⇬U1r,iBxc}rq4^.KE_rKoe,)e V@1cGάڱHhry„*J WF6fXmɋ ?Q 32zU cɺ0qONhr@|a)gH<,n~&`j{Tը;d` >mmg%>6ޘQ9A4fvxKUg-{Hף(r4׻>kWv40s۪}o&_~6љڱs;{'SJ/ظ}%@mJڇU{ȦEWt}waQ㹿_~l ~jjر:uX1twl6 ;#_nF[UoSdL~5ݳK;)]zL]%7X?A}jH5|2|*\q$-.@F|gzWR۟fZ'`cK\cEqѱ*EmEYo%=0 r ךb{mb{ȟ=I=8F۹]>Z\z|>K`?CoH-aq@G9's+Ts~=\* 6fFְ4`1yD*]*PکjS89W[kkwzx:xmͲ+eJ޵II"y乬C si}sΰOH+ͽ Y2l gUݺڤ|a_cRn>X?#OsCxJx 5?|=v$4ޟ OnJZ%K-an%@'j3ONO{-[UlN qjPc!ϐR5 TXDdR7UFv/ CqzZ m[X42'q6Hl1'1\.P\eZG_ܣ3EN>ݧ|$!խQeAݏFXmnS^=/N+㛣gsnSX*Vp/:$Wf3[y59=B;U!mecenT֯OgUV:|j8Gb^5?{I&ԚJYln*꧊of>:w3do_Im/,֯ʽ^g34s4A{%M ;,Dfu#IGbgAycc(%$_aHmVHUTHzKkP(: [T.AVГTe ڟJ7@:V1iώ䉪z}˿隳si31y չ2 xg?ٜMXs>7qxcZ T۳O6z1 Bx/4:8?Fzv?{״=,' Aʗ7}ϕLmJ, _N5\O-Aj^/xG9DZ;d:MG8h?6nh P۟ahq{,կI}b3z*u?O 榗 Yp /\i(ޖp`NePV .4`B,_G׺p;Om ~sn-b9k 6c!zUB @}?tw p3,B PaUtY "z r1Z&bՆW6N1Y4pr( =<0oU)O}3,rI@.;j5<\eZCWzݢ3pZ 6{YUV~G!`YҾ"Oѿd{ix^MuWٕL!D1Dl÷c^Q۟Je-+>sn @\?6)p̊w_Q/TUsPQ]4AD(3u<+j/#@2u]9_}Uf1ؼ).Ԫ`k (4|Ȧvm4}v/GeaBZtAZ;:K`U PZmW}S>֯>}r R4,wԏ7 Zrw./n/\jCkؿ/s)?eZ$LkLr%kg 6fɬh3Uͧ@&>q(,T4 Yͺe; (3#>klo^&w"w%0 P۟"WX pk;P `3@u;eμ.'vZMe[ף k8.0O}jl_ 6 %\e~CSA@vi@wԊڇUqkQ("elg~XcEگ(sY^۸P+g~u>%P[ 69V;FhLb%5_|=_5~΍AU]˘{z_8R0\k1GgLL{BPwD?9Wq/gyPCJ Wm; @3Pkt>5 53K`?%QΪ'nn3j̾.ubmA:t] ֯ui ?'p{%jGɆ(_ULe+Iz'v*-b*.v,X^"Z}PE[`*)97i@ # >o hRpͪU rEk"`_\Pl PWvGzH=;ėX?t!|^.NnX oAq'3|,ֿg6d1I0[FT.[rk`ݝgn/~8 *pwppksWJH_t!qe8ۙ_MR @8xsVTb>ZO[^mU4jh>K`?]Gv9Tr*V|r+;~5l'Ҷ   YQR۟X=aWO) \p`А?pVD1ؗWTTP>s {t5Q0էi@'R@L6SJ jS>,׿X=̊)]]51W 6ˀ@fC=ybظ>z-\Ap|Y^<.W:Rp~K_=G $@mJ_X<:&>{Ed4NPy <ǻh0B؎-l&}N䓩Z%zl>K`?%l8{{S!s?mկͲ~fU 8jWxFknkmmx۵mo}6rS\e*K:ñʄ5 ~= bhodS8>k,"X|3&`i!moRNmJ_hjpjwV؄ c\8qQ[~q#k;KfEGnop>Y>hkO8`էO])]XOi0w(o8oӞ={? wXQh "mpկefB&J&U/9'0~ChsWYApb0+Fأ(L\eJ;ñʅ5 ~uG{o'ȩ׺q9{]㶿?ll}l?|~n-|.{JZzv+2lQ,I}`!M\* 6;M/eUE[p[%\j"VZ 6F6ˁ NMչ*ٷq{"+M@eHv^2u\ d_ ֯{ZGuSjZl12\ԕ2?S[`ˊݑ`8؟W_Т)[ՂcWr:mwM +>~'7%X]h(^Fj'= Wa9p%m:Kfm5d9yM31iz~;\6U sFչq6l?G8 7 UX"*S;K:C[Ĭ3͚eķ+'֯?[h$Hn1Bs E]Mvbi[ =w|t%@mJ>\$@_r*?S?]n?%ܟoկ.{СC{t_Om5m 6ooo=XoC%mhEC!%efBfC5*ģ慨Wg"MxjQl&d4&yV2up -:c}CIт;# >uwS "rj?Cf+-rMjxNmJJ{$ P,K/O_O)gcrk`sZ@|ng 6+ ɬY^A!4YUU]XVʮq/ɨέcjȸ_ ̀ xҞʋFwf2CEQź /zo5r*\'!CUӓ)3~QrLXH yvRa>}XM5z3@2%Lc[ ghw$fI,HB@t!N ~& 1zH{='kB._M=ێ @tjZ-/,$)JS|yJZVBl}/.} wy28:?.=s!jS>( \<B37yfpFj2`霡2PV=gKARtx[=.X"$r~Pf^`৲~ .Rn%ȔX%@_CJ>tYv ƿci-ٽkwEcۖ[dVyX_nt?tatj/a H W*Tk"+U?b-'cA:ୟ Ɓo~E1N_6X$@mJ_+K[d;uUZ^%w٣2}SzӅ{#3ljHջL]}S񽷋Mo? P۟,H Wl%` 8t8x^P`v=}9YleES17׾ hík Q<-Yl&,Khpl}/3%LͭRd-lfE!5?a&\P HQfE}avo`!4%D>@fkD\> J s6դyWZ΢֯iۻ[|!K%!jCkؿ؅OMnؼx_`36܁xSnǏ/Л~uWrX%VDX_$@m lVvdb~6Jxta v譮&++83[uZ̩%0LCkT6 ]+6zz\>K` ?;zY~:( Mcկl*$p)_wg^{m2"( '# hQ :l9~QW6KlvCOe he(rهGB>3ַE%jCoҒYs5ӧV|ρV,#T,l3`g/¸-EaJxaogkj, 3 -ƃ2=\ٍdjfIOI,f"xRsTSDԹ_~uϿopa ]_/~j@3 ҧ3e$%kjjoǞʲCK3(.[^ِ vfmv],ϥ?%~P0 ]?!UaGON@p=c݄U{xnpe7 t{x& jkRc`urW6nÅ1$ [g>9J,ʊ KO_+Ys)m[ w/xW'8򋅇ȷg HSsFfiέ.Sjҡ 6Sڠm>2 =}_eIF.~eG 뼬Ѝ V`_H{gc}K"d"qñ#.wMPY%$@m> Va!m$_faIZ'?\,~O?"Gg4Ã) mӧOA /\g5i~ YZ& MJౖ+Ym& lMV@ZTs2VV7TaQ>>p+Ӓ)aZzlYpփ/j_.?w P۟an(ΔxE^\6ٟ7T9?| &<ĝw|K/ߛ:px@sE,i)gh[K gsQ\8` (&*8-nw}j~6'O؀_nX4O)K!+n%Uյ?]/?w}R|>K.jS>f Alo_`r~_?K/%Af8~ts8CYfU~>pqA0`ըi/.9^գ5J-g͊d0'Q$(BVU)e(dmJZE箏g D%@m~,H Wa ,@7~_:tHhg}â^fsaa?\v`hqޭOL,'R^W;q;ʨ}-p%@.\lzpf}SpS66:wx/ APw#F :5vӭJ`j @\j{,l iCoe+4߳yjxRklB;< P۟a&1Q PXJ&B{&N}M>X=گwt1N{/\NJ{wGDmJ؇ϐ/` I WHf1q,@ 9C'e6uj! wexZ!"c(C\ ,Tv M>rU// XaWl/jzg%v bz-F[(xRXckPCjFd̾XԊ[M6oRE_9|^WuS5{8?ta8pK,* TOe D%̰3j GW N!A};HoWs & "c\wjo|K_Ԓ*C4.Q#n%E$[cf)lj}oվ̬VvHPS1q$1$uф~ǟw@Ty,i-:gpy<ʊ؍A 6bؿ"Fnd wW2_he9_}Uf1ؼ):?0sq,` tf;{ybCӔrXE_c5%0 P۟RNDmNmE-Z|"M}8z\wC-`#1y]*āЮwrUgj!F2)&)i9dUG#OH'ņ5NSZnߩ-?#\b9G|K`( KlVY͒Y#[θ~b?2aز'I YSx,9IȬ|-H΀iZPD1M}g#Ѭ\T 8kOO cңk;9{R=MffLڟkv"xx2ejS>xU/{/a LIEjfMt#δ(^Y-VQQ4/JKW>rUpQIZ,YKYakW3f3 vMQ87kN64B雯? gɺ W+:iދX[e g@g= 8{ jAc\\ٿ;>{:~bI_+ͯS5 ~0}l<5_ 6&g%0z ;f @3Pkt[lPծvx ޾>uVCovJXK)a쎢 tV>"nS[|$@_-xLS}8ܞL}ZӮ`?ר#R|v]cg tr )|͌vD"WV`InoupLCGb1gK}O @SY뵄-TFw}H(O/)J8 !{<:kOhussl@ŀe$:|bQ+\6ò˹çYE=:9?N H۸&?SYC}X{KǃB' A r| "'߶[R FR752>|bPTOk'| v\bMw%@ ',o]k]uVc3X %.jS> t|͸@oT-lܤHsOWe=huKZSB헕:i$ʎ=ww۩`3}2{c88+,, 3Z Le+ :eEbڣa,vܘ<\ m䃀oٵۂ\bq,( K? :~يyX*MK`?e?:tH6/k-IԖ/} we~Z@6pn~{g!\>J{wGDmJ؇ϐN@nztK_jr,j PC> Cޞ,\bh$pZkiuVc ~ ^f3[oz˼e1a?v[WPFd~AQۖ{X "@7ʆa Dzj´ܿzK^JY?嶍>"9W=3+/u "0lTyjϧ?ta8д u1pJZV_6Ya;cưߊMկlAw…o=!*1c.Y~9SuVc` pZ 6x;>Z?6KfSbcNx=і~/2JٝoEwCԽ= ]6HkC@zfx!g7&n rdy$s,)e E6?s)ݿw->X߁??oƢG)ghe/ˀ^: D_.СC{0cy{{;[^ ٵx^eZ30 _56V_t Ԋl ep#]I,G]eKWkCgb7"-7\mP^N=R~{HmhCAe,5IZQJ9~~$@mJه%<;%_Y`U7o;%O78ogoC{{A|hHkx88)O"ǧ]Vǩ:.ɟ/p|3^qJ,qZ~WϗŹ38{Y+g}\8Z/\ؖ?ū:|g?WqsqWL?T {af=, ~npK°r ~Aa 8[Ye5~-l \D]¯ [>z>E4+N@SEatOK_ßPQ5fnfsyiɣ5ANO\uO)E|.KJEonr )bx@~u_}Sk)<^4>)-WϨmۯCͳ={uN'8}Nphл+]sۂp+;lKs|Cjc m `Cק5>B:`}/JHP N{4l HK :^:4 g矡CΟ#1\f;C㔵̱fnq>Ղo(\g5V1Wzy5}]>U"3U2m0^U"Ya0;ϘzE BYP׫ccي`sSq&u@cTif3L=Ri*T o?3X/ AP K/~o(pss!TNZwDxSvk]C nH~,J Wlf =+ me l>:eFzn'Cj}s 3@铘hU@zsM8"qx V5 6Ʋ$Sw}{J|]Уc8mOq|ثBz1\"hUXтJq9u ̔XuAEGbe=Z$^!>%0k Ag5[i/&CLXm7L޴0 P۟a r>@`3 6f9C'e6laYgaʭ>^#ڪrm8ۢ0e@XM6 v1}ۇ73I PPw=񳒏NH]w Ğp4[k+46"po*͢'sq4F 3nF>ȃ[e )\b$_nۗTxI<17?-# 63Qeg:tH%m6J Wlf9 6CF{'|g߉3+mo3UKt~)g\p`А?0Xe21[x> qCq8\;'@>uz\>K` ?E2+_ %3༄7z\c/_9砠.bbSm{5> 9<  w=4]R2yAIWSm?E_nrf`h|zooĿ'.(ҕ+~`sOE]eEjf tO .;y06Ui>rU6ynIZ8^,9JYakW3f3 v^XQ9DF)Χ~ϸ} Pzf(qh:' `CK*ߟoGN/> sl>*nWG?_{x  ӏ/ wl˟ũd[ǧis9uIKBܙ^pW>/\Kcj# [/j>!^'98Wlw̓f ـ]Й\fgW@Zז/ʱq,KvGQ l*NPz>y/j_O @ջops@~рrO76j_!l# y;5'G]궮Qq@f{,l>-)3nw?W@|"^<`E g8NFg\g5~pX?tnnnz(¼e$:|{ -n.' x!pfWv9P/!/uϹ}Kهخ껈sg]B-7%ŏW_?#y>ZGu-2fg6[* h~x㊳3onHꉏhuVc\Ijc}+_S)apq^:Kfm.FmOf@U_hngJ.v [BE=K=&n% P۟aX^bv;S]>~)g~т6ؼCg;_IQh?7ɘh#;"CQgO#|YЬ)E^W$+.cwG|GƟ2ۯ{\'n?i4:uM-v=N so;=/ChW\{ pfqpލIjL}})_\zokJ?e?:tH}*}~рg_oJ1;7)_:fmlLnƜ} |^V|ڐSo"f >*ox6sm$|L|OϷ`E41Mz\z\>K` ?y:z,_1Whf^p,/j 槾D͘y[iy~ 7@_Kw8w=OU@=KWc\ 0_7~f)g ')\g5u5j#YU0Hf*sUaOcC:"GbJ&vœXX>4Oj jOT];ff jZmgTfs0rnE$@_ԃ*cYs)iY}Uq|E6ެUCaY2-{H \Yq6znw!߲͎JÂ7Hj lwQe:t{nЙ߻V3R#lm٬le6O<}LmO|N~PC~9={ѣGctk&juVc^ FTŁ]dcSX%z}_q6<WonjKKX0 ]?!6ڳg[x؞.vv PJ/}%@mJۇ!FgsV-\o޻[k4wg$mF+hw]wߒ\? .~؀.q? gIQ.l2!#6d6?5}MSw {Kp{z)?,9v@FO9ə 6gO* ?b$:&:ZO5j%Wַ2DРTSj7B;+c*:2|~r ]A4} ~eKه!9~MG"jRZ>K`?KE 6ul'pdf 8%D3G;u!g~'g{^f%sS(-(hg{_IQ͖JCZn?|\Sicp7{`3_$A.NQ 872! P(J/O۟OIPٱ/+q=WO׏YolF- 6C_;hCq6CAf3`oFF(5x%{`_Px6a6l8%o-l)4FN`3>^Lsu|v?* aP/J9C(op0,0/\Z<جf3f]P,3l6@(-3/CU2h^ pakE F)vTrUfsk?^CZ5>P2]ekjdVsjj~l+z j,] *jS>*%k]Ok?[n{jwM)h9BE|`ܽ嗺{dBe4?J2.K`u fP3fE!Af8>`n Vh+=BJ8C)R;|BGqUs;ǧJjTF)_XQ'&1*9M/%W<0 A_BUYUc;Y Tw?ɹΊ}ۧӯ=u!\ۇ1=m˺%@_Jb1bIta?^Btzjꑺy#pnj>ynG0km[>apک*3sseܱ}3?P96.jZS>I@| /lfyE¥%̰3j GW 8f:~U+ O ZMj)il1.Kp/jaH^D[AcҺG8v ⾘2Z\A'X߾j|Jv>9(b ;_c.ݾjLh*1FKnO"@[hVn=$_ 63`m 3tW_8`ۙR…6 C@˔Ё .3ΧK Yh_*K O}Q[?V5lozg;48kKc5 Mssl76A.L)l/so? @[hڇؿ{I W_*,~ sy?o3-y5w-~u}Y}qV7ϊ9<އ|9꨸lfM&Rd-lf,5?b$8Fc߅eDr :+A)]%@?E2+_ %3̯%@_)rP$4F`k/یt}@eVt8qmj&_)jpm~As T^T{ؼ&ʄ~g^Pkzڧ?E<|V |ѱS`ͧNnd[ǧis9uIKBܙ^pW>/\K53gsRM" V_5Oπӧ 98hGed+\uV~Ig%?AGḺg\p| lVg+n /e~S,j G0lE#{2*l`)Wn=n C;9B۹f%>g+"ҙ|oСn}ob}o*W6o!/?;4Anj1Ϳ~D>>//=,nsN_flflrw!3l4FOM^oGyYG>JΊ[ZV?_XO `wfQqBm^mF:Oz%iMA8\Oz S9GCLCmqvlIߣ{ 4h#6Zέ`+dD0>$(t;IN !HmJ؇;Gv#m?WfT_ |Ih_l@ /=h4Nq78* l3ps+K@,Xd_,v P:^777fmq^ 8]F*lӎ]zXa'^as{t[zv_1JZL=cI$e+}XuwB/GnZDƋ a| ol9w)TǙ_`sFd6r6+*#[$kfјntpCPjCg~%@mJ\WΒm9s}:`ڛLڹUmsI>q/걗_1} 6([ng7?%`](AdW4+b[Nil%fzN~x`3Wp3)o@ :o9hS%V:1$%@mh~:t8x^ OHm^gpy)CEE5Tj[+ O0[*OK` ?w$}R4>k(id~(%_4Ͳ@`FC f]` 63<=_K9I{4F :1TD$` ޗaÂi0AŤbp1,̥pɆGT89V4[_1JZ\R.jS>Sya,q;ֻΧ >r9/WO׏CP$PP:$=^3o+f}@q@uq5\ Ac PrXK_~fſVUa/\>x#Q?D\Y-tVxxhׂ "f u 7S f2bH@TQsU#~QRg Y}Xſ4H Zv)ٳ-Bj𷷝;s&c/9gav3/oE :oCvy c`3vl.ЕTE{Yn\t"^*ا2?vO 0Zas'j(/}RC8r˅%_ 63`saeR!\a$묆+e6u:0ଷK^֮9Rí. g G7/211£L(7\xɴ8fʕ}h,A_"f0Y}Hr{8%_ 63`8ux^ts8gPKl3j Gw9UwHN};[rd :@n7hvc@9d]} ]mZY}XY(K` P@L6SR9~~%@mJڇ?;%_ 63`yr6P 8g{qhe7:tH??.!~:}.7 P۟Ra >_E-"3c"jS>,0/\bfǯ+Jحf08(#q%UFcu;uV-9^'Ӭ3g)l^ m WK afԚT;pŨoRe6ɖ%3ʐ2_P6E|$@mJڇ)=<%@_R5ώ-w"^Tץ|lVYpVk[X5G}VEd9ظV.?aR.L`3 68p626vN wj z@.*_xX0 >IMEYxj&>uTNgE]@Nt<O`-|` Em=SⓉ%@mJbq,F PK/]AU+zqxPK㸝HܵE?$I Wlf)~l(tnnnz(epYrOȿ xf j#)r4y]SrXE_c[]>˒aGKZM닟 A(+1kqWW^p!][)\"tz畍-jGc|^V;ZX :_ۗ}mXyqEϠ}jCgf |%_ 63`A g)Y5f]DY{ P64L"چ9Gr.Ϊ /,_C*|!6RLmJ[d;uR>ZE;l~vhxqq_\H2 pwvU?{}{S ͈w-5!@^!Gd>ޡ}G ̈ͅOmJLؿO~sfl7CU}-8`p3YwͮPf?z,]/@?uV~)_%p?E2+_ %3o%@_)rP$sQ<67GT68TsAo+_XLa @m#_yگH1AS۟" y !Wlfy|rE dWif tO-\p9\ֲ4jEI?ȺǓz'@E1:}2mi!-vlS1IZZB񘆌8,0PGhCmAnTq@7XBʍHq@h}bg-;N$e3e>eEϣ}jS>οWLM9B/lfyv3HcEQ;)\g^߭~q5gb?%.Ϋ@g -Л&n{<vj~juQMWO!v~cI%@_gyuŨ6ըyV0 PK_)3:n`3 6Np3)o@ :o9hS͖렢X.СC{ ζ@SVvx= 4p J?n[j@d0"XLweϏ!ox|zK{n%l PZ0DB0& 63LQCtA!$6z Yt?l<~ W'ߟR`s?c2xl.h3J:C[Ĭr[Gj=~m]%V`F$:HN} U-dAj{fL*AYw>LG_Qv@ʱ>壳;pfh %j~gS۟$F|^Bd= PK/O۟OI0grӝf\lI e$. mlep^~Whq_>w*?zmFn|r+u8_q,kfTƉ#}T@}J(@qن -jCkV5lo뭕_, P۟Ra ώ8~ a8tEx |_;#}I vk~5X5D%iQ`A Eh<ϵk`ȅd\wK'ϏeL#Z:h:9^c ֧ *LoMmJه>.$@_(?S?Vn!?EBs/,'ܗq~_:tH~ߔUQV,w0+فӶWx_KF7m,8ٲm 2ELpS*h{c ~\Wpt?%Ըe@+Ϣ5ώ-wO,NجvSu!.&8^DjQ/Tb SH 6ImCAY-/U"@Hޑޠ31xe;}B%؆m+~|Z%0uPB]4Isk$Yĩ8FF$t]4`gFK{|xɱ#Ѷo1ҧxѵ$nFmJۇI<l%@_Ԃ+ts>C)[{}PC:5%Uwu ];N)aEͳ%_z=1{|%2x3t|^f3ʪp<0 A_5x9͗c"*XZ>ߏ%]UlUf/G2p63@4]f('*h"gGLM)ۇUIxUp$@mJ[dk%,̀z%w9FـcdQe{mZʌZ>)aؿM{$_fiD(l2qc3tW_8`ۙ381(N}կQ<"K`?생 8z9fcz5cq-EC@΀^ eFzTQ^$0hK܎T !F8׿&<p `;>֩uOmhCZRRկ`㶔:dC[@<~ %6@˸^-n!pZق*Y2kdFg^"[v9q~Mr7Y)bYZ( Q~Q A6a Z= _фկƠ* h ~<$|r3l:eG1$zg~M~?%.Ϋ@g׌ f?h|5sp+ϭe8_u\6US}`n.ShKw1 čBMDdccoݏBsGDjM_1doP P۟B_;W68N {q 4:uYui]}!, o9Q L>/[D_6K`@ PZಟ:$WI(~Γ`@eV1͢.QA0A|xbc[5g46|Fr52!pq(_5{*0{4v~,jMm/u}%@mh_;=W!yLPK eRۧuK*{( L>/ 4b` 8Fr;K)elV}'ٌ͹bbP.FT>=F<3fr'6ʦUWL/q#@>?VVpYb/'R=lnRg ,A}X_‹;1ySf81樂e}ndVf߅Ezt$@{m4Jq}JKF yuF3LP}>zרM}ZTt~GQFfmIDAT na9Z@+kY:_w9`yz!3.TF貦hGF6 1T OXPyy{_E_{wei%` $@mJۇ%w~#\by/=>6/k_m:`k X@&=Q[߫Hܺg-\k4 O 0琓8J>s/RKg I}ٱZ͔OV}Y\4`gH#Wnu L>+e6u:0ଷK^NU5@-ڮ T FigjKwC.Ǜ _{ه=ȼ[Y֝'B>B|^񊅯|֯=˻7ON|K`?lxb&r2gQw}%53EV]VC pZ 6{[ <w޺hWy`n@ce+ook'y`k>&oi~;P}(%K/K ~QKrLtKsvg?Eâ(~L/fڗܗq/>,zg(c{69V3d,6 4:_\܁V L>WZy5}ٟĄPSQXe;AO5T3 Cv#BTͥPֶwlxvz,OI0'ƣZK?7)e||^~>yV 4 P$P0$@mJ؇Q ;h WY98`RBE?ř >epG7 :gd777fm2 8,Lտx:gN_ea粍 5:u@_k~h vo"j3KE|%@_¥5ύrP2st|/imEh{"c:~ Zs%waKUFp0Y&4wһQ/O.jS>X'}-կ2`_ W0ڡPn+٠=>eTǞ*yMXw+3tޫ [ql  ?ooo >%Ux./h~]gM>׺߇%L P۟RNDm~5~QV d\[eoU\7ٖꁪU_߱ѳW﹤L}jCkrg>wrN=կB`s4U#ZA! ;P(0bG f 2[-ج(4dO"k!0s{U-CSK )bYZ( V@I, PWFV:?@NMqq-6s K*Q Mj>&n;S- WzC1KwxzSFS"F†y|mw;G"EқE뉹Ul^6KGX(}gȂ~R=R$U|*}W_@ghYg4Cndj#ZĄݺN>ԯu<K`?AGḺg/Xzκ@16j3n^#X5~-[d 08G"}6FE ^8mh ;LQ൫2Ne4Lon Pz53L+#]ytgz0w[{ 5+ juo)e2_#zg hj B L>/~X,?%Qʪ'U[-U]X뀥.E-s S %@mJ؇{6fPMgk~w7?Wea` M.6թxe*0Rϭh|up(~—M{*q;>UP-^g'f尌"cz_ef)x!fPQ4|j}vr7/ g,N}`Xkussl@Y.#Ie }64> 虞J_b_ϱ}s|Ïه5DM$018u!S},cneR1-FbYWuX&ލam+|ZQlD(31[կ2`so('y@:__qv~shuVYKW{F|K %jS> t|@oC?(ׂ;gRJZ(m_1q,H˘ qs [ |D\Ϟ8?Xr~B= BF;omb`ڗQt I`:;}ڝ_ B)}e/e\F_ҍ[nJW&xJHt!qJ@Y'@D|rYG&¶f#W@\Ϣ/j/u}%@mhC2gC?_i8A" .̵j磂"&c＀F$8 LD2ɱQ>!}*)]_@Yg2|N +7z$0uPDFgwa M}BW 8[YQhHۑI2|PtoT==|%@_)YK)e&C>Fk|c˜݁>-.]GT\Xyc#qI:nlյA9&&ґ~u-&8Ltƻ2F 侌,F r4V&z"Fm_(GY-r }E<%@mCZBA4kfv9qmzRJ/ظ}%@mJڇU~M~-(oQ0*瀬`PZ]6e7o!^@/p(x! $>Ѧ)N |B %C/n}կ7߯I/#KF%!͈9I`~ WھIhFXϛQO| K@}bf֠0]|:~QKRg Y}X_[r|>/H$ܗS|rJ;򉋔~}ֶϙ.RLn, J?g:.RG>hjCgF&HS@E=/ }@ Pq5j=3(ogh3z<椊Ƿg H PZ%0n PK/O_O)gcr?0e@G:"PVYU߯GClj5EQCI̺E/\Z(r|{$jS>Cf AE="3c"jS>,0/\byr=}'?Б[[šC*)lf 48 !)$l|n+-UQ0>[p9Awj*L'W_^)n%-jS>d Od IZ]5K3 %Ehk㈾8}۠~aQIۇQ;$_Tz혘|^os8Qg4%唍>Q|%0uPB]:1Y{rd-0YLg1_HqQ}ܹKK</ѕAg;wH=/vO;<{vhOO 0#rkd`sx_g@XoK'3t|^f3[Kfy`p}'zU[M0{@fb*ehjMV1a*Zf=$0u@_=ɗX$@m>tz|$@_uo^,g'IG vtnwC{@-/plOoهы;Ȯy`3,6 J8Cag`.Jf04] MfL2/&C *,9J;1QJ`3 *'w^EQ.ƀ!x*fHLoKljuc S۟ʝy1WF6׳-P tr_t#u.;s60cy{{;SX8 . y`rNlcJ 90{𭆙\iS7)eDO`];%@_2_.#h+ds0Gc*.LDžDo/+pd]C5Ԛ1}H˘4޿2W 6'$hL}7i3.Y 8[Ye5KfOSfʇdQ }P$Nё;>q L>үDM/jS>H P"A;΋.jP"3ba?>Ơ_!Gbw'bd{99֌iOmx\/؜^`ܗqz#F8C#X}<͚>NTA`` .Q3rȩNgH>y~ ,=$@m탬߫`cz>gR--J{gKZ{gxON,Q;m6qGDX;F;iLq7GpTۯjjCo&8$_0ViY'@/:.;f @3Pkt[\q =45L,?/ס,{K`~<_` d8+(@gF5Gjʦ\OENs$=GJsVuظQ=$2&ijU<{}6@a=y>$)J[}J5zY <+vr_hYw* /့m;2X#ussl@ŀe$:|BШN:̈O/j.XAϪNV4]Pu %j ' ť1|>Lп] /\*6\m>UZjVT8r_aʭY 98mQϸ+-}X~[O *Y5]e U2.;%׀>(nkp4t\ҏ2mhR6/F3EF|nZE-K=Q1(;AmJ؇qI<rmI}$u3\^ӖCIN޳.СC{X OHm^L[[+ 8BFtMA&pwO!j8Njq`urf Pi>K`?a:}orG_ 6/Ys_Ƶuha7u &wp L>/ 4b` 8jr )elV}'QH++2`Q [N 25= *(Ǫjp_LN֯Nqr)U%$@mJهQw~+\by2G˺S)g,)hJ`~I@fA/y8/eUŮO[ s_  =8woF)s`^Hm#X<:&>xl;{} c4OeIs47tE1ԏNs%@_{^Ig%?%X;k˕@~1ؼwdm#}֡ݨ3\y=$0u@_~fſzxU`Kq|}j Pm&?Ը0 Qz,hj4^nHo8# %/,ژ,=GyшPBu'u%j 'Η/jS>Ö-\byZF23 Iig@;H`~1xY|lD\>7A\RuF#.2v`\p̈́^5ZmՊٛGܪ?1 ` r; -Ƒ;UYH06./وϥ?%Cqe:wz_jIr,K,>_;;a8tq#}ܭF L>+e6u:0ଷK^**#f\f`XxKf{<LVui5Tまf\lT`D!2ʼmmUVo\~c{24j,Ou`tX̝~S2#:f=هt4+#C_YR g Y}`^-s?0e@G:1%;RrC pZ 617,Ƿیb̗P48`3ΩjhWe* 6[vcOei׶E_vN[tv7"dw>͗0!6<$O1|&.H!11G\dE!]n[O]޻w?]{?j}몧 _$̮-aZ5\#0k%]s9q&Fj>mgr#:l}8Pdbn,Yn+}_λyb۶UL8hv`~VrnP]5k!߁֟xYnkIՑ6UiPPl bsF?^5FAR! xqK<L0m>8P/jxs_?SY.?<;cH_L6^qi,t?Bog_jւHe(MNۇ,K A,lf s.\ްg,GQfKrp$^z8 ꓶXϹke7Zyls= r:ړYX3a\V]M(_m^ &:z=E q٭S@Ӏ7q '4MS\MKCd51cH_L6@"G u07dN+_ ~꒧)kcjو}htXU 5x?if-tO(P<pN+*@/":@PYql0@#LFh~5[\4,==fۿHd*c0(yzwղ3~ ^> :2C^j>dd<5xlֽiKkw=mE|}?(r8+ٌ#B@`G9Cq#O(zdM2x#y G+=XL,yfSՏ /uK[ynr/=@4?{U&hW&'}ͻƽ x7m/,/&>\aYT9d_SNGwOHa`m߽}y{\P۟azTFRWYt?2x@Cc;#G)1GNɮx@(ep^: okm f3hv2^{y+8j5Y >ͯ9-Otr"@=M7;?Ǵ RzOmdxцH: DIT1o7#sEE; >}. E u~!gt:I1DžX q2E:Kf,v! IU;ᲆiLǮt4,3~r>_ir.FilU@3Pϯf4Ζc$'QC9.-c;AqruT H6FcJ8ۢq`0_ '}J :A^<y 8 ؾ}ض!f gy493CC^ƺxA4RwT#Ӻ#0t@;x0%'}6~ΔˮBz~Q#O;34F\NߙzQxԓؑJ=,2$y}\PZP{^ߧ|}ίLd3tqN8hZ(ưSF`Ӻٯ5bZpdА?U<j"LcBpnlV4yC4898tk~pn3"@mɬZ ތpP՛10>Y4e_2eZ?+e/(/K`տ*jbXphO6T1i7FHNmBd}^ߕ>=zBI$YW[o|Pj{8_ +#lfEܧy@`Og%YC!}:ڣ6u><.fv^^K+ W~i3#}뙃ֹc>_.S}V ֛964r1:i_Ӵ-Z[݊iϺx^)e ěe%D>{u&A\:r6⠃aCLz.'e)CZ`L°E[940g-dD1^<ܑ:~~1 hi OFW2CW˷c j>E1|BA׼RVX~J9^/{=oR^x>)tjA9/nB7gj|F '}b}/ t %lV>v/mԮ~I՗g r+,d@@Q&;\Sp{X ;G$U~1Cs1]7>8וϳeW&L8SFRʪ2xꈬ0,6z?==@ZEQX8Ajtvn90>\uoUk:3y_{@g]1! :ᱞP_yAi(yvKG u0ҷd>k[ Ou >_ݱȥ'}y,zrx:~ܕCDdV{PUϭzB;93"@=cRgj>Pk:% +=Ge`Q{ /igzD6vK_X g= 5CG\< @mh~ھ}ض!u@ ?lFi*N*6ųQ[uEP^PZڵbM؏Zɫk{ *EbN\Y߬LK_L6gATm`'LkŰ~r]D`!j3u`1h%UUy:8ψ،XQmI}O(~%T5+YO @4Fw~D={{Rgfj>t>iRMHrZ^ k53Cthqw\>b 1y퀨#HvYGBOs!Rl<'_GT{GeQ1];kB]kPש\qYPㄦ~͝5ajCg+þ3^\_jP|F#^;ê&u~1<:֦Avnι fkkk@ۇhԘĚ؃؏쎩QlڰMG񜞛&nQao>(צ8\&hRߍFwN"9_)'.j8 WT1X'ax3-3gj>ds[:ўv bh7ʫK= 5t@;QS``uVXQ<+?84ԉkUurCx.ý>ds[:ўv b(#"/ĄsOHf >d_:B*Oc5izwna0R&t/+ W&_ ݫAw% ^4Gx$`=O.0칍F03mj>ɽnds[:ўv~1\Kbb۶ ֛ξ҆=t< < 5T?=8FYG\bO[Ez6#O娮HV\!vgø69 9-Q,*YJd -R'#ړ7i|mu_'}[ ǽ5oj޷q'[>ί|d3fW"rGhC}9)t1u0vД"bh5ecdgչ'FJ{P lII LC91DVj60 W DWT^E44VY끠5fF _@Y"8܈lc_u;.E5c )to ,m.kJjOnc(_me昿g Y$ee*b8o".7Wί 1ʱ K<$I'}# 2ID ߣk3}_8^bASqS/|sa0k;O=yl;GaN*Qv/n>n'^ge쐆N}{uyʳBc@=N?txF`*RW͈_D67hG:8u0=@zfXd5Tl.9|:"X-huW7n4ގ*Iz}1x+ی> o=,e%sil1;wú7_1?c7לqUb;uӁιN)K ) W)7Ĵ l2ޟq ^3?9wL@ u~!Uus6H僧&ձ_yvZxWR/xQj;"<%Q<'":'!@: |a7@0cy4%%86{6R#Ƙo%ްنnhWm8Fe샨sAY[Cz~Њho ~5 h\ N>!gtGl{' 1;[ 7C8!mv$gx_G>T{W#@D6Ci#zZRx*Þcz-Txoz+QP^{yND u0N,34B bZpdjɟXpLWz";SxV[؎:3z3'qK:b/S|Gz~QD?{wR^EUO|]6F236 6b}S\~wPz[9j\XίͲ^ay!45.2vp7\ScR9w* D3Hk6^T3yqYFVL,႔y# Ӹ\,C/Fha쉢 rV>@#j̙gE Q4Yɶ)o.rRs=v[֛7ۣK2sO|VP25Fe}k"@mr؇^>l K_yf`¶ C Oj\֠GގXF#gsћ:W c1Lia_<"@m{]YY༊tz8@o*6D*}xEPQ{ c\K=A13awÍ8 Ilұk3i1AEe+8۷mR}*@j ?FĻ8dcG}$Mb% E n=7>dZ߃J}(~9`^$GV^>{/{64u0n9bsCef una?hZْJBCFOT u@t3X.H=53eHʗh<dsI*~޲T<ϡ1u~1<;=teM̵,nt >d_0YGK&\VE4M!`c 9(i)$z{(kfEMY9aLH _p!"@=193iXa|q`b-i>K_L6W3߂8@d`0S!0t@?d%/f 65ĕՋ7+3;kuoگL[f֨@˒"`ϐä?W8|]g!?(2'}X{\,k{(_"y}GTL_L6qx=Fs/@[ ۇ͠Zy( V {DN봇.xb-Ԩ8o=,;Vl'Fv"F6r]]\lF" =Um" #k$>W|~]Kmr؇-5<:|*9u~1<:֦Avnp7}_.8ʊ U0ᬏK]} ޤ(~/J:rQ;:v_x"Wť:7BR[u7=dL_lyزlB߶ |ׅ^ 3]s\g @#@VjCg.7q_Fg?sif\Zn4^ɩٻQ`]gA9CĬXnr/l gR=XC'=~zcu <"DCeTพ!#^;k!wK{I<ێdEzcrרÄm\gM-^)ޟ1A[Fmr؇Mܥ"@=a9yL}wYG~G u~1{9wȵڍ՗e¹$snhn޾}ض!u@@0cy404F atQ1hNJ]2˙:v6dvU_ 1.j]#y(۱`,I$eBdpOV~_y.4RZ69# Eݯ\w˟O.0Roa`|G{ځ,<$c{3>]$FL¿|cQڤIm >d_= b gK6+fsht$#EA֚p ?t3W Y惲(k7?lNx]$rU_4Y5"pclA.E PҶFVO:z{]ƴDzCd=KmrڇC͛5sI)/kkaaLM/ _jCo2U2ίLdsʒTR92fL2L͛js,2F6q:CGaQwv'T"0V ۇ c 3 1O,{=/'}/ܲy@z~Qccv.E=%Sd=yѨ^X.Cp\ߎ\_j=W݆쥃 l^v0./;(Vד² '#_j>Cs3t/&lH  tӓ]YYWh%3ND`!,g`P۟,A@2B$7#q@JœC9=~y}EjH6ӑ2}wI0@  j|q`lZ. e14uWӬ=a]``Om2|@Q~b Xޥ}9R1|#Gauɋ`czk%⥼w~lY}ؠ-cߖH󋺓mo#{eMg"8C֭.$4}o^%4A=`dz %٨]kSz J_%/] dsi`s6p<:@0 aBnr/Q#j>E1|^,H) ,Y^*E2+*ԡ^q,q F)$3S~,xb9oP۟ i[U,^P##0/P۟l}_0we@г=*{9/mN:2szW۩qN!vŐS\ 0tk~q4ꙙܑPZ༟o.m{H! Udh4JCAQ 5,p͆lFeTa%8Iq<Һ˹Gz~bDKz.o}p}ä*hʣ_@%mP}<>u~1<!sScflۇ,hh!'}8֫%-٬$4Hx B_N{5 -q)eRv:>r?>ˣ}K_L6^qir/=nWѨmpL U b)xo{L#7/ZzNjHe;^o ʆ0tO&|ϚAmCπ05<:{% ɉG[HG8pKdr9Clmm #E u+|9WkѨq~i?qCD.&4u@vΪ 6Raز"rPLf+4k|=uqr!@mr؇\Xr@F<3gj>ds[ds[k1եU 㠯.V}m?"F=7 ~װ&R7pD4&n]6 igiMr)=:(]PZMdAz~Qw*3j>ý>ds[ds[e1`Vtb98kU_۟e~I0ZF=Ƴy"k R/\d}򷐴, jITE;CZefK|! 8'}E,Է˟O0'Ro!yo!b$VWŶmZofK4OO8گ86>X~޻W!XAUiQ[B,M4 Ӭ5댤,s%=*vٖˆ Mh1Vvu]'}܊yFz~QcK?-L@m6i;n!T47N/|*h ?D{qz0gAU{eƨ}zPqf[[l;r,VS6F6/}\k|`ôAE͚Xmeu9nѨj.py &/}TY,r:Ц>u-n"r~l*5&=TuPq:C159ogLuz~zyrNDX^xG'מN=(#xUOiSeDMY'}ܜ9F u~1<ǃ3zC'y6Ij5˄ gDoLؤjVIn7KR$M5Γ5uӺɵͯus*r#C}q7P/jloZeFv{(Þ ޯA_AG_q-(HwWs"ĸŞETqSٽ/lpJˍC^*Tx+L#dS:@ @b%jl;:r,3 4ZduxS6dx}}դrr=뼜Y>w-?9 2y0 s@8Z`C?cb3e]I$f,oP`.x+Nm!g._fo6F'jުMJ(19O6$q4`sOBF=Z."^[,\\mR͵ "ds]O: |a7@0cy4u28z Bf[, J]#^s@AO`y6zA=񠝿犽%qgG쯫 a_.|ohK{hL#PbDQVA,zNmDRW|qƉ1h<^J˜mJ,U4k @c1/6EQ@5s@brs~ .S}V ֛9>\mO=u}ۨuou?ztljSדv_mSКh`ALy^c3*ٯ<]ܵUEpF^ F8]>n^x.%67|u+l2$wLe<69״/[3 tX<O8ChU#XM_M MTF`>?9=Q#AΪ#J*A^&Ou q 瘿YC7md'y|l3&ԇ-.#Ҟ~L@]bl秂BXcߔdgHƛ/ہ/?^о\Sȱna_H]ްlE u~1d3y*y9CNq3@b_#5$}pO۷o۶=*@j ?F[6nx4]; !v [XzkiZ:^Gr>Gmsb9[+PϯV9Kz.o}]{~rX}թk*/v0@5!#L@b5]-tWg_rsbWK8[YIhHۑAxVr`h;Wu͆DFeTp`e %"@=+\7}`?̮X ^k|χ@b9=Nȵv9d.V}(F 64'm+Tj3$ǚ1M!@mC5pA4kfx@9auhξ%<cݰDZ:cmq}J;AFfFǕsRgfj>k4>"Y.9HsR}6Fr.-4qRc~j=nVJh !:,'}7 f AZk8-†<-_.H):Bi `Jc=i`pqBX լUW垿-圌#"@mrۇYߗ&<+X'3/&&G bHCa.V}#"xWm``"D8/A;Y@f3"_CFN[մOPQ%>ٵ#=z#mp@+PϯV9sݽ@b[L@1[[[|"XhXv,,YÒԚYΪ+v-p(`"3ӱBK9i=$7uM}g.O@Gz~oQ+r_?׻W?9mF 7wgȵڍҪĄ3hU_G;Q{2!eU] #k2Q{e(X-|3 62n>P2 @=ieu)/,?P۟\a/&/TdY e{ U%p6ũU_2$GtWײi5  碚*jLd٨,ihf%XMG v!@mr2`FFSe2y^E@b63=A u~1ܓ`_ ؾ}ض! l g_- :o!A!k .V}E~~U|hƻ86B=r/M ]>s@ǮUΑLyR[{Nj#ڦ2n'}  f_h~Rý3 i;.X9/Ȥ:q"r\ºCŊ*rxK?=XųθU' 80 /?asd "c11y\㣂%lqNWvbsH] wghԺG_X/bWWl⁵|mHf*ٴ"ZߏPپi_-'}M_x瘿19 ݤ=M^&DqEiJޅh+m\]Q5B#}SN2Ҍz|j> _n|#:lq½C'y6Ij5˄ gDoOؤ* 6φ4rːNʋY]n&^[U;n~u^WkFܸ"@m> vhp[@z~ıE.#QEoV[j${G(*^N/v UUY:Ƅơ(AE,!#W7BxCV1 \5s9SdE fӏ}~ F`fG#c1pY !"' =ހ=(xGe'^;#wR?+k㪭 QON`qp mm+G6L#WAP >,SO+X]*IhؓS~]7$0pFƍuJzS>a,23F/&cW2@v1tXo`dh4J. L{M]EZzTOumZk9WREwr \ #0P۟\> L8qE9K [7vDn:űJu_䱿Y΋_Kpr>B{r`i/s?RK2bc>tL,=F=2OmhC5hgP\@b#0Z AKΖlV^RY#{ۏ<蓡 ]k X)˼W}YEdrY"A& Yy+;EVRYZsG}=we} :<]l#cP$A}4!^]1γmI8 O{RϦ˧?Y$1@b#0dY U4k @nQpK^ [p~{ASٝ`P5S/j0ou?z9?c۔<>l۔w(1F# iw>3扝-n#@@Ő;\!X.>[=@N^Ο:l}3[ 'V.V ʔW&ZFO*Y5u` \n܈x O;ELT'.![֨~=߶܍ b yS_)m&O;M{.pȍ0h&!O0ͬsUL]!:lp=@&r,Ū]9lD:}Etib۶x YHm^ hrpxG52Ȼe꼦֢%uf+ˁVc et bā8jܰ iob#8#4Bڇy[߫`ݶ{:hE H_L67/ab8$$}D ucۡM%m00&:B]}Fj gK6+ >Sx.yyRy( s!7vkуj) k<&Wf%_k&732@%'}7 mB]xA@b>p@vr-; U_;e~IHfEA/w&:J]}Edlx!uG3\Ӥ-|M6}@4FݏO coe,sɒxer9#^L6 8hti? `ODz~Mlr)ϗ3smfg} f~N#xqS܋a@b^_x|l]Zak=Mj\2'Q]Wq O.\#6+/5\>#@a@w#:l2S!T.Vh\-n#@@PY1 g=ТSv/`@`K8[Yy5ÜKl$}]ؓHƞ:X_LzWDV^Ш_IrDeUQ-.z{8='}Gk`&#@=&`Y/i|5#`?Y]F'/&{røԏ]]4e7s,Y}9 }(5c }q\n Ūϯꞃi@@hF}Ƽw1٫F/btʳyی4 FfSF̳9 q>Xk'Mi0rTWj;棟ml/jJס=~Ii]sA_hZp5ujCovqg@by`7E bh=.cd3/= * jgnŪJ[,,fh1z=d<@|ω7 ~ŃWxmNL[Wh:Gڤ4_)kqwB;uЙKf7"DqьDL!%?쏧Ĭ'j.+6EҺ3G /Q+R4s@o[ ʊ ^ g)Ďch'#",5XqH]jEf.xb20sa0wC;_`%o/S'//ԍQ'oBپ,۾/@`u̻ A/I)˶hzr jCg2G u~1{-dB b)Y5fu:6mf36`/`] H>^꼩u;c~5m+_ G[~HP۟/]5Âh R3+1?e3wi0'xzL0~YF?+[ױqn]U*tSq >}E9zrM6#<7;͹#@Yv۷o۶=zG0~FF8{ـžRi"bܺ~[bw8[ Ūί'}6~γ1^ EͰ? "`pt]'$ܿ#钗X;P& #܁q -AzAPZP}#y}AR}[F\!hZْJBCFNah?e7c2]dL]hK:rͯ&mkFGdrY"A& g]#@=eN!#N^o9N)zc?gF% gMx _>bx};/slA8YC)}:ڣ6е>u]AyFs6qV Ha9u߸|F`?AGX]b&XoX34Q󌋸Vl})ݤbBH5؊$\0Kk=3WC/MirXIE4ǞWjh=zߟ/{+Nzn 9?4/_UێG'g󴾫I|#[$r,M4 d3F`_ 3 Q#X&QT5dݪ~?jrIyr_yz͵2a쉢 RV>Q?AIUpD=yiޖX2Wmlj^c&N?F bZ=FnqYi/x*{F)ۛdؤ/&H-"aco'}0@K/&y03@p!@bbU80FS}pz+++g3*0Lp֧UOHxm<Chǒ8x*ڷބRQg$ox'^QdU]Ck Sb,3׮~UxejC1Uc(7J75ӋA:+cFهy\߱ tPgB&ag+ u~1L?Ű?} Ū=98u_Gk(P۟UksoJ~ʋkZogFKw1 +zdR9`H6u\ Hz4>DQ=+D C]K=X\``5~|"St,2(E!=ʆrK)oqo Ѧ~ӄ/",{ZۈY>& n^%TvVo@Pϯcnn{9?#8On0;{|Yz]NBd3-~ {1 ܊"Xth^/3xMبбkᮖy#k,Hań"6EyUA)c5?|@@dk-c{\;#0P<5PH_L6r;\ mfŪ8_Eƚ%AA`RUQcױkM%HHYOC(#sڨqq`(*?9h*#~K,Q۶ixvEFg:'}{?Kn!#0CQ^]Zp6ũU__λyb۶ p$6ؒfFip4+뮂M GVGk 銪"T$rECSݜ0z#ɫQ v8WPZ6\#.֖K5yL}gy@p️G u~1{-dB b(#"/ĄTqf/N] @%h=up!G6lUT@#v.\R#O8m $=/ p*ۥ?^FP/>f\ @m؇9w#:l2S!@.%=/7%#˚J;G^NK6[Q:~?|q"Ubqg_]:uU-Ye̓7ar/ۧГ8^o,U5DqUc^{<7|rL6`}SǓJwoui.D5wU(ɹ CB u~1cqr,l>%gQAۘ}6r.V+ 0]&.'졋㊨E " tZUw,8`yږS8`nj^|Saxq!@mrۇ_ӵn9/yr;́m՞}i]ٻbjop[U'}{/Cn# tӓ]YYX x}o4$H_L6:yg`Ç aofL6FDʚŦR-x\sxcoOl.g@bU._uaj>Q? 9M=G;3`p QU,]ѼboI*)"cuG"jCk{{״@bmQ;T4fQX܍l{݆sdR;Θ{~u])O`Of?/759/Ӵg,s="K"oqqewu{iℼۃƁ.J@}~&=3PB.)'}hu}^_yb?MNJ_iW2b ra7/`@pXqks"Xl㸺y~pP:^WVVM.esF;O^:-e휲2;MW蟱7vUϊawdXYi1)1eG`#@b;51Yȱf(W:HRv.In#=>8۷mRd~ zpGQ-rVC8၆Z=3ƇvRgjCk &.;p|ܾ8il!==/- ajP"ĩFUƩ#AcRת, J }XdsT9/#0@hMUk~Yc¹#gO.ZpdАu?QEĆu@.`r @={kRgj>c\G=zj C62 y ~ӱNTq$@$zhm@Ӭ|U_}=3mY}"B. .5% SއyXC-4QhQSUuɲ0Ecp/>cR:UUX^3:le+}c$C 8Rc~1tYk}jz-wz\ H0Wq'[a{33/5\>#@a@w+Y HUS uVdsM`9;#04x1.V}En~ +++g3ʫVU„>2/uYk|mxq,.nXGCTW9j; L >9⫬ d1{pw{M01g/>Sn#`_HFg?l]%+= Ϟ:Z#OX:tcc Gj;6bhl;rKI]z6[d5Tlm7~Tj}_1bN_oTwuI!eQu:~OW7W}ɉ11{qpyeK[\([}Y&;0ukghn޾}ض!bfL6FDu,` fZ ژ'u6RbxwlhEڎ="$fD}A"mPZ0s73j>ý>՘l~7sTK.| CN_8. i Gx:scQ%cR8Sr:w鴈tҚ(ecޥ]Fy1Bҕ UHtHҕDJze{UqդktMMONa39{GgNwfE,t?BoL8wvSQbe_  b gK6+fshpbGõo\ޥg~'O'μ#tVnGgNx:yN6|<@d)IǒGK2IUD8|ߌ ȥsgNɟcI#$}%MxKb$}%>'Ix]dM=Ж.KO1:B\KBI;IJҎdtAJ*)f ! o_oKBJ%OSz3'#R@niGU;Vt}'+ XZ08GXϸR6OxʑC'tIN Xi6&R fAi<ڟuiK-9s?9CDI:Z0@/ yDۇ)BRWmG(V61\xm3d򀎐ҥzi߿Kht9Cq#OT/(O,98Vxg#@ u""s/p hiP<zXŎyuƶ<p\jl>!X__sY...˟]D@b TyrcEj/4yD`u%xi(XXߩ`oc4{s{w?ע^s@_H_fع IȃR ٬=ٳْ`(NP)h\Lj7C'y6laY{aʣ5>c쎸 E$POhgmŪj[+n~D.`*?B$#++ωmͥoA/Sw 8Y1$rIc{M@>Sz{ίd†x!& ]j4GFocwJ{TIڇ!m009CLR0|yZޗD1=އ%81:UT`RӹF`?.W_!<7%?z?~wlaË{ksǝāx)B*5ᬌ@CD4eC02F @ u~%|kJfy$mAe@\&.^R~%?zYG8zM^8t!] wŶm>~àpGQb_F\FzHN#e&@b~H;i#0q? Uό@ux=L6GoJmH.$`I r yYܜPhpܿ>ί$W73N*f&=@ x4pW_W3F|H|qFf0{'6MtW'\!hZْJBCFN`̱mLCy]4 vhXŪN]5#*]؟;b4'~Ro\;":8n(pFXV$W{ i(>gh ճ4@ ~gyF퀺:f9vͅ|%ٳy=l͗^{?oO+]|r+WhG6v~a&bhzo_Nh tϤK9hhsꎔYMURV+mnpQ\"ЕyjǏ=#0s"?%Xe/okԅw肖A%޼X;x'Ěŏ]ɟQ:;:)K.?=bySNּĞ͚l {ߗxn?'NUy^xXѺ7p|k`v\13u l%3] wsìqYU /=33@WNBp#0X;ſs%ɽO2DRvl㘌C~6#"FzJplϨ|<#:f;/&]vdͯ늿@6KL4lfI(rh"-|c%d?VDs#YC4KBRl]9/=/It|5L#].+WtZJW*UN>&%3n88'⍃~$7^>p)oӻ9b8Ɨ^Ū^\#6]{J=۾\^_ɘo|'Q}ijR;c}L^s_YYrHkn1l\#XQuTp@>AR4#0 l;7׿z1J4ͫKqV Gz}ag%AVhH7' ^7]eP"\ANRWdlNFc?hY me!g}iPFCy6(RDỈͅQw7Ro}kR9&ͅuZB/Ki I [$l=ߣIl~*&4FO͞\:堔8x#Mp년חf l2ܛ?{/(I21СCُakfŪ@_#5$r4ϕ'`caxT@4Iڰ\l(+;}p۷o۶=`IJL8hTv*Óf$)- a9u~uC6kV͆h^J@~^ܵOj6͏l.g,,ƺfь4AFÒ _zR )^ۯu[_RO \'V mW6zjʖhV?KymP:qI6KwMwF̮T 5O:yfqvD&?uzͅFE>3+II4=G^GD77lnv1s}ȉ@b28u_k`?gN^حm91C cIf϶yZKe}ﲃ\#0Ph[ْʫY>COg[,E m Yi6`p޳seoZI޸hA.ϕ% ~.4f1Udsl6$OaugZ{TFX-j!=HhH7b2l^IC6-aِb˲[w9r~V9@`D|%q%q}7'3hw;-)rU)[g3̓)H]r&e4jj4kq_S xm,ӑkZu-uc0kc~M{mF@#@pQ4k D:tƿ=o |El&R%o;٬jz2O"f; PFc gl$4Rd4ƐͷKhEKg}q3] @}.r}E u~H6L|kd@#d4gi^Hgl "!%lįBShd30(s&@ೆ|.6 3 df_d*9~RXCE,E832VNU8\qfwXk_Kȃ<)~?g3L6"Ύ\:'vz2f3k6/睁5>,fL6Fe4gp\Hoz\.ӓf:, 59F3@.s?nVʼn1gj‘YЮB*GRH[{`$_*8 .CU8T# 6(?t 3yC$&޼CH:"ωoyD?H:*Ӊ3vn'ec&lfՑ|kW\׈%-٬F'̱#8.{`(i$wx2vDa\6#??_{^8}c pR<ΥS>~Px:!..}$.3?EɟM~M^K~:w鴈XpiMHgϱtV~ʼn]Fy12ҕ U"]?ޛSiٿ^vIMmk`ҧr+ӵtMMONY駟cQڥK-άÒk}'?;:8n2֓9GUAk=j|:϶wQAف 33H;OMA!Z"NL@˗պ߿;U[bF`HgKd3l?td_׭x/JӺ-_tў!mko5^|C܈Ưn~TcڳwcVr@خP'OfE,n j}0`) n$#X߈}o%ce{6ZI.{Xg³yr{|y0,;f~^w߯l.r@lnbnF bx@d#Ѕm;h>-3?}Bce4*˽Gzp?4vVt?oz5򛅢s2ӄ=kJ;, vss X K_-J4;l.4wџ32Qi( d-@.kfس:X $4M\4#07[T/G·Qt\]Zkkk͹F@!Ѕľ^SL6`L6lT|,P ʵk+.^Ͻ|@{a$zqFf#{'Pmr3>#q;N`#yfGl}Z$&em,h&hh46Ih<nl-YKWV%WV?ɲ !n,#_ԞK񿚜4ZjlvQ! `<߻tf (4!HIңg`Jҳeb ̞͆d H]'9#@@_6M;H0$VWŶmfZofK4OG8C3ax8Do:&uͶ݋b^fN?oC>ڳ9k(K~IUa tPӁ{` D6AvNU?9(w:bY`fd&ߗxJgɳpko%_y%QX]m_߇{4@ X>˹j}{M4lFΆԅ.I&]Hzә"(dr,9f&,FO&}0IЛ[jdg @1y ggF5:X5%%-~ݏ/Xqe4 }"АwIb1Al9F6[NJ&OޗF6:IR_'&lxldsg/qw<'_,{}~D6%yH97=F3i: N@1d3ͧJy.ȟ/\:Igw.MMZp_G.ՋO#{= h>oS:J0$NQy5x@(@Bo즔fy.o,w|6^Wl݋EcOHu7lKeٶMM j2a;oXɋ,,ݱ~պ)5yJ8i= <_jLu0SK;}L6=pdyė_w>.4S_?9QΓd4bl!8n羌nP^߇ &lffc7V_ g_7λk6>|X`fL6FqPt%_LX)6{(HҀ@[F~Dr}Bv yIdyI#2]b dt>$D6gj v?'l '6y,f M k6˟5ҋi_z7۹u3FējOzO gE4=Kȱ⶯=)6O~sS6)IҮMsLXw`&#d3L63DlGӿV3l-65^T=yw:;}61}Cl~!|F8?wIFUyp `ɭ)aBOc诪zRvȐKᆖ75\Z֡osi(*٣Ke?idķֻ{ N?JFCW5A9E?C6}crfs,RګpаsQ#?y[bd  :6Ul\+d$Ԟeqpߌ_2?%鬢8N0ٽ9 3{}?բ}0@pCͰh!Cf ( dh?〿d$!rx63,_Z+Ө6#p0e  R/b._(4钸r5Hh"ҕtU~ӵOq&'ۊMyx2 /So<}$?L.[(M^Fk'AܷԼC _@/'l~[|6:hO,h/;XHhx2!oflNV{cEl[o[ey:EF'gbؐ%Y,·f,e#x{)#&K{=}t @{"*?o(k׮灌86ЏH2kٌ= Vwn" \6܀+D{jZ vqTt~$nm[3y l~ˮ.|hqo9gf94Вa;k6Ñ~àpGQb#V%``#kX_Us }3H;&F` ,14T &0< gdsgPX 1 #橫^BA>ۃ:ʝ> qjZ%;& s?I6UGUD6ܺ-TZt rnˋ%NYI8S!tO1[Sd3_GKd^ltq4e%af8>~@;n[uzAFܑgsi"oqEHO }3s~7DF`?L63d3Z\?(KucfOO W?Ix` ʥ\ ^7Ȍ9 GlGsL{.EFP|dxREZh@[$N F63س=׳6 5~Oz.  ;h4Lc{]s }3at2`!@mlff&ZiXBjk);RhllQ^jd(-_mn :Mf }0T͎hK6k]f%bf MOK #~͜"QDؖ37?uIf 3ѸYude4&e@$f&W7Ƃ vS2 2Raf&l uZރn -{ 'O~,:18N9AJ6ko檨?Wdza#$(wj)lͩY|vƣY7۷Kgw4$ .ʿs@d3)q8 Ϡ;} NÜd3]]Zkkktejd3L63k[ICkyއ06PU'⫛~{ n }ߋo3Wd$Aä f4ٌj.4ͅ^36k}X*TR:Gs94Hhjg&lnl¹@ f-ps͖h &3oP۟4g['8i|Nܵ'~MƹQXqRo\OGN;}(EIk?tǢH#IgG'E<}"霗NtZtiM7¥3TdyQ+g.] ^WqtI\ҵLWtEUN>>o_!A^Zߩ3߼kbϫ}֡TbʱO_8.XBk'^Gkr=u5Sw]:-b>:keo{9+cAڋXѺ|U\$&8L5Y޺hkZl^-&]&Wlf6ǎ#~w3kk&ҙfٮdf;eds|#8okECrl^*,bI'&ۼ\ּ @mfO6!,9?1\&a/d~hey^!%we'S;~,^kN1yٚ1L{%L/)_&L~o_QL\\:'G7M6͓=>`s^ds-řg.7PғKbuuIl߾]lfDt3 2P&PV k;\TY/'7 ziD6uqfYu[~O4J-=RVZVk$mC܄x; N ?mس9"d{6۲Я?2;GuӒ`d>^$&K6[KFni`=#Glۡz lNAqr3HuѥM$ݚW3&> _YD(ͬ}g~*^(Rv/.L..Vmw?fI^w x\s3:AA{̆X'lVqOl0 fXHSyq~3i8 7={bTCje4ɣ~b)oDup^- sPA43@:3<|;T̕˗) ?tt84!@ @'i6g r~TzoMHgvzͰyvA`D#oy`ҽuAܲ t::}>ԥhiօ3N|zz9Fd3lNᶦɐ"Gzp?OGb2t?oz&RS  aqԨ{B ?`'fu$0%@`l$kq԰[G/<6(n~ӓe% Vq#um)L6O2 fkkkf.6(ґխ͖pY !%A%4l$xIB3 ^ qj55 e'LK`慪]}I-[ױq._w1Kbno ^ۇmїC^ӗd^Qe7EPv62Q26 )l^'06{6Ƹ{x.22 >;@}o$3l2uId/%w32 (ӕkKW]$~Ю{5W_8tXk Z9lV:tVfOQ7I-uefC,+όēV铠Owߔe}Sf׶^'oPѶ2Ұ[7|K.{UUgot%<%%ްQBCyM&v>snI|D5'ř":堉 j=}^/f#pͻnquݾCz5 l*g2IQ;pjvƒ8oGx"tY_’x/,db7V_ &(5]l)Q%w3l>|3̘lF]FdwEyBdj@Zu'7q~Drl 2ݰ$sFABW10щwu$&鰡4l1Yʠ,2F3рq %gFf&lUŗKwng.TD3L6c2Yfh#/_&~⶯I> \^'`l '|K>_O,tZX|3Q.1yg3h`'j,ҥ{Zt`#k YmwD^dž%T$wHC6"$㒌^'=N%70$lYw},Ό-,e4|Mi|wI2YBHi&ӓͯKeM?rg3x8K6WvTlwW遬g t.fg Nft@6}}l~͞f& 情3gd8 X~Vܾpxtv\) Ѭ»9N6/<_x<:p٤Wl>e?$L6ݝHX+=/7s,Y}iBej韧J$ 'Ӭ3R<<؍!F@6rFYr80 =wh<e_SPv&qA%$Cai8LzrQO٬49|lIy3G A7af.tE)%͓̚ngtsM.ֲZZrf2![d3z\2gXwXc2") hB\Lpʿr̲UqՖ 'c┥(;.bLLQ96ِI͖l|wşew>'~c8q"cW^{I<= s* ea͚hnF7'&el6d@`h\iHhr{J9FFd&É۟2 d4\j ͅ hd4 _eR1f&vUpܿgɃ#jř;Gz3Hݡd3 f a D>h|/mdU?h/둹⡷\Uv 2ObjL0(V&1N=Zjd#q^O@BWA2N%Y l8ȦH!k\R뷨&` irkf| IbOݗ1͖hFʞNjLvN|-}_'fr֞p_;gV7Rp'&iľ '-|Eq_=/wD~}?=D6ws'd&MTm4n^͇hH猌HiXf  4hHflNYʊ ^ g)ĎcBRQ[3#]4F9ks7[ven9I.?L63٬=CӑtB??+dN,K/f¥ *O~O/٠18~#8'#浟o+)/J%L6O8deI?Cl2qˀRD6?.nO6Nf&%%-' ?D3>l4h>8DžFgsl>rHi~x4c8]ֽ~҃aqd/AN.nV:E&?W\{p@(niOh=ny4R@<477:ox>m gt]'KL"!`j II[ϨO _Jϧ[Fb %E=VB#lm_Jφp.0 [zwm&n% \clƳyHh(2@ dsU])Y7fuJwD0>c6 /ʄQ>z] uYmwz7ӷp| t-Ӕ2#@mlffmQgsdgtƾ,v/Icޜ)ޓkU-{ITW`#П=ѳYalVs/2Y1yYOFCy6x65-=F,nչav}ِpm=ٖyլ━cMR.$cl%sie4Kg3FO~_?!n^(I21СCݒ`MЧc5":5(@`FGn~>B0jozN_8Xq`+M>i6י Qe)z6nsf])@G6; +oo[BXaェȃD>fHYvX `3<wR I䍁*Vhq,|Ćq bhu|F`?L63d3q+albNNa"n&q{lgAz{w@ xFGJD%c]L`Npҿ f:ckOK/gC4O̒ gs$ &ږt3t2KW4gˏ$;)nړbD2ɤC"̗`ۚ`i0dU9!]LUzvE6W@KΖlV2v'+ +^&c,俋RVh=J2ԛd35\>#jd3L63\״mCTdH~`Dx^2u< tl,e_iK.߸Vh6"/6?V N{ڛr1Yw' 55|xʞgf#Ѯƹ#q?>“яwO~K:r^ϯ 0Y@* <Ϋ9hAf[-LiXBʣ0u~\ \?'3Hǟs2 П=5@ni {['vn2x h7^t Xdc&%]=YH>UlNkR*@ k6ǂ z2N=GӿVL6Woi69@flD "wf4k@e}8 us?RgfjӔl~!|Fsp~l?Rx>Acp.7'΂#4I"^F#Ǫ;dsx gOlQx T&?~:I!p[70 Kbmm\>#0P۟T7&I+ʳڵk%!@:n["6nWx2[91d37B>|ҫylio/@G(Zo;(7q7."yy]68snŖ}#٬xM7gqk|7q&ΛĞ{&}5.9bb@_ޖ̇#Ogsf1C*}pm?ɉzB$4x9HҠcfM4lfy(n| @F1è%lf™.sI%;& s?T{ ?{dTIZYE㶊p );ū& Dy_c8 uE o{\{?,[ߏ1naa{hx8l eٛw=0"]i<# ,Owl>'I }.I83,O]+RO}/b@_w&u=ٳ~L,dsq\p1 @ϦJcC,L6_#xf6 @z3HbUf!K:5'Ay5 BE͔j91_/ i4t j3q\w͘hnB6["s5\u\{S5_/1s4{?{$Poo[vy>KԛwiJYy4Gfټ6upy6lzax=lu2@_wpk;{6_سYe&k5yd3sqT$vpfdX]]۷o۶=c-< dlBu7.mp+A}(wy4/5gy Dh'2BF) rۤ+Y{?=! Iog<(0AF³5)q+)lF^O W#A.F`u}gfG03٬,2L6_:#.tK)Ѹ/^>'Gf9uT8_7}16Iztk6^͘l^,|9Qf^\ܭeIN+OET{ёg|^sx?B㼞Ug6{u@]6W_t8!@m&ǐ!\|/] TFCj;?id4 Yh|I~ߒly6GmWR6cak6@8o5=ټP!oϲf'a4XFc֬!-3d3́Yff&Kq8[ ԛAVR%qjʫyeelBpzg7Ÿ|W6 6Ϛv䯼0d$^֒؈4ddWm "OfZpqCL?O:&a> $΍;M p╄RY&[$NOZJyB ߖ䲉V?FF͡h6/KS}{ 0IFZﴬPr̚3f;,#04!YR c2>NIaeeCA-5YL,3\kf98g=^jk@GMn b693K7Ԡ_ֳ 4zd3&Gr!_ᑺX #Z’.!IhNZW~?ȧHpC0#RّP$ 1},\~?ύa>30޿OJb&vgx\l"з}y{_2oY&-"-/o},ɀ߈lN|-L:'^蚸 j7Xe4Yfflf`b7V_ M+t=-켛fÇ&`dh4l@W) u, ^T.Zϣ,wqYR٦_8!\48"@m&lMl>ۊ«=lvϿ][@?w87i}|܇*r$m\21q=ټG#[=;pMM:[A6\`=l\rҕ ]veBqYff&lD,S/SeF!pb(Ŏ5fߴdsu;VΖlV^0R?UBDrI/[gϛXqҳ9In(fTFXRynq țnpT,9 ?L6%aT?a#Lu{K1rqPk&]4Y{q]hO}y=o~XKi@-7$8# A``;7?*e2CCĶ <]#"SM}ZkH/If'7%_FXR&KId}[A|e\iw8\YH3۟dH\.%q*JrMfk:2ٜnN*}F {[F8+#P/K}!ͯ+2zj~B74d$gm̎ ~>aH=ozڐ2Yf@d>yq~+%/Ir9x[Tx]^}ny֐z:T|.^=!ĽgnwqvJ+8ugpff5l֤3:R:l&Cw&<Gcd3wG5y{1 `#luZy) RI0:@0 tP'%Cۂsi<1dT8i7.Ǔ&(8iXJAQ'$n^Q "4f0tPx=jl/JO'H2ٜnrm1S{rщAWXT QI9Fe}ķכh6³yYۏ7bSx:;/u[^,nU%mUXV#tJkfK0JݧR%[yMJ}haP۟d??(DÒ`![$K wWUz0:l~gxr 5l@tDwG$Q몭 @j Ыۗt9'#0-Yߟ^f@6_w'K٬MٌFnytv#fsvGZbn/6)5*'G6cϧ[gf&۟%ґ-hw4)@*z&NVR*@io?tRl~V/l=%8TlHh &h$x6:^C6ھ~$p\=F pd3L>3c`1bnKsX `3<Қ *5# <5 GZC8㟪ݶ}yA_O,,>(9.L8WYx>'$٬ h4.(m1@6KgQېlA#x@Apjb09 T/(Qe C>4_ Ki³|) ]g3DV Lߝ4/2 +aRfm٬^*[ɬi&l$'a/I<ؔele`f`HE&ej1z-YK8[YIhHɟgsx~:5OdHڇQs|#@mR?Jx OTӣJgs`f^5?VO0AR#lHe!"t2o^O+fhhÑ$BL6g2S.+Yա:\Aϙ#W;e}ds9#z88 8Տa[CZ?)02-J0q['N(yh tO,_%_j}Of>WP0J/.O*>ZfL47&A.P D_Px;f ^7=d\iH.;.^FçMW($_:5s٢;Y6@6L^\Jf#q 1Tp=\7K;ҙf8dr'fl o>2g~0j1̵C:&pgLC6I2lFtf.mR]mkdɲfBy}f }mt\2Z gm ?5JF3iJ6pm)]E0e4~m~D (5q[uj=B(@{p0CDw}rɦ*N1l*^&'/@ 0ɘ $lrdͼgŋNl.\8'N${db҃ᶧD* =b_-[ӵжbA&V$Vxj1F<Pjs=Zf&2?P&у(D^ʫ3L6Z*3|n87:I2biFb2<|Zq ݡ{Af 7$LAWP7 FzSatU(YŒNL8Si.?L6{=1fc} ^ߙlfYLHՉ׮ڧWK駟" xY<=^ B$3g>O,N@|cу1dz6I*w~ '{63<,rp~uutX]]۷o۶=c-<[,boHVDfGgu4KZ8?L63|YqkC'$aV~}kϹ] 1 .MG~R1lR1trm_e4سyf߿sP}Uq[{%ػ"^sc-7G*]2\<k %aSekY|^#Z ev0r`xo,&I@onƫK/k|(M(?n2*[G9 @mlfɞO}5'9bb@_Og?O=[>ܸqQ 4S??yh ;fK ׉߲"n^Qh7u |ۓŏřKgG'E<}"I{4d̐{Wwq³=J+O@6kҸ %<1٬d53h==tX'ĴP$4Pij5(]-C$p{O"8Eռy6 dsH8 鳛juFQxQV%dwX^ ڿ {Q~o`cdy4:m9Y Hz wP%urkęgjd3L63<@6þ {yD1:<z6H9B\GAl{ :C&^'^Ӯlmm-G\Б-͖pY !%w/"O$;k?i C:2Hhv/0d$ujR g2&-]dvnwMuc?f&lf%sF!З7&I+ʳڵk%}C %MY+1l~wͭIog̗ߔ^`߈O~-=/|(7|[غFX=oO]H$W flyf$!"t-ɼ˒Fz3.ٜF6l=u_p4ȇmOe4"/3Z ހ؍՗e¹;0?5 dnƚ͇pͣ(ۘ(.1Ʌ|Gjc7L(chI Kb|$NUu׺A>EhD8L#@mlff&Q?E3e?w"L@6ȑ#4bd3gB#^$ f Hml~7WUC0?y낸I6 wIi#ַz%׷^'y,[ߏR~>}DR2=OxD31f 5qHkL{6!\^-c%0L6R hhh>, e`r ]-nD,B?]N[͕e@zSwlnc ْʫ\'$uJc(9 $WQx<@~Q:k=j,eIe+M2f&lf s-83#P@_wٌ&d%f%9N6z ~-{7U[_VDN?WX.flONu@@3p0_hr![Rq;3N$4`o8y=h1+ 7|K~Ids `f&l1Pc tv,q:mq^'ͲW˥cؾPߨQ5. 2k:Tq8#@mlff&ٶ$pp]huЈE'7x>l6ktDrh|H;&Ie4&_Yz9K'ߏ$n)K6f݌Z9&a5\Xx53 D3L4 ;!btpom3 hM &Á- G\ yĖrfPfJj.t88'#0(L63ds(vFNjHT!&9h}2Ij[m?!8uZg3|n87:IJy./\:Igw:uݦsr]>/tElҥ+D<]t*N`f3L8H]-]o@KΖlV2v'k8{4b2UϊE&736Az7iSkleaf&lkkyl\핬}7 " h@D0VjN g"d3WkڧWK駟" OxY<}!:& !{rۻj1Lm9q"7f@ AU lE^\_A*vIDAT5/`&`f&l0#5%N.NNCѼP.IqmL63d3L^j1̵&61@f&lfn{*$!\x,ۀO{b#ٝ p,_p3)"|#@_N-l3τ7.lO9*vT8#Xb4"0 8~pϋnq,vtS4{l۞no^HXf/k6[) ј{=5Z ӗgt sڇ{rb j t̖nOW2W39j}ӇT"Hkg>\;,e?uHApd3%EC0H6SwWU@p#0P&lCZ^Emr}YG_O,,>Ϩlp&\Bd4!)b]ʖ M<2O`3ws d$o~=qk$$g>Hx2ǧCO:`!@m%G3Mfj^嗚l~Zj2d3h Ύh$$g'3hDZ™e4- gG{8D?5&9F65s|#k1ټY2styc$,{y"Ql{zC/ 5΋^_U%u@@Cy,0]!@mRf }L9;kz~Qۉ;u|F`^?MN-3f/\`͏7'?'μ#N , ³4 d1E:Cz> XGFC7)_ )GcߕNse48@F9!=Lϋ~ bHz.?]&_M>.S_T^+++g3@63>irQ }by%uxVMlŏD,(HlIOu:S0I ϰe4ĵO WIȟx R8MR-b;)rF w|@}XuRj4ۗpY !# k=+ fHheoeM}Ӹ|F @mR L.k? z涧D*=b:Sb-Zʇ[֩"O= Yw˟u͈l~[b=qhҙf̚˓cj5]-]#>?5*{!5>, 3&GQZc0)cg(^+: oh?-9ӺP۟T5M3ݡ{Af 7D/ͳHj:S]߫[;j՞y53*vl)j1.o;- :Pcn~i;v -٬KDb) h%Ri\pFF'l>sq/N?&=(_C6o~}yg3QMIFSϯf>,{guo?1=DɰF{B{9im7?Yw,\X`ki}:&=< ?L63|Yq<I˒`Iz4W3{6Wط,l ' wF`]-t7! 6v;btpP4˙k}ւifD5%X62*z`:ZJHv;A?b x.u;'l;^xIWb/+_?7lrPz#{Nu/\RJj~@ך׳$e2Gg˺$a>bM-D1%QF+P] ٓJ@,Oqkx[s{'e>63{*@_G-TFjd3L6^ypF`<]-]އ|%GnackbbkE`y]^=f#C{Wwq³=J+O@6kҸ %<1٬d53h==tX'ĴP$4Pijye `_f{92>ِ.ނ.^3R v^joٛ|2ھF$wWE/c/2Bo{^!"Dy[B>=Dsw*l?L63d ` {yD1:<z6H9B\GAl{ :C&E7_kt{ O,8:LfĶ#U~p2[+Pݒ6h?eA}O7/^#BǶI _ _АUqQ`n޽󄺧X]Omlf!;I\ #.;n {UP3D@^ oXDFa\>#P۟]K2ﲤck6@:[Oi6MdeHf<oOŅj_f~*\Hc8"=lgu]`/{o[*Teը'Af&lftq@tj[ZUZlnm &\j4ɛaI;F(#@m!#dX Gh&͡T2ZZXF,1rz~Q4=Id,JN`99&Ux:o`ozN(@zU)C8{@Ēȱ+A;QBolMW,yo Im_K?\0d3L6SC|F`jZ nh5)cP gPjiF[3l> ouVbh$ *&= DHW\zZ[?֓T@^Q]߈7/༐ge[A^ǚ4 zgIJ}u @ڢ 精$IIM@ 7+uǼ`(KqP϶˧?L63d3[..hÖTE08s5 Lw]e0J/.<[r ͤDF=mT}a?\c\ Ps&f%]O!ۗNCY9LKxb|qIvN(ӽ/ W3LDmlff&!\>#05]-S7a!psr1(u߸|F`?L63!wB}>^yL}ƬAmlff&gnrf4Pjr?Rgfjd3͔dn˦_Զwjp^ցHM!0d3L61.[%0#@=o_b·Q8f*֨33a”_F)N7.uL63<d3?LRj1d>"@=aԮ@63L}YE0d3%]ʵSgjd3L6lyX ]-4#G?u< E0 X҉ g;"f&NSz~Qۤ,;u|F`N?L63df~bH3}DzSatI.۷mRݱ̖hpƑuZ~Ac5G69ً/N[9= o0}umʨDԇXf)r:P&l$s^63כ_ߛaL63<a:xl|)v4@ŰAFO݁K䚹I5^͘l^,|Ybhk6.3%%/?/Y5Z]uF?,~nj秶?L63wB}ޮzSe~N;v -٬K<YP^8>!JN`99/u/#ubOeD h*;,;U%e1\+A;Q?w3V @mrهȪ0xhY/Qp>_Ԩf\ @mlf0eRWj҈W`a֓IMaHiso;SdqL}a|1uEzt]@͛?5@(if-kf&6u腪z)ы~;Ջ7UIpuV{kY}a{-].4ܪP\hP;|bNMm؇6ɪp[K=is E?B #; `il 9^W7 {=UKnĠ~NՉ?y vV&;%!e3!N5RWfS?L{e`{ <Ђ"sm۹5H5-o- s_Hry&u0qozG:F;}fh:~=3ӌ2ͼd6X`0p?9_\zv 0lU>ВU⯿. o募YDܗJ5s]`?|x!U/y]_|~ک*@4ߩ@.f1:zO6a(u@To2^e!`o<˾sok :Yke,w\i!t<(  i_0p/(>H7kԐ/s#@mr؇6_5=^#yP/jo`o+a.3Dj(/V$td߭؁䖶3& S?Uk=x9)_JAu|2:OODW^׮_zY\pVy#0P۟''|=v# O\CbG-(<|x)pڋ'K:B@ձRꋽ0 l'O/بbO*|:!;l^$ٻ!lRz.K2ٜźSM_@dmZ%fUUU騡ã~8SϛaL@x_y@ڇn*h]$;oÈ>R/j4io3$ñwGE Q6z1u)/={`?~F=OmR3g>O,N@|cу1dz6I*w~ '{63Ք$wbkHM̵YS#Q\i3XP0.o^ Mߤ{5mzF`?C/{C/DOʮ&IU y_EotyOEOF_<qXޗ,c@=TQ_ĩ%)SpO*w*xk_{WWī~n,ټFHe㝼_FBZ*CImTZzWlY݃d4G:($(;u~1<HMkʹY6PrcID*AI>j# W:оZ%u O sE?.eON07kR/j(si@n>ճyN&^prr*_g łs\<uPOC{Wwq³=J+O@6kҸ %<1٬d53h==tX'ĴP$4Pijye `O_L6+!G8pKmU{V?D uky~pP۟aѳ9ү眳-2'l o(B*$+ d"w(^Ǟ's@T[i8GHc(m/Pa6Yg(H+u~%͇{,## Xl?W*s3+Ѿn#0ja=F/5\>#@I!yе$.K:Y <ƻxfs }mӤ#IgOe4"/fN_Id?_\2#0<.{6箧.V}((_]Zkkk}j>xn\ @=AK0!@m!#dX Gh&͡T2ZZXF,1r$u~%`"ά\2#0,=px0<޻X\h 美nW?CqEs+,.s{Od-(Hd {)[eczf SW2I+tKfx7?ľ7dy?w6BB/tp8fh'heħ ɿ@^d,-uϖ?A"TSt૧@ uܴ &"#sl-fR"AqK_d 畔{7E.y;Ih>|pk`f5( R+[)~~-%}vmC֛SΊ 6SרmrP` hyFBb:O"};sf&NS/u~%` #axeKw և7m!P XQF9&I@onƫK/S? .rƵ^౫i=x zty.=Yֱ:e{v/B;nESaBR\H]*7<מ*Ro#A$@q@W&պo-83#+L6S}/;u~"dOl2buZi]"y%I8fۇDc3# Kh˟P\gpy ?ta2FCuWxR#3tP&l;!LپUlrxjǏw8tKff;߈_MhnSB ̹YAfnr@ uj.2r/l gR-9y^қYsP5zɊD~yPVN.է<Xx583^<:L6S}/;u~&IoJLt޻qtւKḟP'oxDIfπ'f>Z}Y&۾Q^b/݌5&`dh4J+ٌPC2&ß hH< )>o6$? b45IH0Ĺ?^  JnHÌ<Ǘ1=@0ds aίd3 `= ug?W$Ϳ?|+fY6RNHf!*xY,بG5gw`zK&.V}#`%-٬a%4#6:"о.ŞÞ1.#(/V$;)54HjOfY7xR} kUݞ?YC/\ @=!kc>cF$eY^WUM}~So)0+EFm!f&)ܾ:"Ce 3W{rb fYJ]Yyicj{8O uJrqu y.7*yWu{Q4kfE oalF -cO=آK2@WSӛC|M, T̒GgBTXq@]RWdm/}]N1PwR7O:=ٕϳe  SqL ?brao5MŊK_ӷK`P:q;P/j='ŅA{-\BU 6o+MkTN5OSIHm)T̨G&)<@^Rٜ\;#Xr,8x"~3`~wkqMFPWy2Xzm7s& X%%K\)#0P۟7#Y5Cm.D=AWORP-KW̍eSE\/էcNRqpux}fd)/fGyN\~'}AkKS&!Ǚ/&'c9A#@:* G `3<0=t y 4t%gFCbqVr)H]REt.{} ^Us?,gE Ԡol1:g [@n*P*.mےȳIm'MUx6'gFIQJ.?jCkif ![D u~1"\#Gr-%k gK6+ (MK^ 7ݰ0a؈G5Yk!X*̹W]EȪm1Etyt}ox^W2"N a9DblPjS`B}=`F=&tO dVI&9G/&y03@` o_Nh:1\ sB鰁w>W3RNpޱ.V}1+&.F`(P۟aUvNDz~Ml=܄A[Of,p@ru^&FJIwpPUngڳ&ќ3 1>';ٔ/ojCod%/&f7g/&l`pwp<@0 aBR"{~n#0On0=Y5qmLCz~y}+#@mr{b8F6Tec9c/&y03@p!@bbU80FSۇNo'W3uwyR#3tP:1x@(nZU LpT8_fB#@8pܽNH]:iLJr/F%B|P/Fg?9l3j ޜ:lݜ_r,6.Urʟk~q403P۟\am8P/j$xR#3tPZ༛o.m{Hpͣ( PD u~1̃qhG@bEސd_Gny8'}=)s'}X pdj#9}RmNE _j|Fj>FӬ31+,f3#s1qh{- XPI9W{Ѩ%$ (րG^S&Vud2ye юW=UYMJؽ8ǹv-Eus'}f#gVW(ƽQ-qغ[cԸ鼜s *\v5\ՂqY,,,*eK$@tF`IB @lMd̈XVΕ֚ bDFeF/g|s/&}f>F`\݈!Xu[tkѨ&{+=y <9>c7-"cu*Ni=uUm1uxWC}!)لH]ХGH<^.n~]Y50<~:}r?BF` \ m/UWhc|5: I] bZ8#F>dOl2buZi]"%I^ۇLEl,bh˟Qf˲! IRu>1=Yژw.z|Q/5\>#@@!;lÓs1#@[ѝpKṋi#(v|Gd&bs y{/&^C֖eIR}HZy^؈5b]9Fy1;:2f\r|hP?C^H_}7,@@q6FP?m4/&'.O,2".*2NL8Ou*ake|N6:ٌPCcIc:P^//ZG`%Oj#mQ7IXWٜ]iٰ/R//_Az|Qw/5\>#@@B w|1\ Vጘ[n7?̖hpȭ;.V]~|{>x4j#Vy醢oh_ybd^.{'{MEΥ6V}r9uZvQ?.p)7v WLI&8>*t^kj@ж!Xn{S/j4y"cQf[ͱ[RrPki5]Om F~~Y@by.d#bh5ecd]\!jY;@bn10G&f"' !g }bOqK}ILi/7Vr;À~IԫH8,+RYW/ mdb.o4u@C7?ԉE w|1<w|Rhc1UpY !% /x7ra`08ƻrŪUn`6ߘjӒDN@,/^b۝T0OWKL_r3ܷjJ#*nEs0*H0lj?fbsFXHEC߿7;7hps_C=Gu{"N]$sxP*zic~g­rcsʹ#@yWaǏ | 3&2OWa ?cƶ{qfMrvZW]+s0@P?gz- 8$YK[akc=$͟aApNA=S/I}A x)#}1qvcF4@SIl^)ssFUI K)odG.oB9-9hH-!%m|$&G/&s?m-%k gK6+f x^+*W6k- Xд*_YL#עȦ QH t9"JuPxzr Iyn'ڠHo)Kɿ6Ij_aH.& lbc^OUm;i @sRٝ XW=99z@XO+󃼇YKC$3#vqAsscp @/ZY Mip\=bqoZ5s!!X 9is|n,0O!w<]T+oP*)>$-WIYD=np26@- 5_5cD~}!RRj0_٤_q/C;"c&3ƪ=ѶzXZs·#YM25ytPw|K= F|~~fH֛CptÑUt 8IhUk8GXߙl˅s D3Hk}Ƙ ='Z671hc#=30{]0ſ6VE- j4v#D~Bm+DGTíAbv*{?h@Y&z$1 n ƌ?@^X-3=a@~^s^Fj4Ʋp+ہ.1Qr@+/ܭke%]ΐ;lY1 b@ A w**is|q4>N 6>By#|9><~:6l gR-98aOv}ytd rc5XP{; C{܎*+pK_L6ucD!"X7|m/F=3#O[8+!@=K0!@=λy֭bgP I g 1ټh a yLi'˟u.eHW~9zqN-APM#?H+w|1<1wtR] 'UwS.VMt9/Fi&aB%w{P/Fgښ %-٬A+ٌ9c*%%eDq%$Q!%c=cy}wg_L6O;m-+rfjk5 Ѩ Jz.A_$σ(ۍ#/"^fUbu׮;C??Ϲ1sOn:Z>z/-U٭(80`ez^ H;9v?lNcPIΝ;l䫄>NɁ]6WQ+|DM"q}a`ѭ:_F$֟ɵZu׮ތAOHnX"@=AK0!@==? D3HkrʁoƮAW2*V>!\lVp0 ?'dD_&I@p0>@b GҍщFFzi؁o_ +Htdd" Tb4L1͹8'µaX}X:KDfe};oK4A_CbJ懑;P/jXyR#3tP?.V]qkѨ@f=3`GNEi-ѡ"]f\D*"#\#O ziOeE;LI#v~Y7Hnϓ#=cvQ?mmu215m_.?P?mu\dpz­u/&aCk( HL8gr>'?v|B4jCZ#}mZJ '+%8UOZ_{{>r{a@Ŝh%6A w߁ON=q ^C;?ޘ"  hkL}fI@zik~s}>Kn!#0,2".*2NL8tŪ2$Fe%A~t[8U( mm,Qx!{yU˄uAE=5?0YzP/j[l?SV.BZ&q7@b[ b8#f֭[ϪZofK4F87EĴOnŪH_fw!5.M ~~0wlˋE.Qק+5(I]D" ptMuWF'[(d^crE Ẍ$)&݄zxݞ*o+>T_~ƻj]'hrA8s{)ֺ6 C w|1\#MhCwË5?. 3&2 5ЖqiQR e2p9e4g@bUiWW{bkdG )bqM4+2P4tSY(DT#z|Qvρw31ʀo+pc/V/:{a:`(@R \?r3WV AP}QwpQ"#uWN :SF\>C;?@b9 N.m-%koz-٬F+ >x*[㩴,=< #fM_F wvrkk|嶏1@v~*F  ,ꈖ Q&OÜu_ho϶*d: &CV"" //Zg%OjCǼ?x] yeq.GGU ʎs;WhlyG[S? K ds_A bhZYg]=3*ɔ'9gizU@b5vm#c8O[C*K~$DrG`%ɫpa")z|Qw ~6rr?dG5wnumwD[vD=ul̜Ph=(e)I엓s{xĞhvLcT㌪|~~M=(EZKuYnbͳu3C@~1 5BcjRp@ mnyuB w!B F`lڜ@Vagahxc W/Q aEݫ6/mYcx[ٸoFz2 c-v!j(% /8n v0B11B5_I֧g}. 3L4x5 m/3a  ݍ2^c8k|a2;,&kar|0c@@NǥUW㫫gT#@==?JV=E[|Gg^Irzxz|Q/5\>#@0SA*hzcA=`#@C;?pUd3}5ぅsʤVGd(]n3#PŰFC8+#A w*xm/K4 HL8w vu˘s&E$_j|Fam0pC\p)ٸY#d`a'#@0 1y6dz < WRA$ hǹX2.Ց,9w|1<#bJ9.V]Ň~|͈uVy l ga]U*@gFpQ/ػ i*o~Plx~㭀5.oqF=r&ƌ/5\>#@0q`l{ /p`ZmfR\=45 :Mb Q+9w|1>Ŋ}O7\pYϳ幥RY&L8 5hŎ+@y { B3Bß8V^Xl,^Ax ۆ"TksM`UYz*֭8F u#AWQ/tClz:qu!+C7?t=n#E?_j|Fs%wds%6CČ t Ū 1g%AVhHfO"02oyb2'q~y:4"eͻJH$El+b?˟Qf˲!j۟tĸ#-~&hIyk9%Б͑vꭍ M=1?+߮.E$_j|F5.C w|1ٜ'bFC{kepKṋi#(v|9f|q g 1ټף@N!\x:X7XWSdnA~$v˃u ] <$@&.:RGw Az eb=~%8Rw*?{?Jl.v~Hog/j/5\>#@@#;lǔs2#@+$^6s3]2zVƗ%%W3W̳yXLˏXN!& agy 3˸r Q6}ú /L#iWfX|GU ʎsV!ݑΓ{u'ow. o /5\>#@@B w|1\ Vԏ4e7s,Y}܊^%Wyg G w"oHЏt{Q4k 4{A~V^(q;^ed.{'{ME%jߐ·#Y Qou^"uW/V}hM^T1z]wrS?Cop"6dgxuubr _Hus|yKI7ᇺm,s3~~stdsw!h6Cq#aW4*&U%ca X -fMz,赞6X`-Lp:E`tְ rp#*3F5q='q嫬$Ԙe5z{du8_Z_dbpcxb+GQ?mox9̺H;2S/jb׏1 yg5' 殜1n#@bdggg=f m2L8k/Lտ+F4I oWD t[k4@b5@ҍ/fs#07_ky&탇 Ϛ: jH<I؇[T_ŝF $bM ]lhk1-YK8[YIhH3# HYd -Q[Co}#X]m/nqD @=5?4˧^zx56$bj0jz|Q16bÒ BηuZ[]vEcU0F19ACɬ!L nG'Q9NFOZY M[ip\U0tvZI8fcuj,gŪqLk:qFzis~htMmRZ>ko1FP_Ԁ5~=) 4pڗpx\{cQT@+Q"yS_c]>C??Gs3^L$͌!O8Fӻ\/0]>=r# an D3Hk}lP yc$^[ m"fS_@bUYPK_-uea7{4W+u|̺\Q0 ""NP/jFyjlBHhmg32 tLP}pIKƍY='O1#A >- "][ y̹9LF_X m+7y.V]EWW FzpEz|Q#a($A=. 90wK/-khG3Ʉt_DFbyU{"Xɼ5:Y[E w|1izCs @bU$_WkTڜFp;E_JguNMG z6[d5Tl_-AnRj{^{)nCܑ&1ܹر#k?ԗhrkc1l\x#XuG%矶Q:Ez|Q#a.Czw֭[*@@0cyaa!P28 nE(>c-^HrtSq2{A w| D6x?_ 5Ժ81|  ;{@;\!Xuۭ/Fˁ5bP?#vF/5\>#@,lf, _m\x"R{Ku͆lFa^?nn=go?bo ϊK Ĺ+TOޥ/OtFV毝.}.kgE{YyqK_tKWt( KX$w|_.(ݼ"P._y:ݒytMD,ݼu][ ?ݐtS~;-n˿t[9ɏĿ1qqЦáu+irv~|QGV&Hgs[kiK9;*HPIVD"ETMFz|Qa.Czis~ݍZYg]ul (`(Ho7&3zpV_fOWL_\|6\85|O'.QNtGKg>H7^9]M&$^ ;4UW;I7i% #F+e,s<&DsNLFCgؚjWGE=]Gg3_#=<䎯Zd3Hgl߾Ey{D3{6 {6kgld3LAg|&R47o ڼٵAIȅ.UW{j,'kC{$8bFvG!|=Lf6 =xEa:`mV\W nWژ:pR_89~~>\#@=9?uM6C0@h 3>pBe4|)ɑx 7lyoǧ(:)~R9s3s5Ne] "Fm<-p9j晻չ+F&1Tng]ڋ6bhԺA: .m=F+ m MgLPآ~w֊.nRQzpC??PU)-wÁ9z]w]㋺܃rS^>saL^x6D&DB@mZD|1pxLjsɮv#wOCr팀C w|e͇3OQӞͿO,=^Xo,|8}Og.~$|D,2V)'tE(/@8H6Y-C".H2u:~]vViAGE~~Y\Z8'y/]]B J=?X/ݻ^l,lZ8iVX|řs{{x s/z@(-Z2aw-սQ5Tv~CJi=o@˜Xu.gnIzic~h)0: Cd>Rq0vy( #C+Adbp1Ӹ^]^hΊw;`xj2+l H2jrywqG6GS,Ѽet8)HcV]e_E8l>lǴpL f!!|`rp_'WKx6_&E惏/ѬfJnИlfI8P"býP'"oH¹H+H7{߼*(RM´ uqVnߐtD%[hUI4oAկࣳFgsl>q-v1t7X@0cyaa!e7o[z mC: c)Y-l.VtHFFzic~hRsx:/P=>Gct_Ў_b9_AɎ,z˞fo yZRԛ'~l FᤫVH,ȍR|K5| PѯTh CHO=s >rpfټ'NFw51lҢ2{CPFCy6!VO㧦[qْ֫gwާYԛί\|~Khzo׆du:n֒в&-0'zZ-AORdX{DfX{uG#2RVCy+4]%a3 f%!T.Fe,O5Ge2{{ܽ믈lfԾ=_]K}NE@/|mL*|u|"}%qępшǎkf&djٯgFpk*?dI8UuQ L@LV@THo<C'浈25iWdz|QI;~ӭ'Gon' ,w"dwp`owD2xv"Q鱾eD;H"u/;&1 JA9נVGcQʧZ8pWk8dsDYi6y(f-}qX}Pj6?\XYwrNj5M6y$AY{D#wl6D&?ǭ=d3JXپZ&^f|j>l6,uk&< V2Jy^,6Ed +|l.e3"XFョ4lkxټA^Gg@cJ;sӞ 7nbO'NŊ8$lnRbU4k 0k2>vZ-.V6WߍF@!@=5?4OVŽ%'Bg5vm_݌mi 7() Yb#+i{>SMxĨH5e܋Ρ~WuTe;'Pz1n".Wtvnʓ>ew;C6+f,ܻ˾!m }2@$ FyP]}=́wjq pX(W~`bwMm&8>A܍_ 2 sj4vj{Gg_4sWe4._.._.}zWx2|?˶R!Al 7@4FW w6^0{"_Q͟XufW{bFa`*u< =J:Cѿ=_9~56ˋ 8F&9 ꧸X ˀuY"1փjk "<}ySIt$2.1r9pKWq g R~{",lq}5`4"ᚥژ䌀 {1@9^ ݷ㶥ldL_C$eWIM#aeqC|g[~`~svFC:X/9! Uy~L"9cNrp"@n>ݐ{ ټe#$/5to  j7 H^<`^ (5>up~\g7<.fd^oJ̋7Hf<5omi#:z3ch^VXFcrkAC6o(ynG@l2Fy "Ƶplee6]Wl(o(@`ƽOr2#;{PқxOcWl3qމA w* tfW{bV'_[T܌@ژ(sW {P+Pp2Z! TPT{|iEx˝T:KKb٥kͶ䎯_'p{M4JFCz6KuF:C~fK8'(ӆlcV$ݚ,Nh6[;EA x&eZ:-&@%vYqt"!@%4\̪/&G6L^H@K8۲x(P (5ٌ^A.sQvlrl &x <|L pDwnN;L IqUh9 w6'B.V]IƦF*<.FP?m7P/jyR#3tP?0#NHP& @z  S|im9fk@:LuJ_ S:}X:gtFYFi_ٌ%$Hfj.4wfK:.K Hi(R3( 4/\m&ќH0&c ͅ 'sѰr(8J\.K;ݸ$\Z 7NMlRZCV ?-a.n I[o&-N@4t[;R^HdM^*r+-Ls3s΃I>~ښ&\r1_j|F$"= D0c _x2t˵_# t-qt4`qNtȕ;&lY{1-bYL6+摛ܸ@b^bl E0 _ĄsWnWZ 8m_`Fgڜ y 9z$O;fy0; DU7{Km cJh»LuJ_C6GYKi=m@lٳyfAnH Xu3挘[n7?`̖hprHh`0{τܨ.h{l:6c)yI%^D:p̲|%) "9ZQʋD۞㮎Y.Qǻ=sOj\2#@bf&-'oϬٜ7\F2\ȟXu Zcy7cǏ L8慅<"ѥCOq[< 0IGvz!ɋ!_+,N\6RzrF__~SQ'" CH~k#Bl/C;?qkkvP/jyR#3tP?mtqɌ@>AWfG ݯœ,|8}Og.~$TھTx^$?{7^3k6f3k6O%}攻dl6.V]L[&%W3W̳š$.'=Lu g$CCwlFP^TS鱾eDI[T` GH4{+ՇUipm^-棞Zxm1msO+\\2#P 85/KQA)l&l>+..90\p@d3͵fR?vnӔ̱f=cFLW.VljR&x/jf-t&KԈTޯqڏh[p̋Y CeJr٠aL!m@.Hp9.Z_Tu_}abWEcMn{au{qzv^n~~S n5aP/j8GB쭻S*nBd< xNjߖpM/Qp!Ra #C??0G w|ёGܳ;u_6[5"IhjuĢўۿsl>X4XBh#b2~y7l߭|Az9L #ͬ*M'zX}JkHcĻ+L6;fK.lfj6tzg36x&_#qMV~c$o^ό 欵]j:lllhn~hg嵶 p̋_x8dBڇ{8ᇆ-KA!N'.I*UVc uú/*.hP?t _dlH?){[gzټWz9Fm4r^`=&{6rL6}O4q2E:KfN U`VBwyP#X1N{8o.V\ill6% lvؗG=[)!vuFN%*Q87*ő\7mK{L1uS_W\pژ,r6p}i`ϵ?ds!Mp@#%w@&H痞ˍgsl^e$=ٳ6[*L[{nOwE=}jhpL쇓-wNkB;귇`|as2yͿ&='wo$ݧ$&k67=[7C+]n;pP`OևDxW?,!%m|$&uEq=:|d4"] zXFüY k L6:P Ø.AKΖlVs5jyf$5["78q.V;2@@%I*x @=Hpk,Xb"(~!mOXhl'Xd}}%lԣVy $H2Mrw2(Ē@"ǂ M% < ˨r.} XTsdsWd6ߊL 1gZf_Jc$].@ ύFvKi̞̞fYWӬ=֫28+@gFjgnŪ*cs1#@=9?P DFەIMS/jGz*/r];vWoHDc]=F\3H R]_cbD1!@=2܌z3xH}xx{rvW KcY $azB!yu9Dz]i;̉psWdԼN0N]:]x3|MFFi$$ ^ʳYy0lfXFC{5g3j%߳ƠS[@0 u_70Ӛi5FC XP]of-F a'8嵶Zߩ5<~56%xYOfA!f~Xz-Ў$Gs4IY*>=S+E  UYO8|r)"4\EH-'?2s#.e6o9([m0֢6ʋׁTV377#w|1x9GQ+=J|*O_\L\NE&ߛ4sJEZQpNɱf&l~ wj065əxk_}K$ n~pfgg=f Ω gXJUxHbE>C%ߣaX0 iUPmNu[]˹{Je>xx\6 R7/8>tFȏ dk$5w|1dp".+ (]WP*_~1.\vp|O 7"ݔM~Hk7n ӂ.L̞M5.R ͟.V]łج1Gƈs0ڜzy*ܣRab/5\>#Ol3j 6p:ӷ sC2A 铹u҈t6^eBd Am/r= n{oO/H_:&;-IiEf&l6R[o&-Nt[~;w" |߁3OGҠ=Űs9@bU$_WkښFp[E_j|Fv~p[n7?IJL8慅<@'qtP?h jZ莦56n456\2#uV懮5<~:矶` gK6+fyoJx +&F !z:R70lx?P¢BbyHNC-h2V dZ`Xִ׸>_L63d3kgdF wjަʣ76Q+ ppMhgORF @ONoK<@i[A?_M]W\pĵ0 @=iScxA2Bzis~ݍZYg]XlG[{GT^:]t>ܳ*`'3ǤE0{vAF1^>v ~}PXUk L l'Y|׹jf&lfdD w06FA#ݯ5}4Y:Ze#Gv4RED6q97܏Gz|Q#a.Czi{~f֠}q`|oR>dNd3L63ٜ=YqFFirm<:csѨq"kAy)bHSx!k11:-9)]h"P6iOo[\]!Gzȡ _7s 0mB sL63dsӳZQ b6??OV<.V]efcѨBa@[|Fnk꣥"CkҺ,őxr趼FV =\h^ϓ.a!P/ꞷ9~~>\#@=9?ud3L63L2YCynfN@b™/4wjGiMhԁǮ#k51i2iy;+[WkvHDJRyWBnWP?C^3YU5jrl?SY.ښ&q@bf&ln~Fq`Vqgtb¹yǡŪ}ml$u̳qY ei'"zg5rZpnG, ` X'Z][^>K\˿tHW/>nP?mLV |ip @=hb"Zl?SV.BZ&q7@bf&lpFss3b֭bgUY֛̓jF|@8@.VUBxpѨFr~VXY =)s+EÞӇƞʛ:FdsU;ftT'# ֫ !xZ%+p 0`iޓˑ+_hӏ_j9b/1s]+'K;V3Fl.|+9tF0;6/&lfƧ<)#gWXp.ﻌ gau6 #X5\mcŵml*[dm¿Y lFn֬,=4BЫ6IhyHhq]mon+`FjV5~#e5C??ВUMx>( bm녠4n?o@ v?SrmJ79_0or:;0ArL63dsSӓ A N,&&o*ijj/u\DR&+n~pmdl4>aڠ37cM付zY -6X蔔3C7? R$.}u8x*rDXlw=X5_Ӎt+=c?Svəzlu-{c5.{Gځ<7IGhypG/&lff/wË5?. 3&2o4A1"T,4L1q]6Mq!@=1?4FV$k>C\x{I5@<ŏvdJ=s$ޑۼu!@2ZIjFٟ̽ӯr!|34t]74xFv[Oj?x;>, V69!+/ޗjHWQ,' wJF=v|0p)'rwczG,UNf]ɶda6 j+kbf&lt9IO_N֫28+ />z ڲJtyp6r]VMpь$!@=5?4BV sf*5ao†y7I㋠^m_hq4Sޞ{KZ6nQ4HfH|Z9"Xiu4ǵ#\HfƂ 'vQx@ҐĎ186 cwhsgJ8ε|qe'ƀ1LkopF wj06-6"|Wv1Fzis~4ܸ@z|Qa.Cz'fؽP$yH11;ذ2t"d2k_ 6(N P_85,<73' 1L}qDzik~s}=5"<~:矶F'f{u2ZX{*r|]d`å`,Ўwā,FPPX"č7u84,+'iqE)MXcnK_L67H2"rkI[a& VלPŌN8(`1=2#D=3U^rRKa%.#@=2?f:&_j|Fa,Ădf ܇d{/yJˁ=U lqwgLg5cz(8Pe/?ևw@-%/&lf/喯rboAF~|͈uVy;֛@Á42 J^`J%_d*KJ#jN qn \Czl2Ez|Q/5\>#@0&19u?_lv==~>k wf cۋa&6Ɨ #gW8y$(= t6gg|,qa=9*&D|<mv:'wlE$W=mQMaNívιg#@=1?s2P/ a.Czw]}np@hvjl ~wҐx?@`w>Ű_V;G7\pYϳ幥RY&L8 ],rXZv]hV5T>V:Dܶ6EBP͏<[cv"p:ܚiv} 9F1[ ]d>u}#a#@=a.CzqG w|5J6ߺuSܾ|u놸vxck w; f߳7Q_1g%AVhHHtW:u}9AZw Q߶IyZyL܎0X^BR?}Ӆ6+]& ]sOj\2#@jlvJW^> X}(!۽kZSжbQ&{ǝm5os]/˄sgpѣ_λk6?~\`fL6/,,u;ٌ9cn tƺ\e-Ae%7s*$q[ f-ndhe|NA`K8[Yy5Ø~iO08`YuE{٬IJ`okj&â:7ݖ&ޢr̋w+Uv~2P?؝!;%?Ȼȁ!͊w|'ټFHe㝼A_F WKe( *kw^ϒd7ϖZ$a>b ,-Ⓣ៏bh=.cd3lx*`- m#@}S3 &d$n[G6&8I{&j0jˈN=}+1 ٫ASm0-p{UyU}ߩ613ҍ>p;~4a a>*v|<ڻ ^|xfwreG 0i6&_u4 kOuج[_[]Y:R'djU[cv۫$fs_ ދ^5XG;1TaoGw̑A ï%K\%&/)yo5w̜"yᗕ?:לO=W6p}iq=ܯa#;##&kIݖt6֛wqo<Hg)ۦIGGY,hD" ^rkb輫n*6o~V5^ gxٝd1k` 3`]p<#C Z$1849YN~!%m|$&-c sWSÑds(ցV$&2Kj0DbZpdИѓgFlİV?du`eb-5YgƶWF!@=5?4+#Um=GOkk+^kK1>#X!lWvC87e?Gmf Pp'sm%+a+Cv6qі`EEKg[h9͔db4{`>nQ?Hfu/ !d1+wWB bscKmaC!ՖNoP6_"/2j!ka%6pFA"-AKz.'8@'Iq~,U4kfoz'= gd#ZMuHVC93#ڜ^1Zx e݀CR-zwWUN#zm In"薧~]v }<(akTL=!eYcc{q u6!pd[|ÑiK98`8`oA'_QbFDK[p21b|%7/b+Ɗz\JO1#A+|3 m_x|?;'FZF4s .Wn~p.bv Acv !eNOw\3w|1,5;X, 8oammxv2yR_ԈFgx~;w\r_FgavvlBynJpֻTeR=ֿ'vL|bGT'"YrZXIa qa| \MnF̛>1z ƚ ْؤ&CIbdsD8zry~Űu8<-:Ю lO i㋣QS].ڜqF/5\>#@`=- @@CG6ʻrHbhl8pDpN_K[ ҹs*@h$F#u\I§zG'Hqbfln.m,<jD_r0 }5<~:y7oݺUl $)1 3& xNE| dLdoJ+𼞥1;\RX@ P_82FMtps& E '_j|Fb!YْʫYd̉@Z-g\N*h48j;@Cvnw\"ĭt(|N驾ᠤ~pU,Qܪg糅f&ٳk w;^>nѤ_Ѩ@83.E z*_ۘ 6OSl.燱;%ܡ1Bz|QCa.Czis~ݍZYg]tƂlf g4P4'EE {X}dN(f8/iFPR~K:gw8ys-}筝;X:\ m379P_H1F)U9@-N,"<!#`ژ43]Az|Q/5\>#@3 A i+}P/&lf斯bo@Fn| #uywD*g9/&Gr o2<73' 1㨯jhq4Hti lrX"Yԓ`]!ρFY,7$MP_\~h2YoG=lkL}fI@zik~s}>d3ݿظ!;XPFYEƝщ ~xG}Sj$u̳y1)wtt"{--JI H]ZfOI}P_\~ښu7)_82~~>\ @=2?Lȹnvi_hDΈuVy󳪙֛̓aWG[=_6D?=4R.Gt7p8":^Dh\+V"/*H$vu#Qh_/.P?UZ[&5cy&v%E"wR/j8/UO4{J_{n0RZV'+aNwf_%5$EjąKu;뼰ĶI,) UB$~Uj֟¨{`mYj晻չ+v}5\V럺m/ܧQ7zxƿy37)O`Edm"\'oކ ly,%a${ҝ!؎xˤt;ԉ3M9Ha@z-Y;-٬F+F8>EM_S$͜UB-cs]Ez*|{lw^O mSH\}QE=TI鱽!m~F^]DE)#rO}xTo37B{QW 5Vcuq{FXN,1Nu3Xy族qh4<}\y I5O5(֮:zใɧ4jf-tWMxӋ4?lɻvk3GjP0%矶F`]Y 6 nE0!@==? NVa%?/u_~dk]A8*P?tbMQ?F2Wʙnp)o[rp;E w|ul3=9E&:9؞M3w'bo8F!@}Sca.CzqGz|Q#)sNd"/oodLL9OCc1*>8GE3.cNsEqG1k$fO^yK+1@F^6~M?5m/z~~\>#0P?mcy¸S#/5\>#@C;?4+/f_4?Zw]/9w|M -,rk.c4?5m/K4 HL8Si.ښ\qFE_j|Ffww PYq(9w|1<[9~!hk1췽|d!@}S`i0¹sOϖW/plxj什uCzie~ܠIEz|Qa.Czis~h&> f J%.(9w|1<'8~Qhs1| @}S#I?f܌غuؼYlgeF9"[`%v-G9CczpE _j|FfN}j a9 w| ( ݙ䒻@bg4Q~Ai{1|d @}SBbd]jFV:vlIhȃ ]]NWfײ=S.oژFp E_j|Fs%wE6kn!#0ޜxȑ#^j+6$C@bEQweҍ/dvvlBynj @B/ki~zV(X*u%ĮJ.l. 8b=+5W#@&ײ0#_6㔓z,p_E_j|Fs%wE6bowBF`x7_Üq$m3^6搚X 9iش͖pY !"q\aHDjLBw pTG9 u/j׾^.P/jxxR#3tP?mtqɌ@+l8A7*f0xes?ؑF2\벘̹UW56w3l>~3̘l^XXȃ+5ژ<,lB{+ "`'4Q=p<\C;?q}z/5><~:矶:ĸdF E6C?O>od,`l7,w,)V~ i\6 xi~iLCB wRsjWӖ A,lf c.0´ dn)ti\{+8Ǘbiiٜl+"9v3nVFq;ܟa"@=2׷aR`%9bcWWvfLKuuoW@gWuV懮rW6 [_|G w Q#_";Xԏ4e7s,YmT `crA X5RA!+h^:Z>^QoF"@JY@DVm$h7fErk]n)GJMCU)+YGծٌ@V\H^Ϙ\*܍>_}4!#?~U[,WfxQ2- *=ngWa\ k_d3ԺıcG#:7o|oś}D68qZ dzH&A mCj%i mŪ)[3 /F#:pܓFqof҃[kg^"]{@N>*{W{ؽ*kGmO=>t@qٌ @=5?4F&f\'*4K_tͿKo;5^~5cզ }#@@'N0:D*i0g3 7ĒS^Ͷ <ēXI&tsz׌ʫyvvlBpz]Kk4"Wm,=y 9>ڀ=w9m eȣ^ʺזi(kn!újYر#J_$"3O-+>*p;Ez}]d`aMRx57J[UÇ 6m6|Aֵm/l gR-9)[a/,_=|<6&1qޗd6tKy i,ehmDpDz9)_$"Ww?3gF!@3،#Pu>LJ8.uS@;Em~&f^}1ͯC 2 P՗ey򮽜1H;w3l>~3̘l^XXȁ^@"i\x1!pφHˁ4#ƤpXzD6kfGpkB 밮q4qڸel^I(#Y8s1 f oH^؀|dm[I)kft3-LN9>u,o R:kÚڞ'rGmgO*@*ۂb~eac#$+ Ȑa{`זEm O^m?wlIK{'Xt mds(v6AA]NOvvvlB/Ĕ[kFmBnޏƸƁ{=.@jf18tkVM$ ܋]\ǰN+1ZّKԞ430wˀ9m?W>?(|.;N_Ӈ\H|o>tR~8}"?ӹE$9dyHdK. &Ho>-.{ 9L^@IWL$KIus9-ܐM"%a}Sv)FZ$o逌-h|"ڑЖV$$hxae [dsF$/q4" p3 ں@KΖlV2vo%^؈~ X0A Lm?@M6EN^?-tDtQ:|hOb!bT 8Lœo$P&txqF1T9e8YF]/.H? s}#=uA̐lfyLf|z'l^C[;f!pE8/5`@z {%$ -A2 ⸑Xyi m/p$!ЅԩS=I:K_i09}`$Qm i^y =Dc0\/ݎtKuZ {V\"#*q9sKېbVAڃFv.Kq(n.۷(hf#Ù=TGZ͖l~g1)sƍdsLMhֶ}=  QnM8,y!iotRnc9_ q=2YF @гe"uT>gs6j4>bhP"J? `ȇhɞ66IbƬU)aG c:8=F^K@kKu c}),h 3>pfOce4('L6n8GcxR_LJ#@m Rwef p>\"0ϸ#Z߻wn#0P3OQӞͿO,zSu,7ZZҗ/3?E$|D,W?~?xG E:{8>Sw1OY](ޤW>tJ~R-jI.w/ujqYqѦޤK D+yi ((K]~{eU3L>L2CF~}r:F`^#-T_[! z5>u"Wțl4yp}EO3x9Tx5wsԳ=^y)Wʩ»4|bcl4h˃_8Bb#dz9F68q40<.GcxR_LJ#@m Rw5TK[jd]e ٔkױ"g.)yB9mIhȣı.uX~N=Pu7نMHrD`D[m >{cdl^8]-aҢ+I ػ^^2ʳ ZH.Ih,z2~+_2גp֞GyLZaJ6hRK͌$4o|L6]#qߓ^̖hvMohCfƇ^r#dՅx_@~3̘l^XXv̳1yR0XqmR$a%82&?p[9,.)F>͠׬ gavdNi:⩣~+^}$ g'ψ'|,xx3ܡnMi8v?<Z,B(xꢯZ"Bz/A:1HVƗɓ' ْʫ\Ka?Yya0CYyNc_"8.$6LReKy>toH!#?#671ZY#64*SI.|"@ב{BoIm -u@z}ol.|~D5dK 1lNh(Y7vb$l r1=&d4mxhx͟mFwݯ6omVRFc2he4߸\;jn+gE|q ܱky'q5oT[-s;~'MX{/tfib,׃ԏz3pf=ܰ 5+~:Z>+Ȱ7eF3'wa*QU&2Sd.:!hp*Ih4^*hds@$l=_?@m6%_Ц+I"SKZ:'ь4VM{@:# g ӰCޚW."]WL*!o߹%%4l-ߗ"mbɞHco8]';;;y6laY{aʭ5^^@ˆAɬG1 +Kkh gmjcҍ/s#0AFCn}xaӞ-:"KOྚlBs!>BE3^ l uE[h(/Y2\]%e?+_kljPHk(sжzNz}gf&l1q4wں@KΖlV2v+qŖ;ϳm^ ʣe>̌ u__I@`I8GGF-Zr1FrhsW,ŎCs%;=mhT6-Q2 fwdخ:H[4LjikԺzw&lfydsgűcG8um~&f6sсsc?-c3g(yh+mMW ,~:MPgfj|F.?l?è?mN Q56]XKU`k7^Izk7fErrSvz,s )zyS}]c}'T9d3L6ͧ?;%׿B?|M<1N`$7\t\X;{J۲ +.-QW>M<%w~pH34ps>.^;+ ߣ}JϋK^B~./X"OEn^(?%Kz`T2&J(&DӼR*&|_$aSF׌rMuӋnoݾ.tC~M]LsuKw?C'?gk C[6Q\ Vh,dUJm f5bL9e@O~Uvs[9e'Wq]8mWÃY6p;[歴uo(:عv߹Ӟ}K=Npnγ}{Kmo2Quu_^N-?!>3??}(?ŏD.&}~cQNϋS-NNqD~X3mv"|A,< ߉M#ws|demq.TK[鲗$$v$mWH$v]'~,?+K3 hiLrd7u!24'>G&9&i+$u['r] "! $-yl~$)0s9@S>] (XAb` \v`vA&v Z~WNI1`0G7a@! Ɯ;a@h% Ќ uഃ M T~X|P`JDYه9@fnfNg32C`O~AoF^g+oFc&FαouތaRem}qGz}C6B\YW$)U$'~p8p*zׯ/6|1Z29\P4-жƗ%lf9Tq&F0矨\i;WL6v#ܜ=6[)_\>#0 Pd{+ys!#b#boKټ})j>X ĶΥy}Ŭ=!!㲌OcJ[ҫO~ vݏvd3,g|&R47o ]X& jcpU`щ Sd]̞O=aڷSZ+;u|F`B%ߖ{-c³y-6,B՚l~"wl.dbPlNfd`Rh]R׮W>*~m1~[+o{رc$$r !@m 6d1m^*ݚW3&g/kы-&U(*jOxL&OjWسFa0@&a?=g&l 6"þ="mپXߩ3K6z/zƛ|Ϻ_cY٬<fFFcXd ow( mk[FoYƳ( s?x埉#GǏ7n8\`P 65Z_zCy5z@(@B/ki.CT .n}n90{6<+ͼNJ͟H=f]RlV2SRѸO̐l>2Smlo:(p$=9јZ.3,/L@@b՝06hL֣ƭ[bnIg}~$[[ WoDs/yvUO+g}֨Цl7'.l|6jc|YfK8Аj@քC}kA#gXXmRLA]8Oe]ϒ%V9f" !^KjPJf&;H6cmd߮mo_;ڪ}[9n'x|E2!Sd Kit@w3.eQHю/݌5a&`dB^UjXL@ڢ x;{Tڇ |Eu> zKPWXNn/_ 9^F}VT{zpG7O\x6 [D71ٳͨ% OOO6kϧ{ f<(l޽\?ij_ٸTߋlQdEvH;]8\\qItY/ MM7dKה--d?gVm?Vw3gcz#Н]{63,y.ЀIK)΋=гX%m"p~E4gs֓EbFdxA3-n5*m<(|tl'Nh̆7~ԕŞ֛9U7,W)Pr @h¸d6q_NKa?Yyls XDʍ{)ޘc>NړѢ 񼶣dr@6WbgOVNz'sg"@=TϹd3}]ǚdsf|g1#߳w{l[lWoJoFv6ڹ"l-8Rl5lnҾ}g_ߩgz`CK;g<ߞV"*TQQ7ʂ>*?@/Ki} !НfĞٜڕr.l=3VhgD״Ƀe4gF FC 6cܓG9$%4?n܃b ahӮ'ľ+?=b7y ,xM6˚p>FLm_;s#LΓe4 ^ϳ }_m˾8zLA8Whcǎ5 Ao,j=.cd3l0<k5$&6eP1p` U(a#aE1nƂc7^\=wd)bߡhʍ9q]Ht򕼶]`P?s.\9 2)шF]ίz:S+_rs^VpIw3B2 rzO(of,[) Ml-ʛ޸= 9w=ۗ}\z:cIzFkc}o~5[hF&*8a+ce/1jwG&@ww&lΥ4Ї]:ݎ;*?+l^!WHՈg3&S3ټF:uVD]L6KFcM__@l[sXw?~sM6NOvvvlB/Ĕ[kBV^pP`0v}BIܚ,1+U&f1_uU\@}=c RԐэ/s#@=TUds`?N Y;h`k4fsA<l5{g?^!w[:k} M,leM [ 씁#0)P?s٬矘`_:@`#@`~~4^6NS9Ò촁_Իfi@eJ9\>_F1EPCN??b+{np`KW-}?$iIDATdsϾV[y1Rj"nz6xZ Mm%60L6'Vqpđ QChdA"$U2dun |d3L6l|EFF˶ZzbT*8P}bѤ% /I@υld2?/ghf&l ASIߊ_}T\յ |=GO)3f3l `3_XX4qmΣX<w_)ƣGjcc2^v@7u2l 5Hm܌Rg&Y,g-f{1"RlքRZ$r\htټbt ufo_ͰoL-!%a<^ݝf&l\8ͧE޲i[ۗb2U á%1]hTx6;ύ(M le4$ټ2ݗƙ`^{D̐P[ٳUv%mK'}1+cJ6В%Pn.Yf2 p0[nNOVFjcMڛQsd#@=4F6#Yy7AJg yKFo~[,_y$hdwٹƢ o9fϳS%琌!۶HY[9"bQ3>gὖj& tA\Y@bUtI~ӵ8]˩EӇ)JF΋WmJG{ť[٫~CG(;4pP !H8Z6.+am&GKTSZaR&Z^]/]F5>wg}/s₩Td}F`)[CYY_&KM,_JVdRZ2Yc:pZ6vR1lxbbs:DF:CmrPͭ30ll5Qk%4YݜK6 fWi7cO"H1m [UTN8,H”ax# ATΊ_J^ik r52gΜQR tW$0I1]6SF,I*2v-;31H^[7I@z#g}CZA#a?cfOQ{5d3p.~Idd"{Pϡ^3x5\܌x67(x !A?:vi^ @sM!{zک]s:ELHaLjҶ0COĻ$NPSkav_7)24I6#[ؚ8eR.Zw.1\sYp@U')7I<٩4i&fgS"@`';6"mxO}ROyr%ϓ:b]ڣ<;r:r=;FQF*'DLE$L 5Ci d*hnm~\?cK^ xy&ʮOm R(u߸|F`^x>Uy=6l!;h]g^5=e7c[ĝ!&mnŦR?KklYγVV͓^OW$_+*۷o{sl>XvFv6[d\\!,siҫy/gKIz<[GKE1˦̎~rX{2J XIȖb2g3{6-ùCf&g+ds? jcm/f;73'穻3cd3Zyt4lvS]XN)Ḿ9]Y0 'NO# h녜G6=TJehf%+f~slĻr7 ||$eA6 !cARC6#%^Қ&n {b ~bN1f g3Hc2g3jбF@ik}|@n51lh'+k 4SEO5__N6M6x(Hă@>[4it^2U2L63dscL6.l,"@S+kN(YbF'&4?P?L63d38wr#j6[f?*]d$d4%T.3fݼEyv ~=ogqț=Jds" 87Pӏ177#n*6o~Vuz3[yp4(=}BP/ S3)roq?*P5pùlff&(FD;!ќl>}ucјOlHtV2_7$l.4$|@Ici6OM-YYgd3V 3lf--y'2W}D6Aoc|,Rl1$3Z~ܕ?@N?![gK$fjl> yb_' -\eXa!~~_V5AK':%=bתOw@O6M! r"n錅 j5eE\ EqtkF|q <;;y6 dsH8 5 l*f.x*rڬ MK4MYuZe]ULCZeި6!ri3_47mzrNslvk&9PfBA%?tNrsGN$(?<ک)g\>#tc}@/xDžepbx}ɇ g}x};?RȬ73;Oxi8٬Orl.ak\_Z8/.{ 9.+ (]WP*_~1.\6Ž!J 9mc2f˹Hq66͖pY !")O&1\,;^d$qeTnjd/a"_YpnjG#G6(_M~^ &s7L6-m㜌# L6dI HL6SSm,{G hjvF{4o[@F ^!ۿ6jG2`7gPY/hf^̞͖xf^ )I8s .c[' 57λk6?~\`fL6/,,u;y Vk >Iy0d!=j8ΐF+'|W ~>˹\~6;Ж3=Gltg}gf&{:r9+^^ټw|ϯk1yz,nwwjg_ԛ\Hi0d3! / egk&[ k6ml~ i@@{iB5 g?+mI 8 ;b.{+"B g3MpLI-"@=T)Y @3&Sl[h:domE6vdDH`?3d3̈́VyXv38.?DF)He2,3lJhͅd&@`/"o _z^n M6t*8 h`e4XF#*d3z3[y #z2YȰ͗ 1H d3 f AZW Y*|}l4mP08 T;bn̬.r<8`xo$Fn!4njOuÙ"5ټhtΰv-g3HeA&cL63dsSg ա5׾j@E~7@= &iR͟~qLɟIpvW \VxGQw-e╫`H@Px6mj@7{ z4氌y 28H {6gsfՓ͠-[Ov[7_x~@3Ke8"Hp( 5mqFz$<,˳X [nL*g_zf&l33b2^Gжs`G) XgNəҲv] <8wq.X#g OOm1e)IFă/]-_=-s̃ٳͫtflx[c pRl>!L@o4sO 4VWx6n4rn gL>s@{4fsڂqfgg=f Ω g_xHeE afK^FAJ[t%K I^ 5TYZXqNFkP?yds/h^v3so f67z o3L63Lt,/;w{gK8fGH͆2({h@)g3Nx`Ź+YxMx< q3I.&=Du@6pͯ@`Fz\x6@'0b4֣9lFf3JY5Ƴi{6KR ٳ=^KX K8А`a){ooƶ7dHm Rd35\>#@Si?@(^O.[la-l5)߱c}M[VO7+19lULuMj䌡ß{9yp-q;>D) ,r{!Qa], Е?}F+J?|n \MJ?Cr<%f͇: "#dlާG.gbj^aN*ټVz5/ްWKiھ{٬tdp&DeX_\8+sIf&$n&,a^睁5A?@0cyaa!Ҕgq#u44gh\IC"J^/8WAj۸L Od37dzH7ٍv}o~%_A0@l'cʍz:;vL q=BPWXN $GbEV #G\9[fL4M68f1ӟ?[V dY\~1.tvs9u};pZz;ۡ^EGog^+9pO Jcf&Ab`Z@MJ<="T\f gK6+fJ&[-HDb[[363w6ڛѾ2@Od3Ce9cb0YZusZ`67+7KД}LNuyR\CJmcİ`15nf Dsdce̐Ͱgpw7I6+*]ғe4"n3k6gd8.ȞXD-cwE8/5`@y% Tc>TD97D 9: P 3c&a#`le4w4BL6OmϺv(E :VF0xq\e[Gi*\ B8ҫ} =Q9PSچ6 ]l理揞gE0e4~SV61b0Hwl@$3eb3@2a XGFC7)_|h|Wg\a hz̞̞ڂ[+wBKo2fhi ~1! 5m/q8#@=T̞)^ܰ@ :[ a2Y,} @(̞mAj$y|Q#3tP?L6gv쎦#{6'c9!Ok#0P?L63dsuN.m]ń l2_\,H2d͙"%νԣ9nRL=ٳDwqgc_a @m Ref p>\"@= B6knPSIi:ڤ4uOt cf[u#ʞOZ53۴wn #0ty}918&>qmK_p3TFIC9)Dç{`@烏EӏJtxX>u5kXy 2]e4 fknXw"/tUZ4_D/.ia{լmps埍\8_P}je| E0 _Ą3_Ͽ fJoe{%;e3|egN~K5oH_l~Wvgq{Cγvp cַ}V23Y+{~8'#@{(v]=ٳzkS?d3{Q#nMyՎ?pwd'{i+]>,{׊C7pjcf!x[PQRm}IA+)PVZe4,dI6Υ&d3N8!?{{6/ۮ֡e;{TDFilV͒~`Hgf=D\m%M~$oK Y-0FzH=8ZLKI$,A ~YֲS2ڋy/6cO)cz8V`hk]l^<)& sXP_zCy5z@(@B/ki.m aMCENr>>ܴDϑ2UP5uQf)?&lKx|˨-Q}d|* DzW5^*O.ٜk?fϰ;KN^* f٬4FOc~Lk3^nkIIWzh6n*B!5xv~پ"|z_ڽ#hxnl/ [Y ([X9ZYv6Dthmq|oI]@te}gY d Hr cD3; %y'X9C7o`Xk dĈi6L<6d{2h}F'ys A= B6y.h6\BF_2E6k'-?xvh:jg/vr,!c8%L7L-<9tu}gf&yXd]Y9lb;``<[cld3x5/&\g!- l *ٓѐZt6֧['j;jҷ(W``/ lX< I6+un\Ps+œL r:e},'){ʧrDd̚ɱ^i,'<{CA5``0RLhT4K{WwЁf] 6(Apx:_(ZF&Sgꊿ̞/vl^`9jDb֬vD:*UUvwjcm7 hi^V.HDz`-,ntK^:OH$ct$ugf̭.FU[2]?;']ySi?'<)6kl{8f El&o߹y3<ٸ$ZڦɇY3e9 |^ cy^䛷oHHH7td2YS9SDds';L6_ni|cMR|SO _7n-DuqV䀄v`*D/htdӓPW}=dV嚇¥]@M*6SEpƹ#;ṟr<&3,@s&=Ǟv`,J=朥 2 /SormH`Eƌh%z"8>覆ɛrB;Ͱ=b<._ׇe(yAn13ds[p:sxތjny>uuic}o~jۛmIuq{UۭKh[W2Q{"6-.8"#3dsN2ZNe4$ ĞvI5wl-`̀p C=0P&-rʛ8R$oǼ4JG$UH[^&]Fm Rv|Qg&f&ݸTgw՗rȰy]|L6|;HUx޼.ۛUoq{m\]9p, gc疏/cUyF^ߙlfySR^i|ܤ(#bF{i6|T,*"aiGg9gM`C 7Śi> 7!6`8ʾ*#C/qLl۲g3h.hd4zϮds('W8rN(_γN1>[W^4ѓMNcLesJ"v'ğɟ 94W 2eŔXu?iΒh^y1hG8ˠ@24~= 4LK6k&&BPi~t5 3g(yh+D$L>{ 9 Tv0{t,)#~?U"Ό.jcGf&a:/19l37H6}ZSG6g|xgק< O|YziR5xlt_8wqip?.3d{7NTukʟ{0skCyU/޸xe"s"ro֣<>cc䩷 y T2l66ik~ ֖!iO X6XwJH^AeE`X;LOÆ(ß># I?|n \MwslvƲ%lދJ؀$wGƣE># 1%lWxj diD<?a7Ud3ޘdgXk@H\ f|MzPdy*oO6#Pk>tl sHJT[eðE-LP 紌ڰdà<"k+fmp6te4V:sJFCz})bGE@bQی`w-C). Ph"e7̱0oD{ke43~1<& _r~˧>ftFͨ7?c-<8ጃ,au 6Y3*`9c yFݱsMM`u?y~fg?h !vo+J;y9l.lS)8f@@|ݬ|mN7 l.tM*@ W9hzgӌh4ѯ-ue&af {w&^Gxs;Hf+ƌfaj 73Nhg 07C#lʈ{hV?iO0fl"nQR a&M@4&kR6& RJF# ьf'fK8d4p6z^@e0Ln !l'fF9V«Nm'&nʈ}뺸yFnnL[{nO,1 wq`r+"*љ^*ݚW3&g/kTD<#] K>hUFqQǞU{UjQ^dt\շ1zlη+l,{9Vi U6o\]8e*Hvb0 `-%α۾,1i}qF`X{|Mq[ 6[nkW/)I$*ϣO/& ƳJ;j)*^fY\L63< 5rXQ1ʫyvvlBpz]Kk@^D")MCENϊ\oYuZ]]?\CZe <-]Yg.j_Gu!_1ָ:za9dhY9t+f+b敄F/'  \+b*RxSܣ`ws#0lvI:te1sǏ~ NWD#%P^CX"V;j+;yǑ\_L6cx9WymX{Mfϓ:سz7gs b6??|\X Xum܌ZfK8Аj@&{ ;bZ -v.gPUW&],Y\x#AT5P챫_+ӴITGswNl{b'"2͈lv?&lZnsn("0lreޗ2]ploy*B]+%;A6)b%zlG·>/&lN e4:R7LϏek([}Y>osbEߒj_λk6?~\`fL6/,,u&( $oj?ŏAds[\D aIxȖȨñ!6CFgGq] p.%j\L6cnO{l?w֍Z߫ϋ ΊsN*Μ>)N~xT;4׃l^,V<$I~plf=)EJ6C^  m>+ x"8}mSa%?.O?!4&ڣ̞&h5Ě4Y/i" rn܊nFOf&l^+9D+;ϣryp;;*+xK[qhbܬxW{JodT6ɻe4۹RJj~@ǚ׳$e2G e=hXyu0QLI7Qv"%??D8W$ {um[hTsL6{Aٳ &,̱fy8'Y{:@%5/w*$܌0I4k 뽴C~V^!; }` 89-K[hO.NXdsgBgEp#P1YZĒȫ;QI6RL63dszBl~kA{д1[n@pGUSoB9U#Qu׮'gX{ټnx?^ծT_PA6kҸ %<1٬d53f˞H:,ÓbHx(y(|Fu5A^rE环͠Ǩ=@:TwCfCD')-GŢGŖw/ply m`7 UY&0[mxKXy{Eωſ!9cGb?>+m/lnF!4\XK\m.j`#HBRR }}STVYuU2G2Ȭ_㎷V׾Uqgo~.ѩtt*V]t_^9ٷϳg3{6OGcd:#~|)DG;"X 1d[̊hV5ؘ(9 ~WGI[".v?c4Gc"]A]XY'M?h>^4|UrD/Ʋ8^g1wY7L63ds{7/s*K\_ZVCJ2V96:=SHg#j}o"4*dI٫c$ױɌj\{X먉m/Q!MC}0i,Ҹxרdyaߚ.pv1f[IBifK6 -PL$I{.*O?# |UHJ,=oR$l|OL@E,'0/j[MglmYXKuMY/32sPFnnrd?y6+B&/”G xaDUNuqKo+gŤI630wص8r1K@0d3L6p7էj"ll/ }!kگATse/'6 )FBXMg}~thazo%Zߛ~D t-]K:Wa-7swqsP&lf.~l.|/ÿbz1'~4+sIĞNȩ) I 64{ N>\i WgUO43&[CTI(Kַ426کwZ9B6pf6ٌCeh/hFād3  ezr8կQ6f!3F0 Py=0ʣ0_ɢBjT^l׳lp ̞tqZ2ygH?0fpVmwRwIuk j*yC_]F f&lv>Үk*BFFo Wk-s0FX8fEd~?RN)Ռ@p7a-яz.Fn>3y3j}&+e]Z0A`,FM";Il=܄ f sk͊e2oBCE8*fPVKf͜FÆP*}P^7}FiVdxa4wkda4l ѐ>٬5*%-٬ChL? fxK9A ׬6sfN.<ܝtd+ ʣYmck0GT@8Tz~7IW@b5nVRl&f&lR[;Y~ZQr@x}~+dAGN:tE2[8%]p;\?scɐC_%7:&ԓ~EO3܉a rl4ܿسY%̰ʫ9HlV΀l5&>s u( Stb a4WpflE0+fZߏIqlpfCjD#N~r+b1zW_a|##hL63ds_s;r0u=8KØ:Fs$1&%P:Y Ñ&6s LB|x})3/ƲuHCxbWk'I߹M3d3;:sfD:3|F\8P嬸˕}qKKWE 7޸!T3lٰ4˙uJr)e]ky!@mlff&eXF`3j}gzfYj {6?8- oW,ek•wSn!cf͌8N_gb5dy-2ٜ_jd3L63(`ޏdy6ec֊T;L6ϝ/Wlff&׺~-j]'wގ8z뮻5 ֛ g}dIo ȏPݗsDSȞla,^m]QPm̶;&f|Om}Q~x؛{Emwp"@m>l _L63d3l3b.VlifsgK[ҭjdaacے\>":qUuXAx»gmPDe錉#X.jd3s')/jSb}l æ$g \bf&lf+C w*&`1yGy|qϳYʊlƄ"ouJyжcVz:+oCGvs֞=bwK~ymզ5+RU׫Ik%WlkCdzZ@.~GYp}Ȼ ~;Ff_Jmlf̝{EmLFg?%'7\sd3L63ٜgUz\ŋa6jlZfK8V٬WE '!&1mbw.vH&Boíy4qmCIض!q3 lHd%m}M&K]K>Ԙ[9>@P NsU墶?L63j6%w'?S.׿vO) >sѿ\bf&l&jJsvv鼛a'O H8+ypwqEn*ҳʭ8xª]bّ [V8/BȒjx0o<}: ?_s/V9d7Н&亙@?1'3-"`6␓0{Vlԅ'lVDsӏ zhEmVC?8A9[\' ;"Ӻ\bf&lhCu$ ٯ km-\!l{Lf>C~Lpz8>vzHVO֊?SVq㹱/F8:%KC: FLwy, jKFnbs?dč_*._:=) A g9@_Ԗ~}?+z.}.z)/HsuCA;xL9Vl}{5^qrh 3vǝWZ5/1d3L63<)o14#V2ǬlB3*j"2nK菱Sc\b fE4~l*~W=${1R}g.`ͽ&yVM‡.6#L' }Ȕ` L+Cf.\یrJX]8͗/_\ҥ bW{l~L[R>(}w).Dŭ/tO~%R%֯z{_}s砥PLƚǞ= H[\?:4&qj+_u_Im [Zl1/iicguץ.Wlff&{ڷ C @+A{x;Td"Y2MTZ٢&О#rn9\z?dŋ^,oO?L6O}J"[2fEJ]K2\]cEm)OljO}RBu;v2/bk]̣]OێGY^&Gjv /k}H3ZQrgtρ=^M0?aL63d0k{PoDǡ@785wI=OL'k ! cxjH\MQnga ԳGCa2$9Exm_.j=*U? \B-Hwݒ⩣F_\JٜkY.F`P۟\Ϝ8؏œxģ{OF7G*W}FCy;&Ta?u{ϝ׳$e:GNg@*G:($ǨZNs:FND wo={ئtKGDZCR8;GYa甸u<.JT~jCk zE܄zuGD Wͧ_/K]^.eY_^UyE.;n_u9#o-/k//˿[Y}UN}E)~kx9#?iq&.s=U*t9+RŹs{߻r^Q.k@pႰH|O'Nxe,{yEՆ/Ů jtnkBx"w2? jhүr1KB͏_w(B6Ҹ&%=!٬j/g]9lqq^ELW!<4 yh5yu,`/j[Sj}LsGN{$vd1 aI>_ӕ$}-x۶ zg`T6(֩p`}P Oj$ƆT;Uawbrf)s|9qƀsGZ%Ѵgw ëѷ$0ޓۍv2i=leJ>T̷=윗&_kVʜz0I)}P9u*k_cb{W6|~vg Oq= =7kz#Y_ך}ʽ~1@!kIZҹ kac6͊tҦ/P6Ck$!{~/jVz}N& \Fy1m(?v8;w߳Ngi;٨o&O<y#16M]?)mƓc d3ovWٝʔ}M/}H5U׳~uEgl!0M6P 0qр{lqmj$S#3tPtc5\b΍|U־fþȍu*!QLSR1۽=OMX%g*"q\f7HU!6`XDvI\t0AҼވ7~Q;u߸~F`PkAܿ&rfnĆwn3{6g \*ٴD"p`#iyIJ-gھZߩ3a B WF#%8YΆ7׎8ګg"ٌ gEBoeh`Ky/krJVy3?{'5=mmc-2Z6;/iM`Gd_bC\^Emwjɹ~F?%']\lxq=׿xfq%pe/WF%ϝ{]=8}Eګ|Jz){dO\0۹&/:ԆL>`3qHxߩl] q)7Q?+rŰ/r|P>n1O<) fH6u<5O|{l^@$cbn>a{L#[}NBr:j?L6>wEmhL&Q,׿ P۟"o]DskTϜ8؏œxģ{Oِ5+I_ fVx9Xa PtE(kڒrso&o4Mb9o ?uԩSjْګYnDb̀u$.%&'sw5n_6, p >0$pP&iM]EmL&Q+׿!PzdS{{}cޘ/piJn>zˮ0WF%;&篋e|Q?~l>^MXɐ(^Ǟ'3"gsq FHc&D@26s\ekE4X_PrG_iIlg(ۏ!q?lgr,Jў U'z~n]،( 5a7#@mJڇ &z]^0Gb_[ՋB/ǣ3&tXf۝BmC8KE4NGp=[,% ;tm_\lӄrC&~%+b]ܜ 0lVN%Hh0<&}*ÚHh(S% I̊hV58 _]ڄ} 9`~JJȷ}~TJ <&@]wy2:Mp$kP۟aZE C _BhZ=[3^43&nov6ڀٌ}XNp=O#¿\I |0(Yyhp#BV<\ekrАכbma!C %c Z?5tE-90}cT,]~EX5`'2ۆXcBgjmX^>[p/aR:bNW#ɏD8LEaK% wmS{}\8WfE6W/ˌFkaCl05Ognp^@Hsr@&G{ꍝ*QYkZT\na~Ǥ^l 1ױb /F~Qg6jS>pM'~Q΍L =,}K7>= Qz3^8_' r ȶ; Q%k/j~F`?E p286}RE;%yS5N2 {93)8\3NYR`-$%Ն}۠kڇH*A8ǧ a{࡯UYyǼƉm/L| Wl3Iu1WYnVk,*BbA'Of#0?'q=oD=֯"ue5gHVLN7Jw}=n ,0>+AT'DY؂@4:)-sHW^EK yݘ܎iuoT,y,i^Džrfݻ^hd3 U־CoQ|{wZ?/$}\Y\[R0C%Hȋc*;&9k42C$Ql@}uܘ4LN7k{dbÄ]Co]C>cm01OHԶܑZZ?)iԘMoR=×8x$8Lar]xI.Ind^lM8rzsS1/& ixc*k~ɋq-*A,hzr#Ԩ/q?tac{0c1o!s'JF_0oEɤ<վX%wcJZaVnq׆^{/S,@Ơ LL∭Q_Tr4 oUȰ`}@ c~zSGd3\x*k_Ëa_)}`Fg?%h ƐGӤ4I8,/W3~QRg6jaSfROxK<:aG/& a<Rc}M/}@zSaCc1f୘k!'FZCsf#@m>lL6gs9}/}@zS~{;{b\?#JO)0Jz%Z+*gfvZQ-M@}؄Y}L!_L6&KyrU־þ}S @=PJ,Ѭf&G_+}P5ypկNds[=#tG WYlŰ/r|P>׎GwufDpf|k@e6:J֌0XȮnCiLS%<Q_j~Fjn#_'9&'K8 \e /}@zS~lIzK5W^͐l9>𣎺:"̠6U fEw/*. ;t'&k-o^VOŹXD}X,F @_ R#3tP۟1y5!_&9&e`UF WYbWfosH׎8ګg"ٌ gEBo b`UʃWY-[S #KǶsjCPЯܪm-[Ui-[D:,K:]@ȍcaR<|/jX:O)ݜկ2E#};Yj1T׾9Qj$Kl hU:͊l 1mY牫 mXǖ4U&SȟKX]uks䈩G_/m~AY}c}˭Ujx! O 1,jFzt#@m>mӿ\ <Øc 5ͱBuU*kNY m}MZr0fɓ'$ 惃npWpEt*bcKْǾ"L}ogK$+"k:EB{d3՗;޷ X> :M{X ;_?G7ERg7jCofȏrXxyK6a"ϴ59DqԘTʱ]tڷaD2~w6>O h:uTM8[Y{5Ky6͢F5Xʰ@^2mFrz,CՃص/wo0` ك -}f~QzX AcclꔷdC_ĤWQq'"cxs9,*k_C781ۯۤ#Qjt+d4ct2H޿Xpr~M Q־xJ\?(Ah@۵6=}\g1lE컨OI1_7{nϡE;k6x6{ 6~?C]V_W,V~=)i擳Ņ{+/J2o -gn4Wcu/Wf@6O<,bNlG5i z6s(a{Pu~r*9LoΞH-ƜR|.&c6 ڵ5`SZЌ= ?tsΖ4͍ɜ.r,{jB\=٬ФI7bh$^9w,dNB*k_K-y Yc#3w?}gԸQq k+_M@:֋ޮN&9ZXBscaJ,䩅>yigCl45f^s&a&cmW9)tӘbﱾv쉰R۟R(?8uelA\4-]ͥexx}\y4T"F`*k_K.߼P46rA鴂;'_Ki Ku߸~F`P:1]Ճ}4Wf$V4^~\ڳ)# 3H}Z{@?W 8s^tgck{-G鸬٭9qqcҳ{x/RIx^Ɂ7k;`kckk;/&?,U־0^ y7{n{/|XPLSZ3kFs9^ IkB&u>xZzWkZQBaM=M_]sх;$4 ^ḽy p oFڋ3E {Y ^98$w}"+깿Oi1>,\byc̒\e]^ Q<@}$PA_s>,-k9TͰDD\dV FL_ /\?#P=6dqr}MPjK:f'3DL?(kFL׮qWF+#= +U2/^_~q& @m>l,>/&y1U־bb9o ?uJ%̄3(skEjf5#k縫xѬ昨9~.0Rg֎akB WlyF WYɋa_)}(_2#"ufSpiP۟" b֡)ZcqWˑx3+Ű̻ʣ$ 3q[ٻyL=֯1eUZ3kF}X᾵!_L6!3*k_1x17#vѣG]wݭc-

a\@ZQbFg?lƎk?5kcRU־-b9o ?ukGy|qϳYʊlƄ"our1lKoCGvs6oٚg=qc꨺9B'< Uzwu^VUjeKj}1[9kK}X&,f!@_hR#3tP۟1 ל@~͗l昔y#W-\eQ^ "MC ͖pVa5J'Ya z;bڐ/n&U TC["YwU"85w:ܵe9rԣ6@۲qck#};+ @mJ؇!xPט*L&Q.׿vO)Θk_~̈́lI1$|Ow>[*ڷEOZr0fɓ'$ 惃n#+"7cLZvV5 jۄ\RL{]z5"u҇97 (_0}X,!@_Ԁ_&GOΘ0u\ b:zL.$CfӀ`"r/EO݇"%;uԩpdjOy#Q,eXǨf\z*m9P{6{p veUo}Dwۄu#@mJهun)P5E$a7jCo1Dc f~&IO2>#((o$y7G{>X*k犫N&t<0l`|!{RlAz^H_ilg(ۏJ!B41O.Hb虬=cU8ѾtnCY T@v嫗)i5,/jw!dSo e]GBFZ _6}GdtgL.k'I% _T\*L6Q-&Z䃫sl$]|HģRQA722Xq͗E WYJ0v2#2%Z7`Ȟ?[/("ѬBkAa0`:zZ%jz^n{zTn:`mȎXB8Ŏ}S Ǻ|<?%|$;o2)qvͻه)13 &`7\L{XNxKUfbC/G8f7L4OeI}%\b>#`DAhWzF sn/1ź><9H7}'Lݤ/jɹKbiP۟Rcy.oE.LO IUJI齶zAԳ_ > KP<.Rկ=&e2$~GqDJJ)rL^vB9OD_;^SE/zS;ovM{j vbڜV+d?`[Il߳IɪkqRz{_ ʕEyw\q)b8:& zA_Ix GWI!'cnomO*ymRO 1PZ@쌹aL _&( I)S0Q&`oHt߱\}3Zg6jCouت\)=g{j0.L§q_HF=un~=׎8|!*g׿4}H=3mj. A>vf񐘔bx(zrWGs>LRzq&+wN8_R\e+jCiMO"uPG 0Ǩ;뽏zS#WJ3)afu>.C;k{ ;U`!O-d_H䠄ٱ:ϸ@~=<^n{1;%pP۟RA `gʙk ryVVM<*k_1y17͊lf™z"@mJ;^sZAlՖ{N`0!8dBux\X?A$ND4SXr)5#@m>ypկ,';w&0=ܝ'NJb8\EcYD&O2p!kciЍ<r+l~_OkX ǏO;l^ر]DSfsG툣G[wz3[yTd+ %;;fU"|\Gt?Ovl?atHBF`4k4AR#3tPtc5\"/](~O\zu=g !__ 7wrqZMuoK5W^͐lޑY2a)Zyjr?Yٷg}lӛ;^' kiSY׻ }uuȼYgЭ?-E0$}('@m_j~FjS>py5!_Ydj3xyU#ăl5!X͵tqW=fE(+&V>Tm ?CI8bڐŮ/&x%[OD"o66F 8GUo\+d48rĴIe hd>Ì[fr֯\9^9()e8gK_d"?#0jOD3<3Z#C~:0j/l gVCЪt"Q["bk/:3 ]]Fa%HU+28.C剬u~3u5ٌ^1HǮe }f~Qzt#@mb#8ϑ+a)1AZr ɕ\&Pq#pn?G~ɌcY u\w=\Q/ c688ȃ+# C7X {6^8"v2ȭ՞^(%c1'vd37|Ua}( 7 @_PJyL=\& @mlSo?X +0y0$'KHӒH1)N_W'YlVU@a(]R''N~10XF wk/ԩS5lf,u/ޛu1^.o>QgG׃ɭ2HҞ̀̕v uS{]dW#@mJbظzF jbEEFoe}-ș:$Mb+0OƘ:"yf"ya=]i;?BǝY\D6+Ѭ}$F@#/N_O=ԨH/o^e@:X̨#ٕ.VsE^=WO&N ?(  qȨFO`+8W׫ʎ.lG_vӉCwhY$By񯻏 A)ifz?+^@/q;|nh'o/X >pco9[prsXq/Ws!Ryco sŐc1muPo[xA "+Y*:~Ə+\P۟cR E>ז QnxocD*7鑧`&ɳ0V)i6;g#k|,.qX) ٍyf܋5^< ~~II\ 90 )^~7:W:{6{@HY? cs >i?$K̊h3VUp7jW!1^c{o%?Yk9]#:k Gڼ*7jS>p͝s9~QN?11&# .HGax[p[yUގɑwi#smQsjCg%+gKxf]vb-JSr-+όǎg6ɶuyyg-J8޳wD%:\A#ɬg}vVHEם=/Yޫ'&S_Ա.c @CƦ:Ju~F`S?E|ݔ;~R5%wsku?]bs*Sk="0Wy6 "͸0<EIybƂ$cs{7pn^#M;w+5^\:?a91_kFuS{AZA_3"Zb7ijZ%cxvq@~?}IHzq#@mhC3u]\,f oL2LӦ-KS~W?# &8Nn"?!UW~_1̤;ρ9*])zfsc۔# hX Xp!ԛAjKu~F`?%,c.l>R5%Wi }ǨrEDL7H8#@qrq'{ɀ1صc/\}-pez(U?D/sktfzиF@pW3dƎ`pWpŽ .Vs~X >,+k,92qX#Us|j~QN%iqE}we!_L6/k\YZF3vojB:5UR1۽=If` }edlV5+UERKݯe!9n夦?lʍ-\\bX)˕D w ͊lf™lx#@mJ5lH ު ѐt!Ϻ9Q5%o\?#vۇ _d3#F`b^xrv~ M0 1 kP۟">\A~+?w+ #vѣG]wݭa̖hN8$9L|Ƭ6|=()2jN֥kaYQ}  R}V,=3VJ/M/?E/5\?#@a@7v\/&?,!#0^ 7#Xѻ% -\y5CyÏڕAɺdX_/v!9١ND1jm]ֹVa6jS>nWs닰u~/jtX:@~1ŊX׎8ګg"ٌ gEBoЗ b=ʳVzqGƽm+2}XnӴ+y}C+u0 wwSm <ɾUޜűxt)?t /jX:OI ל@~1ٜ'_,^ ;t!xb5W0Jl hU:͊8m ?98bڐnD88 yVDl[0jƒȓvp"YkK\Hظ U{_/vI^l]SĹ#~ĴQI|0K6v}UBPZ#j})e2zdM@'_AΖ<1(%M/eo_L6DXX 5KŪ{QDdN:UΖl^r#l%] kD7 \m{6b8"W2mxbImd=QXc@թ[p(K({1a7ٓkR۟Ra賔kGZ+I(q<?8A*r <@:GCK?ʼn\bhZF`.,~1[`;D?sd@_+'لPtCZz:6J#{ a!\|g6õz@Z ;:Ls"t 8H =Yg(c>u7&쯦?%gW~QHdhcH~jO FS9 |9[-u>I8ơJ}}<́ͽus\zN_,Ig ssDGdTY팴N&eɂ."~ZO}pX=>L |9[ICeVȽN1U^ +ܳU/ܜ00PY/l^A.0sE`ыaE$1UЈ"/ii#.7hs>\{rM)e8s[ /jw2 z䥀rՋMMD_(C![wnؗ7y!8_Bcl-u}-sOXPOmCz$FK^,+gs a%$^ !,%19TZ ̗HBF>V\bYV#Xb_ Le;{o}㟕gM1rb4\BEo[wm|##)bF:cmCzñf;}Śg+NtuV5b/UȤq{aϼ4ޏDsocB][ƃz}[We-N|JtgkkRXnJٷvn's(%u9RɜgpfiPNh=[%!ЭX`o}ϗ4+5wkikfu @mqoXQy{ |X 8O_VVɤx.B/,琚$^cb =Q-YۡՌx:BCCDךZK[?i\GI^elO N۪h?5{{ńP/ QmC3[=8 \I/r^OpS)k#zO 0^׌k#zߘ@hW'IFԊQRJnTMx E_>B&s:͇%S1s;^Sg5бA2#RȒFq)5̸~jS>(ȇ'^܋x=GOQl/f&UHkW,iцOf:tfNX^m[E7lb%!ŰB@o\t H9rRo1+_}#@m1_[=\~s `rLJm%%q\qSIN5P;C/jD's1x$VYl"s{v"˜b:k&,FU@6ފS\hjP'-UwaȽsa<&?ŞSD`a⭠w[k:*>/86ܴ\*_sŅb)aFcm8P(yUuU82m#OE@ZFG[?jz /jSBaI\|xA t;]q20 ~,ӃWacA=X?)mV1fs8c=8>d3pLp&bD] \Gb?8뜏ݔ@NE%sM_qj@3)׮QUoWizFae4ڵ!_L6m?BCsF wkX:2,#Ў)eF 9$I t#u@%?rC ]cϸMF WlY}x1܈a^l'sv~ M0 1e *Uc ',*xįomsSC۝i|.?EFp JSz*PuX:@~1ŊX׎Gwuz3[yᬏI8Y@{<$2Y;֗(kO;1j]aީ QPzQŝ]E /5\?#@a@7v\/&?,!#0^ 7#XѻmIʫ;2>kO1 ZTχ*rԏ˪QSZKP>XAܦ곮w 1drjaL,ӨvSmoUvd,ǞTP۟G EO_j~FjS>py5!_L6W1EbXX]&cCt#~٬eE6c$"@O8o[豌{TU j [EmR*yU쓬 b?>G5i-63C~-II>9mNKT}b}TXr?RwهnPuX:O)9[ ל@~1ٜ)_,R߼.rL*tb5P+_ֳ*"UD6PwoE*Эc[Xecɋ;8RTĵ%O<_/|v7|Ĺ#ĴQI|i},:L\T#@mJZF`.Pu?K/G_;}=gg \bj^F`&Y lcN.VsB_λl>y򤀄"!|ppW̳$sŰ:襫f \y"% DG΢EnMמF k?|^:rL3D[ڮz嵓7|DKF`PuK/{.R,׿ Pz@Ug='baIɅ/&'n0ҟQ߼&N #F@bEj藔ԩS5lf,u/x%do푋7p81#MBudop= [eN{/ҡ7t_EoUΪ=PQ $>pP98=_?.#0EwB᭢Hk0y|Bo}0Uߺ#@mJ؇r{YwSbrN]dr"Í2!@ҾyN4Dtn^")'لPtËS IDwQx xۻ"_}}zC 83|v!.Ҁ6>ȨS 5pT5>Ƣ}eJ#@__~ BAeDY.TV}ы [/߷ } gުv2qw$uN2nX"nW ǣr4%&%Nܘ|S~N͓ 7Lbxo^a~gQ/gc.VsE~A,fZc?~Lu{1WOI1_:6G.jFn!޸ԩv/lvكenACV=~Vo>E=?%-aI%#ɸ9cSr s|z.\byC`[ yj<3`-_u{#S& B5sA wX:k mG| *7jS>p͝s9~QN'?rxȞN ZS{<*y"eB>Fv ~M\P:"@ #j'U]%w3չ^Eq(S4$dQbϞεCYBH 1^`WR۟A (9[ ɚ$D 9pm/1yFBn}}< D/& 7LbH`b nn2XX 4s+.VUVte6jCocrz q֯.V1ֽ1 كgV~"a?EECղG~Kw$jCkGgp2*#q&''N% TNfMwm c Pj1+Dmt키50B%ۭvm1~As"QJ, jS>UNwnj&MK诒rJBLI=qOGܳ{j+x8NVy ܫKm &?!9[06|^VaDZK}2-\Aϑ>7%&Hȝ'gxYsĭ3\ yE`fu{m2tn *‰/,_wcV|HG*BN0W~ufoHXKBHLZZqvɇm ٣+]8|bQ(Je#=;<)CRQyȪIh> |Œ?%ÒDže_d:ƛ{$(yú~r"QZ ,jS>U{u^>O|Ix%N#ÐkJ/CFUcu jS> og/&7k^po7^ 7pj]bȰ\@;>|lfط(a14p^6w` ]Ç]Adsp>#u\Gm>cp/!_L6×b/4w+8%Ksbf)eFűX22Yٌ=1~QRK/ۇMEd3!F`b^xrv~YYL8uv\sG 1_9[QB8gDfsכ\+Wו߾2}#`?lxm2d&F F b;X͵EkOhYĎ)g$i$=;[P۟!| #0 E _j~Fjn#_L6,YBF`o&F w"wt#~٬eE6cY[YpĴOB#8XsGlcUȈFw}JLWւ(ԑNFӏ#U M˿ , a{ ^6$\SuC>^oq bGݐ;BWcمàt"cvLb{1qS3\Wʗ @ՠ?%C{ F`%$׎)e8Ag2_L6/cy򤀄"!|ppחg3H Ja8 \y"%UQZ䶄$t=QXe@cYu}b}HGmsYX该pDۊ?1 ˇd۠ͬґҖ~Ga7QjCkrz0/ꞕ_&GO0j}XtD&Rsq2ER,q,r,8"F`,1\.,y;U{Me(_N gK6kf1䟷PŁMTާz#udop= [e-Xto iFg}oΪ=PQ $>pPۭ8]YʱPظN7_HuSW!GC~9BS۟R!E'J&Q#3Eۇ Gƴ+97 A tk8ίM,Wl_=_ Q-'z[Z/3}i.VsE^=WO&N ?( ~WK٢- ܶשzU e XW m ė7PMxdԩAFf  j -"JWDzb:ñIZcG88ȫzNS۟-;q֯q k_b2Iw>X DN!$3}kuEH39?d\=> &$yÞbK%~&ĮϹMj!WF#O~M< .4ɢg!&j0nۢ#s~A,fZc?8:zUca:V=eрS۟cgm$Ek L2IW]\,p8LE5|Sk[cu"@m %.J*qw* |^vN&y 1}Q3>@ W/VnǸ0<qyߝXbz+b^O/pG|q/r^Op~M \N'̥Csy ~)򱡶?|nE.NA&%z;zFO/S#.Q~ߗ2hb'o=44xaW'"P;}H^h?\"SngOpsg:O3Ԓ_}SO$^xM?8-N_._u(?w̥EX^쥗E"k/_*s_u9U.{;,rQ~*싺\{;V],o/UP]\_v\=^^?rS߸"rU5*o\׫rC.7w!`yCT}uũSϋ;w&ퟝ2,{1;Gkc< ]\2xqAKuC#l6jЯbr1KCuipR5p%w425j;\BOx>ٽ$}yGg*˦ @zEBfS< }0AxVg?'KԁH 'ǘկd <5O>#^wE}/]y/DXs WrJ~gk`yA//Hܖ'>,z1-ɥǂ$&Vmfr4XUZjo`Pz@u?rGT¸Za,Vv<{}KX-qsWf ZhNHL&}r[:k_k#W(~4/va8(۾3 R*zZ)6JF^hw>4$kp|yE}Eݧ4 '}H,lq\HCEnMKňM+S}!ZϨ꧶?khp$:<= Jj.\D6 IٌƒP l<ٳْfxI|Lv*Yb^CsH+] ]I+&,#}"k;#uWd[=dOՅXH՜4&v&˴__G},/#*]}]<MlaΊuc.~)k.:m|(d !/1g3fz1w1܍z<7xHɭ2DH)8e u/uM')ۇ()iKO *MW6٬ge_}:.5CilN>>wDQ|Lv: rC6mG\r<@`QK\G5\oj֯r1K@|DLfx.[[}b.ƄlwrmG}oN w+7'.v;c$7Z'4Wll"1oKHmj[^\_ 2 'j}qIx,fQꥈPxr@_ZA|i@[C,ՋcP9<Oi0R%j4%P\&??ӱl lD>+_?'d2Pk7nW_|E|ׯ{iߐx䑟~zLPŋ! \H.V#57z5_C2!@mhq!Rڋs76'!^@:/1 ډ<{}u.,;'73F,]#cٶ>Q5/s?drLk@}X,>E Wfu>t8w&lfy*eH4_~C_7Ź 5|ҁ(٬K_[q=_'N'Ox1RpDr*֯QI?YW9:xdڱ0EF҃W@Q5a(jI&Cy!89mb}xgƈM5Ų R:j[J5i0\KpR E}ЉW٬_aa glDfE6[׮%sW8}ʵk$D6?=qd*/ҨfQFF wѪ+_*Ξ?\#IP۟A:Vp]XMR]dq㲢:cqcVĪv'QX8,7sKLW(_ ;'*\NXD6Jyl %P|j"٫Rg֎akB W'xLyN l.[?Ļmgwϊ"RsϋWIqW|D<,eRrwU J*nS5]^'>fߋ~%N_ѬL'ͪ[>)d+?[˯Jb{˯sA9pZsW.]9#(WEPسِʣG%?ēϼ,[ >WNg'c;?U͊p1F wݱ+_hVd3c&׳iP۟R㐘0 XtlX6jç9>1Ab0` \Ҩm?C,޳XrcѦ#).;#V]/lg&B^'aWlIa46!O:ols#|Wt33!? M47?Mrs|SlfyoM4+™f9|Yq9rE\ʍ2ֲ)u(xN }2}ug'qU ǞzQw_"ylӻC^%@b5>ѯ= f!; #!Aa^$'yc${܌_? l>'Cۃ ho[d"Q۟"a\W,ܽehcG_sfsIja1@~MK6+C.ni}ĀhE.vsM6z֥L،|=*nNd~rij͖P!YYΎlM<.7?q|٬CjF5|Loo,=uZ}|S/L~QaCnp4dlnEJjrYL(fTb8C% dI8u۴7x Zؓ2uP7*%Km*S?3S6l7T}].Vs5fy7Ø'OpV3$y6{^Vaoʛy&{ىbZz#7"%('> # y_FzD^>FPDl冶͈4ҶDw[ȫ=?ՎjVܵx.g [k7ΛU>1L~QzdM@-x:)NBƹS'"cE|2rtWSGODUy]_Ӓu@|_*D. {*b9Khc7EwPlxg?I&c8lMf3SjْګY^!=]XL/N*HS%u/z@ZʠhMt"_:mDm>FpL݊׮Dy!orj 0!UCT+y{':Ol?l;ꮦ0.u 'hy8?C +:NrSsuz*_)$Eḅ<̾tN Imwn'S lQ&Ι N)=m3AN8TK[^ӣ 0rkD7od*t!=eOW3g`]nfI8x̆}^Nlc38^U Y/kY୊3I4{Ws,A`+ eH Yꄀ^ l&'oq]Ĝ۰3 ճsEn5SPN;ہ͸'٢nvz6C J]郶O.9wlo}֖AzO>_s$޵;׈d3}S^r< g[\0 1a9/l0*%Ϳ/$iI2+f[g3.~fiE&TImMfC2۲U*.XͶ8:l9f"M,o!ie[ݼ.9ܴ5Pf 8CF>gfl2wt<fZc?8:zUi jS>pײZǭ A_q-0&o~9BBӖXLD ey&H7O6WDW1 "AZ /DBth;2}mS۟ap;M\5uReO* ^y!梧1 _Is} ulkɄԽn˭GrfD<3|F\8P嬸˕}qK0^߼1lVr7,^vP7/J~\)u(Xz0.VsD\-|Pk;ۻMyS۟RcnϯEc:`z/EupH jGt%bI+7Uxld4ב#A:>WD_?"K&o,꧶?t&٢ fl퇔O7 Zd "#uBM mIDkw믟k*ן\b\$3o\a.?3ٜ20y~%0lz>ls^qS Xβ "X舕n6GbjS>'#j'U]%w3"z\GĆ$ 'G 'bms44|GuRh$]="mE+ }P%g ԇݕWkIrB^NӞΣ8vMb[;ziu~1\li!488zѕk\vIe)WB =s4o^q68i6TrSj9WP1j'o'mC撉m2{9[sNoRI1$ Hlu+6'lxhH͑D~^sJ09xֽ8cd3|㪸&u]b^3lhy E w9\Ls]{S XQ=FcHu0@ jS>4nEMi|R bp_{%?&!NP:LĔ W[%Wi*7<7xc b4Kz<7V%#u\٨h|: %ۧ b}HV|EmdAT~jS>X(ls{yE}Ius@փyې:>&Q9ʽVӽxzK*ğ\bf&l&3K޼ mn]`'YϹ\rfsr{?ta ICM zYoH՞۠ wײ#W{@1h: w>/A W$bJs$P(Z(eWuo϶>: Ds ]1@'R <l@uB}>@]s W`OI^g%?)Շ\bf&l&C޼!'E:r+: ̛a݌@IO 0ZW90^"L]{Nd^0ί` $_N6[˵ödb9L@`NLNREw 8+4N{ME$GItZ_ا"f|ƮP۟+~Ey64y~H6_|f ˭_/ퟌgg"g~)ʹ.nUEr^-˫PNLy,/ȿ_\_(?˙K/ , l ._5c6J8q+c- lEXc&.V37ckr1yPZ@;~ꎠ&o:<>d}BkaIn35Q^Hi]TͲ.)%93X0$0SH !dy:2*j"[ν# P"f#.P"܁׈d3ŻG(Ѭ!d'o9$s!l~M;"^^rAlfoe!X kMuvogOukfV)eFڐI>=QQ/FU۞\ϯNUw'{69LrSjifE63(|M$i5 kMBϽ$k/g U5oCQ2&gwл8TM cW`mC}q/ZYot8K0)IU!5!{Ͻ,W0 ?*n:. NCmh I4?1YO0|xw8{6_׮Ry5r-QM,7o;T^&٘o2\1*`?c s!,ל?E|HtRX"愾5k7$jOUuG,?ɂ]U۩df8=(V$_m!o]˜ m͕W3{6b$@b5WJl6w$%ݚ+fH6Vvў IU5G1V;Ҧ*_zvczکƱ$cbl}(2_j/5\?#PjrA W/02709djYca4UX Yѐds$f&gcXG w+PtqW=fE(+Ί: bfWձt}b(ԑqcۊv9GG/As Vic]Z 77DYI w!8mu>Q޵팱P{XEnc&ab-RjCg1 P5s}tkC WF$/>aR 0 ثZf?Ɩ$]xl~U^،[M@?"9f3lydUo]Eͦl hU:͊Tl ?m kY:IKCZ"%COS2PU.Cldi"VMf>ÇBXd8]9>{aO|wcEmJ؇zPP/nhF gկgċܕkof>Ö* QlVI"=W aʻY:{6p@2{ŋ!8wki7λl>y򤀄"!|pp E=\q,Iosz;0α#_QlW{] M^0~!BP4 ihTCiH&ȍg>e7}Rg7jS> # :U>F1xPK(u6&Ou}|<5ZkxɞUvP5pEw3'I$I֙P#Jܘ 5jCoo9_ITꓔJ_|N. Hdi٤%);B׳\bfI>(WEP./]9)g\z^rA/W/\WʵK"].Lz.ӞFE 4:>LZMu}Wuݝ74nB\l{Lf>C~ E fpb>oشj}$rd/*KQ ,E4t 5a}qaX?/ AO`3º<,c1*Wrf&lBi\^q-QM,7o;\>yA;?%N8ᕱ6K_ BLc~TR5OJՓXeR"Uh~?62 VSlt&9tξP12P()Kvl0ȨڋlE8&zXP!ɀ/|ϻl]}sm'~Q#ZB#8]ה޲g@Ғ tS:0Ep5Vo%.&mJx^=/p>I]@~)LI՝qF3w~.7&"GC&Cq2//&lfL/b1LNEo'mGǽe5\T[ސ@rDSOx7jpm6cjuk\f#@mJz./~֘qB'l>)N\@Aކ\)b)+p$?7Ύ([@i> sl 'w?&g}0HnDKkG?a0gI0KV׭O4e-9b% ә.WL63dsےuxft^ oN)6YuMb,j]*ٜ+ǽޠ#@)bFJ?:/jJhg ; MQ,$"50|ljCk'^F%sDޫUEFs8|?63 Tx/aL /]];X=[ ׹*IH9yQpNo'6W%*J~1d3L6 / DF`TgMJ⍦οfno ,o]f)v9^\:?8+ʙ |P6pPW._3'NYh wI՝>#v[x{lYĦ>-6B͋כ>9J LJ#4SI+@z_1_=a\e8]"_ijRS@JC oI՝E;ХS۟a2 -iE?WF%*ʓYuJhgl&ͭ֊pߎ7g XeTU䒍lAeh?8+V_9׃E^|]$5:zI bFB/?<J1 mοN_/3IpwR問 a@4E _!pQdygt$߸xϽ>$o:FY͒ gIrU?&{$M~F۬~3?c81%|",͊Xa5*OTa6^$>xH~f&7׳lIXV8n]"XMuvogO5}%gٖ|B+r7I&uDs dɃbxfw^՜wa|U֯%k,M@}؄Y}L!_/?#T mѬ0&Fl~hb=!Yz6?\' xz>%V&m*'}H;&a%<+ًUfC6u(|ʼnsL~xT%F>RPG7b4=xPa~ s׉1֯1eUR3kG}X 5!_djϽ&&Uf}*6tF z<'X?Hfcg8A~lk" kglffld K X-͝-I@oIʫ;Շ~5;sqˠycw]'b/[_{ߏ:gG.CD~8杝WO^FǣUt?Ǽ;>t*L~QwaC npy͈xfpYq+"(G4pF"lγ\|!XMl gVCЪt"a$,3ՐZ5kHGKjBXqy"WOHd߻ۀϑ#5Y}^Oؑ{3Cof#}8bhKr'#/t=` r , OkBa熏G.iPnVO @#@_n|#0O) 0X\Z,4X~a׽rA%L6_qMr]nʍ7`!l߼bԆ@bVOi7λl>y򤀄"!|pp P{V" ]h(Kx0|& Q^u!P{}\㵫ԐcB ĨĕDz=Cn`nx0y1෗PhWwEz2Fn_ySU>5L~Qzt#@mNi\y23|U@.CYdsWo^".VsEfSqԩpdj쟘g3H\X#$p+RzV4EBX3еl\K2GdHxzdzDnF) Ɂ?@}L m2f<( Jde C/j={^HmJهpmPרF*+Y?:Ax,Yף$x pkI>]>c'WlffI2_D3ͣQ߼&Ƅe (*"o6R&N n?ƛrR{8&tWW{LG=1 dW3ua1kEv7٬OİHrfAiDz%'4d3` cyv6;_MmJڇ` PQϪKP-Hl=̣C+Fyր{m }Ak!FmJ؇_GILgU''0\ L63dsK}( o@bթ /.لS"Uh~?(|W~Wi$ x0yJ@wD*ÝȠjyMH#r4a_BL6 !&Mq q5ncKṫͯ~s:.jS>#W2#@_KHgNpPYx}"4#pV#-E^Q-+D6Yu=$^G&0h3HQ:0E0)w-H|]~,޴'ZS&'&sZom: I`!a~Ꞔ|j"Wlff&GGy`c= F wݱl%%[ZXޥ @mJY^9;O>udiC' 荐)񗯲/B/<ۉ`NvMvP,DAcQ俉f1 Dy[߃ OmJڇ %^LS3~"n:?'h뙶%eT*g/;9Y_47Zԙ.*_L63d3]l v7Mi(כK1\@zvo j2:6TbQ_ڎο7,?|]$\E NA҄ =B} ؓ,՞&B}5L{y[[3)B WyRJ {\q|;yL"{2/P 1>+IDAT'N *odC&÷a{R{B'sc{6蒀agթa&/0{$}4=d3L63ͺd\m=3x󪛋NMN% z|I9rr6LٜkY.F`P۟"aԘc%kKⱎɌ/ꮗ;ڭ2=G0H sԱJ ؊Pů\qdQɋɲǯ:dj3Mخ`%M"vvd]۩O P K^b~'K}l\ 1/PpX=)WK&߮HiCrVo74IȻL;rf&lfmARy͵e=h,r \TjY$#:}  ƚ9"2 S<ֱ0q=EuZ%?D^A0mC<5$QfI/C6$ 9"_L63d3$h7P2dM\.VcEQG&ENF`?%x1_%jZ BX2bN?6/N=H:?cjKT=%W2x%㤹(Qkq)$gty-:g/ʵM4aq )G}'RS!46gkVX c*I$rA/6ZO)`ѐXԄs`B}prԟ_L63d3dVi؛&fɺ@b5rUWz9ZG"F`?taWIk r&JmHӯNkL63d3ͤnțWRY XB؈ٜ\@O 0ZW<8R#Y rՌ8򂳙NJgzMN£U둜H kKqR%Kik,9lFgGZߧG[dBrf&lfm(#P Ū- lZYL8uv\sG 1_Z Kd Xŏ͋ v![jKN&?%\F6~A/uy 򳺜e}yW:P^WoZ~׭.g%y_^ewK9+鳯>5yOe8U^׹rVWrN[}ou)9T˿rN\]9/(5\pAO$>wĉ'2Qp,$ r+Ǩ~ M0 1e I Xf O~$1L*Tk3~W&^±%zw9s>8Nڞp~Q۟"L|>w u:10ﺨ\?#fۇ5[Չl>p cs`9#1f"XGwuz3[yCz8!wxfU"FEd;' D =}*hgp𸷊(ǥ";8͊NmC c9Nj E_]ds-oF`Pg Չlx =:/q*k_S‹a_)}(_;[ޒn͕W3$ws2aH(PPE$bbqoVt9ޯX=SN<+9B.!1,C2"l\Ax{tȏ^9՘z4.{1/m'ǩ #@S۟!W:FjaC};y#L>s WY^ "M~3O<?y6+BY͘pV$.'H*g!+-{BZ5yjHG jBXquWuf4dMΑ~ HP9䨉^MxVhƎ9*GH~!1*Ar4zF^~{*Y_e;~k  !\ S/mR%_?tK/ZF E+_j~FjS>ppy5!_L63^ʅ@~x/}@zS~YfK8Vٌd_U49?W&F`2#w<2!/}3A8ugkhsӕ Uu46#sŃUhd7Н&IuJ׶Ԡ޻wxX=|ݡf&~OmJKcͷAobcx ϋAa\ hqDݫ|292*1 Pz9K̉=WF%_&npE}UqyˑH,nj.DŭrAsX+ɞ}mCL4 D @=iv/'E0+YXO|q/A`9BmJ:lZ#@_%˻I&)] }4>Ҟc竈 9֩gXjCg&H9A(.us368y-@-O;*z-%R˜o? Os0Q!> {רd)tt?@6O[_W(}dry}è#E񓆘_J_PtNJ.y]-,PXu}C?5MuTd8 h>Ok@ѣGo~ 8=)gۖ}]/ hNvFKա.g9S+R}H6Zl2 zT4dt- Z* YAp*ع6'|1#ސL /w۹5*|⾗5޲xA퓽ԡ#SRG}5PTR|"Ut24)#rY Ɍcѯ0%g?3M N$רdsg_O(^{╗OS=%~b٬X_ٛ%=yB\ko}sگ>%\iua@8}\ea-^ mQ1̾2'i8^R bGz,NZʓb~Pz@q ⳶yto黦lkcJ_cTNK&a}ti#y,>5q}Zܦ_o:ynɋ=9#ԉƤE>$fۈ4cـ̠~jCk 6t||?v?rtZ OmJۇrӌds?ٜFy}@6'*ԈL`9G/x1dPjlyI0!@mhqW ;/#4O= !Yr-Pg?x91XtdO,^jWtNpcKD}X`B W c2caPϥ\ekx17͊lf™z"@mJ5^cQd3yNb&Gϊ䎆ǑMf}mZ#a"._q?l>M͜ԏ_b9o ?uמS0V9}Wj]£!TWc:h8x`:'! \FL'_}׆AX\ Yqr@h"dk} chcP3؍sZ]Z3kF}X᾵!_L6&f{f*kҧŰ/r|P>׎GwufD Y'똰 d7ܬtn~Hۨ.@rG=#rHOXA~bBNm7/wU }"@_Y:@~l?Ȥ/Qj*k_Ëa_)}(_;[ޒn͕W3$ws2aoQyirPMwbܓdw98ye3u~ب2C|]#$ror89^vJ]@G`=}MgK=JNS=Vuڶj4,{~IOmJ؇\jZ~_j~Fjn#_L6g3(<rŰ/r|P>׎8ګg"ٌ gEBor2&r4$z k2PtKeyEdMΑ~ _nӟ#G&`:cXB_~/ܣ}Ja旓ȷ+KNmJ؇0- E"42D=\?'_]Frf&ٳU־þ}S @=@_λl>y򤀄"!|ppg3H\X$p+RzVl/ MQ4Vm^ʱ| OL *ǰu>qԌ[ߕr5PhX~{2%b+`b羽])F`džu_~="6)8uhs;mr?!x ä6Zij ͓##s$:x.!x*WO*[$<\?ĒuWCRƻ^;s<\1a '_m;.;[[;UXڷK_ S`7RɲQkA q ,}-_PNE0+YX:ƑjS>P!@_mI&8m *}4c 'cgޟs4@{asNP} A5$LmroH—d 2_Ǿ 'ơ^<3rImk?Y"<IA~]kٵI;skVdޞ:'$,({h$e\JΎ,L6$\<U־.{1LTJUy',hh1A`Q~3rՌfQFyIAmJN060E8NA&ňX>OȧjnIybΈW 'cg U. }O!O/YOtpM'~QF&GzlS0v} <)pMXE:xD2 ז0ܛgj~%Ho^a*rDsMe=WQykGz1W?9Cg(Ro{lfsHfõN@lы4¿x! E#S{h$|-#tE=oıqLٱbw9G#qίMZ_b2)Bxh롛J􋎹Cx΋w>!qu@:cx "6*+0)it%Imë_R\*J6̖VYz3+Yy9ѣ>'޽eH%3߬V$f$P]J&I@G 'Zڷ/] ޤz Pbؑ < 6\}ϥ\?#f}"XEzD<؂ YqASYALX=٪D˴@5+LǾQWGq:_Ny 'c1L+]Mzge߉kJO&,w ?7^ sEا 5l2<$qܞCi;uӂWQ۟?2D|y6I_ cceE8'{{i͋54O4Re1{LK7]W3~QBϤ3X)J'w+ \*J60;;{2L a"f3YĞXM1}3:8t;`kY-\e^ "MCIR1ک^#tG$K͑ ^hxP+Te2wwN&x-Ƭ'h?m<\E[)l&"c \ٌ;=?8iЯ-I@oIʫ;Շ~ەa U1]ۨL@rl!"wp wթƽ+oܯTx|.\lL@P۟a|+#0*5X:@~%#K#}%Ű/r|P>׎8ګg"ٌ gEBo b U~f=BޯX;Qatmຄǰ8/3" ux"kv6z>5z4e};vR65N>tPs(~QwaC npyyxUW^ "MC ͖pVa5J'9F¢Kl亝>!j;9ئÓQ۟q@.+GJ/I}Gc }<@~1AajO؊hUdaZ8^r"/ ^ue%4@n F jy~}h ǰo/Z!~>%Ǽ&g"sTD?!K"FEݱRdr)bFM;VrfMX̿\byc\e þ=Ơ~N:u&-٬F4' 9" ܊/ MQ7I\Bt #d2$<=2="78SVׁQ3ڒ[ߕr5PhX~{2 v `,>l 5!)q ,EQ$4"p8%h=/Nlw2Ei z@ ||+-37yzjܖ_L6oʌ~\eہ/hk(@f[eXPLC_('لPtCvzI9F%Nb ]mӀv9bziPĉgbTx1`_<60Q1IV m/TuVx\1=L/Gرgs8)n䇻%_q&S:5jc֌<.'a$b/q/;8/"~(3A8y(GG{^'#=bɻ#&Ic95+YVɐ|I&]>벳%|A#Q5 a(&71]7F#5LzSPb fE4~P/V1 `7Q<$$L3;p7ĊĨmC&q9^I5 =\de W}qa==%''*Ԕ$=g7%@q6ɎYpjsn?~w1 G;q<2)nd8.kd %?RzaD1^S$G!O?b@+Ih  qy$6|>sR8|YAo˥᝘Iɥd3~.կd֎brVP%bpgOKV4GǬ|4*k_iNk2*,FGގ'ޔ&cJ ]-q4w6>O#~QK3TgēO<`s7kW?,C$ }@OH&t4;rƓ:8px³a~)4+,񓿃WNk%AxC|&b٩&fXM ܞOMjr8٬HfG4$G[uw3[B{dޓ"w怨2qaN+#Vg956mFR*k_NÅ1KZ ~o`EfmXI^m}RE/?*v?B?VsY% \O}2";90':7W*ǜp n%"n^Kս }*h^=$ P߄r[ޒ ,iA5 Yy4ĀhV -He7YMoYtlN|YT!ccFcVʤhe4gNI`7 MEƖDdqUW,y1zT6Osd0".K@z3k޲+y{v'4^}Gn3(/q(fE8sϪߥK"fQ1L2- OۂXNܞLؽvirL6cx|{+9 &!};%Ҩ|қYyggѣ>'¾k xפWU& Qս.kul2,3 hV*k_Ka&?u2ڄ Ϊɲ 77S${ zSXZ3kF`jK/ 0P0kAG֡3RK#ո^:G^>gf" t rkds E(+ɓb_o`*QWMBZ!81aS4do{C*^o<[h?*k_)y17_s?}>U|.bdϿ~q>&~CIgyNj}`M9z}go\u _Ef988$*{ds³>Ғk~"qNڃڭGguݍEþ}S @=PR1=dW0(m~ݟ,v(OGYdVO=Tw%tE`aӃ@~%m͑ +rm TLXbV#Yۄ?f8i2*k_x17͊lf™z"07u,qԟRRb9!@}h,S#_ 18УYfU; c6$TIl]:3fbV2Hq1hOlj\e&/}@zS~w`Jg #:n"D8j./tX~F`&Plf2,Frkd3gsQF \eͮ]ȋa_)}ׯ#T[wz3[y8rؗƘyķ~wZ(~pc]5fJ5"t1>1sA~}KOYF`}Pl7gG,f-ygs>p|%#05W.^ "MC ْtk!ټsX}Gx:F tNS^Н襸͡A`g5af@}0H"^>,rZ#!_E׉`y;!TX#ڷEO:gx@{5?~lV"1H[B=0 C;PP.npֽ m{ײyI@ +F`gC]c#@ }᫟`~%g" L@þ}S @=PBg%UX E@҉lVDm#+{GL{dXU{W#U{- .*H /bfA"Pb}01 " }᳚f+L~1ټS;>rEOZr0fJ gE0CYQ$1ά]omgEbbY_,a8r8^>YCusӅ&:"o@|XYpЮ1TrԹ @ |-s/&?܁#}ɋa_)}(_SN gK6kfy2F豌Zqֽ ڳً € Sb.\ٴ2S"Pd}g2i!VNo܍(%Ҧmc2)*F~1\xyF WY"˂}tP:M~2qM E@w1'  sw2|6x#pyFگ:y6z+~n<] @B7 ,z,pHKl_ߩ$%"S.dC'L`oOWJev)8KǩC/>4zZg2rMuxD'$Sc5skVd:&!=k_Mq|egkKJ?fվ"ѬBk.]"&M @fkM^@ 4p{Ŝx!k,wdg@y6ZcyrL^!,;;yX0yf0gujq~5}]^ M<#8Fs MCY݌%mFMʃ^YI$IH{W;DSFŒyD"s5+yoO[T=u4xK2.ngG&K+n\eCCDŌ>&"O-%T|)#B`W&FBn}L {ȾZr sA} (߹S;ї~Vz~j^ 5NSv>@St!mFKx+ǎXrocKTZMN I3=@q t)dJ Pb}Ljȉ}s!EJYolowwG~6 Am"Gy^SFPH== VO7yV%rPgsZP=)_}޼M$4;} N\tDk#[A>$A?r<!oc)l#)+c&(l#3RS!>-:P:\閽s(lڷ3[Ziσ>hgͬHf弳Swѣ>'޽]KeO 7{e@O6R#Ng͢IPdyxUc#}]b N],\&]vl;ƹz#eE?X3K?k#P2`GU϶93JJBbS$5Frlj&,$ڈ4ӡc j287u rdOal.m>eE!viggA6ǠV"O<)~#L`U*IcG^+"{]귮UxaG iD @ WYUzWno3(~Q#3t,!53c&qFt}7Gw3});+{yŽhWQYy0~4ɬk?ٜ\Љl8n#SU=¡;oI^d > :rEO/j~F:dfF}90AbOQl0XD2r(lh0&;lNx6S"ydI+q!9bJl91f%WE WYNja_)}(_*\;KYa,t10\seF g&#_ @AfE4"# w M.@:މ:&YGbT 8¬)G*LK|FU־}Ű/r|P>/K4+ gQ׊ZDžR20KGz}gA WfA6z6kQ{4ҰU>o|'S2T D,սAr,!Z/by/(\U־b9o ?u<fܹ0L=\XYp Pd}KYF`Pl>AXA<8qWp P*N3,6^0A8͌9C Ou*i]wݭc-UiLper^m/f "m}D`gJ-F`_7 Q/#0OǦ>Ξl}wB5"@fyf=}HЯ-I@oIʫ;Շ~)\0R.'@VKQ}H6s[J oL۟F!Pb}gF`_zQŇpaF`afޞ ÔeH^ yL2l\HPLVC_;hǏ{͊PVd3& uxCp I)h҄Kd4.8-ܭHnom }ȃ"SIouϹ{#$/K{/60ZV~ 1TՑ~.CK{ tӣ| #d"@g 1@oX~O?[FX*;w&ayroԋaͲMbB#CzS^Bg%UX E@҉ln <5lHSy򤀄"!٬rd(#}}ZxKadЊuwɺL,gDma;l; Ypz, NY (F%zE^S©_ߊ?ЭC:#`isO~X?A8Ǜy'NϦL6o,>. Ő~,ʸz3upcH@zI9S#^rk?5:=`4Et:j[{pGds]"dzڈ=kn't-|\V8>r ~0uDSO Je(Ookbg˳3W^> ~y.Uy/EX^_H\9d9&HR ٪HoYw[\7.>EbnIfEWL \-"%a}͔v%FZ#ZNSWׄ MJqkaf 1,Ӈ1g٬*EZ=k_Mq|egkK~y)Tɻ$Éc #U1Al"BL J~ _5)"O>{B/$*L6{3{:5=_>_r_/h&5!`G?'IhN=ΊlSĖ$eO ޒDK)ّ5 .fœ=~٬e  SvOH16&{Rɮ4L6kI޻k72R1]m}*!rN%C8f͊ qО5d3{6ȳْʆKI=.n}jBځzObb/,xv/{#q= N }2̍CN0C}]Bc蹠)LB au.y;;I?ZګqlƼN~fi^chN`uh;c~m,ԉ&aZUbŗwQYP%3+ 6$"5\úvŐn&/Ӥ u69m"uuD X]d^^ 9Q [mD0SxtBu6Sꎖ/>m^Ϋ;Oaz<+CgL619\hg{&oo/7nV_]=;dXG?'HX|{T߬ &.^ېvt9Rqt׷`w9"mu+M^4Ē|6P&h3z珦\_teS XL&ISb\3[8"^BVlNS1kH:e;v>{?O:*`is`~G\|'ۈfE-I@şա3l淽ml6D9?܉lKHsWr+'?E94P\\]u:um`^ i7;lVG)&0S .ܐXa7F7@+!mޒCoݵɰo]}u{\?#La>?!3l l#h{d2U,׮_|E|}P(٬H?<3" NFab.%qdf+/hOm(t>OlHJ1Qx%Q"N=c|S <ݳ~J}|zvqqEZ#mͯ̎{a?p 7Xw4rVxӋo7fs;CWuP_>^=RE/p*]:f&lH6+eH4_DO|SpP/{x\Ͻ~5M+PZG?Z^s{b H~<$ =#d2Po *Ϗ]f+n)xCjbIZcճ {Թwډۦg-ezDe"yUs@霟YʣY%TDJh gE*+o7Moz8|*sgs:w/*>~S'62oϢ1`W|~/ |5bQ5jۤյ>m#6g5IReaGy3f_6bȫC!G7^RH]u$/^ᆵFO ]Ij_aa gl+l=^[ًprSdw}^ZI)?Gr2GE{]?9O„uR]tq7^0/'S4ą}ƻ1G*nS  ԱrG/l@afYu[̊hՂW' cs 6,8mFP U㿐7Nf5*Ƭ~Qg֌yΝĀiO֞~/w7'x,ɿʹE]IWī~GR&%׫O _L ⵪#{8}W\WAyfU&Bf;s&^sWOx/}^k5=H6?)ϛkI ):߉ڣOgđ"U,e$&s;"3U!\9?ձ t%L%kY'36ZC.B9qܞ$'K=.Tv K0 &LCp;8LF=k#юm|LlB`dsPV"a`c)!0~-Zpoq|,wOv%[Wi݀]R-q~1,Y1fXf7#\폵nq!o ґgK? VMxh YL6 W(WŪ\^r.RL| ̙l>{x}]$/^*{u_{Yd#=Kn}l۞N6vK\#@3Œ#Ў@QYy0~T1E2N6z<ϩcZFřkɋHl=8i1Ő7<{IRld]N#tGF6+C`^lg&߸.TQ1m "]_kl>lwE-tGPop;ar+Bz}_TF d #UQ?w/ď{l%c1Ҟ(!l*^& 窦NN):f"f+^ y QjxJ%̄3(skEF6[[h<&$FUn: o?{a4g⓷#:tFNB|UdxĆѸ&.!58Ɯ=|@?[qxj~Wj¹O/ƜZ }]g 0 =ܟln%MY*3)w b /2@훸9g; n`)lb^ yةSj|7fѪt0L=\?暠MW?6 -[~-2$AWdx1H ^t"f7^|AlxT[y{L6˰s&\V/X<{q|S7Ff9χYs:C0`ԳӧOmc BP`FF ixHHRI*OyGdޙ{3skvE˕w^qu_~|h`@Nq^i@'f64GlmfGnD7!ʓaϿ4 myM@kfśsEzY ^ /*oibDWNvƭA@zil%r'\& '0 &qz[:RY{3^s&䲗'@?pg"w|Ex[j F @HMeiEU?dPw|4" AM}Bd~eZ*7ՙ楥e"c™Hktk\ƃ2KyB 6:h/'.@6 q@j1ghWƭA։ =4F6gws|uב;ٟWwgs!Mzi7^w`fF.C4:e4 ftJ B@F==LD@SE6Y $P<&@NL[b]`HU\6<_b0wⰼTaY~{`Ibe^>.C`wk! =T#1'?FFC{6wT: gYg FΦ[fC͕d48fSͶlM6i6v3<{|5St~Ξn@l5T LJ^=<#H/ma7,gǨK?Ȏܻk69rDq™fN6U /Kyg:\/b]2ͅtBglɂnً+*K.^TҹKT._?3MtFjm˫jͥߋ%yM " d4`?7 ' Q\ .d# ʒa%xh9Y"oec/VƗ3ٓƫ\Oʻ9 QE^zOd3fK:l>xItP7Xx+; eY}U\)B,/yo7~֕垗ޛ9sj#Qp5q/59PeJ1(?o.?.OQ솁2`ƠPy{iM!6ICry$:mI~q.9u6ӛAz}^3 KW.awydsqBGSd3ɽ^7o.hs@+Bˢ#@LD3Ik_f Xp\__ 9(͆eFu8N=Reen^\:ý}b̅vpf A6יmpS mT}\%O.TWvԹH~aUT';$D 0k"ϩ"< >ҋ.--D(ep^%Rpѐ@nxHcđt~vBOwa:{JziESs1tJei]ch:3<]|VҚ>.^^1\9s*dAZ5ekY.+U*]vY K׮_VyUK7k.]uM7O7gƍ:Z|>unlLD}IC(πb&byLnpʂgD?fz 7>#^]h}/^Ko(L;O5}ub1uSLsd5I=x>& /QŤ_Y/k.`[HEM{1_/>/e/MWmR/ ~YF/˪Kj_V ~ {Ys.[z~js}~f >?>6DiǶuLв(lBL˯KaеA_} 46%qau0A $rY$=}(Tc$4*_z}]% }յO͆UZm 72_ߏM䚛zC<ݒ19~R YR7}WdM4;{7ӳ~w﩯}{ީ5%]k'ڵ+y"׀g@z1lXوfh&izm΍,zz%$t.3“AE!L~l{|IiF@zl~k_SO=NH_o{gM"l+bX6^O/_W6}]ݻEuQ}C$6l{%j[sy^/|<fͲoW=uKTV3&bH r\W}mqKn{=]'qF&HDͺy&)l_n6U>ʓHdKk&{ŋO>] v^>$ߪvj-MgՖ;IԶj!N?dX[@@Ɨ4(! =L6k^6Oi~d4!::9Y_sNB|go s$}ݦ{ԛNJ黴w $Ȼ|³YnB@ F@z}ts4 9 V\cKd3=++{T+W*MAkkA-< &&Mn@6)EO lnf dm9vaۯ3潤l4Cmg% ^ 4|ulxU͙$<,77d C@z}Q0@h>3>>{ds IdU!yNUI3Q}Bcr:~:|`yټQm٪I?DpfMKz16lD@[4t7Q>JiB@'$I*# #-1l&r9 h@y*Ct L;e$3@6Cfh#&0/u@^._~pzC_WX9$_R8o4J6!7w^S:+jz՗ioTv/hs5g2ԆΔu^Ϛd oT/kLF}[['ŰM2ltF_ѬжƗ'l,}Q" =H'IFcn^t2t)z0Nd4ƭ wZ% A6O댈~A@z}'uiC4lu9|EͿ}C?]XsW?פsʳf=?QQyʿ<^MZz?{rlI֤td`^7\lf:qdNÐLwVɓӎb6= z"/v* jѦgȆ ˂Gw(C# Dy(XNr[jd/Է|-?PEKg{I K<"?=OIc˭gNJ#spC) Kӗ1rYIC^C8Q̽O戨͙1pN$בA¨mXcIPo2ĺb 63 ::.vZTˋj׮]G3̞hp6]$apB9^+P%O5Fh4Ik6nK'^ft(AZ>f7s2$PSܳ9h A6l| @^;Z|>lP΂ZCu[17~z3:ÎOiK/ {RO1ҹfj9T~^?ί\ֿv3MtFjm%aͥ&.~M[VMϫ`~AuiЕ *)v˻zʵkƣPたw@}ϩo?l~#ߟD8>ͣ$tvޛyw`jd3S͒&~@Yh$6&CҎumҋ<us2Ͽt_󚀞nΫ͋7їU?ԎCf.yryƫʘS~+y)۱Y-.=Y~ol (eۑ|sauUo*@6Pi'JüFVe(]ӿtOŔ, D^x-{!E& GY_F6*+EߩfSy˓%]"?67ԹK\ .\@4$ٜ>&ӦM$yny9dԗSh^tE3zjٜZS"d@ 4L6R hXhCbr N(CRr Z h(ӏ/:sռx6LdsL8 =|.Dm&SLb8'mee^ʖD</dFX.cw_cD!=]%b /]aOc Ohr{6 '!Э|WMt-5&ٜb*;6ټS9wzVKx/3f d9/mƋ콝]&O_}/YLbgsl>zhavl>Oo\3Y /d429w^sxm#&S==pz| S/ \/޳$A4ZdsF:zxyŰY$/Cx@=U[FB:'/) QS.DA# =l 90ͯ:HgT!|ܬow )zhlitzb.q:{q?>ټn[==tiCok錷ՃFbz8T zq~){zѐ/LB~;$7%./,ԕkXZ?鲺z%}ZKN.qWO|{ji]a2)]#r 14>Z 'mxC˂pG}Ͽ4 ds598L3'׫u;]8{u$ۘ{"GĞϼo^C:djh!" =l dsݩs]Đ>lHI<L3jB絮&= Mړ 0k6k^3xepdsA3Dٓwz:Lyӷ> 6+}в[s<ϺTٳ9kkf"IJyCHYF.ozh&9Nk \JcKl~.K?l%4fF0wl^|U|?<:zhS'GHm& tSs=p%Y ^f]:Tnz1C-$<0ZƠ4dsy?Ξl6^4*,<ӌ$6ͱDDG$˟cޙƎ`*+Nv%zxy3.Y8^B@h6CkN+{sE{>̳vC:^ͷ?j9#tx6SȻyӷ3oνtd֝h޷'nΉf"+:@lz͙sD" |Fe=iOkˇd3030PnyZW{^zoTKX%Apcv.~jeuN 7'AhfM0@O*z,apŮ.`fmج!b1WH?lg3<\>϶ȑ"*iU!~`G*r">uKjEm7R'5Vy᫉mr]ZXŶ\ Sֲ{ƝJkZ~ >l%q'oJj !?=uä8nUOWx˓wXl%54!xoS !C C#x6kylΥ4<ټE>H ;FdҸ.$5ny0o羼[k7;ҹd?ir5_"w|Ex[j [&[ϻwb('GSd3 | Gَf*XeYёVgd[W1_#gklFLD3IkS@ E@zl^~ePI4고Ac6H{@ ɧ5|3z-$ A6יog5cĎ)#&T'*yUuSQn3[`6&ѠV4OɺW ޻Y[z^G6F?ky!2~?uUuKp槍\i2;٬;f[VySړ9ɥ4R_vr[hK8wO8kᬵ/8/g6IhNsL6s/g|x4vUf"MT ?N9d,tړZ zKKKg3>x'>_ce1iƔݭ_{0aü.c[]]țD@mY-y5.B[pgT3>9/dXOPOh w63_>}?W;D3<4 #S_7ն[6mNsE J=yByǴ*O/Wo٤>.^ɒ>Q\ !~V^q*d46#ɭƔn ;W89ZSf&$`7uX~Y B=Ƭl!Kb.᧿`pI( 2]=k&f;B}{c>m$62m$\;C.7sF8jg 1[B{DٟB}3gwf/K\2;՝$QSFÐz}ML:H`F@4t~nTu~fߡƥDi&GG2`~sq˟ɓ׮_SN]Rq"D4kOgx6Ã2=&Nr ym)\x|nǻxȿ#<%cc>&Vˎ] KwWeT(g֪?? ܫqM A4/D6k2ٽwIo6mdg^yd>X`frwwpf(]ӿtOdHf 1ޭR8PƊϽ3f3`F3^9fTqsX*PbFT[WH?ҽmeTO( OUwI嗳}KƳ\l&MGfvco̓l%Ά_uO̳/羨=,Xm4Gk+sM36Ho%ԝnA"JGkwD/[SD i#P]"zS>P<}G;yI}IG'mGd˺n_Dcj/f_x56<_]㤏Z1["ڭѮ7뻰9R | @L6D )yDrOۘDNo\dGi0NaС0\6f @2bcUFa15]YONn.H O19{7 {|yR|Ғ'=҇Lܘ*x=cdR`0Q Ž*tF^#l/~}n=SlTlѣGoxAU'ZRhhDBs2(?j6٬ _3裵6m6Gkvdnvz:xڨsϧgӻmPz#z=E2D6z=(&xy7~㝚x/'F6FwT# "u=[_Jh㵷<|Hh-_Kפn6GkL$3D s͓ZSÜ/9c4}:o)u )ЍlIkD_sY q$:~r 沺k;2x`MՕdTnó^Fds=j^sWs`,j>Z XWVV <<ɀ#+2VCJ4FO`52 1=@H?[0^^Fk5@˨lDsd۴WXpD.[og/H;g[>@4φl~;v=F6k}1[ٸ^IoMBۗwϴb!MJ"z:^h7Gd "d"ՓΣv#^ѼR@2zKCf\B6F\P2)?=GMVqzI{8óY~ks}~&lc+$ Z焑HTr'˂ԕ2K Ih_>%f<&t*m-{6wܑk|m?i6Khln{@@`bvD0G3IkwMmRmJ iG@zl&{4{m>(`<ΟDedIV 3ҞRg^$Q,I6kmNj:6S$Q(ټ[MY_~2^Ƿ8mdZ; 1 ȵ{\: $*?[N2X“Wo%r BYlc0u'i75ҩ $\\ҰKh2Yz캞Jm22YYZx5|]\Lt"7a& pS"F &hT6!&N;B@՘22n. ϗ(tm/˨  fM6zQΎla@p>K^36_H& %m[lnyjk}oۨL][ߗ|667~M-E,ƏK6HaN2 "_UPf'slΦwsEY`2 Z$ٜdc14jLhN]jyyQڵK=c&fDx3O*mKZG^r HZ)>p C_V^F+}[Q =l.zZ:d^͇ͭ7A2e4y5[{9烈%[xIfhLzZje}t'QR?œG4SN42YM\ųIMJSߏfɠw3fd5&yM@7jś"V2v<Ð]=|6lm1ŰN 0 X]eTz3(٨,֛l97[GzD1RqQ@6W?b*y6[OgK6gIl&fٜs<)E~}tP:UubD3gR6lڙI_ͫ^BHd u/7G/ܚ_Oir&F6ovy5 j7cØ +'Z2Cg>mu?է̿n#u{Mw;ih#LJ2ʵ*Oׯ("A6Eu+ƫyii)l&Bp&z3}YM{\]*h83y=:8}n3jf׌w韷u#Iof3:ߝ٬7?CZB]Q C,n-eqV& n ɿL{™d5Tl6lg@; T-0"9uT%W\B3 <H y3렾{y_gnt7W2y49Lm dl6Iy d۽3\^<`E,ȯ#)Ƈ  ٭l1+/\ȑ#D0sy}}Fĕpړę'.7sNBrڀHNKd/m:q=JyqI)RޭܓZ 1[]]mzixml3v~z348.l,Ҧ#l7=ڥ7A>^ iƫ.6VGz:Ϩdg??*Ζl} `~B|@{?mGi^H0yxwi:lt [}BN B32 Ll_ x8;l3ydk:Pv2I ܚ2ِ˗73%M2fx676?~<#=lHNd+čP92Y[>~ח,kMy+y6GmJg'IHq.b8iؼ}pG}Ͽ4 /›KE79y[܀-t :wO$;_6|>ϸd39api2:>2Puoh#֟"M̢N>}tv֘g;^LtzFټyCݹUxjM})'ӝ9{۳yPJ%$JiLh:HdefH.h|tJi}gTYL٬I@6ܯ5r4켛 i^h&iz8=xb:& #[;[6Ŀ$zjE;^sHm6r ={o):B#򗖓i93l~]ܓZ py?ld!K\dwFhr, IY{@u]Y=Lsr9\߽Sٜi5{f72YdV:&p,ZKe%f2m(SJc@Lb2\~EYQ ߋ|x#߯<x2/UZ<@`:b8Ill&:&N ('՛Ԝ* Štfĺ Sp/ Q蛱|#3a7j䛭.H5ywXÌ_髻\$)*=F\Sl_Ff3'G&AtR$9l@6UkWtQ|D:.ߋiʚUKtE-M"mMv8ƶӧ btTQs\(eD{N8ly*2t Z:ד]ZZ qfLDd3`Bl~^k2; K>['"9To=$ϐ0 v!RhLrn['e?!cۻcg#7yKl 6rI>tu}l=̉fw]> Z '5 g R=Y)٘PƓ9 9dt333@ܸ+]?ݩ'yK~ {n9@@zl>q}-`h* :ltm[hٲ[nfs|zdsG_ukhd:ͮ| Pk3WߍN3 x64U7f?b26nvB)w(H%mmZ P[H~0{?Z.vK<]]A6lN^3d:C r L`&S`n?oVO A]23Թmg;2ou d{!Ͽ4mJ YA@zlƗXϑRd3OfD Olny"]߅qGFھ,_0 +]; 0|K!8yȎ#$tC;wh6_XL]X?HZ|,͝~ &NǤ% gO6f1҇h]QN?u(ȍᔇa[r,aHu"_/ҭG@`@6$Qz5ms~lu܍y9e=`6xlڜQ`եr< ,]Tg7#`}  DLKh<Z '3VVV <3Ȁރ{H vlH: \bLO l [AQb`^g/~;˨tP>͌lI>$A6#@`6I'\x#SI۴pm~wl=yHAÄL A6lă @bV`&f֨m^1q#MG # ;rt/4y\-Mys;ts-ʐc-<tI?|Z\G@z ҕҕ ɴ~E>ifjgsw樶g;ξ4 StpKl؞w5xP'󃖴@w_.@q|:`SS`Jq` d>q"94dC'wh0.[]]j\#Fn7VI?ش2*?d3f/s )sZ~3G%#K8gu1Uw'4ANDHm>Śԃ~V{Nm}iU]|.O/mQsw??%:wz1Tnc3ds͙D6p I-S - ҩ61Ͽ4:xF9 A6lP2etu}'N ɟI@8͏羠v'ϚLv+~cG8WlfO:%?Ulz jCohY&1}j-d368{mTzGX~6 w߽Im?L3f>~u*ST+/:&آM -Z ;H?(>NEӎd3/]g\߻ @W&_o-ׯs5d4~ hV&fy6?!M KL7<͈<_bhڰ7ߦ1Rn ޷MVomMݹfuAaJճdN6[9h6^ήw? ն[6y淵3{7͗^[̳9my[;g[nyP^|Mꖇ߳Y?+ow@6]Ӻ=Nk,]ȫͥӢZ^^TvR>彙=<̵@`& [{A*kl0K#gi4hka ն3foMDQDZ/6Jdb(z C@uïne'@6l y< <]Y+'"sQ?6r-s#y7CBsI2`^o>y5w׏ٰ͚5uZk7?sלڸn3sDB;Ys 6qք{ƭ;szH9M@Z<G퐖^͑ZcˋڻYЛzhڤI UU'ae4jx&l~E/) d-]Ҥ3/}yNL?,0yM@kfśښA Y\"+sAb״vC{2<à:o_yn`]*}gx&cR:@ M)k+ds'J6* 6F w,iSasu *Y'x! A6l2!"k6s mW ,'\^RI켛g[.Hg< vL1#g,HSڻ^IoMB4d;g"V|<zUF^TdBA'4fƼ1[]]$\>H?Ҹɑ-oObX;ٶMײMa\)Mݲb`'czXXH? A6l<ʼ yp Ndztqi5}rz )_?Adz.H tuf|&}rD!}¿̳:f Xnds4!3,@ s1_Y.ifHhxds+-Vg=򇽤C"?&]Ae嚗g7(?h%sRݾ09T/@e2cUVObC/Ab& ٜBXit9mK+o*/0Q42_fN$6*\ MzIb{ln5'5?k O7O{![ΘZ"Ocf vunie}o~v14xA1YT]$xۇ8b rG0f#tuUhijHiDq 9tR\ޛΥN;0|ǿ(+_ę-YQשfN ؔMm&/l^ز|#m:ڜɥ1X@[ѩsōϡ^j+g叏d3f3lv$"Gnm{:rc׮+q*8CN"PO]ؐ|l3kׯ),<ǟiP^U.j&ϤfZ[)")g.^%^5­N,p7IMؑYYÌ LuN_6f'7"dQ>d3f,K9i)\c046Ϳ u Ov|lKrd1ï;`d%?I:BoR sSsߎ6lky"S)l~A@po9c0ml:I oݙ Қηܫ޽߱4٬,l5y 3&&6Y'x6|[2^5s#^y3ֿC3;Ϗ㗕q :ݜռϿ4m_~El>Zf\" =j߾}H`*i:/O~*i""6xr3,S)"WDS&:bH(1$++=d夞YgR;=lYZ?M, %)=n#?7D6G7M@pM~ Y]ڮ(#ֽKBMI|˗F=fΣ?dtna+u GV&_Uf"N&K}ky6-qӷ3oveߦYԝ[oޫ9'پ!{!x6%M@tO8]VWt5oLlLj1wl``& C!p^ `w%N zL4kz[s+ix,o2H/yJv}SfMlgs* 3eQWuB[<] qEvy$p[c/=T%[gncno>9u s*d3Q~Nh`>,hK?U1j>ͣ"@H? A6lkh# @`H?]heT(L3OA;|Ǘ܄]I{)[LcH?'ξ3P+}]=>n5l&dxdzҐΔ|֑0ͤ7Ԓ{>4gy n^hkD3 '?I 0p2A-@H-fl+G@zJ6_vU]'ڵ+y KD\ߥ# =J6)g,̓!}2dMƳ9Rֳ9N_>e̤'L.ez.@ 3x2KF'lviҧ*]:viNm38i 2YYRg?>gꑇdUhZYlu1"M0E@8W[7& w6~Qle}dD36c0ʟf矪dKk&ŋO>] vl~Dy_T|VmS=_TԶjۡ:u#4Kznjk}}Km^[ f"A6[fh6'fvQ-//]vG}̴@{y,™QD,gٜE5A  \ 0jLhB]I/鉭]S(rf{5lFN&jdMe&F}[ET;D=.:V"+: _m$sv]$u6nSl1ʙb8Fq)C@k+X~}ތ5( ,t>7Uk(1 B@zJ6;:{:}:jqu!uyڲU? Q-IFK/yC~}d+ե+DZ"_Oڣ\2-́WWRL21L$Mf"ill1{ҾCۀ)wM`/ޡ_1b;GW)sy ۲yeObdCycb=.;u]v#cžb8/ƾH~>U=ۘwpoj=YdbLkQ hK[[f_w*co[TFZml.H?U>8?:k}Q~E[^Ro@y!;;C vΎZ #3ek׳&e2Gz?prƖQ,I7QXߥ =l ǚe$A4zds$rӓ>J"^2]91[x#`Gle.@&r2ib]Pdeא֚7^k 6ǙWe0QԶaX'N+F@ݠȽNb3vf"ް3#xcʆnZm4\6V7l0|}rH?U}{+zy7i_!d%3RXәFVy9ߜsѳ@eDL; CB39CV fb`+њ͌Ͽ4m6;TlSϛnMA FZSweMrAC! =T!;P.K"ʂkc'q޳98f Ҙ:2b;TMK}4i<_WV~~ B@z ds/ifլ+/iЙgp7oD/¹TR+:~/8^Tv|] _D>sȳx{eAvYR*?ccfb8f3k_ esuuv`~}ތM[#|Slsԡ]iC7'o8ICnD͕(^~ QH?Uш-\B+/Io&6]M6tK7(&hqCfk*֜`'B?2ϤDƺd-H< RdHx0B^3A| 0+H? A6wldwa9`ڇv/KfF6x}6y, Gr3S] S@B#>|d3f Ǚp-Z 'V izٓƫY+kcIi8o+ה{6;qޑڇFB@Q5.}d@6f͒dn˖_| ZSC^nOG`Eru* 0Nw1Y0n#jwf'>%OI|}2H? A6l< 1b8FGteeN> ?l. Y@82Y@$Lmwo8J?㴭ʵmVi 0d3’_[hߓv`#s(fuN^N_DuB}wK[/\6##a%`JH? A6l\i2B& &Z #L>^'-<$7y0XhjF)~oeTo(L;f͒dn˖_SG܎${}<0i:͘] 0X6}TηCKza}/y7`AM;\>E1_I?(.f l] .ZwA~ & 4r~meT(L3f]'%'=&| 燃}!z_S@êL3JSn%RL.lcQ:)wyQcyTp$~jObxd'#`PBH?6lF?;a8kx ոB@z 넰dEu+ƫyii)l&Bp&zZh4_,PDe۾Ch)RwM`/rm"ؚȾy^Fu߱ؔc!(+xrHws8ƸuY ǬYt`.vq4%No_w[Gk=%e:XGm!Qu@@>C>}UMtz>QlV #??$m|3][lԘk[pm]{گL6blov 6}`\v>]o+WS(O/s.IlR@2\>yfO8Д)+"?QlII_k pKr!Ic8&lݵXԾ\"p3=cXʦm˂i=^bf_%龗^}`6<*rnH?}hc|5w'`ouɉpJo6k`t<(}?Ql! =›Qq]q*`Dr}IC͙ѶΚVMFXcj%ɏ_| 0H?Uf"}Rd , T_ sf| g"9ټ^qLiZF_ sY9!<ܨmNk(3oD@x}\vz%< tcU|\ZVu4ˣ"&/5?C,65lZP(faq$85}Cfo +}/>6*lzKk:8(0Ǘt}B@`V׮]Uׯ~v튺tx$Q6gg\>?~<#=lʟt@FqR9ve*qa9${̺喖{ r'%8dFaOI祅UMkXFQ\'K#jObO囚!6ZUF떾( lFdm0b7@sOI۷4^t"hL.3tsÓ|L.(ʛDWmTr1B 0*|ҚI/^Pg?Uw%d;j-zl~~-Ϫ-swk]*ڶQm;Tn"|,4L-Vg]ˁyesɑbfs` HՔ+#\m\^n2RxPF aL:5_^-iP3}Bcr:~:|`yټQm٪I?Dpf$^ݟB 0:U5˲6u<\H?=_==`s57\ \\xs6?7o<2 'Gho&ʟ9矶&dh O ?64[FF!뉱`N*ŧy_W /;Ss]KW~K5$R`#ߌec,^(=T%?z;FxoyIKm7r@*; e49RFjg`׺sgMeph7ϗ~&>R-X(n d,ξs:XGm\lYsx6' F ˴:/4iP>0OXQ%ނqFReRG̉ D3h+x7!I r}j Nz|I۬OC7>Ƕ7H/i A28NALpA.]߬e%i͛KHNe/]=(('z:O/cD/,| 0+H?'i@ YyfK6ocs$9yy!'kslA6C;;05Mɶd%V|AGLʗͣy$tvޛyw`jd3S͒&߁,d4EBW_ 5/53@:*4Ʋp"HsTC">7*N_ѬP%zfl?_{%SFNI$%-y͉B@0'liIҠGwg2ds(X*xAs mf. eHjL=oT_ 2#3@:*@ryP^iK/LdfbI?ik|I Y@@z0 OXFیle ,]}6s4B!3tLU$27opFw;$$YKxGh*=GwgRdy"c]wvr <@`JF##K{. <@` ix5\u|l̔*Ue,S{ PdPM֠˃ Bb~ZnKns|I iG@z0O7%~w<#3ȎNL̉~. Ɂ.˂m&.˃z  cK?rdt-&% [˳$6TѦLmbQu# 7ĶǗtP>fo_m_A\?H? Awl_yvv,ϗ#Pu Au/"Ɨ4(! =`~w(H/i0~F@@d3fI2eW_&=Ld3g%@:j+a,Ͽt_،(ڜޡG@z|I#+0rH? A6wl_]yYYԢM#C#ؖMt\6 $UϨs(PܰY`Qۑ.CkPiǿ_o%XibTVcyTp$~fE@QwKm_龡| 0H? A6K]/ټծ]ԣ>f>g}O>Bllجg%^d$JTGN;6<נ:o:*qyKvUW/U :X+cyTp$~jr3V :fTj+/fd3’::B6yM@7jś"iLi7l6ZnkyH6Iu)ێ4垳TGg)sǂg(+mˡN]WÕo];` GS0i:_bdĉ(2lRΪ^ynˣ"&/%kW`o~\p#.$ $]~|bI₨7;wU.# = tGn&=leJw A@z YzUWd:sռx6LdsL8 =|i2"HGS%3r{1[;5+ǽ\fo%ωnwmbNzK%r {&uͮ^~{ 1q ,r2˾O _Km(k[H["&ur:XkiO8Д%^JoJh^!q^rB2&p-̽Mӓ_K/2ҾN a4,Ҷ/M,.F"#3Wuj.X9\7 >ȍ6c#4,UH>OkN Mߌqҟғ5n&=G+_zM xgxӝ!ak?rI&Km_>| 0+H?fIB?ST_ j| g"9ټ^'qb0":͑s.SpXN.ɑԊrcj--gRR`бhOl.1eW*73> bEޱٺNFSv| oFkF;7}&`j~ 8 |T8kUYY& { _#es{qA ^!x@іz-zrAxSs/46ixrמ 4c˱?L_q 2螅 }GԬ^Pu*>mlƦ6 <:.ヒJ'[l0^DXQOD03d'kOH?(.OøQiIX:-<ʥ9J7pxi O|~%݃6o=;(gX0!K(S׊S&8Ft2H?fT󃹕%A8C?Z/) :XGEOn1DPcPl;εG5\K%ɍ/閣| 矶燑7J3Mm"ͶyIrˮIa! = ^ҍ~.sGY ~C.qr\͐m{3LyƆw}T͛ţ0WLP6*8iU4kq ߠjA)5:@6YUu./+բ]d|x3{$J:'*Dg^P@uڅ 71 =`~z⠜Rq_㴭ʵm|=/S@;lO2KyЁ<2ܟ  i[o&eAjlrM)1q#ԯDi TiBI# =،jd~惒I9G&4:@67<5:Xke[ E#fwuPt̛*^Tqgǩ뤟(;[l# =`~hZPTH,Jv ϑEtUA5=͉g af[zܹ#?Pvm$e0o|1,3W{Ee<ʒH?(Gv~HwͨF;D8ؼIǃw/}h:XGh!E|a,ّdE >Q^'7bim/~| 0 H?f)B_ȷ5~Sv2 v>B2ɥ<ъNey{>tKmH& d2Jdd8H_ Gv~ތjj~( "lr]Zw@Ul޷ vh-oy~u 5!pp+ P !4'tMXu6WW1A@_0?I@;%_me9~Ƿ{jV;܅9f=]~'+zCL"y8`(\JO[C#Q5燪ASg~V_c?ӌZC׿ZR7sl&PGPi?Z•sG}0[{K*Xuݾ=m]}B@zЧmmt{Ͼ'$Ef{7 j2bI盳g^.͛˙)\vu!Ri"_ c679 ~?N<|~D|ĝE]@D6[=]gzߟZµ !Pu*hm]}A@zЗ'@@z|I+0rH?moFaLp}>G=F֯~2f)#jPhT]F+]6MlX^\VE @` ڜvK=C@z|IÁ+0rH?J>UWe~B #H_ÍacP .VU7Rd[D6pnVD@zik~[ͨ|;e%6ǯtP>v:*Tكܣ>hWWJl>zh5"6% @b%Pu#E2!O-¹ۉBf ،cݕ_mkJ Y@@z0 OX@Ul>}WJI!@ZO<8qbX  Pu"עZ^^TvR>i'<<>@@@Egy2xFB}/ڨ " ?OSM6r˒=f?=+)fÌ^Ӟ`$/'u]TiKNqhNf.T_ݚߑARem@0Ͼ*=]m|3j1ڐ].mu%K/޷1~ =gNֲz 1L#T?={1H@ ,-dhCI(/\)݀ʳc L(|˗Mތ\ =a-G@H?@FAox :z c5"<x}_\*Q6@4WVV8eHɎPGQp&պM Z'z23A23 TH;~M=@9"ZxO$(Bp˱$qyHҲ˰+ds>%=7f'nlHxslF#7fUeGp>E>%7xy~ѡdZ~wъ4ؑe,{C3[]]"1Ơ44m/'WrIy26puEux=`p@ɖ*/!z6W.as:c])tӡ\Ax3*:>oX\üU6 ZgOr$D`@z|I);~[Y΢Y@`y63>@`W*yZ?adA:t)d<+ҟVeMxl/Č~p[:5!φa|0%je| i-qcycV7"sr)Rc%?49='uSml0 ¨nh5-Y{dxv{FXYuagԔ-=5?489O 6~ZDn,'7Jan6y'NOs[!hGWMm~N64V(Î@ҏʟ?2 H:-bgٔ  ycY+A1qB$T!Yǁ &b"n7`<1 cҭ10"h&i>x|*#T}0Ina[vfyrm,6cMEr2}?4뫤6燱7΀itn߀)zBgR:ͮ>wa#AKyW~6sfh%hL}&5L3>@` |colN< O8ExLڲ?%G/q`-5;4Q^nWr/ıEGl"̵i{,-U9'e JKsf֦6zaͨA m ]qxL[ٓc6n"wZO' 6S7;H/i$CfyimJ?R(Lj!$(>@`͕iR wD3E.--D(// g{_([1j—kOqxlxԠG-8<=$ڤ:\rN+$1oMo{FDnN~*ז9hSBC` LiD6SO=GKrA6OGg'IVhJfƐC#:y 5%AJ3f'a 05P5;偖卩2IcP6ƗD?P&ET%t19%M܉@ʟ22SO\GQD+׿Z2/ZD35 ͂7E. k,\cL3'C g 1RRp(??&yxt#19卄Z/jl WSG9@`0?ӅK/iωN!,yL~vp&wxɺo&ʟ9ڞ>C3;.03_^R}d>x:|dM!ЖL8yg]Ie0e,؉ X0`Q",=>^P,ԠB]gDzG<KE=,Rumcp\_YG@z0Ol_z|I~ȔV.admJ?W(2tMaIDATew_"吀=Ux͓P h 6e4MDB C@6@mauڈ@ߍVײ2E@8BGG`σܣu믨_-?4I}m@d$PF@EZ!Z/}7עZ^^TvR>ޛ{Egiaπ"g(fX؎jnP!T*l7j{#ef2WlrcXUB`D8f Z~7P@wLb}(h00 ' 8FG}u1Zvkv^͜l^ٳI"Y<}f.YSL܂3-R2#l/LOD:oʐ*~?)үVϪ~|[°}R}C=@`>8@`@6=@rn 7ƠZTgbf"l g"o4 q켞אwWsyIZ~͞FvsnzlKf_SF'ʱ<2gې:^tR\ؓk<3uR+W׾WS39~O D3 Gn} h+'ZZ &Z@ki, fwm/ g R-yȉkiUO-')JԽwU9vlքtR9mؼwsCNs_^I 2a]^SߺI?}!iL#'?9GOSh\~r\qH#Or Ro({}YSؽ+nGQp&F$-8qId0r5 r:1 i\Аc [b99=,+ȗ%}mԿ@d@]r !059|4 @_z^}z{h"y0*ЇvQ?" xW& ZNHf?xY`!wc3ٓƫ\Oʳ) K\ 翋zFs9 lst1K0YKk̳yPCߦ>3EdEo7 F/믘>Axx2tzARѣM_ZYa?WT0%j8!-Ʋ֏պ{3pNkҋy> ~n ʏ{HOVg]c #wq,. g=w$o6^#_$5u猱mW}2O%vF")=!Dp/E=<]$`ЫgL1Fi{ʯ3aL*젍Xw *Q[)fyABe#/:_˞삝PN >nq=@6O]Dblu>^T!YJwblc|C3$1'~/8oN ^t/T ;޲ 2y'T)r P]~$#R޹E{lȹrAn - k5c[=e)pB6%}uYK=yk'I*OQ~St3ѕ" 5@ZpdБGpÙđY`PtF.1ƒ}@m)g f$%@uGGux=#@]k dCK- 2?DmH_yd+&Wzc[\&kWHbk' Z$zx\0;v > ۿhE-c:byLnFonB/$G#\wc @!@`3÷]o?'27 gIP/EA綵e' v{V;~gȕ!=ddv^څ` ݆]I7n/Nyi`}8ٌL9m-L>ё:v4-4,&;ȼNĉPWR>qk]ʃ}7zM@6wU@16 Jn b|McN}f6@;*@Qn'ZD, / m/:fVWWǼ &}f@`2O?^֐vװW $ %E@XM@J1D3 1h}׸ *Wi 0xB@ln@@ˢ11ZV`V?h1D\>}ɛN !> 0`};}Kh#cK1(?ڵkz̞hpAwl04)N៲(Y*7q{M,x.HP,kX zCq] m*ODkt! O^ X߻t7ЖYEdy{f<31Zvkv^͜l^1h,XG/D7QyDiQ5Zfr6oڣO]C†{jZ8ε1i SM3/ʬݛ\g"  0(6hC@m@6׆ ~!c_kZwcPn|-3^1^KKKg3D6DŽ37xsujc*nH"wc==LD@SE6$nNLu9!J\d('9쟎D{B"P8JjuTH)Mŕ9A].2}Rd@Lr$(tٌEC yF:t1~(G@`e,{C˂p_}7eW598L3'׫=\S^8'XFHDtAn Pk'89 Ff!&Srњ㓷ˉ@ Ay<]*1-- DP jW?r}h%'{9&B{Z3l^ZNHf?x ݬjߍVƗ~N?Ξl6^4~R\L{r/[_."3'03'˽GyHJ#)ڐ %dqUAʥG<>$cQzBhB>  VwS;m!pC@I@67&D@XZW{^zoTe%`qL1K[5@ց_iD@X6e؈Y͛àx3k7-#YoCA)sdqT?]GAIN=Pmg]~d=j뻴4;7Lu>^у^b}MBSYG@X."f:_p'T4Yn 1@3$1if0s<7a,Z$ \;ʍ.s8֐.aP nAn#f7ъ$}H^9A@V6 Ǡ5@h־?S@{3Ld+ߐRDN"\ e^ 72!][ "*Rz.--D(ep^;2]xGȉH1SnzSl2eȍs^!ʩ=dT}79|SNch'P+ I `ii%$ ''Fp2{6?rL . Q2rryy2C:kf^ ψ,ʼ(`|\*4F-rfVR.yC Z}7_dFлiH\'xWZ)O+R 0#7f?Kۯ5/>)ټh&sN02[=QF;#CSީہ( gƣ۳{gpf: fgy}} 0ȍȢ`زcSۘ1 8 og|ݺL~`^Lkft@V@C@`F]߅D\k;Y퀈.mx%zvN9ȃn ]V j!\ \izٓFBCG e^ :?{%^coǨ>jƎټ`[k64@f@i@pZSͱܞ~s' 7]d_/st^n;Ω4yc0@6C=G-c`[YY1h&z3tgb=52rAtͮgs=0YC#rٹ`kv G !>ߤ)Ǜ7nvt+a\%ۀG{}phM#@hX&(`&f֨q:1?f負&&h'ypLÎF2,C^'˥ޤʮYwc5A8}ǵ@ F}tk_m8j$HkcA==\f-<Xߛ%l!ж3 #wck  "A(PXH"-@6OϽDO@x0@ߍA.?]h@_ .-J`}Flr^#c׷owcEˋjuuutH G E>~4&PD@XATߍƗ'lጁFChU@TAJې`}Gds-X@ߍVײ2E@8 DL4tLV iGal]BX<\*@ߍA񵨖ծ]ԣ>ffDxDPyY@d:Ku7EUmמ5WږEmv}նTZAO+R 0#ȯ3$ Z@{ J !r`,O yn 15=ݚW3'o/k|c;6;(Dg$!RV#q tlKASHP\@x(@ln@@ˢ11(7ՙ楥e"c™Hk"c"x'C_O(S멼m9y^[1cfU[;"ڔ<,5QYD{,oY:e閥_j[LF/.]"8}ȭ@iK#p@69@hXAVWW{!/@ߍ6Ɨl3jM.ٜ\“iFL$$,y%3/PY9MeykKgmv0?'JH`8ddvն|9PLRGn3ZqUhc}\!(G; > ۿhE-c^_mm}7eW598L3'+> "đTDN X#d1#o-|NMmCnN?Zl cy6/Rt PUPB cZ1,J7^WB`+K#{pdj1Wt h#y0Z?VrK͜ `V9ZzgW%O_wN gHp@}ld&bB_xe,Rf*Ǘ](yLGm-k[\n^wB?:~mW%",}: ,}snb2\#.n/T~-S-\!N>)nXG$X`=@ (rlu>a WV=^5_*etn 18D0Lu?]7oaٺ1;dziDp!`rdyY K]Nt*pȂkyĜ,f/Q[Rs)3-]&!(}DA@`hc}o~1LCosF6U%mAz2`ӛ+s Xg6GdsoE@Xdf"}2N8[/L}Կu 1/s1Mq<&!e&GvQŵh+7GDƠP\bM4 MH"9Iϖ&m;l7m !7^ɍomvj[\(vyP.B[E1NL;b&G{5rܹ[f%r LG9L?ٵgǑ{oбa@W@LQ i> .m?vƉđTDNr{1@"(lAmQ}TlwNK~(JXyͱu#Iɍ~ n@6OE5&-YO8{HhH#}a[1pWx\KrDG2Rgm|Xi 0} hk}o~Ny3;:؈ Uf/GqfWl;kon<e_T뇽x_=Cc r)B| âVJbypC;s > ۿhE-c:byLȟH帮!ˈ<2F 2rGp!G` O!gj !><.xƄ,s[-m ݢ%]-^Qmqa"7~vGhI"d7 w k#r@ߍ׸z 0}{i^G#xvaNr!`@<_i[ZVdl|2tYrQ%~`LyK| ˃$&F%](uKn-@6Fog]@ߍA7Y@18 0U`}Pg \6мeޱ$ gӳYkߍ6]^\Vh1}:!6=kn~ɖ]_ |)uA$`g z|D[=X!1D3 'ܢ@ttnV~!_ N"O~rB=奔7 <3p߽_Uw76!G51ZV`V?h@H he}J3lGlKϫo~7_Ug/ROk0鳵K }\<]^<ӊziESs:tJei]R:3bpJ5}YxyUe9Ht^KZ5ek:O.ʵuJW]VUҵUtU5u7n(ncr??O[=;)ĠFE# wcP~|-Ek.裏7'#AkFWY IUTʣרv=b>yt@`}C d3eD}>Y=N}_X}NGy:y´rw>=*Ol:ut&}r`=$ЉL3,O$dYʈp~42\ys*i{%Mrd oMl&/)$/h;֯h2ۧDhkMW4y 5!}%KN'i&] 霄dtFJOS__3D`F%#"wc8 y켚9ټx}YC'/@X,nk@*gaNYxk3*hOGˁ@hc}>*h!XqF6LD YkHf@6g^ A6}/_^76} cYbT0}7ע:sռx6LdsL8 =|qlݳY8{f*yͩ9Jwcw&EY9 Ca"=}ʥ'oy-ϐws .ظ5mFm/ o_ޚ9ƪJ[C9nKn `'yB}pA@(q'@ * 4j錏ٜRCF#Ҙ_sTߏ<$~oԇ'8\ޟzj=MdmP nq 1(;rf| g"9ټ^񙈵k\<µԑ{J+ÒoGAOÁ`s27)=*'G'M퉺xU|$f,[].({yW`?O6)EXtWT&A63fd,ͿwTN|vN:dNW]W֯d_tYߩzuAA?K\~]o>,2yb,k9Y"oe"!wcmPyٓƫ\OaL =s -HFDɽmM=C8 xH[/ۓ{\@:v jh)5.&] msT tXA|}Πg@}ZYa?т@TFtT"_~e:w!A6l̉+׮߾T^XsWswI=?QTGXZW{^zoTΡvi , L)DdGΛFEƠ*GNϨ}B4^NƦ4@ B@~}{wlo>U6aK9VY*A "׮j'鹗ID6S3X93Fgyc\q"O]5&=TG`$"he* ǃ2y}czIX':6$n\^{t /FaV0paB&0a.KEB4L|}i 6T f6&`w,K7Hi(jwVkSӓKT";Z|>ܳ[xY}zĦg9}A=zTkw"f ^t)u3KOtL ټD)KWΫ<]?5g._(%7\Ӻ.Nu(]tM{ՒtMo yֿg2*)ѣ/r5H?7}3"z391 ~ bv,7RV- ȅjU}7eWM0Z}Yd@뻴;W0  \7Sg Wk2ՓLd;BAf蝣BP,/5zIv Zd>30djY'f"O{\?Uw^2瘌Ʀ[ nU;oW۬W/89Ad9Y W}Km4r7MM=#sI³ِI6_\~]}{jt+|iCX.o&izٓFBCG= ei (<4Fl_wc5O zAO3( R7b?s;ĮM94dDvAԾ#LnNWGx_aRm wfc; >-Ly9='IO4oګ; =i6??o1>uDY;yM^A6;y׌3wYoonF6cNm&|yEi=ׯ\U;_|G{~S8|rd&u2iz[YY1h&zO#>x0'rlɵ#D` !gj !>\`/m{R^)zBlzc̾ŲTUKbGob‌J,<^L,Fup,|\@; > #fM$tȷ?gK:ze~x3??:#2w }nֿlDF󅋗={?<̓d4%>nlI3y4Fט"fx$;gk +]zm#wEn 2Zbd@?@!>W, T.߂6|:88 o9Q\=ap9x@]U ;d  }c1璱ӂ(ɳ_lfm6xܖsI1;x6tܦouDZyf3dvk8@٬Is,D4o^?k™tS?U?{̒2Y2leT殠T 0}^v4&PD@`<d#)#g1n~,0_SOif+uA:ZNhDsVcLFC{20 lMPo8y{ϖp~H`hɍ_=iof/v|Sgl0O3[ pN~}5+/z?~|H_Rsԙk Ǜp"wc/S`[3@矙I$h -j@`}oDDA[x\}x ٜ̆XS擞pNLD0{foSN6G@y`Y̧=᜕Yl>sY@ kONkAi 4ge4Ɯp#wc͗Qt\^\VS{@@?2T 6w Cxj  6y̻"ϱVL H]%3|F$=|Oڛ<M0Dd3KGs!iflfOn3O't%K>UeܥS*KgίV>Oy:Njm˫jP>Kĭ6]/M7F"dsʘn 2f"A8OH@@ON 0+ 'D$(TCdsD8l3kׯ<]?۔ M312E@8c}c\@UZY߫6w< @}@6lg+NL3(`1(2ծ]ԣ>fgO["y)^2\͛}&3>Т@@ 0 A6l:Q B`/󚀞nΫ͋7ї5>{5ϪۺyDZ= s*H[Pf2ی :@N#s| wV!3f A6@ߍAEu+ƫyii)l&Bp&zZ<=g< uuWɻCsλ,OVG z#@mdsH>|5.5hS-P7} h(!r{@@޳N% A6l,6 fbu~#wcQ g R]9'\I`y<iU˥8wf[!LʢT;y K4|'a^YY6{}@@6wr%Xg>Fd3f Ef)o({}Y"0о/w3l>r3̜l^__\ 4=BüF'{g$oHR8bxOu)յy#DtAnÓԌH-Nt/D!w@GȮ@~Cv5h ! xOV$Q/շ7GsOc0@ܼ}#r^ӧ?tO?,YlcUL'wa:sb:{qEe٥Kt)u3KOtL < )Oɬ/ki([lefLc{G䫗*L%DmP`~ Rv. d辋tr1ҹsMUD!w@G~v];h۬ :m/SIq_{7ͩ۟$3h&d%uO8]VWEWLZm~tqʒ? w^W<|:x`euefN0^͏3;D*_^wcP~|?du|е>| _yP>5:L5 SμqS ס5ć}uB'a<1k=F}أ@ȯGw'|wmP3biMs`}-Af9ݯ7~M=_$4y5;gaۯgs_ȏnyz6ڰ-:ݰvvdwöWroee=i=ww=YLlg:KWK/K<]r^9֯,]?tEU.ٔ yLX.Μlu>aЯXN`Y ]嬽;~ltLhv yZ#4fe[?u8 ZNl4@'LNx7NF#I6? y6>H 2fx69\s0#™~^__WD`Ɂ*N)Yk؆k-N]X&$)Q1jӉ@+뻴;Wmc,Րq[f_vs K f~w7դZ}RH P@dIјd4ռaۯM@e4$Az$4f@3@6lĤHZpdБGa c7Јu^#zArHxʸ%9y]ʍǔ\wcPetJn2:@矎Šf@%vmsd}Mq8,׼ϲsT ^,dB4H6B} X8]@Jik9Q p˭gNJ#ہbRDUeܥS*Kgίdr*D3f]ЮD`/Ԡ@>4J@ w<@`}C˧ D:YXx\"ҕ*O~eMe٥W/tIͦ+⴮SD4óyzf2le./.4@6C@`hs}vl? wiQ>f 5WK5Mot]N7nPYRg?>4~uir5n 5@w Wh"d3f;ágG`+/JmG }:)VA"]Q; @6l !h /jyyQڵK=c>yofO4G8`A=*Qbp͡橌,XPjm.PTKʢ#)y@矮iB@~}& -w~5f A6^wm.kz^5;fN6/D_P<2}^D_дOTFexRO傑M>ӎ@cI!}RH P8ټ#.߫b: ʹT]<>ҿ PYZ?ǪNt'*L't%K>UeܥS*KgίV>OyJ 0of3&R @ߍAEu+ƫyii)l&Bp&zZ<=g"M9)ި vΓsȯupqDwtLLo?{g3 >r{}C #}0DVTN8sMs`~\_$[0ij%>vm}Sm-vpmF8l>.^.iʚUK^TMWi](9&8 6=i fMmzfO8Д9J&;݌8%6py3Kqxy Ͷ o 6w>=)hkŻ6d3y"ɟ#cf" dp?{_[2ZΝl٬.fs o7\R_?>ѼꑇW RSQ[Ʋ7,twcPv|\ȑ#D0sy}}C 4=BüF'm[7$r1:Ff$pe]$5#gKS} pUB6>ȠR dra?#}| QFD̔~ox6_~οd4D:?ϫ{Ǟ͎6/$jæo>^z:&­eLFUuIF[y]7lMvd3ovܬj0ݷul}Ii@Fz8óSO6k9Y"oeNqlefLc{G䫗*L%DmP`~Rv. d辋+r!ùsixP>OBvhf|@矾>!Oawi3@dDd3}=5cj9us!ټWidzD61\tz4ߣv&njB'n3W3 f&7 Md.Zf"#8aHgΩ;w{f ٳYj]Yy齙Sy8yPՈ leu~:V>ZN _yP>5:8` y Ka4 }usi}!1͉69g!J{j!AOG`D3T" KtKRU6]3N UaM̋}o:9%O(^9E4S\:#%a4Rdb#Y{6 x=Wo9me$I7|9u 6`'z{0@V%y<λd3i&?"ZuWq>ƠD3$Q9a_PKX0'[m|S(dllQ'uEƮޘ 7Ots Gn4ϓ[K,3 T. }i; 6F>-_EvYׇE= )|}o.fzGjd3hDD2f']T&=NHRټqz6 d3i$s=٥e S30R7I].4}7x=B}e'>!OX@oȭ e7Ȟ6;v\ƾ|ytl7}#+=E'A5KལcO}P{ b@ hK6[]f#q.lֿk JD8l&eY{77s f/E^:D63niXM̱p~d $Olf̐Z01G٬d%%~Z_,Hyr/kׯ<]?tO4~"L=@@Wh{}~ >65 I w9l[rӒݽKUZ Jd d3fYle4*1 F@]%@TDb #d3fDh"wcQO4 yf:>&}>.@`m)@1D @`\@6l yy12EF'8GX${Vm2B3q  #d3fDh"wcPetQ9j^ZZ  μtd)͘^.-쿛7 Y7d2e!ۨ8Dmg{RKoPj 'F{R\Ҧ@c;]30ۙ>C,rlQ:Ja}SGd3f f"luuUon 2==LD@SG6q 4dFZ7$r1 yFDtAn^9"yWr/q|$ Am {w}: *6w)yЍdl dȔ e/ YwcPe4nGQp&՞ NF䫗HICd_1S( A6l 4Q!{BG-o1˨{4[ "|b4狹1GYp@뻰lmaWva]Q0V.0Uh>@@6l Ʉf:_<ZT .rk}7_F;"h&i |@zEn  ޸Lzw˻m!wi:yS=Q쇸 õ&ܶƅ^*db#ONФOtZ.ZggVczN,?MtV\-\:uiU[Iܹ(׿}p: ҅ OozԨ3s=٥e S) {/XiHhUIrGC`2̏S}G`h.s63ļre]iwcPn|MF?@w]d2 1#>mYN&lT\CX'qn+Eƞ&۹ow3m){@q[8\-G;@-9u"033{{J6hh9w<@}jkڣY$`gg@z15s LGL?Wa. cy,WFBxJ@`Fv}&0HUg*I? Ɏ/֣| 0}Ydwi9>M3r k%7k=[sՂfm'vxt*8Ď%Joc@]@67HF(πb(k,O9% gO6 i'/0 NJP l]k<9{|.%9Zѱs]tޔ\^e,;Qv[K_(}f@-Zߛ#) vۢHXjjmtg#d>%BwO$mWO43Zۨr|m=X@@ 3 e,ӄbyLtO]^FJ"#JG7s`|)td}Zq8^Vl~=os9W  mce"9_#ۗ<%Q#t(ظSڠ:Md‚%铪 ^"K o{ m{Pr`}oS"eqOX\3]ҋa2MHD0G3IkB"ɉЃ{Mx(^~&'yp,8 /y BOH(\YKNku}f?3W㢶W"+}pCC}9kҜe6- &{vk,I@/",);] ܈lX'7j)#;+?W I$l~J/m˘z i1F@@?rȠd E{Z>=4F6`y.A_md d3[^$"f#4L_Vײ2E@8Ki?}{> ޕΣ@`} DF浵U5x 7-[5P!CD8l/rdxxCS1WOm'iעZ^^TvR>fDx dZ 7AWV6{ ۖ8JTDA&ڶ;#> .v f]@Qܹٳ'ԩO?V+'ioTv/hsFf[ #3ek׳&2Gz?prƖQT# 0mW #hF>8?:k}Q~E[^Roْ)I_f#oNt2"!!אַY'F7COhA9Ͽ4rkQ9j^ZZ vh2pemڻg^̶=TNѫ۴4.7n!7u됹>4@ wiQ>@d=yJ ݏ/PxD1:<#{6gL9A\GFl Y;7t,yu1^ 4}r$Ͽ4m/ g R]ْD-D:beuF s:'sRV~y Xc;ۑRYR9ֆD~&|9>!hc}~Cxj ?}C(%{Hd'_k6W#tҶmT5y4r@F#q_AB!ͥöeo({}YMLW/ʽf#G'`dzn V'as7Xv%z) K[9믯7'5 Tr#Xx1DrpF>WDٺ@nB@v}/ t=GM;`}ow 8uȵ2w?MS.k? ;oa]{璲SU m7#iFhk]ě} &޾zXߛ@ehlQw^ $f:?':s«Xv 3ʾu>ջ[H3$Q/,99_M"뵑֒fQH(_b}y:?LIꭋ>w?]mӊ@{saw'Q;.{=n6ɣX 15~-kF'b}!@6;-?ҋ.--D(ep^HG3Y7B /ڈ" mOrnK}_@:rd8B&!7O'fmt"޶r:w(Nem1a^yak5n#o\';ߘ6fTˋĮd1{0{#1 pK`Z}T''+tz2=b(g,O&I\/U^Hr6{)?2Ɉhn&U(#G}{_9l 斟PXν3f3`F3^k^M bnXEG2Z-A~no\n=@پ{=E@v}c\ڊKLdt"WjoR9A6qrЦ{~ IrkBXb)TerYy|tyQ N* {7UFy;&cp:-Q]vU:G@ GdsDc߽r=CYc|:%-YO8{HhHu>Id~,:.Jjpuڂ# 7ĶƗtP>>=B@[7b?ҋe2gH8)`5vYpO2恅cR:hc!ǒMxFq8k:EFnڀ=c:%$i'±$EF2\`b} l 斟Ű-c柕C8;f2k}J`w99m9ZA~opT`Ko(L;}@M\ߥllf#g1~IR{Ħ/OEy)w%x 3BЉ%HB CKʋ봁I [yaϾT-ɍ߇`u 9G 0 [&C2(Y#ez 0`}.ZdW033 Ύx&; K%0r}C% 03{݋;pч#Pl{g~ EÙ1xsѦH?C0f6i:./.1{ˁl"g6z &@dzZ"}z-z:O6e?Z:ҋ! Ͽt/_~m$]Fӊ@i/m];A4ٌixЇaH/0M龵2!O-4:LZ,0P6~&H_b ZMt$8FM@qjWYX_ ݟ$6MbR}>h^ZYߧN L$%}E@z1{)%Kc,?ڵkzLw7'"|HW"|m>#qۤ#dzrx!AjUh$,}A@`_g]"]_ Ye#1{Vqʾ!|Cy%_zziҿg!a, va 7\Uםҋ!k/ykq^zGy5sy&M3vv=3OXGF eZk9ۑT&_,Z{K{ɖƼu϶_/+nwamY]A_zɉ]c=H|Wo#!1 pK`ZOξ?A-C(@`}}Af EЛ|WJ95ז}_V~$KoR{cP0nHN4bcyD@ٜע:sռx6LdsL8Ӻ9|>\Cz%#њ̫7&#S3o۰N۾4_|Coǯa9}c;#I7xsyTyѺ}LH}v2y38fv%!QFzzOFs@[{ z^64zhl˴\oca8 <v)l.bnhKj/'#&hHNB T׹(^ 4sRk~1ic|.[<tK 8F/V"%kݲQۭ%䲴e$[y7u\,;7M &@p-ܘ3.3"#X+犌o]*nȜ31{g A4]eds|?׹sx_F*^3; -D/=љScPd3VtQy2\E0lS:TV:ݿ1Ǚ ᣱ&1n)NWIoSgj<+~6ds^6n8ro&7l2݆\,9j -a#go5~X*s'#2#d^z-c >Tn YבD0szɼl8r#=]FH^g!{D I襩C.;N^NvAZ_/}q=I Sm$ۍc0'q"A g[%Z֟?y$`?J0ֹ">יք fʹͬUγ*q5b e,*19'6C~:97'Ҟ^\vyζ]q› d^Ϥ* >co>.{%:{%t֍*w#WF2 9;{^bR$f{zĘahx_C1BuZuoOeL9.)'|63}rcΑ +}8ѫ?"PEOh?ON{Y:ٞ,㗣CO2ΞHJ;:HC#~ Af@6祛d3CADW9ϪǕ!||ˡl:xgcYo5w6!&xPo({m3a{=%(D{1 t/Qy WE~2qM ҙ%Q x\F&6>, KaDBУ7Br]c {2%Btm73x Í~<2}cx1l77//P֟? AhyyczNYM'˽j?\S 7&I}7ӛ'oKzL X>fe"f !b/vցAhs X)5sB9*xFO \~;/uda~&Rj6*A)90FzaZ&ie(g,0g@4?&f] U֗AI;]_H fk"&v,9~9p1ڟmα"y;P.90&3SSSmt_8lo?f` {fMKWSAq!hlh1I6(Vrri|Xmx\t:gf\c Jixj_2} Ze '@ >x|8l؉nS;e9>n>PHӾN"gKKOwi>؎ޮ:9">PZNdgs6xɰ-6afHie/ѣ} nZ{ =E@V ;9'rBn,|d2c`kGNCNmΜNvm?''OP(6v߷c@@} ie(k,煛$gփxEo_g>6cЬrJij_r} Za #@-.i?oʱ$u6qOhh{l[ImyG¶{2dX:?>?D~~k:I*OƞqvsT{:Vv'wcbit܆MCsi1 8O fM6skk BlA@ZX3_Zv봻SIGEӷC6hHm"ԷkxlԏxrܮۗxHΔ\EHh3GL1& R@`@wn0 0y[ k]jo@6a=vw2i,#*^BJ7rGG8SX "*%cE0L$'i2Iub! Y'my߯C}9؋Y=q(k@#gc@ajw> g1 L6s+Adsj#n`Ilrw@6Kybcs;TZ2s}kw cԆu$|D0szV9OdK0/h߉7պ2x=U?i9Աhl;r=}ߖi 0֟?3M# ~nz`3A}&ads<DҦ7)Oh9}/n[ǚ]) ˓\_*X_*ݻ=fլџlHj>Q{˨}#'ل Ip2d ^I6S \]<15 '(ܽ}Gi2@Zk@@^ƙB`!ۓ%6ܰI'YԐC][ "09?I<D|پ6Kmrw@̺'Rv:n27Os=lGSA;!1jd_$Z>CM;Ȅp0Snzc.tT:9{$M;>?դm'%"|C\:k(?%?m "PCOj?mtd۱Neg|0D\ @0K5L5L% 7F{["xcF6K_OZˇWEh(s2*`*Hxk,ls׿4rKNjRP~?!h9~9~irq3uRI-B9>ggq/Yk_._(%/c/zC?>x)]9CG`d3AV}1 ie(g,.cg:/DkD ptl~%a/9vj%-S}3;:E,:h}J9H2IVC8ݘ!y;a\{& ֤:9ff[=-ߟtʍoN*mJL^K}I YZE Up1n 0ie(k, \RgDF8ܘDA*@c#c HiHe/ѣ} nZ{ =E@VKq+}8J&<Uoy&k~Y:6$'iGa~n{vB:ݾ]`'fp(^{  @eo뱡F &:&'M^T_jܮZ\h֟?k#j!PKOb?1{g(\\ra&ngG[dg˴ +9^BC"@F@ Ba 0=ʰLHs=$3)w)>;K! FnZyIˆh|@&5d["9 bҩ=V6u"J@4Ni/lv1"R]^4F!yL(V5eBmC2h( ,L"DhO!hiecy>c q̎hދp>?a3,K7c6r'7T2J֟?]" W -@CVfB6 owy)zImC'7u:](D!%$q+yZfN6G_9; ក%}uCy:JKFy}׷`T/ N7u-tOӖؾI$6S2%g@ϟCߛ  >0VLLV]61+٥U/u/ a,c*E:}!|qqx6LdsL8Gɕ~)4\j֟?-`1VyT`?b09!>X֊ fʹnlݼQ<^Y=7ج&&2b,O341dGSFfý<ό>Nmoe׿4U/%ݻw{ّګY{?|N2 X}*jS߿Q`sz譬'Ɩַm8N09o2hQp3h*}B]xtFxxxZhx nnkvx6Rb6sgi_aq'rT6AZ{QDƀǸlΏ{tJYD ?cc@(z@&("9^i.QQ,3`1 Q,OBwh%yaKiaﯼd43K>S>PlӚ gq]=t)NRJ3:͔l?EIK LVAO)X ]~=Nv&㱄 hy%퓸XF޺3WlDa1&xacEp(={8@`d3ɻfzwWf&F3tҞ&0Nҿm7&B@ZC'M7KPO]'$#Ft3*KmL5--ft-GS+Tv_v]W2LD3֐D!d;C@ 9H}J9{&};%vuo̺>/R+Ldݏy}r)aqwĘy=}6OSr^+n`0̾ gH{`Q9+#ᅥOoX+}pCY!0{g3{3J O4P׊N+ݡgSVҾmÉc$O45TF@ZˇIigEwEjK.浡trF40̎>ر$CURyJv/%Nm_#/ls Ch#h9~9~lۜz:IIf 'j& =7w8VC)6}>q/78?1I\$Oa7}EsE:G'7]9!댓];4_ }Í@Ÿ@d,@ F@Z26I>!y\B#5l6ʹA=lA0Ƈ|Hij_2} Ze '@ >J8dҖkWgHCև=H#&w#HHjnXpn~_Ѿ" K1foQ yaQ~s2퇌Ӑ''Inw?nSH+CYcY:g&n7s{o 3)cu1A0vXVp4s5*_;Kzh֟?=Hds&]~vmシ]Aen"6a(zg vxlkGsڝf `eyk#^{m9%:A~{dH0-ۡKCy 0= -"udd%H Dak,> Kik_r} Za #@-.i?v* }Eho츞ν;1rxi,?fWyͨ{/-jKZ6@ϟ5c0'askr# w[x]=G6t@}@ci@BRTg/t`T6:ŕv}'4by9¤&tE<<57P~&<3ܓh?9g}o[;Ev@6|o + wEDHovk> >'/-zKZ>@ϟ% dg?gԞJwёBY PPH k %0rC- )Ru޴KtrAw!|>9Ta` 7ԫ0H+Z2bW\T u-1o߾q™fN6___;'j7{/]S*$~ aFa*Vh trz(ϴ0,TƆXls'{pK\lI r$6\L"ϸY]f u@;V@e9d[15 #pXA 1lj 0H+*1kD@zKڮr~޽Ύl^$ t;}Oqh)PW=ky\e׾z¶&ynI aa*2m)I_Da"6 /|xZrz dMQM3_|2 ¶yvVG3֟?u@*s<H!u#0I{! 1x6) 0H+CycY6zBH,xxScݧ{[ 'ل Aʓ9H$]XA]o7Еac!n@QߡNN{heSmŕv}v6qi xaGMrFAžv YH%w= 0y.k?mcqNdOo-Jjhn}g_*n8=T2̱ep=,cU.O;B{QVx(33C( <^OpɗqȦT'܍_P.&糂Vso9r̿$(;%@@Y$[M7ۼNߢie(g, z0{qwxUߔ{G8qWR^Ҩ_#/lC9π 1@ϟ]dF ! c?g}km3H I^~ Cb'γ$ou9cQPT<>eNl_.wx zHa[e2$N"*,T~0.!Zg)3{ -8ҧףQmB9\n:rQk%}_wjMZء=P H"0{?$hVrr~F'w1\F1nyW{d  4h|XtP^ӏ8l%-kAZ rSϜ5}5<' J7^6RSÁ<ڮ]:LJ%ѾzB>  ǥh|9u:*3.gIIx=ӗ7Gcdy-4 J( 'E D{q ^㩉>@@d3& ,ie(k, \9){k>8 (+)NUXO6/-%=z֍@ϟuwi9>k=ǜ ߴ@ f2tzLr70F51R:r;FTi*5IДrv\̳4EyЉ~ӰB~ZV{6{_'0LΉ.|D@`  Ǡ2@@ie(k,灙&p6Y&d UlW .zִ%-k@2Zϙy̒F_,ހN%2rx}L`LQʌ]ϽݺlIfj6Dy.'3B*jwrCČ,;H,q-RF01 &9m{2yA`$ﵞx@6c5H+Z2w\Gc9goX ʳ・g^zKQ #g@Mjw)yI6v¡#N=n#ό[7$y[WbX26ML2,&A>c!q2)Gm. gu)ߥE@`<%5~Qi!妗/q+X)I˂O}27yX"xJyR7 eX` &Q}z,An(>òǞY&_vD!5qM ">qP ?~Z> ӖUWb(ac} ^ [};'!*)yIρ'.=)gv4~,9Ț~ ׊b<ܸ[( @Us:}{k_:]tKK)dXΈl-k!~G`ds~:<aH 3wT/HfwEdt@G$ md5sH+Cyc ><' <0"\K%2iӽ=P҆I,I")F'( xBDr@ Kx#z>w 7pƏaz=~eKɬ c%cLMq#J275zirX6G~= "7a .iSzϣ<sd'ge{t2nz ! 4~d-k!~G`d3 so-Q7WR:T,7v31Pc.ie(o,f}o$fw I@ckΈr!bU~TDP{zʓa!qI˔n? `+֟?FH"PCOi?LLءck ҏ˞'r/]Kk]/89V闱ab^8qOfO6ep/̑(y! D4H+C9c >*z+ <ﴗ!1|{CEO&{mBDA[I?0:4T< 1~Ii|/#x ic~?[{xmi0lO̦М}ڻ s$ڧPVƞVzhqމw[]7z&‡Vrr^|.6gq߶?gU">)rl-QH+Ú2Q0Y(olrIij_} dZ,yn @m^~b0מvD}GP L DS@`amcyLRy5Srdu"aHipI#?A@RG1 @@:sټل,M" Wi,79h/j^^vWWWb} HZ,rR  5L 0@@7;u=ٌVDI" a,c/-{F"A8K2_*?:/ Z}c @u[A ̚lfz K 2lC@ZX6{M׿lUN̝;5gFKD2 PEEx4{/L/bAH+C%! %N֭[͛jq7##yݍ)Iwd'!3+9UvlX"K֚d+sZ`6C@^ˍ-#Lls96sH+CS@@z1QUk_Jg7֫ͧї"O{٣n#ZtyQFq7%=`3I9?֟?{"PCc:ipD+@`fB6ELbzՅ2SD K>ӋP l<{-iːHVx/j@Eo͘I]7Nx+'K wܷOY4(\֟?50C@`- 9@=aC2|ʹ(&6vlpnY]) kH%]$/k_e#)t͜<5$16DOry[=jxb6Uօt1Lmx򖓻!˽s+܆(m=4l X6KHB a-hsx#X5Cz$A]W JL6*JdzML$ʶ2e,#gk#^Ҳ_,|H"9|}}=R8#uDS8IS9ɲ{>X.=)Hv85z9f@6b3%6zSm=b{#;]:ʰtf'/=6GPqm r(fl6ýD"ޖ%-Ƙj?EΖ3Lܽ-M&X4Q(,@)\.sDb79"T$OY| 4/xřd+ZBXf} 豛mܒ76K6% ka& \b3s*&cj6^{|*Y@9#<&g1T2LI;z|g*F-kOh! \q,{9Bo_FWqLD3(OFلpƐqq{l=_\>2Ir.޳?/Cp LJ.?8?:+B~~)#>z!<ɽ؁bb+}eEymBm!=LM؋v#m7C]7[񣷃M 45PX>LO >!\PS iNj^ƒ=Z8;/ט$mlvcc]&23غjDMq"1'w}dj_SjW1W P@ϟrQ9Ab`k4{}iGvb.ἐr=KbmO'g0ו,q](,N  7D)|jz5<+ٛM8V,mla2Cʆ=m$gYQR(Zc3$ʹ1y #d綖^mLטqqTQxhs8X5T{x!;=DvcS&"=a ˯o=Mb8# 8+ӪVƲtLaG cG ǘD6A;;HǮu$W 9dgJmLP-n|_?A&<?Ꟊe_">7glc_cF2@@ϟ]F= # ߥ8ܕ% w9Gx1t:Elph󅷗30B7%U~D@=2ټy # e<$d$۔p{oHPf \u/ A't'8]`\&c;0  a 4 }6C5E ɩ M,b$ /i>X?0GB~~`EFrAa؋yBFg8?`DxZ  A@X@2ʰLXD,3^3 DzYy:Lhˎn"6 H>5 d|zgoJ ڈG$K^ҷwKZ6@ϟ5m8ey9isD)G^Cx8 H&hw~K;o\g7̹Iީb8^DK@`W@6V`:C1+o&gmf׿4F@@֟?rȠe ߱@@;wrټ$" a,70V2l/ c^^vWWWb} HZ,rR  5L 0@@7;uټɄ(m" a,.2j/cD6peTZ,u^ d@@>= ϭ%,3Ȱ iecoHi٫_&;_wj.3@ϟ% dsA~h'_&ṵ5! a,c /-u]^vnn|P㼙Ѽfl=.THutvgRcQ\(9Dh]B@`W#C= ! !#0_[f2VJz5s>ChWI2ڸ 08U~3y= ֟?ƀ1@L48 3!乵tV0j#FJ:}!|qqx6LdsL8 }|qwΎFG"}Òk}%eu>T5=jv_ܸTKAyGh'{c4Ox+gcԵ8lK " h# @@! /@K#vfB6\ϭ퓂B@Z4s}]kyi.c*SrVhJfNHcRg9<-; Se] KHԆ'g9yHo=LnXTk|?,Ap|\vf?+c"dư|JCY ZH`60{X@`?T&znm2`\j$cpQX OFrd˗,VK;9=rvPL֟? ^d{W]s|:ߧ-]L6=l <2Y$TkX缜&TRVUe\_r\.?_j w gG6kfuĄyzbry&F2˜g/{[}-֪yOS b8sDxR Pɳ3I`D#@`/f@6sm6Z*}בQ|K作Fw^ D@Zʓa1c/D}O8Un =1[-F{|Xṛe/-Lf>O&]ʛ'4=$,[~eįehY\h/3{AM*SBg 27S3iy7*Z>˜VaDG۱""̰Q/-rDzf QIWdi (kA/d|ۋN٤y'gjL;ǛnN)K_0'/Et6 >lYGy@&r̅;Euod+sYEmiM?Fd{)5L#s+Jyj0f%탳^NZO.} DH+C9c01=\!ep =mFfDe#Ȍ!س|#4G,X"X3ϡD>}URΔ^b_#ߧ(F>Mn? h"h9~9k''mCn# ,8oqg77KiۗL<-.n/-%=z֍@ϟuwi9 w5Enmh!c{;< a8T0 D z Ad48 3PX΋=IuͿ& !X|T0a\K9qf`NrQ8Ėc^QBv켊w(wٸqC) 6! $(;b؏B9F\?gء=m`nl#Om5ٌd؆2mHi٪_&;_wj.3@ϟ% dsA~h'_%^V0JC@zKK&vݭ[78ofG4G8L7ۂSDVOSeh6|ܽ֟?#pw` RȢ] 03Lo!7|#ݔ-j iecy^фHik_Jg7֫ͧїC={;;:l 侏T_Ik6@\֟?M A@`]@k!< <f se6Gƞon2^t"2,5shw cԆu=Cګ"l&Bp&y|q9 q't'g ,߫zu)罩]#(fi-urqj47L>Eh,h 9.h' C^溛i}wq ۄvyA=7𹍫@ :.{ŭ>V5e$"߆qpD@UJ6HeM [ׁ {EKVwF$q SODCaG4ִZ>6yyxP:?#PC;8a?/xaA ~ ؈@e9?i7~Sif7wH+c!CZ&{|9/0u>Hf X܋@@Z2sS\/-_ͷo$#ŶqkuN!fs$4'i4^ jF@+kB{xhb7{e?'՛kۖ|c$($? ~nd`F}ӃL[w58^l qjun۰d5TLieXXFϕrjT޽Ύl^Ƚ ;S?XC#J2ȼ#;g$~Ο rX]УW" Y$@ 0Sw3] Vk@6cٜu4('7F8J {=8y$/qA&B@Z˲ >6>^ks'9+\WHYشť&% 'ل YcW5aq7u3{lwqкMπ=aȑţ9R< ֟?sKD@^q΂-cV bpȘVƕ_ym`>~?0$5Lv3z6J7$Dž&;()5i,r-OdF~KxH+Cycy8-& C+z9TRJ5XC f QI{) !>%^g?*o^rڅѠ H] urRPQ)Z46 C~~^a'O5og^譴}#Fz"=ٓ46qLdqeGf>+6z{Nnرh23h(DY?vuDL/'%G@d}YߌAb p8a笝H^~xQ{'ryf^6hB$3Fl6a9eO}Eڇ[k }3@dXH+C9c9Ĕ >M/C O.7=>2D{d6a 0Hik_2-(b4/z g(SY;yGɠˇ x^'iQne Gaٱ|ٰ!m祆@ &@! Cq 05PXNi fnXqϣlቄؿ`v)^_ңG@`YAz ~ZOׇD "YnBݗD}|°D6k P}Z9c{7Q<&R5(C68#|!%uNFZxB39O#&;9}?d2e)M&XsAoM8ĝ% g9-ԚV5eǝ|Q¿c^,y-+ Y۸>3BHx;OzKKT%#gsـ@mjg\Na"\;oƎD oD9N8w 1}Vw|A kFZ{qP>"־]CnJ0"y煀2m, mfnHiyqI#?A@@c v~ow0 y9s IE@ZXntad_ƚ<쮮D@`Y@( 0j@af~ov0!yA QD@ZXns]e_Z#l,=hY@. 0j9Ȏ1~o}1% 0{[KXfa2ߜ^ҲW.;M0w\ g/֟?K@>1 8O fM6skk BlA@ZX3_Zv봻8Qv<.Ѷl =JK%F*; 4@ϟ'# g,<G |fxn-bAH+C%! %q+X)I˂> R2ϏlCwY\]ňt9@M:HuZT F~_0 ΀@3"[S]rc rm sߏ|iecY~HG6u=Cګ"l&Bp&qd1=~tFTPLZ4s`!#)tRDw93aԑ{Ǟ!_zsa;$Vj9C1/UYnvxLIgJ/0/@Qp8X95!D@`o*u=&637{g.F<32]g.?2罕M0b朜(yi +WWN\M{QieXXF_SH'`dH4 4IxJr!{+Ohz5e'`FN("P\@YIBQ AKG2ٜ`Z-W' rUdqvR ?*,R\N氯YrtK=Pz\F6lp֍ABzf QɾdN\~r' !{ۿtm'7ei.޳o^W<\Ov(KVkd5?f .G~~y]&vŀE߹fF8& i=B2]oߐ66sɓPqdFNƁnnie(g,&溟PP% s'45XZ~ջ^_#G@  ~?6cBQZ5euՋ$@\pzO!Kl\ NbڨqI˄Zhy@5v9{\I앇aBG!I]RNZ_tP"]U hl.ia][G=%ˌb4 PXnV0LrhS,v.aoɨ7/-%=z֍@ϟuwiyZ;D%Խ״'u7 ߽7r\>ާS'z(;ݣ>*@@lvp,<7=Iove|\ ZO-{poG/&}Qb_Z\h֟?k#j!PKOb?Ol'O'ܑ Ӯ`hIR]CJņE)~MvCdn ieXX& bm㜇fN6h(%-KGɹ:'G3(s*1{BybJ6#Q[nҾ'ټlC@Z4 c .= 1@O7hi,8v-Wuܨc  G~~V"Mo'GlyCT`d1˻Xa8=+( ,vc[/Ȉ2@`l a|G@Z6?p/^QP֟?3@}Ӹ9ԅEv矿HbAK6@ Bi 09S'D@zO8dSF@@֟?rȠe |m\2HbAK6@ Bi 09S'D@zO8ّE"gL<0@=ٌ3f2<)ǀ_ZӍD6peTZ,u^ d@@>5ٌd؆2mHi٪_&;_wj.3@ϟ% dsA~h'_%^V0JC@zKK&vݭ[78ofG4G8 7ۂ J??QOTl.<,7rwj?nƗgYwr֟?C@`E@U߫΁F`&da7Ggw_II n=o˪x~A8`]DEDn.>}ͻ2<_׿45c3Y˂Kr3#uZׯϢ$ylFGzzG~_>^&fB68fDN7;eUۉOFoav'fS6n~iecuQJi\G^g3D6DŽ3DsH]t{j=xr^Ć_x:%E/q>SeiVP9K^=3򎶄u12!z"ܿU/PG} @/-`˽u3 R9x-Tml&`֭ OY{lOԆ՝neQs#SH,N$N/*O" 5ܼu yF2ٜg4yI b?!7$͹Gg-M+lyV71!zvxyc dOZ2|N6nucP/dy۷ow\Gk& eu"=yh(l瑗/YG $6? ^gۇ2qaqǕKOvSxqfY,AŠBy`?/dA@W fʹin&xnPN ֗zW?n|c@=qo &շyi}{M Dq9A6O6#'THZ7kmF޽Ύl^'bX\̄V6}D3OCup\BrJpzxCBϡpB?@`Tﰟ׸ I P 'Lmog_x`E(kwSLhSwYO<γysR6ak;ޓչ a͍Ͳ >cH^d90/%}0CwD`ͨŖLf>tf' Mup/|y9/(<៾{tTrտmɿhUqIҾܕ+M&X4a(<5? ;m;Wm':";v[^ ():۝l4}9op\[b۫ޜaC`d3fYD6o$@1fxƛ5Uf+ٜ .}76칶K; ͿG̰_[Kie(o,S& [{x$!4A{cEKV 1̑^ca25/>^"hDv/r|"@N 'rX _eiO~:6̺[vZ(uh8=AL.#hrlDNʋ G4 F~~nj=^-T/l}=6cxwN*Djٓ̈́ NIȬژXVP֖l&ߨ("o,i#$g8f[JZˇHɧ-4b)8[V~`O܌we6ޟ}K%>8s׿lFeB@`-Y/mywJ9~^!ަIO}6^ɚ|q=ܩScy3L͡Ck܇ +rC y:qؒR+#W󳰇v䘤px%j`xt_v[dKe dB8Y8&#cYfbPJj_;h@@}JyZ;9 8d .X׆RCNfOZ;!c+c^|2?^#} O9[:$‹Q~Bl}ѹKW`ҷ6yC@1 !F':y( e$N-p-ğax=dsj/s~ CqB8z/x.H]=FϺgYd<|,$'"ؼ~2td#1)>0DZ{~-'$9 s?2Лm#sgDRpY>j] Y #y$7Fj_} dZ,yn @mN&}ټ[>w4! <[W0s'g{˾$53f:GO|$Ceۘ'rl^BV@`ãl;٧^RRzKˉKah# Z@}k`]3ߧ]5h ]PC 0!򄓵)eKuKOy/-i^^vWWWb} HZ,rR  5L 0i+O3}UV>l= a,O0IhB /6ppD6peTZ,u^ d@@>= ϭ%,3Ȱ iecoHi٫_&;_wj.3@ϟ% dsA~h'_&ṵ5! a,c /-u]^vnn|P㼙Ѽ̓2ڏSgiߧ1(Κ㌁peZB ,yX {)@7_yRϭpytv'? .7.,dk㘰P2Ӽp_"^͜l>,n uTdA˻ S#jgD#p=p֟? U!PC ` ~M̄l:?)H֕A|ho$MU7# " a,ZזNgyH{5_\\D(DBw}Ьĝ3ۘ"%Oxi_r/o#Y(KK9}s̎"ugX]-rf۷{\%~Ymq*.J֟?;*@D@N 3;C@`2fB6sx'O܆& &DӓM5+ʰs]u#)t^q^FGiU0պ?Cįf=_zV߉*%=U!)#qBʐҫ"T^@`<5@ ;@e0[tjIR`39lr1ԫf0Ve\x,9/ u$|D0szQX'Ki{*\Į##/iOz"֑>xe.z(6$Et)6bdv9tqr"lC7^$\-`3 2d{L+[hWwX((B2ٜ딞[=nt i@GKv4xfmXhX/k*ZMVUIc79Ha\F{ݞpvdjV5b'O/z9㽋- 3儵בLNPH5aTTU$IBAIZHba?}A~H4@`dCgf}?QHI<"'ϋxY7ٓˮT|i,0@6KmLMeɮß~wP xn#yt !axҼ=;P|%~R PX=] 7, ٗZtL3)#ŬqqHOL5J?CC O~Ä>|/L2ua_,9]hj7'g~L}qX1əgi(9YcPK!G  @5M ' z~[߰Ob|7Y㤁~JIfM6ynEqo-\ZEZPX>P~BC8&cIs:rɓgKڒI"O69@*Ph~l':%}3aoO]d^Ҳ_#G@  ~?<-!yߘn")Q~۽ݫ}'5V/Sr [!ŒKzgpʞ/x0؟'s'.3[ߧ]=LB㹵 (23(Ms]' <$"1]Vk^Ͷ'H{Y哇ҚiS"{ot' x̸Fl^'u/.um$.ɝX2_^qI˄Zhy@5vrζN0w {^zX?&7Cb2؎E@ZyhG3&uҨ10]4߿Hz.^ 8T޴Xo7+/M!7k_ӂ*ֿB"PKOb?k{;I“Nږqm0d1%%BG}A&7pk|Ùh&3C7dn8H撿P;e8F>)!#TF@z[X&X%0 eXORǖ &ot zsB0yDEc?ټѳŞOy'LU# W .#y;9!FdRx:;;b{Z[,:yr{[& (d%͡HtB=Ѭ%-KFϒ;u;9LC[<۝mumrݬ˓eli vݛe"2_êdraTf 0eԈv'{fC}ӡChȡǮ2rl-QH+(W(o|IiIqI#?A@@c La-IB>QdW?oH ׿~G=5`,Ov[~JQnSz/Q֍A_M!@0 JW9bBo !i0!F_@ (>C  cdh Z7knF)&ewuu\c@`nX5p,@5PG@ D`sݿ ?Gw,-?6h&9F8OZU ,Z}A Pw @"//tOIソlW4U6&;_wj gE%%O*_Qb6V=F9ZG,*}@B& P K !0l/~#L|_€h~&dP!Z7uVwz7#")xO0I,`<#*C- h)@h,O1ld3Bwvba@`k˿|t5ucuzcl9|z}9s( kOlrKz6~:*O 1{:Q>eo)o;F"o{5>7VJd%EOc@ j& @@70{xIDATI(")Ư/vD~I͏>hӅ<,ri#i拋e"c™H&'&Os>|v6ߩ(lamHhY{F^3Y&RI0-/-j/B@ϟ% d%C@`@/!("I~K?<5D4~%I4<姦쒘]]]M)Z5/g A4]ed#qC`"{aE6$hKG^Ҿ'z#GSߌ(Cgrz̞F=8&D0 n$~@j)(&S A #@ίz4| (YXv/ ydHƠ彛yf g"9|}}=n%q_- eˆb;[7=-)JHzLkDyX18=!k|@@'ra?)Z^kH:_v"Io>>Ovy[? ` 5pqEL/h~WCY|EcY%S핼lr4hrIRpvdj{n'a콀q89z;8(Cm3]P b#Hz3;ǟ&ǂrkBϚ C#PE~>4"ЉXM!3|깎m >{LHxz*~+=/7s*Ys|'sʢeAܷPpW<~2qMS!9˽yx 'lƎDTyH.uG<qyp2E6q?a V}AC1}VZ'{j_T"hqh@@}Rynv.O$StF'Jo+ƥgNgmA]V4 lv=?c #U&sOGXd/..f"]2N8/LuOHG{y;y8D^~ +{{8xC9ټ| !h9c9O^Ig'0+Goyxh#z*ؙKjՑW64@I>YjRF`k 2C  Vj)v \DId^^gwC>njډ`k qnڧ\76~(Z >H֋=$_ Ʋ1H?7]3""dkIc2(b~ep 2سOwƠUt0)Ł(@@VKi;7ml-l s"S9hN˩ڽ]NӱvXLjMXǽ]fˋyIgTPTw!`,(@dsX( ZD@X#BdfBCe.yO C#~޳` @~ԯThƓ"{:Q"zʶn ֳֺB )C2hZ}yk8q֩"kC H|<'slKSp5փ;|!|c{6'uq9ưv@6}@#PX&`ݻ cLt'#ޓ;"FLt$wPhy<{Cdr;5"WRuc%1?ĀA@t5f;9tz;Cl> m-%6r1qg5s~fʰ~ԝ)?u`<#WJ\LjaE9;iŲu[| >E~!ɆEdl cyъ ri#i拋e"c™H&*&AOlKzמ )M)AfE^}rط#7]|g$pzDP_ %Cг=7NT a;punY@0Ì5#هsAd\fB4]+!ln ָg#)t V":yl=:D]}"Fgo!"G'\=:P}lVoO"ce07S?$~nTO)9`xG]{>k4: }$*Tg:.ιNƠ=~2qM ">A";O|{. z=xPf1yR "G6TD H(_.gDc0!><6tȐ\w<&A6c  ]~ɻNRkD]za{⃗Ol]϶q$],ycy;"X7#/1ɐ{غ1Xf")F'$O=kDީWnx&GHa%8wmV>2'z9&z|ķN`}x v,'P ȯDy}}o=-#.Al(qD{s_Suw*n _aޖ8Ehy@@9~y/ct7kU}Xdډ39 ݝSDw{,[<HS}-i@O.DǗ'/Ӥxe=)ףNe UwŨv>٘1CcЗO815bxΧȳ0N.$$)kn ָ='9< E&9j)vͩ \{?@9[3:m,ZgH>)y̘]y} nh#ocܐ 8lZ~ok0e"y @3xf: fghds"Icl`14oG\L8'=y1 ΓZ=C8ݦ ~bS4 "[7e/(֟?H 3 u8':ikm60Kl}}Lꌢ>zmǴo[OJ' <Qʉp"q 4DFf*C3kyK( ֟?R ߧD> :dem똼ӆ_JncdVV`w&G!2XQ[>W5hi O05eBfhE"J# Op,[%499a(>ٞ#>&8 lX`yb\osFM[7k_ZAzf #P[l?+JAlgsiOdHmuvuƔ:8}GȃӋ4(DGg!'ONs^csiml^یC!PX^}c%ߧ>[uc|F!g|;#;v j#^{?:X@`X`M:!06v T֍A_ !g"  ߱,@@;wrټ$@ e,9#к1X՜cElDU~ ?:X@`X^7.^`D6pn&!pZ}BD 8lEdVPoor]v`ݩv'yzL($dLe{Fccv dDîwNfvD^3>"L&j>s~2Pni[:?}[ThGZO8iZy˨P1@A e, eE@:0O֍"[jd}ϝ=?.yLK"y BS̞N"O޾DoS#"wS,#e9SD Km9۾%{n(ݔ\|d+?[ygsc+B;a/ Q{SQw)j #5#`@@ˢ=hNgyH{5_\\D(DBw\4#=L4aH xX"05pT~$hN! ێBch8Շ%{{:&Cd-C=Fp|F&Ӽq,M6o kĘuAnh[{/GX> A6ݿ( r]nh@ #X 0l@쒘]]]a@֍lv3 2zsaҽ]Ǥ8]"7P"x֎0M?l%ːc=7dn8H撿PU`XA y ׍@cY%S핼LU=%'XsNw8Sii9Ak !"x <[7_j&޽Ύl^tύhHR&2|h>ڄp}(9 {1Yj_OǦd{͛;7yqi/m9b7 L'Gy֟?Ȍ:@C~~cp_Q;w^|}3 >@VO>D_ƲrK͜J` ϑ #.!RM c:xeD|6O[7{K)vUz܃xp2/=albflN_0pɗ@^Fhm4䌭MO:t, es w1M/x'X{Ŷ?Uwq?SC@`@6O#E@Xf:gHDRpǡMw9a$4c 7OGqU½Ҏ,bcX~ƎG%IҤؙjLބ;'X|[s黧H`"hzlbz g>!PCOi?镡>U[Yz>˫yY̌}I ^X1Dތ;Fi5oDŽa6MMc棠or8<5}s FB@Xd/..f"]2N8/LuԿ&":Xl>)9"nlh=6{84|8xQ<,;" D1G8IXlĆ]wcc0T[7TU[Pl4 G4V~?4}3Su -.lsp-~ކfy<ٿ0+G@i~&lD`@@ 9c9?bL*~3O`V*k?=z/ !e=aF# uӞaK#Ou[w!]01 ^:|`k7Q ֟?Q ߧKlpR9,Sےi;3JC ='f*9Sga|A8(rꔾ ǚ3|ucP} ; gQwayKr{^ځY;FN#ls8m?G+S79IJ@B/uŠ0y@67?lF@XMdfBCeٔ#hoFt,>78C^0B{?xsPq t4DFf*kǜxNe#w^ؾH3~ƻ1uc5BA  @->ڸڊC_w-Al_okfOB~Nc&'~l&ؓΣvSeSd3X8e޽{p>d@d}Ƚ07Y(/ Ũ#2;$=38F|t'Ю>Y>OÏv>~D8uz[֍-!%1V z]Vz]Zc5:d 6#̫9M 9!06{ םuc׮3z@>?#">枙<(q 0 ͣ`B! .0۝5ucEl/O/5,&G䀠A zjwL!~ @d( 0c`,xr0ucf"A8F!g7Q 1cƆ2@lF+Gds9(0EE{"к1X4ܩSsps!*hI@@T #|- YXy3;y?™gMWYЫWq٣ /H>-5LƾvZ{ =E@^ˎ5#هsAd\fBXN@`Xʭz5s>s~fJXymJ Zޭ(y#q;@ƱƗ;?)H:L㇇h@@]N օ LɠDCn _ݳ?!"yR߸<ț3Q.]9n̘b ]zjܮFϐq)f Fx= <r( 4hlGdvP4@Mc%1jC ^֍lv3 R9Iwׇ蜷)~>t a"go; ,G!z?v! !Cr#" .o,}!g(.nw1w P#2˂pfow3|D0szzk-LDrUfڐ -|yI2ԏ!c×S v_zuLwt;C&Y<9{>߷GgD'ʷ7rPL֟?q rd{\+_x'ټ| @cY%S헼lb!к1XR߽{'٬=5 {Q:ˆb;8q=QlcFۙ{y1ykJ"o;%!-s6 챓rm#PE~^!>h=CU ƲrK͜J`V{.vl3v[tG`I_cZK"xZ΄q0d$Z;olg] yo_}EnVT<(װĠ.DFNx?{e1ܸނ!a75Bh39 hy.k?Id'x>S_l{G/% S2l`%5:Y&#y 5pooW}CLw0+ "1[LAxxc*Tnƥ-` 5/>QD0L5J?z듇 ֭7$a !eT:c(?5? 'nnY=59S_E}'aފ8AQ?Cs;C@`2"?;ݿ?} 5RO4._ʗ&y6$g,xg3.y':'$kc)8c&yy8jS捿#gDz_N'^)ÄaJb=_3z&ep^2yôdz[7Q]h̨8av#q ]m:2gO&ekm]Z!1)]6~>Oy!Kyc@@ ?g__{gg^{}\OOvz姺uOmuʽ_?T?_yk3HQ׫?^gWRKW]~^Q?o^_c/uzU/oPesz.uƫݘ7_5{|ѽa7տM7s׏Jܽ?ou}_sR]9c9/O^Ig'0+~<:^<Ϋþc!(h}5`* c1E@bO Ilƒġ@l :de혲6FNت}zӘ+/"b;>cg"'KxQ=YM$_:yC?" og DS@`GF͔ b4?BgslR#FJc=a4[Ot>fpt{ATgw/|T I؂L$ȣBk}t,2S=, SWZ"_~F A6=A>ͯF7_]tW/^ /_wyIn؏wO~G}wcyHa䁝oKӺ1k]. ֟?˚ HCf'awO5?zIBO>Qd3%1W܇p3d4gUSR@~-'A#_S3}Ouw}_L/hϿ~{#կ'pcyJ4n ֺLd3W%[ ?2O@~!+KC}i3 yZD`-hDQǞ?(lһrucuiSuڝpq~2J9x"d6SgaqDɇ]2>Ki*}΀`l@!, ul=FFm͎l~᯻O?}r yBBi0_~S7N &s6ffJW^>ow?/k!6x6'xbɠDCn _iw֭ 8ofG4E80g1M񨟋TcQVfݾ~W,'.Pir 4~o 4{sS/Ò͟)E|򁿰a4>޽#{eIbBg0γnNÆy6?b=m~M8 ?i=_ާc7_hh濱IJt?˫zon~&hOݧWcaC?98OZSf"?}g^Ɏ`Իݷ0l~o-B[ymjw淿6 fG0柙>#9: f9} f|K>SfN6&FO%f"h}w~>9?DѻNfl8aorߟ<#  0m߿mgf}6B³6닑͚X6 VK]#ן6?Ow/=~ }Gm2ّMh$=U;"#紧sd*F/ڽ?ޓ{Z(7tr@~ǟ )楐.UC 56γVhfKFDfrc8 %#/iOÎNcmLwo=Lxr8|o39!9m~FoǶƝ>>[U ,!ykRC8L6?Z+ }tʛ Lq FcS^:_.#ɻ?>P?}v3A((%Cz޳lG.d6d.c^ DXvJCZ ۴$> ۑ3.$_>nyTϟ5dy`?ךq$ߗ4UL6&\iV.#pc7d h|l2F {6?u}͟9G6+og^rV1)9 ]`>.DFNx?c!h^ꏄ7}rl(&ulklH0v,\ϟ% d'ӱkݽ^^dקtS×ʵQ!#0!go?o$~?P G0k'lr_kc6c|f ζd@FG#ݘTkn VٌZi63.d*xx ; |X cax\r 5ǔN'K{ϚF( IyD4Y# Ob;d,lϟ $TvDSTvt\/wAGͮr }MBq!ln䕹~pu;s]&fs|1^>9 O~fD6WF3ܥ=Yޛy5ӿv/366IjN㘗pX:m&;ʫzˮ=Y^$͊#>;IJV>Qf͎tƛwzCl.O4ld/..f"]2N8/LuԿ3\xjB~a߱Szk.W&jк1Xc3U ?dPA@r0x;GGդ]½&ml-]E<֜qF~=0F~GH{%M$muP 7:I@6lx7lټS'/Ӥ5 ^ Cozc0LX¿8[}9<4Ke\k֍AZWCBO@`}Q%`h'$ {NKiƎsڳo k~L;/a3;91k}Ou߫O: A6Zfgg1H?7]3"Mcki":Iy,!;NδGGˆ]׺1Xc3u4@ Y.l?s{C;IB֒}:o(i[!''fºy;\'? Sɺ!>8É2C$ 6;($ A6l,xXpvd2m}Ć=7LBfz"e:9Bz8 $k`ƠfĈ@Ki k@->I۔:u ʐˈs9y?D~'ݝ:9[Ig7 էl~d3fb{iz4=ÓkD Bs<,qə:g] 0[O?#9 n ڌ#@ @M )qy0Đ\m(npy;\ h > aqhݗݧ'\r-g~g3f EDD0G3,쩹j@`??KF~٤~FLH6Yo Xۉ _tm?o?=&;:}}XeU}<ݽ ẫf_믗K 'w?)z{]~+?r<׵]/\?ӥ_ςlټI@@֍ڛQiA@`Y$AH P J[ 0&LH6{gnD3ս;>cHf!L3Wp׵9^^#,ь{>IP@`(<쮮vDՀhك@@]V29ۿܽm~x#)EBW~V߽i.1/@ /d"?4Xo_ h<+T+6'Tw|ƒͪ>lhd<7~?dއ]h E4?{0|׍C Ѱl@`/Z7lF/;M0w\ ZRZt 68UA$C'@`@/!%g i |y>s=SdW>ރْ_U^ʫ3լ5b6qBh V2hߌvݭ[7ԋy3;y?™ggWzej'fN}žCYNwvtҝ> .Dym3OT1* 2p@`@qV0!0 mr@F#I6V% ItB6D.#AK,n3<̃3CucfXʭz5s>s~f")R.Ek'sKK芸52Z̖0/껸R$Wňrߗ$u~?z@u) 9†C6W[?W:Ih؟)k0٬H_ A6@Ơf{WEL21L$}ES{( 2{r\݉$"yRCMM"پDx2'|Lx)"%Srr1!?C6oj;dGxAD6 iu~oC~{˳/ ?~%{cla'K4y44hOO?Ts6 0 A3b6#f3b6!撘]]]; 56γVhJU~{vv6 Vki"Of} Q"B=mc#"ֆ=Cj2yyl5H16p&PwS2m}$+f3% h&f٬=sl&fu!jg3j~C0PveA8ᷖҭQc6߾}3̜l|YzYD-#B瑗/c;b7Gzt tь'{m4彎Ucd܏=ۦŶ Gdshp_w?E6q?YݽUԬ@`D4ShOHr\'N*$#@ðaܐKwrQ\h&;$\1L-|ė`!? & XeP\M}S,M1j 536F) h d3f% VǓC2,r42bL}I%E8Q.q)pQi56E!à ~?& QJx<'GZE]^4F!d3fͣ%x2M:#Ӆ%mrHe 0=c@)d?x6DwkmFGSpBz5~~O_ׯg{]zE\_z{^ͯHXV޽{p>d@}==xwDucftGQ @L&r{L}nU).j0hLԈ= P8L?αg3?dpv?;2d"g {իzY'.O4lq۫S[r[}裏W휮QXLZc磳s"5KzǙP|ahLxEsG֍У*X=?V?"P[l?wܞ%,ə eł M #. 0#la}0Ey+{2R%?vw(l>,hgx6;yMd֍ڛ/F @cqv~ow0 0)_O]|L'x_BNntLH6Eo_p}f"A>d"OU{~Z&n>wL?CplV$[&YLIJa &?}n yy\B Z7knFewuu%15h,֟? *"PSW]E i#0)w;\B@9E4S@:#FÄHUM,٬<' nU"5n~;?g:rl f dz~ۇ/w3f VbBn ڌ:fB.֟? *"PKW] # N6SS|;jG6S 0 8F1li|]T0tϼ~~Bj#/+g^ A6ln9 "к1Xe3ziSu,Hbh؉`@`T3CK@} ZG@lDs)l2p1*]D86f3y(ʻDŽ ofw!+♅SAq )*iOhHfw!f3b6FucP~3z]^vnn|P9Ѽh,Ys=쓋RaGgwW%(SѼPR'A?%sQO[Ɓ+AE@`$d }y7&!5| 14bb6zt6A{x$TfIfo=gojhXjO,{8ólLB!к1Xc3zzcl9|z}Y9?a3G])Z5}%OntE\q܁_A_KBd#S `֟?Рi zjՃD@O${ Pl9 /C6z51Ù}f콙 u( sĀI:_7f+]=S`Z76ݳOm݌zf'`dȕsJMK G^Ҟ1#="ky OF\L}&=M_&^?17Y|2H=߰#Ax-2hʝ˺XϟQQBd~.,X@> l=A6k\D3 q eꪴ _6w gG6kfy2V5Xx |k,vdg\{ [⒵yfÈ(<'gRVCr Ԉ3ƻNYހqM7{[Pq"՜T[eZ뺠`ϟQQBjwυ@ ;f &A6OHR̚I]M{!ʼn271L T q`V:o@Rل Ih=C_*>3F.DNxp ƃC;0B{z|PʲO^V=?`GDc϶icsmn|xQaIh.Oɉ?9mIa>cW8)Q ]'uo&X2|҈z(@F@`  A6lټR%+SI1} g?@Fr%<{J5D_)/ ]rSU6lALD3(V,|" YcðncCA;9#;(L턱vMwHHb0pv/ (,Hq'~e%gdˏ[,]#ʷ!" #]~HVs9 XS>@i d3i&O6E6Sl>tR/~Ćあd[ΦL\7eОa[N =vwçZ6uc*cLbYi}5a@`UxR/bsvY&V/fӆxηCsc~on0"d3f;>|򲋋K}qWqe?QX{S+'2Gyҫ4 2=n,g 69zG5%O1HMVhmr5hYU^D xi$L[L5h!r@sf5D{ }%gfNFu9|Y/2q?G`@d3f ': G8SX "څlNk.1ØG2{"CYx8GI֍A%@ B&9jg-lȦޖvSvj~* c8EJTH+Ek@} f A6YNJ@"#d3fbO{i؆ z's Կ!6kb62=x}'G<]mƫ6`c4B(غ1Xk3ɇ@2?*Ç 1 alϓ3s,:ADv*%CiM kV'ks<ǢA]V4  d3梇Fia"ɣBkbZ7knF֟?I@lB~o~F?a~=z A6lTCucfġc Z,` -NrF]1D}~A#d3f?I֍Q:f{yz]]]>u#gݳ遀,5dh,1$? A6l<'FXZ7kmFLd3L֟?y jjUD@O${ PF6?ɧN_?gwuWzJ7{U]?R?7[=׳TzZ^O߷\ϩu\?z]U3ݳrzNhpq_Ua,O$ڑ@ucuiSu,:h|@&U{M7X L,Ed /=߽2.`507G(/uVwngJc2zp7 py%ї-Ґ،+X5[fN6G_|I\Js9~Ɋ蒜gO< -ihdwkpPl3 .5{ha@`^@k>0u"yBD<^D᝿ݽソ'=T/CH =}!|qqx6LdsL8 }|qwΎ'{y;["g!|{%}ʚ h,#zgTkge%:H"}u;OU4}('w:B@`%@d! ^ʕ׀2|嗺A??` 8fG8SX "*%ObM*>v6߉ 1Lty"goЌ"Mcn!)Mc1? r<$:9o~nLVDȌx|E'@@ZN0D4@%j. U%-h_ +x¢β< ?t?2ZbQ__YC(Cm^z"|+_>ikmF޽Ύl^*Oel\=YKWnْq=ElIUF> qt/T2@de!f b8P!d'@wq @t8Zۼ ;?zl_D4oANNCNex(eNG3>@`<\+}+'GfԎLf>OLZ`uN=~T<(Cm3) #;[D~t \زMC)C˿ |3L[oF7A3Z[{9X؄|Q!]>G^~'g* sT//7> 5#qh&<9b'"ץ{!p( Q*.DVlpY%aeV}T@C @`r&%_y\/_쮞a Rw+d3| A(ϏP4'T<&hA^v~}fh<E@` /@pȑ>ELK gsI!J셭?/S(q=kO}_ͻIklFkˌRKF@V{f N8D8ek(_Bs# T(*9jߐˆD>:1 Sf 2Qz@w!|l׺G;#xE.NVtdo6гŁBv1mCxhijvbOr2ԧ>} &_b𷿝%)t?>X0h@PbjC~\ pvdqQ(sco!,g2` >i0Ni"տ'ggC8@u yF`RC?wsíd81Kljbux2GDl=Y iL:zb;HTaP ^'^׈\!D^Zڌ \0X0ӄhNڒ{,6Eɜla1g7YW1a7b2)90ع!>xֈ@eDiD)ƿ2\2/ZQG4 y) rC#@; ">߹փfx'#,F5e.$]U6*#=:3@8/omA"y1F@UV¸~ل`8Ddse{!*z!oFO֭[͛jԜ7##Y !5s>ɫ x FuOf~h, \y @.I V@"[jd}e$?lLh^)6o3S#PC\HtB'b5Dc^PM=31X  =}!|qqx6LdsL8 }|q {tvs~r%=: swk/,oHlj_'u1%|@A.Z. @`r 4hlGd3fx6W^PT(@ͨlv3 R' `MR Ƃ2Q2p=kfٟM#S^vCjf՘-zQ}"\9 w1y PC;]૫yQ~ol0E"2=[pVd7޻l}v g"9|}}=}G [ocKښH&Rldh-1|ÇV1CeuNrܗd+\mC}vSٓHU2 W6wQ،. !+z]tCX P~...f"]_N8SL*Ty9$Kb[AB_}M M>IւL!S&H&'{+hK\`@:s7ZQ`@!ZKE~P&Nh&zOD6b< =]߁70s6}1Fm:N]Qr@.lbl^١tqT3 aT& dLuD je%++`Eoo8b2\B Ps3x!"EW^4F~'f QO=% A\A)"Z9 ZU ep$5BGDG9(V9: j[}]6N[loӄA*UE@`@/pR!Rslnn0!eK+r2w{td ><]гa8 N*J;Dpoj"}mw%AA.o߄ 67wOgCa1cmx<()UA@ݍ%*8j Acl?2\M# QIIT\6ά'%<NlAfTJɬu@pnt06I@679m2\lB!Pe3jA&'ل  V{z0}4%φC c?Gpa=Z" B~ ,q`Uǩa+d8#B'tۙI$c؄S?T>Fw~Eп O*O.9oTr9G1mIq9ǹ>aFrB#jP6VqC*7aرVP>;Vs(Õ/4LD3(1C=xQ¼!8\A}Jד^ " ;$dD:Y!Oѓ&Exr6;r:,tMSfS}6S͓&H"[Vg2;1(od|&מXA ( @ͨ$h9$c޻lXpv pߔӞQh%1ٛNq=."'X7ƛ"O' l|\}_xz">:oSC, ūlN׉orvNQ jn5ߪ&U< 0 fTdh/9jwgG6kG! {B8d9bW{b ̾sgr߼gkX 9iycOVf@cȲl1eTBѕxLTͱ=rUg$6rw%ɵQ[K;HGqb协f_-ʰYØAf ?пcR)l<^/I)w~{͛cT;鄾&vskÑ$qEfa<#TWGST?,gFQI?r@%4ݝaCB'!ҶLkO^Re]ycke zp(ŜKKl^& Ζ%7fnf5\(Zȣ_ ?6h&։:R1cƆ2@lF+G`d3o8c8* =UO kf|D\-o8Eyl`P 0Q-M{oU 7?(*Qf\ W!@ *#PE/UapF/@`'i'H8[ ׾ oFO֭[͛j7##mBZUZ^{)п<X}=XBR ph8C 1q5g'f Q@7E6G?k$h߶m &4ېul`\Ap5S Af'Ͻxֈ5:dP !Pk3Jsfլ"k!g{Ofj%Y8N=o51=UD2k]N)Eprg&Y% W9zN@i60 P@ͨ"y?8&|;"y6 X waGź@9# U 'fN%.'rG9̋fݵ-àả),Z2m#@9wm(#$hCd8P !e(-oF7@3ZcI%;Q#F&e5JF  0_jwwb)E6S w5N>Ks(y)*j^lS^aM+C]d#?ʈ". /=ٌ FʰW@A@`"'" }>e 5c^'bBY{D%xs!wz'rgԮĒԇ>Er(0'&eC״ɓqrѓ@ YH 0ːqmFAw>s!PC俚tVy"4Q8Q YU>D\>* '韝u mQ𿏕%L(6 bl:Pp@kr̄l>l}JcMf3J1U$8"F.tI 6Pg݌>.@`;п1B VjwgG6kOx=pA'n/=q>XoG&;81io S$%;M*I .*ēlz $[$dےl;5(-ok6CMtl=t +.DڌN4|4V盛Ji6D@Ax߳fT?>6[bs+Eav[&tGжN$h28<{9Gϳg 'F}b@d!$Dɂ(DD H>J&!)P1 69Ǐ$;ex AfTD 4 V&Bjw"he+Y^eWj޶ǖ%tD}zH# fx0fla[`c)>97ѥ0o{;q]"Xfilr'Ǎ5*;8 ~4D}$ku<[aw\i,"pi'=NeTj:>3h y >%;\F~?fC`$4p)qsRkî$M&snNqw=7u:xXbË(uuBŎWN|d$P*gt!5.fa7ABӐ@_qVpPj\;&.SMt}oTDs?|f  y ^E.ϕ~!8rس3NH|_:JWrPiu$lWB`8c L/X=<<Ґ& W3D`$P2z:jbp+ox{muiME} >%(a1Is}@ly  x(]F7_}ifElg> \‰g<̮{L/)W{ YG`J[ k (շ G˳a&@|M!pbyF@VìxYY f'8KY k\I"xXke+f2,fY_l^`moj}Ϸz)Ca:.C` ݙ a&@|y@y vN`WM eg7///E`b8&[Xъ,?bt W i9SLq1<@񽟻]gQ'@|όbDY#  Gc8DelRΓ^EXB جfo]”ˈk;T6A2m݌PV?& y Eu /|s qx19 6ʚA`8C!0f ON-!W$6dS_Ya,gd6G iA>#O'kmYKslcNdwRJͮv'߄Ѓ#1,ZlABg .H0 仌6a}䩕: %@]`@D|\k Ga1"p,fjgFv/.n7kFLu ju'*6°ΪhzV<֍;e6W#BHl+cUZTNߐJQ!+6 !;%ﲶNEE $}u.=G;ݠ8h1e$@0!@hfX!@Q(F}v,%,ɞ^[[!Ww EW=4x|4^=g躍ۨ4OL߇Jj:xݽW6kќ=ާFcJJ`!bs q(&ᝫthoxA&a4O8u:SSe!@0̂E!py/WqM [=C,R]z18ىͦF55^7f_UhY$8ad8=MK|VeDz4@ܟ֩}-.?_$'=g'"bXs FJMiV҉zW.0wnן 3EFm@0XREAw]JI:6YɯHlHM T2S4?uve'ڻ3p]' ;:qeGgT͉,v]繯Y`'D{ 1 hX|JծCj[SjQ.`}i-1Δ%qfޘ ^(Jel  nq"0,5ƽRZ\տky]T#ƥ ih~'urc'B;uZVMUnmfі =js@7$ 2. "|L, > !]w}̥ROMնR*Oխ\5o86Ԉ% /\%P2Z{v }~Xs햛kuw˜ wv&9sd)_)Y[Iek/r?~tݪpS]gJ>5eV@` Qt{{b:s {?@/}Ⳍn}e;AB\)=ŵt6pR6WIAUOFԙyԈZԿ~ᢎc 0@˨ElFpud @K(9@r.%hYAB\m6Q*(-qU>T_+׭ҍO՟v:S1פ^@hݑ^fәh=WV>/!0@>P@w 'xYMoPp6-TJD0,I!pc|0ƺlf'4_&87bM3]ѓ%ěnYಣa6 E@[8X|֋U n*3(qu tSb:=bdR%V؂K;!%~) By%@ #aF, ]F}ܧ Y绺Vsg>܍8'LljKM6-}uftz\w͂\`hIFg @}wC sf}'|# 0+^@V%.. RVCh'6hLC]Bti EDBߛOS>*5uM{ 5ݾz"H}z/r Jwgk6pf@3@l^!`¾ p 佌f]҂Zl~d7Y"Kۦiܨ f6^vʡ8[+:iޫ>њ#7swBπ3 1s@l(A`$H` J\'8;d5ו5&q-VVsYkGc:m`\dQ]ypβljr `0i/{9ixE{Ed6\Z0_=cƾ }x 81WOe&ON-!יF}:cHnYę + Ƶ-dW'c_'`t q1ಙS > I T\Z3|VvOq{sz콄cAS|nhʝOɧlڐ\Gyg #@0\؁`F=m"4Kiq/wݦ$YڈiskU "mv}qg=>C4}b)%6K1n|>1;*LH.uf>Z6¯?EuFcSvr=8/$ 9ƥ!/dkO/6 aO>}%zJ\FAngB9<@|cxzz 2EPvl?T:Q^ihި14 V{KY|`!o˺͟H~b*n7UƮk62]ǿ9AK;>g3sQ礳Eot7Kܝy#[?$αU[^64}Y0,ZlABsg .00# 仌4d}sƦ=ǹy:LD|\k G4"e,jыqy/fY?Bʊ 71+*Cؗs\ol u^Mc-LwJNf~}/JOEi-.e;&%6k*QtikSKhPYP1x+<֢r2l{ԃ;`<YXLKΕ+"@0\aa*"%. 0<Y[$7懇/ B)gXg8& &n.NzRg?kK;qF^=gb<^?~3 {U MZ܍O KYQtvq]fh9Fc`4rX؜ABQaGx} w| x X$aI 佌^f!_7c|0\6/G5ʼnVS|,r3ͬu߫`f@J, U 0r': OrI  #fd#P2z:jbp+, R1e|oJJVz7ä' m;ktƵoKe~. x}G}v5ɊpbwDŽ(BD|/(B`e .K$//[l߷uxN<7WvGee6;Yj-_f913M/l5骓z8֤#Ewm];ڋZ[+.o ~N^}w&&nqY-o,  oo pJظiM/m@˨n5_^^*-8ԕx32QY69:|%*kw-'7"y`}_uR!{\-|wy(H o|w ͮ?sWKڣ @la:  ynX !P2 Nl6Yu)IHlkw2m eZ%FkVr3?^֌jLfsgfOEI߅f@`:lbyӗAGp^I&@|_`N 6qs=,9E.Qd4"@Fהp2}k~ld=TqjwK|8Ai'ߦ)68Lɞ>q8xF.wA)XPeП\r̩t$N(F7TҐu<'ѧaa"@|/m!,^lf  ~e/,B#@NjݕJR.k+|S̸LTԧbƞЮ5dޘVa/{9i\2EԬZms Eu p}%.!Mm+^A`d6j~.5e?LHV2eO O9eM&xeRO2X21",{;V*jהf)a ߷~Yg @0"K@|B-vDU$P"Ft5\0b/ee2߁t.!o׹{h̪IÕjlS̱W3.Q2;~!o}Çk!9wͪ&wa?OJծONIG$i)#M`pTY!P2z'@!}v,%,Bbi:O%9ܣb^'l+5=Yߩ}av ߷{x YejD 8xNծw;U{M ip:  UFB I e@NߜtY&P*K/wvb)QwKKE,KESfB۬ A+^|)xڹS ޫ'dJWrPikլ:A~`6`T խ jNŏXoDP539;RR!Ud#@͆!z%-umFГ_z=Yw&9R^/mކJN$kj86m&8 HS(,6㜭fU]`ۡ&yC?G|(Qsʚ}%:S1;P]Yd @%!"4KiqNJҿk\UP6~gN Yas@ݸFxqu05w=񵫚*7l:PN6 FG`ȳ(}]/9,@ygX*RO p<#F@ 7.R*٬2׮2p"Ƞp_[~qg]s2we.4rɱ>0UքulSuelwc;@>,] qza-6 kVYQ+T>U}(KAb}MrH֚j>&Mv5 u]9oa&@0 z :Yf>?X^,v KfmX ZN ;L`b^嵫nVsk#V+a8(ukQ(҉S0:´A&C!P2Zwt?/gI'@ό "}/p 3fy y +'@0\b 俌cP}a|4M9Npn;Mn4ۚf p1bY0<(O`  w 仌od5?=="( "B}ۨ@e2 v-4YM|3n+qOmABl eaQ&v[&+16ؕZۘїUe;.dxӬD0`ئXY",᳽v~M)}aYA]RVPFN>N5 gbtM6g p-kf@l@a@˨n5_^^*-8q[/Ʒ)7c/SXR%he@g@RoD @5[Vvol4yڑ=q/ G o|fןg 3c&<7QփHÑ(u}}}mg'6溔@Ng Fm3Վ Q؊ՉAjwvNC3O糏Ou'kڻp>~ 3)Ac,Jlc&7}{gS#@|NjA9Uք (%6 ~um '"9lnMNq3\vj]JB^\(6j"v*]ݶ%1lș?3ZgI7 &K[\sdl@^_2O.lTs__Yuzzћɽc38YZIW&L?Ye'~ *.G<(O`  w 俌#RZc+4K]S^5S.flh~8Zn.gli0AiH+٦~'v./M36;jx˘ϩ<0;C S%+\֘W*Ώ }X0rl1pDbL;(uvnЗ} 2bf&XL ʔU 0mAc݊Wo:wH _|f]_-8O1եɰ4o6o7\{ mݛfycgCe|&pɧ؆/-O#uKɭzN7v pI'nv='sB7SN|R|bʌ#z#~f }.-6 a2s=9+,@L et/}9-T):!lyFj6zͺ(FDK-72jYAWqז з KXX58Sf}{ה$QÕKXR͓kѨa]-kWQW__9׸#g%@|I@y  5HP`ҙj(0iA&mpC+#2;8  ^7A`UJwg'6u"֤WTO4\ePitvYѝDGgz@ :˺ofM+kq:ީ-*Z8eLCध3>GV%"6w]JLN)Զ>`ƿ-(u2S|E} >%㻔umFГ_6z6;׵-*_>u;9YXг{ ӝSMXiq":]7:N*TzTv|H|B 6HH4Co|L^^5r&9/Â(ytC`^"4KiqZLտ*QJuF)4s+5]o׆X( 4-4Rx]ùW 7]4"tGd 0d$PXl,bM>5Ad֓ tygJet̃3 ttK̵:ׁ5΍5(NX\AB !.k> c DC3]{%qz#n qc1;@&l`WmfsD ]0rf`ݳų(ym3@eIl@bг1Z\ &AfxӈVnw|i=@˨ElFp^sepgW@6 /o/6!di>f77kƗu1k>{\  @096 >WF`UG5]pֱ'}>&}Gݙ?cdnNtH|47ŐXzfICb2qX%(ߗ B&o*Q!(C@z~>VǏ_P. ͗7TOE-uLxc{ 6o>.o jȇ>6d%@͊!j`<M@lAr  {6XsJ\Fw}W57YZl>~}O$bGݦ`a`}ƴY?1ߌEc iD涔_{FZ$}Ѝ=#52'O@ fʢ}p @|_!` 6@i'N eX}՗&)lAYXp8gP tt^p%4\fMo9Y Ŧ\ nxs]b/Ba>ȾVsUtdF.%5=G gk,@p1 @|! 6q`k?A3Qg)!|Lg%k%_VKTYF-nVq|pwr˴N53Z/dپ}>XJwkV{C`=:  &py/>Yl~yy,NLjj(g';\yv8\7uv.?iCPYa2UN}j]$DÌL,6@ o|fןy.\<(L`X(u}}}mg'6溔W$6wbk_C窦r4?>E,>cAЈжFi$؈C}py$h,h v5J@q1K1&P$1\Df˛ 4NO)ub>NsJ Wzp)͛:NY#O !` 6%i3DrS^pnR#*luR>g6kLc-s%YգCP:MIsl~(2VD |/}'\6sX9g{Go 3 t/6SjC`8GV@ /Yf):\|}Kԓ.'P"Y)Ye (xuo7Y7#YнseSM:ʉτw8F}?g%hU}pl>XMe>g~߾fy-c nS S,kg)T֘WI7Q a>do }͂SkhkKPބN? cAseXލǑn/ gAZfH~j\NBC@z`9@SF!P*K/wvb)Qw+;wHgco;?oJr{Bv͇]0i[?a[b5jV494Cဩcu/GR `몿}GVgON5~ualNͮ5<뱑`RJ]F9 @rJd|ENhz+tkUsa`p<1p>4ä0}Um?a8F}G%PXl2kͪd6! j} tĊ]ILD qGkt &؏ɦ^#<;,P%/Cmd &@ɀ"0,5$ oHqh 6_fU n7!߇M 8zVkq7|z8:YDx|,Ʀ&yyyIeFG>et|d%L%5L%ƥ)wg.88YV=λĺ٠F\!SDh_++.Cp_a0>!<ޟ_3Qt{{[3Bl@1b'P2/B` ? ErլP Q} XONe<Ǎ Dwwn)oĻ} z+Ⲕk0RV _mMA.u\I@ 2(uuB%wAcIL"P*O2I@@/6 5N4Hp[W5!PSQciUd]zbtts@ߴܽb? VNSQݮ-m@hݑ^fәh3eEl@x!PXI]@$Z}ޟ_3c|0\6/t锂 }2QJwtIW_F2b+=8̆Wp- S[?#"P2z:jbpkTSɝ@4dĘU'6bpԌ\  %B\ }G ؼCąu ~]F7_}ifElg>܍8FcMFWfIJ)ԔJ6̭w|ֳY?1ߌRT$WԆ4K蔖RM|]cRv4>CZky>/~ϗCy9g%;%@0&f'8KY kD`+.K!ǪA3Ћ^mZҌssP7sNDcˊ~n̆aA&}s{~ ks\@~|R>oODsz}>fd>.'0Hl?O^+@OO߮>y6 B/,Br5&yv kR鞿F1\0l*;e/SEku)UuY_K8^.8 DVJlrYc^8;fIMܞ$.a7Glв0$6ɟGŸ #U_bEetQf3&<,^\Fy8 >d6j~.5Dsԛ ^hkr^M"OD|=e'oٻ,θ ߣrݩ}v͚(] $qr⃔ѐr y ?VbXY W!2z2段ؙ \Fwv Jw׈ufx M,VX Fm?uػ:Ξ2;>r?.ݭ()V]VW)F0O |@S|retÇk@~L,;O"6w @ 俌cP}qe3;ӁZ輽G+c9!{$#cb<{ ҵP'^r[p:.C` }! F FNyv,@{!P2z:jbpKnf-ZLZVfm'W^l|3^mu#j8nv77VDv7?7"Վ*Y1C g GÉtt`:?#~}\68 0}&Y'@|#@l^!` @/MVS,ͱ,"݇q HlS^%40ڮ8'0%,|vsj]Uʣ-`+mSry벒Up,ڟﲯ=n?WeM'JfRRcп.01$/'NCWfH@l L$P22,e5Dbm2p0*ms+!EzVGLFNn㏫kl(![2D}.;.ѝO=S;z3i\Fty m^X ;!@|A 6/x0L eg7///E`bxd*;7]#jL/ʨYAg'Nwqߺ);z}nUFdʇh_'&;1;fxC_?uNmj]%HDO&gpf!7fןyd qwy,@k P2 Nl6Yu)IH4|AU8j'BACֵu]id|>=TpЈ#ZϾski$C9:;:A~ '=۞etw@^pM,o2tL:oj/L98?LYc 6%x@@Ce[lf[>C/W9DNɬu4.DNc>,qjb/iZ5=TMuH׿>Twh䫚C8u#ޔ59w>0v5讎g!0@^_2O.lTూs*Ύfߢ}oJ2F> 0'9i @i"0,5k/ϛ/siq#(],岆NQRo7xM|y3Z&nko7Mmg$.'@|!+@R͗d> @`,ܠk8C1h.#`1;#/~ OOOAfʮRYc^d]&jU B̎&JftǏ12~̆ K.ĉ*.WfX]75s]Y7 d1Fq)}*eO\WxvY1aVYq&@lI *q; 0.pdl@uf)gXgxQY)6\3@`p֥;[ L&@|bl(YF eto4%e k"P*K/'8;ٔxH/ۺẕhj c Nti#@|ـ@y @`J]FW !(\FuE(?l&Y/ mNrM>i5Tbto Qה}K 6_B k%/ 6Jt|Y2/@`8^@9& @. $22 ,B`8D\-nDyA) .%/1[T.hX 2 ,@@U 0v7z@ :Yf$etW@> %@l^)` @hݑ^fәhW`ta\F C`4}M[%ؼՓ/@N eX=?/?. ͗ κ3}at?c bs^@&P22,e5DqbQfke3e*Dv°t^|Fca)״BxkfZelCdFwH\E(\ k+8 ":Ny:;fB 佌f]҂Zl~w*& ً"YuvM:Vn,FKϗp$G+6=dRb}vCm2;\B o| ͮ?%ܽ {It@"P2 Nl6Yu)I/9,bqsԔOe#bZ2} z(C-xک˃ i886@ @^pM,o2Ιe7K٣ű@l^aa* ,@h@lf[>CɯHlncA7jǛHm,Y˭8pPӉ怩Φ<0dL\#.k<5luu/fN5/8 7BiϱQ`23%7es\/y9≒`ذU9k<]. A 俌 RZcDnu_s wt[7lﶝe;&lDnPxxP:@Gγ˟@J 仌fC`E0W&P"Ft5R5m&[aԭ6ٷ'ZuT?µ^ ^ԺCvdjk&F X7FnqU&$du[Z[M ͝<\G=+;@l.X@+%P2RT 2# ,@uf)gXg8>g﻽ڌ:[Z0$8RťCǸF}]cQ:*-fmk'*>\SfL #븃g4g 6?, {])̆Jp]Aa& (ߥlJhU1Yb/&c0/cvzu|| B>c bs^@&2ah5}ko\\ .9 zͺ(HF|햀{4'~ڏrL~- f?Qٯ։JIA}Kןj#Ѻ՘Oma]X5kVdS5.b @`J\FM \FsVX k}v,%,d&b_}@Qp"ܺm=Ft:qPHNIe,[!YQ0#w廬} 8-6:d|L\1s@l(An佌#B.E)VAT|^ Npvb)<[зNm3{xխUo4g {d9uDU9tgJRK4 GMI˩F'pL+{v.8G@%{X{"@|iR 6/d Oe "6#8/12Ѓ,,@1'@|_ 6oq(r}\ p]a=r(s:WKyGa t/X=<܍D2bZYN~XL6X6Yj2G%5Egk^}n-F ^9hD@}~NhvyF!0}<3f@`nse=@ RVpvbjK9OzlHTn3ٗ0˪&/?jWÊ̒, ǦDUm[gzL3.{>}|iE{Ed6 #8B`8^@9& @hCVlf[>C/-6wDe[:Cg&W֢3fOw6e;i+6Vx6^{L!e#? K.9xNL xX+1{Cf?I6b u`=,5B_FO,RZcAnZa氺H~.mu#@3J#]':jTdgÌ@Q @ٕJR.k̫S@Q1kv0~猍b߹5OOZflޣBrkͻ>~ K/;.{wߏ)lA5ՂS]*k+z3M7oOɇ^'n\O~Iz?7RJm2/^a_ע8X&6lE=vzsVX]=[< ]F3e4x ^%nkD^n<긌Ȩ?EdglOIm ߳>-2;u։J v\½to7"WRK}YW}+x(YSsIUQԊ#60u7{8@ !\Fr wݬk6KI,-8"89b2lmV}隿a/Z`5}s_6 WJd=k}~u.6sR˱o.8ֲi Ƕ1MEMT"S{>'18-ԏ{?3@l! d"2h .<@R]z18ىͦij  DImfs]3h53O׮ɴ%*R{'U7Eagk>C؛[,{Xo{&'JL|̖6=@l3 BetY;'etCFpk2Ebs0SkSٹ7 38/^'lE]k2sfY~Im<|[?w4u&F{<'en8yi"}&,  6_ o%/&Jt|Y2Ƹ5ٓE\V|}gJ[ϖ2^evӶ{^>,J[(F}ѓIdm '2]эuЗu}R|=]kM|_Ia 6ot (}C`nq _(L^5f@D%/1[T6zA`  pe 9 6A5 @`J]F,b3.= 6JT|(N܂U ߯ $̃@HeH/L_i&etǏ8IH|L Yg"bE @{&2zCfvBendsSnO5js~4qlF'/r:d& Y֎% g⌼ 2&?oA0{`{y @ jNkn| ?vf>j_GtWEF"P;#s3$z\Fy >%;C>GV%/\@5|cW_槧 YecYDw#C{1WonOͪPoܟ(و#VhΨS3:k:?]=Z,yc?}v5gQG<;etH _|h Q1 6gC u%.. RVCh'6;Օp%"V m6SLע*ad'1j4]{}DUx2;>rbxuCVGWV;~Zo2#UOe2-+C`Jw5~{{[;F@"f@Dy/>Yl~yy,yc2l{as6ٹ&WZ d'F#BaQ;kBo=G< Sv>eAZH8kBwW쒬 ߞs@lLet (A`~Nhvw#d\Lb,@{%P2 Nl6Yu)I/%l^R[[X+6ǕŸbuc鉽 d>!׋>僲W *yUب0*BII\F/""2Xe4iܘ9 6I @`W\F’d4"@O~ESl73Mn69pEwF7 N_ *!7ʒ7^֌jαuLhJ6O~{'r)+B`+BݗAre376/=TO5|B'Q괅I-嶚t]Y?%]>)/;w)>ğ:3Q(,@d#؜ - C 俌&(RZc5E ao=5 jr .סV\ggUqC^Ab!XvO4DwV8@}JwW"+%6K1NvLC2&[InmǘqcVH Cl~jg'N7pAÈ01Y 6g e%.[o&.פ^X|cxzz 2EPvl?TR%y~Hɪ?}d{yq'[Me(/&ۖΦN׭{ɂ ^[߸qW28Oֿȏ?{e.؟3~_ =,IDATup,Գ޾Q\'@|JqG9[V w88܃p]!`JD|\k G2iWT N2 >NkaԋORcjS0;rq|u.~ %|{tꨵNi07,.q̈w{e71'zk]Abs}Zi3smO|CC9WV (qV\Up f6* >YlXZpv EpciCuPD{1}taQFTswlXB\n׶:Qm\)jLΏX"2[[ ߧ:#8V8z|T7F5k!OO2ݛi}8^@9& @.$2Z =C`Jwg'6 qjPCe&3Zuk跓0n'ʞۦ㠄lڄhjG%,N0M3{eK`o!aA3d{j?l^=iܘ9 6I @`WJ]Fwg!L`Y P2wMFГ_Zٵ;S0+ȱ@zwքm榲iE(?We&qvFC}*{]BpSe*`=+q$7(_{+o4s=k2MeBLeƯT/П>1 6φ @`oJ^F!07.se=l@.d4Kiq^uMt酶,rd%3(5o{Uc[bq'~DUB0Aئ+n&Ϯmƃl N8'U;]?ya0  !ؼ @Xҗb,brK 4\@- Ka1v"O$JyV,@{"etO[#etk'?}>>}0 }-'[&ؼ7@JeTj:>>8JVO p9rY&@|2 6/VHe "6#8E2c,@H 0w7y8@ P2\W5N=FN 0"}>Y &@|B 6/ 0G eX=?/ grM7ٚÄ{4qK׽}b2e NV 6'g}7󒬺Н#<'\Fw}8BݗAre3}N7I/z Roi[b_mo ='g!!@|9@y @`_FOYf)1u]3x+۽dD\m$m^(vl {^ՙʟƴk(ӾB׎˩}<\ۆNіQ@@Jdf)5ՍOԧi,&MyC ZsN.;O@l.X@+%P2RTgN7<;LdtL S,kg)T*mf{YެUo`7B雷po 1.Ưn(,oº7&ħOM}:ioL&c/l,7sn6^|t }, 6_ g.{ 'e4?cvZ zͺ(F 튞+MzlX F''rlme'vڌdW̽lj?tjT#Z6=)t9$NnN܃ >@l>ψ $Qy8 H o|ͺf҂k,}jmFtkuDڠso6婼=}sSFڿgRE`PwP}n3c @{2 ќtY&P*K/'8;ٔx3q q}6k8MaN4m+Ҵ˚}?{5olj/ӞDBl?Uc1m4n̂Z +.Dh&, (?l&Y/-6GqX~g[XL@no3`(*a8?;[>]Mfs%26%P:,RZc+*56&wmvoާ;E6TY4-a PYMcY3l77ЕpeC:'5Ψaauǝ!@|#@͗c. @<.$eBL 7|y1b  !@`J^Fcҩmp  'ety(Hd|/6[C`8FX9 C@9.Nh p]a=r(s ^N?Lyɧm hE.uGzMgBp^cq %etYX"}~c@Sć@l^ b? #2zCOgH禺dYFs.-4~g2i']浟859ފ2td&?gv!c>/bbC @`mJ\Fw}W57YZl>~u;7sn<|H[=FDcլ18%zi\Fw>N(ߝ9 gL @|)b@YC eg7///E`b0ZՋq^p\]g[Tf[_whn-j!Yl2\qK ܂l0SvmKѧpܝ3 8B`<xf̀&z .f\r  D mfs]3vh53O׮%*R{'Z7Eagk>؛:.u2鐙23(."M_b4r@lA5!@`\Fd4"@O~i9jd6i38/^'lE]k2#1:9'nh؟ #$+}N~f60 @^_2O.lT io SoY%PόnC7G,}:qm#^b!@ Ή,Br&{kf닗/3zM[^"l ~u½aa`.t'k[l8X;ƶN p=ψ+ݕJR.k̫˚٩OތYXM lm蚣}:qm#^b!@ т56E覎g 0+|cxzz 2EPvl?T)d6o2oU)L^Goq7}/ې׿a>4uo8OM}ji.51nxN8?8G9 wfC:L\Y-C@i.=cl1B`*]75s]Y7$c Fvx|2XQc.)>f$e#8 +Te3~J۪>VMd#Z6=)t9$ao?''hJq68nKݾ wNQO7w8B+<4L e(q]X23"7f]YJbi5Y>]\>mn=kuͨ(yCsTFCr^'D޸tm nQPo33=)\t>6dMٺWmx˜怾\}b sߏ{`69cũ@l^فa. ,@rH` G !p-kfO>?SVXc1 2ʣ2޳r&@|M!=[VPCI1 (ys&2:S %N& gCLy0*BB.NhpƍYR}l sf}'|# @IE.ϕ~!8B`<.1{!P$.~B 3{f,@b @ E eX=?/ . ͗ κkMu{ɺujUfB7CF:ӻN#P;r P@^Cv ߷{x9+, (q=]d5kA~8x/<_.=^&>~b߹5O5GG3ԁ2ܳ2&P"!$~bO!@(|cW_槧 YecYDw#xHlBl~,_zVxe|'}mk3϶5DHv6Y)%9xC?AkqL԰rQvؽ\:|G|#F%@l^` @˨lvZƉNu%}NbpZ`-4B+'4 Υ]3O۷By+' pu.f\r  D%,(5gТk4gޯ]SٗH흴GDT0jaLncob'@H ea"0,5ƽ⋨*o׵n>V 5MC;[^"ljg?mo]#>-\O5zr4qmcm*E{hp_P} ]3:/'wӵ\FrR (],ƿO݌_;c원Oak@;@l.X@+%P2RT 2# ,@1<=="(ZpbKe~uM]{i\7ub^eoSCWy~4 0}<3f@`nse=@ | Q#ez6 zͺhh'Wڏ 6 ~ƈ2fOuF`F FNyv,@{!P2 &X/g7RK ήQ@YqY, b)kW( 1@l % A佌&B^7A`MJwg'6%rzvuUskM͞$ wM> 0;ّ  @^'r2.kC`Jϟ?hzUg:߅;#'j86$3 $@|@y @`J^FW !\Fs(E`f)1j2~"$YQeWwY_Vjnk4MC#7,'@|όbDYvCet7qp%!$n}ǎ #ؼ@XQt{{[0,p]a` Fd|_ ́WwdA;!\Ȳ.@lΊ @&YᯠV <|Zx'/ؾ[j9Y^`3ST@}~_o/X!ߩ~[?[} ]dbj!@4|b/MVS,ͱ,"݇H>U7]WZ2%;7Yᶺfef[v"YIN+1ݹ"fb[kZM&'Xk*YW9س3N}@9b3@l.˟!@`P\f5Nl6jm-vE@%у'P[ ǵe/ vf },?wvٿ3W8&lh] VcV@R;A׎ؼ,}/Տ?(0F~w~a,`eQ@bn5_^^*-8qM6"6^"ڌ: jZUk+Jkm3Nn^][usgמخ!KWzQ1z^d5lUykn6O@>m͟4.bO @`MVs]y+q q}69MaN4xsg]qc3}SOi!!*14bTr̃>oJ2$yA!K? , 6oq(%6?6]S>C/-6GqX~c_RYgFw}LfK ÉѢ͆45} 370l"bw!0?~xGGd8 P品 @lkv ()6 J%y@G&tf.(uєPҍܸ~my k,঱^[5'ݿFw󓺜lh[&cٖ҈&z.[+ryE(D@fDx,|ዿ7:B_]mo Pbs9 @+'ؼ]@l<f#!1g`AlYLy2:&B 6 5@l^a; @R 6/d OyG%@ 6ϔ!@`'J͟?Nh&%s˘x`Bӷa=TDF=zlcb6/ @EyY5 "c|0d\6/7URVx<k}M{^n1z ]s4Z`nQ{gؼs @ e@l^y`  @~ xW wuZsլЗd&fj], g6^Jrb\W}nO>[׉fm}j\c|B61Lj;7w[?n\geyx@ PbsY@+&Ol>V|j~zz 2EP9Ep7$c Zv]}9 }kY 8Y٬o3'̵pקZnJVѺ꼪HPNNvG}{%G<`tɸgW8@ @ <L u'62,e5DblcqUg h,:sZHm| j8kH-g uڪ3C<`tm mهhE~}7JtY @`z @+6f]҂Zl~WP8mp|.Y9#lvmeƂglMeeO3SŸE;{! T Og 6q @`x(@ Wlg Nl6Yu)I/-6G:%!7KjhMew}LfK ÉYǢ֥D>u;U("͖]O-dr,-ZC>x&27O\9?,ؼ٣1@  gk@X7bY2/@`q @ !Pb  @ A̡@ 6OgL@ @lـ L$<  8L @)A 6_4@`~3eE@  6 @&@liX&@ lb @ZE} 0?" @y @ 6O4,b @6GysGC p-">bLY @< J͟?D}@l= @@y* @) "6#8A,`eQ@ @l 0@2sU:/g@l9 @@>ز2 l@~X=?/ M n?uOPWcuǟZ}u{xӂ{K#ؼ@ -@l) !_lu:jbpKD*1]/'D'|# @ 0bXb 4ꛯ4YOOOAf"6ǂw&M7 P`|cEh}l^1Mvt#0.P=0GeOOp)Py @ 0?" @>lvZ&͝My63YEac͂m7r*4b'jDɌ<@YbsQl@ Q=X܂ >Yl~yy,G9Be'.R:Y~糜جigJ=rC2͗c6 @Ry. @ z}}mg'6溔f&Wy/j=*ù]SfO}:xL <S @ pb3 @`"Rbg#853Df!ǙwaΈlj怩; $ 6`@ @`~3eE@ b Y2ƴW9`4!9Ȃ2]eۆu[aԃVMgӎY 6OFD@ @l L$PZlh6 b3 @'ʌt_*'T|'Cl bb'y#6 @ /|Y6L |CfvBtYkˍH8Z {Zẝ?x-G]f-˜s=~7b @@l.~@k%_l9]d5kA~8xbˇ{쳚͸{Jy&S"ϔky6ߵtq^mcܷg={ɌNe?F"\wB4r` j2Tt9{@ '<3 @@^g7///E`bӱ"sB<ǩz D/\0lk]W:tM@ hm?/*ʈKt8a4G [OW!|l@ 3;;p܅ |}}mg'6溔Dkf+A6qTج6zfM 6s=kW#anVӇ5Is:M97aև @#=:>C,Jbϟ|הz+x/;úTZJO,榩`G$6H7e<͖I3;Ayǀ @#ؼ@bx)d4Ki ^ Hwg 6ϔ!@ 3@H 62fpOW}ؼcZ@ @l^a ,M}>X~_w@ \@xL ~_>0 _?_oˎ+!@ \=, ??Zɟ e~W~#4K@^ @e/l@! "8S$'*B3b2 @Ey]煵 `?\ X632qNX@ ~?C< GCC?S?_ <dTT_f4{[` @Iy @g@2wWd|;+L @: 6㜰VLIK/`3pg@m @#<KV $򂨌3g@- @' /// Base transaction interface, shared by typed and non-typed transactions /// public interface IRedisTransactionBase : IRedisPipelineShared { } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Redis/SortOptions.cs0000644000175000017500000000052512146506551027620 0ustar00meebeymeebey00000000000000namespace ServiceStack.Redis { public class SortOptions { public string SortPattern { get; set; } public int? Skip { get; set; } public int? Take { get; set; } public string GetPattern { get; set; } public bool SortAlpha { get; set; } public bool SortDesc { get; set; } public string StoreAtKey { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/0000755000175000017500000000000012146506551026037 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/InitOptions.cs0000644000175000017500000000021012146506551030636 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.LogicFacade { [Flags] public enum InitOptions { None = 0, InitialiseOnly = 1 } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/ILogicFacade.cs0000644000175000017500000000025012146506551030615 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.LogicFacade { public interface ILogicFacade : IDisposable { IInitContext AcquireInitContext(InitOptions options); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/IOperationContext.cs0000644000175000017500000000035212146506551032004 0ustar00meebeymeebey00000000000000using System; using ServiceStack.ServiceHost; namespace ServiceStack.LogicFacade { public interface IOperationContext : IDisposable { IApplicationContext Application { get; } IRequestContext Request { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/IServiceModelFinder.cs0000644000175000017500000000044512146506551032213 0ustar00meebeymeebey00000000000000using System; using System.Reflection; namespace ServiceStack.LogicFacade { ///

/// The same functionality is on IServiceResolver /// [Obsolete] public interface IServiceModelFinder { Type FindTypeByOperation(string operationName, int? version); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/IInitContext.cs0000644000175000017500000000023612146506551030750 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.LogicFacade { public interface IInitContext : IDisposable { object InitialisedObject { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/IXmlRequest.cs0000644000175000017500000000014612146506551030611 0ustar00meebeymeebey00000000000000namespace ServiceStack.LogicFacade { public interface IXmlRequest { string Xml { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/LogicFacade/IApplicationContext.cs0000644000175000017500000000045512146506551032313 0ustar00meebeymeebey00000000000000using ServiceStack.CacheAccess; using ServiceStack.Configuration; namespace ServiceStack.LogicFacade { public interface IApplicationContext { IFactoryProvider Factory { get; } T Get() where T : class; ICacheClient Cache { get; } IResourceManager Resources { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/README.md0000644000175000017500000000056112146506551025177 0ustar00meebeymeebey00000000000000# ServiceStack.NET's implementation-free Interfaces project Most client-facing implementations and providers in ServiceStack generally adhere to interfaces defined in this project. This good practices approach encourages clients binding to **Interfaces** and not **implementations** making it easy to test/mock, version and change the behaviour of your services.smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/0000755000175000017500000000000012146506551025316 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IRestClient.cs0000644000175000017500000000105312146506551030031 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.Service { public interface IRestClient { TResponse Get(string relativeOrAbsoluteUrl); TResponse Delete(string relativeOrAbsoluteUrl); TResponse Post(string relativeOrAbsoluteUrl, object request); TResponse Put(string relativeOrAbsoluteUrl, object request); TResponse Patch(string relativeOrAbsoluteUrl, object request); TResponse PostFile(string relativeOrAbsoluteUrl, FileInfo fileToUpload, string mimeType); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IStreamWriter.cs0000644000175000017500000000021112146506551030400 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.Service { public interface IStreamWriter { void WriteTo(Stream responseStream); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IServiceClient.cs0000644000175000017500000000026212146506551030515 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Service { public interface IServiceClient : IServiceClientAsync, IOneWayClient #if !SILVERLIGHT , IReplyClient #endif { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IReplyClient.cs0000644000175000017500000000141612146506551030212 0ustar00meebeymeebey00000000000000using System.IO; namespace ServiceStack.Service { public interface IReplyClient { /// /// Sends the specified request. /// /// The request. /// TResponse Send(object request); TResponse PostFile(string relativeOrAbsoluteUrl, FileInfo fileToUpload, string mimeType); TResponse PostFile(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, string mimeType); TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, FileInfo fileToUpload, object request); TResponse PostFileWithRequest(string relativeOrAbsoluteUrl, Stream fileToUpload, string fileName, object request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IOneWayClient.cs0000644000175000017500000000031412146506551030315 0ustar00meebeymeebey00000000000000namespace ServiceStack.Service { public interface IOneWayClient { void SendOneWay(object request); void SendOneWay(string relativeOrAbsoluteUrl, object request); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IServiceClientAsync.cs0000644000175000017500000000035012146506551031511 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Service { public interface IServiceClientAsync : IRestClientAsync { void SendAsync(object request, Action onSuccess, Action onError); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IRestClientAsync.cs0000644000175000017500000000133112146506551031026 0ustar00meebeymeebey00000000000000using System; using System.IO; namespace ServiceStack.Service { public interface IRestClientAsync : IDisposable { void SetCredentials(string userName, string password); void GetAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError); void DeleteAsync(string relativeOrAbsoluteUrl, Action onSuccess, Action onError); void PostAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError); void PutAsync(string relativeOrAbsoluteUrl, object request, Action onSuccess, Action onError); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IResponseBase.cs0000644000175000017500000000042412146506551030347 0ustar00meebeymeebey00000000000000using System; using System.Runtime.Serialization; namespace ServiceStack.Service { public interface IResponseBase { int Version { get; set; } TResponseStatus ResponseStatus { get; set; } TData ResponseData { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Service/IResponseStatus.cs0000644000175000017500000000033212146506551030756 0ustar00meebeymeebey00000000000000namespace ServiceStack.Service { public interface IResponseStatus { string ErrorCode { get; set; } string ErrorMessage { get; set; } string StackTrace { get; set; } bool IsSuccess { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/0000755000175000017500000000000012146506550026647 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/0000755000175000017500000000000012146506550027707 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasUserId.cs0000644000175000017500000000020012146506550032166 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DesignPatterns.Model { public interface IHasUserId { Guid UserId { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasIntId.cs0000644000175000017500000000014412146506550032011 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Model { public interface IHasIntId : IHasId { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasGuidId.cs0000644000175000017500000000016712146506550032154 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DesignPatterns.Model { public interface IHasGuidId : IHasId { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasId.cs0000644000175000017500000000014712146506550031341 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Model { public interface IHasId { T Id { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasNamedList.cs0000644000175000017500000000024712146506550032666 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.DesignPatterns.Model { public interface IHasNamedList : IHasNamed> { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasLongId.cs0000644000175000017500000000014612146506550032160 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Model { public interface IHasLongId : IHasId { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasNamed.cs0000644000175000017500000000020012146506550032017 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Model { public interface IHasNamed { T this[string listId] { get; set; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasUserSession.cs0000644000175000017500000000024212146506550033263 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DesignPatterns.Model { public interface IHasUserSession { Guid UserId { get; } Guid SessionId { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasStringId.cs0000644000175000017500000000017512146506550032531 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.DesignPatterns.Model { public interface IHasStringId : IHasId { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Model/IHasNamedCollection.cs0000644000175000017500000000024412146506550034043 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DesignPatterns.Model { public interface IHasNamedCollection : IHasNamed> { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Serialization/0000755000175000017500000000000012146506550031464 5ustar00meebeymeebey00000000000000ITextSerializer.cs0000644000175000017500000000067012146506550035026 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Serializationusing System; using System.IO; namespace ServiceStack.DesignPatterns.Serialization { public interface ITextSerializer { object DeserializeFromString(string json, Type returnType); T DeserializeFromString(string json); T DeserializeFromStream(Stream stream); object DeserializeFromStream(Type type, Stream stream); string SerializeToString(T obj); void SerializeToStream(T obj, Stream stream); } }IStringDeserializer.cs0000644000175000017500000000035112146506550035655 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Serializationusing System; namespace ServiceStack.DesignPatterns.Serialization { public interface IStringDeserializer { To Parse(string serializedText); object Parse(string serializedText, Type type); } }IStringSerializer.cs0000644000175000017500000000021212146506550035340 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Serializationnamespace ServiceStack.DesignPatterns.Serialization { public interface IStringSerializer { string Parse(TFrom from); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Translator/0000755000175000017500000000000012146506550031000 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Translator/ITranslator.cs0000644000175000017500000000021612146506550033570 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Translator { public interface ITranslator { To Parse(From from); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/0000755000175000017500000000000012146506550030225 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/ICommandList.cs0000644000175000017500000000024012146506550033073 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DesignPatterns.Command { public interface ICommandList : ICommand> { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/ICommandVoid.cs0000644000175000017500000000017712146506550033072 0ustar00meebeymeebey00000000000000 namespace ServiceStack.DesignPatterns.Command { public interface ICommandVoid { void Execute(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/ICommandIList.cs0000644000175000017500000000023012146506550033203 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DesignPatterns.Command { public interface ICommandIList : IList { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/ICommandExec.cs0000644000175000017500000000016512146506550033052 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Command { public interface ICommandExec : ICommand { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/ICommandIEnumerable.cs0000644000175000017500000000025612146506550034357 0ustar00meebeymeebey00000000000000using System.Collections.Generic; namespace ServiceStack.DesignPatterns.Command { public interface ICommandIEnumerable : ICommand> { } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/DesignPatterns/Command/ICommand.cs0000644000175000017500000000021312146506550032237 0ustar00meebeymeebey00000000000000namespace ServiceStack.DesignPatterns.Command { public interface ICommand { ReturnType Execute(); } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/SearchIndex/0000755000175000017500000000000012146506551026113 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/SearchIndex/FullTextIndexDocumentAttribute.cs0000644000175000017500000000046212146506551034566 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.SearchIndex { public class FullTextIndexDocumentAttribute : Attribute { public Type ForType { get; set; } public FullTextIndexDocumentAttribute() {} public FullTextIndexDocumentAttribute(Type forType) { this.ForType = forType; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/SearchIndex/FullTextIndexAttribute.cs0000644000175000017500000000045212146506551033066 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.SearchIndex { [Flags] public enum FullTextIndexAttribute { IsDefault = 1, IsKey = 2, NoIndex = 4, IndexTokenized = 8, IndexUnTokenized = 16, //IndexNoNorms, NoStore = 32, StoreCompressed = 64, StoreUncompressed = 128, } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/SearchIndex/FullTextIndexFieldAttribute.cs0000644000175000017500000000162312146506551034033 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; using System.Text; using ServiceStack.SearchIndex; namespace ServiceStack.SearchIndex { public class FullTextIndexFieldAttribute : Attribute { public FullTextIndexAttribute FieldAttributes { get; private set; } public string MemberPath { get; set; } public FullTextIndexFieldAttribute() :this(FullTextIndexAttribute.StoreUncompressed | FullTextIndexAttribute.IndexTokenized) {} public FullTextIndexFieldAttribute(FullTextIndexAttribute fieldAttributes) { this.FieldAttributes = fieldAttributes; } public FullTextIndexFieldAttribute(FullTextIndexAttribute fieldAttributes, string memberPath) : this(fieldAttributes) { this.MemberPath = memberPath; } public FullTextIndexFieldAttribute(string memberTypePropertyName) : this() { this.MemberPath = memberTypePropertyName; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/0000755000175000017500000000000012146506550025303 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/LogManager.cs0000644000175000017500000000275112146506550027653 0ustar00meebeymeebey00000000000000using System; using ServiceStack.Logging.Support.Logging; namespace ServiceStack.Logging { /// /// Logging API for this library. You can inject your own implementation otherwise /// will use the DebugLogFactory to write to System.Diagnostics.Debug /// public class LogManager { private static ILogFactory logFactory; /// /// Gets or sets the log factory. /// Use this to override the factory that is used to create loggers /// /// The log factory. public static ILogFactory LogFactory { get { if (logFactory == null) { return new DebugLogFactory(); } return logFactory; } set { logFactory = value; } } /// /// Gets the logger. /// /// The type. /// public static ILog GetLogger(Type type) { return LogFactory.GetLogger(type); } /// /// Gets the logger. /// /// Name of the type. /// public static ILog GetLogger(string typeName) { return LogFactory.GetLogger(typeName); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/0000755000175000017500000000000012146506550026757 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/0000755000175000017500000000000012146506551030346 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/DebugLogFactory.cs0000644000175000017500000000102212146506550033707 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Creates a Debug Logger, that logs all messages to: System.Diagnostics.Debug /// /// Made public so its testable /// public class DebugLogFactory : ILogFactory { public ILog GetLogger(Type type) { return new DebugLogger(type); } public ILog GetLogger(string typeName) { return new DebugLogger(typeName); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/NullDebugLogger.cs0000644000175000017500000000520312146506550033715 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Default logger is to System.Diagnostics.Debug.Print /// /// Made public so its testable /// public class NullDebugLogger : ILog { /// /// Initializes a new instance of the class. /// /// The type. public NullDebugLogger(string type) { } /// /// Initializes a new instance of the class. /// /// The type. public NullDebugLogger(Type type) { } #region ILog Members /// /// Logs the specified message. /// /// The message. /// The exception. private static void Log(object message, Exception exception) { } /// /// Logs the format. /// /// The message. /// The args. private static void LogFormat(object message, params object[] args) { } /// /// Logs the specified message. /// /// The message. private static void Log(object message) { } public void Debug(object message, Exception exception) { } public bool IsDebugEnabled { get { return true; } } public void Debug(object message) { } public void DebugFormat(string format, params object[] args) { } public void Error(object message, Exception exception) { } public void Error(object message) { } public void ErrorFormat(string format, params object[] args) { } public void Fatal(object message, Exception exception) { } public void Fatal(object message) { } public void FatalFormat(string format, params object[] args) { } public void Info(object message, Exception exception) { } public void Info(object message) { } public void InfoFormat(string format, params object[] args) { } public void Warn(object message, Exception exception) { } public void Warn(object message) { } public void WarnFormat(string format, params object[] args) { } #endregion } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/ConsoleLogger.cs0000644000175000017500000001014212146506550033434 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Default logger is to Console.WriteLine /// /// Made public so its testable /// public class ConsoleLogger : ILog { const string DEBUG = "DEBUG: "; const string ERROR = "ERROR: "; const string FATAL = "FATAL: "; const string INFO = "INFO: "; const string WARN = "WARN: "; /// /// Initializes a new instance of the class. /// /// The type. public ConsoleLogger(string type) { } /// /// Initializes a new instance of the class. /// /// The type. public ConsoleLogger(Type type) { } #region ILog Members public bool IsDebugEnabled { get { return true; } } /// /// Logs the specified message. /// /// The message. /// The exception. private static void Log(object message, Exception exception) { string msg = message == null ? string.Empty : message.ToString(); if (exception != null) { msg += ", Exception: " + exception.Message; } Console.WriteLine(msg); } /// /// Logs the format. /// /// The message. /// The args. private static void LogFormat(object message, params object[] args) { string msg = message == null ? string.Empty : message.ToString(); Console.WriteLine(msg, args); } /// /// Logs the specified message. /// /// The message. private static void Log(object message) { string msg = message == null ? string.Empty : message.ToString(); Console.WriteLine(msg); } public void Debug(object message, Exception exception) { Log(DEBUG + message, exception); } public void Debug(object message) { Log(DEBUG + message); } public void DebugFormat(string format, params object[] args) { LogFormat(DEBUG + format, args); } public void Error(object message, Exception exception) { Log(ERROR + message, exception); } public void Error(object message) { Log(ERROR + message); } public void ErrorFormat(string format, params object[] args) { LogFormat(ERROR + format, args); } public void Fatal(object message, Exception exception) { Log(FATAL + message, exception); } public void Fatal(object message) { Log(FATAL + message); } public void FatalFormat(string format, params object[] args) { LogFormat(FATAL + format, args); } public void Info(object message, Exception exception) { Log(INFO + message, exception); } public void Info(object message) { Log(INFO + message); } public void InfoFormat(string format, params object[] args) { LogFormat(INFO + format, args); } public void Warn(object message, Exception exception) { Log(WARN + message, exception); } public void Warn(object message) { Log(WARN + message); } public void WarnFormat(string format, params object[] args) { LogFormat(WARN + format, args); } #endregion } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/NullLogFactory.cs0000644000175000017500000000100412146506550033573 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Creates a Debug Logger, that logs all messages to: System.Diagnostics.Debug /// /// Made public so its testable /// public class NullLogFactory : ILogFactory { public ILog GetLogger(Type type) { return new NullDebugLogger(type); } public ILog GetLogger(string typeName) { return new NullDebugLogger(typeName); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/DebugLogger.cs0000644000175000017500000001023012146506550033056 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Default logger is to System.Diagnostics.Debug.WriteLine /// /// Made public so its testable /// public class DebugLogger : ILog { const string DEBUG = "DEBUG: "; const string ERROR = "ERROR: "; const string FATAL = "FATAL: "; const string INFO = "INFO: "; const string WARN = "WARN: "; /// /// Initializes a new instance of the class. /// /// The type. public DebugLogger(string type) { } /// /// Initializes a new instance of the class. /// /// The type. public DebugLogger(Type type) { } #region ILog Members /// /// Logs the specified message. /// /// The message. /// The exception. private static void Log(object message, Exception exception) { string msg = message == null ? string.Empty : message.ToString(); if (exception != null) { msg += ", Exception: " + exception.Message; } System.Diagnostics.Debug.WriteLine(msg); } /// /// Logs the format. /// /// The message. /// The args. private static void LogFormat(object message, params object[] args) { string msg = message == null ? string.Empty : message.ToString(); System.Diagnostics.Debug.WriteLine(string.Format(msg, args)); } /// /// Logs the specified message. /// /// The message. private static void Log(object message) { string msg = message == null ? string.Empty : message.ToString(); System.Diagnostics.Debug.WriteLine(msg); } public void Debug(object message, Exception exception) { Log(DEBUG + message, exception); } public bool IsDebugEnabled { get { return true; } } public void Debug(object message) { Log(DEBUG + message); } public void DebugFormat(string format, params object[] args) { LogFormat(DEBUG + format, args); } public void Error(object message, Exception exception) { Log(ERROR + message, exception); } public void Error(object message) { Log(ERROR + message); } public void ErrorFormat(string format, params object[] args) { LogFormat(ERROR + format, args); } public void Fatal(object message, Exception exception) { Log(FATAL + message, exception); } public void Fatal(object message) { Log(FATAL + message); } public void FatalFormat(string format, params object[] args) { LogFormat(FATAL + format, args); } public void Info(object message, Exception exception) { Log(INFO + message, exception); } public void Info(object message) { Log(INFO + message); } public void InfoFormat(string format, params object[] args) { LogFormat(INFO + format, args); } public void Warn(object message, Exception exception) { Log(WARN + message, exception); } public void Warn(object message) { Log(WARN + message); } public void WarnFormat(string format, params object[] args) { LogFormat(WARN + format, args); } #endregion } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/TestLogFactory.cs0000644000175000017500000000070212146506551033605 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Creates a test Logger, that stores all log messages in a member list /// public class TestLogFactory : ILogFactory { public ILog GetLogger(Type type) { return new TestLogger(type); } public ILog GetLogger(string typeName) { return new TestLogger(typeName); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/TestLogger.cs0000644000175000017500000001035712146506551032762 0ustar00meebeymeebey00000000000000using System; using System.Collections.Generic; namespace ServiceStack.Logging.Support.Logging { /// /// Tests logger which stores all log messages in a member list which can be examined later /// /// Made public so its testable /// public class TestLogger : ILog { /// /// Initializes a new instance of the class. /// /// The type. public TestLogger(string type) { } /// /// Initializes a new instance of the class. /// /// The type. public TestLogger(Type type) { } public enum Levels { DEBUG, ERROR, FATAL, INFO, WARN, }; static private List> _logs = new List>(); static public IList> GetLogs() { return _logs; } #region ILog Members public bool IsDebugEnabled { get { return true; } } /// /// Logs the specified message. /// /// The message. /// The exception. private static void Log(Levels level, object message, Exception exception) { string msg = message == null ? string.Empty : message.ToString(); if(exception != null) { msg += ", Exception: " + exception.Message; } _logs.Add(new KeyValuePair(level, msg)); } /// /// Logs the format. /// /// The message. /// The args. private static void LogFormat(Levels level, object message, params object[] args) { string msg = message == null ? string.Empty : message.ToString(); _logs.Add(new KeyValuePair(level, string.Format(msg, args))); } /// /// Logs the specified message. /// /// The message. private static void Log(Levels level, object message) { string msg = message == null ? string.Empty : message.ToString(); _logs.Add(new KeyValuePair(level, msg)); } public void Debug(object message, Exception exception) { Log(Levels.DEBUG, message, exception); } public void Debug(object message) { Log(Levels.DEBUG, message); } public void DebugFormat(string format, params object[] args) { LogFormat(Levels.DEBUG, format, args); } public void Error(object message, Exception exception) { Log(Levels.ERROR, message, exception); } public void Error(object message) { Log(Levels.ERROR, message); } public void ErrorFormat(string format, params object[] args) { LogFormat(Levels.ERROR, format, args); } public void Fatal(object message, Exception exception) { Log(Levels.FATAL, message, exception); } public void Fatal(object message) { Log(Levels.FATAL, message); } public void FatalFormat(string format, params object[] args) { LogFormat(Levels.FATAL, format, args); } public void Info(object message, Exception exception) { Log(Levels.INFO, message, exception); } public void Info(object message) { Log(Levels.INFO, message); } public void InfoFormat(string format, params object[] args) { LogFormat(Levels.INFO, format, args); } public void Warn(object message, Exception exception) { Log(Levels.WARN, message, exception); } public void Warn(object message) { Log(Levels.WARN, message); } public void WarnFormat(string format, params object[] args) { LogFormat(Levels.WARN, format, args); } #endregion } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/Support/Logging/ConsoleLogFactory.cs0000644000175000017500000000101412146506550034264 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging.Support.Logging { /// /// Creates a Debug Logger, that logs all messages to: System.Diagnostics.Debug /// /// Made public so its testable /// public class ConsoleLogFactory : ILogFactory { public ILog GetLogger(Type type) { return new ConsoleLogger(type); } public ILog GetLogger(string typeName) { return new ConsoleLogger(typeName); } } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/ILog.cs0000644000175000017500000000764312146506550026476 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging { /// /// Logs a message in a running application /// public interface ILog { /// /// Gets or sets a value indicating whether this instance is debug enabled. /// /// /// true if this instance is debug enabled; otherwise, false. /// bool IsDebugEnabled { get; } /// /// Logs a Debug message. /// /// The message. void Debug(object message); /// /// Logs a Debug message and exception. /// /// The message. /// The exception. void Debug(object message, Exception exception); /// /// Logs a Debug format message. /// /// The format. /// The args. void DebugFormat(string format, params object[] args); /// /// Logs a Error message. /// /// The message. void Error(object message); /// /// Logs a Error message and exception. /// /// The message. /// The exception. void Error(object message, Exception exception); /// /// Logs a Error format message. /// /// The format. /// The args. void ErrorFormat(string format, params object[] args); /// /// Logs a Fatal message. /// /// The message. void Fatal(object message); /// /// Logs a Fatal message and exception. /// /// The message. /// The exception. void Fatal(object message, Exception exception); /// /// Logs a Error format message. /// /// The format. /// The args. void FatalFormat(string format, params object[] args); /// /// Logs an Info message and exception. /// /// The message. void Info(object message); /// /// Logs an Info message and exception. /// /// The message. /// The exception. void Info(object message, Exception exception); /// /// Logs an Info format message. /// /// The format. /// The args. void InfoFormat(string format, params object[] args); /// /// Logs a Warning message. /// /// The message. void Warn(object message); /// /// Logs a Warning message and exception. /// /// The message. /// The exception. void Warn(object message, Exception exception); /// /// Logs a Warning format message. /// /// The format. /// The args. void WarnFormat(string format, params object[] args); } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/Logging/ILogFactory.cs0000644000175000017500000000112412146506550030012 0ustar00meebeymeebey00000000000000using System; namespace ServiceStack.Logging { /// /// Factory to create ILog instances /// public interface ILogFactory { /// /// Gets the logger. /// /// The type. /// ILog GetLogger(Type type); /// /// Gets the logger. /// /// Name of the type. /// ILog GetLogger(string typeName); } } smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModel/0000755000175000017500000000000012146506551031517 5ustar00meebeymeebey00000000000000ResponseError.cs0000644000175000017500000000141412146506551034577 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModel/* // $Id: ResponseError.cs 11037 2010-02-03 12:36:14Z Demis Bellot $ // // Revision : $Revision: 11037 $ // Modified Date : $LastChangedDate: 2010-02-03 12:36:14 +0000 (Wed, 03 Feb 2010) $ // Modified By : $LastChangedBy: Demis Bellot $ // // (c) Copyright 2010 Liquidbit Ltd */ using System.Runtime.Serialization; namespace ServiceStack.ServiceInterface.ServiceModel { /// /// Error information pertaining to a particular named field. /// Used for returning multiple field validation errors.s /// [DataContract] public class ResponseError { [DataMember] public string ErrorCode { get; set; } [DataMember] public string FieldName { get; set; } [DataMember] public string Message { get; set; } } }CollectionTypes.cs0000644000175000017500000000507112146506551035112 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModelusing System; using System.Collections.Generic; using System.Runtime.Serialization; namespace ServiceStack.ServiceInterface.ServiceModel { /* * Useful collection DTO's that provide pretty Xml output for collection types, e.g. * * ArrayOfIntId Ids { get; set; } * ... => * * * 1 * 2 * 3 * */ [CollectionDataContract(ItemName = "String")] public partial class ArrayOfString : List { public ArrayOfString() { } public ArrayOfString(IEnumerable collection) : base(collection) { } public ArrayOfString(params string[] args) : base(args) { } } [CollectionDataContract(ItemName = "Id")] public partial class ArrayOfStringId : List { public ArrayOfStringId() { } public ArrayOfStringId(IEnumerable collection) : base(collection) { } public ArrayOfStringId(params string[] args) : base(args) { } } [CollectionDataContract(ItemName = "Guid")] public partial class ArrayOfGuid : List { public ArrayOfGuid() { } public ArrayOfGuid(IEnumerable collection) : base(collection) { } public ArrayOfGuid(params Guid[] args) : base(args) { } } [CollectionDataContract(ItemName = "Id")] public partial class ArrayOfGuidId : List { public ArrayOfGuidId() { } public ArrayOfGuidId(IEnumerable collection) : base(collection) { } public ArrayOfGuidId(params Guid[] args) : base(args) { } } [CollectionDataContract(ItemName = "Long")] public partial class ArrayOfLong : List { public ArrayOfLong() { } public ArrayOfLong(IEnumerable collection) : base(collection) { } public ArrayOfLong(params long[] args) : base(args) { } } [CollectionDataContract(ItemName = "Id")] public partial class ArrayOfLongId : List { public ArrayOfLongId() { } public ArrayOfLongId(IEnumerable collection) : base(collection) { } public ArrayOfLongId(params long[] args) : base(args) { } } [CollectionDataContract(ItemName = "Int")] public partial class ArrayOfInt : List { public ArrayOfInt() { } public ArrayOfInt(IEnumerable collection) : base(collection) { } public ArrayOfInt(params int[] args) : base(args) { } } [CollectionDataContract(ItemName = "Id")] public partial class ArrayOfIntId : List { public ArrayOfIntId () { } public ArrayOfIntId(IEnumerable collection) : base(collection) { } public ArrayOfIntId(params int[] args) : base(args) { } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModel/Property.cs0000644000175000017500000000071612146506551033676 0ustar00meebeymeebey00000000000000using System.Collections.Generic; using System.Runtime.Serialization; namespace ServiceStack.ServiceInterface.ServiceModel { [DataContract] public class Property { public string Name { get; set; } public string Value { get; set; } } [CollectionDataContract(ItemName = "Property")] public class Properties : List { public Properties() { } public Properties(IEnumerable collection) : base(collection) { } } }IHasResponseStatus.cs0000644000175000017500000000037512146506551035543 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModelnamespace ServiceStack.ServiceInterface.ServiceModel { /// /// Contract indication that the Response DTO has a ResponseStatus /// public interface IHasResponseStatus { ResponseStatus ResponseStatus { get; set; } } }RequestLogEntry.cs0000644000175000017500000000201212146506551035076 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModelusing System; using System.Collections.Generic; namespace ServiceStack.ServiceInterface.ServiceModel { /// /// A log entry added by the IRequestLogger /// public class RequestLogEntry { public long Id { get; set; } public DateTime DateTime { get; set; } public string HttpMethod { get; set; } public string AbsoluteUri { get; set; } public string PathInfo { get; set; } public object RequestDto { get; set; } public string UserAuthId { get; set; } public string SessionId { get; set; } public string IpAddress { get; set; } public string ForwardedFor { get; set; } public string Referer { get; set; } public Dictionary Headers { get; set; } public Dictionary FormData { get; set; } public Dictionary Items { get; set; } public object Session { get; set; } public object ResponseDto { get; set; } public object ErrorResponse { get; set; } public TimeSpan RequestDuration { get; set; } } }ResponseStatus.cs0000644000175000017500000000440512146506551034774 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModel/* // $Id: ResponseStatus.cs 11037 2010-02-03 12:36:14Z Demis Bellot $ // // Revision : $Revision: 11037 $ // Modified Date : $LastChangedDate: 2010-02-03 12:36:14 +0000 (Wed, 03 Feb 2010) $ // Modified By : $LastChangedBy: Demis Bellot $ // // (c) Copyright 2010 Liquidbit Ltd */ using System.Collections.Generic; using System.Runtime.Serialization; namespace ServiceStack.ServiceInterface.ServiceModel { /// /// Common ResponseStatus class that should be present on all response DTO's /// [DataContract] public class ResponseStatus { /// /// Initializes a new instance of the class. /// /// A response status without an errorcode == success /// public ResponseStatus() { } /// /// Initializes a new instance of the class. /// /// A response status with an errorcode == failure /// public ResponseStatus(string errorCode) { this.ErrorCode = errorCode; } /// /// Initializes a new instance of the class. /// /// A response status with an errorcode == failure /// public ResponseStatus(string errorCode, string message) : this(errorCode) { this.Message = message; } /// /// Holds the custom ErrorCode enum if provided in ValidationException /// otherwise will hold the name of the Exception type, e.g. typeof(Exception).Name /// /// A value of non-null means the service encountered an error while processing the request. /// [DataMember] public string ErrorCode { get; set; } /// /// A human friendly error message /// [DataMember] public string Message { get; set; } /// /// /// [DataMember] public string StackTrace { get; set; } /// /// For multiple detailed validation errors. /// Can hold a specific error message for each named field. /// [DataMember] public List Errors { get; set; } } }ICacheByDateModified.cs0000644000175000017500000000023612146506551035636 0ustar00meebeymeebey00000000000000smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModelusing System; namespace ServiceStack.ServiceInterface.ServiceModel { public interface ICacheByDateModified { DateTime? LastModified { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModel/IHasAction.cs0000644000175000017500000000017212146506551034030 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceInterface.ServiceModel { public interface IHasAction { string Action { get; } } }smuxi-1.1/lib/ServiceStack/src/ServiceStack.Interfaces/ServiceInterface.ServiceModel/ICacheByEtag.cs0000644000175000017500000000017212146506551034256 0ustar00meebeymeebey00000000000000namespace ServiceStack.ServiceInterface.ServiceModel { public interface ICacheByEtag { string Etag { get; } } }smuxi-1.1/lib/agsxmpp/0000775000175000017500000000000014011526500015537 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/0000755000175000017500000000000012652476423017235 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC_20.sln0000644000175000017500000000307112204443225022221 0ustar00meebeymeebey00000000000000 Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "agsXMPP_PPC_20", "agsXMPP_PPC_20.csproj", "{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniClientWM5", "..\samples\VS2008\MiniClientWM5\MiniClientWM5.csproj", "{A25AA758-756E-4522-9EDD-5F9A5225BDFC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.Debug|Any CPU.Build.0 = Debug|Any CPU {33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.Release|Any CPU.ActiveCfg = Release|Any CPU {33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.Release|Any CPU.Build.0 = Release|Any CPU {A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Debug|Any CPU.Build.0 = Debug|Any CPU {A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Release|Any CPU.ActiveCfg = Release|Any CPU {A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Release|Any CPU.Build.0 = Release|Any CPU {A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Release|Any CPU.Deploy.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC.csproj0000644000175000017500000007427112204443225022436 0ustar00meebeymeebey00000000000000 Local 8.0.50727 2.0 {E236C510-8B5D-4F06-AD31-97900F72FCF4} Debug AnyCPU {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} agsXMPP false Library \Program Files\agsXMPP_PPC agsXMPP 3C41C503-53EF-4c2a-8DD4-A8217CAD115E PocketPC $(AssemblyName) v1.0 bin\PPC\Debug\ false 0 false TRACE;DEBUG;CF;STRINGPREP true 4096 false false false false 4 full true true off bin\PPC\Release\ false 0 false TRACE;CF;STRINGPREP false 4096 true false false false 4 none true true off MSCorLib False System False System.Data False System.XML False Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code PreserveNewest smuxi-1.1/lib/agsxmpp/agsxmpp/MessageGrabber.cs0000644000175000017500000000754012204443225022426 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using agsXMPP.protocol; using agsXMPP.protocol.client; using agsXMPP.Collections; namespace agsXMPP { public delegate void MessageCB(object sender, Message msg, object data); public class MessageGrabber : PacketGrabber { /// /// /// /// public MessageGrabber(XmppClientConnection conn) { m_connection = conn; conn.OnMessage += new MessageHandler(m_connection_OnMessage); } public void Add(Jid jid, MessageCB cb, object cbArg) { lock (m_grabbing) { if (m_grabbing.ContainsKey(jid.ToString())) return; } TrackerData td = new TrackerData(); td.cb = cb; td.data = cbArg; td.comparer = new BareJidComparer(); lock (m_grabbing) { m_grabbing.Add(jid.ToString(), td); } } public void Add(Jid jid, IComparer comparer, MessageCB cb, object cbArg) { lock (m_grabbing) { if (m_grabbing.ContainsKey(jid.ToString())) return; } TrackerData td = new TrackerData(); td.cb = cb; td.data = cbArg; td.comparer = comparer; lock (m_grabbing) { m_grabbing.Add(jid.ToString(), td); } } /// /// Pending request can be removed. /// This is useful when a ressource for the callback is destroyed and /// we are not interested anymore at the result. /// /// ID of the Iq we are not interested anymore public void Remove(Jid jid) { lock (m_grabbing) { if (m_grabbing.ContainsKey(jid.ToString())) m_grabbing.Remove(jid.ToString()); } } private class TrackerData { public MessageCB cb; public object data; // by default the Bare Jid is compared public IComparer comparer; } /// /// A Message is received. Now check if its from a Jid we are looking for and /// raise the event in this case. /// /// /// private void m_connection_OnMessage(object sender, Message msg) { if (msg == null) return; lock (m_grabbing) { IDictionaryEnumerator myEnum = m_grabbing.GetEnumerator(); while(myEnum.MoveNext()) { TrackerData t = myEnum.Value as TrackerData; if (t.comparer.Compare(new Jid((string)myEnum.Key), msg.From) == 0) { // Execute the callback t.cb(this, msg, t.data); } } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/XmppClientConnection.cs0000644000175000017500000015616012250206660023664 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Threading; using System.Net; using System.Net.Sockets; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol; using agsXMPP.protocol.iq; using agsXMPP.protocol.iq.auth; using agsXMPP.protocol.iq.agent; using agsXMPP.protocol.iq.disco; using agsXMPP.protocol.iq.roster; using agsXMPP.protocol.iq.register; using agsXMPP.protocol.iq.version; using agsXMPP.protocol.stream; using agsXMPP.protocol.stream.feature.compression; using agsXMPP.protocol.client; using agsXMPP.protocol.tls; using agsXMPP.protocol.extensions.caps; using agsXMPP.protocol.extensions.compression; using agsXMPP.Exceptions; using agsXMPP.Sasl; using agsXMPP.Net; using agsXMPP.Net.Dns; using agsXMPP.Idn; namespace agsXMPP { public delegate void ObjectHandler (object sender); public delegate void XmppElementHandler (object sender, Element e); /// /// Summary description for XmppClient. /// public class XmppClientConnection : XmppConnection { const string SRV_RECORD_PREFIX = "_xmpp-client._tcp."; // Delegates public delegate void RosterHandler (object sender, RosterItem item); public delegate void AgentHandler (object sender, Agent agent); private SaslHandler m_SaslHandler = null; private bool m_CleanUpDone; private bool m_StreamStarted; private SRVRecord[] _SRVRecords; private SRVRecord _currentSRVRecord; #region << Properties and Member Variables >> private string m_ClientLanguage = "en"; private string m_ServerLanguage = null; private string m_Username = ""; private string m_Password = ""; private string m_Resource = "agsXMPP"; private string m_Status = ""; private int m_Priority = 5; private ShowType m_Show = ShowType.NONE; private bool m_AutoRoster = true; private bool m_AutoAgents = true; private bool m_AutoPresence = true; #if !(CF || CF_2) private bool m_UseSso = false; internal string m_KerberosPrincipal; #endif private bool m_UseSSL = false; #if (CF || CF_2) && !BCCRYPTO private bool m_UseStartTLS = false; private bool f_ForceStartTLS = false; #else private bool m_UseStartTLS = true; private bool f_ForceStartTLS = true; #endif private bool m_UseCompression = false; internal bool m_Binded = false; private bool m_Authenticated = false; private IqGrabber m_IqGrabber = null; private MessageGrabber m_MessageGrabber = null; private PresenceGrabber m_PresenceGrabber = null; private bool m_RegisterAccount = false; private PresenceManager m_PresenceManager; private RosterManager m_RosterManager; private Capabilities m_Capabilities = new Capabilities(); private string m_ClientVersion = "1.0"; private bool m_EnableCapabilities = false; private DiscoInfo m_DiscoInfo = new DiscoInfo(); /// /// The prefered Client Language Attribute /// /// public string ClientLanguage { get { return m_ClientLanguage; } set { m_ClientLanguage = value; } } /// /// The language which the server decided to use. /// /// public string ServerLanguage { get { return m_ServerLanguage; } } /// /// the username that is used to authenticate to the xmpp server /// public string Username { get { return m_Username; } set { // first Encode the user/node m_Username = value; string tmpUser = Jid.EscapeNode(value); #if !STRINGPREP if (value != null) m_Username = tmpUser.ToLower(); else m_Username = null; #else if (value != null) m_Username = Stringprep.NodePrep(tmpUser); else m_Username = null; #endif } } /// /// the password that is used to authenticate to the xmpp server /// public string Password { get { return m_Password; } set { m_Password = value; } } /// /// the resource for this connection each connection to the server with the same jid needs a unique resource. /// You can also set Resource = null and the server will assign a random Resource for you. /// public string Resource { get { return m_Resource; } set { m_Resource = value; } } /// /// our XMPP id build from Username, Server and Resource Property (user@server/resourcee) /// public Jid MyJID { get { return BuildMyJid(); } } /// /// The status message of this connection which is sent with the presence packets. /// /// /// you have to call the method SendMyPresence to send your updated presence to the server. /// public string Status { get { return m_Status; } set { m_Status = value; } } /// /// The priority of this connection send with the presence packets. /// The OPTIONAL priority element contains non-human-readable XML character data that specifies the priority level /// of the resource. The value MUST be an integer between -128 and +127. If no priority is provided, a server /// SHOULD consider the priority to be zero. /// /// you have to call the method SendMyPresence to send your updated presence to the server. public int Priority { get { return m_Priority; } set { if ((value < -127) || (value > 127)) throw new ArgumentException("The value MUST be an integer between -128 and +127"); m_Priority = value; } } /// /// change the showtype. /// /// you have to call the method SendMyPresence to send your updated presence to the server. public ShowType Show { get { return m_Show; } set { m_Show = value; } } /// /// If set to true then the Roster (contact list) is requested automatically after sucessful login. /// Set this property to false if you don't want to receive your contact list, or request it manual. /// To save bandwidth is makes sense to cache the contact list and don't receive it on each login. /// /// default value is true public bool AutoRoster { get { return m_AutoRoster; } set { m_AutoRoster = value; } } /// /// Sends the presence Automatically after successful login. /// This property works only in combination with AutoRoster (AutoRoster = true). /// public bool AutoPresence { get { return m_AutoPresence; } set { m_AutoPresence = value; } } /// /// If set to true then the Agents are requested automatically after sucessful login. /// Set this property to false if you don't use agents at all, or if you request them manual. /// /// default value is true public bool AutoAgents { get { return m_AutoAgents; } set { m_AutoAgents = value; } } #if !(CF || CF_2) /// /// Use Single sign on (GSSAPI/KERBEROS) /// public bool UseSso { get { return m_UseSso; } set { if (Util.Runtime.IsMono() && Util.Runtime.IsUnix()) throw new NotImplementedException(); m_UseSso = value; } } /// /// Gets the kerberos principal. /// /// The kerberos principal. public string KerberosPrincipal { get { return m_KerberosPrincipal; } set { m_KerberosPrincipal = value; } } #endif /// /// use "old style" ssl for this connection (Port 5223). /// [Obsolete("Try to use ForceStartTls instead")] public bool UseSSL { get { return m_UseSSL; } #if SSL set { // Only one of both can be true m_UseSSL = value; if (value == true) m_UseStartTLS = false; } #endif } public bool ForceStartTls { get { return f_ForceStartTLS; } set { UseStartTLS = UseStartTLS || value; f_ForceStartTLS = value; } } /// /// use Start-TLS on this connection when the server supports it. Make sure UseSSL is false when /// you want to use this feature. /// public bool UseStartTLS { get { return m_UseStartTLS; } #if SSL || BCCRYPTO || CF_2 set { // Only one of both can be true m_UseStartTLS = value; if (value == true) m_UseSSL = false; } #endif } /// /// Use Stream compression to save bandwidth? /// This should not be used in combination with StartTLS, /// because TLS has build in compression (see RFC 2246, http://www.ietf.org/rfc/rfc2246.txt) /// public bool UseCompression { get { return m_UseCompression; } set { m_UseCompression = value; } } /// /// Are we Authenticated to the server? This is readonly and set by the library /// public bool Authenticated { get { return m_Authenticated; } } /// /// is the resource binded? This is readonly and set by the library /// public bool Binded { get { return m_Binded; } } /// /// Should the library register a new account on the server /// public bool RegisterAccount { get { return m_RegisterAccount; } set { m_RegisterAccount = value; } } public IqGrabber IqGrabber { get { return m_IqGrabber; } } public MessageGrabber MessageGrabber { get { return m_MessageGrabber; } } public PresenceGrabber PresenceGrabber { get { return m_PresenceGrabber; } } public RosterManager RosterManager { get { return m_RosterManager; } } public PresenceManager PresenceManager { get { return m_PresenceManager; } } public bool EnableCapabilities { get { return m_EnableCapabilities; } set { m_EnableCapabilities = value; } } public string ClientVersion { get { return m_ClientVersion; } set { m_ClientVersion = value; } } public Capabilities Capabilities { get { return m_Capabilities; } set { m_Capabilities = value; } } public Capabilities ServerCapabilities { get; set; } /// /// The DiscoInfo object is used to respond to DiscoInfo request if AutoAnswerDiscoInfoRequests == true in DisoManager objects, /// it's also used to build the Caps version when EnableCapabilities is set to true. /// /// When EnableCapailities == true call UpdateCapsVersion after each update of the DiscoInfo object /// /// public DiscoInfo DiscoInfo { get { return m_DiscoInfo; } set { m_DiscoInfo = value; } } #endregion #region << Events >> /// /// We are authenticated to the server now. /// public event ObjectHandler OnLogin; /// /// This event occurs after the resource was binded /// public event ObjectHandler OnBinded; /// /// Event that occurs on bind errors /// public event XmppElementHandler OnBindError; /// /// This event is fired when we get register information. /// You ca use this event for custom registrations. /// public event RegisterEventHandler OnRegisterInformation; /// /// This event gets fired after a new account is registered /// public event ObjectHandler OnRegistered; /// /// This event ets fired after a ChangePassword Request was successful /// public event ObjectHandler OnPasswordChanged; /* was never used, comment ot until we need it public event XmppElementHandler OnXmppError; */ /// /// Event that occurs on registration errors /// public event XmppElementHandler OnRegisterError; /// /// Event occurs on Xmpp Stream error elements /// public event XmppElementHandler OnStreamError; /// /// Event that occurs on authentication errors /// e.g. wrong password, user doesnt exist etc... /// public event XmppElementHandler OnAuthError; /// /// Event occurs on Socket Errors /// public event ErrorHandler OnSocketError; public event ObjectHandler OnClose; public event EventHandler SendingServiceUnavailable; /// /// This event is raised when a response to a roster query is received. The roster query contains the contact list. /// This lost could be very large and could contain hundreds of contacts. The are all send in a single XML element from /// the server. Normally you show the contact list in a GUI control in you application (treeview, listview). /// When this event occurs you couls Suspend the GUI for faster drawing and show change the mousepointer to the hourglass /// /// see also OnRosterItem and OnRosterEnd public event ObjectHandler OnRosterStart; /// /// This event is raised when a response to a roster query is received. It notifies you that all RosterItems (contacts) are /// received now. /// When this event occurs you could Resume the GUI and show the normal mousepointer again. /// /// see also OnRosterStart and OnRosterItem public event ObjectHandler OnRosterEnd; /// /// This event is raised when a response to a roster query is received. This event always contains a single RosterItem. /// e.g. you have 150 friends on your contact list, then this event is called 150 times. /// /// see also OnRosterItem and OnRosterEnd public event RosterHandler OnRosterItem; /// /// This event is raised when a response to an agents query which could contain multiple agentitems. /// Normally you show the items in a GUI. This event could be used to suspend the UI for faster drawing. /// /// see also OnAgentItem and OnAgentEnd public event ObjectHandler OnAgentStart; /// /// This event is raised when a response to an agents query which could contain multiple agentitems. /// Normally you show the items in a GUI. This event could be used to resume the suspended userinterface. /// /// see also OnAgentStart and OnAgentItem public event ObjectHandler OnAgentEnd; /// /// This event returns always a single AgentItem from a agents query result. /// This is from the old jabber protocol. Instead of agents Disco (Service Discovery) should be used in modern /// application. But still lots of servers use Agents. /// /// /// see also OnAgentStart and OnAgentEnd public event AgentHandler OnAgentItem; /// /// /// public event IqHandler OnIq; /// /// We received a message. This could be a chat message, headline, normal message or a groupchat message. /// There are also XMPP extension which are embedded in messages. /// e.g. X-Data forms. /// public event MessageHandler OnMessage; /// /// We received a presence from a contact or chatroom. /// Also subscriptions is handles in this event. /// public event PresenceHandler OnPresence; //public event ErrorHandler OnError; public event SaslEventHandler OnSaslStart; public event ObjectHandler OnSaslEnd; #endregion #region << Constructors >> public XmppClientConnection() : base() { m_IqGrabber = new IqGrabber(this); m_MessageGrabber = new MessageGrabber(this); m_PresenceGrabber = new PresenceGrabber(this); m_PresenceManager = new PresenceManager(this); m_RosterManager = new RosterManager(this); } public XmppClientConnection(SocketConnectionType type) : this() { base.SocketConnectionType = type; } /// /// create a new XmppClientConnection with the given JabberId and password /// /// JabberId (user@example.com) /// password public XmppClientConnection(Jid jid, string pass) : this() { base.Server = jid.Server; this.Username = jid.User; this.Password = pass; } /// /// create a new XmppClientConnection with the given server /// Username and Password gets set later /// /// public XmppClientConnection(string server) : this() { base.Server = server; } /// /// create a new XmppClientConnection with the given server and port number /// Username and Password gets set later /// /// public XmppClientConnection(string server, int port) : this(server) { base.Port = port; } #endregion /// /// This method open the connections to the xmpp server and authenticates you to ther server. /// This method is async, don't assume you are already connected when it returns. You have to wait for the OnLogin Event /// public void Open() { _Open(); } /// /// This method open the connections to the xmpp server and authenticates you to ther server. /// This method is async, don't assume you are already connected when it returns. You have to wait for the OnLogin Event /// /// your username /// your password public void Open(string username, string password) { this.Username = username; this.Password = password; _Open(); } /// /// This method open the connections to the xmpp server and authenticates you to ther server. /// This method is async, don't assume you are already connected when it returns. You have to wait for the OnLogin Event /// /// your username /// your passowrd /// resource for this connection public void Open(string username, string password, string resource) { this.m_Username = username; this.m_Password = password; this.m_Resource = resource; _Open(); } /// /// This method open the connections to the xmpp server and authenticates you to ther server. /// This method is async, don't assume you are already connected when it returns. You have to wait for the OnLogin Event /// /// your username /// your password /// resource for this connection /// priority which will be sent with presence packets public void Open(string username, string password, string resource, int priority) { this.m_Username = username; this.m_Password = password; this.m_Resource = resource; this.m_Priority = priority; _Open(); } /// /// This method open the connections to the xmpp server and authenticates you to ther server. /// This method is async, don't assume you are already connected when it returns. You have to wait for the OnLogin Event /// /// your username /// your password /// priority which will be sent with presence packets public void Open(string username, string password, int priority) { this.m_Username = username; this.m_Password = password; this.m_Priority = priority; _Open(); } #region << Socket handers >> public override void SocketOnConnect(object sender) { base.SocketOnConnect(sender); SendStreamHeader(true); } public override void SocketOnDisconnect(object sender) { base.SocketOnDisconnect(sender); if(!m_CleanUpDone) CleanupSession(); } protected virtual void OnSendingServiceUnavailable(SendingServiceUnavailableEventArgs e) { if (SendingServiceUnavailable != null) SendingServiceUnavailable(this, e); } public override void SocketOnError(object sender, Exception ex) { base.SocketOnError(sender, ex); if ((ex.GetType() == typeof(ConnectTimeoutException) || (ex.GetType() == typeof(SocketException) && ((SocketException)ex).ErrorCode == 10061)) && _SRVRecords != null && _SRVRecords.Length > 1) { // connect failed. We are using SRV records and have multiple results. // remove the current record RemoveSrvRecord(_currentSRVRecord); // find and set a new record SetConnectServerFromSRVRecords(); // connect again OpenSocket(); } else { // Fires the socket error if (OnSocketError != null) OnSocketError(this, ex); // Only cleaneUp Session and raise on close if the stream already has started // if teh stream gets closed because of a socket error we have to raise both errors fo course if (m_StreamStarted && !m_CleanUpDone) CleanupSession(); } } #endregion private void _Open() { m_CleanUpDone = false; m_StreamStarted = false; StreamParser.Reset(); #if SSL if (ClientSocket.GetType() == typeof(ClientSocket)) ((ClientSocket) ClientSocket).SSL = m_UseSSL; #endif // this should start later //if (m_KeepAlive) // CreateKeepAliveTimer(); if (SocketConnectionType == SocketConnectionType.Direct && AutoResolveConnectServer) ResolveSrv(); OpenSocket(); } private void OpenSocket() { if (ConnectServer == null) SocketConnect(base.Server, base.Port); else SocketConnect(this.ConnectServer, base.Port); } #region << SRV functions >> /// /// Resolves the connection host of a xmpp domain when SRV records are set /// private void ResolveSrv() { #if !(CF || CF_2) try { // get the machine's default DNS servers var dnsServers = IPConfigurationInformation.DnsServers; if (dnsServers.Count > 0) { // Take the 1st DNS Server for our query IPAddress dnsServer = dnsServers[0]; string queryDomain = SRV_RECORD_PREFIX + Server; _SRVRecords = Resolver.SRVLookup(queryDomain, dnsServer); SetConnectServerFromSRVRecords(); } } catch (Exception ex) { FireOnError(this, ex); } #endif } private void SetConnectServerFromSRVRecords() { // check we have a response if (_SRVRecords != null && _SRVRecords.Length > 0) { //SRVRecord srv = _SRVRecords[0]; _currentSRVRecord = PickSRVRecord(); this.Port = _currentSRVRecord.Port; this.ConnectServer = _currentSRVRecord.Target; } else { // no SRV-Records set _currentSRVRecord = null; this.ConnectServer = null; } } private void RemoveSrvRecord(SRVRecord rec) { int i = 0; SRVRecord[] recs = new SRVRecord[_SRVRecords.Length - 1]; foreach (SRVRecord srv in _SRVRecords) { if (!srv.Equals(rec)) { recs[i] = srv; i++; } } _SRVRecords = recs; } /// /// Picks one of the SRV records. /// priority and weight are evaluated by the following algorithm. /// /// SRVRecord private SRVRecord PickSRVRecord() { SRVRecord ret = null; // total weight of all servers with the same priority int totalWeight = 0; // ArrayList for the servers with the lowest priority ArrayList lowServers = new ArrayList(); // check we have a response if (_SRVRecords != null && _SRVRecords.Length > 0) { // Find server(s) with the highest priority (could be multiple) foreach (SRVRecord srv in _SRVRecords) { if (ret == null) { ret = srv; lowServers.Add(ret); totalWeight = ret.Weight; } else { if (srv.Priority == ret.Priority) { lowServers.Add(srv); totalWeight += srv.Weight; } else if (srv.Priority < ret.Priority) { // found a servr with a lower priority // clear the lowServers Array and start with this server lowServers.Clear(); lowServers.Add(ret); ret = srv; totalWeight = ret.Weight; } else if (srv.Priority > ret.Priority) { // exit the loop, because servers are already sorted by priority break; } } } } // if we have multiple lowServers then we have to pick a random one // BUT we have too involve the weight which can be used for "Load Balancing" here if (lowServers.Count > 1) { if (totalWeight > 0) { // Create a random value between 1 - total Weight int rnd = new Random().Next(1, totalWeight); int i = 0; foreach (SRVRecord sr in lowServers) { if (rnd > i && rnd <= (i + sr.Weight)) { ret = sr; break; } else { i += sr.Weight; } } } else { // Servers have no weight, they are all equal, pick a random server int rnd = new Random().Next(lowServers.Count); ret = (SRVRecord) lowServers[rnd]; } } return ret; } #endregion private void SendStreamHeader(bool startParser) { StringBuilder sb = new StringBuilder(); sb.Append(" // sb.Append(" xml:lang='" + "en" + "' "); sb.Append(">"); Open(sb.ToString()); } /// /// Sends our Presence, the packet is built of Status, Show and Priority /// public void SendMyPresence() { Presence pres = new Presence(m_Show, m_Status, m_Priority); // Add client caps when enabled if (m_EnableCapabilities) { if (m_Capabilities.Version == null) UpdateCapsVersion(); pres.AddChild(m_Capabilities); } this.Send(pres); } /// /// Sets the caps version automatically from the DiscoInfo object. /// Call this member after each change of the DiscoInfo object /// public void UpdateCapsVersion() { m_Capabilities.SetVersion(m_DiscoInfo); } internal void RequestLoginInfo() { AuthIq iq = new AuthIq(IqType.get, new Jid(base.Server)); iq.Query.Username = this.m_Username; IqGrabber.SendIq(iq, OnGetAuthInfo); } /// /// Changing the Password. You should use this function only when connected with SSL or TLS /// because the password is sent in plain text over the connection. /// /// /// /// /// After this request was successful the new password is set automatically in the Username Property /// /// /// value of the new password public void ChangePassword(string newPass) { /* Example 10. Password Change bill newpass Because the password change request contains the password in plain text, a client SHOULD NOT send such a request unless the underlying stream is encrypted (using SSL or TLS) and the client has verified that the server certificate is signed by a trusted certificate authority. A given domain MAY choose to disable password changes if the stream is not properly encrypted, or to disable in-band password changes entirely. If the user provides an empty password element or a password element that contains no XML character data (i.e., either or ), the server or service MUST NOT change the password to a null value, but instead MUST maintain the existing password. Example 11. Host Informs Client of Successful Password Change */ RegisterIq regIq = new RegisterIq(IqType.set, new Jid(base.Server)); regIq.Query.Username = this.m_Username; regIq.Query.Password = newPass; IqGrabber.SendIq(regIq, (object sender, IQEventArgs e) => OnChangePasswordResult(e, newPass) ); } /// /// /// /// /// /// contains the new password private void OnChangePasswordResult(IQEventArgs e, string newPass) { if (e.IQ.Type == IqType.result) { if(OnPasswordChanged!=null) OnPasswordChanged(this); // Set the new password in the Password property on sucess m_Password = newPass; e.Handled = true; } else if (e.IQ.Type == IqType.error) { /* The server or service SHOULD NOT return the original XML sent in IQ error stanzas related to password changes. Example 12. Host Informs Client of Failed Password Change (Bad Request) Example 13. Host Informs Client of Failed Password Change (Not Authorized) Example 14. Server Informs Client of Failed Password Change (Not Allowed) */ if(OnRegisterError!=null) OnRegisterError(this, e.IQ); } } #region << Register new Account >> /// /// requests the registration fields /// /// object which contains the features node which we need later for login again void GetRegistrationFields(Element elem) { // // // RegisterIq regIq = new RegisterIq(IqType.get, new Jid(base.Server)); IqGrabber.SendIq(regIq, (object sender, IQEventArgs e) => OnRegistrationFieldsResult(e, elem) ); } void OnRegistrationFieldsResult(IQEventArgs e, Element data) { if (e.IQ.Type != IqType.error) { if (e.IQ.Query is Register) { RegisterEventArgs args = new RegisterEventArgs(e.IQ.Query as Register); if (OnRegisterInformation != null) OnRegisterInformation(this, args); DoChangeXmppConnectionState(XmppConnectionState.Registering); IQ regIq = new IQ(IqType.set); regIq.GenerateId(); regIq.To = new Jid(base.Server); //RegisterIq regIq = new RegisterIq(IqType.set, new Jid(base.Server)); if (args.Auto) { Register reg = new Register(this.m_Username, this.m_Password); regIq.Query = reg; } else { regIq.Query = args.Register; } IqGrabber.SendIq(regIq, (object sender, IQEventArgs ev) => OnRegisterResult(ev, data) ); e.Handled = true; } } else { if (OnRegisterError != null) OnRegisterError(this, e.IQ); e.Handled = true; // not really } } private void OnRegisterResult(IQEventArgs e, Element data) { /* Example 6. Host Informs Entity of Failed Registration (Username Conflict) bill m1cro$oft billg@bigcompany.com Example 7. Host Informs Entity of Failed Registration (Some Required Information Not Provided) bill Calliope */ if (e.IQ.Type == IqType.result) { DoChangeXmppConnectionState(XmppConnectionState.Registered); if (OnRegistered != null) OnRegistered(this); if (this.StreamVersion != null && this.StreamVersion.StartsWith("1.")) { // init sasl login InitSaslHandler(); var eventArgs = new ElementEventArgs(data); m_SaslHandler.OnStreamElement(this, eventArgs); if (eventArgs.Handled) { e.Handled = true; } } else { // old jabber style login RequestLoginInfo(); e.Handled = true; } } else if (e.IQ.Type == IqType.error) { if (OnRegisterError != null) OnRegisterError(this, e.IQ); } } #endregion private void OnGetAuthInfo(object sender, IQEventArgs e) { // We get smth like this and should add password (digest) and ressource // Recv:gnauck // Send: // gnauck27c05d464e3f908db3b2ca1729674bfddb28daf2Office // // Recv: e.Handled = true; var iq = e.IQ; if (iq.Error != null) { FireOnAuthError(iq); return; } iq.GenerateId(); iq.SwitchDirection(); iq.Type = IqType.set; Auth auth = (Auth) iq.Query; auth.Resource = this.m_Resource; auth.SetAuth(this.m_Username, this.m_Password, this.StreamId); IqGrabber.SendIq(iq, OnAuthenticate); } /// /// Refreshes the myJid Member Variable /// private Jid BuildMyJid() { Jid jid = new Jid(null); jid.m_User = m_Username; jid.m_Server = Server; jid.m_Resource = m_Resource; jid.BuildJid(); return jid; } #region << RequestAgents >> public void RequestAgents() { AgentsIq iq = new AgentsIq(IqType.get, new Jid(base.Server)); IqGrabber.SendIq(iq, OnAgents); } private void OnAgents(object sender, IQEventArgs e) { e.Handled = true; if (OnAgentStart != null) OnAgentStart(this); Agents agents = e.IQ.Query as Agents; if (agents != null) { foreach (Agent a in agents.GetAgents()) { if (OnAgentItem != null) OnAgentItem(this, a); } } if (OnAgentEnd != null) OnAgentEnd(this); e.Handled = true; } #endregion #region << RequestRoster >> public void RequestRoster() { RosterIq iq = new RosterIq(IqType.get); Send(iq); } private void OnRosterIQ(IQ iq) { // if type == result then it must be the "FullRoster" we requested // in this case we raise OnRosterStart and OnRosterEnd // // if type == set its a new added r updated rosteritem. Here we dont raise // OnRosterStart and OnRosterEnd if (iq.Type == IqType.result && OnRosterStart != null) OnRosterStart(this); Roster r = iq.Query as Roster; if (r != null) { foreach (RosterItem i in r.GetRoster()) { if (OnRosterItem != null) OnRosterItem(this, i); } } if (iq.Type == IqType.result && OnRosterEnd != null) OnRosterEnd(this); if (m_AutoPresence && iq.Type == IqType.result) SendMyPresence(); } #endregion private void OnAuthenticate(object sender, IQEventArgs e) { if (e.IQ.Type == IqType.result) { m_Authenticated = true; RaiseOnLogin(); e.Handled = true; } else if(e.IQ.Type == IqType.error) { /* * * * test * dc7e472abb95b65c2b75129ade607170be478b16 * MiniClient * * Unauthorized * * */ if (OnAuthError!=null) OnAuthError(this, e.IQ); } } internal void FireOnAuthError(Element e) { if (OnAuthError!=null) OnAuthError(this, e); } #region << StreamParser Events >> public override void StreamParserOnStreamStart(object sender, Node e) { base.StreamParserOnStreamStart(this, e); m_StreamStarted = true; //m_CleanUpDone = false; moved that to _Open(); protocol.Stream st = (protocol.Stream)e; if (st == null) return; // Read the server language string m_ServerLanguage = st.Language; // Auth stuff if (!RegisterAccount) { if (this.StreamVersion != null && this.StreamVersion.StartsWith("1.")) { if (!Authenticated) { // we assume server supports SASL here, because it advertised a StreamVersion 1.X // and wait for the stream features and initialize the SASL Handler InitSaslHandler(); } } else { // old auth stuff RequestLoginInfo(); } } else { // Register on "old" jabber servers without stream features if (this.StreamVersion == null) GetRegistrationFields(null); } } private void InitSaslHandler() { if (m_SaslHandler == null) { m_SaslHandler = new SaslHandler(this); m_SaslHandler.OnSaslStart += new SaslEventHandler(m_SaslHandler_OnSaslStart); m_SaslHandler.OnSaslEnd += new ObjectHandler(m_SaslHandler_OnSaslEnd); } } public override void StreamParserOnStreamEnd(object sender, Node e) { base.StreamParserOnStreamEnd(sender, e); if (!m_CleanUpDone) CleanupSession(); } public override void StreamParserOnStreamElement(object sender, ElementEventArgs eventArgs) { base.StreamParserOnStreamElement(sender, eventArgs); bool handled = false; var e = eventArgs.Element; if (e is IQ) { IQ iq = e as IQ; if (OnIq != null) { var ev = new IQEventArgs(iq); OnIq(this, ev); handled = handled || ev.Handled; } if ( iq != null && iq.Query != null) { // Roster if (iq.Query is Roster) { OnRosterIQ(iq); handled = true; } } } else if (e is Message) { if (OnMessage != null) { OnMessage(this, e as Message); handled = true; } } else if (e is Presence) { if (OnPresence != null) { OnPresence(this, e as Presence); handled = true; } } else if (e is protocol.stream.Features) { // Stream Features // StartTLS stuff protocol.stream.Features f = e as protocol.stream.Features; #if SSL || BCCRYPTO || CF_2 if (f.SupportsStartTls && m_UseStartTLS) { DoChangeXmppConnectionState(XmppConnectionState.Securing); Send(new StartTls()); } // connection is not encrypted, doesn't support starttls but tls is forced else if (!ClientSocket.IsEncrypted && !f.SupportsStartTls && ForceStartTls) { FireOnError(this, new StartTlsException("StartTls is not supported on this server")); Close(); } else #endif if (m_UseCompression && f.SupportsCompression && f.Compression.SupportsMethod(CompressionMethod.zlib)) { // Check for Stream Compression // we support only ZLIB because its a free algorithm without patents // yes ePatents suck DoChangeXmppConnectionState(XmppConnectionState.StartCompression); Send(new Compress(CompressionMethod.zlib)); } else if (m_RegisterAccount) { // Do registration after TLS when possible if (f.SupportsRegistration) GetRegistrationFields(e); else { // registration is not enabled on this server FireOnError(this, new RegisterException("Registration is not allowed on this server")); Close(); // Close the stream } } ServerCapabilities = f.Capabilities; } #if SSL || BCCRYPTO || CF_2 else if (e is Proceed) { StreamParser.Reset(); if (ClientSocket.StartTls()) { SendStreamHeader(false); DoChangeXmppConnectionState(XmppConnectionState.Authenticating); handled = true; } } #endif else if (e is Compressed) { //DoChangeXmppConnectionState(XmppConnectionState.StartCompression); StreamParser.Reset(); ClientSocket.StartCompression(); // Start new Stream Header compressed. SendStreamHeader(false); DoChangeXmppConnectionState(XmppConnectionState.Compressed); handled = true; } else if (e is agsXMPP.protocol.Error) { if (OnStreamError != null) { OnStreamError(this, e as Element); handled = true; } } if (handled) { eventArgs.Handled = true; } } public override void StreamParserStreamElementNotHandled(object sender, UnhandledElementEventArgs eventArgs) { var stanza = eventArgs.Element as protocol.Base.StanzaWithError; if (stanza == null) { // what should we do here? return; } if (stanza.Error != null) { // don't respond to error messages with service unavailable return; } stanza.Error = new protocol.client.Error(ErrorCondition.ServiceUnavailable); stanza.SwitchDirection(); // allow the client to prevent this message (privacy/security reasons) var ev = new SendingServiceUnavailableEventArgs(stanza); OnSendingServiceUnavailable(ev); if (ev.Cancel) { // the client has cancelled this return; } Send(eventArgs.Element); } public override void StreamParserOnStreamError(object sender, Exception ex) { base.StreamParserOnStreamError(sender, ex); SocketDisconnect(); CleanupSession(); //this._NetworkStream.Close(); FireOnError(this, ex); if (!m_CleanUpDone) CleanupSession(); } #endregion public override void Send(Element e) { if (!(ClientSocket is BoshClientSocket)) { // this is a hack to not send the xmlns="jabber:client" with all packets Element dummyEl = new Element("a"); dummyEl.Namespace = Uri.CLIENT; dummyEl.AddChild(e); string toSend = dummyEl.ToString(); Send(toSend.Substring(25, toSend.Length - 25 - 4)); } else base.Send(e); } /// /// Does the Clieanup of the Session and sends the OnClose Event /// private void CleanupSession() { m_CleanUpDone = true; // TODO, check if this is always OK if (ClientSocket.Connected) ClientSocket.Disconnect(); DoChangeXmppConnectionState(XmppConnectionState.Disconnected); StreamParser.Reset(); m_IqGrabber.Clear(); m_MessageGrabber.Clear(); if (m_SaslHandler != null) { m_SaslHandler.Dispose(); m_SaslHandler = null; } m_Authenticated = false; m_Binded = false; DestroyKeepAliveTimer(); if (OnClose!=null) OnClose(this); } internal void Reset() { // tell also the socket that we need to reset the stream, this is needed for BOSH ClientSocket.Reset(); StreamParser.Reset(); SendStreamHeader(false); } internal void DoRaiseEventBinded() { if (OnBinded!=null) OnBinded(this); } internal void DoRaiseEventBindError(Element iq) { if (OnBindError != null) OnBindError(this, iq); } #region << SASL Handler Events >> private void m_SaslHandler_OnSaslStart(object sender, SaslEventArgs args) { // This acts only as a tunnel to the client if (OnSaslStart!=null) OnSaslStart(this, args); } internal void RaiseOnLogin() { if (KeepAlive) CreateKeepAliveTimer(); if (OnLogin!=null) OnLogin(this); if(m_AutoAgents) RequestAgents(); if (m_AutoRoster) RequestRoster(); } private void m_SaslHandler_OnSaslEnd(object sender) { if (OnSaslEnd!=null) OnSaslEnd(this); m_Authenticated = true; } #endregion } public class SendingServiceUnavailableEventArgs : CancelEventArgs { public protocol.Base.StanzaWithError Stanza { get; protected set; } public SendingServiceUnavailableEventArgs(protocol.Base.StanzaWithError stanza) :base() { Stanza = stanza; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC_20.csproj.user0000644000175000017500000000036312204443225023703 0ustar00meebeymeebey00000000000000 E282E6BE-C7C3-4ece-916A-88FB1CF8AF3C ProjectFiles smuxi-1.1/lib/agsxmpp/agsxmpp/Exceptions/0000755000175000017500000000000012245370027021345 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Exceptions/StartTlsException.cs0000644000175000017500000000250212245370027025332 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Exceptions { public class StartTlsException : Exception { public StartTlsException() { } public StartTlsException(string msg) : base(msg) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Exceptions/JidException.cs0000644000175000017500000000272512204443225024263 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Exceptions { public class JidException : Exception { /// /// /// public JidException() { } /// /// /// /// public JidException(string msg) : base(msg) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Exceptions/XmlRpcException.cs0000644000175000017500000000313312204443225024754 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Exceptions { public class XmlRpcException : Exception { public XmlRpcException() : base() { } public XmlRpcException(string msg) : base(msg) { } public XmlRpcException(int code, string msg) : base(msg) { this.m_Code = code; } private int m_Code; public int Code { get { return m_Code; } set { m_Code = value; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Exceptions/RegisterException.cs0000644000175000017500000000250212204443225025332 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Exceptions { public class RegisterException : Exception { public RegisterException() { } public RegisterException(string msg) : base(msg) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Properties/0000755000175000017500000000000012204443225021354 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Properties/AssemblyInfo.cs0000644000175000017500000000614012204443225024277 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Reflection; using System.Runtime.CompilerServices; // // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. // [assembly: AssemblyTitle("agsXMPP")] [assembly: AssemblyDescription("agsXMPP Library")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("AG-Software")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("AG-Software")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("1.3.0")] [assembly: CLSCompliant(true)] // // In order to sign your assembly you must specify a key to use. Refer to the // Microsoft .NET Framework documentation for more information on assembly signing. // // Use the attributes below to control which key is used for signing. // // Notes: // (*) If no key is specified - the assembly cannot be signed. // (*) KeyName refers to a key that has been installed in the Crypto Service // Provider (CSP) on your machine. // (*) If the key file and a key name attributes are both specified, the // following processing occurs: // (1) If the KeyName can be found in the CSP - that key is used. // (2) If the KeyName does not exist and the KeyFile does exist, the key // in the file is installed into the CSP and used. // (*) Delay Signing is an advanced option - see the Microsoft .NET Framework // documentation for more information on this. // [assembly: AssemblyDelaySign(false)] //[assembly: AssemblyKeyFile("")] #if CF [assembly: AssemblyKeyFile(@"..\..\key.snk")] #endif //[assembly: AssemblyKeyName("")] smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC.csproj.user0000644000175000017500000000414512204443225023404 0ustar00meebeymeebey00000000000000 Debug AnyCPU Same as device of consuming project 0 ProjectFiles E282E6BE-C7C3-4ece-916A-88FB1CF8AF3C false false false false false Project false false false false false false Project true smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC.sln0000644000175000017500000000161112204443225021716 0ustar00meebeymeebey00000000000000Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "agsXMPP_PPC", "agsXMPP_PPC.csproj", "{E236C510-8B5D-4F06-AD31-97900F72FCF4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E236C510-8B5D-4F06-AD31-97900F72FCF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E236C510-8B5D-4F06-AD31-97900F72FCF4}.Debug|Any CPU.Build.0 = Debug|Any CPU {E236C510-8B5D-4F06-AD31-97900F72FCF4}.Release|Any CPU.ActiveCfg = Release|Any CPU {E236C510-8B5D-4F06-AD31-97900F72FCF4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal smuxi-1.1/lib/agsxmpp/agsxmpp/IO/0000755000175000017500000000000012204443225017527 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/0000755000175000017500000000000012204443225022030 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/DeflaterConstants.cs0000644000175000017500000001344212204443225026006 0ustar00meebeymeebey00000000000000// DeflaterConstants.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression { /// /// This class contains constants used for deflation. /// public class DeflaterConstants { /// /// Set to true to enable debugging /// public const bool DEBUGGING = false; /// /// Written to Zip file to identify a stored block /// public const int STORED_BLOCK = 0; /// /// Identifies static tree in Zip file /// public const int STATIC_TREES = 1; /// /// Identifies dynamic tree in Zip file /// public const int DYN_TREES = 2; /// /// Header flag indicating a preset dictionary for deflation /// public const int PRESET_DICT = 0x20; /// /// Sets internal buffer sizes for Huffman encoding /// public const int DEFAULT_MEM_LEVEL = 8; /// /// Internal compression engine constant /// public const int MAX_MATCH = 258; /// /// Internal compression engine constant /// public const int MIN_MATCH = 3; /// /// Internal compression engine constant /// public const int MAX_WBITS = 15; /// /// Internal compression engine constant /// public const int WSIZE = 1 << MAX_WBITS; /// /// Internal compression engine constant /// public const int WMASK = WSIZE - 1; /// /// Internal compression engine constant /// public const int HASH_BITS = DEFAULT_MEM_LEVEL + 7; /// /// Internal compression engine constant /// public const int HASH_SIZE = 1 << HASH_BITS; /// /// Internal compression engine constant /// public const int HASH_MASK = HASH_SIZE - 1; /// /// Internal compression engine constant /// public const int HASH_SHIFT = (HASH_BITS + MIN_MATCH - 1) / MIN_MATCH; /// /// Internal compression engine constant /// public const int MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; /// /// Internal compression engine constant /// public const int MAX_DIST = WSIZE - MIN_LOOKAHEAD; /// /// Internal compression engine constant /// public const int PENDING_BUF_SIZE = 1 << (DEFAULT_MEM_LEVEL + 8); /// /// Internal compression engine constant /// public static int MAX_BLOCK_SIZE = Math.Min(65535, PENDING_BUF_SIZE - 5); /// /// Internal compression engine constant /// public const int DEFLATE_STORED = 0; /// /// Internal compression engine constant /// public const int DEFLATE_FAST = 1; /// /// Internal compression engine constant /// public const int DEFLATE_SLOW = 2; /// /// Internal compression engine constant /// public static int[] GOOD_LENGTH = { 0, 4, 4, 4, 4, 8, 8, 8, 32, 32 }; /// /// Internal compression engine constant /// public static int[] MAX_LAZY = { 0, 4, 5, 6, 4, 16, 16, 32, 128, 258 }; /// /// Internal compression engine constant /// public static int[] NICE_LENGTH = { 0, 8, 16, 32, 16, 32, 128, 128, 258, 258 }; /// /// Internal compression engine constant /// public static int[] MAX_CHAIN = { 0, 4, 8, 32, 16, 32, 128, 256, 1024, 4096 }; /// /// Internal compression engine constant /// public static int[] COMPR_FUNC = { 0, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/SharpZipBaseException.cs0000644000175000017500000000575312204443225026603 0ustar00meebeymeebey00000000000000// SharpZipBaseException.cs // // Copyright 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 1998, 1999, 2000, 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression { /// /// SharpZipBaseException is the base exception class for the SharpZipLibrary. /// All library exceptions are derived from this. /// public class SharpZipBaseException : ApplicationException { /// /// Initializes a new instance of the SharpZipLibraryException class. /// public SharpZipBaseException() { } /// /// Initializes a new instance of the SharpZipLibraryException class with a specified error message. /// public SharpZipBaseException(string msg) : base(msg) { } /// /// Initializes a new instance of the SharpZipLibraryException class with a specified /// error message and a reference to the inner exception that is the cause of this exception. /// /// Error message string /// The inner exception public SharpZipBaseException(string message, Exception innerException) : base(message, innerException) { } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/InflaterHuffmanTree.cs0000644000175000017500000001524012204443225026252 0ustar00meebeymeebey00000000000000// InflaterHuffmanTree.cs // Copyright (C) 2001 Mike Krueger // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; using agsXMPP.IO.Compression.Streams; namespace agsXMPP.IO.Compression { /// /// Huffman tree used for inflation /// public class InflaterHuffmanTree { static int MAX_BITLEN = 15; short[] tree; /// /// Literal length tree /// public static InflaterHuffmanTree defLitLenTree; /// /// Distance tree /// public static InflaterHuffmanTree defDistTree; static InflaterHuffmanTree() { try { byte[] codeLengths = new byte[288]; int i = 0; while (i < 144) { codeLengths[i++] = 8; } while (i < 256) { codeLengths[i++] = 9; } while (i < 280) { codeLengths[i++] = 7; } while (i < 288) { codeLengths[i++] = 8; } defLitLenTree = new InflaterHuffmanTree(codeLengths); codeLengths = new byte[32]; i = 0; while (i < 32) { codeLengths[i++] = 5; } defDistTree = new InflaterHuffmanTree(codeLengths); } catch (Exception) { throw new SharpZipBaseException("InflaterHuffmanTree: static tree length illegal"); } } /// /// Constructs a Huffman tree from the array of code lengths. /// /// /// the array of code lengths /// public InflaterHuffmanTree(byte[] codeLengths) { BuildTree(codeLengths); } void BuildTree(byte[] codeLengths) { int[] blCount = new int[MAX_BITLEN + 1]; int[] nextCode = new int[MAX_BITLEN + 1]; for (int i = 0; i < codeLengths.Length; i++) { int bits = codeLengths[i]; if (bits > 0) { blCount[bits]++; } } int code = 0; int treeSize = 512; for (int bits = 1; bits <= MAX_BITLEN; bits++) { nextCode[bits] = code; code += blCount[bits] << (16 - bits); if (bits >= 10) { /* We need an extra table for bit lengths >= 10. */ int start = nextCode[bits] & 0x1ff80; int end = code & 0x1ff80; treeSize += (end - start) >> (16 - bits); } } /* -jr comment this out! doesnt work for dynamic trees and pkzip 2.04g if (code != 65536) { throw new SharpZipBaseException("Code lengths don't add up properly."); } */ /* Now create and fill the extra tables from longest to shortest * bit len. This way the sub trees will be aligned. */ tree = new short[treeSize]; int treePtr = 512; for (int bits = MAX_BITLEN; bits >= 10; bits--) { int end = code & 0x1ff80; code -= blCount[bits] << (16 - bits); int start = code & 0x1ff80; for (int i = start; i < end; i += 1 << 7) { tree[DeflaterHuffman.BitReverse(i)] = (short) ((-treePtr << 4) | bits); treePtr += 1 << (bits-9); } } for (int i = 0; i < codeLengths.Length; i++) { int bits = codeLengths[i]; if (bits == 0) { continue; } code = nextCode[bits]; int revcode = DeflaterHuffman.BitReverse(code); if (bits <= 9) { do { tree[revcode] = (short) ((i << 4) | bits); revcode += 1 << bits; } while (revcode < 512); } else { int subTree = tree[revcode & 511]; int treeLen = 1 << (subTree & 15); subTree = -(subTree >> 4); do { tree[subTree | (revcode >> 9)] = (short) ((i << 4) | bits); revcode += 1 << bits; } while (revcode < treeLen); } nextCode[bits] = code + (1 << (16 - bits)); } } /// /// Reads the next symbol from input. The symbol is encoded using the /// huffman tree. /// /// /// input the input source. /// /// /// the next symbol, or -1 if not enough input is available. /// public int GetSymbol(StreamManipulator input) { int lookahead, symbol; if ((lookahead = input.PeekBits(9)) >= 0) { if ((symbol = tree[lookahead]) >= 0) { input.DropBits(symbol & 15); return symbol >> 4; } int subtree = -(symbol >> 4); int bitlen = symbol & 15; if ((lookahead = input.PeekBits(bitlen)) >= 0) { symbol = tree[subtree | (lookahead >> 9)]; input.DropBits(symbol & 15); return symbol >> 4; } else { int bits = input.AvailableBits; lookahead = input.PeekBits(bits); symbol = tree[subtree | (lookahead >> 9)]; if ((symbol & 15) <= bits) { input.DropBits(symbol & 15); return symbol >> 4; } else { return -1; } } } else { int bits = input.AvailableBits; lookahead = input.PeekBits(bits); symbol = tree[lookahead]; if (symbol >= 0 && (symbol & 15) <= bits) { input.DropBits(symbol & 15); return symbol >> 4; } else { return -1; } } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Streams/0000755000175000017500000000000012204443225023446 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Streams/StreamManipulator.cs0000644000175000017500000002045312204443225027450 0ustar00meebeymeebey00000000000000// StreamManipulator.cs // // Copyright (C) 2001 Mike Krueger // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression.Streams { /// /// This class allows us to retrieve a specified number of bits from /// the input buffer, as well as copy big byte blocks. /// /// It uses an int buffer to store up to 31 bits for direct /// manipulation. This guarantees that we can get at least 16 bits, /// but we only need at most 15, so this is all safe. /// /// There are some optimizations in this class, for example, you must /// never peek more than 8 bits more than needed, and you must first /// peek bits before you may drop them. This is not a general purpose /// class but optimized for the behaviour of the Inflater. /// /// authors of the original java version : John Leuner, Jochen Hoenicke /// public class StreamManipulator { private byte[] window; private int window_start = 0; private int window_end = 0; private uint buffer = 0; private int bits_in_buffer = 0; /// /// Get the next n bits but don't increase input pointer. n must be /// less or equal 16 and if this call succeeds, you must drop /// at least n - 8 bits in the next call. /// /// /// the value of the bits, or -1 if not enough bits available. */ /// public int PeekBits(int n) { if (bits_in_buffer < n) { if (window_start == window_end) { return -1; // ok } buffer |= (uint)((window[window_start++] & 0xff | (window[window_start++] & 0xff) << 8) << bits_in_buffer); bits_in_buffer += 16; } return (int)(buffer & ((1 << n) - 1)); } /// /// Drops the next n bits from the input. You should have called PeekBits /// with a bigger or equal n before, to make sure that enough bits are in /// the bit buffer. /// public void DropBits(int n) { buffer >>= n; bits_in_buffer -= n; } /// /// Gets the next n bits and increases input pointer. This is equivalent /// to PeekBits followed by dropBits, except for correct error handling. /// /// /// the value of the bits, or -1 if not enough bits available. /// public int GetBits(int n) { int bits = PeekBits(n); if (bits >= 0) { DropBits(n); } return bits; } /// /// Gets the number of bits available in the bit buffer. This must be /// only called when a previous PeekBits() returned -1. /// /// /// the number of bits available. /// public int AvailableBits { get { return bits_in_buffer; } } /// /// Gets the number of bytes available. /// /// /// The number of bytes available. /// public int AvailableBytes { get { return window_end - window_start + (bits_in_buffer >> 3); } } /// /// Skips to the next byte boundary. /// public void SkipToByteBoundary() { buffer >>= (bits_in_buffer & 7); bits_in_buffer &= ~7; } /// /// Returns true when SetInput can be called /// public bool IsNeedingInput { get { return window_start == window_end; } } /// /// Copies length bytes from input buffer to output buffer starting /// at output[offset]. You have to make sure, that the buffer is /// byte aligned. If not enough bytes are available, copies fewer /// bytes. /// /// /// The buffer to copy bytes to. /// /// /// The offset in the buffer at which copying starts /// /// /// The length to copy, 0 is allowed. /// /// /// The number of bytes copied, 0 if no bytes were available. /// /// /// Length is less than zero /// /// /// Bit buffer isnt byte aligned /// public int CopyBytes(byte[] output, int offset, int length) { if (length < 0) { throw new ArgumentOutOfRangeException("length"); } if ((bits_in_buffer & 7) != 0) { /* bits_in_buffer may only be 0 or a multiple of 8 */ throw new InvalidOperationException("Bit buffer is not byte aligned!"); } int count = 0; while (bits_in_buffer > 0 && length > 0) { output[offset++] = (byte) buffer; buffer >>= 8; bits_in_buffer -= 8; length--; count++; } if (length == 0) { return count; } int avail = window_end - window_start; if (length > avail) { length = avail; } System.Array.Copy(window, window_start, output, offset, length); window_start += length; if (((window_start - window_end) & 1) != 0) { /* We always want an even number of bytes in input, see peekBits */ buffer = (uint)(window[window_start++] & 0xff); bits_in_buffer = 8; } return count + length; } /// /// Constructs a default StreamManipulator with all buffers empty /// public StreamManipulator() { } /// /// resets state and empties internal buffers /// public void Reset() { buffer = (uint)(window_start = window_end = bits_in_buffer = 0); } /// /// Add more input for consumption. /// Only call when IsNeedingInput returns true /// /// data to be input /// offset of first byte of input /// length of input public void SetInput(byte[] buf, int off, int len) { if (window_start < window_end) { throw new InvalidOperationException("Old input was not completely processed"); } int end = off + len; /* We want to throw an ArrayIndexOutOfBoundsException early. The * check is very tricky: it also handles integer wrap around. */ if (0 > off || off > end || end > buf.Length) { throw new ArgumentOutOfRangeException(); } if ((len & 1) != 0) { /* We always want an even number of bytes in input, see peekBits */ buffer |= (uint)((buf[off++] & 0xff) << bits_in_buffer); bits_in_buffer += 8; } window = buf; window_start = off; window_end = end; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Streams/OutputWindow.cs0000644000175000017500000001631712204443225026475 0ustar00meebeymeebey00000000000000// OutputWindow.cs // // Copyright (C) 2001 Mike Krueger // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression.Streams { /// /// Contains the output from the Inflation process. /// We need to have a window so that we can refer backwards into the output stream /// to repeat stuff.
/// Author of the original java version : John Leuner ///
public class OutputWindow { private static int WINDOW_SIZE = 1 << 15; private static int WINDOW_MASK = WINDOW_SIZE - 1; private byte[] window = new byte[WINDOW_SIZE]; //The window is 2^15 bytes private int windowEnd = 0; private int windowFilled = 0; /// /// Write a byte to this output window /// /// value to write /// /// if window is full /// public void Write(int abyte) { if (windowFilled++ == WINDOW_SIZE) { throw new InvalidOperationException("Window full"); } window[windowEnd++] = (byte) abyte; windowEnd &= WINDOW_MASK; } private void SlowRepeat(int repStart, int len, int dist) { while (len-- > 0) { window[windowEnd++] = window[repStart++]; windowEnd &= WINDOW_MASK; repStart &= WINDOW_MASK; } } /// /// Append a byte pattern already in the window itself /// /// length of pattern to copy /// distance from end of window pattern occurs /// /// If the repeated data overflows the window /// public void Repeat(int len, int dist) { if ((windowFilled += len) > WINDOW_SIZE) { throw new InvalidOperationException("Window full"); } int rep_start = (windowEnd - dist) & WINDOW_MASK; int border = WINDOW_SIZE - len; if (rep_start <= border && windowEnd < border) { if (len <= dist) { System.Array.Copy(window, rep_start, window, windowEnd, len); windowEnd += len; } else { /* We have to copy manually, since the repeat pattern overlaps. */ while (len-- > 0) { window[windowEnd++] = window[rep_start++]; } } } else { SlowRepeat(rep_start, len, dist); } } /// /// Copy from input manipulator to internal window /// /// source of data /// length of data to copy /// the number of bytes copied public int CopyStored(StreamManipulator input, int len) { len = Math.Min(Math.Min(len, WINDOW_SIZE - windowFilled), input.AvailableBytes); int copied; int tailLen = WINDOW_SIZE - windowEnd; if (len > tailLen) { copied = input.CopyBytes(window, windowEnd, tailLen); if (copied == tailLen) { copied += input.CopyBytes(window, 0, len - tailLen); } } else { copied = input.CopyBytes(window, windowEnd, len); } windowEnd = (windowEnd + copied) & WINDOW_MASK; windowFilled += copied; return copied; } /// /// Copy dictionary to window /// /// source dictionary /// offset of start in source dictionary /// length of dictionary /// /// If window isnt empty /// public void CopyDict(byte[] dict, int offset, int len) { if (windowFilled > 0) { throw new InvalidOperationException(); } if (len > WINDOW_SIZE) { offset += len - WINDOW_SIZE; len = WINDOW_SIZE; } System.Array.Copy(dict, offset, window, 0, len); windowEnd = len & WINDOW_MASK; } /// /// Get remaining unfilled space in window /// /// Number of bytes left in window public int GetFreeSpace() { return WINDOW_SIZE - windowFilled; } /// /// Get bytes available for output in window /// /// Number of bytes filled public int GetAvailable() { return windowFilled; } /// /// Copy contents of window to output /// /// buffer to copy to /// offset to start at /// number of bytes to count /// The number of bytes copied /// /// If a window underflow occurs /// public int CopyOutput(byte[] output, int offset, int len) { int copy_end = windowEnd; if (len > windowFilled) { len = windowFilled; } else { copy_end = (windowEnd - windowFilled + len) & WINDOW_MASK; } int copied = len; int tailLen = len - copy_end; if (tailLen > 0) { System.Array.Copy(window, WINDOW_SIZE - tailLen, output, offset, tailLen); offset += tailLen; len = copy_end; } System.Array.Copy(window, copy_end - len, output, offset, len); windowFilled -= copied; if (windowFilled < 0) { throw new InvalidOperationException(); } return copied; } /// /// Reset by clearing window so GetAvailable returns 0 /// public void Reset() { windowFilled = windowEnd = 0; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/PendingBuffer.cs0000644000175000017500000001671312204443225025105 0ustar00meebeymeebey00000000000000// PendingBuffer.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression { /// /// This class is general purpose class for writing data to a buffer. /// /// It allows you to write bits as well as bytes /// Based on DeflaterPending.java /// /// author of the original java version : Jochen Hoenicke /// public class PendingBuffer { /// Internal work buffer /// protected byte[] buf; int start; int end; uint bits; int bitCount; /// /// construct instance using default buffer size of 4096 /// public PendingBuffer() : this( 4096 ) { } /// /// construct instance using specified buffer size /// /// /// size to use for internal buffer /// public PendingBuffer(int bufsize) { buf = new byte[bufsize]; } /// /// Clear internal state/buffers /// public void Reset() { start = end = bitCount = 0; } /// /// write a byte to buffer /// /// /// value to write /// public void WriteByte(int b) { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } buf[end++] = (byte) b; } /// /// Write a short value to buffer LSB first /// /// /// value to write /// public void WriteShort(int s) { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } buf[end++] = (byte) s; buf[end++] = (byte) (s >> 8); } /// /// write an integer LSB first /// /// value to write public void WriteInt(int s) { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } buf[end++] = (byte) s; buf[end++] = (byte) (s >> 8); buf[end++] = (byte) (s >> 16); buf[end++] = (byte) (s >> 24); } /// /// Write a block of data to buffer /// /// data to write /// offset of first byte to write /// number of bytes to write public void WriteBlock(byte[] block, int offset, int len) { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } System.Array.Copy(block, offset, buf, end, len); end += len; } /// /// The number of bits written to the buffer /// public int BitCount { get { return bitCount; } } /// /// Align internal buffer on a byte boundary /// public void AlignToByte() { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } if (bitCount > 0) { buf[end++] = (byte) bits; if (bitCount > 8) { buf[end++] = (byte) (bits >> 8); } } bits = 0; bitCount = 0; } /// /// Write bits to internal buffer /// /// source of bits /// number of bits to write public void WriteBits(int b, int count) { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("writeBits("+b+","+count+")"); // } bits |= (uint)(b << bitCount); bitCount += count; if (bitCount >= 16) { buf[end++] = (byte) bits; buf[end++] = (byte) (bits >> 8); bits >>= 16; bitCount -= 16; } } /// /// Write a short value to internal buffer most significant byte first /// /// value to write public void WriteShortMSB(int s) { if (DeflaterConstants.DEBUGGING && start != 0) { throw new SharpZipBaseException(); } buf[end++] = (byte) (s >> 8); buf[end++] = (byte) s; } /// /// Indicates if buffer has been flushed /// public bool IsFlushed { get { return end == 0; } } /// /// Flushes the pending buffer into the given output array. If the /// output array is to small, only a partial flush is done. /// /// /// the output array; /// /// /// the offset into output array; /// /// /// length the maximum number of bytes to store; /// /// /// IndexOutOfBoundsException if offset or length are invalid. /// public int Flush(byte[] output, int offset, int length) { if (bitCount >= 8) { buf[end++] = (byte) bits; bits >>= 8; bitCount -= 8; } if (length > end - start) { length = end - start; System.Array.Copy(buf, start, output, offset, length); start = 0; end = 0; } else { System.Array.Copy(buf, start, output, offset, length); start += length; } return length; } /// /// Convert internal buffer to byte array. /// Buffer is empty on completion /// /// /// converted buffer contents contents /// public byte[] ToByteArray() { byte[] ret = new byte[end - start]; System.Array.Copy(buf, start, ret, 0, ret.Length); start = 0; end = 0; return ret; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/DeflaterEngine.cs0000644000175000017500000005420612204443225025242 0ustar00meebeymeebey00000000000000// DeflaterEngine.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; using agsXMPP.IO.Compression.Checksums; namespace agsXMPP.IO.Compression { /// /// Strategies for deflater /// public enum DeflateStrategy { /// /// The default strategy /// Default = 0, /// /// This strategy will only allow longer string repetitions. It is /// useful for random data with a small character set. /// Filtered = 1, /// /// This strategy will not look for string repetitions at all. It /// only encodes with Huffman trees (which means, that more common /// characters get a smaller encoding. /// HuffmanOnly = 2 } // DEFLATE ALGORITHM: // // The uncompressed stream is inserted into the window array. When // the window array is full the first half is thrown away and the // second half is copied to the beginning. // // The head array is a hash table. Three characters build a hash value // and they the value points to the corresponding index in window of // the last string with this hash. The prev array implements a // linked list of matches with the same hash: prev[index & WMASK] points // to the previous index with the same hash. // /// /// Low level compression engine for deflate algorithm which uses a 32K sliding window /// with secondary compression from Huffman/Shannon-Fano codes. /// public class DeflaterEngine : DeflaterConstants { static int TOO_FAR = 4096; int ins_h; /// /// Hashtable, hashing three characters to an index for window, so /// that window[index]..window[index+2] have this hash code. /// Note that the array should really be unsigned short, so you need /// to and the values with 0xffff. /// short[] head; /// /// prev[index & WMASK] points to the previous index that has the /// same hash code as the string starting at index. This way /// entries with the same hash code are in a linked list. /// Note that the array should really be unsigned short, so you need /// to and the values with 0xffff. /// short[] prev; int matchStart; int matchLen; bool prevAvailable; int blockStart; /// /// Points to the current character in the window. /// int strstart; /// /// lookahead is the number of characters starting at strstart in /// window that are valid. /// So window[strstart] until window[strstart+lookahead-1] are valid /// characters. /// int lookahead; /// /// This array contains the part of the uncompressed stream that /// is of relevance. The current character is indexed by strstart. /// byte[] window; DeflateStrategy strategy; int max_chain, max_lazy, niceLength, goodLength; /// /// The current compression function. /// int comprFunc; /// /// The input data for compression. /// byte[] inputBuf; /// /// The total bytes of input read. /// int totalIn; /// /// The offset into inputBuf, where input data starts. /// int inputOff; /// /// The end offset of the input data. /// int inputEnd; DeflaterPending pending; DeflaterHuffman huffman; /// /// The adler checksum /// Adler32 adler; /// /// Construct instance with pending buffer /// /// /// Pending buffer to use /// > public DeflaterEngine(DeflaterPending pending) { this.pending = pending; huffman = new DeflaterHuffman(pending); adler = new Adler32(); window = new byte[2 * WSIZE]; head = new short[HASH_SIZE]; prev = new short[WSIZE]; // We start at index 1, to avoid an implementation deficiency, that // we cannot build a repeat pattern at index 0. blockStart = strstart = 1; } /// /// Reset internal state /// public void Reset() { huffman.Reset(); adler.Reset(); blockStart = strstart = 1; lookahead = 0; totalIn = 0; prevAvailable = false; matchLen = MIN_MATCH - 1; for (int i = 0; i < HASH_SIZE; i++) { head[i] = 0; } for (int i = 0; i < WSIZE; i++) { prev[i] = 0; } } /// /// Reset Adler checksum /// public void ResetAdler() { adler.Reset(); } /// /// Get current value of Adler checksum /// public int Adler { get { return (int)adler.Value; } } /// /// Total data processed /// public int TotalIn { get { return totalIn; } } /// /// Get/set the deflate strategy /// public DeflateStrategy Strategy { get { return strategy; } set { strategy = value; } } /// /// Set the deflate level (0-9) /// public void SetLevel(int lvl) { goodLength = DeflaterConstants.GOOD_LENGTH[lvl]; max_lazy = DeflaterConstants.MAX_LAZY[lvl]; niceLength = DeflaterConstants.NICE_LENGTH[lvl]; max_chain = DeflaterConstants.MAX_CHAIN[lvl]; if (DeflaterConstants.COMPR_FUNC[lvl] != comprFunc) { /* if (DeflaterConstants.DEBUGGING) { Console.WriteLine("Change from " + comprFunc + " to " + DeflaterConstants.COMPR_FUNC[lvl]); } */ switch (comprFunc) { case DEFLATE_STORED: if (strstart > blockStart) { huffman.FlushStoredBlock(window, blockStart, strstart - blockStart, false); blockStart = strstart; } UpdateHash(); break; case DEFLATE_FAST: if (strstart > blockStart) { huffman.FlushBlock(window, blockStart, strstart - blockStart, false); blockStart = strstart; } break; case DEFLATE_SLOW: if (prevAvailable) { huffman.TallyLit(window[strstart-1] & 0xff); } if (strstart > blockStart) { huffman.FlushBlock(window, blockStart, strstart - blockStart, false); blockStart = strstart; } prevAvailable = false; matchLen = MIN_MATCH - 1; break; } comprFunc = COMPR_FUNC[lvl]; } } void UpdateHash() { /* if (DEBUGGING) { Console.WriteLine("updateHash: "+strstart); } */ ins_h = (window[strstart] << HASH_SHIFT) ^ window[strstart + 1]; } /// /// Inserts the current string in the head hash and returns the previous /// value for this hash. /// /// The previous hash value int InsertString() { short match; int hash = ((ins_h << HASH_SHIFT) ^ window[strstart + (MIN_MATCH -1)]) & HASH_MASK; /* if (DeflaterConstants.DEBUGGING) { if (hash != (((window[strstart] << (2*HASH_SHIFT)) ^ (window[strstart + 1] << HASH_SHIFT) ^ (window[strstart + 2])) & HASH_MASK)) { throw new SharpZipBaseException("hash inconsistent: " + hash + "/" +window[strstart] + "," +window[strstart+1] + "," +window[strstart+2] + "," + HASH_SHIFT); } } */ prev[strstart & WMASK] = match = head[hash]; head[hash] = (short)strstart; ins_h = hash; return match & 0xffff; } void SlideWindow() { Array.Copy(window, WSIZE, window, 0, WSIZE); matchStart -= WSIZE; strstart -= WSIZE; blockStart -= WSIZE; /* Slide the hash table (could be avoided with 32 bit values * at the expense of memory usage). */ for (int i = 0; i < HASH_SIZE; ++i) { int m = head[i] & 0xffff; head[i] = (short)(m >= WSIZE ? (m - WSIZE) : 0); } /* Slide the prev table. */ for (int i = 0; i < WSIZE; i++) { int m = prev[i] & 0xffff; prev[i] = (short)(m >= WSIZE ? (m - WSIZE) : 0); } } /// /// Fill the window /// public void FillWindow() { /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (strstart >= WSIZE + MAX_DIST) { SlideWindow(); } /* If there is not enough lookahead, but still some input left, * read in the input */ while (lookahead < DeflaterConstants.MIN_LOOKAHEAD && inputOff < inputEnd) { int more = 2 * WSIZE - lookahead - strstart; if (more > inputEnd - inputOff) { more = inputEnd - inputOff; } System.Array.Copy(inputBuf, inputOff, window, strstart + lookahead, more); adler.Update(inputBuf, inputOff, more); inputOff += more; totalIn += more; lookahead += more; } if (lookahead >= MIN_MATCH) { UpdateHash(); } } /// /// Find the best (longest) string in the window matching the /// string starting at strstart. /// /// Preconditions: /// /// strstart + MAX_MATCH <= window.length. /// /// /// True if a match greater than the minimum length is found bool FindLongestMatch(int curMatch) { int chainLength = this.max_chain; int niceLength = this.niceLength; short[] prev = this.prev; int scan = this.strstart; int match; int best_end = this.strstart + matchLen; int best_len = Math.Max(matchLen, MIN_MATCH - 1); int limit = Math.Max(strstart - MAX_DIST, 0); int strend = strstart + MAX_MATCH - 1; byte scan_end1 = window[best_end - 1]; byte scan_end = window[best_end]; /* Do not waste too much time if we already have a good match: */ if (best_len >= this.goodLength) { chainLength >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if (niceLength > lookahead) { niceLength = lookahead; } /* if (DeflaterConstants.DEBUGGING && strstart > 2 * WSIZE - MIN_LOOKAHEAD) { throw new InvalidOperationException("need lookahead"); } */ do { /* if (DeflaterConstants.DEBUGGING && curMatch >= strstart) { throw new InvalidOperationException("future match"); } */ if (window[curMatch + best_len] != scan_end || window[curMatch + best_len - 1] != scan_end1 || window[curMatch] != window[scan] || window[curMatch + 1] != window[scan + 1]) { continue; } match = curMatch + 2; scan += 2; /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart + 258. */ while (window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && scan < strend) ; if (scan > best_end) { /* if (DeflaterConstants.DEBUGGING && ins_h == 0) System.err.println("Found match: "+curMatch+"-"+(scan-strstart)); */ matchStart = curMatch; best_end = scan; best_len = scan - strstart; if (best_len >= niceLength) { break; } scan_end1 = window[best_end - 1]; scan_end = window[best_end]; } scan = strstart; } while ((curMatch = (prev[curMatch & WMASK] & 0xffff)) > limit && --chainLength != 0); matchLen = Math.Min(best_len, lookahead); return matchLen >= MIN_MATCH; } /// /// Set compression dictionary /// public void SetDictionary(byte[] buffer, int offset, int length) { /* if (DeflaterConstants.DEBUGGING && strstart != 1) { throw new InvalidOperationException("strstart not 1"); } */ adler.Update(buffer, offset, length); if (length < MIN_MATCH) { return; } if (length > MAX_DIST) { offset += length - MAX_DIST; length = MAX_DIST; } System.Array.Copy(buffer, offset, window, strstart, length); UpdateHash(); --length; while (--length > 0) { InsertString(); strstart++; } strstart += 2; blockStart = strstart; } bool DeflateStored(bool flush, bool finish) { if (!flush && lookahead == 0) { return false; } strstart += lookahead; lookahead = 0; int storedLen = strstart - blockStart; if ((storedLen >= DeflaterConstants.MAX_BLOCK_SIZE) || /* Block is full */ (blockStart < WSIZE && storedLen >= MAX_DIST) || /* Block may move out of window */ flush) { bool lastBlock = finish; if (storedLen > DeflaterConstants.MAX_BLOCK_SIZE) { storedLen = DeflaterConstants.MAX_BLOCK_SIZE; lastBlock = false; } /* if (DeflaterConstants.DEBUGGING) { Console.WriteLine("storedBlock["+storedLen+","+lastBlock+"]"); } */ huffman.FlushStoredBlock(window, blockStart, storedLen, lastBlock); blockStart += storedLen; return !lastBlock; } return true; } private bool DeflateFast(bool flush, bool finish) { if (lookahead < MIN_LOOKAHEAD && !flush) { return false; } while (lookahead >= MIN_LOOKAHEAD || flush) { if (lookahead == 0) { /* We are flushing everything */ huffman.FlushBlock(window, blockStart, strstart - blockStart, finish); blockStart = strstart; return false; } if (strstart > 2 * WSIZE - MIN_LOOKAHEAD) { /* slide window, as findLongestMatch needs this. * This should only happen when flushing and the window * is almost full. */ SlideWindow(); } int hashHead; if (lookahead >= MIN_MATCH && (hashHead = InsertString()) != 0 && strategy != DeflateStrategy.HuffmanOnly && strstart - hashHead <= MAX_DIST && FindLongestMatch(hashHead)) { /* longestMatch sets matchStart and matchLen */ /* if (DeflaterConstants.DEBUGGING) { for (int i = 0 ; i < matchLen; i++) { if (window[strstart+i] != window[matchStart + i]) { throw new SharpZipBaseException("Match failure"); } } } */ // -jr- Hak hak hak this stops problems with fast/low compression and index out of range if (huffman.TallyDist(strstart - matchStart, matchLen)) { bool lastBlock = finish && lookahead == 0; huffman.FlushBlock(window, blockStart, strstart - blockStart, lastBlock); blockStart = strstart; } lookahead -= matchLen; if (matchLen <= max_lazy && lookahead >= MIN_MATCH) { while (--matchLen > 0) { ++strstart; InsertString(); } ++strstart; } else { strstart += matchLen; if (lookahead >= MIN_MATCH - 1) { UpdateHash(); } } matchLen = MIN_MATCH - 1; continue; } else { /* No match found */ huffman.TallyLit(window[strstart] & 0xff); ++strstart; --lookahead; } if (huffman.IsFull()) { bool lastBlock = finish && lookahead == 0; huffman.FlushBlock(window, blockStart, strstart - blockStart, lastBlock); blockStart = strstart; return !lastBlock; } } return true; } bool DeflateSlow(bool flush, bool finish) { if (lookahead < MIN_LOOKAHEAD && !flush) { return false; } while (lookahead >= MIN_LOOKAHEAD || flush) { if (lookahead == 0) { if (prevAvailable) { huffman.TallyLit(window[strstart-1] & 0xff); } prevAvailable = false; // We are flushing everything /* if (DeflaterConstants.DEBUGGING && !flush) { throw new SharpZipBaseException("Not flushing, but no lookahead"); } */ huffman.FlushBlock(window, blockStart, strstart - blockStart, finish); blockStart = strstart; return false; } if (strstart >= 2 * WSIZE - MIN_LOOKAHEAD) { /* slide window, as findLongestMatch need this. * This should only happen when flushing and the window * is almost full. */ SlideWindow(); } int prevMatch = matchStart; int prevLen = matchLen; if (lookahead >= MIN_MATCH) { int hashHead = InsertString(); if (strategy != DeflateStrategy.HuffmanOnly && hashHead != 0 && strstart - hashHead <= MAX_DIST && FindLongestMatch(hashHead)) { /* longestMatch sets matchStart and matchLen */ /* Discard match if too small and too far away */ if (matchLen <= 5 && (strategy == DeflateStrategy.Filtered || (matchLen == MIN_MATCH && strstart - matchStart > TOO_FAR))) { matchLen = MIN_MATCH - 1; } } } /* previous match was better */ if (prevLen >= MIN_MATCH && matchLen <= prevLen) { /* if (DeflaterConstants.DEBUGGING) { for (int i = 0 ; i < matchLen; i++) { if (window[strstart-1+i] != window[prevMatch + i]) throw new SharpZipBaseException(); } } */ huffman.TallyDist(strstart - 1 - prevMatch, prevLen); prevLen -= 2; do { strstart++; lookahead--; if (lookahead >= MIN_MATCH) { InsertString(); } } while (--prevLen > 0); strstart ++; lookahead--; prevAvailable = false; matchLen = MIN_MATCH - 1; } else { if (prevAvailable) { huffman.TallyLit(window[strstart-1] & 0xff); } prevAvailable = true; strstart++; lookahead--; } if (huffman.IsFull()) { int len = strstart - blockStart; if (prevAvailable) { len--; } bool lastBlock = (finish && lookahead == 0 && !prevAvailable); huffman.FlushBlock(window, blockStart, len, lastBlock); blockStart += len; return !lastBlock; } } return true; } /// /// Deflate drives actual compression of data /// public bool Deflate(bool flush, bool finish) { bool progress; do { FillWindow(); bool canFlush = flush && inputOff == inputEnd; // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("window: ["+blockStart+","+strstart+"," // +lookahead+"], "+comprFunc+","+canFlush); // } switch (comprFunc) { case DEFLATE_STORED: progress = DeflateStored(canFlush, finish); break; case DEFLATE_FAST: progress = DeflateFast(canFlush, finish); break; case DEFLATE_SLOW: progress = DeflateSlow(canFlush, finish); break; default: throw new InvalidOperationException("unknown comprFunc"); } } while (pending.IsFlushed && progress); /* repeat while we have no pending output and progress was made */ return progress; } /// /// Sets input data to be deflated. Should only be called when NeedsInput() /// returns true /// /// The buffer containing input data. /// The index of the first byte of data. /// The number of bytes of data to use as input. public void SetInput(byte[] buf, int off, int len) { if (inputOff < inputEnd) { throw new InvalidOperationException("Old input was not completely processed"); } int end = off + len; /* We want to throw an ArrayIndexOutOfBoundsException early. The * check is very tricky: it also handles integer wrap around. */ if (0 > off || off > end || end > buf.Length) { throw new ArgumentOutOfRangeException(); } inputBuf = buf; inputOff = off; inputEnd = end; } /// /// Return true if input is needed via SetInput /// public bool NeedsInput() { return inputEnd == inputOff; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Inflater.cs0000644000175000017500000005674412204443225024143 0ustar00meebeymeebey00000000000000// Inflater.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; using agsXMPP.IO.Compression.Checksums; using agsXMPP.IO.Compression.Streams; namespace agsXMPP.IO.Compression { /// /// Inflater is used to decompress data that has been compressed according /// to the "deflate" standard described in rfc1951. /// /// By default Zlib (rfc1950) headers and footers are expected in the input. /// You can use constructor public Inflater(bool noHeader) passing true /// if there is no Zlib header information /// /// The usage is as following. First you have to set some input with /// setInput(), then inflate() it. If inflate doesn't /// inflate any bytes there may be three reasons: ///
    ///
  • needsInput() returns true because the input buffer is empty. /// You have to provide more input with setInput(). /// NOTE: needsInput() also returns true when, the stream is finished. ///
  • ///
  • needsDictionary() returns true, you have to provide a preset /// dictionary with setDictionary().
  • ///
  • finished() returns true, the inflater has finished.
  • ///
/// Once the first output byte is produced, a dictionary will not be /// needed at a later stage. /// /// author of the original java version : John Leuner, Jochen Hoenicke ///
public class Inflater { /// /// Copy lengths for literal codes 257..285 /// static int[] CPLENS = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 }; /// /// Extra bits for literal codes 257..285 /// static int[] CPLEXT = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; /// /// Copy offsets for distance codes 0..29 /// static int[] CPDIST = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 }; /// /// Extra bits for distance codes /// static int[] CPDEXT = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }; /// /// These are the possible states for an inflater /// const int DECODE_HEADER = 0; const int DECODE_DICT = 1; const int DECODE_BLOCKS = 2; const int DECODE_STORED_LEN1 = 3; const int DECODE_STORED_LEN2 = 4; const int DECODE_STORED = 5; const int DECODE_DYN_HEADER = 6; const int DECODE_HUFFMAN = 7; const int DECODE_HUFFMAN_LENBITS = 8; const int DECODE_HUFFMAN_DIST = 9; const int DECODE_HUFFMAN_DISTBITS = 10; const int DECODE_CHKSUM = 11; const int FINISHED = 12; /// /// This variable contains the current state. /// int mode; /// /// The adler checksum of the dictionary or of the decompressed /// stream, as it is written in the header resp. footer of the /// compressed stream. /// Only valid if mode is DECODE_DICT or DECODE_CHKSUM. /// int readAdler; /// /// The number of bits needed to complete the current state. This /// is valid, if mode is DECODE_DICT, DECODE_CHKSUM, /// DECODE_HUFFMAN_LENBITS or DECODE_HUFFMAN_DISTBITS. /// int neededBits; int repLength; int repDist; int uncomprLen; /// /// True, if the last block flag was set in the last block of the /// inflated stream. This means that the stream ends after the /// current block. /// bool isLastBlock; /// /// The total number of inflated bytes. /// int totalOut; /// /// The total number of bytes set with setInput(). This is not the /// value returned by the TotalIn property, since this also includes the /// unprocessed input. /// int totalIn; /// /// This variable stores the noHeader flag that was given to the constructor. /// True means, that the inflated stream doesn't contain a Zlib header or /// footer. /// bool noHeader; StreamManipulator input; OutputWindow outputWindow; InflaterDynHeader dynHeader; InflaterHuffmanTree litlenTree, distTree; Adler32 adler; /// /// Creates a new inflater or RFC1951 decompressor /// RFC1950/Zlib headers and footers will be expected in the input data /// public Inflater() : this(false) { } /// /// Creates a new inflater. /// /// /// True if no RFC1950/Zlib header and footer fields are expected in the input data /// /// This is used for GZIPed/Zipped input. /// /// For compatibility with /// Sun JDK you should provide one byte of input more than needed in /// this case. /// public Inflater(bool noHeader) { this.noHeader = noHeader; this.adler = new Adler32(); input = new StreamManipulator(); outputWindow = new OutputWindow(); mode = noHeader ? DECODE_BLOCKS : DECODE_HEADER; } /// /// Resets the inflater so that a new stream can be decompressed. All /// pending input and output will be discarded. /// public void Reset() { mode = noHeader ? DECODE_BLOCKS : DECODE_HEADER; totalIn = totalOut = 0; input.Reset(); outputWindow.Reset(); dynHeader = null; litlenTree = null; distTree = null; isLastBlock = false; adler.Reset(); } /// /// Decodes a zlib/RFC1950 header. /// /// /// False if more input is needed. /// /// /// The header is invalid. /// private bool DecodeHeader() { int header = input.PeekBits(16); if (header < 0) { return false; } input.DropBits(16); /* The header is written in "wrong" byte order */ header = ((header << 8) | (header >> 8)) & 0xffff; if (header % 31 != 0) { throw new SharpZipBaseException("Header checksum illegal"); } if ((header & 0x0f00) != (Deflater.DEFLATED << 8)) { throw new SharpZipBaseException("Compression Method unknown"); } /* Maximum size of the backwards window in bits. * We currently ignore this, but we could use it to make the * inflater window more space efficient. On the other hand the * full window (15 bits) is needed most times, anyway. int max_wbits = ((header & 0x7000) >> 12) + 8; */ if ((header & 0x0020) == 0) { // Dictionary flag? mode = DECODE_BLOCKS; } else { mode = DECODE_DICT; neededBits = 32; } return true; } /// /// Decodes the dictionary checksum after the deflate header. /// /// /// False if more input is needed. /// private bool DecodeDict() { while (neededBits > 0) { int dictByte = input.PeekBits(8); if (dictByte < 0) { return false; } input.DropBits(8); readAdler = (readAdler << 8) | dictByte; neededBits -= 8; } return false; } /// /// Decodes the huffman encoded symbols in the input stream. /// /// /// false if more input is needed, true if output window is /// full or the current block ends. /// /// /// if deflated stream is invalid. /// private bool DecodeHuffman() { int free = outputWindow.GetFreeSpace(); while (free >= 258) { int symbol; switch (mode) { case DECODE_HUFFMAN: /* This is the inner loop so it is optimized a bit */ while (((symbol = litlenTree.GetSymbol(input)) & ~0xff) == 0) { outputWindow.Write(symbol); if (--free < 258) { return true; } } if (symbol < 257) { if (symbol < 0) { return false; } else { /* symbol == 256: end of block */ distTree = null; litlenTree = null; mode = DECODE_BLOCKS; return true; } } try { repLength = CPLENS[symbol - 257]; neededBits = CPLEXT[symbol - 257]; } catch (Exception) { throw new SharpZipBaseException("Illegal rep length code"); } goto case DECODE_HUFFMAN_LENBITS; /* fall through */ case DECODE_HUFFMAN_LENBITS: if (neededBits > 0) { mode = DECODE_HUFFMAN_LENBITS; int i = input.PeekBits(neededBits); if (i < 0) { return false; } input.DropBits(neededBits); repLength += i; } mode = DECODE_HUFFMAN_DIST; goto case DECODE_HUFFMAN_DIST;/* fall through */ case DECODE_HUFFMAN_DIST: symbol = distTree.GetSymbol(input); if (symbol < 0) { return false; } try { repDist = CPDIST[symbol]; neededBits = CPDEXT[symbol]; } catch (Exception) { throw new SharpZipBaseException("Illegal rep dist code"); } goto case DECODE_HUFFMAN_DISTBITS;/* fall through */ case DECODE_HUFFMAN_DISTBITS: if (neededBits > 0) { mode = DECODE_HUFFMAN_DISTBITS; int i = input.PeekBits(neededBits); if (i < 0) { return false; } input.DropBits(neededBits); repDist += i; } outputWindow.Repeat(repLength, repDist); free -= repLength; mode = DECODE_HUFFMAN; break; default: throw new SharpZipBaseException("Inflater unknown mode"); } } return true; } /// /// Decodes the adler checksum after the deflate stream. /// /// /// false if more input is needed. /// /// /// If checksum doesn't match. /// private bool DecodeChksum() { while (neededBits > 0) { int chkByte = input.PeekBits(8); if (chkByte < 0) { return false; } input.DropBits(8); readAdler = (readAdler << 8) | chkByte; neededBits -= 8; } if ((int) adler.Value != readAdler) { throw new SharpZipBaseException("Adler chksum doesn't match: " + (int)adler.Value + " vs. " + readAdler); } mode = FINISHED; return false; } /// /// Decodes the deflated stream. /// /// /// false if more input is needed, or if finished. /// /// /// if deflated stream is invalid. /// private bool Decode() { switch (mode) { case DECODE_HEADER: return DecodeHeader(); case DECODE_DICT: return DecodeDict(); case DECODE_CHKSUM: return DecodeChksum(); case DECODE_BLOCKS: if (isLastBlock) { if (noHeader) { mode = FINISHED; return false; } else { input.SkipToByteBoundary(); neededBits = 32; mode = DECODE_CHKSUM; return true; } } int type = input.PeekBits(3); if (type < 0) { return false; } input.DropBits(3); if ((type & 1) != 0) { isLastBlock = true; } switch (type >> 1){ case DeflaterConstants.STORED_BLOCK: input.SkipToByteBoundary(); mode = DECODE_STORED_LEN1; break; case DeflaterConstants.STATIC_TREES: litlenTree = InflaterHuffmanTree.defLitLenTree; distTree = InflaterHuffmanTree.defDistTree; mode = DECODE_HUFFMAN; break; case DeflaterConstants.DYN_TREES: dynHeader = new InflaterDynHeader(); mode = DECODE_DYN_HEADER; break; default: throw new SharpZipBaseException("Unknown block type " + type); } return true; case DECODE_STORED_LEN1: { if ((uncomprLen = input.PeekBits(16)) < 0) { return false; } input.DropBits(16); mode = DECODE_STORED_LEN2; } goto case DECODE_STORED_LEN2; /* fall through */ case DECODE_STORED_LEN2: { int nlen = input.PeekBits(16); if (nlen < 0) { return false; } input.DropBits(16); if (nlen != (uncomprLen ^ 0xffff)) { throw new SharpZipBaseException("broken uncompressed block"); } mode = DECODE_STORED; } goto case DECODE_STORED;/* fall through */ case DECODE_STORED: { int more = outputWindow.CopyStored(input, uncomprLen); uncomprLen -= more; if (uncomprLen == 0) { mode = DECODE_BLOCKS; return true; } return !input.IsNeedingInput; } case DECODE_DYN_HEADER: if (!dynHeader.Decode(input)) { return false; } litlenTree = dynHeader.BuildLitLenTree(); distTree = dynHeader.BuildDistTree(); mode = DECODE_HUFFMAN; goto case DECODE_HUFFMAN; /* fall through */ case DECODE_HUFFMAN: case DECODE_HUFFMAN_LENBITS: case DECODE_HUFFMAN_DIST: case DECODE_HUFFMAN_DISTBITS: return DecodeHuffman(); case FINISHED: return false; default: throw new SharpZipBaseException("Inflater.Decode unknown mode"); } } /// /// Sets the preset dictionary. This should only be called, if /// needsDictionary() returns true and it should set the same /// dictionary, that was used for deflating. The getAdler() /// function returns the checksum of the dictionary needed. /// /// /// The dictionary. /// public void SetDictionary(byte[] buffer) { SetDictionary(buffer, 0, buffer.Length); } /// /// Sets the preset dictionary. This should only be called, if /// needsDictionary() returns true and it should set the same /// dictionary, that was used for deflating. The getAdler() /// function returns the checksum of the dictionary needed. /// /// /// The dictionary. /// /// /// The offset into buffer where the dictionary starts. /// /// /// The length of the dictionary. /// /// /// No dictionary is needed. /// /// /// The adler checksum for the buffer is invalid /// public void SetDictionary(byte[] buffer, int offset, int len) { if (!IsNeedingDictionary) { throw new InvalidOperationException(); } adler.Update(buffer, offset, len); if ((int)adler.Value != readAdler) { throw new SharpZipBaseException("Wrong adler checksum"); } adler.Reset(); outputWindow.CopyDict(buffer, offset, len); mode = DECODE_BLOCKS; } /// /// Sets the input. This should only be called, if needsInput() /// returns true. /// /// /// the input. /// public void SetInput(byte[] buf) { SetInput(buf, 0, buf.Length); } /// /// Sets the input. This should only be called, if needsInput() /// returns true. /// /// /// The source of input data /// /// /// The offset into buffer where the input starts. /// /// /// The number of bytes of input to use. /// /// /// No input is needed. /// /// /// The off and/or len are wrong. /// public void SetInput(byte[] buffer, int offset, int length) { input.SetInput(buffer, offset, length); totalIn += length; } /// /// Inflates the compressed stream to the output buffer. If this /// returns 0, you should check, whether needsDictionary(), /// needsInput() or finished() returns true, to determine why no /// further output is produced. /// /// /// the output buffer. /// /// /// the number of bytes written to the buffer, 0 if no further /// output can be produced. /// /// /// if buf has length 0. /// /// /// if deflated stream is invalid. /// public int Inflate(byte[] buf) { return Inflate(buf, 0, buf.Length); } /// /// Inflates the compressed stream to the output buffer. If this /// returns 0, you should check, whether needsDictionary(), /// needsInput() or finished() returns true, to determine why no /// further output is produced. /// /// /// the output buffer. /// /// /// the offset into buffer where the output should start. /// /// /// the maximum length of the output. /// /// /// the number of bytes written to the buffer, 0 if no further output can be produced. /// /// /// if len is <= 0. /// /// /// if the offset and/or len are wrong. /// /// /// if deflated stream is invalid. /// public int Inflate(byte[] buf, int offset, int len) { if (len < 0) { throw new ArgumentOutOfRangeException("len < 0"); } // Special case: len may be zero if (len == 0) { if (IsFinished == false) { // -jr- 08-Nov-2003 INFLATE_BUG fix.. Decode(); } return 0; } /* // Check for correct buff, off, len triple if (off < 0 || off + len >= buf.Length) { throw new ArgumentException("off/len outside buf bounds"); } */ int count = 0; int more; do { if (mode != DECODE_CHKSUM) { /* Don't give away any output, if we are waiting for the * checksum in the input stream. * * With this trick we have always: * needsInput() and not finished() * implies more output can be produced. */ more = outputWindow.CopyOutput(buf, offset, len); adler.Update(buf, offset, more); offset += more; count += more; totalOut += more; len -= more; if (len == 0) { return count; } } } while (Decode() || (outputWindow.GetAvailable() > 0 && mode != DECODE_CHKSUM)); return count; } /// /// Returns true, if the input buffer is empty. /// You should then call setInput(). /// NOTE: This method also returns true when the stream is finished. /// public bool IsNeedingInput { get { return input.IsNeedingInput; } } /// /// Returns true, if a preset dictionary is needed to inflate the input. /// public bool IsNeedingDictionary { get { return mode == DECODE_DICT && neededBits == 0; } } /// /// Returns true, if the inflater has finished. This means, that no /// input is needed and no output can be produced. /// public bool IsFinished { get { return mode == FINISHED && outputWindow.GetAvailable() == 0; } } /// /// Gets the adler checksum. This is either the checksum of all /// uncompressed bytes returned by inflate(), or if needsDictionary() /// returns true (and thus no output was yet produced) this is the /// adler checksum of the expected dictionary. /// /// /// the adler checksum. /// public int Adler { get { return IsNeedingDictionary ? readAdler : (int) adler.Value; } } /// /// Gets the total number of output bytes returned by inflate(). /// /// /// the total number of output bytes. /// public int TotalOut { get { return totalOut; } } /// /// Gets the total number of processed compressed input bytes. /// /// /// The total number of bytes of processed input bytes. /// public int TotalIn { get { return totalIn - RemainingInput; } } #if TEST_HAK /// /// -jr test hak trying to figure out a bug /// public int UnseenInput { get { return totalIn - ((input.AvailableBits + 7) >> 3); } } /// /// -jr test hak trying to figure out a bug /// public int PlainTotalIn { get { return totalIn; } } #endif /// /// Gets the number of unprocessed input bytes. Useful, if the end of the /// stream is reached and you want to further process the bytes after /// the deflate stream. /// /// /// The number of bytes of the input which have not been processed. /// public int RemainingInput { get { return input.AvailableBytes; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Deflater.cs0000644000175000017500000004315512204443225024115 0ustar00meebeymeebey00000000000000// Deflater.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression { /// /// This is the Deflater class. The deflater class compresses input /// with the deflate algorithm described in RFC 1951. It has several /// compression levels and three different strategies described below. /// /// This class is not thread safe. This is inherent in the API, due /// to the split of deflate and setInput. /// /// author of the original java version : Jochen Hoenicke /// public class Deflater { /// /// The best and slowest compression level. This tries to find very /// long and distant string repetitions. /// public static int BEST_COMPRESSION = 9; /// /// The worst but fastest compression level. /// public static int BEST_SPEED = 1; /// /// The default compression level. /// public static int DEFAULT_COMPRESSION = -1; /// /// This level won't compress at all but output uncompressed blocks. /// public static int NO_COMPRESSION = 0; /// /// The compression method. This is the only method supported so far. /// There is no need to use this constant at all. /// public static int DEFLATED = 8; /* * The Deflater can do the following state transitions: * * (1) -> INIT_STATE ----> INIT_FINISHING_STATE ---. * / | (2) (5) | * / v (5) | * (3)| SETDICT_STATE ---> SETDICT_FINISHING_STATE |(3) * \ | (3) | ,-------' * | | | (3) / * v v (5) v v * (1) -> BUSY_STATE ----> FINISHING_STATE * | (6) * v * FINISHED_STATE * \_____________________________________/ * | (7) * v * CLOSED_STATE * * (1) If we should produce a header we start in INIT_STATE, otherwise * we start in BUSY_STATE. * (2) A dictionary may be set only when we are in INIT_STATE, then * we change the state as indicated. * (3) Whether a dictionary is set or not, on the first call of deflate * we change to BUSY_STATE. * (4) -- intentionally left blank -- :) * (5) FINISHING_STATE is entered, when flush() is called to indicate that * there is no more INPUT. There are also states indicating, that * the header wasn't written yet. * (6) FINISHED_STATE is entered, when everything has been flushed to the * internal pending output buffer. * (7) At any time (7) * */ private static int IS_SETDICT = 0x01; private static int IS_FLUSHING = 0x04; private static int IS_FINISHING = 0x08; private static int INIT_STATE = 0x00; private static int SETDICT_STATE = 0x01; // private static int INIT_FINISHING_STATE = 0x08; // private static int SETDICT_FINISHING_STATE = 0x09; private static int BUSY_STATE = 0x10; private static int FLUSHING_STATE = 0x14; private static int FINISHING_STATE = 0x1c; private static int FINISHED_STATE = 0x1e; private static int CLOSED_STATE = 0x7f; /// /// Compression level. /// private int level; /// /// If true no Zlib/RFC1950 headers or footers are generated /// private bool noZlibHeaderOrFooter; /// /// The current state. /// private int state; /// /// The total bytes of output written. /// private long totalOut; /// /// The pending output. /// private DeflaterPending pending; /// /// The deflater engine. /// private DeflaterEngine engine; /// /// Creates a new deflater with default compression level. /// public Deflater() : this(DEFAULT_COMPRESSION, false) { } /// /// Creates a new deflater with given compression level. /// /// /// the compression level, a value between NO_COMPRESSION /// and BEST_COMPRESSION, or DEFAULT_COMPRESSION. /// /// if lvl is out of range. public Deflater(int lvl) : this(lvl, false) { } /// /// Creates a new deflater with given compression level. /// /// /// the compression level, a value between NO_COMPRESSION /// and BEST_COMPRESSION. /// /// /// true, if we should suppress the Zlib/RFC1950 header at the /// beginning and the adler checksum at the end of the output. This is /// useful for the GZIP/PKZIP formats. /// /// if lvl is out of range. public Deflater(int level, bool noZlibHeaderOrFooter) { if (level == DEFAULT_COMPRESSION) { level = 6; } else if (level < NO_COMPRESSION || level > BEST_COMPRESSION) { throw new ArgumentOutOfRangeException("level"); } pending = new DeflaterPending(); engine = new DeflaterEngine(pending); this.noZlibHeaderOrFooter = noZlibHeaderOrFooter; SetStrategy(DeflateStrategy.Default); SetLevel(level); Reset(); } /// /// Resets the deflater. The deflater acts afterwards as if it was /// just created with the same compression level and strategy as it /// had before. /// public void Reset() { state = (noZlibHeaderOrFooter ? BUSY_STATE : INIT_STATE); totalOut = 0; pending.Reset(); engine.Reset(); } /// /// Gets the current adler checksum of the data that was processed so far. /// public int Adler { get { return engine.Adler; } } /// /// Gets the number of input bytes processed so far. /// public int TotalIn { get { return engine.TotalIn; } } /// /// Gets the number of output bytes so far. /// public long TotalOut { get { return totalOut; } } /// /// Flushes the current input block. Further calls to deflate() will /// produce enough output to inflate everything in the current input /// block. This is not part of Sun's JDK so I have made it package /// private. It is used by DeflaterOutputStream to implement /// flush(). /// public void Flush() { state |= IS_FLUSHING; } /// /// Finishes the deflater with the current input block. It is an error /// to give more input after this method was called. This method must /// be called to force all bytes to be flushed. /// public void Finish() { state |= IS_FLUSHING | IS_FINISHING; } /// /// Returns true if the stream was finished and no more output bytes /// are available. /// public bool IsFinished { get { return state == FINISHED_STATE && pending.IsFlushed; } } /// /// Returns true, if the input buffer is empty. /// You should then call setInput(). /// NOTE: This method can also return true when the stream /// was finished. /// public bool IsNeedingInput { get { return engine.NeedsInput(); } } /// /// Sets the data which should be compressed next. This should be only /// called when needsInput indicates that more input is needed. /// If you call setInput when needsInput() returns false, the /// previous input that is still pending will be thrown away. /// The given byte array should not be changed, before needsInput() returns /// true again. /// This call is equivalent to setInput(input, 0, input.length). /// /// /// the buffer containing the input data. /// /// /// if the buffer was finished() or ended(). /// public void SetInput(byte[] input) { SetInput(input, 0, input.Length); } /// /// Sets the data which should be compressed next. This should be /// only called when needsInput indicates that more input is needed. /// The given byte array should not be changed, before needsInput() returns /// true again. /// /// /// the buffer containing the input data. /// /// /// the start of the data. /// /// /// the length of the data. /// /// /// if the buffer was finished() or ended() or if previous input is still pending. /// public void SetInput(byte[] input, int off, int len) { if ((state & IS_FINISHING) != 0) { throw new InvalidOperationException("finish()/end() already called"); } engine.SetInput(input, off, len); } /// /// Sets the compression level. There is no guarantee of the exact /// position of the change, but if you call this when needsInput is /// true the change of compression level will occur somewhere near /// before the end of the so far given input. /// /// /// the new compression level. /// public void SetLevel(int lvl) { if (lvl == DEFAULT_COMPRESSION) { lvl = 6; } else if (lvl < NO_COMPRESSION || lvl > BEST_COMPRESSION) { throw new ArgumentOutOfRangeException("lvl"); } if (level != lvl) { level = lvl; engine.SetLevel(lvl); } } /// /// Get current compression level /// /// Returns the current compression level public int GetLevel() { return level; } /// /// Sets the compression strategy. Strategy is one of /// DEFAULT_STRATEGY, HUFFMAN_ONLY and FILTERED. For the exact /// position where the strategy is changed, the same as for /// setLevel() applies. /// /// /// The new compression strategy. /// public void SetStrategy(DeflateStrategy strategy) { engine.Strategy = strategy; } /// /// Deflates the current input block with to the given array. /// /// /// The buffer where compressed data is stored /// /// /// The number of compressed bytes added to the output, or 0 if either /// needsInput() or finished() returns true or length is zero. /// public int Deflate(byte[] output) { return Deflate(output, 0, output.Length); } /// /// Deflates the current input block to the given array. /// /// /// Buffer to store the compressed data. /// /// /// Offset into the output array. /// /// /// The maximum number of bytes that may be stored. /// /// /// The number of compressed bytes added to the output, or 0 if either /// needsInput() or finished() returns true or length is zero. /// /// /// If end() was previously called. /// /// /// If offset and/or length don't match the array length. /// public int Deflate(byte[] output, int offset, int length) { int origLength = length; if (state == CLOSED_STATE) { throw new InvalidOperationException("Deflater closed"); } if (state < BUSY_STATE) { /* output header */ int header = (DEFLATED + ((DeflaterConstants.MAX_WBITS - 8) << 4)) << 8; int level_flags = (level - 1) >> 1; if (level_flags < 0 || level_flags > 3) { level_flags = 3; } header |= level_flags << 6; if ((state & IS_SETDICT) != 0) { /* Dictionary was set */ header |= DeflaterConstants.PRESET_DICT; } header += 31 - (header % 31); pending.WriteShortMSB(header); if ((state & IS_SETDICT) != 0) { int chksum = engine.Adler; engine.ResetAdler(); pending.WriteShortMSB(chksum >> 16); pending.WriteShortMSB(chksum & 0xffff); } state = BUSY_STATE | (state & (IS_FLUSHING | IS_FINISHING)); } for (;;) { int count = pending.Flush(output, offset, length); offset += count; totalOut += count; length -= count; if (length == 0 || state == FINISHED_STATE) { break; } if (!engine.Deflate((state & IS_FLUSHING) != 0, (state & IS_FINISHING) != 0)) { if (state == BUSY_STATE) { /* We need more input now */ return origLength - length; } else if (state == FLUSHING_STATE) { if (level != NO_COMPRESSION) { /* We have to supply some lookahead. 8 bit lookahead * is needed by the zlib inflater, and we must fill * the next byte, so that all bits are flushed. */ int neededbits = 8 + ((-pending.BitCount) & 7); while (neededbits > 0) { /* write a static tree block consisting solely of * an EOF: */ pending.WriteBits(2, 10); neededbits -= 10; } } state = BUSY_STATE; } else if (state == FINISHING_STATE) { pending.AlignToByte(); // Compressed data is complete. Write footer information if required. if (!noZlibHeaderOrFooter) { int adler = engine.Adler; pending.WriteShortMSB(adler >> 16); pending.WriteShortMSB(adler & 0xffff); } state = FINISHED_STATE; } } } return origLength - length; } /// /// Sets the dictionary which should be used in the deflate process. /// This call is equivalent to setDictionary(dict, 0, dict.Length). /// /// /// the dictionary. /// /// /// if setInput () or deflate () were already called or another dictionary was already set. /// public void SetDictionary(byte[] dict) { SetDictionary(dict, 0, dict.Length); } /// /// Sets the dictionary which should be used in the deflate process. /// The dictionary is a byte array containing strings that are /// likely to occur in the data which should be compressed. The /// dictionary is not stored in the compressed output, only a /// checksum. To decompress the output you need to supply the same /// dictionary again. /// /// /// The dictionary data /// /// /// An offset into the dictionary. /// /// /// The length of the dictionary data to use /// /// /// If setInput () or deflate () were already called or another dictionary was already set. /// public void SetDictionary(byte[] dict, int offset, int length) { if (state != INIT_STATE) { throw new InvalidOperationException(); } state = SETDICT_STATE; engine.SetDictionary(dict, offset, length); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/DeflaterHuffman.cs0000644000175000017500000006142112204443225025416 0ustar00meebeymeebey00000000000000// DeflaterHuffman.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression { /// /// This is the DeflaterHuffman class. /// /// This class is not thread safe. This is inherent in the API, due /// to the split of deflate and setInput. /// /// author of the original java version : Jochen Hoenicke /// public class DeflaterHuffman { static int BUFSIZE = 1 << (DeflaterConstants.DEFAULT_MEM_LEVEL + 6); static int LITERAL_NUM = 286; static int DIST_NUM = 30; static int BITLEN_NUM = 19; static int REP_3_6 = 16; static int REP_3_10 = 17; static int REP_11_138 = 18; static int EOF_SYMBOL = 256; static int[] BL_ORDER = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; static byte[] bit4Reverse = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; /// /// Not documented /// public class Tree { /// /// Not documented /// public short[] freqs; /// /// Not documented /// public byte[] length; /// /// Not documented /// public int minNumCodes; /// /// Not documented /// public int numCodes; short[] codes; int[] bl_counts; int maxLength; DeflaterHuffman dh; /// /// Not documented /// public Tree(DeflaterHuffman dh, int elems, int minCodes, int maxLength) { this.dh = dh; this.minNumCodes = minCodes; this.maxLength = maxLength; freqs = new short[elems]; bl_counts = new int[maxLength]; } /// /// Resets the internal state of the tree /// public void Reset() { for (int i = 0; i < freqs.Length; i++) { freqs[i] = 0; } codes = null; length = null; } /// /// Not documented /// public void WriteSymbol(int code) { // if (DeflaterConstants.DEBUGGING) { // freqs[code]--; // // Console.Write("writeSymbol("+freqs.length+","+code+"): "); // } dh.pending.WriteBits(codes[code] & 0xffff, length[code]); } /// /// Check that at least one frequency is non-zero /// /// /// No frequencies are non-zero /// public void CheckEmpty() { bool empty = true; for (int i = 0; i < freqs.Length; i++) { if (freqs[i] != 0) { //Console.WriteLine("freqs[" + i + "] == " + freqs[i]); empty = false; } } if (!empty) { throw new SharpZipBaseException("!Empty"); } //Console.WriteLine("checkEmpty suceeded!"); } /// /// Set static codes and length /// /// new codes /// length for new codes public void SetStaticCodes(short[] stCodes, byte[] stLength) { codes = stCodes; length = stLength; } /// /// Build dynamic codes and lengths /// public void BuildCodes() { int numSymbols = freqs.Length; int[] nextCode = new int[maxLength]; int code = 0; codes = new short[freqs.Length]; // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("buildCodes: "+freqs.Length); // } for (int bits = 0; bits < maxLength; bits++) { nextCode[bits] = code; code += bl_counts[bits] << (15 - bits); // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("bits: " + ( bits + 1) + " count: " + bl_counts[bits] // +" nextCode: "+code); // } } if (DeflaterConstants.DEBUGGING && code != 65536) { throw new SharpZipBaseException("Inconsistent bl_counts!"); } for (int i=0; i < numCodes; i++) { int bits = length[i]; if (bits > 0) { // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("codes["+i+"] = rev(" + nextCode[bits-1]+"), // +bits); // } codes[i] = BitReverse(nextCode[bits-1]); nextCode[bits-1] += 1 << (16 - bits); } } } void BuildLength(int[] childs) { this.length = new byte [freqs.Length]; int numNodes = childs.Length / 2; int numLeafs = (numNodes + 1) / 2; int overflow = 0; for (int i = 0; i < maxLength; i++) { bl_counts[i] = 0; } /* First calculate optimal bit lengths */ int[] lengths = new int[numNodes]; lengths[numNodes-1] = 0; for (int i = numNodes - 1; i >= 0; i--) { if (childs[2*i+1] != -1) { int bitLength = lengths[i] + 1; if (bitLength > maxLength) { bitLength = maxLength; overflow++; } lengths[childs[2*i]] = lengths[childs[2*i+1]] = bitLength; } else { /* A leaf node */ int bitLength = lengths[i]; bl_counts[bitLength - 1]++; this.length[childs[2*i]] = (byte) lengths[i]; } } // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("Tree "+freqs.Length+" lengths:"); // for (int i=0; i < numLeafs; i++) { // //Console.WriteLine("Node "+childs[2*i]+" freq: "+freqs[childs[2*i]] // + " len: "+length[childs[2*i]]); // } // } if (overflow == 0) { return; } int incrBitLen = maxLength - 1; do { /* Find the first bit length which could increase: */ while (bl_counts[--incrBitLen] == 0) ; /* Move this node one down and remove a corresponding * amount of overflow nodes. */ do { bl_counts[incrBitLen]--; bl_counts[++incrBitLen]++; overflow -= 1 << (maxLength - 1 - incrBitLen); } while (overflow > 0 && incrBitLen < maxLength - 1); } while (overflow > 0); /* We may have overshot above. Move some nodes from maxLength to * maxLength-1 in that case. */ bl_counts[maxLength-1] += overflow; bl_counts[maxLength-2] -= overflow; /* Now recompute all bit lengths, scanning in increasing * frequency. It is simpler to reconstruct all lengths instead of * fixing only the wrong ones. This idea is taken from 'ar' * written by Haruhiko Okumura. * * The nodes were inserted with decreasing frequency into the childs * array. */ int nodePtr = 2 * numLeafs; for (int bits = maxLength; bits != 0; bits--) { int n = bl_counts[bits-1]; while (n > 0) { int childPtr = 2*childs[nodePtr++]; if (childs[childPtr + 1] == -1) { /* We found another leaf */ length[childs[childPtr]] = (byte) bits; n--; } } } // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("*** After overflow elimination. ***"); // for (int i=0; i < numLeafs; i++) { // //Console.WriteLine("Node "+childs[2*i]+" freq: "+freqs[childs[2*i]] // + " len: "+length[childs[2*i]]); // } // } } /// /// Not documented /// public void BuildTree() { int numSymbols = freqs.Length; /* heap is a priority queue, sorted by frequency, least frequent * nodes first. The heap is a binary tree, with the property, that * the parent node is smaller than both child nodes. This assures * that the smallest node is the first parent. * * The binary tree is encoded in an array: 0 is root node and * the nodes 2*n+1, 2*n+2 are the child nodes of node n. */ int[] heap = new int[numSymbols]; int heapLen = 0; int maxCode = 0; for (int n = 0; n < numSymbols; n++) { int freq = freqs[n]; if (freq != 0) { /* Insert n into heap */ int pos = heapLen++; int ppos; while (pos > 0 && freqs[heap[ppos = (pos - 1) / 2]] > freq) { heap[pos] = heap[ppos]; pos = ppos; } heap[pos] = n; maxCode = n; } } /* We could encode a single literal with 0 bits but then we * don't see the literals. Therefore we force at least two * literals to avoid this case. We don't care about order in * this case, both literals get a 1 bit code. */ while (heapLen < 2) { int node = maxCode < 2 ? ++maxCode : 0; heap[heapLen++] = node; } numCodes = Math.Max(maxCode + 1, minNumCodes); int numLeafs = heapLen; int[] childs = new int[4*heapLen - 2]; int[] values = new int[2*heapLen - 1]; int numNodes = numLeafs; for (int i = 0; i < heapLen; i++) { int node = heap[i]; childs[2*i] = node; childs[2*i+1] = -1; values[i] = freqs[node] << 8; heap[i] = i; } /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ do { int first = heap[0]; int last = heap[--heapLen]; /* Propagate the hole to the leafs of the heap */ int ppos = 0; int path = 1; while (path < heapLen) { if (path + 1 < heapLen && values[heap[path]] > values[heap[path+1]]) { path++; } heap[ppos] = heap[path]; ppos = path; path = path * 2 + 1; } /* Now propagate the last element down along path. Normally * it shouldn't go too deep. */ int lastVal = values[last]; while ((path = ppos) > 0 && values[heap[ppos = (path - 1)/2]] > lastVal) { heap[path] = heap[ppos]; } heap[path] = last; int second = heap[0]; /* Create a new node father of first and second */ last = numNodes++; childs[2*last] = first; childs[2*last+1] = second; int mindepth = Math.Min(values[first] & 0xff, values[second] & 0xff); values[last] = lastVal = values[first] + values[second] - mindepth + 1; /* Again, propagate the hole to the leafs */ ppos = 0; path = 1; while (path < heapLen) { if (path + 1 < heapLen && values[heap[path]] > values[heap[path+1]]) { path++; } heap[ppos] = heap[path]; ppos = path; path = ppos * 2 + 1; } /* Now propagate the new element down along path */ while ((path = ppos) > 0 && values[heap[ppos = (path - 1)/2]] > lastVal) { heap[path] = heap[ppos]; } heap[path] = last; } while (heapLen > 1); if (heap[0] != childs.Length / 2 - 1) { throw new SharpZipBaseException("Heap invariant violated"); } BuildLength(childs); } /// /// Get encoded length /// /// Encoded length, the sum of frequencies * lengths public int GetEncodedLength() { int len = 0; for (int i = 0; i < freqs.Length; i++) { len += freqs[i] * length[i]; } return len; } /// /// Not documented /// public void CalcBLFreq(Tree blTree) { int max_count; /* max repeat count */ int min_count; /* min repeat count */ int count; /* repeat count of the current code */ int curlen = -1; /* length of current code */ int i = 0; while (i < numCodes) { count = 1; int nextlen = length[i]; if (nextlen == 0) { max_count = 138; min_count = 3; } else { max_count = 6; min_count = 3; if (curlen != nextlen) { blTree.freqs[nextlen]++; count = 0; } } curlen = nextlen; i++; while (i < numCodes && curlen == length[i]) { i++; if (++count >= max_count) { break; } } if (count < min_count) { blTree.freqs[curlen] += (short)count; } else if (curlen != 0) { blTree.freqs[REP_3_6]++; } else if (count <= 10) { blTree.freqs[REP_3_10]++; } else { blTree.freqs[REP_11_138]++; } } } /// /// Write tree values /// /// Tree to write public void WriteTree(Tree blTree) { int max_count; /* max repeat count */ int min_count; /* min repeat count */ int count; /* repeat count of the current code */ int curlen = -1; /* length of current code */ int i = 0; while (i < numCodes) { count = 1; int nextlen = length[i]; if (nextlen == 0) { max_count = 138; min_count = 3; } else { max_count = 6; min_count = 3; if (curlen != nextlen) { blTree.WriteSymbol(nextlen); count = 0; } } curlen = nextlen; i++; while (i < numCodes && curlen == length[i]) { i++; if (++count >= max_count) { break; } } if (count < min_count) { while (count-- > 0) { blTree.WriteSymbol(curlen); } } else if (curlen != 0) { blTree.WriteSymbol(REP_3_6); dh.pending.WriteBits(count - 3, 2); } else if (count <= 10) { blTree.WriteSymbol(REP_3_10); dh.pending.WriteBits(count - 3, 3); } else { blTree.WriteSymbol(REP_11_138); dh.pending.WriteBits(count - 11, 7); } } } } /// /// Pending buffer to use /// public DeflaterPending pending; Tree literalTree, distTree, blTree; short[] d_buf; byte[] l_buf; int last_lit; int extra_bits; static short[] staticLCodes; static byte[] staticLLength; static short[] staticDCodes; static byte[] staticDLength; /// /// Reverse the bits of a 16 bit value. /// /// Value to reverse bits /// Value with bits reversed public static short BitReverse(int toReverse) { return (short) (bit4Reverse[toReverse & 0xF] << 12 | bit4Reverse[(toReverse >> 4) & 0xF] << 8 | bit4Reverse[(toReverse >> 8) & 0xF] << 4 | bit4Reverse[toReverse >> 12]); } static DeflaterHuffman() { /* See RFC 1951 3.2.6 */ /* Literal codes */ staticLCodes = new short[LITERAL_NUM]; staticLLength = new byte[LITERAL_NUM]; int i = 0; while (i < 144) { staticLCodes[i] = BitReverse((0x030 + i) << 8); staticLLength[i++] = 8; } while (i < 256) { staticLCodes[i] = BitReverse((0x190 - 144 + i) << 7); staticLLength[i++] = 9; } while (i < 280) { staticLCodes[i] = BitReverse((0x000 - 256 + i) << 9); staticLLength[i++] = 7; } while (i < LITERAL_NUM) { staticLCodes[i] = BitReverse((0x0c0 - 280 + i) << 8); staticLLength[i++] = 8; } /* Distant codes */ staticDCodes = new short[DIST_NUM]; staticDLength = new byte[DIST_NUM]; for (i = 0; i < DIST_NUM; i++) { staticDCodes[i] = BitReverse(i << 11); staticDLength[i] = 5; } } /// /// Construct instance with pending buffer /// /// Pending buffer to use public DeflaterHuffman(DeflaterPending pending) { this.pending = pending; literalTree = new Tree(this, LITERAL_NUM, 257, 15); distTree = new Tree(this, DIST_NUM, 1, 15); blTree = new Tree(this, BITLEN_NUM, 4, 7); d_buf = new short[BUFSIZE]; l_buf = new byte [BUFSIZE]; } /// /// Reset internal state /// public void Reset() { last_lit = 0; extra_bits = 0; literalTree.Reset(); distTree.Reset(); blTree.Reset(); } int Lcode(int len) { if (len == 255) { return 285; } int code = 257; while (len >= 8) { code += 4; len >>= 1; } return code + len; } int Dcode(int distance) { int code = 0; while (distance >= 4) { code += 2; distance >>= 1; } return code + distance; } /// /// Write all trees to pending buffer /// public void SendAllTrees(int blTreeCodes) { blTree.BuildCodes(); literalTree.BuildCodes(); distTree.BuildCodes(); pending.WriteBits(literalTree.numCodes - 257, 5); pending.WriteBits(distTree.numCodes - 1, 5); pending.WriteBits(blTreeCodes - 4, 4); for (int rank = 0; rank < blTreeCodes; rank++) { pending.WriteBits(blTree.length[BL_ORDER[rank]], 3); } literalTree.WriteTree(blTree); distTree.WriteTree(blTree); // if (DeflaterConstants.DEBUGGING) { // blTree.CheckEmpty(); // } } /// /// Compress current buffer writing data to pending buffer /// public void CompressBlock() { for (int i = 0; i < last_lit; i++) { int litlen = l_buf[i] & 0xff; int dist = d_buf[i]; if (dist-- != 0) { // if (DeflaterConstants.DEBUGGING) { // Console.Write("["+(dist+1)+","+(litlen+3)+"]: "); // } int lc = Lcode(litlen); literalTree.WriteSymbol(lc); int bits = (lc - 261) / 4; if (bits > 0 && bits <= 5) { pending.WriteBits(litlen & ((1 << bits) - 1), bits); } int dc = Dcode(dist); distTree.WriteSymbol(dc); bits = dc / 2 - 1; if (bits > 0) { pending.WriteBits(dist & ((1 << bits) - 1), bits); } } else { // if (DeflaterConstants.DEBUGGING) { // if (litlen > 32 && litlen < 127) { // Console.Write("("+(char)litlen+"): "); // } else { // Console.Write("{"+litlen+"}: "); // } // } literalTree.WriteSymbol(litlen); } } // if (DeflaterConstants.DEBUGGING) { // Console.Write("EOF: "); // } literalTree.WriteSymbol(EOF_SYMBOL); // if (DeflaterConstants.DEBUGGING) { // literalTree.CheckEmpty(); // distTree.CheckEmpty(); // } } /// /// Flush block to output with no compression /// /// Data to write /// Index of first byte to write /// Count of bytes to write /// True if this is the last block public void FlushStoredBlock(byte[] stored, int storedOffset, int storedLength, bool lastBlock) { // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("Flushing stored block "+ storedLength); // } pending.WriteBits((DeflaterConstants.STORED_BLOCK << 1) + (lastBlock ? 1 : 0), 3); pending.AlignToByte(); pending.WriteShort(storedLength); pending.WriteShort(~storedLength); pending.WriteBlock(stored, storedOffset, storedLength); Reset(); } /// /// Flush block to output with compression /// /// Data to flush /// Index of first byte to flush /// Count of bytes to flush /// True if this is the last block public void FlushBlock(byte[] stored, int storedOffset, int storedLength, bool lastBlock) { literalTree.freqs[EOF_SYMBOL]++; /* Build trees */ literalTree.BuildTree(); distTree.BuildTree(); /* Calculate bitlen frequency */ literalTree.CalcBLFreq(blTree); distTree.CalcBLFreq(blTree); /* Build bitlen tree */ blTree.BuildTree(); int blTreeCodes = 4; for (int i = 18; i > blTreeCodes; i--) { if (blTree.length[BL_ORDER[i]] > 0) { blTreeCodes = i+1; } } int opt_len = 14 + blTreeCodes * 3 + blTree.GetEncodedLength() + literalTree.GetEncodedLength() + distTree.GetEncodedLength() + extra_bits; int static_len = extra_bits; for (int i = 0; i < LITERAL_NUM; i++) { static_len += literalTree.freqs[i] * staticLLength[i]; } for (int i = 0; i < DIST_NUM; i++) { static_len += distTree.freqs[i] * staticDLength[i]; } if (opt_len >= static_len) { /* Force static trees */ opt_len = static_len; } if (storedOffset >= 0 && (storedLength + 4 < (opt_len >> 3))) { /* Store Block */ // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("Storing, since " + storedLength + " < " + opt_len // + " <= " + static_len); // } FlushStoredBlock(stored, storedOffset, storedLength, lastBlock); } else if (opt_len == static_len) { /* Encode with static tree */ pending.WriteBits((DeflaterConstants.STATIC_TREES << 1) + (lastBlock ? 1 : 0), 3); literalTree.SetStaticCodes(staticLCodes, staticLLength); distTree.SetStaticCodes(staticDCodes, staticDLength); CompressBlock(); Reset(); } else { /* Encode with dynamic tree */ pending.WriteBits((DeflaterConstants.DYN_TREES << 1) + (lastBlock ? 1 : 0), 3); SendAllTrees(blTreeCodes); CompressBlock(); Reset(); } } /// /// Get value indicating if internal buffer is full /// /// true if buffer is full public bool IsFull() { return last_lit >= BUFSIZE; } /// /// Add literal to buffer /// /// /// Value indicating internal buffer is full public bool TallyLit(int lit) { // if (DeflaterConstants.DEBUGGING) { // if (lit > 32 && lit < 127) { // //Console.WriteLine("("+(char)lit+")"); // } else { // //Console.WriteLine("{"+lit+"}"); // } // } d_buf[last_lit] = 0; l_buf[last_lit++] = (byte)lit; literalTree.freqs[lit]++; return IsFull(); } /// /// Add distance code and length to literal and distance trees /// /// Distance code /// Length /// Value indicating if internal buffer is full public bool TallyDist(int dist, int len) { // if (DeflaterConstants.DEBUGGING) { // //Console.WriteLine("["+dist+","+len+"]"); // } d_buf[last_lit] = (short)dist; l_buf[last_lit++] = (byte)(len - 3); int lc = Lcode(len - 3); literalTree.freqs[lc]++; if (lc >= 265 && lc < 285) { extra_bits += (lc - 261) / 4; } int dc = Dcode(dist - 1); distTree.freqs[dc]++; if (dc >= 4) { extra_bits += dc / 2 - 1; } return IsFull(); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Checksums/0000755000175000017500000000000012204443225023755 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Checksums/Adler32.cs0000644000175000017500000001546512204443225025513 0ustar00meebeymeebey00000000000000// Adler32.cs - Computes Adler32 data checksum of a data stream // Copyright (C) 2001 Mike Krueger // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 1999, 2000, 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; namespace agsXMPP.IO.Compression.Checksums { /// /// Computes Adler32 checksum for a stream of data. An Adler32 /// checksum is not as reliable as a CRC32 checksum, but a lot faster to /// compute. /// /// The specification for Adler32 may be found in RFC 1950. /// ZLIB Compressed Data Format Specification version 3.3) /// /// /// From that document: /// /// "ADLER32 (Adler-32 checksum) /// This contains a checksum value of the uncompressed data /// (excluding any dictionary data) computed according to Adler-32 /// algorithm. This algorithm is a 32-bit extension and improvement /// of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 /// standard. /// /// Adler-32 is composed of two sums accumulated per byte: s1 is /// the sum of all bytes, s2 is the sum of all s1 values. Both sums /// are done modulo 65521. s1 is initialized to 1, s2 to zero. The /// Adler-32 checksum is stored as s2*65536 + s1 in most- /// significant-byte first (network) order." /// /// "8.2. The Adler-32 algorithm /// /// The Adler-32 algorithm is much faster than the CRC32 algorithm yet /// still provides an extremely low probability of undetected errors. /// /// The modulo on unsigned long accumulators can be delayed for 5552 /// bytes, so the modulo operation time is negligible. If the bytes /// are a, b, c, the second sum is 3a + 2b + c + 3, and so is position /// and order sensitive, unlike the first sum, which is just a /// checksum. That 65521 is prime is important to avoid a possible /// large class of two-byte errors that leave the check unchanged. /// (The Fletcher checksum uses 255, which is not prime and which also /// makes the Fletcher check insensitive to single byte changes 0 - /// 255.) /// /// The sum s1 is initialized to 1 instead of zero to make the length /// of the sequence part of s2, so that the length does not have to be /// checked separately. (Any sequence of zeroes has a Fletcher /// checksum of zero.)" /// /// /// public sealed class Adler32 : IChecksum { /// /// largest prime smaller than 65536 /// readonly static uint BASE = 65521; uint checksum; /// /// Returns the Adler32 data checksum computed so far. /// public long Value { get { return checksum; } } /// /// Creates a new instance of the Adler32 class. /// The checksum starts off with a value of 1. /// public Adler32() { Reset(); } /// /// Resets the Adler32 checksum to the initial value. /// public void Reset() { checksum = 1; } /// /// Updates the checksum with the byte b. /// /// /// The data value to add. The high byte of the int is ignored. /// public void Update(int bval) { // We could make a length 1 byte array and call update again, but I // would rather not have that overhead uint s1 = checksum & 0xFFFF; uint s2 = checksum >> 16; s1 = (s1 + ((uint)bval & 0xFF)) % BASE; s2 = (s1 + s2) % BASE; checksum = (s2 << 16) + s1; } /// /// Updates the checksum with an array of bytes. /// /// /// The source of the data to update with. /// public void Update(byte[] buffer) { Update(buffer, 0, buffer.Length); } /// /// Updates the checksum with the bytes taken from the array. /// /// /// an array of bytes /// /// /// the start of the data used for this update /// /// /// the number of bytes to use for this update /// public void Update(byte[] buf, int off, int len) { if (buf == null) { throw new ArgumentNullException("buf"); } if (off < 0 || len < 0 || off + len > buf.Length) { throw new ArgumentOutOfRangeException(); } //(By Per Bothner) uint s1 = checksum & 0xFFFF; uint s2 = checksum >> 16; while (len > 0) { // We can defer the modulo operation: // s1 maximally grows from 65521 to 65521 + 255 * 3800 // s2 maximally grows by 3800 * median(s1) = 2090079800 < 2^31 int n = 3800; if (n > len) { n = len; } len -= n; while (--n >= 0) { s1 = s1 + (uint)(buf[off++] & 0xFF); s2 = s2 + s1; } s1 %= BASE; s2 %= BASE; } checksum = (s2 << 16) | s1; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/Checksums/IChecksum.cs0000644000175000017500000000666712204443225026176 0ustar00meebeymeebey00000000000000// IChecksum.cs - Interface to compute a data checksum // Copyright (C) 2001 Mike Krueger // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 1999, 2000, 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. namespace agsXMPP.IO.Compression.Checksums { /// /// Interface to compute a data checksum used by checked input/output streams. /// A data checksum can be updated by one byte or with a byte array. After each /// update the value of the current checksum can be returned by calling /// getValue. The complete checksum object can also be reset /// so it can be used again with new data. /// public interface IChecksum { /// /// Returns the data checksum computed so far. /// long Value { get; } /// /// Resets the data checksum as if no update was ever called. /// void Reset(); /// /// Adds one byte to the data checksum. /// /// /// the data value to add. The high byte of the int is ignored. /// void Update(int bval); /// /// Updates the data checksum with the bytes taken from the array. /// /// /// buffer an array of bytes /// void Update(byte[] buffer); /// /// Adds the byte array to the data checksum. /// /// /// the buffer which contains the data /// /// /// the offset in the buffer where the data starts /// /// /// the length of the data /// void Update(byte[] buf, int off, int len); } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/DeflaterPending.cs0000644000175000017500000000451312204443225025415 0ustar00meebeymeebey00000000000000// DeflaterPending.cs // // Copyright (C) 2001 Mike Krueger // Copyright (C) 2004 John Reilly // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. namespace agsXMPP.IO.Compression { /// /// This class stores the pending output of the Deflater. /// /// author of the original java version : Jochen Hoenicke /// public class DeflaterPending : PendingBuffer { /// /// Construct instance with default buffer size /// public DeflaterPending() : base(DeflaterConstants.PENDING_BUF_SIZE) { } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/Compression/InflaterDynHeader.cs0000644000175000017500000001366312204443225025720 0ustar00meebeymeebey00000000000000// InflaterDynHeader.cs // Copyright (C) 2001 Mike Krueger // // This file was translated from java, it was part of the GNU Classpath // Copyright (C) 2001 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 // 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. // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give you // permission to link this library with independent modules to produce an // executable, regardless of the license terms of these independent // modules, and to copy and distribute the resulting executable under // terms of your choice, provided that you also meet, for each linked // independent module, the terms and conditions of the license of that // module. An independent module is a module which is not derived from // or based on this library. If you modify this library, you may extend // this exception to your version of the library, but you are not // obligated to do so. If you do not wish to do so, delete this // exception statement from your version. using System; using agsXMPP.IO.Compression.Streams; namespace agsXMPP.IO.Compression { class InflaterDynHeader { const int LNUM = 0; const int DNUM = 1; const int BLNUM = 2; const int BLLENS = 3; const int LENS = 4; const int REPS = 5; static readonly int[] repMin = { 3, 3, 11 }; static readonly int[] repBits = { 2, 3, 7 }; byte[] blLens; byte[] litdistLens; InflaterHuffmanTree blTree; int mode; int lnum, dnum, blnum, num; int repSymbol; byte lastLen; int ptr; static readonly int[] BL_ORDER = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; public InflaterDynHeader() { } public bool Decode(StreamManipulator input) { decode_loop: for (;;) { switch (mode) { case LNUM: lnum = input.PeekBits(5); if (lnum < 0) { return false; } lnum += 257; input.DropBits(5); // System.err.println("LNUM: "+lnum); mode = DNUM; goto case DNUM; // fall through case DNUM: dnum = input.PeekBits(5); if (dnum < 0) { return false; } dnum++; input.DropBits(5); // System.err.println("DNUM: "+dnum); num = lnum+dnum; litdistLens = new byte[num]; mode = BLNUM; goto case BLNUM; // fall through case BLNUM: blnum = input.PeekBits(4); if (blnum < 0) { return false; } blnum += 4; input.DropBits(4); blLens = new byte[19]; ptr = 0; // System.err.println("BLNUM: "+blnum); mode = BLLENS; goto case BLLENS; // fall through case BLLENS: while (ptr < blnum) { int len = input.PeekBits(3); if (len < 0) { return false; } input.DropBits(3); // System.err.println("blLens["+BL_ORDER[ptr]+"]: "+len); blLens[BL_ORDER[ptr]] = (byte) len; ptr++; } blTree = new InflaterHuffmanTree(blLens); blLens = null; ptr = 0; mode = LENS; goto case LENS; // fall through case LENS: { int symbol; while (((symbol = blTree.GetSymbol(input)) & ~15) == 0) { /* Normal case: symbol in [0..15] */ // System.err.println("litdistLens["+ptr+"]: "+symbol); litdistLens[ptr++] = lastLen = (byte)symbol; if (ptr == num) { /* Finished */ return true; } } /* need more input ? */ if (symbol < 0) { return false; } /* otherwise repeat code */ if (symbol >= 17) { /* repeat zero */ // System.err.println("repeating zero"); lastLen = 0; } else { if (ptr == 0) { throw new SharpZipBaseException(); } } repSymbol = symbol-16; } mode = REPS; goto case REPS; // fall through case REPS: { int bits = repBits[repSymbol]; int count = input.PeekBits(bits); if (count < 0) { return false; } input.DropBits(bits); count += repMin[repSymbol]; // System.err.println("litdistLens repeated: "+count); if (ptr + count > num) { throw new SharpZipBaseException(); } while (count-- > 0) { litdistLens[ptr++] = lastLen; } if (ptr == num) { /* Finished */ return true; } } mode = LENS; goto decode_loop; } } } public InflaterHuffmanTree BuildLitLenTree() { byte[] litlenLens = new byte[lnum]; Array.Copy(litdistLens, 0, litlenLens, 0, lnum); return new InflaterHuffmanTree(litlenLens); } public InflaterHuffmanTree BuildDistTree() { byte[] distLens = new byte[dnum]; Array.Copy(litdistLens, lnum, distLens, 0, dnum); return new InflaterHuffmanTree(distLens); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/IO/StringWriterWithEncoding.cs0000644000175000017500000000323212204443225025024 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Text; namespace agsXMPP.IO { /// /// This class is inherited from the StringWriter Class /// The standard StringWriter class supports no encoding /// With this Class we can set the Encoding of a StringWriter in the Constructor /// public class StringWriterWithEncoding : StringWriter { Encoding m_Encoding; public StringWriterWithEncoding (Encoding encoding) { this.m_Encoding = encoding; } public override Encoding Encoding { get { return m_Encoding; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC_20.csproj0000644000175000017500000005624312204443225022736 0ustar00meebeymeebey00000000000000 Debug AnyCPU 8.0.50727 2.0 {33BAFD81-945E-46CF-A6E1-42CB7B626CDB} Library Properties agsXMPP agsXMPP {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 agsXMPP_PPC_20 v2.0 false key.snk true full false bin\PPC_20\Debug\ TRACE;DEBUG;CF_2;STRINGPREP;BCCRYPTO true true prompt 512 4 Off pdbonly true bin\PPC_20\Release\ TRACE;CF_2;STRINGPREP;BCCRYPTO true true prompt 512 4 Off Code Code False .\crypto.dll smuxi-1.1/lib/agsxmpp/agsxmpp/app.config0000644000175000017500000000017012204443225021165 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/agsxmpp/agsxmpp/key.snk0000644000175000017500000000112412204443225020523 0ustar00meebeymeebey00000000000000$RSA2F-]W/~> ɗĮEp -ކ^JÌ_@5Gei$%_ 5ҫPPh~[d{.:@]>bhWdI_#Q>1If4p\nh-O=q$RZ)Epym #Dx;o(iekD?uN*{N= >R U AW%{<;ON9{XP%s8mr\I(B.1KeBqR`1yj[BA岑-\1e]Wg8vU( OZ)uBD myi{/>Z$EXEw=CLQwWd(=l"(wM+ɸ+҇JJ(薬xۓIyY-j=u!Uoɽ 4` <"[MZ[smuxi-1.1/lib/agsxmpp/agsxmpp/Net/0000755000175000017500000000000012245370027017752 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Net/SocketConnectionType.cs0000644000175000017500000000321212204443225024405 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Net { /// /// Summary description for SocketType. /// public enum SocketConnectionType { #if !SL /// /// Direct TCP/IP Connection /// Direct, #endif /// /// A HTTP Polling Socket connection (JEP-0025) /// HttpPolling, /// /// XEP-0124: Bidirectional-streams Over Synchronous HTTP (BOSH) /// http://www.xmpp.org/extensions/xep-0124.html /// Bosh } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/BoshClientSocket.cs0000644000175000017500000007555712204443225023523 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Collections; using System.Security.Cryptography; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol.extensions.bosh; namespace agsXMPP.Net { public class WebRequestState { public WebRequestState(WebRequest request) { m_WebRequest = request; } DateTime m_Started; WebRequest m_WebRequest = null; Stream m_RequestStream = null; string m_Output = null; bool m_IsSessionRequest = false; Timer m_TimeOutTimer = null; private bool m_Aborted = false; public int WebRequestId; /// /// when was this request started (timestamp)? /// public DateTime Started { get { return m_Started; } set { m_Started = value; } } public bool IsSessionRequest { get { return m_IsSessionRequest; } set { m_IsSessionRequest = value; } } public string Output { get { return m_Output; } set { m_Output = value; } } public WebRequest WebRequest { get { return m_WebRequest; } set { m_WebRequest = value; } } public Stream RequestStream { get { return m_RequestStream; } set { m_RequestStream = value; } } public Timer TimeOutTimer { get { return m_TimeOutTimer; } set { m_TimeOutTimer = value; } } public bool Aborted { get { return m_Aborted; } set { m_Aborted = value; } } } public class BoshClientSocket : BaseSocket { private const string CONTENT_TYPE = "text/xml; charset=utf-8"; private const string METHOD = "POST"; private const string BOSH_VERSION = "1.6"; private const int WEBREQUEST_TIMEOUT = 5000; private const int OFFSET_WAIT = 5000; private string[] Keys; // Array of keys private int activeRequests = 0; // currently active (waiting) WebRequests private int CurrentKeyIdx; // index of the currect key private Queue m_SendQueue = new Queue(); // Queue for stanzas to send private bool streamStarted = false; // is the stream started? received stream header? private int polling = 0; private bool terminate = false; private bool terminated = false; private DateTime lastSend = DateTime.MinValue; // DateTime of the last activity/response private bool m_KeepAlive = true; private long rid; private bool restart = false; // stream state, are we currently restarting the stream? private string sid; private bool requestIsTerminating = false; private int webRequestId = 1; public BoshClientSocket(XmppConnection con) { base.m_XmppCon = con; } private void Init() { Keys = null; streamStarted = false; terminate = false; terminated = false; } #region << Properties >> private Jid m_To; private int m_Wait = 300; // 5 minutes by default, if you think this is to long change it over the public property private int m_Requests = 2; #if !CF && !CF_2 private int m_MinCountKeys = 1000; private int m_MaxCountKeys = 9999; #else // set this lower on embedded devices because the key generation is slow there private int m_MinCountKeys = 10; private int m_MaxCountKeys = 99; #endif private int m_Hold = 1; // should be 1 private int m_MaxPause = 0; private WebProxy m_Proxy = null; public Jid To { get { return m_To; } set { m_To = value; } } /// /// The longest time (in seconds) that the connection manager is allowed to wait before responding to any request during the session. /// This enables the client to prevent its TCP connection from expiring due to inactivity, as well as to limit the delay before /// it discovers any network failure. /// public int Wait { get { return m_Wait; } set { m_Wait = value; } } public int Requests { get { return m_Requests; } set { m_Requests = value; } } public int MaxCountKeys { get { return m_MaxCountKeys; } set { m_MaxCountKeys = value; } } public int MinCountKeys { get { return m_MinCountKeys; } set { m_MinCountKeys = value; } } /// /// This attribute specifies the maximum number of requests the connection manager is allowed to keep waiting /// at any one time during the session. If the client is not able to use HTTP Pipelining then this SHOULD be set to "1". /// public int Hold { get { return m_Hold; } set { m_Hold = value; } } /// /// Keep Alive for HTTP Webrequests, its disables by default because not many BOSH implementations support Keep Alives /// public bool KeepAlive { get { return m_KeepAlive; } set { m_KeepAlive = value; } } /// /// If the connection manager supports session pausing (see Inactivity) then it SHOULD advertise that to the client /// by including a 'maxpause' attribute in the session creation response element. /// The value of the attribute indicates the maximum length of a temporary session pause (in seconds) that a client MAY request. /// 0 is the default value and indicated that the connection manager supports no session pausing. /// public int MaxPause { get { return m_MaxPause; } set { m_MaxPause = value; } } public bool SupportsSessionPausing { get { return !(m_MaxPause == 0); } } public WebProxy Proxy { get { return m_Proxy; } set { m_Proxy = value; } } #endregion private string DummyStreamHeader { get { // // create dummy stream header StringBuilder sb = new StringBuilder(); sb.Append(""); return sb.ToString(); } } /// /// Generates a bunch of keys /// private void GenerateKeys() { /* 13.3 Generating the Key Sequence Prior to requesting a new session, the client MUST select an unpredictable counter ("n") and an unpredictable value ("seed"). The client then processes the "seed" through a cryptographic hash and converts the resulting 160 bits to a hexadecimal string K(1). It does this "n" times to arrive at the initial key K(n). The hashing algorithm MUST be SHA-1 as defined in RFC 3174. Example 25. Creating the key sequence K(1) = hex(SHA-1(seed)) K(2) = hex(SHA-1(K(1))) ... K(n) = hex(SHA-1(K(n-1))) */ int countKeys = GetRandomNumber(m_MinCountKeys, m_MaxCountKeys); Keys = new string[countKeys]; string prev = GenerateSeed(); for (int i = 0; i < countKeys; i++) { Keys[i] = Util.Hash.Sha1Hash(prev); prev = Keys[i]; } CurrentKeyIdx = countKeys - 1; } private string GenerateSeed() { int m_lenght = 10; #if CF util.RandomNumberGenerator rng = util.RandomNumberGenerator.Create(); #else RandomNumberGenerator rng = RandomNumberGenerator.Create(); #endif byte[] buf = new byte[m_lenght]; rng.GetBytes(buf); return Util.Hash.HexToString(buf); } private int GenerateRid() { int min = 1; int max = int.MaxValue; Random rnd = new Random(); return rnd.Next(min, max); } private int GetRandomNumber(int min, int max) { Random rnd = new Random(); return rnd.Next(min, max); } public override void Reset() { base.Reset(); streamStarted = false; restart = true; } public void RequestBoshSession() { /* Example 1. Requesting a BOSH session POST /webclient HTTP/1.1 Host: httpcm.jabber.org Accept-Encoding: gzip, deflate Content-Type: text/xml; charset=utf-8 Content-Length: 104 */ lastSend = DateTime.Now; // Generate the keys GenerateKeys(); rid = GenerateRid(); Body body = new Body(); /* * */ //window='5' content='text/xml; charset=utf-8' //body.SetAttribute("window", "5"); //body.SetAttribute("content", "text/xml; charset=utf-8"); body.Version = BOSH_VERSION; body.XmppVersion = "1.0"; body.Hold = m_Hold; body.Wait = m_Wait; body.Rid = rid; body.Polling = 0; body.Requests = m_Requests; body.To = new Jid(m_XmppCon.Server); body.NewKey = Keys[CurrentKeyIdx]; body.SetAttribute("xmpp:xmlns", "urn:xmpp:xbosh"); activeRequests++; HttpWebRequest req = (HttpWebRequest) CreateWebrequest(Address); WebRequestState state = new WebRequestState(req); state.Started = DateTime.Now; state.Output = body.ToString(); state.IsSessionRequest = true; req.Method = METHOD; req.ContentType = CONTENT_TYPE; req.Timeout = m_Wait * 1000; req.KeepAlive = m_KeepAlive; req.ContentLength = Encoding.UTF8.GetBytes(state.Output).Length; // state.Output.Length; try { IAsyncResult result = req.BeginGetRequestStream(new AsyncCallback(this.OnGetSessionRequestStream), state); } catch (Exception) { } } private void OnGetSessionRequestStream(IAsyncResult ar) { try { WebRequestState state = ar.AsyncState as WebRequestState; HttpWebRequest req = state.WebRequest as HttpWebRequest; Stream outputStream = req.EndGetRequestStream(ar); byte[] bytes = Encoding.UTF8.GetBytes(state.Output); state.RequestStream = outputStream; IAsyncResult result = outputStream.BeginWrite(bytes, 0, bytes.Length, OnEndWrite, state); } catch (WebException ex) { FireOnError(ex); Disconnect(); } } private void OnGetSessionRequestResponse(IAsyncResult result) { // grab the custom state object WebRequestState state = (WebRequestState)result.AsyncState; HttpWebRequest request = (HttpWebRequest)state.WebRequest; //state.TimeOutTimer.Dispose(); // get the Response HttpWebResponse resp = (HttpWebResponse)request.EndGetResponse(result); // The server must always return a 200 response code, // sending any session errors as specially-formatted identifiers. if (resp.StatusCode != HttpStatusCode.OK) { return; } Stream rs = resp.GetResponseStream(); int readlen; byte[] readbuf = new byte[1024]; MemoryStream ms = new MemoryStream(); while ((readlen = rs.Read(readbuf, 0, readbuf.Length)) > 0) { ms.Write(readbuf, 0, readlen); } byte[] recv = ms.ToArray(); if (recv.Length > 0) { string body = null; string stanzas = null; string res = Encoding.UTF8.GetString(recv, 0, recv.Length); ParseResponse(res, ref body, ref stanzas); Document doc = new Document(); doc.LoadXml(body); Body boshBody = doc.RootElement as Body; sid = boshBody.Sid; polling = boshBody.Polling; m_MaxPause = boshBody.MaxPause; byte[] bin = Encoding.UTF8.GetBytes(DummyStreamHeader + stanzas); base.FireOnReceive(bin, bin.Length); // cleanup webrequest resources ms.Close(); rs.Close(); resp.Close(); activeRequests--; if (activeRequests == 0) StartWebRequest(); } } /// /// This is ugly code, but currently all BOSH server implementaions are not namespace correct, /// which means we can't use the XML parser here and have to spit it with string functions. /// /// /// /// private void ParseResponse(string res, ref string body, ref string stanzas) { res = res.Trim(); if (res.EndsWith("/>")) { // // empty response body = res; stanzas = null; } else { /* * * * * */ // find position of the first closing angle bracket int startPos = res.IndexOf(">"); // find position of the last opening angle bracket int endPos = res.LastIndexOf("<"); body = res.Substring(0, startPos) + "/>"; stanzas = res.Substring(startPos + 1, endPos - startPos - 1); } } #region << Public Methods and Functions >> public override void Connect() { base.Connect(); Init(); FireOnConnect(); RequestBoshSession(); } public override void Disconnect() { base.Disconnect(); FireOnDisconnect(); //m_Connected = false; } public override void Send(byte[] bData) { base.Send(bData); Send(Encoding.UTF8.GetString(bData, 0, bData.Length)); } public override void Send(string data) { base.Send(data); // This are hacks because we send no stream headers and footer in Bosh if (data.StartsWith("")) { protocol.client.Presence pres = new protocol.client.Presence(); pres.Type = agsXMPP.protocol.client.PresenceType.unavailable; data = pres.ToString(); //= ""; terminate = true; } // return; lock (m_SendQueue) { m_SendQueue.Enqueue(data); } CheckDoRequest(); return; } #endregion private void CheckDoRequest() { /* * requestIsTerminating is true when a webrequest is ending * when the requests ends a new request gets started immedialtely, * so we don't have to create another request in the case */ if (!requestIsTerminating) Request(); } private void Request() { if (activeRequests < 2) StartWebRequest(); } private string BuildPostData() { CurrentKeyIdx--; rid++; StringBuilder sb = new StringBuilder(); Body body = new Body(); body.Rid = rid; body.Key = Keys[CurrentKeyIdx]; if (CurrentKeyIdx == 0) { // this is our last key // Generate a new key sequence GenerateKeys(); body.NewKey = Keys[CurrentKeyIdx]; } body.Sid = sid; //body.Polling = 0; body.To = new Jid(m_XmppCon.Server); if (restart) { body.XmppRestart = true; restart = false; } lock (m_SendQueue) { if (terminate && m_SendQueue.Count == 1) body.Type = BoshType.terminate; if (m_SendQueue.Count > 0) { sb.Append(body.StartTag()); while (m_SendQueue.Count > 0) { string data = m_SendQueue.Dequeue() as string; sb.Append(data); } sb.Append(body.EndTag()); return sb.ToString(); } else return body.ToString(); } } private void StartWebRequest() { StartWebRequest(false, null); } private void StartWebRequest(bool retry, string content) { lock (this) { webRequestId++; } activeRequests++; lastSend = DateTime.Now; HttpWebRequest req = (HttpWebRequest) CreateWebrequest(Address);; WebRequestState state = new WebRequestState(req); state.Started = DateTime.Now; state.WebRequestId = webRequestId; if (!retry) state.Output = BuildPostData(); else state.Output = content; req.Method = METHOD; req.ContentType = CONTENT_TYPE; req.Timeout = m_Wait * 1000; req.KeepAlive = m_KeepAlive; req.ContentLength = Encoding.UTF8.GetBytes(state.Output).Length; // Create the delegate that invokes methods for the timer. TimerCallback timerDelegate = TimeOutGetRequestStream; Timer timeoutTimer = new Timer(timerDelegate, state, WEBREQUEST_TIMEOUT, WEBREQUEST_TIMEOUT); state.TimeOutTimer = timeoutTimer; try { req.BeginGetRequestStream(OnGetRequestStream, state); } catch(Exception ex) { //Console.WriteLine(ex.Message); } } public void TimeOutGetRequestStream(Object stateObj) { //Console.WriteLine("Web Request timed out"); WebRequestState state = stateObj as WebRequestState; state.TimeOutTimer.Dispose(); state.Aborted = true; state.WebRequest.Abort(); } private void OnGetRequestStream(IAsyncResult ar) { try { WebRequestState state = ar.AsyncState as WebRequestState; if (state.Aborted) { activeRequests--; StartWebRequest(true, state.Output); } else { state.TimeOutTimer.Dispose(); HttpWebRequest req = state.WebRequest as HttpWebRequest; Stream requestStream = req.EndGetRequestStream(ar); state.RequestStream = requestStream; byte[] bytes = Encoding.UTF8.GetBytes(state.Output); requestStream.BeginWrite(bytes, 0, bytes.Length, OnEndWrite, state); } } catch (Exception ex) { activeRequests--; WebRequestState state = ar.AsyncState as WebRequestState; StartWebRequest(true, state.Output); } } private void OnEndWrite(IAsyncResult ar) { WebRequestState state = ar.AsyncState as WebRequestState; HttpWebRequest req = state.WebRequest as HttpWebRequest; Stream requestStream = state.RequestStream; requestStream.EndWrite(ar); requestStream.Close(); IAsyncResult result; try { if (state.IsSessionRequest) req.BeginGetResponse(OnGetSessionRequestResponse, state); else req.BeginGetResponse(OnGetResponse, state); } catch (Exception ex) { //Console.WriteLine(ex.Message); } } private void OnGetResponse(IAsyncResult ar) { try { requestIsTerminating = true; // grab the custom state object WebRequestState state = (WebRequestState)ar.AsyncState; HttpWebRequest request = (HttpWebRequest)state.WebRequest; HttpWebResponse resp = null; if (request.HaveResponse) { // TODO, its crashing mostly here // get the Response try { resp = (HttpWebResponse) request.EndGetResponse(ar); } catch (WebException ex) { activeRequests--; requestIsTerminating = false; if (ex.Response == null) { StartWebRequest(); } else { HttpWebResponse res = ex.Response as HttpWebResponse; if (res.StatusCode == HttpStatusCode.NotFound) { TerminateBoshSession(); } } return; } // The server must always return a 200 response code, // sending any session errors as specially-formatted identifiers. if (resp.StatusCode != HttpStatusCode.OK) { activeRequests--; requestIsTerminating = false; if (resp.StatusCode == HttpStatusCode.NotFound) { //Console.WriteLine("Not Found"); TerminateBoshSession(); } return; } } else { //Console.WriteLine("No response"); } Stream rs = resp.GetResponseStream(); int readlen; byte[] readbuf = new byte[1024]; MemoryStream ms = new MemoryStream(); while ((readlen = rs.Read(readbuf, 0, readbuf.Length)) > 0) { ms.Write(readbuf, 0, readlen); } byte[] recv = ms.ToArray(); if (recv.Length > 0) { string sbody = null; string stanzas = null; ParseResponse(Encoding.UTF8.GetString(recv, 0, recv.Length), ref sbody, ref stanzas); if (stanzas != null) { byte[] bStanzas = Encoding.UTF8.GetBytes(stanzas); base.FireOnReceive(bStanzas, bStanzas.Length); } else { if (sbody != null) { var doc = new Document(); doc.LoadXml(sbody); if (doc.RootElement != null) { var body = doc.RootElement as Body; if (body.Type == BoshType.terminate) TerminateBoshSession(); } } if (terminate && !terminated) { // empty teminate response TerminateBoshSession(); } } } // cleanup webrequest resources ms.Close(); rs.Close(); resp.Close(); activeRequests--; requestIsTerminating = false; //if (activeRequests == 0 && !terminated) if ( (activeRequests == 0 && !terminated) || (activeRequests == 1 && m_SendQueue.Count > 0) ) { StartWebRequest(); } } catch (Exception ex) { } } private WebRequest CreateWebrequest(string address) { WebRequest webReq = WebRequest.Create(address); #if !CF_2 if (m_Proxy != null) webReq.Proxy = m_Proxy; else { if (webReq.Proxy != null) webReq.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials; } #endif return webReq; } private void TerminateBoshSession() { // empty teminate response byte[] bStanzas = Encoding.UTF8.GetBytes(""); base.FireOnReceive(bStanzas, bStanzas.Length); terminated = true; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/PollClientSocket.cs0000644000175000017500000002636112204443225023523 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Collections; using System.Security.Cryptography; #if CF using agsXMPP.util; #endif namespace agsXMPP.Net { /// /// JEP-0025 Jabber HTTP Polling Socket /// public class PollClientSocket : BaseSocket { private const string CONTENT_TYPE = "application/x-www-form-urlencoded"; private const string METHOD = "POST"; private string[] m_Keys; private int m_CurrentKeyIdx; private string m_ID = null; private Queue m_SendQueue = new Queue(); /// /// Object for synchronizing threads /// private Object m_Lock = new Object(); #if CF || CF_2 private DateTime m_WaitUntil; #endif public PollClientSocket() { } #region << Properties and Members >> private bool m_Connected = false; private int m_Interval = 10000; #if !CF private int m_CountKeys = 256; #else // set this lower on embedded devices because the key generation is slow there private int m_CountKeys = 32; #endif private WebProxy m_Proxy = null; /// /// because the client socket is no presintant socket we return always true /// public override bool Connected { get { return true; } } /// /// Poll interval in milliseconds. /// The maximum interval recommended for clients between requests is two minutes (120000); /// Default is 10 seconds (10000) /// public int Interval { get { return m_Interval; } set { m_Interval = value;} } /// /// count of keys to generate each time. Keys are generated with the Sha1 algoritm. /// You can reduce the num,ber of keys to gemerate each time if your device is to slow on generating the keys /// or you want to save memory. /// 256 is the default value, 32 on CF /// public int CountKeys { get { return m_CountKeys; } set { m_CountKeys = value;} } public WebProxy Proxy { get { return m_Proxy; } set { m_Proxy = value; } } #endregion #region << Public Methods and Functions >> public override void Connect() { base.Connect(); FireOnConnect(); Init(); m_Connected = true; // Start a new Thread for polling Thread m_thread = new Thread(new ThreadStart(PollThread)); #if !CF // useful in debug m_thread.Name = "HTTP Polling Thread"; #endif m_thread.Start(); } public override void Disconnect() { base.Disconnect(); FireOnDisconnect(); m_Connected = false; } public override void Send(byte[] bData) { base.Send (bData); Send(Encoding.UTF8.GetString(bData, 0, bData.Length)); } public override void Send(string data) { base.Send (data); #if CF || CF_2 lock (m_Lock) { m_SendQueue.Enqueue(data); } #else lock(m_Lock) { m_SendQueue.Enqueue(data); Monitor.Pulse(m_Lock); } #endif } #endregion private void Init() { m_ID = null; m_Keys = null; m_CurrentKeyIdx = 0; } /// /// Simple algotithm for generating a random key /// /// private string GenerateRandomKey() { // Lenght of the Session ID on bytes, // 16 bytes equaly 32 chars // This should be unique enough int m_lenght = 16; RandomNumberGenerator RNG = RandomNumberGenerator.Create(); byte[] buf = new byte[m_lenght]; RNG.GetBytes(buf); return Util.Hash.HexToString(buf).ToLower(); } /// /// Generates a bunch of keys /// private void GenerateKeys() { string prev = GenerateRandomKey(); m_Keys = new string[m_CountKeys]; for (int i=0; i < m_CountKeys; i++) { byte[] hash = Util.Hash.Sha1HashBytes(prev); m_Keys[i] = Convert.ToBase64String(hash, 0, hash.Length); prev = m_Keys[i]; } m_CurrentKeyIdx = m_CountKeys - 1; } private void PollThread() { /* Example 7. Initial request (with keys) POST /wc12/webclient HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: webim.jabber.com 0;VvxEk07IFy6hUmG/PPBlTLE2fiA=, POST /wc12/webclient HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: webim.jabber.com 7776:2054;moPFsvHytDGiJQOjp186AMXAeP0=, hildjj */ while(m_Connected) { string content; string data; // lock(m_lock) // { if (m_SendQueue.Count > 0) data = m_SendQueue.Dequeue() as string; else data = ""; // } if (m_ID == null) { GenerateKeys(); content = string.Format("{0};{1},{2}", "0", m_Keys[m_CurrentKeyIdx], data); } else { if (m_CurrentKeyIdx == 0) { // only 1 Key left string key = m_Keys[0]; // generate new keys GenerateKeys(); /* Example 9. Changing key POST /wc12/webclient HTTP/1.1 Content-Type: application/x-www-form-urlencoded Host: webim.jabber.com 7776:2054;C+7Hteo/D9vJXQ3UfzxbwnXaijM=;Tr697Eff02+32FZp38Xaq2+3Bv4=, */ content = string.Format("{0};{1};{2},{3}", m_ID, key, m_Keys[m_CurrentKeyIdx], data); } else { // m_CurrentKey = CreateNextKey(m_CurrentKey); content = string.Format("{0};{1},{2}", m_ID, m_Keys[m_CurrentKeyIdx], data); } } //Console.WriteLine("used Key index: " + m_CurrentKeyIdx.ToString()); m_CurrentKeyIdx--; byte[] bytes = Encoding.UTF8.GetBytes(content); FireOnSend(bytes, bytes.Length); HttpWebRequest req = (HttpWebRequest) WebRequest.Create(Address); // Set Proxy Information if (m_Proxy != null) req.Proxy = m_Proxy; req.Method = METHOD; //req.KeepAlive = true; req.ContentType = CONTENT_TYPE; req.ContentLength = bytes.Length; req.Timeout = 5000; Stream outputStream; try { outputStream = req.GetRequestStream(); } catch (Exception ex) { base.FireOnError(ex); Disconnect(); return; } outputStream.Write (bytes, 0, bytes.Length); outputStream.Close (); // This does the Webrequest. So catch errors here HttpWebResponse resp; try { resp = (HttpWebResponse) req.GetResponse(); } catch(Exception ex) { FireOnError(ex); return; } // The server must always return a 200 response code, // sending any session errors as specially-formatted identifiers. if (resp.StatusCode != HttpStatusCode.OK) { FireOnError(new PollSocketException("unexpected status code " + resp.StatusCode.ToString())); return; } Stream rs = resp.GetResponseStream(); int readlen; byte[] readbuf = new byte[1024]; MemoryStream ms = new MemoryStream(); while ((readlen = rs.Read(readbuf, 0, readbuf.Length)) > 0) { ms.Write(readbuf, 0, readlen); } byte[] recv = ms.ToArray(); // Read Cookies from Header // Set-Cookie: ID=7776:2054; path=/webclient/; expires=-1 WebHeaderCollection headers = resp.Headers; // Check for any cookies // Didnt get the .NET CookieCollection classes working correct // So read it by hand, i cookie is only another simple header if (headers["Set-Cookie"] != null) { string header = headers["Set-Cookie"]; string[] cookies = header.Split( (char) ';'); Hashtable htCookies = new Hashtable(); foreach(string cookie in cookies) { string[] vals = cookie.Split( (char) '='); if (vals.Length == 2) htCookies.Add(vals[0], vals[1]); } if (htCookies.ContainsKey("ID")) { string id = htCookies["ID"] as string; // if ID ends with its an error message if ( !id.EndsWith(":0")) { // if me dont have the ID yet cache it if (m_ID == null) m_ID = id; } else { // Handle Errors switch (id) { case "0:0": // 3.1.1 Unknown Error // Server returns ID=0:0. // The response body can contain a textual error message. return; case "-1:0": // 3.1.2 Server Error // Server returns ID=-1:0 return; case "-2:0": // 3.1.3 Bad Request // Server returns ID=-2:0 return; case "-3:0": // 3.1.4 Key Sequence Error // Server returns ID=-3:0 return; } } } } // cleanup webrequest resources ms.Close(); rs.Close(); resp.Close(); if (recv.Length > 0) { //Console.WriteLine("RECV: " + Encoding.UTF8.GetString(recv)); FireOnReceive(recv, recv.Length); } else { // We received nothing in the response, // so sleep until next poll #if CF || CF_2 if (m_SendQueue.Count == 0) { m_WaitUntil = DateTime.Now.AddMilliseconds(m_Interval); while (m_SendQueue.Count == 0 && DateTime.Compare(m_WaitUntil, DateTime.Now) > 0) { Thread.Sleep(100); } } #else lock(m_Lock) { if (m_SendQueue.Count == 0) { // Left for debugging //Console.WriteLine("Start Wait: " + m_Interval.ToString()); Monitor.Wait(m_Lock, m_Interval); //Console.WriteLine("End Wait:"); } } #endif } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/CertificateVerifier.cs0000644000175000017500000000325112204443225024214 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2008 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #if BCCRYPTO using System; using Org.BouncyCastle.Crypto.Tls; namespace agsXMPP.net { internal class CertificateVerifier : ICertificateVerifyer { internal event BaseSocket.CertificateValidationCallback OnVerifyCertificate; #region ICertificateVerifyer Members public bool IsValid(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[] certs) { if (OnVerifyCertificate != null) return OnVerifyCertificate(certs); else return true; } #endregion } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/0000755000175000017500000000000012204443225020472 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/RecordBase.cs0000644000175000017500000000304412204443225023033 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; namespace agsXMPP.Net.Dns { /// /// A simple base class for the different ResourceRecords, ANAME, MX, SOA, NS etc. /// public abstract class RecordBase { // no implementation } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/SRVRecord.cs0000644000175000017500000000666112204443225022643 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Net.Dns { /// /// Summary description for SRVRecord. /// public class SRVRecord : RecordBase, IComparable { /// /// Constructs a NS record by reading bytes from a return message /// /// A logical pointer to the bytes holding the record internal SRVRecord(Pointer pointer) { m_Priority = pointer.ReadShort(); m_Weight = pointer.ReadShort(); m_Port = pointer.ReadShort(); m_Target = pointer.ReadDomain(); } // the fields exposed outside the assembly private int m_Priority; private int m_Weight; private int m_Port; private string m_Target; public int Priority { get { return m_Priority; } } public int Weight { get { return m_Weight; } } public int Port { get { return m_Port; } } public string Target { get { return m_Target; } } public override string ToString() { return string.Format("\n priority = {0}\n weight = {1}\n port = {2}\n target = {3}", m_Priority, m_Weight, m_Port, m_Target); } /// /// Implements the IComparable interface so that we can sort the SRV records by their /// lowest priority /// /// the other SRVRecord to compare against /// 1, 0, -1 public int CompareTo(object obj) { SRVRecord srvOther = (SRVRecord)obj; // we want to be able to sort them by priority from lowest to highest. if (m_Priority < srvOther.m_Priority) return -1; if (m_Priority > srvOther.m_Priority) return 1; // if the priority is the same, sort by highest weight to lowest (higher // weighting means that server should get more of the requests) if (m_Weight > srvOther.m_Weight) return -1; if (m_Weight < srvOther.m_Weight) return 1; return 0; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/Enums.cs0000644000175000017500000000746212204443225022121 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; namespace agsXMPP.Net.Dns { /// /// The DNS TYPE (RFC1035 3.2.2/3). Not all are supported /// public enum DnsType { None = 0, /// /// a host address /// ANAME = 1, /// /// an authoritative name server /// NS = 2, // MD = 3, Obsolete // MF = 5, Obsolete /// /// the canonical name for an alias /// CNAME = 5, /// /// marks the start of a zone of authority /// SOA = 6, // MB = 7, EXPERIMENTAL // MG = 8, EXPERIMENTAL // MR = 9, EXPERIMENTAL // NULL = 10, EXPERIMENTAL /// /// a well known service description /// WKS = 11, /// /// a domain name pointer /// PTR = 12, /// /// host information /// HINFO = 13, /// /// mailbox or mail list information /// MINFO = 14, /// /// mail exchange /// MX = 15, /// /// text strings /// TXT = 16, /// /// SRV Records /// SRV = 33, } /// /// The DNS CLASS (RFC1035 3.2.4/5) /// Internet will be the one we'll be using (IN), the others are for completeness /// public enum DnsClass { None = 0, IN = 1, CS = 2, CH = 3, HS = 4 } /// /// (RFC1035 4.1.1) These are the return codes the server can send back /// public enum ReturnCode { Success = 0, FormatError = 1, ServerFailure = 2, NameError = 3, NotImplemented = 4, Refused = 5, Other = 6 } /// /// (RFC1035 4.1.1) These are the Query Types which apply to all questions in a request /// public enum Opcode { StandardQuery = 0, InverseQuery = 1, StatusRequest = 2, Reserved3 = 3, Reserved4 = 4, Reserved5 = 5, Reserved6 = 6, Reserved7 = 7, Reserved8 = 8, Reserved9 = 9, Reserved10 = 10, Reserved11 = 11, Reserved12 = 12, Reserved13 = 13, Reserved14 = 14, Reserved15 = 15, } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/Request.cs0000644000175000017500000001331412204443225022453 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; using System.Net; using System.Net.Sockets; using System.Collections; namespace agsXMPP.Net.Dns { /// /// A Request logically consists of a number of questions to ask the DNS Server. Create a request and /// add questions to it, then pass the request to Resolver.Lookup to query the DNS Server. It is important /// to note that many DNS Servers DO NOT SUPPORT MORE THAN 1 QUESTION PER REQUEST, and it is advised that /// you only add one question to a request. If not ensure you check Response.ReturnCode to see what the /// server has to say about it. /// public class Request { // A request is a series of questions, an 'opcode' (RFC1035 4.1.1) and a flag to denote // whether recursion is required (don't ask..., just assume it is) private ArrayList _questions; private bool _recursionDesired; private Opcode _opCode; public bool RecursionDesired { get { return _recursionDesired; } set { _recursionDesired = value; } } public Opcode Opcode { get { return _opCode; } set { _opCode = value; } } /// /// Construct this object with the default values and create an ArrayList to hold /// the questions as they are added /// public Request() { // default for a request is that recursion is desired and using standard query _recursionDesired = true; _opCode = Opcode.StandardQuery; // create an expandable list of questions _questions = new ArrayList(); } /// /// Adds a question to the request to be sent to the DNS server. /// /// The question to add to the request public void AddQuestion(Question question) { // abandon if null if (question == null) throw new ArgumentNullException("question"); // add this question to our collection _questions.Add(question); } /// /// Convert this request into a byte array ready to send direct to the DNS server /// /// public byte[] GetMessage() { // construct a message for this request. This will be a byte array but we're using // an arraylist as we don't know how big it will be ArrayList data = new ArrayList(); // the id of this message - this will be filled in by the resolver data.Add((byte)0); data.Add((byte)0); // write the bitfields data.Add((byte)(((byte)_opCode<<3) | (_recursionDesired?0x01:0))); data.Add((byte)0); // tell it how many questions unchecked { data.Add((byte)(_questions.Count >> 8)); data.Add((byte)_questions.Count); } // the are no requests, name servers or additional records in a request data.Add((byte)0); data.Add((byte)0); data.Add((byte)0); data.Add((byte)0); data.Add((byte)0); data.Add((byte)0); // that's the header done - now add the questions foreach (Question question in _questions) { AddDomain(data, question.Domain); unchecked { data.Add((byte)0); data.Add((byte)question.Type); data.Add((byte)0); data.Add((byte)question.Class); } } // and convert that to an array byte[] message = new byte[data.Count]; data.CopyTo(message); return message; } /// /// Adds a domain name to the ArrayList of bytes. This implementation does not use /// the domain name compression used in the class Pointer - maybe it should. /// /// The ArrayList representing the byte array message /// the domain name to encode and add to the array private static void AddDomain(ArrayList data, string domainName) { int position = 0; int length = 0; // start from the beginning and go to the end while (position < domainName.Length) { // look for a period, after where we are length = domainName.IndexOf('.', position) - position; // if there isn't one then this labels length is to the end of the string if (length < 0) length = domainName.Length - position; // add the length data.Add((byte)length); // copy a char at a time to the array while (length-- > 0) { data.Add((byte)domainName[position++]); } // step over '.' position++; } // end of domain names data.Add((byte)0); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/InvalidResponseException.cs0000644000175000017500000000406712204443225026014 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; namespace agsXMPP.Net.Dns { /// /// Thrown when the server delivers a response we are not expecting to hear /// public class InvalidResponseException : SystemException { public InvalidResponseException() { // no implementation } public InvalidResponseException(Exception innerException) : base(null, innerException) { // no implementation } public InvalidResponseException(string message, Exception innerException) : base (message, innerException) { // no implementation } //protected InvalidResponseException(SerializationInfo info, StreamingContext context) : base(info, context) //{ // // no implementation //} } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/ResourceRecord.cs0000644000175000017500000000713512204443225023755 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; namespace agsXMPP.Net.Dns { /// /// Represents a Resource Record as detailed in RFC1035 4.1.3 /// public class ResourceRecord { // private, constructor initialised fields private readonly string _domain; private readonly DnsType _dnsType; private readonly DnsClass _dnsClass; private readonly int _Ttl; private readonly RecordBase _record; // read only properties applicable for all records public string Domain { get { return _domain; } } public DnsType Type { get { return _dnsType; } } public DnsClass Class { get { return _dnsClass; } } public int Ttl { get { return _Ttl; } } public RecordBase Record { get { return _record; } } /// /// Construct a resource record from a pointer to a byte array /// /// the position in the byte array of the record internal ResourceRecord(Pointer pointer) { // extract the domain, question type, question class and Ttl _domain = pointer.ReadDomain(); _dnsType = (DnsType) pointer.ReadShort(); _dnsClass = (DnsClass) pointer.ReadShort(); _Ttl = pointer.ReadInt(); // the next short is the record length, we only use it for unrecognised record types int recordLength = pointer.ReadShort(); // and create the appropriate RDATA record based on the dnsType switch (_dnsType) { case DnsType.SRV: _record = new SRVRecord(pointer); break; default: { // move the pointer over this unrecognised record pointer.Position += recordLength; break; } } } } // Answers, Name Servers and Additional Records all share the same RR format public class Answer : ResourceRecord { internal Answer(Pointer pointer) : base(pointer) {} } public class NameServer : ResourceRecord { internal NameServer(Pointer pointer) : base(pointer) {} } public class AdditionalRecord : ResourceRecord { internal AdditionalRecord(Pointer pointer) : base(pointer) {} } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/IPConfigurationInformation.cs0000644000175000017500000000402012204443225026263 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.Collections.Generic; using System.Net; using System.Net.NetworkInformation; namespace agsXMPP.Net.Dns { /// /// Summary description for IPConfigurationInformation. /// public class IPConfigurationInformation { public static List DnsServers { get { var dnsServers = new List(); var interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (var eth in interfaces) { if (eth.OperationalStatus == OperationalStatus.Up) { var ethProperties = eth.GetIPProperties(); var dnsHosts = ethProperties.DnsAddresses; dnsServers.AddRange(dnsHosts); } } return dnsServers; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/Pointer.cs0000644000175000017500000001365012204443225022446 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; using System.Text; namespace agsXMPP.Net.Dns { /// /// Logical representation of a pointer, but in fact a byte array reference and a position in it. This /// is used to read logical units (bytes, shorts, integers, domain names etc.) from a byte array, keeping /// the pointer updated and pointing to the next record. This type of Pointer can be considered the logical /// equivalent of an (unsigned char*) in C++ /// internal class Pointer { // a pointer is a reference to the message and an index private byte[] _message; private int _position; // pointers can only be created by passing on an existing message public Pointer(byte[] message, int position) { _message = message; _position = position; } public int Position { get { return _position; } set { _position = value; } } /// /// Shallow copy function /// /// public Pointer Copy() { return new Pointer(_message, _position); } /// /// Adjust the pointers position within the message /// /// new position in the message public void SetPosition(int position) { _position = position; } /// /// Overloads the + operator to allow advancing the pointer by so many bytes /// /// the initial pointer /// the offset to add to the pointer in bytes /// a reference to a new pointer moved forward by offset bytes public static Pointer operator+(Pointer pointer, int offset) { return new Pointer(pointer._message, pointer._position + offset); } /// /// Reads a single byte at the current pointer, does not advance pointer /// /// the byte at the pointer public byte Peek() { return _message[_position]; } /// /// Reads a single byte at the current pointer, advancing pointer /// /// the byte at the pointer public byte ReadByte() { return _message[_position++]; } /// /// Reads two bytes to form a short at the current pointer, advancing pointer /// /// the byte at the pointer public short ReadShort() { return (short)(ReadByte()<<8 | ReadByte()); } /// /// Reads four bytes to form a int at the current pointer, advancing pointer /// /// the byte at the pointer public int ReadInt() { return (ushort)ReadShort()<<16 | (ushort)ReadShort(); } /// /// Reads a single byte as a char at the current pointer, advancing pointer /// /// the byte at the pointer public char ReadChar() { return (char)ReadByte(); } /// /// Reads a domain name from the byte array. The method by which this works is described /// in RFC1035 - 4.1.4. Essentially to minimise the size of the message, if part of a domain /// name already been seen in the message, rather than repeating it, a pointer to the existing /// definition is used. Each word in a domain name is a label, and is preceded by its length /// /// eg. bigdevelopments.co.uk /// /// is [15] (size of bigdevelopments) + "bigdevelopments" /// [2] "co" /// [2] "uk" /// [1] 0 (NULL) /// /// the byte at the pointer public string ReadDomain() { StringBuilder domain = new StringBuilder(); int length = 0; // get the length of the first label while ((length = ReadByte()) != 0) { // top 2 bits set denotes domain name compression and to reference elsewhere if ((length & 0xc0) == 0xc0) { // work out the existing domain name, copy this pointer Pointer newPointer = Copy(); // and move it to where specified here newPointer.SetPosition((length & 0x3f)<<8 | ReadByte()); // repeat call recursively domain.Append(newPointer.ReadDomain()); return domain.ToString(); } // if not using compression, copy a char at a time to the domain name while (length > 0) { domain.Append(ReadChar()); length--; } // if size of next label isn't null (end of domain name) add a period ready for next label if (Peek() != 0) domain.Append('.'); } // and return return domain.ToString(); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/Question.cs0000644000175000017500000001003412204443225022626 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; using System.Text.RegularExpressions; namespace agsXMPP.Net.Dns { /// /// Represents a DNS Question, comprising of a domain to query, the type of query (QTYPE) and the class /// of query (QCLASS). This class is an encapsulation of these three things, and extensive argument checking /// in the constructor as this may well be created outside the assembly (public protection) /// public class Question { // A question is these three things combined private readonly string _domain; private readonly DnsType _dnsType; private readonly DnsClass _dnsClass; // expose them read/only to the world public string Domain { get { return _domain; }} public DnsType Type { get { return _dnsType; }} public DnsClass Class { get { return _dnsClass; }} /// /// Construct the question from parameters, checking for safety /// /// the domain name to query eg. bigdevelopments.co.uk /// the QTYPE of query eg. DnsType.MX /// the CLASS of query, invariably DnsClass.IN public Question(string domain, DnsType dnsType, DnsClass dnsClass) { // check the input parameters if (domain == null) throw new ArgumentNullException("domain"); // do a sanity check on the domain name to make sure its legal if (domain.Length ==0 || domain.Length>255 || !Regex.IsMatch(domain, @"^[a-z|A-Z|0-9|\-|_]{1,63}(\.[a-z|A-Z|0-9|\-|_]{1,63})+$")) { // domain names can't be bigger tan 255 chars, and individal labels can't be bigger than 63 chars throw new ArgumentException("The supplied domain name was not in the correct form", "domain"); } // sanity check the DnsType parameter if (!Enum.IsDefined(typeof(DnsType), dnsType) || dnsType == DnsType.None) { throw new ArgumentOutOfRangeException("dnsType"); } // sanity check the DnsClass parameter if (!Enum.IsDefined(typeof(DnsClass), dnsClass) || dnsClass == DnsClass.None) { throw new ArgumentOutOfRangeException("dnsClass"); } // just remember the values _domain = domain; _dnsType = dnsType; _dnsClass = dnsClass; } /// /// Construct the question reading from a DNS Server response. Consult RFC1035 4.1.2 /// for byte-wise details of this structure in byte array form /// /// a logical pointer to the Question in byte array form internal Question(Pointer pointer) { // extract from the message _domain = pointer.ReadDomain(); _dnsType = (DnsType)pointer.ReadShort(); _dnsClass = (DnsClass)pointer.ReadShort(); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/Response.cs0000644000175000017500000001172412204443225022624 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; using System.Net; namespace agsXMPP.Net.Dns { /// /// A Response is a logical representation of the byte data returned from a DNS query /// public class Response { // these are fields we're interested in from the message private readonly ReturnCode _returnCode; private readonly bool _authoritativeAnswer; private readonly bool _recursionAvailable; private readonly bool _truncated; private readonly Question[] _questions; private readonly Answer[] _answers; private readonly NameServer[] _nameServers; private readonly AdditionalRecord[] _additionalRecords; // these fields are readonly outside the assembly - use r/o properties public ReturnCode ReturnCode { get { return _returnCode; }} public bool AuthoritativeAnswer { get { return _authoritativeAnswer; }} public bool RecursionAvailable { get { return _recursionAvailable; }} public bool MessageTruncated { get { return _truncated; }} public Question[] Questions { get { return _questions; }} public Answer[] Answers { get { return _answers; }} public NameServer[] NameServers { get { return _nameServers; }} public AdditionalRecord[] AdditionalRecords { get { return _additionalRecords; }} /// /// Construct a Response object from the supplied byte array /// /// a byte array returned from a DNS server query internal Response(byte[] message) { // the bit flags are in bytes 2 and 3 byte flags1 = message[2]; byte flags2 = message[3]; // get return code from lowest 4 bits of byte 3 int returnCode = flags2 & 15; // if its in the reserved section, set to other if (returnCode > 6) returnCode = 6; _returnCode = (ReturnCode)returnCode; // other bit flags _authoritativeAnswer = ((flags1 & 4) != 0); _recursionAvailable = ((flags2 & 128) != 0); _truncated = ((flags1 & 2) != 0); // create the arrays of response objects _questions = new Question[GetShort(message, 4)]; _answers = new Answer[GetShort(message, 6)]; _nameServers = new NameServer[GetShort(message, 8)]; _additionalRecords = new AdditionalRecord[GetShort(message, 10)]; // need a pointer to do this, position just after the header Pointer pointer = new Pointer(message, 12); // and now populate them, they always follow this order for (int index = 0; index < _questions.Length; index++) { try { // try to build a quesion from the response _questions[index] = new Question(pointer); } catch (Exception ex) { // something grim has happened, we can't continue throw new InvalidResponseException(ex); } } for (int index = 0; index < _answers.Length; index++) { _answers[index] = new Answer(pointer); } for (int index = 0; index < _nameServers.Length; index++) { _nameServers[index] = new NameServer(pointer); } for (int index = 0; index < _additionalRecords.Length; index++) { _additionalRecords[index] = new AdditionalRecord(pointer); } } /// /// Convert 2 bytes to a short. It would have been nice to use BitConverter for this, /// it however reads the bytes in the wrong order (at least on Windows) /// /// byte array to look in /// position to look at /// short representation of the two bytes private static short GetShort(byte[] message, int position) { return (short)(message[position]<<8 | message[position+1]); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/Resolver.cs0000644000175000017500000001637112204443225022632 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; using System.Collections; using System.Net; using System.Net.Sockets; namespace agsXMPP.Net.Dns { /// /// Summary description for Dns. /// public sealed class Resolver { const int _dnsPort = 53; const int _udpRetryAttempts = 2; static int _uniqueId; const int _udpTimeout = 1000; /// /// Private constructor - this static class should never be instantiated /// private Resolver() { // no implementation } /// /// Shorthand form to make SRV querying easier, essentially wraps up the retreival /// of the SRV records, and sorts them by preference /// /// domain name to retreive SRV RRs for /// the server we're going to ask /// An array of SRVRecords public static SRVRecord[] SRVLookup(string domain, IPAddress dnsServer) { // check the inputs if (domain == null) throw new ArgumentNullException("domain"); if (dnsServer == null) throw new ArgumentNullException("dnsServer"); // create a request for this Request request = new Request(); // add one question - the SRV IN lookup for the supplied domain request.AddQuestion(new Question(domain, DnsType.SRV, DnsClass.IN)); // fire it off Response response = Lookup(request, dnsServer); // if we didn't get a response, then return null if (response == null) return null; // create a growable array of SRV records ArrayList resourceRecords = new ArrayList(); // add each of the answers to the array foreach (Answer answer in response.Answers) { // if the answer is an SRV record if (answer.Type == DnsType.SRV) { // add it to our array resourceRecords.Add(answer.Record); } } // create array of MX records SRVRecord[] srvRecords = new SRVRecord[resourceRecords.Count]; // copy from the array list resourceRecords.CopyTo(srvRecords); // sort into lowest preference order Array.Sort(srvRecords); // and return return srvRecords; } /// /// The principal look up function, which sends a request message to the given /// DNS server and collects a response. This implementation re-sends the message /// via UDP up to two times in the event of no response/packet loss /// /// The logical request to send to the server /// The IP address of the DNS server we are querying /// The logical response from the DNS server or null if no response public static Response Lookup(Request request, IPAddress dnsServer) { // check the inputs if (request == null) throw new ArgumentNullException("request"); if (dnsServer == null) throw new ArgumentNullException("dnsServer"); // We will not catch exceptions here, rather just refer them to the caller // create an end point to communicate with IPEndPoint server = new IPEndPoint(dnsServer, _dnsPort); // get the message byte[] requestMessage = request.GetMessage(); // send the request and get the response byte[] responseMessage = UdpTransfer(server, requestMessage); // and populate a response object from that and return it return new Response(responseMessage); } private static byte[] UdpTransfer(IPEndPoint server, byte[] requestMessage) { // UDP can fail - if it does try again keeping track of how many attempts we've made int attempts = 0; // try repeatedly in case of failure while (attempts <= _udpRetryAttempts) { // firstly, uniquely mark this request with an id unchecked { // substitute in an id unique to this lookup, the request has no idea about this requestMessage[0] = (byte)(_uniqueId >> 8); requestMessage[1] = (byte)_uniqueId; } // we'll be send and receiving a UDP packet Socket socket; if (Socket.OSSupportsIPv6 && (server.AddressFamily == AddressFamily.InterNetworkV6)) socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp); // V6 else socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); // we will wait at most 1 second for a dns reply socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, _udpTimeout); // send it off to the server socket.SendTo(requestMessage, requestMessage.Length, SocketFlags.None, server); // RFC1035 states that the maximum size of a UDP datagram is 512 octets (bytes) byte[] responseMessage = new byte[512]; try { // wait for a response upto 1 second socket.Receive(responseMessage); // make sure the message returned is ours if (responseMessage[0] == requestMessage[0] && responseMessage[1] == requestMessage[1]) { // its a valid response - return it, this is our successful exit point return responseMessage; } } catch (SocketException) { // failure - we better try again, but remember how many attempts attempts++; } finally { // increase the unique id _uniqueId++; // close the socket socket.Close(); } } // the operation has failed, this is our unsuccessful exit point throw new NoResponseException(); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/Dns/NoResponseException.cs0000644000175000017500000000350612204443225024777 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // // Bdev.Net.Dns by Rob Philpott, Big Developments Ltd. Please send all bugs/enhancements to // rob@bigdevelopments.co.uk This file and the code contained within is freeware and may be // distributed and edited without restriction. // using System; namespace agsXMPP.Net.Dns { /// /// Thrown when the server does not respond /// public class NoResponseException : SystemException { public NoResponseException() { // no implementation } public NoResponseException(Exception innerException) : base(null, innerException) { // no implementation } public NoResponseException(string message, Exception innerException) : base (message, innerException) { // no implementation } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/BaseSocket.cs0000644000175000017500000001515112245370027022327 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; #if SSL using System.Net.Security; #endif using System.Security.Cryptography.X509Certificates; namespace agsXMPP.Net { /// /// Base Socket class /// public abstract class BaseSocket { public delegate void OnSocketDataHandler(object sender, byte[] data, int count); //public delegate void OnSocketCompressionDebugHandler(object sender, byte[] CompData, int CompCount, byte[] UncompData, int UncompCount); /* // for compression debug statistics public event OnSocketCompressionDebugHandler OnIncomingCompressionDebug; public event OnSocketCompressionDebugHandler OnOutgoingCompressionDebug; protected void FireOnInComingCompressionDebug(object sender, byte[] CompData, int CompCount, byte[] UncompData, int UncompCount) { if (OnIncomingCompressionDebug != null) OnIncomingCompressionDebug(sender, CompData, CompCount, UncompData, UncompCount); } protected void FireOnOutgoingCompressionDebug(object sender, byte[] CompData, int CompCount, byte[] UncompData, int UncompCount) { if (OnOutgoingCompressionDebug != null) OnOutgoingCompressionDebug(sender, CompData, CompCount, UncompData, UncompCount); } */ #if SSL public event RemoteCertificateValidationCallback OnValidateCertificate; #endif //#if CF_2 // public delegate bool CertificateValidationCallback(X509Certificate cert); // public event CertificateValidationCallback OnValidateCertificate; //#endif #if BCCRYPTO public delegate bool CertificateValidationCallback(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[] certs); public event CertificateValidationCallback OnValidateCertificate; #endif public event OnSocketDataHandler OnReceive; public event OnSocketDataHandler OnSend; public event ObjectHandler OnConnect; public event ObjectHandler OnDisconnect; public event ErrorHandler OnError; private string m_Address = null; private int m_Port = 0; private long m_ConnectTimeout = 10000; // 10 seconds is default internal XmppConnection m_XmppCon = null; public bool IsEncrypted { get; protected set; } public BaseSocket() { } public string Address { get { return m_Address; } set { m_Address = value; } } public int Port { get { return m_Port; } set { m_Port = value; } } protected void FireOnConnect() { if (OnConnect != null) OnConnect(this); } protected void FireOnDisconnect() { if (OnDisconnect != null) OnDisconnect(this); } protected void FireOnReceive(byte[] b, int length) { if (OnReceive != null) OnReceive(this, b, length); } protected void FireOnSend(byte[] b, int length) { if (OnSend != null) OnSend(this, b, length); } protected void FireOnError(Exception ex) { if (OnError != null) OnError(this, ex); } #if SSL // The following method is invoked by the RemoteCertificateValidationDelegate. protected bool FireOnValidateCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (OnValidateCertificate != null) return OnValidateCertificate(sender, certificate, chain, sslPolicyErrors); else return true; //if (sslPolicyErrors == SslPolicyErrors.None) // return true; //Console.WriteLine("Certificate error: {0}", sslPolicyErrors); // Do not allow this client to communicate with unauthenticated servers. //return false; } #endif #if BCCRYPTO protected bool FireOnValidateCertificate(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[] certs) { if (OnValidateCertificate != null) return OnValidateCertificate(certs); else return true; } #endif //#if CF_2 // protected bool FireOnValidateCertificate(X509Certificate cert) // { // if (OnValidateCertificate != null) // return OnValidateCertificate(cert); // else // return true; // } //#endif public virtual bool Connected { get { return false; } } public virtual bool SupportsStartTls { get { return false; } } public virtual long ConnectTimeout { get { return m_ConnectTimeout; } set { m_ConnectTimeout = value; } } #region << Methods >> public virtual void Connect() { } public virtual void Disconnect() { } public virtual bool StartTls() { return true; } public virtual void StartCompression() { } /// /// Added for Bosh because we have to tell the BoshClientSocket when to reset the stream /// public virtual void Reset() { } /// /// /// /// public virtual void Send(string data) { } /// /// Send data to the server. /// public virtual void Send(byte[] bData) { } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/SslStream.cs0000644000175000017500000001512012204443225022211 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2008 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #if BCCRYPTO using System; using System.IO; using System.Threading; namespace agsXMPP.net { /// /// /// public class SslStream : Stream { Stream inStream; Stream outStream; public SslStream(Stream inputStream, Stream outputStream) { inStream = inputStream; outStream = outputStream; } public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { //return inStream.BeginRead(buffer, offset, count, callback, state); //if (!this.CanRead) //{ // // __Error.ReadNotSupported(); //} SynchronousAsyncResult ar = new SynchronousAsyncResult(state, false); try { //int num = Read(buffer, offset, count); int num = inStream.Read(buffer, offset, count); ar.m_NumRead = num; ar.m_IsCompleted = true; //ar._waitHandle.Set(); } catch (IOException exception) { //ar._exception = exception; } if (callback != null) { callback(ar); } return ar; } public override int EndRead(IAsyncResult asyncResult) { //return inStream.EndRead(asyncResult); if (asyncResult == null) { throw new ArgumentNullException("asyncResult"); } SynchronousAsyncResult result = asyncResult as SynchronousAsyncResult; if ((result == null) || result.IsWrite) { //__Error.WrongAsyncResult(); } //if (result._EndXxxCalled) //{ // //__Error.EndReadCalledTwice(); //} //result._EndXxxCalled = true; //if (result._exception != null) //{ // throw result._exception; //} return result.m_NumRead; } public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { SynchronousAsyncResult ar = new SynchronousAsyncResult(state, true); try { //Write(buffer, offset, count); outStream.Write(buffer, offset, count); ar.m_IsCompleted = true; //ar._waitHandle.Set(); } catch (IOException exception) { //ar._exception = exception; } if (callback != null) { callback(ar); //callback.BeginInvoke(ar, null, null); } return ar; } public override void EndWrite(IAsyncResult asyncResult) { //outStream.EndWrite(asyncResult); if (asyncResult == null) { throw new ArgumentNullException("asyncResult"); } SynchronousAsyncResult result = asyncResult as SynchronousAsyncResult; if ((result == null) || !result.IsWrite) { //__Error.WrongAsyncResult(); } //if (result._EndXxxCalled) //{ // //__Error.EndWriteCalledTwice(); //} //result._EndXxxCalled = true; //if (result._exception != null) //{ // throw result._exception; //} } public override bool CanSeek { get { throw new Exception("The method or operation is not implemented."); } } public override bool CanRead { get { return inStream.CanRead; } } public override bool CanWrite { get { return outStream.CanWrite; } } public override int Read(byte[] buffer, int offset, int count) { return inStream.Read(buffer, offset, count); } public override int ReadByte() { return inStream.ReadByte(); } public override void Write(byte[] buffer, int offset, int count) { outStream.Write(buffer, offset, count); } public override void WriteByte(byte value) { outStream.WriteByte(value); } public override long Length { get { throw new Exception("The method or operation is not implemented."); } } public override void Flush() { throw new Exception("The method or operation is not implemented."); } public override long Position { get { throw new Exception("The method or operation is not implemented."); } set { throw new Exception("The method or operation is not implemented."); } } public override long Seek(long offset, SeekOrigin origin) { throw new Exception("The method or operation is not implemented."); } public override void SetLength(long value) { throw new Exception("The method or operation is not implemented."); } } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/Net/SynchronousAsyncResult.cs0000644000175000017500000000504712204443225025032 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2008 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Threading; namespace agsXMPP.net { internal class SynchronousAsyncResult : IAsyncResult { /* object AsyncState { get; } WaitHandle AsyncWaitHandle { get; } bool CompletedSynchronously { get; } bool IsCompleted { get; } */ // Fields //internal Exception _exception; internal bool m_IsCompleted; internal bool m_IsWrite; internal int m_NumRead; internal object m_StateObject; internal ManualResetEvent m_WaitHandle; // Methods internal SynchronousAsyncResult(object asyncStateObject, bool isWrite) { m_StateObject = asyncStateObject; m_IsWrite = isWrite; m_WaitHandle = new ManualResetEvent(false); } // Properties public object AsyncState { get { return m_StateObject; } } public WaitHandle AsyncWaitHandle { get { return this.m_WaitHandle; } } public bool CompletedSynchronously { get { return true; } } public bool IsCompleted { get { return this.m_IsCompleted; } } internal bool IsWrite { get { return m_IsWrite; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Net/ClientSocket.cs0000644000175000017500000004645512245370027022706 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; using System.Text; using System.Configuration; using System.Collections; using System.Diagnostics; using Starksoft.Net.Proxy; #if SSL using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; #endif #if BCCRYPTO using Org.BouncyCastle.Crypto.Tls; #endif using agsXMPP.IO.Compression; using agsXMPP; namespace agsXMPP.Net { public class ConnectTimeoutException : Exception { public ConnectTimeoutException(string message) : base(message) { } } /// /// Use async sockets to connect, send and receive data over TCP sockets. /// public class ClientSocket : BaseSocket { TcpClient _socket; #if SSL SslStream m_SSLStream; #endif NetworkStream m_Stream; Stream m_NetworkStream = null; const int BUFFERSIZE = 1024; private byte[] m_ReadBuffer = null; private bool m_SSL = false; private bool m_PendingSend = false; private Queue m_SendQueue = new Queue(); /// /// is compression used for this connection /// private bool m_Compressed = false; /// /// is used to compress data /// private Deflater deflater = null; /// /// is used to decompress data /// private Inflater inflater = null; public IProxyClient Proxy { get; set; } #region << Constructor >> public ClientSocket() { } #endregion #region << Properties >> public bool SSL { get { return m_SSL; } #if SSL set { m_SSL = value; } #endif } public override bool SupportsStartTls { #if SSL get { return true; } #else get { return false; } #endif } /// /// Returns true if the socket is connected to the server. The property /// Socket.Connected does not always indicate if the socket is currently /// connected, this polls the socket to determine the latest connection state. /// public override bool Connected { get { // return right away if have not created socket if (_socket == null) return false; return _socket.Connected; // commented this out because it caused problems on some machines. // return the connected property of the socket now //the socket is not connected if the Connected property is false //if (!_socket.Connected) // return false; //// there is no guarantee that the socket is connected even if the //// Connected property is true //try //{ // // poll for error to see if socket is connected // return !_socket.Poll(1, SelectMode.SelectError); //} //catch //{ // return false; //} } } public bool Compressed { get { return m_Compressed; } set { m_Compressed = value; } } #endregion /// /// Connect to the specified address and port number. /// public void Connect(string address, int port) { Address = address; Port = port; Connect(); } public override void Connect() { base.Connect(); // Socket is never compressed at startup m_Compressed = false; IsEncrypted = false; m_ReadBuffer = null; m_ReadBuffer = new byte[BUFFERSIZE]; try { _socket = new TcpClient(); _socket.NoDelay = true; _socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1); // set timeout, after this the connection will be aborted _socket.ReceiveTimeout = 600 * 1000; _socket.SendTimeout = 600 * 1000; if (Proxy != null) { _socket.Connect(Proxy.ProxyHost, Proxy.ProxyPort); Proxy.TcpClient = _socket; Proxy.CreateConnection(Address, Port); } else { _socket.Connect(Address, Port); } m_Stream = _socket.GetStream(); m_NetworkStream = m_Stream; #if SSL if (m_SSL) InitSSL(); #endif FireOnConnect(); // Setup Receive Callback this.Receive(); } catch (Exception ex) { base.FireOnError(ex); } } #if SSL /// /// Starts TLS on a "normal" connection /// public override bool StartTls() { base.StartTls(); SslProtocols protocol = SslProtocols.Tls; return InitSSL(protocol); } private bool InitSSL() { return InitSSL(SslProtocols.Default); } /// /// /// /// private bool InitSSL(SslProtocols protocol) { m_SSLStream = new SslStream( m_Stream, false, new RemoteCertificateValidationCallback(ValidateCertificate), null ); try { m_SSLStream.AuthenticateAsClient(base.Address, null, protocol, true); // Display the properties and settings for the authenticated stream. //DisplaySecurityLevel(m_SSLStream); //DisplaySecurityServices(m_SSLStream); //DisplayCertificateInformation(m_SSLStream); //DisplayStreamProperties(m_SSLStream); } catch (AuthenticationException e) { if (e.InnerException != null) { //Console.WriteLine("Inner exception: {0}", e.InnerException.Message); } //Console.WriteLine ("Authentication failed - closing the connection."); //client.Close(); Disconnect(); return false; } m_NetworkStream = m_SSLStream; m_SSL = true; IsEncrypted = true; return true; } #region << SSL Properties Display stuff >> private void DisplaySecurityLevel(SslStream stream) { Console.WriteLine("Cipher: {0} strength {1}", stream.CipherAlgorithm, stream.CipherStrength); Console.WriteLine("Hash: {0} strength {1}", stream.HashAlgorithm, stream.HashStrength); Console.WriteLine("Key exchange: {0} strength {1}", stream.KeyExchangeAlgorithm, stream.KeyExchangeStrength); Console.WriteLine("Protocol: {0}", stream.SslProtocol); } private void DisplaySecurityServices(SslStream stream) { Console.WriteLine("Is authenticated: {0} as server? {1}", stream.IsAuthenticated, stream.IsServer); Console.WriteLine("IsSigned: {0}", stream.IsSigned); Console.WriteLine("Is Encrypted: {0}", stream.IsEncrypted); } private void DisplayStreamProperties(SslStream stream) { Console.WriteLine("Can read: {0}, write {1}", stream.CanRead, stream.CanWrite); Console.WriteLine("Can timeout: {0}", stream.CanTimeout); } private void DisplayCertificateInformation(SslStream stream) { //Console.WriteLine("Certificate revocation list checked: {0}", stream.CheckCertRevocationStatus); // Display the properties of the client's certificate. X509Certificate remoteCertificate = stream.RemoteCertificate; if (stream.RemoteCertificate != null) { Console.WriteLine("Remote cert was issued to {0} and is valid from {1} until {2}.", remoteCertificate.Subject, remoteCertificate.GetEffectiveDateString(), remoteCertificate.GetExpirationDateString()); } else { Console.WriteLine("Remote certificate is null."); } } #endregion /// /// Validate the SSL certificate here /// for now we dont stop the SSL connection an return always true /// /// /// /// //private bool ValidateCertificate (X509Certificate certificate, int[] certificateErrors) private bool ValidateCertificate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return base.FireOnValidateCertificate(sender, certificate, chain, sslPolicyErrors); } #endif #if BCCRYPTO /// /// Starts TLS on a "normal" connection /// public override void StartTls() { base.StartTls(); //TlsProtocolHandler protocolHandler = new TlsProtocolHandler(m_NetworkStream, m_NetworkStream); //Stream st = new NetworkStream(_socket, false); TlsProtocolHandler protocolHandler = new TlsProtocolHandler(m_Stream, m_Stream); //TlsProtocolHandler protocolHandler = new TlsProtocolHandler(st, st); CertificateVerifier certVerify = new CertificateVerifier(); certVerify.OnVerifyCertificate += new CertificateValidationCallback(certVerify_OnVerifyCertificate); protocolHandler.Connect(certVerify); m_NetworkStream = new SslStream(protocolHandler.InputStream, protocolHandler.OutputStream); m_SSL = true; } internal bool certVerify_OnVerifyCertificate(Org.BouncyCastle.Asn1.X509.X509CertificateStructure[] certs) { return base.FireOnValidateCertificate(certs); } #endif /// /// Start Compression on the socket /// public override void StartCompression() { InitCompression(); } /// /// Initialize compression stuff (Inflater, Deflater) /// private void InitCompression() { base.StartCompression(); inflater = new Inflater(); deflater = new Deflater(); // Set the compressed flag to true when we init compression m_Compressed = true; } /// /// Disconnect from the server. /// public override void Disconnect() { base.Disconnect(); lock (this) { // TODO maybe we should notify the user which packets were not sent. m_PendingSend = false; m_SendQueue.Clear(); } // return right away if have not created socket if (_socket == null) return; try { // close the socket which terminates any pending // async operations _socket.Close(); } catch { } FireOnDisconnect(); } /// /// /// /// public override void Send(string data) { Send(Encoding.UTF8.GetBytes(data)); } /// /// Send data to the server. /// public override void Send(byte[] bData) { lock (this) { try { base.FireOnSend(bData, bData.Length); //Console.WriteLine("Socket OnSend: " + System.Text.Encoding.UTF8.GetString(bData, 0, bData.Length)); // compress bytes if we are on a compressed socket if (m_Compressed) { byte[] tmpData = new byte[bData.Length]; bData.CopyTo(tmpData, 0); bData = Compress(bData); // for compression debug statistics // base.FireOnOutgoingCompressionDebug(this, bData, bData.Length, tmpData, tmpData.Length); } // .NET 2.0 SSL Stream issues when sending multiple async packets // http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=124213&SiteID=1 if (m_PendingSend) { m_SendQueue.Enqueue(bData); } else { m_PendingSend = true; try { m_NetworkStream.BeginWrite(bData, 0, bData.Length, new AsyncCallback(EndSend), null); } catch (Exception) { Disconnect(); } } } catch (Exception) { } } } /// /// Read data from server. /// private void Receive() { m_NetworkStream.BeginRead(m_ReadBuffer, 0, BUFFERSIZE, new AsyncCallback(EndReceive), null); } private void EndReceive(IAsyncResult ar) { try { int nBytes; nBytes = m_NetworkStream.EndRead(ar); if (nBytes > 0) { // uncompress Data if we are on a compressed socket if (m_Compressed) { byte[] buf = Decompress(m_ReadBuffer, nBytes); base.FireOnReceive(buf, buf.Length); // for compression debug statistics //base.FireOnInComingCompressionDebug(this, m_ReadBuffer, nBytes, buf, buf.Length); } else { //Console.WriteLine("Socket OnReceive: " + System.Text.Encoding.UTF8.GetString(m_ReadBuffer, 0, nBytes)); // Raise the receive event base.FireOnReceive(m_ReadBuffer, nBytes); } // Setup next Receive Callback if (this.Connected) this.Receive(); } else { Disconnect(); } } catch (ObjectDisposedException) { //object already disposed, just exit return; } catch (System.IO.IOException ex) { //Console.WriteLine("\nSocket Exception: " + ex.Message); Disconnect(); } } private void EndSend(IAsyncResult ar) { lock (this) { try { m_NetworkStream.EndWrite(ar); if (m_SendQueue.Count > 0) { byte[] bData = (byte[])m_SendQueue.Dequeue(); m_NetworkStream.BeginWrite(bData, 0, bData.Length, new AsyncCallback(EndSend), null); } else { m_PendingSend = false; } } catch (Exception) { Disconnect(); } } } #region << compression functions >> /// /// Compress bytes /// /// /// private byte[] Compress(byte[] bIn) { int ret; // The Flush SHOULD be after each STANZA // The libds sends always one complete XML Element/stanza, // it doesn't cache stanza and send them in groups, and also doesnt send partial // stanzas. So everything should be ok here. deflater.SetInput(bIn); deflater.Flush(); MemoryStream ms = new MemoryStream(); do { byte[] buf = new byte[BUFFERSIZE]; ret = deflater.Deflate(buf); if (ret > 0) ms.Write(buf, 0, ret); } while (ret > 0); return ms.ToArray(); } /// /// Decompress bytes /// /// /// /// private byte[] Decompress(byte[] bIn, int length) { int ret; inflater.SetInput(bIn, 0, length); MemoryStream ms = new MemoryStream(); do { byte[] buf = new byte[BUFFERSIZE]; ret = inflater.Inflate(buf); if (ret > 0) ms.Write(buf, 0, ret); } while (ret > 0); return ms.ToArray(); } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/Net/PollingSocketException.cs0000644000175000017500000000250212204443225024730 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Net { /// /// Summary description for PollingSocketException. /// public class PollSocketException : Exception { public PollSocketException(string msg) : base(msg) { } } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/0000755000175000017500000000000014011526500022336 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/EventArgs/0000755000175000017500000000000012204443226024241 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/EventArgs/CreateConnectionAsyncCompletedEventArgs.cs0000644000175000017500000000446712204443226034500 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Net.Sockets; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Event arguments class for the EncryptAsyncCompleted event. /// public class CreateConnectionAsyncCompletedEventArgs : AsyncCompletedEventArgs { private TcpClient _proxyConnection; /// /// Constructor. /// /// Exception information generated by the event. /// Cancelled event flag. This flag is set to true if the event was cancelled. /// Proxy Connection. The initialized and open TcpClient proxy connection. public CreateConnectionAsyncCompletedEventArgs(Exception error, bool cancelled, TcpClient proxyConnection) : base(error, cancelled, null) { _proxyConnection = proxyConnection; } /// /// The proxy connection. /// public TcpClient ProxyConnection { get { return _proxyConnection; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/Exceptions/0000755000175000017500000000000012204443226024464 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/Exceptions/ProxyException.cs0000644000175000017500000000475012204443226030021 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Runtime.Serialization; namespace Starksoft.Net.Proxy { /// /// This exception is thrown when a general, unexpected proxy error. /// [Serializable()] public class ProxyException : Exception { /// /// Constructor. /// public ProxyException() { } /// /// Constructor. /// /// Exception message text. public ProxyException(string message) : base(message) { } /// /// Constructor. /// /// Exception message text. /// The inner exception object. public ProxyException(string message, Exception innerException) : base(message, innerException) { } /// /// Constructor. /// /// Serialization information. /// Stream context information. protected ProxyException(SerializationInfo info, StreamingContext context) : base(info, context) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/Socks4aProxyClient.cs0000644000175000017500000002571212204443226026411 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace Starksoft.Net.Proxy { /// /// Socks4a connection proxy class. This class implements the Socks4a standard proxy protocol /// which is an extension of the Socks4 protocol /// /// /// In Socks version 4A if the client cannot resolve the destination host's domain name /// to find its IP address the server will attempt to resolve it. /// public class Socks4aProxyClient : Socks4ProxyClient { private const string PROXY_NAME = "SOCKS4a"; /// /// Default constructor. /// public Socks4aProxyClient() : base() { } /// /// Creates a Socks4 proxy client object using the supplied TcpClient object connection. /// /// An open TcpClient object with an established connection. public Socks4aProxyClient(TcpClient tcpClient) : base(tcpClient) { } /// /// Create a Socks4a proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy user identification information for an IDENTD server. public Socks4aProxyClient(string proxyHost, string proxyUserId) : base(proxyHost, proxyUserId) { } /// /// Create a Socks4a proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy user identification information. public Socks4aProxyClient(string proxyHost, int proxyPort, string proxyUserId) : base(proxyHost, proxyPort, proxyUserId) { } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks4aProxyClient(string proxyHost) : base(proxyHost) { } /// /// Create a Socks4a proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks4aProxyClient(string proxyHost, int proxyPort) : base(proxyHost, proxyPort) { } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS4a' public override string ProxyName { get { return PROXY_NAME; } } /// /// Sends a command to the proxy server. /// /// Proxy server data stream. /// Proxy byte command to execute. /// Destination host name or IP address. /// Destination port number /// IDENTD user ID value. /// /// This method override the SendCommand message in the Sock4ProxyClient object. The override adds support for the /// Socks4a extensions which allow the proxy client to optionally command the proxy server to resolve the /// destination host IP address. /// internal override void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId) { // PROXY SERVER REQUEST //Please read SOCKS4.protocol first for an description of the version 4 //protocol. This extension is intended to allow the use of SOCKS on hosts //which are not capable of resolving all domain names. // //In version 4, the client sends the following packet to the SOCKS server //to request a CONNECT or a BIND operation: // // +----+----+----+----+----+----+----+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+ // # of bytes: 1 1 2 4 variable 1 // //VN is the SOCKS protocol version number and should be 4. CD is the //SOCKS command code and should be 1 for CONNECT or 2 for BIND. NULL //is a byte of all zero bits. // //For version 4A, if the client cannot resolve the destination host's //domain name to find its IP address, it should set the first three bytes //of DSTIP to NULL and the last byte to a non-zero value. (This corresponds //to IP address 0.0.0.x, with x nonzero. As decreed by IANA -- The //Internet Assigned Numbers Authority -- such an address is inadmissible //as a destination IP address and thus should never occur if the client //can resolve the domain name.) Following the NULL byte terminating //USERID, the client must sends the destination domain name and termiantes //it with another NULL byte. This is used for both CONNECT and BIND requests. // //A server using protocol 4A must check the DSTIP in the request packet. //If it represent address 0.0.0.x with nonzero x, the server must read //in the domain name that the client sends in the packet. The server //should resolve the domain name and make connection to the destination //host if it can. // //SOCKSified sockd may pass domain names that it cannot resolve to //the next-hop SOCKS server. // userId needs to be a zero length string so that the GetBytes method // works properly if (userId == null) userId = ""; byte[] destIp = {0,0,0,1}; // build the invalid ip address as specified in the 4a protocol byte[] destPort = GetDestinationPortBytes(destinationPort); byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId); byte[] hostBytes = ASCIIEncoding.ASCII.GetBytes(destinationHost); byte[] request = new byte[10 + userIdBytes.Length + hostBytes.Length]; // set the bits on the request byte array request[0] = SOCKS4_VERSION_NUMBER; request[1] = command; destPort.CopyTo(request, 2); destIp.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); // copy the userid to the request byte array request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId hostBytes.CopyTo(request, 9 + userIdBytes.Length); // copy the host name to the request byte array request[9 + userIdBytes.Length + hostBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId // send the connect request proxy.Write(request, 0, request.Length); // wait for the proxy server to send a response base.WaitForData(proxy); // PROXY SERVER RESPONSE // The SOCKS server checks to see whether such a request should be granted // based on any combination of source IP address, destination IP address, // destination port number, the userid, and information it may obtain by // consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS // server makes a connection to the specified port of the destination host. // A reply packet is sent to the client when this connection is established, // or when the request is rejected or the operation fails. // // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // # of bytes: 1 1 2 4 // // VN is the version of the reply code and should be 0. CD is the result // code with one of the following values: // // 90: request granted // 91: request rejected or failed // 92: request rejected becuase SOCKS server cannot connect to // identd on the client // 93: request rejected because the client program and identd // report different user-ids // // The remaining fields are ignored. // // The SOCKS server closes its connection immediately after notifying // the client of a failed or rejected request. For a successful request, // the SOCKS server gets ready to relay traffic on both directions. This // enables the client to do I/O on its connection as if it were directly // connected to the application server. // create an 8 byte response array byte[] response = new byte[8]; // read the resonse from the network stream proxy.Read(response, 0, 8); // evaluate the reply code for an error condition if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED) HandleProxyCommandError(response, destinationHost, destinationPort); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/StarkSoftProxy.csproj0000644000175000017500000000405712204443226026555 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {3F8CF2C1-EA37-444F-8693-A3A00B1131D2} Library StarkSoftProxy StarkSoftProxy true full false bin\Debug DEBUG; prompt 4 false none false bin\Release prompt 4 false smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/ProxyClientFactory.cs0000644000175000017500000002113412204443226026503 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace Starksoft.Net.Proxy { /// /// The type of proxy. /// public enum ProxyType { /// /// No Proxy specified. Note this option will cause an exception to be thrown if used to create a proxy object by the factory. /// None, /// /// HTTP Proxy /// Http, /// /// SOCKS v4 Proxy /// Socks4, /// /// SOCKS v4a Proxy /// Socks4a, /// /// SOCKS v5 Proxy /// Socks5 } /// /// Factory class for creating new proxy client objects. /// /// /// /// // create an instance of the client proxy factory /// ProxyClientFactory factory = new ProxyClientFactory(); /// /// // use the proxy client factory to generically specify the type of proxy to create /// // the proxy factory method CreateProxyClient returns an IProxyClient object /// IProxyClient proxy = factory.CreateProxyClient(ProxyType.Http, "localhost", 6588); /// /// // create a connection through the proxy to www.starksoft.com over port 80 /// System.Net.Sockets.TcpClient tcpClient = proxy.CreateConnection("www.starksoft.com", 80); /// /// public class ProxyClientFactory { /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(); case ProxyType.Socks4: return new Socks4ProxyClient(); case ProxyType.Socks4a: return new Socks4aProxyClient(); case ProxyType.Socks5: return new Socks5ProxyClient(); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects using an existing TcpClient connection object. /// /// The type of proxy client to create. /// Open TcpClient object. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, TcpClient tcpClient) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(tcpClient); case ProxyType.Socks4: return new Socks4ProxyClient(tcpClient); case ProxyType.Socks4a: return new Socks4aProxyClient(tcpClient); case ProxyType.Socks5: return new Socks5ProxyClient(tcpClient); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// The proxy host or IP address. /// The proxy port number. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, string proxyHost, int proxyPort) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(proxyHost, proxyPort); case ProxyType.Socks4: return new Socks4ProxyClient(proxyHost, proxyPort); case ProxyType.Socks4a: return new Socks4aProxyClient(proxyHost, proxyPort); case ProxyType.Socks5: return new Socks5ProxyClient(proxyHost, proxyPort); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// The proxy host or IP address. /// The proxy port number. /// The proxy username. This parameter is only used by Socks4 and Socks5 proxy objects. /// The proxy user password. This parameter is only used Socks5 proxy objects. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, string proxyHost, int proxyPort, string proxyUsername, string proxyPassword) { if (type == ProxyType.None) throw new ArgumentOutOfRangeException("type"); switch (type) { case ProxyType.Http: return new HttpProxyClient(proxyHost, proxyPort); case ProxyType.Socks4: return new Socks4ProxyClient(proxyHost, proxyPort, proxyUsername); case ProxyType.Socks4a: return new Socks4aProxyClient(proxyHost, proxyPort, proxyUsername); case ProxyType.Socks5: return new Socks5ProxyClient(proxyHost, proxyPort, proxyUsername, proxyPassword); default: throw new ProxyException(String.Format("Unknown proxy type {0}.", type.ToString())); } } /// /// Factory method for creating new proxy client objects. /// /// The type of proxy client to create. /// Open TcpClient object. /// The proxy host or IP address. /// The proxy port number. /// The proxy username. This parameter is only used by Socks4 and Socks5 proxy objects. /// The proxy user password. This parameter is only used Socks5 proxy objects. /// Proxy client object. public IProxyClient CreateProxyClient(ProxyType type, TcpClient tcpClient, string proxyHost, int proxyPort, string proxyUsername, string proxyPassword) { IProxyClient c = CreateProxyClient(type, proxyHost, proxyPort, proxyUsername, proxyPassword); c.TcpClient = tcpClient; return c; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/HttpProxyClient.cs0000644000175000017500000004343412204443226026022 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net.Sockets; using System.Threading; using System.Globalization; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// HTTP connection proxy class. This class implements the HTTP standard proxy protocol. /// /// You can use this class to set up a connection to an HTTP proxy server. Calling the /// CreateConnection() method initiates the proxy connection and returns a standard /// System.Net.Socks.TcpClient object that can be used as normal. The proxy plumbing /// is all handled for you. /// /// /// /// /// public class HttpProxyClient : IProxyClient { private string _proxyHost; private int _proxyPort; private HttpResponseCodes _respCode; private string _respText; private TcpClient _tcpClient; private const int HTTP_PROXY_DEFAULT_PORT = 8080; private const string HTTP_PROXY_CONNECT_CMD = "CONNECT {0}:{1} HTTP/1.0\r\nHOST {0}:{1}\r\n\r\n"; private const int WAIT_FOR_DATA_INTERVAL = 50; // 50 ms private const int WAIT_FOR_DATA_TIMEOUT = 15000; // 15 seconds private const string PROXY_NAME = "HTTP"; private enum HttpResponseCodes { None = 0, Continue = 100, SwitchingProtocols = 101, OK = 200, Created = 201, Accepted = 202, NonAuthoritiveInformation = 203, NoContent = 204, ResetContent = 205, PartialContent = 206, MultipleChoices = 300, MovedPermanetly = 301, Found = 302, SeeOther = 303, NotModified = 304, UserProxy = 305, TemporaryRedirect = 307, BadRequest = 400, Unauthorized = 401, PaymentRequired = 402, Forbidden = 403, NotFound = 404, MethodNotAllowed = 405, NotAcceptable = 406, ProxyAuthenticantionRequired = 407, RequestTimeout = 408, Conflict = 409, Gone = 410, PreconditionFailed = 411, RequestEntityTooLarge = 413, RequestURITooLong = 414, UnsupportedMediaType = 415, RequestedRangeNotSatisfied = 416, ExpectationFailed = 417, InternalServerError = 500, NotImplemented = 501, BadGateway = 502, ServiceUnavailable = 503, GatewayTimeout = 504, HTTPVersionNotSupported = 505 } /// /// Constructor. /// public HttpProxyClient() { } /// /// Creates a HTTP proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public HttpProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Constructor. The default HTTP proxy port 8080 is used. /// /// Host name or IP address of the proxy. public HttpProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = HTTP_PROXY_DEFAULT_PORT; } /// /// Constructor. /// /// Host name or IP address of the proxy server. /// Port number for the proxy server. public HttpProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port number for the proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'HTTP' public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // send connection command to proxy host for the specified destination host and port SendConnectionCommand(destinationHost, destinationPort); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (SocketException ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } private void SendConnectionCommand(string host, int port) { NetworkStream stream = _tcpClient.GetStream(); // PROXY SERVER REQUEST // ======================================================================= //CONNECT starksoft.com:443 HTTP/1.0 //HOST starksoft.com:443 //[... other HTTP header lines ending with if required]> // // Last Empty Line string connectCmd = String.Format(CultureInfo.InvariantCulture, HTTP_PROXY_CONNECT_CMD, host, port.ToString(CultureInfo.InvariantCulture)); byte[] request = ASCIIEncoding.ASCII.GetBytes(connectCmd); // send the connect request stream.Write(request, 0, request.Length); // wait for the proxy server to respond WaitForData(stream); // PROXY SERVER RESPONSE // ======================================================================= //HTTP/1.0 200 Connection Established //[.... other HTTP header lines ending with .. //ignore all of them] // // Last Empty Line // create an byte response array byte[] response = new byte[_tcpClient.ReceiveBufferSize]; StringBuilder sbuilder = new StringBuilder(); int bytes = 0; long total = 0; do { bytes = stream.Read(response, 0, _tcpClient.ReceiveBufferSize); total += bytes; sbuilder.Append(System.Text.ASCIIEncoding.UTF8.GetString(response, 0, bytes)); } while (stream.DataAvailable); ParseResponse(sbuilder.ToString()); // evaluate the reply code for an error condition if (_respCode != HttpResponseCodes.OK) HandleProxyCommandError(host, port); } private void HandleProxyCommandError(string host, int port) { string msg; switch (_respCode) { case HttpResponseCodes.None: msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} failed to return a recognized HTTP response code. Server response: {2}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), _respText); break; case HttpResponseCodes.BadGateway: //HTTP/1.1 502 Proxy Error (The specified Secure Sockets Layer (SSL) port is not allowed. ISA Server is not configured to allow SSL requests from this port. Most Web browsers use port 443 for SSL requests.) msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} responded with a 502 code - Bad Gateway. If you are connecting to a Microsoft ISA destination please refer to knowledge based article Q283284 for more information. Server response: {2}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), _respText); break; default: msg = String.Format(CultureInfo.InvariantCulture, "Proxy destination {0} on port {1} responded with a {2} code - {3}", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient), ((int)_respCode).ToString(CultureInfo.InvariantCulture), _respText); break; } // throw a new application exception throw new ProxyException(msg); } private void WaitForData(NetworkStream stream) { int sleepTime = 0; while (!stream.DataAvailable) { Thread.Sleep(WAIT_FOR_DATA_INTERVAL); sleepTime += WAIT_FOR_DATA_INTERVAL; if (sleepTime > WAIT_FOR_DATA_TIMEOUT) throw new ProxyException(String.Format("A timeout while waiting for the proxy server at {0} on port {1} to respond.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient) )); } } private void ParseResponse(string response) { string[] data = null; // get rid of the LF character if it exists and then split the string on all CR data = response.Replace('\n', ' ').Split('\r'); ParseCodeAndText(data[0]); } private void ParseCodeAndText(string line) { int begin = 0; int end = 0; string val = null; if (line.IndexOf("HTTP") == -1) throw new ProxyException(String.Format("No HTTP response received from proxy destination. Server response: {0}.", line)); begin = line.IndexOf(" ") + 1; end = line.IndexOf(" ", begin); val = line.Substring(begin, end - begin); Int32 code = 0; if (!Int32.TryParse(val, out code)) throw new ProxyException(String.Format("An invalid response code was received from proxy destination. Server response: {0}.", line)); _respCode = (HttpResponseCodes)code; _respText = line.Substring(end + 1).Trim(); } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The HttpProxy object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/Utils.cs0000644000175000017500000000174512204443226024001 0ustar00meebeymeebey00000000000000using System; using System.Text; using System.Globalization; using System.Net.Sockets; namespace Starksoft.Net.Proxy { internal static class Utils { internal static string GetHost(TcpClient client) { if (client == null) throw new ArgumentNullException("client"); string host = ""; try { host = ((System.Net.IPEndPoint)client.Client.RemoteEndPoint).Address.ToString(); } catch { }; return host; } internal static string GetPort(TcpClient client) { if (client == null) throw new ArgumentNullException("client"); string port = ""; try { port = ((System.Net.IPEndPoint)client.Client.RemoteEndPoint).Port.ToString(CultureInfo.InvariantCulture); } catch { }; return port; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/Socks4ProxyClient.cs0000644000175000017500000006030612204443226026246 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Globalization; using System.IO; using System.Threading; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Socks4 connection proxy class. This class implements the Socks4 standard proxy protocol. /// /// /// This class implements the Socks4 proxy protocol standard for TCP communciations. /// public class Socks4ProxyClient : IProxyClient { private const int WAIT_FOR_DATA_INTERVAL = 50; // 50 ms private const int WAIT_FOR_DATA_TIMEOUT = 15000; // 15 seconds private const string PROXY_NAME = "SOCKS4"; private TcpClient _tcpClient; private string _proxyHost; private int _proxyPort; private string _proxyUserId; /// /// Default Socks4 proxy port. /// internal const int SOCKS_PROXY_DEFAULT_PORT = 1080; /// /// Socks4 version number. /// internal const byte SOCKS4_VERSION_NUMBER = 4; /// /// Socks4 connection command value. /// internal const byte SOCKS4_CMD_CONNECT = 0x01; /// /// Socks4 bind command value. /// internal const byte SOCKS4_CMD_BIND = 0x02; /// /// Socks4 reply request grant response value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_GRANTED = 90; /// /// Socks4 reply request rejected or failed response value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_OR_FAILED = 91; /// /// Socks4 reply request rejected becauase the proxy server can not connect to the IDENTD server value. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_CANNOT_CONNECT_TO_IDENTD = 92; /// /// Socks4 reply request rejected because of a different IDENTD server. /// internal const byte SOCKS4_CMD_REPLY_REQUEST_REJECTED_DIFFERENT_IDENTD = 93; /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// public Socks4ProxyClient() { } /// /// Creates a Socks4 proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public Socks4ProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy user identification information. public Socks4ProxyClient(string proxyHost, string proxyUserId) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyUserId == null) throw new ArgumentNullException("proxyUserId"); _proxyHost = proxyHost; _proxyPort = SOCKS_PROXY_DEFAULT_PORT; _proxyUserId = proxyUserId; } /// /// Create a Socks4 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy user identification information. public Socks4ProxyClient(string proxyHost, int proxyPort, string proxyUserId) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); if (proxyUserId == null) throw new ArgumentNullException("proxyUserId"); _proxyHost = proxyHost; _proxyPort = proxyPort; _proxyUserId = proxyUserId; } /// /// Create a Socks4 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks4ProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = SOCKS_PROXY_DEFAULT_PORT; } /// /// Create a Socks4 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks4ProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port used to connect to proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS4' virtual public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets proxy user identification information. /// public string ProxyUserId { get { return _proxyUserId; } set { _proxyUserId = value; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a TCP connection to the destination host through the proxy server /// host. /// /// Destination host name or IP address of the destination server. /// Port number to connect to on the destination server. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { if (String.IsNullOrEmpty(destinationHost)) throw new ArgumentNullException("destinationHost"); if (destinationPort <= 0 || destinationPort > 65535) throw new ArgumentOutOfRangeException("destinationPort", "port must be greater than zero and less than 65535"); try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // send connection command to proxy host for the specified destination host and port SendCommand(_tcpClient.GetStream(), SOCKS4_CMD_CONNECT, destinationHost, destinationPort, _proxyUserId); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } /// /// Sends a command to the proxy server. /// /// Proxy server data stream. /// Proxy byte command to execute. /// Destination host name or IP address. /// Destination port number /// IDENTD user ID value. internal virtual void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId) { // PROXY SERVER REQUEST // The client connects to the SOCKS server and sends a CONNECT request when // it wants to establish a connection to an application server. The client // includes in the request packet the IP address and the port number of the // destination host, and userid, in the following format. // // +----+----+----+----+----+----+----+----+----+----+....+----+ // | VN | CD | DSTPORT | DSTIP | USERID |NULL| // +----+----+----+----+----+----+----+----+----+----+....+----+ // # of bytes: 1 1 2 4 variable 1 // // VN is the SOCKS protocol version number and should be 4. CD is the // SOCKS command code and should be 1 for CONNECT request. NULL is a byte // of all zero bits. // userId needs to be a zero length string so that the GetBytes method // works properly if (userId == null) userId = ""; byte[] destIp = GetIPAddressBytes(destinationHost); byte[] destPort = GetDestinationPortBytes(destinationPort); byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId); byte[] request = new byte[9 + userIdBytes.Length]; // set the bits on the request byte array request[0] = SOCKS4_VERSION_NUMBER; request[1] = command; destPort.CopyTo(request, 2); destIp.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId // send the connect request proxy.Write(request, 0, request.Length); // wait for the proxy server to respond WaitForData(proxy); // PROXY SERVER RESPONSE // The SOCKS server checks to see whether such a request should be granted // based on any combination of source IP address, destination IP address, // destination port number, the userid, and information it may obtain by // consulting IDENT, cf. RFC 1413. If the request is granted, the SOCKS // server makes a connection to the specified port of the destination host. // A reply packet is sent to the client when this connection is established, // or when the request is rejected or the operation fails. // // +----+----+----+----+----+----+----+----+ // | VN | CD | DSTPORT | DSTIP | // +----+----+----+----+----+----+----+----+ // # of bytes: 1 1 2 4 // // VN is the version of the reply code and should be 0. CD is the result // code with one of the following values: // // 90: request granted // 91: request rejected or failed // 92: request rejected becuase SOCKS server cannot connect to // identd on the client // 93: request rejected because the client program and identd // report different user-ids // // The remaining fields are ignored. // // The SOCKS server closes its connection immediately after notifying // the client of a failed or rejected request. For a successful request, // the SOCKS server gets ready to relay traffic on both directions. This // enables the client to do I/O on its connection as if it were directly // connected to the application server. // create an 8 byte response array byte[] response = new byte[8]; // read the resonse from the network stream proxy.Read(response, 0, 8); // evaluate the reply code for an error condition if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED) HandleProxyCommandError(response, destinationHost, destinationPort); } /// /// Translate the host name or IP address to a byte array. /// /// Host name or IP address. /// Byte array representing IP address in bytes. internal byte[] GetIPAddressBytes(string destinationHost) { IPAddress ipAddr = null; // if the address doesn't parse then try to resolve with dns if (!IPAddress.TryParse(destinationHost, out ipAddr)) { try { ipAddr = Dns.GetHostEntry(destinationHost).AddressList[0]; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "A error occurred while attempting to DNS resolve the host name {0}.", destinationHost), ex); } } // return address bytes return ipAddr.GetAddressBytes(); } /// /// Translate the destination port value to a byte array. /// /// Destination port. /// Byte array representing an 16 bit port number as two bytes. internal byte[] GetDestinationPortBytes(int value) { byte[] array = new byte[2]; array[0] = Convert.ToByte(value / 256); array[1] = Convert.ToByte(value % 256); return array; } /// /// Receive a byte array from the proxy server and determine and handle and errors that may have occurred. /// /// Proxy server command response as a byte array. /// Destination host. /// Destination port number. internal void HandleProxyCommandError(byte[] response, string destinationHost, int destinationPort) { if (response == null) throw new ArgumentNullException("response"); // extract the reply code byte replyCode = response[1]; // extract the ip v4 address (4 bytes) byte[] ipBytes = new byte[4]; for (int i = 0; i < 4; i++) ipBytes[i] = response[i + 4]; // convert the ip address to an IPAddress object IPAddress ipAddr = new IPAddress(ipBytes); // extract the port number big endian (2 bytes) byte[] portBytes = new byte[2]; portBytes[0] = response[3]; portBytes[1] = response[2]; Int16 port = BitConverter.ToInt16(portBytes, 0); // translate the reply code error number to human readable text string proxyErrorText; switch (replyCode) { case SOCKS4_CMD_REPLY_REQUEST_REJECTED_OR_FAILED: proxyErrorText = "connection request was rejected or failed"; break; case SOCKS4_CMD_REPLY_REQUEST_REJECTED_CANNOT_CONNECT_TO_IDENTD: proxyErrorText = "connection request was rejected because SOCKS destination cannot connect to identd on the client"; break; case SOCKS4_CMD_REPLY_REQUEST_REJECTED_DIFFERENT_IDENTD: proxyErrorText = "connection request rejected because the client program and identd report different user-ids"; break; default: proxyErrorText = String.Format(CultureInfo.InvariantCulture, "proxy client received an unknown reply with the code value '{0}' from the proxy destination", replyCode.ToString(CultureInfo.InvariantCulture)); break; } // build the exeception message string string exceptionMsg = String.Format(CultureInfo.InvariantCulture, "The {0} concerning destination host {1} port number {2}. The destination reported the host as {3} port {4}.", proxyErrorText, destinationHost, destinationPort, ipAddr.ToString(), port.ToString(CultureInfo.InvariantCulture)); // throw a new application exception throw new ProxyException(exceptionMsg); } internal void WaitForData(NetworkStream stream) { int sleepTime = 0; while (!stream.DataAvailable) { Thread.Sleep(WAIT_FOR_DATA_INTERVAL); sleepTime += WAIT_FOR_DATA_INTERVAL; if (sleepTime > WAIT_FOR_DATA_TIMEOUT) throw new ProxyException("A timeout while waiting for the proxy destination to respond."); } } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port /// using the supplied open TcpClient object with an open connection to proxy server. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns TcpClient object that can be used normally to communicate /// with the destination server. /// /// /// This instructs the proxy server to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The Socks4/4a object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/IProxyClient.cs0000644000175000017500000000771512204443226025275 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace Starksoft.Net.Proxy { /// /// Proxy client interface. This is the interface that all proxy clients must implement. /// public interface IProxyClient { /// /// Event handler for CreateConnectionAsync method completed. /// event EventHandler CreateConnectionAsyncCompleted; /// /// Gets or sets proxy host name or IP address. /// string ProxyHost { get; set; } /// /// Gets or sets proxy port number. /// int ProxyPort { get; set; } /// /// Gets String representing the name of the proxy. /// string ProxyName { get; } /// /// Gets or set the TcpClient object if one was specified in the constructor. /// TcpClient TcpClient { get; set; } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// TcpClient CreateConnection(string destinationHost, int destinationPort); /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// void CreateConnectionAsync(string destinationHost, int destinationPort); } } smuxi-1.1/lib/agsxmpp/agsxmpp/starksoftproxy/Socks5ProxyClient.cs0000644000175000017500000007701512204443226026254 0ustar00meebeymeebey00000000000000/* * Authors: Benton Stark * * Copyright (c) 2007-2009 Starksoft, LLC (http://www.starksoft.com) * * 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 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Globalization; using System.ComponentModel; namespace Starksoft.Net.Proxy { /// /// Socks5 connection proxy class. This class implements the Socks5 standard proxy protocol. /// /// /// This implementation supports TCP proxy connections with a Socks v5 server. /// public class Socks5ProxyClient : IProxyClient { private string _proxyHost; private int _proxyPort; private string _proxyUserName; private string _proxyPassword; private SocksAuthentication _proxyAuthMethod; private TcpClient _tcpClient; private const string PROXY_NAME = "SOCKS5"; private const int SOCKS5_DEFAULT_PORT = 1080; private const byte SOCKS5_VERSION_NUMBER = 5; private const byte SOCKS5_RESERVED = 0x00; private const byte SOCKS5_AUTH_NUMBER_OF_AUTH_METHODS_SUPPORTED = 2; private const byte SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED = 0x00; private const byte SOCKS5_AUTH_METHOD_GSSAPI = 0x01; private const byte SOCKS5_AUTH_METHOD_USERNAME_PASSWORD = 0x02; private const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_BEGIN = 0x03; private const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_END = 0x7f; private const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_BEGIN = 0x80; private const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_END = 0xfe; private const byte SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS = 0xff; private const byte SOCKS5_CMD_CONNECT = 0x01; private const byte SOCKS5_CMD_BIND = 0x02; private const byte SOCKS5_CMD_UDP_ASSOCIATE = 0x03; private const byte SOCKS5_CMD_REPLY_SUCCEEDED = 0x00; private const byte SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE = 0x01; private const byte SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET = 0x02; private const byte SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE = 0x03; private const byte SOCKS5_CMD_REPLY_HOST_UNREACHABLE = 0x04; private const byte SOCKS5_CMD_REPLY_CONNECTION_REFUSED = 0x05; private const byte SOCKS5_CMD_REPLY_TTL_EXPIRED = 0x06; private const byte SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED = 0x07; private const byte SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED = 0x08; private const byte SOCKS5_ADDRTYPE_IPV4 = 0x01; private const byte SOCKS5_ADDRTYPE_DOMAIN_NAME = 0x03; private const byte SOCKS5_ADDRTYPE_IPV6 = 0x04; /// /// Authentication itemType. /// private enum SocksAuthentication { /// /// No authentication used. /// None, /// /// Username and password authentication. /// UsernamePassword } /// /// Create a Socks5 proxy client object. /// public Socks5ProxyClient() { } /// /// Creates a Socks5 proxy client object using the supplied TcpClient object connection. /// /// A TcpClient connection object. public Socks5ProxyClient(TcpClient tcpClient) { if (tcpClient == null) throw new ArgumentNullException("tcpClient"); _tcpClient = tcpClient; } /// /// Create a Socks5 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. public Socks5ProxyClient(string proxyHost) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); _proxyHost = proxyHost; _proxyPort = SOCKS5_DEFAULT_PORT; } /// /// Create a Socks5 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. public Socks5ProxyClient(string proxyHost, int proxyPort) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); _proxyHost = proxyHost; _proxyPort = proxyPort; } /// /// Create a Socks5 proxy client object. The default proxy port 1080 is used. /// /// Host name or IP address of the proxy server. /// Proxy authentication user name. /// Proxy authentication password. public Socks5ProxyClient(string proxyHost, string proxyUserName, string proxyPassword) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyUserName == null) throw new ArgumentNullException("proxyUserName"); if (proxyPassword == null) throw new ArgumentNullException("proxyPassword"); _proxyHost = proxyHost; _proxyPort = SOCKS5_DEFAULT_PORT; _proxyUserName = proxyUserName; _proxyPassword = proxyPassword; } /// /// Create a Socks5 proxy client object. /// /// Host name or IP address of the proxy server. /// Port used to connect to proxy server. /// Proxy authentication user name. /// Proxy authentication password. public Socks5ProxyClient(string proxyHost, int proxyPort, string proxyUserName, string proxyPassword) { if (String.IsNullOrEmpty(proxyHost)) throw new ArgumentNullException("proxyHost"); if (proxyPort <= 0 || proxyPort > 65535) throw new ArgumentOutOfRangeException("proxyPort", "port must be greater than zero and less than 65535"); if (proxyUserName == null) throw new ArgumentNullException("proxyUserName"); if (proxyPassword == null) throw new ArgumentNullException("proxyPassword"); _proxyHost = proxyHost; _proxyPort = proxyPort; _proxyUserName = proxyUserName; _proxyPassword = proxyPassword; } /// /// Gets or sets host name or IP address of the proxy server. /// public string ProxyHost { get { return _proxyHost; } set { _proxyHost = value; } } /// /// Gets or sets port used to connect to proxy server. /// public int ProxyPort { get { return _proxyPort; } set { _proxyPort = value; } } /// /// Gets String representing the name of the proxy. /// /// This property will always return the value 'SOCKS5' public string ProxyName { get { return PROXY_NAME; } } /// /// Gets or sets proxy authentication user name. /// public string ProxyUserName { get { return _proxyUserName; } set { _proxyUserName = value; } } /// /// Gets or sets proxy authentication password. /// public string ProxyPassword { get { return _proxyPassword; } set { _proxyPassword = value; } } /// /// Gets or sets the TcpClient object. /// This property can be set prior to executing CreateConnection to use an existing TcpClient connection. /// public TcpClient TcpClient { get { return _tcpClient; } set { _tcpClient = value; } } /// /// Creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address of the destination server. /// Port number to connect to on the destination host. /// /// Returns an open TcpClient object that can be used normally to communicate /// with the destination server /// /// /// This method creates a connection to the proxy server and instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public TcpClient CreateConnection(string destinationHost, int destinationPort) { if (String.IsNullOrEmpty(destinationHost)) throw new ArgumentNullException("destinationHost"); if (destinationPort <= 0 || destinationPort > 65535) throw new ArgumentOutOfRangeException("destinationPort", "port must be greater than zero and less than 65535"); try { // if we have no connection, create one if (_tcpClient == null) { if (String.IsNullOrEmpty(_proxyHost)) throw new ProxyException("ProxyHost property must contain a value."); if (_proxyPort <= 0 || _proxyPort > 65535) throw new ProxyException("ProxyPort value must be greater than zero and less than 65535"); // create new tcp client object to the proxy server _tcpClient = new TcpClient(); // attempt to open the connection _tcpClient.Connect(_proxyHost, _proxyPort); } // determine which authentication method the client would like to use DetermineClientAuthMethod(); // negotiate which authentication methods are supported / accepted by the server NegotiateServerAuthMethod(); // send a connect command to the proxy server for destination host and port SendCommand(SOCKS5_CMD_CONNECT, destinationHost, destinationPort); // return the open proxied tcp client object to the caller for normal use return _tcpClient; } catch (Exception ex) { throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "Connection to proxy host {0} on port {1} failed.", Utils.GetHost(_tcpClient), Utils.GetPort(_tcpClient)), ex); } } private void DetermineClientAuthMethod() { // set the authentication itemType used based on values inputed by the user if (_proxyUserName != null && _proxyPassword != null) _proxyAuthMethod = SocksAuthentication.UsernamePassword; else _proxyAuthMethod = SocksAuthentication.None; } private void NegotiateServerAuthMethod() { // get a reference to the network stream NetworkStream stream = _tcpClient.GetStream(); // SERVER AUTHENTICATION REQUEST // The client connects to the server, and sends a version // identifier/method selection message: // // +----+----------+----------+ // |VER | NMETHODS | METHODS | // +----+----------+----------+ // | 1 | 1 | 1 to 255 | // +----+----------+----------+ byte[] authRequest = new byte[4]; authRequest[0] = SOCKS5_VERSION_NUMBER; authRequest[1] = SOCKS5_AUTH_NUMBER_OF_AUTH_METHODS_SUPPORTED; authRequest[2] = SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED; authRequest[3] = SOCKS5_AUTH_METHOD_USERNAME_PASSWORD; // send the request to the server specifying authentication types supported by the client. stream.Write(authRequest, 0, authRequest.Length); // SERVER AUTHENTICATION RESPONSE // The server selects from one of the methods given in METHODS, and // sends a METHOD selection message: // // +----+--------+ // |VER | METHOD | // +----+--------+ // | 1 | 1 | // +----+--------+ // // If the selected METHOD is X'FF', none of the methods listed by the // client are acceptable, and the client MUST close the connection. // // The values currently defined for METHOD are: // * X'00' NO AUTHENTICATION REQUIRED // * X'01' GSSAPI // * X'02' USERNAME/PASSWORD // * X'03' to X'7F' IANA ASSIGNED // * X'80' to X'FE' RESERVED FOR PRIVATE METHODS // * X'FF' NO ACCEPTABLE METHODS // receive the server response byte[] response = new byte[2]; stream.Read(response, 0, response.Length); // the first byte contains the socks version number (e.g. 5) // the second byte contains the auth method acceptable to the proxy server byte acceptedAuthMethod = response[1]; // if the server does not accept any of our supported authenication methods then throw an error if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS) { _tcpClient.Close(); throw new ProxyException("The proxy destination does not accept the supported proxy client authentication methods."); } // if the server accepts a username and password authentication and none is provided by the user then throw an error if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_USERNAME_PASSWORD && _proxyAuthMethod == SocksAuthentication.None) { _tcpClient.Close(); throw new ProxyException("The proxy destination requires a username and password for authentication."); } if (acceptedAuthMethod == SOCKS5_AUTH_METHOD_USERNAME_PASSWORD) { // USERNAME / PASSWORD SERVER REQUEST // Once the SOCKS V5 server has started, and the client has selected the // Username/Password Authentication protocol, the Username/Password // subnegotiation begins. This begins with the client producing a // Username/Password request: // // +----+------+----------+------+----------+ // |VER | ULEN | UNAME | PLEN | PASSWD | // +----+------+----------+------+----------+ // | 1 | 1 | 1 to 255 | 1 | 1 to 255 | // +----+------+----------+------+----------+ byte[] credentials = new byte[_proxyUserName.Length + _proxyPassword.Length + 3]; credentials[0] = 1; credentials[1] = (byte)_proxyUserName.Length; Array.Copy(ASCIIEncoding.ASCII.GetBytes(_proxyUserName), 0, credentials, 2, _proxyUserName.Length); credentials[_proxyUserName.Length + 2] = (byte)_proxyPassword.Length; Array.Copy(ASCIIEncoding.ASCII.GetBytes(_proxyPassword), 0, credentials, _proxyUserName.Length + 3, _proxyPassword.Length); // USERNAME / PASSWORD SERVER RESPONSE // The server verifies the supplied UNAME and PASSWD, and sends the // following response: // // +----+--------+ // |VER | STATUS | // +----+--------+ // | 1 | 1 | // +----+--------+ // // A STATUS field of X'00' indicates success. If the server returns a // `failure' (STATUS value other than X'00') status, it MUST close the // connection. stream.Write(credentials, 0, credentials.Length); byte[] crResponse = new byte[2]; stream.Read(crResponse, 0, crResponse.Length); if (crResponse[1] != 0) { _tcpClient.Close(); throw new ProxyException("Proxy authentification failure!"); } } } private byte GetDestAddressType(string host) { IPAddress ipAddr = null; bool result = IPAddress.TryParse(host, out ipAddr); if (!result) return SOCKS5_ADDRTYPE_DOMAIN_NAME; switch (ipAddr.AddressFamily) { case AddressFamily.InterNetwork: return SOCKS5_ADDRTYPE_IPV4; case AddressFamily.InterNetworkV6: return SOCKS5_ADDRTYPE_IPV6; default: throw new ProxyException(String.Format(CultureInfo.InvariantCulture, "The host addess {0} of type '{1}' is not a supported address type. The supported types are InterNetwork and InterNetworkV6.", host, Enum.GetName(typeof(AddressFamily), ipAddr.AddressFamily))); } } private byte[] GetDestAddressBytes(byte addressType, string host) { switch (addressType) { case SOCKS5_ADDRTYPE_IPV4: case SOCKS5_ADDRTYPE_IPV6: return IPAddress.Parse(host).GetAddressBytes(); case SOCKS5_ADDRTYPE_DOMAIN_NAME: // create a byte array to hold the host name bytes plus one byte to store the length byte[] bytes = new byte[host.Length + 1]; // if the address field contains a fully-qualified domain name. The first // octet of the address field contains the number of octets of name that // follow, there is no terminating NUL octet. bytes[0] = Convert.ToByte(host.Length); Encoding.ASCII.GetBytes(host).CopyTo(bytes, 1); return bytes; default: return null; } } private byte[] GetDestPortBytes(int value) { byte[] array = new byte[2]; array[0] = Convert.ToByte(value / 256); array[1] = Convert.ToByte(value % 256); return array; } private void SendCommand(byte command, string destinationHost, int destinationPort) { NetworkStream stream = _tcpClient.GetStream(); byte addressType = GetDestAddressType(destinationHost); byte[] destAddr = GetDestAddressBytes(addressType, destinationHost); byte[] destPort = GetDestPortBytes(destinationPort); // The connection request is made up of 6 bytes plus the // length of the variable address byte array // // +----+-----+-------+------+----------+----------+ // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ // // * VER protocol version: X'05' // * CMD // * CONNECT X'01' // * BIND X'02' // * UDP ASSOCIATE X'03' // * RSV RESERVED // * ATYP address itemType of following address // * IP V4 address: X'01' // * DOMAINNAME: X'03' // * IP V6 address: X'04' // * DST.ADDR desired destination address // * DST.PORT desired destination port in network octet order byte[] request = new byte[4 + destAddr.Length + 2]; request[0] = SOCKS5_VERSION_NUMBER; request[1] = command; request[2] = SOCKS5_RESERVED; request[3] = addressType; destAddr.CopyTo(request, 4); destPort.CopyTo(request, 4 + destAddr.Length); // send connect request. stream.Write(request, 0, request.Length); // PROXY SERVER RESPONSE // +----+-----+-------+------+----------+----------+ // |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | // +----+-----+-------+------+----------+----------+ // | 1 | 1 | X'00' | 1 | Variable | 2 | // +----+-----+-------+------+----------+----------+ // // * VER protocol version: X'05' // * REP Reply field: // * X'00' succeeded // * X'01' general SOCKS server failure // * X'02' connection not allowed by ruleset // * X'03' Network unreachable // * X'04' Host unreachable // * X'05' Connection refused // * X'06' TTL expired // * X'07' Command not supported // * X'08' Address itemType not supported // * X'09' to X'FF' unassigned //* RSV RESERVED //* ATYP address itemType of following address byte[] response = new byte[255]; // read proxy server response var responseSize = stream.Read(response, 0, response.Length); byte replyCode = response[1]; // evaluate the reply code for an error condition if (responseSize < 2 || replyCode != SOCKS5_CMD_REPLY_SUCCEEDED) HandleProxyCommandError(response, destinationHost, destinationPort ); } private void HandleProxyCommandError(byte[] response, string destinationHost, int destinationPort) { string proxyErrorText; byte replyCode = response[1]; byte addrType = response[3]; string addr = ""; Int16 port = 0; switch (addrType) { case SOCKS5_ADDRTYPE_DOMAIN_NAME: int addrLen = Convert.ToInt32(response[4]); byte[] addrBytes = new byte[addrLen]; for (int i = 0; i < addrLen; i++) addrBytes[i] = response[i + 5]; addr = System.Text.ASCIIEncoding.ASCII.GetString(addrBytes); byte[] portBytesDomain = new byte[2]; portBytesDomain[0] = response[6 + addrLen]; portBytesDomain[1] = response[5 + addrLen]; port = BitConverter.ToInt16(portBytesDomain, 0); break; case SOCKS5_ADDRTYPE_IPV4: byte[] ipv4Bytes = new byte[4]; for (int i = 0; i < 4; i++) ipv4Bytes[i] = response[i + 4]; IPAddress ipv4 = new IPAddress(ipv4Bytes); addr = ipv4.ToString(); byte[] portBytesIpv4 = new byte[2]; portBytesIpv4[0] = response[9]; portBytesIpv4[1] = response[8]; port = BitConverter.ToInt16(portBytesIpv4, 0); break; case SOCKS5_ADDRTYPE_IPV6: byte[] ipv6Bytes = new byte[16]; for (int i = 0; i < 16; i++) ipv6Bytes[i] = response[i + 4]; IPAddress ipv6 = new IPAddress(ipv6Bytes); addr = ipv6.ToString(); byte[] portBytesIpv6 = new byte[2]; portBytesIpv6[0] = response[21]; portBytesIpv6[1] = response[20]; port = BitConverter.ToInt16(portBytesIpv6, 0); break; } switch (replyCode) { case SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE: proxyErrorText = "a general socks destination failure occurred"; break; case SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET: proxyErrorText = "the connection is not allowed by proxy destination rule set"; break; case SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE: proxyErrorText = "the network was unreachable"; break; case SOCKS5_CMD_REPLY_HOST_UNREACHABLE: proxyErrorText = "the host was unreachable"; break; case SOCKS5_CMD_REPLY_CONNECTION_REFUSED: proxyErrorText = "the connection was refused by the remote network"; break; case SOCKS5_CMD_REPLY_TTL_EXPIRED: proxyErrorText = "the time to live (TTL) has expired"; break; case SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED: proxyErrorText = "the command issued by the proxy client is not supported by the proxy destination"; break; case SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED: proxyErrorText = "the address type specified is not supported"; break; default: proxyErrorText = String.Format(CultureInfo.InvariantCulture, "that an unknown reply with the code value '{0}' was received by the destination", replyCode.ToString(CultureInfo.InvariantCulture)); break; } string exceptionMsg = String.Format(CultureInfo.InvariantCulture, "The {0} concerning destination host {1} port number {2}. The destination reported the host as {3} port {4}.", proxyErrorText, destinationHost, destinationPort, addr, port.ToString(CultureInfo.InvariantCulture)); throw new ProxyException(exceptionMsg); } #region "Async Methods" private BackgroundWorker _asyncWorker; private Exception _asyncException; bool _asyncCancelled; /// /// Gets a value indicating whether an asynchronous operation is running. /// /// Returns true if an asynchronous operation is running; otherwise, false. /// public bool IsBusy { get { return _asyncWorker == null ? false : _asyncWorker.IsBusy; } } /// /// Gets a value indicating whether an asynchronous operation is cancelled. /// /// Returns true if an asynchronous operation is cancelled; otherwise, false. /// public bool IsAsyncCancelled { get { return _asyncCancelled; } } /// /// Cancels any asychronous operation that is currently active. /// public void CancelAsync() { if (_asyncWorker != null && !_asyncWorker.CancellationPending && _asyncWorker.IsBusy) { _asyncCancelled = true; _asyncWorker.CancelAsync(); } } private void CreateAsyncWorker() { if (_asyncWorker != null) _asyncWorker.Dispose(); _asyncException = null; _asyncWorker = null; _asyncCancelled = false; _asyncWorker = new BackgroundWorker(); } /// /// Event handler for CreateConnectionAsync method completed. /// public event EventHandler CreateConnectionAsyncCompleted; /// /// Asynchronously creates a remote TCP connection through a proxy server to the destination host on the destination port. /// /// Destination host name or IP address. /// Port number to connect to on the destination host. /// /// Returns TcpClient object that can be used normally to communicate /// with the destination server. /// /// /// This method instructs the proxy server /// to make a pass through connection to the specified destination host on the specified /// port. /// public void CreateConnectionAsync(string destinationHost, int destinationPort) { if (_asyncWorker != null && _asyncWorker.IsBusy) throw new InvalidOperationException("The Socks4 object is already busy executing another asynchronous operation. You can only execute one asychronous method at a time."); CreateAsyncWorker(); _asyncWorker.WorkerSupportsCancellation = true; _asyncWorker.DoWork += new DoWorkEventHandler(CreateConnectionAsync_DoWork); _asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CreateConnectionAsync_RunWorkerCompleted); Object[] args = new Object[2]; args[0] = destinationHost; args[1] = destinationPort; _asyncWorker.RunWorkerAsync(args); } private void CreateConnectionAsync_DoWork(object sender, DoWorkEventArgs e) { try { Object[] args = (Object[])e.Argument; e.Result = CreateConnection((string)args[0], (int)args[1]); } catch (Exception ex) { _asyncException = ex; } } private void CreateConnectionAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (CreateConnectionAsyncCompleted != null) CreateConnectionAsyncCompleted(this, new CreateConnectionAsyncCompletedEventArgs(_asyncException, _asyncCancelled, (TcpClient)e.Result)); } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP2008.csproj0000644000175000017500000007724012204443225022245 0ustar00meebeymeebey00000000000000 Local 9.0.30729 2.0 {91EA0D0B-D3BA-497F-AFEB-2CAD59DEBA0E} Debug AnyCPU agsXMPP key.snk JScript Grid IE50 false Library agsXMPP OnBuildSuccess true 3.5 v2.0 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true bin\Net35\Debug\ false 285212672 false TRACE;DEBUG;SSL;STRINGPREP true 4096 false false false false false 4 full prompt bin\Net2\Release\ false 285212672 false TRACE;SSL;STRINGPREP bin\NET2\Release\agsXMPP.xml false 4096 false true false false false 4 none prompt System System.Data System.Drawing System.Windows.Forms System.XML Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code False .NET Framework Client Profile false False .NET Framework 2.0 %28x86%29 true False .NET Framework 3.0 %28x86%29 false False .NET Framework 3.5 false False .NET Framework 3.5 SP1 false smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP2008_CF.csproj0000644000175000017500000005677312204443225022625 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {33BAFD81-945E-46CF-A6E1-42CB7B626CDB} Library Properties agsXMPP agsXMPP {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 agsXMPP_PPC_20 v3.5 true key.snk 2.0 Pocket PC 2003 true full false bin\CF2\Debug\ TRACE;DEBUG;CF_2;STRINGPREP;BCCRYPTO true true prompt 512 4 Off pdbonly true bin\CF2\Release\ TRACE;CF_2;STRINGPREP true true prompt 512 4 Off bin\CF2\Release\agsXMPP.xml Code Code smuxi-1.1/lib/agsxmpp/agsxmpp/Collections/0000755000175000017500000000000012204443225021476 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Collections/FullJidComparer.cs0000644000175000017500000000350712204443225025054 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; namespace agsXMPP.Collections { /// /// /// public class FullJidComparer : IComparer { /// /// /// /// /// /// public int Compare(object x, object y) { if (x is Jid && y is Jid) { Jid jidX = (Jid)x; Jid jidY = (Jid)y; if (jidX.ToString() == jidY.ToString()) return 0; else return String.Compare(jidX.ToString(), jidY.ToString()); } throw new ArgumentException("the objects to compare must be Jids"); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Collections/BareJidComparer.cs0000644000175000017500000000345512204443225025025 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; namespace agsXMPP.Collections { /// /// /// public class BareJidComparer : IComparer { /// /// /// /// /// /// public int Compare(object x, object y) { if (x is Jid && y is Jid) { Jid jidX = (Jid)x; Jid jidY = (Jid)y; if (jidX.Bare == jidY.Bare) return 0; else return String.Compare(jidX.Bare, jidY.Bare); } throw new ArgumentException("the objects to compare must be Jids"); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Uri.cs0000644000175000017500000002470712204443225020320 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP { public class Uri { public const string STREAM = "http://etherx.jabber.org/streams"; public const string CLIENT = "jabber:client"; public const string SERVER = "jabber:server"; public const string IQ_AGENTS = "jabber:iq:agents"; public const string IQ_ROSTER = "jabber:iq:roster"; public const string IQ_AUTH = "jabber:iq:auth"; public const string IQ_REGISTER = "jabber:iq:register"; public const string IQ_OOB = "jabber:iq:oob"; public const string IQ_LAST = "jabber:iq:last"; public const string IQ_TIME = "jabber:iq:time"; public const string IQ_VERSION = "jabber:iq:version"; public const string IQ_BROWSE = "jabber:iq:browse"; public const string IQ_SEARCH = "jabber:iq:search"; public const string IQ_AVATAR = "jabber:iq:avatar"; public const string IQ_PRIVATE = "jabber:iq:private"; public const string IQ_PRIVACY = "jabber:iq:privacy"; /// /// JEP-0009: Jabber-RPC /// public const string IQ_RPC = "jabber:iq:rpc"; public const string X_DELAY = "jabber:x:delay"; public const string X_EVENT = "jabber:x:event"; public const string X_AVATAR = "jabber:x:avatar"; public const string X_CONFERENCE = "jabber:x:conference"; /// /// jabber:x:data /// public const string X_DATA = "jabber:x:data"; /// /// JEP-0144 Roster Item Exchange /// public const string X_ROSTERX = "http://jabber.org/protocol/rosterx"; /// /// Multi User Chat (MUC) JEP-0045 /// http://jabber.org/protocol/muc /// public const string MUC = "http://jabber.org/protocol/muc"; /// /// http://jabber.org/protocol/muc#user /// public const string MUC_USER = "http://jabber.org/protocol/muc#user"; /// /// "http://jabber.org/protocol/muc#admin /// public const string MUC_ADMIN = "http://jabber.org/protocol/muc#admin"; /// /// http://jabber.org/protocol/muc#owner /// public const string MUC_OWNER = "http://jabber.org/protocol/muc#owner"; // Service Disovery public const string DISCO_ITEMS = "http://jabber.org/protocol/disco#items"; public const string DISCO_INFO = "http://jabber.org/protocol/disco#info"; public const string STORAGE_AVATAR = "storage:client:avatar"; public const string VCARD = "vcard-temp"; // New XMPP Stuff /// /// urn:ietf:params:xml:ns:xmpp-streams /// public const string STREAMS = "urn:ietf:params:xml:ns:xmpp-streams"; public const string STANZAS = "urn:ietf:params:xml:ns:xmpp-stanzas"; public const string TLS = "urn:ietf:params:xml:ns:xmpp-tls"; public const string SASL = "urn:ietf:params:xml:ns:xmpp-sasl"; public const string SESSION = "urn:ietf:params:xml:ns:xmpp-session"; public const string BIND = "urn:ietf:params:xml:ns:xmpp-bind"; /// /// jabber:component:accept /// public const string ACCEPT = "jabber:component:accept"; // Features // public const string FEATURE_IQ_REGISTER = "http://jabber.org/features/iq-register"; /// /// Stream Compression http://jabber.org/features/compress /// public const string FEATURE_COMPRESS = "http://jabber.org/features/compress"; // Extensions (JEPs) public const string SHIM = "http://jabber.org/protocol/shim"; public const string PRIMARY = "http://jabber.org/protocol/primary"; /// /// JEP-0172 User nickname /// http://jabber.org/protocol/nick /// public const string NICK = "http://jabber.org/protocol/nick"; /// /// JEP-0085 Chat State Notifications /// http://jabber.org/protocol/chatstates /// public const string CHATSTATES = "http://jabber.org/protocol/chatstates"; /// /// JEP-0138: Stream Compression /// public const string COMPRESS = "http://jabber.org/protocol/compress"; /// /// JEP-0020: Feature Negotiation http://jabber.org/protocol/feature-neg /// public const string FEATURE_NEG = "http://jabber.org/protocol/feature-neg"; /// /// JEO-0095 http://jabber.org/protocol/si /// public const string SI = "http://jabber.org/protocol/si"; /// /// JEO-0096 http://jabber.org/protocol/si/profile/file-transfer /// public const string SI_FILE_TRANSFER = "http://jabber.org/protocol/si/profile/file-transfer"; /// /// JEP-0065 SOCKS5 bytestreams /// http://jabber.org/protocol/bytestreams /// public const string BYTESTREAMS = "http://jabber.org/protocol/bytestreams"; // JEP-0083 public const string ROSTER_DELIMITER = "roster:delimiter"; // Jive Software Namespaces /// /// Jivesoftware asterisk-im extension (http://jivesoftware.com/xmlns/phone); /// public const string JIVESOFTWARE_PHONE = "http://jivesoftware.com/xmlns/phone"; /// /// JEP-0071: XHTML-IM (http://jivesoftware.com/xmlns/phone) /// public const string XHTML_IM = "http://jabber.org/protocol/xhtml-im"; public const string XHTML = "http://www.w3.org/1999/xhtml"; /// /// XEP-0115: Entity Capabilities (http://jabber.org/protocol/caps) /// public const string CAPS = "http://jabber.org/protocol/caps"; /// /// Jingle http://jabber.org/protocol/jingle /// public const string JINGLE = "http://jabber.org/protocol/jingle"; /// /// Jingle audio format description http://jabber.org/protocol/jingle/description/audio /// public const string JINGLE_AUDIO_DESCRIPTION = "http://jabber.org/protocol/jingle/description/audio"; /// /// Jingle Info audio http://jabber.org/protocol/jingle/info/audio; /// public const string JINGLE_AUDIO_INFO = "http://jabber.org/protocol/jingle/info/audio"; public const string JINGLE_VIDEO_DESCRIPTION = "http://jabber.org/protocol/jingle/description/video"; /// /// GeoLoc (http://jabber.org/protocol/geoloc) /// public const string GEOLOC = "http://jabber.org/protocol/geoloc"; /// /// XMPP ping /// Namespace: urn:xmpp:ping /// http://www.xmpp.org/extensions/xep-0199.html /// public const string PING = "urn:xmpp:ping"; /// /// Ad-Hoc Commands (http://jabber.org/protocol/commands) /// public const string COMMANDS = "http://jabber.org/protocol/commands"; // Pubsub stuff public const string PUBSUB = "http://jabber.org/protocol/pubsub"; public const string PUBSUB_EVENT = "http://jabber.org/protocol/pubsub#event"; public const string PUBSUB_OWNER = "http://jabber.org/protocol/pubsub#owner"; // Http-Binding XEP-0124 public const string HTTP_BIND = "http://jabber.org/protocol/httpbind"; /// /// XEP-0184: Message Receipts /// urn:xmpp:receipts /// public const string MSG_RECEIPT = "urn:xmpp:receipts"; /// /// XEP-0048: Bookmark Storage /// storage:bookmarks /// public const string STORAGE_BOOKMARKS = "storage:bookmarks"; /// /// XEP-0047: In-Band Bytestreams (IBB) /// http://jabber.org/protocol/ibb /// public const string IBB = "http://jabber.org/protocol/ibb"; /// /// /// http://jabber.org/protocol/amp /// public const string AMP = "http://jabber.org/protocol/amp"; /// /// XEP-0153: vCard-Based Avatars /// vcard-temp:x:update /// public const string VCARD_UPDATE = "vcard-temp:x:update"; public const string URN_TIME = "urn:xmpp:time"; /// /// XEP-0145 Annotations /// storage:rosternotes /// public const string STORAGE_ROSTERNOTES = "storage:rosternotes"; } }smuxi-1.1/lib/agsxmpp/agsxmpp/IqGrabber.cs0000644000175000017500000001203012250206660021402 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using System.Threading; using agsXMPP.protocol.client; //using agsXMPP.protocol.component; using agsXMPP.Xml; namespace agsXMPP { public class IqGrabber : PacketGrabber { /// /// /// /// public IqGrabber(XmppClientConnection conn) { m_connection = conn; conn.OnIq += OnIq; } public IqGrabber(XmppComponentConnection conn) { m_connection = conn; conn.OnIq += OnIq; } #if !CF private IQ synchronousResponse = null; private int m_SynchronousTimeout = 5000; /// /// Timeout for synchronous requests, default value is 5000 (5 seconds) /// public int SynchronousTimeout { get { return m_SynchronousTimeout; } set { m_SynchronousTimeout = value; } } #endif /// /// An IQ Element is received. Now check if its one we are looking for and /// raise the event in this case. /// /// /// public void OnIq(object sender, IQEventArgs e) { // the tracker handles on iq responses, which are either result or error if (e.IQ.Type != IqType.error && e.IQ.Type != IqType.result) return; string id = e.IQ.Id; if(id == null) return; IqHandler td; lock (m_grabbing) { td = (IqHandler) m_grabbing[id]; if (td == null) { return; } m_grabbing.Remove(id); } td(this, e); } /// /// Send an IQ Request and store the object with callback in the Hashtable /// /// The iq to send /// the callback function which gets raised for the response public void SendIq(IQ iq, IqHandler cb) { // check if the callback is null, in case of wrong usage of this class if (cb == null) { throw new ArgumentNullException("cb"); } if (iq == null) { throw new ArgumentNullException("cb"); } m_grabbing[iq.Id] = cb; m_connection.Send(iq); } #if !CF /// /// Sends an Iq synchronous and return the response or null on timeout /// /// The IQ to send /// /// The response IQ or null on timeout public IQ SendIq(agsXMPP.protocol.client.IQ iq, int timeout) { synchronousResponse = null; AutoResetEvent are = new AutoResetEvent(false); SendIq(iq, delegate (object sender, IQEventArgs e) { e.Handled = true; are.Set(); } ); if (!are.WaitOne(timeout, true)) { // Timed out lock (m_grabbing) { if (m_grabbing.ContainsKey(iq.Id)) m_grabbing.Remove(iq.Id); } return null; } return synchronousResponse; } /// /// Sends an Iq synchronous and return the response or null on timeout. /// Timeout time used is /// /// The IQ to send /// The response IQ or null on timeout public IQ SendIq(IQ iq) { return SendIq(iq, m_SynchronousTimeout); } #endif } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP2008_PPC.csproj0000644000175000017500000005706112204443225022746 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.21022 2.0 {33BAFD81-945E-46CF-A6E1-42CB7B626CDB} Library Properties agsXMPP agsXMPP {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 agsXMPP_PPC_20 v2.0 true key.snk 2.0 Pocket PC 2003 true full false bin\PPC_20\Debug\ TRACE;DEBUG;CF_2;STRINGPREP;BCCRYPTO true true prompt 512 4 Off pdbonly true bin\PPC_20\Release\ TRACE;CF_2;STRINGPREP;BCCRYPTO true true prompt 512 4 Off Code Code False .\crypto.dll smuxi-1.1/lib/agsxmpp/agsxmpp/crypto.dll0000644000175000017500000442000012204443225021235 0ustar00meebeymeebey00000000000000MZ@ !L!This program cannot be run in DOS mode. $PELH!  ^   `V@ O @  H.textd  `.rsrc @@.reloc @@B@ H <. P "z*b*vinoӦ*%>@.`+qs=g F˭>כjmMd+lF*.'mG2$4izkי-L_l]>]y=! 0lo#tK o1Jou,<o~o ,)ot((o}(*(o*0Q{,G+2{%{% X}o uK, (o*{{o2*0~oX , (o**s*:s (*:s (*0- rps zo -rprps z{-}}}+{.}}}{,.{{o. ( Z}} Hs o / 2o0. ( s( o s<z *cq 0s +o &(% -*BrIpsV*( *N( o|}*v( shssz}*0p{ud,{tdo| + {th o is  +# on3 oo( o & X i3o *0H( is  +uf, o &X i3f( o! t*0Bo  +- on3oo( o , &X i3* *1F{(xs *0{ud,^{td o},7o}o oXo o ,o o}o (**o o|(*o {th(*0) 3*u-*t {{o *2{o" *^u>-*t>(*0 -j* j_ c j_ 8 2 + Y8e%X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X %X _jX X Y <,%X _jX X Y% - j]  j] =;b`*( *0m o ,as)  oo$ +*o% t o o3 oo+ o& -u.,o' **7T"o*"o*6so"*0 o ,o ,o**( *:(#}*6s('*6s('*0> (#o#(}$ rap(( s) z rap(( s) z*1++Z{ooXo*n{ooioo*F{ooj*{o,{oo**{o,{ooX**{o,{oo**0()o* -rp s z,&(+,(+o* -rp s z(0,[,X(0oo$ +*o% t oo* -rp s zo& -u. , o' ()(a (*i. r[ps z*c62{ok*2{o*(0*(+ *"(, *&(- *(+ *"(, *&(- *(5*"(6*&(7*(5*"(6*&(7*(;*"(<*&(=*:( } *0. +{ o3 { *X { i3*0(B ,t**{ *0T3*u -*{ i{ i.* +{ { o -*X { i3*0& {   + o" a X i2*j(#} oN} *0{ om rps z* 0b{ ooXoX*F{ os *F{ oo*0<{ o ow  +o( sX i3*2{ o*(M*Z{ oPo( *Z{ oPoo*2{ s*F{ oRo*0s { oT ,lo+Bo% t7 s ok(o & rp s zrps zo& -u.,o' *(,E 0,R Ol0(S >( o! t*0-rp(. (Ss( r3ps z* 0O(O( oK{ om ioM(RoO  rgp(( s z *::2{ ok*0$3*u -*{ { o *2{ o" *rp*0s,Pu,t o8 } o9 + s } u- rpszt} *u- rpszt} *0{ o o (b o{ s o/o ooo o{ toooo o*0{ o o (b o1 o0*o1 o0*o  oo ooooo{ to ooooo *0io[(/ s*( *( *- rAps z- rSps z(}(}}*2{(*of*2{(*oh*{*2(0 o1 *2(0 o2 *2(3 o1 *2(3 o2 *"(u*04i/ -+4*iXZ4 (4 io5 &*( - r]ps z/rkprps z}}*{*{*b(v}}*{*{*0.u -*{{3{{o **0{ (6 {o" a*:( }*{*0u -*(*>{{*0 { (7 *>(~}*{*0!3*u -*(*v{{(R,(**0( {,{o" a *z(- rps z}*{*0"3*u -*(*v{{o ,(**N{o" (a*>(~}*{*0#3*u -*(*v{{(R,(**0( {,{o" a **rp*0$iY + Xi2*0@%iY 2i1 rpsT z +iY. rpsT zX 1*( *0M( }o}{4}{4}{4}*{*0e&}u,=t o i{. rps8 z{i(9 o({{o*Z{orqp(. * *2{o*{- (*(*{{{i(9 {o*0v%{Xi1 r{psjz +"{4%q4Xaҁ4X {2{{o {{i(9 *0'{Xi1 r{psjz{{(9 {o  +#X4%q4{aҁ4X {2{ {}}*V( }} *0V(u, t oB }!oC }"*u,t o }!}"*rps8 z{ *06)iY/ rpsjzj { o !1 r-ps8 zjXjYj[i { o4 {8{ {!{!io{ co{ co{ co{ o{",{ {"{"io{  o&1 (9 XY+ (9 XX?>{ oi*&(*( *0-*~io - ( +s o,*0I+o  s X o, o1 3 3Ys("**&o*.s$*0<,u- r]po: o; (. rps zt o(*0G${,-({((}-{-{,a {,X _},*0{/-(rp(. s< zXi1 r{psjzXi1 rpsjz +S{,-({((}-X{-{,XaҜ{,X _},X 2*rp*6{.(*0-}.{'-~&9}'{(-~&9}( +{'{(%X ~&2%}+%}*})},ii_X4  i(9  +{(c (X  i2~%9 +  y7X ~%2 + (X 2 +| +l +29%q92 {'X+ {(XX9X ~%2( +{'XX ~%2~%X ~&2X 2(}/*0'.%{*%{+X% }+ X}* 8{' _E1H+\%{){) ba})+D%{){)da})+-%{){)ba})+%{){)da})%{){' X _X}){'{'d _{)X{*X% {({' d _X%}*X ~&?*0%9%q9 ba99%q9X99%q9X99%q9da99%q9X99%q9X99%q9ba99%q9X99%q9X99%q9da99%q9X99%q9X99%q9 ba99%q9X99%q9X99%q9da99%q9X99%q9X99%q9ba99%q9X99%q9X99%q9 da99%q9X99%q9X9*0$/X bX` bX` b` *0%4 ҜdҜdҜdҜ*030iZ4   +((9 X X i2*N%~%b&*f~&b4}-( *0W( ~75}9~75}:~75};~75}<~85}=*0Hu-r%po: o (. s8 z}>to}?{?(*rp* *0\{?- rps< zXi1 r{psjzXi1 rpsjz{>, (+ (** *0A{9d{:d _X{;d _a{< _X*0{1i  +n{=a +.({=aa({=XaaX ~62{=~6XaXX 2*0{2~2{9~7(9 ~3{:~7(9 ~4{;~7(9 ~5{<~7(9 ~1{=~8(9 i   +G + b%X _` 2 X2{=5%q5 a5X ~82{=({=~8Y{=~8Y{9({9~7Y{9~7Y{:({:~7Y{:~7Y{;({;~7Y{;~7Y{<(*01( X( {=a  +,({=aa ({=Xaa X ~62{=~6Xa (X(*01( X( {=~6Xa ~6 +,({=aa ({=Yaa Y 0{=a (X(* _bX _b`X _b`X _`*XҜXcҜXcҜcҜ*j?$.Dsp"8 1).lN!(Ew8fTl 4)P|ɵՄ? Gy 1Ѭߘr/Ḗ~&jE|,G$l iciNWqX~=t XrX͋qJT{YZ90`*#`(yA8۸y:`l>w'K1/x`\`U%U攫UbHW@cj9U*4\̴ATr|*oc]ũ+1t>\3֯\$lS2zw(H;Kkē!(f a!`|H2]]]u#&܈e>#Ŭom9BD . Ji^Bh!la gӫҠQjh/T(3Ql n;zP;*~ev9>YfCoEå}^;uos D@jVbNw?6r=B$7H ۛIrS{y%P;LylO`@ž\^c$johSl>9oR;Qm,0DE ^J3(fK.WtE9_ ӹyU 2`yr,@%g̣饎"2u<kaP/R=2`#H{1S>W\o.ViB~(2gsUO'[iXʻ]=!lJ[-ySeEIҐK3~ˤAb Lw6~д+MەqՓkю%ǯ/[{AI~-%^q h"W6d$ cUYCxSZ٢[} Źv&ϕbhAJsN-GJ{RQ)S?Wƛv`+t恵oWk *!ec.4dV]-SGjnpzKD). u#&İn}ߧI`fqilRdVឱ¥6)L u@Y>:䚘T?eB[k?ҡ08-M]% L&pc^?kh >\D}W7: P tAu8/;21>8TNmO Bo ,y|$ryVw.?rU$qk.P̈́GXzt}K:zfC cdG27;C$CMQe*P:qUN1w_V5kǣ;< $Y,n<pEㆱo ^*>Zw=Ne)։>%fRxL.jxS<- N=+6&9`y#RnfE{7(2åZl!Xeh;/ۭ}*/n[(!pa)uGa0a4c\s9pL ު˼,b`\ndi#PZe2Zh@*<1! T_~}=b7w-_h)5ǡޖXxWcr"ÃF T0.SHُ(1mX4a(s<|J]d]B> EꫪOlOBBǵj;Oe!AyMjGKPb=bF&[$ti GV[ Htb#*BXU >ap?#r3A~_;"lY7|`t˧@n2w΄PU5ai Z .zD4Egɞs͈Uy_g@Cge48>q(= m!>J=+hZ=@&L4)i Av.khq$j 3ԷCaP.9FE$tO!@MpE/f m1'A9UG%ښ ʫ%xP()Sچ, mbhiHפh'?Oz|Ϊ_7әxB*k@5 ٫9N;VmK1f&tn:2C[Ah xN جV@E'H::SU kKмgUXc)3VJ*%1?~^|1)p/'\,(H"m?H܆AyG@n]Q_2Տd5A4x{%`*`lc´2Of#k>3b $;" r(-Exb}doITH}'>AcG t.no:7`L knU{7,gm;e' )̒9 i{f} ϑ^و/$[Qy{;v.97yY̗&-1.Bh;+jLu.x7BjQ满PcKkؽ%=YBD n *Ngd_ڈ鿾dW{x`M``FѰ8Ew63kBqA_^;Z4ٷ,Q+:Ֆ}}>(-}|%rZLZq)GW;()f(.y_xU`uD^mm%adâW<'*:m?!cf&(3uU4V<wQ( gQ̫_QM08bX7 z{>d!Q2Ow~㶨F=)iSHd$m-if! FEdlX [@X̻k~jEY:D 5>ʹrdfGof,ҏ"W##v215VbuZ6ns҈bIPLVq z2E{Sb%ҽ5iq"|˶+v>S@`8G% 8vFšw``u N˅؍芰z~L\HjiԐ\-% ?2aN[wߏWr:05%((> 1 5%)(> 2 5%*(> 3 5%+(> 4 5%,(> 56 7~6X8*"~B*&~B*0-3rp(S 6 , rpo? +B*f( }D(}G*{D*Z{Dor p(. *0\4u,!t o8 }Co9 t +s }Ct {Doo}F}E*0{Do {E-* Y*0{Do {E- Y**r{E- (*(*00{Do4 {F,  +  X iYY3+6{Co@  +{Co Ҝ,X iYY3iYYiY(9 {Dio*05{Do i(/ r%psT z .. rEpsT z{G,i{Do. rkpsT z +" ,!3 . rpsT zX i3X i/ / rpsT ziY4i(9 *N( 4}I*0M( {Ii4}I{I{I{Ii(9 {J}J{K}K*0M{I%{J% X}J{J{Ii3{Io}J%{KjX}K*0~+(XY{J,<0+6o{IiX{IiY%{K{IijX}K{Ii0+(XY0*036{Kb  (+({J-oo*0,j}K}J + {IX {Ii2*@*:}N( *}N( /rkprps z}O*{O*v- rps z}No*vow}LoxX[}M*0@{N,1{O/ rps< z}Ns {Osvoo*J{L{Mo *0.o -*iXi1 rpsjzoA i*2io!*:io#*04o! -*iXi1 rpsjzoA i*2io&*0(o$ iXi1 rpsjzoA i*:io)*0o# Xo'X *24P*( *r(+- rMps z}Q*2{Qo*u, to9 {Qo* * * *04 {Qo*i2 rpsjz{Qo*0/*4 {Qo*z/*1{Qo*2o*~P*0/~P*o! o**2{Qo*sB }T(+- r[ps z}R*rip*J}Srip(Qz *04{R- rqps< z{ToC iX {S-Y*X* *:{ToD *0O- rps z/ rps8 z/ rps8 zXi1 rps8 z{ToE *0#{ToF o*{Rio *Fo!&o$*:{TjoG *:( }U*087t o1}Vo2}Wo3}Xo4}Y*{U*08iY/ rpsjzj {Uo !1 r-ps8 zjXjYj[i {Uo4 8{U{X{Xio7  {V (Is> s7   s]{Y,'7  {Ys>s9  o^7  {W(Is>s9  o^s(m{Uio{U o&1 (9 XY+ (9 XX?{Uo*0%4 cҜcҜcҜҜ*u, to9 th}Z*0*9ti o,{Zoo oo*( *0:( }]s}\}doM  o,o( {\oo+3o(8 {\o<o{\o=oXo &r% ps8 zoO }^oN }`oR }aoQ }_oP o}c}b}e*c 0{\*Z{]oL oXo*{^*F{^oo*0;{^o ,op**{f- rY ps< z{foH t*{_*F{_oo*0;{_o ,op**Z{`, {`sO**Z{a, {asO**F{coH t*0<(X - s s5*s ~oQ 9oj  os o+Zo% t7op(I ~VoO ooo ~(YsnsMo &o& -u.,o' s5*Ign{`,{`r pol**07=~[(Qo  ~[o  {_o {_o ~o 9 - r ps z op(oo{^oo - r ps zoo~o - r ps zoo( ooXoooXo. r ps zs7s{: r p s zr p~[(Uo (I  ~[ o oK{`-g{b,4{bso {bso ( }f8[{eo}f{f(Y(_z{b,{bso (  +{e,{eo +  }f~oQ ~oQ  - r psz -{d~o - rN psz oj oopu,$to (-#r pszu, , r psz ,. oj ot{do - r| psz([ioM(YoO9r ps zr,ps zrpoJ (. s z*AdSBuB 0B/>uT-**08>0. rps) z(( okii. rps z*0?~[(Uo  r8po? ,zr@p($ oo (^ oo{^oo - ݳ oo(]- ݘ o( ݁rpo? ,-rdp(oKioMoO Gr|prp(I s zzrp(( s zrp(( s z *(  0o,rZprps z(W(\*0@(W ,z~oS obEW+Jo_t oj  o. rps z oop( o o + rps zo (\*{]*0OA{]  , oUs oM oO oN oQ oP sJ {d{bsM*0B{] oX , oU + 7s] 7s] o8o$ +)o% t2 7obo^o& -u.,o' 7~ ssh o^oM oO oN oQ oP ssJ {d{bsM*?6u.~V[*( *:(f}g*{g*"(g*0CsB s  o'oF *0/Dr po? ,sB s o'oF *(k*0r p(l & *02opo*0.E3*u6 -*op oj .o**( *V(q}j}k*0>F(qo o& &o% t}jo& &o% t}k*{j*{k*0 G7 {j{ks*0HoK ((*(*( *( *0rpsl~lrp(( sm~lrp(( sn~lrp(( so~mrp(( sp~orp(( sq~nrp(( sr*0F,u;,t;*uK, tKs*rpo: o; (. r3ps z6((}*(qs}v3 s}w}xs}y*0(qo0 o/r;po5(( s8 zo(}v o3o(}wX Xo({}xXo(}y*{v*{w*{x*{y*0]I7 {vs] {w,7 {wo^7 {x {y o^s*2s(#*2s(#* *"o*o*(q*0_,u=,t=*u,tos*u,to5 (*rcpo: o; (. s8 z2o5 (*f(j(o}z*N(o}z*:(}z*2{zs*> {zo!*0Ju= -*{z{z(*2{z(*"(*Joo(*00K(o 2 0 ~+rp rp(. *0iL / rprprprpr?prUprprprp rp rp*6((*0Fu?--t?*uK, tKs*rpo: o; (. r3ps z:(q}*N(qs}*0=M{o  +{o(2X {o3*{*0ZNsL ~I  r poM &oM &(  +"r'poM & oN &oM & X i3o *0Cu@,t@*uK, tKs*r1po: oO (. r3ps z(q}}}}}}*0O(qo o& &o% t$}o& &o% t:}o& &o% ( }+wo% t< u,Wt o2  E+(}+6(}+'ripo2 5(( s8 zt:}o& -*{*{*{*{*{*{*0P7 {{{s] {,7 {s9 o^{,7 {s9  o^7{o^sp*uK, tKs*r1po: oO (. r3ps zN(qs>}*~(qsU}s>}*0G(qo3ot}*ot$}ot}*Z{, {oX**F{o(*0IQ7s] {,7 {o^7 {o^s*6((*0F,uB,tB*uK, tKs*rpo: o; (. r3ps z&(*(q- rps z}}*(qo( }o1oop}*{*{*0=Q7 {s] {,7 {o^s*0rpsrps~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s*( *f(q}~0}*V(q}}*V(q}}*0F(qo2 }o2  E*(u}*~0}*0F,uD,tD*u, ts*rpo: o; (. r3ps z{*{*N{{s9 **{* * *"}**sP zsP zsP z0/1 X +o . %X Ҝ2 &3Y* " 0sP zsP zsP z(Q *:(}*~{u,{to*0A,uG,tG*uK, (s*rpo: oO (. s8 z0D(qo.rEprps zo(S}o(}*j(qsU}}*F{oXo*{*0 G7 {{s*0F,uH,tH*uK, tKs*rpo: o; (. r3ps z0g(q- rps zo. r;po5(( rps zoopt}oop}*j(q}op}*{*{*0 G7 {{s*0F,uI,tI*uK, tKs*rpo: o; (. r3ps z0R(q- rps zo2 o1 r;po5(( rps z o8o% t o5  o2 EZ8tK o + o% t7op(& o& - u.  , o'  }+xtKo + o% t7op(J& o& - u.  , o' }+ (M} +r_prps zo& :u.  , o' -rprps z*AL((Pd(q- rps z, s}, s}}*0(q- rps z,3( (~-rpr=ps z(\s},3( (~-rMprps z(\s}}*0BS{o  +{oop(X {o2*0BT{o  +{oop(JX {o2*0I7s] {,7 {s9 o^{,7 {s9 o^7 {ops9  o^s*0~~~~~~~~~~~~~*( *,uK,tK*rpo: oO (. r3ps z0qUo5  ,o3 - rps8 ztK*o3 ,u,sn*s*uK,tK*rpo: oO (. r3ps zN(s }*2{oS *o*s*J{oT t7*"o*o*2{oU *0EVo o +o% Z , o" a o& -u. , o' *$20_WuK -*oo.*o o +!o% t7op o% o -*o& ,o& -*:{o &*2{(*j( }o}*0WX{{3*{%{% X}o uK, tKo*u:, t:o**{*Zob2s*~*"(*>((*0%Yi(  + (X i2*0DZob(oc +o% t7 (o& -u. ,o' *20b[sB s o+o% t7 o'o& -u.,o' oV oF 0 o!*!6.s*0F,uO,tO*uK, tKs*rpo: o; (. r3ps z(qot}o}*V(q}}*{*{*0 G7 {{s*V(q}}*0\(qo E`8ot o2  E+(}*(}*rEpo2 5(( s8 zot(}ot(}*r}ps8 z*6(( *0A,uP,tP*uK, tKs *rpo: o; (. s8 z{*{*0_Q7s] {,7 {s9 o^{,7 {s9 o^s*:(Q }*2{o *2{oW *2{oX *2{oC *2{oY *6{oZ *2{oV *2{o[ *:{o\ *6{oG *>{o] *2{o *>{oE *6{oD *"(*0K]1=  +X d% - `oD YZ +_coD Y /*oD *voD i( ioE *noD ( oE *0m^/ `oD *`oD  / oD *4 i Y% _ҜcY% _ `Ҝ0iYoE *v(#i( ioE *>oD oD *0D-(%*u<, t<o*u7,t7opo*rps) z^-(%*opo*"(*0D-(%*u<, t<o*u7,t7opo*r ps) z(*r9p**(,*(,*(,*0N} +:{,,{{ѝ{{ѝ%{X}X  2*0s} 6} @} @} RF@} RF@} 5} (2} (2} (2}5}}}(Q }}(=(5(6(F*0_  + 5X 2*0`  + @X 2*0^%{,*{ { YE  +(I+(J+(K+(L*0`a(? (? B.Z. rCps) z(? (? h3 1291(<}*0Y(M}*0b(? (? (? (? (?(?3%r3 E3 83P3 3(8*13A3Y3 &3 S3Y. (:}*(B}(>3 }+}(E{o}*0P{o}{{.(;{b{d`}%{{a}*(B}{{.(;(<}*(,*(,*(,* 0 {,{oV }&*Z}}}*0c+L {o &(/ 3(/ {b _`}%{X}{2{{Y_c_bY_ %{Y}*0&(>*04 b(>` b(>` b(>` b(>` *"(>*(@*0d  +  +3X X 2X 1 +X 2 +X5%q5X5X 2 +5%q5YX5X 2 +X 2  + XYX  Y b X 1X +YXbYX 1*0e (3 6  +(>3 + X 2 + {X  2 +/ ,% +(>3{ZXX 2X 2(0{X(>(> +  +X (>.{ѝX 2@  +    X  2 +?{    +    Y Y  0  { X 2 +C(>  +-(>- X + Y (>.  ѝX 2 X 2 +i  +$ 1  / X 2{ { {  (C{  X 2*0f @ {Z(A}(D{X + {X  1 + ѝX  1}- X2Y{{  (> 8 X +R {o  &(/ 3(/  {b _`}%{X}{2{{Y_c_ %{Y} b `  { =]{ { Y 3* , @ - X+ 3 ZXZ- X2Y{{(>8X+R{o &(/ 3(/{b _`}%{X}{2{{Y_c_%{Y}b`{=]{{Y 9 ;X{{5%q5X5+#%{X}{{Y0{?d(98Z%{X}{2(9 Y{{5%q5X5{{{ Y +*YYYYYYYY 0+ YY 0- X2Y{{(>8X+D{o &(/{b _`}%{X}{2{{Y_c_%{Y}b`{=k{{Y 8(00009g 5 }+%{{{Y%{X}{ 1}+0{5%q5{YX5%{X}{ 1}+@{{ {{5%q5X5%{X}{{1 {{}}} }{,}}(G*(H*0{{={}{{}{{}{-4~{}%{X}{ 3}%{Y}%{{.+a}%{X}{}}{{o*(7(6(F*0{{0e{}{{}{{}%{X}{}}{{o*(7(6(F*0{{.}}(G*%{X}{?{{}{{}{-4~{}%{X}{ 3}%{Y}%{{.+a}}}(J*}(G*0]{{/,{}{{o%{X}*}%{X}}(G*0{{.}}(H*%{X}{2;{{}{{}}}(L*}(H*0]{{/,{}{{o%{X}*}%{X}}(H*0H0 0{0 { &&}-* Z @}5}**0"%  +o .XҜX 2*j*** * * *j*j**vs}( s}*^s}{o{*o0rwprps z{sVo*6{o*J{so*J{so*6{o*J{(vo* 0K}(}&rp(. s8 z{(}{{o*R{so|*>{o|*f{ss>o|*R{s>o|*>s(g*0Bho" -r)pr?p(^ s?z( (c oJ s@z*!3&(i*0Gi(j {{( rYpsz(k rp sz* + 7 {o~-{{oo{o*b{sss*(*6((n*0\uW,tW*uK, tKso*uz,tz((n*rpo: o; (. r3ps z0j(qo +_o% t o2  E +-(}+)(}+(T}+ rps8 zo& -u. , o' * kx0Ek(qs o4 oo ioo&s>}*0Xk(qs o4 oo ioo&s>}}sV}*(q}op(}sV}*(qs>}}}*(qs>}op(}sV}*Z{, {o**{*Z{, {oX**0I7s] {,7 {s9 o^{,7 {s9 o^{,7 {s9  o^s*nrp{or5p(^ *J(tK(o*0l(sh o 3@~oo" ,1(t oso stoptK;o (v so sqoptKr9ps@z*0.m(v spoptK  rp(( sz*6({(o*6(|(o*( *o*( *0^n(tK ot$ ot$ rp sz6oXsYoXsY*(( 00o6 ssY*0~p YE 222 &,+0rp*rp*rp*rp*rp*r)p*r7p*rEp*rSp(( sz0uq YE7YE +r8p +&rp +rp +rp(( sz(r p(I *0r E  "(.4:+>*rp*rp*rp*rp*r+p*r7p*r?p*r?p*r?p*rGp*rWp4(( sz0is YE +@ +. +& +  +rWp4(( sz*0H( (*0!t( X[4 o@ (*0>u( s_ (  X[4  89so-   3rp( +rpo- (( szrpsz+oX3o. o, E58io8ioio8o0  ioio iiXjY +b ij/ io8io ijY  ij/ ioj +io ijY  j0+]rpo, 5(( szrp(  +o X  3io rp sz(   ii Y1  i Y(9 +   i(9  iX X i?i(` (*.8f30:voa sob oc od ( (oV oV *0Vws ob od o oa i4 +  oE   io] %0ooV *A2Z1)a2z10291+./.  . **0xoW -rCprps zoY o  _, oZ *(-oZ sr*<4  Ҝ+/(-oZ sr* . . %XҜ X <. o % /oZ /sr*4i(9 (z _ss*JoG t(*&(*( - rps z}{o}}*{o{o((}*2{o*2{o*2{o*07y}{-({ooK rpsz*) uz{3(*{oL* 3(+# 3{ .(+ {oL}*n{ oL{ oL*2i(*02%{3X  + (X 3*{oM*0)( {ioM{(oO*0?4 ҜicҜicҜicҜiҜ((*06z( 4  icҜiҜ((*0u{(sB oD +  oX i2 oF ( rpsz{o({(oO*>E 0( ( ({o({(oO*(({o({(oO*0I( .((. rps< z({o({(oO*2{o*2{o*(*F{o( *2{o*{o-{o**J{o(*J{o(*2,s'**0u|{o ,Xi3oZo +N7 oZsV oZsV s(k  rCpsz{o *%5Z 00}sB (oF *0(~(  {o {, {o *0{o/ r{psz* 00 {o. {o*0}t oo}rp(  oo   iooo   io( } &rps) zoo}*{o/rp(  oicoioio( } &rps) z{{iYn8b{{iYn0b`{{iYn(b`{{iYn b`{{iYnb`{{iYnb`{{iYnb`{{iYn`}u,too}*u ,t oo}*u ,t o8o}*2Gy O 0 s } s } s } s } ( o,rprps zu>,t> oos +wu,.t o o o oo s +AuA,.tAok ooos5 + r pszs)}s } s } (r; psz*00Ns } s } s } s } ( }} }(*0qs } s } s } s } ( {}} }{}{}{}*00%s } s } s } s } ( {}{ se } { se } { se } { oU s }  +&{ { oT t se o &X { oU 3{,D{oU s } +{{oT o &X {oU 3{}{}{}*0fs } s } s } s } ( }} } } } } (*0Ns } s } s } s } ( }} } (*2{o**2{o-*{o*1( Qj[i*{o,*Z{ -*{ o*0m{o*1F(,* +~( j2*X ~i3+( j2*j*{o,jjZ{ oT o ,& { og { og { og X { oU 2-**0`s   +>{ oT o ,& { og { og { og X { oU 2-**0^s   +<{ oT o ,${ oT t  oh , oi X { oU 2-**0_o,o(3 r!ps8 zo 3 rw!ps8 zs {,{o &+ { o &*^5%-(> *N( (? }*:s (*0{oF  3*YE v>>&4 0+ o# o'X i/4  (9 *0u{8,^{:o- r$psjz{8Xi1 r'%psjz{:{7{7o&{7{8(9 {8 o**{7{7i(` }8{:o*0O(uj-uF, rs%ps8 z}:o};{;Z4}7}8*0&%{8X {7i] - {7iY*Y*&{8X*0l% {8{7i3?{:{7o {7{;{7{;(9 {;}8{7%{8% X}8*0d/ r%ps8 zo o 1Xi1 rpsjz {7i{8Y  >{7{8 (9 {:{7oX {7{7(9 }8 Y X+M{7{8(9 {:{7XoX {7{7(9 YX0{7{8(9 %{8X}8*0{8Xi1 r'&psjz{:o {8Y 4 {99{:{7o&{8/ rm&psjz{8 +{7  Y X {7i3+&{74%q4Yaҁ4X{83{:u-{:+{:to{7o&X(9 84{:u-{:+{:to{7o&+YY{7aҜX{83{7(9 {:o&X(9 {8 o* *(Q }<,}=}?,}>*{=*{>*0O{=- {<o *{?,{@{?i2 (6-*{?%{@% X}@*07%{=-{<o] * +o 2%X XҜ2*{A,*}@(7}?{A-{?,{?*0{=o  ,+  4  {< i Yo] / }A+ X i2{A-{=o+{= o, i-*0:{>-{<oE *{>o ,{<ioE *06{>- {<oD *{>o  ,{<ioE *r{<o , {=**r{<oX , {>** *sP zsP zsP z0;{>,'{>o {<ioE {<o[ {<oV *2{<o[ *sP zsP zr&p*0u- r&ps8 zt ot ou- r'ps8 zo}E{E,{Ei2{Ei 1 ri'ps8 zo}F{F{EoF*0F}D 4}C +{CҜX  2 +x{C{D{C _Xi]X _}D{C _ {C _{C{D _{C{D _X  2 +z{C{D{C _X i]X _}D{C _{C _{C{D _{C{D _ X ?{}B*0 Xi1 r{psjzXi1 rpsjz 8{C{D{C{B _X _}D{C{C{C{D _ _X _ {C{B _ {C{B _{C{D _{C{D _{BX _}BXXaҜX ?&*N{F{EoF*0{C{D{C{B _X _}D{C{C{C{D _ _X _ {C{B _ {C{B _{C{D _{C{D _{BX _}Ba*( *r'p*0}D 4}C +{CҜX  2 +x{C{D{C _Xi]X _}D{C _ {C _{C{D _{C{D _X  2 +z{C{D{C _X i]X _}D{C _{C _{C{D _{C{D _ X ?{8{C{D{C _Xi]X _}D{C _{C _{C{D _{C{D _X ?t}B*(J*0^u-r'po: o (. s8 zto }M 5}I 5}J 5}K 5}L +b{IZ ] _{JZX ] _{KZX ] _{LZX ] _X  2*r(p* * *0^{J- r/(ps< zXi1 r{psjzXi1 rpsjz{M,(U&+ (W&**0ic _  _ ~H{Iaa ~H{Jaa ~H {Kaa~H{La abX*0 bX _X XbX _X XbX _X XbX _X +h+'   (T aXa XX2+'   aXa (T  XX2X2cҜXҜXcҜXҜXcҜXҜX cҜX Ҝ*0i _ c _ ~H{Laa ~H{Kaa ~H {Jaa~H{Ia abX*0 bX _X XbX _X XbX _X XbX _X +h+'  (V aXa YX2+' aXa (V  YX2X2cҜXҜXcҜXҜXcҜXҜX cҜX Ҝ* H!x-ML.RN8D( `hz=Skc|j9{/U?AZX_f 53eiEVmv GJBnI<C'g0t]\1pa, +PTd&}@4Ks;>[#Q")yq~ ruo7bwO$26^lW%:Y*Fn D%.(> H*( *r8p*{N- s }N{No *2{No *2{No *{N- ro(ps< z{N{N{No o o *( *0Au,to}S{S(e*r(po: o (. s8 zr(p*0${QX _}Q{P{Q{RX _}R{P{Q {P{Q{P{R{P{R{P{P{Q{P{RX _a*0Xi1 r{psjzXi1 rpsjz 8{QX _}Q{P{Q{RX _}R{P{Q {P{Q{P{R{P{RXX{P{P{Q{P{RX _aҜX ?U*6{S(e*0}S}Q}R{P-~O4}P +{PҜX ~O2   +K _{P XX _ {P {P {P{PXi] X ~O2*. O*( *( *u-r(po: o (. s8 zto(w}U*rp* * *0M{U- rO)ps< zXi1 r{psjzXi1 rpsjz{U(r**bb _X _X*>dҜXҜ*0E- ~WY+/- ~WY+!Z ~V_dY2+X~V_*0G(o X(o X(o X(o 8%X(q %XX ~V_ %XX ~V_  %X(q a  a %X(q X ~V_ %X(q X ~V_ a a a a X?N%X(q(p%XXX(p%XXX(p (qX(p*045 i/4 iiYi(9  +Z(oX 2 +k _/  Y_ b Yc`~V_+C _3  Y_ b Yc`~V_+  Y_ b Yc`~V_ X 42*0Wd/* ~W[ ~W] +/ [  ]ZX~V_ 3* [ ] ZX~V_ 3Y~V_*&e~V_*0445%X(t %X(u %X(u %X(t Y% Y%Y%Y%8%X %X Y%Y%%X(t %X(u %X(u %X(t Y% Y%Y%Y%X?\%X %X Y%Y%%X(t %X(u %X(u (t Y% Y%Y%Y%*f,(s*(s(v*V V W*F_d Y_b`*j _bj _dZnai*0Cd(z (z (z a aa a(ya a(ya (ya*0Z~\ _ _~\c _ _b`~\c _ _b`~\c _b`*0Wi[ ... r)ps8 zX}a{aXsm   +Cc_ _ X _b` X _b` Xb`(n X X i2{aXb+xYcY_(o ]- (y(|~^[Ya+1]3 (|c_YcY_(o a(n X2-?+0+ (o ({(n X2X{a2*( *0@,u -r)po: o; (. s8 zo(}}b}g*r?p* **0r{b- r*ps< zXi1 r{psjzXi1 rpsjz({g,{b(+ {b((**0 %X _}c%{c%X _b`}c%{c%X _b`}c%{c%X b`}c%X _}d%{d%X _b`}d%{d%X _b`}d%{d%X b`}d%X _}e%{e%X _b`}e%{e%X _b`}e%{e%X b`}e%X _}f%{f%X _b`}f%{f%X _b`}f%{f%X b`}f*0 %X {cҜ%X {ccҜ%X {ccҜ%X {ccҜ%X {dҜ%X {dcҜ%X {dcҜ%X {dcҜ%X {eҜ%X {ecҜ%X {ecҜ%X {ecҜ%X {fҜ%X {fcҜ%X {fcҜ%X {fcҜ*0T2%{c(o a}c%{d(o a}d%{e(o a}e%{f(o a}f 8q~_{c _~_{dc _(ya~_{ec _(ya~_{fc _(ya(o a ~_{d _~_{ec _(ya~_{fc _(ya~_{cc _(ya(o a ~_{e _~_{fc _(ya~_{cc _(ya~_{dc _(ya(o a ~_{f _~_{cc _(ya~_{dc _(ya~_{ec _(ya%X (o a~_ _~_c _(ya~_ c _(ya~_c _(ya(o a}c~_ _~_ c _(ya~_c _(ya~_c _(ya(o a}d~_ _~_c _(ya~_c _(ya~_c _(ya(o a}e~_ _~_c _(ya~_c _(ya~_ c _(ya%X (o a}f{aY?~_{c _~_{dc _(ya~_{ec _(ya~_{fc _(ya(o a ~_{d _~_{ec _(ya~_{fc _(ya~_{cc _(ya(o a ~_{e _~_{fc _(ya~_{cc _(ya~_{dc _(ya(o a ~_{f _~_{cc _(ya~_{dc _(ya~_{ec _(ya%X (o a~\ _ _~\c _ _ba~\ c _ _ba~\c _ba(o a}c~\ _ _~\ c _ _ba~\c _ _ba~\c _ba(o a}d~\ _ _~\c _ _ba~\c _ _ba~\c _ba(o a}e~\ _ _~\c _ _ba~\c _ _ba~\ c _ba(o a}f*0d2%{c{a(o a}c%{d{a(o a}d%{e{a(o a}e%{f{a(o a}f{aY 8q~`{c _~`{fc _(ya~`{ec _(ya~`{dc _(ya(o a ~`{d _~`{cc _(ya~`{fc _(ya~`{ec _(ya(o a ~`{e _~`{dc _(ya~`{cc _(ya~`{fc _(ya(o a ~`{f _~`{ec _(ya~`{dc _(ya~`{cc _(ya%Y (o a~` _~`c _(ya~` c _(ya~`c _(ya(o a}c~` _~`c _(ya~`c _(ya~` c _(ya(o a}d~` _~`c _(ya~`c _(ya~`c _(ya(o a}e~` _~` c _(ya~`c _(ya~`c _(ya%Y (o a}f=~`{c _~`{fc _(ya~`{ec _(ya~`{dc _(ya(o a ~`{d _~`{cc _(ya~`{fc _(ya~`{ec _(ya(o a ~`{e _~`{dc _(ya~`{cc _(ya~`{fc _(ya(o a ~`{f _~`{ec _(ya~`{dc _(ya~`{cc _(ya(o a~] _ _~]c _ _ba~] c _ _ba~]c _ba(o a}c~] _ _~]c _ _ba~]c _ _ba~] c _ba(o a}d~] _ _~]c _ _ba~]c _ _ba~]c _ba(o a}e~] _ _~] c _ _ba~]c _ _ba~]c _ba(o a}f*c|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-TR j068@|9/4CDT{2#=L BN.f($v[Im%rdhԤ\]elpHP^FWث XE,?k:AOgst"57unGq)ʼnobV>Ky xZݨ31Y'_`QJ -zɜ;M*^//qSSh,@ `yȶ[[jjFgr99KJJޘLL԰XXJk*OCCŚMMf33UEEPPx<!KKa pp|>>BqffHHaaj55_WWiX:''8+"3iip3-<" IUUP((xzY  e1BBhhAA)Z--w{˨TTm,:QP~AeS:'^;kEXK 0UvmvL%O*&5DbޱZI%gE]/uLFk_mzRYԾ-Xt!Ii)Du‰jyxX>k'qݾO f}:cJ1Q3`bSEdwk+pHhXElR{s#rKWfU*(/{70(#j\+yNie4bĦ4.SU2u 9@`^qnQ>!=>MFTq]o`P$ֽ闉@CgٞwB[8yۡ| G|B 2+HplZrN8V=6-9' dh\![T$6.: gWOa ZwKi⓺ *<"C ǭ-WuLݻ`&\rDf;[~4C)v#ܶhc1Bc"@ J$}һ=2)m/Kܲ0 Rw+lpHGd"Ġ?V},"3IN8ʢ 6ϥz(ڷ&?,:Px j_̛T~Fbظ.9^ï]iГ|o-%Ȭ;}cn;{&x nY욷One~!Jo6 )|1*?#1ƥ05ftN7ʦа3JAP/vM֍CM̪MTߞѵLj,FeQ^5]ts A.gZRV3mGa7 zY<Ω'a5zG8$4,£@_r% ( \ 4%0(> ]5%1(> ^ 5%2(> _ 5%3(> `*( - rO*ps zo1 re*ps8 z}h}i*0< {hor*p{iZ5r5p(p *{i*6{ho*>{ho*05{ho4 {ho&{i(9 {i*2{ho*2{ho*j5}o(o*0l5}o({k}k{l}l{m}m{n}n{o{o{oi(9 {p}p*rp**0^{o%{p% X}p _X _b`X _b`X _b`{p3o*{p1o{on_i{o di*ҜXdҜXdҜXdҜ*0N({k({lX({mX({n X(o*0V( #Eg}k }l ܺ}m vT2}n}p + {oX {oi3*F_b Y_d`*&_f_`*&_f_`*aa*f`a*0 2{k {l {m {n  (X{oX xjX~q(X  (X{oX VX~r(X  (X{oX p $X~s( X  (X{oX νX~t(X  (X{oX |X~q(X  (X{oX *ƇGX~r(X  (X{oX F0X~s( X  (X{oX FX~t(X  (X{oX ؘiX~q(X  (X{o X DX~r(X  (X{o X [X~s( X  (X{o X \X~t(X  (X{o X "kX~q(X  (X{o X qX~r(X  (X{oX CyX~s( X  (X{oX !IX~t(X  (X{oX b%X~u(X  (X{oX @@X~v(X  (X{o X QZ^&X~w( X  (X{oX ǶX~x(X  (X{oX ]/X~u(X  (X{o X SDX~v(X  (X{oX X~w( X  (X{oX X~x(X  (X{o X !X~u(X  (X{oX 7X~v(X  (X{oX X~w( X  (X{oX ZEX~x(X  (X{o X X~u(X  (X{oX X~v(X  (X{oX ogX~w( X  (X{o X L*X~x(X  (X{oX B9X~y(X  (X{oX qX~z(X  (X{o X "amX~{( X  (X{oX 8X~|(X  (X{oX D꾤X~y(X  (X{oX KX~z(X  (X{oX `KX~{( X  (X{o X pX~|(X  (X{o X ~(X~y(X  (X{oX 'X~z(X  (X{oX 0X~{( X  (X{oX X~|(X  (X{o X 9X~y(X  (X{o X X~z(X  (X{oX |X~{( X  (X{oX eVX~|(X  (X{oX D")X~}(X  (X{oX *CX~~(X  (X{oX #X~( X  (X{oX 9X~(X  (X{o X Y[eX~}(X  (X{oX X~~(X  (X{o X }X~( X  (X{oX ]X~(X  (X{oX O~oX~}(X  (X{oX ,X~~(X  (X{oX CX~( X  (X{o X NX~(X  (X{oX ~SX~}(X  (X{o X 5:X~~(X  (X{oX *X~( X  (X{o X ӆX~(X %{kX}k%{lX}l%{mX}m%{n X}n}p+{oX{oi3*0mq rstu vwxy z{|} ~*:}( *0}( o}o}o}o}o}o}o}o}o}o}o}o}o}o}*s*2{(*6(}*{*v/r*pr +ps z}*{*"}*{*"}*2{(*6(}*{*"}*Z{-*{o *2{(*6(}*2{(*6(}*{*"}*{*"}*{*"}*Z{-*{o *2{(*6(}*{*"}*{*"}*0u> -*{~(-*{."o  {3. *{/*{,{o -*{,{oo -*{,\o  ,R{o$ +#o% t  oo* -o& -u.,o' {,{o o -*{,1o ,%+{, -*X 2{9~~o"-*(({oq / o/*o+'o% t { o2o,+ o& -u.,o' -*{,d~qo"  -* (($ {o  o'o  o&o  (r 0  (r /*{,{o o -*{,{o o -*{~o(-*{,{(o -*{,{(oo -***04B,o **F, oH t **2,s* **2o (v*0$-*o" -*, ok(**2{(*6(}*0@{(((a ( , o" a ( , o" a *0_3*ux -*{{(,8(o(,%(o(R,(o(**(*s}( o -r+prC+ps z}}}*{*{*F{oo*0;{o ,op**0{o(# {o ,op+  ,uT-{o ( +I{oo~_o? -rM+po? -r}+po? , 4s  o{s1s -r+ps zr+ps zr ,ps z*( u00D{u ,{jo\ &oo (   rU,p(( s, z*000o({(}s}*2{o*0{o({ otK {oo o(o ~  o(o(ot o so{oo  io(  (  r+p s z r+p s z * u( *N~o(*0{s  ~%o o s  sUo r,pss|o o s  so o s  o s s* * **{*"}**sP zsP zsP zsP zsP zsP z0%X  + oD X 2*2ioE *(Q *(}}}}*6{oD *>{oE *{oV {o {o {o (*r( }}}*{*{*F{oH t*0{iX  / oD +c 0( Y c _ XoD oD +3 oD coD coD coD oD {, {`oD + {oD {{ioE *04 ҜҜ**(*B((*>{ _*>{ _*0F,u,t*uK, tKs*rpo: o; (. r3ps z0(qo/r;po5(( s8 zo o& &o% (}8o% (-  o2   E%4H+U(ToX}+\(}+M(}+>(o }+*(}+r,po2 5(( s8 zo& :T*(q}}}}}}*{*{*{*{*{*{*07s] 7 {o^{,#7 {sVs9 o^{,7 {s9  o^{,!7{s9 o^{,'7{ss9 o^{,!7{s9 o^s*6((*0A,u,t*uK, tKs*r,po: o; (. s8 zV(q}}*0Y(qo.r;po5(( s8 zo(SoY}o(SoY}*{*{*0*G7 (sV(sVs*(*o *2o o" *0W1  +/,Z_c,Z_c _ +,  _ +Y /-* +X b% _-Y*0I  + Z_b_- Y Y /4  +  Z_c _Ҝ X 2*0,u,t*u,1to  iY4 iY(9 s*u,to5 (*rcpo: o; (. s8 z2o5 (*0 ( 4 }}*V( }}*:( }*N( om}*{*{*03%  +{ _Z_b` X {i.3*06(iX4 (Ҝ(iY(9 o!*0{ (6 {(a*0.u -*{{3{{(**0Rr/-pss (m  +/ ~ d_ot &~_ot &X i3o *0123456789ABCDEFb@%4(> *N(((*Noo(*0j,u,t*u$,(S oXo s!*u,( s"*rpo: oO (. r3ps z(q,3 sU}*r3-p5(( s8 z:(q}*>{u$*Z{t$oXo*2{t*2{op*6(, ((*0F,u,t*u, ts-*rpo: o; (. r3ps zV(q}}*&()*{*{*(qo2 }{-(}*(}*N{{s9 *0u~I  sL rw-poM &oM &{-r-p{o (0+r-p{o (0r-poM &oM &o *0LHr'p oM &oM &r-poM &oM &oM &oM &oM &oM &*6((2*0A,u,t*uK, tKs3*r-po: o; (. s8 z0p(q +\o(-  o2  E%+0('}+!(s}+ (}X o3*r(q}}}*{*{*{*0I7s] {,7 {s8 o^{,7 {s9 o^{,7 {s9  o^s*0~I  sL r+.poM &oM &{,rU.p{o (:{,ry.p{o (:{,r.p{o (:r-poM &oM &o *0LHr'p oM &oM &r-poM &oM &oM &oM &oM &oM &*6((<*0Cu,t*uK, tKs=*rpo: o; (. r3ps z0 (qo2 o 1r;po5(( s8 zo(S}o( }o(x}o({}o(S}o(H}o(} +Jo u,o(}+"uK-u,o(}X o2*{*{*{*{*{*{*{*{*{*0I7 {{{{{{{s] {,7 {o^{,7 { o^s*0Fu--t*uK, tKsJ*rpo: o; (. r3ps z6((H*0O(qo.r;po5(( s8 zo(}o(}*V(q}}*{*{*0 G7 {{s*( *0uK9ss r'p(. u,r.poM &+"uN,r.poM &+ r.poM &~oM &tKo +M o% t7 ,uT,"oM &r9poM &~oM &+op(PoM & o& - u.,o' o *u9sL r'p(.  oM &u, r.poM &+ r.poM &t o2 (u oM & ]ot &o3 - r/poM & ~oM &o4 ,# oM & r%/poM & ~oM &+ o5 (PoM & o *u9sL r'p(. oM &r1/poM &~oM &t:o+No% t7-&oM &r9poM &~oM &+op(PoM &o& -u.,o' o *u 9sL  r'p(.   oM & rA/poM & ~oM &t:o+No% t7  -&  oM & r9poM & ~oM &+   op(PoM &o& -u.,o'  o *u,?/rQ/ptor5p~(v *ur,Dru/ptro6r5p~(p *u$,?r/pt$oXr5p~(p *ut,Fr/ptoi5r/p~(p *u,Fr/ptoi5r/p~(p *u,cr/ptoi5r0pto5r/p~(p *u,?/r 0pto r#0p~(v *u,?/r)0pto r#0p~(v *u,?/rA0pto r#0p~(v *u%,?/rc0pt%o r#0p~(v *u,?/r0pto r#0p~(v *u,?/r0pto r#0p~(v *u,?/   r0p to  r#0p ~ (v *u,?/!!!r0p!to!r#0p!~!(v *u,tto)( /"""r0p"to(##r0p(w "r0p"(0   iox "~"(v *o ~(I *(oZ [h[/0Hu<,r0pt<(P*u7,r0pt7op(P*r0po (. *Fr0pop(P*.~I *0Cu,t*uK, tKsW*r1po: oO (. r3ps z(q~}~}~}*r(q}}}*0(q~}~}~} +dot o2  E +-(z}+)(z}+(z}+ r'1ps8 zX o3*{*{*{*0I7s] {~o -7 {s9 o^{~o -7 {s9 o^{~o -7 {s9  o^s*0C~~0s~~~s~~4s>s~*0Fu--t*uK, tKs^*r1po: oO (. r3ps z0WF(qo o& &o% t}o& &o% t$}o& ,o% t$}*~(qs>}sU}*2{o*2{oX*Z{, {oX**0FQ7 {{s] {,7 {o^s*0v(qo o& &o% tK o~o ,~os}+ s}o& &o% tKs}*{*{*0 G7 {{s*0Fu--t*uK, tKsi*r1po: oO (. r3ps z0D(qo.rEprps zo(}o(S}*~(qs>}sU}*2{o*2{oX*0 G7 {{s*0yr?1psrY1psrs1psr1psr1psr1psr1psr1ps*( *~(qsV}sV}*0D(qo.rEprps zo(S}o(S}*2{oY*2{oY*0 G7 {{s*6((v*0F,u,t*uK, tKsy*rpo: o; (. r3ps z&(x*(q- r2ps z}}*(qot}o1ot(s}*{*{*0DQ7 {s] {,7 {s9 o^s*~r72psr]2ps*( *0F,u,t*uK, tKs*rpo: o; (. r3ps z0r(qo YE+8o(}*o(l}o(}*r;po5(( s8 zV(q}}*0IQ7s] {,7 {o^7 {o^s*{*0={o3  +{o(X {o2*0rps~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~r2p(( s~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s~r2p(( sr2ps*( *0K,u,t*u,tos*rcpo: o; (. r3ps z2o5 (*0.(}(& r2poJ (. s8 z* Ef(r3p(y }*r((0 iox }*{*0{{oz Yo{ Z3${{oz Yo| r93p(. *{oz Y {o{ -.+3O/ {o| rM3p{o| r-p{XoK (v *{oz Y {o{ -.+3){o| rM3p{oK rU3p(} *{((. *0p+ (~ (o ( /- e <[ <] rM3p@(r-p((p *z /r]3p5(( *(u *0{  ra3po ,A(,.oz .o YY re3p (r3p(I 8r3p 8{-o 0{+o 1K(  (,2rM3po Y.o Yre3p(r3p(I +>r3p +6(,(oz Y.o Yre3p((. +r3p (*0"sL  + fot &X 2o *0( ( -*( *J{.o *F(0 {o2 *>(o!*0u -*{{o? *2{o" *0_,u,t*u,tos*u,to5 (*rcpo: o; (. s8 z2o5 (*0S( - r3ps zi[@  +ZbZX _`ѝX i3s_ }*r( - r3ps z}*{*0u -*{{o? *0E{o iZ4  +ZcҜZXҜX i3o!*:(q}*V(qs9 }*:(q}*0i,u,t*u&, t&s*u, ts*u<, t<s*r3po: o; (. s8 z>{u*{u,{t(*{*2{op*0HuK,tKos*uL, tLs*r;4po: o; (. s) z~( }ot$}*{*F{ot;*Z{otLs1*0[}{o}{u,4{to* -"{to+ t; }**0w{- ru4ps) z}{-{o}{u,5{to* 3"{to+ t; }**0@{,{- r4ps) z{-{o}{t;*V(q}}*(qo(}o}*6((*0A,u,t*uK, tKs*r5po: o; (. s8 z{*{*0 G7 {{s*0C(qopu,sU}+ sU}}}}*0O(qot$}o(}o({}ot}*0A,u,t*uK, tKs*rQ5po: o; (. s8 z{*{*{*{*02G7 {{{{s*0G~~ ~!~"~#~$~%*( *6((*0Cu,t*uK, tKs*r1po: o; (. r3ps z0(qo(S}&}'}(o1%o( }'o(}(*o1)o u, (}(*( }'*N(qsU}&*j(qsU}&}'*(qsU}&}'}(*2{&oX*{'*{(*0\I7 {&s] {',7 {'o^{(,7 {( o^s*N4}1(**N4}1(**:{1o!**u* *2s0*(*"(*u-uS,oD *(*2s2*2o5 (*0,u,t*u,to5 (*uK,Es tKo +o% o &o& -u. , o' s*rcpo: o; (. s8 zE`r(- r3ps z}3*0,(om}3 r5po (. s8 z*06{3s * *{3*2o(*0u -*oo(*0&{3( r/-p(0 iox (. *( *J( s}4*2s}4*o0rwprps z{4sVo*6{4o*J{4so*J{4so*6{4o*0+{4(vo r5po (. s8 z* 0J}7(}5&r 6prO6ps z{5(}6{4{6o*&(*0Li{4o {5{7( rYpsz( rp sz* # 0 < b{6sss*(*N(q(l}8*z(qsssn}8*z(qsssn}8*F{8ooo*05{8op o7  +oX o3*2{8op*( }E}F}G}H}I* L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}   S S  3 3  s s    K K  + +  k k     [ [  ; ;  { {     G G  ' '  g g     W W  7 7  w w     O O  / /  o o     _ _  ? ?     @ `P0pH(hX8xD$dT4tC#c     0 @D%5(> @ A~@~P   sB~A~Q sC~R sD*( }Lo ], ru6ps8 z4}J*0Q% {J%{K% X}K{K{Ji3${L{J{Jio"  }K*01/ r$ps8 z {Ji{KY 1x{J{K(9 {L{J{Jio" X }KYXX{Ji]Y {Lo" X YX,"{J{K(9 %{KX}K*.(*.(*( }P}Q}R}S7s]}N*0G{N7 s`o^*>{O`}O*0{I7 {MsUs] {Nob1!7 {Nss o^{O,7 {Os o^ss*0{Q{R{So.}Mr6p(( {Po o o((4 r6ps zs 6}Mo (oJ ((s s &re7ps z*(1+\0uu6 0N(((*v~}T~}U( *J{T{Us*&}U*&}T*b(oG t}V*0s Ws Xs) Y~Wr7p~o ~Wr7p~o ~Wr7p~o ~Wr8p~o ~Wr)8p~o ~WrU8p~o ~Wrm8p~o ~Wr8p~o ~Wr8p~o ~Wr8p~o ~Wr9p~o ~Wr59p~o ~WrQ9p~o ~Wr9p~o ~Wr9p~_ o ~Wr9p~_ o ~Wr9p~` o ~Wr+:p~` o ~WrM:p~a o ~Wr:p~a o ~Wr:p~Qo ~Wr:p~Qo ~Wr:p~o ~Wr:p~o ~Wr ;p~*o ~Wr);p~*o ~WrE;p~-o ~Wre;p~.o ~Wr;p~/o ~Wr;p~0o ~Wr;p~ o ~Wr;p~ o ~X~r7po ~X~r8po ~X~rU8po ~X~r8po ~X~r8po ~X~r59po ~X~r9po ~X~_ r9po ~X~` r+:po ~X~a r:po ~X~Qr:po ~X~r:po ~X~r:po ~X~*r ;po ~X~-rE;po ~X~.re;po ~X~/r;po ~X~0r;po ~X~ r;po ~Y~*o~Y~-o~Y~.o~Y~/o~Y~0o~Y~Qo~Y~o~Y~o*(j ok ~Wo ,~Wo t*s*~Xo ,~Xo t/*o*~Yo,s|*~0s~*B~Wo s*( *0:oo o  +o,o oX 2*( *( - r<ps zoH t}Z*0\( - r<ps z2i1 r'<ps z2Xi1 r5<ps z4}Z{Z(9 *F{ZoH t*zi 0iZ+ (*r 0Z+ (*>(}[*J(}[*{[*6i(*0G( - rps z- rC<ps z}\4}]{](9 *F{]oH t*{\*:( }^*{^*jo+o(v}_*V(%(!}`*{_*{`*0*- rm#ps z( -r$prm#ps z*>~h('*6((*0j( - rI<ps z- rU<ps z- rY<ps z- r]<ps z}a}c}d}e(}b*{a*{c*{d*{e*2{b(*03*u -*(/*0`{a{ao ,K{c{co ,8{d{do ,%{e{eo ,{b{b(**{ao" {co" a{do" a{eo" a{b(a*Js}f(d**(e**(e*0{fo4 4  {f{{io{f{{io{fo&i0+i  (9  X  Y, {fo{fio8{*"oo*0[(4 (*0%[[X(4 ss*0([[X(4 ( s*0[(4 s* %)+/5;=CGIOSYaegkmq %379=KQ[]agou{  #-39;AKQWY_eikw)+57;=GUY[_mqsw045%7(> 5%8(> 5%9(> 5%:(> 5%;(> 5%<(> 5%=(> 5%>(> 5%?(>  5%@(>  5%A(>  5%B(>  5%C(>  5%D(> 5%E(> 5%F(> 5%G(> 5%H(> 5%I(> 5%J(> 5%K(> 5%L(> 5%M(> 5%N(> 5%O(> 5%P(> 5%Q(> 5%R(> 5%S(> 5%T(> 5%U(> 5%V(>  5%W(> !5%X(> "5%Y(> #5%Z(> $5%[(> %5%\(> &5%](> '5%^(> (5%_(> )5%`(> *5%a(> +5%b(> ,5%c(> -5%d(> .5%e(> /5%f(> 05%g(> 15%h(> 25%i(> 35%j(> gj(h~gi5i~gij +8~g   +  Z X i2~i~jj(X ~gi2*0RY  09s o~ho o,> o,8s  8~j o o -1].&ZXj(o X~i ]~g +1  ]  ,  c3~ho 8xXi2 X ~gi?`o@Do97o~ho o91Yo9    *0G*~io ~i(= ~io~ho -o~ho -*0#os o2o0*( *9}n9}o9}p( }q*ra<p* **0J,u- rq<po: o; (. rps z}r}qt o(F*0g{q-(@rp(. s< zXi1 r{psjzXi1 rpsjz{r- (H*(G**0B{o(M{o(M{o(M{o (M*0({n(M{nX(M{nX(M{n X(M +Y{n9%q9~ma9{n{o(J{n(K{n(I{n(LX 2{n9%q9~ma9{n{o(J{n(N{nX(N{nX(N{n X(N*0T{n(M{nX(M{nX(M{n X(M{o{p{oi(9 {p~l(J +Y{n{p(J{n9%q9~ma9{n(K{n(I{n(LY 0{n{p(J{n9%q9~ma9{n(N{nX(N{nX(N{n X(N*0/9%q9ff_a99%q9_a9 9%q9aaa99%q9ff_a99%q9_a9*0a (O(Oaa 9%q9a99%q9a9 +9%q9a9X 2a (O(Oaa 9%q9a99%q9a9*(O(O(O*(O(O(O*0;%Xb%X _b`%X _b` _` *%XdҜ%XdҜ%XdҜҜ*F_b Y_d`*6lM/^c5j0%9 l9%k(> m*#O6yoR` {5.KWw7JX) k]>g'A}|fG-Z3cqI[&24Hz_ hT"ds@=+vjPE0?Ue/Mub%Yr9L^x8a!CQm ~$;N<,nVD*S l1tF:i pB(\0  5%l(> x Ky Kz K{ K| K} K~ K K D~ 8~x b(T b(T a b(Ta~y (S~z (S~{ (S~| (S~} (S~~ (S~ (S~ (SX  ? *0&% K}@4} D}K}K}K}K}K}( {j 8YZ {~y!_~zX!_a~{X!_a~|X!_a~}X n_a~~X j_a~X j_a~X j_aX  >U*j8bj0baj(baj bajbajbajbaja*0 j j2 a *0N K}@4} D}K}K}K}K}K}( {{{i(9 {{{i(9 {}{{{i(9 {{{i(9 {{{i(9 {{{i(9 {{{i(9 {{{i(9 *r<p*@*02(a +{ZX(\X 2(Y(W*0}{{i(` {{i(` {{i(` {{i(` {{i(` {{i(` {{i(` *0K +{{Z([X {i2(]}{{i(` *06n j_8bXn j_0b`Xn j_(b`Xn j_ b`Xn j_b`Xn j_b`Xn j_b`Xn j_` *0% +X8ZY?_c j_ҜX 2*0J +*{{{{%aX 2 8 8{j{K%qK~y{_8ci _aK{K%qK~z{Y_0ci _aK{K%qK~{{Y_(ci _aK{K%qK~|{Y_ ci _aK{K%qK~}{Y_ci _aK{K%qK~~{Y_ci _aK{K%qK~{Y_ci _aK{K%qK~{Y_i _aKX ?Q{{{i(9 {K%qK{aK 8{ { { K%qK~y{ _8ci _aK{ K%qK~z{ Y_0ci _aK{ K%qK~{{ Y_(ci _aK{ K%qK~|{ Y_ ci _aK{ K%qK~}{ Y_ci _aK{ K%qK~~{ Y_ci _aK{ K%qK~{ Y_ci _aK{ K%qK~{ Y_i _aK X ?K{{{i(9 X  >,+2{K%qK{{aaKX2*{{%{X}{{i3(Z(_*0E1 {iY +1{ _~XX c { _hY /*j+(^XY0*0^(b {%{% X}4%q4 `ҁ4{{i3(Z{ 1+(^{-+(^{ 1{ i(9 (Z*0*^ 4  +{ _ҜX i2*@* }PK}( 4}oi*0 }PK}( {i4}{{{i(9 {}{}{}{}{}{}{}{}{}{}{}{{{i(9 {}*0M{%{% X}{{i3{(j}%{jX}*0~+(fXY{,<0+6(j{iX{iY%{{ijX}{i0+(fXY0*0A(l{b {  (f+(f{-(m(n*0X%j}j}} + {X {i2} +{jX {i3*0{%{% X} _j8bX _j0b`X _j(b`X _j b`X _jb`X _jb`X _jb`X _n`{3(n*0K8dҜX0dҜX(dҜX dҜXdҜXdҜXdҜXҜ*{!1,%{{=dX}%{!_}*{1(n{{*0(l +C{{Y(t{YX{Y(sX{YXX O1{ { { {{{{{  8Q(r(oX~ X{ %X XXX(q (pXX(r(oX~ X{ %X XX X (q(pXX (r (oX~ X{ %X XXX (q(pXX(r (oX~ X{ %X XXX (q(pXX(r (oX~ X{ %X XXX(q(pXX (r(oX~ X{ %X XX  X (q(pXX (r(oX~ X{ %X XX X (q (pXX (r(oX~ X{ %X XX X(q (pXX  X   ?%{X}%{X}%{ X}%{X}%{X}%{X}%{X}%{X}}{(` *&_f_a*2__a_a*z$bd`b"d`ab'd`a*z2bd`.bd`ab)d`a*Z?bd`8bd`ada*^-bd`b=d`ada*{*"(ט/Be#D7q/;Mۉ۵8H[V9YO?m^BؾopE[N1$} Uo{t]r;ހ5%ܛ&itJi%O8GՌƝew̡ $u+Yo,-ntJAܩ\SڈvfRQ>2-m1?!'Y= % GoQcpn g))/F '&&\8!.*Zm,M߳ 8ScTs ew< jvG.;5,rdL迢0BKfpK0TQlReU$* qW5ѻ2pjҸSAQl7LwH'Hᵼ4cZų 9ˊAJNscwOʜ[o.h]t`/CocxrxȄ9dnj(c#齂lPyƲ+SrxqƜa&>'!Ǹ}xnO}orgȢ}c ?G5 q}#w($@{2 ˾L*~e)Y:o_XGJDlbPK%m(> *0 4} 4} 4} 4}} 4}s} 4}4}D}D} 4} 4} 4} 4}(  +{ 4X 2{r<p(so(*0 (z{{{i(9 {{{i(9 {{{i(9 {{{i(9 {{{i(9 {{{i(9 {{{i(9 {{{i(9 {}{}*r<p* *0Y{%{% X}{{i3 {({(}%{jX}*0+(~XY{,c0+]{{i(9 {({({iX{iY%{{ijX}{i0+(~XY0*0Y%  +H{%X {%X X{%X X{%X XX 2{*0; +{XaҜX 2(9 {(9 *{so{o&*0o{({{{a{a{a{ a{ah{{(9 {(*0{ (9 {{oA {{oA  +{{{aҜX  2{({{( 8{(  +{  { aҜ X  2{((}+#{{{aҜX 2{({Z{Z(X ?Z+{(X 2+#{{{aҜX 2{(+#{{{aҜX 2+{(X=2{{{i(9 *0A{jZ{(+(~{-{({(*r({oA ( *0j}}{{i(` {{i(` {{i(` {{i(` {{i(` {{i(` {{i(` ~{oA *0?1  +-{ _ _XX {Ҝc X {i3*0KX8cҜX0cҜX(cҜX cҜXcҜXcҜXcҜҜ*00 +#ZXb _Z _`hX i[2*0' +ZXcҜZҜX i[2* *b 4%n(> *0s ~~o 5o ~~o 5o ~~o 5o ~~o 5o ~~o 5o ~~o 5o ~~o 5o *0N(L- rY#ps z~o -r<prY#ps z- r=ps z}}*0d(K ~{o 5 {sos/ {o[4 {  io& s*0l4u,!t o8 }o9 t +s }t u- r%=ps8 zt}{o}*0O{o0oY {sY("}{o1{{o0o*0- ru=ps z- r}=ps zo{o - r=ps8 z{o~{o0ooA{{o0oo{o0o*( *0~o~o~o~o~o~o~o~ o~\ o~[ o~] o~o~Qo~*o~o~ o~ o~*o~-o~.o~/o~0os) s ~~o~~o~~o~~o~~o~~o~~~o ~~~o ~~~o ~~~o ~~~o *2s (*s }s }s }s }( }*0 u>,#t>o- r=ps8 z~ 8u, ~o? - r>ps8 z~ +euh,Bth o r#p(l ,~ +:~o t/ -&ri>ps8 zu,~ + r>ps8 z*~o, ss|*s~0s~*07s o o ,oH o *F, oUs**J{( of *J{( of *0io o$ +/o% t {ou((s9 o &o& -u. , o' r7?ps z* ;H[[ 0>o8o$ +o% {o &o& -u. ,o' * ,2{s *Js }(*Ns }(*0 'H( {sso &*0 0H( {ssiso &*0 %H( {so &*&(*0(7s] 7s] {o {oS +Ko% t2 7~oPo o^7obo^o& -u.,o' , s + ~ {oS 8o% t7~oo o^7 {oo^<ry?ps zr?ps zr?ps z r@p s zo& :^u.,o'  {oU , {(   {oU , {(   ,.sB   o r7@ps z oF s  s6s  sst~s6s*X0XL!0L0uL?/LNk 0:~(*foYs (o*.~V*:(}*>{o*6{o*:(}*0#{oM ra@p(( s) z*/0!{oL ra@p(( s) z*/( }}}}}*0D( }}}}}}}}*{*{*J{ss~*{* *Z{s~0s~*{*{*{*0(s~0s~ (( ~{o  r p~{o (I ~ o ~o ,3so ( {{{oH o {o{-+ {o,oT  ~o  sM{o  , r pol +sB   o  oF  {s5 oK  ioMoNs> {o ooH o {-+ {o{o(o ((_ oe oc oXs:s  sJ *0*^oz 4  +o{ ҜX oz 3*.(*B((*05{i@  +{ _ѝX i3s_ *0%4 cҜcҜcҜҜ**(*>((*0K6{ _jb{ _jb`{ _jb`{n j_` *0sB s  o oF *(f*0=(o }{. {@o &o }o jbo jb`o jb`o n` jZ}%{o j8b`}%{o j0b`}%{o j(b`}%{o j b`}%{o jb`}%{o jb`}%{o jb`}%{o n`}o }o }8{@o }o }o }o bo ` 4 oE s s s + o &o%- oU ~}+] oT t~u,to# }+ u,toV( }{X{i3o bo `4oE s s o + o &o%- oU ~} +;  oT t~  u, to# }{   X  {i3+r@p{5(( s, z4}{oE {YE##YEQ$Q8sX 6 }*sX sX 6  }*sXsXsX6}*{d2>{n04}sB + oD o %/oF }*r@p{(( s) z0 (*0 (}*0V(}}}}}}}} },(*{*{*{*0; {3@4 { j[ {ҜcҜcҜcҜҜ8sB (oD (oD (oD (oD sB (+ oXi3 oF icoD ioD ioE oF (oD  oD icoD icoD icoD ioD oF *{*{*{*0i{,{oH t*sB s  {+' o  r@p (( s, zXi2oF *9 B0{*{*{*0BsB s  {oD {. {3`4 {Ҝo{ j[io {o 4 {Ҝ {Ҝ o+y{3U4{Ҝ{Ҝ{Ҝo{(({((+rAp{5(( s) z{o{,{o + {ooF o *Jiho o*0(sB   + o X i2oF *09{  +' u,toV( }*X i2*0sB s  o oF *( *~(sX}sX}*~(sY}sY}*2{oZ*2{oZ*r?Ap*0( & * 0! {{o *0(o }o }o }o }%{o j8b`}%{o j0b`}%{o j(b`}%{o j b`}%{o jb`}%{o jb`}%{o jb`}%{o n`}o }*(}}}}}-+}*{*{*{*{*0ksB s  4 {Ҝ{Ҝ{Ҝ{Ҝo{o {oD oF o *r(q}}}*0v(qo o& &o% tKss}+Ao% t o2 -o5 t}+o2 3o5 t}o& -*{*{*{*0`I7 {s] {,7 {s8 o^7 {s8  o^s*0Cu,t*uK, tKs*rpo: o; (. r3ps z:(q}*N(qs}*0={of  +{o(X {o2*{*:(q}*0(q7s] o o$ +P o% t/ o t/ 77ssso^ o& - u.,o' s}*\z{*6((*0_,u,t*uK, tKs*uz,tz((*rpo: o; (. r3ps z0w(qo1gour,o(}+o(S}o1*{-rGAprps zo(S}*V(q, ~ }*z(q~ }sU}*Z{, {o**Z{, {oX**0QQ7s] {,7 {o^{,7 {o^s*0]{-rAp(6r5p(^ * rAp(6rAp{oX(p *0Z(qot$oX o. rAps8 zo( }o3o(B}*V(q}}*{*{*0FQ7 sU{s] {,7 {o^sp*:( }*6{*0c{3*{.{o 3{{oK }*{{{Yo| X}*"(*Joo(*0j(qo +oo% t o2  E +-(}+9(T}+*(}+rBpo2 5(( s8 zo& -u. , o' * {{*{*{*0I7s] {,7 {s9 o^{,7 {s9 o^{,7 {s9  o^s*6((*0F,u,t*uK, tKs*rpo: o; (. r3ps z(q}}}}*0h(qo.rEprps zo({}o(}o(}o(S}*{*{*{*{*02G7 {{{{s*6 (*>(}*Fs i(*0,7s] +7 o^(#% -*2s(*6o (*:o (*0Yo 0- rABps) z*($  _ {(% <- rBps) zs _,s(*sV.YE+'s ( *s(*s(*rBps) z s @_,o s< * _,s(*,K.YE+ o s*o!*o"*o s&*o (&*0[%_ 3O o _-r%Cps) z_` b o 2  _-/ rCps z_` *0do / rCps z 3*1\_ 1 rCps) z  + o / r7Dps zb X X 2/ riDps) z2 rDps) z*0+ YE1To[h8av}M?F*8 iY4 iY(9 s*s*s*s*s*sk*s*sW*~0*s*s*s>*s*sc*s*s *s_*s1*s&*"(*"(*2o s[ *2o s*0F,u,t*uK, tKs,*rEpo: o; rEp(I s8 z0a(qo2 o1r;po5(( s8 zo(}o1o(}*N(qs}*0={o  +{o(X {o3*0G{-*{o  +{o(1X {o3*0=Q7 {s] {,7 {o^s*0F,u,t*uK, tKs2*rEpo: o; (. r3ps z0XZ(q- rps zo +o% t7 op(V&o& -u. ,o' }*$?(q- rEps zs}*0H(q- rEps z( (~-rFprEps z(\s}*0B{o  +{oop(VX {o2*{*&(8*(q- r_Fps z}, op}*0y(q- rps zo2 o1 r;po5(( rps zoopt}o1oop}*0F,u,t*uK, tKs9*rFpo: o; (. r3ps z{*{*0=Q7 {s] {,7 {o^s*"(*"(*:{3o!*.o"*( ot}ooj({}ot}*{*{*:{o+ *r(q}}} *0L(qot}o({}o1ot(} *0A,u,t*uK, tKsG*rFpo: o; (. s8 z{*{*{ *0MQ7 {{s] { ,7 { so^sp*N( s }!*0V( obs }!oc +o% t7 (f  (Po& -u. , o' *&D0=( os }! +o(f  (PX o3*0boi  {!o -{!o *u,s o &o &+t  o &{!o *0.{!o u ,t oT t*t*"(Q*07s] {!o u ,Mt oS +! o% t 7o^ o& -1 u.,o' ,7to^*--Z2{!s *07s] {!o o$ +z o% u ,Qt oS +"o% 7(f o^o& -/u.,o' 7(f o^ o& :{ u.,o' *;/j6 (W*( o -r;Gprps z}"}#*Fs i(W*0f{"o 3*(Z{"($  _ {"{#(% /v- rBps) z{"s _, s*sV.YE +s *s*s*rBps) z{" s @_,o s< * _, s*,R.YE+'sVs *sVs*sVs*o s&*  3s *o (&*~{"u,{"to*017s] +7 ojo^oY% -*0S7s] o$ +o% t7 7  o^o& -u.,o' **=fs }$( (^*0"Y  + {$o &X i2*J{$oT t7*"(_*2{$oU *2{$oU *2{$oS *j(#}%(f}(*(#}%}&}'(f}(*0c{&-*~{o" -{'*((o  +on3oo(  X i2&* * <\{(*2{%o*0{%om o s9z* F{%ooX*F{%oo*J{%o*0sL ~I  ryGpoM (joN oM &rGpoM (k oN oM &rGpoM (goN oM &{%o 9Aoo$ o& 9*rHpoM oM & o% too9oo(rCHpoM oo r#0poM &~vo ,(soN &+S~{o ,rHpoM tK(oN &+&ooM &rHpoM (RoM &oM &5&ooM &rHpoM rHpoM oM &oM & o& :o *{-V( })}**( o,os})o,os}**0_  {),{)o (( {*,{*o (( s(m  oJ sz *OO{)*{**093*u -*{){)(R,{*{*(R**05 {),{)o" a {*,Z {*o" a *( *0C - r<ps zo,rHpr<ps zuA,AtA ok  ~oospops~osVs *u,Tt o,!ooos7op+~Ps~ o sVs*u,Pto~Oo0o1o5sops~oAsVs*u>,9t> ~~0s~ o osops  *ui9 ti  or#p(l 9 o- r#Ip(Qz o,  oo  oo@4 (w (w o~ s~ ops~s>s* oo)o*o+o,o-ssu o,sX opt~+ops~os*uY9tYoh - r#Ip(Qzo(oi4+iYYXi3oh ~ s~ ops~s>s*r_Ipo: oO (. s8 z0-0o oX[  +XiYYX 2*N( se }+*0X - {+se *s {+o$ +o% o ,o &o& -u. , o' *!$Evs) }1s) }2( *0{s) }1s) }2( {,},{-}-{.}.{/}/{0}0{2s* }2{1s* }1*0 - r3ps zu -*{,,{,o -*{0,og{0o -*{.,oj{.o -*{/,ok{/o -*{-,{-oop-*{1oq 0{2oq >~o 9(( &o {1oq 1a+H o+*o,{1o,+Xi2X i/,-*{2oq 1a  +H  o  +*  o  ,{2 o, + X   i2 X  i/ , -*** s{*{,*"},*{-*"}-*{-*"}-*{.*"}.*{/*"}/*{0*"}0*6{1o*J((l(*:(}1*2{1s*6{2o*J((l(*:(}2*2{2s*0] s)  ,Ro$ +.o% u:, o+t((loo& -u. , o' *:JF(-(**F(-(**0 ( &&** E M0k oz -* rEp(.  +33*  Yo| ( 2  1*X X oz /. o % 0*0>KrIpo XoK 1"o| (,(-  (***0CKrIpo XoK 1'o| (,(-  (****0"( 2 + &&**EM0 ( &&** E M0oz -* r-p(.  83* .b Yo|  oz Y3.o 1(-*X +B Yo|  ( 2  1* . oz Y.,* XX oz /:o %  }3=}4 4}5( (*0] Y 8 _ X _ X _{3d?_oD {3b d`?_oD {3 bd`?_oD {3?_oD XX?r  E`8X _  c?_ b?_{3oD {3oD {4oD {4oD +yX _ XX _  c?_ b c`?_ b?_{3oD {3oD {3oD {4oD [Z,+X*^ . .  . **0 X+Y(, Y0Y(8{5%X ({5%X ({5%X ({5%X bc`oD bc`oD b `oD X(?NYYYY(X*b+X/ (-*0 ;oz +Yo{ (, Y0Y(8{5%Xo{ ({5%Xo{ ({5%Xo{ ({5%Xo{ bc`oD bc`oD b `oD X(?AYo{ Yo{ Yo{ Yo{ (X*0{43"{5 {5 bc`oD *{43<{5 {5 {5b c`oD  bc`oD *{5{5{5{5bc`oD bc`oD b`oD *r+X/o{ (-*({3{3iY-{3{3iY_.}4(*:( }6*{6*0{6  o *( *0s 7~7~orIpo ~7~orIpo ~7~orIpo ~7~orIpo ~7~orIpo ~7~orIpo ~7~orIpo ~7~orIpo ~7~orIpo *2o(*0@(j ok ~7o t/ - % 9~p-ms %rIp( %rIp( %rIp( %rIp( %rIp( %rJp( %r)Jp( %rGJp( p~p ( ,hE +6+?s*s*s *s*s*ss*sbs*s s*($ ,s*roJprJp(I s3zZ~7oo t/*:( }8*2{8o*V}9{8o*{9- rJps< z{8o*{9, rJps< z{8o*(;*"(<*&(=*(;*"(<*&(=*>(}:*2{:o *( };}<(( }?((}>**(*0T}=}@o , os5  {>oK rpsz{?o}A*&4 uf{@3(*(* 3(+ 3{A .(+(}A*F ( (*f{>oL{?o*0B{@3 + (X i3*{>ioM{?io*0@%{@3X  + (X 3*{>oM{?o*{@{<{;{=oss *0 (  j[ 4{@ҜcҜcҜcҜҜ {>ioM{?io{>oN {?(  4  {;. {;+-(+({@{=o{;{< jZss*R{BsVo &*R{Bs& o &*V{Bso &*R{Bs o &*R{Bso &*R{BsUo &*Z{Bsvo &*Z{B svo &*Z{Bsvo &*R{Bso &*- rKps z{Bso &*R{Bs o &*^{Bs o &*{B~( o! t s'*Js }B( *( o-r)KprWKps z}D}C*{C*{D*b(oG t}E*(+ *"(, *&(- *( *(*"(*&(*( - rI<ps z}F}G}H}I*{F*{G*{H*R{G- {H**{I*0H3*u -*(,o*{G{Go ,{H{Ho **(,*{Go" {Ho" a*"}K*0-{J-$% ( {J- s}J( *%2(*0(,4*{G( (o( {I,iX4 o-+Ҝ+1(o( iX iX4  iXoA oA *(,*o- {Fo*o{J{Ko*.(*(,,-, rmKps8 z*J(oo*0(,*o,*{G{Go ,&{H{Ho ,o*{Fo*{H{Ho{G{Goo o{Go{Go {Goo{Ho {Fs*0(,*{Hoo- {Fo*{F~io {F~jo {Goo{F{ o{Hoo o{Goo {G oo{Ho{F {Is*^o,*oo*{F{G{Ho{Is*.(*0M(,,-, rmKps8 z,'{G{H(5{G{Fo(5**(*(oo,"((oooo**~{F{Fo - rKps8 z*R(t( *0(,*o,*ot ot {Go ,+{Ho , ot*{Fot*{Go {Hoot o oo{Foot {Gooo{Hot{F{Is*R(t( *ro,*ot( *0(,*{Goo- {Fo*{G{H{Goot oo{Foot {F~ho {Goooot {F {Is*{F{G{G{Ho{Is*03*u -*(*Jooo *2oo" *6oo*( *(o2 r3Lps8 z}L}M*{M*ryLp*2{Lo*{L*{L{Moo{Los*{L{Moo{Los*{L{Moo{Los*{L{Mo{Loo{Los*{L{Mo{Los*{L{M{Mo{Los*v{L{M{Los*0{Lo- rLp(Qz{Lo,E{L{M{Lo~ho{Los oo -**{L~ho o {M{Lo~ho -*o o~ho{Mo{Los  {Lo s  {Lo/  oo{Loo ,{L (+   o{Loo ,1o,{Loo{Ls*~ho :3o :&*0o o ~h ~i ~h~hY8ooo,[oooo  oooo oooo+Q ooo  oooo oooo YX<)oooo ooo  oooo oo+@ oo oooo ooX1     *03*u -*(-*v{L{Lo ,(**N{Lo" (a*0(Xc}W{Ws }V- - }Q+&2 rLps8 z0 rLps8 z}Qo/ rMps8 z}R}S}T}U*2(/*0N(Xc}W}V}R}S}T}U- -}Q*}Q*2{Vo *r=Mp*{R*0u,u- rEMps8 zt t {R{R3*{S{S3{T{T3{U{U. rMps8 z{Q{Q. r#Nps8 z*0D {Vo t t {Vo {R{S{T{Us1*"o*0m!t {V{V{Ro  {R5 {S{T{Uo {R{S{T{Us1*0o o* *0`"{V{Ro  {R5 {S{T{Uo {R{S{T{Us1*0#{Vo t {Ws  {Ro o {So {Q3{To {Uo {Ws  o {Ws  +^o o Y/    ec_o   o  o   o o 0{R{S{T{U s1*.rNps z{Q*{R*{S*{T*{U*0$3*u -*(D*0P{R{R3@{S{S32{T{T3${U{U3{Q{Q3(**0C|R(6 |S(6 a|T(6 a|U(6 a|Q(6 a(a*V( }X}Y*0%(O s +b(O  XY 4(Qs so#(o &oY oC / rNps8 z0R( o! t  sH*:( }Z*F{ZoH t *0s _~_rDOp~\ o ~_rp~[ o ~_rXOp~] o ~_rlOp~ o ~_rxOp~o ~_rOp~o ~_rOp~o ~_rOp~o ~_rp~o ~_rOp~o ~_rp~o *0Cs7s}[( }]~_oo t~0s~}\*Z{]orOp(. *0i}^u,to9 t +t ,o- rOpsz-o, r Ppsz(Y{[o*6{]o*>{]o*0Kz{^- rPPps< z{]o4 {]o&(Z {[io*0&{^, rPps< z{]o4 {]o&{[io (Z &ݹii3 +  .* X i28iiY@iiYYiiYY4%q4Yҁ44%q4Yҁ4+XX.*Xi2+.*X2+***2M 2{]o*0>{\s om*6s_(^*( *f+%{`X}`{a,*0'}`}a4  -Z+ ]s ( & +=( &{`.{` , Ҝ+ [b_`Ҝ X 2}a*7?( *0h}i( }ho}g{g. r&Qps8 zo4}do4}eo4}f*{h*0(}i}j}ku,wt o i{di/>{d{diiYi(9  + {dX {diiY2+{d{di(9 o(q{ho*Z{horlQp(. * *{g*0_{gXi1 r{psjz{gXi1 rpsjz{i,G}i{h{e{fo&{f(r}j{f(r}k%{j X}j%{k X}k{j{e(s{k{e(s{h{e{fo& +X{fXaҜX {g2{e{g{e{ei{gY(9 {f{e{ei{gY{g(9 {g*{d{e{di(9 {ho*Xbj n_iXb _XXb _X _X*XcҜXcҜXcҜҜ*0UsB }t( }m~l4}no~l.rxQp~l5rEp(^ s8 z*{m*0)}ou,:t oN }poM }qoL [}roK }s*u,7t o}p}q{ni[}ro}s*rQps8 zZ{morRp(. *2{mo*:{toD *B{toE *0.z{toF i( i(9 o|i*f{mo{tjoG *0{r4 {ni(9 * *{o,{toC iX{rX*{toC iX{rY*0;*{s- rRps< z{ms ~l4 {piYY_Ҝ{p{pi(9 {o{sso{o9 {rX4 {n(&{n{no&+ o&~lX ~lX ~lY2~l4  Y(9 o& Y(9  YX{niY(9 8 {rY4 X{rY{n{r(9 {n{no&{r+{nX{ni3+!o&~lX~lXi~lY2~l4  iY(9   o& iY(9 ~l4 i (&{n (- r@RpsT z*0+{m{rZsO {so 4 (,4%q4@`ҁ44%q4o Y[_b`ҁ44%q4{piYY_`ҁ4{p{pi(9   +i Y _Ҝc X 0io (9{qi /%{qico {qio +] o  o {qico {qico {qico {qio {q{qio {qiX],+ o XY3o o *f{q,{qi**"l*0^u,&t o9 t>}uo8 }v+t>}us }v{uo, rpRps8 z*0a,{u- rRps< z{uo oY {vs o o,~ho - ~ho ,*( *0H-u{, t{}w*ow~ s oxoooY&&}w*0.{wow {wo o s o2 o/oo o{wo,){wos' {wos{s*s& szs*( *:( }*rRp* * *0E,u-rRpo: oO (. s8 z}}t o(*0e{-(rp(. s< zXi1 r{psjzXi1 rpsjz{- (*(**(}}(}~(} (}*0{d( X(   +D y7X b{}XXad{~XaX b{XXad{XaX X  3(X(*0d( X( 7  +Db{XXad{XaY b{}XXad{~XaY  y7Y X  3(X(*%Xb%X _b`%X _b` _`*0./ %XdҜ%XdҜ%XdҜҜ*>(  }*r@Sp* * *0}/K( o ,!tK oa }o(+Bа( o ,t o(+rNSpo: o (. s8 z}*{- (*(**0+0iX[5  ++[5%q5 _]Z_bX5X i3{XZ5}{~ +{{Y~XX {i2i{i1iZ + {iZ +e{{XX(%  XXX(%  X{i]Xi]X 2*0}1({X X({X  +2a({ZX a({ZXX X {1(X(*0}1( X( { +2{ZXY(a {ZY(a Y /{Y({YX(*^__b _Y_d`*^__d _Y_b`* _X _b`X _b`X _b`*ҜXcҜXcҜXcҜ*V cQ᷀ y7*5}5}~}( *0Su-&rSporSpo: o (} s8 z}to}{o*rp* *0lo {-orp(. s< zXi1 rSpsjzXi1 rTpsjz{, o*o** *0 1i / ~}5 5  +  _ X  i2((( ( ~ a~a~ a~a~a (~a~a~a~a~ a ( ~a~a~a~a~ a(~ a~ a~ a~a~ a ({~~ a~a~a~a{~ ~ a~a~a~a{~ ~ a~a~a~ a{~~a~a~a~ a( ( ( (~a~a~a~a~a(~a~a~a~a~a( ~a~a~a~a~a(~ a~ a~ a~a~a   ({~~a~ a~ a~a{~~a~a~a~ a{~~a~a~ a~a{~~a~ a~ a~a((( ( ~ a~a~ a~a~a (~a~a~a~a~ a ( ~a~a~a~a~ a(~ a~ a~ a~a~ a ({ ~~a~ a~ a~ a{ ~~a~a~a~ a{ ~~a~a~ a~a{ ~~a~ a~ a~a( ( ( (~a~a~a~a~a(~a~a~a~a~a( ~a~a~a~a~a(~ a~ a~ a~a~a   ({ ~~ a~a~a~a{~ ~ a~a~a~a{~ ~ a~a~a~a{~~a~a~a~ a((( ( ~ a~a~ a~a~a (~a~a~a~a~ a ( ~a~a~a~a~ a(~ a~ a~ a~a~ a ({~~ a~a~a~a_{~ ~ a~a~a~a_{~ ~ a~a~a~ a_{~~a~a~a~ a_( ( ( (~a~a~a~a~a(~a~a~a~a~a( ~a~a~a~a~a(~ a~ a~ a~a~a   ({~~a~ a~ a~a_{~~a~a~a~ a_{~~a~a~ a~a_{~~a~ a~ a~a_((( ( ~ a~a~ a~a~a (~a~a~a~a~ a ( ~a~a~a~a~ a(~ a~ a~ a~a~ a ({ ~~a~ a~ a~ a_{ ~~a~a~a~ a_{ ~~a~a~ a~a_{ ~~a~ a~ a~a_( ( ( (~a~a~a~a~a(~a~a~a~a~a( ~a~a~a~a~a(~ a~ a~ a~a~a   ({ ~~ a~a~a~a_{~ ~ a~a~a~a_{~ ~ a~a~a~a_{~~a~a~a~ a_*0<25 ( X( ((X(*0<25 ( X( ((X(*0XX _b Y_d` ~d _~d _a~d _Y~ _X*0Xa _b Y_d` ~d _~d _Y~d _X~ _a*0XY _b Y_d` ~d _~d _X~d _a~ _Y*0    8  YE<<<<<+U{{(a +8{{(a +{{(a X{>C *0    {8  YE<<<<<+U{{(a +8{{(a +{{(a Y=H *X _Xd _Xd _d _*0:  _bX _b`X _b`X _` *XҜXdҜXdҜdҜ* _bX _b`X _b`X _`*@0 /kz%?/?!M@`Iɟ'Կ@uИcnafŽ"o;h(Yy#P_w@CV/|-ҢɡHl4ma/T"2*kT:V"AӢ@f/9/Mҹ-?JDvR7,YQoz Zh{.T"5Y/mKdPIf-徐"3;䎴]4K@E?1.eUʱծ-mԢP @"8On ׿r[O/LVSTIiFXEŅc]ՊSW9j7=T*_}x:vbj Bz)^'rgP8ƌDŽZ*'JkѢ*V`C u\B&Ʉq-ls5&5 M{n0f&%HVV^c ϲc|E pPr(pH# yM;-AB G&LjMG\^ |Y#јr8S#/nqFnEV 9q +A|iCHy}B{BIZݿe\ [ ~iC?9zaz UQry吝5rNcZպ60ę _}֡{/6Y DYD̃Aѱ* ;{ B[A%zzӤ0XޘN?wiy{$[Ĭ%5P_aT1bcKU !h]Yfsc=4·~!+g\ab906;Wd/`:5F- 'zy㠌l0^7%oo;j tE'4:NiOM>dY58EfCr3c%N? (Υ'R¦սTUdpfM w&ۄgC!`X0TroSUGڿ]bVhkʃ;n-Ӧ\= wL3{9+^S_aodC x^c"&gI{ڷ"%-U^7rRyL H[k0 cq/޹ S E!5(T<)c)A|-nRPf4,0P1`sY&D\dwR3A+ٺ|o!PaH?ek«dv&4{^% ;MM1$~I,;jx`]sVz\/1Co0TyXR^/2zj0>՚1B°I #ڸ(0q_`ɣaM/Ǚ."płNؼ40y;'ƸaiH?;(ZC/v7ܱӧßn>ƼB7Q(heRwj-K'5.n\ )^XOX{iT̨g&H`K`8# ~8lI `s5GƱVL>#8d^BFzk Od^AE#\;]>rC|m~ll9`qpsv#E@]%=`GK6DήPQH<p}}d^(O= &g.yr?U+HԼ?^!@WNFRWs3NɷdŸW1O g_?@k{C=K۵cUȗn-J(JqoCCl< _P/~׿PZG.Q>pX.0_|r *,]I鎸P'WIoyR}}Yr@EEt]>uOiVA#. '`vteyvvwHNma}/ 4H<0(Ow Vܒ M"7)}V'|@|硴f^aÝ <є`AFv\;x,WGl"}NC~8<=Q8d{h'فI]j~vh]9K9 ;#Im<Eub'z\aBΒ~Brrp }ȡ[(Ob<51)BSjO[}m(Ki\j#MŌ?,-ҖXRg[HJI \EkӉ7`:SRqDIK @sg4|~q6UO/Т`?mPьGnU?墼38Wg} =3{r3O̫]ňv{{uWBdBc+ri/n+_mazgaq%9̸L!gуb>ܷν8\ =Dmn`I:T`H'W+8$ ږ%Eh;}E `P/(b4 ٠m+1+dZ0RXBA\1>26F3S75 {s{OJWdCQz(~c5_ yCdcdJ$_(͸O@C " 0 O7-{$MgQLq_-_d !S^>'_aB%rqK=;&o~~TLmDl߫I&Ǡ36~?Pa w8Pr.PwWFgOT3ɏ1 i5M\=fȦ[]oڑo/"F}F9mOCCN!и  ?X(>nH&p׋wt|% - y#;(8itb߷@!{7Ȋ@ YVvO@/{U MVi35'#WȯVeka^u˅nwU2?-ɿ[%;з$;mc fÀ(82 Tɪס2Zb,gTzuw11&o6F HjyZVLj~CRv/ t,t* M|k .TA5B=!&|,aRe1i%& !\1cr ^Iy p1 d>>̶Ոî 0rlqn/kءDVÈ9/ű1(x⤣2}o~X$Ū{s0a!-!)۳*)e\,0?Б\,ԩT _w:^VxV޾\!uQųåҶw#)Ei/z毲p[v F98/gsD)k)/Ifingӛ/~p%Q^$Slj>!DYܷ)eyCy9A+MWN )zkS< ~U3rŅ?~  ~tn,fy3jXDD1Zs"*ˁc8:$zi HIĀ@8HުL H_%A@N$A UeQr% 9jyMc@hV 틕Z Vqק)N-fcqw*7 5Wa"ɠBր[t!h!hl iwW~@PճMװx QV$AV ʔUWnྵa$ XK'aU{whkldMDfd~i/IO70j5,s@IvM;B(HDLns) _ɋ}oaOw.+rץ<}+FYYEEهTNoHm| ǥcs_DVj͈prͳ]ny` E`1©\1BN"r\,rN@%/N2g@#x\n܃"ukMxnXO DH?{vw#Vu*F_( +8=6 JRft;QZylu eX&hJpFS(l\v0k)h76*g$ k%ֿh,DUueI40" WIbuU~bڨv^FESGml,gHL|3ەCh\SU2` ߝWc9^28aI37~^b<#NygCHKJf-ۄoH Ja)Yfc(` 0qt&@3/C~A^ l( ؒ0~of˜os*`ژ46K-%#= %IH6Jo8C@TzWOpA:Z„TU|5YŗZ:G:%Sj~=eI&TwQ[P]vlDȨ!帊iX`[ŗY)L;]J5ULkD$5鰽bעT/I18T(q)9H[/u@g+3-fVo*ɛ`( ')dMP˲,\26K_A !PNhذy\CPIMAC8wn\e0Rԋ@+>`xT7}02m-yyS"wuXȃoxkcZ\3]ùzv٣Byqj3ƚ`'PC=+mvN%ύHf6AN( aϩI=߹_d: }+p?PO+Zbbyj.H@,Z@"ғ-ES4n)olIIBr~V>olbfLTq*+9)XLVRf.S9v.i硦>iFt+LVvuOx39]O#2]2=&K/~~<O^?vf)o=E4ӷ+4grN=U"g`k8=ü0}8QcÐӝXyTGָaYwSW-XVcNx.F~eyUڑ0@5㶼P?!@=LXI6QpӱڍyKoqK 0ݻ맕d5w$,ϩ/ tцB*v:-7ޚ, )p@ :$7ѴyN] h1 HZ޻Bf1畏?r 3uQB}\cmd!@ WS1zݨ]3CoFq"8ԚέiGb[UgfN G[oLĎnrWxzdD]Ջ` l_9 ]c2֋~ pIPӻߘ)* mS~H~X.t;/RG'~[!<8zvOB9`55'{ɸ6g {pqT3^-ZId, =4pBwbO&Ҹ$d%FN`7>͕xE_{ ۫v"{.1ן%$r_m L=mPO%os#(ĴyI%4aĘnzn|l6AT޾'VAJJ{` ,8I%vK$%Gv XY f 0NndQ& #Phꃢ0 5%q(>  5%r(>  5%s(>  5%t(>  5%u(>  5%v(>  5%w(>  5%x(>  *j@5}(o*0@5}({}{}{}{}{}{}{}{}{{{i(9 {}*rxOp**0^{%{% X} _bX _b`X _b`X _`{3o*dҜXdҜXdҜXҜ*{1o{ di{n_i*0({({X({X({ X({X({X({X(o*0( ؞} |6} p0} 9Y} 1 } Xh} d} O}} + {X {i3*0y3 +C{{Y({YX{Y(X{YXX ?1{ { { {{{{{  8Q((X~ X{ %X XXX( (XX((X~ X{ %X XX X ((XX ( (X~ X{ %X XXX ((XX( (X~ X{ %X XXX ((XX( (X~ X{ %X XXX((XX ((X~ X{ %X XX  X ((XX ((X~ X{ %X XX X ( (XX ((X~ X{ %X XX X( (XX  X  ?%{X}%{X}%{ X}%{X}%{X}%{X}%{X}%{X}}{(` *&_f_a*2__a_a*vdb` db`ad b`a*rdb` db`adb`a*^db`db`ada*fdb`d b`a da*/BD7q۵[V9Y?^[1$} Ut]rހܛtiGƝ̡ $o,-tJܩ\ڈvRQ>m1'Y GQcg)) '8!.m,M 8STs e jv.,r迢KfpK£Ql$օ5pjl7LwH'4 9JNOʜ[o.htocxxȄnjlPxqb@9%y(> *j5}(o*0l5}({}{}{}{}{{{i(9 {}*rDOp**0^{%{% X} _X _b`X _b`X _b`{3o*{1o{n_i{ di*ҜXdҜXdҜXdҜ*0N({({X({X({ X(o*0V( #Eg} } ܺ} vT2}} + {X {i3*F_b Y_d`*aa*&_f_`*f`a*&_f_`*b(XX(*z(XX yZX(*z(XX nX(*z(XX ܼX(*b(XX(*z(XX >pmX(*z(XX $M\X(*z(XX 拢PX(*0_ 4{% {% {%{%{ ( {({({ ( {( {({({ ( { ( {  ({ ({ ( { ( { ({ ({( {( {({ ({ ( {  ( { ({({( { ( { ({ ({ ( { ( {({  ({ ( { ( {  ({({( { ( { ({ ({( {( {({ ({( { ( {  ({({ ( { ( {  ({ ({ ( {( {({  ({( {  ( {({({( {( {({({ (  {(  { ( { ( { (  {  (  {( { ( {(  { (  {( {( { (  {(  { ( { ( { (  { (  {  ( {( {(  { (  { ( { ( {  (  {(  {( { ( { (  {(  { ( { ( { (  { (  {( {( { (  {(  {( {( { (  {  (  { ( { ( {(  {  (  { ( {( { (  {(  {( {( { (  {(  { ( {( {(  {(  {  ( { ( {  (  {  (  {( { ( {( {XX{XX}{X X}{XX}}}+{X{i3*05s }( o$ +D o% ty o {o t  -{s % o o & o& - u.,o' se }*Ph0${o t  , oT ty**2{oU *2{se *0"{o t  ,se *s *06o({(}s}o o,o( {oo+3o(8 {o<o{o=oXo &rLTps8 z*,\ 0j~o ,r@p*o*07{oo {o( ( o{oio(  (<r+ps zr+ps zrTps zrTps z*4#6Y #6hu#6w`#60J8oc ({(}}s}ob  {o oo*0u9{od o {oo( o{oio( ( r+p s zr+ps z*VV Vcuvs }s }(*zs }s }(*"}*Bs(*bssi(*0 :( ~o  r p~o (I ~o  ~o  {s5 oK{ so &{o &*&(*:~(*>~(*.(*0;- rUps zoX -r$UprUps z,oX -r$UprXUps zs  ~ o o s  (o 7s] {oS  +1 o% t2 7  ~ oPo  o^ o& - u.  , o' {oS  +3 o% t7~oo o^ o& - u.,o' s(ko ioE o s so ,0o s {o ,s+,+s{oS +o% t)  so& -u.,o' s *(>@)'0"<    {,t{oS +Eo% u,3to2 3 +o2 3 +o2 3 + o& -u.,o' ,sU*{,E{oS  + o% u, +  o& - u.  , o' ,sU* ,sU*,sU*~o? ,{(-sU*sU*Ro#0Z=o$ +/ o% t2 ob(I  oL oXo3 o& - u.,o' **;B.~V*0L( }}}}}}}} }*{*{*J{ss~*{* *{*0]>(s~0s~ (( {(  {{{oH o {o {-+ { o{o,r pol+ rzUps, z{ioM{oNs>{o ooH o {-+ { o{o (  o ((_   oe  oc oXs:  s sJ ***(*V(}}*v{oE {oE *f{oD {oD *^{oV {oV *(}}s}}}}*6{oD *>{oE *0?{oV {o {{o {{oU 1${{(  {s({{oU 1${{(  {s(7s] {{oS +'o% t2 7   ob o^o& -u.  , o' {{oS  +m o% t7  {o o^<ry?p(( s) zr?p(( s) zr@p(( s) z o& - u.  , o' {s({o {o (*@4#@0#T/#h z0ok o ioE *0Z@( - rC+ps z}( sW oYtLs1} rUps z r Vps z*$? 0$L 12{oV *:s (*"(*0[A{o3tLs? oB o3t o2o osr s  rfVp s z*KK 0:( }*2{(*:( }*0B{o /*  / +f 0 Yb{o X X +@ 38{o b{o b`{o b`{o ` {o / rVps zY4 { ( i/s z3 s* s*0(u,s1}+ s(}o }{ . { 3o }s( }+ {}{,{o, e3{o1 .8{,0{/4}+ 4}{oE oC }*0H(}},  }+}}(}}*(}}}}(}}*{*{*2{(*{*{*{*0sB s  {o/o{oD { . { 3{oD {o {, {o{,{i1 {ooF *>("o *"(*:(*B(*>("o *0(o }o bo b`o b`o `n}{0o bo `}o }{ YEYE))+'s}*s}*s4}*rWps) z(}(  j[}}}*{*{*{*N{ jZ( *{*0bsB s  {oD {io {0 {ho {oD {to oF *>(/o *"((**()*B(/o *(sX}sX}sX}*(sY}sY}sY}*r?Ap*0( & * 2{oZ*2{oZ*2{oZ*0* {{{o *V(q}}*j(q}s}*0(qo3%o(D}o(}*o39oopuK,o(D}*o(}*r;po5(( s8 z0QQ7s] {,7 {o^{,7 {o^s*0C(qs}oT 7s] u5,MoS +& o% 5 7sUo^ o& - u.,o' s}*52gj(qs}}*n(qs}}*0T(qo. r;po5(( rps zo(}o(}*0Cu",t"*uK, tKsC*rpo: oO (. r3ps z0 G7 {{s*6((G*0F,u#,t#*uK, tKsI*rpo: o; (. r3ps z0(q}}}}}}7s] ,7 s9 o^,7 ~ s9 o^,7 ~ s9  o^,7s9 o^, 7~ s9 o^, 7~ s9 o^s}*0(q} 8o(-  o2  E%9Ma+s('}+o(o}+[(o}+G(s}+3(o}+(o}+ rrWps8 zX o@>*{*{*{*{*{*{*{*0 D~I  sL rWpoM &oM &{,rU.p{o (R{,rWp{ ( (R{,r&Xp{ ( (R{,rNXp{o (R{,rnXp{( (R{,rXp{( (Rr-poM &oM &o *0LHr'p oM &oM &r-poM &oM &oM &oM &oM &oM &*0XE-*u$ ,*u , osW*u , o5 (S*rcpo: o; (. s8 zj- r3ps zo5 (S*f(j(o}*(- r +ps zo}*:(}*2{s*6{s*:{o!*2{(*0Fu$ -*{{(*2(Xo *"(V*(Y*FrXp(_(( *N( s }*0HG( obs } +#o_(l {ooo X ob3*0HG( os } +#o(l {ooo X o3*J{o t(*2{s *0A,u',t'*uK, tKsg*rXpo: oO (. s8 z0I(qo.rEprps zo({}o(o}*V(q}}*{*{*0%G7 {{s>s*0F,u(,t(*uK, tKsm*rpo: o; (. r3ps z0O(qo.r;po5(( s8 zo(}o(}*V(q}}*{*{*0 G7 {{s*r~v oss(n*r(q}}}*r(q}}}*0K(qot}oto5 }o3ot:}*{*{*{*0LQ7 {{s8 s] {,7 {o^s*6(({*0n,u+,t+*u, ts|*u/, t/s}*uK, tKs*rpo: o; (. r3ps z:(q}*N(qs}*V(q}}*0\(qo2 o1r;po5(( s8 zo(}o3 o}*{*{*0=Q7 {s] {,7 {o^s*"(*&(~*0D(qo.rEprps zo({}o(}*j(q}s>}*0Cu-,t-*uK, tKs*r1po: oO (. r3ps z{*2{o*0 G7 {{s*0Cu.,t.*uK, tKs*r1po: oO (. r3ps z0W(qo.rEprps zot$oXo , r.Yps8 zotK}*02G(q7 opsso}*J{ot*J{o({*0.H{o3{ot o5 (**0 G7 sU{so*0@Iu/ ,,*uK ,s*r1po: oO (. r3ps z0D(qo.rEprps zo(}o(}*V(q}}*{*{*0 G7 {{s*6((*0F,u0,t0*uK, tKs*rpo: o; (. r3ps z(q}}}}}*F~(*0J(q o u,6t o2 -}(T}X +~}+ ~}%X o(}%X ot}%X otK}o1ot(}*{*{*{*{*{*0I7s] {-{~o -7 {s9 o^7 {{{o^{,7 {s9  o^s*2sU*0Cu1,t1*uK, tKs*r\Ypo: o; rEp(I s8 z(q}o(}o(}*{*{*{*u2,t2*uK, tKs*rYps8 z~(qs>}sU}*0D(qo.rEprps zot}ot$}*F{o(*F{oXo*0 G7 {{s*0F,u3,t3*uK, tKs*rpo: o; (. r3ps z0WK(qo1r;po5(( s8 zo o& &o% t7 u,wto2  E+(t(m}+4t(b }+ r,pto2 5(( s8 zo& &o% t7 u,Wto2  3t(b }+ r,pto2 5(( s8 zo& &o% t7 (}o& , r Zpo% o: o; (. s8 z*(q}}s}*{*{*0ZL{oA  {o + o% t7 %X ( o& - u.,o' *%D0vI7s] {,7 {s9 o^{,7 {s9 o^7 { o^s*0F,u4,t4*uK, tKs*rpo: o; (. r3ps z0T(qo.r;po5(( s8 zo({}o(o}*(q- rRZps z- rnZps z}oH t}*{*F{oH t*0%G7 {{s>s*~~~~ ~ ~ *( *0F,u6,t6*u,tos*rcpo: o; (. s8 z2o5 (*r( - r3ps z} *0Rr/-pss (m  +/ ~  d_ot &~ _ot &X i3o *F{ oH t*>{ o!*0Mu6 -*{ { (*0123456789ABCDEFb@%z(> *6((*0A,u7,t7*uK, tKs*rZpo: o; (. s8 z*(*(q- rm#ps z- rZps z}}}*0F(qot}ot}o1ot}*{*{*{*0FQ7 {{s] {,7 {o^s*:(q}*V(qs9 }*V(qs9 }*V(qs9 }*V(qs9 }*:(q}*0U,u8,t8*uK, tKs*u, ts*rpo: o; (. s8 z0N{u,f{t o2  YE)+.(o*(oa *(o*sU*r'1ps< z{(o*>{u*0qN{u,X{t o2  YE + (*(*(*(*r'1ps< z{(*6o3 (_ *2{op*(qsU}}}*(qot$}o({}o(4}*6((*0A,u9,t9*uK, tKs*rZpo: o; (. s8 z{*{*{*0)G7 {{{so*,u:,t:*rpo: oO (. r3ps z0Oo5  ,o3 - rps8 zt:*o3 ,s*u:,t:*uK,g7s] tK o+"o% t7 7 o^o& -u.,o' s*rpo: oO (. r3ps ze/N(s }*2{oS *o*J{oT t7*"o*o*2{oU *s*0EVo o +o% Z , o" a o& -u. , o' *$20_Pu: -*oo.*o o +!o% t7op o% o -*o& ,o& -*08Qii(/  +   . 0**X 2ii*0R{oU > {oU Y 8  {oT t7ok +l{XoT t7ok(,+<{oT {{XoT o {Xo   X 3 :h*:{o &*2{(*j( }o}*0WX{{3*{%{% X}o uK, tKo*u:, t:o**{*6( (*"}*"{f*{*"}*0/{ca / X {b~a}*n; &C vkkMPG&"֊/aK+d 5ӆ1 Cͼ-}wp4mG0K=V9'C#=.r *ϝxO K} xV|iqލuݓklRobfF^[^Z}Wf`Sc0M-ZI D@ƥ d'NK`%#/+6lA/ ]D@hf+*{Pu&6>;;kvqUP2M_}1>φ˃4y:Z iYmێ`7Od2z~\sKwV OK86F+GB{\=fX@US]CQ;%)&!,G^(BM6P2,v?kZ;&H VM#RV/K`mpl +e= hﶻ'؀odj#ͳ`~>ɐ}:{y`6q}[Fu2 t-0q].KYT@PENOJ+ GC!}{`COFr[v hJGl0a$-eK^VZp0m5= ^[ Q7R3?>:З$:V -T)y&;h+̠ȥPMlk/|vˡv`#ds'ě yg:Ջb}>  q+2h6mf{u]6@n 5%{(> *(#*0S(#}r[pso" ,((} r*[p(( s?zrr[pso" ,q(( oiZ oY 2+ 6}+*{[ ]_c_X3+}r[p(( s?z* '4F2( o *o (r 2o (r **2( o *0ao (r 1 r[p{oo(. szo (r / r[p{oo(. sz*2{o*F{ooX*2{o*2{o*F{oo*F{oo*F{oom*F{oo*Z{oo(*Z{ooo*{oo,{ooom**F{ooj *F{ook *n{,{oH t **0Tr(\pso" -*(( s o+o% t  oo &o& -u.,o' r<\ps@z*0'W[q{,1{o,${o- *{oo**2r\po *2r\po *0Uso" -*( ( s o+Es on5o &ooo o & o &Xi2 *{o.*{ool *F{o(*2{om*0$V3*u> -*{{o *08V% ( {-{o" }}( {*"*0@WsL ~I  r\poM o o oM &r\poM o oN oM &r ]poM o oN oM &rP]poM o  oN oM &r]poM o  oN oM &r]poM o oN oM &r]poM o oN oM &r^poM o oM oM &o  ( (0  iox r@^poM oM oM &+KiY(/ ( (0  iox rp^poM oM oM &Xi2{ool 9oo$ o& , r^poM &o% t  o  o93 oo  ( rCHpoM  oo r#0poM & ~to , (oN &8 ~po , (oN &8 ~ o , tsoN &+l ~ o , tsoN &+I ~o , tsoN &+& ooM &rHpoM  (RoM &'& ooM &rHpoM rHpoM &oM &o& :o *+'0!X{o( ( o *0{Y{o{ood o - r^ps<z{oo (oKo  ioMo  oO- r8_psz* *0E%  +7X~ c_XX~ _XX X 2Z* *0Z[  +~ ZX  ZXX a/0YbҜ+aY XbҜa/4%q40YXҁ4+4%q4aY XXҁ4X X ?{*0123456789abcdefb4%|(> *( *Js }!( *0Ds }!( o$ +o% (+ o& -u. ,o' *2:{!o *03o$ +o% (+ o& -u. ,o' *!2{!o *6{!o *N{!o o *2{!o *F{!o o$ *>{!o *2{!o *6{!o *03o$ +o% (4 o& -u. ,o' *!2{!o *( *Zo((: *F((: *0h[(- r_ps8 z(u, &( ( ook  o(s~s*(*boF  .*oG t*0R\s +!oG t (<  so &oF . r!p oJ (. s z*770]s Qs Qs Q+\oG  ua,ta Pono &+tb PorsAo &P(< o &P(= o &oF  .oF .*:( }"*6s(B *6s(B *02( o#( }" r9`poJ (. s z*Z{"o" oo*0\^{"o#  -*oQ ~o ,0oR o((JsG  rc`p(( s zoR **#@2{"ok*0$_3*uD -*{"{"o *2{"o" *0`oXU _bh j(  +_o,EoYo, oYg+  og j(o + o X o0XU(9 *0a,u, t +s/  o  /  +G)/  +<y/  +1 Q/  +# /  +  /  +  o+ o- -   +i-o /= (9 +YoX 2(H   i oo  Y +K o   ,5  1   Y[o +   eY[o  Y  /o, o. o *( *01,( s}$s {$oj}#*2{$o*0b Xs %{#%jX}#(K(C(T(EoE oF {$io{$o4 {$o&{$o &r`ps< z * 0 *( *{1*0j( }*}),  }+*u,  3}+*uq,  1}+*u,  2}+*r`ps8 z*(T *Z{)orap(. *0ct> {*ooo},{,X[4}-{+ 3#{-i{)oYY4}.+!{-i{)oYY4}.o\ *0e%{/{.i1.{.ii1* +.*X {.i3+%{/i.* +.*X i3*.i(` *{)o{/{.i/{.{/%{/X}/*0_{)o{/{.i/2 +{.{/XXX /{/X{.i2%{/X}/*0A{)o}/{.(Y {1, {1(Y }1}0*0d{)o   {+ 3: {-iYY {){-o&{-{-iY +U {-iYY {){-o&{-{-iY{+dҜ{-{-iY{+Ҝ {/XZXX{,Y1.{/X[Y` Y {.{-(9 +%@ {/Y {.{-{/(9 Y1aY+{- Y-{-Y4%q4aҁ4{- {-4%q4 `ҁ4+${- {-4%q4 `ҁ4{*{-{-io{.(Y {-(Y *0e{*io  _@a,{.(Y (Y *iY_ a,{.(Y (Y * iY _ a- 8iY _biY _`  1. 2.; 3.+H{)uq-Fr;aps8 z{)u-.raps8 z{)u-raps8 zr9bps8 z  + _ a, X i3 X {)o4iYiY Y0{.(Y (Y * _:}0{)o{)  Yo{)o&+AX4%q4aҁ4X,{.(Y (Y *Xi3 Y4}1 {1{1i(9 8}0{)o&+AX4%q4aҁ4X,{.(Y (Y *Xi3 Y4}1 {1{1i(9 {/,5{.{1(X -!{.(Y (Y {1(Y *{.(Y (Y *{0*(i 1 rwbps8 z}2*{2*2i(c *( 4}3{3(9 *F{3oH t*>(~}4*n(~(i }4}5*{4*{5*0@f- rm#ps z( -r$prm#ps zooos*>(~}6*{6*0g3*uN -*(m *v{6{6(R,(**0( {6,{6o" a *n((r , rbps8 z*z((q , rbps8 z*0KhiY/ r cps8 z +-  +X~9ZX. +X 2-*X 2*"(q *0>% +3  _ccacacacacacaa_`ҜX i2*n 4%}(> 9*0k^4  ..+%(9 (9 +((9 +r9cp5(( r5<ps z(z , rqcps8 z*Fi(u (o *>(u (o *0 +(q ,*X 2*6iY(x *.i(x *rcp**0GiY 1Y_,+ + iY_,+ + Xi2*0&iiY iY +Y 1Y.iY*( *(d}>o}?o}@*0c%iY _iXY _XX iXYҜd iY +' _X _XX XҜd Y /*0fj{@4 4  + ҜX i3{,Y{i,O{@{i{@XY{@[Z4 + {{i]X i3+4 {,\{i,R{@{i{@XY{@[Z4+{{i]Xi3+4 iiX4  i(9  ii(9 {@4{?XY{?[  8 {?4 {>io{>io{> o& +'{>  io{> o& X  {3 +    i] X  i3+{@Z( Xi{@[3  3%  Y{?Zi Y{?ZY(9 +  Y{?Z i(9  X   >*0[(  s*0[(  (*0-z[[(  (  ss*00k[[(  ( (  s*0[(  s*n- rps ztC}A*0fl{Ao {Aow o s o, o/o oos  ss*( *Z}B}C}D*0=m{B{C{D(;   {D(<  ~is.*( *0n}Iss}Eu,t o9 o8  +s  u,Gt}F{I94}H{Ho@ {F{Hs}G*u,\- rcps8 zt}G{Go}H{Got}F{Hi.rdprps z*r9dp*0o{I- rGdps< z4 (9 (  iiX4 i(9 ii(9 i4  i(9 i{Eo[i{Eo], rdps< z{E{Go+({EoZ{E  o&X2{Hi iX4{H{Hi(9 {Hi i(9 i4  +  i XY X  i2{F~Js {E o +* {EoZ {E    o& X  X2 *0p{I, rdps< z- rdpsT z{Eo], rep{Eo5(( sT z{F~Js {Eo4 (9  +"{EoZ {E  o&X i{Eo[2i4+iXYXi24}HiY4{H(9 iY(9 {F{Hs}G{E{Goi4i(9 +*{EoZ {E  o&Xi{Eo[2iY4 4  iY(9 iY (9   ( - rWepsT z *0;4 {Kio{K{Lo&{L(9 *:( (*Jݢ,y!^4%~(> J*~s}K4}L( *04}O4}Q4}S( ( *004}O4}Q4}S( {O{O{Oi(9 {P}P{Q{Q{Qi(9 {R}R{S{S{Si(9 {T}T*rp***0ti{Qi{RY {R + {QX {Qi2{Q( {Q( {S( {O{P(9 ( *0j1}P + {OX {Oi3}R + {QX {Qi3}T + {SX {Si3*0C{Q%{R% X}R{R3{Q( {Q( }R*0v+( XY{R,:0+4{Q(9 {Q( {Q( YX0+( XY0*0K%{S  +7{S4%q4~Ua _aҁ4{S X 2*0 +*{OX{O X{OaҜX 2  +I +2{O 4%q4~Ua%4  _ X 02X ] X 2*).Cɢ|=6Tbs+ټLW<gBoNڞI/zhy? "_!]Z2'5>0H^*VO8Җ}vktEpYdq [e-`%Fai4@~UG#Q:\κ&,S n( AMRj7l${ Jxcm;9fXwruK 1DPۙ3n 4%(> U*0 Ho ~Xo ~Wo *0qs Vs Ws Xs Y~rprp( ~r)prp( ~r7prp( ~rEprp( ~rprp( ~rOpr8p( ~rOpr8p( ~rpr8p( ~rpr8p( ~rpr8p( ~rOpr8p( ~rpr8p( ~rpr8p( ~rpr8p( ~r)pr8p( ~r7pr8p( ~rEpr8p( ~*rpr#p( ~-rpr#p( ~.r)pr#p( ~/r7pr#p( ~0rEpr#p( ~Qrprp( ~W~Porpo ~W~or8po ~W~^ r8po ~W~ or8po ~W~repo ~W~ orepo ~W~ or#po ~Wrepr#po ~Wreprepo ~X~orpo ~X~orOpo ~X~orpo ~X~orpo ~X~orpo ~X~or)po ~X~or7po ~X~orEpo ~X~\ orDOpo ~X~[ orpo ~X~] orXOpo ~X~ or+fpo ~Xr=fpr+fpo ~Yrp/ rlOpo ~Yrp/ rxOpo ~Yr)p/ rOpo ~Yr7p/ rOp o ~YrEp/rOpo *0H~Xo t/ ,**0'L~Yo t  , oH t */*0H~Wo t/ ,**09r(  . (  +  (  &X i2z* %  . (*0ss ,o+Uo% t7 op u,(t o2 3 (okswo &rkfps zo& -u.,o' rfp(. s(rfps z*( 9Ybs+09ts ,( rp(. s( rfps z** +09ts ,( rgp(. s( rfps z** +0ous  o+>o% t7 op uK,okoo & rp s zo& -u.,o' *$A KY0\vs o +. o% t7 okoo & r#gps z o& - u.,o' *0  :Gno-o~0s~** * * * *( *:( }Z*6{Zs *Z{Z{ZioE *2{ZoH *2s ( *fs }r( }s*N{rs o &*f{rs>s o &*r{rs{ s o &*09wo o s_ o  {r~s~s o &*0xo-rMgprwgps zo,rZprgps z( {ss5 oo o (v oo~0s~oossV  o({r s o &rgp(( sz*Yb00.U,op (Q+ ~0 Qss~*0Zy ~`o? ,74 {so@ iZ  / ~] + s + {s( &*SU V*30}2KE1!ZAJMh,'_6>4? x$#Rgf`HSrnBP<N5+qt: w7kyb|j"[]uaUQ ^Wc=lpY G OX8o;eF~-{@s&%T(dmzDI.v\/ i)9LC]nMY?sk:hZGd4 RCA,w* 8r/m0= cP$%ojDS-OIF)[{W|@a.^\ubXivJU x3y &!(tV<79BqzNlE+g6 }>#'f"~QKLp1;T`He_250M D%Ѐ(> ] D%Ё(> ^~o_~o`~oa~ob~oc~od~oe~of~og~oh~oi~oj~ok~ol~om~on~oo~Sop~ q*0Jz( }uo }wo ((_  oi o}v &rhps8 z*$= 06{( }w}x(v o}v &r]hps8 z*) 00L|( }y}z}{r7po ,~~0s~}v*rhpo ,~:sUs~}v*r?po ,SoiZ  3~ ++ 3~ + 3~ + rhps8 zs|}v*rhpo ,~s|}v*rhpo ,SoiZ  3~ ++ 3~ + 3~ + rips8 z s|}v*r;ips8 z0W}( 7 s~0s }y}zss~}v}|}u*r( }y}z}}*0~o {w9~q{vooo {ws5 oios> {u,;{uo ((_ oe oc oXs:s + {xs {vss*{|9~q{vo(o(oo{zs5 oios>{u({uo s:ss{|{vsss*{}9~q{yo ~q o  rpo -+  4  o@ {z s   s5 o ios>7{ys s>s~s~}v{}{vss*~q{vooo{zs5 oios>{{{vs] s*( *"( *0q o  (  o o  (${ss5 osB s1o oV oF s - r+p s z r+p s z r_ip s z7s] {ro$ +`o% t\  7 {so o^-ry?ps zrips zrips zo& -u.,o' ~sF~ sss6s *Xtv tut0%0%u% m*09( {sosvo(  r3jps z*** 04( {ssvo(  r3jps z*%% 6( ( *6( ( *0O( }o8( o oJ}o s oKoo 8 o% t7(s ou, t{so &+pu, t{so &+Ju, t{so &+$u, t{so & o& :4 u.  , o'  s}~o}*N!{*F{oo*{~*{*Z{-*{sO*2{ok*(+ *"(, *&(- *( *"( *&( *(o }o }s( }oC }*(}}}}*{*{*{*{*0isB s  4 {Ҝ{Ҝo{o {,{i1 {ooF o *R(go }*04 ,**.(*B( (*>{*0%4 cҜcҜcҜҜ*. (*B ( (*0K6{ _jb{ _jb`{ _jb`{n j_` **,( *sL }( }}}*^{{oz *0 {{oz 3*{X   {{o o &8{o{ "3- + { ot & 8-,_ #3,{{o Yo =3{\ot &+ +3{+.{\ot &{ ot & + \3 + {."{ ot &X {oz @7}{o o *"~*&~*0Br}jpsrjpsrjpsrjpsrjpsrjpsrjpsrjpsrkpsrkpsr#kpsr5kpsrGkpsrYkpsrkkpsr}kpsrkpsrkpsrkpsrkpsrkpsrlpsrClpsrglpsrlpsrlps~~~~rlpsrlps6 s s s s ~~~~rmpo ~~rmpo ~~rmpo ~~rmpo ~~r#mpo ~~r)mpo ~~r-mpo ~~r3mpo ~~rMmpo ~~rQmpo ~~rWmpo ~~r_mpo ~~rmmpo ~~r}mpo ~~rmpo ~~rmpo ~~rmpo ~~rmpo ~~rnpo ~~r%npo ~~r+npo ~~r?npo ~~r[npo ~~rsnpo ~~rnpo ~~rnpo ~~rnpo ~~rnpo ~~ropo ~~ropo ~~r;opo ~~rmpo ~~rmpo ~~rmpo ~~r#mpo ~~r)mpo ~~r-mpo ~~r_mpo ~~rQmpo ~~rWmpo ~~rmpo ~~rmpo ~~rmpo ~~r#mpo ~~r)mpo ~~r-mpo ~~r_mpo ~r[op~o ~r_op~o ~rcop~o ~rgop~o ~rmop~o ~rsop~o ~rwop~o ~r}op~o ~rop~o ~rop~o ~rop~o ~rop~o ~rop~o ~rop~o ~rop~o ~rop~o ~rpp~o ~rpp~o ~rEpp~o ~rgpp~o ~rpp~o ~rpp~o ~rpp~o ~rpp~o ~rpp~o ~rqp~o ~r'qp~o ~r5qp~o ~rOqp~o ~rgqp~o ~r}qp~o ~rqp~o *6(( *0A,uf,tf*uK, tKs *rpo: o; (. s8 z0ys }s }s }(q}o8o% t7 op(  8oop( o. rqps8 z{ oop(o & oopu,Cu6-:to r/-po ,rqp(. {o &+5ok({r/-p(0 iox (. o &{6o &X o?o& :u.,o' *A6-c:s( *0s }s }s }(q}oS +Yo% t o -rqpr!rp(^ s8 z{o &{6o &{o &o& -u. , o' *5e:s( *0s }s }s }(q}oU oU . rarps8 z +<{oT o &{oT o &{6o &X oU 2*J( ~( *N( ~( *:~( *>~( *>s( *0s(j ok rrpo , oK s*o{ 02o{ 90s*(j o o t -rrpr!rp(I s8 z*0$s }s }s }(q}s  8+o  =o 3 rrps8 zo| XoK  ( +o >+s o {o &{o &{6o &+bo =o   o|   XoK  { ( o &{ o &{6o &o -+.{o &{o &{6o &o :9s  s  s +h{oT 6-%X {oT o  {oT o {oT o X{oU 2 } }}*F{o t *F{o t *0as  +G{oT o ,/{oT t/ r%spo ,oK o &X {oU 3*0{:7s] 7s]   8{ oT t{ oT t/,9{ oT 6-&7so^7s] 77{oyso^ X {oU @J7  s o^s}{*&( *0-( *-*3*{oU {oU .* +g{oT t {oT t  o -*{oT t/{oT t/( -*X 2*"( *0-*3*{oU {oU .*6 {oT {oT o ,   + Y  8{oT t{oT t/ +U -I{ oT t  o ,*{ oT t/  ( ,  +  X  2-*X @a*0H(j o o (j o o o? -(  (  o? -**0RsL oz ,=o{ ot & + o{  3  . ot & X oz 2o *0o t/ , oM &+ ooM &=ot &o oM &o r%spo ,lX +fo ,.Bo ".7o \.,o +.!o <.o >. o ;3%X rqpo &X X 3*0s   8{oT 6,5+ot &{oT t{oT t/( +8sL {oT t{oT t/( o &X {oU ?k,o sL oU 1E oT o oM &+# ,ot & oT o oM &XoU 2 o *F( ~( *NsU}( *"}*"}*6s}*N-+s}*"}*"}*{- s }{o &*>s(! *.(" *0s s ,?s ~vo &oks>so & r+sp (( s8 z,;~xo &oks>so &r[sp(( s8 zoU ,s(# *(# *&<0R'y008Q7 s] ,7 o^s( *"}*0{,{,{- rsps< z7 {{{{s] {,7 { o^{,5{K( o! t 7so^{, 7{s8 o^ss*( sU}7s]}*"}*0(G{7 sssno^*0G{7 o^*"}*"}*"}*"}*"}*"}*"}*0 {,0{,({, {,{,{,{- rtps< z7 {{{{{s] 7 {{sKo^7 {s o^{,7{o^{,7{o^s(<*( *0Brtps~rp(( s~rp(( s*0\(qo(l}o YE`8o(-  o2  E+(T}*(T}*r,po2 5(( s8 zo(- (S}o(- (S}*r;po5(( s8 z*(q}, sV}, sV}**(5 *6(s4 *-*uj,tj*(s4 *{*j{, {oX*~g*Z{, {oX**0|I7 {s] {,0{oXo,7 {s9 o^{,7 {s9  o^s*~(qs>}sU}*0D(qo.rEprps zo(}o(S}*0Cuk,tk*uK, tKs> *r1po: oO (. r3ps z2{oX*2{o*0 G7 {{s*6((D *0F,ul,tl*uK, tKsF *rpo: o; (. r3ps z(q~}}}}*0J(q o u,/t o2 -(T}X +~}+ ~}ou,%X ot(m}%X otK}oX3ot(}*{*{*{*{*0P7s] {~o -7 {s9 o^{,7 {s9 o^7 { o^{,!7{s9 o^s*2sU*6((N *0F,um,tm*uK, tKsP *rpo: o; (. r3ps z(q- rtps z- rtps z}}*0D(qo.rEprps zo(}o(}*{*{*0 G7 {{s*6((U *0F,un,tn*uK, tKsW *rpo: o; (. r3ps z(q- rtps z}}*(qo(D }o3ot(}*{*{*0DQ7 {s] {,7 {s9 o^s*:(}*0.{s' +(o#% -}}*Z{-(\ (*V{-(\ (*V{-(\ (*~{,(*0{o!*0F,up,tp*uK, tKsc *rpo: o; (. r3ps z6((a *0L(qo1r;po5(( s8 zo o& ,no% t7 u,t}+Lu,(o }+1u,(~}+r Zpo: o; (. s8 zo& ,Xo% t7 u,(o }+1u,(~}+r Zpo: o; (. s8 zo& ,<o% t7 u,  (~}*r Zp o: o; (. s8 z*{*{*{*r(q}}}*0vI7s] {,7 {o^{,7 {s o^{,7 { o^s*j~ rp(( s*0F,uq,tq*uK, tKsk *rupo: o; (. r3ps z0XZ(q- rps zo +o% t7 op(&o& -u. ,o' }*$?(q- r`ups zs}*0H(q- r`ups zR( (~-rzupr`ups z(\s}*0={oR  +{o(X {o2*{*6((q *0A,ur,tr*uK, tKss *rZpo: o; (. s8 z0R(qsV}sV}sV}sV}sU}sV}*0(qo.rEprps zo(S}o(S}o(S}o(S}o(S}o(S}*2{oY*2{oY*2{oY*0DG7 {{{{{{s*V}(}*0{-3{-*{oYt -*}o} {XYo] 1 X 3*{oYt - }* o}+0x{-3{-*{oYt -*}o}{o 2*{oYt - }*o}+Æ(qs>}}}*0(qot}o YEf6+You,ot}*o(}*ot}o(}*rups8 z*6((~ *0A,ut,tt*uK, tKs| *rvpo: o; (. s8 z{*{*{*0\I7 {s] {,7 {o^{,7 { o^s*~( }ot$}*{*0m}{-{o}{u,>{to* -,{to+ tL }oj( **0={-( &{-{o}{t; }*0={-{o}{,{tL }sB**0E{-{o}{,"{ }to+ t;**:( }*{*"( *v( }}}*J( s(o'*( *( *z( oD (  oD *0P{,@{ ` {, `( ( * _,  `( *( *( *6( (*0A( oD ( oD {, {,( oD ( oD *B( 1( *J( 1( *B( $( *J( $( *F 4( *b2 4( *( *"s *(}}}{o s}*0I{%{% X}{{i3{{{(A}*08{i{Y(/ {i3{(A+R{{(9 %{X}{{i/*{{{(A}XY=l*{,{{{(A{o (*(+ *"(, *&(- *( *"( *&( **( **( *0Cs } `4}4}(Q }{o&* * * *j*j**0-*{} {} {} {{} {} { `} {{o ,r@vp{{ (. s) z{{  `/#{{ `{{ YoE {{ =]{{ 9M*j** *2{o[ *b{{oE *0{{} {} { `} {o .,r@vp{{ (. s) z `{{ Y1#{{ `{{ YoE {{ =\{{ 9Lo[ *{-*{o&{o}* 0'( &( {oV }*0 0V6,{ -*j% } } } { { {"-+}{ {$oo*v{$, {$oq}$*0q} }$}"/ e}"21 ( &*}#{ { {"-+_bsn}$( &*0q,{ ,{ -*.+ { { E]JqgL8{ -* %{ Y} %{ jX} { { %{ % X}  %}_.){  }rXvp} { }!81{ {cX{ {#1){  }rvp} { }!8{ }{ -* %{ Y} %{ jX} { %{ %X}  _ { {bX],){  }rvp} { }!8Y _-{ }8B{ }{ -* %{ Y} %{ jX} { { %{ %X}  _bj n_} { }{ -* %{ Y} %{ jX} { %{ { %{ %X}  _bj j_X} { }{ -* %{ Y} %{ jX} { %{ { %{ %X}  _bj j_X} { }{ -* %{ Y} %{ jX} { %{ { %{ % X}  n j_X} { { } { }*{  }rvp} { }!*{ {$op 3{  }{ }!8- .* { {${ {oo{ {",{  }8{ }{ -* %{ Y} %{ jX} { { %{ % X}  _bj n_} {  }{ -* %{ Y} %{ jX} { %{ { %{ % X}  _bj j_X} {  }{ -* %{ Y} %{ jX} { %{ { %{ % X}  _bj j_X} {  }{ -* %{ Y} %{ jX} { %{ { %{ % X}  n j_X} { {i{ { i.){  }rwp} { }!8{  }***0%  ,{ ,{ {.*{ jo{ .*{ jo} { {#_b2{ {#_bY Y { {$or{ }*0,{ -*{ { .{  }{ }!{ % -*{  { {! +1{ ~%3X +{ , +Y X Y ,2%{ { YjX} } } { }!.*{  { ( & } } { }*,{ , { {$-*{ {$os*04   %*NK}( *( *0<~&(r /r.wprwps z( ~& ( Y 'j[*0 'jZ~& ( Xs *.( ( *J s &*(+ *"(, *&(- *>( }'*>( }'*{'*6s( *0w( }({(o~oo? - rwps z{(oo8 oq . rwpoq 5r xp(^ s8 zo$ o& &o% t2}){(o sB  o  oF ((s}*{)oW~oQ,/oj o(@oC(s }++S{)oW~oQ- rxps zoj o(o(s }+oJ o s z*`_{**2{)oN*2{)oW*2{)oX*6{(o*6{(o*0{+o (   rypoJ (. s zo  io(  {+o  (- r4yps z{+o 9{+o o oXo o - ryps z{+o o o(+0on3oo( o ,+Xi3- r zps z(_{*oo {)oa- rzzps zIo ,oJ o s zrzp(( s z rzp ((  s z*AL +?3_+r{(*2{(o*V( },}-*V( }-},*0F{,,rlOp*~{-ooo ,rOp*{-ooo*{,- {-o*{,o*{,- {-o*{,o*0m~.-\sJs.  st ~.s %  ( ( o s\([o  o Xo &~.*0` (j ok % ,*r({p(l -r:{p(l - +s +sJ , s.s *rP{p(. rY#ps z2( o *( ss.}/( o *~( ss.}/o *>( }/*0#( ( o 4 o@ *6{/op*6{/oq*0o  _  .*0R// r{ps z*e_3o  _ jjZc i*o  _ ]  YYX2 *08%03*r{ps8 zY 1 o X*o  2/*6{/or*>{/os*Jo ( ~0[*0,04 o@   +b _X X 2*No n bo n`*0* .#@#P@( 0*( *F((6( *F((6( *0 o: o ~o ,Go;(s oooooooos*~o ,Aoop(s o;t$oX o os*s}*~o ,Doop(sqo;t$oXorosss *~Po ,Uo;t$o ,*op(6  o9 o: o;s oX s*~+o 9oopsw  ox,@ oyt  ([  -8 (  -+ (  - (  + oytKs  o o o o os(o;(s o s *~ o ,Qoop(so;(s o(-*o os *~ o ,uoop(so;toi4+iYYXi3sos{*r{ps3z0( }1o +po% X ( u/-$rH|p/( oO (. r|ps z( u7-$r|p7( oO (. r|ps zo& -u. ,o' *|^{1oo t7*J{1o t7*F{1o o$ *^{1oo t7*J{1o t7*F{1o s*Ns ( }2*>( }2*{2*0u -*{2{2o *6{2o" f*0LQr|pQr|p(l - r|p(l ,*-o /*o| QXoK Q*08( -r}p(. r@}ps z%,JrV}p(l -,r|p(l -r^}p(l -rf}p(l - +rn}p +r}p +r}p(. r@}ps z% 9~: s %r}p( %r}p( %r}p( %r}p( %r7p( %r|p( %r|p( %rhp( %r}p( %r}p ( ~  ( ,w E (088@@@+Fr?p i1O4i(9 +6r}p +.r7p +&r9dp +rhp +r}p(. r@}ps z/    rIp  rIp  (v ($( r|p( , soo*0% 9^~: s %r}p( %r}p( %r}p( %r}p( %r7p( %r|p( %r|p( %rhp( %r}p( %r}p ( ~ ( 9E !/=HVdr}8 r~p +w r~p +i  r~p +[ r}p +M@ r7p +B rp +4 r*~p +& rhp +( rhp + @ rhp +*s1 (po3ol*( *( *s }?( }@s }A*s }?( }@}<s }A*s }?( }@}A*s }?( }@}A}<*s }?( }@}A}=*0C4 {Ao@ `s+  {?{@{@(s o &*o- r:~ps8 z{?s o &*0-%  + X X iY2iYcҜiYҜ*0(zo iX4 ҜoA ( *0A{:, r~ps< z{?oU - r~ps< z- rps zs }9{?oU @{?oT u,{?oT t o  +P{@{A( {@(  {?oT t {Ao rpsz{9{?oT to +|{@{A( {@( +G{?oT t{Ao rpsz{9o X{?oU 3{@(  - rTpsz{<, rp(.  + rp(.   ($};{;o 4 {; s{As5 o-c{<,4{;o jXjXjXjXs }9{9oD +[ {;o jXjX{=s }9+4{<,s }9{9oD + s }9{;o   X4 {A  o   iY  iY(9 {9{;s1%}: {<,(((  s%}>    ioE  srpsz*AL,=/*( *.j( *0{:9{>,C{>js  o[ {>o[ {>o(  {:ioE {:o[ {9{;oo{9o  oJ s z}:}9*a#(*r( }C}E}D*{D*0V{C( rp(. ($ o 4 {Dss5 oiYo}B*0 {C{E{Bs  o *:( }F*0D{FoYE YE2'+0r@p($ +Crp($ +6r0pszrlpszrp{Fo(( sz{Fo s5 oo {FoYE.$.+Ms}G*i[  s s}G*rp{C4(( sz0*{Fo{Fo{Gs o *:( }H*0"( s}H rps z* 0d( rp(  (v oo io(  s>s}Hrp(( s z*GM{H*0$3*u -*{H{Ho *2{Ho" *:( }J*0( (  s~0s~ ( ok   io( s>o (vooio( s> sV   s}J rp ((  s z*Z{Jooo*F{Joo*F{Joo*F{JooX*{J*0.3*u -*{Jop{Jopo *F{Jopo" *{K*"}K*{L*"}L*( *r<p*0z}M,Pu,t o8 }Oo9 + s }Ouh- rFpszth}N*ui- rpszti}N*0{M- rށps< z{Nthoo+ o s o {Nth 1 rpsjzs?o{Os!oAoBoti  o,oo  ooo,o otho   ooo    *0{M, rRps< z{Nti oo+ o s o1 rpsjz~ho2 o2*~go2 o2*oo*o,( oooo  o *( *( - r]ps z- r]ps z}P}Q*6s (5 *(8 *{Q*{P*z(~}R}S}T*{R*{T*{S*n(: }V}U*{U*{V*V( }X}W*{X*{W*r( }Y}Z}[*{Y*{Z*{[*J(D }\*{\*( }_}^}`}]*{_*{`*{]*{^*2(J *(+ *"(, *&(- *(P *"(Q *&(R *j( }ao}c*01L( o - rps8 ztL od }b*{a*vdҜdҜdҜҜ*0 iY/ rpsjz{c4 4  {ao{c1g(Y {a{b{bio{aio{ao&{cZX{c(9 X% {c[2{cZ/\(Y {a{b{bio{aio{ao&{cZX{cZY(9 *6t+}d*0W~$ {do o0 {dowo5o o1 os@ s}s*( *0f 5} 5} 5} 5}( 5 5 5 8~( _   (m  _ (n  _~( _   (m  _ (n  _{b`b`b`{b`b`b`{b`b`b`{b`b`b`X ?*0Xu-rpo: o (. s8 z}to}{i[}{(e *rGp* *0_{- r:ps< zXi1 r{psjzXi1 rpsjz{, (f + (g *V{, {(e **0f5 5 5 (5}{/ rjps8 z{1 rps8 z +; Z (u  X(u {Y Y  (i  X {2+k Z(h  X(h bd`X{ZX{ZX bd`X2     5}8"%%% {_EH8{Z{~ ( _ (o a{ZX{~( _ (p a{Z X{~( _ (q a{Z X{~( _ (r a8~ ( _ (o a ~( _ (p a~( _ (q a~( _ (r a~ ( _ (o a ~( _ (p a~( _ (q a~( _ (r a{Z{~~ ( _ (o a( _ (o a{ZX{~~( _ (p a( _ (p a{Z X{~~( _ (q a( _ (q a{Z X{~~( _ (r a( _ (r aX ?*0a(u {a X(u {a X(u {a  X(u {a 8(s (t X{%XXa db` b d`ZX{%XXa (s  (t X{%XXa db` bd`ZX{%XXa X?M{a(v  {aX(v {aX(v {a X(v *0b(u {a X(u {a X(u {a  X(u {a '8(s (t  ZX{%YXa bd`X{%YXa d b` (s  (t ZX{%YXa bd`X{%YXa db` X?M{a(v  {aX(v {aX(v {a X(v *0(o  (p  (q  (r  {_  Ew8g{~( _(o a{~( _(p aa{~( _(q aa{~ ( _(r aa8~( _(o a ~( _(p a ~( _(q a ~ ( _(r a ~( _(o a ~( _(p a ~( _(q a ~ ( _(r a {~~( _(o a( _(o a{~~( _(p a( _(p aa{~~( _(q a( _(q aa{~~ ( _(r a( _(r aa*001  + (j  X 2a  + (j  X 2*0O1d _ b _-+ Ma _ d_-+ aa bbababaa*Jc_-+ a*vc_-+ a_-+Za**(l a*J(k a(l a*" _**d _*.d _*.d _*0Z{ _Z{d _ZXa{ d _ZXa{ d _ZXa*0Z{d _Z{ _ZXa{ d _ZXa{ d _ZXa* _X _b`X _b`X _b`*ҜXcҜXcҜXcҜ*gvx8 5lCu7&HЋ0T#[=Y󮢂c.Q|륾 a:s,% NkSjEf̕VÎϿw93bqy $ŹMDpA{1' `\R_ I-O;GmF>id*/zKZ(?)3&_v*I!9ͭ1#N-HOex\XWgdc *:s(z **(z *.({ *0L( }}}o4}, io{o&*{*Z{or܃p(. *0=u,t o8 }+ s }{o}*0%{o {,Y{iZY**0%{o {,*Y{iZY*r{, ( *( *0%( X{iZX4 iY(9 iYY{{i{i(9 {{io  ii{iY(  {i +$ 4%q4 {iYaҁ4 X i3{i(9 {ii{iY{i(  +4%q4aҁ4X{i3{io*0{o i{o/%{o4 iiYi(9 + i{iZX/ rpsT z{ii{iY{i(   + 4%q4 aҁ4 X {i3{ii{iY(  {i+(4%q4{iYaҁ4Xi3+){{iX. rpsT zX{i3{iZ+.- Xi3iY/.r4p5(( sT zXiY4i(9 *vdҜdҜdҜҜ*04 {o4 4  {o ( {o{io{o& iZi(9 X% i[2 iZ/J ( {o{io{o& iZi iZY(9 *06 j  j1 *i*2s( *F( s( *07o#(4 ' rUps z rXps z rXps z *( 0 1( +(*0s ,To o$ +$o% t> o ((o &o& -u.,o'  r~ps z rp s z*(1Hbb bo 0s ,To o$ +$o% t ou((o &o& -u.,o'  rքps z rp s z*(1Hbb bo 0X7s] o$ +o% t7 7  o^o& -u.,o' sh**=0X7s] o$ +o% t7 7  o^o& -u.,o' s**=( *^~o ( *: ( *( }}s }*{*{*^{({oV *:(}*2{o *>{(*J{oV (*0w(go }o @  +o ѝX i3s_ }o bo b`o b`o `n jZ}*{*{*{*Zu,t*s *r(- rps z}*(- rps z}j( *0c(- rps z}n17j(  }{4}}}*( *(- rps z}( *0/(- rps z}j( }{i }+d %{X}3{1 r*ps) z{_b}}*0 j/{oD * j05 jY{c j_ jXoD {oD *{ oD {coD {coD {coD {oD *0 {,( }9b` , `oD * j0oD oD * j0`oD coD oD *`oD coD coD coD oD *@`` oD ,}*( *0b,'{j( {{{oE +0{ {`oD {{{oE }*0/{{3( {%{% X}*0{{3( {{Y0#{{(9 %{X}*{{Y {{(9 XY( +/{{(9 {X{Y( {0{(9 %{X}*v{,( *{oD *{, ( *{oE *04 cҜҜo*0+4 cҜcҜcҜҜo*0K4 8cҜ0cҜ(cҜ cҜcҜcҜcҜҜo*"o*Vij( o*"o*0  + oX i2*2{o[ *^{,( }*( {o[ {oV (*04  ~c?_YE M8~b?_==+k ~bc`?_~b?_=+> ~b c`?_~ bc`?_~?_ioE *05}sp}}~I }rp}rp}rp}rp}r΅p}(}s }{rp{o *05}sp}}~I }rp}rp}rp}rp}r΅p}(}s }{rp{o *:{o *{o {rp{o *0 YE *2:":: +8rp +Fr)p +>r7p +6rEp +.rp +&rp +rp +rp(( s) zrRp{(. ( rp{{(} ( }}}*"}*0+{,l{oD {,5 3 { .}-3{ oD {-oD  . 3{ .}}*{93@_ ,?_ +?_c YE))+'rp}+%rȆp}+rp}+ rp}{{{{(} ( rp{rpo t/( {o +>o% X ( t/ rp( ,( t/ ( o& -u.,o' {( }{3B{{{( }%{X%}_- {( {oq{%{% X}  _*?K0{9{1{{{( {=@(( ( {os {c _{c _{ _{{( {( {( {( {( {( {o[ }}(*frp{(} ( *0(0 o2 {ioE *ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/b@4%Ѕ(> *0F,u,t*uK, (s *rpo: oO (. r3ps z(qo(}o1 o}*:(q}*V(q}}*{*{*0=Q7 {s] {,7 {o^s*0F,u,t*uK, tKs *rpo: o; (. r3ps z6(( *0s(qo.$o.r;po5(( s8 zo(}o(S}o3o(}*V(q}}*{*{*{*0FQ7 {{s] {,7 {o^s*067s]}}(q ou,ot(}X +o3o(}X ouK- rps8 zotKo +y o% t< u, +#u, +u, + rNps8 z{/}{. rps8 z{7o^ o& :| u.,o' *!{*{*0( 35{ob  +{o_tX i3*( 35{ob  + { o_t X i3*{ob+{o_tXi3*0TQ7s] {,7 {s8 o^7 {so^s*0Wu,t*uK, tKs *u, ts *rpo: o; (. r3ps z0N(qo2  E+( }+(}+ rps8 z}*0(qo1r;po5(( s8 z +do(-  o2  E +-( }+)(}+(~}+ rps8 zX o3}*&( *V(q}}*{*&( *V(q}}*V(q}}*{*{*{*0I{@7s] {,7 {s9 o^{,7 {s9 o^{,7 {s9  o^s*{,{s9 *{s9 *~o ~o ~o *07s s s rp~h ~( r2p~i ~( rRp~j ~( rrp~k ~( rp~l ~( rp~m ~( r҈p~n ~( rp~o ~( rp~p ~( r2p~q ~( rRp~r ~( rrp~s ~( rp~t ~( rp~u ~( *0'~(j o o t ,( **0~o t ,o **n~(j o o t*F~o t/*B~o s*0> r҉pD-rp+rcoprp(p ( *( *n{- o }{*( *( *0YrpsrBpsrpss rp(orpsrߋpss*.s *( *0Yrpsrpsr7pss rp(orpsrߋpss*.s *( *0Yr0psrpsrpss rVp(orpsrߋpss*.s *( *0Yr0psrpsrpss rCp(orpsrߋpss*.s *( *0Yr psr|psrpss r`p(orGpsrߋpss*.s *( *0Yr psrpsr+pss rp(orGpsrߋpss*.s *( *0Yrpsrpsrpss r p(orpsrߋpss*.s *( *0Yrpsrpsrpss rp(orpsrߋpss*.s *( *0YrpsrGpsrpss rp(orԝpsrߋpss*.s *( *0Yrpsrwpsrpss rp(orԝpsrߋpss*.s *( *0Yrpsrǡpsrpss rKp(orҤpsrߋpss*.s *( *0YrpsrpsrXpss rp(orҤpsrߋpss*.s *( *0Yrpsrpsrpss rp(orpsrߋpss*.s *( *0Yrpsrpsrpss rp(orpsrߋpss*.s *0Cu,t*uK, tKs *r1po: oO (. r3ps z(qot}o1oto5 }*V(q}}*{*{*0CQ7 {s] {,7 {so^sp*6(( *0F,u,t*uK, tKs! *rpo: o; (. r3ps z(q- r²ps z}}*(qo(s }o3ot(M }*{*{*0DQ7 {s] {,7 {s9 o^s*0T,u,t*u, ts' *uT,s& *rpo: o; (. r3ps z:(q}*r(q- rPps z}*{*j{, {op*~0*j, o5 t*rtps8 z,u,t*rpo: oO (. r3ps z}(}}}*}(}}}*0<u -*{{3 {{3(5 o5 (R**0$|(6 {,{o" a *{*{* *Z{, {op**0` .-YE+'(o*(o*(o*,(5 *rp5(( (Qz05 rp{5r-p{(p *&(. **(/ *:~(/ *0o^(4 -O{om {, {o$* _ ` {o#iYoE * {4o$*r(}}}**(< **(? *0](2 rps) zom }},}*(@  iY4 i(9 }*0 +X Y _-*{*{*{*2(B (*0({2 rps) z(k Ҝ(*0$@ {, ` {{o$*0<u -*{{3 {{3{{(**0*{ (7 { (6 a{(a*0F,u,t*uK, tKsK *r1po: oO (. r3ps z0V(qo,sU}+ sU}}}}}}}*0(qo o& &o% t$}o& &o% (}o& &o% ({}o& &o% u,,t(}o& &o% ({}+}({}o& &o% (}o& ,o% t(}*}*{*{*{*{*{*{*{*0P7 {{{s] {,7 {s9 o^7 { { o^{,!7{s9 o^s*:(q}*V(qs9 }*V(qs9 }*:(q}*j- rps8 zo5 (Y *0A,u,t*u<, t<sW *rzpo: o; (. s8 z{*{u,%{to2 3{t(**2{op*(qsU}}}}*0O(qot$}o(~ }o({}ot}*6((` *0A,u,t*uK, tKs^ *r´po: o; (. s8 z{*{*{*{*02G7 {{{{s*0F,u,t*uK, tKsg *rpo: o; (. r3ps z(qot}ot:}*V(q}}*{*{*0 G7 {{s*0!s o#tK ( so*:s (o *:s (p *0}- rps zo -rprps z{- }+{.}s o / o(l  o s<z *G'n 0s +o &(o % -*( *&(s *0ks } `4}4}(Q }{o&{{} {} {} * * * *j*j***j**0 -*{} {} {} {{ -V{-N{} {{{ `o] } {{ -{} }{{o {,3*,.rp{{ (. s) z{-3{{ 3*{{ 39*{{ Y*2{o[ **2{oV *{o] 0*{ _*( *0)i@  +( X i2s_ *0+^oz 4  +o{ ( X i2*B(3 iox *2(3 o2 *2(3 o1 *08sB ~io& rpoJ (. s- zoF *0F~io*08sB ~io& rhpoJ (. s- zoF *0F~io*04sB ~o& rhpoJ (. s- zoF *06~o*.s*( *(5*"(6*&(7*JoG t( *0E( }o}oo((} rpsz*7 0)y}{ooK rpsz* uz{3( *{oL* 3( +# 3{ .( + {oL}*n{ oL{ oL*02{3 + ( X i3*{ioM*02%{3X  + ( X 3*{oM*0)o {ioM{ooO*2{o*2{o*2{o*2{o*0}sB ( oF *J( {o *N( 5}*:( }*&( *0( o3rpr<ps zo-5}*o i X[ ( 5}]  /k%X+b%X` 2{Y% +9%X+b%X`X2{Y% 0*0C{i /*{,{Y% ,X*{Y% ,X*0*0g(  -*Y { bX  6  6 X d +& X d + 6 X d + X d 5 *0*25 {i 2+ {(9 *0(  -~g*{Y 4  +&Z_d-,  %X Y/YZ X4 +   X  2Y +0 +  %X {  Z_dҜ Y  / Y  /s*0(  -*{Y/%X {i1{iX( }  +G{ {5%q5b5,{5%q5`5 X 2*0(  -*-*1 rJp5rp(^ rY<ps zX5  Y {_b +$ { _b{ Y_d` X 2{Y_ds *0R1o  X {i1 ( } +&{X5%q5{a5X 2*&{i*0!1c _ _b {_*0*1c _ _b {5%q5a5*0*1c _ _b {5%q5`5*0Xc {i/ ( }o Xo s  XXcs   +6+{ _, o X2 b o X 2*0W1XY +8( ,+Y ( ( i + X( Y% /Y /Xc( }*@ADEPQTU05%І(> Xc {i/ ( }Xs   8+1d{ Z_d_b`X2{ X{ d ++d Z_d_  b  ` X  2{ XX X ?X*0Eu-*t (  o .* +{{.*X 2*0%%(   +Z {a Y% /*Z{oH ts *0s(  -r]3p*{Y( ss Y +<{( oz +r]3p (. X2 oM &Y /o *z(j - rps z}*{*03*u -*( *v{{o ,(m **N{o" (n a*z(- rps z}*{*03*u -*( *v{{o ,(**N{o" (a*0M( }o}{4}{4}{4}*{*Z{orp(. * *2{o*{- ( *( *}{{{i(9 {o*0(}u,wt o i{i/>{{iiYi(9  + {X {iiY2+{{i(9 o( {o*2{a*08{Xi1 r{psjz{Xi1 rpsjz{{>{{Y{Y( % {{YXX{Y( %{{{o& +'{YXXY( %X {28H{-b{{{o& +#{XX( %X {2%{{X}8{{@{{{o&( XX( {{{Y(9 {{Y(9 {{{o& +'{YXXY( %X {2%{{X}{*0J{Xi1 r{psjz{Xi1 rpsjz{{> {{Y{Y( X {{YX{Y( {{{o& +%X {YXY( X {28^{-_{{{o& + {XX( X {2%{{X}8{{@{{{o& X ( X( {{{Y(9 {{Y {{Y{{{o&+.X{YXY( X{2%{{X}{*^ss} (d*0{ o 4 s { o ,{ io { io { o &i(9  +W{ o { io { o & + X4%q4 aҁ4 X i3X 3*vdҜdҜdҜҜ*0_{ o  XY[ 4 Z4 +/( {{{ YZ( X1 *"oo*0[(  (*0%[[X(  ss*0([[X(  ( s*0[(  s*0Ru, to9 u>- rضpszt>} } { oo} *z{ , { Y[*{ X[*z{ , { X[*{ Y[*0E{ X[ 1 rpsjzs { oo2 rpsjz*05o { ,$(  i/4 iiYoA  *0{ u?9{ t? o o o ooo  oo ooooo  o  *{ o{ oo*( *r8p*0Vu,t o9 t +t { oo }o}o}*2{ o *2{ o *06{ o  {, (  +(  { o *0>{ {o{ooo {oo *0-{o  {o o o *Js } ( *( }}}o 4}*( }}}o 4}}*}}}t}*0i  {oE sA  {oG  {o{o Y{-D [X( 4 +XaҜX3 [s +Y{toI [ [X( {[so{o& [ [s {oF {o {o {io {{o &X +"{  X. r6psT z X  {i2*0y  {oE sA   {oG {-W[X( {o X4  +XaҜX3[s 8{toI [[X( {[so{o 4 { o#  {  o'X  {o X4    (9 [[s {oF  {o { o {  io { o &*0&4 {o{io&*0H{{o{{o o {- ( *( *F_d Y_bX*F_b Y_dX*0_bX Y_d`XX_bX Y_d`XX_bX Y_d`XX_b Y_d`XXXXXX*0X_bX Y_d`XX_bX Y_d`X_bX Y_d`XX_b Y_d`XXXXXX*0X Y_bX@Y_d`XX Y_bX@Y_d`XX Y_b@Y_d`X Y_bX@Y_d`XXXXXX*0XX Y_bX@Y_d`XX Y_bX@Y_d`X Y_b@Y_d`X Y_bX@Y_d`XXXXXX*0  +bXX X 2*0 +YXҜdX 2*0Wa ~#ҕ ~%dҕa ~$dҕa ~"dҕa Xa ~"ҕ ~#dҕa ~%dҕa ~$dҕa 9%q9 aa99%q9 a( aa9Xa ~#ҕ ~%dҕa ~$dҕa ~"dҕa Xa ~"ҕ ~#dҕa ~%dҕa ~$dҕa 9%q9 aa99%q9 a( aa9*0{9%q9_( a99%q9X`a99%q9X`a99%q9X_( a9*0 Y9 9 9 9 i.._ ;8}( ( (  ( %%  %  8( ( (  ( ( ( ff}+i( ( (  ( ( ( ( ( }+ rnps8 z+XaX2~!( +9%q9a9X2~!( {99D{{{{{( { (  ( { { {( {( { ( {{{{{( {(  ( { { {( "{( {( *{{{{{( {(  ( { { {( {( {( {"{#{ {!{( {(  ( { { { ( "{( {( *+XaX2~!( 9q{{{{-{( {( { ( "{,( {( {( {( "{$( {( {( {{ { { 1{(( {{{{{ ( {( 3{( *{{{{-{( {( { ( "{( {(( {( {( "{( {$( {( {{{{1{( {.{/{,{-{ ( {( 3{( *0 +7{ ZX( { 9%q9{a9X 2{ {( { {( { {( { {( { { ( { {( { {( { {( { {( { {( { { ( { 9%q9{a9{ 9%q9{a9{ 9%q9{a9{ 9%q9{a9{ ( { X( { X( {  X( *0  +7{ ZX( { 9%q9{a9X 2{ {( { {( { {( { {( { { ( { {( { {( { {( { {( { {( { { ( { {( { {$( { {(( { {,( { 9%q9{a9{ 9%q9{a9{ 9%q9{a9{ 9%q9{a9{ ( { X( { X( {  X( *`9}9} 9}9} ( *u- rps8 zto( }*rp* **0\{- r ps< zXi1 r{psjzXi1 rpsjz{, ( *( **f;XzsL/7ƾOSTo'-hˆVppp,,,'''WWW555 AAA###kkkEEE!!!OOONNNeee|||>>>000___^^^ 999GGG]]]===ZZZQQQVVVlllMMM fff---ttt+++ LLL444~~~vvvmmm111XXX:::aaa222SSS"""DDDzzz$$$```iiiPPP}}}bbbTTT[[[dddHHHuuu ???\\\JJJ333sssgggRRR&&&777;;;oooKKKccc...yyynnn)))///YYYxxxjjjFFFqqq%%%BBBrrrUUU 666III***hhh<<<888@@@((({{{CCCwwwppp,,,WWW###kkkEEEOOO|||>>>^^^ 999]]]ZZZQQQlllttt+++444vvvmmm:::222SSSzzz$$$```iiibbbTTTddduuu ݇͐sssRRRƁoooccc)))///xxxqqqԫrrr666***<<<@@@ӻCCCwww'''555 AAA!!!NNNeee000___GGG===VVVMMM fff--- LLL~~~111XXXaaa"""DDDPPP}}}[[[HHH???\\\JJJ333ggg&&&777;;;KKK...yyynnnYYYjjjFFF%%%BBBUUU IIIhhh888((({{{ǞXXXgggNNN jjj]]]FFF'''222KKKBBB:::%%%{{{ qqq___>>>|||```444MMMrrrzzz555aaaZZZ$$$VVV@@@ccc 333hhh oooSSSbbb...(((ttt666"""888ddd999,,,000DDDeeekkk###HHHQQQUUUAAACCC///<<<+++ GGG~~~)))!!!fff;;;777LLLnnnvvv---&&&}}}\\\OOO???yyyRRRmmm^^^iii111 uuuJJJWWWEEEsssYYYlllTTTxxxpppIIIPPPwww***[[[===888AAAvvvٓ```rrr«uuuWWWɢҐ'''IIICCC\\\>>>gggnnn///ⅅ SSSeee꣣쀀---kkk+++666ņMMM333fffXXX::: xxxBBB&&&aaa???;;;Ԙ苋 ,,,oooNNN yyy"""YYY===tttTTT000~~~(((UUUhhhPPP111***ppp222iiibbb$$$EEEsssmmmJJJ...%%%HHH{{{οqqq)))llldddcccKKK___FFF777^^^GGG[[[ZZZ<< ! 9%Ј(> " 9%Љ(> # 9%Њ(> $ 9%Ћ(> %*rLp*(*j5}1(o*05}1({'}'{(}({)}){*}*{+}+{,},{-}-{.}.{/}/{0}0{1{1{1i(9 {2}2*0^{1%{2% X}2 _X _b`X _b`X _b`{23o*{21o{1n_i{1 di*ҜXdҜXdҜXdҜ*0({'( {(X( {)X( {* X( {+X( {,X( {-X( {.X( {/ X( {0$X( o(*0( #Eg}' }( ܺ}) vT2}* }+ 2Tv}, }- ͫ}. gE#}/ -<}0}2 + {1X {1i3*F_b Y_d`*aa*&_f_`*f`a*&_f_`*f`a*0 {' {( {){*{+{, {- {.{/{0 ( X{1X ( X  ( ( X{1X( X (  ( X{1X( X (  ( X{1X ( X ( ( X{1X( X  ( ( X{1X( X  ( ( X{1X( X (  ( X{1X ( X (  ( X{1X ( X ( ( X{1 X ( X  ( ( X{1 X( X  ( ( X{1 X( X (  ( X{1 X( X (  ( X{1 X( X ( ( X{1X ( X  ( ( X{1X( X  (  ( X{1X 拢PX(  X  (   ( X{1X 拢PX ( X   (    ( X{1X 拢PX ( X (   ( X{1X 拢PX (  X  (    ( X{1 X 拢PX ( X  (  ( X{1X 拢PX(  X  (   ( X{1 X 拢PX( X   (    ( X{1X 拢PX( X (   ( X{1 X 拢PX(  X  (    ( X{1X 拢PX( X  (  ( X{1X 拢PX(  X  (   ( X{1X 拢PX ( X   (    ( X{1X 拢PX( X (   ( X{1 X 拢PX(  X  (    ( X{1X 拢PX ( X  (  ( X{1 X 拢PX(  X  (    ( X{1X yZX( X (  ( X{1X yZX( X (  ( X{1 X yZX( X ( ( X{1X yZX ( X  ( ( X{1 X yZX ( X  ( ( X{1X yZX ( X (  ( X{1X yZX( X (  ( X{1X yZX( X ( ( X{1 X yZX( X  ( ( X{1X yZX ( X  ( ( X{1 X yZX( X (  ( X{1X yZX ( X (  ( X{1X yZX ( X ( ( X{1X yZX( X  ( ( X{1 X yZX ( X  ( ( X{1X yZX ( X (    ( X{1X $M\X ( X   (    ( X{1 X $M\X ( X (   ( X{1X $M\X(  X  (    ( X{1X $M\X( X  (  ( X{1X $M\X (  X  (   ( X{1 X $M\X( X   (    ( X{1X $M\X ( X (   ( X{1 X $M\X (  X  (    ( X{1X $M\X( X  (  ( X{1X $M\X(  X  (   ( X{1X $M\X ( X   (    ( X{1 X $M\X( X (   ( X{1X $M\X(  X  (    ( X{1 X $M\X( X  (  ( X{1X $M\X (  X  (   ( X{1X $M\X ( X   (    ( X{1X nX ( X (  ( X{1 X nX ( X ( ( X{1X nX( X  ( ( X{1X nX( X  ( ( X{1 X nX( X (  ( X{1X nX ( X (  ( X{1X nX ( X ( ( X{1X nX( X  ( ( X{1X nX( X  ( ( X{1X nX( X (  ( X{1X nX ( X (  ( X{1X nX( X ( ( X{1 X nX( X  ( ( X{1 X nX ( X  ( ( X{1X nX( X (  ( X{1 X nX( X (    ( X{1X >pmX ( X (   ( X{1X >pmX(  X  (    ( X{1X >pmX( X  (  ( X{1X >pmX (  X  (   ( X{1X >pmX( X   (    ( X{1X >pmX( X (   ( X{1X >pmX(  X  (    ( X{1 X >pmX( X  (  ( X{1 X >pmX (  X  (   ( X{1X >pmX ( X   (    ( X{1 X >pmX( X (   ( X{1X >pmX(  X  (    ( X{1 X >pmX ( X  (  ( X{1X >pmX (  X  (   ( X{1X >pmX( X   (    ( X{1 X >pmX( X (    ( X{1X ܼX ( X ( ( X{1 X ܼX ( X  ( ( X{1 X ܼX( X  ( ( X{1 X ܼX( X (  ( X{1X ܼX( X (  ( X{1X ܼX( X ( ( X{1 X ܼX ( X  ( ( X{1X ܼX( X  ( ( X{1 X ܼX ( X (  ( X{1X ܼX( X (  ( X{1X ܼX( X ( ( X{1X ܼX( X  ( ( X{1X ܼX( X  ( ( X{1X ܼX( X (  ( X{1X ܼX( X (  ( X{1X ܼX ( X (  ( X{1X vmzX(  X  (    ( X{1X vmzX( X  (  ( X{1X vmzX(  X  (   ( X{1X vmzX ( X   (    ( X{1X vmzX( X (   ( X{1 X vmzX(  X  (    ( X{1X vmzX( X  (  ( X{1X vmzX(  X  (   ( X{1X vmzX( X   (    ( X{1 X vmzX ( X (   ( X{1X vmzX (  X  (    ( X{1 X vmzX ( X  (  ( X{1 X vmzX (  X  (   ( X{1X vmzX( X   (    ( X{1 X vmzX( X (   ( X{1X vmzX(  X  (    ( X{1X NSX ( X  ( ( X{1X NSX( X  ( ( X{1X NSX( X (  ( X{1 X NSX ( X (  ( X{1X NSX( X ( ( X{1 X NSX( X  ( ( X{1X NSX ( X  ( ( X{1 X NSX ( X (  ( X{1X NSX( X (  ( X{1X NSX ( X ( ( X{1X NSX ( X  ( ( X{1X NSX( X  ( ( X{1 X NSX ( X (  ( X{1X NSX( X (  ( X{1X NSX( X ( ( X{1 X NSX( X  (   ( X{1 X( X  (  ( X{1X(  X  (   ( X{1 X ( X   (    ( X{1X ( X (   ( X{1X (  X  (    ( X{1X( X  (  ( X{1X(  X  (   ( X{1X( X   (    ( X{1X( X (   ( X{1X (  X  (    ( X{1 X( X  (  ( X{1X(  X  (   ( X{1X( X   (    ( X{1X ( X (   ( X{1 X (  X  (    ( X{1 X ( X  ( %{'X}'%{(X}(%{)X})%{*X}*%{+ X}+%{,X},%{- X}-%{.X}.%{/X}/%{0X}0}2 +{1  X  {1i3*( }3(}4}5*{3*2{4(*( *{5*r`p*rpp* *.(*N( (*0sB -+ oD oD oD oD  (3 o2 i (/ (3 o2 i (/  coD  oD coD oD  oE oE oF *B{ *0)%{b{X  (3 {ox *0?1{b{X {b{X X (3 {ox *0E4 8cҜ0cҜ(cҜ cҜcҜcҜcҜҜ*.(*B( (*06{ _j8b{ _j0b`{ _j(b`{ _j b`{ _jb`{ _jb`{ _jb`{n j_` *04 ,***(*>($ (*>{*0}A}B(o }>o }?{>e.O{>,h4}@{@{@i({@i/s z{>3.o }A*o &o &o &o }B*}A}B(}>}?*}A}B(}>}?}@*}A}B(}>}?}@}A*{>*{?*2{@(*(0 *r{A_X{AcX_bj*{B*0u{>oD {?oD {>e.+{>, {@o{>33{AoD *GoD NoD UoD {BoD *0(sX}CsX}DsX}EsX}F{CoZ{DoZ~hoo }G{CoZ{EoZ~hoo }H{EoZ{DoZo}I*0(o 2- rxps8 z sY}CsY}DsY}EosY}F~hoo }G~hoo }Ho}I*r{DoZ{EoZo*2{CoZ*2{DoZ*2{EoZ*{G*{H*{I*r?Ap*0( & * 03 {C{D{E{Fo *Zu,t*s@ *:(}_*{`,}`{a*{_o *0C{`-{_o] *{a/*- rps z{aҜ}`*(*N(/s z*2i(D * 0]{`-${_o }a &}a}`{a2!{a@_, {a?_*{a?_c*{a* L0o /* _- rps) z@_   9?_ o  / 8 0&{_o  YbX X 8 3={_o b{_o b`{_o b`{_o ` 8__b +z_?_c   E C+Fo +Ho bo ` +6o bo b`o b`o ` ++ rps) z - ,+ sI   s@   E'/7?GOW_gow *:(q}h*f(qoo}h*{h*F{hos>*Br̹psi*( *6((_ *0Cu,t*uK, tKs` *rpo: o; (. r3ps z0H(q }jou,o(S}k+ sU}kXo(S}lXo({}mXo( }nXotK o(}oo(}pXo( }qXo(}roXYY +^XXot o2 YE +* (}s+ (}t+  (}uY 0*N{koXoX*{k*{l*{m*{n*{o*{p*{q*{r*{s*{t*{u*{j*0F,u,t*uK, tKsr *r޹po: o; (. r3ps z0H(q,%on3ooto r0po? , r0ps8 z}v}w*&(o *b,+r0psk(p *0(qo2 o1r;po5(( s8 z +Qo(-  o2  E+(}v+(m}w+ rǺps8 zX o3*{v*{w*Z{wooto *0^{v-/*{vo i/  +.oo u, to +  o X i2*0WQ7s] {v,7 {vs9 o^7 {ws9 o^s*0rp(u r p(I ss {v,{voi-rpoM &+C(v  [ot oM & +r0poM oM &X i2]ot &o *6((z *0Wu,t*uK, tKs{ *uz,tz((z *r%po: o; (. s8 z0ds }x(q}yo +'o% u- r[ps8 z{xo o& -u. ,o' *3R0|s }x(q7s] oS ++o% t< 7  o^{xo o& -u.,o' s}y*$7[N{xo *F{xo se *2{xo *2{xo *{y*r(q- rps z}z*01G(q7 sUos>s}z*0{zot os*6( t*"( *0h{zo+5o% t7 op u,t o2 3 o5  "o& -u.,o' * * BO{z*0Prۻpsrpsr/psrYpsrpsrpsr׼psrpsr+psrUpsrpsrpsrٽpsrpsr1psr[psrpsrpsrپpsrpsr/psr[psrpsrpsrٿpsrpsr%psrKpsrqpsrpsrpsrpsr psr3psr]psrpsrpsrpsrpsr/psrYpsrpsrpsrpsrpsr+psrUpsrpsrpsrpsrpsr-psrYpsrpsrpsrpsrpsrpsrIpsrypsrpsrpsr psrApsrupsrpsrpsrpsrEpsrypsrpsrpsrpsrMpsrpsrpsrpsr#psrYpsrpsrpsrpsr1psrgpsrpsrpsr psr?psrups~~~~rpsrpsrpsrIpsrpsrpsrpsr!psrWpsrpsrpsrpsrpsrGpsrwpsrps*( *0Cu,t*uK, tKs *r1po: oO (. r3ps z0FsU}(q}}},{,{- rps8 z*0HsU}(qot$}o( }o(}o1ot (}{,{,{- rps8 z*{*{*{*{*0VQ7 {{{s] {,7 {s9 o^s*(q}}}}}*0(qo(}o(}ot}o11ot(}ot(}*o10ot o2 -(}*(}*6(( *0F,u,t*uK, tKs *rpo: o; (. r3ps z{*{*{*{*{*0|I7 {{{s] {,7 {s9 o^{,7 {s9  o^s*0(qo 8o% t o2  E +S(^}+O(^}+@o3  (}{,${o1rhps8 zrps8 zo& :pu.,o' * 0Z(q,o1 rhps8 z,op(]},op(]},optK}*z,u,t*(s *{*{*{*0I7s] {,7 {s9 o^{,7 {s9 o^{,7 {s9  o^s*0F,u,t*uK, tKs *rpo: o; (. r3ps z0~(q- rps zo2 o1 r;po5(( rps zoop(}o1oop(}*&( *(q- r4ps zs}, s}*&( *0~(q- r4ps z( (~-rFpr4ps z(\s},3н( (~-r@prps z(\s}*0B{o  +{oop(VX {o2*0L{-*{o  +{oop(1X {o2*0=Q7 {s] {,7 {o^s*0F,u,t*uK, tKs *rpo: o; (. r3ps z0~(q- rps zo2 o1 r;po5(( rps zoop(}o1oop(Y}*&( *(q- rps z}}*{*{*0GQ7 {ops] {,7 {opo^s*0F,u,t*uK, tKs *rpo: o; (. r3ps z0Z(q- rps zo. r;po5(( rps zooptK}{o +o% t7 op( &o& -u. ,o' *`$(q- rhps zs}*0H(q- rhps z( (~-rrprhps z(\s}*0B{o  +{oop( X {o2*2{s*0F,u,t*u,tos *rcpo: o; (. s8 z2o5 ( *0<(- rps z} ( & r2poJ (. s8 z* $E(rp(y ra3p(. } *r((0 iox } *J( rp( *J( r3p( *0( ( ( *0-{ -o /Q{ +o /A{ oz  3{  o| rp(. *{  o| r93p(. *{ -o /{ +o {  { oz Y3 r.p(.  3B/  o| r4p o| r-p o| (v */  o| rM3p  o| r-p o| (v *( *0'(  o{ 52r@p+rFp (. *F(0 { o2 *>( o!*0u -*{ { o? *2{ o" *{ *:( } *{ *0-{ o s>  rLpoJ (. s z*0(/rprps z} *08{ 1&{o /s z%{ Y} *o*0H%{ 16{ (/ {o] /s z%{ Y} *o*0G{ 1/{ 4 {({ /s z} +~  o*24 *2o5 ( *(qu-u- rps8 z} *0[(qr3p(y ra3p(. o| (  2 1 s} *oK s } *0Wu,t*u, ts *u, ts *rpo: o; (. r3ps z{ u,{ to *{ to*0L{ u,{ to  *{ to  r2poJ (. s< z*33E{ *6(( *0Cu,t*uK, tKs *r1po: o; (. r3ps z0L(qo +o% u- rps8 zo& -u. ,o' }* &3N(qs}*2{o*2{o*J{ot*"( *{*:( }*2{sx *0-( (s  rLpoJ (. s z*0k0-6_[Om>Ic3n+ecc1^'Oo;{mqi_IzOU!jrRd!3M\cX~Twb)bUfXDu&6(GwCji \0BO$`>a[p_#^]bc4aDOrvoQr} ,5NWN`~YfkD|Rdpk)w4X^QX%.Nq}E) f3&bwA@ir~o<8.);W8V^l;lw0IWa:v6Il1l=RWq&'; $z<P5+R?# %85e&`z=jnt7& {drY 2lrefRZl~n 5%Ќ(> *( *( *0( o }o }o }o }o }o }"o }!o }%o } o }$o }#*s *{*"}*{*"}*2{se *6se }*{*"}*{*"}*{ *"} *{!*"}!*{"*"}"*2{#(*6(}#*{$*"}$*{%*"}%*0u -*{,:{o oy oz (r 2 , o(r 2*{,^ox{o$  + o% tfo ,+  o& - u.,o' -*{-{,Z~uo"-*((SoY{,{o1*{,{o/* ~yo"  , ((S & r - ( ,+*( ,*{%, oY{%o1*{$,1~zo" {#- ,* o{#(-** *n+!!B0123456789abcdef04%Ѝ(> & 4' +~'~&ҜX ~&i2~'A~'a~'B~'b~'C~'c~'D~'d~'E~'e~'F~'f*07% +) ~&coD ~&_oD X X2Z*^ . .  . **0 X + Y(, Y 0+aX / (-~'%X +X / (-~'%X b`oD X  2*0 oz + Yo{ (, Y 0+pX /o{ (-~'%Xo{ +X /o{ (-~'%Xo{ b`oD X  2*( *r( - rps z}(*2{(o$ *0Cu,t*uK, tKs *r1po: oO (. r3ps z(q*r(q})}*}+*0V(qo.rEprps zo( })o({}*o(}+*{)*{**{+*0)G7 {){*{+s*0zs ,s -s .s /s) 0~,r7prpso ~,r7prpso ~,r7prYpso ~,r8prYpso ~,rprYpso ~,r)8prpso ~,rU8prpso ~,rm8p~o ~,r8p~o ~,r8p~o ~,r8p~o ~,r9p~o ~,r59p~o ~,rQ9p~o ~,r9p~o ~,rp~o ~,rp~o ~,rp~o ~,r p~o ~,rJp~o ~,rtprpso ~,r9prpso ~,r9prpso ~,r:prpso ~,r:prpso ~,r:p~o ~,r:p~o ~,r ;p~*o ~,rE;p~-o ~,re;p~.o ~,r;p~/o ~,r;p~0o ~,r);p~*o ~,r;p~ o ~,rp~ o ~,rp~ o ~,r&p~ o ~,r^p~ o ~/rpsrU8po ~/~r8po ~/~r8po ~/~r59po ~/~r9po ~/~ r;po ~/~ rpo ~/rYpsr8po ~/rpsr7po ~/rpsr:po ~/~*r ;po ~/~-rE;po ~/~.re;po ~/~/r;po ~/~0r;po ~/~rU8po ~/~r:po ~/~r:po ~/~r:po ~.~r8po ~.~Prpo ~0~*o~0~-o~0~.o~0~/o~0~0o~0~Qo~0~o~0~o~0~ o~0~ o~~0s~ ~-rp(o ~~0s~ ~-rp(o ~~0s~ ~-rp (o ~~0s~ ~-r p 0(o ~~0s~~-rJp@(o *z~s~sUsUs*J(tK( *"( *J(tK( *0B( - rO6ps z- rps z- rps zo,rprps zo-rprps z(j ok ~,o t - r 6ps8 z~0o,s|}*+8~-o ,~-o t7s~}*+ s~}*(v s })( oK{)om ioMr4ps z oNs}+*!F{)o (*6((*0{*(( , ~/{*oo t/ , ( +z{*o(oK{)om   ioMr4psz{+ooO*,Yr,%uT-oJr|po , rp(Qz*0Ro ,<uT-4o~o ,"( oo(rp(. *oo*0~o ,rp*~o ,rp*~o ,rp*~o ,r)p*~o ,r7p*~o ,rEp*~\ o ,rDOp*~[ o ,rp*~] o ,rXOp*~ o ,r+fp*o*{2*r( - rps z}2*0b- r3ps zu>,.rIp t>o  & rpo (. s) zu,.rp tou rp o (. s) zu,to(*u,Cto,(! r.p(. 8rHp (vom +tu,r^p to +Xu,rp tok +<u,rp tok + rpo: oO (. r3ps z/("*-Rc 0 Q- r3ps z- rY#ps z- rAps z- r]ps zu,to( *  u,%t o,(! r.p(. ,- rpo: oO (. r3ps z(j ok rp(l ,rprpo -+4o@ ( (/  rp r<prRp(0 iox (}  ("*0( o:o ~Po 9rpQo:o(6 to o; o9o7sUo9sVo:sVo;sVsV sVs(k*~o ,r8pQo;ok*rVpo: oO (. rps z0L(#i1+  + {2o X i2{2o (w(%($*r{2rprp(I o *r{2rprp(I o *0[ i @@ +'(0 @o &{2o @X @Y @0(0 o &{2o *{4*&((*( - rps z}4}5*08rpo ;rpoz X -o 3oz Yo| o rp (.  %9_~: s %rHp( %rp( %rp( %rp( %rIp( %r.p( %rp( %rp( %r^p( %rPp ( %rpp ( %rp ( ~( 9E  &/8AO]+d(-*(,*(0*(.*(2*(/*(1*r8p(3*rp(3*(6*(*&{4o % :+*&(+*0sL +[:o 3o oM &+?,<o| o rpo , oK XoK o  o {4o % , o .-rp(. s) zo ], rps) zo ({*0%(*(( oos*6(*(*0/(* s (  rpo (. s) z*0/(* s(  rpo (. s) z*0*(* s  rpo (. s) z* 0(* sw*0/(* ((4  r@po (. s) z*0 s (+ r~po t/ rp(l 9{5- rps< z{5o - rps) zrvpo t/@,o o o ( (  (tK %9 r8p(l -rp(l -h8 s  o os o o o o o o o os 8 ot$  ot$  ot$ ot$ ot$ oX oXoXsoXs oXs +rp(. rps z srprpo (} s) z*AF0 (* (t o(5*0; (Z -/( -%( -(  -rp(. s, z*0 (* (tKs  ~+o s~ ops7 o os( ( sr$ps zrlps z*``1`o*( *:(7}7*z(7sssx}7*F{7ozo*J{7o{*{7o{- rps< z{7o{oo*:(#}8*F{8os" *2{8o*(@*( *&oD *Ҝ*NcoD oD *>cҜXҜ*zcoD coD oD *fcҜXcҜXҜ*coD coD coD oD *cҜXcҜXcҜXҜ*0U8coD 0coD (coD  coD coD coD coD oD *0K8cҜX0cҜX(cҜX cҜXcҜXcҜXcҜXҜ*0o /s zh*0 %o o `/s zb`*0.1o o o ``/s zbb``*0@do o o o `` `/s zjbjb`jb` n`*^i(i/s z*Z3. Fo*0 %o o 3. Fo*>oD oD *0 s s  o i XY [o4o4+goioo& oioioo& Z i ZY(/ (9 X2*0 iX[ 4 4 (9 iY(9 iiX4  i(9  ii(9 i4s (Us (U+ 4%q4aҁ4Xi2*( *{I*0~( }>}=o}A}G,  }B*u,  3}B*uq,  1}B*u,  2}B*r`ps8 z.(Y*Z{=or p(. *03u,$t o9 t> ,xo8 }?+juX,M-r,prps ztX o%t> o$}@{@i{G. rps8 zt> , s }?{>ooo}C{CX[4}D{B 3,{Di{=oY{GYYY4}E+*{Di{=oY{GYYY4}Eoa*0'{Fi.* +.*X i3*.i(` *07{F{Ei/{E%{F% X}F*{=o*+o_XY1{F{Ei21{=o*0I{=o}F{E, {E(^{I,{I(^}I}H*0h{=o 4 {=o&4 {FZj(f{=io{={E{Fo{=io{@, {@ +{G4 {? o@ {=  io{=o4{=o&{B 3{Di{FY iY{AYYY{D{E{DX{F(9 {DX{FX i(9 i{Di{AYY(g+%{D4%q4aҁ4Xi3{D{Di{AYY{A(9 {B 3{D{DiY +2{D{DiY{BdҜ{D{DiY{BҜ{D4%q4_ҁ4{>{D{Dio {E(^{D(^}F *0{>io {CX[ i/4 iiYoA (^ iY _ a- 8iY _biY _`  1. 2.; 3.+H{=uq-Fr;aps8 z{=u-.raps8 z{=u-raps8 zr9bps8 z {A4{=o&i{AY Y{Ai{AY Y(g+ 4%q4aҁ4Xi34%q4_ҁ4+ %X.i2i2 (^*}HiY{GY4}I{I{Ii(9 4 {IiZj (f{=  io{Ii,{={I{Iio{=io{={IiX{Go{=o4 {= o&i Y iY  +8    X.$(^ (^{I(^}H* X   i3(^ (^{F,){E{I(]-{E(^*}F{E(^*{H*vdҜdҜdҜҜ*8dҜ0dҜ(dҜ dҜdҜdҜdҜҜ*04 {A4 4  {=o (e{=o{=io{=o& {AZ{A(9 X% {A[2 {AZ/P (e{=o{=io{=o& {AZi {AZY(9 *V( }K}J*{Jor p{KoZ(I *0i}Lu,to9 t +t ,o- rpsz-o, rpsz(o{Ko[*6{Jo*>{Jo*0{L- r<ps< z{Jo4 {Jo&{Ko\ @4 o o iYoA @ iYoA oJ sz*2I{0g{L, rps< z{Jo4 {Jo&  s  s rp sz{Ko]*2K 2{Jo*( - r\ps z/rpprps z}M4}N*0%% ( }O{Mop( *0%% ( }O{Moq( *2i(y**(y*0l% (  +R{O/({M{N{Nios{Ni}O%X X{N%{OY% }O2( *\d0J(e o2!o 0(g oo2rprps z}P*0J(f o2!o 0(g oo2rprps z}P*{P*B(}Q*{Q*03*u -*(*v{Q{Qo ,(**N{Qo" (a*0M( }Ro}S{S4}T{S4}U{S4}V*{R*0E&u,<t o {T{Ti(9 ({Roo*Z{Ror p(. * *2{Ro*0{{R{U{Vo& +X{VXaҜX {Vi2{Ui Y% 2{U4%q4X% 4,{Ui*{T{U{Ui(9 {Ro*(*"(*0{Lo  (s (q -*(*"(*0({M, {M3 }M*{M3 }M*{M.O{M.E rp 5r<p 5rFp(p s8 z*0&{L{Mo  (s i(x -*4%Џ(> }Z( }W*0v&}Yu, to9 u, t}X*u,<t o i.r^prps z}Zot}X*2{Wo*09{Y- rps< z[ Z. rpsjz{ZiX4 {ZiX4 {Z{Zi(9 {Zi(9 {W{Xo 88{Zi(9 Z{Zi(9 {Wo& ZX+1{ZiY4%q4aҁ4dX-(9 Z(9 X>d X @Q*0{Y, r ps< z[ Z. r8psT z{ZiY4 {Zi4 {ZiX4 {Zi(9 {Zi{ZiY(9 {W{XoY 88 {Zi(9 YZ {Zi(9 ZX+1 {ZiY4%q4aҁ4dX-{W  o& (9 YZ(9 Y<_Y_de_b`* 9}[ 9}\4}a( *2s (*r(+- rMps z}c*2{co`*u, to9 {coa*2{cob*6{cog*6{coh*>{coc*0=o 0+4 o 1/4  (9 *0S- rps z/*o 0+4 o# 1/4  (9 *N{cod*0=~P o 1)4 o' i/4  (9 *0`- rps zo ~P 1>4 0+ o# o'X i/4  (9 *:{coe*2{coi*04(( ( , o" a ( , o" a *0L3*u -*(o(,%(o(R,(o(**(*N(sX}d*N(sY}d*r?Ap*2{doZ*0( & * 6{do *V( }e}f*{e*{f*0{fiX  / oD +c 0( Y c _ XoD oD +3 oD coD coD coD oD {eoD {f{fioE *043*u -*{e{e3{f{f(**v{e3o" {f(a*0r( _b _`}h _}i _}ji{hY4}k{h{k{ki(9 *:((*0H}sB oD oD oD oD ~g~gioE ioE oF *{i*{j*{k*6 4g*( *.oX[*.oX[*0@zo i1rHprps zi14 iiYi(9 **6((*0_,u,t*uK, tKs*u,to5 (*rpo: o; (. r3ps z0s }s }(qo8o% t7 op( o2 o1r;po5(( s8 zoop( o3oop(o+ oYoop({ so {o &o& :>u.,o' *$&(*0s }s }(q,+o {of {oS +$o% t {o tzo o& -u. , o' *A0q0| s }s }(q{of  {oS +(o% t {%X oT tzo o& -u. , o' *64j2(o$ *2{s*J{o tz*0!7s] {oS 8o% t {o tz 7s] o, 7~ o^ 7oo^7 so^o& :ku.  , o' s*0{"{o {o .*{o o$ +/o% t {o {o o - o& -u. , o' **+;f0rpsnrpsorr[psprpsqr\psrr\pssr[pstrpsurpsvrpswrpsxr.psyrBpszrVps{rjps|r~ps}rps~rpsrpsrpsr(\psrpsrpsr psr.psrTpsrzpsrpsrpsrpsrps*0d,u,t*u,tos*u,to5 (*rcpo: o; (. r3ps z2o5 (*(- rps z~o -r$pr4p(I s z}*{*6((*0 j? @j? j? j?!2l!2N!20!28c j`oD 1c j`oD *c j`oD #c j`oD c j`oD c j`oD c j`oD c j`oD j_oD *0l#oX[ -oD * 4 Y + o_ `Ҝo Y /Y4%q4_ҁ4ioE *0${s  sB s o  ( o  ( (ZXj(+-o  oz / ( (+  s(o -oV oF o!*2{o" *0u -*{{o? *{*0%sL j   8!/{ jZ_jX  _: ,Ei([E +0ot &+ 1ot &(jY +2ot &PjY  .ot &o &j +D-( o _j(o   _-.ot &oN & j Xi@o *BrLps *"(*0~orvp(. sr|psrpsrpsrpsr psr0psrTpsrxpsrpsrps*0(qoz 1 o| } E)+4s }*s`}*s2}*s}*s`}*(qoz 1 o| }s`}*:(q}*0Cu, ts*u,t*rpo: o; (. r3ps z2{t<*2{o *0Cu,t*uK, tKs*rpo: o; (. r3ps z(qo. rps8 zo(}o(l}*V(q}}*{*{*0 G7 {{s*nrDp{or5p(I *~rtpsrps*f~w s9 s(n*f~w s9 s(n*f~w s9 s(n*0G{7 so^*01&{7 7 sUso^*0,&{7 7 so^*{*b7s]}( *0D(q}}}}}}}}*0(qot$oX o, rps8 zot$oX}ot$oX}ot$oX}ot$oX}ot$oX}ot$oX}ot$oX}ot$oX}*{*{*{*{*{*{*{*{*0G 7 sU(sV(sV(sV(sV(sV(sV(sV(sVs*0Cu,t*uK, tKs*r1po: oO (. r3ps z0D(qo.rEprps zo( }o(S}*j(q}sV}*V(q}}*{*{*0 G7 {{s*0?(qo} +{o( X {i3*b(qoH t}*F{oH t*2{so*Zob2s*~*^ob2s*~*"(*>((*0+Yi(  + (X i2(*&(*0MZob(oc +o% t7 (o& -u. ,o' ,(*20b[sB s o+o% t7 o'o& -u.,o' oV oF 1 o!*!6.s*:(}*0.{s' +(o#% -}}*Z{-((*V{-((*V{-((*~{,(*1{o!*0Z,u",t"*uK, (s#*u, ts"*rpo: o; (. r3ps zj- rps8 zo5 ( *0^'(qo2  E+&(o}*(o}*rBpo2 5(( s8 z:(q}*Ns>s8 ("*Z{,*{,**0@{, {ok ( r*p(( s< z{,{*{**00@{,{s>s8 *{,{s>s8 *{op*0F,u$,t$*uK, tKs)*r`po: o; (. r3ps z0l(q- rps zo. r;po5(( rps zoop({}oopt}*(q- rRZps z- rps z}s>}*(q- rRZps z- rps z}}*{*2{o*0 G7 {{s*0_,u%,t%*u,tos1*u,to5 (/*rcpo: o; (. s8 z2o5 (/*Z(0 iox (2*r( - r3ps z}*{*F(0 {o2 *>(4o!*0(u% -*{{o? *2{o" *u&,t&*uK, tKs9*rpo: o; (. s8 z(qo( }ot$}*j(q}sV}*V(q}}*{*{*0 G7 {{s*0D( ot$}ooj({}otLs1}*{*{*{*vs}( s }*^s }{o{*6{o *J{so *J{so *f{sVso! *{sVsso" *f{sVso# *0v)- r.ps zo} ,]o$ +6 o% t {oi((o  r:ps:z o& - u.,o' *-J 0Ba0F}(} r 6ps z{(}{{o * R{so|*>{o|*f{ss>o|*R{s>o|*&(R*04*(S {{( rps:z(T* 0{o~-{{oo$ {o% *0.G7 {ss(ss*(*0_( rprp(I }rprp(I }rprp(I }rprp(I }*0D+sL + . ot &o %  .  ./2o ,/*o *0,sL +{o? -?{o? -1(W% -+${o? -!{o? -oM &(W% -o ,+o ({( uK- rps) ztK**N( ( }*( (bsVs s }*0?-( ( oJ s?z(bo sVs s }*  f( (bs }*( s}(ss }*0".{o  ,ooo**0".{o  ,ooo**0.{o  , oo**0.{o  , oo**2shs*0Bo  +- on3oo( o , &X i3* *10=/is  +#on3oo( o &X i3o *0No(d is  +uf, o &X i3f( o! t*{o ,{o (e**{o ,{o o (e**{o ,{o o oX**Z{optKsY*00{o ,G{o o oXo o ,({o o (c+ ݸ{o , ({o (c, ݋{o ,u (_(  & i(^E +0o (vok io+o  io( (`(- & * *A40)13*u*-*t* {{o *2{o" *^u>-*t>(j*0n5}5}s!}s}(  5}4}}}}(o*02, {{. {&&{3 {o$}}}% }}{,{ jo% }} *0 3{  { { { {{2 {Y+ {YY{E vsM Q 8 ,+D}}} %{  { YjX}  } }(t*Y{  %X __b` X 2_ _}cE(8!c Y _ _c Y }855    (&{  o"c Y }8c Y }8c Y  }r<p} }}} %{  { YjX}  } }(t*,+D}}} %{  { YjX}  } }(t*Y{  %X __b` X  2fc _ _.[ }rbp} }}} %{  { YjX}  } }(t* _}% {-{-++}8-D}}} %{  { YjX}  } }(t*:{3-{,%{2 {Y+ {YY:}(t{{2 {Y+ {YY{3-{,%{2 {Y+ {YY-D}}} %{  { YjX}  } }(t*{ 1 1 {  {(9 X YXY%{Y%}:i{-+}8R,+D}}} %{  { YjX}  } }(t*Y{  %X __b` X 2 ?_% }_0 c_1[ }rp} }}} %{  { YjX}  } }(t* _Xc_X {, {i/5}+ +{  X  2c Y }}8,+D}}} %{  { YjX}  } }(t*Y{  %X __b` X 2{~%{%X}_c Y {{ cX2+!{~%{%X}{2{{{{{{o ,[3} }}}} %{  { YjX}  } }(t*}}{ { _Xc_X<{ +q,+D}}} %{  { YjX}  } }(t*Y{  %X __b` X 2{&&{{~_XZX {{~_XZX/,_c Y {%{%X}8.Y+ .+  +q,+D}}} %{  { YjX}  } }(t*Y{  %X __b` X  X2_c Y  ~ _X  _c  Y { {   X _Xc_X0 3g /b} }rp} }}} %{  { YjX}  } }(t*.+ { Y{ %X  Y% - }8U{5555 { { _Xc_X{{o ,[3} }}}} %{  { YjX}  } }(t*{{{o"}}}} %{  { YjX}  } }{o#%. (t*{o${  { { { {{2 {Y+ {YY{- }8}}(t{{2 {Y+ {YY{{.D}}} %{  { YjX}  } }(t*}}}} %{  { YjX}  } }(t*}}} %{  { YjX}  } }(t*}}} %{  { YjX}  } }(t*^(o}}*0 {(9 % }}*6{.**0n{  { {1{+{Y { 1{  ,3%{ Y} %{ jX} {,({ {{o% } } {{ (9 X X {@ {{3}{Y { 1{  ,3%{ Y} %{ jX} {,*{ {{o%}} {{ (9 X X } }*??     5%А(> 5%Б(> *( *0Hi( (0 o2 *0&4i( (0 o2 ioE i*0$4( (0 o2 ioE i*0H(0 iox ( *( *0({ ioE i*( *0<5o$ +o% o - o& -u. , o' ** '0d6rpss o$ o& ,:o% o oM &+r0poM &o% o oM &o& -]ot &o *:(*07}}}( }}}}}(_, oT +s rlOp(  rps zo    io( s~sBssh oi o r^ps zsM}*Z g tL"}*"}*"}*"}*"}*"}*"}*0 8o)s ~0s~ o*sh  {0{0 {1W{1 {sU{1 {sU{1 {sUs {, {(o,, o,sV{s o+, o+s  sVs {o0s s  om o-,  {o {o {{{{{o ~o s o  s -rps zrps zrps z*(}_}0}{(5*"(6*&(7*( *09s s r?p rIp(r~p rPp~~~~~(r~p rzp~~~~~(r~p rp ~ ~ ~ ~ ~ (r}p(rhprIp(rp~~(rp~~(rp~~(rpr}+p(rp(r7p  ~ (rp  rIp ~ (r*~p  ~ (r&p  r:p rDp ~  (rZp(rfp(rp  rM+p (rrp(rhp~~(r(prprp(rpr@Sp(rp(rp(rp(rp(rhp~~(rp(r(p(rRp(rp(r&p(r'p(rp(rp(rOp(rp~ (rp~~ (rp~(r)p~(r7p~(rEp~(rDOp(rp~ (rp~ (r(p(rp(r#p(r#pr.p(r#p(r#p(r#pr:prRp(rpp(reprprp(r8prۻp(*02:~o   + ~o o X i2*02:~o   + ~o o X i2*0j;rp(. ~o ~rp(. o ~rp(. o   + ~o o X i2*n~(j ok o t/*n~(j ok o t/*2o(*0<( -rprJp(I s3z% 9~:N-s %r7p( %rp( %r*~p( %r?p( %r~p( %r~p( %r~p( %r}p( %rhp( %rp ( %rp ( %rp ( %rp ( %rp ( %r&p( %rZp( %rfp( %rp( %rp( %r p( %rp( %r.p( %rDp( %rZp( %rpp( %rp( %rp( %rp( %rp( %rrp( %rhp( %r(p( %rp ( %rp!( %rp"( %rp#( %rp$( %rhp%( %rp&( %r(p'( %rRp(( %rp)( %rp*( %r&p+( %r'p,( ~( 9[E- #.9DOZep{  +666AALWbmx8@s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s*Ps* s* s* s*rprJp(I s3z2o(*07<( -rprJp(I s3z% 9~: s %r(p( %rp( %r#p( %r#p( %r#p( %r#p( %r#p( %rpp( %rep( %r8p ( ~( ,UE !+%s] *s *s@*s*s*s*rprJp(I s3z( *s ~~Sorpo *2o(*0x=(j ok ~o t/ - % ,;r(p(l -r#p(l -r#p(l -+sN*sL*s*rprJp(I s3z6o(*0[=(j ok ~o t/ - % ,rp(l ,ss*s*r4prJp(I s3zZ~oo t/*2(vs*0Ls} s } s} s }s }( }}*F~~(*>((*0 >- rps z- rAps z(tK s o  o9ooEooFoGo o to o  ( o   (-@i1 rlps) zo  (   (- rlps) z{ o{ o s  o ~o 9o to(tKs oTU8:TUo ~o 9Bo to(tKoV8Vo% tKsuov~o 9uow((( s sox9oxoW8Wo% tKotot: ! o1^ o!o!o ~o ,!to { o+~o , !tWo& :]Wu.XX,Xo' ,Go("(0 ""iox #-{ #o+r{ #o +a { rpo+Kov~o ,  o &+,rpov(( ( rp(R(. ( Vo& :Vu.XX,Xo' ~o 9o ($$o$oo(%%(tK&&oV8)Vo% tK''su((ov~o , (o &8(ov~o 9U(ow())(**( +s ,+,s-./(oxoW8Wo% tK00ot10ot:232o1^2o3,1o3o 1~o ,3to .{ .-o+1~o , 3t/Wo& :]Wu.XX,Xo' /o(4(0 44iox 5.-{ 5-o8{ .5o 8(ov~o 9C(ow(666( 789s :7:s;(oxoW8Wo% tK<<ot=<ot:>?>o1^>o?:=o?o =~o ,?to 8{ 8;o+=~o , ?t9Wo& :]Wu.XX,Xo' 9o(@(0 @@iox A8-{ A;o+={ 8Ao +,rp(ov(( ( rp((R(. ( Vo& :AVu.XX,Xo' rp(( ( rpo (R(. ( UXUUTi?{ o{o {o  oS V8Vo% t*BBowtKsCCotoDs D(Es FGHBox9BoxoW8Wo% tKIIotJIot:KKo1OKoLFJoLo J~o ,Lto H+J~o , LtGWo& :oWu.XX,Xo' Eo sMEFs N{MNo ,t{o :Mo(O(0 OOiox P{PNo { rpoQ{ rpo&{ PQo+GG,0Go(R(0 RRiox S{SNo H,{ HNoVo& :Vu.XX,Xo' *A1]<R< - rps z{ ot%*- rps z{ o,{ o**- rps z{ o*0?s { oo$ + o% t/ rpo o& - u.,o' { oo$ +"o% t/ o - r<po o& -u.,o' *$;a/F(o s*{ o-{ o**0`@- rps z{ ot -;{ o t/ ,{o t +{o t *0A- rps z{ o+;o% X ( t o o ,( t/݉o& -u.,o' {o +8o% X ( t o o ,( t/"o& -u.,o' **HcE0aB- rps z(-*( 98s 8o   ~o",9o((nou,{ouso t :o o o :{o o$  +T o% t3{o t  o   o   o , o o  & o& - u.  , o' o & . + :Ј( o! t**ua0j- rps z- r%ps z{ o,r9prEp(I s8 z{ o{o o so *0- rps z- rps zoo,- rps8 z{ o,({ o{ o +${o o so X i3*0C- rps z{ ot% , { o&{ ot ,({ o&{o o so ,]{ o t/ ,{ o {o t ,'{o {o o so --rp(. s8 z*Ј( 3(*%( 3(,(***(*2(o *0D- rps z- rAps z- r]ps z7s] { oo$ 585o% t/ 4 o@ { ot% {  o(8 7s] o o$ 6+e6o% t/ o ~oo? -:777788s8s8s7o^6o& -6u.99,9o' 7::7;;~;ss;s:o^ ~o -X(o o   ( 7<<777~7 s7ss7s]o o$ 6+f6o% t/o ~oo? -:777788s8s8s7o^6o& -6u.99,9o' 777788~8ss8s7o^~o -Oo o (777788~8s8s7o^~opsst7777o^o o5o& :C5u.99,9o' { oo$ 585o% t/{ ot{ o:R~o o s>s7s]o o$ 6+y6o% t/  ~oo? -X o ! ~oo? -:777788 s8!s8s7o^6o& :{6u.99,9o' 777788~8ss8s7o^~opsst"777"7o^o o5o& :n5u.99,9o' {o o$ 58"5o% t3#{#o t$$o o:~$o o s>s%7s]&$o o$ 6+b6o% t/''~oo? -A&777788's8$'o s8s7o^6o& -6u.99,9o' ~%op&sst(777(7o^5o& :5u.99,9o' s(m  ()~)ss*==~ s =~*ops =++s(k,~,ss -4..o@ ~. ,(/~~0s~00/s11. sD2-2s3s(443o'*Ar!Hsa]~o%D5y0;E( ( (tR o io (*0VFo(?  o( o(u, -rpo(( s, zoo*b( (o}*:( }*{*2{(*0$G3*u3 -*{{(*^{o {o *2{o *2{o *0JH(j o {o t/ -*{o {o {o *00(j o {o t/ -*{o *0H(j o {o t/ , {o {o {o *2{o *vs }s }( *-rMprps z{so &*{( o! tsA*Js }( *( }}}}}}}*( }}}}*0M( }}}}}}o s}*( }}}o s}*0~({o {o{o{o{o{o!s&}}}os}*0I( o{ ooYE YEL-mmL+koot? ooos4  +Koot os +,ooto s + r pszsB s o oF i(ooF  - s}+8   ( - +      s}}zrpszs }*ch0 (*0J (}s }{o &s }{o &s }oos; oo<oDoEooH o(}s o &{o & zrpsz*0 s   (*0 !s    (*0?{o YEYE+***{*2{o*2{o*{*2{o*2{o*0eK{o {o! -* (rp(. ($ rpsz{o{o({o{o o*@ so o {o -iY+iY(  +Y  i iY X.?rp 5rp i5(p sz X   i38 i4   +x so b X _`X[    X X X    o&  X  . iYi(9  X  3 b _ X _`+ _XXiY2 _.-rpr0p(w r[pr0p(w (} szzrkpsz*AL;JNJS0 L{o! ,i/*{o  ( s (?  o+YE###YEb8o.t s3 o5 oo6 o7 o8 o9 o: o; s8o.t  s ooos  o s+Go.t  s  o8 o9s  o s + rs psz(szrpsz*A4#Mp#Mu0^M,+rp(  o( : rpsz  +  X X 34cҜҜ**! 0}sB (oF *0(  {o {, {o {:-{oS +o% t[ oo& -u.,o'  8{oT u/, {oT t/  smo +%{oT toDsqo {oT ,{oT to {oT t oS  + o% t[o o& - u.  , o' X {oU @*{oS  + o% t[o o& - u.  , o' *(?!`#4l#00No {o   -b {o 3IiY4iY(9 iY(iYiY+++&(zrpsz{u,{o  s&+{o  s{-,{{{{{{s*{{{s*}}0O( rp(. ($ rpsz4  o@  `s+ QP(o 4QPo@ Pss5 oo* :s (*:(; }*0P(; s }(?  oF  .$.rp  r0p(w (. s) zoG t (<  (= (> { so &+4oG t(<  (=  {  so &oF .*J{oT t\*0FQ{oS +o% t\ o3 o& -u. , o' ** %12{s*0}sB (oF *0KR- rps z{oS +o% t\ oo& -u. ,o' *90{S{se    +6 oT t\oo3   o o, X oU 3-o,, rips8 zo &s*0OT{se   +(oT t\ oo3  og X oU 2-*s*:(#}*b{ooXoX*F{os *F{oo*0<{o ow  +o( sX i3*2{o*(*( *(*0hU-s s s? *u,@t oWs> rps z~sO  s  s s? *rpsz$2 ( *0mVu- r1ps8 zt ot o ooog oo  ( (*08W-~ +~ ( j(( (*0Xot ooog ,uU-( so+ tUo oot iY+7 ( ,$1 o  + eo  Y/ *( *r#p*0s,Pu,t o8 }-o9 + s }-uh- rFpszth},*ui- rpszti},*0Yi4  +iYYX i3s {,oo+  o{-so,{,oo*ooo oo,{,tho o oo oo9k    *0Zi4  +iYYX i3s {,oo+ ~ho2  o2*~ho2  o2* oo o oo o{,oo*{,tio,(   oo o  o *( *Z(~}.}/*{.*{/*0Acu> -*o(3%o{.o ,o{/o **0' {.o" {/o" a( (7 a*(}0}1}2}3}4}5*{0*{1*{2*{3*{4*{5*0[3*u? -*o{3o 9o{4o ,qo(o ,^o(o ,Ko{1o ,8o{2o ,%o{0o ,o{5o **0`(o" (o" a(o" a(o" a(o" a(o" a(o" a(o" a*6( *0C(v]3 rps8 z/ rps8 z}6}7}8*{6*{7*{8*z(j - rps z}9*{9*0\3*uA -*(*v{9{9o ,(m **N{9o" (n a*( - rIps zoH t}:};*F{:oH t*{;*0]3*uB -*(*{;{;3{:{:(**0{; (6 {:(a*rooY(v}<*{<*0{( o}?s8}@{?4}C{?Z4}E{@o 4}B{@o 4}As}=*n{=oorSp(. *2{=o*0Z^}>u,,t oN  oM   oL [}D oK  +Gu,4to 4 {@o [}Do + r]ps8 z{?4{@o {?Y{@{?o {@io {@{Bo &{?Y{@{?o {@io {@{Ao &{?Y{@{?o {={Aso*0L^{?4 {@o & +"{C{A{BaaҜX {Ci2*"("*0s{=o{@o }F{E{Ei(` ,{C{Ci(` {?4 {?Y{@{?o **()*0$%  +XX()X X 3*0;t{F {Ei4 }F{>,x{={Eo&{={E{?{?o&(9 {@o ( {CX{D(9 ("{DX*{D1_{@{E{DYo {={Eo&{={E{?{?o&{DY(9 ( {E{DY(*- rpsT z("{DY*0"{D4 {C{D(9 *^{FX{?[{?Z*{>,{FX{DX*{FX{DY*0%{E%{F% X}F{F{Ei@{>,*{={Eo {@{?o +-{@{E{?o {={Eo {?}F{E{?{E{?(9 **0$ +{CX.*X {D2*0J( }P[}Oo4}Ko4}Lo4}M*{P*0d(}Nu,At o {KiiY {Ki(9 {K(` o(4{Po*{Porp{OZ5(^ * *{O*{N- (3*(2*0{OXi1 r{psjz{OXi1 rpsjz{P{L{Mo& +X{MXaҜX {O2{L{O{L{Li{OY(9 {L{Li{OY{O(9 {O*0{OXi1 r{psjz{OXi1 rpsjz{P{L{Mo&{L{O{L{Li{OY(9 {L{Li{OY{O(9  +X{MXaҜX {O2{O*{K{L{Ki(9 {Po*0R_ 8{S{T{S{R _X _}T{S{[{ZXX _}[{S{Z{YXX _}Z{S{Y{XXX _}Y{S{X{TXX _}X{U{Q_{U{Q_{XaҜ{U{QX_{U{QX_{YaҜ{U{QX_{U{QX_{ZaҜ{U{QX_{U{QX_{[aҜ{QX_}Q{S{R _ {S{R _{S{T _{S{T _{RX _}RX ? +|{S{T{S _X{U_X _}T{S _ {S _{S{T _{S{T _ X  ?y48{S{T{S _X _}T{S{S{S{T _ _X _{S _{S _{S{T _{S{T _X?Li(9 o:i*rp**0u-rprps zt ot ou-rCprps zo}V{V,{Vi2{Vi 1rprps zo}Wo:*0F}T 4}S +{SҜX  2 +x{S{T{S _Xi]X _}T{S _ {S _{S{T _{S{T _X  2 +z{S{T{S _X i]X _}T{S _{S _{S{T _{S{T _ X ?{}R*0n`{W{V(9% }R% }[% }Z %}Y%}X}Q 4}U + {UX  2*0{S{T{S{R _X _}T{S{S{S{T _ _X _a {S{[{ZX _}[{S{Z{YX _}Z{S{Y{XX _}Y{S{X{TXX _}X{U{Q_{U{Q_{XaҜ{U{QX_{U{QX_{YaҜ{U{QX_{U{QX_{ZaҜ{U{QX_{U{QX_{[aҜ{QX_}Q{S{R _ {S{R _{S{T _{S{T _{RX _}R*0)Xi1 r{psjz + o;X 2*( *Z}\}]}^*06m{\{]{^(;   {^(<  s*( *0a 5  + _X i3i /7 Y ~`%XX _ _  %X  2Xc ~` Y e__c_ _  Y YY+ ~` Xa _ Y/@5+ZZXbXXi3*0sb}bu, t oo(A}a*u,!t o iZ(A}a*rpo: o; (. s8 z*rhp* * *0\{a- r9ps< zXi1 r{psjzXi1 rpsjz{b, (I+ (J*j __bY_c`*0X _bX _X X _bX _X X _bX _X X _b _X +| f_X_X{aX(H  f_X _X{aXX(H f_X _X{aXX(H  f_X_X{aXX(H X>{ {a?_X {a ?_X {a?_X {a?_X +| f_X_X{aX(H  f_X _X{aXX(H f_X _X{aXX(H  f_X_X{aXX(H X(>{ {a?_X {a ?_X {a?_X {a?_X ,+| f_X_X{aX(H  f_X _X{aXX(H f_X _X{aXX(H  f_X_X{aXX(H X@?{ ҜX cҜXҜXcҜXҜXcҜXҜXcҜ*0X _bX _X X _bX _X X _bX _X X _b _X <8 (H f__X{aXXY  (Hf_ _X{aXXY (H f_ _X{aXXY  (Hf__X{aXY Y,/fހRr5Mj*qZItK^AnQ$Pp9|:#z6[%U1-]㊒)glឨ,c?X≩ 843H _.G奜w hn 4%Д(> `*( *( *"}d*rop* * *0S{d- ryps< zXi1 r{psjzXi1 rpsjz +XXX 2**0M05}g05}h 5}i 5}j5}k(*rp***0c yZ n   +?+/{jZXX {iZX X_ X2X2@4oA +{kZ(X28pZZ {k5%q5{k{j {i (a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5ZXZ {k5%q5{k{j {i (a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{k5%q5{k{j X{i X(a5{gZ{k_{gZX{k_{gZX{k_{gZX{k_{hZ{k{hZX{k{hZX{k{hZX{kX ?*0qd5 ( X( X(  X( ([(X(X( X(*0qd5 ( X( X(  X( (\(X(X( X(*0)d +~Z {h{g(a{hX{gX(a{hX{gX(a{hX{gX(aX ?{ +~Z {h X{g X(a{h X{g X(a{h X{g X(a{h {g (aX  ?z*05d 8 YZ {h{g(a{hX{gX(a{hX{gX(a{hX{gX(aX ?x 8 YZ {h X{g X(a{h X{g X(a{h X{g X(a{h {g (aX  ?w*F_d Y_b`*j _bj _dZnai*0Cd(^ (^ (^ a aa a(]a a(]a (]a*0Z~p _ _~pc _ _b`~pc _ _b`~pc _b`*0Wi[ ... r)ps8 zX}{{{Xsm   +Cc_ _ X _b` X _b` Xb`(n X X i2{{Xb+xYcY_(o ]- (](`~r[Ya+1]3 (`c_YcY_(o a(n X2-?+0+ (o (_(n X2X{{2*( *0Cu-r)po: o (. s8 zto(a}|}*r?p* **0{|- r*ps< zXi1 r{psjzXi1 rpsjz{,(i{|(k(j+(i{|(l(j**0 %X _}}%{}%X _b`}}%{}%X _b`}}%{}%X b`}}%X _}~%{~%X _b`}~%{~%X _b`}~%{~%X b`}~%X _}%{%X _b`}%{%X _b`}%{%X b`}%X _}%{%X _b`}%{%X _b`}%{%X b`}*0 %X {}Ҝ%X {}cҜ%X {}cҜ%X {}cҜ%X {~Ҝ%X {~cҜ%X {~cҜ%X {~cҜ%X {Ҝ%X {cҜ%X {cҜ%X {cҜ%X {Ҝ%X {cҜ%X {cҜ%X {cҜ*0@2%{}(o a}}%{~(o a}~%{(o a}%{(o a} 8~s{} _~t{~c _a~u{c _a~v{c _a(o a ~s{~ _~t{c _a~u{c _a~v{}c _a(o a ~s{ _~t{c _a~u{}c _a~v{~c _a(o a ~s{ _~t{}c _a~u{~c _a~v{c _a%X (o a~s _~tc _a~u c _a~vc _a(o a}}~s _~t c _a~uc _a~vc _a(o a}~~s _~tc _a~uc _a~vc _a(o a}~s _~tc _a~uc _a~v c _a%X (o a}{{Y?9~s{} _~t{~c _a~u{c _a~v{c _a(o a ~s{~ _~t{c _a~u{c _a~v{}c _a(o a ~s{ _~t{c _a~u{}c _a~v{~c _a(o a ~s{ _~t{}c _a~u{~c _a~v{c _a%X (o a~p _ _~pc _ _ba~p c _ _ba~pc _ba(o a}}~p _ _~p c _ _ba~pc _ _ba~pc _ba(o a}~~p _ _~pc _ _ba~pc _ _ba~pc _ba(o a}~p _ _~pc _ _ba~pc _ _ba~p c _ba(o a}*0P2%{}{{(o a}}%{~{{(o a}~%{{{(o a}%{{{(o a}{{Y 8~w{} _~x{c _a~y{c _a~z{~c _a(o a ~w{~ _~x{}c _a~y{c _a~z{c _a(o a ~w{ _~x{~c _a~y{}c _a~z{c _a(o a ~w{ _~x{c _a~y{~c _a~z{}c _a%Y (o a~w _~xc _a~y c _a~zc _a(o a}}~w _~xc _a~yc _a~z c _a(o a}~~w _~xc _a~yc _a~zc _a(o a}~w _~x c _a~yc _a~zc _a%Y (o a}=@~w{} _~x{c _a~y{c _a~z{~c _a(o a ~w{~ _~x{}c _a~y{c _a~z{c _a(o a ~w{ _~x{~c _a~y{}c _a~z{c _a(o a ~w{ _~x{c _a~y{~c _a~z{}c _a(o a~q _ _~qc _ _ba~q c _ _ba~qc _ba(o a}}~q _ _~qc _ _ba~qc _ _ba~q c _ba(o a}~~q _ _~qc _ _ba~qc _ _ba~qc _ba(o a}~q _ _~q c _ _ba~qc _ _ba~qc _ba(o a}*c|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-TR j068@|9/4CDT{2#=L BN.f($v[Im%rdhԤ\]elpHP^FWث XE,?k:AOgst"57unGq)ʼnobV>Ky xZݨ31Y'_`QJ -zɜ;M*^//qSSh,@ `yȶ[[jjFgr99KJJޘLL԰XXJk*OCCŚMMf33UEEPPx<!KKa pp|>>BqffHHaaj55_WWiX:''8+"3iip3-<" IUUP((xzY  e1BBhhAA)Z--w{˨TTm,:cc||ww{{ kkooTP`00gg}V++bMvvEʝ@ɇ}}YYɎGG Ag_E#Srr[u=jL&&Zl66A~??O\h44Q4qqsSb11?* ReF##^(07 / 6$=&iN''uu tX,,.4-6nnZZ[RRMv;;a}{R))>q^//SSh,`@ y[[jjFgKr99ޔJJԘLLXXJk*OņCCךMMUf33ϊEEPPDx<<%KQQ]@@?!Hp88cwucB!!0 mL 5&/__5̈DD9.WU~~Gz==dd]]+2ss``ўOOfD""~T**; ʌFF)k<(y^^ v;Vd22Nt:: ےII lH$$\\]nCbb917yy2CYn77mmdҜNNIllVV%eezzGoxxoJ%%r\..$8WsQ#|ݜtt!>ݖKKa ppB|>>qffؐHHaa_j55WWiX':'8+3"iipى3-"< IUUxP((zߏY  e1ƄBBhhÂAA)wZ--{TTm:,cc||ww{{ kkooT0P`0gg+}V+b׫MvvEʂ@}}YYGɎG AgԢ_E#Srr[u=&jL&6Zl6?A~?O4\h4Q4qqs1Sb1?* R#eF#^(07 / 6$=&'iN'uu  ,tX,.4-6nnZZ[RR;Mv;aֳ}){R)>/q^/SSh, `@ y[[jjF˾g9Kr9JޔJLԘLXXJk*OCņCMךM3Uf3EϊEPPKݖKa pp>B|>qffHؐHaa5_j5WWiX':'8+3"iipَ3-"< IUU(xP(zߌY  e1BƄBhhAÂA)-wZ-{TTm:,cc||ww{{ kkooT00P`gg++}VbMvvE@}}YYGGɎ Ag_E#Srr[uᓓ=&&jL66Zl??A~O44\hQ4qqs11Sb?* R##eF^(07 / 6$=&''iNuu ,,tX.4-6nnZZ[RR;;Mva})){R>//q^SSh, `@㱱y[[jjFg99KrJJޔLLԘXXJk*ŪOCCņMMך33UfEEϊPP<KKݖa pp>>B|qffHHؐaa55_jWWiX':'8똘+3"iip3-"< IUU((xPzY e1BBƄhhAAÂ)--wZ{TTm:,QP~AeS:'^;kEXK 0UvmvL%O*&5DbޱZI%gE]/uLFk_mzRYԾ-Xt!Ii)Du‰jyxX>k'qݾO f}:cJ1Q3`bSEdwk+pHhXElR{s#rKWfU*(/{70(#j\+yNie4bĦ4.SU2u 9@`^qnQ>!=>MFTq]o`P$ֽ闉@CgٞwB[8yۡ| G|B 2+HplZrN8V=6-9' dh\![T$6.: gWOa ZwKi⓺ *<"C ǭ-WuLݻ`&\rDf;[~4C)v#ܶhc1Bc"@ J$}һ=2)m/Kܲ0 Rw+lpHGd"Ġ?V},"3IN8ʢ 6ϥz(ڷ&?,:Px j_̛T~Fbظ.9^ï]iГ|o-%Ȭ;}cn;{&x nY욷One~!Jo6 )|1*?#1ƥ05ftN7ʦа3JAP/vM֍CM̪MTߞѵLj,FeQ^5]ts A.gZRV3mGa7 zY<Ω'a5zG8$4,£@_r% ('qOf }:cJ1`Q3EbSdwk+XpHhElR{#srKW*fU(/š{70(#j\+yNie4bĦ4.SU2u9 @`^qQn>!=>FM潵Tq]o`P$ֽ̉@CwgٞB8[yG| |B H2+pNlZrV8='6-9d !h\ћ[T:$6. gWҴOŢa iZwK ⓺*C<"  ǹ-WLu`&\rDf;4[~vC)#hc1Bc@" }J$һ=2m)K/ܲ0 Rwl+pH"GdĨ?V},"3LJIN8ʢ6 Ϧ(z&ڷ?,: Pxj_bT~Fظ^.9ï]|iГo-%;Ȭ}nc{; &xnY욷Oen~!ٺJo6 )|11*?#0ƥ5f7tNʰ3JAP/vMMCT̪MѵLj,FeQ^]5st. AZgR3VmGaz7 Y<Ω'5ah,8$4_£@r %(kXq'Of :}Jc13`QEbSwdk+hXpHElR{#srKW*fU(/{70(#j\+ϴyNieھb4ĦS4.U2u9 @`^qQn>!=>FM捵T]qo`P$ֽC̉@wgB苈[8y G||B H2+prNlZ8V=9'6-d !h\Tћ[.:$6g WҴO aKiZw *C<"  ǭ򋨹-WLuݻ`&\r;Df~4[)vC#hc1Bc"@ $}J=һ2m)/K0ܲR wl+pHd"GĨ?,V}"3NLJI8 6ԁϦ(z&ڷ?,: Px̛j_FbT~^.9À]|i-o%;Ȭ}cn蜻{;x &nY욚One~!ٺ6Jo |)1#1*?0ƥf57tNʦа3JAP/֍vMMCMT̪䖵шLj,QFe^5]tsA. ZgRV3Gma z7Y<'Ω5ah4,8$@_£r% I(
kq'O f:}Jc1Q3`SEbdwk+HhXpEl{Rs#KrWU*f(/{7(0#j\+yiNe4bѦ.S4U2u9 `@q^nQ!>=>FMT]qoP`$@C̉ٞwgB[8y| GB| +H2pZrNl8V=-9'6d \!h[Tћ6.:$ g WҴO awKiZ *"C< ǭ򶨹-WuLݻ`&r\f;D~4[C)v#hc1cB"@ J$}=2)mǞ/K0܆R wl+pHd"GĨ?},V3"INLJ8ʢ 6Ϧz(&ڭ?:,x P_̛j~FbTظ9^.ï]Г|i-o%Ϭ;}cn;{&x YnOne~!ٺo6J |)1?#1*0Ƣf5N7tʦа3JAP/M֍vMCMT̖ѵjL,eQF^5]ts A.gZRV3Gma z7Y<'a5G$4,8@_r% p 4%Ж(> q5%З(> r 5%И(> s 5%Й(> t 5%К(> u 5%Л(> v 5%М(> w 5%Н(> x 5%О(> y 5%П(> z*V( }}*0-e~V{o  {{io( *J }( *0L%{ba} +2%{b}{ _,%{ La}X 2*{*{*2 }*N(qop}*:(q}*:(q}*>{u*{*{*^s }s }*0%fom  rp(( s8 z(}* 0J{o ,r)prp(^ s8 z{o &{s>so *>{oU *J{{s*vs }s }( *0Uoz ,0o{ #3%(w ݝ&rpo(. s, zoz ,o{ \3 oK ~o - ~o ,s *~o ,s*~o -~o - ~o ,s*s`**!0(z*6((*0CuR,tR*uK, tKs*rpo: o; (. r3ps z0F(q- r5ps z- rEps z- rWps z}}}*0V(qo.r_prps zo(_ }o({}o(}*{*2{oa *2{oc *2{oe *2{of *2{og *2{oh *2{oi *{*{*0)G7 {{{s*0F,uS,tS*uK, (s*rpo: oO (. r3ps z0g(qo/ rps8 zo o& &o% u,(}o& , o% + ,=( o:} +{  o(l X o2*V(q}}*:(q}*:(q}*{*{*0VQ7s] {,7 {o^{,7 {so^s*0trps~rp(( s~rp(( s~rp(( s~rp(( s*( *6((*0F,uU,tU*uK, tKs*rpo: o; (. r3ps z(q- r ps z}}*(qo(}o3ot(}*{*{*0DQ7 {s] {,7 {s9 o^s*0F,uV,tV*uK, (s*rpo: o; (. r3ps z0a(qo.r;po5(( s8 zo(}o(S}o(S}*(qs}sU}sU}*2{o *2{oX*2{oX*0)G7 {{{s*0F,uW,tW*uK, tKs*rpo: o; rEp(I s8 z0p(qo2 o1 r;po5(( rps zoop(}o1oop(}*N(qs}*(qs}, s}*0=h{oD  +{o(X {o3*0G{-*{o  +{o(1X {o3*0=Q7 {s] {,7 {o^s*r(q}}}*0(qo(}o YEf6+You,ot}*o(}*ot}o(}*rups8 z*6((*0A,uX,tX*uK, tKs*rpo: o; (. s8 z{*{*{*0\I7 {s] {,7 {o^{,7 { o^s*~~~~*( *N(((*Noo(*0rp( r0p(w (. *0C( o -r;Gprps z}}}u}*B{ _*{*0,{sVoY* .jYE/8{,{sVs*{sVs*{,{sVs*{sVs*{-(,{sVs *{ts *rp(Qz0isV([  oJ s z*00j{,={( ob.{(ls*{o_s*(,={( ob.{(s9 *{o_s9 *{t {o s>s9  oJ s z*'0:( }*2{oY*F{o[sp*0s s s) ~r7p~o ~r7p~o ~r7p~o ~r8p~o ~r)8p~o ~rU8p~o ~rm8p~o ~r8p~o ~r8p~o ~r8p~o ~r9p~o ~r59p~o ~rQ9p~o ~r9p~o ~rp~o ~rp~o ~rp~o ~r p~o ~rJp~o ~r9p~_ o ~r9p~_ o ~r9p~` o ~r+:p~` o ~rM:p~a o ~r:p~a o ~r:p~Qo ~r:p~Qo ~r:p~o ~r:p~o ~r ;p~*o ~r);p~*o ~rE;p~-o ~re;p~.o ~r;p~/o ~r;p~0o ~r;p~ o ~r;p~ o ~rp~ o ~r&p~ o ~r^p~ o ~~*o~~-o~~.o~~/o~~0o~~Qo~~o~~o~~ o~~ o~~0s~ ~rp(o ~~0s~ ~rp(o ~~0s~ ~rp (o ~~0s~ ~r p 0(o ~~0s~~rJp@(o *z~s~sUsUs*(j ok ~o ,~o t*s*0Q~o,s|*(j ok ~o ,~o t7s~*~0s~*B~o s*0Jk- r)ps z( ,s5 oK+oKom ioMoN*( *(5*"(6*&(7*V( }}*:s (*Js((*0l( s }s }o$ +\ o% u' -o: oO r7p(. szoo {Ko {Ko & o& - u.,o' *#h2{oU *2{oU *F{o s**(**(*0ms , (j o (o$ 8o% t' ooo$ +Fo% t/  , (j o , o 1o &+ o? ,o &o& -u.,o' o& :mu.,o' s*GS#0Kn(o$ + o% t' o , o& - u.,o' ** '30{o {Ko ,{Ko t'*(o$ +o% t' o , "o& -u.,o' * *9)b:(*0}sB (oF *0^p(  {oS +* o% K {Ko t' o o& - u.,o' *6I0dqoo {Ko , rps8 z{s {se Ko Ko &s*0bqoo {Ko - rps8 z{s {se Ko Koi s*V( }}*:s (*Js((*0r( s }s }o$ +\ o% u7 -o: oO rp(. szoo {Ko {Ko & o& - u.,o' *#h2{oU *2{oU *F{o s**(**(*0ss , (j o (o$ 8o% t7 ooo$ +Fo% t/  , (j o , o 1o &+ o? ,o &o& -u.,o' o& :mu.,o' s*GS#0Kt(o$ + o% t7 o , o& - u.,o' ** '30uu{Ko ,{Ko t7*(o$ + o% t7 o , o& - u.,o' **6']:(*0}sB (oF *0^v(  {oS +* o% K {Ko t7 o o& - u.,o' *6I0dqoo {Ko , rps8 z{s {se Ko Ko &s*0bqoo {Ko - rxps8 z{s {se Ko Koi s*0s }(+{oG o &oF .oF .oG t4} +i{oT ua,*{{oT ta{so +({{oT t {sRo X {oU 3*J{oT t*"(*2{oU *2{oU *>{oU *2{s*R{so &*R{so &*0sj} rps z* "}*"}*0w7s] {o$ +6o% tc 7oo^ r/ps zo& -u.,o' {s{sE  95{- repszo(,s5 oK+ oKrp(( s z okioMoNs rp ((  s z~0s~ 9i1{7s]  +. 7 o ((o^ X  i3 rp s zr~ps z  ss+  s sV s*L(D C\.&Q<0Q<.(*.(*07x- rSps8 z(  ( &rp(. s8 z*#+(*Js }( *V( }}*^{o( {s*(+ *"(, *&(- *0qy{X{Xo {X{Yo {Y{Yoo 3o o +3o o + rps8 z*0Szod od odoh 3o_ o_ +3ob o_ + rps8 z*0e{oo oo. rps8 z.. rps8 zol ol oc oc o_3 o_+ obo_o_o_3 ob o_ + o_ ob   ~hoj2~oj/ + + ~ioj2 ~oj/~hoj2eg + + ~oj/eg  j(o  j(o   sF*0q|X[X YYXo o o  ooYoYYo,~hos[*03}.. rps8 z(  o 0"+X U {X{Y8o,T ~ioo~ooog 3 o#+~ho+ o 3  o+  oooX~go 9M~go 9<XU  (9  *06~o,*o o oooos*06oo o- +~ho , + rYps8 z*0~.. rps8 z,~i j( + ~g ~h  ++3+ooo   X 2*0Tm33j(* j(*( ~go" o ~iooo *0o- rps8 zo ooo o oo XY(3"~ho~ho+13"~ho~ho+ rps8 z 3ooo+. 3ooo+ rps8 z*03o + o (  (  (  ( {Xooj(o{Yoo{Xo{YoosF*0Lot o ooog o o  ((*0%ot o ( ( *0Oot ot iY +)( 3 o  +3o  Y /*0}.. rps8 z(  o 0"X+XX U o{X{Y8o9oooo2oog + og    /   eg  ,( {Xo {Yo+- {Xo {Yo+  3oo+oo ooX~go 9~go 9 *0; -~ +~ i  +  ( X 2*0~ho~io~joj(  ~h~gsF~~sF~~sF~h~sF U U   UU ~h~gsF~~hsF~~hsF~h~hsFUU    U    U    *( *:(}*>{o*04 o] 0**J{o(* (E9(E3(E(E5(E/(E (E*02 0 .1.S8/.p3YE9;8sssssss*sssssss*sbssbssss*sbssbssss*sbssbsss s*sbssbsss s*(o*( *r#p*0s,Pu,t o8 }o9 + s }uh- rFpszth}*ui- rpszti}*0{oo+ ('   o{so,{oo*oooo o,{thoooooo o9j *0{oo+ o2o2o/ o2*(' o oo oo{oo*{tio, ( oooo *0io[(/ s*( *:r#p(+*r#p(- rQ#ps z}*~(- rQ#ps z}*{*03*ui -*(.*v{{o ,(**N{o" (a*0J( }[}o4}o4}o4}*{*0(u,wt o i{i/>{{iiYi(9  + {X {iiY2+{{i(9 o(7{o*{orOp{Z5(^ * *{*0{Xi1 r{psjz{Xi1 rpsjz{{{o& +X{XaҜX {2{{{{i{Y(9 {{{i{Y{(9 {*{{{i(9 {o*BoZ(9*0( ], rYps8 zoZ1rpoZ5(( s8 zo.o. rps8 zs}[}o4}o4}o4}}*2{o*0{ _c i4  +bX _cXҜX iY2iYiYbҜ3(iY4%q4i.+ aҁ4*0r(A{o{i4}{{{o&{(;}{(;}{o*{*0K{{i3!{{{o&}{%{% X}*0%/ r$ps8 z{o {Y 1d{{(9 {{{o&}YX+{{o&YX0{{(9 %{X}*0{o {3 { +s>{{(<&{  + {4%q4aҁ4X {i2{{{o&{{(9 (A{*{{i(` }{o*6t@}*0{ox {ow {o  {o ,$r/p{o 5rOp(^ ( {o (F(E~h~h+oT toXoU [2oU [+oT toXoU 2o  oY0Y  [X(D  [X(D j , rap(  oo oojX(D  o~hoo,(D o -o~hoo,  oo~ho -7  rp   rp  (p ( 8Goo/R 90!!rp!5!rp!oo5!(p ( 8 ,r=pKrMp(^ ( o~ho~hooj , rp( s +SoT tojX(Do~ho -o &XoU 3~h+HoT toT t ooooXoU 2+qoT too~ho ,A ,9""rp"oT "rp""(p ( +XoU 2:oo~ho , 9rp(( ( 8s oo~ho , 9Orp(( ( 89oo~ho , 9r;p(( ( 8 oo~ho , 9rqp(( ( 8 oo~ho , 9rp(( ( 8 9(r=pKrp(^ ( ( rp( rWpo ((. ( ##rsp# #rp# o5#rp#(p ( rp (( ( rp (( ( rp (( ( rp(( ( rp(( ( r/p(( ( rKp(( ( rgp(( ( rp(( ( (  os:  os> s*&s*0SoU s oS + o% oU Xo o o& - u.,o' **=0)/s  +~j(o &X 3* %)+/5;=CGIOSYaegkmq %379=KQ[]agou{  #-be5%Р(> *( *~}to(O}*rhp* **0{- rps< zXi1 r{psjzXi1 rpsjz(T X(T {,3 +( {Z{ZX(Wa X 2+9+.{Z{ZX(Wa  Y/(UX(U**0 5 (T (T (Q (P(Q(P+vZ X~Y(VZXY~X(V]-(S (Q (P+(R (Q(PX2*i* ci*&b8d`*&d8b`*0"j  +bX _jX X 1*0 +XYZ?_cҜX 2*0@~ _~c _a~c _a~c _a*0-d ci i (Y (XX j bjn_`*faaa(VaX(V*(Xaaa(VX(V*)TPD ,$!%\QM@CCPQA< `cC#( (D@D  "%xsK;;.pp@0 <3?(0226tpD4, TSG\PLXSK=$ $ psC3 2, ,'prB2 ``@ PP@#+  6LCO7XRJxpH8&/`aA!4@AAPRB|qM=  PSC7!=trF6,#/$#'0 +"lbN.LAM haI)|pL<  ?/3>d`D$,".HCK   !!hcK+dbF&5 3|rN>xrJ:DCG%$"&-!000437.426 ""8084'DAEL@L )415 <0 <2><*:LBNTQE83 ;h`H(|sO?HBJ TRFtsG7 -DBF5(# +daE%:#91\RN9&2011*laM-\SO$0 82 :XPH`bB"(! )033( xqI9hbJ*(" *088(! -,&ܳ38/`@ `QET@DDcO/lcK+hSKXbB"`3305! )( "ࣇ'Б <264CK H/쀈`L,l(4AED!3?<1 =< ((BNL62><%9 # +(bF&drJ:x#'$#/,1rB2pBB@AA@sC3pcG'd, 7- ,,*044 .)QM\8SGT. ̂9?qM=|1105 bJ*h1 "" `H(hqA1pؑaA!`>&QIXQAPܒ#+Ё CGD #,쁍 ?sK;xPL\"!cC#`## AM LȒ2 :8 ".,:bN.lRJX23AI HpH8x ;p@0pqE5tsO?|154`D$daM-lpD4t԰4* rF6t >@@@ ్=:0" *(RN\)RFTCC@ 0%@HHqI9x<!!  SO\sG7tPDT2 !%$COLBFD-PHXRBP+rN>| =000aE%d0 <<6$䳋;pL<| P@P1 98"&$220aI)h374' $$$ SCP @L L3 ;8BJ H7)DTP ,%$!M\QC@CAPQ< C#`c(( DD@  "%K;xs;.@0pp ?<3(2026D4tp, GTSL\PKXS=$$ C3ps 2 ,, 'B2prц @ ``@PP#+ 6OLC7JXRH8xp&/A!`aÄ4A@ABPRM=|q  CPS7!=F6tr/,#'$#0  +"N.lbM LAI)haL<|p  ?/3>D$d`.,"K HC ! !K+hcF&db5 3N>|rJ:xrGDC%&$"-Ӂ!000743.642" "8804'EDAL L@)541  <<0A1pqÉ E5tq;8IXQ?I HA 981G'dcӈ8 B@B# #L,l`ӄ$4401HH@O/lc =<1 -,!@@@>><2<*:NLBETQ ;83H(h`O?|sJ HBFTRG7ts -FDB5 +(#E%da:#91N\R9&2101*M-laO\S$0  :82HXPB"`b )(!303( I9xqJ*hb *("880(-,! &38/ ``@TQED@D/lcO+hcKXSK"`bB3035)(! "' <642 HCK/,l`L(4DAE!?<3=<1 (( LBN6><2%9  +(# &dbF:xrJ'$#/,#12prB@BB@AA3psC'dcG, 7- ,, *440  .)\QM8TSG. 9?=|qM1015 *hbJ1 " "(h`H1pqA!`aA>&XQIPQA#+ DCG #, ?;xsK\PL"!#`cC# # LAM:82 .,":.lbNXRJ23 HAI8xpH ;0pp@5tqE?|sO541$d`D-laM4tpD4*  6trF >@@@ =:0*(" \RN)TRF@CC 0%H@H9xqI<! !  \SO7tsGTPD2 %$!LCODBF-XPHPRB+>|rN =000%daE<<0 6$;<|pL PP@981 &$"202)haI743'$$ $ PSC   L@L;83 HBJ7y7sn  9%Т(>  9%У(>  9%Ф(> 9%Х(> *( *rp*0u,&t o9 tN}o8 }+tN}s }}{ok oo},{uA-#rps8 z{u- rGps8 z*{, {Y[*{X[Z*{, {X[Z*{Y[*0{- rps< z{-(^+ {YX[ 1 rpsjz{ok o {u,d[  s X s{t~hoo ooooo 8soo2 rpsjz{tA ~io o{s  o,  o0{ok o   o  o ooo(_4  ooi[iYoA iiYoA *( *:( }*Z{orAp(. *{*0Ju,t o9 t> +t> {ooo}}*0{o {,X[**0{o {,*X[*^1 reps8 z}*{*r{, (k*(l*0x{X[4 {X  { X[ +8 Y1X YYi Y Y(9 +iXY(9 X 2i ZY+@i Y[X~ _db~_`ҜXXi3iZY4%q4aҁ4iYiYb`Ҝ{Y]Y.B4%q4 _c_ҁ44%q4 _c`ҁ4+ 4%q4 `ҁ4{iYo*0K{o  { X[ iY_. r}psT ziYiY _c~iY _cb`Ҝ~ _db~_`Ҝ iY+d~ _db~_`Ya _,( - Ya _ Y+ rpsT zYiZY/iY[4+ZXXXi2Y}*      4%Ц(> 4%Ч(> *(d*"(e*rOp*0*0k(h{(k{X(k{X(k{X(k{ X(k{(X(koi0*0(i!؞]}!|6*)b}!p0ZY}!9Y/}!1 g&3g}!XhJ}!d . }!OHG}*j5} (o*0x5} ({}{}{ } { } { } { { { i(9 { } *rp**0^{ %{ % X}  _X _b`X _b`X _b`{ 3o*{ 1o{ n_i{  di*ҜXdҜXdҜXdҜ*0_({(z{X(z{ X(z{  X(z{ X(zo*0a( #Eg} } ܺ}  vT2}  } }  + { X { i3*F_b Y_d`*aa*&_f_`*f`a*&_f_`*f`a*0\ 3{% {% { %{ %{ % (~X{ X (}X  (}(~X{ X(}X (} (~X{ X(}X (} (~X{ X (}X (}(~X{ X(}X  (}(~X{ X(}X  (}(~X{ X(}X (} (~X{ X (}X (} (~X{ X (}X (}(~X{  X (}X  (}(~X{  X(}X  (}(~X{  X(}X (} (~X{  X(}X (} (~X{  X(}X (}(~X{ X (}X  (}(~X{ X(}X  (} (X{ X 拢PX(} X  (}  (X{ X 拢PX (}X   (}   (X{ X 拢PX (}X (}  (X{ X 拢PX (} X  (}   (X{  X 拢PX (}X  (} (X{ X 拢PX(} X  (}  (X{  X 拢PX(}X   (}   (X{ X 拢PX(}X (}  (X{  X 拢PX(} X  (}   (X{ X 拢PX(}X  (} (X{ X 拢PX(} X  (}  (X{ X 拢PX (}X   (}   (X{ X 拢PX(}X (}  (X{  X 拢PX(} X  (}   (X{ X 拢PX (}X  (} (X{  X 拢PX(} X  (}(X{ X yZX(}X (} (X{ X yZX(}X (} (X{  X yZX(}X (}(X{ X yZX (}X  (}(X{  X yZX (}X  (}(X{ X yZX (}X (} (X{ X yZX(}X (} (X{ X yZX(}X (}(X{  X yZX(}X  (}(X{ X yZX (}X  (}(X{  X yZX(}X (} (X{ X yZX (}X (} (X{ X yZX (}X (}(X{ X yZX(}X  (}(X{  X yZX (}X  (}(X{ X yZX (}X (}   (X{ X $M\X (}X   (}   (X{  X $M\X (}X (}  (X{ X $M\X(} X  (}   (X{ X $M\X(}X  (} (X{ X $M\X (} X  (}  (X{  X $M\X(}X   (}   (X{ X $M\X (}X (}  (X{  X $M\X (} X  (}   (X{ X $M\X(}X  (} (X{ X $M\X(} X  (}  (X{ X $M\X (}X   (}   (X{  X $M\X(}X (}  (X{ X $M\X(} X  (}   (X{  X $M\X(}X  (} (X{ X $M\X (} X  (}  (X{ X $M\X (}X   (} (X{ X nX (}X (} (X{  X nX (}X (}(X{ X nX(}X  (}(X{ X nX(}X  (}(X{  X nX(}X (} (X{ X nX (}X (} (X{ X nX (}X (}(X{ X nX(}X  (}(X{ X nX(}X  (}(X{ X nX(}X (} (X{ X nX (}X (} (X{ X nX(}X (}(X{  X nX(}X  (}(X{  X nX (}X  (}(X{ X nX(}X (} (X{  X nX(}X (}   (X{ X >pmX (}X (}  (X{ X >pmX(} X  (}   (X{ X >pmX(}X  (} (X{ X >pmX (} X  (}  (X{ X >pmX(}X   (}   (X{ X >pmX(}X (}  (X{ X >pmX(} X  (}   (X{  X >pmX(}X  (} (X{  X >pmX (} X  (}  (X{ X >pmX (}X   (}   (X{  X >pmX(}X (}  (X{ X >pmX(} X  (}   (X{  X >pmX (}X  (} (X{ X >pmX (} X  (}  (X{ X >pmX(}X   (}   (X{  X >pmX(}X (} (X{ X ܼX (}X (}(X{  X ܼX (}X  (}(X{  X ܼX(}X  (}(X{  X ܼX(}X (} (X{ X ܼX(}X (} (X{ X ܼX(}X (}(X{  X ܼX (}X  (}(X{ X ܼX(}X  (}(X{  X ܼX (}X (} (X{ X ܼX(}X (} (X{ X ܼX(}X (}(X{ X ܼX(}X  (}(X{ X ܼX(}X  (}(X{ X ܼX(}X (} (X{ X ܼX(}X (} (X{ X ܼX (}X (} (X{ X vmzX(} X  (}   (X{ X vmzX(}X  (} (X{ X vmzX(} X  (}  (X{ X vmzX (}X   (}   (X{ X vmzX(}X (}  (X{  X vmzX(} X  (}   (X{ X vmzX(}X  (} (X{ X vmzX(} X  (}  (X{ X vmzX(}X   (}   (X{  X vmzX (}X (}  (X{ X vmzX (} X  (}   (X{  X vmzX (}X  (} (X{  X vmzX (} X  (}  (X{ X vmzX(}X   (}   (X{  X vmzX(}X (}  (X{ X vmzX(} X  (} (X{ X NSX (}X  (}(X{ X NSX(}X  (}(X{ X NSX(}X (} (X{  X NSX (}X (} (X{ X NSX(}X (}(X{  X NSX(}X  (}(X{ X NSX (}X  (}(X{  X NSX (}X (} (X{ X NSX(}X (} (X{ X NSX (}X (}(X{ X NSX (}X  (}(X{ X NSX(}X  (}(X{  X NSX (}X (} (X{ X NSX(}X (} (X{ X NSX(}X (}(X{  X NSX(}X  (}  (~X{  X(}X  (} (~X{ X(} X  (}  (~X{  X (}X   (}   (~X{ X (}X (}  (~X{ X (} X  (}   (~X{ X(}X  (} (~X{ X(} X  (}  (~X{ X(}X   (}   (~X{ X(}X (}  (~X{ X (} X  (}   (~X{  X(}X  (} (~X{ X(} X  (}  (~X{ X(}X   (}   (~X{ X (}X (}  (~X{  X (} X  (}   (~X{  X (}X  (}{XX{ X X}{ XX} { X X} {XX} }}  +{   X  { i3*u, to9 th} *0<ti o o,o,{ ooo oo*( *J( s } *( , oT} *s } *0{ o t ~o -.~o tssh  oi o ~o -'~( s ssh  oi o ~o -So t ,~ s>ssh +~~0ssh oi o *6osM*( { } { } { } { } *Ns ( (*Rs ( (*:( (*:( (*6( (*( } } { o8(s} *( } } { o8(s} *0[( } { o8(s} { ozo8,%{ ozo8tos } *Z{ oxoXo*0{ :s { o} o+zo% (I  { ozo7{ - { sMo &+9{  oO ooo t ssMo &o& :zu.,o' s5} { *%{ -~ { o{o } { *{ -~ { o{o } { *{ -~ { o|o } { *Z{ ozo7o*{ *{ *2{ ok*0^s } 7s] 7s] o8o$ +Ko% t2 7  ~  oPo  o^7   ob o^o& -u.  , o' ss{ optK7  o  s] +#7  o o^XoY37o^sp(s} { o7{ s6} *3X0, rp(Qzs  ( (  o, rE p s z( ( o,r ps z{ oyozo}st} { o7{ s6} */ {?[{.~V *0s s  s  s  ~ ~_ 5o ~ ~a 5o ~ ~b 5o ~ ~c 5o ~ ~_rpo ~ ~ar?po ~ ~br?po ~ ~cr?po *j~oo? ,r p**0($ &(($ *  0( &(( *  0DH- r ps z~ o t/ -r p(. r ps zr p(. *~ o -r1 p(. r ps z~ o 5*( *( *0msB s   o  oV ss~ oF s rQ ps z~s6~%ss6s*5500?4   +Z_cҜ, X 3X4   i(9 *.(*B((*0/%  +{ _Z_b` X {i3*:( } *0{ o /*  / +f 0 Yb{ o X X +@ 38{ o b{ o b`{ o b`{ o ` { o / r ps zY4 {  ( i/s z __YE&8pp pApppp/pppgAAppUpL^+n sT* s * s* sU* s% * s! * s* su* s* s * s* s * s*( - r ps zo} } *V( } } *{ *{ *0(o" (-f**00uz -*(oo ,(o**0"oo( r ps z* fsUs8 } ( *"} *"}! *"}" *6s}# *"}# *6s}$ *"}$ *"}% *"}& *0)}' ,~ro ,o,}( *0,{ ,8{! ,0{" ,({# , {$ ,{% -{( ,{& - r ps< z7 {# {$ s 7 {  {  {!  {"   s] {% ,7{% o^+7~o^7{& o^{' , 7{' s8 o^ss` *0F,u|,t|*uK, tKs*rpo: o; (. r3ps z0jj(qo +?o% t o2  E+(}) + (}* o& -u. , o' * KX(q, (}) , (}* *0j( o! t s*{) *{* *0_Q7s] {) ,7 {) s9 o^{* ,7 {* s9 o^s*( *6(s*~+ o ~- o ~, o *0s + s , s - r p~ ~. (r p~ ~/ (r p~ ~0 (r p~ ~1 (r p~ ~2 (r p~ ~3 (r p~ ~4 (r! p~ ~5 (r5 p~ ~6 (rI p~ ~7 (r] p~ ~8 (rq p~ ~9 (r p~ ~: (r p~ ~; (r p~ ~< (r p~ ~? (r p~ ~B (r p~ ~G (r p~ ~L (r p~ ~Q (r% p~ ~V (r9 p~ ~[ (rM p~ ~^ (ra p~ ~a (ru p~ ~d (r p~ ~g (r p~ ~j (r p~ ~o (r p~ ~t (r p~ ~w (r p~ ~z (rp~ ~ (rp~ ~ (*0'~+ (j o o t ,(**0~, o t ,o **n~+ (j o o t*F~- o t/*B~+ o s*( *0mr)p( rcp( rp( rp( r)p(j(srcp(o s*.s. *( *0mr)p( rp( rp( rMp( rp(j(srp(o s*.s/ *( *0mrOp( rp( rp( rp( rgp(j(srp(o s*.s0 *( *0mrOp( r0p( rrp( rp( rp(j(srHp(o s*.s1 *( *0\rp( ~g j(  r!p(j(srwp(o s*.s2 *( *0mrp( rpp( rp( rp( rfp(j(srp(o s*.s3 *( *0mrp( rcp( rp( rp( rYp(j(srp(o s*.s4 *( *0\rVp( ~g j(  rp(j(srp(o s*.s5 *( *0mrp( rCp( rp( rp( rYp(j(srp(o s*.s6 *( *0\rp( ~g j(  rp(j(srjp(o s*.s7 *( *0mrQ p( r p( r5!p( r!p( r!p(j(srk"p(o s*.s8 *( *0\rR#p( ~g j(  r#p(j(srX$p(o s*.s9 *( *0mr_%p( r%p( re&p( r&p( r:'p(j(sr'p(o s*.s: *( *0mr(p( r)p( rJ*p( r +p( r_+p(j(sr",p(o s*.s; *( *0mr-p( r.p( r/p( r0p( r1p(j(sr'2p(o s*.s< *( *0fr>4p( r|4p( r4p( r 5p( j(q  srJ5p(o s*.s? *( *0fr5p( r6p( rD6p( r6p( j(q  sr6p(o s*.sB *( *0 jrR7p( r7p( r7p( r08p( j(  srv8p(o s*.sG *( *0 jr9p( rK9p( r9p( r9p( j(  sr):p(o s*.s L *( *0 [j( j(  r:p( j(  sr;p(o s*.s Q *( *0 jr;p( r<p( ri<p( r<p( j(  sr=p(o s*.sV *( *0 gj( r=p( r>p( rh>p( j(  sr>p(o s*.s[ *( *0irm?p( r?p( r9@p( r@p( j(  sr@p(o s*.s^ *( *0irAp( r&Bp( rBp( rBp( j(  srDCp(o s*.sa *( *0X~g j(  rDp( j( J srDp(o s*.sd *( *0fj( rEp( rEp( rLFp( j( J srFp(o s*.sg *( *0[~g j(  rGp( j(  sr7Hp(o s*.s!j *( *0 Z~g j(  r.Ip( j(   srIp(o s*.s$o *( *0 hj( rJp( r{Kp( rKp( j(   sr`Lp(o s*.s't *( *0X~g j(  rMp( j( W srVNp(o s*.s*w *( *0fj( rOp( rPp( r"Qp( j( W srQp(o s*.s-z *( *0 Z~g j(  rSp( j( ;  srTp(o s*.s0 *( *0 hj( rWp( r)Xp( r{Xp( j( ;  srYp(o s*.s3 *0Fu--t*uK, tKs9*r1po: oO (. r3ps z*(8*r(q} } } *0(qo o& &o% t$oX o, r[ps8 zo& &o% ({} o& &o% t o(}  &r+\ps8 zo& ,o% t(} *P&v 0{ *{ *{ *0[Q7 sU{ { s?s] { ,7 { s9 o^s*0tr\ps ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s *( *0F,u,t*uK, tKsA*r\po: o; rEp(I s8 z0a(qo2 o1r;po5(( s8 zo(} o1o(} *N(qs} *0={ o  +{ o(X { o3*0G{ -*{ o  +{ o(1X { o3*0=Q7 { s] { ,7 { o^s*0F,u,t*uK, tKsG*r]po: o; rEp(I s8 z0M(qo oju,(]} o(} *o(} *V(q} } *V(q} } *{ *{ *0IQ7s] { ,7 { o^7 { o^s*0F,u,t*uK, tKsN*r_]po: o; (. r3ps z0g(q- rps zo. r;po5(( rps zoopt} oop} *(q- r]ps z- rps z} op} *{ *{ *0 G7 { { s*0F,u,t*uK, tKsT*r]po: o; (. r3ps z0Z(q- rps zo. r;po5(( rps zooptK} { o +o% t7 op(&o& -u. ,o' *`$(q- r'^ps zs} *0H(q- r'^ps zД( (~-rC^pr'^ps z(\s} *0B{ o  +{ oop(X { o2*2{ s*0F,u,t*uK, tKsZ*r^po: o; (. r3ps z0(q- rps zo2 o1 r;po5(( rps zo( } o( } o1o(S} **(\*(q- r^ps z} s } , sV} *{ *2{ o *Z{ , { oX**0KQ7 { op{ s] { ,7 { o^s*0_,u,t*u,tosc*u,to5 (a*rcpo: o; (. s8 z2o5 (a*6( (d*r( - r3ps z} *{ *>(go!*2{ ( *0u -*{ { o? *0_,u,t*u,tosk*u,to5 (i*rcpo: o; (. s8 z2o5 (i*Z(0 iox (l*r( - r3ps z} *{ *F(0 { o2 *>(no!*0u -*{ { o? *0<r_ps r#_ps rA_ps r__ps r}_ps r_ps r_ps r_ps r_ps r`ps r=`ps r_`ps r`ps r`ps r`ps r`ps r aps r+aps rMaps r+aps rMaps *( *0Cu,t*uK, tKsw*r1po: oO (. r3ps z0b(qo7(u} } } } } } u} u} *0 <    ,oo+Eo% u,3to2 3 +o2 3 +o2 3 + o& -u.,o' ,sU*,@o + o% u, +  o& - u.  , o' ,sU* ,sU*,sU*~o ,(v-sU*sU*Re#0Po +% o% (I  oL oXo3 o& - u.,o' **180(qo o& &o% t$} o& &o% t:} o& &o% (4} 8o% t< u,ut o2  E +<u} (} +Eu} (} +'ripo2 5(( s8 zt:} o& :`*{ *{ *{ *{ *{ *{ *07 { { { s] { ,F{ , 7 { so^+7 { s9  o^{ ,L{ ,#7{ so^+!7{ s9 o^7{ o^sp*:(q} *V(qs9 } *:(q} *0i,u,t*u&, t&s*u, ts*u<, t<s*roapo: o; (. s8 z>{ u*{ u,{ t(*{ (8*2{ op*(qo(} ot} *6((*0F,u,t*uK, tKs*rapo: oO (. r3ps zV(q} } *{ *{ *0 G7 { { s*0(q-,sU} +_sU} o +/o% ( o{ o -sU} +o& -u. , o' } } } } *.;i0(q %X ot$} %X o u,t( } %X o (} %X o(H} o1ot(} *6((*0A,u,t*uK, tKs*rapo: o; (. s8 z{ *{ *{ *{ *{ *0P7 { s] { ,7 { s9 o^7 {  {  o^{ ,!7{ s9 o^sp*r/bp*( *( } o ], ru6ps8 z4} *0Q% { %{ % X} { { i3${ { { io  } *01/ r$ps8 z { i{ Y 1x{ { (9 { { { io X } YXX{ i]Y { o X YX,"{ { (9 %{ X} *( *0ks s ~ r7pr;bpo ~ r7pr;bpo ~ ~or;bpo ~ rQbprgbpo ~ r}bprgbpo ~ ~orgbpo ~ r8prbpo ~ r7prbpo ~ ~orbpo ~ rU8prbpo ~ r)8prbpo ~ ~orbpo ~ rbprbpo ~ r8prbpo ~ rm8prbpo ~ ~orbpo ~ rcprbpo ~ r8pr-cpo ~ r8pr-cpo ~ ~or-cpo ~ rKcpr-cpo ~ r59pricpo ~ r9pricpo ~ ~oricpo ~ rcpricpo ~ r9prcpo ~ rQ9prcpo ~ ~orcpo ~ rcprcpo ~ rcprcpo ~ r dprcpo ~ ~orcpo ~ rpr#dpo ~ rKdpr#dpo ~ rsdpr#dpo ~ rdpr#dpo ~ rprdpo ~ rdprdpo ~ r eprdpo ~ r1eprdpo ~ rprWepo ~ reprWepo ~ reprWepo ~ reprWepo ~ r prepo ~ r%fprepo ~ rQfprepo ~ rufprepo ~ rJprfpo ~ rfprfpo ~ rfprfpo ~ rgprfpo ~ r+:pr=gpo ~ r9pr=gpo ~ ~` or=gpo ~ r9pr_gpo ~ r9pr_gpo ~ ~_ or_gpo ~ r:prgpo ~ rM:prgpo ~ ~a orgpo ~ rgprdpo ~ rgprdpo ~ rprgpo ~ r:prgpo ~ rgprgpo ~ rhprgpo ~ rhprgpo ~ r)hprgpo ~ r:prgpo ~ r=hprgpo ~ ~Qorgpo ~ rWhprshpo ~ rhprshpo ~ rhprshpo ~ rhprshpo ~ r:prshpo ~ rhprshpo ~ ~orshpo ~ rhpripo ~ r5ipripo ~ rSipripo ~ riipripo ~ r:pripo ~ ripripo ~ ~oripo ~ ripripo ~ ripripo ~ ripripo ~ r jpripo ~ r%jpripo ~ rAjpripo ~ ~oripo ~ r_jpr{jpo ~ rjpr{jpo ~ rjpr{jpo ~ rjpr{jpo ~ rjpr{jpo ~ rkpr{jpo ~ ~or{jpo ~ r#prkpo ~ r=kprkpo ~ rSkprkpo ~ r);prkpo ~ rkkprkpo ~ r ;prkpo ~ rkprkpo ~ ~*orkpo ~ ~c orkpo ~ rkprkpo ~ rkprkpo ~ rkprkpo ~ rlprkpo ~ rE;prkpo ~ rAlprkpo ~ ~-orkpo ~ rclpr}lpo ~ rlpr}lpo ~ rlpr}lpo ~ rlpr}lpo ~ re;pr}lpo ~ rlpr}lpo ~ ~.or}lpo ~ rmpr9mpo ~ r[mpr9mpo ~ rwmpr9mpo ~ rmpr9mpo ~ r;pr9mpo ~ rmpr9mpo ~ ~/or9mpo ~ rmprmpo ~ rnprmpo ~ r3nprmpo ~ rSnprmpo ~ r;prmpo ~ runprmpo ~ ~0ormpo ~ rnprnpo ~ rnprnpo ~ rnprnpo ~ rnprnpo ~ roprnpo ~ roprnpo ~ ~d ornpo ~ rprepo ~ rprepo ~ r;prepo ~ ~ orepo ~ r:pr#po ~ r)opr#po ~ rpr#po ~ ~ or#po ~ r;bp~o ~ rgbp~o ~ rbp~o ~ rbp~o ~ rbp~o ~ r-cp~o ~ ricp~o ~ rcp~o ~ rcp~o ~ r#dp~o ~ rdp~o ~ rWep~o ~ rep~o ~ rfp~o ~ r=gp~` o ~ r_gp~_ o ~ rgp~a o ~ rgp~Qo ~ rkp~*o ~ rkp~-o ~ r}lp~.o ~ r9mp~/o ~ rmp~0o ~ rep~ o ~ r#p~ o *0CH- rKops z(j ok ~ o t/ ,~ o t*.~ o *2o(*0~H- rY#ps z(j ok ~ o t/ - r;bpo? , s sR*rgbpo? , s[sR*rbpo? , ssR*rbpo? , ssR*rbpo? , ssR*r-cpo? , sJsR*ricpo? , snsR*rcpo? , sDsR*r=gpo? , ssR*r_gpo? , stsR*rgpo? , ssR*rcpo? ,s7ssz*r#dpo? ,s7ssz*rdpo? ,s7ssz*rWepo? ,s7sJsz*repo? ,s7snsz*rfpo? ,s7sDsz*rdpo? ,scss*rgpo? ,scss*rshpo? ,scss*ripo? ,scsJs*ripo? ,scsns*r{jpo? ,scsDs*rkpo? ,s(ss*rkpo? ,s(ss*r}lpo? ,s(sJs*r9mpo? ,s(sns*rmpo? ,s(sDs*rnpo? ,s(sts*r_opo? ,s4 ss*ryopo? ,s4 ss*ropo? ,s4 sJs*ropo? ,s4 sns*ropo? ,s4 sDs*repo? ,sszsh*r#po? ,sszsh*ropo? ,s7ssT *rppo? ,s7ssT *rGppo? ,s7stsT *r}pprJp(I s3zZ~ oo t/*r9p* *6{ oC i*6{ oD *>{ oE *0{ oF oA i*:{ joG *JsB } ( *( *0 X- r<ps zo-rppr<ps zu,Bt ~ok ook ospops~o sVs7*u,Mt ~Poooooos7ops~osVs7*u,Et oo0oo1s ~ ops~o~sVs7*u>9~~0s~u?,It?oooooooos+;t>o~go~g~g~g~g~gsops7*uh9thor#p(l ,<o- r#Ip(Qzo~ s ~  ops~ +_oo)oo*oo+oo,oo-s  su ~+ ops~  os ops7*u9t  oh - r#Ip(Qz o|oi4+iYYXi3 oh ~ s~ ops~s>s7*rppo: oO (. s8 z&(*0Wo o(u, &oo( oo  o((6*:( } *2{ oh*>{ ub*0q(- r'qpsz{ t- { o /{ o o o(  i4i(9 (*0P 4} ({ { i( /s z} } Y} *0T{  /*{  { (9 { {  (} } { *0K%{ { /{ %{ % X} *(/*{ %{ % X} *0x%{ { Y  +:{ { (9 %{ X} X Y(% /Y*0{ { (9 %{ X} XY*04 { { (9 *{ *{ *03*u -*(*{ { o ,{ { o **b{ o" { o" a*( *(*0 oX[ E''^^^8i.rcqprqps zo 8iX.rqprqps z_ iYs  o +XiZX.rrprqps zsXso +rwrp4(( s z*(} o} o} s} *{ *{ *2{ o*6{ s*Zoos*0xo o{ oo{ o o - rrps zo o-+.{  oo s*03*u -*(*v(,{ { o **N({ o" a*0 (*0 (*0 (*0(} } } } } } s} - rrps8 z-,*rrps8 z0 r)sps8 z0 rIsps8 zo} o} *{ *{ *~{ { { { s/*0V{ ,L{ ,D{ o~go -{ o~ho ,{ o~ho **04{ -%% ( { - (} ( { *&04{ -%% ( { - (} ( { *&Zoos*0o  oo-({ t  + o X { Y2+w{ o{ oooo  (- rrps zoo-+.~hooo s*0oo- ~go* ~go +}{ s so ~go  ++ oooo o X{ Y1 oo,*oo oo9s*03*u -*(*0B{ { 32{ { 3${ { 3{ { 3(**({ a{ a{ a{ a*{ *R{ - { **{ *{ *{ *{ *{ *c`c`c`c`c`X*0v{ Y/ rispsxziY/? rspi5rsp5rsp(p sxz{ { X(9 *0x{ { XX{ i15i(4 { { { (9 } } { { { X(9 %{ X} *0{ 1: rtp5rtp{ 5(p sxz%{ Y} %{ X} { { i[1%{ { { { (9 } *{ *^ 4} ( *,b ˠqVI5i/u̢ 6a-CWLQP< &#SɃFd1wx^"8h+*o>% $@~M2X'YNj[eyvB]:4z0(s鑹ZAmÞc3`G_=7K٨9 Έnt)pUDJE}k\lfgH.椫|!rOR?{;T 4%Ш(> }  } ( *0 8{ { { {  _XX _} { {  _ { {  _{ {  _{ {  _{ X _} X i?_*0G4  j_Ҝ j_cҜ j_cҜ n_cҜo*2io*0{ % ( X  8{ { { {  _X _} { { { {  _ _X _{ {  _ { {  _{ {  _{ {  _{ X _} X @3 ( * ( o, rCtps8 z} } *{ *{ **(*( - rM#ps z- rU<ps z} } } *{ *{ *{ *03*u -*(*{ { o ,"{ { o ,{ { **~{ o" { o" a{ a*FoZ(*FoZ(**(*0o( ], rYps8 zu- rtps8 zs} } [} o4} o4} } *rtp*0(u- rtps8 zt o i3 s s} } +:i3(s s} s} + rWups8 z{ o*{ *0K{ { i3!{ { { o&} { %{ % X} *01/ r$ps8 z{ o  { Y 1h{ { (9 { { { oX } YX+!{ { oX YX0{ { (9 %{ X} *0{ o { -&+{ %{ % X} { 2+B{ 3!{ { { o&} { { { o&{ { { o&s { o{ { o&{ o{ { o&{ { (9 ({ *{ { i(` } { o*0J( } [} o4} o4} o4} *0s&u,Wt o i{ i/{ { iiYi(9 +{ { i(9 o({ o*{ orp{ Z5(^ * *{ *0{ Xi1 r{psjz{ Xi1 rpsjz{ { { o& +X{ XaҜX { 2{ { { { i{ Y(9 { { i{ Y{ (9 { *z{ { oA { o*Z{ { o&*RoZ[(*RoZ[(*.(*0c( ], rYps8 zo4} s} } [} { o 4} } *2{ o *R({ o *{ *0K{ { i3!{ { { o &} { %{ % X} *01/ r$ps8 z{ o   { Y 1h{ { (9 { { { o X } YX+!{ { o X YX0{ { (9 %{ X} *0%{ o  { -&+{ %{ % X} { 2+{ { { o&{ { { o &{ { o{ { (9 ({ *{ { i(` } { o*6t} *0W~$ { o? o { owoo o os s s*( *9}  9}  9} ( } *rp* * *0E,u-rRpo: oO (. s8 z} } t o(%*0e{ -(rp(. s< zXi1 r{psjzXi1 rpsjz{ - ('*(&**0e%% +{ ((X X 2% +7{ { _X y7X { {  c_XX  2*0c(( X((  +.bdaX{ aX bdaX{ aX X  2()X()*0c(( X((  +.bdaX{ aY bdaX{ aY Y /()X()*%Xb%Xb`%Xb``*%XdҜ%XdҜ%XdҜҜ*N( s} *0,7t o1} o2} o3} *2{ o*0g}7 { ~0s~{ (.s>s9 s { { omsA o{ o*0%4 cҜcҜcҜҜ*.(0*( } } }! }" *{ *{ *{! *{" *0s }$ ( o$ +D o% t2 oN {$ o t  -{$ s % o o & o& - u.,o' se }# *Ph0${$ o t  , oT t2**2{# oU *2{# se *0"{$ o t  ,se *s *:s (<*>s (=*&(=*0(}' {o3(}& s }( {& o +Boj({ ~% ooo  ~%  o {(  o &o% -{& oo3t,3o2oos {' - }' +o rupoJ (. s z{( oq / rups z*K3~ 0Z{& ooXo*0#{) :(Cs s {( o o$  +% o% {( o t)( o  o& - u.  , o' {& o +doj(I ~% oO ooo o t{' o sssMo & o%- rup oJ (.  s zs5}) {) */2av0{- -(C~% {* o }- {- *{. -(C~% {* o }. {. *{/ -(C~% {+ o }/ {/ *0L{, ,*}, {& o(H}* {& o(H}+  rvps z*.> 00k{' -*{' o  {( o o$ +o% t) s o& -u. , o' {' o s *'!H0( sW oYtLs1 o3( s  ~ o  o s oo ooj&7s]o8o$  +4 o% t27  ~% oPo  o^ o& - u.,o' s(Ioo s o2o o3t  , o (Jo o(Go(G7s] o8o$ +*o% t2  7 obo^o& -u.,o'  s(Io  o *Ae70p, rp(Qz( sW oYtLs1 o3( s  ~ o  o s oo ooj(Ioo s o2o o3t,o (Jo o(H&o(H&( (  rQvp s zo1s9 (I( (   rvp s z o1 s9 (Iooj(Io  o *{%{0-(H ,"uG- s9 +s (I*F, oj(**0ok o ioE *0#s  o  o(oV *.~V% *:s (M*0|(}4 {o3tLs }1 {1 o  s +oj(o &o% -{1 o   oD}2 s  oEtoo$ 8o% t8ou,t{2 so &+su,t{2 so &+Lu,t{2 so &+%u,t{2 so &o& :Cu.  , o' s}0 *Y{2 *F{2 oo*0;{2 o ,op**{0 *0w{3 -h{4 ,`{1 o  }4 ,J7s] +!tL 7 ojo^o% -ssO}3 {3 *03(  j[ 4 cҜcҜcҜҜ**(*>(S(*0;6{b{b`{b`{`n  jZ( *( *~5 o ~7 o ~6 o *0s 5 s 6 s 7 rvp~H~8 (Xrvp~I~9 (Xrwp~J~: (Xrwp~K~; (Xr3wp~L~< (XrIwp~M~= (Xr_wp~N~> (Xruwp~3~? (Xrwp~4~@ (Xrwp~5~A (Xrwp~6~B (Xrwp~7~C (Xrwp~8~D (Xrwp~9~E (Xrxp~<~F (Xr%xp~=~G (Xr;xp~>~H (XrQxp~?~I (Xrgxp~B~J (Xr}xp~C~K (Xrxp~D~L (Xrxp~E~M (Xrxp~F~N (X*0'~5 (j o o t ,([**0~6 o t ,o **n~5 (j o o t*F~7 o t/*B~5 o s*( *0ZrxpsrKypsrypss rzp(oruzps~hrzp(s*.s_8 *( *0ZrxpsrKypsr){pss r{p(or{ps~hrS|p(s*.sb9 *( *0ZrxpsrKypsr|pss r}p(orm}ps~hr}p(s*.se: *( *0Zr!~psr~psr.pss rp(or&ps~hrp(s*.sh; *( *0Zr!~psr~psrpss rlp(orps~hrdp(s*.sk< *( *0Zr!~psr~psrpss r0p(orps~hr(p(s*.sn= *( *0Zrzpsrpsrpss rp(orps~hr)p(s*.sq> *( *0 `r{ps j( rчpsr'pss r}p(or׈p(s*.st? *( *0 Wr)ps j( rpsrՉpss r+p(os*.sw@ *( *0 Wrps j( rۊpsr1pss rp(os*.szA *( *0 \rps nj( +r7psrpss rp(os*.s}B *( *0_rQps j(  rpsrpss rwp(orݎp(s*.sC *( *0Vr/ps j(  rpsrpss rUp(os*.sD *( *0Vrps j(  rpsrpss rp(os*.sE *( *0 \rGps Hj( Sr]3psrpss rp(os*.sF *( *0Vrps j( $rpsr}pss rp(os*.sG *( *0Vrups j( $rpsripss rp(os*.sH *( *0Wraps  j( $rۗpsrUpss rϘp(os*.sI *( *0 \rMps j( 8rԙpsrcpss rp(os*.sJ *( *0 \r}ps .j( 0 rpsrpss rRp(os*.sK *( *0Wrps Lj( gDrpsr_pss rp(os*.sL *( *0 \rѠps pj( pUrpsrGpss rp(os*.sM *( *0Zrţps `'j( xrpsrwpss rRp(os*.sN *6((*0Cu,t*uK, tKs*rpo: o; (. r3ps z0V(qo.r1prps zo(}O o({}P o(}Q *{O *2{O o*2{O o*{P *{Q *2{O o*2{O o*2{O o*2{O o*0)G7 {O {P {Q s*0A,u,t*uK, tKs*rpo: oO (. s8 z(qo(}R o1o(4}S *V(q}R }S *{R *{S *0=Q7 {R s] {S ,7 {S o^s*0A,u,t*uK, tKs*r٧po: oO (. s8 z0(qo  %X o(S}T %X o(f}U  8ou,o(}V +tou$,o(S}W +Rour,o(}X +0ou,"ot o2 -  (}Y X ?_*(qsU}T }U }V }W }X }Y *{T *{U *{V *{W *{X *{Y *07 {T {U s] {V ,7 {V o^{W ,7 {W  o^{X ,'{X o,7{X o^{Y ,!7{Y s9 o^s*( *0r/psZ ~Z rAp(( s[ ~Z rKp(( s\ ~Z rUp(( s] ~Z r_p(( s^ ~^ rp(( s_ ~^ rp(( s` ~^ rp(( sa ~Z rip(( sb ~b rp(( sc ~b rp(( sd ~Z rsp(( se ~e rp(( sf ~f rp(( sg ~g rp(( sh ~g rp(( si ~g rp(( sj ~g rp(( sk ~g rp(( sl ~g rp(( sm ~g rp(( sn ~g r2p(( so ~g r2p(( sp ~g r2p(( sq ~g r2p(( sr ~g r2p(( ss ~g r2p(( st ~g r2p(( su *V~v ~w *( *0P(qo.rEprps z}x o(}y o(- o5 }z *V(q}y }z *{y *{z *0&G7 {y {z s8 s*( *f~{ o ~| o *0s { s | rp~ (rp~ (rp~ (rp~ (rp~ (rp~ (rɨp~ (rըp~ (rp~ (*0'~{ (j ok o t ,(**(*n~{ (j ok o t*F~| o t/*B~{ o s*} (o }} o }~ {~ } *"} *{ ,{} -{~ -} o{ *0{ -/ (*{ ,*{XYo] 0s z{} ҜX{~ Ҝ{o }} {o }~ {~ /s zX*0<%(,*{o /s z{}  {~ }} }~ *0Brps ~ rp(( s ~ rp(( s *( *0F,u,t*uK, tKs*rpo: o; rEp(I s8 z0a(qo2 o1r;po5(( s8 zo(} o1o( } *N(qs>} *j(qs>} } *2{ o*{ *0=Q7 { s] { ,7 { o^s*,u,t*u, ts*((s*(q- rUps zs>} *r(q- rUps z} *r(q- rgps z} *~{ , { o,*~s|*{ , { o-*{ o*n{ , { op*{ *"( *v( } } } *0K11=  +X c% - `oD YZ +_coD Y /*oD *voD i(ioE *0u{ ,_{  ` { ,1{  ` ` sB (( oF (* _, ` ( (*( (*:((*NsB } (*VsB } (*J{ so'*{ *R1{ oF (*NsB } (*VsB } (*J{ so'*{ *R0{ oF (*0_,u,t*u,tos*u,to5 (*rcpo: o; (. s8 z2o5 (*^(0 iox (*&(*( - r3ps z,(-r{pr3ps z} *{ *F(0 { o2 *>(o!*0u -*{ { o? *0  8 o{ 1 ݇( -m YE   :.=YE  X oz ?g**u,t*uK, tKs*rpo: o; (. s8 z&(*(q- rps z,+sU} } } *0(q- rps zo2 o1 r;po5(( rps zo(S} o(H} o1o(} *{ *{ *{ *0MQ7 { { s] { ,7 { so^sp*B( 0( *J( 0( *"(*0D-(%*u<, t<o*u7,t7opo*rps) z&(**(*&(*s } { -+eo *f{ -*{ o *0!{ -*{ o  } *b{ -*{ o *j{ -*{ o **(*.(**(*s(} { -+eoG*f{ -*{ oN*0 { -*{ oK } *j{ -*{ oL*j{ -*{ oM*0 { {  { 1{  -*{ { i{ { 1>{ i{ 1.{ { i{ { X2{ i{ X&&{ { { { { { (9 %{ X} { %{ X} %{ jX} %{ Y} { %{ Y} { { - { } *0{  1 -*%{ Y} { { -${ { { { o} { { (9 %{ X} %{ jX} *v} } } } *Js} ( *( *} } } } } } } } *0 i 3 { { { {{{2 {Y+ {YY{   E %R K 8  ? ? }}} %{ { YjX} } }{ { { { { { (%{ { { {{{2 {Y+ {YY,. +} 8{ } { } { } } {  +y,+G }}} %{ { YjX} } }ot*Y { %X __b` X2{  ~ _XZ { X_c { XY{  -{ X} } 8_,&_} { X} } 8@_- } [{ XX} 8 _, } 8s } r3p}  }}} %{ { YjX} } }ot*{  +y,+G }}} %{ { YjX} } }ot*Y { %X __b` X2%{  ~ _X}  _c Y{ } { } { } } {  +y,+G }}} %{ { YjX} } }ot*Y { %X __b` X2{  ~ _XZ { X_c { XY{  _,&_} { X} } 8R@_- } [{ XX} 8, } rkp}  }}} %{ { YjX} } }ot*{  +y,+G }}} %{ { YjX} } }ot*Y { %X __b` X2%{  ~ _X}  _c Y} { Y +  {X  28@:{3-{,%{2 {Y+ {YY:}ot{{2 {Y+ {YY{3-{,%{2 {Y+ {YY-G }}} %{ { YjX} } }ot*{%X{ %X Y {3 %{ Y} { :} 8:{3-{,%{2 {Y+ {YY:}ot{{2 {Y+ {YY{3-{,%{2 {Y+ {YY-G }}} %{ { YjX} } }ot*{%X{ ҜY} 8w1YXY}ot{{2 {Y+ {YY{{.G }}} %{ { YjX} } }ot*}  }}} %{ { YjX} } }ot* }}} %{ { YjX} } }ot* }}} %{ { YjX} } }ot**0O{ { {{{{2 {Y+ {YY ~  ~  +,Y{ %X __b`X2 _   XZ% -:X_cXY{%XXҜ Y 8X_cXY _9= _ X~  _X  _c Y+,Y{ %X __b`X2 _   XZ X_cXY _9 _ +,Y{ %X __b`X 2X~  _X  _c Y  Y  ? YY1OY1G{%X{%X{%X{%X Y 8{{(9 XX Y 8 Y{X2{Y  1f Y Y1/ Y1'{%X{%X Y% -+&{{ (9  X X Y15 Y1,{%X{%X Y% -8[{{ (9  X X 8, @_-'XX ~  _X XZ 8rkp} { Y c 2 +c  X Y bY}}} %{ { YjX} } }* @_-bXX ~  _X XZ% :sX_cXY{%XXҜ Y 8   _,}{ Y c 2 +c  X Y bY}}} %{ { YjX} } }*r3p} { Y c 2 +c  X Y bY}}} %{ { YjX} } }* 2  <{ Y c 2 +c  X Y bY}}} %{ { YjX} } }*??b5%Щ(> *0KL / rvprpr0prprêprݪprprpr5p r0p   ~ sO~ sO~ sO~   sO~ sO~   sO~  sO~  sO~   sO~     sO*0s}2 s}3 s}4 D}5  =5}6  =4}9 (  zD}/ zD}0 ND}1 *0%{ Z} { { Y + { X { Y2~ {+ {E }* ~ {+ {D }- ~ {+ {F }. ~ {+ {G }) }% }! }' % }( }" }$ } *0{2 {/ }X {2 ~B}Z {3 {0 }X {3 ~C}Z {4 {1 }X {4 ~D}Z }B }C }A (+*0{2 +{/ ZX  2 +{0 ZX 2 +{1 ZX 2{/  % }?  }> %}@ }< *0}%{6  b +[{7 /${6 X{6 {9 (-,X {6 {9 (-- {6 {6 b {7 1{6 *0$Z Z 23 ***0!   - XZX 8 XZX X%/ ;/ {1 ZD%qDhXhD+~,=.{1 ZD%qDXhD{1  D%qDXhD+> 0{1 "D%qDXhD+{1 $D%qDXhD - + 3+X > *0u{/ {2 {Y (.{0 {3 {Y (.{4 o +{1 ~S ZX-Y /%{> XZXXXX}> *0f Y(7Y(7Y(7 +{1 ~S ZX(7X 2{/ Y(1{0 Y(1*0   -  8 XZX X%/ ;/{1 (6Y%-+p,2.{1 (6Y{1 (6Y(7+; 0{1 (6Y(7+{1 (6 Y(7 - + 3+X >#*{ { (9 %{ X} *0{ %{ % X} *07%{ %{ % X} Ҝ{ %{ % X} cҜ*07%{ %{ % X} cҜ{ %{ % X} Ҝ*0Z  _X _(7*0%{C Y1~%{B {C _b`}B { %{ % X} {B Ҝ{ %{ % X} {B dҜ{C Y_d}B %{C YX}C *%{B {C _b`}B %{C X}C *0Z(7 ~@(6(<{A X X{C Y /(7 ~@(6(<}A *0Z1{ {= {< ZXcҜ{ {= {< ZXXҜ{ {: {< XҜ%{< X}< -{/ ZD%qDXhD+^%{@ X}@ Y{/ ~U  XXZD%qDXhD{0 (ZD%qDXhD{<  _-d{+ 1[{< Z {% {! Y  +{0 Zjj~Q jXZiX X 2c {@ {< [/[/*{< {; Y*02 {< 9{ {= ZXb _{ {= ZXX _` { {: X _ X - (6+k~U   XX(6~P  ,~V  Y (7Y (  (6~Q  ,~W  Y (7{< ?. (6 }A *0e1   +{/ ZX X 2+{/ ZX X  2+{/ ZX X  2c0+} *01{C 3O{ %{ % X} {B Ҝ{ %{ % X} {B dҜ}B }C *{C 2M{ %{ % X} {B Ҝ%{B d}B %{B  _}B %{C Y}C *01{C 1B{ %{ % X} {B Ҝ{ %{ % X} {B dҜ+({C 1{ %{ % X} {B Ҝ}B }C *(=}A ,h(4fh(4{ (2*{! /+{! {% {! Y(B{% }! { o*0% { Y1 { Y {' 0(C{' --*{' 9%{% {' X}% }' {! X {% , {% 2+{% Y}' }% (?{ { -*{% {! Y{  Y?\(?{ { :E*(?{ { -.**.**b-+(7(>*01 {+ 1P{ 3(;{2 o{3 o(/ {> XXc {? XXc 0  +X% X0. (A+k3"-+X(7~@~A(:+E-+X(7{2 {Y X{3 {Y XX(0{/ {0 (:(+,(=*0d{ {' Y{% Y -{% -{' - {  8  3 Y 8{% { { X Y?{ { { { (9 %{& { Y}& %{% { Y}% %{! { Y}! {   { Y% _ { { /+{ YhY% -{   { Y% _ { { /+{ YhY% - { X { { -*{ { {% {' X o %{' X}' {' 2L{ {%  _} { { _b{ {% X _a{ _} {'  /{ { :*0h {'  /#(C{'  /-*{' 9{' 2|{ { _b{ {% X _a{ _} { {  _ { {% { _{ { { { {% hjj.2{% Y _{  Y0{, . (F}" {" ?u{% {& Y{" Y(9 %{' {" Y}' {" {* ={' ?%{" Y}" %{% X}% { { _b{ {% X _a{ _} { {  _ { {% { _{ { { { {% h%{" Y% }" :`%{% X}% 8%{% {" X}% }" { {%  _} { { _b{ {% X _a{ _} +7{ {%  _(9 %{' Y}' %{% X}% 9U(?{ { :>*(?{ { -3**.**0x {'  /#(C{'  /-*{' 9{' 2|{ { _b{ {% X _a{ _} { {  _ { {% { _{ { { { {% h{" }( {& }# }" ,v{( {* /h{% Y _{  Y0L{, . (F}" {" 0-{, .{" 3{% {& Y 1}" {( ?E{" {( =4{% {' XY {% Y{# Y{( Y(9 %{' {( YY}' %{( Y}( %{% X% }%  0|{ { _b{ {% X _a{ _} { {  _ { {% { _{ { { { {% h%{( Y%}( :X}$ }" %{% X}% 9{(?{ { :d*{$ ,U{ {% Y _(9 ,(?%{% X}% %{' Y}' { { :*}$ %{% X}% %{' Y}' 8{$ ,${ {% Y _(9 }$ (?{ { -3**.**0[{)  {%  {( {% {  Y0+{% {  YY{. { {%  X{ XY { X {( {- 2c {' 1{'  { X @q{ XY @]{ { @H{ X% { X@-X X { X% { X% @{ X% { X% @{ X% { X% @{ X% { X% 3p{ X% { X% 3V{ X% { X% 3<{ X% { X% 3"{ X% { X% 3? YY  Y 1+}&   />{ XY { X { _ _%1 Y% :Y{' 0*{' *6(I*.(G*0] } 3/ e2) 0#3 202 0 21*} } } { _b} { Y} X} { _b} { Y} { XY[} { Z4} { D} { D} X_b}; {; Z4} {; Z} {; [}= {; Z}: }+ }, } (J*0|6j% } } } } } } { /} { -*+q} { jo} } (*()*0O{ *.{ q.{  .*} } } } { q.**0 32  021*~ {+ {H ~ {H .{ j.o {+ .c}+ ~ {+ {E }* ~ {+ {D }- ~ {+ {F }. ~ {+ {G }) }, *01  , { *.*{ { o} /*{  Y1{  Y Y { (9 }% }! {  _} { { _b{  _a{ _}  +]{ { _b{ X _a{ _} { { _{ { { { hX Y1*00/*{ ,!{ -{ -{  3.~ } *{ -~ } *} {  } { *@{ YbXb {+ Y _c 1 b` {% , ` ]YX q} (5{% ,${ ci(5{  j_i(5{ jo} { ,o{ -)} *{ -0.~ } *{  3{ ,~ } *{ -{' -9{  ; ~ {+ {H E +(@ +(D +(E . 3  }  , 3{ -} * 3O3(8+,(A3+{ X{ 2o{ - } *.*{ ,*{ ci(5{  j_i(5o} { -**( }D }E }F }G }H *( *Fr_p(. s, *Z., ,o *** *05sB (0 s o o oF (0 iox *.(TI *( *~K *.sVJ *( * **.rps< z.sYK *0.s L s M ~L ~o5o ~L ~o5o ~L ~o5o ~L ~o 5o ~L ~o05o ~L ~o@5o ~M ~orpo ~M ~orpo ~M ~orpo ~M ~or)po ~M ~or7po ~M ~orEpo ~M ~orpo ~M ~orpo ~M ~or)po ~M ~or7po ~M ~orEpo ~M ~\ orDOpo ~M ~[ orpo ~M ~] orXOpo ~M ~ or+fpo *0o . rps8 z~o" - rps zo ~oo- rps zo((z  ~o} , o . rps z &rps z*P4 00H~M o t/ -**0D(` ~L o ,~L o 5 ( o r@ps z*.5 ( *6s}N *6(}O *>ok(f*0-s {P s>so {Q o &**(h*0s- rps8 zs ~0s~ sh  {Q oU ,{Q {P s ,sV+{N {O  ss$*vs }P s }Q ( *b(oH t}R *0( }R *&{R *"(l*&{R i*&{R i*2{R i*0 (r*0 ws }S ( }V }Y }T }U }W }X }Z }[  }\ {S  so &*R{Z {[ (t*0 {Y oos; {Y oo<oDoEs {Y oooJo &{S {U {W {X {\ so & z rp sz* 2{S s*0s {S oS o& &o% t6 oo &+Bo% t6 os o o {o.s2} o &o& -s*(+ *"(, *&(- *>o({*> (|*0Q( }_ }^ o}a }b 4}d X{a X4}e }g *Z{^ orp(. *0u,t o9 o8 }` +, s }` {_ ou,to +t> ooY}c {c X[4}f *.i(` *6{^ o*>{^ o*2{^ o*0{c {a Z{b ZX X/ rpsjz{^ {e {e i{a Y{b Yo&{b ,1{` {d o@ {d {e {e i{b YoA {a 4 {^ {e {e io{^ o&{f {f i{b YY{a YY{d {f {f i{b Y{a YYoA i{f i{a YY(  + {f 4%q4aҁ4X i3{f 4%q4 {f iZ{c Y_c_ҁ4{f {f i{a YYoA {f {f iY{g {_ {f {f io {f ( *0{c {a Z{b ZX X/*{^ {e {e i{a Y{b Yo&{_ io {f {f iiYoA {f {f iY{g .{f (*{f {f i{a YY{a {f i{a YY(  + {f 4%q4aҁ4X i3{f 4%q4 {f iZ{c Y_c_ҁ4 +{f  ,{f (* X {f i{a Y{b YY3{f {f i{a Y{b YY.{f (*{f {f i{b Y{a YY{e {e i{b Y{b (9 {^ {e {e io{^ {e {e i{a Yo&{f i{a YY{e i{a Y+;{f {e a,{e ({f (*XX{e i3{e ({f (*vdҜdҜdҜҜ*04 {a 4 4  {^ o+G ({^ o{^ io{^ o& {a ZoA X {a [2 {a Z/P ({^ o{^ io{^ o& {a Zi {a ZY(9 *V( }h }i *{h or p{i oZ(I *0i}j u,to9 t +t ,o- rpsz-o, rpsz({i o[*6{h o*>{h o*0^{j - rps< z{h o4 {h o&{i o\ (  oJ sz *2N0\{j , rps< z{h o4 {h o&( rpsz{i o]*2 < 2{h o*0%G7 sVsVs(m*0=(tK  ot$oXot$oX*V( }k }l *{l *{k *(}:}m o4}7}8*6s(*0Gn}9 u,t o8  o9 o*{m o{:o*09%{8X {7i] -{9, {7iX**Y{7iX*0&%{8X {7i] - {7iY*Y*0I% {8{7i3{:{7o }8{7%{8% X}8*0d/ r$ps8 zo o 1Xi1 rpsjz {7i{8Y  1k{7{8 (9 {:{7oX }8 Y X+ {:XoX YX{7i0{7{8(9 %{8X}8*0%{:o  {9,y{837ZXi1o*rpsjz{:{7o }8{m {7{8o&{:{7XoX o*+i{83#{:{7{7o }8+o*rpsjz{m {7oY {7(9 o**%r(Q }n }o }p *{o *{p *0'{n o {o ,2 {o o *0+{n o] {o ,1{o o *{p ,1{p o {n oE *{p , {p o {n oD *r{n o , {o **r{n oX , {p **2{n oW *2{n oC *2{n oY *6{n oZ *2{n oV *2{n o[ *:{n o\ *6{n oG *6t+}q *0W~$ {q o o0 {q owo5o o1 os@ s}s*( *N( s}r *0O}t u,%t o8 }u o9 t}s *, s }u t}s *n{r oorήp(. *0{t - rps< z{r {s o{r o XZ/ Z4 +X], X[XZ+X4 ҜfҜXfҜXfҜ(9 {u XiYYo  +{r o&X i2 +{r   o& X i2*0m{t , r ps< z{r o Z/ rpsT z4 4 (9 i(9 {r {s oso +{r   o& X i2iiYi(9 {r {s oso{r o&{r {s o+{r o&Xi2 _iY1 rpsT z _4(9 +$Xf. r4psT zX3*( *rp* *"~w Z*0>,u-rjpo: o (. s8 z}} t o(*0a( {y - rps< zXi1 r{psjzXi1 rpsjz{} - (*(**0Ii~w YX~w [ - i~w XY~w [5 iY +"~w [~w [b _XY /~x ZXX5}y {y ~z  +{y  {y  Y~{ X X {y i2i{y i1 iZ+ {y iZ +e{y {y XX(%  XXX(%  X{y i]Xi] X  2*0I( ~w X( ~w ZX( ~w ZX( {y X {y X +|ZXZ(  ZXZ(a ( {y ZX a ( {y ZXX    X~x >x{y ~x ZXX {y ~x ZXX (~w X(~w ZX( ~w ZX(~w Z*0T( ~w X( ~w ZX( ~w ZX( {y ~x ZXY {y ~x ZXY ~x 8     ZXZ~| (  ZXZ~| ({y ZXY ( a {y ZY ( a Y *~s} 4} ( *2s~(*F_d Y_b`*j _bj _dZnai*0)( a(a(a(a*0Cd( ( ( a aa a(a a(a (a*0Z~  _ _~ c _ _b`~ c _ _b`~ c _b`*0Wi[ ... r)ps8 zX} { Xsm   +Cc_ _ X _b` X _b` Xb`(n X X i2{ Xb+xYcY_(o ]- ((~ [Ya+1]3 (c_YcY_(o a(n X2-?+0+ (o ((n X2X{ 2*( *0Cu-r)po: o (. s8 zto(} } *r?p* **0{ - r*ps< zXi1 r{psjzXi1 rpsjz{ ,({ ((+({ ((**0 %X _} %{ %X _b`} %{ %X _b`} %{ %X b`} %X _} %{ %X _b`} %{ %X _b`} %{ %X b`} %X _} %{ %X _b`} %{ %X _b`} %{ %X b`} %X _} %{ %X _b`} %{ %X _b`} %{ %X b`} *0 %X { Ҝ%X { cҜ%X { cҜ%X { cҜ%X { Ҝ%X { cҜ%X { cҜ%X { cҜ%X { Ҝ%X { cҜ%X { cҜ%X { cҜ%X { Ҝ%X { cҜ%X { cҜ%X { cҜ*02%{ (o a} %{ (o a} %{ (o a} %{ (o a}  8~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba(%X (o a~  _ _~ c _ _ba~  c _ _ba~ c _ba((o a} ~  _ _~  c _ _ba~ c _ _ba~ c _ba((o a} ~  _ _~ c _ _ba~ c _ _ba~ c _ba((o a} ~  _ _~ c _ _ba~ c _ _ba~  c _ba(%X (o a} { Y?9~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba(%X (o a~  _ _~ c _ _ba~  c _ _ba~ c _ba(o a} ~  _ _~  c _ _ba~ c _ _ba~ c _ba(o a} ~  _ _~ c _ _ba~ c _ _ba~ c _ba(o a} ~  _ _~ c _ _ba~ c _ _ba~  c _ba(o a} *02%{ { (o a} %{ { (o a} %{ { (o a} %{ { (o a} { Y 8~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba(%Y (o a~  _ _~ c _ _ba~  c _ _ba~ c _ba((o a} ~  _ _~ c _ _ba~ c _ _ba~  c _ba((o a} ~  _ _~ c _ _ba~ c _ _ba~ c _ba((o a} ~  _ _~  c _ _ba~ c _ _ba~ c _ba(%Y (o a} =@~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a ~ {  _ _~ { c _ _ba~ { c _ _ba~ { c _ba((o a~  _ _~ c _ _ba~  c _ _ba~ c _ba(o a} ~  _ _~ c _ _ba~ c _ _ba~  c _ba(o a} ~  _ _~ c _ _ba~ c _ _ba~ c _ba(o a} ~  _ _~  c _ _ba~ c _ _ba~ c _ba(o a} *c|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-TR j068@|9/4CDT{2#=L BN.f($v[Im%rdhԤ\]elpHP^FWث XE,?k:AOgst"57unGq)ʼnobV>Ky xZݨ31Y'_`QJ -zɜ;M*  4%Ь(> 5%Э(> *0.(sB +oD o % /oF } *0(4 Ҝ} *F{ oH t*B { o *0H(o } %{ o j8b`} %{ o j0b`} %{ o j(b`} %{ o j b`} %{ o jb`} %{ o jb`} %{ o jb`} %{ o n`} o } {  YE .$.+H sX(Z} * sX(ZsX(Z} *rWps) z(} } } oH t} *{ *{ *{ *F{ oH t*0csB s  { oD { o { oD  +{ (\X { i3oF o *(sX} sX} sX} sX} *(sY} sY} sY} sY} *r?Ap*0( & * 03 { { { { o *2{ oZ*2{ oZ*2{ oZ*2{ oZ*B(} *0Z(q- rI<ps z} (} u, ~%} *u, ~&} *rps8 z0(q- rjps z- rps zoP } { ~%o ,^oQ t$oX otsT  otsT  oV ooV os} 82{ ~&o 9oQ tN ot$oXo ot~(o , ot$oXo+Y otN  ot$oXo ot$oXo ot$oXootsU  otsU   oV o oV os} o3oto} *{ *2{ (*0I7s] { ~%o -{ ~&o ,L7 { osS opo^7 { osS opo^{ ,7 { s o^s*0rjps r}jps rjps rkps rjps rjps r1ps rzps rps rps rps ~ rp(( s ~ rİp(( s ~ rp(( s ~ rp(( s ~  ~  *( *0x(q,+oXo2oXo 1 r̰ps8 z,+oXo2oXo 1 rps8 z} } } *0 (q 8ou$,ot$} 8ou9ot o2  EG8(T} { oXo2{ oXo 1Xrhps8 z(T} { oXo2{ oXo 1rps8 zrps8 zX o?*0A,u ,t *uK, tKs*r.po: oO (. s8 z{ *{ *{ *0~I7s] { ,7 { o^{ ,7 { s9 o^{ ,7 { s9  o^s*0d,u,t*u, ts*u,*t o2 3 ( s*(s*( s*r(q- r !ps z} *r(q- r !ps z} *{ u,{ s9 *{ s9 *0_,u,t*u,tos*u,to5 (*rcpo: o; (. s8 z2o5 (*^(0 iox ( *&( *( - r3ps z,(-r{pr3ps z} *{ *F(0 { o2 *>( o!*2{ o" *0u -*{ { o? *0(  + o{ 1  X oz 2**6o ( *Fr|po (. *6o ( *Frpo (. *N(((*Noo(*0(^( rܲp _ r0p(w (. *0rps ~ r&p(( s ~ r2p(( s ~ r>p(( s ~ rJp(( s ~ rVp(( s *( *0F,u,t*u, (~s*rpo: o; (. r3ps z:(q} *N(qs} *{ *2{ op*0F,u,t*uK, tKs *rdpo: o; (. r3ps z0l(q- rps zo. r;po5(( rps zoop(} oopt} *(q-s z} s} *{ *2{ o*0 G7 { { s**(&*(- rC+ps z} } } *{ *{ *{ *{ -+ { { o$*0<u -*{ { 3 { { 3{ { (**0*{  (7 {  (6 a{ (a*6((.*0A,u,t*uK, tKs/*rZpo: o; (. s8 z0D(qo.rEprps zo(} o(} *0 G7 { { s*( ot} ot} *{ *b{ -*{ o+ *0A,u,t*uK, tKs5*rpo: o; (. s8 z0(qo2 o1 r;po5(( rps zot} o1,ot o2 , rps8 zo5 } *V(q} } *{ *{ *0CQ7 { s] { ,7 { so^sp**0N}  +:{ ,,{ { ѝ{ { ѝ%{ X} X  2*0 5 5 5 + X,+bX2    +L X    +  c c     c2  X1 ?(:8 Y     b0>/ X /X  2  +  Y b0>/ X /X  2+X   %  j n_ j n_Xm  _ _0  _+   _X` X +cc  c2=h 2(:+5+  X /Yѝ1X1-*+  c[X bX28f* (>* (ylE q&TsY ) }$0s}  6}  @}  @}  RF@}  RF@}  5} } 5%Ю(> } (Q } } } } BoD ZoD (I2}  1 /} (Y(D(E*0{ X ] { .N{ 30%{ X} {  1?(@} } *(@} } *} %{ X} *0%{ { <{ {  +{ { oX { 2{  YE*s8%{ X} { { X{ ѝ*%{ X} { { X{ ѝ%{ X} { { X{ ѝ*%{ X} { { X{ ѝ%{ X} { { X{ ѝ%{ X} { { X{ ѝ*{ { Y%{ X} { { X{ ѝ%{ X} { { X{ ѝ%{ X} { { X{ ѝ%{ X} { { X{ ѝ%{ X} { { X{ Yѝ*(F(E(@*{ ,*(B} (V { oV *{ ,*{ 1(@} (F(G} o[ *2{ o[ *} } h(L0{ X(L} *0A{ o}  + { X  2 { ZY} *0{ o} { b{ d`} %{ { a} (W1(LA(LY(L&(LS(LY(L{ (M{ ,(K%{ X} +(K(P*0F(Lr(LE(L8(LP(L (L{ (M(J*0/1  +# +3X X 2b X 1*v} } } } *0R+F{ c { oD  z%{ b} %{ Y} %{ X} { 0* 00}+F{ c { oD  z%{ b} %{ Y} %{ X} { /%{  { YY_b`} %{ X} * 0&(K*0Ac _(Kc _(Kc _(K _(K*&(K*0t (3  { X  + + X  2X 2{ 0(:{  /+9{  X/+'{  /+{  ` /+{ 8[Y+X{ X/ Y21).#.Y]3{ YY +#20 Y+ YX  2YXY=V (25D 8 + X 2 + + X  2X 2 { <2XY{ 2 { Y + X 2@%%%%% +\{  hXhhXhhXhhXhhXhhXh X 1+A +7{   + D%qDhXhDX 2 X 1 ɚ;  + /  X 2 X5%q5X5{  ѝ X  +#{  5%q5X5 X 1X8N + (<X 2 X  ?2(: /  RF1(:@  +  ѝ X 2 +I{  ! #+X#" # "!#3 #{  ѝ X  2 (2$ +`   +$ 1   /  X  21(: /(:$  (HX 26% +/% +{  ZX,% X2 X 2 +% , (K+(K X 2 +=% ,3+({  ZX, (K+(KX2 X 2(K (K +++(KX{  2(K X  2 +Y&&(K +<(K&X&& 2+(K&Y&& 0(K X  2X 2{ /h2XY{ 2 { Y +3{ {  ${ {  (K X 1XX+ .(:*n{ (N(Z(O*0oYX /*+X{  2Y89{  X ={  +{ { YY XY1{ YXX(X-{ X ={  +{ { YY XY1{ YXX(X-{ X 0o{  +{ { YY XY1{ YXX(X-{ X { { >{ 9*Y<*0: +1{  { { { XXY0*0!1 1 1*0*   +  se X  2 }  }  } X8 2(:Y {  {   {   Y2  1)  (Q{ { >d{ 9Y*{ {  XX{ {   XX{ {  Xc XX(S%  % 0Y{ {  XXY-1 {  { { {  X X +0X +0Y{ {  XXY-1{ { {  {   Y Y +2Y +01{ { { { X Y 8 /1 }   }   X} X8YY2Y+YY(R Y Y2 Y+ Y YX(RXYY YYX }  }   } X X}  Y}   X} X }   }   } X=0*0# 5 5 6 +({ { XX{ { X]XX 2 + { X { X1{ { { X{  /B + { X { 1} %} } { (Q*  + X  1 + { X  1{  +3{ X{ bX5%q5X5X { 1 +&{ 5%q5{ YX5X  1{  +E{ XbX { 5%q5Y5{ { X { 2{ { Xb{ X { 5%q5Y5{ { {  + X  1  ZX  1 [  +i  + Y Y  Y1>{  YXb{  YbY{  Xb{  bY0 X  1 @| 89  8bX {  _ .u{  _ {  X _Y   1.  (T   YXX { { 1 { ,*{  5%q5 `5X  >a <{ b _{ Xb _Y+X_c 0 +?{ X_c{ /{ { XXX 2Y_c 1(: +{ bX _X  1{ b _ +Z{ { ->{ { , { Y+{ 5%q5X5X { Xb _2 +%{ bX5%q5 `5X  1X  >*01   + { X  2 +x-~ X  3 Y { X@%q@.+aс@{ X@%q@ _с@{ { XX { >|*0%{ { Z} } } } (U{ { 12{ ,*(V% } } } } (U}  +{ - } + X { 1{ 3(:*0f{ X { X .*XX{ X { X .*XX{ X { X .*XX{ X { X .*XX{ X { X .*XX{ X { X .*XX{ X { X { X .*{  {  . *XX{ X { X .*{  {  . *XX{ X { X .*{  {  . *XX{ X { X .*{  {  . *XX{ 1{ YY{ 1{ YYY %{ X} <*0w { Z XX@} X5} 5}  5} { ,{ ,{ ,{ &ZD} *0! @ (;{ X + { X 1 + ѝX { 2 8{ { {   +X   3 - X8>Y]  E-+T{ X{ 5%q5X5+){ X{ 5%q5X52 Y[+{ XhX{ X5%q5X5X { >>Y]  E-+T{ X{ 5%q5X5+){ X{ 5%q5X52 Y[+{ hX{ 5%q5X5} * *j**0 +XoD X 2* * * *j*j**( *6s(x*6s(x*Jo#((y*0S(#} ooCoMo} ooCoLo}  rps z* 8E v{ oo>oXoX*Z{ ooBoX*{ oo?optKsY*Z{ oo@s *{ *{ *0Z{ ooE ,Do iZoY6  +  [ ]_c_ X i3**2( o*o~(r 2o(r **2( o*0Wo(r 1r[po (( szo~(r /r[po~ (( sz*F{ oo*0{ o{ ooAo - rRps<z{ ooo( oK{ ook ioM rߴpszooO- r8_psz*Pn 02{ ok*F{ ooF*0?{ ooD o  +osX o3*0l{ ooD s  +'os oo? , o &X o3oU /*Ц( o! t*0$3*u -*{ { o *2{ o" *:(q} *2{ s*"(*:( } *0~ oX , (o**0lo#tK o1Jou,<o~o ,)ot((o} (*(o*0E{ ,{ { o2*{ %{ % X} o(o*ss*:s (*:s (*0- rps zo -rprps z{ -} } } +{ .} } } { ,0{ { o. (u} } bs o /Ko0. (4{ -s+s( ( zo s9z*c c0s +o &(% -*Br5psV *( *0- rps z(j ok @ /o i/ rps8 z% ,V r=p(l -' rIp(l - rgp(l - r5p(l ,"rp(l ,tJ osx*rprõp(I s z0A {*  X5%q5X5 X Y-{* 3 *+{* - X1/+{* - Y- 1_b +! {* Y% /*X b 2 {* Y% /*{* 5%q5 X5{- %  +${-  {*  X% X  X Y%-  X%,$ {- 5%q5%X5 X X%2{- {- %  e {,  8g{*  8H X  X  Y0+ Y%_b% X1>XY  /.+!b% {*  X% 1{*  Y X%2_b X 1*{,   %  5%q5X5 ,e{-  {+ Ҟ{+ Ҟ Y_c{+  {,  YYY{+  {,  YXZ(9 +  X={+  YҞ 2{+  +i  /.{+   2`+Ҟ{+   %X +2{+   YX@XҞ{+   %X Y Y_b  _c+{+   XZ(9 X2Y_b+ ac_-a _bY+ Y  Y  _bY_{-  3%Y :X> ,3**0 ^({( {( {) ( 3rp} +.-r5p}  *0  ({(  ~$ ~% {( {) ( --)3 r}p} +. röp}  * (~& ~' {( {) ( --G 1?3 rp} +*3 r;p}  +. rmp}  **n ~" ~# *01{( -K5}( 5}) 5}* 5}+ 5}, 5}- {) i/ 5})  + {) X 2 + {* X 2 + {+ X 2{* {, (9 {* {- (9 *`PTsRp0 P ` @ PX S;x8 Qh( H PTUS+t4 Q d$ D P\ TS|< Rl,  L PRUS#r2 Q b" B PZ TCz: Rj*  J PVS3v6 Qf& F P ^ Tc~> Rn. N `QURq1 P a! A PY S;y9 Qi)  I PUPS+u5 Q e% E P] TS}= Rm-  M PSUS#s3 Q c# C P[ TC{; Rk+  K PWS3w7 Qg' G P _ Tc? Ro/ O `PTsRp0 P ` @ PX S;x8 Qh( H PTUS+t4 Q d$ D P\ TS|< Rl,  L PRUS#r2 Q b" B PZ TCz: Rj*  J PVS3v6 Qf& F P ^ Tc~> Rn. N `QURq1 P a! A PY S;y9 Qi)  I PUPS+u5 Q e% E P] TS}= Rm-  M PSUS#s3 Q c# C P[ TC{; Rk+  K PWS3w7 Qg' G P _ Tc? Ro/ O PWS[QYUA]@PXT!\ R ZV`PWS[QYUa]`PXT1\0R Z V` #+3;CScspp !1Aa  0@` 0 5%Я(> " `5%а(> # 5%б(> $ 5%в(> % 5%г(> & 5%д(> ' *( *( *.i(*0}Zs ~. o&oF *F~. io*>~. o*0%}iX[s ~. io&oF *0$}oz X[s ~. o&oF *6~. o*.s. *( *Z3*,-*(*"(*Z3*,-*(*0$ii.* +.*X i2*0$ii.* +.*X i2*0J[s i1,oN & +r0poM oN &X i2]ot &o *0'%-*i X + Z a Y% /*F, oH t**F, oH t**08( }/ oo}0  rpoJ (. s z*  F{/ oo*2{/ o*{0 *Z(, (s**F{/ oo*F{/ ooX*2{/ o*{/ o,{/ ooX**n{/ ooioo*F{/ ooj*2{/ ok*{/ *Ns ( }1 *>( }1 *{1 *0u% -*{1 {1 o *6{1 o" f*:(; }2 *6s (*0(; s }2 (?  oF  .#.rp  r0p(w (. s) zoG t +oG &oF =.(<  (= (> {2  so &+GoG t+oG &oF =.(<  (=  {2   so &oF .*^{2 oT t6o*J{2 oT t6*2{2 s*0F{2 oS +o% t6 o3 o& -u. , o' ** %10}sB (oF *0K- rps z{2 oS +o% t6 oo& -u. ,o' *90{{2 se    +6 oT t6oo3   o o, X oU 3-o,, rips8 zo &s*0O{2 se   +(oT t6 oo3  og X oU 2-*s*Voo(*( s}3 {3 os}4 *V( }3 }4 *2{3 o*{3 *{4 *&(*0`(  ErcprY#ps z.2 1rp5(( s8 z}5 }6 *0A{7 , r~ps< z- rps zs }8 ({7 s*0P{7 , r~ps< z- rps z- rps zs }8 ({7 s*0{8 {5 oD {5  E(A+Q{8 }7 *{8 {6 s }7 *{8 {6 s }7 *{8 s=}7 *s z0w{7 ,n{5  YE+"{7 toB+{7 t~o {7 o[ {8 o {8 o[ }7 }8 *0[s}m s}n s}o s}p ( s\([ s }r s}q *0Hs}m s}n s}o s}p ( }r s}q *0 YE-C*{n o(*{o o(*{p o(*{x -  ({m o(*0J  {p o?0 4 {p os (M (O{p oX?4{p o{p Xo .P{q {*o*{q {+o*{q {*o*{q {+o*s  88EhF8;8{ 99@(G({ oIoN - Z({Zooi o( &+(oos}s }  8u (8g{ :: @ 4  (Q( 4 $4 {q {+ o+&{{ r׸p(B  (V +    . (( X   i2 } }x  8 (8{ ;;3|(S 4}z {z (Q(M  4(Q(N(!}| (M, /((}  8( (8{ <<YE8{ 3{| o.  (({ } ,({| o88. 8;8<04}~ {~ {~ {r {~ .o s7s{s {r s5 o{~ {~ io &P(sB (CiX(Gi(EioE oF {q io+k{} osB (CiX(Gi(EioE oF {q io+  (} 4{q io} 04}{ {y i{z iX4{y {y i(9 {z {y i{z i(9 {~ rp(B{{ (V{q {| }-{q {-{{ {y {z o 4$4{q {*o+&{{ rp(B(VsB (C (GioE oF {q io }  8((8{ 88@{| o.  ((N  4!!(Q(N""4##(Q(N$$4%%(Q(N&&4''(Q(s-(sB ) )(E)!!ioE ")(E)##ioE $)(E)%%ioE )oF *({y {y io*({z {z io*(**io*(o(4+(+o+&s7,,s--{s o.-''io. &*(.i+i. *(/+./+/. *(/X//.i2!s0#s1%s20oY{r s3130o}} 230oo}~ }  8 (8{ 88YE+i{ 3{| o.  ((M44455(Q(N66477(Q(}  + (+  (:*(y! +  *0s+b4 {o o{o o  3)}w }v {q o&~l s) z-({o o/*> K0w+f4 {n o{n o.  (+3{  3 {q {q {-}, } + (({n o0*06sB  (C(G(GoF {q io*06}  4}y (  j[i {y cҜ{y cҜ{y cҜ{y Ҝ{r {y o sB (T{y {y ioE (C( 4 ih(CioE sB  (CoC i (GoF  ioE oF {q io} + {q o{  3s}t s}u *0+R{w , ~l s) z{v ,*{q o( {v - P(z {v - P(z{m o,{m o(/ {m o{m o* ,0 @0{w , ~l s) z{v , r3ps) z{q ~k o @(/ {q o( {v - P(z {v - P(zXY0*FX0Fl{u *{u *{t *{t *0a{v -M4 ҜҜ}v 3}w {q o{q o3~l s) z~l s) z*F{v -(*boY oC / 2(*2{q o*Z4k rpl *jo0o(v} *{ *0H( } o} o} { 4} { 4} *Z{ orp(. *{ *0A'{ oto i{ 1F{ io{ { o&{  + { X { i2+/{ i(9 i + { X { i2{ i4} { { { i(9  +{  4%q46aҁ4 X { i2+"{ 4%q4\aҁ4X{ i2{ { { io*{ *6{ o*>{ o*0Z^{ 4 { o&{ { { io{ io{ o (*{ o{ { { io*r(Q } } } *{ *{ *0'{ o { ,2 { o*0+{ o] { ,1{ o*{ ,1{ o{ oE *{ , { o{ oD *r{ o , { **r{ oX , { **2{ oW *2{ oC *2{ oY *6{ oZ *2{ oV *2{ o[ *:{ o\ *6{ oG *0Bu-rpo: o (. s8 z} to(} *rkp* **0_{ - r{ps< zXi1 r{psjzXi1 rpsjz{ , (+ (**0 5   iY +%X (Y 0-%X (/+ rps8 z~ XZ 5+8YYaYaYa~ aYa (X2(9 +;YYaYaYa~ aa (X 2(#{ { { { (!{ { { {    ({  {  {  {   ( {  { { { (+{ { { { (){ { { { ('{ { { { (%{ { { {  !"#(# { !{ "{ #{ $%&'(!${ %{ &{ '{ ()*+(({ ){ *{ +{ ,-./(,{ -{ .{ /{ 0123(+0{ 1{ 2{ 3{ 4567()4{ 5{ 6{ 7{ 89:;('8{ 9{ :{ ;{ <=>?(%<{ ={ >{ ?{ @ABC(#@{ A{ B{ C{ DEFG(!D{ E{ F{ G{ HIJK(H{ I{ J{ K{ LMNO(L{ M{ N{ O{ PQRS(+P{ Q{ R{ S{ TUVW()T{ U{ V{ W{ XYZ[('X{ Y{ Z{ [{ \]^_(%\{ ]{ ^{ _{ `abc(#`{ a{ b{ c{ defg(!d{ e{ f{ g{ hijk(h{ i{ j{ k{ lmno(l{ m{ n{ o{ pqrs(+p{ q{ r{ s{ tuvw()t{ u{ v{ w{ xyz{('x{ y{ z{ {{ |}~(%|{ }{ ~{ {     (# {  {  {  { *F_b Y_d`*F_d Y_b`* _bX _b`X _b`X _`*XҜXdҜXdҜdҜ*0( (} X(} X(}  X(} { { a{ { a{ { a{ { a((-{ { a{ { a{ { a{ { a((-{ { a{  { a{  { a{  { a(!(-{  { a{  { a{ { a{ { a(#(-{ { a{ { a{ { a{ { a(%(-{ { a{ { a{ { a{ { a('(-{ { a{ { a{ { a{ { a()(-{ { a{ { a{ { a{ { a(+(-{  { a{ !{ a{ "{ a{ #{ a((-{ ${ a{ %{ a{ &{ a{ '{ a((-{ ({ a{ ){ a{ *{ a{ +{ a(!(-{ ,{ a{ -{ a{ .{ a{ /{ a(#(-{ 0{ a{ 1{ a{ 2{ a{ 3{ a(%(-{ 4{ a{ 5{ a{ 6{ a{ 7{ a('(-{ 8{ a{ 9{ a{ :{ a{ ;{ a()(-{ <{ a{ ={ a{ >{ a{ ?{ a(+(-{ @{ a{ A{ a{ B{ a{ C{ a((-{ D{ a{ E{ a{ F{ a{ G{ a((-{ H{ a{ I{ a{ J{ a{ K{ a(!(-{ L{ a{ M{ a{ N{ a{ O{ a(#(-{ P{ a{ Q{ a{ R{ a{ S{ a(%(-{ T{ a{ U{ a{ V{ a{ W{ a('(-{ X{ a{ Y{ a{ Z{ a{ [{ a()(-{ \{ a{ ]{ a{ ^{ a{ _{ a(+(-{ `{ a{ a{ a{ b{ a{ c{ a((-{ d{ a{ e{ a{ f{ a{ g{ a((-{ h{ a{ i{ a{ j{ a{ k{ a(!(-{ l{ a{ m{ a{ n{ a{ o{ a(#(-{ p{ a{ q{ a{ r{ a{ s{ a(%(-{ t{ a{ u{ a{ v{ a{ w{ a('(-{ x{ a{ y{ a{ z{ a{ {{ a()(-{ |{ a{ }{ a{ ~{ a{ { a(+{  { a({  { aX({  { aX({  { a X(*0{  (a} {  X(a} {  X(a} {   X(a} { { { { (,%{ { |a} %{ { }a} %{ { ~a} %{ { a} (.{ { { { (*%{ { xa} %{ { ya} %{ { za} %{ { {a} (.{ { { { ((%{ { ta} %{ { ua} %{ { va} %{ { wa} (.{ { { { (&%{ { pa} %{ { qa} %{ { ra} %{ { sa} (.{ { { { ($%{ { la} %{ { ma} %{ { na} %{ { oa} (.{ { { { ("%{ { ha} %{ { ia} %{ { ja} %{ { ka} (.{ { { { ( %{ { da} %{ { ea} %{ { fa} %{ { ga} (.{ { { { (%{ { `a} %{ { aa} %{ { ba} %{ { ca} (.{ { { { (,%{ { \a} %{ { ]a} %{ { ^a} %{ { _a} (.{ { { { (*%{ { Xa} %{ { Ya} %{ { Za} %{ { [a} (.{ { { { ((%{ { Ta} %{ { Ua} %{ { Va} %{ { Wa} (.{ { { { (&%{ { Pa} %{ { Qa} %{ { Ra} %{ { Sa} (.{ { { { ($%{ { La} %{ { Ma} %{ { Na} %{ { Oa} (.{ { { { ("%{ { Ha} %{ { Ia} %{ { Ja} %{ { Ka} (.{ { { { ( %{ { Da} %{ { Ea} %{ { Fa} %{ { Ga} (.{ { { { (%{ { @a} %{ { Aa} %{ { Ba} %{ { Ca} (.{ { { { (,%{ { a} %{ { ?a} (.{ { { { (*%{ { 8a} %{ { 9a} %{ { :a} %{ { ;a} (.{ { { { ((%{ { 4a} %{ { 5a} %{ { 6a} %{ { 7a} (.{ { { { (&%{ { 0a} %{ { 1a} %{ { 2a} %{ { 3a} (.{ { { { ($%{ { ,a} %{ { -a} %{ { .a} %{ { /a} (.{ { { { ("%{ { (a} %{ { )a} %{ { *a} %{ { +a} (.{ { { { ( %{ { $a} %{ { %a} %{ { &a} %{ { 'a} (.{ { { { (%{ {  a} %{ { !a} %{ { "a} %{ { #a} (.{ { { { (,%{ { a} %{ { a} %{ { a} %{ { a} (.{ { { { (*%{ { a} %{ { a} %{ { a} %{ { a} (.{ { { { ((%{ { a} %{ { a} %{ { a} %{ { a} (.{ { { { (&%{ { a} %{ { a} %{ { a} %{ { a} (.{ { { { ($%{ {  a} %{ {  a} %{ { a} %{ { a} (.{ { { { ("%{ { a} %{ {  a} %{ {  a} %{ {  a} (.{ { { { ( %{ { a} %{ { a} %{ { a} %{ { a} (.{ { { { ({ { a({ { aX({ { aX({ { a X(*0M2a a a _a} _a  `a} {  a_fa}  fa} *0X2f a `a a  a} _a{ _a} _ { `a} {  aa} *0Q2fa `a a} `a { a  _a} a{ a}  _a} *0^a _a a a} _a {  `a} { f{  aa} `a} *0df a _ a} a { a_ a} `{  `_a} { a{ `aa} *0ja f a a  _a} `a`a}  f{ { `  a} _ aa} *0ma _ ` a _` a} aa _a} { { _  a} `  aa} *0o` a _ a  a `a} `aa} a{ _   a} { { aa} *0d4a _ a `  a} f`a} { _a _a} a{ _a} *0p4` _ a _  aa} f{ _a} { `a{ a} _{ aa} *0uf a a a ` a} { _{ aa} { ``a  a} a{  _a} *0a4f _ a _ a a} { `_a} `aa} _ a`a} *0f4f a a `  aa} { `a_a} a{ a} f_a} *0a4f a a `  aa} _a`a} { `a} _aa} *0sa _ a a ` _a} { ` _a}  a{ _  a} f{ { _a} *0f2_` `_ a} f a { a`a}  a{ `a} { a{ { _aa} *0d{  ( { ( { aa { aba (}  (} { a{ a(} { a{ ba(} *0d{ ({ a{ ba { ({ a{ a { ( { ( aba}  aa} (}  (} *J  y7 *( *r8p*0R{ o u,%t o9 t>} o8 } *t>} s } *2{ o *2{ o *0 { - ro(ps< z{ o  { u?,v{ t? o,So  (6o oo o{ o  oo o +{ o  + { o  { o *0Q oY [ { o  _Y [ZX { s + { s o, *Js } ( *V(=(=ada*^(=(=a da*j (=(=a(=X*j (<(<a(<X*>_be_d`*>_de_b`*{  _{ d _ XX*{  _{ d _ XX*" _*" _*&Y(A*0 { (A {  4t{ 9%q9{ (B{  (B{  (B(:X9{  (B(>{ a +r{ 9%q9{ (B{  (B{  (B(;X9{  (B(?{ a { X(@} *0g { i. rps8 z}  9  +(c9%q9{ __b`9X 2(9  +*cX9%q9{ __b`9X { i/2 (9  +1  Y(9 YX Y(8X YX X X 7 {  (9  {  (9 +{ (CX 2+{ (CX 2} *r)p*0~ u,to} to + 4} u,to} (D+ r7po: o; (. rps z} *0c{ -;(C { Ҝd { Ҝd { Ҝd { Ҝ{ {  { X_} *0g{ -(Erp(. s< zXi1 r{psjzXi1 rpsjz +XX(GaҜX 2*:} (D**(Ga* 9}  9} 4} ( *0Fu, to9 u- r%=ps8 zt} { o} *0Z { - rps< zt o{ o - r=ps8 zoA{ o~{ o0o*( *6 (P*V( } } *j{ o { s *0oQ (oV *{ *04 ,***(*>(T(*>{*0Dt(- rӻps zo bo ` X[4 oE s} *(- rps zo/rprps z} *{ *{ oho { oo*joho oo*(- rӻps z4} { oE *(- rps zoH t} *F{ oH t*B{ o *0F,u9,t9*uK, (sb*rpo: oO (. r3ps z0f(qo. r;po5(( rps zo(} o(S} o(S} *(q} sU} sU} *{ *2{ oX*2{ oX*0)G7 { { { s*V(q} } *V(q} } *V(q} } *0(q} ..3 s } *3 s} *3 s } *3((q -r'prSps zs>} *r]p5(( rps z0\,u:,t:*u9t o2   E !/ESao}8(sj*(sj*(sj*rp5(( s8 z(sj*(sj*(sj*(sj*(sj*rpo: oO (. r3ps z6(, (l*{ *{ *0sL { o &rpoM &{  YE44+2{ (o oM &++{ ( o oM &+{ o oM &o *0(- (9/o /4 (v (u* 4 o| (v (uXoK :o 1 (v+ (t (u *(-(,q/o /4(s*4o| (sXoK   .o 1  (s+  (r**05%(  +%[X4%q4]_b`ҁ4X 3*0;@ ./o  + %X( Ҝ X i2*0;25 (  +#[5%q5]_b`5X 3*0) +ZXcҜZXXҜX i3*06rpo , oK +rpo ,oz Yo| @:o o  5  8o% t/oz -  %X +r.o /%X  ( +Q@.o %X ( b( `%X ( b( `o& :ai.- i YY Y(9 + Xi YY3*n{ { { s9 *0u;,t;*ud, (ys{*uh, thsz*u,t(xs{*uK, (sz*rpo: o; (. r3ps z2o5 (x*~(q} { op} *(q} { s9 } *{ *{ *0ku<,t<*u,4u- u-u6-u-u, ts*rpo: o; (. r3ps zj- rps8 zo5 (~*:(q} *N(qs`} *2{ o *2{ op*0q,u=,t=*uK, tKs*u,&to (( '&rżps8 zrpo: oO (. s8 z*.H 00HO(qo o& &o% (S} o& &o% (} o& &o% (f} o& &o% (S} o& &o% (} ~ } 8o% t< u,Wt o2  E+(m} +*(} +rapo2 5(( s8 zuN, (} ur, (} u$, (S} o& :N*0X(qsU} } } } } } } } }  } *{ *{ *{ *{ *{ *{ *{ *{ *{ *07 { { { { { s] { ,7 { o^{ ,${ o,7 {  o^{ ,7{ o^{ ,!7{ s9 o^{ ,!7{ s9 o^s*0j,u>,t>*uK, tKs*u(,t(opotKs*rpo: o; (. r3ps z:(q} *0s -F{ o+o% ( o &o& -lu.,o' { o+(o% (oo , o &o& -u.,o' *$:\5{ *0B~ ~ ~ r1ps ~ ~ *0+rps ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ r2p(( s ~ r2p(( s ~ r2p(( s ~ r2p(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rýp(( s ~ r˽p(( s ~ rӽp(( s ~ r۽p(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ r p(( s ~ rp(( s ~ rp(( s ~ r#p(( s ~ r+p(( s ~ r3p(( s ~H ~N *( *u@,t@*uK, tKs*r;ps8 zN(qs>} *(qo3ot} *Z{ , { o**027s] { ,7 { o^s*0F,uA,tA*uK, tKs*rpo: o; (. r3ps z0(qo1r;po5(( s8 zo o& &o% t7 u,Jt o2 ,r,po2 5(( s8 z(b } o& &o% t7 (} o& ,no% t7 uK,(} +Lu,(o } +1u,(} +r Zpo: o; (. s8 zo& ,Xo% t7 u,(o } +1u,t} +r Zpo: o; (. s8 zo& ,<o% t7 u, t} *r Zpo: o; (. s8 z*(q} s} , s} } } *07s] { ,7 { s9 o^7 { o^{ ,7 {  o^{ , 7{ so^{ ,7{ o^s*{ *{ *0={ o<  +{ o(~X { o2*0L{ -*{ o  +{ o(X { o2*{ *0~rp(( s ~rp(( s ~rp(( s ~rp(( s ~rp(( s ~rp(( s ~rp(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~r2p(( s ~rp(( s ~rp(( s ~rp(( s ~rp(( s *0F,uB,tB*u, (~s*rpo: o; (. r3ps z:(q} *N(qs} *{ *2{ op*0A,uC,tC*uK, (s*rpo: oO (. s8 z0sU} (q,o- rps8 zo o& &o% (S} o& &o% ({} o& &o% ( o(oG}  +{ o(X o2*sU} (q} } i(*21rӾp5r5p(^ s8 z*{ *{ *0.G7 { { { ss*0F,uD,tD*uK, tKs*r3po: o; rEp(I s8 z0(qo.)o. r;po5(( rps z ou, ~ } +%X oop({} %X oop(o} o1oop(( } **(*(q- ~ } +} } } *{ *2{ (*{ *0|I7s] { ~ o -7 { o^7 { s>opo^{ ,7 {  o^s*V~~0s~ *:( } *2{ oY*J{ o[s*0_,uF,tF*u,tos*u,to5 (*rcpo: o; (. s8 z2o5 (*^(0 iox (*&(*( - r3ps z,(-r{pr3ps z}! *{! *F(0 {! o2 *>(o!*0uF -*{! {! o? *05  +" o{ 0  . ( -  X oz 2**:( }" *2{" oY*J{" o[si*( *B, ~? o &*0o ,v~? o -io~o ,"( oo(rp(. *o~,o ,#( ot(rp(. *oo*0~o ,rp*~o ,rp*~o ,rp*~o ,r)p*~o ,r7p*~o ,rEp*~\ o ,rDOp*~[ o ,rp*~] o ,rXOp*~ o ,r+fp*o*.~0? *( *( - rps zse }@ *2{@ se *0AsL rpoM &rp{@ rp(^ oM &r-poM &o *6((*0kuK,tK*u, ts*u, ts*uz,tz((*rpo: o; (. s8 zr(q- rWps z}A *N(qo}A *0@k(qs o4 oo ioo&}A *{A *2{A s>*J(t(*03(v sopt  rcpo (. s?z*6((* 2~T  cX*~T *0+{X  {Z {E {Z {F {Z {G {Z {I +{5 X1{6 {8 ZX{8 X8{6 ZXZXX1  X ZXh{Y 0f{5 D%qDXhD  2 Y Z %{>   XZX}> ,%{?  ZX XZX}? X =?F -*Y+Y{5 ,{5 D%qDYhD{5 XD%qDXhD{5 D%qDYhD Y  0+q{5 +Z{6 Y%{Y 0@ZX..%{> jZXjYZjZiX}> ZXhY-Y-*0+{X  {Z {E {Z {H }7  =}8  +< Z,){6 %{7 X%}7  %{9  + ZX X 2+g{6 %{7 X%}7 2+X%%  Z{9 %{> Y}> ,%{? ZXY}? {7 2}Y {7 [ +  o, Y /{6  {6 {6 %{7 % Y}7  o,{6 {6 %{8 Y% }8  {6 %{8 Y% }8  Z ZZXh{9 {9  {9 ( XҜ ZXZXh%  {6 %Xo,{7 <{6 %{8 Y%}8 {6 ({5 (*0hD   +YXbh% X 1 +9 ZX,( ZD%qD%XhD(h X 1*0 _` cb Y%0c*          (08@P`p  0@`  0@`05%е(> P 5%ж(> Q 5%з(> R 4%и(> S  4%й(> T  4%к(> U 5%л(> V 5%м(> W *( *>}[ (*0 {[ .{[  }[ *(*{[ .1{[ Ҝ}[ *(*{[ . rps< z _}[ *0! ~o\ ~o] ~o^ ~o_ ~o` ~oa ~\ ob ~[ oc ~] od ~ oe  / ~e ~\ ~] ~^ ~_ ~` ~a ~b ~c  ~d  s f  +  ~f o &X i2*( *:( }g *J{g o(*J{g o(*J{g o(*F, oXo**0P! (5rEp( rp(w ( rp(w (p *( *0"s h r?p rIp(r~p rPp~~~~~(r~p rzp~~~~~(r~p rp ~ ~ ~ ~ ~ (r}p(rhprIp(rp~~(rp~~(rp~~(rpr}+p(rp(r7p  ~ (rp  rIp ~ (r*~p  ~ (r&p  r:p rDp ~  (rZp(rfp(rp  rM+p (rrp(rhp~~(r(prprp(rpr@Sp(rp(rp(rp(rp(rhp~~(rp(r(p(rRp(rp(r&p(r'p(rp(*02:~h o   + ~h o o X i2*n~h (j ok o t/*Foi(*2i(*>o(*0- rY#ps z( -rprJp(I s3z% ,Qr7p(l -)rp(l -%r*~p(l -rhp(l -+sp *sw *s*s*:o(*0 #- rY#ps z( -rprJp(I s3z % 9~: s %r?p( %r~p( %r~p( %r~p( %r}p( %rhp( %rp( %rp( %rp( %r7p ( %rp ( %r*~p ( %rrp ( %rp ( %rhp( %r(p( %rp( %rhp( %rp( %rp( ~ ( 9E,+6to +((o +(o + (o rps z,s*rprJp(I s3zA0 6o(*0<- rY#ps z( -rprJp(I s3z% 9~:s %r?p( %r~p( %r~p( %r~p( %rhp( %rp( %rp( %rp( %rp( %r7p ( %rp ( %r*~p ( %rp ( %rrp ( %rhp( %rhp( ~( 9E &&&.;DQ+X(*(*( s*(*(s*(*(s*(*rprJp(I s3z6(s>*04 o@ *( *0s i ~i ~ orUpo ~i ~ orgpo ~i ~ orpo ~i ~ orpo ~i ~orpo ~i ~orpo ~i ~orpo ~i ~orpo ~i ~orpo ~i r7prpo ~i rpr/po ~i rprGpo ~i r[prspo ~i rprpo ~i rprpo ~i rpr/po ~i ropr/po ~i rpr/po ~i r pr%po ~i rCprpo ~i r(prpo ~i rprpo ~i rprpo ~i r/prCpo ~i rhpr]po ~i rkpr}po ~i rprpo ~i rprpo ~i r&prpo ~i r&prpo ~i rprpo ~i rprpo ~i r1prpo *2o(*0\=(j ok ~i o t/ - r5po ,r5poz oK rpo ,8rpo - rpo , oK +oK ( s*rp(l , ssM*r/p(l , ss*rGp(l , ssM*rsp(l , ss*rp(l , s@sO*r/p(l ,s@s>sP*rp(l - r%p(l , ss*rp(l ,ss>s*rp(l , sXsM*rp(l , sXs*rp(l , shsM*rCp(l , shs*r]p(l , sKsM*r}p(l , sKs*rp(l , ssM*rp(l , ss*rp(l ,s8*rp(l ,s=*rEprJp(I s3zZ~i oo t/*0o 4 o &*( *0s j s k ~j ~orpo ~j ~orOpo ~j ~orpo ~j rprlOpo ~j ~orlOpo ~j rprxOpo ~j ~orxOpo ~j r)prOpo ~j ~orOpo ~j r7prOpo ~j ~orOpo ~j rEprOpo ~j ~orOpo ~j rOprDOpo ~j ~\ orDOpo ~j reprpo ~j ~[ orpo ~j r{prXOpo ~j ~] orXOpo ~j rprLpo ~j ~ or+fpo ~k rp~o ~k rOp~o ~k rp~o ~k rlOp~o ~k rxOp~o ~k rOp~o ~k rOp~o ~k rOp~o ~k rDOp~\ o ~k rp~[ o ~k rXOp~] o ~k r+fp~ o *~j (j ok o t/,~k o t**.~k o *2o( *0$(j ok ~j o t/ - % 9~:s %r+fp( %rp( %rOp( %rp( %rDOp( %rp( %rXOp( %rLp( %rlOp( %rxOp ( %rOp ( %rOp ( %rOp ( %rp ( %rp( ~( 9 E &,28>DJPV+Zsz*s *s[*s*s*st*s*s *s*s*sJ*sn*sD*sV*sR*rprJp(I s3zZ~j oo t/*0o4 o&*( *:( }p *0]%(  4 ҜiҜoo j[ 4 cҜ cҜ cҜ Ҝ o*0i6{o , r~ps< z- rps z(   jXoz jXjX{p s }o {o ({o s*0U6{o , r~ps< z- rps z(   s }o {o ({o s*nob oc od (*{o ,{o o {o o[ }o *:( }q *{q *:(}r *>{r o*04 Ҝo*04 o*J{r o(*2{r o*.rpsxz04 (9 *04 (9 * *(*6i(#*( 4}s }t {s (9 *{s *{t *(e o2(g oo2r3prps z}u *(f o2(g oo2r3prps z}u *{u *0- oY+ (/ *R()(/*R()(/*Z()(/*B(/*Z()(/*0( - rM#ps z- rU<ps zo-rwprM#ps z~io2~ioo1rprU<ps zo2rpr=ps z,/rAprsops z,~io/r}prps z}w }x }y }{ }| }z }} *{w *{x *{y *{z *{{ *{| *{} *0&3*uZ -*(8*{w {w o ,%{x {x o ,{y {y (R**00{w o" {x o" a {y ,{y o" a **rp*0&iY  X+ Xi2*00iY +Y 1, . rpsT ziY*( *2r#p(@*( - rY#ps z(C}~ *0'u,Vt o$,9{~ r#p( ,rp{~ (. rps zo$} o#} +tox . . .+~H +~K +~N + rpsz([ ooooos(} ow} *0({ o+ o{ s o,o/{ o*o { ,{ s*{ s s*{~ { s+{~ { s s*0j(j ok % ,Ar#p(l -Jr#p(l -=r#p(l -0r#p(l -#r#p(l -r#p(. rY#ps z*(d*"(e*rOp*@*0(h{(k{X(k{X(k{X(k{ X(k{(X(k{0X(k{8X(koi@*0(i!ɼg j}!;ʄg}!+rn<}!6_:O}!тRQ}!l>+h}!kAك}!y!~[}*j@5} (o*0@5} ({ } { } { } { } { } { } { } { } { { { i(9 { } *rOp* *0^{ %{ % X}  _bX _b`X _b`X _`{ 3o*dҜXdҜXdҜXҜ*{ 1o{  di{ n_i*0({ (O{ X(O{ X(O{  X(O{ X(O{ X(O{ X(O{ X(Oo *0( g j}  g}  rn<}  :O}  RQ}  h}  ك}  [} }  + { X { i3*0y3 +C{ { Y(Y{ YX{ Y(XX{ YXX ?1{  {  {  { { { { {   8Q(W(TX~  X{  %X XXX(V (UXX(W(TX~  X{  %X XX X (V(UXX (W (TX~  X{  %X XXX (V(UXX(W (TX~  X{  %X XXX (V(UXX(W (TX~  X{  %X XXX(V(UXX (W(TX~  X{  %X XX  X (V(UXX (W(TX~  X{  %X XX X (V (UXX (W(TX~  X{  %X XX X(V (UXX  X  ?%{ X} %{ X} %{  X} %{ X} %{ X} %{ X} %{ X} %{ X} } { (` *&_f_a*2__a_a*vdb` db`ad b`a*rdb` db`adb`a*^db`db`ada*fdb`d b`a da*/BD7q۵[V9Y?^[1$} Ut]rހܛtiGƝ̡ $o,-tJܩ\ڈvRQ>m1'Y GQcg)) '8!.m,M 8STs e jv.,r迢KfpK£Ql$օ5pjl7LwH'4 9JNOʜ[o.htocxxȄnjlPxqb@5%(> *j5} (o*0l5} ({ } { } { } { } { { { i(9 { } *rOp**0^{ %{ % X}  _X _b`X _b`X _b`{ 3o*{ 1o{ n_i{  di*ҜXdҜXdҜXdҜ*0N({ (a{ X(a{ X(a{  X(ao*0V( #Eg}  }  ܺ}  vT2} }  + { X { i3*F_b Y_d`*&_f_`*2__`_`*aa*02{  {  {  {   (eX{ X(d  (eX{ X(d  (eX{ X (d  (eX{ X(d  (eX{ X(d  (eX{ X(d  (eX{ X (d  (eX{ X(d  (eX{ X(d  (eX{  X(d  (eX{  X (d  (eX{  X(d  (eX{  X(d  (eX{  X(d  (eX{ X (d  (eX{ X(d  (fX{ X yZX(d  (fX{ X yZX(d  (fX{ X yZX (d  (fX{  X yZX (d  (fX{ X yZX(d  (fX{ X yZX(d  (fX{  X yZX (d  (fX{  X yZX (d  (fX{ X yZX(d  (fX{ X yZX(d  (fX{  X yZX (d  (fX{ X yZX (d  (fX{ X yZX(d  (fX{ X yZX(d  (fX{  X yZX (d  (fX{ X yZX (d  (gX{ X nX(d  (gX{ X nX (d  (gX{ X nX (d  (gX{  X nX(d  (gX{ X nX(d  (gX{  X nX (d  (gX{ X nX (d  (gX{ X nX(d  (gX{ X nX(d  (gX{  X nX (d  (gX{ X nX (d  (gX{  X nX(d  (gX{ X nX(d  (gX{  X nX (d  (gX{ X nX (d  (gX{ X nX(d %{ X} %{ X} %{ X} %{  X} } +{ X{ i3*(P *"(Q *&(R *N(oC } *b((3 o2 } *j(3 { { iox *B { o *0`)(s s +o &o% -oU }  +{   oT t X { i3*:(} *{ *07sB  +{ oX { i3oF o *0 ^i4  + ҜX i3**(*>(t(*0/*{i5  +{ _X i3*6((y*0Cud,td*uK, tKs{*rpo: o; (. r3ps z:(q} *0+(qo1r;po5(( s8 z ou-X o(}  +[o(-  o2 -( } +3o2 3(~} +r,po2 5(( s8 zX o3*{ *{ *{ *0~I7s] { ,7 { o^{ ,7 { s9 o^{ ,7 { s9  o^s*fsUs8 } ( *"} *"} *"} *"} *6s} *"} *6s} *"} *"} *0&{ ,0{ ,({ , { ,{ ,{ ,{ - r9ps< z7 { { { 7 { { s{ { ss` *0Cuf,tf*u, ts*rpo: o; (. r3ps z0T,(qo2  E+(m} *(m} *rpo2 5(( s8 z:s8 (*{ *{ *{ ,{ s9 *{ s9 *0F,uh,th*uK, tKs*rpo: o; (. r3ps z6((*N(qs} *:(q} *0=-{ o:  +{ o(lX { o3*{ *0Z.sL ~I  ( rpoM &oM & +"r'poM & oN &oM & X i3o *6((*0Cui,ti*uK, tKs*rpo: o; (. r3ps zV(q} } *0I(qo.rEprps zo({} o(o} *{ *{ *0%G7 { { s>s*0F,uj,tj*uK, tKs*rpo: o; (. r3ps z0/(qo.)o. r;po5(( rps zo +Xo% (-  o2 -(} +3o2 3(} +r,po2 5(( s8 zo& -u. , o' *?dV(q} } *0]Q7s] { ,7 { s8 o^{ ,7 { s8 o^s*{ *{ *(ot<} ot<} *{ *0 G7 { { s*0F,ul,tl*uK, tKs*rpo: o; (. r3ps z00(qo2 o1r;po5(( s8 zo 8o% (-  o2  YE%+N(o } +U(} +Fo5  u,(l} +)( } +r,po2 5(( s8 zo& :c*(q} } } } *(q} } } } *{ *{ *{ *{ *0P7s] { ,$7 { ss9 o^{ ,7 { s9 o^{ , 7 { s9  o^+!7{ s9 o^s*j(qsUs9 } *0W1(qoz 1 rps8 zs , s +7 ~ s s9 } *V(qs9 } *0F,um,tm*u, ts*rpo: o; (. r3ps z(qo2 1r,po2 5(( s8 z} *{ *2{ o2 *0)2{ o2  3{ (ToXo**02{ o2  3 { (**02{ o2  3 { (**0F,uo,to*uK, tKs*rpo: o; (. r3ps z0g(q- rps zo. r;po5(( rps zoopt} oop} *(q- reps z- rps z} op} *{ *{ *0 G7 { { s*0F,up,tp*uK, tKs*rpo: o; (. r3ps z03(q- rps zo +ho% t o5  o2  E+*( } +,(S} +(} +rprps zo& -u.,o' *tr(q} } } *{ *{ *{ *0I7s] { ,#7 { ops9 o^{ ,#7 { ops9 o^{ ,#7 { ops9  o^s*0F,uq,tq*uK, tKs*r%po: o; (. r3ps z0XZ(q- rps zo +o% t7 op(&o& -u. ,o' } *$?(q- rps zs} *0H(q- rps zp( (~-rprps z(\s} *0B4{ op  +{ oop(X { o2*{ *0_,ur,tr*u,tos*u,to5 (*rcpo: o; (. s8 z>-~ *~ *2o5 (*B(} *b(-+ } *6{ *04 { o!*05ur -*(o*0 ( (7 *R(-rp*rp*^s s *6((*0F,us,ts*uK, tKs*r po: oO (. r3ps z:(q} *N(q(8} *{ * *v{ , { op*s9 *0R6sB o$ + o% t o ioE o& - u.,o' oF * *7"(>*R((>} *"(?*6op(?*{3*{ - (oS *{ o$ *(*07  s +G{3-9{3X--YX4 {3  i(9  s>o &X X X{3i2{3iY4{3i(9 s>o &*08u- uS9$oD  oD { ,C{ o$ +o% t o'o& -gu.,o'  +C{3i X(/ Y4 {3  i(9  s>o' X {3i2oD oD *(@*;!\(*"(*&(*b(oH t} *09([ } *&{ *"(*&{ i*&{ i*2{ i*:(#} *F{ o s" *06:{ o  o-*o3o(vs9*sY*F{ o o*{ o ,{ o os**2{ o *(*:(#} *6s(*6s(*0H;(#o#(U } . rapoJ (. s) z rapoJ (. s) z*+010"{ oX ok rWps z* 0v{ oX oG oXoX*Z{ oX oH (l*0A<{ oX oI  o  +o(s>X i3*Z{ oX oJ (*(*( -*{ oY ooo*( -*{ oY oo*0y=s { oY o ,]o+3o% t7 s ok(o & rp s zo& -u.,o' *1J "@b0'( -*( >( o! t*07( -*rp(. (s( r3ps z* ( J{ oY *0g( - rpsz(( oK{ oX ok ioM(oO  rgp(( s z *?R2{ ok*0*o oo - rps8 z(*ooo - rps8 z(*0t>oo( o oo Y +Bo  o, o, o +o + o,o Y /*( *rep*0s,Pu,t o8 } o9 + s } u- r)pszt} *uY- r}psztY} *0?i4  +iYYX i3s { og  oo{ s oo/ o oo ooo{ to|oo oo*0@i4  +iYYX i3s { og  o2 oo0*o2 oo0* o~io ooo oo ooo oo o oo{ tYo( ooo oo ooo *( *rooY(v} *V((} *{ *{ *0@f- rm#ps z( -r$prm#ps zooos*.(*0N( - rM#ps z- rQ#ps z- rU<ps z} } } } *{ *{ *{ *{ *0A3*u| -*("*{ { o ,%{ { o ,{ { o **{ o" { o" a{ o" a*( o.rxQp5rEp(^ s8 z} *Z{ orp(. **0B} } } - { X+ 4} u,Et oN } oM } oL  . rps8 zoK } +@u,-t o} } ot} + r#ps8 z{ , { i/ reps8 z{ - 4} { { o4 { ~  o& s} { (2} { i 344} { { { i(9 { +F{ (2{ iZj(o!{ (5(6} { } { (} } j} *2{ (*{ ,{ X{ X*{ X{ Y*>{ X[Z**(-*0$%  +XX(-X X 3*0m{ %{ % X} { { i3B{ (1{ -{ { (9 { iY} **0VC{  { -{ / rpsT z{ Y 1!4 { (9 (1{ iZj(@o{ jZ(o { o!{ (5} 4 { {  o&{  so!(6{ ,(} { Xi(9 iX+D{ 4} { { { (9 { (- rpsT z(0*"(0*0^{ } { (} } j} { ,{ { i(` ,} { o*00{ (44 { { o&{ ,H~ Y(9 Y +$4%q4aҁ4XY /(3+5Y +$4%q4aҁ4XY /(3%{ jX} *0TD~g  +B4 iY(/  (9 so!{ (5 X i2*0DEi14 (9 s { o!{ (5} *0$ +X _ ,*Y  /*0MF~g   +7Yo,o! o o , ~ o! X  2*0,z( i/4 iiYi(9  *4 rpsx( *                                 0H}  4%(> } ( 4} 4} } *03*i . rps8 z5  +Z(?X 3*0G(E4} u,=t o{ oA o,Voto(9} *u,to(9} *rUpo: o; (. s8 z*rp* *0dX { _ { c_XbX {  c_XbX { 0 c_X bX { @c_XbX { Pc_XbX { `c_XbX { pc_XbX  b d  `*0W2(? X(?  +&+ (=a  X2 X 2(@X(@*Xbj n_iXb _XXb _X _X*XcҜXcҜXcҜҜ*02^iY4 i(9  +aҜX i3*0^{ { i3d{ i4 { { i(9 { , } +{ { (A { { (>} { %{ % X} *0t/ r$ps8 z{ Y >{ { (9 { i4 { { i(9 { , } +{ { (A { { (>} YX+-{ (A { { (>YX0{ { (9 %{ X} *0^+{ %{ % X} { 2{ i4 { { i(9 { , } +{ { (A { { (>{ { i[Y(9 (E*{ { i(` } } *&(*>(  } *rp* *"~ Z*0THK( o -rpo: o (. s8 ztK } oa } o(N*{ - (P*(O**0AIi~ YX~ [K  +4~ [K%qK _j~ ]Z?_bXKX i3{ XZK} { ~  +{ { Y~ XX { i2i{ i1iZ + { iZ jj+f{ { XXj(Q%  XXX(Q%  X{ i]Xi]X 2*0 (S{ X ~ X(S{ X  +2a(Q{ ZX a(Q{ ZXX X { 1(T~ X(T~ Z*0 (S ~ X(S {  +2{ ZXY(Ra { ZY(Ra Y /{ Y(T{ Y~ X(T~ Z*~ Yj_i?_b~ j~ Yj_Yi?_d`*~ Yj_i?_d~ j~ Yj_Yi?_b`*0(j ~ Y +bX _jX Y /*0 +XҜdX ~ 2*@ ~ [ !k*bQ᷀ !|Jy7 *4}K} ( (g*04}K} ( {}{}{}{ { { i(9 { } {{{i(9 {}{}*rp**@*0{ %{ % X} X _j8bX _j0b`X _j(b`X _j b`X _jb`X _jb`X _jb` _n`{ { i3(b}*0F{%{% X}{{i3 {([%{jX}*0b+(\XY{,'0+!([XY%{jX}0+(\XY0*0%{a}%{~ {i _~{ci _a~{ ci _a~{0ci _aY}%{~{ci _~{ci _a~{(ci _a~ {8ci _aX}%{Z}*0%{a}%{~ {i _~{ci _a~{ ci _a~{0ci _aY}%{~{ci _~{ci _a~{(ci _a~ {8ci _aX}%{Z}*0%{a}%{~ {i _~{ci _a~{ ci _a~{0ci _aY}%{~{ci _~{ci _a~{(ci _a~ {8ci _aX}%{Z}*0I{ K%qK{ !aYK{ K%qK{ aK{ K%qK{ XK{ K%qK{ { fbaYK{ K%qK{ aK{ K%qK{ XK{ K%qK{ { fdaYK{ K%qK{ aK{ K%qK{ XK{ K%qK{ { fbaYK{ K%qK{ aK{ K%qK{ XK{ K%qK{ { fdaYK{ K%qK{ aK{ K%qK{ XK{ K%qK{ !ͫgE#aYK*0J{ { { { j(^{ j(_{ j(`{ j(^{ j(_{ j(`{ j(^{ j(_(a{ j(`{ j(^{ j(_{ j(`{ j(^{ j(_{ j(`{ j(^(a{  j(_{  j(`{  j(^{  j(_{  j(`{  j(^{  j(_{  j(`%{a}%{Y}%{X}}  +{  j X { i3*0KX8cҜX0cҜX(cҜX cҜXcҜXcҜXcҜҜ**{ *0/6{b (\+(\{-(d(b*(e{(c{X(c{X(c(g*0}%!ͫgE#}!2Tv}!ô}}  +{ jX { i3} + {X {i3j}*^ |CKB [r:mx)pɡsuÃ*k2dpX>Fq\SiA|ލTL MojZ#/W!aroHKAR&GYyŅOKov}RB6c07'hinŴ=vv}BƜ\dB3$x8}.<4k_ `Tr_lOۤ"YqigEeR `yNH-;SvlS{5mW7zzfPq5JBt j$%/9w*윴s/8Q?V(CXE\=i_׶3Dɱ&<"+; 1TYe@ϣ&N5# +Nuc5՝F@@L:z.j>j?k`(Fn=e*"bG U]*逸 ĆQÄ|mXS(v^,&Ґ˔u*d>߯X#(ѧ0Qo,FN*q|3{>9enmty)3q]8[duH|g{|1=K#lMIXq&8cMGbsFE`U4ΏٔʺHhow0$cdn+}3%(pKBk,m ˁ7=ofCUQǀ1+/ߺ2h\V=Uk_夿κ A2]Ds4Z𖦼l(e$JR.Q ZUםNy%3>[) TsG~A4$)mS}598`}Ggvݪ닓bzy )'a1bM\E΄^!b 3䓂,,, ZG ϣYDRv$ը&]> 9jUKcGl:zݞfƞQ#IѢWqE}"LA2_.n:\^au{)6ë/@L] ߥHً>~?WӠEt%.Ѣ^RfIzhΐ .;_t ֳw7Bn~fϪM5x+J(-gO ]sQ&" aV/8Z0UNb'6%1Fp{eO9޲CT0?# <oWLF27e|~YhDYa[Դ/vwЮ[P=L^uhߴ"N!.S*  92P47Mr B #iĈF[xi$L{5!{@ξXf+.'ް%A&6wK{d91X$6-܋hV<`Q6ҊY'_ g˩ CJˡ6pKVxR?JywPP8c:xgzbP?wIDJy;k D-T,C<\fg7+a#'y'V%ჾI~!e|HmkE4Sݚj" "VnP]7X<±Oju}ns%l:E0ir-JC81gx;2r;t'6cRN 3_P̢ͥ0-tISmW-(AHfַ2wI:ltac~ؕ=d;+ H 0zx`8!Z|"i `geי'~uĒn-; e.oJQ=7* O)\> S^PEϠ4ʇQ~ 6Qij84̉WY?ŕ"=T3*fv{A6SA%w".F_lHnTܯƿ1ٷ*'ק@ż mV mxty*x%5ӛ ]8Apq \bOХ kT+bY}E575r^ 2`+/g,y,d$ѭ &j PKjxZCLc6"fJG{ªsjXzf&ʑvVguH\?[mtn(QDG4^.a箠,@eQ d3Knrb);p01FlK~Ód}w!{sk.1cwoHRScLR\jd]hj,Q:`V8b~6ױwYntslRKsZsU?IEA0SY GX2F_ -6+ e}O`n$,x⊚ȶ*{r'GM! ~GpVCouIhZaBԭzNUPߡ*V/:&֏ M:Ju=ʙ<{G-qSph^(\7 ŀe7C(PMo@v;0 ,7iCfεN!fsۋa MWֺ)}[%>a?- yW;5axԫ&}r>kc0JJ շj?&WB-=r`yI3ABrƜ6| %45IN)N$PF̊cc/xEz]|5FcNd[-szB&%!PQlH9ע˴], u|al[ؕ+i`2A_hBVݹHҤoI/ 1X#,Ҧ۪jWk ]'Ky+[;D19Y2-K ktǁ0uÔ {Ìg9)/B|vK$g=fW Xg zɢWl{կOkbLߔ:H[7/;˨#)}uD͟&ѽ(9fJ!|z)ZvtR΃DR?[Z ZC3 <$Fn/a7ZeLkJCkyboMT̺l>%O%.8ދֆTvJ]E+0Mp<1m>GߟÍ~R8B@KD~Zds;_uU%~Nt/SqX0Nvbn=oY&YŨ=)eLMn3_'G?3@ k9,4%CRb~ZaUfo ,Ӓ-ZEtGI򺞣3cbTn@&T;jV+ --n k R: ˜BYE1b6sHk zW jDgFux)hO">q";.W0/?|ìFϟ `.3:HajnBب\stJRsIgӛ $~D6 elyC}ɹ( toVaG{_[zox0cjz ЛJK+N>Vj4Y7(L0 5q9zhzi5B-(vyzݥ7] 9XF:rTǜ&=2|,#dvBG$U8VvG-g^(M1+De|Ǒ+6,UFN{_\ECaS[^Ԩ!b*WAӼC%ƤDbee3 !HT!cm^>į wr:r {N>U!ʦ`Pö~h^DZl7<=*.ծx`.b㣆=Q9&5*n} 3WؗbY簍!)~)UE:pl+B%kY̔VT"s `<=Ė[Ŝ4U!8xj$Ph)#ly|Sܰ(᪮)K=I:וhA,kߵ7-%]X p*7\?QMR[%Q<4)@<]o[t>BY/yP'7`} Z^#ӐmHV{2Pn!5η6JK$z*'iUL7%K]ەK/iӒ fJFi shI_fdD}'u\ak̕뼹 OgYeu#1oE>qZWTa@`ĺoLEidIAp[&;ӞW`mU<2&`[YFL|EU)YQe¯5v E=~ R{YSVH Co\z^N5o>֜" i t F@ln:$IpX=$ac2D}Š٫[KZIm-O5ԓ@eKڿ* |$|2šn f6fi}!å}':Ք"dۉaļ3=jL꛹\BTKqjj{"̨1+G8$_FXH y(As w!E\pkz8Pdo`v b]0ZT_"2[GhO- +ٹyC- SH~;/Gxs Ba 9.*+e9"`%n&0qv>e&p61ɱtP\YpB Jyl%Y Nthlqg0sw a/Zۻajg>Q郞Krd \ 7uӱ4]% 354BЯ~P*5DėЙ I{ADŷ;&lj/u,@rٕT*=r/UBxN31,b|O ]f/US]'?A@lFY ߒ7?^.7Ἥ)1\D>AxҠxLɥ(w(.A9,ɯ^&%j w¼m:7[gJЙTҿ4R}do[at>'ܬ@aW7ZwibRV=F:dnC?Ȟ~0w'LH3,/CoݧGf`Dzd7%rvpN-=C CO#"m9< 6i"6^Lxк8FR8z38NJtHJgͭlǟ 43 N_#Y)_&J4n*:8EW, k/xuoybZS){Bt#tv+`St£vKcj<ɼEm>!GM'}Q)?Pskkhc;=ۡUVK\n5QNh>hKOR?6Fn^PqЙq<N eZ.hV^]zy#q{᝹.#E3!RפYr|V8u=c髍59r ޷-IbAUk[M.m~īW?5ΐViWs9BJ# (PzM4Q1X{"d;1ջ_ܠEce&(Q?`]IP@Mvpl+UA6Zp D`OuM(CVeP_Sב% r#2cso90i K%(>  K%(>  K%(>  K%(> *:( } *{ *r( - r+ps z}*PGP4%(> }({oE *B {o *0x1 4A +~AYҜX Z1a +~aYXҜX z10 +~0Y4XҜX 91~+>~/?*0d/ r;ps z=3/~ _ ~ _ bc` _*=3<~ ~ ~ bc` _bc` _*~ ~ ~ ~ bc` _bc` _b ` _*&(s*0]}5}}sp}}s }(}},(t&}*0oK}  s }{, +(-3,  . 3 + {o % /9rpss {9 -ot &8 3 3,  . ;, .z .  .1 3, o o oz 2T{o & o  . . ot &+ .  . 3 {o % <_, {o &{oU 1{oT t/}rRp{o? }}*{*{*0IL{oU 0*{oU Y/  +{XoT t/X i3*0{o  . .*0"{o  . . . .*0{o  . 3{  . }+`{,B-3={o -3}}}+ {o }+ .{  .}} *0/M X +(z . %X Ҝ2 3 zY* " 00\1{0 {9/(x  . @(y =@(x(x(x(x{(q}{, rps) z}{ _b{ _b`{ _` {os. rps) zo *-3F+  . .{o % /{- rps) z}}}*/*(x(x(x{(q}{%{% X}*0M{,!{,(t&{ot}{,(z*(| {oq*0oM{,1{,(t&}{, ({* X + (| {oq. %X Ҝ2 3 zY*6,b 0J{oV (*0rIps%rmps&rps'rps(rps)rps*r9ps+r]ps,~,rp(( s-~,rp(( s.~,rp(( s/~,rp(( s0rps1~1rvp(( s2~2rp(( s3~2rp(( s4~2rp(( s5~2rp(( s6~2rp(( s7~2rp(( s8~2rp(( s9~2r2p(( s:~2r2p(( s;~2r2p(( s<~2r2p(( s=~2r2p(( s>~2r2p(( s?~2r2p(( s@~2r2p(( sA~2rp(( sB~2rp(( sC~2rp(( sD~2rp(( sE~2rp(( sF~1rp(( sG~Grp(( sH~Grp(( sI~Grp(( sJ~Grp(( sK~Grp(( sL~Grp(( sM~Grp(( sNrpsOrpsPrpsQrpsR~Rrp(( sS~Rrp(( sT~Rrp(( sUrpsV~Vrp(( sW~Vrp(( sX~Vrp(( sY~Vrp(( sZ~Vrp(( s[~Vrp(( s\~Vrp(( s]~Vr2p(( s^*( *0#N(qou$,ot$oX~ho - r9ps8 z ou ,ot  +#otKsO otKs o}`ou,otoZ }a+"{`otsY (Z }aot$oX}bo}do3ot$oX}c*~h}c*B~h(*6(*0}(q}`}a}b}c}du,tosM }_*u,*t oooosN }_*{`*{a*{b*{c*{d*0Q7 sU{_{`{ds{asX {bsVs] {c~ho -7 {csVo^s*2o5 (*(q- rps zu-u- rps8 z}e*0[(qr3p(y ra3p(. o| (  2 1 s}e*oK s }e*0Wu,t*u, ts*u, ts*rpo: o; (. r3ps z{eu,{eto *{eto*0L{eu,{eto  *{eto  r2poJ (. s< z*33E{e*(*0Cu,t*uK, tKs*rpo: o; (. r3ps z:(q}f*0=O{fo  +{fo(X {fo2*N(qs}f*6s(*{f*"(*~rupshrpsi*"(*0Cu,t*uK, tKs*rpo: o; (. r3ps zr(q}j}k}l*0a(qo.r;po5(( s8 zo(<}jo({}ko(}l*{j*{k*{l*0)G7 {j{k{ls*( *0.P( s + (R( o#% -oV *0Cu,t*uK, tKs*r1po: oO (. r3ps z(q}m}n}o}p}q}r}s*0(qo o& &o% t$}mo& &o% (}no& &o% ({}oo& &o% u,,t(}po& &o% ({}q+}p({}qo& &o% (}ro& ,o% t(}s*}s*{m*{n*{p*{o*{r*{q*{s*0P7 {m{n{os] {p,7 {ps9 o^7 {q {r o^{s,!7{ss9 o^s*0F,u,t*uK, tKs*r1po: oO (. r3ps z(q~x}t~y}u~z}v~{}w*(q}t}u}v}w*0(q~x}t~y}u~z}v~{}w +wot o2  E /+<(z}t+8(z}u+)(T}v+(T}w+ r'1ps8 zX o3*{t*{u*{v*{w*0P7s] {t~xo -7 {ts9 o^{u~yo -7 {us9 o^{v~zo -7 {vs9  o^{w~{o -!7{ws9 o^s*0@~~0s~x~~xs~ysUzsU{*6((*0F,u,t*uK, tKs*rpo: o; (. r3ps z*(*(q- rO6ps8 z- rps8 z}|}}}~*0L(qo({}|ot}}o3ot(}~*{|*{}*{~*0MQ7 {|{}s] {~,7 {~s9 o^s*0Zrpsrpsr+psrWpsrpsrpsrpsrpsr1psr_psrpsrpsrpsr'psr[psrpsrpsrpsr+psr_psrpsrpsrps*( *0F,u,t*u, ts*rpo: o; rEp(I s8 z:(q}*6s>(*{*{*0F,u,t*uK, tKs*rpo: o; (. r3ps z0~(q- rps zo2 o1 r;po5(( rps zoop(}o1oop(}*&(*(q- rps z}}*{*{*0GQ7 {ops] {,7 {opo^s*0F,u,t*uK, tKs*rpo: o; (. r3ps z0~(q- rps zo2 o1 r;po5(( rps zoopt}o1ooptK}*&(*(q- rips z},}*{*{*0=Q7 {s] {,7 {o^s*:( }*2{oY*F{o[s*( *0s s  rpsrpsrpss rpsropsr pss rwpsrpsrpss~~ ~o ~~ ~o ~~ ~o ~rp~ o ~r p~ o ~rRp~ o *F~o t*B~o s*0'~o t ,~o t**F~o t*( *0Qs s s rps r)ps rpsrgpss ~hropsos& ~~  o rps r)ps rpsrgpss ~hropsos& ~~  o r ps rps rFpsrpss ~hrpsos& ~~  o rps rps rWpsrpss ~grpsos& ~~  o rps rps rWpsrpss ~grpsos& ~~  o ~rp~ o ~rp~ o ~r p~ o ~r?p~ o ~r{p~ o ~~ rpo ~~ rpo ~~ r po ~~ r?po ~~ r{po *F~o t*B~o s*0'~o t ,~o t**F~o t/*F~o t*(qsU}}}*(qsU}}}}*0(qot$}ou,=ot(z}o({}ot}*o({}ot}*6((*0A,u,t*uK, tKs*rpo: o; (. s8 z{*{*{*{*0dI7 {s] {,7 {s9 o^7 { { o^s*vs}( s& }*^s& }{o{*J{{o' *^{{(xo, *J{sVo* *J{so- *J{so. * 0E}(} &r 6ps8 z{(}{{o+ * ^{op(lo) *.rp(QzR{so|*R{so}*&(*0R{o~-{{oo0 {o1  7s] 7{o^7{{(so^s(sy rpsz *Z@ (*0ko#tK o1Jou,<o~o ,)ot((o}(*(sy*0i{,_+J{%{% X}o u,%to2 3t((sy*{{o2*0~oX , (sy**:s (*:s (*0S- rps zo -rprps z{-}}}+{.}}}{,.{{o. ( Z}} Hs o / 2o0. ( s( o s<z *cq 0Ts +o &(% -*Br^psV*( *F, otw**( *( o}o}o}*{*"}*2{( *6( }*2{( *6( }*0n- r3ps zu -*{,{o -*{,{oqo-*{,{oro-**s *0)Uo ((_  oe  r_psz* 0)Uo ((_  oh  rpsz* 0)Vo~(( o r_ps:z* ( *2o(*0~so" (*0~ro" (*0PWs 9B(( o8o% t: s on5o &onE ///aH+x ooopo &+ oo( o o &+f ooto o &+M oo(oo &+4 oo(oo &+r,pon5(( s) z o &o& :u.,o' oJ s?z*A4 ( 3?( *0s s ~~orpo ~~orpo ~~orpo ~rprpo ~r prpo ~r!prpo ~rEprpo ~raprpo ~rprpo ~rprpo ~~orpo ~~orpo ~~orpo ~rprpo ~r prpo ~r'prpo ~~orQpo ~~orQpo ~~orQpo ~r{prQpo ~rprQpo ~rprQpo ~~orpo ~~orpo ~~orpo ~rprpo ~r#prpo ~r?prpo ~riprpo ~rprpo ~rprpo ~~orpo ~~orpo ~~orpo ~~orpo ~rM+prpo ~r}+pr1po ~r(prpo ~rEprpo ~rprpo ~rUprpo ~~orpo ~rprpo ~~orpo ~r pr1po ~~or1po ~r]prpo ~~orpo ~rprpo ~r/prpo ~~orpo ~reprpo ~rprpo ~~orpo ~rprIpo ~~orIpo ~rprpo ~~orpo ~rpr'po ~rcpr'po ~rprpo ~rprpo ~r]prpo ~rprpo ~rpr[po ~rprpo ~r#prgpo ~r:pr&po ~rDpr&po ~~ orpo ~r@Sprpo ~~orpo ~~orpo ~~orpo ~~orpo *( *0CH- rKops z(j ok ~o t/ ,~o t*.~o *2o($*0> X- rY#ps z(j ok ~o t/ , rip(l ,sN +r.p(l ,sL , sssss s:*r?po 9%9~~:s %rp( %rp( %rIp( %rp( %r'p( %rp( %rp( %r[p( %rp( %rgp ( %rGp ( %rp ( %rp ( %r1p ( %rp( ~( 9E"""""""""2B+Psss*sKss*sbss*sss*sKss*@/o  %9m~:s %r?p( %rp( %r}p( %rhp( %rp( %rp( %r7p( %rp( %rpp( %r&p ( %rZp ( %rfp ( %rp ( %rrp ( %rp( %rp( %rhp( %rp( %rp( %rp( %rp( %r8p( %rp( %rhp( %rp( %r(p( %rRp( %rp( %r&p( %r'p( %rp( ~( 9E'2=HS^ju )8,sb 87sf8+s 8 s  8s 8 sT 8s 8s 8sa8s 8sK8s8sh 8s? 8sf8sK 8s 8sG +zs +rss +js7+as+XsZ +Ps/ +HsX +@s +8s^  +0sJ+'sM+s +rprJp(I s3z,i1 r)ps8 zs-* i>q, rps8 z%9A~:"s %rp( %r0p( %rpp( %rp( %rp( %r)p( %rMp( %rop( %rp( %rp ( %rp ( %rp ( %rp ( %rp ( %rSp( %rp( %rp( %rp( %r;p( %rwp( %rp( %rp( %r'p( %rcp( %rop( %rp( %rp( %rp( %rp( %rp( %rp( %rp( %r p ( %r!p!( ~( 9aE" %%33ATTggww88s8s>8sb8sx 8ssy 8ssy 8ssy +qsJsy +asnsy +QsDsy +As+6s +-+(sI+s+rprJp(I s3zr0p i>2  (&  / +   o|   %9~:s %r0p( %r|p( %rAp( %rV}p( %rKp( %r^}p( %rSp( %r[p( %rcp( %rkp ( %rsp ( %rf}p ( %r}p ( %rp ( ~( 9EKWfpz8 s 8 st 8 2  oK ( + oZ  s+ 8 s 8 s 8 s +z s$ +p sj +g 2  oK ( + oZ s0 += s  +4 o/ rps8 z s +rprJp(I s3z ,;, rps3z, i1r0p( , rps3z s* ,2, s+*, o, s*, s* s*,s*rprJp(I s3zZ~oo t/*0# +o{ ( ,*X oz 2*:( }*0. +{o3 {*X {i3*:((*0N/s  +#{o3{o &X {i3~( o! t *0-Y(* i  +tX i2*0Z(( , to# *j*:((*0"Z(( - rbpsztoV*0Z(( , to*j*0Z (( , tdo *j*0Z(( , tcow**0Z (( , tcow**0Z(( , tcow**0Z(( , txo**0Z(( , to**0[((tc ,o **0i\  +{o,X X {i3   +'{ o,%X { o X {i3*&{i*&{i*{*0N~}~}( }}(( }((}**(=*0T}}o , os5  {oK rpsz{o}*&4 uf{3(?*(A* 3(@+ 3{ .(@+(A}*F (A (A*f{oL{o*2i(C*0@%{3X  + (?X 3*{oM{o*^,o:+~}*^,o:+~}*{{{{oss *0 ,]{ { {(M-( sU(N {(M-){(M-{os" (N  sB +oXi3oF iXs oD {oD {oD {oD icoD ioD ioE oF rpsz{  ioM{  io4Ҝ  icҜ icҜ icҜ iҜ {  ioM{  io{oN {(  4   {. {+  -  (+ ( {{o{{  ss*k 0~(P ( (O(G*0Y{(PsB oD +  oX i2 oF (O rpsz(G*>E 0V(P(P(G*:(P(G*0{o/ r{psz* 00 +o3*X i3*0^iX~ oA *0?4 ҜicҜicҜicҜiҜ(B(B*06z(L 4  icҜiҜ(B(B*2~*>(}*0`_ YE . .+r@p($ 3rp($ &rp(( sz z rpsz*NNNQ 09%  + _X X iY3iYc3 iY**2{o*0 (X *0e`(X (  { ub, rp(. + rp(. ($ zrpsz- { oh*iY(o 4so{ ohs1(? } { ub,6{ s} ((  {  s} { i(i/ r ps z{ o  { o   2 / r ps z{   z rR p sz*40C0HfNfS0Ba{o(S oo r psz{o {o.{o3oo&8ot ok ooX[oiY2o&+e4o&o&oiY2o&+e4o&o&o  r p sz (T- r psz * u (7*:os[*( / r6 ps8 z}}*~( {}{}*j{{. rj ps8 z*/ r6 ps8 z{3*{{Yos[*(]{{o{s[*{{oo{s[*^{o{s[*6oa(_*{{oo{s[*(]{{o{{Xs[*b{o{s[*01(]{{o {o{s[*b{o{s[*b{o{s[*f(]{{o*b{{oo*J{{o*0$b~hs[ {o^(_ok*2(ko*2(ko*{*0c{- {o *(k {{oo {o/~h{oo o3~go - ~ho o {@ ooz {Y+ 0X2+ Xo{ X2 s_  ss   rEpoM &  oM & o *06b3*u -*{{o ,{{**N{o" {a*0A4}( - rMps zo.r prMps z}*:{o*2{o*{{{{o&{*08Xi1 r1 psjz +{XXo&X 3*2{o*( - rIps zoH t}}*F{oH t*{*0d3*u -*(}*{{3{{(**0{ (6 {(a*u, t}*~owox sy}*0 e{oxX[  Y [ {oz {ows o~ho -{o{o,~hoo~ho , {ows ooo 2o~ho -{o{o,~hoo~ho ,o o{ox. o 8jo/  ~ho~hooo o  o  os   ss*F j(*( *:(d}*0^{o4 {{{io{{{io{o& +"{io{o&X {2*"oo*0?[{o1r p5r p(^ s8 z( (*0O[[X{o1r pX5r p(^ s8 z( ss*0R[[X{o1r pX5r p(^ s8 z( ( s*0>[{o1r p5r p(^ s8 z( s*0zfu -r prps zo ,i. r ps8 zou -ra prps zo}}{{(*r p*0$(, r psKz{-O{{({5%q5X5{-{ 5%q5X5{{a {X?_}*0{-(rp(. s< zXi1 r{psjzXi1 rpsjz(, r psKz 8{-O{{({5%q5X5{-{ 5%q5X5X{{XaҜ{X?_}X ?r*N{{(*0x}}}( {{({{({{({{ ({i 3 ~  +~ { {({ {X({ {X({{ X({({({ ({ ({{({{({{ % }*0d{i(9  8F{5%q5{{ X(a5{5%q5{{X (a5{ 5%q5{{X (a5{5%q5{ {X(a5{ 5%q5{{X(a5{ 5%q5{ {X (a5{5%q5{ { X (a5{5%q5{{ X(a5{5%q5{ {X(a5{5%q5{{ X (a5{5%q5{{X (a5{ 5%q5{{X(a5{5%q5{{ X(a5{5%q5{{X (a5{ 5%q5{{X (a5{5%q5{ {X(a5{5%q5{{X(a5{5%q5{{X (a5{5%q5{{X (a5{5%q5{{X(a5{5%q5{{X(a5{5%q5{{X (a5{5%q5{{X (a5{5%q5{{X(a5{ 5%q5{ { X(a5{5%q5{ { X (a5{ 5%q5{{ X (a5{ 5%q5{ {X(a5{ 5%q5{{X(a5{ 5%q5{ {X (a5{5%q5{ { X (a5{5%q5{{ X(a5X  ?  +{X(&X X 2 +{ (&X X {i2*ҜXcҜXcҜXcҜ*>_be_d`* _X _b`X _b`Xb`*Z}}}*0L%{X}{-4%{X}{-%{X}{ _**0f{2%{X}+K%{X}{24%{X}{-%{X}{ _**(0 rU po2 (0 rw po2 *5}5}@4}( *                                                                                                                                                                                                          0M 4%(>  4%(>  4%(>  4%(>  4%(>  4%(>  4%(> s ~r p~o ~r p~o ~r p~o ~r p~o ~r p~o ~r p~o ~r<p~o *                               4%(> }( *0Gu,Ht o{oi(9 o,Zoto(}*u,to(}*rUpo: o; (. s8 z*r p* * *0M{- r ps< zXi1 r{psjzXi1 rpsjz{(**0:*}i . rps8 z5  +Z(X 3*0dX {_ {c_XbX { c_XbX {0 c_X bX {@c_XbX {Pc_XbX {`c_XbX {pc_XbX  b d  `*0( X( {,V +*+ (a  X2 X 2+ (a  Y0+]+ (a  X2+1 +!3 ,  (a   Y  /X2(a (X(*Xbj n_iXb _XXb _X _X*XcҜXcҜXcҜҜ*05~(j ok o t - r+ps8 zoH t*{*u-rpo: o (. s8 zto(}*r7p* * *0L{- r*ps< zXi1 r{psjzXi1 rpsjz{(**0g 5 86 86  +(~  d~__ X 828,b+ YbX% +. ~X/  +  Y X  2 +. ~X8/  +  Y X  82 +Y~ ,5%q5~ `5~ X,5%q5~ `5 X  2X? +p   X  _b _ b` _ d` _d` X _ b ?_b` _d`?_` X   3*02 _b X _b` X _b` X _` X _b X _b` X _b` X _` dnjai _ a ba dnjai _ a ba dnjai 3333_ a ba dnjai _ a ba bd_`_ a _ a a bd_`_  8\bd`  Za ~?_~d?_`~d?_`~d?_` ZXa ~?_`~d?_`~d?_`~d?_`a bd`  ZXa ~?_~d?_`~d?_`~d?_` ZXa ~?_`~d?_`~d?_`~d?_`a X ?bd` a _ a a bd` dnja j_i a ba dnja 3333j_i a ba dnja j_i a ba dnja j_i a ba d _ҜXd _ҜXd _ҜX _ҜXd _ҜXd _ҜXd _ҜX _Ҝ*#EgvT2#Eg@ @ @ @ 80( 91)! :2*" ;3+#>6.&=5-% <4,$        (3$.6'2, /+0&7!4-)1#                                B@@@BB@@@@BBB@BBB@B@@B@BBBB@B@@@ @ @@@ @ @@ @@ @@@ @@ @@@ @@@@ @ @ @@@@ @@@@@ @ @ @@@@ @@ @@ @ @@ @@@ @@@@ @ @@ @@@@@ @@ @@                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0BD%(> D%(> 5%(> 84%(> 4%(> 04%(> @5%(> @5%(> @5%(> @5%(> @5%(> @5%(> @5%(> @5%(> *( *0hu-r`po: o (. s8 zto 4 4 4 }i3Pi(9 i(9   i(9 (}(} (}*i(9 i(9 (}(}{}*r9dp* *0{- rps< zXi1 r{psjzXi1 rpsjz{,4{({({(+2{({({(**(*jP5}(o*0xP5}({}{}{}{}{}{{{i(9 {}*rlOp**0^{%{% X} _bX _b`X _b`X _`{3o*%XdҜ%XdҜ%XdҜ%XҜ*{1o{ di{n_i*0Z({({X({X({ X({X(o*0a( #Eg} } ܺ} vT2} }} + {X {i3*&_f_`*aa*2__`_`*0i +B{Y{Ya{Ya{Ya {bd`X P2{ { {{{8bd` (X{%XX yZXX b d` bd` (X{%XX yZXXbd` bd` (X{%XX yZXXbd` bd`(X{%XX yZXX bd` b d`(X{%XX yZXX bd`X? 8bd` (X{%XX nXX b d` bd` (X{%XX nXXbd` bd` (X{%XX nXXbd` bd`(X{%XX nXX bd` b d`(X{%XX nXX bd` X  ? 8bd` (X{%XX ܼXX b d` bd` (X{%XX ܼXXbd` bd` (X{%XX ܼXXbd` bd`(X{%XX ܼXX bd` b d`(X{%XX ܼXX bd` X  ? 8bd` (X{%XX bXX b d` bd` (X{%XX bXXbd` bd` (X{%XX bXXbd` bd`(X{%XX bXX bd` b d`(X{%XX bXX bd` X  >%{X}%{ X}%{X}%{X}%{X}} +{  X  2*rXOp* *j5}(o*05}({}{}{}{ } { } { } { } { } {{{i(9 {}*0^{%{% X} _X _b`X _b`X _b`{3o*{1o{n_i{ di*ҜXdҜXdҜXdҜ*0({({X({X({  X({ X({ X({ X({ X(o *0( #Eg} } ܺ} vT2}  2Tv}  }  ͫ}  gE#} } + {X {i3*F_b Y_d`*aa*&_f_`*f`a*&_f_`*b(XX(*z(XX yZX(*z(XX nX(*z(XX ܼX(*b(XX(*z(XX >pmX(*z(XX $M\X(*z(XX 拢PX(*0 { { {{ {  {  { { { ( {({({ ( {( {({({ ( { ( {  ({ ({ ( { ( { ({ ({(  {(  { ( { ( { (  {  (  {( { ( {(  { (  {( {( { (  {(  { ( { ( { (   {( {({ ({ ( {  ( { ({({( { ( { ({ ({ ( { ( {({  ({ (  { (  {  ( {( {(  { (  { ( { ( {  (  {(  {( { ( { (  {(  { ( { ( { (   { ( {  ({({( { ( { ({ ({( {( {({ ({( { ( {  ({({ (  { (  {( {( { (  {(  {( {( { (  {  (  { ( { ( {(  {  (  { ( {( { ( { ( {  ({ ({ ( {( {({  ({( {  ( {({({( {( {({({ (  {(  {( {( { (  {(  { ( {( {(  {(  {  ( { ( {  (  {  (  {( { ( {( %{X}%{X}%{X}%{ X} %{ X} %{  X} %{ X} %{ X} } +{  X  {i3**( *0;js  ( (s( ( oe~ oolt*( *"( *"}*"}*0{- {-+ sU*0ko ( o  o 7s]{ro$  +` o% t\7  {so  o^-ry?ps zrips z rip s z o& - u.  , o'  (*4O%t0O%uO% ?m0>ls  ~!o o s  (o {- o s+ o s  oc + o% t7  o  o& - u.,o' o o s ~o o o s {o o(#{ss5 os1s - r+p s z r+p s z r_ip s z *AdV!w u,00(m( {sosvo(*0#m( {ssvo(*(}}}}*6{oD *>{oE *{oV {o {o {o (*6( (*6( (*:( }*0Sn{o8( o o8t osr  ( rps z oV *0 :00I{*2{ok*N(sX}*N(sY}*r?Ap*0( & * 6{o *2{oZ*0_(qo2 o1r;po5(( s8 z}o(S}o(}*{*{*{-%{o3{o(}{*{*6((*0Cou ,,*uK, tKs*rpo: o; (. r3ps z0P(qo2 o1r;po5(( s8 z }ou$,%X o(S}+ sU}%X o({} %X o( }!%X o(}"o/@ou-ou-ou,%X o(}#o/$ou-%X o(}$o/ ou,o(}%*N{oXoX*{*{ *{!*{"*{#*0Ip{$-*{$o  +{$o(sX i2*j{$-~J *{$s *{%*{*:( }&*F{&o$ s *:( }'*2{'o& *2{'o *Z{'o% (s*0F,u,t*uK, tKs*rpo: o; (. r3ps z0Vqs }((qo + o% ( {((lo &o& -u. , o' *,Dzs }((q{(of *0"r{((( o! t s*2{(s*0Z,u,t*u, (~s*uK, tKs*rpo: o; (. r3ps z:(q})*0~(qo.r;po5(( s8 zou-!r Zpoo: o; (. s8 zo(~}*o(}+*6s(*V(q}*}+*{)*{**0Us{+o<  {+o + o% %X (~ o& - u.,o' * ?04G{), {)op*7 {*{+s*0ot,u,t*u$,(S oXo s*u,( o s*rpo: oO (. r3ps z0`(q 0/A r<p5rp 5r5p(p s8 zsU}/*(qoz 1rp5(( s8 zs}/*>{/u*F{/to *Z{/t$oXo*2{/op*0\u,t*uK, tKs%*uz,tz(($*rpo: oO (. r3ps z0du(qo +9o% t o2 -(}0+o2 3 (}1o& -u. ,o' * ER{0*{1*0_Q7s] {0,7 {0s9 o^{1,7 {1s9 o^s*V(q}2}3*z(q~h}2s }3*0O(qo. r;po5(( rps zo(}2o}3*0Cu,t*uK, tKs+*rpo: oO (. r3ps z0 G7 {2{3s*0a(qo2 o1r;po5(( s8 zo(}4o1o(}5*:(q}4*V(q}4}5*z,u,t*(s.*{4*{5*0=Q7 {4s] {5,7 {5o^s*6((6*0A,u,t*uK, tKs8*rpo: o; (. s8 z(qsV}6sV}7sV}8*0f(qo. r;po5(( rps zo(S}6o(S}7o(S}8*2{6oY*2{7oY*2{8oY*0)G7 {6{7{8s*0\u,t*uK, tKs>*uz,tz((=*rpo: o; (. r3ps z0ov(qo +Do% tN o. rps8 zot}9ot:}:o& -u. ,o' * P]V(q}9}:*0%G7 {9{:ss*nrp{9or5p(I *0Cu,t*uK, tKsC*r1po: oO (. r3ps z0\(qo(};oto}<o3ot$oX}=*~h}=*(q};oH t}<j(}=*{;*F{<oH t*{=*0ZQ7 {;{<s>s] {=~ho -7 {=sVo^s*6((J*0F,u,t*uK, tKsL*rpo: o; (. r3ps z(q}>}?}@}A*0^(qo(}>o({}?ot}@o1ot(}A*{>*{>*{?*{?*{@*{@*{A*{A*0VQ7 {>{?{@s] {A,7 {As9 o^s*0F,u,t*uK, tKsW*rXpo: o; (. r3ps z0~(q- rps zo2 o1 r;po5(( rps zoop(}Bo1oop( }C*&(Y*(q- rps z}B}C*{B*{C*0GQ7 {Bops] {C,7 {Copo^s*0_,u,t*u,tos_*u,to5 (]*rcpo: o; (. s8 z2o5 (]*Z(3 iox (`*r( - r3ps z}D*{D*0wu -*{D{Do? *f (3 {Do2 o!*Zob2sh*~E*^ob2si*~E*(*"(*&(*&(*0qZu-uS,Y1oD  oD o +o% t7 o'o& -u. ,o' oD oD *(**I.sfE*Zob2sp*~F*(*"(*"(*"(*0qZu-uS,Y0oD  oD o +o% t7 o'o& -u. ,o' oD oD *(**I.smF*0k(#}Go(}Hoo,ooom}I+}Io}J rp(( s9z* KXrow.*{Goo*0{Gom o s9z* 0mk{Go{Gooo - rps9zo( oKo~ ioMooO- r}psz*2{Go*2{Go*F{Goo*{Go,{Goos**0qxs)  {Go ox o$ +,o% t {Jseoog o& -u.,o' *!9Z0|y{Go ox o$ +:o% t {Jse ooXo , ) og o& -u.,o' **Gb0z({ oq 1**0"{Goom o s9z* F{Goo*{H*Z{Gooo*2{I(*0${3*u -*{G{Go *2{Go" *0U|sL ~I  rpoM owo oM &r ]poM oxoN oM &r poM oy oN oM &r9poM ozoN oM &r^poM ooM oM &o r@^poM &(oM oM & +5i Y(/ rp^poM & (oM oM & X i2{Goo9oo$ o& ,ripoM oM &o% too9ro( rCHpoM oo r#0poM &~uo ,# (SoYs^oN oM &8~yo ,-rp (SoYs^(( oM oM &8~zo , tK(GoN oM &+~~}o , tK(oN oM &+U~o , tK(oN oM &+,ooM &rHpoM  (RoM oM &5&ooM &rHpoM rHpoM oM &oM &o& :Uo}  ,J o$  + o% t  oN &oM & o& - u.  , o' o *A4- ,90=}{Go ,,o   +ooXo ,*X i2*08~~zo"  ,((GoL  rp(( s9z*$0( (0 iox *( *0 4 io] 0*0}sB (oF *2i(*0 % +XYo] 2X 2*0'^ 4 + oE io] % 0*( }Lo,os }M*Js((*Js((*06o#( & rp(( s z rp(( s z*+!1Z{Looo*0V{Loo-*sL {Loo  +o o oM &X o 3o *{Loo-*{Loos*{M*0( 9o  o,,o,oo - rCps z(,(. rps zo*o(- rps zoo)o? - r?ps zo ~oQ o ~oQ - - rps z, , rps zo+,:o+oo? -'r_ps z(, (3 rps z*2{Lok*( *F(((*F(((*0o o ~o - ~ o ,o( oos*~o - ~Oo ,Aoop(s ot$oX o os*s@*~o ,Doop(sqot$oXorosss*~Po - ~o ,Uot$o ,*op(6  o9 o: o;s oX s *~+o 9oopsw  ox,@ oyt  ([  -= (  -0 (  -# (  + oyoptKs  o o o o os(oos>o)sY oZ s)*~ o 9otKsot &rps8 zo 4 4+YXi3+?YXi3o(-*o)ssoos**~ o ,~otKsot &rps8 zoi4 + iY Y X  i3s!!os'*rOp(( s3zjy 0AP 0( *0i s Rs Ss T~Rrprpo ~Rrprpo ~Rrpr;po ~R~or;po ~Rreprpo ~R~orpo ~Rrprpo ~R~orpo ~Rr pr7po ~R~or7po ~Rr prapo ~Rrprapo ~Rr1prapo ~Rrprapo ~R~orapo ~Rr]prpo ~Rrprpo ~Rrprpo ~Rr7prpo ~R~orpo ~Rreprspo ~Rrprpo ~RrUprpo ~Rrprpo ~R~orpo ~Rrprpo ~Rrprpo ~Rrprpo ~R~orpo ~RrEprpo ~Rrprpo ~Rrprpo ~Rrprpo ~Rrprpo ~Rr7prpo ~R~orpo ~Rr{prpo ~Rrprpo ~Rrprpo ~Rrprpo ~Rr/prpo ~Rrmprpo ~R~orpo ~RrIprpo ~Rrprpo ~Rrprpo ~R~orpo ~Rrpr%po ~Rrpr%po ~Rr]pr%po ~R~or%po ~Rr'prpo ~Rrprpo ~Rrcprpo ~Rrprpo ~Rrprpo ~Rrprpo ~Rrprpo ~Rr]prpo ~Rrprpo ~Rr[prUpo ~RrprUpo ~Rrprpo ~Rrprpo ~Rrgprpo ~Rr#prpo ~Rr! prE po ~Rru prE po ~Rr pr po ~Rr!pr po ~Rrpr3!po ~RrU!pr3!po ~R~or3!po ~Rrw!pr!po ~Rr!pr!po ~R~or!po ~Rr!pr "po ~Rr1"pr "po ~R~or "po ~RrW"pr"po ~R~\ or"po ~Rr"pr"po ~R~[ or"po ~Rr"pr)#po ~R~] or)#po ~RrS#pru#po ~RrGpr#po ~Rrpr#po ~Rrpr#$po ~Srpri$po ~Srpry$po ~Sr;pri$po ~Srpri$po ~Srpri$po ~Sr7pri$po ~Srapri$po ~Srpri$po ~Srsprspo ~Srprspo ~Srprspo ~Srprspo ~Srprspo ~Srprspo ~Sr%prspo ~Srprspo ~Srprspo ~Srprspo ~SrUprspo ~Srprspo ~Srprspo ~SrE prspo ~Sr prspo ~Sr3!prspo ~Sr!prspo ~Sr "prspo ~Sr"prspo ~Sr"prspo ~Sr)#prspo ~Sru#prspo ~Sr#pr$po ~Sr#pr$po ~Sr#$pr$po ~Tr;p~o ~Trp~o ~Trp~o ~Tr7p~o ~Trap~o ~Trp~o ~Trp~o ~Trp~o ~Trp~o ~Trp~o ~Trp~o ~Tr%p~o ~Tr3!p~o ~Tr!p~o ~Tr "p~o ~Tr"p~\ o ~Tr"p~[ o ~Tr)#p~] o *0xri$po? , s +Vry$po? ,s  +Arspo? , s  ++r$po? ,s1 +r$p(. rps zoe*~R(j ok o t/,~To t**.~To *06H~R(j ok o t/ ,rsp~So o **06H~R(j ok o t/ ,ri$p~So o **06H~R(j ok o t/ ,ry$p~So o **06H~R(j ok o t/ ,r$p~So o **02H~R(j ok o t/ ,~So **:o(*(,s= *(,s_*sj*>o(*>o(**(*0~R(j ok o t/ (,'(? oA  o@ o (u +R(,&(]o` oao (p +$(hok olo (p r$po 9~So t/s (rpo? ,r(p ol8rpo? ,r(p(ol8rpo? ,rp @on8rpo? ,rp @on8rpo? ,rhp @on8]r%po? ,rhp(@on89rapo? ,r7p@@on8rpo? ,rhp@@on8rpo? ,r?p on8rpo? ,r?p on8rpo? 9r?p  on8pr$po 9~So t/sJ ( rUpo? , r?p on8rpo? , r?p on8rpo? 9 r?p  on8r$po 9~So t/s ( rpo? , r7p@@on8mr7po? , rhp@@on8Ir#po? , r?p on8r#po? , r?p on8r#$po? 9 r?p  on8r %po ,a~So t/s  ( r;po? , r7p@@on+{rpo? ,n rhp@@on+Zr#%po ,Mr#%poz oK   (  ~So t/  ( oZooi(` *2o(*0"oz oz Y 2oK (l **0~R(j ok o t/ r#%po ,"r#%poz oK rp(. (*r %po -r$po - r$po ,`r;%p(, rp($*r(p(, r(p($*rK%p(, rp($*r[%p(, rp($**Z~Roo t/*(*"(*&(*(;*"(<*&(=*>(}U*2{ oh*0{Uo  {Uo ( {Uo  ,Wi1Q(rp(. ($  o 4so o (iY( (o 4so{ ohs1(? } { ub,6{ s} (( { s} { i(i/ r ps z{ o  { o   2 / r ps ziY 3iY +  - +  - - rq%psz{   zrpsz*A408{ ub-r%p+r^}p (rIpr%p(} ($*(*"(*&(*fs }V( }X*zs }V( s }X*j{V( so &*j{V( so &*r{V( so &*f{Vso &*"}W*0(  r%ps z7s] {Vo$ +8o% t 7 oo^r/ps zo& -u.,o' {Xo ss{Ws(,s5 oK+ oKrp(( s zom   ioMoNs rp ((  s z( 9i17s]  +. 7 o ((o^ X  i3rps zr~ps z  ssKsG* sKsG*X >Z/Et)'Q<0Q<6(*r- rSps8 z(*(*Js(*bss(*0( }Y- s}Z+Uu,~0s}Z+:t o<-+ o=s o;ssxs}Z}[}\}]*{Yo( {Z{[{\{]s * %)+/5;=CGIOSYaegkmq %379=KQ[]agou{  #-39;AKQWY_eikw)+57;=GUY[_mqsw?045%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(>  5%(>  5%(>  5%(>  5%(>  5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(> 5%(>  5%(> !5%(> "5%(> #5%(> $5%(> %5%(> &5%(> '5%(> (5% (> )5% (> *5% (> +5% (> ,5% (> -5%(> .5%(> /5%(> 05%(> 15%(> 25%(> 35%(> bnd5e4f~esgj(hj(ij(j j(klj(m~m~lono j(p~p~ooqrj(s~s~rots u4%(> { 4%(> |~bi5c +*~b   +  Z X i2~cX ~bi2*"XY[*v}x}yj}z( *0}x}yj}z( ,^ +X i/,i3 ~e}w*}v-}w*iY5}w{w{wi(9 *}v}w** (*09}x}yj}z( oz - r &ps z  .  . ..+F ~l ~m ~n +; ~o ~p ~q +%  ~r ~s ~t + r;&ps z}vo{ -3&oz 3 r &ps z}v+Xoz /o{ ( ( ,oz 2}v~e}w*~gXoz =o| ( ( ..&+1j6r{&p(. s zo+@o+  o oXoz >uoz /koK   (   ( {v1@./3 oz bo+ oz oo o+ {w}w*2i(*0}x}yj}z( - r &ps zg<}vX  +X /g.2~h{w}w*Y 4 + %X%X fҜ2+  Y% . 4%q4Xҁ4  i(}w*(}w{wi0+}v*0X  +X /,2~e*YX[ Y] - /~e*5+5b _` Y 0X X2i/*6i(*0c}x}yj}z( 21 r&ps z- ~e}w*(}w{wi2+}v*0t}x}yj}z( / r&ps8 z}x}y- ~e}w*( 4 o@ 4%q4~{ZY_ҁ4i(}w{wi2+}v*0}x}yj}z( / r%'ps z}v}y3&o , ~j{w+ ~i{w}w*( 4 ZY ~{ o@ 4%q4 _ҁ44%q4Y_b`ҁ4Y4%q4`ҁ4i(}w}xj}z/*(,* >y8!Yo X{w{wicY5%q5__ba5{w{wiY5%q5o Xba5j}z(,*X '?t8J{v/(**0[iY iY j +n%Y nXX %Y i d /j.!2%Y 5%q5X% 5 ,*0R{v-*{v{v.-{v-*{v/ o(*(o*{w(*0{{wii/  {w + {w   ii3Y  ,iX5oA + oH t({v s*0{v,{v-~g*{v0~h({w+{w {v0~ho{w+{w {v/ {v+ ii( 5iiYiiY+^/+Y/+Y {v/f{v/ f  _, fXi2s ,  o  *6o(*0%{x@{v/(o}x+l  +T~|{wґX ~|{wcґX ~|{wcґX ~|{wcґX X {wi2}x{x*0T%i2*-X+ iYYZ  (X {v/e_3X%i2Y +,*{y3{v,{w(+}y{y*0@ ? 2P 2$ 2 @2** 2** 2 2** 2** 2$ 2 @2** 2** 2 2** 2** 2O 2$ 2 @2** 2 * * 2 2 * * 2 **2 2 @2**2**22**2*2* *V{v1 {x**6t(*+Xi. ,+Xi.,(*0=iiYYY ,&2**%X %X .7**i2*0E{v{v25{v{v0%{v,{v{w{w(Z****0 +X i/, +X i/,( >((Y  1.cX5 ]_b(   X +-5iY  5   (9 i5  2  (2\  (& (&+ X% i3 *, iYYZ(X0/ *( > Y3  d  6X/  (  Y (+)  (  Y (+ X   ,+X,85 - ~h{w(&iY(` *0{v- rA'ps z{v-~g*o,0(ooYo {v{v.o**{woH t {v{vZ{w(s*0{v- rA'ps z {v-~g~g8o,OooY (o (  {v{v.o+{v s+K{woH t{w({v{vZs{vs*0]3*u -*{v{v3{wi{wi.* +{w{w.*X {wi2*0:{v-(*{v-o*  + o   {v-*0L{wi {wi1*{wa {wi1{w{wiYa {v2*f*0E{v-~h*{v/{w~h{w(s*~h{w(*{v,.{v0{w{wiYe*{w{wiY**0>0*( o- ~io *~ho ,*~uo*0y(Y~bi(/  +S~c(  ~b +- ]-(/ (**X i2X 2(*0 ~ho o o os~ho1o/ o~ho -:++X%3*~io~ho ,*o ,Y=y*0h6{v-j*{wi1.{w{wiYj b{w{wiYjn_` +{w{wiYjn_ {v2*e*:(0**:(2**0/{v/ ro'ps z(  {v/o**0k*{v/ ro'ps zs (( ~ho - r'ps z{v/}v{w{w(}w*0~h  ~g  ++ ooo   {v0,{v}v{w}w,7ooo{v}v{w}w*.i(` *0{v/ ro'ps z~ho ,~g*{v-~h*{v-~g*  {w{wiY_ j ,|o {wiZ(o{w i{wi ,?{wiX5 i{wi/"{wi5iiYoA  -{{wi{wi0({wi5 {wi{wiYoA +1( {wi5 {wi{wiYoA {wiZ5 {wi5 87{w  :+  b  X  0oA  b  X 8 ,{w(+.(&{w( &iiYi(9 ( X  /D ,{w(+/(&{w( &iiYi(9 ( b  :a+I ,{w(+.(&{w( &iiYi(9 ( X   2X{wi? ,(iY{w(s {v0  o* *0iY iY8nZ  d mn  nX  m dX Y+3 Y nZ d bmn  nXX  m dX Y/ Y% nX  m Y% 2  dm X Y:en Z  d n_  nX  m Y% 2  dX nXm*0vi /*iiY Y% jn_ j iY++ jn_ZXjn_XX X i  d Y/Y / 2 i+ i+*0@j  j  + [ZY   ZY  j0ZY[*0Oj/ ro'ps zK ( j. r'ps zj/K%qKXK*0h6{zj.{z*{wi,{w{wiY_-j*{w{wiYf`jn_ !(}z{z*0Mi3(*i Y jn_ X(`  8 Yjn_jn_Zn_Xn_Zn_Zjn_Zjn_n_Xn_X d dX dX  +b Yjn_Z Yjn_Z jn_n_Xn_X n_X  d dX dX dX  Xi Y  0 jn_X  i  di Y =(2 (&(9 *0Nn nnZ Z~d_ Z ~d_ ~d_X d  dX dX6Y~d_m*0{v,{v-~g*o,&ooY( {v0o**(,&(oYo {v0o**(oX  XY [ 53{w(&+{w{w(&{v{vZs*z{v-*{ve{ws*0T{v/ r'ps z~i(/~i*(o" + ~io d~uo,*2(o*0Y*/ r(ps z-~h*{v, ~ho ,*~h  _3o c, o +**ds*0-j  +{wn  b`j] X {wi2i*0c +X i/, +X i/,( >( ( Y 1( X+iY  5 (9 2(2N(&+ X% i3*, iYYZ(X 0 /*( 1fY3d    6X/(Y+(Y+X,88- iY(` *0{v- rA'ps z{v-~g*{wi3A{w 143~g*(  ,{v5  s*~g*{w{w(/*o,ooY(  +{woH t {w(  {vs*0f/~e* XY [ {wi(/ 5 {w{wiY(9  ] ,5%q5_bf_5*0d _ i -X5  oA 8 Y_d,XX5 %X+ X5 ++X %X_b _d` XY2 Y_b *0{v, {wi-~g*-*/ e(*{v{w( s {x.{v0 {xX+{x}x{y.{yX}y*0dX _ iY .5Y + YY/Y+ Y/,F Y+&Y _d _b` Y0_d*011i Y +Y db` Y% 0d*0-*/ e(*(2{v2~g*~ho*(YXc 5 c _ -{wi(9 +e Y{wiYYY+E{w%Y _d2#5%q5{w_b`5Y/{vs*{v*0Yi i  Y% jn_Y% jn_Y jX i?ci 0 , Y% 5%q5Y%5.*0{v-*{v-o*{v{v. o(*{w{w( -~g*/  +  {vZ{w{w(s*0oH t (*"(*"(*0{v--4*~f*, {v0 (X+( ( 4 {wi i{v>+F{w Y% Y%ҜY%dҜY%dҜY%dҜ 0{w+Y%Ҝd 5Y%Ҝ8+W{w Y% f, X%Y%ҜY%dҜY%dҜY%dҜ 0{w , Y +Y% fҜ d  5Y% fҜ1Y% *& (*0  .  . . r=(ps z{w-r(p*{v-r]3p*sL 3R{w5rp(w oM & +!{w5r(p(w oM &X {wi28371ot &(Y +(-0+1ot &Y /8s j((+Io{v- r]3po + {w5rm$p(w o o{v-+ o t/oM & o -o o{ 03 X%o{ 0.oK {v3rp(. *0T di i ,5   s*,'5s e_3}x*~g*j/&!3 f(o*e(o*(*0P6 j0j2=iE j.+~g*~h*~i*~j*~k*(*01{v-*{wi + {w-Y% 0{w  _, _,++ _,+ +_b .Y 0{wiY ZXY*0]%/ r(ps z{v/(o* [ {wi2*{w{wiYY  ]_c_*0{v-*{v-*{v0~h({w+{w {v0~ho{w+{w {v2 {v+ ii( 5iiYiiY+^/+Y/+Y {v/f{v/ f  `, fXi2s ,  o  *00{v-*{v-*{v0~h({w+{w {v0~ho{w+{w {v/ {v/{v2 {v++ ii( 5iiYiiY+^/+Y/+Y {v/f{v/ f  a, fXi2s ,  o  *0H/ r(ps z(,*{v1(Y/(%*~ho( *0H/ r(ps z(-*{v1(Y/(%*~ho(*/ r(ps z{v1(Y/(%*~ho(!*0C{woH t iYcY5%q5__ba5{vs*{}or )p{~or)p(} *r{}o{~o( *b{}o{~oX*f{}o{~o*v{}o{~o*0"%{}o {~Xo X*^{}o{~o*vs}}s}~( *( }o4}j}*0% ( (4( * 0,% (  +n(3cX 3( *$2i(2*0% (  {(5X  +R{i34%{%jX}(3{(4{(5 {%X X 2%{%jX}(3{(4 ( *0 +{ocX 3*F{io*>{o&*V( }}*V( }}*{*{*{*{*0Eu ,9{{3+{{3{{3{{**|(6 |(6 a|( a|( a*joo(v}*{*z(- rps z}*{*0 3*u -*(C*v{{o ,(**N{o" (a*"}*r/)p*09$iY +"{-+{o ҜXiY2*0!iY _ i1 rpsT z*( *(P *"(Q *&(R *NoZ[(P*NoZ[(P**(P*0\( ], rYps8 zs}}[}o4}o4}}*2{o*R(W{o*{*0K{{i3!{{{o&}{%{% X}*01/ r$ps8 z{o  {Y 1h{{(9 {{{oX }YX+!{{oX YX0{{(9 %{X}*0%{o {-&+{%{% X}{2+B{3!{{{o&}{{{o&{{{o&{{(9 (W{*{{i(` }{o*Z}}}*0+{o  [2 0+{o  [X2 0[,j( Kj(  j(5 +I iX5  i(9 i5  i(9 X [XX /Xr;)psY 8 [ i  i(9  X   i(9  +- X oo~ioo X   2~g + Zoo X 2 ~h YoXo YoX Zoooo,~hoXoo =~ho~io~ho-~io~ho-~io+Y%/o* X  ?Qo*0+{o Zjj2!0+{o ZXjj2!0j[j.( j(  (5 +I iX5  i(9 i5  i(9 X [XX !/XrE)psY 8  [ i  i(9  X   i(9  +- X oo~i oo X   2~g +  Zoo X 2 ~h YoXo YoX  Zoooo,~hoXoo =~ho~io~ho-~io~ho-~io+Y%/o* X  ?Qo*0+{o  [2 0+{o  [X2 0[,    j( Kj( (Y  (Y Aj(o+1Xoo~iooX@2~g  +   Zoo  X  @2@~h oo o ooo  o, ~ho  o  o = ~ho ~i o~ho-(~i o o~ho,  * ~io +0+{o Zjj2!0+{o ZXjj2!0j[j.    ( j( (Z  (Z !(o+1Xoo~i ooX 2~g  +    Zoo  X   2 ~h oo o ooo  o, ~ho  o  o = ~ho ~i o~ho-(~i o o~ho,  * ~io +0Vy~ho o o{s ~ho1o/o ~ho, *0!    {@{o {o { .  .+  (Y&+([+ rW)ps8 z  (]  s6s*{o {o {  .  .+  (Z&+(\+ rW)ps< z  (]  s7s*( *(c-r)pr)ps z}}}*0C%iY _X iYҜd iY + _X Ҝd Y /*04 4 4 4 s{Y [{[4   8{o@ ioo&i(9 (aioo& +    aҜ X  i3 4%q4 `ҁ4 4%q4`ҁ4 s{o9J  8+A X(aioo&iXiZYi(9 X2 X(aioo&iiiZYYiiZY(9 4%q4 `ҁ4soo~hoo{Yo,{o, + X  XX  ? 9~hoo{{s~ho1~hoo/o  ~ho1  ss*j 2 0@]**( *r,~~ _X**n,~~ _X**R2~ X**F2 ~hX**R2~ X**R2~ X**0A%{a}%{a}%{a}%{a}*0(?_d 1n_ {Y?_b`{_*0@{(l}{(l}{(l}*05j  +#?_c j_i _j?_b` X {2*0M{(n}{(n}{(n}{(n}*05j% % % 8{?_c j_i{?_c j_i{?_c j_i{?_c j_i(e(faaa _j?_b` (e(faaa _j?_b` (e(faaa _j?_b` (e(faaa _j?_b` X{?}}} }*0j% % % 8{?_c j_i{?_c j_i{?_c j_i{?_c j_i-+~ _ _-+~ _ _-+~ _ _-+~ _ _(j(ha(ia(ga _j?_b` (j(ha(ia(ga _j?_b` (j(ha(ia(ga _j?_b` (j(ha(ia(ga _j?_b` X{?U}}} }*0 iZ ~s ~X+KX~X2  0 .( .#+1 . . .+ + + + + + r*ps8 z {2 X}+{[X}+][%X( Xi2  +Z +F{[[ K%qK  ( _jZ{]?_b`K X  2 X X  < {X{[Z28 +9 ( %q4~ X]Y( _aҁ4 X  2( %q4~%X aҁ40J +; ++  ( %q4  Y( aҁ4 X  2 X  28+;++( %q4Y( aҁ4X2X2+3( %q4~( _aҁ4X2+;++( %q4Y( aҁ4X2X2+Z+F{[[K%qK( _jZ{]?_b`KX2XX /{X{[Z2{X{[Z?*2 (t*0U(   0 .3 .Z8 ; ; ;8 }n}~}~}8(}!}~}~}80}!}~}~}+j8}!}~}~}+7@}j}~}~}+ rY*ps8 z}*0Lа( o ,to(r}}*r*po: o (. s8 zr*p* *&{[*0{- r+ps< z{[Xi1 r{psjz{[Xi1 rpsjz({{,{(}+ {(~(|{[**0% %X _j}%X _j}%X _j}%X _j} 8%{%X _j?_b`}%{%X _j?_b`}%{%X _j?_b`}%{%X _j?_b`}X {@p*0`%  +P%X {?_cҜ%X {?_cҜ%X {?_cҜ%X {?_cҜX {3*0f(k +*~(o{(m(p(kX {2~(o{(m{(k*0h{(k~(o{(m{Y +*(k(q~(o{(mY 0(k*2Kh3d4Lqi}'jMr xe/!$E5ڎ۽6Δ\@F8f0b%"~nHãB:k(T=+y ^NԬsWXPtO,uz Y_Q oIC-v{̻>Z`;RlU)a7?[S9BQ6Z){ 9K|$lR3U.r5_8Hs "f4\7Y&jp1S BQ6Z){ 9K|$lRc|w{ko0g+׫vʂ}YGԢr&6?4q1#'u ,nZR;ֳ)/S [j˾9JLXCM3EPfHa5WiَU(ߌ BhA-TR j068@|9/4CDT{2#=L BN.f($v[Im%rdhԤ\]elpHP^FWث XE,?k:AOgst"57unGq)ʼnobV>Ky xZݨ31Y'_`QJ -zɜ;M*  4%(>  4%(>  4%(> 5%(>  4%(> 4%(> 4%(> 4%(> 4% (>  4%!(> 4%"(> 4%#(> 4%$(> 4%%(> *rA+p*0(}u, to9 t}{:{, r]+p( {t o@  oU } 8oT t o{s {~ho &{,r+p5(( ( ~g+@o? o o{o; o= oo &X2X oU ?I*"}*{,{o< X[Y*{o= o[X*{,{o= o[X*{o< X[Y*0{- r+ps< z(X1 r!,psjz{-(/ ry,psT zs {,r,p(( ( {, ( 8Ps {t o@ 8 o? oT to o= o{{oU oT to;{,C  r#-p oT  r7-p oU 5 (p (   ri-p oT to5 r-p oT to5 r.p {oU 5 (p sT zo @{9rA.poT (( ( rc.p(( (   r.p oT  r.p {oU 5 r.p (p (  +{ oT (  X  {oU 2r.psT zj(o &XoU ?(  o *0mz{o= o[X4 {o; {o= oo iiYi(9 {,r.ps(( ( *0{,!i(0 i(1,r/psT zi(0 i(1 r/psT zs s o {o= o {,0ro/p(( ( r/p(( ( r/p(( ( {o= o[X4 o iiYi(9 *0~{,( i(>E( ( {,Pr0p5rsp(^ ( rI0p5rsp(^ ( ru0pi5rsp(^ (   i[XZ48Xi/(X +iY(iYX {,r0p5(( ( , oA iX +{, r0p( r0psT zi?v 4 (9 {,r0pi5rsp(^ ( *{, r1p( i(*0~g ~h  +oT to X oU 2 +P oT tooo oT too X oU 2o*( *:(+}*{*2{o*2{o*2{o* *o*{o{o-+X4}}*06{{i2 r{1psjz{%{% X}*0U/*- rps z{X{i1 r{1psjz{{(9 %{X}*01{0~P+{{{o o**Fo!&o$*{,{{i(` }*0E( o,rpr1ps zo-r)Kpr1ps z}}*{*{**( *0;js  ( (q( ( oe~ oolt*0o({(}{o o( oo s}{o<o{o=oXoo} r2p s z*e 00Xu-rq2pr<ps zt o-rMgpr<ps z{oo[  ( o:oos ({o(o(o{o(ooo( (   o{  oo {o    io ((-r+ps zr+ps zr2ps z*(7( 77u7Fj(}oC }*{*F{oH t*R{{o *R(go }*{*6((*0Cu,t*uK, tKs*rpo: o; (. r3ps zj(qs}}*j(qs}}*0T(qo. r;po5(( rps zo({}o(}*{*F{o(*{*0 G7 {{s*0F,u,t*uK, (s*rpo: oO (. r3ps z0X(qo( }o({}o(}o1o(}*(q}}}}*(q}}}}*{*{*{*{*0OQ7 {{{s] {,7 {o^s*u,t*uz,tz((*(s*N(((*Noo(*0[0( i3!r2p _ r0p(w (. *r2p _b _` r0p(w (. *(qoopt}o1oop}*(q- r3ps z}, op}*,u,t*uK, tKs*r3ps8 z{*{*0=Q7 {s] {,7 {o^s*0B~~~r1ps~~*(qsV}sV}, sU}*0WF(qo o& &o% t$}o& &o% t$}o& ,o% t$}*2{oY*2{oY*Z{, {oY**0FQ7 {{s] {,7 {o^s*0[rO3psr3psr3psr3psr4psrS4ps*( *( *0r4ps~rAp(( s~rKp(( s~rUp(( s~r4p(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s~r4p(( s~rp(( s~rp(( s~rp(( s~rýp(( s~r4p(( s~r4p(( s~r4p(( s~r4p(( s~r4p(( s~rp(( s~rp(( s~rp(( s~rp(( s~rp(( s*0<r4ps ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s ~ rp(( s~ r2p(( s~ r2p(( s~ r2p(( sr5psr?5psrq5p~r5p(. sr5p~r5p(. s*( *0F,u,t*uK, tKs*r5po: o; rEp(I s8 z0(qo2 o1r;po5(( s8 zoopu,o(}+o(}o1o(( }*R(qs}*n(qs}}*{opu, r1ps}*{(o*{opu,{opto*{(o*{*0=Q7 {s] {,7 {o^s*0F,u,t*uK, tKs*r+6po: o; (. r3ps z0(q- rps zo2 o1 r;po5(( rps zoopt}oop((}o1ooptK}**(*0@(q- r6ps z- r6ps z}}, s}*0g(q- r6ps z- r6ps z}},3H( (~-r6pr57ps z(\s}*{*{*0G{-*{oH  +{o(X {o2*0PQ7 {{ops] {,7 {opo^s*6((*0A,u,t*uK, tKs*rZpo: o; (. s8 z(q}sV}sV}sV} *0r(qo.rEprps zo(SoXo}o(S}o(S}o(S} *{*2{oY*2{oY*2{ oY*07G7 {sU{{{ s*j(q}!s}"*(qo({}!ot}"*6((*0A,u,t*uK, tKs*r]7po: o; (. s8 z{!*{"*0 G7 {!{"s*(qsU}#}$}%}&}'*0(q %X ot$}#%X ot(X }$ou,%X ot(}%%X o({}&%X otK}'*6((*0A,u,t*uK, tKs*r7po: o; (. s8 z{#*{$*{%*{&*{'*0tI7 {#{$s9 s] {%,7 {%s9 o^7 {& {' o^s*&(8 **(9 *:~F(9 *00u- uS9 {o# oD (4 :{:{u,5{ut,{tt +f{t os +L{uK,{tK +1{u:,{t: +{o: o; (Qzo$ + o% t7 o' o& - u.,o' {o'oD oD *(; *BSJB v2.0.50727l#~dj#Stringsxc7#USh#GUIDxĒ#BlobW) 3`%iK KKKKKKKKKKKKKKLKLKMKNKAOKVK^KgKzzۅKK4K<KK K;K@@|KjKKjKKjKKjKKjKLjKLjK7LjKPLjKiLjKLjKLjKLKL@ML MLEMK[MKmMKMKMKMKMKMKMKXzMKNKvK+NjK6NKPNKNLKNLNKOKOjKOKOKOKrP]PPKQKQKQKR]P6RKRKWKWKWK X]PbXGXXXXKXXXXYXZK<KZKZKlK_Kr`K{`K`KbbKhKhK+AL hL v+ ++ $ 23 5LY, 8Y, ;Y4 > A G Z0: ^ZdqvPy~~\`\)=^=kx##*%8D%dD0s@@HHLPP&Q-;R:M\UEZJ[Mgfgg hi$5hjK5hkYijrlwl{s}5z5z{+6Q6appp5-G-X-f5s55,  5D! 5H(1 5*: L ,j +Y m \z    * ; E xT xf s  s    ' . \2 5 3 =6C =6U 7i ;+x <1 DBD DGK DGN DNZ DO` DTh DXy h j L" . C `         5 ! 5 / 5< H \   ' 1 ; H O 6T 6]6d6h4nN4p_puk}55&7H[q&)5P052535354+4+8(93CJglMMTTxV W s Z Z['\8^N^dP_!~a&Lf1g:Dk?sQdz 3JZjt   i'86<5 Ip \pbpi5Dy5X'+-1-75>BF.!M=5"VN5$\b+ %do+)n++uL+xL,z3C3C3 C6-6M7^8g8}Y4:Y4:D:;BCxE& F3FNVFoVL{VLVLVLVLVN/XF ZG[J:[Q`[:`]Hb`YbjiltxuwwDxDD 'D\jy \&6p$I(Yx1l 4<@F5S^.aflr86s@zT6f6~66p @-Y5 l55L + C  C # l!) &"7 Ex"; P"? Ys #H h #K o %N  %O %Q :%S 2` 3b \4e \6j 7o <:u "=;{ -; 2L; LA `B vDE M V Z Z [ t l~ ~   #| H e        & \ 2 4 !6= 1pC <pM JpT V58[ fa v-j p 5x {  5 5 5  5 !  8 L  K L ` L u     -&  '  '  ( b,  !.  1  1 !2 !%!3 >!3 J!9 [!9 u!B !4E !4F !H !I" !s K+ !s K+ !:M0 !P5 !\R: !XU> !"WA /"YD ="d\H U"]J d"laO r" aP "taS "aV "d[ "De^ "x " " "  # # .# B#\  N# [# j# q## #i # # # # $ )$ ?$ U$ k$ $ $ $ $ $ $6 $p %-% "%5* 9%5, J%58 Z%5< q%I |%T %] %f %+l %r %  %C %, & &V !&8 =&` T& j&L  &D  &D  &D &D && &3 & 6 & 9 & 9$ & 9( ' C3 'J? ''_? 7'bI J'ieM T'igS c'ihX m'i\ |'j^ 'vn 'xy ''z '6{ '6 (p (- - -(- <(- F(5  Q(5  f(5  (  ( (5 (L  (L (C&(l((6) (,)%!1)%!3&))67;)79I) 8>M) 9BZ):9Xm):Jh)Mp)Mt)4Pz)hQ})R)W)$W*DW#*D,[2*D[>*D,cQ*ci*dr* d*e**Hg*l*in*n*5+\++-+S+i+6+6+6 +5+5+ +(+-(+5/+8+?,+C$,+V.,+YI,nS,CvZ,l}n,,,,,, ,,,-- .- 7- F-&V-&h-s ,z-:,-\.-0-P6 -89-:.P<*.=9.G+=.K+L.T.Q5q.\>.D_A.DcM.D0eT.Dl].n.p.iu.{ /#/4 @4 F4- M4- S4- Y45 a45 i4 q+ s 5 5 45 B5 H5C X5 h5 s5 5 5 5V 5V 5V 5V 5  5 5 6 6T. $6T. 66T. H6 `6D k6\ *|6\ /6# 56\% :6\0 L6 5 S6i5 W68 _79 b7: e'7; h87< kI7= nZ7> qk7? t|7@ w7A z7B }7C 7D 7E 7F 7G 8H 8I &8J 78K H8L Y8M j8N {8O 8R 8T 8#Z 8v 86x 88{ 95}  9 69 @9- J95 W95 g95 |95 ~ 95 95H 9 9 !9 '9D O9 I P9lJ V9lK Y9L ^:N c :xR j8:S qL: ] wY::] zc::h s:k :=m : n :q :Dr :Dv :D~ :D, :D  ; ; /;  @;i H; ^; g;p s;5 ;< ;< ; ;; ; <- <5 %!< -5< 1$ 4G<L  :Z< ed<+ f~<+  v<+ <+ <L < <C. < / </ <1 <%!2 = 2 =3 *=5 E= 9 X=P r=T. w=  =D =D 1=D 8= L= O= T= T>  T>  X> ]1> aI>\ aW> hc> xq>> ~> > >' > > > ? ? ?5 ,?5! =?5" J?5# S?+? j?L@ ?A ? , B ?B ?D[ ?\ ?g ?h @i  @j @l 5@s q H@ r W@ s j@s "}@4u &@v )@=~ :@~ ?@ D@ J@ [@t iA lA p#A  t7A x>A XA + _A lA wA A6 A A + A- A- A- A5 A B5l %Bx 9Bx JB UB ]BV jB: yBP B B $BT. 8B FBD GB VB i C k'Ck:CnGCpZCi!nCi_(e}CfC\gC\jCjCmq%6mC6tCp|CCD'D-7D-PD5bDzDDD+D+DL D+ E !E1E'ME;cE R}EYEZEsEyEELEDFDFDFD)F4FDF`[Fl{FFF FFF& F' G(/G)?G\ ,SG0$iG2)}G4.G65G9=G6;BGp>IG-BVG5D]G5EdG58FlG+ GsHKHL HN1HN>Hx UXHY4UtH UHVHVHYHH^H }&H. I6)IP>HIh@^I=EjItJIT.MIXI`IDeIDI J"J`5JRJhJ{JJJ\ JJJ6JJK8KG3K-EK`K!tK#K5(WN(N&O&,P&P&P&%Q&Q&mR&R&S&QW&W&X&#Z&[&\&\&^&n_&_&_&`&`&`&'b&c&(i&1L (L.L?L#LaQMQMM!YN/!NS!NXPP)P3P9PPQ!HQ-!WQ!Q>!QF!Q-!QugRjRoRxRRR>RS SSQS3"S1rS1xSS@S@SDSDSDSSSS>QS1Tf1Tf1 Tf1Tf1Tf1T1T1&T!+Tf!.Tf!1Tf!4Tf!7TfR>SVTQT1TPU U>U>'U>QUUUUPQU>U4wV!RX!Ud U>Vi!SVtVVVP1VVVVVV WW%W/Wt;WLW!CY(VfYVjYVt|YN6Yt6Yt6Yt6Yt6Zt6Zt63ZtVFZVPZV^Z#pZ#Zt#V#Z![V[V[V[V[V[V[V\V \V.\VA\1N\/#d\:!~\_!\!\d!\!\!\~\_SN!q]!x]S]6]t6]t6]t6]t6]t6]t6^t6^t!0^!6^a^^>$ _! __!0_N!_t!_!_:!`:!`f64`t6@`t6(t6O`t6Z`t6g`t6x`t6`t6`t6Gt6`t6`t6`t!d\!Ia:!OaS6Sadatnaaa\!aQaQbQbQ+bQ=bQRbQgbbbbb>bbb;bbc@c@c@%c@1cf4c@8cf@cDFcDLcDQcfYcbc>lcxccccccccccccccVI!seoetetee#fN#f#f_QGgVhV'hV=hVHhV]hVmhVhVhVhVhVhVhVh!h !h!i i i 1jfjjjj{ j jjk kk!CY(VlIVlIVlIVlN? !NI Smi Smi S+mi S6mi SHmi SSmi Semi Somi Symi mmmmnni  n )n R!xR_ofo oo yooo>o 7Ta oSQS1o pf pfpfpfR>p 1!pSQ.pSQSSf10p1MQpQpQpQS1p1p1pf1pf1pfTp pppp U>pqQqqqqqQf!q11q15q19q1=q1Aq1Eq1Iq1Mq1Qq1Uq1Yq1]q1aq1eq1iq1mq~qqq, q1 q6 q]qq6 q1 q-r rr; /rt6uvu {uuu!mv Vv^^>vIvNvNvN!vc!v>#NCwVKwVTwVCVnwVwVwVFZVwVVwVwVwVwVwVwVwVxV,xVFxVTxVbxVpx!~x!x-!x!x!x!xvy-HQ-1y@!N!yVyV[V[V[V[V[V\V.\VA\VyVy zaVzVz#za#v#z# {#{#~\_#e{#q]#%W#q_#l{#{:#{#{!/|!=|Q|1||||6|6|6}j}Nq}_}_!}g!}l!j}N!q}_6}t6}t6}t6~t6 ~t6~t6~t6*~tn_;~_!C~!R~6~t6~t!~!~:64t6>t6Jt6`t6lt6t6t6t6t6t6t6t6*t6Gt6gt6t6t6t6ɀt6t! !aс5ց_߁:>>CtKa~\_~hN6t6+t645t6t6*t6~t6t7_>KCwVVVVVV6"S҃6"Setee!Q QQQ'Q0Q=SE3Q 3^ 3k(3y(3( fVXoɄ87KK!P0UCUTUtt!n1116 !P!A!Q!Sl!y2 !ntl;~o--!S1D1-1f1[QA1M@1X@g@m@u@>>QUQQTQQ1)f1p1p1p1p1.111417!:1> mu UU)qqqq47:=@B3|qQwpUUU!R|qS  p@1p1!V!؉P ܉u-P66666(656B6L6[6k6{66666Ȋ6ۊ111"1<1V16 1p}$1V!C!o!i IaPs, x~\hЌj| %W%j݌++!o!R~\T| j\CwVc Vg Vl Vv V V V V V V V VNN!:!d\:!(!+_\djSVŽV͎VގVVV!!_!"!|!bN!qN!q_!@ca:?:!T:!qt!ɐt֐/WtnN!{! _!S(>3M!̒, !Ԓ, ,U3_A1 e{dq]iq-[6 g6 $n| $!Ǖ1!R >!| i ohi &!j!Q!nq##Q#.p#j>z!n-!Q-VVVĘƘɘ̘Q!Ϙ&*-&-aH!2!<!SB>1M|Yk>QpQpgR{!xR!R>1!R! U>Ǚ֙ޙ!NiPP;QAQHQSQ\Qbhknq>>f11 U>SQS3.Tf31Tf34Tf3f3f3f3f3f33ȚӚfךfۚ>Qqqqqq47:=Qf!q3|q@QqHqqqQf!q!a!ymvmv1V!!ě!Ia`,  %.6 !A!D!Ia`vGtvNSNvN\N!S!vVVV{ !ʜלS~\ OVPn;~.pY6c;#p;#}:!!>!>!ʝ!۝>!>!d\:![!{!|!&!Et!N!t!!!t!Qa!<!NN!N:!Et!N1\_!_>!~\_!n!z!:!:; !}_!SN!~!o! :!|!A6ut6t6t6t6t6t1y@!ntСtߡtVa~\_Wl!!Ia!OaS6fH!SZ!q_!qR>_1&!/NV(V8VIVZSRfnv|>!A!l!Q/!nt!QYVҦQߦ1VV6VBVM!S!*!;`WQPU;xS>1!!SQqQUQ!q1p3"S1ӧ11![VV"3+ 34 6;6F6M6W6a6k6z666666©6ͩ6ݩ6663Vd#U#QN!s, !!N!!Ϫ!֪!ߪ! \"~\ʜל!#~\6^SIV4 6t6t6t6t6t6t6tt6t6t6t6t6īt6ͫt6ثt6t6t6t6t6Hyt6Tyt6ayt6t60t6Ct6hyt6Ot6_t6lt6}t6t6t6t16ͬ6ܬ6666!!(> 29d\:~\_%Wq]  {~\_e{q]%Wq_{K{{)6t6t6t!!_!Ů_!_!SN1\_!~\_!(!6:!B!t!ůN!!! !V^>6et!t!!!\:#n_#n_#S_#S_#Q_#.p_!O#"W>^6uNmr/"с5ց_߁]">v >>jo!t"!y"QV"ToQQSSòSӲSSQQQQQQ'Q6QCQOQ[QkQrQwQ}QQQQQQQQQQƳͳѳֳݳ"126T!"!"!̴"!Դ#Դ# $#1BC#TV#1ub#!{!s, V"V-V5VNV`Vkw#|#S >>#!!!ʜPלT$N[#V!{$G$OB>P$P!Q!P!;~-!o-!!-!÷S S n!Ǚ!!P!֙Sl;$QQQøQȸQ͸QҸQ׸QܸQQQQQQQQQ QQQQQ(Q5QBQTQQSQMQZQgQuQQQQ17T%R>fffffʹfйS6>CUP U>Q!! _!!PX_hQpJn1n!/Tof9@&DiO>U>_>gvjv~\!!t!a#q]#F_#MVVV##2K#=&# #B&!~\1}11Q&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&!/Wt!Wa!&!&!1&0^a> za!>!!~\_VE' $N4a~\_6NEtN?LQV"To>1'(hi i f!Q-!.p-gR=@!R!xRc U>!Pj(P U>`!p P- U>!(!؉!j(!R(! U>;(QSS>>@@@g@1@1@1@1@1@QqHqqqq47:=Qf!q!!!q}VVVQgVoVvV}VvV S!Jo!n!n!*!-!-!-CwVVVVVVVVVVVV%V4VCVRVaVpVVV>(>!t!Q!!n6'td\:~\_q_%Wq] ) r3; {H{!!##d\:!d\:V`VfVlV4V%[VrVxV~VVVVVVVV6t6t6}t6t6t6t6(t64t6;t6Ht6Tt6lt6t6t6t6t6t6t6t6t6(t6=t6Et6;t6Ft6t6Nt6ct6Rt6at6rt6t6t6t6+t645t6t6*t6~t6t6t6t6t6t6 t6$t6=t6Xt6}t6t6t6t6t6t6t6t6Gt6 t6t6)t6:t6Tt6gt6st6t6t6t6t6t6t6t6!t63t6Jt6ct6yt6t6t6t6t6t6t6t6)t6?t6Qt6it6}t6t6t6t6t6t6t6t6t6t68t6+t62t6<t6Lt6ct6yt6t6t6t6t6t~\_r ; {!Դ{$!,!!!",,x:!a:!?:!6-!;-!\:! !_o-1! :!O#"VVVVVVVVV V6.f4, H1 TU\-i-v_>>>-1n3!. .e111116 Q1!GS.Q!.!.6/#V /M/V(V8VIVZSRPfnv|!>!S!/B>!TV#!Q-!Q-!R!xR!gR!|Y!!U;>Sn@n@DPSS>To !R/Q!v/!N1 ց*4Cw Va06Gt6?t6Jt6SGt6ut6t6't6t6t6t6t6t6t6t62t6t6t6t6 t6t6't6,t68t6It6]t6ot6xt6t6t6t6}Ct!{!1]0! QC6H06\06k06z060606060606060VVV-VCV\#/W#s06|t6tt!K!vy-!HQ-! -!-!!-!(-!2-!<-!z!_!V16Sa01V^>!sZ! !3CwVv1V.v1VCv1!|!_N!zq_ց_Pf!seoe1tee!!!!#e{Q QQQQQ'Q6QCQOQ[QQQQQ%Q+Q1Q7QQ1;f1HfOySTfZf]f`(2bfkpfvz:-2 >Ps, x)4Ac2Kc2111QQ!2!!a2!!!t!t!!!&j3 jjk k T$k!#NXVŽV͎VގVV VVŽV͎VގVV VP$P!vy-!6-!R-!n-!n-!U-!X-![-!WQ!>!.p-!l!|Y!QFR5 U>xRj(֙XoCw VІ5Vp5V5gR R>!xR!R;~ o 7Ta oS    `WQPQS1*SfR>QS>QTQSӚfךfAfEffQpQpQpQS1p1p1pf1pf1If1Lf1Of1pf1Rf1Xf1^fTp pppp U>!d!NQhQr@!{!L5!!i!t!u56et6ot6t6t6t!{$!!5!_!6_!a:!?: rNmr/"6Gt6Dt6Rt6^tVoVvVVVVVVVVVVVVV0>GRa>!O#"1116 !!!!&N6&U(B6{V7V71-1-1-1-676 7676 7!Pl8P U>`1c1k!U U>`yQqQqHqqqqQf!qP!y1V!8\8c2c2c23"Sd111VvV VV#V0V?VEVT!vv>6^N~\19q_%Wq] ) r3; {>::1}113"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&QĘQ[3"S&QĘQ[3"S&QĘQƘQɘQ̘3"S&QĘQƘQɘQ̘3"S&QĘQƘQɘQ̘3"S&QĘQƘQɘQ̘3"S&QĘQƘQɘQ̘3"S&QĘQ[3"S&QĘQ[3"S&QĘQ[3"S&QĘQ[3"S&QĘQ[3"S&QĘQƘQɘQ̘3"S&QĘQƘQɘQ̘3"S&QĘQ[3"S&QĘQ[3"S&QĘQƘQɘQ̘3"S&QĘQƘQɘQ̘3"S&!!]!{6t6t6t6t6ta:?:!,!/Wt! t!`!j:!!9!_!!V6t6t6t6t6t61t6Pt6nt6t6t6t6t6t6t6t61t6Jt6ct6t6t6t!~\_!\!\!\!\!\!>!>a! v:!N~\_::QVVVVVVVVVòVӲVVVVVVV'V6VCVOV[XoɄ833!ei6';QQQ!Dn!SS!n-!jg;!Ę!Ƙ!ɘ!̘!o-!-!js;s7v[Qo 7Ta !!-!n-!;~-!<ToXoR|;֙DMgR !xR!RXoR<|;֙;>!؉VtVV!Vt!V!V!!a!y1VJ<O<8 >c2-c2?c2 <{u>1}113"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&3"S&!t6]t!d\:!Դt!k1}1>>V6t6t6t N=&!N!(I= >>!Bi!Bi!!~\_!:!QQZQQòQӲQQQdQQQQQ'Q6QCQOQ[rz===QQQQQ'Q6QCQOQ[QHQNQRQYQ^QfQkQoQtQx1;ffѳ  ffQdQQQQQQQQQQQQQQQQòQӲQQQQQQQ'Q6QCQOQ[Q'Q2Q=QQJQWQdQnQwQQQQQQQQQ QQQ0Q'Q=QQ1>1/"7 *2 Ƴ ;FMT[g l qw%.9D N X ` >g >n >v fDeqz}3|6"S.6"Sm>11+t~{!M>ʜRe@p>x>>>V( !S!RPvf !S!/B>Q!|;_oj(j(;$U;>11&1f1113 U>UQxS>71SQpQpQpQS1p1p1pfTp pppp U>!?~\jVN[!n!n!;~!.p!!l!{tS΁6t6t6t6t6t6t6 ~t6lt6t6t6t6t6t6|t6t6t6tT#T-T7TA!K_!S_!Z_!a!VVVVVKwVVV6t6t6 t6 t68t6Pt!e!!z!>!!N!SN!t/WtW!/Wt!WaTTTTT TT%6>bbbb>Wbbb;bbc@c@c@%c@v@`fifn tfy~f>lc^^>Ycf!s?!!VV,V;VKV\ViVuV}V!1 !>Q QQQQQ'Q6QCQOQ[Q Q% Q. 13 f1< f1E f1L f1S f1Z fa ffSfd f*fQf1'̴@ !P!! T$!x !VA!}   #Q i Q i Q i Q i Q i Q i Q i Q i Q i Q2 i QI i Q^ i Qt i Q i Q i Q i Q i Q i Q i Q$ i QB i Q^ i Q i Q i Q i S i S i S i S i S i S& i S? i ST i Sg i S i S i S i S i S i S i S i S i Si S2i SFi S_i Sqi Si Si Si 11}A}A}A}A AP A)A^^>9>I>Vcps -Ai !QuQ Q !S!!_oQS1T1(R>f,/25!p PPn@n@DPSS>To P ܉uQ!A!!CwV/CwVVVVVVVV VVV!2-!SCwV6AVCAVvAVGAB_6_VMVWVbVjVvVVVV# za## za#!yB!~\_! t!e!GaD!֙nޙp--p-|YXoQxRQ֙XoTo>Sfp11&1-11 U>QQq15181;1>SSSUAQ!q!{CwVG1GVR1GVC1GV?1G!m#ֳ1vO>uf9@&|>>>U>>SISRV^Vj6zt6t6t6t6t6t6t6t6t6t6t6 t6dt6 t6( t63 t6> t6I t6T t6_ t6j t6u t6 t6 t6 t6 t6 t6 t6 t6 t6 t6 t6 t6 t6!t6!t6!t6%!t60!t6;!t6F!t6Q!t6\!t6k!t6q!t6!t6!t6!t6!t6!t6!t6!t6"t6"t6"t6%"t65"t6:"t?"G;~o--l !:QY"6^"H6f"H!r" H!e!y"~\_"2H $N4||_"_6|6|6"_6"_ey"a:6R#t6V#t6\#t6e#t6p#t6%[t6t64t6y#t6#t6#t6#t6#t6#t6#t6#t6#t6#t6#t6 $t6$t6)$t6-$t6^N!3$H!B$6-!}$t!$:!O#"1}1Q1$H1$H1$H3}3Q3!~\_! %!!N!seo#%Itee1?% (L.L?Lz%^I%cI%cI11!YN+1'+| i ohi '+'+K(CJ!(-!(!R!(!l!|YQ)1 )-;J!SQ#)1-)13)SSfQfSSoS>7);)?)QSf U>!p1p)1{)1)1)1)1)1)1)SSSf1) 1) 1)f1)1)1*1 *f1*f1*f1*f1*f1*f1"*f1&*f2*f>*fJ*f U>QqQV*QY*Q\*Q_*qqqq4Qf!qQqHqqqq47:Qf!qb*::ěr*>v#vN*NvN\Qd\:*_* *d\:~\_%Wq]  *:+! +.!Rm>!{!#+!-+!5+:Sf+Sx+S+ za++#+t#a! ,t!,:#n_#n_#;~_#t#w,Kq}-!,X!e!%W!a:!,6-!=&!6Sa L6Sa#L!S1L!-!-!(>QNhLCmLQ-Q-QQ-11-1!K(DM!&UncM6,{Q.Q.Q.Q.1D1f1.M1.f1.6.-6.-6.-6.-6/-1/1 /-1/-1/1$/-1,/-15/1=/-1E/-1N/M[/`/fj/p/{/1/1/1|YSg2S22!QY!.p-PXoR|;֙`-262`WQP121212121p1p1pf12120333T;3S:OE3H3K3N3 U>Q3[3 U>PFOe3KO>!RVXo!3!3mvkO3NCwVjcV 4cV&cV4cV!4cV>cV(4cV64cVB4cV_4cV&cV&cVm4cV4cV4cV4cVcV4cV1cVtcV~c!!s!VA!]!K(!4O!|! 5N!5VV,V;VKV\ViVuV}V6t6)t6:t6~t6;t6Ft5tQn_;~_<_65t65t65t65t65t6 6t66t6,6t656t6>6t6G6t6P6t6T6t6`6t6l6t6x6t66t66t66t66t66t66t66t66t66t66t66t6 7t67t6'7t657t6C7tSQ76Z7t6;t6c7t6;t6s7t67t67t67t67t6;t67t6767t6868t,a=&!O8t!c8I=!q8:!V!n_!n_!S_V~\_ߪN8:NBT9OPTMOPTaOPTuOPTIPYPZPD[QD[CQI[WQPTkQPTQs\R^RI[Rs\ SG^!SG^5SYISY]SYqSYSYSYSYSL^SL^ TL^TL^3TL^HTL^]TL^rTL^TL^TL^TL^TL^TL^TL^UL^UL^/UL^DUL^YUL^nUL^UL^UL^UL^UL^UL^UL^VL^VL^+VL^@VL^UVL^jVL^VL^VL^VL^VL^VL^VL^VL^WL^'WL^SG0ASM`ASTASZALQATBLQhBOB OB *RBAR0CNRQ2CR8C9TjC;ToDHTERw$FRwFOTF]TXWT OOkT}TARXT XTXTMXLgXRoX OXOXkTY}T?YAR\Y7UZCU OcUqUUUUNRQZLQZL@[U[U(\UQh\NRQ\qUUUARQ OcUU\LQ\L$\U\O)]V)$]Vp]'V OORIVjWVjkV/kV5eS=eSeSDeSMUU=UU UD UMNRQ OORIVjWVjkV/]kV5]eS=eS]eSD!]eSM$U)^U=)U*,^U-`^UD/p^UM2NRQ7^LQ7^T7^L]7^O8^O8^R:_IVj:_WVj;_kV/<,_kV5=P_eS@{_eSMC_UH_UH_NRQK_LmK`OL `OL`RN$`IVjNd`WVjOg`kV/Px`eSQ`UTaUTaNRQW$aLW4aOXxa RYaRYcVy\McO]pcR^cLQ_cL_dYWcdMcdfWcd|WcdWc eWc1eWc9eWcLeWcpeWceXce4Oce%Xcf:XcfUXc\j^XeljeXfjoXglpOj(lpOkl|XllXl,mXn4nTp@nLQpHnL-pWnJY4q_nL-qYYrhnMrnMHrnnYsoMsoL\sYYtJoLQtRoLSthoL]voYdwoYjwoYYwoY|wpYyYzpLQ| pLQ|(pT|pZ|.qZ}aL]<>aYYYaLQdžL؆L Ll[[TZJL]qL\vada+YYĈL܈L]Z Z\ \YYLe^q^}^^7Š^7ϊ^݊^Q^Q^;^^$a1^AaOLXa$a͋aa#ea)aQa1aLa1XLQ`[\g|bibpbwbbQ܍LЎcLdT(adQdQА&dQ,/dQZ8daEdhTdp]dQrdđ~djdd\ pd dj d Ēd` dQdQdQܛdQ؜eQleQd&eQО5eQ`FeQ̟We$ ^Q$^R^;V^X^Ze^]q^`}^c^7g^7k^mLQNRQeϠemݠeyeyem e!$e#"f#f&f)ˡf,f/f2P0f5\0f6̢9f8If8[f:Z:,Z<L]=<L >L ?L B LDBL! EsfHf- HfHYYH=[\HYL9 Hlg@ I+gI JhLQ KvLLLQM3gX MLQNQge N]ge O<ign PȨwgu QLg Sg T\g Uxg Wg Yg \Xg _g ch dL-eL fL g8iQi`Mimi" iz0i( iBi. iܯUjMik4ciQlPUl`UmpOpذpip$i. rhi5 si> u8iF wliP yizβi7z۲ijzijziziz$ jW z7 jW zJ6j] zX4O{M{ [[{@Ljg ||OQ}L }L LL ̸L. L |L ֺMijk'k44k7Dk 4i7<]kPlkkY" kk Ƚk4kk k Pk  l<M\[[8l!l P!l 2l T2l 2l ,!l TLLxl ll LQL-l"l/ljAJYD NlD VL-oYN |JYD lD  mZ  mZ lLQO m m m tLQ|L O 1n m m  m L rnQ`{n n ,^Q^QL L nnnn L\>L% yML7 L@ (O0QI 8nd@L\fLO MoV 'o[ FLj ULt yL~ LoL\L M QOQ0RWLQ_Or Q|QRLQLQL&O3OdRtWVjIVjkV5<kV/ eS eSM UTUUANRQlLWVjIVjkV5|eSMU"eL $o 'o 'a'^'?o*|o* ^*Ta-e^.}^.q^.^7.^7.^.^Q//^Q/<^;/C^1J O2TO2o 4LeS56bNRQ;xZS0;ILQ<QO<Xo <>LQ>HO>* O@1 *R@4R@8AR@NRQDp DRF4p JRLLQPTP OPOPkTR"}TR/ARRhLQUpOU OWZS0WheS5XONRQ]`HT]LQ^T^#LQ^+O^h O`o *R`rR`xAR`NRQd5pdApfMp iPQp kZp pldpjqkpjrrp s|p tTvp vpjxpjyTpjz|p {LQ}(O}t O{ *R~RARNRQppR R TL  OcU UU,UmNRQzqULQL O#cU(UU&qU@NRQqq 9T% p% p% |q% ARQ!T!LQ"L@ "L"Er"`r"{r"r$#r$#rQ $#rG ,#rM 5#rB#sT P#]X#sma#$sx#7s[ #Ds` #Qs#\sT #gsG #{sM #s#s#s#sm#s#s$s$tf $$t $$9td,$Stl 8$L\<'mts M'zt} _'t l't |'t 'Du'Vu'M(L\(LQ(L (u (u(u(u)u (* v v *L * sv*v +LQ+v8+v@k,e^n,q^q,}^|,^Q,^Q,^7,^7,^,^,^;,^,^,^,LQ,LS-a"-^2-^Qf-Lh-vr-v-v-[[t.w~.L.L.w.!w.Z$/L]+0L`0xh0xp0xx0y0y0$y0YY1Z 1Z1L 2L]q2~yy2aQ2YYy2LQy2[\2m[2y$<3y)3Z/4Z6,4L@X4Ln4L}4L4y4y4y4[[(5m[ P5b[ 5y 6T )6L$ =6LP T6ZW 6L$ 6Ll  7z7!z17=zd>7YYK7Z^\7Zh7L7Lo7z7z+7L8YY,8[\8zv9Z9Zh9L]9L:{! :9{!:E{- !:YY!:[\!T;zv!;Z%;Z' <L]("=M)*={)2=]):={)B=s)J={)R={)Z={)b= N)l=YY) >Z)^>Z*l>L],>L%->J|/>\|/>YY/?LQ/$?|8/LG|@1G|E2GT3GZL3HLQ48HLS4XHL]7H0i8I}8 I3}8IYY8IT8JZ`8lJL]9JL:JkP<JsP< K}< KYY<tKL]<K}q=K}w=LYY=4LZ=LL]>LL?LkPAMsPAMYYAMLQA@MTAMLAML]C@NnDMN=~D\NYYDNZDNZFNLGNLHOL]JXOc~K`Ov~KhOYYKOLQKOTKOZK4PL]LPLMPYYOQ ~O(Q OaSLQOtQTOlSZOSZPSL#RTLyS6TLTSTU\T!U|U)UU<UVDjV(WOVXWWW~WgZWZW[[ZWb[[Wm[\WZ\WXZ]dXL_XL#`XyaXb[aY[[beYL ctYL9 dYL'eYZ.fZg!Z+gHZYYgXZZ=gZLDhZMiZKiZQi[`OKih[,Ki[4Ki8\L\iN\L]ku\ZWl\Zan\Tdo\`+o\YYo]Lmo`]L]r]Zzs ^Mt^t^t!^قjt,^YYt^LQtl^Tt^Zt^Zv(_L]w_L$x_Ly_L{ `F^~`T~!`e~,`YY~`LQ~`L$~`[[`b[`m[`T`LQ`L$`[[aT܃D %aZ4aZaLbLLb܃D Zb`]bebm[tbb[b[\bLQbLQbNRQbe&cem4ceyGceyZcemhcece#d0f$d0fdIfd[fdLdLdL ee]eYYjeL-jTkL=LkkV5keSMԄ1؄E߄Q\ 1E|lLYlLblLmlg#lw$mzm0fnL$nLQnnn˅nL-nTssst+&tLQ0t mZ vtLQ~tLtLuk"uLAuL^uLnuLuFuLuLuW]uQvLvqvL7vLMvI Uvnd`v'o[ vL vLvL**w<2w=~B:wBwĆJwqXwL\wLHwM)xLQˍF׍jNjXYYZL]"L8YYL]LPYYXZhZL]WLAmL$=BYY[\L]Lr  YYfL#uL$L3L]*5@YYqZ(Z2L9L]l0itj|jsYYLLILP4֏VA_Oh`>a q0q&xL L  _ h $Z xL]LWOHHYYZ<L]LLE(avYY~Ll L\L]<ZdYYLL[[ [[LD Vd!^!f3!uL"L]%Z&9d'A'Ij'TYY'L'L(8L)*`+.͑,8ё-ؑ.P.L.LI/L1(>a2A2 P33lL4Ԅ5`6͑7 a8a8`8L 8L'9@_<u<hM<M<s<&j<8<L[\<,L2<BL<>|M?ܒ$?$?L\?PM@LQ@C@KA%LYD<LUELQFLmFXL\GLLHTttH\zHeG ImM IvғG J~M J{KK]LsLsMsMNO'EP6QEQERTES'dT4tTɔUєVWXYZ$0[p<]H^LQ_[[_ZcagQiLQiH[[imZn,rHauwh|LQLy[j[\LQTʕ ʕX OOՕڕoL~ OOՕڕLQL#L(LQ L#L(L -^Q:Ls#+U Mi>ciQPlUU640f=5+CJ8C_FuOdIPPӖPW1CF"]^0fW LQLei72 L-LQL#L(>v LQL#L('LZ<bQjrL\MMԄƗϗB֗B mܗQ\L lM m>LJLn ԄP֗B%Ɨ=ϗBaLpLL  + Ԅ@ 'A ƗV 1t ֗B4 ϗB@ M [ԄƗ miϗpw~` L\ L M [\ LQ L @ M [ n Ԅ4 Ɨ]  m i ϗ p w$ ~L\L  M LL# L,"@/M6[@ј7Ԅ$Ɨ0 miϗp8wH~T\dlt |L\LAMOLh,NLV WO^! O!O!U#U$O'Oe'NRQ((T(L(k O)O)U+U,O/pOe/NRQ0T=0^k1LQ3p13^k4LQ6 O6O6R8kV58eSM;U@tBWVjBIVjCNRQDLDRE$OE OG *RGRGARGgNRQKKMLPQRQ\OQ OS RS kV5S. eSMV@ U[z NRQ] t] WVj] IVj^ _@#|b%f(%Tf4%Of%g &LQgO)g+h&O)hl&+i'LQi%'LQi4' Oi;' *Ri>'RiD'Oi'ARk (NRQo (SoH(p(t[)tx)z)LQ}) O}) *R})R})O}y*AR*NRQ*HT+R`,R,qq - -5pP-Apt-T-LQ-O. O. *R$.AR.NRQ.R.HT?R@RL@@AxAo\Bo>C xC-C]TCOT dT eLQ(eLeOecUeUFf&qjfUfU(gNRQgARQ=kXGk[Tk_$rkd$k:$kA$lTlLQlLtmO{mcUmUmUn&qZKLhyƬج[[b[ 8T QZ `Z L L L] Fnd Nd Vd `YY L L ׮L L L L' (Z M  ,>+ G YY İL L] $Z 4Z( M } / YY ѱZ; ZB L$ ` `  ` 0` 9 a A a N`K Xm[ b[ (L lQ! 7a! F[\" >a" SL" p>a# ӵYY# ۵LQ#  Q# # $# 1$# >$$ HT% dLQ% lLd%  i& ɔk& xQ' Ļxy' 1 M( > s( P ( ] ( j j( | j( ( 4O(  Σ( ɼ ݣ( (  {(  ( /[ ( L ( /( 4C( A^( Pxq( ޾hM)  ) M) L\) PM* [\* pO* 0w+ - [[M- 2 ZM2 7 [[M7 < ZM< LQA TA LQA LT A TԄ1B d؄EC ߄QD \D :E  aG `G  G  AG 1G 0EH  TI LQI yI yN yS 4LQX <X XY ƥZ \L^ kL_ yL` La F^b ҥb hMb xL\b Mc c p mZ e LQh Lh A al P l ɔp ɔq LQr r r r Lr L%u  Ow Ow PLy { U| U} tNRQ O Oe  L  L L q #L4 3L< OQD Wnd `'oJ L^ Qf L\ Ll M 3L OL py   T $ 3L EL X }y   Q O Q R &LQ O O + U U U NRQ .L XY ҆ <P `P P P P O) <+ LQ O e LQ $O ! O (Օ ڕ = #L XLQ @T xLQ L _ O fcU jqU pU NRQ hU U <ç AR (T D pT V @ t(V = O d y D  4  Ǩ ۨ   LQ ^D ^  v L ^D ^  v )LQ 6L P Q d i ~5q E{ Z s  T LQ  LL L L [L x LQ L $0f 0f T0f  L L L  ,W 4W F8  N\/ VJ mM zLQ L# L( LQ! L#! L(" L-$ L" % ۜ( ( c( $M( ,[[( L-) q. * L+ LC- / / 5L0 AL2 Tnj74 L#4 L8 5 7 7 $7 -7 8T8 ZC 8 ZM : L]; LT < L\ > `Lg A pLo C L#F Lz G 4LI CL K SL N d? Q L S I|W &|W 8 W YYX L X Q Z L \ Q ] \ ^ nV ` P a $[\ e 8[\g JLQg ^ g g˭mh pխ i ~ j խ k  l ]m  n  q !t !x "!{  )!| LQ| "1/!| ,} `6! e=!  ˭f ; H SP "! eD! LQ T 4 L] !LJ! K!L V!ZW! d!Za! !ͮ !֮ ! !YY H"L h"L] "Zh! # #W] $#YY P#Zo! `#Zy! #L! #L] $M $T $f $v $YY u%T %Z! %Z! %LS &L] d&ίd l&߯j t&YY &Z! &Z! 'L! &'L] a'! i'.! t'YY 'L ',Q (` %(` ;(a Q([[ t(Z! (Z! (L] ,* Ѱd 4*  <* D*L! d*YY *T +Z! X+L] +LV +LE D,`O^ ,YY ,Z! ,Z" ,L" T-L] -n -n .n .YY d.L(" |.^ /a /L4" /L] b0Z@" p0ZJ" 0Duj 0x 0Q" 0YY @1LD `1M h1b" 18K 02h" |2ֱK 2L 2D a D ^Q 2L 2Ls" 3a 3D &3^Q .3$$ P3-$ 3< 3IQ 4L 4Ls" -4L >4Ls" Q4UD c4U{" |4U" 4L" 4a 5^ 5^Q 5LQ 5L# 5L( 6LQ 6L# 6L( 6L *6LI 86Ls" 6e^ 6q^ 6}^ 6^7 6^7 6^ 6^ 7^; 7^ 7^ 7^Q 7a 7UQ {8Q 8^Q 8" V9" t9 " 9" t@" A7" #BC" zBLQ PBT BLQ B^" Bo" C" CT 'CLQ /CL# 8CL( BCL# RCL" bC jCL  xCL# E۴ # EYW !EW .EX ;E`O IE, XEMQ  L] nLl  }L\  d" +" YY" Z"&" BZ)&# PL]% ϏL3&& ]- ( W( b( YY( TL]( - ) н) t) YY) ZG&) DL* L]+ OLN&, YLU&- oM/ wLo/ L]&0 Le&2 &7#3 <- 3 Kl&3 ȔYY3 x&3 T6 &6 (&7 Q8 m9 : &: ڗLQ< Q&< Ͼ&< LQ< LQ< Ͼ&< uT< LQ< Ͼ&< T< LQ< Ͼ&< mT< yLQ< Ͼ&< T< LQ< Ͼ&< eT< qLQ< |Ͼ&< T< LQ< Ͼ&< ]T< iLQ< tϾ&< ٛT< LQ< Ͼ&< UT< aLQ< lϾ&< ќT< ݜLQ< Ͼ&< MT< YLQ< dϾ&< ɝT< ՝LQ< Ͼ&< ET< QLQ< \Ͼ&< T< ОZ&< L]= YL\> od@ wH+@ YY@ ϟZ&@ Z&B 2L&C VL]E &F &F YYF Z&F XLQG gL'G ;'H YYH <^H Q'H Z'J ¡Z&'L LM L-'O @b[R m[S  <^S lS Ȣ S ˢwS Q'S P[\U LU L-'W L$Z [[[ 3L6'\ PL_ [La hL-'c Ԥf g g ƿg wg w>'g P[[h b[i ȥm[j ZJ'j TLQ'k L]q Mr YWg'r Nr ƧZr Χjjr ֧~r ާr YYr L r L9 s Ls't ΨL'u ݨZz'v Z'x E+y M'y YYy L'y L]| Z'} $Z' qM y<'  قj YY ԪZ' &L] RL hYd pf xYY L' ѫh' uC h' uJ LQ L ȬL' ?e^ Bq^ E}^ H^7 L^7 P^ R^ T^; X^ \^ u^Q a ^Q a LQ B['  +' < I X[[' [[' Z' Z' (Z xZ' LQ T LQ L# L( L- ȰL( ,Bi. tU Mi ̱ciQ U (U hpO ( i7 i 0i( IJi" ԲM [[ L$ L( *L 4L(  h ܴ!( @ Q '( , .( ^ 6( ķ$ %$ 4 m;( ȸ,E( pp'( hL\ M L [\ LL( Q L\ һLV( M Le # ,L\ RL]( pM L ݼR  O  *R R AR -NRQ \O Dd( R TR LQ 9To( U ҆y P (P LP P P O 6kT U}T th}( u( AR( LQ  O O BkT O}T \AR ( ( %LQ 8L( fL( O( R( 8R( ( AR H(( Z4( l?( E( N($ pW() $c(. Ln(0 ty)3 )6 `S9 ; ? LQC OC @ OE G *RE JRE PARE NRQI TI |OI cUI LQI L )I dUJ UL &qM UP NRQR K R % T % W % Z N% ] % ` ARQc L)c IPf bPf kPf sPf Yf lf Mf M)f Lg L]i )m p p ,p dMp Lq Ls i7u xq. u Lv LCx Zz Lz wL&{ L,)| L5)~  0i( W] 7 sP7 : D[[ L- L *~y G T a! n, v? ~R  l M [[ Օ{) L !a D^    ) 8|) ^Q L) a h^  L L) l L] d Q YY L) L) L) ![ $!YY U!L$ d!L) ~!#B !YY !LQ !T !Z) !Z) "L] d#M x#X #s #{ #] #j) #x) #s #ɠf #{ # # N #YY #Z) ,$L) $L $L# $L] B%- J% R% l%) %YY <&[\ &Z) &Z* D'L] 'L * \()* p(9| ( a (a (YY (L] (L )k /) =)C H)Q>' )YY 00LQ )T 80Z, 0L, 0L] w1M 1s 1ɠf 1{ 1YY 1L, (2L] 2Z, 2Z, F33$ N3>, V3M ^3\ f3k p3YY 3L] 4L, 65Z- U5- ]5- e5$y p5YY 6Z- X6L] 6L 6L"- 7LE (7L.- 7WO 8H \8YY 8Z@- 8L] 9LG- 9LN- 9X- 9^- 9YY :Zp- l:L] ;Lw- D;LE ;,- ;YY ;Z- F<Z- T<L# <Ly <L <Dj =6j =W- 8= q>I |>Z > >[[ >b[ >m[ ?[\ ?L- "?܃D ,?YY x?LI ?a ?^ 4@ @T @Z- @L' @Ly 4AZ- A Axj 0BYY 8BZ- HBZ- BL] CL- C a !Ca .C`- AC- JCYY RCL(" aC܃D pCYY KLQ KT KLQ KL- LL L$ LQ L-G L=M LM LYY Le Lv LLLtLzLMA MMAM;*MX8Mu@MAIMQM\ML\XOT P[[OP hPZ QaQLQQLEQ`QZ./RLQ7RL.TRL]R#.RR{RYYSTY ).YLYL]YLYL3.<[ #N[pO#\[pO#\B.$D\wgL.&\'u]NW.(}]L\.(]a1)(_ab.*`Ym..ajv.0aһ#3bx#4$b5b.6bL.6bL.7b>a9dH9d.:xe.<e.=eL.>f.?Pf .@f".Af;.BgE.C@iQ.Elib&Fiu.GbjLQH`jTHjjLHyjL/Ijc~jKjKjv~KjL/Kj!/L kLkhML"kL*k'/M4k./O;k6/ROkT_k6/W~kYk=/\k^k+=/aLl+cl7D/flAJ/glLJ/h,mWP/ixmV/jmb^/lmbg/nmop/pm|v/qn/uSoLQy[oydoL/yoL/}o OpOTqLqqUqUrNRQlrOtOexx,x/lxH%XyL/ny OyOzUzU$zOzOeT{NRQkka{L/{{(|k5|k@||L/ }Lt v}Q~}L/}Q}L\}L/}M}LI~RT~O~ O~ *R~R~ARSNRQ{LQL$'VLQL$V)d'VLȀOJ OXՕڕ5LQD/pOQ͇ OԇO`/ЈeS5CNRQRZS0](mLQLQL/ˉO؉OR WVjIVj%kV58kV/eSeSMUDUUNRQ̋M L\dLQlL-L lQMԌ[[L/v/v[[L\MLL 00M> KT"LQ*qU%06qU,0Df30Z<0ZF0 L],L8LT ؑLg p}M0YYQV0(TZa0xZh0L#Ŗ͖Lܖr0y0 \[[ m[ b[ 2[\<)'ETVL#`T$L0L#L0Z0GYYTydZ0L]L0 dYYH[\dTL L0L9 ԝl 0@\xP!LQ!L0!L])ܟ~y*aQ**H*S*^* l*z*YY*Z1*L]+PL1,kL1.z00YY0L]0 L!11$)126YY2CYa512ZYa>13rLQ5{L5L6âL7ТLH18<[[:T;ȣL;أ,Q<`<)`=?a=U[[=xZP1>ޤZW1?LAfLdBuLa1Cj1EEYYEHZ{1EL]FLGKL1I}0iKCKYYKZ1K+Z1L8LNOL#OlyPtP[[Pb[Q¨m[RϨZ1RL]S:L1TUL1VkzXssX|YYXLDXMY}YQYLQY.NRQYFemYTխyZgy[z1\1_1cЪx1fpe#gԫfhfkfnfq(0f1t40f1u)!wIf1w[fyL#yd1z1{UL]|iL1}LQ LmL10Z`ZZ2LTL2L2yyCsiLLвL\ML\,L22;24"D2,<"LT|LQ[['[['[[K2 Z'/Z8Z'ZLQdU2[\]2,Lg2<Lr2@TDIdDRl$[$d$mAv0f2tLQ|L#L(LQT222~2&2L2L2\2\2'LQ/TTp2dp222_v2LLQL22k2  &(`L243H 3,\3p3H|#9%3w3aa,373(G3LLML\߄Q`,U3`U3Z3!LQ? 0g0fe3LQLo3L3L3 YL3L3L3L3L3'L40L"4;@GkGGi7G"@4G0G<GOF4G^M4H\pU4IML[[Ly^4M,q4RLXL *YLZ@4[4[<\LM\l[[\4]\4_L4aMbdbNjbobLNbYhMbaLQbiLQbt0f4bLQd  mZ d| 4g $4lo LQow  Oo Oo Oq Or LQu L4u ~yx ?x( L\xx My L0y aQ n n `g nL\M@L4PL4tQLL(L\L4$M8LfqxYL\L4ML4QSL ORO0QNRQNRAkV5 eSMPUtWVjIVj5 5L5VR`O O *RRAR RRNRQUF OM+TO" PNRQU!U"LQ"O0"efr"LQ|"|p"5#O $NRQ $ O$ *R$R$AR$2 $Rwl'Rwl+LQP+Tt+LQ|+O+ O+ *R+R+AR+NRQ+LQQ,OX,NRQZ,R`,HT1R2R2*53*54p  5pj(5pjx5pj5|p C7LQL7O7 O7 *R7R7AR;8NRQ@8p9p:R 8AR jT8kL45PklkLQkU$k|k[lNRQlLE5%lLl 4lL' Cl SlQ [lYY clNRQ |lf lf m&m0f9mLQXmY4nLQ {L(">{>a?({YY?<{T? ).?A436BD=6DLQILQI L#IL(JLN6L3LNBLOXLEP aQ!aQ.Q@ QKV6RX]6T\e6Wăl6X\s6YlMZ[[Zx6[xx6]LN6_La Lb LEc܆ adadd dV6e ]6g$4j6k s6l0MmP[[m̉.6n<?6pL-r|`6s͑6t auauu‹Suϋk6uk6vvmx8vyA"!zL6{|0f60f60f6[fLQL660LQ8L#AL(L7̏7,)767 5H7`@Q7DZ7Ja7tSk7ԔYs7_}7p7~7877 V7'LQhT/L7>^Pau^Qdp/ěv7LQ  OOOlO0PWLQ_L7nL8L8nBL\L8ML5jRtO O7 *R:RDARNRQ>LPL5 O=O+(UU<UNRQO)$+¬)8̬48<>8%LQ T-OM OT *RWR\ARENRQH D8D8I8)(I845N8dAU8pjܱ9T]8Md8/Xd8$LQT, O4OkT}T ARLQ L  O R O `kT }T s$ yAR7UtCUT LQ(Lq81O8cU<UNRQ?LQ\Lx8OcUUVU&qU!NRQ#K #% %% (% +N% .% 1ARQ4(O4LR5LQ6~86LQ7L8788~89L#:L;L8<1L8>@L8@OLB]L8CL8EL GMH84H,HX`OI,JK38K\/KMKE8K`T8M<TQHTQ1V QL8R8SV T g9UALQVILQVT0f9Vw)X+LY7LW[H[]L]|9^jL9^L 9`kb[jbMbL\b z(9c`LQdze=!d e˭mf; g; hH iH jmk l"!mnHZ69nL]o$Lg pL=9rus}sYYsLQsSE9s x&t0Tw&w$&xMyiz{{LQ{Ͼ&{ T{LQ{$Ͼ&{T{LQ{Ͼ&{-T{9LQ{DϾ&{T{LQ{Ͼ&{<T{HLQ{PϾ&{T{LQ{Ͼ&{YT{eLQ{pϾ&{T{LQ{Ͼ&{eT{qLQ{|Ͼ&{T{LQ{Ͼ&{qT{}LQ{Ͼ&{T{LQ{ Ͼ&{} T{ LQ{ Ͼ&{ T{ LQ{$ Ͼ&{ T{ LQ{ Ͼ&{& T{2 LQ{< Ͼ&{ T{ LQ{ Ͼ&{: T{F LQ{P Ͼ&{ T{ LQ{ Ͼ&{C T{O LQ{X Ͼ&{ T{ LQ{ Ͼ&{WT{cLQ{lϾ&{T{LQ{Ͼ&{mT{yLQ{Ͼ&{T{LQ{Ͼ&{nT{zLQ{Ͼ&{T{LQ{Ͼ&{fT{rLQ{|Ͼ&{T{LQ{Ͼ&{hT{tLQ{|Ͼ&{T{LQ{Ͼ&{jT{vLQ{Ͼ&{T{Z9{RL9|]L9~|L]<cDsL{TYY<LQTDZ9L]L)#WO9hHYYZ9\L]Ll L9d-YYLZ9L]L\JdR0\YYZ9L]L9LEx9VYYdZ9L]JL9UL9E{jYYZ:Z :LL#y[[b[Z:sZ:LL#y[[b[T!LQ T\!Z<:!LC:"ޛV:P#h:#L]$M$\$/$\$$]$YY%L %L9 &L' &Zo:&&+&YY&L] 'Z{:'Z:j'L:':'قj'YY'L:p(L])Z: )Z:m)Mu)%b"})8)K:)d)YY1*~\:8*LQ@*L=p*kV5*eSM+LQ+T :o:1:{:@::@:?J)? O0?qU3?cUA?UO?U`?U?NRQ?LQ?LQ?j;Cj; Cj;CL,;CJYD CCpO0DLDDaDE^E [8;$A;0N; <BEnEIFL\*FLV;RFMkFLQsFLQZ];|F0N;yGL GnG<BG[G8;G$A;GZ];xHL\HLl;HMHLx;HL; IL;,IL; I<BI[I8;JylJD;JY; K$A;$KZ];KLL\LL;*MMNMVMkMsM{M MMĆM$M^@NN$"gO#oOLQ#PLQ#P#pQ$Qk%Qk&RL;)S";+ S+SL+ SL;-YSn0aS=~0iS>0tSL\0SL;1SM2SL2TL;3TL55$TL;7T O:TO:JU+;TUU;UU<pVU?}WNRQAWL5AXOCX OEX *REXREXARE~YNRQIYVIYLJYL;KYL $>&4#>*d-,; >,\J>/iT1T4]$5g$6@s'>7l}#9,Q;.>;4>=Q?xQ?4Q?±<>?AB4jC><>DX<>GXQJT#jJP0jKԼ=jL;C>MI"PXKL>RX"XLYC>Yx"\"_YLX>aLQfa>fLg>g2i:jTj LQj`jTj$LQj,j/NRQj1 j=TjLTjq>j82k\x>lLQm5#mBAnfofr)0f}>u40f>wLQzL>zL>{`>|͑>}$ a~.a~8~HL3~lL3>>>>iLQqL#zL(L%L/L> OOUUNRQOOepH%wL/ OO%U3UDOOe8NRQHT>|eXLQL;L(O|IVjWVjkV5PeSM8UPL>m ?u?a^^a7e^T}^qq^~^7^7^^Q^Q^;^O)+OLQWLlO OՕڕILQQ OX *R[RdOARNRQ HTxRR0qq U |5pApTO OՕ ڕd=LLQTLQ p pj <:j tpj pj ,|p LQO O *RRARNRQp(p8R R XTL-L$S$[[8L-L?M"i7"Y" "j;"[["SL-#L?$ l(M([[(7=~)Dn)Qn)^)kL)|L$?*L-?, <. q. YY. LQ. T. LG?.d L]1|ZT?2a3m3x3YY3pZ[?3L9 4Lm5YY6DZb?6Zi?7L9L#:L=;y==0[[=@m[>Pb[>|?Ls?@[\ALs?A[\BL$BLPC[\DLQDLTDZz?DBL?EQL#Fe qGmYYG|Z?GL]HHL?IlUKtNjKYYKLKL6'MsPPvP[[P b[Qhm[RZ?RZ?TL]ULYYVxLDVdW vWZ?XL]YL\Zd\H+\YY\?\bQ\xE?\hL`LIaac<Qd_^QdUQd^QddQd dQdP &dQd !Qd`! ?d!rdi!]dQj,"#j"$l"*$m!#3#n,#>Qp)LQp)c >pD+n >s+t?v+y >y.Q|$4Q|4Q|5.>|8Q~8Q~:^~:^;:^:^:e^:q^:}^:^7:^7:^:LQ M s j j { ]~?~?[  iɔkxQxy4OpOM:L ;L;L,;L?; M; s; {; ] < j< j<[ < i<ɔk<xQ<xy'=4O<=pO=M=hM>~?\>~?>L\?M?L$ ?YY-?LQ6?LAH??t???@=@@E@@T@ Cd@?A JATALQA @Bf "@Fq 9@HG H@IH ]@hH $ZeLQdTbeLQje[['xe[[e[['e[[K2eZ'eZ,fZ':fTFfLQNf n@ef n@nf v@f n@f v@f[\~@@gM@sgL'gL@gL@g g @ h jh @*hQsj@4Vj@ijJ xje6jMj[[dkX @kh @GlL@]lL@lL@li7l"@4lsAlLAlLA4mv&mv/$m Qtn^QnL`oLAo HpQyQyQ\zQzQ${Ah|$}2}<A} OD }`A} sD }Ai~^Q {~A ~^Q ~T ~LA ~Q ~L 0 OGPO+UUĀU*NRQQLAnva^^a7e^T}^qq^~^7^7^^Q ^Q ^; ς^"O#. O%5 *R%8R%<AR%NRQ)8 )qq *Ѝ ,5p.Ap0@Rw3tRw7xG);ԨK)?8O)CS)GW)Kt[)O_)Shc)Wg)[Tk)_Ьo)cTs)gĭw)k8{)o)s()wQ{8Q{LQ{ѰT{ O{O{RkT}_}T}lAR}8(LQAAֲAA qq((,qAVqAAAA/OQ/ O8OĶ/4eS5NRQZS0LQOLRLQLBȸLB޸^D ^ v(q. FLQLCa&tL-ĹL[[['[[BBL-qLl[[ZBL]L$B-B?̻YYLmL9B-LDL0ZABZHB<^z+ [\HԿ))`RBXBRB"YY@ZaBZhBLoLrB ]+(YY0Z~BZBLBL#yYYZBL]LBH=PQsdXs` @h p"=xM  NYYZBL](Q YYTLQPTZBLL]W] YYLZBL]iLBYYi "jq |8BKB  ](TZBbL?qL# YYZCL]L C$.CYYLZCL]bLmL$C0i%17#YY@TVL("e>arYYZ0CZ7CLL#"L=Zybt[[b[fL(">a YY LQ(PC<wgL. LQ T LY  [\ 5ZZC DZdC LL9 L 8f@YYML9 `kCL?$bsCmsCPxzCCLQ8T LaH^s$ T!LQ!LC!a"m"x"C"([\#LQ#T#l2#2%C&C(C*C.C2C5eC8eC:C<C>LQ@T@tD@t DAhBUDCLQDTDD1:ElDEl%DFGU,DHLQILAIһ4DJv>DNvJDSYvWDXu^Q[LgD[VoD\L7\^]a$`aa^Qb&^Qb3O b@m edm i m nLQnLnLpkPtQtL/tLt vVx`$DxLzL |LDLDLDLDn=~n0>&nD0L\VLDMO QQRLLQTLQaL#O)p+oV LQLDOcUU<NRQLQLD O cU U &q& UT U NRQ ARQ X[ _$>d$[:$sA$TLQLD<OCcUHUU&qU`NRQqq 9T% p% p% ARQLQL#L(L-L#[[$L-L5JL[[wDLh#LD4XEoZ EZELoL]r- &7#Kl&YYJLQde=!m v˭m; ; H H m tZEL$L#E3 ; CYYhZ2EZ9ELL]L55 YY@ [\ ZCE ZME!L!L]q!cy!l!YY!ZTE "L]"L[E"YYa#ܒeEi#eEq#L]##YY#ZqE($L]%LxE5%LEY% a% )i% @q% P7#|%YY6&L$T&L&L&ZE"'LU'YY]'El' ' ' x'ZEP(L](L\ (d )  )YY 8)ZE )L] L*LE i*bEq*mEy*yE*YY$+ZEx+L]+LF,LEd,F,YY,ZF'-ZF7-ZFD-LU-LAn-|-[[-b[-m[-[\-T.Z,F$.Z6Fv.L .L] .BF!.HF!.YY!.ZF!4/L"=/LE#R/L'$[/L%i/&q/`&/`&/ |&<0[[&41LQ'<1L#'E1L((O1LgF*h1LoF+1`vF,1͑vF-1 a.1a.1.1LF.1!//1-/&2Mj/82\G /^2k/k2hM/s2LF/2L02L12L23;3P3M3n3T33IF33v33hM33O344O3<4KO|34WO35`O3h5X4|5pO46M56nF5F6F9p6F=6LQA6 OA7OA7OCT8OD|9LQG9LFG9LFI9QDK9ndK9'oJK:L L :LFOz:nS:nS:=~S:nFS:L\S:LFT:MU";LUW; OVn;RVt;OVs=tX=IVjX=WVjY=kV5Z=eSM]=5bp>Ue?NRQg?NRAgH@whAFltAnAoAFpPB(rBTs0CLQsC GsCOtbD OuiD+ulD u4E wE|E~E%G8FUFUGUHNRQHLHLQH OH *RHRHO8IARYINRQ\IHTJRDKRKqqGLG0L5pN8dLAp"GLTLLQLL*GM OMcUMqUMUXNUNUOFPO QXRaQ\TARQ`V&q"GVUVUQVU@WNRQwTExL8Tx~8\xLv6G^QxL-x[[xTDyZ,a^^QSLQ(T\L]L LL*5<==~BEMĆUq`YYZGL'8LyZG!4DjYY[\ZGL] G"GULGiLwYYL#TL#ZHLH L]"D!"YY݋LQ",H$Z7HsL>HL]MWHNZƍjj΍~֍YYZcHގLQLjH8L]0i}  ##YYTLZzH\ZHLHLHL]LT"\B#dYY&LQT0ZHL9 L[jYYZHL]LHLHN$Hĕa$X-̕YY ZHtL]Ll LH /$d 7$ @YY L(" >a YY LQ T H H7ILQTT"[ 4HH{L1LHL]Z IZIݝMsvقjYYpLQNRQ1˭ўeey ey! e#"p"I#-%` $f%f(0f)I+ȟ0f1I,[f.ML4CI?Tx&I@LQATAzLQAAӭ1:B߭&IB&IC6DP&x>ELIFaNIGʺ&IHܺJII8&IJt&7J&J&jJܻ '7J&'7J,;'EJTV'EJ|v'EJ'J̼'JJ'IJ aJaJNJLJ #L+NUQMiR־ciQSSUTUU\'IXt(IY6Z0f=[(J[ ( J](J_(!JaLjg b-(*Jc(;(5JePpigi. iTjLHJjS(RJl`(emi7np([JnldJo(lJpLQq ZtJqL(s@L~Ju`(~Jv{(JwԄJxԄJyϗJzƗJzƗJ{C mJ|o mJ}iJ~iJJ(J(J*(@py}(7([\L\M LYOh OuZS0eS5NRQL#q5Y@L\fLJMO)+LQTL҆LPXPPP`PO2 O<ZS0eS5NRQS lC)J0SJU eSU)Qb)b)6(LQzTXT8LQ\O O *RRAR]NRQ` ) p) m )EOQ OX *R[R`ARNRQ|pJ**JLQPTOORARZNRQ\LQdLQLJO cUUz&qUUDNRQ9TppARQu O| cU LQ LJD U U &q U NRQ. K @ % G % Q % Y N% c |    N Q U Y%0 ]+P ARQ1# L)10 M)4w LQ5 L5 Л$6 *A7 M8 vK8 vK; v8? vKA L'KD  aH ^I* ^QL^ LLl LMz L N vO \/O MO L-O1 LPE lQL MQx [[Q QR L]R *S )S  NSD YYSL Z7KS\ ZAKU L]V MW XW$ {W, ]W4 M)W< \)WD  {\L ZUK\ L?] L]^N L#_\ L\K`r ?+bz M+b Y+Bb YYb8 ZfKb L$c  L#dS +ec +eu +e YYe ZmKe L]f g g YYg L\g! L#i4! L]j! ZtKk! YYl " L]ly" Ll m" LHn" Z{Kp" +,dq" @,q" YYq# ZKq(# ZKsu# L t# L]w$ nx#$ nx0$ =~x@$ YYxx$ ZKx$ L]yl% L0z% YY|% [\|% ZK|$& L]}& LK~& ,K& kP& sP& YYB' ZKP' ZK' LK' L]2( NK:( ,KB( ,J( R( 4OZ( {b( WOj( B#t( YY( ZK,) L]) LG-) LK) ,X-) 17#) YYH* ZK* ZL* L* L#* y* b[&+ [[@+ YaLW+ YaLo+ LQw+ L+ L+ LH1+ [[$, T0, Ya(LG, LQO, LX, La, Ll, [[, T- L6L- hM- M- pOe. Mr. . Mj. \G . -H/ *-=L/ 0 @-@0 4OR0 ΣZ0 ݣq0 0 L\0 M0 [\X4 l4 64 O-FL5 LQ(5 <p/P5 o%p5 NL5 VL5 [-`L5 LrL6 L6 L06 c-yL6 F^6 u- 7 -L57 RL@7 MLe8 Mr8 LQz8 o#8 v#8 L< LQ< TH -LH H 1:H -I -TI -I -I -J .L)J .LRJ $.MbJ $. MrJ $.MJ $.&MO =.2MO J.9MO =.?MP JP LQP L#P L(P LQP L#P L(P LIMP JYD  Q lSMS S.ZMTS LQ\S L#eS L(oS LhMS LS f.oMS f.yMS f.MS f.MT r."! T .M\V 0fMjV 0fMV [f V LM V LMV LMRW .M[ Ta qU$a LQa LMb L#b L"d L!d L"e /M%f L(f L*g LM.g LN0ki /3i /N3i Ԅ(5Hj /N6j /(7k /(8l /9l /&%9m ;@m /$;n /<n (N<n ($N=n /$NA,o (JEo i.NFxq i(Hr 07NIr L\Jds )0(Ks MLt -0LUt yLt 106(Lt A0ANMdu T0ANOv (7Qv d0(Qv h0(Rv l0(Sv p0(T`w {0HNU x 0ZNYx 0FZ { pN\| m`N^| 0kNa| 0sNd@} 07f} 0yNf 0Nkl m(oH ϗph 0pȀ 0p؀ 0Np= 0NqH 1js 1.Nt 1(vЃ 1!(wD Nx Nz 1N{0 +1N~p @1NX K1` ƗNȇ Ɨ(T Y1Nv  e1 N) [\4 [\ y1NH 1N| 1N، 1h 6(ԍ 1( 1(8 %N 1N N 1No O qU cȖ U U U2 NRQJ LQh L Ȓ  k k 1 1 1- L#C LY  2a 2i 27q 27| L\͔ M LN Qf! L/@ H L\n LN M O Q Q R% LQ- LQ5 L#> L(H L\ L;p L5| L; O O + Uh U, U NRQ O0 B2N N2N [2N g2O t2F$ eDQ LQY O ԄOؤ eS 2  LQ 2Oާ 2O 2O 2O! 2O6 2OL 2O p%OШ 2 3+O` 3 3Q #3Q |p2Os LQ L$ O< OC *RF RP AR NRQ pܳ pH R?O R?O Tp Ox O l3A kT }T AR v3(p ~3POd = 3YO LQ L 3 O R IVj WVj O  kV/ X eS  U U NRQ0 LcO 3  3  L) M) LpO v  L|O7 )? Q [[f L-{ YN  ZO  ZO" LO# L% L]'| c( ( 4( YY( ZO( L]) LO* LO. *5O1 0i1 B5j1 X51 YY1K ZO1 L$2 LP3 [\4 L]4I L\5u ZO7 5d8 Q8 YY8 T8R L;8 L]; n< =~< >< YY< LQ<l T< LQ< T< LQ<t T< ZP< L]= L> L$C@ /8C %CK 17#CT YYC ZPC L]D LPE L)PG L7PJ_ 8dMg 8CPMp 8IPM YYM ZVPM0 Z`PO} LgPP L]T2 U: nUG nUT nUd YYU LU L]W ZuPX ZPZI Y[Q "[\ YY[ LP[ L]_Y ZP`h ZPb Mc 8Pc 9jc c %9c YYc` Lcj L-'eu L$h [[iu9y9Svvy9y9c zq]9r9 z zToSvMMv?{999999R999999YNv zNv zBQ99d aBQ99d ao9q}VVVV9VV9V9PQHQPQWQ zQ zr9Q zrQQ zr9Q zrPv9vPv9v UQ99u9R UQv999v999v999QQ99qRSQ99qSnP@cOaPn;~Q UQvv9q99 UQvv9999QQ9QQ UQv999Q99yP::::::::Sc:S9 UQ99":6^R UQv9qv9":v9":vv9q99Ϙvv9qv9(:99UQQ UQ2:2:vv99vv9qv99v9q99vv9q99v99v9q99 UQ2:2:vv99vv9qv99v9q99vv9q99v99v9q99R UQ2:2:vv99v9qv9q99v9qU UQ2:2:vv9qv9qS;99VQV/WW;WP;:K:SP%WsM: WM:_:CYCY zV|Yd\n:96^ z zx:pZZVZd\NDn:: z z za6^6^[:::: za zd\: zց::::d\ zS:Sd\ za zq]q]x]d\V0^6^: z6^V9c9:6^V9cy9: zd\ _0_ zd\__ zd\_``_`` z za:SS: zIa z: zd\danaa\d\ za za6^9:6^V9cV9c6^;q[[9q;0^;0^[ z z; z%;-;0;-;0;!o3;@cFcLcq;;B;I;S;V9c9:6^V9c6^qq]mmrev_;v_;v_;v_;vsvsQQP%W za zd\zqzq6u6uzqn;qqo||VVV9VPVלe{;;;{;;;V;;;;;;SS[[;q;P;PPx;/V jjMPkjjjjk kjj k;h;hJnP;P;;P;PP;P;;[;;n[n[p;7v<9v<97>K<=::<=: za z z:qq]mmreQQP%WB=6^6^ɄE=v99v999K:RK:K:R!0!0P=!0CT>_=e=q m=CY{=en[PP==PP==PAP==AQSQS==l=PnPn;~o;~o;~ol zrq}=VVVV9VV9V`WQPnnP=OaP UQv999Pv999v999SS[SSv;Q9;Q.p========v=99V=== >vv9qϘvv9qv9f<99>>Q.pVQ.pVQQQQ99Ϙvv9qvvPa>v9vv999vd 99ppV؉Q 9Px>/W&>>/>9>?>QsxQsx)4QsxK>Y>Wi>W{>W{>>oS;SiS;SIaPsxIaPsx/WWP>vNv>ϘvNvKmCYhj|݌j%W~\hj|Ќj%W~\hj|݌j %WmwN>mCYoRmCYT|j>mVd\ zd\> za zd\(+d\\j6^6^d\ za z|bqqd\;;@cvu9u9u9aa@c0^[v;u9u9K:d\> zd\TTqqd\ z z::[9qd\/Wnd\ z>aSy9y9@c>R>SSSS(3̒Ԓ> zP>9>cK: z6^6^6^6^6^6^zz>z>>>>>>>`>>N;q/N;q/N/N;q/SN;q/NcN//?? ? ?NcǕVQv9qv9qRQv9qv9q999R|TPTPPSSSSS;>???&??<?K?K?m????;?>?3??C?S?`?QjCY999999Q.pj zSSSQ.pj[Q.pQ.pjSSQ.pQ.pjSSSSSSSSSS zrnQSSSSn7Tn[ zrĘƘɘ̘QĘ[QĘƘɘ̘QSSSSSS zr*DnaBQvv9q%WSBQvv9q%W>n?w?|?n?w? UQv99?99999R UQv999?9?99R UQv99?9":9999v9":N??;QQ UQ?999P?999?999S9S9 UQv999Pv999v999Q.pQ.p:?f<:? UQv999P::::::::Ro??Ro??Ro????????:S9Sc:S9ScϘv9f<99(:99Q.pVQ.pVQQQQϘv9(:f<9999QoQ.pVQ.pVQ.pVQ.pVSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaccVNPVNPE=QsxQsx)4Qsx??//{>/{>?/i>{>/i>{>?@\IaPsxS %W/WSV9c?@V9cSIa/<<@<S[;"@%@N(@(@SvCYʜלSʜלSmCYʜלSʜלSmCYV PmCYV PmCYn;~.pmYcYd\7@?@7@?@G@7@?@d\ z za zzW@m@@@@d\To<z2 z za6^6^[::@>aK:d\|& zd\EN z zd\ za zQd\d\Qd\< z zd\/WVW zd\EN za z~\nznzd\ zd\K:S}d\ zd\~  zd\|A z za:: za znСnСߡd\VVVVVVK:K:Wld\@a z z za:SS:SS zIa@@S   zP%Wv9q99v9q99v9q99v9q99aK:RK:@SK:RVeq}PVeq}PVeq};;;jk kNNDnA zA[n[S<9v99aaRS ARSBQSSvvv9q%WPAll;9Q9nn9Q zrPP==P9P[P==PP==P9qP9PPv9vQvv999SSASAoVVVV9VV9VQ`WQPQv9qv9qPP"AϘ99vv9qĘĘS+A6ACAKAVVv\Av\AvdAa\A\dA</[kAsP6upAwAAAAAAA>AAABsϪ֪ϪVBߪsϪPPWABWAWAV\zzRzzRCYʜלmCY2vNv3?ϘvNvK6^ za zd\{{(22(BB(ԒBԒB(Ԓ'BBz'BԒ'BB(r.Br.BrrADTo6B2Ԓ6B%Wq]AB**:**:**:JB**{{e{6^YBq%Wq]){{d\ŮK:x: zd\ z za z(6Bd\ za zůd\ za z d\VS: z zx:d\ zd\\\ za zSSnnQ.pd\cBV9c6umrd\ za zd\/ z//0^x: zjB//0^x://0^x:xBToToSTo999R99Rݳ6^S;9:6^V9cSVVVd<V!VBBVVBB99R99\vvsԴԴVqBTqBlBBBVVOqBDn{ss{ zBB <[BSBʜʜʜʜʜePVPJnqVJnqJnVvPʜלPvPwvPwz z|B@ zGBBQ99d aQPQQ;~o;~o÷ SS  nP֙ǙP֙Ǚ999999SQcB99qQ UQv999P::::::::QBCƘQQQQQQQQQQQSn:S9RR>R>CR>CC U;?9":?9":?9":cBCCCqvvAy9/>C*Cy9y9y9xBy9xBTo;CYJnJnJnJnqJnqJnV5C=C5CHCSV;6^V9cooonOCTC/N//z|Sza zd\ z zad\q]Fd\ z_Cd\~\  ~\ze{zzfCpC zd\/WW za zd\ zxCx: za z0^ za0^ z:x:0^ za0^ z0^: zx: zNC:: zV $4d\K:aK:6d\ za z zd\ENy9vvy9y9ݳ6^S;9:6^S;SCa[aCNNJnNNJnNNJn999;SS[[;qCJnCC((CCor~<ooorĘĘCĘK:QQ zr.pQ zrRv999 UQNCv999v9997TpSC99cCVVVV9VV9V UQ99":?v U;99":C؉؉R UCCDD9":Vv9":VDqv9":QaQaD D#D(D+DD D#D(D+DD D#D(D+DD D#D(D+D:9f<:9a0D5DaSBQvv9q%Wll[[OTDll[[O[OQQQnQQ zrR UQv999UUQUQv9":v9": UQv999vQAR UQqqv99vv9qv9q99v9":99 zCYQmvN; zND4D4DSaD za zd\{{2r z za [{;E{;E::[vEEs z zd\EE'E.E.E6^.EQvyHQ !(2<d\ zd\zzd\V9E z9E:VS: z zx:FEqvME zd\|_|_ z za:: zd\zqzqd\q]mm**:**:JB**{rev_;v_;v_;v_;QQP_E%Wvy9y9d\gqs9pZVZZ9r9 z zVd<VSVd VJoOoVd NN/N;q/NNN/RϘSPsxPsx)4\\ e=q 999fEtEfEtEVtEVVVVV|EE|EvvEEEEEsEEEEEEEEE_oP9N U<9N zEEE6^D4jjk k k jjk kkEkʜeEEʜeEREʜeEEREʜeEEE RV ʜe E E RV ʜe E E E eeE[qJnPEE FFʜePלS'F;jJn/F/FN7ů7F[n=FSsn*BQ99d a9vy6 zvyHQ nnUX[ zPQWQPQWQ.pQ zrl|Y zrPQR UQDFv99?99999S99;RMF UQv999v999v99999Q9\<vv9`WQPPA UQv999Q.pv999v999 UQv999P::::::::nXRo?nXRo?d ~<QQQP U UQv999[;[;<<dNSZFgF zvrFvrF6^ za zid\ zd\{F{F za zd\ zd\6K:d\aa? rmrd\@a zVVFFjBx:y9cBDD{=e{=eFQP%@999;R>>F>FFjjFJnFFFF;R>>F>FFjjFJnFFFF;SS((BFQEPFQEFQEP{99Rs=Fs*FFs[aGSĘSs=Fns[Gsd<[ĘSasSn[n=Fn*s=FA GGGnSGBGd FG>GIGBGFG>GIGBG UQv9qR UQyv9qv9":v9":Ϙ99Ϙv9(:f<9999QoQ.pVQ.pVQ.pVQ.pVQ.pVQQLGQQS[G[G[GdGdGdGdGdGvvvlGAKGKAAAWGvNv;vv6^v6^ zGq%Wq]))rG{ zd\GGze{zz z]Q]Q{d\K:d\GK:d\/W/W zd\ ` zd\jj zd\ z za:: z za:: z\\\\\@a\CCd\K:d\ zx: zd\ za zɄE=v99v999GVS?999PeGe9GDnTo;QQ.pjV zrG/VnSSQ/V*jG/ zrĘ[SSĘ[SSoĘƘɘ̘SSĘƘɘ̘SSoQ/V*jG/G zrcTo9GN9cll[[On;~n;~< zrRR|RGRG|Qvv999RMF UQv999RR|RGGRGG|Qvv999Q UQ?999P?999?999S9S9S;99VVVVVVV\cc[G[GdGdGvvvGlGJnGAKGJnGH0^H"@%@9 vNvmze{zz za zd\K:d\5CK:d\et~{d\Դkzzzy9HV9cK:d\>> z(//0^x:Jnq/[[JnDn//0^x: z//0^x: z z zaH:: zGGd\//0^x:; zݳd<d<ݳ!BBݳAAݳ#H%BBToO`)H,H/H2H;H>HVaVd V)H,H/H2H;H>HaV[oĘOGHNHUHOnOSd<SS2q]HTo`H#HTodH`HTodH`H#H#HoHAƳyHH%HHBB#Heqz}9SSHsDD+~v6^v6^VSHSMiSSRxʜeEERxʜepEE EEEE999RSRSHRSHfBQvvv9q%WcBCCCq>SBQvv9q%Wd aQR|R UQqqv99v9q9999_o)n nV9cV9c6^6^9:6^QU;?9":?9": UQv999Pv999v999Q.pQ.p:?f<:?Qv9qv9qPP"Ad ~<QQQQP U UQv999[;[;<<CYHmCYjVNmCYnn;~.pml?"d\KSZd\K: z z zaH:: zee zd\zNN:: za zd\d\ zd\/WWHI;B;y9y9HHHq;;B;I;!oS*3;SHHJoHHoSSSHHHHcV9c9:6^V9c6^mmIVIsmm zy9u9Svvy9y9vQS IoaJoRϘĘ I a  SZ]IVgIS)H,H/H;HI V)H,H/H;HVINN;qN/N;q/NNN/SSSSSSSSSSSNNN̴PP{ z;jJnIϪIϪVE V  x VV} JnJnVDnJnDnJn7'ITo9To9To90I;IDnPQSQvv999_ommV9cV9c6^6^9:6^ UQv999PQAQA:?f<:?v999v999SSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJoSSSJo U;99":ĘQQQ.pVQ.pVQAQAQQQQQ.p UQv999vQ;;xBkA6^vNv?CY2mm2CYSm zd\6LIzzz z_CaZI]IbI9ZIbI9]IgIbI >ZI z zx:pI z zx:K:d\ eq  { zd\.EK:Sd\ zd\ z zd\`K:d\< < cB z zaH::cB%WQeD za zFFn;aaOvHaV9cS fEtEVwI9V9wI99qV99qwIPAVPA]PVPP~IP~IVGVSJnXzIJnXzqIJnXzIVJnX;G;xYNvYNI;PK(V2(((JSJSSSSSSSSo22 zR UQvv9q99l|Y zrQSVVVV9VV9V UQv?9999\<v9QC;Q.pQ9 UQv999 Uv<-;PS?999?9?99J UQv999RPv999 UQv999Ϙv9f<99(:99*d<*d<*d<Ϙv9(:f<9999QoQ.pVQ.pVQ.pVQ.pVSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaSSSJoQaq}ADE="J/AB/8JA/A/AV/<AJ<S[;(@HJ\CYQmd\ za zd\ +R zd\{ z#+d\#+-+5+ z]JeJ zd\+pJd\ zd\ , ,, z za znn;~d\ zd\E zd\w,q} za z,e%Wad\ zd\,, z za::9E z9E: z:Sq zs[ScDnDnDnToDnTo;DnJnNNvve=tJDnvSPq}GVVVVVADq}Vq}ADJAD9JVJV9JADaJV999999K(e999nԴԴ"Դ"Դ"JQEzPFQEFQEzP{{{j/JJJ6^J[[9q[9q[/[[/[9qJP(:WQPSS6^J6^2JJd< zJQJ.pJQJ.p6^Q.p22 z6^WQWQPWQP6^6^ĘĘSSJJQ6Ęd<QQ.pVSSJĘSQ.pĘ{/Q.pĘ{/2J(:PĘQ.pooJooOJoOJoJQJ.poK KKJ6^6^6^o6^6^oooovv999SBK[[OlB?2S22 zPQ.pQ zrPv9v99RRR|RGRG|Qvv999`"KP2S0K`2S0K`2S0K2S0Knn`WQPSS6^QSSSSSS3Kd ~<6Kd ?K?KP;3 UQv999[;[;3K3K UQ6^?9qCKIKPKNWKcKRqq UQvv9qv9q33q}ADVNPCYmCY za z]]d\ zd\4| 554| 5 zd\5Q zn;~<d\K:d\<S<S zd\O8c8O8c8q8O8c8q8 za zVnnSd\Vd\ za zߪ8d\ za z0^ za0^ z0^:  DXlt!%&t(*-01|7KLM0MbfXiljlnptqrstttuww XXt$  t   t t td $:;<<@AAAEHIJ$JLQlT VWZd,HDXXX t ttX$ $t  $** 4<=DDFtGHItJtLtMd[[\0\hDjtkHl mtnor|t XXHtH t%X tt $p ),,H.t/01|2d< EEGGJT,UHXXZX[l\ tzD|X}~Ht 0  tt$%lHtLQLQL#L#L#L#L#L#L# L#L#LA!L#)L#1LA9LAAL$ILQ L\iL`QQL#!e^YL&!a [\aLQQԄN LQaL$aԄNatMQaQ MiL#)`IIqMQyMRL#Q\LQL#L(yMRh0CMSyF4yHMSNSySMMYL#NS #NTzL#LQ OGTyLAk:iLQ!^7!a!^i!^LyMTOyOLQOUOUOLQ!LQL#a`a`6aa!^Q!q^!}^!^7!^!^Q!^;!^yMWyL $߄BXyOfXzy^7PjaLYaPYa#P$a\a1~PvZyP|ZyP9MDL#D >D͑ yM~@9aY(S[L#Od\[\yM\[\V y\Y[\V y^yQ0]yO5]yM;]1QJ]1QP]9QyJ.y Rc]y R9A$Rw]YFR}]YQRjyaR@LQԄ#^R\`)^QL#\#^L^߄QԄ#^1a߄Qy RG`aL#L$#^Ora,x>,dbTL$TԄbTXbXvXcXcALQL#LJdXPd YWdY\aLQ[\afYYgOAg߄Q9:aATL(iL$yZ^iQ0]yZyZ|Z`)^aZfaLZBkaQYZ7YLYL >YZgAfjAL$ZRl0Wl`l2[y[c]y%[9MYL(|͑Gn|L#`lo[iov[nod0C[\oL(Y\#Y\Qc\GsY\ $Y\Rsy?s\)L#Y,huO{uL#\FL\Y\v\1Y\L^\L^QQLQL$iLLQO L``\d0}Wb$OINRQ[\,AfLQi1iaYM|+| i2a RNY\ca  :A %a *D %6`           @% D( H+ L. Xl \o `r du hx l{ p~ t x aPa` d h l  T| %6a*   ` F    a K$(04x/  #6      l       % 6 a *   $ ( , 0 4 %8 < @  r w  a    $ad $(, a  4 8 lp7"  a $(","0"4"8"<@DHLP T%X6\a`*dhlpa F$`$% %%%    a %w*`K "h  %'),048 < @ D H?)LD)PI)T')XN)\S)`X)d])hb)lg)pl)tq)xv)*<*a*****+ =+h++++ $,$K,(|,@-D-H-LPT%X-\`-d?) . #0D0tx|0@#2DHLPT"X"\"`"d"hlptx| %6a*$ 2( ?)      %      % !5$!#0(!5|!a!!! ! ! ! ! ";5"@5"F" " " "a""""K" 6"6""6"6"6#7#7<#@#7D#7H#7L#7P#7t# 8x#"8# # #?)P$T$X$\$`$ad$ h$ l$F$L9$*%L9%* %Q9%%%a %Q9$%(%,%a4%V98%<%%@%6H%V9L%P%%T%6\%V9`%d%%h%6p%[9t%|%[9%%`9%e9%`9%e9%j9%o9%t9% %6%%t9% %6%%y9%~9%y9%~9%9%% %&9&&  &d&%:&:'''* ''''' '$'(','0'4'8'<'@'"D'"H'"L'"P'"x'7|'6'3;'2H( L(aP( T(*(=H*L*P*T*X*\*`*d**h*l*p*t*x*"|*"*"*"*"*****"*"*"*"*"****** +%+6+a +*L+*P+T+X+a\+`+d+h+l+p+t+x+ |+++++++++++++"+"+"+"+"+=+L9+=+a+++++++ + + + ++-,=,, , ,,,#,= ,t->.  . $. (. .7?..B?..B?.F. . . /a// /X/?\/?`/d/h/?)l/p/0F0  0 $0 (0a,0004080KT0#2X0\0`0d0h0"l0"p0"t0"x0"|0*0 00#A0&A0)A0,A0/A0l 0o 12A15A18A 1;A1>A1AA1#A1l  1o $1r (1u ,1x 01{ 41~ 81 <1 @1DAD12AH1/AL1DAP1#AT1&AX1)A\1GA`1JAd1MAh1PAl1SAp1VAt1YAx1\A|1_A1bA1eA1hA1kA1nA1qA1tA1wA1zA1l 1o 2A 2A02 2K2222222 2%262a2*22222222333  3%363a`4 44444 4%4a44 4 4 4 4 4 4?)4D)474-4 4AC4FC4 4444 4 4F5 5 5555# 5=$56(5,5 05 45 85 <565% 5( 5. 5vD6  6 <6 @6D66H6L6 P6T6 X6*\6`6d6*h6l66677 747<7p7 7a77 7 4888<8@88FG8aG8G8G9G ;0; d;a;a;?);J;J;J;J< <<>>> >%>6>*>>>? ??)?D) ?7?-? ?AC?FC ? $?(?P?FT? X? \? `?ad?h?l?p?K @O.{.*..s*.30.k*.*.#*.+*..;U.Cy.K*.c*`Q Qc mV>aKa]akaxaaaaaa$b[blb|bbbbbbcc&c2cgc|ccccccccccd&d;d\dedndwddddddddddd ee'eAeGeZefeeeeef!f3fAfRf\fhfnfuf{fffffffffff g#g;gGgdgkgug|gggggggggg hhh%h0h5hNhXhjhzhhhhhhhhiii4i>iDiJiUi_iiiijOjTjljxj~jjjj&k:kIkOkZkokkkkkkkkkkkkl/l=lDlKl]ldlllll mm?mImRmXmqmwmmmmmmn%n-nMnXnqn|nnnnnnnnnnoo&o,o2o8o>oCoIoUoaosooooooooooooppp"p,p3pTp]pip~pppppq*q6qCqKq]q1r>rFrOrrrrrrrrrs ss*s@sZsaskstszsssssssstt#t/tBtYtltytttttttttttttt.uRu^umuuuuuuuuuuuuuuuv+v1v;vBvYvvvvvvvwwwx1x;xxxxyy:yJyryyyyyyzzz`zmzzzzzzzzz{ {{"{-{;{D{l{s{}{{{{{{{{{{||$|5|F|U||||||| }}}2}H}d}t}}}}}}}~~l~}~~~~~~~~~Niou"(.;GSX€Ҁ؀ހ #5;Kǵ!4:FOVai}͂Ԃ $.6DTpʃ҃؃߃ AE[u}ĄՄ݄-3Salwyʆφ%08@IO[`k-3@LX^fltLjֈ#.G_ewÉωډ /;CNYn݊/5IOw+19JQ_it 6LRX{8\ŎΎڎ &.?FQȅՏ!)38F\hnuא9_h|Бߑ  !!"$#%$&%''(()**++,,--..//001228<;>=B@CAIBJDLENGSHUKWO[P]Q_UdViWj[l\s_{`~cdfghijkmnopqrstuvwxyz|~ !#$'+-/2369;ABCDFGLMNOQT[\]^` a c e ghijpt x#|$%'(*+-./01234789:>ADFJKMNQRVW^adfjklmnoprtuv~    !"#$+-138<>?@BCEFKLMQY[\]ikmqvy{~  !"$&'(*23468=>?@ABCDFGIJKLNOPRSUVX[_`ab h i j kmnopquxz|} #%'*0249:;?BKLNQRTUWXZ[\_`gioqrstwx|}~    $%(*+,-./069:;=ABCDPSWXYZ[]^_dfijklmop r svwxz{|}#~$%'(,/6:=>@BCDHILMOPSTUVXZ[\]^_adklmortvy{N !N6N@NFNNNN wOOOOOOPPQ QQ L'?Q QQ QQ_QQRRPTRPTRRRPPPTRPOUPPP9V PPPPRi*N XXXXX YY"0Y"YpYv[[p%[5[[N]$!].]3]]]]]Q^ W^1^^^^B_Bn_ ~_v_p_'a.a3a 8a apa1!].]^^^^B_B^^^^B_Bqff3 gN `jo mju {j jBjjN jFl jBPl`lYo ll * llYT m m 7Tnnn, PQd 8opRoRRPo o ^^^^B_BPPPTRPPPTRPTRPP '  t ' ]tJ t t ttt?u uphu" )vBvVvv^^^^B_Bvx1w 7w /G6yHyTyayhyyQy y Rz_z wzpz z1 S{[{3 Nj#]Ct{| |NNm|{|mjH}Y}Q}T}AQ7Tp~~!Ł΁1Nmpu1N 5vW^r'aqf  8[ Qd 8opʆOpUІpPTRPPPXXXXXY0Y(BN {j jB`jo mju jB*Qy*{j `jo mju jBv vXGL"SZmjvvt@pGpSGpSv.a .a3a 8a t  j#]t[PPjB:lV{ʆOQ  n   ! $ ' PPPPTRPPTRPTRPTRPP8a :l XXXX9F & IN Yo Fl :0*7Tpɞ [mjup~ϟp՟ޟpQ14Gp4Tvup~Ng;[OOOJ "} !fmje8opp+pNŁR1NԢ5.a3a 8a 'aTN tƤФ٤ |8a  apW^ 3a P˦ QS8opQsRPPPXX$59& N (BNpv1!D!.a8a p(<7TnnhuvW"Nn"^^^^B_B #i*Y"0Y"N#=#i#.a#.a# <tPL'Qp y$S p :$ RPTRP%GBn"* lBl,p81]3 pw޽3 N `=#r3 r&ɾQ&GpT1"&<&3K'Q^ Q^ ٿ Ni*m'%[v΁1('NF'vup~^^^^B_BjB{j mju `jo 3 ^ QPTRPPTRPQ QQ Y*=jB mju QB yeu|*pQ[-UN tC]))tJ |NN3 3a 8a NtJ |,,,--hy.d-4j-q~3a 8a .a- .):MfC..~~ PPQQPTRPPP*Qv0N X @pyQez.a8a p1mjztNqf[ %[[t8a @..a`3.`ljBFZ4N OOPyLQ7Tnwz}Q  Y Q_PPTRPPTRPTRPPTR[ Q o5N t]))tJ CQp,'L?vW"Q^ 3a 8a 3a 8a .a63a 8a  qfPnUPTRPPTRPPPPN o8$5e v[v0Bɾ|Gp-GpW[{N]Ԣ5!]3]Ł΁1:vN:y:Z;P OUnXnOU OU  ! $ ' Іp FZ;-7Tp PPTRPPTRRYp 8a N XX Yɾ)<CN ]))W^< 5N=6Np@NFN=NNbpɾN#=#mjN:.a>3a 8a  PPQ^^^^B_BPPTRPPTRN jBYo *p7TnʆO[O9. GpGpT1^^^^B_BN tƤФj#]N tj#]ƤФ4 ^;@> ?@ttF @N!N>@:ljBFZ4 AH@An"0An"QP^^^^B_BPTRPP[3B'LQ^ z1]1=tpt^;@> /=@NF NNtvf?mjN#=#   Z;m Q7Tpn6  nDRPPP3 `=#r&kEkE\dw=#E Hy'p7EEE+NFTF.a}F3a 8a   N OePQS8op7TnpnFPPPTRPʆOpUІp"&H"N+]H%[vmjH}*#5#"L#[v<Hq$d-$pɾɾNvvqf &I&I&&IZ;3a 8a jBy (B( PY PPTRPTRPPPN$5*Q*)NNN C]))NN|+++ ƤФU,pf,7Tnp,KQ,KCL#,d-N#=#N  ٤W^  LZ;qf1 3 y (B1 P , &2B)2BQsRPPTRP3P3l3l9.OYT 4H Omjj5v|5"5pQ7TpA8N#=#8p8PP 7TnnYFZN@9PK9v^9()+, - 0 IJKLMOPZ^f!h#j%w'x)z+{-/13579;=?ACEGIKMOQQSUWY[]._;aGcNeOgPiQkRmToUqVsWuXwtyu{} STUVWXlvw   23:;<!=#>%?%D'K)O+P-Z/a1j3k579;=??AACCEEGGIIKMMOOQQSSUUWYY[[]]__acegikmoqssuwy{}#$%+,567>?@ABCDEFLMXYZabeflrsz{#$)*+,@AV v | !#%')+-/13579;=?ACE GIKMOQSU;W<YC[D]I_JaKcQe_gaibkjmkolqqsru~wwyy{{}} !"34>?@ABJS`mnw *+,.689:JKLMNOXY_ i o pvwx!#%')+-/13579;=?ACEGIKMOQSUW Y [ ] _ a c e g i k m0 o2 q3 s6 uC wL yV {a }g h k {             9 : ; @ G H I J Q R X Y ] _ d e f t u v                       $ ' 0 8 9 ; < = ? @ G I K L X ` a }         ! # % ' ) + - / 1 3 5 7 9 ;" =# ?( A* C2 EC GL IM KN MO OP QQ SR UZ W[ Ya [b ]c _d ai cj et gu iv kw mx oy o q s u w y { }             # , - 0 1 5 6 7 8 9 : ; < P Q V Z a b c d e f g h i j k l s t                                               !&#;%<'=)@+[-i/|1~3579;=?ACEGIKMOQSUWY[]_ a ceg%i,k<m=o@qAsUu^w_ya{h}  ./6DEOPUdesxy~   #,34:J!K#\%c'p)v+-/13579;=?:A;C<EJGKIPKQM]O^Q_SxUyWzY{[|]}_acegikmoqsuwy{}   ,127>NOP^\lnop}   !#%')+-"/#1'3(527798;_=`?aAbCdEcEfGgIhKiMjOkQoSzU{W|Y}[~]_acegikmoqsuwy{}   1EZdefno|  %(0123456;FL]|}~   !#%')+-/135 79;=?AC E%G;IHKIMXOQSUWY[]_acegikmoqsuwy{}"89Umnou{ !"&'239:;EGNPRTZ[ w x y z            ! &# 8% 9' :) ;+ ?- A/ F1 Q3 v5 w7 9 ; = ? A C E G I K M O Q S U W Y [ ] _ a c e g i k m o q s u w y QRTFWPWYY*[[bb!dhjk?nux y}E(G(XG)XK*XO+XS,-./ 0 1 2354e5j6y7y8y9z: z;0z<@z=Pz>`z?pz@zAzBzCzDzEzFzGzH{I{J {K0{L@{MP{N`{Op{P{Q{R{S{T{U{V{W{X|Y|Z |[0|\@|]P|^`|_p|`|a|b|c|d|e|f|g|h}i}j@klmno Dq Hr Ls Pt Tu Xv \w `xkyzH{| }8~(t0CHOP*GHIJNRVZ^bfxXXXXXOHxPIPabPccHdh0HHHBW_goxXXX8hx PPPPPPPPW W W W W W X X  X 0X @X PX `X pX X X X X X X X X Y Y  Y 0Y @Y PY `Y pY Y Y Y Y Y Y Y Y Z Z  Z 0Z @Z PZ `Z pZ Z Z Z Z Z Z Z Z 0 0 0 0 0     Ⱥ к !غ " # $ %P>MKKMK}{<:\[zy#"3242EDcb~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}gfnm     crypto.dllX509CertificateParserOrg.BouncyCastle.X509IX509StoreOrg.BouncyCastle.X509.StoreIX509SelectorAttributeCertificateIssuerAdler32Org.BouncyCastle.Utilities.ZlibIX509ExtensionX509ExtensionBaseTimeStampRequestOrg.BouncyCastle.TspSecurityUtilityExceptionOrg.BouncyCastle.SecurityGeneralSecurityExceptionCrlExceptionOrg.BouncyCastle.Security.CertificatesCertificateExceptionCertificateParsingExceptionPgpUserAttributeSubpacketVectorOrg.BouncyCastle.Bcpg.OpenPgpBasicOcspRespOrg.BouncyCastle.OcspIDsaOrg.BouncyCastle.CryptoDsaSignerOrg.BouncyCastle.Crypto.SignersPbeParametersGeneratorKeyGenerationParametersRsaKeyGenerationParametersOrg.BouncyCastle.Crypto.ParametersICipherParametersAsymmetricKeyParameterDsaKeyParametersDsaPrivateKeyParametersDHKeyParametersIBlockCipherPaddingOrg.BouncyCastle.Crypto.PaddingsPkcs7PaddingIBlockCipherCbcBlockCipherOrg.BouncyCastle.Crypto.ModesIBasicAgreementIDerivationFunctionBaseKdfBytesGeneratorOrg.BouncyCastle.Crypto.GeneratorsKdf2BytesGeneratorDHKeyGeneratorHelperIStreamCipherIsaacEngineOrg.BouncyCastle.Crypto.EnginesBlowfishEngineIAsymmetricBlockCipherPkcs1EncodingOrg.BouncyCastle.Crypto.EncodingsIDigestGeneralDigestOrg.BouncyCastle.Crypto.DigestsCipherKeyGeneratorIBufferedCipherBufferedCipherBaseBufferedStreamCipherBufferedIesCipherDHKekGeneratorOrg.BouncyCastle.Crypto.Agreement.KdfECDHBasicAgreementOrg.BouncyCastle.Crypto.AgreementSignerInformationOrg.BouncyCastle.CmsPacketOrg.BouncyCastle.BcpgInputStreamPacketSymmetricEncDataPacketIAsn1ConvertibleOrg.BouncyCastle.Asn1Asn1EncodableKeySpecificInfoOrg.BouncyCastle.Asn1.X9X509NameEntryConverterOrg.BouncyCastle.Asn1.X509SigIObjectIdentifiersOrg.BouncyCastle.Asn1.X509.SigIObjectDigestInfoAsn1ObjectDerEnumeratedCrlReasonCrlDistPointSignedDataOrg.BouncyCastle.Asn1.PkcsRC2CbcParameterServiceLocatorOrg.BouncyCastle.Asn1.OcspOcspObjectIdentifiersCertStatusBaseInputStreamOrg.BouncyCastle.Utilities.IOLimitedInputStreamDataGroupHashOrg.BouncyCastle.Asn1.IcaoSigPolicyQualifierInfoOrg.BouncyCastle.Asn1.EsfRevocationValuesEsfAttributesAsn1SequenceAsn1SequenceParserAsn1SequenceParserImplDerSequenceOtherKeyAttributeOrg.BouncyCastle.Asn1.CmsOriginatorInfoFilterStreamOrg.BouncyCastle.Asn1.UtilitiesDerOutputStreamBerOutputStreamAsn1NullCBZip2InputStreamOrg.BouncyCastle.Apache.Bzip2X509V3CertificateGeneratorAuthorityKeyIdentifierAuthorityKeyIdentifierStructureOrg.BouncyCastle.X509.ExtensionBigIntegersOrg.BouncyCastle.UtilitiesPgpUtilitiesPgpSignaturePgpPublicKeyPgpObjectFactoryPgpObjectPgpLiteralDataPgpCompressedDataECMultiplierOrg.BouncyCastle.Math.EC.MultiplierFpNafMultiplierTlsCipherSuiteOrg.BouncyCastle.Crypto.TlsTlsBlockCipherCipherSuiteRecordStreamGost3410ParametersECKeyParametersECPrivateKeyParametersZeroBytePaddingISO10126d2PaddingBufferedBlockCipherCtsBlockCipherCipherStreamOrg.BouncyCastle.Crypto.IOVmpcEngineVmpcKsa3EngineSkipjackEngineRsaEngineRC4EngineIdeaEngineAesEngineShortenedDigestMD5DigestX509CertStoreSelectorRecipientIDRecipientInformationPasswordRecipientInformationCmsCompressedDataStreamGeneratorBaseOutputStreamCmsCompressedOutputStreamSignatureSubpacketTrustSignatureOrg.BouncyCastle.Bcpg.SigPacketTagPersonalDataRsaPublicKeyStructureIAsn1StringDerStringBaseDerBitStringReasonFlagsTypeOfBiometricDataOrg.BouncyCastle.Asn1.X509.QualifiedDistributionPointNameDistributionPointAttributeCertificateInfoAttCertValidityPeriodAsn1DumpRsaesOaepParametersPbkdf2ParamsPbeS2ParametersPbeParameterOiwObjectIdentifiersOrg.BouncyCastle.Asn1.OiwElGamalParameterRevokedInfoKisaObjectIdentifiersOrg.BouncyCastle.Asn1.KisaAdmissionSyntaxOrg.BouncyCastle.Asn1.IsisMtt.X509IsisMttObjectIdentifiersOrg.BouncyCastle.Asn1.IsisMttDerGeneralizedTimeDerBmpStringSignerIdentifierSignedDataParserOtherRecipientInfoKeyTransRecipientInfoCmsObjectIdentifiersPkiStatusInfoOrg.BouncyCastle.Asn1.CmpPkiStatusDerNullBerNullAsn1OctetStringParserAsn1OctetStringAsn1ObjectParserX509V1CertificateGeneratorX509AttributeStaticTreeBufferedDecoderOrg.BouncyCastle.Utilities.EncodersISetOrg.BouncyCastle.Utilities.CollectionsTimeStampResponseGeneratorFailInfoPkcs12StoreBuilderOrg.BouncyCastle.PkcsPgpMarkerOcspUtilitiesReferenceMultiplierKeyParameterRC2ParametersParametersWithIVIDerivationParametersIso18033KdfParametersECKeyGenerationParametersECDomainParametersOpenSslPbeParametersGeneratorDHParametersHelperNoekeonEngineWhirlpoolDigestLongDigestGost3411DigestECDHWithKdfBasicAgreementDHAgreementCmsSignedGeneratorCmsSignedDataGeneratorDigOutputStreamSigOutputStreamSignerInfSignerUserIdSignatureExpirationTimeContainedPacketSignaturePacketBcpgObjectIBcpgKeyRsaPublicBcpgKeyOnePassSignaturePacketHashAlgorithmTagOtherInfoTargetsPolicyMappingsBasicConstraintsPfxOidTokenizerOcspResponseStatusCrlIDCertIDAsn1InputStreamLazyAsn1InputStreamOtherSigningCertificateOrg.BouncyCastle.Asn1.EssCompleteCertificateRefsCommitmentTypeQualifierDerOctetStringEncryptedContentInfoParserEncryptedContentInfoAttributeTableAsn1StreamParserAsn1EncodableVectorX509CrlEntryX509CertificatePairSubjectPublicKeyInfoFactoryX509CollectionStoreX509AttrCertStoreSelectorIPAddressOrg.BouncyCastle.Utilities.NetIEncoderBase64EncoderUrlBase64EncoderDateTimeObjectOrg.BouncyCastle.Utilities.DateWrapperUtilitiesIWrapperBufferedCipherWrapperCertificateNotYetValidExceptionCertificateEncodingExceptionWrappedGeneratorStreamPgpV3SignatureGeneratorPgpSignatureSubpacketGeneratorPgpPrivateKeyPgpExperimentalPgpExceptionPgpDataValidationExceptionECPointOrg.BouncyCastle.Math.ECECPointBaseFpPointF2mPointECFieldElementFpFieldElementF2mFieldElementZTauElementOrg.BouncyCastle.Math.EC.AbcCertificateISignerRsaDigestSignerThreadedSeedGeneratorOrg.BouncyCastle.Crypto.PrngSeedGeneratorIAeadBlockCipherGOfbBlockCipherCcmBlockCipherRsaBlindingFactorGeneratorIAsymmetricCipherKeyPairGeneratorGost3410KeyPairGeneratorTeaEngineRC532EngineCast5EngineSha224DigestRipeMD128DigestRecipientInformationStoreKeyTransRecipientInformationKekRecipientInformationCmsSignedDataStreamGeneratorNullOutputStreamTeeOutputStreamCmsSignedDataOutputStreamCmsContentInfoParserCmsCompressedDataParserIDigestCalculatorBaseDigestCalculatorUserAttributeSubpacketsParserSecretKeyPacketSecretSubkeyPacketPublicKeyPacketPublicSubkeyPacketElGamalPublicBcpgKeyUserNoticeNoticeReferenceIssuingDistributionPointDerIntegerCrlNumberMessageImprintOrg.BouncyCastle.Asn1.TspAttributeX509SmimeCapabilitiesAttributeOrg.BouncyCastle.Asn1.SmimeSafeBagAlgorithmIdentifierKeyDerivationFuncEncryptedPrivateKeyInfoEncryptedDataAttributePkcsResponseDataPublicKeyAndChallengeOrg.BouncyCastle.Asn1.MozillaCast5CbcParametersOrg.BouncyCastle.Asn1.MiscAdmissionsCertHashOrg.BouncyCastle.Asn1.IsisMtt.OcspCommitmentTypeIdentifierDerUniversalStringGost3410PublicKeyAlgParametersOrg.BouncyCastle.Asn1.CryptoProRecipientInfoCompressedDataAsn1SetAsn1SetParserAsn1SetParserImplCRCX509CertificateITranslatorHexTranslatorHashSetEncryptedPrivateKeyInfoFactoryPgpKeyRingOcspRespWNafMultiplierTlsMacICertificateVerifyerAlwaysValidVerifyerISignerWithRecoveryIso9796d2SignerRC5ParametersMgfParametersGost3410KeyParametersElGamalKeyParametersDesParametersDesEdeParametersTbcPaddingIMacPkcs12ParametersGeneratorDsaKeyPairGeneratorDHParametersGeneratorDesEdeWrapEngineMD2DigestCmsSignedHelperCmsProcessableCmsProcessableByteArrayCmsEnvelopedGeneratorRecipientInfCmsEnvelopedDataGeneratorCmsEnvelopedDataCmsExceptionCmsAttributeTableGenerationExceptionSymmetricKeyEncSessionPacketSymmetricEncIntegrityPacketPrimaryUserIdKeyExpirationTimeX509NameTokenizerX509NameV2TbsCertListGeneratorV2AttributeCertificateInfoGeneratorRfc3739QCObjectIdentifiersGeneralSubtreePkcs12PbeParamsTbsRequestResponseBytesOcspRequestLazyDerSequenceNamingAuthorityCertificateValuesECGost3410ParamSetParametersConstructedOctetStreamKekIdentifierEnvelopedDataParserAsn1GeneratorBerGeneratorBerSetGeneratorBerOctetStringGeneratorBufferedBerOctetStreamX509StoreExceptionNoSuchStoreExceptionIX509StoreParametersZDeflaterOutputStreamInflateDateTimeUtilitiesTspExceptionTspValidationExceptionTimeStampTokenSecureRandomPrivateKeyFactoryPkcs12EntryX509CertificateEntryPemUtilitiesOrg.BouncyCastle.OpenSslPgpKeyFlagsIStreamGeneratorPgpEncryptedDataGeneratorEncMethodPbeMethodPubMethodRespIDCertificateIDPreCompInfoWNafPreCompInfoECNRSignerParametersWithRandomNaccacheSternKeyParametersNaccacheSternPrivateKeyParametersKdfParametersIesParametersIesWithCipherParametersAeadParametersCcmParametersCryptoExceptionInvalidCipherTextExceptionMgf1BytesGeneratorDHKeyPairGeneratorTwofishEngineOaepEncodingCmsUtilitiesCmsTypedStreamFullReaderStreamLiteralDataPacketBcpgOutputStreamArmoredOutputStreamQCStatementIssuerSerialIetfAttrSyntaxHolderTeleTrusTNamedCurvesOrg.BouncyCastle.Asn1.TeleTrustX9ECParametersHolderBrainpoolP160r1HolderBrainpoolP160t1HolderBrainpoolP192r1HolderBrainpoolP192t1HolderBrainpoolP224r1HolderBrainpoolP224t1HolderBrainpoolP256r1HolderBrainpoolP256t1HolderBrainpoolP320r1HolderBrainpoolP320t1HolderBrainpoolP384r1HolderBrainpoolP384t1HolderBrainpoolP512r1HolderBrainpoolP512t1HolderContentInfoOcspResponseSignaturePolicyIdentifierAsn1TaggedObjectParserAsn1TaggedObjectDerTaggedObjectDerApplicationSpecificSignerInfoOriginatorIdentifierOrKeyKekRecipientInfoAttributeX509CertPairParserZInflaterInputStreamStringsUrlBase64NoSuchAlgorithmExceptionPgpOnePassSignatureIntArrayElGamalPrivateKeyParametersDsaPublicKeyParametersOpenPgpCfbBlockCipherPkcs5S2ParametersGeneratorRsaCoreEngineRsaBlindingEngineIesEngineCamelliaEngineRipeMD320DigestCmsPbeKeyNotationDataIssuerKeyIdExportableS2kRsaSecretBcpgKeyPublicKeyAlgorithmTagBcpgInputStreamPartialInputStreamX9FieldIDX9FieldElementX9ECPointX509AttributesTbsCertificateStructureRoleSyntaxExtendedKeyUsageECPrivateKeyStructureOrg.BouncyCastle.Asn1.SecPkcsObjectIdentifiersCertificationRequestInfoSingleResponseSignerLocationCrlValidatedIDCrlListIDDerUtcTimeDerOctetStringParserDefiniteLengthInputStreamTimePkiFreeTextBerOctetStringParserBZip2ConstantsX509CrlStoreSelectorHexEncoderEnumerableProxyCertificationRequestPkcs10CertificationRequestPemWriterPemReaderCertificateStatusRevokedStatusReqTlsUtilitiesIso9796d2PssSignerGost3410DigestSignerIRandomGeneratorReversedWindowGeneratorGost3410PrivateKeyParametersDHPrivateKeyParametersSicBlockCipherDesKeyGeneratorDesEdeKeyGeneratorRfc3394WrapEngineSeedWrapEngineHC256EngineCamelliaWrapEngineBufferedAeadBlockCipherSignerIDElGamalSecretBcpgKeyUserAttributeSubpacketImageAttribOrg.BouncyCastle.Bcpg.AttrFormatX9IntegerConverterX509ExtensionsDerObjectIdentifierKeyPurposeIDDisplayTextAccessDescriptionSmimeEncryptionKeyPreferenceAttributeSmimeCapabilityVectorRsaPrivateKeyStructureIssuerAndSerialNumberAuthenticatedSafeDerSetLazyDerSetRequestedCertificateChoiceOtherHashAlgAndValueDerVisibleStringCompressedDataParserX509V2CrlGeneratorPemParserAttributeCertificateHolderInfBlocksBase64CollectionUtilitiesTimeStampTokenGeneratorSignatureExceptionGeneratorUtilitiesAgreementUtilitiesPkcs12StoreCertIdIgnoresCaseHashtablePgpUserAttributeSubpacketVectorGeneratorPgpSecretKeyPgpPublicKeyRingRespDataOcspRespStatusOcscpRespStatusOCSPRespGeneratorWTauNafMultiplierECGost3410SignerRsaKeyParametersRsaPrivateCrtKeyParametersNaccacheSternKeyGenerationParametersElGamalPublicKeyParametersDsaValidationParametersDsaKeyGenerationParametersEaxBlockCipherTagCfbBlockCipherVmpcMacOrg.BouncyCastle.Crypto.MacsElGamalParametersGeneratorRC2EngineNullEngineCast6EngineAesFastEngineCounterSignatureDigestCalculatorCrc24X962ParametersX509ExtensionsGeneratorX509DefaultEntryConverterX509CertificateStructureSemanticsInformationEtsiQCObjectIdentifiersRequestMonetaryLimitSigningCertificateV2RecipientKeyIdentifierCmsAttributesPkiFailureInfoBerTaggedObjectParserBerSequenceParserX509UtilitiesKeyExceptionPgpSecretKeyRingBundlePgpPublicKeyRingBundlePgpEncryptedDataListOcspReqGeneratorRequestObjectOcspExceptionTnafTlsInputStreamTlsCipherSuiteManagerECDsaSignerECPublicKeyParametersOfbBlockCipherCMacNaccacheSternKeyPairGeneratorSeedEngineElGamalEngineISO9796d1EncodingSha384DigestRipeMD160DigestECDHCBasicAgreementCmsAttributeTableGeneratorDefaultSignedAttributeTableGeneratorCmsSignedDataCmsEnvelopedHelperCmsCompressedDataGeneratorKeyFlagsSignatureSubpacketsParserX509ExtensionV3TbsCertificateGeneratorNameConstraintsSecNamedCurvesSecp112r1HolderSecp112r2HolderSecp128r1HolderSecp128r2HolderSecp160k1HolderSecp160r1HolderSecp160r2HolderSecp192k1HolderSecp192r1HolderSecp224k1HolderSecp224r1HolderSecp256k1HolderSecp256r1HolderSecp384r1HolderSecp521r1HolderSect113r1HolderSect113r2HolderSect131r1HolderSect131r2HolderSect163k1HolderSect163r1HolderSect163r2HolderSect193r1HolderSect193r2HolderSect233k1HolderSect233r1HolderSect239k1HolderSect283k1HolderSect283r1HolderSect409k1HolderSect409r1HolderSect571k1HolderSect571r1HolderPrivateKeyInfoIanaObjectIdentifiersOrg.BouncyCastle.Asn1.IanaSigningCertificateContentHintsOtherRevValsOcspListIDCrlIdentifierDerT61StringDerGeneralStringCryptoProObjectIdentifiersRecipientIdentifierRecipientEncryptedKeyEnvelopedDataJZlibBufferedEncoderSignerUtilitiesNullDigestPrivateKeyInfoFactoryPgpEncryptedDataTruncatedStreamECCurveECCurveBaseFpCurveF2mCurveByteQueueVmpcRandomGeneratorRsaBlindingParametersElGamalParametersISO9797Alg3MacMacCFBBlockCipherCfbBlockCipherMacElGamalKeyPairGeneratorXteaEngineECDHKekGeneratorDHKdfParametersSignerInformationStoreCmsSignedDataParserCmsEnvelopedDataParserSignatureCreationTimeX962NamedCurvesPrime192v1HolderPrime192v2HolderPrime192v3HolderPrime239v1HolderPrime239v2HolderPrime239v3HolderPrime256v1HolderC2pnb163v1HolderC2pnb163v2HolderC2pnb163v3HolderC2pnb176w1HolderC2tnb191v1HolderC2tnb191v2HolderC2tnb191v3HolderC2pnb208w1HolderC2tnb239v1HolderC2tnb239v2HolderC2tnb239v3HolderC2pnb272w1HolderC2pnb304w1HolderC2tnb359v1HolderC2pnb368w1HolderC2tnb431r1HolderCertificateListTimeStampRespTimeStampReqTeleTrusTObjectIdentifiersSmimeAttributesCertBagNistNamedCurvesOrg.BouncyCastle.Asn1.NistIndefiniteLengthInputStreamIcaoObjectIdentifiersEssCertIDOtherHashDerGeneratorDerSetGeneratorDerSequenceGeneratorDerPrintableStringBerSequenceGeneratorAsn1OutputStreamZStreamInfCodesDeflateConfigPlatformEmptyEnumerableEmptyEnumeratorTspUtilTimeStampRequestGeneratorPgpOnePassSignatureListPgpKeyRingGeneratorTlsExceptionPssSignerDsaDigestSignerParametersWithSBoxPaddedBufferedBlockCipherMacStreamDHBasicKeyPairGeneratorRfc3211WrapEngineRC6EngineRC2WrapEngineAesWrapEngineAesLightEngineTrustPacketPublicKeyEncSessionPacketDsaPublicBcpgKeyX9CurveX509ObjectIdentifiersAccuracyResponderIDDerIA5StringVerisignCzagExtensionNetscapeRevocationUrlNetscapeCertTypeMicrosoftObjectIdentifiersOrg.BouncyCastle.Asn1.MicrosoftRestrictionOcspIdentifierDerUnknownTagGost28147ParametersContentInfoParserCBZip2OutputStreamStackElemIX509AttributeCertificateX509V2AttributeCertificateX509KeyUsageX509CrlParserX509StoreFactoryInfTreeHexArraysTimeStampTokenInfoAsymmetricKeyEntryIPasswordFinderPgpSecretKeyRingPgpKeyPairPgpCompressedDataGeneratorTlsProtocolHandlerDHKeyGenerationParametersHMacDigestStreamSerpentEngineRsaBlindedEngineHC128EngineDHBasicAgreementCmsProcessableFileUserAttributeSubpacketTagSymmetricKeyAlgorithmTagRevocableMPIntegerModDetectionCodePacketCompressionAlgorithmTagMonetaryValueGeneralNameAttCertIssuerDirectoryStringOrg.BouncyCastle.Asn1.X500TstInfoSmimeCapabilitiesSecObjectIdentifiersIdeaCbcParProfessionInfoAdditionalInformationSyntaxLdsSecurityObjectEssCertIDv2DerSetParserDerNumericStringBerSetParserAsn1TagsX509SignatureUtilitiesX509CollectionStoreParametersSubjectKeyIdentifierSubjectKeyIdentifierStructureTreePushbackStreamTspAlgorithmsGenTimeAccuracyParameterUtilitiesMacUtilitiesDigestUtilitiesPgpLiteralDataGeneratorWTauNafPreCompInfoTlsOuputStreamTlsNullCipherSuiteParametersWithSaltGost3410PublicKeyParametersDHParametersISO7816d4PaddingECKeyPairGeneratorSha512DigestSha256DigestMD4DigestDataLengthExceptionUserIdPacketUserAttributePacketPreferredAlgorithmsV2FormV1TbsCertificateGeneratorTargetGeneralNamesDigestInfoCertificatePairEncryptionSchemeProcurationSyntaxDeclarationOfMajorityOtherRevRefsCrlOcspRefCompleteRevocationRefsDerBooleanKeyAgreeRecipientIdentifierBerOctetStringInvalidKeyExceptionPgpSignatureListSingleRespOcspReqECAlgorithmsGost3410SignerGost3410KeyGenerationParametersDsaParametersGcmBlockCipherGost28147MacKdf1BytesGeneratorRC564EngineTigerDigestSimpleAttributeTableGeneratorCmsAttributeTableParameterOutputStreamPacketMarkerPacketArmoredInputStreamX9ObjectIdentifiersX9ECParametersTargetInformationPolicyQualifierIDCertPolicyIDAttributeCertificateDumpRsassaPssParametersSignatureGnuObjectIdentifiersOrg.BouncyCastle.Asn1.GnuContentIdentifierOcspResponsesIDCommitmentTypeIndicationDerSequenceParserGost3410NamedParametersECGost3410NamedCurvesPasswordRecipientInfoX509V2AttributeCertificateGeneratorX509AttrCertParserX509CertPairStoreSelectorPrincipalUtilitiesX509ExtensionUtilitiesCipherUtilitiesPgpSignatureSubpacketVectorPgpSignatureGeneratorPgpPublicKeyEncryptedDataUnknownStatusSimpleBigDecimalStreamBlockCipherDHValidationParametersRsaKeyPairGeneratorPkcs5S1ParametersGeneratorSalsa20EngineGost28147EngineDesEngineDesEdeEngineSha1DigestRipeMD256DigestPkcs5Scheme2Utf8PbeKeyCmsEnvelopedDataStreamGeneratorCmsEnvelopedDataOutputStreamCmsCompressedDataDsaSecretBcpgKeyCrlEntryTbsCertificateListRevokedCertificatesEnumerationRevokedCertificatesEnumeratorSubjectDirectoryAttributesNameOrPseudonymIso4217CurrencyCodePrivateKeyUsagePeriodPolicyQualifierInfoPolicyInformationDsaParameterAuthorityInformationAccessMacDataBasicOcspResponseOtherCertIDDerUtf8StringBerSetBerSequenceX509CrlStreamsTimeStampResponsePublicKeyFactoryPbeUtilitiesInvalidParameterExceptionCertificateExpiredExceptionPgpPbeEncryptedDataPgpKeyValidationExceptionBasicOcspRespGeneratorResponseObjectBigIntegerOrg.BouncyCastle.MathCombinedHashDigestRandomGeneratorGost3410ValidationParametersElGamalKeyGenerationParametersDHPublicKeyParametersX923PaddingMaxBytesExceededExceptionCbcBlockCipherMacGost3410ParametersGeneratorDsaParametersGeneratorRijndaelEngineNaccacheSternEngineBufferedAsymmetricBlockCipherAsymmetricCipherKeyPairPkcs5Scheme2PbeKeyKeyAgreeRecipientInformationSignatureSubpacketTagExperimentalPacketCompressedDataPacketSubjectPublicKeyInfoBiometricDataKeyUsageSmimeCapabilityDHParameterNttObjectIdentifiersOrg.BouncyCastle.Asn1.NttNistObjectIdentifiersMiscObjectIdentifiersSignaturePolicyIdGost3410ParamSetParametersOriginatorPublicKeyKeyAgreeRecipientInfoBerTaggedObjectmscorlibSystemObjectICloneableExceptionSystem.IOStreamSystem.CollectionsIEnumerableEnumICollectionRandomIEnumeratorPemCertParsersDatasDataObjectCountcurrentStreamReadDerCertificateGetCertificateReadPemCertificateCreateX509CertificateReadCertificateReadCertificates.ctorGetMatchesMatchformGetNamesGetPrincipalsMatchesDNCloneEqualsGetHashCodeBASENMAXadler32GetCriticalExtensionOidsGetNonCriticalExtensionOidsGetExtensionValueGetX509ExtensionsGetExtensionOidsreqget_Versionget_MessageImprintAlgOidGetMessageImprintDigestget_ReqPolicyget_Nonceget_CertReqIListValidateGetEncodedget_ExtensionsVersionMessageImprintAlgOidReqPolicyNonceCertReqExtensionspacketsGetSubpacketGetImageAttributeToSubpacketArrayrespdataGetTbsResponseDataget_ResponderIdDateTimeget_ProducedAtget_Responsesget_ResponseExtensionsget_SignatureAlgNameget_SignatureAlgOidGetResponseDataGetSignatureArrayListGetCertListGetCertsGetCertificatesVerifyResponderIdProducedAtResponsesResponseExtensionsSignatureAlgNameSignatureAlgOidget_AlgorithmNameInitGenerateSignatureVerifySignatureAlgorithmNamekeyrandomcalculateEmPasswordmSaltmIterationCountget_PasswordGetPasswordget_SaltGetSaltget_IterationCountGenerateDerivedParametersGenerateDerivedMacParametersPkcs5PasswordToBytesPkcs5PasswordToUtf8BytesPkcs12PasswordToBytesPasswordSaltIterationCountstrengthget_Randomget_StrengthStrengthpublicExponentcertaintyget_PublicExponentget_CertaintyPublicExponentCertaintyprivateKeyget_IsPrivateIsPrivateparametersget_ParametersParametersxget_XXget_PaddingNameAddPaddingPadCountPaddingNameGetBlockSizeget_IsPartialBlockOkayProcessBlockResetIsPartialBlockOkayIVcbcVcbcNextVblockSizecipherencryptingGetUnderlyingCipherEncryptBlockDecryptBlockCalculateAgreementget_DigestGenerateBytesDigestcounterStartdigestsharedivMAX_ITERATIONSInstanceCalculatePrivatecreateInRangeCalculatePublicReturnByteProcessBytessizeLstateArraySizeengineStateresultsabcindexkeyStreamworkingKeyinitialisedsetKeyisaacmixbyteToIntLittleintToByteLittleBLOCK_SIZEKPKS0KS1KS2KS3ROUNDSSBOX_SKP_SZS0S1S2S3PFProcessTableSetKeyBytesTo32bitsBits32ToBytesGetInputBlockSizeGetOutputBlockSizeStrictLengthEnabledPropertyHeaderLengthget_StrictLengthEnabledset_StrictLengthEnabledstrictLengthEnabled.cctorengineforEncryptionforPrivateKeyuseStrictLengthEncodeBlockDecodeBlockStrictLengthEnabledGetDigestSizeGetByteLengthUpdateBlockUpdateDoFinalBYTE_LENGTHxBufxBufOffbyteCountFinishProcessWordProcessLengthuninitialiseddefaultStrengthget_DefaultStrengthengineInitGenerateKeyengineGenerateKeyDefaultStrengthGetOutputSizeGetUpdateOutputSizeProcessByteEmptyBufferMemoryStreambufferalgorithmkeySizezpartyAInfointegerToBytesHelpersidinfodigestAlgorithmencryptionAlgorithmsignedAttributesunsignedAttributescontentsignaturecontentTypedigestCalculatorresultDigestget_SignerIDget_DigestAlgorithmIDget_DigestAlgOidget_DigestAlgParamsGetContentDigestget_EncryptionAlgorithmIDget_EncryptionAlgOidget_EncryptionAlgParamsget_SignedAttributesget_UnsignedAttributesGetCounterSignaturesGetEncodedSignedAttributesDoVerifyIsNullDerDecodeVerifyDigestToSignerInfoReplaceUnsignedAttributesAddCounterSignersDigestAlgorithmIDDigestAlgOidDigestAlgParamsEncryptionAlgorithmIDEncryptionAlgOidEncryptionAlgParamsSignedAttributesUnsignedAttributesbcpgInGetInputStreamToAsn1ObjectDerBerGetDerEncodedcounterget_Algorithmget_CounterAlgorithmCounterConvertHexEncodedCanBePrintableGetConvertedValueIdSigIIdSigIKPIdSigICPIdSigIONIdSigIKPDirectoryServiceIdSigIONPersonalDataIdSigICPSigConformPublicKeyPublicKeyCertOtherObjectDigestdigestedObjectTypeotherObjectTypeIDobjectDigestGetInstanceget_DigestedObjectTypeget_OtherObjectTypeIDget_DigestAlgorithmget_ObjectDigestDigestedObjectTypeOtherObjectTypeIDDigestAlgorithmObjectDigestFromByteArrayFromStreamEncodeAsn1EqualsAsn1GetHashCodeCallAsn1EqualsCallAsn1GetHashCodebytesget_ValueValueUnspecifiedKeyCompromiseCACompromiseAffiliationChangedSupersededCessationOfOperationCertificateHoldRemoveFromCrlPrivilegeWithdrawnAACompromiseReasonStringToStringseqGetDistributionPointsversiondigestAlgorithmscontentInfocertificatescrlssignerInfosget_DigestAlgorithmsget_ContentInfoget_Certificatesget_Crlsget_SignerInfosDigestAlgorithmsCertificatesCrlsSignerInfosget_RC2ParameterVersionGetIVRC2ParameterVersionissuerlocatorget_Issuerget_LocatorIssuerLocatorPkixOcspIdPkixOcspPkixOcspBasicPkixOcspNoncePkixOcspCrlPkixOcspResponsePkixOcspNocheckPkixOcspArchiveCutoffPkixOcspServiceLocatortagNovalueget_TagNoget_StatusTagNoStatusclosedget_CanReadget_CanSeekget_CanWriteCloseFlushget_Lengthget_Positionset_PositionReadSeekOriginSeekSetLengthWriteCanReadCanSeekCanWriteLengthPosition_inSetParentEofDetectdataGroupNumberdataGroupHashValueget_DataGroupNumberget_DataGroupHashValueDataGroupNumberDataGroupHashValuesigPolicyQualifierIdsigQualifierget_SigPolicyQualifierIdget_SigQualifierSigPolicyQualifierIdSigQualifiercrlValsocspValsotherRevValsGetCrlValsGetOcspValsSigPolicyIdCommitmentTypeSignerAttrOtherSigCertContentTimestampCertificateRefsRevocationRefsCertValuesEscTimeStampCertCrlTimestampArchiveTimestampGetEnumeratorGetObjectsget_Parserget_ItemGetObjectAtget_Sizeget_CountAddObjectParserItemSizeCountReadObjectoutermaxEmptyFromVectorkeyAttrIdkeyAttrget_KeyAttrIdget_KeyAttrKeyAttrIdKeyAttrcertsReadByteWriteBytesWriteLengthWriteEncodedWriteTagWriteNullWriteObjectSTART_BLOCK_STATERAND_PART_A_STATERAND_PART_B_STATERAND_PART_C_STATENO_RAND_PART_A_STATENO_RAND_PART_B_STATENO_RAND_PART_C_STATECadviseBadBGLengthsBitStreamEOFCompressedStreamEOFMakeMapslastorigPtrblockSize100kblockRandomisedbsBuffbsLivemCrcinUsenInUseseqToUnsequnseqToSeqselectorselectorMtfttll8unzftablimitbasevpermminLensbsStreamstreamEndcurrentCharcurrentStatestoredBlockCRCstoredCombinedCRCcomputedBlockCRCcomputedCombinedCRCi2countchPrevch2itPosrNToGorTPosj2InitIntArrayInitCharArrayInitializeInitBlockEndBlockCompleteBlockOverrunBadBlockHeaderCrcErrorBsFinishedWithStreamBsSetStreamBsRBsGetUCharBsGetintBsGetIntVSBsGetInt32HbCreateDecodeTablesRecvDecodingTablesGetAndMoveToFrontDecodeSetupBlockSetupRandPartASetupNoRandPartASetupRandPartBSetupRandPartCSetupNoRandPartBSetupNoRandPartCSetDecompressStructureSizesextGeneratortbsGensigOidsigAlgIdsignatureAlgorithmSetSerialNumberSetIssuerDNSetNotBeforeSetNotAfterSetSubjectDNSetPublicKeySetSignatureAlgorithmAddExtensionCopyAndAddExtensionGenerateGenerateTbsCertGenerateJcaObjectget_SignatureAlgNamesSignatureAlgNameskeyidentifiercertissuercertsernoGetKeyIdentifierget_AuthorityCertIssuerget_AuthorityCertSerialNumberAuthorityCertIssuerAuthorityCertSerialNumberFromCertificateFromKeyAsUnsignedByteArrayReadAheadDsaSigToMpiRsaSigToMpiGetDigestNameGetSignatureNameGetSymmetricCipherNameGetKeySizeMakeKeyMakeRandomKeyMakeKeyFromPassPhraseFileInfoWriteFileToLiteralDataIsPossiblyBase64GetDecoderStreamBinaryDocumentCanonicalTextDocumentStandAloneDefaultCertificationNoCertificationCasualCertificationPositiveCertificationSubkeyBindingDirectKeyKeyRevocationSubkeyRevocationCertificationRevocationTimestampsigPcksignatureTypetrustPcksiglastbGetSigget_KeyAlgorithmget_HashAlgorithmInitVerifydoCanonicalUpdateBytedoUpdateCRLFUpdateWithIdDataUpdateWithPublicKeyVerifyCertificationget_SignatureTypeget_KeyIdGetCreationTimeget_CreationTimeGetSignatureTrailerget_HasSubpacketsGetHashedSubPacketsGetUnhashedSubPacketscreateSubpacketVectorGetEncodedPublicKeyKeyAlgorithmHashAlgorithmSignatureTypeKeyIdCreationTimeHasSubpacketsMasterKeyCertificationTypeskeyIdfingerprintkeyStrengthpublicPktrustPkkeySigsidsidTrustsidSigssubSigsget_ValidDaysGetTrustDataGetValidSecondsGetExpirationTimeFromSigGetFingerprintget_IsEncryptionKeyget_IsMasterKeyget_BitStrengthGetKeyGetUserIdsGetUserAttributesGetSignaturesForIdGetSignaturesForUserAttributeGetSignaturesOfTypeGetSignaturesIsRevokedAddCertificationRemoveCertificationValidDaysIsEncryptionKeyIsMasterKeyBitStrengthNextPgpObjectNextObjectAllPgpObjectsBinaryTextUtf8Consoleget_Formatget_FileNameget_ModificationTimeGetDataStreamFileNameModificationTimeMultiplyKE_RSAKE_RSA_EXPORTKE_DHE_DSSKE_DHE_DSS_EXPORTKE_DHE_RSAKE_DHE_RSA_EXPORTKE_DH_DSSKE_DH_RSAKE_DH_anonEncodePlaintextDecodeCiphertextget_KeyExchangeAlgorithmKeyExchangeAlgorithmencryptCipherdecryptCipherwriteDigestreadDigestcipherKeySizekeyExchangewriteMacreadMacinitCipherhandlerinStroutStrhash1hash2readSuitewriteSuiteReadDataDecodeAndVerifyWriteMessagepqvalidationget_Pget_Qget_Aget_ValidationParametersQAValidationParameterspublicKeyParamSetget_PublicKeyParamSetVerifyAlgorithmNameLookupParametersPublicKeyParamSetdget_DDbufbufOffstreaminCipheroutCiphermInBufmInPosinStreamEndedget_ReadCipherget_WriteCipherFillInBufreadAndProcessBlockReadCipherWriteCiphernworkingIVInitKeyftablekey0key1key2key3GHcoreSTATE_LENGTHyMASKBytesToWordWordToBytesMulIdeaFuncExpandKeyMulInvAddInvInvertKeyGenerateWorkingKeym1m2m3SSirconT0Tinv0ShiftFFmulXInv_McolSubWordWorkingKeyC0C1C2C3UnPackBlockPackBlockbaseDigestlengthDigestLengthH1H2H3H4xOffUnpackWordS11S12S13S14S21S22S23S24S31S32S33S34S41S42S43S44RotateLeftKauthorityKeyIdentifierbasicConstraintscertificatecertificateValidextendedKeyUsagekeyUsagepolicyprivateKeyValidserialNumbersubjectsubjectKeyIdentifiersubjectPublicKeysubjectPublicKeyAlgIDget_AuthorityKeyIdentifierset_AuthorityKeyIdentifierget_BasicConstraintsset_BasicConstraintsget_Certificateset_Certificateget_CertificateValidset_CertificateValidget_ExtendedKeyUsageset_ExtendedKeyUsageset_Issuerget_IssuerAsStringget_KeyUsageset_KeyUsageget_Policyset_Policyget_PrivateKeyValidset_PrivateKeyValidget_SerialNumberset_SerialNumberget_Subjectset_Subjectget_SubjectAsStringget_SubjectKeyIdentifierset_SubjectKeyIdentifierget_SubjectPublicKeyset_SubjectPublicKeyget_SubjectPublicKeyAlgIDset_SubjectPublicKeyAlgIDIssuersMatchCopyBoolArrayCopySetGetSubjectPublicKeyMatchExtensionCertificateValidIssuerAsStringPolicyPrivateKeyValidSerialNumberSubjectSubjectAsStringSubjectPublicKeySubjectPublicKeyAlgIDkeyIdentifierget_KeyIdentifierset_KeyIdentifierKeyIdentifier_rid_encAlg_keyEncAlg_dataget_RecipientIDget_KeyEncryptionAlgorithmIDget_KeyEncryptionAlgOidget_KeyEncryptionAlgParamsGetContentFromSessionKeyGetContentGetContentStreamKeyEncryptionAlgorithmIDKeyEncryptionAlgOidKeyEncryptionAlgParams_infoget_KeyDerivationAlgorithmKeyDerivationAlgorithmZLibOpen_out_sGen_cGen_eiGentypecriticalget_SubpacketTypeIsCriticalGetDataSubpacketTypeIntToByteArrayget_Depthget_TrustAmountDepthTrustAmountvalue__ReservedPublicKeyEncryptedSessionSymmetricKeyEncryptedSessionKeyOnePassSignatureSecretKeySecretSubkeySymmetricKeyEncryptedMarkerLiteralDataTrustUserIdPublicSubkeyUserAttributeSymmetricEncryptedIntegrityProtectedModificationDetectionCodeExperimental1Experimental2Experimental3Experimental4nameOrPseudonymnameDistinguisherdateOfBirthplaceOfBirthgenderpostalAddressget_NameOrPseudonymget_NameDistinguisherget_DateOfBirthget_PlaceOfBirthget_Genderget_PostalAddressNameDistinguisherDateOfBirthPlaceOfBirthGenderPostalAddressmodulusget_ModulusModulusGetStringtablepadBitsGetPadBitsGetBytesget_PadBitsget_IntValuePadBitsIntValueUnusedPictureHandwrittenSignatureobjget_IsPredefinedget_PredefinedBiometricTypeget_BiometricDataOidIsPredefinedPredefinedBiometricTypeBiometricDataOidFullNameNameRelativeToCrlIssuernameget_PointTypeget_NameSystem.TextStringBuilderappendObjectPointTypeNamedistributionPointreasonscRLIssuerget_DistributionPointNameget_Reasonsget_CrlIssuerReasonsCrlIssuerholderattrCertValidityPeriodattributesissuerUniqueIDextensionsget_Holderget_Signatureget_AttrCertValidityPeriodget_Attributesget_IssuerUniqueIDAttrCertValidityPeriodAttributesIssuerUniqueIDnotBeforeTimenotAfterTimeget_NotBeforeTimeget_NotAfterTimeNotBeforeTimeNotAfterTimeTabNewLineAsStringDumpAsStringhashAlgorithmmaskGenAlgorithmpSourceAlgorithmDefaultHashAlgorithmDefaultMaskGenFunctionDefaultPSourceAlgorithmget_MaskGenAlgorithmget_PSourceAlgorithmMaskGenAlgorithmPSourceAlgorithmoctStriterationCountkeyLengthget_KeyLengthKeyLengthfuncschemeget_KeyDerivationFuncget_EncryptionSchemeMD4WithRsaMD5WithRsaMD4WithRsaEncryptionDesCbcIdSha1DsaWithSha1Sha1WithRsaElGamalAlgorithmgget_GrevocationTimerevocationReasonget_RevocationTimeget_RevocationReasonRevocationTimeRevocationReasonIdSeedCbcIdNpkiAppCmsSeedWrapadmissionAuthoritycontentsOfAdmissionsget_AdmissionAuthorityGetContentsOfAdmissionsAdmissionAuthorityIdIsisMttIdIsisMttCPIdIsisMttCPAccreditedIdIsisMttATIdIsisMttATDateOfCertGenIdIsisMttATProcurationIdIsisMttATAdmissionIdIsisMttATMonetaryLimitIdIsisMttATDeclarationOfMajorityIdIsisMttATIccsnIdIsisMttATPKReferenceIdIsisMttATRestrictionIdIsisMttATRetrieveIfAllowedIdIsisMttATRequestedCertificateIdIsisMttATNamingAuthoritiesIdIsisMttATCertInDirSinceIdIsisMttATCertHashIdIsisMttATNameAtBirthIdIsisMttATAdditionalInformationIdIsisMttATLiabilityLimitationFlagtimeget_TimeStringGetTimeCalculateGmtOffsetConvertToDateTimeFStringParseDateStringget_HasFractionalSecondsGetOctetsTimeStringHasFractionalSecondsstridget_IsTaggedget_IDIsTaggedID_seq_version_nextObject_certsCalled_crlsCalledGetDigestAlgorithmsGetEncapContentInfoGetCrlsGetSignerInfosoriTypeoriValueget_OriTypeget_OriValueOriTypeOriValueridkeyEncryptionAlgorithmencryptedKeyget_RecipientIdentifierget_KeyEncryptionAlgorithmget_EncryptedKeyKeyEncryptionAlgorithmEncryptedKeyDataSignedAndEnvelopedDataDigestedDatastatusstatusStringfailInfoget_StatusStringget_FailInfoStatusStringGrantedGrantedWithModsRejectionWaitingRevocationWarningRevocationNotificationzeroBytesGetOctetStreamsigOIDattrget_OidGetValuesOidMAX_BITSBL_CODESD_CODESLITERALSLENGTH_CODESL_CODESMAX_BL_BITSstatic_ltreestatic_dtreestatic_l_descstatic_d_descstatic_bl_descstatic_treeextra_bitsextra_baseelemsmax_lengthtranslatorAddAddAllClearContainsget_IsEmptyRemoveRemoveAllIsEmptystatusStringstokenGeneratoracceptedAlgorithmsacceptedPoliciesacceptedExtensionsaddStatusStringsetFailInfoFieldgetPkiStatusInfokeyAlgorithmcertAlgorithmBuildSetCertAlgorithmSetKeyAlgorithmHashtablealgorithmsoidsnoParamsGetAlgorithmOidGetAlgorithmNameGetSigAlgIDget_AlgNamesAlgNamesbitsget_EffectiveKeyBitsEffectiveKeyBitsseedGetSeeddomainParamsget_DomainParametersDomainParameterscurvehget_Curveget_Nget_HCurveNGenerateDerivedKeyprimeListsSixprimeProductsPrimeProductsGenerateSafePrimesSelectGeneratorCreateInRangeGenericSizenullVectorroundConstantsstatesubKeysdecryptKeys_initialised_forEncryptionencryptBlockdecryptBlockgammathetapi1pi2bytesToIntBigintToBytesBigrotlDIGEST_LENGTH_BYTESREDUCTION_POLYNOMIALBITCOUNT_ARRAY_SIZESBOXC4C5C6C7_rcEIGHTpackIntoLongmaskWithReductionPolynomial_buffer_bufferPos_bitCount_hash_K_L_block_stateprocessFilledBufferbytesToLongFromBufferconvertLongToByteArrayprocessBlockincrementfinishcopyBitLengthMyByteLengthbyteCount1byteCount2H5H6H7H8WwOffAdjustByteCountsChMajSum0Sum1Sigma0Sigma1DIGEST_LENGTHLMSumCEwSw_SfwUVsumByteArrayLongToBytescpyBytesToShortcpyShortToByteskdfdhParamsprivateValueCalculateMessageDigestSha1DigestSha224DigestSha256DigestSha384DigestSha512DigestMD5DigestGost3411DigestRipeMD128DigestRipeMD160DigestRipeMD256EncryptionRsaEncryptionDsaEncryptionECDsaEncryptionRsaPssEncryptionGost3410EncryptionECGost3410EncryptionECDsaWithSha1EncryptionECDsaWithSha224EncryptionECDsaWithSha256EncryptionECDsaWithSha384EncryptionECDsaWithSha512ecAlgorithms_certs_crls_signersIDictionary_digestsrandGetEncOidGetEncAlgorithmIdentifierGetBaseParametersGetAttributeSetAddCertificatesAddCrlsAddAttributeCertificatesAddSignersGetGeneratedDigestssignerInfsAddSignerGenerateCounterSignersdigcertdigestOIDencOIDsAttrunsAttrbaseSignedTableUserIdToBytesGetIdTimeToBytesget_TimecreationTimehashedDataunhashedDatasignatureEncodingGetSignatureBytesEncodeLengthAndDataGetEncodedSubpacketssetCreationTimeesigTypenestedMD5Sha1RipeMD160DoubleShaMD2Tiger192Haval5pass160Sha256Sha384Sha512Sha224keyInfosuppPubInfoget_KeyInfoget_PartyAInfoget_SuppPubInfoKeyInfoPartyAInfoSuppPubInfotargetsGetTargetscApathLenConstraintIsCAget_PathLenConstraintPathLenConstraintmacDataget_AuthSafeget_MacDataAuthSafeoidget_HasMoreTokensNextTokenHasMoreTokensSuccessfulMalformedRequestInternalErrorTryLaterSignatureRequiredUnauthorizedcrlUrlcrlNumcrlTimeget_CrlUrlget_CrlNumget_CrlTimeCrlUrlCrlNumCrlTimeissuerNameHashissuerKeyHashget_IssuerNameHashget_IssuerKeyHashIssuerNameHashIssuerKeyHashBuildEncodableVectorBuildDerEncodableVectorCreateDerSequenceCreateDerSetReadTagNumberReadLengthCreatePrimitiveDerObjectpoliciesGetPoliciesotherCertIDsGetOtherCertIDscommitmentTypeIdentifierqualifierget_CommitmentTypeIdentifierget_QualifierQualifier_contentType_contentEncryptionAlgorithm_encryptedContentget_ContentTypeget_ContentEncryptionAlgorithmGetEncryptedContentContentTypeContentEncryptionAlgorithmcontentEncryptionAlgorithmencryptedContentget_EncryptedContentEncryptedContentAddAttributeGetGetAllToHashtableToAsn1EncodableVector_limitSet00CheckReadVectorvFromEnumerableisIndirectpreviousCertificateIssuercertificateIssuerloadCertificateIssuerGetCertificateIssuerget_RevocationDateget_HasExtensionsRevocationDateHasExtensionsforwardreverseget_Forwardget_ReverseForwardReverseCreateSubjectPublicKeyInfoExtractBytes_localattributeCertattributeCertificateValidtargetNamestargetGroupsget_AttributeCertset_AttributeCertget_AttribueCertificateValidset_AttribueCertificateValidget_AttributeCertificateValidset_AttributeCertificateValidset_HolderAddTargetNameSetTargetNamesGetTargetNamesAddTargetGroupSetTargetGroupsGetTargetGroupsExtractGeneralNamesAttributeCertAttribueCertificateValidAttributeCertificateValidIsValidIsValidWithNetMaskIsValidIPv4unsafeIsValidIPv4IsValidIPv4WithNetmaskIsValidIPv6WithNetmaskIsMaskValueIsValidIPv6unsafeIsValidIPv6DecodeDecodeStringencodingTablepaddingdecodingTableInitialiseDecodingTableignorenextIdecodeLastBlockdtGetWrapperWrapUnwrapforWrappinggenprivKeyInitSigndoUpdateByteGenerateOnePassVersionlistSetRevocableSetExportableSetTrustSetKeyExpirationTimeSetSignatureExpirationTimeSetSignatureCreationTimeSetPreferredHashAlgorithmsSetPreferredSymmetricAlgorithmsSetPreferredCompressionAlgorithmsSetKeyFlagsSetSignerUserIdSetPrimaryUserIdSetNotationDataget_KeyKeyget_UnderlyingExceptionUnderlyingExceptionwithCompressionmultiplierpreCompInfoget_Yget_IsInfinityget_IsCompressedSetPreCompInfoSubtractNegateTwiceAssertECMultiplierYIsInfinityIsCompressedget_YTildeYTildeCheckPointsAddSimpleSubtractSimpleToBigIntegerget_FieldNameget_FieldSizeDivideSquareInvertSqrtFieldNameFieldSizefastLucasSequenceGnbTpbPpbrepresentationmk1k2k3tCheckFieldElementsget_Representationget_Mget_K1get_K2get_K3RepresentationK1K2K3uParsersaEnginealgIdforSigningoidMapDerEncodeGenerateSeedstopRunGetMacofbVofbOutVfirstStepN3N4bytesTointintTobytesBlockSizemacBlocknonceassociatedTextmacSizekeyParamProcessPacketcalculateMachasAssociatedTextGenerateBlindingFactorGenerateKeyPairparamroundsblock_sizekey_sizedeltad_sum_a_b_c_dbytesToIntunpackInt_noRounds_SP32Q32RotateRightM32S4S5S6S7S8MAX_ROUNDSRED_ROUNDS_Kr_Km_encrypting_workingKey_roundsF1F2F3CAST_EncipherCAST_DecipherBits32ToIntsIntsTo32bitsTheta0Theta1H0RLF4FF1FF2FF3FF4allGetFirstRecipientGetRecipientsGetExchangeEncryptionAlgorithmName_signerInfs_messageDigests_bufferSizeSetBufferSizeCalculateVersionCheckForVersion3_key_cert_digestOID_encOID_sAttr_unsAttr_digest_signatures1s2_contentOID_sigGenWriteToGeneratorGetDigestinputReadPacketUsageNoneUsageChecksumUsageSha1pubKeyPacketsecKeyDatas2kUsageencAlgorithms2kget_EncAlgorithmget_S2kUsageget_S2kget_PublicKeyPacketGetSecretKeyDataGetEncodedContentsEncAlgorithmS2kUsagevalidDaysnoticeRefexplicitTextorganizationnoticeNumbers_distributionPoint_onlyContainsUserCerts_onlyContainsCACerts_onlySomeReasons_indirectCRL_onlyContainsAttributeCertsget_OnlyContainsUserCertsget_OnlyContainsCACertsget_IsIndirectCrlget_OnlyContainsAttributeCertsget_DistributionPointget_OnlySomeReasonsOnlyContainsUserCertsOnlyContainsCACertsIsIndirectCrlOnlyContainsAttributeCertsOnlySomeReasonsget_PositiveValuePositiveValueget_NumberNumberhashedMessageGetHashedMessageattrTypeattrValuesget_AttrTypeget_AttrValuesAttrTypeAttrValuesbagIDbagValuebagAttributesget_BagIDget_BagValueget_BagAttributesBagIDBagValueBagAttributesobjectIDget_ObjectIDObjectIDget_EncryptionAlgorithmGetEncryptedDataEncryptionAlgorithmget_ContentContentV1versionPresentresponderIDproducedAtresponsesresponseExtensionsget_ResponderIDpkacSeqspkichallengeget_SubjectPublicKeyInfoget_ChallengeChallengenamingAuthorityprofessionInfosget_NamingAuthorityGetProfessionInfoscertificateHashget_CertificateHashCertificateHashProofOfOriginProofOfReceiptProofOfDeliveryProofOfSenderProofOfApprovalProofOfCreationdigestParamSetencryptionParamSetget_DigestParamSetget_EncryptionParamSetDigestParamSetEncryptionParamSetget_InfoGetKekInfoInfocompressionAlgorithmencapContentInfoget_CompressionAlgorithmIdentifierget_EncapContentInfoCompressionAlgorithmIdentifierEncapContentInfo_setLessThanOrEqualSortcrc32TableInitialiseCRCGetFinalCRCGetGlobalCRCSetGlobalCRCUpdateCRCglobalCrchashValueSethashValueget_IsValidNowCheckValidityget_IssuerDNget_SubjectDNget_NotBeforeget_NotAfterGetTbsCertificateget_SigAlgNameget_SigAlgOidGetSigAlgParamsget_SubjectUniqueIDGetKeyUsageGetExtendedKeyUsageGetBasicConstraintsGetSubjectAlternativeNamesGetIssuerAlternativeNamesGetAlternativeNamesGetPublicKeyCheckSignatureIsValidNowIssuerDNSubjectDNNotBeforeNotAfterSigAlgNameSigAlgOidSubjectUniqueIDGetEncodedBlockSizeGetDecodedBlockSizehexTableimplArrayCopyToget_IsSynchronizedget_SyncRootIsSynchronizedSyncRootCreateEncryptedPrivateKeyInfoReadOptionalTrustPacketReadSignaturesAndTrustReadUserIDsGetResponseObjectWindowNafseqNomacCalculateMacHasFullMessageGetRecoveredMessageTrailerImplicitTrailerRipeMD160TrailerRipeMD128TrailerSha1trailerkeyBitsblockmBufmessageLengthfullMessagerecoveredMessageIsSameAsClearBlockget_RoundsRoundsDesKeyLengthN_DES_WEAK_KEYSDES_weak_keysIsWeakKeySetOddParityDesEdeKeyLengthFixKeyGetMacSizeKeyMaterialIVMaterialMacMaterialAdjustsizeGenerateParametersparamPlusIVIV2sha1CalculateCmsKeyChecksumCheckCmsKeyChecksummOffCOffProcessChecksumencryptionAlgsdigestAlgsdigestAliasesAddEntriesGetDigestAlgNameGetDigestAliasesGetEncryptionAlgNameGetDigestInstanceGetSignatureInstanceCreateAttributeStoreCreateCertificateStoreCreateCrlStoreAddCertsFromSetAddCrlsFromSetFixAlgIDanyCertHasTypeOtheranyCertHasV1AttributeanyCertHasV2AttributeanyCrlHasTypeOtherIdeaCbcCast5Cbcrc2Tablerc2EkbDesEde3CbcRC2CbcAes128CbcAes192CbcAes256CbcCamellia128CbcCamellia192CbcCamellia256CbcSeedCbcDesEde3WrapAes128WrapAes192WrapAes256WrapCamellia128WrapCamellia192WrapCamellia256WrapSeedWrapECDHSha1KdfrecipientInfsAddKeyTransRecipientAddKekRecipientAddPasswordRecipientAddKeyAgreementRecipientGetAlgorithmIdentifierGenerateAsn1ParametersukmkeyEncAlgpubKeysubKeyIdsecKeyAlgorithmsecKeysecKeyIdoriginatorderivationAlgToRecipientInforecipientInfoStoreencAlgunprotectedAttributesGetRecipientInfosGetUnprotectedAttributesGetSecKeyDataBooleanToByteArrayIsPrimaryUserIdseparatorOOUTCNStreetSTSurnameGivenNameInitialsGenerationUniqueIdentifierBusinessCategoryPostalCodeDnQualifierPseudonymCountryOfCitizenshipCountryOfResidenceNameAtBirthTelephoneNumberEmailAddressUnstructuredNameUnstructuredAddressDCUIDget_DefaultReverseset_DefaultReversedefaultReverseDefaultSymbolsRFC2253SymbolsRFC1779SymbolsDefaultLookupOIDLookupSymbolLookuporderingconvertervaluesaddedDecodeOidGetOidsEquivalentequivalentStringsstripInternalSpacesAppendValueDefaultReversethisUpdatenextUpdatecrlEntriesSetSignatureSetIssuerSetThisUpdateSetNextUpdateAddCrlEntrySetExtensionsGenerateTbsCertListstartDateendDateSetHolderSetStartDateSetEndDateSetIssuerUniqueIDGenerateAttributeCertificateInfoIdQcsIdQcsPkixQCSyntaxV1IdQcsPkixQCSyntaxV2baseNameminimummaximumget_Baseget_Minimumget_MaximumBaseMinimumMaximumiterationsget_IterationsIterationsrequestorNamerequestListrequestExtensionsget_RequestorNameget_RequestListget_RequestExtensionsRequestorNameRequestListRequestExtensionsresponseTyperesponseget_ResponseTypeget_ResponseResponseTypeResponsetbsRequestoptionalSignatureget_TbsRequestget_OptionalSignatureOptionalSignatureencodedparsedIdIsisMttATNamingAuthoritiesRechtWirtschaftSteuernnamingAuthorityIDnamingAuthorityUrlnamingAuthorityTextget_NamingAuthorityIDget_NamingAuthorityTextget_NamingAuthorityUrlNamingAuthorityIDNamingAuthorityTextNamingAuthorityUrl_parser_first_currentStreamdateotherget_Dateget_OtherDateOther_originatorInfoCalledGetOriginatorInfoGetEncryptedContentInfoGetUnprotectedAttrsget_OutGetRawOutputStreamOut_tagged_isExplicit_tagNoWriteHdrWriteBerHeaderWriteBerBodyWriteBerEndGetOctetOutputStream_buf_off_gen_derOutBUFSIZEflushLevelbuf1outpEndMAX_WBITSPRESET_DICTZ_NO_FLUSHZ_PARTIAL_FLUSHZ_SYNC_FLUSHZ_FULL_FLUSHZ_FINISHZ_DEFLATEDZ_OKZ_STREAM_ENDZ_NEED_DICTZ_ERRNOZ_STREAM_ERRORZ_DATA_ERRORZ_MEM_ERRORZ_BUF_ERRORZ_VERSION_ERRORMETHODFLAGDICT4DICT3DICT2DICT1DICT0BLOCKSCHECK4CHECK3CHECK2CHECK1DONEBADmodemethodwasneedmarkernowrapwbitsblocksinflateResetinflateEndinflateInitinflateinflateSetDictionarymarkinflateSyncinflateSyncPointUnixEpochDateTimeToUnixMsUnixMsToDateTimeCurrentUnixMsfailureCodeget_FailureCodeFailureCodetsTokentsaSignerInfotstInfocertIDget_TimeStampInfoToCmsSignedDataTimeStampInfocertIDv2GetHashAlgorithmGetCertHashget_IssuerSerialmasterget_MastergeneratorSetSeedNextNextBytesDoubleScaleNextDoubleNextIntNextLongMasterCreateKeyGetBagAttributeGetBagAttributeKeysget_BagAttributeKeysBagAttributeKeysParseDekAlgNameCryptGetCipherParametersCanCertifyCanSignCanEncryptCommunicationsCanEncryptStorageMaybeSplitMaybeSharedpOutcOutwithIntegrityPacketoldFormatdigestOutmethodsdefAlgorithmAddMethodAddCheckSumCreateSessionInfosessionInfoAddSessionInfoHashSha1get_HashAlgOidGetIssuerNameHashGetIssuerKeyHashHashAlgOidpreComptwicePGetPreCompSetPreCompGetTwicePSetTwicePGetRandomlowerSigmaBoundget_LowerSigmaBoundLowerSigmaBoundphiNsmallPrimesget_PhiNget_SmallPrimesPhiNSmallPrimesGetSharedSecretderivationencodingmacKeySizeGetDerivationVGetEncodingVget_MacKeySizeMacKeySizeget_CipherKeySizeCipherKeySizeget_MacSizeGetAssociatedTextGetNonceMacSizehLenItoOSPP_00P_01P_02P_03P_04P_10P_11P_12P_13P_14P_20P_21P_22P_23P_24P_30P_31P_32P_33P_34GF256_FDBKGF256_FDBK_2GF256_FDBK_4RS_GF_FDBKMAX_KEY_BITSINPUT_WHITENOUTPUT_WHITENROUND_SUBKEYSTOTAL_SUBKEYSSK_STEPSK_BUMPSK_ROTLgMDS0gMDS1gMDS2gMDS3gSubKeysgSBoxk64CntF32RS_MDS_EncodeRS_remLFSR1LFSR2Mx_XMx_YM_b0M_b1M_b2M_b3Fe32_0Fe32_3BytesTo32BitsdefHashhashmgf1HashencodeBlockdecodeBlockmaskGeneratorFunction1get_MaximumMemoryReadContentInfoStreamToByteArrayGetCertificatesFromStoreGetCrlsFromStoreCreateBerSetFromListCreateDerSetFromListMaximumMemoryBufferSize_oid_bufSizeget_ContentStreamDrainContentStream_streamformatfileNamemodDateBufferSizePowerpartialBufferpartialBufferLengthpartialPowerpartialOffsetWriteNewPacketLengthWriteHeaderPartialFlushWritePartialWriteShortWriteIntWriteLongWritePacketWriteObjectsoutStreambufPtrcrcchunkCountstartclearTextnewLinenlheaderStartheaderTailfooterStartfooterTailheadersSetHeaderResetHeadersBeginClearTextEndClearTextWriteHeaderEntryDoWriteqcStatementIdqcStatementInfoget_StatementIdget_StatementInfoStatementIdStatementInfoserialissuerUidget_Serialget_IssuerUidSerialIssuerUidValueOctetsValueOidValueUtf8policyAuthorityvalueChoiceget_PolicyAuthorityget_ValueTypePolicyAuthorityValueTypebaseCertificateIDentityNameobjectDigestInfoget_BaseCertificateIDget_EntityNameget_ObjectDigestInfoBaseCertificateIDEntityNameobjIdscurvesnamesDefineCurveGetByNameGetByOidGetOidGetNameget_NamesNamesCreateParametersresponseStatusresponseBytesget_ResponseStatusget_ResponseBytesResponseStatussigPolicyget_SignaturePolicyIdGetObjectParserexplicitlyIsExplicitGetObjectisConstructedtagoctetsGetLengthOfLengthIsConstructedGetContentsget_ApplicationTagApplicationTagdigAlgorithmauthenticatedAttributesdigEncryptionAlgorithmencryptedDigestunauthenticatedAttributesget_AuthenticatedAttributesget_EncryptedDigestget_DigestEncryptionAlgorithmget_UnauthenticatedAttributesAuthenticatedAttributesEncryptedDigestDigestEncryptionAlgorithmUnauthenticatedAttributesget_OriginatorKeyOriginatorKeykekIDget_KekIDKekIDReadDerCrossCertificatePairReadCertPairReadCertPairsinpnomoreinputToByteArrayFromUtf8ByteArrayToUtf8ByteArrayencodersigPackm_intsGetUsedLengthget_BitLengthresizedIntsShiftLeftAddShiftedTestBitFlipBitSetBitReduceBitLengthFRFREEncryptBytehMacIntToOctetbitSizeConvertInputConvertOutputblindingFactorBlindMessageUnblindMessageagreemacBufprivParampubParamGenerateKdfBytes_keyIs128subkeykwkeSIGMASBOX1_1110SBOX4_4404SBOX2_0222SBOX3_3033rightRotateleftRotateroldqdecroldqroldqo32decroldqo32bytes2uintuint2bytescamelliaF2camelliaFLsprocessBlock128processBlock192or256H9F5passwordsaltHeaderFlagLengthHeaderNameLengthHeaderValueLengthcreateDataget_IsHumanReadableGetNotationNameGetNotationValueIsHumanReadableKeyIdToBytesIsExportableExpBiasSimpleSaltedSaltedAndIteratedGnuDummyS2KitCountprotectionModeget_TypeGetIterationCountget_ProtectionModeTypeProtectionModeexpPexpQcrtget_PrivateExponentget_PrimePget_PrimeQget_PrimeExponentPget_PrimeExponentQget_CrtCoefficientPrivateExponentPrimePPrimeQPrimeExponentPPrimeExponentQCrtCoefficientRsaGeneralRsaEncryptRsaSignElGamalEncryptDsaECECDsaElGamalGeneralDiffieHellmanExperimental_1Experimental_2Experimental_3Experimental_4Experimental_5Experimental_6Experimental_7Experimental_8Experimental_9Experimental_10Experimental_11m_innextnextBReadAllReadFullyNextPacketTagpartialdataLengthReadPartialDataLengthget_IdentifierIdentifierfget_PointPointsubjectPublicKeyInfosubjectUniqueIDget_VersionNumberget_StartDateget_EndDateVersionNumberStartDateEndDateroleAuthorityroleNameget_RoleAuthorityget_RoleNameGetRoleNameAsStringGetRoleAuthorityAsStringRoleAuthorityRoleNameusageTableHasKeyPurposeIdGetUsagesGetParametersGetObjectInTagPkcs1Pkcs3Pkcs5Pkcs7Pkcs9CertTypesCrlTypesIdCTIdCtiIdAAIdSpqPkcs12BagTypesPkcs12PbeIdsRsaEncryptionMD2WithRsaEncryptionMD5WithRsaEncryptionSha1WithRsaEncryptionSrsaOaepEncryptionSetIdRsaesOaepIdMgf1IdPSpecifiedIdRsassaPssSha256WithRsaEncryptionSha384WithRsaEncryptionSha512WithRsaEncryptionSha224WithRsaEncryptionDhKeyAgreementPbeWithMD2AndDesCbcPbeWithMD2AndRC2CbcPbeWithMD5AndDesCbcPbeWithMD5AndRC2CbcPbeWithSha1AndDesCbcPbeWithSha1AndRC2CbcIdPbeS2IdPbkdf2MD4IdHmacWithSha1IdHmacWithSha224IdHmacWithSha256IdHmacWithSha384IdHmacWithSha512Pkcs9AtEmailAddressPkcs9AtUnstructuredNamePkcs9AtContentTypePkcs9AtMessageDigestPkcs9AtSigningTimePkcs9AtCounterSignaturePkcs9AtChallengePasswordPkcs9AtUnstructuredAddressPkcs9AtExtendedCertificateAttributesPkcs9AtSigningDescriptionPkcs9AtExtensionRequestPkcs9AtSmimeCapabilitiesPkcs9AtFriendlyNamePkcs9AtLocalKeyIDX509CertTypeSdsiCertificateIdAlgPwriKekPreferSignedDataCannotDecryptAnySmimeCapabilitiesVersionsIdAAReceiptRequestIdCTTstInfoIdCTCompressedDataIdCtiEtsProofOfOriginIdCtiEtsProofOfReceiptIdCtiEtsProofOfDeliveryIdCtiEtsProofOfSenderIdCtiEtsProofOfApprovalIdCtiEtsProofOfCreationIdAAContentHintIdAAEncrypKeyPrefIdAASigningCertificateIdAASigningCertificateV2IdAAContentIdentifierIdAASignatureTimeStampTokenIdAAEtsSigPolicyIDIdAAEtsCommitmentTypeIdAAEtsSignerLocationIdAAEtsSignerAttrIdAAEtsOtherSigCertIdAAEtsContentTimestampIdAAEtsCertificateRefsIdAAEtsRevocationRefsIdAAEtsCertValuesIdAAEtsRevocationValuesIdAAEtsEscTimeStampIdAAEtsCertCrlTimestampIdAAEtsArchiveTimestampIdAASigPolicyIDIdAACommitmentTypeIdAASignerLocationIdAAOtherSigCertIdSpqEtsUriIdSpqEtsUNoticeKeyBagPkcs8ShroudedKeyBagCrlBagSecretBagSafeContentsBagPbeWithShaAnd128BitRC4PbeWithShaAnd40BitRC4PbeWithShaAnd3KeyTripleDesCbcPbeWithShaAnd2KeyTripleDesCbcPbeWithShaAnd128BitRC2CbcPbewithShaAnd40BitRC2CbcIdAlgCms3DesWrapIdAlgCmsRC2WrapsubjectPKInfocertStatussingleExtensionsget_CertIdget_CertStatusget_ThisUpdateget_NextUpdateget_SingleExtensionsThisUpdateNextUpdateSingleExtensionscountryNamelocalityNameget_CountryNameget_LocalityNameCountryNameLocalityNamecrlHashcrlIdentifierget_CrlHashget_CrlIdentifierCrlHashToAdjustedDateTimeget_AdjustedTimeget_AdjustedTimeStringAdjustedTimeAdjustedTimeStringEmptyBytes_lengthToArraystringsGetStringAtbaseBlockSizeMAX_ALPHA_SIZEMAX_CODE_LENRUNARUNBN_GROUPSG_SIZEN_ITERSMAX_SELECTORSNUM_OVERSHOOT_BYTESrNumscertificateCheckingdateAndTimeissuersmaxCrlNumberminCrlNumberattrCertCheckingcompleteCrlEnableddeltaCrlIndicatorEnabledissuingDistributionPointissuingDistributionPointEnabledmaxBaseCrlNumberget_CertificateCheckingset_CertificateCheckingget_DateAndTimeset_DateAndTimeget_Issuersset_Issuersget_MaxCrlNumberset_MaxCrlNumberget_MinCrlNumberset_MinCrlNumberget_AttrCertCheckingset_AttrCertCheckingget_CompleteCrlEnabledset_CompleteCrlEnabledget_DeltaCrlIndicatorEnabledset_DeltaCrlIndicatorEnabledget_IssuingDistributionPointset_IssuingDistributionPointget_IssuingDistributionPointEnabledset_IssuingDistributionPointEnabledget_MaxBaseCrlNumberset_MaxBaseCrlNumberCertificateCheckingDateAndTimeIssuersMaxCrlNumberMinCrlNumberAttrCertCheckingCompleteCrlEnabledDeltaCrlIndicatorEnabledIssuingDistributionPointEnabledMaxBaseCrlNumberinnerreqInfosigBitsGetCertificationRequestInfoget_SignatureAlgorithmSignatureAlgorithmexParamskeyAlgorithmsCreatePssParamsSetSignatureParametersLineLengthTextWriterwriterget_WriterEncodePrivateKeyWritePemBlockWriteFooterWriteBytesWriterBeginStringTextReaderreaderpFinderget_ReaderReadBytesReadBytesAndFieldsReadRsaPublicKeyReadPublicKeyReadCrlReadCertificateRequestReadAttributeCertificateReadPkcs7ReadKeyPairReadECParametersGetCurveParametersReadECPrivateKeyReaderGoodget_HasRevocationReasonHasRevocationReasonGetCertIDget_SingleRequestExtensionsSingleRequestExtensionsWriteUint8WriteUint16WriteUint24WriteUint32WriteUint64ReadUint8ReadUint16ReadUint24ReadUint32CheckVersionWriteVersionhmac_hashPRFstandardSaltsaltLengthLtoOSPMaskGeneratorFunction1dsaSignerAddSeedMaterialwindowwindowCountdoNextBytescounterOutcntStepidxGetByteZeroeshdrLength_encodingimageDataget_EncodingGetImageDataEncodingJpegIntegerToBytesSubjectAlternativeNameIssuerAlternativeNameReasonCodeInstructionCodeInvalidityDateDeltaCrlIndicatorCertificateIssuerCrlDistributionPointsCertificatePoliciesPolicyConstraintsFreshestCrlInhibitAnyPolicyAuthorityInfoAccessSubjectInfoAccessLogoTypeBiometricInfoQCStatementsAuditIdentityNoRevAvailOidsget_ExtensionOidsGetExtensionExtensionOidsSystem.Text.RegularExpressionsRegexOidRegexidentifierget_IdWriteFieldMakeOidStringFromBytesIdIdKPAnyExtendedKeyUsageIdKPServerAuthIdKPClientAuthIdKPCodeSigningIdKPEmailProtectionIdKPIpsecEndSystemIdKPIpsecTunnelIdKPIpsecUserIdKPTimeStampingIdKPOcspSigningIdKPSmartCardLogonContentTypeIA5StringContentTypeBmpStringContentTypeUtf8StringContentTypeVisibleStringDisplayTextMaximumSizecontentsIdADCAIssuersIdADOcspaccessMethodaccessLocationget_AccessMethodget_AccessLocationAccessMethodAccessLocationcapabilitiesAddCapabilityprivateExponentprime1prime2exponent1exponent2coefficientget_Prime1get_Prime2get_Exponent1get_Exponent2get_CoefficientPrime1Prime2Exponent1Exponent2CoefficientcertSerialNumberget_CertificateSerialNumberCertificateSerialNumberGetContentInfopublicKeyCertGetCertificateBytesPublicKeyCertificateGetHashValue_compressionAlgorithm_encapContentInfoAddCrlGenerateCertList_header1_header2_footer1_footer2ReadLineReadPemObjectGetObjectDigestGenerateGeneralNamesGetEntityNamesGetIssuerMANYTYPELENSSTOREDTABLEBTREEDTREECODESDRYinflate_maskborderleftblensbbtbcodesbitkbitbhuftsendreadwritecheckfncheckinftreeresetprocfreeset_dictionarysync_pointinflate_flushCheckElementsAreOfTypeaccuracySecondsaccuracyMillisaccuracyMicrostsatsaPolicyOIDsignedAttrunsignedAttrx509Certsx509CrlsSetCertificatesSetCrlsSetAccuracySecondsSetAccuracyMillisSetAccuracyMicrosSetOrderingSetTsakgAlgorithmskpgAlgorithmsAddKgAlgorithmAddKpgAlgorithmAddHMacKeyGeneratorGetCanonicalKeyGeneratorAlgorithmGetCanonicalKeyPairGeneratorAlgorithmGetKeyGeneratorGetKeyPairGeneratorGetBasicAgreementGetBasicAgreementWithKdfMinIterationsSaltSizekeyslocalIdschainCertskeyCertsCreateSubjectKeyIDLoadIsCertificateEntryIsKeyEntryGetAliasesTableget_AliasesContainsAliasGetCertificateAliasGetCertificateChainSetCertificateEntrySetKeyEntryDeleteEntryIsEntryOfTypeSaveCalculatePbeMacCryptPbeDataAliasesorigget_Keysset_Itemget_ValuesKeysValuesSetImageAttributesecrettrustpubget_IsSigningKeyget_PublicKeyget_UserIdsget_UserAttributesExtractKeyDataExtractPrivateKeyChecksumCopyWithNewPasswordEncryptKeyDataIsSigningKeyUserIdsUserAttributesGetPublicKeysInsertPublicKeyRemovePublicKeyGetResponderIdGetResponsesSigRequiredMultiplyWTnafMultiplyFromWTnafexponentget_ExponentExponentdPdQqInvget_DPget_DQget_QInvDPDQQInvcountSmallPrimesdebugget_CountSmallPrimesget_IsDebugCountSmallPrimesIsDebugnonceMacassociatedTextMacbufBlockprocessverifyMaccfbVcfbOutVx1x2x3x4initKeypiTableRotateWordLeft_Tr_TmT1T2T3Tinv1Tinv2Tinv3algCrc24InitCrc24PolyGetValue_paramsget_IsNamedCurveIsNamedCurveextOrderingtbsCertsigAlgIDget_TbsCertificateTbsCertificatesemanticsIdentifiernameRegistrationAuthoritiesget_SemanticsIdentifierGetNameRegistrationAuthoritiesSemanticsIdentifierIdEtsiQcsIdEtsiQcsQcComplianceIdEtsiQcsLimitValueIdEtsiQcsRetentionPeriodIdEtsiQcsQcSscdreqCertsingleRequestExtensionsget_ReqCertReqCertcurrencyamountget_Currencyget_AmountCurrencyAmountget_OtherKeyAttributeMessageDigestSigningTimeCounterSignatureBadAlgBadMessageCheckBadRequestBadTimeBadCertIdBadDataFormatWrongAuthorityIncorrectDataMissingTimeStampBadPopTimeNotAvailableUnacceptedPolicyUnacceptedExtensionAddInfoNotAvailableSystemFailure_baseTag_tagNumber_contentStream_indefiniteLengthget_IsConstructedrLoadVectorGetAlgNamesGetSignatureForObjectsecretRingsorderGetKeyRingsGetSecretKeyGetSecretKeyRingAddSecretKeyRingRemoveSecretKeyRingpubRingsGetPublicKeyRingAddPublicKeyRingRemovePublicKeyRingGetEncryptedDataObjectsAddRequestSetRequestorNameSetRequestExtensionsGenerateRequestcertIdToRequestWidthPow2WidthMinusOneMinusTwoMinusThreeFourAlpha0Alpha0TnafAlpha1Alpha1TnafNormRoundApproximateDivisionByNTauAdicNafTauGetMuGetLucasGetTwGetSiPartModReductionMultiplyRTnafMultiplyTnafMultiplyFromTnafTauAdicWNafTLS_RSA_WITH_3DES_EDE_CBC_SHATLS_DHE_RSA_WITH_3DES_EDE_CBC_SHATLS_RSA_WITH_AES_128_CBC_SHATLS_DHE_RSA_WITH_AES_128_CBC_SHATLS_RSA_WITH_AES_256_CBC_SHATLS_DHE_RSA_WITH_AES_256_CBC_SHAWriteCipherSuitesGetCipherSuiteCONSTANT_128CONSTANT_64ZEROESLuLu2doubleLugeneratePrimepermuteListfindFirstPrimesSS0SS1SS2SS3KCwKeycreateWorkingKeyextractW1extractW0rotateLeft8rotateRight8bytesToLonglongToBytesphaseCalc1phaseCalc2shadowsinverseSetPadBitsGetAttributescreateStandardAttributeTablesignedContentsignedDatasignerInfoStoreattrCertStorecertificateStorecrlStorehashesGetAttributeCertificatesget_SignedContentTypeOidget_SignedContentReplaceSignersReplaceCertificatesAndCrlsSignedContentTypeOidSignedContentKeySizesCiphersBaseCipherNamesGetAsymmetricEncryptionAlgNameCreateAsymmetricCipherCreateWrapperGetRfc3211WrapperNameCertifyOtherSignDataEncryptCommsEncryptStorageSplitAuthenticationSharedget_FlagsFlagsget_IsCriticalConvertValueToObjectaltNamePresentAndCriticalSetSubjectSetSubjectPublicKeyInfoGenerateTbsCertificatepermittedexcludedcreateSequenceget_PermittedSubtreesget_ExcludedSubtreesPermittedSubtreesExcludedSubtreesFromHexkalgIDget_AlgorithmIDget_PrivateKeyAlgorithmIDPrivateKeyIsakmpOakleyHmacMD5HmacSha1HmacTigerHmacRipeMD160contentDescriptionget_ContentDescriptionContentDescriptionotherRevValTypeget_OtherRevValTypeget_OtherRevValsObjectOtherRevValTypeOtherRevValsObjectocspResponsesGetOcspResponsescrlIssuercrlIssuedTimecrlNumberget_CrlIssuedTimeget_CrlNumberCrlIssuedTimeGostIDGostR3411GostR28147CbcGostR3410x94GostR3410x2001GostR3411x94WithGostR3410x94GostR3411x94WithGostR3410x2001GostR3411x94CryptoProParamSetGostR3410x94CryptoProAGostR3410x94CryptoProBGostR3410x94CryptoProCGostR3410x94CryptoProDGostR3410x94CryptoProXchAGostR3410x94CryptoProXchBGostR3410x94CryptoProXchCGostR3410x2001CryptoProAGostR3410x2001CryptoProBGostR3410x2001CryptoProCGostR3410x2001CryptoProXchAGostR3410x2001CryptoProXchBGostElSgDH3410DefaultGostElSgDH3410x1certsBercrlsBerget_CRLsCRLsoriginatorInforecipientInfosencryptedContentInfounprotectedAttrsget_OriginatorInfoget_RecipientInfosget_EncryptedContentInfoget_UnprotectedAttrsRecipientInfosUnprotectedAttrsversion_Z_NO_COMPRESSIONZ_BEST_SPEEDZ_BEST_COMPRESSIONZ_DEFAULT_COMPRESSIONZ_FILTEREDZ_HUFFMAN_ONLYZ_DEFAULT_STRATEGYBufferGetObjectIdentifierget_AlgorithmsGetSignerGetEncodingNameAlgorithmsbOutCreatePrivateKeyInfoencDataencStreamtruncStreamIsIntegrityProtectedLookAheadSizeLookAheadBufSizeLookAheadBufLimitlookAheadbufStartbufEndFillBufferGetLookAheadFromBigIntegerCreatePointDecodePointget_Infinityget_BInfinityBDecompressPointinfinitymusiget_IsKoblitzsolveQuadradicEquationIsTrinomialIsKoblitzInitBufSizeNextTwoPowdatabufskippedavailableAddDataRemoveDataget_AvailableAvailablepublicKeyget_BlindingFactorBlindingFactorlget_LlastKey2lastKey3GetMacBlock_sum0_sum1bytesToUintunpackUintextraInfoget_KeySizeGetZGetExtraInfoKeySizeGetFirstSignerGetSigners_signedData_signedContent_signerInfoStore_certSet_crlSet_isCertCrlParsed_attributeStore_certificateStore_crlStorePopulateCertCrlSetsGetSignedContentWriteSetToGeneratorTaggedGetAsn1SetPipeOctetStringenvelopedData_unprotectedAttributes_attrNotReadtbsCertListget_TbsCertListGetRevokedCertificatesGetRevokedCertificateEnumerationTbsCertListpkiStatusInfotimeStampTokenget_TimeStampTokenmessageImprinttsaPolicycertReqget_MessageImprintTeleTrusTAlgorithmRipeMD128RipeMD256TeleTrusTRsaSignatureAlgorithmRsaSignatureWithRipeMD160RsaSignatureWithRipeMD128RsaSignatureWithRipeMD256ECSignECSignWithSha1ECSignWithRipeMD160EccBrainpoolEllipticCurveVersionOneBrainpoolP160R1BrainpoolP160T1BrainpoolP192R1BrainpoolP192T1BrainpoolP224R1BrainpoolP224T1BrainpoolP256R1BrainpoolP256T1BrainpoolP320R1BrainpoolP320T1BrainpoolP384R1BrainpoolP384T1BrainpoolP512R1BrainpoolP512T1EncrypKeyPrefcertValueget_CertIDget_CertValueCertValue_b1_b2_eofReached_eofOn00SetEofOn00CheckForEofIdIcaoIdIcaoMrtdIdIcaoMrtdSecurityIdIcaoLdsSecurityObjectcertHashissuerSerialsha1HashotherHashWriteDerEncoded_bOutIsPrintableStringDEF_WBITSMAX_MEM_LEVELnext_innext_in_indexavail_intotal_innext_outnext_out_indexavail_outtotal_outmsgdstateistatedata_typeadler_adlerdeflateInitdeflatedeflateEnddeflateParamsdeflateSetDictionaryflush_pendingread_bufSTARTLENLENEXTDISTDISTEXTCOPYLITWASHENDBADCODElentreetree_indexlitgetdistlbitsdbitsltreeltree_indexdtreedtree_indexinitinflate_fastDEF_MEM_LEVELFASTSLOWNeedMoreBlockDoneFinishStartedFinishDoneINIT_STATEBUSY_STATEFINISH_STATESTORED_BLOCKSTATIC_TREESDYN_TREESZ_BINARYZ_ASCIIZ_UNKNOWNBuf_sizeREP_3_6REPZ_3_10REPZ_11_138MIN_MATCHMAX_MATCHMIN_LOOKAHEADHEAP_SIZEEND_BLOCKconfig_tablez_errmsgstrmpending_bufpending_buf_sizepending_outpendingnoheaderlast_flushw_sizew_bitsw_maskwindow_sizeprevheadins_hhash_sizehash_bitshash_maskhash_shiftblock_startmatch_lengthprev_matchmatch_availablestrstartmatch_startlookaheadprev_lengthmax_chain_lengthmax_lazy_matchlevelstrategygood_matchnice_matchdyn_ltreedyn_dtreebl_treel_descd_descbl_descbl_countheapheap_lenheap_maxdepthl_buflit_bufsizelast_litd_bufopt_lenstatic_lenmatcheslast_eob_lenbi_bufbi_validlm_inittr_initinit_blockpqdownheapsmallerscan_treebuild_bl_treesend_all_treessend_treeput_byteput_shortputShortMSBsend_codesend_bits_tr_align_tr_tallycompress_blockset_data_typebi_flushbi_windupcopy_blockflush_block_onlydeflate_stored_tr_stored_block_tr_flush_blockfill_windowdeflate_fastdeflate_slowlongest_matchdeflateInit2deflateResetgood_lengthmax_lazynice_lengthmax_chainCreateNotImplementedExceptionGetEnvironmentVariableGetNewLineMoveNextget_CurrentCurrentdigestLengthsdigestNamesValidateCertificateGetDigestLengthreqPolicySetReqPolicySetCertReqsigscertificationLevelpassPhraseuseSha1masterKeyhashedPacketVectorunhashedPacketVectorAddSubKeyGenerateSecretKeyRingGeneratePublicKeyRingsLenemBitsmDashsBoxGetSBoxinMacoutMacReadMacWriteMacwordSizebytesPerWordLGWsrMcollevelAndTrustAmountGetLevelAndTrustAmountGetEncSessionKeyfieldIdentifierCommonNameStateOrProvinceNameOrganizationOrganizationalUnitNameRipeMD160WithRsaEncryptionIdEARsaIdPkixIdPEIdADOcspAccessMethodCrlAccessMethodMinMillisMaxMillisMinMicrosMaxMicrossecondsmillismicrosget_Secondsget_Millisget_MicrosSecondsMillisMicrosIsIA5StringSslClientSslServerSmimeObjectSigningSslCASmimeCAObjectSigningCAMicrosoftMicrosoftCertTemplateV1MicrosoftCAVersionMicrosoftPrevCACertHashMicrosoftCertTemplateV2MicrosoftAppPoliciesrestrictionget_RestrictionStringRestrictionStringocspResponderIDget_OcspResponderIDOcspResponderIDget_TagparamSetSETMASKCLEARMASKGREATER_ICOSTLESSER_ICOSTSMALL_THRESHDEPTH_THRESHQSORT_STACK_SIZEfinishedPanicHbMakeCodeLengthsbytesOutquadrantzptrszptrftabnMTFmtfFreqworkFactorworkDoneworkLimitfirstAttemptnBlocksRandomisedrunLengthWriteRunblockCRCcombinedCRCallowableBlockSizeEndCompressionHbAssignCodesBsWBsPutUCharBsPutintBsPutIntVSSendMTFValuesMoveToFrontCodeAndSendSimpleSortVswapMed3QSort3MainSortRandomiseBlockDoReversibleTransformationFullGtUincsAllocateCompressStructuresGenerateMTFValuesllhhddGetIssuerUniqueIDnotBeforenotAfterDigitalSignatureNonRepudiationKeyEnciphermentDataEnciphermentKeyAgreementKeyCertSignCrlSignEncipherOnlyDecipherOnlyusagePemCrlParserlazyAsn1sCrlDatasCrlDataObjectCountcurrentCrlStreamReadPemCrlReadDerCrlGetCrlCreateX509CrlReadCrlsCreatefixed_blfixed_bdBMAXfixed_tlfixed_tdcplenscplextcpdistcpdexthnrhuft_buildinflate_trees_bitsinflate_trees_dynamicinflate_trees_fixedinitWorkAreaAreEqualAreSameHaveSameContentsgenTimeget_IsOrderedget_Accuracyget_GenTimeget_GenTimeAccuracyget_Tsaget_TstInfoIsOrderedGenTimeTsaGetSecretKeysInsertSecretKeyRemoveSecretKeyprivcompressiondOutpkOutdoOpenRL_CHANGE_CIPHER_SPECRL_ALERTRL_HANDSHAKERL_APPLICATION_DATAHP_HELLO_REQUESTHP_CLIENT_HELLOHP_SERVER_HELLOHP_CERTIFICATEHP_SERVER_KEY_EXCHANGEHP_CERTIFICATE_REQUESTHP_SERVER_HELLO_DONEHP_CERTIFICATE_VERIFYHP_CLIENT_KEY_EXCHANGEHP_FINISHEDCS_CLIENT_HELLO_SENDCS_SERVER_HELLO_RECEIVEDCS_SERVER_CERTIFICATE_RECEIVEDCS_SERVER_KEY_EXCHANGE_RECEIVEDCS_CERTIFICATE_REQUEST_RECEIVEDCS_SERVER_HELLO_DONE_RECEIVEDCS_CLIENT_KEY_EXCHANGE_SENDCS_CLIENT_CHANGE_CIPHER_SPEC_SENDCS_CLIENT_FINISHED_SENDCS_SERVER_CHANGE_CIPHER_SPEC_RECEIVEDCS_DONEAP_close_notifyAP_unexpected_messageAP_bad_record_macAP_decryption_failedAP_record_overflowAP_decompression_failureAP_handshake_failureAP_bad_certificateAP_unsupported_certificateAP_certificate_revokedAP_certificate_expiredAP_certificate_unknownAP_illegal_parameterAP_unknown_caAP_access_deniedAP_decode_errorAP_decrypt_errorAP_export_restrictionAP_protocol_versionAP_insufficient_securityAP_internal_errorAP_user_canceledAP_no_renegotiationAL_warningAL_fatalemptybufTLS_ERROR_MESSAGEapplicationDataQueuechangeCipherSpecQueuealertQueuehandshakeQueuersserverRsaKeytlsInputStreamtlsOutputStreamfailedWithErrorappDataReadyclientRandomserverRandommschoosenCipherSuiteYcpmsverifyerconnection_stateProcessDataprocessHandshakeprocessApplicationDataprocessAlertprocessChangeCipherSpecsendClientCertificateConnectReadApplicationDataWriteDataget_TlsOuputStreamget_OutputStreamget_TlsInputStreamget_InputStreamFailWithErrorAssertEmptyOutputStreamInputStreamIPADOPADdigestSizeblockLengthinputPadoutputPadGetUnderlyingDigestinDigestoutDigestReadDigestWriteDigestPHIX0X1X2X3MakeWorkingKeySb0Ib0Sb1Ib1Sb2Ib2Sb3Ib3Sb4Ib4Sb5Ib5Sb6Ib6Sb7Ib7LTInverseLTcalculateRG1G2Mod1024Mod512DimDefaultBufSize_fileImageAttributeNullIdeaTripleDesCast5BlowfishSaferDesAes128Aes192Aes256TwofishIsRevocablevalUncompressedZipBZip2OtherNameRfc822NameDnsNameX400AddressDirectoryNameEdiPartyNameUniformResourceIdentifierRegisteredIDtoGeneralNameEncodingparseIPv4MaskparseIPv4parseMaskcopyIntsparseIPv6choiceObjtsaPolicyIdaccuracyget_OrderingOrderingSmimeCapabilitesVersionsGetCapabilitiesSecT163k1SecT163r1SecT239k1SecT113r1SecT113r2SecP112r1SecP112r2SecP160r1SecP160k1SecP256k1SecT163r2SecT283k1SecT283r1SecT131r1SecT131r2SecT193r1SecT193r2SecT233k1SecT233r1SecP128r1SecP128r2SecP160r2SecP192k1SecP224k1SecP224r1SecP384r1SecP521r1SecT409k1SecT409r1SecT571k1SecT571r1SecP192r1SecP256r1RechtsanwltinRechtsanwaltRechtsbeistandSteuerberaterinSteuerberaterSteuerbevollmchtigteSteuerbevollmchtigterNotarinNotarNotarvertreterinNotarvertreterNotariatsverwalterinNotariatsverwalterWirtschaftsprferinWirtschaftsprferVereidigteBuchprferinVereidigterBuchprferPatentanwltinPatentanwaltprofessionItemsprofessionOidsregistrationNumberaddProfessionInfoget_AddProfessionInfoGetProfessionItemsGetProfessionOidsget_RegistrationNumberAddProfessionInfoRegistrationNumberinformationget_InformationInformationUBDataGroupsdigestAlgorithmIdentifierdatagroupHashCheckDatagroupHashSeqSizeget_DigestAlgorithmIdentifierGetDatagroupHashDigestAlgorithmIdentifierDefaultAlgIDIsNumericStringBooleanIntegerBitStringOctetStringObjectIdentifierExternalEnumeratedSequenceSequenceOfSetSetOfNumericStringPrintableStringT61StringVideotexStringIA5StringUtcTimeGeneralizedTimeGraphicStringVisibleStringGeneralStringUniversalStringBmpStringUtf8StringConstructedApplicationTaggedderNullcollectionGetCollectionFromPublicKeyDIST_CODE_LENextra_lbitsextra_dbitsextra_blbitsbl_order_dist_code_length_codebase_lengthbase_distd_codedyn_treemax_codestat_descgen_bitlenbuild_treegen_codesbi_reverseUnreadGost3411AllowedGetTimeComponentAddAlgorithmGetCanonicalAlgorithmNameCreateKeyParameterCreateIVOctetStringCreateIVDefaultMinimumLengthjGetDefaultMget_JJidDatasubpacketsGetSubpacketsGetPreferencesissuerNameget_IssuerNameIssuerNametargetNametargetGroupget_TargetGroupget_TargetNameTargetGroupTargetNameGroupget_Asn1ObjectcountrytypeOfSubstitutionthirdPersoncertRefget_Countryget_TypeOfSubstitutionget_ThirdPersonget_CertRefCountryTypeOfSubstitutionThirdPersonCertRefdeclarationget_NotYoungerThanget_FullAgeAtCountryNotYoungerThanFullAgeAtCountryotherRevRefTypeotherRevRefsget_OtherRevRefTypeget_OtherRevRefsObjectOtherRevRefTypeOtherRevRefsObjectcrlidsocspidsotherRevget_CrlIDsget_OcspIDsget_OtherRevCrlIDsOcspIDsOtherRevcrlOcspRefsGetCrlOcspRefsFalseTrueget_IsTrueIsTruerKeyIDget_IssuerAndSerialNumberget_RKeyIDRKeyIDMaxLengthToBytesoctsGenerateOctsGetCertStatusGetTbsRequestGetRequestListget_IsSignedIsSignedSumOfTwoMultipliesShamirsTrickImplShamirsTrickRinitSJ0totalLengthProcessgCTRBlockgHASHgHASHBlockincmultiplyasBlockgenerateWorkingKeygost28147_mainStepgost28147MacFuncCM5funcP64Q64t1t2t3t4bOffRoundABCRoundBCARoundCABKeySchedulebcpgOutoutBufcrcFoundhasHeadersheadernewLineFoundrestartheaderListlastCParseHeadersIsClearTextGetArmorHeaderLineGetArmorHeadersReadIgnoreSpaceReadIgnoreWhitespaceReadByteClearTextReadClearTextDoReadByteAnsiX962IdFieldTypeIdECSigTypeIdPublicKeyTypePrimeFieldCharacteristicTwoFieldGNBasisTPBasisPPBasisECDsaWithSha1IdECPublicKeyECDsaWithSha2ECDsaWithSha224ECDsaWithSha256ECDsaWithSha384ECDsaWithSha512CTwoCurveC2Pnb163v1C2Pnb163v2C2Pnb163v3C2Pnb176w1C2Tnb191v1C2Tnb191v2C2Tnb191v3C2Onb191v4C2Onb191v5C2Pnb208w1C2Tnb239v1C2Tnb239v2C2Tnb239v3C2Onb239v4C2Onb239v5C2Pnb272w1C2Pnb304w1C2Tnb359v1C2Pnb368w1C2Tnb431r1PrimeCurvePrime192v1Prime192v2Prime192v3Prime239v1Prime239v2Prime239v3Prime256v1DHPublicNumberIdDsaIdDsaWithSha1X9x63SchemeDHSinglePassStdDHSha1KdfSchemeDHSinglePassCofactorDHSha1KdfSchemeMqvSinglePassSha1KdfSchemeX9x42SchemesDHStaticDHEphemDHOneFlowDHHybrid1DHHybrid2DHHybridOneFlowMqv2Mqv1fieldIDGetTargetsObjectsIdQtIdQtCpsIdQtUnoticeacinfosignatureValueget_ACInfoget_SignatureValueACInfoSignatureValueMainissuerAndSerialNumbertrailerFieldDefaultSaltLengthDefaultTrailerFieldget_SaltLengthget_TrailerFieldSaltLengthTrailerFieldget_CertsCertsGnuGnuPGNotationPkaAddressGnuRadarSerpentSerpent128EcbSerpent128CbcSerpent128OfbSerpent128CfbSerpent192EcbSerpent192CbcSerpent192OfbSerpent192CfbSerpent256EcbSerpent256CbcSerpent256OfbSerpent256CfbCrcCrc32ocspIdentifierocspRepHashget_OcspIdentifierget_OcspRepHashOcspRepHashcommitmentTypeIdcommitmentTypeQualifierget_CommitmentTypeIDget_CommitmentTypeQualifierCommitmentTypeIDcryptoProAcryptoProBcryptoProXchAkeyDerivationAlgorithmacInfoGenSetIssuerUniqueIdPemAttrCertParserReadAttrCertReadAttrCertsCloneSelectorcertPairforwardSelectorreverseSelectorget_CertPairset_CertPairget_ForwardSelectorset_ForwardSelectorget_ReverseSelectorset_ReverseSelectorCertPairForwardSelectorReverseSelectorGetIssuerX509PrincipalGetSubjectX509PrincipalFromExtensionValueGetAlternativeNameGetCipherGetDigitIndexHasSubpacketGetNotationDataOccurencesGetIssuerKeyIdHasSignatureCreationTimeGetSignatureCreationTimeGetSignatureExpirationTimeGetKeyExpirationTimeGetPreferredHashAlgorithmsGetPreferredSymmetricAlgorithmsGetPreferredCompressionAlgorithmsGetKeyFlagsGetSignerUserIdGetCriticalTagsEmptySignatureSubpacketsunhashedhashedSetHashedSubpacketsSetUnhashedSubpacketsGenerateCertificationpacketPresentinsertSubpacketkeyDataGetKeyCipherConfirmCheckSumGetSymmetricAlgorithmfetchSymmetricKeyDatabigIntscaleCheckScaleAdjustScaleCompareToFloorget_LongValueget_ScaleLongValueScaleoneByteDefaultTestsDefaultPublicExponentstateSizesigmataucW0cW1cW2salsa20WordToByteresetCounterlimitExceededESbox_TestESbox_AESbox_BESbox_CESbox_DDSbox_TestDSbox_AsBoxesGost28147_mainStepGost28147FuncGetWorkingKeyDf_Keybytebitbigbytepc1totrotpc2SP1SP2SP3SP4SP5SP6SP7SP8DesFuncworkingKey1workingKey2workingKey3Y1Y2Y3Y4_originatorInfo_berEncodeRecipientSetSetBerEncodeRecipients_envGenuserCertificaterevocationDatecrlEntryExtensionsget_UserCertificateUserCertificaterevokedCertificatescrlExtensionsenpseudonymsurnamegivenNameget_Pseudonymget_SurnameGetGivenNameAlphabeticMaxSizeNumericMinSizeNumericMaxSizeget_IsAlphabeticget_Alphabeticget_NumericIsAlphabeticAlphabeticNumeric_notBefore_notAfterpolicyQualifierIdpolicyIdentifierpolicyQualifiersget_PolicyIdentifierget_PolicyQualifiersPolicyIdentifierPolicyQualifiersdigInfoget_MacMactbsResponseDataget_TbsResponseDataGetSignatureAlgorithmTbsResponseDataotherCertHashget_OtherCertHashOtherCertHashsigAlgNamesigAlgParamsLoadCrlEntriesGetRevokedCertificateGetTbsCertListAsHexStringPipeAllreadTimeStampRespGetStatusStringGetFailInfoPkcs5S1Pkcs5S2OpenSslalgorithmTypeMakePbeGeneratorIsPkcs12IsPkcs5Scheme1IsPkcs5Scheme2IsOpenSslIsPbeAlgorithmGenerateAlgorithmParametersGenerateCipherParametersCreateEngineEndsWithCreateStreamCipherAddResponseSetResponseExtensionsGenerateResponseToResponseIMASKBitsPerByteBitsPerIntBytesPerIntUIMASKZeroMagnitudeZeroEncodingZeroOneTwoThreeTenchunk2radix2radix2Echunk10radix10radix10Echunk16radix16radix16ERandomSourcesignmagnitudenBitsnBitLengthmQuoteMakeMagnituderndMaskAbsAddMagnitudesAddToMagnitudeAndAndNotget_BitCountbitCountscalcBitLengthBitLenQuickPow2CheckCompareNoLeadingZeroesDivideAndRemainderGcdIncIsProbablePrimeCheckProbablePrimeRabinMillerTestMaxMinModModInverseExtEuclidZeroOutModPowFastExtEuclidFastModInverseGetMQuoteMultiplyMontyMultiplyMontyNIsOneNextProbablePrimeNotPowProbablePrimeRemainderLastNBitsShiftRightInPlaceShiftRightOneInPlaceShiftRightget_SignValuedoSubBigLilToByteArrayUnsignedcreateUValueOfcreateValueOfValueOfGetLowestSetBitOrXorClearBitFlipExistingBitBitCountSignValuemd5DigestUpdateDigestDoFinalx0x0LcLget_Cget_X0get_CLget_X0LCLX0Ltypeprocinit_randomprocedure_Aprocedure_Aaprocedure_Bprocedure_Bbprocedure_CIsValidDsaStrengthMAXROUNDSMAXKCLogtableAlogtableshifts0shifts1Mul0x2Mul0x3Mul0x9Mul0xbMul0xdMul0xeKeyAdditionShiftRowApplySSubstitutionMixColumnInvMixColumnBCBC_MASKblockBitsA0A1A2A3shifts0SCshifts1SClookupset_DebugEncryptAddCryptedBlockschineseRemainderDebugGetBufferPositionpublicParameterprivateParameterget_Publicget_PrivatePublicPrivate_encryptedKeyExpireTimeTrustSigRegExpKeyExpireTimePlaceholderPreferredSymmetricAlgorithmsRevocationKeyPreferredHashAlgorithmsPreferredCompressionAlgorithmsKeyServerPreferencesPreferredKeyServerPolicyUrlget_PublicKeyDataPublicKeyDatatypeOfBiometricDatabiometricDataHashsourceDataUriget_TypeOfBiometricDataget_BiometricDataHashget_SourceDataUriBiometricDataHashSourceDataUricapabilityIDget_CapabilityIDCapabilityIDIdCamellia128CbcIdCamellia192CbcIdCamellia256CbcIdCamellia128WrapIdCamellia192WrapIdCamellia256WrapNistAlgorithmIdSha256IdSha384IdSha512IdSha224AesIdAes128EcbIdAes128CbcIdAes128OfbIdAes128CfbIdAes128WrapIdAes192EcbIdAes192CbcIdAes192OfbIdAes192CfbIdAes192WrapIdAes256EcbIdAes256CbcIdAes256OfbIdAes256CfbIdAes256WrapIdDsaWithSha2DsaWithSha224DsaWithSha256DsaWithSha384DsaWithSha512VerisignNetscapeNetscapeBaseUrlNetscapeCARevocationUrlNetscapeRenewalUrlNetscapeCAPolicyUrlNetscapeSslServerNameNetscapeCertCommentVerisignDnbDunsNumberNovellNovellSecurityAttribsEntrustEntrustVersionExtensionget_AlgorithmHashAlgorithmHashsigPolicyIdentifiersigPolicyHashsigPolicyQualifiersget_SigPolicyIdentifierget_SigPolicyHashGetSigPolicyQualifiersSigPolicyIdentifierSigPolicyHashrecipientEncryptedKeysget_Originatorget_UserKeyingMaterialget_RecipientEncryptedKeysOriginatorUserKeyingMaterialRecipientEncryptedKeysdIninStreamprincipalx509CertmessageexceptionivSizewrongPkcs12ZeroisPrivateinOffinBufoutOffoutputoutByteskeyBytesoffsetxlxrsrcsrcIndexdstdstIndexinDatainLenbitLengthinputLensignedAttrTableosignerInformationcounterSignershexStringisExplicitderOutasn1Objectreasonpoints_digestAlgorithms_contentInfo_certificates_signerInfosparameterVersionchoiceoriginoncapacityParamArrayAttributeosflagszStreamn1n2numBitsminLenmaxLenalphaSizenewSize100kextensionValueencodedValueoutputStreamfileTypefilechinputStreambcpgInputsigPackettrustPacketoffidBytesuserAttributespcksselfSignedcertificationcrplaintextencryptdecryptkey_blockkey_offsetiv_offsetciphertextreadCipherwriteCipherivByteswworduKeyinKeyuserKeyshiftKWsKeycompressionOIDcontentOIDsGencGeneiGenv1v2trustAmountbitStringpredefinedBiometricTypebiometricDataOidsepdistributionPointNameindentdateStrformatStrmakeUniversaldummyatbufferSizeacceptedPolicyfieldrequestfailInfoValuealgorithmNamekeyOffkeyLenivOffivLendomainParametersbytesNeededminb7b6b5b4b3b2b1b0originalDigeststartPosinputLongoutputArrayoffSetlowWhiWsOffencOiddigAlgIdcertStorestoresignerStoresignedAttrGenunsignedAttrGensignedContentTypeencapsulatesignerisCounterSignatureuserIdpsisNestedmappingsotherCertIDattrsenabledobjspairencKeybIgroupaddresscomponentc1c2c3c4isCriticalisRevocableisExportableisPrimaryUserIdisHumanReadablenotationNamenotationValuenumBytesfastignoredinBytesnumdataOffdataLensrcOffdstOffKmiKriL0R0resultL16R16signedAttrGeneratorunsignedAttrGeneratordataOutputStreamcontentOiddigStreamsigGenagaecompressedDataorgNamenumbersdisplayTextTypeonlyContainsUserCertsonlyContainsCACertsonlySomeReasonsindirectCRLonlyContainsAttributeCertsnumberatonewCrcinCharraySystem.Runtime.InteropServicesOutAttributeaInwidthisImplicitaOffidBytechecksumencryptiondigestAlgOidalgNameencryptionAlgOidcertSetcrlSetzOutpbeKeykekAlgorithmOidagreementAlgorithmsenderPrivateKeysenderPublicKeyrecipientCertcekWrapAlgorithmencryptionOidasn1ParamscipherParametersencKeyByteswrapOidkeyGendirNamelookUpinOrderoidSymbolscrlEntryinvalidityDateattributeparsercontentStreambufSizedictionarydictLengthdateTimeunixMsinSeedmaxValueminValueprivateKeyInfoDatadekAlgNamebaseAlgissuerCerttwiceThisspk32k0encodingParamsZzOffzLenberObjectsderObjectsbodyLenoldPacketsisLastbodybcpgObjecttagObjcurvesizetwistedsignaturePolicyIdderTagNobscspgpSigintLenintsminIntLennewLenredPolblockOffiBufdkLenblindedMsgprivParameterspubParametersiesParametersin_enckParamrotkiioffkoooffskeykeyofffkeyalgorithmOidhumanReadableprimePusageskeyPurposeIdpkInforequestInfohashAlgIdsaltSizesigningKeydigestAlgOIDakpkeyTypefieldsendMarkerreadVersionlabelwindowSizeimageTypefeqLengthfieldValuetextlocationissAndSersKeyIDcapabilityneedsSortingtaggedcertificateOctetstbsCrlcanonicalNamealiaseswrapAlgorithmagreeAlgorithmaliascertEntrykeyEntrychainentryTypekeyPairuseSHA1hashedPacketsunhashedPacketsoldPassPhrasenewPassPhrasenewEncAlgorithmrawKeyDatapubKeyspubRingpointlambdaclearMacbitBlockSizeecParametersnamedCurveextValuegeneralNamesbaseTagtagNumbersigNamematchPartialignoreCasekeyIDbundlesecretKeyRingpublicKeyRingsigningAlgorithmlambda0lambda1vmdoVpow2wtwalphamacSizeInBitsarrlValdestdestOffki0ki1r0r1attributeTablesigBlocksigDatasignerInformationStorex509AttrCertscompressionOidextpubKeyInfosubtreehexessCertIDmechanismencInfoyTildebetaskipcfbBitSizeoriginalasn1Genasn1SetParsereofOn00validateflushblbdtltl_indextdtd_indexlcodesdcodesblcodeslceofstored_lencur_matchwindowBitsmemLevel_level_strategyvariabledigestAlgorithmOidsaltLentrustCodefreqinBlockSizebvcodelohip1p2loSthiStdSti1encInaisbindexhpndvsizesecRingprotocolalertLevelalertDescriptiondirectoryNameipmaskaddrparsedIpv2FormalgOidivLengthmodificationTimearg0saltOffpreferencesnotYoungerThanfullAgebufCountbimulin0in1in2in3argsiuicrlextValsubpacketlimBigDecnewScalesBoxNameberEncodeRecipientSetencAlgIDenvGencompressedDataStreamnumericalphabeticcpskeyInfoDatapbeParametersendingsignatureNamesignummagcheckMagradixsizeInBitsmagToAddindxxIndxyIndxu1Outu2OutuOutexpxStartyStartbigMaglilMagunsignedrSeedtypeProcedurepqrkshiftsSCboxplainblock1block2congruencesprimesSystem.ReflectionAssemblyTitleAttributeAssemblyDescriptionAttributeAssemblyConfigurationAttributeAssemblyCompanyAttributeAssemblyProductAttributeAssemblyCopyrightAttributeAssemblyTrademarkAttributeAssemblyCultureAttributeAssemblyVersionAttributeAssemblyDelaySignAttributeAssemblyKeyFileAttributeAssemblyKeyNameAttributeCLSCompliantAttributeComVisibleAttributeSystem.Runtime.CompilerServicesCompilationRelaxationsAttributeRuntimeCompatibilityAttributecryptoArgumentNullExceptionArgumentExceptionRuntimeTypeHandleGetTypeFromHandleObsoleteAttributeIDisposableDisposeStringConcatIOExceptionInvalidCastExceptionMathget_ASCIIget_UTF8Byteget_BigEndianUnicodeInt32CopyGetTypeMemberInfoInvalidOperationExceptionUInt32{A528E4E8-996C-4DA6-9913-8EEA3C5F6611}CompilerGeneratedAttribute__StaticArrayInitTypeSize=72$$method0x6001b3e-1RuntimeHelpersRuntimeFieldHandleInitializeArray__StaticArrayInitTypeSize=1024$$method0x6001b3e-2$$method0x6001b3e-3$$method0x6001b3e-4$$method0x6001b3e-5get_MessageSubstringAppendget_FullNameNotSupportedExceptionDefaultMemberAttributeCharFileStreamOpenReadFileSystemInfoget_LastWriteTimeAddRangeRemoveAt__StaticArrayInitTypeSize=16$$method0x6001b46-1System.GlobalizationCultureInfoget_InvariantCultureToUpperop_EqualityInt16__StaticArrayInitTypeSize=512$$method0x6001b47-1__StaticArrayInitTypeSize=256$$method0x6001b4a-1$$method0x6001b4a-2__StaticArrayInitTypeSize=120$$method0x6001b4a-3$$method0x6001b4a-4$$method0x6001b4a-5__StaticArrayInitTypeSize=32$$method0x6001b4c-1FormatExceptionget_CharsTimeZoneget_CurrentTimeZoneTimeSpanGetUtcOffsetget_MinutesIndexOfDateTimeFormatInfoget_InvariantInfoIFormatProviderParseExactToUniversalTimeToCharArray__StaticArrayInitTypeSize=1152$$method0x6001b55-1$$method0x6001b55-2ContainsKeyArgumentOutOfRangeException$$method0x600051f-1__StaticArrayInitTypeSize=20$$method0x600051f-2$$method0x600051f-3$$method0x600051f-4$$method0x600051f-5$$method0x600051f-6$$method0x600051f-7$$method0x600051f-8$$method0x600051f-9$$method0x600051f-10__StaticArrayInitTypeSize=12$$method0x600051f-11$$method0x600051f-12$$method0x600051f-13$$method0x600051f-14$$method0x600051f-15$$method0x600051f-16$$method0x600051f-17$$method0x600051f-18$$method0x600051f-19$$method0x600051f-20$$method0x600051f-21$$method0x600051f-22$$method0x600051f-23$$method0x600051f-24$$method0x600051f-25$$method0x600051f-26$$method0x600051f-27$$method0x600051f-28$$method0x600051f-29$$method0x600051f-30$$method0x600051f-31$$method0x600051f-32$$method0x600051f-33$$method0x600051f-34$$method0x600051f-35$$method0x600051f-36$$method0x600051f-37$$method0x600051f-38$$method0x600051f-39$$method0x600051f-40$$method0x600051f-41$$method0x600051f-42$$method0x600051f-43$$method0x600051f-44$$method0x600051f-45$$method0x600051f-46$$method0x600051f-47$$method0x600051f-48$$method0x600051f-49$$method0x600051f-50$$method0x600051f-51$$method0x600051f-52__StaticArrayInitTypeSize=68$$method0x6001b56-1$$method0x6000535-1Int64__StaticArrayInitTypeSize=640$$method0x6001b57-1$$method0x6001b58-1EndOfStreamExceptionOverflowExceptionNumberStyles__StaticArrayInitTypeSize=64$$method0x6000682-1System.Collections.GenericDictionary`2$$method0x6000691-1TryGetValueget_InnerExceptionSystem.ThreadingMonitorEnterExitArithmeticExceptionWaitCallbackThreadPoolQueueUserWorkItemThreadSleepIsInstanceOfType$$method0x6001b5c-1$$method0x6001b5c-2$$method0x6001b5c-3$$method0x6001b5c-4$$method0x6001b5c-5$$method0x6001b5c-6$$method0x6001b5c-7$$method0x6001b5c-8$$method0x6001b5d-1$$method0x6001b61-1$$method0x6001b62-1get_UtcNow$$method0x6001b63-1SByte__StaticArrayInitTypeSize=128$$method0x6001b64-1$$method0x6001b65-1$$method0x6001b66-1$$method0x6001b67-1$$method0x6001b67-2StartsWithTrimToLowerInsertget_Ticksget_NowToDoubleIDictionaryEnumeratorDictionaryEntryLastIndexOf$$method0x6000ace-1op_Inequality$$method0x6000acf-1$$method0x6001b6e-1$$method0x6001b6f-1ToCharToByte$$method0x6000c6f-1__StaticArrayInitTypeSize=48$$method0x6001b7f-1$$method0x6001b7f-2$$method0x6001b7f-3$$method0x6001b7f-4$$method0x6001b7f-5__StaticArrayInitTypeSize=2048$$method0x6001b83-1$$method0x6000db8-1WriteLineGetChars$$method0x6000de0-1$$method0x6000e47-1IsMatch$$method0x6001b8b-1__StaticArrayInitTypeSize=76$$method0x6001b8b-2ToBase64StringFromBase64String$$method0x6000f44-1$$method0x6000f46-1$$method0x6001b8c-1$$method0x6001b8d-1$$method0x6001b8d-2$$method0x6001b8d-3$$method0x6001b8d-4$$method0x6001b8d-5$$method0x6001b8d-6$$method0x6001b8d-7$$method0x6001b8d-8$$method0x6001b8d-9$$method0x6001b8d-10$$method0x6001b8d-11__StaticArrayInitTypeSize=404$$method0x6001b91-1$$method0x6001b92-1$$method0x6001b92-2$$method0x6001b92-3$$method0x6001b92-4$$method0x6001b92-5$$method0x6001b93-1$$method0x6001b93-2$$method0x6001270-1IsLetterOrDigit$$method0x6001bd3-1StreamWriter$$method0x6001bd8-1$$method0x6001bd9-1$$method0x6001bd9-2$$method0x6001bd9-3__StaticArrayInitTypeSize=56$$method0x600149d-1__StaticArrayInitTypeSize=6144$$method0x6001bdd-1__StaticArrayInitTypeSize=384$$method0x6001bdd-2__StaticArrayInitTypeSize=124$$method0x6001bdd-3$$method0x6001bdd-4$$method0x6001bdd-5$$method0x6001bdd-6FileModeFileAccessFileShareIsDigit__StaticArrayInitTypeSize=116$$method0x6001be6-1$$method0x6001be6-2$$method0x6001be6-3__StaticArrayInitTypeSize=19$$method0x6001be6-4$$method0x6001be6-5$$method0x6001be6-6$$method0x6001be6-7$$method0x6001be6-8$$method0x600164f-1$$method0x6001651-1$$method0x600165f-1$$method0x6001be7-1$$method0x6001789-1$$method0x6001beb-1$$method0x6001beb-2$$method0x6001beb-3$$method0x6001beb-4__StaticArrayInitTypeSize=3$$method0x60017bd-1set_LengthFile$$method0x600186e-1$$method0x600186e-2$$method0x600186e-3$$method0x600186e-4$$method0x60018e0-1$$method0x60018e0-2$$method0x60018e0-3$$method0x60018e0-4$$method0x60018e0-5$$method0x60018e0-6$$method0x60018e0-7$$method0x60018e1-1$$method0x6001bf4-1$$method0x6001bf4-2__StaticArrayInitTypeSize=96$$method0x6001bf4-3$$method0x6001bf4-4$$method0x6001bf4-5$$method0x6001bf4-6$$method0x6001bf4-7$$method0x6001bf4-8$$method0x6001bf4-9$$method0x6001bf4-10$$method0x6001bf4-11$$method0x6001bf4-12$$method0x6001bf4-13$$method0x6001bf4-14$$method0x6001a11-1$$method0x6001a11-2$$method0x6001a11-3$$method0x6001a11-4$$method0x6001a11-5$$method0x6001a11-6$$method0x6001a11-7$$method0x6001a11-8$$method0x6001a11-9$$method0x6001a11-10$$method0x6001a11-11$$method0x6001a11-12$$method0x6001a11-13$$method0x6001a11-14$$method0x6001a11-15$$method0x6001a11-16$$method0x6001a11-17$$method0x6001a11-18$$method0x6001a11-19$$method0x6001a11-20$$method0x6001a11-21$$method0x6001a11-22$$method0x6001a11-23$$method0x6001a11-24$$method0x6001a11-25$$method0x6001a11-26$$method0x6001a11-27$$method0x6001a11-28$$method0x6001a11-29$$method0x6001a11-30$$method0x6001a11-31$$method0x6001a11-32$$method0x6001a11-33$$method0x6001a11-34$$method0x6001a11-35$$method0x6001a11-36$$method0x6001a11-37$$method0x6001a11-38$$method0x6001a11-39$$method0x6001a11-40$$method0x6001a11-41$$method0x6001a11-42$$method0x6001a11-43$$method0x6001a11-44$$method0x6001a11-45$$method0x6001a11-46$$method0x6001a11-47$$method0x6001a11-48$$method0x6001a11-49$$method0x6001a11-50$$method0x6001a11-51$$method0x6001a11-52$$method0x6001a11-53$$method0x6001a11-54UInt64StackPushPopAddress$$method0x6001bf7-1__StaticArrayInitTypeSize=511$$method0x6001bf7-2$$method0x6001bf7-3$$method0x6001bf7-4$$method0x6001bf7-5$$method0x6001bf7-6$$method0x6001bf7-7$$method0x6001bf7-8$$method0x6001bf7-9$$method0x6001bf7-10$$method0x6001bf7-11$$method0x6001bf7-12$$method0x6001bf7-13$$method0x6001bf7-14$$method0x6001bf7-15inStream5inStream must be read-ableCERTIFICATE'malformed request: Grequest contains unknown algorithm.Arequest contains unknown policy.Grequest contains unknown extension.Aimprint digest the wrong length.Aproblem encoding tbsResponseData9can't re-encode certificate!Certificate/3can't setup the CertStore5exception processing sig: DSAIDSA private key required for signingQDSA public key required for verificationpassword salt randomCstrength must be a positive valuestrengthx PKCS7'pad block corruptedwinitialisation vector must be the same length as block size /CBC-input buffer too shortSKDF parameters required for KDF Generator/output buffer too small/Output length too largeSinvalid parameter passed to ISAAC Init - parameters! not initialised/output buffer too short ISAACYinvalid parameter passed to Blowfish init - Blowfish1Blowfish not initialised;Org.BouncyCastle.Pkcs1.Strict true/PKCS1Paddingblock truncated%unknown block type)block incorrect size/block padding incorrect!no data in blockdefaultStrengthEGenerator has not been initialised cipher engineIES-cipher not initialised input inOff length_invalid offset/length specified for input array3invalid sid in SignerInfoOmethod can only be called after verify.DERmRSASSA-PSS signature must specify algorithm parametersRSASSA-PSS signature parameters specified incorrect hash algorithmkRSASSA-PSS signature parameters specified unknown MGFwRSASSA-PSS signature parameters must have trailerField of 1[failed to set RSASSA-PSS signature parameters with]no hash for content found in signed attributes[no content type id found in signed attributesccontent hash found in signed attributes differentmNULL hash found in signed attributes when one expectedUcontentType in signed attributes differentYkey not appropriate to signature in message.]can't process mime object to create signature.Kinvalid signature format in message: 1not a digest info object/malformed RSA signatureRSA#RSA//PKCS1PaddingNONEwithDSAalgorithm: E not supported in base signatures.AException processing signature: =Exception decoding signature: 'Expected public key pubKeywA signing-time attribute MUST have a single attribute valueThe SignedAttributes in a signerInfo MUST NOT include multiple instances of the signing-time attribute1.3.36.8.2.1.47unknown object in factory: obj'Bad sequence size: ?illegal object in GetInstance: InvalidCrlReason: UnspecifiedKeyCompromiseCACompromise%AffiliationChangedSuperseded)CessationOfOperationCertificateHoldUnknownRemoveFromCrl%PrivilegeWithdrawnAACompromiseCRLDistPoint: 7Unknown object in factory: %unknown tag value issuer%1.3.6.1.5.5.7.48.1)1.3.6.1.5.5.7.48.1.1.3.5.6.7?unknown object in GetInstance: IWrong number of elements in sequenceseqiUnknown object in 'SigPolicyQualifierInfo' factory: ]Unknown object in 'RevocationValues' factory: ?Illegal tag in RevocationValues+No otherRevVals foundotherRevValsWMust contain only 'CertificateList' objectscrlVals[Must contain only 'BasicOcspResponse' objectsocspVals?Unknown object in GetInstance: Iobject implicit - explicit expected.7Bad tag in OriginatorInfo: -OriginatorInfo too big1Invalid OriginatorInfo: +object not Asn1Object/object not BerEncodable NULL3Not a BZIP2 marked streamQserial number must be a positive integerserialNumberEUnknown signature type requested: extension  not present7exception encoding TBS certMexception producing certificate objectillegal tag=AuthorityKeyIdentifier: KeyID()QException extracting certificate details'can't process key: 9exception encoding signature SHA1MD2MD5RIPEMD160 SHA224 SHA256 SHA384 SHA512[unknown hash algorithm tag in GetDigestName: ElGamalGunknown algorithm tag in signature: DESEDE IDEA CAST5 SAFERDESAESTwofish;unknown symmetric algorithm: 1unknown hash algorithm: +can't find S2k digest%unknown S2k type: +can't find MD5 digest;inputStream must be seek-ableinputStreamsigPacketinvalid key.;cannot encode subpacket arrayAsignature is not a key signature7exception encoding DSA sig.1exception preparing key.can't find MD5can't find SHA1+Expected a public key#unknown key class7exception calculating keyIdQunknown public key algorithm encounteredCexception constructing public keyidgsignature type incorrect for master key revocation.asignature type incorrect for sub-key revocation.?can't create signature object: Acan't create secret key object: Qcan't create one pass signature object: 3unknown object in stream Ocan't recognise compression algorithm: key expansionpqaalgorithm#publicKeyParamSetEC ECDSAECGOST3410 ECDH ECDHC1unrecognised algorithm: kOID is not a valid CryptoPro public key parameter setdZeroBytePaddingISO10126-2GCan't have a negative input length!7data not block size alignedKoutput buffer too short for DoFinal()eCtsBlockCipher can only accept ECB, or CBC ciphersMCan't have a negative input outLength!Eoutput buffer too small in doFinalQneed at least one block of input for CTS VMPCOVMPC Init parameters must include an IVOVMPC Init parameters must include a keyEVMPC requires 1 to 768 bytes of IVVMPC-KSA3Yinvalid parameter passed to SKIPJACK init - SKIPJACK?SKIPJACK engine not initialised5RSA engine not initialisedOinvalid parameter passed to RC4 init - RC4Qinvalid parameter passed to IDEA init - 7IDEA engine not initialisedAKey length not 128/192/256 bits.Oinvalid parameter passed to AES init - 5AES engine not initialisedbaseDigestibaseDigest output not large enough to support length(7value can't be less than -2 value+Expected input stream data/1.3.6.1.4.1.188.7.1.1.2-1.2.840.113533.7.66.10/couldn't create cipher./key invalid in message.Ierror decoding algorithm parameters.Cunable to parse internal stream: 31.2.840.113549.1.9.16.3.8!Bad tag number: ?Invalid RsaPublicKeyStructure: #Cunknow PredefinedBiometricType : 1DistributionPointName: [fullName/nameRelativeToCRLIssuer]:7Invalid DistributionPoint: )DistributionPoint: [#distributionPointreasonscRLIssuerBER SequenceDER SequenceSequenceBER Tagged [Tagged [ IMPLICIT EMPTYBER SetDER Set#ObjectIdentifier(Boolean(Integer(#BER Octet String[] #DER Octet String[DER Bit String[, IA5String() UTF8String(!PrintableString(VisibleString(BMPString(T61String(UTCTime(!GeneralizedTime(Unknown X )unknown object type unknown tag1.3.14.3.2.21.3.14.3.2.31.3.14.3.2.41.3.14.3.2.71.3.14.3.2.261.3.14.3.2.271.3.14.3.2.291.3.14.7.2.1.1revocationTime%1.2.410.200004.1.4-1.2.410.200004.7.1.1.1.8.9.10.11.12.13.14.15#0.2.262.1.10.12.0+invalid date string: !yyyyMMddHHmmss\ZGMT+00:00GMT:000ZyyyyMMddHHmmss.\Z'GMT'zzz-yyyyMMddHHmmss'GMT'zzzyyyyMMddHHmmssstrIIllegal object in SignerIdentifier: 9unknown object encountered: ?GetCerts() has not been called.aGetCerts() and/or GetCrls() has not been called.9Invalid OtherRecipientInfo: SIllegal object in KeyTransRecipientInfo: 5Error processing object : 1unable to process key - AUnknown signature type requested%signatureAlgorithmYbuffer size not multiple of input block sizeOperation OkaywTimestamp token received cannot be converted to ContentInfoCcreated badly formatted response!)MD2WITHRSAENCRYPTIONMD2WITHRSA)MD5WITHRSAENCRYPTIONMD5WITHRSA+SHA1WITHRSAENCRYPTIONSHA1WITHRSA/SHA224WITHRSAENCRYPTIONSHA224WITHRSA/SHA256WITHRSAENCRYPTIONSHA256WITHRSA/SHA384WITHRSAENCRYPTIONSHA384WITHRSA/SHA512WITHRSAENCRYPTIONSHA512WITHRSA5RIPEMD160WITHRSAENCRYPTION!RIPEMD160WITHRSA5RIPEMD128WITHRSAENCRYPTION!RIPEMD128WITHRSA5RIPEMD256WITHRSAENCRYPTION!RIPEMD256WITHRSASHA1WITHDSADSAWITHSHA1SHA224WITHDSASHA256WITHDSASHA1WITHECDSAECDSAWITHSHA1SHA224WITHECDSASHA256WITHECDSASHA384WITHECDSASHA512WITHECDSA)GOST3411WITHGOST3410/GOST3411WITHGOST3410-94key keyOff keyLeniv curvegnhNoekeonYInvalid parameters passed to Noekeon init - WhirlpoolD-AGost3411#Unknown algorithmkdfODHEngine expects DHPrivateKeyParameterspubmessage_Diffie-Hellman public key has wrong parameters.1Expected RSA private keyIcan't mix DSA with anything but SHA1ican't mix ECDSA with anything but SHA family digestscUnknown algorithm in CmsSignedGenerator.GetEncOidAerror processing attribute certsencoding error.Akey inappropriate for signature.3error creating signature.'error creating sid.)encapsulation error.'signature problem: +unsupported version: Cunknown signature key algorithm: !internal error: #unknown version: PGP;wrong sequence in constructor/BasicConstraints: isCa(/), pathLenConstraint = 3wrong version for PFX PDU)unknown tag number: Cunexpected end-of-contents markeraindefinite length primitive encoding encountered=unknown BER object encounteredacorrupted stream - invalid high tag number found7EOF found inside tag value.=EOF found when length expected9DER length more than 4 bytes1EOF found reading lengthQCorrupted stream - negative length found[Corrupted stream - out of bounds length foundmunknown object in 'OtherSigningCertificate' factory : .kUnknown object in 'CompleteCertificateRefs' factory: otherCertIDsOMust contain only 'OtherCertID' objects1commitmentTypeIdentifierkUnknown object in 'CommitmentTypeQualifier' factory: =Invalid EncryptedContentInfo: =Expected stream to be readable3 userCertificate: 3 revocationDate: 3 certificateIssuer: - crlEntryExtensions:A critical()Certificate issuer:  value = *****SPrivate key passed - public key expected.;Not a CryptoPro parameter set?Class provided no convertible: /AESWRAPCAMELLIAWRAPDESEDEWRAPRC2WRAPSEEDWRAP#DESEDERFC3211WRAPAESRFC3211WRAP'CAMELLIARFC3211WRAPWrapper ! not recognised.9Not initialised for wrapping=Not initialised for Unwrapping userId-Expected a private keyprivateKeySExactly one of the field elements is nullqOnly points on the same curve can be added or subtractedEx value too large in field elementFpeven value of q5k2 must be smaller than k31k2 must be larger than 05x value cannot be negativeF2mqField elements are not both instances of F2mFieldElementkField elements are not elements of the same field F2mOne of the field elements are not elements has incorrect representationNot implementedoSorry, there is garbage data left after the certificateRIPEMD128RIPEMD256 SHA-1SHA-224SHA-256SHA-384SHA-512MD4withRSA;Signing requires private key.CVerification requires public key.sRsaDigestSigner not initialised for signature generation.aRsaDigestSigner not initialised for verificationEGCTR only for 64 bit block ciphers /GCTRKcipher required with a block size of Ainvalid parameters passed to CCM /CCM/CCM cipher unitialized./mac check in CCM failedCgenerator requires RSA public key3generator not initialisedTEAOinvalid parameter passed to TEA init -  RC5-32Sinvalid parameter passed to RC532 init - 9Invalid parameter passed to  init - -Input buffer too short/Output buffer too shortWinvalid rid in KeyTransRecipientInformation;illegal blocksize in message./bad padding in message.outStream3Expected writeable stream!dataOutputStreamksignatures without signed attributes not implemented.9IOException reading content.EUnexpected object reading content.OIOException reading compressed content.aunexpected EOF reading user attribute sub packetYunknown PGP public key algorithm encounteredOunknown tag in IssuingDistributionPoint7IssuingDistributionPoint: [+onlyContainsUserCerts'onlyContainsCACertsonlySomeReasons5onlyContainsAttributeCertsindirectCRLCRLNumber: YUnknown object in 'MessageImprint' factory: -sequence not version 0iunknown object in 'PublicKeyAndChallenge' factory : Yunknown object in Cast5CbcParameters factory1Bad object encountered: hashAlgorithmcertificateHash7Invalid GOST3410Parameter: digestParamSet1Invalid CompressedData: 2.5.29.19Gcannot construct BasicConstraints: 2.5.29.157cannot construct KeyUsage: /certificate expired on 9certificate not valid until 2.5.29.37[error processing extended key usage extension2.5.29.172.5.29.18/ [0] Version: / SerialNumber: / IssuerDN: / Start Date: / Final Date: / SubjectDN: / Public Key: / Signature Algorithm: / Signature: / ) Extensions: msignature algorithm in TBS cert not same as outer certePublic key presented not for certificate signatureattempt to use non-Pbe algorithm with Pbe EncryptedPrivateKeyInfo generation)malformed response: 3problem decoding object: KInternal error during mac calculation7no valid trailer for digestwithISO9796-2S1Wsigner should be initialised with RipeMD160Msigner should be initialised with SHA1Wsigner should be initialised with RipeMD128=unrecognised hash in signatureSRC5 key length can be no greater than 255=attempt to create weak DES key/key material too short.7Bad length for DESede key: Cattempt to create weak DESede keyTBCUYou should not supply an IV for unwrapping%IV is not 8 octets DESede9Not initialized for wrapping9Not multiple of block length-Not set for unwrapping5Null pointer as ciphertext7Ciphertext not multiple of OChecksum inside ciphertext is corruptedRSAandMGF1GOST3410-1.3.6.1.4.1.5849.1.6.2-1.3.6.1.4.1.5849.1.1.5GOST3411-1.3.6.1.4.1.5849.1.2.1Mcan't re-encode attribute certificate!+AttributeCertificate/3can't setup the X509Store CRL/)can't re-encode CRL!)Expected private key!senderPrivateKeysenderPublicKeyMcannot extract originator public key: Ucan't extract key algorithm from this certScan't extract key algorithm from this keyRC2-illegal keysize in AES SEEDCAMELLIA7illegal keysize in Camellia#unknown algorithmQexception decoding algorithm parameters.Akey inappropriate for algorithm.?error making encrypted content.Ican't find key generation algorithm.2.5.4.62.5.4.102.5.4.112.5.4.122.5.4.32.5.4.92.5.4.52.5.4.72.5.4.82.5.4.42.5.4.422.5.4.432.5.4.442.5.4.452.5.4.152.5.4.172.5.4.462.5.4.65#1.3.6.1.5.5.7.9.1#1.3.6.1.5.5.7.9.2#1.3.6.1.5.5.7.9.3#1.3.6.1.5.5.7.9.4#1.3.6.1.5.5.7.9.51.3.36.8.3.142.5.4.162.5.4.2050.9.2342.19200300.100.1.2530.9.2342.19200300.100.1.1COTOUCNLSTSERIALNUMBEREDCUID STREETSURNAMEGIVENNAMEINITIALSGENERATION'unstructuredAddress!unstructuredName!UniqueIdentifierDNPseudonymPostalAddressNameAtBirth)CountryOfCitizenship%CountryOfResidence GenderPlaceOfBirthDateOfBirthPostalCode!BusinessCategoryTelephoneNumbercotoucnlstserialnumber streetemailaddressdceuidsurnamegivennameinitialsgeneration'unstructuredaddress!unstructuredname!uniqueidentifierdnpseudonympostaladdressnameofbirth)countryofcitizenship%countryofresidence genderplaceofbirthdateofbirthpostalcode!businesscategorytelephonenumber!badly sized pair\;No attribute for object id - ? - passed to distinguished nameO'oids' must be same length as 'values'. OID.)Unknown object id - ?badly formated directory string\#/error encoding reason: ?error encoding invalidityDate: sNot all mandatory fields set in V2 TbsCertList generator.not all mandatory fields set in V2 AttributeCertificateInfo generator!1.3.6.1.5.5.7.11responseTyperesponsetbsRequest_Unknown object in 'CertificateValues' factory: certificatesiMust contain only 'X509CertificateStructure' objects+Invalid KekIdentifier/Invalid KekIdentifier: deflating: 5unknown compression method'invalid window size-incorrect header checkneed dictionary)incorrect data checkUDateTime value may not be before the epochdateTimeQContentInfo object not for a time stamp.7Time-stamp token signed by k signers, but it must contain just the TSA signature.wno signing certificate attribute found, time stamp invalid./cannot find algorithm: Ycertificate hash does not match certID hash.}certificate serial number does not match certID for signature.mcertificate name does not match certID for signature. Ksignature not created by certificate.CMS exception: Aproblem processing certificate: SHA1PRNGSHA256PRNG;Unrecognised PRNG algorithm: maxValue < 0KmaxValue cannot be less than minValueUalgorithm identifier in key not recognisedAAttribute keys must be of type: attributesEAttribute values must be of type: ECBDES-EDEDES-EDE3/Unknown DEK algorithm: dekAlgNameCBCCFBOFBPKCS5PaddingNoPaddingAES-128AES-192AES-256BF RC2-40 RC2-64BLOWFISH AES128 AES192 AES256DESEDE3Ipassed in key not an encryption key!?generator already in open state?No encryption methods specified outStrAexception encrypting session key+null cipher specified/CFB/NoPadding+/OpenPGPCFB/NoPadding3Exception creating cipher1ElGamal/ECB/PKCS1Padding;Can't use DSA for encryption.?Can't use ECDSA for encryption.=unknown asymmetric algorithm: %can't decode name.+problem creating ID: ECNRGEC private key required for signingOEC public key required for verification7not initialised for signing;input too large for ECNR key.;not initialised for verifyingSMGF parameters required for MGF1GeneratorWinvalid parameter passed to Twofish init - /Twofish not initialised5Key size less than 64 bits;Key size larger than 256 bits/OAEPPaddingdata too shortdata hash wrong#data start wrong %Malformed content.)error encoding certs-error processing certs'error encoding crls+error processing crls[Buffer cannot be greater than 2^30 in length.-----BEGIN PGP  ----------END PGP BCPG v1.32Version]unknown hash algorithm tag in beginClearText: E-----BEGIN PGP SIGNED MESSAGE----- Hash: !PUBLIC KEY BLOCK#PRIVATE KEY BLOCKSIGNATUREMESSAGE: 7Non-IetfAttrSyntax encodingMBad value type encoding IetfAttrSyntaxIMix of value types in IetfAttrSyntax+unknown tag in Holderbrainpoolp160r1brainpoolp160t1brainpoolp192r1brainpoolp192t1brainpoolp224r1brainpoolp224t1brainpoolp256r1brainpoolp256t1brainpoolp320r1brainpoolp320t1brainpoolp384r1brainpoolp384t1brainpoolp512r1brainpoolp512t1brainpoolPr1QE95E4A5F737059DC60DFC7AD95B3D8139515620FQ340E7BE2A280EB74E2BE61BADA745D97E8F7C300Q1E589A8595423412134FAA2DBDEC95C8D8675E5804BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321QE95E4A5F737059DC60DF5991D45029409E60FC0901QE95E4A5F737059DC60DFC7AD95B3D8139515620CQ7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F38004B199B13B9B34EFC1397E64BAEB05ACC265FF2378ADD6718B7C7C1961F0991B842443772152C9E0ADaC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297a6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EFa469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C904C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8FaC302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1aC302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294a13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79043AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9qD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FFq68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43q2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CDqD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939FqD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FCq4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D046AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D5800374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4CA9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E53777D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D926DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B0404A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F42D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BED35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E273EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6E0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E24A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CEB5B4FEF422340353E04925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF3357F624A21BED5263BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B1B9BC0455FB0D2C38CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC537BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE28264A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C53158CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E90465658CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC507F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE0418DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F37830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F7230481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F07CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E04640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332responseStatusoUnknown object in 'SignaturePolicyIdentifier' factory: #signaturePolicyId?implicitly tagged tagged object5implicit tagging for tag: [-unsupported tag number]Can't implicitly tag OriginatorIdentifierOrKeyGInvalid OriginatorIdentifierOrKey: 5Invalid KekRecipientInfo: inflating: Wexception encoding URL safe base64 string: Wexception decoding URL safe base64 string: =can't set up signature object.=Only positive Integers allowed bigint=shiftLeft() for max 31 bits , 3bit shift is not possibley/OpenPGPCFBNot an RSA key?input too large for RSA cipher.7IMac codes failed to equal.Ekey sizes are only 16/24/32 bytes.Eonly simple KeyParameter expected.Camellia?Camellia engine not initialisedRIPEMD320PKCS5S2RAW/p and q cannot be equal buffer5invalid header encountered?unknown length type encounteredCunknown packet type encountered: [Premature end of stream in PartialInputStream2.5.4.72Qunknown object in 'RoleSyntax' factory: the role name MUST be non empty and MUST use the URI option of GeneralName3Unknown tag in RoleSyntax Name:  - Auth: N/A5Invalid ExtendedKeyUsage: Only DerObjectIdentifier instances allowed in ExtendedKeyUsage.)1.2.840.113549.1.1.1)1.2.840.113549.1.1.2)1.2.840.113549.1.1.3)1.2.840.113549.1.1.4)1.2.840.113549.1.1.5)1.2.840.113549.1.1.6)1.2.840.113549.1.1.7)1.2.840.113549.1.1.8)1.2.840.113549.1.1.9+1.2.840.113549.1.1.10+1.2.840.113549.1.1.11+1.2.840.113549.1.1.12+1.2.840.113549.1.1.13+1.2.840.113549.1.1.14)1.2.840.113549.1.3.1)1.2.840.113549.1.5.1)1.2.840.113549.1.5.4)1.2.840.113549.1.5.3)1.2.840.113549.1.5.6+1.2.840.113549.1.5.10+1.2.840.113549.1.5.11+1.2.840.113549.1.5.13+1.2.840.113549.1.5.12%1.2.840.113549.3.7%1.2.840.113549.3.2%1.2.840.113549.2.2%1.2.840.113549.2.4%1.2.840.113549.2.5%1.2.840.113549.2.7%1.2.840.113549.2.8%1.2.840.113549.2.9'1.2.840.113549.2.10'1.2.840.113549.2.11)1.2.840.113549.1.7.1)1.2.840.113549.1.7.2)1.2.840.113549.1.7.3)1.2.840.113549.1.7.4)1.2.840.113549.1.7.5)1.2.840.113549.1.7.6)1.2.840.113549.1.9.1)1.2.840.113549.1.9.2)1.2.840.113549.1.9.3)1.2.840.113549.1.9.4)1.2.840.113549.1.9.5)1.2.840.113549.1.9.6)1.2.840.113549.1.9.7)1.2.840.113549.1.9.8)1.2.840.113549.1.9.9+1.2.840.113549.1.9.13+1.2.840.113549.1.9.14+1.2.840.113549.1.9.15+1.2.840.113549.1.9.20+1.2.840.113549.1.9.21/1.2.840.113549.1.9.22.1/1.2.840.113549.1.9.22.2/1.2.840.113549.1.9.23.131.2.840.113549.1.9.16.3.9/1.2.840.113549.1.9.15.1/1.2.840.113549.1.9.15.2/1.2.840.113549.1.9.15.331.2.840.113549.1.9.16.2.131.2.840.113549.1.9.16.1.431.2.840.113549.1.9.16.1.931.2.840.113549.1.9.16.6.131.2.840.113549.1.9.16.6.231.2.840.113549.1.9.16.6.331.2.840.113549.1.9.16.6.431.2.840.113549.1.9.16.6.531.2.840.113549.1.9.16.6.631.2.840.113549.1.9.16.2.451.2.840.113549.1.9.16.2.1151.2.840.113549.1.9.16.2.1251.2.840.113549.1.9.16.2.4731.2.840.113549.1.9.16.2.751.2.840.113549.1.9.16.2.1451.2.840.113549.1.9.16.2.1551.2.840.113549.1.9.16.2.1651.2.840.113549.1.9.16.2.1751.2.840.113549.1.9.16.2.1851.2.840.113549.1.9.16.2.1951.2.840.113549.1.9.16.2.2051.2.840.113549.1.9.16.2.2151.2.840.113549.1.9.16.2.2251.2.840.113549.1.9.16.2.2351.2.840.113549.1.9.16.2.2451.2.840.113549.1.9.16.2.2551.2.840.113549.1.9.16.2.2651.2.840.113549.1.9.16.2.2731.2.840.113549.1.9.16.5.131.2.840.113549.1.9.16.5.251.2.840.113549.1.12.10.1.151.2.840.113549.1.12.10.1.251.2.840.113549.1.12.10.1.351.2.840.113549.1.12.10.1.451.2.840.113549.1.12.10.1.551.2.840.113549.1.12.10.1.6/1.2.840.113549.1.12.1.1/1.2.840.113549.1.12.1.2/1.2.840.113549.1.12.1.3/1.2.840.113549.1.12.1.4/1.2.840.113549.1.12.1.5/1.2.840.113549.1.12.1.631.2.840.113549.1.9.16.3.631.2.840.113549.1.9.16.3.7Not all mandatory fields set in CertificationRequestInfo generator._postal address must contain less than 6 stringskUnknown object in 'OtherSigningCertificate' factory:  certs[Must contain only 'PolicyInformation' objectspoliciesYUnknown object in 'CrlValidatedID' factory: crlHashOUnknown object in 'CrlListID' factory:  crlsUMust contain only 'CrlValidatedID' objects timeyyMMddHHmmss)yyMMddHHmmss'GMT'zzz00GMT+00:0000 00GMT1920[IOException converting stream to byte array: 9negative lengths not allowed;unknown object passed to Timeeattempt to insert non UTF8 STRING into PkiFreeText innerRSAWITHMD5%SHA1WITHRSAANDMGF1)SHA224WITHRSAANDMGF1)SHA256WITHRSAANDMGF1)SHA384WITHRSAANDMGF1)SHA512WITHRSAANDMGF1RSAWITHSHA11.3.36.3.3.1.2#1.2.840.10040.4.3)GOST3410WITHGOST3411-GOST3411WITHECGOST34107GOST3411WITHECGOST3410-20013GOST3411WITHGOST3410-2001subjectpublicKey'expected public key?key for signing must be privatesigningKeyGexception encoding TBS cert request MGF1;signature algorithm with MGF1withRSAandMGF1 writer-Cannot Encode object: X509 CRL PRIVATE KEYPUBLIC KEY+ATTRIBUTE CERTIFICATE'CERTIFICATE REQUEST7Object type not supported: DES-EDE3-CBC AES--Proc-Type: 4,ENCRYPTEDDEK-Info: ,GCannot handle private key of type: akp-----BEGIN -----END  readerRSA PUBLIC KEY/NEW CERTIFICATE REQUEST!X509 CERTIFICATERSA PRIVATE KEYDSA PRIVATE KEYEC PRIVATE KEYX- not foundGbase64 data appears to be truncated-problem parsing cert: =problem parsing PKCS7 object: Proc-Type4,ENCRYPTEDqNo password finder specified, but a password is requiredYPassword is null, but a password is requiredDEK-Info%Unknown key type: type#problem creating  private key: )unknown curve name: Gwrong ASN.1 object found in stream.?problem parsing EC private key._attempt to get a reason where none is availablewithISO9796-2S2SParametersWithSalt only valid for signing;Fixed salt is of wrong length;Signing Requires Private Key.CVerification Requires Public Key.}GOST3410DigestSigner not initialised for signature generation.aDSADigestSigner not initialised for verification?error decoding signature bytes.generator=Window size must be at least 2windowSizeEInvalid x for GOST3410 private key /SIC'DESede key must be or  bits long.1IV length not equal to 8)not set for wrappingOwrap data must be a multiple of 8 bytes-not set for unwrappingSunwrap data must be a multiple of 8 byteschecksum failed9The key must be 256 bit long HC-256SInvalid parameter passed to HC256 init - Ws does not fit in specified number of bytess2.5.29.92.5.29.142.5.29.162.5.29.202.5.29.212.5.29.232.5.29.242.5.29.272.5.29.282.5.29.292.5.29.302.5.29.312.5.29.322.5.29.332.5.29.352.5.29.362.5.29.462.5.29.54#1.3.6.1.5.5.7.1.1%1.3.6.1.5.5.7.1.11%1.3.6.1.5.5.7.1.12#1.3.6.1.5.5.7.1.2#1.3.6.1.5.5.7.1.3#1.3.6.1.5.5.7.1.42.5.29.562.5.29.55identifierstring  not an OID)\A[0-2](\.[0-9]+)+\z.0#1.3.6.1.5.5.7.3.1#1.3.6.1.5.5.7.3.2#1.3.6.1.5.5.7.3.3#1.3.6.1.5.5.7.3.4#1.3.6.1.5.5.7.3.5#1.3.6.1.5.5.7.3.6#1.3.6.1.5.5.7.3.7#1.3.6.1.5.5.7.3.8#1.3.6.1.5.5.7.3.9-1.3.6.1.4.1.311.20.2.2Uwrong number of elements in inner sequence/AccessDescription: Oid(%1.3.6.1.5.5.7.48.2Cwrong version for RSA private keyKchoice item must be explicitly tagged5can't decode certificate: eUnknown object in 'OtherHashAlgAndValue' factory: hashValueSIllegal object in IssuerAndSerialNumber: otherIexception processing encoding of CRL9cannot generate CRL encoding!-----BEGIN X509 -----END X509 =malformed PEM data encountered%invalid block type9invalid stored block lengthsGtoo many length or distance symbols3invalid bit length repeatECan't find a SHA-1 implementation.CException processing certificate.CError generating time-stamp token/Exception encoding info9Exception handling CertStore)2.16.840.1.101.3.4.2+2.16.840.1.101.3.4.22+2.16.840.1.101.3.4.42CAMELLIA128CAMELLIA192CAMELLIA256 CAST6GOST28147 GOSTGOST-28147 HC128 HC256NOEKEON ARC4%1.2.840.113549.3.4RC5 RC5-64RC6RIJNDAELSALSA20SERPENTTWOFISH XTEA TIGERDH ECIESECGOST-3410GOST-3410-2001ELGAMALGOST-3410GOST-3410-94 HMAC HMAC- HMAC/KeyGenerator HMACMD2HMACMD4HMACMD5HMACSHA1HMACSHA224HMACSHA256HMACSHA384HMACSHA512HMACRIPEMD128HMACRIPEMD160HMACTIGER#KeyPairGenerator DHWITHSHA1KDF!Basic Agreement 7Basic Agreement (with KDF) PKCS12 key store MAC invalid - wrong password or corrupted file.unmarked extra alias certcertEntryGThere is a key entry with the name keyEntryINo certificate chain for private key#no such entry as stream=Unknown encryption algorithm: 3attempt to set null imageimageData1Exception encrypting key+Checksum mismatch at of ]Checksum mismatch: passphrase wrong, expected  found 1Exception decrypting key5Exception constructing key!Can't find SHA-1spublic key ring doesn't start with public key tag: tag 0xmcannot add a master key to a ring that already has one)can't encode object./unknown response object]Only F2mPoint can be used in WTauNafMultiplierQcountSmallPrimes must be a multiple of 2gcountSmallPrimes must be >= 30 for security reasons seed /EAXAinvalid parameters passed to EAX/mac check in EAX failed /CFBVMPC-MACWVMPC-MAC Init parameters must include an IVWVMPC-MAC Init parameters must include a keyMVMPC-MAC requires 1 to 768 bytes of IVOinvalid parameter passed to RC2 init - 5RC2 engine not initialised Null7Null engine not initialised-error encoding value:  already added7can't recode value for oid tbsCertsigAlgIDsigKsequence wrong size for a certificateEno objects in SemanticsInformation0.4.0.1862.1reqCertgunknown object in 'SigningCertificateV2' factory : AInvalid RecipientKeyIdentifier: %PkiFailureInfo: 0xcontentStream!implicit tagging sigOidM found where PgpSecretKeyRing expectedCollection already contains a key with a keyId for the passed in ring.Collection does not contain a key with a keyId for the passed in ring.M found where PgpPublicKeyRing expectedBundle already contains a key with a keyId for the passed in ring.Bundle does not contain a key with a keyId for the passed in ring./cannot encode principal5exception creating RequestkrequestorName must be specified if request is signed.=exception creating signature: Cexception processing TBSRequest: =no signing algorithm specifiedKunknown signing algorithm specified: %mu must be 1 or -1Ulambda0 and lambda1 do not have same scaleqNo Koblitz curve (ABC), TNAF multiplication not possibleKsi is defined for Koblitz curves only7h (Cofactor) must be 2 or 4 /OFB=MAC size must be multiple of 8EMAC size must be less or equal to QBlock size must be either 64 or 128 bitsFetching first  primes.%generating p and qEsigma.gcd(p_.mult(q_)) != 1! p_: q_: =key size too small. Should be # but is actually needed 7 tries to generate p and q.generating g'g has order phi(n)/ g: 1g has order phi(n)/4 g:5g has order phi(n)/p' g: 5g has order phi(n)/q' g: 3g has order phi(n)/a g: 3g has order phi(n)/b g: ) tries to generate gSfound new NaccacheStern cipher variables:smallPrimes: sigma:......  ( bits)a:.......... b:.......... p':......... q':......... p:.......... q:.......... n:.......... phi(n):..... g:.......... 7SEED engine not initialisedoElGamalPublicKeyParameters are required for encryption.qElGamalPrivateKeyParameters are required for decryption.=ElGamal engine not initialisedIinput too large for ElGamal cipher. #/ISO9796-1PaddingpadBits > 7;invalid forcing byte in block-invalid tsums in block]Currently can't replace attribute certificatesKerror getting certificates from store;error getting CRLs from store)RSA/ECB/PKCS1Paddingoidno name for RFC3211Wrapno keysize for 1exception encoding data.Wunexpected EOF reading signature sub packetcritical/can't convert extensionwnot all mandatory fields set in V3 TBScertificate generatorsecp112r1secp112r2secp128r1secp128r2secp160k1secp160r1secp160r2secp192k1secp192r1secp224k1secp224r1secp256k1secp256r1secp384r1secp521r1sect113r1sect113r2sect131r1sect131r2sect163k1sect163r1sect163r2sect193r1sect193r2sect233k1sect233r1sect239k1sect283k1sect283r1sect409k1sect409r1sect571k1sect571r19DB7C2ABF62E35E668076BEAD208B9DB7C2ABF62E35E668076BEAD20889659EF8BA043916EEDE8911702B22Q00F50B028E4D696E676875615175290472783FB19DB7C2ABF62E35E7628DFAC6561C5u0409487239995A5EE76B55F9C2F098A89CE5AF8724C0A23E0E0FF7750096127C24C05F38A0AAAF65C0EF02C951DEF1815DB5ED74FCC34C85D709Q002757A1114D696E6768756151755316C05E0BD4936DF0AAFD8B8D7597CA10520D04Bu044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97AFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFAFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFCAE87579C11079F43DD824993C2CEE5ED3Q000E0D4D696E6768756151750CC03A4473D03679AFFFFFFFE0000000075A30D1B9038A11504161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83AD6031998D1B3BBFEBF59CC9BBFF9AEE1A5EEEFCA380D02919DC2C6558BB6D8A5DQ004D696E67687561517512D8F03431FCE63B88F4A3FFFFFFF7FFFFFFFBE0024720613B5A3047B6AA5D85E572983E6FB32A7CDEBC14027B6916A894D3AEE7106FE805FC34B44QFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73U0100000000000000000001B8FA16DFAB9ACA16B6B3043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEEQFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFQFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFCQ1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45Q1053CDE42C14D696E67687561517533BF3F83345U0100000000000000000001F4C8F927AED3CA752257044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32QFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70QB4E134D3FB59EB8BAB57274904664D5AF50388BAQB99B99B099B323E02709A4D696E6768756151751U0100000000000000000000351EE786A818F3A1A16B0452DCB034293A117E1F4FF11B30F7199D3144CE6DFEAFFEF2E331F296E071FA0DF9982CFEA7D43F2EaFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37aFFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9DaFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFaFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFCa64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1Q3045AE6FC8422F64ED579528D38120EAE12196D5aFFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D2283104188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811qFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56Du010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F704A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5qFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001qFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFEqB4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4QBD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5qFFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD03641410479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604BQC49D360886E704936A6678E1139D26B7819F7E90FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFCB3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEFQA335926AA319A27A1D00896A6773A4827ACDAC73FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC5297304AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB73617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F 01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC 0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00QD09E8800291CB85396CC6717393284AAA0DA64BA 01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E913864090400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650=003088250CA6E7C7FE649CE85820F7=00E8BEE4D3E2260744188BE0E9C723Q10E723AB14D696E6768756151756FEBF8FCB49A9=0100000000000000D9CCEC8A39E56F}04009D73616F35F4AB1407D73562C10F00A52830277958EE84D1315ED31886=00689918DBEC7E5A0DD6DFC0AA55C7=0095E9A9EC9B297BD4BF36E059184FQ10C0FB15760860DEF1EEF4D696E676875615175D=010000000000000108789B2496AF93}0401A57A6A7B26CA5EF52FCDB816479700B3ADC94ED1FE674C06E695BABA1DE07A11B09A76B562144418FF3FF8C2570B8E0217C05610884B63B9C6C7291678F9D341Q4D696E676875615175985BD3ADBADA21B43A97E2E0400000000000000023123953A9464B54D040081BAF91FDF9833C40F9C181343638399078C6E7EA38C001F73C8134B1B4EF9E150E03E5A88919D7CAFCBF415F07C2176573B2E04B8266A46C55657AC734CE38F018F2192Q985BD3ADBAD4D696E676875615175A21B43A97E3E0400000000000000016954A233049BA98F040356DCD8F2F95031AD652D23951BB366A80648F06D867940A5366D9E265DE9EB240FU04000000000000000000020108A2E0CC0D99F8A5EF0402FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE80289070FB05D38FF58321F2E800536D538CCDAA3D9U07B6882CAAEFA84F9554FF8428BD88E246D2782AE2U0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9Q24B7B137C8A14D696E6768756151756FD0DA2E5CU03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B040369979697AB43897789566789567F787A7876A65400435EDB42EFAFB2989D51FEFCE3C80988F41FF883U020A601907B8C953CA1481EB10512F78744A3205FDQ85E25BFE5C86226CDB12016F7553F9D0E693A268U040000000000000000000292FE77E70C12A4234C330403F0EBA16286A2D57EA0991168D4994637E8343E3600D51FBC6C71A0094FA2CDD545B11C5C0C797324F1e0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01e00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814Q103FAEC74D696E676875615175777FC5B191EF30e01000000000000000000000000C7F34A778F443ACC920EBA490401F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E10025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05e0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709Be00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AEQ10B7B4D696E676875615175137C8A16FD0DA2211e010000000000000000000000015AAB561B005413CCD4EE99D50400D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6Cu8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF04017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD612601DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3y0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90ADQ74D59FF07F6B413D0EA14B344B20A2DB049B50C3y01000000000000000000000000000013E974E72F8A6922031D2603CFE0D70400FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052y2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A50429A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61%040503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC245849283601CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5Q77E2B07370EB0F832A6DD5B62DFC88CD06BB84BE03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307%0405F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B1205303676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F47FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF040060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE902374601E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545FQ4099B5A457F9D69F79213D094C4BCD4D4262210B010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A2117304015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A70061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706!020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001E04026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C89720349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3!02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727AQ2AA058F73A0E33AB486B0F610410C53A7F132310!03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47E040303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15BEwrong version for private key infoWError recoverying private key from sequence1.3.6.1.5.5.8.1cunknown object in 'SigningCertificate' factory : Wunknown object in 'ContentHints' factory : UUnknown object in 'OtherRevVals' factory: otherRevValTypeQUnknown object in 'OcspListID' factory: ocspResponsesWMust contain only 'OcspResponsesID' objectsWUnknown object in 'CrlIdentifier' factory: crlIssuer1.2.643.2.2.91.2.643.2.2.211.2.643.2.2.201.2.643.2.2.191.2.643.2.2.41.2.643.2.2.3!1.2.643.2.2.30.1!1.2.643.2.2.32.2!1.2.643.2.2.32.3!1.2.643.2.2.32.4!1.2.643.2.2.32.5!1.2.643.2.2.33.1!1.2.643.2.2.33.2!1.2.643.2.2.33.3!1.2.643.2.2.35.1!1.2.643.2.2.35.2!1.2.643.2.2.35.3!1.2.643.2.2.36.0!1.2.643.2.2.36.1OIllegal object in RecipientIdentifier: ?Invalid RecipientEncryptedKey: /Invalid EnvelopedData: 1.0.2MD2withRSAMD4WITHRSAMD4withRSA)MD4WITHRSAENCRYPTIONMD5withRSASHA-1withRSASHA-1WITHRSASHA-224withRSASHA-224WITHRSASHA-256withRSASHA-256WITHRSASHA-384withRSASHA-384WITHRSASHA-512withRSASHA-512WITHRSAPSSWITHRSAPSSwithRSARSASSA-PSS'SHA-1withRSAandMGF1'SHA-1WITHRSAANDMGF1SHA1WITHRSA/PSS!SHA-1WITHRSA/PSS+SHA-224withRSAandMGF1+SHA-224WITHRSAANDMGF1#SHA224WITHRSA/PSS%SHA-224WITHRSA/PSS+SHA-256withRSAandMGF1+SHA-256WITHRSAANDMGF1#SHA256WITHRSA/PSS%SHA-256WITHRSA/PSS+SHA-384withRSAandMGF1+SHA-384WITHRSAANDMGF1#SHA384WITHRSA/PSS%SHA-384WITHRSA/PSS+SHA-512withRSAandMGF1+SHA-512WITHRSAANDMGF1#SHA512WITHRSA/PSS%SHA-512WITHRSA/PSS!RIPEMD128withRSA!RIPEMD160withRSA!RIPEMD256withRSANONEWITHDSADSAWITHNONESHA-1withDSADSAWITHSHA-1SHA/DSASHA1/DSASHA-1/DSASHA-1WITHDSADSAWITHSHA224SHA-224withDSADSAWITHSHA-224SHA224/DSASHA-224/DSASHA-224WITHDSADSAWITHSHA256SHA-256withDSADSAWITHSHA-256SHA256/DSASHA-256/DSASHA-256WITHDSADSAWITHSHA384SHA-384withDSADSAWITHSHA-384SHA384/DSASHA-384/DSASHA384WITHDSASHA-384WITHDSADSAWITHSHA512SHA-512withDSADSAWITHSHA-512SHA512/DSASHA-512/DSASHA512WITHDSASHA-512WITHDSASHA-1withECDSASHA1/ECDSASHA-1/ECDSAECDSAWITHSHA-1SHA-1WITHECDSASHA224/ECDSA!SHA-224withECDSASHA-224/ECDSAECDSAWITHSHA224!ECDSAWITHSHA-224!SHA-224WITHECDSASHA256/ECDSA!SHA-256withECDSASHA-256/ECDSAECDSAWITHSHA256!ECDSAWITHSHA-256!SHA-256WITHECDSASHA384/ECDSA!SHA-384withECDSASHA-384/ECDSAECDSAWITHSHA384!ECDSAWITHSHA-384!SHA-384WITHECDSASHA512/ECDSA!SHA-512withECDSASHA-512/ECDSAECDSAWITHSHA512!ECDSAWITHSHA-512!SHA-512WITHECDSARIPEMD160/ECDSA%RIPEMD160withECDSA%ECDSAWITHRIPEMD160%RIPEMD160WITHECDSA!ECGOST-3410-2001mechanismSHA1WITHECNRSHA224WITHECNRSHA256WITHECNRSHA384WITHECNRSHA512WITHECNR+SHA1WITHRSA/ISO9796-2)MD5WITHRSA/ISO9796-25RIPEMD160WITHRSA/ISO9796-2Signer QPublic key passed - private key expectedGClass provided is not convertible: ;data not integrity protected.MIncorrect length for infinity encodingencodedQIncorrect length for compressed encodingcIncorrect length for uncompressed/hybrid encoding/Invalid point encoding 3Invalid point compressionk1 must be > 0/k3 must be 0 if k2 == 0k2 must be > k1k3 must be > k2/Not enough data to readBuffer size of 9 is too small for a read of bytesCannot remove # bytes, only got SRSA parameters should be for a public keyIcipher must be instance of DesEngineISO9797Alg3]parameters must be an instance of KeyParameterMKey must be either 112 or 168 bit longio exception: Qno digests could be created for message.;problem parsing cert/crl setsEerror getting certs from certStoreCerror getting crls from certStoreprime192v1prime192v2prime192v3prime239v1prime239v2prime239v3prime256v1c2pnb163v1c2pnb163v2c2pnb163v3c2pnb176w1c2tnb191v1c2tnb191v2c2tnb191v3c2pnb208w1c2tnb239v1c2tnb239v2c2tnb239v3c2pnb272w1c2pnb304w1c2tnb359v1c2pnb368w1c2tnb431r1u6277101735386680763835789423207666416083908700390324961279afffffffffffffffffffffffffffffffefffffffffffffffca64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1e03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012affffffffffffffffffffffff99def836146bc9b1b4d22831Q3045AE6FC8422f64ED579528D38120EAE12196D5acc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953e03eea2bae7e1497842f2de7769cfe9c989c072ad696f48034aafffffffffffffffffffffffe5fb1a724dc80418648d8dd31Q31a92ee2029fd10d901b113e990710f0d21ac6b6a22123dc2395a05caa7423daeccc94760a7d462256bd56916e027d29778100c65a1da1783716588dce2b8b4aee8e228f1896affffffffffffffffffffffff7a62d031c83f4294f640ec13Qc469684435deb378c4b65ca9591e2a5763059a2e883423532389192164791648750360308885314476597252960362792450860609699839y7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffcy6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a}020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaafy7fffffffffffffffffffffff7fffff9e5e9a9f5d9071fbd1522688909d0bQe43bb460f0b80cc0c0b075798e948060f8321b7dy617fab6832576cbbfed50d99f0249c3fee58b94ba0038c7ae84c8c832f2c}0238af09d98727705120c921bb5e9e26296a3cdcf2f35757a0eafd87b830e7y7fffffffffffffffffffffff800000cfa7e8594377d414c03821bc582063Qe8b4011604095303ca3b8099982be09fcb9ae616y255705fa2a306654b1f4cb03d6a750a30c250102d4988717d9ba15ab6d3e}036768ae8e18bb92cfcf005c949aa2c6d94853d0e660bbf854b1c9505fe95ay7fffffffffffffffffffffff7fffff975deb41b3a6057c3c432146526551Q7d7374168ffe3471b60a857686a19475d3bfa2ff115792089210356248762697446949407573530086143415290314195533631308867097853951ffffffff00000001000000000000000000000000fffffffffffffffffffffffc5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551Qc49d360886e704936a6678e1139d26b7819f7e90U0400000000000000000001E60FC8821CC74DAEAFC1U072546B5435234A422E0789675F432C89435DE5242U00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9Y0307AF69989546103D79329FCC3D74880F33BBE803CBQD2COFB15760860DEF1EEF4D696E6768756151754U03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7U0108B39E77C4B108BED981ED0E890E117C511CF072U0667ACEB38AF4E488C407433FFAE4F1C811638DF20Y030024266E4EB5106D0A964D92C4860E2671DB9B6CC5U03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309U07A526C63D3E25A256A007699F5447E32AE456B50EU03F7061798EB99E238FD6F1BF95B48FEEB4854252BY0202F9F87B7C574D0BDECF8A22E6524775F98CDEBDCBU010092537397ECA4F6145799D62B0A19CE06FE26AD]00E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B]005DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2]038D16C2866798B600F9F08BB4A8E860F3298CE04A5798a40000000000000000000000004A20E90C39067C893BBB9A5a2866537B676752636A68F56554E12640276B649EF7526267a2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185ECe0236B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0DQ4E13CA542744D696E67687561517552F279A8C84a20000000000000000000000050508CB89F652824E06B8173a401028774D7777C7B7666D1366EA432071274F89FF01E718a0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01e023809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10a155555555555555555555555610C0B196812BFB6288A3EA3a6C01074756099122221056911C77D77E77A777E7E7E77FCBa71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8e03375D4CE24FDE434489DE8746E71786015009E66E38A926DDe0101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9Dm00C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9Em0289FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57Ay2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447y32010857077C5431123A46B808906756F543423E8D27877578125778AC76y790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16}0257927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91Dy1555555555555555555555555555553C6F2885259C31E3FCDF154624522Dy4230017757A767FAE42398569B746325D45313AF0766266479B75654E65Fy5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B}0228F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205y0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFFy01238774666A67766D6676F778E676B66999176666E687666D8766C66A9Fy6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40}0370F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C920100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E6295210091A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB207167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7026108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D0101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D00FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E68100BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE02197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A261401AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A5572472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988033C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD96700E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D00FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A021085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A911A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF261802120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7Osequence wrong size for CertificateListWUnknown object in 'TimeStampResp' factory: UUnknown object in 'TimeStampReq' factory: 1.3.36.3 .2.1 .2.2 .2.3 .3.1 .3.2 .3.2.8 B-571 B-409 B-283 B-233 B-163 P-521 P-256 P-224 P-3842.23.136.1Qunknown object in 'EssCertID' factory : sha1HashotherHashEstring contains illegal characters/Invalid EncryptedData: encInfo1object not Asn1Encodable7invalid literal/length code+invalid distance codestream endfile errorstream errordata error'insufficient memorybuffer error)incompatible version#Not implemented: No elementsiCertificate must have an ExtendedKeyUsage extension.Certificate must have an ExtendedKeyUsage extension marked as critical.UExtendedKeyUsage not solely time stamping.Scannot process ExtendedKeyUsage extensionCdigest algorithm cannot be found.;No digest algorithm specified3exception adding subkey: encoding errorsDSADigestSigner not initialised for signature generation.Glast block incomplete in decryption/RFC3211Wrapinput too short+wrapped key corrupted5wrapped key fails checksumOinvalid parameter passed to RC6 init - 5RC6 engine not initialised)too many pad bytes (OThis type of ECCurve is not implementedfieldID1.3.36.3.2.12.5.8.1.11.3.6.1.5.5.7.48MInvalid millis field : not in (1..999)MInvalid micros field : not in (1..999)OInvalid millis field : not in (1..999).OInvalid micros field : not in (1..999).%Invalig tag numberMUnknown object in 'Accuracy' factory: /VerisignCzagExtension: /NetscapeRevocationUrl: )NetscapeCertType: 0x1.3.6.1.4.1.311 .20.2 .21.1 .21.2 .21.7 .21.10YUnknown object in 'OcspIdentifier' factory: ETag number for 'content' must be 0Minvalid data structure in certificate!Signature algorithm in certificate info not same as outer certificateUException encoding certificate info objectCRL)ATTRIBUTECERTIFICATECERTIFICATEPAIRCOLLECTION%X.509 store type '!' not available.Ooversubscribed dynamic bit lengths treeGincomplete dynamic bit lengths treeEoversubscribed literal/length tree=incomplete literal/length tree9oversubscribed distance tree1incomplete distance treeAempty distance tree with lengths?unable to parse genTime field: ssecret key ring doesn't start with secret key tag: tag 0x;unknown compression algorithm7unknown compression level: server finishedmaster secretclient finished{Sorry, connection has been closed, you cannot write more dataWInternal TLS error, this could be an attack /HMACWinvalid parameter passed to Serpent init - Serpent/Serpent not initialisedCkey must be a multiple of 4 bytes9The key must be 128 bit long HC-128SInvalid parameter passed to HC128 init - GAgreement algorithm not initialised bcpgInval/Values must be positive digest+IP Address is invalid name=can't process string for tag: tagunknown tag: ::OBad object format in 'TstInfo' factory.KUnknown object in 'TstInfo' factory: %Unknown tag value 1.3.132.0.16.17.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39Iunknown object in IDEACBCPar factory.18.19=null or empty sequence passed._wrong size in DataGroupHashValues : not in (2..Uunknown object in 'EssCertIDv2' factory : withECDSAcollectionCX509CollectionStoreParameters: [  collection:  =Invalid SubjectKeyIdentifier: keyIDUException extracting certificate details: 7Can only push back one byte000Algorithm ECould not process ASN.1 parametersHMAC-MD5HMAC-RIPEMD160HMAC-SHA1HMAC-TIGERHMAC-SHA224HMAC-SHA256HMAC-SHA384HMAC-SHA512 DESMACDES/CFB8DESMAC/CFB8DESEDEMACDESEDE/CFB8DESEDEMAC/CFB8DESISO9797MACDESWITHISO9797DESEDE64DESEDEMAC649DESEDE64WITHISO7816-4PADDING?DESEDEMAC64WITHISO7816-4PADDINGQDESEDEISO9797ALG1MACWITHISO7816-4PADDINGKDESEDEISO9797ALG1WITHISO7816-4PADDINGISO9797ALG3ISO9797ALG3MACEISO9797ALG3MACWITHISO7816-4PADDING?ISO9797ALG3WITHISO7816-4PADDINGSKIPJACKMACSKIPJACK/CFB8!SKIPJACKMAC/CFB8IDEAMACIDEA/CFB8IDEAMAC/CFB8 RC2MACRC2/CFB8RC2MAC/CFB8 RC5MACRC5/CFB8RC5MAC/CFB8GOST28147MACVMPCMACPBEWITHHMACSHAPBEWITHHMACSHA1PBEWITH Mac RIPEMD-128RIPEMD-160RIPEMD-256RIPEMD-320WHIRLPOOLDigest gSorry, init of TLS_NULL_WITH_NULL_NULL is forbiddenCInvalid y for GOST3410 public key5field must be an odd primeMgenerator must in the range [2, p - 2]Am value must be < bitlength of pm;l value must be >= m, or zero9subgroup factor must be >= 2jISO7816-4Eparameters invalid for algorithm: #unknown key size.wnot all mandatory fields set in V1 TBScertificate generatorGeneralNames:Acountry can only be 2 charactersUUnknown object in 'OtherRevRefs' factory: otherRevRefTypeotherRevRefsQUnknown object in 'CrlOcspRef' factory: 3Illegal tag in CrlOcspRefiUnknown object in 'CompleteRevocationRefs' factory: crlOcspRefsMMust contain only 'CrlOcspRef' objects FALSE TRUEKInvalid KeyAgreeRecipientIdentifier: 7problem encoding tbsRequest]attempt to Verify signature on unsigned object;P and Q must be on same curveSGOST3410 private key required for signingQGOST3410 public key required for signing /GCMIonly 128-bit MAC supported currentlyAinvalid parameters passed to GCM5IV must be at least 1 byte5mac check input GCM failed11100001qKey length invalid. Key needs to be 32 byte - 256 bit!!![invalid parameter passed to Gost28147 init - Gost28147MacSinvalid parameter passed to RC564 init -  TigerbcpgOutSunexpected end of file in armored stream.-Ano crc found in armored message.Icrc check failed in armored message.)crc check not found.#1.2.840.10045.1.1#1.2.840.10045.1.2+1.2.840.10045.1.2.3.1+1.2.840.10045.1.2.3.2+1.2.840.10045.1.2.3.3#1.2.840.10045.4.1#1.2.840.10045.2.1#1.2.840.10045.4.31.2.840.10045.3.20#1.2.840.10046.2.1#1.2.840.10040.4.1'1.3.133.16.840.63.01.2.840.10046.3;bad version in X9ECParameters#1.3.6.1.5.5.7.2.1#1.3.6.1.5.5.7.2.2signatureValue'1.3.6.1.4.1.11591.1'1.3.6.1.4.1.11591.2+1.3.6.1.4.1.11591.2.1/1.3.6.1.4.1.11591.2.1.1'1.3.6.1.4.1.11591.3)1.3.6.1.4.1.11591.12-1.3.6.1.4.1.11591.12.2)1.3.6.1.4.1.11591.13-1.3.6.1.4.1.11591.13.211.3.6.1.4.1.11591.13.2.111.3.6.1.4.1.11591.13.2.211.3.6.1.4.1.11591.13.2.311.3.6.1.4.1.11591.13.2.431.3.6.1.4.1.11591.13.2.2131.3.6.1.4.1.11591.13.2.2231.3.6.1.4.1.11591.13.2.2331.3.6.1.4.1.11591.13.2.2431.3.6.1.4.1.11591.13.2.4131.3.6.1.4.1.11591.13.2.4231.3.6.1.4.1.11591.13.2.4331.3.6.1.4.1.11591.13.2.44)1.3.6.1.4.1.11591.14-1.3.6.1.4.1.11591.14.1aunknown object in 'ContentIdentifier' factory : [Unknown object in 'OcspResponsesID' factory: ocspIdentifiermUnknown object in 'CommitmentTypeIndication' factory: !commitmentTypeIdk12702124828893241746590704277717644352578765350891653581281750726570503126098509849742318833348340118092599999512098893413065920561499672425412104927434935707492031276956145168922411057931124881261022967853463840169352001328899500036226068422275081353230700451734163368500454106258697141688368677884253782038368363196144955700784444165611827252895102170888761442055095051287550314083023k100997906755055304772081815535925224869841082572053457874823515875577147990529272777244152852699298796483356699682842027972896052747173175480590485607134746852141928680912561502802222185647539190902656116367847270145019066794290930185446216399730872221732889830323194097355403213400972588322876850946740663962k13945487119911582560140965510769071310704170705992803179775800145437576535772298409412436852228823983303911468164807668823692122073732267216074074777170091113455043205380464769490468612011308781624074018480047704715733666292624942357124882396854222175366014339148568084052033685945849480318734128858048952516379885141663410976897627118935756323747307951916507639758300472692338873533959i42941826148615804143873447737955502392672345968607143066798112994089471231420027060385216699563848719957657284814898909770759462613437669456364882730370838934791080835932647976778601915343474400961034231316672578686920482194932878633360203384797092684342247621055760235016132614780652761028509445403338652341k14201174159756348119636828602231808974327613839524373876287257344192745939351271897363116607846760036084894662356762579528277471921224192907104613420838063639408451269182889400057152462544529576934935675272895683154177544176313938445719175509684710784659566254794231229333848392451433961472776068188060973423991771529896554605945588149018382750217296858393520724172743325725474374979801k1335318132727206734338595199483190012179423759678474868994823595993696425287347124615904033277318214103280125292538719147885989931033105677441361963648030647213778266568986864684632777101508094011826087702016153249904683329312949209127762411378780302243557466062839716593764268326742697808800616315281634758871GostR3410-94-CryptoPro-A1GostR3410-94-CryptoPro-B7GostR3410-94-CryptoPro-XchA115792089237316195423570985008687907853269984665640564039457584007913129639319115792089237316195423570985008687907853073762908499243225378155805079068850323115792089237316195423570985008687907853269984665640564039457584007913129639316166640338811429272026836498814504334739859317602688849412888527458039088786386125789604461865809771178549250434395392663499233282028201972879200395656482319357896044618658097711785492504343953927102133160255826820068844496087732066703578960446186580977117854925043439539266349923328202820197287920039565648231902809101935305809009699697900030956075912436855801486595765584287239730126759528792665814854611296992347458380284135028636778229113005756334730996303888124703900853520833051995477180190184378410795166300451804712843468437056335026197039008535208330519954771801901843784092088264716408103532260145835229839660170390085352083305199547718019018437841079516630045180471284346843705633502616 32858298188939177312407334712732403147699272405508123836956891464952616045659902475GostR3410-2001-CryptoPro-A5GostR3410-2001-CryptoPro-B5GostR3410-2001-CryptoPro-C;GostR3410-2001-CryptoPro-XchA;GostR3410-2001-CryptoPro-XchB?Invalid PasswordRecipientInfo: 'SetIssuerUniqueId()?constructed invalid certificate1Could not extract issuer3Could not extract subject)AES/ECB/PKCS7PADDINGAES/ECB/PKCS7AES//PKCS7#AES//PKCS7PADDINGAES/ECB/PKCS5)AES/ECB/PKCS5PADDINGAES//PKCS5#AES//PKCS5PADDING)AES/CBC/PKCS7PADDINGAES/CBC/PKCS7AES/CBC/PKCS5)AES/CBC/PKCS5PADDING)AES/OFB/PKCS7PADDINGAES/OFB/PKCS7AES/OFB/PKCS5)AES/OFB/PKCS5PADDING)AES/CFB/PKCS7PADDINGAES/CFB/PKCS7AES/CFB/PKCS5)AES/CFB/PKCS5PADDINGRSA//PKCS1#RSA//PKCS1PADDINGRSA/ECB/PKCS1)RSA/ECB/PKCS1PADDINGDES/CBCDESEDE/CBCRC2/CBCIDEA/CBCCAST5/CBCARCFOUR/PBEWITHSHA1AND128BITRC4-PBEWITHSHAAND128BITRC4-PBEWITHSHA1AND40BITRC4+PBEWITHSHAAND40BITRC4#PBEWITHSHA1ANDDES+PBEWITHSHA1ANDDES-CBC#PBEWITHSHA1ANDRC2+PBEWITHSHA1ANDRC2-CBCAPBEWITHSHA1AND3-KEYTRIPLEDES-CBC?PBEWITHSHAAND3-KEYTRIPLEDES-CBC5PBEWITHSHAAND3KEYTRIPLEDES)PBEWITHSHA1ANDDESEDEAPBEWITHSHA1AND2-KEYTRIPLEDES-CBC?PBEWITHSHAAND2-KEYTRIPLEDES-CBC7PBEWITHSHA1AND128BITRC2-CBC5PBEWITHSHAAND128BITRC2-CBC5PBEWITHSHA1AND40BITRC2-CBC3PBEWITHSHAAND40BITRC2-CBC=PBEWITHSHA1AND128BITAES-CBC-BC;PBEWITHSHAAND128BITAES-CBC-BC?PBEWITHSHA-1AND128BITAES-CBC-BC=PBEWITHSHA1AND192BITAES-CBC-BC;PBEWITHSHAAND192BITAES-CBC-BC?PBEWITHSHA-1AND192BITAES-CBC-BC=PBEWITHSHA1AND256BITAES-CBC-BC;PBEWITHSHAAND256BITAES-CBC-BC?PBEWITHSHA-1AND256BITAES-CBC-BCCPBEWITHSHA-256AND128BITAES-CBC-BCAPBEWITHSHA256AND128BITAES-CBC-BCCPBEWITHSHA-256AND192BITAES-CBC-BCAPBEWITHSHA256AND192BITAES-CBC-BCCPBEWITHSHA-256AND256BITAES-CBC-BCAPBEWITHSHA256AND256BITAES-CBC-BC5GOST28147/CBC/PKCS7PADDING3CAMELLIA/CBC/PKCS7PADDING+SEED/CBC/PKCS7PADDINGPBEEPBEWITHMD5AND128BITAES-CBC-OPENSSLEPBEWITHMD5AND192BITAES-CBC-OPENSSLEPBEWITHMD5AND256BITAES-CBC-OPENSSLCipher ]Modes and paddings not used for stream ciphersIPaddings not used for stream ciphersNOPADDINGISO10126PADDING#ISO10126D2PADDING#ISO10126-2PADDING!ISO7816-4PADDING!ISO9797-1PADDINGISO9796-1!ISO9796-1PADDING OAEPOAEPPADDING3OAEPWITHMD5ANDMGF1PADDING5OAEPWITHSHA1ANDMGF1PADDING7OAEPWITHSHA-1ANDMGF1PADDING9OAEPWITHSHA224ANDMGF1PADDING;OAEPWITHSHA-224ANDMGF1PADDING9OAEPWITHSHA256ANDMGF1PADDING;OAEPWITHSHA-256ANDMGF1PADDING9OAEPWITHSHA384ANDMGF1PADDING;OAEPWITHSHA-384ANDMGF1PADDING9OAEPWITHSHA512ANDMGF1PADDING;OAEPWITHSHA-512ANDMGF1PADDING PKCS1PKCS1PADDING PKCS5PKCS5PADDINGPKCS7PADDINGTBCPADDINGWITHCTSX9.23PADDINGX923PADDINGZEROBYTEPADDING NONECCMCTRCTSEAXGCM GOFBOPENPGPCFBSIC-Warning: SIC-Mode can become a twotime-pad if the blocksize of the cipher is too small. Use a cipher with a block size of at least 128 bits (e.g. AES)ICTS mode not valid for AEAD ciphers.MBad padding specified for AEAD cipher.GSignatureCreationTime not available?exception encoding hashed data.3exception creating cipher3unexpected end of stream.;Exception starting decryption?error setting asymmetric cipher?exception decrypting secret key'key checksum failed3scale may not be negativeOnly SimpleBigDecimal of same scale allowed in arithmetic operations;block cipher block size != 1.Soutput buffer too small in ProcessBytes();Can't Generate a derived key  bytes long.7Salsa20 Init requires an IVMSalsa20 requires exactly 8 bytes of IV7Salsa20 Init requires a keySalsa20C2^70 byte limit per IV; Change IVg2^70 byte limit per IV would be exceeded; Change IV!expand 32-byte k!expand 16-byte k E-TESTE-AE-BE-CE-D D-TESTGost28147AGost28147 engine not initialisedUnknown S-Box - possible types: "E-Test", "E-A", "E-B", "E-C", "E-D", "D-Test", "D-A".Oinvalid parameter passed to DES init - 5DES engine not initialisedUinvalid parameter passed to DESede init - ;DESede engine not initialisedIexception reading compressed stream.Kwrong size in numeric code : not in (..Ywrong size in alphabetic code : max size is -Invalid DsaParameter: AAuthorityInformationAccess: Oid(SUnknown object in 'OtherCertID' factory: otherCertHash-CRL contents invalid: Signature algorithm on CertificateList does not match TbsCertList.[CRL does not verify with supplied public key./ Version: / This update: / Next update: / Extensions: Base CRL: UException reading IssuingDistributionPoint=malformed timestamp response: Iresponse contains wrong nonce value.Stime stamp token found in failed request.]response for different message imprint digest.cresponse for different message imprint algorithm.Sno signing certificate attribute present.gconflicting signing certificate attributes present.;TSA policy wrong for request.Wno time stamp token found and one expected.[invalid info structure in GOST3410 public keyYalgorithm identifier in key not recognised: PKCS5SCHEME1Pkcs5scheme1PKCS5SCHEME2Pkcs5scheme2)PBEWITHMD2ANDDES-CBC)PBEwithMD2andDES-CBC)PBEWITHMD2ANDRC2-CBC)PBEwithMD2andRC2-CBC)PBEWITHMD5ANDDES-CBC)PBEwithMD5andDES-CBC)PBEWITHMD5ANDRC2-CBC)PBEwithMD5andRC2-CBC-PBEwithSHA-1andDES-CBC%PBEWITHSHA-1ANDDES-PBEWITHSHA-1ANDDES-CBC-PBEwithSHA-1andRC2-CBC%PBEWITHSHA-1ANDRC2-PBEWITHSHA-1ANDRC2-CBC PKCS12 Pkcs121PBEwithSHA-1and128bitRC41PBEWITHSHA-1AND128BITRC4/PBEwithSHA-1and40bitRC4/PBEWITHSHA-1AND40BITRC49PBEWITHSHAAND3-KEYDESEDE-CBC=PBEwithSHA-1and3-keyDESEDE-CBC;PBEWITHSHA1AND3-KEYDESEDE-CBC=PBEWITHSHA-1AND3-KEYDESEDE-CBCCPBEWITHSHA-1AND3-KEYTRIPLEDES-CBC9PBEWITHSHAAND2-KEYDESEDE-CBC=PBEwithSHA-1and2-keyDESEDE-CBC;PBEWITHSHA1AND2-KEYDESEDE-CBC=PBEWITHSHA-1AND2-KEYDESEDE-CBCCPBEWITHSHA-1AND2-KEYTRIPLEDES-CBC9PBEwithSHA-1and128bitRC2-CBC9PBEWITHSHA-1AND128BITRC2-CBC7PBEwithSHA-1and40bitRC2-CBC7PBEWITHSHA-1AND40BITRC2-CBC?PBEwithSHA-1and128bitAES-CBC-BC?PBEwithSHA-1and192bitAES-CBC-BC?PBEwithSHA-1and256bitAES-CBC-BCCPBEwithSHA-256and128bitAES-CBC-BCCPBEwithSHA-256and192bitAES-CBC-BCCPBEwithSHA-256and256bitAES-CBC-BC#PBEWITHSHAANDIDEA/PBEwithSHA-1andIDEA-CBC+PBEWITHSHAANDIDEA-CBC)PBEWITHSHAANDTWOFISH5PBEwithSHA-1andTWOFISH-CBC1PBEWITHSHAANDTWOFISH-CBC!PBEwithHmacSHA-1!PBEWITHHMACSHA-1#PBEWITHHMACSHA224%PBEwithHmacSHA-224%PBEWITHHMACSHA-224#PBEWITHHMACSHA256%PBEwithHmacSHA-256%PBEWITHHMACSHA-256)PBEWITHHMACRIPEMD128)PBEwithHmacRipeMD128)PBEWITHHMACRIPEMD160)PBEwithHmacRipeMD160)PBEWITHHMACRIPEMD256)PBEwithHmacRipeMD256!PBEWITHHMACTIGER!PBEwithHmacTigerEPBEwithMD5and128bitAES-CBC-OpenSSLEPBEwithMD5and192bitAES-CBC-OpenSSLEPBEwithMD5and256bitAES-CBC-OpenSSLPkcs5S1Pkcs5S2OpenSsl%Unknown PBE type: PBEwithSHA-1PBEwithSHA-256PBEwithMD5PBEwithMD2PBEwithHmacRC2-CBCDES-CBCDESEDE-CBC'quick check failed.OpenPGPCFB/NoPaddingGunknown signing algorithm specified-Zero length BigInteger?Only bases 2, 10, or 16 allowedCBad character in radix 2 string: %Invalid sign value?sizeInBits must be non-negativebitLength < 2-Division by zero error1Modulus must be positive;Numbers not relatively prime.;Cannot be called on value < 0#Negative exponentAOnly bases 2, 10, 16 are allowed nullx8CBit position must not be negative5Bit address less than zero and  for TLS 1.0 X9.23 80038000000BAOoops! key size 512 or 1024 bit.csize must be from 512 - 1024 and a multiple of 64 sizeQKey length not 128/160/192/224/256 bits.;unknown blocksize to RijndaelYinvalid parameter passed to Rijndael init - Rijndael?Rijndael engine not initialisedNaccacheStern3Constructing lookup ArrayEConstructing lookup ArrayList for INaccacheStern engine not initialisedWinput too large for Naccache-Stern cipher. }BlockLength does not match modulus for Naccache-Stern cipher. +input as BigInteger: Prime is 1, lookup table has size 5Error in lookup Array for a: Size mismatch. Expected ArrayList with length ? but found ArrayList of length !Actual prime is 'Decrypted value is LookupList for  with size is: Lookup failed+Encrypted value is: WBlockLength too large for simple addition. 9c(m1) as BigInteger:....... 9c(m2) as BigInteger:....... 9c(m1)*c(m2)%n = c(m1+m2)%n: +Input blocksize is: +Output blocksize is: +Data has length:.... new datapos is )cipher returned nullreturning ydata size is less then input block size, processing directly[attempt to process message to long for cipherpublicParameter!privateParameterWinvalid rid in KeyAgreeRecipientInformationIKeyAgreement requires asymmetric key/originator key invalid.KeyUsage: 0xcapabilityID/Invalid SmimeCapability31.2.392.200011.61.1.1.1.231.2.392.200011.61.1.1.1.331.2.392.200011.61.1.1.1.431.2.392.200011.61.1.1.3.231.2.392.200011.61.1.1.3.331.2.392.200011.61.1.1.3.4%2.16.840.1.101.3.4 .2.4.21.41.42.43.44.45'2.16.840.1.113730.1/2.16.840.1.113733.1.6.312.16.840.1.113733.1.6.15#2.16.840.1.113719.1.9.4.1!1.2.840.113533.7 .65.0Uunknown object in 'OtherCertID' factory : _Unknown object in 'SignaturePolicyId' factory: 'sigPolicyIdentifiersigPolicyHasheMust contain only 'SigPolicyQualifierInfo' objects'sigPolicyQualifiers;Invalid OriginatorPublicKey: SIllegal object in KeyAgreeRecipientInfo: (lM<_fz\V4 X   H                   \ X     X   D  )))(((D((X   H H H L H  @ -   1    \(@(-( X D DD` DD  X X X X(  (D D    `( D dh h h h(h    t t t X DX   (   DD DD DDDD                 :Org.BouncyCastle.Pkcs1.Strict     @       P      T5 T\ `@dd \dd @   x   \x   \  x  (@(((x| | |DERBER  \ , \ (\(   \    (( H   D  ,  $ $    (((    ($1.3.6.1.5.5.7.48.1 L   (   9(    \$ |  | 1, , % 0  (0( 88  <  @@      @ - \  \  \  \ \ \   ( \\  D D D ( ,,\ D<0 x0   p= = (0     x 0 p <p p pp p   p(x(0x x\- x 1 p 1 x 1111 x11   \  <  ppl pp<l pp< pp ppl x )btu_CONSOLE  ( DH    ( tt tH   P DDD DDDP P (P  \   \( D D\ D   (  L                 \  \(((((    X X(d d21.2.840.113549.1.9.16.3.8     (     =>?\ D\  \ ((\(  DD        A  $$     ( (,X ((   , ,(((,(,, , \\ 4 8  ((@ LL \ \ (T ,  (\ \  -` `  d0h 0  ` ll p ( xx  h (|  (      ) ) )) ))) x  $D-  \E\\\ X X X X(X  \ D DD DD   ((D DDDD                     DXDI \ I\ x     I \ \xx \ d d d   \x \ \x  \d(     x0  x0  x0   x0   0x   (8   E @@  (< <(< TT     8 `   d  h H  \t   \ \ E(\    \ D p  p p      (p((     -\ , , x0   4 l  -    \ (\  ( H   H  D(      DDDDD 8 D D 8  H H H    |y7 7 4 8    p p \        )H H\ \  H `  Hp xp xp  p x((p(x$ x-$ $($d d  1 , ,     \  \ p \ \  \8  8\,X 8\,X 8(8   (   \\ \\\ p   d l d d  d(d  (H@ H -  \ M(\\ \| |1||111  D  H123    \ \(   8(    x \\      ) .1.3.6.1.4.1.188.7.1.1.2,1.2.840.113533.7.66.10 \  ` \\ X  \     xd xd xd< d < pA   1E 1E 11 11   E \I I 1\    AE\ E$   $  $ $\ $X X     ( DD   ,X D  D  D((D  \  DDDDD| |< \<  <(< @ p(   H `    --      (   (   \\\| \ (\( E  X              p p 81.3.14.3.2.26T T D T    X DD DD1D(1  (iZM    dddX) )                8 I  0       ( \  \\   ( L  L L (L(  (     d d d(d   (   (   , , l  D  8 8  88  D < @ H  D D DD|d |H |H XXX  `         \  e 0 0dfghijklmn|   |   D    $($    1 `$1.2.840.113549.1.1$1.2.840.113549.1.3$1.2.840.113549.1.5 1.2.840.113549.3 1.2.840.113549.2$1.2.840.113549.1.7$1.2.840.113549.1.9*1.2.840.113549.1.9.22*1.2.840.113549.1.9.23.1.2.840.113549.1.9.16.1.1.2.840.113549.1.9.16.6.1.2.840.113549.1.9.16.2.1.2.840.113549.1.9.16.5&1.2.840.113549.1.1201.2.840.113549.1.12.10.1*1.2.840.113549.1.12.1  T\\X  (T(   ,  (       ((    -       ( 2RF (   @ \\ Q Q Q  \ (Q-----BEGIN U U U U I \    p d |   |(UL -T T D        D D  D Dh      ( P PPD XX \ XY\ \   D1.3.6.1.5.5.7.3`    dh \ ` \ DDDDDDDDx D        (   D- D-- D-X  \ \   ,         ] \ \xx  $D-\ \ |\||\|,\           ] \   ( <p p 1111p p 1p p 1111 p 1  1    x\\- x\\- p  p(p p p   H H DD        t   L   HH (L \   TT TXX \    \< ``@@@   \\\ I1        ||    ( D DX \\  \ \D T D  DDD DD DDD D  DD  /359   \   D 111            8   xI x EI  d I d dd Id d     (d    d    81DqJW;|    \  P P - -D  1.2.643.2.2 d \    (@t @t  t(@(t 1.0.2\|\ | |  D DD   D  DD DDDD DD DDDD  D  D ( DD l tl tl t tlT \ \ @ @h        - || (x xd(x \X  ((\2.23.136     t t      *=4           % $ $D4 4 4 4(4      DD HH H  xD DDDD  , 2.5.4 48< < <P T 8- \\d      4 4  X  |       4 @ (4(@( \E    x|- x\\- p (      (*+,-./0123<FGPZdX   X   5(X( h6\       = = = D  (        4 \\4X \  \     P  ,,\  4  \ \  X\X XX \  H\HH\   - - =  D DDD DDD DDDD DDDD  h( t x |       HH H(H   (    (((   `   `((`l l l l(l   DD4  \ DDD  ( D DDD         1.2.840.100451.2.840.10045.11.2.840.10045.41.2.840.10045.2 $$( 8 81.3.6.1.5.5.7.2,(4 (((x< x x(x@  DD  ,LTP T T T(TT \,\  dd  p\ p\ pX p p p   ((\     d   lp l<p lpp lp  $ $x    D    D   D T   yZnܼb    X    % ,   (  , (     | | D   X h   $( \Pkcs5S1Pkcs5S2 Pkcs12OpenSsl L \  X\ X\ X X\   @ @ D DX D-X D--X @\- @\- D\\X  !  ! ! D    DD !DDDDD       DD!  D D  X D  D D  D            X1  D11 \\  |(   <  (&2.16.840.1.113733.1 \ \ \   (  DDD  ,  ($$RSA1F-]W/~> ɗĮEp -ކ^JÌ_@5Gei$%_ 5ҫPPh~[d{.:@]>bhWdI_#Q>1If4,  8 ) 1] M]1  50Use version taking a DerObjectIdentifier insteadX\%X \%H< H ,YTRespData class is no longer required as all functionality is available on this class1,4%1   @TDDDDDDDDDDDDDUse 'Password' propertyUse 'Salt' property+&Use version with 'algorithm' parameter T\`dh MM`  DDD ]      M\T  ! 8 d x)%6\@ \ (,x x%55H %$ A A A$ % %,,%%%| Item Use GetEnumerator() instead'"Use 'object[index]' syntax instead % ,%%!Use 'Count' property instead  %5H% 4/Use version taking an Asn1Encodable arg instead!   8 %  ,  ,,0xM   0  P  5HH(#Use 'CreationTime' property instead5$($@ l %x(( \x 1% 1l% 1%! l<ll%%%p1p)p p1pl411x Use NextPgpObject() instead1xDD        tt        -/)\,---%%72Avoid working with X509Name objects in string form D X(",X( % AA  \A K$AAAA%%%(#Use version accepting Asn1Encodable%,   -  A! -%-\`Use static Instance objectlWill be removed  xd x     DDDD         DI p %% IO\ 5dd%%4IxE5Ix5<15x 555 5 5  5%%   |$Use version in Asn1.Esf instead %\1% Use 'object[oid]' syntax instead% %% | %   AAX%\ HH T@XhDD <d )%$p(8 %*%Use AttributeCertificateValid instead9     ==   X  Use InnerException property  "Use ECCurve.Infinity property& DDDDDDDD!DD DDDDDD8 88 88888888HH15X  Il t H DDDDDDDD,      1%  (x( 5L%%% %%%& Ixx,L%% |` % A ,  %%,% %%    -,1\ )%11 A AX%\ X\1 1  DD L 5    8 DDDDDDDT   ( )  % )  %| %8|D  \\ 85X8?X5(p,td% (x t)5% A!Use 'DefaultSymbols' instead Use 'DefaultLookup' instead ,% \%\\1111  \\,'Use 'Equivalent(X509Name, int)' instead \\'"Use 'Equivalent(X509Name)' instead \\A A 1AA11,,X %H  0 %d5\| (| --   I\tH< \lD ] a]$Use 'BagAttributeKeys' property  X p-8< 4    \xxDD$ @! \ D)DDDD|pDDDD DDDD Use Random property instead0hDDD    d) )%)0 )%    0 a]%\  % X, 8 )5 Never thrown     88 88A<@  X D  DDDDDDDDDT DDD ` `D        Use 'Salt' property instead 5*%Use 'IterationCount' property instead | , A%% Use X509Certificate instead% Use 'IdAAEtsSigPolicyID' instead(#Use 'IdAAEtsCommitmentType' instead(#Use 'IdAAEtsSignerLocation' instead&!Use 'IdAAEtsOtherSigCert' instead %.)Use 'AdjustedTimeString' property instead- (--D%\   @ 0\ \|\DD   A        d 3I\\,t |\ | |  T` D  DD      X @,\% \% \%+&Use ExtensionOids IEnumerable property# \% \% D  H5H A A D % AA 1  % %A%E 7\4\| >Y,D1|\,,|\E,\,,|\E,\|\E,\E,\ %%E%%  a a %] * 1 \ %  > \, \,  DL%% XH XH+x d<5p xl1 '  4x|\(t(D x   p p   |x 1111x 1 pp% p% 1p 1p72Use version with correct spelling 'OcspRespStatus' @ D D! DDDDDDDD  DDDDDDXl     !Use 'Value' property instead %,  %)%%% % % I1  %)%%pp%p% %6 D  %\DDDD&DDDDDDDDDD DDDDDDDDDDDD DDDDDDDDDD   DDDDDD    DDDDDDDD DDDDDDR$1DDDDDDDDD DDDDD1DDDD 1%     .DDD<DDDDDDDT     E)\%1,%5dd  8DDDDDDDDD %DP % % %6<dt <XDDDD DDD @1% ` )I\% %8|`h`%%& |`h` )p)%0  DD5    5i(\X4 1 1%pT   D  D ,D   5 xDDD5 D8\8<X3'l    , ,1t8X0 ) ( $"Use 'AreEqual' method instead |p 1111t 1 % % 1 1s=55555H5DDDD555  (#Use 'OutputStream' property instead'"Use 'InputStream' property instead DDDDDDD   X mqu  % 1%%  %\%, @,A    (, &    -(Use version that takes a 'byte' argumenth \  DD lH1 A % % 8%5l% 1l%l ,1, % DDDDDDDDDDlDDDD DDD DD,     0 A,8 XDD( p 8 pp)    1,1 %%|tl d &55  x    D<  DDA'DDDDDDDDDDD 4  H& Xp,%+(%d$ ,% %  % 8%)$Use TbsResponseData property instead,'Use SignatureAlgorithm property instead#Use Signature property insteadUse Certs property instead %%"AX%\% D A \"\H< \lDL"8@XLLLLL# 8\ @   % 99DDD D D      D  DDDD DDDDD DDDDDDDDD  DDD          DD         DD     ADDD DLL L P(DDDDDDDD' DDDDDDDDDDD DDDD *DDDDDDD       8\1DDDD1\1D1DDDD DDDDDD,2\|\|D(  %$The Legion of the Bouncy Castle#Bouncy Castle Cryptography APICopyright (C) 2000-2008TWrapNonExceptionThrows4 N  @ _CorDllMainmscoree.dll% 0HX 004VS_VERSION_INFO?DVarFileInfo$TranslationStringFileInfol000004b0` CompanyNameThe Legion of the Bouncy Castle,FileDescription 0FileVersion1.4.0.08 InternalNamecrypto.dllTLegalCopyrightCopyright (C) 2000-2008@ OriginalFilenamecrypto.dll`ProductNameBouncy Castle Cryptography API4ProductVersion1.4.0.08Assembly Version1.4.0.0 `<smuxi-1.1/lib/agsxmpp/agsxmpp/Id.cs0000644000175000017500000000617312204443225020112 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP { public enum IdType { /// /// Numeric Id's are generated by increasing a long value /// Numeric, /// /// Guid Id's are unique, Guid packet Id's should be used for server and component applications, /// or apps which very long sessions (multiple days, weeks or years) /// Guid } /// /// This class takes care anout out unique Message Ids /// public class Id { public Id() { } private static long m_id = 0; private static string m_Prefix = "agsXMPP_"; private static IdType m_Type = IdType.Numeric; public static IdType Type { get { return m_Type; } #if !CF // readyonly on CF1 set { m_Type = value; } #endif } #if !CF public static string GetNextId() { if (m_Type == IdType.Numeric) { m_id++; return m_Prefix + m_id.ToString(); } else { return m_Prefix + Guid.NewGuid().ToString(); } } #else // On CF 1.0 we have no GUID class, so only increasing numberical id's are supported // We could create GUID's on CF 1.0 with the Crypto API if we want to. public static string GetNextId() { m_id++; return m_Prefix + m_id.ToString(); } #endif /// /// Reset the id counter to agsXmpp_1 again /// public static void Reset() { m_id = 0; } /// /// to Save Bandwidth on Mobile devices you can change the prefix /// null is also possible to optimize Bandwidth usage /// public static string Prefix { get { return m_Prefix; } set { if (value == null) m_Prefix = ""; else m_Prefix = value; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC.suo0000644000175000017500000041400012204443225021730 0ustar00meebeymeebey00000000000000ࡱ> > ^tm%+$"8#.& '()*,-/0134567:9;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]b_`aicdefghjklnorsuvwxy{|}~Root Entry̧||IProjInfoExTaskListUserTasks$IVSMDPropertyBrowser**)  #"$^*+0./412K56789:;<=>C@ABWDEFGHIJLMNOPQRSTUV\YZ[]_`vwxy{|}~#\E5ϭݗ C Eigene BenutzersteuerelementeMy User ControlsDevice ControlsCrystal ReportsData XML Schema Dialog EditorMobile Web Forms Web Forms Components Windows FormsHTMLClipboard RingGeneraleinC:\Dokumente und EinstellungIVSMDDesignerService*IToolboxService 'DebuggerWatches DebuggerBreakpoints(6nauck\Eigene Dateien\Visual xD:\Programme\Microsoft Visual Studio .NET 2003\Vc7\crt\src\D:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\D:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\atl\C:\3\Vc7\atDebuggerExceptions& DebuggerFindSource& DebuggerFindSymbol& DebuggerMemoryWindows,T&Qͫ49F ͫ4|MultiStartupProj=;4{E236C510-8B5D-4F06-AD31-97900F72FCF4}.dwStartupOpt=;StartupProject=&{E236C510-8B5D-4F06-AD31-97900F72FCF4};A{E236C510-8B5D-ExternalFilesProjectContents:DocumentWindowPositions0b DocumentWindowUserData.SolutionConfiguration, z4F06-AD31-97900F72FCF4}.Release|Any CPU.fBatchBld=;?{E236C510-8B5D-4F06-AD31-97900F72FCF4}.Debug|Any CPU.fBatchBld=; ActiveCfg=Release|Any CPU;B62S$ A+HڪWLкX"E:cxS8fLd9LкX"E:cxJA)jKנRLкX"E:cxLQ c:\dokumente und einstellungen\gnauck\eigene dateien\visual sNSܾ M%кX"E:cxaagsXMPP_PPCM%кX"E:cxaagsXMPPtudio 2005\projects\agsxmpp_net2.0\agsxmpp\c:\dokumente und X p\agsxmpp\eien\programm$Bookmarks V001.01unk\agsxmpp\ECSP3^FB{blےx001.01unk\agsxmpp\ObjMgrContents!KClassViewContents$ProjExplorerState$FUnloadedProjects"otocol\iq\vcard\Photo.csC:en\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\ C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\V7 `Bungen\gnauck\eigene isual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\Properties\Resources.resxC:\Dokumente uTaskListShortcuts$%164B10B9-B200-11D0_ProjState:'VsToolboxService"I(ObjMgrContentsV8"Vzpq!\samples\VS2005\MiniClientWM5\frmLogin.csri mpp_Net2.0\saC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmMain.csǎ<,trunk\agsxmphC:\svn\ags\trunk\agsxmpp\protocol\sasl\Mechanism.cs|gTocXC:\svn\ags\trunk\agsxmpp\Xml\Dom\Element.csPцsm.cs VC:\svn\ags\trunk\agsxmpp\sasl\Mechanism.csup_Net2.0\agD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Jid.csb_Net2.0\agD:\Eigene Dateien\Visual StudioD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementType.csGC744A8-0E4A-4FC6-886A-0642 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodResponse.cs,p\rpc\MethodRespD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.csīl\iq\rpc\MethodCallD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs:b tory\ElementFactory.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\User.csV|protocol\x\muc\User.csV|D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Chatstate.cstbU hatstD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\html\Body.csiT xtensions\html\BZC:\svn\ags\trunk\agsxmpp\Xml\StreamParser.cs`nn\Visual jC:\svn\ags\trunk\agsxmpp\protocol\sasl\Mechanisms.cs oHiddenSlnFolders")OutliningStateDir$BookmarkState&(FAE04EC1-301F-11D3_ProjTrust:FAE04EC1-301F-11D3_ProjState: 2yOutliningState1 -XmlPackageOptions$+,QOutliningState2 ?OutliningState11"1ProjectDesigner aE6FDF8B0-F3D1-11D4_ProjState: 3OutliningState20".4|hC:\svn\ags\trunk\agsxmpp\Properties\AssemblyInfo.cs4yr_NVC:\svn\ags\trunk\agsxmpp\XmppConnection.csQ-cJ (-Gigene Dateien\Visual Studio 200^C:\svn\ags\trunk\agsxmpp\protocbC:\svn\ags\trunk\agsxmpp\XmppClientConnection.csV #6Idio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Plain\PlainMechanism.cs l Studio 2005\Pro C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.cs*Net2.0\agsxmpp\sC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Avatar.csNF :\Dokumente und EinsteC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.00\agsxmpp\XmppClientConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\SaslFactory.csZC:\svn\ags\trunk\agsxmpp\Xml\StreamParser.cshC:\svn\ags\trunk\agsxmpp\Properties\AssemblyInfo.csC:\Dokumente und Eins+hC:\svn\ags\trunk\agsxmpp\protocol\iq\vcard\Photo.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmLogin.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Open.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Avatar.cs'D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\User.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Plain\PlainMechanism.cs)jC:\svn\ags\trunk\agsxmpp\protocol\stream\Features.cs^C:\svn\agdio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step2.cs)]C:\Dokumente und Es5rn te und Einstellungen\C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BoshClientSocket.csOutliningState33"B?&OutliningState32"OutliningState31"=A$OutliningState36" C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bosh\Body.csȸ_ojects\agsxmp9_:und Einstellungen\igene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs%C:\Dokumente und Einstellungen\gnaC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Open.csSK trunk\agsxmpp\ C:\Dokumente und Einstellungen\s\trunk\agsxmpp\protocol\sasl\Auth.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step2.cs#VC:\svn\ags\trunk\agsxmpp\sasl\Mechanism.cs D:\Eigene Dateien\Visual Studio 2005\P\agsxmpp\net\PollClientSocket.csY cs C:\DokC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Failure.cC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Sturojects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.cs"D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Chatstate.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs%C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bosh\Body.cs!D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Jid.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.cs(C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Failure.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\RandomNumberGenerator.cs$fC:\svn\ags\trunk\agsxmpp\Factory\ElementFactory.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.tellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmVcard.csbC:\svn\ags\trunk\agsxmpp\XmppClientConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\html\Body.cs hC:\svn\ags\trunk\agsxmpp\protocol\sasl\Mechanism.cs |C:\svn\ags\trunk\agsxmpp\protocol\extensions\geoloc\GeoLoc.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmMain.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodResponse.cs XC:\svn\ags\trunk\agsxmpp\Xml\Dom\Element.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projectsgnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\RandomNumberGenerator.cs.05\Projects\agsxuck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bosh\Body.cs!D:\Eigene Dateien\Visu\agsxmpp_Net2.0\agsxmpp\net\BoshClientSocket.cs*VC:\svn\ags\trunk\agsxmpp\XmppConnection.csRC:\svn\ags\trunk\agsxmpp\Xml\Dom\Node.cs"C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\caps\Capabilities.cs&hC:\svn\ags\trunk\agsxmpp\protocol\client\Handler.csC:\Dokumente und Einstellungen\gnauck\Lokale Einstellungen\Temp\7zO257.tmp\Mechanism.csjC:\svn\ags\trunk\agsxmpp\protocol\sasl\Mechanisms.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementType.cs4674}123456k' lkl und einstellungen\gnauck\eigene dateien\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\protocol\iq\rpc\methodcall.cs||{A6C744A8-0E4A-4FC6BCSP6]O1ryGBSC{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\agsXMPP_PPC.csprojn|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\agsXMPP_PPC.csproj.user|f|BCSCRelease|Any CPU0TRACE;CF;STRINGPREPlibraryobj\Release\agsXMPP.dlllibraryGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\SaslFactory.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterPending.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\SharpZipBaseException.csGBLIuC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IqGrabber.csGBLIoC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Jid.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\ClientSocket.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Group.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Stanza.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_OutliningState37"CHOutliningState38"6OutliningState41"DOutliningState40" OutliningState39"EGOutliningState42" Net2.0\agsxmpp\protocol\component\Handshake.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Rule.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\Mode.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Actions.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\Failure.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ping\PingIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Delete.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\ags  xmpp\protocol\extensions\pubsub\owner\Purge.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Subscriptions.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\shim\Header.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoItem.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\search\SearchIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\version\VersionIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Data.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Invite.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\rosterx\RosterItem.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\RandomNumberGenerator.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\RNGCryptoServiceProvider.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Comment.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Response.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Stream.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Presence.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\Activate.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\ByteStream.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\ByteStreamIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Items.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Delete.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Subscribers.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Stanza.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\private\Private.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\Rpc.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\VcardIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Challenge.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Failure.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\compression\Compression.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Destroy.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Invitation.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\User.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Exceptions.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Deflater.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Inflater.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\BookmarkManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\caps\Capabilities.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Action.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Note.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Status.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\nickname\Nickname.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\Browse.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\BrowseItem.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\Service.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\search\SearchItem.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Reported.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Muc.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Plain\PlainMechanism.csGBLIuC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Enum.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Collections\BareJidComparer.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterHuffman.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\StringWriterWithEncoding.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BoshClientSocket.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Pointer.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\PresenceGrabber.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Message.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ping\Ping.csGBC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_NeECSPdokumente und einstellungen\gnnd Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmAddRoster.resxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmMain.resxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmMsg.resxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmChat.resxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.cs)ǜ.2EV[ijm~0\samples\VS2005\MiniClientWM5\frmSubscribe.resxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmLogin.resxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmVcard.resxHD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\CSCpp\Factory\ElementFactot2.0\agsxmpp\protocol\sasl\Mechanism.cskk4:\agsXMPP.protocol.sasl.Mechanism.MechanismTypebQ?SOLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Item.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Publish.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\agent\Agents.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\last\Last.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\oob\Oob.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Address.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Email.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\StatusCode.csGBLIuC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Hash.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Encoding.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\exceptions\RegisterException.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\InflaterDynHeader.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\InflaterHuffmanTree.csGBLIC:\Dokumente und C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Mechanism.csss@:@agsXMPP.protocol.sasl.Mechani6]O1rbQateien\Visual StudioEinstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\PresenceManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Presence.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\Storage.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\Url.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Open.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\PrN\]agtz}s Vol\sasl\Auth.cs^o \XmppCoRC:\svn\ags\trunk\agsxmpp\Xml\Dom\Node.cs#d t\Handler.cC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frojects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Access.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\AffiliationType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSubIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\BrowseIq.csGBLIC:\DoOutliningState27"68OutliningState22"<u&OutliningState23"57pOutliningState25";:nd Einstellungen\gnauck\Eigene "C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\caps\Capabilities.csGd Ein C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Stukumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Active.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Mechanism.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Delay.csGBLIuC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Date.csGBLIt     !"#C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\NFKC.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollingSocketException.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\ShowType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Error.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Paused.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\geoloc\GeoLocIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Purge.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Item.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Pending.csGBLIC:\Dokumente und :\svn\ags\trunk\agsxmpp\protocol\stream\Features.cs^C:\svn\ags\trunk\agsxmpp\protocol\sasl\Auth.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step2.cs#VC:\svn\ags\trunk\agsEinstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\si\SI.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\avatar\Avatar.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\avatar\AvatarIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\bind\Bind.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoInfo.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\last\LastIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Action.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Response.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\storage\Avatar.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\Register.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppComponentConnection.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\DecompositionMappings.csGBLIzC:\Dokumente und Einstellungen\gnauck\Eigene DahC:\svn\ags\trunk\agsxmpp\protocol\iq\vcard\Photo.csz^PrhC:\svn\ags\trunk\agsxmpp\protocol\client\Handler.cs ={gnmVcard.csE:;gsxmpp\XmppCojC:\svn\ags\trunk\agsxmpp\protocol\stream\Features.csDm5MufC:\svn\ags\trunk\agsxmpp\FactorOutliningState19"|OutliningState15"2/OutliningState17"03zOutliningState16"y\ElementFactory.csPT@ art|C:\svn\ags\trunk\agsxmpp\protocol\extensions\geoloc\GeoLoc.csR_}$<,suante und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Plain\PlainMechanism.cs)jCOutliningState13"(-|OutliningState12"jOutliningState14"&OutliningState18",z(xmpp\sasl\Mechanism.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.cs"D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Chatstate.csC:\Dokumente und Einstellungen\gnauck\EC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs ol\Base\Avatar.cs'C:\Dokumente und Einstellungen\gnauck\Lokale Einstellungen\Temp\7zO257.tmp\Mechanism.csמ2teien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.csGBLIyC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\PacketGrabber.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Item.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\filetransfer\File.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Data.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\msgreceipts\Received.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Configure.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\PubSub.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSubAction.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSubManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\SubscriptionState.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoItems.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Item.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\PrivacyManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\search\Search.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\tls\Failure.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Field.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Role.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Element.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\UTF8Encoding.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Collections\FullJidComparer.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementType.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\CombiningClass.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\DecompositionKeys.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\StringprepException.csGBLIyC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Enums.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\RosterItem.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Create.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Affiliate.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Subscription.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterItem.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodResponse.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\time\TimeIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Actor.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\rosterx\RosterX.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\DigestMD5Mechanism.csGBLIzC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Mechanism.csGBLIyC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\WinCeApi.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\NodeList.csGBLIxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\NS.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\exceptions\XmlRpcException.csGBLItC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\IDNA.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Checksums\Adler32.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\IQ.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Message.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\UdpSuccess.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\Compress.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\Compressed.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\html\Body.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneStatusType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\auth\Auth.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\PrivacyIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\version\Version.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Success.csGBLI}C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Avatar.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Item.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\vcard_update\VcardUpdate.csGBLIxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Node.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnectionState.csGBLInC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Id.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\NoResponseException.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Request.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Resolver.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Avatar.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\MessageType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\StreamHostUsed.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Composing.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Command.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\CompressionMethod.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneEvent.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\primary\Primary.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Configure.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Retract.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Unsubscribe.csGBLIC:\Dokumente und Einstellungen\gnauck\EigeOutliningState29"9>~OutliningState28"|OutliningState26"rOutliningState24"jne Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\time\Time.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Photo.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Abort.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Auth.csGBLIC:\Dokumente und EinstellungeOutliningState21"~OutliningState30"OutliningState35"@OutliningState34"(n\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\owner\OwnerIq.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Document.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\ElementList.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\BufferAggregate.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Token.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterConstants.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterEngine.csGBLIzC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\MessageGrabber.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\InvalidResponseException.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\IPConfigurationInformation.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\ResourceRecord.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Properties\AssemblyInfo.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Handler.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Action.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Amp.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Active.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Inactive.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\NoteType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\prOutliningState3 %XOutliningState9 &OutliningState7 $!OutliningState6 D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\SaslFactory.cs^0 smbQ?SOxmpp_einstellungen\gnauck\eigene dateien\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\cts\6]O1rryn\ags\trunk\agsxmpp\dol\iq\vcard\Photo.csC:BCSP6]O1ryn\ags\trunk\agsxmpp\protocol\iq\vcard\Photo.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2005\MiniClientWM5\frmLogin.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Open.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Avatar.cs'D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\User.cs C:\DokumeC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0otocol\extensions\ibb\Close.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Items.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Type.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\agent\Agent.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\List.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Organization.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\tls\StartTls.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Conference.csGBLIoC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Uri.csGBLIxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Text.csGBLI}C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\IDNAException.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Streams\OutputWindow.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Error.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\PresenceType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Iq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Log.csGBLIzC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Error.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\filetransfer\Range.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoIdentity.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoInfoIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Type.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\RegisterEventArgs.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\session\Session.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\session\SessionIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Mechanisms.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Decline.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\ContentToken.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Question.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Route.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\StorageIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\featureneg\FeatureNeg.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\html\Html.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Affiliations.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Event.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\PubSubIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Default.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\RpcIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\FieldTypes.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Affiliation.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\admin\Item.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\MucManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Anonymous\AnonymousMechanism.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Exceptions.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\PunycodeException.csGBLIwC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\RFC3454.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\PendingBuffer.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SocketConnectionType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Condition.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\StreamHost.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Gone.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\featureneg\FeatureNegIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\geoloc\GeoLoc.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\msgreceipts\Request.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Affiliation.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Affiliates.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Subscriber.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\agent\AgentsIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoItemsIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_NetOutliningState5  #OutliningState4 OutliningState8 OutliningState10""2.0\agsxmpp\protocol\iq\roster\Roster.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Name.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\FailureCondition.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\storage\AvatarIq.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Stream.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Event.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\History.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Item.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\SaslEventArgs.csGBLI}C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\DomLoader.csGBLIzC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppConnection.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\DirectionalElement.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\Conference.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneAction.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneStatus.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\auth\AuthIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\oob\OobIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\RuleManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\private\PrivateIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Vcard.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\Features.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\FieldContainer.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Value.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\admin\Admin.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\owner\Owner.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Status.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\SaslHandler.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Position.csGBLIzC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\Stringprep.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Streams\StreamManipulator.csGBLI}C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\SRVRecord.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Handler.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bosh\BoshType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Chatstate.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSub.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Subscribe.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Privacy.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\Delimiter.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Telephone.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\tls\Proceed.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Option.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\admin\AdminIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step2.csGBLI{C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\Composition.csGBLIxC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\Punycode.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Checksums\IChecksum.csGBLI~C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\RecordBase.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bosh\Body.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Base.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\ActionType.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Options.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\SubscribeOptions.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\shim\Headers.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\bind\BindIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoFeature.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\Register.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\RegisterIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\compression\Method.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step1.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\XGoogleToken\XGoogleTokenMechanism.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\StreamParser.csDELIGBLIgC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\System.dllGBLIiC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\mscorlib.dllGBLIkC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\System.Xml.dllGBLIlC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\System.Data.dllDELIGBLIiC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\mscorlib.dll mscorlibGBLIlC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\System.Data.dll System.DataGBLIgC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\System.dllSystemGBLIkC:\Programme\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v1.0\WindowsCE\System.Xml.dll System.XmlDELIDELIDELIDESCECSPC:\Dokumente und Einstellungen\gnasmuxi-1.1/lib/agsxmpp/agsxmpp/XmppComponentConnection.cs0000644000175000017500000002576412250206660024415 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Net; using agsXMPP.Xml.Dom; using agsXMPP.protocol; using agsXMPP.protocol.component; using agsXMPP.Xml; namespace agsXMPP { /// /// /// use this class to write components that connect to a Jabebr/XMPP server /// /// /// http://www.xmpp.org/extensions/xep-0114.html /// /// public class XmppComponentConnection : XmppConnection { // This route stuff is old undocumented jabberd(2) stuff. hopefully we can get rid of this one day // or somebody writes up and XEP public delegate void RouteHandler (object sender, Route r); private bool m_CleanUpDone; private bool m_StreamStarted; #region << Constructors >> /// /// Creates a new Component Connection to a given server and port /// public XmppComponentConnection() { m_IqGrabber = new IqGrabber(this); } /// /// Creates a new Component Connection to a given server and port /// /// host/ip of the listening server /// port the server listens for the connection public XmppComponentConnection(string server, int port) : this() { base.Server = server; base.Port = port; } /// /// Creates a new Component Connection to a given server, port and password (secret) /// /// host/ip of the listening server /// port the server listens for the connection /// password public XmppComponentConnection(string server, int port, string password) : this(server,port) { this.Password = password; } #endregion #region << Properties and Member Variables >> private string m_Password = null; private bool m_Authenticated = false; private Jid m_ComponentJid = null; private IqGrabber m_IqGrabber = null; public string Password { get { return m_Password; } set { m_Password = value; } } /// /// Are we Authenticated to the server? This is readonly and set by the library /// public bool Authenticated { get { return m_Authenticated; } } /// /// The Domain of the component. /// /// eg: jabber.ag-software.de /// /// public Jid ComponentJid { get { return m_ComponentJid; } set { m_ComponentJid = value; } } public IqGrabber IqGrabber { get { return m_IqGrabber; } set { m_IqGrabber = value; } } #endregion #region << Events >> // public event ErrorHandler OnError; /// /// connection is authenticated now and ready for receiving Route, Log and Xdb Packets /// public event ObjectHandler OnLogin; public event ObjectHandler OnClose; /// /// handler for incoming routet packtes from the server /// public event RouteHandler OnRoute; /// /// Event that occurs on authentication errors /// e.g. wrong password, user doesnt exist etc... /// public event XmppElementHandler OnAuthError; /// /// Stream errors <stream:error/> /// public event XmppElementHandler OnStreamError; /// /// Event occurs on Socket Errors /// public event ErrorHandler OnSocketError; /// /// /// public event IqHandler OnIq; /// /// We received a message. This could be a chat message, headline, normal message or a groupchat message. /// There are also XMPP extension which are embedded in messages. /// e.g. X-Data forms. /// public event MessageHandler OnMessage; /// /// We received a presence from a contact or chatroom. /// Also subscriptions is handles in this event. /// public event PresenceHandler OnPresence; #endregion public void Open() { _Open(); } /// /// /// /// /// public void Open(string server, int port) { this.Server = server; this.Port = port; _Open(); } private void _Open() { m_CleanUpDone = false; m_StreamStarted = false; if (ConnectServer == null) SocketConnect(base.Server, base.Port); else SocketConnect(this.ConnectServer, base.Port); } private void SendOpenStream() { // StringBuilder sb = new StringBuilder(); //sb.Append(""); sb.Append(""); Open(sb.ToString()); } private void Login() { // Send Handshake Send( new Handshake(this.m_Password, this.StreamId) ); } #region << Stream Parser events >> public override void StreamParserOnStreamStart(object sender, Node e) { base.StreamParserOnStreamStart (sender, e); m_StreamStarted = true; Login(); } public override void StreamParserOnStreamEnd(object sender, Node e) { base.StreamParserOnStreamEnd (sender, e); if(!m_CleanUpDone) CleanupSession(); } public override void StreamParserOnStreamElement(object sender, ElementEventArgs eventArgs) { base.StreamParserOnStreamElement (sender, eventArgs); var e = eventArgs.Element; if (e is Handshake) { m_Authenticated = true; if (OnLogin != null) OnLogin(this); if (KeepAlive) CreateKeepAliveTimer(); eventArgs.Handled = true; } else if (e is Route) { if (OnRoute != null) OnRoute(this, e as Route); eventArgs.Handled = true; } else if (e is protocol.Error) { protocol.Error streamErr = e as protocol.Error; switch (streamErr.Condition) { // Auth errors are important for the users here, so throw catch auth errors // in a separate event here case agsXMPP.protocol.StreamErrorCondition.NotAuthorized: // Authentication Error if (OnAuthError != null) OnAuthError(this, e as Element); break; default: if (OnStreamError != null) OnStreamError(this, e as Element); break; } eventArgs.Handled = true; } else if (e is Message) { if (OnMessage != null) { OnMessage(this, e as Message); eventArgs.Handled = true; } } else if (e is Presence) { if (OnPresence != null) { OnPresence(this, e as Presence); eventArgs.Handled = true; } } else if (e is IQ) { if (OnIq != null) { var iqEventArgs = new protocol.client.IQEventArgs((IQ)e); OnIq(this, iqEventArgs); if (iqEventArgs.Handled) { eventArgs.Handled = true; } } } } private void m_StreamParser_OnStreamError(object sender, Exception ex) { if(!m_CleanUpDone) CleanupSession(); } #endregion #region << ClientSocket Events >> public override void SocketOnConnect(object sender) { base.SocketOnConnect (sender); SendOpenStream(); } public override void SocketOnDisconnect(object sender) { base.SocketOnDisconnect (sender); if(!m_CleanUpDone) CleanupSession(); } public override void SocketOnError(object sender, Exception ex) { base.SocketOnError(sender, ex); if (m_StreamStarted && !m_CleanUpDone) CleanupSession(); if (OnSocketError != null) OnSocketError(this, ex); } #endregion public override void Send(Element e) { // this is a hack to not send the xmlns="jabber:component:accept" with all packets Element dummyEl = new Element("a"); dummyEl.Namespace = Uri.ACCEPT; dummyEl.AddChild(e); string toSend = dummyEl.ToString(); Send(toSend.Substring(35, toSend.Length - 35 - 4)); } private void CleanupSession() { // This cleanup has only to be done if we were able to connect and teh XMPP Stream was started DestroyKeepAliveTimer(); m_CleanUpDone = true; StreamParser.Reset(); m_IqGrabber.Clear(); if (OnClose!=null) OnClose(this); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Jid.cs0000644000175000017500000004035512652472053020274 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using System.Collections; using agsXMPP.Exceptions; using agsXMPP.Collections; #if STRINGPREP using agsXMPP.Idn; #endif namespace agsXMPP { /// /// Class for building and handling XMPP Id's (JID's) /// public class Jid : IComparable, IEquatable { /* 14 possible invalid forms of JIDs and some variations on valid JIDs with invalid lengths, viz: jidforms = [ "", "@", "@/resource", "@domain", "@domain/", "@domain/resource", "nodename@", "/", "nodename@domain/", "nodename@/", "@/", "nodename/", "/resource", "nodename@/resource", ] TODO Each allowable portion of a JID (node identifier, domain identifier, and resource identifier) MUST NOT be more than 1023 bytes in length, resulting in a maximum total size (including the '@' and '/' separators) of 3071 bytes. stringprep with libIDN m_User ==> nodeprep m_Server ==> nameprep m_Resource ==> resourceprep */ // !!! // use this internal variables only if you know what you are doing // !!! internal string m_Jid = null; internal string m_User = null; internal string m_Server = null; internal string m_Resource = null; /// /// Create a new JID object from a string. The input string must be a valid jabberId and already prepared with stringprep. /// Otherwise use one of the other constructors with escapes the node and prepares the gives balues with the stringprep /// profiles /// /// XMPP ID, in string form examples: user@server/Resource, user@server public Jid(string jid) { m_Jid = jid; Parse(jid); } /// /// builds a new Jid object /// /// XMPP User part /// XMPP Domain part /// XMPP Resource part public Jid(string user, string server, string resource) { #if !STRINGPREP if (user != null) { user = EscapeNode(user); m_User = user.ToLower(); } if (server != null) m_Server = server.ToLower(); if (resource != null) m_Resource = resource; #else if (user != null) { user = EscapeNode(user); m_User = Stringprep.NodePrep(user); } if (server != null) m_Server = Stringprep.NamePrep(server); if (resource != null) m_Resource = Stringprep.ResourcePrep(resource); #endif BuildJid(); } /// /// Parses a JabberId from a string. If we parse a jid we assume it's correct and already prepared via stringprep. /// /// jis to parse as string /// true if the jid could be parsed, false if an error occured public bool Parse(string fullJid) { string user = null; string server = null; string resource = null; try { if (fullJid == null || fullJid.Length == 0) { return false; } m_Jid = fullJid; int atPos = m_Jid.IndexOf('@'); int slashPos = m_Jid.IndexOf('/'); // some more validations // @... or /... if (atPos == 0 || slashPos == 0) return false; // nodename@ if (atPos + 1 == fullJid.Length) return false; // @/ at followed by resource separator if (atPos + 1 == slashPos) return false; if (atPos == -1) { user = null; if (slashPos == -1) { // JID Contains only the Server server = m_Jid; } else { // JID Contains only the Server and Resource server = m_Jid.Substring(0, slashPos); resource = m_Jid.Substring(slashPos + 1); } } else { if (slashPos == -1) { // We have no resource // Devide User and Server (user@server) server = m_Jid.Substring(atPos + 1); user = m_Jid.Substring(0, atPos); } else { // We have all user = m_Jid.Substring(0, atPos); server = m_Jid.Substring(atPos + 1, slashPos - atPos - 1); resource = m_Jid.Substring(slashPos + 1); } } if (user != null) this.m_User = user; if (server != null) this.m_Server = server; if (resource != null) this.m_Resource = resource; return true; } catch (Exception) { return false; } } internal void BuildJid() { m_Jid = BuildJid(m_User, m_Server, m_Resource); } private string BuildJid(string user, string server, string resource) { StringBuilder sb = new StringBuilder(); if (user != null) { sb.Append(user); sb.Append("@"); } sb.Append(server); if (resource != null) { sb.Append("/"); sb.Append(resource); } return sb.ToString(); } public override string ToString() { return m_Jid; } /// /// the user part of the JabberId. /// public string User { get { return m_User; } set { // first Encode the user/node string tmpUser = EscapeNode(value); #if !STRINGPREP if (value != null) m_User = tmpUser.ToLower(); else m_User = null; #else if (value != null) m_User = Stringprep.NodePrep(tmpUser); else m_User = null; #endif BuildJid(); } } /// /// Only Server /// public string Server { get { return m_Server; } set { #if !STRINGPREP if (value != null) m_Server = value.ToLower(); else m_Server = null; #else if (value != null) m_Server = Stringprep.NamePrep(value); else m_Server = null; #endif BuildJid(); } } /// /// Only the Resource field. /// null for none /// public string Resource { get { return m_Resource; } set { #if !STRINGPREP if (value != null) m_Resource = value; else m_Resource = null; #else if (value != null) m_Resource = Stringprep.ResourcePrep(value); else m_Resource = null; #endif BuildJid(); } } /// /// The Bare Jid only (user@server). /// public string Bare { get { return BuildJid(m_User, m_Server, null); } } #region << Overrides >> /// /// This compares the full Jid by default /// /// /// public override bool Equals(object obj) { return Equals(obj, new FullJidComparer()); } public override int GetHashCode() { int hcode = 0; if (m_User !=null) hcode ^= m_User.GetHashCode(); if (m_Server != null) hcode ^= m_Server.GetHashCode(); if (m_Resource != null) hcode ^= m_Resource.GetHashCode(); return hcode; } #endregion public bool Equals(object other, System.Collections.IComparer comparer) { if (comparer.Compare(other, this) == 0) return true; else return false; } /* public static bool operator !=(Jid jid1, Jid jid2) { return !jid1.Equals(jid2, new FullJidComparer()); } public static bool operator ==(Jid jid1, Jid jid2) { return jid1.Equals(jid2, new FullJidComparer()); } */ #region << implicit operators >> static public implicit operator Jid(string value) { if (value == null) { return null; } return new Jid(value); } static public implicit operator string(Jid jid) { if (jid == null) { return null; } return jid.ToString(); } #endregion #region IComparable Members public int CompareTo(object obj) { if (obj is Jid) { Jid jid = obj as Jid; FullJidComparer comparer = new FullJidComparer(); return comparer.Compare(obj, this); } throw new ArgumentException("object is not a Jid"); } #endregion #region IEquatable Members public bool Equals(Jid other) { FullJidComparer comparer = new FullJidComparer(); if (comparer.Compare(other, this) == 0) return true; else return false; } #endregion #region << XEP-0106: JID Escaping >> /// /// /// Escape a node according to XEP-0106 /// /// /// http://www.xmpp.org/extensions/xep-0106.html /// /// /// /// public static string EscapeNode(string node) { if (node == null) return null; StringBuilder sb = new StringBuilder(); for (int i = 0; i < node.Length; i++) { /* \20 " \22 & \26 ' \27 / \2f : \3a < \3c > \3e @ \40 \ \5c */ char c = node[i]; switch (c) { case ' ': sb.Append(@"\20"); break; case '"': sb.Append(@"\22"); break; case '&': sb.Append(@"\26"); break; case '\'': sb.Append(@"\27"); break; case '/': sb.Append(@"\2f"); break; case ':': sb.Append(@"\3a"); break; case '<': sb.Append(@"\3c"); break; case '>': sb.Append(@"\3e"); break; case '@': sb.Append(@"\40"); break; case '\\': sb.Append(@"\5c"); break; default: sb.Append(c); break; } } return sb.ToString(); } /// /// /// unescape a node according to XEP-0106 /// /// /// http://www.xmpp.org/extensions/xep-0106.html /// /// /// /// public static string UnescapeNode(string node) { if (node == null) return null; StringBuilder sb = new StringBuilder(); for (int i = 0; i < node.Length; i++) { char c1 = node[i]; if (c1 == '\\' && i + 2 < node.Length) { i += 1; char c2 = node[i]; i += 1; char c3 = node[i]; if (c2 == '2') { switch (c3) { case '0': sb.Append(' '); break; case '2': sb.Append('"'); break; case '6': sb.Append('&'); break; case '7': sb.Append('\''); break; case 'f': sb.Append('/'); break; } } else if (c2 == '3') { switch (c3) { case 'a': sb.Append(':'); break; case 'c': sb.Append('<'); break; case 'e': sb.Append('>'); break; } } else if (c2 == '4') { if (c3 == '0') sb.Append("@"); } else if (c2 == '5') { if (c3 == 'c') sb.Append("\\"); } } else sb.Append(c1); } return sb.ToString(); } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP2010.csproj0000644000175000017500000007766312204443225022247 0ustar00meebeymeebey00000000000000 Local 9.0.30729 2.0 {91EA0D0B-D3BA-497F-AFEB-2CAD59DEBA0E} Debug AnyCPU agsXMPP key.snk JScript Grid IE50 false Library agsXMPP OnBuildSuccess true 3.5 v2.0 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true bin\Net35\Debug\ false 285212672 false TRACE;DEBUG;SSL;STRINGPREP true 4096 false false false false false 4 full prompt bin\Net2\Release\ false 285212672 false TRACE;SSL;STRINGPREP bin\NET2\Release\agsXMPP.xml false 4096 false true false false false 4 none prompt System System.Data System.Drawing System.Windows.Forms System.XML Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code False .NET Framework Client Profile false False .NET Framework 2.0 %28x86%29 true False .NET Framework 3.0 %28x86%29 false False .NET Framework 3.5 false False .NET Framework 3.5 SP1 false smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC.csdproj.user0000644000175000017500000000420012204443225023540 0ustar00meebeymeebey00000000000000 smuxi-1.1/lib/agsxmpp/agsxmpp/changelog.txt0000644000175000017500000001732012204443225021713 0ustar00meebeymeebey00000000000000version 1.2 - added agsXMPP.protocol.x.muc.user.Destroy (see: http://forum.ag-software.de/forum.php?req=thread&postid=3663&nocount=1) - fixed a bug in clientsocket which can cause reconnect problems under some conditions - fixed Nickname bug in agsXMPP.protocol.extensions.bookmarks.Conference - added new constructor to XmppClientConnenction - added implicit operators to Jid class - fixed a race condition in Bosh - added NotModified error condition - added Errortext property to Error class - set type automatically to error when an error child gets added - fixed sasl DIGESTMD5 error with escaped jids - added some more generic functions to Element - AutoResolveConnectServer is true by default now - added GSSAPI SASL mechanism (only enterprise version) version 1.1 ============ - added TLS for Compact Framework - bugfix in clientsocket.cs which caused reconnect problems in some cases - some minor bugfixes version 1.0 ============ - added XEP-0153: vCard-Based Avatars - added bookmark storage XEP-0048 - added message receipts XEP-0184 - added XEP-0047: In-Band Bytestreams (IBB) - added a hack to not send xmlns="jabbe:client" with all stanzas - added AutoPresence Property. This sends the own presence in XmppClientConnection automatically after login. If you already send your presence after succesful login set AutoPresence to false or remove the SendMyPresence call - fixed a bug in agsXMPP.protocol.sasl.Mechamism - added SASL failure conditions (FailureConditions.cs) - fixed HasChildElements property in Element.cs - did some refactoring on Element.cs - added some members to Element - added Console Client example - fixed typos in DiscoManager.cs - updated caps to teh latest xep version, can create the new ver attrib automatically. - published first BOSH version. Interoperability only tested with ejabberd2 beta 1 - optimized Polling code - updated caps to the latest version of the XEP where caps versioning was changed. - added AMP - refactored and extended base classes version 0.95 ============ - many improvements and bugfixes - added more stuff to the MucManager version 0.93 ============ - improvements on socket errors - imporvements in resource binding. Leave resource empty and the server will asign a resource for you. - Added ClientName and ClientFeatures - Automatic response to DiscoInfo requests to clients version 0.93 ============ - improvements in XmppComponentConnection - improved Keep Alive logic - OnXmppErrorHandler -> XmppElementHandler - XmppElementHandler -> XmppStanzaHandler ??? - refactored IqHandler event public event (StreamHandler ==> IqHandler) - CreateNewThread member added for Messages - EscapeNode and Unescape Node in the Jid class is now static - added stringprep support and libidn# - fixes in jivesoftware phone stuff version 0.92 ============ - added XEP-0115 Entity Capabilities - added XEP-0106 JID Escaping - added XEP-0199 XMPP Ping - licence change version 0.91 ============ - fixed register account for servers which support only sasl Login - fixed a bug in ClientSocket.cs with the connect timeout timer - added X-GOOGLE-TOKEN authentication and Sasl mechanism This means you can connect also on PPC and Smartphone to GTalk, or without SSL/TLS with Desktop Edition to GTalk - added synchronous Packet Grabbing to the IqGrabber - added new enum for packetId types. Now you can use Guid's for packet ID's version 0.90 ============ - improved srv record handling - added nickname support (JEP-0172 User nickname) - imporoved filetransfer - fixed SASL to work with jabberd 1.4x - added disco manager - lots of minor changes and improvements version 0.81 ============ - minor changes and refactoring - added bytestream support version 0.80 ============ - added Ad-Hoc Commands - added pubsub - some minor changes and refactoring version 0.77 ============ - added privacy list support (XMPP Core) version 0.76 ============ - fixed a bug in XmppPacket (Error property) - fixed a bug in Register.cs - added Geoloc - started to add Jingle - small bugfix in event.cs - optimized the vcard code version 0.75 ============ - added MUC - Chatstates JEP-0085 - Added RPC JEP-0009 (Transporting XML-RPC over Jabber) - Added ElementList and changed all Select* functions that returned NodeList to the return value ElementList, because the NodeList messed up indexes version 0.71 ============ - added SASL ANONYMOUS - fixed a bug in Mechanism.cs (password was always lower case) version 0.70 ============ - 1st version of new roster control in agsXMPP.ui - stream compression - many improvements an minor bugfixes - some namespaces changed a bit because of VB .NET programmers - new version of Mono.Security.dll for .NET 1.1 included (see: http://bugzilla.ximian.com/show_bug.cgi?id=75687) version 0.65 ============ - renamed featues namespace to feature becuase of VB programmers that couldn't access it - added stream compression and stream compression classes version 0.63 ============ - added and to xdata (for xdata search) - fixed a entity bug in attributes (StreamParser.cs) version 0.62 ============ - added PresenceGrabber to XmppClientConnection - added a new overload to the Helper functions in PresenceManager version 0.61 ============ - Bugfix in Disco feature and identity version 0.60 ============ - switched to visual studio 2005 and .NET 2.0 - added SSL support for the build in SSL Stream in .NET 2.0 - added support for Jive Software Phone Extensions version 0.51 ============ - added BrowseItem class - changes in Browse to support historical service protocol - fixes in OnRosterStart and OnRosterEnd event version 0.50 ============ - changed parser to xpnet - added xdata classes and xdata controls - added PresenceManager - added RosterManager - added private xml storage (JEP-0049) - added nested roster groups (JEP-0083) - rewrote StreamParser.cs - rewrote ClientSocket.cs version 0.40 ============ - added Start-TLS Support - added Service Discovery (JEP-0030) - added RosterManager and PresenceManager for easier roster and presence managing - added x-conference version 0.35 ============ - added jabber:iq:register for registering new accounts on jabber/xmpp servers - fixed issues on mono version 0.34 ============ - minor changes in the xml classes - moved some classes to other namespaces because of vb problems (vb is not case sensitive) - created new project files for windows, ppc and smartphone - binaries are included too now version 0.33 ============ - switched from the Mono-Miniparser to my port of kxml, because the Miniparser cant read mixed content xml and text-only nodes version 0.32 ============ - made the xml parser more namespace correct - added separate classes for SearchItem and RosterItem (Item class is gone) - added Vcard and VcardIq - changed some namespaces version 0.31 ============ - small change in Iq.Query proprety - added server example - added console client exsample version 0.30 ============ - implemented stream features - implemented sasl protocol - sasl plain mechanism - sasl digest-md5 mechanism - sasl factory for plugging in new sasl mechanisms - resource binding - changed the xml parser ro the sax parser "MiniParser" - added MessageGrabber for message tracking - bugfixes version 0.27 ============ - fixes in message, iq and presence for jabberd2 version 0.26 ============ - added Error.cs, it handles the old legacy jabber errors and xmpp stanza errors - Bugfixes in Presence.cs and the parser version 0.25 ============ - added SSL Support using Mono.Security (Doesnt work in the CF) - created key file for signing the assembly - improvements to the DOM Parsersmuxi-1.1/lib/agsxmpp/agsxmpp/XmppConnection.cs0000644000175000017500000003275312250206660022526 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using System.Threading; using agsXMPP.Net; using agsXMPP.protocol.extensions.bosh; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.Idn; namespace agsXMPP { public delegate void XmlHandler (object sender, string xml); public delegate void ErrorHandler (object sender, Exception ex); public delegate void XmppConnectionStateHandler (object sender, XmppConnectionState state); /// /// abstract base class XmppConnection. /// public abstract class XmppConnection { private Timer m_KeepaliveTimer = null; #region << Events >> /// /// This event just informs about the current state of the XmppConnection /// public event XmppConnectionStateHandler OnXmppConnectionStateChanged; /// /// a XML packet or text is received. /// This are no winsock events. The Events get generated from the XML parser /// public event XmlHandler OnReadXml; /// /// XML or Text is written to the Socket this includes also the keep alive packages (a single space) /// public event XmlHandler OnWriteXml; public event ErrorHandler OnError; /// /// Data received from the Socket /// public event BaseSocket.OnSocketDataHandler OnReadSocketData; /// /// Data was sent to the socket for sending /// public event BaseSocket.OnSocketDataHandler OnWriteSocketData; #endregion #region << Constructors >> public XmppConnection() { InitSocket(); // Streamparser stuff m_StreamParser = new StreamParser(); m_StreamParser.OnStreamStart += new StreamHandler(StreamParserOnStreamStart); m_StreamParser.OnStreamEnd += new StreamHandler(StreamParserOnStreamEnd); m_StreamParser.OnStreamElement += StreamParserOnStreamElement; m_StreamParser.StreamElementNotHandled += StreamParserStreamElementNotHandled; m_StreamParser.OnStreamError += new StreamError (StreamParserOnStreamError); m_StreamParser.OnError += new ErrorHandler (StreamParserOnError); } public XmppConnection(agsXMPP.Net.SocketConnectionType type) : this() { m_SocketConnectionType = agsXMPP.Net.SocketConnectionType.Direct; } #endregion #region << Properties and Member Variables >> private int m_Port = 5222; private string m_Server = null; private string m_ConnectServer = null; private string m_StreamId = ""; private string m_StreamVersion = "1.0"; private XmppConnectionState m_ConnectionState = XmppConnectionState.Disconnected; private BaseSocket m_ClientSocket = null; private StreamParser m_StreamParser = null; private SocketConnectionType m_SocketConnectionType = SocketConnectionType.Direct; private bool m_AutoResolveConnectServer = true; private int m_KeepAliveInterval = 120; private bool m_KeepAlive = true; /// /// The Port of the remote server for the connection /// public int Port { get { return m_Port; } set { m_Port = value; } } /// /// domain or ip-address of the remote server for the connection /// public string Server { get { return m_Server; } set { #if !STRINGPREP if (value != null) m_Server = value.ToLower(); else m_Server = null; #else if (value != null) m_Server = Stringprep.NamePrep(value); else m_Server = null; #endif } } /// /// /// public string ConnectServer { get { return m_ConnectServer; } set { m_ConnectServer = value; } } /// /// the id of the current xmpp xml-stream /// public string StreamId { get { return m_StreamId; } set { m_StreamId = value; } } /// /// Set to null for old Jabber Protocol without SASL andstream features /// public string StreamVersion { get { return m_StreamVersion; } set { m_StreamVersion = value; } } public XmppConnectionState XmppConnectionState { get { return m_ConnectionState; } } /// /// Read Online Property ClientSocket /// returns the SOcket object used for this connection /// public BaseSocket ClientSocket { get { return m_ClientSocket; } } /// /// the underlaying XMPP StreamParser. Normally you don't need it, but we make it accessible for /// low level access to the stream /// public StreamParser StreamParser { get { return m_StreamParser; } } public SocketConnectionType SocketConnectionType { get { return m_SocketConnectionType; } set { m_SocketConnectionType = value; InitSocket(); } } public bool AutoResolveConnectServer { get { return m_AutoResolveConnectServer; } set { m_AutoResolveConnectServer = value; } } /// /// /// the keep alive interval in seconds. /// Default value is 120 /// /// /// Keep alive packets prevent disconenct on NAT and broadband connections which often /// disconnect if they are idle. /// /// public int KeepAliveInterval { get { return m_KeepAliveInterval; } set { m_KeepAliveInterval = value; } } /// /// Send Keep Alives (for NAT) /// public bool KeepAlive { get { return m_KeepAlive; } set { m_KeepAlive = value; } } #endregion #region << Socket handers >> public virtual void SocketOnConnect(object sender) { DoChangeXmppConnectionState(XmppConnectionState.Connected); } public virtual void SocketOnDisconnect(object sender) { } public virtual void SocketOnReceive(object sender, byte[] data, int count) { if (OnReadSocketData != null) OnReadSocketData(sender, data, count); // put the received bytes to the parser lock (this) { StreamParser.Push(data, 0, count); } } public virtual void SocketOnError(object sender, Exception ex) { } #endregion #region << StreamParser Events >> public virtual void StreamParserOnStreamStart (object sender, Node e) { string xml = e.ToString().Trim(); xml = xml.Substring(0, xml.Length - 2) + ">"; this.FireOnReadXml(this, xml); protocol.Stream st = (protocol.Stream)e; if (st != null) { m_StreamId = st.StreamId; m_StreamVersion = st.Version; } } public virtual void StreamParserOnStreamEnd (object sender, Node e) { Element tag = e as Element; string qName; if (tag.Prefix == null) qName = tag.TagName; else qName = tag.Prefix + ":" + tag.TagName; string xml = ""; this.FireOnReadXml(this, xml); } public virtual void StreamParserStreamElementNotHandled(object sender, UnhandledElementEventArgs eventArgs) { } public virtual void StreamParserOnStreamElement(object sender, ElementEventArgs e) { this.FireOnReadXml(this, e.Element.ToString()); } public virtual void StreamParserOnStreamError (object sender, Exception ex) { } public virtual void StreamParserOnError (object sender, Exception ex) { FireOnError(sender, ex); } #endregion internal void DoChangeXmppConnectionState(XmppConnectionState state) { m_ConnectionState = state; if (OnXmppConnectionStateChanged!=null) OnXmppConnectionStateChanged(this, state); } private void InitSocket() { if (m_ClientSocket != null) { m_ClientSocket.OnConnect -= SocketOnConnect; m_ClientSocket.OnDisconnect -= SocketOnDisconnect; m_ClientSocket.OnReceive -= SocketOnReceive; m_ClientSocket.OnError -= SocketOnError; } m_ClientSocket = null; // Socket Stuff if (m_SocketConnectionType == agsXMPP.Net.SocketConnectionType.HttpPolling) m_ClientSocket= new PollClientSocket(); else if (m_SocketConnectionType == agsXMPP.Net.SocketConnectionType.Bosh) m_ClientSocket = new BoshClientSocket(this); else m_ClientSocket = new ClientSocket(); m_ClientSocket.OnConnect += SocketOnConnect; m_ClientSocket.OnDisconnect += SocketOnDisconnect; m_ClientSocket.OnReceive += SocketOnReceive; m_ClientSocket.OnError += SocketOnError; } /// /// Starts connecting of the socket /// public virtual void SocketConnect() { DoChangeXmppConnectionState(XmppConnectionState.Connecting); ClientSocket.Connect(); } public void SocketConnect(string server, int port) { ClientSocket.Address = server; ClientSocket.Port = port; SocketConnect(); } public void SocketDisconnect() { m_ClientSocket.Disconnect(); } /// /// Send a xml string over the XmppConnection /// /// public void Send(string xml) { FireOnWriteXml(this, xml); m_ClientSocket.Send(xml); if (OnWriteSocketData != null) OnWriteSocketData(this, Encoding.UTF8.GetBytes(xml), xml.Length); // reset keep alive timer if active to make sure the interval is always idle time from the last // outgoing packet if (m_KeepAlive && m_KeepaliveTimer != null) m_KeepaliveTimer.Change(m_KeepAliveInterval * 1000, m_KeepAliveInterval * 1000); } /// /// Send a xml element over the XmppConnection /// /// public virtual void Send(Element e) { Send(e.ToString()); } public void Open(string xml) { Send(xml); } /// /// Send the end of stream /// public virtual void Close() { Send(""); } protected void FireOnReadXml(object sender, string xml) { if (OnReadXml != null) OnReadXml(sender, xml); } protected void FireOnWriteXml(object sender, string xml) { if (OnWriteXml != null) OnWriteXml(sender, xml); } protected void FireOnError(object sender, Exception ex) { if (OnError != null) OnError(sender, ex); } #region << Keepalive Timer functions >> protected void CreateKeepAliveTimer() { // Create the delegate that invokes methods for the timer. TimerCallback timerDelegate = new TimerCallback(KeepAliveTick); int interval = m_KeepAliveInterval * 1000; // Create a timer that waits x seconds, then invokes every x seconds. m_KeepaliveTimer = new Timer(timerDelegate, null, interval, interval); } protected void DestroyKeepAliveTimer() { if (m_KeepaliveTimer == null) return; m_KeepaliveTimer.Dispose(); m_KeepaliveTimer = null; } private void KeepAliveTick(Object state) { // Send a Space for Keep Alive Send(" "); } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP2008_CF35.csproj0000644000175000017500000005754412204443225022772 0ustar00meebeymeebey00000000000000 Debug AnyCPU 9.0.30729 2.0 {A9D8FFC4-53FB-4750-BDA6-BCC0EC4B4E3C} Library Properties agsXMPP agsXMPP {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 agsXMPP_PPC_20 v3.5 true key.snk 2.0 Pocket PC 2003 true full false bin\CF35\Debug\ TRACE;DEBUG;CF_2;STRINGPREP true true prompt 512 4 Off pdbonly true bin\CF35\Release\ TRACE;CF_2;STRINGPREP;BCCRYPTO true true prompt 512 4 Off bin\CF35\Release\agsXMPP.xml Code Code False .\crypto.dll smuxi-1.1/lib/agsxmpp/agsxmpp/agsXMPP_PPC_20.suo0000644000175000017500000037300012204443225022235 0ustar00meebeymeebey00000000000000ࡱ> {q  u\a1/! "#$%&'()*+,.402356789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[^]_`dbcoefghijklmnvprstwxyz|}~Root Entry!CProjInfoEx164B10B9-B200-11D0_ProjState:TaskListUserTasks$8 /<!"#G)2*+,.0H1345689:C=>?@ABDEFNMJKLOPQRTUWXzZ[\^_`cdeghiklmopqstuwxy}~#\E5ϭݗ ECSPC zD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\D:\DateVsToolboxService">DebuggerWatches  DebuggerBreakpoints( DebuggerExceptions&fC:\Programme\Microsoft Visual Studio 8\VC\crt\src\tC:\Programme\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\tC:\Programme\Microsoft Visual Studio 8\VC\atlmfc\src\atl\tC:\Programme\Microsoft Visual Studio 8\VC\aDebuggerFindSource& DebuggerFindSymbol&DebuggerMemoryWindows,TExternalFilesProjectContents:tlmfc\include\D:\ >ͫ4ͫ43MultiStartupProj=;4{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.dwStartupOpt=;A{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.ReleDocumentWindowPositions01cDocumentWindowUserData.SolutionConfiguration,ObjMgrContentsV8"Vase|Any CPU.fBatchBld=;?{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}.Debug|Any CPU.fBatchBld=;4{A25AA758-756E-4522-9EDD-5F9A5225BDFC}.dwStartupOpt=;StartupProject=&{A25AA758-756E-S$ A+HڪWLкX"E:cxS8fLd9LкX"E:cxS8fLd9LrJA)jKנRLQ zd:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\n$Bookmarks V001.01\Visual StudX kmarks V001.01\Visual StudC:\Dokumente und Einstellungen\3^FB{blXZnu"E_R%ClassViewContents$ProjExplorerState$ |UnloadedProjects"<HiddenSlnFolders"OutliningStateDir$ BookmarkState$(TaskListShortcuts$%FAE04EC1-301F-11D3_ProjTrust:6FAE04EC1-301F-11D3_ProjState:z"ProjectDesigner '"XmlPackageOptions$(OutliningState10"*xjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samgnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeFactory.cs=h@ 159=rojects\agsxmpp_Net2.0\aC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2B ͫ4K[ ͫ4*ͫ4225BDFC}.Debug|Any CPU.fBatchBld=; ActiveCfg= Debug|Any CPU;U;e.cs||{A6C744A8-0E4A-4FC6-gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeListFactory.csagsxmpp_Net2.0\samples\MiniCliet\d:\daten\visual studio 2.(ͫ4nͫ4D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs:b csD:\Eigene Dateienͫ4CDB}|agsXMPP_PPC_20.csproj005\projects\agsxmpp_net2.0\samples\vs2008\miniclientwm5\d:\daten\visual studio 2005\projects\agsxmpp_net2.0\samples\vs2008\miniclientwm5\properties\1-D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SslStream.csK:\Eigene D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\netn\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SynchronousAsyncResult.cs(D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\StreamParser.csC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNamespaces.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\Features.cs!D:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\samples\MiniClie\agsxmpp\net\CertificateVerifier.cslrc\XmlNodeFactorygnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\Features.csc005\Projects\REL_Net2.0\samples\MiniClientCF\Form1.csC:\Dokumente und Einste*D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\ClientSocket.cs%D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\InvalidResponseException.csD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\SaslHandler.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\CertificateVerifier.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.cs#C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoFeature.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Properties\AssemblyInfo.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Program.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Photo.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Form1.csC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeFactory.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmLogin.cs'D:\Eigene Dateien\Visual Studio 20BCSP3^FB{blۢGBSCRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\agsXMPP_PPC_20.csprojLSWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\agsXMPP_PPC_20.csproj.userDfBCSCDebug|Any CPUfull%TRACE;DEBUG;CF_2;STRINGPREP;BCCRYPTO 1701;1702promptlibraryobj\Debug\agsXMPP.dlllibraryGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Resolver.csGBLIQD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\SRVRecord.csGBLIMD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SslStream.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\DirectionalElement.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protoc05\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Element.csD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\net\ClientSocket.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\ClientSocket.cs D:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.cs&D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmAddRoster.cs$D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\NoResponseException.csD:\Dateol\component\Route.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\html\Body.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Item.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Delete.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\agent\AgentsIq.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoItem.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoItemsIq.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\oob\OobIq.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\PrivacyIq.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\search\SearchIq.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\tls\Failure.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Value.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Actor.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Status.csGBLILD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\NS.csGBLIND:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\Stringprep.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterEngine.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Request.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SocketConnectionType.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SynchronousAsyncResult.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Command.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\msgreceipts\Received.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Pending.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Purge.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSubManager.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\oob\Oob.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\private\Private.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Challenge.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\Features.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\FieldContainer.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Document.csGBLILD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Node.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\BufferAggregate.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\To\agsxmpp\protocol\iq\disco\DiscoFeature.cs^ pp_Net2.0\agD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Element.csV\c`5\Projects\agsxmpp_Net2.0\agD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2ken.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Deflater.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Inflater.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocllungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeFactory.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmLogin.cs'D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Element.csD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agisual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\samples\MiniClientCF\Form1.resxet2.0\agsxmpp\nsxmpp\net\ClientSocket.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpntCF\Program.csC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeListFactory.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Form1.Designer.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\SaslHandler.csD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\samples\MiniClientCF\Form1.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnectionState.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Enum.cs D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agol\Base\Avatar.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Item.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Message.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Handler.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Close.csGBLIrD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneAction.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Publish.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\shim\Headers.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\compression\Method.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Item.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\vcard_update\VcardUpdate.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Collections\BareJidComparer.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\CombiningClass.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\InflaterHuffmanTree.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\StringWriterWithEncoding.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\PresenceType.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Condition.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\caps\Capabilities.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\Compress.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\geoloc\GeoLoc.csGBLIrD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneStatus.csGBLIvD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneStatusType.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\nickname\Nickname.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\primary\Primary.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Item.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Items.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoFeature.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoInfoIq.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoManager.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\session\SessionIq.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Email.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Response.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Invite.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Anonymous\AnonymousMechanism.csGBLILD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Text.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementType.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterPending.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Question.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\IQ.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Presence.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\Storage.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\ByteStream.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Composing.csGBLIkD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\featureneg\FeatureNegIq.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\html\Html.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\BrowseIq.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Failure.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Mechanism.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\storage\Avatar.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\storage\AvatarIq.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Event.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\owner\OwnerIq.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\MucManager.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Role.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Exceptions.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\UTF8Encoding.csGBLIKD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\RFC3454.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Streams\OutputWindow.csGBLICD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Jid.csGBLImD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\BookmarkManager.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bosh\BoshType.csGBLIkD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Affiliates.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\PubSub.csGBLIkD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Subscriber.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSub.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSubAction.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Type.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\avatar\AvatarIq.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoIdentity.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoInfo.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\last\LastIq.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\PrivacyManager.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Stanza.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\Roster.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodCall.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Auth.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Stream.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\admin\Item.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\SaslHandler.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppComponentConnection.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\StringprepException.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\PendingBuffer.csGBLIID:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IqGrabber.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\CertificateVerifier.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Presence.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Gone.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Paused.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\filetransfer\File.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Subscribe.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Subscription.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\Service.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\last\Last.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\private\PrivateIq.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\time\TimeIq.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Reported.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\admin\Admin.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\owner\Owner.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Collections\FullJidComparer.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterHuffman.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\InflaterDynHeader.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.csGBLIqD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\CompressionMethod.csGBLIqD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\PhoneEvent.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\AffiliationType.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Purge.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Abort.csGBLIID:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Enum.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxm.0\Mvp.Xml-src-2.0\Common\v2\src\XmlPrefix.csT % ties\Asples\VS2008\MiniClientWM5\Properties\Resources.resx\D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Form1.resxkD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Properties\Resources.resxdD:\Eigene Dateien\VC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNamespaces.csc!1 teiC:\Dokumente und Einstellungen\4522-9EDD-5F9A5225BDFC};A{A25AA758-756E-4522-9EDD-5F9A5225BDFC}.Release|Any CPU.fBatchBld=;?{A25AA758-756E-4522-9EDD-5F9A5pp_Net2.0\agsxmpp\Xml\Dom\ElementList.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\StreamParser.csGBLIBD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Id.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\Composition.csGBLIHD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\NFKC.csGBLILD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\Punycode.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\ClientSocket.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\IPConfigurationInformation.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\ResourceRecord.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\pro\CertificateVerifier.cs_TD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppConnection.cs/-9 "'e dateien\visual studioD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csH쌐*.ARW`dux~D:\Eigene Dateien\Visual StudioD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\InvalidResponseException.csFzcs||{A6C744A8D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\NoResponseException.cs?_PPC_20.csproj|d:\D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Properties\AssemblyInfo.csh]4FC6-886A-064283054674D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agtocol\extensions\bosh\Body.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Retract.csGBLIkD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\SubscribeOptions.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\agent\Agents.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\bind\Bind.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\Register.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\Delimiter.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\version\Version.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\Register.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\tls\Proceed.csGBLIID:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Hash.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\SharpZipBaseException.csGBLIND:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\NoResponseException.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Response.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Properties\AssemblyInfo.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\Handler.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\MessageType.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\ShowType.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Log.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Amp.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Rule.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\Conference.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\Mode.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Inactive.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Actions.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Note.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Base.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Active.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\RuleManager.csGBLIWD:\Daten\Visual Studio 2005\Projects\sxmpp\net\ClientSocket.cs . roj|d:\eigene dD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Program.cs9+886A-064283054674}123456ӶD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Form1.csl CF.csproj|d:\eigene dateienD:\Eigene Dateien\Visual StudiD:\Daten\Visual Studio 2005\ProD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Photo.csjects\agsxmpp_Net2.0\agsxmpp\net\SynchronousAsyncResult.cs3@ ck\Eigene Dateien\Visual StuD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.cs*RLQ_`djyNet2.0\agsxmne Dateien\Visual StudD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmLogin.csR}( s\agsxmpp_Net2.0\agsxmpp\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\ClientSocket.csw7 4erties\AssemblyInfC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0C:\DOKUME~1\gnauck\LOKALE~1\Temp\2440$System.dll$2.0.0.0\System.Net.Sockets.Socket.csfT:  !"#$%&'()*+,-./0123456OutliningState8 !YOutliningState7 ]OutliningState3 "bOutliningState2 fagsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Photo.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\VcardIq.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\version\VersionIq.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Field.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Decline.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Invitation.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\rosterx\RosterItem.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step2.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\SaslEventArgs.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Comment.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\ContentToken.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\DecompositionKeys.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Streams\StreamManipulator.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollingSocketException.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmp-p_Net2.0\agsxmpp\protocol\Base\Stanza.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Error.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Handshake.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\StorageIq.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Active.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\chatstates\Chatstate.csGBLIiD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\featureneg\FeatureNeg.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Affiliate.csGBLIiD:\DOutliningState1 jOutliningState9 nOutliningState6 #rOutliningState4 vaten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\PubSubIq.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\agent\Agent.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\pr\agsxmpp\XmppClientConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csdt#*.ARWefiz}Projects\agsxmpp_Net2.0\aD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\SaslHandler.cs N .0\agsxmpp\Properties\AsD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\net\ClientSocket.cs. +DateiD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Notocol\iq\browse\Browse.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\browse\BrowseItem.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Action.csGBLIQD:\Daten\Visual Studio 2005\Projects\et2.0\samples\MiniClientCF\Form1.csJO Studio 2005\ProjectD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\samples\MiniClientCF\Program.cs9+agsxmpp\Xml\Dom\EO"%9LQ_`djyC:\Dokumente und EOutliningState14"(%OutliningState16"&+aOutliningState15"OutliningState13"D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\StreamParser.csL_oC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Stu 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnectionState.csogsXMPP_PPC_20.csprojagsxmpp_Net2.0\agsxmpp\protocol\x\Avatar.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\iq\admin\AdminIq.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step1.csGBLIND:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Mechanism.csGBLIID:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Date.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Position.csGBLIHD:\Daten\Visual Studio 2005\Projects\aD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\SaslHandler.cs N D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.csE igene dateien\visual studD:\Eigene Dateien\Visual StudioOutliningState12")'OutliningState11"IOutliningState18"$OutliningState17"| 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\Enum.csNdio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Stanza.csellungen\gnauck\EigeneC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0gsxmpp_Net2.0\agsxmpp\Idn\IDNA.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Checksums\Adler32.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\RecordBase.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Stream.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bookmarks\Url.csGBLIlD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\ByteStreamIq     .csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\UdpSuccess.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\NoteType.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\Compressed.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Access.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Affiliations.csGBLIlD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Subscribers.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Unsubscribe.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\si\SIIq.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\auth\Auth.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Item.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\RegisterIq.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\MethodResponse.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\search\SearchItem.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\session\Session.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Address.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Name.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Success.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Data.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\History.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Item.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\rosterx\RosterX.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\Plain\PlainMechanism.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Exceptions.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\exceptions\XmlRpcException.csGBLIND:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\MessageGrabber.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Pointer.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\PresenceGrabber.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\RosterItem.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Message.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Action.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\msgreceipts\Request.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ping\Ping.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ping\PingIq.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\owner\Configure.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Subscriptions.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\shim\Header.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Default.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\RegisterEventArgs.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\time\Time.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Delay.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\StatusCode.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\exceptions\RegisterException.csGBLIQD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\IDNAException.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\DeflaterConstants.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BoshClientSocket.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\InvalidResponseException.csGBLIhD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\Activate.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\commands\Status.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\filetransfer\Range.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Items.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extens008\MiniClientWM5\frmAddRoster.csLEigene Dateien\Visualpp\protocol\iq\vcard\Photo.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.cs/ s\agsxmpp_Net2.0\agC:\Dokumente und Einstellungen\ions\si\SI.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\auth\AuthIq.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\tls\StartTls.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\Conference.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\Option.csGBLIMD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\PacketGrabber.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\OutliningState19"0OutliningState21",.OutliningState22"OutliningState23"-protocol\client\Error.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\component\Iq.csGBLIND:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Error.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\amp\Action.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Open.csGBLIqD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\jivesoftware\phone\ActionType.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Affiliation.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Create.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Event.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\avatar\Avatar.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\List.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\search\Search.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Organization.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Vcard.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\DigestMD5Mechanism.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\SaslFactory.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\DecompositionMappings.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\IO\Compression\Checksums\IChecksum.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Group.csGBLInD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\StreamHostUsed.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\ibb\Data.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Configure.csGBLIbD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\Options.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\PubSubIq.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Privacy.csGBLI`D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterManager.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\Rpc.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\rpc\RpcIq.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Telephone.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Muc.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\XGoogleToken\XGoogleTokenMechanism.csGBLICD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Uri.csGBLIQD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\DomLoader.csGBLIOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Element.csGBLIPD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\NodeList.csGBLITD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csGBLIUD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Idn\PunycodeException.csGBLIMD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\Enums.csGBLI_D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\client\PresenceManager.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\bytestreams\StreamHost.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\compression\Failure.csGBLIcD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\geoloc\GeoLocIq.csGBLIgD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\event\Delete.csGBLIlD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\pubsub\SubscriptionState.csGBLIWD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\bind\BindIq.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoItems.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\privacy\Type.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterIq.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterItem.csGBLI^D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\FailureCondition.csGBLIXD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\sasl\Mechanisms.csGBLIoD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\compression\Compression.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\data\FieldTypes.csGBLIZD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Affiliation.csGBLIVD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\Destroy.csGBLISD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\x\muc\User.csGBLIMD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\util\WinCeApi.csGBLIRD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\xpnet\Encoding.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnectionState.csGBLIND:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppConnection.csDELIGBLIOC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dllGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Drawing.dllGBLINC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dllGBLILC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dllGBLIGD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\crypto.dllGBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllDELIGBLIGD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\crypto.dllcryptoGBLILC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dll mscorlibGBLIOC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll System.DataGBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllSystemGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Drawing.dllSystem.DrawingGBLINC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dll System.XmlDELIDELIDELIDESCBCSPXZnu"E_R%GBSCfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\MiniClientWM5.csprojXpgkD:\Daten\Visual Studio 2005\Projects\agsMiniClient.frmLogin.mnuLogin_Click(object sender, System.EventArgs e)bQ?SOD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.cs[ [1:agsXMPP.XmppClientConnection.StreamParserOnStreamElement(object sender, Node e)+bQ?SOobj\Release\MiniClient.exegsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs D:\Eigene Datsxmpp\net\CertificateVerifier.cs"C:\DOKUME~1\gnauck\LOKALE~1\Temp\2440$System.dll$2.0.0.0\System.Net.Sockets.Socket.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csdyL lkld{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}|agsXMPP_PPC_20.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\net\sslstream.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}12yL lkl~{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}|agsXMPP_PPC_20.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\net\synchronousasyncresult.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}%^ lkl{00000000-0000-0000-0000-000000000000}|<Solution>|MiniClientWM5||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|1234 lkl{A25AA758-756E-4522-9EDD-5F9A5225BDFC}|..\samples\VS2008\MiniClientWM5\MiniClientWM5.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\samples\vs2008\miniclientwm5\frmlogin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}1234yL lklr{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}|agsXMPP_PPC_20.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\xmppclientconnection.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}1234r lklj{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}|agsXMPP_PPC_20.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\net\clientsocket.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}1234r lkl{A25AA758-756E-4522-9EDD-5F9A5225BDFC}|..\samples\VS2008\MiniClientWM5\MiniClientWM5.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\samples\vs2008\miniclientwm5\frmaddroster.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}12349, lkl{00000000-0000-0000-0000-000000000000}|<Solution>|agsXMPP_PPC_20||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|12r lklf{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}|agsXMPP_PPC_20.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\net\basesocket.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}yL lklx{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}|agsXMPP_PPC_20.csproj|d:\daten\visual studio 2005\projects\agsxmpp_net2.0\agsxmpp\net\certificateverifier.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}123456amework\v2.0\WindowsCE\System.Data.dll System.DataGBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllSystemGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindoC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlPrefix.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\SslStream.cs)C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Stanza.cs02promptwinexeobj\Debug\MiniClient.exewinexe>C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\bin\hiDPI.resGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\MiniClientWM5.csproj.userҲ?>WJBCSCDebug|Any CPUfullDEBUG;TRACE;PocketPC 1701;1702promptwinexeobj\Debug\MiniClient.exewinexe>C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\bin\hiDPI.resGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmLogin.Designer.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmMain.Designer.csGBLIfD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmVcard.Designer.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmMain.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmVcard.csGBLIdD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmMsg.Designer.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmSubscribe.Designer.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmSubscribe.csGBLIrD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\Properties\Resources.Designer.csGBLI[D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmMsg.csGBLIlD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\Properties\AssemblyInfo.csGBLI\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmChat.csGBLIeD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmChat.Designer.csGBLIjD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmAddRoster.Designer.csGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\Util.csGBLIaD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmAddRoster.csGBLI]D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmLogin.csDELIGBLIOC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dllGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Drawing.dllGBLINC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dllGBLILC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dllGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\bin\PPC_20\Debug\agsXMPP.dll'{33BAFD81-945E-46CF-A6E1-42CB7B626CDB}GBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllGBLIXC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Windows.Forms.dllDELIGBLIYD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\bin\PPC_20\Debug\agsXMPP.dllagsXMPP_PPC_20GBLILC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dll mscorlibGBLIOC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll System.DataGBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllSystemGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Drawing.dllSystem.DrawingGBLIXC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Windows.Forms.dllSystem.Windows.FormsGBLINC:\Programme\Microsoft.NET\SDK\CompactFramp\net\BaseSocket.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\an\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\VS2008\MiniClientWM5\frmLogin.csB B+:gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0ECSP0\agsxmpp\protocol\client\D:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.csqLi ual Studio 2005\Projects\agsxmpp C:\Dokumente und Einstellungen\ework\v2.0\WindowsCE\System.Xml.dll System.XmlDELIDELIDELIDESCECSPRELEASE_agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csD:\Daten\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.cs&D:\Eigene Dateien\Visual Studio 2005\Projects\agsxOutliningState41"SOutliningState34"CVOutliningState40"?{OutliningState38"B@OutliningState39"OutliningState37"OutliningState36"=AOutliningState35":\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\extensions\shim\Headers.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iOutliningState25"7OutliningState28"27;E6FDF8B0-F3D1-11D4_ProjState: OutliningState29" q\bind\BindIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoFeature.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoManager.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\Register.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\register\RegisterIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\roster\RosterIq.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\stream\feature\compression\Method.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\DigestMD5\Step1.csGBLIC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\sasl\XGoogleToken\XGoogleTokenMechanism.csGBLI|C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\StreamParser.csDELIGBLIOC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dllGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Drawing.dllGBLINC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dllGBLILC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dllGBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllDELIGBLILC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dll mscorlibGBLIOC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll System.DataGBLIJC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllSystemGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Drawing.dllSystem.DrawingGBLINC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dll System.XmlDELIDELIDELIDESCECSPstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\StreamParser.csDEOutliningState33"9 OutliningState31":;TOutliningState30"OutliningState32"(.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlPrefix.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\Base\Stanza.csicrosoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dllSystemGBLIRC:\Programme\Microsoft.NET\SDK\CompactFramework\v2.0\Win"D:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\SaslHandler.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\InvalidResponseException.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\CertificateVerifier.csC:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\DiscoFeature.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Properties\AssemblyInfo.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Program.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\vcard\Photo.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\samples\MiniClientCF\Form1.csC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeFactory.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Xml\Dom\Element.csD:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\net\ClientSocket.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\XmppConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\BaseSocket.cs D:\Eigene Dateien\Visual Studio 2005\Projects\RELEASE_agsxmpp_Net2.0\agsxmpp\XmppClientConnection.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\ClientSocket.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\Factory\ElementFactory.cs D:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\PollClientSocket.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\net\dns\NoResponseException.csD:\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\StreamParser.cs C:\Dokumente und Einstellungen\gnauck\Eigene Dateien\Visual Studio 2005\Projects\agsxmpp_Net2.0\agsxmpp\protocol\iq\disco\Features.cs!C:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNamespaces.csC:\Dokumente und Einstellungen\gnauck\Desktop\XML\Mvp.Xml-src-2.0\Mvp.Xml-src-2.0\Common\v2\src\XmlNodeListFactorOutliningState20"OutliningState24"/3OutliningState27"&OutliningState26"45-smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/0000755000175000017500000000000012250206660020123 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Facebook/0000755000175000017500000000000012204443225021633 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Facebook/FacebookMechanism.cs0000644000175000017500000001217312204443225025524 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2009 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections.Generic; using System.Text; using agsXMPP.Xml.Dom; using agsXMPP.protocol.sasl; namespace agsXMPP.Sasl.Facebook { public class FacebookMechanism : Mechanism { private readonly string callId = new Random().Next().ToString(); private const string VERSION = "1.0"; /// /// /// /// public override void Init(XmppClientConnection con) { con.Send(new Auth(MechanismType.X_FACEBOOK_PLATFORM)); } /// /// /// /// public override void Parse(Node e) { if (e is Challenge) { var c = e as Challenge; byte[] bytes = Convert.FromBase64String(c.Value); string msg = Encoding.UTF8.GetString(bytes, 0, bytes.Length); var pairs = ParseMessage(msg); string res = BuildResponse(pairs); XmppClientConnection.Send(new Response(ToB64String(res))); } } static string ToB64String(string sin) { byte[] msg = Encoding.UTF8.GetBytes(sin); return Convert.ToBase64String(msg, 0, msg.Length); } private static Dictionary ParseMessage(string msg) { // example: // version=1&method=auth.xmpp_login&nonce=4346B9BFC5A160D46AF25732ACFC7CC3 var str = msg.Split('&'); var dict = new Dictionary(); foreach (string s in str) { int equalPos = s.IndexOf('='); var key = s.Substring(0, equalPos - 0); var val = s.Substring(equalPos + 1); val = System.Uri.UnescapeDataString(val); if (!dict.ContainsKey(key)) dict.Add(key, val); } return dict; } private string BuildResponse(Dictionary pairs) { /* * string method: Should be the same as the method specified by the server. * string api_key: The application key associated with the calling application. * string session_key: The session key of the logged in user. * float call_id: The request's sequence number. * string sig: An MD5 hash of the current request and your secret key. * string v: This must be set to 1.0 to use this version of the API. * string format: Optional - Ignored. * string cnonce: Optional - Client-selected nonce. Ignored. * string nonce: Should be the same as the nonce specified by the server. creates the response array, new, without session_key and sig http://developers.facebook.com/blog/post/555/ https://developers.facebook.com/docs/chat/ $resp_array = array( 'method' => $challenge_array['method'], 'nonce' => $challenge_array['nonce'], 'access_token' => $access_token, 'api_key' => $options['app_id'], 'call_id' => 0, 'v' => '1.0', ); */ var extData = ExtentedData as FacebookExtendedData; string res = ""; res = res + "method=" + System.Uri.EscapeDataString(pairs["method"]); res = res + "&api_key=" + System.Uri.EscapeDataString(extData.ApiKey); res = res + "&access_token=" + System.Uri.EscapeDataString(extData.AccessToken); res = res + "&v=" + System.Uri.EscapeDataString(VERSION); res = res + "&call_id=" + System.Uri.EscapeDataString(callId); res = res + "&nonce=" + System.Uri.EscapeDataString(pairs["nonce"]); return res; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Facebook/FacebookExtendedData.cs0000644000175000017500000000242112204443225026145 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2009 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.Sasl.Facebook { public class FacebookExtendedData : ExtendedData { public string ApiKey {get; set;} public string AccessToken {get; set;} } } smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/SaslHandler.cs0000644000175000017500000002567412250206660022670 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; using agsXMPP.protocol.iq.bind; using agsXMPP.protocol.iq.session; using agsXMPP.protocol.sasl; using agsXMPP.protocol.stream; using agsXMPP.Xml.Dom; using agsXMPP.Xml; namespace agsXMPP.Sasl { /// /// Summary description for SaslHandler. /// internal class SaslHandler : IDisposable { public event SaslEventHandler OnSaslStart; public event ObjectHandler OnSaslEnd; private XmppClientConnection m_XmppClient; private Mechanism m_Mechanism; // Track whether Dispose has been called. private bool m_Disposed; public SaslHandler(XmppClientConnection conn) { m_XmppClient = conn; m_XmppClient.StreamParser.OnStreamElement += OnStreamElement; } // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~SaslHandler() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } internal void OnStreamElement(object sender, ElementEventArgs eventArgs) { if (m_XmppClient == null) return; if ( m_XmppClient.XmppConnectionState == XmppConnectionState.Securing || m_XmppClient.XmppConnectionState == XmppConnectionState.StartCompression) return; var e = eventArgs.Element; if (e is Features) { Features f = e as Features; if (!m_XmppClient.Authenticated) { // RECV: // DIGEST-MD5PLAIN // // // // SENT: // Select a SASL mechanism SaslEventArgs args = new SaslEventArgs(f.Mechanisms); if (OnSaslStart != null) OnSaslStart(this, args); if (args.Auto) { // Library handles the Sasl stuff if (f.Mechanisms!=null) { if (m_XmppClient.UseStartTLS == false && m_XmppClient.UseSSL == false && f.Mechanisms.SupportsMechanism(MechanismType.X_GOOGLE_TOKEN) ) { // This is the only way to connect to GTalk on a unsecure Socket for now // Secure authentication is done over https requests to pass the // authentication credentials on a secure connection args.Mechanism = protocol.sasl.Mechanism.GetMechanismName(MechanismType.X_GOOGLE_TOKEN); } #if !(CF || CF_2) else if (m_XmppClient.UseSso && f.Mechanisms.SupportsMechanism(MechanismType.GSSAPI)) { args.Mechanism = protocol.sasl.Mechanism.GetMechanismName(MechanismType.GSSAPI); string kerbPrinc = f.Mechanisms.GetMechanism(MechanismType.GSSAPI).KerberosPrincipal; if (kerbPrinc != null) m_XmppClient.KerberosPrincipal = f.Mechanisms.GetMechanism(MechanismType.GSSAPI).KerberosPrincipal; } #endif else if (f.Mechanisms.SupportsMechanism(MechanismType.SCRAM_SHA_1)) { args.Mechanism = protocol.sasl.Mechanism.GetMechanismName(MechanismType.SCRAM_SHA_1); } else if (f.Mechanisms.SupportsMechanism(MechanismType.DIGEST_MD5)) { args.Mechanism = protocol.sasl.Mechanism.GetMechanismName(MechanismType.DIGEST_MD5); } else if (f.Mechanisms.SupportsMechanism(MechanismType.PLAIN)) { args.Mechanism = protocol.sasl.Mechanism.GetMechanismName(MechanismType.PLAIN); } else { args.Mechanism = null; } } else { // Hack for Google // TODO: i don't think we need this anymore. This was in an very early version of the gtalk server. args.Mechanism = null; //args.Mechanism = agsXMPP.protocol.sasl.Mechanism.GetMechanismName(agsXMPP.protocol.sasl.MechanismType.PLAIN); } } if (args.Mechanism != null) { m_Mechanism = Factory.SaslFactory.GetMechanism(args.Mechanism); // Set properties for the SASL mechanism m_Mechanism.Username = m_XmppClient.Username; m_Mechanism.Password = m_XmppClient.Password; m_Mechanism.Server = m_XmppClient.Server; m_Mechanism.ExtentedData = args.ExtentedData; // Call Init Method on the mechanism m_Mechanism.Init(m_XmppClient); } else { m_XmppClient.RequestLoginInfo(); } } else if(!m_XmppClient.Binded) { if (f.SupportsBind) { m_XmppClient.DoChangeXmppConnectionState(XmppConnectionState.Binding); BindIq bIq = string.IsNullOrEmpty(m_XmppClient.Resource) ? new BindIq(IqType.set) : new BindIq(IqType.set, m_XmppClient.Resource); m_XmppClient.IqGrabber.SendIq(bIq, BindResult); } } } else if (e is Challenge) { if (m_Mechanism != null && !m_XmppClient.Authenticated) { m_Mechanism.Parse(e); } } else if (e is Success) { // SASL authentication was successfull if (OnSaslEnd!=null) OnSaslEnd(this); m_XmppClient.DoChangeXmppConnectionState(XmppConnectionState.Authenticated); m_Mechanism = null; m_XmppClient.Reset(); } else if (e is Failure) { // Authentication failure m_XmppClient.FireOnAuthError(e as Element); } } internal void DoBind() { m_XmppClient.DoChangeXmppConnectionState(XmppConnectionState.Binding); BindIq bIq = string.IsNullOrEmpty(m_XmppClient.Resource) ? new BindIq(IqType.set) : new BindIq(IqType.set, m_XmppClient.Resource); m_XmppClient.IqGrabber.SendIq(bIq, BindResult); } private void BindResult(object sender, IQEventArgs e) { var iq = e.IQ; // Once the server has generated a resource identifier for the client or accepted the resource // identifier provided by the client, it MUST return an IQ stanza of type "result" // to the client, which MUST include a child element that specifies the full JID for // the connected resource as determined by the server: // Server informs client of successful resource binding: // // // somenode@example.com/someresource // // if (iq.Type == IqType.result) { // i assume the server could assign another resource here to the client // so grep the resource assigned by the server now Element bind = iq.SelectSingleElement(typeof(Bind)); if (bind != null) { Jid jid = ((Bind)bind).Jid; m_XmppClient.Resource = jid.Resource; m_XmppClient.Username = jid.User; } m_XmppClient.DoChangeXmppConnectionState(XmppConnectionState.Binded); m_XmppClient.m_Binded = true; m_XmppClient.DoRaiseEventBinded(); // success, so start the session now m_XmppClient.DoChangeXmppConnectionState(XmppConnectionState.StartSession); SessionIq sIq = new SessionIq(IqType.set, new Jid(m_XmppClient.Server)); m_XmppClient.IqGrabber.SendIq(sIq, SessionResult); e.Handled = true; } else if (iq.Type == IqType.error) { // TODO, handle bind errors m_XmppClient.DoRaiseEventBindError(iq); } } private void SessionResult(object sender, IQEventArgs e) { if (e.IQ.Type == IqType.result) { m_XmppClient.DoChangeXmppConnectionState(XmppConnectionState.SessionStarted); m_XmppClient.RaiseOnLogin(); e.Handled = true; } else if (e.IQ.Type == IqType.error) { } } #region IDisposable Members public void Dispose() { Dispose(true); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. private void Dispose(bool disposing) { // Check to see if Dispose has already been called. if(!m_Disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if(disposing) { // Dispose managed resources. // Remove the event handler or we will be in trouble with too many events m_XmppClient.StreamParser.OnStreamElement -= OnStreamElement; m_XmppClient = null; m_Mechanism = null; } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. } m_Disposed = true; } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Mechanism.cs0000644000175000017500000000530312204443225022356 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.Sasl { /// /// Summary description for Mechanism. /// public abstract class Mechanism { #region << Properties and member variables >> private XmppClientConnection m_XmppClientConnection; private string m_Username; private string m_Password; private string m_Server; public XmppClientConnection XmppClientConnection { get { return m_XmppClientConnection; } set { m_XmppClientConnection = value; } } /// /// /// public string Username { // lower case that until i implement our c# port of libIDN get { return m_Username; } set { m_Username = value != null ? value.ToLower() : null; } } /// /// /// public string Password { get { return m_Password; } set { m_Password = value; } } /// /// /// public string Server { get { return m_Server; } set { m_Server = value.ToLower(); } } /// /// Extra data for special Sasl mechanisms /// public ExtendedData ExtentedData { get; set; } #endregion /// /// /// /// public abstract void Init(XmppClientConnection con); /// /// /// /// public abstract void Parse(Node e); } }smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Scram/0000755000175000017500000000000012204443225021167 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Scram/ScramSha1Mechanism.cs0000644000175000017500000001533512204443225025134 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; using agsXMPP.protocol.sasl; using agsXMPP.Util; using agsXMPP.Xml.Dom; namespace agsXMPP.Sasl.Scram { /// /// /// public class ScramSha1Mechanism : Mechanism { private const int LENGHT_CLIENT_NONE = 24; private string firstClientMessage; private byte[] clientNonce; private string clientNonceB64; private string password; private string username; public ScramSha1Mechanism() { GenerateClientNonce(); } public override void Init(XmppClientConnection con) { XmppClientConnection = con; // Todo SASLPrep username = Username; password = Password; firstClientMessage = GenerateFirstClientMessage(); string msg = ToB64String(firstClientMessage); con.Send(new Auth(MechanismType.SCRAM_SHA_1, msg)); } public override void Parse(Node e) { if (e is Challenge) { Challenge ch = e as Challenge; string msg = ch.TextBase64; string content = GenerateFinalClientMessage(msg); XmppClientConnection.Send(new Response(content)); } } /// /// Generate a random client nonce /// private void GenerateClientNonce() { var random = new Byte[LENGHT_CLIENT_NONE]; var rng = new RNGCryptoServiceProvider(); rng.GetBytes(random); clientNonce = random; clientNonceB64 = Convert.ToBase64String(random); } private static Dictionary ParseMessage(string msg) { var str = msg.Split(','); var dict = new Dictionary(); foreach (string s in str) { int equalPos = s.IndexOf('='); var key = s.Substring(0, equalPos - 0); var val = s.Substring(equalPos + 1); if (!dict.ContainsKey(key)) dict.Add(key, val); } return dict; } internal string GenerateFinalClientMessage(string sMessage) { var pairs = ParseMessage(sMessage); //string clientServerNonce = pairs["r"]; string serverNonce = pairs["r"].Substring(clientNonceB64.Length); var salt = pairs["s"]; // the user's salt - (base64 encoded) var iteration = pairs["i"]; // iteation count // the bare of our first message var clientFirstMessageBare = firstClientMessage.Substring(3); var sb = new StringBuilder(); sb.Append("c=biws,"); // Client/Server nonce sb.Append("r="); sb.Append(clientNonceB64); sb.Append(serverNonce); string clientFinalMessageWithoutProof = sb.ToString(); string authMessage = clientFirstMessageBare + "," + sMessage + "," + clientFinalMessageWithoutProof; var saltedPassword = Hi(password, Convert.FromBase64String(salt), Convert.ToInt32(iteration)); var clientKey = Hash.HMAC(saltedPassword, "Client Key"); var storedKey = Hash.Sha1HashBytes(clientKey); var clientSignature = Hash.HMAC(storedKey, authMessage); var clientProof = new byte[clientKey.Length]; for (var i = 0; i < clientKey.Length; ++i) clientProof[i] = (byte)(clientKey[i] ^ clientSignature[i]); //var serverKey = Hash.HMAC(saltedPassword, "Server Key"); //var serverSignature = Hash.HMAC(serverKey, authMessage); string clientFinalMessage = clientFinalMessageWithoutProof; clientFinalMessage += ",p="; clientFinalMessage += Convert.ToBase64String(clientProof); return clientFinalMessage; } private string GenerateFirstClientMessage() { var sb = new StringBuilder(); // no channel bindings supported sb.Append("n,,"); // username sb.Append("n="); sb.Append(EscapeUsername(username)); sb.Append(","); // client nonce sb.Append("r="); sb.Append(clientNonceB64); return sb.ToString(); } private static string EscapeUsername(string user) { /* The characters ',' or '=' in usernames are sent as '=2C' and '=3D' respectively. If the server receives a username that contains '=' not followed by either '2C' or '3D', then the server MUST fail the authentication. */ var ret = user.Replace(",", "=2C"); ret = ret.Replace("=", "=3D"); return ret; } private static string ToB64String(string sin) { byte[] msg = Encoding.UTF8.GetBytes(sin); return Convert.ToBase64String(msg, 0, msg.Length); } private string FromB64String(string sin) { var b = Convert.FromBase64String(sin); return Encoding.UTF8.GetString(b); } private byte[] Hi(string pass, byte[] salt, int iterations) { var pdb = new Rfc2898DeriveBytes(pass, salt, iterations); return pdb.GetBytes(20); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/XGoogleToken/0000755000175000017500000000000012204443225022467 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/XGoogleToken/XGoogleTokenMechanism.cs0000644000175000017500000001460212204443225027213 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Text; using System.Net; using agsXMPP; using agsXMPP.Xml.Dom; using agsXMPP.protocol.sasl; namespace agsXMPP.Sasl.XGoogleToken { /// /// X-GOOGLE-TOKEN Authentication /// public class XGoogleTokenMechanism : Mechanism { /* see Google API documentation at: http://code.google.com/apis/accounts/AuthForInstalledApps.html http://code.google.com/apis/accounts/AuthForWebApps.html */ private string _Auth = null; private string _Sid = null; private string _Lsid = null; private string _Base64Token = null; private const string METHOD = "POST"; private const string CONTENT_TYPE = "application/x-www-form-urlencoded"; private const string URL_ISSUE_AUTH_TOKEN = "https://www.google.com/accounts/IssueAuthToken"; private const string URL_CLIENT_AUTH = "https://www.google.com/accounts/ClientAuth"; public override void Init(XmppClientConnection con) { base.XmppClientConnection = con; DoClientAuth(); } public override void Parse(Node e) { // not needed here in X-GOOGLE-TOKEN mechanism } private void DoSaslAuth() { // Base 64 Token goes here Auth auth = new Auth(MechanismType.X_GOOGLE_TOKEN, _Base64Token); base.XmppClientConnection.Send(auth); } private void DoClientAuth() { HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(URL_CLIENT_AUTH); request.Method = METHOD; request.ContentType = CONTENT_TYPE; #if CF || CF_2 //required for bug workaround request.AllowWriteStreamBuffering = true; #endif request.BeginGetRequestStream(new AsyncCallback(OnGetClientAuthRequestStream), request); } private void OnGetClientAuthRequestStream(IAsyncResult result) { WebRequest request = (System.Net.WebRequest)result.AsyncState; Stream outputStream = request.EndGetRequestStream(result); string data = null; data += "Email=" + base.XmppClientConnection.MyJID.Bare; data += "&Passwd=" + base.Password; data += "&PersistentCookie=false"; //data += "&source=googletalk"; data += "&source=" + base.XmppClientConnection.Resource; data += "&service=mail"; byte[] bytes = Encoding.UTF8.GetBytes(data); outputStream.Write(bytes, 0, bytes.Length); outputStream.Close(); request.BeginGetResponse(new AsyncCallback(OnGetClientAuthResponse), request); } private void OnGetClientAuthResponse(IAsyncResult result) { try { WebRequest request = (WebRequest)result.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); if (response.StatusCode == HttpStatusCode.OK) { Stream dataStream = response.GetResponseStream(); ParseClientAuthResponse(dataStream); dataStream.Close(); response.Close(); _Base64Token = GetToken(_Auth); DoSaslAuth(); } else base.XmppClientConnection.Close(); } catch (WebException we) { if (we.Response is HttpWebResponse // this is also false when Response is null && ((HttpWebResponse)we.Response).StatusCode == HttpStatusCode.Forbidden) { base.XmppClientConnection.FireOnAuthError(null); } base.XmppClientConnection.Close(); } } private void ParseClientAuthResponse(Stream responseStream) { StreamReader reader = new StreamReader(responseStream); string line; while ((line = reader.ReadLine()) != null) { if (line.StartsWith("SID=")) _Sid = line.Substring(4); else if(line.StartsWith("LSID=")) _Lsid = line.Substring(5); else if (line.StartsWith("Auth=")) _Auth = line.Substring(5); } reader.Close(); } private string GetToken(string line) { string temp = "\0" + base.XmppClientConnection.MyJID.Bare + "\0" + line; byte[] b = Encoding.UTF8.GetBytes(temp); return Convert.ToBase64String(b, 0, b.Length); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/ExtendedData.cs0000644000175000017500000000223012204443225023000 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2009 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.Sasl { public abstract class ExtendedData { } } smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/SaslEventArgs.cs0000644000175000017500000000423212204443225023173 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.sasl; using agsXMPP.protocol.stream; namespace agsXMPP.Sasl { public delegate void SaslEventHandler (object sender, SaslEventArgs args); public class SaslEventArgs { #region << Constructors >> public SaslEventArgs() { } public SaslEventArgs(Mechanisms mechanisms) { Mechanisms = mechanisms; } #endregion // by default the library chooses the auth method private bool m_Auto = true; /// /// Set Auto to true if the library should choose the mechanism /// Set it to false for choosing the authentication method yourself /// public bool Auto { get { return m_Auto; } set { m_Auto = value; } } /// /// SASL Mechanism for authentication as string /// public string Mechanism { get; set; } public Mechanisms Mechanisms { get; set; } /// /// Extra Data for special Sasl mechanisms /// public ExtendedData ExtentedData { get; set; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/DigestMD5/0000755000175000017500000000000012204443225021647 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/DigestMD5/Step1.cs0000644000175000017500000001363512204443225023202 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; //encoded challenge to client: // // //cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgi //LGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg== //The decoded challenge is: // //realm="somerealm",nonce="OA6MG9tEQGm2hh",qop="auth",charset=utf-8,algorithm=md5-sess namespace agsXMPP.Sasl.DigestMD5 { /// /// Summary description for Step1. /// public class Step1 : DigestMD5Mechanism // Mechanism { /// /// Exception occurs when we were unable to parse the challenge /// public class ChallengeParseException : Exception { public ChallengeParseException(string message) : base(message) { } } #region << Constructors >> public Step1() { } public Step1(string message) { m_Message = message; Parse(message); } #endregion #region << Properties >> private string m_Realm; private string m_Nonce; private string m_Qop;// = "auth"; private string m_Charset = "utf-8"; private string m_Algorithm; private string m_Rspauth = null; private string m_Message; public string Realm { get { return m_Realm; } set { m_Realm = value; } } public string Nonce { get { return m_Nonce; } set { m_Nonce = value; } } public string Qop { get { return m_Qop; } set { m_Qop = value; } } public string Charset { get { return m_Charset; } set { m_Charset = value; } } public string Algorithm { get { return m_Algorithm; } set { m_Algorithm = value; } } public string Rspauth { get { return m_Rspauth; } set { m_Rspauth = value; } } #endregion /* nonce="deqOGux/N6hDPtf9vkGMU5Vzae+zfrqpBIvh6LovbBM=", realm="amessage.de", qop="auth,auth-int,auth-conf", cipher="rc4-40,rc4-56,rc4,des,3des", maxbuf=1024, charset=utf-8, algorithm=md5-sess */ private void Parse(string message) { try { int start = 0; int end = 0; while (start < message.Length) { int equalPos = message.IndexOf('=', start); if (equalPos > 0) { // look if the next char is a quote if (message.Substring(equalPos + 1, 1) == "\"") { // quoted value, find the end now end = message.IndexOf('"', equalPos + 2); ParsePair(message.Substring(start, end - start + 1)); start = end + 2; } else { // value is not quoted, ends at the next comma or end of string end = message.IndexOf(',', equalPos + 1); if (end == -1) end = message.Length; ParsePair(message.Substring(start, end - start)); start = end + 1; } } } } catch { throw new ChallengeParseException("Unable to parse challenge"); } } private void ParsePair(string pair) { int equalPos = pair.IndexOf("="); if (equalPos > 0) { string key = pair.Substring(0, equalPos); string data; // is the value quoted? if (pair.Substring(equalPos + 1, 1) == "\"") data = pair.Substring(equalPos + 2, pair.Length - equalPos - 3); else data = pair.Substring(equalPos + 1); switch (key) { case "realm": m_Realm = data; break; case "nonce": m_Nonce = data; break; case "qop": m_Qop = data; break; case "charset": m_Charset = data; break; case "algorithm": m_Algorithm = data; break; case "rspauth": m_Rspauth = data; break; } } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/DigestMD5/DigestMD5Mechanism.cs0000644000175000017500000000504412204443225025553 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP; using agsXMPP.Xml.Dom; using agsXMPP.protocol.sasl; namespace agsXMPP.Sasl.DigestMD5 { /// /// Handels the SASL Digest MD5 authentication /// public class DigestMD5Mechanism : Mechanism { public DigestMD5Mechanism() { } public override void Init(XmppClientConnection con) { base.XmppClientConnection = con; base.XmppClientConnection.Send(new protocol.sasl.Auth(protocol.sasl.MechanismType.DIGEST_MD5)); } public override void Parse(Node e) { if (e is protocol.sasl.Challenge) { protocol.sasl.Challenge c = e as protocol.sasl.Challenge; Step1 step1 = new Step1(c.TextBase64); if (step1.Rspauth == null) { //response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dXNlcm5hbWU9ImduYXVjayIscmVhbG09IiIsbm9uY2U9IjM4MDQzMjI1MSIsY25vbmNlPSIxNDE4N2MxMDUyODk3N2RiMjZjOWJhNDE2ZDgwNDI4MSIsbmM9MDAwMDAwMDEscW9wPWF1dGgsZGlnZXN0LXVyaT0ieG1wcC9qYWJiZXIucnUiLGNoYXJzZXQ9dXRmLTgscmVzcG9uc2U9NDcwMTI5NDU4Y2EwOGVjYjhhYTIxY2UzMDhhM2U5Nzc Step2 s2 = new Step2(step1, base.Username, base.Password, base.Server); protocol.sasl.Response r = new agsXMPP.protocol.sasl.Response(s2.ToString()); base.XmppClientConnection.Send(r); } else { // SEND: base.XmppClientConnection.Send(new protocol.sasl.Response()); } } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/DigestMD5/Step2.cs0000644000175000017500000002145112204443225023176 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Text; #if CF using agsXMPP.util; #endif using System.Security.Cryptography; namespace agsXMPP.Sasl.DigestMD5 { /// /// Summary description for Step2. /// public class Step2 : Step1 { public Step2() { } /// /// builds a step2 message reply to the given step1 message /// /// public Step2(Step1 step1, string username, string password, string server) { this.Nonce = step1.Nonce; // fixed for SASL n amessage servers (jabberd 1.x) if (SupportsAuth(step1.Qop)) this.Qop = "auth"; this.Realm = step1.Realm; this.Charset = step1.Charset; this.Algorithm = step1.Algorithm; this.Username = username; this.Password = password; this.Server = server; GenerateCnonce(); GenerateNc(); GenerateDigestUri(); GenerateResponse(); } /// /// Does the server support Auth? /// /// /// private bool SupportsAuth(string qop) { string[] auth = qop.Split(','); // This overload was not available in the CF, so updated this to the following //bool ret = Array.IndexOf(auth, "auth") < 0 ? false : true; bool ret = Array.IndexOf(auth, "auth", auth.GetLowerBound(0), auth.Length) < 0 ? false : true; return ret; } /// /// parses a message and returns the step2 object /// /// public Step2(string message) { // TODO, important for server stuff } #region << Properties and member variables >> private string m_Cnonce; private string m_Nc; private string m_DigestUri; private string m_Response; private string m_Authzid; public string Cnonce { get { return m_Cnonce; } set { m_Cnonce = value; } } public string Nc { get { return m_Nc; } set { m_Nc = value; } } public string DigestUri { get { return m_DigestUri; } set { m_DigestUri = value; } } public string Response { get { return m_Response; } set { m_Response = value; } } public string Authzid { get { return m_Authzid; } set { m_Authzid = value; } } #endregion public override string ToString() { return GenerateMessage(); } private void GenerateCnonce() { // Lenght of the Session ID on bytes, // 32 bytes equaly 64 chars // 16^64 possibilites for the session IDs (4.294.967.296) // This should be unique enough int m_lenght = 32; RandomNumberGenerator RNG = RandomNumberGenerator.Create(); byte[] buf = new byte[m_lenght]; RNG.GetBytes(buf); m_Cnonce = Util.Hash.HexToString(buf).ToLower(); // m_Cnonce = "e163ceed6cfbf8c1559a9ff373b292c2f926b65719a67a67c69f7f034c50aba3"; } private void GenerateNc() { int nc = 1; m_Nc = nc.ToString().PadLeft(8,'0'); } private void GenerateDigestUri() { m_DigestUri = "xmpp/" + base.Server; } // HEX( KD ( HEX(H(A1)), // { // nonce-value, ":" nc-value, ":", // cnonce-value, ":", qop-value, ":", HEX(H(A2)) })) // // If authzid is specified, then A1 is // // A1 = { H( { username-value, ":", realm-value, ":", passwd } ), // ":", nonce-value, ":", cnonce-value, ":", authzid-value } // // If authzid is not specified, then A1 is // // A1 = { H( { username-value, ":", realm-value, ":", passwd } ), // ":", nonce-value, ":", cnonce-value } // // where // // passwd = *OCTET public void GenerateResponse() { byte[] H1; byte[] H2; byte[] H3; //byte[] temp; string A1; string A2; string A3; string p1; string p2; StringBuilder sb = new StringBuilder(); sb.Append(this.Username); sb.Append(":"); sb.Append(this.Realm); sb.Append(":"); sb.Append(this.Password); #if !CF H1 = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(sb.ToString())); #else //H1 = Encoding.Default.GetBytes(util.Hash.MD5Hash(sb.ToString())); H1 = util.Hash.MD5Hash(Encoding.UTF8.GetBytes(sb.ToString())); #endif sb.Remove(0, sb.Length); sb.Append(":"); sb.Append(this.Nonce); sb.Append(":"); sb.Append(this.Cnonce); if (m_Authzid != null) { sb.Append(":"); sb.Append(m_Authzid); } A1 = sb.ToString(); // sb.Remove(0, sb.Length); // sb.Append(Encoding.Default.GetChars(H1)); // //sb.Append(Encoding.ASCII.GetChars(H1)); // // sb.Append(A1); byte[] bA1 = Encoding.ASCII.GetBytes(A1); byte[] bH1A1 = new byte[H1.Length + bA1.Length]; //Array.Copy(H1, bH1A1, H1.Length); Array.Copy(H1, 0, bH1A1, 0, H1.Length); Array.Copy(bA1, 0, bH1A1, H1.Length, bA1.Length); #if !CF H1 = new MD5CryptoServiceProvider().ComputeHash(bH1A1); //Console.WriteLine(util.Hash.HexToString(H1)); #else //H1 = Encoding.Default.GetBytes(util.Hash.MD5Hash(sb.ToString())); //H1 =util.Hash.MD5Hash(Encoding.Default.GetBytes(sb.ToString())); H1 =util.Hash.MD5Hash(bH1A1); #endif sb.Remove(0,sb.Length); sb.Append("AUTHENTICATE:"); sb.Append(m_DigestUri); if (this.Qop.CompareTo("auth") != 0) { sb.Append(":00000000000000000000000000000000"); } A2 = sb.ToString(); H2 = Encoding.ASCII.GetBytes(A2); #if !CF H2 = new MD5CryptoServiceProvider().ComputeHash(H2); #else //H2 = Encoding.Default.GetBytes(util.Hash.MD5Hash(H2)); H2 =util.Hash.MD5Hash(H2); #endif // create p1 and p2 as the hex representation of H1 and H2 p1 = Util.Hash.HexToString(H1).ToLower(); p2 = Util.Hash.HexToString(H2).ToLower(); sb.Remove(0, sb.Length); sb.Append(p1); sb.Append(":"); sb.Append(this.Nonce); sb.Append(":"); sb.Append(m_Nc); sb.Append(":"); sb.Append(this.m_Cnonce); sb.Append(":"); sb.Append(base.Qop); sb.Append(":"); sb.Append(p2); A3 = sb.ToString(); #if !CF H3 = new MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(A3)); #else //H3 = Encoding.Default.GetBytes(util.Hash.MD5Hash(A3)); H3 =util.Hash.MD5Hash(Encoding.ASCII.GetBytes(A3)); #endif m_Response = Util.Hash.HexToString(H3).ToLower(); } private string GenerateMessage() { StringBuilder sb = new StringBuilder(); sb.Append("username="); sb.Append(AddQuotes(this.Username)); sb.Append(","); sb.Append("realm="); sb.Append(AddQuotes(this.Realm)); sb.Append(","); sb.Append("nonce="); sb.Append(AddQuotes(this.Nonce)); sb.Append(","); sb.Append("cnonce="); sb.Append(AddQuotes(this.Cnonce)); sb.Append(","); sb.Append("nc="); sb.Append(this.Nc); sb.Append(","); sb.Append("qop="); sb.Append(base.Qop); sb.Append(","); sb.Append("digest-uri="); sb.Append(AddQuotes(this.DigestUri)); sb.Append(","); sb.Append("charset="); sb.Append(this.Charset); sb.Append(","); sb.Append("response="); sb.Append(this.Response); return sb.ToString(); } /// /// return the given string with quotes /// /// /// private string AddQuotes(string s) { // fixed, s can be null (eg. for realm in ejabberd) if (s != null && s.Length > 0) s = s.Replace(@"\", @"\\"); string quote = "\""; return quote + s + quote; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Gssapi/0000755000175000017500000000000012204443225021350 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Gssapi/SSPIHelper.cs0000644000175000017500000005666112204443225023633 0ustar00meebeymeebey00000000000000#if !MONO using System; using System.Runtime.InteropServices; using System.Security.Principal; namespace agsXMPP.Sasl.Gssapi { internal enum SecBufferType { SECBUFFER_VERSION = 0, SECBUFFER_EMPTY = 0, SECBUFFER_DATA = 1, SECBUFFER_TOKEN = 2, SECBUFFER_PADDING = 9, SECBUFFER_STREAM = 10 } [StructLayout(LayoutKind.Sequential)] internal struct SecBuffer : IDisposable { public int cbBuffer; public int BufferType; public IntPtr pvBuffer; public SecBuffer(int bufferSize) { cbBuffer = bufferSize; BufferType = (int)SecBufferType.SECBUFFER_TOKEN; pvBuffer = Marshal.AllocHGlobal(bufferSize); } public SecBuffer(byte[] secBufferBytes) { cbBuffer = secBufferBytes.Length; BufferType = (int)SecBufferType.SECBUFFER_TOKEN; pvBuffer = Marshal.AllocHGlobal(cbBuffer); Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer); } public SecBuffer(byte[] secBufferBytes, SecBufferType bufferType) { BufferType = (int)bufferType; if (secBufferBytes != null && secBufferBytes.Length != 0) { cbBuffer = secBufferBytes.Length; pvBuffer = Marshal.AllocHGlobal(cbBuffer); Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer); } else { cbBuffer = 0; pvBuffer = IntPtr.Zero; } } public void Dispose() { if (pvBuffer != IntPtr.Zero) { Marshal.FreeHGlobal(pvBuffer); pvBuffer = IntPtr.Zero; } } } internal struct MultipleSecBufferHelper { public byte[] Buffer; public SecBufferType BufferType; public MultipleSecBufferHelper(byte[] buffer, SecBufferType bufferType) { Buffer = buffer; BufferType = bufferType; } }; [StructLayout(LayoutKind.Sequential)] internal struct SecBufferDesc : IDisposable { public int ulVersion; public int cBuffers; public IntPtr pBuffers; //Point to SecBuffer public SecBufferDesc(int bufferSize) { ulVersion = (int)SecBufferType.SECBUFFER_VERSION; cBuffers = 1; SecBuffer ThisSecBuffer = new SecBuffer(bufferSize); pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(ThisSecBuffer)); Marshal.StructureToPtr(ThisSecBuffer, pBuffers, false); } public SecBufferDesc(byte[] secBufferBytes) { ulVersion = (int)SecBufferType.SECBUFFER_VERSION; cBuffers = 1; SecBuffer ThisSecBuffer = new SecBuffer(secBufferBytes); pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(ThisSecBuffer)); Marshal.StructureToPtr(ThisSecBuffer, pBuffers, false); } internal SecBufferDesc(MultipleSecBufferHelper[] secBufferBytesArray) { if (secBufferBytesArray == null || secBufferBytesArray.Length == 0) { throw new ArgumentException("secBufferBytesArray cannot be null or 0 length"); } ulVersion = (int)SecBufferType.SECBUFFER_VERSION; cBuffers = secBufferBytesArray.Length; //Allocate memory for SecBuffer Array.... pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SecBuffer)) * cBuffers); for (int Index = 0; Index < secBufferBytesArray.Length; Index++) { //Super hack: Now allocate memory for the individual SecBuffers //and just copy the bit values to the SecBuffer array!!! SecBuffer ThisSecBuffer = new SecBuffer(secBufferBytesArray[Index].Buffer, secBufferBytesArray[Index].BufferType); //We will write out bits in the following order: //int cbBuffer; //int BufferType; //pvBuffer; //Note: that we won't be releasing the memory allocated by ThisSecBuffer until we //are disposed... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); Marshal.WriteInt32(pBuffers, CurrentOffset, ThisSecBuffer.cbBuffer); int length = CurrentOffset + Marshal.SizeOf(ThisSecBuffer.cbBuffer); Marshal.WriteInt32(pBuffers, length, ThisSecBuffer.BufferType); length = CurrentOffset + Marshal.SizeOf(ThisSecBuffer.cbBuffer) + Marshal.SizeOf(ThisSecBuffer.BufferType); Marshal.WriteIntPtr(pBuffers, length, ThisSecBuffer.pvBuffer); } } public void Dispose() { if (pBuffers != IntPtr.Zero) { if (cBuffers == 1) { SecBuffer ThisSecBuffer = (SecBuffer)Marshal.PtrToStructure(pBuffers, typeof(SecBuffer)); ThisSecBuffer.Dispose(); } else { // Since we aren't sending any messages using the kerberos encrypt/decrypt. // The 1st buffer is going to be empty. We can skip it. for (int Index = 1; Index < cBuffers; Index++) { //The bits were written out the following order: //int cbBuffer; //int BufferType; //pvBuffer; //What we need to do here is to grab a hold of the pvBuffer allocate by the individual //SecBuffer and release it... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); int totalLength = CurrentOffset + Marshal.SizeOf(typeof(int)) + Marshal.SizeOf(typeof(int)); IntPtr SecBufferpvBuffer = Marshal.ReadIntPtr(pBuffers, totalLength); Marshal.FreeHGlobal(SecBufferpvBuffer); } } Marshal.FreeHGlobal(pBuffers); pBuffers = IntPtr.Zero; } } public byte[] GetSecBufferByteArray() { byte[] Buffer = null; if (pBuffers == IntPtr.Zero) { throw new InvalidOperationException("Object has already been disposed!!!"); } if (cBuffers == 1) { SecBuffer ThisSecBuffer = (SecBuffer)Marshal.PtrToStructure(pBuffers, typeof(SecBuffer)); if (ThisSecBuffer.cbBuffer > 0) { Buffer = new byte[ThisSecBuffer.cbBuffer]; Marshal.Copy(ThisSecBuffer.pvBuffer, Buffer, 0, ThisSecBuffer.cbBuffer); } } else { int BytesToAllocate = 0; for (int Index = 0; Index < cBuffers; Index++) { //The bits were written out the following order: //int cbBuffer; //int BufferType; //pvBuffer; //What we need to do here calculate the total number of bytes we need to copy... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); BytesToAllocate += Marshal.ReadInt32(pBuffers, CurrentOffset); } Buffer = new byte[BytesToAllocate]; for (int Index = 0, BufferIndex = 0; Index < cBuffers; Index++) { //The bits were written out the following order: //int cbBuffer; //int BufferType; //pvBuffer; //Now iterate over the individual buffers and put them together into a //byte array... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); int BytesToCopy = Marshal.ReadInt32(pBuffers, CurrentOffset); int length = CurrentOffset + Marshal.SizeOf(typeof(int)) + Marshal.SizeOf(typeof(int)); IntPtr SecBufferpvBuffer = Marshal.ReadIntPtr(pBuffers, length); Marshal.Copy(SecBufferpvBuffer, Buffer, BufferIndex, BytesToCopy); BufferIndex += BytesToCopy; } } return (Buffer); } } [StructLayout(LayoutKind.Sequential)] internal struct SECURITY_INTEGER { public uint LowPart; public int HighPart; public SECURITY_INTEGER(int dummy) { LowPart = 0; HighPart = 0; } }; [StructLayout(LayoutKind.Sequential)] internal struct SECURITY_HANDLE { //both changed from uint - crucial for 64 bit platforms public IntPtr LowPart; public IntPtr HighPart; public SECURITY_HANDLE(int dummy) { LowPart = HighPart = IntPtr.Zero; } }; [StructLayout(LayoutKind.Sequential)] internal struct SecPkgContext_Sizes { public uint cbMaxToken; public uint cbMaxSignature; public uint cbBlockSize; public uint cbSecurityTrailer; }; [StructLayout(LayoutKind.Sequential)] internal struct SEC_WINNT_AUTH_IDENTITY { public string User; public int UserLength; public string Domain; public int DomainLength; public string Password; public int PasswordLength; public int Flags; } internal class SSPIHelper { public const int TOKEN_QUERY = 0x00008; public const uint SEC_E_OK = 0; public const uint SEC_E_INVALID_HANDLE = 0x80090301; public const uint SEC_E_LOGON_DENIED = 0x8009030C; public const uint SEC_I_CONTINUE_NEEDED = 0x90312; public const uint SEC_I_COMPLETE_NEEDED = 0x90313; public const uint SEC_I_COMPLETE_AND_CONTINUE = 0x90314; public const uint SECQOP_WRAP_NO_ENCRYPT = 0x80000001; const int SECPKG_CRED_OUTBOUND = 2; private const int SECURITY_NETWORK_DREP = 0x0; const int MAX_TOKEN_SIZE = 12288; //For AcquireCredentialsHandle in 3er Parameter "fCredentialUse" SECURITY_HANDLE _hOutboundCred = new SECURITY_HANDLE(0); public SECURITY_HANDLE _hClientContext = new SECURITY_HANDLE(0); public const int ISC_REQ_DELEGATE = 0x00000001; public const int ISC_REQ_MUTUAL_AUTH = 0x00000002; public const int ISC_REQ_REPLAY_DETECT = 0x00000004; public const int ISC_REQ_SEQUENCE_DETECT = 0x00000008; public const int ISC_REQ_CONFIDENTIALITY = 0x00000010; public const int ISC_REQ_USE_SESSION_KEY = 0x00000020; public const int ISC_REQ_PROMPT_FOR_CREDS = 0x00000040; public const int ISC_REQ_USE_SUPPLIED_CREDS = 0x00000080; public const int ISC_REQ_ALLOCATE_MEMORY = 0x00000100; public const int ISC_REQ_USE_DCE_STYLE = 0x00000200; public const int ISC_REQ_DATAGRAM = 0x00000400; public const int ISC_REQ_CONNECTION = 0x00000800; public const int ISC_REQ_CALL_LEVEL = 0x00001000; public const int ISC_REQ_FRAGMENT_SUPPLIED = 0x00002000; public const int ISC_REQ_EXTENDED_ERROR = 0x00004000; public const int ISC_REQ_STREAM = 0x00008000; public const int ISC_REQ_INTEGRITY = 0x00010000; public const int ISC_REQ_IDENTIFY = 0x00020000; public const int ISC_REQ_NULL_SESSION = 0x00040000; public const int ISC_REQ_MANUAL_CRED_VALIDATION = 0x00080000; public const int ISC_REQ_RESERVED1 = 0x00100000; public const int ISC_REQ_FRAGMENT_TO_FIT = 0x00200000; public const int SECPKG_ATTR_SIZES = 0; public const int STANDARD_CONTEXT_ATTRIBUTES = ISC_REQ_MUTUAL_AUTH; bool _bGotClientCredentials; #region << dll imports >> #region << AcquireCredentialsHandle >> // http://msdn.microsoft.com/en-us/library/aa374712%28VS.85%29.aspx [DllImport("secur32", CharSet = CharSet.Auto)] static extern uint AcquireCredentialsHandle( string pszPrincipal, //SEC_CHAR* string pszPackage, //SEC_CHAR* //"Kerberos","NTLM","Negotiative" int fCredentialUse, IntPtr PAuthenticationID,//_LUID AuthenticationID,//pvLogonID, //PLUID IntPtr pAuthData,//PVOID IntPtr pGetKeyFn, //SEC_GET_KEY_FN IntPtr pvGetKeyArgument, //PVOID ref SECURITY_HANDLE phCredential, //SecHandle //PCtxtHandle ref ref SECURITY_INTEGER ptsExpiry); //PTimeStamp //TimeStamp ref #endregion #region << InitializeSecurityContext >> // http://msdn.microsoft.com/en-us/library/aa375506%28VS.85%29.aspx [DllImport("secur32", CharSet = CharSet.Auto, SetLastError = true)] static extern uint InitializeSecurityContext( ref SECURITY_HANDLE phCredential,//PCredHandle IntPtr phContext, //PCtxtHandle string pszTargetName, int fContextReq, int Reserved1, int TargetDataRep, IntPtr pInput, //PSecBufferDesc SecBufferDesc int Reserved2, out SECURITY_HANDLE phNewContext, //PCtxtHandle out SecBufferDesc pOutput, //PSecBufferDesc SecBufferDesc out uint pfContextAttr, //managed ulong == 64 bits!!! out SECURITY_INTEGER ptsExpiry); //PTimeStamp [DllImport("secur32", CharSet = CharSet.Auto, SetLastError = true)] static extern uint InitializeSecurityContext( ref SECURITY_HANDLE phCredential,//PCredHandle ref SECURITY_HANDLE phContext, //PCtxtHandle string pszTargetName, int fContextReq, int Reserved1, int TargetDataRep, ref SecBufferDesc SecBufferDesc, //PSecBufferDesc SecBufferDesc int Reserved2, out SECURITY_HANDLE phNewContext, //PCtxtHandle out SecBufferDesc pOutput, //PSecBufferDesc SecBufferDesc out uint pfContextAttr, //managed ulong == 64 bits!!! out SECURITY_INTEGER ptsExpiry); //PTimeStamp #endregion #region << QueryContextAttributes >> [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int QueryContextAttributes(ref SECURITY_HANDLE phContext, uint ulAttribute, out SecPkgContext_Sizes pContextAttributes); #endregion #region << EncryptMessage >> [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int EncryptMessage(ref SECURITY_HANDLE phContext, uint fQOP, //managed ulong == 64 bits!!! ref SecBufferDesc pMessage, uint MessageSeqNo); //managed ulong == 64 bits!!! #endregion #region << DecryptMessage >> [DllImport("secur32.Dll", CharSet = CharSet.Auto, SetLastError = false)] public static extern int DecryptMessage(ref SECURITY_HANDLE phContext, ref SecBufferDesc pMessage, uint MessageSeqNo, out uint pfQOP); #endregion #endregion readonly string _sRemotePrincipal = WindowsIdentity.GetCurrent().Name; #region << Constructors >> public SSPIHelper() { } public SSPIHelper(string sRemotePrincipal) { _sRemotePrincipal = sRemotePrincipal; } #endregion public void Process(byte[] inToken, out byte[] outToken) { if (InitializeKerberosStage) { InitializeClient(inToken, out outToken); } else { if (inToken == null) { throw new Exception("Kerberos failure: Incoming bytes can't be null."); } DecryptMessage(0, inToken, out outToken); inToken = new byte[] { 0x01, 0x00, 0x00, 0x00 }; EncryptMessage(inToken, out outToken); } } private void InitializeClient(byte[] serverToken, out byte[] clientToken) { clientToken = null; SECURITY_INTEGER ClientLifeTime = new SECURITY_INTEGER(0); if (!_bGotClientCredentials) { uint returnValue = AcquireCredentialsHandle(null, "Kerberos", SECPKG_CRED_OUTBOUND, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, ref _hOutboundCred, ref ClientLifeTime); if (returnValue != SEC_E_OK) { throw new Exception("Couldn't acquire client credentials"); } _bGotClientCredentials = true; } uint ss; SecBufferDesc ClientToken = new SecBufferDesc(MAX_TOKEN_SIZE); try { uint ContextAttributes; if (serverToken == null) { ss = InitializeSecurityContext(ref _hOutboundCred, IntPtr.Zero, _sRemotePrincipal, STANDARD_CONTEXT_ATTRIBUTES, 0, SECURITY_NETWORK_DREP, IntPtr.Zero, 0, out _hClientContext, out ClientToken, out ContextAttributes, out ClientLifeTime); } else { SecBufferDesc ServerToken = new SecBufferDesc(serverToken); try { ss = InitializeSecurityContext(ref _hOutboundCred, ref _hClientContext, _sRemotePrincipal, STANDARD_CONTEXT_ATTRIBUTES, 0, SECURITY_NETWORK_DREP, ref ServerToken, 0, out _hClientContext, out ClientToken, out ContextAttributes, out ClientLifeTime); } finally { ServerToken.Dispose(); } } if (ss == SEC_E_LOGON_DENIED) { throw new Exception("Bad username, password or domain."); } else if (ss != SEC_E_OK && ss != SEC_I_CONTINUE_NEEDED) { throw new Exception("InitializeSecurityContext() failed!!!"); } clientToken = ClientToken.GetSecBufferByteArray(); } finally { ClientToken.Dispose(); } InitializeKerberosStage = ss != SEC_E_OK; } private bool bInitializeKerberosStage = true; private bool InitializeKerberosStage { get { return bInitializeKerberosStage; } set { bInitializeKerberosStage = value; } } public void EncryptMessage(byte[] message, out byte[] encryptedBuffer) { encryptedBuffer = null; SECURITY_HANDLE EncryptionContext = _hClientContext; SecPkgContext_Sizes ContextSizes; if (QueryContextAttributes(ref EncryptionContext, SECPKG_ATTR_SIZES, out ContextSizes) != SEC_E_OK) { throw new Exception("QueryContextAttribute() failed!!!"); } MultipleSecBufferHelper[] ThisSecHelper = new MultipleSecBufferHelper[] { new MultipleSecBufferHelper(new byte[ContextSizes.cbSecurityTrailer], SecBufferType.SECBUFFER_TOKEN), new MultipleSecBufferHelper(message, SecBufferType.SECBUFFER_DATA), new MultipleSecBufferHelper(new byte[ContextSizes.cbBlockSize], SecBufferType.SECBUFFER_PADDING) }; SecBufferDesc DescBuffer = new SecBufferDesc(ThisSecHelper); try { if (EncryptMessage(ref EncryptionContext, SECQOP_WRAP_NO_ENCRYPT, ref DescBuffer, 0) != SEC_E_OK) { throw new Exception("EncryptMessage() failed!!!"); } encryptedBuffer = DescBuffer.GetSecBufferByteArray(); } finally { DescBuffer.Dispose(); } } public void DecryptMessage(int messageLength, byte[] encryptedBuffer, out byte[] decryptedBuffer) { decryptedBuffer = null; SECURITY_HANDLE DecryptionContext = _hClientContext; byte[] EncryptedMessage = new byte[messageLength]; Array.Copy(encryptedBuffer, 0, EncryptedMessage, 0, messageLength); int SecurityTrailerLength = encryptedBuffer.Length - messageLength; byte[] SecurityTrailer = new byte[SecurityTrailerLength]; Array.Copy(encryptedBuffer, messageLength, SecurityTrailer, 0, SecurityTrailerLength); MultipleSecBufferHelper[] ThisSecHelper = new MultipleSecBufferHelper[] { new MultipleSecBufferHelper(EncryptedMessage, SecBufferType.SECBUFFER_DATA), new MultipleSecBufferHelper(SecurityTrailer, SecBufferType.SECBUFFER_STREAM) }; SecBufferDesc DescBuffer = new SecBufferDesc(ThisSecHelper); try { uint EncryptionQuality; if (DecryptMessage(ref DecryptionContext, ref DescBuffer, 0, out EncryptionQuality) != SEC_E_OK) { throw new Exception("DecryptMessage() failed!!!"); } decryptedBuffer = new byte[messageLength]; Array.Copy(DescBuffer.GetSecBufferByteArray(), 0, decryptedBuffer, 0, messageLength); } finally { DescBuffer.Dispose(); } } } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Gssapi/GssapiMechanism.cs0000644000175000017500000000735512204443225024764 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2009 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #if !MONO using System; using System.Security.Principal; using agsXMPP.Xml.Dom; using agsXMPP.protocol.sasl; namespace agsXMPP.Sasl.Gssapi { /// /// Handels the SASL Digest MD5 authentication /// public class GssapiMechanism : Mechanism { SSPIHelper sspiHelper; public GssapiMechanism() { } public override void Init(XmppClientConnection con) { XmppClientConnection = con; string kerbPrinc = XmppClientConnection.KerberosPrincipal; /* * try to build the kerberos principal if none is sent by the server or provided by the user. * XCP send the kerberos pricipal, Openfire doesnt. */ if (kerbPrinc == null) kerbPrinc = string.Format("xmpp/{0}@{1}", XmppClientConnection.Server, GetNtDomain()); //if (XmppClientConnection.KerberosPrincipal != null) // sspiHelper = new SSPIHelper(XmppClientConnection.KerberosPrincipal); //else // sspiHelper = new SSPIHelper(); sspiHelper = new SSPIHelper(kerbPrinc); Auth auth = new Auth(MechanismType.GSSAPI); byte[] clientToken; sspiHelper.Process(null, out clientToken); auth.Value = Convert.ToBase64String(clientToken); XmppClientConnection.Send(auth); } public override void Parse(Node e) { if (e is Challenge) { Challenge c = e as Challenge; Response resp; byte[] outBytes; byte[] inBytes = Convert.FromBase64String(c.Value); sspiHelper.Process(inBytes, out outBytes); if (outBytes == null) { resp = new Response(); } else { resp = new Response(); resp.Value = Convert.ToBase64String(outBytes); } XmppClientConnection.Send(resp); } } /// /// returns the NT domain, tis is used for building the kerberos principal when none is provided. /// /// internal string GetNtDomain() { var curName = WindowsIdentity.GetCurrent().Name; var domain = curName.Substring(0, curName.IndexOf('\\')); return domain.ToUpper(); } } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Plain/0000755000175000017500000000000012204443225021165 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Plain/PlainMechanism.cs0000644000175000017500000000435612204443225024414 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Text; using agsXMPP; using agsXMPP.Xml.Dom; using agsXMPP.protocol.sasl; namespace agsXMPP.Sasl.Plain { /// /// Summary description for PlainMechanism. /// public class PlainMechanism : Mechanism { private XmppClientConnection m_XmppClient = null; public PlainMechanism() { } public override void Init(XmppClientConnection con) { m_XmppClient = con; // $Message m_XmppClient.Send(new protocol.sasl.Auth(protocol.sasl.MechanismType.PLAIN, Message())); } public override void Parse(Node e) { // not needed here in PLAIN mechanism } private string Message() { // NULL Username NULL Password StringBuilder sb = new StringBuilder(); //sb.Append( (char) 0 ); //sb.Append(this.m_XmppClient.MyJID.Bare); sb.Append( (char) 0 ); sb.Append(this.Username); sb.Append( (char) 0 ); sb.Append(this.Password); byte[] msg = Encoding.UTF8.GetBytes(sb.ToString()); return Convert.ToBase64String(msg, 0, msg.Length); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Anonymous/0000755000175000017500000000000012204443225022112 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Sasl/Anonymous/AnonymousMechanism.cs0000644000175000017500000000543712204443225026267 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP; using agsXMPP.Xml.Dom; using agsXMPP.protocol.sasl; namespace agsXMPP.Sasl.Anonymous { /// /// SALS ANONYMOUS Mechanism, this allows anonymous logins to a xmpp server. /// public class AnonymousMechanism : Mechanism { /* S: DIGEST-MD5 ANONYMOUS * So, the proper exchange for this ANONYMOUS mechanism would be: C: S: or, in case of the optional trace information: C: c2lyaGM= S: */ /// /// /// public AnonymousMechanism() { } /// /// /// /// public override void Init(XmppClientConnection con) { con.Send(new Auth(MechanismType.ANONYMOUS)); } /// /// /// /// public override void Parse(Node e) { // *No Challenges* in SASL ANONYMOUS } } } smuxi-1.1/lib/agsxmpp/agsxmpp/PresenceGrabber.cs0000644000175000017500000001036212204443225022602 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using agsXMPP.protocol; using agsXMPP.protocol.client; using agsXMPP.Collections; namespace agsXMPP { public delegate void PresenceCB(object sender, Presence pres, object data); public class PresenceGrabber : PacketGrabber { /// /// Initializes a new instance of the class. /// /// The conn. public PresenceGrabber(XmppClientConnection conn) { m_connection = conn; conn.OnPresence += new PresenceHandler(m_connection_OnPresence); } public void Add(Jid jid, PresenceCB cb, object cbArg) { lock (m_grabbing) { if (m_grabbing.ContainsKey(jid.ToString())) return; } TrackerData td = new TrackerData(); td.cb = cb; td.data = cbArg; td.comparer = new BareJidComparer(); lock (m_grabbing) { m_grabbing.Add(jid.ToString(), td); } } /// /// Adds the specified jid. /// /// The jid. /// The comparer. /// The callback. /// The callback Arguments. public void Add(Jid jid, IComparer comparer, PresenceCB cb, object cbArg) { lock (m_grabbing) { if (m_grabbing.ContainsKey(jid.ToString())) return; } TrackerData td = new TrackerData(); td.cb = cb; td.data = cbArg; td.comparer = comparer; lock (m_grabbing) { m_grabbing.Add(jid.ToString(), td); } } /// /// Pending request can be removed. /// This is useful when a ressource for the callback is destroyed and /// we are not interested anymore at the result. /// /// ID of the Iq we are not interested anymore public void Remove(Jid jid) { lock (m_grabbing) { if (m_grabbing.ContainsKey(jid.ToString())) m_grabbing.Remove(jid.ToString()); } } private class TrackerData { public PresenceCB cb; public object data; // by default the Bare Jid is compared public IComparer comparer; } /// /// A presence is received. Now check if its from a Jid we are looking for and /// raise the event in this case. /// /// /// private void m_connection_OnPresence(object sender, Presence pres) { if (pres == null) return; lock (m_grabbing) { IDictionaryEnumerator myEnum = m_grabbing.GetEnumerator(); while(myEnum.MoveNext()) { TrackerData t = myEnum.Value as TrackerData; if (t.comparer.Compare(new Jid((string)myEnum.Key), pres.From) == 0) { // Execute the callback t.cb(this, pres, t.data); } } } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/ClassDiagram.cd0000644000175000017500000015537712204443225022104 0ustar00meebeymeebey00000000000000 Collections\BareJidComparer.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA= Collections\FullJidComparer.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA= Factory\ElementFactory.cs AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAIAAA= Factory\ElementFactory.cs AAAEAAAAAAAAAAAEAAAAAAAAAAAAIAAAAAAAAAAAAAA= Factory\SaslFactory.cs AAAAAAAAAAACAAAAEAAAAAAAAAAAAEAAAAAAAAAAAAA= Id.cs AAAAAAAAAAAABBAAAAQAAAACAAAAAAQAAAAAAAAAAAA= IqGrabber.cs AAAAAAAAAAAAAAAAAAAABABAAAAAAAAAAAAAgAAAAAA= IqGrabber.cs Jid.cs EAAhAAAAIAAAAAAEgAAAAAAAAAAAAAAAAAYEAgAAQAA= MessageGrabber.cs AAIAAAAABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA= MessageGrabber.cs PacketGrabber.cs AAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIABAAAA= PresenceGrabber.cs AAIAAAAAAAAAIAAAAAAABAAAAAAAAAAAAAAAAAAAAAA= PresenceGrabber.cs PresenceManager.cs AAAAAAAAAAAAAAAEAAAAAAAAAAAAYQAAAAAAIAAAAAA= RosterManager.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAoAAAAAA= SaslEventArgs.cs AAAAAAgAAAAAEACAAAAAAAgAAAAAAAAAAAAAACAAAAA= SaslHandler.cs AAMAAAAAACAAAACAAAAkCAAAAAAAAAAAFAAAAAAAAAA= StreamParser.cs AAIAhACAEAAABAABAAAAAAgAgAAIAwAoCAABAACASAA= Uri.cs gIAECDVIAAAkAAQAAgVEMQIKAEfIgABAAQACQUBAgAQ= XmppClientConnection.cs WHAQQgIWPyyapsIWBZAWB0RYwSUVCQoTHAeU1AAMCAA= XmppClientConnection.cs XmppClientConnection.cs XmppClientConnection.cs XmppClientConnection.cs XmppComponentConnection.cs CAAAAAACCAiAIgAAAAAQAxQQQCASAAACAAIQAAAAAAA= XmppComponentConnection.cs XmppConnection.cs AIAAYAACFBBJIgAQRMAQQAQQDAAAAKBAQEIFApCAQAM= XmppConnection.cs net\BaseSocket.cs BIRAAAAAAACQQAAAIEAiAIABCAAEAEACAAAACAIQBAg= net\BaseSocket.cs net\ClientSocket.cs FARQAgAACDAhSBACAECAAIgBBDAAAAQQAIGA4AgAQEA= net\PollClientSocket.cs AAQAEAAACAAKQAEAAMAAAIAAACAQCAACEAQGJAAAEAA= net\PollingSocketException.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\Base\Avatar.cs AAAAAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAA= protocol\Base\Group.cs AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= protocol\Base\Item.cs AAAAAAAAAAAAAAAAAAgAAAQAAAAAAAAAAAAAAAAAAAA= protocol\Base\RosterItem.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAEAAAAAABAAAA= protocol\Base\Stream.cs IAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAA= protocol\Base\XmppPacket.cs AgACAAAAAAAAAQAAAAAAAAAAQAAIAAAAAAAAAAAABAA= protocol\client\Error.cs AAAAAAAAAACAAAAAAAAgAAAAAAAAAAAAAQAAIAAAAAA= protocol\client\IQ.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAQAAAAAAAAA= protocol\client\Message.cs AAAAAAAAAQAAAAAAAIABAAAAAAAABAAAAQAAAAAAAAA= protocol\client\Presence.cs AQAAAACEAAAAAAAEAAAAAAAAAAAEAAAAAQAAAAAAAAA= protocol\client\Stream.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\component\accept\Handshake.cs AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAA= protocol\component\accept\Log.cs AAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAQAAAAAAAAA= protocol\component\accept\Route.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAQAAAAAAAAA= protocol\extensions\featureneg\FeatureNeg.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAA= protocol\extensions\featureneg\FeatureNegIq.cs AAAAAAAAAAAAAAAAAAAAABAAAAAAAAQAAAAAAAAAAAA= protocol\extensions\filetransfer\File.cs AAAAAAAAAAIgiAAAAAAAAAQAAAAAAAABAAAAAAAAAAA= protocol\extensions\filetransfer\Range.cs AAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAgAA= protocol\extensions\primary\Primary.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\extensions\shim\Header.cs AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= protocol\extensions\shim\Headers.cs AAAAAAAAAAAAAAAACEAAAAAAAAAAAAAAAAAAAAAACAA= protocol\extensions\si\SI.cs AAACAAAAAAAAAAQAAAAAAAAAAAAAAAAAABAAAAAAAAA= protocol\iq\agent\Agent.cs AAAAAAAAAAAgACAAAAgAAAQAAAAAwAAAAAAAAQQAAAA= protocol\iq\agent\Agents.cs AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAA= protocol\iq\agent\AgentsIq.cs AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\auth\Auth.cs AAAAAAABIAAAAAAAAQAAAEAAAAAAAAECAgAAAAAAAAA= protocol\iq\auth\AuthIq.cs AAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAAAAAA= protocol\iq\avatar\Avatar.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\iq\avatar\AvatarIq.cs AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAgAAAAAAAAAAAA= protocol\iq\browse\Browse.cs AAAAAAAAAAAAAAAAAAAAAAQAAAAAAgAAAQAAAAAACQA= protocol\iq\browse\BrowseIq.cs AAAAAAAAAAAAAAAAAAAAAAAAAACAAAgAAAAAAAAAAAA= protocol\iq\browse\BrowseItem.cs IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAACQA= protocol\iq\browse\Service.cs AAAAAAAAAAAAAAAACAgAAAQAAAAAAgAAAQAAAAAAAQA= protocol\iq\disco\DiscoFeature.cs AAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\iq\disco\DiscoIdentity.cs AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAACAA= protocol\iq\disco\DiscoInfo.cs AAAAAAAAAAAAAAAAEAAAAAAAAIAAAAABAAAAAAEAAAA= protocol\iq\disco\DiscoInfoIq.cs AAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\disco\DiscoItem.cs AAAAAAAAAAAAAAAAAAgAAAQAAAAAAAAAAAAAAAEAAAQ= protocol\iq\disco\DiscoItems.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAgA= protocol\iq\disco\DiscoItemsIq.cs AAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\iq\last\Last.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA= protocol\iq\last\LastIq.cs AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAgAAAAAAAAAAAA= protocol\iq\oob\Oob.cs AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA= protocol\iq\oob\OobIq.cs AAAAAAAAAAAAAACAAAAAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\private\Private.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\iq\private\PrivateIq.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAA= protocol\iq\register\Register.cs AAAAAAAAACAAAAAAAQAAAAQAAAAIAAACAAAAAAAAAEA= protocol\iq\register\RegisterIq.cs AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\roster\Delimiter.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\iq\roster\Roster.cs AAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAgAAAAAA= protocol\iq\roster\RosterIq.cs AAAAAAAAAAAAAAAAAACAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\roster\RosterItem.cs AAAAAAAAAIAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA= protocol\iq\search\Search.cs AAABAEAAACAAAAAIAAAAAAAAAAAIAgAAAAAAAAAAAAA= protocol\iq\search\SearchIq.cs AAAAAAAAAAAAAAAAACAAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\search\SearchItem.cs AAABAEAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\iq\time\Time.cs AAAAAAAAAAAAAAAAAAAAAQAAAAgAAAAAAAAAAAAQAAA= protocol\iq\time\TimeIq.cs ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA= protocol\iq\vcard\Address.cs AAAAAAAAgAAAAAAAIAIAEAAAgAIAAAAAAAIAAAAEAAA= protocol\iq\vcard\Email.cs AAAAAAAAAAAAAAAAAAAAEAgAAAAAAAAAAQAAAAAAAAA= protocol\iq\vcard\Name.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAQAAAABAA= protocol\iq\vcard\Organization.cs AAAAAAAAAAAAAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAA= protocol\iq\vcard\Photo.cs AAAAAAAAAAAAAAAAAAAAAAEAAAAAABAAAQAAAAAAAAA= protocol\iq\vcard\Telephone.cs AAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAQAAAAAAAAA= protocol\iq\vcard\Vcard.cs AAIBIEAAAAAgAGCAGAAAAAwAAAAIAAACmAUAABAAIAA= protocol\iq\vcard\VcardIq.cs AAAAAAAAAAAAAEAAAAAAAAAAAAAAACAAAAAAAAAAAAA= protocol\iq\version\Version.cs AAAAAAAAAAAAIAAAAAAAAAQAAAAAAQAAAAAAAAAAAAA= protocol\iq\version\VersionIq.cs AAAAAAAAAAAAAAAAAAAAAIAAAAAAAAgAAAAAAAAAAAA= protocol\sasl\Abort.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\sasl\Auth.cs AAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\sasl\Challenge.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\sasl\Failure.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\sasl\Mechanism.cs AAAAACAAAAAAAAAAAIAIAAAAAAAAAAAAAAAAAAAAAAA= protocol\sasl\Mechanisms.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIAAAA= protocol\sasl\Response.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\sasl\Success.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\server\Stream.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\storage\Avatar.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\storage\AvatarIq.cs AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAgAAAAAAAAAAAA= protocol\stream\Bind.cs AAAAAAAAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAA= protocol\stream\BindIq.cs AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\stream\Error.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAA= protocol\stream\Features.cs BABAoCAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAA= protocol\stream\Session.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\stream\SessionIq.cs AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= protocol\stream\features\Register.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\tls\Failure.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\tls\Proceed.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\tls\StartTls.cs AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\x\Avatar.cs AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\x\Conference.cs AACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\x\Delay.cs AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\x\data\Data.cs AAAAAAAAAAAAAEAAAAAAAAAAgAAIAgAAAQAAAAAAIAA= protocol\x\data\Field.cs AIAAAAAAMACgAgAAAUAAAAAhBAgAAAAAAQAAAAAAAAE= protocol\x\data\Option.cs AAAAAAAAMAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\x\data\Value.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\x\rosterx\RosterItem.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ= protocol\x\rosterx\RosterX.cs AAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAgAAAAAA= sasl\DigestMD5\DigestMD5Mechanism.cs AAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAACAAAAAAA= sasl\DigestMD5\Step1.cs gAQgAIAAAAgAQAAAAAIAAAAAAABQIAAAAAAAAAQACBQ= sasl\DigestMD5\Step2.cs QAAAAAAIQQBAQAAEEAAABAAAAiAAAAgAAUAAAAAAgAA= sasl\Mechanism.cs AAAgAAAAAAAAAAAAAQAABQAAAAAAAAACAAACAgAAQAA= sasl\Plain\PlainMechanism.cs AAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAACIAAAAAA= util\Date.cs AAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAA= util\Enum.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= util\Hash.cs AAAAAAAAAAAAAAAAAAAAACAAAAAACAAAAAAAACAAAAA= Xml\Dom\Comment.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\Dom\Document.cs IAAAAIAAAAAgAAAAAAAAAIAIgAAABAAAAAAAAABABAA= Xml\Dom\DomLoader.cs AAAACAAAAEAAAAAAAAAIAAAAAAAAAAAAAAABgAAAAAA= Xml\Dom\Element.cs MgAAAAAggmFCABEAAIQMAYAWAgaAGAIAAKAgACAACSA= Xml\Dom\Node.cs gAEAQCAAEBAAEAAkgAAARAAAAAQAIAAAAAGgAAAAAAA= Xml\Dom\NodeList.cs AAIAAAAAAAAAAAAAAAAABCAEAAAAAAAAAAAAAADAAAA= Xml\Dom\Text.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\xpnet\BufferAggregate.cs AAQAAAAAAAAAAAAEAAEAAAAAEAAAAAAAAAAAAAFAQAA= Xml\xpnet\ContentToken.cs AAAgCAAAAAAABQAAAABA0AAQACAAABAICABAIgAAAAE= Xml\xpnet\Encoding.cs EZWCkgFaBdKJpMX5gUNpkBIYWARQBABXGghHYAAhSKA= Xml\xpnet\Exceptions.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\xpnet\Exceptions.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\xpnet\Exceptions.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\xpnet\Exceptions.cs AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAgA= Xml\xpnet\Exceptions.cs AACAAAgAAAAAAAAAAAAAAAAKAAABAAAAAQAAAAAAgAA= Xml\xpnet\Exceptions.cs AAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\xpnet\Exceptions.cs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Xml\xpnet\NS.cs AAAAAAAAAECAAAAEAAAAAAQAAAAAAAAAAAAAAABABgA= Xml\xpnet\Position.cs AAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAABBA= Xml\xpnet\Token.cs AAACBAAAAgEAAAAACAAAAAAAAAAAAAAACAAAAQAAAAQ= Xml\xpnet\UTF8Encoding.cs EAAAAAAAAAAIgAAAAAAoBAAACABAAAAAAAAAAAAAAAA= IO\Compression\Deflater.cs AQIYAAIAYAAFTiAQAABQAAEBAAECAAAEBoQQBAQYQKg= XmppClientConnectionState.cs AABAQAAAAQgAQAACAAAAAAABAAAACAAAAAAAAiAAACA= net\SocketConnectionType.cs AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= protocol\client\Error.cs KAABAGAIAAAGAAAgAAQAgAAQAIEAACQAAAAEAgAgAAI= protocol\client\Error.cs AABAAAABACAAAAAAAAAAAAAAAAAAAAAEEAAAAAAAAAA= protocol\client\Error.cs CEEBAAAIAAAEAAAgIAUAAAAAAIEAAAAEAAAEAgAEAAA= protocol\client\IQ.cs AAAAAAAAAAAAAAAABAUAQAAAAAAAAAAAAAAAAAAAAAA= protocol\client\MessageType.cs AAAAAAAAAAAAAAAgAAEAAAgAAAAAAAAAAAAIAAAQAAA= protocol\client\PresenceType.cs AIAAAAAAAAAAEAAACEEAAAIAAABAAAAAAAAgAAAAAAA= protocol\client\ShowType.cs AACAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAIAAAAAAA= protocol\component\accept\Log.cs AAAAgAAAAAAAAAAAAQCAAAAAAAAAgAAAQAABAAAAAAA= protocol\component\accept\Route.cs AAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAEAAAAAAAAAA= protocol\iq\disco\DiscoItem.cs AAAAAAAAAAAAAAAEAQAAAAAAAAAAAAAAAAAAAAAEAAA= protocol\iq\roster\RosterItem.cs AAAAAAAAAAAAAAAAAQAAAAIAAABAAAAAAAAAAAAAAAA= protocol\iq\roster\RosterItem.cs AQAAAAIAAAAAAAAEAAAAAAoAAAAAAAAAAAAAAAAAAAA= protocol\iq\vcard\Address.cs AAAABAAAAAAAAAAAAQAAAAAAAAAAAAAAAAgAAAAAAAA= protocol\iq\vcard\Email.cs AAAARAAAAAAAAAAAAQAAAAAAAAAAAAAAAAgAAAAACAA= protocol\iq\vcard\Telephone.cs AAAABAAAAAAAAAAAAQAAAAAAAAAAAAAAAAgAAAAAAAA= protocol\iq\vcard\Telephone.cs AAAAACACAQAAJAAAAQAEAAAAAAAAAAEEAAAAACQAQAA= protocol\sasl\Mechanism.cs AgAAAAIACAgSAAAAAQCAAAAACBABAgBAAACggSCBAoI= protocol\x\data\Data.cs AQBAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAE= protocol\x\data\FieldTypes.cs AAAAAAAAAQAAAAAAAAEAACAAAAAQAAAAEAAIAAFEABA= protocol\x\rosterx\RosterItem.cs AAAAAAAAACAAAAAEAQAAAAAAAAAAAAAAAAAAAAACAAA= Xml\Dom\Node.cs AAAAAAAEQAAAAAAAAAgAAAAAAAAAQAACAAAACAAAAAA= Xml\xpnet\Encoding.cs AARCAi6IACErBAIAABAEAgAAgAAICAAQBBACAHKggUA= IqGrabber.cs AAAAAACAAAAAAAAAAAAAAAAQAAAABAAAAAAAAAAAAAA= MessageGrabber.cs AAAAAAAAAAAAAAAAAAAAAAAQAAAABAAAAAAAAAAABAA= PresenceGrabber.cs AAIAAAAAAAAAAAAAAAAAAAAQAAAABAAAAAAAAAAAAAA= SaslEventArgs.cs AAAAAAAAAAAAAAIAAAAAAAAQAAAAAAAAAAAAAAAAAAA= StreamParser.cs AAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAAAAAAAAAAAA= StreamParser.cs AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAA= XmppClientConnection.cs AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAA= XmppClientConnection.cs AAAAAAAAAAAAAAAAAAAAAAAQAAACAAAAAAAAAAAAAAA= XmppClientConnection.cs AAAAAAAAAAAAAAAAAAAAAQAQAAAAAAAAAAAAAAAAAAA= XmppConnection.cs AAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAA= smuxi-1.1/lib/agsxmpp/agsxmpp/Factory/0000755000175000017500000000000012204443225020627 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Factory/ElementFactory.cs0000644000175000017500000006121312204443225024102 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using agsXMPP.Xml.Dom; namespace agsXMPP.Factory { /// /// Factory class that implements the factory pattern for builing our Elements. /// public class ElementFactory { /// /// This Hashtable stores Mapping of protocol (tag/namespace) to the agsXMPP objects /// private static Hashtable m_table = new Hashtable(); static ElementFactory() { AddElementType("iq", Uri.CLIENT, typeof(agsXMPP.protocol.client.IQ)); AddElementType("message", Uri.CLIENT, typeof(agsXMPP.protocol.client.Message)); AddElementType("presence", Uri.CLIENT, typeof(agsXMPP.protocol.client.Presence)); AddElementType("error", Uri.CLIENT, typeof(agsXMPP.protocol.client.Error)); AddElementType("agent", Uri.IQ_AGENTS, typeof(agsXMPP.protocol.iq.agent.Agent)); AddElementType("item", Uri.IQ_ROSTER, typeof(agsXMPP.protocol.iq.roster.RosterItem)); AddElementType("group", Uri.IQ_ROSTER, typeof(agsXMPP.protocol.Base.Group)); AddElementType("group", Uri.X_ROSTERX, typeof(agsXMPP.protocol.Base.Group)); AddElementType("item", Uri.IQ_SEARCH, typeof(agsXMPP.protocol.iq.search.SearchItem)); // Stream stuff AddElementType("stream", Uri.STREAM, typeof(agsXMPP.protocol.Stream)); AddElementType("error", Uri.STREAM, typeof(agsXMPP.protocol.Error)); AddElementType("query", Uri.IQ_AUTH, typeof(agsXMPP.protocol.iq.auth.Auth)); AddElementType("query", Uri.IQ_AGENTS, typeof(agsXMPP.protocol.iq.agent.Agents)); AddElementType("query", Uri.IQ_ROSTER, typeof(agsXMPP.protocol.iq.roster.Roster)); AddElementType("query", Uri.IQ_LAST, typeof(agsXMPP.protocol.iq.last.Last)); AddElementType("query", Uri.IQ_VERSION, typeof(agsXMPP.protocol.iq.version.Version)); AddElementType("query", Uri.IQ_TIME, typeof(agsXMPP.protocol.iq.time.Time)); AddElementType("query", Uri.IQ_OOB, typeof(agsXMPP.protocol.iq.oob.Oob)); AddElementType("query", Uri.IQ_SEARCH, typeof(agsXMPP.protocol.iq.search.Search)); AddElementType("query", Uri.IQ_BROWSE, typeof(agsXMPP.protocol.iq.browse.Browse)); AddElementType("query", Uri.IQ_AVATAR, typeof(agsXMPP.protocol.iq.avatar.Avatar)); AddElementType("query", Uri.IQ_REGISTER, typeof(agsXMPP.protocol.iq.register.Register)); AddElementType("query", Uri.IQ_PRIVATE, typeof(agsXMPP.protocol.iq.@private.Private)); // Privacy Lists AddElementType("query", Uri.IQ_PRIVACY, typeof(agsXMPP.protocol.iq.privacy.Privacy)); AddElementType("item", Uri.IQ_PRIVACY, typeof(agsXMPP.protocol.iq.privacy.Item)); AddElementType("list", Uri.IQ_PRIVACY, typeof(agsXMPP.protocol.iq.privacy.List)); AddElementType("active", Uri.IQ_PRIVACY, typeof(agsXMPP.protocol.iq.privacy.Active)); AddElementType("default", Uri.IQ_PRIVACY, typeof(agsXMPP.protocol.iq.privacy.Default)); // Browse AddElementType("service", Uri.IQ_BROWSE, typeof(agsXMPP.protocol.iq.browse.Service)); AddElementType("item", Uri.IQ_BROWSE, typeof(agsXMPP.protocol.iq.browse.BrowseItem)); // Service Discovery AddElementType("query", Uri.DISCO_ITEMS, typeof(agsXMPP.protocol.iq.disco.DiscoItems)); AddElementType("query", Uri.DISCO_INFO, typeof(agsXMPP.protocol.iq.disco.DiscoInfo)); AddElementType("feature", Uri.DISCO_INFO, typeof(agsXMPP.protocol.iq.disco.DiscoFeature)); AddElementType("identity", Uri.DISCO_INFO, typeof(agsXMPP.protocol.iq.disco.DiscoIdentity)); AddElementType("item", Uri.DISCO_ITEMS, typeof(agsXMPP.protocol.iq.disco.DiscoItem)); AddElementType("x", Uri.X_DELAY, typeof(agsXMPP.protocol.x.Delay)); AddElementType("x", Uri.X_AVATAR, typeof(agsXMPP.protocol.x.Avatar)); AddElementType("x", Uri.X_CONFERENCE, typeof(agsXMPP.protocol.x.Conference)); AddElementType("x", Uri.X_EVENT, typeof(agsXMPP.protocol.x.Event)); //AddElementType("x", Uri.STORAGE_AVATAR, typeof(agsXMPP.protocol.storage.Avatar)); AddElementType("query", Uri.STORAGE_AVATAR, typeof(agsXMPP.protocol.storage.Avatar)); // XData Stuff AddElementType("x", Uri.X_DATA, typeof(agsXMPP.protocol.x.data.Data)); AddElementType("field", Uri.X_DATA, typeof(agsXMPP.protocol.x.data.Field)); AddElementType("option", Uri.X_DATA, typeof(agsXMPP.protocol.x.data.Option)); AddElementType("value", Uri.X_DATA, typeof(agsXMPP.protocol.x.data.Value)); AddElementType("reported", Uri.X_DATA, typeof(agsXMPP.protocol.x.data.Reported)); AddElementType("item", Uri.X_DATA, typeof(agsXMPP.protocol.x.data.Item)); AddElementType("features", Uri.STREAM, typeof(agsXMPP.protocol.stream.Features)); AddElementType("register", Uri.FEATURE_IQ_REGISTER, typeof(agsXMPP.protocol.stream.feature.Register)); AddElementType("compression", Uri.FEATURE_COMPRESS, typeof(agsXMPP.protocol.stream.feature.compression.Compression)); AddElementType("method", Uri.FEATURE_COMPRESS, typeof(agsXMPP.protocol.stream.feature.compression.Method)); AddElementType("bind", Uri.BIND, typeof(agsXMPP.protocol.iq.bind.Bind)); AddElementType("session", Uri.SESSION, typeof(agsXMPP.protocol.iq.session.Session)); // TLS stuff AddElementType("failure", Uri.TLS, typeof(agsXMPP.protocol.tls.Failure)); AddElementType("proceed", Uri.TLS, typeof(agsXMPP.protocol.tls.Proceed)); AddElementType("starttls", Uri.TLS, typeof(agsXMPP.protocol.tls.StartTls)); // SASL stuff AddElementType("mechanisms", Uri.SASL, typeof(agsXMPP.protocol.sasl.Mechanisms)); AddElementType("mechanism", Uri.SASL, typeof(agsXMPP.protocol.sasl.Mechanism)); AddElementType("auth", Uri.SASL, typeof(agsXMPP.protocol.sasl.Auth)); AddElementType("response", Uri.SASL, typeof(agsXMPP.protocol.sasl.Response)); AddElementType("challenge", Uri.SASL, typeof(agsXMPP.protocol.sasl.Challenge)); // TODO, this is a dirty hacks for the buggy BOSH Proxy // BEGIN AddElementType("challenge", Uri.CLIENT, typeof(agsXMPP.protocol.sasl.Challenge)); AddElementType("success", Uri.CLIENT, typeof(agsXMPP.protocol.sasl.Success)); // END AddElementType("failure", Uri.SASL, typeof(agsXMPP.protocol.sasl.Failure)); AddElementType("abort", Uri.SASL, typeof(agsXMPP.protocol.sasl.Abort)); AddElementType("success", Uri.SASL, typeof(agsXMPP.protocol.sasl.Success)); // Vcard stuff AddElementType("vCard", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Vcard)); AddElementType("TEL", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Telephone)); AddElementType("ORG", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Organization)); AddElementType("N", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Name)); AddElementType("EMAIL", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Email)); AddElementType("ADR", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Address)); #if !CF AddElementType("PHOTO", Uri.VCARD, typeof(agsXMPP.protocol.iq.vcard.Photo)); #endif // Server stuff //AddElementType("stream", Uri.SERVER, typeof(agsXMPP.protocol.server.Stream)); //AddElementType("message", Uri.SERVER, typeof(agsXMPP.protocol.server.Message)); // Component stuff AddElementType("handshake", Uri.ACCEPT, typeof(agsXMPP.protocol.component.Handshake)); AddElementType("log", Uri.ACCEPT, typeof(agsXMPP.protocol.component.Log)); AddElementType("route", Uri.ACCEPT, typeof(agsXMPP.protocol.component.Route)); AddElementType("iq", Uri.ACCEPT, typeof(agsXMPP.protocol.component.IQ)); AddElementType("message", Uri.ACCEPT, typeof(agsXMPP.protocol.component.Message)); AddElementType("presence", Uri.ACCEPT, typeof(agsXMPP.protocol.component.Presence)); AddElementType("error", Uri.ACCEPT, typeof(agsXMPP.protocol.component.Error)); //Extensions (JEPS) AddElementType("header", Uri.SHIM, typeof(agsXMPP.protocol.extensions.shim.Header)); AddElementType("headers", Uri.SHIM, typeof(agsXMPP.protocol.extensions.shim.Headers)); AddElementType("roster", Uri.ROSTER_DELIMITER, typeof(agsXMPP.protocol.iq.roster.Delimiter)); AddElementType("p", Uri.PRIMARY, typeof(agsXMPP.protocol.extensions.primary.Primary)); AddElementType("nick", Uri.NICK, typeof(agsXMPP.protocol.extensions.nickname.Nickname)); AddElementType("item", Uri.X_ROSTERX, typeof(agsXMPP.protocol.x.rosterx.RosterItem)); AddElementType("x", Uri.X_ROSTERX, typeof(agsXMPP.protocol.x.rosterx.RosterX)); // Filetransfer stuff AddElementType("file", Uri.SI_FILE_TRANSFER, typeof(agsXMPP.protocol.extensions.filetransfer.File)); AddElementType("range", Uri.SI_FILE_TRANSFER, typeof(agsXMPP.protocol.extensions.filetransfer.Range)); // FeatureNeg AddElementType("feature", Uri.FEATURE_NEG, typeof(agsXMPP.protocol.extensions.featureneg.FeatureNeg)); // Bytestreams AddElementType("query", Uri.BYTESTREAMS, typeof(agsXMPP.protocol.extensions.bytestreams.ByteStream)); AddElementType("streamhost", Uri.BYTESTREAMS, typeof(agsXMPP.protocol.extensions.bytestreams.StreamHost)); AddElementType("streamhost-used", Uri.BYTESTREAMS, typeof(agsXMPP.protocol.extensions.bytestreams.StreamHostUsed)); AddElementType("activate", Uri.BYTESTREAMS, typeof(agsXMPP.protocol.extensions.bytestreams.Activate)); AddElementType("udpsuccess", Uri.BYTESTREAMS, typeof(agsXMPP.protocol.extensions.bytestreams.UdpSuccess)); AddElementType("si", Uri.SI, typeof(agsXMPP.protocol.extensions.si.SI)); AddElementType("html", Uri.XHTML_IM, typeof(agsXMPP.protocol.extensions.html.Html)); AddElementType("body", Uri.XHTML, typeof(agsXMPP.protocol.extensions.html.Body)); AddElementType("compressed", Uri.COMPRESS, typeof(agsXMPP.protocol.extensions.compression.Compressed)); AddElementType("compress", Uri.COMPRESS, typeof(agsXMPP.protocol.extensions.compression.Compress)); AddElementType("failure", Uri.COMPRESS, typeof(agsXMPP.protocol.extensions.compression.Failure)); // MUC (JEP-0045 Multi User Chat) AddElementType("x", Uri.MUC, typeof(agsXMPP.protocol.x.muc.Muc)); AddElementType("x", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.User)); AddElementType("item", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.Item)); AddElementType("status", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.Status)); AddElementType("invite", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.Invite)); AddElementType("decline", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.Decline)); AddElementType("actor", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.Actor)); AddElementType("history", Uri.MUC, typeof(agsXMPP.protocol.x.muc.History)); AddElementType("query", Uri.MUC_ADMIN, typeof(agsXMPP.protocol.x.muc.iq.admin.Admin)); AddElementType("item", Uri.MUC_ADMIN, typeof(agsXMPP.protocol.x.muc.iq.admin.Item)); AddElementType("query", Uri.MUC_OWNER, typeof(agsXMPP.protocol.x.muc.iq.owner.Owner)); AddElementType("destroy", Uri.MUC_OWNER, typeof(agsXMPP.protocol.x.muc.owner.Destroy)); AddElementType("destroy", Uri.MUC_USER, typeof(agsXMPP.protocol.x.muc.user.Destroy)); //Jabber RPC JEP 0009 AddElementType("query", Uri.IQ_RPC, typeof(agsXMPP.protocol.iq.rpc.Rpc)); AddElementType("methodCall", Uri.IQ_RPC, typeof(agsXMPP.protocol.iq.rpc.MethodCall)); AddElementType("methodResponse", Uri.IQ_RPC, typeof(agsXMPP.protocol.iq.rpc.MethodResponse)); // Chatstates Jep-0085 AddElementType("active", Uri.CHATSTATES, typeof(agsXMPP.protocol.extensions.chatstates.Active)); AddElementType("inactive", Uri.CHATSTATES, typeof(agsXMPP.protocol.extensions.chatstates.Inactive)); AddElementType("composing", Uri.CHATSTATES, typeof(agsXMPP.protocol.extensions.chatstates.Composing)); AddElementType("paused", Uri.CHATSTATES, typeof(agsXMPP.protocol.extensions.chatstates.Paused)); AddElementType("gone", Uri.CHATSTATES, typeof(agsXMPP.protocol.extensions.chatstates.Gone)); // Jivesoftware Extenstions AddElementType("phone-event", Uri.JIVESOFTWARE_PHONE, typeof(agsXMPP.protocol.extensions.jivesoftware.phone.PhoneEvent)); AddElementType("phone-action", Uri.JIVESOFTWARE_PHONE, typeof(agsXMPP.protocol.extensions.jivesoftware.phone.PhoneAction)); AddElementType("phone-status", Uri.JIVESOFTWARE_PHONE, typeof(agsXMPP.protocol.extensions.jivesoftware.phone.PhoneStatus)); // Jingle stuff is in heavy development, we commit this once the most changes on the Jeps are done //AddElementType("jingle", Uri.JINGLE, typeof(agsXMPP.protocol.extensions.jingle.Jingle)); //AddElementType("candidate", Uri.JINGLE, typeof(agsXMPP.protocol.extensions.jingle.Candidate)); AddElementType("c", Uri.CAPS, typeof(agsXMPP.protocol.extensions.caps.Capabilities)); AddElementType("geoloc", Uri.GEOLOC, typeof(agsXMPP.protocol.extensions.geoloc.GeoLoc)); // Xmpp Ping AddElementType("ping", Uri.PING, typeof(agsXMPP.protocol.extensions.ping.Ping)); //Ad-Hock Commands AddElementType("command", Uri.COMMANDS, typeof(agsXMPP.protocol.extensions.commands.Command)); AddElementType("actions", Uri.COMMANDS, typeof(agsXMPP.protocol.extensions.commands.Actions)); AddElementType("note", Uri.COMMANDS, typeof(agsXMPP.protocol.extensions.commands.Note)); // ********** // * PubSub * // ********** // Owner namespace AddElementType("affiliate", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Affiliate)); AddElementType("affiliates", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Affiliates)); AddElementType("configure", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Configure)); AddElementType("delete", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Delete)); AddElementType("pending", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Pending)); AddElementType("pubsub", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.PubSub)); AddElementType("purge", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Purge)); AddElementType("subscriber", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Subscriber)); AddElementType("subscribers", Uri.PUBSUB_OWNER, typeof(agsXMPP.protocol.extensions.pubsub.owner.Subscribers)); // Event namespace AddElementType("delete", Uri.PUBSUB_EVENT, typeof(agsXMPP.protocol.extensions.pubsub.@event.Delete)); AddElementType("event", Uri.PUBSUB_EVENT, typeof(agsXMPP.protocol.extensions.pubsub.@event.Event)); AddElementType("item", Uri.PUBSUB_EVENT, typeof(agsXMPP.protocol.extensions.pubsub.@event.Item)); AddElementType("items", Uri.PUBSUB_EVENT, typeof(agsXMPP.protocol.extensions.pubsub.@event.Items)); AddElementType("purge", Uri.PUBSUB_EVENT, typeof(agsXMPP.protocol.extensions.pubsub.@event.Purge)); // Main Pubsub namespace AddElementType("affiliation", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Affiliation)); AddElementType("affiliations", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Affiliations)); AddElementType("configure", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Configure)); AddElementType("create", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Create)); AddElementType("configure", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Configure)); AddElementType("item", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Item)); AddElementType("items", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Items)); AddElementType("options", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Options)); AddElementType("publish", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Publish)); AddElementType("pubsub", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.PubSub)); AddElementType("retract", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Retract)); AddElementType("subscribe", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Subscribe)); AddElementType("subscribe-options", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.SubscribeOptions)); AddElementType("subscription", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Subscription)); AddElementType("subscriptions", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Subscriptions)); AddElementType("unsubscribe", Uri.PUBSUB, typeof(agsXMPP.protocol.extensions.pubsub.Unsubscribe)); // HTTP Binding XEP-0124 AddElementType("body", Uri.HTTP_BIND, typeof(agsXMPP.protocol.extensions.bosh.Body)); // Message receipts XEP-0184 AddElementType("received", Uri.MSG_RECEIPT, typeof(agsXMPP.protocol.extensions.msgreceipts.Received)); AddElementType("request", Uri.MSG_RECEIPT, typeof(agsXMPP.protocol.extensions.msgreceipts.Request)); // Bookmark storage XEP-0048 AddElementType("storage", Uri.STORAGE_BOOKMARKS, typeof(agsXMPP.protocol.extensions.bookmarks.Storage)); AddElementType("url", Uri.STORAGE_BOOKMARKS, typeof(agsXMPP.protocol.extensions.bookmarks.Url)); AddElementType("conference", Uri.STORAGE_BOOKMARKS, typeof(agsXMPP.protocol.extensions.bookmarks.Conference)); // XEP-0047: In-Band Bytestreams (IBB) AddElementType("open", Uri.IBB, typeof(agsXMPP.protocol.extensions.ibb.Open)); AddElementType("data", Uri.IBB, typeof(agsXMPP.protocol.extensions.ibb.Data)); AddElementType("close", Uri.IBB, typeof(agsXMPP.protocol.extensions.ibb.Close)); // XEP-0153: vCard-Based Avatars AddElementType("x", Uri.VCARD_UPDATE, typeof(agsXMPP.protocol.x.vcard_update.VcardUpdate)); // AMP AddElementType("amp", Uri.AMP, typeof(agsXMPP.protocol.extensions.amp.Amp)); AddElementType("rule", Uri.AMP, typeof(agsXMPP.protocol.extensions.amp.Rule)); // Urn Time AddElementType("time", Uri.URN_TIME, typeof(agsXMPP.protocol.time.Time)); // XEP-0145 Annotations AddElementType("storage", Uri.STORAGE_ROSTERNOTES, typeof(agsXMPP.protocol.extensions.bookmarks.RosterNotes)); AddElementType("note", Uri.STORAGE_ROSTERNOTES, typeof(agsXMPP.protocol.extensions.bookmarks.RosterNote)); } /// /// Adds new Element Types to the Hashtable /// Use this function also to register your own created Elements. /// If a element is already registered it gets overwritten. This behaviour is also useful if you you want to overwrite /// classes and add your own derived classes to the factory. /// /// FQN /// /// public static void AddElementType(string tag, string ns, System.Type t) { ElementType et = new ElementType(tag, ns); string key = et.ToString(); // added thread safety on a user request lock (m_table) { if (m_table.ContainsKey(key)) m_table[key] = t; else m_table.Add(et.ToString(), t); } } /// /// /// /// /// /// /// public static Element GetElement(string prefix, string tag, string ns) { if (ns == null) ns = ""; ElementType et = new ElementType(tag, ns); System.Type t = (System.Type) m_table[et.ToString()]; Element ret; if (t != null) ret = (Element) System.Activator.CreateInstance(t); else ret = new Element(tag); ret.Prefix = prefix; if (ns!="") ret.Namespace = ns; return ret; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Factory/SaslFactory.cs0000644000175000017500000000643112204443225023414 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using agsXMPP.Sasl; using agsXMPP.Sasl.Facebook; using agsXMPP.Sasl.Plain; using agsXMPP.Sasl.DigestMD5; using agsXMPP.Sasl.Anonymous; using agsXMPP.Sasl.XGoogleToken; #if !(CF || CF_2) using agsXMPP.Sasl.Scram; #endif #if !(CF || CF_2 || MONO) using agsXMPP.Sasl.Gssapi; #endif namespace agsXMPP.Factory { /// /// SASL factory /// public class SaslFactory { /// /// This Hashtable stores Mapping of mechanism <--> SASL class in agsXMPP /// private static readonly Hashtable m_table = new Hashtable(); static SaslFactory() { AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.PLAIN), typeof(PlainMechanism)); AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.DIGEST_MD5), typeof(DigestMD5Mechanism)); AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.ANONYMOUS), typeof(AnonymousMechanism)); AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.X_GOOGLE_TOKEN), typeof(XGoogleTokenMechanism)); AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.X_FACEBOOK_PLATFORM), typeof(FacebookMechanism)); #if !(CF || CF_2) AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.SCRAM_SHA_1), typeof(ScramSha1Mechanism)); #endif #if !(CF || CF_2 || MONO) AddMechanism(protocol.sasl.Mechanism.GetMechanismName(protocol.sasl.MechanismType.GSSAPI), typeof(GssapiMechanism)); #endif } public static Mechanism GetMechanism(string mechanism) { var t = (Type) m_table[mechanism]; if (t != null) return (Mechanism) Activator.CreateInstance(t); else return null; } /// /// Adds new Element Types to the Hashtable /// Use this function to register new SASL mechanisms /// /// /// public static void AddMechanism(string mechanism, System.Type t) { m_table.Add( mechanism, t); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Factory/ElementType.cs0000644000175000017500000000356712204443225023424 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.Factory { /// /// /// public class ElementType { private string m_TagName; private string m_Namespace; /// /// /// /// /// public ElementType(string TagName, string Namespace) { this.m_TagName = TagName; this.m_Namespace = Namespace; } public override string ToString() { if ((m_Namespace != null) && (m_Namespace != string.Empty)) { return (m_Namespace + ":" + m_TagName); } return m_TagName; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/0000755000175000017500000000000012204443225017732 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/Punycode.cs0000644000175000017500000001446012204443225022054 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; using System.Text; namespace agsXMPP.Idn { public class Punycode { /* Punycode parameters */ internal const int TMIN = 1; internal const int TMAX = 26; internal const int BASE = 36; internal const int INITIAL_N = 128; internal const int INITIAL_BIAS = 72; internal const int DAMP = 700; internal const int SKEW = 38; internal const char DELIMITER = '-'; /// /// Punycodes a unicode string. /// /// Unicode string. /// Punycoded string. public static string Encode(string input) { int n = INITIAL_N; int delta = 0; int bias = INITIAL_BIAS; StringBuilder output = new StringBuilder(); // Copy all basic code points to the output int b = 0; for (int i = 0; i < input.Length; i++) { char c = input[i]; if (IsBasic(c)) { output.Append(c); b++; } } // Append delimiter if (b > 0) { output.Append(DELIMITER); } int h = b; while (h < input.Length) { int m = System.Int32.MaxValue; // Find the minimum code point >= n for (int i = 0; i < input.Length; i++) { int c = input[i]; if (c >= n && c < m) { m = c; } } if (m - n > (System.Int32.MaxValue - delta) / (h + 1)) { throw new PunycodeException(PunycodeException.OVERFLOW); } delta = delta + (m - n) * (h + 1); n = m; for (int j = 0; j < input.Length; j++) { int c = input[j]; if (c < n) { delta++; if (0 == delta) { throw new PunycodeException(PunycodeException.OVERFLOW); } } if (c == n) { int q = delta; for (int k = BASE; ; k += BASE) { int t; if (k <= bias) { t = TMIN; } else if (k >= bias + TMAX) { t = TMAX; } else { t = k - bias; } if (q < t) { break; } output.Append((char) Digit2Codepoint(t + (q - t) % (BASE - t))); q = (q - t) / (BASE - t); } output.Append((char) Digit2Codepoint(q)); bias = Adapt(delta, h + 1, h == b); delta = 0; h++; } } delta++; n++; } return output.ToString(); } /// /// Decode a punycoded string. /// /// Punycode string /// Unicode string. public static string Decode(string input) { int n = INITIAL_N; int i = 0; int bias = INITIAL_BIAS; StringBuilder output = new StringBuilder(); int d = input.LastIndexOf((System.Char) DELIMITER); if (d > 0) { for (int j = 0; j < d; j++) { char c = input[j]; if (!IsBasic(c)) { throw new PunycodeException(PunycodeException.BAD_INPUT); } output.Append(c); } d++; } else { d = 0; } while (d < input.Length) { int oldi = i; int w = 1; for (int k = BASE; ; k += BASE) { if (d == input.Length) { throw new PunycodeException(PunycodeException.BAD_INPUT); } int c = input[d++]; int digit = Codepoint2Digit(c); if (digit > (System.Int32.MaxValue - i) / w) { throw new PunycodeException(PunycodeException.OVERFLOW); } i = i + digit * w; int t; if (k <= bias) { t = TMIN; } else if (k >= bias + TMAX) { t = TMAX; } else { t = k - bias; } if (digit < t) { break; } w = w * (BASE - t); } bias = Adapt(i - oldi, output.Length + 1, oldi == 0); if (i / (output.Length + 1) > Int32.MaxValue - n) { throw new PunycodeException(PunycodeException.OVERFLOW); } n = n + i / (output.Length + 1); i = i % (output.Length + 1); // following overload is not supported on CF //output.Insert(i,(char) n); output.Insert(i, new char[1] { (char) n }); i++; } return output.ToString(); } public static int Adapt(int delta, int numpoints, bool first) { if (first) { delta = delta / DAMP; } else { delta = delta / 2; } delta = delta + (delta / numpoints); int k = 0; while (delta > ((BASE - TMIN) * TMAX) / 2) { delta = delta / (BASE - TMIN); k = k + BASE; } return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW); } public static bool IsBasic(char c) { return c < 0x80; } public static int Digit2Codepoint(int d) { if (d < 26) { // 0..25 : 'a'..'z' return d + 'a'; } else if (d < 36) { // 26..35 : '0'..'9'; return d - 26 + '0'; } else { throw new PunycodeException(PunycodeException.BAD_INPUT); } } public static int Codepoint2Digit(int c) { if (c - '0' < 10) { // '0'..'9' : 26..35 return c - '0' + 26; } else if (c - 'a' < 26) { // 'a'..'z' : 0..25 return c - 'a'; } else { throw new PunycodeException(PunycodeException.BAD_INPUT); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/StringprepException.cs0000644000175000017500000000277212204443225024305 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; namespace agsXMPP.Idn { public class StringprepException : Exception { public static string CONTAINS_UNASSIGNED = "Contains unassigned code points."; public static string CONTAINS_PROHIBITED = "Contains prohibited code points."; public static string BIDI_BOTHRAL = "Contains both R and AL code points."; public static string BIDI_LTRAL = "Leading and trailing code points not both R or AL."; public StringprepException(string message) : base(message) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/Composition.cs0000644000175000017500000016172012204443225022573 0ustar00meebeymeebey00000000000000// Do not edit !!! // this file is generated automatically namespace agsXMPP.Idn { public class Composition { /* jagged Array */ public static readonly char[][] multiFirst = new char[][] { new char[] { '\u00C0', '\u00C1', '\u00C2', '\u00C3', '\u0100', '\u0102', '\u0226', '\u00C4', '\u1EA2', '\u00C5', '\u01CD', '\u0200', '\u0202', '\u1EA0', '\u1E00', '\u0104', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E02', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E04', '\u0000', '\u0000', '\u1E06', }, new char[] { '\u0000', '\u0106', '\u0108', '\u0000', '\u0000', '\u0000', '\u010A', '\u0000', '\u0000', '\u0000', '\u010C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u00C7', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E0A', '\u0000', '\u0000', '\u0000', '\u010E', '\u0000', '\u0000', '\u1E0C', '\u0000', '\u0000', '\u1E0E', '\u1E10', '\u1E12', }, new char[] { '\u00C8', '\u00C9', '\u00CA', '\u1EBC', '\u0112', '\u0114', '\u0116', '\u00CB', '\u1EBA', '\u0000', '\u011A', '\u0204', '\u0206', '\u1EB8', '\u0000', '\u0118', '\u0000', '\u0228', '\u1E18', '\u1E1A', }, new char[] { '\u0000', '\u01F4', '\u011C', '\u0000', '\u1E20', '\u011E', '\u0120', '\u0000', '\u0000', '\u0000', '\u01E6', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0122', }, new char[] { '\u0000', '\u0000', '\u0124', '\u0000', '\u0000', '\u0000', '\u1E22', '\u1E26', '\u0000', '\u0000', '\u021E', '\u0000', '\u0000', '\u1E24', '\u0000', '\u0000', '\u0000', '\u1E28', '\u0000', '\u0000', '\u1E2A', }, new char[] { '\u00CC', '\u00CD', '\u00CE', '\u0128', '\u012A', '\u012C', '\u0130', '\u00CF', '\u1EC8', '\u0000', '\u01CF', '\u0208', '\u020A', '\u1ECA', '\u0000', '\u012E', '\u0000', '\u0000', '\u0000', '\u1E2C', }, new char[] { '\u0000', '\u1E30', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u01E8', '\u0000', '\u0000', '\u1E32', '\u0000', '\u0000', '\u1E34', '\u0136', }, new char[] { '\u0000', '\u0139', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u013D', '\u0000', '\u0000', '\u1E36', '\u0000', '\u0000', '\u1E3A', '\u013B', '\u1E3C', }, new char[] { '\u0000', '\u1E3E', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E40', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E42', }, new char[] { '\u01F8', '\u0143', '\u0000', '\u00D1', '\u0000', '\u0000', '\u1E44', '\u0000', '\u0000', '\u0000', '\u0147', '\u0000', '\u0000', '\u1E46', '\u0000', '\u0000', '\u1E48', '\u0145', '\u1E4A', }, new char[] { '\u00D2', '\u00D3', '\u00D4', '\u00D5', '\u014C', '\u014E', '\u022E', '\u00D6', '\u1ECE', '\u0000', '\u01D1', '\u020C', '\u020E', '\u1ECC', '\u0000', '\u01EA', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0150', '\u01A0', }, new char[] { '\u0000', '\u1E54', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E56', }, new char[] { '\u0000', '\u0154', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E58', '\u0000', '\u0000', '\u0000', '\u0158', '\u0210', '\u0212', '\u1E5A', '\u0000', '\u0000', '\u1E5E', '\u0156', }, new char[] { '\u0000', '\u015A', '\u015C', '\u0000', '\u0000', '\u0000', '\u1E60', '\u0000', '\u0000', '\u0000', '\u0160', '\u0000', '\u0000', '\u1E62', '\u0000', '\u0000', '\u0000', '\u015E', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0218', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E6A', '\u0000', '\u0000', '\u0000', '\u0164', '\u0000', '\u0000', '\u1E6C', '\u0000', '\u0000', '\u1E6E', '\u0162', '\u1E70', '\u0000', '\u0000', '\u0000', '\u0000', '\u021A', }, new char[] { '\u00D9', '\u00DA', '\u00DB', '\u0168', '\u016A', '\u016C', '\u0000', '\u00DC', '\u1EE6', '\u016E', '\u01D3', '\u0214', '\u0216', '\u1EE4', '\u0000', '\u0172', '\u0000', '\u0000', '\u1E76', '\u1E74', '\u0000', '\u0170', '\u01AF', '\u0000', '\u1E72', }, new char[] { '\u0000', '\u0000', '\u0000', '\u1E7C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E7E', }, new char[] { '\u1E80', '\u1E82', '\u0174', '\u0000', '\u0000', '\u0000', '\u1E86', '\u1E84', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E88', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E8A', '\u1E8C', }, new char[] { '\u1EF2', '\u00DD', '\u0176', '\u1EF8', '\u0232', '\u0000', '\u1E8E', '\u0178', '\u1EF6', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EF4', }, new char[] { '\u0000', '\u0179', '\u1E90', '\u0000', '\u0000', '\u0000', '\u017B', '\u0000', '\u0000', '\u0000', '\u017D', '\u0000', '\u0000', '\u1E92', '\u0000', '\u0000', '\u1E94', }, new char[] { '\u00E0', '\u00E1', '\u00E2', '\u00E3', '\u0101', '\u0103', '\u0227', '\u00E4', '\u1EA3', '\u00E5', '\u01CE', '\u0201', '\u0203', '\u1EA1', '\u1E01', '\u0105', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E03', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E05', '\u0000', '\u0000', '\u1E07', }, new char[] { '\u0000', '\u0107', '\u0109', '\u0000', '\u0000', '\u0000', '\u010B', '\u0000', '\u0000', '\u0000', '\u010D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u00E7', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E0B', '\u0000', '\u0000', '\u0000', '\u010F', '\u0000', '\u0000', '\u1E0D', '\u0000', '\u0000', '\u1E0F', '\u1E11', '\u1E13', }, new char[] { '\u00E8', '\u00E9', '\u00EA', '\u1EBD', '\u0113', '\u0115', '\u0117', '\u00EB', '\u1EBB', '\u0000', '\u011B', '\u0205', '\u0207', '\u1EB9', '\u0000', '\u0119', '\u0000', '\u0229', '\u1E19', '\u1E1B', }, new char[] { '\u0000', '\u01F5', '\u011D', '\u0000', '\u1E21', '\u011F', '\u0121', '\u0000', '\u0000', '\u0000', '\u01E7', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0123', }, new char[] { '\u0000', '\u0000', '\u0125', '\u0000', '\u0000', '\u0000', '\u1E23', '\u1E27', '\u0000', '\u0000', '\u021F', '\u0000', '\u0000', '\u1E25', '\u0000', '\u0000', '\u1E96', '\u1E29', '\u0000', '\u0000', '\u1E2B', }, new char[] { '\u00EC', '\u00ED', '\u00EE', '\u0129', '\u012B', '\u012D', '\u0000', '\u00EF', '\u1EC9', '\u0000', '\u01D0', '\u0209', '\u020B', '\u1ECB', '\u0000', '\u012F', '\u0000', '\u0000', '\u0000', '\u1E2D', }, new char[] { '\u0000', '\u0000', '\u0135', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u01F0', }, new char[] { '\u0000', '\u1E31', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u01E9', '\u0000', '\u0000', '\u1E33', '\u0000', '\u0000', '\u1E35', '\u0137', }, new char[] { '\u0000', '\u013A', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u013E', '\u0000', '\u0000', '\u1E37', '\u0000', '\u0000', '\u1E3B', '\u013C', '\u1E3D', }, new char[] { '\u0000', '\u1E3F', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E41', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E43', }, new char[] { '\u01F9', '\u0144', '\u0000', '\u00F1', '\u0000', '\u0000', '\u1E45', '\u0000', '\u0000', '\u0000', '\u0148', '\u0000', '\u0000', '\u1E47', '\u0000', '\u0000', '\u1E49', '\u0146', '\u1E4B', }, new char[] { '\u00F2', '\u00F3', '\u00F4', '\u00F5', '\u014D', '\u014F', '\u022F', '\u00F6', '\u1ECF', '\u0000', '\u01D2', '\u020D', '\u020F', '\u1ECD', '\u0000', '\u01EB', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0151', '\u01A1', }, new char[] { '\u0000', '\u1E55', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E57', }, new char[] { '\u0000', '\u0155', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E59', '\u0000', '\u0000', '\u0000', '\u0159', '\u0211', '\u0213', '\u1E5B', '\u0000', '\u0000', '\u1E5F', '\u0157', }, new char[] { '\u0000', '\u015B', '\u015D', '\u0000', '\u0000', '\u0000', '\u1E61', '\u0000', '\u0000', '\u0000', '\u0161', '\u0000', '\u0000', '\u1E63', '\u0000', '\u0000', '\u0000', '\u015F', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0219', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E6B', '\u1E97', '\u0000', '\u0000', '\u0165', '\u0000', '\u0000', '\u1E6D', '\u0000', '\u0000', '\u1E6F', '\u0163', '\u1E71', '\u0000', '\u0000', '\u0000', '\u0000', '\u021B', }, new char[] { '\u00F9', '\u00FA', '\u00FB', '\u0169', '\u016B', '\u016D', '\u0000', '\u00FC', '\u1EE7', '\u016F', '\u01D4', '\u0215', '\u0217', '\u1EE5', '\u0000', '\u0173', '\u0000', '\u0000', '\u1E77', '\u1E75', '\u0000', '\u0171', '\u01B0', '\u0000', '\u1E73', }, new char[] { '\u0000', '\u0000', '\u0000', '\u1E7D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E7F', }, new char[] { '\u1E81', '\u1E83', '\u0175', '\u0000', '\u0000', '\u0000', '\u1E87', '\u1E85', '\u0000', '\u1E98', '\u0000', '\u0000', '\u0000', '\u1E89', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1E8B', '\u1E8D', }, new char[] { '\u1EF3', '\u00FD', '\u0177', '\u1EF9', '\u0233', '\u0000', '\u1E8F', '\u00FF', '\u1EF7', '\u1E99', '\u0000', '\u0000', '\u0000', '\u1EF5', }, new char[] { '\u0000', '\u017A', '\u1E91', '\u0000', '\u0000', '\u0000', '\u017C', '\u0000', '\u0000', '\u0000', '\u017E', '\u0000', '\u0000', '\u1E93', '\u0000', '\u0000', '\u1E95', }, new char[] { '\u1FED', '\u0385', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FC1', }, new char[] { '\u1EA6', '\u1EA4', '\u0000', '\u1EAA', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EA8', }, new char[] { '\u0000', '\u01FC', '\u0000', '\u0000', '\u01E2', }, new char[] { '\u1EC0', '\u1EBE', '\u0000', '\u1EC4', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EC2', }, new char[] { '\u1ED2', '\u1ED0', '\u0000', '\u1ED6', '\u0000', '\u0000', '\u0000', '\u0000', '\u1ED4', }, new char[] { '\u0000', '\u1E4C', '\u0000', '\u0000', '\u022C', '\u0000', '\u0000', '\u1E4E', }, new char[] { '\u01DB', '\u01D7', '\u0000', '\u0000', '\u01D5', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u01D9', }, new char[] { '\u1EA7', '\u1EA5', '\u0000', '\u1EAB', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EA9', }, new char[] { '\u0000', '\u01FD', '\u0000', '\u0000', '\u01E3', }, new char[] { '\u1EC1', '\u1EBF', '\u0000', '\u1EC5', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EC3', }, new char[] { '\u1ED3', '\u1ED1', '\u0000', '\u1ED7', '\u0000', '\u0000', '\u0000', '\u0000', '\u1ED5', }, new char[] { '\u0000', '\u1E4D', '\u0000', '\u0000', '\u022D', '\u0000', '\u0000', '\u1E4F', }, new char[] { '\u01DC', '\u01D8', '\u0000', '\u0000', '\u01D6', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u01DA', }, new char[] { '\u1EB0', '\u1EAE', '\u0000', '\u1EB4', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EB2', }, new char[] { '\u1EB1', '\u1EAF', '\u0000', '\u1EB5', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EB3', }, new char[] { '\u1E14', '\u1E16', }, new char[] { '\u1E15', '\u1E17', }, new char[] { '\u1E50', '\u1E52', }, new char[] { '\u1E51', '\u1E53', }, new char[] { '\u1EDC', '\u1EDA', '\u0000', '\u1EE0', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EDE', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EE2', }, new char[] { '\u1EDD', '\u1EDB', '\u0000', '\u1EE1', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EDF', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EE3', }, new char[] { '\u1EEA', '\u1EE8', '\u0000', '\u1EEE', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EEC', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EF0', }, new char[] { '\u1EEB', '\u1EE9', '\u0000', '\u1EEF', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EED', '\u0000', '\u0000', '\u0000', '\u0000', '\u1EF1', }, new char[] { '\u1FBA', '\u0386', '\u0000', '\u0000', '\u1FB9', '\u1FB8', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F08', '\u1F09', '\u1FBC', }, new char[] { '\u1FC8', '\u0388', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F18', '\u1F19', }, new char[] { '\u1FCA', '\u0389', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F28', '\u1F29', '\u1FCC', }, new char[] { '\u1FDA', '\u038A', '\u0000', '\u0000', '\u1FD9', '\u1FD8', '\u0000', '\u03AA', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F38', '\u1F39', }, new char[] { '\u1FF8', '\u038C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F48', '\u1F49', }, new char[] { '\u1FEA', '\u038E', '\u0000', '\u0000', '\u1FE9', '\u1FE8', '\u0000', '\u03AB', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F59', }, new char[] { '\u1FFA', '\u038F', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F68', '\u1F69', '\u1FFC', }, new char[] { '\u1F70', '\u03AC', '\u0000', '\u0000', '\u1FB1', '\u1FB0', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FB6', '\u1F00', '\u1F01', '\u1FB3', }, new char[] { '\u1F72', '\u03AD', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F10', '\u1F11', }, new char[] { '\u1F74', '\u03AE', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FC6', '\u1F20', '\u1F21', '\u1FC3', }, new char[] { '\u1F76', '\u03AF', '\u0000', '\u0000', '\u1FD1', '\u1FD0', '\u0000', '\u03CA', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FD6', '\u1F30', '\u1F31', }, new char[] { '\u1F78', '\u03CC', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F40', '\u1F41', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FE4', '\u1FE5', }, new char[] { '\u1F7A', '\u03CD', '\u0000', '\u0000', '\u1FE1', '\u1FE0', '\u0000', '\u03CB', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FE6', '\u1F50', '\u1F51', }, new char[] { '\u1F7C', '\u03CE', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FF6', '\u1F60', '\u1F61', '\u1FF3', }, new char[] { '\u1FD2', '\u0390', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FD7', }, new char[] { '\u1FE2', '\u03B0', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FE7', }, new char[] { '\u0000', '\u03D3', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u03D4', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u04D0', '\u0000', '\u04D2', }, new char[] { '\u0400', '\u0000', '\u0000', '\u0000', '\u0000', '\u04D6', '\u0000', '\u0401', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u04C1', '\u0000', '\u04DC', }, new char[] { '\u040D', '\u0000', '\u0000', '\u0000', '\u04E2', '\u0419', '\u0000', '\u04E4', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u04EE', '\u040E', '\u0000', '\u04F0', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u04F2', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u04D1', '\u0000', '\u04D3', }, new char[] { '\u0450', '\u0000', '\u0000', '\u0000', '\u0000', '\u04D7', '\u0000', '\u0451', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u04C2', '\u0000', '\u04DD', }, new char[] { '\u045D', '\u0000', '\u0000', '\u0000', '\u04E3', '\u0439', '\u0000', '\u04E5', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u04EF', '\u045E', '\u0000', '\u04F1', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u04F3', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0623', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0BCA', '\u0BCC', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0CC7', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0D4A', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0DDA', }, new char[] { '\u0000', '\u0000', '\u1EAC', '\u0000', '\u0000', '\u1EB6', }, new char[] { '\u0000', '\u0000', '\u1EAD', '\u0000', '\u0000', '\u1EB7', }, new char[] { '\u1F02', '\u1F04', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F06', '\u0000', '\u0000', '\u1F80', }, new char[] { '\u1F03', '\u1F05', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F07', '\u0000', '\u0000', '\u1F81', }, new char[] { '\u1F0A', '\u1F0C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F0E', '\u0000', '\u0000', '\u1F88', }, new char[] { '\u1F0B', '\u1F0D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F0F', '\u0000', '\u0000', '\u1F89', }, new char[] { '\u1F12', '\u1F14', }, new char[] { '\u1F13', '\u1F15', }, new char[] { '\u1F1A', '\u1F1C', }, new char[] { '\u1F1B', '\u1F1D', }, new char[] { '\u1F22', '\u1F24', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F26', '\u0000', '\u0000', '\u1F90', }, new char[] { '\u1F23', '\u1F25', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F27', '\u0000', '\u0000', '\u1F91', }, new char[] { '\u1F2A', '\u1F2C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F2E', '\u0000', '\u0000', '\u1F98', }, new char[] { '\u1F2B', '\u1F2D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F2F', '\u0000', '\u0000', '\u1F99', }, new char[] { '\u1F32', '\u1F34', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F36', }, new char[] { '\u1F33', '\u1F35', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F37', }, new char[] { '\u1F3A', '\u1F3C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F3E', }, new char[] { '\u1F3B', '\u1F3D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F3F', }, new char[] { '\u1F42', '\u1F44', }, new char[] { '\u1F43', '\u1F45', }, new char[] { '\u1F4A', '\u1F4C', }, new char[] { '\u1F4B', '\u1F4D', }, new char[] { '\u1F52', '\u1F54', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F56', }, new char[] { '\u1F53', '\u1F55', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F57', }, new char[] { '\u1F5B', '\u1F5D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F5F', }, new char[] { '\u1F62', '\u1F64', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F66', '\u0000', '\u0000', '\u1FA0', }, new char[] { '\u1F63', '\u1F65', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F67', '\u0000', '\u0000', '\u1FA1', }, new char[] { '\u1F6A', '\u1F6C', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F6E', '\u0000', '\u0000', '\u1FA8', }, new char[] { '\u1F6B', '\u1F6D', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1F6F', '\u0000', '\u0000', '\u1FA9', }, new char[] { '\u1FCD', '\u1FCE', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FCF', }, new char[] { '\u1FDD', '\u1FDE', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u1FDF', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u3070', '\u3071', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u3073', '\u3074', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u3076', '\u3077', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u3079', '\u307A', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u307C', '\u307D', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u30D0', '\u30D1', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u30D3', '\u30D4', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u30D6', '\u30D7', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u30D9', '\u30DA', }, new char[] { '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u0000', '\u30DC', '\u30DD', }, }; public static readonly char[,] singleFirst = new char[,] { { '\u0338', '\u226E' }, { '\u0338', '\u2260' }, { '\u0338', '\u226F' }, { '\u0307', '\u1E1E' }, { '\u0302', '\u0134' }, { '\u0307', '\u1E1F' }, { '\u0304', '\u01DE' }, { '\u0301', '\u01FA' }, { '\u0301', '\u1E08' }, { '\u0301', '\u1E2E' }, { '\u0304', '\u022A' }, { '\u0301', '\u01FE' }, { '\u0304', '\u01DF' }, { '\u0301', '\u01FB' }, { '\u0301', '\u1E09' }, { '\u0301', '\u1E2F' }, { '\u0304', '\u022B' }, { '\u0301', '\u01FF' }, { '\u0307', '\u1E64' }, { '\u0307', '\u1E65' }, { '\u0307', '\u1E66' }, { '\u0307', '\u1E67' }, { '\u0301', '\u1E78' }, { '\u0301', '\u1E79' }, { '\u0308', '\u1E7A' }, { '\u0308', '\u1E7B' }, { '\u0307', '\u1E9B' }, { '\u030C', '\u01EE' }, { '\u0304', '\u01EC' }, { '\u0304', '\u01ED' }, { '\u0304', '\u01E0' }, { '\u0304', '\u01E1' }, { '\u0306', '\u1E1C' }, { '\u0306', '\u1E1D' }, { '\u0304', '\u0230' }, { '\u0304', '\u0231' }, { '\u030C', '\u01EF' }, { '\u0314', '\u1FEC' }, { '\u0345', '\u1FB4' }, { '\u0345', '\u1FC4' }, { '\u0345', '\u1FF4' }, { '\u0308', '\u0407' }, { '\u0301', '\u0403' }, { '\u0308', '\u04DE' }, { '\u0301', '\u040C' }, { '\u0308', '\u04E6' }, { '\u0308', '\u04F4' }, { '\u0308', '\u04F8' }, { '\u0308', '\u04EC' }, { '\u0301', '\u0453' }, { '\u0308', '\u04DF' }, { '\u0301', '\u045C' }, { '\u0308', '\u04E7' }, { '\u0308', '\u04F5' }, { '\u0308', '\u04F9' }, { '\u0308', '\u04ED' }, { '\u0308', '\u0457' }, { '\u030F', '\u0476' }, { '\u030F', '\u0477' }, { '\u0308', '\u04DA' }, { '\u0308', '\u04DB' }, { '\u0308', '\u04EA' }, { '\u0308', '\u04EB' }, { '\u0654', '\u0624' }, { '\u0654', '\u0626' }, { '\u0654', '\u06C2' }, { '\u0654', '\u06D3' }, { '\u0654', '\u06C0' }, { '\u093C', '\u0929' }, { '\u093C', '\u0931' }, { '\u093C', '\u0934' }, { '\u0BD7', '\u0B94' }, { '\u0BBE', '\u0BCB' }, { '\u0C56', '\u0C48' }, { '\u0CD5', '\u0CC0' }, { '\u0CD5', '\u0CCB' }, { '\u0D3E', '\u0D4B' }, { '\u0DCA', '\u0DDD' }, { '\u102E', '\u1026' }, { '\u1B35', '\u1B06' }, { '\u1B35', '\u1B08' }, { '\u1B35', '\u1B0A' }, { '\u1B35', '\u1B0C' }, { '\u1B35', '\u1B0E' }, { '\u1B35', '\u1B12' }, { '\u1B35', '\u1B3B' }, { '\u1B35', '\u1B3D' }, { '\u1B35', '\u1B40' }, { '\u1B35', '\u1B41' }, { '\u1B35', '\u1B43' }, { '\u0304', '\u1E38' }, { '\u0304', '\u1E39' }, { '\u0304', '\u1E5C' }, { '\u0304', '\u1E5D' }, { '\u0307', '\u1E68' }, { '\u0307', '\u1E69' }, { '\u0302', '\u1EC6' }, { '\u0302', '\u1EC7' }, { '\u0302', '\u1ED8' }, { '\u0302', '\u1ED9' }, { '\u0345', '\u1F82' }, { '\u0345', '\u1F83' }, { '\u0345', '\u1F84' }, { '\u0345', '\u1F85' }, { '\u0345', '\u1F86' }, { '\u0345', '\u1F87' }, { '\u0345', '\u1F8A' }, { '\u0345', '\u1F8B' }, { '\u0345', '\u1F8C' }, { '\u0345', '\u1F8D' }, { '\u0345', '\u1F8E' }, { '\u0345', '\u1F8F' }, { '\u0345', '\u1F92' }, { '\u0345', '\u1F93' }, { '\u0345', '\u1F94' }, { '\u0345', '\u1F95' }, { '\u0345', '\u1F96' }, { '\u0345', '\u1F97' }, { '\u0345', '\u1F9A' }, { '\u0345', '\u1F9B' }, { '\u0345', '\u1F9C' }, { '\u0345', '\u1F9D' }, { '\u0345', '\u1F9E' }, { '\u0345', '\u1F9F' }, { '\u0345', '\u1FA2' }, { '\u0345', '\u1FA3' }, { '\u0345', '\u1FA4' }, { '\u0345', '\u1FA5' }, { '\u0345', '\u1FA6' }, { '\u0345', '\u1FA7' }, { '\u0345', '\u1FAA' }, { '\u0345', '\u1FAB' }, { '\u0345', '\u1FAC' }, { '\u0345', '\u1FAD' }, { '\u0345', '\u1FAE' }, { '\u0345', '\u1FAF' }, { '\u0345', '\u1FB2' }, { '\u0345', '\u1FC2' }, { '\u0345', '\u1FF2' }, { '\u0345', '\u1FB7' }, { '\u0345', '\u1FC7' }, { '\u0345', '\u1FF7' }, { '\u0338', '\u219A' }, { '\u0338', '\u219B' }, { '\u0338', '\u21AE' }, { '\u0338', '\u21CD' }, { '\u0338', '\u21CF' }, { '\u0338', '\u21CE' }, { '\u0338', '\u2204' }, { '\u0338', '\u2209' }, { '\u0338', '\u220C' }, { '\u0338', '\u2224' }, { '\u0338', '\u2226' }, { '\u0338', '\u2241' }, { '\u0338', '\u2244' }, { '\u0338', '\u2247' }, { '\u0338', '\u2249' }, { '\u0338', '\u226D' }, { '\u0338', '\u2262' }, { '\u0338', '\u2270' }, { '\u0338', '\u2271' }, { '\u0338', '\u2274' }, { '\u0338', '\u2275' }, { '\u0338', '\u2278' }, { '\u0338', '\u2279' }, { '\u0338', '\u2280' }, { '\u0338', '\u2281' }, { '\u0338', '\u22E0' }, { '\u0338', '\u22E1' }, { '\u0338', '\u2284' }, { '\u0338', '\u2285' }, { '\u0338', '\u2288' }, { '\u0338', '\u2289' }, { '\u0338', '\u22E2' }, { '\u0338', '\u22E3' }, { '\u0338', '\u22AC' }, { '\u0338', '\u22AD' }, { '\u0338', '\u22AE' }, { '\u0338', '\u22AF' }, { '\u0338', '\u22EA' }, { '\u0338', '\u22EB' }, { '\u0338', '\u22EC' }, { '\u0338', '\u22ED' }, { '\u3099', '\u3094' }, { '\u3099', '\u304C' }, { '\u3099', '\u304E' }, { '\u3099', '\u3050' }, { '\u3099', '\u3052' }, { '\u3099', '\u3054' }, { '\u3099', '\u3056' }, { '\u3099', '\u3058' }, { '\u3099', '\u305A' }, { '\u3099', '\u305C' }, { '\u3099', '\u305E' }, { '\u3099', '\u3060' }, { '\u3099', '\u3062' }, { '\u3099', '\u3065' }, { '\u3099', '\u3067' }, { '\u3099', '\u3069' }, { '\u3099', '\u309E' }, { '\u3099', '\u30F4' }, { '\u3099', '\u30AC' }, { '\u3099', '\u30AE' }, { '\u3099', '\u30B0' }, { '\u3099', '\u30B2' }, { '\u3099', '\u30B4' }, { '\u3099', '\u30B6' }, { '\u3099', '\u30B8' }, { '\u3099', '\u30BA' }, { '\u3099', '\u30BC' }, { '\u3099', '\u30BE' }, { '\u3099', '\u30C0' }, { '\u3099', '\u30C2' }, { '\u3099', '\u30C5' }, { '\u3099', '\u30C7' }, { '\u3099', '\u30C9' }, { '\u3099', '\u30F7' }, { '\u3099', '\u30F8' }, { '\u3099', '\u30F9' }, { '\u3099', '\u30FA' }, { '\u3099', '\u30FE' }, }; public static readonly char[,] singleSecond = new char[,] { { '\u0627', '\u0622' }, { '\u0627', '\u0625' }, { '\u09C7', '\u09CB' }, { '\u09C7', '\u09CC' }, { '\u0B47', '\u0B4B' }, { '\u0B47', '\u0B48' }, { '\u0B47', '\u0B4C' }, { '\u0CC6', '\u0CCA' }, { '\u0CC6', '\u0CC8' }, { '\u0D46', '\u0D4C' }, { '\u0DD9', '\u0DDC' }, { '\u0DD9', '\u0DDE' }, }; public static readonly int multiSecondStart = 144; public static readonly int singleFirstStart = 181; public static readonly int singleSecondStart = 402; public static readonly int[] composePage = new int[] { 0, 1, 2, 3, 4, -1, 5, -1, -1, 6, -1, 7, 8, 9, -1, -1, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, 12, 13, -1, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, -1, }; public static readonly int[,] composeData = new int[,] { { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 181, 182, 183, -1, -1, 0, 1, 2, 3, 4, 184, 5, 6, 7, 185, 8, 9, 10, 11, 12, 13, -1, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 186, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, 38, 39, 40, 41, 42, 43, 44, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, -1, 187, 188, 49, 189, -1, -1, 50, -1, -1, -1, -1, 190, -1, -1, -1, -1, 51, 52, 191, -1, 192, -1, -1, -1, 53, -1, -1, -1, -1, -1, 54, -1, 193, 194, 55, 195, -1, -1, 56, -1, -1, -1, -1, 196, -1, -1, -1, -1, 57, 58, 197, -1, 198, -1, -1, -1, 59, -1, -1, -1, }, { -1, -1, 60, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199, 200, -1, -1, -1, -1, 201, 202, -1, -1, -1, -1, -1, -1, 203, 204, 205, 206, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, -1, -1, -1, -1, -1, 208, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 211, 212, 213, 214, -1, -1, -1, -1, 215, 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 217, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { 144, 145, 146, 147, 148, -1, 149, 150, 151, 152, 153, 165, 154, -1, -1, 155, -1, 156, -1, 170, 171, -1, -1, -1, -1, -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, 157, 168, 158, 167, 161, 159, -1, -1, -1, -1, 162, 164, -1, 163, 160, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 169, -1, -1, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, 71, -1, 72, -1, 73, -1, -1, -1, -1, -1, 74, -1, 218, -1, -1, -1, 75, -1, -1, -1, 76, -1, -1, 219, -1, 220, -1, -1, 77, -1, -1, -1, 78, -1, 79, -1, 80, -1, -1, -1, -1, -1, 81, -1, 82, -1, -1, -1, 83, -1, -1, -1, 84, 85, 86, -1, -1, 221, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, 222, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, 223, -1, 89, 90, 224, 91, -1, 225, -1, -1, -1, 226, -1, -1, -1, -1, 92, -1, -1, -1, 227, -1, -1, -1, 228, -1, 229, -1, -1, 93, -1, -1, 230, -1, 94, 95, 231, 96, -1, 232, -1, -1, -1, 233, -1, -1, -1, -1, 97, -1, -1, -1, 234, -1, -1, -1, 235, -1, 236, -1, -1, -1, -1, -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 238, 239, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 240, 241, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 242, 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 98, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 244, -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, 402, 173, 403, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 246, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 247, -1, -1, 248, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 249, -1, -1, -1, -1, -1, -1, -1, 250, -1, -1, 251, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 404, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 405, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 406, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 407, 408, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 252, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 174, -1, -1, -1, -1, -1, -1, -1, 99, 253, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 175, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 255, -1, -1, 409, -1, -1, -1, 100, -1, -1, -1, 256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 176, 410, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 177, -1, -1, -1, -1, -1, -1, -1, 101, 257, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 411, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, -1, 412, -1, -1, -1, -1, -1, -1, -1, -1, -1, 102, -1, -1, 258, -1, -1, 413, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 259, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, 260, -1, 261, -1, 262, -1, 263, -1, 264, -1, -1, -1, 265, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 266, -1, 267, -1, 268, 269, -1, -1, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 273, 274, -1, -1, -1, -1, -1, -1, 275, 276, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 277, 278, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, 280, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { 105, 106, 281, 282, 283, 284, 285, 286, 107, 108, 287, 288, 289, 290, 291, 292, 109, 110, -1, -1, -1, -1, -1, -1, 111, 112, -1, -1, -1, -1, -1, -1, 113, 114, 293, 294, 295, 296, 297, 298, 115, 116, 299, 300, 301, 302, 303, 304, 117, 118, -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, 121, 122, -1, -1, -1, -1, -1, -1, 123, 124, -1, -1, -1, -1, -1, -1, 125, 126, -1, -1, -1, -1, -1, -1, -1, 127, -1, -1, -1, -1, -1, -1, 128, 129, 305, 306, 307, 308, 309, 310, 130, 131, 311, 312, 313, 314, 315, 316, 317, -1, -1, -1, 318, -1, -1, -1, -1, -1, -1, -1, 319, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 320, -1, -1, -1, -1, -1, -1, -1, -1, 132, -1, -1, -1, -1, -1, -1, 321, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 322, -1, -1, -1, -1, -1, -1, -1, 133, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 323, -1, 324, -1, 325, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 326, -1, 327, -1, 328, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, 329, -1, -1, -1, -1, 330, -1, -1, 331, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 332, -1, 333, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 334, -1, -1, -1, -1, -1, -1, 335, -1, 336, -1, -1, 337, -1, -1, -1, -1, 338, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 339, -1, -1, 340, 341, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 342, 343, -1, -1, 344, 345, -1, -1, 346, 347, 348, 349, -1, -1, -1, -1, 350, 351, -1, -1, 352, 353, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 356, -1, -1, -1, -1, -1, 357, 358, -1, 359, -1, -1, -1, -1, -1, -1, 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 364, -1, -1, -1, -1, 365, -1, 366, -1, 367, -1, 368, -1, 369, -1, 370, -1, 371, -1, 372, -1, 373, -1, 374, -1, 375, -1, 376, -1, -1, 377, -1, 378, -1, 379, -1, -1, -1, -1, -1, -1, 134, -1, -1, 135, -1, -1, 136, -1, -1, 137, -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 179, 180, -1, -1, 380, -1, -1, -1, -1, -1, -1, -1, -1, 381, -1, -1, -1, -1, 382, -1, 383, -1, 384, -1, 385, -1, 386, -1, 387, -1, 388, -1, 389, -1, 390, -1, 391, -1, 392, -1, 393, -1, -1, 394, -1, 395, -1, 396, -1, -1, -1, -1, -1, -1, 139, -1, -1, 140, -1, -1, 141, -1, -1, 142, -1, -1, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 397, 398, 399, 400, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 401, -1, -1, }, }; } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/Stringprep.cs0000644000175000017500000003026512204443225022424 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; using System.Text; namespace agsXMPP.Idn { /// This class offers static methods for preparing internationalized /// strings. It supports the following stringprep profiles: ///
    ///
  • RFC3491 nameprep ///
  • RFC3920 XMPP nodeprep and resourceprep ///
/// Note that this implementation only supports 16-bit Unicode code /// points. ///
public class Stringprep { /// Preps a name according to the Stringprep profile defined in /// RFC3491. Unassigned code points are not allowed. /// * /// /// the name to prep. /// /// the prepped name. /// @throws StringprepException If the name cannot be prepped with /// this profile. /// @throws NullPointerException If the name is null. /// /// public static string NamePrep(string input) { return NamePrep(input, false); } /// Preps a name according to the Stringprep profile defined in /// RFC3491. /// * /// /// the name to prep. /// /// true if the name may contain unassigned /// code points. /// /// the prepped name. /// @throws StringprepException If the name cannot be prepped with /// this profile. /// @throws NullPointerException If the name is null. /// /// public static string NamePrep(string input, bool allowUnassigned) { if (input == null) { throw new System.NullReferenceException(); } StringBuilder s = new StringBuilder(input); if (!allowUnassigned && Contains(s, RFC3454.A1)) { throw new StringprepException(StringprepException.CONTAINS_UNASSIGNED); } Filter(s, RFC3454.B1); Map(s, RFC3454.B2search, RFC3454.B2replace); s = new StringBuilder(NFKC.NormalizeNFKC(s.ToString())); // B.3 is only needed if NFKC is not used, right? // map(s, RFC3454.B3search, RFC3454.B3replace); if (Contains(s, RFC3454.C12) || Contains(s, RFC3454.C22) || Contains(s, RFC3454.C3) || Contains(s, RFC3454.C4) || Contains(s, RFC3454.C5) || Contains(s, RFC3454.C6) || Contains(s, RFC3454.C7) || Contains(s, RFC3454.C8)) { // Table C.9 only contains code points > 0xFFFF which Java // doesn't handle throw new StringprepException(StringprepException.CONTAINS_PROHIBITED); } // Bidi handling bool r = Contains(s, RFC3454.D1); bool l = Contains(s, RFC3454.D2); // RFC 3454, section 6, requirement 1: already handled above (table C.8) // RFC 3454, section 6, requirement 2 if (r && l) { throw new StringprepException(StringprepException.BIDI_BOTHRAL); } // RFC 3454, section 6, requirement 3 if (r) { if (!Contains(s[0], RFC3454.D1) || !Contains(s[s.Length - 1], RFC3454.D1)) { throw new StringprepException(StringprepException.BIDI_LTRAL); } } return s.ToString(); } /** * Characters prohibited by RFC3920 nodeprep that aren't defined as * part of the RFC3454 tables. */ private static char [] RFC3920_NODEPREP_PROHIBIT = new char [] { '\u0022', '\u0026', '\'', '\u002F', '\u003A', '\u003C', '\u003E', '\u0040' }; /// Preps a node name according to the Stringprep profile defined in /// RFC3920. Unassigned code points are not allowed. /// * /// /// the node name to prep. /// /// the prepped node name. /// @throws StringprepException If the node name cannot be prepped /// with this profile. /// @throws NullPointerException If the node name is null. /// /// public static string NodePrep(string input) { return NodePrep(input, false); } /// /// Preps a node name according to the Stringprep profile defined in RFC3920. /// /// the node name to prep. /// /// true if the node name may contain /// unassigned code points. /// /// the prepped node name. /// @throws StringprepException If the node name cannot be prepped /// with this profile. /// @throws NullPointerException If the node name is null. /// /// public static string NodePrep(string input, bool allowUnassigned) { if (input == null) { throw new System.NullReferenceException(); } StringBuilder s = new StringBuilder(input); if (!allowUnassigned && Contains(s, RFC3454.A1)) { throw new StringprepException(StringprepException.CONTAINS_UNASSIGNED); } Filter(s, RFC3454.B1); Map(s, RFC3454.B2search, RFC3454.B2replace); s = new StringBuilder(NFKC.NormalizeNFKC(s.ToString())); if (Contains(s, RFC3454.C11) || Contains(s, RFC3454.C12) || Contains(s, RFC3454.C21) || Contains(s, RFC3454.C22) || Contains(s, RFC3454.C3) || Contains(s, RFC3454.C4) || Contains(s, RFC3454.C5) || Contains(s, RFC3454.C6) || Contains(s, RFC3454.C7) || Contains(s, RFC3454.C8) || Contains(s, RFC3920_NODEPREP_PROHIBIT)) { // Table C.9 only contains code points > 0xFFFF which Java // doesn't handle throw new StringprepException(StringprepException.CONTAINS_PROHIBITED); } // Bidi handling bool r = Contains(s, RFC3454.D1); bool l = Contains(s, RFC3454.D2); // RFC 3454, section 6, requirement 1: already handled above (table C.8) // RFC 3454, section 6, requirement 2 if (r && l) { throw new StringprepException(StringprepException.BIDI_BOTHRAL); } // RFC 3454, section 6, requirement 3 if (r) { if (!Contains(s[0], RFC3454.D1) || !Contains(s[s.Length - 1], RFC3454.D1)) { throw new StringprepException(StringprepException.BIDI_LTRAL); } } return s.ToString(); } /// /// Preps a resource name according to the Stringprep profile defined /// in RFC3920. Unassigned code points are not allowed. /// /// the resource name to prep. /// /// the prepped node name. /// @throws StringprepException If the resource name cannot be prepped /// with this profile. /// @throws NullPointerException If the resource name is null. /// /// public static string ResourcePrep(string input) { return ResourcePrep(input, false); } /// /// Preps a resource name according to the Stringprep profile defined /// in RFC3920. /// /// the resource name to prep. /// /// true if the resource name may contain /// unassigned code points. /// /// /// the prepped node name. /// @throws StringprepException If the resource name cannot be prepped /// with this profile. /// @throws NullPointerException If the resource name is null. /// /// public static string ResourcePrep(string input, bool allowUnassigned) { if (input == null) { throw new System.NullReferenceException(); } StringBuilder s = new StringBuilder(input); if (!allowUnassigned && Contains(s, RFC3454.A1)) { throw new StringprepException(StringprepException.CONTAINS_UNASSIGNED); } Filter(s, RFC3454.B1); s = new StringBuilder(NFKC.NormalizeNFKC(s.ToString())); if (Contains(s, RFC3454.C12) || Contains(s, RFC3454.C21) || Contains(s, RFC3454.C22) || Contains(s, RFC3454.C3) || Contains(s, RFC3454.C4) || Contains(s, RFC3454.C5) || Contains(s, RFC3454.C6) || Contains(s, RFC3454.C7) || Contains(s, RFC3454.C8)) { // Table C.9 only contains code points > 0xFFFF which Java // doesn't handle throw new StringprepException(StringprepException.CONTAINS_PROHIBITED); } // Bidi handling bool r = Contains(s, RFC3454.D1); bool l = Contains(s, RFC3454.D2); // RFC 3454, section 6, requirement 1: already handled above (table C.8) // RFC 3454, section 6, requirement 2 if (r && l) { throw new StringprepException(StringprepException.BIDI_BOTHRAL); } // RFC 3454, section 6, requirement 3 if (r) { if (!Contains(s[0], RFC3454.D1) || !Contains(s[s.Length - 1], RFC3454.D1)) { throw new StringprepException(StringprepException.BIDI_LTRAL); } } return s.ToString(); } internal static bool Contains(StringBuilder s, char[] p) { for (int i = 0; i < p.Length; i++) { char c = p[i]; for (int j = 0; j < s.Length; j++) { if (c == s[j]) { return true; } } } return false; } internal static bool Contains(StringBuilder s, char[][] p) { for (int i = 0; i < p.Length; i++) { char[] r = p[i]; if (1 == r.Length) { char c = r[0]; for (int j = 0; j < s.Length; j++) { if (c == s[j]) { return true; } } } else if (2 == r.Length) { char f = r[0]; char t = r[1]; for (int j = 0; j < s.Length; j++) { if (f <= s[j] && t >= s[j]) { return true; } } } } return false; } internal static bool Contains(char c, char[][] p) { for (int i = 0; i < p.Length; i++) { char[] r = p[i]; if (1 == r.Length) { if (c == r[0]) { return true; } } else if (2 == r.Length) { char f = r[0]; char t = r[1]; if (f <= c && t >= c) { return true; } } } return false; } internal static void Filter(StringBuilder s, char[] f) { for (int i = 0; i < f.Length; i++) { char c = f[i]; int j = 0; while (j < s.Length) { if (c == s[j]) { //s.deleteCharAt(j); s.Remove(j, 1); } else { j++; } } } } internal static void Filter(StringBuilder s, char[][] f) { for (int i = 0; i < f.Length; i++) { char[] r = f[i]; if (1 == r.Length) { char c = r[0]; int j = 0; while (j < s.Length) { if (c == s[j]) { //s.deleteCharAt(j); s.Remove(j, 1); } else { j++; } } } else if (2 == r.Length) { char from = r[0]; char to = r[1]; int j = 0; while (j < s.Length) { if (from <= s[j] && to >= s[j]) { //s.deleteCharAt(j); s.Remove(j, 1); } else { j++; } } } } } internal static void Map(StringBuilder s, char[] search, string[] replace) { for (int i = 0; i < search.Length; i++) { char c = search[i]; int j = 0; while (j < s.Length) { if (c == s[j]) { //s.deleteCharAt(j); s.Remove(j, 1); if (null != replace[i]) { s.Insert(j, replace[i]); j += replace[i].Length - 1; } } else { j++; } } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/RFC3454.cs0000644000175000017500000055516612204443225021235 0ustar00meebeymeebey00000000000000// Do not edit !!! // this file is generated automatically using System; namespace agsXMPP.Idn { public class RFC3454 { public static char[][] A1 = new char[][] { new char[] { '\u0221' }, /* 0221 */ new char[] { '\u0234', '\u024F' }, /* 0234-024F */ new char[] { '\u02AE', '\u02AF' }, /* 02AE-02AF */ new char[] { '\u02EF', '\u02FF' }, /* 02EF-02FF */ new char[] { '\u0350', '\u035F' }, /* 0350-035F */ new char[] { '\u0370', '\u0373' }, /* 0370-0373 */ new char[] { '\u0376', '\u0379' }, /* 0376-0379 */ new char[] { '\u037B', '\u037D' }, /* 037B-037D */ new char[] { '\u037F', '\u0383' }, /* 037F-0383 */ new char[] { '\u038B' }, /* 038B */ new char[] { '\u038D' }, /* 038D */ new char[] { '\u03A2' }, /* 03A2 */ new char[] { '\u03CF' }, /* 03CF */ new char[] { '\u03F7', '\u03FF' }, /* 03F7-03FF */ new char[] { '\u0487' }, /* 0487 */ new char[] { '\u04CF' }, /* 04CF */ new char[] { '\u04F6', '\u04F7' }, /* 04F6-04F7 */ new char[] { '\u04FA', '\u04FF' }, /* 04FA-04FF */ new char[] { '\u0510', '\u0530' }, /* 0510-0530 */ new char[] { '\u0557', '\u0558' }, /* 0557-0558 */ new char[] { '\u0560' }, /* 0560 */ new char[] { '\u0588' }, /* 0588 */ new char[] { '\u058B', '\u0590' }, /* 058B-0590 */ new char[] { '\u05A2' }, /* 05A2 */ new char[] { '\u05BA' }, /* 05BA */ new char[] { '\u05C5', '\u05CF' }, /* 05C5-05CF */ new char[] { '\u05EB', '\u05EF' }, /* 05EB-05EF */ new char[] { '\u05F5', '\u060B' }, /* 05F5-060B */ new char[] { '\u060D', '\u061A' }, /* 060D-061A */ new char[] { '\u061C', '\u061E' }, /* 061C-061E */ new char[] { '\u0620' }, /* 0620 */ new char[] { '\u063B', '\u063F' }, /* 063B-063F */ new char[] { '\u0656', '\u065F' }, /* 0656-065F */ new char[] { '\u06EE', '\u06EF' }, /* 06EE-06EF */ new char[] { '\u06FF' }, /* 06FF */ new char[] { '\u070E' }, /* 070E */ new char[] { '\u072D', '\u072F' }, /* 072D-072F */ new char[] { '\u074B', '\u077F' }, /* 074B-077F */ new char[] { '\u07B2', '\u0900' }, /* 07B2-0900 */ new char[] { '\u0904' }, /* 0904 */ new char[] { '\u093A', '\u093B' }, /* 093A-093B */ new char[] { '\u094E', '\u094F' }, /* 094E-094F */ new char[] { '\u0955', '\u0957' }, /* 0955-0957 */ new char[] { '\u0971', '\u0980' }, /* 0971-0980 */ new char[] { '\u0984' }, /* 0984 */ new char[] { '\u098D', '\u098E' }, /* 098D-098E */ new char[] { '\u0991', '\u0992' }, /* 0991-0992 */ new char[] { '\u09A9' }, /* 09A9 */ new char[] { '\u09B1' }, /* 09B1 */ new char[] { '\u09B3', '\u09B5' }, /* 09B3-09B5 */ new char[] { '\u09BA', '\u09BB' }, /* 09BA-09BB */ new char[] { '\u09BD' }, /* 09BD */ new char[] { '\u09C5', '\u09C6' }, /* 09C5-09C6 */ new char[] { '\u09C9', '\u09CA' }, /* 09C9-09CA */ new char[] { '\u09CE', '\u09D6' }, /* 09CE-09D6 */ new char[] { '\u09D8', '\u09DB' }, /* 09D8-09DB */ new char[] { '\u09DE' }, /* 09DE */ new char[] { '\u09E4', '\u09E5' }, /* 09E4-09E5 */ new char[] { '\u09FB', '\u0A01' }, /* 09FB-0A01 */ new char[] { '\u0A03', '\u0A04' }, /* 0A03-0A04 */ new char[] { '\u0A0B', '\u0A0E' }, /* 0A0B-0A0E */ new char[] { '\u0A11', '\u0A12' }, /* 0A11-0A12 */ new char[] { '\u0A29' }, /* 0A29 */ new char[] { '\u0A31' }, /* 0A31 */ new char[] { '\u0A34' }, /* 0A34 */ new char[] { '\u0A37' }, /* 0A37 */ new char[] { '\u0A3A', '\u0A3B' }, /* 0A3A-0A3B */ new char[] { '\u0A3D' }, /* 0A3D */ new char[] { '\u0A43', '\u0A46' }, /* 0A43-0A46 */ new char[] { '\u0A49', '\u0A4A' }, /* 0A49-0A4A */ new char[] { '\u0A4E', '\u0A58' }, /* 0A4E-0A58 */ new char[] { '\u0A5D' }, /* 0A5D */ new char[] { '\u0A5F', '\u0A65' }, /* 0A5F-0A65 */ new char[] { '\u0A75', '\u0A80' }, /* 0A75-0A80 */ new char[] { '\u0A84' }, /* 0A84 */ new char[] { '\u0A8C' }, /* 0A8C */ new char[] { '\u0A8E' }, /* 0A8E */ new char[] { '\u0A92' }, /* 0A92 */ new char[] { '\u0AA9' }, /* 0AA9 */ new char[] { '\u0AB1' }, /* 0AB1 */ new char[] { '\u0AB4' }, /* 0AB4 */ new char[] { '\u0ABA', '\u0ABB' }, /* 0ABA-0ABB */ new char[] { '\u0AC6' }, /* 0AC6 */ new char[] { '\u0ACA' }, /* 0ACA */ new char[] { '\u0ACE', '\u0ACF' }, /* 0ACE-0ACF */ new char[] { '\u0AD1', '\u0ADF' }, /* 0AD1-0ADF */ new char[] { '\u0AE1', '\u0AE5' }, /* 0AE1-0AE5 */ new char[] { '\u0AF0', '\u0B00' }, /* 0AF0-0B00 */ new char[] { '\u0B04' }, /* 0B04 */ new char[] { '\u0B0D', '\u0B0E' }, /* 0B0D-0B0E */ new char[] { '\u0B11', '\u0B12' }, /* 0B11-0B12 */ new char[] { '\u0B29' }, /* 0B29 */ new char[] { '\u0B31' }, /* 0B31 */ new char[] { '\u0B34', '\u0B35' }, /* 0B34-0B35 */ new char[] { '\u0B3A', '\u0B3B' }, /* 0B3A-0B3B */ new char[] { '\u0B44', '\u0B46' }, /* 0B44-0B46 */ new char[] { '\u0B49', '\u0B4A' }, /* 0B49-0B4A */ new char[] { '\u0B4E', '\u0B55' }, /* 0B4E-0B55 */ new char[] { '\u0B58', '\u0B5B' }, /* 0B58-0B5B */ new char[] { '\u0B5E' }, /* 0B5E */ new char[] { '\u0B62', '\u0B65' }, /* 0B62-0B65 */ new char[] { '\u0B71', '\u0B81' }, /* 0B71-0B81 */ new char[] { '\u0B84' }, /* 0B84 */ new char[] { '\u0B8B', '\u0B8D' }, /* 0B8B-0B8D */ new char[] { '\u0B91' }, /* 0B91 */ new char[] { '\u0B96', '\u0B98' }, /* 0B96-0B98 */ new char[] { '\u0B9B' }, /* 0B9B */ new char[] { '\u0B9D' }, /* 0B9D */ new char[] { '\u0BA0', '\u0BA2' }, /* 0BA0-0BA2 */ new char[] { '\u0BA5', '\u0BA7' }, /* 0BA5-0BA7 */ new char[] { '\u0BAB', '\u0BAD' }, /* 0BAB-0BAD */ new char[] { '\u0BB6' }, /* 0BB6 */ new char[] { '\u0BBA', '\u0BBD' }, /* 0BBA-0BBD */ new char[] { '\u0BC3', '\u0BC5' }, /* 0BC3-0BC5 */ new char[] { '\u0BC9' }, /* 0BC9 */ new char[] { '\u0BCE', '\u0BD6' }, /* 0BCE-0BD6 */ new char[] { '\u0BD8', '\u0BE6' }, /* 0BD8-0BE6 */ new char[] { '\u0BF3', '\u0C00' }, /* 0BF3-0C00 */ new char[] { '\u0C04' }, /* 0C04 */ new char[] { '\u0C0D' }, /* 0C0D */ new char[] { '\u0C11' }, /* 0C11 */ new char[] { '\u0C29' }, /* 0C29 */ new char[] { '\u0C34' }, /* 0C34 */ new char[] { '\u0C3A', '\u0C3D' }, /* 0C3A-0C3D */ new char[] { '\u0C45' }, /* 0C45 */ new char[] { '\u0C49' }, /* 0C49 */ new char[] { '\u0C4E', '\u0C54' }, /* 0C4E-0C54 */ new char[] { '\u0C57', '\u0C5F' }, /* 0C57-0C5F */ new char[] { '\u0C62', '\u0C65' }, /* 0C62-0C65 */ new char[] { '\u0C70', '\u0C81' }, /* 0C70-0C81 */ new char[] { '\u0C84' }, /* 0C84 */ new char[] { '\u0C8D' }, /* 0C8D */ new char[] { '\u0C91' }, /* 0C91 */ new char[] { '\u0CA9' }, /* 0CA9 */ new char[] { '\u0CB4' }, /* 0CB4 */ new char[] { '\u0CBA', '\u0CBD' }, /* 0CBA-0CBD */ new char[] { '\u0CC5' }, /* 0CC5 */ new char[] { '\u0CC9' }, /* 0CC9 */ new char[] { '\u0CCE', '\u0CD4' }, /* 0CCE-0CD4 */ new char[] { '\u0CD7', '\u0CDD' }, /* 0CD7-0CDD */ new char[] { '\u0CDF' }, /* 0CDF */ new char[] { '\u0CE2', '\u0CE5' }, /* 0CE2-0CE5 */ new char[] { '\u0CF0', '\u0D01' }, /* 0CF0-0D01 */ new char[] { '\u0D04' }, /* 0D04 */ new char[] { '\u0D0D' }, /* 0D0D */ new char[] { '\u0D11' }, /* 0D11 */ new char[] { '\u0D29' }, /* 0D29 */ new char[] { '\u0D3A', '\u0D3D' }, /* 0D3A-0D3D */ new char[] { '\u0D44', '\u0D45' }, /* 0D44-0D45 */ new char[] { '\u0D49' }, /* 0D49 */ new char[] { '\u0D4E', '\u0D56' }, /* 0D4E-0D56 */ new char[] { '\u0D58', '\u0D5F' }, /* 0D58-0D5F */ new char[] { '\u0D62', '\u0D65' }, /* 0D62-0D65 */ new char[] { '\u0D70', '\u0D81' }, /* 0D70-0D81 */ new char[] { '\u0D84' }, /* 0D84 */ new char[] { '\u0D97', '\u0D99' }, /* 0D97-0D99 */ new char[] { '\u0DB2' }, /* 0DB2 */ new char[] { '\u0DBC' }, /* 0DBC */ new char[] { '\u0DBE', '\u0DBF' }, /* 0DBE-0DBF */ new char[] { '\u0DC7', '\u0DC9' }, /* 0DC7-0DC9 */ new char[] { '\u0DCB', '\u0DCE' }, /* 0DCB-0DCE */ new char[] { '\u0DD5' }, /* 0DD5 */ new char[] { '\u0DD7' }, /* 0DD7 */ new char[] { '\u0DE0', '\u0DF1' }, /* 0DE0-0DF1 */ new char[] { '\u0DF5', '\u0E00' }, /* 0DF5-0E00 */ new char[] { '\u0E3B', '\u0E3E' }, /* 0E3B-0E3E */ new char[] { '\u0E5C', '\u0E80' }, /* 0E5C-0E80 */ new char[] { '\u0E83' }, /* 0E83 */ new char[] { '\u0E85', '\u0E86' }, /* 0E85-0E86 */ new char[] { '\u0E89' }, /* 0E89 */ new char[] { '\u0E8B', '\u0E8C' }, /* 0E8B-0E8C */ new char[] { '\u0E8E', '\u0E93' }, /* 0E8E-0E93 */ new char[] { '\u0E98' }, /* 0E98 */ new char[] { '\u0EA0' }, /* 0EA0 */ new char[] { '\u0EA4' }, /* 0EA4 */ new char[] { '\u0EA6' }, /* 0EA6 */ new char[] { '\u0EA8', '\u0EA9' }, /* 0EA8-0EA9 */ new char[] { '\u0EAC' }, /* 0EAC */ new char[] { '\u0EBA' }, /* 0EBA */ new char[] { '\u0EBE', '\u0EBF' }, /* 0EBE-0EBF */ new char[] { '\u0EC5' }, /* 0EC5 */ new char[] { '\u0EC7' }, /* 0EC7 */ new char[] { '\u0ECE', '\u0ECF' }, /* 0ECE-0ECF */ new char[] { '\u0EDA', '\u0EDB' }, /* 0EDA-0EDB */ new char[] { '\u0EDE', '\u0EFF' }, /* 0EDE-0EFF */ new char[] { '\u0F48' }, /* 0F48 */ new char[] { '\u0F6B', '\u0F70' }, /* 0F6B-0F70 */ new char[] { '\u0F8C', '\u0F8F' }, /* 0F8C-0F8F */ new char[] { '\u0F98' }, /* 0F98 */ new char[] { '\u0FBD' }, /* 0FBD */ new char[] { '\u0FCD', '\u0FCE' }, /* 0FCD-0FCE */ new char[] { '\u0FD0', '\u0FFF' }, /* 0FD0-0FFF */ new char[] { '\u1022' }, /* 1022 */ new char[] { '\u1028' }, /* 1028 */ new char[] { '\u102B' }, /* 102B */ new char[] { '\u1033', '\u1035' }, /* 1033-1035 */ new char[] { '\u103A', '\u103F' }, /* 103A-103F */ new char[] { '\u105A', '\u109F' }, /* 105A-109F */ new char[] { '\u10C6', '\u10CF' }, /* 10C6-10CF */ new char[] { '\u10F9', '\u10FA' }, /* 10F9-10FA */ new char[] { '\u10FC', '\u10FF' }, /* 10FC-10FF */ new char[] { '\u115A', '\u115E' }, /* 115A-115E */ new char[] { '\u11A3', '\u11A7' }, /* 11A3-11A7 */ new char[] { '\u11FA', '\u11FF' }, /* 11FA-11FF */ new char[] { '\u1207' }, /* 1207 */ new char[] { '\u1247' }, /* 1247 */ new char[] { '\u1249' }, /* 1249 */ new char[] { '\u124E', '\u124F' }, /* 124E-124F */ new char[] { '\u1257' }, /* 1257 */ new char[] { '\u1259' }, /* 1259 */ new char[] { '\u125E', '\u125F' }, /* 125E-125F */ new char[] { '\u1287' }, /* 1287 */ new char[] { '\u1289' }, /* 1289 */ new char[] { '\u128E', '\u128F' }, /* 128E-128F */ new char[] { '\u12AF' }, /* 12AF */ new char[] { '\u12B1' }, /* 12B1 */ new char[] { '\u12B6', '\u12B7' }, /* 12B6-12B7 */ new char[] { '\u12BF' }, /* 12BF */ new char[] { '\u12C1' }, /* 12C1 */ new char[] { '\u12C6', '\u12C7' }, /* 12C6-12C7 */ new char[] { '\u12CF' }, /* 12CF */ new char[] { '\u12D7' }, /* 12D7 */ new char[] { '\u12EF' }, /* 12EF */ new char[] { '\u130F' }, /* 130F */ new char[] { '\u1311' }, /* 1311 */ new char[] { '\u1316', '\u1317' }, /* 1316-1317 */ new char[] { '\u131F' }, /* 131F */ new char[] { '\u1347' }, /* 1347 */ new char[] { '\u135B', '\u1360' }, /* 135B-1360 */ new char[] { '\u137D', '\u139F' }, /* 137D-139F */ new char[] { '\u13F5', '\u1400' }, /* 13F5-1400 */ new char[] { '\u1677', '\u167F' }, /* 1677-167F */ new char[] { '\u169D', '\u169F' }, /* 169D-169F */ new char[] { '\u16F1', '\u16FF' }, /* 16F1-16FF */ new char[] { '\u170D' }, /* 170D */ new char[] { '\u1715', '\u171F' }, /* 1715-171F */ new char[] { '\u1737', '\u173F' }, /* 1737-173F */ new char[] { '\u1754', '\u175F' }, /* 1754-175F */ new char[] { '\u176D' }, /* 176D */ new char[] { '\u1771' }, /* 1771 */ new char[] { '\u1774', '\u177F' }, /* 1774-177F */ new char[] { '\u17DD', '\u17DF' }, /* 17DD-17DF */ new char[] { '\u17EA', '\u17FF' }, /* 17EA-17FF */ new char[] { '\u180F' }, /* 180F */ new char[] { '\u181A', '\u181F' }, /* 181A-181F */ new char[] { '\u1878', '\u187F' }, /* 1878-187F */ new char[] { '\u18AA', '\u1DFF' }, /* 18AA-1DFF */ new char[] { '\u1E9C', '\u1E9F' }, /* 1E9C-1E9F */ new char[] { '\u1EFA', '\u1EFF' }, /* 1EFA-1EFF */ new char[] { '\u1F16', '\u1F17' }, /* 1F16-1F17 */ new char[] { '\u1F1E', '\u1F1F' }, /* 1F1E-1F1F */ new char[] { '\u1F46', '\u1F47' }, /* 1F46-1F47 */ new char[] { '\u1F4E', '\u1F4F' }, /* 1F4E-1F4F */ new char[] { '\u1F58' }, /* 1F58 */ new char[] { '\u1F5A' }, /* 1F5A */ new char[] { '\u1F5C' }, /* 1F5C */ new char[] { '\u1F5E' }, /* 1F5E */ new char[] { '\u1F7E', '\u1F7F' }, /* 1F7E-1F7F */ new char[] { '\u1FB5' }, /* 1FB5 */ new char[] { '\u1FC5' }, /* 1FC5 */ new char[] { '\u1FD4', '\u1FD5' }, /* 1FD4-1FD5 */ new char[] { '\u1FDC' }, /* 1FDC */ new char[] { '\u1FF0', '\u1FF1' }, /* 1FF0-1FF1 */ new char[] { '\u1FF5' }, /* 1FF5 */ new char[] { '\u1FFF' }, /* 1FFF */ new char[] { '\u2053', '\u2056' }, /* 2053-2056 */ new char[] { '\u2058', '\u205E' }, /* 2058-205E */ new char[] { '\u2064', '\u2069' }, /* 2064-2069 */ new char[] { '\u2072', '\u2073' }, /* 2072-2073 */ new char[] { '\u208F', '\u209F' }, /* 208F-209F */ new char[] { '\u20B2', '\u20CF' }, /* 20B2-20CF */ new char[] { '\u20EB', '\u20FF' }, /* 20EB-20FF */ new char[] { '\u213B', '\u213C' }, /* 213B-213C */ new char[] { '\u214C', '\u2152' }, /* 214C-2152 */ new char[] { '\u2184', '\u218F' }, /* 2184-218F */ new char[] { '\u23CF', '\u23FF' }, /* 23CF-23FF */ new char[] { '\u2427', '\u243F' }, /* 2427-243F */ new char[] { '\u244B', '\u245F' }, /* 244B-245F */ new char[] { '\u24FF' }, /* 24FF */ new char[] { '\u2614', '\u2615' }, /* 2614-2615 */ new char[] { '\u2618' }, /* 2618 */ new char[] { '\u267E', '\u267F' }, /* 267E-267F */ new char[] { '\u268A', '\u2700' }, /* 268A-2700 */ new char[] { '\u2705' }, /* 2705 */ new char[] { '\u270A', '\u270B' }, /* 270A-270B */ new char[] { '\u2728' }, /* 2728 */ new char[] { '\u274C' }, /* 274C */ new char[] { '\u274E' }, /* 274E */ new char[] { '\u2753', '\u2755' }, /* 2753-2755 */ new char[] { '\u2757' }, /* 2757 */ new char[] { '\u275F', '\u2760' }, /* 275F-2760 */ new char[] { '\u2795', '\u2797' }, /* 2795-2797 */ new char[] { '\u27B0' }, /* 27B0 */ new char[] { '\u27BF', '\u27CF' }, /* 27BF-27CF */ new char[] { '\u27EC', '\u27EF' }, /* 27EC-27EF */ new char[] { '\u2B00', '\u2E7F' }, /* 2B00-2E7F */ new char[] { '\u2E9A' }, /* 2E9A */ new char[] { '\u2EF4', '\u2EFF' }, /* 2EF4-2EFF */ new char[] { '\u2FD6', '\u2FEF' }, /* 2FD6-2FEF */ new char[] { '\u2FFC', '\u2FFF' }, /* 2FFC-2FFF */ new char[] { '\u3040' }, /* 3040 */ new char[] { '\u3097', '\u3098' }, /* 3097-3098 */ new char[] { '\u3100', '\u3104' }, /* 3100-3104 */ new char[] { '\u312D', '\u3130' }, /* 312D-3130 */ new char[] { '\u318F' }, /* 318F */ new char[] { '\u31B8', '\u31EF' }, /* 31B8-31EF */ new char[] { '\u321D', '\u321F' }, /* 321D-321F */ new char[] { '\u3244', '\u3250' }, /* 3244-3250 */ new char[] { '\u327C', '\u327E' }, /* 327C-327E */ new char[] { '\u32CC', '\u32CF' }, /* 32CC-32CF */ new char[] { '\u32FF' }, /* 32FF */ new char[] { '\u3377', '\u337A' }, /* 3377-337A */ new char[] { '\u33DE', '\u33DF' }, /* 33DE-33DF */ new char[] { '\u33FF' }, /* 33FF */ new char[] { '\u4DB6', '\u4DFF' }, /* 4DB6-4DFF */ new char[] { '\u9FA6', '\u9FFF' }, /* 9FA6-9FFF */ new char[] { '\uA48D', '\uA48F' }, /* A48D-A48F */ new char[] { '\uA4C7', '\uABFF' }, /* A4C7-ABFF */ new char[] { '\uD7A4', '\uD7FF' }, /* D7A4-D7FF */ new char[] { '\uFA2E', '\uFA2F' }, /* FA2E-FA2F */ new char[] { '\uFA6B', '\uFAFF' }, /* FA6B-FAFF */ new char[] { '\uFB07', '\uFB12' }, /* FB07-FB12 */ new char[] { '\uFB18', '\uFB1C' }, /* FB18-FB1C */ new char[] { '\uFB37' }, /* FB37 */ new char[] { '\uFB3D' }, /* FB3D */ new char[] { '\uFB3F' }, /* FB3F */ new char[] { '\uFB42' }, /* FB42 */ new char[] { '\uFB45' }, /* FB45 */ new char[] { '\uFBB2', '\uFBD2' }, /* FBB2-FBD2 */ new char[] { '\uFD40', '\uFD4F' }, /* FD40-FD4F */ new char[] { '\uFD90', '\uFD91' }, /* FD90-FD91 */ new char[] { '\uFDC8', '\uFDCF' }, /* FDC8-FDCF */ new char[] { '\uFDFD', '\uFDFF' }, /* FDFD-FDFF */ new char[] { '\uFE10', '\uFE1F' }, /* FE10-FE1F */ new char[] { '\uFE24', '\uFE2F' }, /* FE24-FE2F */ new char[] { '\uFE47', '\uFE48' }, /* FE47-FE48 */ new char[] { '\uFE53' }, /* FE53 */ new char[] { '\uFE67' }, /* FE67 */ new char[] { '\uFE6C', '\uFE6F' }, /* FE6C-FE6F */ new char[] { '\uFE75' }, /* FE75 */ new char[] { '\uFEFD', '\uFEFE' }, /* FEFD-FEFE */ new char[] { '\uFF00' }, /* FF00 */ new char[] { '\uFFBF', '\uFFC1' }, /* FFBF-FFC1 */ new char[] { '\uFFC8', '\uFFC9' }, /* FFC8-FFC9 */ new char[] { '\uFFD0', '\uFFD1' }, /* FFD0-FFD1 */ new char[] { '\uFFD8', '\uFFD9' }, /* FFD8-FFD9 */ new char[] { '\uFFDD', '\uFFDF' }, /* FFDD-FFDF */ new char[] { '\uFFE7' }, /* FFE7 */ new char[] { '\uFFEF', '\uFFF8' }, /* FFEF-FFF8 */ /* Skip characters outside the range of .NET unicode 10000-102FF */ /* Skip characters outside the range of .NET unicode 1031F */ /* Skip characters outside the range of .NET unicode 10324-1032F */ /* Skip characters outside the range of .NET unicode 1034B-103FF */ /* Skip characters outside the range of .NET unicode 10426-10427 */ /* Skip characters outside the range of .NET unicode 1044E-1CFFF */ /* Skip characters outside the range of .NET unicode 1D0F6-1D0FF */ /* Skip characters outside the range of .NET unicode 1D127-1D129 */ /* Skip characters outside the range of .NET unicode 1D1DE-1D3FF */ /* Skip characters outside the range of .NET unicode 1D455 */ /* Skip characters outside the range of .NET unicode 1D49D */ /* Skip characters outside the range of .NET unicode 1D4A0-1D4A1 */ /* Skip characters outside the range of .NET unicode 1D4A3-1D4A4 */ /* Skip characters outside the range of .NET unicode 1D4A7-1D4A8 */ /* Skip characters outside the range of .NET unicode 1D4AD */ /* Skip characters outside the range of .NET unicode 1D4BA */ /* Skip characters outside the range of .NET unicode 1D4BC */ /* Skip characters outside the range of .NET unicode 1D4C1 */ /* Skip characters outside the range of .NET unicode 1D4C4 */ /* Skip characters outside the range of .NET unicode 1D506 */ /* Skip characters outside the range of .NET unicode 1D50B-1D50C */ /* Skip characters outside the range of .NET unicode 1D515 */ /* Skip characters outside the range of .NET unicode 1D51D */ /* Skip characters outside the range of .NET unicode 1D53A */ /* Skip characters outside the range of .NET unicode 1D53F */ /* Skip characters outside the range of .NET unicode 1D545 */ /* Skip characters outside the range of .NET unicode 1D547-1D549 */ /* Skip characters outside the range of .NET unicode 1D551 */ /* Skip characters outside the range of .NET unicode 1D6A4-1D6A7 */ /* Skip characters outside the range of .NET unicode 1D7CA-1D7CD */ /* Skip characters outside the range of .NET unicode 1D800-1FFFD */ /* Skip characters outside the range of .NET unicode 2A6D7-2F7FF */ /* Skip characters outside the range of .NET unicode 2FA1E-2FFFD */ /* Skip characters outside the range of .NET unicode 30000-3FFFD */ /* Skip characters outside the range of .NET unicode 40000-4FFFD */ /* Skip characters outside the range of .NET unicode 50000-5FFFD */ /* Skip characters outside the range of .NET unicode 60000-6FFFD */ /* Skip characters outside the range of .NET unicode 70000-7FFFD */ /* Skip characters outside the range of .NET unicode 80000-8FFFD */ /* Skip characters outside the range of .NET unicode 90000-9FFFD */ /* Skip characters outside the range of .NET unicode A0000-AFFFD */ /* Skip characters outside the range of .NET unicode B0000-BFFFD */ /* Skip characters outside the range of .NET unicode C0000-CFFFD */ /* Skip characters outside the range of .NET unicode D0000-DFFFD */ /* Skip characters outside the range of .NET unicode E0000 */ /* Skip characters outside the range of .NET unicode E0002-E001F */ /* Skip characters outside the range of .NET unicode E0080-EFFFD */ }; public static char[] B1 = new char[] { '\u00AD', /* 00AD; ; Map to nothing */ '\u034F', /* 034F; ; Map to nothing */ '\u1806', /* 1806; ; Map to nothing */ '\u180B', /* 180B; ; Map to nothing */ '\u180C', /* 180C; ; Map to nothing */ '\u180D', /* 180D; ; Map to nothing */ '\u200B', /* 200B; ; Map to nothing */ '\u200C', /* 200C; ; Map to nothing */ '\u200D', /* 200D; ; Map to nothing */ '\u2060', /* 2060; ; Map to nothing */ '\uFE00', /* FE00; ; Map to nothing */ '\uFE01', /* FE01; ; Map to nothing */ '\uFE02', /* FE02; ; Map to nothing */ '\uFE03', /* FE03; ; Map to nothing */ '\uFE04', /* FE04; ; Map to nothing */ '\uFE05', /* FE05; ; Map to nothing */ '\uFE06', /* FE06; ; Map to nothing */ '\uFE07', /* FE07; ; Map to nothing */ '\uFE08', /* FE08; ; Map to nothing */ '\uFE09', /* FE09; ; Map to nothing */ '\uFE0A', /* FE0A; ; Map to nothing */ '\uFE0B', /* FE0B; ; Map to nothing */ '\uFE0C', /* FE0C; ; Map to nothing */ '\uFE0D', /* FE0D; ; Map to nothing */ '\uFE0E', /* FE0E; ; Map to nothing */ '\uFE0F', /* FE0F; ; Map to nothing */ '\uFEFF', /* FEFF; ; Map to nothing */ }; public static char[] B2search = new char[] { '\u0041', /*0041; 0061; Case map*/ '\u0042', /*0042; 0062; Case map*/ '\u0043', /*0043; 0063; Case map*/ '\u0044', /*0044; 0064; Case map*/ '\u0045', /*0045; 0065; Case map*/ '\u0046', /*0046; 0066; Case map*/ '\u0047', /*0047; 0067; Case map*/ '\u0048', /*0048; 0068; Case map*/ '\u0049', /*0049; 0069; Case map*/ '\u004A', /*004A; 006A; Case map*/ '\u004B', /*004B; 006B; Case map*/ '\u004C', /*004C; 006C; Case map*/ '\u004D', /*004D; 006D; Case map*/ '\u004E', /*004E; 006E; Case map*/ '\u004F', /*004F; 006F; Case map*/ '\u0050', /*0050; 0070; Case map*/ '\u0051', /*0051; 0071; Case map*/ '\u0052', /*0052; 0072; Case map*/ '\u0053', /*0053; 0073; Case map*/ '\u0054', /*0054; 0074; Case map*/ '\u0055', /*0055; 0075; Case map*/ '\u0056', /*0056; 0076; Case map*/ '\u0057', /*0057; 0077; Case map*/ '\u0058', /*0058; 0078; Case map*/ '\u0059', /*0059; 0079; Case map*/ '\u005A', /*005A; 007A; Case map*/ '\u00B5', /*00B5; 03BC; Case map*/ '\u00C0', /*00C0; 00E0; Case map*/ '\u00C1', /*00C1; 00E1; Case map*/ '\u00C2', /*00C2; 00E2; Case map*/ '\u00C3', /*00C3; 00E3; Case map*/ '\u00C4', /*00C4; 00E4; Case map*/ '\u00C5', /*00C5; 00E5; Case map*/ '\u00C6', /*00C6; 00E6; Case map*/ '\u00C7', /*00C7; 00E7; Case map*/ '\u00C8', /*00C8; 00E8; Case map*/ '\u00C9', /*00C9; 00E9; Case map*/ '\u00CA', /*00CA; 00EA; Case map*/ '\u00CB', /*00CB; 00EB; Case map*/ '\u00CC', /*00CC; 00EC; Case map*/ '\u00CD', /*00CD; 00ED; Case map*/ '\u00CE', /*00CE; 00EE; Case map*/ '\u00CF', /*00CF; 00EF; Case map*/ '\u00D0', /*00D0; 00F0; Case map*/ '\u00D1', /*00D1; 00F1; Case map*/ '\u00D2', /*00D2; 00F2; Case map*/ '\u00D3', /*00D3; 00F3; Case map*/ '\u00D4', /*00D4; 00F4; Case map*/ '\u00D5', /*00D5; 00F5; Case map*/ '\u00D6', /*00D6; 00F6; Case map*/ '\u00D8', /*00D8; 00F8; Case map*/ '\u00D9', /*00D9; 00F9; Case map*/ '\u00DA', /*00DA; 00FA; Case map*/ '\u00DB', /*00DB; 00FB; Case map*/ '\u00DC', /*00DC; 00FC; Case map*/ '\u00DD', /*00DD; 00FD; Case map*/ '\u00DE', /*00DE; 00FE; Case map*/ '\u00DF', /*00DF; 0073 0073; Case map*/ '\u0100', /*0100; 0101; Case map*/ '\u0102', /*0102; 0103; Case map*/ '\u0104', /*0104; 0105; Case map*/ '\u0106', /*0106; 0107; Case map*/ '\u0108', /*0108; 0109; Case map*/ '\u010A', /*010A; 010B; Case map*/ '\u010C', /*010C; 010D; Case map*/ '\u010E', /*010E; 010F; Case map*/ '\u0110', /*0110; 0111; Case map*/ '\u0112', /*0112; 0113; Case map*/ '\u0114', /*0114; 0115; Case map*/ '\u0116', /*0116; 0117; Case map*/ '\u0118', /*0118; 0119; Case map*/ '\u011A', /*011A; 011B; Case map*/ '\u011C', /*011C; 011D; Case map*/ '\u011E', /*011E; 011F; Case map*/ '\u0120', /*0120; 0121; Case map*/ '\u0122', /*0122; 0123; Case map*/ '\u0124', /*0124; 0125; Case map*/ '\u0126', /*0126; 0127; Case map*/ '\u0128', /*0128; 0129; Case map*/ '\u012A', /*012A; 012B; Case map*/ '\u012C', /*012C; 012D; Case map*/ '\u012E', /*012E; 012F; Case map*/ '\u0130', /*0130; 0069 0307; Case map*/ '\u0132', /*0132; 0133; Case map*/ '\u0134', /*0134; 0135; Case map*/ '\u0136', /*0136; 0137; Case map*/ '\u0139', /*0139; 013A; Case map*/ '\u013B', /*013B; 013C; Case map*/ '\u013D', /*013D; 013E; Case map*/ '\u013F', /*013F; 0140; Case map*/ '\u0141', /*0141; 0142; Case map*/ '\u0143', /*0143; 0144; Case map*/ '\u0145', /*0145; 0146; Case map*/ '\u0147', /*0147; 0148; Case map*/ '\u0149', /*0149; 02BC 006E; Case map*/ '\u014A', /*014A; 014B; Case map*/ '\u014C', /*014C; 014D; Case map*/ '\u014E', /*014E; 014F; Case map*/ '\u0150', /*0150; 0151; Case map*/ '\u0152', /*0152; 0153; Case map*/ '\u0154', /*0154; 0155; Case map*/ '\u0156', /*0156; 0157; Case map*/ '\u0158', /*0158; 0159; Case map*/ '\u015A', /*015A; 015B; Case map*/ '\u015C', /*015C; 015D; Case map*/ '\u015E', /*015E; 015F; Case map*/ '\u0160', /*0160; 0161; Case map*/ '\u0162', /*0162; 0163; Case map*/ '\u0164', /*0164; 0165; Case map*/ '\u0166', /*0166; 0167; Case map*/ '\u0168', /*0168; 0169; Case map*/ '\u016A', /*016A; 016B; Case map*/ '\u016C', /*016C; 016D; Case map*/ '\u016E', /*016E; 016F; Case map*/ '\u0170', /*0170; 0171; Case map*/ '\u0172', /*0172; 0173; Case map*/ '\u0174', /*0174; 0175; Case map*/ '\u0176', /*0176; 0177; Case map*/ '\u0178', /*0178; 00FF; Case map*/ '\u0179', /*0179; 017A; Case map*/ '\u017B', /*017B; 017C; Case map*/ '\u017D', /*017D; 017E; Case map*/ '\u017F', /*017F; 0073; Case map*/ '\u0181', /*0181; 0253; Case map*/ '\u0182', /*0182; 0183; Case map*/ '\u0184', /*0184; 0185; Case map*/ '\u0186', /*0186; 0254; Case map*/ '\u0187', /*0187; 0188; Case map*/ '\u0189', /*0189; 0256; Case map*/ '\u018A', /*018A; 0257; Case map*/ '\u018B', /*018B; 018C; Case map*/ '\u018E', /*018E; 01DD; Case map*/ '\u018F', /*018F; 0259; Case map*/ '\u0190', /*0190; 025B; Case map*/ '\u0191', /*0191; 0192; Case map*/ '\u0193', /*0193; 0260; Case map*/ '\u0194', /*0194; 0263; Case map*/ '\u0196', /*0196; 0269; Case map*/ '\u0197', /*0197; 0268; Case map*/ '\u0198', /*0198; 0199; Case map*/ '\u019C', /*019C; 026F; Case map*/ '\u019D', /*019D; 0272; Case map*/ '\u019F', /*019F; 0275; Case map*/ '\u01A0', /*01A0; 01A1; Case map*/ '\u01A2', /*01A2; 01A3; Case map*/ '\u01A4', /*01A4; 01A5; Case map*/ '\u01A6', /*01A6; 0280; Case map*/ '\u01A7', /*01A7; 01A8; Case map*/ '\u01A9', /*01A9; 0283; Case map*/ '\u01AC', /*01AC; 01AD; Case map*/ '\u01AE', /*01AE; 0288; Case map*/ '\u01AF', /*01AF; 01B0; Case map*/ '\u01B1', /*01B1; 028A; Case map*/ '\u01B2', /*01B2; 028B; Case map*/ '\u01B3', /*01B3; 01B4; Case map*/ '\u01B5', /*01B5; 01B6; Case map*/ '\u01B7', /*01B7; 0292; Case map*/ '\u01B8', /*01B8; 01B9; Case map*/ '\u01BC', /*01BC; 01BD; Case map*/ '\u01C4', /*01C4; 01C6; Case map*/ '\u01C5', /*01C5; 01C6; Case map*/ '\u01C7', /*01C7; 01C9; Case map*/ '\u01C8', /*01C8; 01C9; Case map*/ '\u01CA', /*01CA; 01CC; Case map*/ '\u01CB', /*01CB; 01CC; Case map*/ '\u01CD', /*01CD; 01CE; Case map*/ '\u01CF', /*01CF; 01D0; Case map*/ '\u01D1', /*01D1; 01D2; Case map*/ '\u01D3', /*01D3; 01D4; Case map*/ '\u01D5', /*01D5; 01D6; Case map*/ '\u01D7', /*01D7; 01D8; Case map*/ '\u01D9', /*01D9; 01DA; Case map*/ '\u01DB', /*01DB; 01DC; Case map*/ '\u01DE', /*01DE; 01DF; Case map*/ '\u01E0', /*01E0; 01E1; Case map*/ '\u01E2', /*01E2; 01E3; Case map*/ '\u01E4', /*01E4; 01E5; Case map*/ '\u01E6', /*01E6; 01E7; Case map*/ '\u01E8', /*01E8; 01E9; Case map*/ '\u01EA', /*01EA; 01EB; Case map*/ '\u01EC', /*01EC; 01ED; Case map*/ '\u01EE', /*01EE; 01EF; Case map*/ '\u01F0', /*01F0; 006A 030C; Case map*/ '\u01F1', /*01F1; 01F3; Case map*/ '\u01F2', /*01F2; 01F3; Case map*/ '\u01F4', /*01F4; 01F5; Case map*/ '\u01F6', /*01F6; 0195; Case map*/ '\u01F7', /*01F7; 01BF; Case map*/ '\u01F8', /*01F8; 01F9; Case map*/ '\u01FA', /*01FA; 01FB; Case map*/ '\u01FC', /*01FC; 01FD; Case map*/ '\u01FE', /*01FE; 01FF; Case map*/ '\u0200', /*0200; 0201; Case map*/ '\u0202', /*0202; 0203; Case map*/ '\u0204', /*0204; 0205; Case map*/ '\u0206', /*0206; 0207; Case map*/ '\u0208', /*0208; 0209; Case map*/ '\u020A', /*020A; 020B; Case map*/ '\u020C', /*020C; 020D; Case map*/ '\u020E', /*020E; 020F; Case map*/ '\u0210', /*0210; 0211; Case map*/ '\u0212', /*0212; 0213; Case map*/ '\u0214', /*0214; 0215; Case map*/ '\u0216', /*0216; 0217; Case map*/ '\u0218', /*0218; 0219; Case map*/ '\u021A', /*021A; 021B; Case map*/ '\u021C', /*021C; 021D; Case map*/ '\u021E', /*021E; 021F; Case map*/ '\u0220', /*0220; 019E; Case map*/ '\u0222', /*0222; 0223; Case map*/ '\u0224', /*0224; 0225; Case map*/ '\u0226', /*0226; 0227; Case map*/ '\u0228', /*0228; 0229; Case map*/ '\u022A', /*022A; 022B; Case map*/ '\u022C', /*022C; 022D; Case map*/ '\u022E', /*022E; 022F; Case map*/ '\u0230', /*0230; 0231; Case map*/ '\u0232', /*0232; 0233; Case map*/ '\u0345', /*0345; 03B9; Case map*/ '\u037A', /*037A; 0020 03B9; Additional folding*/ '\u0386', /*0386; 03AC; Case map*/ '\u0388', /*0388; 03AD; Case map*/ '\u0389', /*0389; 03AE; Case map*/ '\u038A', /*038A; 03AF; Case map*/ '\u038C', /*038C; 03CC; Case map*/ '\u038E', /*038E; 03CD; Case map*/ '\u038F', /*038F; 03CE; Case map*/ '\u0390', /*0390; 03B9 0308 0301; Case map*/ '\u0391', /*0391; 03B1; Case map*/ '\u0392', /*0392; 03B2; Case map*/ '\u0393', /*0393; 03B3; Case map*/ '\u0394', /*0394; 03B4; Case map*/ '\u0395', /*0395; 03B5; Case map*/ '\u0396', /*0396; 03B6; Case map*/ '\u0397', /*0397; 03B7; Case map*/ '\u0398', /*0398; 03B8; Case map*/ '\u0399', /*0399; 03B9; Case map*/ '\u039A', /*039A; 03BA; Case map*/ '\u039B', /*039B; 03BB; Case map*/ '\u039C', /*039C; 03BC; Case map*/ '\u039D', /*039D; 03BD; Case map*/ '\u039E', /*039E; 03BE; Case map*/ '\u039F', /*039F; 03BF; Case map*/ '\u03A0', /*03A0; 03C0; Case map*/ '\u03A1', /*03A1; 03C1; Case map*/ '\u03A3', /*03A3; 03C3; Case map*/ '\u03A4', /*03A4; 03C4; Case map*/ '\u03A5', /*03A5; 03C5; Case map*/ '\u03A6', /*03A6; 03C6; Case map*/ '\u03A7', /*03A7; 03C7; Case map*/ '\u03A8', /*03A8; 03C8; Case map*/ '\u03A9', /*03A9; 03C9; Case map*/ '\u03AA', /*03AA; 03CA; Case map*/ '\u03AB', /*03AB; 03CB; Case map*/ '\u03B0', /*03B0; 03C5 0308 0301; Case map*/ '\u03C2', /*03C2; 03C3; Case map*/ '\u03D0', /*03D0; 03B2; Case map*/ '\u03D1', /*03D1; 03B8; Case map*/ '\u03D2', /*03D2; 03C5; Additional folding*/ '\u03D3', /*03D3; 03CD; Additional folding*/ '\u03D4', /*03D4; 03CB; Additional folding*/ '\u03D5', /*03D5; 03C6; Case map*/ '\u03D6', /*03D6; 03C0; Case map*/ '\u03D8', /*03D8; 03D9; Case map*/ '\u03DA', /*03DA; 03DB; Case map*/ '\u03DC', /*03DC; 03DD; Case map*/ '\u03DE', /*03DE; 03DF; Case map*/ '\u03E0', /*03E0; 03E1; Case map*/ '\u03E2', /*03E2; 03E3; Case map*/ '\u03E4', /*03E4; 03E5; Case map*/ '\u03E6', /*03E6; 03E7; Case map*/ '\u03E8', /*03E8; 03E9; Case map*/ '\u03EA', /*03EA; 03EB; Case map*/ '\u03EC', /*03EC; 03ED; Case map*/ '\u03EE', /*03EE; 03EF; Case map*/ '\u03F0', /*03F0; 03BA; Case map*/ '\u03F1', /*03F1; 03C1; Case map*/ '\u03F2', /*03F2; 03C3; Case map*/ '\u03F4', /*03F4; 03B8; Case map*/ '\u03F5', /*03F5; 03B5; Case map*/ '\u0400', /*0400; 0450; Case map*/ '\u0401', /*0401; 0451; Case map*/ '\u0402', /*0402; 0452; Case map*/ '\u0403', /*0403; 0453; Case map*/ '\u0404', /*0404; 0454; Case map*/ '\u0405', /*0405; 0455; Case map*/ '\u0406', /*0406; 0456; Case map*/ '\u0407', /*0407; 0457; Case map*/ '\u0408', /*0408; 0458; Case map*/ '\u0409', /*0409; 0459; Case map*/ '\u040A', /*040A; 045A; Case map*/ '\u040B', /*040B; 045B; Case map*/ '\u040C', /*040C; 045C; Case map*/ '\u040D', /*040D; 045D; Case map*/ '\u040E', /*040E; 045E; Case map*/ '\u040F', /*040F; 045F; Case map*/ '\u0410', /*0410; 0430; Case map*/ '\u0411', /*0411; 0431; Case map*/ '\u0412', /*0412; 0432; Case map*/ '\u0413', /*0413; 0433; Case map*/ '\u0414', /*0414; 0434; Case map*/ '\u0415', /*0415; 0435; Case map*/ '\u0416', /*0416; 0436; Case map*/ '\u0417', /*0417; 0437; Case map*/ '\u0418', /*0418; 0438; Case map*/ '\u0419', /*0419; 0439; Case map*/ '\u041A', /*041A; 043A; Case map*/ '\u041B', /*041B; 043B; Case map*/ '\u041C', /*041C; 043C; Case map*/ '\u041D', /*041D; 043D; Case map*/ '\u041E', /*041E; 043E; Case map*/ '\u041F', /*041F; 043F; Case map*/ '\u0420', /*0420; 0440; Case map*/ '\u0421', /*0421; 0441; Case map*/ '\u0422', /*0422; 0442; Case map*/ '\u0423', /*0423; 0443; Case map*/ '\u0424', /*0424; 0444; Case map*/ '\u0425', /*0425; 0445; Case map*/ '\u0426', /*0426; 0446; Case map*/ '\u0427', /*0427; 0447; Case map*/ '\u0428', /*0428; 0448; Case map*/ '\u0429', /*0429; 0449; Case map*/ '\u042A', /*042A; 044A; Case map*/ '\u042B', /*042B; 044B; Case map*/ '\u042C', /*042C; 044C; Case map*/ '\u042D', /*042D; 044D; Case map*/ '\u042E', /*042E; 044E; Case map*/ '\u042F', /*042F; 044F; Case map*/ '\u0460', /*0460; 0461; Case map*/ '\u0462', /*0462; 0463; Case map*/ '\u0464', /*0464; 0465; Case map*/ '\u0466', /*0466; 0467; Case map*/ '\u0468', /*0468; 0469; Case map*/ '\u046A', /*046A; 046B; Case map*/ '\u046C', /*046C; 046D; Case map*/ '\u046E', /*046E; 046F; Case map*/ '\u0470', /*0470; 0471; Case map*/ '\u0472', /*0472; 0473; Case map*/ '\u0474', /*0474; 0475; Case map*/ '\u0476', /*0476; 0477; Case map*/ '\u0478', /*0478; 0479; Case map*/ '\u047A', /*047A; 047B; Case map*/ '\u047C', /*047C; 047D; Case map*/ '\u047E', /*047E; 047F; Case map*/ '\u0480', /*0480; 0481; Case map*/ '\u048A', /*048A; 048B; Case map*/ '\u048C', /*048C; 048D; Case map*/ '\u048E', /*048E; 048F; Case map*/ '\u0490', /*0490; 0491; Case map*/ '\u0492', /*0492; 0493; Case map*/ '\u0494', /*0494; 0495; Case map*/ '\u0496', /*0496; 0497; Case map*/ '\u0498', /*0498; 0499; Case map*/ '\u049A', /*049A; 049B; Case map*/ '\u049C', /*049C; 049D; Case map*/ '\u049E', /*049E; 049F; Case map*/ '\u04A0', /*04A0; 04A1; Case map*/ '\u04A2', /*04A2; 04A3; Case map*/ '\u04A4', /*04A4; 04A5; Case map*/ '\u04A6', /*04A6; 04A7; Case map*/ '\u04A8', /*04A8; 04A9; Case map*/ '\u04AA', /*04AA; 04AB; Case map*/ '\u04AC', /*04AC; 04AD; Case map*/ '\u04AE', /*04AE; 04AF; Case map*/ '\u04B0', /*04B0; 04B1; Case map*/ '\u04B2', /*04B2; 04B3; Case map*/ '\u04B4', /*04B4; 04B5; Case map*/ '\u04B6', /*04B6; 04B7; Case map*/ '\u04B8', /*04B8; 04B9; Case map*/ '\u04BA', /*04BA; 04BB; Case map*/ '\u04BC', /*04BC; 04BD; Case map*/ '\u04BE', /*04BE; 04BF; Case map*/ '\u04C1', /*04C1; 04C2; Case map*/ '\u04C3', /*04C3; 04C4; Case map*/ '\u04C5', /*04C5; 04C6; Case map*/ '\u04C7', /*04C7; 04C8; Case map*/ '\u04C9', /*04C9; 04CA; Case map*/ '\u04CB', /*04CB; 04CC; Case map*/ '\u04CD', /*04CD; 04CE; Case map*/ '\u04D0', /*04D0; 04D1; Case map*/ '\u04D2', /*04D2; 04D3; Case map*/ '\u04D4', /*04D4; 04D5; Case map*/ '\u04D6', /*04D6; 04D7; Case map*/ '\u04D8', /*04D8; 04D9; Case map*/ '\u04DA', /*04DA; 04DB; Case map*/ '\u04DC', /*04DC; 04DD; Case map*/ '\u04DE', /*04DE; 04DF; Case map*/ '\u04E0', /*04E0; 04E1; Case map*/ '\u04E2', /*04E2; 04E3; Case map*/ '\u04E4', /*04E4; 04E5; Case map*/ '\u04E6', /*04E6; 04E7; Case map*/ '\u04E8', /*04E8; 04E9; Case map*/ '\u04EA', /*04EA; 04EB; Case map*/ '\u04EC', /*04EC; 04ED; Case map*/ '\u04EE', /*04EE; 04EF; Case map*/ '\u04F0', /*04F0; 04F1; Case map*/ '\u04F2', /*04F2; 04F3; Case map*/ '\u04F4', /*04F4; 04F5; Case map*/ '\u04F8', /*04F8; 04F9; Case map*/ '\u0500', /*0500; 0501; Case map*/ '\u0502', /*0502; 0503; Case map*/ '\u0504', /*0504; 0505; Case map*/ '\u0506', /*0506; 0507; Case map*/ '\u0508', /*0508; 0509; Case map*/ '\u050A', /*050A; 050B; Case map*/ '\u050C', /*050C; 050D; Case map*/ '\u050E', /*050E; 050F; Case map*/ '\u0531', /*0531; 0561; Case map*/ '\u0532', /*0532; 0562; Case map*/ '\u0533', /*0533; 0563; Case map*/ '\u0534', /*0534; 0564; Case map*/ '\u0535', /*0535; 0565; Case map*/ '\u0536', /*0536; 0566; Case map*/ '\u0537', /*0537; 0567; Case map*/ '\u0538', /*0538; 0568; Case map*/ '\u0539', /*0539; 0569; Case map*/ '\u053A', /*053A; 056A; Case map*/ '\u053B', /*053B; 056B; Case map*/ '\u053C', /*053C; 056C; Case map*/ '\u053D', /*053D; 056D; Case map*/ '\u053E', /*053E; 056E; Case map*/ '\u053F', /*053F; 056F; Case map*/ '\u0540', /*0540; 0570; Case map*/ '\u0541', /*0541; 0571; Case map*/ '\u0542', /*0542; 0572; Case map*/ '\u0543', /*0543; 0573; Case map*/ '\u0544', /*0544; 0574; Case map*/ '\u0545', /*0545; 0575; Case map*/ '\u0546', /*0546; 0576; Case map*/ '\u0547', /*0547; 0577; Case map*/ '\u0548', /*0548; 0578; Case map*/ '\u0549', /*0549; 0579; Case map*/ '\u054A', /*054A; 057A; Case map*/ '\u054B', /*054B; 057B; Case map*/ '\u054C', /*054C; 057C; Case map*/ '\u054D', /*054D; 057D; Case map*/ '\u054E', /*054E; 057E; Case map*/ '\u054F', /*054F; 057F; Case map*/ '\u0550', /*0550; 0580; Case map*/ '\u0551', /*0551; 0581; Case map*/ '\u0552', /*0552; 0582; Case map*/ '\u0553', /*0553; 0583; Case map*/ '\u0554', /*0554; 0584; Case map*/ '\u0555', /*0555; 0585; Case map*/ '\u0556', /*0556; 0586; Case map*/ '\u0587', /*0587; 0565 0582; Case map*/ '\u1E00', /*1E00; 1E01; Case map*/ '\u1E02', /*1E02; 1E03; Case map*/ '\u1E04', /*1E04; 1E05; Case map*/ '\u1E06', /*1E06; 1E07; Case map*/ '\u1E08', /*1E08; 1E09; Case map*/ '\u1E0A', /*1E0A; 1E0B; Case map*/ '\u1E0C', /*1E0C; 1E0D; Case map*/ '\u1E0E', /*1E0E; 1E0F; Case map*/ '\u1E10', /*1E10; 1E11; Case map*/ '\u1E12', /*1E12; 1E13; Case map*/ '\u1E14', /*1E14; 1E15; Case map*/ '\u1E16', /*1E16; 1E17; Case map*/ '\u1E18', /*1E18; 1E19; Case map*/ '\u1E1A', /*1E1A; 1E1B; Case map*/ '\u1E1C', /*1E1C; 1E1D; Case map*/ '\u1E1E', /*1E1E; 1E1F; Case map*/ '\u1E20', /*1E20; 1E21; Case map*/ '\u1E22', /*1E22; 1E23; Case map*/ '\u1E24', /*1E24; 1E25; Case map*/ '\u1E26', /*1E26; 1E27; Case map*/ '\u1E28', /*1E28; 1E29; Case map*/ '\u1E2A', /*1E2A; 1E2B; Case map*/ '\u1E2C', /*1E2C; 1E2D; Case map*/ '\u1E2E', /*1E2E; 1E2F; Case map*/ '\u1E30', /*1E30; 1E31; Case map*/ '\u1E32', /*1E32; 1E33; Case map*/ '\u1E34', /*1E34; 1E35; Case map*/ '\u1E36', /*1E36; 1E37; Case map*/ '\u1E38', /*1E38; 1E39; Case map*/ '\u1E3A', /*1E3A; 1E3B; Case map*/ '\u1E3C', /*1E3C; 1E3D; Case map*/ '\u1E3E', /*1E3E; 1E3F; Case map*/ '\u1E40', /*1E40; 1E41; Case map*/ '\u1E42', /*1E42; 1E43; Case map*/ '\u1E44', /*1E44; 1E45; Case map*/ '\u1E46', /*1E46; 1E47; Case map*/ '\u1E48', /*1E48; 1E49; Case map*/ '\u1E4A', /*1E4A; 1E4B; Case map*/ '\u1E4C', /*1E4C; 1E4D; Case map*/ '\u1E4E', /*1E4E; 1E4F; Case map*/ '\u1E50', /*1E50; 1E51; Case map*/ '\u1E52', /*1E52; 1E53; Case map*/ '\u1E54', /*1E54; 1E55; Case map*/ '\u1E56', /*1E56; 1E57; Case map*/ '\u1E58', /*1E58; 1E59; Case map*/ '\u1E5A', /*1E5A; 1E5B; Case map*/ '\u1E5C', /*1E5C; 1E5D; Case map*/ '\u1E5E', /*1E5E; 1E5F; Case map*/ '\u1E60', /*1E60; 1E61; Case map*/ '\u1E62', /*1E62; 1E63; Case map*/ '\u1E64', /*1E64; 1E65; Case map*/ '\u1E66', /*1E66; 1E67; Case map*/ '\u1E68', /*1E68; 1E69; Case map*/ '\u1E6A', /*1E6A; 1E6B; Case map*/ '\u1E6C', /*1E6C; 1E6D; Case map*/ '\u1E6E', /*1E6E; 1E6F; Case map*/ '\u1E70', /*1E70; 1E71; Case map*/ '\u1E72', /*1E72; 1E73; Case map*/ '\u1E74', /*1E74; 1E75; Case map*/ '\u1E76', /*1E76; 1E77; Case map*/ '\u1E78', /*1E78; 1E79; Case map*/ '\u1E7A', /*1E7A; 1E7B; Case map*/ '\u1E7C', /*1E7C; 1E7D; Case map*/ '\u1E7E', /*1E7E; 1E7F; Case map*/ '\u1E80', /*1E80; 1E81; Case map*/ '\u1E82', /*1E82; 1E83; Case map*/ '\u1E84', /*1E84; 1E85; Case map*/ '\u1E86', /*1E86; 1E87; Case map*/ '\u1E88', /*1E88; 1E89; Case map*/ '\u1E8A', /*1E8A; 1E8B; Case map*/ '\u1E8C', /*1E8C; 1E8D; Case map*/ '\u1E8E', /*1E8E; 1E8F; Case map*/ '\u1E90', /*1E90; 1E91; Case map*/ '\u1E92', /*1E92; 1E93; Case map*/ '\u1E94', /*1E94; 1E95; Case map*/ '\u1E96', /*1E96; 0068 0331; Case map*/ '\u1E97', /*1E97; 0074 0308; Case map*/ '\u1E98', /*1E98; 0077 030A; Case map*/ '\u1E99', /*1E99; 0079 030A; Case map*/ '\u1E9A', /*1E9A; 0061 02BE; Case map*/ '\u1E9B', /*1E9B; 1E61; Case map*/ '\u1EA0', /*1EA0; 1EA1; Case map*/ '\u1EA2', /*1EA2; 1EA3; Case map*/ '\u1EA4', /*1EA4; 1EA5; Case map*/ '\u1EA6', /*1EA6; 1EA7; Case map*/ '\u1EA8', /*1EA8; 1EA9; Case map*/ '\u1EAA', /*1EAA; 1EAB; Case map*/ '\u1EAC', /*1EAC; 1EAD; Case map*/ '\u1EAE', /*1EAE; 1EAF; Case map*/ '\u1EB0', /*1EB0; 1EB1; Case map*/ '\u1EB2', /*1EB2; 1EB3; Case map*/ '\u1EB4', /*1EB4; 1EB5; Case map*/ '\u1EB6', /*1EB6; 1EB7; Case map*/ '\u1EB8', /*1EB8; 1EB9; Case map*/ '\u1EBA', /*1EBA; 1EBB; Case map*/ '\u1EBC', /*1EBC; 1EBD; Case map*/ '\u1EBE', /*1EBE; 1EBF; Case map*/ '\u1EC0', /*1EC0; 1EC1; Case map*/ '\u1EC2', /*1EC2; 1EC3; Case map*/ '\u1EC4', /*1EC4; 1EC5; Case map*/ '\u1EC6', /*1EC6; 1EC7; Case map*/ '\u1EC8', /*1EC8; 1EC9; Case map*/ '\u1ECA', /*1ECA; 1ECB; Case map*/ '\u1ECC', /*1ECC; 1ECD; Case map*/ '\u1ECE', /*1ECE; 1ECF; Case map*/ '\u1ED0', /*1ED0; 1ED1; Case map*/ '\u1ED2', /*1ED2; 1ED3; Case map*/ '\u1ED4', /*1ED4; 1ED5; Case map*/ '\u1ED6', /*1ED6; 1ED7; Case map*/ '\u1ED8', /*1ED8; 1ED9; Case map*/ '\u1EDA', /*1EDA; 1EDB; Case map*/ '\u1EDC', /*1EDC; 1EDD; Case map*/ '\u1EDE', /*1EDE; 1EDF; Case map*/ '\u1EE0', /*1EE0; 1EE1; Case map*/ '\u1EE2', /*1EE2; 1EE3; Case map*/ '\u1EE4', /*1EE4; 1EE5; Case map*/ '\u1EE6', /*1EE6; 1EE7; Case map*/ '\u1EE8', /*1EE8; 1EE9; Case map*/ '\u1EEA', /*1EEA; 1EEB; Case map*/ '\u1EEC', /*1EEC; 1EED; Case map*/ '\u1EEE', /*1EEE; 1EEF; Case map*/ '\u1EF0', /*1EF0; 1EF1; Case map*/ '\u1EF2', /*1EF2; 1EF3; Case map*/ '\u1EF4', /*1EF4; 1EF5; Case map*/ '\u1EF6', /*1EF6; 1EF7; Case map*/ '\u1EF8', /*1EF8; 1EF9; Case map*/ '\u1F08', /*1F08; 1F00; Case map*/ '\u1F09', /*1F09; 1F01; Case map*/ '\u1F0A', /*1F0A; 1F02; Case map*/ '\u1F0B', /*1F0B; 1F03; Case map*/ '\u1F0C', /*1F0C; 1F04; Case map*/ '\u1F0D', /*1F0D; 1F05; Case map*/ '\u1F0E', /*1F0E; 1F06; Case map*/ '\u1F0F', /*1F0F; 1F07; Case map*/ '\u1F18', /*1F18; 1F10; Case map*/ '\u1F19', /*1F19; 1F11; Case map*/ '\u1F1A', /*1F1A; 1F12; Case map*/ '\u1F1B', /*1F1B; 1F13; Case map*/ '\u1F1C', /*1F1C; 1F14; Case map*/ '\u1F1D', /*1F1D; 1F15; Case map*/ '\u1F28', /*1F28; 1F20; Case map*/ '\u1F29', /*1F29; 1F21; Case map*/ '\u1F2A', /*1F2A; 1F22; Case map*/ '\u1F2B', /*1F2B; 1F23; Case map*/ '\u1F2C', /*1F2C; 1F24; Case map*/ '\u1F2D', /*1F2D; 1F25; Case map*/ '\u1F2E', /*1F2E; 1F26; Case map*/ '\u1F2F', /*1F2F; 1F27; Case map*/ '\u1F38', /*1F38; 1F30; Case map*/ '\u1F39', /*1F39; 1F31; Case map*/ '\u1F3A', /*1F3A; 1F32; Case map*/ '\u1F3B', /*1F3B; 1F33; Case map*/ '\u1F3C', /*1F3C; 1F34; Case map*/ '\u1F3D', /*1F3D; 1F35; Case map*/ '\u1F3E', /*1F3E; 1F36; Case map*/ '\u1F3F', /*1F3F; 1F37; Case map*/ '\u1F48', /*1F48; 1F40; Case map*/ '\u1F49', /*1F49; 1F41; Case map*/ '\u1F4A', /*1F4A; 1F42; Case map*/ '\u1F4B', /*1F4B; 1F43; Case map*/ '\u1F4C', /*1F4C; 1F44; Case map*/ '\u1F4D', /*1F4D; 1F45; Case map*/ '\u1F50', /*1F50; 03C5 0313; Case map*/ '\u1F52', /*1F52; 03C5 0313 0300; Case map*/ '\u1F54', /*1F54; 03C5 0313 0301; Case map*/ '\u1F56', /*1F56; 03C5 0313 0342; Case map*/ '\u1F59', /*1F59; 1F51; Case map*/ '\u1F5B', /*1F5B; 1F53; Case map*/ '\u1F5D', /*1F5D; 1F55; Case map*/ '\u1F5F', /*1F5F; 1F57; Case map*/ '\u1F68', /*1F68; 1F60; Case map*/ '\u1F69', /*1F69; 1F61; Case map*/ '\u1F6A', /*1F6A; 1F62; Case map*/ '\u1F6B', /*1F6B; 1F63; Case map*/ '\u1F6C', /*1F6C; 1F64; Case map*/ '\u1F6D', /*1F6D; 1F65; Case map*/ '\u1F6E', /*1F6E; 1F66; Case map*/ '\u1F6F', /*1F6F; 1F67; Case map*/ '\u1F80', /*1F80; 1F00 03B9; Case map*/ '\u1F81', /*1F81; 1F01 03B9; Case map*/ '\u1F82', /*1F82; 1F02 03B9; Case map*/ '\u1F83', /*1F83; 1F03 03B9; Case map*/ '\u1F84', /*1F84; 1F04 03B9; Case map*/ '\u1F85', /*1F85; 1F05 03B9; Case map*/ '\u1F86', /*1F86; 1F06 03B9; Case map*/ '\u1F87', /*1F87; 1F07 03B9; Case map*/ '\u1F88', /*1F88; 1F00 03B9; Case map*/ '\u1F89', /*1F89; 1F01 03B9; Case map*/ '\u1F8A', /*1F8A; 1F02 03B9; Case map*/ '\u1F8B', /*1F8B; 1F03 03B9; Case map*/ '\u1F8C', /*1F8C; 1F04 03B9; Case map*/ '\u1F8D', /*1F8D; 1F05 03B9; Case map*/ '\u1F8E', /*1F8E; 1F06 03B9; Case map*/ '\u1F8F', /*1F8F; 1F07 03B9; Case map*/ '\u1F90', /*1F90; 1F20 03B9; Case map*/ '\u1F91', /*1F91; 1F21 03B9; Case map*/ '\u1F92', /*1F92; 1F22 03B9; Case map*/ '\u1F93', /*1F93; 1F23 03B9; Case map*/ '\u1F94', /*1F94; 1F24 03B9; Case map*/ '\u1F95', /*1F95; 1F25 03B9; Case map*/ '\u1F96', /*1F96; 1F26 03B9; Case map*/ '\u1F97', /*1F97; 1F27 03B9; Case map*/ '\u1F98', /*1F98; 1F20 03B9; Case map*/ '\u1F99', /*1F99; 1F21 03B9; Case map*/ '\u1F9A', /*1F9A; 1F22 03B9; Case map*/ '\u1F9B', /*1F9B; 1F23 03B9; Case map*/ '\u1F9C', /*1F9C; 1F24 03B9; Case map*/ '\u1F9D', /*1F9D; 1F25 03B9; Case map*/ '\u1F9E', /*1F9E; 1F26 03B9; Case map*/ '\u1F9F', /*1F9F; 1F27 03B9; Case map*/ '\u1FA0', /*1FA0; 1F60 03B9; Case map*/ '\u1FA1', /*1FA1; 1F61 03B9; Case map*/ '\u1FA2', /*1FA2; 1F62 03B9; Case map*/ '\u1FA3', /*1FA3; 1F63 03B9; Case map*/ '\u1FA4', /*1FA4; 1F64 03B9; Case map*/ '\u1FA5', /*1FA5; 1F65 03B9; Case map*/ '\u1FA6', /*1FA6; 1F66 03B9; Case map*/ '\u1FA7', /*1FA7; 1F67 03B9; Case map*/ '\u1FA8', /*1FA8; 1F60 03B9; Case map*/ '\u1FA9', /*1FA9; 1F61 03B9; Case map*/ '\u1FAA', /*1FAA; 1F62 03B9; Case map*/ '\u1FAB', /*1FAB; 1F63 03B9; Case map*/ '\u1FAC', /*1FAC; 1F64 03B9; Case map*/ '\u1FAD', /*1FAD; 1F65 03B9; Case map*/ '\u1FAE', /*1FAE; 1F66 03B9; Case map*/ '\u1FAF', /*1FAF; 1F67 03B9; Case map*/ '\u1FB2', /*1FB2; 1F70 03B9; Case map*/ '\u1FB3', /*1FB3; 03B1 03B9; Case map*/ '\u1FB4', /*1FB4; 03AC 03B9; Case map*/ '\u1FB6', /*1FB6; 03B1 0342; Case map*/ '\u1FB7', /*1FB7; 03B1 0342 03B9; Case map*/ '\u1FB8', /*1FB8; 1FB0; Case map*/ '\u1FB9', /*1FB9; 1FB1; Case map*/ '\u1FBA', /*1FBA; 1F70; Case map*/ '\u1FBB', /*1FBB; 1F71; Case map*/ '\u1FBC', /*1FBC; 03B1 03B9; Case map*/ '\u1FBE', /*1FBE; 03B9; Case map*/ '\u1FC2', /*1FC2; 1F74 03B9; Case map*/ '\u1FC3', /*1FC3; 03B7 03B9; Case map*/ '\u1FC4', /*1FC4; 03AE 03B9; Case map*/ '\u1FC6', /*1FC6; 03B7 0342; Case map*/ '\u1FC7', /*1FC7; 03B7 0342 03B9; Case map*/ '\u1FC8', /*1FC8; 1F72; Case map*/ '\u1FC9', /*1FC9; 1F73; Case map*/ '\u1FCA', /*1FCA; 1F74; Case map*/ '\u1FCB', /*1FCB; 1F75; Case map*/ '\u1FCC', /*1FCC; 03B7 03B9; Case map*/ '\u1FD2', /*1FD2; 03B9 0308 0300; Case map*/ '\u1FD3', /*1FD3; 03B9 0308 0301; Case map*/ '\u1FD6', /*1FD6; 03B9 0342; Case map*/ '\u1FD7', /*1FD7; 03B9 0308 0342; Case map*/ '\u1FD8', /*1FD8; 1FD0; Case map*/ '\u1FD9', /*1FD9; 1FD1; Case map*/ '\u1FDA', /*1FDA; 1F76; Case map*/ '\u1FDB', /*1FDB; 1F77; Case map*/ '\u1FE2', /*1FE2; 03C5 0308 0300; Case map*/ '\u1FE3', /*1FE3; 03C5 0308 0301; Case map*/ '\u1FE4', /*1FE4; 03C1 0313; Case map*/ '\u1FE6', /*1FE6; 03C5 0342; Case map*/ '\u1FE7', /*1FE7; 03C5 0308 0342; Case map*/ '\u1FE8', /*1FE8; 1FE0; Case map*/ '\u1FE9', /*1FE9; 1FE1; Case map*/ '\u1FEA', /*1FEA; 1F7A; Case map*/ '\u1FEB', /*1FEB; 1F7B; Case map*/ '\u1FEC', /*1FEC; 1FE5; Case map*/ '\u1FF2', /*1FF2; 1F7C 03B9; Case map*/ '\u1FF3', /*1FF3; 03C9 03B9; Case map*/ '\u1FF4', /*1FF4; 03CE 03B9; Case map*/ '\u1FF6', /*1FF6; 03C9 0342; Case map*/ '\u1FF7', /*1FF7; 03C9 0342 03B9; Case map*/ '\u1FF8', /*1FF8; 1F78; Case map*/ '\u1FF9', /*1FF9; 1F79; Case map*/ '\u1FFA', /*1FFA; 1F7C; Case map*/ '\u1FFB', /*1FFB; 1F7D; Case map*/ '\u1FFC', /*1FFC; 03C9 03B9; Case map*/ '\u20A8', /*20A8; 0072 0073; Additional folding*/ '\u2102', /*2102; 0063; Additional folding*/ '\u2103', /*2103; 00B0 0063; Additional folding*/ '\u2107', /*2107; 025B; Additional folding*/ '\u2109', /*2109; 00B0 0066; Additional folding*/ '\u210B', /*210B; 0068; Additional folding*/ '\u210C', /*210C; 0068; Additional folding*/ '\u210D', /*210D; 0068; Additional folding*/ '\u2110', /*2110; 0069; Additional folding*/ '\u2111', /*2111; 0069; Additional folding*/ '\u2112', /*2112; 006C; Additional folding*/ '\u2115', /*2115; 006E; Additional folding*/ '\u2116', /*2116; 006E 006F; Additional folding*/ '\u2119', /*2119; 0070; Additional folding*/ '\u211A', /*211A; 0071; Additional folding*/ '\u211B', /*211B; 0072; Additional folding*/ '\u211C', /*211C; 0072; Additional folding*/ '\u211D', /*211D; 0072; Additional folding*/ '\u2120', /*2120; 0073 006D; Additional folding*/ '\u2121', /*2121; 0074 0065 006C; Additional folding*/ '\u2122', /*2122; 0074 006D; Additional folding*/ '\u2124', /*2124; 007A; Additional folding*/ '\u2126', /*2126; 03C9; Case map*/ '\u2128', /*2128; 007A; Additional folding*/ '\u212A', /*212A; 006B; Case map*/ '\u212B', /*212B; 00E5; Case map*/ '\u212C', /*212C; 0062; Additional folding*/ '\u212D', /*212D; 0063; Additional folding*/ '\u2130', /*2130; 0065; Additional folding*/ '\u2131', /*2131; 0066; Additional folding*/ '\u2133', /*2133; 006D; Additional folding*/ '\u213E', /*213E; 03B3; Additional folding*/ '\u213F', /*213F; 03C0; Additional folding*/ '\u2145', /*2145; 0064; Additional folding*/ '\u2160', /*2160; 2170; Case map*/ '\u2161', /*2161; 2171; Case map*/ '\u2162', /*2162; 2172; Case map*/ '\u2163', /*2163; 2173; Case map*/ '\u2164', /*2164; 2174; Case map*/ '\u2165', /*2165; 2175; Case map*/ '\u2166', /*2166; 2176; Case map*/ '\u2167', /*2167; 2177; Case map*/ '\u2168', /*2168; 2178; Case map*/ '\u2169', /*2169; 2179; Case map*/ '\u216A', /*216A; 217A; Case map*/ '\u216B', /*216B; 217B; Case map*/ '\u216C', /*216C; 217C; Case map*/ '\u216D', /*216D; 217D; Case map*/ '\u216E', /*216E; 217E; Case map*/ '\u216F', /*216F; 217F; Case map*/ '\u24B6', /*24B6; 24D0; Case map*/ '\u24B7', /*24B7; 24D1; Case map*/ '\u24B8', /*24B8; 24D2; Case map*/ '\u24B9', /*24B9; 24D3; Case map*/ '\u24BA', /*24BA; 24D4; Case map*/ '\u24BB', /*24BB; 24D5; Case map*/ '\u24BC', /*24BC; 24D6; Case map*/ '\u24BD', /*24BD; 24D7; Case map*/ '\u24BE', /*24BE; 24D8; Case map*/ '\u24BF', /*24BF; 24D9; Case map*/ '\u24C0', /*24C0; 24DA; Case map*/ '\u24C1', /*24C1; 24DB; Case map*/ '\u24C2', /*24C2; 24DC; Case map*/ '\u24C3', /*24C3; 24DD; Case map*/ '\u24C4', /*24C4; 24DE; Case map*/ '\u24C5', /*24C5; 24DF; Case map*/ '\u24C6', /*24C6; 24E0; Case map*/ '\u24C7', /*24C7; 24E1; Case map*/ '\u24C8', /*24C8; 24E2; Case map*/ '\u24C9', /*24C9; 24E3; Case map*/ '\u24CA', /*24CA; 24E4; Case map*/ '\u24CB', /*24CB; 24E5; Case map*/ '\u24CC', /*24CC; 24E6; Case map*/ '\u24CD', /*24CD; 24E7; Case map*/ '\u24CE', /*24CE; 24E8; Case map*/ '\u24CF', /*24CF; 24E9; Case map*/ '\u3371', /*3371; 0068 0070 0061; Additional folding*/ '\u3373', /*3373; 0061 0075; Additional folding*/ '\u3375', /*3375; 006F 0076; Additional folding*/ '\u3380', /*3380; 0070 0061; Additional folding*/ '\u3381', /*3381; 006E 0061; Additional folding*/ '\u3382', /*3382; 03BC 0061; Additional folding*/ '\u3383', /*3383; 006D 0061; Additional folding*/ '\u3384', /*3384; 006B 0061; Additional folding*/ '\u3385', /*3385; 006B 0062; Additional folding*/ '\u3386', /*3386; 006D 0062; Additional folding*/ '\u3387', /*3387; 0067 0062; Additional folding*/ '\u338A', /*338A; 0070 0066; Additional folding*/ '\u338B', /*338B; 006E 0066; Additional folding*/ '\u338C', /*338C; 03BC 0066; Additional folding*/ '\u3390', /*3390; 0068 007A; Additional folding*/ '\u3391', /*3391; 006B 0068 007A; Additional folding*/ '\u3392', /*3392; 006D 0068 007A; Additional folding*/ '\u3393', /*3393; 0067 0068 007A; Additional folding*/ '\u3394', /*3394; 0074 0068 007A; Additional folding*/ '\u33A9', /*33A9; 0070 0061; Additional folding*/ '\u33AA', /*33AA; 006B 0070 0061; Additional folding*/ '\u33AB', /*33AB; 006D 0070 0061; Additional folding*/ '\u33AC', /*33AC; 0067 0070 0061; Additional folding*/ '\u33B4', /*33B4; 0070 0076; Additional folding*/ '\u33B5', /*33B5; 006E 0076; Additional folding*/ '\u33B6', /*33B6; 03BC 0076; Additional folding*/ '\u33B7', /*33B7; 006D 0076; Additional folding*/ '\u33B8', /*33B8; 006B 0076; Additional folding*/ '\u33B9', /*33B9; 006D 0076; Additional folding*/ '\u33BA', /*33BA; 0070 0077; Additional folding*/ '\u33BB', /*33BB; 006E 0077; Additional folding*/ '\u33BC', /*33BC; 03BC 0077; Additional folding*/ '\u33BD', /*33BD; 006D 0077; Additional folding*/ '\u33BE', /*33BE; 006B 0077; Additional folding*/ '\u33BF', /*33BF; 006D 0077; Additional folding*/ '\u33C0', /*33C0; 006B 03C9; Additional folding*/ '\u33C1', /*33C1; 006D 03C9; Additional folding*/ '\u33C3', /*33C3; 0062 0071; Additional folding*/ '\u33C6', /*33C6; 0063 2215 006B 0067; Additional folding*/ '\u33C7', /*33C7; 0063 006F 002E; Additional folding*/ '\u33C8', /*33C8; 0064 0062; Additional folding*/ '\u33C9', /*33C9; 0067 0079; Additional folding*/ '\u33CB', /*33CB; 0068 0070; Additional folding*/ '\u33CD', /*33CD; 006B 006B; Additional folding*/ '\u33CE', /*33CE; 006B 006D; Additional folding*/ '\u33D7', /*33D7; 0070 0068; Additional folding*/ '\u33D9', /*33D9; 0070 0070 006D; Additional folding*/ '\u33DA', /*33DA; 0070 0072; Additional folding*/ '\u33DC', /*33DC; 0073 0076; Additional folding*/ '\u33DD', /*33DD; 0077 0062; Additional folding*/ '\uFB00', /*FB00; 0066 0066; Case map*/ '\uFB01', /*FB01; 0066 0069; Case map*/ '\uFB02', /*FB02; 0066 006C; Case map*/ '\uFB03', /*FB03; 0066 0066 0069; Case map*/ '\uFB04', /*FB04; 0066 0066 006C; Case map*/ '\uFB05', /*FB05; 0073 0074; Case map*/ '\uFB06', /*FB06; 0073 0074; Case map*/ '\uFB13', /*FB13; 0574 0576; Case map*/ '\uFB14', /*FB14; 0574 0565; Case map*/ '\uFB15', /*FB15; 0574 056B; Case map*/ '\uFB16', /*FB16; 057E 0576; Case map*/ '\uFB17', /*FB17; 0574 056D; Case map*/ '\uFF21', /*FF21; FF41; Case map*/ '\uFF22', /*FF22; FF42; Case map*/ '\uFF23', /*FF23; FF43; Case map*/ '\uFF24', /*FF24; FF44; Case map*/ '\uFF25', /*FF25; FF45; Case map*/ '\uFF26', /*FF26; FF46; Case map*/ '\uFF27', /*FF27; FF47; Case map*/ '\uFF28', /*FF28; FF48; Case map*/ '\uFF29', /*FF29; FF49; Case map*/ '\uFF2A', /*FF2A; FF4A; Case map*/ '\uFF2B', /*FF2B; FF4B; Case map*/ '\uFF2C', /*FF2C; FF4C; Case map*/ '\uFF2D', /*FF2D; FF4D; Case map*/ '\uFF2E', /*FF2E; FF4E; Case map*/ '\uFF2F', /*FF2F; FF4F; Case map*/ '\uFF30', /*FF30; FF50; Case map*/ '\uFF31', /*FF31; FF51; Case map*/ '\uFF32', /*FF32; FF52; Case map*/ '\uFF33', /*FF33; FF53; Case map*/ '\uFF34', /*FF34; FF54; Case map*/ '\uFF35', /*FF35; FF55; Case map*/ '\uFF36', /*FF36; FF56; Case map*/ '\uFF37', /*FF37; FF57; Case map*/ '\uFF38', /*FF38; FF58; Case map*/ '\uFF39', /*FF39; FF59; Case map*/ '\uFF3A', /*FF3A; FF5A; Case map*/ }; public static string[] B2replace = new string[] { "\u0061", /*0041; 0061; Case map*/ "\u0062", /*0042; 0062; Case map*/ "\u0063", /*0043; 0063; Case map*/ "\u0064", /*0044; 0064; Case map*/ "\u0065", /*0045; 0065; Case map*/ "\u0066", /*0046; 0066; Case map*/ "\u0067", /*0047; 0067; Case map*/ "\u0068", /*0048; 0068; Case map*/ "\u0069", /*0049; 0069; Case map*/ "\u006A", /*004A; 006A; Case map*/ "\u006B", /*004B; 006B; Case map*/ "\u006C", /*004C; 006C; Case map*/ "\u006D", /*004D; 006D; Case map*/ "\u006E", /*004E; 006E; Case map*/ "\u006F", /*004F; 006F; Case map*/ "\u0070", /*0050; 0070; Case map*/ "\u0071", /*0051; 0071; Case map*/ "\u0072", /*0052; 0072; Case map*/ "\u0073", /*0053; 0073; Case map*/ "\u0074", /*0054; 0074; Case map*/ "\u0075", /*0055; 0075; Case map*/ "\u0076", /*0056; 0076; Case map*/ "\u0077", /*0057; 0077; Case map*/ "\u0078", /*0058; 0078; Case map*/ "\u0079", /*0059; 0079; Case map*/ "\u007A", /*005A; 007A; Case map*/ "\u03BC", /*00B5; 03BC; Case map*/ "\u00E0", /*00C0; 00E0; Case map*/ "\u00E1", /*00C1; 00E1; Case map*/ "\u00E2", /*00C2; 00E2; Case map*/ "\u00E3", /*00C3; 00E3; Case map*/ "\u00E4", /*00C4; 00E4; Case map*/ "\u00E5", /*00C5; 00E5; Case map*/ "\u00E6", /*00C6; 00E6; Case map*/ "\u00E7", /*00C7; 00E7; Case map*/ "\u00E8", /*00C8; 00E8; Case map*/ "\u00E9", /*00C9; 00E9; Case map*/ "\u00EA", /*00CA; 00EA; Case map*/ "\u00EB", /*00CB; 00EB; Case map*/ "\u00EC", /*00CC; 00EC; Case map*/ "\u00ED", /*00CD; 00ED; Case map*/ "\u00EE", /*00CE; 00EE; Case map*/ "\u00EF", /*00CF; 00EF; Case map*/ "\u00F0", /*00D0; 00F0; Case map*/ "\u00F1", /*00D1; 00F1; Case map*/ "\u00F2", /*00D2; 00F2; Case map*/ "\u00F3", /*00D3; 00F3; Case map*/ "\u00F4", /*00D4; 00F4; Case map*/ "\u00F5", /*00D5; 00F5; Case map*/ "\u00F6", /*00D6; 00F6; Case map*/ "\u00F8", /*00D8; 00F8; Case map*/ "\u00F9", /*00D9; 00F9; Case map*/ "\u00FA", /*00DA; 00FA; Case map*/ "\u00FB", /*00DB; 00FB; Case map*/ "\u00FC", /*00DC; 00FC; Case map*/ "\u00FD", /*00DD; 00FD; Case map*/ "\u00FE", /*00DE; 00FE; Case map*/ "\u0073\u0073", /*00DF; 0073 0073; Case map*/ "\u0101", /*0100; 0101; Case map*/ "\u0103", /*0102; 0103; Case map*/ "\u0105", /*0104; 0105; Case map*/ "\u0107", /*0106; 0107; Case map*/ "\u0109", /*0108; 0109; Case map*/ "\u010B", /*010A; 010B; Case map*/ "\u010D", /*010C; 010D; Case map*/ "\u010F", /*010E; 010F; Case map*/ "\u0111", /*0110; 0111; Case map*/ "\u0113", /*0112; 0113; Case map*/ "\u0115", /*0114; 0115; Case map*/ "\u0117", /*0116; 0117; Case map*/ "\u0119", /*0118; 0119; Case map*/ "\u011B", /*011A; 011B; Case map*/ "\u011D", /*011C; 011D; Case map*/ "\u011F", /*011E; 011F; Case map*/ "\u0121", /*0120; 0121; Case map*/ "\u0123", /*0122; 0123; Case map*/ "\u0125", /*0124; 0125; Case map*/ "\u0127", /*0126; 0127; Case map*/ "\u0129", /*0128; 0129; Case map*/ "\u012B", /*012A; 012B; Case map*/ "\u012D", /*012C; 012D; Case map*/ "\u012F", /*012E; 012F; Case map*/ "\u0069\u0307", /*0130; 0069 0307; Case map*/ "\u0133", /*0132; 0133; Case map*/ "\u0135", /*0134; 0135; Case map*/ "\u0137", /*0136; 0137; Case map*/ "\u013A", /*0139; 013A; Case map*/ "\u013C", /*013B; 013C; Case map*/ "\u013E", /*013D; 013E; Case map*/ "\u0140", /*013F; 0140; Case map*/ "\u0142", /*0141; 0142; Case map*/ "\u0144", /*0143; 0144; Case map*/ "\u0146", /*0145; 0146; Case map*/ "\u0148", /*0147; 0148; Case map*/ "\u02BC\u006E", /*0149; 02BC 006E; Case map*/ "\u014B", /*014A; 014B; Case map*/ "\u014D", /*014C; 014D; Case map*/ "\u014F", /*014E; 014F; Case map*/ "\u0151", /*0150; 0151; Case map*/ "\u0153", /*0152; 0153; Case map*/ "\u0155", /*0154; 0155; Case map*/ "\u0157", /*0156; 0157; Case map*/ "\u0159", /*0158; 0159; Case map*/ "\u015B", /*015A; 015B; Case map*/ "\u015D", /*015C; 015D; Case map*/ "\u015F", /*015E; 015F; Case map*/ "\u0161", /*0160; 0161; Case map*/ "\u0163", /*0162; 0163; Case map*/ "\u0165", /*0164; 0165; Case map*/ "\u0167", /*0166; 0167; Case map*/ "\u0169", /*0168; 0169; Case map*/ "\u016B", /*016A; 016B; Case map*/ "\u016D", /*016C; 016D; Case map*/ "\u016F", /*016E; 016F; Case map*/ "\u0171", /*0170; 0171; Case map*/ "\u0173", /*0172; 0173; Case map*/ "\u0175", /*0174; 0175; Case map*/ "\u0177", /*0176; 0177; Case map*/ "\u00FF", /*0178; 00FF; Case map*/ "\u017A", /*0179; 017A; Case map*/ "\u017C", /*017B; 017C; Case map*/ "\u017E", /*017D; 017E; Case map*/ "\u0073", /*017F; 0073; Case map*/ "\u0253", /*0181; 0253; Case map*/ "\u0183", /*0182; 0183; Case map*/ "\u0185", /*0184; 0185; Case map*/ "\u0254", /*0186; 0254; Case map*/ "\u0188", /*0187; 0188; Case map*/ "\u0256", /*0189; 0256; Case map*/ "\u0257", /*018A; 0257; Case map*/ "\u018C", /*018B; 018C; Case map*/ "\u01DD", /*018E; 01DD; Case map*/ "\u0259", /*018F; 0259; Case map*/ "\u025B", /*0190; 025B; Case map*/ "\u0192", /*0191; 0192; Case map*/ "\u0260", /*0193; 0260; Case map*/ "\u0263", /*0194; 0263; Case map*/ "\u0269", /*0196; 0269; Case map*/ "\u0268", /*0197; 0268; Case map*/ "\u0199", /*0198; 0199; Case map*/ "\u026F", /*019C; 026F; Case map*/ "\u0272", /*019D; 0272; Case map*/ "\u0275", /*019F; 0275; Case map*/ "\u01A1", /*01A0; 01A1; Case map*/ "\u01A3", /*01A2; 01A3; Case map*/ "\u01A5", /*01A4; 01A5; Case map*/ "\u0280", /*01A6; 0280; Case map*/ "\u01A8", /*01A7; 01A8; Case map*/ "\u0283", /*01A9; 0283; Case map*/ "\u01AD", /*01AC; 01AD; Case map*/ "\u0288", /*01AE; 0288; Case map*/ "\u01B0", /*01AF; 01B0; Case map*/ "\u028A", /*01B1; 028A; Case map*/ "\u028B", /*01B2; 028B; Case map*/ "\u01B4", /*01B3; 01B4; Case map*/ "\u01B6", /*01B5; 01B6; Case map*/ "\u0292", /*01B7; 0292; Case map*/ "\u01B9", /*01B8; 01B9; Case map*/ "\u01BD", /*01BC; 01BD; Case map*/ "\u01C6", /*01C4; 01C6; Case map*/ "\u01C6", /*01C5; 01C6; Case map*/ "\u01C9", /*01C7; 01C9; Case map*/ "\u01C9", /*01C8; 01C9; Case map*/ "\u01CC", /*01CA; 01CC; Case map*/ "\u01CC", /*01CB; 01CC; Case map*/ "\u01CE", /*01CD; 01CE; Case map*/ "\u01D0", /*01CF; 01D0; Case map*/ "\u01D2", /*01D1; 01D2; Case map*/ "\u01D4", /*01D3; 01D4; Case map*/ "\u01D6", /*01D5; 01D6; Case map*/ "\u01D8", /*01D7; 01D8; Case map*/ "\u01DA", /*01D9; 01DA; Case map*/ "\u01DC", /*01DB; 01DC; Case map*/ "\u01DF", /*01DE; 01DF; Case map*/ "\u01E1", /*01E0; 01E1; Case map*/ "\u01E3", /*01E2; 01E3; Case map*/ "\u01E5", /*01E4; 01E5; Case map*/ "\u01E7", /*01E6; 01E7; Case map*/ "\u01E9", /*01E8; 01E9; Case map*/ "\u01EB", /*01EA; 01EB; Case map*/ "\u01ED", /*01EC; 01ED; Case map*/ "\u01EF", /*01EE; 01EF; Case map*/ "\u006A\u030C", /*01F0; 006A 030C; Case map*/ "\u01F3", /*01F1; 01F3; Case map*/ "\u01F3", /*01F2; 01F3; Case map*/ "\u01F5", /*01F4; 01F5; Case map*/ "\u0195", /*01F6; 0195; Case map*/ "\u01BF", /*01F7; 01BF; Case map*/ "\u01F9", /*01F8; 01F9; Case map*/ "\u01FB", /*01FA; 01FB; Case map*/ "\u01FD", /*01FC; 01FD; Case map*/ "\u01FF", /*01FE; 01FF; Case map*/ "\u0201", /*0200; 0201; Case map*/ "\u0203", /*0202; 0203; Case map*/ "\u0205", /*0204; 0205; Case map*/ "\u0207", /*0206; 0207; Case map*/ "\u0209", /*0208; 0209; Case map*/ "\u020B", /*020A; 020B; Case map*/ "\u020D", /*020C; 020D; Case map*/ "\u020F", /*020E; 020F; Case map*/ "\u0211", /*0210; 0211; Case map*/ "\u0213", /*0212; 0213; Case map*/ "\u0215", /*0214; 0215; Case map*/ "\u0217", /*0216; 0217; Case map*/ "\u0219", /*0218; 0219; Case map*/ "\u021B", /*021A; 021B; Case map*/ "\u021D", /*021C; 021D; Case map*/ "\u021F", /*021E; 021F; Case map*/ "\u019E", /*0220; 019E; Case map*/ "\u0223", /*0222; 0223; Case map*/ "\u0225", /*0224; 0225; Case map*/ "\u0227", /*0226; 0227; Case map*/ "\u0229", /*0228; 0229; Case map*/ "\u022B", /*022A; 022B; Case map*/ "\u022D", /*022C; 022D; Case map*/ "\u022F", /*022E; 022F; Case map*/ "\u0231", /*0230; 0231; Case map*/ "\u0233", /*0232; 0233; Case map*/ "\u03B9", /*0345; 03B9; Case map*/ "\u0020\u03B9", /*037A; 0020 03B9; Additional folding*/ "\u03AC", /*0386; 03AC; Case map*/ "\u03AD", /*0388; 03AD; Case map*/ "\u03AE", /*0389; 03AE; Case map*/ "\u03AF", /*038A; 03AF; Case map*/ "\u03CC", /*038C; 03CC; Case map*/ "\u03CD", /*038E; 03CD; Case map*/ "\u03CE", /*038F; 03CE; Case map*/ "\u03B9\u0308\u0301", /*0390; 03B9 0308 0301; Case map*/ "\u03B1", /*0391; 03B1; Case map*/ "\u03B2", /*0392; 03B2; Case map*/ "\u03B3", /*0393; 03B3; Case map*/ "\u03B4", /*0394; 03B4; Case map*/ "\u03B5", /*0395; 03B5; Case map*/ "\u03B6", /*0396; 03B6; Case map*/ "\u03B7", /*0397; 03B7; Case map*/ "\u03B8", /*0398; 03B8; Case map*/ "\u03B9", /*0399; 03B9; Case map*/ "\u03BA", /*039A; 03BA; Case map*/ "\u03BB", /*039B; 03BB; Case map*/ "\u03BC", /*039C; 03BC; Case map*/ "\u03BD", /*039D; 03BD; Case map*/ "\u03BE", /*039E; 03BE; Case map*/ "\u03BF", /*039F; 03BF; Case map*/ "\u03C0", /*03A0; 03C0; Case map*/ "\u03C1", /*03A1; 03C1; Case map*/ "\u03C3", /*03A3; 03C3; Case map*/ "\u03C4", /*03A4; 03C4; Case map*/ "\u03C5", /*03A5; 03C5; Case map*/ "\u03C6", /*03A6; 03C6; Case map*/ "\u03C7", /*03A7; 03C7; Case map*/ "\u03C8", /*03A8; 03C8; Case map*/ "\u03C9", /*03A9; 03C9; Case map*/ "\u03CA", /*03AA; 03CA; Case map*/ "\u03CB", /*03AB; 03CB; Case map*/ "\u03C5\u0308\u0301", /*03B0; 03C5 0308 0301; Case map*/ "\u03C3", /*03C2; 03C3; Case map*/ "\u03B2", /*03D0; 03B2; Case map*/ "\u03B8", /*03D1; 03B8; Case map*/ "\u03C5", /*03D2; 03C5; Additional folding*/ "\u03CD", /*03D3; 03CD; Additional folding*/ "\u03CB", /*03D4; 03CB; Additional folding*/ "\u03C6", /*03D5; 03C6; Case map*/ "\u03C0", /*03D6; 03C0; Case map*/ "\u03D9", /*03D8; 03D9; Case map*/ "\u03DB", /*03DA; 03DB; Case map*/ "\u03DD", /*03DC; 03DD; Case map*/ "\u03DF", /*03DE; 03DF; Case map*/ "\u03E1", /*03E0; 03E1; Case map*/ "\u03E3", /*03E2; 03E3; Case map*/ "\u03E5", /*03E4; 03E5; Case map*/ "\u03E7", /*03E6; 03E7; Case map*/ "\u03E9", /*03E8; 03E9; Case map*/ "\u03EB", /*03EA; 03EB; Case map*/ "\u03ED", /*03EC; 03ED; Case map*/ "\u03EF", /*03EE; 03EF; Case map*/ "\u03BA", /*03F0; 03BA; Case map*/ "\u03C1", /*03F1; 03C1; Case map*/ "\u03C3", /*03F2; 03C3; Case map*/ "\u03B8", /*03F4; 03B8; Case map*/ "\u03B5", /*03F5; 03B5; Case map*/ "\u0450", /*0400; 0450; Case map*/ "\u0451", /*0401; 0451; Case map*/ "\u0452", /*0402; 0452; Case map*/ "\u0453", /*0403; 0453; Case map*/ "\u0454", /*0404; 0454; Case map*/ "\u0455", /*0405; 0455; Case map*/ "\u0456", /*0406; 0456; Case map*/ "\u0457", /*0407; 0457; Case map*/ "\u0458", /*0408; 0458; Case map*/ "\u0459", /*0409; 0459; Case map*/ "\u045A", /*040A; 045A; Case map*/ "\u045B", /*040B; 045B; Case map*/ "\u045C", /*040C; 045C; Case map*/ "\u045D", /*040D; 045D; Case map*/ "\u045E", /*040E; 045E; Case map*/ "\u045F", /*040F; 045F; Case map*/ "\u0430", /*0410; 0430; Case map*/ "\u0431", /*0411; 0431; Case map*/ "\u0432", /*0412; 0432; Case map*/ "\u0433", /*0413; 0433; Case map*/ "\u0434", /*0414; 0434; Case map*/ "\u0435", /*0415; 0435; Case map*/ "\u0436", /*0416; 0436; Case map*/ "\u0437", /*0417; 0437; Case map*/ "\u0438", /*0418; 0438; Case map*/ "\u0439", /*0419; 0439; Case map*/ "\u043A", /*041A; 043A; Case map*/ "\u043B", /*041B; 043B; Case map*/ "\u043C", /*041C; 043C; Case map*/ "\u043D", /*041D; 043D; Case map*/ "\u043E", /*041E; 043E; Case map*/ "\u043F", /*041F; 043F; Case map*/ "\u0440", /*0420; 0440; Case map*/ "\u0441", /*0421; 0441; Case map*/ "\u0442", /*0422; 0442; Case map*/ "\u0443", /*0423; 0443; Case map*/ "\u0444", /*0424; 0444; Case map*/ "\u0445", /*0425; 0445; Case map*/ "\u0446", /*0426; 0446; Case map*/ "\u0447", /*0427; 0447; Case map*/ "\u0448", /*0428; 0448; Case map*/ "\u0449", /*0429; 0449; Case map*/ "\u044A", /*042A; 044A; Case map*/ "\u044B", /*042B; 044B; Case map*/ "\u044C", /*042C; 044C; Case map*/ "\u044D", /*042D; 044D; Case map*/ "\u044E", /*042E; 044E; Case map*/ "\u044F", /*042F; 044F; Case map*/ "\u0461", /*0460; 0461; Case map*/ "\u0463", /*0462; 0463; Case map*/ "\u0465", /*0464; 0465; Case map*/ "\u0467", /*0466; 0467; Case map*/ "\u0469", /*0468; 0469; Case map*/ "\u046B", /*046A; 046B; Case map*/ "\u046D", /*046C; 046D; Case map*/ "\u046F", /*046E; 046F; Case map*/ "\u0471", /*0470; 0471; Case map*/ "\u0473", /*0472; 0473; Case map*/ "\u0475", /*0474; 0475; Case map*/ "\u0477", /*0476; 0477; Case map*/ "\u0479", /*0478; 0479; Case map*/ "\u047B", /*047A; 047B; Case map*/ "\u047D", /*047C; 047D; Case map*/ "\u047F", /*047E; 047F; Case map*/ "\u0481", /*0480; 0481; Case map*/ "\u048B", /*048A; 048B; Case map*/ "\u048D", /*048C; 048D; Case map*/ "\u048F", /*048E; 048F; Case map*/ "\u0491", /*0490; 0491; Case map*/ "\u0493", /*0492; 0493; Case map*/ "\u0495", /*0494; 0495; Case map*/ "\u0497", /*0496; 0497; Case map*/ "\u0499", /*0498; 0499; Case map*/ "\u049B", /*049A; 049B; Case map*/ "\u049D", /*049C; 049D; Case map*/ "\u049F", /*049E; 049F; Case map*/ "\u04A1", /*04A0; 04A1; Case map*/ "\u04A3", /*04A2; 04A3; Case map*/ "\u04A5", /*04A4; 04A5; Case map*/ "\u04A7", /*04A6; 04A7; Case map*/ "\u04A9", /*04A8; 04A9; Case map*/ "\u04AB", /*04AA; 04AB; Case map*/ "\u04AD", /*04AC; 04AD; Case map*/ "\u04AF", /*04AE; 04AF; Case map*/ "\u04B1", /*04B0; 04B1; Case map*/ "\u04B3", /*04B2; 04B3; Case map*/ "\u04B5", /*04B4; 04B5; Case map*/ "\u04B7", /*04B6; 04B7; Case map*/ "\u04B9", /*04B8; 04B9; Case map*/ "\u04BB", /*04BA; 04BB; Case map*/ "\u04BD", /*04BC; 04BD; Case map*/ "\u04BF", /*04BE; 04BF; Case map*/ "\u04C2", /*04C1; 04C2; Case map*/ "\u04C4", /*04C3; 04C4; Case map*/ "\u04C6", /*04C5; 04C6; Case map*/ "\u04C8", /*04C7; 04C8; Case map*/ "\u04CA", /*04C9; 04CA; Case map*/ "\u04CC", /*04CB; 04CC; Case map*/ "\u04CE", /*04CD; 04CE; Case map*/ "\u04D1", /*04D0; 04D1; Case map*/ "\u04D3", /*04D2; 04D3; Case map*/ "\u04D5", /*04D4; 04D5; Case map*/ "\u04D7", /*04D6; 04D7; Case map*/ "\u04D9", /*04D8; 04D9; Case map*/ "\u04DB", /*04DA; 04DB; Case map*/ "\u04DD", /*04DC; 04DD; Case map*/ "\u04DF", /*04DE; 04DF; Case map*/ "\u04E1", /*04E0; 04E1; Case map*/ "\u04E3", /*04E2; 04E3; Case map*/ "\u04E5", /*04E4; 04E5; Case map*/ "\u04E7", /*04E6; 04E7; Case map*/ "\u04E9", /*04E8; 04E9; Case map*/ "\u04EB", /*04EA; 04EB; Case map*/ "\u04ED", /*04EC; 04ED; Case map*/ "\u04EF", /*04EE; 04EF; Case map*/ "\u04F1", /*04F0; 04F1; Case map*/ "\u04F3", /*04F2; 04F3; Case map*/ "\u04F5", /*04F4; 04F5; Case map*/ "\u04F9", /*04F8; 04F9; Case map*/ "\u0501", /*0500; 0501; Case map*/ "\u0503", /*0502; 0503; Case map*/ "\u0505", /*0504; 0505; Case map*/ "\u0507", /*0506; 0507; Case map*/ "\u0509", /*0508; 0509; Case map*/ "\u050B", /*050A; 050B; Case map*/ "\u050D", /*050C; 050D; Case map*/ "\u050F", /*050E; 050F; Case map*/ "\u0561", /*0531; 0561; Case map*/ "\u0562", /*0532; 0562; Case map*/ "\u0563", /*0533; 0563; Case map*/ "\u0564", /*0534; 0564; Case map*/ "\u0565", /*0535; 0565; Case map*/ "\u0566", /*0536; 0566; Case map*/ "\u0567", /*0537; 0567; Case map*/ "\u0568", /*0538; 0568; Case map*/ "\u0569", /*0539; 0569; Case map*/ "\u056A", /*053A; 056A; Case map*/ "\u056B", /*053B; 056B; Case map*/ "\u056C", /*053C; 056C; Case map*/ "\u056D", /*053D; 056D; Case map*/ "\u056E", /*053E; 056E; Case map*/ "\u056F", /*053F; 056F; Case map*/ "\u0570", /*0540; 0570; Case map*/ "\u0571", /*0541; 0571; Case map*/ "\u0572", /*0542; 0572; Case map*/ "\u0573", /*0543; 0573; Case map*/ "\u0574", /*0544; 0574; Case map*/ "\u0575", /*0545; 0575; Case map*/ "\u0576", /*0546; 0576; Case map*/ "\u0577", /*0547; 0577; Case map*/ "\u0578", /*0548; 0578; Case map*/ "\u0579", /*0549; 0579; Case map*/ "\u057A", /*054A; 057A; Case map*/ "\u057B", /*054B; 057B; Case map*/ "\u057C", /*054C; 057C; Case map*/ "\u057D", /*054D; 057D; Case map*/ "\u057E", /*054E; 057E; Case map*/ "\u057F", /*054F; 057F; Case map*/ "\u0580", /*0550; 0580; Case map*/ "\u0581", /*0551; 0581; Case map*/ "\u0582", /*0552; 0582; Case map*/ "\u0583", /*0553; 0583; Case map*/ "\u0584", /*0554; 0584; Case map*/ "\u0585", /*0555; 0585; Case map*/ "\u0586", /*0556; 0586; Case map*/ "\u0565\u0582", /*0587; 0565 0582; Case map*/ "\u1E01", /*1E00; 1E01; Case map*/ "\u1E03", /*1E02; 1E03; Case map*/ "\u1E05", /*1E04; 1E05; Case map*/ "\u1E07", /*1E06; 1E07; Case map*/ "\u1E09", /*1E08; 1E09; Case map*/ "\u1E0B", /*1E0A; 1E0B; Case map*/ "\u1E0D", /*1E0C; 1E0D; Case map*/ "\u1E0F", /*1E0E; 1E0F; Case map*/ "\u1E11", /*1E10; 1E11; Case map*/ "\u1E13", /*1E12; 1E13; Case map*/ "\u1E15", /*1E14; 1E15; Case map*/ "\u1E17", /*1E16; 1E17; Case map*/ "\u1E19", /*1E18; 1E19; Case map*/ "\u1E1B", /*1E1A; 1E1B; Case map*/ "\u1E1D", /*1E1C; 1E1D; Case map*/ "\u1E1F", /*1E1E; 1E1F; Case map*/ "\u1E21", /*1E20; 1E21; Case map*/ "\u1E23", /*1E22; 1E23; Case map*/ "\u1E25", /*1E24; 1E25; Case map*/ "\u1E27", /*1E26; 1E27; Case map*/ "\u1E29", /*1E28; 1E29; Case map*/ "\u1E2B", /*1E2A; 1E2B; Case map*/ "\u1E2D", /*1E2C; 1E2D; Case map*/ "\u1E2F", /*1E2E; 1E2F; Case map*/ "\u1E31", /*1E30; 1E31; Case map*/ "\u1E33", /*1E32; 1E33; Case map*/ "\u1E35", /*1E34; 1E35; Case map*/ "\u1E37", /*1E36; 1E37; Case map*/ "\u1E39", /*1E38; 1E39; Case map*/ "\u1E3B", /*1E3A; 1E3B; Case map*/ "\u1E3D", /*1E3C; 1E3D; Case map*/ "\u1E3F", /*1E3E; 1E3F; Case map*/ "\u1E41", /*1E40; 1E41; Case map*/ "\u1E43", /*1E42; 1E43; Case map*/ "\u1E45", /*1E44; 1E45; Case map*/ "\u1E47", /*1E46; 1E47; Case map*/ "\u1E49", /*1E48; 1E49; Case map*/ "\u1E4B", /*1E4A; 1E4B; Case map*/ "\u1E4D", /*1E4C; 1E4D; Case map*/ "\u1E4F", /*1E4E; 1E4F; Case map*/ "\u1E51", /*1E50; 1E51; Case map*/ "\u1E53", /*1E52; 1E53; Case map*/ "\u1E55", /*1E54; 1E55; Case map*/ "\u1E57", /*1E56; 1E57; Case map*/ "\u1E59", /*1E58; 1E59; Case map*/ "\u1E5B", /*1E5A; 1E5B; Case map*/ "\u1E5D", /*1E5C; 1E5D; Case map*/ "\u1E5F", /*1E5E; 1E5F; Case map*/ "\u1E61", /*1E60; 1E61; Case map*/ "\u1E63", /*1E62; 1E63; Case map*/ "\u1E65", /*1E64; 1E65; Case map*/ "\u1E67", /*1E66; 1E67; Case map*/ "\u1E69", /*1E68; 1E69; Case map*/ "\u1E6B", /*1E6A; 1E6B; Case map*/ "\u1E6D", /*1E6C; 1E6D; Case map*/ "\u1E6F", /*1E6E; 1E6F; Case map*/ "\u1E71", /*1E70; 1E71; Case map*/ "\u1E73", /*1E72; 1E73; Case map*/ "\u1E75", /*1E74; 1E75; Case map*/ "\u1E77", /*1E76; 1E77; Case map*/ "\u1E79", /*1E78; 1E79; Case map*/ "\u1E7B", /*1E7A; 1E7B; Case map*/ "\u1E7D", /*1E7C; 1E7D; Case map*/ "\u1E7F", /*1E7E; 1E7F; Case map*/ "\u1E81", /*1E80; 1E81; Case map*/ "\u1E83", /*1E82; 1E83; Case map*/ "\u1E85", /*1E84; 1E85; Case map*/ "\u1E87", /*1E86; 1E87; Case map*/ "\u1E89", /*1E88; 1E89; Case map*/ "\u1E8B", /*1E8A; 1E8B; Case map*/ "\u1E8D", /*1E8C; 1E8D; Case map*/ "\u1E8F", /*1E8E; 1E8F; Case map*/ "\u1E91", /*1E90; 1E91; Case map*/ "\u1E93", /*1E92; 1E93; Case map*/ "\u1E95", /*1E94; 1E95; Case map*/ "\u0068\u0331", /*1E96; 0068 0331; Case map*/ "\u0074\u0308", /*1E97; 0074 0308; Case map*/ "\u0077\u030A", /*1E98; 0077 030A; Case map*/ "\u0079\u030A", /*1E99; 0079 030A; Case map*/ "\u0061\u02BE", /*1E9A; 0061 02BE; Case map*/ "\u1E61", /*1E9B; 1E61; Case map*/ "\u1EA1", /*1EA0; 1EA1; Case map*/ "\u1EA3", /*1EA2; 1EA3; Case map*/ "\u1EA5", /*1EA4; 1EA5; Case map*/ "\u1EA7", /*1EA6; 1EA7; Case map*/ "\u1EA9", /*1EA8; 1EA9; Case map*/ "\u1EAB", /*1EAA; 1EAB; Case map*/ "\u1EAD", /*1EAC; 1EAD; Case map*/ "\u1EAF", /*1EAE; 1EAF; Case map*/ "\u1EB1", /*1EB0; 1EB1; Case map*/ "\u1EB3", /*1EB2; 1EB3; Case map*/ "\u1EB5", /*1EB4; 1EB5; Case map*/ "\u1EB7", /*1EB6; 1EB7; Case map*/ "\u1EB9", /*1EB8; 1EB9; Case map*/ "\u1EBB", /*1EBA; 1EBB; Case map*/ "\u1EBD", /*1EBC; 1EBD; Case map*/ "\u1EBF", /*1EBE; 1EBF; Case map*/ "\u1EC1", /*1EC0; 1EC1; Case map*/ "\u1EC3", /*1EC2; 1EC3; Case map*/ "\u1EC5", /*1EC4; 1EC5; Case map*/ "\u1EC7", /*1EC6; 1EC7; Case map*/ "\u1EC9", /*1EC8; 1EC9; Case map*/ "\u1ECB", /*1ECA; 1ECB; Case map*/ "\u1ECD", /*1ECC; 1ECD; Case map*/ "\u1ECF", /*1ECE; 1ECF; Case map*/ "\u1ED1", /*1ED0; 1ED1; Case map*/ "\u1ED3", /*1ED2; 1ED3; Case map*/ "\u1ED5", /*1ED4; 1ED5; Case map*/ "\u1ED7", /*1ED6; 1ED7; Case map*/ "\u1ED9", /*1ED8; 1ED9; Case map*/ "\u1EDB", /*1EDA; 1EDB; Case map*/ "\u1EDD", /*1EDC; 1EDD; Case map*/ "\u1EDF", /*1EDE; 1EDF; Case map*/ "\u1EE1", /*1EE0; 1EE1; Case map*/ "\u1EE3", /*1EE2; 1EE3; Case map*/ "\u1EE5", /*1EE4; 1EE5; Case map*/ "\u1EE7", /*1EE6; 1EE7; Case map*/ "\u1EE9", /*1EE8; 1EE9; Case map*/ "\u1EEB", /*1EEA; 1EEB; Case map*/ "\u1EED", /*1EEC; 1EED; Case map*/ "\u1EEF", /*1EEE; 1EEF; Case map*/ "\u1EF1", /*1EF0; 1EF1; Case map*/ "\u1EF3", /*1EF2; 1EF3; Case map*/ "\u1EF5", /*1EF4; 1EF5; Case map*/ "\u1EF7", /*1EF6; 1EF7; Case map*/ "\u1EF9", /*1EF8; 1EF9; Case map*/ "\u1F00", /*1F08; 1F00; Case map*/ "\u1F01", /*1F09; 1F01; Case map*/ "\u1F02", /*1F0A; 1F02; Case map*/ "\u1F03", /*1F0B; 1F03; Case map*/ "\u1F04", /*1F0C; 1F04; Case map*/ "\u1F05", /*1F0D; 1F05; Case map*/ "\u1F06", /*1F0E; 1F06; Case map*/ "\u1F07", /*1F0F; 1F07; Case map*/ "\u1F10", /*1F18; 1F10; Case map*/ "\u1F11", /*1F19; 1F11; Case map*/ "\u1F12", /*1F1A; 1F12; Case map*/ "\u1F13", /*1F1B; 1F13; Case map*/ "\u1F14", /*1F1C; 1F14; Case map*/ "\u1F15", /*1F1D; 1F15; Case map*/ "\u1F20", /*1F28; 1F20; Case map*/ "\u1F21", /*1F29; 1F21; Case map*/ "\u1F22", /*1F2A; 1F22; Case map*/ "\u1F23", /*1F2B; 1F23; Case map*/ "\u1F24", /*1F2C; 1F24; Case map*/ "\u1F25", /*1F2D; 1F25; Case map*/ "\u1F26", /*1F2E; 1F26; Case map*/ "\u1F27", /*1F2F; 1F27; Case map*/ "\u1F30", /*1F38; 1F30; Case map*/ "\u1F31", /*1F39; 1F31; Case map*/ "\u1F32", /*1F3A; 1F32; Case map*/ "\u1F33", /*1F3B; 1F33; Case map*/ "\u1F34", /*1F3C; 1F34; Case map*/ "\u1F35", /*1F3D; 1F35; Case map*/ "\u1F36", /*1F3E; 1F36; Case map*/ "\u1F37", /*1F3F; 1F37; Case map*/ "\u1F40", /*1F48; 1F40; Case map*/ "\u1F41", /*1F49; 1F41; Case map*/ "\u1F42", /*1F4A; 1F42; Case map*/ "\u1F43", /*1F4B; 1F43; Case map*/ "\u1F44", /*1F4C; 1F44; Case map*/ "\u1F45", /*1F4D; 1F45; Case map*/ "\u03C5\u0313", /*1F50; 03C5 0313; Case map*/ "\u03C5\u0313\u0300", /*1F52; 03C5 0313 0300; Case map*/ "\u03C5\u0313\u0301", /*1F54; 03C5 0313 0301; Case map*/ "\u03C5\u0313\u0342", /*1F56; 03C5 0313 0342; Case map*/ "\u1F51", /*1F59; 1F51; Case map*/ "\u1F53", /*1F5B; 1F53; Case map*/ "\u1F55", /*1F5D; 1F55; Case map*/ "\u1F57", /*1F5F; 1F57; Case map*/ "\u1F60", /*1F68; 1F60; Case map*/ "\u1F61", /*1F69; 1F61; Case map*/ "\u1F62", /*1F6A; 1F62; Case map*/ "\u1F63", /*1F6B; 1F63; Case map*/ "\u1F64", /*1F6C; 1F64; Case map*/ "\u1F65", /*1F6D; 1F65; Case map*/ "\u1F66", /*1F6E; 1F66; Case map*/ "\u1F67", /*1F6F; 1F67; Case map*/ "\u1F00\u03B9", /*1F80; 1F00 03B9; Case map*/ "\u1F01\u03B9", /*1F81; 1F01 03B9; Case map*/ "\u1F02\u03B9", /*1F82; 1F02 03B9; Case map*/ "\u1F03\u03B9", /*1F83; 1F03 03B9; Case map*/ "\u1F04\u03B9", /*1F84; 1F04 03B9; Case map*/ "\u1F05\u03B9", /*1F85; 1F05 03B9; Case map*/ "\u1F06\u03B9", /*1F86; 1F06 03B9; Case map*/ "\u1F07\u03B9", /*1F87; 1F07 03B9; Case map*/ "\u1F00\u03B9", /*1F88; 1F00 03B9; Case map*/ "\u1F01\u03B9", /*1F89; 1F01 03B9; Case map*/ "\u1F02\u03B9", /*1F8A; 1F02 03B9; Case map*/ "\u1F03\u03B9", /*1F8B; 1F03 03B9; Case map*/ "\u1F04\u03B9", /*1F8C; 1F04 03B9; Case map*/ "\u1F05\u03B9", /*1F8D; 1F05 03B9; Case map*/ "\u1F06\u03B9", /*1F8E; 1F06 03B9; Case map*/ "\u1F07\u03B9", /*1F8F; 1F07 03B9; Case map*/ "\u1F20\u03B9", /*1F90; 1F20 03B9; Case map*/ "\u1F21\u03B9", /*1F91; 1F21 03B9; Case map*/ "\u1F22\u03B9", /*1F92; 1F22 03B9; Case map*/ "\u1F23\u03B9", /*1F93; 1F23 03B9; Case map*/ "\u1F24\u03B9", /*1F94; 1F24 03B9; Case map*/ "\u1F25\u03B9", /*1F95; 1F25 03B9; Case map*/ "\u1F26\u03B9", /*1F96; 1F26 03B9; Case map*/ "\u1F27\u03B9", /*1F97; 1F27 03B9; Case map*/ "\u1F20\u03B9", /*1F98; 1F20 03B9; Case map*/ "\u1F21\u03B9", /*1F99; 1F21 03B9; Case map*/ "\u1F22\u03B9", /*1F9A; 1F22 03B9; Case map*/ "\u1F23\u03B9", /*1F9B; 1F23 03B9; Case map*/ "\u1F24\u03B9", /*1F9C; 1F24 03B9; Case map*/ "\u1F25\u03B9", /*1F9D; 1F25 03B9; Case map*/ "\u1F26\u03B9", /*1F9E; 1F26 03B9; Case map*/ "\u1F27\u03B9", /*1F9F; 1F27 03B9; Case map*/ "\u1F60\u03B9", /*1FA0; 1F60 03B9; Case map*/ "\u1F61\u03B9", /*1FA1; 1F61 03B9; Case map*/ "\u1F62\u03B9", /*1FA2; 1F62 03B9; Case map*/ "\u1F63\u03B9", /*1FA3; 1F63 03B9; Case map*/ "\u1F64\u03B9", /*1FA4; 1F64 03B9; Case map*/ "\u1F65\u03B9", /*1FA5; 1F65 03B9; Case map*/ "\u1F66\u03B9", /*1FA6; 1F66 03B9; Case map*/ "\u1F67\u03B9", /*1FA7; 1F67 03B9; Case map*/ "\u1F60\u03B9", /*1FA8; 1F60 03B9; Case map*/ "\u1F61\u03B9", /*1FA9; 1F61 03B9; Case map*/ "\u1F62\u03B9", /*1FAA; 1F62 03B9; Case map*/ "\u1F63\u03B9", /*1FAB; 1F63 03B9; Case map*/ "\u1F64\u03B9", /*1FAC; 1F64 03B9; Case map*/ "\u1F65\u03B9", /*1FAD; 1F65 03B9; Case map*/ "\u1F66\u03B9", /*1FAE; 1F66 03B9; Case map*/ "\u1F67\u03B9", /*1FAF; 1F67 03B9; Case map*/ "\u1F70\u03B9", /*1FB2; 1F70 03B9; Case map*/ "\u03B1\u03B9", /*1FB3; 03B1 03B9; Case map*/ "\u03AC\u03B9", /*1FB4; 03AC 03B9; Case map*/ "\u03B1\u0342", /*1FB6; 03B1 0342; Case map*/ "\u03B1\u0342\u03B9", /*1FB7; 03B1 0342 03B9; Case map*/ "\u1FB0", /*1FB8; 1FB0; Case map*/ "\u1FB1", /*1FB9; 1FB1; Case map*/ "\u1F70", /*1FBA; 1F70; Case map*/ "\u1F71", /*1FBB; 1F71; Case map*/ "\u03B1\u03B9", /*1FBC; 03B1 03B9; Case map*/ "\u03B9", /*1FBE; 03B9; Case map*/ "\u1F74\u03B9", /*1FC2; 1F74 03B9; Case map*/ "\u03B7\u03B9", /*1FC3; 03B7 03B9; Case map*/ "\u03AE\u03B9", /*1FC4; 03AE 03B9; Case map*/ "\u03B7\u0342", /*1FC6; 03B7 0342; Case map*/ "\u03B7\u0342\u03B9", /*1FC7; 03B7 0342 03B9; Case map*/ "\u1F72", /*1FC8; 1F72; Case map*/ "\u1F73", /*1FC9; 1F73; Case map*/ "\u1F74", /*1FCA; 1F74; Case map*/ "\u1F75", /*1FCB; 1F75; Case map*/ "\u03B7\u03B9", /*1FCC; 03B7 03B9; Case map*/ "\u03B9\u0308\u0300", /*1FD2; 03B9 0308 0300; Case map*/ "\u03B9\u0308\u0301", /*1FD3; 03B9 0308 0301; Case map*/ "\u03B9\u0342", /*1FD6; 03B9 0342; Case map*/ "\u03B9\u0308\u0342", /*1FD7; 03B9 0308 0342; Case map*/ "\u1FD0", /*1FD8; 1FD0; Case map*/ "\u1FD1", /*1FD9; 1FD1; Case map*/ "\u1F76", /*1FDA; 1F76; Case map*/ "\u1F77", /*1FDB; 1F77; Case map*/ "\u03C5\u0308\u0300", /*1FE2; 03C5 0308 0300; Case map*/ "\u03C5\u0308\u0301", /*1FE3; 03C5 0308 0301; Case map*/ "\u03C1\u0313", /*1FE4; 03C1 0313; Case map*/ "\u03C5\u0342", /*1FE6; 03C5 0342; Case map*/ "\u03C5\u0308\u0342", /*1FE7; 03C5 0308 0342; Case map*/ "\u1FE0", /*1FE8; 1FE0; Case map*/ "\u1FE1", /*1FE9; 1FE1; Case map*/ "\u1F7A", /*1FEA; 1F7A; Case map*/ "\u1F7B", /*1FEB; 1F7B; Case map*/ "\u1FE5", /*1FEC; 1FE5; Case map*/ "\u1F7C\u03B9", /*1FF2; 1F7C 03B9; Case map*/ "\u03C9\u03B9", /*1FF3; 03C9 03B9; Case map*/ "\u03CE\u03B9", /*1FF4; 03CE 03B9; Case map*/ "\u03C9\u0342", /*1FF6; 03C9 0342; Case map*/ "\u03C9\u0342\u03B9", /*1FF7; 03C9 0342 03B9; Case map*/ "\u1F78", /*1FF8; 1F78; Case map*/ "\u1F79", /*1FF9; 1F79; Case map*/ "\u1F7C", /*1FFA; 1F7C; Case map*/ "\u1F7D", /*1FFB; 1F7D; Case map*/ "\u03C9\u03B9", /*1FFC; 03C9 03B9; Case map*/ "\u0072\u0073", /*20A8; 0072 0073; Additional folding*/ "\u0063", /*2102; 0063; Additional folding*/ "\u00B0\u0063", /*2103; 00B0 0063; Additional folding*/ "\u025B", /*2107; 025B; Additional folding*/ "\u00B0\u0066", /*2109; 00B0 0066; Additional folding*/ "\u0068", /*210B; 0068; Additional folding*/ "\u0068", /*210C; 0068; Additional folding*/ "\u0068", /*210D; 0068; Additional folding*/ "\u0069", /*2110; 0069; Additional folding*/ "\u0069", /*2111; 0069; Additional folding*/ "\u006C", /*2112; 006C; Additional folding*/ "\u006E", /*2115; 006E; Additional folding*/ "\u006E\u006F", /*2116; 006E 006F; Additional folding*/ "\u0070", /*2119; 0070; Additional folding*/ "\u0071", /*211A; 0071; Additional folding*/ "\u0072", /*211B; 0072; Additional folding*/ "\u0072", /*211C; 0072; Additional folding*/ "\u0072", /*211D; 0072; Additional folding*/ "\u0073\u006D", /*2120; 0073 006D; Additional folding*/ "\u0074\u0065\u006C", /*2121; 0074 0065 006C; Additional folding*/ "\u0074\u006D", /*2122; 0074 006D; Additional folding*/ "\u007A", /*2124; 007A; Additional folding*/ "\u03C9", /*2126; 03C9; Case map*/ "\u007A", /*2128; 007A; Additional folding*/ "\u006B", /*212A; 006B; Case map*/ "\u00E5", /*212B; 00E5; Case map*/ "\u0062", /*212C; 0062; Additional folding*/ "\u0063", /*212D; 0063; Additional folding*/ "\u0065", /*2130; 0065; Additional folding*/ "\u0066", /*2131; 0066; Additional folding*/ "\u006D", /*2133; 006D; Additional folding*/ "\u03B3", /*213E; 03B3; Additional folding*/ "\u03C0", /*213F; 03C0; Additional folding*/ "\u0064", /*2145; 0064; Additional folding*/ "\u2170", /*2160; 2170; Case map*/ "\u2171", /*2161; 2171; Case map*/ "\u2172", /*2162; 2172; Case map*/ "\u2173", /*2163; 2173; Case map*/ "\u2174", /*2164; 2174; Case map*/ "\u2175", /*2165; 2175; Case map*/ "\u2176", /*2166; 2176; Case map*/ "\u2177", /*2167; 2177; Case map*/ "\u2178", /*2168; 2178; Case map*/ "\u2179", /*2169; 2179; Case map*/ "\u217A", /*216A; 217A; Case map*/ "\u217B", /*216B; 217B; Case map*/ "\u217C", /*216C; 217C; Case map*/ "\u217D", /*216D; 217D; Case map*/ "\u217E", /*216E; 217E; Case map*/ "\u217F", /*216F; 217F; Case map*/ "\u24D0", /*24B6; 24D0; Case map*/ "\u24D1", /*24B7; 24D1; Case map*/ "\u24D2", /*24B8; 24D2; Case map*/ "\u24D3", /*24B9; 24D3; Case map*/ "\u24D4", /*24BA; 24D4; Case map*/ "\u24D5", /*24BB; 24D5; Case map*/ "\u24D6", /*24BC; 24D6; Case map*/ "\u24D7", /*24BD; 24D7; Case map*/ "\u24D8", /*24BE; 24D8; Case map*/ "\u24D9", /*24BF; 24D9; Case map*/ "\u24DA", /*24C0; 24DA; Case map*/ "\u24DB", /*24C1; 24DB; Case map*/ "\u24DC", /*24C2; 24DC; Case map*/ "\u24DD", /*24C3; 24DD; Case map*/ "\u24DE", /*24C4; 24DE; Case map*/ "\u24DF", /*24C5; 24DF; Case map*/ "\u24E0", /*24C6; 24E0; Case map*/ "\u24E1", /*24C7; 24E1; Case map*/ "\u24E2", /*24C8; 24E2; Case map*/ "\u24E3", /*24C9; 24E3; Case map*/ "\u24E4", /*24CA; 24E4; Case map*/ "\u24E5", /*24CB; 24E5; Case map*/ "\u24E6", /*24CC; 24E6; Case map*/ "\u24E7", /*24CD; 24E7; Case map*/ "\u24E8", /*24CE; 24E8; Case map*/ "\u24E9", /*24CF; 24E9; Case map*/ "\u0068\u0070\u0061", /*3371; 0068 0070 0061; Additional folding*/ "\u0061\u0075", /*3373; 0061 0075; Additional folding*/ "\u006F\u0076", /*3375; 006F 0076; Additional folding*/ "\u0070\u0061", /*3380; 0070 0061; Additional folding*/ "\u006E\u0061", /*3381; 006E 0061; Additional folding*/ "\u03BC\u0061", /*3382; 03BC 0061; Additional folding*/ "\u006D\u0061", /*3383; 006D 0061; Additional folding*/ "\u006B\u0061", /*3384; 006B 0061; Additional folding*/ "\u006B\u0062", /*3385; 006B 0062; Additional folding*/ "\u006D\u0062", /*3386; 006D 0062; Additional folding*/ "\u0067\u0062", /*3387; 0067 0062; Additional folding*/ "\u0070\u0066", /*338A; 0070 0066; Additional folding*/ "\u006E\u0066", /*338B; 006E 0066; Additional folding*/ "\u03BC\u0066", /*338C; 03BC 0066; Additional folding*/ "\u0068\u007A", /*3390; 0068 007A; Additional folding*/ "\u006B\u0068\u007A", /*3391; 006B 0068 007A; Additional folding*/ "\u006D\u0068\u007A", /*3392; 006D 0068 007A; Additional folding*/ "\u0067\u0068\u007A", /*3393; 0067 0068 007A; Additional folding*/ "\u0074\u0068\u007A", /*3394; 0074 0068 007A; Additional folding*/ "\u0070\u0061", /*33A9; 0070 0061; Additional folding*/ "\u006B\u0070\u0061", /*33AA; 006B 0070 0061; Additional folding*/ "\u006D\u0070\u0061", /*33AB; 006D 0070 0061; Additional folding*/ "\u0067\u0070\u0061", /*33AC; 0067 0070 0061; Additional folding*/ "\u0070\u0076", /*33B4; 0070 0076; Additional folding*/ "\u006E\u0076", /*33B5; 006E 0076; Additional folding*/ "\u03BC\u0076", /*33B6; 03BC 0076; Additional folding*/ "\u006D\u0076", /*33B7; 006D 0076; Additional folding*/ "\u006B\u0076", /*33B8; 006B 0076; Additional folding*/ "\u006D\u0076", /*33B9; 006D 0076; Additional folding*/ "\u0070\u0077", /*33BA; 0070 0077; Additional folding*/ "\u006E\u0077", /*33BB; 006E 0077; Additional folding*/ "\u03BC\u0077", /*33BC; 03BC 0077; Additional folding*/ "\u006D\u0077", /*33BD; 006D 0077; Additional folding*/ "\u006B\u0077", /*33BE; 006B 0077; Additional folding*/ "\u006D\u0077", /*33BF; 006D 0077; Additional folding*/ "\u006B\u03C9", /*33C0; 006B 03C9; Additional folding*/ "\u006D\u03C9", /*33C1; 006D 03C9; Additional folding*/ "\u0062\u0071", /*33C3; 0062 0071; Additional folding*/ "\u0063\u2215\u006B\u0067", /*33C6; 0063 2215 006B 0067; Additional folding*/ "\u0063\u006F\u002E", /*33C7; 0063 006F 002E; Additional folding*/ "\u0064\u0062", /*33C8; 0064 0062; Additional folding*/ "\u0067\u0079", /*33C9; 0067 0079; Additional folding*/ "\u0068\u0070", /*33CB; 0068 0070; Additional folding*/ "\u006B\u006B", /*33CD; 006B 006B; Additional folding*/ "\u006B\u006D", /*33CE; 006B 006D; Additional folding*/ "\u0070\u0068", /*33D7; 0070 0068; Additional folding*/ "\u0070\u0070\u006D", /*33D9; 0070 0070 006D; Additional folding*/ "\u0070\u0072", /*33DA; 0070 0072; Additional folding*/ "\u0073\u0076", /*33DC; 0073 0076; Additional folding*/ "\u0077\u0062", /*33DD; 0077 0062; Additional folding*/ "\u0066\u0066", /*FB00; 0066 0066; Case map*/ "\u0066\u0069", /*FB01; 0066 0069; Case map*/ "\u0066\u006C", /*FB02; 0066 006C; Case map*/ "\u0066\u0066\u0069", /*FB03; 0066 0066 0069; Case map*/ "\u0066\u0066\u006C", /*FB04; 0066 0066 006C; Case map*/ "\u0073\u0074", /*FB05; 0073 0074; Case map*/ "\u0073\u0074", /*FB06; 0073 0074; Case map*/ "\u0574\u0576", /*FB13; 0574 0576; Case map*/ "\u0574\u0565", /*FB14; 0574 0565; Case map*/ "\u0574\u056B", /*FB15; 0574 056B; Case map*/ "\u057E\u0576", /*FB16; 057E 0576; Case map*/ "\u0574\u056D", /*FB17; 0574 056D; Case map*/ "\uFF41", /*FF21; FF41; Case map*/ "\uFF42", /*FF22; FF42; Case map*/ "\uFF43", /*FF23; FF43; Case map*/ "\uFF44", /*FF24; FF44; Case map*/ "\uFF45", /*FF25; FF45; Case map*/ "\uFF46", /*FF26; FF46; Case map*/ "\uFF47", /*FF27; FF47; Case map*/ "\uFF48", /*FF28; FF48; Case map*/ "\uFF49", /*FF29; FF49; Case map*/ "\uFF4A", /*FF2A; FF4A; Case map*/ "\uFF4B", /*FF2B; FF4B; Case map*/ "\uFF4C", /*FF2C; FF4C; Case map*/ "\uFF4D", /*FF2D; FF4D; Case map*/ "\uFF4E", /*FF2E; FF4E; Case map*/ "\uFF4F", /*FF2F; FF4F; Case map*/ "\uFF50", /*FF30; FF50; Case map*/ "\uFF51", /*FF31; FF51; Case map*/ "\uFF52", /*FF32; FF52; Case map*/ "\uFF53", /*FF33; FF53; Case map*/ "\uFF54", /*FF34; FF54; Case map*/ "\uFF55", /*FF35; FF55; Case map*/ "\uFF56", /*FF36; FF56; Case map*/ "\uFF57", /*FF37; FF57; Case map*/ "\uFF58", /*FF38; FF58; Case map*/ "\uFF59", /*FF39; FF59; Case map*/ "\uFF5A", /*FF3A; FF5A; Case map*/ }; public static char[] B3search = new char[] { '\u0041', /*0041; 0061; Case map*/ '\u0042', /*0042; 0062; Case map*/ '\u0043', /*0043; 0063; Case map*/ '\u0044', /*0044; 0064; Case map*/ '\u0045', /*0045; 0065; Case map*/ '\u0046', /*0046; 0066; Case map*/ '\u0047', /*0047; 0067; Case map*/ '\u0048', /*0048; 0068; Case map*/ '\u0049', /*0049; 0069; Case map*/ '\u004A', /*004A; 006A; Case map*/ '\u004B', /*004B; 006B; Case map*/ '\u004C', /*004C; 006C; Case map*/ '\u004D', /*004D; 006D; Case map*/ '\u004E', /*004E; 006E; Case map*/ '\u004F', /*004F; 006F; Case map*/ '\u0050', /*0050; 0070; Case map*/ '\u0051', /*0051; 0071; Case map*/ '\u0052', /*0052; 0072; Case map*/ '\u0053', /*0053; 0073; Case map*/ '\u0054', /*0054; 0074; Case map*/ '\u0055', /*0055; 0075; Case map*/ '\u0056', /*0056; 0076; Case map*/ '\u0057', /*0057; 0077; Case map*/ '\u0058', /*0058; 0078; Case map*/ '\u0059', /*0059; 0079; Case map*/ '\u005A', /*005A; 007A; Case map*/ '\u00B5', /*00B5; 03BC; Case map*/ '\u00C0', /*00C0; 00E0; Case map*/ '\u00C1', /*00C1; 00E1; Case map*/ '\u00C2', /*00C2; 00E2; Case map*/ '\u00C3', /*00C3; 00E3; Case map*/ '\u00C4', /*00C4; 00E4; Case map*/ '\u00C5', /*00C5; 00E5; Case map*/ '\u00C6', /*00C6; 00E6; Case map*/ '\u00C7', /*00C7; 00E7; Case map*/ '\u00C8', /*00C8; 00E8; Case map*/ '\u00C9', /*00C9; 00E9; Case map*/ '\u00CA', /*00CA; 00EA; Case map*/ '\u00CB', /*00CB; 00EB; Case map*/ '\u00CC', /*00CC; 00EC; Case map*/ '\u00CD', /*00CD; 00ED; Case map*/ '\u00CE', /*00CE; 00EE; Case map*/ '\u00CF', /*00CF; 00EF; Case map*/ '\u00D0', /*00D0; 00F0; Case map*/ '\u00D1', /*00D1; 00F1; Case map*/ '\u00D2', /*00D2; 00F2; Case map*/ '\u00D3', /*00D3; 00F3; Case map*/ '\u00D4', /*00D4; 00F4; Case map*/ '\u00D5', /*00D5; 00F5; Case map*/ '\u00D6', /*00D6; 00F6; Case map*/ '\u00D8', /*00D8; 00F8; Case map*/ '\u00D9', /*00D9; 00F9; Case map*/ '\u00DA', /*00DA; 00FA; Case map*/ '\u00DB', /*00DB; 00FB; Case map*/ '\u00DC', /*00DC; 00FC; Case map*/ '\u00DD', /*00DD; 00FD; Case map*/ '\u00DE', /*00DE; 00FE; Case map*/ '\u00DF', /*00DF; 0073 0073; Case map*/ '\u0100', /*0100; 0101; Case map*/ '\u0102', /*0102; 0103; Case map*/ '\u0104', /*0104; 0105; Case map*/ '\u0106', /*0106; 0107; Case map*/ '\u0108', /*0108; 0109; Case map*/ '\u010A', /*010A; 010B; Case map*/ '\u010C', /*010C; 010D; Case map*/ '\u010E', /*010E; 010F; Case map*/ '\u0110', /*0110; 0111; Case map*/ '\u0112', /*0112; 0113; Case map*/ '\u0114', /*0114; 0115; Case map*/ '\u0116', /*0116; 0117; Case map*/ '\u0118', /*0118; 0119; Case map*/ '\u011A', /*011A; 011B; Case map*/ '\u011C', /*011C; 011D; Case map*/ '\u011E', /*011E; 011F; Case map*/ '\u0120', /*0120; 0121; Case map*/ '\u0122', /*0122; 0123; Case map*/ '\u0124', /*0124; 0125; Case map*/ '\u0126', /*0126; 0127; Case map*/ '\u0128', /*0128; 0129; Case map*/ '\u012A', /*012A; 012B; Case map*/ '\u012C', /*012C; 012D; Case map*/ '\u012E', /*012E; 012F; Case map*/ '\u0130', /*0130; 0069 0307; Case map*/ '\u0132', /*0132; 0133; Case map*/ '\u0134', /*0134; 0135; Case map*/ '\u0136', /*0136; 0137; Case map*/ '\u0139', /*0139; 013A; Case map*/ '\u013B', /*013B; 013C; Case map*/ '\u013D', /*013D; 013E; Case map*/ '\u013F', /*013F; 0140; Case map*/ '\u0141', /*0141; 0142; Case map*/ '\u0143', /*0143; 0144; Case map*/ '\u0145', /*0145; 0146; Case map*/ '\u0147', /*0147; 0148; Case map*/ '\u0149', /*0149; 02BC 006E; Case map*/ '\u014A', /*014A; 014B; Case map*/ '\u014C', /*014C; 014D; Case map*/ '\u014E', /*014E; 014F; Case map*/ '\u0150', /*0150; 0151; Case map*/ '\u0152', /*0152; 0153; Case map*/ '\u0154', /*0154; 0155; Case map*/ '\u0156', /*0156; 0157; Case map*/ '\u0158', /*0158; 0159; Case map*/ '\u015A', /*015A; 015B; Case map*/ '\u015C', /*015C; 015D; Case map*/ '\u015E', /*015E; 015F; Case map*/ '\u0160', /*0160; 0161; Case map*/ '\u0162', /*0162; 0163; Case map*/ '\u0164', /*0164; 0165; Case map*/ '\u0166', /*0166; 0167; Case map*/ '\u0168', /*0168; 0169; Case map*/ '\u016A', /*016A; 016B; Case map*/ '\u016C', /*016C; 016D; Case map*/ '\u016E', /*016E; 016F; Case map*/ '\u0170', /*0170; 0171; Case map*/ '\u0172', /*0172; 0173; Case map*/ '\u0174', /*0174; 0175; Case map*/ '\u0176', /*0176; 0177; Case map*/ '\u0178', /*0178; 00FF; Case map*/ '\u0179', /*0179; 017A; Case map*/ '\u017B', /*017B; 017C; Case map*/ '\u017D', /*017D; 017E; Case map*/ '\u017F', /*017F; 0073; Case map*/ '\u0181', /*0181; 0253; Case map*/ '\u0182', /*0182; 0183; Case map*/ '\u0184', /*0184; 0185; Case map*/ '\u0186', /*0186; 0254; Case map*/ '\u0187', /*0187; 0188; Case map*/ '\u0189', /*0189; 0256; Case map*/ '\u018A', /*018A; 0257; Case map*/ '\u018B', /*018B; 018C; Case map*/ '\u018E', /*018E; 01DD; Case map*/ '\u018F', /*018F; 0259; Case map*/ '\u0190', /*0190; 025B; Case map*/ '\u0191', /*0191; 0192; Case map*/ '\u0193', /*0193; 0260; Case map*/ '\u0194', /*0194; 0263; Case map*/ '\u0196', /*0196; 0269; Case map*/ '\u0197', /*0197; 0268; Case map*/ '\u0198', /*0198; 0199; Case map*/ '\u019C', /*019C; 026F; Case map*/ '\u019D', /*019D; 0272; Case map*/ '\u019F', /*019F; 0275; Case map*/ '\u01A0', /*01A0; 01A1; Case map*/ '\u01A2', /*01A2; 01A3; Case map*/ '\u01A4', /*01A4; 01A5; Case map*/ '\u01A6', /*01A6; 0280; Case map*/ '\u01A7', /*01A7; 01A8; Case map*/ '\u01A9', /*01A9; 0283; Case map*/ '\u01AC', /*01AC; 01AD; Case map*/ '\u01AE', /*01AE; 0288; Case map*/ '\u01AF', /*01AF; 01B0; Case map*/ '\u01B1', /*01B1; 028A; Case map*/ '\u01B2', /*01B2; 028B; Case map*/ '\u01B3', /*01B3; 01B4; Case map*/ '\u01B5', /*01B5; 01B6; Case map*/ '\u01B7', /*01B7; 0292; Case map*/ '\u01B8', /*01B8; 01B9; Case map*/ '\u01BC', /*01BC; 01BD; Case map*/ '\u01C4', /*01C4; 01C6; Case map*/ '\u01C5', /*01C5; 01C6; Case map*/ '\u01C7', /*01C7; 01C9; Case map*/ '\u01C8', /*01C8; 01C9; Case map*/ '\u01CA', /*01CA; 01CC; Case map*/ '\u01CB', /*01CB; 01CC; Case map*/ '\u01CD', /*01CD; 01CE; Case map*/ '\u01CF', /*01CF; 01D0; Case map*/ '\u01D1', /*01D1; 01D2; Case map*/ '\u01D3', /*01D3; 01D4; Case map*/ '\u01D5', /*01D5; 01D6; Case map*/ '\u01D7', /*01D7; 01D8; Case map*/ '\u01D9', /*01D9; 01DA; Case map*/ '\u01DB', /*01DB; 01DC; Case map*/ '\u01DE', /*01DE; 01DF; Case map*/ '\u01E0', /*01E0; 01E1; Case map*/ '\u01E2', /*01E2; 01E3; Case map*/ '\u01E4', /*01E4; 01E5; Case map*/ '\u01E6', /*01E6; 01E7; Case map*/ '\u01E8', /*01E8; 01E9; Case map*/ '\u01EA', /*01EA; 01EB; Case map*/ '\u01EC', /*01EC; 01ED; Case map*/ '\u01EE', /*01EE; 01EF; Case map*/ '\u01F0', /*01F0; 006A 030C; Case map*/ '\u01F1', /*01F1; 01F3; Case map*/ '\u01F2', /*01F2; 01F3; Case map*/ '\u01F4', /*01F4; 01F5; Case map*/ '\u01F6', /*01F6; 0195; Case map*/ '\u01F7', /*01F7; 01BF; Case map*/ '\u01F8', /*01F8; 01F9; Case map*/ '\u01FA', /*01FA; 01FB; Case map*/ '\u01FC', /*01FC; 01FD; Case map*/ '\u01FE', /*01FE; 01FF; Case map*/ '\u0200', /*0200; 0201; Case map*/ '\u0202', /*0202; 0203; Case map*/ '\u0204', /*0204; 0205; Case map*/ '\u0206', /*0206; 0207; Case map*/ '\u0208', /*0208; 0209; Case map*/ '\u020A', /*020A; 020B; Case map*/ '\u020C', /*020C; 020D; Case map*/ '\u020E', /*020E; 020F; Case map*/ '\u0210', /*0210; 0211; Case map*/ '\u0212', /*0212; 0213; Case map*/ '\u0214', /*0214; 0215; Case map*/ '\u0216', /*0216; 0217; Case map*/ '\u0218', /*0218; 0219; Case map*/ '\u021A', /*021A; 021B; Case map*/ '\u021C', /*021C; 021D; Case map*/ '\u021E', /*021E; 021F; Case map*/ '\u0220', /*0220; 019E; Case map*/ '\u0222', /*0222; 0223; Case map*/ '\u0224', /*0224; 0225; Case map*/ '\u0226', /*0226; 0227; Case map*/ '\u0228', /*0228; 0229; Case map*/ '\u022A', /*022A; 022B; Case map*/ '\u022C', /*022C; 022D; Case map*/ '\u022E', /*022E; 022F; Case map*/ '\u0230', /*0230; 0231; Case map*/ '\u0232', /*0232; 0233; Case map*/ '\u0345', /*0345; 03B9; Case map*/ '\u0386', /*0386; 03AC; Case map*/ '\u0388', /*0388; 03AD; Case map*/ '\u0389', /*0389; 03AE; Case map*/ '\u038A', /*038A; 03AF; Case map*/ '\u038C', /*038C; 03CC; Case map*/ '\u038E', /*038E; 03CD; Case map*/ '\u038F', /*038F; 03CE; Case map*/ '\u0390', /*0390; 03B9 0308 0301; Case map*/ '\u0391', /*0391; 03B1; Case map*/ '\u0392', /*0392; 03B2; Case map*/ '\u0393', /*0393; 03B3; Case map*/ '\u0394', /*0394; 03B4; Case map*/ '\u0395', /*0395; 03B5; Case map*/ '\u0396', /*0396; 03B6; Case map*/ '\u0397', /*0397; 03B7; Case map*/ '\u0398', /*0398; 03B8; Case map*/ '\u0399', /*0399; 03B9; Case map*/ '\u039A', /*039A; 03BA; Case map*/ '\u039B', /*039B; 03BB; Case map*/ '\u039C', /*039C; 03BC; Case map*/ '\u039D', /*039D; 03BD; Case map*/ '\u039E', /*039E; 03BE; Case map*/ '\u039F', /*039F; 03BF; Case map*/ '\u03A0', /*03A0; 03C0; Case map*/ '\u03A1', /*03A1; 03C1; Case map*/ '\u03A3', /*03A3; 03C3; Case map*/ '\u03A4', /*03A4; 03C4; Case map*/ '\u03A5', /*03A5; 03C5; Case map*/ '\u03A6', /*03A6; 03C6; Case map*/ '\u03A7', /*03A7; 03C7; Case map*/ '\u03A8', /*03A8; 03C8; Case map*/ '\u03A9', /*03A9; 03C9; Case map*/ '\u03AA', /*03AA; 03CA; Case map*/ '\u03AB', /*03AB; 03CB; Case map*/ '\u03B0', /*03B0; 03C5 0308 0301; Case map*/ '\u03C2', /*03C2; 03C3; Case map*/ '\u03D0', /*03D0; 03B2; Case map*/ '\u03D1', /*03D1; 03B8; Case map*/ '\u03D5', /*03D5; 03C6; Case map*/ '\u03D6', /*03D6; 03C0; Case map*/ '\u03D8', /*03D8; 03D9; Case map*/ '\u03DA', /*03DA; 03DB; Case map*/ '\u03DC', /*03DC; 03DD; Case map*/ '\u03DE', /*03DE; 03DF; Case map*/ '\u03E0', /*03E0; 03E1; Case map*/ '\u03E2', /*03E2; 03E3; Case map*/ '\u03E4', /*03E4; 03E5; Case map*/ '\u03E6', /*03E6; 03E7; Case map*/ '\u03E8', /*03E8; 03E9; Case map*/ '\u03EA', /*03EA; 03EB; Case map*/ '\u03EC', /*03EC; 03ED; Case map*/ '\u03EE', /*03EE; 03EF; Case map*/ '\u03F0', /*03F0; 03BA; Case map*/ '\u03F1', /*03F1; 03C1; Case map*/ '\u03F2', /*03F2; 03C3; Case map*/ '\u03F4', /*03F4; 03B8; Case map*/ '\u03F5', /*03F5; 03B5; Case map*/ '\u0400', /*0400; 0450; Case map*/ '\u0401', /*0401; 0451; Case map*/ '\u0402', /*0402; 0452; Case map*/ '\u0403', /*0403; 0453; Case map*/ '\u0404', /*0404; 0454; Case map*/ '\u0405', /*0405; 0455; Case map*/ '\u0406', /*0406; 0456; Case map*/ '\u0407', /*0407; 0457; Case map*/ '\u0408', /*0408; 0458; Case map*/ '\u0409', /*0409; 0459; Case map*/ '\u040A', /*040A; 045A; Case map*/ '\u040B', /*040B; 045B; Case map*/ '\u040C', /*040C; 045C; Case map*/ '\u040D', /*040D; 045D; Case map*/ '\u040E', /*040E; 045E; Case map*/ '\u040F', /*040F; 045F; Case map*/ '\u0410', /*0410; 0430; Case map*/ '\u0411', /*0411; 0431; Case map*/ '\u0412', /*0412; 0432; Case map*/ '\u0413', /*0413; 0433; Case map*/ '\u0414', /*0414; 0434; Case map*/ '\u0415', /*0415; 0435; Case map*/ '\u0416', /*0416; 0436; Case map*/ '\u0417', /*0417; 0437; Case map*/ '\u0418', /*0418; 0438; Case map*/ '\u0419', /*0419; 0439; Case map*/ '\u041A', /*041A; 043A; Case map*/ '\u041B', /*041B; 043B; Case map*/ '\u041C', /*041C; 043C; Case map*/ '\u041D', /*041D; 043D; Case map*/ '\u041E', /*041E; 043E; Case map*/ '\u041F', /*041F; 043F; Case map*/ '\u0420', /*0420; 0440; Case map*/ '\u0421', /*0421; 0441; Case map*/ '\u0422', /*0422; 0442; Case map*/ '\u0423', /*0423; 0443; Case map*/ '\u0424', /*0424; 0444; Case map*/ '\u0425', /*0425; 0445; Case map*/ '\u0426', /*0426; 0446; Case map*/ '\u0427', /*0427; 0447; Case map*/ '\u0428', /*0428; 0448; Case map*/ '\u0429', /*0429; 0449; Case map*/ '\u042A', /*042A; 044A; Case map*/ '\u042B', /*042B; 044B; Case map*/ '\u042C', /*042C; 044C; Case map*/ '\u042D', /*042D; 044D; Case map*/ '\u042E', /*042E; 044E; Case map*/ '\u042F', /*042F; 044F; Case map*/ '\u0460', /*0460; 0461; Case map*/ '\u0462', /*0462; 0463; Case map*/ '\u0464', /*0464; 0465; Case map*/ '\u0466', /*0466; 0467; Case map*/ '\u0468', /*0468; 0469; Case map*/ '\u046A', /*046A; 046B; Case map*/ '\u046C', /*046C; 046D; Case map*/ '\u046E', /*046E; 046F; Case map*/ '\u0470', /*0470; 0471; Case map*/ '\u0472', /*0472; 0473; Case map*/ '\u0474', /*0474; 0475; Case map*/ '\u0476', /*0476; 0477; Case map*/ '\u0478', /*0478; 0479; Case map*/ '\u047A', /*047A; 047B; Case map*/ '\u047C', /*047C; 047D; Case map*/ '\u047E', /*047E; 047F; Case map*/ '\u0480', /*0480; 0481; Case map*/ '\u048A', /*048A; 048B; Case map*/ '\u048C', /*048C; 048D; Case map*/ '\u048E', /*048E; 048F; Case map*/ '\u0490', /*0490; 0491; Case map*/ '\u0492', /*0492; 0493; Case map*/ '\u0494', /*0494; 0495; Case map*/ '\u0496', /*0496; 0497; Case map*/ '\u0498', /*0498; 0499; Case map*/ '\u049A', /*049A; 049B; Case map*/ '\u049C', /*049C; 049D; Case map*/ '\u049E', /*049E; 049F; Case map*/ '\u04A0', /*04A0; 04A1; Case map*/ '\u04A2', /*04A2; 04A3; Case map*/ '\u04A4', /*04A4; 04A5; Case map*/ '\u04A6', /*04A6; 04A7; Case map*/ '\u04A8', /*04A8; 04A9; Case map*/ '\u04AA', /*04AA; 04AB; Case map*/ '\u04AC', /*04AC; 04AD; Case map*/ '\u04AE', /*04AE; 04AF; Case map*/ '\u04B0', /*04B0; 04B1; Case map*/ '\u04B2', /*04B2; 04B3; Case map*/ '\u04B4', /*04B4; 04B5; Case map*/ '\u04B6', /*04B6; 04B7; Case map*/ '\u04B8', /*04B8; 04B9; Case map*/ '\u04BA', /*04BA; 04BB; Case map*/ '\u04BC', /*04BC; 04BD; Case map*/ '\u04BE', /*04BE; 04BF; Case map*/ '\u04C1', /*04C1; 04C2; Case map*/ '\u04C3', /*04C3; 04C4; Case map*/ '\u04C5', /*04C5; 04C6; Case map*/ '\u04C7', /*04C7; 04C8; Case map*/ '\u04C9', /*04C9; 04CA; Case map*/ '\u04CB', /*04CB; 04CC; Case map*/ '\u04CD', /*04CD; 04CE; Case map*/ '\u04D0', /*04D0; 04D1; Case map*/ '\u04D2', /*04D2; 04D3; Case map*/ '\u04D4', /*04D4; 04D5; Case map*/ '\u04D6', /*04D6; 04D7; Case map*/ '\u04D8', /*04D8; 04D9; Case map*/ '\u04DA', /*04DA; 04DB; Case map*/ '\u04DC', /*04DC; 04DD; Case map*/ '\u04DE', /*04DE; 04DF; Case map*/ '\u04E0', /*04E0; 04E1; Case map*/ '\u04E2', /*04E2; 04E3; Case map*/ '\u04E4', /*04E4; 04E5; Case map*/ '\u04E6', /*04E6; 04E7; Case map*/ '\u04E8', /*04E8; 04E9; Case map*/ '\u04EA', /*04EA; 04EB; Case map*/ '\u04EC', /*04EC; 04ED; Case map*/ '\u04EE', /*04EE; 04EF; Case map*/ '\u04F0', /*04F0; 04F1; Case map*/ '\u04F2', /*04F2; 04F3; Case map*/ '\u04F4', /*04F4; 04F5; Case map*/ '\u04F8', /*04F8; 04F9; Case map*/ '\u0500', /*0500; 0501; Case map*/ '\u0502', /*0502; 0503; Case map*/ '\u0504', /*0504; 0505; Case map*/ '\u0506', /*0506; 0507; Case map*/ '\u0508', /*0508; 0509; Case map*/ '\u050A', /*050A; 050B; Case map*/ '\u050C', /*050C; 050D; Case map*/ '\u050E', /*050E; 050F; Case map*/ '\u0531', /*0531; 0561; Case map*/ '\u0532', /*0532; 0562; Case map*/ '\u0533', /*0533; 0563; Case map*/ '\u0534', /*0534; 0564; Case map*/ '\u0535', /*0535; 0565; Case map*/ '\u0536', /*0536; 0566; Case map*/ '\u0537', /*0537; 0567; Case map*/ '\u0538', /*0538; 0568; Case map*/ '\u0539', /*0539; 0569; Case map*/ '\u053A', /*053A; 056A; Case map*/ '\u053B', /*053B; 056B; Case map*/ '\u053C', /*053C; 056C; Case map*/ '\u053D', /*053D; 056D; Case map*/ '\u053E', /*053E; 056E; Case map*/ '\u053F', /*053F; 056F; Case map*/ '\u0540', /*0540; 0570; Case map*/ '\u0541', /*0541; 0571; Case map*/ '\u0542', /*0542; 0572; Case map*/ '\u0543', /*0543; 0573; Case map*/ '\u0544', /*0544; 0574; Case map*/ '\u0545', /*0545; 0575; Case map*/ '\u0546', /*0546; 0576; Case map*/ '\u0547', /*0547; 0577; Case map*/ '\u0548', /*0548; 0578; Case map*/ '\u0549', /*0549; 0579; Case map*/ '\u054A', /*054A; 057A; Case map*/ '\u054B', /*054B; 057B; Case map*/ '\u054C', /*054C; 057C; Case map*/ '\u054D', /*054D; 057D; Case map*/ '\u054E', /*054E; 057E; Case map*/ '\u054F', /*054F; 057F; Case map*/ '\u0550', /*0550; 0580; Case map*/ '\u0551', /*0551; 0581; Case map*/ '\u0552', /*0552; 0582; Case map*/ '\u0553', /*0553; 0583; Case map*/ '\u0554', /*0554; 0584; Case map*/ '\u0555', /*0555; 0585; Case map*/ '\u0556', /*0556; 0586; Case map*/ '\u0587', /*0587; 0565 0582; Case map*/ '\u1E00', /*1E00; 1E01; Case map*/ '\u1E02', /*1E02; 1E03; Case map*/ '\u1E04', /*1E04; 1E05; Case map*/ '\u1E06', /*1E06; 1E07; Case map*/ '\u1E08', /*1E08; 1E09; Case map*/ '\u1E0A', /*1E0A; 1E0B; Case map*/ '\u1E0C', /*1E0C; 1E0D; Case map*/ '\u1E0E', /*1E0E; 1E0F; Case map*/ '\u1E10', /*1E10; 1E11; Case map*/ '\u1E12', /*1E12; 1E13; Case map*/ '\u1E14', /*1E14; 1E15; Case map*/ '\u1E16', /*1E16; 1E17; Case map*/ '\u1E18', /*1E18; 1E19; Case map*/ '\u1E1A', /*1E1A; 1E1B; Case map*/ '\u1E1C', /*1E1C; 1E1D; Case map*/ '\u1E1E', /*1E1E; 1E1F; Case map*/ '\u1E20', /*1E20; 1E21; Case map*/ '\u1E22', /*1E22; 1E23; Case map*/ '\u1E24', /*1E24; 1E25; Case map*/ '\u1E26', /*1E26; 1E27; Case map*/ '\u1E28', /*1E28; 1E29; Case map*/ '\u1E2A', /*1E2A; 1E2B; Case map*/ '\u1E2C', /*1E2C; 1E2D; Case map*/ '\u1E2E', /*1E2E; 1E2F; Case map*/ '\u1E30', /*1E30; 1E31; Case map*/ '\u1E32', /*1E32; 1E33; Case map*/ '\u1E34', /*1E34; 1E35; Case map*/ '\u1E36', /*1E36; 1E37; Case map*/ '\u1E38', /*1E38; 1E39; Case map*/ '\u1E3A', /*1E3A; 1E3B; Case map*/ '\u1E3C', /*1E3C; 1E3D; Case map*/ '\u1E3E', /*1E3E; 1E3F; Case map*/ '\u1E40', /*1E40; 1E41; Case map*/ '\u1E42', /*1E42; 1E43; Case map*/ '\u1E44', /*1E44; 1E45; Case map*/ '\u1E46', /*1E46; 1E47; Case map*/ '\u1E48', /*1E48; 1E49; Case map*/ '\u1E4A', /*1E4A; 1E4B; Case map*/ '\u1E4C', /*1E4C; 1E4D; Case map*/ '\u1E4E', /*1E4E; 1E4F; Case map*/ '\u1E50', /*1E50; 1E51; Case map*/ '\u1E52', /*1E52; 1E53; Case map*/ '\u1E54', /*1E54; 1E55; Case map*/ '\u1E56', /*1E56; 1E57; Case map*/ '\u1E58', /*1E58; 1E59; Case map*/ '\u1E5A', /*1E5A; 1E5B; Case map*/ '\u1E5C', /*1E5C; 1E5D; Case map*/ '\u1E5E', /*1E5E; 1E5F; Case map*/ '\u1E60', /*1E60; 1E61; Case map*/ '\u1E62', /*1E62; 1E63; Case map*/ '\u1E64', /*1E64; 1E65; Case map*/ '\u1E66', /*1E66; 1E67; Case map*/ '\u1E68', /*1E68; 1E69; Case map*/ '\u1E6A', /*1E6A; 1E6B; Case map*/ '\u1E6C', /*1E6C; 1E6D; Case map*/ '\u1E6E', /*1E6E; 1E6F; Case map*/ '\u1E70', /*1E70; 1E71; Case map*/ '\u1E72', /*1E72; 1E73; Case map*/ '\u1E74', /*1E74; 1E75; Case map*/ '\u1E76', /*1E76; 1E77; Case map*/ '\u1E78', /*1E78; 1E79; Case map*/ '\u1E7A', /*1E7A; 1E7B; Case map*/ '\u1E7C', /*1E7C; 1E7D; Case map*/ '\u1E7E', /*1E7E; 1E7F; Case map*/ '\u1E80', /*1E80; 1E81; Case map*/ '\u1E82', /*1E82; 1E83; Case map*/ '\u1E84', /*1E84; 1E85; Case map*/ '\u1E86', /*1E86; 1E87; Case map*/ '\u1E88', /*1E88; 1E89; Case map*/ '\u1E8A', /*1E8A; 1E8B; Case map*/ '\u1E8C', /*1E8C; 1E8D; Case map*/ '\u1E8E', /*1E8E; 1E8F; Case map*/ '\u1E90', /*1E90; 1E91; Case map*/ '\u1E92', /*1E92; 1E93; Case map*/ '\u1E94', /*1E94; 1E95; Case map*/ '\u1E96', /*1E96; 0068 0331; Case map*/ '\u1E97', /*1E97; 0074 0308; Case map*/ '\u1E98', /*1E98; 0077 030A; Case map*/ '\u1E99', /*1E99; 0079 030A; Case map*/ '\u1E9A', /*1E9A; 0061 02BE; Case map*/ '\u1E9B', /*1E9B; 1E61; Case map*/ '\u1EA0', /*1EA0; 1EA1; Case map*/ '\u1EA2', /*1EA2; 1EA3; Case map*/ '\u1EA4', /*1EA4; 1EA5; Case map*/ '\u1EA6', /*1EA6; 1EA7; Case map*/ '\u1EA8', /*1EA8; 1EA9; Case map*/ '\u1EAA', /*1EAA; 1EAB; Case map*/ '\u1EAC', /*1EAC; 1EAD; Case map*/ '\u1EAE', /*1EAE; 1EAF; Case map*/ '\u1EB0', /*1EB0; 1EB1; Case map*/ '\u1EB2', /*1EB2; 1EB3; Case map*/ '\u1EB4', /*1EB4; 1EB5; Case map*/ '\u1EB6', /*1EB6; 1EB7; Case map*/ '\u1EB8', /*1EB8; 1EB9; Case map*/ '\u1EBA', /*1EBA; 1EBB; Case map*/ '\u1EBC', /*1EBC; 1EBD; Case map*/ '\u1EBE', /*1EBE; 1EBF; Case map*/ '\u1EC0', /*1EC0; 1EC1; Case map*/ '\u1EC2', /*1EC2; 1EC3; Case map*/ '\u1EC4', /*1EC4; 1EC5; Case map*/ '\u1EC6', /*1EC6; 1EC7; Case map*/ '\u1EC8', /*1EC8; 1EC9; Case map*/ '\u1ECA', /*1ECA; 1ECB; Case map*/ '\u1ECC', /*1ECC; 1ECD; Case map*/ '\u1ECE', /*1ECE; 1ECF; Case map*/ '\u1ED0', /*1ED0; 1ED1; Case map*/ '\u1ED2', /*1ED2; 1ED3; Case map*/ '\u1ED4', /*1ED4; 1ED5; Case map*/ '\u1ED6', /*1ED6; 1ED7; Case map*/ '\u1ED8', /*1ED8; 1ED9; Case map*/ '\u1EDA', /*1EDA; 1EDB; Case map*/ '\u1EDC', /*1EDC; 1EDD; Case map*/ '\u1EDE', /*1EDE; 1EDF; Case map*/ '\u1EE0', /*1EE0; 1EE1; Case map*/ '\u1EE2', /*1EE2; 1EE3; Case map*/ '\u1EE4', /*1EE4; 1EE5; Case map*/ '\u1EE6', /*1EE6; 1EE7; Case map*/ '\u1EE8', /*1EE8; 1EE9; Case map*/ '\u1EEA', /*1EEA; 1EEB; Case map*/ '\u1EEC', /*1EEC; 1EED; Case map*/ '\u1EEE', /*1EEE; 1EEF; Case map*/ '\u1EF0', /*1EF0; 1EF1; Case map*/ '\u1EF2', /*1EF2; 1EF3; Case map*/ '\u1EF4', /*1EF4; 1EF5; Case map*/ '\u1EF6', /*1EF6; 1EF7; Case map*/ '\u1EF8', /*1EF8; 1EF9; Case map*/ '\u1F08', /*1F08; 1F00; Case map*/ '\u1F09', /*1F09; 1F01; Case map*/ '\u1F0A', /*1F0A; 1F02; Case map*/ '\u1F0B', /*1F0B; 1F03; Case map*/ '\u1F0C', /*1F0C; 1F04; Case map*/ '\u1F0D', /*1F0D; 1F05; Case map*/ '\u1F0E', /*1F0E; 1F06; Case map*/ '\u1F0F', /*1F0F; 1F07; Case map*/ '\u1F18', /*1F18; 1F10; Case map*/ '\u1F19', /*1F19; 1F11; Case map*/ '\u1F1A', /*1F1A; 1F12; Case map*/ '\u1F1B', /*1F1B; 1F13; Case map*/ '\u1F1C', /*1F1C; 1F14; Case map*/ '\u1F1D', /*1F1D; 1F15; Case map*/ '\u1F28', /*1F28; 1F20; Case map*/ '\u1F29', /*1F29; 1F21; Case map*/ '\u1F2A', /*1F2A; 1F22; Case map*/ '\u1F2B', /*1F2B; 1F23; Case map*/ '\u1F2C', /*1F2C; 1F24; Case map*/ '\u1F2D', /*1F2D; 1F25; Case map*/ '\u1F2E', /*1F2E; 1F26; Case map*/ '\u1F2F', /*1F2F; 1F27; Case map*/ '\u1F38', /*1F38; 1F30; Case map*/ '\u1F39', /*1F39; 1F31; Case map*/ '\u1F3A', /*1F3A; 1F32; Case map*/ '\u1F3B', /*1F3B; 1F33; Case map*/ '\u1F3C', /*1F3C; 1F34; Case map*/ '\u1F3D', /*1F3D; 1F35; Case map*/ '\u1F3E', /*1F3E; 1F36; Case map*/ '\u1F3F', /*1F3F; 1F37; Case map*/ '\u1F48', /*1F48; 1F40; Case map*/ '\u1F49', /*1F49; 1F41; Case map*/ '\u1F4A', /*1F4A; 1F42; Case map*/ '\u1F4B', /*1F4B; 1F43; Case map*/ '\u1F4C', /*1F4C; 1F44; Case map*/ '\u1F4D', /*1F4D; 1F45; Case map*/ '\u1F50', /*1F50; 03C5 0313; Case map*/ '\u1F52', /*1F52; 03C5 0313 0300; Case map*/ '\u1F54', /*1F54; 03C5 0313 0301; Case map*/ '\u1F56', /*1F56; 03C5 0313 0342; Case map*/ '\u1F59', /*1F59; 1F51; Case map*/ '\u1F5B', /*1F5B; 1F53; Case map*/ '\u1F5D', /*1F5D; 1F55; Case map*/ '\u1F5F', /*1F5F; 1F57; Case map*/ '\u1F68', /*1F68; 1F60; Case map*/ '\u1F69', /*1F69; 1F61; Case map*/ '\u1F6A', /*1F6A; 1F62; Case map*/ '\u1F6B', /*1F6B; 1F63; Case map*/ '\u1F6C', /*1F6C; 1F64; Case map*/ '\u1F6D', /*1F6D; 1F65; Case map*/ '\u1F6E', /*1F6E; 1F66; Case map*/ '\u1F6F', /*1F6F; 1F67; Case map*/ '\u1F80', /*1F80; 1F00 03B9; Case map*/ '\u1F81', /*1F81; 1F01 03B9; Case map*/ '\u1F82', /*1F82; 1F02 03B9; Case map*/ '\u1F83', /*1F83; 1F03 03B9; Case map*/ '\u1F84', /*1F84; 1F04 03B9; Case map*/ '\u1F85', /*1F85; 1F05 03B9; Case map*/ '\u1F86', /*1F86; 1F06 03B9; Case map*/ '\u1F87', /*1F87; 1F07 03B9; Case map*/ '\u1F88', /*1F88; 1F00 03B9; Case map*/ '\u1F89', /*1F89; 1F01 03B9; Case map*/ '\u1F8A', /*1F8A; 1F02 03B9; Case map*/ '\u1F8B', /*1F8B; 1F03 03B9; Case map*/ '\u1F8C', /*1F8C; 1F04 03B9; Case map*/ '\u1F8D', /*1F8D; 1F05 03B9; Case map*/ '\u1F8E', /*1F8E; 1F06 03B9; Case map*/ '\u1F8F', /*1F8F; 1F07 03B9; Case map*/ '\u1F90', /*1F90; 1F20 03B9; Case map*/ '\u1F91', /*1F91; 1F21 03B9; Case map*/ '\u1F92', /*1F92; 1F22 03B9; Case map*/ '\u1F93', /*1F93; 1F23 03B9; Case map*/ '\u1F94', /*1F94; 1F24 03B9; Case map*/ '\u1F95', /*1F95; 1F25 03B9; Case map*/ '\u1F96', /*1F96; 1F26 03B9; Case map*/ '\u1F97', /*1F97; 1F27 03B9; Case map*/ '\u1F98', /*1F98; 1F20 03B9; Case map*/ '\u1F99', /*1F99; 1F21 03B9; Case map*/ '\u1F9A', /*1F9A; 1F22 03B9; Case map*/ '\u1F9B', /*1F9B; 1F23 03B9; Case map*/ '\u1F9C', /*1F9C; 1F24 03B9; Case map*/ '\u1F9D', /*1F9D; 1F25 03B9; Case map*/ '\u1F9E', /*1F9E; 1F26 03B9; Case map*/ '\u1F9F', /*1F9F; 1F27 03B9; Case map*/ '\u1FA0', /*1FA0; 1F60 03B9; Case map*/ '\u1FA1', /*1FA1; 1F61 03B9; Case map*/ '\u1FA2', /*1FA2; 1F62 03B9; Case map*/ '\u1FA3', /*1FA3; 1F63 03B9; Case map*/ '\u1FA4', /*1FA4; 1F64 03B9; Case map*/ '\u1FA5', /*1FA5; 1F65 03B9; Case map*/ '\u1FA6', /*1FA6; 1F66 03B9; Case map*/ '\u1FA7', /*1FA7; 1F67 03B9; Case map*/ '\u1FA8', /*1FA8; 1F60 03B9; Case map*/ '\u1FA9', /*1FA9; 1F61 03B9; Case map*/ '\u1FAA', /*1FAA; 1F62 03B9; Case map*/ '\u1FAB', /*1FAB; 1F63 03B9; Case map*/ '\u1FAC', /*1FAC; 1F64 03B9; Case map*/ '\u1FAD', /*1FAD; 1F65 03B9; Case map*/ '\u1FAE', /*1FAE; 1F66 03B9; Case map*/ '\u1FAF', /*1FAF; 1F67 03B9; Case map*/ '\u1FB2', /*1FB2; 1F70 03B9; Case map*/ '\u1FB3', /*1FB3; 03B1 03B9; Case map*/ '\u1FB4', /*1FB4; 03AC 03B9; Case map*/ '\u1FB6', /*1FB6; 03B1 0342; Case map*/ '\u1FB7', /*1FB7; 03B1 0342 03B9; Case map*/ '\u1FB8', /*1FB8; 1FB0; Case map*/ '\u1FB9', /*1FB9; 1FB1; Case map*/ '\u1FBA', /*1FBA; 1F70; Case map*/ '\u1FBB', /*1FBB; 1F71; Case map*/ '\u1FBC', /*1FBC; 03B1 03B9; Case map*/ '\u1FBE', /*1FBE; 03B9; Case map*/ '\u1FC2', /*1FC2; 1F74 03B9; Case map*/ '\u1FC3', /*1FC3; 03B7 03B9; Case map*/ '\u1FC4', /*1FC4; 03AE 03B9; Case map*/ '\u1FC6', /*1FC6; 03B7 0342; Case map*/ '\u1FC7', /*1FC7; 03B7 0342 03B9; Case map*/ '\u1FC8', /*1FC8; 1F72; Case map*/ '\u1FC9', /*1FC9; 1F73; Case map*/ '\u1FCA', /*1FCA; 1F74; Case map*/ '\u1FCB', /*1FCB; 1F75; Case map*/ '\u1FCC', /*1FCC; 03B7 03B9; Case map*/ '\u1FD2', /*1FD2; 03B9 0308 0300; Case map*/ '\u1FD3', /*1FD3; 03B9 0308 0301; Case map*/ '\u1FD6', /*1FD6; 03B9 0342; Case map*/ '\u1FD7', /*1FD7; 03B9 0308 0342; Case map*/ '\u1FD8', /*1FD8; 1FD0; Case map*/ '\u1FD9', /*1FD9; 1FD1; Case map*/ '\u1FDA', /*1FDA; 1F76; Case map*/ '\u1FDB', /*1FDB; 1F77; Case map*/ '\u1FE2', /*1FE2; 03C5 0308 0300; Case map*/ '\u1FE3', /*1FE3; 03C5 0308 0301; Case map*/ '\u1FE4', /*1FE4; 03C1 0313; Case map*/ '\u1FE6', /*1FE6; 03C5 0342; Case map*/ '\u1FE7', /*1FE7; 03C5 0308 0342; Case map*/ '\u1FE8', /*1FE8; 1FE0; Case map*/ '\u1FE9', /*1FE9; 1FE1; Case map*/ '\u1FEA', /*1FEA; 1F7A; Case map*/ '\u1FEB', /*1FEB; 1F7B; Case map*/ '\u1FEC', /*1FEC; 1FE5; Case map*/ '\u1FF2', /*1FF2; 1F7C 03B9; Case map*/ '\u1FF3', /*1FF3; 03C9 03B9; Case map*/ '\u1FF4', /*1FF4; 03CE 03B9; Case map*/ '\u1FF6', /*1FF6; 03C9 0342; Case map*/ '\u1FF7', /*1FF7; 03C9 0342 03B9; Case map*/ '\u1FF8', /*1FF8; 1F78; Case map*/ '\u1FF9', /*1FF9; 1F79; Case map*/ '\u1FFA', /*1FFA; 1F7C; Case map*/ '\u1FFB', /*1FFB; 1F7D; Case map*/ '\u1FFC', /*1FFC; 03C9 03B9; Case map*/ '\u2126', /*2126; 03C9; Case map*/ '\u212A', /*212A; 006B; Case map*/ '\u212B', /*212B; 00E5; Case map*/ '\u2160', /*2160; 2170; Case map*/ '\u2161', /*2161; 2171; Case map*/ '\u2162', /*2162; 2172; Case map*/ '\u2163', /*2163; 2173; Case map*/ '\u2164', /*2164; 2174; Case map*/ '\u2165', /*2165; 2175; Case map*/ '\u2166', /*2166; 2176; Case map*/ '\u2167', /*2167; 2177; Case map*/ '\u2168', /*2168; 2178; Case map*/ '\u2169', /*2169; 2179; Case map*/ '\u216A', /*216A; 217A; Case map*/ '\u216B', /*216B; 217B; Case map*/ '\u216C', /*216C; 217C; Case map*/ '\u216D', /*216D; 217D; Case map*/ '\u216E', /*216E; 217E; Case map*/ '\u216F', /*216F; 217F; Case map*/ '\u24B6', /*24B6; 24D0; Case map*/ '\u24B7', /*24B7; 24D1; Case map*/ '\u24B8', /*24B8; 24D2; Case map*/ '\u24B9', /*24B9; 24D3; Case map*/ '\u24BA', /*24BA; 24D4; Case map*/ '\u24BB', /*24BB; 24D5; Case map*/ '\u24BC', /*24BC; 24D6; Case map*/ '\u24BD', /*24BD; 24D7; Case map*/ '\u24BE', /*24BE; 24D8; Case map*/ '\u24BF', /*24BF; 24D9; Case map*/ '\u24C0', /*24C0; 24DA; Case map*/ '\u24C1', /*24C1; 24DB; Case map*/ '\u24C2', /*24C2; 24DC; Case map*/ '\u24C3', /*24C3; 24DD; Case map*/ '\u24C4', /*24C4; 24DE; Case map*/ '\u24C5', /*24C5; 24DF; Case map*/ '\u24C6', /*24C6; 24E0; Case map*/ '\u24C7', /*24C7; 24E1; Case map*/ '\u24C8', /*24C8; 24E2; Case map*/ '\u24C9', /*24C9; 24E3; Case map*/ '\u24CA', /*24CA; 24E4; Case map*/ '\u24CB', /*24CB; 24E5; Case map*/ '\u24CC', /*24CC; 24E6; Case map*/ '\u24CD', /*24CD; 24E7; Case map*/ '\u24CE', /*24CE; 24E8; Case map*/ '\u24CF', /*24CF; 24E9; Case map*/ '\uFB00', /*FB00; 0066 0066; Case map*/ '\uFB01', /*FB01; 0066 0069; Case map*/ '\uFB02', /*FB02; 0066 006C; Case map*/ '\uFB03', /*FB03; 0066 0066 0069; Case map*/ '\uFB04', /*FB04; 0066 0066 006C; Case map*/ '\uFB05', /*FB05; 0073 0074; Case map*/ '\uFB06', /*FB06; 0073 0074; Case map*/ '\uFB13', /*FB13; 0574 0576; Case map*/ '\uFB14', /*FB14; 0574 0565; Case map*/ '\uFB15', /*FB15; 0574 056B; Case map*/ '\uFB16', /*FB16; 057E 0576; Case map*/ '\uFB17', /*FB17; 0574 056D; Case map*/ '\uFF21', /*FF21; FF41; Case map*/ '\uFF22', /*FF22; FF42; Case map*/ '\uFF23', /*FF23; FF43; Case map*/ '\uFF24', /*FF24; FF44; Case map*/ '\uFF25', /*FF25; FF45; Case map*/ '\uFF26', /*FF26; FF46; Case map*/ '\uFF27', /*FF27; FF47; Case map*/ '\uFF28', /*FF28; FF48; Case map*/ '\uFF29', /*FF29; FF49; Case map*/ '\uFF2A', /*FF2A; FF4A; Case map*/ '\uFF2B', /*FF2B; FF4B; Case map*/ '\uFF2C', /*FF2C; FF4C; Case map*/ '\uFF2D', /*FF2D; FF4D; Case map*/ '\uFF2E', /*FF2E; FF4E; Case map*/ '\uFF2F', /*FF2F; FF4F; Case map*/ '\uFF30', /*FF30; FF50; Case map*/ '\uFF31', /*FF31; FF51; Case map*/ '\uFF32', /*FF32; FF52; Case map*/ '\uFF33', /*FF33; FF53; Case map*/ '\uFF34', /*FF34; FF54; Case map*/ '\uFF35', /*FF35; FF55; Case map*/ '\uFF36', /*FF36; FF56; Case map*/ '\uFF37', /*FF37; FF57; Case map*/ '\uFF38', /*FF38; FF58; Case map*/ '\uFF39', /*FF39; FF59; Case map*/ '\uFF3A', /*FF3A; FF5A; Case map*/ }; public static string[] B3replace = new string[] { "\u0061", /*0041; 0061; Case map*/ "\u0062", /*0042; 0062; Case map*/ "\u0063", /*0043; 0063; Case map*/ "\u0064", /*0044; 0064; Case map*/ "\u0065", /*0045; 0065; Case map*/ "\u0066", /*0046; 0066; Case map*/ "\u0067", /*0047; 0067; Case map*/ "\u0068", /*0048; 0068; Case map*/ "\u0069", /*0049; 0069; Case map*/ "\u006A", /*004A; 006A; Case map*/ "\u006B", /*004B; 006B; Case map*/ "\u006C", /*004C; 006C; Case map*/ "\u006D", /*004D; 006D; Case map*/ "\u006E", /*004E; 006E; Case map*/ "\u006F", /*004F; 006F; Case map*/ "\u0070", /*0050; 0070; Case map*/ "\u0071", /*0051; 0071; Case map*/ "\u0072", /*0052; 0072; Case map*/ "\u0073", /*0053; 0073; Case map*/ "\u0074", /*0054; 0074; Case map*/ "\u0075", /*0055; 0075; Case map*/ "\u0076", /*0056; 0076; Case map*/ "\u0077", /*0057; 0077; Case map*/ "\u0078", /*0058; 0078; Case map*/ "\u0079", /*0059; 0079; Case map*/ "\u007A", /*005A; 007A; Case map*/ "\u03BC", /*00B5; 03BC; Case map*/ "\u00E0", /*00C0; 00E0; Case map*/ "\u00E1", /*00C1; 00E1; Case map*/ "\u00E2", /*00C2; 00E2; Case map*/ "\u00E3", /*00C3; 00E3; Case map*/ "\u00E4", /*00C4; 00E4; Case map*/ "\u00E5", /*00C5; 00E5; Case map*/ "\u00E6", /*00C6; 00E6; Case map*/ "\u00E7", /*00C7; 00E7; Case map*/ "\u00E8", /*00C8; 00E8; Case map*/ "\u00E9", /*00C9; 00E9; Case map*/ "\u00EA", /*00CA; 00EA; Case map*/ "\u00EB", /*00CB; 00EB; Case map*/ "\u00EC", /*00CC; 00EC; Case map*/ "\u00ED", /*00CD; 00ED; Case map*/ "\u00EE", /*00CE; 00EE; Case map*/ "\u00EF", /*00CF; 00EF; Case map*/ "\u00F0", /*00D0; 00F0; Case map*/ "\u00F1", /*00D1; 00F1; Case map*/ "\u00F2", /*00D2; 00F2; Case map*/ "\u00F3", /*00D3; 00F3; Case map*/ "\u00F4", /*00D4; 00F4; Case map*/ "\u00F5", /*00D5; 00F5; Case map*/ "\u00F6", /*00D6; 00F6; Case map*/ "\u00F8", /*00D8; 00F8; Case map*/ "\u00F9", /*00D9; 00F9; Case map*/ "\u00FA", /*00DA; 00FA; Case map*/ "\u00FB", /*00DB; 00FB; Case map*/ "\u00FC", /*00DC; 00FC; Case map*/ "\u00FD", /*00DD; 00FD; Case map*/ "\u00FE", /*00DE; 00FE; Case map*/ "\u0073\u0073", /*00DF; 0073 0073; Case map*/ "\u0101", /*0100; 0101; Case map*/ "\u0103", /*0102; 0103; Case map*/ "\u0105", /*0104; 0105; Case map*/ "\u0107", /*0106; 0107; Case map*/ "\u0109", /*0108; 0109; Case map*/ "\u010B", /*010A; 010B; Case map*/ "\u010D", /*010C; 010D; Case map*/ "\u010F", /*010E; 010F; Case map*/ "\u0111", /*0110; 0111; Case map*/ "\u0113", /*0112; 0113; Case map*/ "\u0115", /*0114; 0115; Case map*/ "\u0117", /*0116; 0117; Case map*/ "\u0119", /*0118; 0119; Case map*/ "\u011B", /*011A; 011B; Case map*/ "\u011D", /*011C; 011D; Case map*/ "\u011F", /*011E; 011F; Case map*/ "\u0121", /*0120; 0121; Case map*/ "\u0123", /*0122; 0123; Case map*/ "\u0125", /*0124; 0125; Case map*/ "\u0127", /*0126; 0127; Case map*/ "\u0129", /*0128; 0129; Case map*/ "\u012B", /*012A; 012B; Case map*/ "\u012D", /*012C; 012D; Case map*/ "\u012F", /*012E; 012F; Case map*/ "\u0069\u0307", /*0130; 0069 0307; Case map*/ "\u0133", /*0132; 0133; Case map*/ "\u0135", /*0134; 0135; Case map*/ "\u0137", /*0136; 0137; Case map*/ "\u013A", /*0139; 013A; Case map*/ "\u013C", /*013B; 013C; Case map*/ "\u013E", /*013D; 013E; Case map*/ "\u0140", /*013F; 0140; Case map*/ "\u0142", /*0141; 0142; Case map*/ "\u0144", /*0143; 0144; Case map*/ "\u0146", /*0145; 0146; Case map*/ "\u0148", /*0147; 0148; Case map*/ "\u02BC\u006E", /*0149; 02BC 006E; Case map*/ "\u014B", /*014A; 014B; Case map*/ "\u014D", /*014C; 014D; Case map*/ "\u014F", /*014E; 014F; Case map*/ "\u0151", /*0150; 0151; Case map*/ "\u0153", /*0152; 0153; Case map*/ "\u0155", /*0154; 0155; Case map*/ "\u0157", /*0156; 0157; Case map*/ "\u0159", /*0158; 0159; Case map*/ "\u015B", /*015A; 015B; Case map*/ "\u015D", /*015C; 015D; Case map*/ "\u015F", /*015E; 015F; Case map*/ "\u0161", /*0160; 0161; Case map*/ "\u0163", /*0162; 0163; Case map*/ "\u0165", /*0164; 0165; Case map*/ "\u0167", /*0166; 0167; Case map*/ "\u0169", /*0168; 0169; Case map*/ "\u016B", /*016A; 016B; Case map*/ "\u016D", /*016C; 016D; Case map*/ "\u016F", /*016E; 016F; Case map*/ "\u0171", /*0170; 0171; Case map*/ "\u0173", /*0172; 0173; Case map*/ "\u0175", /*0174; 0175; Case map*/ "\u0177", /*0176; 0177; Case map*/ "\u00FF", /*0178; 00FF; Case map*/ "\u017A", /*0179; 017A; Case map*/ "\u017C", /*017B; 017C; Case map*/ "\u017E", /*017D; 017E; Case map*/ "\u0073", /*017F; 0073; Case map*/ "\u0253", /*0181; 0253; Case map*/ "\u0183", /*0182; 0183; Case map*/ "\u0185", /*0184; 0185; Case map*/ "\u0254", /*0186; 0254; Case map*/ "\u0188", /*0187; 0188; Case map*/ "\u0256", /*0189; 0256; Case map*/ "\u0257", /*018A; 0257; Case map*/ "\u018C", /*018B; 018C; Case map*/ "\u01DD", /*018E; 01DD; Case map*/ "\u0259", /*018F; 0259; Case map*/ "\u025B", /*0190; 025B; Case map*/ "\u0192", /*0191; 0192; Case map*/ "\u0260", /*0193; 0260; Case map*/ "\u0263", /*0194; 0263; Case map*/ "\u0269", /*0196; 0269; Case map*/ "\u0268", /*0197; 0268; Case map*/ "\u0199", /*0198; 0199; Case map*/ "\u026F", /*019C; 026F; Case map*/ "\u0272", /*019D; 0272; Case map*/ "\u0275", /*019F; 0275; Case map*/ "\u01A1", /*01A0; 01A1; Case map*/ "\u01A3", /*01A2; 01A3; Case map*/ "\u01A5", /*01A4; 01A5; Case map*/ "\u0280", /*01A6; 0280; Case map*/ "\u01A8", /*01A7; 01A8; Case map*/ "\u0283", /*01A9; 0283; Case map*/ "\u01AD", /*01AC; 01AD; Case map*/ "\u0288", /*01AE; 0288; Case map*/ "\u01B0", /*01AF; 01B0; Case map*/ "\u028A", /*01B1; 028A; Case map*/ "\u028B", /*01B2; 028B; Case map*/ "\u01B4", /*01B3; 01B4; Case map*/ "\u01B6", /*01B5; 01B6; Case map*/ "\u0292", /*01B7; 0292; Case map*/ "\u01B9", /*01B8; 01B9; Case map*/ "\u01BD", /*01BC; 01BD; Case map*/ "\u01C6", /*01C4; 01C6; Case map*/ "\u01C6", /*01C5; 01C6; Case map*/ "\u01C9", /*01C7; 01C9; Case map*/ "\u01C9", /*01C8; 01C9; Case map*/ "\u01CC", /*01CA; 01CC; Case map*/ "\u01CC", /*01CB; 01CC; Case map*/ "\u01CE", /*01CD; 01CE; Case map*/ "\u01D0", /*01CF; 01D0; Case map*/ "\u01D2", /*01D1; 01D2; Case map*/ "\u01D4", /*01D3; 01D4; Case map*/ "\u01D6", /*01D5; 01D6; Case map*/ "\u01D8", /*01D7; 01D8; Case map*/ "\u01DA", /*01D9; 01DA; Case map*/ "\u01DC", /*01DB; 01DC; Case map*/ "\u01DF", /*01DE; 01DF; Case map*/ "\u01E1", /*01E0; 01E1; Case map*/ "\u01E3", /*01E2; 01E3; Case map*/ "\u01E5", /*01E4; 01E5; Case map*/ "\u01E7", /*01E6; 01E7; Case map*/ "\u01E9", /*01E8; 01E9; Case map*/ "\u01EB", /*01EA; 01EB; Case map*/ "\u01ED", /*01EC; 01ED; Case map*/ "\u01EF", /*01EE; 01EF; Case map*/ "\u006A\u030C", /*01F0; 006A 030C; Case map*/ "\u01F3", /*01F1; 01F3; Case map*/ "\u01F3", /*01F2; 01F3; Case map*/ "\u01F5", /*01F4; 01F5; Case map*/ "\u0195", /*01F6; 0195; Case map*/ "\u01BF", /*01F7; 01BF; Case map*/ "\u01F9", /*01F8; 01F9; Case map*/ "\u01FB", /*01FA; 01FB; Case map*/ "\u01FD", /*01FC; 01FD; Case map*/ "\u01FF", /*01FE; 01FF; Case map*/ "\u0201", /*0200; 0201; Case map*/ "\u0203", /*0202; 0203; Case map*/ "\u0205", /*0204; 0205; Case map*/ "\u0207", /*0206; 0207; Case map*/ "\u0209", /*0208; 0209; Case map*/ "\u020B", /*020A; 020B; Case map*/ "\u020D", /*020C; 020D; Case map*/ "\u020F", /*020E; 020F; Case map*/ "\u0211", /*0210; 0211; Case map*/ "\u0213", /*0212; 0213; Case map*/ "\u0215", /*0214; 0215; Case map*/ "\u0217", /*0216; 0217; Case map*/ "\u0219", /*0218; 0219; Case map*/ "\u021B", /*021A; 021B; Case map*/ "\u021D", /*021C; 021D; Case map*/ "\u021F", /*021E; 021F; Case map*/ "\u019E", /*0220; 019E; Case map*/ "\u0223", /*0222; 0223; Case map*/ "\u0225", /*0224; 0225; Case map*/ "\u0227", /*0226; 0227; Case map*/ "\u0229", /*0228; 0229; Case map*/ "\u022B", /*022A; 022B; Case map*/ "\u022D", /*022C; 022D; Case map*/ "\u022F", /*022E; 022F; Case map*/ "\u0231", /*0230; 0231; Case map*/ "\u0233", /*0232; 0233; Case map*/ "\u03B9", /*0345; 03B9; Case map*/ "\u03AC", /*0386; 03AC; Case map*/ "\u03AD", /*0388; 03AD; Case map*/ "\u03AE", /*0389; 03AE; Case map*/ "\u03AF", /*038A; 03AF; Case map*/ "\u03CC", /*038C; 03CC; Case map*/ "\u03CD", /*038E; 03CD; Case map*/ "\u03CE", /*038F; 03CE; Case map*/ "\u03B9\u0308\u0301", /*0390; 03B9 0308 0301; Case map*/ "\u03B1", /*0391; 03B1; Case map*/ "\u03B2", /*0392; 03B2; Case map*/ "\u03B3", /*0393; 03B3; Case map*/ "\u03B4", /*0394; 03B4; Case map*/ "\u03B5", /*0395; 03B5; Case map*/ "\u03B6", /*0396; 03B6; Case map*/ "\u03B7", /*0397; 03B7; Case map*/ "\u03B8", /*0398; 03B8; Case map*/ "\u03B9", /*0399; 03B9; Case map*/ "\u03BA", /*039A; 03BA; Case map*/ "\u03BB", /*039B; 03BB; Case map*/ "\u03BC", /*039C; 03BC; Case map*/ "\u03BD", /*039D; 03BD; Case map*/ "\u03BE", /*039E; 03BE; Case map*/ "\u03BF", /*039F; 03BF; Case map*/ "\u03C0", /*03A0; 03C0; Case map*/ "\u03C1", /*03A1; 03C1; Case map*/ "\u03C3", /*03A3; 03C3; Case map*/ "\u03C4", /*03A4; 03C4; Case map*/ "\u03C5", /*03A5; 03C5; Case map*/ "\u03C6", /*03A6; 03C6; Case map*/ "\u03C7", /*03A7; 03C7; Case map*/ "\u03C8", /*03A8; 03C8; Case map*/ "\u03C9", /*03A9; 03C9; Case map*/ "\u03CA", /*03AA; 03CA; Case map*/ "\u03CB", /*03AB; 03CB; Case map*/ "\u03C5\u0308\u0301", /*03B0; 03C5 0308 0301; Case map*/ "\u03C3", /*03C2; 03C3; Case map*/ "\u03B2", /*03D0; 03B2; Case map*/ "\u03B8", /*03D1; 03B8; Case map*/ "\u03C6", /*03D5; 03C6; Case map*/ "\u03C0", /*03D6; 03C0; Case map*/ "\u03D9", /*03D8; 03D9; Case map*/ "\u03DB", /*03DA; 03DB; Case map*/ "\u03DD", /*03DC; 03DD; Case map*/ "\u03DF", /*03DE; 03DF; Case map*/ "\u03E1", /*03E0; 03E1; Case map*/ "\u03E3", /*03E2; 03E3; Case map*/ "\u03E5", /*03E4; 03E5; Case map*/ "\u03E7", /*03E6; 03E7; Case map*/ "\u03E9", /*03E8; 03E9; Case map*/ "\u03EB", /*03EA; 03EB; Case map*/ "\u03ED", /*03EC; 03ED; Case map*/ "\u03EF", /*03EE; 03EF; Case map*/ "\u03BA", /*03F0; 03BA; Case map*/ "\u03C1", /*03F1; 03C1; Case map*/ "\u03C3", /*03F2; 03C3; Case map*/ "\u03B8", /*03F4; 03B8; Case map*/ "\u03B5", /*03F5; 03B5; Case map*/ "\u0450", /*0400; 0450; Case map*/ "\u0451", /*0401; 0451; Case map*/ "\u0452", /*0402; 0452; Case map*/ "\u0453", /*0403; 0453; Case map*/ "\u0454", /*0404; 0454; Case map*/ "\u0455", /*0405; 0455; Case map*/ "\u0456", /*0406; 0456; Case map*/ "\u0457", /*0407; 0457; Case map*/ "\u0458", /*0408; 0458; Case map*/ "\u0459", /*0409; 0459; Case map*/ "\u045A", /*040A; 045A; Case map*/ "\u045B", /*040B; 045B; Case map*/ "\u045C", /*040C; 045C; Case map*/ "\u045D", /*040D; 045D; Case map*/ "\u045E", /*040E; 045E; Case map*/ "\u045F", /*040F; 045F; Case map*/ "\u0430", /*0410; 0430; Case map*/ "\u0431", /*0411; 0431; Case map*/ "\u0432", /*0412; 0432; Case map*/ "\u0433", /*0413; 0433; Case map*/ "\u0434", /*0414; 0434; Case map*/ "\u0435", /*0415; 0435; Case map*/ "\u0436", /*0416; 0436; Case map*/ "\u0437", /*0417; 0437; Case map*/ "\u0438", /*0418; 0438; Case map*/ "\u0439", /*0419; 0439; Case map*/ "\u043A", /*041A; 043A; Case map*/ "\u043B", /*041B; 043B; Case map*/ "\u043C", /*041C; 043C; Case map*/ "\u043D", /*041D; 043D; Case map*/ "\u043E", /*041E; 043E; Case map*/ "\u043F", /*041F; 043F; Case map*/ "\u0440", /*0420; 0440; Case map*/ "\u0441", /*0421; 0441; Case map*/ "\u0442", /*0422; 0442; Case map*/ "\u0443", /*0423; 0443; Case map*/ "\u0444", /*0424; 0444; Case map*/ "\u0445", /*0425; 0445; Case map*/ "\u0446", /*0426; 0446; Case map*/ "\u0447", /*0427; 0447; Case map*/ "\u0448", /*0428; 0448; Case map*/ "\u0449", /*0429; 0449; Case map*/ "\u044A", /*042A; 044A; Case map*/ "\u044B", /*042B; 044B; Case map*/ "\u044C", /*042C; 044C; Case map*/ "\u044D", /*042D; 044D; Case map*/ "\u044E", /*042E; 044E; Case map*/ "\u044F", /*042F; 044F; Case map*/ "\u0461", /*0460; 0461; Case map*/ "\u0463", /*0462; 0463; Case map*/ "\u0465", /*0464; 0465; Case map*/ "\u0467", /*0466; 0467; Case map*/ "\u0469", /*0468; 0469; Case map*/ "\u046B", /*046A; 046B; Case map*/ "\u046D", /*046C; 046D; Case map*/ "\u046F", /*046E; 046F; Case map*/ "\u0471", /*0470; 0471; Case map*/ "\u0473", /*0472; 0473; Case map*/ "\u0475", /*0474; 0475; Case map*/ "\u0477", /*0476; 0477; Case map*/ "\u0479", /*0478; 0479; Case map*/ "\u047B", /*047A; 047B; Case map*/ "\u047D", /*047C; 047D; Case map*/ "\u047F", /*047E; 047F; Case map*/ "\u0481", /*0480; 0481; Case map*/ "\u048B", /*048A; 048B; Case map*/ "\u048D", /*048C; 048D; Case map*/ "\u048F", /*048E; 048F; Case map*/ "\u0491", /*0490; 0491; Case map*/ "\u0493", /*0492; 0493; Case map*/ "\u0495", /*0494; 0495; Case map*/ "\u0497", /*0496; 0497; Case map*/ "\u0499", /*0498; 0499; Case map*/ "\u049B", /*049A; 049B; Case map*/ "\u049D", /*049C; 049D; Case map*/ "\u049F", /*049E; 049F; Case map*/ "\u04A1", /*04A0; 04A1; Case map*/ "\u04A3", /*04A2; 04A3; Case map*/ "\u04A5", /*04A4; 04A5; Case map*/ "\u04A7", /*04A6; 04A7; Case map*/ "\u04A9", /*04A8; 04A9; Case map*/ "\u04AB", /*04AA; 04AB; Case map*/ "\u04AD", /*04AC; 04AD; Case map*/ "\u04AF", /*04AE; 04AF; Case map*/ "\u04B1", /*04B0; 04B1; Case map*/ "\u04B3", /*04B2; 04B3; Case map*/ "\u04B5", /*04B4; 04B5; Case map*/ "\u04B7", /*04B6; 04B7; Case map*/ "\u04B9", /*04B8; 04B9; Case map*/ "\u04BB", /*04BA; 04BB; Case map*/ "\u04BD", /*04BC; 04BD; Case map*/ "\u04BF", /*04BE; 04BF; Case map*/ "\u04C2", /*04C1; 04C2; Case map*/ "\u04C4", /*04C3; 04C4; Case map*/ "\u04C6", /*04C5; 04C6; Case map*/ "\u04C8", /*04C7; 04C8; Case map*/ "\u04CA", /*04C9; 04CA; Case map*/ "\u04CC", /*04CB; 04CC; Case map*/ "\u04CE", /*04CD; 04CE; Case map*/ "\u04D1", /*04D0; 04D1; Case map*/ "\u04D3", /*04D2; 04D3; Case map*/ "\u04D5", /*04D4; 04D5; Case map*/ "\u04D7", /*04D6; 04D7; Case map*/ "\u04D9", /*04D8; 04D9; Case map*/ "\u04DB", /*04DA; 04DB; Case map*/ "\u04DD", /*04DC; 04DD; Case map*/ "\u04DF", /*04DE; 04DF; Case map*/ "\u04E1", /*04E0; 04E1; Case map*/ "\u04E3", /*04E2; 04E3; Case map*/ "\u04E5", /*04E4; 04E5; Case map*/ "\u04E7", /*04E6; 04E7; Case map*/ "\u04E9", /*04E8; 04E9; Case map*/ "\u04EB", /*04EA; 04EB; Case map*/ "\u04ED", /*04EC; 04ED; Case map*/ "\u04EF", /*04EE; 04EF; Case map*/ "\u04F1", /*04F0; 04F1; Case map*/ "\u04F3", /*04F2; 04F3; Case map*/ "\u04F5", /*04F4; 04F5; Case map*/ "\u04F9", /*04F8; 04F9; Case map*/ "\u0501", /*0500; 0501; Case map*/ "\u0503", /*0502; 0503; Case map*/ "\u0505", /*0504; 0505; Case map*/ "\u0507", /*0506; 0507; Case map*/ "\u0509", /*0508; 0509; Case map*/ "\u050B", /*050A; 050B; Case map*/ "\u050D", /*050C; 050D; Case map*/ "\u050F", /*050E; 050F; Case map*/ "\u0561", /*0531; 0561; Case map*/ "\u0562", /*0532; 0562; Case map*/ "\u0563", /*0533; 0563; Case map*/ "\u0564", /*0534; 0564; Case map*/ "\u0565", /*0535; 0565; Case map*/ "\u0566", /*0536; 0566; Case map*/ "\u0567", /*0537; 0567; Case map*/ "\u0568", /*0538; 0568; Case map*/ "\u0569", /*0539; 0569; Case map*/ "\u056A", /*053A; 056A; Case map*/ "\u056B", /*053B; 056B; Case map*/ "\u056C", /*053C; 056C; Case map*/ "\u056D", /*053D; 056D; Case map*/ "\u056E", /*053E; 056E; Case map*/ "\u056F", /*053F; 056F; Case map*/ "\u0570", /*0540; 0570; Case map*/ "\u0571", /*0541; 0571; Case map*/ "\u0572", /*0542; 0572; Case map*/ "\u0573", /*0543; 0573; Case map*/ "\u0574", /*0544; 0574; Case map*/ "\u0575", /*0545; 0575; Case map*/ "\u0576", /*0546; 0576; Case map*/ "\u0577", /*0547; 0577; Case map*/ "\u0578", /*0548; 0578; Case map*/ "\u0579", /*0549; 0579; Case map*/ "\u057A", /*054A; 057A; Case map*/ "\u057B", /*054B; 057B; Case map*/ "\u057C", /*054C; 057C; Case map*/ "\u057D", /*054D; 057D; Case map*/ "\u057E", /*054E; 057E; Case map*/ "\u057F", /*054F; 057F; Case map*/ "\u0580", /*0550; 0580; Case map*/ "\u0581", /*0551; 0581; Case map*/ "\u0582", /*0552; 0582; Case map*/ "\u0583", /*0553; 0583; Case map*/ "\u0584", /*0554; 0584; Case map*/ "\u0585", /*0555; 0585; Case map*/ "\u0586", /*0556; 0586; Case map*/ "\u0565\u0582", /*0587; 0565 0582; Case map*/ "\u1E01", /*1E00; 1E01; Case map*/ "\u1E03", /*1E02; 1E03; Case map*/ "\u1E05", /*1E04; 1E05; Case map*/ "\u1E07", /*1E06; 1E07; Case map*/ "\u1E09", /*1E08; 1E09; Case map*/ "\u1E0B", /*1E0A; 1E0B; Case map*/ "\u1E0D", /*1E0C; 1E0D; Case map*/ "\u1E0F", /*1E0E; 1E0F; Case map*/ "\u1E11", /*1E10; 1E11; Case map*/ "\u1E13", /*1E12; 1E13; Case map*/ "\u1E15", /*1E14; 1E15; Case map*/ "\u1E17", /*1E16; 1E17; Case map*/ "\u1E19", /*1E18; 1E19; Case map*/ "\u1E1B", /*1E1A; 1E1B; Case map*/ "\u1E1D", /*1E1C; 1E1D; Case map*/ "\u1E1F", /*1E1E; 1E1F; Case map*/ "\u1E21", /*1E20; 1E21; Case map*/ "\u1E23", /*1E22; 1E23; Case map*/ "\u1E25", /*1E24; 1E25; Case map*/ "\u1E27", /*1E26; 1E27; Case map*/ "\u1E29", /*1E28; 1E29; Case map*/ "\u1E2B", /*1E2A; 1E2B; Case map*/ "\u1E2D", /*1E2C; 1E2D; Case map*/ "\u1E2F", /*1E2E; 1E2F; Case map*/ "\u1E31", /*1E30; 1E31; Case map*/ "\u1E33", /*1E32; 1E33; Case map*/ "\u1E35", /*1E34; 1E35; Case map*/ "\u1E37", /*1E36; 1E37; Case map*/ "\u1E39", /*1E38; 1E39; Case map*/ "\u1E3B", /*1E3A; 1E3B; Case map*/ "\u1E3D", /*1E3C; 1E3D; Case map*/ "\u1E3F", /*1E3E; 1E3F; Case map*/ "\u1E41", /*1E40; 1E41; Case map*/ "\u1E43", /*1E42; 1E43; Case map*/ "\u1E45", /*1E44; 1E45; Case map*/ "\u1E47", /*1E46; 1E47; Case map*/ "\u1E49", /*1E48; 1E49; Case map*/ "\u1E4B", /*1E4A; 1E4B; Case map*/ "\u1E4D", /*1E4C; 1E4D; Case map*/ "\u1E4F", /*1E4E; 1E4F; Case map*/ "\u1E51", /*1E50; 1E51; Case map*/ "\u1E53", /*1E52; 1E53; Case map*/ "\u1E55", /*1E54; 1E55; Case map*/ "\u1E57", /*1E56; 1E57; Case map*/ "\u1E59", /*1E58; 1E59; Case map*/ "\u1E5B", /*1E5A; 1E5B; Case map*/ "\u1E5D", /*1E5C; 1E5D; Case map*/ "\u1E5F", /*1E5E; 1E5F; Case map*/ "\u1E61", /*1E60; 1E61; Case map*/ "\u1E63", /*1E62; 1E63; Case map*/ "\u1E65", /*1E64; 1E65; Case map*/ "\u1E67", /*1E66; 1E67; Case map*/ "\u1E69", /*1E68; 1E69; Case map*/ "\u1E6B", /*1E6A; 1E6B; Case map*/ "\u1E6D", /*1E6C; 1E6D; Case map*/ "\u1E6F", /*1E6E; 1E6F; Case map*/ "\u1E71", /*1E70; 1E71; Case map*/ "\u1E73", /*1E72; 1E73; Case map*/ "\u1E75", /*1E74; 1E75; Case map*/ "\u1E77", /*1E76; 1E77; Case map*/ "\u1E79", /*1E78; 1E79; Case map*/ "\u1E7B", /*1E7A; 1E7B; Case map*/ "\u1E7D", /*1E7C; 1E7D; Case map*/ "\u1E7F", /*1E7E; 1E7F; Case map*/ "\u1E81", /*1E80; 1E81; Case map*/ "\u1E83", /*1E82; 1E83; Case map*/ "\u1E85", /*1E84; 1E85; Case map*/ "\u1E87", /*1E86; 1E87; Case map*/ "\u1E89", /*1E88; 1E89; Case map*/ "\u1E8B", /*1E8A; 1E8B; Case map*/ "\u1E8D", /*1E8C; 1E8D; Case map*/ "\u1E8F", /*1E8E; 1E8F; Case map*/ "\u1E91", /*1E90; 1E91; Case map*/ "\u1E93", /*1E92; 1E93; Case map*/ "\u1E95", /*1E94; 1E95; Case map*/ "\u0068\u0331", /*1E96; 0068 0331; Case map*/ "\u0074\u0308", /*1E97; 0074 0308; Case map*/ "\u0077\u030A", /*1E98; 0077 030A; Case map*/ "\u0079\u030A", /*1E99; 0079 030A; Case map*/ "\u0061\u02BE", /*1E9A; 0061 02BE; Case map*/ "\u1E61", /*1E9B; 1E61; Case map*/ "\u1EA1", /*1EA0; 1EA1; Case map*/ "\u1EA3", /*1EA2; 1EA3; Case map*/ "\u1EA5", /*1EA4; 1EA5; Case map*/ "\u1EA7", /*1EA6; 1EA7; Case map*/ "\u1EA9", /*1EA8; 1EA9; Case map*/ "\u1EAB", /*1EAA; 1EAB; Case map*/ "\u1EAD", /*1EAC; 1EAD; Case map*/ "\u1EAF", /*1EAE; 1EAF; Case map*/ "\u1EB1", /*1EB0; 1EB1; Case map*/ "\u1EB3", /*1EB2; 1EB3; Case map*/ "\u1EB5", /*1EB4; 1EB5; Case map*/ "\u1EB7", /*1EB6; 1EB7; Case map*/ "\u1EB9", /*1EB8; 1EB9; Case map*/ "\u1EBB", /*1EBA; 1EBB; Case map*/ "\u1EBD", /*1EBC; 1EBD; Case map*/ "\u1EBF", /*1EBE; 1EBF; Case map*/ "\u1EC1", /*1EC0; 1EC1; Case map*/ "\u1EC3", /*1EC2; 1EC3; Case map*/ "\u1EC5", /*1EC4; 1EC5; Case map*/ "\u1EC7", /*1EC6; 1EC7; Case map*/ "\u1EC9", /*1EC8; 1EC9; Case map*/ "\u1ECB", /*1ECA; 1ECB; Case map*/ "\u1ECD", /*1ECC; 1ECD; Case map*/ "\u1ECF", /*1ECE; 1ECF; Case map*/ "\u1ED1", /*1ED0; 1ED1; Case map*/ "\u1ED3", /*1ED2; 1ED3; Case map*/ "\u1ED5", /*1ED4; 1ED5; Case map*/ "\u1ED7", /*1ED6; 1ED7; Case map*/ "\u1ED9", /*1ED8; 1ED9; Case map*/ "\u1EDB", /*1EDA; 1EDB; Case map*/ "\u1EDD", /*1EDC; 1EDD; Case map*/ "\u1EDF", /*1EDE; 1EDF; Case map*/ "\u1EE1", /*1EE0; 1EE1; Case map*/ "\u1EE3", /*1EE2; 1EE3; Case map*/ "\u1EE5", /*1EE4; 1EE5; Case map*/ "\u1EE7", /*1EE6; 1EE7; Case map*/ "\u1EE9", /*1EE8; 1EE9; Case map*/ "\u1EEB", /*1EEA; 1EEB; Case map*/ "\u1EED", /*1EEC; 1EED; Case map*/ "\u1EEF", /*1EEE; 1EEF; Case map*/ "\u1EF1", /*1EF0; 1EF1; Case map*/ "\u1EF3", /*1EF2; 1EF3; Case map*/ "\u1EF5", /*1EF4; 1EF5; Case map*/ "\u1EF7", /*1EF6; 1EF7; Case map*/ "\u1EF9", /*1EF8; 1EF9; Case map*/ "\u1F00", /*1F08; 1F00; Case map*/ "\u1F01", /*1F09; 1F01; Case map*/ "\u1F02", /*1F0A; 1F02; Case map*/ "\u1F03", /*1F0B; 1F03; Case map*/ "\u1F04", /*1F0C; 1F04; Case map*/ "\u1F05", /*1F0D; 1F05; Case map*/ "\u1F06", /*1F0E; 1F06; Case map*/ "\u1F07", /*1F0F; 1F07; Case map*/ "\u1F10", /*1F18; 1F10; Case map*/ "\u1F11", /*1F19; 1F11; Case map*/ "\u1F12", /*1F1A; 1F12; Case map*/ "\u1F13", /*1F1B; 1F13; Case map*/ "\u1F14", /*1F1C; 1F14; Case map*/ "\u1F15", /*1F1D; 1F15; Case map*/ "\u1F20", /*1F28; 1F20; Case map*/ "\u1F21", /*1F29; 1F21; Case map*/ "\u1F22", /*1F2A; 1F22; Case map*/ "\u1F23", /*1F2B; 1F23; Case map*/ "\u1F24", /*1F2C; 1F24; Case map*/ "\u1F25", /*1F2D; 1F25; Case map*/ "\u1F26", /*1F2E; 1F26; Case map*/ "\u1F27", /*1F2F; 1F27; Case map*/ "\u1F30", /*1F38; 1F30; Case map*/ "\u1F31", /*1F39; 1F31; Case map*/ "\u1F32", /*1F3A; 1F32; Case map*/ "\u1F33", /*1F3B; 1F33; Case map*/ "\u1F34", /*1F3C; 1F34; Case map*/ "\u1F35", /*1F3D; 1F35; Case map*/ "\u1F36", /*1F3E; 1F36; Case map*/ "\u1F37", /*1F3F; 1F37; Case map*/ "\u1F40", /*1F48; 1F40; Case map*/ "\u1F41", /*1F49; 1F41; Case map*/ "\u1F42", /*1F4A; 1F42; Case map*/ "\u1F43", /*1F4B; 1F43; Case map*/ "\u1F44", /*1F4C; 1F44; Case map*/ "\u1F45", /*1F4D; 1F45; Case map*/ "\u03C5\u0313", /*1F50; 03C5 0313; Case map*/ "\u03C5\u0313\u0300", /*1F52; 03C5 0313 0300; Case map*/ "\u03C5\u0313\u0301", /*1F54; 03C5 0313 0301; Case map*/ "\u03C5\u0313\u0342", /*1F56; 03C5 0313 0342; Case map*/ "\u1F51", /*1F59; 1F51; Case map*/ "\u1F53", /*1F5B; 1F53; Case map*/ "\u1F55", /*1F5D; 1F55; Case map*/ "\u1F57", /*1F5F; 1F57; Case map*/ "\u1F60", /*1F68; 1F60; Case map*/ "\u1F61", /*1F69; 1F61; Case map*/ "\u1F62", /*1F6A; 1F62; Case map*/ "\u1F63", /*1F6B; 1F63; Case map*/ "\u1F64", /*1F6C; 1F64; Case map*/ "\u1F65", /*1F6D; 1F65; Case map*/ "\u1F66", /*1F6E; 1F66; Case map*/ "\u1F67", /*1F6F; 1F67; Case map*/ "\u1F00\u03B9", /*1F80; 1F00 03B9; Case map*/ "\u1F01\u03B9", /*1F81; 1F01 03B9; Case map*/ "\u1F02\u03B9", /*1F82; 1F02 03B9; Case map*/ "\u1F03\u03B9", /*1F83; 1F03 03B9; Case map*/ "\u1F04\u03B9", /*1F84; 1F04 03B9; Case map*/ "\u1F05\u03B9", /*1F85; 1F05 03B9; Case map*/ "\u1F06\u03B9", /*1F86; 1F06 03B9; Case map*/ "\u1F07\u03B9", /*1F87; 1F07 03B9; Case map*/ "\u1F00\u03B9", /*1F88; 1F00 03B9; Case map*/ "\u1F01\u03B9", /*1F89; 1F01 03B9; Case map*/ "\u1F02\u03B9", /*1F8A; 1F02 03B9; Case map*/ "\u1F03\u03B9", /*1F8B; 1F03 03B9; Case map*/ "\u1F04\u03B9", /*1F8C; 1F04 03B9; Case map*/ "\u1F05\u03B9", /*1F8D; 1F05 03B9; Case map*/ "\u1F06\u03B9", /*1F8E; 1F06 03B9; Case map*/ "\u1F07\u03B9", /*1F8F; 1F07 03B9; Case map*/ "\u1F20\u03B9", /*1F90; 1F20 03B9; Case map*/ "\u1F21\u03B9", /*1F91; 1F21 03B9; Case map*/ "\u1F22\u03B9", /*1F92; 1F22 03B9; Case map*/ "\u1F23\u03B9", /*1F93; 1F23 03B9; Case map*/ "\u1F24\u03B9", /*1F94; 1F24 03B9; Case map*/ "\u1F25\u03B9", /*1F95; 1F25 03B9; Case map*/ "\u1F26\u03B9", /*1F96; 1F26 03B9; Case map*/ "\u1F27\u03B9", /*1F97; 1F27 03B9; Case map*/ "\u1F20\u03B9", /*1F98; 1F20 03B9; Case map*/ "\u1F21\u03B9", /*1F99; 1F21 03B9; Case map*/ "\u1F22\u03B9", /*1F9A; 1F22 03B9; Case map*/ "\u1F23\u03B9", /*1F9B; 1F23 03B9; Case map*/ "\u1F24\u03B9", /*1F9C; 1F24 03B9; Case map*/ "\u1F25\u03B9", /*1F9D; 1F25 03B9; Case map*/ "\u1F26\u03B9", /*1F9E; 1F26 03B9; Case map*/ "\u1F27\u03B9", /*1F9F; 1F27 03B9; Case map*/ "\u1F60\u03B9", /*1FA0; 1F60 03B9; Case map*/ "\u1F61\u03B9", /*1FA1; 1F61 03B9; Case map*/ "\u1F62\u03B9", /*1FA2; 1F62 03B9; Case map*/ "\u1F63\u03B9", /*1FA3; 1F63 03B9; Case map*/ "\u1F64\u03B9", /*1FA4; 1F64 03B9; Case map*/ "\u1F65\u03B9", /*1FA5; 1F65 03B9; Case map*/ "\u1F66\u03B9", /*1FA6; 1F66 03B9; Case map*/ "\u1F67\u03B9", /*1FA7; 1F67 03B9; Case map*/ "\u1F60\u03B9", /*1FA8; 1F60 03B9; Case map*/ "\u1F61\u03B9", /*1FA9; 1F61 03B9; Case map*/ "\u1F62\u03B9", /*1FAA; 1F62 03B9; Case map*/ "\u1F63\u03B9", /*1FAB; 1F63 03B9; Case map*/ "\u1F64\u03B9", /*1FAC; 1F64 03B9; Case map*/ "\u1F65\u03B9", /*1FAD; 1F65 03B9; Case map*/ "\u1F66\u03B9", /*1FAE; 1F66 03B9; Case map*/ "\u1F67\u03B9", /*1FAF; 1F67 03B9; Case map*/ "\u1F70\u03B9", /*1FB2; 1F70 03B9; Case map*/ "\u03B1\u03B9", /*1FB3; 03B1 03B9; Case map*/ "\u03AC\u03B9", /*1FB4; 03AC 03B9; Case map*/ "\u03B1\u0342", /*1FB6; 03B1 0342; Case map*/ "\u03B1\u0342\u03B9", /*1FB7; 03B1 0342 03B9; Case map*/ "\u1FB0", /*1FB8; 1FB0; Case map*/ "\u1FB1", /*1FB9; 1FB1; Case map*/ "\u1F70", /*1FBA; 1F70; Case map*/ "\u1F71", /*1FBB; 1F71; Case map*/ "\u03B1\u03B9", /*1FBC; 03B1 03B9; Case map*/ "\u03B9", /*1FBE; 03B9; Case map*/ "\u1F74\u03B9", /*1FC2; 1F74 03B9; Case map*/ "\u03B7\u03B9", /*1FC3; 03B7 03B9; Case map*/ "\u03AE\u03B9", /*1FC4; 03AE 03B9; Case map*/ "\u03B7\u0342", /*1FC6; 03B7 0342; Case map*/ "\u03B7\u0342\u03B9", /*1FC7; 03B7 0342 03B9; Case map*/ "\u1F72", /*1FC8; 1F72; Case map*/ "\u1F73", /*1FC9; 1F73; Case map*/ "\u1F74", /*1FCA; 1F74; Case map*/ "\u1F75", /*1FCB; 1F75; Case map*/ "\u03B7\u03B9", /*1FCC; 03B7 03B9; Case map*/ "\u03B9\u0308\u0300", /*1FD2; 03B9 0308 0300; Case map*/ "\u03B9\u0308\u0301", /*1FD3; 03B9 0308 0301; Case map*/ "\u03B9\u0342", /*1FD6; 03B9 0342; Case map*/ "\u03B9\u0308\u0342", /*1FD7; 03B9 0308 0342; Case map*/ "\u1FD0", /*1FD8; 1FD0; Case map*/ "\u1FD1", /*1FD9; 1FD1; Case map*/ "\u1F76", /*1FDA; 1F76; Case map*/ "\u1F77", /*1FDB; 1F77; Case map*/ "\u03C5\u0308\u0300", /*1FE2; 03C5 0308 0300; Case map*/ "\u03C5\u0308\u0301", /*1FE3; 03C5 0308 0301; Case map*/ "\u03C1\u0313", /*1FE4; 03C1 0313; Case map*/ "\u03C5\u0342", /*1FE6; 03C5 0342; Case map*/ "\u03C5\u0308\u0342", /*1FE7; 03C5 0308 0342; Case map*/ "\u1FE0", /*1FE8; 1FE0; Case map*/ "\u1FE1", /*1FE9; 1FE1; Case map*/ "\u1F7A", /*1FEA; 1F7A; Case map*/ "\u1F7B", /*1FEB; 1F7B; Case map*/ "\u1FE5", /*1FEC; 1FE5; Case map*/ "\u1F7C\u03B9", /*1FF2; 1F7C 03B9; Case map*/ "\u03C9\u03B9", /*1FF3; 03C9 03B9; Case map*/ "\u03CE\u03B9", /*1FF4; 03CE 03B9; Case map*/ "\u03C9\u0342", /*1FF6; 03C9 0342; Case map*/ "\u03C9\u0342\u03B9", /*1FF7; 03C9 0342 03B9; Case map*/ "\u1F78", /*1FF8; 1F78; Case map*/ "\u1F79", /*1FF9; 1F79; Case map*/ "\u1F7C", /*1FFA; 1F7C; Case map*/ "\u1F7D", /*1FFB; 1F7D; Case map*/ "\u03C9\u03B9", /*1FFC; 03C9 03B9; Case map*/ "\u03C9", /*2126; 03C9; Case map*/ "\u006B", /*212A; 006B; Case map*/ "\u00E5", /*212B; 00E5; Case map*/ "\u2170", /*2160; 2170; Case map*/ "\u2171", /*2161; 2171; Case map*/ "\u2172", /*2162; 2172; Case map*/ "\u2173", /*2163; 2173; Case map*/ "\u2174", /*2164; 2174; Case map*/ "\u2175", /*2165; 2175; Case map*/ "\u2176", /*2166; 2176; Case map*/ "\u2177", /*2167; 2177; Case map*/ "\u2178", /*2168; 2178; Case map*/ "\u2179", /*2169; 2179; Case map*/ "\u217A", /*216A; 217A; Case map*/ "\u217B", /*216B; 217B; Case map*/ "\u217C", /*216C; 217C; Case map*/ "\u217D", /*216D; 217D; Case map*/ "\u217E", /*216E; 217E; Case map*/ "\u217F", /*216F; 217F; Case map*/ "\u24D0", /*24B6; 24D0; Case map*/ "\u24D1", /*24B7; 24D1; Case map*/ "\u24D2", /*24B8; 24D2; Case map*/ "\u24D3", /*24B9; 24D3; Case map*/ "\u24D4", /*24BA; 24D4; Case map*/ "\u24D5", /*24BB; 24D5; Case map*/ "\u24D6", /*24BC; 24D6; Case map*/ "\u24D7", /*24BD; 24D7; Case map*/ "\u24D8", /*24BE; 24D8; Case map*/ "\u24D9", /*24BF; 24D9; Case map*/ "\u24DA", /*24C0; 24DA; Case map*/ "\u24DB", /*24C1; 24DB; Case map*/ "\u24DC", /*24C2; 24DC; Case map*/ "\u24DD", /*24C3; 24DD; Case map*/ "\u24DE", /*24C4; 24DE; Case map*/ "\u24DF", /*24C5; 24DF; Case map*/ "\u24E0", /*24C6; 24E0; Case map*/ "\u24E1", /*24C7; 24E1; Case map*/ "\u24E2", /*24C8; 24E2; Case map*/ "\u24E3", /*24C9; 24E3; Case map*/ "\u24E4", /*24CA; 24E4; Case map*/ "\u24E5", /*24CB; 24E5; Case map*/ "\u24E6", /*24CC; 24E6; Case map*/ "\u24E7", /*24CD; 24E7; Case map*/ "\u24E8", /*24CE; 24E8; Case map*/ "\u24E9", /*24CF; 24E9; Case map*/ "\u0066\u0066", /*FB00; 0066 0066; Case map*/ "\u0066\u0069", /*FB01; 0066 0069; Case map*/ "\u0066\u006C", /*FB02; 0066 006C; Case map*/ "\u0066\u0066\u0069", /*FB03; 0066 0066 0069; Case map*/ "\u0066\u0066\u006C", /*FB04; 0066 0066 006C; Case map*/ "\u0073\u0074", /*FB05; 0073 0074; Case map*/ "\u0073\u0074", /*FB06; 0073 0074; Case map*/ "\u0574\u0576", /*FB13; 0574 0576; Case map*/ "\u0574\u0565", /*FB14; 0574 0565; Case map*/ "\u0574\u056B", /*FB15; 0574 056B; Case map*/ "\u057E\u0576", /*FB16; 057E 0576; Case map*/ "\u0574\u056D", /*FB17; 0574 056D; Case map*/ "\uFF41", /*FF21; FF41; Case map*/ "\uFF42", /*FF22; FF42; Case map*/ "\uFF43", /*FF23; FF43; Case map*/ "\uFF44", /*FF24; FF44; Case map*/ "\uFF45", /*FF25; FF45; Case map*/ "\uFF46", /*FF26; FF46; Case map*/ "\uFF47", /*FF27; FF47; Case map*/ "\uFF48", /*FF28; FF48; Case map*/ "\uFF49", /*FF29; FF49; Case map*/ "\uFF4A", /*FF2A; FF4A; Case map*/ "\uFF4B", /*FF2B; FF4B; Case map*/ "\uFF4C", /*FF2C; FF4C; Case map*/ "\uFF4D", /*FF2D; FF4D; Case map*/ "\uFF4E", /*FF2E; FF4E; Case map*/ "\uFF4F", /*FF2F; FF4F; Case map*/ "\uFF50", /*FF30; FF50; Case map*/ "\uFF51", /*FF31; FF51; Case map*/ "\uFF52", /*FF32; FF52; Case map*/ "\uFF53", /*FF33; FF53; Case map*/ "\uFF54", /*FF34; FF54; Case map*/ "\uFF55", /*FF35; FF55; Case map*/ "\uFF56", /*FF36; FF56; Case map*/ "\uFF57", /*FF37; FF57; Case map*/ "\uFF58", /*FF38; FF58; Case map*/ "\uFF59", /*FF39; FF59; Case map*/ "\uFF5A", /*FF3A; FF5A; Case map*/ }; public static char[] C11 = new char[] { '\u0020', /* 0020; SPACE */ }; public static char[] C12 = new char[] { '\u00A0', /* 00A0; NO-BREAK SPACE */ '\u1680', /* 1680; OGHAM SPACE MARK */ '\u2000', /* 2000; EN QUAD */ '\u2001', /* 2001; EM QUAD */ '\u2002', /* 2002; EN SPACE */ '\u2003', /* 2003; EM SPACE */ '\u2004', /* 2004; THREE-PER-EM SPACE */ '\u2005', /* 2005; FOUR-PER-EM SPACE */ '\u2006', /* 2006; SIX-PER-EM SPACE */ '\u2007', /* 2007; FIGURE SPACE */ '\u2008', /* 2008; PUNCTUATION SPACE */ '\u2009', /* 2009; THIN SPACE */ '\u200A', /* 200A; HAIR SPACE */ '\u200B', /* 200B; ZERO WIDTH SPACE */ '\u202F', /* 202F; NARROW NO-BREAK SPACE */ '\u205F', /* 205F; MEDIUM MATHEMATICAL SPACE */ '\u3000', /* 3000; IDEOGRAPHIC SPACE */ }; public static char[][] C21 = new char[][] { new char[] { '\u0000', '\u001F' }, /* 0000-001F; [CONTROL CHARACTERS] */ new char[] { '\u007F' }, /* 007F; DELETE */ }; public static char[][] C22 = new char[][] { new char[] { '\u0080', '\u009F' }, /* 0080-009F; [CONTROL CHARACTERS] */ new char[] { '\u06DD' }, /* 06DD; ARABIC END OF AYAH */ new char[] { '\u070F' }, /* 070F; SYRIAC ABBREVIATION MARK */ new char[] { '\u180E' }, /* 180E; MONGOLIAN VOWEL SEPARATOR */ new char[] { '\u200C' }, /* 200C; ZERO WIDTH NON-JOINER */ new char[] { '\u200D' }, /* 200D; ZERO WIDTH JOINER */ new char[] { '\u2028' }, /* 2028; LINE SEPARATOR */ new char[] { '\u2029' }, /* 2029; PARAGRAPH SEPARATOR */ new char[] { '\u2060' }, /* 2060; WORD JOINER */ new char[] { '\u2061' }, /* 2061; FUNCTION APPLICATION */ new char[] { '\u2062' }, /* 2062; INVISIBLE TIMES */ new char[] { '\u2063' }, /* 2063; INVISIBLE SEPARATOR */ new char[] { '\u206A', '\u206F' }, /* 206A-206F; [CONTROL CHARACTERS] */ new char[] { '\uFEFF' }, /* FEFF; ZERO WIDTH NO-BREAK SPACE */ new char[] { '\uFFF9', '\uFFFC' }, /* FFF9-FFFC; [CONTROL CHARACTERS] */ }; public static char[][] C3 = new char[][] { new char[] { '\uE000', '\uF8FF' }, /* E000-F8FF; [PRIVATE USE, PLANE 0] */ }; public static char[][] C4 = new char[][] { new char[] { '\uFDD0', '\uFDEF' }, /* FDD0-FDEF; [NONCHARACTER CODE POINTS] */ new char[] { '\uFFFE', '\uFFFF' }, /* FFFE-FFFF; [NONCHARACTER CODE POINTS] */ }; public static char[][] C5 = new char[][] { new char[] { '\uD800', '\uDFFF' }, /* D800-DFFF; [SURROGATE CODES] */ }; public static char[][] C6 = new char[][] { new char[] { '\uFFF9' }, /* FFF9; INTERLINEAR ANNOTATION ANCHOR */ new char[] { '\uFFFA' }, /* FFFA; INTERLINEAR ANNOTATION SEPARATOR */ new char[] { '\uFFFB' }, /* FFFB; INTERLINEAR ANNOTATION TERMINATOR */ new char[] { '\uFFFC' }, /* FFFC; OBJECT REPLACEMENT CHARACTER */ new char[] { '\uFFFD' }, /* FFFD; REPLACEMENT CHARACTER */ }; public static char[][] C7 = new char[][] { new char[] { '\u2FF0', '\u2FFB' }, /* 2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] */ }; public static char[][] C8 = new char[][] { new char[] { '\u0340' }, /* 0340; COMBINING GRAVE TONE MARK */ new char[] { '\u0341' }, /* 0341; COMBINING ACUTE TONE MARK */ new char[] { '\u200E' }, /* 200E; LEFT-TO-RIGHT MARK */ new char[] { '\u200F' }, /* 200F; RIGHT-TO-LEFT MARK */ new char[] { '\u202A' }, /* 202A; LEFT-TO-RIGHT EMBEDDING */ new char[] { '\u202B' }, /* 202B; RIGHT-TO-LEFT EMBEDDING */ new char[] { '\u202C' }, /* 202C; POP DIRECTIONAL FORMATTING */ new char[] { '\u202D' }, /* 202D; LEFT-TO-RIGHT OVERRIDE */ new char[] { '\u202E' }, /* 202E; RIGHT-TO-LEFT OVERRIDE */ new char[] { '\u206A' }, /* 206A; INHIBIT SYMMETRIC SWAPPING */ new char[] { '\u206B' }, /* 206B; ACTIVATE SYMMETRIC SWAPPING */ new char[] { '\u206C' }, /* 206C; INHIBIT ARABIC FORM SHAPING */ new char[] { '\u206D' }, /* 206D; ACTIVATE ARABIC FORM SHAPING */ new char[] { '\u206E' }, /* 206E; NATIONAL DIGIT SHAPES */ new char[] { '\u206F' }, /* 206F; NOMINAL DIGIT SHAPES */ }; public static char[][] D1 = new char[][] { new char[] { '\u05BE' }, /* 05BE */ new char[] { '\u05C0' }, /* 05C0 */ new char[] { '\u05C3' }, /* 05C3 */ new char[] { '\u05D0', '\u05EA' }, /* 05D0-05EA */ new char[] { '\u05F0', '\u05F4' }, /* 05F0-05F4 */ new char[] { '\u061B' }, /* 061B */ new char[] { '\u061F' }, /* 061F */ new char[] { '\u0621', '\u063A' }, /* 0621-063A */ new char[] { '\u0640', '\u064A' }, /* 0640-064A */ new char[] { '\u066D', '\u066F' }, /* 066D-066F */ new char[] { '\u0671', '\u06D5' }, /* 0671-06D5 */ new char[] { '\u06DD' }, /* 06DD */ new char[] { '\u06E5', '\u06E6' }, /* 06E5-06E6 */ new char[] { '\u06FA', '\u06FE' }, /* 06FA-06FE */ new char[] { '\u0700', '\u070D' }, /* 0700-070D */ new char[] { '\u0710' }, /* 0710 */ new char[] { '\u0712', '\u072C' }, /* 0712-072C */ new char[] { '\u0780', '\u07A5' }, /* 0780-07A5 */ new char[] { '\u07B1' }, /* 07B1 */ new char[] { '\u200F' }, /* 200F */ new char[] { '\uFB1D' }, /* FB1D */ new char[] { '\uFB1F', '\uFB28' }, /* FB1F-FB28 */ new char[] { '\uFB2A', '\uFB36' }, /* FB2A-FB36 */ new char[] { '\uFB38', '\uFB3C' }, /* FB38-FB3C */ new char[] { '\uFB3E' }, /* FB3E */ new char[] { '\uFB40', '\uFB41' }, /* FB40-FB41 */ new char[] { '\uFB43', '\uFB44' }, /* FB43-FB44 */ new char[] { '\uFB46', '\uFBB1' }, /* FB46-FBB1 */ new char[] { '\uFBD3', '\uFD3D' }, /* FBD3-FD3D */ new char[] { '\uFD50', '\uFD8F' }, /* FD50-FD8F */ new char[] { '\uFD92', '\uFDC7' }, /* FD92-FDC7 */ new char[] { '\uFDF0', '\uFDFC' }, /* FDF0-FDFC */ new char[] { '\uFE70', '\uFE74' }, /* FE70-FE74 */ new char[] { '\uFE76', '\uFEFC' }, /* FE76-FEFC */ }; public static char[][] D2 = new char[][] { new char[] { '\u0041', '\u005A' }, /* 0041-005A */ new char[] { '\u0061', '\u007A' }, /* 0061-007A */ new char[] { '\u00AA' }, /* 00AA */ new char[] { '\u00B5' }, /* 00B5 */ new char[] { '\u00BA' }, /* 00BA */ new char[] { '\u00C0', '\u00D6' }, /* 00C0-00D6 */ new char[] { '\u00D8', '\u00F6' }, /* 00D8-00F6 */ new char[] { '\u00F8', '\u0220' }, /* 00F8-0220 */ new char[] { '\u0222', '\u0233' }, /* 0222-0233 */ new char[] { '\u0250', '\u02AD' }, /* 0250-02AD */ new char[] { '\u02B0', '\u02B8' }, /* 02B0-02B8 */ new char[] { '\u02BB', '\u02C1' }, /* 02BB-02C1 */ new char[] { '\u02D0', '\u02D1' }, /* 02D0-02D1 */ new char[] { '\u02E0', '\u02E4' }, /* 02E0-02E4 */ new char[] { '\u02EE' }, /* 02EE */ new char[] { '\u037A' }, /* 037A */ new char[] { '\u0386' }, /* 0386 */ new char[] { '\u0388', '\u038A' }, /* 0388-038A */ new char[] { '\u038C' }, /* 038C */ new char[] { '\u038E', '\u03A1' }, /* 038E-03A1 */ new char[] { '\u03A3', '\u03CE' }, /* 03A3-03CE */ new char[] { '\u03D0', '\u03F5' }, /* 03D0-03F5 */ new char[] { '\u0400', '\u0482' }, /* 0400-0482 */ new char[] { '\u048A', '\u04CE' }, /* 048A-04CE */ new char[] { '\u04D0', '\u04F5' }, /* 04D0-04F5 */ new char[] { '\u04F8', '\u04F9' }, /* 04F8-04F9 */ new char[] { '\u0500', '\u050F' }, /* 0500-050F */ new char[] { '\u0531', '\u0556' }, /* 0531-0556 */ new char[] { '\u0559', '\u055F' }, /* 0559-055F */ new char[] { '\u0561', '\u0587' }, /* 0561-0587 */ new char[] { '\u0589' }, /* 0589 */ new char[] { '\u0903' }, /* 0903 */ new char[] { '\u0905', '\u0939' }, /* 0905-0939 */ new char[] { '\u093D', '\u0940' }, /* 093D-0940 */ new char[] { '\u0949', '\u094C' }, /* 0949-094C */ new char[] { '\u0950' }, /* 0950 */ new char[] { '\u0958', '\u0961' }, /* 0958-0961 */ new char[] { '\u0964', '\u0970' }, /* 0964-0970 */ new char[] { '\u0982', '\u0983' }, /* 0982-0983 */ new char[] { '\u0985', '\u098C' }, /* 0985-098C */ new char[] { '\u098F', '\u0990' }, /* 098F-0990 */ new char[] { '\u0993', '\u09A8' }, /* 0993-09A8 */ new char[] { '\u09AA', '\u09B0' }, /* 09AA-09B0 */ new char[] { '\u09B2' }, /* 09B2 */ new char[] { '\u09B6', '\u09B9' }, /* 09B6-09B9 */ new char[] { '\u09BE', '\u09C0' }, /* 09BE-09C0 */ new char[] { '\u09C7', '\u09C8' }, /* 09C7-09C8 */ new char[] { '\u09CB', '\u09CC' }, /* 09CB-09CC */ new char[] { '\u09D7' }, /* 09D7 */ new char[] { '\u09DC', '\u09DD' }, /* 09DC-09DD */ new char[] { '\u09DF', '\u09E1' }, /* 09DF-09E1 */ new char[] { '\u09E6', '\u09F1' }, /* 09E6-09F1 */ new char[] { '\u09F4', '\u09FA' }, /* 09F4-09FA */ new char[] { '\u0A05', '\u0A0A' }, /* 0A05-0A0A */ new char[] { '\u0A0F', '\u0A10' }, /* 0A0F-0A10 */ new char[] { '\u0A13', '\u0A28' }, /* 0A13-0A28 */ new char[] { '\u0A2A', '\u0A30' }, /* 0A2A-0A30 */ new char[] { '\u0A32', '\u0A33' }, /* 0A32-0A33 */ new char[] { '\u0A35', '\u0A36' }, /* 0A35-0A36 */ new char[] { '\u0A38', '\u0A39' }, /* 0A38-0A39 */ new char[] { '\u0A3E', '\u0A40' }, /* 0A3E-0A40 */ new char[] { '\u0A59', '\u0A5C' }, /* 0A59-0A5C */ new char[] { '\u0A5E' }, /* 0A5E */ new char[] { '\u0A66', '\u0A6F' }, /* 0A66-0A6F */ new char[] { '\u0A72', '\u0A74' }, /* 0A72-0A74 */ new char[] { '\u0A83' }, /* 0A83 */ new char[] { '\u0A85', '\u0A8B' }, /* 0A85-0A8B */ new char[] { '\u0A8D' }, /* 0A8D */ new char[] { '\u0A8F', '\u0A91' }, /* 0A8F-0A91 */ new char[] { '\u0A93', '\u0AA8' }, /* 0A93-0AA8 */ new char[] { '\u0AAA', '\u0AB0' }, /* 0AAA-0AB0 */ new char[] { '\u0AB2', '\u0AB3' }, /* 0AB2-0AB3 */ new char[] { '\u0AB5', '\u0AB9' }, /* 0AB5-0AB9 */ new char[] { '\u0ABD', '\u0AC0' }, /* 0ABD-0AC0 */ new char[] { '\u0AC9' }, /* 0AC9 */ new char[] { '\u0ACB', '\u0ACC' }, /* 0ACB-0ACC */ new char[] { '\u0AD0' }, /* 0AD0 */ new char[] { '\u0AE0' }, /* 0AE0 */ new char[] { '\u0AE6', '\u0AEF' }, /* 0AE6-0AEF */ new char[] { '\u0B02', '\u0B03' }, /* 0B02-0B03 */ new char[] { '\u0B05', '\u0B0C' }, /* 0B05-0B0C */ new char[] { '\u0B0F', '\u0B10' }, /* 0B0F-0B10 */ new char[] { '\u0B13', '\u0B28' }, /* 0B13-0B28 */ new char[] { '\u0B2A', '\u0B30' }, /* 0B2A-0B30 */ new char[] { '\u0B32', '\u0B33' }, /* 0B32-0B33 */ new char[] { '\u0B36', '\u0B39' }, /* 0B36-0B39 */ new char[] { '\u0B3D', '\u0B3E' }, /* 0B3D-0B3E */ new char[] { '\u0B40' }, /* 0B40 */ new char[] { '\u0B47', '\u0B48' }, /* 0B47-0B48 */ new char[] { '\u0B4B', '\u0B4C' }, /* 0B4B-0B4C */ new char[] { '\u0B57' }, /* 0B57 */ new char[] { '\u0B5C', '\u0B5D' }, /* 0B5C-0B5D */ new char[] { '\u0B5F', '\u0B61' }, /* 0B5F-0B61 */ new char[] { '\u0B66', '\u0B70' }, /* 0B66-0B70 */ new char[] { '\u0B83' }, /* 0B83 */ new char[] { '\u0B85', '\u0B8A' }, /* 0B85-0B8A */ new char[] { '\u0B8E', '\u0B90' }, /* 0B8E-0B90 */ new char[] { '\u0B92', '\u0B95' }, /* 0B92-0B95 */ new char[] { '\u0B99', '\u0B9A' }, /* 0B99-0B9A */ new char[] { '\u0B9C' }, /* 0B9C */ new char[] { '\u0B9E', '\u0B9F' }, /* 0B9E-0B9F */ new char[] { '\u0BA3', '\u0BA4' }, /* 0BA3-0BA4 */ new char[] { '\u0BA8', '\u0BAA' }, /* 0BA8-0BAA */ new char[] { '\u0BAE', '\u0BB5' }, /* 0BAE-0BB5 */ new char[] { '\u0BB7', '\u0BB9' }, /* 0BB7-0BB9 */ new char[] { '\u0BBE', '\u0BBF' }, /* 0BBE-0BBF */ new char[] { '\u0BC1', '\u0BC2' }, /* 0BC1-0BC2 */ new char[] { '\u0BC6', '\u0BC8' }, /* 0BC6-0BC8 */ new char[] { '\u0BCA', '\u0BCC' }, /* 0BCA-0BCC */ new char[] { '\u0BD7' }, /* 0BD7 */ new char[] { '\u0BE7', '\u0BF2' }, /* 0BE7-0BF2 */ new char[] { '\u0C01', '\u0C03' }, /* 0C01-0C03 */ new char[] { '\u0C05', '\u0C0C' }, /* 0C05-0C0C */ new char[] { '\u0C0E', '\u0C10' }, /* 0C0E-0C10 */ new char[] { '\u0C12', '\u0C28' }, /* 0C12-0C28 */ new char[] { '\u0C2A', '\u0C33' }, /* 0C2A-0C33 */ new char[] { '\u0C35', '\u0C39' }, /* 0C35-0C39 */ new char[] { '\u0C41', '\u0C44' }, /* 0C41-0C44 */ new char[] { '\u0C60', '\u0C61' }, /* 0C60-0C61 */ new char[] { '\u0C66', '\u0C6F' }, /* 0C66-0C6F */ new char[] { '\u0C82', '\u0C83' }, /* 0C82-0C83 */ new char[] { '\u0C85', '\u0C8C' }, /* 0C85-0C8C */ new char[] { '\u0C8E', '\u0C90' }, /* 0C8E-0C90 */ new char[] { '\u0C92', '\u0CA8' }, /* 0C92-0CA8 */ new char[] { '\u0CAA', '\u0CB3' }, /* 0CAA-0CB3 */ new char[] { '\u0CB5', '\u0CB9' }, /* 0CB5-0CB9 */ new char[] { '\u0CBE' }, /* 0CBE */ new char[] { '\u0CC0', '\u0CC4' }, /* 0CC0-0CC4 */ new char[] { '\u0CC7', '\u0CC8' }, /* 0CC7-0CC8 */ new char[] { '\u0CCA', '\u0CCB' }, /* 0CCA-0CCB */ new char[] { '\u0CD5', '\u0CD6' }, /* 0CD5-0CD6 */ new char[] { '\u0CDE' }, /* 0CDE */ new char[] { '\u0CE0', '\u0CE1' }, /* 0CE0-0CE1 */ new char[] { '\u0CE6', '\u0CEF' }, /* 0CE6-0CEF */ new char[] { '\u0D02', '\u0D03' }, /* 0D02-0D03 */ new char[] { '\u0D05', '\u0D0C' }, /* 0D05-0D0C */ new char[] { '\u0D0E', '\u0D10' }, /* 0D0E-0D10 */ new char[] { '\u0D12', '\u0D28' }, /* 0D12-0D28 */ new char[] { '\u0D2A', '\u0D39' }, /* 0D2A-0D39 */ new char[] { '\u0D3E', '\u0D40' }, /* 0D3E-0D40 */ new char[] { '\u0D46', '\u0D48' }, /* 0D46-0D48 */ new char[] { '\u0D4A', '\u0D4C' }, /* 0D4A-0D4C */ new char[] { '\u0D57' }, /* 0D57 */ new char[] { '\u0D60', '\u0D61' }, /* 0D60-0D61 */ new char[] { '\u0D66', '\u0D6F' }, /* 0D66-0D6F */ new char[] { '\u0D82', '\u0D83' }, /* 0D82-0D83 */ new char[] { '\u0D85', '\u0D96' }, /* 0D85-0D96 */ new char[] { '\u0D9A', '\u0DB1' }, /* 0D9A-0DB1 */ new char[] { '\u0DB3', '\u0DBB' }, /* 0DB3-0DBB */ new char[] { '\u0DBD' }, /* 0DBD */ new char[] { '\u0DC0', '\u0DC6' }, /* 0DC0-0DC6 */ new char[] { '\u0DCF', '\u0DD1' }, /* 0DCF-0DD1 */ new char[] { '\u0DD8', '\u0DDF' }, /* 0DD8-0DDF */ new char[] { '\u0DF2', '\u0DF4' }, /* 0DF2-0DF4 */ new char[] { '\u0E01', '\u0E30' }, /* 0E01-0E30 */ new char[] { '\u0E32', '\u0E33' }, /* 0E32-0E33 */ new char[] { '\u0E40', '\u0E46' }, /* 0E40-0E46 */ new char[] { '\u0E4F', '\u0E5B' }, /* 0E4F-0E5B */ new char[] { '\u0E81', '\u0E82' }, /* 0E81-0E82 */ new char[] { '\u0E84' }, /* 0E84 */ new char[] { '\u0E87', '\u0E88' }, /* 0E87-0E88 */ new char[] { '\u0E8A' }, /* 0E8A */ new char[] { '\u0E8D' }, /* 0E8D */ new char[] { '\u0E94', '\u0E97' }, /* 0E94-0E97 */ new char[] { '\u0E99', '\u0E9F' }, /* 0E99-0E9F */ new char[] { '\u0EA1', '\u0EA3' }, /* 0EA1-0EA3 */ new char[] { '\u0EA5' }, /* 0EA5 */ new char[] { '\u0EA7' }, /* 0EA7 */ new char[] { '\u0EAA', '\u0EAB' }, /* 0EAA-0EAB */ new char[] { '\u0EAD', '\u0EB0' }, /* 0EAD-0EB0 */ new char[] { '\u0EB2', '\u0EB3' }, /* 0EB2-0EB3 */ new char[] { '\u0EBD' }, /* 0EBD */ new char[] { '\u0EC0', '\u0EC4' }, /* 0EC0-0EC4 */ new char[] { '\u0EC6' }, /* 0EC6 */ new char[] { '\u0ED0', '\u0ED9' }, /* 0ED0-0ED9 */ new char[] { '\u0EDC', '\u0EDD' }, /* 0EDC-0EDD */ new char[] { '\u0F00', '\u0F17' }, /* 0F00-0F17 */ new char[] { '\u0F1A', '\u0F34' }, /* 0F1A-0F34 */ new char[] { '\u0F36' }, /* 0F36 */ new char[] { '\u0F38' }, /* 0F38 */ new char[] { '\u0F3E', '\u0F47' }, /* 0F3E-0F47 */ new char[] { '\u0F49', '\u0F6A' }, /* 0F49-0F6A */ new char[] { '\u0F7F' }, /* 0F7F */ new char[] { '\u0F85' }, /* 0F85 */ new char[] { '\u0F88', '\u0F8B' }, /* 0F88-0F8B */ new char[] { '\u0FBE', '\u0FC5' }, /* 0FBE-0FC5 */ new char[] { '\u0FC7', '\u0FCC' }, /* 0FC7-0FCC */ new char[] { '\u0FCF' }, /* 0FCF */ new char[] { '\u1000', '\u1021' }, /* 1000-1021 */ new char[] { '\u1023', '\u1027' }, /* 1023-1027 */ new char[] { '\u1029', '\u102A' }, /* 1029-102A */ new char[] { '\u102C' }, /* 102C */ new char[] { '\u1031' }, /* 1031 */ new char[] { '\u1038' }, /* 1038 */ new char[] { '\u1040', '\u1057' }, /* 1040-1057 */ new char[] { '\u10A0', '\u10C5' }, /* 10A0-10C5 */ new char[] { '\u10D0', '\u10F8' }, /* 10D0-10F8 */ new char[] { '\u10FB' }, /* 10FB */ new char[] { '\u1100', '\u1159' }, /* 1100-1159 */ new char[] { '\u115F', '\u11A2' }, /* 115F-11A2 */ new char[] { '\u11A8', '\u11F9' }, /* 11A8-11F9 */ new char[] { '\u1200', '\u1206' }, /* 1200-1206 */ new char[] { '\u1208', '\u1246' }, /* 1208-1246 */ new char[] { '\u1248' }, /* 1248 */ new char[] { '\u124A', '\u124D' }, /* 124A-124D */ new char[] { '\u1250', '\u1256' }, /* 1250-1256 */ new char[] { '\u1258' }, /* 1258 */ new char[] { '\u125A', '\u125D' }, /* 125A-125D */ new char[] { '\u1260', '\u1286' }, /* 1260-1286 */ new char[] { '\u1288' }, /* 1288 */ new char[] { '\u128A', '\u128D' }, /* 128A-128D */ new char[] { '\u1290', '\u12AE' }, /* 1290-12AE */ new char[] { '\u12B0' }, /* 12B0 */ new char[] { '\u12B2', '\u12B5' }, /* 12B2-12B5 */ new char[] { '\u12B8', '\u12BE' }, /* 12B8-12BE */ new char[] { '\u12C0' }, /* 12C0 */ new char[] { '\u12C2', '\u12C5' }, /* 12C2-12C5 */ new char[] { '\u12C8', '\u12CE' }, /* 12C8-12CE */ new char[] { '\u12D0', '\u12D6' }, /* 12D0-12D6 */ new char[] { '\u12D8', '\u12EE' }, /* 12D8-12EE */ new char[] { '\u12F0', '\u130E' }, /* 12F0-130E */ new char[] { '\u1310' }, /* 1310 */ new char[] { '\u1312', '\u1315' }, /* 1312-1315 */ new char[] { '\u1318', '\u131E' }, /* 1318-131E */ new char[] { '\u1320', '\u1346' }, /* 1320-1346 */ new char[] { '\u1348', '\u135A' }, /* 1348-135A */ new char[] { '\u1361', '\u137C' }, /* 1361-137C */ new char[] { '\u13A0', '\u13F4' }, /* 13A0-13F4 */ new char[] { '\u1401', '\u1676' }, /* 1401-1676 */ new char[] { '\u1681', '\u169A' }, /* 1681-169A */ new char[] { '\u16A0', '\u16F0' }, /* 16A0-16F0 */ new char[] { '\u1700', '\u170C' }, /* 1700-170C */ new char[] { '\u170E', '\u1711' }, /* 170E-1711 */ new char[] { '\u1720', '\u1731' }, /* 1720-1731 */ new char[] { '\u1735', '\u1736' }, /* 1735-1736 */ new char[] { '\u1740', '\u1751' }, /* 1740-1751 */ new char[] { '\u1760', '\u176C' }, /* 1760-176C */ new char[] { '\u176E', '\u1770' }, /* 176E-1770 */ new char[] { '\u1780', '\u17B6' }, /* 1780-17B6 */ new char[] { '\u17BE', '\u17C5' }, /* 17BE-17C5 */ new char[] { '\u17C7', '\u17C8' }, /* 17C7-17C8 */ new char[] { '\u17D4', '\u17DA' }, /* 17D4-17DA */ new char[] { '\u17DC' }, /* 17DC */ new char[] { '\u17E0', '\u17E9' }, /* 17E0-17E9 */ new char[] { '\u1810', '\u1819' }, /* 1810-1819 */ new char[] { '\u1820', '\u1877' }, /* 1820-1877 */ new char[] { '\u1880', '\u18A8' }, /* 1880-18A8 */ new char[] { '\u1E00', '\u1E9B' }, /* 1E00-1E9B */ new char[] { '\u1EA0', '\u1EF9' }, /* 1EA0-1EF9 */ new char[] { '\u1F00', '\u1F15' }, /* 1F00-1F15 */ new char[] { '\u1F18', '\u1F1D' }, /* 1F18-1F1D */ new char[] { '\u1F20', '\u1F45' }, /* 1F20-1F45 */ new char[] { '\u1F48', '\u1F4D' }, /* 1F48-1F4D */ new char[] { '\u1F50', '\u1F57' }, /* 1F50-1F57 */ new char[] { '\u1F59' }, /* 1F59 */ new char[] { '\u1F5B' }, /* 1F5B */ new char[] { '\u1F5D' }, /* 1F5D */ new char[] { '\u1F5F', '\u1F7D' }, /* 1F5F-1F7D */ new char[] { '\u1F80', '\u1FB4' }, /* 1F80-1FB4 */ new char[] { '\u1FB6', '\u1FBC' }, /* 1FB6-1FBC */ new char[] { '\u1FBE' }, /* 1FBE */ new char[] { '\u1FC2', '\u1FC4' }, /* 1FC2-1FC4 */ new char[] { '\u1FC6', '\u1FCC' }, /* 1FC6-1FCC */ new char[] { '\u1FD0', '\u1FD3' }, /* 1FD0-1FD3 */ new char[] { '\u1FD6', '\u1FDB' }, /* 1FD6-1FDB */ new char[] { '\u1FE0', '\u1FEC' }, /* 1FE0-1FEC */ new char[] { '\u1FF2', '\u1FF4' }, /* 1FF2-1FF4 */ new char[] { '\u1FF6', '\u1FFC' }, /* 1FF6-1FFC */ new char[] { '\u200E' }, /* 200E */ new char[] { '\u2071' }, /* 2071 */ new char[] { '\u207F' }, /* 207F */ new char[] { '\u2102' }, /* 2102 */ new char[] { '\u2107' }, /* 2107 */ new char[] { '\u210A', '\u2113' }, /* 210A-2113 */ new char[] { '\u2115' }, /* 2115 */ new char[] { '\u2119', '\u211D' }, /* 2119-211D */ new char[] { '\u2124' }, /* 2124 */ new char[] { '\u2126' }, /* 2126 */ new char[] { '\u2128' }, /* 2128 */ new char[] { '\u212A', '\u212D' }, /* 212A-212D */ new char[] { '\u212F', '\u2131' }, /* 212F-2131 */ new char[] { '\u2133', '\u2139' }, /* 2133-2139 */ new char[] { '\u213D', '\u213F' }, /* 213D-213F */ new char[] { '\u2145', '\u2149' }, /* 2145-2149 */ new char[] { '\u2160', '\u2183' }, /* 2160-2183 */ new char[] { '\u2336', '\u237A' }, /* 2336-237A */ new char[] { '\u2395' }, /* 2395 */ new char[] { '\u249C', '\u24E9' }, /* 249C-24E9 */ new char[] { '\u3005', '\u3007' }, /* 3005-3007 */ new char[] { '\u3021', '\u3029' }, /* 3021-3029 */ new char[] { '\u3031', '\u3035' }, /* 3031-3035 */ new char[] { '\u3038', '\u303C' }, /* 3038-303C */ new char[] { '\u3041', '\u3096' }, /* 3041-3096 */ new char[] { '\u309D', '\u309F' }, /* 309D-309F */ new char[] { '\u30A1', '\u30FA' }, /* 30A1-30FA */ new char[] { '\u30FC', '\u30FF' }, /* 30FC-30FF */ new char[] { '\u3105', '\u312C' }, /* 3105-312C */ new char[] { '\u3131', '\u318E' }, /* 3131-318E */ new char[] { '\u3190', '\u31B7' }, /* 3190-31B7 */ new char[] { '\u31F0', '\u321C' }, /* 31F0-321C */ new char[] { '\u3220', '\u3243' }, /* 3220-3243 */ new char[] { '\u3260', '\u327B' }, /* 3260-327B */ new char[] { '\u327F', '\u32B0' }, /* 327F-32B0 */ new char[] { '\u32C0', '\u32CB' }, /* 32C0-32CB */ new char[] { '\u32D0', '\u32FE' }, /* 32D0-32FE */ new char[] { '\u3300', '\u3376' }, /* 3300-3376 */ new char[] { '\u337B', '\u33DD' }, /* 337B-33DD */ new char[] { '\u33E0', '\u33FE' }, /* 33E0-33FE */ new char[] { '\u3400', '\u4DB5' }, /* 3400-4DB5 */ new char[] { '\u4E00', '\u9FA5' }, /* 4E00-9FA5 */ new char[] { '\uA000', '\uA48C' }, /* A000-A48C */ new char[] { '\uAC00', '\uD7A3' }, /* AC00-D7A3 */ new char[] { '\uD800', '\uFA2D' }, /* D800-FA2D */ new char[] { '\uFA30', '\uFA6A' }, /* FA30-FA6A */ new char[] { '\uFB00', '\uFB06' }, /* FB00-FB06 */ new char[] { '\uFB13', '\uFB17' }, /* FB13-FB17 */ new char[] { '\uFF21', '\uFF3A' }, /* FF21-FF3A */ new char[] { '\uFF41', '\uFF5A' }, /* FF41-FF5A */ new char[] { '\uFF66', '\uFFBE' }, /* FF66-FFBE */ new char[] { '\uFFC2', '\uFFC7' }, /* FFC2-FFC7 */ new char[] { '\uFFCA', '\uFFCF' }, /* FFCA-FFCF */ new char[] { '\uFFD2', '\uFFD7' }, /* FFD2-FFD7 */ new char[] { '\uFFDA', '\uFFDC' }, /* FFDA-FFDC */ }; } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/IDNA.cs0000644000175000017500000001725512204443225021006 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; using System.Text; namespace agsXMPP.Idn { public class IDNA { public const string ACE_PREFIX = "xn--"; /// /// Converts a Unicode string to ASCII using the procedure in RFC3490 /// section 4.1. Unassigned characters are not allowed and STD3 ASCII /// rules are enforced. The input string may be a domain name /// containing dots. /// /// Unicode string. /// Encoded string. public static string ToASCII(string input) { StringBuilder o = new StringBuilder(); StringBuilder h = new StringBuilder(); for (int i = 0; i < input.Length; i++) { char c = input[i]; if (c == '.' || c == '\u3002' || c == '\uff0e' || c == '\uff61') { o.Append(ToASCII(h.ToString(), false, true)); o.Append('.'); h = new StringBuilder(); } else { h.Append(c); } } o.Append(ToASCII(h.ToString(), false, true)); return o.ToString(); } /// /// Converts a Unicode string to ASCII using the procedure in RFC3490 /// section 4.1. Unassigned characters are not allowed and STD3 ASCII /// rules are enforced. /// /// Unicode string. /// Unassigned characters, allowed or not? /// STD3 ASCII rules, enforced or not? /// Encoded string. public static string ToASCII(string input, bool allowUnassigned, bool useSTD3ASCIIRules) { // Step 1: Check if the string contains code points outside // the ASCII range 0..0x7c. bool nonASCII = false; for (int i = 0; i < input.Length; i++) { int c = input[i]; if (c > 0x7f) { nonASCII = true; break; } } // Step 2: Perform the nameprep operation. if (nonASCII) { try { input = Stringprep.NamePrep(input, allowUnassigned); } catch (StringprepException e) { // TODO throw new IDNAException(e); } } // Step 3: - Verify the absence of non-LDH ASCII code points // (char) 0..0x2c, 0x2e..0x2f, 0x3a..0x40, 0x5b..0x60, // (char) 0x7b..0x7f // - Verify the absence of leading and trailing // hyphen-minus if (useSTD3ASCIIRules) { for (int i = 0; i < input.Length; i++) { int c = input[i]; if ((c <= 0x2c) || (c >= 0x2e && c <= 0x2f) || (c >= 0x3a && c <= 0x40) || (c >= 0x5b && c <= 0x60) || (c >= 0x7b && c <= 0x7f)) { throw new IDNAException(IDNAException.CONTAINS_NON_LDH); } } if (input.StartsWith("-") || input.EndsWith("-")) { throw new IDNAException(IDNAException.CONTAINS_HYPHEN); } } // Step 4: If all code points are inside 0..0x7f, skip to step 8 nonASCII = false; for (int i = 0; i < input.Length; i++) { int c = input[i]; if (c > 0x7f) { nonASCII = true; break; } } string output = input; if (nonASCII) { // Step 5: Verify that the sequence does not begin with the ACE prefix. if (input.StartsWith(ACE_PREFIX)) { throw new IDNAException(IDNAException.CONTAINS_ACE_PREFIX); } // Step 6: Punycode try { output = Punycode.Encode(input); } catch (PunycodeException e) { // TODO throw new IDNAException(e); } // Step 7: Prepend the ACE prefix. output = ACE_PREFIX + output; } // Step 8: Check that the length is inside 1..63. if (output.Length < 1 || output.Length > 63) { throw new IDNAException(IDNAException.TOO_LONG); } return output; } /// /// Converts an ASCII-encoded string to Unicode. Unassigned /// characters are not allowed and STD3 hostnames are enforced. Input /// may be domain name containing dots. /// /// ASCII input string. /// Unicode string. public static string ToUnicode(string input) { input = input.ToLower(); StringBuilder o = new StringBuilder(); StringBuilder h = new StringBuilder(); for (int i = 0; i < input.Length; i++) { char c = input[i]; if (c == '.' || c == '\u3002' || c == '\uff0e' || c == '\uff61') { o.Append(ToUnicode(h.ToString(), false, true)); o.Append(c); h = new StringBuilder(); } else { h.Append(c); } } o.Append(ToUnicode(h.ToString(), false, true)); return o.ToString(); } /// /// Converts an ASCII-encoded string to Unicode. /// /// ASCII input string. /// Allow unassigned Unicode characters. /// Check that the output conforms to STD3. /// Unicode string. public static string ToUnicode(string input, bool allowUnassigned, bool useSTD3ASCIIRules) { string original = input; bool nonASCII = false; // Step 1: If all code points are inside 0..0x7f, skip to step 3. for (int i = 0; i < input.Length; i++) { int c = input[i]; if (c > 0x7f) { nonASCII = true; break; } } // Step 2: Perform the Nameprep operation. if (nonASCII) { try { input = Stringprep.NamePrep(input, allowUnassigned); } catch (StringprepException e) { // ToUnicode never fails! return original; } } // Step 3: Verify the sequence starts with the ACE prefix. if (!input.StartsWith(ACE_PREFIX)) { // ToUnicode never fails! return original; } string stored = input; // Step 4: Remove the ACE prefix. input = input.Substring(ACE_PREFIX.Length); // Step 5: Decode using punycode string output; try { output = Punycode.Decode(input); } catch (PunycodeException e) { // ToUnicode never fails! return original; } // Step 6: Apply toASCII string ascii; try { ascii = ToASCII(output, allowUnassigned, useSTD3ASCIIRules); } catch (IDNAException e) { // ToUnicode never fails! return original; } // Step 7: Compare case-insensitively. if (!ascii.ToUpper().Equals(stored.ToUpper())) { // ToUnicode never fails! return original; } // Step 8: Return the result. return output; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/CombiningClass.cs0000644000175000017500000006723512204443225023171 0ustar00meebeymeebey00000000000000// Do not edit !!! // this file is generated automatically namespace agsXMPP.Idn { public class CombiningClass { public static readonly int[,] c = new int[,] { { /* Page 3 */ 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 230, 232, 220, 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 4 */ 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, 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, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 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, 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, }, { /* Page 5 */ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, 230, 220, 0, 18, 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, }, { /* Page 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 32, 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, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, 230, 230, 230, 230, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 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, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 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, 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 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, 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, 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, 230, 230, 230, 230, 230, 230, 230, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 9 */ 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 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, 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, }, { /* Page 10 */ 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, }, { /* Page 11 */ 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, 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, 0, 9, 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, }, { /* Page 12 */ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 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, 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, }, { /* Page 13 */ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, 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, 9, 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, }, { /* Page 14 */ 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, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 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, 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, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 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, }, { /* Page 15 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 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, 220, 0, 220, 0, 216, 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, 129, 130, 0, 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, 230, 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, 220, 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, }, { /* Page 16 */ 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, 7, 0, 9, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 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, 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, }, { /* Page 19 */ 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, 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, 230, 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, 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, 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, }, { /* Page 23 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, 9, 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, 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, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 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, }, { /* Page 24 */ 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, 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, 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, 228, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 25 */ 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, 222, 230, 220, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 26 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 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, 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, 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, 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, }, { /* Page 27 */ 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, 230, 220, 230, 230, 230, 230, 230, 230, 230, 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, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 28 */ 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, 7, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 29 */ 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, 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, 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, 0, 0, 0, 230, 230, 220, 230, 230, 230, 230, 230, 230, 230, 220, 230, 230, 234, 214, 220, 202, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, }, { /* Page 32 */ 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, 230, 1, 1, 220, 220, 220, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* Page 45 */ 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, 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, 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, 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, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, }, { /* Page 48 */ 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, 218, 228, 232, 222, 224, 224, 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, 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, 8, 8, 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, 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, }, { /* Page 166 */ 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, 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, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 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, 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, 0, 0, 0, 0, }, { /* Page 168 */ 0, 0, 0, 0, 0, 0, 9, 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, 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, 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, 9, 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, }, { /* Page 169 */ 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, 220, 220, 220, 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, 9, 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, 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, 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, }, { /* Page 251 */ 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, 26, 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, 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, 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, 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, }, { /* Page 254 */ 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, 230, 230, 230, 230, 230, 230, 230, 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, 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, 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, 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, }, }; public static readonly int[] i = new int[] { -1, -1, -1, 0, 1, 2, 3, 4, -1, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 13, -1, -1, -1, 14, 15, 16, 17, 18, 19, 20, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, 25, 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, -1, 28, -1, }; } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/IDNAException.cs0000644000175000017500000000311312204443225022651 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; namespace agsXMPP.Idn { public class IDNAException : System.Exception { public static string CONTAINS_NON_LDH = "Contains non-LDH characters."; public static string CONTAINS_HYPHEN = "Leading or trailing hyphen not allowed."; public static string CONTAINS_ACE_PREFIX = "ACE prefix (xn--) not allowed."; public static string TOO_LONG = "String too long."; public IDNAException(string m) : base(m) { } // TODO public IDNAException(StringprepException e) :base( "", e) { } public IDNAException(PunycodeException e) : base( "", e) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/PunycodeException.cs0000644000175000017500000000256412204443225023735 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; namespace agsXMPP.Idn { public class PunycodeException : Exception { public static string OVERFLOW = "Overflow."; public static string BAD_INPUT = "Bad input."; /// /// Creates a new PunycodeException. /// /// message public PunycodeException(string message) : base(message) { } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/NFKC.cs0000644000175000017500000002250212204443225021003 0ustar00meebeymeebey00000000000000/// Copyright (C) 2004 Free Software Foundation, Inc. /// * /// Author: Alexander Gnauck AG-Software, mailto:gnauck@ag-software.de /// * /// This file is part of GNU Libidn. /// * /// This library is free software; you can redistribute it and/or /// modify it under the terms of the GNU Lesser General Public License /// as published by the Free Software Foundation; either version 2.1 of /// the License, or (at your option) any later version. /// * /// This library is distributed in the hope that it will be useful, but /// WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /// Lesser General Public License for more details. /// * /// You should have received a copy of the GNU Lesser General Public /// License along with this library; if not, write to the Free Software /// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 /// USA /// using System; using System.Text; namespace agsXMPP.Idn { public class NFKC { /// /// Applies NFKC normalization to a string. /// /// The string to normalize. /// An NFKC normalized string. public static string NormalizeNFKC(string sbIn) { StringBuilder sbOut = new StringBuilder(); for (int i = 0; i < sbIn.Length; i++) { char code = sbIn[i]; // In Unicode 3.0, Hangul was defined as the block from U+AC00 // to U+D7A3, however, since Unicode 3.2 the block extends until // U+D7AF. The decomposeHangul function only decomposes until // U+D7A3. Should this be changed? if (code >= 0xAC00 && code <= 0xD7AF) { sbOut.Append(decomposeHangul(code)); } else { int index = decomposeIndex(code); if (index == - 1) { sbOut.Append(code); } else { sbOut.Append(DecompositionMappings.m[index]); } } } // Bring the stringbuffer into canonical order. canonicalOrdering(sbOut); // Do the canonical composition. int last_cc = 0; int last_start = 0; for (int i = 0; i < sbOut.Length; i++) { int cc = combiningClass(sbOut[i]); if (i > 0 && (last_cc == 0 || last_cc != cc)) { // Try to combine characters char a = sbOut[last_start]; char b = sbOut[i]; int c = compose(a, b); if (c != - 1) { sbOut[last_start] = (char) c; //sbOut.deleteCharAt(i); sbOut.Remove(i, 1); i--; if (i == last_start) { last_cc = 0; } else { last_cc = combiningClass(sbOut[i - 1]); } continue; } } if (cc == 0) { last_start = i; } last_cc = cc; } return sbOut.ToString(); } /// /// Returns the index inside the decomposition table, implemented /// using a binary search. /// /// Character to look up. /// Index if found, -1 otherwise. internal static int decomposeIndex(char c) { int start = 0; int end = DecompositionKeys.k.Length / 2; while (true) { int half = (start + end) / 2; int code = DecompositionKeys.k[half * 2]; if (c == code) { return DecompositionKeys.k[half * 2 + 1]; } if (half == start) { // Character not found return - 1; } else if (c > code) { start = half; } else { end = half; } } } /// /// Returns the combining class of a given character. /// /// The character. /// The combining class. internal static int combiningClass(char c) { int h = c >> 8; int l = c & 0xff; int i = CombiningClass.i[h]; if (i > - 1) { return CombiningClass.c[i, l]; } else { return 0; } } /// /// Rearranges characters in a stringbuffer in order to respect the /// canonical ordering properties. /// /// StringBuffer to rearrange. internal static void canonicalOrdering(StringBuilder sbIn) { bool isOrdered = false; while (!isOrdered) { isOrdered = true; // 24.10.2005 int lastCC = 0; if (sbIn.Length > 0) lastCC = combiningClass(sbIn[0]); for (int i = 0; i < sbIn.Length - 1; i++) { int nextCC = combiningClass(sbIn[i + 1]); if (nextCC != 0 && lastCC > nextCC) { for (int j = i + 1; j > 0; j--) { if (combiningClass(sbIn[j - 1]) <= nextCC) { break; } char t = sbIn[j]; sbIn[j] = sbIn[j - 1]; sbIn[j - 1] = t; isOrdered = false; } nextCC = lastCC; } lastCC = nextCC; } } } /// /// Returns the index inside the composition table. /// /// Character to look up. /// Index if found, -1 otherwise. internal static int composeIndex(char a) { if (a >> 8 >= Composition.composePage.Length) { return - 1; } int ap = Composition.composePage[a >> 8]; if (ap == - 1) { return - 1; } return Composition.composeData[ap, a & 0xff]; } /// /// Tries to compose two characters canonically. /// /// First character. /// Second character. /// The composed character or -1 if no composition could be found. internal static int compose(char a, char b) { int h = composeHangul(a, b); if (h != - 1) { return h; } int ai = composeIndex(a); if (ai >= Composition.singleFirstStart && ai < Composition.singleSecondStart) { if (b == Composition.singleFirst[ai - Composition.singleFirstStart, 0]) { return Composition.singleFirst[ai - Composition.singleFirstStart, 1]; } else { return - 1; } } int bi = composeIndex(b); if (bi >= Composition.singleSecondStart) { if (a == Composition.singleSecond[bi - Composition.singleSecondStart,0]) { return Composition.singleSecond[bi - Composition.singleSecondStart,1]; } else { return - 1; } } if (ai >= 0 && ai < Composition.multiSecondStart && bi >= Composition.multiSecondStart && bi < Composition.singleFirstStart) { char[] f = Composition.multiFirst[ai]; if (bi - Composition.multiSecondStart < f.Length) { char r = f[bi - Composition.multiSecondStart]; if (r == 0) { return - 1; } else { return r; } } } return - 1; } /// /// Entire hangul code copied from: /// http://www.unicode.org/unicode/reports/tr15/ /// Several hangul specific constants /// internal const int SBase = 0xAC00; internal const int LBase = 0x1100; internal const int VBase = 0x1161; internal const int TBase = 0x11A7; internal const int LCount = 19; internal const int VCount = 21; internal const int TCount = 28; internal static readonly int NCount = VCount * TCount; internal static readonly int SCount = LCount * NCount; /// /// Decomposes a hangul character. /// /// A character to decompose. /// A string containing the hangul decomposition of the input /// character. If no hangul decomposition can be found, a string /// containing the character itself is returned. internal static string decomposeHangul(char s) { int SIndex = s - SBase; if (SIndex < 0 || SIndex >= SCount) { return s.ToString(); } StringBuilder result = new StringBuilder(); int L = LBase + SIndex / NCount; int V = VBase + (SIndex % NCount) / TCount; int T = TBase + SIndex % TCount; result.Append((char) L); result.Append((char) V); if (T != TBase) result.Append((char) T); return result.ToString(); } /// /// Composes two hangul characters. /// /// First character. /// Second character. /// Returns the composed character or -1 if the two characters cannot be composed. internal static int composeHangul(char a, char b) { // 1. check to see if two current characters are L and V int LIndex = a - LBase; if (0 <= LIndex && LIndex < LCount) { int VIndex = b - VBase; if (0 <= VIndex && VIndex < VCount) { // make syllable of form LV return SBase + (LIndex * VCount + VIndex) * TCount; } } // 2. check to see if two current characters are LV and T int SIndex = a - SBase; if (0 <= SIndex && SIndex < SCount && (SIndex % TCount) == 0) { int TIndex = b - TBase; if (0 <= TIndex && TIndex <= TCount) { // make syllable of form LVT return a + TIndex; } } return - 1; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/DecompositionKeys.cs0000644000175000017500000023360112204443225023736 0ustar00meebeymeebey00000000000000// Do not edit !!! // this file is generated automatically namespace agsXMPP.Idn { public class DecompositionKeys { public static readonly int[] k = new int[] { '\u00A0', 0, '\u00A8', 1, '\u00AA', 2, '\u00AF', 3, '\u00B2', 4, '\u00B3', 5, '\u00B4', 6, '\u00B5', 7, '\u00B8', 8, '\u00B9', 9, '\u00BA', 10, '\u00BC', 11, '\u00BD', 12, '\u00BE', 13, '\u00C0', 14, '\u00C1', 15, '\u00C2', 16, '\u00C3', 17, '\u00C4', 18, '\u00C5', 19, '\u00C7', 20, '\u00C8', 21, '\u00C9', 22, '\u00CA', 23, '\u00CB', 24, '\u00CC', 25, '\u00CD', 26, '\u00CE', 27, '\u00CF', 28, '\u00D1', 29, '\u00D2', 30, '\u00D3', 31, '\u00D4', 32, '\u00D5', 33, '\u00D6', 34, '\u00D9', 35, '\u00DA', 36, '\u00DB', 37, '\u00DC', 38, '\u00DD', 39, '\u00E0', 40, '\u00E1', 41, '\u00E2', 42, '\u00E3', 43, '\u00E4', 44, '\u00E5', 45, '\u00E7', 46, '\u00E8', 47, '\u00E9', 48, '\u00EA', 49, '\u00EB', 50, '\u00EC', 51, '\u00ED', 52, '\u00EE', 53, '\u00EF', 54, '\u00F1', 55, '\u00F2', 56, '\u00F3', 57, '\u00F4', 58, '\u00F5', 59, '\u00F6', 60, '\u00F9', 61, '\u00FA', 62, '\u00FB', 63, '\u00FC', 64, '\u00FD', 65, '\u00FF', 66, '\u0100', 67, '\u0101', 68, '\u0102', 69, '\u0103', 70, '\u0104', 71, '\u0105', 72, '\u0106', 73, '\u0107', 74, '\u0108', 75, '\u0109', 76, '\u010A', 77, '\u010B', 78, '\u010C', 79, '\u010D', 80, '\u010E', 81, '\u010F', 82, '\u0112', 83, '\u0113', 84, '\u0114', 85, '\u0115', 86, '\u0116', 87, '\u0117', 88, '\u0118', 89, '\u0119', 90, '\u011A', 91, '\u011B', 92, '\u011C', 93, '\u011D', 94, '\u011E', 95, '\u011F', 96, '\u0120', 97, '\u0121', 98, '\u0122', 99, '\u0123', 100, '\u0124', 101, '\u0125', 102, '\u0128', 103, '\u0129', 104, '\u012A', 105, '\u012B', 106, '\u012C', 107, '\u012D', 108, '\u012E', 109, '\u012F', 110, '\u0130', 111, '\u0132', 112, '\u0133', 113, '\u0134', 114, '\u0135', 115, '\u0136', 116, '\u0137', 117, '\u0139', 118, '\u013A', 119, '\u013B', 120, '\u013C', 121, '\u013D', 122, '\u013E', 123, '\u013F', 124, '\u0140', 125, '\u0143', 126, '\u0144', 127, '\u0145', 128, '\u0146', 129, '\u0147', 130, '\u0148', 131, '\u0149', 132, '\u014C', 133, '\u014D', 134, '\u014E', 135, '\u014F', 136, '\u0150', 137, '\u0151', 138, '\u0154', 139, '\u0155', 140, '\u0156', 141, '\u0157', 142, '\u0158', 143, '\u0159', 144, '\u015A', 145, '\u015B', 146, '\u015C', 147, '\u015D', 148, '\u015E', 149, '\u015F', 150, '\u0160', 151, '\u0161', 152, '\u0162', 153, '\u0163', 154, '\u0164', 155, '\u0165', 156, '\u0168', 157, '\u0169', 158, '\u016A', 159, '\u016B', 160, '\u016C', 161, '\u016D', 162, '\u016E', 163, '\u016F', 164, '\u0170', 165, '\u0171', 166, '\u0172', 167, '\u0173', 168, '\u0174', 169, '\u0175', 170, '\u0176', 171, '\u0177', 172, '\u0178', 173, '\u0179', 174, '\u017A', 175, '\u017B', 176, '\u017C', 177, '\u017D', 178, '\u017E', 179, '\u017F', 180, '\u01A0', 181, '\u01A1', 182, '\u01AF', 183, '\u01B0', 184, '\u01C4', 185, '\u01C5', 186, '\u01C6', 187, '\u01C7', 188, '\u01C8', 189, '\u01C9', 190, '\u01CA', 191, '\u01CB', 192, '\u01CC', 193, '\u01CD', 194, '\u01CE', 195, '\u01CF', 196, '\u01D0', 197, '\u01D1', 198, '\u01D2', 199, '\u01D3', 200, '\u01D4', 201, '\u01D5', 202, '\u01D6', 203, '\u01D7', 204, '\u01D8', 205, '\u01D9', 206, '\u01DA', 207, '\u01DB', 208, '\u01DC', 209, '\u01DE', 210, '\u01DF', 211, '\u01E0', 212, '\u01E1', 213, '\u01E2', 214, '\u01E3', 215, '\u01E6', 216, '\u01E7', 217, '\u01E8', 218, '\u01E9', 219, '\u01EA', 220, '\u01EB', 221, '\u01EC', 222, '\u01ED', 223, '\u01EE', 224, '\u01EF', 225, '\u01F0', 226, '\u01F1', 227, '\u01F2', 228, '\u01F3', 229, '\u01F4', 230, '\u01F5', 231, '\u01F8', 232, '\u01F9', 233, '\u01FA', 234, '\u01FB', 235, '\u01FC', 236, '\u01FD', 237, '\u01FE', 238, '\u01FF', 239, '\u0200', 240, '\u0201', 241, '\u0202', 242, '\u0203', 243, '\u0204', 244, '\u0205', 245, '\u0206', 246, '\u0207', 247, '\u0208', 248, '\u0209', 249, '\u020A', 250, '\u020B', 251, '\u020C', 252, '\u020D', 253, '\u020E', 254, '\u020F', 255, '\u0210', 256, '\u0211', 257, '\u0212', 258, '\u0213', 259, '\u0214', 260, '\u0215', 261, '\u0216', 262, '\u0217', 263, '\u0218', 264, '\u0219', 265, '\u021A', 266, '\u021B', 267, '\u021E', 268, '\u021F', 269, '\u0226', 270, '\u0227', 271, '\u0228', 272, '\u0229', 273, '\u022A', 274, '\u022B', 275, '\u022C', 276, '\u022D', 277, '\u022E', 278, '\u022F', 279, '\u0230', 280, '\u0231', 281, '\u0232', 282, '\u0233', 283, '\u02B0', 284, '\u02B1', 285, '\u02B2', 286, '\u02B3', 287, '\u02B4', 288, '\u02B5', 289, '\u02B6', 290, '\u02B7', 291, '\u02B8', 292, '\u02D8', 293, '\u02D9', 294, '\u02DA', 295, '\u02DB', 296, '\u02DC', 297, '\u02DD', 298, '\u02E0', 299, '\u02E1', 300, '\u02E2', 180, '\u02E3', 301, '\u02E4', 302, '\u0340', 303, '\u0341', 304, '\u0343', 305, '\u0344', 306, '\u0374', 307, '\u037A', 308, '\u037E', 309, '\u0384', 6, '\u0385', 310, '\u0386', 311, '\u0387', 312, '\u0388', 313, '\u0389', 314, '\u038A', 315, '\u038C', 316, '\u038E', 317, '\u038F', 318, '\u0390', 319, '\u03AA', 320, '\u03AB', 321, '\u03AC', 322, '\u03AD', 323, '\u03AE', 324, '\u03AF', 325, '\u03B0', 326, '\u03CA', 327, '\u03CB', 328, '\u03CC', 329, '\u03CD', 330, '\u03CE', 331, '\u03D0', 332, '\u03D1', 333, '\u03D2', 334, '\u03D3', 317, '\u03D4', 321, '\u03D5', 335, '\u03D6', 336, '\u03F0', 337, '\u03F1', 338, '\u03F2', 339, '\u03F4', 340, '\u03F5', 341, '\u03F9', 342, '\u0400', 343, '\u0401', 344, '\u0403', 345, '\u0407', 346, '\u040C', 347, '\u040D', 348, '\u040E', 349, '\u0419', 350, '\u0439', 351, '\u0450', 352, '\u0451', 353, '\u0453', 354, '\u0457', 355, '\u045C', 356, '\u045D', 357, '\u045E', 358, '\u0476', 359, '\u0477', 360, '\u04C1', 361, '\u04C2', 362, '\u04D0', 363, '\u04D1', 364, '\u04D2', 365, '\u04D3', 366, '\u04D6', 367, '\u04D7', 368, '\u04DA', 369, '\u04DB', 370, '\u04DC', 371, '\u04DD', 372, '\u04DE', 373, '\u04DF', 374, '\u04E2', 375, '\u04E3', 376, '\u04E4', 377, '\u04E5', 378, '\u04E6', 379, '\u04E7', 380, '\u04EA', 381, '\u04EB', 382, '\u04EC', 383, '\u04ED', 384, '\u04EE', 385, '\u04EF', 386, '\u04F0', 387, '\u04F1', 388, '\u04F2', 389, '\u04F3', 390, '\u04F4', 391, '\u04F5', 392, '\u04F8', 393, '\u04F9', 394, '\u0587', 395, '\u0622', 396, '\u0623', 397, '\u0624', 398, '\u0625', 399, '\u0626', 400, '\u0675', 401, '\u0676', 402, '\u0677', 403, '\u0678', 404, '\u06C0', 405, '\u06C2', 406, '\u06D3', 407, '\u0929', 408, '\u0931', 409, '\u0934', 410, '\u0958', 411, '\u0959', 412, '\u095A', 413, '\u095B', 414, '\u095C', 415, '\u095D', 416, '\u095E', 417, '\u095F', 418, '\u09CB', 419, '\u09CC', 420, '\u09DC', 421, '\u09DD', 422, '\u09DF', 423, '\u0A33', 424, '\u0A36', 425, '\u0A59', 426, '\u0A5A', 427, '\u0A5B', 428, '\u0A5E', 429, '\u0B48', 430, '\u0B4B', 431, '\u0B4C', 432, '\u0B5C', 433, '\u0B5D', 434, '\u0B94', 435, '\u0BCA', 436, '\u0BCB', 437, '\u0BCC', 438, '\u0C48', 439, '\u0CC0', 440, '\u0CC7', 441, '\u0CC8', 442, '\u0CCA', 443, '\u0CCB', 444, '\u0D4A', 445, '\u0D4B', 446, '\u0D4C', 447, '\u0DDA', 448, '\u0DDC', 449, '\u0DDD', 450, '\u0DDE', 451, '\u0E33', 452, '\u0EB3', 453, '\u0EDC', 454, '\u0EDD', 455, '\u0F0C', 456, '\u0F43', 457, '\u0F4D', 458, '\u0F52', 459, '\u0F57', 460, '\u0F5C', 461, '\u0F69', 462, '\u0F73', 463, '\u0F75', 464, '\u0F76', 465, '\u0F77', 466, '\u0F78', 467, '\u0F79', 468, '\u0F81', 469, '\u0F93', 470, '\u0F9D', 471, '\u0FA2', 472, '\u0FA7', 473, '\u0FAC', 474, '\u0FB9', 475, '\u1026', 476, '\u10FC', 477, '\u1B06', 478, '\u1B08', 479, '\u1B0A', 480, '\u1B0C', 481, '\u1B0E', 482, '\u1B12', 483, '\u1B3B', 484, '\u1B3D', 485, '\u1B40', 486, '\u1B41', 487, '\u1B43', 488, '\u1D2C', 489, '\u1D2D', 490, '\u1D2E', 491, '\u1D30', 492, '\u1D31', 493, '\u1D32', 494, '\u1D33', 495, '\u1D34', 496, '\u1D35', 497, '\u1D36', 498, '\u1D37', 499, '\u1D38', 500, '\u1D39', 501, '\u1D3A', 502, '\u1D3C', 503, '\u1D3D', 504, '\u1D3E', 505, '\u1D3F', 506, '\u1D40', 507, '\u1D41', 508, '\u1D42', 509, '\u1D43', 2, '\u1D44', 510, '\u1D45', 511, '\u1D46', 512, '\u1D47', 513, '\u1D48', 514, '\u1D49', 515, '\u1D4A', 516, '\u1D4B', 517, '\u1D4C', 518, '\u1D4D', 519, '\u1D4F', 520, '\u1D50', 521, '\u1D51', 522, '\u1D52', 10, '\u1D53', 523, '\u1D54', 524, '\u1D55', 525, '\u1D56', 526, '\u1D57', 527, '\u1D58', 528, '\u1D59', 529, '\u1D5A', 530, '\u1D5B', 531, '\u1D5C', 532, '\u1D5D', 332, '\u1D5E', 533, '\u1D5F', 534, '\u1D60', 335, '\u1D61', 535, '\u1D62', 536, '\u1D63', 287, '\u1D64', 528, '\u1D65', 531, '\u1D66', 332, '\u1D67', 533, '\u1D68', 338, '\u1D69', 335, '\u1D6A', 535, '\u1D78', 537, '\u1D9B', 538, '\u1D9C', 539, '\u1D9D', 540, '\u1D9E', 541, '\u1D9F', 518, '\u1DA0', 542, '\u1DA1', 543, '\u1DA2', 544, '\u1DA3', 545, '\u1DA4', 546, '\u1DA5', 547, '\u1DA6', 548, '\u1DA7', 549, '\u1DA8', 550, '\u1DA9', 551, '\u1DAA', 552, '\u1DAB', 553, '\u1DAC', 554, '\u1DAD', 555, '\u1DAE', 556, '\u1DAF', 557, '\u1DB0', 558, '\u1DB1', 559, '\u1DB2', 560, '\u1DB3', 561, '\u1DB4', 562, '\u1DB5', 563, '\u1DB6', 564, '\u1DB7', 565, '\u1DB8', 566, '\u1DB9', 567, '\u1DBA', 568, '\u1DBB', 569, '\u1DBC', 570, '\u1DBD', 571, '\u1DBE', 572, '\u1DBF', 333, '\u1E00', 573, '\u1E01', 574, '\u1E02', 575, '\u1E03', 576, '\u1E04', 577, '\u1E05', 578, '\u1E06', 579, '\u1E07', 580, '\u1E08', 581, '\u1E09', 582, '\u1E0A', 583, '\u1E0B', 584, '\u1E0C', 585, '\u1E0D', 586, '\u1E0E', 587, '\u1E0F', 588, '\u1E10', 589, '\u1E11', 590, '\u1E12', 591, '\u1E13', 592, '\u1E14', 593, '\u1E15', 594, '\u1E16', 595, '\u1E17', 596, '\u1E18', 597, '\u1E19', 598, '\u1E1A', 599, '\u1E1B', 600, '\u1E1C', 601, '\u1E1D', 602, '\u1E1E', 603, '\u1E1F', 604, '\u1E20', 605, '\u1E21', 606, '\u1E22', 607, '\u1E23', 608, '\u1E24', 609, '\u1E25', 610, '\u1E26', 611, '\u1E27', 612, '\u1E28', 613, '\u1E29', 614, '\u1E2A', 615, '\u1E2B', 616, '\u1E2C', 617, '\u1E2D', 618, '\u1E2E', 619, '\u1E2F', 620, '\u1E30', 621, '\u1E31', 622, '\u1E32', 623, '\u1E33', 624, '\u1E34', 625, '\u1E35', 626, '\u1E36', 627, '\u1E37', 628, '\u1E38', 629, '\u1E39', 630, '\u1E3A', 631, '\u1E3B', 632, '\u1E3C', 633, '\u1E3D', 634, '\u1E3E', 635, '\u1E3F', 636, '\u1E40', 637, '\u1E41', 638, '\u1E42', 639, '\u1E43', 640, '\u1E44', 641, '\u1E45', 642, '\u1E46', 643, '\u1E47', 644, '\u1E48', 645, '\u1E49', 646, '\u1E4A', 647, '\u1E4B', 648, '\u1E4C', 649, '\u1E4D', 650, '\u1E4E', 651, '\u1E4F', 652, '\u1E50', 653, '\u1E51', 654, '\u1E52', 655, '\u1E53', 656, '\u1E54', 657, '\u1E55', 658, '\u1E56', 659, '\u1E57', 660, '\u1E58', 661, '\u1E59', 662, '\u1E5A', 663, '\u1E5B', 664, '\u1E5C', 665, '\u1E5D', 666, '\u1E5E', 667, '\u1E5F', 668, '\u1E60', 669, '\u1E61', 670, '\u1E62', 671, '\u1E63', 672, '\u1E64', 673, '\u1E65', 674, '\u1E66', 675, '\u1E67', 676, '\u1E68', 677, '\u1E69', 678, '\u1E6A', 679, '\u1E6B', 680, '\u1E6C', 681, '\u1E6D', 682, '\u1E6E', 683, '\u1E6F', 684, '\u1E70', 685, '\u1E71', 686, '\u1E72', 687, '\u1E73', 688, '\u1E74', 689, '\u1E75', 690, '\u1E76', 691, '\u1E77', 692, '\u1E78', 693, '\u1E79', 694, '\u1E7A', 695, '\u1E7B', 696, '\u1E7C', 697, '\u1E7D', 698, '\u1E7E', 699, '\u1E7F', 700, '\u1E80', 701, '\u1E81', 702, '\u1E82', 703, '\u1E83', 704, '\u1E84', 705, '\u1E85', 706, '\u1E86', 707, '\u1E87', 708, '\u1E88', 709, '\u1E89', 710, '\u1E8A', 711, '\u1E8B', 712, '\u1E8C', 713, '\u1E8D', 714, '\u1E8E', 715, '\u1E8F', 716, '\u1E90', 717, '\u1E91', 718, '\u1E92', 719, '\u1E93', 720, '\u1E94', 721, '\u1E95', 722, '\u1E96', 723, '\u1E97', 724, '\u1E98', 725, '\u1E99', 726, '\u1E9A', 727, '\u1E9B', 670, '\u1EA0', 728, '\u1EA1', 729, '\u1EA2', 730, '\u1EA3', 731, '\u1EA4', 732, '\u1EA5', 733, '\u1EA6', 734, '\u1EA7', 735, '\u1EA8', 736, '\u1EA9', 737, '\u1EAA', 738, '\u1EAB', 739, '\u1EAC', 740, '\u1EAD', 741, '\u1EAE', 742, '\u1EAF', 743, '\u1EB0', 744, '\u1EB1', 745, '\u1EB2', 746, '\u1EB3', 747, '\u1EB4', 748, '\u1EB5', 749, '\u1EB6', 750, '\u1EB7', 751, '\u1EB8', 752, '\u1EB9', 753, '\u1EBA', 754, '\u1EBB', 755, '\u1EBC', 756, '\u1EBD', 757, '\u1EBE', 758, '\u1EBF', 759, '\u1EC0', 760, '\u1EC1', 761, '\u1EC2', 762, '\u1EC3', 763, '\u1EC4', 764, '\u1EC5', 765, '\u1EC6', 766, '\u1EC7', 767, '\u1EC8', 768, '\u1EC9', 769, '\u1ECA', 770, '\u1ECB', 771, '\u1ECC', 772, '\u1ECD', 773, '\u1ECE', 774, '\u1ECF', 775, '\u1ED0', 776, '\u1ED1', 777, '\u1ED2', 778, '\u1ED3', 779, '\u1ED4', 780, '\u1ED5', 781, '\u1ED6', 782, '\u1ED7', 783, '\u1ED8', 784, '\u1ED9', 785, '\u1EDA', 786, '\u1EDB', 787, '\u1EDC', 788, '\u1EDD', 789, '\u1EDE', 790, '\u1EDF', 791, '\u1EE0', 792, '\u1EE1', 793, '\u1EE2', 794, '\u1EE3', 795, '\u1EE4', 796, '\u1EE5', 797, '\u1EE6', 798, '\u1EE7', 799, '\u1EE8', 800, '\u1EE9', 801, '\u1EEA', 802, '\u1EEB', 803, '\u1EEC', 804, '\u1EED', 805, '\u1EEE', 806, '\u1EEF', 807, '\u1EF0', 808, '\u1EF1', 809, '\u1EF2', 810, '\u1EF3', 811, '\u1EF4', 812, '\u1EF5', 813, '\u1EF6', 814, '\u1EF7', 815, '\u1EF8', 816, '\u1EF9', 817, '\u1F00', 818, '\u1F01', 819, '\u1F02', 820, '\u1F03', 821, '\u1F04', 822, '\u1F05', 823, '\u1F06', 824, '\u1F07', 825, '\u1F08', 826, '\u1F09', 827, '\u1F0A', 828, '\u1F0B', 829, '\u1F0C', 830, '\u1F0D', 831, '\u1F0E', 832, '\u1F0F', 833, '\u1F10', 834, '\u1F11', 835, '\u1F12', 836, '\u1F13', 837, '\u1F14', 838, '\u1F15', 839, '\u1F18', 840, '\u1F19', 841, '\u1F1A', 842, '\u1F1B', 843, '\u1F1C', 844, '\u1F1D', 845, '\u1F20', 846, '\u1F21', 847, '\u1F22', 848, '\u1F23', 849, '\u1F24', 850, '\u1F25', 851, '\u1F26', 852, '\u1F27', 853, '\u1F28', 854, '\u1F29', 855, '\u1F2A', 856, '\u1F2B', 857, '\u1F2C', 858, '\u1F2D', 859, '\u1F2E', 860, '\u1F2F', 861, '\u1F30', 862, '\u1F31', 863, '\u1F32', 864, '\u1F33', 865, '\u1F34', 866, '\u1F35', 867, '\u1F36', 868, '\u1F37', 869, '\u1F38', 870, '\u1F39', 871, '\u1F3A', 872, '\u1F3B', 873, '\u1F3C', 874, '\u1F3D', 875, '\u1F3E', 876, '\u1F3F', 877, '\u1F40', 878, '\u1F41', 879, '\u1F42', 880, '\u1F43', 881, '\u1F44', 882, '\u1F45', 883, '\u1F48', 884, '\u1F49', 885, '\u1F4A', 886, '\u1F4B', 887, '\u1F4C', 888, '\u1F4D', 889, '\u1F50', 890, '\u1F51', 891, '\u1F52', 892, '\u1F53', 893, '\u1F54', 894, '\u1F55', 895, '\u1F56', 896, '\u1F57', 897, '\u1F59', 898, '\u1F5B', 899, '\u1F5D', 900, '\u1F5F', 901, '\u1F60', 902, '\u1F61', 903, '\u1F62', 904, '\u1F63', 905, '\u1F64', 906, '\u1F65', 907, '\u1F66', 908, '\u1F67', 909, '\u1F68', 910, '\u1F69', 911, '\u1F6A', 912, '\u1F6B', 913, '\u1F6C', 914, '\u1F6D', 915, '\u1F6E', 916, '\u1F6F', 917, '\u1F70', 918, '\u1F71', 322, '\u1F72', 919, '\u1F73', 323, '\u1F74', 920, '\u1F75', 324, '\u1F76', 921, '\u1F77', 325, '\u1F78', 922, '\u1F79', 329, '\u1F7A', 923, '\u1F7B', 330, '\u1F7C', 924, '\u1F7D', 331, '\u1F80', 925, '\u1F81', 926, '\u1F82', 927, '\u1F83', 928, '\u1F84', 929, '\u1F85', 930, '\u1F86', 931, '\u1F87', 932, '\u1F88', 933, '\u1F89', 934, '\u1F8A', 935, '\u1F8B', 936, '\u1F8C', 937, '\u1F8D', 938, '\u1F8E', 939, '\u1F8F', 940, '\u1F90', 941, '\u1F91', 942, '\u1F92', 943, '\u1F93', 944, '\u1F94', 945, '\u1F95', 946, '\u1F96', 947, '\u1F97', 948, '\u1F98', 949, '\u1F99', 950, '\u1F9A', 951, '\u1F9B', 952, '\u1F9C', 953, '\u1F9D', 954, '\u1F9E', 955, '\u1F9F', 956, '\u1FA0', 957, '\u1FA1', 958, '\u1FA2', 959, '\u1FA3', 960, '\u1FA4', 961, '\u1FA5', 962, '\u1FA6', 963, '\u1FA7', 964, '\u1FA8', 965, '\u1FA9', 966, '\u1FAA', 967, '\u1FAB', 968, '\u1FAC', 969, '\u1FAD', 970, '\u1FAE', 971, '\u1FAF', 972, '\u1FB0', 973, '\u1FB1', 974, '\u1FB2', 975, '\u1FB3', 976, '\u1FB4', 977, '\u1FB6', 978, '\u1FB7', 979, '\u1FB8', 980, '\u1FB9', 981, '\u1FBA', 982, '\u1FBB', 311, '\u1FBC', 983, '\u1FBD', 984, '\u1FBE', 985, '\u1FBF', 984, '\u1FC0', 986, '\u1FC1', 987, '\u1FC2', 988, '\u1FC3', 989, '\u1FC4', 990, '\u1FC6', 991, '\u1FC7', 992, '\u1FC8', 993, '\u1FC9', 313, '\u1FCA', 994, '\u1FCB', 314, '\u1FCC', 995, '\u1FCD', 996, '\u1FCE', 997, '\u1FCF', 998, '\u1FD0', 999, '\u1FD1', 1000, '\u1FD2', 1001, '\u1FD3', 319, '\u1FD6', 1002, '\u1FD7', 1003, '\u1FD8', 1004, '\u1FD9', 1005, '\u1FDA', 1006, '\u1FDB', 315, '\u1FDD', 1007, '\u1FDE', 1008, '\u1FDF', 1009, '\u1FE0', 1010, '\u1FE1', 1011, '\u1FE2', 1012, '\u1FE3', 326, '\u1FE4', 1013, '\u1FE5', 1014, '\u1FE6', 1015, '\u1FE7', 1016, '\u1FE8', 1017, '\u1FE9', 1018, '\u1FEA', 1019, '\u1FEB', 317, '\u1FEC', 1020, '\u1FED', 1021, '\u1FEE', 310, '\u1FEF', 1022, '\u1FF2', 1023, '\u1FF3', 1024, '\u1FF4', 1025, '\u1FF6', 1026, '\u1FF7', 1027, '\u1FF8', 1028, '\u1FF9', 316, '\u1FFA', 1029, '\u1FFB', 318, '\u1FFC', 1030, '\u1FFD', 6, '\u1FFE', 1031, '\u2000', 0, '\u2001', 0, '\u2002', 0, '\u2003', 0, '\u2004', 0, '\u2005', 0, '\u2006', 0, '\u2007', 0, '\u2008', 0, '\u2009', 0, '\u200A', 0, '\u2011', 1032, '\u2017', 1033, '\u2024', 1034, '\u2025', 1035, '\u2026', 1036, '\u202F', 0, '\u2033', 1037, '\u2034', 1038, '\u2036', 1039, '\u2037', 1040, '\u203C', 1041, '\u203E', 1042, '\u2047', 1043, '\u2048', 1044, '\u2049', 1045, '\u2057', 1046, '\u205F', 0, '\u2070', 1047, '\u2071', 536, '\u2074', 1048, '\u2075', 1049, '\u2076', 1050, '\u2077', 1051, '\u2078', 1052, '\u2079', 1053, '\u207A', 1054, '\u207B', 1055, '\u207C', 1056, '\u207D', 1057, '\u207E', 1058, '\u207F', 1059, '\u2080', 1047, '\u2081', 9, '\u2082', 4, '\u2083', 5, '\u2084', 1048, '\u2085', 1049, '\u2086', 1050, '\u2087', 1051, '\u2088', 1052, '\u2089', 1053, '\u208A', 1054, '\u208B', 1055, '\u208C', 1056, '\u208D', 1057, '\u208E', 1058, '\u2090', 2, '\u2091', 515, '\u2092', 10, '\u2093', 301, '\u2094', 516, '\u20A8', 1060, '\u2100', 1061, '\u2101', 1062, '\u2102', 1063, '\u2103', 1064, '\u2105', 1065, '\u2106', 1066, '\u2107', 1067, '\u2109', 1068, '\u210A', 519, '\u210B', 496, '\u210C', 496, '\u210D', 496, '\u210E', 284, '\u210F', 1069, '\u2110', 497, '\u2111', 497, '\u2112', 500, '\u2113', 300, '\u2115', 502, '\u2116', 1070, '\u2119', 505, '\u211A', 1071, '\u211B', 506, '\u211C', 506, '\u211D', 506, '\u2120', 1072, '\u2121', 1073, '\u2122', 1074, '\u2124', 1075, '\u2126', 1076, '\u2128', 1075, '\u212A', 499, '\u212B', 19, '\u212C', 491, '\u212D', 1063, '\u212F', 515, '\u2130', 493, '\u2131', 1077, '\u2133', 501, '\u2134', 10, '\u2135', 1078, '\u2136', 1079, '\u2137', 1080, '\u2138', 1081, '\u2139', 536, '\u213B', 1082, '\u213C', 336, '\u213D', 533, '\u213E', 1083, '\u213F', 1084, '\u2140', 1085, '\u2145', 492, '\u2146', 514, '\u2147', 515, '\u2148', 536, '\u2149', 286, '\u2153', 1086, '\u2154', 1087, '\u2155', 1088, '\u2156', 1089, '\u2157', 1090, '\u2158', 1091, '\u2159', 1092, '\u215A', 1093, '\u215B', 1094, '\u215C', 1095, '\u215D', 1096, '\u215E', 1097, '\u215F', 1098, '\u2160', 497, '\u2161', 1099, '\u2162', 1100, '\u2163', 1101, '\u2164', 1102, '\u2165', 1103, '\u2166', 1104, '\u2167', 1105, '\u2168', 1106, '\u2169', 1107, '\u216A', 1108, '\u216B', 1109, '\u216C', 500, '\u216D', 1063, '\u216E', 492, '\u216F', 501, '\u2170', 536, '\u2171', 1110, '\u2172', 1111, '\u2173', 1112, '\u2174', 531, '\u2175', 1113, '\u2176', 1114, '\u2177', 1115, '\u2178', 1116, '\u2179', 301, '\u217A', 1117, '\u217B', 1118, '\u217C', 300, '\u217D', 539, '\u217E', 514, '\u217F', 521, '\u219A', 1119, '\u219B', 1120, '\u21AE', 1121, '\u21CD', 1122, '\u21CE', 1123, '\u21CF', 1124, '\u2204', 1125, '\u2209', 1126, '\u220C', 1127, '\u2224', 1128, '\u2226', 1129, '\u222C', 1130, '\u222D', 1131, '\u222F', 1132, '\u2230', 1133, '\u2241', 1134, '\u2244', 1135, '\u2247', 1136, '\u2249', 1137, '\u2260', 1138, '\u2262', 1139, '\u226D', 1140, '\u226E', 1141, '\u226F', 1142, '\u2270', 1143, '\u2271', 1144, '\u2274', 1145, '\u2275', 1146, '\u2278', 1147, '\u2279', 1148, '\u2280', 1149, '\u2281', 1150, '\u2284', 1151, '\u2285', 1152, '\u2288', 1153, '\u2289', 1154, '\u22AC', 1155, '\u22AD', 1156, '\u22AE', 1157, '\u22AF', 1158, '\u22E0', 1159, '\u22E1', 1160, '\u22E2', 1161, '\u22E3', 1162, '\u22EA', 1163, '\u22EB', 1164, '\u22EC', 1165, '\u22ED', 1166, '\u2329', 1167, '\u232A', 1168, '\u2460', 9, '\u2461', 4, '\u2462', 5, '\u2463', 1048, '\u2464', 1049, '\u2465', 1050, '\u2466', 1051, '\u2467', 1052, '\u2468', 1053, '\u2469', 1169, '\u246A', 1170, '\u246B', 1171, '\u246C', 1172, '\u246D', 1173, '\u246E', 1174, '\u246F', 1175, '\u2470', 1176, '\u2471', 1177, '\u2472', 1178, '\u2473', 1179, '\u2474', 1180, '\u2475', 1181, '\u2476', 1182, '\u2477', 1183, '\u2478', 1184, '\u2479', 1185, '\u247A', 1186, '\u247B', 1187, '\u247C', 1188, '\u247D', 1189, '\u247E', 1190, '\u247F', 1191, '\u2480', 1192, '\u2481', 1193, '\u2482', 1194, '\u2483', 1195, '\u2484', 1196, '\u2485', 1197, '\u2486', 1198, '\u2487', 1199, '\u2488', 1200, '\u2489', 1201, '\u248A', 1202, '\u248B', 1203, '\u248C', 1204, '\u248D', 1205, '\u248E', 1206, '\u248F', 1207, '\u2490', 1208, '\u2491', 1209, '\u2492', 1210, '\u2493', 1211, '\u2494', 1212, '\u2495', 1213, '\u2496', 1214, '\u2497', 1215, '\u2498', 1216, '\u2499', 1217, '\u249A', 1218, '\u249B', 1219, '\u249C', 1220, '\u249D', 1221, '\u249E', 1222, '\u249F', 1223, '\u24A0', 1224, '\u24A1', 1225, '\u24A2', 1226, '\u24A3', 1227, '\u24A4', 1228, '\u24A5', 1229, '\u24A6', 1230, '\u24A7', 1231, '\u24A8', 1232, '\u24A9', 1233, '\u24AA', 1234, '\u24AB', 1235, '\u24AC', 1236, '\u24AD', 1237, '\u24AE', 1238, '\u24AF', 1239, '\u24B0', 1240, '\u24B1', 1241, '\u24B2', 1242, '\u24B3', 1243, '\u24B4', 1244, '\u24B5', 1245, '\u24B6', 489, '\u24B7', 491, '\u24B8', 1063, '\u24B9', 492, '\u24BA', 493, '\u24BB', 1077, '\u24BC', 495, '\u24BD', 496, '\u24BE', 497, '\u24BF', 498, '\u24C0', 499, '\u24C1', 500, '\u24C2', 501, '\u24C3', 502, '\u24C4', 503, '\u24C5', 505, '\u24C6', 1071, '\u24C7', 506, '\u24C8', 1246, '\u24C9', 507, '\u24CA', 508, '\u24CB', 1102, '\u24CC', 509, '\u24CD', 1107, '\u24CE', 1247, '\u24CF', 1075, '\u24D0', 2, '\u24D1', 513, '\u24D2', 539, '\u24D3', 514, '\u24D4', 515, '\u24D5', 542, '\u24D6', 519, '\u24D7', 284, '\u24D8', 536, '\u24D9', 286, '\u24DA', 520, '\u24DB', 300, '\u24DC', 521, '\u24DD', 1059, '\u24DE', 10, '\u24DF', 526, '\u24E0', 1248, '\u24E1', 287, '\u24E2', 180, '\u24E3', 527, '\u24E4', 528, '\u24E5', 531, '\u24E6', 291, '\u24E7', 301, '\u24E8', 292, '\u24E9', 569, '\u24EA', 1047, '\u2A0C', 1249, '\u2A74', 1250, '\u2A75', 1251, '\u2A76', 1252, '\u2ADC', 1253, '\u2C7C', 286, '\u2C7D', 1102, '\u2D6F', 1254, '\u2E9F', 1255, '\u2EF3', 1256, '\u2F00', 1257, '\u2F01', 1258, '\u2F02', 1259, '\u2F03', 1260, '\u2F04', 1261, '\u2F05', 1262, '\u2F06', 1263, '\u2F07', 1264, '\u2F08', 1265, '\u2F09', 1266, '\u2F0A', 1267, '\u2F0B', 1268, '\u2F0C', 1269, '\u2F0D', 1270, '\u2F0E', 1271, '\u2F0F', 1272, '\u2F10', 1273, '\u2F11', 1274, '\u2F12', 1275, '\u2F13', 1276, '\u2F14', 1277, '\u2F15', 1278, '\u2F16', 1279, '\u2F17', 1280, '\u2F18', 1281, '\u2F19', 1282, '\u2F1A', 1283, '\u2F1B', 1284, '\u2F1C', 1285, '\u2F1D', 1286, '\u2F1E', 1287, '\u2F1F', 1288, '\u2F20', 1289, '\u2F21', 1290, '\u2F22', 1291, '\u2F23', 1292, '\u2F24', 1293, '\u2F25', 1294, '\u2F26', 1295, '\u2F27', 1296, '\u2F28', 1297, '\u2F29', 1298, '\u2F2A', 1299, '\u2F2B', 1300, '\u2F2C', 1301, '\u2F2D', 1302, '\u2F2E', 1303, '\u2F2F', 1304, '\u2F30', 1305, '\u2F31', 1306, '\u2F32', 1307, '\u2F33', 1308, '\u2F34', 1309, '\u2F35', 1310, '\u2F36', 1311, '\u2F37', 1312, '\u2F38', 1313, '\u2F39', 1314, '\u2F3A', 1315, '\u2F3B', 1316, '\u2F3C', 1317, '\u2F3D', 1318, '\u2F3E', 1319, '\u2F3F', 1320, '\u2F40', 1321, '\u2F41', 1322, '\u2F42', 1323, '\u2F43', 1324, '\u2F44', 1325, '\u2F45', 1326, '\u2F46', 1327, '\u2F47', 1328, '\u2F48', 1329, '\u2F49', 1330, '\u2F4A', 1331, '\u2F4B', 1332, '\u2F4C', 1333, '\u2F4D', 1334, '\u2F4E', 1335, '\u2F4F', 1336, '\u2F50', 1337, '\u2F51', 1338, '\u2F52', 1339, '\u2F53', 1340, '\u2F54', 1341, '\u2F55', 1342, '\u2F56', 1343, '\u2F57', 1344, '\u2F58', 1345, '\u2F59', 1346, '\u2F5A', 1347, '\u2F5B', 1348, '\u2F5C', 1349, '\u2F5D', 1350, '\u2F5E', 1351, '\u2F5F', 1352, '\u2F60', 1353, '\u2F61', 1354, '\u2F62', 1355, '\u2F63', 1356, '\u2F64', 1357, '\u2F65', 1358, '\u2F66', 1359, '\u2F67', 1360, '\u2F68', 1361, '\u2F69', 1362, '\u2F6A', 1363, '\u2F6B', 1364, '\u2F6C', 1365, '\u2F6D', 1366, '\u2F6E', 1367, '\u2F6F', 1368, '\u2F70', 1369, '\u2F71', 1370, '\u2F72', 1371, '\u2F73', 1372, '\u2F74', 1373, '\u2F75', 1374, '\u2F76', 1375, '\u2F77', 1376, '\u2F78', 1377, '\u2F79', 1378, '\u2F7A', 1379, '\u2F7B', 1380, '\u2F7C', 1381, '\u2F7D', 1382, '\u2F7E', 1383, '\u2F7F', 1384, '\u2F80', 1385, '\u2F81', 1386, '\u2F82', 1387, '\u2F83', 1388, '\u2F84', 1389, '\u2F85', 1390, '\u2F86', 1391, '\u2F87', 1392, '\u2F88', 1393, '\u2F89', 1394, '\u2F8A', 1395, '\u2F8B', 1396, '\u2F8C', 1397, '\u2F8D', 1398, '\u2F8E', 1399, '\u2F8F', 1400, '\u2F90', 1401, '\u2F91', 1402, '\u2F92', 1403, '\u2F93', 1404, '\u2F94', 1405, '\u2F95', 1406, '\u2F96', 1407, '\u2F97', 1408, '\u2F98', 1409, '\u2F99', 1410, '\u2F9A', 1411, '\u2F9B', 1412, '\u2F9C', 1413, '\u2F9D', 1414, '\u2F9E', 1415, '\u2F9F', 1416, '\u2FA0', 1417, '\u2FA1', 1418, '\u2FA2', 1419, '\u2FA3', 1420, '\u2FA4', 1421, '\u2FA5', 1422, '\u2FA6', 1423, '\u2FA7', 1424, '\u2FA8', 1425, '\u2FA9', 1426, '\u2FAA', 1427, '\u2FAB', 1428, '\u2FAC', 1429, '\u2FAD', 1430, '\u2FAE', 1431, '\u2FAF', 1432, '\u2FB0', 1433, '\u2FB1', 1434, '\u2FB2', 1435, '\u2FB3', 1436, '\u2FB4', 1437, '\u2FB5', 1438, '\u2FB6', 1439, '\u2FB7', 1440, '\u2FB8', 1441, '\u2FB9', 1442, '\u2FBA', 1443, '\u2FBB', 1444, '\u2FBC', 1445, '\u2FBD', 1446, '\u2FBE', 1447, '\u2FBF', 1448, '\u2FC0', 1449, '\u2FC1', 1450, '\u2FC2', 1451, '\u2FC3', 1452, '\u2FC4', 1453, '\u2FC5', 1454, '\u2FC6', 1455, '\u2FC7', 1456, '\u2FC8', 1457, '\u2FC9', 1458, '\u2FCA', 1459, '\u2FCB', 1460, '\u2FCC', 1461, '\u2FCD', 1462, '\u2FCE', 1463, '\u2FCF', 1464, '\u2FD0', 1465, '\u2FD1', 1466, '\u2FD2', 1467, '\u2FD3', 1468, '\u2FD4', 1469, '\u2FD5', 1470, '\u3000', 0, '\u3036', 1471, '\u3038', 1280, '\u3039', 1472, '\u303A', 1473, '\u304C', 1474, '\u304E', 1475, '\u3050', 1476, '\u3052', 1477, '\u3054', 1478, '\u3056', 1479, '\u3058', 1480, '\u305A', 1481, '\u305C', 1482, '\u305E', 1483, '\u3060', 1484, '\u3062', 1485, '\u3065', 1486, '\u3067', 1487, '\u3069', 1488, '\u3070', 1489, '\u3071', 1490, '\u3073', 1491, '\u3074', 1492, '\u3076', 1493, '\u3077', 1494, '\u3079', 1495, '\u307A', 1496, '\u307C', 1497, '\u307D', 1498, '\u3094', 1499, '\u309B', 1500, '\u309C', 1501, '\u309E', 1502, '\u309F', 1503, '\u30AC', 1504, '\u30AE', 1505, '\u30B0', 1506, '\u30B2', 1507, '\u30B4', 1508, '\u30B6', 1509, '\u30B8', 1510, '\u30BA', 1511, '\u30BC', 1512, '\u30BE', 1513, '\u30C0', 1514, '\u30C2', 1515, '\u30C5', 1516, '\u30C7', 1517, '\u30C9', 1518, '\u30D0', 1519, '\u30D1', 1520, '\u30D3', 1521, '\u30D4', 1522, '\u30D6', 1523, '\u30D7', 1524, '\u30D9', 1525, '\u30DA', 1526, '\u30DC', 1527, '\u30DD', 1528, '\u30F4', 1529, '\u30F7', 1530, '\u30F8', 1531, '\u30F9', 1532, '\u30FA', 1533, '\u30FE', 1534, '\u30FF', 1535, '\u3131', 1536, '\u3132', 1537, '\u3133', 1538, '\u3134', 1539, '\u3135', 1540, '\u3136', 1541, '\u3137', 1542, '\u3138', 1543, '\u3139', 1544, '\u313A', 1545, '\u313B', 1546, '\u313C', 1547, '\u313D', 1548, '\u313E', 1549, '\u313F', 1550, '\u3140', 1551, '\u3141', 1552, '\u3142', 1553, '\u3143', 1554, '\u3144', 1555, '\u3145', 1556, '\u3146', 1557, '\u3147', 1558, '\u3148', 1559, '\u3149', 1560, '\u314A', 1561, '\u314B', 1562, '\u314C', 1563, '\u314D', 1564, '\u314E', 1565, '\u314F', 1566, '\u3150', 1567, '\u3151', 1568, '\u3152', 1569, '\u3153', 1570, '\u3154', 1571, '\u3155', 1572, '\u3156', 1573, '\u3157', 1574, '\u3158', 1575, '\u3159', 1576, '\u315A', 1577, '\u315B', 1578, '\u315C', 1579, '\u315D', 1580, '\u315E', 1581, '\u315F', 1582, '\u3160', 1583, '\u3161', 1584, '\u3162', 1585, '\u3163', 1586, '\u3164', 1587, '\u3165', 1588, '\u3166', 1589, '\u3167', 1590, '\u3168', 1591, '\u3169', 1592, '\u316A', 1593, '\u316B', 1594, '\u316C', 1595, '\u316D', 1596, '\u316E', 1597, '\u316F', 1598, '\u3170', 1599, '\u3171', 1600, '\u3172', 1601, '\u3173', 1602, '\u3174', 1603, '\u3175', 1604, '\u3176', 1605, '\u3177', 1606, '\u3178', 1607, '\u3179', 1608, '\u317A', 1609, '\u317B', 1610, '\u317C', 1611, '\u317D', 1612, '\u317E', 1613, '\u317F', 1614, '\u3180', 1615, '\u3181', 1616, '\u3182', 1617, '\u3183', 1618, '\u3184', 1619, '\u3185', 1620, '\u3186', 1621, '\u3187', 1622, '\u3188', 1623, '\u3189', 1624, '\u318A', 1625, '\u318B', 1626, '\u318C', 1627, '\u318D', 1628, '\u318E', 1629, '\u3192', 1257, '\u3193', 1263, '\u3194', 1630, '\u3195', 1631, '\u3196', 1632, '\u3197', 1633, '\u3198', 1634, '\u3199', 1635, '\u319A', 1261, '\u319B', 1636, '\u319C', 1637, '\u319D', 1638, '\u319E', 1639, '\u319F', 1265, '\u3200', 1640, '\u3201', 1641, '\u3202', 1642, '\u3203', 1643, '\u3204', 1644, '\u3205', 1645, '\u3206', 1646, '\u3207', 1647, '\u3208', 1648, '\u3209', 1649, '\u320A', 1650, '\u320B', 1651, '\u320C', 1652, '\u320D', 1653, '\u320E', 1654, '\u320F', 1655, '\u3210', 1656, '\u3211', 1657, '\u3212', 1658, '\u3213', 1659, '\u3214', 1660, '\u3215', 1661, '\u3216', 1662, '\u3217', 1663, '\u3218', 1664, '\u3219', 1665, '\u321A', 1666, '\u321B', 1667, '\u321C', 1668, '\u321D', 1669, '\u321E', 1670, '\u3220', 1671, '\u3221', 1672, '\u3222', 1673, '\u3223', 1674, '\u3224', 1675, '\u3225', 1676, '\u3226', 1677, '\u3227', 1678, '\u3228', 1679, '\u3229', 1680, '\u322A', 1681, '\u322B', 1682, '\u322C', 1683, '\u322D', 1684, '\u322E', 1685, '\u322F', 1686, '\u3230', 1687, '\u3231', 1688, '\u3232', 1689, '\u3233', 1690, '\u3234', 1691, '\u3235', 1692, '\u3236', 1693, '\u3237', 1694, '\u3238', 1695, '\u3239', 1696, '\u323A', 1697, '\u323B', 1698, '\u323C', 1699, '\u323D', 1700, '\u323E', 1701, '\u323F', 1702, '\u3240', 1703, '\u3241', 1704, '\u3242', 1705, '\u3243', 1706, '\u3250', 1707, '\u3251', 1708, '\u3252', 1709, '\u3253', 1710, '\u3254', 1711, '\u3255', 1712, '\u3256', 1713, '\u3257', 1714, '\u3258', 1715, '\u3259', 1716, '\u325A', 1717, '\u325B', 1718, '\u325C', 1719, '\u325D', 1720, '\u325E', 1721, '\u325F', 1722, '\u3260', 1536, '\u3261', 1539, '\u3262', 1542, '\u3263', 1544, '\u3264', 1552, '\u3265', 1553, '\u3266', 1556, '\u3267', 1558, '\u3268', 1559, '\u3269', 1561, '\u326A', 1562, '\u326B', 1563, '\u326C', 1564, '\u326D', 1565, '\u326E', 1723, '\u326F', 1724, '\u3270', 1725, '\u3271', 1726, '\u3272', 1727, '\u3273', 1728, '\u3274', 1729, '\u3275', 1730, '\u3276', 1731, '\u3277', 1732, '\u3278', 1733, '\u3279', 1734, '\u327A', 1735, '\u327B', 1736, '\u327C', 1737, '\u327D', 1738, '\u327E', 1739, '\u3280', 1257, '\u3281', 1263, '\u3282', 1630, '\u3283', 1631, '\u3284', 1740, '\u3285', 1741, '\u3286', 1742, '\u3287', 1268, '\u3288', 1743, '\u3289', 1280, '\u328A', 1330, '\u328B', 1342, '\u328C', 1341, '\u328D', 1331, '\u328E', 1423, '\u328F', 1288, '\u3290', 1328, '\u3291', 1744, '\u3292', 1745, '\u3293', 1746, '\u3294', 1747, '\u3295', 1748, '\u3296', 1749, '\u3297', 1750, '\u3298', 1751, '\u3299', 1752, '\u329A', 1753, '\u329B', 1294, '\u329C', 1754, '\u329D', 1755, '\u329E', 1756, '\u329F', 1757, '\u32A0', 1758, '\u32A1', 1759, '\u32A2', 1760, '\u32A3', 1761, '\u32A4', 1632, '\u32A5', 1633, '\u32A6', 1634, '\u32A7', 1762, '\u32A8', 1763, '\u32A9', 1764, '\u32AA', 1765, '\u32AB', 1766, '\u32AC', 1767, '\u32AD', 1768, '\u32AE', 1769, '\u32AF', 1770, '\u32B0', 1771, '\u32B1', 1772, '\u32B2', 1773, '\u32B3', 1774, '\u32B4', 1775, '\u32B5', 1776, '\u32B6', 1777, '\u32B7', 1778, '\u32B8', 1779, '\u32B9', 1780, '\u32BA', 1781, '\u32BB', 1782, '\u32BC', 1783, '\u32BD', 1784, '\u32BE', 1785, '\u32BF', 1786, '\u32C0', 1787, '\u32C1', 1788, '\u32C2', 1789, '\u32C3', 1790, '\u32C4', 1791, '\u32C5', 1792, '\u32C6', 1793, '\u32C7', 1794, '\u32C8', 1795, '\u32C9', 1796, '\u32CA', 1797, '\u32CB', 1798, '\u32CC', 1799, '\u32CD', 1800, '\u32CE', 1801, '\u32CF', 1802, '\u32D0', 1803, '\u32D1', 1804, '\u32D2', 1805, '\u32D3', 1806, '\u32D4', 1807, '\u32D5', 1808, '\u32D6', 1809, '\u32D7', 1810, '\u32D8', 1811, '\u32D9', 1812, '\u32DA', 1813, '\u32DB', 1814, '\u32DC', 1815, '\u32DD', 1816, '\u32DE', 1817, '\u32DF', 1818, '\u32E0', 1819, '\u32E1', 1820, '\u32E2', 1821, '\u32E3', 1822, '\u32E4', 1823, '\u32E5', 1824, '\u32E6', 1825, '\u32E7', 1826, '\u32E8', 1827, '\u32E9', 1828, '\u32EA', 1829, '\u32EB', 1830, '\u32EC', 1831, '\u32ED', 1832, '\u32EE', 1833, '\u32EF', 1834, '\u32F0', 1835, '\u32F1', 1836, '\u32F2', 1837, '\u32F3', 1838, '\u32F4', 1839, '\u32F5', 1840, '\u32F6', 1841, '\u32F7', 1842, '\u32F8', 1843, '\u32F9', 1844, '\u32FA', 1845, '\u32FB', 1846, '\u32FC', 1847, '\u32FD', 1848, '\u32FE', 1849, '\u3300', 1850, '\u3301', 1851, '\u3302', 1852, '\u3303', 1853, '\u3304', 1854, '\u3305', 1855, '\u3306', 1856, '\u3307', 1857, '\u3308', 1858, '\u3309', 1859, '\u330A', 1860, '\u330B', 1861, '\u330C', 1862, '\u330D', 1863, '\u330E', 1864, '\u330F', 1865, '\u3310', 1866, '\u3311', 1867, '\u3312', 1868, '\u3313', 1869, '\u3314', 1870, '\u3315', 1871, '\u3316', 1872, '\u3317', 1873, '\u3318', 1874, '\u3319', 1875, '\u331A', 1876, '\u331B', 1877, '\u331C', 1878, '\u331D', 1879, '\u331E', 1880, '\u331F', 1881, '\u3320', 1882, '\u3321', 1883, '\u3322', 1884, '\u3323', 1885, '\u3324', 1886, '\u3325', 1887, '\u3326', 1888, '\u3327', 1889, '\u3328', 1890, '\u3329', 1891, '\u332A', 1892, '\u332B', 1893, '\u332C', 1894, '\u332D', 1895, '\u332E', 1896, '\u332F', 1897, '\u3330', 1898, '\u3331', 1899, '\u3332', 1900, '\u3333', 1901, '\u3334', 1902, '\u3335', 1903, '\u3336', 1904, '\u3337', 1905, '\u3338', 1906, '\u3339', 1907, '\u333A', 1908, '\u333B', 1909, '\u333C', 1910, '\u333D', 1911, '\u333E', 1912, '\u333F', 1913, '\u3340', 1914, '\u3341', 1915, '\u3342', 1916, '\u3343', 1917, '\u3344', 1918, '\u3345', 1919, '\u3346', 1920, '\u3347', 1921, '\u3348', 1922, '\u3349', 1923, '\u334A', 1924, '\u334B', 1925, '\u334C', 1926, '\u334D', 1927, '\u334E', 1928, '\u334F', 1929, '\u3350', 1930, '\u3351', 1931, '\u3352', 1932, '\u3353', 1933, '\u3354', 1934, '\u3355', 1935, '\u3356', 1936, '\u3357', 1937, '\u3358', 1938, '\u3359', 1939, '\u335A', 1940, '\u335B', 1941, '\u335C', 1942, '\u335D', 1943, '\u335E', 1944, '\u335F', 1945, '\u3360', 1946, '\u3361', 1947, '\u3362', 1948, '\u3363', 1949, '\u3364', 1950, '\u3365', 1951, '\u3366', 1952, '\u3367', 1953, '\u3368', 1954, '\u3369', 1955, '\u336A', 1956, '\u336B', 1957, '\u336C', 1958, '\u336D', 1959, '\u336E', 1960, '\u336F', 1961, '\u3370', 1962, '\u3371', 1963, '\u3372', 1964, '\u3373', 1965, '\u3374', 1966, '\u3375', 1967, '\u3376', 1968, '\u3377', 1969, '\u3378', 1970, '\u3379', 1971, '\u337A', 1972, '\u337B', 1973, '\u337C', 1974, '\u337D', 1975, '\u337E', 1976, '\u337F', 1977, '\u3380', 1978, '\u3381', 1979, '\u3382', 1980, '\u3383', 1981, '\u3384', 1982, '\u3385', 1983, '\u3386', 1984, '\u3387', 1985, '\u3388', 1986, '\u3389', 1987, '\u338A', 1988, '\u338B', 1989, '\u338C', 1990, '\u338D', 1991, '\u338E', 1992, '\u338F', 1993, '\u3390', 1994, '\u3391', 1995, '\u3392', 1996, '\u3393', 1997, '\u3394', 1998, '\u3395', 1999, '\u3396', 2000, '\u3397', 2001, '\u3398', 2002, '\u3399', 2003, '\u339A', 2004, '\u339B', 2005, '\u339C', 2006, '\u339D', 2007, '\u339E', 2008, '\u339F', 2009, '\u33A0', 2010, '\u33A1', 2011, '\u33A2', 2012, '\u33A3', 2013, '\u33A4', 2014, '\u33A5', 2015, '\u33A6', 2016, '\u33A7', 2017, '\u33A8', 2018, '\u33A9', 2019, '\u33AA', 2020, '\u33AB', 2021, '\u33AC', 2022, '\u33AD', 2023, '\u33AE', 2024, '\u33AF', 2025, '\u33B0', 2026, '\u33B1', 2027, '\u33B2', 2028, '\u33B3', 2029, '\u33B4', 2030, '\u33B5', 2031, '\u33B6', 2032, '\u33B7', 2033, '\u33B8', 2034, '\u33B9', 2035, '\u33BA', 2036, '\u33BB', 2037, '\u33BC', 2038, '\u33BD', 2039, '\u33BE', 2040, '\u33BF', 2041, '\u33C0', 2042, '\u33C1', 2043, '\u33C2', 2044, '\u33C3', 2045, '\u33C4', 2046, '\u33C5', 2047, '\u33C6', 2048, '\u33C7', 2049, '\u33C8', 2050, '\u33C9', 2051, '\u33CA', 2052, '\u33CB', 2053, '\u33CC', 2054, '\u33CD', 2055, '\u33CE', 2056, '\u33CF', 2057, '\u33D0', 2058, '\u33D1', 2059, '\u33D2', 2060, '\u33D3', 2061, '\u33D4', 2062, '\u33D5', 2063, '\u33D6', 2064, '\u33D7', 2065, '\u33D8', 2066, '\u33D9', 2067, '\u33DA', 2068, '\u33DB', 2069, '\u33DC', 2070, '\u33DD', 2071, '\u33DE', 2072, '\u33DF', 2073, '\u33E0', 2074, '\u33E1', 2075, '\u33E2', 2076, '\u33E3', 2077, '\u33E4', 2078, '\u33E5', 2079, '\u33E6', 2080, '\u33E7', 2081, '\u33E8', 2082, '\u33E9', 2083, '\u33EA', 2084, '\u33EB', 2085, '\u33EC', 2086, '\u33ED', 2087, '\u33EE', 2088, '\u33EF', 2089, '\u33F0', 2090, '\u33F1', 2091, '\u33F2', 2092, '\u33F3', 2093, '\u33F4', 2094, '\u33F5', 2095, '\u33F6', 2096, '\u33F7', 2097, '\u33F8', 2098, '\u33F9', 2099, '\u33FA', 2100, '\u33FB', 2101, '\u33FC', 2102, '\u33FD', 2103, '\u33FE', 2104, '\u33FF', 2105, '\uA770', 2106, '\uF900', 2107, '\uF901', 2108, '\uF902', 1415, '\uF903', 2109, '\uF904', 2110, '\uF905', 2111, '\uF906', 2112, '\uF907', 1469, '\uF908', 1469, '\uF909', 2113, '\uF90A', 1423, '\uF90B', 2114, '\uF90C', 2115, '\uF90D', 2116, '\uF90E', 2117, '\uF90F', 2118, '\uF910', 2119, '\uF911', 2120, '\uF912', 2121, '\uF913', 2122, '\uF914', 2123, '\uF915', 2124, '\uF916', 2125, '\uF917', 2126, '\uF918', 2127, '\uF919', 2128, '\uF91A', 2129, '\uF91B', 2130, '\uF91C', 2131, '\uF91D', 2132, '\uF91E', 2133, '\uF91F', 2134, '\uF920', 2135, '\uF921', 2136, '\uF922', 2137, '\uF923', 2138, '\uF924', 2139, '\uF925', 2140, '\uF926', 2141, '\uF927', 2142, '\uF928', 2143, '\uF929', 2144, '\uF92A', 2145, '\uF92B', 2146, '\uF92C', 2147, '\uF92D', 2148, '\uF92E', 2149, '\uF92F', 2150, '\uF930', 2151, '\uF931', 2152, '\uF932', 2153, '\uF933', 2154, '\uF934', 1381, '\uF935', 2155, '\uF936', 2156, '\uF937', 2157, '\uF938', 2158, '\uF939', 2159, '\uF93A', 2160, '\uF93B', 2161, '\uF93C', 2162, '\uF93D', 2163, '\uF93E', 2164, '\uF93F', 2165, '\uF940', 1454, '\uF941', 2166, '\uF942', 2167, '\uF943', 2168, '\uF944', 2169, '\uF945', 2170, '\uF946', 2171, '\uF947', 2172, '\uF948', 2173, '\uF949', 2174, '\uF94A', 2175, '\uF94B', 2176, '\uF94C', 2177, '\uF94D', 2178, '\uF94E', 2179, '\uF94F', 2180, '\uF950', 2181, '\uF951', 2182, '\uF952', 2183, '\uF953', 2184, '\uF954', 2185, '\uF955', 2186, '\uF956', 2187, '\uF957', 2188, '\uF958', 2189, '\uF959', 2190, '\uF95A', 2191, '\uF95B', 2192, '\uF95C', 2123, '\uF95D', 2193, '\uF95E', 2194, '\uF95F', 2195, '\uF960', 2196, '\uF961', 2197, '\uF962', 2198, '\uF963', 2199, '\uF964', 2200, '\uF965', 2201, '\uF966', 2202, '\uF967', 2203, '\uF968', 2204, '\uF969', 2205, '\uF96A', 2206, '\uF96B', 2207, '\uF96C', 2208, '\uF96D', 2209, '\uF96E', 2210, '\uF96F', 2211, '\uF970', 2212, '\uF971', 1417, '\uF972', 2213, '\uF973', 2214, '\uF974', 2215, '\uF975', 2216, '\uF976', 2217, '\uF977', 2218, '\uF978', 2219, '\uF979', 2220, '\uF97A', 2221, '\uF97B', 2222, '\uF97C', 2223, '\uF97D', 2224, '\uF97E', 2225, '\uF97F', 2226, '\uF980', 2227, '\uF981', 1294, '\uF982', 2228, '\uF983', 2229, '\uF984', 2230, '\uF985', 2231, '\uF986', 2232, '\uF987', 2233, '\uF988', 2234, '\uF989', 2235, '\uF98A', 1275, '\uF98B', 2236, '\uF98C', 2237, '\uF98D', 2238, '\uF98E', 2239, '\uF98F', 2240, '\uF990', 2241, '\uF991', 2242, '\uF992', 2243, '\uF993', 2244, '\uF994', 2245, '\uF995', 2246, '\uF996', 2247, '\uF997', 2248, '\uF998', 2249, '\uF999', 2250, '\uF99A', 2251, '\uF99B', 2252, '\uF99C', 2253, '\uF99D', 2254, '\uF99E', 2255, '\uF99F', 2256, '\uF9A0', 2257, '\uF9A1', 2211, '\uF9A2', 2258, '\uF9A3', 2259, '\uF9A4', 2260, '\uF9A5', 2261, '\uF9A6', 2262, '\uF9A7', 2263, '\uF9A8', 2264, '\uF9A9', 2265, '\uF9AA', 2195, '\uF9AB', 2266, '\uF9AC', 2267, '\uF9AD', 2268, '\uF9AE', 2269, '\uF9AF', 2270, '\uF9B0', 2271, '\uF9B1', 2272, '\uF9B2', 2273, '\uF9B3', 2274, '\uF9B4', 2275, '\uF9B5', 2276, '\uF9B6', 2277, '\uF9B7', 2278, '\uF9B8', 2279, '\uF9B9', 2280, '\uF9BA', 2281, '\uF9BB', 2282, '\uF9BC', 2283, '\uF9BD', 2284, '\uF9BE', 2285, '\uF9BF', 2123, '\uF9C0', 2286, '\uF9C1', 2287, '\uF9C2', 2288, '\uF9C3', 2289, '\uF9C4', 1468, '\uF9C5', 2290, '\uF9C6', 2291, '\uF9C7', 2292, '\uF9C8', 2293, '\uF9C9', 2294, '\uF9CA', 2295, '\uF9CB', 2296, '\uF9CC', 2297, '\uF9CD', 2298, '\uF9CE', 2299, '\uF9CF', 2300, '\uF9D0', 2301, '\uF9D1', 1741, '\uF9D2', 2302, '\uF9D3', 2303, '\uF9D4', 2304, '\uF9D5', 2305, '\uF9D6', 2306, '\uF9D7', 2307, '\uF9D8', 2308, '\uF9D9', 2309, '\uF9DA', 2310, '\uF9DB', 2197, '\uF9DC', 2311, '\uF9DD', 2312, '\uF9DE', 2313, '\uF9DF', 2314, '\uF9E0', 2315, '\uF9E1', 2316, '\uF9E2', 2317, '\uF9E3', 2318, '\uF9E4', 2319, '\uF9E5', 2320, '\uF9E6', 2321, '\uF9E7', 2322, '\uF9E8', 2323, '\uF9E9', 1422, '\uF9EA', 2324, '\uF9EB', 2325, '\uF9EC', 2326, '\uF9ED', 2327, '\uF9EE', 2328, '\uF9EF', 2329, '\uF9F0', 2330, '\uF9F1', 2331, '\uF9F2', 2332, '\uF9F3', 2333, '\uF9F4', 2334, '\uF9F5', 2335, '\uF9F6', 2336, '\uF9F7', 1373, '\uF9F8', 2337, '\uF9F9', 2338, '\uF9FA', 2339, '\uF9FB', 2340, '\uF9FC', 2341, '\uF9FD', 2342, '\uF9FE', 2343, '\uF9FF', 2344, '\uFA00', 2345, '\uFA01', 2346, '\uFA02', 2347, '\uFA03', 2348, '\uFA04', 2349, '\uFA05', 2350, '\uFA06', 2351, '\uFA07', 2352, '\uFA08', 1400, '\uFA09', 2353, '\uFA0A', 1403, '\uFA0B', 2354, '\uFA0C', 2355, '\uFA0D', 2356, '\uFA10', 2357, '\uFA12', 2358, '\uFA15', 2359, '\uFA16', 2360, '\uFA17', 2361, '\uFA18', 2362, '\uFA19', 2363, '\uFA1A', 2364, '\uFA1B', 2365, '\uFA1C', 2366, '\uFA1D', 2367, '\uFA1E', 1380, '\uFA20', 2368, '\uFA22', 2369, '\uFA25', 2370, '\uFA26', 2371, '\uFA2A', 2372, '\uFA2B', 2373, '\uFA2C', 2374, '\uFA2D', 2375, '\uFA30', 2376, '\uFA31', 2377, '\uFA32', 2378, '\uFA33', 2379, '\uFA34', 2380, '\uFA35', 2381, '\uFA36', 2382, '\uFA37', 2383, '\uFA38', 2384, '\uFA39', 2385, '\uFA3A', 2386, '\uFA3B', 2387, '\uFA3C', 1301, '\uFA3D', 2388, '\uFA3E', 2389, '\uFA3F', 2390, '\uFA40', 2391, '\uFA41', 2392, '\uFA42', 2393, '\uFA43', 2394, '\uFA44', 2395, '\uFA45', 2396, '\uFA46', 2397, '\uFA47', 2398, '\uFA48', 2399, '\uFA49', 2400, '\uFA4A', 2401, '\uFA4B', 2402, '\uFA4C', 1746, '\uFA4D', 2403, '\uFA4E', 2404, '\uFA4F', 2405, '\uFA50', 2406, '\uFA51', 1750, '\uFA52', 2407, '\uFA53', 2408, '\uFA54', 2409, '\uFA55', 2410, '\uFA56', 2411, '\uFA57', 2247, '\uFA58', 2412, '\uFA59', 2413, '\uFA5A', 2414, '\uFA5B', 2415, '\uFA5C', 2416, '\uFA5D', 2417, '\uFA5E', 2417, '\uFA5F', 2418, '\uFA60', 2419, '\uFA61', 2420, '\uFA62', 2421, '\uFA63', 2422, '\uFA64', 2423, '\uFA65', 2424, '\uFA66', 2425, '\uFA67', 2370, '\uFA68', 2426, '\uFA69', 2427, '\uFA6A', 2428, '\uFA70', 2429, '\uFA71', 2430, '\uFA72', 2431, '\uFA73', 2432, '\uFA74', 2433, '\uFA75', 2434, '\uFA76', 2435, '\uFA77', 2436, '\uFA78', 2382, '\uFA79', 2437, '\uFA7A', 2438, '\uFA7B', 2439, '\uFA7C', 2357, '\uFA7D', 2440, '\uFA7E', 2441, '\uFA7F', 2442, '\uFA80', 2443, '\uFA81', 2444, '\uFA82', 2445, '\uFA83', 2446, '\uFA84', 2447, '\uFA85', 2448, '\uFA86', 2449, '\uFA87', 2450, '\uFA88', 2451, '\uFA89', 2390, '\uFA8A', 2452, '\uFA8B', 2391, '\uFA8C', 2453, '\uFA8D', 2454, '\uFA8E', 2455, '\uFA8F', 2456, '\uFA90', 2457, '\uFA91', 2358, '\uFA92', 2144, '\uFA93', 2458, '\uFA94', 2459, '\uFA95', 1334, '\uFA96', 2212, '\uFA97', 2295, '\uFA98', 2460, '\uFA99', 2461, '\uFA9A', 2398, '\uFA9B', 2462, '\uFA9C', 2399, '\uFA9D', 2463, '\uFA9E', 2464, '\uFA9F', 2465, '\uFAA0', 2360, '\uFAA1', 2466, '\uFAA2', 2467, '\uFAA3', 2468, '\uFAA4', 2469, '\uFAA5', 2470, '\uFAA6', 2361, '\uFAA7', 2471, '\uFAA8', 2472, '\uFAA9', 2473, '\uFAAA', 2474, '\uFAAB', 2475, '\uFAAC', 2476, '\uFAAD', 2411, '\uFAAE', 2477, '\uFAAF', 2478, '\uFAB0', 2247, '\uFAB1', 2479, '\uFAB2', 2415, '\uFAB3', 2480, '\uFAB4', 2481, '\uFAB5', 2482, '\uFAB6', 2483, '\uFAB7', 2484, '\uFAB8', 2420, '\uFAB9', 2485, '\uFABA', 2369, '\uFABB', 2486, '\uFABC', 2421, '\uFABD', 2193, '\uFABE', 2487, '\uFABF', 2422, '\uFAC0', 2488, '\uFAC1', 2424, '\uFAC2', 2489, '\uFAC3', 2490, '\uFAC4', 2491, '\uFAC5', 2492, '\uFAC6', 2493, '\uFAC7', 2426, '\uFAC8', 2366, '\uFAC9', 2494, '\uFACA', 2427, '\uFACB', 2495, '\uFACC', 2428, '\uFACD', 2496, '\uFACE', 1469, '\uFACF', 2497, '\uFAD0', 2498, '\uFAD1', 2499, '\uFAD2', 2500, '\uFAD3', 2501, '\uFAD4', 2502, '\uFAD5', 2503, '\uFAD6', 2504, '\uFAD7', 2505, '\uFAD8', 2506, '\uFAD9', 2507, '\uFB00', 2508, '\uFB01', 2509, '\uFB02', 2510, '\uFB03', 2511, '\uFB04', 2512, '\uFB05', 2513, '\uFB06', 2513, '\uFB13', 2514, '\uFB14', 2515, '\uFB15', 2516, '\uFB16', 2517, '\uFB17', 2518, '\uFB1D', 2519, '\uFB1F', 2520, '\uFB20', 2521, '\uFB21', 1078, '\uFB22', 1081, '\uFB23', 2522, '\uFB24', 2523, '\uFB25', 2524, '\uFB26', 2525, '\uFB27', 2526, '\uFB28', 2527, '\uFB29', 1054, '\uFB2A', 2528, '\uFB2B', 2529, '\uFB2C', 2530, '\uFB2D', 2531, '\uFB2E', 2532, '\uFB2F', 2533, '\uFB30', 2534, '\uFB31', 2535, '\uFB32', 2536, '\uFB33', 2537, '\uFB34', 2538, '\uFB35', 2539, '\uFB36', 2540, '\uFB38', 2541, '\uFB39', 2542, '\uFB3A', 2543, '\uFB3B', 2544, '\uFB3C', 2545, '\uFB3E', 2546, '\uFB40', 2547, '\uFB41', 2548, '\uFB43', 2549, '\uFB44', 2550, '\uFB46', 2551, '\uFB47', 2552, '\uFB48', 2553, '\uFB49', 2554, '\uFB4A', 2555, '\uFB4B', 2556, '\uFB4C', 2557, '\uFB4D', 2558, '\uFB4E', 2559, '\uFB4F', 2560, '\uFB50', 2561, '\uFB51', 2561, '\uFB52', 2562, '\uFB53', 2562, '\uFB54', 2562, '\uFB55', 2562, '\uFB56', 2563, '\uFB57', 2563, '\uFB58', 2563, '\uFB59', 2563, '\uFB5A', 2564, '\uFB5B', 2564, '\uFB5C', 2564, '\uFB5D', 2564, '\uFB5E', 2565, '\uFB5F', 2565, '\uFB60', 2565, '\uFB61', 2565, '\uFB62', 2566, '\uFB63', 2566, '\uFB64', 2566, '\uFB65', 2566, '\uFB66', 2567, '\uFB67', 2567, '\uFB68', 2567, '\uFB69', 2567, '\uFB6A', 2568, '\uFB6B', 2568, '\uFB6C', 2568, '\uFB6D', 2568, '\uFB6E', 2569, '\uFB6F', 2569, '\uFB70', 2569, '\uFB71', 2569, '\uFB72', 2570, '\uFB73', 2570, '\uFB74', 2570, '\uFB75', 2570, '\uFB76', 2571, '\uFB77', 2571, '\uFB78', 2571, '\uFB79', 2571, '\uFB7A', 2572, '\uFB7B', 2572, '\uFB7C', 2572, '\uFB7D', 2572, '\uFB7E', 2573, '\uFB7F', 2573, '\uFB80', 2573, '\uFB81', 2573, '\uFB82', 2574, '\uFB83', 2574, '\uFB84', 2575, '\uFB85', 2575, '\uFB86', 2576, '\uFB87', 2576, '\uFB88', 2577, '\uFB89', 2577, '\uFB8A', 2578, '\uFB8B', 2578, '\uFB8C', 2579, '\uFB8D', 2579, '\uFB8E', 2580, '\uFB8F', 2580, '\uFB90', 2580, '\uFB91', 2580, '\uFB92', 2581, '\uFB93', 2581, '\uFB94', 2581, '\uFB95', 2581, '\uFB96', 2582, '\uFB97', 2582, '\uFB98', 2582, '\uFB99', 2582, '\uFB9A', 2583, '\uFB9B', 2583, '\uFB9C', 2583, '\uFB9D', 2583, '\uFB9E', 2584, '\uFB9F', 2584, '\uFBA0', 2585, '\uFBA1', 2585, '\uFBA2', 2585, '\uFBA3', 2585, '\uFBA4', 405, '\uFBA5', 405, '\uFBA6', 2586, '\uFBA7', 2586, '\uFBA8', 2586, '\uFBA9', 2586, '\uFBAA', 2587, '\uFBAB', 2587, '\uFBAC', 2587, '\uFBAD', 2587, '\uFBAE', 2588, '\uFBAF', 2588, '\uFBB0', 407, '\uFBB1', 407, '\uFBD3', 2589, '\uFBD4', 2589, '\uFBD5', 2589, '\uFBD6', 2589, '\uFBD7', 2590, '\uFBD8', 2590, '\uFBD9', 2591, '\uFBDA', 2591, '\uFBDB', 2592, '\uFBDC', 2592, '\uFBDD', 403, '\uFBDE', 2593, '\uFBDF', 2593, '\uFBE0', 2594, '\uFBE1', 2594, '\uFBE2', 2595, '\uFBE3', 2595, '\uFBE4', 2596, '\uFBE5', 2596, '\uFBE6', 2596, '\uFBE7', 2596, '\uFBE8', 2597, '\uFBE9', 2597, '\uFBEA', 2598, '\uFBEB', 2598, '\uFBEC', 2599, '\uFBED', 2599, '\uFBEE', 2600, '\uFBEF', 2600, '\uFBF0', 2601, '\uFBF1', 2601, '\uFBF2', 2602, '\uFBF3', 2602, '\uFBF4', 2603, '\uFBF5', 2603, '\uFBF6', 2604, '\uFBF7', 2604, '\uFBF8', 2604, '\uFBF9', 2605, '\uFBFA', 2605, '\uFBFB', 2605, '\uFBFC', 2606, '\uFBFD', 2606, '\uFBFE', 2606, '\uFBFF', 2606, '\uFC00', 2607, '\uFC01', 2608, '\uFC02', 2609, '\uFC03', 2605, '\uFC04', 2610, '\uFC05', 2611, '\uFC06', 2612, '\uFC07', 2613, '\uFC08', 2614, '\uFC09', 2615, '\uFC0A', 2616, '\uFC0B', 2617, '\uFC0C', 2618, '\uFC0D', 2619, '\uFC0E', 2620, '\uFC0F', 2621, '\uFC10', 2622, '\uFC11', 2623, '\uFC12', 2624, '\uFC13', 2625, '\uFC14', 2626, '\uFC15', 2627, '\uFC16', 2628, '\uFC17', 2629, '\uFC18', 2630, '\uFC19', 2631, '\uFC1A', 2632, '\uFC1B', 2633, '\uFC1C', 2634, '\uFC1D', 2635, '\uFC1E', 2636, '\uFC1F', 2637, '\uFC20', 2638, '\uFC21', 2639, '\uFC22', 2640, '\uFC23', 2641, '\uFC24', 2642, '\uFC25', 2643, '\uFC26', 2644, '\uFC27', 2645, '\uFC28', 2646, '\uFC29', 2647, '\uFC2A', 2648, '\uFC2B', 2649, '\uFC2C', 2650, '\uFC2D', 2651, '\uFC2E', 2652, '\uFC2F', 2653, '\uFC30', 2654, '\uFC31', 2655, '\uFC32', 2656, '\uFC33', 2657, '\uFC34', 2658, '\uFC35', 2659, '\uFC36', 2660, '\uFC37', 2661, '\uFC38', 2662, '\uFC39', 2663, '\uFC3A', 2664, '\uFC3B', 2665, '\uFC3C', 2666, '\uFC3D', 2667, '\uFC3E', 2668, '\uFC3F', 2669, '\uFC40', 2670, '\uFC41', 2671, '\uFC42', 2672, '\uFC43', 2673, '\uFC44', 2674, '\uFC45', 2675, '\uFC46', 2676, '\uFC47', 2677, '\uFC48', 2678, '\uFC49', 2679, '\uFC4A', 2680, '\uFC4B', 2681, '\uFC4C', 2682, '\uFC4D', 2683, '\uFC4E', 2684, '\uFC4F', 2685, '\uFC50', 2686, '\uFC51', 2687, '\uFC52', 2688, '\uFC53', 2689, '\uFC54', 2690, '\uFC55', 2691, '\uFC56', 2692, '\uFC57', 2693, '\uFC58', 2694, '\uFC59', 2695, '\uFC5A', 2696, '\uFC5B', 2697, '\uFC5C', 2698, '\uFC5D', 2699, '\uFC5E', 2700, '\uFC5F', 2701, '\uFC60', 2702, '\uFC61', 2703, '\uFC62', 2704, '\uFC63', 2705, '\uFC64', 2706, '\uFC65', 2707, '\uFC66', 2609, '\uFC67', 2708, '\uFC68', 2605, '\uFC69', 2610, '\uFC6A', 2709, '\uFC6B', 2710, '\uFC6C', 2614, '\uFC6D', 2711, '\uFC6E', 2615, '\uFC6F', 2616, '\uFC70', 2712, '\uFC71', 2713, '\uFC72', 2620, '\uFC73', 2714, '\uFC74', 2621, '\uFC75', 2622, '\uFC76', 2715, '\uFC77', 2716, '\uFC78', 2624, '\uFC79', 2717, '\uFC7A', 2625, '\uFC7B', 2626, '\uFC7C', 2655, '\uFC7D', 2656, '\uFC7E', 2659, '\uFC7F', 2660, '\uFC80', 2661, '\uFC81', 2665, '\uFC82', 2666, '\uFC83', 2667, '\uFC84', 2668, '\uFC85', 2672, '\uFC86', 2673, '\uFC87', 2674, '\uFC88', 2718, '\uFC89', 2678, '\uFC8A', 2719, '\uFC8B', 2720, '\uFC8C', 2684, '\uFC8D', 2721, '\uFC8E', 2685, '\uFC8F', 2686, '\uFC90', 2699, '\uFC91', 2722, '\uFC92', 2723, '\uFC93', 2694, '\uFC94', 2724, '\uFC95', 2695, '\uFC96', 2696, '\uFC97', 2607, '\uFC98', 2608, '\uFC99', 2725, '\uFC9A', 2609, '\uFC9B', 2726, '\uFC9C', 2611, '\uFC9D', 2612, '\uFC9E', 2613, '\uFC9F', 2614, '\uFCA0', 2727, '\uFCA1', 2617, '\uFCA2', 2618, '\uFCA3', 2619, '\uFCA4', 2620, '\uFCA5', 2728, '\uFCA6', 2624, '\uFCA7', 2627, '\uFCA8', 2628, '\uFCA9', 2629, '\uFCAA', 2630, '\uFCAB', 2631, '\uFCAC', 2633, '\uFCAD', 2634, '\uFCAE', 2635, '\uFCAF', 2636, '\uFCB0', 2637, '\uFCB1', 2638, '\uFCB2', 2729, '\uFCB3', 2639, '\uFCB4', 2640, '\uFCB5', 2641, '\uFCB6', 2642, '\uFCB7', 2643, '\uFCB8', 2644, '\uFCB9', 2646, '\uFCBA', 2647, '\uFCBB', 2648, '\uFCBC', 2649, '\uFCBD', 2650, '\uFCBE', 2651, '\uFCBF', 2652, '\uFCC0', 2653, '\uFCC1', 2654, '\uFCC2', 2657, '\uFCC3', 2658, '\uFCC4', 2662, '\uFCC5', 2663, '\uFCC6', 2664, '\uFCC7', 2665, '\uFCC8', 2666, '\uFCC9', 2669, '\uFCCA', 2670, '\uFCCB', 2671, '\uFCCC', 2672, '\uFCCD', 2730, '\uFCCE', 2675, '\uFCCF', 2676, '\uFCD0', 2677, '\uFCD1', 2678, '\uFCD2', 2681, '\uFCD3', 2682, '\uFCD4', 2683, '\uFCD5', 2684, '\uFCD6', 2731, '\uFCD7', 2687, '\uFCD8', 2688, '\uFCD9', 2732, '\uFCDA', 2691, '\uFCDB', 2692, '\uFCDC', 2693, '\uFCDD', 2694, '\uFCDE', 2733, '\uFCDF', 2609, '\uFCE0', 2726, '\uFCE1', 2614, '\uFCE2', 2727, '\uFCE3', 2620, '\uFCE4', 2728, '\uFCE5', 2624, '\uFCE6', 2734, '\uFCE7', 2637, '\uFCE8', 2735, '\uFCE9', 2736, '\uFCEA', 2737, '\uFCEB', 2665, '\uFCEC', 2666, '\uFCED', 2672, '\uFCEE', 2684, '\uFCEF', 2731, '\uFCF0', 2694, '\uFCF1', 2733, '\uFCF2', 2738, '\uFCF3', 2739, '\uFCF4', 2740, '\uFCF5', 2741, '\uFCF6', 2742, '\uFCF7', 2743, '\uFCF8', 2744, '\uFCF9', 2745, '\uFCFA', 2746, '\uFCFB', 2747, '\uFCFC', 2748, '\uFCFD', 2749, '\uFCFE', 2750, '\uFCFF', 2751, '\uFD00', 2752, '\uFD01', 2753, '\uFD02', 2754, '\uFD03', 2755, '\uFD04', 2756, '\uFD05', 2757, '\uFD06', 2758, '\uFD07', 2759, '\uFD08', 2760, '\uFD09', 2761, '\uFD0A', 2762, '\uFD0B', 2763, '\uFD0C', 2736, '\uFD0D', 2764, '\uFD0E', 2765, '\uFD0F', 2766, '\uFD10', 2767, '\uFD11', 2741, '\uFD12', 2742, '\uFD13', 2743, '\uFD14', 2744, '\uFD15', 2745, '\uFD16', 2746, '\uFD17', 2747, '\uFD18', 2748, '\uFD19', 2749, '\uFD1A', 2750, '\uFD1B', 2751, '\uFD1C', 2752, '\uFD1D', 2753, '\uFD1E', 2754, '\uFD1F', 2755, '\uFD20', 2756, '\uFD21', 2757, '\uFD22', 2758, '\uFD23', 2759, '\uFD24', 2760, '\uFD25', 2761, '\uFD26', 2762, '\uFD27', 2763, '\uFD28', 2736, '\uFD29', 2764, '\uFD2A', 2765, '\uFD2B', 2766, '\uFD2C', 2767, '\uFD2D', 2761, '\uFD2E', 2762, '\uFD2F', 2763, '\uFD30', 2736, '\uFD31', 2735, '\uFD32', 2737, '\uFD33', 2645, '\uFD34', 2634, '\uFD35', 2635, '\uFD36', 2636, '\uFD37', 2761, '\uFD38', 2762, '\uFD39', 2763, '\uFD3A', 2645, '\uFD3B', 2646, '\uFD3C', 2768, '\uFD3D', 2768, '\uFD50', 2769, '\uFD51', 2770, '\uFD52', 2770, '\uFD53', 2771, '\uFD54', 2772, '\uFD55', 2773, '\uFD56', 2774, '\uFD57', 2775, '\uFD58', 2776, '\uFD59', 2776, '\uFD5A', 2777, '\uFD5B', 2778, '\uFD5C', 2779, '\uFD5D', 2780, '\uFD5E', 2781, '\uFD5F', 2782, '\uFD60', 2782, '\uFD61', 2783, '\uFD62', 2784, '\uFD63', 2784, '\uFD64', 2785, '\uFD65', 2785, '\uFD66', 2786, '\uFD67', 2787, '\uFD68', 2787, '\uFD69', 2788, '\uFD6A', 2789, '\uFD6B', 2789, '\uFD6C', 2790, '\uFD6D', 2790, '\uFD6E', 2791, '\uFD6F', 2792, '\uFD70', 2792, '\uFD71', 2793, '\uFD72', 2793, '\uFD73', 2794, '\uFD74', 2795, '\uFD75', 2796, '\uFD76', 2797, '\uFD77', 2797, '\uFD78', 2798, '\uFD79', 2799, '\uFD7A', 2800, '\uFD7B', 2801, '\uFD7C', 2802, '\uFD7D', 2802, '\uFD7E', 2803, '\uFD7F', 2804, '\uFD80', 2805, '\uFD81', 2806, '\uFD82', 2807, '\uFD83', 2808, '\uFD84', 2808, '\uFD85', 2809, '\uFD86', 2809, '\uFD87', 2810, '\uFD88', 2810, '\uFD89', 2811, '\uFD8A', 2812, '\uFD8B', 2813, '\uFD8C', 2814, '\uFD8D', 2815, '\uFD8E', 2816, '\uFD8F', 2817, '\uFD92', 2818, '\uFD93', 2819, '\uFD94', 2820, '\uFD95', 2821, '\uFD96', 2822, '\uFD97', 2823, '\uFD98', 2823, '\uFD99', 2824, '\uFD9A', 2825, '\uFD9B', 2826, '\uFD9C', 2827, '\uFD9D', 2827, '\uFD9E', 2828, '\uFD9F', 2829, '\uFDA0', 2830, '\uFDA1', 2831, '\uFDA2', 2832, '\uFDA3', 2833, '\uFDA4', 2834, '\uFDA5', 2835, '\uFDA6', 2836, '\uFDA7', 2837, '\uFDA8', 2838, '\uFDA9', 2839, '\uFDAA', 2840, '\uFDAB', 2841, '\uFDAC', 2842, '\uFDAD', 2843, '\uFDAE', 2844, '\uFDAF', 2845, '\uFDB0', 2846, '\uFDB1', 2847, '\uFDB2', 2848, '\uFDB3', 2849, '\uFDB4', 2803, '\uFDB5', 2805, '\uFDB6', 2850, '\uFDB7', 2851, '\uFDB8', 2852, '\uFDB9', 2853, '\uFDBA', 2854, '\uFDBB', 2855, '\uFDBC', 2854, '\uFDBD', 2852, '\uFDBE', 2856, '\uFDBF', 2857, '\uFDC0', 2858, '\uFDC1', 2859, '\uFDC2', 2860, '\uFDC3', 2855, '\uFDC4', 2796, '\uFDC5', 2786, '\uFDC6', 2861, '\uFDC7', 2862, '\uFDF0', 2863, '\uFDF1', 2864, '\uFDF2', 2865, '\uFDF3', 2866, '\uFDF4', 2867, '\uFDF5', 2868, '\uFDF6', 2869, '\uFDF7', 2870, '\uFDF8', 2871, '\uFDF9', 2872, '\uFDFA', 2873, '\uFDFB', 2874, '\uFDFC', 2875, '\uFE10', 2876, '\uFE11', 2877, '\uFE12', 2878, '\uFE13', 2879, '\uFE14', 309, '\uFE15', 2880, '\uFE16', 2881, '\uFE17', 2882, '\uFE18', 2883, '\uFE19', 1036, '\uFE30', 1035, '\uFE31', 2884, '\uFE32', 2885, '\uFE33', 2886, '\uFE34', 2886, '\uFE35', 1057, '\uFE36', 1058, '\uFE37', 2887, '\uFE38', 2888, '\uFE39', 2889, '\uFE3A', 2890, '\uFE3B', 2891, '\uFE3C', 2892, '\uFE3D', 2893, '\uFE3E', 2894, '\uFE3F', 1167, '\uFE40', 1168, '\uFE41', 2895, '\uFE42', 2896, '\uFE43', 2897, '\uFE44', 2898, '\uFE47', 2899, '\uFE48', 2900, '\uFE49', 1042, '\uFE4A', 1042, '\uFE4B', 1042, '\uFE4C', 1042, '\uFE4D', 2886, '\uFE4E', 2886, '\uFE4F', 2886, '\uFE50', 2876, '\uFE51', 2877, '\uFE52', 1034, '\uFE54', 309, '\uFE55', 2879, '\uFE56', 2881, '\uFE57', 2880, '\uFE58', 2884, '\uFE59', 1057, '\uFE5A', 1058, '\uFE5B', 2887, '\uFE5C', 2888, '\uFE5D', 2889, '\uFE5E', 2890, '\uFE5F', 2901, '\uFE60', 2902, '\uFE61', 2903, '\uFE62', 1054, '\uFE63', 2904, '\uFE64', 2905, '\uFE65', 2906, '\uFE66', 1056, '\uFE68', 2907, '\uFE69', 2908, '\uFE6A', 2909, '\uFE6B', 2910, '\uFE70', 2911, '\uFE71', 2912, '\uFE72', 2913, '\uFE74', 2914, '\uFE76', 2915, '\uFE77', 2916, '\uFE78', 2917, '\uFE79', 2918, '\uFE7A', 2919, '\uFE7B', 2920, '\uFE7C', 2921, '\uFE7D', 2922, '\uFE7E', 2923, '\uFE7F', 2924, '\uFE80', 2925, '\uFE81', 396, '\uFE82', 396, '\uFE83', 397, '\uFE84', 397, '\uFE85', 398, '\uFE86', 398, '\uFE87', 399, '\uFE88', 399, '\uFE89', 400, '\uFE8A', 400, '\uFE8B', 400, '\uFE8C', 400, '\uFE8D', 2926, '\uFE8E', 2926, '\uFE8F', 2927, '\uFE90', 2927, '\uFE91', 2927, '\uFE92', 2927, '\uFE93', 2928, '\uFE94', 2928, '\uFE95', 2929, '\uFE96', 2929, '\uFE97', 2929, '\uFE98', 2929, '\uFE99', 2930, '\uFE9A', 2930, '\uFE9B', 2930, '\uFE9C', 2930, '\uFE9D', 2931, '\uFE9E', 2931, '\uFE9F', 2931, '\uFEA0', 2931, '\uFEA1', 2932, '\uFEA2', 2932, '\uFEA3', 2932, '\uFEA4', 2932, '\uFEA5', 2933, '\uFEA6', 2933, '\uFEA7', 2933, '\uFEA8', 2933, '\uFEA9', 2934, '\uFEAA', 2934, '\uFEAB', 2935, '\uFEAC', 2935, '\uFEAD', 2936, '\uFEAE', 2936, '\uFEAF', 2937, '\uFEB0', 2937, '\uFEB1', 2938, '\uFEB2', 2938, '\uFEB3', 2938, '\uFEB4', 2938, '\uFEB5', 2939, '\uFEB6', 2939, '\uFEB7', 2939, '\uFEB8', 2939, '\uFEB9', 2940, '\uFEBA', 2940, '\uFEBB', 2940, '\uFEBC', 2940, '\uFEBD', 2941, '\uFEBE', 2941, '\uFEBF', 2941, '\uFEC0', 2941, '\uFEC1', 2942, '\uFEC2', 2942, '\uFEC3', 2942, '\uFEC4', 2942, '\uFEC5', 2943, '\uFEC6', 2943, '\uFEC7', 2943, '\uFEC8', 2943, '\uFEC9', 2944, '\uFECA', 2944, '\uFECB', 2944, '\uFECC', 2944, '\uFECD', 2945, '\uFECE', 2945, '\uFECF', 2945, '\uFED0', 2945, '\uFED1', 2946, '\uFED2', 2946, '\uFED3', 2946, '\uFED4', 2946, '\uFED5', 2947, '\uFED6', 2947, '\uFED7', 2947, '\uFED8', 2947, '\uFED9', 2948, '\uFEDA', 2948, '\uFEDB', 2948, '\uFEDC', 2948, '\uFEDD', 2949, '\uFEDE', 2949, '\uFEDF', 2949, '\uFEE0', 2949, '\uFEE1', 2950, '\uFEE2', 2950, '\uFEE3', 2950, '\uFEE4', 2950, '\uFEE5', 2951, '\uFEE6', 2951, '\uFEE7', 2951, '\uFEE8', 2951, '\uFEE9', 2952, '\uFEEA', 2952, '\uFEEB', 2952, '\uFEEC', 2952, '\uFEED', 2953, '\uFEEE', 2953, '\uFEEF', 2597, '\uFEF0', 2597, '\uFEF1', 2954, '\uFEF2', 2954, '\uFEF3', 2954, '\uFEF4', 2954, '\uFEF5', 2955, '\uFEF6', 2955, '\uFEF7', 2956, '\uFEF8', 2956, '\uFEF9', 2957, '\uFEFA', 2957, '\uFEFB', 2958, '\uFEFC', 2958, '\uFF01', 2880, '\uFF02', 2959, '\uFF03', 2901, '\uFF04', 2908, '\uFF05', 2909, '\uFF06', 2902, '\uFF07', 2960, '\uFF08', 1057, '\uFF09', 1058, '\uFF0A', 2903, '\uFF0B', 1054, '\uFF0C', 2876, '\uFF0D', 2904, '\uFF0E', 1034, '\uFF0F', 2961, '\uFF10', 1047, '\uFF11', 9, '\uFF12', 4, '\uFF13', 5, '\uFF14', 1048, '\uFF15', 1049, '\uFF16', 1050, '\uFF17', 1051, '\uFF18', 1052, '\uFF19', 1053, '\uFF1A', 2879, '\uFF1B', 309, '\uFF1C', 2905, '\uFF1D', 1056, '\uFF1E', 2906, '\uFF1F', 2881, '\uFF20', 2910, '\uFF21', 489, '\uFF22', 491, '\uFF23', 1063, '\uFF24', 492, '\uFF25', 493, '\uFF26', 1077, '\uFF27', 495, '\uFF28', 496, '\uFF29', 497, '\uFF2A', 498, '\uFF2B', 499, '\uFF2C', 500, '\uFF2D', 501, '\uFF2E', 502, '\uFF2F', 503, '\uFF30', 505, '\uFF31', 1071, '\uFF32', 506, '\uFF33', 1246, '\uFF34', 507, '\uFF35', 508, '\uFF36', 1102, '\uFF37', 509, '\uFF38', 1107, '\uFF39', 1247, '\uFF3A', 1075, '\uFF3B', 2899, '\uFF3C', 2907, '\uFF3D', 2900, '\uFF3E', 2962, '\uFF3F', 2886, '\uFF40', 1022, '\uFF41', 2, '\uFF42', 513, '\uFF43', 539, '\uFF44', 514, '\uFF45', 515, '\uFF46', 542, '\uFF47', 519, '\uFF48', 284, '\uFF49', 536, '\uFF4A', 286, '\uFF4B', 520, '\uFF4C', 300, '\uFF4D', 521, '\uFF4E', 1059, '\uFF4F', 10, '\uFF50', 526, '\uFF51', 1248, '\uFF52', 287, '\uFF53', 180, '\uFF54', 527, '\uFF55', 528, '\uFF56', 531, '\uFF57', 291, '\uFF58', 301, '\uFF59', 292, '\uFF5A', 569, '\uFF5B', 2887, '\uFF5C', 2963, '\uFF5D', 2888, '\uFF5E', 2964, '\uFF5F', 2965, '\uFF60', 2966, '\uFF61', 2878, '\uFF62', 2895, '\uFF63', 2896, '\uFF64', 2877, '\uFF65', 2967, '\uFF66', 1849, '\uFF67', 2968, '\uFF68', 2969, '\uFF69', 2970, '\uFF6A', 2971, '\uFF6B', 2972, '\uFF6C', 2973, '\uFF6D', 2974, '\uFF6E', 2975, '\uFF6F', 2976, '\uFF70', 2977, '\uFF71', 1803, '\uFF72', 1804, '\uFF73', 1805, '\uFF74', 1806, '\uFF75', 1807, '\uFF76', 1808, '\uFF77', 1809, '\uFF78', 1810, '\uFF79', 1811, '\uFF7A', 1812, '\uFF7B', 1813, '\uFF7C', 1814, '\uFF7D', 1815, '\uFF7E', 1816, '\uFF7F', 1817, '\uFF80', 1818, '\uFF81', 1819, '\uFF82', 1820, '\uFF83', 1821, '\uFF84', 1822, '\uFF85', 1823, '\uFF86', 1824, '\uFF87', 1825, '\uFF88', 1826, '\uFF89', 1827, '\uFF8A', 1828, '\uFF8B', 1829, '\uFF8C', 1830, '\uFF8D', 1831, '\uFF8E', 1832, '\uFF8F', 1833, '\uFF90', 1834, '\uFF91', 1835, '\uFF92', 1836, '\uFF93', 1837, '\uFF94', 1838, '\uFF95', 1839, '\uFF96', 1840, '\uFF97', 1841, '\uFF98', 1842, '\uFF99', 1843, '\uFF9A', 1844, '\uFF9B', 1845, '\uFF9C', 1846, '\uFF9D', 2978, '\uFF9E', 2979, '\uFF9F', 2980, '\uFFA0', 1587, '\uFFA1', 1536, '\uFFA2', 1537, '\uFFA3', 1538, '\uFFA4', 1539, '\uFFA5', 1540, '\uFFA6', 1541, '\uFFA7', 1542, '\uFFA8', 1543, '\uFFA9', 1544, '\uFFAA', 1545, '\uFFAB', 1546, '\uFFAC', 1547, '\uFFAD', 1548, '\uFFAE', 1549, '\uFFAF', 1550, '\uFFB0', 1551, '\uFFB1', 1552, '\uFFB2', 1553, '\uFFB3', 1554, '\uFFB4', 1555, '\uFFB5', 1556, '\uFFB6', 1557, '\uFFB7', 1558, '\uFFB8', 1559, '\uFFB9', 1560, '\uFFBA', 1561, '\uFFBB', 1562, '\uFFBC', 1563, '\uFFBD', 1564, '\uFFBE', 1565, '\uFFC2', 1566, '\uFFC3', 1567, '\uFFC4', 1568, '\uFFC5', 1569, '\uFFC6', 1570, '\uFFC7', 1571, '\uFFCA', 1572, '\uFFCB', 1573, '\uFFCC', 1574, '\uFFCD', 1575, '\uFFCE', 1576, '\uFFCF', 1577, '\uFFD2', 1578, '\uFFD3', 1579, '\uFFD4', 1580, '\uFFD5', 1581, '\uFFD6', 1582, '\uFFD7', 1583, '\uFFDA', 1584, '\uFFDB', 1585, '\uFFDC', 1586, '\uFFE0', 2981, '\uFFE1', 2982, '\uFFE2', 2983, '\uFFE3', 3, '\uFFE4', 2984, '\uFFE5', 2985, '\uFFE6', 2986, '\uFFE8', 2987, '\uFFE9', 2988, '\uFFEA', 2989, '\uFFEB', 2990, '\uFFEC', 2991, '\uFFED', 2992, '\uFFEE', 2993, }; } }smuxi-1.1/lib/agsxmpp/agsxmpp/Idn/DecompositionMappings.cs0000644000175000017500000017111012204443225024575 0ustar00meebeymeebey00000000000000// Do not edit !!! // this file is generated automatically namespace agsXMPP.Idn { public class DecompositionMappings { public static readonly string[] m = new string[] { "\u0020", "\u0020\u0308", "\u0061", "\u0020\u0304", "\u0032", "\u0033", "\u0020\u0301", "\u03BC", "\u0020\u0327", "\u0031", "\u006F", "\u0031\u2044\u0034", "\u0031\u2044\u0032", "\u0033\u2044\u0034", "\u0041\u0300", "\u0041\u0301", "\u0041\u0302", "\u0041\u0303", "\u0041\u0308", "\u0041\u030A", "\u0043\u0327", "\u0045\u0300", "\u0045\u0301", "\u0045\u0302", "\u0045\u0308", "\u0049\u0300", "\u0049\u0301", "\u0049\u0302", "\u0049\u0308", "\u004E\u0303", "\u004F\u0300", "\u004F\u0301", "\u004F\u0302", "\u004F\u0303", "\u004F\u0308", "\u0055\u0300", "\u0055\u0301", "\u0055\u0302", "\u0055\u0308", "\u0059\u0301", "\u0061\u0300", "\u0061\u0301", "\u0061\u0302", "\u0061\u0303", "\u0061\u0308", "\u0061\u030A", "\u0063\u0327", "\u0065\u0300", "\u0065\u0301", "\u0065\u0302", "\u0065\u0308", "\u0069\u0300", "\u0069\u0301", "\u0069\u0302", "\u0069\u0308", "\u006E\u0303", "\u006F\u0300", "\u006F\u0301", "\u006F\u0302", "\u006F\u0303", "\u006F\u0308", "\u0075\u0300", "\u0075\u0301", "\u0075\u0302", "\u0075\u0308", "\u0079\u0301", "\u0079\u0308", "\u0041\u0304", "\u0061\u0304", "\u0041\u0306", "\u0061\u0306", "\u0041\u0328", "\u0061\u0328", "\u0043\u0301", "\u0063\u0301", "\u0043\u0302", "\u0063\u0302", "\u0043\u0307", "\u0063\u0307", "\u0043\u030C", "\u0063\u030C", "\u0044\u030C", "\u0064\u030C", "\u0045\u0304", "\u0065\u0304", "\u0045\u0306", "\u0065\u0306", "\u0045\u0307", "\u0065\u0307", "\u0045\u0328", "\u0065\u0328", "\u0045\u030C", "\u0065\u030C", "\u0047\u0302", "\u0067\u0302", "\u0047\u0306", "\u0067\u0306", "\u0047\u0307", "\u0067\u0307", "\u0047\u0327", "\u0067\u0327", "\u0048\u0302", "\u0068\u0302", "\u0049\u0303", "\u0069\u0303", "\u0049\u0304", "\u0069\u0304", "\u0049\u0306", "\u0069\u0306", "\u0049\u0328", "\u0069\u0328", "\u0049\u0307", "\u0049\u004A", "\u0069\u006A", "\u004A\u0302", "\u006A\u0302", "\u004B\u0327", "\u006B\u0327", "\u004C\u0301", "\u006C\u0301", "\u004C\u0327", "\u006C\u0327", "\u004C\u030C", "\u006C\u030C", "\u004C\u00B7", "\u006C\u00B7", "\u004E\u0301", "\u006E\u0301", "\u004E\u0327", "\u006E\u0327", "\u004E\u030C", "\u006E\u030C", "\u02BC\u006E", "\u004F\u0304", "\u006F\u0304", "\u004F\u0306", "\u006F\u0306", "\u004F\u030B", "\u006F\u030B", "\u0052\u0301", "\u0072\u0301", "\u0052\u0327", "\u0072\u0327", "\u0052\u030C", "\u0072\u030C", "\u0053\u0301", "\u0073\u0301", "\u0053\u0302", "\u0073\u0302", "\u0053\u0327", "\u0073\u0327", "\u0053\u030C", "\u0073\u030C", "\u0054\u0327", "\u0074\u0327", "\u0054\u030C", "\u0074\u030C", "\u0055\u0303", "\u0075\u0303", "\u0055\u0304", "\u0075\u0304", "\u0055\u0306", "\u0075\u0306", "\u0055\u030A", "\u0075\u030A", "\u0055\u030B", "\u0075\u030B", "\u0055\u0328", "\u0075\u0328", "\u0057\u0302", "\u0077\u0302", "\u0059\u0302", "\u0079\u0302", "\u0059\u0308", "\u005A\u0301", "\u007A\u0301", "\u005A\u0307", "\u007A\u0307", "\u005A\u030C", "\u007A\u030C", "\u0073", "\u004F\u031B", "\u006F\u031B", "\u0055\u031B", "\u0075\u031B", "\u0044\u005A\u030C", "\u0044\u007A\u030C", "\u0064\u007A\u030C", "\u004C\u004A", "\u004C\u006A", "\u006C\u006A", "\u004E\u004A", "\u004E\u006A", "\u006E\u006A", "\u0041\u030C", "\u0061\u030C", "\u0049\u030C", "\u0069\u030C", "\u004F\u030C", "\u006F\u030C", "\u0055\u030C", "\u0075\u030C", "\u0055\u0308\u0304", "\u0075\u0308\u0304", "\u0055\u0308\u0301", "\u0075\u0308\u0301", "\u0055\u0308\u030C", "\u0075\u0308\u030C", "\u0055\u0308\u0300", "\u0075\u0308\u0300", "\u0041\u0308\u0304", "\u0061\u0308\u0304", "\u0041\u0307\u0304", "\u0061\u0307\u0304", "\u00C6\u0304", "\u00E6\u0304", "\u0047\u030C", "\u0067\u030C", "\u004B\u030C", "\u006B\u030C", "\u004F\u0328", "\u006F\u0328", "\u004F\u0328\u0304", "\u006F\u0328\u0304", "\u01B7\u030C", "\u0292\u030C", "\u006A\u030C", "\u0044\u005A", "\u0044\u007A", "\u0064\u007A", "\u0047\u0301", "\u0067\u0301", "\u004E\u0300", "\u006E\u0300", "\u0041\u030A\u0301", "\u0061\u030A\u0301", "\u00C6\u0301", "\u00E6\u0301", "\u00D8\u0301", "\u00F8\u0301", "\u0041\u030F", "\u0061\u030F", "\u0041\u0311", "\u0061\u0311", "\u0045\u030F", "\u0065\u030F", "\u0045\u0311", "\u0065\u0311", "\u0049\u030F", "\u0069\u030F", "\u0049\u0311", "\u0069\u0311", "\u004F\u030F", "\u006F\u030F", "\u004F\u0311", "\u006F\u0311", "\u0052\u030F", "\u0072\u030F", "\u0052\u0311", "\u0072\u0311", "\u0055\u030F", "\u0075\u030F", "\u0055\u0311", "\u0075\u0311", "\u0053\u0326", "\u0073\u0326", "\u0054\u0326", "\u0074\u0326", "\u0048\u030C", "\u0068\u030C", "\u0041\u0307", "\u0061\u0307", "\u0045\u0327", "\u0065\u0327", "\u004F\u0308\u0304", "\u006F\u0308\u0304", "\u004F\u0303\u0304", "\u006F\u0303\u0304", "\u004F\u0307", "\u006F\u0307", "\u004F\u0307\u0304", "\u006F\u0307\u0304", "\u0059\u0304", "\u0079\u0304", "\u0068", "\u0266", "\u006A", "\u0072", "\u0279", "\u027B", "\u0281", "\u0077", "\u0079", "\u0020\u0306", "\u0020\u0307", "\u0020\u030A", "\u0020\u0328", "\u0020\u0303", "\u0020\u030B", "\u0263", "\u006C", "\u0078", "\u0295", "\u0300", "\u0301", "\u0313", "\u0308\u0301", "\u02B9", "\u0020\u0345", "\u003B", "\u0020\u0308\u0301", "\u0391\u0301", "\u00B7", "\u0395\u0301", "\u0397\u0301", "\u0399\u0301", "\u039F\u0301", "\u03A5\u0301", "\u03A9\u0301", "\u03B9\u0308\u0301", "\u0399\u0308", "\u03A5\u0308", "\u03B1\u0301", "\u03B5\u0301", "\u03B7\u0301", "\u03B9\u0301", "\u03C5\u0308\u0301", "\u03B9\u0308", "\u03C5\u0308", "\u03BF\u0301", "\u03C5\u0301", "\u03C9\u0301", "\u03B2", "\u03B8", "\u03A5", "\u03C6", "\u03C0", "\u03BA", "\u03C1", "\u03C2", "\u0398", "\u03B5", "\u03A3", "\u0415\u0300", "\u0415\u0308", "\u0413\u0301", "\u0406\u0308", "\u041A\u0301", "\u0418\u0300", "\u0423\u0306", "\u0418\u0306", "\u0438\u0306", "\u0435\u0300", "\u0435\u0308", "\u0433\u0301", "\u0456\u0308", "\u043A\u0301", "\u0438\u0300", "\u0443\u0306", "\u0474\u030F", "\u0475\u030F", "\u0416\u0306", "\u0436\u0306", "\u0410\u0306", "\u0430\u0306", "\u0410\u0308", "\u0430\u0308", "\u0415\u0306", "\u0435\u0306", "\u04D8\u0308", "\u04D9\u0308", "\u0416\u0308", "\u0436\u0308", "\u0417\u0308", "\u0437\u0308", "\u0418\u0304", "\u0438\u0304", "\u0418\u0308", "\u0438\u0308", "\u041E\u0308", "\u043E\u0308", "\u04E8\u0308", "\u04E9\u0308", "\u042D\u0308", "\u044D\u0308", "\u0423\u0304", "\u0443\u0304", "\u0423\u0308", "\u0443\u0308", "\u0423\u030B", "\u0443\u030B", "\u0427\u0308", "\u0447\u0308", "\u042B\u0308", "\u044B\u0308", "\u0565\u0582", "\u0627\u0653", "\u0627\u0654", "\u0648\u0654", "\u0627\u0655", "\u064A\u0654", "\u0627\u0674", "\u0648\u0674", "\u06C7\u0674", "\u064A\u0674", "\u06D5\u0654", "\u06C1\u0654", "\u06D2\u0654", "\u0928\u093C", "\u0930\u093C", "\u0933\u093C", "\u0915\u093C", "\u0916\u093C", "\u0917\u093C", "\u091C\u093C", "\u0921\u093C", "\u0922\u093C", "\u092B\u093C", "\u092F\u093C", "\u09C7\u09BE", "\u09C7\u09D7", "\u09A1\u09BC", "\u09A2\u09BC", "\u09AF\u09BC", "\u0A32\u0A3C", "\u0A38\u0A3C", "\u0A16\u0A3C", "\u0A17\u0A3C", "\u0A1C\u0A3C", "\u0A2B\u0A3C", "\u0B47\u0B56", "\u0B47\u0B3E", "\u0B47\u0B57", "\u0B21\u0B3C", "\u0B22\u0B3C", "\u0B92\u0BD7", "\u0BC6\u0BBE", "\u0BC7\u0BBE", "\u0BC6\u0BD7", "\u0C46\u0C56", "\u0CBF\u0CD5", "\u0CC6\u0CD5", "\u0CC6\u0CD6", "\u0CC6\u0CC2", "\u0CC6\u0CC2\u0CD5", "\u0D46\u0D3E", "\u0D47\u0D3E", "\u0D46\u0D57", "\u0DD9\u0DCA", "\u0DD9\u0DCF", "\u0DD9\u0DCF\u0DCA", "\u0DD9\u0DDF", "\u0E4D\u0E32", "\u0ECD\u0EB2", "\u0EAB\u0E99", "\u0EAB\u0EA1", "\u0F0B", "\u0F42\u0FB7", "\u0F4C\u0FB7", "\u0F51\u0FB7", "\u0F56\u0FB7", "\u0F5B\u0FB7", "\u0F40\u0FB5", "\u0F71\u0F72", "\u0F71\u0F74", "\u0FB2\u0F80", "\u0FB2\u0F71\u0F80", "\u0FB3\u0F80", "\u0FB3\u0F71\u0F80", "\u0F71\u0F80", "\u0F92\u0FB7", "\u0F9C\u0FB7", "\u0FA1\u0FB7", "\u0FA6\u0FB7", "\u0FAB\u0FB7", "\u0F90\u0FB5", "\u1025\u102E", "\u10DC", "\u1B05\u1B35", "\u1B07\u1B35", "\u1B09\u1B35", "\u1B0B\u1B35", "\u1B0D\u1B35", "\u1B11\u1B35", "\u1B3A\u1B35", "\u1B3C\u1B35", "\u1B3E\u1B35", "\u1B3F\u1B35", "\u1B42\u1B35", "\u0041", "\u00C6", "\u0042", "\u0044", "\u0045", "\u018E", "\u0047", "\u0048", "\u0049", "\u004A", "\u004B", "\u004C", "\u004D", "\u004E", "\u004F", "\u0222", "\u0050", "\u0052", "\u0054", "\u0055", "\u0057", "\u0250", "\u0251", "\u1D02", "\u0062", "\u0064", "\u0065", "\u0259", "\u025B", "\u025C", "\u0067", "\u006B", "\u006D", "\u014B", "\u0254", "\u1D16", "\u1D17", "\u0070", "\u0074", "\u0075", "\u1D1D", "\u026F", "\u0076", "\u1D25", "\u03B3", "\u03B4", "\u03C7", "\u0069", "\u043D", "\u0252", "\u0063", "\u0255", "\u00F0", "\u0066", "\u025F", "\u0261", "\u0265", "\u0268", "\u0269", "\u026A", "\u1D7B", "\u029D", "\u026D", "\u1D85", "\u029F", "\u0271", "\u0270", "\u0272", "\u0273", "\u0274", "\u0275", "\u0278", "\u0282", "\u0283", "\u01AB", "\u0289", "\u028A", "\u1D1C", "\u028B", "\u028C", "\u007A", "\u0290", "\u0291", "\u0292", "\u0041\u0325", "\u0061\u0325", "\u0042\u0307", "\u0062\u0307", "\u0042\u0323", "\u0062\u0323", "\u0042\u0331", "\u0062\u0331", "\u0043\u0327\u0301", "\u0063\u0327\u0301", "\u0044\u0307", "\u0064\u0307", "\u0044\u0323", "\u0064\u0323", "\u0044\u0331", "\u0064\u0331", "\u0044\u0327", "\u0064\u0327", "\u0044\u032D", "\u0064\u032D", "\u0045\u0304\u0300", "\u0065\u0304\u0300", "\u0045\u0304\u0301", "\u0065\u0304\u0301", "\u0045\u032D", "\u0065\u032D", "\u0045\u0330", "\u0065\u0330", "\u0045\u0327\u0306", "\u0065\u0327\u0306", "\u0046\u0307", "\u0066\u0307", "\u0047\u0304", "\u0067\u0304", "\u0048\u0307", "\u0068\u0307", "\u0048\u0323", "\u0068\u0323", "\u0048\u0308", "\u0068\u0308", "\u0048\u0327", "\u0068\u0327", "\u0048\u032E", "\u0068\u032E", "\u0049\u0330", "\u0069\u0330", "\u0049\u0308\u0301", "\u0069\u0308\u0301", "\u004B\u0301", "\u006B\u0301", "\u004B\u0323", "\u006B\u0323", "\u004B\u0331", "\u006B\u0331", "\u004C\u0323", "\u006C\u0323", "\u004C\u0323\u0304", "\u006C\u0323\u0304", "\u004C\u0331", "\u006C\u0331", "\u004C\u032D", "\u006C\u032D", "\u004D\u0301", "\u006D\u0301", "\u004D\u0307", "\u006D\u0307", "\u004D\u0323", "\u006D\u0323", "\u004E\u0307", "\u006E\u0307", "\u004E\u0323", "\u006E\u0323", "\u004E\u0331", "\u006E\u0331", "\u004E\u032D", "\u006E\u032D", "\u004F\u0303\u0301", "\u006F\u0303\u0301", "\u004F\u0303\u0308", "\u006F\u0303\u0308", "\u004F\u0304\u0300", "\u006F\u0304\u0300", "\u004F\u0304\u0301", "\u006F\u0304\u0301", "\u0050\u0301", "\u0070\u0301", "\u0050\u0307", "\u0070\u0307", "\u0052\u0307", "\u0072\u0307", "\u0052\u0323", "\u0072\u0323", "\u0052\u0323\u0304", "\u0072\u0323\u0304", "\u0052\u0331", "\u0072\u0331", "\u0053\u0307", "\u0073\u0307", "\u0053\u0323", "\u0073\u0323", "\u0053\u0301\u0307", "\u0073\u0301\u0307", "\u0053\u030C\u0307", "\u0073\u030C\u0307", "\u0053\u0323\u0307", "\u0073\u0323\u0307", "\u0054\u0307", "\u0074\u0307", "\u0054\u0323", "\u0074\u0323", "\u0054\u0331", "\u0074\u0331", "\u0054\u032D", "\u0074\u032D", "\u0055\u0324", "\u0075\u0324", "\u0055\u0330", "\u0075\u0330", "\u0055\u032D", "\u0075\u032D", "\u0055\u0303\u0301", "\u0075\u0303\u0301", "\u0055\u0304\u0308", "\u0075\u0304\u0308", "\u0056\u0303", "\u0076\u0303", "\u0056\u0323", "\u0076\u0323", "\u0057\u0300", "\u0077\u0300", "\u0057\u0301", "\u0077\u0301", "\u0057\u0308", "\u0077\u0308", "\u0057\u0307", "\u0077\u0307", "\u0057\u0323", "\u0077\u0323", "\u0058\u0307", "\u0078\u0307", "\u0058\u0308", "\u0078\u0308", "\u0059\u0307", "\u0079\u0307", "\u005A\u0302", "\u007A\u0302", "\u005A\u0323", "\u007A\u0323", "\u005A\u0331", "\u007A\u0331", "\u0068\u0331", "\u0074\u0308", "\u0077\u030A", "\u0079\u030A", "\u0061\u02BE", "\u0041\u0323", "\u0061\u0323", "\u0041\u0309", "\u0061\u0309", "\u0041\u0302\u0301", "\u0061\u0302\u0301", "\u0041\u0302\u0300", "\u0061\u0302\u0300", "\u0041\u0302\u0309", "\u0061\u0302\u0309", "\u0041\u0302\u0303", "\u0061\u0302\u0303", "\u0041\u0323\u0302", "\u0061\u0323\u0302", "\u0041\u0306\u0301", "\u0061\u0306\u0301", "\u0041\u0306\u0300", "\u0061\u0306\u0300", "\u0041\u0306\u0309", "\u0061\u0306\u0309", "\u0041\u0306\u0303", "\u0061\u0306\u0303", "\u0041\u0323\u0306", "\u0061\u0323\u0306", "\u0045\u0323", "\u0065\u0323", "\u0045\u0309", "\u0065\u0309", "\u0045\u0303", "\u0065\u0303", "\u0045\u0302\u0301", "\u0065\u0302\u0301", "\u0045\u0302\u0300", "\u0065\u0302\u0300", "\u0045\u0302\u0309", "\u0065\u0302\u0309", "\u0045\u0302\u0303", "\u0065\u0302\u0303", "\u0045\u0323\u0302", "\u0065\u0323\u0302", "\u0049\u0309", "\u0069\u0309", "\u0049\u0323", "\u0069\u0323", "\u004F\u0323", "\u006F\u0323", "\u004F\u0309", "\u006F\u0309", "\u004F\u0302\u0301", "\u006F\u0302\u0301", "\u004F\u0302\u0300", "\u006F\u0302\u0300", "\u004F\u0302\u0309", "\u006F\u0302\u0309", "\u004F\u0302\u0303", "\u006F\u0302\u0303", "\u004F\u0323\u0302", "\u006F\u0323\u0302", "\u004F\u031B\u0301", "\u006F\u031B\u0301", "\u004F\u031B\u0300", "\u006F\u031B\u0300", "\u004F\u031B\u0309", "\u006F\u031B\u0309", "\u004F\u031B\u0303", "\u006F\u031B\u0303", "\u004F\u031B\u0323", "\u006F\u031B\u0323", "\u0055\u0323", "\u0075\u0323", "\u0055\u0309", "\u0075\u0309", "\u0055\u031B\u0301", "\u0075\u031B\u0301", "\u0055\u031B\u0300", "\u0075\u031B\u0300", "\u0055\u031B\u0309", "\u0075\u031B\u0309", "\u0055\u031B\u0303", "\u0075\u031B\u0303", "\u0055\u031B\u0323", "\u0075\u031B\u0323", "\u0059\u0300", "\u0079\u0300", "\u0059\u0323", "\u0079\u0323", "\u0059\u0309", "\u0079\u0309", "\u0059\u0303", "\u0079\u0303", "\u03B1\u0313", "\u03B1\u0314", "\u03B1\u0313\u0300", "\u03B1\u0314\u0300", "\u03B1\u0313\u0301", "\u03B1\u0314\u0301", "\u03B1\u0313\u0342", "\u03B1\u0314\u0342", "\u0391\u0313", "\u0391\u0314", "\u0391\u0313\u0300", "\u0391\u0314\u0300", "\u0391\u0313\u0301", "\u0391\u0314\u0301", "\u0391\u0313\u0342", "\u0391\u0314\u0342", "\u03B5\u0313", "\u03B5\u0314", "\u03B5\u0313\u0300", "\u03B5\u0314\u0300", "\u03B5\u0313\u0301", "\u03B5\u0314\u0301", "\u0395\u0313", "\u0395\u0314", "\u0395\u0313\u0300", "\u0395\u0314\u0300", "\u0395\u0313\u0301", "\u0395\u0314\u0301", "\u03B7\u0313", "\u03B7\u0314", "\u03B7\u0313\u0300", "\u03B7\u0314\u0300", "\u03B7\u0313\u0301", "\u03B7\u0314\u0301", "\u03B7\u0313\u0342", "\u03B7\u0314\u0342", "\u0397\u0313", "\u0397\u0314", "\u0397\u0313\u0300", "\u0397\u0314\u0300", "\u0397\u0313\u0301", "\u0397\u0314\u0301", "\u0397\u0313\u0342", "\u0397\u0314\u0342", "\u03B9\u0313", "\u03B9\u0314", "\u03B9\u0313\u0300", "\u03B9\u0314\u0300", "\u03B9\u0313\u0301", "\u03B9\u0314\u0301", "\u03B9\u0313\u0342", "\u03B9\u0314\u0342", "\u0399\u0313", "\u0399\u0314", "\u0399\u0313\u0300", "\u0399\u0314\u0300", "\u0399\u0313\u0301", "\u0399\u0314\u0301", "\u0399\u0313\u0342", "\u0399\u0314\u0342", "\u03BF\u0313", "\u03BF\u0314", "\u03BF\u0313\u0300", "\u03BF\u0314\u0300", "\u03BF\u0313\u0301", "\u03BF\u0314\u0301", "\u039F\u0313", "\u039F\u0314", "\u039F\u0313\u0300", "\u039F\u0314\u0300", "\u039F\u0313\u0301", "\u039F\u0314\u0301", "\u03C5\u0313", "\u03C5\u0314", "\u03C5\u0313\u0300", "\u03C5\u0314\u0300", "\u03C5\u0313\u0301", "\u03C5\u0314\u0301", "\u03C5\u0313\u0342", "\u03C5\u0314\u0342", "\u03A5\u0314", "\u03A5\u0314\u0300", "\u03A5\u0314\u0301", "\u03A5\u0314\u0342", "\u03C9\u0313", "\u03C9\u0314", "\u03C9\u0313\u0300", "\u03C9\u0314\u0300", "\u03C9\u0313\u0301", "\u03C9\u0314\u0301", "\u03C9\u0313\u0342", "\u03C9\u0314\u0342", "\u03A9\u0313", "\u03A9\u0314", "\u03A9\u0313\u0300", "\u03A9\u0314\u0300", "\u03A9\u0313\u0301", "\u03A9\u0314\u0301", "\u03A9\u0313\u0342", "\u03A9\u0314\u0342", "\u03B1\u0300", "\u03B5\u0300", "\u03B7\u0300", "\u03B9\u0300", "\u03BF\u0300", "\u03C5\u0300", "\u03C9\u0300", "\u03B1\u0313\u0345", "\u03B1\u0314\u0345", "\u03B1\u0313\u0300\u0345", "\u03B1\u0314\u0300\u0345", "\u03B1\u0313\u0301\u0345", "\u03B1\u0314\u0301\u0345", "\u03B1\u0313\u0342\u0345", "\u03B1\u0314\u0342\u0345", "\u0391\u0313\u0345", "\u0391\u0314\u0345", "\u0391\u0313\u0300\u0345", "\u0391\u0314\u0300\u0345", "\u0391\u0313\u0301\u0345", "\u0391\u0314\u0301\u0345", "\u0391\u0313\u0342\u0345", "\u0391\u0314\u0342\u0345", "\u03B7\u0313\u0345", "\u03B7\u0314\u0345", "\u03B7\u0313\u0300\u0345", "\u03B7\u0314\u0300\u0345", "\u03B7\u0313\u0301\u0345", "\u03B7\u0314\u0301\u0345", "\u03B7\u0313\u0342\u0345", "\u03B7\u0314\u0342\u0345", "\u0397\u0313\u0345", "\u0397\u0314\u0345", "\u0397\u0313\u0300\u0345", "\u0397\u0314\u0300\u0345", "\u0397\u0313\u0301\u0345", "\u0397\u0314\u0301\u0345", "\u0397\u0313\u0342\u0345", "\u0397\u0314\u0342\u0345", "\u03C9\u0313\u0345", "\u03C9\u0314\u0345", "\u03C9\u0313\u0300\u0345", "\u03C9\u0314\u0300\u0345", "\u03C9\u0313\u0301\u0345", "\u03C9\u0314\u0301\u0345", "\u03C9\u0313\u0342\u0345", "\u03C9\u0314\u0342\u0345", "\u03A9\u0313\u0345", "\u03A9\u0314\u0345", "\u03A9\u0313\u0300\u0345", "\u03A9\u0314\u0300\u0345", "\u03A9\u0313\u0301\u0345", "\u03A9\u0314\u0301\u0345", "\u03A9\u0313\u0342\u0345", "\u03A9\u0314\u0342\u0345", "\u03B1\u0306", "\u03B1\u0304", "\u03B1\u0300\u0345", "\u03B1\u0345", "\u03B1\u0301\u0345", "\u03B1\u0342", "\u03B1\u0342\u0345", "\u0391\u0306", "\u0391\u0304", "\u0391\u0300", "\u0391\u0345", "\u0020\u0313", "\u03B9", "\u0020\u0342", "\u0020\u0308\u0342", "\u03B7\u0300\u0345", "\u03B7\u0345", "\u03B7\u0301\u0345", "\u03B7\u0342", "\u03B7\u0342\u0345", "\u0395\u0300", "\u0397\u0300", "\u0397\u0345", "\u0020\u0313\u0300", "\u0020\u0313\u0301", "\u0020\u0313\u0342", "\u03B9\u0306", "\u03B9\u0304", "\u03B9\u0308\u0300", "\u03B9\u0342", "\u03B9\u0308\u0342", "\u0399\u0306", "\u0399\u0304", "\u0399\u0300", "\u0020\u0314\u0300", "\u0020\u0314\u0301", "\u0020\u0314\u0342", "\u03C5\u0306", "\u03C5\u0304", "\u03C5\u0308\u0300", "\u03C1\u0313", "\u03C1\u0314", "\u03C5\u0342", "\u03C5\u0308\u0342", "\u03A5\u0306", "\u03A5\u0304", "\u03A5\u0300", "\u03A1\u0314", "\u0020\u0308\u0300", "\u0060", "\u03C9\u0300\u0345", "\u03C9\u0345", "\u03C9\u0301\u0345", "\u03C9\u0342", "\u03C9\u0342\u0345", "\u039F\u0300", "\u03A9\u0300", "\u03A9\u0345", "\u0020\u0314", "\u2010", "\u0020\u0333", "\u002E", "\u002E\u002E", "\u002E\u002E\u002E", "\u2032\u2032", "\u2032\u2032\u2032", "\u2035\u2035", "\u2035\u2035\u2035", "\u0021\u0021", "\u0020\u0305", "\u003F\u003F", "\u003F\u0021", "\u0021\u003F", "\u2032\u2032\u2032\u2032", "\u0030", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039", "\u002B", "\u2212", "\u003D", "\u0028", "\u0029", "\u006E", "\u0052\u0073", "\u0061\u002F\u0063", "\u0061\u002F\u0073", "\u0043", "\u00B0\u0043", "\u0063\u002F\u006F", "\u0063\u002F\u0075", "\u0190", "\u00B0\u0046", "\u0127", "\u004E\u006F", "\u0051", "\u0053\u004D", "\u0054\u0045\u004C", "\u0054\u004D", "\u005A", "\u03A9", "\u0046", "\u05D0", "\u05D1", "\u05D2", "\u05D3", "\u0046\u0041\u0058", "\u0393", "\u03A0", "\u2211", "\u0031\u2044\u0033", "\u0032\u2044\u0033", "\u0031\u2044\u0035", "\u0032\u2044\u0035", "\u0033\u2044\u0035", "\u0034\u2044\u0035", "\u0031\u2044\u0036", "\u0035\u2044\u0036", "\u0031\u2044\u0038", "\u0033\u2044\u0038", "\u0035\u2044\u0038", "\u0037\u2044\u0038", "\u0031\u2044", "\u0049\u0049", "\u0049\u0049\u0049", "\u0049\u0056", "\u0056", "\u0056\u0049", "\u0056\u0049\u0049", "\u0056\u0049\u0049\u0049", "\u0049\u0058", "\u0058", "\u0058\u0049", "\u0058\u0049\u0049", "\u0069\u0069", "\u0069\u0069\u0069", "\u0069\u0076", "\u0076\u0069", "\u0076\u0069\u0069", "\u0076\u0069\u0069\u0069", "\u0069\u0078", "\u0078\u0069", "\u0078\u0069\u0069", "\u2190\u0338", "\u2192\u0338", "\u2194\u0338", "\u21D0\u0338", "\u21D4\u0338", "\u21D2\u0338", "\u2203\u0338", "\u2208\u0338", "\u220B\u0338", "\u2223\u0338", "\u2225\u0338", "\u222B\u222B", "\u222B\u222B\u222B", "\u222E\u222E", "\u222E\u222E\u222E", "\u223C\u0338", "\u2243\u0338", "\u2245\u0338", "\u2248\u0338", "\u003D\u0338", "\u2261\u0338", "\u224D\u0338", "\u003C\u0338", "\u003E\u0338", "\u2264\u0338", "\u2265\u0338", "\u2272\u0338", "\u2273\u0338", "\u2276\u0338", "\u2277\u0338", "\u227A\u0338", "\u227B\u0338", "\u2282\u0338", "\u2283\u0338", "\u2286\u0338", "\u2287\u0338", "\u22A2\u0338", "\u22A8\u0338", "\u22A9\u0338", "\u22AB\u0338", "\u227C\u0338", "\u227D\u0338", "\u2291\u0338", "\u2292\u0338", "\u22B2\u0338", "\u22B3\u0338", "\u22B4\u0338", "\u22B5\u0338", "\u3008", "\u3009", "\u0031\u0030", "\u0031\u0031", "\u0031\u0032", "\u0031\u0033", "\u0031\u0034", "\u0031\u0035", "\u0031\u0036", "\u0031\u0037", "\u0031\u0038", "\u0031\u0039", "\u0032\u0030", "\u0028\u0031\u0029", "\u0028\u0032\u0029", "\u0028\u0033\u0029", "\u0028\u0034\u0029", "\u0028\u0035\u0029", "\u0028\u0036\u0029", "\u0028\u0037\u0029", "\u0028\u0038\u0029", "\u0028\u0039\u0029", "\u0028\u0031\u0030\u0029", "\u0028\u0031\u0031\u0029", "\u0028\u0031\u0032\u0029", "\u0028\u0031\u0033\u0029", "\u0028\u0031\u0034\u0029", "\u0028\u0031\u0035\u0029", "\u0028\u0031\u0036\u0029", "\u0028\u0031\u0037\u0029", "\u0028\u0031\u0038\u0029", "\u0028\u0031\u0039\u0029", "\u0028\u0032\u0030\u0029", "\u0031\u002E", "\u0032\u002E", "\u0033\u002E", "\u0034\u002E", "\u0035\u002E", "\u0036\u002E", "\u0037\u002E", "\u0038\u002E", "\u0039\u002E", "\u0031\u0030\u002E", "\u0031\u0031\u002E", "\u0031\u0032\u002E", "\u0031\u0033\u002E", "\u0031\u0034\u002E", "\u0031\u0035\u002E", "\u0031\u0036\u002E", "\u0031\u0037\u002E", "\u0031\u0038\u002E", "\u0031\u0039\u002E", "\u0032\u0030\u002E", "\u0028\u0061\u0029", "\u0028\u0062\u0029", "\u0028\u0063\u0029", "\u0028\u0064\u0029", "\u0028\u0065\u0029", "\u0028\u0066\u0029", "\u0028\u0067\u0029", "\u0028\u0068\u0029", "\u0028\u0069\u0029", "\u0028\u006A\u0029", "\u0028\u006B\u0029", "\u0028\u006C\u0029", "\u0028\u006D\u0029", "\u0028\u006E\u0029", "\u0028\u006F\u0029", "\u0028\u0070\u0029", "\u0028\u0071\u0029", "\u0028\u0072\u0029", "\u0028\u0073\u0029", "\u0028\u0074\u0029", "\u0028\u0075\u0029", "\u0028\u0076\u0029", "\u0028\u0077\u0029", "\u0028\u0078\u0029", "\u0028\u0079\u0029", "\u0028\u007A\u0029", "\u0053", "\u0059", "\u0071", "\u222B\u222B\u222B\u222B", "\u003A\u003A\u003D", "\u003D\u003D", "\u003D\u003D\u003D", "\u2ADD\u0338", "\u2D61", "\u6BCD", "\u9F9F", "\u4E00", "\u4E28", "\u4E36", "\u4E3F", "\u4E59", "\u4E85", "\u4E8C", "\u4EA0", "\u4EBA", "\u513F", "\u5165", "\u516B", "\u5182", "\u5196", "\u51AB", "\u51E0", "\u51F5", "\u5200", "\u529B", "\u52F9", "\u5315", "\u531A", "\u5338", "\u5341", "\u535C", "\u5369", "\u5382", "\u53B6", "\u53C8", "\u53E3", "\u56D7", "\u571F", "\u58EB", "\u5902", "\u590A", "\u5915", "\u5927", "\u5973", "\u5B50", "\u5B80", "\u5BF8", "\u5C0F", "\u5C22", "\u5C38", "\u5C6E", "\u5C71", "\u5DDB", "\u5DE5", "\u5DF1", "\u5DFE", "\u5E72", "\u5E7A", "\u5E7F", "\u5EF4", "\u5EFE", "\u5F0B", "\u5F13", "\u5F50", "\u5F61", "\u5F73", "\u5FC3", "\u6208", "\u6236", "\u624B", "\u652F", "\u6534", "\u6587", "\u6597", "\u65A4", "\u65B9", "\u65E0", "\u65E5", "\u66F0", "\u6708", "\u6728", "\u6B20", "\u6B62", "\u6B79", "\u6BB3", "\u6BCB", "\u6BD4", "\u6BDB", "\u6C0F", "\u6C14", "\u6C34", "\u706B", "\u722A", "\u7236", "\u723B", "\u723F", "\u7247", "\u7259", "\u725B", "\u72AC", "\u7384", "\u7389", "\u74DC", "\u74E6", "\u7518", "\u751F", "\u7528", "\u7530", "\u758B", "\u7592", "\u7676", "\u767D", "\u76AE", "\u76BF", "\u76EE", "\u77DB", "\u77E2", "\u77F3", "\u793A", "\u79B8", "\u79BE", "\u7A74", "\u7ACB", "\u7AF9", "\u7C73", "\u7CF8", "\u7F36", "\u7F51", "\u7F8A", "\u7FBD", "\u8001", "\u800C", "\u8012", "\u8033", "\u807F", "\u8089", "\u81E3", "\u81EA", "\u81F3", "\u81FC", "\u820C", "\u821B", "\u821F", "\u826E", "\u8272", "\u8278", "\u864D", "\u866B", "\u8840", "\u884C", "\u8863", "\u897E", "\u898B", "\u89D2", "\u8A00", "\u8C37", "\u8C46", "\u8C55", "\u8C78", "\u8C9D", "\u8D64", "\u8D70", "\u8DB3", "\u8EAB", "\u8ECA", "\u8F9B", "\u8FB0", "\u8FB5", "\u9091", "\u9149", "\u91C6", "\u91CC", "\u91D1", "\u9577", "\u9580", "\u961C", "\u96B6", "\u96B9", "\u96E8", "\u9751", "\u975E", "\u9762", "\u9769", "\u97CB", "\u97ED", "\u97F3", "\u9801", "\u98A8", "\u98DB", "\u98DF", "\u9996", "\u9999", "\u99AC", "\u9AA8", "\u9AD8", "\u9ADF", "\u9B25", "\u9B2F", "\u9B32", "\u9B3C", "\u9B5A", "\u9CE5", "\u9E75", "\u9E7F", "\u9EA5", "\u9EBB", "\u9EC3", "\u9ECD", "\u9ED1", "\u9EF9", "\u9EFD", "\u9F0E", "\u9F13", "\u9F20", "\u9F3B", "\u9F4A", "\u9F52", "\u9F8D", "\u9F9C", "\u9FA0", "\u3012", "\u5344", "\u5345", "\u304B\u3099", "\u304D\u3099", "\u304F\u3099", "\u3051\u3099", "\u3053\u3099", "\u3055\u3099", "\u3057\u3099", "\u3059\u3099", "\u305B\u3099", "\u305D\u3099", "\u305F\u3099", "\u3061\u3099", "\u3064\u3099", "\u3066\u3099", "\u3068\u3099", "\u306F\u3099", "\u306F\u309A", "\u3072\u3099", "\u3072\u309A", "\u3075\u3099", "\u3075\u309A", "\u3078\u3099", "\u3078\u309A", "\u307B\u3099", "\u307B\u309A", "\u3046\u3099", "\u0020\u3099", "\u0020\u309A", "\u309D\u3099", "\u3088\u308A", "\u30AB\u3099", "\u30AD\u3099", "\u30AF\u3099", "\u30B1\u3099", "\u30B3\u3099", "\u30B5\u3099", "\u30B7\u3099", "\u30B9\u3099", "\u30BB\u3099", "\u30BD\u3099", "\u30BF\u3099", "\u30C1\u3099", "\u30C4\u3099", "\u30C6\u3099", "\u30C8\u3099", "\u30CF\u3099", "\u30CF\u309A", "\u30D2\u3099", "\u30D2\u309A", "\u30D5\u3099", "\u30D5\u309A", "\u30D8\u3099", "\u30D8\u309A", "\u30DB\u3099", "\u30DB\u309A", "\u30A6\u3099", "\u30EF\u3099", "\u30F0\u3099", "\u30F1\u3099", "\u30F2\u3099", "\u30FD\u3099", "\u30B3\u30C8", "\u1100", "\u1101", "\u11AA", "\u1102", "\u11AC", "\u11AD", "\u1103", "\u1104", "\u1105", "\u11B0", "\u11B1", "\u11B2", "\u11B3", "\u11B4", "\u11B5", "\u111A", "\u1106", "\u1107", "\u1108", "\u1121", "\u1109", "\u110A", "\u110B", "\u110C", "\u110D", "\u110E", "\u110F", "\u1110", "\u1111", "\u1112", "\u1161", "\u1162", "\u1163", "\u1164", "\u1165", "\u1166", "\u1167", "\u1168", "\u1169", "\u116A", "\u116B", "\u116C", "\u116D", "\u116E", "\u116F", "\u1170", "\u1171", "\u1172", "\u1173", "\u1174", "\u1175", "\u1160", "\u1114", "\u1115", "\u11C7", "\u11C8", "\u11CC", "\u11CE", "\u11D3", "\u11D7", "\u11D9", "\u111C", "\u11DD", "\u11DF", "\u111D", "\u111E", "\u1120", "\u1122", "\u1123", "\u1127", "\u1129", "\u112B", "\u112C", "\u112D", "\u112E", "\u112F", "\u1132", "\u1136", "\u1140", "\u1147", "\u114C", "\u11F1", "\u11F2", "\u1157", "\u1158", "\u1159", "\u1184", "\u1185", "\u1188", "\u1191", "\u1192", "\u1194", "\u119E", "\u11A1", "\u4E09", "\u56DB", "\u4E0A", "\u4E2D", "\u4E0B", "\u7532", "\u4E19", "\u4E01", "\u5929", "\u5730", "\u0028\u1100\u0029", "\u0028\u1102\u0029", "\u0028\u1103\u0029", "\u0028\u1105\u0029", "\u0028\u1106\u0029", "\u0028\u1107\u0029", "\u0028\u1109\u0029", "\u0028\u110B\u0029", "\u0028\u110C\u0029", "\u0028\u110E\u0029", "\u0028\u110F\u0029", "\u0028\u1110\u0029", "\u0028\u1111\u0029", "\u0028\u1112\u0029", "\u0028\u1100\u1161\u0029", "\u0028\u1102\u1161\u0029", "\u0028\u1103\u1161\u0029", "\u0028\u1105\u1161\u0029", "\u0028\u1106\u1161\u0029", "\u0028\u1107\u1161\u0029", "\u0028\u1109\u1161\u0029", "\u0028\u110B\u1161\u0029", "\u0028\u110C\u1161\u0029", "\u0028\u110E\u1161\u0029", "\u0028\u110F\u1161\u0029", "\u0028\u1110\u1161\u0029", "\u0028\u1111\u1161\u0029", "\u0028\u1112\u1161\u0029", "\u0028\u110C\u116E\u0029", "\u0028\u110B\u1169\u110C\u1165\u11AB\u0029", "\u0028\u110B\u1169\u1112\u116E\u0029", "\u0028\u4E00\u0029", "\u0028\u4E8C\u0029", "\u0028\u4E09\u0029", "\u0028\u56DB\u0029", "\u0028\u4E94\u0029", "\u0028\u516D\u0029", "\u0028\u4E03\u0029", "\u0028\u516B\u0029", "\u0028\u4E5D\u0029", "\u0028\u5341\u0029", "\u0028\u6708\u0029", "\u0028\u706B\u0029", "\u0028\u6C34\u0029", "\u0028\u6728\u0029", "\u0028\u91D1\u0029", "\u0028\u571F\u0029", "\u0028\u65E5\u0029", "\u0028\u682A\u0029", "\u0028\u6709\u0029", "\u0028\u793E\u0029", "\u0028\u540D\u0029", "\u0028\u7279\u0029", "\u0028\u8CA1\u0029", "\u0028\u795D\u0029", "\u0028\u52B4\u0029", "\u0028\u4EE3\u0029", "\u0028\u547C\u0029", "\u0028\u5B66\u0029", "\u0028\u76E3\u0029", "\u0028\u4F01\u0029", "\u0028\u8CC7\u0029", "\u0028\u5354\u0029", "\u0028\u796D\u0029", "\u0028\u4F11\u0029", "\u0028\u81EA\u0029", "\u0028\u81F3\u0029", "\u0050\u0054\u0045", "\u0032\u0031", "\u0032\u0032", "\u0032\u0033", "\u0032\u0034", "\u0032\u0035", "\u0032\u0036", "\u0032\u0037", "\u0032\u0038", "\u0032\u0039", "\u0033\u0030", "\u0033\u0031", "\u0033\u0032", "\u0033\u0033", "\u0033\u0034", "\u0033\u0035", "\u1100\u1161", "\u1102\u1161", "\u1103\u1161", "\u1105\u1161", "\u1106\u1161", "\u1107\u1161", "\u1109\u1161", "\u110B\u1161", "\u110C\u1161", "\u110E\u1161", "\u110F\u1161", "\u1110\u1161", "\u1111\u1161", "\u1112\u1161", "\u110E\u1161\u11B7\u1100\u1169", "\u110C\u116E\u110B\u1174", "\u110B\u116E", "\u4E94", "\u516D", "\u4E03", "\u4E5D", "\u682A", "\u6709", "\u793E", "\u540D", "\u7279", "\u8CA1", "\u795D", "\u52B4", "\u79D8", "\u7537", "\u9069", "\u512A", "\u5370", "\u6CE8", "\u9805", "\u4F11", "\u5199", "\u6B63", "\u5DE6", "\u53F3", "\u533B", "\u5B97", "\u5B66", "\u76E3", "\u4F01", "\u8CC7", "\u5354", "\u591C", "\u0033\u0036", "\u0033\u0037", "\u0033\u0038", "\u0033\u0039", "\u0034\u0030", "\u0034\u0031", "\u0034\u0032", "\u0034\u0033", "\u0034\u0034", "\u0034\u0035", "\u0034\u0036", "\u0034\u0037", "\u0034\u0038", "\u0034\u0039", "\u0035\u0030", "\u0031\u6708", "\u0032\u6708", "\u0033\u6708", "\u0034\u6708", "\u0035\u6708", "\u0036\u6708", "\u0037\u6708", "\u0038\u6708", "\u0039\u6708", "\u0031\u0030\u6708", "\u0031\u0031\u6708", "\u0031\u0032\u6708", "\u0048\u0067", "\u0065\u0072\u0067", "\u0065\u0056", "\u004C\u0054\u0044", "\u30A2", "\u30A4", "\u30A6", "\u30A8", "\u30AA", "\u30AB", "\u30AD", "\u30AF", "\u30B1", "\u30B3", "\u30B5", "\u30B7", "\u30B9", "\u30BB", "\u30BD", "\u30BF", "\u30C1", "\u30C4", "\u30C6", "\u30C8", "\u30CA", "\u30CB", "\u30CC", "\u30CD", "\u30CE", "\u30CF", "\u30D2", "\u30D5", "\u30D8", "\u30DB", "\u30DE", "\u30DF", "\u30E0", "\u30E1", "\u30E2", "\u30E4", "\u30E6", "\u30E8", "\u30E9", "\u30EA", "\u30EB", "\u30EC", "\u30ED", "\u30EF", "\u30F0", "\u30F1", "\u30F2", "\u30A2\u30CF\u309A\u30FC\u30C8", "\u30A2\u30EB\u30D5\u30A1", "\u30A2\u30F3\u30D8\u309A\u30A2", "\u30A2\u30FC\u30EB", "\u30A4\u30CB\u30F3\u30AF\u3099", "\u30A4\u30F3\u30C1", "\u30A6\u30A9\u30F3", "\u30A8\u30B9\u30AF\u30FC\u30C8\u3099", "\u30A8\u30FC\u30AB\u30FC", "\u30AA\u30F3\u30B9", "\u30AA\u30FC\u30E0", "\u30AB\u30A4\u30EA", "\u30AB\u30E9\u30C3\u30C8", "\u30AB\u30ED\u30EA\u30FC", "\u30AB\u3099\u30ED\u30F3", "\u30AB\u3099\u30F3\u30DE", "\u30AD\u3099\u30AB\u3099", "\u30AD\u3099\u30CB\u30FC", "\u30AD\u30E5\u30EA\u30FC", "\u30AD\u3099\u30EB\u30BF\u3099\u30FC", "\u30AD\u30ED", "\u30AD\u30ED\u30AF\u3099\u30E9\u30E0", "\u30AD\u30ED\u30E1\u30FC\u30C8\u30EB", "\u30AD\u30ED\u30EF\u30C3\u30C8", "\u30AF\u3099\u30E9\u30E0", "\u30AF\u3099\u30E9\u30E0\u30C8\u30F3", "\u30AF\u30EB\u30BB\u3099\u30A4\u30ED", "\u30AF\u30ED\u30FC\u30CD", "\u30B1\u30FC\u30B9", "\u30B3\u30EB\u30CA", "\u30B3\u30FC\u30DB\u309A", "\u30B5\u30A4\u30AF\u30EB", "\u30B5\u30F3\u30C1\u30FC\u30E0", "\u30B7\u30EA\u30F3\u30AF\u3099", "\u30BB\u30F3\u30C1", "\u30BB\u30F3\u30C8", "\u30BF\u3099\u30FC\u30B9", "\u30C6\u3099\u30B7", "\u30C8\u3099\u30EB", "\u30C8\u30F3", "\u30CA\u30CE", "\u30CE\u30C3\u30C8", "\u30CF\u30A4\u30C4", "\u30CF\u309A\u30FC\u30BB\u30F3\u30C8", "\u30CF\u309A\u30FC\u30C4", "\u30CF\u3099\u30FC\u30EC\u30EB", "\u30D2\u309A\u30A2\u30B9\u30C8\u30EB", "\u30D2\u309A\u30AF\u30EB", "\u30D2\u309A\u30B3", "\u30D2\u3099\u30EB", "\u30D5\u30A1\u30E9\u30C3\u30C8\u3099", "\u30D5\u30A3\u30FC\u30C8", "\u30D5\u3099\u30C3\u30B7\u30A7\u30EB", "\u30D5\u30E9\u30F3", "\u30D8\u30AF\u30BF\u30FC\u30EB", "\u30D8\u309A\u30BD", "\u30D8\u309A\u30CB\u30D2", "\u30D8\u30EB\u30C4", "\u30D8\u309A\u30F3\u30B9", "\u30D8\u309A\u30FC\u30B7\u3099", "\u30D8\u3099\u30FC\u30BF", "\u30DB\u309A\u30A4\u30F3\u30C8", "\u30DB\u3099\u30EB\u30C8", "\u30DB\u30F3", "\u30DB\u309A\u30F3\u30C8\u3099", "\u30DB\u30FC\u30EB", "\u30DB\u30FC\u30F3", "\u30DE\u30A4\u30AF\u30ED", "\u30DE\u30A4\u30EB", "\u30DE\u30C3\u30CF", "\u30DE\u30EB\u30AF", "\u30DE\u30F3\u30B7\u30E7\u30F3", "\u30DF\u30AF\u30ED\u30F3", "\u30DF\u30EA", "\u30DF\u30EA\u30CF\u3099\u30FC\u30EB", "\u30E1\u30AB\u3099", "\u30E1\u30AB\u3099\u30C8\u30F3", "\u30E1\u30FC\u30C8\u30EB", "\u30E4\u30FC\u30C8\u3099", "\u30E4\u30FC\u30EB", "\u30E6\u30A2\u30F3", "\u30EA\u30C3\u30C8\u30EB", "\u30EA\u30E9", "\u30EB\u30D2\u309A\u30FC", "\u30EB\u30FC\u30D5\u3099\u30EB", "\u30EC\u30E0", "\u30EC\u30F3\u30C8\u30B1\u3099\u30F3", "\u30EF\u30C3\u30C8", "\u0030\u70B9", "\u0031\u70B9", "\u0032\u70B9", "\u0033\u70B9", "\u0034\u70B9", "\u0035\u70B9", "\u0036\u70B9", "\u0037\u70B9", "\u0038\u70B9", "\u0039\u70B9", "\u0031\u0030\u70B9", "\u0031\u0031\u70B9", "\u0031\u0032\u70B9", "\u0031\u0033\u70B9", "\u0031\u0034\u70B9", "\u0031\u0035\u70B9", "\u0031\u0036\u70B9", "\u0031\u0037\u70B9", "\u0031\u0038\u70B9", "\u0031\u0039\u70B9", "\u0032\u0030\u70B9", "\u0032\u0031\u70B9", "\u0032\u0032\u70B9", "\u0032\u0033\u70B9", "\u0032\u0034\u70B9", "\u0068\u0050\u0061", "\u0064\u0061", "\u0041\u0055", "\u0062\u0061\u0072", "\u006F\u0056", "\u0070\u0063", "\u0064\u006D", "\u0064\u006D\u0032", "\u0064\u006D\u0033", "\u0049\u0055", "\u5E73\u6210", "\u662D\u548C", "\u5927\u6B63", "\u660E\u6CBB", "\u682A\u5F0F\u4F1A\u793E", "\u0070\u0041", "\u006E\u0041", "\u03BC\u0041", "\u006D\u0041", "\u006B\u0041", "\u004B\u0042", "\u004D\u0042", "\u0047\u0042", "\u0063\u0061\u006C", "\u006B\u0063\u0061\u006C", "\u0070\u0046", "\u006E\u0046", "\u03BC\u0046", "\u03BC\u0067", "\u006D\u0067", "\u006B\u0067", "\u0048\u007A", "\u006B\u0048\u007A", "\u004D\u0048\u007A", "\u0047\u0048\u007A", "\u0054\u0048\u007A", "\u03BC\u006C", "\u006D\u006C", "\u0064\u006C", "\u006B\u006C", "\u0066\u006D", "\u006E\u006D", "\u03BC\u006D", "\u006D\u006D", "\u0063\u006D", "\u006B\u006D", "\u006D\u006D\u0032", "\u0063\u006D\u0032", "\u006D\u0032", "\u006B\u006D\u0032", "\u006D\u006D\u0033", "\u0063\u006D\u0033", "\u006D\u0033", "\u006B\u006D\u0033", "\u006D\u2215\u0073", "\u006D\u2215\u0073\u0032", "\u0050\u0061", "\u006B\u0050\u0061", "\u004D\u0050\u0061", "\u0047\u0050\u0061", "\u0072\u0061\u0064", "\u0072\u0061\u0064\u2215\u0073", "\u0072\u0061\u0064\u2215\u0073\u0032", "\u0070\u0073", "\u006E\u0073", "\u03BC\u0073", "\u006D\u0073", "\u0070\u0056", "\u006E\u0056", "\u03BC\u0056", "\u006D\u0056", "\u006B\u0056", "\u004D\u0056", "\u0070\u0057", "\u006E\u0057", "\u03BC\u0057", "\u006D\u0057", "\u006B\u0057", "\u004D\u0057", "\u006B\u03A9", "\u004D\u03A9", "\u0061\u002E\u006D\u002E", "\u0042\u0071", "\u0063\u0063", "\u0063\u0064", "\u0043\u2215\u006B\u0067", "\u0043\u006F\u002E", "\u0064\u0042", "\u0047\u0079", "\u0068\u0061", "\u0048\u0050", "\u0069\u006E", "\u004B\u004B", "\u004B\u004D", "\u006B\u0074", "\u006C\u006D", "\u006C\u006E", "\u006C\u006F\u0067", "\u006C\u0078", "\u006D\u0062", "\u006D\u0069\u006C", "\u006D\u006F\u006C", "\u0050\u0048", "\u0070\u002E\u006D\u002E", "\u0050\u0050\u004D", "\u0050\u0052", "\u0073\u0072", "\u0053\u0076", "\u0057\u0062", "\u0056\u2215\u006D", "\u0041\u2215\u006D", "\u0031\u65E5", "\u0032\u65E5", "\u0033\u65E5", "\u0034\u65E5", "\u0035\u65E5", "\u0036\u65E5", "\u0037\u65E5", "\u0038\u65E5", "\u0039\u65E5", "\u0031\u0030\u65E5", "\u0031\u0031\u65E5", "\u0031\u0032\u65E5", "\u0031\u0033\u65E5", "\u0031\u0034\u65E5", "\u0031\u0035\u65E5", "\u0031\u0036\u65E5", "\u0031\u0037\u65E5", "\u0031\u0038\u65E5", "\u0031\u0039\u65E5", "\u0032\u0030\u65E5", "\u0032\u0031\u65E5", "\u0032\u0032\u65E5", "\u0032\u0033\u65E5", "\u0032\u0034\u65E5", "\u0032\u0035\u65E5", "\u0032\u0036\u65E5", "\u0032\u0037\u65E5", "\u0032\u0038\u65E5", "\u0032\u0039\u65E5", "\u0033\u0030\u65E5", "\u0033\u0031\u65E5", "\u0067\u0061\u006C", "\uA76F", "\u8C48", "\u66F4", "\u8CC8", "\u6ED1", "\u4E32", "\u53E5", "\u5951", "\u5587", "\u5948", "\u61F6", "\u7669", "\u7F85", "\u863F", "\u87BA", "\u88F8", "\u908F", "\u6A02", "\u6D1B", "\u70D9", "\u73DE", "\u843D", "\u916A", "\u99F1", "\u4E82", "\u5375", "\u6B04", "\u721B", "\u862D", "\u9E1E", "\u5D50", "\u6FEB", "\u85CD", "\u8964", "\u62C9", "\u81D8", "\u881F", "\u5ECA", "\u6717", "\u6D6A", "\u72FC", "\u90CE", "\u4F86", "\u51B7", "\u52DE", "\u64C4", "\u6AD3", "\u7210", "\u76E7", "\u8606", "\u865C", "\u8DEF", "\u9732", "\u9B6F", "\u9DFA", "\u788C", "\u797F", "\u7DA0", "\u83C9", "\u9304", "\u8AD6", "\u58DF", "\u5F04", "\u7C60", "\u807E", "\u7262", "\u78CA", "\u8CC2", "\u96F7", "\u58D8", "\u5C62", "\u6A13", "\u6DDA", "\u6F0F", "\u7D2F", "\u7E37", "\u964B", "\u52D2", "\u808B", "\u51DC", "\u51CC", "\u7A1C", "\u7DBE", "\u83F1", "\u9675", "\u8B80", "\u62CF", "\u8AFE", "\u4E39", "\u5BE7", "\u6012", "\u7387", "\u7570", "\u5317", "\u78FB", "\u4FBF", "\u5FA9", "\u4E0D", "\u6CCC", "\u6578", "\u7D22", "\u53C3", "\u585E", "\u7701", "\u8449", "\u8AAA", "\u6BBA", "\u6C88", "\u62FE", "\u82E5", "\u63A0", "\u7565", "\u4EAE", "\u5169", "\u51C9", "\u6881", "\u7CE7", "\u826F", "\u8AD2", "\u91CF", "\u52F5", "\u5442", "\u5EEC", "\u65C5", "\u6FFE", "\u792A", "\u95AD", "\u9A6A", "\u9E97", "\u9ECE", "\u66C6", "\u6B77", "\u8F62", "\u5E74", "\u6190", "\u6200", "\u649A", "\u6F23", "\u7149", "\u7489", "\u79CA", "\u7DF4", "\u806F", "\u8F26", "\u84EE", "\u9023", "\u934A", "\u5217", "\u52A3", "\u54BD", "\u70C8", "\u88C2", "\u5EC9", "\u5FF5", "\u637B", "\u6BAE", "\u7C3E", "\u7375", "\u4EE4", "\u56F9", "\u5DBA", "\u601C", "\u73B2", "\u7469", "\u7F9A", "\u8046", "\u9234", "\u96F6", "\u9748", "\u9818", "\u4F8B", "\u79AE", "\u91B4", "\u96B8", "\u60E1", "\u4E86", "\u50DA", "\u5BEE", "\u5C3F", "\u6599", "\u71CE", "\u7642", "\u84FC", "\u907C", "\u6688", "\u962E", "\u5289", "\u677B", "\u67F3", "\u6D41", "\u6E9C", "\u7409", "\u7559", "\u786B", "\u7D10", "\u985E", "\u622E", "\u9678", "\u502B", "\u5D19", "\u6DEA", "\u8F2A", "\u5F8B", "\u6144", "\u6817", "\u9686", "\u5229", "\u540F", "\u5C65", "\u6613", "\u674E", "\u68A8", "\u6CE5", "\u7406", "\u75E2", "\u7F79", "\u88CF", "\u88E1", "\u96E2", "\u533F", "\u6EBA", "\u541D", "\u71D0", "\u7498", "\u85FA", "\u96A3", "\u9C57", "\u9E9F", "\u6797", "\u6DCB", "\u81E8", "\u7B20", "\u7C92", "\u72C0", "\u7099", "\u8B58", "\u4EC0", "\u8336", "\u523A", "\u5207", "\u5EA6", "\u62D3", "\u7CD6", "\u5B85", "\u6D1E", "\u66B4", "\u8F3B", "\u964D", "\u5ED3", "\u5140", "\u55C0", "\u585A", "\u6674", "\u51DE", "\u732A", "\u76CA", "\u793C", "\u795E", "\u7965", "\u798F", "\u9756", "\u7CBE", "\u8612", "\u8AF8", "\u9038", "\u90FD", "\u98EF", "\u98FC", "\u9928", "\u9DB4", "\u4FAE", "\u50E7", "\u514D", "\u52C9", "\u52E4", "\u5351", "\u559D", "\u5606", "\u5668", "\u5840", "\u58A8", "\u5C64", "\u6094", "\u6168", "\u618E", "\u61F2", "\u654F", "\u65E2", "\u6691", "\u6885", "\u6D77", "\u6E1A", "\u6F22", "\u716E", "\u722B", "\u7422", "\u7891", "\u7949", "\u7948", "\u7950", "\u7956", "\u798D", "\u798E", "\u7A40", "\u7A81", "\u7BC0", "\u7E09", "\u7E41", "\u7F72", "\u8005", "\u81ED", "\u8279", "\u8457", "\u8910", "\u8996", "\u8B01", "\u8B39", "\u8CD3", "\u8D08", "\u8FB6", "\u96E3", "\u97FF", "\u983B", "\u4E26", "\u51B5", "\u5168", "\u4F80", "\u5145", "\u5180", "\u52C7", "\u52FA", "\u5555", "\u5599", "\u55E2", "\u58B3", "\u5944", "\u5954", "\u5A62", "\u5B28", "\u5ED2", "\u5ED9", "\u5F69", "\u5FAD", "\u60D8", "\u614E", "\u6108", "\u6160", "\u6234", "\u63C4", "\u641C", "\u6452", "\u6556", "\u671B", "\u6756", "\u6EDB", "\u6ECB", "\u701E", "\u77A7", "\u7235", "\u72AF", "\u7471", "\u7506", "\u753B", "\u761D", "\u761F", "\u76DB", "\u76F4", "\u774A", "\u7740", "\u78CC", "\u7AB1", "\u7C7B", "\u7D5B", "\u7F3E", "\u8352", "\u83EF", "\u8779", "\u8941", "\u8986", "\u8ABF", "\u8ACB", "\u8AED", "\u8B8A", "\u8F38", "\u9072", "\u9199", "\u9276", "\u967C", "\u97DB", "\u980B", "\u9B12", "\u2284A", "\u22844", "\u233D5", "\u3B9D", "\u4018", "\u4039", "\u25249", "\u25CD0", "\u27ED3", "\u9F43", "\u9F8E", "\u0066\u0066", "\u0066\u0069", "\u0066\u006C", "\u0066\u0066\u0069", "\u0066\u0066\u006C", "\u0073\u0074", "\u0574\u0576", "\u0574\u0565", "\u0574\u056B", "\u057E\u0576", "\u0574\u056D", "\u05D9\u05B4", "\u05F2\u05B7", "\u05E2", "\u05D4", "\u05DB", "\u05DC", "\u05DD", "\u05E8", "\u05EA", "\u05E9\u05C1", "\u05E9\u05C2", "\u05E9\u05BC\u05C1", "\u05E9\u05BC\u05C2", "\u05D0\u05B7", "\u05D0\u05B8", "\u05D0\u05BC", "\u05D1\u05BC", "\u05D2\u05BC", "\u05D3\u05BC", "\u05D4\u05BC", "\u05D5\u05BC", "\u05D6\u05BC", "\u05D8\u05BC", "\u05D9\u05BC", "\u05DA\u05BC", "\u05DB\u05BC", "\u05DC\u05BC", "\u05DE\u05BC", "\u05E0\u05BC", "\u05E1\u05BC", "\u05E3\u05BC", "\u05E4\u05BC", "\u05E6\u05BC", "\u05E7\u05BC", "\u05E8\u05BC", "\u05E9\u05BC", "\u05EA\u05BC", "\u05D5\u05B9", "\u05D1\u05BF", "\u05DB\u05BF", "\u05E4\u05BF", "\u05D0\u05DC", "\u0671", "\u067B", "\u067E", "\u0680", "\u067A", "\u067F", "\u0679", "\u06A4", "\u06A6", "\u0684", "\u0683", "\u0686", "\u0687", "\u068D", "\u068C", "\u068E", "\u0688", "\u0698", "\u0691", "\u06A9", "\u06AF", "\u06B3", "\u06B1", "\u06BA", "\u06BB", "\u06C1", "\u06BE", "\u06D2", "\u06AD", "\u06C7", "\u06C6", "\u06C8", "\u06CB", "\u06C5", "\u06C9", "\u06D0", "\u0649", "\u064A\u0654\u0627", "\u064A\u0654\u06D5", "\u064A\u0654\u0648", "\u064A\u0654\u06C7", "\u064A\u0654\u06C6", "\u064A\u0654\u06C8", "\u064A\u0654\u06D0", "\u064A\u0654\u0649", "\u06CC", "\u064A\u0654\u062C", "\u064A\u0654\u062D", "\u064A\u0654\u0645", "\u064A\u0654\u064A", "\u0628\u062C", "\u0628\u062D", "\u0628\u062E", "\u0628\u0645", "\u0628\u0649", "\u0628\u064A", "\u062A\u062C", "\u062A\u062D", "\u062A\u062E", "\u062A\u0645", "\u062A\u0649", "\u062A\u064A", "\u062B\u062C", "\u062B\u0645", "\u062B\u0649", "\u062B\u064A", "\u062C\u062D", "\u062C\u0645", "\u062D\u062C", "\u062D\u0645", "\u062E\u062C", "\u062E\u062D", "\u062E\u0645", "\u0633\u062C", "\u0633\u062D", "\u0633\u062E", "\u0633\u0645", "\u0635\u062D", "\u0635\u0645", "\u0636\u062C", "\u0636\u062D", "\u0636\u062E", "\u0636\u0645", "\u0637\u062D", "\u0637\u0645", "\u0638\u0645", "\u0639\u062C", "\u0639\u0645", "\u063A\u062C", "\u063A\u0645", "\u0641\u062C", "\u0641\u062D", "\u0641\u062E", "\u0641\u0645", "\u0641\u0649", "\u0641\u064A", "\u0642\u062D", "\u0642\u0645", "\u0642\u0649", "\u0642\u064A", "\u0643\u0627", "\u0643\u062C", "\u0643\u062D", "\u0643\u062E", "\u0643\u0644", "\u0643\u0645", "\u0643\u0649", "\u0643\u064A", "\u0644\u062C", "\u0644\u062D", "\u0644\u062E", "\u0644\u0645", "\u0644\u0649", "\u0644\u064A", "\u0645\u062C", "\u0645\u062D", "\u0645\u062E", "\u0645\u0645", "\u0645\u0649", "\u0645\u064A", "\u0646\u062C", "\u0646\u062D", "\u0646\u062E", "\u0646\u0645", "\u0646\u0649", "\u0646\u064A", "\u0647\u062C", "\u0647\u0645", "\u0647\u0649", "\u0647\u064A", "\u064A\u062C", "\u064A\u062D", "\u064A\u062E", "\u064A\u0645", "\u064A\u0649", "\u064A\u064A", "\u0630\u0670", "\u0631\u0670", "\u0649\u0670", "\u0020\u064C\u0651", "\u0020\u064D\u0651", "\u0020\u064E\u0651", "\u0020\u064F\u0651", "\u0020\u0650\u0651", "\u0020\u0651\u0670", "\u064A\u0654\u0631", "\u064A\u0654\u0632", "\u064A\u0654\u0646", "\u0628\u0631", "\u0628\u0632", "\u0628\u0646", "\u062A\u0631", "\u062A\u0632", "\u062A\u0646", "\u062B\u0631", "\u062B\u0632", "\u062B\u0646", "\u0645\u0627", "\u0646\u0631", "\u0646\u0632", "\u0646\u0646", "\u064A\u0631", "\u064A\u0632", "\u064A\u0646", "\u064A\u0654\u062E", "\u064A\u0654\u0647", "\u0628\u0647", "\u062A\u0647", "\u0635\u062E", "\u0644\u0647", "\u0646\u0647", "\u0647\u0670", "\u064A\u0647", "\u062B\u0647", "\u0633\u0647", "\u0634\u0645", "\u0634\u0647", "\u0640\u064E\u0651", "\u0640\u064F\u0651", "\u0640\u0650\u0651", "\u0637\u0649", "\u0637\u064A", "\u0639\u0649", "\u0639\u064A", "\u063A\u0649", "\u063A\u064A", "\u0633\u0649", "\u0633\u064A", "\u0634\u0649", "\u0634\u064A", "\u062D\u0649", "\u062D\u064A", "\u062C\u0649", "\u062C\u064A", "\u062E\u0649", "\u062E\u064A", "\u0635\u0649", "\u0635\u064A", "\u0636\u0649", "\u0636\u064A", "\u0634\u062C", "\u0634\u062D", "\u0634\u062E", "\u0634\u0631", "\u0633\u0631", "\u0635\u0631", "\u0636\u0631", "\u0627\u064B", "\u062A\u062C\u0645", "\u062A\u062D\u062C", "\u062A\u062D\u0645", "\u062A\u062E\u0645", "\u062A\u0645\u062C", "\u062A\u0645\u062D", "\u062A\u0645\u062E", "\u062C\u0645\u062D", "\u062D\u0645\u064A", "\u062D\u0645\u0649", "\u0633\u062D\u062C", "\u0633\u062C\u062D", "\u0633\u062C\u0649", "\u0633\u0645\u062D", "\u0633\u0645\u062C", "\u0633\u0645\u0645", "\u0635\u062D\u062D", "\u0635\u0645\u0645", "\u0634\u062D\u0645", "\u0634\u062C\u064A", "\u0634\u0645\u062E", "\u0634\u0645\u0645", "\u0636\u062D\u0649", "\u0636\u062E\u0645", "\u0637\u0645\u062D", "\u0637\u0645\u0645", "\u0637\u0645\u064A", "\u0639\u062C\u0645", "\u0639\u0645\u0645", "\u0639\u0645\u0649", "\u063A\u0645\u0645", "\u063A\u0645\u064A", "\u063A\u0645\u0649", "\u0641\u062E\u0645", "\u0642\u0645\u062D", "\u0642\u0645\u0645", "\u0644\u062D\u0645", "\u0644\u062D\u064A", "\u0644\u062D\u0649", "\u0644\u062C\u062C", "\u0644\u062E\u0645", "\u0644\u0645\u062D", "\u0645\u062D\u062C", "\u0645\u062D\u0645", "\u0645\u062D\u064A", "\u0645\u062C\u062D", "\u0645\u062C\u0645", "\u0645\u062E\u062C", "\u0645\u062E\u0645", "\u0645\u062C\u062E", "\u0647\u0645\u062C", "\u0647\u0645\u0645", "\u0646\u062D\u0645", "\u0646\u062D\u0649", "\u0646\u062C\u0645", "\u0646\u062C\u0649", "\u0646\u0645\u064A", "\u0646\u0645\u0649", "\u064A\u0645\u0645", "\u0628\u062E\u064A", "\u062A\u062C\u064A", "\u062A\u062C\u0649", "\u062A\u062E\u064A", "\u062A\u062E\u0649", "\u062A\u0645\u064A", "\u062A\u0645\u0649", "\u062C\u0645\u064A", "\u062C\u062D\u0649", "\u062C\u0645\u0649", "\u0633\u062E\u0649", "\u0635\u062D\u064A", "\u0634\u062D\u064A", "\u0636\u062D\u064A", "\u0644\u062C\u064A", "\u0644\u0645\u064A", "\u064A\u062D\u064A", "\u064A\u062C\u064A", "\u064A\u0645\u064A", "\u0645\u0645\u064A", "\u0642\u0645\u064A", "\u0646\u062D\u064A", "\u0639\u0645\u064A", "\u0643\u0645\u064A", "\u0646\u062C\u062D", "\u0645\u062E\u064A", "\u0644\u062C\u0645", "\u0643\u0645\u0645", "\u062C\u062D\u064A", "\u062D\u062C\u064A", "\u0645\u062C\u064A", "\u0641\u0645\u064A", "\u0628\u062D\u064A", "\u0633\u062E\u064A", "\u0646\u062C\u064A", "\u0635\u0644\u06D2", "\u0642\u0644\u06D2", "\u0627\u0644\u0644\u0647", "\u0627\u0643\u0628\u0631", "\u0645\u062D\u0645\u062F", "\u0635\u0644\u0639\u0645", "\u0631\u0633\u0648\u0644", "\u0639\u0644\u064A\u0647", "\u0648\u0633\u0644\u0645", "\u0635\u0644\u0649", "\u0635\u0644\u0649\u0020\u0627\u0644\u0644\u0647\u0020\u0639\u0644\u064A\u0647\u0020\u0648\u0633\u0644\u0645", "\u062C\u0644\u0020\u062C\u0644\u0627\u0644\u0647", "\u0631\u06CC\u0627\u0644", "\u002C", "\u3001", "\u3002", "\u003A", "\u0021", "\u003F", "\u3016", "\u3017", "\u2014", "\u2013", "\u005F", "\u007B", "\u007D", "\u3014", "\u3015", "\u3010", "\u3011", "\u300A", "\u300B", "\u300C", "\u300D", "\u300E", "\u300F", "\u005B", "\u005D", "\u0023", "\u0026", "\u002A", "\u002D", "\u003C", "\u003E", "\\", "\u0024", "\u0025", "\u0040", "\u0020\u064B", "\u0640\u064B", "\u0020\u064C", "\u0020\u064D", "\u0020\u064E", "\u0640\u064E", "\u0020\u064F", "\u0640\u064F", "\u0020\u0650", "\u0640\u0650", "\u0020\u0651", "\u0640\u0651", "\u0020\u0652", "\u0640\u0652", "\u0621", "\u0627", "\u0628", "\u0629", "\u062A", "\u062B", "\u062C", "\u062D", "\u062E", "\u062F", "\u0630", "\u0631", "\u0632", "\u0633", "\u0634", "\u0635", "\u0636", "\u0637", "\u0638", "\u0639", "\u063A", "\u0641", "\u0642", "\u0643", "\u0644", "\u0645", "\u0646", "\u0647", "\u0648", "\u064A", "\u0644\u0627\u0653", "\u0644\u0627\u0654", "\u0644\u0627\u0655", "\u0644\u0627", "\"", "\u0027", "\u002F", "\u005E", "\u007C", "\u007E", "\u2985", "\u2986", "\u30FB", "\u30A1", "\u30A3", "\u30A5", "\u30A7", "\u30A9", "\u30E3", "\u30E5", "\u30E7", "\u30C3", "\u30FC", "\u30F3", "\u3099", "\u309A", "\u00A2", "\u00A3", "\u00AC", "\u00A6", "\u00A5", "\u20A9", "\u2502", "\u2190", "\u2191", "\u2192", "\u2193", "\u25A0", "\u25CB", }; } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/0000755000175000017500000000000012204443225021061 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Stream.cs0000644000175000017500000000261012204443225022642 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol { /// /// stream:stream Element /// This is the first Element we receive from the server. /// It encloses our whole xmpp session. /// public class Stream : Base.Stream { public Stream() { this.Namespace = Uri.STREAM; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Error.cs0000644000175000017500000005176212204443225022514 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol { /* OPTIONAL descriptive text [OPTIONAL application-specific condition element] */ /* RFC 4.7.3. Defined Conditions The following stream-level error conditions are defined: * -- the entity has sent XML that cannot be processed; this error MAY be used instead of the more specific XML-related errors, such as , , , , and , although the more specific errors are preferred. * -- 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 (XML Namespace Names and Prefixes)). * -- the server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream. * -- the entity has not generated any traffic over the stream for some period of time (configurable according to a local service policy). * -- 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. * -- 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. * -- a stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value). * -- the server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream. * -- 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. * -- the stream ID or dialback ID is invalid or does not match an ID previously provided. * -- 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 (XML Namespace Names and Prefixes)). * -- the entity has sent invalid XML over the stream to a server that performs validation (see Validation (Validation)). * -- 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. * -- the entity has violated some local service policy; the server MAY choose to specify the policy in the element or an application-specific condition element. * -- the server is unable to properly connect to a remote entity that is required for authentication or authorization. * -- the server lacks the system resources necessary to service the stream. * -- the entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character (see Restrictions (Restrictions)). * -- 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 element. * -- the server is being shut down and all active streams are being closed. * -- 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. * -- the initiating entity has encoded the stream in an encoding that is not supported by the server (see Character Encoding (Character Encoding)). * -- the initiating entity has sent a first-level child of the stream that is not supported by the server. * -- 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 element. * -- the initiating entity has sent XML that is not well-formed as defined by [XML] (Bray, T., Paoli, J., Sperberg-McQueen, C., and E. Maler, Extensible Markup Language (XML) 1.0 (2nd ed), October 2000.). */ public enum StreamErrorCondition { /// /// unknown error condition /// UnknownCondition = -1, /// /// 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. /// BadFormat, /// /// 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 (XML Namespace Names and Prefixes)). /// BadNamespacePrefix, /// /// the server is closing the active stream for this entity because a new stream has been initiated that conflicts with the existing stream. /// Conflict, /// /// the entity has not generated any traffic over the stream for some period of time (configurable according to a local service policy). /// ConnectionTimeout, /// /// 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. /// HostGone, /// /// 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. /// HostUnknown, /// /// a stanza sent between two servers lacks a 'to' or 'from' attribute (or the attribute has no value). /// ImproperAddressing, /// /// the server has experienced a misconfiguration or an otherwise-undefined internal error that prevents it from servicing the stream. /// InternalServerError, /// /// 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. /// InvalidFrom, /// /// the stream ID or dialback ID is invalid or does not match an ID previously provided. /// InvalidId, /// /// 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 (XML Namespace Names and Prefixes)). /// InvalidNamespace, /// /// the entity has sent invalid XML over the stream to a server that performs validation. /// InvalidXml, /// /// 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. /// NotAuthorized, /// /// 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. /// PolicyViolation, /// /// the server is unable to properly connect to a remote entity that is required for authentication or authorization. /// RemoteConnectionFailed, /// /// the server lacks the system resources necessary to service the stream. /// ResourceConstraint, /// /// the entity has attempted to send restricted XML features such as a comment, processing instruction, DTD, entity reference, or unescaped character (see Restrictions (Restrictions)). /// RestrictedXml, /// /// 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. /// SeeOtherHost, /// /// the server is being shut down and all active streams are being closed. /// SystemShutdown, /// /// 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. /// UndefinedCondition, /// /// the initiating entity has encoded the stream in an encoding that is not supported by the server. /// UnsupportedEncoding, /// /// the initiating entity has sent a first-level child of the stream that is not supported by the server. /// UnsupportedStanzaType, /// /// 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. /// UnsupportedVersion, /// /// the initiating entity has sent XML that is not well-formed as defined by the XML specs. /// XmlNotWellFormed } // Invalid handshake // Socket override by another connection. /// /// Stream Errors <stream:error> /// public class Error : Element { public Error() { this.TagName = "error"; this.Namespace = Uri.STREAM; } public Error(StreamErrorCondition condition) : this() { this.Condition = condition; } /* public Error(string msg) : this() { Message = msg; } /// /// The error Description /// public string Message { get { return this.Value; } set { this.Value = value; } } */ public StreamErrorCondition Condition { get { if (HasTag("bad-format")) return StreamErrorCondition.BadFormat; else if (HasTag("bad-namespace-prefix")) return StreamErrorCondition.BadNamespacePrefix; else if (HasTag("conflict")) return StreamErrorCondition.Conflict; else if (HasTag("connection-timeout")) return StreamErrorCondition.ConnectionTimeout; else if (HasTag("host-gone")) return StreamErrorCondition.HostGone; else if (HasTag("host-unknown")) return StreamErrorCondition.HostUnknown; else if (HasTag("improper-addressing")) return StreamErrorCondition.ImproperAddressing; else if (HasTag("internal-server-error")) return StreamErrorCondition.InternalServerError; else if (HasTag("invalid-from")) return StreamErrorCondition.InvalidFrom; else if (HasTag("invalid-id")) return StreamErrorCondition.InvalidId; else if (HasTag("invalid-namespace")) return StreamErrorCondition.InvalidNamespace; else if (HasTag("invalid-xml")) return StreamErrorCondition.InvalidXml; else if (HasTag("not-authorized")) return StreamErrorCondition.NotAuthorized; else if (HasTag("policy-violation")) return StreamErrorCondition.PolicyViolation; else if (HasTag("remote-connection-failed")) return StreamErrorCondition.RemoteConnectionFailed; else if (HasTag("resource-constraint")) return StreamErrorCondition.ResourceConstraint; else if (HasTag("restricted-xml")) return StreamErrorCondition.RestrictedXml; else if (HasTag("see-other-host")) return StreamErrorCondition.SeeOtherHost; else if (HasTag("system-shutdown")) return StreamErrorCondition.SystemShutdown; else if (HasTag("undefined-condition")) return StreamErrorCondition.UndefinedCondition; else if (HasTag("unsupported-encoding")) return StreamErrorCondition.UnsupportedEncoding; else if (HasTag("unsupported-stanza-type")) return StreamErrorCondition.UnsupportedStanzaType; else if (HasTag("unsupported-version")) return StreamErrorCondition.UnsupportedVersion; else if (HasTag("xml-not-well-formed")) return StreamErrorCondition.XmlNotWellFormed; else return StreamErrorCondition.UnknownCondition; } set { switch (value) { case StreamErrorCondition.BadFormat: SetTag("bad-format", "", Uri.STREAMS); break; case StreamErrorCondition.BadNamespacePrefix: SetTag("bad-namespace-prefix", "", Uri.STREAMS); break; case StreamErrorCondition.Conflict: SetTag("conflict", "", Uri.STREAMS); break; case StreamErrorCondition.ConnectionTimeout: SetTag("connection-timeout", "", Uri.STREAMS); break; case StreamErrorCondition.HostGone: SetTag("host-gone", "", Uri.STREAMS); break; case StreamErrorCondition.HostUnknown: SetTag("host-unknown", "", Uri.STREAMS); break; case StreamErrorCondition.ImproperAddressing: SetTag("improper-addressing", "", Uri.STREAMS); break; case StreamErrorCondition.InternalServerError: SetTag("internal-server-error", "", Uri.STREAMS); break; case StreamErrorCondition.InvalidFrom: SetTag("invalid-from", "", Uri.STREAMS); break; case StreamErrorCondition.InvalidId: SetTag("invalid-id", "", Uri.STREAMS); break; case StreamErrorCondition.InvalidNamespace: SetTag("invalid-namespace", "", Uri.STREAMS); break; case StreamErrorCondition.InvalidXml: SetTag("invalid-xml", "", Uri.STREAMS); break; case StreamErrorCondition.NotAuthorized: SetTag("not-authorized", "", Uri.STREAMS); break; case StreamErrorCondition.PolicyViolation: SetTag("policy-violation", "", Uri.STREAMS); break; case StreamErrorCondition.RemoteConnectionFailed: SetTag("remote-connection-failed", "", Uri.STREAMS); break; case StreamErrorCondition.ResourceConstraint: SetTag("resource-constraint", "", Uri.STREAMS); break; case StreamErrorCondition.RestrictedXml: SetTag("restricted-xml", "", Uri.STREAMS); break; case StreamErrorCondition.SeeOtherHost: SetTag("see-other-host", "", Uri.STREAMS); break; case StreamErrorCondition.SystemShutdown: SetTag("system-shutdown", "", Uri.STREAMS); break; case StreamErrorCondition.UndefinedCondition: SetTag("undefined-condition", "", Uri.STREAMS); break; case StreamErrorCondition.UnsupportedEncoding: SetTag("unsupported-encoding", "", Uri.STREAMS); break; case StreamErrorCondition.UnsupportedStanzaType: SetTag("unsupported-stanza-type", "", Uri.STREAMS); break; case StreamErrorCondition.UnsupportedVersion: SetTag("unsupported-version", "", Uri.STREAMS); break; case StreamErrorCondition.XmlNotWellFormed: SetTag("xml-not-well-formed", "", Uri.STREAMS); break; default: return; } } } /// /// /// The <text/> element is OPTIONAL. If included, it SHOULD be used only to provide descriptive or diagnostic information /// that supplements the meaning of a defined condition or application-specific condition. /// /// /// It SHOULD NOT be interpreted programmatically by an application. /// It SHOULD NOT be used as the error message presented to a user, but MAY be shown in addition to the error message /// associated with the included condition element (or elements). /// /// public string Text { get { return GetTag("text"); } set { SetTag("text", value, Uri.STREAMS); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/0000755000175000017500000000000012250206660023064 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Log.cs0000644000175000017500000000431312204443225024134 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.Base; using agsXMPP.Xml; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.component { public enum LogType { NONE = -1, warn, info, verbose, debug, notice } /// /// Zusammenfassung fr Log. /// public class Log : Stanza { public Log() { this.TagName = "log"; this.Namespace = Uri.ACCEPT; } /// /// creates a new Log Packet with the given message /// /// public Log(string message) : this() { this.Value = message; } /// /// Gets or Sets the logtype /// public LogType Type { get { return (LogType) GetAttributeEnum("type", typeof(LogType)); } set { if (value == LogType.NONE) RemoveAttribute("type"); else SetAttribute("type", value.ToString()); } } /// /// The namespace for logging /// public string LogNamespace { get { return GetAttribute("ns"); } set { SetAttribute("ns", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Handler.cs0000644000175000017500000000255312250206660024775 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.component { public delegate void MessageHandler (object sender, Message msg); public delegate void PresenceHandler (object sender, Presence pres); public delegate void IqHandler (object sender, client.IQEventArgs args); } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Error.cs0000644000175000017500000000375112250206660024512 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.component { /// /// Summary description for Error. /// public class Error : agsXMPP.protocol.client.Error { public Error() : base() { this.Namespace = Uri.ACCEPT; } public Error(agsXMPP.protocol.client.ErrorType type) : base(type) { this.Namespace = Uri.ACCEPT; } /// /// Creates an error Element according the the condition /// The type attrib as added automatically as decribed in the XMPP specs /// This is the prefered way to create error Elements /// /// public Error(agsXMPP.protocol.client.ErrorCondition condition) : base(condition) { this.Namespace = Uri.ACCEPT; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/IQ.cs0000644000175000017500000000471612204443225023733 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #region Using directives using System; #endregion namespace agsXMPP.protocol.component { /// /// Summary description for Iq. /// public class IQ : agsXMPP.protocol.client.IQ { #region << Constructors >> public IQ() : base() { this.Namespace = Uri.ACCEPT; } public IQ(agsXMPP.protocol.client.IqType type) : base(type) { this.Namespace = Uri.ACCEPT; } public IQ(Jid from, Jid to) : base(from, to) { this.Namespace = Uri.ACCEPT; } public IQ(agsXMPP.protocol.client.IqType type, Jid from, Jid to) : base(type, from, to) { this.Namespace = Uri.ACCEPT; } #endregion /// /// Error Child Element /// public new agsXMPP.protocol.component.Error Error { get { return SelectSingleElement(typeof(agsXMPP.protocol.component.Error)) as agsXMPP.protocol.component.Error; } set { if (HasTag(typeof(agsXMPP.protocol.component.Error))) RemoveTag(typeof(agsXMPP.protocol.component.Error)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Handshake.cs0000644000175000017500000000357112204443225025306 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.Base; using agsXMPP.Xml; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.component { //aaee83c26aeeafcbabeabfcbcd50df997e0a2a1e /// /// Handshake Element /// public class Handshake : Stanza { public Handshake() { this.TagName = "handshake"; this.Namespace = Uri.ACCEPT; } public Handshake(string password, string streamid) : this() { SetAuth(password, streamid); } public void SetAuth(string password, string streamId) { this.Value = Util.Hash.Sha1Hash(streamId + password); } /// /// Digest (Hash) for authentication /// public string Digest { get { return this.Value; } set { this.Value = value; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Presence.cs0000644000175000017500000000464712204443225025171 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #region Using directives using System; #endregion namespace agsXMPP.protocol.component { /// /// Summary description for Presence. /// public class Presence : agsXMPP.protocol.client.Presence { #region << Constructors >> public Presence() : base() { this.Namespace = Uri.ACCEPT; } public Presence(agsXMPP.protocol.client.ShowType show, string status) : this() { this.Show = show; this.Status = status; } public Presence(agsXMPP.protocol.client.ShowType show, string status, int priority) : this(show, status) { this.Priority = priority; } #endregion /// /// Error Child Element /// public new agsXMPP.protocol.component.Error Error { get { return SelectSingleElement(typeof(agsXMPP.protocol.component.Error)) as agsXMPP.protocol.component.Error; } set { if (HasTag(typeof(agsXMPP.protocol.component.Error))) RemoveTag(typeof(agsXMPP.protocol.component.Error)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Message.cs0000644000175000017500000001343712204443225025006 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #region Using directives using System; #endregion namespace agsXMPP.protocol.component { /// /// Summary description for Message. /// public class Message : agsXMPP.protocol.client.Message { #region << Constructors >> public Message() : base() { this.Namespace = Uri.ACCEPT; } public Message(Jid to) : base(to) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, string body) : base(to, body) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from) : base(to, from) { this.Namespace = Uri.ACCEPT; } public Message(string to, string body) : base(to, body) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, string body, string subject) : base(to, body, subject) { this.Namespace = Uri.ACCEPT; } public Message(string to, string body, string subject) : base(to, body, subject) { this.Namespace = Uri.ACCEPT; } public Message(string to, string body, string subject, string thread) : base(to, body, subject, thread) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, string body, string subject, string thread) : base(to, body, subject, thread) { this.Namespace = Uri.ACCEPT; } public Message(string to, agsXMPP.protocol.client.MessageType type, string body) : base(to, type, body) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, agsXMPP.protocol.client.MessageType type, string body) : base(to, type, body) { this.Namespace = Uri.ACCEPT; } public Message(string to, agsXMPP.protocol.client.MessageType type, string body, string subject) : base(to, type, body, subject) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, agsXMPP.protocol.client.MessageType type, string body, string subject) : base(to, type, body, subject) { this.Namespace = Uri.ACCEPT; } public Message(string to, agsXMPP.protocol.client.MessageType type, string body, string subject, string thread) : base(to, type, body, subject, thread) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, agsXMPP.protocol.client.MessageType type, string body, string subject, string thread) : base(to, type, body, subject, thread) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from, string body) : base(to, from, body) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from, string body, string subject) : base(to, from, body, subject) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from, string body, string subject, string thread) : base(to, from, body, subject, thread) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from, agsXMPP.protocol.client.MessageType type, string body) : base(to, from, type, body) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from, agsXMPP.protocol.client.MessageType type, string body, string subject) : base(to, from, type, body, subject) { this.Namespace = Uri.ACCEPT; } public Message(Jid to, Jid from, agsXMPP.protocol.client.MessageType type, string body, string subject, string thread) : base(to, from, type, body, subject, thread) { this.Namespace = Uri.ACCEPT; } #endregion /// /// Error Child Element /// public new agsXMPP.protocol.component.Error Error { get { return SelectSingleElement(typeof(agsXMPP.protocol.component.Error)) as agsXMPP.protocol.component.Error; } set { if (HasTag(typeof(agsXMPP.protocol.component.Error))) RemoveTag(typeof(agsXMPP.protocol.component.Error)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/component/Route.cs0000644000175000017500000000474312204443225024520 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.Base; using agsXMPP.Xml; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.component { public enum RouteType { NONE = -1, error, auth, session } /// /// /// public class Route : Stanza { public Route() { this.TagName = "route"; this.Namespace = Uri.ACCEPT; } public Route(Element route) : this() { RouteElement = route; } public Route(Element route, Jid from, Jid to) : this() { RouteElement = route; From = from; To = to; } public Route(Element route, Jid from, Jid to, RouteType type) : this() { RouteElement = route; From = from; To = to; Type = type; } /// /// Gets or Sets the logtype /// public RouteType Type { get { return (RouteType) GetAttributeEnum("type", typeof(RouteType)); } set { if (value == RouteType.NONE) RemoveAttribute("type"); else SetAttribute("type", value.ToString()); } } /// /// sets or gets the element to route /// public Element RouteElement { get { return this.FirstChild as Element; } set { if (this.HasChildElements) this.RemoveAllChildNodes(); if (value != null) this.AddChild(value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/0000755000175000017500000000000012245370027022027 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Failure.cs0000644000175000017500000000722612245370027023754 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // // // namespace agsXMPP.protocol.sasl { /// /// Summary description for Failure. /// public class Failure : Element { public Failure() { this.TagName = "failure"; this.Namespace = Uri.SASL; } public Failure(FailureCondition cond) : this() { Condition = cond; } public FailureCondition Condition { get { if (HasTag("aborted")) return FailureCondition.aborted; else if (HasTag("incorrect-encoding")) return FailureCondition.incorrect_encoding; else if (HasTag("encryption-required")) return FailureCondition.encryption_required; else if (HasTag("invalid-authzid")) return FailureCondition.invalid_authzid; else if (HasTag("invalid-mechanism")) return FailureCondition.invalid_mechanism; else if (HasTag("mechanism-too-weak")) return FailureCondition.mechanism_too_weak; else if (HasTag("not-authorized")) return FailureCondition.not_authorized; else if (HasTag("temporary-auth-failure")) return FailureCondition.temporary_auth_failure; else return FailureCondition.UnknownCondition; } set { if (value == FailureCondition.aborted) SetTag("aborted"); else if (value == FailureCondition.incorrect_encoding) SetTag("incorrect-encoding"); else if (value == FailureCondition.encryption_required) SetTag("encryption-required"); else if (value == FailureCondition.invalid_authzid) SetTag("invalid-authzid"); else if (value == FailureCondition.invalid_mechanism) SetTag("invalid-mechanism"); else if (value == FailureCondition.mechanism_too_weak) SetTag("mechanism-too-weak"); else if (value == FailureCondition.not_authorized) SetTag("not-authorized"); else if (value == FailureCondition.temporary_auth_failure) SetTag("temporary-auth-failure"); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Success.cs0000644000175000017500000000263212204443225023765 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // namespace agsXMPP.protocol.sasl { /// /// Summary description for Success. /// public class Success : Element { public Success() { this.TagName = "success"; this.Namespace = Uri.SASL; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Mechanism.cs0000644000175000017500000002125312204443225024261 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Sasl; using agsXMPP.Xml.Dom; // DIGEST-MD5 // PLAIN //MECHANISMS USAGE REFERENCE OWNER //---------- ----- --------- ----- //KERBEROS_V4 LIMITED [RFC2222] IESG //GSSAPI COMMON [RFC2222] IESG //SKEY OBSOLETE [RFC2444] IESG //EXTERNAL COMMON [RFC2222] IESG //CRAM-MD5 LIMITED [RFC2195] IESG //ANONYMOUS COMMON [RFC2245] IESG //OTP COMMON [RFC2444] IESG //GSS-SPNEGO LIMITED [Leach] Paul Leach //PLAIN COMMON [RFC2595] IESG //SECURID COMMON [RFC2808] Magnus Nystrom //NTLM LIMITED [Leach] Paul Leach //NMAS_LOGIN LIMITED [Gayman] Mark G. Gayman //NMAS_AUTHEN LIMITED [Gayman] Mark G. Gayman //DIGEST-MD5 COMMON [RFC2831] IESG //9798-U-RSA-SHA1-ENC COMMON [RFC3163] robert.zuccherato@entrust.com //9798-M-RSA-SHA1-ENC COMMON [RFC3163] robert.zuccherato@entrust.com //9798-U-DSA-SHA1 COMMON [RFC3163] robert.zuccherato@entrust.com //9798-M-DSA-SHA1 COMMON [RFC3163] robert.zuccherato@entrust.com //9798-U-ECDSA-SHA1 COMMON [RFC3163] robert.zuccherato@entrust.com //9798-M-ECDSA-SHA1 COMMON [RFC3163] robert.zuccherato@entrust.com //KERBEROS_V5 COMMON [Josefsson] Simon Josefsson //NMAS-SAMBA-AUTH LIMITED [Brimhall] Vince Brimhall namespace agsXMPP.protocol.sasl { public enum MechanismType { NONE = 0, KERBEROS_V4, GSSAPI, SKEY, EXTERNAL, CRAM_MD5, ANONYMOUS, OTP, GSS_SPNEGO, PLAIN, SECURID, NTLM, NMAS_LOGIN, NMAS_AUTHEN, DIGEST_MD5, ISO_9798_U_RSA_SHA1_ENC, ISO_9798_M_RSA_SHA1_ENC, ISO_9798_U_DSA_SHA1, ISO_9798_M_DSA_SHA1, ISO_9798_U_ECDSA_SHA1, ISO_9798_M_ECDSA_SHA1, KERBEROS_V5, NMAS_SAMBA_AUTH, X_GOOGLE_TOKEN, SCRAM_SHA_1, X_FACEBOOK_PLATFORM } /// /// Summary description for Mechanism. /// public class Mechanism : Element { public Mechanism() { this.TagName = "mechanism"; this.Namespace = Uri.SASL; } public Mechanism(MechanismType mechanism) : this() { MechanismType = mechanism; } /// /// SASL mechanis as enum /// public MechanismType MechanismType { get { return GetMechanismType(this.Value); } set { this.Value = GetMechanismName(value); } } public static MechanismType GetMechanismType(string mechanism) { switch (mechanism) { //case "KERBEROS_V4": // return MechanismType.KERBEROS_V4; case "GSSAPI": return MechanismType.GSSAPI; //case "SKEY": // return MechanismType.SKEY; //case "EXTERNAL": // return MechanismType.EXTERNAL; //case "CRAM-MD5": // return MechanismType.CRAM_MD5; //case "ANONYMOUS": // return MechanismType.ANONYMOUS; //case "OTP": // return MechanismType.OTP; //case "GSS-SPNEGO": // return MechanismType.GSS_SPNEGO; case "PLAIN": return MechanismType.PLAIN; //case "SECURID": // return MechanismType.SECURID; //case "NTLM": // return MechanismType.NTLM; //case "NMAS_LOGIN": // return MechanismType.NMAS_LOGIN; //case "NMAS_AUTHEN": // return MechanismType.NMAS_AUTHEN; case "DIGEST-MD5": return MechanismType.DIGEST_MD5; //case "9798-U-RSA-SHA1-ENC": // return MechanismType.ISO_9798_U_RSA_SHA1_ENC; //case "9798-M-RSA-SHA1-ENC": // return MechanismType.ISO_9798_M_RSA_SHA1_ENC; //case "9798-U-DSA-SHA1": // return MechanismType.ISO_9798_U_DSA_SHA1; //case "9798-M-DSA-SHA1": // return MechanismType.ISO_9798_M_DSA_SHA1; //case "9798-U-ECDSA-SHA1": // return MechanismType.ISO_9798_U_ECDSA_SHA1; //case "9798-M-ECDSA-SHA1": // return MechanismType.ISO_9798_M_ECDSA_SHA1; //case "KERBEROS_V5": // return MechanismType.KERBEROS_V5; //case "NMAS-SAMBA-AUTH": // return MechanismType.NMAS_SAMBA_AUTH; case "X-GOOGLE-TOKEN": return MechanismType.X_GOOGLE_TOKEN; case "SCRAM-SHA-1": return MechanismType.SCRAM_SHA_1; case "X-FACEBOOK-PLATFORM": return MechanismType.X_FACEBOOK_PLATFORM; default: return MechanismType.NONE; } } public static string GetMechanismName(MechanismType mechanism) { switch (mechanism) { case MechanismType.KERBEROS_V4: return "KERBEROS_V4"; case MechanismType.GSSAPI: return "GSSAPI"; case MechanismType.SKEY: return "SKEY"; case MechanismType.EXTERNAL: return "EXTERNAL"; case MechanismType.CRAM_MD5: return "CRAM-MD5"; case MechanismType.ANONYMOUS: return "ANONYMOUS"; case MechanismType.OTP: return "OTP"; case MechanismType.GSS_SPNEGO: return "GSS-SPNEGO"; case MechanismType.PLAIN: return "PLAIN"; case MechanismType.SECURID: return "SECURID"; case MechanismType.NTLM: return "NTLM"; case MechanismType.NMAS_LOGIN: return "NMAS_LOGIN"; case MechanismType.NMAS_AUTHEN: return "NMAS_AUTHEN"; case MechanismType.DIGEST_MD5: return "DIGEST-MD5"; case MechanismType.ISO_9798_U_RSA_SHA1_ENC: return "9798-U-RSA-SHA1-ENC"; case MechanismType.ISO_9798_M_RSA_SHA1_ENC: return "9798-M-RSA-SHA1-ENC"; case MechanismType.ISO_9798_U_DSA_SHA1: return "9798-U-DSA-SHA1"; case MechanismType.ISO_9798_M_DSA_SHA1: return "9798-M-DSA-SHA1"; case MechanismType.ISO_9798_U_ECDSA_SHA1: return "9798-U-ECDSA-SHA1"; case MechanismType.ISO_9798_M_ECDSA_SHA1: return "9798-M-ECDSA-SHA1"; case MechanismType.KERBEROS_V5: return "KERBEROS_V5"; case MechanismType.NMAS_SAMBA_AUTH: return "NMAS-SAMBA-AUTH"; case MechanismType.X_GOOGLE_TOKEN: return "X-GOOGLE-TOKEN"; case MechanismType.SCRAM_SHA_1: return "SCRAM-SHA-1"; case MechanismType.X_FACEBOOK_PLATFORM: return "X-FACEBOOK-PLATFORM"; default: return null; } } /// /// Gets or sets the kerberos principal. /// /// The kerberos proncipal. public string KerberosPrincipal { get { return GetAttribute("kerb:principal"); } set { SetAttribute("kerb:principal", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/FailureCondition.cs0000644000175000017500000000512012245370027025612 0ustar00meebeymeebey00000000000000using System; namespace agsXMPP.protocol.sasl { public enum FailureCondition { /// /// The receiving entity acknowledges an element sent by the initiating entity; sent in reply to the element. /// aborted, /// /// The mechanism chosen by the initiating entity may be used only if the stream is already encrypted; provided in response to the element. /// encryption_required, /// /// The data provided by the initiating entity could not be processed because the [BASE64] (Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.) encoding is incorrect (e.g., because the encoding does not adhere to the definition in Section 3 of [BASE64] (Josefsson, S., The Base16, Base32, and Base64 Data Encodings, July 2003.)); sent in reply to a element or an element with initial response data. /// incorrect_encoding, /// /// 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 element or an element with initial response data. /// invalid_authzid, /// /// 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 element. /// invalid_mechanism, /// /// The mechanism requested by the initiating entity is weaker than server policy permits for that initiating entity; sent in reply to a element or an element with initial response data. /// mechanism_too_weak, /// /// 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 element or an element with initial response data. /// not_authorized, /// /// The authentication failed because of a temporary error condition within the receiving entity; sent in reply to an element or element. /// temporary_auth_failure, UnknownCondition } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Challenge.cs0000644000175000017500000000302512204443225024234 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; // //cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgi //LGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg== // namespace agsXMPP.protocol.sasl { /// /// Summary description for Challenge. /// public class Challenge : Element { public Challenge() { TagName = "challenge"; Namespace = Uri.SASL; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Response.cs0000644000175000017500000000364612204443225024161 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // //dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0i //T0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAw //MDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20i //LHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNo //YXJzZXQ9dXRmLTgK // namespace agsXMPP.protocol.sasl { /// /// Summary description for Response. /// public class Response : Element { public Response() { TagName = "response"; Namespace = Uri.SASL; } public Response(string text) : this() { TextBase64 = text; } //public Response(byte[] bytes) // : this() //{ // this.Value = Convert.ToBase64String(bytes); //} } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Mechanisms.cs0000644000175000017500000000502012204443225024436 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; // // DIGEST-MD5 // PLAIN // namespace agsXMPP.protocol.sasl { /// /// Summary description for Mechanisms. /// public class Mechanisms : Element { public Mechanisms() { this.TagName = "mechanisms"; this.Namespace = Uri.SASL; } public Mechanism[] GetMechanisms() { ElementList elements = SelectElements("mechanism"); Mechanism[] items = new Mechanism[elements.Count]; int i=0; foreach (Element e in elements) { items[i] = (Mechanism) e; i++; } return items; } public bool SupportsMechanism(MechanismType type) { foreach( Mechanism m in GetMechanisms()) { if (m.MechanismType == type) return true; } return false; } /// /// Gets the given mechanism. /// /// The mechanism type. /// public Mechanism GetMechanism(MechanismType type) { foreach (Mechanism m in GetMechanisms()) { if (m.MechanismType == type) return m; } return null; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Abort.cs0000644000175000017500000000253212204443225023423 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.sasl { /// /// Summary description for Abort. /// public class Abort : Element { public Abort() { this.TagName = "abort"; this.Namespace = Uri.SASL; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/sasl/Auth.cs0000644000175000017500000000347512204443225023264 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // namespace agsXMPP.protocol.sasl { /// /// Summary description for Auth. /// public class Auth : Element { public Auth() { this.TagName = "auth"; this.Namespace = Uri.SASL; } public Auth(MechanismType type) : this() { MechanismType = type; } public Auth(MechanismType type, string text) : this(type) { this.Value = text; } public MechanismType MechanismType { get { return Mechanism.GetMechanismType(GetAttribute("mechanism")); } set { SetAttribute("mechanism", Mechanism.GetMechanismName(value)); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/0000755000175000017500000000000012204443225021330 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/Conference.cs0000644000175000017500000000351612204443225023733 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x { /* You have been invited to darkcave@macbeth. */ /// /// is used for inviting somebody to a chatroom /// public class Conference : Element { public Conference() { this.TagName = "x"; this.Namespace = Uri.X_CONFERENCE; } public Conference(Jid room) : this() { Chatroom = room; } /// /// Room Jid /// public Jid Chatroom { get { return new Jid(GetAttribute("jid")); } set { SetAttribute("jid", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/vcard_update/0000755000175000017500000000000012204443225023771 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/vcard_update/VcardUpdate.cs0000644000175000017500000000524012204443225026523 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.vcard_update { /* */ public class VcardUpdate : Element { /// /// Initializes a new instance of the class. /// public VcardUpdate() { this.TagName = "x"; this.Namespace = Uri.VCARD_UPDATE; } /// /// Initializes a new instance of the class. /// /// The photo. public VcardUpdate(string photo) : this() { Photo = photo; } /// /// SHA1 hash of the avatar image data /// if no image/avatar should be advertised, or other clients should be forced /// to remove the image set it to a empty string value ("") /// if this protocol is supported but you ae not ready o advertise a imaeg yet /// set teh value to null. /// Otherwise teh value must the SHA1 hash of the image data. /// public string Photo { get { return GetTag("photo"); } set { if (value == null) RemoveTag("photo"); else SetTag("photo", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/0000755000175000017500000000000012204443225022241 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/Value.cs0000644000175000017500000000277412204443225023656 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.data { /// /// Summary description for Value. /// public class Value : Element { public Value() { this.TagName = "value"; this.Namespace = Uri.X_DATA; } public Value(string val) : this() { Value = val; } public Value(bool val) : this() { Value = val ? "1" : "0"; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/Data.cs0000644000175000017500000001067612204443225023453 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.data { /// /// Form Types /// public enum XDataFormType { /// /// The forms-processing entity is asking the forms-submitting entity to complete a form. /// form, /// /// The forms-submitting entity is submitting data to the forms-processing entity. /// submit, /// /// The forms-submitting entity has cancelled submission of data to the forms-processing entity. /// cancel, /// /// The forms-processing entity is returning data (e.g., search results) to the forms-submitting entity, or the data is a generic data set. /// result } /// /// Summary for Data. /// public class Data : FieldContainer { /* The base syntax for the 'jabber:x:data' namespace is as follows (a formal description can be found in the XML Schema section below): <instructions/> <field var='field-name' type='{field-type}' label='description'> <desc/> <required/> <value>field-value</value> <option label='option-label'><value>option-value</value></option> <option label='option-label'><value>option-value</value></option> </field> </x> */ #region << Constructors >> public Data() { this.TagName = "x"; this.Namespace = Uri.X_DATA; } public Data(XDataFormType type) : this() { this.Type = type; } #endregion #region << Properties >> public string Title { get { return GetTag("title"); } set { SetTag("title", value); } } public string Instructions { get { return GetTag("instructions"); } set { SetTag("instructions", value); } } /// <summary> /// Type of thie XDATA Form. /// </summary> public XDataFormType Type { get { return (XDataFormType) GetAttributeEnum("type", typeof(XDataFormType)); } set { SetAttribute("type", value.ToString());} } public Reported Reported { get { return SelectSingleElement(typeof(Reported)) as Reported; } set { RemoveTag(typeof(Reported)); AddChild(value); } } #endregion #region << public Methods >> /// <summary> /// /// </summary> /// <returns></returns> public Item AddItem() { Item i = new Item(); AddChild(i); return i; } /// <summary> /// /// </summary> /// <param name="item"></param> /// <returns></returns> public Item AddItem(Item item) { AddChild(item); return item; } /// <summary> /// Gets a list of all form fields /// </summary> /// <returns></returns> public Item[] GetItems() { ElementList nl = SelectElements(typeof(Item)); Item[] items = new Item[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Item) e; i++; } return items; } #endregion } } ������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/Field.cs����������������������������������������������0000644�0001750�0001750�00000017126�12204443225�023622� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.data { /* * <x xmlns='jabber:x:data' type='{form-type}'> <title/> <instructions/> <field var='field-name' type='{field-type}' label='description'> <desc/> <required/> <value>field-value</value> <option label='option-label'><value>option-value</value></option> <option label='option-label'><value>option-value</value></option> </field> </x> */ /// <summary> /// /// </summary> public class Field : Element { public Field() { this.TagName = "field"; this.Namespace = Uri.X_DATA; } public Field(FieldType type) : this() { this.Type = type; } public Field(string var, string label, FieldType type) : this() { this.Type = type; this.Var = var; this.Label = label; } #region << Properties >> public string Var { get { return GetAttribute("var"); } set { SetAttribute("var", value); } } public string Label { get { return GetAttribute("label"); } set { SetAttribute("label", value); } } public FieldType Type { get { switch (GetAttribute("type")) { case "boolean": return FieldType.Boolean; case "fixed": return FieldType.Fixed; case "hidden": return FieldType.Hidden; case "jid-multi": return FieldType.Jid_Multi; case "jid-single": return FieldType.Jid_Single; case "list-multi": return FieldType.List_Multi; case "list-single": return FieldType.List_Single; case "text-multi": return FieldType.Text_Multi; case "text-private": return FieldType.Text_Private; case "text-single": return FieldType.Text_Single; default: return FieldType.Unknown; } } set { switch (value) { case FieldType.Boolean: SetAttribute("type", "boolean"); break; case FieldType.Fixed: SetAttribute("type", "fixed"); break; case FieldType.Hidden: SetAttribute("type", "hidden"); break; case FieldType.Jid_Multi: SetAttribute("type", "jid-multi"); break; case FieldType.Jid_Single: SetAttribute("type", "jid-single"); break; case FieldType.List_Multi: SetAttribute("type", "list-multi"); break; case FieldType.List_Single: SetAttribute("type", "list-single"); break; case FieldType.Text_Multi: SetAttribute("type", "text-multi"); break; case FieldType.Text_Private: SetAttribute("type", "text-private"); break; case FieldType.Text_Single: SetAttribute("type", "text-single"); break; default: RemoveAttribute("type"); break; } } } public string Description { get { return GetTag("desc"); } set { SetTag("desc", value); } } /// <summary> /// Is this field a required field? /// </summary> public bool IsRequired { get { return HasTag("required"); } set { if (value == true) SetTag("required"); else RemoveTag("required"); } } #endregion #region << Methods and Functions >> /// <summary> /// The value of the field. /// </summary> public string GetValue() { return GetTag(typeof(Value)); //return GetTag("value"); } public bool HasValue(string val) { foreach(string s in GetValues()) { if(s == val) return true; } return false; } /// <summary> /// /// </summary> /// <param name="val"></param> /// <returns></returns> public void SetValue(string val) { SetTag(typeof(Value), val); } /// <summary> /// Set the value of boolean fields /// </summary> /// <param name="val"></param> public void SetValueBool(bool val) { SetValue( val ? "1" : "0" ); } /// <summary> /// Get the value of boolean fields /// </summary> /// <returns></returns> public bool GetValueBool() { // only "0" and "1" are valid. We dont care about other buggy implementations string val = GetValue(); if (val == null || val == "0") return false; else return true; } /// <summary> /// Returns the value as Jif for the Jid fields. /// Or null when the value is not a valid Jid. /// </summary> /// <returns></returns> public Jid GetValueJid() { try { return new Jid(GetValue()); } catch { return null; } } /// <summary> /// Adds a value /// </summary> /// <remarks> /// you can call this function multiple times to add values to "multi" fields /// </remarks> /// <param name="val"></param> public void AddValue(string val) { AddChild(new Value(val)); //AddTag("value", val); } /// <summary> /// Adds multiple values to the already existing values from a string array /// </summary> /// <param name="vals"></param> public void AddValues(string[] vals) { if (vals.Length > 0) { foreach (string s in vals) AddValue(s); } } /// <summary> /// Adds multiple values. All already existing values will be removed /// </summary> /// <param name="vals"></param> public void SetValues(string[] vals) { ElementList nl = SelectElements(typeof(Value)); foreach(Element e in nl) e.Remove(); AddValues(vals); } /// <summary> /// Gets all values for multi fields as Array /// </summary> /// <returns>string Array that contains all the values</returns> public string[] GetValues() { ElementList nl = SelectElements(typeof(Value)); string[] values = new string[nl.Count]; int i = 0; foreach (Element val in nl) { values[i] = val.Value; i++; } return values; } public Option AddOption(string label, string val) { Option opt = new Option(label, val); AddChild(opt); return opt; } public Option AddOption() { Option opt = new Option(); AddChild(opt); return opt; } public void AddOption(Option opt) { AddChild(opt); } public Option[] GetOptions() { ElementList nl = SelectElements(typeof(Option)); int i = 0; Option[] result = new Option[nl.Count]; foreach (Option o in nl) { result[i] = o; i++; } return result; } #endregion } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/Reported.cs�������������������������������������������0000644�0001750�0001750�00000003071�12204443225�024355� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.data { /// <summary> /// Used in XData seach reports. /// includes the headers of the search results /// </summary> public class Reported : FieldContainer { #region << Constructors >> public Reported() { this.TagName = "reported"; this.Namespace = Uri.X_DATA; } #endregion } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/FieldContainer.cs�������������������������������������0000644�0001750�0001750�00000005761�12204443225�025467� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.data { /// <summary> /// Bass class for all xdata classes that contain xData fields /// </summary> public abstract class FieldContainer : Element { /// <summary> /// Initializes a new instance of the <see cref="FieldContainer"/> class. /// </summary> public FieldContainer() { } #region << public Methods >> /// <summary> /// /// </summary> /// <returns></returns> public Field AddField() { Field f = new Field(); AddChild(f); return f; } /// <summary> /// /// </summary> /// <param name="field"></param> public Field AddField(Field field) { AddChild(field); return field; } /// <summary> /// Retrieve a field with the given "var" /// </summary> /// <param name="var"></param> /// <returns></returns> public Field GetField(string var) { ElementList nl = SelectElements(typeof(Field)); foreach (Element e in nl) { Field f = e as Field; if (f.Var == var) return f; } return null; } /// <summary> /// Gets a list of all form fields /// </summary> /// <returns></returns> public Field[] GetFields() { ElementList nl = SelectElements(typeof(Field)); Field[] fields = new Field[nl.Count]; int i = 0; foreach (Element e in nl) { fields[i] = (Field)e; i++; } return fields; } #endregion } } ���������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/Option.cs���������������������������������������������0000644�0001750�0001750�00000005032�12204443225�024040� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.data { /* <x xmlns='jabber:x:data' type='{form-type}'> <title/> <instructions/> <field var='field-name' type='{field-type}' label='description'> <desc/> <required/> <value>field-value</value> <option label='option-label'><value>option-value</value></option> <option label='option-label'><value>option-value</value></option> </field> </x> <xs:element name='option'> <xs:complexType> <xs:sequence> <xs:element ref='value'/> </xs:sequence> <xs:attribute name='label' type='xs:string' use='optional'/> </xs:complexType> </xs:element> */ /// <summary> /// Field Option. /// </summary> public class Option : Element { #region << Constructors >> public Option() { this.TagName = "option"; this.Namespace = Uri.X_DATA; } public Option(string label, string val) : this() { Label = label; SetValue(val); } #endregion #region << Properties >> /// <summary> /// Label of the option /// </summary> public string Label { get { return GetAttribute("label"); } set { SetAttribute("label", value); } } #endregion /// <summary> /// Value of the Option /// </summary> public string GetValue() { return GetTag(typeof(Value)); } public void SetValue(string val) { SetTag(typeof(Value), val); } } }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/Item.cs�����������������������������������������������0000644�0001750�0001750�00000003001�12204443225�023460� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.x.data { /// <summary> /// Used in XData seach. /// includes the headers of the search results /// </summary> public class Item : FieldContainer { #region << Constructors >> public Item() { this.TagName = "item"; this.Namespace = Uri.X_DATA; } #endregion } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/data/FieldTypes.cs�����������������������������������������0000644�0001750�0001750�00000006304�12204443225�024643� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.x.data { /// <summary> /// Field Types /// </summary> public enum FieldType { /// <summary> /// a unknown fieldtype /// </summary> Unknown, /// <summary> /// The field enables an entity to gather or provide an either-or choice between two options. The allowable values are 1 for yes/true/assent and 0 for no/false/decline. The default value is 0. /// </summary> Boolean, /// <summary> /// 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. /// </summary> Fixed, /// <summary> /// The field is not shown to the entity providing information, but instead is returned with the form. /// </summary> Hidden, /// <summary> /// The field enables an entity to gather or provide multiple Jabber IDs. /// </summary> Jid_Multi, /// <summary> /// The field enables an entity to gather or provide a single Jabber ID. /// </summary> Jid_Single, /// <summary> /// The field enables an entity to gather or provide one or more options from among many. /// </summary> List_Multi, /// <summary> /// The field enables an entity to gather or provide one option from among many. /// </summary> List_Single, /// <summary> /// The field enables an entity to gather or provide multiple lines of text. /// </summary> Text_Multi, /// <summary> /// password style textbox. /// 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., *****). /// </summary> Text_Private, /// <summary> /// 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. /// </summary> Text_Single } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/�������������������������������������������������������0000755�0001750�0001750�00000000000�12250206660�022115� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Muc.cs�������������������������������������������������0000644�0001750�0001750�00000004257�12204443225�023177� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /* <x xmlns='http://jabber.org/protocol/muc'> <password>secret</password> </x> */ /// <summary> /// Summary description for MucUser. /// </summary> public class Muc : Element { #region << Constructor >> public Muc() { this.TagName = "x"; this.Namespace = Uri.MUC; } #endregion public string Password { set { SetTag("password", value); } get { return GetTag("password"); } } /// <summary> /// The History object /// </summary> public History History { get { return SelectSingleElement(typeof(History)) as History; } set { if (HasTag(typeof(History))) RemoveTag(typeof(History)); if (value != null) this.AddChild(value); } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Decline.cs���������������������������������������������0000644�0001750�0001750�00000005040�12204443225�024005� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.x.muc { /* Example 45. Invitee Declines Invitation <message from='hecate@shakespeare.lit/broom' to='darkcave@macbeth.shakespeare.lit'> <x xmlns='http://jabber.org/protocol/muc#user'> <decline to='crone1@shakespeare.lit'> <reason> Sorry, I'm too busy right now. </reason> </decline> </x> </message> Example 46. Room Informs Invitor that Invitation Was Declined <message from='darkcave@macbeth.shakespeare.lit' to='crone1@shakespeare.lit/desktop'> <x xmlns='http://jabber.org/protocol/muc#user'> <decline from='hecate@shakespeare.lit'> <reason> Sorry, I'm too busy right now. </reason> </decline> </x> </message> */ public class Decline : Invitation { #region << Constructors >> public Decline() : base() { this.TagName = "decline"; } public Decline(string reason) : this() { this.Reason = reason; } public Decline(Jid to) : this() { this.To = to; } public Decline(Jid to, string reason): this() { this.To = to; this.Reason = reason; } #endregion } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/user/��������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�023072� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/user/Destroy.cs����������������������������������������0000644�0001750�0001750�00000003411�12204443225�025051� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.x.muc.user { public class Destroy : agsXMPP.protocol.x.muc.owner.Destroy { #region << Constructor >> public Destroy() : base() { this.Namespace = Uri.MUC_USER; } public Destroy(string reason) : this() { Reason = reason; } public Destroy(Jid altVenue) : this() { AlternateVenue = altVenue; } public Destroy(string reason, Jid altVenue) : this() { Reason = reason; AlternateVenue = altVenue; } #endregion } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Status.cs����������������������������������������������0000644�0001750�0001750�00000003764�12204443225�023740� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /* <x xmlns='http://jabber.org/protocol/muc#user'> <status code='100'/> </x> */ /// <summary> /// Summary description for MucUser. /// </summary> public class Status : Element { #region << Constructors >> public Status() { this.TagName = "status"; this.Namespace = Uri.MUC_USER; } public Status(StatusCode code) : this() { this.Code = code; } public Status(int code) : this() { SetAttribute("code", code); } #endregion public StatusCode Code { get { return (StatusCode)GetAttributeEnum("code", typeof(StatusCode)); } set { SetAttribute("code", value.ToString()); } } } }������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Invite.cs����������������������������������������������0000644�0001750�0001750�00000006374�12204443225�023713� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; using agsXMPP.protocol.extensions.nickname; namespace agsXMPP.protocol.x.muc { /* <message from='crone1@shakespeare.lit/desktop' to='darkcave@macbeth.shakespeare.lit'> <x xmlns='http://jabber.org/protocol/muc#user'> <invite to='hecate@shakespeare.lit'> <reason> Hey Hecate, this is the place for all good witches! </reason> </invite> </x> </message> */ /// <summary> /// Invite other users t a chatroom /// </summary> public class Invite : Invitation { #region << Constructors >> public Invite() : base() { this.TagName = "invite"; } public Invite(string reason) : this() { this.Reason = reason; } public Invite(Jid to) : this() { this.To = to; } public Invite(Jid to, string reason): this() { this.To = to; this.Reason = reason; } #endregion /* <invite to='wiccarocks@shakespeare.lit/laptop'> <reason>This coven needs both wiccarocks and hag66.</reason> <continue/> </invite> */ public bool Continue { get { return GetTag("continue") == null ? false : true; } set { if (value) SetTag("continue"); else RemoveTag("continue"); } } /// <summary> /// Nickname Element /// </summary> public Nickname Nickname { get { return SelectSingleElement(typeof(Nickname)) as Nickname; } set { if (HasTag(typeof(Nickname))) RemoveTag(typeof(Nickname)); if (value != null) this.AddChild(value); } } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/StatusCode.cs������������������������������������������0000644�0001750�0001750�00000011041�12204443225�024516� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.protocol.x.muc { /// <summary> /// StatusCode /// </summary> public enum StatusCode { /// <summary> /// Unkown status code. /// </summary> Unknown = -1, /// <summary> /// Inform user that any occupant is allowed to see the user's full JID. /// </summary> FullJidVisible = 100, /// <summary> /// Inform user that his or her affiliation changed while not in the room. /// </summary> AffiliationChanged = 101, /// <summary> /// Inform occupants that room now shows unavailable members. /// </summary> ShowUnavailableMembers = 102, /// <summary> /// Inform occupants that room now does not show unavailable members . /// </summary> HideUnavailableMembers = 103, /// <summary> /// Inform occupants that a non-privacy-related room configuration change has occurred. /// </summary> ConfigurationChanged = 104, /// <summary> /// Inform user that presence refers to one of its own room occupants . /// </summary> SelfPresence = 110, /// <summary> /// Inform occupants that room logging is now enabled. /// </summary> LoggingEnabled = 170, /// <summary> /// Inform occupants that room logging is now disabled. /// </summary> LoggingDisabled = 171, /// <summary> /// Inform occupants that the room is now non-anonymous. /// </summary> RoomNonAnonymous = 172, /// <summary> /// Inform occupants that the room is now semi-anonymous. /// </summary> RoomSemiAnonymous = 173, /// <summary> /// Inform occupants that the room is now fully-anonymous. /// </summary> RoomAnonymous = 174, /// <summary> /// Inform user that a new room has been created. /// </summary> RoomCreated = 201, /// <summary> /// Inform user that service has assigned or modified occupant's roomnick. /// </summary> ModifiedNick = 210, /// <summary> /// Inform user that he or she has been banned from the room. /// </summary> Banned = 301, /// <summary> /// Inform all occupants of new room nickname. /// </summary> NewNickname = 303, /// <summary> /// Inform user that he or she has been kicked from the room. /// </summary> Kicked = 307, /// <summary> /// Inform user that he or she is being removed from the room because of an affiliation change. /// </summary> // TODO, find better name AffiliationChange = 321, /// <summary> /// Inform user that he or she is being removed from the room because the room /// has been changed to members-only and the user is not a member. /// </summary> MembersOnly = 322, /// <summary> /// Inform user that he or she is being removed from the room because of a system shutdown. /// </summary> Shutdown = 332 } }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/owner/�������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�023246� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/owner/Destroy.cs���������������������������������������0000644�0001750�0001750�00000006043�12204443225�025231� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc.owner { /* <iq from='crone1@shakespeare.lit/desktop' id='begone' to='heath@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#owner'> <destroy jid='darkcave@macbeth.shakespeare.lit'> <reason>Macbeth doth come.</reason> </destroy> </query> </iq> */ /// <summary> /// /// </summary> public class Destroy : Element { #region << Constructor >> public Destroy() { this.TagName = "destroy"; this.Namespace = Uri.MUC_OWNER; } public Destroy(string reason) : this() { Reason = reason; } public Destroy(Jid altVenue) : this() { AlternateVenue = altVenue; } public Destroy(string reason, Jid altVenue) : this() { Reason = reason; AlternateVenue = altVenue; } #endregion /// <summary> /// Pptional attribute for a alternate venue /// </summary> public Jid AlternateVenue { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); } } public string Reason { set { SetTag("reason", value); } get { return GetTag("reason"); } } public string Password { set { SetTag("password", value); } get { return GetTag("password"); } } } }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/User.cs������������������������������������������������0000644�0001750�0001750�00000012111�12204443225�023355� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.Collections.Generic; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /// <summary> /// Summary description for MucUser. /// </summary> public class User : Element { /* <x xmlns='http://jabber.org/protocol/muc#user'> <item affiliation='admin' role='moderator'/> </x> <message from='darkcave@macbeth.shakespeare.lit' to='hag66@shakespeare.lit/pda' type='groupchat'> <body>This room is not anonymous.</body> <x xmlns='http://jabber.org/protocol/muc#user'> <status code='100'/> </x> </message> <message from='crone1@shakespeare.lit/desktop' to='darkcave@macbeth.shakespeare.lit'> <x xmlns='http://jabber.org/protocol/muc#user'> <invite to='hecate@shakespeare.lit'> <reason> Hey Hecate, this is the place for all good witches! </reason> </invite> </x> </message> <message from='darkcave@macbeth.shakespeare.lit' to='hecate@shakespeare.lit'> <body>You have been invited to darkcave@macbeth by crone1@shakespeare.lit.</body> <x xmlns='http://jabber.org/protocol/muc#user'> <invite from='crone1@shakespeare.lit'> <reason> Hey Hecate, this is the place for all good witches! </reason> </invite> <password>cauldron</password> </x> <x jid='darkcave@macbeth.shakespeare.lit' xmlns='jabber:x:conference'> Hey Hecate, this is the place for all good witches! </x> </message> */ public User() { TagName = "x"; Namespace = Uri.MUC_USER; } public Item Item { get { return SelectSingleElement(typeof(Item)) as Item; } set { RemoveTag(typeof(Item)); AddChild(value); } } /// <summary> /// Gets or sets the status codes. /// </summary> /// <value>The status codes.</value> public List<Status> StatusCodes { get { return SelectElements<Status>(); } set { RemoveTags<Status>(); foreach (Status status in value) AddChild(status); } } /// <summary> /// The Status Element /// </summary> public Status Status { get { return SelectSingleElement(typeof(Status)) as Status; } set { if (HasTag(typeof(Status))) RemoveTag(typeof(Status)); if (value != null) AddChild(value); } } /// <summary> /// The Invite Element /// </summary> public Invite Invite { get { return SelectSingleElement(typeof(Invite)) as Invite; } set { if (HasTag(typeof(Invite))) RemoveTag(typeof(Invite)); if (value != null) AddChild(value); } } /// <summary> /// The Decline Element /// </summary> public Decline Decline { get { return SelectSingleElement(typeof(Decline)) as Decline; } set { if (HasTag(typeof(Decline))) RemoveTag(typeof(Decline)); if (value != null) AddChild(value); } } public string Password { set { SetTag("password", value); } get { return GetTag("password"); } } } }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Destroy.cs���������������������������������������������0000644�0001750�0001750�00000006035�12204443225�024100� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2008 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /* <iq from='crone1@shakespeare.lit/desktop' id='begone' to='heath@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#owner'> <destroy jid='darkcave@macbeth.shakespeare.lit'> <reason>Macbeth doth come.</reason> </destroy> </query> </iq> */ /// <summary> /// /// </summary> public class Destroy : Element { #region << Constructor >> public Destroy() { this.TagName = "destroy"; this.Namespace = Uri.MUC_OWNER; } public Destroy(string reason) : this() { Reason = reason; } public Destroy(Jid altVenue) : this() { AlternateVenue = altVenue; } public Destroy(string reason, Jid altVenue) : this() { Reason = reason; AlternateVenue = altVenue; } #endregion /// <summary> /// Pptional attribute for a alternate venue /// </summary> public Jid AlternateVenue { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); } } public string Reason { set { SetTag("reason", value); } get { return GetTag("reason"); } } public string Password { set { SetTag("password", value); } get { return GetTag("password"); } } } }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Role.cs������������������������������������������������0000644�0001750�0001750�00000002552�12204443225�023350� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.x.muc { /// <summary> /// There are four defined roles that an occupant may have /// </summary> public enum Role { /// <summary> /// the absence of a role /// </summary> none, moderator, participant, visitor } } ������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Invitation.cs������������������������������������������0000644�0001750�0001750�00000003357�12204443225�024577� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /// <summary> /// A base class vor Decline and Invite /// We need From, To and SwitchDirection here. This is why we inherit from XmppPacket Base /// </summary> public abstract class Invitation : Base.Stanza { public Invitation() { this.Namespace = Uri.MUC_USER; } /// <summary> /// A reason why you want to invite this contact /// </summary> public string Reason { set { SetTag("reason", value); } get { return GetTag("reason"); } } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/����������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�022525� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/owner/����������������������������������������������0000755�0001750�0001750�00000000000�12204443225�023657� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/owner/OwnerIq.cs������������������������������������0000644�0001750�0001750�00000004463�12204443225�025601� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.x.muc.iq.owner { /* Example 72. Moderator Kicks Occupant <iq from='fluellen@shakespeare.lit/pda' id='kick1' to='harfleur@henryv.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='pistol' role='none'> <reason>Avaunt, you cullion!</reason> </item> </query> </iq> */ /// <summary> /// /// </summary> public class OwnerIq : IQ { private Owner m_Owner = new Owner(); public OwnerIq() { base.Query = m_Owner; this.GenerateId(); } public OwnerIq(IqType type) : this() { this.Type = type; } public OwnerIq(IqType type, Jid to) : this(type) { this.To = to; } public OwnerIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Owner Query { get { return m_Owner; } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/owner/Owner.cs��������������������������������������0000644�0001750�0001750�00000003103�12204443225�025275� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc.iq.owner { /* <iq id="jcl_110" to="xxxxxx@conference.jabber.org" type="set"> <query xmlns="http://jabber.org/protocol/muc#owner"> <x type="submit" xmlns="jabber:x:data"/> </query> </iq> */ public class Owner : Element { public Owner() { TagName = "query"; Namespace = Uri.MUC_OWNER; } } }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/admin/����������������������������������������������0000755�0001750�0001750�00000000000�12204443225�023615� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/admin/Admin.cs��������������������������������������0000644�0001750�0001750�00000005007�12204443225�025176� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc.iq.admin { /* <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='pistol' role='none'> <reason>Avaunt, you cullion!</reason> </item> </query> */ /// <summary> /// /// </summary> public class Admin : Element { public Admin() { this.TagName = "query"; this.Namespace = Uri.MUC_ADMIN; } /// <summary> /// /// </summary> /// <param name="item"></param> public void AddItem(Item item) { AddChild(item); } /// <summary> /// Adds the items. /// </summary> /// <param name="items">The items.</param> public void AddItems(Item[] items) { foreach (Item itm in items) { AddItem(itm); } } /// <summary> /// /// </summary> /// <returns></returns> public Item[] GetItems() { ElementList nl = SelectElements(typeof(Item)); Item[] items = new Item[nl.Count]; int i = 0; foreach (Item itm in nl) { items[i] = itm; i++; } return items; } } }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/admin/AdminIq.cs������������������������������������0000644�0001750�0001750�00000004467�12204443225�025501� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.x.muc.iq.admin { /* Example 72. Moderator Kicks Occupant <iq from='fluellen@shakespeare.lit/pda' id='kick1' to='harfleur@henryv.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='pistol' role='none'> <reason>Avaunt, you cullion!</reason> </item> </query> </iq> */ /// <summary> /// /// </summary> public class AdminIq : IQ { private Admin m_Admin = new Admin(); public AdminIq() { base.Query = m_Admin; this.GenerateId(); } public AdminIq(IqType type) : this() { this.Type = type; } public AdminIq(IqType type, Jid to) : this(type) { this.To = to; } public AdminIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Admin Query { get { return m_Admin; } } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/iq/admin/Item.cs���������������������������������������0000644�0001750�0001750�00000006716�12204443225�025054� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.x.muc.iq.admin { public class Item : agsXMPP.protocol.x.muc.Item { /// <summary> /// /// </summary> public Item() : base() { this.Namespace = Uri.MUC_ADMIN; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> public Item(Affiliation affiliation) : this() { this.Affiliation = affiliation; } public Item(Affiliation affiliation, Jid jid) : this(affiliation) { this.Jid = jid; } /// <summary> /// /// </summary> /// <param name="role"></param> public Item(Role role) : this() { this.Role = role; } public Item(Role role, Jid jid) : this(role) { this.Jid = jid; } public Item(Jid jid) : this() { this.Jid = jid; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> /// <param name="role"></param> public Item(Affiliation affiliation, Role role) : this(affiliation) { this.Role = role; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> /// <param name="role"></param> /// <param name="jid"></param> public Item(Affiliation affiliation, Role role, Jid jid) : this(affiliation, role) { this.Jid = jid; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> /// <param name="role"></param> /// <param name="reason"></param> public Item(Affiliation affiliation, Role role, string reason) : this(affiliation, role) { this.Reason = reason; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> /// <param name="role"></param> /// <param name="jid"></param> /// <param name="reason"></param> public Item(Affiliation affiliation, Role role, Jid jid, string reason) : this(affiliation, role, jid) { this.Reason = reason; } } } ��������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Actor.cs�����������������������������������������������0000644�0001750�0001750�00000002741�12204443225�023517� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { public class Actor : Element { public Actor() { this.TagName = "actor"; this.Namespace = Uri.MUC_USER; } public Jid Jid { get { return GetAttributeJid("jid"); } set { SetAttribute("jid", value); } } } } �������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/MucManager.cs������������������������������������������0000644�0001750�0001750�00000155734�12250206660�024502� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.protocol.client; using agsXMPP.protocol.x.muc; using agsXMPP.protocol.x.muc.iq; using agsXMPP.protocol.x.muc.iq.admin; using agsXMPP.protocol.x.muc.iq.owner; using agsXMPP.protocol.x.data; namespace agsXMPP.protocol.x.muc { /// <summary> /// A helper class for Multi User Chat /// </summary> public class MucManager { private XmppClientConnection m_connection = null; public MucManager(XmppClientConnection con) { m_connection = con; } #region << Invite >> /* <message from='crone1@shakespeare.lit/desktop' to='darkcave@macbeth.shakespeare.lit'> <x xmlns='http://jabber.org/protocol/muc#user'> <invite to='hecate@shakespeare.lit'> <reason> Hey Hecate, this is the place for all good witches! </reason> </invite> </x> </message> */ /// <summary> /// Invite a contact to join a chatroom /// </summary> /// <param name="to">The Jid of the contact to invite</param> /// <param name="room">The Jid of the chatroom</param> public void Invite(Jid to, Jid room) { Invite(to, room, null); } /// <summary> /// Invite a contact to join a chatroom /// </summary> /// <param name="to">The Jid of the contact to invite</param> /// <param name="room">The Jid of the chatroom</param> /// <param name="reason">The reason.</param> public void Invite(Jid to, Jid room, string reason) { Invite(to, room, reason, null); } /// <summary> /// Invite a contact to join a chatroom /// </summary> /// <param name="to">The Jid of the contact to invite</param> /// <param name="room">The Jid of the chatroom</param> /// <param name="reason">The reason.</param> /// <param name="password">The password required to enter the room.</param> public void Invite(Jid to, Jid room, string reason, string password) { Invite(new Jid[1] { to }, room, reason, password); } /// <summary> /// Invite multiple contacts to a chatroom /// </summary> /// <param name="jids"></param> /// <param name="room"></param> /// <param name="reason"></param> public void Invite(Jid[] jids, Jid room, string reason, string password) { Message msg = new Message(); msg.To = room; User user = new User(); foreach (Jid jid in jids) { if (reason != null) user.AddChild(new Invite(jid, reason)); else user.AddChild(new Invite(jid)); } if (password != null) { user.Password = password; } msg.AddChild(user); m_connection.Send(msg); } #endregion #region << Decline Invite >> /// <summary> /// Decline a groupchat invitation /// </summary> /// <param name="to">the jid which invited us</param> /// <param name="room">to room to which we send the decline (this is normally the same room we were invited to)</param> public void Decline(Jid to, Jid room) { Decline(to, room, null); } /// <summary> /// Decline a groupchat invitation /// </summary> /// <param name="to">the jid which invited us</param> /// <param name="room">to room to which we send the decline (this is normally the same room we were invited to)</param> /// <param name="reason">reason why we decline the invitation</param> public void Decline(Jid to, Jid room, string reason) { Message msg = new Message(); msg.To = room; User user = new User(); if (reason != null) user.Decline = new Decline(to, reason); else user.Decline = new Decline(to); msg.AddChild(user); m_connection.Send(msg); } #endregion /* <message from='darkcave@macbeth.shakespeare.lit/secondwitch' to='crone1@shakespeare.lit/desktop' type='groupchat'> <subject>Fire Burn and Cauldron Bubble!</subject> </message> */ /// <summary> /// Change the subject of a room /// </summary> /// <param name="room"></param> /// <param name="newSubject"></param> public void ChangeSubject(Jid room, string newSubject) { ChangeSubject(room, newSubject, null); } /// <summary> /// Change the subject of a room /// </summary> /// <param name="room"></param> /// <param name="newSubject"></param> /// <param name="body"></param> public void ChangeSubject(Jid room, string newSubject, string body) { Message msg = new Message(); msg.Type = MessageType.groupchat; msg.To = room; msg.Subject = newSubject; if (body != null) msg.Body = body; m_connection.Send(msg); } /// <summary> /// Change the Nickname in a room /// </summary> /// <param name="room"></param> /// <param name="newNick"></param> public void ChangeNickname(Jid room, string newNick) { Jid to = new Jid(room.ToString()); to.Resource = newNick; Presence pres = new Presence(); pres.To = to; m_connection.Send(pres); } /* <presence from='hag66@shakespeare.lit/pda' to='darkcave@macbeth.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'/> </presence> */ /// <summary> /// Join a chatroom /// </summary> /// <param name="room">jid of the room to join</param> /// <param name="nickname">nickname to use in the room</param> public void JoinRoom(Jid room, string nickname) { JoinRoom(room, nickname, null, false); } /// <summary> /// Join a chatroom /// </summary> /// <param name="room">jid of the room to join</param> /// <param name="nickname">nickname to use in the room</param> /// <param name="disableHistory">true for joining without chat room history</param> public void JoinRoom(Jid room, string nickname, bool disableHistory) { JoinRoom(room, nickname, null, disableHistory); } public void JoinRoom(Jid room, string nickname, string password) { JoinRoom(room, nickname, password, false); } /// <summary> /// Join a chatroom /// </summary> /// <param name="room">jid of the room to join</param> /// <param name="nickname">nickname to use in the room</param> /// <param name="password">password for password protected chat rooms</param> /// <param name="disableHistory">true for joining without chat room history</param> public void JoinRoom(Jid room, string nickname, string password, bool disableHistory) { /* <presence from='hag66@shakespeare.lit/pda' to='darkcave@macbeth.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'> <password>cauldron</password> </x> </presence> join room and request no history <presence from='hag66@shakespeare.lit/pda' to='darkcave@macbeth.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'> <history maxchars='0'/> </x> </presence> */ Jid to = new Jid(room.ToString()); to.Resource = nickname; Presence pres = new Presence(); pres.To = to; Muc x = new Muc(); if (password != null) x.Password = password; if (disableHistory) { History hist = new History(); hist.MaxCharacters = 0; x.History = hist; } pres.AddChild(x); m_connection.Send(pres); } /// <summary> /// Leave a conference room /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> public void LeaveRoom(Jid room, string nickname) { Jid to = new Jid(room.ToString()); to.Resource = nickname; Presence pres = new Presence(); pres.To = to; pres.Type = PresenceType.unavailable; m_connection.Send(pres); } /* 9.1.2 Creating an Instant Room If the initial room owner wants to accept the default room configuration (i.e., create an "instant room"), the room owner MUST decline an initial configuration form by sending an IQ set to the <room@service> itself containing a <query/> element qualified by the 'http://jabber.org/protocol/muc#owner' namespace, where the only child of the <query/> is an empty <x/> element that is qualified by the 'jabber:x:data' namespace and that possesses a 'type' attribute whose value is "submit": Example 129. Owner Requests Instant Room <iq from='crone1@shakespeare.lit/desktop' id='create1' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#owner'> <x xmlns='jabber:x:data' type='submit'/> </query> </iq> */ /// <summary> /// create an "instant room". This means you accept the default configuration and dont want to configure the room. /// </summary> /// <param name="room"></param> public void AcceptDefaultConfiguration(Jid room) { AcceptDefaultConfiguration(room, null); } /// <summary> /// create an "instant room". This means you accept the default configuration and dont want to configure the room. /// </summary> /// <param name="room"></param> /// <param name="cb"></param> /// <param name="cbArgs"></param> public void AcceptDefaultConfiguration(Jid room, IqHandler cb) { OwnerIq oIq = new agsXMPP.protocol.x.muc.iq.owner.OwnerIq(IqType.set, room); oIq.Query.AddChild(new Data(XDataFormType.submit)); if (cb == null) m_connection.Send(oIq); else m_connection.IqGrabber.SendIq(oIq, cb); } /* <iq from='crone1@shakespeare.lit/desktop' id='create1' to='darkcave@macbeth.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#owner'/> </iq> */ /// <summary> /// Request the configuration form of a chatroom. /// You can request the from when creating a new room. or at any time later if you want to change the room configuration. /// Only room owners can request this from. Otherwise the service must return a 403 forbidden error /// </summary> /// <param name="room"></param> public void RequestConfigurationForm(Jid room) { RequestConfigurationForm(room, null); } /// <summary> /// Request the configuration form of a chatroom. /// You can request the from when creating a new room. or at any time later if you want to change the room configuration. /// Only room owners can request this from. Otherwise the service must return a 403 forbidden error /// </summary> /// <param name="room"></param> /// <param name="cb"></param> /// <param name="cbArgs"></param> public void RequestConfigurationForm(Jid room, IqHandler cb) { OwnerIq oIq = new agsXMPP.protocol.x.muc.iq.owner.OwnerIq(IqType.get, room); m_connection.IqGrabber.SendIq(oIq, cb); } /* <iq from='fluellen@shakespeare.lit/pda' id='kick1' to='harfleur@henryv.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='pistol' role='none'> <reason>Avaunt, you cullion!</reason> </item> </query> </iq> */ /// <summary> /// Kick a occupant /// A moderator has permissions kick a visitor or participant from a room. /// The kick is normally performed based on the occupant's room nickname (though it MAY be based on the full JID) /// and is completed by setting the role of a participant or visitor to a value of "none". /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname">Nickname od the occupant to kick</param> public void KickOccupant(Jid room, string nickname) { KickOccupant(room, nickname, null, null); } /// <summary> /// Kick a occupant /// A moderator has permissions kick a visitor or participant from a room. /// The kick is normally performed based on the occupant's room nickname (though it MAY be based on the full JID) /// and is completed by setting the role of a participant or visitor to a value of "none". /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname">Nickname od the occupant to kick</param> /// <param name="reason">A optional reason why you kick this occupant</param> public void KickOccupant(Jid room, string nickname, string reason) { KickOccupant(room, nickname, reason, null); } /// <summary> /// Kick a occupant /// A moderator has permissions kick a visitor or participant from a room. /// The kick is normally performed based on the occupant's room nickname (though it MAY be based on the full JID) /// and is completed by setting the role of a participant or visitor to a value of "none". /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname">Nickname od the occupant to kick</param> /// <param name="reason">A optional reason why you kick this occupant</param> /// <param name="cb">Callback which is invoked with the result to this iq</param> /// <param name="cbArg">Callback which is invoked with the result to this iq</param> public void KickOccupant(Jid room, string nickname, string reason, IqHandler cb) { ChangeRole(Role.none, room, nickname, reason, cb); } /* Example 77. Moderator Grants Voice to a Visitor <iq from='crone1@shakespeare.lit/desktop' id='voice1' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='thirdwitch' role='participant'> <reason>A worthy witch indeed!</reason> </item> </query> </iq> */ /// <summary> /// /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname"></param> public void GrantVoice(Jid room, string nickname) { GrantVoice(room, nickname, null, null); } /// <summary> /// /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname"></param> /// <param name="reason"></param> public void GrantVoice(Jid room, string nickname, string reason) { GrantVoice(room, nickname, reason, null); } /// <summary> /// /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void GrantVoice(Jid room, string nickname, string reason, IqHandler cb) { ChangeRole(Role.participant, room, nickname, reason, cb); } /* Example 80. Moderator Revokes Voice from a Participant <iq from='crone1@shakespeare.lit/desktop' id='voice2' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='thirdwitch' role='visitor'/> </query> </iq> */ /// <summary> /// In a moderated room, a moderator may want to revoke a participant's privileges to speak. /// The moderator can revoke voice from a participant by changing the participant's role to "visitor": /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname"></param> public void RevokeVoice(Jid room, string nickname) { RevokeVoice(room, nickname, null, null); } /// <summary> /// In a moderated room, a moderator may want to revoke a participant's privileges to speak. /// The moderator can revoke voice from a participant by changing the participant's role to "visitor": /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname"></param> /// <param name="reason"></param> public void RevokeVoice(Jid room, string nickname, string reason) { RevokeVoice(room, nickname, reason, null); } /// <summary> /// In a moderated room, a moderator may want to revoke a participant's privileges to speak. /// The moderator can revoke voice from a participant by changing the participant's role to "visitor": /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="nickname"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RevokeVoice(Jid room, string nickname, string reason, IqHandler cb) { ChangeRole(Role.visitor, room, nickname, reason, cb); } /* A moderator in a moderated room may want to modify the voice list. To do so, the moderator first requests the voice list by querying the room for all occupants with a role of 'participant'. Example 84. Moderator Requests Voice List <iq from='bard@shakespeare.lit/globe' id='voice3' to='goodfolk@chat.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item role='participant'/> </query> </iq> */ /// <summary> /// A moderator in a moderated room may want to modify the voice list. /// To do so, the moderator first requests the voice list by querying the room for all occupants /// with a role of 'participant'. /// The service MUST then return the voice list to the moderator; each item MUST include /// the 'nick' and 'role' attributes and SHOULD include the 'affiliation' and 'jid' attributes. /// The moderator MAY then modify the voice list. In order to do so, the moderator MUST send the /// changed items (i.e., only the "delta") back to the service; each item MUST include /// the 'nick' attribute and 'role' attribute (normally set to a value of "participant" or "visitor") /// but SHOULD NOT include the 'jid' attribute and MUST NOT include the 'affiliation' attribute /// (which is used to manage affiliations such as owner rather than the participant role), /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> public void RequestVoiceList(Jid room) { RequestVoiceList(room, null); } /// <summary> /// A moderator in a moderated room may want to modify the voice list. /// To do so, the moderator first requests the voice list by querying the room for all occupants /// with a role of 'participant'. /// The service MUST then return the voice list to the moderator; each item MUST include /// the 'nick' and 'role' attributes and SHOULD include the 'affiliation' and 'jid' attributes. /// The moderator MAY then modify the voice list. In order to do so, the moderator MUST send the /// changed items (i.e., only the "delta") back to the service; each item MUST include /// the 'nick' attribute and 'role' attribute (normally set to a value of "participant" or "visitor") /// but SHOULD NOT include the 'jid' attribute and MUST NOT include the 'affiliation' attribute /// (which is used to manage affiliations such as owner rather than the participant role), /// </summary> /// <param name="room">Jid of the room to which this iq is sent</param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RequestVoiceList(Jid room, IqHandler cb) { RequestList(Role.participant, room, cb); } /* Example 89. Admin Bans User <iq from='kinghenryv@shakespeare.lit/throne' id='ban1' to='southampton@henryv.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='outcast' jid='earlofcambridge@shakespeare.lit'> <reason>Treason</reason> </item> </query> </iq> */ /// <summary> /// /// </summary> /// <param name="room"></param> /// <param name="user"></param> public void BanUser(Jid room, Jid user) { BanUser(room, user, null, null); } /// <summary> /// /// </summary> /// <param name="room"></param> /// <param name="user"></param> /// <param name="reason"></param> public void BanUser(Jid room, Jid user, string reason) { BanUser(room, user, reason, null); } /// <summary> /// /// </summary> /// <param name="room"></param> /// <param name="user"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void BanUser(Jid room, Jid user, string reason, IqHandler cb) { ChangeAffiliation(Affiliation.outcast, room, user, null, reason, cb); } /* A room admin may want to modify the ban list. Note: The ban list is always based on a user's bare JID, although a nick (perhaps the last room nickname associated with that JID) MAY be included for convenience. To modify the list of banned JIDs, the admin first requests the ban list by querying the room for all users with an affiliation of 'outcast'. Example 94. Admin Requests Ban List <iq from='kinghenryv@shakespeare.lit/throne' id='ban2' to='southampton@henryv.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='outcast'/> </query> </iq> */ /// <summary> /// A room admin may want to modify the ban list. /// <remarks> /// Note: The ban list is always based on a user's bare JID, /// although a nick (perhaps the last room nickname associated with that JID) MAY be included for convenience. /// To modify the list of banned JIDs, the admin first requests the ban list by querying the room for all /// users with an affiliation of 'outcast'. /// </remarks> /// </summary> /// <param name="room"></param> public void RequestBanList(Jid room) { RequestBanList(room, null); } /// <summary> /// A room admin may want to modify the ban list. /// <remarks> /// Note: The ban list is always based on a user's bare JID, /// although a nick (perhaps the last room nickname associated with that JID) MAY be included for convenience. /// To modify the list of banned JIDs, the admin first requests the ban list by querying the room for all /// users with an affiliation of 'outcast'. /// </remarks> /// </summary> /// <param name="room"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RequestBanList(Jid room, IqHandler cb) { RequestList(Affiliation.outcast, room, cb); } /* An owner can grant administrative privileges to a member or unaffiliated user; this is done by changing the user's affiliation to "admin": Example 155. Owner Grants Admin Privileges <iq from='crone1@shakespeare.lit/desktop' id='admin1' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='admin' jid='wiccarocks@shakespeare.lit'/> </query> </iq> */ /// <summary> /// Grant administrative privileges to a member or unaffiliated user. /// This could be done by an room owner /// </summary> /// <param name="room"></param> /// <param name="user"></param> public void GrantAdminPrivileges(Jid room, Jid user) { GrantAdminPrivileges(room, user, null); } /// <summary> /// Grant administrative privileges to a member or unaffiliated user. /// This could be done by an room owner /// </summary> /// <param name="room"></param> /// <param name="user"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void GrantAdminPrivileges(Jid room, Jid user, IqHandler cb) { ChangeAffiliation(Affiliation.admin, room, user, cb); } /* An admin can grant membership to a user; this is done by changing the user's affiliation to "member" (normally based on nick if the user is in the room, or on bare JID if not; in either case, if the nick is provided, that nick becomes the user's default nick in the room if that functionality is supported by the implementation) Example 98. Admin Grants Membership <iq from='crone1@shakespeare.lit/desktop' id='member1' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='member' jid='hag66@shakespeare.lit'/> </query> </iq> */ /// <summary> /// An admin can grant membership to a user; /// this is done by changing the user's affiliation to "member" /// (normally based on nick if the user is in the room, or on bare JID if not; /// in either case, if the nick is provided, that nick becomes the user's default nick in the room /// if that functionality is supported by the implementation) /// </summary> /// <param name="room"></param> /// <param name="user"></param> public void GrantMembership(Jid room, Jid user) { GrantMembership(room, user, null, null); } /// <summary> /// An admin can grant membership to a user; /// this is done by changing the user's affiliation to "member" /// (normally based on nick if the user is in the room, or on bare JID if not; /// in either case, if the nick is provided, that nick becomes the user's default nick in the room /// if that functionality is supported by the implementation) /// </summary> /// <param name="room"></param> /// <param name="user"></param> /// <param name="reason"></param> public void GrantMembership(Jid room, Jid user, string reason) { GrantMembership(room, user, reason, null); } /// <summary> /// An admin can grant membership to a user; /// this is done by changing the user's affiliation to "member" /// (normally based on nick if the user is in the room, or on bare JID if not; /// in either case, if the nick is provided, that nick becomes the user's default nick in the room /// if that functionality is supported by the implementation) /// </summary> /// <param name="room"></param> /// <param name="user"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void GrantMembership(Jid room, Jid user, string reason, IqHandler cb) { ChangeAffiliation(Affiliation.member, room, user, null, reason, cb); } /// <summary> /// An admin can grant membership to a user; /// this is done by changing the user's affiliation to "member" /// (normally based on nick if the user is in the room, or on bare JID if not; /// in either case, if the nick is provided, that nick becomes the user's default nick in the room /// if that functionality is supported by the implementation) /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> public void GrantMembership(Jid room, string nickname) { GrantMembership(room, nickname, null, null); } /// <summary> /// An admin can grant membership to a user; /// this is done by changing the user's affiliation to "member" /// (normally based on nick if the user is in the room, or on bare JID if not; /// in either case, if the nick is provided, that nick becomes the user's default nick in the room /// if that functionality is supported by the implementation) /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> /// <param name="reason"></param> public void GrantMembership(Jid room, string nickname, string reason) { GrantMembership(room, nickname, reason, null); } /// <summary> /// An admin can grant membership to a user; /// this is done by changing the user's affiliation to "member" /// (normally based on nick if the user is in the room, or on bare JID if not; /// in either case, if the nick is provided, that nick becomes the user's default nick in the room /// if that functionality is supported by the implementation) /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void GrantMembership(Jid room, string nickname, string reason, IqHandler cb) { ChangeAffiliation(Affiliation.member, room, nickname, reason, cb); } /* Example 144. Owner Grants Ownership Privileges <iq from='crone1@shakespeare.lit/desktop' id='owner1' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='owner' jid='hecate@shakespeare.lit'/> </query> </iq> */ /// <summary> /// If allowed by an implementation, an owner MAY grant ownership privileges to another user. /// </summary> /// <param name="room"></param> /// <param name="user"></param> public void GrantOwnershipPrivileges(Jid room, Jid user) { ChangeAffiliation(Affiliation.owner, room, user, null, null); } /// <summary> /// If allowed by an implementation, an owner MAY grant ownership privileges to another user. /// </summary> /// <param name="room"></param> /// <param name="user"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void GrantOwnershipPrivileges(Jid room, Jid user, IqHandler cb) { ChangeAffiliation(Affiliation.owner, room, user, cb); } /* 8.4 Revoking Membership An admin may want to revoke a user's membership; this is done by changing the user's affiliation to "none": Example 101. Admin Revokes Membership <iq from='crone1@shakespeare.lit/desktop' id='member2' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='none' nick='thirdwitch'/> </query> </iq> */ /// <summary> /// An admin may want to revoke a user's membership /// this is done by changing the user's affiliation to "none" /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> public void RevokeMembership(Jid room, string nickname) { RevokeMembership(room, nickname, null, null); } /// <summary> /// An admin may want to revoke a user's membership /// this is done by changing the user's affiliation to "none" /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> /// <param name="reason"></param> public void RevokeMembership(Jid room, string nickname, string reason) { RevokeMembership(room, nickname, reason, null); } /// <summary> /// An admin may want to revoke a user's membership /// this is done by changing the user's affiliation to "none" /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RevokeMembership(Jid room, string nickname, string reason, IqHandler cb) { ChangeAffiliation(Affiliation.none, room, nickname, reason, cb); } /* 9.8 Modifying the Admin List A room owner may want to modify the admin list. To do so, the owner first requests the admin list by querying the room for all users with an affiliation of 'admin'. Example 161. Owner Requests Admin List <iq from='bard@shakespeare.lit/desktopaffiliation id='admin3' to='darkcave@macbeth.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='admin'/> </query> </iq> */ /// <summary> /// Request the list of admins. This could be done by the room owner /// </summary> /// <param name="room"></param> public void RequestAdminList(Jid room) { RequestAdminList(room, null); } /// <summary> /// Request the list of admins. This could be done by the room owner /// </summary> /// <param name="room"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RequestAdminList(Jid room, IqHandler cb) { RequestList(Affiliation.admin, room, cb); } /* If allowed by an implementation, a room owner may want to modify the owner list. To do so, the owner first requests the owner list by querying the room for all users with an affiliation of 'owner'. Example 150. Owner Requests Owner List <iq from='bard@shakespeare.lit/globe' id='owner3' to='darkcave@macbeth.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='owner'/> </query> </iq> */ /// <summary> /// Request the owner list of a room /// </summary> /// <param name="room"></param> public void RequestOwnerList(Jid room) { RequestOwnerList(room, null); } /// <summary> /// Request the owner list of a room /// </summary> /// <param name="room"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RequestOwnerList(Jid room, IqHandler cb) { RequestList(Affiliation.owner, room, cb); } /* Example 105. Admin Requests Member List <iq from='crone1@shakespeare.lit/desktop' id='member3' to='darkcave@macbeth.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item affiliation='member'/> </query> </iq> */ /// <summary> /// In the context of a members-only room, the member list is essentially a "whitelist" of people /// who are allowed to enter the room. Anyone who is not a member is effectively banned from entering the room, /// even if their affiliation is not "outcast". /// In the context of an open room, the member list is simply a list of users (bare JID and reserved nick) /// who are registered with the room. Such users may appear in a room roster, have their room nickname reserved, /// be returned in search results or FAQ queries, and the like. /// It is RECOMMENDED that only room admins have the privilege to modify the member list in members-only rooms. /// To do so, the admin first requests the member list by querying the room for all users with an affiliation of "member" /// </summary> /// <param name="room"></param> public void RequestMemberList(Jid room) { RequestMemberList(room, null); } /// <summary> /// In the context of a members-only room, the member list is essentially a "whitelist" of people /// who are allowed to enter the room. Anyone who is not a member is effectively banned from entering the room, /// even if their affiliation is not "outcast". /// In the context of an open room, the member list is simply a list of users (bare JID and reserved nick) /// who are registered with the room. Such users may appear in a room roster, have their room nickname reserved, /// be returned in search results or FAQ queries, and the like. /// It is RECOMMENDED that only room admins have the privilege to modify the member list in members-only rooms. /// To do so, the admin first requests the member list by querying the room for all users with an affiliation of "member" /// </summary> /// <param name="room"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void RequestMemberList(Jid room, IqHandler cb) { RequestList(Affiliation.member, room, cb); } /* 8.6 Granting Moderator Privileges An admin may want to grant moderator privileges to a participant or visitor; this is done by changing the user's role to "moderator": Example 113. Admin Grants Moderator Privileges <iq from='crone1@shakespeare.lit/desktop' id='mod1' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='thirdwitch' role='moderator'/> </query> </iq> */ /// <summary> /// An admin may want to grant moderator privileges to a participant or visitor /// this is done by changing the user's role to "moderator" /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> public void GrantModeratorPrivileges(Jid room, string nickname) { GrantModeratorPrivileges(room, nickname, null, null); } /// <summary> /// An admin may want to grant moderator privileges to a participant or visitor /// this is done by changing the user's role to "moderator" /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> /// <param name="reason"></param> public void GrantModeratorPrivileges(Jid room, string nickname, string reason) { GrantModeratorPrivileges(room, nickname, reason, null); } /// <summary> /// An admin may want to grant moderator privileges to a participant or visitor /// this is done by changing the user's role to "moderator" /// </summary> /// <param name="room"></param> /// <param name="nickname"></param> /// <param name="reason"></param> /// <param name="cb"></param> /// <param name="cbArg"></param> public void GrantModeratorPrivileges(Jid room, string nickname, string reason, IqHandler cb) { ChangeRole(Role.moderator, room, nickname, reason, cb); } /* 8.7 Revoking Moderator Privileges An admin may want to revoke a user's moderator privileges. An admin MAY revoke moderator privileges only from a user whose affiliation is "member" or "none" (i.e., not from an owner or admin). The privilege is revoked by changing the user's role to "participant": Example 116. Admin Revokes Moderator Privileges <iq from='crone1@shakespeare.lit/desktop' id='mod2' to='darkcave@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item nick='thirdwitch' role='participant'/> </query> </iq> */ public void RevokeModerator(Jid room, string nickname) { RevokeModerator(room, nickname, null, null); } public void RevokeModerator(Jid room, string nickname, string reason) { RevokeModerator(room, nickname, reason, null); } public void RevokeModerator(Jid room, string nickname, string reason, IqHandler cb) { ChangeRole(Role.participant, room, nickname, reason, cb); } /* 8.8 Modifying the Moderator List An admin may want to modify the moderator list. To do so, the admin first requests the moderator list by querying the room for all users with a role of 'moderator'. Example 120. Admin Requests Moderator List <iq from='crone1@shakespeare.lit/desktop' id='mod3' to='darkcave@macbeth.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#admin'> <item role='moderator'/> </query> </iq> */ /// <summary> /// Requests the moderator list. /// </summary> /// <param name="room">The room.</param> public void RequestModeratorList(Jid room) { RequestModeratorList(room, null); } /// <summary> /// Requests the moderator list. /// </summary> /// <param name="room">The room.</param> /// <param name="cb">The cb.</param> /// <param name="cbArg">The cb arg.</param> public void RequestModeratorList(Jid room, IqHandler cb) { RequestList(Role.moderator, room, cb); } public void RequestList(Affiliation affiliation, Jid room, IqHandler cb) { AdminIq aIq = new AdminIq(); aIq.To = room; aIq.Type = IqType.get; aIq.Query.AddItem(new agsXMPP.protocol.x.muc.iq.admin.Item(affiliation)); if (cb == null) m_connection.Send(aIq); else m_connection.IqGrabber.SendIq(aIq, cb); } public void RequestList(Role role, Jid room, IqHandler cb) { AdminIq aIq = new AdminIq(); aIq.To = room; aIq.Type = IqType.get; aIq.Query.AddItem(new agsXMPP.protocol.x.muc.iq.admin.Item(role)); if (cb == null) m_connection.Send(aIq); else m_connection.IqGrabber.SendIq(aIq, cb); } #region << Create Reserved Room >> /// <summary> /// Creates a reserved room. The MUC server replies to this request either with an error if the room already exists /// or another error occured. Or with the configuration for, for the reserved room which you have submit in the /// second step /// </summary> /// <param name="room">Jid of the room to create</param> public void CreateReservedRoom(Jid room) { CreateReservedRoom(room, null); } /// <summary> /// <para> /// Creates a reserved room. The MUC server replies to this request either with an error if the room already exists /// or another error occured. Or with the configuration for, for the reserved room which you have submit in the /// second step. /// </para> /// </summary> /// <param name="room">Jid of the room to create</param> /// <param name="cb">callback for the response</param> /// <param name="cbArg">optional callback arguments</param> public void CreateReservedRoom(Jid room, IqHandler cb) { /* <iq from='crone1@shakespeare.lit/desktop' id='create1' to='darkcave@macbeth.shakespeare.lit' type='get'> <query xmlns='http://jabber.org/protocol/muc#owner'/> </iq> */ OwnerIq iq = new OwnerIq(); iq.Type = IqType.get; iq.To = room; if (cb == null) m_connection.Send(iq); else m_connection.IqGrabber.SendIq(iq, cb); } #endregion #region << Destroy Room >> public void DestroyRoom(Jid room, Jid altVenue) { DestroyRoom(room, altVenue, null, null); } public void DestroyRoom(Jid room, Jid altVenue, IqHandler cb) { DestroyRoom(room, altVenue, null, cb); } public void DestroyRoom(Jid room, string reason) { DestroyRoom(room, null, reason, null); } public void DestroyRoom(Jid room, string reason, IqHandler cb) { DestroyRoom(room, null, reason, cb); } public void DestroyRoom(Jid room, Jid altVenue, string reason) { DestroyRoom(room, altVenue, reason, null); } public void DestroyRoom(Jid room, Jid altVenue, string reason, IqHandler cb) { /* Example 177. Owner Submits Room Destruction Request <iq from='crone1@shakespeare.lit/desktop' id='begone' to='heath@macbeth.shakespeare.lit' type='set'> <query xmlns='http://jabber.org/protocol/muc#owner'> <destroy jid='darkcave@macbeth.shakespeare.lit'> <reason>Macbeth doth come.</reason> </destroy> </query> </iq> */ OwnerIq iq = new OwnerIq(); iq.Type = IqType.set; iq.To = room; owner.Destroy destroy = new owner.Destroy(); if (reason != null) destroy.Reason = reason; if (altVenue != null) destroy.AlternateVenue = altVenue; iq.Query.AddChild(destroy); if (cb == null) m_connection.Send(iq); else m_connection.IqGrabber.SendIq(iq, cb); } #endregion public void ModifyList(Jid room, agsXMPP.protocol.x.muc.iq.admin.Item[] items) { ModifyList(room, items, null); } public void ModifyList(Jid room, agsXMPP.protocol.x.muc.iq.admin.Item[] items, IqHandler cb) { AdminIq aIq = new AdminIq(); aIq.To = room; aIq.Type = IqType.set; foreach (agsXMPP.protocol.x.muc.iq.admin.Item itm in items) { aIq.Query.AddItem(itm); } if (cb == null) m_connection.Send(aIq); else m_connection.IqGrabber.SendIq(aIq, cb); } #region << private functions >> private void ChangeRole(Role role, Jid room, string nickname, string reason, IqHandler cb) { AdminIq aIq = new AdminIq(); aIq.To = room; aIq.Type = IqType.set; agsXMPP.protocol.x.muc.iq.admin.Item itm = new agsXMPP.protocol.x.muc.iq.admin.Item(); itm.Role = role; itm.Nickname = nickname; if (reason != null) itm.Reason = reason; aIq.Query.AddItem(itm); if (cb == null) m_connection.Send(aIq); else m_connection.IqGrabber.SendIq(aIq, cb); } private void ChangeAffiliation(Affiliation affiliation, Jid room, string nickname, string reason, IqHandler cb) { AdminIq aIq = new AdminIq(); aIq.To = room; aIq.Type = IqType.set; agsXMPP.protocol.x.muc.iq.admin.Item itm = new agsXMPP.protocol.x.muc.iq.admin.Item(); itm.Affiliation = affiliation; if (nickname != null) itm.Nickname = nickname; if (reason != null) itm.Reason = reason; aIq.Query.AddItem(itm); if (cb == null) m_connection.Send(aIq); else m_connection.IqGrabber.SendIq(aIq, cb); } private void ChangeAffiliation(Affiliation affiliation, Jid room, Jid user, IqHandler cb) { ChangeAffiliation(affiliation, room, user, null, null, cb); } private void ChangeAffiliation(Affiliation affiliation, Jid room, Jid user, string nickname, string reason, IqHandler cb) { var aIq = new AdminIq(); aIq.To = room; aIq.Type = IqType.set; agsXMPP.protocol.x.muc.iq.admin.Item itm = new agsXMPP.protocol.x.muc.iq.admin.Item(); itm.Affiliation = affiliation; if (user != null) itm.Jid = user; if (nickname != null) itm.Nickname = nickname; if (reason != null) itm.Reason = reason; aIq.Query.AddItem(itm); if (cb == null) m_connection.Send(aIq); else m_connection.IqGrabber.SendIq(aIq, cb); } #endregion } } ������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Item.cs������������������������������������������������0000644�0001750�0001750�00000010633�12204443225�023344� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /// <summary> /// Summary description for Item. /// </summary> public class Item : agsXMPP.protocol.Base.Item { /* <x xmlns='http://jabber.org/protocol/muc#user'> <item affiliation='admin' role='moderator'/> </x> <item nick='pistol' role='none'> <reason>Avaunt, you cullion!</reason> </item> <presence from='darkcave@macbeth.shakespeare.lit/thirdwitch' to='crone1@shakespeare.lit/desktop'> <x xmlns='http://jabber.org/protocol/muc#user'> <item affiliation='none' jid='hag66@shakespeare.lit/pda' role='participant'/> </x> </presence> */ /// <summary> /// /// </summary> public Item() : base() { this.TagName = "item"; this.Namespace = Uri.MUC_USER; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> public Item(Affiliation affiliation) : this() { this.Affiliation = affiliation; } /// <summary> /// /// </summary> /// <param name="role"></param> public Item(Role role) : this() { this.Role = role; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> /// <param name="role"></param> public Item(Affiliation affiliation, Role role) : this(affiliation) { this.Role = role; } /// <summary> /// /// </summary> /// <param name="affiliation"></param> /// <param name="role"></param> /// <param name="reason"></param> public Item(Affiliation affiliation, Role role, string reason) : this(affiliation, role) { this.Reason = reason; } /// <summary> /// /// </summary> public Role Role { get { return (Role) GetAttributeEnum("role", typeof(Role)); } set { SetAttribute("role", value.ToString()); } } /// <summary> /// /// </summary> public Affiliation Affiliation { get { return (Affiliation) GetAttributeEnum("affiliation", typeof(Affiliation)); } set { SetAttribute("affiliation", value.ToString()); } } /// <summary> /// /// </summary> public string Nickname { get { return GetAttribute("nick"); } set { SetAttribute("nick", value); } } /// <summary> /// /// </summary> public string Reason { set { SetTag("reason", value); } get { return GetTag("reason"); } } public Actor Actor { get { return SelectSingleElement(typeof(Actor)) as Actor; } set { if (HasTag(typeof(Actor))) RemoveTag(typeof(Actor)); if (value != null) this.AddChild(value); } } } }�����������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/Affiliation.cs�����������������������������������������0000644�0001750�0001750�00000002620�12204443225�024670� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.x.muc { /// <summary> /// There are five defined affiliations that a user may have in relation to a room /// </summary> public enum Affiliation { /// <summary> /// the absence of an affiliation /// </summary> none, owner, admin, member, outcast } } ����������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/muc/History.cs���������������������������������������������0000644�0001750�0001750�00000010613�12204443225�024105� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.muc { /* Example 29. User Requests Limit on Number of Messages in History <presence from='hag66@shakespeare.lit/pda' to='darkcave@macbeth.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'> <history maxstanzas='20'/> </x> </presence> Example 30. User Requests History in Last 3 Minutes <presence from='hag66@shakespeare.lit/pda' to='darkcave@macbeth.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'> <history seconds='180'/> </x> </presence> Example 31. User Requests All History Since the Beginning of the Unix Era <presence from='hag66@shakespeare.lit/pda' to='darkcave@macbeth.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'> <history since='1970-01-01T00:00Z'/> </x> </presence> */ /// <summary> /// This is used to get the history of a muc room /// </summary> public class History : Element { #region << Constructors >> /// <summary> /// Empty default constructor /// </summary> public History() { this.TagName = "history"; this.Namespace = Uri.MUC; } /// <summary> /// get the history starting from a given date when available /// </summary> /// <param name="date"></param> public History(DateTime date) : this() { this.Since = date; } /// <summary> /// Specify the maximum nunber of messages to retrieve from the history /// </summary> /// <param name="max"></param> public History(int max) : this() { this.MaxStanzas = max; } #endregion /// <summary> /// request the last xxx seconds of history when available /// </summary> public int Seconds { get { return GetAttributeInt("seconds"); } set { SetAttribute("seconds", value); } } /// <summary> /// Request maximum stanzas of history when available /// </summary> public int MaxStanzas { get { return GetAttributeInt("maxstanzas"); } set { SetAttribute("maxstanzas", value); } } /// <summary> /// Request history from a given date when available /// </summary> public DateTime Since { get { return Util.Time.ISO_8601Date(GetAttribute("since")); } set { SetAttribute("since", Util.Time.ISO_8601Date(value)); } } /// <summary> /// 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). /// </summary> public int MaxCharacters { get { return GetAttributeInt("maxchars"); } set { SetAttribute("maxchars", value); } } } } ���������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/Delay.cs���������������������������������������������������0000644�0001750�0001750�00000004300�12204443225�022712� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x { // <presence to="gnauck@myjabber.net/myJabber v3.5" from="yahoo.myjabber.net/registered"> // <status>Extended Away</status> // <show>xa</show><priority>5</priority> // <x stamp="20050206T13:09:50" from="gnauck@myjabber.net/myJabber v3.5" xmlns="jabber:x:delay"/> // </presence> /// <summary> /// <para> /// Delay class for Timestamps /// </para> /// <para> /// Mainly used in offline and groupchat messages. This is the time when the message was received by the server /// </para> /// </summary> public class Delay : Element { public Delay() { this.TagName = "x"; this.Namespace = Uri.X_DELAY; } public Jid From { get { if (HasAttribute("from")) return new Jid(GetAttribute("from")); else return null; } set { SetAttribute("from", value.ToString()); } } public DateTime Stamp { get { return Util.Time.Date(GetAttribute("stamp")); } set { SetAttribute("stamp", Util.Time.Date(value)); } } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/Event.cs���������������������������������������������������0000644�0001750�0001750�00000010776�12204443225�022753� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x { /// <summary> /// JEP-0022: Message Events /// This JEP defines protocol extensions used to request and respond to events relating to the delivery, display, and composition of messages. /// </summary> public class Event : Element { public Event() { this.TagName = "x"; this.Namespace = Uri.X_EVENT; } /// <summary> /// Indicates that the message has been stored offline by the intended recipient's server. /// This event is triggered only if the intended recipient's server supports offline storage, /// has that support enabled, and the recipient is offline when the server receives the message for delivery. /// </summary> public bool Offline { get { return HasTag("offline"); } set { RemoveTag("offline"); if (value) AddTag("offline"); } } /// <summary> /// Indicates that the message has been delivered to the recipient. /// This signifies that the message has reached the recipient's Jabber client, /// but does not necessarily mean that the message has been displayed. /// This event is to be raised by the Jabber client. /// </summary> public bool Delivered { get { return HasTag("delivered"); } set { RemoveTag("delivered"); if (value) AddTag("delivered"); } } /// <summary> /// Once the message has been received by the recipient's Jabber client, /// it may be displayed to the user. /// This event indicates that the message has been displayed, and is to be raised by the Jabber client. /// Even if a message is displayed multiple times, this event should be raised only once. /// </summary> public bool Displayed { get { return HasTag("displayed"); } set { RemoveTag("displayed"); if (value) AddTag("displayed"); } } /// <summary> /// In threaded chat conversations, this indicates that the recipient is composing a reply to a message. /// The event is to be raised by the recipient's Jabber client. /// A Jabber client is allowed to raise this event multiple times in response to the same request, /// providing the original event is cancelled first. /// </summary> public bool Composing { get { return HasTag("composing"); } set { RemoveTag("composing"); if (value) AddTag("composing"); } } /// <summary> /// 'id' attribute of the original message to which this event notification pertains. /// (If no 'id' attribute was included in the original message, then the id tag must still be included with no /// </summary> public string Id { get { return GetTag("id"); } set { SetTag("id", value); } } } }��smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/rosterx/���������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�023036� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/rosterx/RosterItem.cs��������������������������������������0000644�0001750�0001750�00000004007�12204443225�025463� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.Base; namespace agsXMPP.protocol.x.rosterx { public enum Action { NONE = -1, add, remove, modify } /// <summary> /// Summary description for RosterItem. /// </summary> public class RosterItem : agsXMPP.protocol.Base.RosterItem { /* <item action='delete' jid='rosencrantz@denmark' name='Rosencrantz'> <group>Visitors</group> </item> */ public RosterItem() : base() { this.Namespace = Uri.X_ROSTERX; } public RosterItem(Jid jid) : this() { Jid = jid; } public RosterItem(Jid jid, string name) : this(jid) { Name = name; } public RosterItem(Jid jid, string name, Action action) : this(jid, name) { Action = action; } public Action Action { get { return (Action) GetAttributeEnum("action", typeof(Action)); } set { SetAttribute("action", value.ToString()); } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/rosterx/RosterX.cs�����������������������������������������0000644�0001750�0001750�00000005005�12204443225�024773� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x.rosterx { /// <summary> /// Roster Item Exchange (JEP-0144) /// </summary> public class RosterX : Element { /* <message from='horatio@denmark.lit' to='hamlet@denmark.lit'> <body>Some visitors, m'lord!</body> <x xmlns='http://jabber.org/protocol/rosterx'> <item action='add' jid='rosencrantz@denmark.lit' name='Rosencrantz'> <group>Visitors</group> </item> <item action='add' jid='guildenstern@denmark.lit' name='Guildenstern'> <group>Visitors</group> </item> </x> </message> */ /// <summary> /// Initializes a new instance of the <see cref="RosterX"/> class. /// </summary> public RosterX() { this.TagName = "x"; this.Namespace = Uri.X_ROSTERX; } /// <summary> /// Gets the roster. /// </summary> /// <returns></returns> public RosterItem[] GetRoster() { ElementList nl = SelectElements(typeof(RosterItem)); int i = 0; RosterItem[] result = new RosterItem[nl.Count]; foreach (RosterItem ri in nl) { result[i] = (RosterItem) ri; i++; } return result; } /// <summary> /// Adds a roster item. /// </summary> /// <param name="r">The r.</param> public void AddRosterItem(RosterItem r) { this.ChildNodes.Add(r); } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/x/Avatar.cs��������������������������������������������������0000644�0001750�0001750�00000003213�12204443225�023074� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.x { // <x xmlns="jabber:x:avatar"><hash>bbf231f2b7fa1772c2ec5cffa620d3aedb4bd793</hash></x> /// <summary> /// JEP-0008 avatars /// </summary> public class Avatar : Element { public Avatar() { this.TagName = "x"; this.Namespace = Uri.X_AVATAR; } public Avatar(string hash) : this() { Hash = hash; } public string Hash { get { return GetTag("hash"); } set { SetTag("hash", value); } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/server/������������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�022367� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/server/Presence.cs�������������������������������������������0000644�0001750�0001750�00000002445�12204443225�024467� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.server { public class Presence : agsXMPP.protocol.client.Presence { public Presence() { this.Namespace = Uri.SERVER; } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/tls/���������������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�021663� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/tls/Failure.cs�����������������������������������������������0000644�0001750�0001750�00000003046�12204443225�023604� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.tls { // Step 5 (alt): Server informs client that TLS negotiation has failed and closes both stream and TCP connection: // <failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> // </stream:stream> /// <summary> /// Summary description for Failure. /// </summary> public class Failure : Element { public Failure() { this.TagName = "failure"; this.Namespace = Uri.TLS; } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/tls/Proceed.cs�����������������������������������������������0000644�0001750�0001750�00000002734�12204443225�023601� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.tls { // Step 5: Server informs client that it is allowed to proceed: // <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> /// <summary> /// Summary description for Proceed. /// </summary> public class Proceed : Element { public Proceed() { this.TagName = "proceed"; this.Namespace = Uri.TLS; } } } ������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/tls/StartTls.cs����������������������������������������������0000644�0001750�0001750�00000003374�12204443225�024001� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.tls { // Step 4: Client sends the STARTTLS command to server: // <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> /// <summary> /// Summary description for starttls. /// </summary> public class StartTls : Element { public StartTls() { this.TagName = "starttls"; this.Namespace = Uri.TLS; } public bool Required { get { return HasTag("required"); } set { if (value == false) { if (HasTag("required")) RemoveTag("required"); } else { if (!HasTag("required")) SetTag("required"); } } } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/storage/�����������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�022525� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/storage/AvatarIq.cs������������������������������������������0000644�0001750�0001750�00000003775�12204443225�024600� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.storage { // Once such data has been set, the avatar can be retrieved by any requesting client from the avatar-generating client's public XML storage: // // Example 8. // // <iq id='1' type='get' to='user@server'> // <query xmlns='storage:client:avatar'/> // </iq> /// <summary> /// Summary description for AvatarIq. /// </summary> public class AvatarIq : IQ { private Avatar m_Avatar = new Avatar(); public AvatarIq() { base.Query = m_Avatar; this.GenerateId(); } public AvatarIq(IqType type) : this() { this.Type = type; } public AvatarIq(IqType type, Jid to) : this(type) { this.To = to; } public AvatarIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Avatar Query { get { return m_Avatar; } } } } ���smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/storage/Avatar.cs��������������������������������������������0000644�0001750�0001750�00000003040�12204443225�024267� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.storage { // <iq id='0' type='set' to='user@server'> // <query xmlns='storage:client:avatar'> // <data mimetype='image/jpeg'> // Base64 Encoded Data // </data> // </query> // </iq> /// <summary> /// Summary description for Avatar. /// </summary> public class Avatar : Base.Avatar { public Avatar() : base() { this.Namespace = Uri.STORAGE_AVATAR; } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Time/��������������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�021757� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Time/Time.cs�������������������������������������������������0000644�0001750�0001750�00000005616�12204443225�023214� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.time { public class Time : Element { /// <summary> /// XEP-0202: Entity Time /// </summary> public Time() { TagName = "time"; Namespace = Uri.URN_TIME; } /// <summary> /// Gets or sets the UTC offset. /// </summary> /// <value>The UTC offset.</value> public TimeSpan UtcOffset { get { var tzo = GetTag("tzo"); if (tzo == null) return TimeSpan.Zero; /* .NET is not able to parse the following format: "-03:30" so we append the minutes and .NET is happy. -10:00 len:6 10:00 len:5 */ if (tzo.Length == 5 || tzo.Length == 6) tzo += ":00"; return TimeSpan.Parse(tzo); } set { SetTag("tzo", FormatOffset(value)); } } /// <summary> /// Gets or sets the date time. /// </summary> /// <value>The date time.</value> public DateTime DateTime { get { return Util.Time.ISO_8601Date(GetTag("utc")); } set { SetTag("utc", Util.Time.ISO_8601Date(value)); } } /// <summary> /// Sets the utc offset and time automatically. /// </summary> public void SetDateTimeNow() { UtcOffset = Util.Time.UtcOffset(); DateTime = DateTime.Now; } static string FormatOffset(TimeSpan ts) { return String.Format("{0:00}:{1:00}", ts.Hours, Math.Abs(ts.Minutes)); } } }������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/����������������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�021472� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/oob/������������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�022251� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/oob/Oob.cs������������������������������������������������0000644�0001750�0001750�00000003535�12204443225�023325� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.oob { // <iq type="set" to="horatio@denmark" from="sailor@sea" id="i_oob_001"> // <query xmlns="jabber:iq:oob"> // <url>http://denmark/act4/letter-1.html</url> // <desc>There's a letter for you sir.</desc> // </query> // </iq> /// <summary> /// Zusammenfassung fr Oob. /// </summary> public class Oob : Element { public Oob() { this.TagName = "query"; this.Namespace = Uri.IQ_OOB; } public string Url { set { SetTag("url", value); } get { return GetTag("url"); } } public string Description { set { SetTag("desc", value); } get { return GetTag("desc"); } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/oob/OobIq.cs����������������������������������������������0000644�0001750�0001750�00000003301�12204443225�023606� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.oob { /// <summary> /// Summary description for OobIq. /// </summary> public class OobIq : IQ { private Oob m_Oob = new Oob(); public OobIq() { base.Query = m_Oob; this.GenerateId(); } public OobIq(IqType type) : this() { this.Type = type; } public OobIq(IqType type, Jid to) : this(type) { this.To = to; } public OobIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Oob Query { get { return m_Oob; } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/����������������������������������������������������0000755�0001750�0001750�00000000000�12204443225�022571� 5����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Vcard.cs��������������������������������������������0000644�0001750�0001750�00000021605�12204443225�024163� 0����������������������������������������������������������������������������������������������������ustar�00meebey��������������������������meebey��������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using agsXMPP.Xml.Dom; using agsXMPP.protocol.iq.vcard; // JEP-0054 // http://www.jabber.org/jeps/jep-0054.html // Example 2. Receiving One's Own vCard // // <iq // to='stpeter@jabber.org/Gabber' // type='result' // id='v1'> // <vCard xmlns='vcard-temp'> // <FN>Peter Saint-Andre</FN> // <N> // <FAMILY>Saint-Andre<FAMILY> // <GIVEN>Peter</GIVEN> // <MIDDLE/> // </N> // <NICKNAME>stpeter</NICKNAME> // <URL>http://www.jabber.org/people/stpeter.php</URL> // <BDAY>1966-08-06</BDAY> // <ORG> // <ORGNAME>Jabber Software Foundation</ORGNAME> // <ORGUNIT/> // </ORG> // <TITLE>Executive Director // Patron Saint // 303-308-3282 // // // // // Suite 600 // 1899 Wynkoop Street // Denver // CO // 80202 // USA // // 303-555-1212 // // // // // // // Denver // CO // 80209 // USA // // stpeter@jabber.org // stpeter@jabber.org // // More information about me is located on my // personal website: http://www.saint-andre.com/ // // // // namespace agsXMPP.protocol.iq.vcard { // // /// /// Summary description for Vcard. /// public class Vcard : Element { #region << Constructors >> public Vcard() { this.TagName = "vCard"; this.Namespace = Uri.VCARD; } #endregion /// /// /// public string Url { get { return GetTag("URL"); } set { SetTag("URL", value); } } /// /// /// public DateTime Birthday { get { try { string sDate = GetTag("BDAY"); if (sDate != null) return DateTime.Parse(sDate); else return DateTime.MinValue; } catch { return DateTime.MinValue; } } set { SetTag("BDAY", value.ToString("yyyy-MM-dd")); } } /// /// /// public string Title { get { return GetTag("TITLE"); } set { SetTag("TITLE", value); } } /// /// /// public string Role { get { return GetTag("ROLE"); } set { SetTag("ROLE", value); } } public string Fullname { get { return GetTag("FN"); } set { SetTag("FN", value); } } public string Nickname { get { return GetTag("NICKNAME"); } set { SetTag("NICKNAME", value); } } public Jid JabberId { get { return new Jid(GetTag("JABBERID")); } set { SetTag("JABBERID", value.ToString()); } } /// /// /// public string Description { get { return GetTag("DESC"); } set { SetTag("DESC", value); } } /// /// /// public Name Name { get { return SelectSingleElement(typeof(Name)) as Name; } set { Element n = SelectSingleElement(typeof(Name)); if (n != null) n.Remove(); AddChild(value); } } #if !CF /// /// a Photograph /// public Photo Photo { get { return SelectSingleElement(typeof(Photo)) as Photo; } set { Element p = SelectSingleElement(typeof(Photo)); if (p != null) p.Remove(); AddChild(value); } } #endif /// /// /// public Organization Organization { get { return SelectSingleElement(typeof(Organization)) as Organization; } set { Element org = SelectSingleElement(typeof(Organization)); if (org != null) org.Remove(); AddChild(value); } } /// /// /// /// public Address[] GetAddresses() { ElementList el = SelectElements(typeof(Address)); int i = 0; Address[] result = new Address[el.Count]; foreach (Address add in el) { result[i] = add; i++; } return result; } /// /// /// /// /// public Address GetAddress(AddressLocation loc) { foreach (Address adr in GetAddresses()) { if (adr.Location == loc) return adr; } return null; } public void AddAddress(Address addr) { Address a = GetAddress(addr.Location); if (a != null) a.Remove(); this.AddChild(addr); } public Address GetPreferedAddress() { foreach (Address adr in GetAddresses()) { if (adr.IsPrefered) return adr; } return null; } public Telephone[] GetTelephoneNumbers() { ElementList el = SelectElements(typeof(Telephone)); int i = 0; Telephone[] result = new Telephone[el.Count]; foreach (Telephone tel in el) { result[i] = tel; i++; } return result; } public Telephone GetTelephoneNumber(TelephoneType type, TelephoneLocation loc) { foreach (Telephone phone in GetTelephoneNumbers()) { if (phone.Type == type && phone.Location == loc) return phone; } return null; } public void AddTelephoneNumber(Telephone tel) { Telephone t = GetTelephoneNumber(tel.Type, tel.Location); if (t != null) t.Remove(); this.AddChild(tel); } /// /// Adds a new Email Adress object /// /// public void AddEmailAddress(Email mail) { Email e = GetEmailAddress(mail.Type); if (e != null) e.Remove(); this.AddChild(mail); } /// /// Get all Email addresses /// /// public Email[] GetEmailAddresses() { ElementList el = SelectElements(typeof(Email)); int i = 0; Email[] result = new Email[el.Count]; foreach (Email mail in el) { result[i] = mail; i++; } return result; } public Email GetEmailAddress(EmailType type) { foreach (Email email in GetEmailAddresses()) { if (email.Type == type) return email; } return null; } public Email GetPreferedEmailAddress() { foreach (Email email in GetEmailAddresses()) { if (email.IsPrefered) return email; } return null; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Name.cs0000644000175000017500000000365412204443225024010 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.vcard { /// /// /// public class Name : Element { // // Saint-Andre // Peter // // #region << Constructors >> public Name() { this.TagName = "N"; this.Namespace = Uri.VCARD; } public Name(string family, string given, string middle) : this() { this.Family = family; this.Given = given; this.Middle = middle; } #endregion public string Family { get { return GetTag("FAMILY"); } set { SetTag("FAMILY", value); } } public string Given { get { return GetTag("GIVEN"); } set { SetTag("GIVEN", value); } } public string Middle { get { return GetTag("MIDDLE"); } set { SetTag("MIDDLE", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Email.cs0000644000175000017500000000523112204443225024150 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.vcard { // // public enum EmailType { NONE = -1, HOME, WORK, INTERNET, X400, } /// /// /// public class Email : Element { // stpeter@jabber.org #region << Constructors >> public Email() { this.TagName = "EMAIL"; this.Namespace = Uri.VCARD; } /// /// /// /// Type of the new Email Adress /// Email Adress /// Is this adressed prefered public Email(EmailType type, string userid, bool prefered) : this() { Type = type; IsPrefered = prefered; UserId = userid; } #endregion public EmailType Type { get { return (EmailType) HasTagEnum(typeof(EmailType)); } set { if (value != EmailType.NONE) SetTag(value.ToString()); } } /// /// Is this the prefered contact adress? /// public bool IsPrefered { get { return HasTag("PREF"); } set { if (value == true) SetTag("PREF"); else RemoveTag("PREF"); } } /// /// The email Adress /// public string UserId { get { return GetTag("USERID"); } set { SetTag("USERID", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Organization.cs0000644000175000017500000000346012204443225025567 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.vcard { /// /// /// public class Organization : Element { // // Jabber Software Foundation // // #region << Constructors >> public Organization() { this.TagName = "ORG"; this.Namespace = Uri.VCARD; } public Organization(string name, string unit) : this() { this.Name = name; this.Unit = unit; } #endregion public string Name { get { return GetTag("ORGNAME"); } set { SetTag("ORGNAME", value); } } public string Unit { get { return GetTag("ORGUNIT"); } set { SetTag("ORGUNIT", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Photo.cs0000644000175000017500000001347312204443225024221 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #if !CF using System; using System.IO; #if !SL using System.Drawing; using System.Drawing.Imaging; #endif using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.vcard { /// /// Vcard Photo /// When you dont want System.Drawing in the Lib just remove the photo stuff /// public class Photo : Element { // // #region << Constructors >> public Photo() { this.TagName = "PHOTO"; this.Namespace = Uri.VCARD; } #if !SL public Photo(Image image, ImageFormat format) : this() { SetImage(image, format); } #endif public Photo(string url) : this() { SetImage(url); } #endregion /// /// The Media Type, Only available when BINVAL /// public string Type { //image get { return GetTag("TYPE"); } set { SetTag("TYPE", value); } } /// /// Sets the URL of an external image /// /// public void SetImage(string url) { SetTag("EXTVAL", url); } /* /// /// Sets a internal Image /// /// public void SetImage(Image image) { Image = image; } */ #if !SL public void SetImage(Image image, ImageFormat format) { // if we have no FOrmatprovider then we save the image as PNG if (format == null) format = ImageFormat.Png; // 17.05.2006 // fixed GDI+ bug see also http://www.bobpowell.net/imagefileconvert.htm string sType = "image"; if (format == ImageFormat.Jpeg) sType = "image/jpeg"; else if (format == ImageFormat.Png) sType = "image/png"; else if (format == ImageFormat.Gif) sType = "image/gif"; #if!CF_2 else if (format == ImageFormat.Tiff) sType = "image/tiff"; #endif SetTag("TYPE", sType); //create temporary Image temp = new Bitmap(image.Width, image.Height); //get graphics Graphics g = Graphics.FromImage(temp); //copy image // i hope this overload of DrawImage works now on all Frameworks, also CF2 g.DrawImage(image, new Rectangle(0, 0, temp.Width, temp.Height), new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel); //g.DrawImage(image, 0, 0, image.Width, image.Height); g.Dispose(); MemoryStream ms = new MemoryStream(); temp.Save(ms, format); byte[] buf = ms.GetBuffer(); SetTagBase64("BINVAL", buf); } /// /// returns the image format or null for unknown formats or TYPES /// public ImageFormat ImageFormat { get { string sType = GetTag("TYPE"); if (sType == "image/jpeg") return ImageFormat.Jpeg; else if (sType == "image/png") return ImageFormat.Png; else if (sType == "image/gif") return ImageFormat.Gif; #if!CF_2 else if (sType == "image/tiff") return ImageFormat.Tiff; #endif else return null; } } /// /// gets or sets the from internal (binary) or external source /// When external then it trys to get the image with a Webrequest /// public System.Drawing.Image Image { get { try { if (HasTag("BINVAL")) { byte[] pic = Convert.FromBase64String(GetTag("BINVAL")); System.IO.MemoryStream ms = new System.IO.MemoryStream(pic, 0, pic.Length); return new System.Drawing.Bitmap(ms); } else if (HasTag("EXTVAL")) { System.Net.WebRequest req = System.Net.WebRequest.Create(GetTag("EXTVAL")); System.Net.WebResponse response = req.GetResponse(); return new System.Drawing.Bitmap(response.GetResponseStream()); } else return null; } catch { return null; } } /* set { SetTag("TYPE", "image"); MemoryStream ms = new MemoryStream(); // Save the Image as PNG to the Memorystream value.Save(ms, ImageFormat.Png); byte[] buf = ms.GetBuffer(); SetTagBase64("BINVAL", buf); } */ } #endif } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Telephone.cs0000644000175000017500000000476712204443225025061 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.vcard { public enum TelephoneLocation { NONE = -1, HOME, WORK } public enum TelephoneType { NONE = -1, VOICE, FAX, PAGER, MSG, CELL, VIDEO, BBS, MODEM, ISDN, PCS, PREF, NUMBER } /// /// Zusammenfassung fr Telephone. /// public class Telephone : Element { // 303-308-3282 // // #region << Constructors >> public Telephone() { this.TagName = "TEL"; this.Namespace = Uri.VCARD; } public Telephone(TelephoneLocation loc, TelephoneType type, string number) : this() { if(loc != TelephoneLocation.NONE) this.Location = loc; if(type != TelephoneType.NONE) this.Type = type; this.Number = number; } #endregion public string Number { get { return GetTag("NUMBER"); } set { SetTag("NUMBER", value); } } public TelephoneLocation Location { get { return (TelephoneLocation) HasTagEnum(typeof(TelephoneLocation)); } set { SetTag(value.ToString()); } } public TelephoneType Type { get { return (TelephoneType) HasTagEnum(typeof(TelephoneType)); } set { SetTag(value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/VcardIq.cs0000644000175000017500000000433612204443225024457 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.vcard { // /// /// Summary description for VcardIq. /// public class VcardIq : IQ { private Vcard m_Vcard = new Vcard(); #region << Constructors >> public VcardIq() { this.GenerateId(); this.AddChild(m_Vcard); } public VcardIq(IqType type) : this() { this.Type = type; } public VcardIq(IqType type, Vcard vcard) : this(type) { this.Vcard = vcard; } public VcardIq(IqType type, Jid to) : this(type) { this.To = to; } public VcardIq(IqType type, Jid to, Vcard vcard) : this(type, to) { this.Vcard = vcard; } public VcardIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public VcardIq(IqType type, Jid to, Jid from, Vcard vcard) : this(type, to, from) { this.Vcard = vcard; } #endregion public override Vcard Vcard { get { return m_Vcard; } set { ReplaceChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/vcard/Address.cs0000644000175000017500000000660012204443225024507 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.vcard { public enum AddressLocation { NONE = -1, HOME, WORK } /// /// /// public class Address : Element { // // // // // Suite 600 // 1899 Wynkoop Street // Denver // CO // 80202 // USA // public Address() { this.TagName = "ADR"; this.Namespace = Uri.VCARD; } public Address(AddressLocation loc, string extra, string street, string locality, string region, string postalcode, string country, bool prefered) : this() { Location = loc; ExtraAddress = extra; Street = street; Locality = locality; Region = region; PostalCode = postalcode; Country = country; IsPrefered = prefered; } public AddressLocation Location { get { return (AddressLocation) HasTagEnum(typeof(AddressLocation)); } set { SetTag(value.ToString()); } } public bool IsPrefered { get { return HasTag("PREF"); } set { if (value == true) SetTag("PREF"); else RemoveTag("PREF"); } } public string ExtraAddress { get { return GetTag("EXTADD"); } set { SetTag("EXTADD", value); } } public string Street { get { return GetTag("STREET"); } set { SetTag("STREET", value); } } public string Locality { get { return GetTag("LOCALITY"); } set { SetTag("LOCALITY", value); } } public string Region { get { return GetTag("REGION"); } set { SetTag("REGION", value); } } public string PostalCode { get { return GetTag("PCODE"); } set { SetTag("PCODE", value); } } public string Country { get { return GetTag("CTRY"); } set { SetTag("CTRY", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/register/0000755000175000017500000000000012204443225023316 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/register/RegisterIq.cs0000644000175000017500000000343712204443225025732 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.register { /// /// Used for registering new usernames on Jabber/XMPP Servers /// public class RegisterIq : IQ { private Register m_Register = new Register(); public RegisterIq() { base.Query = m_Register; this.GenerateId(); } public RegisterIq(IqType type) : this() { this.Type = type; } public RegisterIq(IqType type, Jid to) : this(type) { this.To = to; } public RegisterIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Register Query { get { return m_Register; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/register/Register.cs0000644000175000017500000000731112204443225025433 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x.data; using agsXMPP.Xml; using agsXMPP.Xml.Dom; // Sample 1 // gnauck2secret // // Sample 2 // test1secret // test1mysecretChoose a username and password to register with this server. namespace agsXMPP.protocol.iq.register { /// /// Used for registering new usernames on Jabber/XMPP Servers /// public class Register : Element { #region << Constructors >> public Register() { this.TagName = "query"; this.Namespace = Uri.IQ_REGISTER; } public Register(string username, string password) : this() { Username = username; Password = password; } #endregion #region << Properties >> public string Username { get { return GetTag("username"); } set { SetTag("username", value); } } public string Password { get { return GetTag("password"); } set { SetTag("password", value); } } public string Instructions { get { return GetTag("instructions"); } set { SetTag("instructions", value); } } public string Name { get { return GetTag("name"); } set { SetTag("name", value); } } public string Email { get { return GetTag("email"); } set { SetTag("email", value); } } /// /// Remove registration from the server /// public bool RemoveAccount { get { return HasTag("remove"); } set { if (value == true) SetTag("remove"); else RemoveTag("remove"); } } /// /// The X-Data Element /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) this.AddChild(value); } } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/register/RegisterEventArgs.cs0000644000175000017500000000405312204443225027252 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.iq.register { public delegate void RegisterEventHandler(object sender, RegisterEventArgs args); public class RegisterEventArgs { public RegisterEventArgs() { } public RegisterEventArgs(Register reg) { m_Register = reg; } // by default we register automatically private bool m_Auto = true; private Register m_Register; /// /// Set Auto to true if the library should register automatically /// Set it to false if you want to fill out the registration fields manual /// public bool Auto { get { return m_Auto; } set { m_Auto = value; } } public Register Register { get { return m_Register; } set { m_Register = value; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/agent/0000755000175000017500000000000012204443225022570 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/agent/Agent.cs0000644000175000017500000000674712204443225024173 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.agent { // Public Conferencingpublic // AIM TransportaimEnter ID // Yahoo! TransportyahooEnter ID // ICQ TransporticqEnter ID // MSN TransportmsnEnter ID /// /// Zusammenfassung fr Agent. /// public class Agent : Element { public Agent() { this.TagName = "agent"; this.Namespace = Uri.IQ_AGENTS; } public Jid Jid { get { return new Jid(this.GetAttribute("jid")); } set { SetAttribute("jid", value.ToString()); } } public string Name { get { return GetTag("name"); } set { SetTag("name", value); } } public string Service { get { return GetTag("service"); } set { SetTag("service", value); } } public string Description { get { return GetTag("description"); } set { SetTag("description", value); } } /// /// Can we register this agent/transport /// public bool CanRegister { get { return HasTag("register"); } set { if (value == true) SetTag("register"); else RemoveTag("register"); } } /// /// Can we search thru this agent/transport /// public bool CanSearch { get { return HasTag("search"); } set { if (value == true) SetTag("search"); else RemoveTag("search"); } } /// /// Is this agent a transport? /// public bool IsTransport { get { return HasTag("transport"); } set { if (value == true) SetTag("transport"); else RemoveTag("transport"); } } /// /// Is this agent for groupchat /// public bool IsGroupchat { get { return HasTag("groupchat"); } set { if (value == true) SetTag("groupchat"); else RemoveTag("groupchat"); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/agent/Agents.cs0000644000175000017500000000455712204443225024353 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.agent { // Send: // // // Recv: // // Public Conferencingpublic // AIM TransportaimEnter ID // Yahoo! TransportyahooEnter ID // ICQ TransporticqEnter ID // MSN TransportmsnEnter ID // // /// /// Zusammenfassung fr Agent. /// public class Agents : Element { public Agents() { this.TagName = "query"; this.Namespace = Uri.IQ_AGENTS; } public ElementList GetAgents() { return SelectElements("agent"); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/agent/AgentsIq.cs0000644000175000017500000000354612204443225024642 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; // Request Agents: // // // namespace agsXMPP.protocol.iq.agent { /// /// Summary description for AgentsIq. /// public class AgentsIq : IQ { private Agents m_Agents = new Agents(); public AgentsIq() { base.Query = m_Agents; this.GenerateId(); } public AgentsIq(IqType type) : this() { this.Type = type; } public AgentsIq(IqType type, Jid to) : this(type) { this.To = to; } public AgentsIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Agents Query { get { return m_Agents; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/search/0000755000175000017500000000000012204443225022737 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/search/SearchItem.cs0000644000175000017500000000602012204443225025310 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.search { // jabber:iq:search // Example 4. Receiving Search Results // // // // // Juliet // Capulet // JuliC // juliet@shakespeare.lit // // // Tybalt // Capulet // ty // tybalt@shakespeare.lit // // // /// /// /// public class SearchItem : Element { public SearchItem() { this.TagName = "item"; this.Namespace = Uri.IQ_SEARCH; } public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); else RemoveAttribute("jid"); } } public string Firstname { get { return GetTag("first"); } set { SetTag("first", value); } } public string Lastname { get { return GetTag("last"); } set { SetTag("last", value); } } /// /// Nickname, null when not available /// public string Nickname { get { return GetTag("nick"); } set { SetTag("nick", value); } } public string Email { get { return GetTag("email"); } set { SetTag("email", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/search/SearchIq.cs0000644000175000017500000000371512204443225024773 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; // Example 1. Requesting Search Fields // // // // namespace agsXMPP.protocol.iq.search { /// /// Summary description for SearchIq. /// public class SearchIq : IQ { private Search m_Search = new Search(); public SearchIq() { base.Query = m_Search; this.GenerateId(); } public SearchIq(IqType type) : this() { this.Type = type; } public SearchIq(IqType type, Jid to) : this(type) { this.To = to; } public SearchIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Search Query { get { return m_Search; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/search/Search.cs0000644000175000017500000000761312204443225024502 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x.data; using agsXMPP.Xml.Dom; // Example 1. Requesting Search Fields // // // // // // The service MUST then return the possible search fields to the user, and MAY include instructions: // // Example 2. Receiving Search Fields // // // // // Fill in one or more fields to search // for any matching Jabber users. // // // // // // // namespace agsXMPP.protocol.iq.search { /// /// http://www.jabber.org/jeps/jep-0055.html /// public class Search : Element { public Search() { this.TagName = "query"; this.Namespace = Uri.IQ_SEARCH; } public string Instructions { get { return GetTag("instructions"); } set { SetTag("instructions", value); } } public string Firstname { get { return GetTag("first"); } set { SetTag("first", value); } } public string Lastname { get { return GetTag("last"); } set { SetTag("last", value); } } public string Nickname { get { return GetTag("nick"); } set { SetTag("nick", value); } } public string Email { get { return GetTag("email"); } set { SetTag("email", value); } } /// /// The X-Data Element /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) this.AddChild(value); } } /// /// Retrieve the result items of a search /// //public ElementList GetItems //{ // get // { // return this.SelectElements("item"); // } //} public SearchItem[] GetItems() { ElementList nl = SelectElements(typeof(SearchItem)); SearchItem[] items = new SearchItem[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (SearchItem)e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/bind/0000755000175000017500000000000012204443225022406 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/bind/Bind.cs0000644000175000017500000000420212204443225023607 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.bind { /// /// Summary description for Bind. /// public class Bind : Element { // SENT: // Exodus // // RECV: // user@server.org/agsxmpp // public Bind() { this.TagName = "bind"; this.Namespace = Uri.BIND; } public Bind(string resource) : this() { this.Resource = resource; } public Bind(Jid jid) : this() { this.Jid = jid; } /// /// The resource to bind /// public string Resource { get { return GetTag("resource"); } set { SetTag("resource", value); } } /// /// The jid the server created /// public Jid Jid { get { return GetTagJid("jid"); } set { SetTag("jid", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/bind/BindIq.cs0000644000175000017500000000323712204443225024110 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.bind { /// /// Summary description for BindIq. /// public class BindIq : IQ { private Bind m_Bind = new Bind(); public BindIq() { GenerateId(); AddChild(m_Bind); } public BindIq(IqType type) : this() { Type = type; } public BindIq(IqType type, string resource) : this(type) { m_Bind.Resource = resource; } public new Bind Query { get { return m_Bind; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/0000755000175000017500000000000012250206660023150 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/PrivacyManager.cs0000644000175000017500000003244012250206660026412 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP; using agsXMPP.protocol.client; using agsXMPP.protocol.iq.privacy; namespace agsXMPP.protocol.iq.privacy { /// /// Helper class for managing server side privacy lists (blocking communication) /// public class PrivacyManager { private XmppClientConnection m_connection = null; public PrivacyManager(XmppClientConnection con) { m_connection = con; } /// /// Retrieving all Privacy Lists /// public void GetLists() { GetLists(null); } /// /// Retrieving all Privacy Lists /// /// Callback for the server result /// Callback arguments for the result when needed public void GetLists(IqHandler cb) { /* Example: Client requests names of privacy lists from server: Example: Server sends names of privacy lists to client, preceded by active list and default list: */ PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.get; SendStanza(pIq, cb); } /// /// Requests a privacy list from the server by its name /// /// name of the privacy list to retrieve public void GetList(string name) { GetList(name, null); } /// /// Requests a privacy list from the server by its name /// /// name of the privacy list to retrieve /// Callback for the server result /// Callback arguments for the result when needed public void GetList(string name, IqHandler cb) { /* Example: Client requests a privacy list from server: Example: Server sends a privacy list to client: */ PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.get; pIq.Query.AddList(new List(name)); SendStanza(pIq, cb); } /// /// Remove a privacy list /// /// name of the privacy list to remove public void RemoveList(string name) { RemoveList(name, null); } /// /// Remove a privacy list /// /// name of the privacy list to remove /// Callback for the server result /// Callback arguments for the result when needed public void RemoveList(string name, IqHandler cb) { PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.set; pIq.Query.AddList(new List(name)); SendStanza(pIq, cb); } /// /// Decline the use of any active list /// public void DeclineActiveList() { DeclineActiveList(null); } /// /// Decline the use of any active list /// /// Callback for the server result /// Callback arguments for the result when needed public void DeclineActiveList(IqHandler cb) { /* In order to decline the use of any active list, the connected resource MUST send an empty element with no 'name' attribute. Example: Client declines the use of active lists: Example: Server acknowledges success of declining any active list: */ PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.set; pIq.Query.Active = new Active(); SendStanza(pIq, cb); } /// /// Change the active list /// /// public void ChangeActiveList(string name) { ChangeActiveList(name, null); } /// /// Change the active list /// /// /// Callback for the server result /// Callback arguments for the result when needed public void ChangeActiveList(string name, IqHandler cb) { /* Example: Client requests change of active list: The server MUST activate and apply the requested list before sending the result back to the client. Example: Server acknowledges success of active list change: If the user attempts to set an active list but a list by that name does not exist, the server MUST return an stanza error to the user: Example: Client attempts to set a non-existent list as active: */ PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.set; pIq.Query.Active = new Active(name); SendStanza(pIq, cb); } /// /// Change the default list /// /// name of the new default list public void ChangeDefaultList(string name) { ChangeDefaultList(name, null); } /// /// Change the default list /// /// name of the new default list /// Callback for the server result /// Callback arguments for the result when needed public void ChangeDefaultList(string name, IqHandler cb) { PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.set; pIq.Query.Default = new Default(name); SendStanza(pIq, cb); } /// /// Decline the use of the default list /// public void DeclineDefaultList() { DeclineDefaultList(null); } /// /// Decline the use of the default list /// /// Callback for the server result /// Callback arguments for the result when needed public void DeclineDefaultList(IqHandler cb) { PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.set; pIq.Query.Default = new Default(); SendStanza(pIq, cb); } /// /// Update the list with the given name and rules. /// /// /// Specify the desired changes to the list by including all elements/rules in the list /// (not the "delta") /// /// name of the list /// rules of this list public void UpdateList(string name, Item[] rules) { UpdateList(name, rules, null); } /// /// Update the list with the given name and rules. /// /// /// Specify the desired changes to the list by including all elements/rules in the list /// (not the "delta") /// /// name of this list /// rules of this list /// Callback for the server result /// Callback arguments for the result when needed public void UpdateList(string name, Item[] rules, IqHandler cb) { PrivacyIq pIq = new PrivacyIq(); pIq.Type = agsXMPP.protocol.client.IqType.set; // create a new list with the given name List list = new List(name); list.AddItems(rules); // add the list to the query pIq.Query.AddList(list); SendStanza(pIq, cb); } /// /// Add a new list with the given name and rules /// /// /// public void AddList(string name, Item[] rules) { AddList(name, rules, null); } /// /// Add a new list with the given name and rules. /// /// /// ///// Callback for the server result /// Callback arguments for the result when needed public void AddList(string name, Item[] rules, IqHandler cb) { UpdateList(name, rules, cb); } /// /// Sends a PrivacyIq over the active connection /// /// /// /// private void SendStanza(PrivacyIq pIq, IqHandler cb) { if (cb == null) m_connection.Send(pIq); else m_connection.IqGrabber.SendIq(pIq, cb); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/PrivacyIq.cs0000644000175000017500000000365212204443225025413 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.privacy { /// /// Summary description for PrivateIq. /// public class PrivacyIq : IQ { Privacy m_Privacy = new Privacy(); public PrivacyIq() { base.Query = m_Privacy; this.GenerateId(); } public PrivacyIq(IqType type) : this() { this.Type = type; } public PrivacyIq(IqType type, Jid to) : this(type) { this.To = to; } public PrivacyIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Privacy Query { get { return m_Privacy; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Privacy.cs0000644000175000017500000000566112204443225025123 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.privacy { public class Privacy : Element { public Privacy() { this.TagName = "query"; this.Namespace = Uri.IQ_PRIVACY; } /// /// Add a provacy list /// /// public void AddList(List list) { this.AddChild(list); } /// /// Get all Lists /// /// Array of all privacy lists public List[] GetList() { ElementList el = SelectElements(typeof(List)); int i = 0; List[] result = new List[el.Count]; foreach (List list in el) { result[i] = list; i++; } return result; } /// /// The active list /// public Active Active { get { return SelectSingleElement(typeof(Active)) as Active; } set { if (HasTag(typeof(Active))) RemoveTag(typeof(Active)); if (value != null) this.AddChild(value); } } /// /// The default list /// public Default Default { get { return SelectSingleElement(typeof(Default)) as Default; } set { if (HasTag(typeof(Default))) RemoveTag(typeof(Default)); this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Type.cs0000644000175000017500000000270612204443225024424 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.iq.privacy { public enum Type { NONE = -1, /// /// /// jid, /// /// /// group, /// /// /// subscription } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/RuleManager.cs0000644000175000017500000001075412204443225025707 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.protocol.iq.roster; namespace agsXMPP.protocol.iq.privacy { /// /// Helper class for creating rules for communication blocking /// public class RuleManager { /// /// Block stanzas by Jid /// /// /// /// stanzas you want to block /// public Item BlockByJid(Jid jidToBlock, int order, Stanza stanza) { return new Item(Action.deny, order, Type.jid, jidToBlock.ToString(), stanza); } /// /// Block stanzas for a given roster group /// /// /// /// stanzas you want to block /// public Item BlockByGroup(string group, int order, Stanza stanza) { return new Item(Action.deny, order, Type.group, group, stanza); } /// /// Block stanzas by subscription type /// /// /// /// stanzas you want to block /// public Item BlockBySubscription(SubscriptionType subType, int order, Stanza stanza) { return new Item(Action.deny, order, Type.subscription, subType.ToString(), stanza); } /// /// Block globally (all users) the given stanzas /// /// /// stanzas you want to block /// public Item BlockGlobal(int order, Stanza stanza) { return new Item(Action.deny, order, stanza); } /// /// Allow stanzas by Jid /// /// /// /// stanzas you want to block /// public Item AllowByJid(Jid jidToBlock, int order, Stanza stanza) { return new Item(Action.allow, order, Type.jid, jidToBlock.ToString(), stanza); } /// /// Allow stanzas for a given roster group /// /// /// /// stanzas you want to block /// public Item AllowByGroup(string group, int order, Stanza stanza) { return new Item(Action.allow, order, Type.group, group, stanza); } /// /// Allow stanzas by subscription type /// /// /// /// stanzas you want to block /// public Item AllowBySubscription(SubscriptionType subType, int order, Stanza stanza) { return new Item(Action.allow, order, Type.subscription, subType.ToString(), stanza); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Active.cs0000644000175000017500000000267012204443225024716 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.iq.privacy { /// /// The active list /// public class Active : List { public Active() { this.TagName = "active"; } public Active(string name) : this() { Name = name; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Action.cs0000644000175000017500000000263712204443225024723 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.iq.privacy { /// /// privacy lis action /// public enum Action { /// /// /// allow, /// /// /// deny } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Default.cs0000644000175000017500000000267512204443225025074 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.iq.privacy { /// /// The default list /// public class Default : List { public Default() { this.TagName = "default"; } public Default(string name) : this() { Name = name; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/List.cs0000644000175000017500000000521012204443225024407 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.privacy { public class List : Element { public List() { this.TagName = "list"; this.Namespace = Uri.IQ_PRIVACY; } public List(string name) : this() { Name = name; } public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } /// /// Gets all Rules (Items) when available /// /// public Item[] GetItems() { ElementList el = SelectElements(typeof(Item)); int i = 0; Item[] result = new Item[el.Count]; foreach (Item itm in el) { result[i] = itm; i++; } return result; } /// /// Adds a rule (item) to the list /// /// public void AddItem(Item item) { this.AddChild(item); } public void AddItems(Item[] items) { foreach (Item item in items) { this.AddChild(item); } } /// /// Remove all items/rules of this list /// public void RemoveAllItems() { this.RemoveTags(typeof(Item)); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Item.cs0000644000175000017500000001604312204443225024400 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.privacy { /// /// This class represents a rule which is used for blocking communication /// public class Item : Element { #region << Constructors >> /// /// Default Contructor /// public Item() { this.TagName = "item"; this.Namespace = Uri.IQ_PRIVACY; } /// /// /// /// /// public Item(Action action, int order) : this() { Action = action; Order = order; } /// /// /// /// /// /// public Item(Action action, int order, Stanza stanza) : this(action, order) { Stanza = stanza; } /// /// /// /// /// /// /// public Item(Action action, int order, Type type, string value) : this(action, order) { Type = type; Val = value; } /// /// /// /// /// /// /// /// public Item(Action action, int order, Type type, string value, Stanza stanza) : this(action, order, type, value) { Stanza = stanza; } #endregion public Action Action { get { return (Action)GetAttributeEnum("action", typeof(Action)); } set { SetAttribute("action", value.ToString()); } } public Type Type { get { return (Type)GetAttributeEnum("type", typeof(Type)); } set { if (value != Type.NONE) SetAttribute("type", value.ToString()); else RemoveAttribute("type"); } } /// /// The order of this rule /// public int Order { get { return GetAttributeInt("order"); } set { SetAttribute("order", value); } } /// /// The value to match of this rule /// public string Val { get { return GetAttribute("value"); } set { SetAttribute("value", value); } } /// /// Block Iq stanzas /// public bool BlockIq { get { return HasTag("iq"); } set { if (value) this.SetTag("iq"); else this.RemoveTag("iq"); } } /// /// Block messages /// public bool BlockMessage { get { return HasTag("message"); } set { if (value) this.SetTag("message"); else this.RemoveTag("message"); } } /// /// Block incoming presence /// public bool BlockIncomingPresence { get { return HasTag("presence-in"); } set { if (value) this.SetTag("presence-in"); else this.RemoveTag("presence-in"); } } /// /// Block outgoing presence /// public bool BlockOutgoingPresence { get { return HasTag("presence-out"); } set { if (value) this.SetTag("presence-out"); else this.RemoveTag("presence-out"); } } /// /// which stanzas should be blocked? /// public Stanza Stanza { get { Stanza result = Stanza.All; if (BlockIq) result |= Stanza.Iq; if (BlockMessage) result |= Stanza.Message; if (BlockIncomingPresence) result |= Stanza.IncomingPresence; if (BlockOutgoingPresence) result |= Stanza.OutgoingPresence; return result; } set { if (value == Stanza.All) { // Block All Communications BlockIq = false; BlockMessage = false; BlockIncomingPresence = false; BlockOutgoingPresence = false; } else { BlockIq = ((value & Stanza.Iq) == Stanza.Iq); BlockMessage = ((value & Stanza.Message) == Stanza.Message); BlockIncomingPresence = ((value & Stanza.IncomingPresence) == Stanza.IncomingPresence); BlockOutgoingPresence = ((value & Stanza.OutgoingPresence) == Stanza.OutgoingPresence); } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/privacy/Stanza.cs0000644000175000017500000000456312204443225024746 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.iq.privacy { /// /// enum for block or allow communications. /// This flags could be combined under the following conditions. /// /// /// /// All must stand alone, its not allowed to combine thsi flag /// Message, Iq, IncomingPresence and Outgoing Presence could be combined, /// but its not allowed to combine more than 3 of this flag. /// If you need all of them you have to use the All flag /// /// public enum Stanza { /// /// Block all stanzas /// !!! Don't combine this flag with others!!! /// All = 0, /// /// Block messages /// Message = 1, /// /// Block IQs /// Iq = 2, /// /// Block Incoming Presences /// IncomingPresence = 4, /// /// Block Outgoing Presences /// OutgoingPresence = 8, } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/time/0000755000175000017500000000000012204443225022430 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/time/Time.cs0000644000175000017500000000456012204443225023662 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.time { /* 20020910T17:58:35 MDT Tue Sep 10 12:58:35 2002 */ /// /// XEP-0090: Entity Time /// public class Time : Element { public Time() { this.TagName = "query"; this.Namespace = Uri.IQ_TIME; } public string Utc { get { return GetTag("utc"); } set { SetTag("utc", value); } } /// /// Timezone /// public string Tz { get { return GetTag("tz"); } set { SetTag("tz", value); } } /// /// Human-readable date/time. /// public string Display { get { return GetTag("display"); } set { SetTag("display", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/time/TimeIq.cs0000644000175000017500000000332012204443225024145 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.time { /// /// Summary description for TimeIq. /// public class TimeIq : IQ { private Time m_Time = new Time(); public TimeIq() { base.Query = m_Time; this.GenerateId(); } public TimeIq(IqType type) : this() { this.Type = type; } public TimeIq(IqType type, Jid to) : this(type) { this.To = to; } public TimeIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Time Query { get { return m_Time; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/avatar/0000755000175000017500000000000012204443225022750 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/avatar/AvatarIq.cs0000644000175000017500000000336012204443225025011 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.avatar { /// /// Summary description for AvatarIq. /// public class AvatarIq : IQ { private Avatar m_Avatar = new Avatar(); public AvatarIq() { base.Query = m_Avatar; this.GenerateId(); } public AvatarIq(IqType type) : this() { this.Type = type; } public AvatarIq(IqType type, Jid to) : this(type) { this.To = to; } public AvatarIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Avatar Query { get { return m_Avatar; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/avatar/Avatar.cs0000644000175000017500000000306712204443225024523 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.avatar { // // // // Base64-Encoded Data // // // /// /// Summary description for Avatar. /// public class Avatar : agsXMPP.protocol.Base.Avatar { public Avatar() : base() { this.Namespace = Uri.IQ_AVATAR; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/browse/0000755000175000017500000000000012204443225022773 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/browse/BrowseItem.cs0000644000175000017500000000452612204443225025411 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.browse { /// /// Summary description for BrowseItem. /// public class BrowseItem : agsXMPP.protocol.Base.Item { /* http://jabber.org/protocol/muc */ public BrowseItem() : base() { this.Namespace = Uri.IQ_BROWSE; } public string Category { get { return GetAttribute("category"); } set { SetAttribute("category", value); } } public string Version { get { return GetAttribute("version"); } set { SetAttribute("version", value); } } public string Type { get { return GetAttribute("type"); } set { SetAttribute("type", value); } } /// /// Gets all advertised namespaces of this item /// /// string array that contains the advertised namespaces public string[] GetNamespaces() { ElementList elements = SelectElements("ns"); string[] nss = new string[elements.Count]; int i=0; foreach (Element ns in elements) { nss[i] = ns.Value; i++; } return nss; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/browse/BrowseIq.cs0000644000175000017500000000335312204443225025061 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.browse { /// /// Summary description for BrowseIq. /// public class BrowseIq : IQ { private Browse m_Browse = new Browse(); public BrowseIq() { base.Query = m_Browse; this.GenerateId(); } public BrowseIq(IqType type) : this() { this.Type = type; } public BrowseIq(IqType type, Jid to) : this(type) { this.To = to; } public BrowseIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Browse Query { get { return m_Browse; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/browse/Browse.cs0000644000175000017500000000562012204443225024566 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // JEP-0011: Jabber Browsing // // This JEP defines a way to describe information about Jabber entities and the relationships between entities. // Note: This JEP is superseded by JEP-0030: Service Discovery. // WARNING: This JEP has been deprecated by the Jabber Software Foundation. // Implementation of the protocol described herein is not recommended. Developers desiring similar functionality should // implement the protocol that supersedes this one (if any). // Most components and gateways still dont implement Service discovery. So we must use jabber:iq:browse for them until everything // is replaced with JEP 30 (Service Discovery). namespace agsXMPP.protocol.iq.browse { /// /// Summary description for Browse. /// public class Browse : Element { public Browse() { this.TagName = "query"; this.Namespace = Uri.IQ_BROWSE; } public string Category { get { return GetAttribute("category"); } set { SetAttribute("category", value); } } public string Type { get { return GetAttribute("type"); } set { SetAttribute("type", value); } } public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } public string[] GetNamespaces() { ElementList elements = SelectElements("ns"); string[] nss = new string[elements.Count]; int i=0; foreach (Element ns in elements) { nss[i] = ns.Value; i++; } return nss; } public BrowseItem[] GetItems() { ElementList nl = SelectElements(typeof(BrowseItem)); BrowseItem[] items = new BrowseItem[nl.Count]; int i = 0; foreach (Element item in nl) { items[i] = item as BrowseItem; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/browse/Service.cs0000644000175000017500000001150512204443225024724 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.browse { /// /// Historically each category was used as the name of an element, /// and the type was an attribute, such as <service type="aim"/>. /// The proper expression for all new implementations supporting this specification is to express the type information /// as attributes on a generic item element: <item category="service" type="aim"/>. /// When processing returned browse information this new syntax should always be handled first, /// and the old syntax only used if it is important to be able to access older implementations. /// Additional unofficial categories or types may be specified by prefixing their name with /// an "x-", such as "service/x-virgeim" or "x-location/gps". /// Changes to the official categories and subtypes may be defined either by revising this JEP or by activating another JEP. /// Removal of a category or subtype must be noted in this document. /// public class Service : Element { /* http://jabber.org/protocol/muc jabber:iq:gateway jabber:iq:register jabber:iq:gateway jabber:iq:register jabber:iq:gateway jabber:iq:register jabber:iq:gateway jabber:iq:register jabber:iq:admin */ public Service() { this.TagName = "service"; this.Namespace = Uri.IQ_BROWSE; } public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } public Jid Jid { get { return new Jid(GetAttribute("jid")); } set { SetAttribute("jid", value.ToString()); } } public string Type { get { return GetAttribute("type"); } set { SetAttribute("type", value); } } /// /// Gets all advertised namespaces of this service /// /// string array that contains the advertised namespaces public string[] GetNamespaces() { ElementList elements = SelectElements("ns"); string[] nss = new string[elements.Count]; int i=0; foreach (Element ns in elements) { nss[i] = ns.Value; i++; } return nss; } public BrowseItem[] GetItems() { ElementList nl = SelectElements(typeof(BrowseItem)); BrowseItem[] items = new BrowseItem[nl.Count]; int i = 0; foreach (Element item in nl) { items[i] = item as BrowseItem; i++; } return items; } /// /// Gets all "ChilsServices" od this service /// /// public Service[] GetServices() { ElementList nl = SelectElements(typeof(Service)); Service[] Services = new Service[nl.Count]; int i = 0; foreach (Element service in nl) { Services[i] = service as Service; i++; } return Services; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/roster/0000755000175000017500000000000012204443225023010 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/roster/Roster.cs0000644000175000017500000000354212204443225024621 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.roster { /// /// Zusammenfassung fr Roster. /// public class Roster : Element { // Request Roster: // // // public Roster() { this.TagName = "query"; this.Namespace = Uri.IQ_ROSTER; } public RosterItem[] GetRoster() { ElementList nl = SelectElements(typeof(RosterItem)); int i = 0; RosterItem[] result = new RosterItem[nl.Count]; foreach (RosterItem ri in nl) { result[i] = (RosterItem) ri; i++; } return result; } public void AddRosterItem(RosterItem r) { this.ChildNodes.Add(r); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/roster/RosterItem.cs0000644000175000017500000000706412204443225025443 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.Base; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.roster { // jabber:iq:roster // // // ICQ // ICQ // ICQ // ICQ // // // # "none" -- the user does not have a subscription to the contact's presence information, and the contact does not have a subscription to the user's presence information // # "to" -- the user has a subscription to the contact's presence information, but the contact does not have a subscription to the user's presence information // # "from" -- the contact has a subscription to the user's presence information, but the user does not have a subscription to the contact's presence information // # "both" -- both the user and the contact have subscriptions to each other's presence information // TODO rename to Ask and move to a seperate file, so it matches better to all other enums public enum AskType { NONE = -1, subscribe, unsubscribe } // TODO rename to Subscription and move to a seperate file, so it matches better to all other enums public enum SubscriptionType { none, to, from, both, remove } /// /// Item is used in jabber:iq:roster, jabber:iq:search /// public class RosterItem : agsXMPP.protocol.Base.RosterItem { public RosterItem() : base() { this.Namespace = Uri.IQ_ROSTER; } public RosterItem(Jid jid) : this() { Jid = jid; } public RosterItem(Jid jid, string name) : this(jid) { Name = name; } public SubscriptionType Subscription { get { return (SubscriptionType) GetAttributeEnum("subscription", typeof(SubscriptionType)); } set { SetAttribute("subscription", value.ToString()); } } public AskType Ask { get { return (AskType) GetAttributeEnum("ask", typeof(AskType)); } set { if (value == AskType.NONE) RemoveAttribute("ask"); else SetAttribute("ask", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/roster/RosterIq.cs0000644000175000017500000000330712204443225025112 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol; using agsXMPP.protocol.client; // Request Roster: // // // namespace agsXMPP.protocol.iq.roster { /// /// Build a new roster query, jabber:iq:roster /// public class RosterIq : IQ { private Roster m_Roster = new Roster(); public RosterIq() { base.Query = m_Roster; this.GenerateId(); } public RosterIq(IqType type) : this() { this.Type = type; } public new Roster Query { get { return m_Roster; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/roster/Delimiter.cs0000644000175000017500000000405512204443225025261 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.roster { /// /// Extension JEP-0083, delimiter for nested roster groups /// public class Delimiter : Element { /* 3.1 Querying for the delimiter All compliant clients SHOULD query for an existing delimiter at login. Example 1. Querying for the Delimiter CLIENT: CLIENT: SERVER: :: */ public Delimiter() { this.TagName = "roster"; this.Namespace = Uri.ROSTER_DELIMITER; } public Delimiter(string delimiter) : this() { this.Value = delimiter; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/roster/RosterManager.cs0000644000175000017500000001337012204443225026114 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.roster { /// /// Helper class that makes it easier to manage your contact list. /// public class RosterManager { private readonly XmppClientConnection m_connection; #region << Constructors >> /// /// Constructor /// /// The XmppClientConnection on which the RosterManager should send the packets public RosterManager(XmppClientConnection con) { m_connection = con; } #endregion #region << Add Contact >> /// /// Add a contact to the Roster /// /// The BARE jid of the rosteritem that should be removed public void AddRosterItem(Jid jid) { AddRosterItem(jid, null, new string[] {}); } /// /// Add a contact to the Roster /// /// The BARE jid of the contact that should be added. /// Nickname for the new contact. public void AddRosterItem(Jid jid, string nickname) { AddRosterItem(jid, nickname, new string[] {}); } /// /// Add a contact to the Roster /// /// The BARE jid of the contact that should be added. /// Nickname for the new contact. /// The group to which the contact should be added. public void AddRosterItem(Jid jid, string nickname, string group) { AddRosterItem(jid, nickname, new string[] {group}); } /// /// Add a contact to the Roster. /// /// The BARE jid of the contact that should be added. /// Nickname for the contact. /// An Array of groups when you want to add the contact to multiple groups. public void AddRosterItem(Jid jid, string nickname, string[] group) { RosterIq riq = new RosterIq(); riq.Type = IqType.set; RosterItem ri = new RosterItem(); ri.Jid = jid; if (nickname != null) ri.Name = nickname; foreach (string g in group) { ri.AddGroup(g); } riq.Query.AddRosterItem(ri); m_connection.Send(riq); } #endregion #region << Update contact >> /// /// Update a contact /// /// public void UpdateRosterItem(Jid jid) { AddRosterItem(jid, null, new string[] { }); } /// /// Update a contact /// /// The BARE jid of the contact that should be updated. /// Nickname for the contact to update. public void UpdateRosterItem(Jid jid, string nickname) { AddRosterItem(jid, nickname, new string[] { }); } /// /// Update a contact /// /// /// /// public void UpdateRosterItem(Jid jid, string nickname, string group) { AddRosterItem(jid, nickname, new string[] { group }); } /// /// Update a contact. /// /// The BARE jid of the contact that should be updated. /// Nickname for the contact to update. /// An Array of groups when you want to add the contact to multiple groups. public void UpdateRosterItem(Jid jid, string nickname, string[] group) { AddRosterItem(jid, nickname, group); } #endregion #region << Remove Contact >> /// /// Removes a contact from the Roster /// /// The BARE jid of the rosteritem that should be removed public void RemoveRosterItem(Jid jid) { RosterIq riq = new RosterIq(); riq.Type = IqType.set; RosterItem ri = new RosterItem(); ri.Jid = jid; ri.Subscription = SubscriptionType.remove; riq.Query.AddRosterItem(ri); m_connection.Send(riq); } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/version/0000755000175000017500000000000012204443225023157 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/version/Version.cs0000644000175000017500000000411512204443225025134 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.version { // Send: // // // // Recv: // // SoapBox // 2.1.2 beta // Windows NT 5.1 (en-us) // // /// /// Zusammenfassung fr Version. /// public class Version : Element { public Version() { this.TagName = "query"; this.Namespace = Uri.IQ_VERSION; } public string Name { set { SetTag("name", value); } get { return GetTag("name"); } } public string Ver { set { SetTag("version", value); } get { return GetTag("version"); } } public string Os { set { SetTag("os", value); } get { return GetTag("os"); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/version/VersionIq.cs0000644000175000017500000000334712204443225025434 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.version { /// /// Summary description for VersionIq. /// public class VersionIq : IQ { private Version m_Version = new Version(); public VersionIq() { base.Query = m_Version; this.GenerateId(); } public VersionIq(IqType type) : this() { this.Type = type; } public VersionIq(IqType type, Jid to) : this(type) { this.To = to; } public VersionIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Version Query { get { return m_Version; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/0000755000175000017500000000000012250206660022574 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/Features.cs0000644000175000017500000003000712204443225024700 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2007 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.iq.disco { /// /// Disco Features Enumeration /// public class Features { // Application supports DNS SRV lookups of XMPP services. RFC 3920: XMPP Core, RFC 3921: XMPP IM public const string FEAT_DNSSRV = "dnssrv"; // Application supports Unicode characters throughout, including in displayed text, JIDs, and passwords. N/A public const string FEAT_FULL_UNICODE = "fullunicode"; // gc-1.0 Support for the "groupchat 1.0" protocol. JEP-0045: Multi-User Chat public const string FEAT_GROUPCHAT_1 = "gc-1.0"; // http://jabber.org/protocol/amp?action=alert Support for the "alert" action in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_ACTION_ALERT = "http://jabber.org/protocol/amp?action=alert"; // http://jabber.org/protocol/amp?action=drop Support for the "drop" action in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_ACTION_DROP = "http://jabber.org/protocol/amp?action=drop"; // http://jabber.org/protocol/amp?action=error Support for the "error" action in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_ACTION_ERROR = "http://jabber.org/protocol/amp?action=error "; /// http://jabber.org/protocol/amp?action=notify Support for the "notify" action in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_ACTION_NOTIFY = "http://jabber.org/protocol/amp?action=notify"; // http://jabber.org/protocol/amp?condition=deliver Support for the "deliver" condition in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_CONDITION_DELIVER = "http://jabber.org/protocol/amp?condition=deliver "; // http://jabber.org/protocol/amp?condition=expire-at Support for the "expire-at" condition in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_CONDITION_EXPIRE_AT = "http://jabber.org/protocol/amp?condition=expire-at"; // http://jabber.org/protocol/amp?condition=match-resource Support for the "match-resource" condition in Advanced Message Processing. JEP-0079: Advanced Message Processing public const string FEAT_AMP_CONDITION_MATCH_RESOURCE = "http://jabber.org/protocol/amp?condition=match-resource"; // http://jabber.org/protocol/disco#publish Support for the "publishing" feature of service discovery. JEP-0030: Service Discovery public const string FEAT_PUBLISH = "http://jabber.org/protocol/disco#publish"; //http://jabber.org/protocol/muc#register Support for the muc#register FORM_TYPE JEP-0045 public const string FEAT_MUC_REGISTER = "http://jabber.org/protocol/muc#register"; // http://jabber.org/protocol/muc#roomconfig Support for the muc#roomconfig FORM_TYPE JEP-0045 public const string FEAT_MUC_ROOMCONFIG = "http://jabber.org/protocol/muc#roomconfig"; // http://jabber.org/protocol/muc#roominfo Support for the muc#roominfo FORM_TYPE JEP-0045 public const string FEAT_MUC_ROOMINFO = "http://jabber.org/protocol/muc#roominfo"; // http://jabber.org/protocol/pubsub#collections Collection nodes are supported. JEP-0060 // http://jabber.org/protocol/pubsub#config-node Configuration of node options is supported. JEP-0060 public const string FEAT_PUBSUB_CONFIG_NODE = "http://jabber.org/protocol/pubsub#collections"; // http://jabber.org/protocol/pubsub#create-nodes Creation of nodes is supported. JEP-0060 public const string FEAT_PUBSUB_CREATE_NODES = "http://jabber.org/protocol/pubsub#create-nodes"; // http://jabber.org/protocol/pubsub#delete-any Any publisher may delete an item (not only the originating publisher). JEP-0060 public const string FEAT_PUBSUB_DELETE_ANY = "http://jabber.org/protocol/pubsub#create-nodes"; // http://jabber.org/protocol/pubsub#delete-nodes Deletion of nodes is supported. JEP-0060 public const string FEAT_PUBSUB_DELETE_NODES = "http://jabber.org/protocol/pubsub#delete-nodes"; // http://jabber.org/protocol/pubsub#instant-nodes Creation of instant nodes is supported. JEP-0060 public const string FEAT_PUBSUB_INSTANT_NODES = "http://jabber.org/protocol/pubsub#instant-nodes"; // http://jabber.org/protocol/pubsub#item-ids Publishers may specify item identifiers. JEP-0060 public const string FEAT_OUBSUB_ITEM_IDS = "http://jabber.org/protocol/pubsub#item-ids"; // http://jabber.org/protocol/pubsub#leased-subscription Time-based subscriptions are supported. JEP-0060 public const string FEAT_PUBSUB_LEASED_SUBSCRIPTION = "http://jabber.org/protocol/pubsub#leased-subscription"; // http://jabber.org/protocol/pubsub#meta-data Node meta-data is supported. JEP-0060 public const string FEAT_PUBSUB_META = "http://jabber.org/protocol/pubsub#meta-data"; // http://jabber.org/protocol/pubsub#multi-subscribe A single entity may subscribe to a node multiple times. JEP-0060 public const string FEAT_PUBSUB_MULTI_SUBSCRIBE = "http://jabber.org/protocol/pubsub#multi-subscribe"; // http://jabber.org/protocol/pubsub#outcast-affiliation The outcast affiliation is supported. JEP-0060 public const string FEAT_PUBSUB_OUTCAST_AFFILIATION = "http://jabber.org/protocol/pubsub#outcast-affiliation"; // http://jabber.org/protocol/pubsub#persistent-items Persistent items are supported. JEP-0060 public const string FEAT_PUBSUB_PERSISTENT_ITEMS = "http://jabber.org/protocol/pubsub#persistent-items"; // http://jabber.org/protocol/pubsub#presence-notifications Presence-based delivery of event notifications is supported. JEP-0060 public const string FEAT_PUBSUB_PRESENCE_NOTIFICATIONS = "http://jabber.org/protocol/pubsub#presence-notifications"; // http://jabber.org/protocol/pubsub#publisher-affiliation The publisher affiliation is supported. JEP-0060 public const string FEAT_PUBSUB_PUBLISHER_AFFILIATION = "http://jabber.org/protocol/pubsub#publisher-affiliation"; // http://jabber.org/protocol/pubsub#purge-nodes Purging of nodes is supported. JEP-0060 public const string FEAT_PUBSUB_PURGE_NODES = "http://jabber.org/protocol/pubsub#purge-nodes"; // http://jabber.org/protocol/pubsub#retract-items Item retraction is supported. JEP-0060 public const string FEAT_PUBSUB_RETRACT_ITEMS = "http://jabber.org/protocol/pubsub#retract-items"; // http://jabber.org/protocol/pubsub#retrieve-affiliations Retrieval of current affiliations is supported. JEP-0060 public const string FEAT_PUBSUB_RETRIEVE_AFFILIATIONS = "http://jabber.org/protocol/pubsub#retrieve-affiliations"; // http://jabber.org/protocol/pubsub#retrieve-items Item retrieval is supported. JEP-0060 public const string FEAT_PUBSUB_RETRIEVE_ITEMS = "http://jabber.org/protocol/pubsub#retrieve-items"; // http://jabber.org/protocol/pubsub#subscribe Subscribing and unsubscribing are supported. JEP-0060 public const string FEAT_PUBSUB_SUBSCRIBE = "http://jabber.org/protocol/pubsub#subscribe"; // http://jabber.org/protocol/pubsub#subscription-options Configuration of subscription options is supported. JEP-0060 public const string FEAT_PUBSUB_SUBSCRIPTIONS_OPTIONS = "http://jabber.org/protocol/pubsub#subscription-options"; // http://jabber.org/protocol/waitinglist/schemes/mailto Waiting list service supports the mailto: URI scheme. JEP-0130 public const string FEAT_WAITINGLIST_MAILTO = "http://jabber.org/protocol/waitinglist/schemes/mailto"; // http://jabber.org/protocol/waitinglist/schemes/tel Waiting list service supports the tel: URI scheme. JEP-0130 public const string FEAT_WAITINGLIST_TEL = "http://jabber.org/protocol/waitinglist/schemes/tel"; // ipv6 Application supports IPv6. N/A public const string FEAT_IPV6 = "ipv6"; // msglog Application performs logging or archiving of messages. N/A public const string FEAT_MESSAGE_LOG = "msglog"; // msgoffline Server stores messages offline for later delivery. N/A public const string FEAT_MESSAGE_OFFLINE = "msgoffline"; // muc_hidden Hidden room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_HIDDEN = "muc_hidden"; // muc_membersonly Members-only room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_MEMBERSONLY = "muc_membersonly"; // muc_moderated Moderated room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_MODERATED = "muc_moderated"; // muc_nonanonymous Non-anonymous room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_NONANONYMOUS = "muc_nonanonymous"; // muc_open Open room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_OPEN = "muc_open"; // muc_passwordprotected Password-protected room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_PASSWORDPROTECTED = "muc_passwordprotected"; // muc_persistent Persistent room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_PERSISTANT = "muc_persistent"; // muc_public Public room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_PUBLIC = "muc_public"; // muc_rooms List of MUC rooms (each as a separate item) JEP-0045 public const string FEAT_MUC_ROOMS = "muc_rooms"; // muc_semianonymous Semi-anonymous room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_SEMIANONYMOUS = "muc_semianonymous"; // muc_temporary Temporary room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_TEMPORARY = "muc_temporary"; // muc_unmoderated Unmoderated room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_UNMODERATED = "muc_unmoderated"; // muc_unsecured Unsecured room in Multi-User Chat (MUC) JEP-0045 public const string FEAT_MUC_UNSECURED = "muc_unsecured"; // sslc2s Application supports old-style (pre-TLS) SSL connections on a dedicated port. N/A public const string FEAT_SSL_C2S = "sslc2s"; // stringprep Application supports the nameprep, nodeprep, and resourceprep profiles of stringprep. RFC 3920: XMPP Core public const string FEAT_STRINGPREP = "stringprep"; // urn:ietf:params:xml:ns:xmpp-sasl#c2s Application supports client-to-server SASL. RFC 3920: XMPP Core public const string FEAT_SASL_C2S = "urn:ietf:params:xml:ns:xmpp-sasl#c2s"; // urn:ietf:params:xml:ns:xmpp-sasl#s2s Application supports server-to-server SASL. RFC 3920: XMPP Core public const string FEAT_SASL_S2S = "urn:ietf:params:xml:ns:xmpp-sasl#s2s"; // urn:ietf:params:xml:ns:xmpp-tls#c2s Application supports client-to-server TLS. RFC 3920: XMPP Core public const string FEAT_TLS_C2S = "urn:ietf:params:xml:ns:xmpp-tls#c2s"; // urn:ietf:params:xml:ns:xmpp-tls#s2s Application supports server-to-server TLS. RFC 3920: XMPP Core public const string FEAT_TLS_S2S = "urn:ietf:params:xml:ns:xmpp-tls#s2s"; // xmllang Application supports the 'xml:lang' attribute as described in RFC 3920. RFC 3920: XMPP Core public const string FEAT_XMLLANG = "xmllang"; } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoManager.cs0000644000175000017500000001476312250206660025472 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; using agsXMPP.protocol.iq.disco; namespace agsXMPP.protocol.iq.disco { public class DiscoManager { private XmppClientConnection xmppConnection = null; /// /// Constructor /// /// public DiscoManager(XmppClientConnection con) { xmppConnection = con; xmppConnection.OnIq += new IqHandler(OnIq); } #region << Properties >> private bool m_AutoAnswerDiscoInfoRequests = true; /// /// Automatically answer DiscoInfo requests. /// Set disco information (identties and features) in the DiscoInfo property object. /// public bool AutoAnswerDiscoInfoRequests { get { return m_AutoAnswerDiscoInfoRequests; } set { m_AutoAnswerDiscoInfoRequests = value; } } #endregion private void OnIq(object sender, IQEventArgs e) { // DiscoInfo if (m_AutoAnswerDiscoInfoRequests && e.IQ.Query is DiscoInfo && e.IQ.Type == IqType.get) { e.Handled = true; ProcessDiscoInfo(e.IQ); } } private void ProcessDiscoInfo(IQ iq) { IQ diiq = new IQ(); diiq.To = iq.From; diiq.Id = iq.Id; diiq.Type = IqType.result; diiq.Query = xmppConnection.DiscoInfo; xmppConnection.Send(diiq); } #region << Discover Info >> public void DiscoverInformation(Jid to) { DiscoverInformation(to, null, null, null); } public void DiscoverInformation(Jid to, Jid from) { DiscoverInformation(to, from, null, null); } public void DiscoverInformation(Jid to, IqHandler cb) { DiscoverInformation(to, null, null, cb); } public void DiscoverInformation(Jid to, Jid from, IqHandler cb) { DiscoverInformation(to, from, null, cb); } public void DiscoverInformation(Jid to, string node) { DiscoverInformation(to, null, node, null); } public void DiscoverInformation(Jid to, Jid from, string node) { DiscoverInformation(to, from, node, null); } public void DiscoverInformation(Jid to, string node, IqHandler cb) { DiscoverInformation(to, null, node, cb); } public void DiscoverInformation(Jid to, Jid from, string node, IqHandler cb) { /* Example 9. Querying a specific JID and node combination Example 10. JID+node result */ DiscoInfoIq discoIq = new DiscoInfoIq(IqType.get); discoIq.To = to; if (from != null) discoIq.From = from; if (node != null && node.Length > 0) discoIq.Query.Node = node; xmppConnection.IqGrabber.SendIq(discoIq, cb); } #endregion #region << Discover Items >> public void DiscoverItems(Jid to) { DiscoverItems(to, null, null, null); } public void DiscoverItems(Jid to, Jid from) { DiscoverItems(to, from, null, null); } public void DiscoverItems(Jid to, IqHandler cb) { DiscoverItems(to, null, null, cb); } public void DiscoverItems(Jid to, Jid from, IqHandler cb) { DiscoverItems(to, from, null, cb); } public void DiscoverItems(Jid to, string node) { DiscoverItems(to, null, node, null); } public void DiscoverItems(Jid to, Jid from, string node) { DiscoverItems(to, from, node, null); } public void DiscoverItems(Jid to, string node, IqHandler cb) { DiscoverItems(to, null, node, cb); } public void DiscoverItems(Jid to, Jid from, string node, IqHandler cb) { DiscoItemsIq discoIq = new DiscoItemsIq(IqType.get); discoIq.To = to; if (from != null) discoIq.From = from; if (node != null && node.Length > 0) discoIq.Query.Node = node; xmppConnection.IqGrabber.SendIq(discoIq, cb); } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoInfo.cs0000644000175000017500000001067012204443225025003 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP; using agsXMPP.protocol; using agsXMPP.Xml.Dom; /* Example 1. Querying for further information Example 2. Result-set for information request Example 3. Target entity does not exist */ namespace agsXMPP.protocol.iq.disco { /// /// Discovering Information About a Jabber Entity /// public class DiscoInfo : Element { public DiscoInfo() { this.TagName = "query"; this.Namespace = Uri.DISCO_INFO; } /// /// Optional node Attrib /// public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public DiscoIdentity AddIdentity() { DiscoIdentity id = new DiscoIdentity(); AddChild(id); return id; } public void AddIdentity(DiscoIdentity id) { AddChild(id); } public DiscoFeature AddFeature() { DiscoFeature f = new DiscoFeature(); AddChild(f); return f; } public void AddFeature(DiscoFeature f) { AddChild(f); } public DiscoIdentity[] GetIdentities() { ElementList nl = SelectElements(typeof(DiscoIdentity)); DiscoIdentity[] items = new DiscoIdentity[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (DiscoIdentity) e; i++; } return items; } /// /// Gets all Features /// /// public DiscoFeature[] GetFeatures() { ElementList nl = SelectElements(typeof(DiscoFeature)); DiscoFeature[] items = new DiscoFeature[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (DiscoFeature) e; i++; } return items; } /// /// Check if a feature is supported /// /// /// public bool HasFeature(string var) { DiscoFeature[] features = GetFeatures(); foreach (DiscoFeature feat in features) { if (feat.Var == var) return true; } return false; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoFeature.cs0000644000175000017500000000525212204443225025503 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.disco { /// /// Disco feature /// /// /// see: http://www.jabber.org/registrar/disco-features.html /// public class DiscoFeature : Element { /* */ #region << Constructors >> public DiscoFeature() { this.TagName = "feature"; this.Namespace = Uri.DISCO_INFO; } public DiscoFeature(string var) : this() { Var = var; } #endregion /// /// feature name or namespace /// public string Var { get { return GetAttribute("var"); } set { SetAttribute("var", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoItems.cs0000644000175000017500000000642712204443225025176 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.disco { /* Example 10. Requesting all items Example 11. Result-set for all items Example 12. Empty result set */ /// /// Discovering the Items Associated with a Jabber Entity /// public class DiscoItems : IQ { public DiscoItems() { this.TagName = "query"; this.Namespace = Uri.DISCO_ITEMS; } /// /// The node to discover (Optional) /// public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public DiscoItem AddDiscoItem() { DiscoItem item = new DiscoItem(); AddChild(item); return item; } public void AddDiscoItem(DiscoItem item) { AddChild(item); } public DiscoItem[] GetDiscoItems() { ElementList nl = SelectElements(typeof(DiscoItem)); DiscoItem[] items = new DiscoItem[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (DiscoItem) e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoInfoIq.cs0000644000175000017500000000316012204443225025271 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.disco { /// /// Discovering Information About a Jabber Entity /// public class DiscoInfoIq : IQ { private DiscoInfo m_DiscoInfo = new DiscoInfo(); public DiscoInfoIq() { base.Query = m_DiscoInfo; this.GenerateId(); } public DiscoInfoIq(IqType type) : this() { this.Type = type; } public new DiscoInfo Query { get { return m_DiscoInfo; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoIdentity.cs0000644000175000017500000000600312204443225025674 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.disco { /* */ /// /// Summary description for DiscoIdentity. /// public class DiscoIdentity : Element { public DiscoIdentity() { this.TagName = "identity"; this.Namespace = Uri.DISCO_INFO; } public DiscoIdentity(string type, string name, string category) : this() { Type = type; Name = name; Category = category; } public DiscoIdentity(string type, string category) : this() { Type = type; Category = category; } /// /// type name for the entity /// public string Type { get { return GetAttribute("type"); } set { SetAttribute("type", value); } } /// /// natural-language name for the entity /// public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } /// /// category name for the entity /// public string Category { get { return GetAttribute("category"); } set { SetAttribute("category", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoItem.cs0000644000175000017500000000402612204443225025004 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.disco { public enum DiscoAction { NONE = -1, remove, update } /// /// /// public class DiscoItem : Element { public DiscoItem() { this.TagName = "item"; this.Namespace = Uri.DISCO_ITEMS; } public Jid Jid { get { return new Jid(GetAttribute("jid")); } set { SetAttribute("jid", value.ToString()); } } public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public DiscoAction Action { get { return (DiscoAction) GetAttributeEnum("action", typeof(DiscoAction)); } set { if (value == DiscoAction.NONE) RemoveAttribute("action"); else SetAttribute("action", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/disco/DiscoItemsIq.cs0000644000175000017500000000530512204443225025462 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.disco { /* Example 10. Requesting all items Example 11. Result-set for all items */ /// /// Discovering the Items Associated with a Jabber Entity /// public class DiscoItemsIq : IQ { private DiscoItems m_DiscoItems = new DiscoItems(); public DiscoItemsIq() { base.Query = m_DiscoItems; this.GenerateId(); } public DiscoItemsIq(IqType type) : this() { this.Type = type; } public new DiscoItems Query { get { return m_DiscoItems; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/rpc/0000755000175000017500000000000012204443225022256 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/rpc/MethodCall.cs0000644000175000017500000000553412204443225024630 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.Collections; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.rpc { /// /// The methodCall element. /// public class MethodCall : Element { /* examples.getStateName 41 */ /// /// /// public MethodCall() { TagName = "methodCall"; Namespace = Uri.IQ_RPC; } /// /// /// /// /// public MethodCall(string methodName, ArrayList Params) : this() { WriteCall(methodName, Params); } /// /// /// public string MethodName { set { SetTag("methodName", value); } get { return GetTag("methodName"); } } /// /// Write the functions call with params to this Element /// /// /// public void WriteCall(string name, ArrayList Params) { MethodName = name; // remove this tag if exists, in case this function gets // calles multiple times by some guys RemoveTag("params"); var elParams = RpcHelper.WriteParams(Params); if (elParams != null) AddChild(elParams); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/rpc/MethodResponse.cs0000644000175000017500000001775312204443225025561 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using System.Globalization; using agsXMPP.Exceptions; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.rpc { /// /// The method Response element. /// public class MethodResponse : Element { /* faultCode 4 faultString Too many parameters. */ public MethodResponse() { TagName = "methodResponse"; Namespace = Uri.IQ_RPC; } public void WriteResponse(ArrayList Params) { // remove this tag if exists, in case this function gets // calles multiple times by some guys RemoveTag("params"); var elParams = RpcHelper.WriteParams(Params); if (elParams != null) AddChild(elParams); } /// /// Parses the XML-RPC resonse and returns an ArrayList with all Parameters. /// In there is an XML-RPC Error it returns an XmlRpcException as single parameter in the ArrayList. /// /// Arraylist with parameters, or Arraylist with an exception public ArrayList GetResponse() { return ParseResponse(); } /// /// parse the response /// /// private ArrayList ParseResponse() { ArrayList al = new ArrayList(); // If an error occurred, the server will return fault Element fault = SelectSingleElement("fault"); if (fault != null) { Hashtable ht = ParseStruct(fault.SelectSingleElement("struct", true)); al.Add(new XmlRpcException((int) ht["faultCode"], (string) ht["faultString"])); } else { Element elParams = SelectSingleElement("params"); ElementList nl = elParams.SelectElements("param"); foreach (Element p in nl) { Element value = p.SelectSingleElement("value"); if (value != null) al.Add(ParseValue(value)); } } return al; } /// /// Parse a single response value /// /// /// private object ParseValue(Element value) { object result = null; if (value != null) { if (value.HasChildElements) { Element next = value.FirstChild; if (next.TagName == "string") result = next.Value; else if (next.TagName == "boolean") result = next.Value == "1"; else if (next.TagName == "i4") result = Int32.Parse(next.Value); else if (next.TagName == "int") // occurs in fault result = int.Parse(next.Value); else if (next.TagName == "double") { NumberFormatInfo numberInfo = new NumberFormatInfo(); numberInfo.NumberDecimalSeparator = "."; result = Double.Parse(next.Value, numberInfo); } else if (next.TagName == "dateTime.iso8601") result = Util.Time.ISO_8601Date(next.Value); else if (next.TagName == "base64") result = Convert.FromBase64String(next.Value); else if (next.TagName == "struct") result = ParseStruct(next); else if (next.TagName == "array") result = ParseArray(next); } else { result = value.Value; } } return result; } /// /// parse a response array /// /// /// private ArrayList ParseArray(Element elArray) { // // // one // two // three // four // five // // Element data = elArray.SelectSingleElement("data"); if (data != null) { ArrayList al = new ArrayList(); ElementList values = data.SelectElements("value"); foreach (Element val in values) { al.Add(ParseValue(val)); } return al; } return null; } /// /// parse a response struct /// /// /// private Hashtable ParseStruct(Element el) { // // // x // 20 // // // y // cow // // // z // 3,14 // // Hashtable ht = new Hashtable(); ElementList members = el.SelectElements("member"); foreach (Element member in members) { string name = member.GetTag("name"); // parse this member value Element value = member.SelectSingleElement("value"); if (value != null) ht[name] = ParseValue(value); } return ht; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/rpc/Rpc.cs0000644000175000017500000000614312204443225023335 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.rpc { /* Example 1. A typical request examples.getStateName 6 Example 2. A typical response Colorado */ /// /// JEP-0009: Jabber-RPC, transport RPC over Jabber/XMPP /// public class Rpc : Element { public Rpc() { TagName = "query"; Namespace = Uri.IQ_RPC; } /// /// /// public MethodCall MethodCall { get { return (MethodCall)SelectSingleElement(typeof(MethodCall)); } set { RemoveTag(typeof(MethodCall)); if (value != null) AddChild(value); } } /// /// /// public MethodResponse MethodResponse { get { return (MethodResponse)SelectSingleElement(typeof(MethodResponse)); } set { RemoveTag(typeof(MethodResponse)); if (value != null) AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/rpc/RpcHelper.cs0000644000175000017500000001012012204443225024463 0ustar00meebeymeebey00000000000000using System; using System.Collections; using System.Globalization; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.rpc { internal class RpcHelper { public static Element WriteParams(ArrayList Params) { if (Params != null && Params.Count > 0) { Element elParams = new Element("params"); for (int i = 0; i < Params.Count; i++) { Element param = new Element("param"); WriteValue(Params[i], param); elParams.AddChild(param); } return elParams; } return null; } /// /// Writes a single value to a call /// /// /// public static void WriteValue(object param, Element parent) { Element value = new Element("value"); if (param is String) { value.AddChild(new Element("string", param as string)); } else if (param is Int32) { value.AddChild(new Element("i4", ((Int32)param).ToString())); } else if (param is Double) { NumberFormatInfo numberInfo = new NumberFormatInfo(); numberInfo.NumberDecimalSeparator = "."; //numberInfo.NumberGroupSeparator = ","; value.AddChild(new Element("double", ((Double)param).ToString(numberInfo))); } else if (param is Boolean) { value.AddChild(new Element("boolean", ((bool)param) ? "1" : "0")); } // XML-RPC dates are formatted in iso8601 standard, same as xmpp, else if (param is DateTime) { value.AddChild(new Element("dateTime.iso8601", Util.Time.ISO_8601Date((DateTime)param))); } // byte arrays must be encoded in Base64 encoding else if (param is byte[]) { byte[] b = (byte[])param; value.AddChild(new Element("base64", Convert.ToBase64String(b, 0, b.Length))); } // Arraylist maps to an XML-RPC array else if (param is ArrayList) { // // // one // two // three // // Element array = new Element("array"); Element data = new Element("data"); ArrayList list = param as ArrayList; for (int i = 0; i < list.Count; i++) { WriteValue(list[i], data); } array.AddChild(data); value.AddChild(array); } // java.util.Hashtable maps to an XML-RPC struct else if (param is Hashtable) { Element elStruct = new Element("struct"); Hashtable ht = (Hashtable)param; IEnumerator myEnumerator = ht.Keys.GetEnumerator(); while (myEnumerator.MoveNext()) { Element member = new Element("member"); object key = myEnumerator.Current; if (key != null) { member.AddChild(new Element("name", key.ToString())); WriteValue(ht[key], member); } elStruct.AddChild(member); } value.AddChild(elStruct); } /* else { // Unknown Type } */ parent.AddChild(value); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/rpc/RpcIq.cs0000644000175000017500000000355612204443225023634 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.rpc { /// /// RpcIq. /// public class RpcIq : IQ { private Rpc m_Rpc = new Rpc(); public RpcIq() { base.Query = m_Rpc; this.GenerateId(); } public RpcIq(IqType type) : this() { this.Type = type; } public RpcIq(IqType type, Jid to) : this(type) { this.To = to; } public RpcIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Rpc Query { get { return m_Rpc; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/private/0000755000175000017500000000000012204443225023144 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/private/Private.cs0000644000175000017500000000557712204443225025123 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol.extensions.bookmarks; namespace agsXMPP.protocol.iq.@private { /// /// Private XML Storage JEP-0049 /// /// /// A Jabber client can store any arbitrary XML on the server side by sending an /// iq stanza of type "set" to the server with a query child scoped by the 'jabber:iq:private' namespace. /// The query element MAY contain any arbitrary XML fragment as long as the root element of that /// fragment is scoped by its own namespace. The data can then be retrieved by sending an iq stanza /// of type "get" with a query child scoped by the 'jabber:iq:private' namespace, /// which in turn contains a child element scoped by the namespace used for storage of that fragment. /// Using this method, Jabber entities can store private data on the server and retrieve it /// whenever necessary. The data stored might be anything, as long as it is valid XML. /// One typical usage for this namespace is the server-side storage of client-specific preferences; /// another is Bookmark Storage. /// public class Private : Element { public Private() { this.TagName = "query"; this.Namespace = Uri.IQ_PRIVATE; } /// /// The Storage object /// public Storage Storage { get { return SelectSingleElement(typeof(Storage)) as Storage; } set { if (HasTag(typeof(Storage))) RemoveTag(typeof(Storage)); if (value != null) this.AddChild(value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/private/PrivateIq.cs0000644000175000017500000000334112204443225025400 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.@private { /// /// Summary description for PrivateIq. /// public class PrivateIq : IQ { Private m_Private = new Private(); public PrivateIq() { base.Query = m_Private; this.GenerateId(); } public PrivateIq(IqType type) : this() { this.Type = type; } public PrivateIq(IqType type, Jid to) : this(type) { this.To = to; } public PrivateIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Private Query { get { return m_Private; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/session/0000755000175000017500000000000012204443225023155 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/session/SessionIq.cs0000644000175000017500000000365512204443225025432 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.session { /// /// Starting the session, this is done after resource binding /// public class SessionIq : IQ { /* SEND: RECV: */ private Session m_Session = new Session(); public SessionIq() { this.GenerateId(); this.AddChild(m_Session); } public SessionIq(IqType type) : this() { this.Type = type; } public SessionIq(IqType type, Jid to) : this() { this.Type = type; this.To = to; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/session/Session.cs0000644000175000017500000000255312204443225025134 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.session { /// /// Summary description for Session. /// public class Session : Element { public Session() { this.TagName = "session"; this.Namespace = Uri.SESSION; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/auth/0000755000175000017500000000000012204443225022433 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/auth/AuthIq.cs0000644000175000017500000000332512204443225024160 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.auth { /// /// Summary description for AuthIq. /// public class AuthIq : IQ { private Auth m_Auth = new Auth(); public AuthIq() { base.Query = m_Auth; this.GenerateId(); } public AuthIq(IqType type) : this() { this.Type = type; } public AuthIq(IqType type, Jid to) : this(type) { this.To = to; } public AuthIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Auth Query { get { return m_Auth; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/auth/Auth.cs0000644000175000017500000000670012204443225023666 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.iq.auth { // Send: // gnauck // // Recv:gnauck // // Send:gnauck27c05d464e3f908db3b2ca1729674bfddb28daf2Office // Recv: /// /// /// public class Auth : Element { #region << Constructors >> public Auth() { this.TagName = "query"; this.Namespace = Uri.IQ_AUTH; } #endregion #region << Properties >> public string Username { get { return GetTag("username"); } set { SetTag("username", value); } } public string Password { get { return GetTag("password"); } set { SetTag("password", value); } } public string Resource { get { return GetTag("resource"); } set { SetTag("resource", value); } } public string Digest { get { return GetTag("digest"); } set { SetTag("digest", value); } } #endregion #region << Public Methods >> /// /// /// /// /// /// public void SetAuthDigest(string username, string password, string StreamID) { // Jive Messenger has a problem when we dont remove the password Tag this.RemoveTag("password"); this.Username = username; this.Digest = Util.Hash.Sha1Hash(StreamID + password); } /// /// /// /// /// public void SetAuthPlain(string username, string password) { // remove digest Tag when existing this.RemoveTag("digest"); this.Username = username; this.Password = password; } /// /// /// public void SetAuth(string username, string password, string streamId) { if(HasTag("digest")) SetAuthDigest(username, password, streamId); else SetAuthPlain(username,password); } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/last/0000755000175000017500000000000012204443225022435 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/last/LastIq.cs0000644000175000017500000000332012204443225024157 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.iq.last { /// /// Summary description for LastIq. /// public class LastIq : IQ { private Last m_Last = new Last(); public LastIq() { base.Query = m_Last; this.GenerateId(); } public LastIq(IqType type) : this() { this.Type = type; } public LastIq(IqType type, Jid to) : this(type) { this.To = to; } public LastIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new Last Query { get { return m_Last; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/iq/last/Last.cs0000644000175000017500000000355212204443225023674 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // Send: // // // Recv: // // namespace agsXMPP.protocol.iq.last { /// /// Zusammenfassung fr Last. /// public class Last : Element { public Last() { this.TagName = "query"; this.Namespace = Uri.IQ_LAST; } /// /// Seconds since the last activity. /// public int Seconds { get { return Int32.Parse(GetAttribute("seconds")); } set { SetAttribute("seconds", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/0000755000175000017500000000000012250206660022340 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/ShowType.cs0000644000175000017500000000403112204443225024446 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.client { // # away -- The entity or resource is temporarily away. // # chat -- The entity or resource is actively interested in chatting. // # dnd -- The entity or resource is busy (dnd = "Do Not Disturb"). // # xa -- The entity or resource is away for an extended period (xa = "eXtended Away"). /// /// Enumeration that represents the online state. /// public enum ShowType { /// /// /// NONE = -1, /// /// The entity or resource is temporarily away. /// away, /// /// The entity or resource is actively interested in chatting. /// chat, /// /// The entity or resource is busy (dnd = "Do Not Disturb"). /// dnd, /// /// The entity or resource is away for an extended period (xa = "eXtended Away"). /// xa, } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/PresenceType.cs0000644000175000017500000000477112204443225025305 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.client { /// /// Enumeration for the Presence Type structure. /// This enum is used to describe what type of Subscription Type the current subscription is. /// When sending a presence or receiving a subscription this type is used to easily identify the type of subscription it is. /// public enum PresenceType { /// /// Used when one wants to send presence to someone/server/transport that youre available. /// available = -1, /// /// Used to send a subscription request to someone. /// subscribe, /// /// Used to accept a subscription request. /// subscribed, /// /// Used to unsubscribe someone from your presence. /// unsubscribe, /// /// Used to deny a subscription request. /// unsubscribed, /// /// Used when one wants to send presence to someone/server/transport that youre unavailable. /// unavailable, /// /// Used when you want to see your roster, but don't want anyone on you roster to see you /// invisible, /// /// presence error /// error, /// /// used in server to server protocol to request presences /// probe } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/Handler.cs0000644000175000017500000000324112250206660024244 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.client { public delegate void MessageHandler (object sender, Message msg); public delegate void PresenceHandler(object sender, Presence pres); public delegate void IqHandler (object sender, IQEventArgs args); public class IQEventArgs : EventArgs { public IQ IQ { get; private set; } public bool Handled { get; set; } public IQEventArgs(IQ iq) { if (iq == null) { throw new ArgumentNullException("iq"); } IQ = iq; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/Error.cs0000644000175000017500000004526012250206660023767 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // JEP-0086: Error Condition Mappings // // [RECOMMENDED to include sender XML here] // // // // OPTIONAL descriptive text // // [OPTIONAL application-specific condition element] // // // Legacy Error // Not Implemented // XMPP Style Error // // // namespace agsXMPP.protocol.client { // XMPP error condition XMPP error type Legacy error code // modify 400 // cancel 409 // cancel 501 // auth 403 // modify 302 (permanent) // wait 500 // cancel 404 // modify 400 // modify 406 // cancel 405 // auth 401 // auth 402 // wait 404 // modify 302 (temporary) // auth 407 // cancel 404 // wait 504 // wait 500 // cancel 503 // auth 407 // [any] 500 // wait 400 /// /// stanza error condition as defined in RFC 3920 9.3 /// public enum ErrorCondition { /// /// The sender has sent a stanza containing XML that does not conform to the appropriate schema 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". /// BadRequest, /// /// Access cannot be granted because an existing resource exists with the same name or address; /// the associated error type SHOULD be "cancel". /// Conflict, /// /// The feature represented in the XML stanza is not implemented by the intended recipient or /// an intermediate server and therefore the stanza cannot be processed; the associated error type SHOULD /// be "cancel" or "modify". /// FeatureNotImplemented, /// /// The requesting entity does not possess the required permissions to perform the action; /// the associated error type SHOULD be "auth". /// Forbidden, /// /// 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 "cancel" or "modify". /// Gone, /// /// 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" or "cancel". /// InternalServerError, /// /// The addressed JID or item requested cannot be found; the associated error type SHOULD be "cancel" or "modify". /// /// /// 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; /// instead it SHOULD return a <service-unavailable/> error. /// ItemNotFound, /// /// The sending entity has provided or communicated an XMPP address /// (e.g., a value of the 'to' attribute) or aspect thereof (e.g., an XMPP resource identifier) /// that does not adhere to the syntax defined under RFC3920 Section 3 (Addresses); /// the associated error type SHOULD be "modify". /// JidMalformed, /// /// 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 stanza size /// limits or acceptable words in messages); the associated error type SHOULD be "modify". /// NotAcceptable, /// /// The recipient or server does not allow any entity to perform the action (e.g., sending to entities at /// a blacklisted domain); the associated error type SHOULD be "cancel". /// NotAllowed, /// /// The sender must provide proper credentials before being allowed to perform the action, or has provided /// improper credentials; the associated error type SHOULD be "auth". /// NotAuthorized, /// /// The item requested has not changed since it was last requested; the associated error type SHOULD be "continue". /// NotModified, /// /// The requesting entity is not authorized to access the requested service because payment is required; /// the associated error type SHOULD be "auth". /// PaymentRequired, /// /// The intended recipient is temporarily unavailable; the associated error type SHOULD be "wait". /// /// /// 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; instead it SHOULD return a <service-unavailable/> error. /// RecipientUnavailable, /// /// The recipient or server is redirecting requests for this information to another entity, /// typically in a temporary fashion; the associated error type SHOULD be "modify" and the error stanza /// SHOULD contain the alternate address (which SHOULD be a valid JID) in the XML character data /// of the <redirect/> element. /// Redirect, /// /// The requesting entity is not authorized to access the requested service because prior /// registration is required; the associated error type SHOULD be "auth". /// RegistrationRequired, /// /// 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". /// RemoteServerNotFound, /// /// 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". /// RemoteServerTimeout, /// /// The server or recipient lacks the system resources necessary to service the request; /// the associated error type SHOULD be "wait". /// ResourceConstraint, /// /// The server or recipient does not currently provide the requested service; /// the associated error type SHOULD be "cancel". /// /// /// An application SHOULD return a <service-unavailable/> error instead of /// <item-not-found/> or <recipient-unavailable/> if sending one of the latter /// errors would provide information about the intended recipient's network /// availability to an entity that is not authorized to know such information. /// ServiceUnavailable, /// /// The requesting entity is not authorized to access the requested service /// because a prior subscription is required; the associated error type SHOULD be "auth". /// SubscriptionRequired, /// /// 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. /// UndefinedCondition, /// /// 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" or "modify". /// UnexpectedRequest } // The value of the element's 'type' attribute MUST be one of the following: // * cancel -- do not retry (the error is unrecoverable) // * continue -- proceed (the condition was only a warning) // * modify -- retry after changing the data sent // * auth -- retry after providing credentials // * wait -- retry after waiting (the error is temporary) public enum ErrorType { cancel, @continue, modify, auth, wait } /// /// Summary description for Error. /// public class Error : Element { #region << Constructors >> public Error() { this.Namespace = Uri.CLIENT; this.TagName = "error"; } /// /// Creates an error Element according the the condition /// The type attrib as added automatically as decribed in the XMPP specs /// This is the prefered way to create error Elements /// /// public Error(ErrorCondition condition) : this() { this.Condition = condition; } public Error(ErrorCondition condition, string text) : this(condition) { ErrorText = text; } public Error(ErrorType type) : this() { Type = type; } public Error(ErrorType type, ErrorCondition condition) : this(type) { this.Condition = condition; } #endregion /// /// The error Description /// [Obsolete("Use ErrorText Property instead")] public string Message { get { return this.Value; } set { this.Value = value; } } /// /// The optional error text /// public string ErrorText { get { return GetTag("text"); } set { SetTag("text", value, Uri.STANZAS); } } public ErrorType Type { get { return (ErrorType) GetAttributeEnum("type", typeof(ErrorType)); } set { SetAttribute("type", value.ToString()); } } public ErrorCondition Condition { get { if (HasTag("bad-request")) // return ErrorCondition.BadRequest; else if (HasTag("conflict")) // return ErrorCondition.Conflict; else if (HasTag("feature-not-implemented"))// return ErrorCondition.FeatureNotImplemented; else if (HasTag("forbidden")) // return ErrorCondition.Forbidden; else if (HasTag("gone")) // return ErrorCondition.Gone; else if (HasTag("internal-server-error")) // return ErrorCondition.InternalServerError; else if (HasTag("item-not-found")) // return ErrorCondition.ItemNotFound; else if (HasTag("jid-malformed")) // return ErrorCondition.JidMalformed; else if (HasTag("not-acceptable")) // return ErrorCondition.NotAcceptable; else if (HasTag("not-allowed")) // return ErrorCondition.NotAllowed; else if (HasTag("not-authorized")) // return ErrorCondition.NotAuthorized; else if (HasTag("not-modified")) // return ErrorCondition.NotModified; else if (HasTag("payment-required")) // return ErrorCondition.PaymentRequired; else if (HasTag("recipient-unavailable")) // return ErrorCondition.RecipientUnavailable; else if (HasTag("redirect")) // return ErrorCondition.Redirect; else if (HasTag("registration-required")) // return ErrorCondition.RegistrationRequired; else if (HasTag("remote-server-not-found")) // return ErrorCondition.RemoteServerNotFound; else if (HasTag("remote-server-timeout")) // return ErrorCondition.RemoteServerTimeout; else if (HasTag("resource-constraint")) // return ErrorCondition.ResourceConstraint; else if (HasTag("service-unavailable")) // return ErrorCondition.ServiceUnavailable; else if (HasTag("subscription-required")) // return ErrorCondition.SubscriptionRequired; else if (HasTag("undefined-condition")) // return ErrorCondition.UndefinedCondition; else if (HasTag("unexpected-request")) // return ErrorCondition.UnexpectedRequest; else return ErrorCondition.UndefinedCondition; } set { switch (value) { case ErrorCondition.BadRequest: SetTag("bad-request", "", Uri.STANZAS); Type = ErrorType.modify; break; case ErrorCondition.Conflict: SetTag("conflict", "", Uri.STANZAS); Type = ErrorType.cancel; break; case ErrorCondition.FeatureNotImplemented: SetTag("feature-not-implemented", "", Uri.STANZAS); Type = ErrorType.cancel; break; case ErrorCondition.Forbidden: SetTag("forbidden", "", Uri.STANZAS); Type = ErrorType.auth; break; case ErrorCondition.Gone: SetTag("gone", "", Uri.STANZAS); Type = ErrorType.modify; break; case ErrorCondition.InternalServerError: SetTag("internal-server-error", "", Uri.STANZAS); Type = ErrorType.wait; break; case ErrorCondition.ItemNotFound: SetTag("item-not-found", "", Uri.STANZAS); Type = ErrorType.cancel; break; case ErrorCondition.JidMalformed: SetTag("jid-malformed", "", Uri.STANZAS); Type = ErrorType.modify; break; case ErrorCondition.NotAcceptable: SetTag("not-acceptable", "", Uri.STANZAS); Type = ErrorType.modify; break; case ErrorCondition.NotAllowed: SetTag("not-allowed", "", Uri.STANZAS); Type = ErrorType.cancel; break; case ErrorCondition.NotAuthorized: SetTag("not-authorized", "", Uri.STANZAS); Type = ErrorType.auth; break; case ErrorCondition.NotModified: SetTag("not-modified", "", Uri.STANZAS); Type = ErrorType.modify; break; case ErrorCondition.PaymentRequired: SetTag("payment-required", "", Uri.STANZAS); Type = ErrorType.auth; break; case ErrorCondition.RecipientUnavailable: SetTag("recipient-unavailable", "", Uri.STANZAS); Type = ErrorType.wait; break; case ErrorCondition.Redirect: SetTag("redirect", "", Uri.STANZAS); Type = ErrorType.modify; break; case ErrorCondition.RegistrationRequired: SetTag("registration-required", "", Uri.STANZAS); Type = ErrorType.auth; break; case ErrorCondition.RemoteServerNotFound: SetTag("remote-server-not-found", "", Uri.STANZAS); Type = ErrorType.cancel; break; case ErrorCondition.RemoteServerTimeout: SetTag("remote-server-timeout", "", Uri.STANZAS); Type = ErrorType.wait; break; case ErrorCondition.ResourceConstraint: SetTag("resource-constraint", "", Uri.STANZAS); Type = ErrorType.wait; break; case ErrorCondition.ServiceUnavailable: SetTag("service-unavailable", "", Uri.STANZAS); Type = ErrorType.cancel; break; case ErrorCondition.SubscriptionRequired: SetTag("subscription-required", "", Uri.STANZAS); Type = ErrorType.auth; break; case ErrorCondition.UndefinedCondition: SetTag("undefined-condition", "", Uri.STANZAS); // could be any break; case ErrorCondition.UnexpectedRequest: SetTag("unexpected-request", "", Uri.STANZAS); Type = ErrorType.wait; break; } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/IQ.cs0000644000175000017500000000761412250206660023210 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol.iq; using agsXMPP.protocol.iq.vcard; using agsXMPP.protocol.iq.bind; using agsXMPP.protocol.iq.session; namespace agsXMPP.protocol.client { // a i know that i shouldnt use keywords for Enums. But its much easier this way // because of enum.ToString() and enum.Parse() Members public enum IqType { get, set, result, error } /// /// Iq Stanza. /// public class IQ : Base.StanzaWithError { #region << Constructors >> public IQ() { this.TagName = "iq"; this.Namespace = Uri.CLIENT; } public IQ(IqType type) : this() { this.Type = type; } public IQ(Jid from, Jid to) : this() { this.From = from; this.To = to; } public IQ(IqType type, Jid from, Jid to) : this() { this.Type = type; this.From = from; this.To = to; } #endregion public IqType Type { set { SetAttribute("type", value.ToString()); } get { return (IqType) GetAttributeEnum("type", typeof(IqType)); } } /// /// The query Element. Value can also be null which removes the Query tag when existing /// public Element Query { get { return this.SelectSingleElement("query"); } set { if (value != null) ReplaceChild(value); else RemoveTag("query"); } } /// /// Get or Set the VCard if it is a Vcard IQ /// public virtual Vcard Vcard { get { return this.SelectSingleElement("vCard") as Vcard; } set { if (value != null) ReplaceChild(value); else RemoveTag("vCard"); } } /// /// Get or Set the Bind ELement if it is a BingIq /// public virtual Bind Bind { get { return this.SelectSingleElement(typeof(Bind)) as Bind; } set { RemoveTag(typeof(Bind)); if (value != null) AddChild(value); } } /// /// Get or Set the Session Element if it is a SessionIq /// public virtual Session Session { get { return this.SelectSingleElement(typeof(Session)) as Session; } set { RemoveTag(typeof(Session)); if (value != null) AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/MessageType.cs0000644000175000017500000000365712204443225025127 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.client { /// /// Enumeration that represents the type of a message /// public enum MessageType { /// /// This in a normal message, much like an email. You dont expect a fast /// normal = -1, /// /// a error messages /// error, /// /// is for chat like messages, person to person. Send this if you expect a fast reply. reply or no reply at all. /// chat, /// /// is used for sending/receiving messages from/to a chatroom (IRC style chats) /// /// groupchat, /// /// Think of this as a news broadcast, or RRS Feed, the message will normally have a URL and Description Associated with it. /// headline } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/Presence.cs0000644000175000017500000001607412250206660024443 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.extensions.primary; using agsXMPP.protocol.extensions.nickname; using agsXMPP.protocol.extensions.caps; namespace agsXMPP.protocol.client { /// /// Zusammenfassung fr Presence. /// public class Presence : Base.StanzaWithError { #region << Constructors >> public Presence() { this.TagName = "presence"; this.Namespace = Uri.CLIENT; } public Presence(ShowType show, string status) : this() { this.Show = show; this.Status = status; } public Presence(ShowType show, string status, int priority) : this(show, status) { this.Priority = priority; } #endregion /// /// The OPTIONAL statuc contains a natural-language description of availability status. /// It is normally used in conjunction with the show element to provide a detailed description of an availability state /// (e.g., "In a meeting"). /// public string Status { get { return GetTag("status"); } set { SetTag("status", value); } } /// /// The type of a presence stanza is OPTIONAL. /// A presence stanza that does not possess a type attribute is used to signal to the server that the sender is online and available /// for communication. If included, the type attribute specifies a lack of availability, a request to manage a subscription /// to another entity's presence, a request for another entity's current presence, or an error related to a previously-sent /// presence stanza. /// public PresenceType Type { get { return (PresenceType) GetAttributeEnum("type", typeof(PresenceType)); } set { // dont add type="available" if (value == PresenceType.available) RemoveAttribute("type"); else SetAttribute("type", value.ToString()); } } /// /// The OPTIONAL show element contains non-human-readable XML character data that specifies the particular availability /// status of an entity or specific resource. /// public ShowType Show { get { return (ShowType) GetTagEnum("show", typeof(ShowType)); } set { if (value != ShowType.NONE) SetTag("show", value.ToString()); else RemoveAttribute("show"); } } /// /// The priority level of the resource. The value MUST be an integer between -128 and +127. /// If no priority is provided, a server SHOULD consider the priority to be zero. /// /// /// For information regarding the semantics of priority values in stanza routing /// within instant messaging and presence applications, refer to Server Rules /// for Handling XML StanzasServer Rules for Handling XML Stanzas. /// public int Priority { get { try { return int.Parse(GetTag("priority")); } catch { return 0; } } set { SetTag("priority", value.ToString()); } } public x.Delay XDelay { get { return SelectSingleElement(typeof(x.Delay)) as x.Delay; } set { if (HasTag(typeof(x.Delay))) RemoveTag(typeof(x.Delay)); if (value != null) this.AddChild(value); } } public bool IsPrimary { get { return GetTag(typeof(Primary)) == null ? false : true; } set { if (value) SetTag(typeof(Primary)); else RemoveTag(typeof(Primary)); } } /// /// /// public x.muc.User MucUser { get { return SelectSingleElement(typeof(x.muc.User)) as x.muc.User; } set { if (HasTag(typeof(x.muc.User))) RemoveTag(typeof(x.muc.User)); if (value != null) this.AddChild(value); } } /// /// The muc element. Doesn't have much use /// public x.muc.Muc Muc { get { return SelectSingleElement(typeof(x.muc.Muc)) as x.muc.Muc; } set { if (HasTag(typeof(x.muc.Muc))) RemoveTag(typeof(x.muc.Muc)); if (value != null) this.AddChild(value); } } /// /// in case of away, says how long the user was idle /// public iq.last.Last Last { get { return SelectSingleElement(typeof(iq.last.Last)) as iq.last.Last; } set { if (HasTag(typeof(iq.last.Last))) RemoveTag(typeof(iq.last.Last)); if (value != null) this.AddChild(value); } } /// /// Nickname Element /// public Nickname Nickname { get { return SelectSingleElement(typeof(Nickname)) as Nickname; } set { if (HasTag(typeof(Nickname))) RemoveTag(typeof(Nickname)); if (value != null) AddChild(value); } } public Capabilities Capabilities { get { return SelectSingleElement(); } set { RemoveTag(); if (value != null) AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/PresenceManager.cs0000644000175000017500000000750512204443225025734 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.client { /// /// Helper class for managing presence and subscriptions /// public class PresenceManager { private XmppClientConnection m_connection = null; public PresenceManager(XmppClientConnection con) { m_connection = con; } /// /// Subscribe to a contact /// /// Bare Jid of the rosteritem we want to subscribe public void Subscribe(Jid to) { // Presence pres = new Presence(); pres.Type = PresenceType.subscribe; pres.To = to; m_connection.Send(pres); } /// /// Subscribe to a contact /// /// Bare Jid of the rosteritem we want to subscribe /// a message which normally contains the reason why we want to subscibe to this contact public void Subscribe(Jid to, string message) { Presence pres = new Presence(); pres.Type = PresenceType.subscribe; pres.To = to; pres.Status = message; m_connection.Send(pres); } /// /// Unsubscribe from a contact /// /// Bare Jid of the rosteritem we want to unsubscribe public void Unsubscribe(Jid to) { // Presence pres = new Presence(); pres.Type = PresenceType.unsubscribe; pres.To = to; m_connection.Send(pres); } //Example: Approving a subscription request: // /// /// Approve a subscription request /// /// Bare Jid to approve public void ApproveSubscriptionRequest(Jid to) { // Presence pres = new Presence(); pres.Type = PresenceType.subscribed; pres.To = to; m_connection.Send(pres); } //Example: Refusing a presence subscription request: // /// /// Refuse subscription request /// /// Bare Jid to approve public void RefuseSubscriptionRequest(Jid to) { // Presence pres = new Presence(); pres.Type = PresenceType.unsubscribed; pres.To = to; m_connection.Send(pres); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/client/Message.cs0000644000175000017500000002546612250206660024270 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x; using agsXMPP.protocol.extensions.html; using agsXMPP.protocol.extensions.chatstates; using agsXMPP.protocol.extensions.nickname; using agsXMPP.protocol.extensions.shim; namespace agsXMPP.protocol.client { /// /// This class represents a XMPP message. /// public class Message : Base.StanzaWithError { #region << Constructors >> public Message() { this.TagName = "message"; this.Namespace = Uri.CLIENT; } public Message(Jid to) : this() { To = to; } public Message(Jid to, string body) : this(to) { Body = body; } public Message(Jid to, Jid from) : this() { To = to; From = from; } public Message(string to, string body) : this() { To = new Jid(to); Body = body; } public Message(Jid to, string body, string subject) : this() { To = to; Body = body; Subject = subject; } public Message(string to, string body, string subject) : this() { To = new Jid(to); Body = body; Subject = subject; } public Message(string to, string body, string subject, string thread) : this() { To = new Jid(to); Body = body; Subject = subject; Thread = thread; } public Message(Jid to, string body, string subject, string thread) : this() { To = to; Body = body; Subject = subject; Thread = thread; } public Message(string to, MessageType type, string body) : this() { To = new Jid(to); Type = type; Body = body; } public Message(Jid to, MessageType type, string body) : this() { To = to; Type = type; Body = body; } public Message(string to, MessageType type, string body, string subject) : this() { To = new Jid(to); Type = type; Body = body; Subject = subject; } public Message(Jid to, MessageType type, string body, string subject) : this() { To = to; Type = type; Body = body; Subject = subject; } public Message(string to, MessageType type, string body, string subject, string thread) : this() { To = new Jid(to); Type = type; Body = body; Subject = subject; Thread = thread; } public Message(Jid to, MessageType type, string body, string subject, string thread) : this() { To = to; Type = type; Body = body; Subject = subject; Thread = thread; } public Message(Jid to, Jid from, string body) : this() { To = to; From = from; Body = body; } public Message(Jid to, Jid from, string body, string subject) : this() { To = to; From = from; Body = body; Subject = subject; } public Message(Jid to, Jid from, string body, string subject, string thread) : this() { To = to; From = from; Body = body; Subject = subject; Thread = thread; } public Message(Jid to, Jid from, MessageType type, string body) : this() { To = to; From = from; Type = type; Body = body; } public Message(Jid to, Jid from, MessageType type, string body, string subject) : this() { To = to; From = from; Type = type; Body = body; Subject = subject; } public Message(Jid to, Jid from, MessageType type, string body, string subject, string thread) : this() { To = to; From = from; Type = type; Body = body; Subject = subject; Thread = thread; } #endregion #region << Properties >> /// /// The body of the message. This contains the message text. /// public string Body { set { SetTag("body", value); } get { return GetTag("body"); } } /// /// subject of this message. Its like a subject in a email. The Subject is optional. /// public string Subject { set { SetTag("subject", value); } get { return GetTag("subject"); } } /// /// messages and conversations could be threaded. You can compare this with threads in newsgroups or forums. /// Threads are optional. /// public string Thread { set { SetTag("thread", value); } get { return GetTag("thread"); } } /// /// message type (chat, groupchat, normal, headline or error). /// public MessageType Type { get { return (MessageType) GetAttributeEnum("type", typeof(MessageType)); } set { if (value == MessageType.normal) RemoveAttribute("type"); else SetAttribute("type", value.ToString()); } } /// /// The html part of the message if you want to support the html-im Jep. This part of the message is optional. /// public Html Html { get { return (Html) SelectSingleElement(typeof(Html)); } set { RemoveTag(typeof(Html)); if (value != null) AddChild(value); } } /// /// The event Element for JEP-0022 Message events /// public Event XEvent { get { return SelectSingleElement(typeof(Event)) as Event; } set { if (HasTag(typeof(Event))) RemoveTag(typeof(Event)); if (value != null) this.AddChild(value); } } /// /// The event Element for JEP-0022 Message events /// public Delay XDelay { get { return SelectSingleElement(typeof(Delay)) as Delay; } set { if (HasTag(typeof(Delay))) RemoveTag(typeof(Delay)); if (value != null) this.AddChild(value); } } /// /// Stanza Headers and Internet Metadata /// public Headers Headers { get { return SelectSingleElement(typeof(Headers)) as Headers; } set { if (HasTag(typeof(Headers))) RemoveTag(typeof(Headers)); if (value != null) this.AddChild(value); } } /// /// Nickname Element /// public Nickname Nickname { get { return SelectSingleElement(typeof(Nickname)) as Nickname; } set { if (HasTag(typeof(Nickname))) RemoveTag(typeof(Nickname)); if (value != null) this.AddChild(value); } } /// /// /// public x.muc.User MucUser { get { return SelectSingleElement(typeof(x.muc.User)) as x.muc.User; } set { if (HasTag(typeof(x.muc.User))) RemoveTag(typeof(x.muc.User)); if (value != null) this.AddChild(value); } } #region << Chatstate Properties >> public Chatstate Chatstate { get { if (HasTag(typeof(Active))) return Chatstate.active; else if (HasTag(typeof(Inactive))) return Chatstate.inactive; else if (HasTag(typeof(Composing))) return Chatstate.composing; else if (HasTag(typeof(Paused))) return Chatstate.paused; else if (HasTag(typeof(Gone))) return Chatstate.gone; else return Chatstate.None; } set { RemoveChatstate(); switch (value) { case Chatstate.active: AddChild(new Active()); break; case Chatstate.inactive: AddChild(new Inactive()); break; case Chatstate.composing: AddChild(new Composing()); break; case Chatstate.paused: AddChild(new Paused()); break; case Chatstate.gone: AddChild(new Gone()); break; } } } private void RemoveChatstate() { RemoveTag(typeof(Active)); RemoveTag(typeof(Inactive)); RemoveTag(typeof(Composing)); RemoveTag(typeof(Paused)); RemoveTag(typeof(Gone)); } #endregion #endregion #region << Methods and Functions >> #if !CF /// /// Create a new unique Thread indendifier /// /// public string CreateNewThread() { string guid = Guid.NewGuid().ToString().ToLower(); Thread = guid; return guid; } #endif #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/0000755000175000017500000000000012250206660021734 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/Stream.cs0000644000175000017500000000343512204443225023522 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.Base { /// /// Summary description for Stream. /// public class Stream : Stanza { public Stream() { this.TagName = "stream"; } /// /// The StreamID of the current JabberSession. /// Returns null when none available. /// public string StreamId { get { return GetAttribute("id"); } set { SetAttribute("id", value); } } /// /// See XMPP-Core 4.4.1 "Version Support" /// public string Version { get { return GetAttribute("version"); } set { SetAttribute("version", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/RosterItem.cs0000644000175000017500000000646212204443225024367 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.Base { // jabber:iq:roster // // // ICQ // ICQ // ICQ // ICQ // // // # "none" -- the user does not have a subscription to the contact's presence information, and the contact does not have a subscription to the user's presence information // # "to" -- the user has a subscription to the contact's presence information, but the contact does not have a subscription to the user's presence information // # "from" -- the contact has a subscription to the user's presence information, but the user does not have a subscription to the contact's presence information // # "both" -- both the user and the contact have subscriptions to each other's presence information /// /// Item is used in jabber:iq:roster, x roster /// public class RosterItem : Item { public RosterItem() : base() { } /// /// Groups a roster Item is assigned to /// public ElementList GetGroups() { return this.SelectElements("group"); } /// /// Add a new group to the Rosteritem /// /// public void AddGroup(string groupname) { Group g = new Group(groupname); this.AddChild(g); } public bool HasGroup(string groupname) { ElementList groups = GetGroups(); foreach (Group g in groups) { if (g.Name == groupname) return true; } return false; } public void RemoveGroup(string groupname) { ElementList groups = GetGroups(); foreach (Group g in groups) { if (g.Name == groupname) { g.Remove(); return; } } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/Group.cs0000644000175000017500000000310412204443225023354 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.Base { /// /// Summary description for Group. /// public class Group : Element { public Group() { this.TagName = "group"; } public Group(string groupname) : this() { this.Name = groupname; } /// /// gets or sets the Name of the contact group /// public string Name { set { this.Value = value; } get { return this.Value; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/DirectionalElement.cs0000644000175000017500000000642512204443225026040 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol.client; namespace agsXMPP.protocol.Base { /// /// Base XMPP Element /// This must ne used to build all other new packets /// public abstract class DirectionalElement : Element { public DirectionalElement() : base() { } public DirectionalElement(string tag) : base(tag) { } public DirectionalElement(string tag, string ns) : base(tag) { this.Namespace = ns; } public DirectionalElement(string tag, string text, string ns) : base(tag, text) { this.Namespace = ns; } public Jid From { get { if (HasAttribute("from")) return new Jid(this.GetAttribute("from")); else return null; } set { if (value != null) this.SetAttribute("from", value.ToString()); else RemoveAttribute("from"); } } public Jid To { get { if (HasAttribute("to")) return new Jid(this.GetAttribute("to")); else return null; } set { if (value != null) this.SetAttribute("to", value.ToString()); else RemoveAttribute("to"); } } /// /// Switches the from and to attributes when existing /// public void SwitchDirection() { Jid from = From; Jid to = To; // Remove from and to now RemoveAttribute("from"); RemoveAttribute("to"); Jid helper = null; helper = from; from = to; to = helper; From = from; To = to; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/Item.cs0000644000175000017500000000351612204443225023165 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.Base { /// /// Summary description for Item. /// public class Item : Element { public Item() { this.TagName = "item"; } public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); } } public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/Stanza.cs0000644000175000017500000000667412250206660023540 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol.client; namespace agsXMPP.protocol.Base { /// /// Base XMPP Element /// This must ne used to build all other new packets /// public abstract class Stanza : DirectionalElement { public Stanza() : base() { } public Stanza(string tag) : base(tag) { } public Stanza(string tag, string ns) : base(tag) { this.Namespace = ns; } public Stanza(string tag, string text, string ns) : base(tag, text) { this.Namespace = ns; } public string Id { get { return this.GetAttribute("id"); } set { this.SetAttribute("id", value); } } /// /// Generates a automatic id for the packet. /// !!! Overwrites existing Ids /// /// public void GenerateId() { string sId = agsXMPP.Id.GetNextId(); this.Id = sId; } /// /// XML Language attribute /// /// /// The language 'xml:lang' attribute SHOULD be included by the initiating entity on the header for the initial stream /// to specify the default language of any human-readable XML character data it sends over that stream. /// If the attribute is included, the receiving entity SHOULD remember that value as the default for both the /// initial stream and the response stream; if the attribute is not included, the receiving entity SHOULD use /// a configurable default value for both streams, which it MUST communicate in the header for the response stream. /// For all stanzas sent over the initial stream, if the initiating entity does not include an 'xml:lang' attribute, /// the receiving entity SHOULD apply the default value; if the initiating entity does include an 'xml:lang' attribute, /// the receiving entity MUST NOT modify or delete it (see also xml:langxml:lang). /// The value of the 'xml:lang' attribute MUST conform to the format defined in RFC 3066 (Tags for the Identification of Languages, January 2001.[LANGTAGS]). /// public string Language { get { return GetAttribute("xml:lang"); } set { SetAttribute("xml:lang", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/StanzaWithError.cs0000644000175000017500000000321712250206660025374 0ustar00meebeymeebey00000000000000// Smuxi - Smart MUltipleXed Irc // // Copyright (c) 2013 Oliver Schneider // // Full GPL License: // // 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 using System; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.protocol.client; using ClientError = agsXMPP.protocol.client.Error; namespace agsXMPP.protocol.Base { public class StanzaWithError : Stanza { /// /// Error Child Element /// public ClientError Error { get { return SelectSingleElement(typeof(ClientError)) as ClientError; } set { // set type automatically to error SetAttribute("type", "error"); if (HasTag(typeof(ClientError))) RemoveTag(typeof(ClientError)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/Base/Avatar.cs0000644000175000017500000000373012204443225023503 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.Base { // Avatar is in multiple Namespaces. So better to work with a Base class /// /// Summary description for Avatar. /// public class Avatar : Element { public Avatar() { this.TagName = "query"; } public byte[] Data { get { if ( HasTag("data") ) return Convert.FromBase64String(GetTag("data")); else return null; } set { SetTag("data", Convert.ToBase64String(value, 0, value.Length)); } } public string MimeType { get { Element data = SelectSingleElement("data"); if (data != null) return GetAttribute("mimetype"); else return null; } set { Element data = SelectSingleElement("data"); if (data != null) SetAttribute("mimetype", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/0000755000175000017500000000000012204443225023260 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/msgreceipts/0000755000175000017500000000000012204443225025605 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/msgreceipts/Received.cs0000644000175000017500000000301112204443225027655 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.msgreceipts { /// /// /// public class Received : Element { /* * */ public Received() { this.TagName = "received"; this.Namespace = Uri.MSG_RECEIPT; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/msgreceipts/Request.cs0000644000175000017500000000300312204443225027560 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.msgreceipts { /// /// /// public class Request : Element { /* * */ public Request() { this.TagName = "request"; this.Namespace = Uri.MSG_RECEIPT; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ping/0000755000175000017500000000000012204443225024215 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ping/PingIq.cs0000644000175000017500000000337012204443225025736 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.ping { /// /// /// public class PingIq : IQ { private Ping m_Ping = new Ping(); #region << Constructors >> public PingIq() { base.Query = m_Ping; this.GenerateId(); } public PingIq(Jid to) : this() { To = to; } public PingIq(Jid to, Jid from) : this() { To = to; From = from; } #endregion public new Ping Query { get { return m_Ping; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ping/Ping.cs0000644000175000017500000000275412204443225025451 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.ping { /* * * * */ public class Ping : Element { public Ping() { this.TagName = "ping"; this.Namespace = Uri.PING; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/filetransfer/0000755000175000017500000000000012204443225025744 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/filetransfer/Range.cs0000644000175000017500000000473512204443225027340 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.filetransfer { /// /// When range is sent in the offer, it should have no attributes. /// This signifies that the sender can do ranged transfers. /// When no range element is sent in the Stream Initiation result, the Sender MUST send the complete file starting at offset 0. /// More generally, data is sent over the stream byte for byte starting at the offset position for the length specified. /// public class Range : Element { /* */ public Range() { this.TagName = "range"; this.Namespace = Uri.SI_FILE_TRANSFER; } public Range(long offset, long length) : this() { Offset = offset; Length = length; } /// /// Specifies the position, in bytes, to start transferring the file data from. /// This defaults to zero (0) if not specified. /// public long Offset { get { return GetAttributeLong("offset"); } set { SetAttribute("offset", value.ToString());} } /// /// Specifies the number of bytes to retrieve starting at offset. /// This defaults to the length of the file from offset to the end. /// public long Length { get { return GetAttributeLong("length"); } set { SetAttribute("length", value.ToString());} } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/filetransfer/File.cs0000644000175000017500000000754212204443225027162 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.filetransfer { /// /// Summary description for File. /// public class File : Element { /* Example 1: Example 2: This is a test. If this were a real file... Example 3: */ public File() { this.TagName = "file"; this.Namespace = Uri.SI_FILE_TRANSFER; } public File(string name, long size) : this() { Name = name; Size = size; } /// /// The file name. Its required /// public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } /// /// Size of the file. This is required /// public long Size { get { return GetAttributeLong("size"); } set { SetAttribute("size", value.ToString()); } } /// /// a Hash checksum of the file /// public string Hash { get { return GetAttribute("hash"); } set { SetAttribute("hash", value); } } /// /// file date /// public DateTime Date { get { return Util.Time.ISO_8601Date(GetAttribute("date")); } set { SetAttribute("date", Util.Time.ISO_8601Date(value)); } } /// /// is used to provide a sender-generated description of the file so the receiver can better understand what is being sent. /// It MUST NOT be sent in the result. /// public string Description { get { return GetTag("desc"); } set { SetTag("desc", value);} } public Range Range { get { Element range =SelectSingleElement(typeof(Range)); if (range != null) return range as Range; else return null; } set { RemoveTag(typeof(Range)); AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/0000755000175000017500000000000012204443225025061 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/Status.cs0000644000175000017500000000315012204443225026672 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.commands { /* * */ public enum Status { NONE = -1, canceled, completed, executing } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/Note.cs0000644000175000017500000000557112204443225026325 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.commands { /* Service 'httpd' has been configured. */ public class Note : Element { /// /// Default constructor /// public Note() { this.TagName = "note"; this.Namespace = Uri.COMMANDS; } /// /// /// /// public Note(NoteType type) : this() { this.Type = type; } /// /// /// /// /// public Note(string text, NoteType type) : this(type) { this.Value = text; } public NoteType Type { get { return (NoteType)GetAttributeEnum("type", typeof(NoteType)); } set { SetAttribute("type", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/Command.cs0000644000175000017500000001143412204443225026771 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; using agsXMPP.protocol.x.data; namespace agsXMPP.protocol.extensions.commands { public class Command : Element { #region << Constructors >> public Command() { this.TagName = "command"; this.Namespace = Uri.COMMANDS; } public Command(string node) : this() { this.Node = node; } public Command(Action action) : this() { this.Action = action; } public Command(Status status) : this() { this.Status = status; } public Command(string node, string sessionId) : this(node) { this.SessionId = sessionId; } public Command(string node, string sessionId, Action action) : this(node, sessionId) { this.Action = action; } public Command(string node, string sessionId, Status status) : this(node, sessionId) { this.Status = status; } public Command(string node, string sessionId, Action action, Status status) : this(node, sessionId, action) { this.Status = status; } #endregion public Action Action { get { return (Action) GetAttributeEnum("action", typeof(Action)); } set { if (value == Action.NONE) RemoveAttribute("action"); else SetAttribute("action", value.ToString()); } } public Status Status { get { return (Status) GetAttributeEnum("status", typeof(Status)); } set { if (value == Status.NONE) RemoveAttribute("status"); else SetAttribute("status", value.ToString()); } } // /// /// Node is Required /// public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } // public string SessionId { get { return GetAttribute("sessionid"); } set { SetAttribute("sessionid", value); } } /// /// The X-Data Element /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) this.AddChild(value); } } public Note Note { get { return SelectSingleElement(typeof(Note)) as Note; } set { if (HasTag(typeof(Note))) RemoveTag(typeof(Note)); if (value != null) this.AddChild(value); } } public Actions Actions { get { return SelectSingleElement(typeof(Actions)) as Actions; } set { if (HasTag(typeof(Actions))) RemoveTag(typeof(Actions)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/Action.cs0000644000175000017500000000344412204443225026632 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.extensions.commands { /* */ public enum Action { NONE = -1, next = 1, prev = 2, complete = 4, execute = 8, cancel = 16 } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/Actions.cs0000644000175000017500000001132312204443225027010 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.commands { /* */ public class Actions : Element { public Actions() { this.TagName = "actions"; this.Namespace = Uri.COMMANDS; } /// /// Optional Execute Action, only complete, next and previous is allowed /// public Action Execute { get { return (Action) GetAttributeEnum("execute", typeof(Action)); } set { if (value == Action.NONE) RemoveAttribute("execute"); else SetAttribute("execute", value.ToString()); } } /// /// /// public bool Complete { get { return HasTag("complete"); } set { if (value) this.SetTag("complete"); else this.RemoveTag("complete"); } } public bool Next { get { return HasTag("next"); } set { if (value) this.SetTag("next"); else this.RemoveTag("next"); } } public bool Previous { get { return HasTag("prev"); } set { if (value) this.SetTag("prev"); else this.RemoveTag("prev"); } } /// /// Actions, only complete, prev and next are allowed here and can be combined /// public Action Action { get { Action res = 0; if (Complete) res |= Action.complete; if (Previous) res |= Action.prev; if (Next) res |= Action.next; if (res == 0) return Action.NONE; else return res; } set { if (value == Action.NONE) { Complete = false; Previous = false; Next = false; } else { Complete = ((value & Action.complete) == Action.complete); Previous = ((value & Action.prev) == Action.prev); Next = ((value & Action.next) == Action.next); } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/commands/NoteType.cs0000644000175000017500000000233712204443225027164 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.commands { public enum NoteType { error, info, warn } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/nickname/0000755000175000017500000000000012204443225025045 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/nickname/Nickname.cs0000644000175000017500000000300012204443225027112 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.nickname { // Ishmael public class Nickname : Element { public Nickname() { this.TagName = "nick"; this.Namespace = Uri.NICK; } public Nickname(string nick) : this() { Value = nick; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/amp/0000755000175000017500000000000012204443225024035 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/amp/Amp.cs0000644000175000017500000001003312204443225025076 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.amp { /* */ public class Amp : Base.DirectionalElement { public Amp() { this.TagName = "amp"; this.Namespace = Uri.AMP; } /// /// The 'status' attribute specifies the reason for the amp element. /// When specifying semantics to be applied (client to server), this attribute MUST NOT be present. /// When replying to a sending entity regarding a met condition, this attribute MUST be present and /// SHOULD be the value of the 'action' attribute for the triggered rule. /// (Note: Individual action definitions MAY provide their own requirements.) /// public Action Status { get { return (Action) GetAttributeEnum("status", typeof(Action)); } set { if (value == Action.Unknown) RemoveAttribute("status"); else SetAttribute("status", value.ToString()); } } /// /// The 'per-hop' attribute flags the contained ruleset for processing at each server in the route /// between the original sender and original intended recipient. /// This attribute MAY be present, and MUST be either "true" or "false". /// If not present, the default is "false". /// public bool PerHop { get { return GetAttributeBool("per-hop"); } set { SetAttribute("per-hop", value); } } public void AddRule(Rule rule) { AddChild(rule); } public Rule AddRule() { Rule rule = new Rule(); AddChild(rule); return rule; } /// /// Gets a list of all form fields /// /// public Rule[] GetRules() { ElementList nl = SelectElements(typeof(Rule)); Rule[] items = new Rule[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Rule)e; i++; } return items; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/amp/Rule.cs0000644000175000017500000001017012204443225025272 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.amp { public class Rule : Element { public Rule() { this.TagName = "rule"; this.Namespace = Uri.AMP; } public Rule(Condition condition, string val, Action action) : this() { Condition = condition; Val = val; Action = action; } /// /// The 'value' attribute defines how the condition is matched. /// This attribute MUST be present, and MUST NOT be an empty string (""). /// The interpretation of this attribute's value is determined by the 'condition' attribute. /// public string Val { get { return GetAttribute("value"); } set { SetAttribute("value", value); } } /// /// The 'action' attribute defines the result for this rule. /// This attribute MUST be present, and MUST be either a value defined in the Defined Actions section, /// or one registered with the XMPP Registrar. /// public Action Action { get { return (Action) GetAttributeEnum("action", typeof(Action)); } set { if (value ==Action.Unknown) RemoveAttribute("action"); else SetAttribute("action", value.ToString()); } } /// /// The 'condition' attribute defines the overall condition this rule applies to. /// This attribute MUST be present, and MUST be either a value defined in the Defined Conditions section, /// or one registered with the XMPP Registrar. /// public Condition Condition { get { switch (GetAttribute("condition")) { case "deliver": return Condition.Deliver; case "expire-at": return Condition.ExprireAt; case "match-resource": return Condition.MatchResource; default: return Condition.Unknown; } } set { switch (value) { case Condition.Deliver: SetAttribute("condition", "deliver"); break; case Condition.ExprireAt: SetAttribute("condition", "expire-at"); break; case Condition.MatchResource: SetAttribute("condition", "match-resource"); break; } } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/amp/Action.cs0000644000175000017500000000240412204443225025601 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.amp { public enum Action { Unknown = -1, alert, drop, error, notify } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/amp/Condition.cs0000644000175000017500000000241512204443225026314 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.amp { public enum Condition { Unknown = -1, Deliver, ExprireAt, MatchResource } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/si/0000755000175000017500000000000012204443225023673 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/si/SI.cs0000644000175000017500000000776312204443225024552 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; using agsXMPP.protocol.extensions.filetransfer; using agsXMPP.protocol.extensions.featureneg; namespace agsXMPP.protocol.extensions.si { /// /// JEP-0095: Stream Initiation. /// This JEP defines a protocol for initiating a stream (with meta information) between any two Jabber entities. /// public class SI : Element { public SI() { this.TagName = "si"; this.Namespace = Uri.SI; } //id='a0' //mime-type='text/plain' /// /// The "id" attribute is an opaque identifier. /// This attribute MUST be present on type='set', and MUST be a valid string. /// This SHOULD NOT be sent back on type='result', since the <iq/> "id" attribute provides the only context needed. /// This value is generated by the Sender, and the same value MUST be used throughout a session when talking to the Receiver. /// public string Id { get { return GetAttribute("id"); } set { SetAttribute("id", value); } } /// /// The "mime-type" attribute identifies the MIME-type for the data across the stream. /// This attribute MUST be a valid MIME-type as registered with the Internet Assigned Numbers Authority (IANA) [3] /// (specifically, as listed at "http://www.iana.org/assignments/media-types"). /// During negotiation, this attribute SHOULD be present, and is otherwise not required. /// If not included during negotiation, its value is assumed to be "binary/octect-stream". /// public string MimeType { get { return GetAttribute("mime-type"); } set { SetAttribute("mime-type", value); } } /// /// The "profile" attribute defines the SI profile in use. This value MUST be present during negotiation, /// and is the namespace of the profile to use. /// public string Profile { get { return GetAttribute("profile"); } set { SetAttribute("profile", value); } } /// /// the FeatureNeg Element /// public FeatureNeg FeatureNeg { get { return SelectSingleElement(typeof(FeatureNeg)) as FeatureNeg; } set { if (HasTag(typeof(FeatureNeg))) RemoveTag(typeof(FeatureNeg)); if (value != null) this.AddChild(value); } } /// /// the File Element /// public File File { get { return SelectSingleElement(typeof(File)) as File; } set { if (HasTag(typeof(File))) RemoveTag(typeof(File)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/si/SIIq.cs0000644000175000017500000000456212204443225025036 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.si { /* http://jabber.org/protocol/bytestreams */ /// /// /// public class SIIq : IQ { private SI m_SI = new SI(); public SIIq() { this.GenerateId(); this.AddChild(m_SI); } public SIIq(IqType type) : this() { this.Type = type; } public SIIq(IqType type, Jid to) : this(type) { this.To = to; } public SIIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public SI SI { get { return m_SI; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/0000755000175000017500000000000012250206660024561 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/event/0000755000175000017500000000000012204443225025701 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/event/Items.cs0000644000175000017500000001042112204443225027307 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.@event { /* Soliloquy To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? tag:denmark.lit,2003:entry-32397 2003-12-13T18:30:02Z 2003-12-13T18:30:02Z */ public class Items : Element { #region << Constructors >> public Items() { this.TagName = "items"; this.Namespace = Uri.PUBSUB_EVENT; } public Items(string node) : this() { this.Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// Add a payload Item /// /// returns the added Item public Item AddItem() { Item item = new Item(); AddChild(item); return item; } /// /// /// /// /// returns the added item public Item AddItem(Item item) { AddChild(item); return item; } /// /// This will return all payload items. Multiple items are possible, but doe the most implementaions one item /// should be enough /// /// returns an Array of Items public Item[] GetItems() { ElementList nl = SelectElements(typeof(Item)); Item[] items = new Item[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Item)e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/event/Event.cs0000644000175000017500000000503212204443225027311 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.@event { public class Event : Element { public Event() { this.TagName = "event"; this.Namespace = Uri.PUBSUB_EVENT; } public Delete Delete { get { return SelectSingleElement(typeof(Delete)) as Delete; } set { if (HasTag(typeof(Delete))) RemoveTag(typeof(Delete)); if (value != null) this.AddChild(value); } } public Purge Purge { get { return SelectSingleElement(typeof(Purge)) as Purge; } set { if (HasTag(typeof(Purge))) RemoveTag(typeof(Purge)); if (value != null) this.AddChild(value); } } public Items Items { get { return SelectSingleElement(typeof(Items)) as Items; } set { if (HasTag(typeof(Items))) RemoveTag(typeof(Items)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/event/Delete.cs0000644000175000017500000000322212204443225027431 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.@event { public class Delete : Element { #region << Constructors >> public Delete() { this.TagName = "delete"; this.Namespace = Uri.PUBSUB_EVENT; } public Delete(string node) : this() { this.Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/event/Item.cs0000644000175000017500000000673212204443225027136 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.pubsub.@event { /* Soliloquy To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? tag:denmark.lit,2003:entry-32397 2003-12-13T18:30:02Z 2003-12-13T18:30:02Z */ // This class is the same as the Item class in the main pubsub namespace, // so inherit it and overwrite some properties and functions public class Item : agsXMPP.protocol.extensions.pubsub.Item { #region << Constructors >> public Item() : base() { this.Namespace = Uri.PUBSUB_EVENT; } public Item(string id) : this() { this.Id = id; } #endregion private const string RETRACT = "retract"; public bool Retract { get { return HasTag(RETRACT); } set { if (value) SetTag(RETRACT); else RemoveTag(RETRACT); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/event/Purge.cs0000644000175000017500000000323012204443225027310 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.@event { public class Purge : Element { #region << Constructors >> public Purge() { this.TagName = "purge"; this.Namespace = Uri.PUBSUB_EVENT; } public Purge(string node) : this() { this.Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/PubSubAction.cs0000644000175000017500000000355612204443225027456 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public abstract class PubSubAction : Element { public PubSubAction() { this.Namespace = Uri.PUBSUB; } public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public Type Type { get { return (Type)GetAttributeEnum("type", typeof(Type)); } set { if (value == Type.NONE) RemoveAttribute("type"); else SetAttribute("type", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Items.cs0000644000175000017500000000576012204443225026200 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* */ public class Items : Publish { #region << Constructors >> public Items() : base() { this.TagName = "items"; } public Items(string node) : this() { this.Node = node; } public Items(string node, string subId) : this(node) { this.SubId = subId; } public Items(string node, string subId, int maxItems) : this(node, subId) { this.MaxItems = maxItems; } #endregion //public string Node //{ // get { return GetAttribute("node"); } // set { SetAttribute("node", value); } //} public string SubId { get { return GetAttribute("subid"); } set { SetAttribute("subid", value); } } public int MaxItems { get { return GetAttributeInt("max_items"); } set { SetAttribute("max_items", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Subscriptions.cs0000644000175000017500000000701712204443225027763 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public class Subscriptions : Element { /* Example 14. Entity requests all current subscriptions Example 15. Service returns all current subscriptions */ public Subscriptions() { this.TagName = "subscriptions"; this.Namespace = Uri.PUBSUB; } /// /// /// /// public Subscription AddSubscription() { Subscription sub = new Subscription(); AddChild(sub); return sub; } /// /// /// /// /// public Subscription AddSubscription(Subscription sub) { AddChild(sub); return sub; } public Subscription[] GetSubscriptions() { ElementList nl = SelectElements(typeof(Subscription)); Subscription[] items = new Subscription[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Subscription) e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Options.cs0000644000175000017500000000713712204443225026552 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x.data; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* */ public class Options : Element { #region << Constructors >> public Options() { this.TagName = "options"; this.Namespace = Uri.PUBSUB; } public Options(Jid jid) : this() { this.Jid = jid; } public Options(Jid jid, string node) : this(jid) { this.Node = node; } public Options(Jid jid, string node, string subId) : this(jid, node) { this.SubId = subId; } #endregion public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value!=null) this.SetAttribute("jid", value.ToString()); } } public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public string SubId { get { return GetAttribute("subid"); } set { SetAttribute("subid", value); } } /// /// The X-Data Element/Form /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Type.cs0000644000175000017500000000235412204443225026034 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.pubsub { public enum Type { NONE = -1, collection, leaf } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/AffiliationType.cs0000644000175000017500000000251312204443225030177 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.pubsub { /// /// /// public enum AffiliationType { /// /// the absence of an affiliation /// none, owner, publisher, outcast } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/PubSubIq.cs0000644000175000017500000000462012204443225026603 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.pubsub { public class PubSubIq : IQ { /* Example 1. Entity requests a new node with default configuration. */ private PubSub m_PubSub = new PubSub(); #region << Constructors >> public PubSubIq() { this.GenerateId(); this.AddChild(m_PubSub); } public PubSubIq(IqType type) : this() { this.Type = type; } public PubSubIq(IqType type, Jid to) : this(type) { this.To = to; } public PubSubIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } #endregion public PubSub PubSub { get { return m_PubSub; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/0000755000175000017500000000000012204443225025712 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Pending.cs0000644000175000017500000000422412204443225027627 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x.data; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { public class Pending : Element { #region << Constructors >> public Pending() { this.TagName = "pending"; this.Namespace = Uri.PUBSUB_OWNER; } public Pending(string node) : this() { this.Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// The x-Data Element /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/PubSubIq.cs0000644000175000017500000000453012204443225027735 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.pubsub.owner { public class PubSubIq : IQ { /* Example 133. Owner deletes a node */ private PubSub m_PubSub = new PubSub(); #region << Constructors >> public PubSubIq() { this.GenerateId(); this.AddChild(m_PubSub); } public PubSubIq(IqType type) : this() { this.Type = type; } public PubSubIq(IqType type, Jid to) : this(type) { this.To = to; } public PubSubIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } #endregion public PubSub PubSub { get { return m_PubSub; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Subscriber.cs0000644000175000017500000000675012204443225030354 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { /* */ public class Subscriber : Element { #region << Constructors >> public Subscriber() { this.TagName = "subscriber"; this.Namespace = Uri.PUBSUB_OWNER; } public Subscriber(Jid jid, SubscriptionState sub) : this() { this.Jid = jid; this.SubscriptionState = sub; } #endregion public SubscriptionState SubscriptionState { get { return (SubscriptionState)GetAttributeEnum("subscription", typeof(SubscriptionState)); } set { SetAttribute("subscription", value.ToString()); } } public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value!=null) this.SetAttribute("jid", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/PubSub.cs0000644000175000017500000000656712204443225027457 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { public class PubSub : Element { public PubSub() { this.TagName = "pubsub"; this.Namespace = Uri.PUBSUB_OWNER; } public Delete Delete { get { return SelectSingleElement(typeof(Delete)) as Delete; } set { if (HasTag(typeof(Delete))) RemoveTag(typeof(Delete)); if (value != null) this.AddChild(value); } } public Purge Purge { get { return SelectSingleElement(typeof(Purge)) as Purge; } set { if (HasTag(typeof(Purge))) RemoveTag(typeof(Purge)); if (value != null) this.AddChild(value); } } public Subscribers Subscribers { get { return SelectSingleElement(typeof(Subscribers)) as Subscribers; } set { if (HasTag(typeof(Subscribers))) RemoveTag(typeof(Subscribers)); if (value != null) this.AddChild(value); } } public Affiliates Affiliates { get { return SelectSingleElement(typeof(Affiliates)) as Affiliates; } set { if (HasTag(typeof(Affiliates))) RemoveTag(typeof(Affiliates)); if (value != null) this.AddChild(value); } } public Configure Configure { get { return SelectSingleElement(typeof(Configure)) as Configure; } set { if (HasTag(typeof(Configure))) RemoveTag(typeof(Configure)); if (value != null) this.AddChild(value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Affiliate.cs0000644000175000017500000000711712204443225030133 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { /* */ public class Affiliate : Element { #region << Constructors >> public Affiliate() { this.TagName = "affiliate"; this.Namespace = Uri.PUBSUB_OWNER; } public Affiliate(Jid jid, AffiliationType affiliation) : this() { this.Jid = jid; this.Affiliation = affiliation; } #endregion public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); } } public AffiliationType Affiliation { get { return (AffiliationType) GetAttributeEnum("affiliation", typeof(AffiliationType)); } set { SetAttribute("affiliation", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Configure.cs0000644000175000017500000000415312204443225030165 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.protocol.x.data; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { public class Configure : Element { #region << Constructor >> public Configure() { TagName = "configure"; Namespace = Uri.PUBSUB_OWNER; } public Configure(string node) : this() { Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// The x-Data Element /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Delete.cs0000644000175000017500000000305212204443225027443 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.pubsub.owner { // Only the Namespace is different to Delete in the event Namespace public class Delete : @event.Delete { #region << Constructors >> public Delete() : base() { this.Namespace = Uri.PUBSUB_OWNER; } public Delete(string node) { this.Node = node; } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Affiliates.cs0000644000175000017500000000754212204443225030320 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { /* */ public class Affiliates : Element { #region << Constructors >> public Affiliates() { this.TagName = "affiliates"; this.Namespace = Uri.PUBSUB_OWNER; } public Affiliates(string node) : this() { this.Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// /// /// public Affiliate AddAffiliate() { Affiliate affiliate = new Affiliate(); AddChild(affiliate); return affiliate; } /// /// /// /// /// public Affiliate AddAffiliate(Affiliate affiliate) { AddChild(affiliate); return affiliate; } /// /// /// /// public void AddAffiliates(Affiliate[] affiliates) { foreach (Affiliate affiliate in affiliates) { AddAffiliate(affiliate); } } /// /// /// /// public Affiliate[] GetAffiliates() { ElementList nl = SelectElements(typeof(Affiliate)); Affiliate[] affiliates = new Affiliate[nl.Count]; int i = 0; foreach (Element e in nl) { affiliates[i] = (Affiliate)e; i++; } return affiliates; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Subscribers.cs0000644000175000017500000000753112204443225030535 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub.owner { /* */ public class Subscribers : Element { #region << Constructors >> public Subscribers() { this.TagName = "subscribers"; this.Namespace = Uri.PUBSUB_OWNER; } public Subscribers(string node) : this() { this.Node = node; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// Add a Subscriber /// /// public Subscriber AddSubscriber() { Subscriber subscriber = new Subscriber(); AddChild(subscriber); return subscriber; } /// /// Add a Subscriber /// /// the Subscriber to add /// public Subscriber AddSubscriber(Subscriber subscriber) { AddChild(subscriber); return subscriber; } public void AddSubscribers(Subscriber[] subscribers) { foreach (Subscriber subscriber in subscribers) { AddSubscriber(subscriber); } } /// /// /// /// public Subscriber[] GetSubscribers() { ElementList nl = SelectElements(typeof(Subscriber)); Subscriber[] subscribers = new Subscriber[nl.Count]; int i = 0; foreach (Element e in nl) { subscribers[i] = (Subscriber) e; i++; } return subscribers; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/owner/Purge.cs0000644000175000017500000000301412204443225027321 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.pubsub.owner { // Only the Namespace is different to Purge in the Event Namespace public class Purge : @event.Purge { #region << Constructors >> public Purge() : base() { this.Namespace = Uri.PUBSUB_OWNER; } public Purge(string node) : this() { this.Node = node; } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/SubscriptionState.cs0000644000175000017500000000522612204443225030601 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.extensions.pubsub { /* None The node MUST NOT send event notifications or payloads to the Entity. Pending 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. Unconfigured 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. Subscribed */ public enum SubscriptionState { /// /// The node MUST NOT send event notifications or payloads to the Entity. /// none, /// /// 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. /// pending, /// /// 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. /// unconfigured, /// /// /// subscribed } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Access.cs0000644000175000017500000000343612204443225026316 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.pubsub { /* */ public enum Access { NONE = -1, open, authorize, presence, roster, whitelist } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/PubSub.cs0000644000175000017500000001311712204443225026312 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public class PubSub : Element { public PubSub() { this.TagName = "pubsub"; this.Namespace = Uri.PUBSUB; } /// /// the Create Element of the Pubsub Element /// public Create Create { get { return SelectSingleElement(typeof(Create)) as Create; } set { if (HasTag(typeof(Create))) RemoveTag(typeof(Create)); if (value != null) this.AddChild(value); } } public Publish Publish { get { return SelectSingleElement(typeof(Publish)) as Publish; } set { if (HasTag(typeof(Publish))) RemoveTag(typeof(Publish)); if (value != null) this.AddChild(value); } } public Retract Retract { get { return SelectSingleElement(typeof(Retract)) as Retract; } set { if (HasTag(typeof(Retract))) RemoveTag(typeof(Retract)); if (value != null) this.AddChild(value); } } public Subscribe Subscribe { get { return SelectSingleElement(typeof(Subscribe)) as Subscribe; } set { if (HasTag(typeof(Subscribe))) RemoveTag(typeof(Subscribe)); if (value != null) this.AddChild(value); } } public Unsubscribe Unsubscribe { get { return SelectSingleElement(typeof(Unsubscribe)) as Unsubscribe; } set { if (HasTag(typeof(Unsubscribe))) RemoveTag(typeof(Unsubscribe)); if (value != null) this.AddChild(value); } } public Subscriptions Subscriptions { get { return SelectSingleElement(typeof(Subscriptions)) as Subscriptions; } set { if (HasTag(typeof(Subscriptions))) RemoveTag(typeof(Subscriptions)); if (value != null) this.AddChild(value); } } public Affiliations Affiliations { get { return SelectSingleElement(typeof(Affiliations)) as Affiliations; } set { if (HasTag(typeof(Affiliations))) RemoveTag(typeof(Affiliations)); if (value != null) this.AddChild(value); } } public Options Options { get { return SelectSingleElement(typeof(Options)) as Options; } set { if (HasTag(typeof(Options))) RemoveTag(typeof(Options)); if (value != null) this.AddChild(value); } } public Items Items { get { return SelectSingleElement(typeof(Items)) as Items; } set { if (HasTag(typeof(Items))) RemoveTag(typeof(Items)); if (value != null) this.AddChild(value); } } /// /// The Configure Element of the PunSub Element /// public Configure Configure { get { return SelectSingleElement(typeof(Configure)) as Configure; } set { if (HasTag(typeof(Configure))) RemoveTag(typeof(Configure)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Subscription.cs0000644000175000017500000001532512204443225027601 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public class Subscription : Element { /* Example 23. Service replies with success Example 36. Service replies with success and indicates that subscription configuration is required */ #region << Constructors >> public Subscription() { this.TagName = "subscription"; this.Namespace = Uri.PUBSUB; } public Subscription(Jid jid) : this() { this.Jid = jid; } public Subscription(Jid jid, SubscriptionState subType) : this(jid) { this.SubscriptionState = subType; } public Subscription(Jid jid, string node) : this() { this.Node = node; } public Subscription(Jid jid, string node, SubscriptionState subType) : this(jid, node) { this.SubscriptionState = subType; } public Subscription(Jid jid, string node, string subId) : this(jid, node) { this.SubId = subId; } public Subscription(Jid jid, string node, string subId, SubscriptionState subType) : this(jid, node, subId) { this.SubscriptionState = subType; } #endregion /// /// Node (optional) /// public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); else RemoveAttribute("jid"); } } /// /// Subscription ID (optional) /// public string SubId { get { return GetAttribute("subid"); } set { if (value != null) SetAttribute("subid", value); else RemoveAttribute("subid"); } } //public Affiliation Affiliation //{ // get // { // return (Affiliation)GetAttributeEnum("affiliation", typeof(Affiliation)); // } // set // { // SetAttribute("affiliation", value.ToString()); // } //} public SubscriptionState SubscriptionState { get { return (SubscriptionState) GetAttributeEnum("subscription", typeof(SubscriptionState)); } set { SetAttribute("subscription", value.ToString()); } } public SubscribeOptions SubscribeOptions { get { return SelectSingleElement(typeof(SubscribeOptions)) as SubscribeOptions; } set { if (HasTag(typeof(SubscribeOptions))) RemoveTag(typeof(SubscribeOptions)); if (value != null) this.AddChild(value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Affiliations.cs0000644000175000017500000000540312204443225027521 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* */ public class Affiliations : Element { #region << Consrtuctors >> public Affiliations() { this.TagName = "affiliations"; this.Namespace = Uri.PUBSUB; } #endregion public Affiliation AddAffiliation() { Affiliation aff = new Affiliation(); AddChild(aff); return aff; } public Affiliation AddAffiliation(Affiliation aff) { AddChild(aff); return aff; } public Affiliation[] GetAffiliations() { ElementList nl = SelectElements(typeof(Affiliation)); Affiliation[] items = new Affiliation[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Affiliation) e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/PubSubManager.cs0000644000175000017500000010105612250206660027606 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.pubsub { public class PubSubManager { private XmppClientConnection m_connection = null; #region << Constructors >> public PubSubManager(XmppClientConnection con) { m_connection = con; } #endregion #region << Create Instant Node >> /* Example 6. Client requests an instant node */ public void CreateInstantNode(Jid to) { CreateInstantNode(to, null, null); } public void CreateInstantNode(Jid to, Jid from) { CreateInstantNode(to, from, null); } public void CreateInstantNode(Jid to, IqHandler cb) { CreateInstantNode(to, null, cb); } public void CreateInstantNode(Jid to, Jid from, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Create = new Create(); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Create Node >> /* Example 1. Entity requests a new node with default configuration. */ /// /// Create a Node with default configuration /// /// /// public void CreateNode(Jid to, string node) { CreateNode(to, null, node, true, null); } public void CreateNode(Jid to, Jid from, string node) { CreateNode(to, from, node, true, null); } /// /// Create a Node /// /// /// /// public void CreateNode(Jid to, Jid from, string node, bool defaultConfig) { CreateNode(to, from, node, defaultConfig, null); } public void CreateNode(Jid to, string node, bool defaultConfig, IqHandler cb) { CreateNode(to, null, node, defaultConfig, cb); } public void CreateNode(Jid to, Jid from, string node, bool defaultConfig, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Create = new Create(node); if (defaultConfig) pubsubIq.PubSub.Configure = new Configure(); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << CreateCollection Node >> /* To create a new collection node, the requesting entity MUST specify a type of "collection" when asking the service to create the node. [20] Example 185. Entity requests a new collection node Example 186. Service responds with success */ public void CreateCollectionNode(Jid to, string node, bool defaultConfig) { CreateCollectionNode(to, null, node, defaultConfig, null); } public void CreateCollectionNode(Jid to, string node, bool defaultConfig, IqHandler cb) { CreateCollectionNode(to, null, node, defaultConfig, cb); } public void CreateCollectionNode(Jid to, Jid from, string node, bool defaultConfig) { CreateCollectionNode(to, from, node, defaultConfig, null); } public void CreateCollectionNode(Jid to, Jid from, string node, bool defaultConfig, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Create = new Create(node, Type.collection); if (defaultConfig) pubsubIq.PubSub.Configure = new Configure(); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Delete Node >> /* Example 133. Owner deletes a node */ public void DeleteNode(Jid to, string node) { DeleteNode(to, null, node, null); } public void DeleteNode(Jid to, string node, IqHandler cb) { DeleteNode(to, null, node, cb); } public void DeleteNode(Jid to, Jid from, string node) { DeleteNode(to, from, node, null); } public void DeleteNode(Jid to, Jid from, string node, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Delete = new owner.Delete(node); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Purge Node >> /* Example 139. Owner purges all items from a node */ public void PurgeNode(Jid to, string node) { PurgeNode(to, null, node, null); } public void PurgeNode(Jid to, string node, IqHandler cb) { PurgeNode(to, null, node, cb); } public void PurgeNode(Jid to, Jid from, string node) { PurgeNode(to, from, node, null); } public void PurgeNode(Jid to, Jid from, string node, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Purge = new owner.Purge(node); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Publish to a Node >> /* Example 9. Entity publishes an item with an ItemID Ralph Vaughan Williams Concerto in F for Bass Tuba Golden Brass: The Collector's Edition */ /// /// Publish a payload to a Node /// /// /// /// public void PublishItem(Jid to, string node, Item payload) { PublishItem(to, null, node, payload, null); } /// /// Publish a payload to a Node /// /// /// /// /// public void PublishItem(Jid to, string node, Item payload, IqHandler cb) { PublishItem(to, null, node, payload, cb); } /// /// Publish a payload to a Node /// /// /// /// /// public void PublishItem(Jid to, Jid from, string node, Item payload) { PublishItem(to, from, node, payload, null); } /// /// Publish a payload to a Node /// /// /// /// /// /// public void PublishItem(Jid to, Jid from, string node, Item payload, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; Publish publish = new Publish(node); publish.AddItem(payload); pubsubIq.PubSub.Publish = publish; if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Retract >> /* */ public void RetractItem(Jid to, string node, string id) { RetractItem(to, null, node, id, null); } public void RetractItem(Jid to, string node, string id, IqHandler cb) { RetractItem(to, null, node, id, cb); } public void RetractItem(Jid to, Jid from, string node, string id) { RetractItem(to, from, node, id, null); } public void RetractItem(Jid to, Jid from, string node, string id, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Retract = new Retract(node, id); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Subscribe >> /* */ /// /// /// /// Jid of the Publish Subscribe Service /// Jid which should be subscribed /// node to which we want to subscribe public void Subscribe(Jid to, Jid subscribe, string node) { Subscribe(to, null, subscribe, node, null); } public void Subscribe(Jid to, Jid subscribe, string node, IqHandler cb) { Subscribe(to, null, subscribe, node, cb); } public void Subscribe(Jid to, Jid from, Jid subscribe, string node) { Subscribe(to, from, subscribe, node, null); } public void Subscribe(Jid to, Jid from, Jid subscribe, string node, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Subscribe = new Subscribe(node, subscribe); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Unsubscribe >> /* Example 38. Entity unsubscribes from a node */ /// /// /// /// Jid of the Publish Subscribe Service /// Jid which should be subscribed /// node to which we want to subscribe public void Unsubscribe(Jid to, Jid unsubscribe, string node) { Unsubscribe(to, null, unsubscribe, node, null, null); } public void Unsubscribe(Jid to, Jid unsubscribe, string node, string subid) { Unsubscribe(to, null, unsubscribe, node, subid, null); } public void Unsubscribe(Jid to, Jid unsubscribe, string node, IqHandler cb) { Unsubscribe(to, null, unsubscribe, node, cb); } public void Unsubscribe(Jid to, Jid unsubscribe, string node, string subid, IqHandler cb) { Unsubscribe(to, null, unsubscribe, node, subid, cb); } public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node) { Unsubscribe(to, from, unsubscribe, node, null, null); } public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, string subid) { Unsubscribe(to, from, unsubscribe, node, subid, null); } public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, IqHandler cb) { Unsubscribe(to, from, unsubscribe, node, cb); } public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, string subid, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; Unsubscribe unsub = new Unsubscribe(node, unsubscribe); if (subid != null) unsub.SubId = subid; pubsubIq.PubSub.Unsubscribe = unsub; if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Request Subscriptions >>> /* */ public void RequestSubscriptions(Jid to) { RequestSubscriptions(to, null, null); } public void RequestSubscriptions(Jid to, IqHandler cb) { RequestSubscriptions(to, null, cb); } public void RequestSubscriptions(Jid to, Jid from) { RequestSubscriptions(to, from, null); } public void RequestSubscriptions(Jid to, Jid from, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.get, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Subscriptions = new Subscriptions(); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Owner Request Affiliations >> /* */ public void RequestAffiliations(Jid to) { RequestAffiliations(to, null, null); } public void RequestAffiliations(Jid to, IqHandler cb) { RequestAffiliations(to, null, cb); } public void RequestAffiliations(Jid to, Jid from) { RequestAffiliations(to, from, null); } public void RequestAffiliations(Jid to, Jid from, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.get, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Affiliations = new Affiliations(); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Request Subscription Options >> /* */ public void RequestSubscriptionOptions(Jid to, Jid subscribe, string node) { RequestSubscriptionOptions(to, null, subscribe, node, null); } public void RequestSubscriptionOptions(Jid to, Jid subscribe, string node, IqHandler cb) { RequestSubscriptionOptions(to, null, subscribe, node, cb); } public void RequestSubscriptionOptions(Jid to, Jid from, Jid subscribe, string node) { RequestSubscriptionOptions(to, from, subscribe, node, null); } public void RequestSubscriptionOptions(Jid to, Jid from, Jid subscribe, string node, IqHandler cb) { PubSubIq pubsubIq = new PubSubIq(IqType.get, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Options = new Options(subscribe, node); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Request All Subscribers >> /* */ public void OwnerRequestSubscribers(Jid to, string node) { OwnerRequestSubscribers(to, null, node, null); } public void OwnerRequestSubscribers(Jid to, string node, IqHandler cb) { OwnerRequestSubscribers(to, null, node, cb); } public void OwnerRequestSubscribers(Jid to, Jid from, string node) { OwnerRequestSubscribers(to, from, node, null); } public void OwnerRequestSubscribers(Jid to, Jid from, string node, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.get, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Subscribers = new agsXMPP.protocol.extensions.pubsub.owner.Subscribers(node); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Modifying single Subscription State >> /* Upon receiving the subscribers list, the node owner MAY modify subscription states. The owner MUST send only modified subscription states (i.e., a "delta"), not the complete list. (Note: If the 'subscription' attribute is not specified in a modification request, then the value MUST NOT be changed.) Example 163. Owner modifies subscriptions */ public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state) { OwnerModifySubscriptionState(to, null, node, subscriber, state, null); } public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state, IqHandler cb) { OwnerModifySubscriptionState(to, null, node, subscriber, state, cb); } public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state) { OwnerModifySubscriptionState(to, from, node, subscriber, state, null); } public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; owner.Subscribers subs = new owner.Subscribers(node); subs.AddSubscriber(new owner.Subscriber(subscriber, state)); pubsubIq.PubSub.Subscribers = subs; if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Modifying multiple Subscription States >> /* */ public void OwnerModifySubscriptionStates(Jid to, string node, owner.Subscriber[] subscribers) { OwnerModifySubscriptionStates(to, null, node, subscribers, null); } public void OwnerModifySubscriptionStates(Jid to, string node, owner.Subscriber[] subscribers, IqHandler cb) { OwnerModifySubscriptionStates(to, null, node, subscribers, cb); } public void OwnerModifySubscriptionStates(Jid to, Jid from, string node, owner.Subscriber[] subscribers) { OwnerModifySubscriptionStates(to, from, node, subscribers, null); } public void OwnerModifySubscriptionStates(Jid to, Jid from, string node, owner.Subscriber[] subscribers, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; owner.Subscribers subs = new owner.Subscribers(node); subs.AddSubscribers(subscribers); pubsubIq.PubSub.Subscribers = subs; if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Owner Request Affiliations >> /* Example 168. Owner requests all affiliated entities */ public void OwnerRequestAffiliations(Jid to, string node) { OwnerRequestAffiliations(to, null, node, null); } public void OwnerRequestAffiliations(Jid to, string node, IqHandler cb) { OwnerRequestAffiliations(to, null, node, cb); } public void OwnerRequestAffiliations(Jid to, Jid from, string node) { OwnerRequestAffiliations(to, from, node, null); } public void OwnerRequestAffiliations(Jid to, Jid from, string node, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.get, to); if (from != null) pubsubIq.From = from; pubsubIq.PubSub.Affiliates = new owner.Affiliates(node); if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Owner Set/Modify Affiliation >> /* Owner modifies a single affiliation */ public void OwnerModifyAffiliation(Jid to, string node, Jid affiliate, AffiliationType affiliation) { OwnerModifyAffiliation(to, null, node, affiliate, affiliation, null); } public void OwnerModifyAffiliation(Jid to, string node, Jid affiliate, AffiliationType affiliation, IqHandler cb) { OwnerModifyAffiliation(to, null, node, affiliate, affiliation, cb); } public void OwnerModifyAffiliation(Jid to, Jid from, string node, Jid affiliate, AffiliationType affiliation) { OwnerModifyAffiliation(to, from, node, affiliate, affiliation, null); } public void OwnerModifyAffiliation(Jid to, Jid from, string node, Jid affiliate, AffiliationType affiliation, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; owner.Affiliates aff = new owner.Affiliates(node); aff.AddAffiliate(new owner.Affiliate(affiliate, affiliation)); pubsubIq.PubSub.Affiliates = aff; if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion #region << Owner Modify Affiliations >> /* Owner modifies a single affiliation */ public void OwnerModifyAffiliations(Jid to, string node, owner.Affiliate[] affiliates) { OwnerModifyAffiliations(to, null, node, affiliates, null); } public void OwnerModifyAffiliations(Jid to, string node, owner.Affiliate[] affiliates, IqHandler cb) { OwnerModifyAffiliations(to, null, node, affiliates, cb); } public void OwnerModifyAffiliations(Jid to, Jid from, string node, owner.Affiliate[] affiliates) { OwnerModifyAffiliations(to, from, node, affiliates, null); } public void OwnerModifyAffiliations(Jid to, Jid from, string node, owner.Affiliate[] affiliates, IqHandler cb) { owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to); if (from != null) pubsubIq.From = from; owner.Affiliates affs = new owner.Affiliates(node); affs.AddAffiliates(affiliates); pubsubIq.PubSub.Affiliates = affs; if (cb == null) m_connection.Send(pubsubIq); else m_connection.IqGrabber.SendIq(pubsubIq, cb); } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Unsubscribe.cs0000644000175000017500000000453212204443225027377 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.extensions.pubsub { /* Example 38. Entity unsubscribes from a node */ // looks exactly the same as subscribe, but has an additional Attribute subid public class Unsubscribe : Subscribe { #region << Constructors >> public Unsubscribe() : base() { this.TagName = "unsubscribe"; } public Unsubscribe(string node, Jid jid) : this() { this.Node = node; this.Jid = jid; } public Unsubscribe(string node, Jid jid, string subid) : this(node, jid) { SubId = subid; } #endregion public string SubId { get { return GetAttribute("subid"); } set { SetAttribute("subid", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Configure.cs0000644000175000017500000000502412204443225027031 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x.data; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public class Configure : PubSubAction { #region << Constructors >> public Configure() : base() { this.TagName = "configure"; } public Configure(string node) : this() { this.Node = node; } public Configure(Type type) : this() { this.Type = type; } public Configure(string node, Type type) : this(node) { this.Type = type; } #endregion public Access Access { get { return (Access)GetAttributeEnum("access", typeof(Access)); } set { if (value == Access.NONE) RemoveAttribute("access"); else SetAttribute("access", value.ToString()); } } /// /// The x-Data Element /// public Data Data { get { return SelectSingleElement(typeof(Data)) as Data; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Retract.cs0000644000175000017500000000513712204443225026521 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { // Publish and retract looks exactly the same, so inherit from publish here public class Retract : Publish { /* A service SHOULD allow a publisher to delete an item once it has been published to a node that supports persistent items. To delete an item, the publisher sends a retract request as shown in the following examples. The element MUST possess a 'node' attribute and SHOULD contain one element (but MAY contain more than one element for Batch Processing of item retractions); the element MUST be empty and MUST possess an 'id' attribute. */ public Retract() : base() { this.TagName = "retract"; } public Retract(string node) : this() { this.Node = node; } public Retract(string node, string id) : this(node) { this.AddItem(new Item(id)); } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Publish.cs0000644000175000017500000000764012204443225026524 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* Example 9. Entity publishes an item with an ItemID of the Payload Type UserTune Ralph Vaughan Williams Concerto in F for Bass Tuba Golden Brass: The Collector's Edition */ public class Publish : Element { #region << Constructors >> public Publish() { this.TagName = "publish"; this.Namespace = Uri.PUBSUB; } /// /// Its recommended to use this constructor because a node is required /// /// Node to publish public Publish(string node) : this() { this.Node = node; } public Publish(string node, Item item) : this(node) { this.AddItem(item); } #endregion /// /// The node to publish to. This Property is required /// public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// Add a payload Item /// /// returns the added Item public Item AddItem() { Item item = new Item(); AddChild(item); return item; } /// /// /// /// /// returns the added item public Item AddItem(Item item) { AddChild(item); return item; } /// /// This will return all payload items. Multiple items are possible, but doe the most implementaions one item /// should be enough /// /// returns an Array of Items public Item[] GetItems() { ElementList nl = SelectElements(typeof(Item)); Item[] items = new Item[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Item)e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Create.cs0000644000175000017500000000434512204443225026320 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public class Create : PubSubAction { /* ... ... */ #region << Constructors >> public Create() : base() { this.TagName = "create"; } public Create(string node) : this() { this.Node = node; } public Create(Type type) : this() { this.Type = type; } public Create(string node, Type type) : this(node) { this.Type = type; } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/SubscribeOptions.cs0000644000175000017500000000540712204443225030412 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* Example 36. Service replies with success and indicates that subscription configuration is required */ public class SubscribeOptions : Element { #region << Constructors >> public SubscribeOptions() { this.TagName = "subscribe-options"; this.Namespace = Uri.PUBSUB; } public SubscribeOptions(bool required) { this.Required = required; } #endregion public bool Required { get { return HasTag("required"); } set { if (value) SetTag("required"); else RemoveTag("required"); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Item.cs0000644000175000017500000000366412204443225026016 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* */ public class Item : Element { public Item() { this.TagName = "item"; this.Namespace = Uri.PUBSUB; } public Item(string id) : this() { this.Id = id; } /// /// The optional id /// public string Id { get { return GetAttribute("id"); } set { SetAttribute("id", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Affiliation.cs0000644000175000017500000000503512204443225027337 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { /* */ public class Affiliation : Element { #region << Constructors >> public Affiliation() { this.TagName = "affiliation"; this.Namespace = Uri.PUBSUB; } public Affiliation(Jid jid, AffiliationType affiliation) { this.Jid = jid; this.AffiliationType = affiliation; } public Affiliation(string node, Jid jid, AffiliationType affiliation) : this(jid, affiliation) { this.Node = node; } #endregion public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value!=null) this.SetAttribute("jid", value.ToString()); } } public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public AffiliationType AffiliationType { get { return (AffiliationType)GetAttributeEnum("affiliation", typeof(AffiliationType)); } set { SetAttribute("affiliation", value.ToString()); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/pubsub/Subscribe.cs0000644000175000017500000000471412204443225027036 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.pubsub { public class Subscribe : Element { /* Example 25. Entity subscribes to a node */ #region << Constructors >> public Subscribe() { this.TagName = "subscribe"; this.Namespace = Uri.PUBSUB; } public Subscribe(string node, Jid jid) : this() { this.Node = node; this.Jid = jid; } #endregion public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); else RemoveAttribute("jid"); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ibb/0000755000175000017500000000000012204443225024014 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ibb/Data.cs0000644000175000017500000000553412204443225025223 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.ibb { /* qANQR1DBwU4DX7jmYZnncmUQB/9KuKBddzQH+tZ1ZywKK0yHKnq57kWq+RFtQdCJ WpdWpR0uQsuJe7+vh3NWn59/gTc5MDlX8dS9p0ovStmNcyLhxVgmqS8ZKhsblVeu IpQ0JgavABqibJolc3BKrVtVV1igKiX/N7Pi8RtY1K18toaMDhdEfhBRzO/XB0+P AQhYlRjNacGcslkhXqNjK5Va4tuOAPy2n1Q8UUrHbUd0g+xJ9Bm0G0LZXyvCWyKH kuNEHFQiLuCY6Iv0myq6iX6tjuHehZlFSh80b5BVV9tNLwNR5Eqz1klxMhoghJOA */ /// /// /// public class Data : Base { /// /// /// public Data() { this.TagName = "data"; } /// /// /// /// /// public Data(string sid, int seq) : this() { this.Sid = sid; this.Sequence = seq; } /// /// the sequence /// public int Sequence { get { return GetAttributeInt("seq"); } set { SetAttribute("seq", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ibb/Close.cs0000644000175000017500000000334012204443225025410 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.ibb { /* */ /// /// /// public class Close : Base { /// /// /// public Close() { this.TagName = "close"; } /// /// /// /// public Close(string sid) : this() { this.Sid = sid; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ibb/Base.cs0000644000175000017500000000312312204443225025214 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.ibb { /// /// IBB base class /// public abstract class Base : Element { public Base() { this.Namespace = Uri.IBB; } /// /// Sid /// public string Sid { get { return GetAttribute("sid"); } set { SetAttribute("sid", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/ibb/Open.cs0000644000175000017500000000466612204443225025260 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.ibb { /* */ public class Open : Base { /// /// /// public Open() { this.TagName = "open"; } /// /// /// /// /// public Open(string sid, long blocksize) : this() { this.Sid = sid; this.BlockSize = blocksize; } /// /// Block size /// public long BlockSize { get { return GetAttributeLong("block-size"); } set { SetAttribute("block-size", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/primary/0000755000175000017500000000000012204443225024743 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/primary/Primary.cs0000644000175000017500000000303712204443225026720 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.primary { /// /// http://www.jabber.org/jeps/inbox/primary.html /// public class Primary : Element { /* I'm back!

*/ public Primary() { this.TagName = "p"; this.Namespace = Uri.PRIMARY; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/geoloc/0000755000175000017500000000000012204443225024530 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/geoloc/GeoLocIq.cs0000644000175000017500000000365212204443225026527 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.geoloc { ///

/// a GeoLoc InfoQuery /// public class GeoLocIq : IQ { private GeoLoc m_GeoLoc = new GeoLoc(); public GeoLocIq() { base.Query = m_GeoLoc; this.GenerateId(); } public GeoLocIq(IqType type) : this() { this.Type = type; } public GeoLocIq(IqType type, Jid to) : this(type) { this.To = to; } public GeoLocIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public new GeoLoc Query { get { return m_GeoLoc; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/geoloc/GeoLoc.cs0000644000175000017500000001240312204443225026227 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.geoloc { /* Element Name Inclusion Datatype Definition alt MAY xs:decimal Altitude in meters above or below sea level bearing MAY xs:decimal GPS bearing (direction in which the entity is heading to reach its next waypoint), measured in decimal degrees relative to true north [2] datum MAY xs:string GPS datum [3] description MAY xs:string A natural-language description of the location error MAY xs:decimal Horizontal GPS error in arc minutes lat MUST xs:decimal Latitude in decimal degrees North lon MUST xs:decimal Longitude in decimal degrees East timestamp MAY xs:datetime UTC timestamp specifying the moment when the reading was taken (MUST conform to the DateTime profile of Jabber Date and Time Profiles [4]) */ /// /// XEP-0080 Geographical Location (GeoLoc) /// This JEP defines a format for capturing data about an entity's geographical location (geoloc). /// The namespace defined herein is intended to provide a semi-structured format for /// describing a geographical location that may change fairly frequently, /// where the geoloc information is provided as Global Positioning System (GPS) coordinates. /// public class GeoLoc : Element { #region << Constructors >> /// /// /// public GeoLoc() { this.TagName = "geoloc"; this.Namespace = Uri.GEOLOC; } /// /// /// /// /// public GeoLoc(double latitude, double longitude) : this() { Latitude = latitude; Longitude = longitude; } #endregion /// /// A natural-language description of the location /// public string Description { get { return GetTag("description"); } set { SetTag("description", value); } } /// /// GPS datum /// public string Datum { get { return GetTag("datum"); } set { SetTag("datum", value); } } /// /// Latitude in decimal degrees North /// public double Latitude { get { return GetTagDouble("lat"); } set { SetTag("lat", value); } } /// /// Longitude in decimal degrees East /// public double Longitude { get { return GetTagDouble("lon"); } set { SetTag("lon", value); } } /// /// Altitude in meters above or below sea level /// public double Altitude { get { return GetTagDouble("alt"); } set { SetTag("alt", value); } } /// /// GPS bearing (direction in which the entity is heading to reach its next waypoint), /// measured in decimal degrees relative to true north /// public double Bearing { get { return GetTagDouble("bearing"); } set { SetTag("bearing", value); } } /// /// Horizontal GPS error in arc minutes /// public double Error { get { return GetTagDouble("error"); } set { SetTag("error", value); } } /// /// UTC timestamp specifying the moment when the reading was taken /// public DateTime Timestamp { get { return Util.Time.ISO_8601Date(GetTag("timestamp")); } set { SetTag("timestamp", Util.Time.ISO_8601Date(value)); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bosh/0000755000175000017500000000000012204443225024213 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bosh/Body.cs0000644000175000017500000001635212204443225025446 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bosh { public class Body : Element { public Body() { this.TagName = "body"; this.Namespace = Uri.HTTP_BIND; } /* POST /webclient HTTP/1.1 Host: httpcm.jabber.org Accept-Encoding: gzip, deflate Content-Type: text/xml; charset=utf-8 Content-Length: 153 HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: 128 */ public string Sid { get { return GetAttribute("sid"); } set { SetAttribute("sid", value); } } public long Rid { get { return GetAttributeLong("rid"); } set { SetAttribute("rid", value); } } public long Ack { get { return GetAttributeLong("ack"); } set { SetAttribute("ack", value); } } public bool Secure { get { return GetAttributeBool("secure"); } set { SetAttribute("secure", value); } } /// /// Specifies the longest time (in seconds) that the connection manager is allowed to wait before responding to any request /// during the session. This enables the client to limit the delay before it discovers any network failure, /// and to prevent its HTTP/TCP connection from expiring due to inactivity. /// public int Wait { get { return GetAttributeInt("wait"); } set { SetAttribute("wait", value); } } /// /// If the connection manager supports session pausing (inactivity) then it SHOULD advertise that to the client by including a 'maxpause' /// attribute in the session creation response element. The value of the attribute indicates the maximum length of a temporary /// session pause (in seconds) that a client MAY request. /// public int MaxPause { get { return GetAttributeInt("maxpause"); } set { SetAttribute("maxpause", value); } } public int Inactivity { get { return GetAttributeInt("inactivity"); } set { SetAttribute("inactivity", value); } } public int Polling { get { return GetAttributeInt("polling"); } set { SetAttribute("polling", value); } } public int Requests { get { return GetAttributeInt("requests"); } set { SetAttribute("requests", value); } } /// /// Specifies the target domain of the first stream. /// public Jid To { get { return GetAttributeJid("to"); } set { SetAttribute("to", value); } } public Jid From { get { return GetAttributeJid("from"); } set { SetAttribute("from", value); } } /// /// specifies the maximum number of requests the connection manager is allowed to keep waiting at any one time during the session. /// If the client is not able to use HTTP Pipelining then this SHOULD be set to "1". /// public int Hold { get { return GetAttributeInt("hold"); } set { SetAttribute("hold", value); } } /// /// /// Specifies the highest version of the BOSH protocol that the client supports. /// The numbering scheme is "." (where the minor number MAY be incremented higher than a single digit, /// so it MUST be treated as a separate integer). /// /// /// The 'ver' attribute should not be confused with the version of any protocol being transported. /// /// public string Version { get { return GetAttribute("ver"); } set { SetAttribute("ver", value); } } public string NewKey { get { return GetAttribute("newkey"); } set { SetAttribute("newkey", value); } } public string Key { get { return GetAttribute("key"); } set { SetAttribute("key", value); } } public BoshType Type { get { return (BoshType) GetAttributeEnum("type", typeof(BoshType)); } set { if (value == BoshType.NONE) RemoveAttribute("type"); else SetAttribute("type", value.ToString()); } } public string XmppVersion { get { return GetAttribute("xmpp:version"); } set { AddBoshNamespace(); SetAttribute("xmpp:version", value); } } public bool XmppRestart { get { return GetAttributeBool("xmpp:restart"); } set { AddBoshNamespace(); SetAttribute("xmpp:restart", value); } } internal void AddBoshNamespace() { this.SetAttribute("xmlns:xmpp", "urn:xmpp:xbosh"); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bosh/BoshType.cs0000644000175000017500000000232212204443225026276 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.protocol.extensions.bosh { public enum BoshType { NONE = -1, error, terminate } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/0000755000175000017500000000000012204443225025423 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/Paused.cs0000644000175000017500000000325512204443225027200 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.chatstates { /// /// User had been composing but now has stopped. /// User was composing but has not interacted with the message input interface for a short period of time (e.g., 5 seconds). /// public class Paused : Element { /// /// Initializes a new instance of the class. /// public Paused() { TagName = Chatstate.paused.ToString(); Namespace = Uri.CHATSTATES; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/Active.cs0000644000175000017500000000334012204443225027165 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.chatstates { /// /// User is actively participating in the chat session. /// User accepts an initial content message, sends a content message, /// gives focus to the chat interface, or is otherwise paying attention to the conversation. /// public class Active : Element { /// /// Initializes a new instance of the class. /// public Active() { TagName = Chatstate.active.ToString(); Namespace = Uri.CHATSTATES; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/Chatstate.cs0000644000175000017500000000354012204443225027674 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.extensions.chatstates { /// /// Enumeration of supported Chatstates (JEP-0085) /// public enum Chatstate { /// /// No Chatstate at all /// None, /// /// Active Chatstate /// active, /// /// Inactive Chatstate /// inactive, /// /// Composing Chatstate /// composing, /// /// Gone Chatstate /// gone, /// /// Paused Chatstate /// paused } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/Gone.cs0000644000175000017500000000342112204443225026642 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.chatstates { /// /// User has effectively ended their participation in the chat session. /// User has not interacted with the chat interface, system, or device for a relatively long period of time /// (e.g., 2 minutes), or has terminated the chat interface (e.g., by closing the chat window). /// public class Gone : Element { /// /// Initializes a new instance of the class. /// public Gone() { TagName = Chatstate.gone.ToString(); Namespace = Uri.CHATSTATES; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/Inactive.cs0000644000175000017500000000326412204443225027521 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.chatstates { /// /// User has not been actively participating in the chat session. /// User has not interacted with the chat interface for an intermediate period of time (e.g., 30 seconds). /// public class Inactive : Element { /// /// Initializes a new instance of the class. /// public Inactive() { TagName = Chatstate.inactive.ToString(); Namespace = Uri.CHATSTATES; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/chatstates/Composing.cs0000644000175000017500000000330112204443225027705 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.chatstates { /// /// User is composing a message. /// User is interacting with a message input interface specific to this chat session /// (e.g., by typing in the input area of a chat window). /// public class Composing : Element { /// /// Initializes a new instance of the class. /// public Composing() { TagName = Chatstate.composing.ToString(); Namespace = Uri.CHATSTATES; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/shim/0000755000175000017500000000000012204443225024220 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/shim/Header.cs0000644000175000017500000000353012204443225025740 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.shim { /// /// JEP-0131: Stanza Headers and Internet Metadata (SHIM) /// public class Header : Element { // //
123456789@capulet.com
//
shakespeare,<xmpp/>
//
#region << Constructors >> public Header() { this.TagName = "header"; this.Namespace = Uri.SHIM; } public Header(string name, string val) : this() { this.Name = name; this.Value = val; } #endregion public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/shim/Headers.cs0000644000175000017500000000607012204443225026125 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.shim { /// /// JEP-0131: Stanza Headers and Internet Metadata (SHIM) /// public class Headers : Element { // //
123456789@capulet.com
//
shakespeare,<xmpp/>
//
public Headers() { this.TagName = "headers"; this.Namespace = Uri.SHIM; } /// /// Adds a new Header /// /// public Header AddHeader() { Header h = new Header(); AddChild(h); return h; } /// /// Adds the given Header /// /// /// returns the given Header public Header AddHeader(Header header) { AddChild(header); return header; } /// /// Adds a new Header /// /// header name /// header value /// returns the new added header public Header AddHeader(string name, string val) { Header header = new Header(name, val); AddChild(header); return header; } public void SetHeader(string name, string val) { Header header = GetHeader(name); if (header != null) header.Value = val; else AddHeader(name, val); } /// /// /// /// public Header GetHeader(string name) { return (Header) SelectSingleElement("header", "name", name); } public Header[] GetHeaders() { ElementList nl = SelectElements("header"); Header[] headers = new Header[nl.Count]; int i = 0; foreach (Element e in nl) { headers[i] = (Header) e; i++; } return headers; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/html/0000755000175000017500000000000012204443225024224 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/html/Body.cs0000644000175000017500000000357312204443225025460 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.html { /// /// The Body Element of a XHTML message /// public class Body : Element { public Body() { this.TagName = "body"; this.Namespace = Uri.XHTML; } /// /// /// public string InnerHtml { get { // Thats a HACK string xml = this.ToString(); int start = xml.IndexOf(">"); int end = xml.LastIndexOf(""); return xml.Substring(start + 1, end - start -1); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/html/Html.cs0000644000175000017500000000423012204443225025456 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.html { /* * * hi! * * *

hi!

* * *
*/ public class Html : Element { public Html() { this.TagName = "html"; this.Namespace = Uri.XHTML_IM; } /// /// The Body Element of the XHTML Message /// public Body Body { get { return SelectSingleElement(typeof(Body)) as Body; } set { if (HasTag(typeof(Body))) RemoveTag(typeof(Body)); if (value != null) this.AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/0000755000175000017500000000000012204443225025770 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/phone/0000755000175000017500000000000012204443225027101 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/phone/PhoneStatusType.cs0000644000175000017500000000313012204443225032544 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.extensions.jivesoftware.phone { /// /// Events are sent to the user when their phone is ringing, /// when a call ends, etc. As with presence, /// pubsub should probably be the mechanism used for sending this information, /// but message packets are used to send events for the time being /// public enum PhoneStatusType { RING, DIALED, ON_PHONE, HANG_UP } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/phone/PhoneEvent.cs0000644000175000017500000000671112204443225031510 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.jivesoftware.phone { /* * * * * * * * * */ /// /// Events are sent to the user when their phone is ringing, when a call ends, etc. /// This packet is send within a message packet (subelement of message) /// public class PhoneEvent : Element { #region << Constructors >> public PhoneEvent() { this.TagName = "phone-event"; this.Namespace = Uri.JIVESOFTWARE_PHONE; } public PhoneEvent(PhoneStatusType status) : this() { Type = status; } public PhoneEvent(PhoneStatusType status, string device) : this(status) { Device = device; } public PhoneEvent(PhoneStatusType status, string device, string id) : this(status, device) { CallId = id; } public PhoneEvent(PhoneStatusType status, string device, string id, string callerId): this(status, device, id) { CallerId = callerId; } #endregion public string CallId { get { return GetAttribute("callID"); } set { SetAttribute("callID", value); } } public string Device { get { return GetAttribute("device"); } set { SetAttribute("device", value); } } public PhoneStatusType Type { set { SetAttribute("type", value.ToString()); } get { return (PhoneStatusType)GetAttributeEnum("type", typeof(PhoneStatusType)); } } public string CallerId { get { return GetTag("callerID"); } set { SetTag("callerID", value); } } public string CallerIdName { get { return GetTag("callerIDName"); } set { SetTag("callerIDName", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/phone/ActionType.cs0000644000175000017500000000273312204443225031514 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; namespace agsXMPP.protocol.extensions.jivesoftware.phone { /// /// Action type, Currently supported types are DIAL and FORWARD /// public enum ActionType { /// /// /// DIAL, /// /// /// FORWARD } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/phone/PhoneStatus.cs0000644000175000017500000000513512204443225031711 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.jivesoftware.phone { /// /// A user's presence is updated when on a phone call. /// The Jive Messenger/Asterisk implementation will update the user's presence automatically /// by adding the following packet extension to the user's presence: /// <phone-status xmlns="http://jivesoftware.com/xmlns/phone" status="ON_PHONE" > /// Jive Messenger can also be configured to change the user's availability /// to "Away -- on the phone" when the user is on a call (in addition to the packet extension). /// This is useful when interacting with clients that don't understand the extended presence information /// or when using transports to other IM networks where extended presence information is not available. /// public class PhoneStatus : Element { /* * ; * */ public PhoneStatus() { this.TagName = "phone-status"; this.Namespace = Uri.JIVESOFTWARE_PHONE; } public PhoneStatusType Status { set { SetAttribute("status", value.ToString()); } get { return (PhoneStatusType)GetAttributeEnum("status", typeof(PhoneStatusType)); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/jivesoftware/phone/PhoneAction.cs0000644000175000017500000000733712204443225031651 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.jivesoftware.phone { public class PhoneAction : Element { /* * Actions are sent by the client to perform tasks such as dialing, checking for messages, etc. Actions are sent as IQ's (type set), as with the following child stanza: * * * 5035555555 * * * Currently supported types are DIAL and FORWARD. * In most implementations, issuing a dial command will cause the user's phone to ring. * Once the user picks up, the specified extension will be dialed. * * Dialing can also be performed by jid too. The jid must be dialed must be mapped on the server to an extension * * * andrew@jivesoftware.com * * * Issuing a action wth a type FORWARD should transfer a call that has already been * established to a third party. The FORWARD type requires an extension or jid child element * * * 5035555555 * * */ #region << Constructors >> /// /// /// public PhoneAction() { this.TagName = "phone-action"; this.Namespace = Uri.JIVESOFTWARE_PHONE; } public PhoneAction(ActionType type) : this() { Type = type; } public PhoneAction(ActionType type, string extension) : this(type) { Extension = extension; } public PhoneAction(ActionType type, Jid jid) : this(type) { Jid = jid; } #endregion public ActionType Type { set { SetAttribute("type", value.ToString()); } get { return (ActionType)GetAttributeEnum("type", typeof(ActionType)); } } public string Extension { get { return GetTag("extension"); } set { SetTag("extension", value); } } public Jid Jid { get { return new Jid(GetTag("jid")); } set { SetTag("jid", value.ToString()); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/caps/0000755000175000017500000000000012204443225024206 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/caps/Capabilities.cs0000644000175000017500000002230512204443225027130 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; using System.Text; using agsXMPP.protocol.iq.disco; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.caps { /* Example 1. Annotated presence sent Example 2. Annotated presence sent, with feature extensions */ /// /// /// It is often desirable for a Jabber/XMPP application (commonly but not necessarily a client) to take different actions /// depending on the capabilities of another application from which it receives presence information. Examples include: /// /// /// /// Showing a different set of icons depending on the capabilities of other clients. /// /// /// Not sending XHTML-IM content to plaintext clients such as cell phones. /// /// /// Allowing the initiation of Voice over IP (VoIP) sessions only to clients that support VoIP. /// /// /// Not showing a "Send a File" button if another user's client does not support File Transfer. /// /// /// /// Recently, some existing Jabber clients have begun sending Software Version requests to each entity from which they /// receive presence. That solution is impractical on a larger scale, particularly for users or applications with large rosters. /// This document proposes a more robust and scalable solution: namely, a presence-based mechanism for exchanging information /// about entity capabilities. /// /// public class Capabilities : Element { /// /// /// public Capabilities() { this.TagName = "c"; this.Namespace = Uri.CAPS; } /// /// /// /// /// public Capabilities(string version, string node) : this() { Version = version; Node = node; } /// /// Required node attribute /// public string Node { get { return GetAttribute("node"); } set { SetAttribute("node", value); } } /// /// Required version attribute /// public string Version { get { return GetAttribute("ver"); } set { SetAttribute("ver", value); } } /// /// Required Hash-Type. /// public string Hash { get { return GetAttribute("hash"); } set { SetAttribute("hash", value); } } [Obsolete("This property is deprecated with version 1.4 of XEP-0115. You shouldn't use this propety anymore.")] public string[] Extensions { get { string ext = GetAttribute("ext"); if (ext != null) { string[] ret = ext.Split(' '); return ret; } else { return null; } } set { if (value != null) { string temp = null; for (int i = 0; i < value.Length; i++) { temp += value[i]; if (i < value.Length - 1) temp += " "; } SetAttribute("ext", temp); } } } /// /// Builds and sets the caps ver attribute from a DiscoInfo object /// /// public void SetVersion(DiscoInfo di) { Hash = "sha-1"; Version = BuildCapsVersion(di); } private string BuildCapsVersion(DiscoInfo di) { /* 1. Initialize an empty string S. 2. Sort the service discovery identities by category and then by type (if it exists), formatted as 'category' '/' 'type'. 3. For each identity, append the 'category/type' to S, followed by the '<' character. 4. Sort the supported features. 5. For each feature, append the feature to S, followed by the '<' character. 6. Compute ver by hashing S using the SHA-1 algorithm as specified in RFC 3174 [17] (with binary output) and encoding the hash using Base64 as specified in Section 4 of RFC 4648 [18] (note: the Base64 output MUST NOT include whitespace and MUST set padding bits to zero). [19] */ ArrayList features = new ArrayList(); ArrayList identities = new ArrayList(); foreach (DiscoIdentity did in di.GetIdentities()) identities.Add(did.Type == null ? did.Category : did.Category + "/" + did.Type); foreach (DiscoFeature df in di.GetFeatures()) features.Add(df.Var); identities.Sort(); features.Sort(); StringBuilder S = new StringBuilder(); foreach (string s in identities) S.Append(s + "<"); foreach (string s in features) S.Append(s + "<"); byte[] sha1 = Util.Hash.Sha1HashBytes(S.ToString()); #if CF return Convert.ToBase64String(sha1, 0, sha1.Length); #else return Convert.ToBase64String(sha1); #endif } #region << Extension Helpers >> public void AddExtension(string ext) { string[] extensions = this.Extensions; // check if the extension already exists if (extensions != null && Array.IndexOf(extensions, ext, extensions.GetLowerBound(0), extensions.Length) >= 0) return; int size = extensions == null ? 1 : extensions.Length + 1; string[] tmpExtensions = new string[size]; if (size > 1) extensions.CopyTo(tmpExtensions, 0); tmpExtensions[size - 1] = ext; this.Extensions = tmpExtensions; } public void RemoveExtension(string ext) { string[] extensions = this.Extensions; if (extensions != null) { if (Array.IndexOf(extensions, ext, extensions.GetLowerBound(0), extensions.Length) >= 0) { int i = 0; string[] tmpExtensions = new string[extensions.Length -1]; foreach (string s in extensions) { if (s != ext) tmpExtensions[i++] = s; } this.Extensions = tmpExtensions; } } } public bool ContainsExtension(string ext) { string[] extensions = this.Extensions; if (extensions == null) return false; if (Array.IndexOf(extensions, ext, extensions.GetLowerBound(0), extensions.Length) >= 0) return true; else return false; } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/compression/0000755000175000017500000000000012204443225025621 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/compression/Compressed.cs0000644000175000017500000000304312204443225030254 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.compression { /* * Example 5. Receiving Entity Acknowledges Stream Compression * */ public class Compressed : Element { public Compressed() { this.TagName = "compressed"; this.Namespace = Uri.COMPRESS; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/compression/Failure.cs0000644000175000017500000000451312204443225027542 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.compression { /* * * Note: If the initiating entity did not understand any of the advertised compression methods, * it SHOULD ignore the compression option and proceed as if no compression methods were advertised. * * If the initiating entity requests a stream compression method that is not supported by the * receiving entity, the receiving entity MUST return an error: * * Example 3. Receiving Entity Reports That Method is Unsupported * * * * * If the receiving entity cannot establish compression using the requested method for any * other reason, it MUST return a error: * * Example 4. Receiving Entity Reports That Compression Setup Failed * * * */ public class Failure : Element { public Failure() { this.TagName = "failure"; this.Namespace = Uri.COMPRESS; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/compression/Compress.cs0000644000175000017500000000451412204443225027747 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.compression { // // zlib // public class Compress : Element { #region << Constructors >> public Compress() { this.TagName = "compress"; this.Namespace = Uri.COMPRESS; } /// /// Constructor with a given method/algorithm for Stream compression /// /// method/algorithm used to compressing the stream public Compress(CompressionMethod method) : this() { this.Method = method; } #endregion /// /// method/algorithm used to compressing the stream /// public CompressionMethod Method { set { if (value != CompressionMethod.Unknown) SetTag("method", value.ToString()); } get { return (CompressionMethod) GetTagEnum("method", typeof(CompressionMethod)); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/compression/CompressionMethod.cs0000644000175000017500000000236112204443225031614 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.compression { public enum CompressionMethod { Unknown = -1, zlib, lzw } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/0000755000175000017500000000000012250206660025251 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/Conference.cs0000644000175000017500000000772112204443225027655 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bookmarks { /// /// One of the most common uses of bookmarks will likely be to bookmark /// conference rooms on various Jabber servers /// public class Conference : Element { /* Puck titania */ public Conference() { this.TagName = "conference"; this.Namespace = Uri.STORAGE_BOOKMARKS; } public Conference(Jid jid, string name) : this() { Jid = jid; Name = name; } public Conference(Jid jid, string name, string nickname) : this( jid, name) { Nickname = nickname; } public Conference(Jid jid, string name, string nickname, string password) : this(jid, name, nickname) { Password = password; } public Conference(Jid jid, string name, string nickname, string password, bool autojoin) : this(jid, name, nickname, password) { AutoJoin = autojoin; } /// /// A name/description for this bookmarked room /// public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } /// /// Should the client join this room automatically after successfuil login? /// public bool AutoJoin { get { return GetAttributeBool("autojoin"); } set { SetAttribute("autojoin", value); } } /// /// The Jid of the bookmarked room /// public Jid Jid { get { return GetAttributeJid("jid"); } set { SetAttribute("jid", value); } } /// /// The Nickname for this room /// public string Nickname { get { return GetTag("nick"); } set { SetTag("nick", value); } } /// /// The password for password protected rooms /// public string Password { get { return GetTag("password"); } set { SetTag("password", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/RosterNote.cs0000644000175000017500000000644112204443225027710 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bookmarks { /// /// Annotations are stored using server-side private XML storage. /// A storage element contains a collection of one or more notes elements, /// each representing a note about a given entity. /// public class RosterNote : Element { /* Seems to be a good writer Oh my sweetest love ... */ public RosterNote() { TagName = "note"; Namespace = Uri.STORAGE_ROSTERNOTES; } public RosterNote(Jid jid, DateTime cdate, DateTime mdate, string note) : this() { Jid = jid; CreationDate = cdate; ModificationDate = mdate; Value = note; } /// /// Creation date time /// public DateTime CreationDate { get { return Util.Time.ISO_8601Date(GetAttribute("cdate")); } set { SetAttribute("cdate", Util.Time.ISO_8601Date(value)); } } /// /// Modification date tiime /// public DateTime ModificationDate { get { return Util.Time.ISO_8601Date(GetAttribute("mdate")); } set { SetAttribute("mdate", Util.Time.ISO_8601Date(value)); } } /// /// The Jid of the bookmarked room /// public Jid Jid { get { return GetAttributeJid("jid"); } set { SetAttribute("jid", value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/StorageIq.cs0000644000175000017500000000331712204443225027501 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; using agsXMPP.protocol.client; using agsXMPP.protocol.iq.@private; namespace agsXMPP.protocol.extensions.bookmarks { /// /// /// public class StorageIq : PrivateIq { public StorageIq() { this.Query.AddChild(new Storage()); } public StorageIq(IqType type) : this() { this.Type = type; } public StorageIq(IqType type, Jid to) : this(type) { this.To = to; } public StorageIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/BookmarkManager.cs0000644000175000017500000001107112250206660030640 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.bookmarks { public class BookmarkManager { private XmppClientConnection m_connection = null; public BookmarkManager(XmppClientConnection con) { m_connection = con; } #region << Request Bookmarks >> /// /// Request the bookmarks from the storage on the server /// public void RequestBookmarks() { RequestBookmarks(null); } /// /// Request the bookmarks from the storage on the server /// /// /// public void RequestBookmarks(IqHandler cb) { StorageIq siq = new StorageIq(IqType.get); if (cb == null) m_connection.Send(siq); else m_connection.IqGrabber.SendIq(siq, cb); } #endregion #region << Store Bookmarks >> /// /// Send booksmarks to the server storage /// /// public void StoreBookmarks(Url[] urls) { StoreBookmarks(urls, null, null); } /// /// Send booksmarks to the server storage /// /// /// /// public void StoreBookmarks(Url[] urls, IqHandler cb) { StoreBookmarks(urls, null, cb); } /// /// Send booksmarks to the server storage /// /// public void StoreBookmarks(Conference[] conferences) { StoreBookmarks(null, conferences, null); } /// /// Send booksmarks to the server storage /// /// /// /// public void StoreBookmarks(Conference[] conferences, IqHandler cb) { StoreBookmarks(null, conferences, cb); } /// /// Send booksmarks to the server storage /// /// /// public void StoreBookmarks(Url[] urls, Conference[] conferences) { StoreBookmarks(urls, conferences, null); } /// /// Send booksmarks to the server storage /// /// /// /// /// public void StoreBookmarks(Url[] urls, Conference[] conferences, IqHandler cb) { StorageIq siq = new StorageIq(IqType.set); if (urls != null) siq.Query.Storage.AddUrls(urls); if (conferences != null) siq.Query.Storage.AddConferences(conferences); if (cb == null) m_connection.Send(siq); else m_connection.IqGrabber.SendIq(siq, cb); } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/Url.cs0000644000175000017500000000447112204443225026347 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bookmarks { /// /// URLs are fairly simple, as they only need to store a URL and a title, /// and the client then can simply launch the appropriate browser. /// public class Url : Element { /* */ public Url() { this.TagName = "url"; this.Namespace = Uri.STORAGE_BOOKMARKS; } public Url(string address, string name) : this() { Address = address; Name = name; } /// /// A description/name for this bookmark /// public string Name { get { return GetAttribute("name"); } set { SetAttribute("name", value); } } /// /// The url address to store e.g. http://www.ag-software,de/ /// public string Address { get { return GetAttribute("url"); } set { SetAttribute("url", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/Storage.cs0000644000175000017500000001401312204443225027202 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bookmarks { /// /// /// public class Storage : Element { /* Puck titania */ public Storage() { TagName = "storage"; Namespace = Uri.STORAGE_BOOKMARKS; } /// /// Add a conference bookmark to the storage object /// /// /// public Conference AddConference(Conference conf) { AddChild(conf); return conf; } /// /// Add a conference bookmark to the storage object /// /// /// /// public Conference AddConference(Jid jid, string name) { return AddConference(new Conference(jid, name)); } /// /// Add a conference bookmark to the storage object /// /// /// /// /// public Conference AddConference(Jid jid, string name, string nickname) { return AddConference(new Conference(jid, name, nickname)); } /// /// Add a conference bookmark to the storage object /// /// /// /// /// /// public Conference AddConference(Jid jid, string name, string nickname, string password) { return AddConference(new Conference(jid, name, nickname, password)); } /// /// /// /// /// /// /// /// /// public Conference AddConference(Jid jid, string name, string nickname, string password, bool autojoin) { return AddConference(new Conference(jid, name, nickname, password, autojoin)); } /// /// add multiple conference bookmarks /// /// public void AddConferences(Conference[] confs) { foreach (Conference conf in confs) { AddConference(conf); } } /// /// get all conference booksmarks /// /// public Conference[] GetConferences() { ElementList nl = SelectElements(typeof(Conference)); Conference[] items = new Conference[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Conference)e; i++; } return items; } /// /// add a url bookmark /// /// /// public Url AddUrl(Url url) { AddChild(url); return url; } public Url AddUrl(string address, string name) { return AddUrl(new Url(address, name)); } /// /// add multiple url bookmarks /// /// public void AddUrls(Url[] urls) { foreach (Url url in urls) { AddUrl(url); } } /// /// Get all url bookmarks /// /// public Url[] GetUrls() { ElementList nl = SelectElements(typeof(Url)); Url[] items = new Url[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (Url) e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bookmarks/RosterNotes.cs0000644000175000017500000000645312204443225030076 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bookmarks { /// /// /// public class RosterNotes : Element { /* Seems to be a good writer Oh my sweetest love ... */ public RosterNotes() { TagName = "storage"; Namespace = Uri.STORAGE_ROSTERNOTES; } /// /// Add a note to the storage object /// /// The note. /// public RosterNote AddNote(RosterNote note) { AddChild(note); return note; } /// /// Add a note to the storage object /// /// /// /// /// /// public RosterNote AddNote(Jid jid, DateTime cdate, DateTime mdate, string note) { return AddNote(new RosterNote(jid, cdate, mdate, note)); } /// /// get all roster notes /// /// public RosterNote[] GetRosterNotes() { ElementList nl = SelectElements(typeof(RosterNote)); RosterNote[] items = new RosterNote[nl.Count]; int i = 0; foreach (Element e in nl) { items[i] = (RosterNote)e; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/featureneg/0000755000175000017500000000000012204443225025405 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/featureneg/FeatureNegIq.cs0000644000175000017500000000470412204443225030260 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.featureneg { /// /// JEP-0020: Feature Negotiation /// This JEP defines a A protocol that enables two Jabber entities to mutually negotiate feature options. /// public class FeatureNegIq : IQ { /* */ private FeatureNeg m_FeatureNeg = new FeatureNeg(); public FeatureNegIq() { this.AddChild(m_FeatureNeg); this.GenerateId(); } public FeatureNegIq(IqType type) : this() { this.Type = type; } public FeatureNeg FeatureNeg { get { return m_FeatureNeg; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/featureneg/FeatureNeg.cs0000644000175000017500000000540112204443225027761 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.x.data; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.featureneg { /// /// JEP-0020: Feature Negotiation /// This JEP defines a A protocol that enables two Jabber entities to mutually negotiate feature options. /// public class FeatureNeg : Element { /* */ public FeatureNeg() { this.TagName = "feature"; this.Namespace = Uri.FEATURE_NEG; } /// /// data form of type "form" which defines the available options for one or more features. /// Each feature is represented as an x-data "field", which MUST be of type "list-single". /// public Data Data { get { Element data = SelectSingleElement(typeof(Data)); if (data!=null) return data as Data; else return null; } set { if (HasTag(typeof(Data))) RemoveTag(typeof(Data)); AddChild(value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/0000755000175000017500000000000012204443225025622 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/ByteStreamIq.cs0000644000175000017500000000420612204443225030524 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.protocol.client; namespace agsXMPP.protocol.extensions.bytestreams { /// /// a Bytestream IQ /// public class ByteStreamIq : IQ { private ByteStream m_ByteStream = new ByteStream(); public ByteStreamIq() { base.Query = m_ByteStream; this.GenerateId(); } public ByteStreamIq(IqType type) : this() { this.Type = type; } public ByteStreamIq(IqType type, Jid to) : this(type) { this.To = to; } public ByteStreamIq(IqType type, Jid to, Jid from) : this(type, to) { this.From = from; } public ByteStreamIq(IqType type, Jid to, Jid from, string Id) : this(type, to, from) { this.Id = Id; } public new ByteStream Query { get { return m_ByteStream; } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/UdpSuccess.cs0000644000175000017500000000354312204443225030237 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bytestreams { /* */ public class UdpSuccess : Element { public UdpSuccess(string dstaddr) { this.TagName = "udpsuccess"; this.Namespace = Uri.BYTESTREAMS; DestinationAddress = dstaddr; } public string DestinationAddress { get { return GetAttribute("dstaddr"); } set { SetAttribute("dstaddr", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/ByteStream.cs0000644000175000017500000001454712204443225030243 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bytestreams { /* target@host2/bar */ /// /// ByteStreams /// public class ByteStream : Element { public ByteStream() { this.TagName = "query"; this.Namespace = Uri.BYTESTREAMS; } public string Sid { set { SetAttribute("sid", value); } get { return GetAttribute("sid"); } } public Mode Mode { get { return (Mode) GetAttributeEnum("mode", typeof(Mode)); } set { if (value != Mode.NONE) SetAttribute("mode", value.ToString()); else RemoveAttribute("mode"); } } /// /// Add a StreamHost /// /// public StreamHost AddStreamHost() { StreamHost sh = new StreamHost(); AddChild(sh); return sh; } /// /// Add a StreamHost /// /// /// public StreamHost AddStreamHost(StreamHost sh) { AddChild(sh); return sh; } /// /// Add a StreamHost /// /// /// /// public StreamHost AddStreamHost(Jid jid, string host) { StreamHost sh = new StreamHost(jid, host); AddChild(sh); return sh; } /// /// Add a StreamHost /// /// /// /// /// public StreamHost AddStreamHost(Jid jid, string host, int port) { StreamHost sh = new StreamHost(jid, host, port); AddChild(sh); return sh; } /// /// Add a StreamHost /// /// /// /// /// /// public StreamHost AddStreamHost(Jid jid, string host, int port, string zeroconf) { StreamHost sh = new StreamHost(jid, host, port, zeroconf); AddChild(sh); return sh; } /// /// Get the list of streamhosts /// /// public StreamHost[] GetStreamHosts() { ElementList nl = SelectElements(typeof(StreamHost)); StreamHost[] hosts = new StreamHost[nl.Count]; int i = 0; foreach (Element e in nl) { hosts[i] = (StreamHost) e; i++; } return hosts; } /// /// The activate Element /// public Activate Activate { get { return SelectSingleElement(typeof(Activate)) as Activate; } set { if (HasTag(typeof(Activate))) RemoveTag(typeof(Activate)); if (value != null) this.AddChild(value); } } public StreamHostUsed StreamHostUsed { get { return SelectSingleElement(typeof(StreamHostUsed)) as StreamHostUsed; } set { if (HasTag(typeof(StreamHostUsed))) RemoveTag(typeof(StreamHostUsed)); if (value != null) this.AddChild(value); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/Mode.cs0000644000175000017500000000250612204443225027040 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.protocol.extensions.bytestreams { /// /// The Mode for the bytestream socket layer (tcp or udp) /// public enum Mode { NONE = -1, tcp, udp } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/Activate.cs0000644000175000017500000000373012204443225027714 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bytestreams { public class Activate : Element { public Activate() { this.TagName = "activate"; this.Namespace = Uri.BYTESTREAMS; } public Activate(Jid jid) : this() { Jid = jid; } /// /// the full JID of the Target to activate /// public Jid Jid { get { if (Value == null) return null; else return new Jid(Value); } set { if (value != null) Value = value.ToString(); else Value = null; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/StreamHost.cs0000644000175000017500000001005612204443225030244 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bytestreams { /* */ public class StreamHost : Element { public StreamHost() { this.TagName = "streamhost"; this.Namespace = Uri.BYTESTREAMS; } public StreamHost(Jid jid, string host) : this() { Jid = jid; Host = host; } public StreamHost(Jid jid, string host, int port) : this(jid, host) { Port = port; } public StreamHost(Jid jid, string host, int port, string zeroconf) : this(jid, host, port) { Zeroconf = zeroconf; } /// /// a port associated with the hostname or IP address for SOCKS5 communications over TCP /// public int Port { get { return GetAttributeInt("port"); } set { SetAttribute("port", value); } } /// /// the hostname or IP address of the StreamHost for SOCKS5 communications over TCP /// public string Host { get { return GetAttribute("host"); } set { SetAttribute("host", value); } } /// /// The XMPP/Jabber id of the streamhost /// public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value != null) this.SetAttribute("jid", value.ToString()); else RemoveAttribute("jid"); } } /// /// a zeroconf [5] identifier to which an entity may connect, for which the service identifier and /// protocol name SHOULD be "_jabber.bytestreams". /// public string Zeroconf { get { return GetAttribute("zeroconf"); } set { SetAttribute("zeroconf", value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/extensions/bytestreams/StreamHostUsed.cs0000644000175000017500000000521712204443225031070 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; namespace agsXMPP.protocol.extensions.bytestreams { /* */ /// /// The element indicates the StreamHost connected to. /// This element has a single attribute for the JID of the StreamHost to which the Target connected. /// This element MUST NOT contain any content node. /// The "jid" attribute specifies the full JID of the StreamHost. /// This attribute MUST be present, and MUST be a valid JID for use with an <iq/>. /// public class StreamHostUsed : Element { public StreamHostUsed() { this.TagName = "streamhost-used"; this.Namespace = Uri.BYTESTREAMS; } public StreamHostUsed(Jid jid) : this() { Jid = jid; } /// /// Jid of the streamhost /// public Jid Jid { get { if (HasAttribute("jid")) return new Jid(this.GetAttribute("jid")); else return null; } set { if (value!=null) this.SetAttribute("jid", value.ToString()); else RemoveAttribute("jid"); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/0000755000175000017500000000000012204443225022354 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/Features.cs0000644000175000017500000001342312204443225024464 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; using agsXMPP.protocol.tls; using agsXMPP.protocol.client; using agsXMPP.protocol.iq.bind; using agsXMPP.protocol.stream.feature; using agsXMPP.protocol.stream.feature.compression; using agsXMPP.protocol.extensions.caps; // // // // DIGEST-MD5 // PLAIN // // // // // // // // DIGEST-MD5 // PLAIN // // namespace agsXMPP.protocol.stream { /// /// Summary description for Features. /// public class Features : Element { public Features() { this.TagName = "features"; this.Namespace = Uri.STREAM; } public StartTls StartTls { get { return SelectSingleElement(typeof(StartTls)) as StartTls; } set { if (HasTag(typeof(StartTls))) RemoveTag(typeof(StartTls)); if (value != null) this.AddChild(value); } } public Bind Bind { get { return SelectSingleElement(typeof(Bind)) as Bind; } set { if(HasTag(typeof(Bind))) RemoveTag(typeof(Bind)); if (value != null) this.AddChild(value); } } // // // zlib // // // // // PLAIN // DIGEST-MD5 // ANONYMOUS // // public Compression Compression { get { return SelectSingleElement(typeof(Compression)) as Compression; } set { if (HasTag(typeof(Compression))) RemoveTag(typeof(Compression)); if (value != null) this.AddChild(value); } } public Register Register { get { return SelectSingleElement(typeof(Register)) as Register; } set { if (HasTag(typeof(Register))) RemoveTag(typeof(Register)); if (value != null) this.AddChild(value); } } public sasl.Mechanisms Mechanisms { get { return SelectSingleElement(typeof(sasl.Mechanisms)) as sasl.Mechanisms; } set { if (HasTag(typeof(sasl.Mechanisms))) RemoveTag(typeof(sasl.Mechanisms)); if (value != null) this.AddChild(value); } } public bool SupportsBind { get { return Bind!=null ? true : false; } } public bool SupportsStartTls { get { return StartTls!=null ? true : false; } } /// /// Is Stream Compression supported? /// public bool SupportsCompression { get { return Compression != null ? true : false; } } /// /// Is Registration supported? /// public bool SupportsRegistration { get { return Register != null ? true : false; } } public Capabilities Capabilities { get { return SelectSingleElement(); } set { RemoveTag(); if (value != null) AddChild(value); } } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/feature/0000755000175000017500000000000012204443225024007 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/feature/Register.cs0000644000175000017500000000310212204443225026116 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using agsXMPP.Xml.Dom; // // //... // //... namespace agsXMPP.protocol.stream.feature { /// /// /// public class Register : Element { public Register() { this.TagName = "register"; this.Namespace = Uri.FEATURE_IQ_REGISTER; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/feature/compression/0000755000175000017500000000000012204443225026350 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/feature/compression/Method.cs0000644000175000017500000000474512204443225030131 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; using agsXMPP.protocol.extensions.compression; namespace agsXMPP.protocol.stream.feature.compression { public class Method : Element { /* * * zlib * * * * * * zlib * lzw * * */ #region << Constructors >> public Method() { this.TagName = "method"; this.Namespace = Uri.FEATURE_COMPRESS; } public Method(CompressionMethod method) : this() { this.Value = method.ToString(); } #endregion public CompressionMethod CompressionMethod { get { #if CF return (CompressionMethod) util.Enum.Parse(typeof(CompressionMethod), this.Value, true); #else return (CompressionMethod) Enum.Parse(typeof(CompressionMethod), this.Value, true); #endif } set { this.Value = value.ToString(); } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/protocol/stream/feature/compression/Compression.cs0000644000175000017500000000707712204443225031213 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Text; using agsXMPP.Xml.Dom; using agsXMPP.protocol.extensions.compression; namespace agsXMPP.protocol.stream.feature.compression { public class Compression : Element { /* * * zlib * * * * * * zlib * lzw * * */ public Compression() { this.TagName = "compression"; this.Namespace = Uri.FEATURE_COMPRESS; } /// /// method/algorithm used to compressing the stream /// public CompressionMethod Method { set { if (value != CompressionMethod.Unknown) SetTag("method", value.ToString()); } get { return (CompressionMethod) GetTagEnum("method", typeof(CompressionMethod)); } } /// /// Add a compression method/algorithm /// /// public void AddMethod(CompressionMethod method) { if (!SupportsMethod(method)) AddChild(new Method(method)); } /// /// Is the given compression method/algrithm supported? /// /// /// public bool SupportsMethod(CompressionMethod method) { ElementList nList = SelectElements(typeof(Method)); foreach (Method m in nList) { if (m.CompressionMethod == method) return true; } return false; } public Method[] GetMethods() { ElementList methods = SelectElements(typeof(Method)); Method[] items = new Method[methods.Count]; int i = 0; foreach (Method m in methods) { items[i] = m; i++; } return items; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/crypto.xml0000644000175000017500000326451512204443225021302 0ustar00meebeymeebey00000000000000 crypto class for dealing with X509 certificates.

At the moment this will deal with "-----BEGIN CERTIFICATE-----" to "-----END CERTIFICATE-----" base 64 encoded certs, as well as the BER binaries of certificates and some classes of PKCS#7 objects.

Create loading data from byte array. Create loading data from byte array. Generates a certificate object and initializes it with the data read from the input stream inStream. Returns a (possibly empty) collection view of the certificates read from the given input stream inStream. Carrying class for an attribute certificate issuer. Set the issuer directly with the ASN.1 structure. @param issuer The issuer Return any principal objects inside the attribute certificate issuer object. An array of IPrincipal objects (usually X509Principal). Base class for an RFC 3161 Time Stamp Request. Get all critical extension values, by oid IDictionary with string (OID) keys and Asn1OctetString values Get all non-critical extension values, by oid IDictionary with string (OID) keys and Asn1OctetString values Get non critical extensions. A set of non critical extension oids. Get any critical extensions. A sorted list of critical entension. Get the value of a given extension. The object ID of the extension. An Asn1OctetString object if that extension is found or null if not. Create a TimeStampRequest from the past in byte array. @param req byte array containing the request. @throws IOException if the request is malformed. Create a TimeStampRequest from the past in input stream. @param in input stream containing the request. @throws IOException if the request is malformed. Validate the timestamp request, checking the digest to see if it is of an accepted type and whether it is of the correct length for the algorithm specified. @param algorithms a set of string OIDS giving accepted algorithms. @param policies if non-null a set of policies we are willing to sign under. @param extensions if non-null a set of extensions we are willing to accept. @throws TspException if the request is invalid, or processing fails. return the ASN.1 encoded representation of this object. base constructor. create a SecurityUtilityException with the given message. @param message the message to be carried with the exception. Container for a list of user attribute subpackets. BasicOcspResponse ::= SEQUENCE { tbsResponseData ResponseData, signatureAlgorithm AlgorithmIdentifier, signature BIT STRING, certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL } The DER encoding of the tbsResponseData field. In the event of an encoding error. The certificates, if any, associated with the response. In the event of an encoding error. Verify the signature against the tbsResponseData object we contain. The ASN.1 encoded representation of this object. The Digital Signature Algorithm - as described in "Handbook of Applied Cryptography", pages 452 - 453. interface for classes implementing the Digital Signature Algorithm initialise the signer for signature generation or signature verification. @param forSigning true if we are generating a signature, false otherwise. @param param key parameters for signature generation. sign the passed in message (usually the output of a hash function). @param message the message to be signed. @return two big integers representing the r and s values respectively. verify the message message against the signature values r and s. @param message the message that was supposed to have been signed. @param r the r signature value. @param s the s signature value. Generate a signature for the given message using the key we were initialised with. For conventional DSA the message should be a SHA-1 hash of the message of interest. @param message the message that will be verified later. return true if the value r and s represent a DSA signature for the passed in message for standard DSA the message should be a SHA-1 hash of the real message to be verified. super class for all Password Based Encyrption (Pbe) parameter generator classes. base constructor. initialise the Pbe generator. @param password the password converted into bytes (see below). @param salt the salt to be mixed with the password. @param iterationCount the number of iterations the "mixing" function is to be applied for. return the password byte array. @return the password byte array. return the salt byte array. @return the salt byte array. Generate derived parameters for a key of length keySize. @param keySize the length, in bits, of the key required. @return a parameters object representing a key. Generate derived parameters for a key of length keySize, and an initialisation vector (IV) of length ivSize. @param keySize the length, in bits, of the key required. @param ivSize the length, in bits, of the iv required. @return a parameters object representing a key and an IV. Generate derived parameters for a key of length keySize, specifically for use with a MAC. @param keySize the length, in bits, of the key required. @return a parameters object representing a key. converts a password to a byte array according to the scheme in Pkcs5 (ascii, no padding) @param password a character array reqpresenting the password. @return a byte array representing the password. converts a password to a byte array according to the scheme in PKCS5 (UTF-8, no padding) @param password a character array reqpresenting the password. @return a byte array representing the password. converts a password to a byte array according to the scheme in Pkcs12 (unicode, big endian, 2 zero pad bytes at the end). @param password a character array representing the password. @return a byte array representing the password. return the iteration count. @return the iteration count. The base class for parameters to key generators. initialise the generator with a source of randomness and a strength (in bits). @param random the random byte source. @param strength the size, in bits, of the keys we want to produce. return the random source associated with this generator. @return the generators random source. return the bit strength for keys produced by this generator, @return the strength of the keys this generator produces (in bits). all parameter classes implement this. A padder that adds Pkcs7/Pkcs5 padding to a block. Block cipher padders are expected to conform to this interface Initialise the padder. @param param parameters, if any required. add the pad bytes to the passed in block, returning the number of bytes added. return the number of pad bytes present in the block. @exception InvalidCipherTextException if the padding is badly formed or invalid. Return the name of the algorithm the cipher implements. @return the name of the algorithm the cipher implements. Initialise the padder. @param random - a SecureRandom if available. add the pad bytes to the passed in block, returning the number of bytes added. return the number of pad bytes present in the block. Return the name of the algorithm the cipher implements. @return the name of the algorithm the cipher implements. implements Cipher-Block-Chaining (CBC) mode on top of a simple cipher. Base interface for a symmetric key block cipher. Initialise the cipher. Initialise for encryption if true, for decryption if false. The key or other data required by the cipher. The block size for this cipher, in bytes. Process a block. The input buffer. The offset into inBuf that the input block begins. The output buffer. The offset into outBuf to write the output block. If input block is wrong size, or outBuf too small. The number of bytes processed and produced. Reset the cipher to the same state as it was after the last init (if there was one). The name of the algorithm this cipher implements. Indicates whether this cipher can handle partial blocks. Basic constructor. @param cipher the block cipher to be used as the basis of chaining. return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the IV will be all zeros. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the block size of the underlying cipher. @return the block size of the underlying cipher. Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. reset the chaining vector back to the IV and reset the underlying cipher. Do the appropriate chaining step for CBC mode encryption. @param in the array containing the data to be encrypted. @param inOff offset into the in array the data starts at. @param out the array the encrypted data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. Do the appropriate chaining step for CBC mode decryption. @param in the array containing the data to be decrypted. @param inOff offset into the in array the data starts at. @param out the array the decrypted data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. return the algorithm name and mode. @return the name of the underlying algorithm followed by "/CBC". The basic interface that basic Diffie-Hellman implementations conforms to. initialise the agreement engine. given a public key from a given party calculate the next message in the agreement sequence. KFD2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033
This implementation is based on IEEE P1363/ISO 18033.
Basic KDF generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033
This implementation is based on ISO 18033/P1363a.
base interface for general purpose byte derivation functions. return the message digest used as the basis for the function Construct a KDF Parameters generator. @param counterStart value of counter. @param digest the digest to be used as the source of derived keys. fill len bytes of the output buffer with bytes generated from the derivation function. @throws ArgumentException if the size of the request will cause an overflow. @throws DataLengthException if the out buffer is too small. return the underlying digest. Construct a KDF2 bytes generator. Generates key material according to IEEE P1363 or ISO 18033 depending on the initialisation. @param digest the digest to be used as the source of derived keys. Implementation of Bob Jenkin's ISAAC (Indirection Shift Accumulate Add and Count). see: http://www.burtleburtle.net/bob/rand/isaacafa.html The interface stream ciphers conform to. Initialise the cipher. If true the cipher is initialised for encryption, if false for decryption. The key and other data required by the cipher. If the parameters argument is inappropriate. encrypt/decrypt a single byte returning the result. the byte to be processed. the result of processing the input byte. Process a block of bytes from input putting the result into output. The input byte array. The offset into input where the data to be processed starts. The number of bytes to be processed. The output buffer the processed bytes go into. The offset into output the processed data starts at. If the output buffer is too small. Reset the cipher to the same state as it was after the last init (if there was one). The name of the algorithm this cipher implements. initialise an ISAAC cipher. @param forEncryption whether or not we are for encryption. @param params the parameters required to set up the cipher. @exception ArgumentException if the params argument is inappropriate. A class that provides Blowfish key encryption operations, such as encoding data and generating keys. All the algorithms herein are from Applied Cryptography and implement a simplified cryptography interface. initialise a Blowfish cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. apply the encryption cycle to each value pair in the table. Encrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. The input will be an exact multiple of our blocksize. Decrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. The input will be an exact multiple of our blocksize. this does your basic Pkcs 1 v1.5 padding - whether or not you should be using this depends on your application - see Pkcs1 Version 2 for details. Base interface for a public/private key block cipher. Initialise the cipher. Initialise for encryption if true, for decryption if false. The key or other data required by the cipher. The maximum size, in bytes, an input block may be. The maximum size, in bytes, an output block will be. Process a block. The input buffer. The offset into inBuf that the input block begins. The length of the input block. Input decrypts improperly. Input is too large for the cipher. The name of the algorithm this cipher implements. some providers fail to include the leading zero in PKCS1 encoded blocks. If you need to work with one of these set the system property Org.BouncyCastle.Pkcs1.Strict to false. Basic constructor. @param cipher @exception InvalidCipherTextException if the decrypted block is not in Pkcs1 format. The same effect can be achieved by setting the static property directly

The static property is checked during construction of the encoding object, it is set to true by default.

base implementation of MD4 family style digest as outlined in "Handbook of Applied Cryptography", pages 344 - 347. interface that a message digest conforms to. return the size, in bytes, of the digest produced by this message digest. @return the size, in bytes, of the digest produced by this message digest. return the size, in bytes, of the internal buffer used by this digest. @return the size, in bytes, of the internal buffer used by this digest. update the message digest with a single byte. @param inByte the input byte to be entered. update the message digest with a block of bytes. @param input the byte array containing the data. @param inOff the offset into the byte array where the data starts. @param len the length of the data. Close the digest, producing the final digest value. The doFinal call leaves the digest reset. @param output the array the digest is to be copied into. @param outOff the offset into the out array the digest is to start at. reset the digest back to it's initial state. return the algorithm name @return the algorithm name The base class for symmetric, or secret, cipher key generators. initialise the key generator. @param param the parameters to be used for key generation Generate a secret key. @return a byte array containing the key value. Block cipher engines are expected to conform to this interface. Initialise the cipher. If true the cipher is initialised for encryption, if false for decryption. The key and other data required by the cipher. Reset the cipher. After resetting the cipher is in the same state as it was after the last init (if there was one). The name of the algorithm this cipher implements. RFC 2631 Diffie-hellman KEK derivation function. P1363 7.2.1 ECSVDP-DH ECSVDP-DH is Elliptic Curve Secret Value Derivation Primitive, Diffie-Hellman version. It is based on the work of [DH76], [Mil86], and [Kob87]. This primitive derives a shared secret value from one party's private key and another party's public key, where both have the same set of EC domain parameters. If two parties correctly execute this primitive, they will produce the same output. This primitive can be invoked by a scheme to derive a shared secret key; specifically, it may be used with the schemes ECKAS-DH1 and DL/ECKAS-DH2. It assumes that the input keys are valid (see also Section 7.2.2). an expanded SignerInfo block from a CMS Signed message return the content digest that was calculated during verification. return the encoded signature Return a SignerInformationStore containing the counter signatures attached to this signer. If no counter signatures are present an empty store is returned. return the DER encoding of the signed attributes. @throws IOException if an encoding error occurs. verify that the given public key succesfully handles and confirms the signature associated with this signer. verify that the given certificate successfully handles and confirms the signature associated with this signer and, if a signingTime attribute is available, that the certificate was valid at the time the signature was generated. Return the base ASN.1 CMS structure that this object contains. @return an object containing a CMS SignerInfo structure. Return a signer information object with the passed in unsigned attributes replacing the ones that are current associated with the object passed in. @param signerInformation the signerInfo to be used as the basis. @param unsignedAttributes the unsigned attributes to add. @return a copy of the original SignerInformationObject with the changed attributes. Return a signer information object with passed in SignerInformationStore representing counter signatures attached as an unsigned attribute. @param signerInformation the signerInfo to be used as the basis. @param counterSigners signer info objects carrying counter signature. @return a copy of the original SignerInformationObject with the changed attributes. return the version number for this objects underlying SignerInfo structure. return the object identifier for the signature. return the signature parameters, or null if there aren't any. return the object identifier for the signature. return the signature/encryption algorithm parameters, or null if there aren't any. return a table of the signed attributes - indexed by the OID of the attribute. return a table of the unsigned attributes indexed by the OID of the attribute. Basic type for a symmetric key encrypted packet. Note: you can only read from this once... ASN.1 def for Diffie-Hellman key exchange KeySpecificInfo structure. See RFC 2631, or X9.42, for further details. Return the DER encoding of the object, null if the DER encoding can not be made. @return a DER byte array, null otherwise. Produce an object suitable for an Asn1OutputStream.
             KeySpecificInfo ::= Sequence {
                 algorithm OBJECT IDENTIFIER,
                 counter OCTET STRING SIZE (4..4)
             }
            
* It turns out that the number of standard ways the fields in a DN should be * encoded into their ASN.1 counterparts is rapidly approaching the * number of machines on the internet. By default the X509Name class * will produce UTF8Strings in line with the current recommendations (RFC 3280). *

* An example of an encoder look like below: *

                 * public class X509DirEntryConverter
                 *     : X509NameEntryConverter
                 * {
                 *     public Asn1Object GetConvertedValue(
                 *         DerObjectIdentifier  oid,
                 *         string               value)
                 *     {
                 *         if (str.Length() != 0 && str.charAt(0) == '#')
                 *         {
                 *             return ConvertHexEncoded(str, 1);
                 *         }
                 *         if (oid.Equals(EmailAddress))
                 *         {
                 *             return new DerIA5String(str);
                 *         }
                 *         else if (CanBePrintable(str))
                 *         {
                 *             return new DerPrintableString(str);
                 *         }
                 *         else if (CanBeUTF8(str))
                 *         {
                 *             return new DerUtf8String(str);
                 *         }
                 *         else
                 *         {
                 *             return new DerBmpString(str);
                 *         }
                 *     }
                 * }
            	 * 
*

Convert an inline encoded hex string rendition of an ASN.1 object back into its corresponding ASN.1 object. @param str the hex encoded object @param off the index at which the encoding starts @return the decoded object return true if the passed in string can be represented without loss as a PrintableString, false otherwise. Convert the passed in string value into the appropriate ASN.1 encoded object. @param oid the oid associated with the value in the DN. @param value the value of the particular DN component. @return the ASN.1 equivalent for the value. Object Identifiers of SigI specifciation (German Signature Law Interoperability specification). Key purpose IDs for German SigI (Signature Interoperability Specification) Certificate policy IDs for German SigI (Signature Interoperability Specification) Other Name IDs for German SigI (Signature Interoperability Specification) To be used for for the generation of directory service certificates. ID for PersonalData Certificate is conform to german signature law. ObjectDigestInfo ASN.1 structure used in v2 attribute certificates.
             
               ObjectDigestInfo ::= SEQUENCE {
                    digestedObjectType  ENUMERATED {
                            publicKey            (0),
                            publicKeyCert        (1),
                            otherObjectTypes     (2) },
                                    -- otherObjectTypes MUST NOT
                                    -- be used in this profile
                    otherObjectTypeID   OBJECT IDENTIFIER OPTIONAL,
                    digestAlgorithm     AlgorithmIdentifier,
                    objectDigest        BIT STRING
               }
              
            
The public key is hashed. The public key certificate is hashed. An other object is hashed. Constructor from given details.

If digestedObjectType is not {@link #publicKeyCert} or {@link #publicKey} otherObjectTypeID must be given, otherwise it is ignored.

@param digestedObjectType The digest object type. @param otherObjectTypeID The object type ID for otherObjectDigest. @param digestAlgorithm The algorithm identifier for the hash. @param objectDigest The hash value.
Produce an object suitable for an Asn1OutputStream.
             
               ObjectDigestInfo ::= SEQUENCE {
                    digestedObjectType  ENUMERATED {
                            publicKey            (0),
                            publicKeyCert        (1),
                            otherObjectTypes     (2) },
                                    -- otherObjectTypes MUST NOT
                                    -- be used in this profile
                    otherObjectTypeID   OBJECT IDENTIFIER OPTIONAL,
                    digestAlgorithm     AlgorithmIdentifier,
                    objectDigest        BIT STRING
               }
              
            
The CRLReason enumeration.
            CRLReason ::= Enumerated {
             unspecified             (0),
             keyCompromise           (1),
             cACompromise            (2),
             affiliationChanged      (3),
             superseded              (4),
             cessationOfOperation    (5),
             certificateHold         (6),
             removeFromCRL           (8),
             privilegeWithdrawn      (9),
             aACompromise           (10)
            }
            
Create a base ASN.1 object from a byte array. The byte array to parse. The base ASN.1 object represented by the byte array. If there is a problem parsing the data. Read a base ASN.1 object from a stream. The stream to parse. The base ASN.1 object represented by the byte array. If there is a problem parsing the data. return an integer from the passed in object @exception ArgumentException if the object cannot be converted. return an Enumerated from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. Return the distribution points making up the sequence. @return DistributionPoint[] Produce an object suitable for an Asn1OutputStream.
            CrlDistPoint ::= Sequence SIZE {1..MAX} OF DistributionPoint
            
a Pkcs#7 signed data object. Produce an object suitable for an Asn1OutputStream.
             SignedData ::= Sequence {
                 version Version,
                 digestAlgorithms DigestAlgorithmIdentifiers,
                 contentInfo ContentInfo,
                 certificates
                     [0] IMPLICIT ExtendedCertificatesAndCertificates
                              OPTIONAL,
                 crls
                     [1] IMPLICIT CertificateRevocationLists OPTIONAL,
                 signerInfos SignerInfos }
            
Produce an object suitable for an Asn1OutputStream.
            ServiceLocator ::= Sequence {
                issuer    Name,
                locator   AuthorityInfoAccessSyntax OPTIONAL }
            
create a CertStatus object with a tag of zero. Produce an object suitable for an Asn1OutputStream.
             CertStatus ::= CHOICE {
                             good        [0]     IMPLICIT Null,
                             revoked     [1]     IMPLICIT RevokedInfo,
                             unknown     [2]     IMPLICIT UnknownInfo }
            
The DataGroupHash object.
             DataGroupHash  ::=  SEQUENCE {
                  dataGroupNumber         DataGroupNumber,
                  dataGroupHashValue     OCTET STRING }
            
             DataGroupNumber ::= INTEGER {
                     dataGroup1    (1),
                     dataGroup1    (2),
                     dataGroup1    (3),
                     dataGroup1    (4),
                     dataGroup1    (5),
                     dataGroup1    (6),
                     dataGroup1    (7),
                     dataGroup1    (8),
                     dataGroup1    (9),
                     dataGroup1    (10),
                     dataGroup1    (11),
                     dataGroup1    (12),
                     dataGroup1    (13),
                     dataGroup1    (14),
                     dataGroup1    (15),
                     dataGroup1    (16) }
            
             
SigPolicyQualifierInfo ::= SEQUENCE { sigPolicyQualifierId SigPolicyQualifierId, sigQualifier ANY DEFINED BY sigPolicyQualifierId } SigPolicyQualifierId ::= OBJECT IDENTIFIER RFC 3126: 4.3.2 Revocation Values Attribute Definition RevocationValues ::= SEQUENCE { crlVals [0] SEQUENCE OF CertificateList OPTIONAL, ocspVals [1] SEQUENCE OF BasicOCSPResponse OPTIONAL, otherRevVals [2] OtherRevVals } return an Asn1Sequence from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Return an ASN1 sequence from a tagged object. There is a special case here, if an object appears to have been explicitly tagged on reading but we were expecting it to be implicitly tagged in the normal course of events it indicates that we lost the surrounding sequence - so we need to add it back (this will happen if the tagged object is a sequence that contains other sequences). If you are dealing with implicitly tagged sequences you really should be using this method. @param obj the tagged object. @param explicitly true if the object is meant to be explicitly tagged, false otherwise. @exception ArgumentException if the tagged object cannot be converted. return the object at the sequence position indicated by index. @param index the sequence number (starting at zero) of the object @return the object at the sequence position indicated by index. create an empty sequence create a sequence containing one object create a sequence containing a vector of objects. return an OtherKeyAttribute object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            OtherKeyAttribute ::= Sequence {
                keyAttrId OBJECT IDENTIFIER,
                keyAttr ANY DEFINED BY keyAttrId OPTIONAL
            }
            
return an OriginatorInfo object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return an OriginatorInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            OriginatorInfo ::= Sequence {
                certs [0] IMPLICIT CertificateSet OPTIONAL,
                crls [1] IMPLICIT CertificateRevocationLists OPTIONAL
            }
            
A Null object. An input stream that decompresses from the BZip2 format (with the file header chars) to be read as any other stream. @author Keiron Liddle NB: note this class has been modified to read the leading BZ from the start of the BZIP2 stream to make it compatible with other PGP programs. A class to Generate Version 3 X509Certificates. Reset the Generator. Set the certificate's serial number. Make serial numbers long, if you have no serial number policy make sure the number is at least 16 bytes of secure random data. You will be surprised how ugly a serial number collision can Get. The serial number. Set the distinguished name of the issuer. The issuer is the entity which is signing the certificate. The issuer's DN. Set the date that this certificate is to be valid from. Set the date after which this certificate will no longer be valid. Set the DN of the entity that this certificate is about. Set the public key that this certificate identifies. Set the signature algorithm that will be used to sign this certificate. Add a given extension field for the standard extensions tag (tag 3). string containing a dotted decimal Object Identifier. Is it critical. The value. Add an extension to this certificate. Its Object Identifier. Is it critical. The value. Add an extension using a string with a dotted decimal OID. string containing a dotted decimal Object Identifier. Is it critical. byte[] containing the value of this extension. Add an extension to this certificate. Its Object Identifier. Is it critical. byte[] containing the value of this extension. Add a given extension field for the standard extensions tag (tag 3), copying the extension value from another certificate. add a given extension field for the standard extensions tag (tag 3) copying the extension value from another certificate. @throws CertificateParsingException if the extension cannot be extracted. Generate an X509Certificate. The private key of the issuer that is signing this certificate. An X509Certificate. Generate an X509Certificate using your own SecureRandom. The private key of the issuer that is signing this certificate. You Secure Random instance. An X509Certificate. Allows enumeration of the signature names supported by the generator. A high level authority key identifier. The AuthorityKeyIdentifier object.
             id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }
            
               AuthorityKeyIdentifier ::= Sequence {
                  keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
                  authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
                  authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
            
               KeyIdentifier ::= OCTET STRING
             
* * Calulates the keyidentifier using a SHA1 hash over the BIT STRING * from SubjectPublicKeyInfo as defined in RFC2459. * * Example of making a AuthorityKeyIdentifier: *
            	     *   SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(
            		 *       publicKey.getEncoded()).readObject());
                     *   AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
                     * 
* *
create an AuthorityKeyIdentifier with the GeneralNames tag and the serial number provided as well. create an AuthorityKeyIdentifier with the GeneralNames tag and the serial number provided. create an AuthorityKeyIdentifier with a precomputed key identifier create an AuthorityKeyIdentifier with a precomupted key identifier and the GeneralNames tag and the serial number provided as well. Produce an object suitable for an Asn1OutputStream. Constructor which will take the byte[] returned from getExtensionValue() @param encodedValue a DER octet encoded string with the extension structure in it. @throws IOException on parsing errors. Create an AuthorityKeyIdentifier using the passed in certificate's public key, issuer and serial number. @param certificate the certificate providing the information. @throws CertificateParsingException if there is a problem processing the certificate Create an AuthorityKeyIdentifier using just the hash of the public key. @param pubKey the key to generate the hash from. @throws InvalidKeyException if there is a problem using the key. BigInteger utilities. Return the passed in value as an unsigned byte array. @param value value to be converted. @return a byte array without a leading zero byte if present in the signed encoding. Basic utility class. Write out the passed in file as a literal data packet. Write out the passed in file as a literal data packet in partial packet format. Return either an ArmoredInputStream or a BcpgInputStream based on whether the initial characters of the stream are binary PGP encodings or not. A PGP signature object. Verify the signature as certifying the passed in public key as associated with the passed in user attributes. User attributes the key was stored under. The key to be verified. True, if the signature matches, false otherwise. Verify the signature as certifying the passed in public key as associated with the passed in ID. ID the key was stored under. The key to be verified. True, if the signature matches, false otherwise. Verify a certification for the passed in key against the passed in master key. The key we are verifying against. The key we are verifying. True, if the certification is valid, false otherwise. Verify a key certification, such as revocation, for the passed in key. The key we are checking. True, if the certification is valid, false otherwise. The OpenPGP version number for this signature. The key algorithm associated with this signature. The hash algorithm associated with this signature. The ID of the key that created the signature. The creation time of this signature. Return true if the signature has either hashed or unhashed subpackets. General class to handle a PGP public key object. Create a PgpPublicKey from the passed in lightweight one. Note: the time passed in affects the value of the key's keyId, so you probably only want to do this once for a lightweight key, or make sure you keep track of the time you used. Asymmetric algorithm type representing the public key. Actual public key to associate. Date of creation. If pubKey is not public. On key creation problem. Constructor for a sub-key. Copy constructor. The public key to copy. Return the trust data associated with the public key, if present. A byte array with trust data, null otherwise. The number of valid seconds from creation time - zero means no expiry. The fingerprint of the key The public key contained in the object. A lightweight public key. If the key algorithm is not recognised. Allows enumeration of any user IDs associated with the key. An IEnumerable of string objects. Allows enumeration of any user attribute vectors associated with the key. An IEnumerable of PgpUserAttributeSubpacketVector objects. Allows enumeration of any signatures associated with the passed in id. The ID to be matched. An IEnumerable of PgpSignature objects. Allows enumeration of signatures associated with the passed in user attributes. The vector of user attributes to be matched. An IEnumerable of PgpSignature objects. Allows enumeration of signatures of the passed in type that are on this key. The type of the signature to be returned. An IEnumerable of PgpSignature objects. Allows enumeration of all signatures/certifications associated with this key. An IEnumerable with all signatures/certifications. Check whether this (sub)key has a revocation signature on it. True, if this (sub)key has been revoked. Add a certification for an id to the given public key. The key the certification is to be added to. The ID the certification is associated with. The new certification. The re-certified key. Add a certification for the given UserAttributeSubpackets to the given public key. The key the certification is to be added to. The attributes the certification is associated with. The new certification. The re-certified key. Remove any certifications associated with a user attribute subpacket on a key. The key the certifications are to be removed from. The attributes to be removed. The re-certified key, or null if the user attribute subpacket was not found on the key. Remove any certifications associated with a given ID on a key. The key the certifications are to be removed from. The ID that is to be removed. The re-certified key, or null if the ID was not found on the key. Remove any certifications associated with a given ID on a key. The key the certifications are to be removed from. The ID that the certfication is to be removed from. The certfication to be removed. The re-certified key, or null if the certification was not found. Add a revocation or some other key certification to a key. The key the revocation is to be added to. The key signature to be added. The new changed public key object. The version of this key. The creation time of this key. The number of valid days from creation time - zero means no expiry. The keyId associated with the public key. Check if this key has an algorithm type that makes it suitable to use for encryption. Note: with version 4 keys KeyFlags subpackets should also be considered when present for determining the preferred use of the key. true if this key algorithm is suitable for encryption. True, if this is a master key. The algorithm code associated with the public key. The strength of the key in bits. General class for reading a PGP object stream.

Note: if this class finds a PgpPublicKey or a PgpSecretKey it will create a PgpPublicKeyRing, or a PgpSecretKeyRing for each key found. If all you are trying to do is read a key ring file use either PgpPublicKeyRingBundle or PgpSecretKeyRingBundle.

Return the next object in the stream, or null if the end is reached. On a parse error Return all available objects in a list. An IList containing all objects from this factory, in order. Class for processing literal data objects. The special name indicating a "for your eyes only" packet. The raw input stream for the data stream. The input stream representing the data stream. The format of the data stream - Binary or Text The file name that's associated with the data stream. The modification time for the file. Compressed data objects Get the raw input stream contained in the object. Return an uncompressed input stream which allows reading of the compressed data. The algorithm used for compression Class implementing the NAF (Non-Adjacent Form) multiplication algorithm. Interface for classes encapsulating a point multiplication algorithm for ECPoints. Multiplies the ECPoint p by k, i.e. p is added k times to itself. @param p The ECPoint to be multiplied. @param k The factor by which p i multiplied. @return p multiplied by k. D.3.2 pg 101 @see org.bouncycastle.math.ec.multiplier.ECMultiplier#multiply(org.bouncycastle.math.ec.ECPoint, java.math.BigInteger) A generic TLS 1.0 block cipher suite. This can be used for AES or 3DES for example. A generic class for ciphersuites in TLS 1.0. An implementation of the TLS 1.0 record layer. A padder that adds Null byte padding to a block. Initialise the padder. - a SecureRandom if available. add the pad bytes to the passed in block, returning the number of bytes added. return the number of pad bytes present in the block. Return the name of the algorithm the cipher implements. the name of the algorithm the cipher implements. A padder that adds ISO10126-2 padding to a block. Initialise the padder. @param random a SecureRandom if available. add the pad bytes to the passed in block, returning the number of bytes added. return the number of pad bytes present in the block. Return the name of the algorithm the cipher implements. @return the name of the algorithm the cipher implements. A Cipher Text Stealing (CTS) mode cipher. CTS allows block ciphers to be used to produce cipher text which is the same outLength as the plain text. A wrapper class that allows block ciphers to be used to process data in a piecemeal fashion. The BufferedBlockCipher outputs a block only when the buffer is full and more data is being added, or on a doFinal.

Note: in the case where the underlying cipher is either a CFB cipher or an OFB one the last block may not be a multiple of the block size.

constructor for subclasses Create a buffered block cipher without padding. @param cipher the underlying block cipher this buffering object wraps. false otherwise. initialise the cipher. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the blocksize for the underlying cipher. @return the blocksize for the underlying cipher. return the size of the output buffer required for an update an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to update with len bytes of input. return the size of the output buffer required for an update plus a doFinal with an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to update and doFinal with len bytes of input. process a single byte, producing an output block if neccessary. @param in the input byte. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. process an array of bytes, producing output if necessary. @param in the input byte array. @param inOff the offset at which the input data starts. @param len the number of bytes to be copied out of the input array. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. Process the last block in the buffer. @param out the array the block currently being held is copied into. @param outOff the offset at which the copying starts. @return the number of output bytes copied to out. @exception DataLengthException if there is insufficient space in out for the output, or the input is not block size aligned and should be. @exception InvalidOperationException if the underlying cipher is not initialised. @exception InvalidCipherTextException if padding is expected and not found. @exception DataLengthException if the input is not block size aligned. Reset the buffer and cipher. After resetting the object is in the same state as it was after the last init (if there was one). Create a buffered block cipher that uses Cipher Text Stealing @param cipher the underlying block cipher this buffering object wraps. return the size of the output buffer required for an update of 'length' bytes. @param length the outLength of the input. @return the space required to accommodate a call to update with length bytes of input. return the size of the output buffer required for an update plus a doFinal with an input of length bytes. @param length the outLength of the input. @return the space required to accommodate a call to update and doFinal with length bytes of input. process a single byte, producing an output block if neccessary. @param in the input byte. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. process an array of bytes, producing output if necessary. @param in the input byte array. @param inOff the offset at which the input data starts. @param length the number of bytes to be copied out of the input array. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. Process the last block in the buffer. @param out the array the block currently being held is copied into. @param outOff the offset at which the copying starts. @return the number of output bytes copied to out. @exception DataLengthException if there is insufficient space in out for the output. @exception InvalidOperationException if the underlying cipher is not initialised. @exception InvalidCipherTextException if cipher text decrypts wrongly (in case the exception will never Get thrown). initialise a VMPC cipher. @param forEncryption whether or not we are for encryption. @param params the parameters required to set up the cipher. @exception ArgumentException if the params argument is inappropriate. a class that provides a basic SKIPJACK engine. initialise a SKIPJACK cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. The G permutation the inverse of the G permutation. this does your basic RSA algorithm. initialise the RSA engine. @param forEncryption true if we are encrypting, false otherwise. @param param the necessary RSA key parameters. Return the maximum size for an input block to this engine. For RSA this is always one byte less than the key size on encryption, and the same length as the key size on decryption. @return maximum size for an input block. Return the maximum size for an output block to this engine. For RSA this is always one byte less than the key size on decryption, and the same length as the key size on encryption. @return maximum size for an output block. Process a single block using the basic RSA algorithm. @param inBuf the input array. @param inOff the offset into the input buffer where the data starts. @param inLen the length of the data to be processed. @return the result of the RSA process. @exception DataLengthException the input block is too large. initialise a RC4 cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. * A class that provides a basic International Data Encryption Algorithm (IDEA) engine. *

* This implementation is based on the "HOWTO: INTERNATIONAL DATA ENCRYPTION ALGORITHM" * implementation summary by Fauzan Mirza (F.U.Mirza@sheffield.ac.uk). (baring 1 typo at the * end of the mulinv function!). *

*

* It can be found at ftp://ftp.funet.fi/pub/crypt/cryptography/symmetric/idea/ *

*

* Note 1: This algorithm is patented in the USA, Japan, and Europe including * at least Austria, France, Germany, Italy, Netherlands, Spain, Sweden, Switzerland * and the United Kingdom. Non-commercial use is free, however any commercial * products are liable for royalties. Please see * www.mediacrypt.com for * further details. This announcement has been included at the request of * the patent holders. *

*

* Note 2: Due to the requests concerning the above, this algorithm is now only * included in the extended assembly. It is not included in the default distributions. *

standard constructor. initialise an IDEA cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. return x = x * y where the multiplication is done modulo 65537 (0x10001) (as defined in the IDEA specification) and a zero input is taken to be 65536 (0x10000). @param x the x value @param y the y value @return x = x * y The following function is used to expand the user key to the encryption subkey. The first 16 bytes are the user key, and the rest of the subkey is calculated by rotating the previous 16 bytes by 25 bits to the left, and so on until the subkey is completed. * This function computes multiplicative inverse using Euclid's Greatest * Common Divisor algorithm. Zero and one are self inverse. *

* i.e. x * MulInv(x) == 1 (modulo BASE) *

* Return the additive inverse of x. *

* i.e. x + AddInv(x) == 0 *

The function to invert the encryption subkey to the decryption subkey. It also involves the multiplicative inverse and the additive inverse functions. an implementation of the AES (Rijndael), from FIPS-197.

For further details see: http://csrc.nist.gov/encryption/aes/. This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at http://fp.gladman.plus.com/cryptography_technology/rijndael/ There are three levels of tradeoff of speed vs memory Because java has no preprocessor, they are written as three separate classes from which to choose The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption and 4 for decryption. The middle performance version uses only one 256 word table for each, for a total of 2Kbytes, adding 12 rotate operations per round to compute the values contained in the other tables from the contents of the first. The slowest version uses no static tables at all and computes the values in each round.

This file contains the middle performance version with 2Kbytes of static tables for round precomputation.

Calculate the necessary round keys The number of calculations depends on key size and block size AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits This code is written assuming those are the only possible values default constructor - 128 bit block size. initialise an AES cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Wrapper class that reduces the output length of a particular digest to only the first n bytes of the digest function. Base constructor. @param baseDigest underlying digest to use. @param length length in bytes of the output of doFinal. @exception ArgumentException if baseDigest is null, or length is greater than baseDigest.GetDigestSize(). implementation of MD5 as outlined in "Handbook of Applied Cryptography", pages 346 - 347. Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. An ISet of DerObjectIdentifier objects. the RecipientInfo class for a recipient who has been sent a message encrypted using a password. * return the object identifier for the key encryption algorithm. * @return OID for key encryption algorithm. * return the ASN.1 encoded key encryption algorithm parameters, or null if * there aren't any. * @return ASN.1 encoding of key encryption algorithm parameters. decrypt the content and return an input stream. return the object identifier for the key derivation algorithm, or null if there is none present. @return OID for key derivation algorithm, if present. General class for generating a compressed CMS message stream.

A simple example of usage.

                  CMSCompressedDataStreamGenerator gen = new CMSCompressedDataStreamGenerator();
            
                  Stream cOut = gen.Open(outputStream, CMSCompressedDataStreamGenerator.ZLIB);
            
                  cOut.Write(data);
            
                  cOut.Close();
             
base constructor packet giving signature creation time. Basic type for a PGP Signature sub-packet. Return the generic data making up the packet. Basic PGP packet tag types. Contains personal data for the otherName field in the subjectAltNames extension.

                 PersonalData ::= SEQUENCE {
                   nameOrPseudonym NameOrPseudonym,
                   nameDistinguisher [0] INTEGER OPTIONAL,
                   dateOfBirth [1] GeneralizedTime OPTIONAL,
                   placeOfBirth [2] DirectoryString OPTIONAL,
                   gender [3] PrintableString OPTIONAL,
                   postalAddress [4] DirectoryString OPTIONAL
                   }
             
@see org.bouncycastle.asn1.x509.sigi.NameOrPseudonym @see org.bouncycastle.asn1.x509.sigi.SigIObjectIdentifiers
Constructor from Asn1Sequence.

The sequence is of type NameOrPseudonym:

                 PersonalData ::= SEQUENCE {
                   nameOrPseudonym NameOrPseudonym,
                   nameDistinguisher [0] INTEGER OPTIONAL,
                   dateOfBirth [1] GeneralizedTime OPTIONAL,
                   placeOfBirth [2] DirectoryString OPTIONAL,
                   gender [3] PrintableString OPTIONAL,
                   postalAddress [4] DirectoryString OPTIONAL
                   }
             
@param seq The ASN.1 sequence.
Constructor from a given details. @param nameOrPseudonym Name or pseudonym. @param nameDistinguisher Name distinguisher. @param dateOfBirth Date of birth. @param placeOfBirth Place of birth. @param gender Gender. @param postalAddress Postal Address. Produce an object suitable for an Asn1OutputStream.

Returns:

                 PersonalData ::= SEQUENCE {
                   nameOrPseudonym NameOrPseudonym,
                   nameDistinguisher [0] INTEGER OPTIONAL,
                   dateOfBirth [1] GeneralizedTime OPTIONAL,
                   placeOfBirth [2] DirectoryString OPTIONAL,
                   gender [3] PrintableString OPTIONAL,
                   postalAddress [4] DirectoryString OPTIONAL
                   }
             
@return an Asn1Object
This outputs the key in Pkcs1v2 format.
                 RSAPublicKey ::= Sequence {
                                     modulus Integer, -- n
                                     publicExponent Integer, -- e
                                 }
            
The ReasonFlags object.
            ReasonFlags ::= BIT STRING {
               unused(0),
               keyCompromise(1),
               cACompromise(2),
               affiliationChanged(3),
               superseded(4),
               cessationOfOperation(5),
               certficateHold(6)
            }
            
basic interface for Der string objects. return the correct number of pad bits for a bit string defined in a 32 bit constant return the correct number of bytes for a bit string defined in a 32 bit constant return a Bit string from the passed in object @exception ArgumentException if the object cannot be converted. return a Bit string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. @param data the octets making up the bit string. @param padBits the number of extra bits at the end of the string. @return the value of the bit string as an int (truncating if necessary) @param reasons - the bitwise OR of the Key Reason flags giving the allowed uses for the key. The TypeOfBiometricData object.
             TypeOfBiometricData ::= CHOICE {
               predefinedBiometricType   PredefinedBiometricType,
               biometricDataOid          OBJECT IDENTIFIER }
            
             PredefinedBiometricType ::= INTEGER {
               picture(0),handwritten-signature(1)}
               (picture|handwritten-signature)
             
The DistributionPointName object.
            DistributionPointName ::= CHOICE {
                fullName                 [0] GeneralNames,
                nameRelativeToCRLIssuer  [1] RelativeDistinguishedName
            }
            
The DistributionPoint object.
            DistributionPoint ::= Sequence {
                 distributionPoint [0] DistributionPointName OPTIONAL,
                 reasons           [1] ReasonFlags OPTIONAL,
                 cRLIssuer         [2] GeneralNames OPTIONAL
            }
            
Produce an object suitable for an Asn1OutputStream.
              AttributeCertificateInfo ::= Sequence {
                   version              AttCertVersion -- version is v2,
                   holder               Holder,
                   issuer               AttCertIssuer,
                   signature            AlgorithmIdentifier,
                   serialNumber         CertificateSerialNumber,
                   attrCertValidityPeriod   AttCertValidityPeriod,
                   attributes           Sequence OF Attr,
                   issuerUniqueID       UniqueIdentifier OPTIONAL,
                   extensions           Extensions OPTIONAL
              }
            
              AttCertVersion ::= Integer { v2(1) }
             
Produce an object suitable for an Asn1OutputStream.
             AttCertValidityPeriod  ::= Sequence {
                  notBeforeTime  GeneralizedTime,
                  notAfterTime   GeneralizedTime
             }
            
dump a Der object as a formatted string with indentation @param obj the Asn1Object to be dumped out. dump out a DER object as a formatted string @param obj the Asn1Encodable to be dumped out. The default version
              RSAES-OAEP-params ::= SEQUENCE {
                 hashAlgorithm      [0] OAEP-PSSDigestAlgorithms     DEFAULT sha1,
                 maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
                 pSourceAlgorithm   [2] PKCS1PSourceAlgorithms  DEFAULT pSpecifiedEmpty
               }
            
               OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
                 { OID id-sha1 PARAMETERS NULL   }|
                 { OID id-sha256 PARAMETERS NULL }|
                 { OID id-sha384 PARAMETERS NULL }|
                 { OID id-sha512 PARAMETERS NULL },
                 ...  -- Allows for future expansion --
               }
               PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
                 { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
                ...  -- Allows for future expansion --
               }
               PKCS1PSourceAlgorithms    ALGORITHM-IDENTIFIER ::= {
                 { OID id-pSpecified PARAMETERS OCTET STRING },
                 ...  -- Allows for future expansion --
              }
             
@return the asn1 primitive representing the parameters.
Produce an object suitable for an Asn1OutputStream.
            RevokedInfo ::= Sequence {
                 revocationTime              GeneralizedTime,
                 revocationReason    [0]     EXPLICIT CRLReason OPTIONAL }
            
Attribute to indicate admissions to certain professions.

                 AdmissionSyntax ::= SEQUENCE
                 {
                   admissionAuthority GeneralName OPTIONAL,
                   contentsOfAdmissions SEQUENCE OF Admissions
                 }
             

Admissions ::= SEQUENCE { admissionAuthority [0] EXPLICIT GeneralName OPTIONAL namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL professionInfos SEQUENCE OF ProfessionInfo }

NamingAuthority ::= SEQUENCE { namingAuthorityId OBJECT IDENTIFIER OPTIONAL, namingAuthorityUrl IA5String OPTIONAL, namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL }

ProfessionInfo ::= SEQUENCE { namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL, professionItems SEQUENCE OF DirectoryString (SIZE(1..128)), professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL, registrationNumber PrintableString(SIZE(1..128)) OPTIONAL, addProfessionInfo OCTET STRING OPTIONAL }

ISIS-MTT PROFILE: The relatively complex structure of AdmissionSyntax supports the following concepts and requirements:

  • External institutions (e.g. professional associations, chambers, unions, administrative bodies, companies, etc.), which are responsible for granting and verifying professional admissions, are indicated by means of the data field admissionAuthority. An admission authority is indicated by a GeneralName object. Here an X.501 directory name (distinguished name) can be indicated in the field directoryName, a URL address can be indicated in the field uniformResourceIdentifier, and an object identifier can be indicated in the field registeredId.
  • The names of authorities which are responsible for the administration of title registers are indicated in the data field namingAuthority. The name of the authority can be identified by an object identifier in the field namingAuthorityId, by means of a text string in the field namingAuthorityText, by means of a URL address in the field namingAuthorityUrl, or by a combination of them. For example, the text string can contain the name of the authority, the country and the name of the title register. The URL-option refers to a web page which contains lists with �officially� registered professions (text and possibly OID) as well as further information on these professions. Object identifiers for the component namingAuthorityId are grouped under the OID-branch id-isis-at-namingAuthorities and must be applied for.
  • See http://www.teletrust.de/anwend.asp?Id=30200&Sprache=E_&HomePG=0 for an application form and http://www.teletrust.de/links.asp?id=30220,11 for an overview of registered naming authorities.
  • By means of the data type ProfessionInfo certain professions, specializations, disciplines, fields of activity, etc. are identified. A profession is represented by one or more text strings, resp. profession OIDs in the fields professionItems and professionOIDs and by a registration number in the field registrationNumber. An indication in text form must always be present, whereas the other indications are optional. The component addProfessionInfo may contain additional applicationspecific information in DER-encoded form.

By means of different namingAuthority-OIDs or profession OIDs hierarchies of professions, specializations, disciplines, fields of activity, etc. can be expressed. The issuing admission authority should always be indicated (field admissionAuthority), whenever a registration number is presented. Still, information on admissions can be given without indicating an admission or a naming authority by the exclusive use of the component professionItems. In this case the certification authority is responsible for the verification of the admission information.

This attribute is single-valued. Still, several admissions can be captured in the sequence structure of the component contentsOfAdmissions of AdmissionSyntax or in the component professionInfos of Admissions. The component admissionAuthority of AdmissionSyntax serves as default value for the component admissionAuthority of Admissions. Within the latter component the default value can be overwritten, in case that another authority is responsible. The component namingAuthority of Admissions serves as a default value for the component namingAuthority of ProfessionInfo. Within the latter component the default value can be overwritten, in case that another naming authority needs to be recorded.

The length of the string objects is limited to 128 characters. It is recommended to indicate a namingAuthorityURL in all issued attribute certificates. If a namingAuthorityURL is indicated, the field professionItems of ProfessionInfo should contain only registered titles. If the field professionOIDs exists, it has to contain the OIDs of the professions listed in professionItems in the same order. In general, the field professionInfos should contain only one entry, unless the admissions that are to be listed are logically connected (e.g. they have been issued under the same admission number). @see Org.BouncyCastle.Asn1.IsisMtt.X509.Admissions @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority Constructor from Asn1Sequence.

The sequence is of type ProcurationSyntax:

                 AdmissionSyntax ::= SEQUENCE
                 {
                   admissionAuthority GeneralName OPTIONAL,
                   contentsOfAdmissions SEQUENCE OF Admissions
                 }
             

Admissions ::= SEQUENCE { admissionAuthority [0] EXPLICIT GeneralName OPTIONAL namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL professionInfos SEQUENCE OF ProfessionInfo }

NamingAuthority ::= SEQUENCE { namingAuthorityId OBJECT IDENTIFIER OPTIONAL, namingAuthorityUrl IA5String OPTIONAL, namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL }

ProfessionInfo ::= SEQUENCE { namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL, professionItems SEQUENCE OF DirectoryString (SIZE(1..128)), professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL, registrationNumber PrintableString(SIZE(1..128)) OPTIONAL, addProfessionInfo OCTET STRING OPTIONAL }

@param seq The ASN.1 sequence.
Constructor from given details. @param admissionAuthority The admission authority. @param contentsOfAdmissions The admissions. Produce an object suitable for an Asn1OutputStream.

Returns:

                 AdmissionSyntax ::= SEQUENCE
                 {
                   admissionAuthority GeneralName OPTIONAL,
                   contentsOfAdmissions SEQUENCE OF Admissions
                 }
             

Admissions ::= SEQUENCE { admissionAuthority [0] EXPLICIT GeneralName OPTIONAL namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL professionInfos SEQUENCE OF ProfessionInfo }

NamingAuthority ::= SEQUENCE { namingAuthorityId OBJECT IDENTIFIER OPTIONAL, namingAuthorityUrl IA5String OPTIONAL, namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL }

ProfessionInfo ::= SEQUENCE { namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL, professionItems SEQUENCE OF DirectoryString (SIZE(1..128)), professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL, registrationNumber PrintableString(SIZE(1..128)) OPTIONAL, addProfessionInfo OCTET STRING OPTIONAL }

@return an Asn1Object
@return Returns the contentsOfAdmissions. @return Returns the admissionAuthority if present, null otherwise. The id-isismtt-cp-accredited OID indicates that the certificate is a qualified certificate according to Directive 1999/93/EC of the European Parliament and of the Council of 13 December 1999 on a Community Framework for Electronic Signatures, which additionally conforms the special requirements of the SigG and has been issued by an accredited CA. Certificate extensionDate of certificate generation
            		DateOfCertGenSyntax ::= GeneralizedTime
             
Attribute to indicate that the certificate holder may sign in the name of a third person. May also be used as extension in a certificate. Attribute to indicate admissions to certain professions. May be used as attribute in attribute certificate or as extension in a certificate Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST be used in new certificates in place of the extension/attribute MonetaryLimit since January 1, 2004. For the sake of backward compatibility with certificates already in use, SigG conforming components MUST support MonetaryLimit (as well as QcEuLimitValue). A declaration of majority. May be used as attribute in attribute certificate or as extension in a certificate Serial number of the smart card containing the corresponding private key
            		ICCSNSyntax ::= OCTET STRING (SIZE(8..20))
             
Reference for a file of a smartcard that stores the public key of this certificate and that is used as �security anchor�.
            		PKReferenceSyntax ::= OCTET STRING (SIZE(20))
             
Some other restriction regarding the usage of this certificate. May be used as attribute in attribute certificate or as extension in a certificate.
            		RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
             
@see Org.BouncyCastle.Asn1.IsisMtt.X509.Restriction
(Single)Request extension: Clients may include this extension in a (single) Request to request the responder to send the certificate in the response message along with the status information. Besides the LDAP service, this extension provides another mechanism for the distribution of certificates, which MAY optionally be provided by certificate repositories.
            		RetrieveIfAllowed ::= BOOLEAN
             
SingleOCSPResponse extension: The certificate requested by the client by inserting the RetrieveIfAllowed extension in the request, will be returned in this extension. @see Org.BouncyCastle.Asn1.IsisMtt.Ocsp.RequestedCertificate Base ObjectIdentifier for naming authorities SingleOCSPResponse extension: Date, when certificate has been published in the directory and status information has become available. Currently, accrediting authorities enforce that SigG-conforming OCSP servers include this extension in the responses.
            		CertInDirSince ::= GeneralizedTime
             
Hash of a certificate in OCSP. @see Org.BouncyCastle.Asn1.IsisMtt.Ocsp.CertHash
            		NameAtBirth ::= DirectoryString(SIZE(1..64)
             
Used in {@link Org.BouncyCastle.Asn1.X509.SubjectDirectoryAttributes SubjectDirectoryAttributes}
Some other information of non-restrictive nature regarding the usage of this certificate. May be used as attribute in atribute certificate or as extension in a certificate.
                          AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
            
@see Org.BouncyCastle.Asn1.IsisMtt.X509.AdditionalInformationSyntax
Indicates that an attribute certificate exists, which limits the usability of this public key certificate. Whenever verifying a signature with the help of this certificate, the content of the corresponding attribute certificate should be concerned. This extension MUST be included in a PKC, if a corresponding attribute certificate (having the PKC as base certificate) contains some attribute that restricts the usability of the PKC too. Attribute certificates with restricting content MUST always be included in the signed document.
            		LiabilityLimitationFlagSyntax ::= BOOLEAN
             
Generalized time object. return a generalized time from the passed in object @exception ArgumentException if the object cannot be converted. return a Generalized Time object from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. The correct format for this is YYYYMMDDHHMMSS[.f]Z, or without the Z for local time, or Z+-HHMM on the end, for difference between local time and UTC time. The fractional second amount f must consist of at least one number with trailing zeroes removed. @param time the time string. @exception ArgumentException if string is an illegal format. base constructor from a local time object return the time - always in the form of YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm).

Normally in a certificate we would expect "Z" rather than "GMT", however adding the "GMT" means we can just use:

                dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
            
To read in the time and Get a date which is compatible with our local time zone.

Return the time. @return The time string as it appeared in the encoded object. Der BMPString object. return a BMP string from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. return a BMP string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - byte encoded string. basic constructor return a SignerIdentifier object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
             SignerIdentifier ::= CHOICE {
                 issuerAndSerialNumber IssuerAndSerialNumber,
                 subjectKeyIdentifier [0] SubjectKeyIdentifier
             }
            
             SubjectKeyIdentifier ::= OCTET STRING
             
            SignedData ::= SEQUENCE {
                version CMSVersion,
                digestAlgorithms DigestAlgorithmIdentifiers,
                encapContentInfo EncapsulatedContentInfo,
                certificates [0] IMPLICIT CertificateSet OPTIONAL,
                crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
                signerInfos SignerInfos
              }
            
return a OtherRecipientInfo object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a OtherRecipientInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            OtherRecipientInfo ::= Sequence {
               oriType OBJECT IDENTIFIER,
               oriValue ANY DEFINED BY oriType }
            
return a KeyTransRecipientInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            KeyTransRecipientInfo ::= Sequence {
                version CMSVersion,  -- always set to 0 or 2
                rid RecipientIdentifier,
                keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
                encryptedKey EncryptedKey
            }
            
@param status @param status @param statusString
             PkiStatusInfo ::= SEQUENCE {
                 status        PKIStatus,                (INTEGER)
                 statusString  PkiFreeText     OPTIONAL,
                 failInfo      PkiFailureInfo  OPTIONAL  (BIT STRING)
             }
            
             PKIStatus:
               granted                (0), -- you got exactly what you asked for
               grantedWithMods        (1), -- you got something like what you asked for
               rejection              (2), -- you don't get it, more information elsewhere in the message
               waiting                (3), -- the request body part has not yet been processed, expect to hear more later
               revocationWarning      (4), -- this message contains a warning that a revocation is imminent
               revocationNotification (5), -- notification that a revocation has occurred
               keyUpdateWarning       (6)  -- update already done for the oldCertId specified in CertReqMsg
            
             PkiFailureInfo:
               badAlg           (0), -- unrecognized or unsupported Algorithm Identifier
               badMessageCheck  (1), -- integrity check failed (e.g., signature did not verify)
               badRequest       (2), -- transaction not permitted or supported
               badTime          (3), -- messageTime was not sufficiently close to the system time, as defined by local policy
               badCertId        (4), -- no certificate could be found matching the provided criteria
               badDataFormat    (5), -- the data submitted has the wrong format
               wrongAuthority   (6), -- the authority indicated in the request is different from the one creating the response token
               incorrectData    (7), -- the requester's data is incorrect (for notary services)
               missingTimeStamp (8), -- when the timestamp is missing but should be there (by policy)
               badPOP           (9)  -- the proof-of-possession failed
            
             
A BER Null object. A Null object. return an Octet string from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. return an Octet string from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. @param string the octets making up the octet string. Class to Generate X509V1 Certificates. Default Constructor. Reset the generator. Set the certificate's serial number. Make serial numbers long, if you have no serial number policy make sure the number is at least 16 bytes of secure random data. You will be surprised how ugly a serial number collision can get. The serial number. Set the issuer distinguished name. The issuer is the entity whose private key is used to sign the certificate. The issuers DN. Set the date that this certificate is to be valid from. Set the date after which this certificate will no longer be valid. Set the subject distinguished name. The subject describes the entity associated with the public key. Set the public key that this certificate identifies. Set the signature algorithm that will be used to sign this certificate. This can be either a name or an OID, names are treated as case insensitive. string representation of the algorithm name Generate a new X509Certificate. The private key of the issuer used to sign this certificate. An X509Certificate. Generate a new X509Certificate specifying a SecureRandom instance that you would like to use. The private key of the issuer used to sign this certificate. The Secure Random you want to use. An X509Certificate. Allows enumeration of the signature names supported by the generator. Class for carrying the values in an X.509 Attribute. @param at an object representing an attribute. Create an X.509 Attribute with the type given by the passed in oid and the value represented by an ASN.1 Set containing value. @param oid type of the attribute @param value value object to go into the atribute's value set. Create an X.59 Attribute with the type given by the passed in oid and the value represented by an ASN.1 Set containing the objects in value. @param oid type of the attribute @param value vector of values to go in the attribute's value set. A buffering class to allow translation from one format to another to be done in discrete chunks. Create a buffered Decoder. The translater to use. The size of the buffer. Process one byte of data. Data in. Byte array for the output. The offset in the output byte array to start writing from. The amount of output bytes. Process data from a byte array. The input data. Start position within input data array. Amount of data to process from input data array. Array to store output. Position in output array to start writing from. The amount of output bytes. Generator for RFC 3161 Time Stamp Responses. A PGP marker packet - in general these should be ignored other than where the idea is to preserve the original input stream. Simple shift-and-add multiplication. Serves as reference implementation to verify (possibly faster) implementations in {@link org.bouncycastle.math.ec.ECPoint ECPoint}. @param p The point to multiply. @param k The factor by which to multiply. @return The result of the point multiplication k * p. parameters for Key derivation functions for ISO-18033 Parameters for key/byte stream derivation classes Generator for PBE derived keys and ivs as usd by OpenSSL.

The scheme is a simple extension of PKCS 5 V2.0 Scheme 1 using MD5 with an iteration count of 1.

Construct a OpenSSL Parameters generator. Initialise - note the iteration count for this algorithm is fixed at 1. @param password password to use. @param salt salt to use. the derived key function, the ith hash of the password and the salt. Generate a key parameter derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. @exception ArgumentException if the key length larger than the base hash size. Generate a key with initialisation vector parameter derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @param ivSize the size of the iv we want (in bits) @return a ParametersWithIV object. @exception ArgumentException if keySize + ivSize is larger than the base hash size. Generate a key parameter for use with a MAC derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. @exception ArgumentException if the key length larger than the base hash size. A Noekeon engine, using direct-key mode. Create an instance of the Noekeon encryption algorithm and set some defaults initialise @param forEncryption whether or not we are for encryption. @param params the parameters required to set up the cipher. @exception ArgumentException if the params argument is inappropriate. Re-key the cipher. @param key the key to be used Implementation of WhirlpoolDigest, based on Java source published by Barreto and Rijmen. Copy constructor. This will copy the state of the provided message digest. Reset the chaining variables Base class for SHA-384 and SHA-512. Constructor for variable length word Copy constructor. We are using copy constructors in place of the object.Clone() interface as this interface is not supported by J2ME. adjust the byte counts so that byteCount2 represents the upper long (less 3 bits) word of the byte count. implementation of GOST R 34.11-94 Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. a Diffie-Hellman key exchange engine.

note: This uses MTI/A0 key agreement in order to make the key agreement secure against passive attacks. If you're doing Diffie-Hellman and both parties have long term public keys you should look at using this. For further information have a look at RFC 2631.

It's possible to extend this to more than two parties as well, for the moment that is left as an exercise for the reader.

calculate our initial message. given a message from a given party and the corresponding public key calculate the next message in the agreement sequence. In this case this will represent the shared secret. * general class for generating a pkcs7-signature message. *

* A simple example of usage. * *

                 *      IX509Store certs...
                 *      IX509Store crls...
                 *      CmsSignedDataGenerator gen = new CmsSignedDataGenerator();
                 *
                 *      gen.AddSigner(privKey, cert, CmsSignedGenerator.DigestSha1);
                 *      gen.AddCertificates(certs);
                 *      gen.AddCrls(crls);
                 *
                 *      CmsSignedData data = gen.Generate(content);
                 * 
*

Default type for the signed data. Constructor allowing specific source of randomness Instance of SecureRandom to use. Add the attribute certificates contained in the passed in store to the generator. @param store a store of Version 2 attribute certificates @throws CmsException if an error occurse processing the store. Add a store of precalculated signers to the generator. @param signerStore store of signers Return a map of oids and byte arrays representing the digests calculated on the content during the last generate. @return a map of oids (as String objects) and byte[] representing digests. Constructor allowing specific source of randomness Instance of SecureRandom to use. add a signer - no attributes other than the default ones will be provided here. add a signer with extra signed/unsigned attributes. add a signer with extra signed/unsigned attributes based on generators. generate a signed object that for a CMS Signed Data object generate a signed object that for a CMS Signed Data object - if encapsulate is true a copy of the message will be included in the signature. The content type is set according to the OID represented by the string signedContentType. generate a signed object that for a CMS Signed Data object - if encapsulate is true a copy of the message will be included in the signature with the default content type "data". generate a set of one or more SignerInformation objects representing counter signatures on the passed in SignerInformation object. @param signer the signer to be countersigned @param sigProvider the provider to be used for counter signing. @return a store containing the signers. packet giving the User ID of the signer. packet giving signature expiration time. return time in seconds before signature expires after creation time. Generic signature packet. Basic type for a PGP packet. Generate a version 4 signature packet. @param signatureType @param keyAlgorithm @param hashAlgorithm @param hashedData @param unhashedData @param fingerprint @param signature Generate a version 2/3 signature packet. @param signatureType @param keyAlgorithm @param hashAlgorithm @param fingerprint @param signature return the signature trailer that must be included with the data to reconstruct the signature @return byte[] * return the signature as a set of integers - note this is normalised to be the * ASN.1 encoding of what appears in the signature packet. Return the byte encoding of the signature section. @return uninterpreted signature bytes. return the keyId @return the keyId that created the signature. Return the creation time in milliseconds since 1 Jan., 1970 UTC. Base class for an RSA public key. Base class for a PGP object. Base interface for a PGP key. The base format for this key - in the case of the symmetric keys it will generally be raw indicating that the key is just a straight byte representation, for an asymmetric key the format will be PGP, indicating the key is a string of MPIs encoded in PGP format. "RAW" or "PGP". Construct an RSA public key from the passed in stream. The modulus. The public exponent. Return the standard PGP encoding of the key. The format, as a string, always "PGP". Generic signature object The encryption algorithm tag. The hash algorithm tag. Basic tags for hash algorithms. ANS.1 def for Diffie-Hellman key exchange OtherInfo structure. See RFC 2631, or X9.42, for further details. Produce an object suitable for an Asn1OutputStream.
             OtherInfo ::= Sequence {
                 keyInfo KeySpecificInfo,
                 partyAInfo [0] OCTET STRING OPTIONAL,
                 suppPubInfo [2] OCTET STRING
             }
            
Targets structure used in target information extension for attribute certificates from RFC 3281.
                       Targets ::= SEQUENCE OF Target
                      
                       Target  ::= CHOICE {
                         targetName          [0] GeneralName,
                         targetGroup         [1] GeneralName,
                         targetCert          [2] TargetCert
                       }
                      
                       TargetCert  ::= SEQUENCE {
                         targetCertificate    IssuerSerial,
                         targetName           GeneralName OPTIONAL,
                         certDigestInfo       ObjectDigestInfo OPTIONAL
                       }
            
@see org.bouncycastle.asn1.x509.Target @see org.bouncycastle.asn1.x509.TargetInformation
Creates an instance of a Targets from the given object.

obj can be a Targets or a {@link Asn1Sequence}

@param obj The object. @return A Targets instance. @throws ArgumentException if the given object cannot be interpreted as Target.
Constructor from Asn1Sequence. @param targets The ASN.1 SEQUENCE. @throws ArgumentException if the contents of the sequence are invalid. Constructor from given targets.

The ArrayList is copied.

@param targets An ArrayList of {@link Target}s. @see Target @throws ArgumentException if the ArrayList contains not only Targets.
Returns the targets in an ArrayList.

The ArrayList is cloned before it is returned.

@return Returns the targets.
Produce an object suitable for an Asn1OutputStream. Returns:
                       Targets ::= SEQUENCE OF Target
            
@return an Asn1Object
PolicyMappings V3 extension, described in RFC3280.
                PolicyMappings ::= Sequence SIZE (1..MAX) OF Sequence {
                  issuerDomainPolicy      CertPolicyId,
                  subjectDomainPolicy     CertPolicyId }
             
@see RFC 3280, section 4.2.1.6
Creates a new PolicyMappings instance. @param seq an Asn1Sequence constructed as specified in RFC 3280 Creates a new PolicyMappings instance. @param mappings a HashMap value that maps string oids to other string oids. create a cA=true object for the given path length constraint. @param pathLenConstraint Produce an object suitable for an Asn1OutputStream.
            BasicConstraints := Sequence {
               cA                  Boolean DEFAULT FALSE,
               pathLenConstraint   Integer (0..MAX) OPTIONAL
            }
            
the infamous Pfx from Pkcs12 class for breaking up an Oid into it's component tokens, ala java.util.StringTokenizer. We need this class as some of the lightweight Java environment don't support classes like StringTokenizer. The OcspResponseStatus enumeration.
            OcspResponseStatus ::= Enumerated {
                successful            (0),  --Response has valid confirmations
                malformedRequest      (1),  --Illegal confirmation request
                internalError         (2),  --Internal error in issuer
                tryLater              (3),  --Try again later
                                            --(4) is not used
                sigRequired           (5),  --Must sign the request
                unauthorized          (6)   --Request unauthorized
            }
            
Produce an object suitable for an Asn1OutputStream.
            CrlID ::= Sequence {
                crlUrl               [0]     EXPLICIT IA5String OPTIONAL,
                crlNum               [1]     EXPLICIT Integer OPTIONAL,
                crlTime              [2]     EXPLICIT GeneralizedTime OPTIONAL }
            
Produce an object suitable for an Asn1OutputStream.
            CertID          ::=     Sequence {
                hashAlgorithm       AlgorithmIdentifier,
                issuerNameHash      OCTET STRING, -- Hash of Issuer's DN
                issuerKeyHash       OCTET STRING, -- Hash of Issuers public key
                serialNumber        CertificateSerialNumber }
            
a general purpose ASN.1 decoder - note: this class differs from the others in that it returns null after it has read the last object in the stream. If an ASN.1 Null is encountered a Der/BER Null object is returned. Create an ASN1InputStream where no DER object will be longer than limit. @param input stream containing ASN.1 encoded data. @param limit maximum size of a DER encoded object. Create an ASN1InputStream based on the input byte array. The length of DER objects in the stream is automatically limited to the length of the input array. @param input array containing ASN.1 encoded data. constructors The definition of OtherSigningCertificate is
            OtherSigningCertificate ::=  SEQUENCE {
                 certs        SEQUENCE OF OtherCertID,
                 policies     SEQUENCE OF PolicyInformation OPTIONAL
            }
            
id-aa-ets-otherSigCert OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) smime(16) id-aa(2) 19 }
RFC 3126: 4.2.1 Complete Certificate Refs Attribute Definition CompleteCertificateRefs ::= SEQUENCE OF OtherCertID Commitment type qualifiers, used in the Commitment-Type-Indication attribute (RFC3126).
               CommitmentTypeQualifier ::= SEQUENCE {
                   commitmentTypeIdentifier  CommitmentTypeIdentifier,
                   qualifier          ANY DEFINED BY commitmentTypeIdentifier OPTIONAL }
             
Creates a new CommitmentTypeQualifier instance. @param commitmentTypeIdentifier a CommitmentTypeIdentifier value Creates a new CommitmentTypeQualifier instance. @param commitmentTypeIdentifier a CommitmentTypeIdentifier value @param qualifier the qualifier, defined by the above field. Creates a new CommitmentTypeQualifier instance. @param as CommitmentTypeQualifier structure encoded as an Asn1Sequence. Returns a DER-encodable representation of this instance. @return a Asn1Object value The octets making up the octet string.
            EncryptedContentInfo ::= SEQUENCE {
                contentType ContentType,
                contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
                encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
            }
            
return an EncryptedContentInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            EncryptedContentInfo ::= Sequence {
                contentType ContentType,
                contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
                encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
            }
            
Return all the attributes matching the OBJECT IDENTIFIER oid. The vector will be empty if there are no attributes of the required type present. @param oid type of attribute required. @return a vector of all the attributes found of type oid. Return the first attribute matching the given OBJECT IDENTIFIER The following extensions are listed in RFC 2459 as relevant to CRL Entries ReasonCode Hode Instruction Code Invalidity Date Certificate Issuer (critical) Constructor for CRLEntries of indirect CRLs. If isIndirect is false {@link #getCertificateIssuer()} will always return null, previousCertificateIssuer is ignored. If this isIndirect is specified and this CrlEntry has no certificate issuer CRL entry extension previousCertificateIssuer is returned by {@link #getCertificateIssuer()}. @param c TbsCertificateList.CrlEntry object. @param isIndirect true if the corresponding CRL is a indirect CRL. @param previousCertificateIssuer Certificate issuer of the previous CrlEntry. This class contains a cross certificate pair. Cross certificates pairs may contain two cross signed certificates from two CAs. A certificate from the other CA to this CA is contained in the forward certificate, the certificate from this CA to the other CA is contained in the reverse certificate. Constructor Certificate from the other CA to this CA. Certificate from this CA to the other CA. Constructor from a ASN.1 CertificatePair structure. The CertificatePair ASN.1 object. Returns the certificate from the other CA to this CA. Returns the certificate from this CA to the other CA. A factory to produce Public Key Info Objects. Create a Subject Public Key Info object for a given public key. One of ElGammalPublicKeyParameters, DSAPublicKeyParameter, DHPublicKeyParameters, RsaKeyParameters or ECPublicKeyParameters A subject public key info object. Throw exception if object provided is not one of the above. A simple collection backed store. Basic constructor. @param collection - initial contents for the store, this is copied. Return the matches in the collection for the passed in selector. @param selector the selector to match against. @return a possibly empty collection of matching objects. This class is an Selector like implementation to select attribute certificates from a given set of criteria. @see org.bouncycastle.x509.X509AttributeCertificate @see org.bouncycastle.x509.X509Store Decides if the given attribute certificate should be selected. The attribute certificate to be checked. true if the object matches this selector. Adds a target name criterion for the attribute certificate to the target information extension criteria. The X509AttributeCertificate must contain at least one of the specified target names.

Each attribute certificate may contain a target information extension limiting the servers where this attribute certificate can be used. If this extension is not present, the attribute certificate is not targeted and may be accepted by any server.

@param name The name as a GeneralName (not null)
Adds a target name criterion for the attribute certificate to the target information extension criteria. The X509AttributeCertificate must contain at least one of the specified target names.

Each attribute certificate may contain a target information extension limiting the servers where this attribute certificate can be used. If this extension is not present, the attribute certificate is not targeted and may be accepted by any server.

@param name a byte array containing the name in ASN.1 DER encoded form of a GeneralName @throws IOException if a parsing error occurs.
Adds a collection with target names criteria. If null is given any will do.

The collection consists of either GeneralName objects or byte[] arrays representing DER encoded GeneralName structures.

@param names A collection of target names. @throws IOException if a parsing error occurs. @see #AddTargetName(byte[]) @see #AddTargetName(GeneralName)
Gets the target names. The collection consists of Lists made up of an Integer in the first entry and a DER encoded byte array or a String in the second entry.

The returned collection is immutable.

@return The collection of target names @see #setTargetNames(Collection)
Adds a target group criterion for the attribute certificate to the target information extension criteria. The X509AttributeCertificate must contain at least one of the specified target groups.

Each attribute certificate may contain a target information extension limiting the servers where this attribute certificate can be used. If this extension is not present, the attribute certificate is not targeted and may be accepted by any server.

@param group The group as GeneralName form (not null)
Adds a target group criterion for the attribute certificate to the target information extension criteria. The X509AttributeCertificate must contain at least one of the specified target groups.

Each attribute certificate may contain a target information extension limiting the servers where this attribute certificate can be used. If this extension is not present, the attribute certificate is not targeted and may be accepted by any server.

@param name a byte array containing the group in ASN.1 DER encoded form of a GeneralName @throws IOException if a parsing error occurs.
Adds a collection with target groups criteria. If null is given any will do.

The collection consists of GeneralName objects or byte[] representing DER encoded GeneralNames.

@param names A collection of target groups. @throws IOException if a parsing error occurs. @see #AddTargetGroup(byte[]) @see #AddTargetGroup(GeneralName)
Gets the target groups. The collection consists of Lists made up of an Integer in the first entry and a DER encoded byte array or a String in the second entry.

The returned collection is immutable.

@return The collection of target groups. @see #setTargetGroups(Collection)
The attribute certificate which must be matched. If null is given, any will do. The criteria for validity If null is given any will do. The holder. If null is given any will do. The issuer. If null is given any will do. The serial number. If null is given any will do. Validate the given IPv4 or IPv6 address. @param address the IP address as a string. @return true if a valid address, false otherwise Validate the given IPv4 or IPv6 address and netmask. @param address the IP address as a string. @return true if a valid address with netmask, false otherwise Validate the given IPv4 address. @param address the IP address as a string. @return true if a valid IPv4 address, false otherwise Validate the given IPv6 address. @param address the IP address as a string. @return true if a valid IPv4 address, false otherwise Convert binary data to and from UrlBase64 encoding. This is identical to Base64 encoding, except that the padding character is "." and the other non-alphanumeric characters are "-" and "_" instead of "+" and "/".

The purpose of UrlBase64 encoding is to provide a compact encoding of binary data that is safe for use as an URL parameter. Base64 encoding does not produce encoded values that are safe for use in URLs, since "/" can be interpreted as a path delimiter; "+" is the encoded form of a space; and "=" is used to separate a name from the corresponding value in an URL parameter.

Encode and decode byte arrays (typically from binary to 7-bit ASCII encodings). encode the input data producing a base 64 output stream. @return the number of bytes produced. decode the base 64 encoded byte data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. decode the base 64 encoded string data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. Utility class for creating IWrapper objects from their names/Oids The name of the algorithm this cipher implements. Generator for old style PGP V3 Signatures. Create a generator for the passed in keyAlgorithm and hashAlgorithm codes. Initialise the generator for signing. Initialise the generator for signing. Return the one pass header associated with the current signature. Return a V3 signature object containing the current signature state. Generator for signature subpackets. Add a TrustSignature packet to the signature. The values for depth and trust are largely installation dependent but there are some guidelines in RFC 4880 - 5.2.3.13. true if the packet is critical. depth level. trust amount. Set the number of seconds a key is valid for after the time of its creation. A value of zero means the key never expires. True, if should be treated as critical, false otherwise. The number of seconds the key is valid, or zero if no expiry. Set the number of seconds a signature is valid for after the time of its creation. A value of zero means the signature never expires. True, if should be treated as critical, false otherwise. The number of seconds the signature is valid, or zero if no expiry. Set the creation time for the signature.

Note: this overrides the generation of a creation time when the signature is generated.

General class to contain a private key for use with other OpenPGP objects. Create a PgpPrivateKey from a regular private key and the ID of its associated public key. Private key to use. ID of the corresponding public key. The keyId associated with the contained private key. The contained private key. Thrown if the IV at the start of a data stream indicates the wrong key is being used. Generic exception class for PGP encoding/decoding problems. base class for points on elliptic curves. Sets the PreCompInfo. Used by ECMultipliers to save the precomputation for this ECPoint to store the precomputation result for use by subsequent multiplication. @param preCompInfo The values precomputed by the ECMultiplier. Sets the appropriate ECMultiplier, unless already set. return the field element encoded with point compression. (S 4.3.6) Multiplies this ECPoint by the given number. @param k The multiplicator. @return k * this. Elliptic curve points over Fp Create a point which encodes with point compression. @param curve the curve to use @param x affine x co-ordinate @param y affine y co-ordinate Create a point that encodes with or without point compresion. @param curve the curve to use @param x affine x co-ordinate @param y affine y co-ordinate @param withCompression if true encode with point compression Elliptic curve points over F2m @param curve base curve @param x x point @param y y point @param curve base curve @param x x point @param y y point @param withCompression true if encode with point compression. Constructor for point at infinity Check, if two ECPoints can be added or subtracted. @param a The first ECPoint to check. @param b The second ECPoint to check. @throws IllegalArgumentException if a and b cannot be added. Adds another ECPoints.F2m to this without checking if both points are on the same curve. Used by multiplication algorithms, because there all points are a multiple of the same point and hence the checks can be omitted. @param b The other ECPoints.F2m to add to this. @return this + b Subtracts another ECPoints.F2m from this without checking if both points are on the same curve. Used by multiplication algorithms, because there all points are a multiple of the same point and hence the checks can be omitted. @param b The other ECPoints.F2m to subtract from this. @return this - b return a sqrt root - the routine verifies that the calculation returns the right value - if none exists it returns null. return the field name for this field. @return the string "Fp". Class representing the Elements of the finite field F2m in polynomial basis (PB) representation. Both trinomial (Tpb) and pentanomial (Ppb) polynomial basis representations are supported. Gaussian normal basis (GNB) representation is not supported. Indicates gaussian normal basis representation (GNB). Number chosen according to X9.62. GNB is not implemented at present. Indicates trinomial basis representation (Tpb). Number chosen according to X9.62. Indicates pentanomial basis representation (Ppb). Number chosen according to X9.62. Tpb or Ppb. The exponent m of F2m. Tpb: The integer k where xm + xk + 1 represents the reduction polynomial f(z).
Ppb: The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
Tpb: Always set to 0
Ppb: The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
Tpb: Always set to 0
Ppb: The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
The IntArray holding the bits. The number of ints required to hold m bits. Constructor for Ppb. @param m The exponent m of F2m. @param k1 The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k2 The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k3 The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param x The BigInteger representing the value of the field element. Constructor for Tpb. @param m The exponent m of F2m. @param k The integer k where xm + xk + 1 represents the reduction polynomial f(z). @param x The BigInteger representing the value of the field element. Checks, if the ECFieldElements a and b are elements of the same field F2m (having the same representation). @param a field element. @param b field element to be compared. @throws ArgumentException if a and b are not elements of the same field F2m (having the same representation). @return the representation of the field F2m, either of {@link F2mFieldElement.Tpb} (trinomial basis representation) or {@link F2mFieldElement.Ppb} (pentanomial basis representation). @return the degree m of the reduction polynomial f(z). @return Tpb: The integer k where xm + xk + 1 represents the reduction polynomial f(z).
Ppb: The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
@return Tpb: Always returns 0
Ppb: The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
@return Tpb: Always set to 0
Ppb: The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
Class representing an element of Z[τ]. Let λ be an element of Z[τ]. Then λ is given as λ = u + vτ. The components u and v may be used directly, there are no accessor methods. Immutable class. The "real" part of λ. The "τ-adic" part of λ. Constructor for an element λ of Z[τ]. @param u The "real" part of λ. @param v The "τ-adic" part of λ. A representation for a certificate chain as used by an tls server. The certificates. Parse the ServerCertificate message. @param is The stream where to parse from. @return A Certificate object with the certs, the server has sended. @throws IOException If something goes wrong during parsing. Private constructure from an cert array. @param certs The certs the chain should contain. An array which contains the certs, this chain contains. Initialise the signer for signing or verification. @param forSigning true if for signing, false otherwise @param param necessary parameters. update the internal digest with the byte b update the internal digest with the byte array in Generate a signature for the message we've been loaded with using the key we were initialised with. return true if the internal state represents the signature described in the passed in array. reset the internal state Return the name of the algorithm the signer implements. @return the name of the algorithm the signer implements. Load oid table. Initialise the signer for signing or verification. @param forSigning true if for signing, false otherwise @param param necessary parameters. update the internal digest with the byte b update the internal digest with the byte array in Generate a signature for the message we've been loaded with using the key we were initialised with. return true if the internal state represents the signature described in the passed in array. A thread based seed generator - one source of randomness.

Based on an idea from Marcus Lippert.

Generate seed bytes. Set fast to false for best quality.

If fast is set to true, the code should be round about 8 times faster when generating a long sequence of random bytes. 20 bytes of random values using the fast mode take less than half a second on a Nokia e70. If fast is set to false, it takes round about 2500 ms.

@param numBytes the number of bytes to generate @param fast true if fast mode should be used
A block cipher mode that includes authenticated encryption with a streaming mode and optional associated data. Initialise the cipher. Parameter can either be an AeadParameters or a ParametersWithIV object. Initialise for encryption if true, for decryption if false. The key or other data required by the cipher. The block size for this cipher, in bytes. Encrypt/decrypt a single byte. @param input the byte to be processed. @param outBytes the output buffer the processed byte goes into. @param outOff the offset into the output byte array the processed data starts at. @return the number of bytes written to out. @exception DataLengthException if the output buffer is too small. Process a block of bytes from in putting the result into out. @param inBytes the input byte array. @param inOff the offset into the in array where the data to be processed starts. @param len the number of bytes to be processed. @param outBytes the output buffer the processed bytes go into. @param outOff the offset into the output byte array the processed data starts at. @return the number of bytes written to out. @exception DataLengthException if the output buffer is too small. Finish the operation either appending or verifying the MAC at the end of the data. @param outBytes space for any resulting output data. @param outOff offset into out to start copying the data at. @return number of bytes written into out. @throws InvalidOperationException if the cipher is in an inappropriate state. @throws InvalidCipherTextException if the MAC fails to match. Return the value of the MAC associated with the last stream processed. @return MAC for plaintext data. Return the size of the output buffer required for a ProcessBytes an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to ProcessBytes with len bytes of input. Return the size of the output buffer required for a ProcessBytes plus a DoFinal with an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to ProcessBytes and DoFinal with len bytes of input. Reset the cipher to the same state as it was after the last init (if there was one). The name of the algorithm this cipher implements. implements the GOST 28147 OFB counter mode (GCTR). Basic constructor. @param cipher the block cipher to be used as the basis of the counter mode (must have a 64 bit block size). return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the IV will be all zeros. An IV which is too short is handled in FIPS compliant fashion. @param encrypting if true the cipher is initialised for encryption, if false for decryption. @param parameters the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the block size we are operating at (in bytes). @return the block size we are operating at (in bytes). Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. reset the feedback vector back to the IV and reset the underlying cipher. return the algorithm name and mode. @return the name of the underlying algorithm followed by "/GCTR" and the block size in bits * Implements the Counter with Cipher Block Chaining mode (CCM) detailed in * NIST Special Publication 800-38C. *

* Note: this mode is a packet mode - it needs all the data up front. *

Basic constructor. @param cipher the block cipher to be used. return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. Returns a byte array containing the mac calculated as part of the last encrypt or decrypt operation. @return the last mac calculated. Generate a random factor suitable for use with RSA blind signatures as outlined in Chaum's blinding and unblinding as outlined in "Handbook of Applied Cryptography", page 475. Initialise the factor generator @param param the necessary RSA key parameters. Generate a suitable blind factor for the public key the generator was initialised with. @return a random blind factor a GOST3410 key pair generator. This generates GOST3410 keys in line with the method described in GOST R 34.10-94. interface that a public/private key pair generator should conform to. intialise the key pair generator. @param the parameters the key pair is to be initialised with. return an AsymmetricCipherKeyPair containing the Generated keys. @return an AsymmetricCipherKeyPair containing the Generated keys. An TEA engine. Create an instance of the TEA encryption algorithm and set some defaults initialise @param forEncryption whether or not we are for encryption. @param params the parameters required to set up the cipher. @exception ArgumentException if the params argument is inappropriate. Re-key the cipher. @param key the key to be used The specification for RC5 came from the RC5 Encryption Algorithm publication in RSA CryptoBytes, Spring of 1995. http://www.rsasecurity.com/rsalabs/cryptobytes.

This implementation has a word size of 32 bits.

Create an instance of the RC5 encryption algorithm and set some defaults initialise a RC5-32 cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Re-key the cipher. @param key the key to be used Encrypt the given block starting at the given offset and place the result in the provided buffer starting at the given offset. @param in in byte buffer containing data to encrypt @param inOff offset into src buffer @param out out buffer where encrypted data is written @param outOff offset into out buffer Perform a left "spin" of the word. The rotation of the given word x is rotated left by y bits. Only the lg(32) low-order bits of y are used to determine the rotation amount. Here it is assumed that the wordsize used is a power of 2. @param x word to rotate @param y number of bits to rotate % 32 Perform a right "spin" of the word. The rotation of the given word x is rotated left by y bits. Only the lg(32) low-order bits of y are used to determine the rotation amount. Here it is assumed that the wordsize used is a power of 2. @param x word to rotate @param y number of bits to rotate % 32 A class that provides CAST key encryption operations, such as encoding data and generating keys. All the algorithms herein are from the Internet RFC's RFC2144 - Cast5 (64bit block, 40-128bit key) RFC2612 - CAST6 (128bit block, 128-256bit key) and implement a simplified cryptography interface. initialise a CAST cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Encrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. @param src The plaintext buffer @param srcIndex An offset into src @param dst The ciphertext buffer @param dstIndex An offset into dst Decrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. @param src The plaintext buffer @param srcIndex An offset into src @param dst The ciphertext buffer @param dstIndex An offset into dst The first of the three processing functions for the encryption and decryption. @param D the input to be processed @param Kmi the mask to be used from Km[n] @param Kri the rotation value to be used The second of the three processing functions for the encryption and decryption. @param D the input to be processed @param Kmi the mask to be used from Km[n] @param Kri the rotation value to be used The third of the three processing functions for the encryption and decryption. @param D the input to be processed @param Kmi the mask to be used from Km[n] @param Kri the rotation value to be used Does the 16 rounds to encrypt the block. @param L0 the LH-32bits of the plaintext block @param R0 the RH-32bits of the plaintext block SHA-224 as described in RFC 3874
                    block  word  digest
            SHA-1   512    32    160
            SHA-224 512    32    224
            SHA-256 512    32    256
            SHA-384 1024   64    384
            SHA-512 1024   64    512
            
Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables implementation of RipeMD128 Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. Return the first RecipientInformation object that matches the passed in selector. Null if there are no matches. @param selector to identify a recipient @return a single RecipientInformation object. Null if none matches. Return all recipients in the collection @return a collection of recipients. Return possible empty collection with recipients matching the passed in RecipientID @param selector a recipient id to select against. @return a collection of RecipientInformation objects. Return the number of recipients in the collection. @return number of recipients identified. the KeyTransRecipientInformation class for a recipient who has been sent a secret key encrypted using their public key that needs to be used to extract the message. decrypt the content and return it as a byte array. the RecipientInfo class for a recipient who has been sent a message encrypted using a secret key known to the other side. decrypt the content and return an input stream. General class for generating a pkcs7-signature message stream.

A simple example of usage.

                  IX509Store                   certs...
                  CmsSignedDataStreamGenerator gen = new CmsSignedDataStreamGenerator();
            
                  gen.AddSigner(privateKey, cert, CmsSignedDataStreamGenerator.DIGEST_SHA1);
            
                  gen.AddCertificates(certs);
            
                  Stream sigOut = gen.Open(bOut);
            
                  sigOut.Write(Encoding.UTF8.GetBytes("Hello World!"));
            
                  sigOut.Close();
             
Constructor allowing specific source of randomness Instance of SecureRandom to use. Set the underlying string size for encapsulated data @param bufferSize length of octet strings to buffer the data. add a signer - no attributes other than the default ones will be provided here. @throws NoSuchAlgorithmException @throws InvalidKeyException add a signer with extra signed/unsigned attributes. @throws NoSuchAlgorithmException @throws InvalidKeyException generate a signed object that for a CMS Signed Data object generate a signed object that for a CMS Signed Data object - if encapsulate is true a copy of the message will be included in the signature with the default content type "data". generate a signed object that for a CMS Signed Data object using the given provider - if encapsulate is true a copy of the message will be included in the signature with the default content type "data". If dataOutputStream is non null the data being signed will be written to the stream as it is processed. @param out stream the CMS object is to be written to. @param encapsulate true if data should be encapsulated. @param dataOutputStream output stream to copy the data being signed to. generate a signed object that for a CMS Signed Data object - if encapsulate is true a copy of the message will be included in the signature. The content type is set according to the OID represented by the string signedContentType. generate a signed object that for a CMS Signed Data object using the given provider - if encapsulate is true a copy of the message will be included in the signature. The content type is set according to the OID represented by the string signedContentType. @param out stream the CMS object is to be written to. @param signedContentType OID for data to be signed. @param encapsulate true if data should be encapsulated. @param dataOutputStream output stream to copy the data being signed to. Class for reading a CMS Compressed Data stream.
                 CMSCompressedDataParser cp = new CMSCompressedDataParser(inputStream);
            
                 process(cp.GetContent().GetContentStream());
             
Note: this class does not introduce buffering - if you are processing large files you should create the parser with:
                  CMSCompressedDataParser     ep = new CMSCompressedDataParser(new BufferedInputStream(inputStream, bufSize));
              
where bufSize is a suitably large buffer size.
Close the underlying data stream. @throws IOException if the close fails. reader for user attribute sub-packets Basic packet for a PGP secret key. Basic packet for a PGP secret key. Basic packet for a PGP public subkey Basic packet for a PGP public key. Construct a version 4 public key packet. Construct a version 4 public subkey packet. Base class for an ElGamal public key. Return the standard PGP encoding of the key. The format, as a string, always "PGP". UserNotice class, used in CertificatePolicies X509 extensions (in policy qualifiers).
             UserNotice ::= Sequence {
                  noticeRef        NoticeReference OPTIONAL,
                  explicitText     DisplayText OPTIONAL}
            
             
@see PolicyQualifierId @see PolicyInformation
Creates a new UserNotice instance. @param noticeRef a NoticeReference value @param explicitText a DisplayText value Creates a new UserNotice instance. @param noticeRef a NoticeReference value @param str the explicitText field as a string. Creates a new UserNotice instance.

Useful from reconstructing a UserNotice instance from its encodable/encoded form. @param as an ASN1Sequence value obtained from either calling @{link toASN1Object()} for a UserNotice instance or from parsing it from a DER-encoded stream.

NoticeReference class, used in CertificatePolicies X509 V3 extensions (in policy qualifiers).
              NoticeReference ::= Sequence {
                  organization     DisplayText,
                  noticeNumbers    Sequence OF Integer }
            
             
@see PolicyQualifierInfo @see PolicyInformation
Creates a new NoticeReference instance. @param orgName a string value @param numbers a ArrayList value Creates a new NoticeReference instance. @param orgName a string value @param numbers an Asn1Sequence value Creates a new NoticeReference instance. @param displayTextType an int value @param orgName a string value @param numbers an Asn1Sequence value Creates a new NoticeReference instance.

Useful for reconstructing a NoticeReference instance from its encodable/encoded form.

@param as an Asn1Sequence value obtained from either calling @{link ToAsn1Object()} for a NoticeReference instance or from parsing it from a Der-encoded stream.
Describe ToAsn1Object method here. @return a Asn1Object value
            IssuingDistributionPoint ::= SEQUENCE { 
              distributionPoint          [0] DistributionPointName OPTIONAL, 
              onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE, 
              onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE, 
              onlySomeReasons            [3] ReasonFlags OPTIONAL, 
              indirectCRL                [4] BOOLEAN DEFAULT FALSE,
              onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
            
Constructor from given details. @param distributionPoint May contain an URI as pointer to most current CRL. @param onlyContainsUserCerts Covers revocation information for end certificates. @param onlyContainsCACerts Covers revocation information for CA certificates. @param onlySomeReasons Which revocation reasons does this point cover. @param indirectCRL If true then the CRL contains revocation information about certificates ssued by other CAs. @param onlyContainsAttributeCerts Covers revocation information for attribute certificates. Constructor from Asn1Sequence @return Returns the distributionPoint. @return Returns the onlySomeReasons. The CRLNumber object.
            CRLNumber::= Integer(0..MAX)
            
return an integer from the passed in object @exception ArgumentException if the object cannot be converted. return an Integer from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. in some cases positive values Get crammed into a space, that's not quite big enough... @param o @return a MessageImprint object.
               MessageImprint ::= SEQUENCE  {
                  hashAlgorithm                AlgorithmIdentifier,
                  hashedMessage                OCTET STRING  }
            
return an Attr object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            Attr ::= Sequence {
                attrType OBJECT IDENTIFIER,
                attrValues Set OF AttributeValue
            }
            
Produce an object suitable for an Asn1OutputStream.
                 AlgorithmIdentifier ::= Sequence {
                                       algorithm OBJECT IDENTIFIER,
                                       parameters ANY DEFINED BY algorithm OPTIONAL }
            
Produce an object suitable for an Asn1OutputStream.
             EncryptedPrivateKeyInfo ::= Sequence {
                  encryptionAlgorithm AlgorithmIdentifier {{KeyEncryptionAlgorithms}},
                  encryptedData EncryptedData
             }
            
             EncryptedData ::= OCTET STRING
            
             KeyEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {
                      ... -- For local profiles
             }
             
The EncryptedData object.
                  EncryptedData ::= Sequence {
                       version Version,
                       encryptedContentInfo EncryptedContentInfo
                  }
            
            
                  EncryptedContentInfo ::= Sequence {
                      contentType ContentType,
                      contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,
                      encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
                }
            
                EncryptedContent ::= OCTET STRING
             
return an Attribute object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            Attr ::= Sequence {
                attrType OBJECT IDENTIFIER,
                attrValues Set OF AttributeValue
            }
            
Produce an object suitable for an Asn1OutputStream.
            ResponseData ::= Sequence {
                version              [0] EXPLICIT Version DEFAULT v1,
                responderID              ResponderID,
                producedAt               GeneralizedTime,
                responses                Sequence OF SingleResponse,
                responseExtensions   [1] EXPLICIT Extensions OPTIONAL }
            
This is designed to parse the PublicKeyAndChallenge created by the KEYGEN tag included by Mozilla based browsers.
              PublicKeyAndChallenge ::= SEQUENCE {
                spki SubjectPublicKeyInfo,
                challenge IA5STRING
              }
            
              
Produce an object suitable for an Asn1OutputStream.
            cast5CBCParameters ::= Sequence {
                                      iv         OCTET STRING DEFAULT 0,
                                             -- Initialization vector
                                      keyLength  Integer
                                             -- Key length, in bits
                                 }
            
An Admissions structure.

                        Admissions ::= SEQUENCE
                        {
                          admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
                          namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
                          professionInfos SEQUENCE OF ProfessionInfo
                        }
             

@see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax @see Org.BouncyCastle.Asn1.IsisMtt.X509.ProfessionInfo @see Org.BouncyCastle.Asn1.IsisMtt.X509.NamingAuthority
Constructor from Asn1Sequence.

The sequence is of type ProcurationSyntax:

                        Admissions ::= SEQUENCE
                        {
                          admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
                          namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
                          professionInfos SEQUENCE OF ProfessionInfo
                        }
             
@param seq The ASN.1 sequence.
Constructor from a given details.

Parameter professionInfos is mandatory. @param admissionAuthority The admission authority. @param namingAuthority The naming authority. @param professionInfos The profession infos. Produce an object suitable for an Asn1OutputStream.

Returns:

                   Admissions ::= SEQUENCE
                   {
                     admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
                     namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
                     professionInfos SEQUENCE OF ProfessionInfo
                   }
             

@return an Asn1Object
ISIS-MTT PROFILE: The responder may include this extension in a response to send the hash of the requested certificate to the responder. This hash is cryptographically bound to the certificate and serves as evidence that the certificate is known to the responder (i.e. it has been issued and is present in the directory). Hence, this extension is a means to provide a positive statement of availability as described in T8.[8]. As explained in T13.[1], clients may rely on this information to be able to validate signatures after the expiry of the corresponding certificate. Hence, clients MUST support this extension. If a positive statement of availability is to be delivered, this extension syntax and OID MUST be used.

                CertHash ::= SEQUENCE {
                  hashAlgorithm AlgorithmIdentifier,
                  certificateHash OCTET STRING
                }
            
Constructor from Asn1Sequence.

The sequence is of type CertHash:

                 CertHash ::= SEQUENCE {
                   hashAlgorithm AlgorithmIdentifier,
                   certificateHash OCTET STRING
                 }
             
@param seq The ASN.1 sequence.
Constructor from a given details. @param hashAlgorithm The hash algorithm identifier. @param certificateHash The hash of the whole DER encoding of the certificate. Produce an object suitable for an Asn1OutputStream.

Returns:

                 CertHash ::= SEQUENCE {
                   hashAlgorithm AlgorithmIdentifier,
                   certificateHash OCTET STRING
                 }
             
@return an Asn1Object
Der UniversalString object. return a Universal string from the passed in object. @exception ArgumentException if the object cannot be converted. return a Universal string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - byte encoded string. Produce an object suitable for an Asn1OutputStream.
            RecipientInfo ::= CHOICE {
                ktri KeyTransRecipientInfo,
                kari [1] KeyAgreeRecipientInfo,
                kekri [2] KekRecipientInfo,
                pwri [3] PasswordRecipientInfo,
                ori [4] OtherRecipientInfo }
            
RFC 3274 - CMS Compressed Data.
            CompressedData ::= Sequence {
             version CMSVersion,
             compressionAlgorithm CompressionAlgorithmIdentifier,
             encapContentInfo EncapsulatedContentInfo
            }
            
return a CompressedData object from a tagged object. @param ato the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a CompressedData object from the given object. @param _obj the object we want converted. @exception ArgumentException if the object cannot be converted. return an ASN1Set from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Return an ASN1 set from a tagged object. There is a special case here, if an object appears to have been explicitly tagged on reading but we were expecting it to be implicitly tagged in the normal course of events it indicates that we lost the surrounding set - so we need to add it back (this will happen if the tagged object is a sequence that contains other sequences). If you are dealing with implicitly tagged sets you really should be using this method. @param obj the tagged object. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. return true if a <= b (arrays are assumed padded with zeros). return the object at the set position indicated by index. @param index the set number (starting at zero) of the object @return the object at the set position indicated by index. A simple class the hold and calculate the CRC for sanity checking of the data. @author Keiron Liddle An Object representing an X509 Certificate. Has static methods for loading Certificates encoded in many forms that return X509Certificate Objects. Return true if the nominated time is within the start and end times nominated on the certificate. The time to test validity against. True if certificate is valid for nominated time. Checks if the current date is within certificate's validity period. Checks if the given date is within certificate's validity period. if the certificate is expired by given date if the certificate is not yet valid on given date Return the Der encoded TbsCertificate data. This is the certificate component less the signature. To Get the whole certificate call the GetEncoded() member. A byte array containing the Der encoded Certificate component. The signature. A byte array containg the signature of the certificate. Get the signature algorithms parameters. (EG DSA Parameters) A byte array containing the Der encoded version of the parameters or null if there are none. Get a key usage guidlines. Get the public key of the subject of the certificate. The public key parameters. Return a Der encoded version of this certificate. A byte array. Verify the certificate's signature using the nominated public key. An appropriate public key parameter object, RsaPublicKeyParameters, DsaPublicKeyParameters or ECDsaPublicKeyParameters True if the signature is valid. If key submitted is not of the above nominated types. Return true if the current time is within the start and end times nominated on the certificate. true id certificate is valid for the current time. Return the certificate's version. An integer whose value Equals the version of the cerficate. Return a BigInteger containing the serial number. The Serial number. Get the Issuer Distinguished Name. (Who signed the certificate.) And X509Object containing name and value pairs. Get the subject of this certificate. An X509Name object containing name and value pairs. The time that this certificate is valid from. A DateTime object representing that time in the local time zone. The time that this certificate is valid up to. A DateTime object representing that time in the local time zone. A meaningful version of the Signature Algorithm. (EG SHA1WITHRSA) A sting representing the signature algorithm. Get the Signature Algorithms Object ID. A string containg a '.' separated object id. Get the issuers UID. A DerBitString. Get the subjects UID. A DerBitString. A hex translator. Translator interface. Return encoded block size. 2 Encode some data. Input data array. Start position within input data array. The amount of data to process. The output data array. The offset within the output data array to start writing from. Amount of data encoded. Returns the decoded block size. 1 Decode data from a byte array. The input data array. Start position within input data array. The amounty of data to process. The output data array. The position within the output data array to start writing from. The amount of data written. return the ASN.1 encoded representation of this object. Class implementing the WNAF (Window Non-Adjacent Form) multiplication algorithm. Computes the Window NAF (non-adjacent Form) of an integer. @param width The width w of the Window NAF. The width is defined as the minimal number w, such that for any w consecutive digits in the resulting representation, at most one is non-zero. @param k The integer of which the Window NAF is computed. @return The Window NAF of the given width, such that the following holds: k = −i=0l-1 ki2i , where the ki denote the elements of the returned sbyte[]. Multiplies this by an integer k using the Window NAF method. @param k The integer by which this is multiplied. @return A new ECPoint which equals this multiplied by k. A generic TLS MAC implementation, which can be used with any kind of IDigest to act as an HMAC. Generate a new instance of an TlsMac. @param digest The digest to use. @param key_block A byte-array where the key for this mac is located. @param offset The number of bytes to skip, before the key starts in the buffer. @param len The length of the key. Calculate the mac for some given data.

TlsMac will keep track of the sequence number internally. @param type The message type of the message. @param message A byte-buffer containing the message. @param offset The number of bytes to skip, before the message starts. @param len The length of the message. @return A new byte-buffer containing the mac value. @return The Keysize of the mac. This should be implemented by any class which can find out, if a given certificate chain is beeing accepted by an client. The certs, which are part of the chain. True, if the chain is accepted, false otherwise A certificate verifyer, that will always return true.

            DO NOT USE THIS FILE UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING.
            
Return true. ISO9796-2 - mechanism using a hash function with recovery (scheme 1) Signer with message recovery. Returns true if the signer has recovered the full message as part of signature verification. @return true if full message recovered. Returns a reference to what message was recovered (if any). @return full/partial message, null if nothing. Return a reference to the recoveredMessage message. The full/partial recoveredMessage message. Generate a signer for the with either implicit or explicit trailers for ISO9796-2. base cipher to use for signature creation/verification digest to use. whether or not the trailer is implicit or gives the hash. Constructor for a signer with an explicit digest trailer. cipher to use. digest to sign with. compare two byte arrays. clear possible sensitive data update the internal digest with the byte b update the internal digest with the byte array in reset the internal state Generate a signature for the loaded message using the key we were initialised with. return true if the signature represents a ISO9796-2 signature for the passed in message. Return true if the full message was recoveredMessage. true on full message recovery, false otherwise. Parameters for mask derivation functions. DES has 16 weak keys. This method will check if the given DES key material is weak or semi-weak. Key material that is too short is regarded as weak.

See "Applied Cryptography" by Bruce Schneier for more information.

@return true if the given DES key material is weak or semi-weak, false otherwise.
DES Keys use the LSB as the odd parity bit. This can be used to check for corrupt keys. @param bytes the byte array to set the parity on. return true if the passed in key is a DES-EDE weak key. @param key bytes making up the key @param offset offset into the byte array the key starts at @param length number of bytes making up the key return true if the passed in key is a DES-EDE weak key. @param key bytes making up the key @param offset offset into the byte array the key starts at A padder that adds Trailing-Bit-Compliment padding to a block.

This padding pads the block out compliment of the last bit of the plain text.

Initialise the padder. - a SecureRandom if available. add the pad bytes to the passed in block, returning the number of bytes added.

Note: this assumes that the last block of plain text is always passed to it inside in. i.e. if inOff is zero, indicating the entire block is to be overwritten with padding the value of in should be the same as the last block of plain text.

return the number of pad bytes present in the block. Return the name of the algorithm the cipher implements. the name of the algorithm the cipher implements. The base interface for implementations of message authentication codes (MACs). Initialise the MAC. @param param the key and other data required by the MAC. @exception ArgumentException if the parameters argument is inappropriate. Return the block size for this MAC (in bytes). @return the block size for this MAC in bytes. add a single byte to the mac for processing. @param in the byte to be processed. @exception InvalidOperationException if the MAC is not initialised. @param in the array containing the input. @param inOff the index in the array the data begins at. @param len the length of the input starting at inOff. @exception InvalidOperationException if the MAC is not initialised. @exception DataLengthException if there isn't enough data in in. Compute the final stage of the MAC writing the output to the out parameter.

doFinal leaves the MAC in the same state it was after the last init.

@param out the array the MAC is to be output to. @param outOff the offset into the out buffer the output is to start at. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the MAC is not initialised.
Reset the MAC. At the end of resetting the MAC should be in the in the same state it was after the last init (if there was one). Return the name of the algorithm the MAC implements. @return the name of the algorithm the MAC implements. Generator for Pbe derived keys and ivs as defined by Pkcs 12 V1.0.

The document this implementation is based on can be found at RSA's Pkcs12 Page

Construct a Pkcs 12 Parameters generator. @param digest the digest to be used as the source of derived keys. @exception ArgumentException if an unknown digest is passed in. add a + b + 1, returning the result in a. The a value is treated as a BigInteger of length (b.Length * 8) bits. The result is modulo 2^b.Length in case of overflow. generation of a derived key ala Pkcs12 V1.0. Generate a key parameter derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. Generate a key with initialisation vector parameter derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @param ivSize the size of the iv we want (in bits) @return a ParametersWithIV object. Generate a key parameter for use with a MAC derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. a DSA key pair generator. This Generates DSA keys in line with the method described in FIPS 186-2. which Generates the p and g values from the given parameters, returning the DHParameters object.

Note: can take a while...

* Wrap keys according to * * draft-ietf-smime-key-wrap-01.txt. *

* Note: *

    *
  • this is based on a draft, and as such is subject to change - don't use this class for anything requiring long term storage.
  • *
  • if you are using this to wrap triple-des keys you need to set the * parity bits on the key and, if it's a two-key triple-des key, pad it * yourself.
  • *
*

Field engine Field param Field paramPlusIV Field iv Field forWrapping Field IV2 Method init @param forWrapping @param param Method wrap @param in @param inOff @param inLen @return Method unwrap @param in @param inOff @param inLen @return @throws InvalidCipherTextException Some key wrap algorithms make use of the Key Checksum defined in CMS [CMS-Algorithms]. This is used to provide an integrity check value for the key being wrapped. The algorithm is - Compute the 20 octet SHA-1 hash on the key being wrapped. - Use the first 8 octets of this hash as the checksum value. @param key @return @throws Exception @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum @param key @param checksum @return @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum Method GetAlgorithmName @return implementation of MD2 as outlined in RFC1319 by B.Kaliski from RSA Laboratories April 1992 Close the digest, producing the final digest value. The doFinal call leaves the digest reset. @param out the array the digest is to be copied into. @param outOff the offset into the out array the digest is to start at. reset the digest back to it's initial state. update the message digest with a single byte. @param in the input byte to be entered. update the message digest with a block of bytes. @param in the byte array containing the data. @param inOff the offset into the byte array where the data starts. @param len the length of the data. return the algorithm name @return the algorithm name Return the digest algorithm using one of the standard JCA string representations rather than the algorithm identifier (if possible). Return the digest encryption algorithm using one of the standard JCA string representations rather than the algorithm identifier (if possible). a holding class for a byte array of data to be processed. Return a stream from which the data can be read. This routine may be called more than once, but previous returned streams should be closed first. Generic routine to copy out the data we want processed. This routine may be called multiple times. A clone of the byte array General class for generating a CMS enveloped-data message. A simple example of usage.
                  CmsEnvelopedDataGenerator  fact = new CmsEnvelopedDataGenerator();
            
                  fact.AddKeyTransRecipient(cert);
            
                  CmsEnvelopedData         data = fact.Generate(content, algorithm);
             
General class for generating a CMS enveloped-data message. A simple example of usage.
                  CMSEnvelopedDataGenerator  fact = new CMSEnvelopedDataGenerator();
            
                  fact.addKeyTransRecipient(cert);
            
                  CMSEnvelopedData         data = fact.generate(content, algorithm, "BC");
             
Constructor allowing specific source of randomness Instance of SecureRandom to use. add a recipient. @param cert recipient's public key certificate @exception ArgumentException if there is a problem with the certificate add a recipient @param key the public key used by the recipient @param subKeyId the identifier for the recipient's public key @exception ArgumentException if there is a problem with the key add a KEK recipient. @param key the secret key to use for wrapping @param keyIdentifier the byte string that identifies the key Add a key agreement based recipient. @param agreementAlgorithm key agreement algorithm to use. @param senderPrivateKey private key to initialise sender side of agreement with. @param senderPublicKey sender public key to include with message. @param recipientCert recipient's public key certificate. @param cekWrapAlgorithm OID for key wrapping algorithm to use. @exception SecurityUtilityException if the algorithm requested cannot be found @exception InvalidKeyException if the keys are inappropriate for the algorithm specified Constructor allowing specific source of randomness Instance of SecureRandom to use. Generate an enveloped object that contains a CMS Enveloped Data object using the passed in key generator. Generate an enveloped object that contains an CMS Enveloped Data object. Generate an enveloped object that contains an CMS Enveloped Data object. containing class for an CMS Enveloped Data object return a store of the intended recipients for this message return a table of the unprotected attributes indexed by the OID of the attribute. return the ASN.1 encoded representation of this object. return the object identifier for the content encryption algorithm. return the ContentInfo Basic type for a symmetric encrypted session key packet @return byte[] @return int @return S2k @return int packet giving whether or not the signature is signed using the primary user ID for the key. packet giving time after creation at which the key expires. Return the number of seconds after creation time a key is valid for. @return second count for key validity. class for breaking up an X500 Name into it's component tokens, ala java.util.StringTokenizer. We need this class as some of the lightweight Java environment don't support classes like StringTokenizer.
                 RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
            
                 RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
            
                 AttributeTypeAndValue ::= SEQUENCE {
                                               type  OBJECT IDENTIFIER,
                                               value ANY }
             
country code - StringType(SIZE(2)) organization - StringType(SIZE(1..64)) organizational unit name - StringType(SIZE(1..64)) Title common name - StringType(SIZE(1..64)) street - StringType(SIZE(1..64)) device serial number name - StringType(SIZE(1..64)) locality name - StringType(SIZE(1..64)) state, or province name - StringType(SIZE(1..64)) Naming attributes of type X520name businessCategory - DirectoryString(SIZE(1..128) postalCode - DirectoryString(SIZE(1..40) dnQualifier - DirectoryString(SIZE(1..64) RFC 3039 Pseudonym - DirectoryString(SIZE(1..64) RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128) RFC 3039 DateOfBirth - PrintableString (SIZE(1)) -- "M", "F", "m" or "f" RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166 codes only RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166 codes only ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64) RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF DirectoryString(SIZE(1..30)) id-at-telephoneNumber Email address (RSA PKCS#9 extension) - IA5String.

Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.

more from PKCS#9 email address in Verisign certificates LDAP User id. default look up table translating OID values into their common symbols following the convention in RFC 2253 with a few extras look up table translating OID values into their common symbols following the convention in RFC 2253 look up table translating OID values into their common symbols following the convention in RFC 1779 look up table translating common symbols into their OIDS. look up table translating OID values into their common symbols. look up table translating string values into their OIDS - this static is scheduled for deletion Return a X509Name based on the passed in tagged object. @param obj tag object holding name. @param explicitly true if explicitly tagged false otherwise. @return the X509Name Constructor from Asn1Sequence the principal will be a list of constructed sets, each containing an (OID, string) pair. Constructor from a table of attributes with ordering.

it's is assumed the table contains OID/string pairs, and the contents of the table are copied into an internal table as part of the construction process. The ordering ArrayList should contain the OIDs in the order they are meant to be encoded or printed in ToString.

Constructor from a table of attributes with ordering.

it's is assumed the table contains OID/string pairs, and the contents of the table are copied into an internal table as part of the construction process. The ordering ArrayList should contain the OIDs in the order they are meant to be encoded or printed in ToString.

The passed in converter will be used to convert the strings into their ASN.1 counterparts.

Takes two vectors one of the oids and the other of the values. Takes two vectors one of the oids and the other of the values.

The passed in converter will be used to convert the strings into their ASN.1 counterparts.

Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes. Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes with each string value being converted to its associated ASN.1 type using the passed in converter. Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes. If reverse is true, create the encoded version of the sequence starting from the last element in the string. Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes with each string value being converted to its associated ASN.1 type using the passed in converter. If reverse is true the ASN.1 sequence representing the DN will be built by starting at the end of the string, rather than the start. Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes. lookUp should provide a table of lookups, indexed by lowercase only strings and yielding a DerObjectIdentifier, other than that OID. and numeric oids will be processed automatically.
If reverse is true, create the encoded version of the sequence starting from the last element in the string. @param reverse true if we should start scanning from the end (RFC 2553). @param lookUp table of names and their oids. @param dirName the X.500 string to be parsed.
Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or some such, converting it into an ordered set of name attributes. lookUp should provide a table of lookups, indexed by lowercase only strings and yielding a DerObjectIdentifier, other than that OID. and numeric oids will be processed automatically. The passed in converter is used to convert the string values to the right of each equals sign to their ASN.1 counterparts.
@param reverse true if we should start scanning from the end, false otherwise. @param lookUp table of names and oids. @param dirName the string dirName @param converter the converter to convert string values into their ASN.1 equivalents
return an ArrayList of the oids in the name, in the order they were found. return an ArrayList of the values found in the name, in the order they were found. return an ArrayList of the values found in the name, in the order they were found, with the DN label corresponding to passed in oid. The X509Name object to test equivalency against. If true, the order of elements must be the same, as well as the values associated with each element. test for equivalence - note: case is ignored. convert the structure to a string - if reverse is true the oids and values are listed out starting with the last element in the sequence (ala RFC 2253), otherwise the string will begin with the first element of the structure. If no string definition for the oid is found in oidSymbols the string value of the oid is added. Two standard symbol tables are provided DefaultSymbols, and RFC2253Symbols as part of this class. @param reverse if true start at the end of the sequence and work back. @param oidSymbols look up table strings for oids. determines whether or not strings should be processed and printed from back to front. Generator for Version 2 TbsCertList structures.
              TbsCertList  ::=  Sequence  {
                   version                 Version OPTIONAL,
                                                -- if present, shall be v2
                   signature               AlgorithmIdentifier,
                   issuer                  Name,
                   thisUpdate              Time,
                   nextUpdate              Time OPTIONAL,
                   revokedCertificates     Sequence OF Sequence  {
                        userCertificate         CertificateSerialNumber,
                        revocationDate          Time,
                        crlEntryExtensions      Extensions OPTIONAL
                                                      -- if present, shall be v2
                                             }  OPTIONAL,
                   crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
                                                      -- if present, shall be v2
                                             }
             
Note: This class may be subject to change
Generator for Version 2 AttributeCertificateInfo
             AttributeCertificateInfo ::= Sequence {
                   version              AttCertVersion -- version is v2,
                   holder               Holder,
                   issuer               AttCertIssuer,
                   signature            AlgorithmIdentifier,
                   serialNumber         CertificateSerialNumber,
                   attrCertValidityPeriod   AttCertValidityPeriod,
                   attributes           Sequence OF Attr,
                   issuerUniqueID       UniqueIdentifier OPTIONAL,
                   extensions           Extensions OPTIONAL
             }
             
@param attribute Class for containing a restriction object subtrees in NameConstraints. See RFC 3280.
            
                   GeneralSubtree ::= SEQUENCE
                   {
                     baseName                    GeneralName,
                     minimum         [0]     BaseDistance DEFAULT 0,
                     maximum         [1]     BaseDistance OPTIONAL
                   }
             
@see org.bouncycastle.asn1.x509.NameConstraints
Constructor from a given details. According RFC 3280, the minimum and maximum fields are not used with any name forms, thus minimum MUST be zero, and maximum MUST be absent.

If minimum is null, zero is assumed, if maximum is null, maximum is absent.

@param baseName A restriction. @param minimum Minimum @param maximum Maximum
Produce an object suitable for an Asn1OutputStream. Returns:
                   GeneralSubtree ::= SEQUENCE
                   {
                     baseName                    GeneralName,
                     minimum         [0]     BaseDistance DEFAULT 0,
                     maximum         [1]     BaseDistance OPTIONAL
                   }
             
@return a DERObject
Produce an object suitable for an Asn1OutputStream.
            TBSRequest      ::=     Sequence {
                version             [0]     EXPLICIT Version DEFAULT v1,
                requestorName       [1]     EXPLICIT GeneralName OPTIONAL,
                requestList                 Sequence OF Request,
                requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }
            
Produce an object suitable for an Asn1OutputStream.
            ResponseBytes ::=       Sequence {
                responseType   OBJECT IDENTIFIER,
                response       OCTET STRING }
            
Produce an object suitable for an Asn1OutputStream.
            OcspRequest     ::=     Sequence {
                tbsRequest                  TBSRequest,
                optionalSignature   [0]     EXPLICIT Signature OPTIONAL }
            
Names of authorities which are responsible for the administration of title registers.
                        NamingAuthority ::= SEQUENCE 
                        {
                          namingAuthorityID OBJECT IDENTIFIER OPTIONAL,
                          namingAuthorityUrl IA5String OPTIONAL,
                          namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
                        }
            
@see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax
Profession OIDs should always be defined under the OID branch of the responsible naming authority. At the time of this writing, the work group �Recht, Wirtschaft, Steuern� (�Law, Economy, Taxes�) is registered as the first naming authority under the OID id-isismtt-at-namingAuthorities. Constructor from Asn1Sequence.

                         NamingAuthority ::= SEQUENCE
                         {
                           namingAuthorityID OBJECT IDENTIFIER OPTIONAL,
                           namingAuthorityUrl IA5String OPTIONAL,
                           namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
                         }
             
@param seq The ASN.1 sequence.
Constructor from given details.

All parameters can be combined. @param namingAuthorityID ObjectIdentifier for naming authority. @param namingAuthorityUrl URL for naming authority. @param namingAuthorityText Textual representation of naming authority. Produce an object suitable for an Asn1OutputStream.

Returns:

                         NamingAuthority ::= SEQUENCE
                         {
                           namingAuthorityID OBJECT IDENTIFIER OPTIONAL,
                           namingAuthorityUrl IA5String OPTIONAL,
                           namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
                         }
             
@return an Asn1Object
@return Returns the namingAuthorityID. @return Returns the namingAuthorityText. @return Returns the namingAuthorityUrl. RFC 3126: 4.3.1 Certificate Values Attribute Definition CertificateValues ::= SEQUENCE OF Certificate return a KekIdentifier object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a KekIdentifier object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            KekIdentifier ::= Sequence {
                keyIdentifier OCTET STRING,
                date GeneralizedTime OPTIONAL,
                other OtherKeyAttribute OPTIONAL
            }
            
            EnvelopedData ::= SEQUENCE {
                version CMSVersion,
                originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
                recipientInfos RecipientInfos,
                encryptedContentInfo EncryptedContentInfo,
                unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL
            }
            
Summary description for DeflaterOutputStream. Return the number of milliseconds since the Unix epoch (1 Jan., 1970 UTC) for a given DateTime value. A UTC DateTime value not before epoch. Number of whole milliseconds after epoch. 'dateTime' is before epoch. Create a DateTime value from the number of milliseconds since the Unix epoch (1 Jan., 1970 UTC). Number of milliseconds since the epoch. A UTC DateTime value Return the current number of milliseconds since the Unix epoch (1 Jan., 1970 UTC). Exception thrown if a TSP request or response fails to validate.

If a failure code is assciated with the exception it can be retrieved using the getFailureCode() method.

Return the failure code associated with this exception - if one is set. @return the failure code if set, -1 otherwise. Validate the time stamp token.

To be valid the token must be signed by the passed in certificate and the certificate must be the one referred to by the SigningCertificate attribute included in the hashed attributes of the token. The certificate must also have the ExtendedKeyUsageExtension with only KeyPurposeID.IdKPTimeStamping and have been valid at the time the timestamp was created.

A successful call to validate means all the above are true.

Return the underlying CmsSignedData object. @return the underlying CMS structure. Return a ASN.1 encoded byte stream representing the encoded object. @throws IOException if encoding fails. Use the specified instance of IRandomGenerator as random source. This constructor performs no seeding of either the IRandomGenerator or the constructed SecureRandom. It is the responsibility of the client to provide proper seed material as necessary/appropriate for the given IRandomGenerator implementation. The source to generate all random bytes from. Key flag values for the KeyFlags subpacket. Generator for encrypted objects. Existing SecureRandom constructor. The symmetric algorithm to use. Source of randomness. Creates a cipher stream which will have an integrity packet associated with it. Base constructor. The symmetric algorithm to use. Source of randomness. PGP 2.6.x compatibility required. Add a PBE encryption method to the encrypted object. Add a public key encrypted session key to the encrypted object.

If buffer is non null stream assumed to be partial, otherwise the length will be used to output a fixed length packet.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

Return an output stream which will encrypt the data as it is written to it.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

Return an output stream which will encrypt the data as it is written to it. The stream will be written out in chunks according to the size of the passed in buffer.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

Note: if the buffer is not a power of 2 in length only the largest power of 2 bytes worth of the buffer will be used.

Close off the encrypted object - this is equivalent to calling Close() on the stream returned by the Open() method.

Note: This does not close the underlying output stream, only the stream on top of it created by the Open() method.

Carrier for a ResponderID. create from an issuer certificate and the serial number of the certificate it signed. @exception OcspException if any problems occur creating the id fields. return the serial number for the certificate associated with this request. Class holding precomputation data for the WNAF (Window Non-Adjacent Form) algorithm. Interface for classes storing precomputation data for multiplication algorithms. Used as a Memento (see GOF patterns) for WNafMultiplier. Array holding the precomputed ECPoints used for the Window NAF multiplication in {@link org.bouncycastle.math.ec.multiplier.WNafMultiplier.multiply() WNafMultiplier.multiply()}. Holds an ECPoint representing twice(this). Used for the Window NAF multiplication in {@link org.bouncycastle.math.ec.multiplier.WNafMultiplier.multiply() WNafMultiplier.multiply()}. EC-NR as described in IEEE 1363-2000 generate a signature for the given message using the key we were initialised with. Generally, the order of the curve should be at least as long as the hash of the message of interest, and with ECNR it *must* be at least as long. @param digest the digest to be signed. @exception DataLengthException if the digest is longer than the key allows return true if the value r and s represent a signature for the message passed in. Generally, the order of the curve should be at least as long as the hash of the message of interest, and with ECNR, it *must* be at least as long. But just in case the signer applied mod(n) to the longer digest, this implementation will apply mod(n) during verification. @param digest the digest to be verified. @param r the r value of the signature. @param s the s value of the signature. @exception DataLengthException if the digest is longer than the key allows Private key parameters for NaccacheStern cipher. For details on this cipher, please see http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf Public key parameters for NaccacheStern cipher. For details on this cipher, please see http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf @param privateKey @return Returns the g. @return Returns the lowerSigmaBound. @return Returns the n. Constructs a NaccacheSternPrivateKey @param g the public enryption parameter g @param n the public modulus n = p*q @param lowerSigmaBound the public lower sigma bound up to which data can be encrypted @param smallPrimes the small primes, of which sigma is constructed in the right order @param phi_n the private modulus phi(n) = (p-1)(q-1) parameters for Key derivation functions for IEEE P1363a parameters for using an integrated cipher in stream mode. @param derivation the derivation parameter for the KDF function. @param encoding the encoding parameter for the KDF function. @param macKeySize the size of the MAC key (in bits). @param derivation the derivation parameter for the KDF function. @param encoding the encoding parameter for the KDF function. @param macKeySize the size of the MAC key (in bits). @param cipherKeySize the size of the associated Cipher key (in bits). Base constructor. @param key key to be used by underlying cipher @param macSize macSize in bits @param nonce nonce to be used @param associatedText associated text, if any Base constructor. @param key key to be used by underlying cipher @param macSize macSize in bits @param nonce nonce to be used @param associatedText associated text, if any this exception is thrown whenever we find something we don't expect in a message. base constructor. create a InvalidCipherTextException with the given message. @param message the message to be carried with the exception. Generator for MGF1 as defined in Pkcs 1v2 @param digest the digest to be used as the source of Generated bytes int to octet string. fill len bytes of the output buffer with bytes Generated from the derivation function. @throws DataLengthException if the out buffer is too small. return the underlying digest. a Diffie-Helman key pair generator. This Generates keys consistent for use in the MTI/A0 key agreement protocol as described in "Handbook of Applied Cryptography", Pages 516-519. A class that provides Twofish encryption operations. This Java implementation is based on the Java reference implementation provided by Bruce Schneier and developed by Raif S. Naffah. Define the fixed p0/p1 permutations used in keyed S-box lookup. By changing the following constant definitions, the S-boxes will automatically Get changed in the Twofish engine. gSubKeys[] and gSBox[] are eventually used in the encryption and decryption methods. initialise a Twofish cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Encrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. The input will be an exact multiple of our blocksize. encryptBlock uses the pre-calculated gSBox[] and subKey[] arrays. Decrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. The input will be an exact multiple of our blocksize. Use (12, 8) Reed-Solomon code over GF(256) to produce a key S-box 32-bit entity from 2 key material 32-bit entities. @param k0 first 32-bit entity @param k1 second 32-bit entity @return Remainder polynomial Generated using RS code * Reed-Solomon code parameters: (12,8) reversible code: *

*

                    * G(x) = x^4 + (a+1/a)x^3 + ax^2 + (a+1/a)x + 1
                    * 
* where a = primitive root of field generator 0x14D *

Optimal Asymmetric Encryption Padding (OAEP) - see PKCS 1 V 2. @exception InvalidCipherTextException if the decrypted block turns out to be badly formatted. int to octet string. mask generator function, as described in PKCS1v2. Generic literal data packet. The format tag value. The modification time of the file in milli-seconds (since Jan 1, 1970 UTC) Basic output stream. Create a stream representing a general packet. Output stream to write to. Create a stream representing an old style partial object. Output stream to write to. The packet tag for the object. Create a stream representing a general packet. Output stream to write to. Packet tag. Size of chunks making up the packet. If true, the header is written out in old format. Create a new style partial input stream buffered into chunks. Output stream to write to. Packet tag. Size of chunks making up the packet. Create a new style partial input stream buffered into chunks. Output stream to write to. Packet tag. Buffer to use for collecting chunks. Flush the underlying stream. Finish writing out the current packet without closing the underlying stream. Basic output stream. encode the input data producing a base 64 encoded byte array. Set an additional header entry. @param name the name of the header entry. @param v the value of the header entry. Reset the headers to only contain a Version string. Start a clear text signed message. @param hashAlgorithm Note: close does nor close the underlying stream. So it is possible to write multiple objects using armoring to a single stream. The QCStatement object.
            QCStatement ::= SEQUENCE {
              statementId        OBJECT IDENTIFIER,
              statementInfo      ANY DEFINED BY statementId OPTIONAL}
            
Produce an object suitable for an Asn1OutputStream.
             IssuerSerial  ::=  Sequence {
                  issuer         GeneralNames,
                  serial         CertificateSerialNumber,
                  issuerUid      UniqueIdentifier OPTIONAL
             }
            
Implementation of IetfAttrSyntax as specified by RFC3281.
            
              IetfAttrSyntax ::= Sequence {
                policyAuthority [0] GeneralNames OPTIONAL,
                values Sequence OF CHOICE {
                  octets OCTET STRING,
                  oid OBJECT IDENTIFIER,
                  string UTF8String
                }
              }
            
             
The Holder object.

For an v2 attribute certificate this is:

                       Holder ::= SEQUENCE {
                             baseCertificateID   [0] IssuerSerial OPTIONAL,
                                      -- the issuer and serial number of
                                      -- the holder's Public Key Certificate
                             entityName          [1] GeneralNames OPTIONAL,
                                      -- the name of the claimant or role
                             objectDigestInfo    [2] ObjectDigestInfo OPTIONAL
                                      -- used to directly authenticate the holder,
                                      -- for example, an executable
                       }
            

For an v1 attribute certificate this is:

                    subject CHOICE {
                     baseCertificateID [0] IssuerSerial,
                     -- associated with a Public Key Certificate
                     subjectName [1] GeneralNames },
                     -- associated with a name
            

Constructor for a holder for an v1 attribute certificate. @param tagObj The ASN.1 tagged holder object. Constructor for a holder for an v2 attribute certificate. * @param seq The ASN.1 sequence. Constructs a holder from a IssuerSerial. @param baseCertificateID The IssuerSerial. @param version The version of the attribute certificate. Constructs a holder with an entityName for v2 attribute certificates or with a subjectName for v1 attribute certificates. @param entityName The entity or subject name. Constructs a holder with an entityName for v2 attribute certificates or with a subjectName for v1 attribute certificates. @param entityName The entity or subject name. @param version The version of the attribute certificate. Constructs a holder from an object digest info. @param objectDigestInfo The object digest info object. The Holder object.
             Holder ::= Sequence {
                   baseCertificateID   [0] IssuerSerial OPTIONAL,
                            -- the issuer and serial number of
                            -- the holder's Public Key Certificate
                   entityName          [1] GeneralNames OPTIONAL,
                            -- the name of the claimant or role
                   objectDigestInfo    [2] ObjectDigestInfo OPTIONAL
                            -- used to directly authenticate the holder,
                            -- for example, an executable
             }
            
Returns 1 for v2 attribute certificates or 0 for v1 attribute certificates. @return The version of the attribute certificate. Returns the entityName for an v2 attribute certificate or the subjectName for an v1 attribute certificate. @return The entityname or subjectname. elliptic curves defined in "ECC Brainpool Standard Curves and Curve Generation" http://www.ecc-brainpool.org/download/draft_pkix_additional_ecc_dp.txt return the X9ECParameters object for the named curve represented by the passed in object identifier. Null if the curve isn't present. @param oid an object identifier representing a named curve, if present. return the object identifier signified by the passed in name. Null if there is no object identifier associated with name. @return the object identifier associated with name, if present. return the named curve name represented by the given object identifier. returns an enumeration containing the name strings for curves contained in this structure. Produce an object suitable for an Asn1OutputStream.
            ContentInfo ::= Sequence {
                     contentType ContentType,
                     content
                     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
            
Produce an object suitable for an Asn1OutputStream.
            OcspResponse ::= Sequence {
                responseStatus         OcspResponseStatus,
                responseBytes          [0] EXPLICIT ResponseBytes OPTIONAL }
            
SignaturePolicyIdentifier ::= CHOICE { SignaturePolicyId SignaturePolicyId, SignaturePolicyImplied SignaturePolicyImplied } SignaturePolicyImplied ::= NULL DER TaggedObject - in ASN.1 notation this is any object preceded by a [n] where n is some number - these are assumed to follow the construction rules (as with sequences). ASN.1 TaggedObject - in ASN.1 notation this is any object preceded by a [n] where n is some number - these are assumed to follow the construction rules (as with sequences). @param tagNo the tag number for this object. @param obj the tagged object. @param explicitly true if the object is explicitly tagged. @param tagNo the tag number for this object. @param obj the tagged object. return whether or not the object may be explicitly tagged.

Note: if the object has been read from an input stream, the only time you can be sure if isExplicit is returning the true state of affairs is if it returns false. An implicitly tagged object may appear to be explicitly tagged, so you need to understand the context under which the reading was done as well, see GetObject below.

return whatever was following the tag.

Note: tagged objects are generally context dependent if you're trying to extract a tagged object you should be going via the appropriate GetInstance method.

Return the object held in this tagged object as a parser assuming it has the type of the passed in tag. If the object doesn't have a parser associated with it, the base object is returned. @param tagNo the tag number for this object. @param obj the tagged object. @param explicitly true if an explicitly tagged object. @param tagNo the tag number for this object. @param obj the tagged object. create an implicitly tagged object that contains a zero length sequence. Base class for an application specific object Return the enclosed object assuming implicit tagging. @param derTagNo the type tag that should be applied to the object's contents. @return the resulting object @throws IOException if reconstruction fails. Produce an object suitable for an Asn1OutputStream.
              SignerInfo ::= Sequence {
                  version Version,
                  SignerIdentifier sid,
                  digestAlgorithm DigestAlgorithmIdentifier,
                  authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
                  digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
                  encryptedDigest EncryptedDigest,
                  unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
              }
            
              EncryptedDigest ::= OCTET STRING
            
              DigestAlgorithmIdentifier ::= AlgorithmIdentifier
            
              DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
             
return an OriginatorIdentifierOrKey object from a tagged object. @param o the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return an OriginatorIdentifierOrKey object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
             OriginatorIdentifierOrKey ::= CHOICE {
                 issuerAndSerialNumber IssuerAndSerialNumber,
                 subjectKeyIdentifier [0] SubjectKeyIdentifier,
                 originatorKey [1] OriginatorPublicKey
             }
            
             SubjectKeyIdentifier ::= OCTET STRING
             
return a KekRecipientInfo object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a KekRecipientInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            KekRecipientInfo ::= Sequence {
                version CMSVersion,  -- always set to 4
                kekID KekIdentifier,
                keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
                encryptedKey EncryptedKey
            }
            
return an Attribute object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            Attribute ::= SEQUENCE {
                attrType OBJECT IDENTIFIER,
                attrValues SET OF AttributeValue
            }
            
Create loading data from byte array. Create loading data from byte array. Summary description for DeflaterOutputStream. General string utilities. Convert binary data to and from UrlBase64 encoding. This is identical to Base64 encoding, except that the padding character is "." and the other non-alphanumeric characters are "-" and "_" instead of "+" and "/".

The purpose of UrlBase64 encoding is to provide a compact encoding of binary data that is safe for use as an URL parameter. Base64 encoding does not produce encoded values that are safe for use in URLs, since "/" can be interpreted as a path delimiter; "+" is the encoded form of a space; and "=" is used to separate a name from the corresponding value in an URL parameter.

Encode the input data producing a URL safe base 64 encoded byte array. @return a byte array containing the URL safe base 64 encoded data. Encode the byte data writing it to the given output stream. @return the number of bytes produced. Decode the URL safe base 64 encoded input data - white space will be ignored. @return a byte array representing the decoded data. decode the URL safe base 64 encoded byte data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. decode the URL safe base 64 encoded string data - whitespace will be ignored. @return a byte array representing the decoded data. Decode the URL safe base 64 encoded string data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. A one pass signature object. Initialise the signature object for verification. Verify the calculated signature against the passed in PgpSignature. * Implements OpenPGP's rather strange version of Cipher-FeedBack (CFB) mode * on top of a simple cipher. This class assumes the IV has been prepended * to the data stream already, and just accomodates the reset after * (blockSize + 2) bytes have been read. *

* For further info see RFC 2440. *

Basic constructor. @param cipher the block cipher to be used as the basis of the feedback mode. return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. return the block size we are operating at. @return the block size we are operating at (in bytes). Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. reset the chaining vector back to the IV and reset the underlying cipher. Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the IV will be all zeros. An IV which is too short is handled in FIPS compliant fashion. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param parameters the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. Encrypt one byte of data according to CFB mode. @param data the byte to encrypt @param blockOff offset in the current block @returns the encrypted byte Do the appropriate processing for CFB IV mode encryption. @param in the array containing the data to be encrypted. @param inOff offset into the in array the data starts at. @param out the array the encrypted data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. Do the appropriate processing for CFB IV mode decryption. @param in the array containing the data to be decrypted. @param inOff offset into the in array the data starts at. @param out the array the encrypted data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. return the algorithm name and mode. @return the name of the underlying algorithm followed by "/PGPCFB" and the block size in bits. Generator for Pbe derived keys and ivs as defined by Pkcs 5 V2.0 Scheme 2. This generator uses a SHA-1 HMac as the calculation function.

The document this implementation is based on can be found at RSA's Pkcs5 Page

construct a Pkcs5 Scheme 2 Parameters generator. Generate a key parameter derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. Generate a key with initialisation vector parameter derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @param ivSize the size of the iv we want (in bits) @return a ParametersWithIV object. Generate a key parameter for use with a MAC derived from the password, salt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. this does your basic RSA algorithm. initialise the RSA engine. @param forEncryption true if we are encrypting, false otherwise. @param param the necessary RSA key parameters. Return the maximum size for an input block to this engine. For RSA this is always one byte less than the key size on encryption, and the same length as the key size on decryption. @return maximum size for an input block. Return the maximum size for an output block to this engine. For RSA this is always one byte less than the key size on decryption, and the same length as the key size on encryption. @return maximum size for an output block. This does your basic RSA Chaum's blinding and unblinding as outlined in "Handbook of Applied Cryptography", page 475. You need to use this if you are trying to get another party to generate signatures without them being aware of the message they are signing. Initialise the blinding engine. @param forEncryption true if we are encrypting (blinding), false otherwise. @param param the necessary RSA key parameters. Return the maximum size for an input block to this engine. For RSA this is always one byte less than the key size on encryption, and the same length as the key size on decryption. @return maximum size for an input block. Return the maximum size for an output block to this engine. For RSA this is always one byte less than the key size on decryption, and the same length as the key size on encryption. @return maximum size for an output block. Process a single block using the RSA blinding algorithm. @param in the input array. @param inOff the offset into the input buffer where the data starts. @param inLen the length of the data to be processed. @return the result of the RSA process. @throws DataLengthException the input block is too large. support class for constructing intergrated encryption ciphers for doing basic message exchanges on top of key agreement ciphers set up for use with stream mode, where the key derivation function is used to provide a stream of bytes to xor with the message. @param agree the key agreement used as the basis for the encryption @param kdf the key derivation function used for byte generation @param mac the message authentication code generator for the message set up for use in conjunction with a block cipher to handle the message. @param agree the key agreement used as the basis for the encryption @param kdf the key derivation function used for byte generation @param mac the message authentication code generator for the message @param cipher the cipher to used for encrypting the message Initialise the encryptor. @param forEncryption whether or not this is encryption/decryption. @param privParam our private key parameters @param pubParam the recipient's/sender's public key parameters @param param encoding and derivation parameters. Camellia - based on RFC 3713.

Implementation of RipeMD 320.

Note: this algorithm offers the same level of security as RipeMD160.

Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. Class provided a NotationData object according to RFC2440, Chapter 5.2.3.15. Notation Data packet giving signature creation time. packet giving signature creation time. The string to key specifier class. The IV for the key generation algorithm. The hash algorithm. The iteration count The protection mode - only if GnuDummyS2K Base class for an RSA secret (or priate) key. Return the standard PGP encoding of the key. The format, as a string, always "PGP". Public Key Algorithm tag numbers. Reader for PGP objects. Returns the next packet tag in the stream. A stream that overlays our input stream, allowing the user to only read a segment of it. NB: dataLength will be negative if the segment length is in the upper range above 2**31. ASN.1 def for Elliptic-Curve Field ID structure. See X9.62, for further details. Constructor for elliptic curves over prime fields F2. @param primeP The prime p defining the prime field. Constructor for elliptic curves over binary fields F2m. @param m The exponent m of F2m. @param k1 The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k2 The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k3 The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).. Produce a Der encoding of the following structure.
             FieldID ::= Sequence {
                 fieldType       FIELD-ID.&id({IOSet}),
                 parameters      FIELD-ID.&Type({IOSet}{@fieldType})
             }
            
class for processing an FieldElement as a Der object. Produce an object suitable for an Asn1OutputStream.
             FieldElement ::= OCTET STRING
            

  1. if q is an odd prime then the field element is processed as an Integer and converted to an octet string according to x 9.62 4.3.1.
  2. if q is 2m then the bit string contained in the field element is converted into an octet string with the same ordering padded at the front if necessary.

class for describing an ECPoint as a Der object. Produce an object suitable for an Asn1OutputStream.
             ECPoint ::= OCTET STRING
            

Octet string produced using ECPoint.GetEncoded().

The TbsCertificate object.
            TbsCertificate ::= Sequence {
                 version          [ 0 ]  Version DEFAULT v1(0),
                 serialNumber            CertificateSerialNumber,
                 signature               AlgorithmIdentifier,
                 issuer                  Name,
                 validity                Validity,
                 subject                 Name,
                 subjectPublicKeyInfo    SubjectPublicKeyInfo,
                 issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
                 subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
                 extensions        [ 3 ] Extensions OPTIONAL
                 }
            

Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class will parse them, but you really shouldn't be creating new ones.

Implementation of the RoleSyntax object as specified by the RFC3281.
             RoleSyntax ::= SEQUENCE {
                             roleAuthority  [0] GeneralNames OPTIONAL,
                             roleName       [1] GeneralName
                       }
             
RoleSyntax factory method. @param obj the object used to construct an instance of RoleSyntax. It must be an instance of RoleSyntax or Asn1Sequence. @return the instance of RoleSyntax built from the supplied object. @throws java.lang.ArgumentException if the object passed to the factory is not an instance of RoleSyntax or Asn1Sequence. Constructor. @param roleAuthority the role authority of this RoleSyntax. @param roleName the role name of this RoleSyntax. Constructor. Invoking this constructor is the same as invoking new RoleSyntax(null, roleName). @param roleName the role name of this RoleSyntax. Utility constructor. Takes a string argument representing the role name, builds a GeneralName to hold the role name and calls the constructor that takes a GeneralName. @param roleName Constructor that builds an instance of RoleSyntax by extracting the encoded elements from the Asn1Sequence object supplied. @param seq an instance of Asn1Sequence that holds the encoded elements used to build this RoleSyntax. Gets the role name as a java.lang.string object. @return the role name of this RoleSyntax represented as a string object. Gets the role authority as a string[] object. @return the role authority of this RoleSyntax represented as a string[] array. Implementation of the method ToAsn1Object as required by the superclass ASN1Encodable.
             RoleSyntax ::= SEQUENCE {
                             roleAuthority  [0] GeneralNames OPTIONAL,
                             roleName       [1] GeneralName
                       }
             
Gets the role authority of this RoleSyntax. @return an instance of GeneralNames holding the role authority of this RoleSyntax. Gets the role name of this RoleSyntax. @return an instance of GeneralName holding the role name of this RoleSyntax. The extendedKeyUsage object.
                 extendedKeyUsage ::= Sequence SIZE (1..MAX) OF KeyPurposeId
            
Returns all extended key usages. The returned ArrayList contains DerObjectIdentifier instances. @return An ArrayList with all key purposes. the elliptic curve private key object from SEC 1 ECPrivateKey ::= SEQUENCE { version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), privateKey OCTET STRING, parameters [0] Parameters OPTIONAL, publicKey [1] BIT STRING OPTIONAL } Pkcs10 CertificationRequestInfo object.
              CertificationRequestInfo ::= Sequence {
               version             Integer { v1(0) } (v1,...),
               subject             Name,
               subjectPKInfo   SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
               attributes          [0] Attributes{{ CRIAttributes }}
              }
            
              Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }}
            
              Attr { ATTRIBUTE:IOSet } ::= Sequence {
                type    ATTRIBUTE.&id({IOSet}),
                values  Set SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
              }
             
Produce an object suitable for an Asn1OutputStream.
             SingleResponse ::= Sequence {
                     certID                       CertID,
                     certStatus                   CertStatus,
                     thisUpdate                   GeneralizedTime,
                     nextUpdate         [0]       EXPLICIT GeneralizedTime OPTIONAL,
                     singleExtensions   [1]       EXPLICIT Extensions OPTIONAL }
            
Signer-Location attribute (RFC3126).
               SignerLocation ::= SEQUENCE {
                   countryName        [0] DirectoryString OPTIONAL,
                   localityName       [1] DirectoryString OPTIONAL,
                   postalAddress      [2] PostalAddress OPTIONAL }
            
               PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString
             
               SignerLocation ::= SEQUENCE {
                   countryName        [0] DirectoryString OPTIONAL,
                   localityName       [1] DirectoryString OPTIONAL,
                   postalAddress      [2] PostalAddress OPTIONAL }
            
               PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString
            
               DirectoryString ::= CHOICE {
                     teletexString           TeletexString (SIZE (1..MAX)),
                     printableString         PrintableString (SIZE (1..MAX)),
                     universalString         UniversalString (SIZE (1..MAX)),
                     utf8String              UTF8String (SIZE (1.. MAX)),
                     bmpString               BMPString (SIZE (1..MAX)) }
             
OtherSigningCertificate ::= SEQUENCE { certs SEQUENCE OF OtherCertID, policies SEQUENCE OF PolicyInformation OPTIONAL } RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition CrlValidatedID ::= SEQUENCE { crlHash OtherHash, crlIdentifier CrlIdentifier OPTIONAL} RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition CRLListID ::= SEQUENCE { crls SEQUENCE OF CrlValidatedID } UTC time object. return an UTC Time from the passed in object. @exception ArgumentException if the object cannot be converted. return an UTC Time from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were never encoded. When you're creating one of these objects from scratch, that's what you want to use, otherwise we'll try to deal with whatever Gets read from the input stream... (this is why the input format is different from the GetTime() method output).

@param time the time string.

base constructor from a DateTime object return the time as a date based on whatever a 2 digit year will return. For standardised processing use ToAdjustedDateTime(). @return the resulting date @exception ParseException if the date string cannot be parsed. return the time as an adjusted date in the range of 1950 - 2049. @return a date in the range of 1950 to 2049. @exception ParseException if the date string cannot be parsed. return the time - always in the form of YYMMDDhhmmssGMT(+hh:mm|-hh:mm).

Normally in a certificate we would expect "Z" rather than "GMT", however adding the "GMT" means we can just use:

                dateF = new SimpleDateFormat("yyMMddHHmmssz");
            
To read in the time and Get a date which is compatible with our local time zone.

Note: In some cases, due to the local date processing, this may lead to unexpected results. If you want to stick the normal convention of 1950 to 2049 use the GetAdjustedTime() method.

Return a time string as an adjusted date with a 4 digit year. This goes in the range of 1950 - 2049. creates a time object from a given date - if the date is between 1950 and 2049 a UTCTime object is Generated, otherwise a GeneralizedTime is used. Produce an object suitable for an Asn1OutputStream.
            Time ::= CHOICE {
                        utcTime        UTCTime,
                        generalTime    GeneralizedTime }
            
            PkiFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String
            
Return the number of string elements present. @return number of elements present. Return the UTF8STRING at index. @param index index of the string of interest @return the string at index. Base class for both the compress and decompress classes. Holds common arrays, and static data. @author Keiron Liddle An ICollection of X509Name objects The attribute certificate being checked. This is not a criterion. Rather, it is optional information that may help a {@link X509Store} find CRLs that would be relevant when checking revocation for the specified attribute certificate. If null is specified, then no such optional information is provided. @param attrCert the IX509AttributeCertificate being checked (or null) @see #getAttrCertificateChecking() If true only complete CRLs are returned. Defaults to false. @return true if only complete CRLs are returned. Returns if this selector must match CRLs with the delta CRL indicator extension set. Defaults to false. @return Returns true if only CRLs with the delta CRL indicator extension are selected. The issuing distribution point.

The issuing distribution point extension is a CRL extension which identifies the scope and the distribution point of a CRL. The scope contains among others information about revocation reasons contained in the CRL. Delta CRLs and complete CRLs must have matching issuing distribution points.

The byte array is cloned to protect against subsequent modifications.

You must also enable or disable this criteria with {@link #setIssuingDistributionPointEnabled(bool)}.

@param issuingDistributionPoint The issuing distribution point to set. This is the DER encoded OCTET STRING extension value. @see #getIssuingDistributionPoint()
Whether the issuing distribution point criteria should be applied. Defaults to false.

You may also set the issuing distribution point criteria if not a missing issuing distribution point should be assumed.

@return Returns if the issuing distribution point check is enabled.
The maximum base CRL number. Defaults to null. @return Returns the maximum base CRL number. @see #setMaxBaseCRLNumber(BigInteger) encode the input data producing a Hex output stream. @return the number of bytes produced. decode the Hex encoded byte data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. decode the Hex encoded string data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. A class for verifying and creating Pkcs10 Certification requests. CertificationRequest ::= Sequence { certificationRequestInfo CertificationRequestInfo, signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }}, signature BIT STRING } CertificationRequestInfo ::= Sequence { version Integer { v1(0) } (v1,...), subject Name, subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }}, attributes [0] Attributes{{ CRIAttributes }} } Attributes { ATTRIBUTE:IOSet } ::= Set OF Attr{{ IOSet }} Attr { ATTRIBUTE:IOSet } ::= Sequence { type ATTRIBUTE.&id({IOSet}), values Set SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type}) } see Pkcs10 Certfication request object.
            CertificationRequest ::= Sequence {
              certificationRequestInfo  CertificationRequestInfo,
              signatureAlgorithm        AlgorithmIdentifier{{ SignatureAlgorithms }},
              signature                 BIT STRING
            }
            
Instantiate a Pkcs10CertificationRequest object with the necessary credentials. Name of Sig Alg. X509Name of subject eg OU="My unit." O="My Organisatioin" C="au" Public Key to be included in cert reqest. ASN1Set of Attributes. Matching Private key for nominated (above) public key to be used to sign the request. Get the public key. The public key. Verify Pkcs10 Cert Request is valid. true = valid. General purpose writer for OpenSSL PEM objects. The TextWriter object to write the output to. Class for reading OpenSSL PEM encoded streams containing X509 certificates, PKCS8 encoded keys and PKCS7 objects.

In the case of PKCS7 objects the reader will return a CMS ContentInfo object. Keys and Certificates will be returned using the appropriate java.security type.

Create a new PemReader @param reader the Reader Create a new PemReader with a password finder @param reader the Reader @param pFinder the password finder Reads in a X509Certificate. @return the X509Certificate @throws IOException if an I/O error occured Reads in a X509CRL. @return the X509Certificate @throws IOException if an I/O error occured Reads in a PKCS10 certification request. @return the certificate request. @throws IOException if an I/O error occured Reads in a X509 Attribute Certificate. @return the X509 Attribute Certificate @throws IOException if an I/O error occured Reads in a PKCS7 object. This returns a ContentInfo object suitable for use with the CMS API. @return the X509Certificate @throws IOException if an I/O error occured Read a Key Pair wrapper for the RevokedInfo object return the revocation reason. Note: this field is optional, test for it with hasRevocationReason() first. @exception InvalidOperationException if a reason is asked for and none is avaliable Some helper fuctions for MicroTLS. ISO9796-2 - mechanism using a hash function with recovery (scheme 2 and 3).

Note: the usual length for the salt is the length of the hash function used in bytes.

Return a reference to the recoveredMessage message. The full/partial recoveredMessage message. Generate a signer for the with either implicit or explicit trailers for ISO9796-2, scheme 2 or 3. base cipher to use for signature creation/verification digest to use. length of salt in bytes. whether or not the trailer is implicit or gives the hash. Constructor for a signer with an explicit digest trailer. cipher to use. digest to sign with. length of salt in bytes. Initialise the signer. true if for signing, false if for verification. parameters for signature generation/verification. If the parameters are for generation they should be a ParametersWithRandom, a ParametersWithSalt, or just an RsaKeyParameters object. If RsaKeyParameters are passed in a SecureRandom will be created. if wrong parameter type or a fixed salt is passed in which is the wrong length. compare two byte arrays. clear possible sensitive data update the internal digest with the byte b update the internal digest with the byte array in reset the internal state Generate a signature for the loaded message using the key we were initialised with. return true if the signature represents a ISO9796-2 signature for the passed in message. Return true if the full message was recoveredMessage. true on full message recovery, false otherwise, or if not sure. int to octet string. int to octet string. long to octet string. mask generator function, as described in Pkcs1v2. update the internal digest with the byte b update the internal digest with the byte array in Generate a signature for the message we've been loaded with using the key we were initialised with. true if the internal state represents the signature described in the passed in array. Reset the internal state Takes bytes generated by an underling RandomGenerator and reverses the order in each small window (of configurable size).

Access to internals is synchronized so a single one of these can be shared.

Generic interface for objects generating random bytes. Add more seed material to the generator. A byte array to be mixed into the generator's state. Add more seed material to the generator. A long value to be mixed into the generator's state. Fill byte array with random values. Array to be filled. Fill byte array with random values. Array to receive bytes. Index to start filling at. Length of segment to fill. Add more seed material to the generator. A byte array to be mixed into the generator's state. Add more seed material to the generator. A long value to be mixed into the generator's state. Fill byte array with random values. Array to be filled. Fill byte array with random values. Array to receive bytes. Index to start filling at. Length of segment to fill. Implements the Segmented Integer Counter (SIC) mode on top of a simple block cipher. Basic constructor. @param c the block cipher to be used. return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. initialise the key generator - if strength is set to zero the key Generated will be 192 bits in size, otherwise strength can be 128 or 192 (or 112 or 168 if you don't count parity bits), depending on whether you wish to do 2-key or 3-key triple DES. @param param the parameters to be used for key generation An implementation of the SEED key wrapper based on RFC 4010/RFC 3394.

For further details see: http://www.ietf.org/rfc/rfc4010.txt. An implementation of the AES Key Wrapper from the NIST Key Wrap Specification as described in RFC 3394.

For further details see: http://www.ietf.org/rfc/rfc3394.txt and http://csrc.nist.gov/encryption/kms/key-wrap.pdf. HC-256 is a software-efficient stream cipher created by Hongjun Wu. It generates keystream from a 256-bit secret key and a 256-bit initialization vector.

http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc256_p3.pdf

Its brother, HC-128, is a third phase candidate in the eStream contest. The algorithm is patent-free. No attacks are known as of today (April 2007). See http://www.ecrypt.eu.org/stream/hcp3.html

Initialise a HC-256 cipher. @param forEncryption whether or not we are for encryption. Irrelevant, as encryption and decryption are the same. @param params the parameters required to set up the cipher. @throws ArgumentException if the params argument is inappropriate (ie. the key is not 256 bit long). An implementation of the Camellia key wrapper based on RFC 3657/RFC 3394.

For further details see: http://www.ietf.org/rfc/rfc3657.txt. The AEAD block ciphers already handle buffering internally, so this class just takes care of implementing IBufferedCipher methods. initialise the cipher. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the blocksize for the underlying cipher. @return the blocksize for the underlying cipher. return the size of the output buffer required for an update an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to update with len bytes of input. return the size of the output buffer required for an update plus a doFinal with an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to update and doFinal with len bytes of input. process a single byte, producing an output block if neccessary. @param in the input byte. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. process an array of bytes, producing output if necessary. @param in the input byte array. @param inOff the offset at which the input data starts. @param len the number of bytes to be copied out of the input array. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. Process the last block in the buffer. @param out the array the block currently being held is copied into. @param outOff the offset at which the copying starts. @return the number of output bytes copied to out. @exception DataLengthException if there is insufficient space in out for the output, or the input is not block size aligned and should be. @exception InvalidOperationException if the underlying cipher is not initialised. @exception InvalidCipherTextException if padding is expected and not found. @exception DataLengthException if the input is not block size aligned. Reset the buffer and cipher. After resetting the object is in the same state as it was after the last init (if there was one). a basic index for a signer. Base class for an ElGamal secret key. @param in @param x

Return the standard PGP encoding of the key.
The format, as a string, always "PGP". Basic type for a image attribute packet. Basic type for a user attribute sub-packet. return the generic data making up the packet. Subject Directory Attributes Subject Key Identifier Key Usage Private Key Usage Period Subject Alternative Name Issuer Alternative Name Basic Constraints CRL Number Reason code Hold Instruction Code Invalidity Date Delta CRL indicator Issuing Distribution Point Certificate Issuer Name Constraints CRL Distribution Points Certificate Policies Policy Mappings Authority Key Identifier Policy Constraints Extended Key Usage Freshest CRL Inhibit Any Policy Authority Info Access Subject Info Access Logo Type BiometricInfo QCStatements Audit identity extension in attribute certificates. NoRevAvail extension in attribute certificates. TargetInformation extension in attribute certificates. Constructor from Asn1Sequence. the extensions are a list of constructed sequences, either with (Oid, OctetString) or (Oid, Boolean, OctetString) constructor from a table of extensions.

it's is assumed the table contains Oid/string pairs.

Constructor from a table of extensions with ordering.

It's is assumed the table contains Oid/string pairs.

Constructor from two vectors @param objectIDs an ArrayList of the object identifiers. @param values an ArrayList of the extension values. return the extension represented by the object identifier passed in. @return the extension if it's present, null otherwise.
                 Extensions        ::=   SEQUENCE SIZE (1..MAX) OF Extension
            
                 Extension         ::=   SEQUENCE {
                    extnId            EXTENSION.&id ({ExtensionSet}),
                    critical          BOOLEAN DEFAULT FALSE,
                    extnValue         OCTET STRING }
             
return an Enumeration of the extension field's object ids. The KeyPurposeID object.
                KeyPurposeID ::= OBJECT IDENTIFIER
            
return an Oid from the passed in object @exception ArgumentException if the object cannot be converted. return an object Identifier from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. DisplayText class, used in CertificatePolicies X509 V3 extensions (in policy qualifiers).

It stores a string in a chosen encoding.

             DisplayText ::= CHOICE {
                  ia5String        IA5String      (SIZE (1..200)),
                  visibleString    VisibleString  (SIZE (1..200)),
                  bmpString        BMPString      (SIZE (1..200)),
                  utf8String       UTF8String     (SIZE (1..200)) }
             

@see PolicyQualifierInfo @see PolicyInformation
Constant corresponding to ia5String encoding. Constant corresponding to bmpString encoding. Constant corresponding to utf8String encoding. Constant corresponding to visibleString encoding. Describe constant DisplayTextMaximumSize here. Creates a new DisplayText instance. @param type the desired encoding type for the text. @param text the text to store. Strings longer than 200 characters are truncated. Creates a new DisplayText instance. @param text the text to encapsulate. Strings longer than 200 characters are truncated. Creates a new DisplayText instance.

Useful when reading back a DisplayText class from it's Asn1Encodable form.

@param contents an Asn1Encodable instance.
Returns the stored string object. @return the stored text as a string. The AccessDescription object.
            AccessDescription  ::=  SEQUENCE {
                  accessMethod          OBJECT IDENTIFIER,
                  accessLocation        GeneralName  }
            
create an AccessDescription with the oid and location provided. @return the access method. @return the access location The SmimeEncryptionKeyPreference object.
            SmimeEncryptionKeyPreference ::= CHOICE {
                issuerAndSerialNumber   [0] IssuerAndSerialNumber,
                receipentKeyId          [1] RecipientKeyIdentifier,
                subjectAltKeyIdentifier [2] SubjectKeyIdentifier
            }
            
@param sKeyId the subjectKeyIdentifier value (normally the X.509 one) Handler for creating a vector S/MIME Capabilities This outputs the key in Pkcs1v2 format.
                  RsaPrivateKey ::= Sequence {
                                      version Version,
                                      modulus Integer, -- n
                                      publicExponent Integer, -- e
                                      privateExponent Integer, -- d
                                      prime1 Integer, -- p
                                      prime2 Integer, -- q
                                      exponent1 Integer, -- d mod (p-1)
                                      exponent2 Integer, -- d mod (q-1)
                                      coefficient Integer -- (inverse of q) mod p
                                  }
            
                  Version ::= Integer
             

This routine is written to output Pkcs1 version 0, private keys.

A Der encoded set object create an empty set @param obj - a single object that makes up the set. @param v - a vector of objects making up the set. ISIS-MTT-Optional: The certificate requested by the client by inserting the RetrieveIfAllowed extension in the request, will be returned in this extension.

ISIS-MTT-SigG: The signature act allows publishing certificates only then, when the certificate owner gives his isExplicit permission. Accordingly, there may be �nondownloadable� certificates, about which the responder must provide status information, but MUST NOT include them in the response. Clients may get therefore the following three kind of answers on a single request including the RetrieveIfAllowed extension:

  • a) the responder supports the extension and is allowed to publish the certificate: RequestedCertificate returned including the requested certificate
  • b) the responder supports the extension but is NOT allowed to publish the certificate: RequestedCertificate returned including an empty OCTET STRING
  • c) the responder does not support the extension: RequestedCertificate is not included in the response
Clients requesting RetrieveIfAllowed MUST be able to handle these cases. If any of the OCTET STRING options is used, it MUST contain the DER encoding of the requested certificate.

                       RequestedCertificate ::= CHOICE {
                         Certificate Certificate,
                         publicKeyCertificate [0] EXPLICIT OCTET STRING,
                         attributeCertificate [1] EXPLICIT OCTET STRING
                       }
            
Constructor from a given details.

Only one parameter can be given. All other must be null. @param certificate Given as Certificate Produce an object suitable for an Asn1OutputStream.

Returns:

                        RequestedCertificate ::= CHOICE {
                          Certificate Certificate,
                          publicKeyCertificate [0] EXPLICIT OCTET STRING,
                          attributeCertificate [1] EXPLICIT OCTET STRING
                        }
             
@return an Asn1Object
Summary description for OtherHashAlgAndValue. OtherHashAlgAndValue ::= SEQUENCE { hashAlgorithm AlgorithmIdentifier, hashValue OtherHashValue } OtherHashValue ::= OCTET STRING Der VisibleString object. return a Visible string from the passed in object. @exception ArgumentException if the object cannot be converted. return a Visible string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - byte encoded string. basic constructor RFC 3274 - CMS Compressed Data.
            CompressedData ::= SEQUENCE {
             version CMSVersion,
             compressionAlgorithm CompressionAlgorithmIdentifier,
             encapContentInfo EncapsulatedContentInfo
            }
            
class to produce an X.509 Version 2 CRL. reset the generator Set the issuer distinguished name - the issuer is the entity whose private key is used to sign the certificate. Reason being as indicated by CrlReason, i.e. CrlReason.KeyCompromise or 0 if CrlReason is not to be used Add a CRL entry with an Invalidity Date extension as well as a CrlReason extension. Reason being as indicated by CrlReason, i.e. CrlReason.KeyCompromise or 0 if CrlReason is not to be used Add a CRL entry with extensions. Add the CRLEntry objects contained in a previous CRL. @param other the X509Crl to source the other entries from. Set the signature algorithm. This can be either a name or an oid, names are treated as case insensitive. @param signatureAlgorithm string representation of the algorithm name. add a given extension field for the standard extensions tag (tag 0) add a given extension field for the standard extensions tag (tag 0) add a given extension field for the standard extensions tag (tag 0) add a given extension field for the standard extensions tag (tag 0) Generate an X509 CRL, based on the current issuer and subject. The key used for signing. Generate an X509 CRL, based on the current issuer and subject. The key used for signing. A user-defined source of randomness. Allows enumeration of the signature names supported by the generator. The Holder object.
            Holder ::= SEQUENCE {
            	baseCertificateID   [0] IssuerSerial OPTIONAL,
            		-- the issuer and serial number of
            		-- the holder's Public Key Certificate
            	entityName          [1] GeneralNames OPTIONAL,
            		-- the name of the claimant or role
            	objectDigestInfo    [2] ObjectDigestInfo OPTIONAL
            		-- used to directly authenticate the holder,
            		-- for example, an executable
            }
            
Constructs a holder for v2 attribute certificates with a hash value for some type of object.

digestedObjectType can be one of the following:

  • 0 - publicKey - A hash of the public key of the holder must be passed.
  • 1 - publicKeyCert - A hash of the public key certificate of the holder must be passed.
  • 2 - otherObjectDigest - A hash of some other object type must be passed. otherObjectTypeID must not be empty.

This cannot be used if a v1 attribute certificate is used.

@param digestedObjectType The digest object type. @param digestAlgorithm The algorithm identifier for the hash. @param otherObjectTypeID The object type ID if digestedObjectType is otherObjectDigest. @param objectDigest The hash value.
Returns the hash if an object digest info is used. @return The hash or null if no object digest info is set. Return any principal objects inside the attribute certificate holder entity names field. @return an array of IPrincipal objects (usually X509Name), null if no entity names field is set. Return the principals associated with the issuer attached to this holder @return an array of principals, null if no BaseCertificateID is set. Returns the digest object type if an object digest info is used.

  • 0 - publicKey - A hash of the public key of the holder must be passed.
  • 1 - publicKeyCert - A hash of the public key certificate of the holder must be passed.
  • 2 - otherObjectDigest - A hash of some other object type must be passed. otherObjectTypeID must not be empty.

@return The digest object type or -1 if no object digest info is set.
Returns the other object type ID if an object digest info is used. @return The other object type ID or null if no object digest info is set. Returns the digest algorithm ID if an object digest info is used. @return The digest algorithm ID or null if no object digest info is set. Return the serial number associated with the issuer attached to this holder. @return the certificate serial number, null if no BaseCertificateID is set. encode the input data producing a base 64 encoded byte array. @return a byte array containing the base 64 encoded data. Encode the byte data to base 64 writing it to the given output stream. @return the number of bytes produced. Encode the byte data to base 64 writing it to the given output stream. @return the number of bytes produced. decode the base 64 encoded input data. It is assumed the input data is valid. @return a byte array representing the decoded data. decode the base 64 encoded string data - whitespace will be ignored. @return a byte array representing the decoded data. decode the base 64 encoded string data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. basic creation - only the default attributes will be included here. create with a signer with extra signed/unsigned attributes. Utility class for creating IBasicAgreement objects from their names/Oids simply return the cert entry for the private key General class to handle a PGP secret key object. Copy constructor - master key. Copy constructor - subkey. Create a subkey Extract a PgpPrivateKey from this secret key's encrypted contents. Return a copy of the passed in secret key, encrypted using a new password and the passed in algorithm. The PgpSecretKey to be copied. The current password for the key. The new password for the key. The algorithm to be used for the encryption. Source of randomness. Check if this key has an algorithm type that makes it suitable to use for signing. Note: with version 4 keys KeyFlags subpackets should also be considered when present for determining the preferred use of the key. true if this key algorithm is suitable for use with signing. True, if this is a master key. The algorithm the key is encrypted with. The key ID of the public key associated with this key. The public key associated with this key. Allows enumeration of any user IDs associated with the key. An IEnumerable of string objects. Allows enumeration of any user attribute vectors associated with the key. An IEnumerable of string objects. Class to hold a single master public key and its subkeys.

Often PGP keyring files consist of multiple master keys, if you are trying to process or construct one of these you should use the PgpPublicKeyRingBundle class.

Return the first public key in the ring. Return the public key referred to by the passed in key ID if it is present. Allows enumeration of all the public keys. An IEnumerable of PgpPublicKey objects. Returns a new key ring with the public key passed in either added or replacing an existing one. The public key ring to be modified. The public key to be inserted. A new PgpPublicKeyRing Returns a new key ring with the public key passed in removed from the key ring. The public key ring to be modified. The public key to be removed. A new PgpPublicKeyRing, or null if pubKey is not found. note 4 is not used. base generator for an OCSP response - at the moment this only supports the generation of responses containing BasicOCSP responses. Class implementing the WTNAF (Window τ-adic Non-Adjacent Form) algorithm. Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} by k using the reduced τ-adic NAF (RTNAF) method. @param p The F2mPoint to multiply. @param k The integer by which to multiply k. @return p multiplied by k. Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} by an element λ of Z[τ] using the τ-adic NAF (TNAF) method. @param p The F2mPoint to multiply. @param lambda The element λ of Z[τ] of which to compute the [τ]-adic NAF. @return p multiplied by λ. Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} by an element λ of Z[τ] using the window τ-adic NAF (TNAF) method, given the WTNAF of λ. @param p The F2mPoint to multiply. @param u The the WTNAF of λ.. @return λ * p GOST R 34.10-2001 Signature Algorithm generate a signature for the given message using the key we were initialised with. For conventional GOST3410 the message should be a GOST3411 hash of the message of interest. @param message the message that will be verified later. return true if the value r and s represent a GOST3410 signature for the passed in message (for standard GOST3410 the message should be a GOST3411 hash of the real message to be verified). Parameters for NaccacheStern public private key generation. For details on this cipher, please see http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf Parameters for generating a NaccacheStern KeyPair. @param random The source of randomness @param strength The desired strength of the Key in Bits @param certainty the probability that the generated primes are not really prime as integer: 2^(-certainty) is then the probability @param countSmallPrimes How many small key factors are desired Parameters for a NaccacheStern KeyPair. @param random The source of randomness @param strength The desired strength of the Key in Bits @param certainty the probability that the generated primes are not really prime as integer: 2^(-certainty) is then the probability @param cntSmallPrimes How many small key factors are desired @param debug Turn debugging on or off (reveals secret information, use with caution) @return Returns the certainty. @return Returns the countSmallPrimes. A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and Efficiency - by M. Bellare, P. Rogaway, D. Wagner. http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf EAX is an AEAD scheme based on CTR and OMAC1/CMAC, that uses a single block cipher to encrypt and authenticate data. It's on-line (the length of a message isn't needed to begin processing it), has good performances, it's simple and provably secure (provided the underlying block cipher is secure). Of course, this implementations is NOT thread-safe. Constructor that accepts an instance of a block cipher engine. @param cipher the engine to use implements a Cipher-FeedBack (CFB) mode on top of a simple cipher. Basic constructor. @param cipher the block cipher to be used as the basis of the feedback mode. @param blockSize the block size in bits (note: a multiple of 8) return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the IV will be all zeros. An IV which is too short is handled in FIPS compliant fashion. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the block size we are operating at. @return the block size we are operating at (in bytes). Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. Do the appropriate processing for CFB mode encryption. @param in the array containing the data to be encrypted. @param inOff offset into the in array the data starts at. @param out the array the encrypted data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. Do the appropriate processing for CFB mode decryption. @param in the array containing the data to be decrypted. @param inOff offset into the in array the data starts at. @param out the array the encrypted data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. reset the chaining vector back to the IV and reset the underlying cipher. return the algorithm name and mode. @return the name of the underlying algorithm followed by "/CFB" and the block size in bits. * which Generates the p and g values from the given parameters, * returning the ElGamalParameters object. *

* Note: can take a while... *

an implementation of RC2 as described in RFC 2268 "A Description of the RC2(r) Encryption Algorithm" R. Rivest. initialise a RC2 cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the result rotating the 16 bit number in x left by y The no-op engine that just copies bytes through, irrespective of whether encrypting and decrypting. Provided for the sake of completeness. A class that provides CAST6 key encryption operations, such as encoding data and generating keys. All the algorithms herein are from the Internet RFC RFC2612 - CAST6 (128bit block, 128-256bit key) and implement a simplified cryptography interface. Encrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. @param src The plaintext buffer @param srcIndex An offset into src @param dst The ciphertext buffer @param dstIndex An offset into dst Decrypt the given input starting at the given offset and place the result in the provided buffer starting at the given offset. @param src The plaintext buffer @param srcIndex An offset into src @param dst The ciphertext buffer @param dstIndex An offset into dst Does the 12 quad rounds rounds to encrypt the block. @param A the 00-31 bits of the plaintext block @param B the 32-63 bits of the plaintext block @param C the 64-95 bits of the plaintext block @param D the 96-127 bits of the plaintext block @param result the resulting ciphertext Does the 12 quad rounds rounds to decrypt the block. @param A the 00-31 bits of the ciphertext block @param B the 32-63 bits of the ciphertext block @param C the 64-95 bits of the ciphertext block @param D the 96-127 bits of the ciphertext block @param result the resulting plaintext an implementation of the AES (Rijndael)), from FIPS-197.

For further details see: http://csrc.nist.gov/encryption/aes/. This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at http://fp.gladman.plus.com/cryptography_technology/rijndael/ There are three levels of tradeoff of speed vs memory Because java has no preprocessor), they are written as three separate classes from which to choose The fastest uses 8Kbytes of static tables to precompute round calculations), 4 256 word tables for encryption and 4 for decryption. The middle performance version uses only one 256 word table for each), for a total of 2Kbytes), adding 12 rotate operations per round to compute the values contained in the other tables from the contents of the first The slowest version uses no static tables at all and computes the values in each round

This file contains the fast version with 8Kbytes of static tables for round precomputation

Calculate the necessary round keys The number of calculations depends on key size and block size AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits This code is written assuming those are the only possible values default constructor - 128 bit block size. initialise an AES cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Produce an object suitable for an Asn1OutputStream.
            Parameters ::= CHOICE {
               ecParameters ECParameters,
               namedCurve   CURVES.&id({CurveNames}),
               implicitlyCA Null
            }
            
Generator for X.509 extensions Reset the generator Add an extension with the given oid and the passed in value to be included in the OCTET STRING associated with the extension. OID for the extension. True if critical, false otherwise. The ASN.1 object to be included in the extension. Add an extension with the given oid and the passed in byte array to be wrapped in the OCTET STRING associated with the extension. OID for the extension. True if critical, false otherwise. The byte array to be wrapped. Generate an X509Extensions object based on the current state of the generator. An X509Extensions object Return true if there are no extension present in this generator. True if empty, false otherwise The default converter for X509 DN entries when going from their string value to ASN.1 strings. Apply default conversion for the given value depending on the oid and the character range of the value. @param oid the object identifier for the DN entry @param value the value associated with it @return the ASN.1 equivalent for the string value. an X509Certificate structure.
             Certificate ::= Sequence {
                 tbsCertificate          TbsCertificate,
                 signatureAlgorithm      AlgorithmIdentifier,
                 signature               BIT STRING
             }
            
The SemanticsInformation object.
                   SemanticsInformation ::= SEQUENCE {
                     semanticsIdentifier        OBJECT IDENTIFIER   OPTIONAL,
                     nameRegistrationAuthorities NameRegistrationAuthorities
                                                                     OPTIONAL }
                     (WITH COMPONENTS {..., semanticsIdentifier PRESENT}|
                      WITH COMPONENTS {..., nameRegistrationAuthorities PRESENT})
            
                 NameRegistrationAuthorities ::=  SEQUENCE SIZE (1..MAX) OF
                     GeneralName
             
Produce an object suitable for an Asn1OutputStream.
            Request         ::=     Sequence {
                reqCert                     CertID,
                singleRequestExtensions     [0] EXPLICIT Extensions OPTIONAL }
            
Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST be used in new certificates in place of the extension/attribute MonetaryLimit since January 1, 2004. For the sake of backward compatibility with certificates already in use, components SHOULD support MonetaryLimit (as well as QcEuLimitValue).

Indicates a monetary limit within which the certificate holder is authorized to act. (This value DOES NOT express a limit on the liability of the certification authority).

               MonetaryLimitSyntax ::= SEQUENCE
               {
                 currency PrintableString (SIZE(3)),
                 amount INTEGER,
                 exponent INTEGER
               }
            

currency must be the ISO code.

value = amount�10*exponent Constructor from a given details.

value = amount�10^exponent @param currency The currency. Must be the ISO code. @param amount The amount @param exponent The exponent Produce an object suitable for an Asn1OutputStream.

Returns:

                MonetaryLimitSyntax ::= SEQUENCE
                {
                  currency PrintableString (SIZE(3)),
                  amount INTEGER,
                  exponent INTEGER
                }
             
@return an Asn1Object
The definition of SigningCertificateV2 is
            SigningCertificateV2 ::=  SEQUENCE {
                 certs        SEQUENCE OF EssCertIDv2,
                 policies     SEQUENCE OF PolicyInformation OPTIONAL
            }
            
id-aa-signingCertificateV2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) smime(16) id-aa(2) 47 }
return a RecipientKeyIdentifier object from a tagged object. @param _ato the tagged object holding the object we want. @param _explicit true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a RecipientKeyIdentifier object from the given object. @param _obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
             RecipientKeyIdentifier ::= Sequence {
                 subjectKeyIdentifier SubjectKeyIdentifier,
                 date GeneralizedTime OPTIONAL,
                 other OtherKeyAttribute OPTIONAL
             }
            
             SubjectKeyIdentifier ::= OCTET STRING
             
            PKIFailureInfo ::= BIT STRING {
            badAlg               (0),
              -- unrecognized or unsupported Algorithm Identifier
            badMessageCheck      (1), -- integrity check failed (e.g., signature did not verify)
            badRequest           (2),
              -- transaction not permitted or supported
            badTime              (3), -- messageTime was not sufficiently close to the system time, as defined by local policy
            badCertId            (4), -- no certificate could be found matching the provided criteria
            badDataFormat        (5),
              -- the data submitted has the wrong format
            wrongAuthority       (6), -- the authority indicated in the request is different from the one creating the response token
            incorrectData        (7), -- the requester's data is incorrect (for notary services)
            missingTimeStamp     (8), -- when the timestamp is missing but should be there (by policy)
            badPOP               (9)  -- the proof-of-possession failed
            timeNotAvailable    (14),
              -- the TSA's time source is not available
            unacceptedPolicy    (15),
              -- the requested TSA policy is not supported by the TSA
            unacceptedExtension (16),
              -- the requested extension is not supported by the TSA
             addInfoNotAvailable (17)
               -- the additional information requested could not be understood
               -- or is not available
             systemFailure       (25)
               -- the request cannot be handled due to system failure
            
Basic constructor. Often a PGP key ring file is made up of a succession of master/sub-key key rings. If you want to read an entire secret key file in one hit this is the class for you. Build a PgpSecretKeyRingBundle from the passed in input stream. Input stream containing data. If a problem parsing the stream occurs. If an object is encountered which isn't a PgpSecretKeyRing. Allow enumeration of the secret key rings making up this collection. Allow enumeration of the key rings associated with the passed in userId. The user ID to be matched. An IEnumerable of key rings which matched (possibly none). Allow enumeration of the key rings associated with the passed in userId. The user ID to be matched. If true, userId need only be a substring of an actual ID string to match. An IEnumerable of key rings which matched (possibly none). Allow enumeration of the key rings associated with the passed in userId. The user ID to be matched. If true, userId need only be a substring of an actual ID string to match. If true, case is ignored in user ID comparisons. An IEnumerable of key rings which matched (possibly none). Return the PGP secret key associated with the given key id. The ID of the secret key to return. Return the secret key ring which contains the key referred to by keyId The ID of the secret key Return true if a key matching the passed in key ID is present, false otherwise. key ID to look for. Return a new bundle containing the contents of the passed in bundle and the passed in secret key ring. The PgpSecretKeyRingBundle the key ring is to be added to. The key ring to be added. A new PgpSecretKeyRingBundle merging the current one with the passed in key ring. If the keyId for the passed in key ring is already present. Return a new bundle containing the contents of the passed in bundle with the passed in secret key ring removed. The PgpSecretKeyRingBundle the key ring is to be removed from. The key ring to be removed. A new PgpSecretKeyRingBundle not containing the passed in key ring. If the keyId for the passed in key ring is not present. Return the number of rings in this collection. Often a PGP key ring file is made up of a succession of master/sub-key key rings. If you want to read an entire public key file in one hit this is the class for you. Build a PgpPublicKeyRingBundle from the passed in input stream. Input stream containing data. If a problem parsing the stream occurs. If an object is encountered which isn't a PgpPublicKeyRing. Allow enumeration of the public key rings making up this collection. Allow enumeration of the key rings associated with the passed in userId. The user ID to be matched. An IEnumerable of key rings which matched (possibly none). Allow enumeration of the key rings associated with the passed in userId. The user ID to be matched. If true, userId need only be a substring of an actual ID string to match. An IEnumerable of key rings which matched (possibly none). Allow enumeration of the key rings associated with the passed in userId. The user ID to be matched. If true, userId need only be a substring of an actual ID string to match. If true, case is ignored in user ID comparisons. An IEnumerable of key rings which matched (possibly none). Return the PGP public key associated with the given key id. The ID of the public key to return. Return the public key ring which contains the key referred to by keyId key ID to match against Return true if a key matching the passed in key ID is present, false otherwise. key ID to look for. Return a new bundle containing the contents of the passed in bundle and the passed in public key ring. The PgpPublicKeyRingBundle the key ring is to be added to. The key ring to be added. A new PgpPublicKeyRingBundle merging the current one with the passed in key ring. If the keyId for the passed in key ring is already present. Return a new bundle containing the contents of the passed in bundle with the passed in public key ring removed. The PgpPublicKeyRingBundle the key ring is to be removed from. The key ring to be removed. A new PgpPublicKeyRingBundle not containing the passed in key ring. If the keyId for the passed in key ring is not present. Return the number of key rings in this collection. A holder for a list of PGP encryption method packets. Add a request for the given CertificateID. @param certId certificate ID of interest Add a request with extensions @param certId certificate ID of interest @param singleRequestExtensions the extensions to attach to the request Set the requestor name to the passed in X509Principal @param requestorName a X509Principal representing the requestor name. Generate an unsigned request @return the OcspReq @throws OcspException Return an IEnumerable of the signature names supported by the generator. @return an IEnumerable containing recognised names. Class holding methods for point multiplication based on the window τ-adic nonadjacent form (WTNAF). The algorithms are based on the paper "Improved Algorithms for Arithmetic on Anomalous Binary Curves" by Jerome A. Solinas. The paper first appeared in the Proceedings of Crypto 1997. The window width of WTNAF. The standard value of 4 is slightly less than optimal for running time, but keeps space requirements for precomputation low. For typical curves, a value of 5 or 6 results in a better running time. When changing this value, the αu's must be computed differently, see e.g. "Guide to Elliptic Curve Cryptography", Darrel Hankerson, Alfred Menezes, Scott Vanstone, Springer-Verlag New York Inc., 2004, p. 121-122 24 The αu's for a=0 as an array of ZTauElements. The αu's for a=0 as an array of TNAFs. The αu's for a=1 as an array of ZTauElements. The αu's for a=1 as an array of TNAFs. Computes the norm of an element λ of Z[τ]. @param mu The parameter μ of the elliptic curve. @param lambda The element λ of Z[τ]. @return The norm of λ. Computes the norm of an element λ of R[τ], where λ = u + vτ and u and u are real numbers (elements of R). @param mu The parameter μ of the elliptic curve. @param u The real part of the element λ of R[τ]. @param v The τ-adic part of the element λ of R[τ]. @return The norm of λ. Rounds an element λ of R[τ] to an element of Z[τ], such that their difference has minimal norm. λ is given as λ = λ0 + λ1τ. @param lambda0 The component λ0. @param lambda1 The component λ1. @param mu The parameter μ of the elliptic curve. Must equal 1 or -1. @return The rounded element of Z[τ]. @throws ArgumentException if lambda0 and lambda1 do not have same scale. Approximate division by n. For an integer k, the value λ = s k / n is computed to c bits of accuracy. @param k The parameter k. @param s The curve parameter s0 or s1. @param vm The Lucas Sequence element Vm. @param a The parameter a of the elliptic curve. @param m The bit length of the finite field Fm. @param c The number of bits of accuracy, i.e. the scale of the returned SimpleBigDecimal. @return The value λ = s k / n computed to c bits of accuracy. Computes the τ-adic NAF (non-adjacent form) of an element λ of Z[τ]. @param mu The parameter μ of the elliptic curve. @param lambda The element λ of Z[τ]. @return The τ-adic NAF of λ. Applies the operation τ() to an F2mPoint. @param p The F2mPoint to which τ() is applied. @return τ(p) Returns the parameter μ of the elliptic curve. @param curve The elliptic curve from which to obtain μ. The curve must be a Koblitz curve, i.e. a Equals 0 or 1 and b Equals 1. @return μ of the elliptic curve. @throws ArgumentException if the given ECCurve is not a Koblitz curve. Calculates the Lucas Sequence elements Uk-1 and Uk or Vk-1 and Vk. @param mu The parameter μ of the elliptic curve. @param k The index of the second element of the Lucas Sequence to be returned. @param doV If set to true, computes Vk-1 and Vk, otherwise Uk-1 and Uk. @return An array with 2 elements, containing Uk-1 and Uk or Vk-1 and Vk. Computes the auxiliary value tw. If the width is 4, then for mu = 1, tw = 6 and for mu = -1, tw = 10 @param mu The parameter μ of the elliptic curve. @param w The window width of the WTNAF. @return the auxiliary value tw Computes the auxiliary values s0 and s1 used for partial modular reduction. @param curve The elliptic curve for which to compute s0 and s1. @throws ArgumentException if curve is not a Koblitz curve (Anomalous Binary Curve, ABC). Partial modular reduction modulo m - 1)/(τ - 1). @param k The integer to be reduced. @param m The bitlength of the underlying finite field. @param a The parameter a of the elliptic curve. @param s The auxiliary values s0 and s1. @param mu The parameter μ of the elliptic curve. @param c The precision (number of bits of accuracy) of the partial modular reduction. @return ρ := k partmod (τm - 1)/(τ - 1) Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} by a BigInteger using the reduced τ-adic NAF (RTNAF) method. @param p The F2mPoint to Multiply. @param k The BigInteger by which to Multiply p. @return k * p Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} by an element λ of Z[τ] using the τ-adic NAF (TNAF) method. @param p The F2mPoint to Multiply. @param lambda The element λ of Z[τ]. @return λ * p Multiplies a {@link org.bouncycastle.math.ec.F2mPoint F2mPoint} by an element λ of Z[τ] using the τ-adic NAF (TNAF) method, given the TNAF of λ. @param p The F2mPoint to Multiply. @param u The the TNAF of λ.. @return λ * p Computes the [τ]-adic window NAF of an element λ of Z[τ]. @param mu The parameter μ of the elliptic curve. @param lambda The element λ of Z[τ] of which to compute the [τ]-adic NAF. @param width The window width of the resulting WNAF. @param pow2w 2width. @param tw The auxiliary value tw. @param alpha The αu's for the window width. @return The [τ]-adic window NAF of λ. Does the precomputation for WTNAF multiplication. @param p The ECPoint for which to do the precomputation. @param a The parameter a of the elliptic curve. @return The precomputation array for p. An input Stream for a TLS 1.0 connection. A manager for ciphersuite. This class does manage all ciphersuites which are used by MicroTLS. EC-DSA as described in X9.62 Generate a signature for the given message using the key we were initialised with. For conventional DSA the message should be a SHA-1 hash of the message of interest. @param message the message that will be verified later. return true if the value r and s represent a DSA signature for the passed in message (for standard DSA the message should be a SHA-1 hash of the real message to be verified). implements a Output-FeedBack (OFB) mode on top of a simple cipher. Basic constructor. @param cipher the block cipher to be used as the basis of the feedback mode. @param blockSize the block size in bits (note: a multiple of 8) return the underlying block cipher that we are wrapping. @return the underlying block cipher that we are wrapping. Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the IV will be all zeros. An IV which is too short is handled in FIPS compliant fashion. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the block size we are operating at (in bytes). @return the block size we are operating at (in bytes). Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. reset the feedback vector back to the IV and reset the underlying cipher. return the algorithm name and mode. @return the name of the underlying algorithm followed by "/OFB" and the block size in bits CMAC - as specified at www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html

CMAC is analogous to OMAC1 - see also en.wikipedia.org/wiki/CMAC

CMAC is a NIST recomendation - see csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf

CMAC/OMAC1 is a blockcipher-based message authentication code designed and analyzed by Tetsu Iwata and Kaoru Kurosawa.

CMAC/OMAC1 is a simple variant of the CBC MAC (Cipher Block Chaining Message Authentication Code). OMAC stands for One-Key CBC MAC.

It supports 128- or 64-bits block ciphers, with any key size, and returns a MAC with dimension less or equal to the block size of the underlying cipher.

create a standard MAC based on a CBC block cipher (64 or 128 bit block). This will produce an authentication code the length of the block size of the cipher. @param cipher the cipher to be used as the basis of the MAC generation. create a standard MAC based on a block cipher with the size of the MAC been given in bits.

Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography). @param cipher the cipher to be used as the basis of the MAC generation. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8 and @lt;= 128. Reset the mac generator. Key generation parameters for NaccacheStern cipher. For details on this cipher, please see http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf Generates a permuted ArrayList from the original one. The original List is not modified @param arr the ArrayList to be permuted @param rand the source of Randomness for permutation @return a new ArrayList with the permuted elements. Finds the first 'count' primes starting with 3 @param count the number of primes to find @return a vector containing the found primes as Integer Implementation of the SEED algorithm as described in RFC 4009 this does your basic ElGamal algorithm. initialise the ElGamal engine. @param forEncryption true if we are encrypting, false otherwise. @param param the necessary ElGamal key parameters. Return the maximum size for an input block to this engine. For ElGamal this is always one byte less than the size of P on encryption, and twice the length as the size of P on decryption. @return maximum size for an input block. Return the maximum size for an output block to this engine. For ElGamal this is always one byte less than the size of P on decryption, and twice the length as the size of P on encryption. @return maximum size for an output block. Process a single block using the basic ElGamal algorithm. @param in the input array. @param inOff the offset into the input buffer where the data starts. @param length the length of the data to be processed. @return the result of the ElGamal process. @exception DataLengthException the input block is too large. ISO 9796-1 padding. Note in the light of recent results you should only use this with RSA (rather than the "simpler" Rabin keys) and you should never use it with anything other than a hash (ie. even if the message is small don't sign the message, sign it's hash) or some "random" value. See your favorite search engine for details. return the input block size. The largest message we can process is (key_size_in_bits + 3)/16, which in our world comes to key_size_in_bytes / 2. return the maximum possible size for the output. set the number of bits in the next message to be treated as pad bits. retrieve the number of pad bits in the last decoded message. @exception InvalidCipherTextException if the decrypted block is not a valid ISO 9796 bit string Draft FIPS 180-2 implementation of SHA-384. Note: As this is based on a draft this implementation is subject to change.

                     block  word  digest
             SHA-1   512    32    160
             SHA-256 512    32    256
             SHA-384 1024   64    384
             SHA-512 1024   64    512
             
Copy constructor. This will copy the state of the provided message digest. reset the chaining variables implementation of RipeMD see, http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. P1363 7.2.2 ECSVDP-DHC ECSVDP-DHC is Elliptic Curve Secret Value Derivation Primitive, Diffie-Hellman version with cofactor multiplication. It is based on the work of [DH76], [Mil86], [Kob87], [LMQ98] and [Kal98a]. This primitive derives a shared secret value from one party's private key and another party's public key, where both have the same set of EC domain parameters. If two parties correctly execute this primitive, they will produce the same output. This primitive can be invoked by a scheme to derive a shared secret key; specifically, it may be used with the schemes ECKAS-DH1 and DL/ECKAS-DH2. It does not assume the validity of the input public key (see also Section 7.2.1).

Note: As stated P1363 compatibility mode with ECDH can be preset, and in this case the implementation doesn't have a ECDH compatibility mode (if you want that just use ECDHBasicAgreement and note they both implement BasicAgreement!).

Default signed attributes generator. Initialise to use all defaults Initialise with some extra attributes or overrides. @param attributeTable initial attribute table to use. Create a standard attribute table from the passed in parameters - this will normally include contentType, signingTime, and messageDigest. If the constructor using an AttributeTable was used, entries in it for contentType, signingTime, and messageDigest will override the generated ones. @param parameters source parameters for table generation. @return a filled in Hashtable of attributes. @param parameters source parameters @return the populated attribute table general class for handling a pkcs7-signature message. A simple example of usage - note, in the example below the validity of the certificate isn't verified, just the fact that one of the certs matches the given signer...
              IX509Store              certs = s.GetCertificates();
              SignerInformationStore  signers = s.GetSignerInfos();
            
              foreach (SignerInformation signer in signers.GetSigners())
              {
                  ArrayList       certList = new ArrayList(certs.GetMatches(signer.SignerID));
                  X509Certificate cert = (X509Certificate) certList[0];
            
                  if (signer.Verify(cert.GetPublicKey()))
                  {
                      verified++;
                  }
              }
             
Content with detached signature, digests precomputed @param hashes a map of precomputed digests for content indexed by name of hash. @param sigBlock the signature object. base constructor - content with detached signature. @param signedContent the content that was signed. @param sigData the signature object. base constructor - with encapsulated content return the collection of signers that are associated with the signatures for the message. return a X509Store containing the attribute certificates, if any, contained in this message. @param type type of store to create @return a store of attribute certificates @exception NoSuchStoreException if the store type isn't available. @exception CmsException if a general exception prevents creation of the X509Store return a X509Store containing the public key certificates, if any, contained in this message. @param type type of store to create @return a store of public key certificates @exception NoSuchStoreException if the store type isn't available. @exception CmsException if a general exception prevents creation of the X509Store return a X509Store containing CRLs, if any, contained in this message. @param type type of store to create @return a store of CRLs @exception NoSuchStoreException if the store type isn't available. @exception CmsException if a general exception prevents creation of the X509Store return the ASN.1 encoded representation of this object. Replace the signerinformation store associated with this CmsSignedData object with the new one passed in. You would probably only want to do this if you wanted to change the unsigned attributes associated with a signer, or perhaps delete one. @param signedData the signed data object to be used as a base. @param signerInformationStore the new signer information store to use. @return a new signed data object. Replace the certificate and CRL information associated with this CmsSignedData object with the new one passed in. @param signedData the signed data object to be used as a base. @param x509Certs the new certificates to be used. @param x509Crls the new CRLs to be used. @return a new signed data object. @exception CmsException if there is an error processing the stores Return the version number for this object. Return the a string representation of the OID associated with the encapsulated content info structure carried in the signed data. @return the OID for the content type. return the ContentInfo * General class for generating a compressed CMS message. *

* A simple example of usage.

*

*

                *      CMSCompressedDataGenerator fact = new CMSCompressedDataGenerator();
                *      CMSCompressedData data = fact.Generate(content, algorithm);
                * 
*

Generate an object that contains an CMS Compressed Data Packet holding the key flag values. Return the flag values contained in the first 4 octets (note: at the moment the standard only uses the first one). reader for signature sub-packets an object for the elements in the X.509 V3 extension block. Convert the value of the passed in extension to an object. The extension to parse. The object the value string contains. If conversion is not possible. Generator for Version 3 TbsCertificateStructures.
             TbsCertificate ::= Sequence {
                  version          [ 0 ]  Version DEFAULT v1(0),
                  serialNumber            CertificateSerialNumber,
                  signature               AlgorithmIdentifier,
                  issuer                  Name,
                  validity                Validity,
                  subject                 Name,
                  subjectPublicKeyInfo    SubjectPublicKeyInfo,
                  issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
                  subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
                  extensions        [ 3 ] Extensions OPTIONAL
                  }
             
Constructor from a given details.

permitted and excluded are Vectors of GeneralSubtree objects.

@param permitted Permitted subtrees @param excluded Excluded subtrees
return the X9ECParameters object for the named curve represented by the passed in object identifier. Null if the curve isn't present. @param oid an object identifier representing a named curve, if present. return the object identifier signified by the passed in name. Null if there is no object identifier associated with name. @return the object identifier associated with name, if present. return the named curve name represented by the given object identifier. returns an enumeration containing the name strings for curves contained in this structure. write out an RSA private key with it's asscociated information as described in Pkcs8.
                  PrivateKeyInfo ::= Sequence {
                                          version Version,
                                          privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
                                          privateKey PrivateKey,
                                          attributes [0] IMPLICIT Attributes OPTIONAL
                                      }
                  Version ::= Integer {v1(0)} (v1,...)
            
                  PrivateKey ::= OCTET STRING
            
                  Attributes ::= Set OF Attr
             
constructors The definition of SigningCertificate is
            SigningCertificate ::=  SEQUENCE {
                 certs        SEQUENCE OF EssCertID,
                 policies     SEQUENCE OF PolicyInformation OPTIONAL
            }
            
id-aa-signingCertificate OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) smime(16) id-aa(2) 12 }
constructor
            ContentHints ::= SEQUENCE {
              contentDescription UTF8String (SIZE (1..MAX)) OPTIONAL,
              contentType ContentType }
            
RFC 3126: 4.3.2 Revocation Values Attribute Definition OtherRevVals ::= SEQUENCE { otherRevValType OtherRevValType, otherRevVals ANY DEFINED BY otherRevValType } OtherRevValType ::= OBJECT IDENTIFIER RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition OcspListID ::= SEQUENCE { ocspResponses SEQUENCE OF OcspResponsesID } RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition CrlIdentifier ::= SEQUENCE { crlissuer Name, crlIssuedTime UTCTime, crlNumber INTEGER OPTIONAL } Der T61String (also the teletex string) - 8-bit characters return a T61 string from the passed in object. @exception ArgumentException if the object cannot be converted. return an T61 string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - with bytes. basic constructor - with string. a signed data object. Produce an object suitable for an Asn1OutputStream.
            SignedData ::= Sequence {
                version CMSVersion,
                digestAlgorithms DigestAlgorithmIdentifiers,
                encapContentInfo EncapsulatedContentInfo,
                certificates [0] IMPLICIT CertificateSet OPTIONAL,
                crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
                signerInfos SignerInfos
              }
            
return a RecipientIdentifier object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
             RecipientIdentifier ::= CHOICE {
                 issuerAndSerialNumber IssuerAndSerialNumber,
                 subjectKeyIdentifier [0] SubjectKeyIdentifier
             }
            
             SubjectKeyIdentifier ::= OCTET STRING
             
return an RecipientEncryptedKey object from a tagged object. @param obj the tagged object holding the object we want. @param isExplicit true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a RecipientEncryptedKey object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            RecipientEncryptedKey ::= SEQUENCE {
                rid KeyAgreeRecipientIdentifier,
                encryptedKey EncryptedKey
            }
            
return an EnvelopedData object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return an EnvelopedData object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            EnvelopedData ::= Sequence {
                version CMSVersion,
                originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
                recipientInfos RecipientInfos,
                encryptedContentInfo EncryptedContentInfo,
                unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL
            }
            
A class that allows encoding of data using a specific encoder to be processed in chunks. Create. The translator to use. Size of the chunks. Process one byte of data. The byte. An array to store output in. Offset within output array to start writing from. Process data from a byte array. Input data Byte array containing data to be processed. Start position within input data array. Amount of input data to be processed. Output data array. Offset within output data array to start writing to. The amount of data written. Signer Utility class contains methods that can not be specifically grouped into other classes. Returns a ObjectIdentifier for a give encoding. A string representation of the encoding. A DerObjectIdentifier, null if the Oid is not available. Return the raw input stream for the data stream. Return true if the message is integrity protected. True, if there is a modification detection code namespace associated with this stream. Note: This can only be called after the message has been read. True, if the message verifies, false otherwise Base class for an elliptic curve. Decode a point on this curve from its ASN.1 encoding. The different encodings are taken account of, including point compression for Fp (X9.62 s 4.2.1 pg 17). @return The decoded point. Elliptic curve over Fp Elliptic curves over F2m. The Weierstrass equation is given by y2 + xy = x3 + ax2 + b. The exponent m of F2m. TPB: The integer k where xm + xk + 1 represents the reduction polynomial f(z).
PPB: The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
TPB: Always set to 0
PPB: The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
TPB: Always set to 0
PPB: The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z).
The order of the base point of the curve. The cofactor of the curve. The point at infinity on this curve. The parameter μ of the elliptic curve if this is a Koblitz curve. The auxiliary values s0 and s1 used for partial modular reduction for Koblitz curves. Constructor for Trinomial Polynomial Basis (TPB). @param m The exponent m of F2m. @param k The integer k where xm + xk + 1 represents the reduction polynomial f(z). @param a The coefficient a in the Weierstrass equation for non-supersingular elliptic curves over F2m. @param b The coefficient b in the Weierstrass equation for non-supersingular elliptic curves over F2m. Constructor for Trinomial Polynomial Basis (TPB). @param m The exponent m of F2m. @param k The integer k where xm + xk + 1 represents the reduction polynomial f(z). @param a The coefficient a in the Weierstrass equation for non-supersingular elliptic curves over F2m. @param b The coefficient b in the Weierstrass equation for non-supersingular elliptic curves over F2m. @param n The order of the main subgroup of the elliptic curve. @param h The cofactor of the elliptic curve, i.e. #Ea(F2m) = h * n. Constructor for Pentanomial Polynomial Basis (PPB). @param m The exponent m of F2m. @param k1 The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k2 The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k3 The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param a The coefficient a in the Weierstrass equation for non-supersingular elliptic curves over F2m. @param b The coefficient b in the Weierstrass equation for non-supersingular elliptic curves over F2m. Constructor for Pentanomial Polynomial Basis (PPB). @param m The exponent m of F2m. @param k1 The integer k1 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k2 The integer k2 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param k3 The integer k3 where xm + xk3 + xk2 + xk1 + 1 represents the reduction polynomial f(z). @param a The coefficient a in the Weierstrass equation for non-supersingular elliptic curves over F2m. @param b The coefficient b in the Weierstrass equation for non-supersingular elliptic curves over F2m. @param n The order of the main subgroup of the elliptic curve. @param h The cofactor of the elliptic curve, i.e. #Ea(F2m) = h * n. Returns the parameter μ of the elliptic curve. @return μ of the elliptic curve. @throws ArgumentException if the given ECCurve is not a Koblitz curve. @return the auxiliary values s0 and s1 used for partial modular reduction for Koblitz curves. Solves a quadratic equation z2 + z = beta(X9.62 D.1.6) The other solution is z + 1. @param beta The value to solve the qradratic equation for. @return the solution for z2 + z = beta or null if no solution exists. Return true if curve uses a Trinomial basis. @return true if curve Trinomial, false otherwise. Returns true if this is a Koblitz curve (ABC curve). @return true if this is a Koblitz curve (ABC curve), false otherwise A queue for bytes.

This file could be more optimized.

The initial size for our buffer. The smallest number which can be written as 2^x which is bigger than i. The buffer where we store our data. How many bytes at the beginning of the buffer are skipped. How many bytes in the buffer are valid data. Read data from the buffer. The buffer where the read data will be copied to. How many bytes to skip at the beginning of buf. How many bytes to read at all. How many bytes from our data to skip. Add some data to our buffer. A byte-array to read data from. How many bytes to skip at the beginning of the array. How many bytes to read from the array. Remove some bytes from our data from the beginning. How many bytes to remove. The number of bytes which are available in this buffer. Permutation generated by code: // First 1850 fractional digit of Pi number. byte[] key = new BigInteger("14159265358979323846...5068006422512520511").ToByteArray(); s = 0; P = new byte[256]; for (int i = 0; i < 256; i++) { P[i] = (byte) i; } for (int m = 0; m < 768; m++) { s = P[(s + P[m & 0xff] + key[m % key.length]) & 0xff]; byte temp = P[m & 0xff]; P[m & 0xff] = P[s & 0xff]; P[s & 0xff] = temp; } Value generated in the same way as P. return the generator - g return private value limit - l DES based CBC Block Cipher MAC according to ISO9797, algorithm 3 (ANSI X9.19 Retail MAC) This could as well be derived from CBCBlockCipherMac, but then the property mac in the base class must be changed to protected create a Retail-MAC based on a CBC block cipher. This will produce an authentication code of the length of the block size of the cipher. @param cipher the cipher to be used as the basis of the MAC generation. This must be DESEngine. create a Retail-MAC based on a CBC block cipher. This will produce an authentication code of the length of the block size of the cipher. @param cipher the cipher to be used as the basis of the MAC generation. @param padding the padding to be used to complete the last block. create a Retail-MAC based on a block cipher with the size of the MAC been given in bits. This class uses single DES CBC mode as the basis for the MAC generation.

Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography).

@param cipher the cipher to be used as the basis of the MAC generation. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
create a standard MAC based on a block cipher with the size of the MAC been given in bits. This class uses single DES CBC mode as the basis for the MAC generation. The final block is decrypted and then encrypted using the middle and right part of the key.

Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography).

@param cipher the cipher to be used as the basis of the MAC generation. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. @param padding the padding to be used to complete the last block.
Reset the mac generator. implements a Cipher-FeedBack (CFB) mode on top of a simple cipher. Basic constructor. @param cipher the block cipher to be used as the basis of the feedback mode. @param blockSize the block size in bits (note: a multiple of 8) Initialise the cipher and, possibly, the initialisation vector (IV). If an IV isn't passed as part of the parameter, the IV will be all zeros. An IV which is too short is handled in FIPS compliant fashion. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the block size we are operating at. @return the block size we are operating at (in bytes). Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. reset the chaining vector back to the IV and reset the underlying cipher. return the algorithm name and mode. @return the name of the underlying algorithm followed by "/CFB" and the block size in bits. create a standard MAC based on a CFB block cipher. This will produce an authentication code half the length of the block size of the cipher, with the CFB mode set to 8 bits. @param cipher the cipher to be used as the basis of the MAC generation. create a standard MAC based on a CFB block cipher. This will produce an authentication code half the length of the block size of the cipher, with the CFB mode set to 8 bits. @param cipher the cipher to be used as the basis of the MAC generation. @param padding the padding to be used. create a standard MAC based on a block cipher with the size of the MAC been given in bits. This class uses CFB mode as the basis for the MAC generation.

Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography).

@param cipher the cipher to be used as the basis of the MAC generation. @param cfbBitSize the size of an output block produced by the CFB mode. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
create a standard MAC based on a block cipher with the size of the MAC been given in bits. This class uses CFB mode as the basis for the MAC generation.

Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography).

@param cipher the cipher to be used as the basis of the MAC generation. @param cfbBitSize the size of an output block produced by the CFB mode. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. @param padding a padding to be used.
Reset the mac generator. a ElGamal key pair generator.

This Generates keys consistent for use with ElGamal as described in page 164 of "Handbook of Applied Cryptography".

An XTEA engine. Create an instance of the TEA encryption algorithm and set some defaults initialise @param forEncryption whether or not we are for encryption. @param params the parameters required to set up the cipher. @exception ArgumentException if the params argument is inappropriate. Re-key the cipher. @param key the key to be used X9.63 based key derivation function for ECDH CMS. Return the first SignerInformation object that matches the passed in selector. Null if there are no matches. @param selector to identify a signer @return a single SignerInformation object. Null if none matches. An ICollection of all signers in the collection Return possible empty collection with signers matching the passed in SignerID @param selector a signer id to select against. @return a collection of SignerInformation objects. The number of signers in the collection. Parsing class for an CMS Signed Data object from an input stream.

Note: that because we are in a streaming mode only one signer can be tried and it is important that the methods on the parser are called in the appropriate order.

A simple example of usage for an encapsulated signature.

Two notes: first, in the example below the validity of the certificate isn't verified, just the fact that one of the certs matches the given signer, and, second, because we are in a streaming mode the order of the operations is important.

                  CmsSignedDataParser     sp = new CmsSignedDataParser(encapSigData);
            
                  sp.GetSignedContent().Drain();
            
                  IX509Store              certs = sp.GetCertificates();
                  SignerInformationStore  signers = sp.GetSignerInfos();
            
                  foreach (SignerInformation signer in signers.GetSigners())
                  {
                      ArrayList       certList = new ArrayList(certs.GetMatches(signer.SignerID));
                      X509Certificate cert = (X509Certificate) certList[0];
            
                      Console.WriteLine("verify returns: " + signer.Verify(cert));
                  }
             
Note also: this class does not introduce buffering - if you are processing large files you should create the parser with:
                      CmsSignedDataParser     ep = new CmsSignedDataParser(new BufferedInputStream(encapSigData, bufSize));
              
where bufSize is a suitably large buffer size.
base constructor - with encapsulated content base constructor @param signedContent the content that was signed. @param sigData the signature object. return the collection of signers that are associated with the signatures for the message. @throws CmsException return a X509Store containing the attribute certificates, if any, contained in this message. @param type type of store to create @return a store of attribute certificates @exception org.bouncycastle.x509.NoSuchStoreException if the store type isn't available. @exception CmsException if a general exception prevents creation of the X509Store return a X509Store containing the public key certificates, if any, contained in this message. @param type type of store to create @return a store of public key certificates @exception NoSuchStoreException if the store type isn't available. @exception CmsException if a general exception prevents creation of the X509Store return a X509Store containing CRLs, if any, contained in this message. @param type type of store to create @return a store of CRLs @exception NoSuchStoreException if the store type isn't available. @exception CmsException if a general exception prevents creation of the X509Store Replace the signerinformation store associated with the passed in message contained in the stream original with the new one passed in. You would probably only want to do this if you wanted to change the unsigned attributes associated with a signer, or perhaps delete one.

The output stream is returned unclosed.

@param original the signed data stream to be used as a base. @param signerInformationStore the new signer information store to use. @param out the stream to Write the new signed data object to. @return out.
Replace the certificate and CRL information associated with this CMSSignedData object with the new one passed in.

The output stream is returned unclosed.

@param original the signed data stream to be used as a base. @param certsAndCrls the new certificates and CRLs to be used. @param out the stream to Write the new signed data object to. @return out. @exception CmsException if there is an error processing the CertStore
Return the version number for the SignedData object @return the version number Parsing class for an CMS Enveloped Data object from an input stream.

Note: that because we are in a streaming mode only one recipient can be tried and it is important that the methods on the parser are called in the appropriate order.

Example of use - assuming the first recipient matches the private key we have.

                  CmsEnvelopedDataParser     ep = new CmsEnvelopedDataParser(inputStream);
            
                  RecipientInformationStore  recipients = ep.GetRecipientInfos();
            
                  Collection  c = recipients.getRecipients();
                  Iterator    it = c.iterator();
            
                  if (it.hasNext())
                  {
                      RecipientInformation   recipient = (RecipientInformation)it.next();
            
                      CMSTypedStream recData = recipient.getContentStream(privateKey);
            
                      processDataStream(recData.getContentStream());
                  }
              
Note: this class does not introduce buffering - if you are processing large files you should create the parser with:
                      CmsEnvelopedDataParser     ep = new CmsEnvelopedDataParser(new BufferedInputStream(inputStream, bufSize));
              
where bufSize is a suitably large buffer size.

return a store of the intended recipients for this message return a table of the unprotected attributes indexed by the OID of the attribute. @throws IOException return the object identifier for the content encryption algorithm. return the ASN.1 encoded encryption algorithm parameters, or null if there aren't any. packet giving signature creation time. table of the current named curves defined in X.962 EC-DSA. return the X9ECParameters object for the named curve represented by the passed in object identifier. Null if the curve isn't present. @param oid an object identifier representing a named curve, if present. return the object identifier signified by the passed in name. Null if there is no object identifier associated with name. @return the object identifier associated with name, if present. return the named curve name represented by the given object identifier. returns an enumeration containing the name strings for curves contained in this structure. PKIX RFC-2459 The X.509 v2 CRL syntax is as follows. For signature calculation, the data that is to be signed is ASN.1 Der encoded.
             CertificateList  ::=  Sequence  {
                  tbsCertList          TbsCertList,
                  signatureAlgorithm   AlgorithmIdentifier,
                  signatureValue       BIT STRING  }
             
            TimeStampResp ::= SEQUENCE  {
              status                  PkiStatusInfo,
              timeStampToken          TimeStampToken     OPTIONAL  }
            
            TimeStampReq ::= SEQUENCE  {
             version                      INTEGER  { v1(1) },
             messageImprint               MessageImprint,
               --a hash algorithm OID and the hash value of the data to be
               --time-stamped
             reqPolicy             TSAPolicyId              OPTIONAL,
             nonce                 INTEGER                  OPTIONAL,
             certReq               BOOLEAN                  DEFAULT FALSE,
             extensions            [0] IMPLICIT Extensions  OPTIONAL
            }
            
Utility class for fetching curves using their NIST names as published in FIPS-PUB 186-2 return the X9ECParameters object for the named curve represented by the passed in object identifier. Null if the curve isn't present. @param oid an object identifier representing a named curve, if present. return the object identifier signified by the passed in name. Null if there is no object identifier associated with name. @return the object identifier associated with name, if present. return the named curve name represented by the given object identifier. returns an enumeration containing the name strings for curves contained in this structure. constructor
            EssCertID ::= SEQUENCE {
                certHash Hash,
                issuerSerial IssuerSerial OPTIONAL }
            
OtherHash ::= CHOICE { sha1Hash OtherHashValue, -- This contains a SHA-1 hash otherHash OtherHashAlgAndValue } OtherHashValue ::= OCTET STRING Der PrintableString object. return a printable string from the passed in object. @exception ArgumentException if the object cannot be converted. return a Printable string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - byte encoded string. basic constructor - this does not validate the string Constructor with optional validation. @param string the base string to wrap. @param validate whether or not to check the string. @throws ArgumentException if validate is true and the string contains characters that should not be in a PrintableString. return true if the passed in String can be represented without loss as a PrintableString, false otherwise. @return true if in printable set, false otherwise.
                  EncryptedData ::= SEQUENCE {
                                version CMSVersion,
                                encryptedContentInfo EncryptedContentInfo,
                                unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
            
@return a basic ASN.1 object representation.
Validate the passed in certificate as being of the correct type to be used for time stamping. To be valid it must have an ExtendedKeyUsage extension which has a key purpose identifier of id-kp-timeStamping. @param cert the certificate of interest. @throws TspValidationException if the certicate fails on one of the check points. Return the digest algorithm using one of the standard JCA string representations rather than the algorithm identifier (if possible). Generator for RFC 3161 Time Stamp Request objects. add a given extension field for the standard extensions tag (tag 3) @throws IOException add a given extension field for the standard extensions tag The value parameter becomes the contents of the octet string associated with the extension. Holder for a list of PgpOnePassSignature objects. Generator for a PGP master and subkey ring. This class will generate both the secret and public key rings Create a new key ring generator using old style checksumming. It is recommended to use SHA1 checksumming where possible. The certification level for keys on this ring. The master key pair. The id to be associated with the ring. The algorithm to be used to protect secret keys. The passPhrase to be used to protect secret keys. Packets to be included in the certification hash. Packets to be attached unhashed to the certification. input secured random. Create a new key ring generator. The certification level for keys on this ring. The master key pair. The id to be associated with the ring. The algorithm to be used to protect secret keys. The passPhrase to be used to protect secret keys. Checksum the secret keys with SHA1 rather than the older 16 bit checksum. Packets to be included in the certification hash. Packets to be attached unhashed to the certification. input secured random. Add a subkey to the key ring to be generated with default certification. Add a subkey with specific hashed and unhashed packets associated with it and default certification. Public/private key pair. Hashed packet values to be included in certification. Unhashed packets values to be included in certification. Return the secret key ring. Return the public key ring that corresponds to the secret key ring. RSA-PSS as described in Pkcs# 1 v 2.1.

Note: the usual value for the salt length is the number of bytes in the hash function.

Basic constructor the asymmetric cipher to use. the digest to use. the length of the salt to use (in bytes). clear possible sensitive data update the internal digest with the byte b update the internal digest with the byte array in reset the internal state Generate a signature for the message we've been loaded with using the key we were initialised with. return true if the internal state represents the signature described in the passed in array. int to octet string. mask generator function, as described in Pkcs1v2. update the internal digest with the byte b update the internal digest with the byte array in Generate a signature for the message we've been loaded with using the key we were initialised with. true if the internal state represents the signature described in the passed in array. Reset the internal state A wrapper class that allows block ciphers to be used to process data in a piecemeal fashion with padding. The PaddedBufferedBlockCipher outputs a block only when the buffer is full and more data is being added, or on a doFinal (unless the current block in the buffer is a pad block). The default padding mechanism used is the one outlined in Pkcs5/Pkcs7. Create a buffered block cipher with the desired padding. @param cipher the underlying block cipher this buffering object wraps. @param padding the padding type. Create a buffered block cipher Pkcs7 padding @param cipher the underlying block cipher this buffering object wraps. initialise the cipher. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. @exception ArgumentException if the parameters argument is inappropriate. return the minimum size of the output buffer required for an update plus a doFinal with an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to update and doFinal with len bytes of input. return the size of the output buffer required for an update an input of len bytes. @param len the length of the input. @return the space required to accommodate a call to update with len bytes of input. process a single byte, producing an output block if neccessary. @param in the input byte. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. process an array of bytes, producing output if necessary. @param in the input byte array. @param inOff the offset at which the input data starts. @param len the number of bytes to be copied out of the input array. @param out the space for any output that might be produced. @param outOff the offset from which the output will be copied. @return the number of output bytes copied to out. @exception DataLengthException if there isn't enough space in out. @exception InvalidOperationException if the cipher isn't initialised. Process the last block in the buffer. If the buffer is currently full and padding needs to be added a call to doFinal will produce 2 * GetBlockSize() bytes. @param out the array the block currently being held is copied into. @param outOff the offset at which the copying starts. @return the number of output bytes copied to out. @exception DataLengthException if there is insufficient space in out for the output or we are decrypting and the input is not block size aligned. @exception InvalidOperationException if the underlying cipher is not initialised. @exception InvalidCipherTextException if padding is expected and not found. a basic Diffie-Helman key pair generator. This Generates keys consistent for use with the basic algorithm for Diffie-Helman. an implementation of the RFC 3211 Key Wrap Specification. An RC6 engine. Create an instance of the RC6 encryption algorithm and set some defaults initialise a RC5-32 cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Re-key the cipher. @param inKey the key to be used Perform a left "spin" of the word. The rotation of the given word x is rotated left by y bits. Only the lg(wordSize) low-order bits of y are used to determine the rotation amount. Here it is assumed that the wordsize used is a power of 2. @param x word to rotate @param y number of bits to rotate % wordSize Perform a right "spin" of the word. The rotation of the given word x is rotated left by y bits. Only the lg(wordSize) low-order bits of y are used to determine the rotation amount. Here it is assumed that the wordsize used is a power of 2. @param x word to rotate @param y number of bits to rotate % wordSize Wrap keys according to RFC 3217 - RC2 mechanism Field engine Field param Field paramPlusIV Field iv Field forWrapping Field IV2 Method init @param forWrapping @param param Method wrap @param in @param inOff @param inLen @return Method unwrap @param in @param inOff @param inLen @return @throws InvalidCipherTextException Some key wrap algorithms make use of the Key Checksum defined in CMS [CMS-Algorithms]. This is used to provide an integrity check value for the key being wrapped. The algorithm is - Compute the 20 octet SHA-1 hash on the key being wrapped. - Use the first 8 octets of this hash as the checksum value. @param key @return @throws Exception @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum @param key @param checksum @return @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum Method GetAlgorithmName @return An implementation of the AES Key Wrapper from the NIST Key Wrap Specification.

For further details see: http://csrc.nist.gov/encryption/kms/key-wrap.pdf. an implementation of the AES (Rijndael), from FIPS-197.

For further details see: http://csrc.nist.gov/encryption/aes/. This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at http://fp.gladman.plus.com/cryptography_technology/rijndael/ There are three levels of tradeoff of speed vs memory Because java has no preprocessor, they are written as three separate classes from which to choose The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption and 4 for decryption. The middle performance version uses only one 256 word table for each, for a total of 2Kbytes, adding 12 rotate operations per round to compute the values contained in the other tables from the contents of the first The slowest version uses no static tables at all and computes the values in each round.

This file contains the slowest performance version with no static tables for round precomputation, but it has the smallest foot print.

Calculate the necessary round keys The number of calculations depends on key size and block size AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits This code is written assuming those are the only possible values default constructor - 128 bit block size. initialise an AES cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Basic type for a trust packet. Basic packet for a PGP public key. Base class for a DSA public key. The stream to read the packet from. Return the standard PGP encoding of the key. The format, as a string, always "PGP". ASN.1 def for Elliptic-Curve Curve structure. See X9.62, for further details. Produce an object suitable for an Asn1OutputStream.
             Curve ::= Sequence {
                 a               FieldElement,
                 b               FieldElement,
                 seed            BIT STRING      OPTIONAL
             }
            
            Accuracy ::= SEQUENCE {
                        seconds        INTEGER              OPTIONAL,
                        millis     [0] INTEGER  (1..999)    OPTIONAL,
                        micros     [1] INTEGER  (1..999)    OPTIONAL
                        }
            
Produce an object suitable for an Asn1OutputStream.
            ResponderID ::= CHOICE {
                 byName          [1] Name,
                 byKey           [2] KeyHash }
            
Der IA5String object - this is an ascii string. return a IA5 string from the passed in object @exception ArgumentException if the object cannot be converted. return an IA5 string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - with bytes. basic constructor - without validation. Constructor with optional validation. @param string the base string to wrap. @param validate whether or not to check the string. @throws ArgumentException if validate is true and the string contains characters that should not be in an IA5String. return true if the passed in String can be represented without loss as an IA5String, false otherwise. @return true if in printable set, false otherwise. The NetscapeCertType object.
               NetscapeCertType ::= BIT STRING {
                    SSLClient               (0),
                    SSLServer               (1),
                    S/MIME                  (2),
                    Object Signing          (3),
                    Reserved                (4),
                    SSL CA                  (5),
                    S/MIME CA               (6),
                    Object Signing CA       (7) }
            
Basic constructor. @param usage - the bitwise OR of the Key Usage flags giving the allowed uses for the key. e.g. (X509NetscapeCertType.sslCA | X509NetscapeCertType.smimeCA) Some other restriction regarding the usage of this certificate.

             RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
            
Constructor from DirectoryString.

The DirectoryString is of type RestrictionSyntax:

                  RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
             
@param restriction A IAsn1String.
Constructor from a given details. @param restriction The description of the restriction. Produce an object suitable for an Asn1OutputStream.

Returns:

                  RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
             

@return an Asn1Object
RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition OcspIdentifier ::= SEQUENCE { ocspResponderID ResponderID, -- As in OCSP response data producedAt GeneralizedTime -- As in OCSP response data } We insert one of these when we find a tag we don't recognise. @param tag the tag value. @param data the contents octets.
             Gost28147-89-Parameters ::=
                           SEQUENCE {
                                   iv                   Gost28147-89-IV,
                                   encryptionParamSet   OBJECT IDENTIFIER
                            }
            
               Gost28147-89-IV ::= OCTET STRING (SIZE (8))
             
Produce an object suitable for an Asn1OutputStream.
            ContentInfo ::= SEQUENCE {
                     contentType ContentType,
                     content
                     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
            
Produce an object suitable for an Asn1OutputStream.
            ContentInfo ::= Sequence {
                     contentType ContentType,
                     content
                     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
            
An output stream that compresses into the BZip2 format (with the file header chars) into another stream. @author Keiron Liddle TODO: Update to BZip2 1.0.1 NB: note this class has been modified to add a leading BZ to the start of the BZIP2 stream to make it compatible with other PGP programs. modified by Oliver Merkel, 010128 An implementation of a version 2 X.509 Attribute Certificate. Interface for an X.509 Attribute Certificate. Return the attributes contained in the attribute block in the certificate. An array of attributes. Return the attributes with the same type as the passed in oid. The object identifier we wish to match. An array of matched attributes, null if there is no match. Return an ASN.1 encoded byte array representing the attribute certificate. An ASN.1 encoded byte array. If the certificate cannot be encoded. The version number for the certificate. The serial number for the certificate. The UTC DateTime before which the certificate is not valid. The UTC DateTime after which the certificate is not valid. The holder of the certificate. The issuer details for the certificate. A holding class for constructing an X509 Key Usage extension.
                id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
            
                KeyUsage ::= BIT STRING {
                     digitalSignature        (0),
                     nonRepudiation          (1),
                     keyEncipherment         (2),
                     dataEncipherment        (3),
                     keyAgreement            (4),
                     keyCertSign             (5),
                     cRLSign                 (6),
                     encipherOnly            (7),
                     decipherOnly            (8) }
             
Basic constructor. @param usage - the bitwise OR of the Key Usage flags giving the allowed uses for the key. e.g. (X509KeyUsage.keyEncipherment | X509KeyUsage.dataEncipherment) Create loading data from byte array. Create loading data from byte array. Generates a certificate revocation list (CRL) object and initializes it with the data read from the input stream inStream. Returns a (possibly empty) collection view of the CRLs read from the given input stream inStream. The inStream may contain a sequence of DER-encoded CRLs, or a PKCS#7 CRL set. This is a PKCS#7 SignedData object, with the only significant field being crls. In particular the signature and the contents are ignored. Class to decode and encode Hex. encode the input data producing a Hex encoded byte array. @return a byte array containing the Hex encoded data. encode the input data producing a Hex encoded byte array. @return a byte array containing the Hex encoded data. Hex encode the byte data writing it to the given output stream. @return the number of bytes produced. Hex encode the byte data writing it to the given output stream. @return the number of bytes produced. decode the Hex encoded input data. It is assumed the input data is valid. @return a byte array representing the decoded data. decode the Hex encoded string data - whitespace will be ignored. @return a byte array representing the decoded data. decode the Hex encoded string data writing it to the given output stream, whitespace characters will be ignored. @return the number of bytes produced. General array utilities. Are two arrays equal. Left side. Right side. True if equal. @return the nonce value, null if there isn't one. Class to hold a single master secret key and its subkeys.

Often PGP keyring files consist of multiple master keys, if you are trying to process or construct one of these you should use the PgpSecretKeyRingBundle class.

Return the public key for the master key. Return the master private key. Allows enumeration of the secret keys. An IEnumerable of PgpSecretKey objects. Returns a new key ring with the secret key passed in either added or replacing an existing one with the same key ID. The secret key ring to be modified. The secret key to be inserted. A new PgpSecretKeyRing Returns a new key ring with the secret key passed in removed from the key ring. The secret key ring to be modified. The secret key to be removed. A new PgpSecretKeyRing, or null if secKey is not found. General class to handle JCA key pairs and convert them into OpenPGP ones.

A word for the unwary, the KeyId for an OpenPGP public key is calculated from a hash that includes the time of creation, if you pass a different date to the constructor below with the same public private key pair the KeyIs will not be the same as for previous generations of the key, so ideally you only want to do this once.

Create a key pair from a PgpPrivateKey and a PgpPublicKey. The public key. The private key. The keyId associated with this key pair. Class for producing compressed data packets.

Return an output stream which will save the data being written to the compressed object.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

Stream to be used for output. A Stream for output of the compressed data.

Return an output stream which will compress the data as it is written to it. The stream will be written out in chunks according to the size of the passed in buffer.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

Note: if the buffer is not a power of 2 in length only the largest power of 2 bytes worth of the buffer will be used.

Note: using this may break compatibility with RFC 1991 compliant tools. Only recent OpenPGP implementations are capable of accepting these streams.

Stream to be used for output. The buffer to use. A Stream for output of the compressed data.
Close the compressed object.summary> An implementation of all high level protocols in TLS 1.0. This method is called, when a change cipher spec message is received. @throws IOException If the message has an invalid content or the handshake is not in the correct state. Connects to the remote system. Will be used when a certificate is received to verify that this certificate is accepted by the client. If handshake was not successful Read data from the network. The method will return immed, if there is still some data left in the buffer, or block untill some application data has been read from the network. @param buf The buffer where the data will be copied to. @param offset The position where the data will be placed in the buffer. @param len The maximum number of bytes to read. @return The number of bytes read. @throws IOException If something goes wrong during reading data. Send some application data to the remote system.

The method will handle fragmentation internally. @param buf The buffer with the data. @param offset The position in the buffer where the data is placed. @param len The length of the data. @throws IOException If something goes wrong during sending. Terminate this connection whith an alert.

Can be used for normal closure too. @param alertLevel The level of the alert, an be AL_fatal or AL_warning. @param alertDescription The exact alert message. @throws IOException If alert was fatal.

Closes this connection If something goes wrong during closing.
Make sure the Stream is now empty. Fail otherwise. @param is The Stream to check. @throws IOException If is is not empty. A Stream which can be used to send data. A Stream which can be used to read data. HMAC implementation based on RFC2104 H(K XOR opad, H(K XOR ipad, text)) Reset the mac generator. * Serpent is a 128-bit 32-round block cipher with variable key lengths, * including 128, 192 and 256 bit keys conjectured to be at least as * secure as three-key triple-DES. *

* Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a * candidate algorithm for the NIST AES Quest.> *

*

* For full details see the The Serpent home page *

initialise a Serpent cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Process one block of input from the array in and write it to the out array. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. @exception DataLengthException if there isn't enough data in in, or space in out. @exception InvalidOperationException if the cipher isn't initialised. @return the number of bytes processed and produced. Expand a user-supplied key material into a session key. @param key The user-key bytes (multiples of 4) to use. @exception ArgumentException Encrypt one block of plaintext. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. Decrypt one block of ciphertext. @param in the array containing the input data. @param inOff offset into the in array the data starts at. @param out the array the output data will be copied into. @param outOff the offset into the out array the output will start at. S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms. InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms. S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms. InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps. S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms. InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps. S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms. InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms. InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms. S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms. InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms. S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms. InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms. S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms. InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms. Apply the linear transformation to the register set. Apply the inverse of the linear transformation to the register set. this does your basic RSA algorithm with blinding initialise the RSA engine. @param forEncryption true if we are encrypting, false otherwise. @param param the necessary RSA key parameters. Return the maximum size for an input block to this engine. For RSA this is always one byte less than the key size on encryption, and the same length as the key size on decryption. @return maximum size for an input block. Return the maximum size for an output block to this engine. For RSA this is always one byte less than the key size on decryption, and the same length as the key size on encryption. @return maximum size for an output block. Process a single block using the basic RSA algorithm. @param inBuf the input array. @param inOff the offset into the input buffer where the data starts. @param inLen the length of the data to be processed. @return the result of the RSA process. @exception DataLengthException the input block is too large. HC-128 is a software-efficient stream cipher created by Hongjun Wu. It generates keystream from a 128-bit secret key and a 128-bit initialization vector.

http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc256_p3.pdf

It is a third phase candidate in the eStream contest, and is patent-free. No attacks are known as of today (April 2007). See http://www.ecrypt.eu.org/stream/hcp3.html

Initialise a HC-128 cipher. @param forEncryption whether or not we are for encryption. Irrelevant, as encryption and decryption are the same. @param params the parameters required to set up the cipher. @throws ArgumentException if the params argument is inappropriate (ie. the key is not 128 bit long). a Diffie-Hellman key agreement class.

note: This is only the basic algorithm, it doesn't take advantage of long term public keys if they are available. See the DHAgreement class for a "better" implementation.

given a short term public key from a given party calculate the next message in the agreement sequence. a holding class for a file of data to be processed. The file handle Basic PGP user attribute sub-packet tag types. Basic tags for symmetric key algorithms packet giving whether or not is revocable. A multiple precision integer Basic packet for a modification detection code packet. Basic tags for compression algorithms. The MonetaryValue object.
            MonetaryValue  ::=  SEQUENCE {
                  currency              Iso4217CurrencyCode,
                  amount               INTEGER,
                  exponent             INTEGER }
            -- value = amount * 10^exponent
            
The GeneralName object.
             GeneralName ::= CHOICE {
                  otherName                       [0]     OtherName,
                  rfc822Name                      [1]     IA5String,
                  dNSName                         [2]     IA5String,
                  x400Address                     [3]     ORAddress,
                  directoryName                   [4]     Name,
                  ediPartyName                    [5]     EDIPartyName,
                  uniformResourceIdentifier       [6]     IA5String,
                  iPAddress                       [7]     OCTET STRING,
                  registeredID                    [8]     OBJECT IDENTIFIER}
            
             OtherName ::= Sequence {
                  type-id    OBJECT IDENTIFIER,
                  value      [0] EXPLICIT ANY DEFINED BY type-id }
            
             EDIPartyName ::= Sequence {
                  nameAssigner            [0]     DirectoryString OPTIONAL,
                  partyName               [1]     DirectoryString }
             
When the subjectAltName extension contains an Internet mail address, the address MUST be included as an rfc822Name. The format of an rfc822Name is an "addr-spec" as defined in RFC 822 [RFC 822]. When the subjectAltName extension contains a domain name service label, the domain name MUST be stored in the dNSName (an IA5String). The name MUST be in the "preferred name syntax," as specified by RFC 1034 [RFC 1034]. When the subjectAltName extension contains a URI, the name MUST be stored in the uniformResourceIdentifier (an IA5String). The name MUST be a non-relative URL, and MUST follow the URL syntax and encoding rules specified in [RFC 1738]. The name must include both a scheme (e.g., "http" or "ftp") and a scheme-specific-part. The scheme- specific-part must include a fully qualified domain name or IP address as the host. When the subjectAltName extension contains a iPAddress, the address MUST be stored in the octet string in "network byte order," as specified in RFC 791 [RFC 791]. The least significant bit (LSB) of each octet is the LSB of the corresponding byte in the network address. For IP Version 4, as specified in RFC 791, the octet string MUST contain exactly four octets. For IP Version 6, as specified in RFC 1883, the octet string MUST contain exactly sixteen octets [RFC 1883]. Create a GeneralName for the given tag from the passed in string.

This constructor can handle:

  • rfc822Name
  • iPAddress
  • directoryName
  • dNSName
  • uniformResourceIdentifier
  • registeredID
For x400Address, otherName and ediPartyName there is no common string format defined.

Note: A directory name can be encoded in different ways into a byte representation. Be aware of this if the byte representation is used for comparing results.

@param tag tag number @param name string representation of name @throws ArgumentException if the string encoding is not correct or not supported.
Don't use this one if you are trying to be RFC 3281 compliant. Use it for v1 attribute certificates only. Our GeneralNames structure Produce an object suitable for an Asn1OutputStream.
             AttCertIssuer ::= CHOICE {
                  v1Form   GeneralNames,  -- MUST NOT be used in this
                                          -- profile
                  v2Form   [0] V2Form     -- v2 only
             }
            
             DirectoryString ::= CHOICE {
               teletexString               TeletexString (SIZE (1..MAX)),
               printableString             PrintableString (SIZE (1..MAX)),
               universalString             UniversalString (SIZE (1..MAX)),
               utf8String                  UTF8String (SIZE (1..MAX)),
               bmpString                   BMPString (SIZE (1..MAX))  }
            
            
                 TstInfo ::= SEQUENCE  {
                    version                      INTEGER  { v1(1) },
                    policy                       TSAPolicyId,
                    messageImprint               MessageImprint,
                      -- MUST have the same value as the similar field in
                      -- TimeStampReq
                    serialNumber                 INTEGER,
                     -- Time-Stamping users MUST be ready to accommodate integers
                     -- up to 160 bits.
                    genTime                      GeneralizedTime,
                    accuracy                     Accuracy                 OPTIONAL,
                    ordering                     BOOLEAN             DEFAULT FALSE,
                    nonce                        INTEGER                  OPTIONAL,
                      -- MUST be present if the similar field was present
                      -- in TimeStampReq.  In that case it MUST have the same value.
                    tsa                          [0] GeneralName          OPTIONAL,
                    extensions                   [1] IMPLICIT Extensions   OPTIONAL  }
            
             
Handler class for dealing with S/MIME Capabilities general preferences encryption algorithms preferences return an Attr object from the given object. @param o the object we want converted. @exception ArgumentException if the object cannot be converted. returns an ArrayList with 0 or more objects of all the capabilities matching the passed in capability Oid. If the Oid passed is null the entire set is returned. Produce an object suitable for an Asn1OutputStream.
            SMIMECapabilities ::= Sequence OF SMIMECapability
            
EllipticCurve OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) certicom(132) curve(0) } Produce an object suitable for an Asn1OutputStream.
            IDEA-CBCPar ::= Sequence {
                                 iv    OCTET STRING OPTIONAL -- exactly 8 octets
                             }
            
Professions, specializations, disciplines, fields of activity, etc.
                          ProfessionInfo ::= SEQUENCE 
                          {
                            namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
                            professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
                            professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
                            registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
                            addProfessionInfo OCTET STRING OPTIONAL 
                          }
            
@see Org.BouncyCastle.Asn1.IsisMtt.X509.AdmissionSyntax
Rechtsanw�ltin Rechtsanwalt Rechtsbeistand Steuerberaterin Steuerberater Steuerbevollm�chtigte Steuerbevollm�chtigter Notarin Notar Notarvertreterin Notarvertreter Notariatsverwalterin Notariatsverwalter Wirtschaftspr�ferin Wirtschaftspr�fer Vereidigte Buchpr�ferin Vereidigter Buchpr�fer Patentanw�ltin Patentanwalt Constructor from Asn1Sequence.

                           ProfessionInfo ::= SEQUENCE
                           {
                             namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
                             professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
                             professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
                             registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
                             addProfessionInfo OCTET STRING OPTIONAL
                           }
             
@param seq The ASN.1 sequence.
Constructor from given details.

professionItems is mandatory, all other parameters are optional. @param namingAuthority The naming authority. @param professionItems Directory strings of the profession. @param professionOids DERObjectIdentfier objects for the profession. @param registrationNumber Registration number. @param addProfessionInfo Additional infos in encoded form. Produce an object suitable for an Asn1OutputStream.

Returns:

                           ProfessionInfo ::= SEQUENCE
                           {
                             namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
                             professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
                             professionOids SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
                             registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
                             addProfessionInfo OCTET STRING OPTIONAL
                           }
             
@return an Asn1Object
@return Returns the professionItems. @return Returns the professionOids. @return Returns the addProfessionInfo. @return Returns the namingAuthority. @return Returns the registrationNumber. Some other information of non-restrictive nature regarding the usage of this certificate.
               AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
            
Constructor from a given details. @param information The describtion of the information. Produce an object suitable for an Asn1OutputStream.

Returns:

               AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
             
@return an Asn1Object
The LDSSecurityObject object.
             LDSSecurityObject ::= SEQUENCE {
               version                LDSSecurityObjectVersion,
               hashAlgorithm          DigestAlgorithmIdentifier,
               dataGroupHashValues    SEQUENCE SIZE (2..ub-DataGroups) OF DataHashGroup}
            
             DigestAlgorithmIdentifier ::= AlgorithmIdentifier,
            
             LDSSecurityObjectVersion :: INTEGER {V0(0)}
             
             EssCertIDv2 ::=  SEQUENCE {
                 hashAlgorithm     AlgorithmIdentifier
                          DEFAULT {algorithm id-sha256 parameters NULL},
                 certHash          Hash,
                 issuerSerial      IssuerSerial OPTIONAL
             }
            
             Hash ::= OCTET STRING
            
             IssuerSerial ::= SEQUENCE {
                 issuer         GeneralNames,
                 serialNumber   CertificateSerialNumber
             }
             
Der NumericString object - this is an ascii string of characters {0,1,2,3,4,5,6,7,8,9, }. return a Numeric string from the passed in object @exception ArgumentException if the object cannot be converted. return an Numeric string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - with bytes. basic constructor - without validation.. Constructor with optional validation. @param string the base string to wrap. @param validate whether or not to check the string. @throws ArgumentException if validate is true and the string contains characters that should not be in a NumericString. Return true if the string can be represented as a NumericString ('0'..'9', ' ') @param str string to validate. @return true if numeric, fale otherwise. Return the digest algorithm using one of the standard JCA string representations rather than the algorithm identifier (if possible). This class contains a collection for collection based X509Stores. Constructor.

The collection is copied.

The collection containing X.509 object types. If collection is null.
Returns a copy of the ICollection. Returns a formatted string describing the parameters. A high level subject key identifier. The SubjectKeyIdentifier object.
            SubjectKeyIdentifier::= OCTET STRING
            
Calulates the keyIdentifier using a SHA1 hash over the BIT STRING from SubjectPublicKeyInfo as defined in RFC2459. Constructor which will take the byte[] returned from getExtensionValue() @param encodedValue a DER octet encoded string with the extension structure in it. @throws IOException on parsing errors. Recognised hash algorithms for the time stamp protocol. Utility class for creating HMac object from their names/Oids Utility class for creating IDigest objects from their names/Oids Returns a ObjectIdentifier for a given digest mechanism. A string representation of the digest meanism. A DerObjectIdentifier, null if the Oid is not available. Class for producing literal data packets. The special name indicating a "for your eyes only" packet. Generates literal data objects in the old format. This is important if you need compatibility with PGP 2.6.x. If true, uses old format.

Open a literal data packet, returning a stream to store the data inside the packet.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

The stream we want the packet in. The format we are using. The name of the 'file'. The length of the data we will write. The time of last modification we want stored.

Open a literal data packet, returning a stream to store the data inside the packet, as an indefinite length stream. The stream is written out as a series of partial packets with a chunk size determined by the size of the passed in buffer.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

Note: if the buffer is not a power of 2 in length only the largest power of 2 bytes worth of the buffer will be used.

The stream we want the packet in. The format we are using. The name of the 'file'. The time of last modification we want stored. The buffer to use for collecting data to put into chunks.

Open a literal data packet for the passed in FileInfo object, returning an output stream for saving the file contents.

The stream created can be closed off by either calling Close() on the stream or Close() on the generator. Closing the returned stream does not close off the Stream parameter outStr.

The stream we want the packet in. The format we are using. The FileInfo object containg the packet details.
Close the literal data packet - this is equivalent to calling Close() on the stream returned by the Open() method. Class holding precomputation data for the WTNAF (Window τ-adic Non-Adjacent Form) algorithm. Array holding the precomputed F2mPoints used for the WTNAF multiplication in {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() WTauNafMultiplier.multiply()}. Constructor for WTauNafPreCompInfo @param preComp Array holding the precomputed F2mPoints used for the WTNAF multiplication in {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() WTauNafMultiplier.multiply()}. @return the array holding the precomputed F2mPoints used for the WTNAF multiplication in {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() WTauNafMultiplier.multiply()}. An output Stream for a TLS 1.0 connection. A NULL CipherSuite in java, this should only be used during handshake. Cipher parameters with a fixed salt value associated with them. The minimum bitlength of the private value. The bitlength of the private value. If zero, bitLength(p) - 1 will be used. A padder that adds the padding according to the scheme referenced in ISO 7814-4 - scheme 2 from ISO 9797-1. The first byte is 0x80, rest is 0x00 Initialise the padder. @param random - a SecureRandom if available. add the pad bytes to the passed in block, returning the number of bytes added. return the number of pad bytes present in the block. Return the name of the algorithm the padder implements. @return the name of the algorithm the padder implements. Given the domain parameters this routine Generates an EC key pair in accordance with X9.62 section 5.2.1 pages 26, 27. Draft FIPS 180-2 implementation of SHA-512. Note: As this is based on a draft this implementation is subject to change.
                     block  word  digest
             SHA-1   512    32    160
             SHA-256 512    32    256
             SHA-384 1024   64    384
             SHA-512 1024   64    512
             
Copy constructor. This will copy the state of the provided message digest. reset the chaining variables Draft FIPS 180-2 implementation of SHA-256. Note: As this is based on a draft this implementation is subject to change.
                     block  word  digest
             SHA-1   512    32    160
             SHA-256 512    32    256
             SHA-384 1024   64    384
             SHA-512 1024   64    512
             
Copy constructor. This will copy the state of the provided message digest. reset the chaining variables implementation of MD4 as RFC 1320 by R. Rivest, MIT Laboratory for Computer Science and RSA Data Security, Inc.

NOTE: This algorithm is only included for backwards compatibility with legacy applications, it's not secure, don't use it for anything new!

Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. this exception is thrown if a buffer that is meant to have output copied into it turns out to be too short, or if we've been given insufficient input. In general this exception will Get thrown rather than an ArrayOutOfBounds exception. base constructor. create a DataLengthException with the given message. @param message the message to be carried with the exception. Basic type for a user ID packet. Basic type for a user attribute packet. packet giving signature creation time. Produce an object suitable for an Asn1OutputStream.
             V2Form ::= Sequence {
                  issuerName            GeneralNames  OPTIONAL,
                  baseCertificateID     [0] IssuerSerial  OPTIONAL,
                  objectDigestInfo      [1] ObjectDigestInfo  OPTIONAL
                    -- issuerName MUST be present in this profile
                    -- baseCertificateID and objectDigestInfo MUST NOT
                    -- be present in this profile
             }
            
Generator for Version 1 TbsCertificateStructures.
             TbsCertificate ::= Sequence {
                  version          [ 0 ]  Version DEFAULT v1(0),
                  serialNumber            CertificateSerialNumber,
                  signature               AlgorithmIdentifier,
                  issuer                  Name,
                  validity                Validity,
                  subject                 Name,
                  subjectPublicKeyInfo    SubjectPublicKeyInfo,
                  }
             
Target structure used in target information extension for attribute certificates from RFC 3281.
                Target  ::= CHOICE {
                  targetName          [0] GeneralName,
                  targetGroup         [1] GeneralName,
                  targetCert          [2] TargetCert
                }
            

The targetCert field is currently not supported and must not be used according to RFC 3281.

Creates an instance of a Target from the given object.

obj can be a Target or a {@link Asn1TaggedObject}

@param obj The object. @return A Target instance. @throws ArgumentException if the given object cannot be interpreted as Target.
Constructor from Asn1TaggedObject. @param tagObj The tagged object. @throws ArgumentException if the encoding is wrong. Constructor from given details.

Exactly one of the parameters must be not null.

@param type the choice type to apply to the name. @param name the general name. @throws ArgumentException if type is invalid.
Produce an object suitable for an Asn1OutputStream. Returns:
                Target  ::= CHOICE {
                  targetName          [0] GeneralName,
                  targetGroup         [1] GeneralName,
                  targetCert          [2] TargetCert
                }
            
@return an Asn1Object
@return Returns the targetGroup. @return Returns the targetName. Construct a GeneralNames object containing one GeneralName. The name to be contained. Produce an object suitable for an Asn1OutputStream.
            GeneralNames ::= Sequence SIZE {1..MAX} OF GeneralName
            
The DigestInfo object.
            DigestInfo::=Sequence{
                     digestAlgorithm  AlgorithmIdentifier,
                     digest OCTET STRING }
            
This class helps to support crossCerfificatePairs in a LDAP directory according RFC 2587
                 crossCertificatePairATTRIBUTE::={
                   WITH SYNTAX   CertificatePair
                   EQUALITY MATCHING RULE certificatePairExactMatch
                   ID joint-iso-ccitt(2) ds(5) attributeType(4) crossCertificatePair(40)}
             
The forward elements of the crossCertificatePair attribute of a CA's directory entry shall be used to store all, except self-issued certificates issued to this CA. Optionally, the reverse elements of the crossCertificatePair attribute, of a CA's directory entry may contain a subset of certificates issued by this CA to other CAs. When both the forward and the reverse elements are present in a single attribute value, issuer name in one certificate shall match the subject name in the other and vice versa, and the subject public key in one certificate shall be capable of verifying the digital signature on the other certificate and vice versa. When a reverse element is present, the forward element value and the reverse element value need not be stored in the same attribute value; in other words, they can be stored in either a single attribute value or two attribute values.
                   CertificatePair ::= SEQUENCE {
                     forward		[0]	Certificate OPTIONAL,
                     reverse		[1]	Certificate OPTIONAL,
                     -- at least one of the pair shall be present -- }
             
Constructor from Asn1Sequence.

The sequence is of type CertificatePair:

                   CertificatePair ::= SEQUENCE {
                     forward		[0]	Certificate OPTIONAL,
                     reverse		[1]	Certificate OPTIONAL,
                     -- at least one of the pair shall be present -- }
             
@param seq The ASN.1 sequence.
Constructor from a given details. @param forward Certificates issued to this CA. @param reverse Certificates issued by this CA to other CAs. Produce an object suitable for an Asn1OutputStream.

Returns:

                   CertificatePair ::= SEQUENCE {
                     forward		[0]	Certificate OPTIONAL,
                     reverse		[1]	Certificate OPTIONAL,
                     -- at least one of the pair shall be present -- }
             
@return a DERObject
@return Returns the forward. @return Returns the reverse. Attribute to indicate that the certificate holder may sign in the name of a third person.

ISIS-MTT PROFILE: The corresponding ProcurationSyntax contains either the name of the person who is represented (subcomponent thirdPerson) or a reference to his/her base certificate (in the component signingFor, subcomponent certRef), furthermore the optional components country and typeSubstitution to indicate the country whose laws apply, and respectively the type of procuration (e.g. manager, procuration, custody).

ISIS-MTT PROFILE: The GeneralName MUST be of type directoryName and MAY only contain: - RFC3039 attributes, except pseudonym (countryName, commonName, surname, givenName, serialNumber, organizationName, organizationalUnitName, stateOrProvincename, localityName, postalAddress) and - SubjectDirectoryName attributes (title, dateOfBirth, placeOfBirth, gender, countryOfCitizenship, countryOfResidence and NameAtBirth).

                          ProcurationSyntax ::= SEQUENCE {
                            country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
                            typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
                            signingFor [3] EXPLICIT SigningFor 
                          }
                          
                          SigningFor ::= CHOICE 
                          { 
                            thirdPerson GeneralName,
                            certRef IssuerSerial 
                          }
            
Constructor from Asn1Sequence.

The sequence is of type ProcurationSyntax:

                           ProcurationSyntax ::= SEQUENCE {
                             country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
                             typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
                             signingFor [3] EXPLICIT SigningFor
                           }
             

SigningFor ::= CHOICE { thirdPerson GeneralName, certRef IssuerSerial }

@param seq The ASN.1 sequence.
Constructor from a given details.

Either generalName or certRef MUST be null. @param country The country code whose laws apply. @param typeOfSubstitution The type of procuration. @param certRef Reference to certificate of the person who is represented. Constructor from a given details.

Either generalName or certRef MUST be null. @param country The country code whose laws apply. @param typeOfSubstitution The type of procuration. @param thirdPerson The GeneralName of the person who is represented. Produce an object suitable for an Asn1OutputStream.

Returns:

                           ProcurationSyntax ::= SEQUENCE {
                             country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
                             typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
                             signingFor [3] EXPLICIT SigningFor
                           }
             

SigningFor ::= CHOICE { thirdPerson GeneralName, certRef IssuerSerial }

@return an Asn1Object
A declaration of majority.

                      DeclarationOfMajoritySyntax ::= CHOICE
                      {
                        notYoungerThan [0] IMPLICIT INTEGER,
                        fullAgeAtCountry [1] IMPLICIT SEQUENCE
                        {
                          fullAge BOOLEAN DEFAULT TRUE,
                          country PrintableString (SIZE(2))
                        }
                        dateOfBirth [2] IMPLICIT GeneralizedTime
                      }
            

fullAgeAtCountry indicates the majority of the owner with respect to the laws of a specific country. Produce an object suitable for an Asn1OutputStream.

Returns:

                       DeclarationOfMajoritySyntax ::= CHOICE
                       {
                         notYoungerThan [0] IMPLICIT INTEGER,
                         fullAgeAtCountry [1] IMPLICIT SEQUENCE
                         {
                           fullAge BOOLEAN DEFAULT TRUE,
                           country PrintableString (SIZE(2))
                         }
                         dateOfBirth [2] IMPLICIT GeneralizedTime
                       }
             
@return an Asn1Object
@return notYoungerThan if that's what we are, -1 otherwise RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition OtherRevRefs ::= SEQUENCE { otherRevRefType OtherRevRefType, otherRevRefs ANY DEFINED BY otherRevRefType } OtherRevRefType ::= OBJECT IDENTIFIER RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition CrlOcspRef ::= SEQUENCE { crlids [0] CRLListID OPTIONAL, ocspids [1] OcspListID OPTIONAL, otherRev [2] OtherRevRefs OPTIONAL } RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition CompleteRevocationRefs ::= SEQUENCE OF CrlOcspRef return a bool from the passed in object. @exception ArgumentException if the object cannot be converted. return a DerBoolean from the passed in bool. return a Boolean from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. return an KeyAgreeRecipientIdentifier object from a tagged object. @param obj the tagged object holding the object we want. @param isExplicit true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return an KeyAgreeRecipientIdentifier object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            KeyAgreeRecipientIdentifier ::= CHOICE {
                issuerAndSerialNumber IssuerAndSerialNumber,
                rKeyId [0] IMPLICIT RecipientKeyIdentifier
            }
            
convert a vector of octet strings into a single byte string The octets making up the octet string. return the DER octets that make up this string. A list of PGP signatures - normally in the signature block after literal data. Return the status object for the response - null indicates good. @return the status object for the response, null if it is good. return the NextUpdate value - note: this is an optional field so may be returned as null. @return nextUpdate, or null if not present.
             OcspRequest     ::=     SEQUENCE {
                   tbsRequest                  TBSRequest,
                   optionalSignature   [0]     EXPLICIT Signature OPTIONAL }
            
               TBSRequest      ::=     SEQUENCE {
                   version             [0]     EXPLICIT Version DEFAULT v1,
                   requestorName       [1]     EXPLICIT GeneralName OPTIONAL,
                   requestList                 SEQUENCE OF Request,
                   requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }
            
               Signature       ::=     SEQUENCE {
                   signatureAlgorithm      AlgorithmIdentifier,
                   signature               BIT STRING,
                   certs               [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL}
            
               Version         ::=             INTEGER  {  v1(0) }
            
               Request         ::=     SEQUENCE {
                   reqCert                     CertID,
                   singleRequestExtensions     [0] EXPLICIT Extensions OPTIONAL }
            
               CertID          ::=     SEQUENCE {
                   hashAlgorithm       AlgorithmIdentifier,
                   issuerNameHash      OCTET STRING, -- Hash of Issuer's DN
                   issuerKeyHash       OCTET STRING, -- Hash of Issuers public key
                   serialNumber        CertificateSerialNumber }
             
Return the DER encoding of the tbsRequest field. @return DER encoding of tbsRequest @throws OcspException in the event of an encoding error. If the request is signed return a possibly empty CertStore containing the certificates in the request. If the request is not signed the method returns null. @return null if not signed, a CertStore otherwise @throws OcspException Verify the signature against the TBSRequest object we contain. return the ASN.1 encoded representation of this object. return the object identifier representing the signature algorithm Return whether or not this request is signed. @return true if signed false otherwise. Gost R 34.10-94 Signature Algorithm generate a signature for the given message using the key we were initialised with. For conventional Gost3410 the message should be a Gost3411 hash of the message of interest. @param message the message that will be verified later. return true if the value r and s represent a Gost3410 signature for the passed in message for standard Gost3410 the message should be a Gost3411 hash of the real message to be verified. Implements the Galois/Counter mode (GCM) detailed in NIST Special Publication 800-38D. implementation of GOST 28147-89 MAC KFD2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033
This implementation is based on IEEE P1363/ISO 18033.
Construct a KDF1 byte generator. @param digest the digest to be used as the source of derived keys. The specification for RC5 came from the RC5 Encryption Algorithm publication in RSA CryptoBytes, Spring of 1995. http://www.rsasecurity.com/rsalabs/cryptobytes.

This implementation is set to work with a 64 bit word size.

Create an instance of the RC5 encryption algorithm and set some defaults initialise a RC5-64 cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Re-key the cipher. @param key the key to be used Encrypt the given block starting at the given offset and place the result in the provided buffer starting at the given offset. @param in in byte buffer containing data to encrypt @param inOff offset into src buffer @param out out buffer where encrypted data is written @param outOff offset into out buffer Perform a left "spin" of the word. The rotation of the given word x is rotated left by y bits. Only the lg(wordSize) low-order bits of y are used to determine the rotation amount. Here it is assumed that the wordsize used is a power of 2. @param x word to rotate @param y number of bits to rotate % wordSize Perform a right "spin" of the word. The rotation of the given word x is rotated left by y bits. Only the lg(wordSize) low-order bits of y are used to determine the rotation amount. Here it is assumed that the wordsize used is a power of 2. @param x word to rotate @param y number of bits to rotate % wordSize implementation of Tiger based on: http://www.cs.technion.ac.il/~biham/Reports/Tiger Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables Basic generator that just returns a preconstructed attribute table The 'Signature' parameter is only available when generating unsigned attributes. Basic type for a marker packet. reader for Base64 armored objects - read the headers and then start returning bytes when the data is reached. An IOException is thrown if the CRC check fails. decode the base 64 encoded input data. @return the offset the data starts in out. Create a stream for reading a PGP armoured message, parsing up to a header and then reading the data that follows. @param input Create an armoured input stream which will assume the data starts straight away, or parse for headers first depending on the value of hasHeaders. @param input @param hasHeaders true if headers are to be looked for, false otherwise. @return true if we are inside the clear text section of a PGP signed message. Return the armor header line (if there is one) @return the armor header line, null if none present. Return the armor headers (the lines after the armor header line), @return an array of armor headers, null if there aren't any. id-dsa-with-sha1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 } X9.63 X9.42 ASN.1 def for Elliptic-Curve ECParameters structure. See X9.62, for further details. Produce an object suitable for an Asn1OutputStream.
             ECParameters ::= Sequence {
                 version         Integer { ecpVer1(1) } (ecpVer1),
                 fieldID         FieldID {{FieldTypes}},
                 curve           X9Curve,
                 base            X9ECPoint,
                 order           Integer,
                 cofactor        Integer OPTIONAL
             }
            
creates a time object from a given date - if the date is between 1950 and 2049 a UTCTime object is Generated, otherwise a GeneralizedTime is used. Return our time as DateTime. A date time. Produce an object suitable for an Asn1OutputStream.
            Time ::= CHOICE {
                        utcTime        UTCTime,
                        generalTime    GeneralizedTime }
            
Target information extension for attributes certificates according to RFC 3281.
                      SEQUENCE OF Targets
            
Creates an instance of a TargetInformation from the given object.

obj can be a TargetInformation or a {@link Asn1Sequence}

@param obj The object. @return A TargetInformation instance. @throws ArgumentException if the given object cannot be interpreted as TargetInformation.
Constructor from a Asn1Sequence. @param seq The Asn1Sequence. @throws ArgumentException if the sequence does not contain correctly encoded Targets elements. Returns the targets in this target information extension.

The ArrayList is cloned before it is returned.

@return Returns the targets.
Constructs a target information from a single targets element. According to RFC 3281 only one targets element must be produced. @param targets A Targets instance. According to RFC 3281 only one targets element must be produced. If multiple targets are given they must be merged in into one targets element. @param targets An array with {@link Targets}. Produce an object suitable for an Asn1OutputStream. Returns:
                     SEQUENCE OF Targets
            

According to RFC 3281 only one targets element must be produced. If multiple targets are given in the constructor they are merged into one targets element. If this was produced from a {@link Org.BouncyCastle.Asn1.Asn1Sequence} the encoding is kept.

@return an Asn1Object
PolicyQualifierId, used in the CertificatePolicies X509V3 extension.
                id-qt          OBJECT IDENTIFIER ::=  { id-pkix 2 }
                id-qt-cps      OBJECT IDENTIFIER ::=  { id-qt 1 }
                id-qt-unotice  OBJECT IDENTIFIER ::=  { id-qt 2 }
              PolicyQualifierId ::=
                   OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )
             
CertPolicyId, used in the CertificatePolicies and PolicyMappings X509V3 Extensions.
                 CertPolicyId ::= OBJECT IDENTIFIER
             
@param obj @return Produce an object suitable for an Asn1OutputStream.
             AttributeCertificate ::= Sequence {
                  acinfo               AttributeCertificateInfo,
                  signatureAlgorithm   AlgorithmIdentifier,
                  signatureValue       BIT STRING
             }
            
a Pkcs#7 signer info object. Produce an object suitable for an Asn1OutputStream.
              SignerInfo ::= Sequence {
                  version Version,
                  issuerAndSerialNumber IssuerAndSerialNumber,
                  digestAlgorithm DigestAlgorithmIdentifier,
                  authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
                  digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
                  encryptedDigest EncryptedDigest,
                  unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
              }
            
              EncryptedDigest ::= OCTET STRING
            
              DigestAlgorithmIdentifier ::= AlgorithmIdentifier
            
              DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
             
The default version
             RSASSA-PSS-params ::= SEQUENCE {
               hashAlgorithm      [0] OAEP-PSSDigestAlgorithms  DEFAULT sha1,
                maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
                saltLength         [2] INTEGER  DEFAULT 20,
                trailerField       [3] TrailerField  DEFAULT trailerFieldBC
              }
            
             OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
                { OID id-sha1 PARAMETERS NULL   }|
                { OID id-sha256 PARAMETERS NULL }|
                { OID id-sha384 PARAMETERS NULL }|
                { OID id-sha512 PARAMETERS NULL },
                ...  -- Allows for future expansion --
             }
            
             PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
               { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
                ...  -- Allows for future expansion --
             }
            
             TrailerField ::= INTEGER { trailerFieldBC(1) }
             
@return the asn1 primitive representing the parameters.
Produce an object suitable for an Asn1OutputStream.
            Signature       ::=     Sequence {
                signatureAlgorithm      AlgorithmIdentifier,
                signature               BIT STRING,
                certs               [0] EXPLICIT Sequence OF Certificate OPTIONAL}
            
Create from OCTET STRING whose octets represent the identifier. Create from byte array representing the identifier. The definition of ContentIdentifier is
            ContentIdentifier ::=  OCTET STRING
            
id-aa-contentIdentifier OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) smime(16) id-aa(2) 7 }
RFC 3126: 4.2.2 Complete Revocation Refs Attribute Definition OcspResponsesID ::= SEQUENCE { ocspIdentifier OcspIdentifier, ocspRepHash OtherHash OPTIONAL }
            CommitmentTypeIndication ::= SEQUENCE {
                 commitmentTypeId   CommitmentTypeIdentifier,
                 commitmentTypeQualifier   SEQUENCE SIZE (1..MAX) OF
                         CommitmentTypeQualifier OPTIONAL }
            
table of the available named parameters for GOST 3410-94. return the GOST3410ParamSetParameters object for the given OID, null if it isn't present. @param oid an object identifier representing a named parameters, if present. returns an enumeration containing the name strings for parameters contained in this structure. table of the available named parameters for GOST 3410-2001. return the ECDomainParameters object for the given OID, null if it isn't present. @param oid an object identifier representing a named parameters, if present. return the named curve name represented by the given object identifier. returns an enumeration containing the name strings for curves contained in this structure. return a PasswordRecipientInfo object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a PasswordRecipientInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
            PasswordRecipientInfo ::= Sequence {
              version CMSVersion,   -- Always set to 0
              keyDerivationAlgorithm [0] KeyDerivationAlgorithmIdentifier
                                        OPTIONAL,
             keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
             encryptedKey EncryptedKey }
            
Class to produce an X.509 Version 2 AttributeCertificate. Reset the generator Set the Holder of this Attribute Certificate. Set the issuer. Set the serial number for the certificate. Set the signature algorithm. This can be either a name or an OID, names are treated as case insensitive. The algorithm name. Add an attribute. Add a given extension field for the standard extensions tag. Add a given extension field for the standard extensions tag. The value parameter becomes the contents of the octet string associated with the extension. Generate an X509 certificate, based on the current issuer and subject. Generate an X509 certificate, based on the current issuer and subject, using the supplied source of randomness, if required. Allows enumeration of the signature names supported by the generator. Create loading data from byte array. Create loading data from byte array. Generates a certificate object and initializes it with the data read from the input stream inStream. Returns a (possibly empty) collection view of the certificates read from the given input stream inStream. This class is an IX509Selector implementation to select certificate pairs, which are e.g. used for cross certificates. The set of criteria is given from two X509CertStoreSelector objects, each of which, if present, must match the respective component of a pair. Decides if the given certificate pair should be selected. If obj is not a X509CertificatePair, this method returns false. The X509CertificatePair to be tested. true if the object matches this selector. The certificate pair which is used for testing on equality. The certificate selector for the forward part. The certificate selector for the reverse part. A utility class that will extract X509Principal objects from X.509 certificates.

Use this in preference to trying to recreate a principal from a string, not all DNs are what they should be, so it's best to leave them encoded where they can be.

Return the issuer of the given cert as an X509Principal. Return the subject of the given cert as an X509Principal. Return the issuer of the given CRL as an X509Principal. Cipher Utility class contains methods that can not be specifically grouped into other classes. Returns a ObjectIdentifier for a give encoding. A string representation of the encoding. A DerObjectIdentifier, null if the Oid is not available. Container for a list of signature subpackets. Return true if a particular subpacket type exists. @param type type to look for. @return true if present, false otherwise. Return all signature subpackets of the passed in type. @param type subpacket type code @return an array of zero or more matching subpackets. Return the number of seconds a signature is valid for after its creation date. A value of zero means the signature never expires. Seconds a signature is valid for. Return the number of seconds a key is valid for after its creation date. A value of zero means the key never expires. Seconds a signature is valid for. Return the number of packets this vector contains. Generator for PGP signatures. Create a generator for the passed in keyAlgorithm and hashAlgorithm codes. Initialise the generator for signing. Initialise the generator for signing. Return the one pass header associated with the current signature. Return a signature object containing the current signature state. Generate a certification for the passed in ID and key. The ID we are certifying against the public key. The key we are certifying against the ID. The certification. Generate a certification for the passed in userAttributes. The ID we are certifying against the public key. The key we are certifying against the ID. The certification. Generate a certification for the passed in key against the passed in master key. The key we are certifying against. The key we are certifying. The certification. Generate a certification, such as a revocation, for the passed in key. The key we are certifying. The certification. A public key encrypted data object. Return the algorithm code for the symmetric algorithm used to encrypt the data. Return the decrypted data stream for the packet. The key ID for the key used to encrypt the data. wrapper for the UnknownInfo object Class representing a simple version of a big decimal. A SimpleBigDecimal is basically a {@link java.math.BigInteger BigInteger} with a few digits on the right of the decimal point. The number of (binary) digits on the right of the decimal point is called the scale of the SimpleBigDecimal. Unlike in {@link java.math.BigDecimal BigDecimal}, the scale is not adjusted automatically, but must be set manually. All SimpleBigDecimals taking part in the same arithmetic operation must have equal scale. The result of a multiplication of two SimpleBigDecimals returns a SimpleBigDecimal with double scale. Returns a SimpleBigDecimal representing the same numerical value as value. @param value The value of the SimpleBigDecimal to be created. @param scale The scale of the SimpleBigDecimal to be created. @return The such created SimpleBigDecimal. Constructor for SimpleBigDecimal. The value of the constructed SimpleBigDecimal Equals bigInt / 2scale. @param bigInt The bigInt value parameter. @param scale The scale of the constructed SimpleBigDecimal. a wrapper for block ciphers with a single byte block size, so that they can be treated like stream ciphers. basic constructor. @param cipher the block cipher to be wrapped. @exception ArgumentException if the cipher has a block size other than one. initialise the underlying cipher. @param forEncryption true if we are setting up for encryption, false otherwise. @param param the necessary parameters for the underlying cipher to be initialised. encrypt/decrypt a single byte returning the result. @param in the byte to be processed. @return the result of processing the input byte. process a block of bytes from in putting the result into out. @param in the input byte array. @param inOff the offset into the in array where the data to be processed starts. @param len the number of bytes to be processed. @param out the output buffer the processed bytes go into. @param outOff the offset into the output byte array the processed data stars at. @exception DataLengthException if the output buffer is too small. reset the underlying cipher. This leaves it in the same state it was at after the last init (if there was one). return the name of the algorithm we are wrapping. @return the name of the algorithm we are wrapping. an RSA key pair generator. Generator for Pbe derived keys and ivs as defined by Pkcs 5 V2.0 Scheme 1. Note this generator is limited to the size of the hash produced by the digest used to drive it.

The document this implementation is based on can be found at RSA's Pkcs5 Page

Construct a Pkcs 5 Scheme 1 Parameters generator. @param digest the digest to be used as the source of derived keys. the derived key function, the ith hash of the mPassword and the mSalt. Generate a key parameter derived from the mPassword, mSalt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. @exception ArgumentException if the key length larger than the base hash size. Generate a key with initialisation vector parameter derived from the mPassword, mSalt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @param ivSize the size of the iv we want (in bits) @return a ParametersWithIV object. @exception ArgumentException if keySize + ivSize is larger than the base hash size. Generate a key parameter for use with a MAC derived from the mPassword, mSalt, and iteration count we are currently initialised with. @param keySize the size of the key we want (in bits) @return a KeyParameter object. @exception ArgumentException if the key length larger than the base hash size. Implementation of Daniel J. Bernstein's Salsa20 stream cipher, Snuffle 2005 Constants initialise a Salsa20 cipher. @param forEncryption whether or not we are for encryption. @param params the parameters required to set up the cipher. @exception ArgumentException if the params argument is inappropriate. Salsa20 function @param input input data @return keystream 32 bit word to 4 byte array in little endian order @param x value to 'unpack' @return value of x expressed as a byte[] array in little endian order Rotate left @param x value to rotate @param y amount to rotate x @return rotated x Pack byte[] array into an int in little endian order @param x byte array to 'pack' @param offset only x[offset]..x[offset+3] will be packed @return x[offset]..x[offset+3] 'packed' into an int in little-endian order implementation of GOST 28147-89 standard constructor. initialise an Gost28147 cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. Return the S-Box associated with SBoxName @param sBoxName name of the S-Box @return byte array representing the S-Box A class that provides a basic DESede (or Triple DES) engine. A class that provides a basic DES engine. initialise a DES cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. what follows is mainly taken from "Applied Cryptography", by Bruce Schneier, however it also bears great resemblance to Richard Outerbridge's D3DES... Generate an integer based working key based on our secret key and what we processing we are planning to do. Acknowledgements for this routine go to James Gillogly and Phil Karn. (whoever, and wherever they are!). the DES engine. initialise a DESede cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", pages 346 - 349. It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5 is the "endienness" of the word processing! Copy constructor. This will copy the state of the provided message digest. reset the chaining variables

Implementation of RipeMD256.

Note: this algorithm offers the same level of security as RipeMD128.

Standard constructor Copy constructor. This will copy the state of the provided message digest. reset the chaining variables to the IV values. PKCS5 scheme-2 - password converted to bytes using UTF-8. General class for generating a CMS enveloped-data message stream.

A simple example of usage.

                  CmsEnvelopedDataStreamGenerator edGen = new CmsEnvelopedDataStreamGenerator();
            
                  edGen.AddKeyTransRecipient(cert);
            
                  MemoryStream  bOut = new MemoryStream();
            
                  Stream out = edGen.Open(
                                          bOut, CMSEnvelopedDataGenerator.AES128_CBC);*
                  out.Write(data);
            
                  out.Close();
             

Constructor allowing specific source of randomness Instance of SecureRandom to use. Set the underlying string size for encapsulated data. Length of octet strings to buffer the data. Use a BER Set to store the recipient information. Generate an enveloped object that contains an CMS Enveloped Data object using the passed in key generator. generate an enveloped object that contains an CMS Enveloped Data object @throws IOException generate an enveloped object that contains an CMS Enveloped Data object @throws IOException containing class for an CMS Compressed Data object return the ASN.1 encoded representation of this object. return the ContentInfo Base class for a DSA secret key. @param in Return the standard PGP encoding of the key. The format, as a string, always "PGP". @return x PKIX RFC-2459 - TbsCertList object.
            TbsCertList  ::=  Sequence  {
                 version                 Version OPTIONAL,
                                              -- if present, shall be v2
                 signature               AlgorithmIdentifier,
                 issuer                  Name,
                 thisUpdate              Time,
                 nextUpdate              Time OPTIONAL,
                 revokedCertificates     Sequence OF Sequence  {
                      userCertificate         CertificateSerialNumber,
                      revocationDate          Time,
                      crlEntryExtensions      Extensions OPTIONAL
                                                    -- if present, shall be v2
                                           }  OPTIONAL,
                 crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
                                                    -- if present, shall be v2
                                           }
            
This extension may contain further X.500 attributes of the subject. See also RFC 3039.
                 SubjectDirectoryAttributes ::= Attributes
                 Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
                 Attribute ::= SEQUENCE
                 {
                   type AttributeType
                   values SET OF AttributeValue
                 }
            
                 AttributeType ::= OBJECT IDENTIFIER
                 AttributeValue ::= ANY DEFINED BY AttributeType
             
@see org.bouncycastle.asn1.x509.X509Name for AttributeType ObjectIdentifiers.
Constructor from Asn1Sequence. The sequence is of type SubjectDirectoryAttributes:
                  SubjectDirectoryAttributes ::= Attributes
                  Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
                  Attribute ::= SEQUENCE
                  {
                    type AttributeType
                    values SET OF AttributeValue
                  }
            
                  AttributeType ::= OBJECT IDENTIFIER
                  AttributeValue ::= ANY DEFINED BY AttributeType
             
@param seq The ASN.1 sequence.
Constructor from an ArrayList of attributes. The ArrayList consists of attributes of type {@link Attribute Attribute} @param attributes The attributes. Produce an object suitable for an Asn1OutputStream. Returns:
                  SubjectDirectoryAttributes ::= Attributes
                  Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
                  Attribute ::= SEQUENCE
                  {
                    type AttributeType
                    values SET OF AttributeValue
                  }
            
                  AttributeType ::= OBJECT IDENTIFIER
                  AttributeValue ::= ANY DEFINED BY AttributeType
             
@return a DERObject
@return Returns the attributes. Structure for a name or pseudonym.
                  NameOrPseudonym ::= CHOICE {
                	   surAndGivenName SEQUENCE {
                	     surName DirectoryString,
                	     givenName SEQUENCE OF DirectoryString 
                    },
                	   pseudonym DirectoryString 
                  }
            
@see org.bouncycastle.asn1.x509.sigi.PersonalData
Constructor from DERString.

The sequence is of type NameOrPseudonym:

                  NameOrPseudonym ::= CHOICE {
                	   surAndGivenName SEQUENCE {
                	     surName DirectoryString,
                	     givenName SEQUENCE OF DirectoryString
                    },
                	   pseudonym DirectoryString
                  }
            
@param pseudonym pseudonym value to use.
Constructor from Asn1Sequence.

The sequence is of type NameOrPseudonym:

                   NameOrPseudonym ::= CHOICE {
                 	   surAndGivenName SEQUENCE {
                 	     surName DirectoryString,
                 	     givenName SEQUENCE OF DirectoryString
                     },
                 	   pseudonym DirectoryString
                   }
             
@param seq The ASN.1 sequence.
Constructor from a given details. @param pseudonym The pseudonym. Constructor from a given details. @param surname The surname. @param givenName A sequence of directory strings making up the givenName Produce an object suitable for an Asn1OutputStream.

Returns:

                   NameOrPseudonym ::= CHOICE {
                 	   surAndGivenName SEQUENCE {
                 	     surName DirectoryString,
                 	     givenName SEQUENCE OF DirectoryString
                     },
                 	   pseudonym DirectoryString
                   }
             
@return an Asn1Object
The Iso4217CurrencyCode object.
            Iso4217CurrencyCode  ::=  CHOICE {
                  alphabetic              PrintableString (SIZE 3), --Recommended
                  numeric              INTEGER (1..999) }
            -- Alphabetic or numeric currency code as defined in ISO 4217
            -- It is recommended that the Alphabetic form is used
            
            PrivateKeyUsagePeriod ::= SEQUENCE
            {
            notBefore       [0]     GeneralizedTime OPTIONAL,
            notAfter        [1]     GeneralizedTime OPTIONAL }
            
Policy qualifiers, used in the X509V3 CertificatePolicies extension.
               PolicyQualifierInfo ::= Sequence {
                   policyQualifierId  PolicyQualifierId,
                   qualifier          ANY DEFINED BY policyQualifierId }
             
Creates a new PolicyQualifierInfo instance. @param policyQualifierId a PolicyQualifierId value @param qualifier the qualifier, defined by the above field. Creates a new PolicyQualifierInfo containing a cPSuri qualifier. @param cps the CPS (certification practice statement) uri as a string. Creates a new PolicyQualifierInfo instance. @param as PolicyQualifierInfo X509 structure encoded as an Asn1Sequence. Returns a Der-encodable representation of this instance. @return a Asn1Object value The AuthorityInformationAccess object.
             id-pe-authorityInfoAccess OBJECT IDENTIFIER ::= { id-pe 1 }
            
             AuthorityInfoAccessSyntax  ::=
                  Sequence SIZE (1..MAX) OF AccessDescription
             AccessDescription  ::=  Sequence {
                   accessMethod          OBJECT IDENTIFIER,
                   accessLocation        GeneralName  }
            
             id-ad OBJECT IDENTIFIER ::= { id-pkix 48 }
             id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 }
             id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 }
             
create an AuthorityInformationAccess with the oid and location provided.
            MacData ::= SEQUENCE {
                mac      DigestInfo,
                macSalt  OCTET STRING,
                iterations INTEGER DEFAULT 1
                -- Note: The default is for historic reasons and its use is deprecated. A
                -- higher value, like 1024 is recommended.
            
@return the basic DERObject construction.
Produce an object suitable for an Asn1OutputStream.
            BasicOcspResponse       ::= Sequence {
                 tbsResponseData      ResponseData,
                 signatureAlgorithm   AlgorithmIdentifier,
                 signature            BIT STRING,
                 certs                [0] EXPLICIT Sequence OF Certificate OPTIONAL }
            
OtherCertID ::= SEQUENCE { otherCertHash OtherHash, issuerSerial IssuerSerial OPTIONAL } Der UTF8String object. return an UTF8 string from the passed in object. @exception ArgumentException if the object cannot be converted. return an UTF8 string from a tagged object. @param obj the tagged object holding the object we want @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the tagged object cannot be converted. basic constructor - byte encoded string. basic constructor create an empty sequence create a set containing one object create a set containing a vector of objects. create an empty sequence create a sequence containing one object create a sequence containing a vector of objects. The following extensions are listed in RFC 2459 as relevant to CRLs Authority Key Identifier Issuer Alternative Name CRL Number Delta CRL Indicator (critical) Issuing Distribution Point (critical) Returns a string representation of this CRL. @return a string representation of this CRL. Checks whether the given certificate is on this CRL. @param cert the certificate to check for. @return true if the given certificate is on this CRL, false otherwise. Base class for an RFC 3161 Time Stamp Response object. Create a TimeStampResponse from a byte array containing an ASN.1 encoding. @param resp the byte array containing the encoded response. @throws TspException if the response is malformed. @throws IOException if the byte array doesn't represent an ASN.1 encoding. Create a TimeStampResponse from an input stream containing an ASN.1 encoding. @param input the input stream containing the encoded response. @throws TspException if the response is malformed. @throws IOException if the stream doesn't represent an ASN.1 encoding. Check this response against to see if it a well formed response for the passed in request. Validation will include checking the time stamp token if the response status is GRANTED or GRANTED_WITH_MODS. @param request the request to be checked against @throws TspException if the request can not match this response. return the ASN.1 encoded representation of this object. Returns a ObjectIdentifier for a give encoding. A string representation of the encoding. A DerObjectIdentifier, null if the Oid is not available. A password based encryption object. Return the raw input stream for the data stream. Return the decrypted input stream, using the passed in passphrase. Thrown if the key checksum is invalid. Generator for basic OCSP response objects. basic constructor construct with the responderID to be the SHA-1 keyHash of the passed in public key. Add a response for a particular Certificate ID. @param certID certificate ID details @param certStatus status of the certificate - null if okay Add a response for a particular Certificate ID. @param certID certificate ID details @param certStatus status of the certificate - null if okay @param singleExtensions optional extensions Add a response for a particular Certificate ID. @param certID certificate ID details @param nextUpdate date when next update should be requested @param certStatus status of the certificate - null if okay @param singleExtensions optional extensions Add a response for a particular Certificate ID. @param certID certificate ID details @param thisUpdate date this response was valid on @param nextUpdate date when next update should be requested @param certStatus status of the certificate - null if okay @param singleExtensions optional extensions Set the extensions for the response. @param responseExtensions the extension object to carry. Return an IEnumerable of the signature names supported by the generator. @return an IEnumerable containing recognised names. return a = a + b - b preserved. unsigned comparison on two arrays - note the arrays may start with leading zeros. return z = x / y - done in place (z value preserved, x contains the remainder) return whether or not a BigInteger is probably prime with a probability of 1 - (1/2)**certainty.

From Knuth Vol 2, pg 395.

Calculate the numbers u1, u2, and u3 such that: u1 * a + u2 * b = u3 where u3 is the greatest common divider of a and b. a and b using the extended Euclid algorithm (refer p. 323 of The Art of Computer Programming vol 2, 2nd ed). This also seems to have the side effect of calculating some form of multiplicative inverse. @param a First number to calculate gcd for @param b Second number to calculate gcd for @param u1Out the return object for the u1 value @param u2Out the return object for the u2 value @return The greatest common divisor of a and b return w with w = x * x - w is assumed to have enough space. return x with x = y * z - x is assumed to have enough space. Calculate mQuote = -m^(-1) mod b with b = 2^32 (32 = word size) Montgomery multiplication: a = x * y * R^(-1) mod m
Based algorithm 14.36 of Handbook of Applied Cryptography.
  • m, x, y should have length n
  • a should have length (n + 1)
  • b = 2^32, R = b^n

  • The result is put in x
    NOTE: the indices of x, y, m, a different in HAC and in Java
    return x = x % y - done in place (y value preserved) do a left shift - this returns a new array. do a right shift - this does it in place. do a right shift by one - this does it in place. returns x = x - y - we assume x is >= y A combined hash, which implements md5(m) || sha1(m). Random generation based on the digest with counter. Calling addSeedMaterial will always increase the entropy of the hash.

    Internal access to the digest is syncrhonized so a single one of these can be shared.

    A padder that adds X9.23 padding to a block - if a SecureRandom is passed in random padding is assumed, otherwise padding with zeros is used. Initialise the padder. @param random a SecureRandom if one is available. add the pad bytes to the passed in block, returning the number of bytes added. return the number of pad bytes present in the block. Return the name of the algorithm the cipher implements. @return the name of the algorithm the cipher implements. This exception is thrown whenever a cipher requires a change of key, iv or similar after x amount of bytes enciphered standard CBC Block Cipher MAC - if no padding is specified the default of pad of zeroes is used. create a standard MAC based on a CBC block cipher. This will produce an authentication code half the length of the block size of the cipher. @param cipher the cipher to be used as the basis of the MAC generation. create a standard MAC based on a CBC block cipher. This will produce an authentication code half the length of the block size of the cipher. @param cipher the cipher to be used as the basis of the MAC generation. @param padding the padding to be used to complete the last block. create a standard MAC based on a block cipher with the size of the MAC been given in bits. This class uses CBC mode as the basis for the MAC generation.

    Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography).

    @param cipher the cipher to be used as the basis of the MAC generation. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8.
    create a standard MAC based on a block cipher with the size of the MAC been given in bits. This class uses CBC mode as the basis for the MAC generation.

    Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), or 16 bits if being used as a data authenticator (FIPS Publication 113), and in general should be less than the size of the block cipher as it reduces the chance of an exhaustive attack (see Handbook of Applied Cryptography).

    @param cipher the cipher to be used as the basis of the MAC generation. @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. @param padding the padding to be used to complete the last block.
    Reset the mac generator. generate suitable parameters for GOST3410. initialise the key generator. @param size size of the key @param typeProcedure type procedure A,B = 1; A',B' - else @param random random byte source. Procedure C procedure generates the a value from the given p,q, returning the a value. which generates the p , q and a values from the given parameters, returning the Gost3410Parameters object. Generate suitable parameters for DSA, in line with FIPS 186-2. initialise the key generator. @param size size of the key (range 2^512 -> 2^1024 - 64 bit increments) @param certainty measure of robustness of prime (for FIPS 186-2 compliance this should be at least 80). @param random random byte source. add value to b, returning the result in a. The a value is treated as a BigInteger of length (a.Length * 8) bits. The result is modulo 2^a.Length in case of overflow. which Generates the p and g values from the given parameters, returning the DsaParameters object.

    Note: can take a while...

    * an implementation of Rijndael, based on the documentation and reference implementation * by Paulo Barreto, Vincent Rijmen, for v2.0 August '99. *

    * Note: this implementation is based on information prior to readonly NIST publication. *

    multiply two elements of GF(2^m) needed for MixColumn and InvMixColumn xor corresponding text input and round key input bytes Row 0 remains unchanged The other three rows are shifted a variable amount Replace every byte of the input by the byte at that place in the nonlinear S-box Mix the bytes of every column in a linear way Mix the bytes of every column in a linear way This is the opposite operation of Mixcolumn Calculate the necessary round keys The number of calculations depends on keyBits and blockBits default constructor - 128 bit block size. basic constructor - set the cipher up for a given blocksize @param blocksize the blocksize in bits, must be 128, 192, or 256. initialise a Rijndael cipher. @param forEncryption whether or not we are for encryption. @param parameters the parameters required to set up the cipher. @exception ArgumentException if the parameters argument is inappropriate. NaccacheStern Engine. For details on this cipher, please see http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf Initializes this algorithm. Must be called before all other Functions. @see org.bouncycastle.crypto.AsymmetricBlockCipher#init(bool, org.bouncycastle.crypto.CipherParameters) Returns the input block size of this algorithm. @see org.bouncycastle.crypto.AsymmetricBlockCipher#GetInputBlockSize() Returns the output block size of this algorithm. @see org.bouncycastle.crypto.AsymmetricBlockCipher#GetOutputBlockSize() Process a single Block using the Naccache-Stern algorithm. @see org.bouncycastle.crypto.AsymmetricBlockCipher#ProcessBlock(byte[], int, int) Encrypts a BigInteger aka Plaintext with the public key. @param plain The BigInteger to encrypt @return The byte[] representation of the encrypted BigInteger (i.e. crypted.toByteArray()) Adds the contents of two encrypted blocks mod sigma @param block1 the first encrypted block @param block2 the second encrypted block @return encrypt((block1 + block2) mod sigma) @throws InvalidCipherTextException Convenience Method for data exchange with the cipher. Determines blocksize and splits data to blocksize. @param data the data to be processed @return the data after it went through the NaccacheSternEngine. @throws InvalidCipherTextException Computes the integer x that is expressed through the given primes and the congruences with the chinese remainder theorem (CRT). @param congruences the congruences c_i @param primes the primes p_i @return an integer x for that x % p_i == c_i a buffer wrapper for an asymmetric block cipher, allowing input to be accumulated in a piecemeal fashion until final processing. base constructor. @param cipher the cipher this buffering object wraps. return the amount of data sitting in the buffer. @return the amount of data sitting in the buffer. initialise the buffer and the underlying cipher. @param forEncryption if true the cipher is initialised for encryption, if false for decryption. @param param the key and other data required by the cipher. process the contents of the buffer using the underlying cipher. @return the result of the encryption/decryption process on the buffer. @exception InvalidCipherTextException if we are given a garbage block. Reset the buffer a holding class for public/private parameter pairs. basic constructor. @param publicParam a public key parameters object. @param privateParam the corresponding private key parameters. return the public key parameters. @return the public key parameters. return the private key parameters. @return the private key parameters. PKCS5 scheme-2 - password converted to bytes assuming ASCII. the RecipientInfo class for a recipient who has been sent a message encrypted using key agreement. decrypt the content and return an input stream. Basic PGP signature sub-packet tag types. Basic packet for an experimental packet. Generic compressed data object. The algorithm tag value. The object that contains the public key stored in a certficate.

    The GetEncoded() method in the public keys in the JCE produces a DER encoded one of these.

    for when the public key is an encoded object - if the bitstring can't be decoded this routine raises an IOException. @exception IOException - if the bit string doesn't represent a Der encoded object. Produce an object suitable for an Asn1OutputStream.
                SubjectPublicKeyInfo ::= Sequence {
                                         algorithm AlgorithmIdentifier,
                                         publicKey BIT STRING }
                
    for when the public key is raw bits... The BiometricData object.
                BiometricData  ::=  SEQUENCE {
                      typeOfBiometricData  TypeOfBiometricData,
                      hashAlgorithm        AlgorithmIdentifier,
                      biometricDataHash    OCTET STRING,
                      sourceDataUri        IA5String OPTIONAL  }
                
    The KeyUsage object.
                    id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
                
                    KeyUsage ::= BIT STRING {
                         digitalSignature        (0),
                         nonRepudiation          (1),
                         keyEncipherment         (2),
                         dataEncipherment        (3),
                         keyAgreement            (4),
                         keyCertSign             (5),
                         cRLSign                 (6),
                         encipherOnly            (7),
                         decipherOnly            (8) }
                 
    Basic constructor. @param usage - the bitwise OR of the Key Usage flags giving the allowed uses for the key. e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment) general preferences encryption algorithms preferences Produce an object suitable for an Asn1OutputStream.
                SMIMECapability ::= Sequence {
                    capabilityID OBJECT IDENTIFIER,
                    parameters ANY DEFINED BY capabilityID OPTIONAL
                }
                
    From RFC 3657 constructor
                 OtherCertID ::= SEQUENCE {
                     otherCertHash    OtherHash,
                     issuerSerial     IssuerSerial OPTIONAL }
                
                 OtherHash ::= CHOICE {
                     sha1Hash     OCTET STRING,
                     otherHash    OtherHashAlgAndValue }
                
                 OtherHashAlgAndValue ::= SEQUENCE {
                     hashAlgorithm    AlgorithmIdentifier,
                     hashValue        OCTET STRING }
                
                 
    SignaturePolicyId ::= SEQUENCE { sigPolicyIdentifier SigPolicyId, sigPolicyHash SigPolicyHash, sigPolicyQualifiers SEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo OPTIONAL } SigPolicyId ::= OBJECT IDENTIFIER SigPolicyHash ::= OtherHashAlgAndValue return an OriginatorPublicKey object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return an OriginatorPublicKey object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
                OriginatorPublicKey ::= Sequence {
                    algorithm AlgorithmIdentifier,
                    publicKey BIT STRING
                }
                
    return a KeyAgreeRecipientInfo object from a tagged object. @param obj the tagged object holding the object we want. @param explicitly true if the object is meant to be explicitly tagged false otherwise. @exception ArgumentException if the object held by the tagged object cannot be converted. return a KeyAgreeRecipientInfo object from the given object. @param obj the object we want converted. @exception ArgumentException if the object cannot be converted. Produce an object suitable for an Asn1OutputStream.
                KeyAgreeRecipientInfo ::= Sequence {
                    version CMSVersion,  -- always set to 3
                    originator [0] EXPLICIT OriginatorIdentifierOrKey,
                    ukm [1] EXPLICIT UserKeyingMaterial OPTIONAL,
                    keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
                    recipientEncryptedKeys RecipientEncryptedKeys
                }
                
    BER TaggedObject - in ASN.1 notation this is any object preceded by a [n] where n is some number - these are assumed to follow the construction rules (as with sequences). @param tagNo the tag number for this object. @param obj the tagged object. @param explicitly true if an explicitly tagged object. @param tagNo the tag number for this object. @param obj the tagged object. create an implicitly tagged object that contains a zero length sequence.
    smuxi-1.1/lib/agsxmpp/agsxmpp/agsxmpp.csproj0000644000175000017500000005476212652472053022147 0ustar00meebeymeebey00000000000000 Debug AnyCPU 10.0.0 2.0 {C6379274-C5DE-41A2-AE3E-753F85A557BA} Library agsxmpp agsxmpp v4.5 true full false bin\Debug TRACE;DEBUG;SSL;STRINGPREP prompt 4 false none false bin\Release prompt 4 false TRACE;DEBUG;SSL;STRINGPREP {3F8CF2C1-EA37-444F-8693-A3A00B1131D2} StarkSoftProxy {3F8CF2C1-EA37-444F-8693-A3A00B1131D2} StarkSoftProxy smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/0000755000175000017500000000000012250206660017761 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/0000755000175000017500000000000012204443225021056 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/UTF8Encoding.cs0000644000175000017500000002727112204443225023613 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ namespace agsXMPP.Xml.Xpnet { /// /// UTF-8 specific tokenizer. /// public class UTF8Encoding : Encoding { private static readonly int[] utf8HiTypeTable = new int[] { /* 0x80 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x84 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x88 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x8C */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x90 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x94 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x98 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0x9C */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xA0 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xA4 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xA8 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xAC */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xB0 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xB4 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xB8 */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xBC */ BT_MALFORM, BT_MALFORM, BT_MALFORM, BT_MALFORM, /* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, /* 0xF4 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, /* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM }; private static int[] utf8TypeTable = new int[256]; static UTF8Encoding() { System.Array.Copy(asciiTypeTable, 0, utf8TypeTable, 0, 128); System.Array.Copy(utf8HiTypeTable, 0, utf8TypeTable, 128, 128); } /// /// New tokenizer /// public UTF8Encoding() : base(1) { } /// /// What is the type of the current byte? /// /// /// /// protected override int byteType(byte[] buf, int off) { return utf8TypeTable[buf[off] & 0xFF]; } /// /// Current byte to ASCII char /// /// /// /// protected override char byteToAscii(byte[] buf, int off) { return (char)buf[off]; } /// /// c is a significant ASCII character /// /// /// /// /// protected override bool charMatches(byte[] buf, int off, char c) { return ((char)buf[off]) == c; } /// /// A 2 byte UTF-8 representation splits the characters 11 bits /// between the bottom 5 and 6 bits of the bytes. /// /// /// /// protected override int byteType2(byte[] buf, int off) { int[] page = charTypeTable[(buf[off] >> 2) & 0x7]; return page[((buf[off] & 3) << 6) | (buf[off + 1] & 0x3F)]; } /* A 3 byte UTF-8 representation splits the characters 16 bits between the bottom 4, 6 and 6 bits of the bytes. */ /* This will (incorrectly) return BT_LEAD4 for surrogates, but that doesn't matter. */ int byteType3(byte[] buf, int off) { int[] page = charTypeTable[((buf[off] & 0xF) << 4) | ((buf[off + 1] >> 2) & 0xF)]; return page[((buf[off + 1] & 3) << 6) | (buf[off + 2] & 0x3F)]; } void check3(byte[] buf, int off) { switch (buf[off]) { case 0xEF: /* 0xFFFF 0xFFFE */ if ((buf[off + 1] == 0xBF) && ((buf[off + 2] == 0xBF) || (buf[off + 2] == 0xBE))) throw new InvalidTokenException(off); return; case 0xED: /* 0xD800..0xDFFF <=> top 5 bits are 11011 */ if ((buf[off + 1] & 0x20) != 0) throw new InvalidTokenException(off); return; default: return; } } void check4(byte[] buf, int off) { switch (buf[off] & 0x7) { default: return; case 5: case 6: case 7: break; case 4: if ((buf[off + 1] & 0x30) == 0) return; break; } throw new InvalidTokenException(off); } /// /// /// /// /// /// /// /// /// protected override int convert(byte[] sourceBuf, int sourceStart, int sourceEnd, char[] targetBuf, int targetStart) { int initTargetStart = targetStart; int c; while (sourceStart != sourceEnd) { byte b = sourceBuf[sourceStart++]; if (b >= 0) targetBuf[targetStart++] = (char)b; else { switch (utf8TypeTable[b & 0xFF]) { case BT_LEAD2: /* 5, 6 */ targetBuf[targetStart++] = (char)(((b & 0x1F) << 6) | (sourceBuf[sourceStart++] & 0x3F)); break; case BT_LEAD3: /* 4, 6, 6 */ c = (b & 0xF) << 12; c |= (sourceBuf[sourceStart++] & 0x3F) << 6; c |= (sourceBuf[sourceStart++] & 0x3F); targetBuf[targetStart++] = (char)c; break; case BT_LEAD4: /* 3, 6, 6, 6 */ c = (b & 0x7) << 18; c |= (sourceBuf[sourceStart++] & 0x3F) << 12; c |= (sourceBuf[sourceStart++] & 0x3F) << 6; c |= (sourceBuf[sourceStart++] & 0x3F); c -= 0x10000; targetBuf[targetStart++] = (char)((c >> 10) | 0xD800); targetBuf[targetStart++] = (char)((c & ((1 << 10) - 1)) | 0xDC00); break; } } } return targetStart - initTargetStart; } /// /// /// /// /// /// /// protected override void movePosition(byte[] buf, int off, int end, Position pos) { /* Maintain the invariant: off - colDiff == colNumber. */ int colDiff = off - pos.ColumnNumber; int lineNumber = pos.LineNumber; while (off != end) { byte b = buf[off]; if (b >= 0) { ++off; switch (b) { case (byte)'\n': lineNumber += 1; colDiff = off; break; case (byte)'\r': lineNumber += 1; if (off != end && buf[off] == '\n') off++; colDiff = off; break; } } else { switch (utf8TypeTable[b & 0xFF]) { default: off += 1; break; case BT_LEAD2: off += 2; colDiff++; break; case BT_LEAD3: off += 3; colDiff += 2; break; case BT_LEAD4: off += 4; colDiff += 3; break; } } } pos.ColumnNumber = off - colDiff; pos.LineNumber = lineNumber; } int extendData(byte[] buf, int off, int end) { while (off != end) { int type = utf8TypeTable[buf[off] & 0xFF]; if (type >= 0) off++; else if (type < BT_LEAD4) break; else { if (end - off + type < 0) break; switch (type) { case BT_LEAD3: check3(buf, off); break; case BT_LEAD4: check4(buf, off); break; } off -= (int)type; // this is an ugly hack, James } } return off; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/copying.txt0000644000175000017500000000241312204443225023267 0ustar00meebeymeebey00000000000000Copyright (c) 1997, 1998 James Clark 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 JAMES CLARK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of James Clark shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from James Clark.smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/Token.cs0000644000175000017500000000510712204443225022470 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ namespace agsXMPP.Xml.Xpnet { /// /// A token that was parsed. /// public class Token { private int tokenEnd = -1; private int nameEnd = -1; private char refChar1 = (char)0; private char refChar2 = (char)0; /// /// The end of the current token, in relation to the beginning of the buffer. /// public int TokenEnd { get {return tokenEnd;} set {tokenEnd = value; } } /// /// The end of the current token's name, in relation to the beginning of the buffer. /// public int NameEnd { get {return nameEnd;} set {nameEnd = value;} } //public char RefChar //{ // get {return refChar1;} //} /// /// The parsed-out character. & for &amp; /// public char RefChar1 { get {return refChar1;} set {refChar1 = value; } } /// /// The second of two parsed-out characters. TODO: find example. /// public char RefChar2 { get {return refChar2;} set {refChar2 = value; } } /* public void getRefCharPair(char[] ch, int off) { ch[off] = refChar1; ch[off + 1] = refChar2; } */ } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/BufferAggregate.cs0000644000175000017500000001062212204443225024426 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ using System.IO; namespace agsXMPP.Xml.Xpnet { /// /// Aggregate byte arrays together, so we can parse across IP packet boundaries /// public class BufferAggregate { // RingBuffer of the Nieblung private class BufNode { public byte[] buf; public BufNode next = null; } private MemoryStream m_stream = new MemoryStream(); private BufNode m_head = null; private BufNode m_tail = null; /// /// Create an empty buffer /// public BufferAggregate() { } /// /// Write to the buffer. Please make sure that you won't use this memory any more after you hand it in. /// It will get mangled. /// /// public void Write(byte[] buf) { m_stream.Write(buf, 0, buf.Length); if (m_tail == null) { m_head = m_tail = new BufNode(); m_head.buf = buf; } else { BufNode n = new BufNode(); n.buf = buf; m_tail.next = n; m_tail = n; } } /// /// Get the current aggregate contents of the buffer. /// /// public byte[] GetBuffer() { return m_stream.ToArray(); } /// /// Clear the first "offset" bytes of the buffer, so they won't be parsed again. /// /// public void Clear(int offset) { int s = 0; int save = -1; BufNode bn = null; for (bn = m_head; bn != null; bn = bn.next) { if (s + bn.buf.Length <= offset) { if (s + bn.buf.Length == offset) { bn = bn.next; break; } s += bn.buf.Length; } else { save = s + bn.buf.Length - offset; break; } } m_head = bn; if (m_head == null) m_tail = null; if (save > 0) { byte[] buf = new byte[save]; System.Buffer.BlockCopy(m_head.buf, m_head.buf.Length - save, buf, 0, save); m_head.buf = buf; } m_stream.SetLength(0); for (bn = m_head; bn != null; bn = bn.next) { m_stream.Write(bn.buf, 0, bn.buf.Length); } } /// /// UTF8 encode the current contents of the buffer. Just for prettiness in the debugger. /// /// public override string ToString() { byte[] b = GetBuffer(); return System.Text.Encoding.UTF8.GetString(b, 0, b.Length); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/NamespaceStack.cs0000644000175000017500000000673712204443225024304 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ using System.Collections.Generic; namespace agsXMPP.Xml.Xpnet { /// /// Namespace stack. /// public class NamespaceStack { private readonly Stack> stack = new Stack>(); /// /// Create a new stack, primed with xmlns and xml as prefixes. /// public NamespaceStack() { Push(); AddNamespace("xmlns", "http://www.w3.org/2000/xmlns/"); AddNamespace("xml", "http://www.w3.org/XML/1998/namespace"); } /// /// Declare a new scope, typically at the start of each element /// public void Push() { stack.Push(new Dictionary()); } /// /// Pop the current scope off the stack. Typically at the end of each element. /// public void Pop() { stack.Pop(); } /// /// Add a namespace to the current scope. /// /// /// public void AddNamespace(string prefix, string uri) { stack.Peek().Add(prefix, uri); } /// /// Lookup a prefix to find a namespace. Searches down the stack, starting at the current scope. /// /// /// public string LookupNamespace(string prefix) { foreach (Dictionary ht in stack) { if ((ht.Count > 0) && (ht.ContainsKey(prefix))) return ht[prefix]; } return ""; } /// /// The current default namespace. /// public string DefaultNamespace { get { return LookupNamespace(string.Empty); } } /// /// Clears this instance. /// public void Clear() { #if !CF stack.Clear(); #else while (m_stack.Count > 0) m_stack.Pop(); #endif } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/ContentToken.cs0000644000175000017500000001301012204443225024013 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ using System; namespace agsXMPP.Xml.Xpnet { /// /// Represents information returned by Encoding.tokenizeContent. /// @see Encoding#tokenizeContent /// public class ContentToken : Token { private const int INIT_ATT_COUNT = 8; private int attCount = 0; private int[] attNameStart = new int[INIT_ATT_COUNT]; private int[] attNameEnd = new int[INIT_ATT_COUNT]; private int[] attValueStart = new int[INIT_ATT_COUNT]; private int[] attValueEnd = new int[INIT_ATT_COUNT]; private bool[] attNormalized = new bool[INIT_ATT_COUNT]; /// /// Returns the number of attributes specified in the start-tag or empty element tag. /// /// public int getAttributeSpecifiedCount() { return attCount; } /// /// Returns the index of the first character of the name of the /// attribute index i. /// /// /// public int getAttributeNameStart(int i) { if (i >= attCount) throw new System.IndexOutOfRangeException(); return attNameStart[i]; } /** * Returns the index following the last character of the name of the * attribute index i. */ public int getAttributeNameEnd(int i) { if (i >= attCount) throw new System.IndexOutOfRangeException(); return attNameEnd[i]; } /** * Returns the index of the character following the opening quote of * attribute index i. */ public int getAttributeValueStart(int i) { if (i >= attCount) throw new System.IndexOutOfRangeException(); return attValueStart[i]; } /** * Returns the index of the closing quote attribute index i. */ public int getAttributeValueEnd(int i) { if (i >= attCount) throw new System.IndexOutOfRangeException(); return attValueEnd[i]; } /** * Returns true if attribute index i does not need to * be normalized. This is an optimization that allows further processing * of the attribute to be avoided when it is known that normalization * cannot change the value of the attribute. */ public bool isAttributeNormalized(int i) { if (i >= attCount) throw new System.IndexOutOfRangeException(); return attNormalized[i]; } /// /// Clear out all of the current attributes /// public void clearAttributes() { attCount = 0; } /// /// Add a new attribute /// /// /// /// /// /// public void appendAttribute(int nameStart, int nameEnd, int valueStart, int valueEnd, bool normalized) { if (attCount == attNameStart.Length) { attNameStart = grow(attNameStart); attNameEnd = grow(attNameEnd); attValueStart = grow(attValueStart); attValueEnd = grow(attValueEnd); attNormalized = grow(attNormalized); } attNameStart[attCount] = nameStart; attNameEnd[attCount] = nameEnd; attValueStart[attCount] = valueStart; attValueEnd[attCount] = valueEnd; attNormalized[attCount] = normalized; ++attCount; } /// /// Is the current attribute unique? /// /// public void checkAttributeUniqueness(byte[] buf) { for (int i = 1; i < attCount; i++) { int len = attNameEnd[i] - attNameStart[i]; for (int j = 0; j < i; j++) { if (attNameEnd[j] - attNameStart[j] == len) { int n = len; int s1 = attNameStart[i]; int s2 = attNameStart[j]; do { if (--n < 0) throw new InvalidTokenException(attNameStart[i], InvalidTokenException.DUPLICATE_ATTRIBUTE); } while (buf[s1++] == buf[s2++]); } } } } private static int[] grow(int[] v) { int[] tem = v; v = new int[tem.Length << 1]; Array.Copy(tem, 0, v, 0, tem.Length); return v; } private static bool[] grow(bool[] v) { bool[] tem = v; v = new bool[tem.Length << 1]; Array.Copy(tem, 0, v, 0, tem.Length); return v; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/Exceptions.cs0000644000175000017500000001227112204443225023531 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ namespace agsXMPP.Xml.Xpnet { /// /// Base class for other exceptions /// public class TokenException : System.Exception { } /// /// An empty token was detected. This only happens with a buffer of length 0 is passed in /// to the parser. /// public class EmptyTokenException : TokenException { } /// /// End of prolog. /// public class EndOfPrologException : TokenException { } /** * Thrown to indicate that the byte subarray being tokenized is a legal XML * token, but that subsequent bytes in the same entity could be part of * the token. For example, Encoding.tokenizeProlog * would throw this if the byte subarray consists of a legal XML name. * @version $Revision: 1.3 $ $Date: 1998/02/17 04:24:06 $ */ public class ExtensibleTokenException : TokenException { private TOK tokType; /// /// /// /// public ExtensibleTokenException(TOK tokType) { this.tokType = tokType; } /** * Returns the type of token in the byte subarrary. */ public TOK TokenType { get { return tokType; } } } /// /// Several kinds of token problems. /// public class InvalidTokenException : TokenException { private int offset; private byte type; /// /// An illegal character /// public const byte ILLEGAL_CHAR = 0; /// /// Doc prefix wasn't XML /// public const byte XML_TARGET = 1; /// /// More than one attribute with the same name on the same element /// public const byte DUPLICATE_ATTRIBUTE = 2; /// /// Some other type of bad token detected /// /// /// public InvalidTokenException(int offset, byte type) { this.offset = offset; this.type = type; } /// /// Illegal character detected /// /// public InvalidTokenException(int offset) { this.offset = offset; this.type = ILLEGAL_CHAR; } /// /// Offset into the buffer where the problem ocurred. /// public int Offset { get { return this.offset; } } /// /// Type of exception /// public int Type { get { return this.type; } } } /** * Thrown to indicate that the subarray being tokenized is not the * complete encoding of one or more characters, but might be if * more bytes were added. * @version $Revision: 1.2 $ $Date: 1998/02/17 04:24:11 $ */ public class PartialCharException : PartialTokenException { private int leadByteIndex; /// /// /// /// public PartialCharException(int leadByteIndex) { this.leadByteIndex = leadByteIndex; } /** * Returns the index of the first byte that is not part of the complete * encoding of a character. */ public int LeadByteIndex { get { return leadByteIndex; } } } /// /// A partial token was received. Try again, after you add more bytes to the buffer. /// public class PartialTokenException : TokenException { } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/Encoding.cs0000644000175000017500000035206112204443225023142 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ namespace agsXMPP.Xml.Xpnet { /// /// Tokens that might have been found /// public enum TOK { /** * Represents one or more characters of data. */ DATA_CHARS, /** * Represents a newline (CR, LF or CR followed by LF) in data. */ DATA_NEWLINE, /** * Represents a complete start-tag <name>, * that doesn't have any attribute specifications. */ START_TAG_NO_ATTS, /** * Represents a complete start-tag <name * att="val">, that contains one or more * attribute specifications. */ START_TAG_WITH_ATTS, /** * Represents an empty element tag <name/>, * that doesn't have any attribute specifications. */ EMPTY_ELEMENT_NO_ATTS, /** * Represents an empty element tag <name * att="val"/>, that contains one or more * attribute specifications. */ EMPTY_ELEMENT_WITH_ATTS, /** * Represents a complete end-tag </name>. */ END_TAG, /** * Represents the start of a CDATA section * <![CDATA[. */ CDATA_SECT_OPEN, /** * Represents the end of a CDATA section ]]>. */ CDATA_SECT_CLOSE, /** * Represents a general entity reference. */ ENTITY_REF, /** * Represents a general entity reference to a one of the 5 * predefined entities amp, lt, * gt, quot, apos. */ MAGIC_ENTITY_REF, /** * Represents a numeric character reference (decimal or * hexadecimal), when the referenced character is less * than or equal to 0xFFFF and so is represented by a * single char. */ CHAR_REF, /** * Represents a numeric character reference (decimal or * hexadecimal), when the referenced character is greater * than 0xFFFF and so is represented by a pair of chars. */ CHAR_PAIR_REF, /** * Represents a processing instruction. */ PI, /** * Represents an XML declaration or text declaration (a * processing instruction whose target is * xml). */ XML_DECL, /** * Represents a comment <!-- comment -->. * This can occur both in the prolog and in content. */ COMMENT, /** * Represents a white space character in an attribute * value, excluding white space characters that are part * of line boundaries. */ ATTRIBUTE_VALUE_S, /** * Represents a parameter entity reference in the prolog. */ PARAM_ENTITY_REF, /** * Represents whitespace in the prolog. * The token contains one or more whitespace characters. */ PROLOG_S, /** * Represents <!NAME in the prolog. */ DECL_OPEN, /** * Represents > in the prolog. */ DECL_CLOSE, /** * Represents a name in the prolog. */ NAME, /** * Represents a name token in the prolog that is not a name. */ NMTOKEN, /** * Represents #NAME in the prolog. */ POUND_NAME, /** * Represents | in the prolog. */ OR, /** * Represents a % in the prolog that does not start * a parameter entity reference. * This can occur in an entity declaration. */ PERCENT, /** * Represents a ( in the prolog. */ OPEN_PAREN, /** * Represents a ) in the prolog that is not * followed immediately by any of * *, + or ?. */ CLOSE_PAREN, /** * Represents [ in the prolog. */ OPEN_BRACKET, /** * Represents ] in the prolog. */ CLOSE_BRACKET, /** * Represents a literal (EntityValue, AttValue, SystemLiteral or * PubidLiteral). */ LITERAL, /** * Represents a name followed immediately by ?. */ NAME_QUESTION, /** * Represents a name followed immediately by *. */ NAME_ASTERISK, /** * Represents a name followed immediately by +. */ NAME_PLUS, /** * Represents <![ in the prolog. */ COND_SECT_OPEN, /** * Represents ]]> in the prolog. */ COND_SECT_CLOSE, /** * Represents )? in the prolog. */ CLOSE_PAREN_QUESTION, /** * Represents )* in the prolog. */ CLOSE_PAREN_ASTERISK, /** * Represents )+ in the prolog. */ CLOSE_PAREN_PLUS, /** * Represents , in the prolog. */ COMMA, }; /// /// Base tokenizer class /// public abstract class Encoding { // Bytes with type < 0 may not be data in content. // The negation of the lead byte type gives the total number of bytes. /// /// Need more bytes /// protected const int BT_LEAD2 = -2; /// /// Need more bytes /// protected const int BT_LEAD3 = -3; /// /// Need more bytes /// protected const int BT_LEAD4 = -4; /// /// Not XML /// protected const int BT_NONXML = BT_LEAD4 - 1; /// /// Malformed XML /// protected const int BT_MALFORM = BT_NONXML - 1; /// /// Less than /// protected const int BT_LT = BT_MALFORM - 1; /// /// Ampersand /// protected const int BT_AMP = BT_LT - 1; /// /// right square bracket /// protected const int BT_RSQB = BT_AMP - 1; /// /// carriage return /// protected const int BT_CR = BT_RSQB - 1; /// /// line feed /// protected const int BT_LF = BT_CR - 1; // Bytes with type >= 0 are treated as data in content. /// /// greater than /// protected const int BT_GT = 0; /// /// Quote /// protected const int BT_QUOT = BT_GT + 1; /// /// Apostrophe /// protected const int BT_APOS = BT_QUOT + 1; /// /// Equal sign /// protected const int BT_EQUALS = BT_APOS + 1; /// /// Question mark /// protected const int BT_QUEST = BT_EQUALS + 1; /// /// Exclamation point /// protected const int BT_EXCL = BT_QUEST + 1; /// /// Solidus (/) /// protected const int BT_SOL = BT_EXCL + 1; /// /// Semicolon /// protected const int BT_SEMI = BT_SOL + 1; /// /// Hash /// protected const int BT_NUM = BT_SEMI + 1; /// /// Left square bracket /// protected const int BT_LSQB = BT_NUM + 1; /// /// space /// protected const int BT_S = BT_LSQB + 1; /// /// /// protected const int BT_NMSTRT = BT_S + 1; /// /// /// protected const int BT_NAME = BT_NMSTRT + 1; /// /// Minus /// protected const int BT_MINUS = BT_NAME + 1; /// /// Other /// protected const int BT_OTHER = BT_MINUS + 1; /// /// Percent /// protected const int BT_PERCNT = BT_OTHER + 1; /// /// Left paren /// protected const int BT_LPAR = BT_PERCNT + 1; /// /// Right paren /// protected const int BT_RPAR = BT_LPAR + 1; /// /// /// protected const int BT_AST = BT_RPAR + 1; /// /// + /// protected const int BT_PLUS = BT_AST + 1; /// /// , /// protected const int BT_COMMA = BT_PLUS + 1; /// /// Pipe /// protected const int BT_VERBAR = BT_COMMA + 1; /// /// What syntax do each of the ASCII7 characters have? /// protected static readonly int [] asciiTypeTable = new int[] { /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_NAME, BT_NAME, BT_NAME, BT_NAME, /* 0x34 */ BT_NAME, BT_NAME, BT_NAME, BT_NAME, /* 0x38 */ BT_NAME, BT_NAME, BT_NMSTRT, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x44 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x64 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, }; /// /// /// /// /// /// /// /// /// protected abstract int convert(byte[] sourceBuf, int sourceStart, int sourceEnd, char[] targetBuf, int targetStart); private static Encoding utf8Encoding; private const byte UTF8_ENCODING = 0; private const byte UTF16_LITTLE_ENDIAN_ENCODING = 1; private const byte UTF16_BIG_ENDIAN_ENCODING = 2; private const byte INTERNAL_ENCODING = 3; private const byte ISO8859_1_ENCODING = 4; private const byte ASCII_ENCODING = 5; private static Encoding getEncoding(byte enc) { switch (enc) { case UTF8_ENCODING: if (utf8Encoding == null) utf8Encoding = new UTF8Encoding(); return utf8Encoding; /* case UTF16_LITTLE_ENDIAN_ENCODING: if (utf16LittleEndianEncoding == null) utf16LittleEndianEncoding = new UTF16LittleEndianEncoding(); return utf16LittleEndianEncoding; case UTF16_BIG_ENDIAN_ENCODING: if (utf16BigEndianEncoding == null) utf16BigEndianEncoding = new UTF16BigEndianEncoding(); return utf16BigEndianEncoding; case INTERNAL_ENCODING: if (internalEncoding == null) internalEncoding = new InternalEncoding(); return internalEncoding; case ISO8859_1_ENCODING: if (iso8859_1Encoding == null) iso8859_1Encoding = new ISO8859_1Encoding(); return iso8859_1Encoding; case ASCII_ENCODING: if (asciiEncoding == null) asciiEncoding = new ASCIIEncoding(); return asciiEncoding; */ } return null; } private int minBPC; /// /// Constructor called by subclasses to set the minimum bytes per character /// /// protected Encoding(int minBPC) { this.minBPC = minBPC; } /// /// Get the byte type of the next byte. There are guaranteed to be minBPC available bytes starting at off. /// /// /// /// protected abstract int byteType(byte[] buf, int off); /// /// Really only works for ASCII7. /// /// /// /// protected abstract char byteToAscii(byte[] buf, int off); /// /// This must only be called when c is an (XML significant) /// ASCII character. /// /// /// /// /// protected abstract bool charMatches(byte[] buf, int off, char c); /// /// Called only when byteType(buf, off) == BT_LEAD2 /// /// /// /// protected virtual int byteType2(byte[] buf, int off) { return BT_OTHER; } /// /// Called only when byteType(buf, off) == BT_LEAD3 /// /// /// /// int byteType3(byte[] buf, int off) { return BT_OTHER; } /// /// Called only when byteType(buf, off) == BT_LEAD4 /// /// /// /// int byteType4(byte[] buf, int off) { return BT_OTHER; } void check2(byte[] buf, int off) { } void check3(byte[] buf, int off) { } void check4(byte[] buf, int off) { } /** * Moves a position forward. On entry, pos gives * the position of the byte at index off in * buf. On exit, it pos will give * the position of the byte at index end, which * must be greater than or equal to off. The * bytes between off and end must * encode one or more complete characters. A carriage return * followed by a line feed will be treated as a single line * delimiter provided that they are given to * movePosition together. */ protected abstract void movePosition(byte[] buf, int off, int end, Position pos); private void checkCharMatches(byte[] buf, int off, char c) { if (!charMatches(buf, off, c)) throw new InvalidTokenException(off); } /* off points to character following "'); token.TokenEnd = off + minBPC; return TOK.COMMENT; } break; default: off += minBPC; break; } } } throw new PartialTokenException(); } /* off points to character following " */ switch (byteType(buf, off + minBPC)) { case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: throw new InvalidTokenException(off); } /* fall through */ goto case BT_S; case BT_S: case BT_CR: case BT_LF: token.TokenEnd = off; return TOK.DECL_OPEN; case BT_NMSTRT: off += minBPC; break; default: throw new InvalidTokenException(off); } } throw new PartialTokenException(); } private bool targetIsXml(byte[] buf, int off, int end) { bool upper = false; if (end - off != minBPC*3) return false; switch (byteToAscii(buf, off)) { case 'x': break; case 'X': upper = true; break; default: return false; } off += minBPC; switch (byteToAscii(buf, off)) { case 'm': break; case 'M': upper = true; break; default: return false; } off += minBPC; switch (byteToAscii(buf, off)) { case 'l': break; case 'L': upper = true; break; default: return false; } if (upper) throw new InvalidTokenException(off, InvalidTokenException.XML_TARGET); return true; } /* off points to character following "')) { token.TokenEnd = off + minBPC; if (isXml) return TOK.XML_DECL; else return TOK.PI; } break; default: off += minBPC; break; } } throw new PartialTokenException(); case BT_QUEST: token.NameEnd = off; off += minBPC; if (off == end) throw new PartialTokenException(); checkCharMatches(buf, off, '>'); token.TokenEnd = off + minBPC; return (targetIsXml(buf, target, token.NameEnd) ? TOK.XML_DECL : TOK.PI); default: throw new InvalidTokenException(off); } } throw new PartialTokenException(); } /* off points to character following " *
  • TOK.DATA_CHARS
  • *
  • TOK.DATA_NEWLINE
  • *
  • TOK.CDATA_SECT_CLOSE
  • * *

    * Information about the token is stored in token. *

    * After TOK.CDATA_SECT_CLOSE is returned, the application * should use tokenizeContent. * * @exception EmptyTokenException if the subarray is empty * @exception PartialTokenException if the subarray contains only part of * a legal token * @exception InvalidTokenException if the subarrary does not start * with a legal token or part of one * @exception ExtensibleTokenException if the subarray encodes just a carriage * return ('\r') * * @see #TOK.DATA_CHARS * @see #TOK.DATA_NEWLINE * @see #TOK.CDATA_SECT_CLOSE * @see Token * @see EmptyTokenException * @see PartialTokenException * @see InvalidTokenException * @see ExtensibleTokenException * @see #tokenizeContent */ public TOK tokenizeCdataSection(byte[] buf, int off, int end, Token token) { if (minBPC > 1) end = adjustEnd(off, end); if (off == end) throw new EmptyTokenException(); switch (byteType(buf, off)) { case BT_RSQB: off += minBPC; if (off == end) throw new PartialTokenException(); if (!charMatches(buf, off, ']')) break; off += minBPC; if (off == end) throw new PartialTokenException(); if (!charMatches(buf, off, '>')) { off -= minBPC; break; } token.TokenEnd = off + minBPC; return TOK.CDATA_SECT_CLOSE; case BT_CR: off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.DATA_NEWLINE); if (byteType(buf, off) == BT_LF) off += minBPC; token.TokenEnd = off; return TOK.DATA_NEWLINE; case BT_LF: token.TokenEnd = off + minBPC; return TOK.DATA_NEWLINE; case BT_NONXML: case BT_MALFORM: throw new InvalidTokenException(off); case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); check4(buf, off); off += 4; break; default: off += minBPC; break; } token.TokenEnd = extendCdata(buf, off, end); return TOK.DATA_CHARS; } int extendCdata(byte[] buf, int off, int end) { while (off != end) { switch (byteType(buf, off)) { case BT_LEAD2: if (end - off < 2) return off; check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) return off; check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) return off; check4(buf, off); off += 4; break; case BT_RSQB: case BT_NONXML: case BT_MALFORM: case BT_CR: case BT_LF: return off; default: off += minBPC; break; } } return off; } /* off points to character following "= 0x110000) throw new InvalidTokenException(off); } } throw new PartialTokenException(); } /* off points to character following "&#" */ private TOK scanCharRef(byte[] buf, int off, int end, Token token) { if (off != end) { int c = byteToAscii(buf, off); switch (c) { case 'x': return scanHexCharRef(buf, off + minBPC, end, token); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; default: throw new InvalidTokenException(off); } int num = c - '0'; for (off += minBPC; off != end; off += minBPC) { c = byteToAscii(buf, off); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num = num * 10 + (c - '0'); if (num < 0x110000) break; /* fall through */ goto default; default: throw new InvalidTokenException(off); case ';': token.TokenEnd = off + minBPC; return setRefChar(num, token); } } } throw new PartialTokenException(); } /* num is known to be < 0x110000; return the token code */ private TOK setRefChar(int num, Token token) { if (num < 0x10000) { switch (charTypeTable[num >> 8][num & 0xFF]) { case BT_NONXML: case BT_LEAD4: case BT_MALFORM: throw new InvalidTokenException(token.TokenEnd - minBPC); } token.RefChar1 = (char)num; return TOK.CHAR_REF; } else { num -= 0x10000; token.RefChar1 = (char)((num >> 10) + 0xD800); token.RefChar2 = (char)((num & ((1 << 10) - 1)) + 0xDC00); return TOK.CHAR_PAIR_REF; } } private bool isMagicEntityRef(byte[] buf, int off, int end, Token token) { switch (byteToAscii(buf, off)) { case 'a': if (end - off < minBPC*4) break; switch (byteToAscii(buf, off + minBPC)) { case 'm': if (charMatches(buf, off + minBPC*2, 'p') && charMatches(buf, off + minBPC*3, ';')) { token.TokenEnd = off + minBPC*4; token.RefChar1 = '&'; return true; } break; case 'p': if (end - off >= minBPC*5 && charMatches(buf, off + minBPC*2, 'o') && charMatches(buf, off + minBPC*3, 's') && charMatches(buf, off + minBPC*4, ';')) { token.TokenEnd = off + minBPC*5; token.RefChar1 = '\''; return true; } break; } break; case 'l': if (end - off >= minBPC*3 && charMatches(buf, off + minBPC, 't') && charMatches(buf, off + minBPC*2, ';')) { token.TokenEnd = off + minBPC*3; token.RefChar1 = '<'; return true; } break; case 'g': if (end - off >= minBPC*3 && charMatches(buf, off + minBPC, 't') && charMatches(buf, off + minBPC*2, ';')) { token.TokenEnd = off + minBPC*3; token.RefChar1 = '>'; return true; } break; case 'q': if (end - off >= minBPC*5 && charMatches(buf, off + minBPC, 'u') && charMatches(buf, off + minBPC*2, 'o') && charMatches(buf, off + minBPC*3, 't') && charMatches(buf, off + minBPC*4, ';')) { token.TokenEnd = off + minBPC*5; token.RefChar1 = '"'; return true; } break; } return false; } /* off points to character following "&" */ private TOK scanRef(byte[] buf, int off, int end, Token token) { if (off == end) throw new PartialTokenException(); if (isMagicEntityRef(buf, off, end, token)) return TOK.MAGIC_ENTITY_REF; switch (byteType(buf, off)) { case BT_NMSTRT: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (byteType2(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (byteType3(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (byteType4(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 4; break; case BT_NUM: return scanCharRef(buf, off + minBPC, end, token); default: throw new InvalidTokenException(off); } while (off != end) { switch (byteType(buf, off)) { case BT_NMSTRT: case BT_NAME: case BT_MINUS: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (!isNameChar2(buf, off)) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (!isNameChar3(buf, off)) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (!isNameChar4(buf, off)) throw new InvalidTokenException(off); off += 4; break; case BT_SEMI: token.NameEnd = off; token.TokenEnd = off + minBPC; return TOK.ENTITY_REF; default: throw new InvalidTokenException(off); } } throw new PartialTokenException(); } /* off points to character following first character of attribute name */ private TOK scanAtts(int nameStart, byte[] buf, int off, int end, ContentToken token) { int NameEnd = -1; while (off != end) { switch (byteType(buf, off)) { case BT_NMSTRT: case BT_NAME: case BT_MINUS: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (!isNameChar2(buf, off)) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (!isNameChar3(buf, off)) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (!isNameChar4(buf, off)) throw new InvalidTokenException(off); off += 4; break; case BT_S: case BT_CR: case BT_LF: NameEnd = off; for (;;) { off += minBPC; if (off == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_EQUALS: goto loop; case BT_S: case BT_LF: case BT_CR: break; default: throw new InvalidTokenException(off); } } loop: ; /* fall through */ goto case BT_EQUALS; case BT_EQUALS: { if (NameEnd < 0) NameEnd = off; int open; for (;;) { off += minBPC; if (off == end) throw new PartialTokenException(); open = byteType(buf, off); if (open == BT_QUOT || open == BT_APOS) break; switch (open) { case BT_S: case BT_LF: case BT_CR: break; default: throw new InvalidTokenException(off); } } off += minBPC; int valueStart = off; bool normalized = true; int t; /* in attribute value */ for (;;) { if (off == end) throw new PartialTokenException(); t = byteType(buf, off); if (t == open) break; switch (t) { case BT_NONXML: case BT_MALFORM: throw new InvalidTokenException(off); case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); check4(buf, off); off += 4; break; case BT_AMP: { normalized = false; int saveNameEnd = token.NameEnd; scanRef(buf, off + minBPC, end, token); token.NameEnd = saveNameEnd; off = token.TokenEnd; break; } case BT_S: if (normalized && (off == valueStart || byteToAscii(buf, off) != ' ' || (off + minBPC != end && (byteToAscii(buf, off + minBPC) == ' ' || byteType(buf, off + minBPC) == open)))) normalized = false; off += minBPC; break; case BT_LT: throw new InvalidTokenException(off); case BT_LF: case BT_CR: normalized = false; /* fall through */ goto default; default: off += minBPC; break; } } token.appendAttribute(nameStart, NameEnd, valueStart, off, normalized); off += minBPC; if (off == end) throw new PartialTokenException(); t = byteType(buf, off); switch (t) { case BT_S: case BT_CR: case BT_LF: off += minBPC; if (off == end) throw new PartialTokenException(); t = byteType(buf, off); break; case BT_GT: case BT_SOL: break; default: throw new InvalidTokenException(off); } /* off points to closing quote */ for (;;) { switch (t) { case BT_NMSTRT: nameStart = off; off += minBPC; goto skipToName; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (byteType2(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); nameStart = off; off += 2; goto skipToName; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (byteType3(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); nameStart = off; off += 3; goto skipToName; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (byteType4(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); nameStart = off; off += 4; goto skipToName; case BT_S: case BT_CR: case BT_LF: break; case BT_GT: token.checkAttributeUniqueness(buf); token.TokenEnd = off + minBPC; return TOK.START_TAG_WITH_ATTS; case BT_SOL: off += minBPC; if (off == end) throw new PartialTokenException(); checkCharMatches(buf, off, '>'); token.checkAttributeUniqueness(buf); token.TokenEnd = off + minBPC; return TOK.EMPTY_ELEMENT_WITH_ATTS; default: throw new InvalidTokenException(off); } off += minBPC; if (off == end) throw new PartialTokenException(); t = byteType(buf, off); } skipToName: NameEnd = -1; break; } default: throw new InvalidTokenException(off); } } throw new PartialTokenException(); } /* off points to character following "<" */ private TOK scanLt(byte[] buf, int off, int end, ContentToken token) { if (off == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_NMSTRT: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (byteType2(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (byteType3(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (byteType4(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 4; break; case BT_EXCL: if ((off += minBPC) == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_MINUS: return scanComment(buf, off + minBPC, end, token); case BT_LSQB: return scanCdataSection(buf, off + minBPC, end, token); } throw new InvalidTokenException(off); case BT_QUEST: return scanPi(buf, off + minBPC, end, token); case BT_SOL: return scanEndTag(buf, off + minBPC, end, token); default: throw new InvalidTokenException(off); } /* we have a start-tag */ token.NameEnd = -1; token.clearAttributes(); while (off != end) { switch (byteType(buf, off)) { case BT_NMSTRT: case BT_NAME: case BT_MINUS: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (!isNameChar2(buf, off)) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (!isNameChar3(buf, off)) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (!isNameChar4(buf, off)) throw new InvalidTokenException(off); off += 4; break; case BT_S: case BT_CR: case BT_LF: token.NameEnd = off; off += minBPC; for (;;) { if (off == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_NMSTRT: return scanAtts(off, buf, off + minBPC, end, token); case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (byteType2(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); return scanAtts(off, buf, off + 2, end, token); case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (byteType3(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); return scanAtts(off, buf, off + 3, end, token); case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (byteType4(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); return scanAtts(off, buf, off + 4, end, token); case BT_GT: case BT_SOL: goto loop; case BT_S: case BT_CR: case BT_LF: off += minBPC; break; default: throw new InvalidTokenException(off); } } loop: break; case BT_GT: if (token.NameEnd < 0) token.NameEnd = off; token.TokenEnd = off + minBPC; return TOK.START_TAG_NO_ATTS; case BT_SOL: if (token.NameEnd < 0) token.NameEnd = off; off += minBPC; if (off == end) throw new PartialTokenException(); checkCharMatches(buf, off, '>'); token.TokenEnd = off + minBPC; return TOK.EMPTY_ELEMENT_NO_ATTS; default: throw new InvalidTokenException(off); } } throw new PartialTokenException(); } // Ensure that we always scan a multiple of minBPC bytes. private int adjustEnd(int off, int end) { int n = end - off; if ((n & (minBPC - 1)) != 0) { n &= ~(minBPC - 1); if (n == 0) throw new PartialCharException(off); return off + n; } else return end; } /** * Scans the first token of a byte subarrary that contains content. * Returns one of the following integers according to the type of token * that the subarray starts with: *
      *
    • TOK.START_TAG_NO_ATTS
    • *
    • TOK.START_TAG_WITH_ATTS
    • *
    • TOK.EMPTY_ELEMENT_NO_ATTS
    • *
    • TOK.EMPTY_ELEMENT_WITH_ATTS
    • *
    • TOK.END_TAG
    • *
    • TOK.DATA_CHARS
    • *
    • TOK.DATA_NEWLINE
    • *
    • TOK.CDATA_SECT_OPEN
    • *
    • TOK.ENTITY_REF
    • *
    • TOK.MAGIC_ENTITY_REF
    • *
    • TOK.CHAR_REF
    • *
    • TOK.CHAR_PAIR_REF
    • *
    • TOK.PI
    • *
    • TOK.XML_DECL
    • *
    • TOK.COMMENT
    • *
    *

    * Information about the token is stored in token. *

    * When TOK.CDATA_SECT_OPEN is returned, * tokenizeCdataSection should be called until * it returns TOK.CDATA_SECT. * * @exception EmptyTokenException if the subarray is empty * @exception PartialTokenException if the subarray contains only part of * a legal token * @exception InvalidTokenException if the subarrary does not start * with a legal token or part of one * @exception ExtensibleTokenException if the subarray encodes just a carriage * return ('\r') * * @see #TOK.START_TAG_NO_ATTS * @see #TOK.START_TAG_WITH_ATTS * @see #TOK.EMPTY_ELEMENT_NO_ATTS * @see #TOK.EMPTY_ELEMENT_WITH_ATTS * @see #TOK.END_TAG * @see #TOK.DATA_CHARS * @see #TOK.DATA_NEWLINE * @see #TOK.CDATA_SECT_OPEN * @see #TOK.ENTITY_REF * @see #TOK.MAGIC_ENTITY_REF * @see #TOK.CHAR_REF * @see #TOK.CHAR_PAIR_REF * @see #TOK.PI * @see #TOK.XML_DECL * @see #TOK.COMMENT * @see ContentToken * @see EmptyTokenException * @see PartialTokenException * @see InvalidTokenException * @see ExtensibleTokenException * @see #tokenizeCdataSection */ public TOK tokenizeContent(byte[] buf, int off, int end, ContentToken token) { if (minBPC > 1) end = adjustEnd(off, end); if (off == end) throw new EmptyTokenException(); switch (byteType(buf, off)) { case BT_LT: return scanLt(buf, off + minBPC, end, token); case BT_AMP: return scanRef(buf, off + minBPC, end, token); case BT_CR: off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.DATA_NEWLINE); if (byteType(buf, off) == BT_LF) off += minBPC; token.TokenEnd = off; return TOK.DATA_NEWLINE; case BT_LF: token.TokenEnd = off + minBPC; return TOK.DATA_NEWLINE; case BT_RSQB: off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.DATA_CHARS); if (!charMatches(buf, off, ']')) break; off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.DATA_CHARS); if (!charMatches(buf, off, '>')) { off -= minBPC; break; } throw new InvalidTokenException(off); case BT_NONXML: case BT_MALFORM: throw new InvalidTokenException(off); case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); check4(buf, off); off += 4; break; default: off += minBPC; break; } token.TokenEnd = extendData(buf, off, end); return TOK.DATA_CHARS; } int extendData(byte[] buf, int off, int end) { while (off != end) { switch (byteType(buf, off)) { case BT_LEAD2: if (end - off < 2) return off; check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) return off; check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) return off; check4(buf, off); off += 4; break; case BT_RSQB: case BT_AMP: case BT_LT: case BT_NONXML: case BT_MALFORM: case BT_CR: case BT_LF: return off; default: off += minBPC; break; } } return off; } /* off points to character following "%" */ private TOK scanPercent(byte[] buf, int off, int end, Token token) { if (off == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_NMSTRT: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (byteType2(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (byteType3(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (byteType4(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 4; break; case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: token.TokenEnd = off; return TOK.PERCENT; default: throw new InvalidTokenException(off); } while (off != end) { switch (byteType(buf, off)) { case BT_NMSTRT: case BT_NAME: case BT_MINUS: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (!isNameChar2(buf, off)) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (!isNameChar3(buf, off)) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (!isNameChar4(buf, off)) throw new InvalidTokenException(off); off += 4; break; case BT_SEMI: token.NameEnd = off; token.TokenEnd = off + minBPC; return TOK.PARAM_ENTITY_REF; default: throw new InvalidTokenException(off); } } throw new PartialTokenException(); } private TOK scanPoundName(byte[] buf, int off, int end, Token token) { if (off == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_NMSTRT: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (byteType2(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (byteType3(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (byteType4(buf, off) != BT_NMSTRT) throw new InvalidTokenException(off); off += 4; break; default: throw new InvalidTokenException(off); } while (off != end) { switch (byteType(buf, off)) { case BT_NMSTRT: case BT_NAME: case BT_MINUS: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (!isNameChar2(buf, off)) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (!isNameChar3(buf, off)) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (!isNameChar4(buf, off)) throw new InvalidTokenException(off); off += 4; break; case BT_CR: case BT_LF: case BT_S: case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: token.TokenEnd = off; return TOK.POUND_NAME; default: throw new InvalidTokenException(off); } } throw new ExtensibleTokenException(TOK.POUND_NAME); } private TOK scanLit(int open, byte[] buf, int off, int end, Token token) { while (off != end) { int t = byteType(buf, off); switch (t) { case BT_LEAD2: if (end - off < 2) throw new PartialTokenException(); check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialTokenException(); check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialTokenException(); check4(buf, off); off += 4; break; case BT_NONXML: case BT_MALFORM: throw new InvalidTokenException(off); case BT_QUOT: case BT_APOS: off += minBPC; if (t != open) break; if (off == end) throw new ExtensibleTokenException(TOK.LITERAL); switch (byteType(buf, off)) { case BT_S: case BT_CR: case BT_LF: case BT_GT: case BT_PERCNT: case BT_LSQB: token.TokenEnd = off; return TOK.LITERAL; default: throw new InvalidTokenException(off); } default: off += minBPC; break; } } throw new PartialTokenException(); } /** * Returns an encoding object to be used to start parsing an * external entity. The encoding is chosen based on the * initial 4 bytes of the entity. * * @param buf the byte array containing the initial bytes of * the entity @param off the index in buf of the * first byte of the entity @param end the index in * buf following the last available byte of the * entity; end - off must be greater than or * equal to 4 unless the entity has fewer that 4 bytes, in * which case it must be equal to the length of the entity * @param token receives information about the presence of a * byte order mark; if the entity starts with a byte order * mark then token.getTokenEnd() will return * off + 2, otherwise it will return * off * * @see TextDecl * @see XmlDecl * @see #TOK.XML_DECL * @see #getEncoding * @see #getInternalEncoding */ public static Encoding getInitialEncoding(byte[] buf, int off, int end, Token token) { token.TokenEnd = off; switch (end - off) { case 0: break; case 1: if (buf[off] > 127) return null; break; default: int b0 = buf[off] & 0xFF; int b1 = buf[off + 1] & 0xFF; switch ((b0 << 8) | b1) { case 0xFEFF: token.TokenEnd = off + 2; /* fall through */ goto case '<'; case '<': /* not legal; but not a fatal error */ return getEncoding(UTF16_BIG_ENDIAN_ENCODING); case 0xFFFE: token.TokenEnd = off + 2; /* fall through */ goto case '<' << 8; case '<' << 8: /* not legal; but not a fatal error */ return getEncoding(UTF16_LITTLE_ENDIAN_ENCODING); } break; } return getEncoding(UTF8_ENCODING); } /** * Returns an Encoding corresponding to the * specified IANA character set name. Returns this * Encoding if the name is null. Returns null if * the specified encoding is not supported. Note that there * are two distinct Encoding objects associated * with the name UTF-16, one for each possible * byte order; if this Encoding is UTF-16 with * little-endian byte ordering, then * getEncoding("UTF-16") will return this, * otherwise it will return an Encoding for * UTF-16 with big-endian byte ordering. @param name a string * specifying the IANA name of the encoding; this is case * insensitive */ public Encoding getEncoding(string name) { if (name == null) return this; switch (name.ToUpper()) { case "UTF-8": return getEncoding(UTF8_ENCODING); /* case "UTF-16": return getUTF16Encoding(); case "ISO-8859-1": return getEncoding(ISO8859_1_ENCODING); case "US-ASCII": return getEncoding(ASCII_ENCODING); */ } return null; } /** * Returns an Encoding for entities encoded with * a single-byte encoding (an encoding in which each byte * represents exactly one character). @param map a string * specifying the character represented by each byte; the * string must have a length of 256; * map.charAt(b) specifies the character encoded * by byte b; bytes that do not represent any * character should be mapped to \uFFFD */ public Encoding getSingleByteEncoding(string map) { //return new SingleByteEncoding(map); #if CF throw new util.NotImplementedException(); #else throw new System.NotImplementedException(); #endif } /** * Returns an Encoding object for use with * internal entities. This is a UTF-16 big endian encoding, * except that newlines are assumed to have been normalized * into line feed, so carriage return is treated like a space. */ public static Encoding getInternalEncoding() { return getEncoding(INTERNAL_ENCODING); } /** * Scans the first token of a byte subarray that contains part of a * prolog. * Returns one of the following integers according to the type of token * that the subarray starts with: *
      *
    • TOK.PI
    • *
    • TOK.XML_DECL
    • *
    • TOK.COMMENT
    • *
    • TOK.PARAM_ENTITY_REF
    • *
    • TOK.PROLOG_S
    • *
    • TOK.DECL_OPEN
    • *
    • TOK.DECL_CLOSE
    • *
    • TOK.NAME
    • *
    • TOK.NMTOKEN
    • *
    • TOK.POUND_NAME
    • *
    • TOK.OR
    • *
    • TOK.PERCENT
    • *
    • TOK.OPEN_PAREN
    • *
    • TOK.CLOSE_PAREN
    • *
    • TOK.OPEN_BRACKET
    • *
    • TOK.CLOSE_BRACKET
    • *
    • TOK.LITERAL
    • *
    • TOK.NAME_QUESTION
    • *
    • TOK.NAME_ASTERISK
    • *
    • TOK.NAME_PLUS
    • *
    • TOK.COND_SECT_OPEN
    • *
    • TOK.COND_SECT_CLOSE
    • *
    • TOK.CLOSE_PAREN_QUESTION
    • *
    • TOK.CLOSE_PAREN_ASTERISK
    • *
    • TOK.CLOSE_PAREN_PLUS
    • *
    • TOK.COMMA
    • *
    * @exception EmptyTokenException if the subarray is empty * @exception PartialTokenException if the subarray contains only part of * a legal token * @exception InvalidTokenException if the subarrary does not start * with a legal token or part of one * @exception EndOfPrologException if the subarray starts with the document * element; tokenizeContent should be used on the remainder * of the entity * @exception ExtensibleTokenException if the subarray is a legal token * but subsequent bytes in the same entity could be part of the token * @see #TOK.PI * @see #TOK.XML_DECL * @see #TOK.COMMENT * @see #TOK.PARAM_ENTITY_REF * @see #TOK.PROLOG_S * @see #TOK.DECL_OPEN * @see #TOK.DECL_CLOSE * @see #TOK.NAME * @see #TOK.NMTOKEN * @see #TOK.POUND_NAME * @see #TOK.OR * @see #TOK.PERCENT * @see #TOK.OPEN_PAREN * @see #TOK.CLOSE_PAREN * @see #TOK.OPEN_BRACKET * @see #TOK.CLOSE_BRACKET * @see #TOK.LITERAL * @see #TOK.NAME_QUESTION * @see #TOK.NAME_ASTERISK * @see #TOK.NAME_PLUS * @see #TOK.COND_SECT_OPEN * @see #TOK.COND_SECT_CLOSE * @see #TOK.CLOSE_PAREN_QUESTION * @see #TOK.CLOSE_PAREN_ASTERISK * @see #TOK.CLOSE_PAREN_PLUS * @see #TOK.COMMA * @see ContentToken * @see EmptyTokenException * @see PartialTokenException * @see InvalidTokenException * @see ExtensibleTokenException * @see EndOfPrologException */ public TOK tokenizeProlog(byte[] buf, int off, int end, Token token) { TOK tok; if (minBPC > 1) end = adjustEnd(off, end); if (off == end) throw new EmptyTokenException(); switch (byteType(buf, off)) { case BT_QUOT: return scanLit(BT_QUOT, buf, off + minBPC, end, token); case BT_APOS: return scanLit(BT_APOS, buf, off + minBPC, end, token); case BT_LT: { off += minBPC; if (off == end) throw new PartialTokenException(); switch (byteType(buf, off)) { case BT_EXCL: return scanDecl(buf, off + minBPC, end, token); case BT_QUEST: return scanPi(buf, off + minBPC, end, token); case BT_NMSTRT: case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: token.TokenEnd = off - minBPC; throw new EndOfPrologException(); } throw new InvalidTokenException(off); } case BT_CR: if (off + minBPC == end) throw new ExtensibleTokenException(TOK.PROLOG_S); /* fall through */ goto case BT_S; case BT_S: case BT_LF: for (;;) { off += minBPC; if (off == end) break; switch (byteType(buf, off)) { case BT_S: case BT_LF: break; case BT_CR: /* don't split CR/LF pair */ if (off + minBPC != end) break; /* fall through */ goto default; default: token.TokenEnd = off; return TOK.PROLOG_S; } } token.TokenEnd = off; return TOK.PROLOG_S; case BT_PERCNT: return scanPercent(buf, off + minBPC, end, token); case BT_COMMA: token.TokenEnd = off + minBPC; return TOK.COMMA; case BT_LSQB: token.TokenEnd = off + minBPC; return TOK.OPEN_BRACKET; case BT_RSQB: off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.CLOSE_BRACKET); if (charMatches(buf, off, ']')) { if (off + minBPC == end) throw new PartialTokenException(); if (charMatches(buf, off + minBPC, '>')) { token.TokenEnd = off + 2*minBPC; return TOK.COND_SECT_CLOSE; } } token.TokenEnd = off; return TOK.CLOSE_BRACKET; case BT_LPAR: token.TokenEnd = off + minBPC; return TOK.OPEN_PAREN; case BT_RPAR: off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.CLOSE_PAREN); switch (byteType(buf, off)) { case BT_AST: token.TokenEnd = off + minBPC; return TOK.CLOSE_PAREN_ASTERISK; case BT_QUEST: token.TokenEnd = off + minBPC; return TOK.CLOSE_PAREN_QUESTION; case BT_PLUS: token.TokenEnd = off + minBPC; return TOK.CLOSE_PAREN_PLUS; case BT_CR: case BT_LF: case BT_S: case BT_GT: case BT_COMMA: case BT_VERBAR: case BT_RPAR: token.TokenEnd = off; return TOK.CLOSE_PAREN; } throw new InvalidTokenException(off); case BT_VERBAR: token.TokenEnd = off + minBPC; return TOK.OR; case BT_GT: token.TokenEnd = off + minBPC; return TOK.DECL_CLOSE; case BT_NUM: return scanPoundName(buf, off + minBPC, end, token); case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); switch (byteType2(buf, off)) { case BT_NMSTRT: off += 2; tok = TOK.NAME; break; case BT_NAME: off += 2; tok = TOK.NMTOKEN; break; default: throw new InvalidTokenException(off); } break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); switch (byteType3(buf, off)) { case BT_NMSTRT: off += 3; tok = TOK.NAME; break; case BT_NAME: off += 3; tok = TOK.NMTOKEN; break; default: throw new InvalidTokenException(off); } break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); switch (byteType4(buf, off)) { case BT_NMSTRT: off += 4; tok = TOK.NAME; break; case BT_NAME: off += 4; tok = TOK.NMTOKEN; break; default: throw new InvalidTokenException(off); } break; case BT_NMSTRT: tok = TOK.NAME; off += minBPC; break; case BT_NAME: case BT_MINUS: tok = TOK.NMTOKEN; off += minBPC; break; default: throw new InvalidTokenException(off); } while (off != end) { switch (byteType(buf, off)) { case BT_NMSTRT: case BT_NAME: case BT_MINUS: off += minBPC; break; case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); if (!isNameChar2(buf, off)) throw new InvalidTokenException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); if (!isNameChar3(buf, off)) throw new InvalidTokenException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); if (!isNameChar4(buf, off)) throw new InvalidTokenException(off); off += 4; break; case BT_GT: case BT_RPAR: case BT_COMMA: case BT_VERBAR: case BT_LSQB: case BT_PERCNT: case BT_S: case BT_CR: case BT_LF: token.TokenEnd = off; return tok; case BT_PLUS: if (tok != TOK.NAME) throw new InvalidTokenException(off); token.TokenEnd = off + minBPC; return TOK.NAME_PLUS; case BT_AST: if (tok != TOK.NAME) throw new InvalidTokenException(off); token.TokenEnd = off + minBPC; return TOK.NAME_ASTERISK; case BT_QUEST: if (tok != TOK.NAME) throw new InvalidTokenException(off); token.TokenEnd = off + minBPC; return TOK.NAME_QUESTION; default: throw new InvalidTokenException(off); } } throw new ExtensibleTokenException(tok); } /** * Scans the first token of a byte subarrary that contains part of * literal attribute value. The opening and closing delimiters * are not included in the subarrary. * Returns one of the following integers according to the type of * token that the subarray starts with: *
      *
    • TOK.DATA_CHARS
    • *
    • TOK.DATA_NEWLINE
    • *
    • TOK.ATTRIBUTE_VALUE_S
    • *
    • TOK.MAGIC_ENTITY_REF
    • *
    • TOK.ENTITY_REF
    • *
    • TOK.CHAR_REF
    • *
    • TOK.CHAR_PAIR_REF
    • *
    * @exception EmptyTokenException if the subarray is empty * @exception PartialTokenException if the subarray contains only part of * a legal token * @exception InvalidTokenException if the subarrary does not start * with a legal token or part of one * @exception ExtensibleTokenException if the subarray encodes just a carriage * return ('\r') * @see #TOK.DATA_CHARS * @see #TOK.DATA_NEWLINE * @see #TOK.ATTRIBUTE_VALUE_S * @see #TOK.MAGIC_ENTITY_REF * @see #TOK.ENTITY_REF * @see #TOK.CHAR_REF * @see #TOK.CHAR_PAIR_REF * @see Token * @see EmptyTokenException * @see PartialTokenException * @see InvalidTokenException * @see ExtensibleTokenException */ public TOK tokenizeAttributeValue(byte[] buf, int off, int end, Token token) { if (minBPC > 1) end = adjustEnd(off, end); if (off == end) throw new EmptyTokenException(); int start = off; while (off != end) { switch (byteType(buf, off)) { case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); off += 4; break; case BT_AMP: if (off == start) return scanRef(buf, off + minBPC, end, token); token.TokenEnd = off; return TOK.DATA_CHARS; case BT_LT: /* this is for inside entity references */ throw new InvalidTokenException(off); case BT_S: if (off == start) { token.TokenEnd = off + minBPC; return TOK.ATTRIBUTE_VALUE_S; } token.TokenEnd = off; return TOK.DATA_CHARS; case BT_LF: if (off == start) { token.TokenEnd = off + minBPC; return TOK.DATA_NEWLINE; } token.TokenEnd = off; return TOK.DATA_CHARS; case BT_CR: if (off == start) { off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.DATA_NEWLINE); if (byteType(buf, off) == BT_LF) off += minBPC; token.TokenEnd = off; return TOK.DATA_NEWLINE; } token.TokenEnd = off; return TOK.DATA_CHARS; default: off += minBPC; break; } } token.TokenEnd = off; return TOK.DATA_CHARS; } /** * Scans the first token of a byte subarrary that contains part of * literal entity value. The opening and closing delimiters * are not included in the subarrary. * Returns one of the following integers according to the type of * token that the subarray starts with: *
      *
    • TOK.DATA_CHARS
    • *
    • TOK.DATA_NEWLINE
    • *
    • TOK.PARAM_ENTITY_REF
    • *
    • TOK.MAGIC_ENTITY_REF
    • *
    • TOK.ENTITY_REF
    • *
    • TOK.CHAR_REF
    • *
    • TOK.CHAR_PAIR_REF
    • *
    * @exception EmptyTokenException if the subarray is empty * @exception PartialTokenException if the subarray contains only part of * a legal token * @exception InvalidTokenException if the subarrary does not start * with a legal token or part of one * @exception ExtensibleTokenException if the subarray encodes just a carriage * return ('\r') * @see #TOK.DATA_CHARS * @see #TOK.DATA_NEWLINE * @see #TOK.MAGIC_ENTITY_REF * @see #TOK.ENTITY_REF * @see #TOK.PARAM_ENTITY_REF * @see #TOK.CHAR_REF * @see #TOK.CHAR_PAIR_REF * @see Token * @see EmptyTokenException * @see PartialTokenException * @see InvalidTokenException * @see ExtensibleTokenException */ public TOK tokenizeEntityValue(byte[] buf, int off, int end, Token token) { if (minBPC > 1) end = adjustEnd(off, end); if (off == end) throw new EmptyTokenException(); int start = off; while (off != end) { switch (byteType(buf, off)) { case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); off += 4; break; case BT_AMP: if (off == start) return scanRef(buf, off + minBPC, end, token); token.TokenEnd = off; return TOK.DATA_CHARS; case BT_PERCNT: if (off == start) return scanPercent(buf, off + minBPC, end, token); token.TokenEnd = off; return TOK.DATA_CHARS; case BT_LF: if (off == start) { token.TokenEnd = off + minBPC; return TOK.DATA_NEWLINE; } token.TokenEnd = off; return TOK.DATA_CHARS; case BT_CR: if (off == start) { off += minBPC; if (off == end) throw new ExtensibleTokenException(TOK.DATA_NEWLINE); if (byteType(buf, off) == BT_LF) off += minBPC; token.TokenEnd = off; return TOK.DATA_NEWLINE; } token.TokenEnd = off; return TOK.DATA_CHARS; default: off += minBPC; break; } } token.TokenEnd = off; return TOK.DATA_CHARS; } /** * Skips over an ignored conditional section. * The subarray starts following the <![ IGNORE [. * * @return the index of the character following the closing * ]]> * * @exception PartialTokenException if the subarray does not contain the * complete ignored conditional section * @exception InvalidTokenException if the ignored conditional section * contains illegal characters */ public int skipIgnoreSect(byte[] buf, int off, int end) { if (minBPC > 1) end = adjustEnd(off, end); int level = 0; while (off != end) { switch (byteType(buf, off)) { case BT_LEAD2: if (end - off < 2) throw new PartialCharException(off); check2(buf, off); off += 2; break; case BT_LEAD3: if (end - off < 3) throw new PartialCharException(off); check3(buf, off); off += 3; break; case BT_LEAD4: if (end - off < 4) throw new PartialCharException(off); check4(buf, off); off += 4; break; case BT_NONXML: case BT_MALFORM: throw new InvalidTokenException(off); case BT_LT: off += minBPC; if (off == end) goto loop; if (!charMatches(buf, off, '!')) break; off += minBPC; if (off == end) goto loop; if (!charMatches(buf, off, '[')) break; level++; off += minBPC; break; case BT_RSQB: off += minBPC; if (off == end) goto loop; if (!charMatches(buf, off, ']')) break; off += minBPC; if (off == end) goto loop; if (charMatches(buf, off, '>')) { if (level == 0) return off + minBPC; level--; } else if (charMatches(buf, off, ']')) break; off += minBPC; break; default: off += minBPC; break; } } loop: throw new PartialTokenException(); } /** * Checks that a literal contained in the specified byte subarray * is a legal public identifier and returns a string with * the normalized content of the public id. * The subarray includes the opening and closing quotes. * @exception InvalidTokenException if it is not a legal public identifier */ public string getPublicId(byte[] buf, int off, int end) { System.Text.StringBuilder sbuf = new System.Text.StringBuilder(); off += minBPC; end -= minBPC; for (; off != end; off += minBPC) { char c = (char)byteToAscii(buf, off); switch (byteType(buf, off)) { case BT_MINUS: case BT_APOS: case BT_LPAR: case BT_RPAR: case BT_PLUS: case BT_COMMA: case BT_SOL: case BT_EQUALS: case BT_QUEST: case BT_SEMI: case BT_EXCL: case BT_AST: case BT_PERCNT: case BT_NUM: sbuf.Append(c); break; case BT_S: if (charMatches(buf, off, '\t')) throw new InvalidTokenException(off); /* fall through */ goto case BT_CR; case BT_CR: case BT_LF: if ((sbuf.Length > 0) && (sbuf[sbuf.Length - 1] != ' ')) sbuf.Append(' '); break; case BT_NAME: case BT_NMSTRT: if ((c & ~0x7f) == 0) { sbuf.Append(c); break; } // fall through goto default; default: switch (c) { case '$': case '@': break; default: throw new InvalidTokenException(off); } break; } } if (sbuf.Length > 0 && sbuf[sbuf.Length - 1] == ' ') sbuf.Length = sbuf.Length - 1; return sbuf.ToString(); } /** * Returns true if the specified byte subarray is equal to the string. * The string must contain only XML significant characters. */ public bool matchesXMLstring(byte[] buf, int off, int end, string str) { int len = str.Length; if (len*minBPC != end - off) return false; for (int i = 0; i < len; off += minBPC, i++) { if (!charMatches(buf, off, str[i])) return false; } return true; } /** * Skips over XML whitespace characters at the start of the specified * subarray. * * @return the index of the first non-whitespace character, * end if there is the subarray is all whitespace */ public int skipS(byte[] buf, int off, int end) { while (off < end) { switch (byteType(buf, off)) { case BT_S: case BT_CR: case BT_LF: off += minBPC; break; default: goto loop; } } loop: return off; } private bool isNameChar2(byte[] buf, int off) { int bt = byteType2(buf, off); return bt == BT_NAME || bt == BT_NMSTRT; } private bool isNameChar3(byte[] buf, int off) { int bt = byteType3(buf, off); return bt == BT_NAME || bt == BT_NMSTRT; } private bool isNameChar4(byte[] buf, int off) { int bt = byteType4(buf, off); return bt == BT_NAME || bt == BT_NMSTRT; } private const string nameStartSingles = "\u003a\u005f\u0386\u038c\u03da\u03dc\u03de\u03e0\u0559\u06d5\u093d\u09b2" + "\u0a5e\u0a8d\u0abd\u0ae0\u0b3d\u0b9c\u0cde\u0e30\u0e84\u0e8a\u0e8d\u0ea5" + "\u0ea7\u0eb0\u0ebd\u1100\u1109\u113c\u113e\u1140\u114c\u114e\u1150\u1159" + "\u1163\u1165\u1167\u1169\u1175\u119e\u11a8\u11ab\u11ba\u11eb\u11f0\u11f9" + "\u1f59\u1f5b\u1f5d\u1fbe\u2126\u212e\u3007"; private const string nameStartRanges = "\u0041\u005a\u0061\u007a\u00c0\u00d6\u00d8\u00f6\u00f8\u00ff\u0100\u0131" + "\u0134\u013e\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0\u01f4\u01f5" + "\u01fa\u0217\u0250\u02a8\u02bb\u02c1\u0388\u038a\u038e\u03a1\u03a3\u03ce" + "\u03d0\u03d6\u03e2\u03f3\u0401\u040c\u040e\u044f\u0451\u045c\u045e\u0481" + "\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5\u04f8\u04f9" + "\u0531\u0556\u0561\u0586\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0641\u064a" + "\u0671\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3\u06e5\u06e6\u0905\u0939" + "\u0958\u0961\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b6\u09b9" + "\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28" + "\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a72\u0a74" + "\u0a85\u0a8b\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9" + "\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39" + "\u0b5c\u0b5d\u0b5f\u0b61\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a" + "\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9\u0c05\u0c0c" + "\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39\u0c60\u0c61\u0c85\u0c8c" + "\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0ce0\u0ce1\u0d05\u0d0c" + "\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39\u0d60\u0d61\u0e01\u0e2e\u0e32\u0e33" + "\u0e40\u0e45\u0e81\u0e82\u0e87\u0e88\u0e94\u0e97\u0e99\u0e9f\u0ea1\u0ea3" + "\u0eaa\u0eab\u0ead\u0eae\u0eb2\u0eb3\u0ec0\u0ec4\u0f40\u0f47\u0f49\u0f69" + "\u10a0\u10c5\u10d0\u10f6\u1102\u1103\u1105\u1107\u110b\u110c\u110e\u1112" + "\u1154\u1155\u115f\u1161\u116d\u116e\u1172\u1173\u11ae\u11af\u11b7\u11b8" + "\u11bc\u11c2\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45" + "\u1f48\u1f4d\u1f50\u1f57\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fc2\u1fc4" + "\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc" + "\u212a\u212b\u2180\u2182\u3041\u3094\u30a1\u30fa\u3105\u312c\uac00\ud7a3" + "\u4e00\u9fa5\u3021\u3029"; private const string nameSingles = "\u002d\u002e\u05bf\u05c4\u0670\u093c\u094d\u09bc\u09be\u09bf\u09d7\u0a02" + "\u0a3c\u0a3e\u0a3f\u0abc\u0b3c\u0bd7\u0d57\u0e31\u0eb1\u0f35\u0f37\u0f39" + "\u0f3e\u0f3f\u0f97\u0fb9\u20e1\u3099\u309a\u00b7\u02d0\u02d1\u0387\u0640" + "\u0e46\u0ec6\u3005"; private const string nameRanges = "\u0300\u0345\u0360\u0361\u0483\u0486\u0591\u05a1\u05a3\u05b9\u05bb\u05bd" + "\u05c1\u05c2\u064b\u0652\u06d6\u06dc\u06dd\u06df\u06e0\u06e4\u06e7\u06e8" + "\u06ea\u06ed\u0901\u0903\u093e\u094c\u0951\u0954\u0962\u0963\u0981\u0983" + "\u09c0\u09c4\u09c7\u09c8\u09cb\u09cd\u09e2\u09e3\u0a40\u0a42\u0a47\u0a48" + "\u0a4b\u0a4d\u0a70\u0a71\u0a81\u0a83\u0abe\u0ac5\u0ac7\u0ac9\u0acb\u0acd" + "\u0b01\u0b03\u0b3e\u0b43\u0b47\u0b48\u0b4b\u0b4d\u0b56\u0b57\u0b82\u0b83" + "\u0bbe\u0bc2\u0bc6\u0bc8\u0bca\u0bcd\u0c01\u0c03\u0c3e\u0c44\u0c46\u0c48" + "\u0c4a\u0c4d\u0c55\u0c56\u0c82\u0c83\u0cbe\u0cc4\u0cc6\u0cc8\u0cca\u0ccd" + "\u0cd5\u0cd6\u0d02\u0d03\u0d3e\u0d43\u0d46\u0d48\u0d4a\u0d4d\u0e34\u0e3a" + "\u0e47\u0e4e\u0eb4\u0eb9\u0ebb\u0ebc\u0ec8\u0ecd\u0f18\u0f19\u0f71\u0f84" + "\u0f86\u0f8b\u0f90\u0f95\u0f99\u0fad\u0fb1\u0fb7\u20d0\u20dc\u302a\u302f" + "\u0030\u0039\u0660\u0669\u06f0\u06f9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f" + "\u0ae6\u0aef\u0b66\u0b6f\u0be7\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f" + "\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29\u3031\u3035\u309d\u309e\u30fc\u30fe"; /// /// /// protected static int[][] charTypeTable; private static void setCharType(char c, int type) { if (c < 0x80) return; int hi = c >> 8; if (charTypeTable[hi] == null) { charTypeTable[hi] = new int[256]; for (int i = 0; i < 256; i++) charTypeTable[hi][i] = BT_OTHER; } charTypeTable[hi][c & 0xFF] = type; } private static void setCharType(char min, char max, int type) { int[] shared = null; do { if ((min & 0xFF) == 0) { for (; min + (char)0xFF <= max; min += (char)0x100) { if (shared == null) { shared = new int[256]; for (int i = 0; i < 256; i++) shared[i] = type; } charTypeTable[min >> 8] = shared; if (min + 0xFF == max) return; } } setCharType(min, type); } while (min++ != max); } static Encoding() { charTypeTable = new int[256][]; foreach (char c in nameSingles) setCharType(c, BT_NAME); for (int i = 0; i < nameRanges.Length; i += 2) setCharType(nameRanges[i], nameRanges[i + 1], BT_NAME); for (int i = 0; i < nameStartSingles.Length; i++) setCharType(nameStartSingles[i], BT_NMSTRT); for (int i = 0; i < nameStartRanges.Length; i += 2) setCharType(nameStartRanges[i], nameStartRanges[i + 1], BT_NMSTRT); setCharType('\uD800', '\uDBFF', BT_LEAD4); setCharType('\uDC00', '\uDFFF', BT_MALFORM); setCharType('\uFFFE', '\uFFFF', BT_NONXML); int[] other = new int[256]; for (int i = 0; i < 256; i++) other[i] = BT_OTHER; for (int i = 0; i < 256; i++) if (charTypeTable[i] == null) charTypeTable[i] = other; System.Array.Copy(asciiTypeTable, 0, charTypeTable[0], 0, 128); } /** * Returns the minimum number of bytes required to represent a single * character in this encoding. The value will be 1, 2 or 4. */ public int MinBytesPerChar { get { return minBPC; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/Position.cs0000644000175000017500000000447412204443225023222 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * xpnet is a deriviative of James Clark's XP parser. * See copying.txt for more info. */ namespace agsXMPP.Xml.Xpnet { /** * Represents a position in an entity. * A position can be modified by Encoding.movePosition. * @see Encoding#movePosition * @version $Revision: 1.2 $ $Date: 1998/02/17 04:24:15 $ */ public class Position : System.ICloneable { private int lineNumber; private int columnNumber; /** * Creates a position for the start of an entity: the line number is * 1 and the column number is 0. */ public Position() { lineNumber = 1; columnNumber = 0; } /** * Returns the line number. * The first line number is 1. */ public int LineNumber { get {return lineNumber;} set {lineNumber = value;} } /** * Returns the column number. * The first column number is 0. * A tab character is not treated specially. */ public int ColumnNumber { get { return columnNumber; } set { columnNumber = value; } } /** * Returns a copy of this position. */ public object Clone() { #if CF throw new util.NotImplementedException(); #else throw new System.NotImplementedException(); #endif } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Xpnet/NS.cs0000644000175000017500000001044412204443225021730 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2010 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* -------------------------------------------------------------------------- * Copyrights * * Portions created by or assigned to Cursive Systems, Inc. are * Copyright (c) 2002-2005 Cursive Systems, Inc. All Rights Reserved. Contact * information for Cursive Systems, Inc. is available at * http://www.cursive.net/. * * License * * Jabber-Net can be used under either JOSL or the GPL. * See LICENSE.txt for details. * --------------------------------------------------------------------------*/ using System.Collections; namespace agsXMPP.Xml.xpnet { /// /// Namespace stack. /// public class NS { private Stack m_stack = new Stack(); /// /// Create a new stack, primed with xmlns and xml as prefixes. /// public NS() { PushScope(); AddNamespace("xmlns", "http://www.w3.org/2000/xmlns/"); AddNamespace("xml", "http://www.w3.org/XML/1998/namespace"); } /// /// Declare a new scope, typically at the start of each element /// public void PushScope() { m_stack.Push(new Hashtable()); } /// /// Pop the current scope off the stack. Typically at the end of each element. /// public void PopScope() { m_stack.Pop(); } /// /// Add a namespace to the current scope. /// /// /// public void AddNamespace(string prefix, string uri) { ((Hashtable)m_stack.Peek()).Add(prefix, uri); } /// /// Lookup a prefix to find a namespace. Searches down the stack, starting at the current scope. /// /// /// public string LookupNamespace(string prefix) { foreach (Hashtable ht in m_stack) { if ((ht.Count > 0) && (ht.ContainsKey(prefix))) return (string)ht[prefix]; } return ""; } /// /// The current default namespace. /// public string DefaultNamespace { get { return LookupNamespace(string.Empty); } } /// /// Debug output only. /// /// public override string ToString() { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (Hashtable ht in m_stack) { sb.Append("---\n"); foreach (string k in ht.Keys) { sb.Append(string.Format("{0}={1}\n", k, ht[k])); } } return sb.ToString(); } public void Clear() { #if !CF m_stack.Clear(); #else while (m_stack.Count > 0) m_stack.Pop(); #endif } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/StreamParser.cs0000644000175000017500000004134312250206660022725 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.IO; using System.Threading; using System.Collections; using agsXMPP.Xml; using agsXMPP.Xml.Dom; using agsXMPP.Factory; using agsXMPP.Xml.Xpnet; using agsXMPP.protocol.client; namespace agsXMPP.Xml { public delegate void StreamError (object sender, Exception ex); public delegate void StreamHandler (object sender, Node e); /// /// Stream Parser is a lighweight Streaming XML Parser. /// public class StreamParser { // Stream Event Handlers public event StreamHandler OnStreamStart; public event StreamHandler OnStreamEnd; public event EventHandler OnStreamElement; public event EventHandler StreamElementNotHandled; /// /// Event for XML-Stream errors /// public event StreamError OnStreamError; /// /// Event for general errors /// public event ErrorHandler OnError; private int m_Depth; private Node m_root; private Element current; private static System.Text.Encoding utf = System.Text.Encoding.UTF8; private Encoding m_enc = new UTF8Encoding(); private BufferAggregate m_buf = new BufferAggregate(); private NamespaceStack m_NamespaceStack = new NamespaceStack(); private bool m_cdata; public StreamParser() { } /// /// Reset the XML Stream /// public void Reset() { m_Depth = 0; m_root = null; current = null; m_cdata = false; m_buf = null; m_buf = new BufferAggregate(); //m_buf.Clear(0); m_NamespaceStack.Clear(); } /// /// Reset the XML Stream /// /// new Stream that is used for parsing public long Depth { get { return m_Depth; } } private Object thisLock = new Object(); /// /// Put bytes into the parser. /// /// The bytes to put into the parse stream /// Offset into buf to start at /// Number of bytes to write public void Push(byte[] buf, int offset, int length) { // or assert, really, but this is a little nicer. if (length == 0) return; // No locking is required. Read() won't get called again // until this method returns. // TODO: only do this copy if we have a partial token at the // end of parsing. byte[] copy = new byte[length]; System.Buffer.BlockCopy(buf, offset, copy, 0, length); m_buf.Write(copy); byte[] b = m_buf.GetBuffer(); int off = 0; TOK tok = TOK.END_TAG; ContentToken ct = new ContentToken(); try { while (off < b.Length) { if (m_cdata) tok = m_enc.tokenizeCdataSection(b, off, b.Length, ct); else tok = m_enc.tokenizeContent(b, off, b.Length, ct); switch (tok) { case TOK.EMPTY_ELEMENT_NO_ATTS: case TOK.EMPTY_ELEMENT_WITH_ATTS: StartTag(b, off, ct, tok); EndTag(b, off, ct, tok); break; case TOK.START_TAG_NO_ATTS: case TOK.START_TAG_WITH_ATTS: StartTag(b, off, ct, tok); break; case TOK.END_TAG: EndTag(b, off, ct, tok); break; case TOK.DATA_CHARS: case TOK.DATA_NEWLINE: AddText(utf.GetString(b, off, ct.TokenEnd - off)); break; case TOK.CHAR_REF: case TOK.MAGIC_ENTITY_REF: AddText(new string(new char[] { ct.RefChar1 })); break; case TOK.CHAR_PAIR_REF: AddText(new string(new char[] {ct.RefChar1, ct.RefChar2})); break; case TOK.COMMENT: if (current != null) { // 3 int start = off + 4 * m_enc.MinBytesPerChar; int end = ct.TokenEnd - off - 7 * m_enc.MinBytesPerChar; string text = utf.GetString(b, start, end); current.AddChild(new Comment(text)); } break; case TOK.CDATA_SECT_OPEN: m_cdata = true; break; case TOK.CDATA_SECT_CLOSE: m_cdata = false; break; case TOK.XML_DECL: // thou shalt use UTF8, and XML version 1. // i shall ignore evidence to the contrary... // TODO: Throw an exception if these assuptions are // wrong break; case TOK.ENTITY_REF: case TOK.PI: #if CF throw new util.NotImplementedException("Token type not implemented: " + tok); #else throw new System.NotImplementedException("Token type not implemented: " + tok); #endif } off = ct.TokenEnd; } } catch (PartialTokenException) { // ignored; } catch (ExtensibleTokenException) { // ignored; } catch (Exception ex) { if (OnStreamError != null) OnStreamError(this, ex); } finally { m_buf.Clear(off); } } private void StartTag(byte[] buf, int offset, ContentToken ct, TOK tok) { m_Depth++; int colon; string name; string prefix; Hashtable ht = new Hashtable(); m_NamespaceStack.Push(); // if i have attributes if ((tok == TOK.START_TAG_WITH_ATTS) || (tok == TOK.EMPTY_ELEMENT_WITH_ATTS)) { int start; int end; string val; for (int i=0; i // 0) { prefix = name.Substring(0, colon); name = name.Substring(colon + 1); ns = m_NamespaceStack.LookupNamespace(prefix); } else { ns = m_NamespaceStack.DefaultNamespace; } Element newel = ElementFactory.GetElement(prefix, name, ns); foreach (string attrname in ht.Keys) { newel.SetAttribute(attrname, (string)ht[attrname]); } if (m_root == null) { m_root = newel; //FireOnDocumentStart(m_root); if (OnStreamStart!=null) OnStreamStart(this, m_root); } else { if (current != null) current.AddChild(newel); current = newel; } } private void EndTag(byte[] buf, int offset, ContentToken ct, TOK tok) { m_Depth--; m_NamespaceStack.Pop(); if (current == null) {// end of doc if (OnStreamEnd!=null) OnStreamEnd(this, m_root); // FireOnDocumentEnd(); return; } string name = null; if ((tok == TOK.EMPTY_ELEMENT_WITH_ATTS) || (tok == TOK.EMPTY_ELEMENT_NO_ATTS)) name = utf.GetString(buf, offset + m_enc.MinBytesPerChar, ct.NameEnd - offset - m_enc.MinBytesPerChar); else name = utf.GetString(buf, offset + m_enc.MinBytesPerChar*2, ct.NameEnd - offset - m_enc.MinBytesPerChar*2); // if (current.Name != name) // throw new Exception("Invalid end tag: " + name + // " != " + current.Name); Element parent = (Element) current.Parent; if (parent == null) { DoRaiseOnStreamElement(current); //if (OnStreamElement!=null) // OnStreamElement(this, current); //FireOnElement(current); } current = parent; } /// /// If users didnt use the library correctly and had no local error handles /// it always crashed here and disconencted the socket. /// Catch this errors here now and foreward them. /// /// internal void DoRaiseOnStreamElement(Element el) { try { if (OnStreamElement != null) { var eventArgs = new ElementEventArgs(el); OnStreamElement(this, eventArgs); if (!eventArgs.Handled) { OnStreamElementNotHandled(el); } } } catch (Exception ex) { if (OnError != null) OnError(this, ex); } } void OnStreamElementNotHandled(Element el) { if (StreamElementNotHandled != null) { StreamElementNotHandled(this, new UnhandledElementEventArgs(el)); } } private string NormalizeAttributeValue(byte[] buf, int offset, int length) { if (length == 0) return null; string val = null; BufferAggregate buffer = new BufferAggregate(); byte[] copy = new byte[length]; System.Buffer.BlockCopy(buf, offset, copy, 0, length); buffer.Write(copy); byte[] b = buffer.GetBuffer(); int off = 0; TOK tok = TOK.END_TAG; ContentToken ct = new ContentToken(); try { while (off < b.Length) { //tok = m_enc.tokenizeContent(b, off, b.Length, ct); tok = m_enc.tokenizeAttributeValue(b, off, b.Length, ct); switch (tok) { case TOK.ATTRIBUTE_VALUE_S: case TOK.DATA_CHARS: case TOK.DATA_NEWLINE: val += (utf.GetString(b, off, ct.TokenEnd - off)); break; case TOK.CHAR_REF: case TOK.MAGIC_ENTITY_REF: val += new string(new char[] { ct.RefChar1 }); break; case TOK.CHAR_PAIR_REF: val += new string(new char[] {ct.RefChar1, ct.RefChar2}); break; case TOK.ENTITY_REF: #if CF throw new util.NotImplementedException("Token type not implemented: " + tok); #else throw new System.NotImplementedException("Token type not implemented: " + tok); #endif } off = ct.TokenEnd; } } catch (PartialTokenException) { // ignored; } catch (ExtensibleTokenException) { // ignored; } catch (Exception ex) { if (OnStreamError != null) OnStreamError(this, ex); } finally { buffer.Clear(off); } return val; } private void AddText(string text) { if (text == "") return; //Console.WriteLine("AddText:" + text); //Console.WriteLine(lastTOK); if (current != null) { if (m_cdata) { Node last = current.LastNode; if (last != null && last.NodeType == NodeType.Cdata) last.Value = last.Value + text; else current.AddChild(new CData(text)); } else { Node last = current.LastNode; if (last != null && last.NodeType == NodeType.Text) last.Value = last.Value + text; else current.AddChild(new Text(text)); } } else { // text in root element Node last = ((Element)m_root).LastNode; if (m_cdata) { if (last != null && last.NodeType == NodeType.Cdata) last.Value = last.Value + text; else m_root.AddChild(new CData(text)); } else { if (last != null && last.NodeType == NodeType.Text) last.Value = last.Value + text; else m_root.AddChild(new Text(text)); } } } } public class UnhandledElementEventArgs : EventArgs { public Element Element { get; private set; } public UnhandledElementEventArgs(Element el) { if (el == null) { throw new ArgumentNullException("el"); } Element = el; } } public class ElementEventArgs : EventArgs { public Element Element { get; private set; } public bool Handled { get; set; } public ElementEventArgs(Element el) { if (el == null) { throw new ArgumentNullException("el"); } Element = el; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/0000755000175000017500000000000012250206660020500 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/Node.cs0000644000175000017500000001511312204443225021714 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.IO; using System.Xml; using System.Text; using agsXMPP.IO; namespace agsXMPP.Xml.Dom { public enum NodeType { Document, // xmlDocument Element, // normal Element Text, // Textnode Cdata, // CDATA Section Comment, // comment Declaration // processing instruction } /// /// /// public abstract class Node { internal Node Parent; private NodeType m_NodeType; private string m_Value; private string m_Namespace; internal int m_Index; private readonly NodeList m_ChildNodes; protected Node() { m_ChildNodes = new NodeList(this); } public NodeType NodeType { get { return m_NodeType; } set { m_NodeType = value; } } public virtual string Value { get { return m_Value; } set { m_Value = value; } } public string Namespace { get { return m_Namespace; } set { m_Namespace = value; } } public int Index { get { return m_Index; } } public NodeList ChildNodes { get { return this.m_ChildNodes; } } public void Remove() { if ( Parent!=null ) { int idx = m_Index; Parent.ChildNodes.RemoveAt(idx); Parent.ChildNodes.RebuildIndex(idx); } } public void RemoveAllChildNodes() { m_ChildNodes.Clear(); } /// /// Appends the given Element as child element /// /// public virtual void AddChild(Node e) { m_ChildNodes.Add(e); } /// /// Returns the Xml of the current Element (Node) as string /// public override string ToString() { return BuildXml(this, Formatting.None, 0, ' '); } public string ToString(Encoding enc) { using (var tw = new StringWriterWithEncoding(enc)) { //System.IO.StringWriter tw = new StringWriter(); using (var w = new XmlTextWriter(tw)) { // Format the Output. So its human readable in notepad // Without that everyting is in one line w.Formatting = Formatting.Indented; w.Indentation = 3; WriteTree(this, w, null); return tw.ToString(); } } } /// /// returns the Xml, difference to the Xml property is that you can set formatting porperties /// /// /// public string ToString(Formatting format) { return BuildXml(this, format, 3, ' '); } /// /// returns the Xml, difference to the Xml property is that you can set formatting properties /// /// /// /// public string ToString(Formatting format, int indent) { return BuildXml(this, format, indent, ' '); } #region << Xml Serializer Functions >> private string BuildXml(Node e, Formatting format, int indent, char indentchar) { if ( e != null ) { using(var tw = new StringWriter()) { using(var w = new XmlTextWriter(tw)) { w.Formatting = format; w.Indentation = indent; w.IndentChar = indentchar; WriteTree(this, w, null); return tw.ToString(); } } } return ""; } private void WriteTree(Node e, XmlTextWriter tw, Node parent) { if (e.NodeType == NodeType.Document) { //Write the ProcessingInstruction node. // ... Document doc = e as Document; string pi = null; if (doc.Version != null) pi += "version='" + doc.Version + "'"; if (doc.Encoding != null) { if (pi != null) pi += " "; pi += "encoding='" + doc.Encoding + "'"; } if (pi != null) tw.WriteProcessingInstruction("xml", pi); foreach(Node n in e.ChildNodes) { WriteTree(n, tw, e); } } else if (e.NodeType == NodeType.Text) { tw.WriteString(e.Value); } else if (e.NodeType == NodeType.Comment) { tw.WriteComment(e.Value); } else if (e.NodeType == NodeType.Cdata) { tw.WriteCData(e.Value); } else if (e.NodeType == NodeType.Element) { Element el = e as Element; if (el.Prefix==null) tw.WriteStartElement( el.TagName ); else tw.WriteStartElement( el.Prefix + ":" + el.TagName ); // Write Namespace if ( (parent == null || parent.Namespace != el.Namespace) && el.Namespace != null && el.Namespace.Length !=0 ) { if (el.Prefix==null) tw.WriteAttributeString("xmlns", el.Namespace); else tw.WriteAttributeString("xmlns:" + el.Prefix , el.Namespace); } foreach (string attName in el.Attributes.Keys) { tw.WriteAttributeString(attName, el.Attribute(attName)); } //tw.WriteString(el.Value); if (el.ChildNodes.Count > 0) { foreach(Node n in el.ChildNodes) { WriteTree(n, tw, e); } tw.WriteEndElement(); } else { tw.WriteEndElement(); } } } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/Comment.cs0000644000175000017500000000253412204443225022434 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.Xml.Dom { /// /// Summary description for Comment. /// public class Comment : Node { public Comment() { NodeType = NodeType.Comment; } public Comment(string text) : this() { Value = text; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/CData.cs0000644000175000017500000000260512204443225022005 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2011 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.Xml.Dom { /// /// /// public class CData : Node { public CData() { NodeType = NodeType.Cdata; } public CData(string data) : this() { Value = data; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/NodeList.cs0000644000175000017500000000612412204443225022552 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; namespace agsXMPP.Xml.Dom { /// /// /// public class NodeList : CollectionBase { /// /// Owner (Parent) of the ChildElement Collection /// private Node m_Owner = null; public NodeList() { } public NodeList(Node owner) { m_Owner = owner; } public void Add(Node e) { // can't add a empty node, so return immediately // Some people tried this which caused an error if (e == null) return; if (m_Owner != null) { e.Parent = m_Owner; if (e.Namespace == null) e.Namespace = m_Owner.Namespace; } e.m_Index = Count; List.Add(e); } // Method implementation from the CollectionBase class public void Remove(int index) { if (index > Count - 1 || index < 0) { // Handle the error that occurs if the valid page index is // not supplied. // This exception will be written to the calling function throw new Exception("Index out of bounds"); } List.RemoveAt(index); RebuildIndex(index); } public void Remove(Element e) { int idx = e.Index; List.Remove(e); RebuildIndex(idx); } public Node Item(int index) { return (Node) this.List[index]; } public object[] ToArray() { object[] ar = new object[this.List.Count]; for (int i = 0; i < this.List.Count; i++) { ar[i] = this.List[i]; } return ar; } internal void RebuildIndex() { RebuildIndex(0); } internal void RebuildIndex(int start) { for (int i = start; i < Count; i++) { Node node = (Node) List[i]; node.m_Index = i; } } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/Element.cs0000644000175000017500000010212612204443225022421 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.Text; using System.IO; using System.Xml; namespace agsXMPP.Xml.Dom { public class Element : Node { // Member Variables private string m_TagName; private string m_Prefix; private ListDictionary m_Attributes; private Text m_Value = new Text(); public Element() { NodeType = NodeType.Element; AddChild(m_Value); m_Attributes = new ListDictionary(); m_TagName = ""; Value = ""; } public Element(string tagName) :this() { m_TagName = tagName; } public Element(string tagName, string tagText) : this(tagName) { Value = tagText; } public Element(string tagName, bool tagText) : this(tagName, tagText ? "true" : "false") { } public Element(string tagName, string tagText, string ns) : this(tagName, tagText) { Namespace = ns; } /// /// Is this Element a Rootnode? /// public bool IsRootElement { get { return (Parent != null ? false : true); } } public override string Value { get { return m_Value.Value; } set { m_Value.Value = value; } } public string Prefix { get { return m_Prefix; } set { m_Prefix = value; } } /// /// The Full Qualified Name /// public string TagName { get { return m_TagName; } set { m_TagName = value; } } public string TextBase64 { get { byte[] b = Convert.FromBase64String(Value); return Encoding.ASCII.GetString(b, 0, b.Length); } set { byte[] b = Encoding.UTF8.GetBytes(value); //byte[] b = Encoding.Default.GetBytes(value); Value = Convert.ToBase64String(b, 0, b.Length); } } public ListDictionary Attributes { get { return m_Attributes; } } public object GetAttributeEnum(string name, Type enumType) { string att = GetAttribute(name); if ((att == null)) return -1; try { #if CF return util.Enum.Parse(enumType, att, true); #else return Enum.Parse(enumType, att, true); #endif } catch (Exception) { return -1; } } public string GetAttribute(string name) { if (HasAttribute(name)) return (string) m_Attributes[name]; return null; } public int GetAttributeInt(string name) { if (HasAttribute(name)) { return int.Parse((string) m_Attributes[name]); } return 0; } public long GetAttributeLong(string name) { if (HasAttribute(name)) { return long.Parse((string) m_Attributes[name]); } return 0; } /// /// Reads a boolean Attribute, if the attrib is absent it returns also false. /// /// /// public bool GetAttributeBool(string name) { if (HasAttribute(name)) { string tmp = (string) m_Attributes[name]; if (tmp.ToLower() == "true") return true; return false; } return false; } public Jid GetAttributeJid(string name) { if (HasAttribute(name)) return new Jid(this.GetAttribute(name)); return null; } /// /// /// /// /// /// public double GetAttributeDouble(string name, IFormatProvider ifp) { if (HasAttribute(name)) { try { return double.Parse((string)m_Attributes[name], ifp); } catch { return double.NaN; } } return double.NaN; } /// /// Get a Attribute of type double (Decimal seperator = ".") /// /// /// public double GetAttributeDouble(string name) { // Parse the double always in english format ==> "." = Decimal seperator NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberGroupSeparator = "."; return GetAttributeDouble(name, nfi); } public bool HasAttribute(string name) { return Attributes.Contains(name); } /// /// Return the Text of the first Tag with a specified Name. /// It doesnt traverse the while tree and checks only the unerlying childnodes /// /// Name of Tag to find as string /// public string GetTag(string TagName) { Element tag = this._SelectElement(this, TagName); if ( tag != null) return tag.Value; return null; } public string GetTag(string TagName, bool traverseChildren) { Element tag = this._SelectElement(this, TagName, traverseChildren); if ( tag != null) return tag.Value; return null; } public string GetTag(System.Type type) { Element tag = this._SelectElement(this, type); if ( tag != null) return tag.Value; return null; } public string GetTagBase64(string TagName) { byte[] b = Convert.FromBase64String(GetTag(TagName)); return Encoding.ASCII.GetString(b, 0, b.Length); } /// /// Adds a Tag and encodes the Data to BASE64 /// /// /// public void SetTagBase64(string argTagname, string argText) { byte[] b = Encoding.Unicode.GetBytes(argText); SetTag(argTagname, Convert.ToBase64String(b, 0, b.Length)); } /// /// Adds a Tag end decodes the byte buffer to BASE64 /// /// /// public void SetTagBase64(string argTagname, byte[] buffer) { SetTag(argTagname, Convert.ToBase64String(buffer, 0, buffer.Length)); } public void SetTag(string argTagname, string argText) { if (HasTag(argTagname) == false) AddChild(new Element(argTagname, argText)); else SelectSingleElement(argTagname).Value = argText; } public void SetTag(Type type, string argText) { if (HasTag(type) == false) { Element newel; newel = (Element) Activator.CreateInstance(type); newel.Value = argText; AddChild(newel); } else SelectSingleElement(type).Value = argText; } public void SetTag(Type type) { if (HasTag(type)) RemoveTag(type); AddChild( (Element) Activator.CreateInstance(type) ); } public void SetTag(string argTagname) { SetTag(argTagname, ""); } public void SetTag(string argTagname, string argText, string argNS) { if (HasTag(argTagname) == false) AddChild(new Element(argTagname, argText, argNS)); else { Element e = SelectSingleElement(argTagname); e.Value = argText; e.Namespace = argNS; } } public void SetTag(string argTagname, double dbl, IFormatProvider ifp) { SetTag(argTagname, dbl.ToString(ifp)); } public void SetTag(string argTagname, double dbl) { NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberGroupSeparator = "."; SetTag(argTagname, dbl, nfi); } public void SetTag(string argTagname, bool val) { SetTag(argTagname, val ? "true" : "false"); } public void SetTag(string argTagname, int val) { SetTag(argTagname, val.ToString()); } public void SetTag(string argTagname, Jid jid) { SetTag(argTagname, jid.ToString()); } public void AddTag(string argTagname, string argText) { AddChild(new Element(argTagname, argText)); } public void AddTag(string argTagname) { AddChild(new Element(argTagname)); } public object GetTagEnum(string name, System.Type enumType) { string tag = this.GetTag(name); if ( (tag == null) || (tag.Length == 0) ) return -1; try { #if CF return util.Enum.Parse(enumType, tag, true); #else return Enum.Parse(enumType, tag, true); #endif } catch (Exception) { return -1; } } /// /// Return the Text of the first Tag with a specified Name in all childnodes as boolean /// /// name of Tag to findas string /// public bool GetTagBool(string TagName) { Element tag = this._SelectElement(this, TagName); if ( tag != null) { if (tag.Value.ToLower() == "false" || tag.Value.ToLower() == "0") { return false; } if(tag.Value.ToLower() == "true" || tag.Value.ToLower() == "1") { return true; } return false; } return false; } public int GetTagInt(string TagName) { Element tag = _SelectElement(this, TagName); if ( tag != null) return int.Parse(tag.Value); return 0; } public Jid GetTagJid(string TagName) { string jid = GetTag(TagName); if (jid != null) return new Jid(jid); return null; } /// /// Get a Tag of type double (Decimal seperator = ".") /// /// /// public double GetTagDouble(string argTagName) { // Parse the double always in english format ==> "." = Decimal seperator NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberGroupSeparator = "."; return GetTagDouble(argTagName, nfi); } /// /// Get a Tag of type double with the given iFormatProvider /// /// /// /// public double GetTagDouble(string argTagName, IFormatProvider ifp) { string val = GetTag(argTagName); if (val != null) return Double.Parse(val, ifp); return Double.NaN; } public bool HasTag(string name) { Element tag = _SelectElement(this, name); if ( tag != null) return true; return false; } public bool HasTag(string name, bool traverseChildren) { Element tag = _SelectElement(this, name, traverseChildren); if ( tag != null) return true; return false; } public bool HasTag(Type type) { Element tag = _SelectElement(this, type); if ( tag != null) return true; return false; } public bool HasTag() where T : Element { return SelectSingleElement() != null; } public bool HasTagt(bool traverseChildren) where T : Element { return SelectSingleElement(traverseChildren) != null; } public bool HasTag(Type type, bool traverseChildren) { Element tag = this._SelectElement(this, type, traverseChildren); if ( tag != null) return true; return false; } /// /// /// /// /// public object HasTagEnum(Type enumType) { #if CF || CF_2 string[] members = Util.Enum.GetNames(enumType); #else string[] members = Enum.GetNames(enumType); #endif foreach (string member in members) { if (HasTag(member)) #if CF return util.Enum.Parse(enumType, member, false); #else return Enum.Parse(enumType, member, false); #endif } return -1; } /// /// Remove a Tag when it exists /// /// Tagname to remove /// true when existing and removed, false when not existing public bool RemoveTag(string TagName) { Element tag = _SelectElement(this, TagName); if ( tag != null) { tag.Remove(); return true; } return false; } /// /// Remove a Tag when it exists /// /// Type of the tag that should be removed /// true when existing and removed, false when not existing public bool RemoveTag(Type type) { Element tag = _SelectElement(this, type); if (tag != null) { tag.Remove(); return true; } return false; } public bool RemoveTag() where T : Element { Element tag = SelectSingleElement(); if (tag != null) { tag.Remove(); return true; } return false; } /// /// Removes all Tags of the given type. Doesnt traverse the tree /// /// Type of the tags that should be removed /// true when tags were removed, false when no tags were found and removed public bool RemoveTags(Type type) { bool ret = false; ElementList list = SelectElements(type); if (list.Count > 0) ret = true; foreach (Element e in list) e.Remove(); return ret; } /// /// Removes all Tags of the given type. Doesnt traverse the tree /// /// Type of the tags that should be removed /// true when tags were removed, false when no tags were found and removed public bool RemoveTags() where T : Element { return RemoveTags(typeof (T)); } /// /// Same as AddChild, but Replaces the childelement when it exists /// /// public void ReplaceChild(Element e) { if (HasTag(e.TagName)) RemoveTag(e.TagName); AddChild(e); } public string Attribute(string name) { return (string) m_Attributes[name]; } /// /// Removes a Attribute /// /// Attribute as string to remove public void RemoveAttribute(string name) { if (HasAttribute(name)) { Attributes.Remove(name); } } /// /// Adds a new Attribue or changes a Attriv when already exists /// /// name of Attribute to add/change /// value of teh Attribute to add/change public void SetAttribute(string name, string val) { // When the attrib already exists then we overweite it // So we must remove it first and add it again then if (HasAttribute(name)) { Attributes.Remove(name); } m_Attributes.Add(name, val); } /// /// /// /// /// public void SetAttribute(string name, int value) { SetAttribute(name, value.ToString()); } /// /// /// /// /// public void SetAttribute(string name, long value) { SetAttribute(name, value.ToString()); } /// /// Writes a boolean attribute, the value is either 'true' or 'false' /// /// /// public void SetAttribute(string name, bool val) { // When the attrib already exists then we overweite it // So we must remove it first and add it again then if (HasAttribute(name)) { Attributes.Remove(name); } m_Attributes.Add(name, val ? "true" : "false"); } /// /// Set a attribute of type Jid /// /// /// public void SetAttribute(string name, Jid value) { if (value != null) SetAttribute(name, value.ToString()); else RemoveAttribute(name); } /// /// Set a attribute from a double in english number format /// /// /// public void SetAttribute(string name, double value) { NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberGroupSeparator = "."; SetAttribute(name, value, nfi); } /// /// Set a attribute from a double with the given Format provider /// /// /// /// public void SetAttribute(string name, double value, IFormatProvider ifp) { SetAttribute(name, value.ToString(ifp)); } public void SetNamespace(string value) { SetAttribute("xmlns", value); } private CData GetFirstCDataNode() { foreach (Node ch in ChildNodes) { if (ch.NodeType == NodeType.Cdata) return ch as CData; } return null; } /// /// Has this Element some CDATA? /// /// public bool HasData() { return GetFirstCDataNode() != null; } /// /// Get the CDATA /// /// public string GetData() { var data = GetFirstCDataNode(); return data == null ? null : data.Value; } /// /// Set the CDATA /// /// public void SetData(string cdata) { var data = GetFirstCDataNode(); if (data == null) { data = new CData(); AddChild(data); } data.Value = cdata; } public string InnerXml { get { if (ChildNodes.Count > 0) { string xml = ""; try { for (int i = 0; i < ChildNodes.Count; i++) { if (ChildNodes.Item(i).NodeType == NodeType.Element) xml += ChildNodes.Item(i).ToString(); else if (ChildNodes.Item(i).NodeType == NodeType.Text) xml += ChildNodes.Item(i).Value; } } catch (Exception) { } return xml; } return null; } set { Document doc = new Document(); doc.LoadXml(value); Element root = doc.RootElement; if (root != null) { ChildNodes.Clear(); AddChild(root); } } } /// /// returns whether the current element has child elements or not. /// cares only about element, not text nodes etc... /// public bool HasChildElements { get { foreach (Node e in ChildNodes) { if (e.NodeType == NodeType.Element) return true; } return false; } } /// /// returns the first child element (no textNodes) /// public Element FirstChild { get { if (ChildNodes.Count > 0) { foreach (Node e in ChildNodes) { if (e.NodeType == NodeType.Element) return e as Element; } return null; } return null; } } /// /// Returns the first ChildNode, doesnt matter of which type it is /// public Node FirstNode { get { if(ChildNodes.Count > 0) return ChildNodes.Item(0) as Node; return null; } } /// /// Returns the last ChildNode, doesnt matter of which type it is /// public Node LastNode { get { if(ChildNodes.Count > 0) return ChildNodes.Item(ChildNodes.Count -1) as Node; return null; } } internal string StartTag() { using (StringWriter sw = new StringWriter()) { using (XmlTextWriter tw = new XmlTextWriter(sw)) { tw.Formatting = Formatting.None; if (Prefix == null) tw.WriteStartElement(TagName); else tw.WriteStartElement(Prefix + ":" + TagName); // Write Namespace if (Namespace != null && Namespace.Length != 0 ) { if (Prefix == null) tw.WriteAttributeString("xmlns", Namespace); else tw.WriteAttributeString("xmlns:" + Prefix, Namespace); } foreach (string attName in this.Attributes.Keys) { tw.WriteAttributeString(attName, Attribute(attName)); } tw.Flush(); tw.Close(); return sw.ToString().Replace("/>", ">"); } } } internal string EndTag() { if (Prefix == null) return ""; return ""; } #region << Xml Select Functions >> /// /// Find a Element by type /// /// /// public Element SelectSingleElement(System.Type type) { return _SelectElement(this, type); } /// /// find a Element by type and loop thru all children /// /// /// /// public Element SelectSingleElement(System.Type type, bool loopChildren) { return _SelectElement(this, type, true); } public Element SelectSingleElement(string TagName) { return _SelectElement(this, TagName); } public Element SelectSingleElement(string TagName, bool traverseChildren) { return _SelectElement(this, TagName, true); } public Element SelectSingleElement(string TagName, string AttribName, string AttribValue) { return _SelectElement(this, TagName, AttribName, AttribValue); } public Element SelectSingleElement(string TagName, string ns) { return _SelectElement(this, TagName, ns, true); } public Element SelectSingleElement(string TagName, string ns, bool traverseChildren) { return _SelectElement(this, TagName, ns, traverseChildren); } public T SelectSingleElement() where T : Element { return (T)_SelectElement(this, typeof(T)); } public T SelectSingleElement(bool traverseChildren) where T : Element { return (T)_SelectElement(this, typeof(T), traverseChildren); } /// /// Returns all childNodes with the given Tagname, /// this function doesn't traverse the whole tree!!! /// /// /// public ElementList SelectElements(string TagName) { ElementList es = new ElementList(); //return this._SelectElements(this, TagName, es); return _SelectElements(this, TagName, es, false); } public ElementList SelectElements(string TagName, bool traverseChildren) { ElementList es = new ElementList(); //return this._SelectElements(this, TagName, es); return _SelectElements(this, TagName, es, traverseChildren); } public ElementList SelectElements(System.Type type) { ElementList es = new ElementList(); return _SelectElements(this, type, es); } /// /// returns a nodelist of all found nodes of the given Type /// /// /// /// /// private ElementList _SelectElements(Element e, Type type, ElementList es) { return _SelectElements(e, type, es, false); } private ElementList _SelectElements(Element e, Type type, ElementList es, bool traverseChildren) { if (e.ChildNodes.Count > 0) { foreach(Node n in e.ChildNodes) { if (n.NodeType == NodeType.Element) { if (n.GetType() == type) { es.Add(n); } if (traverseChildren) _SelectElements((Element) n, type, es, true); } } } return es; } /// /// Select a single element. /// This function doesnt traverse the whole tree and checks only the underlying childnodes /// /// /// /// private Element _SelectElement(Node se, string tagname) { return _SelectElement(se, tagname, false); } /// /// Select a single element /// /// /// /// when set to true then the function traverses the whole tree /// private Element _SelectElement(Node se, string tagname, bool traverseChildren) { Element rElement = null; if (se.ChildNodes.Count > 0) { foreach(Node ch in se.ChildNodes) { if (ch.NodeType == NodeType.Element) { if ( ((Element) ch).TagName == tagname ) { rElement = (Element) ch; return rElement; } else { if( traverseChildren) { rElement = _SelectElement(ch, tagname, true); if (rElement != null) break; } } } } } return rElement; } private Element _SelectElement(Node se, System.Type type) { return _SelectElement(se, type, false); } private Element _SelectElement(Node se, System.Type type, bool traverseChildren) { Element rElement = null; if (se.ChildNodes.Count > 0) { foreach(Node ch in se.ChildNodes) { if (ch.NodeType == NodeType.Element) { if ( ch.GetType() == type ) { rElement = (Element) ch; return rElement; } else { if( traverseChildren) { rElement = _SelectElement(ch, type, true); if (rElement != null) break; } } } } } return rElement; } private Element _SelectElement(Node se, string tagname, string AttribName, string AttribValue) { Element rElement = null; if (se.NodeType == NodeType.Element) { Element e = se as Element; if (e.m_TagName == tagname) { if (e.HasAttribute(AttribName)) { if (e.GetAttribute(AttribName) == AttribValue) { rElement = e; return rElement; } } } } if (se.ChildNodes.Count > 0) { foreach(Node ch in se.ChildNodes) { rElement = _SelectElement(ch, tagname, AttribName, AttribValue); if (rElement != null) break; } } return rElement; } /// /// Find Element by Namespace /// /// The se. /// The tagname. /// The name space. /// if set to true [traverse children]. /// private Element _SelectElement(Node se, string tagname, string nameSpace, bool traverseChildren) { Element rElement = null; if (se.ChildNodes.Count > 0) { foreach (Node ch in se.ChildNodes) { if (ch.NodeType == NodeType.Element) { Element e = ch as Element; if (e.TagName == tagname && e.Namespace == nameSpace) { rElement = (Element)ch; return rElement; } else { if (traverseChildren) { rElement = _SelectElement(ch, tagname, nameSpace, traverseChildren); if (rElement != null) break; } } } } } return rElement; } private ElementList _SelectElements(Element e, string tagname, ElementList es, bool traverseChildren) { if (e.ChildNodes.Count > 0) { foreach(Node n in e.ChildNodes) { if (n.NodeType == NodeType.Element) { if ( ((Element) n).m_TagName == tagname) { es.Add(n); } if (traverseChildren) _SelectElements((Element) n, tagname, es, true); } } } return es; } public List SelectElements() where T : Element { return SelectElements(false); } public List SelectElements(bool traverseChildren) where T : Element { List list = new List(); return this._SelectElements(this, list, traverseChildren); } private List _SelectElements(Element e, List list, bool traverseChildren) where T : Element { if (e.ChildNodes.Count > 0) { foreach (Node n in e.ChildNodes) { if (n.NodeType == NodeType.Element) { if (n.GetType() == typeof(T)) { list.Add(n as T); } if (traverseChildren) _SelectElements((Element)n, list, true); } } } return list; } #endregion } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/Document.cs0000644000175000017500000000613312204443225022607 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.IO; namespace agsXMPP.Xml.Dom { /// /// /// public class Document : Node { public Document() { NodeType = NodeType.Document; } public Element RootElement { get { foreach (Node n in this.ChildNodes) { if(n.NodeType == NodeType.Element) return n as Element; } return null; } } #region << Properties and Member Variables >> private string m_Encoding = null; private string m_Version = null; public string Encoding { get { return m_Encoding; } set { m_Encoding = value; } } public string Version { get { return m_Version; } set { m_Version = value; } } #endregion /// /// Clears the Document /// public void Clear() { this.ChildNodes.Clear(); } #region << Load functions >> public void LoadXml(string xml) { if (!string.IsNullOrEmpty(xml)) { DomLoader.Load(xml, this); } } public bool LoadFile(string filename) { if (File.Exists(filename)) { try { using(var sr = new StreamReader(filename)) { DomLoader.Load(sr, this); sr.Close(); return true; } } catch { return false; } } return false; } public bool LoadStream(Stream stream) { try { using(var sr = new StreamReader(stream)) { DomLoader.Load(sr, this); sr.Close(); return true; } } catch { return false; } } public void Save(string filename) { using (var w = new StreamWriter(filename)) { w.Write(ToString(System.Text.Encoding.UTF8)); w.Flush(); w.Close(); } } #endregion } } smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/Text.cs0000644000175000017500000000245512204443225021760 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ namespace agsXMPP.Xml.Dom { /// /// /// public class Text : Node { public Text() { NodeType = NodeType.Text; } public Text(string text) : this() { Value = text; } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/DomLoader.cs0000644000175000017500000000336612250206660022705 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.IO; namespace agsXMPP.Xml.Dom { /// /// internal class that loads a xml document from a string or stream /// internal class DomLoader { public static void Load(string xml, Document doc) { var sp =new StreamParser(); sp.OnStreamStart += (sender, node) => doc.ChildNodes.Add(node); sp.OnStreamElement += (sender, args) => doc.RootElement.ChildNodes.Add(args.Element); byte[] b = System.Text.Encoding.UTF8.GetBytes(xml); sp.Push(b, 0, b.Length); } public static void Load(StreamReader sr, Document doc) { Load(sr.ReadToEnd(), doc); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Xml/Dom/ElementList.cs0000644000175000017500000000402712204443225023256 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; namespace agsXMPP.Xml.Dom { public class ElementList : CollectionBase { public void Add(Node e) { // can't add a empty node, so return immediately // Some people tried dthis which caused an error if (e == null) return; List.Add(e); } // Method implementation from the CollectionBase class public void Remove(int index) { if (index > Count - 1 || index < 0) { // Handle the error that occurs if the valid page index is // not supplied. // This exception will be written to the calling function throw new Exception("Index out of bounds"); } List.RemoveAt(index); } public void Remove(Element e) { List.Remove(e); } public Element Item(int index) { return (Element) List[index]; } } }smuxi-1.1/lib/agsxmpp/agsxmpp/agsxmpp.sln0000644000175000017500000000257612204443225021427 0ustar00meebeymeebey00000000000000 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "agsxmpp", "agsxmpp.csproj", "{C6379274-C5DE-41A2-AE3E-753F85A557BA}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StarkSoftProxy", "starksoftproxy\StarkSoftProxy.csproj", "{3F8CF2C1-EA37-444F-8693-A3A00B1131D2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Debug|Any CPU.Build.0 = Debug|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {3F8CF2C1-EA37-444F-8693-A3A00B1131D2}.Release|Any CPU.Build.0 = Release|Any CPU {C6379274-C5DE-41A2-AE3E-753F85A557BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C6379274-C5DE-41A2-AE3E-753F85A557BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {C6379274-C5DE-41A2-AE3E-753F85A557BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6379274-C5DE-41A2-AE3E-753F85A557BA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = agsxmpp.csproj EndGlobalSection EndGlobal smuxi-1.1/lib/agsxmpp/agsxmpp/Util/0000755000175000017500000000000012204443225020135 5ustar00meebeymeebey00000000000000smuxi-1.1/lib/agsxmpp/agsxmpp/Util/WinCeApi.cs0000644000175000017500000000312412204443225022123 0ustar00meebeymeebey00000000000000#if !MONO using System; using System.Runtime.InteropServices; namespace agsXMPP.util { /// /// Crypto API for Windows CE, Pocket PC and Smartphone /// will be used for Hashing and the RandomNumberGenerator /// internal class WinCeApi { public enum SecurityProviderType { RSA_FULL = 1, HP_HASHVAL = 2, CALG_MD5 = 32771, CALG_SHA1 = 32772 } [DllImport("coredll.dll")] public static extern bool CryptAcquireContext(out IntPtr hProv, string pszContainer, string pszProvider, int dwProvType,int dwFlags); [DllImport("coredll.dll")] public static extern bool CryptCreateHash(IntPtr hProv, int Algid, IntPtr hKey, int dwFlags, out IntPtr phHash); [DllImport("coredll.dll")] public static extern bool CryptHashData(IntPtr hHash, byte [] pbData, int dwDataLen, int dwFlags); [DllImport("coredll.dll")] public static extern bool CryptGetHashParam(IntPtr hHash, int dwParam, byte[] pbData, ref int pdwDataLen, int dwFlags); [DllImport("coredll.dll")] public static extern bool CryptDestroyHash(IntPtr hHash); [DllImport("coredll.dll")] public static extern bool CryptReleaseContext(IntPtr hProv, int dwFlags); [DllImport("coredll.dll", EntryPoint="CryptGenRandom", SetLastError=true)] public static extern bool CryptGenRandomCe(IntPtr hProv, int dwLen, byte[] pbBuffer); [DllImport("advapi32.dll", EntryPoint="CryptGenRandom", SetLastError=true)] public static extern bool CryptGenRandomXp(IntPtr hProv, int dwLen, byte[] pbBuffer); } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/Util/Hash.cs0000644000175000017500000001316412204443225021354 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System.Text; #if !CF using System.Security.Cryptography; #endif namespace agsXMPP.Util { /// /// Helper class for hashing. /// public class Hash { #region << SHA1 Hash Desktop Framework and Mono >> #if !CF public static string Sha1Hash(string pass) { SHA1 sha = SHA1.Create(); byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(pass)); return HexToString(hash); } public static byte[] Sha1HashBytes(string pass) { SHA1 sha = SHA1.Create(); return sha.ComputeHash(Encoding.UTF8.GetBytes(pass)); } public static byte[] Sha1HashBytes(byte[] pass) { using (var sha = new SHA1Managed()) { return sha.ComputeHash(pass); } } #endif /// /// Converts all bytes in the Array to a string representation. /// /// /// string representation public static string HexToString(byte[] buf) { StringBuilder sb = new StringBuilder(); foreach (byte b in buf) { sb.Append(b.ToString("x2")); } return sb.ToString(); } #endregion #region << SHA1 Hash Compact Framework >> #if CF /// /// return a SHA1 Hash on PPC and Smartphone /// /// /// public static byte[] Sha1Hash(byte[] pass) { IntPtr hProv; bool retVal = WinCeApi.CryptAcquireContext( out hProv, null, null, (int) WinCeApi.SecurityProviderType.RSA_FULL, 0 ); IntPtr hHash; retVal = WinCeApi.CryptCreateHash( hProv, (int) WinCeApi.SecurityProviderType.CALG_SHA1, IntPtr.Zero, 0, out hHash ); byte [] publicKey = pass; int publicKeyLen = publicKey.Length; retVal = WinCeApi.CryptHashData( hHash, publicKey, publicKeyLen, 0 ); int bufferLen = 20; //SHA1 size byte [] buffer = new byte[bufferLen]; retVal = WinCeApi.CryptGetHashParam( hHash, (int) WinCeApi.SecurityProviderType.HP_HASHVAL, buffer, ref bufferLen, 0 ); retVal = WinCeApi.CryptDestroyHash( hHash ); retVal = WinCeApi.CryptReleaseContext( hProv, 0 ); return buffer; } /// /// return a SHA1 Hash on PPC and Smartphone /// /// /// public static string Sha1Hash(string pass) { return HexToString(Sha1Hash(System.Text.Encoding.ASCII.GetBytes(pass))); } /// /// return a SHA1 Hash on PPC and Smartphone /// /// /// public static byte[] Sha1HashBytes(string pass) { return Sha1Hash(System.Text.Encoding.UTF8.GetBytes(pass)); } /// /// omputes the MD5 hash value for the specified byte array. /// /// The input for which to compute the hash code. /// The computed hash code. public static byte[] MD5Hash(byte[] pass) { IntPtr hProv; bool retVal = WinCeApi.CryptAcquireContext( out hProv, null, null, (int) WinCeApi.SecurityProviderType.RSA_FULL, 0 ); IntPtr hHash; retVal = WinCeApi.CryptCreateHash( hProv, (int) WinCeApi.SecurityProviderType.CALG_MD5, IntPtr.Zero, 0, out hHash ); byte [] publicKey = pass; int publicKeyLen = publicKey.Length; retVal = WinCeApi.CryptHashData( hHash, publicKey, publicKeyLen, 0 ); int bufferLen = 16; //SHA1 size byte [] buffer = new byte[bufferLen]; retVal = WinCeApi.CryptGetHashParam( hHash, (int) WinCeApi.SecurityProviderType.HP_HASHVAL, buffer, ref bufferLen, 0 ); retVal = WinCeApi.CryptDestroyHash( hHash ); retVal = WinCeApi.CryptReleaseContext( hProv, 0 ); return buffer; } #endif #endregion #if !(CF || CF_2) public static byte[] HMAC(byte[] key, byte[] data) { using (var hmacsha1 = new HMACSHA1(key, true)) { byte[] bytes = hmacsha1.ComputeHash(data); return bytes; } } public static byte[] HMAC(string key, byte[] data) { return HMAC(Encoding.UTF8.GetBytes(key), data); } public static byte[] HMAC(byte[] key, string data) { return HMAC(key, Encoding.UTF8.GetBytes(data)); } public static byte[] HMAC(string key, string data) { return HMAC(Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(data)); } #endif } }smuxi-1.1/lib/agsxmpp/agsxmpp/Util/RandomNumberGenerator.cs0000644000175000017500000000465312204443225024734 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2007 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #if CF using System; namespace agsXMPP.util { /// /// Represents the abstract class from which all implementations of cryptographic random number generators derive. /// Its a replacement for System.Security.RandomNumberGenerator /// which is not abailavle on the compact framework /// public abstract class RandomNumberGenerator { public RandomNumberGenerator() { } /// /// Creates an instance of an implementation of a cryptographic random number generator. /// /// a new instance of a cryptographic random number generator. public static RandomNumberGenerator Create() { return new RNGCryptoServiceProvider(); } /// /// When overridden in a derived class, fills an array of bytes with a cryptographically strong random sequence of values. /// /// The array to fill with cryptographically strong random bytes. public abstract void GetBytes(byte[] data); /// /// When overridden in a derived class, fills an array of bytes with a cryptographically strong random sequence of nonzero values. /// /// The array to fill with cryptographically strong random nonzero bytes. public abstract void GetNonZeroBytes(byte[] data); } } #endifsmuxi-1.1/lib/agsxmpp/agsxmpp/Util/Date.cs0000644000175000017500000000746612204443225021356 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP.Util { /// /// Class handles the XMPP time format /// public class Time { /* */ /// /// /// /// /// public static DateTime Date(string date) { // better put here a try catch in case a client sends a wrong formatted date try { DateTime dt = new DateTime( int.Parse(date.Substring(0, 4)), int.Parse(date.Substring(4, 2)), int.Parse(date.Substring(6, 2)), int.Parse(date.Substring(9, 2)), int.Parse(date.Substring(12, 2)), int.Parse(date.Substring(15, 2)) ); return dt.ToLocalTime(); } catch { return DateTime.MinValue; } } /// /// Get a XMPP string representation of a Date /// /// DateTime /// XMPP string representation of a DateTime value public static string Date(DateTime date) { return date.ToString("yyyyMMddTHH:mm:ss"); } /// /// The new standard used by XMPP in JEP-82 (ISO-8601) /// 1970-01-01T00:00Z /// /// /// public static DateTime ISO_8601Date(string date) { // .NET does a great Job parsing this Date profile try { return DateTime.Parse(date); } catch { return DateTime.MinValue; } } /// /// The new standard used by XMPP in JEP-82 (ISO-8601) /// converts a local DateTime to a ISO-8601 formatted date in UTC format. /// 1970-01-01T00:00Z /// /// local Datetime /// public static string ISO_8601Date(DateTime date) { return date.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); //return date.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); //return date.ToString("yyyy-MM-ddTHH:mm:ssZ"); //("yyyy'-'MM'-'dd HH':'mm':'ss'Z'") } public static TimeSpan UtcOffset() { var localZone = TimeZone.CurrentTimeZone; var currentDate = DateTime.Now; return localZone.GetUtcOffset(currentDate); } } }smuxi-1.1/lib/agsxmpp/agsxmpp/Util/Exceptions.cs0000644000175000017500000000047312204443225022611 0ustar00meebeymeebey00000000000000using System; namespace agsXMPP.util { /// /// Summary description for Exceptions. /// public class NotImplementedException : Exception { public NotImplementedException() { } public NotImplementedException(string message) : base(message) { } } } smuxi-1.1/lib/agsxmpp/agsxmpp/Util/RNGCryptoServiceProvider.cs0000644000175000017500000000603512204443225025353 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2007 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #if CF using System; namespace agsXMPP.util { /// /// Implements a cryptographic Random Number Generator (RNG) using the implementation /// provided by the cryptographic service provider (CSP). /// Its a replacement for System.Security.Cryptography.RandomNumberGenerator which /// is not available in the compact framework. /// public class RNGCryptoServiceProvider : RandomNumberGenerator { public RNGCryptoServiceProvider() { } /// /// Fills an array of bytes with a cryptographically strong random sequence of values. /// /// The array to fill with cryptographically strong random bytes. public override void GetBytes(byte[] seed) { seed = _GetRandomBytes(seed); } /// /// Fills an array of bytes with a cryptographically strong random sequence of nonzero values. /// /// The array to fill with cryptographically strong random nonzero bytes. public override void GetNonZeroBytes(byte[] seed) { seed = _GetNonZeroBytes(seed); } #region << private functions >> private byte [] _GetRandomBytes(byte[] seed) { IntPtr prov; bool retVal = WinCeApi.CryptAcquireContext(out prov, null, null, (int) WinCeApi.SecurityProviderType.RSA_FULL, 0); retVal = _CryptGenRandom(prov, seed.Length, seed); WinCeApi.CryptReleaseContext(prov, 0); return seed; } private bool _CryptGenRandom(IntPtr hProv, int dwLen, byte[] pbBuffer) { if(System.Environment.OSVersion.Platform == PlatformID.WinCE) return WinCeApi.CryptGenRandomCe(hProv, dwLen, pbBuffer); else return WinCeApi.CryptGenRandomXp(hProv, dwLen, pbBuffer); } private byte [] _GetNonZeroBytes(byte[] seed) { byte [] buf = _GetRandomBytes(seed); for(int i=0; i /// Provides helper functions for Enumerations. /// /// Extends the System.Enum Class. /// System.Enum Class public class Enum { #if CF #region << Enum.Parse() for CF, credits to OpenNetCF.net for this function>> /// /// Use this on CF 1.0, CF 2 includes Enum.Parse() now /// /// /// /// /// public static object Parse(System.Type enumType, string value, bool ignoreCase) { //throw an exception on null value if(value.TrimEnd(' ')=="") { throw new ArgumentException("value is either an empty string (\"\") or only contains white space."); } else { //type must be a derivative of enum if(enumType.BaseType==Type.GetType("System.Enum")) { //remove all spaces string[] memberNames = value.Replace(" ","").Split(','); //collect the results //we are cheating and using a long regardless of the underlying type of the enum //this is so we can use ordinary operators to add up each value //I suspect there is a more efficient way of doing this - I will update the code if there is long returnVal = 0; //for each of the members, add numerical value to returnVal foreach(string thisMember in memberNames) { //skip this string segment if blank if(thisMember!="") { try { if(ignoreCase) { returnVal += (long)Convert.ChangeType(enumType.GetField(thisMember, BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase).GetValue(null),returnVal.GetType(), null); } else { returnVal += (long)Convert.ChangeType(enumType.GetField(thisMember, BindingFlags.Public | BindingFlags.Static).GetValue(null),returnVal.GetType(), null); } } catch { try { //try getting the numeric value supplied and converting it returnVal += (long)Convert.ChangeType(System.Enum.ToObject(enumType, Convert.ChangeType(thisMember, System.Enum.GetUnderlyingType(enumType), null)),typeof(long),null); } catch { throw new ArgumentException("value is a name, but not one of the named constants defined for the enumeration."); } // } } } //return the total converted back to the correct enum type return System.Enum.ToObject(enumType, returnVal); } else { //the type supplied does not derive from enum throw new ArgumentException("enumType parameter is not an System.Enum"); } } } #endregion #endif #if CF || CF_2 || SL public static string[] GetNames(System.Type enumType) { if(enumType.BaseType==Type.GetType("System.Enum")) { //get the public static fields (members of the enum) System.Reflection.FieldInfo[] fi = enumType.GetFields(BindingFlags.Static | BindingFlags.Public); //create a new enum array string[] names = new string[fi.Length]; //populate with the values for(int iEnum = 0; iEnum < fi.Length; iEnum++) { names[iEnum] = fi[iEnum].Name; } //return the array return names; } else { //the type supplied does not derive from enum throw new ArgumentException("enumType parameter is not an System.Enum"); } } #endif } } smuxi-1.1/lib/agsxmpp/agsxmpp/XmppClientConnectionState.cs0000644000175000017500000000530112204443225024652 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; namespace agsXMPP { /// /// Represents the current state of a XMPPConnection /// public enum XmppConnectionState { /// /// Session is Disconnected /// Disconnected, /// /// The Socket is Connecting /// Connecting, /// /// The Socket is Connected /// Connected, /// /// The XMPP Session is authenticating /// Authenticating, /// /// The XMPP session is autrhenticated /// Authenticated, /// /// Resource Binding gets started /// Binding, /// /// Resource Binded with sucess /// Binded, StartSession, /// /// Initialize Stream Compression /// StartCompression, /// /// Stream is compressed now /// Compressed, SessionStarted, /// /// We are switching from a normal connection to a secure SSL connection (StartTLS) /// Securing, /// /// started the progress to register a new account /// Registering, /// /// Account was registered successful /// Registered } } smuxi-1.1/lib/agsxmpp/agsxmpp/PacketGrabber.cs0000644000175000017500000000402012204443225022237 0ustar00meebeymeebey00000000000000/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2003-2012 by AG-Software * * All Rights Reserved. * * Contact information for AG-Software is available at http://www.ag-software.de * * * * Licence: * * The agsXMPP SDK is released under a dual licence * * agsXMPP can be used under either of two licences * * * * A commercial licence which is probably the most appropriate for commercial * * corporate use and closed source projects. * * * * The GNU Public License (GPL) is probably most appropriate for inclusion in * * other open source projects. * * * * See README.html for details. * * * * For general enquiries visit our website at: * * http://www.ag-software.de * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ using System; using System.Collections; namespace agsXMPP { /// /// Summary description for Grabber. /// public class PacketGrabber { internal Hashtable m_grabbing = new Hashtable(); internal XmppConnection m_connection = null; public PacketGrabber() { } public void Clear() { // need locking here to make sure that we dont acces the Hashtable // from another thread lock(this) { m_grabbing.Clear(); } } /// /// Pending request can be removed. /// This is useful when a ressource for the callback is destroyed and /// we are not interested anymore at the result. /// /// ID of the Iq we are not interested anymore public void Remove(string id) { if (m_grabbing.ContainsKey(id)) m_grabbing.Remove(id); } } } smuxi-1.1/po-Frontend-GNOME/0000775000175000017500000000000014011526504016354 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Frontend-GNOME/LINGUAS0000664000175000017500000000014014011526464017401 0ustar00meebeymeebey00000000000000ca cs da de el en_GB es fa fi fr hr hu id it lt nl pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Frontend-GNOME/en_GB.po0000664000175000017500000010674414011526464017707 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2009 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # Ryan Smith-Evans , 2008. # msgid "" msgstr "" "Project-Id-Version: 0.6.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-08-10 19:14+0200\n" "PO-Revision-Date: 2010-01-09 00:18+0100\n" "Last-Translator: Ryan Smith-Evans \n" "Language-Team: English-GB \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid " Color " msgstr " Colour " #: ../glade/smuxi-frontend-gnome.glade.h:3 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1364 msgid " Entry Field " msgstr " Entry Field " #: ../glade/smuxi-frontend-gnome.glade.h:4 msgid " Font " msgstr " Font " #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1694 msgid " Highlighting " msgstr " Highlighting " #: ../glade/smuxi-frontend-gnome.glade.h:6 msgid " Notification Area Icon " msgstr " Notification Area Icon " #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid " Person List Position " msgstr " Person List Position " #: ../glade/smuxi-frontend-gnome.glade.h:8 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1201 msgid " Tab Colors " msgstr " Tab Colours " #: ../glade/smuxi-frontend-gnome.glade.h:9 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1102 msgid " Tabs Position " msgstr " Tabs Position " #: ../glade/smuxi-frontend-gnome.glade.h:10 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1507 msgid " Topic Position " msgstr " Topic Position " #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Messaging Menu" msgstr "Messaging Menu" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Notification Popups" msgstr " Notification Area Icon " #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1153 msgid "Activity" msgstr "Activity" #: ../glade/smuxi-frontend-gnome.glade.h:14 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:99 msgid "Automatically connect to server at startup" msgstr "Automatically connect to server at startup" #: ../glade/smuxi-frontend-gnome.glade.h:15 msgid "Background" msgstr "Background" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1352 msgid "Bash-Style Completion" msgstr "Bash-Style Completion" #: ../glade/smuxi-frontend-gnome.glade.h:17 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1682 msgid "Beep on highlight" msgstr "Beep on highlight" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:972 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:994 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1453 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1478 msgid "Bottom" msgstr "Bottom" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:738 msgid "Buffer Lines:" msgstr "Buffer Lines:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:663 msgid "C_onnection" msgstr "C_onnection" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1304 msgid "Command Character:" msgstr "Command Character:" #: ../glade/smuxi-frontend-gnome.glade.h:22 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1327 msgid "Command History Size:" msgstr "Command History Size:" #: ../glade/smuxi-frontend-gnome.glade.h:23 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1284 msgid "Completion Character:" msgstr "Completion Character:" #: ../glade/smuxi-frontend-gnome.glade.h:24 msgid "Enable" msgstr "Enable" #: ../glade/smuxi-frontend-gnome.glade.h:25 msgid "Enabled" msgstr "Enable" #: ../glade/smuxi-frontend-gnome.glade.h:26 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:551 msgid "Encoding:" msgstr "Encoding:" #: ../glade/smuxi-frontend-gnome.glade.h:27 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:761 msgid "Engine Buffer Lines:" msgstr "Engine Buffer Lines:" #: ../glade/smuxi-frontend-gnome.glade.h:28 msgid "Foreground" msgstr "Foreground" #: ../glade/smuxi-frontend-gnome.glade.h:29 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:917 msgid "General" msgstr "General" #: ../glade/smuxi-frontend-gnome.glade.h:30 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1173 msgid "Highlight" msgstr "Highlight" #: ../glade/smuxi-frontend-gnome.glade.h:31 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1658 msgid "Highlight words:" msgstr "Highlight words:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Hostname:" msgstr "Hostname:" #: ../glade/smuxi-frontend-gnome.glade.h:33 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1373 msgid "Input" msgstr "Input" #: ../glade/smuxi-frontend-gnome.glade.h:34 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1163 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1008 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1033 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1527 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1553 msgid "Left" msgstr "Left" #: ../glade/smuxi-frontend-gnome.glade.h:36 msgid "Log Filtered Messages" msgstr "Log Filtered Messages" #: ../glade/smuxi-frontend-gnome.glade.h:37 msgid "Network:" msgstr "Network:" #: ../glade/smuxi-frontend-gnome.glade.h:38 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1394 msgid "Nick Colors" msgstr "Nick Colours" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Nickname(s):" msgstr "Nickname(s):" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1145 msgid "No Activity" msgstr "No Activity" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1088 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1493 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1608 msgid "None" msgstr "None" #: ../glade/smuxi-frontend-gnome.glade.h:42 msgid "Notification" msgstr "Notification" #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:573 msgid "On Connect Commands:" msgstr "On Connect Commands:" #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:619 msgid "On Startup Commands:" msgstr "On Start-up Commands:" #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1706 msgid "Output" msgstr "Output" #: ../glade/smuxi-frontend-gnome.glade.h:46 msgid "Override" msgstr "Override" #: ../glade/smuxi-frontend-gnome.glade.h:47 msgid "Password:" msgstr "Password" #: ../glade/smuxi-frontend-gnome.glade.h:48 msgid "Port:" msgstr "Port" #: ../glade/smuxi-frontend-gnome.glade.h:49 msgid "Protocol:" msgstr "Protocol" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:530 msgid "Realname:" msgstr "Real Name" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1048 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1073 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1568 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1593 msgid "Right" msgstr "Right" #: ../glade/smuxi-frontend-gnome.glade.h:52 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:187 msgid "Show Password" msgstr "Show Password" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Show Smuxi in the messaging menu" msgstr "Show Smuxi in the messaging menu" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Show always" msgstr "Show always" #: ../glade/smuxi-frontend-gnome.glade.h:55 msgid "Show notification popups" msgstr "Show notification popups" #: ../glade/smuxi-frontend-gnome.glade.h:56 msgid "Show when window is closed" msgstr "Show when window is closed" #: ../glade/smuxi-frontend-gnome.glade.h:57 msgid "Show when window is minimized" msgstr "Show when window is minimized" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:398 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferences" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:18 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:820 msgid "Strip Colors" msgstr "Strip Colours" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:859 msgid "Strip Formattings" msgstr "Strip Formatting" #: ../glade/smuxi-frontend-gnome.glade.h:62 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:899 msgid "Strip UTF-8" msgstr "Strip UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:63 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1214 msgid "Tabs" msgstr "Tabs" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid "The nickname to use. You can specify extra nicknames (separated by spaces) which will be used as fallbacks when the first choice is not available. By default $nick_ and $nick__ will be used as fallbacks." msgstr "The nickname used. You can specify more than one nickname, separated by a space, which will be used as fall-back when the nickname was not available. By default $nick_ and $nick__ will be used as a fall-back." #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:718 msgid "Timestamp Format:" msgstr "Time-stamp Format:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:66 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:935 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:959 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1412 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1438 msgid "Top" msgstr "Top" #: ../glade/smuxi-frontend-gnome.glade.h:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:507 msgid "Username:" msgstr "Username:" #: ../glade/smuxi-frontend-gnome.glade.h:68 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1873 msgid "_Filters" msgstr "_Filters" #: ../glade/smuxi-frontend-gnome.glade.h:69 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1715 msgid "_Interface" msgstr "_Interface" #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Logging" msgstr "_Logging" #: ../glade/smuxi-frontend-gnome.glade.h:71 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1781 msgid "_Servers" msgstr "_Servers" #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:73 msgid "_Wrap Mode:" msgstr "_Wrap Mode" #: ../glade/smuxi-frontend-gnome.glade.h:74 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = second\n" "mm = minute\n" "hh = hour (1 - 12)\n" "HH = hour (0 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #, fuzzy msgid "Chat with other people on IRC" msgstr "Chat with other people on IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 #, fuzzy msgid "IRC Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 #, fuzzy msgid "Smuxi IRC Client" msgstr "Smuxi - Open Chat" #: ../src/Frontend-GNOME/AboutDialog.cs:58 msgid "translator-credits" msgstr "Ryan Smith-Evans " #: ../src/Frontend-GNOME/AboutDialog.cs:61 msgid "Smuxi Website" msgstr "Smuxi Website" #: ../src/Frontend-GNOME/CrashDialog.cs:44 msgid "Oops, I did it again..." msgstr "Oops, I did it again..." #: ../src/Frontend-GNOME/CrashDialog.cs:57 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi crashed because an unhandled exception was thrown!" #: ../src/Frontend-GNOME/CrashDialog.cs:61 msgid "Here is the stacktrace, please report this bug!" msgstr "Here is the stacktrace, please report this bug!" #: ../src/Frontend-GNOME/CrashDialog.cs:81 msgid "_Report Bug" msgstr "_Report Bug" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine Manager" msgstr "Engine Manager" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:68 msgid "_Connect" msgstr "_Connect" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:84 msgid "Select which Smuxi engine you want to connect to" msgstr "Select which Smuxi engine you want to connect to" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:90 msgid "Engine:" msgstr "Engine:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:116 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:176 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:353 msgid "Local Engine" msgstr "Local Engine" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:168 msgid "Please select an engine!" msgstr "Please select an engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 #, csharp-format msgid "Your frontend version ({0}) does not match the engine version ({1})!" msgstr "Your front-end version ({0}) is not matching the engine version ({1})!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:216 msgid "An error occurred while connecting to the engine!" msgstr "Error occurred while connecting to the engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:217 #, csharp-format msgid "Engine URL: {0}" msgstr "Engine URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:220 #, csharp-format msgid "Error: {0}" msgstr "Error: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:290 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Are you sure you want to delete the engine \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:412 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "You are going to paste {0} lines. Do you want to continue?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:515 msgid "Frontend Commands" msgstr "Front-end Commands" #: ../src/Frontend-GNOME/MainWindow.cs:193 msgid "_File" msgstr "_File" #: ../src/Frontend-GNOME/MainWindow.cs:209 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/MainWindow.cs:213 msgid "_Quick Connect" msgstr "_Quick Connect" #: ../src/Frontend-GNOME/MainWindow.cs:224 msgid "_Manage" msgstr "_Manage" #: ../src/Frontend-GNOME/MainWindow.cs:231 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/MainWindow.cs:235 msgid "Open / Join Chat" msgstr "Open / Join Chat" #: ../src/Frontend-GNOME/MainWindow.cs:240 msgid "_Find Group Chat" msgstr "_Find Group Chat" #: ../src/Frontend-GNOME/MainWindow.cs:245 msgid "C_lear All Activity" msgstr "C_lear All Activity" #: ../src/Frontend-GNOME/MainWindow.cs:252 msgid "_Next Chat" msgstr "_Next Chat" #: ../src/Frontend-GNOME/MainWindow.cs:262 msgid "_Previous Chat" msgstr "_Previous Chat" #: ../src/Frontend-GNOME/MainWindow.cs:312 msgid "Open Log" msgstr "Open Log" #: ../src/Frontend-GNOME/MainWindow.cs:326 msgid "_Engine" msgstr "_Engine" #: ../src/Frontend-GNOME/MainWindow.cs:330 msgid "_Use Local Engine" msgstr "_Use Local Engine" #: ../src/Frontend-GNOME/MainWindow.cs:336 msgid "_Add Remote Engine" msgstr "_Add Remote Engine" #: ../src/Frontend-GNOME/MainWindow.cs:341 msgid "_Switch Remote Engine" msgstr "_Switch Remote Engine" #: ../src/Frontend-GNOME/MainWindow.cs:348 msgid "_View" msgstr "_View" #: ../src/Frontend-GNOME/MainWindow.cs:352 msgid "_Caret Mode" msgstr "_Caret Mode" #: ../src/Frontend-GNOME/MainWindow.cs:362 msgid "_Help" msgstr "_Help" #: ../src/Frontend-GNOME/MainWindow.cs:616 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:222 msgid "Unable to add server: " msgstr "Unable to add server: " #: ../src/Frontend-GNOME/MainWindow.cs:663 #, csharp-format msgid "Unknown ChatType: {0}" msgstr "Unknown ChatType: {0}" #: ../src/Frontend-GNOME/MainWindow.cs:892 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" #: ../src/Frontend-GNOME/MainWindow.cs:934 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Sorry, not implemented yet!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:171 msgid "Character" msgstr "Character" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:172 msgid "Word" msgstr "Word" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:182 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:139 msgid "Connection" msgstr "Connection" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:186 msgid "Interface" msgstr "Interface" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:190 msgid "Servers" msgstr "Servers" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:197 msgid "Filters" msgstr "Filters" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:201 #, fuzzy msgid "Logging" msgstr "Logging" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:251 msgid "System Default" msgstr "System Default" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:528 msgid "Nicknames(s) field must not be empty." msgstr "Nicknames(s) field must not be empty." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:672 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Invalid highlight regex: '{0}'. Reason: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:69 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:105 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:271 msgid "Name" msgstr "Name" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:74 msgid "Topic" msgstr "Topic" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:102 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:143 msgid "Error while fetching the list of group chats from the server." msgstr "Error while fetching the list of group chats from the server." #: ../src/Frontend-GNOME/Frontend.cs:394 #, csharp-format msgid "Cause: {0}" msgstr "Cause: {0}" #: ../src/Frontend-GNOME/Frontend.cs:464 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "The front-end has lost the connection to the server.\n" " Do you want to reconnect now?" #: ../src/Frontend-GNOME/Frontend.cs:479 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Reconnecting to the server has failed.\n" "Do you want to try again?" #: ../src/Frontend-GNOME/Frontend.cs:580 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "The server has lost connection to the front-end.\n" " Do you want to reconnect now?" #: ../src/Frontend-GNOME/NotifyManager.cs:229 msgid "Show" msgstr "Show" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:62 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:238 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protocol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:63 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Hostname" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:166 #, fuzzy msgid "Unable to load server: " msgstr "Unable to add server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:244 msgid "Person / Private" msgstr "Person / Private" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:245 msgid "Group / Public" msgstr "Group / Public" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:70 msgid "Engine Assistant - Smuxi" msgstr "Engine Assistant - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Add Smuxi Engine" msgstr "Add Smuxi Engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:94 msgid "Edit Smuxi Engine" msgstr "Edit Smuxi Engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:203 msgid "Credentials" msgstr "Credentials" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:265 msgid "Now you can use the Smuxi Engine" msgstr "Now you can use the Smuxi Engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:268 msgid "Thank you" msgstr "Thank You" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:285 msgid "An engine with this name already exists! Please specify a different one." msgstr "An engine with this name already exists! Please specify a different one." #: ../src/Frontend-GNOME/Views/MessageTextView.cs:198 #, csharp-format msgid "Day changed to {0}" msgstr "Day changed to {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:123 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:133 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Invalid filter regex: '{0}'. Reason: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:200 msgid "Are you sure you want to delete the selected filter?" msgstr "Are you sure you want to delete the selected filter?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:246 #, fuzzy msgid "Protocol / Server" msgstr "Protocol" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:253 msgid "Chat Type" msgstr "Chat Type" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:287 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:288 msgid "Event" msgstr "Event" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:295 msgid "Type" msgstr "_Type:" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:321 msgid "Pattern" msgstr "Pattern" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:241 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Retrieving user list for {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:288 msgid "done." msgstr " done." #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:303 msgid "Person" msgstr "Person" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:68 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:184 msgid "Are you sure you want to delete the selected server?" msgstr "Are you sure you want to delete the selected server?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:274 #, fuzzy msgid "Unable to edit server: " msgstr "Unable to add server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:34 msgid "Find" msgstr "Find" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:54 msgid "_Search for:" msgstr "_Search for:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:83 msgid "_Match Case" msgstr "_Match case" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:95 msgid "Search _Backwards" msgstr "Search _Backwards" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:107 msgid "_Wrap Around" msgstr "_Wrap around" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:120 msgid "Use _Regular Expressions" msgstr "Use _Regular Expressions" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:32 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Find Group Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:79 msgid "_Name:" msgstr "_Name:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:24 msgid "Smuxi - Quick Connect" msgstr "Smuxi - Quick Connect" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:487 msgid "Nicknames:" msgstr "Nicknames:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1622 msgid " User List Position " msgstr " User List Position " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1633 msgid " Channel " msgstr " Channel " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1844 msgid "Channel Filters" msgstr "Channel Filters" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1861 msgid "User Filters" msgstr "User Filters" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "Use _SSH Tunnel" msgstr "Use _SSH Tunnel" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:70 msgid "Enables the use of SSH for the connection. This has a small performance impact, but is more secure and required when using NAT or port-based firewalls" msgstr "Enables the use of SSH for the connection. This has a small performance impact, but is more secure and required when using NAT or port-based firewalls" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:149 msgid "SSH _Host:" msgstr "SSH _Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:160 msgid "DNS or IP address and port of the SSH server" msgstr "DNS or IP address and port of the SSH server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:187 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:146 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:200 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS or IP address and port of the Smuxi server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:213 msgid "_Smuxi Host:" msgstr "_Smuxi Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:68 msgid "_SSH Username: (optional)" msgstr "_SSH Username: (optional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:91 msgid "Username which will be used to log into the SSH server" msgstr "Username which will be used to log into the SSH server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:111 msgid "_SSH Password: (optional)" msgstr "_SSH Password: (optional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:135 msgid "Password which will be used to log into the SSH server. The password is optional if SSH key authorization is used (via Pageant from the PuTTY tools)." msgstr "Password which will be used to log into the SSH server. The password is optional if SSH key authorization is used (via Pageant from the PuTTY tools)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:156 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:215 msgid "_Username:" msgstr "_Username:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:179 msgid "Username which will be used to log into the Smuxi server" msgstr "Username which will be used to log into the Smuxi server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:199 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:225 msgid "_Password:" msgstr "_Password:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:223 msgid "Password of the user" msgstr "Password of the user" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:243 msgid "_Verify Password:" msgstr "_Verify Password:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:267 msgid "Repeat the password for verification" msgstr "Repeat the password for verification" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:44 msgid "_Engine Name:" msgstr "_Engine Name:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:67 msgid "Profile name of the new engine" msgstr "Profile name of the new engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:88 msgid "_Default Engine:" msgstr "_Default Engine:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:99 msgid "Use as new default engine" msgstr "Use as new default engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:112 msgid "If enabled, the current engine will be the default next time Smuxi is started" msgstr "If enabled, the current engine will be the default next time Smuxi is started" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:26 msgid "Smuxi - Open Chat" msgstr "Smuxi - Open Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:69 msgid "_Type:" msgstr "_Type:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:87 #, fuzzy msgid "_Network:" msgstr "Network:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:205 msgid "_Hostname:" msgstr "_Hostname:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:235 msgid "_Protocol:" msgstr "_Protocol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:254 msgid "_On Connect Commands:" msgstr "_On Connect Commands:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:265 msgid "_Ignore Commands" msgstr "_Ignore Commands" #~ msgid "German" #~ msgstr "German" #~ msgid "Spanish" #~ msgstr "Spanish" #~ msgid "British English" #~ msgstr "British English" #~ msgid "French" #~ msgstr "French" #~ msgid "Italian" #~ msgstr "Italian" #~ msgid "_Edit" #~ msgstr "_Edit" #~ msgid "Joins" #~ msgstr "Joins" #~ msgid "Parts" #~ msgstr "Parts" #~ msgid "Quits" #~ msgstr "Quits" #~ msgid "Unknown Command: {0}" #~ msgstr "Unknown Command: {0}" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #~ msgid "gtk-ok" #~ msgstr "gtk-ok" #~ msgid "#" #~ msgstr "#" #~ msgid "Syncing chat persons of {0}..." #~ msgstr "Syncing users for {0}..." #~ msgid "localhost" #~ msgstr "localhost" #~ msgid "smuxi - Preferences" #~ msgstr "Smuxi - Preferences" #~ msgid "Smuxi's first start" #~ msgstr "Smuxi's first start" #~ msgid "" #~ "Welcome to the smuxi\n" #~ "You started smuxi for the first time and it needs some answers from you.\n" #~ "\n" #~ "Click \"Forward\" to begin." #~ msgstr "" #~ "Welcome to the Smuxi\n" #~ "You started Smuxi for the first time and it needs some answers from you.\n" #~ "\n" #~ "Click \"Forward\" to begin." #~ msgid "Local" #~ msgstr "Local" #~ msgid "Remote" #~ msgstr "Remote" #~ msgid "When smuxi is started which mode it should use by default" #~ msgstr "When Smuxi is started which mode should it use by default" #~ msgid "Now you can use smuxi" #~ msgstr "Now you can use Smuxi" #~ msgid "First Start Druid" #~ msgstr "First Start Druid" #~ msgid "DNS or IP address of the smuxi engine" #~ msgstr "Smuxi engine DNS or IP address" #~ msgid "TCP port of the smuxi engine" #~ msgstr "Smuxi engine TCP port" #~ msgid "_Channel:" #~ msgstr "_Channel:" #~ msgid "" #~ ".NET Remoting Channel which will be used for communication\n" #~ "between the frontend and the engine" #~ msgstr "" #~ ".NET Remoting Channel used for communication\n" #~ "between the front-end and the engine" #~ msgid "_Formatter:" #~ msgstr "_Formatter:" #~ msgid ".NET Remoting Data Formatter" #~ msgstr ".NET Remote Data Formatter" #~ msgid "Opening URL ({0}) failed." #~ msgstr "Opening URL ({0}) failed." #~ msgid "Tray" #~ msgstr "Tray" smuxi-1.1/po-Frontend-GNOME/cs.po0000664000175000017500000013360714011526464017340 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Ondřej Hošek , 2013-2015 # Marek Černocký , 2016, 2017, 2020 # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2020-09-04 11:27+0000\n" "PO-Revision-Date: 2020-11-16 20:11+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Předvolby Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Použít tuto přezdívku. Můžete zvolit více přezdívek (oddělených mezerami), " "které se použijí jako náhradní v případě, že první přezdívka nebude " "dostupná. Ve výchozím nastavení budou použity náhradní přezdívky $nick_ a " "$nick__." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Jedna či více přezdívek:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Uživatelské jméno:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Skutečné jméno:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kódování:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Automaticky převádět znaky UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Obecné" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Typ:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Hostitel:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Heslo:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Zobrazit heslo" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Síťová proxy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Příkazy při připojení:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Příkazy při spuštění:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globální příkazy" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Připojení" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Formát data a času:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Vyrovnávací paměť řádků:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Vyrovnávací paměť řádků výkonné části:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = sekundy\n" "mm = minuty\n" "hh = hodiny (01 – 12)\n" "HH = hodiny (00 – 23)\n" "tt = dop./odp.\n" "\n" "dd = den\n" "MM = měsíc\n" "yy/yyyy = rok" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Typ ukládání:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Počet dočasných řádků ve vyrovnávací paměti:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Počet trvalých řádků ve vyrovnávací paměti:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Vyrovnávací paměť zpráv" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Zahazovat barvy" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Zahazovat formátování" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Zahazovat UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Zobrazit pokročilá nastavení" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Pokročilé" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Obecné" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Nahoře" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Dole" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Vlevo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Vpravo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Žádné" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Umístění karet " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Zvýraznit" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivita" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Žádná aktivita" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Barvy záložek " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Automaticky přepnout do nově otevřeným pokeců s jednotlivci" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Automaticky přepnout do nově otevřených skupinových pokeců" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Strom" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Znak dokončování:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Znak příkazu:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Velikost historie příkazů:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Dokončování ve stylu Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Vstupní pole " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Vstup" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Barvy přezdívek" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Umístění seznamu osob " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Potlačit" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Font " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Umístění tématu " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Popředí" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Pozadí" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Barva " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Režim zalamování:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Pokec " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Zvýrazňovat slova:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Pípnout při zvýraznění" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Zvýraznění " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Výstup" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Povolit" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Zobrazovat vždy" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Zobrazovat, když je okno minimalizováno" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Zobrazovat, když je okno zavřeno" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ikona oznamovací oblasti " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Zobrazit Smuxi v nabídce zpráv" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Nabídka zpráv" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Zobrazit vyskakovací upozornění" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Vyskakovací oznámení" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Oznámení" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "Roz_hraní" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servery" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtry" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Povoleno" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Zaznamenávat filtrované zprávy" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "Přih_lašování" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Pokec IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Klient IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Pokecejte si s dalšími lidmi na IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chat;pokec;diskuze;zprávy;rychlé správy;im;gnome;gtk;irc;twitter;facebook;" "gtalk;xmpp;jabber;campfire;jabber;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Pokecejte si s dalšími lidmi na IRC, Twitteru, Jabberu a Campfiru" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi je distribuovaný, uživatelsky přívětivý klient s otevřeným zdrojovým " "kódem pro pokec přes IRC, Twitter, Jabber/XMPP, Campfire a JabbR od SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Inspirován kombinací screenu a irssi, má Smuxi oddělitelný server (nebo jako " "„normální“ klient), který zůstává připojen, i když uživatel zrovna připojen " "není, a dovoluje připojení a synchronizaci několika uživatelských rozhraní " "Smuxi najednou. Chová se tedy podobně jako screen+irssi nebo vyhazovač IRC, " "ale elegantněji a mocněji." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Hlavní okno s kanálem IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:71 msgid "translator-credits" msgstr "" "Michal Simunek \n" "Marek Černocký " #: ../src/Frontend-GNOME/AboutDialog.cs:84 msgid "Smuxi Website" msgstr "Webové stránky Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Problém, zkouší se to znovu…" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi se zhroutil, protože obdržel nezpracovatelný požadavek!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Zde je výpis zásobníku. Tuto chybu prosím nahlaste!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Nahlásit chybu" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Výkonná část nebyla nalezena." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Správa výkonné části" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Vyberte výkonnou část Smuxi, ke které se chcete připojit" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Výkonná část:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Používat režim pomalého spojení" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Místní výkonná část" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Vyberte si prosím výkonnou část!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Vaše uživatelské rozhraní není kompatibilní s výkonnou částí!\n" "Verze výkonné části: {0} Verze uživatelského rozhraní: {1}\n" "Protokol výkonné části: {2} Protokol uživatelského rozhraní: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Během připojování k výkonné části se vyskytla chyba!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Adresa URL výkonné části: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Chyba: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Opravdu si přejete odstranit výkonnou části „{0}“?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Chystáte se vložit {0} řádků. Chcete pokračovat?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Příkazy uživatelské části" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Zapnout ladicí výstup" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Zobrazit tuto nápovědu" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Volby:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Připojit k výkonné části" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Otevřít v Smuxi zadaný odkaz" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Spustit novou instanci Smuxi, případnou starou ignorovat" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Přenáší se odkaz do již běžící instance Smuxi…" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Přenáší se již běžící instance Smuxi do uživatelské části…" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} uživatelů" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Litujeme, ale zatím není podporováno!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Název" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Téma" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Vyhledávání skupinových pokeců bez filtru není doporučeno. Nemusí vždy " "fungovat, nebo zabere hodně času.\n" "Přejete si pokračovat?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Chyba při přijmu seznamu skupinových pokeců ze serveru." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Odpojen od výkonné části." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Obnovuje se připojení k výkonné části… (pokus {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Způsobeno: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Byla zjištěna kritická chyba kvůli nekompatibilitě protokolu se " "smuxi-server.\n" "\n" "Nainstalujte prosím na uživatelskou stranu Mono, které je ve shodě se " "smuxi-server.\n" "\n" "Více informací o tomto problému můžete najít zde (odkaz je v angličtině):\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Uživatelská část ztratila spojení se serverem.\n" "Chcete se nyní znovu připojit?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Opětovné připojení k serveru selhalo.\n" "Chcete to zkusit znovu?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Server ztratil spojení s uživatelskou částí.\n" "Chcete se nyní znovu připojit?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Zobrazit" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protokol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Hostitel" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Nelze načíst server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Osobní / soukromý" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Skupinový / veřejný" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Průvodce výkonnou částí – Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Přidat výkonnou část Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Upravit výkonnou část Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Připojení" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Pověření" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Nyní můžete používat tento výkonnou část Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Děkujeme" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Výkonná část s tímto názvem již existuje. Zadejte prosím jiný název." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Zadejte, kterému pokecu se připojit" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:155 msgid "About Smuxi" msgstr "O Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:159 msgid "Preferences" msgstr "Předvolby" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:276 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Nelze přidat server: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:401 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Přepnutím na místní výkonnou část se odpojíte od aktuálního serveru!\n" "Opravdu si přejete pokračovat?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:445 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Přepnutím na vzdálený server část se odpojíte od aktuální výkonné části!\n" "Opravdu si přejete pokračovat?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Den se změnil z {0} na {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Den se změnil na {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Neplatný regulární výraz pro filtr: „{0}“. Příčina: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Opravdu si přejete smazat vybraný filtr?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Síť" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokol / server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Typ pokecu" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normální" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Událost" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Typ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Vzor" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Nepoužívat proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Podle systému" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Uložit" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Přidat" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Nepodporováno" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Režim pomalého spojení je aktivní: nesynchronizuji zprávy." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Zobrazovat _nabídkovou lištu" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Získává se seznamu uživatelů pro {0}…" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "hotovo." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Znovu se připojit" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Zavření tohoto pokecového protokolu zavře také všechny otevřené pokecy na " "něm připojené!\n" "Opravdu si přejete pokračovat?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Opravdu si přejete smazat vybraný server?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Nelze upravit server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Najít" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Hledat:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Výsledky hledání" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Hledat pozpát_ku" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Přecházet přes okraj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Použít re_gulární výrazy" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi – Najít skupinový pokec" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Název:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Vstoupit" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "S_erver" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Pokec" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "Vý_konná část" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "Zo_brazit" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "Nápo_věda" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Připojit" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Otevřít záznam" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Předvolby" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "U_končit" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Připojit" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "Přid_at" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "Spr_avovat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Otevřít / vstoupit do pokecu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Najít skupinový pokec" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Vyčistit všechnu aktivitu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Následující pokec" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Předchozí pokec" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Zavřít" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "Po_užívat místní výkonnou část" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "Přid_at vzdálenou výkonnou část" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Přepnout vzdálenou výkonnou část" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Z_nakový režim" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Režim _procházení" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Zobrazovat _stavovou lištu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Celá obrazovka" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_O aplikaci" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Najít skupinový pokec" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Webové stránky" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Zobrazovat nás_trojovou lištu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi – připojení" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi – předvolby" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Přezdívky:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Karty" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Umístění seznamu uživatelů " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanál " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtry kanálů" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtry uživatelů" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Používat tunel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Povolí používání SSH pro toto připojení. Na výkon to má " "malý dopad, ale je to mnohem bezpečnější a potřebné, pokud používáte NAT " "nebo firewally založené na portech" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Hostitel SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "DNS nebo adresa IP a port serveru SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "DNS nebo adresa IP a port serveru Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Hostitel _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "Uživatelské jméno pro _SSH: (volitelné)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Uživatelské jméno pro přihlášení k serveru SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "Heslo pro _SSH: (volitelné)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Heslo pro připojení k serveru SSH. Není nutné jej " "zadat, když se ověřuje pomocí klíče SSH (viz níže)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "Soubor s klíčem _SSH: (nepovinný)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Výběr souboru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Soubor se soukromým klíčem SSH, který se bude používat " "při spojování se serverem SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Uživatelské jméno:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Uživatelské jméno pro přihlášení k serveru Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Heslo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Heslo uživatele" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Ověřit heslo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Zopakujte heslo pro ověření" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Vítejte v průvodci nastavení výkonné části Smuxi.\n" "Před použitím výkonné části bude třeba, aby jste zadali některé informace.\n" "\n" "Začněte kliknutím na „Pokračovat“." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Název výkonné části:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Název profilu nové výkonné čísti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Výchozí výkonná část:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Použít jako novou výchozí výkonnou část" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Pokud je zaškrtnuto, aktuální výkonná část bude použita " "jako výchozí při příštím spuštění Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi – otevření pokecu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Typ" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi – Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Hostitel:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Síť:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Přezdívka:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "P_rotokol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Po spuštění se automaticky připojit k serveru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Používat šifrování" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Ověřit certifikát serveru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Příkazy při připojení:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Ignorovat příkazy" smuxi-1.1/po-Frontend-GNOME/zh_CN.po0000664000175000017500000013250014011526464017723 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dian Li , 2012-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2017-09-23 18:02+0000\n" "Last-Translator: Dian Li \n" "Language-Team: Chinese (China) (http://www.transifex.com/meebey/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi 偏好设置" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "要使用的昵称。您可以指定多个昵称(用空格分隔)作为首个选项不可用时的候选项。默认使用 $昵称_ 和 $昵称__ 作为候选项。" #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "昵称:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "用户名:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "真名:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "编码:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "自动转换 UTF-8 字符" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "全局" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "类型:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "主机:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "密码:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "端口:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "显示密码" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "网络代理" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "连接时命令:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "启动时命令:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "全局命令" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "连接(_O)" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "时间戳格式:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "缓冲行数:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "引擎缓冲行数:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = 秒数\nmm = 分数\nhh = 小时数 (01 - 12)\nHH = 小时数 (00 - 23)\ntt = AM/PM\n\ndd = day\nMM = month\nyy/yyyy = year" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "持久类型:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "临时缓冲行数:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "持久缓冲行数:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "信息缓冲" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "去除颜色" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "去除格式" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "去除 UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "显示高级设置" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "高级" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "全局" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "顶部" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "底部" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "左边" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "右边" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "无" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " 标签位置 " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "高亮" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "活动" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "无活动" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "加入/离开/模式" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " 标签颜色 " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "自动切换到新打开的单人聊天" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "自动切换到新打开的群组聊天" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "树" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "完成字符:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "命令字符:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "命令历史数:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash 式完成" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " 预留字段 " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "输入" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "昵称颜色" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " 成员列表位置 " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "覆盖" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " 字体 " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " 主题位置 " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "前景" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "背景" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " 颜色 " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_自动换行模式:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " 聊天 " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "高亮单词:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "高亮时鸣叫" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " 高亮 " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "输出" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "启用" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "总是显示" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "当窗口最小化时显示" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "当窗口关闭时显示" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " 通知区域图标 " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "在消息菜单中显示 Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "消息菜单" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "显示通知弹出" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "通知弹出" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "通知" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "界面(_I)" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "服务器(_S)" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "过滤器(_F)" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "启用" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "记录经过滤的消息" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "历史(_L)" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - 服务器" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "启动时自动连接到服务器" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "协议:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "网络:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "主机名:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC 聊天" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi IRC 客户端" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "和 IRC 上的其他人聊天" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "聊天;通讯;chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "与 IRC、Twitter、Jabber 及 Campfire 的用户聊天" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi 是一款开源、简单易用的分布式聊天客户端,兼容 IRC、Twitter、Jabber/XMPP、Campfire 及 SignalR 的 JabbR。" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "受 screen 及 irssi 的启发,Smuxi 支持可插拔的服务器(也可以“正常的”客户端模式运行),可在您脱机时保持连接,也允许连接多个 Smuxi 前端并保持同步。这与 screen+irssi 或 IRC 转发器类似,但更为优雅及强大。" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "显示某 IRC 频道的主窗口" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Dean Lee " #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Smuxi 网站" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oops,我又做了一次..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi 崩溃了,因为遇到了未处理的意外!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "这是 stacktrace,请报告错误!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "报告错误(_R)" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "引擎未找到。" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "引擎管理器" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "选择希望连接到的 Smuxi 引擎" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "引擎:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "使用低带宽模式" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "本地引擎" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "请选择一个引擎!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "您的前端与引擎不兼容!\n引擎版本: {0} 前端版本: {1}\n引擎协议: {2} 前端协议: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "连接到引擎时出现了一个错误!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "引擎 URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "错误: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "您确实要删除引擎 \"{0}\" 吗?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "您正在粘贴 {0} 行。是否继续?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "前端命令" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "启用调试输出" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "显示本帮助" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "选项:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "连接到引擎" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "在 Smuxi 中打开指定链接" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "启动新的 Smuxi 实例,忽略现有的shi'li" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "正在将链接传递给已经在运行的 Smuxi shi'li..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "正在将已在运行的 Smuxi 实例切回至前景..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} 个用户" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "抱歉,尚未实现!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "字符" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "单词" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "本设置指定 Smuxi 应将聊天消息存储在内存中 (易失) 还是磁盘上 (持久)。\n对于持久存储,您可以选择对象数据库 Db4o 或关系数据库 SQLite。\nDb4o 后端存在已知问题,如高内存、CPU 占用,甚至可能导致崩溃,因此已废弃。\nSQLite 后端没有已知的性能或稳定性问题,因此推荐该设置。" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "持久: SQLite (推荐)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "持久: Db4o (废弃)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "持久 (预览)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "临时" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "无代理" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "系统默认" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "连接" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "界面" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "服务器" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "过滤器" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "历史" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "昵称字段不能为空。" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "高亮正则表达式无效: '{0}'。原因: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "名称" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "主题" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "不建议不用过滤器搜索群组聊天。可能要耗费一些时间,也可能无法完成搜索。\n您是否打算继续?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "从服务器装载群组聊天列表出错。" #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "从引擎断开连接。" #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "正在重新连接到引擎... (第 {0} 次尝试)" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "原因: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "前端与服务器之间的连接已丢失。\n是否希望现在重新连接?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "重新连接到服务器失败。\n是否重试?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "服务器与前端之间的连接已丢失。\n是否希望现在重新连接?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "显示" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "协议" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "主机名" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "无法加载服务器: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "成员 / 私聊" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "群组 / 公开" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "引擎助手 - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "添加 Smuxi 引擎" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "编辑 Smuxi 引擎" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "证书" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "现在您可以使用该 Smuxi 引擎了" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "谢谢您" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "已存在同名引擎! 请另外指定一个。" #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "输入要加入的聊天" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "关于 Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "偏好设置" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "无法添加服务器: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "切换到本地引擎会将您与当前引擎断开!\n您确实大赛这样做吗?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "切换到远程引擎会将您与当前引擎断开!\n您确实大赛这样做吗?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "天数由 {0} 变为 {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "日期已改为 {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "无效的过滤器正则表达式: '{0}'。原因: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "您确实要删除选中的过滤器?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "协议 / 服务器" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "聊天类型" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "普通" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "事件" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "类型" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "匹配" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "低带宽模式未启用: 未同步任何信息。" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "显示菜单栏(_M)" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "正在检索 {0} 的用户列表..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "完成。" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "重新连接" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "关闭该协议将同时关闭所有连接到它的开放聊天!\n您确实希望这么做吗?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "您确实打算删除选中的服务器吗?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "无法编辑服务器: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "查找" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "搜索(_S):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "匹配大小写(_M)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "向上搜索(_B)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "全文搜索(_W)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "使用正则表达式(_R)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - 查找群组聊天" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "名称(_N):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "加入" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "服务器(_S)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "聊天(_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "引擎(_E)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "视图(_V)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "帮助(_H)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "连接" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "打开聊天历史" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "偏好设置(_P)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "退出(_Q)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "连接(_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "添加(_A)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "管理(_M)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "打开(_O) / 加入聊天" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "查找群组聊天(_F)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "清除所有活动(_L)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "下一个聊天(_N)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "上一个聊天(_P)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "关闭(_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "使用本地引擎(_U)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "添加远程引擎(_A)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "切换远程引擎" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "插入模式(_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "浏览模式(_B)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "显示状态栏(_S)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "全屏(_F)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "关于(_A)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "查找群组聊天" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "网站(_W)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "显示工具栏(_T)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - 连接" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - 首选项" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "昵称:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "标签" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " 用户列表位置 " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " 频道 " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "频道过滤器" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "用户过滤器" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "使用 _SSH 隧道" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "为连接启用 SSH。这对性能有一定影响,但更安全,且使用 NAT 或者基于端口的防火墙时必需" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SS_H 主机:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "SSH 服务器的 DNS 或者 IP 地址与端口" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "端口(_P):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "Smuxi 服务器的 DNS 或者 IP 地址与端口" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi 主机:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH 用户名: (可选)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "用于登录 SSH 服务器的用户名" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH 密码: (可选)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "将用于登录 SSH 服务器的密码。若使用了 SSH 密钥(参见下方选项),则密码可选。" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "_SSH 密钥文件: (可选)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "选择文件" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "SSH 私钥文件将用于登录 SSH 服务器" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "用户名(_U):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "将用于登录 Smuxi 服务器的用户名" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "密码(_P):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "用户密码" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "验证密码(_V):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "请再次输入密码以供验证" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "欢迎使用 Smuxi 引擎配置助手。\n在您能够使用引擎之前,需要输入一些信息。\n\n点击“前进”开始。" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "引擎名称(_E):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "新引擎配置文件的名称" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "默认引擎(_D):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "用作新的默认引擎" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "如果启用,Smuxi 下次启动时当前引擎将作为默认引擎" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - 开放聊天" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_类型:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_主机名:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_网络:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "昵称:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_协议:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "使用加密" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "验证服务器证书" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "连接时命令(_O):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "忽略命令(_I)" smuxi-1.1/po-Frontend-GNOME/sk.po0000664000175000017500000011167414011526464017350 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:22+0100\n" "PO-Revision-Date: 2011-12-29 08:42+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid " Chat " msgstr " Rozhovor " #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid " Color " msgstr " Farba " #: ../glade/smuxi-frontend-gnome.glade.h:3 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Vstupné pole " #: ../glade/smuxi-frontend-gnome.glade.h:4 msgid " Font " msgstr " Písmo " #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Zvýraznenie " #: ../glade/smuxi-frontend-gnome.glade.h:6 msgid " Notification Area Icon " msgstr " Ikona oznamovacej oblasti " #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid " Person List Position " msgstr " Umiestnenie zoznamu osôb " #: ../glade/smuxi-frontend-gnome.glade.h:8 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Farby kariet " #: ../glade/smuxi-frontend-gnome.glade.h:9 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Umiestnenie kariet " #: ../glade/smuxi-frontend-gnome.glade.h:10 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Umiestnenie témy " #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Advanced" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "General" msgstr "Všeobecné" #: ../glade/smuxi-frontend-gnome.glade.h:13 msgid "Global Commands" msgstr "Globálne príkazy" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Message Buffer" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:15 msgid "Messaging Menu" msgstr "Ponuka správ" #: ../glade/smuxi-frontend-gnome.glade.h:16 msgid "Network Proxy" msgstr "Proxy siete" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Notification Popups" msgstr "Vyskakovacie okno upozornení" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivita" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:209 msgid "Automatically connect to server at startup" msgstr "Po spustení sa automaticky pripojiť k serveru" #: ../glade/smuxi-frontend-gnome.glade.h:20 msgid "Background" msgstr "pozadie" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Dokončovanie v štýle Bash" #: ../glade/smuxi-frontend-gnome.glade.h:22 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Pípnuť pri zvýraznení" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:23 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Dole" #: ../glade/smuxi-frontend-gnome.glade.h:24 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Pamätať si riadky:" #: ../glade/smuxi-frontend-gnome.glade.h:25 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Pripojenie" #: ../glade/smuxi-frontend-gnome.glade.h:26 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Znak príkazu:" #: ../glade/smuxi-frontend-gnome.glade.h:27 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Počet príkazov v histórii:" #: ../glade/smuxi-frontend-gnome.glade.h:28 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Znak dokončovania:" #: ../glade/smuxi-frontend-gnome.glade.h:29 msgid "Enable" msgstr "Povoliť" #: ../glade/smuxi-frontend-gnome.glade.h:30 msgid "Enabled" msgstr "Povolené" #: ../glade/smuxi-frontend-gnome.glade.h:31 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kódovanie:" #: ../glade/smuxi-frontend-gnome.glade.h:32 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Pamätať si riadky enginu:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Foreground" msgstr "popredie" #: ../glade/smuxi-frontend-gnome.glade.h:34 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Všeobecné" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Zvýrazňovanie" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Zvýrazniť slová:" #: ../glade/smuxi-frontend-gnome.glade.h:37 msgid "Host:" msgstr "Hostiteľ:" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Hostname:" msgstr "Názov hostiteľa:" #: ../glade/smuxi-frontend-gnome.glade.h:39 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Vstup" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Vľavo" #: ../glade/smuxi-frontend-gnome.glade.h:42 msgid "Log Filtered Messages" msgstr "Zaznamenávať filtrované správy" #: ../glade/smuxi-frontend-gnome.glade.h:43 msgid "Network:" msgstr "Sieť:" #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Farby prezývok" #: ../glade/smuxi-frontend-gnome.glade.h:45 msgid "Nickname(s):" msgstr "Prezývka(y)" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Žiadna aktivita" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Žiadne" #: ../glade/smuxi-frontend-gnome.glade.h:48 msgid "Notification" msgstr "Upozornenie" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Príkazy pri pripojení:" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Príkazy pri spustení:" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Výstup" #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Override" msgstr "Potlačiť" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Password:" msgstr "Heslo:" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Persistency Type:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:55 msgid "Persistent Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:56 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:57 msgid "Protocol:" msgstr "Protokol:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 msgid "Realname:" msgstr "Skutočné meno:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Vpravo" #: ../glade/smuxi-frontend-gnome.glade.h:60 msgid "Show Advanced Settings" msgstr "Zobraziť pokročilé nastavenia" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:170 msgid "Show Password" msgstr "Zobraziť heslo" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid "Show Smuxi in the messaging menu" msgstr "Zobraziť Smuxi v ponuke správ" #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Show always" msgstr "Vždy zobraziť" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid "Show notification popups" msgstr "Zobraziť vyskakovacie okná upozornení" #: ../glade/smuxi-frontend-gnome.glade.h:65 msgid "Show when window is closed" msgstr "Zobraziť ak je okno zatvorené" #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Show when window is minimized" msgstr "Zobraziť ak je okno minimalizované" #: ../glade/smuxi-frontend-gnome.glade.h:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid "Smuxi Preferences" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:69 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Odstrániť farby" #: ../glade/smuxi-frontend-gnome.glade.h:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Odstrániť formátovanie" #: ../glade/smuxi-frontend-gnome.glade.h:71 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Odstrániť UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Karty" #: ../glade/smuxi-frontend-gnome.glade.h:73 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Prezývka ktorá sa použije. Môžete si zvoliť viacero prezývok (oddelených " "medzerami), ktoré sa použijú ako náhradné v prípade, že prvá prezývka nebude" " dostupná. V predvolenom nastavení budú použité náhradné prezývky v tvare " "$prezývka_ a $prezývka__." #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Formát časovej značky:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Hore" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Type:" msgstr "Typ:" #: ../glade/smuxi-frontend-gnome.glade.h:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Používateľské meno:" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Volatile Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtre" #: ../glade/smuxi-frontend-gnome.glade.h:80 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Rozhranie" #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "_Logging" msgstr "_Zaznamenávanie" #: ../glade/smuxi-frontend-gnome.glade.h:82 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servery" #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "_Wrap Mode:" msgstr "Režim _zalamovania:" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = sekundy\n" "mm = minúty\n" "hh = hodiny (01 - 12)\n" "HH = hodiny (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = deň\n" "MM = mesiac\n" "yy/yyyy = rok" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 msgid "Chat with other people on IRC" msgstr "Rozprávajte sa s ostatnými ľuďmi na IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC Chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Smuxi IRC Client" msgstr "IRC klient Smuxi" #: ../src/Frontend-GNOME/AboutDialog.cs:60 msgid "translator-credits" msgstr "Tomáš Vadina " #: ../src/Frontend-GNOME/AboutDialog.cs:65 msgid "Smuxi Website" msgstr "Internetová stránka Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Hups, skúsi sa to znova..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Aplikácia Smuxi spadla, pretože dostala nespracovateľnú požiadavku!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Tu je výpis, prosím nahláste túto chybu!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Nahlásiť chybu" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine Manager" msgstr "Správca enginu" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:80 msgid "Select which Smuxi engine you want to connect to" msgstr "Vyberte engine Smuxi ku ktorému sa chcete pripojiť" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:86 msgid "Engine:" msgstr "Engine:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:97 msgid "Use Low Bandwidth Mode" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:121 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:181 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:358 msgid "Local Engine" msgstr "Miestny engine" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:173 msgid "Please select an engine!" msgstr "Prosím vyberte engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:194 #, csharp-format msgid "Your frontend version ({0}) does not match the engine version ({1})!" msgstr "Verzia rozhrania ({0}) nezodpovedá verzii enginu ({1})!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:221 msgid "An error occurred while connecting to the engine!" msgstr "Počas pripájania k enginu sa vyskytla chyba!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:222 #, csharp-format msgid "Engine URL: {0}" msgstr "Adresa enginu: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:225 #, csharp-format msgid "Error: {0}" msgstr "Chyba: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:295 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Naozaj si želáte odstrániť engine \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:443 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Chystáte sa vložiť {0} riadkov. Chcete pokračovať?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:547 msgid "Frontend Commands" msgstr "Príkazy rozhrania" #: ../src/Frontend-GNOME/MainWindow.cs:252 msgid "_File" msgstr "_Súbor" #: ../src/Frontend-GNOME/MainWindow.cs:276 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/MainWindow.cs:280 msgid "_Quick Connect" msgstr "_Rýchle pripojenie" #: ../src/Frontend-GNOME/MainWindow.cs:291 msgid "_Manage" msgstr "Spr_avovať" #: ../src/Frontend-GNOME/MainWindow.cs:298 msgid "_Chat" msgstr "_Rozhovor" #: ../src/Frontend-GNOME/MainWindow.cs:302 msgid "Open / Join Chat" msgstr "Otvoriť / Pripojiť sa k rozhovoru" #: ../src/Frontend-GNOME/MainWindow.cs:308 msgid "_Find Group Chat" msgstr "_Nájsť skupinový rozhovor" #: ../src/Frontend-GNOME/MainWindow.cs:314 msgid "C_lear All Activity" msgstr "_Vymazať všetku aktivitu" #: ../src/Frontend-GNOME/MainWindow.cs:321 msgid "_Next Chat" msgstr "Ď_alší rozhovor" #: ../src/Frontend-GNOME/MainWindow.cs:335 msgid "_Previous Chat" msgstr "P_redchádzajúci rozhovor" #: ../src/Frontend-GNOME/MainWindow.cs:389 msgid "Open Log" msgstr "Otvoriť záznam" #: ../src/Frontend-GNOME/MainWindow.cs:407 msgid "_Engine" msgstr "_Engine" #: ../src/Frontend-GNOME/MainWindow.cs:411 msgid "_Use Local Engine" msgstr "_Použiť miestny engine" #: ../src/Frontend-GNOME/MainWindow.cs:417 msgid "_Add Remote Engine" msgstr "Prid_ať vzdialený engine" #: ../src/Frontend-GNOME/MainWindow.cs:422 msgid "_Switch Remote Engine" msgstr "Pr_epnúť vzdialený engine" #: ../src/Frontend-GNOME/MainWindow.cs:429 msgid "_View" msgstr "Zo_braziť" #: ../src/Frontend-GNOME/MainWindow.cs:433 msgid "_Caret Mode" msgstr "Režim _kurzora" #: ../src/Frontend-GNOME/MainWindow.cs:445 msgid "_Browse Mode" msgstr "Režim _prehliadania" #: ../src/Frontend-GNOME/MainWindow.cs:463 #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:722 msgid "Show _Menubar" msgstr "Zobraziť _ponuku" #: ../src/Frontend-GNOME/MainWindow.cs:494 msgid "_Help" msgstr "_Pomocník" #: ../src/Frontend-GNOME/MainWindow.cs:768 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:225 msgid "Unable to add server: " msgstr "Nie je možné pridať server:" #: ../src/Frontend-GNOME/MainWindow.cs:828 #, csharp-format msgid "Unknown ChatType: {0}" msgstr "Neznámy typ rozhovoru: {0}" #: ../src/Frontend-GNOME/MainWindow.cs:1097 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Prepnutím na miestny engine sa odpojíte od aktuálneho enginu! \n" "Naozaj si želáte pokračovať?" #: ../src/Frontend-GNOME/MainWindow.cs:1139 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Prepnutím na vzdialený engine sa odpojíte od aktuálneho enginu!\n" "Naozaj si želáte pokračovať?" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Prepáčte, ešte nie je podporované!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Znak" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Slovo" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:197 msgid "Volatile" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:199 msgid "Persistent" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:222 msgid "No Proxy" msgstr "Žiadne proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:224 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:307 msgid "System Default" msgstr "Predvolené systémom" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:238 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:140 msgid "Connection" msgstr "Pripojenie" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "Interface" msgstr "Rozhranie" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:246 msgid "Servers" msgstr "Servery" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:253 msgid "Filters" msgstr "Filtre" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:257 msgid "Logging" msgstr "Zaznamenávanie" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:642 msgid "Nicknames(s) field must not be empty." msgstr "Pole s prezývkou nemôže byť prázdne." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:823 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Neplatný výraz pre zvýraznenie: '{0}'. Príčina: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:106 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:271 msgid "Name" msgstr "Názov" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Téma" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Vyhľadávanie skupinových rozhovorov bez filtra nie je odporúčané. Nemusí vždy fungovať, alebo zaberie veľa času.\n" "Želáte si pokračovať?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Chyba pri prijíme zoznamu skupinových rozhovorov zo servera." #: ../src/Frontend-GNOME/Frontend.cs:325 msgid "Disconnected from engine." msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:368 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:465 #, csharp-format msgid "Cause: {0}" msgstr "Spôsobené: {0}" #: ../src/Frontend-GNOME/Frontend.cs:583 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Rozhranie stratilo spojenie so serverom.\n" "Chcete sa teraz znova pripojiť?" #: ../src/Frontend-GNOME/Frontend.cs:602 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Opätovné pripojenie k serveru zlyhalo.\n" "Chcete to skúsiť znova?" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Server stratil spojenie s rozhraním.\n" "Chcete sa teraz znova pripojiť?" #: ../src/Frontend-GNOME/NotifyManager.cs:267 msgid "Show" msgstr "Zobraziť" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:62 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:238 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protokol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:63 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Hostiteľ" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:166 msgid "Unable to load server: " msgstr "Nie je možné nahrať server:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:244 msgid "Person / Private" msgstr "Osobný / Súkromný" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:245 msgid "Group / Public" msgstr "Skupinový / Verejný" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:71 msgid "Engine Assistant - Smuxi" msgstr "Asistent enginu - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:93 msgid "Add Smuxi Engine" msgstr "Pridať engine Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:95 msgid "Edit Smuxi Engine" msgstr "Upraviť engine Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:204 msgid "Credentials" msgstr "Overenia" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:284 msgid "Now you can use the Smuxi Engine" msgstr "Teraz môžete používať Smuxi engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:287 msgid "Thank you" msgstr "Ďakujeme" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:304 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Engine s týmto názvom už exituje! Zadajte prosím iný názov." #: ../src/Frontend-GNOME/Views/MessageTextView.cs:204 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:210 #, csharp-format msgid "Day changed to {0}" msgstr "Deň zmenený na {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:123 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:133 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Neplatný výraz pre filter: '{0}'. Príčina: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:200 msgid "Are you sure you want to delete the selected filter?" msgstr "Naozaj si želáte zmazať vybraný filter?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:246 msgid "Protocol / Server" msgstr "Protokol / Server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:253 msgid "Chat Type" msgstr "Typ rozhovoru" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:287 msgid "Normal" msgstr "Normálny" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:288 msgid "Event" msgstr "Udalosť" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:295 msgid "Type" msgstr "Typ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:321 msgid "Pattern" msgstr "Vzor" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:506 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:245 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Prijímanie zoznamu používateľov pre {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:279 msgid "done." msgstr "hotovo." #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:290 msgid "Person" msgstr "Osoba" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:69 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Zatvorenie tohoto protokolu rozhovoru zatvorí taktiež všetky otvorené rozhovory pripojené na ňom!\n" "Naozaj si želáte pokračovať?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:187 msgid "Are you sure you want to delete the selected server?" msgstr "Naozaj si želáte zmazať vybraný server?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:243 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:277 msgid "Unable to edit server: " msgstr "Nie je možné upraviť server:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Nájsť" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Hľadať:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Rozlišovať veľkosť" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Hľadať s_pätne" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Prenášať te_xt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Použiť _regulárne výrazy" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Nájsť skupinový rozhovor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Názov:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Quick Connect" msgstr "Smuxi - Rýchle pripojenie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Predvoľby" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Prezývky:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Umiestnenie zoznamu používateľov " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanál " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtre kanálov" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtre používateľov" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Použiť tunel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Povolí používať SSH pre toto pripojenie. Má to malý " "dopad na výkon, ale je to oveľa bezpečnejšie a je to nutné pokiaľ používate " "NAT alebo firewally založené na portoch" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Hostiteľ SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS alebo IP adresa a port SSH servera" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:129 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS alebo IP adresa a port servera Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Hostiteľ _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH používateľské meno: (voliteľné)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "" "Používateľské meno pre prihlásenie k SSH serveru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH heslo: (voliteľné)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:188 msgid "_Username:" msgstr "_Používateľ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Používateľské meno pre prihlásenie k serveru " "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:87 msgid "_Password:" msgstr "H_eslo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Heslo používateľa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Overiť heslo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Zopakujte heslo pre overenie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Vitajte v asistentovi nastavenia enginu Smuxi.\n" "Pred použitím enginu bude potrebné, aby ste zadali niektoré informácie.\n" "\n" "Začnite kliknutím na \"Pokračovať\"." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Názov enginu:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Názov profilu nového enginu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Predvolený engine:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Použiť ako nový predvolený engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "" "Ak je zaškrtnuté, aktuálny engine bude použitý ako " "predvolený pri ďalšom spustení Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Otvoriť rozhovor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Typ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:54 msgid "_Hostname:" msgstr "_Hostiteľ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:75 msgid "_Network:" msgstr "_Sieť:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:198 msgid "_Protocol:" msgstr "P_rotokol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:222 msgid "Use Encryption" msgstr "Použiť šifrovanie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:234 msgid "Validate Server Certificate" msgstr "Overiť certifikát servera" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:254 msgid "_On Connect Commands:" msgstr "Príkazy pri _pripojení:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:265 msgid "_Ignore Commands" msgstr "_Ignorovať príkazy" smuxi-1.1/po-Frontend-GNOME/el.po0000664000175000017500000015563614011526464017341 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-02 11:45+0000\n" "PO-Revision-Date: 2015-07-05 21:33+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@lists.gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Προτιμήσεις Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Το ψευδώνυμο που θα χρησιμοποιηθεί. Μπορείτε να ορίσετε πρόσθετα ψευδώνυμα " "(χωριζόμενα με κενά) που θα χρησιμοποιηθούν ως εναλλακτικά όταν η πρώτη " "επιλογή δεν είναι διαθέσιμη. Από προεπιλογή τα $nick_ και $nick__ θα " "χρησιμοποιηθούν ως εναλλακτικά." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Ψευδώνυμα:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Όνομα χρήστη:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Πραγματικό όνομα:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Κωδικοποίηση:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Αυτόματη μετατροπή χαρακτήρων σε UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Γενικά" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Τύπος:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Οικοδεσπότης:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Θύρα:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Εμφάνιση κωδικού πρόσβασης" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Διαμεσολαβητής δικτύου" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Εντολές κατά τη σύνδεση:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Εντολές κατά την εκκίνηση:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Καθολικές εντολές" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "Σύ_νδεση" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Μορφή χρονικής σήμανσης:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Βοηθητικές γραμμές:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Βοηθητικές γραμμές μηχανής:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = δευτερόλεπτα\n" "mm = λεπτά\n" "hh = ώρες (01 - 12)\n" "HH = ώρες (00 - 23)\n" "tt = ΠΜ/ΜΜ\n" "\n" "dd = ημέρα\n" "MM = μήνας\n" "yy/yyyy = έτος" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Τύπος μονιμότητας:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Μη διατηρήσιμες βοηθητικές γραμμές:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Μόνιμες βοηθητικές γραμμές:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Βοηθητικό μήνυμα" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Αφαίρεση χρωμάτων" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Αφαίρεση μορφοποιήσεων" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Αφαίρεση UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Εμφάνιση προχωρημένων ρυθμίσεων" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Προχωρημένα" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Γενικά" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Επάνω" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Κάτω" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Αριστερά" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Δεξιά" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Kανένα" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Θέση καρτελών " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Επισήμανση" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Δραστηριότητα" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Χωρίς δραστηριότητα" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Ένωση/Τμήμα/Κατάσταση" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Χρώματα καρτέλας " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Αυτόματη μετάβαση σε τις νέες ανοικτές συνομιλίες ατόμων" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Αυτόματη μετάβαση σε νέες ανοικτές ομαδικές συνομιλίες" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Δένδρο" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Χαρακτήρας συμπλήρωσης:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Χαρακτήρας εντολής:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Μέγεθος ιστορικού εντολών:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Συμπλήρωση με μορφή Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " πεδίο καταχώρισης " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Είσοδος" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Χρώματα ψευδωνύμου" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Θέση καταλόγου ατόμων " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Αντικατάσταση" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Γραμματοσειρά " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Θεματική θέση " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Προσκήνιο" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Παρασκήνιο" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Χρώμα " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Κατάσταση αναδίπλωσης:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Συνομιλία " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Λέξεις επισήμανσης:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Ήχος στην επισήμανση" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Επισήμανση " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Έξοδος" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Ενεργοποίηση" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Να εμφανίζεται πάντα" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Να εμφανίζεται όταν το παράθυρο είναι ελαχιστοποιημένο" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Να εμφανίζεται όταν το παράθυρο είναι κλειστό" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Εικονίδιο περιοχής ειδοποιήσεων " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Να εμφανίζεται το Smuxi στο μενού μηνυμάτων" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Μενού μηνυμάτων" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Να εμφανίζονται οι αναδυόμενες ειδοποιήσεις" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Αναδυόμενες ειδοποιήσεις" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Ειδοποίηση" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "Δ_ιεπαφή" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Διακομιστές" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Φίλτρα" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Ενεργοποιημένο" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Ημερολόγιο φιλτραρισμένων μηνυμάτων" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "Καταγρα_φή" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Διακομιστής Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Αυτόματη σύνδεση με τον διακομιστή κατά την εκκίνηση" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Πρωτόκολλο:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Δίκτυο:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Όνομα οικοδεσπότη:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Συνομιλία IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Πελάτης IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Συνομιλία με άλλα άτομα στο IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "συνομιλία;μηνύματα;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campf" "ire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Συνομιλία με άλλα άτομα στο IRC, Twitter, Jabber και Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Το Smuxi είναι ένας εύχρηστος διανεμόμενος πελάτης συνομιλίας ανοικτού " "λογισμικού για IRC, Twitter, Jabber/XMPP, Campfire και JabbR του SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Εμπνεύστηκε από τον συνδυασμό οθόνης και irssi, το Smuxi έχει έναν " "αποσπώμενο διακομιστή (ή όπως ένας \"κανονικός\" πελάτης) που παραμένει " "συνδεμένος όταν δεν είσαστε συνδεδεμένοι και μπορεί να επιτρέψει πολλά " "προσκήνια Smuxi να συνδεθούν και σε συγχρονισμό. Αυτό είναι παρόμοιο με το " "οθόνη+irssi σε bouncers IRC, αλλά πιο κομψός και πιο ισχυρός." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Το κύριο παράθυρο εμφανίζει ένα κανάλι IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "" "Ελληνική μεταφραστική ομάδα του GNOME\n" " Δημήτρης Σπίγγος \n" "Για περισσότερα δείτε: http://gnome.gr" #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Ιστότοπος Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Όπα, το ξανάκανα..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Το Smuxi κατέρρευσε επειδή μια ανεπίλυτη εξαίρεση συνέβη!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Εδώ είναι το ίχνος στοίβας, παρακαλούμε αναφέρτε αυτό το σφάλμα!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "Ανα_φορά σφάλματος" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Δεν βρέθηκε η μηχανή." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Διαχειριστής μηχανής" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Επιλέξτε με ποια μηχανή Smuxi θέλετε να συνδεθείτε" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Μηχανή:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Χρησιμοποιήστε κατάσταση χαμηλού εύρους ζώνης" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Τοπική μηχανή" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Παρακαλούμε επιλέξτε μια μηχανή!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Το προσκήνιο δεν είναι συμβατό με τη μηχανή!\n" "Έκδοση μηχανής: {0} Έκδοση προσκηνίου: {1}\n" "Πρωτόκολλο μηχανής: {2} Πρωτόκολλο προσκήνιου: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Προέκυψε ένα σφάλμα κατά τη σύνδεση με τη μηχανή!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL μηχανής: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Σφάλμα: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Είστε σίγουρος ότι θέλετε να διαγράψετε τη μηχανή \"{0}\";" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Πρόκειται να επικολλήσετε {0} γραμμές. Θέλετε να συνεχίσετε;" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Εντολές προσκηνίου" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Ενεργοποίηση εξόδου αποσφαλμάτωσης" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Εμφάνιση αυτής της βοήθειας" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Επιλογές:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Σύνδεση με τη μηχανή" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Άνοιγμα τον συγκεκριμένο σύνδεσμο στο Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Εκκίνηση ενός νέου στιγμιοτύπου Smuxi και παράβλεψη ενός υφισταμένου" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Πέρασμα συνδέσμου στο ήδη εκτελούμενο στιγμιότυπο Smuxi..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Μεταφορά του ήδη εκτελουμένου στιγμιοτύπου Smuxi στο προσκήνιο..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Χρήστες" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Συγνώμη, δεν έχει ακόμα υλοποιηθεί!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Χαρακτήρας" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Λέξη" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory " "(volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a " "relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can " "even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the " "recommended setting." msgstr "" "Αυτή η ρύθμιση καθορίζει αν το Smuxi πρέπει να αποθηκεύσει τα μηνύματα " "συνομιλιών στη μνήμη (μη διατηρήσιμη) ή στον δίσκο (μόνιμη).\n" "Για τη μόνιμη μπορείτε να επιλέξετε μεταξύ Db4o, μια βάση δεδομένων " "αντικειμένων ή SQLite, μια σχεσιακή βάση δεδομένων.\n" "Το παρασκήνιο Db4o έχει γνωστά προβλήματα όπως υψηλή μνήμη και χρήση ΚΜΕ και " "μπορεί ακόμα να οδηγήσει σε καταρρεύσεις και συνεπώς είναι παρωχημένη.\n" "Το παρασκήνιο SQLite δεν έχει γνωστά προβλήματα απόδοσης ή σταθερότητας και " "είναι η συνιστώμενη ρύθμιση." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "Μόνιμη: SQLite (συνιστώμενη)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Μόνιμη: Db4o (παρωχημένο)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Μόνιμο (προεπισκόπηση)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Μη διατηρήσιμη" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Χωρίς διαμεσολαβητή" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Προεπιλεγμένο σύστημα" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Σύνδεση" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Διεπαφή" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Διακομιστές" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Φίλτρα" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Καταγραφή" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Τα πεδία ψευδωνύμων δεν πρέπει να είναι κενά." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Άκυρη επισήμανση κανονικής έκφρασης: '{0}'. Αιτία: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Όνομα" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Θέμα" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Η αναζήτηση ομαδικών συνομιλιών χωρίς φίλτρο δεν συνιστάται. Αυτό μπορεί να " "πάρει κάμποσο, ή μπορεί να μην δουλέψει καθόλου.\n" "Θέλετε να συνεχίσετε;" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "" "Σφάλμα κατά την προσκόμιση του καταλόγου των ομαδικών συνομιλιών από τον " "διακομιστή." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Αποσυνδέθηκε από τη μηχανή. " #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Επανασυνδέεται με τη μηχανή... (προσπάθεια {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Αιτία: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Το προσκήνιο έχει χάσει τη σύνδεση με τον διακομιστή.\n" "Θέλετε να επανασυνδεθείτε τώρα;" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Η επανασύνδεση με τον διακομιστή έχει αποτύχει.\n" "Θέλετε να ξαναδοκιμάσετε;" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Ο διακομιστής έχασε τη σύνδεση με το προσκήνιο.\n" "Θέλετε να επανασυνδεθείτε τώρα;" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Εμφάνιση" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Πρωτόκολλο" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Όνομα οικοδεσπότη" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Αδύνατη η φόρτωση του διακομιστή:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Άτομο / Προσωπικό" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Ομάδα / Δημόσια" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Βοηθός μηχανής - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Προσθήκη μηχανής Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Επεξεργασία μηχανής Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Πιστοποιητικά" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Τώρα μπορείτε να χρησιμοποιήσετε τη μηχανή Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Σας ευχαριστούμε" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "" "Μια μηχανή με αυτό το όνομα υπάρχει ήδη! Παρακαλούμε ορίστε μια διαφορετική." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Εισάγετε σε ποια συνομιλία θα συμμετάσχετε" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Περί του Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Προτιμήσεις" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Αδύνατη η προσθήκη διακομιστή:" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Η μετάβαση στην τοπική μηχανή θα σας αποσυνδέσει από την τρέχουσα μηχανή!\n" "Είσαστε σίγουροι ότι το θέλετε;" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Η μετάβαση στην απομακρυσμένη μηχανή θα σας αποσυνδέσει από την τρέχουσα " "μηχανή!\n" "Είσαστε σίγουροι ότι το θέλετε;" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Η ημέρα άλλαξε από {0} σε {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "Η ημέρα άλλαξε σε {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Άκυρο φίλτρο κανονικής έκφρασης: '{0}'. Αιτία: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Είστε σίγουρος ότι θέλετε να διαγράψετε το επιλεγμένο φίλτρο;" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Πρωτόκολλο / Διακομιστής" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Τύπος συνομιλίας" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Κανονικός" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Συμβάν" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Τύπος" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Υπόδειγμα" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" "Η κατάσταση χαμηλού εύρους ζώνης είναι ενεργή: δεν συγχρονίστηκε κανένα " "μήνυμα." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Εμφάνιση γραμμής _μενού" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Ανάκτηση του καταλόγου χρηστών για το {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "έτοιμο." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Επανασύνδεση" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Το κλείσιμο του πρωτοκόλλου συνομιλίας θα κλείσει επίσης όλες τις ανοικτές " "συνομιλίες που είναι συνδεμένες με αυτό!\n" "Είσαστε σίγουρος ότι θέλετε να το κάνετε αυτό;" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Είστε σίγουρος ότι θέλετε να διαγράψετε τον επιλεγμένο διακομιστή;" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Αδύνατη η επεξεργασία του διακομιστή: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Αναζήτηση" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Αναζήτηση για:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Διάκριση πεζών από κεφαλαία" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Αναζήτηση προς τα _πίσω" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Αναδίπλωση γύρω από" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Χρήση _κανονικών εκφράσεων" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Αναζήτηση ομαδικής συνομιλίας" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "Ό_νομα:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Συμμετοχή" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Διακομιστής" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Συνομιλία" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Μηχανή" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Προβολή" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Βοήθεια" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Σύνδεση" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Άνοιγμα ημερολογίου" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Προτιμήσεις" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "Έ_ξοδος" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Σύνδεση" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Προσθήκη" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Διαχείριση" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Ά_νοιγμα / Συμμετοχή σε συνομιλία" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "Εύ_ρεση ομαδικής συνομιλίας" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Κα_θαρισμός όλων των δραστηριοτήτων" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Ε_πόμενη συνομιλία" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Π_ροηγούμενη συνομιλία" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Κλείσιμο" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Χρήση τοπικής μηχανής" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Προσθήκη απομακρυσμένης μηχανής" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Εναλλαγή σε απομακρυσμένη μηχανή" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Κα_τάσταση δρομέα" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Λειτουργία π_εριήγησης" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Εμφάνιση _γραμμής κατάστασης" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "Π_λήρης οθόνη" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "Π_ερί" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Εύρεση ομαδικής συνομιλίας" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Ιστότοπος" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Εμφάνιση ερ_γαλειοθήκης" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - σύνδεση" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Προτιμήσεις" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Ψευδώνυμα:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Καρτέλες" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Θέση καταλόγου χρηστών " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " κανάλι " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Φίλτρα καναλιού" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Φίλτρα χρήστη" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Χρήση διόδευσης _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Ενεργοποιεί τη χρήση SSH για τη σύνδεση. Αυτό έχει μια " "μικρή επίπτωση στην απόδοση, αλλά είναι πιο ασφαλές και απαιτείται όταν " "χρησιμοποιείτε NAT ή τείχη προστασίας με βάση τη θύρα" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Οικοδεσπότης SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "Διεύθυνση και θύρα DNS ή IP του διακομιστή SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Θύρα:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "Διεύθυνση και θύρα DNS ή IP του διακομιστή Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Οικοδεσπότης _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "Όνομα χρήστη _SSH: (προαιρετικό)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Το όνομα χρήστη που θα χρησιμοποιηθεί για σύνδεση με τον " "διακομιστή SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "Κωδικός πρόσβασης _SSH: (προαιρετικός)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Ο κωδικός πρόσβασης που θα χρησιμοποιηθεί για σύνδεση με " "τον διακομιστή SSH. Ο κωδικός πρόσβασης είναι προαιρετικός αν " "χρησιμοποιείται εξουσιοδότηση κλειδιού SSH (δείτε παρακάτω)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "Αρχείο κλειδιού _SSH: (προαιρετικό)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Επιλογή αρχείου" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Το αρχείο ιδιωτικού κλειδιού που θα χρησιμοποιηθεί για " "σύνδεση με τον διακομιστή SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "Ό_νομα χρήστη:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Το όνομα χρήστη που θα χρησιμοποιηθεί για σύνδεση με τον " "διακομιστή Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Κωδικός πρόσβασης:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Κωδικός πρόσβασης του χρήστη" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "Επι_βεβαίωση κωδικού πρόσβασης:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "" "Επανάληψη του κωδικού πρόσβασης για επιβεβαίωση" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Καλωσορίσατε στον βοηθό διαμόρφωσης μηχανής Smuxi.\n" "Πρέπει να εισάγετε κάποιες πληροφορίες πριν να μπορέσετε να χρησιμοποιήσετε " "τη μηχανή.\n" "\n" "Πατήστε \"μπροστά\" για να ξεκινήσετε." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Ό_νομα μηχανής:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Όνομα κατατομής της νέας μηχανής" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Προεπιλεγμένη μηχανή:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Να χρησιμοποιηθεί ως νέα προεπιλεγμένη μηχανή" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Αν ενεργοποιηθεί, η τρέχουσα μηχανή θα είναι η " "προεπιλεγμένη την επόμενη φορά που θα ξεκινήσει το Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Άνοιγμα συνομιλίας" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Τύπος:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "Ό_νομα οικοδεσπότη:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "Δί_κτυο:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Ψευδώνυμο:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "Πρ_ωτόκολλο:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Χρήση κρυπτογράφησης" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Επικύρωση πιστοποιητικού διακομιστή" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Εντολές κατά τη _σύνδεση:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Παράβλεψη εντολών" smuxi-1.1/po-Frontend-GNOME/ro.po0000664000175000017500000013277214011526464017355 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:20+0000\n" "PO-Revision-Date: 2018-04-18 21:36+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Preferințe Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Pseudonimul de utilizat. Puteți specifica pseudonime extra (separate prin " "spații) care vor fi utilizate ca rezerve când prima alegere nu este " "disponibilă. Implicit $nick_ și $nick__ vor fi utilizate ca rezerve." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Pseudonim(e):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nume de utilizator:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nume real:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Codare:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Convertește automat caracterele UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Generale" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tip:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Gazdă:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Parolă:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Afișează parola" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proxy rețea" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Comenzi la conectare:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Comenzi la lansare:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Comenzi globale" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "C_onexiune" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format datare:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Linii de preîncărcare:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Linii de preîncărcare de motor:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = secunde\n" "mm = minute\n" "hh = ore (01 - 12)\n" "HH = ore (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = zi\n" "MM = lună\n" "yy/yyyy = an" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tip de persistență:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Linii de preîncărcare volatile:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Linii de preîncărcare persistente:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Preîncărcare de mesaj" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Elimină culorile" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Elimină formatările" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Elimină UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Arată configurările avansate" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avansate" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Generale" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Sus" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Jos" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Stânga" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Dreapta" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nimic" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Poziție taburi " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Evidențiază" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Activitate" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Nicio activitate" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Alăturare/Despărțire/Mod" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Culori tab " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Comută automat la discuțiile de persoană deschise recent" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Comută automat la discuțiile de grup deschise recent" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Arbore" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Caracter de completare:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Caracter de comandă:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Dimensiunea istoricului de comandă:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Completare în stil Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Câmp intrare " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Intrare" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Culori pseudonim" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Poziția în lista de persoane " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Suprascrie" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Font " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Poziție subiect " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Prim plan" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Plan secund" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Culoare " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "Mod de î_ncadrare:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Discuție " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Evidențiază cuvintele:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Bip la evidențiere" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Evidențiere " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Rezultat" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Activează" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Arată întotdeauna" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Arată când fereastra este minimizată" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Arată când fereastra este închisă" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Iconiță zonă de notificare " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Arată Smuxi în meniul de mesagerie" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Meniu de mesagerie" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Afișează meniurile contextuale de notificare" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Meniuri contextuale de notificare" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Notificare" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interfață" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servere" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtre" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Activat" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Adaugă la istoric mesajele filtrate" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "Juna_lizare" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Discuție IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Client IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Discutați cu alte persoane pe IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;discuție;mesagerie;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Discutați cu alte persoane pe IRC, Twitter, Jabber și Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi este un client de discuție cu sursă deschisă, distribuit și ușor de " "utilizat pentru IRC, Twitter, Jabber/XMPP, Campfire și JabbR de SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Inspirat de combinația de ecran și irssi, Smuxi are un server detașabil (sau " "ca un client „normal”) care rămâne conectat când nu sunteți conectat, și " "poate permite interfețe Smuxi multiple să fie conectate și sincronizate. " "Aceasta este similară cu salturile ecran+irssi sau IRC, dar mai elegant și " "mai puternic." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Fereastra principală care arată un canal de IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:70 msgid "translator-credits" msgstr "Florentina Mușat , 2018" #: ../src/Frontend-GNOME/AboutDialog.cs:83 msgid "Smuxi Website" msgstr "Pagină web Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "S-a întâmplat din nou..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi a căzut pentru că a fost aruncată o excepție negestionată!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Aici este urma de stivă, raportați această defecțiune!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Raportează defecțiune" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Nu s-a găsit motorul." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Administrator de motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Selectați la care motor Smuxi doriți să vă conectați" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Utilizează modul de lățime de bandă scăzută" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Motor local" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Selectați un motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Interfața nu este compatibilă cu motorul!\n" "Versiune de motor: {0} Versiune de interfață: {1}\n" "Protocol de motor: {2} Protocol de interfață: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "A apărut o eroare în timpul conectării la motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL motor: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Eroare: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Sigur doriți să ștergeți motorul „{0}”?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Veți lipi {0} linii. Doriți să continuați?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Comenzi de interfață" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Activează rezultatul depanării" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Afișează acest ajutor" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opțiuni:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Conectează la motor" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Deschide legătura specificată în Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Începe o instanță Smuxi nouă și ignoră una existentă" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Se transmite legătura la instanța Smuxi care rulează deja..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Se aduce instanța Smuxi care rulează deja în prim plan..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} utilizatori" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Nu este implementat încă!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Nume" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Subiect" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Căutarea pentru discuții de grup fără un filtru nu este recomandată. " "Aceasta poate să dureze o vreme, sau poate să nu funcționeze deloc.\n" "Doriți să continuați?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Eroare la aducerea listei de discuții de grup de pe server." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Deconectat de la motor." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Se reconectează la motor... (încercarea {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Cauză: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "S-a detectat o eroare fatală din cauza unei incompatibilități de protocol cu " "smuxi-server!\n" "\n" "Instalați Mono pe partea de interfață pentru a se potrivi cu smuxi-server.\n" "\n" "Mai multe detalii despre această problemă pot fi găsite aici:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Interfața a pierdut conexiunea la server.\n" "Sigur doriți să faceți asta?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Reconectarea la server a eșuat.\n" "Doriți să încercați din nou?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Serverul a pierdut conexiunea la interfață.\n" "Doriți să reconectați acum?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Arată" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protocol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Nume gazdă" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Nu s-a putut încărca serverul: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Persoană / privat" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grup / public" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Asistent de motor - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Adaugă motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Editează motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Conexiune" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Certificări" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Acum puteți utiliza motorul Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Mulțumesc" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Un motor cu acest nume există deja! Specificați unul diferit." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Introduceți la care discuție se alătură" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Despre Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Preferințe" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:266 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Nu s-a putut adăuga serverul: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:391 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Comutarea la motorul local va deconecta motorul curent!\n" "Sigur doriți să faceți asta?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:435 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Comutarea motorului la distanță va deconecta motorul curent!\n" "Sigur doriți să faceți asta?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Ziua s-a modificat de la {0} la {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Ziua s-a modificat la {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Expresie regulară de filtru nevalidă: „{0}”. Motivul: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Sigur doriți să ștergeți filtrul selectat?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Rețea" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protocol / server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Tip de discuție" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Eveniment" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Tip" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Mostră" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Niciun proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Implicit de sistem" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Salvează" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Adaugă" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Nesuportat" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Modul lățime de bandă scăzută este activ: nu sunt mesaje sincronizate." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Arată bara de _meniu" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Se obține lista de utilizatori pentru {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "gata." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Reconectează" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Închiderea discuției de protocol va închide și toate discuțiile deschise " "conectate la aceasta!\n" "Sigur doriți să faceți asta?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Sigur doriți să ștergeți serverul selectat?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Nu se poate edita serverul: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Caută" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Caută după:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Potrivește la _majuscule semnificative" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Caută î_napoi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Î_ncadrează în jurul" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Utilizează expresii _regulate" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - caută discuția de grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nume:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Alăturare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "Dis_cuție" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Vizualizare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Ajutor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Conectează" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Deschide istoricul" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Preferințe" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Ieșire" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Conectează" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Adaugă" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "Ad_ministrează" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Deschide / Alăturare la discuție" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Caută discuția de grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Curăță toată activitatea" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Discuția _următoare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Discuția _anterioară" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "În_chide" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Utilizează motor local" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Adaugă motor la distanță" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Comută motorul la distanță" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Modul _caret" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Modul _navigare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Arată bara de _stare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Mod ecran complet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Despre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Caută discuția de grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "Pagină _web" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Arată bara de unel_te" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - conectează" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - preferințe" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Pseudonime:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Taburi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Poziția în listă a utilizatorului " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Canal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtre canal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtre utilizator" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Utilizează tunel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Activează utilizarea de SSH pentru conexiune. Aceasta " "are un impact mic de performanță, dar este mai sigur și necesar când se " "utilizează firewall-uri bazate pe NAT sau port" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Gazdă SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "Adresa DNS sau IP și portul serverului SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "Adresa DNS sau IP și portul serverului Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Gazdă _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "Nume de utilizator _SSH: (opțional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Numele de utilizator care va fi utilizat pentru " "autentificarea la serverul SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "Parolă _SSH: (opțional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Parola care va fi utilizată la autentificarea la " "serverul SSH. Parola este opțională dacă este utilizată autorizarea de cheie " "SSH (consultați mai jos)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "Fișier de cheie _SSH: (opțional)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Selectați un fișier" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Fișier de cheie privată SSH care va fi utilizată pentru " "autentificarea la serverul SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "N_ume de utilizator:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Numele de utilizator care va fi utilizat pentru " "autentificarea la serverul Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Parolă:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Parola utilizatorului" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Verifică parola:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Repetați parola pentru verificare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Bine ați venit la asistentul de configurare de motor Smuxi.\n" "Trebuie să introduceți câteva informații înainte de a putea să utilizați " "motorul.\n" "\n" "Apăsați clic pe „Înainte” pentru a începe." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Num_e motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Numele de profil pentru motorul nou" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Motor implicit:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Utilizează ca motor implicit nou" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Dacă este activat, motorul curent va fi implicit pentru " "data următoare când Smuxi este pornit" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - deschide discuție" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tip:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "Nume de _gazdă:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Rețea:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Pseudonim:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Conectează automat la server la lansare" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Utilizează criptarea" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Validează certificatul serverului" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Comenzi la c_onectare:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Comenzile de _ignorare" smuxi-1.1/po-Frontend-GNOME/fi.po0000664000175000017500000013436114011526464017327 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2018-12-30 13:06+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Finnish (http://www.transifex.com/meebey/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi-asetukset" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "Käytettävä lempinimi. Voit määritellä ylimääräisiä lempinimiä (eroteltuna välilyönnillä) joita käytetään varalla jos ensimmäinen vaihtoehto ei ole saatavilla. Oletuksena varalla käytetään $nick_ ja $nick__." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Nimimerkki/-merkit:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Käyttäjänimi:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Oikea nimi:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Enkoodaus:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Käännä UTF-8-merkit automaattisesti" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Yleiset" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tyyppi:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Isäntä:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Salasana:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Portti:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Näytä salasana" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Verkon välityspalvelin" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Yhdistyksenaikaiset komennot:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Käynnistyksenaikaiset komennot:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globaalit komennot" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "Y_hteys" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Aikaleiman muoto:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Puskuririvit:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Moottorin puskuririvit:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = sekunnit\nmm = minuutit\nhh = tunnit (01 - 12)\nHH = tunnit (00-23)\ntt = AM/PM\n\ndd = päivä\nMM = kuukausi\nyy/yyyy = vuosi" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Pysyvyyden tyyppi:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Epävakaat puskuririvit:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Pysyvät puskuririvit:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Viestipuskuri" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Poista värit" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Poista muotoilut" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Poista UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Näytä edistyneet asetukset" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Edistyneet" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Yleiset" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Ylhäällä" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Pohjalla" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Vasen" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Oikea" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Ei mitään" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Välilehtien sijainti " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Korostaminen" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktiviteetti" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Ei aktiviteettia" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Liity/Poistu/Moodi" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Välilehtien värit " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Siirry automaattisesti uutena avautuvaan yksityiskeskusteluun" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Siirry automaattisesti uutena avautuviin ryhmäkeskusteluihin" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Puu" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Täydennysmerkki:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Komentomerkki:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Komentohistorian koko:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash-tyylinen täyttäminen" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Syöttökenttä " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Syöte" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Lempinimien värit" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Henkilölistan sijainti " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Ohita" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Fontti " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Aihekentän sijainti " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Etuala" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Tausta" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Väri " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Kietaisumoodi:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Korosta sanat:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Piippaus korostuksen yhteydessä" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Korostaminen " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Tuloste" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Aktivoi" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Näytä aina" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Näytä kun ikkuna on minimoituna" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Näytä kun ikkuna on suljettuna" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Huomioalueen ikoni " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Näytä Smuxi viestivalikossa" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Viestivalikko" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Näytä ilmoitusten ponnahdusikkunat" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Ilmoitusten ponnahdusikkunat" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Ilmoitus" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Käyttöliittymä" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Palvelimet" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Suodattimet" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Aktivoitu" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Kirjoita suodatetut viestit lokiin" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Loki" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Palvelin" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Yhdistä palvelimeen automaattisesti käynnistyksen yhteydessä" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Protokolla:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Verkko:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Isäntänimi:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC-keskustelu" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi-IRC-asiakasohjelma" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Juttele muiden kanssa IRC:ssä" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;keskustelu;viestintä;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Juttele muiden kanssa IRC:ssä, Twitterissä, Jabberissa ja Campfiressä" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi on avoimen lähdekoodin, jaetun kuorman malliin perustuva ja käyttäjäystävällinen asiakasohjelma IRC, Twitter, Jabber/XMPP, Campfire ja SignalR:n JabbR -protokollille." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "Inspiroituneena yhdistelmästä screen ja irssi, Smuxi:ssa on irroitettava palvelin (tai normaalissa ohjelmassa \"asiakasohjelma\") joka pystyy yhteydessä vaikka sinä et olisi, ja mahdollistaa useamman Smuxi-asiakasohjelman yhteyden ja synkronoinnin. Tämä vastaa screen+irssi -yhdistelmää tai IRC-bounceria, mutta elegantimmin ja vahvemmin." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Pääikkuna joka näyttää IRC-kanavan" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "kääntäjien tiedot" #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Smuxi Web-sivu" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oops, tein sen taas..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi kaatui koska käsittelemätön poikkeus heitettiin!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Tässä on kasajälki, ole hyvä ja ilmoita tästä bugista!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Raportoi Bugi" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Moottoria ei löytynyt." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Moottorinhallinta" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Valitse Smuxi-moottori johon haluat yhdistää" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Moottori:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Käytä alhaisen kaistan tilaa" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Paikallinen moottori" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Ole hyvä ja valitse moottori!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "Käyttöliittymäsi ei ole yhteensopiva moottorin kanssa!\nMoottorin versio: {0} Käyttöliittymän versio: {1}\nMoottorin protokolla: {2} Käyttöliittymän protokolla: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Tapahtui virhe yhdistettäessä moottoriin!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Moottorin URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Virhe: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Haluatko varmasti poistaa moottorin \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Aiot liittää {0} riviä. Haluatko varmasti jatkaa?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Käyttöliittymän komennot" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Näytä tämä ohje" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Valinnat:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Yhdistä moottoriin" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Tuodaan jo käynnissä oleva Smuxi-instanssi etualalle..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} käyttäjää" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Sori, tätä ei ole vielä sisällytetty!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Merkki" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Sana" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Pysyvä: Db4o (vanhentunut)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Pysyvä (esikatselu)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Epävakaa" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Ei välityspalvelinta" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Käyttöjärjestelmän oletus" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Yhteys" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Käyttöliittymä" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Palvelimet" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Suodattimet" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Loki" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Lempinimi-kenttä ei saa olla tyhjä." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Epäkelpo korostuksen regex: '{0}'. Syy: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Nimi" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Aihe" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "Ryhmäkeskusteluiden etsintää ilman suodatinta ei suositella. Tämä voi kestää hetken, tai ei välttämättä toimi ollenkaan. Haluatko jatkaa?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Virhe haettaessa ryhmäkeskusteluiden listaa palvelimelta." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Yhteys moottoriin katkaistu." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Yhdistetään uudelleen moottoriin... (yritys {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Syy: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "Käyttöliittymä on menettänyt yhteyden palvelimeen. Haluatko yhdistää uudelleen nyt?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "Uudelleenyhdistäminen palvelimeen on epäonnistunut. Haluatko yrittää uudelleen?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "Palvelin on menettänyt yhteyden käyttöliittymään. Haluatko yhdistää uudelleen nyt?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Näytä" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protokolla" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Isäntänimi" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Palvelinta ei voitu ladata:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Henkilö / Yksityinen" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Ryhmä / Julkinen" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Moottoriavustaja - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Lisää Smuxi-moottori" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Muokkaa Smuxi-moottoria" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Todennustiedot" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Voit nyt käyttää Smuxi-moottoria" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Kiitos" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Tämän niminen moottori on jo olemassa! Määritä toinen nimi." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Syötä liittyttävän keskustelun nimi" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Tietoja Smuxista" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Asetukset" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Palvelinta ei voitu lisätä:" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Paikalliseen moottoriin vaihto katkaisee yhteytesi nykyiseen moottoriin! Haluatko varmasti tehdä tämän?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Etämoottorin vaihto katkaisee yhteyden nykyiseen moottoriin! Haluatko varmasti tehdä tämän?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Päivä vaihtui päivästä {0} päivään {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "Päivä vaihtui, {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Epäkelpo suodatuksen regex: '{0}'. Syy: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Haluatko varmasti poistaa valitun suodattimen?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Protokolla / Palvelin" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Keskustelutyyppi" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Normaali" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Tapahtuma" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Tyyppi" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Kuvio" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Alhaisen kaistan tila on päällä: Viestejä ei ole synkronoitu." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Näytä _valikkopalkki" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Noudetaan käyttäjälistaa {0}:lle..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "Valmis." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Yhdistä uudelleen" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "Protokollakeskustelun sulkeminen sulkee myös kaikki siihen liitetyt keskustelut! Haluatko varmasti tehdä tämän?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Haluatko varmasti poistaa valitun palvelimen?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Palvelinta ei voitu muokata:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Etsi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Etsi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Täsmää sijamuoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Etsi _Takaperin" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Kietaise ympäri" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Käytä _Säännöllisiä lausekkeita" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Etsi Ryhmäkeskustelua" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nimi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Liity" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Palvelin" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Keskustelu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Moottori" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Näytä" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Apua" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Yhdistä" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Avaa loki" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Asetukset" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Lopeta" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Yhdistä" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Lisää" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Hallinnoi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Avaa / Liity keskusteluun" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Etsi ryhmäkeskustelu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "P_uhdista kaikki aktiviteetti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Seuraava keskustelu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Edellinen keskustelu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Sulje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Käytä paikallista moottoria" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Lisää etämoottori" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Vaihda etämoottoria" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "_Caret-moodi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Browse-moodi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Näytä _tilapalkki" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Koko näytön tila" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Tietoja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Etsi ryhmäkeskustelu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Verkkosivusto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Näytä _työkalupalkki" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Yhdistä" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - asetukset" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Nimimerkit:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Välilehdet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Käyttäjälistan sijainti " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanava " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanavasuodattimet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Käyttäjäsuodattimet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Käytä _SSH-tunnelia" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "Mahdollistaa SSH:n käytön yhteydessä. Tällä on pieni suorituskykyvaikutus, mutta tarjoaa lisäturvaa ja on pakollinen käytettäessä NAT:ia tai porttiperustaisia palomuureja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH-_Isäntä:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS tai IP-osoite ja portti SSH-palvelimelle" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Portti:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS tai IP-osoite ja portti Smuxi-palvelimeen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi-isäntä:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH-käyttäjänimi: (valinnainen)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "Käyttäjänimi jolla kirjaudutaan sisään SSH-palvelimeen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH-salasana: (valinnainen)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "Salasana jota käytetään SSH-palvelimelle kirjautumiseen. Tämä salasana on valinnainen jos SSH-avaintunnistautumista käytetään (katso alempaa)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "_SSH-avaintiedosto: (valinnainen)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Valitse tiedosto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "Yksityinen SSH-avaintiedosto jota käytetään SSH-palvelimelle kirjautumiseen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Käyttäjänimi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "Käyttäjänimi jolla kirjaudutaan sisään Smuxi-palvelimeen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Salasana:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Käyttäjän salasana" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Vahvista salasana:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Toista salasana sen varmentamiseksi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "Tervetuloa Smuxi-moottorin säätöavustajaan.\nSinun tulee syöttää muutamia tietoja ennen kuin pääset käyttämään moottoria.\n\nValitse \"Eteenpäin\" aloittaaksesi." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Moottorin nimi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Uuden moottorin profiilinimi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Oletusmoottori:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Käytä uutena oletusmoottorina" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "Jos valittu, nykyinen moottori on oletuksena käytössä seuraavalla Smuxin käynnistyskerralla" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Avaa keskustelu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tyyppi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Isäntänimi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Verkko:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Nimimerkki:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokolla:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Käytä salausta" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Vahvista palvelimen sertifikaatti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Yhdistyksenaikaiset komennot:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Jätä komennot suorittamatta" smuxi-1.1/po-Frontend-GNOME/de.po0000664000175000017500000013701514011526464017320 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Bianca Mix , 2011-2013 # JB, 2014-2015 # JB, 2015 # JB, 2014 # Mario Blättermann , 2016-2017 # Mirco Bauer , 2013,2015 # Vincent Bermel , 2016 # Wasilis Mandratzis-Walz, 2015 # Wasilis Mandratzis-Walz, 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2018-12-30 13:05+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: German (http://www.transifex.com/meebey/smuxi/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi-Einstellungen" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "Der Spitzname, der verwendet werden soll. Sie können mehr als einen Spitznamen angeben, indem Sie Leerzeichen als Trenner verwenden. Diese werden als Ausweichmöglichkeit benutzt, wenn der Spitzname nicht verfügbar ist. Standardmäßig wird $nick_ und $nick__ als Ausweichmöglichkeit verwendet." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Spitzname(n):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Benutzername:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Wirklicher Name:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kodierung:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "UTF-8-Zeichen automatisch umwandeln" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Allgemein" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Typ:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Host:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Passwort:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Passwort anzeigen" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Netzwerk-Proxy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Befehle beim Verbinden:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Befehle beim Starten:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globale Befehle" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Verbindung" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Zeitstempel-Format:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Puffer-Zeilen:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Engine-Puffer-Zeilen:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = Sekunden\nmm = Minuten\nhh = Stunden (01 - 12)\nHH = Stunden (00 - 23)\ntt = AM/PM\n\ndd = Tag\nMM = Monat\nyy/yyyy = Jahr" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Persistenz-Typ:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Volatilitäts-Pufferzeilen:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Persistente Puffer-Zeilen:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Nachrichtenpuffer" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Farben entfernen" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Formatierungen entfernen" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "UTF-8 entfernen" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Erweiterte Einstellungen anzeigen" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Erweitert" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Allgemein" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Oben" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Unten" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Links" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Rechts" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nichts" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Position der Reiter " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Highlight" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivität" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Keine Aktivität" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Beitreten/Verlassen/Mode" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Farbe der Reiter " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Automatisches Wechseln zu neu geöffneten Personen-Gesprächsfenstern" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Automatisches Wechseln zu neu geöffneten Gruppen-Gesprächsfenstern" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Baum" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Vervollständigungzeichen:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Befehlszeichen:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Befehlsprotokollgröße:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Vervollständigung im Bash-Stil" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Eingabefeld " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Eingabe" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Nick-Farben" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Position der Personenliste " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Übersteuern" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Schrift " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Position des Themas " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Vordergrund" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Hintergrund" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Farbe " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Umbruch-Modus:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Highlight-Wörter:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Bei Highlight piepsen" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Highlighting " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Ausgabe" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Aktivieren" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Immer anzeigen" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Anzeigen, wenn Fenster minimiert ist" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Anzeigen, wenn Fenster geschlossen ist" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Symbol im Benachrichtigungsfeld " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Smuxi im Sofortnachrichten-Menü anzeigen" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Sofortnachrichten-Menü" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Benachrichtigungseinblendungen anzeigen" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Benachrichtigungseinblendungen" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Benachrichtigung" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Anzeige" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Server" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filter" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Aktiviert" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Protokollierung gefilterter Nachrichten" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Geprächsprotokollierung" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Beim Start automatisch zu diesem Server verbinden" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Protokoll:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Netzwerk:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Hostname:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC-Chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi - Chat-Client" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Mit anderen Leuten im IRC kommunizieren" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "chat;messaging;sofortnachrichten;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Mit anderen Leuten im IRC, Twitter, Jabber und Campfire kommunizieren" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi ist ein quelloffener, frei verteilter und benutzerfreundlicher Chat-Client für IRC, Twitter, Jabber/XMPP, Campfire und SignalR's JabbR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "Inspiriert von der Kombination aus Screen und Irssi hat Smuxi einen »ausklinkbaren« Server (oder wie ein »normaler« Client), der in Verbindung bleibt, wenn Sie getrennt sind, und erlaubt mehrere gleichzeitig verbundene und aktualisierte Smuxi-Frontends. Dies ähnelt Screen+Irssi oder IRC Bouncers, aber eleganter und mächtiger." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Das Hauptfenster mit einem IRC-Kanal" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Mirco Bauer \nBianca Mix \nMario Blättermann " #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Smuxi-Webseite" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Ups, ich habe es wieder getan …" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi ist abgestürtzt, weil eine unbehandelte Ausnahme aufgetreten ist!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Hier ist der Stack-Trace, bitte melden Sie diesen Fehler!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Fehler melden" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Engine nicht gefunden." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Engine-Verwaltung" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Wählen Sie, zu welcher Smuxi-Engine Sie sich verbinden möchten" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Engine:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Geringe-Bandbreite-Modus verwenden" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Lokale Engine" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Bitte wählen Sie eine Engine aus!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "Ihr Frontend ist nicht zur Engine kompatibel!\nEngine-Version: {0} Frontend-Version: {1}\nEngine-Protokoll: {2} Frontend-Protokoll: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Ein Fehler ist beim Verbinden zur Engine aufgetreten!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Engine URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Fehler: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Möchten Sie wirklich die Engine »{0}« löschen?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Sie sind dabei, {0} Zeilen einzufügen. Möchten Sie fortfahren?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Frontend-Befehle" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Fehlerdiagnose-Ausgabe aktivieren" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Hilfe anzeigen" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Optionen:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Mit der Engine verbinden" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Öffnet den angegebenen Link in Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Startet eine neue Smuxi-Instanz und ignoriert eine existierende Instanz" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Bereits laufende Smuxi-Instanz wird in den Vordergrund gebracht …" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Bereits laufende Smuxi-Instanz wird in den Vordergrund gebracht …" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Benutzer" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Tut mir leid, das ist noch nicht implementiert!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Zeichen" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Wort" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "Legt fest, ob Smuxi Chat-Nachrichten im Speicher (flüchtig) oder auf der Festplatte (persistent) ablegen soll.\nFür die persistente Speicherung können Sie zwischen Db4o, einer Objektdatenbank, oder SQLite, einer relationalen Datenbank.\nDas Db4o-Backend hat bekannte Fehler, wie hohe Speicher- und Prozessorlast. Das kann zu Abstürzen führen, daher raten wir davon ab.\nDas SQLite-Backend hat keine bekannten Leistungs- oder Stabilitätsprobleme. Es ist die empfohlene Einstellung." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "Persistent: SQLite (empfohlen)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Persistent: Db4o (veraltet)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Persistent (Vorschau)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Volatil" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Kein Proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "System-Standard" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Verbindung" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Anzeige" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Server" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Filter" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Geprächsprotokollierung" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Das Spitzname(n)-Feld darf nicht leer sein." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Ungültiger Highlight-Regex: »{0}«. Ursache: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Name" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Thema" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "Vom Suchen nach Gruppen-Chats ohne einen Filter wird abgeraten. Es könnte eine Weile dauern, oder es funktioniert gar nicht.\nMöchten Sie fortfahren?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Fehler beim Abrufen der Liste für Gruppen-Chats vom Server." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Von der Engine getrennt." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Wiederverbinden zur Engine … (Versuch {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Grund: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "Der Server hat die Verbindung zum Frontend verloren.\nMöchten Sie diese nun erneut aufbauen?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "Erneute Verbindung zum Server ist fehlgeschlagen.\nMöchten Sie es nochmals versuchen?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "Der Server hat die Verbindung zum Frontend verloren.\nMöchten Sie diese nun erneut aufbauen?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Anzeigen" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protokoll" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Hostname" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Laden des Servers nicht möglich: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Person / Privat" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Gruppe / Öffentlich" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Engine-Assistent - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Smuxi-Engine hinzufügen" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Smuxi-Engine bearbeiten" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Zugangsdaten" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Nun können Sie die Smuxi-Engine verwenden" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Vielen Dank" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Es existiert bereits eine Engine mit diesem Namen! Bitte geben Sie einen anderen an." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Geben Sie den zu betretenden Chat ein" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Info zu Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Einstellungen" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Fehler beim Hinzufügen des Servers: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Das Wechseln zur lokalen Engine wird Sie von der jetzigen Engine trennen!\nMöchten Sie fortfahren?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Das Wechseln zur entfernten Engine wird Sie von der jetzigen Engine trennen!\nMöchten Sie fortfahren?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Tag wechselte vom {0} zum {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "Tageswechsel: {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Ungültiger Filter-Regex: »{0}«. Ursache: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Möchten Sie den ausgewählten Filter wirklich löschen?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Protokoll / Server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Gesprächstyp" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Ereignis" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Typ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Muster" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Geringe-Bandbreite-Modus ist aktiviert: Keine Nachrichten abgeglichen." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "_Menüleiste anzeigen" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Benutzer-Liste für {0} wird abgerufen …" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "abgeschlossen." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Wiederverbinden" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "Das Schließen des Protokoll-Chats wird alle dazugehörigen Chats ebenfalls schließen!\nMöchten Sie fortfahren?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Möchten Sie den ausgewählten Server wirklich löschen?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Bearbeiten des Servers nicht möglich: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Suchen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Suchen nach:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Groß-/Kleinschreibung berücksichtigen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "_Rückwärts suchen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Wieder am Anfang beginnen, wenn das Ende erreicht ist" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "_Reguläre Ausdrücke anwenden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Gruppen-Chat finden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Name:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Betreten" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Anzeige" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Hilfe" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Verbinden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Protokoll öffnen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Einstellungen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Beenden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Verbinden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Hinzufügen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Verwalten" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Chat _öffnen/betreten" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "Gruppen-Chat _finden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Alle Aktivitäten _löschen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Nächster Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Vorheriger Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Schließen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "Lokale Engine _verwenden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "Entfernte Engine hinzu_fügen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Entfernte Engine wechseln" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "_Caret-Modus" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Durchstöber-Modus" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "_Statuszeile anzeigen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Vollbild" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Info" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Gruppen-Chat finden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Webseite" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "_Werkzeugleiste anzeigen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Verbinden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Einstellungen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Spitznamen:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Reiter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Position der Benutzer-Liste " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanal-Filter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Benutzer-Filter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "SSH-Tunnel verwenden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "Aktiviert die Verwendung von SSH für die Verbindung. Dies hat Einfluss auf die Leistung, ist jedoch sicherer und notwendig, wenn NAT oder Port-basierte Firewalls verwendet werden." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH-_Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS oder IP-Adresse und Port des SSH-Servers" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS oder IP-Adresse und Port des Smuxi-Servers" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi-Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH-Benutzername: (optional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "Benutzername, welcher zur Anmeldung beim SSH-Server verwendet werden soll" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH-Passwort: (optional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "Passwort, welches zur Anmeldung am SSH-Server benutzt wird. Das Passwort ist optional, wenn Autorisierung mit SSH-Schlüsseln benutzt wird (siehe unten)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "_SSH-Schlüssel-Datei: (optional)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Datei auswählen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "Geheime SSH-Schlüssel-Datei, die für die Anmeldung am SSH-Server verwendet wird" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Benutzername:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "Benutzername, welcher zur Anmeldung beim Smuxi-Server verwendet werden soll" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Passwort:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Passwort des Benutzers" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "Passwort _bestätigen:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Wiederholen Sie das Passwort zur Überprüfung" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "Willkommen beim Engine-Konfigurations-Assistenten von Smuxi.\nSie müssen einige Informationen eingeben, bevor Sie diese Engine nutzen können.\n\nKlicken Sie auf »Weiter«, um zu beginnen." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Engine-Name:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Name des Profils für die neue Engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Standard-Engine:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Als neue Standard-Engine verwenden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "Wenn dies aktiviert ist, wird die Engine standardmäßig beim nächsten Start von Smuxi verwendet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Chat öffnen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Typ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Hostname:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Netzwerk:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Spitzname:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokoll:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Verschlüsselung verwenden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Serverzertifikat validieren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Befehle beim _Verbinden:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Befehle _ignorieren" smuxi-1.1/po-Frontend-GNOME/hu.po0000664000175000017500000013377014011526464017350 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015, 2018 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015, 2018. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:46+0000\n" "PO-Revision-Date: 2018-02-26 23:39+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi beállításai" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "A használandó becenév. Megadhat további beceneveket (szóközzel elválasztva), " "amelyek tartalékként lesznek használva, ha az elsőnek választott nem érhető " "el. Alapértelmezetten $nick_ és $nick__ lesz használva tartalékként." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Becenevek:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Felhasználónév:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Valódi név:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kódolás:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "UTF-8 karakterek automatikus átalakítása" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Általános" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Típus:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Gép:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Jelszó:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Jelszó megjelenítése" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Hálózati proxy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Kapcsolódáskori parancsok:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Indításkori parancsok:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globális parancsok" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Kapcsolat" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Időbélyeg formátum:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Puffersorok:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Motor puffersorok:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = másodperc\n" "mm = perc\n" "hh = óra (01 - 12)\n" "HH = óra (00 - 23)\n" "tt = DE/DU\n" "\n" "dd = nap\n" "MM = hónap\n" "yy/yyyy = év" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tartóssági típus:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Illékony puffersorok:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Tartós puffersorok:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Üzenetpuffer" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Színek leszedése" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Formázások leszedése" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "UTF-8 leszedése" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Speciális beállítások megjelenítése" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Speciális" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Általános" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Fent" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Lent" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Balra" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Jobbra" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nincs" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr "Lapok elhelyezkedése" #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Kiemelés" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Tevékenység" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Nincs tevékenység" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Csatlakozás/Kilépés/Mód" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr "Lap színei" #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Automatikus váltás az újonnan megnyitott személyes csevegésekre" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Automatikus váltás az újonnan megnyitott csoportos csevegésekre" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Fa" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Kiegészítési karakter:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Parancs karakter:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Parancselőzmények mérete:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash-stílusú kiegészítés" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr "Bejegyzésmező" #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Bemenet" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Becenév színek" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr "Személylista elhelyezkedése" #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Felülbírálás" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr "Betűkészlet" #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr "Téma elhelyezkedése" #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Előtér" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Háttér" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr "Szín" #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Tördelési mód:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr "Csevegés" #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Szavak kiemelése:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Sípolás kiemeléskor" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr "Kiemelés" #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Kimenet" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Engedélyezés" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Mindig jelenjen meg" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Akkor jelenjen meg, ha az ablak minimalizálva van" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Akkor jelenjen meg, ha az ablak be van zárva" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr "Értesítési terület ikon" #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Smuxi megjelenítése az üzenetküldési menüben" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Üzenetküldési menü" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Felugró értesítések megjelenítése" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Felugró értesítések" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Értesítés" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Felület" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Kiszolgálók" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Szűrők" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Engedélyezve" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Szűrt üzenetek naplózása" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Naplózás" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC csevegés" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi IRC-kliens" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Csevegés más emberekkel IRC csatornán" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "csevegés;üzenetküldés;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;" "campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Csevegés más emberekkel IRC, Twitter, Jabber és Campfire csatornákon" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "A Smuxi egy nyílt forrású, elosztott és felhasználóbarát csevegőkliens IRC, " "Twitter, Jabber/XMPP, Campfire és SignalR's JabbR protokollokhoz." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "A screen és az irssi kombinációja által ihletve a Smuxi egy olyan " "leválasztható kiszolgálóval (vagy mint egy „normál” kliens) rendelkezik, " "amely akkor is kapcsolatban marad, amikor ön nem, és lehetővé teszi több " "Smuxi előtétprogramnak, hogy kapcsolatban és szinkronban legyenek. Ez " "hasonló a screen+irssi együtteséhez vagy az IRC-kidobókhoz, de elegánsabb és " "hatékonyabb." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Egy IRC-csatornát megjelenítő főablak" #: ../src/Frontend-GNOME/AboutDialog.cs:70 msgid "translator-credits" msgstr "Úr Balázs , 2015." #: ../src/Frontend-GNOME/AboutDialog.cs:83 msgid "Smuxi Website" msgstr "A Smuxi weboldala" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Hoppá, újra megtettem…" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "A Smuxi összeomlott, mert egy lekezeletlen kivételt dobtak!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Itt a veremkiíratás, kérjük jelentse ezt a hibát!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Hiba jelentése" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "A motor nem található." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Motorkezelő" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Válassza ki, hogy mely Smuxi-motorhoz szeretne kapcsolódni" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Alacsony sávszélességű mód használata" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Helyi motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Válasszon egy motort!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Az előtétprogramja nem kompatibilis ezzel a motorral!\n" "Motorverzió: {0} Előtétprogram verziója: {1}\n" "Motorprotokoll: {2} Előtétprogram protokollja: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Hiba történt a motorhoz kapcsolódás közben!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Motor URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Hiba: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Biztosan törölni akarja a(z) „{0}” motort?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "{0} sort fog beilleszteni. Szeretné folytatni?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Előtétprogram parancsok" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Hibakeresési kimenet engedélyezése" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Ezen súgó megjelenítése" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Kapcsolók:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Kapcsolódás motorhoz" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Megnyitja a megadott hivatkozást a Smuxi programban" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Elindít egy új Smuxi példányt, és figyelmen kívül hagyja a meglévőt" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Hivatkozás átadása a már futó Smuxi példánynak…" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "A már futó Smuxi példány előtérbe hozása…" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} felhasználó" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Elnézést, még nincs megvalósítva!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Név" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Téma" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Szűrő nélkül nem ajánlott csoportos csevegéseket keresni. Ez eltarthat egy " "ideig, vagy egyáltalán nem működhet.\n" "Szeretné folytatni?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Hiba a csoportos csevegések listájának lekérésekor a kiszolgálóról." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Kapcsolat bontva a motorral." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Újrakapcsolódás a motorhoz… ({0} kísérlet)" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Indok: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Végzetes hiba volt észlelhető a smuxi kiszolgálóval való protokoll " "összeférhetetlenség miatt!\n" "\n" "Telepítse a Mono keretrendszert az előtétprogram oldalán, így az illeszkedik " "a smuxi kiszolgálóra.\n" "\n" "A problémával kapcsolatban további részletek találhatók itt:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Az előtétprogram elvesztette a kapcsolatot a kiszolgálóval.\n" "Szeretne most újrakapcsolódni?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Az újrakapcsolódás a kiszolgálóhoz sikertelen.\n" "Szeretné megpróbálni újra?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "A kiszolgáló elvesztette a kapcsolatot az előtétprogrammal.\n" "Szeretne most újrakapcsolódni?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Megjelenítés" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protokoll" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Gépnév" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Nem lehet betölteni a kiszolgálót: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Személyes / Magánjellegű" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Csoportos / Nyilvános" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Motor asszisztens - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Smuxi-motor hozzáadása" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Smuxi-motor szerkesztése" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Kapcsolat" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Hitelesítési adatok" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Most már használhatja a Smuxi-motort" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Köszönjük" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Egy motor már létezik ezzel a névvel! Adjon meg egy másik nevet." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Adja meg, hogy mely csevegéshez csatlakozik" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "A Smuxi névjegye" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Beállítások" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:266 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Nem lehet hozzáadni a kiszolgálót: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:391 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "A helyi motorra való átváltás bontani fogja a kapcsolatot a jelenlegi " "motorral!\n" "Biztosan ezt szeretné tenni?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:435 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "A távoli motorra való átváltás bontani fogja a kapcsolatot a jelenlegi " "motorral!\n" "Biztosan ezt szeretné tenni?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Nap megváltoztatva: {0} -> {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Nap megváltoztatva: {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Érvénytelen szűrő reguláris kifejezés: „{0}”. Ok: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Biztosan törölni szeretné a kijelölt szűrőt?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Hálózat" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokoll / Kiszolgáló" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Csevegéstípus" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normál" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Esemény" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Típus" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Minta" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Nincs proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Rendszer alapértelmezése" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Mentés" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Hozzáadás" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Nem támogatott" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Az alacsony sávszélességű mód aktív: nincsenek szinkronizált üzenetek." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "_Menüsor megjelenítése" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Felhasználólista lekérése ehhez: {0}…" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "kész." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Újrakapcsolódás" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "A protokollcsevegés bezárása be fog zárni minden hozzá kapcsolódott nyitott " "csevegést is!\n" "Biztosan ezt szeretné tenni?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Biztosan törölni szeretné a kijelölt kiszolgálót?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Nem lehet szerkeszteni a kiszolgálót: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Keresés" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Keresés erre:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Kis- és _nagybetű" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Keresés _visszafelé" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Keresés _elölről" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "_Reguláris kifejezések használata" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - csoportos csevegés keresése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Név:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Csatlakozás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "Smu_xi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Kiszolgáló" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Csevegés" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Nézet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Súgó" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Kapcsolódás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Napló megnyitása" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Beállítások" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Kilépés" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Kapcsolódás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Hozzáadás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Kezelés" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Megnyitás / csatlakozás csevegéshez" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Csoportos csevegés keresése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Minden _tevékenység törlése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Következő csevegés" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Előző csevegés" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Bezárás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Helyi motor használata" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Távoli motor hozzáadása" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Távoli motor átváltása" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "K_urzor mód" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Böngészés mód" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Á_llapotsor megjelenítése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Teljes képernyő" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Névjegy" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Csoportos csevegés keresése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Weboldal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "_Eszköztár megjelenítése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - kapcsolódás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - beállítások" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Becenevek:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Lapok" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr "Felhasználólista elhelyezkedése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr "Csatorna" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Csatornaszűrők" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Felhasználószűrők" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "_SSH-alagút használata" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Engedélyezi az SSH használatát a kapcsolatnál. Ennek " "van egy kis teljesítménybeli hatása, de biztonságosabb és NAT vagy port-" "alapú tűzfalak használatakor szükséges" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SS_H gép:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "Az SSH-kiszolgáló DNS vagy IP-címe és portja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "Az Smuxi-kiszolgáló DNS vagy IP-címe és portja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi gép:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "_SSH felhasználónév: (opcionális)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Az a felhasználónév, amely az SSH-kiszolgálóra való " "belépéshez lesz használva" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "_SSH jelszó: (opcionális)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Az a jelszó, amely az SSH-kiszolgálóra való belépéshez " "lesz használva. A jelszó nem kötelező, ha SSH-kulcs alapú hitelesítés van " "használatban (lásd lent)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_SSH kulcsfájl: (opcionális)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Válasszon egy fájlt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "A személyes SSH kulcsfájl, amely az SSH-kiszolgálóra " "való belépéshez lesz használva" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Felhasználónév:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Az a felhasználónév, amely az Smuxi-kiszolgálóra való " "belépéshez lesz használva" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Jelszó:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "A felhasználó jelszava" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "Jelszó _megerősítése:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Ismételje meg a jelszót az ellenőrzéshez" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Üdvözli a Smuxi-motor beállító asszisztense.\n" "Meg kell adnia néhány információt, mielőtt használni tudná a motort.\n" "\n" "A kezdéshez kattintson a „Tovább” gombra." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Motor neve:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Az új motor profilneve" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Alapértelmezett motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Használat új alapértelmezett motorként" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Ha engedélyezve van, akkor a jelenlegi motor lesz az " "alapértelmezett a Smuxi következő indításakor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - csevegés megnyitása" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Típus:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - kiszolgáló" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Gépnév:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Hálózat:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Becenév:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokoll:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Automatikus kapcsolódás a kiszolgálóhoz indításkor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Titkosítás használata" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Kiszolgáló tanúsítványának ellenőrzése" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Kapcsolódáskori parancsok:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Parancsok mellőzése" smuxi-1.1/po-Frontend-GNOME/ur.po0000664000175000017500000011024014011526464017345 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # makki , 2011. # Mirco Bauer , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:22+0100\n" "PO-Revision-Date: 2012-01-22 11:06+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid " Color " msgstr " Color " #: ../glade/smuxi-frontend-gnome.glade.h:3 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Entry Field " #: ../glade/smuxi-frontend-gnome.glade.h:4 msgid " Font " msgstr " Font " #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Highlighting " #: ../glade/smuxi-frontend-gnome.glade.h:6 msgid " Notification Area Icon " msgstr " Notification Area Icon " #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid " Person List Position " msgstr " Person List Position " #: ../glade/smuxi-frontend-gnome.glade.h:8 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Tab Colors " #: ../glade/smuxi-frontend-gnome.glade.h:9 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Tabs Position " #: ../glade/smuxi-frontend-gnome.glade.h:10 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Topic Position " #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Advanced" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "General" msgstr "General" #: ../glade/smuxi-frontend-gnome.glade.h:13 msgid "Global Commands" msgstr "Global Commands" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Message Buffer" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:15 msgid "Messaging Menu" msgstr "Messaging Menu" #: ../glade/smuxi-frontend-gnome.glade.h:16 msgid "Network Proxy" msgstr "Network Proxy" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Notification Popups" msgstr "Notification Popups" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Activity" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:209 msgid "Automatically connect to server at startup" msgstr "Automatically connect to server at startup" #: ../glade/smuxi-frontend-gnome.glade.h:20 msgid "Background" msgstr "Background" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash-Style Completion" #: ../glade/smuxi-frontend-gnome.glade.h:22 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Beep on highlight" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:23 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Bottom" #: ../glade/smuxi-frontend-gnome.glade.h:24 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Buffer Lines:" #: ../glade/smuxi-frontend-gnome.glade.h:25 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "C_onnection" #: ../glade/smuxi-frontend-gnome.glade.h:26 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Command Character:" #: ../glade/smuxi-frontend-gnome.glade.h:27 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Command History Size:" #: ../glade/smuxi-frontend-gnome.glade.h:28 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Completion Character:" #: ../glade/smuxi-frontend-gnome.glade.h:29 msgid "Enable" msgstr "Enable" #: ../glade/smuxi-frontend-gnome.glade.h:30 msgid "Enabled" msgstr "Enabled" #: ../glade/smuxi-frontend-gnome.glade.h:31 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Encoding:" #: ../glade/smuxi-frontend-gnome.glade.h:32 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Engine Buffer Lines:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Foreground" msgstr "Foreground" #: ../glade/smuxi-frontend-gnome.glade.h:34 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "General" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Highlight" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Highlight words:" #: ../glade/smuxi-frontend-gnome.glade.h:37 msgid "Host:" msgstr "Host:" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Hostname:" msgstr "Hostname:" #: ../glade/smuxi-frontend-gnome.glade.h:39 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Input" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Left" #: ../glade/smuxi-frontend-gnome.glade.h:42 msgid "Log Filtered Messages" msgstr "Log Filtered Messages" #: ../glade/smuxi-frontend-gnome.glade.h:43 msgid "Network:" msgstr "Network:" #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Nick Colors" #: ../glade/smuxi-frontend-gnome.glade.h:45 msgid "Nickname(s):" msgstr "Nickname(s):" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "No Activity" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "None" #: ../glade/smuxi-frontend-gnome.glade.h:48 msgid "Notification" msgstr "Notification" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "On Connect Commands:" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "On Startup Commands:" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Output" #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Override" msgstr "Override" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Password:" msgstr "Password:" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Persistency Type:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:55 msgid "Persistent Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:56 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:57 msgid "Protocol:" msgstr "Protocol:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 msgid "Realname:" msgstr "Realname:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Right" #: ../glade/smuxi-frontend-gnome.glade.h:60 msgid "Show Advanced Settings" msgstr "Show Advanced Settings" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:170 msgid "Show Password" msgstr "Show Password" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid "Show Smuxi in the messaging menu" msgstr "Show Smuxi in the messaging menu" #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Show always" msgstr "Show always" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid "Show notification popups" msgstr "Show notification popups" #: ../glade/smuxi-frontend-gnome.glade.h:65 msgid "Show when window is closed" msgstr "Show when window is closed" #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Show when window is minimized" msgstr "Show when window is minimized" #: ../glade/smuxi-frontend-gnome.glade.h:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid "Smuxi Preferences" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:69 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Strip Colors" #: ../glade/smuxi-frontend-gnome.glade.h:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Strip Formattings" #: ../glade/smuxi-frontend-gnome.glade.h:71 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Strip UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Tabs" #: ../glade/smuxi-frontend-gnome.glade.h:73 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Timestamp Format:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Top" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Type:" msgstr "Type:" #: ../glade/smuxi-frontend-gnome.glade.h:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Username:" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Volatile Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filters" #: ../glade/smuxi-frontend-gnome.glade.h:80 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interface" #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "_Logging" msgstr "_Logging" #: ../glade/smuxi-frontend-gnome.glade.h:82 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servers" #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "_Wrap Mode:" msgstr "_Wrap Mode:" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 msgid "Chat with other people on IRC" msgstr "Chat with other people on IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC Chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Smuxi IRC Client" msgstr "Smuxi IRC Client" #: ../src/Frontend-GNOME/AboutDialog.cs:60 msgid "translator-credits" msgstr "makki " #: ../src/Frontend-GNOME/AboutDialog.cs:65 msgid "Smuxi Website" msgstr "Smuxi Website" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oops, I did it again..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi crashed because an unhandled exception was thrown!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Here is the stacktrace, please report this bug!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Report Bug" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine Manager" msgstr "Engine Manager" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:80 msgid "Select which Smuxi engine you want to connect to" msgstr "Select which Smuxi engine you want to connect to" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:86 msgid "Engine:" msgstr "Engine:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:97 msgid "Use Low Bandwidth Mode" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:121 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:181 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:358 msgid "Local Engine" msgstr "Local Engine" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:173 msgid "Please select an engine!" msgstr "Please select an engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:194 #, csharp-format msgid "Your frontend version ({0}) does not match the engine version ({1})!" msgstr "Your frontend version ({0}) does not match the engine version ({1})!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:221 msgid "An error occurred while connecting to the engine!" msgstr "An error occurred while connecting to the engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:222 #, csharp-format msgid "Engine URL: {0}" msgstr "Engine URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:225 #, csharp-format msgid "Error: {0}" msgstr "Error: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:295 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Are you sure you want to delete the engine \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:443 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "You are going to paste {0} lines. Do you want to continue?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:547 msgid "Frontend Commands" msgstr "Frontend Commands" #: ../src/Frontend-GNOME/MainWindow.cs:252 msgid "_File" msgstr "_File" #: ../src/Frontend-GNOME/MainWindow.cs:276 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/MainWindow.cs:280 msgid "_Quick Connect" msgstr "_Quick Connect" #: ../src/Frontend-GNOME/MainWindow.cs:291 msgid "_Manage" msgstr "_Manage" #: ../src/Frontend-GNOME/MainWindow.cs:298 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/MainWindow.cs:302 msgid "Open / Join Chat" msgstr "Open / Join Chat" #: ../src/Frontend-GNOME/MainWindow.cs:308 msgid "_Find Group Chat" msgstr "_Find Group Chat" #: ../src/Frontend-GNOME/MainWindow.cs:314 msgid "C_lear All Activity" msgstr "C_lear All Activity" #: ../src/Frontend-GNOME/MainWindow.cs:321 msgid "_Next Chat" msgstr "_Next Chat" #: ../src/Frontend-GNOME/MainWindow.cs:335 msgid "_Previous Chat" msgstr "_Previous Chat" #: ../src/Frontend-GNOME/MainWindow.cs:389 msgid "Open Log" msgstr "Open Log" #: ../src/Frontend-GNOME/MainWindow.cs:407 msgid "_Engine" msgstr "_Engine" #: ../src/Frontend-GNOME/MainWindow.cs:411 msgid "_Use Local Engine" msgstr "_Use Local Engine" #: ../src/Frontend-GNOME/MainWindow.cs:417 msgid "_Add Remote Engine" msgstr "_Add Remote Engine" #: ../src/Frontend-GNOME/MainWindow.cs:422 msgid "_Switch Remote Engine" msgstr "_Switch Remote Engine" #: ../src/Frontend-GNOME/MainWindow.cs:429 msgid "_View" msgstr "_View" #: ../src/Frontend-GNOME/MainWindow.cs:433 msgid "_Caret Mode" msgstr "_Caret Mode" #: ../src/Frontend-GNOME/MainWindow.cs:445 msgid "_Browse Mode" msgstr "_Browse Mode" #: ../src/Frontend-GNOME/MainWindow.cs:463 #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:722 msgid "Show _Menubar" msgstr "Show _Menubar" #: ../src/Frontend-GNOME/MainWindow.cs:494 msgid "_Help" msgstr "_Help" #: ../src/Frontend-GNOME/MainWindow.cs:768 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:225 msgid "Unable to add server: " msgstr "Unable to add server: " #: ../src/Frontend-GNOME/MainWindow.cs:828 #, csharp-format msgid "Unknown ChatType: {0}" msgstr "Unknown ChatType: {0}" #: ../src/Frontend-GNOME/MainWindow.cs:1097 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" #: ../src/Frontend-GNOME/MainWindow.cs:1139 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Sorry, not implemented yet!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Character" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Word" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:197 msgid "Volatile" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:199 msgid "Persistent" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:222 msgid "No Proxy" msgstr "No Proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:224 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:307 msgid "System Default" msgstr "System Default" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:238 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:140 msgid "Connection" msgstr "Connection" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "Interface" msgstr "Interface" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:246 msgid "Servers" msgstr "Servers" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:253 msgid "Filters" msgstr "Filters" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:257 msgid "Logging" msgstr "Logging" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:642 msgid "Nicknames(s) field must not be empty." msgstr "Nicknames(s) field must not be empty." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:823 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Invalid highlight regex: '{0}'. Reason: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:106 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:271 msgid "Name" msgstr "Name" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Topic" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Error while fetching the list of group chats from the server." #: ../src/Frontend-GNOME/Frontend.cs:325 msgid "Disconnected from engine." msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:368 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:465 #, csharp-format msgid "Cause: {0}" msgstr "Cause: {0}" #: ../src/Frontend-GNOME/Frontend.cs:583 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" #: ../src/Frontend-GNOME/Frontend.cs:602 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Reconnecting to the server has failed.\n" "Do you want to try again?" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" #: ../src/Frontend-GNOME/NotifyManager.cs:267 msgid "Show" msgstr "Show" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:62 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:238 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protocol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:63 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Hostname" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:166 msgid "Unable to load server: " msgstr "Unable to load server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:244 msgid "Person / Private" msgstr "Person / Private" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:245 msgid "Group / Public" msgstr "Group / Public" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:71 msgid "Engine Assistant - Smuxi" msgstr "Engine Assistant - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:93 msgid "Add Smuxi Engine" msgstr "Add Smuxi Engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:95 msgid "Edit Smuxi Engine" msgstr "Edit Smuxi Engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:204 msgid "Credentials" msgstr "Credentials" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:284 msgid "Now you can use the Smuxi Engine" msgstr "Now you can use the Smuxi Engine" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:287 msgid "Thank you" msgstr "Thank you" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:304 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "" "An engine with this name already exists! Please specify a different one." #: ../src/Frontend-GNOME/Views/MessageTextView.cs:204 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:210 #, csharp-format msgid "Day changed to {0}" msgstr "Day changed to {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:123 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:133 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Invalid filter regex: '{0}'. Reason: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:200 msgid "Are you sure you want to delete the selected filter?" msgstr "Are you sure you want to delete the selected filter?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:246 msgid "Protocol / Server" msgstr "Protocol / Server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:253 msgid "Chat Type" msgstr "Chat Type" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:287 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:288 msgid "Event" msgstr "Event" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:295 msgid "Type" msgstr "Type" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:321 msgid "Pattern" msgstr "Pattern" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:506 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:245 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Retrieving user list for {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:279 msgid "done." msgstr "done." #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:290 msgid "Person" msgstr "Person" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:69 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:187 msgid "Are you sure you want to delete the selected server?" msgstr "Are you sure you want to delete the selected server?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:243 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:277 msgid "Unable to edit server: " msgstr "Unable to edit server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Find" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Search for:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Match Case" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Search _Backwards" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Wrap Around" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Use _Regular Expressions" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Find Group Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Name:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Quick Connect" msgstr "Smuxi - Quick Connect" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferences" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Nicknames:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " User List Position " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Channel " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Channel Filters" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "User Filters" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Use _SSH Tunnel" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH _Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS or IP address and port of the SSH server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:129 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "" "DNS or IP address and port of the Smuxi server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH Username: (optional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "" "Username which will be used to log into the SSH " "server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH Password: (optional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:188 msgid "_Username:" msgstr "_Username:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Username which will be used to log into the Smuxi " "server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:87 msgid "_Password:" msgstr "_Password:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Password of the user" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Verify Password:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Repeat the password for verification" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Engine Name:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Profile name of the new engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Default Engine:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Use as new default engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "" "If enabled, the current engine will be the default next" " time Smuxi is started" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Open Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Type:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:54 msgid "_Hostname:" msgstr "_Hostname:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:75 msgid "_Network:" msgstr "_Network:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:198 msgid "_Protocol:" msgstr "_Protocol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:222 msgid "Use Encryption" msgstr "Use Encryption" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:234 msgid "Validate Server Certificate" msgstr "Validate Server Certificate" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:254 msgid "_On Connect Commands:" msgstr "_On Connect Commands:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:265 msgid "_Ignore Commands" msgstr "_Ignore Commands" smuxi-1.1/po-Frontend-GNOME/fr.po0000664000175000017500000013670714011526464017346 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2011-2013,2015-2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2017-09-23 18:02+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/meebey/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Préférences de Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "Le surnom est déjà en cours d'utilisation. Vous pouvez spécifier plus d'un seul surnom, séparés par des espaces. Ceux ci seront utilisés comme solution de repli si le premier surnom n'est pas disponible. Par défaut, $nick et $nick__ sont utilisés." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Surnom(s) :" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nom d'utilisateur :" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nom réel :" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Encodage :" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Convertir automatiquement les caractères UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Général" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Type :" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Nom d'hôte :" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Mot de passe :" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port :" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Afficher le mot de passe" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proxy réseau" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Commandes de connexion :" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Commandes de démarrage :" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Commandes globales" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "C_onnexion" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format temporel :" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Lignes du tampon :" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Lignes du tampon moteur" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = secondes\nmm = minutes\nhh = heures (format 01 - 12)\nHH = heures (format 00 - 23)\ntt = AM/PM\n\ndd = jour\nMM = mois\nyy/yyyy = année" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Type de persistance :" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Lignes de tampon volatiles" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Lignes de tampon sauvegardées :" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Tampon de messages" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Ignorer les couleurs" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Ignorer le formatage" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Ignorer l'UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Afficher les reglages avancés" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avancé" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Général" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Haut" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Bas" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Gauche" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Droite" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Aucun" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Position des onglets " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Surligner" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Activité" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Aucune activité" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Couleur des onglets " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Ouvrir automatiquement les nouveaux chats de personne" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Ouvrir automatiquement les nouveaux chats de groupe" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Arbre" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Caractère de complétion :" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Caractère des commandes :" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Taille de l'historique des commandes :" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Complétion style Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Champ d'entrée " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Entrée" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Couleur du surnom" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Position de la liste des utilisateurs " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Ignorer" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Police " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Position du sujet " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Texte" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Arrière plan" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Couleur " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "Mode _circulaire :" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Discussion " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Mots surlignés :" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Émettre un son en cas de surlignage" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Surlignement " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Sortie" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Activer" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Toujours montrer" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Montrer quand la fenêtre est minimisée" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Montrer quand la fenêtre est fermée" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Icône de l'aire de notification " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Afficher Smuxi dans le menu messagerie" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Menu de messagerie" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Afficher les popups de notification" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Popups de notification" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Notification" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interface" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Serveurs" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtres" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Activé" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Journaliser les messages filtrés" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Journalisation" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Serveur" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Se connecter automatiquement au serveur à chaque démarrage" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Protocole :" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Réseau :" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Nom d'hôte" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Chat IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Client IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Chatter sur IRC avec d'autres gens" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "chat;méssagerie;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Chatter avec d'autres gens sur IRC, Twitter, Jabber et Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi est un client de chat distribué et open-source pour IRC, Twitter, Jabber/XMPP, Campfire et JabbR SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "Smuxi est inspiré de la combinaison de screen et irssi, il dispose d'un serveur détachable (comme un client \"normal\") qui reste connecté quand vous ne l'êtes pas. Il est capable d'accepter plusieurs frontaux Smuxi qui restent connectés et synchrones. Tout ceci tres similaire au couple screen+irssi ou un bouncer IRC, de façon plus élégante et puissante." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "La fenêtre principale affichant un canal IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Clément Bourgeois " #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Site web de Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "OoOps, boulette..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi a planté en raison de la levée d'une exception non gérée !" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Voici la pile d'appels, envoyez le rapport de bug s'il-vous-plaît ! " #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Rapporter un bogue" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Moteur non trouvé." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Gestionnaire de moteurs" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Sélectionnez le moteur Smuxi auquel vous voulez vous connecter" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Moteur :" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Utiliser le mode bande passante faible" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Moteur local" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Sélectionnez un moteur s'il vous plaît !" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "Votre frontal n'est pas compatible avec le moteur !\nVersion moteur : {0}, Version frontal : {1}\nProtocole moteur : {2}, Protocole frontal : {3} " #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Une erreur est survenue durant la connexion au moteur !" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL du moteur : {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Erreur : {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Êtes vous sûr(e) de vouloir supprimer le moteur \"{0}\" ?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Vous vous apprêtez à coller {0} lignes de texte, êtes vous sûr(e) de vouloir continuer ?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Commandes Frontend" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Activer la sortie déboggage" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Affiche cette aide" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Options :" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Se connecter au moteur" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Ouvre le lien séléctionné dans Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Démarre une nouvelle instance de Smuxi en ignorant une instance existante" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Passage du lien à l'instance de Smuxi déja existante..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Retour de l'instance existante de Smuxi au premier plan..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Utilisateurs" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Désolé, fonctionnalité pas encore implémentée !" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Caractère" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Mot" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "Ce paramètre définit si Smuxi doit sauvegarder les messages en mémoire (volatile) ou sur le disque (persistant). \nPour la persistance vous pouvez choisir parmi Db4o, une base de données objet ou SQLite, une base de données relationnelle. \nLe moteur Db4o a des problemes connus comme une utilisation importante de la mémoire et du CPU allant jusqu'a des plantages, il est déprécié.\nLe moteur SQLite n'a pas de probleme de performance ou de stabilité connu et est recommandé." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "Persistant : SQLite (recommandé)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Persistant : Db4o (déprécié)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Persitant (developpement)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Volatile" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Pas de proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Défaut du système" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Connexion" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Interface" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Serveurs" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Filtres" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Journalisation" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Le champ surnom(s) ne doit pas être vide." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Expression régulière de surlignage invalide '{0}'. Raison : {1} " #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Nom" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Sujet" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "Chercher des groupes de discussion" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Erreur durant la récupération de la liste des groupes de discussion du serveur." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Déconnecté du moteur." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Reconnexion au moteur... (essai {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Cause : {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "Le serveur a perdu la connexion a l'interface.\nVoulez-vous vous reconnecter maintenant ?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "La reconnexion au serveur a échoué.\nVoulez-vous vous reconnecter maintenant ?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "Le serveur a perdu la connexion à l'interface.\nVoulez-vous vous reconnecter maintenant ?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Afficher" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protocole" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Nom d'hôte" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Impossible de charger le serveur :" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Personne / Privé" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Groupe / Public" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Assistant moteur - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Ajouter un moteur Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Editer un moteur Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Autorisations" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Vous êtes prêt à utiliser le moteur Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Merci" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Un moteur avec ce nom éxiste deja ! Veuillez en spécifier un autre." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Entrez le nom du chat à rejoindre" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "À propos de Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Préférences" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Impossible d'ajouter le serveur :" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Changer de moteur vers le moteur local va vous déconnecter du moteur actuel !\nÊtes vous sûr(e) de vouloir continuer ?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Changer de moteur pour un moteur distant va vous déconnecter du moteur actuel !\nÊtes vous sûr(e) de vouloir continuer ?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Jour changé de {0} à {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "Jour changé à {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Expression régulière de filtrage invalide '{0}'. Raison : {1} " #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Êtes vous sûr(e) de vouloir supprimer le filtre sélectionné ?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Protocole / Serveur" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Type de chat" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Evenement" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Type :" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Motif" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Mode faible bande passante activé : aucun message synchronisé." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Afficher la barre de _menus" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Téléchargement de la liste des utilisateurs pour {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "terminé." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Reconnecter" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "Fermer la fenêtre de chat du protocole va aussi fermer toutes discussions connectées sur celui-ci !\nÊtes vous sûr(e) de vouloir continuer ?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Êtes vous sûr(e) de vouloir supprimer le serveur sélectionné ?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Impossible d'editer le serveur :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Rechercher" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Terme de recherche :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Respecter la casse" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Recherche en _arrière" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Recherche _cyclique" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Utiliser des _expression régulières" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Trouver un groupe de discussion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nom :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Rejoindre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Serveur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Discussion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Moteur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Vue" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Aide" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Connexion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Ouvrir le journal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Préférences" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Quitter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "Connexion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Ajouter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Gestion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Ouvrir / Rejoindre chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Rechercher le groupe de discussion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Supprimer toute activité" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Discussion _suivante" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Discussion _précédente" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Fermer" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Utiliser le moteur local" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Ajouter un moteur distant" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Changer de moteur distant" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Mode _curseur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Mode _navigateur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Afficher la barre de status" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Plein écran" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_À propos" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Rechercher le groupe de discussion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "Site web de Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Afficher la barre d'ou_tils" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Connexion" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Préférences" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Surnoms :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Onglets" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Position de la liste d'utilisateurs " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Canal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtres de canaux" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtres d'utilisateurs" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Utiliser un tunnel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "Active l'utilisation de SSH pour la connexion. Ceci a un leger impact négatif sur les performances, mais améliore la sécurité et est parfois nécéssaire en cas d'utilisation d'un systeme NAT ou d'un firewall régi par ports" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH _Hôte:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "Adresse IP ou DNS et port du serveur SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "Adresse IP ou DNS et port du serveur Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi Hôte:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "Nom d'utilisateur _SSH (optionnel) :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "Nom d'utilisateur qui sera utilisé pour l'enregistrement auprès du moteur Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "Mot de passe _SSH (optionnel) :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "Le mot de passe qui sera utilisé pour la connexion au serveur SSH. Le mot de passe est optionnel si l'authentification par fichier de clé SSH est activé (voir ci-dessous)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "Fichier de clé_SSH : (optionnel)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Choisissez un fichier" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "Le fichier de clé SSH sera utilisé pour l'authentification sur le serveur SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Nom d'utilisateur :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "Nom d'utilisateur qui sera utilisé pour l'enregistrement auprès du moteur Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "Mot de _passe :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Mot de passe de l'utilisateur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Vérification du mot de passe :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Retapez le mot de passe pour vérification" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "Bienvenue sur l'assistant de configuration du moteur Smuxi.\nVous devez entrer plusieurs informations avant de pouvoir utiliser le moteur.\n\nCliquez sur \"Suivant\" pour commencer." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Nom du _moteur :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nom du profil pour l'entrée du nouveau moteur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "Moteur par _défaut :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Utiliser comme moteur par défaut" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "Activé, cette fonctionnalité rend le moteur courant par défaut au prochain démarrage de Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Ouvrir un chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Type :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Nom d'hôte :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Réseau :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Surnom :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocole :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Utiliser le chiffrement" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Valider le certificat du serveur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Commandes de _connexion :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Ignorer les commandes" smuxi-1.1/po-Frontend-GNOME/sr.po0000664000175000017500000015176714011526464017366 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright © 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016–2018. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:46+0000\n" "PO-Revision-Date: 2018-02-24 09:11+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: српски \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Project-Style: gnome\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Поставке Смуксија" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Надимак за коришћење. Можете да наведете још надимака (раздвојених " "размацима) који ће бити коришћени у случају да први избор није доступан. По " "основи „$nick_“ и „$nick__“ ће се користити као резерве." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Надимак(ци):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Корисник:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Право име:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Кодирање:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Сам претвори УТФ_8 знакове" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Опште" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Врста:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Домаћин:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Лозинка:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Прикључник:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Прикажи лозинку" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Мрежни посредник" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Наредбе на повезивање:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Наредбе на покретање:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Опште наредбе" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Веза" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Запис времена:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Редови међумеморије:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Редови међумеморије погона:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "сс = секунде\n" "мм = минути\n" "чч = сати (01 — 12)\n" "ЧЧ = сати (00 — 23)\n" "тт = ПрП/ПоП\n" "\n" "дд = дан\n" "ММ = месец\n" "гг/гггг = година" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Врста трајности:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Редови непостојане међумеморије:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Редови трајне меморије:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Међумеморија поруке" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Боје траке" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Облик траке" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "УТФ-8 траке" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Прикажи напредна подешавања" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Напредно" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Опште" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Горе" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Доле" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Лево" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Десно" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Ништа" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Положај језичака " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Истицање" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Активност" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Нема активности" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Приступи/Одлази/Режим" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Боје језичака " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Сам се пребаци на ново отворено ћаскање особе" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Сам се пребаци на ново отворено ћаскање групе" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Стабло" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Знак довршавања:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Знак наредбе:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Величина историјата наредби:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Довршавање у стилу баша" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Поље уноса " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Улаз" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Боје надимка" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Положај списка особа " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Препиши" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Слова " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Положај теме " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Прочеље" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Позадина" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Боја " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Начин прелома:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Ћаскање " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Истакни речи:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Запишти при истицању" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Истицање " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Излаз" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Укључи" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Прикажи увек" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Прикажи када је прозор умањен" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Прикажи када је прозор затворен" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Иконица области обавештења " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Прикажи Смуксија у изборнику дописивања" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Изборник дописивања" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Прикажи облачиће обавештења" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Облачићи обавештења" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Обавештење" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Уређај" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Сервери" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Филтери" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Укључено" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Прибележи издвојене поруке" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Прибележавање" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Смукси" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Интернет ћаскање" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Смукси клијент интернет ћаскања" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Ћаскајте са другим људима на интернету" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "ћаскање;дописивање;порука;им;гном;гтк;ирц;твитер;фејсбук;гразговор;иксмпп;" "џабер;кампфајер;џаббр;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Ћаскајте са другим људима на ИРЦ-у, Твитеру, Џаберу и Кампфајеру" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Смукси је отвореног кода, расподељен и кориснику наклоњен програм за ћаскање " "за ИРЦ, Твитер, Џабер/ИксМПП, Кампфајер и СигналР-ов ЏаббР." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Инспирисан комбинацијом екрана и ирсси-ја, Смукси поседује откачив сервер " "(или као „обичан“ клијент) који остаје повезан када ви нисте, и може да " "допусти да више Смуксијевих челника буду повезани и усаглашени. Ово је " "слично као екран+ирсси или избацивачи ИРЦ-ија, али елегантније и моћније." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Главни прозор који приказује канал интернет ћаскања" #: ../src/Frontend-GNOME/AboutDialog.cs:70 msgid "translator-credits" msgstr "" "Мирослав Николић \n" "\n" "http://prevod.org — превод на српски језик" #: ../src/Frontend-GNOME/AboutDialog.cs:83 msgid "Smuxi Website" msgstr "Веб страница Смуксија" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Ууупс, опет сам то урадио..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Смукси се урушио јер се догодио непознати изузетак!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Ово је праћење спремника, пријавите ову грешку!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Пријави грешку" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Нисам нашао погон." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Управник погона" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Изаберите на који Смуксијев погон желите да се повежете" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Погон:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Користи режим ниског пропусног опсега" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Локални погон" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Изаберите неки погон, бре!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Ваш челник није сагласан са погоном!\n" "Издање погона: {0} Издање челника: {1}\n" "Протокол погона: {2} Протокол челника: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Дошло је до грешке приликом повезивања на погон!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Адреса погона: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Грешка: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Да ли сигурно желите да обришете погон „{0}“?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Прећи ћете {0} реда. Да ли желите да наставите?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Наредбе челника" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Укључује излаз прочишћавања" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Приказује ову помоћ" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Опције:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Повезује се са погоном" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Отвара наведене везе у Смуксију" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Покреће нови примерак Смуксија и занемарује онај постојећи" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Прослеђујем вез већ покренутом примерку Смуксија..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Доносим у први план већ покренути примерак Смуксија..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} корисника" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Извините, још није примењено!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Назив" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Тема" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Тражење групних ћаскања без филтера није препоручљиво. Јер може потрајати, " "или уопште неће ни радити.\n" "Да ли желите да наставите?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Грешка приликом набављања списка групних ћаскања са сервера." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Прекинута је веза са погоном." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Поново се повезујем са погоном... (покушавам {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Разлог: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Откривена је кобна грешка због несагласности протокола са сервером смуксија!" "\n" "\n" "Инсталирајте Моно на страни челника тако да одговара серверу смуксија.\n" "\n" "Више о овом проблему можете наћи овде:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Челник је изгубио везу са сервером.\n" "Да ли сада желите да се поново повежете?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Поновно повезивање са сервером није успело.\n" "Да ли желите поново да покушате?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Сервер је изгубио везу са челником.\n" "Да ли сада желите да се поново повежете?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Покажи" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Протокол" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Рачунар" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Не могу да учитам сервер: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Особа / Лично" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Група / Јавно" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Помоћник погона — Смукси" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Додајте Смуксијев погон" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Уредите Смуксијев погон" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Веза" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Пуномоћства" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Сада можете да користите Смуксијев погон" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Хвала вам" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Погон са овим називом већ постоји! Наведите неки други." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Упишите ком ћаскању да се придружим" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "О Смуксију" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Поставке" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:266 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Не могу да додам сервер: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:391 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Пребацивање на локални погон ће прекинути везу са текућим погоном!\n" "Да ли сигурно желите то да урадите?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:435 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Пребацивање на удаљени погон ће прекинути везу са текућим погоном!\n" "Да ли сигурно желите то да урадите?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Дан је промењен из {0} у {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Дан је промењен у {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Неисправан регуларан израз филтера: „{0}“. Разлог: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Да ли сигурно желите да обришете изабрани филтер?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 #| msgid "_Network:" msgid "Network" msgstr "Мрежа" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Протокол / Сервер" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Врста ћаскања" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Обично" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Догађај" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Врста" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Шаблон" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Нема посредника" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Основност система" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Сачувај" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 #| msgid "_Add" msgid "Add" msgstr "Додај" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Неподржано" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Режим ниског пропусног опсега је активан: поруке нису усаглашене." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Прикажи _траку изборника" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Набављам списак корисника за {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "готово." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Повежи поново" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Затварање ћаскања протокола ће такође затворити сва отворена ћаскања " "повезана са њим!\n" "Да ли сигурно желите то да урадите?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Да ли сигурно желите да обришете изабрани сервер?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Не могу да уредим сервер: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Нађи" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Потражи:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Упореди _величину слова" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Тражи _уназад" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Преламај _около" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Користи _регуларне изразе" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Смукси — Нађите ћаскање групе" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Назив:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Приступи" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Смукси" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Сервер" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Ћаскање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Погон" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "Пре_глед" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "По_моћ" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Повежи се" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Отвори дневник" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "По_ставке" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Изађи" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Повежи се" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Додај" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Управљај" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Отвори / Приступи ћаскању" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Нађи ћаскање групе" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Очисти све активности" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Следеће ћаскање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Претходно ћаскање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Затвори" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Користи локални погон" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Додај удаљени погон" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Промени удаљени погон" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Режим _уметка" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Режим _разгледања" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Прикажи траку _стања" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "Преко целог _екрана" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_О програму" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Нађите ћаскање групе" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Веб страница" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Прикажи траку _алата" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Смукси — повезивање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Смукси — поставке" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Надимци:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Језичци" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Положај списка корисника " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Канал " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Филтери канала" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Филтери корисника" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Користи тунел _безбедне шкољке" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Укључује коришћење безбедне шкољке за везу. Ово мало " "утиче на сам рад, али је безбедније и потребо је када се користи НАТ или " "мрежне баријере засноване на прикључнику" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "БШ _домаћин:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "ДНС или ИП адреса и прикључник сервера безбедне шкољке" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Прикључник:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "ДНС или ИП адреса и прикључник Смукси сервера" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Домаћин _Смуксија:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "_Корисничко име БШ: (изборно)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Корисничко име које ће бити коришћено за пријављивање " "на сервер безбедне шкољке" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "_Лозинка БШ: (изборно)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Лозинка која ће бити коришћена за пријављивање на " "сервер безбедне шкољке. Лозинка није обавезна ако се користи кључ " "потврђивања идентитета безбедне шкољке (видети испод)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_Датотека кључа БШ: (изборно)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Изаберите датотеку" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Датотека личног кључа безбедне шкољке која ће бити " "коришћена за пријављивање на сервер безбедне шкољке" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Корисник:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Корисничко име које ће бити коришћено за пријављивање " "на сервер Смуксија" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Лозинка:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Корисникова лозинка" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Провери лозинку:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Понови лозинку за проверавање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Добродошли у помоћника подешавања погона Смуксија.\n" "Морате унети неке податке да бисте могли да користите погон.\n" "\n" "Притисните „Напред“ да почнете." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Назив погона:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Назив профила новог погона" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Основни погон:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Користи као нови основни погон" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Ако је укључено, текући погон ће бити основни приликом " "следећег покретања Смуксија" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Смукси — Отворите ћаскање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Врста:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Смукси — Сервер" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Рачунар:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Мрежа:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Надимак:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Протокол:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Сам се повежи на сервер приликом покретања" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Користи шифровање" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Провери уверење сервера" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Наредбе на _повезивање:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Занемари наредбе" #~ msgid "Character" #~ msgstr "Знак" #~ msgid "Word" #~ msgstr "Реч" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues and is " #~ "the recommended setting." #~ msgstr "" #~ "Ово подешавање наводи да ли ће Смукси да чува поруке ћаскања у меморији " #~ "(непостојано) или на диску (трајно).\n" #~ "За трајно можете изабрати између Дб4о, објектне базе података или " #~ "СКуЛајта, односне базе података.\n" #~ "Дб4о позадинац је познат по проблему великог оптерећења меморије и " #~ "процесора и може чак да доведе до урушавања и као такав је застарео.\n" #~ "СКуЛајт позадинац нема познатих проблема са радом или стабилношћу и као " #~ "такав је препоручљивији." #~ msgid "Persistent: SQLite (Recommended)" #~ msgstr "Трајно: СКуЛајт (препоручљиво)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Трајно: Дб4о (застарело)" #~ msgid "Persistent (Preview)" #~ msgstr "Трајно (преглед)" #~ msgid "Volatile" #~ msgstr "Непостојано" #~ msgid "Interface" #~ msgstr "Уређај" #~ msgid "Servers" #~ msgstr "Сервери" #~ msgid "Filters" #~ msgstr "Филтери" #~ msgid "Logging" #~ msgstr "Прибележавање" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Поље са надимком не сме бити празно." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Неисправан регуларан израз истицања: „{0}“. Разлог: {1}" smuxi-1.1/po-Frontend-GNOME/sl.po0000664000175000017500000013016414011526464017344 0ustar00meebeymeebey00000000000000# 'smuxi/po-Frontend-GNOME/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:41+0000\n" "PO-Revision-Date: 2016-03-11 22:58+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Možnosti Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:3 #, fuzzy msgid "Nickname(s):" msgstr "_Vzdevek" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 #, fuzzy msgid "Username:" msgstr "Uporabniško ime:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 #, fuzzy msgid "Realname:" msgstr "Uporabnika @REALNAME@" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 #, fuzzy msgid "Encoding:" msgstr "Kodiranje:" #: ../glade/smuxi-frontend-gnome.glade.h:7 #, fuzzy msgid "Automatically convert UTF-8 characters" msgstr "Pretvorba iz nabora znakov '%s' v UTF-8 ni uspela" #: ../glade/smuxi-frontend-gnome.glade.h:8 #, fuzzy msgid "General" msgstr "Splošno" #: ../glade/smuxi-frontend-gnome.glade.h:9 #, fuzzy msgid "Type:" msgstr "Vrsta:" #: ../glade/smuxi-frontend-gnome.glade.h:10 #, fuzzy msgid "Host:" msgstr "Gostitelj:" #: ../glade/smuxi-frontend-gnome.glade.h:11 #, fuzzy msgid "Password:" msgstr "Geslo:" #: ../glade/smuxi-frontend-gnome.glade.h:12 #, fuzzy msgid "Port:" msgstr "Vrata:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 #, fuzzy msgid "Show Password" msgstr "Pokaži geslo" #: ../glade/smuxi-frontend-gnome.glade.h:14 #, fuzzy msgid "Network Proxy" msgstr "Zakasnitev omrežja:" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 #, fuzzy msgid "On Connect Commands:" msgstr "Ukazi:\n" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 #, fuzzy msgid "On Startup Commands:" msgstr "Zagon:\n" #: ../glade/smuxi-frontend-gnome.glade.h:17 #, fuzzy msgid "Global Commands" msgstr "%% :" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 #, fuzzy msgid "C_onnection" msgstr "P_ovezava" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 #, fuzzy msgid "Timestamp Format:" msgstr "" "Neveljaven zapis časovnega žiga '%s' (zapis mora biti v obliki YYYY-MM-DD HH:" "MM:SS[.ms])" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 #, fuzzy msgid "Buffer Lines:" msgstr "Črte" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 #, fuzzy msgid "Engine Buffer Lines:" msgstr "Medpomnilnik" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:31 #, fuzzy msgid "Persistency Type:" msgstr "po vrsti" #: ../glade/smuxi-frontend-gnome.glade.h:32 #, fuzzy msgid "Volatile Buffer Lines:" msgstr "Črte" #: ../glade/smuxi-frontend-gnome.glade.h:33 #, fuzzy msgid "Persistent Buffer Lines:" msgstr "Črte" #: ../glade/smuxi-frontend-gnome.glade.h:34 #, fuzzy msgid "Message Buffer" msgstr "%% :" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 #, fuzzy msgid "Strip Colors" msgstr "Zamik trakov" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 #, fuzzy msgid "Strip Formattings" msgstr "Zamik trakov" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 #, fuzzy msgid "Strip UTF-8" msgstr "Zamik trakov" #: ../glade/smuxi-frontend-gnome.glade.h:38 #, fuzzy msgid "Show Advanced Settings" msgstr "Prilagodi napredne nastavitve GNOME 3" #: ../glade/smuxi-frontend-gnome.glade.h:39 #, fuzzy msgid "Advanced" msgstr "Napredne možnosti" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 #, fuzzy msgid "General" msgstr "Splošno" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 #, fuzzy msgid "Top" msgstr "Vrhnji" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 #, fuzzy msgid "Bottom" msgstr "Spodnji" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 #, fuzzy msgid "Left" msgstr "Leva" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 #, fuzzy msgid "Right" msgstr "Desna" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 #, fuzzy msgid "None" msgstr "brez" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 #, fuzzy msgid " Tabs Position " msgstr "%% :" #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 #, fuzzy msgid "Highlight" msgstr "Poudari" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 #, fuzzy msgid "Activity" msgstr "" "Zaženi gitg z dejavnostjo uveljavljanja (okrajšava za --activity commit)" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 #, fuzzy msgid "No Activity" msgstr "Zadnja dejavnost:" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 #, fuzzy msgid "Join/Part/Mode" msgstr "_Pridruži se" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 #, fuzzy msgid " Tab Colors " msgstr "Barve" #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:54 #, fuzzy msgid "Tree" msgstr "Drevo" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 #, fuzzy msgid "Completion Character:" msgstr "Najmanjše število znakov za dopolnjevanje:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 #, fuzzy msgid "Command Character:" msgstr "Ukaz" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 #, fuzzy msgid "Command History Size:" msgstr "Pokaži zgodovino ukazne vrstice" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 #, fuzzy msgid "Bash-Style Completion" msgstr "_Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 #, fuzzy msgid " Entry Field " msgstr "Lastnosti polja" #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 #, fuzzy msgid "Input" msgstr "Vhod" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 #, fuzzy msgid "Nick Colors" msgstr "Vzdevek" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:63 #, fuzzy msgid "Override" msgstr "_Iz polja prepisa" #: ../glade/smuxi-frontend-gnome.glade.h:64 #, fuzzy msgid " Font " msgstr "%B" #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 #, fuzzy msgid " Topic Position " msgstr "%% :" #: ../glade/smuxi-frontend-gnome.glade.h:66 #, fuzzy msgid "Foreground" msgstr "Pisava" #: ../glade/smuxi-frontend-gnome.glade.h:67 #, fuzzy msgid "Background" msgstr "Ozadje" #: ../glade/smuxi-frontend-gnome.glade.h:68 #, fuzzy msgid " Color " msgstr "%% :" #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 #, fuzzy msgid "_Wrap Mode:" msgstr "način preloma" #: ../glade/smuxi-frontend-gnome.glade.h:71 #, fuzzy msgid " Chat " msgstr "%% :" #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 #, fuzzy msgid "Highlight words:" msgstr "_Poudari napačno črkovane besede" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 #, fuzzy msgid "Beep on highlight" msgstr "Poudari" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 #, fuzzy msgid " Highlighting " msgstr "%% :" #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 #, fuzzy msgid "Output" msgstr "Rezultati_analize" #: ../glade/smuxi-frontend-gnome.glade.h:76 #, fuzzy msgid "Enable" msgstr "Omogoči" #: ../glade/smuxi-frontend-gnome.glade.h:77 #, fuzzy msgid "Show always" msgstr "Vedno pokaži kazalko besedilnega polja" #: ../glade/smuxi-frontend-gnome.glade.h:78 #, fuzzy msgid "Show when window is minimized" msgstr "Pri skrčenju okna programa pokaži ikono v sistemski vrstici" #: ../glade/smuxi-frontend-gnome.glade.h:79 #, fuzzy msgid "Show when window is closed" msgstr "Kadar je pokrov prenosnika zaprt" #: ../glade/smuxi-frontend-gnome.glade.h:80 #, fuzzy msgid " Notification Area Icon " msgstr "Omogoči ikono v obvestilnem področju." #: ../glade/smuxi-frontend-gnome.glade.h:81 #, fuzzy msgid "Show Smuxi in the messaging menu" msgstr "Pokaži hipno sporočanje" #: ../glade/smuxi-frontend-gnome.glade.h:82 #, fuzzy msgid "Messaging Menu" msgstr "Razporeditev menija Nautilusa" #: ../glade/smuxi-frontend-gnome.glade.h:83 #, fuzzy msgid "Show notification popups" msgstr "Pokaži pojavna obvestila" #: ../glade/smuxi-frontend-gnome.glade.h:84 #, fuzzy msgid "Notification Popups" msgstr "Obvestilo o prispevku" #: ../glade/smuxi-frontend-gnome.glade.h:85 #, fuzzy msgid "Notification" msgstr "Obvestilo" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 #, fuzzy msgid "_Interface" msgstr "Vmesnik" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 #, fuzzy msgid "_Servers" msgstr "Strežniki ključev" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 #, fuzzy msgid "_Filters" msgstr "Filtri" #: ../glade/smuxi-frontend-gnome.glade.h:89 #, fuzzy msgid "Enabled" msgstr "Onemogočeno" #: ../glade/smuxi-frontend-gnome.glade.h:90 #, fuzzy msgid "Log Filtered Messages" msgstr "Filtrirano" #: ../glade/smuxi-frontend-gnome.glade.h:91 #, fuzzy msgid "_Logging" msgstr "Prijavljanje v {0}." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 #, fuzzy msgid "IRC Chat" msgstr "IRC;Internet;Klepet;Sobe;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 #, fuzzy msgid "Smuxi IRC Client" msgstr "IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 #, fuzzy msgid "Chat with other people on IRC" msgstr "IRC;Internet;Klepet;Sobe;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "" #: ../src/Frontend-GNOME/AboutDialog.cs:66 #, fuzzy msgid "translator-credits" msgstr "Matej Urbančič " #: ../src/Frontend-GNOME/AboutDialog.cs:79 #, fuzzy msgid "Smuxi Website" msgstr "na spletni strani" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:63 #, fuzzy msgid "Here is the stacktrace, please report this bug!" msgstr "Pošljite sporočilo o napaki razvijalcem programa." #: ../src/Frontend-GNOME/CrashDialog.cs:83 #, fuzzy msgid "_Report Bug" msgstr "Pošlji poročilo o hrošču v prevodu" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 #, fuzzy msgid "Engine not found." msgstr "Ni najdenega programnika predstavnosti." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 #, fuzzy msgid "Engine Manager" msgstr "_Programnik:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 #, fuzzy msgid "Engine:" msgstr "_Programnik:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 #, fuzzy msgid "Use Low Bandwidth Mode" msgstr "Uporabljen način paranoja" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 #, fuzzy msgid "Local Engine" msgstr "_Programnik:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 #, fuzzy msgid "Please select an engine!" msgstr "Izberite datoteko ..." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 #, fuzzy msgid "An error occurred while connecting to the engine!" msgstr "Med nalaganjem imenika je prišlo do napake" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, fuzzy, csharp-format msgid "Engine URL: {0}" msgstr "_Spletni naslov:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, fuzzy, csharp-format msgid "Error: {0}" msgstr "Napišite poročilo o hrošču s to napako: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, fuzzy, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Ali ste prepričani, da želite izbrisati nalogo '{0}'?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 #, fuzzy msgid "Frontend Commands" msgstr "Osprednji program" #: ../src/Frontend-GNOME/Main.cs:49 #, fuzzy msgid "Enable debug output" msgstr "Omogoči odvod razhroščevanja" #: ../src/Frontend-GNOME/Main.cs:56 #, fuzzy msgid "Show this help" msgstr "Pokaži možnosti pomoči" #: ../src/Frontend-GNOME/Main.cs:60 #, fuzzy msgid "Options:" msgstr "Možnosti:" #: ../src/Frontend-GNOME/Main.cs:67 #, fuzzy msgid "Connect to engine" msgstr "Poveži" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, fuzzy, csharp-format msgid "{0} Users" msgstr "Uporabniki" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 #, fuzzy msgid "Character" msgstr "Znak" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 #, fuzzy msgid "Word" msgstr "Beseda" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory " "(volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a " "relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can " "even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the " "recommended setting." msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 #, fuzzy msgid "Persistent: SQLite (Recommended)" msgstr "StartTLS (priporočeno)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 #, fuzzy msgid "Persistent: Db4o (Deprecated)" msgstr "[Opuščeno]" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 #, fuzzy msgid "Persistent (Preview)" msgstr "_Predogled: " #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 #, fuzzy msgid "No Proxy" msgstr "Posredniški strežnik" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 #, fuzzy msgid "System Default" msgstr "Sistemsko privzete jezikovne nastavitve" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 #, fuzzy msgid "Connection" msgstr "Povezava" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 #, fuzzy msgid "Interface" msgstr "Vmesnik" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 #, fuzzy msgid "Servers" msgstr "Razpoložljivi predstavni strežniki" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 #, fuzzy msgid "Filters" msgstr "Filtri" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 #, fuzzy msgid "Logging" msgstr "Prijavljanje v {0}." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:699 #, fuzzy msgid "Nicknames(s) field must not be empty." msgstr "Telo sporočila je prazno, vendar je v polju glave podpis '(%s)'" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:895 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 #, fuzzy msgid "Name" msgstr "Ime" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 #, fuzzy msgid "Topic" msgstr "Najdena je dokumentacija pomoči, ne pa tudi pomoč za iskano vsebino" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:388 #, fuzzy msgid "Disconnected from engine." msgstr "Povezava s souporabo glasbe je bila prekinjena" #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:542 #, fuzzy, csharp-format msgid "Cause: {0}" msgstr "0" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" #: ../src/Frontend-GNOME/NotifyManager.cs:338 #, fuzzy msgid "Show" msgstr "Pokaži" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 #, fuzzy msgid "Protocol" msgstr "Protokol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 #, fuzzy msgid "Hostname" msgstr "Ime gostitelja" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 #, fuzzy msgid "Unable to load server: " msgstr "Mesta ni mogoče naložiti" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 #, fuzzy msgid "Person / Private" msgstr "Z_asebno" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 #, fuzzy msgid "Group / Public" msgstr "Skupina" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 #, fuzzy msgid "Engine Assistant - Smuxi" msgstr "_Pomočnik:" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 #, fuzzy msgid "Add Smuxi Engine" msgstr "_Programnik:" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 #, fuzzy msgid "Edit Smuxi Engine" msgstr "_Programnik:" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 #, fuzzy msgid "Credentials" msgstr "Ni mogoče shraniti novih poveril v predpomnilnik: %k" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 #, fuzzy msgid "Thank you" msgstr "" "Zahvaljujemo se vam za izbor sistema %s.\n" "Upamo, da vam bo delo z njim v veselje." #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "" #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 #, fuzzy msgid "Enter which chat to join" msgstr "Pridruži se klepetalnici" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "&O programu" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Možnosti" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:264 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 #, fuzzy msgid "Unable to add server: " msgstr "Prekinitev povezave s strežnikom je spodletela." #: ../src/Frontend-GNOME/Views/MenuWidget.cs:385 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:429 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, fuzzy, csharp-format msgid "Day changed from {0} to {1}" msgstr "{0}> {1} {2} {0} - {1} {3}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, fuzzy, csharp-format msgid "Day changed to {0}" msgstr "Dan" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 #, fuzzy msgid "Are you sure you want to delete the selected filter?" msgstr "Ali ste prepričani, da želite izbrisati seznam stikov?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 #, fuzzy msgid "Protocol / Server" msgstr "Protokol" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 #, fuzzy msgid "Chat Type" msgstr "Klepetanje" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 #, fuzzy msgid "Normal" msgstr "običajna" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Dogodek" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Vrsta" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Vzorec" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 #, fuzzy msgid "Show _Menubar" msgstr "Pokaži _menijsko vrstico" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, fuzzy, csharp-format msgid "Retrieving user list for {0}..." msgstr "Pridobivanje seznama map za »%s«" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 #, fuzzy msgid "done." msgstr "Končano." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 #, fuzzy msgid "Reconnect" msgstr "Ponovno _poveži" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 #, fuzzy msgid "Are you sure you want to delete the selected server?" msgstr "Ali ste prepričani, da želite izbrisati sezname stikov?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 #, fuzzy msgid "Unable to edit server: " msgstr "Ni mogoče urediti skripta." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Najdi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 #, fuzzy msgid "_Search for:" msgstr "Iskanje ..." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 #, fuzzy msgid "_Match Case" msgstr "_Upoštevaj velikost črk" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 #, fuzzy msgid "Search _Backwards" msgstr "Poišči _nazaj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 #, fuzzy msgid "_Wrap Around" msgstr "_Prelomi vrstice" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 #, fuzzy msgid "Use _Regular Expressions" msgstr "&Logični izraz" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 #, fuzzy msgid "Smuxi - Find Group Chat" msgstr "Ni mogoče najti skupine GDM '%s'. Dejanje je prekinjeno!" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Ime:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 #, fuzzy msgid "Join" msgstr "Pridruži se" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Strežnik" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 #, fuzzy msgid "_Chat" msgstr "Klepetanje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Programnik" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "Po_gled" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "Pomo_č" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Poveži" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 #, fuzzy msgid "Open Log" msgstr "%s: Ni mogoče odpreti dnevniške datoteke za prikaz %s!" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 #, fuzzy msgid "_Preferences" msgstr "_Preferences" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Končaj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Poveži" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Dodaj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 #, fuzzy msgid "_Manage" msgstr "/_Uredi profile ..." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 #, fuzzy msgid "_Open / Join Chat" msgstr "Pridruži se klepetalnici" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 #, fuzzy msgid "_Find Group Chat" msgstr "Skupina" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 #, fuzzy msgid "C_lear All Activity" msgstr "_Počisti vse" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 #, fuzzy msgid "_Next Chat" msgstr "Klepetanje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 #, fuzzy msgid "_Previous Chat" msgstr "Izgovori in z brajico izpiši predhodno sporočilo iz klepetalnice." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 #, fuzzy msgid "_Close" msgstr "_Zapri" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 #, fuzzy msgid "_Use Local Engine" msgstr "Uporabi le krajevno preskušanje vsiljene pošte" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 #, fuzzy msgid "_Add Remote Engine" msgstr "Dodaj oddaljeno skladišče" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 #, fuzzy msgid "Switch Remote Engine" msgstr "Oddaljeno" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 #, fuzzy msgid "_Caret Mode" msgstr "Način _kazalke" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 #, fuzzy msgid "_Browse Mode" msgstr "Načina brskanja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 #, fuzzy msgid "Show _Statusbar" msgstr "Pokaži vrstico stanja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 #, fuzzy msgid "_Fullscreen" msgstr "_Celozaslonski način" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 #, fuzzy msgid "_About" msgstr "_O programu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 #, fuzzy msgid "Find Group Chat" msgstr "Skupina" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 #, fuzzy msgid "_Website" msgstr "_Spletišče" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 #, fuzzy msgid "Show _Toolbar" msgstr "Pokaži orodno vrstico" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 #, fuzzy msgid "Smuxi - Connect" msgstr "Poveži kot" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 #, fuzzy msgid "Smuxi - Preferences" msgstr "Možnosti ..." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 #, fuzzy msgid "Tabs" msgstr "Zavihki" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 #, fuzzy msgid " User List Position " msgstr "Izvedi kot uporabnik" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 #, fuzzy msgid " Channel " msgstr "%% :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 #, fuzzy msgid "Channel Filters" msgstr "%% :" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 #, fuzzy msgid "User Filters" msgstr "Izvedi kot uporabnik" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 #, fuzzy msgid "Use _SSH Tunnel" msgstr "most / nad | predor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 #, fuzzy msgid "SSH _Host:" msgstr "" "souporaba;izmenjava;ssh;gostitelj;ime;oddaljeno;namizje;bluetooth;obex;" "predstavnost;zvok;audio;slika;video;fotografije;filmi;strežnik;izrisovanje;" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 #, fuzzy msgid "_Port:" msgstr "_Vrata:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 #, fuzzy msgid "_Smuxi Host:" msgstr "Gostitelj:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 #, fuzzy msgid "_SSH Username: (optional)" msgstr "Uporabniško ime:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 #, fuzzy msgid "_SSH Password: (optional)" msgstr "dodatno" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 #, fuzzy msgid "_SSH Keyfile: (optional)" msgstr "dodatno" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 #, fuzzy msgid "Select a File" msgstr "Izbor datoteke" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 #, fuzzy msgid "_Username:" msgstr "_Uporabniško ime:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 #, fuzzy msgid "_Password:" msgstr "_Geslo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 #, fuzzy msgid "_Verify Password:" msgstr "_Overi novo geslo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 #, fuzzy msgid "_Engine Name:" msgstr "Ime programnika tem" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 #, fuzzy msgid "_Default Engine:" msgstr "Privzeti programnik predvajalnika" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 #, fuzzy msgid "Use as new default engine" msgstr "Privzeti programnik predvajalnika" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 #, fuzzy msgid "Smuxi - Open Chat" msgstr "_Video klepet:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 #, fuzzy msgid "_Type:" msgstr "Vrs_ta:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 #, fuzzy msgid "Smuxi - Server" msgstr "Strežnik" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 #, fuzzy msgid "_Hostname:" msgstr "_Ime gostitelja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 #, fuzzy msgid "_Network:" msgstr "_Omrežje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 #, fuzzy msgid "Nickname:" msgstr "_Vzdevek" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 #, fuzzy msgid "_Protocol:" msgstr "Protokol" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 #, fuzzy msgid "Automatically connect to server at startup" msgstr "Poveži s strežnikom" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 #, fuzzy msgid "Use Encryption" msgstr "Brez šifriranja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 #, fuzzy msgid "Validate Server Certificate" msgstr "Potrdi _veljavnost ..." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 #, fuzzy msgid "_On Connect Commands:" msgstr "Ukazi:\n" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 #, fuzzy msgid "_Ignore Commands" msgstr "Prezri" smuxi-1.1/po-Frontend-GNOME/pl.po0000664000175000017500000013306714011526464017346 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2017 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # , 2012. # Piotr Drąg , 2015-2017. # Aviary.pl , 2015-2017. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-05 15:12+0100\n" "PO-Revision-Date: 2017-11-05 15:21+0100\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Preferencje programu Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Używane pseudonimy. Można podać dodatkowe (oddzielone spacjami), które będą " "używane jako zapasowe, jeśli pierwszy pseudonim jest niedostępny. Domyślnie " "„$pseudonim_” i „$pseudonim__” będą używane jako zapasowe." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Pseudonimy:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nazwa użytkownika:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Imię i nazwisko:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kodowanie:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Automatyczne konwertowanie znaków UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Ogólne" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Typ:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Serwer:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Hasło:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Wyświetlanie hasła" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Pośrednik sieciowy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Polecenia po połączeniu:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Polecenia po włączeniu:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Polecenia dla wszystkich sieci" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "P_ołączenie" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format czasu:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Wiersze bufora:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Wiersze bufora mechanizmu:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = sekundy\n" "mm = minuty\n" "hh = godziny (01-12)\n" "HH = godziny (00-23)\n" "tt = AM/PM\n" "\n" "dd = dzień\n" "MM = miesiąc\n" "yy/yyyy = rok" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Typ trwałości:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Tymczasowe wiersze bufora:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Trwałe wiersze bufora:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Bufor wiadomości" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Usuwanie kolorów" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Usuwanie formatowania" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Usuwanie znaków UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Wyświetl zaawansowane opcje" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Zaawansowane" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Ogólne" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Góra" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Dół" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Lewo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Prawo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Brak" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Położenie kart " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Wyróżnianie" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktywność" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Brak aktywności" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Dołączenie/część/tryb" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Kolory kart " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Automatyczne połączanie na nowo rozmowy prywatne" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Automatyczne połączanie na nowo otwarte rozmowy grupowe" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Drzewo" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Znak uzupełniania:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Znak polecenia:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Rozmiar historii poleceń:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Uzupełnianie w stylu programu Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Pole wprowadzania danych " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Wejście" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Kolory pseudonimów" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Położenie listy osób " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Zastąpienie" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Czcionka " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Położenie tematu " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Tekst" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Tło" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Kolor " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Tryb zawijania:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Rozmowa " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Wyróżniane słowa:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Powiadomienia dźwiękowe" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Wyróżnianie " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Wyjście" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Włącz" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Stałe wyświetlanie" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Wyświetlanie, kiedy okno jest zminimalizowane" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Wyświetlanie, kiedy okno jest zamknięte" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ikona w obszarze powiadamiania " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Wyświetlanie programu Smuxi w menu wiadomości" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Menu wiadomości" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Wyświetlanie wyskakujących powiadomień" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Wyskakujące powiadomienia" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Powiadomienie" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interfejs" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Serwery" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtry" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Włączone" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Zapisywanie filtrowanych wiadomości w dzienniku" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "Zapisywanie w _dzienniku" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Rozmowy w sieci IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Klient sieci IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Rozmawianie w sieci IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "rozmowa;rozmawianie;czat;czatowanie;chat;komunikator;wiadomość;wiadomości;" "messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Rozmawianie przez protokoły IRC, Twitter, Jabber i Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi jest rozproszonym, przyjaznym użytkownikowi klientem rozmów open " "source obsługującym protokoły IRC, Twitter, Jabber/XMPP, Campfire oraz JabbR " "przez SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Zainspirowany przez połączenie programów screen i irssi, program Smuxi ma " "odłączalny serwer (lub jako „zwykły” klient), który utrzymuje połączenie " "i umożliwia łączenie wielu interfejsów Smuxi w tym samym czasie. Jest to " "podobne do programów screen+irssi czy bramek IRC, ale jest bardziej " "eleganckie i ma większe możliwości." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Główne okno wyświetlające kanał IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:70 msgid "translator-credits" msgstr "" ", 2012\n" ", 2012\n" "Piotr Drąg , 2015-2017\n" "Aviary.pl , 2015-2017" #: ../src/Frontend-GNOME/AboutDialog.cs:83 msgid "Smuxi Website" msgstr "Witryna programu Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Wystąpił błąd" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Program Smuxi uległ awarii z powodu nieobsłużonego wyjątku." #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Poniżej znajduje się ślad stosu. Prosimy zgłosić ten błąd." #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Zgłoś błąd" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Nie odnaleziono mechanizmu." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Menedżer mechanizmów" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Proszę wybrać, z którym mechanizmem programu Smuxi połączyć" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Mechanizm:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Tryb wolnego łącza" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Lokalny mechanizm" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Proszę wybrać mechanizm." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Interfejs nie jest zgodny z tym mechanizmem.\n" "Wersja mechanizmu: {0}, wersja interfejsu: {1}\n" "Protokół mechanizmu: {2}, protokół interfejsu: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Wystąpił błąd podczas łączenia z mechanizmem." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Adres URL mechanizmu: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Błąd: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Na pewno usunąć mechanizm „{0}”?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Wklejane wiersze: {0}. Kontynuować?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Polecenia interfejsu" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Włącza wyjście debugowania" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Wyświetla tę pomoc" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opcje:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Łączy z mechanizmem" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Otwiera podany odnośnik w programie Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Uruchamia nową kopię programu Smuxi i ignoruje istniejącą" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Przekazywanie odnośnika do już uruchomionej kopii programu Smuxi…" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Przenoszenie już uruchomionej kopii programu Smuxi na wierzch…" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "Użytkownicy: {0}" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Jeszcze niezaimplementowane." #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Nazwa" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Temat" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Wyszukiwanie rozmów grupowych bez filtra nie jest zalecane. Może to chwilę " "zająć lub w ogóle nie działać.\n" "Kontynuować?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Błąd podczas pobierania listy rozmów grupowych z serwera." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Rozłączono z mechanizmu." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Ponowne łączenie z mechanizmem… (próba: {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Powód: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Wykryto krytyczny błąd z powodu niezgodności protokołu z smuxi-server.\n" "\n" "Proszę zainstalować pakiet Mono po stronie interfejsu, aby pasował do smuxi-" "server.\n" "\n" "Więcej informacji o tym problemie (w języku angielskim):\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Interfejs utracił połączenie z serwerem.\n" "Połączyć ponownie?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Ponowne połączenie z serwerem się nie powiodło.\n" "Spróbować ponownie?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Serwer utracił połączenie z interfejsem.\n" "Połączyć ponownie?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Wyświetl" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protokół" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Nazwa serwera" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Nie można wczytać serwera: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Osoba/prywatne" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grupa/publiczne" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Asystent mechanizmów — Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Dodaj mechanizm Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Modyfikuj mechanizm Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Połączenie" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Dane uwierzytelniające" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Teraz można używać mechanizmu Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Dziękujemy" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Mechanizm o tej nazwie już istnieje. Proszę podać inną." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Proszę podać, do której rozmowy dołączyć" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "O programie Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Preferencje" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:266 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Nie można dodać serwera: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:391 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Przełączenie na lokalny mechanizm rozłączy z obecnego mechanizmu.\n" "Na pewno przełączyć?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:435 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Przełączenie na zdalny mechanizm rozłączy z obecnego mechanizmu.\n" "Na pewno przełączyć?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:455 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dzień został zmieniony z {0} na {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:459 #, csharp-format msgid "Day changed to {0}" msgstr "Dzień zmieniono na {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Nieprawidłowe wyrażenie regularne filtru: „{0}”. Powód: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Na pewno usunąć zaznaczony filtr?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Sieć" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokół/serwer" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Typ rozmowy" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Zwykła" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Wydarzenie" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Typ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Wzór" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Brak pośrednika" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Domyślne systemu" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Zapisz" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Dodaj" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Nieobsługiwane" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Tryb wolnego łącza jest aktywny: brak zsynchronizowanych wiadomości." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Pasek _menu" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Pobieranie listy użytkowników dla {0}…" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "gotowe." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Połącz ponownie" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Zamknięcie rozmowy protokołu zamknie także wszystkie połączone z nią otwarte " "rozmowy.\n" "Zamknąć?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Na pewno usunąć zaznaczony serwer?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Nie można modyfikować serwera: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Znajdź" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "Wy_szukiwanie:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "R_ozróżnianie małych i wielkich liter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "_Wyszukiwanie wstecz" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Automatyczny powrót do początku" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Wy_rażenie regularne" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi — wyszukiwanie rozmowy grupowej" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nazwa:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Dołącz" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "S_erwer" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Rozmowa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Mechanizm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Widok" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "Pomo_c" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Połącz" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Otwórz dziennik" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Preferencje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "Za_kończ" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "P_ołącz" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Dodaj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Zarządzaj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Otwórz/dołącz do rozmowy" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Znajdź rozmowę grupową" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Wy_czyść całą aktywność" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Następna rozmowa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Poprzednia rozmowa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "Za_mknij" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Lokalny mechanizm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Dodaj zdalny mechanizm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Przełącz zdalny mechanizm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Tryb _karetki" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Try_b przeglądania" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Pasek _stanu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Pełny ekran" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_O programie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Znajdź rozmowę grupową" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Witryna programu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Pasek _narzędziowy" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi — połączenie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi — preferencje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Pseudonimy:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Karty" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Położenie listy użytkowników " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanał " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtry kanału" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtry użytkownika" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Tunel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Włącza używanie SSH dla połączenia. Ma to mały wpływ na " "wydajność, ale jest bezpieczniejsze i wymagane podczas używania NAT lub " "zapór sieciowych opartych na portach" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "S_erwer SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "DNS lub adres IP i port serwera SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "DNS lub adres IP i port serwera Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Serwer Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "Nazwa użytkownika _SSH (opcjonalna):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Nazwa użytkownika używana do logowania w serwerze SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "_Hasło SSH (opcjonalne):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Hasło używane do logowania w serwerze SSH. Hasło jest " "opcjonalne, jeśli używane jest upoważnienie kluczem SSH (proszę zobaczyć " "niżej)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_Plik klucza SSH (opcjonalny):" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Wybór pliku" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Plik klucza prywatnego SSH używanego do logowania " "w serwerze SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "Nazwa _użytkownika:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Nazwa użytkownika używana do logowania w serwerze " "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Hasło:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Hasło użytkownika" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Sprawdzenie hasła:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "" "Powtórzenie hasła w celu sprawdzenia jego poprawności" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Witamy w asystencie konfiguracji mechanizmu Smuxi.\n" "Przed użyciem mechanizmu należy podać kilka informacji.\n" "\n" "Kliknięcie przycisku „Dalej” rozpocznie." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Nazwa _mechanizmu:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nazwa profilu nowego mechanizmu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Domyślny mechanizm:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Użycie jako domyślnego mechanizmu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Jeśli włączono, to obecny mechanizm będzie domyślnym " "podczas następnego uruchomienia programu Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi — otwarcie rozmowy" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Typ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi — serwer" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Nazwa serwera:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Sieć:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Pseudonim:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokół:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Automatyczne łączenie z serwerem podczas uruchamiania" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Szyfrowanie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Proszę sprawdzić poprawność certyfikatu serwera" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "P_olecenia po połączeniu:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Polecenia _ignorowania" smuxi-1.1/po-Frontend-GNOME/id.po0000664000175000017500000013513614011526464017326 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Andika Triwidada , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi frontend-GNOME master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-11-04 05:46+0000\n" "PO-Revision-Date: 2017-11-30 14:01+0700\n" "Last-Translator: Kukuh Syafaat \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Preferensi Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Nama panggilan yang akan dipakai. Anda dapat menyatakan nama panggilan " "ekstra (dipisahkan dengan spasi) yang akan dipakai sebagai cadangan ketika " "pilihan pertama tidak tersedia. Setelan baku adalah cadangan memakai $nick_ " "dan $nick__." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Nama alias:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nama pengguna:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nama sebenarnya:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Pengkodean:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Otomatis konversikan karakter UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Umum" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tipe:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Host:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Kata Sandi:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Tampilkan Kata Sandi" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proksi Jaringan" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Perintah Saat Tersambung:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Perintah Saat Awal Mula:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Perintah Global" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "K_oneksi" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format Stempel Waktu:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Baris Penyangga:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Baris Penyangga Mesin:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = detik\n" "mm = menit\n" "hh = jam (01 - 12)\n" "HH = jam (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = tanggal\n" "MM = bulan\n" "yy/yyyy = tahun" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tipe Persistensi:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Baris Penyangga Volatil:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Baris Penyangga Persisten:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Penyangga Pesan" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Buang Warna" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Buang Pemformatan" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Buang UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Tampilkan Pengaturan Tingkat Lanjut" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Tingkat Lanjut" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Umum" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Puncak" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Dasar" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Kiri" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Kanan" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nihil" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Posisi Tab " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Penyorotan" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivitas" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Tidak Ada Aktivitas" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Warna Tab " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Secara otomatis beralih ke obrolan orang yang baru dibuka" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Secara otomatis beralih ke obrolan grup yang baru dibuka" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Pohon" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Karakter Pelengkapan:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Karakter Perintah:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Ukuran Riwayat Perintah:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Pelengkapan Gaya Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Ruas Entri " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Masukan" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Warna Panggilan" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Posisi Daftar Orang " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Timpa" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Fonta " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Posisi Topik " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Latar depan" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Latar belakang" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Warna " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "Mode _Lipat:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Obrolan " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Sorot kata:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Bunyi bip saat penyorotan" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Penyorotan " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Keluaran" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Memfungsikan" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Selalu tampilkan" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Tampilkan saat jendela diminimalkan" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Tampilkan saat jendela ditutup" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ikon Area Pemberitahuan " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Tampilkan Smuxi pada menu perpesanan" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Menu Perpesanan" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Tampilkan popup pemberitahuan" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Popup pemberitahuan" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Pemberitahuan" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Antarmuka" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Server" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Penyaring" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Diaktifkan" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Pesan Log yang Disaring" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Logging" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Obrolan IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Klien IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Mengobrol dengan orang lain di IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "obrol;perpesanan;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;" "campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Mengobrol dengan orang lain di IRC, Twitter, Jabber dan Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi adalah klien obrolan sumber terbuka, terdistribusi dan mudah digunakan " "untuk IRC, Twitter, Jabber/XMPP, Campfire dan SignalR's JabbR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Terinspirasi oleh kombinasi layar dan irssi, Smuxi memiliki server yang " "dapat dilepas (atau seperti klien \"normal\") yang tetap tersambung saat " "Anda tidak berada, dan memungkinkan beberapa frontend Smuxi terhubung dan " "sinkron. Ini mirip dengan layar+irssi atau IRC bouncer, namun lebih elegan " "dan bertenaga." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Jendela utama menampilkan kanal IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:70 msgid "translator-credits" msgstr "" "Andika Triwidada , 2016.\n" "Kukuh Syafaat , 2017." #: ../src/Frontend-GNOME/AboutDialog.cs:83 msgid "Smuxi Website" msgstr "Situs Web Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Ups, saya melakukannya lagi..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi macet karena pengecualian yang tidak tertangani dilemparkan!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Berikut adalah stacktrace, laporkan kutu ini!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "Lapo_rkan Kutu" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Mesin tidak ditemukan." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Pengelola Mesin" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Pilih mesin Smuxi yang ingin Anda sambungkan" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Mesin:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Gunakan Mode Pita Lebar Rendah" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Mesin Lokal" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Silakan pilih mesin!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Frontend Anda tidak kompatibel dengan mesinnya!\n" "Versi Mesin: {0} Versi Frontend: {1}\n" "Protokol Mesin: {2} Protokol Frontend: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Terjadi kesalahan saat menyambungkan ke mesin!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL Mesin: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Kesalahan: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Apakah Anda yakin ingin menghapus mesin \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Anda akan menempelkan {0} baris. Apakah Anda ingin melanjutkan?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Perintah Frontend" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Aktifkan keluaran awakutu" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Tampilkan bantuan ini" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opsi:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Sambungkan ke mesin" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Buka tautan yang ditentukan di Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Mulai instance Smuxi baru dan abaikan yang sudah ada" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Melewati tautan yang sudah menjalankan instance Smuxi..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Membawa instance Smuxi yang sudah berjalan ke latar depan..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Pengguna" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Maaf, belum diimplementasikan!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Nama" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Topik" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Mencari obrolan grup tanpa penyaring tidak disarankan. Ini mungkin " "memerlukan beberapa saat, atau mungkin tidak bekerja sama sekali.\n" "Apakah Anda ingin melanjutkan?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Kesalahan saat mengambil daftar obrolan grup dari server." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Terputus dari mesin." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Menyambungkan kembali ke mesin... (percobaan {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Penyebab: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Kesalahan fatal telah terdeteksi karena ketidakcocokan protokol dengan smuxi-" "server!\n" "\n" "Mohon pasang Mono di sisi frontend agar sesuai dengan server smuxi.\n" "\n" "Rincian lebih lanjut tentang masalah ini dapat ditemukan di sini:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Frontend telah kehilangan sambungan ke server.\n" "Apakah Anda ingin menyambungkan kembali sekarang?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Menyambungkan kembali ke server telah gagal.\n" "Apakah Anda ingin mencoba lagi?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Server telah kehilangan sambungan ke frontend.\n" "Apakah Anda ingin menyambungkan kembali sekarang?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Tampilkan" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protokol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Nama Host" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Tidak dapat memuat server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Orang / Privat" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grup / Publik" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Asisten Mesin - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Tambah Mesin Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Sunting Mesin Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Koneksi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Kredensial" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Sekarang Anda bisa menggunakan Mesin Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Terima kasih" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Mesin dengan nama ini sudah ada! Harap tentukan yang berbeda." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Masukkan obrolan mana yang akan bergabung" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Tentang Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Preferensi" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:266 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Tidak dapat menambahkan server: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:391 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Beralih ke mesin lokal akan melepaskan Anda dari mesin saat ini!\n" "Apakah Anda yakin ingin melakukan ini?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:435 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Memindahkan mesin jauh akan memutuskan hubungan Anda dari mesin saat ini!\n" "Apakah Anda yakin ingin melakukan ini?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Hari berubah dari {0} menjadi {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Hari berubah menjadi {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Regex penyaring tidak valid: '{0}'. Alasan: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Apakah Anda yakin ingin menghapus penyaring yang dipilih?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Jaringan" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokol / Server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Jenis Obrolan" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Kejadian" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Tipe" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Pola" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Tidak Ada Proksi" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Bawaan Sistem" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Simpan" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Tambah" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Tidak didukung" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Mode Pita Lebar Rendah aktif: tidak ada pesan yang disinkronkan." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Tampilkan Bilah _Menu" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Mengambil daftar pengguna untuk {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "selesai." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Sambungkan kembali" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Menutup protokol obrol juga akan menutup semua obrolan terbuka yang " "terhubung dengannya!\n" "Apakah Anda yakin ingin melakukan ini?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Apakah Anda yakin akan menghapus server yang dipilih?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Tidak dapat menyunting server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Temukan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "Car_i untuk:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Cocok _Huruf Besar Kecil" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Cari Mun_dur" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Melipat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Gunakan Ekspresi _Reguler" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Cari Obrolan Grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nama:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Gabung" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "Obrol_an" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "M_esin" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Tampilan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Bantuan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Sambung" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Buka Log" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Preferensi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Keluar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Sambung" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "T_ambah" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Kelola" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Buka / Gabung ke _Obrolan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "Temukan Obro_lan Grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Bersi_hkan Semua Aktivitas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Obrolan Berikut_nya" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Ob_rolan Sebelumnya" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Tutup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "G_unakan Mesin Lokal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "T_ambah Mesin Jauh" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Beralih ke Mesin Jauh" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Mode _Caret" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Mode Ram_ban" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Tampilkan Bilah _Status" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "Layar _Penuh" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "Tent_ang" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Temukan Obrolan Grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "Situs _Web" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Tampilkan Bilah Ala_t" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Tersambung" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferensi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Nama Panggilan:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Tab" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Posisi Daftar Pengguna " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Penyaring Kanal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Penyaring Pengguna" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Gunakan selang _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Mengaktifkan penggunaan SSH untuk sambungan. Ini " "memiliki dampak kinerja yang kecil, namun lebih aman dan dibutuhkan saat " "menggunakan firewall berbasis NAT atau port" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Host SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "DNS atau alamat IP dan port dari server SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Porta:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "DNS atau alamat IP dan port server Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Host _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "Nama pengguna _SSH: (opsional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Nama pengguna yang akan digunakan untuk masuk ke server " "SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "Kata sandi _SSH: (opsional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Kata sandi yang akan digunakan untuk masuk ke server " "SSH. Kata sandi bersifat opsional jika otorisasi kunci SSH digunakan (lihat " "di bawah)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "Berkas kunci _SSH: (opsional)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Pilih Berkas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Berkas kunci privat SSH yang akan digunakan untuk masuk " "ke server SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "Nama Pengg_una:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Nama pengguna yang akan digunakan untuk masuk ke server " "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Sandi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Kata sandi dari pengguna" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Verifikasi Kata Sandi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Ulangi kata sandi untuk verifikasi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Selamat datang di Asisten Konfigurasi Mesin Smuxi.\n" "Anda perlu memasukkan beberapa informasi sebelum bisa menggunakan mesin.\n" "\n" "Klik \"Maju\" untuk memulai." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Nama M_esin:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nama profil mesin baru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "Mesin _Bawaan:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Gunakan sebagai mesin bawaan baru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Jika diaktifkan, mesin saat ini akan menjadi bawaan " "ketika Smuxi dimulai pada waktu berikutnya" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Obrolan Terbuka" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tipe:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "Nam _Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "Jaringa_n:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Nama panggilan:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Sambungkan ke server saat awal mula secara otomatis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Gunakan Enkripsi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Validasi Sertifikat Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Perintah Saat Tersamb_ung:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Aba_ikan Perintah" #~ msgid "Character" #~ msgstr "Karakter" #~ msgid "Word" #~ msgstr "Kata" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues and is " #~ "the recommended setting." #~ msgstr "" #~ "Pengaturan ini menentukan apakah Smuxi harus menyimpan pesan obrolan di " #~ "memori (tidak stabil) atau ke diska (persisten).\n" #~ "Untuk persisten Anda dapat memilih antara Db4o, basis data objek atau " #~ "SQLite, basis data relasional.\n" #~ "Backend Db4o telah mengetahui masalah seperti penggunaan memori dan CPU " #~ "yang tinggi dan bahkan dapat menyebabkan macet dan karenanya sudah tidak " #~ "berlaku lagi.\n" #~ "Backend SQLite tidak memiliki kinerja atau masalah stabilitas yang " #~ "diketahui dan ini merupakan pengaturan yang disarankan." #~ msgid "Persistent: SQLite (Recommended)" #~ msgstr "Persisten: SQLite (Disarankan)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Persisten: Db4o (Tidak Berlaku)" #~ msgid "Persistent (Preview)" #~ msgstr "Persisten (Pratinjau)" #~ msgid "Volatile" #~ msgstr "Volatil" #~ msgid "Interface" #~ msgstr "Antarmuka" #~ msgid "Servers" #~ msgstr "Server" #~ msgid "Filters" #~ msgstr "Tapis" #~ msgid "Logging" #~ msgstr "Logging" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Ruas nama panggilan tidak boleh kosong." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Regex sorot tidak valid: '{0}'. Alasan: {1}" smuxi-1.1/po-Frontend-GNOME/es.po0000664000175000017500000013653614011526464017346 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Diego Garcia Mendoza , 2015 # Matías Bellone, 2013-2014 # Ricardo A. Hermosilla Carrillo , 2012 # Ricardo A. Hermosilla Carrillo , 2012 # Daniel Mustieles , 2015-2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-12-26 21:00+0000\n" "PO-Revision-Date: 2019-02-19 15:58+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: es \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 3.31.90\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Preferencias de Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "El nick que usar. Puede especificar nicks adicionales (separados por " "espacios) que serán usados como opciones de respaldo cuando la primera no " "esté disponible. De forma predeterminada se utilizará $nick_ y $nick__ como " "respaldos." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Nick(s):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nombre de usuario:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nombre real:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Codificación:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Convertir caracteres UTF-8 automáticamente" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "General" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tipo:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Dominio:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Contraseña:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Puerto:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Mostrar contraseña:" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proxy de red" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Comandos al conectar:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Comandos al arrancar:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Comandos globales" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "C_onexión" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Formato de marca temporal:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Lineas de búfer:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Líneas de búfer del motor:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = segundos\n" "mm = minutos\n" "hh = hora (01 - 12)\n" "HH = hora (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = día\n" "MM = mes\n" "yy/yyyy = año" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tipo de persistencia:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Líneas de búfer volátiles:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Líneas de búfer persistentes:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Búfer de mensaje" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Quitar colores" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Quitar formatos" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Quitar UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Mostrar configuraciones avanzadas" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avanzado" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "General" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Arriba" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Abajo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Izquierda" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Derecha" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Ninguno" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Posición de pestañas " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Resaltar" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Actividad" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Sin actividad" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Entrar/Salir/Modo" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Colores de pestañas " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Cambiar automáticamente a nuevos chats personales abiertos" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Cambiar automáticamente a nuevos chats de grupo abiertos" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Árbol" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Carácter de autocompletado" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Carácter de órdenes:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Tamaño historial de órdenes:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Autocompletado estilo Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Campo de entrada " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Entrada" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Colores de nick" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Posición de lista de personas " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Anular" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Tipografía " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Posición del tema " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Frente" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Fondo" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Color " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Modo de alineación" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Palabras resaltadas:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Beep al resaltar" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Resaltado " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Salida" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Habilitar" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Mostrar siempre" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Mostrar cuando se minimice la ventana" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Mostrar cuando se cierre la ventana" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Icono del área de notificación " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Mostrar Smuxi en el menú de mensajería" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Menú de mensajería" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Mostrar notificaciones emergentes" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Notificaciones emergentes" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Notificación" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interfaz" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servidores" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtros" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Habilitado" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Registrar mensajes filtrados" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Registros" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Chat IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Cliente IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Charla con otras personas en IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chat;mensajería;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Charla con otras personas en IRC, Twitter, Jabber and Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi es un cliente de chat de software libre, distribuído y amigable para " "IRC, Twitter, Jabber/XMPP, Campfire y SignalR's JabbR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Inspirado en la combinación de «screen» e «irssi», Smuxi tiene un servidor " "desacoplable (o como un cliente «normal») que sigue conectado cuando el " "usuario no está, y que permite varios que «frontend» de Smuxi se conecten y " "se sincronicen. Esto es similar a screen+irssi o balanceadores IRC, pero más " "elegante y potente." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "La ventana principal mostrando un canal de IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:71 msgid "translator-credits" msgstr "" "Daniel Mustieles , 2015\n" "Juan Miguel Carrero ,\n" "Matías Bellone " #: ../src/Frontend-GNOME/AboutDialog.cs:84 msgid "Smuxi Website" msgstr "Sitio web de Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Perdón, lo hice de nuevo..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi ha fallado porque ocurrió una excepción inesperada" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Aquí esta la traza de pila ¡reporte este fallo por favor!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Informar de un error" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "No se encontró el motor." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Gestor de motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Seleccione a qué motor Smuxi quiere conectarse" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Utilizar modo de bajo ancho de banda" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Motor local:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "¡Seleccione un motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Su «frontend» con es compatible con el motor.\n" "Versión del motor: {0} Versión del «frontend»: {1}\n" "Protocolo del motor: {2} Protocolo del «frontend»: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "¡Ocurrió un error durante la conexión al motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL del motor: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Error: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "¿Seguro que desea borrar el motor «{0}»?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Va a pegar {0} líneas ¿desea continuar?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Órdenes de interfaz" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Activar la salida de depuración" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Mostrar esta ayuda" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opciones:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Conectar al motor" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Abre el enlace especificado en Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Inicia una instancia nueva de Smuxi e ignora las existentes" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Pasando enlace a una instancia de Smuxi que ya está en ejecución..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "" "Mostrando en primer plano una instancia de Smuxi que ya esta corriendo..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Usuarios" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Aún no está implementado" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Nombre" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Topic" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "No se recomienda buscar chats de grupo sin un filtro. Esto puede tardar " "bastante o puede no funcionar.\n" "¿Desea continuar?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "" "Ocurrió un error durante la carga de la lista de chats de grupo del servidor." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Desconectado del motor." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Reconectando al motor... (intento {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Motivo: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Ha ocurrido un error fatal debido a una incompatibilidad de protocolos con " "el servidor smuxi.\n" "\n" "Instale Mono en el frontal para que coincida con el servidor smuxi.\n" "\n" "Puede encontrar más detalles sobre este error aqui:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "La interfaz perdió la conexión con el servidor.\n" "¿Desea volver a conectarse ahora?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Falló la reconexión con el servidor.\n" "¿Desea volver a intentarlo?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "El servidor perdió la conexión con la interfaz.\n" "¿Desea reconectar ahora?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Mostrar" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protocolo" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Nombre del equipo" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "No se pudo cargar el servidor:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Persona / Privado" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grupo / Público" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Smuxi - Asistente de motores" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Agregar motor a Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Editar motor de Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Conexión" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Credenciales" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Ahora puede utilizar el motor de Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Gracias" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "¡Ya existe un motor con ese nombre! Especifique uno diferente." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Ingrese el chat al que desea entrar" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:155 msgid "About Smuxi" msgstr "Sobre Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:159 msgid "Preferences" msgstr "Preferencias" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:276 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "No se pudo agregar el servidor: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:401 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "¡Cambiar al motor local lo desconectará del motor actual!\n" "¿Seguro que desea continuar?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:445 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "¡Cambiar al motor remoto lo desconectará del motor actual!\n" "¿Seguro que desea continuar?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Cambió el día de {0} a {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Cambió el día a {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Expresión regularde filtro no válida: «{0}». Razón: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "¿Seguro que desea borrar el filtro seleccionado?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Red" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protocolo / Servidor" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Tipo de chat" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Evento" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Tipo:" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Patrón" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Sin proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Predeterminado del sistema" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Guardar" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Añadir" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "No soportado" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Modo de bajo ancho de banda activado: no se sincronizaron mensajes." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Mostrar barra de men_ú" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Obteniendo la lista de usuarios para {0}" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "hecho." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Reconectar" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "¡Cerrar el protocolo también cerrará todos los chats abiertos en él!\n" "¿Seguro que desea continuar?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "¿Seguro que desea borrar el servidor seleccionado?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "No se puede editar el servidor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Buscar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Buscar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Coincidir mayúsculas y minúsculas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Buscar _hacia atrás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Desde el principio" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Utilizar e_xpresion regular" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Buscar chat grupal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nombre:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Entrar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Ver" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Ayuda" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Conectar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Abrir registro" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Preferencias" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Salir" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Conectar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Agregar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Gestionar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Abrir / _Entrar a chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Buscar chat grupal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Eliminar toda actividad" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Chat siguie_nte" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Chat _anterior" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Cerrar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "Utilizar motor _local" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "Agregar motor _remoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Cambiar motor remoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Mo_do de alineación" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Modo de e_xaminación" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Mostrar _barra de estado" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Pantalla completa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Acerca de" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Buscar chat grupal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "Sitio _web" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Mostrar barra de _herramientas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Connectar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferencias" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Nicks:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Pestañas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Posición en lista de usuarios " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Canal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtros de canales" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtros de usuarios" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Utilizar túnel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Permite el uso de SSH para la conexión. Esto conlleva a " "una pequeña baja en el rendimiento , pero se aumenta la seguridad y es un " "requisito cuando utiliza NAT o un cortafuegos basado en puertos" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Servidor SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "DNS o dirección IP y puerto del servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Puerto:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "DNS o dirección IP y puerto del servidor Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Servidor Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "Nombre de _usuario SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Nombre de usuario para iniciar sesión en el servidor " "SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "Contraseña _SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Contraseña para iniciar sesión el servidor SSH. La " "contraseña es opcional utiliza una clave SSH (revise más abajo)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "Archivo de claves _SSH: (opcional)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Seleccione un archivo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Archivo privaod de claves SSH para iniciar sesión en el " "servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "Nombre de _usuario:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Nombre de usuario para iniciar sesión en el servidor " "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Contraseña:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Contraseña del usuario" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Verificar contraseña:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Repita la contraseña para verificación" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Bienvenido/a al asistente de configuración del motor de Smuxi.\n" "Necesita ingresar alguna información antes de poder utilizar el motor.\n" "\n" "Pulse en «Avanzar» para empezar." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Nombre del _motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nombre del perfil para el nuevo motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "Motor _predeterminado:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Utilizar como nuevo motor predeterminado" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Si está habilitada, el motor actual será utilizado como " "predeterminado por Smuxi la próxima vez que inicie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Chat abierto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tipo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "Nombre del _equipo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Red:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Apodo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocolo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Conectar automáticamente al servidor al iniciar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Usar cifrado" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Validar el certificado del servidor." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Órdenes al conectar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Ignorar órdenes" #~ msgid "Protocol:" #~ msgstr "Protocolo:" #~ msgid "Hostname:" #~ msgstr "Nombre del equipo:" #~ msgid "Character" #~ msgstr "Carácter" #~ msgid "Word" #~ msgstr "Palabra" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues and is " #~ "the recommended setting." #~ msgstr "" #~ "Esta opción de configuración especifica si Smuxi debe guardar los " #~ "mensajes de chat en la memoria (volátil) o en el disco (persistente).\n" #~ "Para que sea persistente puede elegir enre Db4o, una base de datos de " #~ "objetos, o SQLite, una base de datos relacional.\n" #~ "El «backend» de Db4o tiene problemas conocidos como un alto uso de " #~ "memoria y de CPU e incluso que puede falla, y por esto está obsoleto.\n" #~ "El «backend» de SQLite no tiene problemas de estabilidad o rendimiento " #~ "conocidos y es la opción recomendada." #~ msgid "Persistent: SQLite (Recommended)" #~ msgstr "Persistente: SQLite (recomendado)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Persistente: Db4o (obsoleto)" #~ msgid "Persistent (Preview)" #~ msgstr "Persistente (vista previa)" #~ msgid "Volatile" #~ msgstr "Volátil" #~ msgid "Interface" #~ msgstr "Interfaz" #~ msgid "Servers" #~ msgstr "Servidores" #~ msgid "Filters" #~ msgstr "Filtros" #~ msgid "Logging" #~ msgstr "Registros" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "El campo Nick(s) no debe estar vacío." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Expresión regular para resaltado no válida: «{0}». Razón: {1}" smuxi-1.1/po-Frontend-GNOME/Makefile.in.in0000664000175000017500000001577514011526464021052 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_FRONTEND_GNOME@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Frontend-GNOME/pt.po0000664000175000017500000013702714011526464017356 0ustar00meebeymeebey00000000000000# Translation of smuxi-frontend-gnome messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-frontend-gnome package. # Américo Monteiro , 2010. # Pedro Ribeiro , 2012. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi-frontend-gnome\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-11-15 22:20+0000\n" "PO-Revision-Date: 2015-11-17 10:12+0000\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Preferências do Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "A alcunha a usar. Pode especificar alcunhas extra (separadas por espaços) " "que serão usadas quando a primeira escolha não estiver disponível. Estão " "predefinidos como recursos $alcunha_ e $alcunha__." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Alcunha(s):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nome de utilizador:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nome real:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Codificação:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Converter automaticamente caracteres UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Geral" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tipo:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Máquina:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Senha:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Porta:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Mostrar a senha" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proxy de rede" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Comandos ao ligar:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Comandos ao arrancar:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Comandos globais" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Ligação" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Formato de datas:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Linhas do buffer:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Linhas do buffer do motor:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = segundos\n" "mm = minutos\n" "hh = horas (01 - 12)\n" "HH = horas (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = dia\n" "MM = mês\n" "yy/yyyy = ano" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tipo de persistência:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Linhas voláteis do buffer:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Linhas persistentes do buffer:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Buffers de mensagem" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Remover cores" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Remover formatações" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Remover UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Mostrar definições avançadas" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avançado" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Geral" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Topo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Fundo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Esquerda" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Direita" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nenhum" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Posição dos separadores " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Destacar" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Atividade" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Nenhuma atividade" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Juntar/Parte/Modo" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Cores do separador " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Mudar automaticamente para conversas pessoais recém iniciadas" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Mudar automaticament para conversas de grupo recém iniciadas" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Árvore" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Carácter de conclusão:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Carácter de comando:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Tamanho do histórico de comandos:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Completar ao estilo Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Campo de entrada " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Entrada" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Cores da alcunha" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Posição da lista de pessoas " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Sobrepor" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Letra " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Posição do tópico " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Primeiro plano" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Fundo" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Cor " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "Modo de _Ajuste:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Conversar " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Destacar palavras:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Som ao realçar" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Realce " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Saída" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Ativar" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Mostrar sempre" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Mostrar quando a janela é minimizada" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Mostrar quando a janela é fechada" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ícone da área de notificação " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Mostrar Smuxi no menu de mensagens" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Menu de mensagens" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Mostrar balões de notificação" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Balões de notificação" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Notificação" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Ambiente" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servidores" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtros" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Ativo" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Registar mensagens filtradas" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Diário" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Chat de IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Cliente de IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Conversar com outra pessoa no IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chat;conversa;mensagens;instantâneas;gnome;gtk;irc;twitter;facebook;gtalk;" "xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Conversar com outra pessoa no IRC, Twitter, Jabber e Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "O Smuxi é um cliente de chat de código aberto fácil de utilizar para IRC, " "Twitter, Jabber/XMPP, Campfire e Jabber da SignalR" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Inspirado pela combinação de ecrã e irssi, o Smuxi tem um servidor " "destacável (ou como um cliente /\"normal/\") que se mantém ligado quando não " "está e que lhe permite múltiplos ambientes para se ligar e sincronizar. Isto " "é semelhante a screen+irssi ou IRC bouncers mas mais elegante e poderoso." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "A janela principal mostra um canal IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "" "Américo Monteiro \n" "Pedro Ribeiro \n" "Tiago S. \n" "Pedro Albuquerque " #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Página web do Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oops, já o fiz outra vez..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "O Smuxi rebentou porque foi lançada uma excepção não gerida!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Aqui está informação de depuração, por favor, reporte este erro!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Reportar erro" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Motor não encontrado." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Gestor de motores" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Seleccionar o motor Smuxi ao qual se deseja ligar" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Usar modo de largura de banda estreita" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Motor local" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Por favor selecione um motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "O seu ambiente não é compatível com o motor!\n" "Versão do motor: {0}, versão do ambiente: {1}\n" "Protocolo do motor: {2}, protocolo do ambiente: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Ocorreu um erro ao ligar ao motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL do motor: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Erro: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Tem certeza que deseja eliminar o motor \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Vai colar {0} linhas. Quer continuar?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Comandos do ambiente" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Ativar saída de depuração" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Mostrar esta ajuda" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opções:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Ligar ao motor" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Abre a ligação especificada no Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Começa uma nova instância do Smuxi e ignora uma existente" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "A passar a ligação a uma instância já aberta do Smuxi..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "A trazer uma instância do Smuxi já aberta para a frente..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} utilizadores" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Desculpe, ainda não implementado!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Carácter" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Palavra" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory " "(volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a " "relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can " "even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the " "recommended setting." msgstr "" "Esta definição especifica se o Smuxi deve armazenar mensagens das conversas " "em memória (volátil) ou no disco (persistente).\n" "Para persistente, pode escolher centre Db4o, um base de dados de objetos ou " "SQLite, uma base de dados relacional.\n" "O backend Db4o tem problemas conhecidos como a utilização muito elevada de " "memória e de CPU e pode levar a bloqueios e por isso ter sido abandonado.\n" "O motor SQLite não tem problemas de desempenho nem de estabilidade e é a " "definição recomendada." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "Persistente: SQLite (recomendado)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Persistente: Db4o (abandonado)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Persistente (antevisão)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Volátil" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Nenhum proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Predefinição do sistema" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Ligação" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Ambiente" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Servidores" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Filtros" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Diário" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:699 msgid "Nicknames(s) field must not be empty." msgstr "O campo da(s) alcunha(s) não pode estar vazio." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:895 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Realce expreg inválido: \"{0}\". Razão: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Nome" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Tópico" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Não é recomendado procurar por grupos de conversação sem um filtro. Pode " "demorar muito tempo ou nem funcionar de todo.\n" "Quer continuar?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Erro ao obter a lista de grupos de conversação a partir do servidor." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Desligado do motor." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "A ligar novamente ao motor... (tentativa {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Causa: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "O ambiente perdeu a ligação ao servidor.\n" "Quer ligar novamente agora?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "A religação ao servidor falhou.\n" "Quer tentar de novo?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "O servidor perdeu a ligação ao ambiente.\n" "Quer ligar novamente agora?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Mostrar" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protocolo" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Nome da máquina" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Impossível carregar servidor: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Pessoa/Privado" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Grupo/Público" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Assistente de motores - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Adicionar motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Editar motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Credenciais" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Agora pode usar o motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Obrigado" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Já existe um motor com este nome! Por favor, especifique um diferente." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Insira a conversa a que se quer juntar" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Sobre o Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Preferências" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:264 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Impossível adicionar servidor: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:385 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Mudar para o motor local desligá-lo-á do motor atual!\n" "Tem certeza que quer fazer isto?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:429 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Mudar o motor remoto desligá-lo-á do motor atual!\n" "Tem certeza que quer fazer isto?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dia alterado de {0} para {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "Dia alterado para {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Filtro expreg inválido: \"{0}\". Razão: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Tem certeza que quer eliminar o filtro selecionado?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Protocolo/Servidor" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Tipo de conversação" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Evento" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Tipo" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Padrão" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Modo de largura de banda estreita ativo: mensagens não sincronizadas." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Mostrar barra de _Menu" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "A obter lista de utilizadores para {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "terminado." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Religar" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Fechar a conversa de protocolo fechará também todas as conversações abertas " "ligadas a ele!\n" "Tem certeza que quer fazer isto?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Tem certeza que quer eliminar o servidor selecionado?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Impossível editar o servidor: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Procurar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Procurar por:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Comparar maiúsculas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Procurar para _Trás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Dar a volta" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Usar expressões _Regulares" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - procurar grupo de conversação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nome:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Juntar-se" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Conversação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Ver" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "A_Juda" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Ligar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Abrir diário" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Preferências" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Sair" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Ligar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Adicionar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Gerir" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Abrir/Juntar-se a uma conversa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Procurar grupo de conversação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Limpar toda a atividade" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Conversa _Seguinte" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Conversa _Anterior" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Fechar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Usar motor local" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Adicionar motor remoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Trocar motor remoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Modo de _Cursor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Modo de _Explorador" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Mostrar barra de e_Stado" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Ecrã completo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Sobre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Procurar grupo de conversação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "Página _Web" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Mostrar barra de ferramen_Tas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - ligar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferências" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Alcunhas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Separadores" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Posição da lista de utilizadores " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Canal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtros de canais" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtros de utilizadores" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Usar túnel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Ativa o uso de SSH para a ligação. Isto tem um pequeno " "impacto no desempenho, mas é mais seguro e necessário quando se usa NAT ou " "firewalls baseadas em portas." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Máquina SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "DNS ou endereço IP e porta do servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Porta:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "DNS ou endereço IP e porta do servidor Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Máquina _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "Nome de utilizador _SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Nome de utilizador que será usado para iniciar sessão " "no servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "Senha de _SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Senha que será usada para iniciar sessão no servidor " "SSH. A senha é opcional se for usada uma chave de autenticação SSH (ver " "abaixo)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "Ficheiro de chave _SSH: (opcional)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Selecione um ficheiro" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Ficheiro de chave privada SSH que será usado para " "iniciar sessão no servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Utilizador:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Nome de utilizador que será usado para iniciar sessão " "no servidor Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Senha:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Senha do utilizador" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Verificar senha:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Repita a senha para verificação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Boas vindas ao Assistente de configuração de motores Smuxi.\n" "Tem de indicar alguma informação antes de poder usar o motor.\n" "\n" "Clique em \"Avançar\" para começar." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Nome do motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nome de perfil do novo motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Motor predefinido:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Usar como novo motor predefinido" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Se ativo, o motor atual será o predefinido na próxima " "vez que o Smuxi for iniciado" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - abrir conversação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tipo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "Nome de _Máquina:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Rede:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Alcunha:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocolo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Ligar automaticamente ao servidor no inicio" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Usar encriptação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Validar certificado do servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Comandos ao ligar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Comandos a ignorar:" #~ msgid "Protocol:" #~ msgstr "Protocolo:" #~ msgid "Network:" #~ msgstr "Rede:" #~ msgid "Hostname:" #~ msgstr "Nome da máquina:" #~ msgid "Your frontend version ({0}) does not match the engine version ({1})!" #~ msgstr "A sua versão de frontend {0} não equivale à versão do motor ({1})!" #~ msgid "_File" #~ msgstr "_Ficheiro" #~ msgid "_Quick Connect" #~ msgstr "Ligação _Rápida" #~ msgid "Show _Quick Join" #~ msgstr "Mostrar Ligação _Rápida" #~ msgid "Person" #~ msgstr "Pessoa" #~ msgid "Unknown ChatType: {0}" #~ msgstr "Tipo de Conversação Desconhecida: {0}" smuxi-1.1/po-Frontend-GNOME/it.po0000664000175000017500000011006614011526464017341 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # David Paleino , 2008. # # Vincenzo Campanella , 2009-2010, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend-gnome\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-11 11:52+0200\n" "PO-Revision-Date: 2010-09-11 09:50+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid " Color " msgstr " Colore " #: ../glade/smuxi-frontend-gnome.glade.h:3 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1364 msgid " Entry Field " msgstr " Campo d'inserimento " #: ../glade/smuxi-frontend-gnome.glade.h:4 msgid " Font " msgstr " Carattere " #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1694 msgid " Highlighting " msgstr " Evidenziazione " #: ../glade/smuxi-frontend-gnome.glade.h:6 msgid " Notification Area Icon " msgstr " Icona dell'area di notifica " #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid " Person List Position " msgstr " Posizione dell'elenco persone " #: ../glade/smuxi-frontend-gnome.glade.h:8 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1201 msgid " Tab Colors " msgstr " Colori delle schede " #: ../glade/smuxi-frontend-gnome.glade.h:9 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1102 msgid " Tabs Position " msgstr " Posizione delle schede " #: ../glade/smuxi-frontend-gnome.glade.h:10 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1507 msgid " Topic Position " msgstr " Posizione dell'argomento " #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "General" msgstr "Generale" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Global Commands" msgstr "Comandi globali" #: ../glade/smuxi-frontend-gnome.glade.h:13 msgid "Messaging Menu" msgstr "Menu dei messaggi" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proxy di rete" #: ../glade/smuxi-frontend-gnome.glade.h:15 msgid "Notification Popups" msgstr " Finestre a comparsa di notifica " #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1153 msgid "Activity" msgstr "Attività" # #: ../glade/smuxi-frontend-gnome.glade.h:17 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:235 msgid "Automatically connect to server at startup" msgstr "Connessione automatica al server all'avvio" #: ../glade/smuxi-frontend-gnome.glade.h:18 msgid "Background" msgstr "Sfondo" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1352 msgid "Bash-Style Completion" msgstr "Completamento in stile bash" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1682 msgid "Beep on highlight" msgstr "Avviso acustico sull'evidenziazione" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:972 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:994 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1453 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1478 msgid "Bottom" msgstr "Giù" #: ../glade/smuxi-frontend-gnome.glade.h:22 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:738 msgid "Buffer Lines:" msgstr "Righe di buffer:" #: ../glade/smuxi-frontend-gnome.glade.h:23 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:663 msgid "C_onnection" msgstr "C_onnessione" #: ../glade/smuxi-frontend-gnome.glade.h:24 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1304 msgid "Command Character:" msgstr "Carattere di comando:" #: ../glade/smuxi-frontend-gnome.glade.h:25 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1327 msgid "Command History Size:" msgstr "Dimensione della cronologia dei comandi:" #: ../glade/smuxi-frontend-gnome.glade.h:26 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1284 msgid "Completion Character:" msgstr "Carattere di completamento:" #: ../glade/smuxi-frontend-gnome.glade.h:27 msgid "Enable" msgstr "Abilita" #: ../glade/smuxi-frontend-gnome.glade.h:28 msgid "Enabled" msgstr "Abilitato" #: ../glade/smuxi-frontend-gnome.glade.h:29 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:551 msgid "Encoding:" msgstr "Codifica:" #: ../glade/smuxi-frontend-gnome.glade.h:30 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:761 msgid "Engine Buffer Lines:" msgstr "Righe di buffer del motore:" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Foreground" msgstr "In primo piano" #: ../glade/smuxi-frontend-gnome.glade.h:32 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:917 msgid "General" msgstr "Generale" #: ../glade/smuxi-frontend-gnome.glade.h:33 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1173 msgid "Highlight" msgstr "Evidenziazione" #: ../glade/smuxi-frontend-gnome.glade.h:34 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1658 msgid "Highlight words:" msgstr "Evidenzia parole:" #: ../glade/smuxi-frontend-gnome.glade.h:35 msgid "Host:" msgstr "Host:" #: ../glade/smuxi-frontend-gnome.glade.h:36 msgid "Hostname:" msgstr "Nome dell'host:" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1373 msgid "Input" msgstr "Input" #: ../glade/smuxi-frontend-gnome.glade.h:38 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1163 msgid "Join/Part/Mode" msgstr "Entra/Esci/Modo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:39 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1008 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1033 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1527 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1553 msgid "Left" msgstr "Sinistra" #: ../glade/smuxi-frontend-gnome.glade.h:40 msgid "Log Filtered Messages" msgstr "Messaggi di registro filtrati" #: ../glade/smuxi-frontend-gnome.glade.h:41 msgid "Network:" msgstr "Rete:" #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1394 msgid "Nick Colors" msgstr "Colori dei soprannomi" #: ../glade/smuxi-frontend-gnome.glade.h:43 msgid "Nickname(s):" msgstr "Soprannomi:" #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1145 msgid "No Activity" msgstr "Nessuna attività" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1088 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1493 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1608 msgid "None" msgstr "Nessuna" #: ../glade/smuxi-frontend-gnome.glade.h:46 msgid "Notification" msgstr "Notifica" #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:573 msgid "On Connect Commands:" msgstr "Comandi alla connessione:" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:619 msgid "On Startup Commands:" msgstr "Comandi all'avvio:" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1706 msgid "Output" msgstr "Output" #: ../glade/smuxi-frontend-gnome.glade.h:50 msgid "Override" msgstr "Sovrascrivi" #: ../glade/smuxi-frontend-gnome.glade.h:51 msgid "Password:" msgstr "Password:" #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Port:" msgstr "Porta:" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Protocol:" msgstr "Protocollo:" #: ../glade/smuxi-frontend-gnome.glade.h:54 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:530 msgid "Realname:" msgstr "Nome reale:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1048 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1073 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1568 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1593 msgid "Right" msgstr "Destra" #: ../glade/smuxi-frontend-gnome.glade.h:56 msgid "Show Advanced Settings" msgstr "Mostra impostazioni avanzate" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:196 msgid "Show Password" msgstr "Mostra la password" #: ../glade/smuxi-frontend-gnome.glade.h:58 msgid "Show Smuxi in the messaging menu" msgstr "Mostra Smuxi nel menù dei messaggi" #: ../glade/smuxi-frontend-gnome.glade.h:59 msgid "Show always" msgstr "Mostra sempre" #: ../glade/smuxi-frontend-gnome.glade.h:60 msgid "Show notification popups" msgstr "Mostra finestre a comparsa di notifica" #: ../glade/smuxi-frontend-gnome.glade.h:61 msgid "Show when window is closed" msgstr "Mostra quando la finestra viene chiusa" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid "Show when window is minimized" msgstr "Mostra quando la finestra viene minimizzata" #: ../glade/smuxi-frontend-gnome.glade.h:63 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:398 msgid "Smuxi - Preferences" msgstr "Preferenze di Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:18 msgid "Smuxi - Server" msgstr "Server di Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:820 msgid "Strip Colors" msgstr "Rimuovi i colori" #: ../glade/smuxi-frontend-gnome.glade.h:66 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:859 msgid "Strip Formattings" msgstr "Rimuovi le formattazioni" #: ../glade/smuxi-frontend-gnome.glade.h:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:899 msgid "Strip UTF-8" msgstr "Rimuovi UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:68 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1214 msgid "Tabs" msgstr "Schede" # #: ../glade/smuxi-frontend-gnome.glade.h:69 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Il soprannome da usare. È possibile specificare più soprannomi, separati da " "uno spazio, che verranno usati come alternativa qualora quello principale " "non sia disponibile. In modo predefinito verrà usato $nick_, mentre $nick__ " "viene usato come alternativa." #: ../glade/smuxi-frontend-gnome.glade.h:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:718 msgid "Timestamp Format:" msgstr "Formato dell'ora:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:71 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:935 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:959 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1412 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1438 msgid "Top" msgstr "Su" #: ../glade/smuxi-frontend-gnome.glade.h:72 msgid "Type:" msgstr "Tipo:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:507 msgid "Username:" msgstr "Nome utente:" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1873 msgid "_Filters" msgstr "_Filtri" #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1715 msgid "_Interface" msgstr "_Interfaccia" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "_Logging" msgstr "_Registro" #: ../glade/smuxi-frontend-gnome.glade.h:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1781 msgid "_Servers" msgstr "_Server" #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "_Wrap Mode:" msgstr "_Modalità a capo automatico:" # #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = secondi\n" "mm = minuti\n" "hh = ore (01 - 12)\n" "HH = ore (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = giorno\n" "MM = mese\n" "yy/yyyy = anno" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 msgid "Chat with other people on IRC" msgstr "Chiacchiera con altre persone su IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Chat IRC" # #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Client di IRC Smuxi" #: ../src/Frontend-GNOME/AboutDialog.cs:58 msgid "translator-credits" msgstr "" "David Paleino \n" "Vincenzo Campanella " #: ../src/Frontend-GNOME/AboutDialog.cs:61 msgid "Smuxi Website" msgstr "Sito web di Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:44 msgid "Oops, I did it again..." msgstr "Oops, l'ho fatto ancora." #: ../src/Frontend-GNOME/CrashDialog.cs:57 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi si è bloccato perché è avvenuta un'eccezione non gestita." #: ../src/Frontend-GNOME/CrashDialog.cs:61 msgid "Here is the stacktrace, please report this bug!" msgstr "Ecco lo stacktrace. Per favore, segnalare questo bug." #: ../src/Frontend-GNOME/CrashDialog.cs:81 msgid "_Report Bug" msgstr "_Segnala bug" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine Manager" msgstr "Gestore del motore" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:68 msgid "_Connect" msgstr "_Connetti" # #: ../src/Frontend-GNOME/EngineManagerDialog.cs:84 msgid "Select which Smuxi engine you want to connect to" msgstr "Selezionare il motore Smuxi a cui connettersi" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:90 msgid "Engine:" msgstr "Motore:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:116 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:176 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:353 msgid "Local Engine" msgstr "Motore locale" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:168 msgid "Please select an engine!" msgstr "Scegliere un motore." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 #, csharp-format msgid "Your frontend version ({0}) does not match the engine version ({1})!" msgstr "" "La versione dell'interfaccia in uso ({0}) non corrisponde a quella del " "motore ({1})." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:216 msgid "An error occurred while connecting to the engine!" msgstr "Errore durante la connessione al motore." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:217 #, csharp-format msgid "Engine URL: {0}" msgstr "URL del motore: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:220 #, csharp-format msgid "Error: {0}" msgstr "Errore: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:290 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Si è sicuri di voler eliminare il motore «{0}»?" #: ../src/Frontend-GNOME/Entry.cs:421 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Si stanno per incollare {0} righe. Continuare?" # #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:524 msgid "Frontend Commands" msgstr "Comandi dell'interfaccia" #: ../src/Frontend-GNOME/MainWindow.cs:222 msgid "_File" msgstr "_File" #: ../src/Frontend-GNOME/MainWindow.cs:238 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/MainWindow.cs:242 msgid "_Quick Connect" msgstr "C_onnessione Rapida" #: ../src/Frontend-GNOME/MainWindow.cs:253 msgid "_Manage" msgstr "_Gestisci" #: ../src/Frontend-GNOME/MainWindow.cs:260 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/MainWindow.cs:264 msgid "Open / Join Chat" msgstr "Apri / Partecipa alla chat" #: ../src/Frontend-GNOME/MainWindow.cs:269 msgid "_Find Group Chat" msgstr "_Trova chat di gruppo" #: ../src/Frontend-GNOME/MainWindow.cs:274 msgid "C_lear All Activity" msgstr "Cance_lla tutte le attività" #: ../src/Frontend-GNOME/MainWindow.cs:281 msgid "_Next Chat" msgstr "Chat segue_nte" #: ../src/Frontend-GNOME/MainWindow.cs:291 msgid "_Previous Chat" msgstr "Chat p_recedente" #: ../src/Frontend-GNOME/MainWindow.cs:341 msgid "Open Log" msgstr "Apri il registro" #: ../src/Frontend-GNOME/MainWindow.cs:355 msgid "_Engine" msgstr "_Motore" #: ../src/Frontend-GNOME/MainWindow.cs:359 msgid "_Use Local Engine" msgstr "_Utilizza il motore locale" #: ../src/Frontend-GNOME/MainWindow.cs:365 msgid "_Add Remote Engine" msgstr "_Aggiungi motore remoto" #: ../src/Frontend-GNOME/MainWindow.cs:370 msgid "_Switch Remote Engine" msgstr "_Cambia motore remoto" #: ../src/Frontend-GNOME/MainWindow.cs:377 msgid "_View" msgstr "_Visualizza" #: ../src/Frontend-GNOME/MainWindow.cs:381 msgid "_Caret Mode" msgstr "Modalità _cursore" #: ../src/Frontend-GNOME/MainWindow.cs:389 msgid "_Browse Mode" msgstr "Modalità di _navigazione" #: ../src/Frontend-GNOME/MainWindow.cs:403 #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:586 msgid "Show _Menubar" msgstr "Mostra la barra del _menù" #: ../src/Frontend-GNOME/MainWindow.cs:430 msgid "_Help" msgstr "A_iuto" #: ../src/Frontend-GNOME/MainWindow.cs:691 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:225 msgid "Unable to add server: " msgstr "Impossibile aggiungere il server: " #: ../src/Frontend-GNOME/MainWindow.cs:742 #, csharp-format msgid "Unknown ChatType: {0}" msgstr "Tipo di chat sconosciuto: {0}" #: ../src/Frontend-GNOME/MainWindow.cs:971 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Il passaggio al motore locale provocherà la disconnessione dal motore " "attuale.\n" "Si è sicuri di volerlo fare?" #: ../src/Frontend-GNOME/MainWindow.cs:1013 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Il passaggio al motore remoto provocherà la disconnessione dal motore " "attuale.\n" "Si è sicuri di volerlo fare?" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Spiacente, non ancora implementato." #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Carattere" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Parola" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:198 msgid "No Proxy" msgstr "Nessun proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:139 msgid "Connection" msgstr "Connessione" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Interface" msgstr "Interfaccia" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:220 msgid "Servers" msgstr "Server" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:227 msgid "Filters" msgstr "Filtri" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:231 msgid "Logging" msgstr "Registri" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:281 msgid "System Default" msgstr "Predefinito dal sistema" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:588 msgid "Nicknames(s) field must not be empty." msgstr "Il campo soprannomi non deve essere vuoto." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:748 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "" "Espressione regolare di evidenziazione non valida: «{0}». Motivo: «{1}»." #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:69 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:105 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:271 msgid "Name" msgstr "Nome" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:74 msgid "Topic" msgstr "Argomento" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:102 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "La ricerca di chat di gruppo senza un filtro non è consigliata: potrebbe " "volerci un po' di tempo, o potrebbe non funzionare del tutto.\n" "Continuare?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:143 msgid "Error while fetching the list of group chats from the server." msgstr "" "Errore durante il recupero dell'elenco delle chat di gruppo dal server." #: ../src/Frontend-GNOME/Frontend.cs:399 #, csharp-format msgid "Cause: {0}" msgstr "Causa: {0}" # #: ../src/Frontend-GNOME/Frontend.cs:469 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "L'interfaccia ha perso la connessione al server.\n" "Riconnettersi ora?" # #: ../src/Frontend-GNOME/Frontend.cs:484 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "La riconnessione al server non è riuscita.\n" "Riprovare?" # #: ../src/Frontend-GNOME/Frontend.cs:585 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Il server ha perso la connessione all'interfaccia.\n" "Riconnettersi ora?" #: ../src/Frontend-GNOME/NotifyManager.cs:229 msgid "Show" msgstr "Mostra" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:62 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:238 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protocollo" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:63 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Nome dell'host" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:166 msgid "Unable to load server: " msgstr "Impossibile caricare il server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:244 msgid "Person / Private" msgstr "Persona / Privato" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:245 msgid "Group / Public" msgstr "Gruppo / Pubblico" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:70 msgid "Engine Assistant - Smuxi" msgstr "Assistente del motore di Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Add Smuxi Engine" msgstr "Aggiungi motore Smuxi" # #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:94 msgid "Edit Smuxi Engine" msgstr "Modifica motore Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:203 msgid "Credentials" msgstr "Credenziali" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:265 msgid "Now you can use the Smuxi Engine" msgstr "Adesso è possibile usare il motore Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:268 msgid "Thank you" msgstr "Grazie" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:285 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Un motore con questo nome esiste già. Specificarne un altro." #: ../src/Frontend-GNOME/Views/MessageTextView.cs:198 #, csharp-format msgid "Day changed to {0}" msgstr "Giorno modificato in {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:123 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:133 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Espressione regolare del filtro non valida: «{0}». Motivo: »{1}»." #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:200 msgid "Are you sure you want to delete the selected filter?" msgstr "Si è sicuri di voler eliminare il filtro selezionato?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:246 msgid "Protocol / Server" msgstr "Protocollo / Server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:253 msgid "Chat Type" msgstr "Tipo di chat" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:287 msgid "Normal" msgstr "Normale" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:288 msgid "Event" msgstr "Evento" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:295 msgid "Type" msgstr "Tipo" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:321 msgid "Pattern" msgstr "Modello" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:242 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Recupero dell'elenco degli utenti per {0} in corso" # #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:289 msgid "done." msgstr "eseguito." #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:304 msgid "Person" msgstr "Persona" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:68 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "La chiusura della chat di protocollo chiuderà anche tutte le chat aperte a " "essa collegate.\n" "Si è sicuri di volerlo fare?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:187 msgid "Are you sure you want to delete the selected server?" msgstr "Si è sicuri di voler eliminare il server selezionato?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:243 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:277 msgid "Unable to edit server: " msgstr "Impossibile modificare il server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:34 msgid "Find" msgstr "Trova" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:54 msgid "_Search for:" msgstr "_Cerca:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:83 msgid "_Match Case" msgstr "_Distingui le maiuscole" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:95 msgid "Search _Backwards" msgstr "Cerca all'_indietro" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:107 msgid "_Wrap Around" msgstr "_A capo automatico" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:120 msgid "Use _Regular Expressions" msgstr "Usa le espressioni _regolari" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:32 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Trova chat di gruppo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:79 msgid "_Name:" msgstr "_Nome:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:24 msgid "Smuxi - Quick Connect" msgstr "Smuxi - Connessione rapida" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:487 msgid "Nicknames:" msgstr "Soprannomi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1622 msgid " User List Position " msgstr " Posizione dell'elenco degli utenti " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1633 msgid " Channel " msgstr " Canale " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1844 msgid "Channel Filters" msgstr "Filtri del canale" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1861 msgid "User Filters" msgstr "Filtri dell'utente" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "Use _SSH Tunnel" msgstr "Usa tunnel _SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:70 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Abilita l'uso di SSH per la connessione. Questo ha un " "impatto ridotto sulle prestazioni, ma è più sicuro ed è richiesto quando si " "usa NAT o firewall basati sulle porte" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:149 msgid "SSH _Host:" msgstr "_Host SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:160 msgid "" "DNS or IP address and port of the SSH server" msgstr "DNS o indirizzo IP e porta del server SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:187 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:155 msgid "_Port:" msgstr "_Porta:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:200 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "DNS o indirizzo IP e porta del server Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:213 msgid "_Smuxi Host:" msgstr "Host _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:68 msgid "_SSH Username: (optional)" msgstr "Nome utente _SSH: (facoltativo)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:91 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Nome utente che verrà utilizzato per accedere al server " "SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:111 msgid "_SSH Password: (optional)" msgstr "Password _SSH: (facoltativa)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:135 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (via Pageant from " "the PuTTY tools)." msgstr "" "Password che verrà utilizzata per accedere al server " "SSH. La password è facoltativa se viene utilizzata una chiave di " "autorizzazione SSH (tramite Pageant dagli strumenti di PuTTY)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:156 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:214 msgid "_Username:" msgstr "Nome _utente:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:179 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Nome utente che verrà utilizzato per accedere al server " "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:199 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:113 msgid "_Password:" msgstr "_Password:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:223 msgid "Password of the user" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:243 msgid "_Verify Password:" msgstr "_Verifica password:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:267 msgid "Repeat the password for verification" msgstr "Ripetere la password per la verifica" # #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Benvenuti nell'assistente di configurazione del motore di Smuxi.\n" "Sarà necessario inserire alcune informazioni prima di poter usare il " "motore.\n" "\n" "Fare clic su «Avanti» per iniziare." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:44 msgid "_Engine Name:" msgstr "_Nome del motore:" # #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:67 msgid "Profile name of the new engine" msgstr "Nome del profilo del nuovo motore" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:88 msgid "_Default Engine:" msgstr "Motore _predefinito:" # #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:99 msgid "Use as new default engine" msgstr "Usa come motore predefinito" # #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:112 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Se abilitato, il motore attuale sarà quello predefinito " "al prossimo avvio di Smuxi" # #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:26 msgid "Smuxi - Open Chat" msgstr "Smuxi - Apri chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:69 msgid "_Type:" msgstr "_Tipo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:80 msgid "_Hostname:" msgstr "Nome dell'_host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:101 msgid "_Network:" msgstr "_Rete:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "_Protocol:" msgstr "_Protocollo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:248 msgid "Use Encryption" msgstr "Usa la cifratura" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:260 msgid "Validate Server Certificate" msgstr "Convalida il certificato del server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:280 msgid "_On Connect Commands:" msgstr "_Comandi alla connessione:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:291 msgid "_Ignore Commands" msgstr "_Ignora comandi" #~ msgid "German" #~ msgstr "Tedesco" #~ msgid "Spanish" #~ msgstr "Spagnolo" #~ msgid "British English" #~ msgstr "Inglese britannico" #~ msgid "French" #~ msgstr "Francese" #~ msgid "Italian" #~ msgstr "Italiano" #~ msgid "_Edit" #~ msgstr "_Modifica" #~ msgid "Joins" #~ msgstr "Ingressi" #~ msgid "Parts" #~ msgstr "Uscite" #~ msgid "Quits" #~ msgstr "Disconnessioni" #~ msgid "Unknown Command: {0}" #~ msgstr "Comando sconosciuto: {0}" smuxi-1.1/po-Frontend-GNOME/nl.po0000664000175000017500000013427514011526464017346 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:19+0000\n" "PO-Revision-Date: 2019-03-10 16:11+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi-voorkeuren" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "De bijnaam om te gebruiken. U kunt extra bijnamen opgeven (gescheiden door " "spaties), welke gebruikt zullen worden als reserve als de eerste keus niet " "beschikbaar is. Standaard worden $bijnaam_ en $bijnaam__ gebruikt als " "reserve." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Bijna(a)m(en):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Gebruikersnaam:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Echte naam:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Codering:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "UTF-8-tekens automatisch omzetten" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Algemeen" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Type:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Host:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Wachtwoord:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Poort:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Wachtwoord tonen" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Netwerkproxy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Opdrachten bij verbinding:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Opdrachten bij opstarten:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globale opdrachten" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "V_erbinding" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Tijdsaanduiding:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Bufferregels:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Enginebufferregels:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = seconden\n" "mm = minuten\n" "hh = uren (01 - 12)\n" "HH = uren (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = dag\n" "MM = maand\n" "yy/yyyy = jaar" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Persistency-type:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Vluchtige bufferregels:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Blijvende bufferregels:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Berichtenbuffer" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Kleuren strippen" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Opmaak strippen" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "UTF-8 strippen" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Geavanceerde instellingen weergeven" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Geavanceerd" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Algemeen" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Boven" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Onder" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Links" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Rechts" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Geen" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Positie van tabbladen " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Markeren" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Activiteit" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Geen activiteit" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Modus" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Kleuren van tabbladen " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Automatisch omschakelen naar nieuw geopende één-op-één-gesprekken" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Automatisch omschakelen naar nieuw geopende groepsgesprekken" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Boom" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Aanvullingsteken:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Opdrachtteken:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Grootte van opdrachtgeschiedenis:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash-stijl-aanvulling" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Invoerveld " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Invoer" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Bijnaamkleuren" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Positie van personenlijst " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Overschrijven" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Lettertype " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Positie van onderwerp " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Voorgrond" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Achtergrond" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Kleur " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Omloopmodus:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Gesprek " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Woorden markeren:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Piepen bij markering" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Markering " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Uitvoer" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Inschakelen" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Altijd weergeven" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Tonen als het venster geminimaliseerd is" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Tonen als het venster gesloten is" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Pictogram in meldingsgebied " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Smuxi tonen in het berichtenmenu" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Berichtenmenu" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Meldingspop-ups tonen" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Meldingspop-ups" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Melding" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interface" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servers" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filters" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Ingeschakeld" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Gefilterde berichten opslaan in logboek" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Loggen" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC-chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi-IRC-cliënt" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Praat met andere mensen op IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;berichten;gesprekken;babbelen;praten;spreken;klappen;kletsen;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Praat met andere mensen op IRC, Twitter, Jabber en Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi is een vrije, gedistribueerde en gebruiksvriendelijke chatcliënt voor " "IRC, Twitter, Jabber/XMPP, Campire en JabbR van SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Geïnspireerd op een combinatie van screen en irssi heeft Smuxi een " "loskoppelbare server (of zoals een ‘normale’ cliënt) die verbonden blijft " "terwijl u dat niet bent, en de mogelijkheid biedt om meerdere Smuxi-" "frontends verbonden en gesynchroniseerd te houden. Dit is gelijkaardig aan " "screen+irssi of IRC-bouncers, maar eleganter en krachtiger." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Het hoofdvenster, met een IRC-kanaal" #: ../src/Frontend-GNOME/AboutDialog.cs:70 msgid "translator-credits" msgstr "" "Jeroen Baten \n" "Nathan Follens \n" "\n" "Meer info over Gnome-NL http://nl.gnome.org" #: ../src/Frontend-GNOME/AboutDialog.cs:83 msgid "Smuxi Website" msgstr "Website van Smuxi" # Britney Spears mag wel onvertaald blijven vind ik - Nathan #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oops, I did it again…" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi is gecrasht door een onverwerkte uitzondering!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Hier is de stacktrace, gelieve deze bug te melden!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "Bug _melden" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Engine niet gevonden." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Enginebeheer" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Kies met welke Smuxi-engine u verbinding wilt maken" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Engine:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Lagebandbreedtemodus gebruiken" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Lokale engine" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Kies een engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Uw frontend is niet compatibel met de engine!\n" "Engineversie: {0}, Frontendversie: {1}\n" "Engineprotocol: {2}, Frontendprotocol: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Er is een fout opgetreden tijdens het verbinden met de engine!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Engine-URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Fout: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Weet u zeker dat u engine ‘{0}’ wilt verwijderen?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "U staat op het punt om {0} regels te plakken. Wilt u echt verdergaan?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Frontend-opdrachten" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Debuguitvoer inschakelen" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Deze hulp tonen" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opties:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Verbinden met engine" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Opent de opgegeven verwijzing met Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Opent een nieuwe instantie van Smuxi en negeert de bestaande instantie" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Verwijzing wordt doorgegeven aan bestaande Smuxi-instantie…" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Bestaande Smuxi-instantie wordt naar voorgrond getrokken…" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} gebruikers" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Sorry, nog niet geïmplementeerd!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Naam" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Onderwerp" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Zonder filter zoeken naar groepsgesprekken wordt niet aanbevolen. Dit kan " "nogal lang duren, of zelfs helemaal niet werken.\n" "Wilt u toch doorgaan?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "" "Fout tijdens het ophalen van een lijst met groepsgesprekken vanaf de server." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Verbinding met engine verbroken." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Opnieuw verbinden met engine… (poging {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Oorzaak: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Er is een fatale fout gedetecteerd door een incompatibiliteit met het " "protocol van de smuxi-server!\n" "\n" "Installeer Mono zodat dit overeenkomt met de smuxi-server.\n" "\n" "Meer informatie over dit probleem kan hier gevonden worden:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "De frontend is de verbinding met de server verloren.\n" "Wilt u de verbinding herstellen?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Het opnieuw verbinden met de server is mislukt.\n" "Wilt u het opnieuw proberen?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "De server is de verbinding met de frontend kwijt.\n" "Wilt u de verbinding herstellen?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Tonen" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protocol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Hostnaam" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Kan server niet laden: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Persoon / privé" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Groep / openbaar" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Engine-assistent - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Smuxi-engine toevoegen" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Smuxi-engine bewerken" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Verbinding" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Aanmeldgegevens" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "U kunt de Smuxi-engine nu gebruiken" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Dank u" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Er bestaat al een engine met deze naam. Kies er een andere." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Voer in aan welk gesprek u wilt deelnemen" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Over Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Voorkeuren" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:266 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Kan server niet toevoegen: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:391 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Omschakelen naar lokale engine zal uw verbinding met de huidige engine " "verbreken!\n" "Weet u zeker dat u dit wilt doen?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:435 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Omschakelen naar externe engine zal uw verbinding met de huidige engine " "verbreken!\n" "Weet u zeker dat u dit wilt doen?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dag gewijzigd van {0} naar {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Dag gewijzigd naar {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Ongeldige filter-regex: ‘{0}’. Reden: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Weet u zeker dat de geselecteerde filter wilt verwijderen?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Netwerk" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protocol / server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Gesprekstype" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normaal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Gebeurtenis" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Type" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Patroon" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Geen proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Systeemstandaard" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Opslaan" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Toevoegen" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Niet ondersteund" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Lagebandbreedtemodus is actief: geen berichten gesynchroniseerd." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "_Menubalk tonen" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Ophalen van gebruikerslijst voor {0}…" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "klaar." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Opnieuw verbinden" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Het sluiten van het protocolverkeer zal ook alle open gesprekken die hiermee " "verbonden zijn afsluiten. \n" "Weet u zeker dat u dit wilt doen?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Weet u zeker dat u de geselecteerde server wilt verwijderen?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Kan server niet bewerken: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Zoeken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Zoeken naar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Hoo_fdlettergevoelig" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Achter_waarts zoeken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Doo_rgaan na documenteinde" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "_Reguliere expressies gebruiken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Groepsgesprek zoeken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Naam:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Deelnemen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Gesprek" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Beeld" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Help" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Verbinden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Logboek openen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Voorkeuren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Afsluiten" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Verbinden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Toevoegen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Beheren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Gesprek openen / binnengaan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Groepsgesprek zoeken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "A_lle activiteiten wissen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Volge_nd gesprek" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Vorig ges_prek" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "Sl_uiten" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "Lokale engine gebr_uiken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Externe engine toevoegen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Omschakelen naar externe engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "_Cursor-modus" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Bladermodus" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "_Statusbalk tonen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Volledig scherm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Info" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Groepsgesprek zoeken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Website" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Werkbalk _tonen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Verbinden" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Voorkeuren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Bijnamen:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Tabbladen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Positie van gebruikerslijst " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanaal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanaalfilters" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Gebruikersfilters" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "_SSH-tunnel gebruiken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Maakt het mogelijk SSH te gebruiken voor de verbinding. " "Dit heeft een kleine impact op de prestaties, maar is veiliger en " "noodzakelijk bij het gebruik van NAT- of poort-gebaseerde firewalls" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH-_host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "DNS- of IP-adres en poort van de SSH-server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Poort:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "DNS- of IP-adres en poort van de Smuxi-server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi-host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "_SSH-gebruikersnaam: (optioneel)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Gebruikersnaam die gebruikt zal worden voor het " "aanmelden bij de SSH-server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "_SSH-wachtwoord: (optioneel)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Wachtwoord dat gebruikt zal worden voor het aanmelden " "bij de SSH-server. Het wachtwoord is optioneel als SSH-sleutelauthenticatie " "wordt gebruikt (zie hieronder)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_SSH-sleutelbestand: (optioneel)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Kies een bestand" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "SSH-privésleutelbestand dat gebruikt zal worden voor " "het aanmelden bij de SSH-server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Gebruikersnaam:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Gebruikersnaam die gebruikt zal worden voor het " "aanmelden bij de Smuxi-server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Wachtwoord:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Wachtwoord van de gebruiker" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Verifieer wachtwoord:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Herhaal het wachtwoord ter verificatie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Welkom bij de Smuxi-engineconfiguratie-assistent.\n" "U dient wat informatie in te voeren voordat u de engine kunt gebruiken.\n" "\n" "Klik op ‘Verder’ om te beginnen." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Enginenaam:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Profielnaam van de nieuwe engine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Standaardengine:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Gebruiken als nieuwe standaardengine" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Indien geselecteerd zal de huidige engine ingesteld " "worden als standaardengine de volgende keer dat u Smuxi opstart" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Gesprek openen" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Type:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Hostnaam:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Netwerk:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Bijnaam:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Automatisch verbinden met server bij opstarten" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Versleuteling gebruiken" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Servercertificaat valideren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Opdrachten bij verbinding:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Negeeropdrachten" #~ msgid "Protocol:" #~ msgstr "Protocol:" #~ msgid "Hostname:" #~ msgstr "Hostnaam:" #~ msgid "Your frontend version ({0}) does not match the engine version ({1})!" #~ msgstr "" #~ "Uw frontend versie ({0}) komt niet overeen met de engine versie ({1})!" #~ msgid "Character" #~ msgstr "Karakter" #~ msgid "Word" #~ msgstr "Woord" #~ msgid "Volatile" #~ msgstr "Volatile" #~ msgid "Persistent" #~ msgstr "Persistent" #~ msgid "Interface" #~ msgstr "Interface" #~ msgid "Servers" #~ msgstr "Servers" #~ msgid "Filters" #~ msgstr "Filters" #~ msgid "Logging" #~ msgstr "Logging" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Alias(en)veld mag niet leeg zijn." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Ongeldige highlight regex: '{0}'. Reden: {1}" #~ msgid "Person" #~ msgstr "Persoon" smuxi-1.1/po-Frontend-GNOME/ru.po0000664000175000017500000014735214011526464017363 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2017-10-27 14:06+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Настройки Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "Используемое имя. Можно указать дополнительные имена, разделенные пробелами, которые будут использоваться, если первое недоступно; по умолчанию для этого будут использоваться варианты $nick_ и $nick__." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Имена:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Имя пользователя:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Полное имя:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Кодировка:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Автоматически перекодировать символы UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Общие" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Тип:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Сервер:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Пароль:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Порт:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Отображать пароль" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Прокси-сервер" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Команды при соединении:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Команды при запуске:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Глобальные команды" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "Соединение" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Формат метки времени:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Раз_мер буфера:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Строк в буфере ядра:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = секунды\nmm = минуты\nhh = часы (01 - 12)\nHH = часы (00 - 23)\ntt = AM/PM\n\ndd = день\nMM = месяц\nyy/yyyy = год" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Способ сохранения:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Строки временного буфера:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Строки постоянного буфера:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Буфер сообщений" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Убирать цвета" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Убирать начертания" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Убирать символы UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Показывать расширенные настройки" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Расширенные" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Общие" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Сверху" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Снизу" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Слева" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Справа" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Нет" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Положение " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Подсветка" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Активность" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Без изменений" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Служебные сообщения" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Цвета вкладок " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Автоматически переключаться на только что открытые персональные чаты" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Автоматически переключаться на только что открытые групповые чаты" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Дерево" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Символ дополнения:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Символ команды:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Размер журнала команд:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Дополнение в стиле Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Строка ввода " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Ввод" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Цветные имена" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Список участников " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Изменить:" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Шрифт " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Тема " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Текст" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Фон" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Цвета " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "Режим п_ереноса:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Разговор " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Подсвечивать слова" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Звуковой сигнал" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Подсветка " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Вывод" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Включить" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Всегда" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Когда окно свернуто" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Когда окно закрыто" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Значок в области уведомлений " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Включать Smuxi в меню сообщений" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Меню сообщений" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Использовать всплывающие сообщения" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Вcплываюoщие cообщения" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Оповещения" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Вид" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Серверы" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Фильтры" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Запись в журнал" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Включать отфильтрованные сообщения" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Журнал" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - сервер" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Автоматически соединяться с сервером при старте" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Протокол:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Сеть:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Имя хоста:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC-чат" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "IRC-клиент Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Разговор с людьми в сети IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Общаться с другими людьми в IRC, Twitter, Jabber и Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi это опенсорсная, распределенная, удобная программа для общения в сетях IRC, Twitter, Jabber/XMPP, Campfire и JabbR на SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "Улучшая идеи screen и irssi, Smuxi включает в себя отключаемый сервер (выглядящий для сети как обычный клиент) который остаётся соединенным с сетью даже когда вы отсутствуете. Сервер может обеспечивать подключение нескольких клиентских программ Smuxi одновременно. Это похоже на боунсеры IRC или связку screen+irssi но реализовано элегантнее и фунцкиональнее." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Главное окно отображает канал IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Alexandr Ponomarenko, 2010" #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Сайт Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Опять двадцать пять..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi аварийно завершается из-за необработанного исключения!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Сообщите об ошибке, приложив эту трассировку." #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "Сообщить об о_шибке" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Движок не найден." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Управление ядрами" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Выберите ядро Smuxi, к которому следует подключиться" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Ядро:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Режим узкого канала" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Локальное ядро" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Нужно выбрать ядро!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "Ваша программа-клиент не совместима с ядром!\nВерсия ядра: {0}, версия клиента: {1}\nПротокол ядра: {2}, протокол клиента: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Ошибка при подключении к ядру!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Адрес URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Ошибка: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Вы действительно хотите удалить ядро \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Будут вставлены {0} строк текста. Продолжить?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Команды оболочки" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Включить вывод отладочной информации" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Показать эту справку" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Параметры:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Подключиться к ядру" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Открыть указанную гиперссылку в Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Запустить новый экземпляр Smuxi, игнорируя уже запущенный" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Передача гиперссылки в работающую программу Smuxi" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Перемещение запущенной программы Smuxi навверх " #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} пользователей" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Функция не реализована." #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "по символам" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "по словам" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "Эта настройка указывает Smuxi, где хранить историю сообщений - в памяти (пропадёт при выходе) или на диске (останется надолго).\nДля длительного хранения вы можете использовать объектную Db4o или обычную реляционную базу данных SQLite.\nDb4o требует больше памяти и времени процессора и может содержать больше ошибок в программном коде, поэтому её использование не рекомендуется.\nСУБД SQLite не имеет известных ошибок, поэтому лучше использовать именно её." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "Сохранять в SQLite (рекомендуется)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Сохранять в Db4o (не рекомендуется)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Предварительный просмотр" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Не сохранять" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Без прокси-сервера" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Системная" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Соединение" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Вид" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Серверы" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Фильтры" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Журнал" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Нужно указать хотя бы одно имя" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Неверное выражение для подсветки: '{0}'. Причина: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Имя" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Тема" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "Поиск конференций без указания фильтра не рекомендуется. Это может занять много времени, но не принести результата.\nПродолжить?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Не удалось получить с сервера список конференций." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Отсоединено от ядра." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Повторное соединение с ядром (попытка {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Причина: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "Клиентская программа потеряла соединение с сервером.\nВыполнить подключение?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "Не удалось возобновить подключение к серверу.\nПопробовать еще раз?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "Сервер потерял соединение с клиентской программой.\nВыполнить подключение?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Показать" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Протокол" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Имя" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Не удалось загрузить сервер: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Личные" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Групповые и обществ." #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Мастер настройки - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Добавить ядро Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Свойства ядра Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Ключи и пароли" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Ядро Smuxi готово к использованию" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Спасибо!" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Ядро под таким названием уже существует! Выберите другое." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Введите имя чата для соединения" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "О Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Настройки" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Не удалось добавить сервер: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Переключение на локальное ядро отключит вас от текущего!\nПродолжить?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Смена ядра в сети отключит вас от текущего!\nПродолжить?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "День изменился, был {0} стал {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "День изменился на {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Неверное выражение фильтра: '{0}'. Причина: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Вы хотите удалить выбранный фильтр?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Протокол и сервер" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Тип чата" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Нормальный" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Событие" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Тип" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Шаблон" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Активен режим узкого канала: сообщения не синхронизированы." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Строка _меню" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Получение списка пользователей на {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "готово." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Соединиться повторно" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "Закрытие окна протокола прервет все разговоры по этому протоколу.\nВы действительно хотите это сделать?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Вы хотите удалить выбранный сервер?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Не удалось отредактировать сервер:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Поиск" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Искать:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "С _учетом регистра" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "На_зад" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Во _всем тексте" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "_Регулярные выражения" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Поиск конференций" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Название:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Присоединиться" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Сервер" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Разговор" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Ядро" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Вид" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "Спр_авка" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Соединение" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Открыть _журнал" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "Настройки" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "Выход" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "П_одключение" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "Добавить" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Управление" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Открыть / подключиться к чату" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "Найти _конференцию" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "У_брать метки активности" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "С_ледующий" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Пре_дыдущий" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "Закрыть" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Локальное ядро" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Добавить ядро в сети" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Переключить далёкое ядро" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Режим _выделения" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Режим _обзора" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Показать строку состояния" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "Полноэкранный режим" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "О программе" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Найти групповой чат" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "Вебсайт" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Показать панель инструментов" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - соединение" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - параметры" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Никнеймы:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Вкладки" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Положение списка собеседников " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Канал " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Фильтры канала" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Пользовательские фильтры" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Использовать _туннелирование SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "Использовать SSH для данного соединения. Это слегка снижает производительность, но обеспечивает безопасность и позволяет соединяться через NAT и брандмауэры." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "_Сервер SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "Имя или адрес, а так же порт сервера SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Порт:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "IP адрес или DNS-имя и порт Smuxi-сервера" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Адрес Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_Имя пользователя SSH Username: (необязательно)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "Логин для соединения с SSH-сервером" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "П_ароль SSH: (необязательно)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "Пароль для соединения с SSH-сервером. Если используется авторизация по ключам SSH, пароль не требуется (см. ниже)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "Имя файла с ключами SSH (не обязательно):" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Укажите путь до файла" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "Файл с закрытым ключем для SSH, который будет использован при подключении к SSH-серверу" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "И_мя пользователя:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "Логин, который будет использован при подключении к Smuxi-серверу" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Пароль:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Пароль пользователя" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "Про_верка пароля:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Введите пароль еще раз для проверки" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "Добро пожаловать в мастер настройки ядра Smuxi.\nПеред его использованием потребуется указать некоторые сведения.\n\nЩелкните \"Вперёд\"." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Название ядра:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Название профиля для нового ядра" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "По _умолчанию:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Использовать как ядро по умолчанию" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "Использовать данное ядро по умолчанию при следующем запуске Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Выбор разговора" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Тип:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Сервер:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "С_еть:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Никнейм:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "П_ротокол:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Использовать _шифрование" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Проверять сертификат сервера" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "П_ри подключении:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "И_гнорировать команды" smuxi-1.1/po-Frontend-GNOME/lt.po0000664000175000017500000013701614011526464017350 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # aurisc4 , 2018 # Moo, 2014-2016 # Aurimas Černius , 2021. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2020-09-04 11:27+0000\n" "PO-Revision-Date: 2021-01-05 13:04+0200\n" "Last-Translator: Aurimas Černius \n" "Language-Team: Lietuvių \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2)\n" "X-Generator: Gtranslator 3.38.0\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi Nuostatos" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Naudojamas slapyvardis. Galite nurodyti papildomus slapyvardžius, " "(atskirdami juos tarpais) kurie bus naudojami kaip atsarginiai variantai, " "kuomet pirmasis pasirinkimas nebus prieinamas. Pagal numatymą $nick_ ir " "$nick__ bus naudojami kaip atsarginiai variantai." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Slapyvardis(-iai):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Vartotojo vardas:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Tikras vardas:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Koduotė:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Automatiškai konvertuoti UTF-8 simbolius" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Bendra" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tipas:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Kompiuteris:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Slaptažodis:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Prievadas:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Rodyti Slaptažodį" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Tinklo Įgaliotasis Serveris" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Komandos, prisijungus:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Komandos, paleidus programą:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globalios Komandos" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "R_yšys" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Laiko Žymos Formatas:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Buferio Eilutės:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Modulio Buferio Eilutės:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = sekundės\n" "mm = minutės\n" "hh = valandos (01 - 12)\n" "HH = valandos (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = diena\n" "MM = mėnuo\n" "yy/yyyy = metai" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Ilgalaikiškumo Tipas:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Neišliekamo Buferio Eilutės:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Ilgalaikio Buferio Eilutės:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Pranešimų Buferis" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Panaikinti Spalvas" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Panaikinti Formatavimus" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Panaikinti UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Rodyti Išplėstinius Nustatymus" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Išplėstiniai" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Bendra" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Viršus" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Apačia" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Kairė" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Dešinė" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nėra" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Kortelių Vieta " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Paryškinimas" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Veikla" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Jokios Veiklos" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Prisijungti/Palikti/Veiksena" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Kortelių Spalvos " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Automatiškai perjungti į naujai atidarytus asmeninius pokalbius" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Automatiškai perjungti į naujai atidarytus grupės pokalbius" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Medis" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Užbaigimo Simbolis:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Komandos Simbolis:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Komandų Istorijos Dydis:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash Stiliaus Užbaigimas" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Įrašo Laukas " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Įvestis" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Slapyvardžio Spalvos" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Asmenų Sąrašo Vieta " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Nustelbiamas" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Šriftas " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Temos Vieta " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Priekinis planas" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Fonas" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Spalva " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Laužymo Veiksena:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Pokalbis " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Paryškinti žodžius:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Pyptelėti paryškinimo metu" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Paryškinimas " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Išvestis" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Įjungti" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Rodyti visada" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Rodyti, kai langas yra sumažintas" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Rodyti, kai langas yra uždarytas" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Pranešimų Srities Piktograma " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Rodyti Smuxi pranešimų meniu" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Pranešimų Meniu" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Rodyti iškilančius pranešimų langus" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Iškilantys Pranešimų Langai" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Pranešimas" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Sąsaja" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Serveriai" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtrai" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Įjungta" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Protokoluoti Filtruotus Pranešimus" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Protokolavimas" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC Pokalbis" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi IRC Kliento Programa" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Kalbėkite su kitais žmonėmis per IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "pokalbiai;susirašinėjimai;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;" "jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Kalbėkite su kitais žmonėmis per IRC, Twitter, Jabber ir Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi yra atviro kodo, platinama ir patogi pokalbių kliento programa, skirta " "IRC, Twitter, Jabber/XMPP, Campfire ir SignalR JabbR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Įkvėpta screen ir irssi kombinacijos, Smuxi turi atskiriamą serverį (arba " "tokią kaip \"normalią\" kliento programą), kuris, jums nesant, išlieka " "prisijungęs ir leidžia prisijungti ir likti sinchronizuotoms kelioms " "naudotojo sąsajoms. Tai yra panašu kaip screen+irssi arba IRC bouncers, tik " "yra elegantiškiau ir galingiau." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Pagrindinis langas, rodantis IRC kanalą" #: ../src/Frontend-GNOME/AboutDialog.cs:71 msgid "translator-credits" msgstr "Moo" #: ../src/Frontend-GNOME/AboutDialog.cs:84 msgid "Smuxi Website" msgstr "Smuxi Tinklalapis" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Ups, Aš ir vėl tai padariau..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi užstrigo, nes buvo išmesta neapdorota išimtis!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Čia yra dėklo pėdsakas, prašome pranešti apie šią klaidą!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "P_ranešti Apie Klaidą" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Modulis nerastas." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Modulių Tvarkytuvė" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Pasirinkite prie kurio Smuxi modulio norite prisijungti" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Modulis:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Naudoti Žemos Siuntimo Spartos Veikseną" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Vietinis modulis" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Prašome pasirinkti modulį!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Jūsų vartotojo sąsaja nesuderinama su moduliu!\n" "Modulio Versija: {0} Vartotojo Sąsajos Versija: {1}\n" "Modulio Protokolas: {2} Vartotojo Sąsajos Protokolas: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Jungiantis prie modulio, įvyko klaida!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Modulio URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Klaida: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Ar tikrai norite ištrinti modulį \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Jūs bandote įdėti {0} eilutes. Ar norite tęsti?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Vartotojo sąsajos Komandos" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Įjungti derinimo išvestį" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Rodyti šią pagalbą" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Parametrai:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Prisijungti prie modulio" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Atveria nurodytą nuorodą programoje Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Pradeda naują Smuxi egzempliorių ir nepaiso jau esančio" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Nuoroda perduodama jau vykdomui Smuxi egzemplioriui..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Į priekinį planą perkeliamas jau vykdomas Smuxi egzempliorius..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Vartotojų" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Atleiskite, dar neįgyvendinta!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Pavadinimas" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Tema" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Grupės pokalbių paieška be filtro yra nerekomenduojama. Tai gali šiek tiek " "užtrukti arba visai nesuveikti.\n" "Ar norite tęsti?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Klaida, gaunant grupės pokalbių sąrašą iš serverio." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Atsijungta nuo modulio." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Iš naujo jungiamasi prie modulio... (bandymas {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Priežastis: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Buvo aptikta lemtinga klaida dėl protokolo nesuderinamumo su smuxi-server!\n" "\n" "Įdiekite Mono kliento pusėje, kad sutaptų su smuxi-server.\n" "\n" "Daugiau informacijos apie šią problemą galite rasti čia:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Vartotojo sąsaja prarado ryšį su serveriu.\n" "Ar norite jungtis iš naujo dabar?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Jungimasis iš naujo prie serverio nepavyko.\n" "Ar norite bandyti dar kartą?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Serveris prarado ryši su vartotojo sąsaja.\n" "Ar norite jungtis iš naujo dabar?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Rodyti" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protokolas" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Kompiuterio vardas" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Nepavyko įkelti serverio:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Asmuo / Privatus" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grupė / Viešas" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Modulių Pagelbiklis - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Pridėti Smuxi Modulį" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Redaguoti Smuxi modulį" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Ryšys" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Kredencialai" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Dabar galite naudoti Smuxi modulį" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Ačiū" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Modulis tokiu pavadinimu jau yra! Prašome nurodyti kitą pavadinimą." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Įveskite prie kurio pokalbio jungtis" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:155 msgid "About Smuxi" msgstr "Apie Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:159 msgid "Preferences" msgstr "Nuostatos" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:276 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Neįmanoma pridėti serverio:" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:401 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Persijungimas į vietinį modulį, atjungs jus nuo dabartinio modulio!\n" "Ar tikrai norite tai padaryti?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:445 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Persijungimas į nuotolinį modulį, atjungs jus nuo dabartinio modulio!\n" "Ar tikrai norite tai padaryti?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Diena pasikeitė iš {0} į {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Diena pasikeitė į {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Neteisingas filtro reguliarusis reiškinys: '{0}'. Priežastis: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Jūs tikri, kad norite ištrinti pasirinktą filtrą?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 #| msgid "Network:" msgid "Network" msgstr "Tinklas" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokolas / Serveris" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Pokalbio Tipas" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normalus" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Įvykis" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Tipas" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Šablonas" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Nėra Įgaliotojo Serverio" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Pagal Sistemos Numatymą" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Įrašyti" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 #| msgid "_Add" msgid "Add" msgstr "Pridėti" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Nepalaikoma" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" "Žemos Spartos Veiksena yra aktyvi: nebuvo sinchronizuota jokių pranešimų." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Rodyti _Meniu Juostą" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Gaunamas vartotojų sąrašas kanalui {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "užbaigta." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Jungtis iš naujo" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Uždarius protokolo pokalbį, bus uždaryti ir visi atverti, prie šio protokolo " "prijungti, pokalbiai!\n" "Ar tikrai norite tai padaryti?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Jūs tikri, kad norite ištrinti pasirinktą serverį?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Neįmanoma redaguoti serverio:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Rasti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Ieškoti:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Skirti didžiąsias ir _mažąsias raides" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Ieškoti _Pradžios Link" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Prasukinėti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Naudoti _Reguliarias Išraiškas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Rasti Grupės Pokalbį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "Pavadi_nimas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Prisijungti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "S_erveris" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "P_okalbiai" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Modulis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Rodinys" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Pagalba" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Jungtis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Atidaryti Žurnalą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Nuostatos" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Baigti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Prisijungti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "P_ridėti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Tvarkyti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Atidaryti / Prisijungti prie Pokalbio" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Rasti Grupės Pokalbį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Išva_lyti Visą Veiklą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Kitas Pokalbis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "A_nkstesnis Pokalbis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Uždaryti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Naudoti Vietinį Modulį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Pridėti Nuotolinį Modulį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Perjungti Nuotolinį Modulį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Ž_ymeklio Veiksena" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Naršymo Veiksena" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Rodyti Bū_senos Juostą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Visas Ekranas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Apie" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Rasti Grupės Pokalbį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Tinklalapis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Rodyti Į_rankių Juostą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Jungtis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Nuostatos" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Slapyvardžiai:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Kortelės" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Vartotojų Sąrašo Vieta " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanalas " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanalo Filtrai" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Vartotojo Filtrai" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Naudoti _SSH Tunelį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Įjungia ryšiui SSH naudojimą. Tai truputį sumažina " "greitį, tačiau yra saugiau ir yra reikalaujama, naudojant NAT ar prievadais " "pagrįstas užkardas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH S_erveris:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "SSH serverio DNS arba IP adresas ir prievadas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Prievadas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "Smuxi serverio DNS arba IP adresas ir prievadas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi Serveris:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "_SSH Vartotojo vardas: (nebūtina)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Vartotojo vardas, kuris bus naudojamas prisijungimui į " "SSH serverį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "_SSH Slaptažodis: (nebūtina)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Slaptažodis, kuris bus naudojamas, prisijungimui prie " "SSH serverio. Slaptažodis nėra būtinas jei naudojamas SSH prieigos teisės " "raktas (žr. žemiau)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_SSH Rakto failas: (nebūtina)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Pasirinkti failą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "SSH privatus rakto failas, kuris bus naudojamas " "prisijungimui prie SSH serverio" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Vartotojo vardas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Vartotojo vardas, kuris bus naudojamas prisijungimui " "prie Smuxi serverio" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "Sla_ptažodis:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Vartotojo slaptažodis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Patvirtinkite Slaptažodį:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Pakartokite slaptažodį, kad patvirtinti" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Sveiki atvykę į Smuxi Modulių Konfigūracijos Pagelbiklį.\n" "Prieš tai, kuomet galėsite naudotis varikliuku, turite įvesti kai kurią " "informaciją.\n" "\n" "Norėdami pradėti, spustelėkite \"Pirmyn\"." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Modulio Pavadinimas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Naujo modulio profilio pavadinimas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Numatytasis modulis:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Naudoti kaip naująjį numatytąjį modulį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Jei įjungta, kitą kartą paleidus Smuxi, dabartinis " "modulis taps numatytuoju" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Atidaryti Pokalbį" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tipas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Serveris" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Serveris:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "Ti_nklas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Slapyvardis:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokolas:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Paleidus programa, automatiškai jungtis prie serverio" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Naudoti Šifravimą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Tikrinti Serverio Sertifikatą" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "K_omandos, prisijungus:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Nepaisyti Komandų" #~ msgid "Protocol:" #~ msgstr "Protokolas:" #~ msgid "Hostname:" #~ msgstr "Kompiuterio vardas:" #~ msgid "Character" #~ msgstr "Simbolis" #~ msgid "Word" #~ msgstr "Žodis" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues and is " #~ "the recommended setting." #~ msgstr "" #~ "Šis nustatymas nurodo ar Smuxi turėtų laikyti pokalbių pranešimus " #~ "atmintyje (neišliekamas) ar diske (ilgalaikis).\n" #~ "Ilgalaikiam laikymui galite rinktis tarp Db4o, objektinės duomenų bazės " #~ "arba SQLite, sąryšinės duomenų bazės.\n" #~ "Db4o vidinė pusė turi žinomų problemų, tokių kaip didelis atminties ir " #~ "procesoriaus naudojimas, ir gali sąlygoti strigtis, todėl ji yra " #~ "pasenusi.\n" #~ "SQLite vidinė pusė neturi žinomų našumo ar stabilumo problemų ir yra " #~ "rekomenduojamas nustatymas." #~ msgid "Persistent: SQLite (Recommended)" #~ msgstr "Ilgalaikis: SQLite (Rekomenduojamas)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Ilgalaikis: Db4o (Pasenęs)" #~ msgid "Persistent (Preview)" #~ msgstr "Ilgalaikis (Peržiūra)" #~ msgid "Volatile" #~ msgstr "Neišliekamas" #~ msgid "Interface" #~ msgstr "Sąsaja" #~ msgid "Servers" #~ msgstr "Serveriai" #~ msgid "Filters" #~ msgstr "Filtrai" #~ msgid "Logging" #~ msgstr "Derinimas" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Slapyvardžio(-ių) laukas negali būti tuščias." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "" #~ "Neteisingas paryškinimo reguliarusis reiškinys: '{0}'. Priežastis: {1}" smuxi-1.1/po-Frontend-GNOME/POTFILES.in0000664000175000017500000000434314011526464020142 0ustar00meebeymeebey00000000000000glade/smuxi-frontend-gnome.glade src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in src/Frontend-GNOME/AboutDialog.cs src/Frontend-GNOME/CrashDialog.cs src/Frontend-GNOME/EngineManagerDialog.cs src/Frontend-GNOME/Entry.cs src/Frontend-GNOME/GnomeUI.cs src/Frontend-GNOME/Main.cs src/Frontend-GNOME/MainWindow.cs src/Frontend-GNOME/NotImplementedMessageDialog.cs src/Frontend-GNOME/FindGroupChatDialog.cs src/Frontend-GNOME/Frontend.cs src/Frontend-GNOME/Notebook.cs src/Frontend-GNOME/NotifyManager.cs src/Frontend-GNOME/QuickConnectDialog.cs src/Frontend-GNOME/ChatTypeWidget.cs src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs src/Frontend-GNOME/Views/JoinWidget.cs src/Frontend-GNOME/Views/MenuWidget.cs src/Frontend-GNOME/Views/MessageTextView.cs src/Frontend-GNOME/Views/FilterListWidget.cs src/Frontend-GNOME/Views/PreferencesDialog.cs src/Frontend-GNOME/Views/ServerDialog.cs src/Frontend-GNOME/Views/ServerWidget.cs src/Frontend-GNOME/Views/Chats/ChatView.cs src/Frontend-GNOME/Views/Chats/GroupChatView.cs src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs src/Frontend-GNOME/Preferences/ServerListView.cs src/Frontend-GNOME/Interfaces/PreferencesDialog2.ui src/Frontend-GNOME/Interfaces/ServerListWidget.ui src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FilterListWidget.cs smuxi-1.1/po-Frontend-GNOME/POTFILES.skip0000664000175000017500000000052014011526464020473 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Frontend/ src/Frontend-GNOME/obj/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Server/ lib/ smuxi-1.1/po-Frontend-GNOME/te.po0000664000175000017500000011361414011526464017337 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # ప్రవీణ్ ఇళ్ళ , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:04+0100\n" "PO-Revision-Date: 2013-12-12 04:44+0000\n" "Last-Translator: ప్రవీణ్ ఇళ్ళ \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "వాడుకరిపేరు:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 msgid "Realname:" msgstr "అసలుపేరు:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "సాధారణం" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "రకం:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "సంకేతపదం:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "పోర్టు:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:170 msgid "Show Password" msgstr "సంకేతపదాన్ని చూపించు" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "నెట్వర్క్ ప్రాక్సీ" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Global Commands" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "ఉన్నత అమరికలను చూపించు" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "ఉన్నతం" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "సాధారణం" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "కింద" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " ట్యాబుల స్థానం " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "కలాపం" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " ట్యాబు రంగులు " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " ప్రవేశిక క్షేత్రం " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " వ్యక్తి జాబితా స్థానం " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " ఖతి " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " విషయపు స్థానం " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "నేపథ్యం" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " రంగు " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr "సంభాషణ" #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " ఉద్దీపనం " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "చేతనించు" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "ఎల్లప్పుడూ చూపించు" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " గమనిక ప్రాంత ప్రతీక " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:209 msgid "Automatically connect to server at startup" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "ప్రతినిధి:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 msgid "Smuxi" msgstr "స్మక్సి" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Praveen Illa , 2013" #: ../src/Frontend-GNOME/AboutDialog.cs:73 msgid "Smuxi Website" msgstr "స్మక్సి జాలగూడు" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:66 msgid "Engine not found." msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:81 msgid "Engine Manager" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:100 msgid "Select which Smuxi engine you want to connect to" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:106 msgid "Engine:" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:117 msgid "Use Low Bandwidth Mode" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:141 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:201 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:383 msgid "Local Engine" msgstr "స్థానిక యంత్రం" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:193 msgid "Please select an engine!" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:219 #, csharp-format msgid "Your frontend version ({0}) does not match the engine version ({1})!" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 msgid "An error occurred while connecting to the engine!" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:247 #, csharp-format msgid "Engine URL: {0}" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:250 #, csharp-format msgid "Error: {0}" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:320 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "" #: ../src/Frontend-GNOME/Entry.cs:484 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:601 msgid "Frontend Commands" msgstr "" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:185 msgid "Character" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:186 msgid "Word" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:203 msgid "Volatile" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:205 msgid "Persistent" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:228 msgid "No Proxy" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:230 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:326 msgid "System Default" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:140 msgid "Connection" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:248 msgid "Interface" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:252 msgid "Servers" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:259 msgid "Filters" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:263 msgid "Logging" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:682 msgid "Nicknames(s) field must not be empty." msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:878 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:106 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:401 msgid "Disconnected from engine." msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:443 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:548 #, csharp-format msgid "Cause: {0}" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:680 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:699 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:1007 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "చూపించు" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "ప్రతినిధి" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "అతిధేయినామం" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:71 msgid "Engine Assistant - Smuxi" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:93 msgid "Add Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:95 msgid "Edit Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:204 msgid "Credentials" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:284 msgid "Now you can use the Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:287 msgid "Thank you" msgstr "ధన్యవాదములు" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:304 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "" #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "స్మక్సి గురించి" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "ప్రాధాన్యతలు" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:251 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:372 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:416 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:288 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:292 #, csharp-format msgid "Day changed to {0}" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "సంభాషణ రకం" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:548 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:792 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:366 msgid "done." msgstr "" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:398 msgid "Person" msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:131 msgid "Reconnect" msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:180 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "పేరు (_N):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "స్మక్సి (_S)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "సంభాషించు (_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "యంత్రం (_E)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "వీక్షణం (_V)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "సహాయం (_H)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "అనుసంధానించు" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "ప్రాధాన్యతలు (_P)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "నిష్క్రమించు (_Q)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "అనుసంధానించు (_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "జతచేయి (_A)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "సంభాషణ తెరువు / చేరు (_O)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "మూసివేయి (_C)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "స్థానిక యంత్రాన్ని వాడు (_U)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "విహారణ రీతి (_B)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "స్థితిపట్టీని చూపించు (_S)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "పూర్తితెర (_F)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "గురించి (_A)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "జాలగూడు (_W)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:129 msgid "_Port:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "ఒక దస్త్రాన్ని ఎంచుకోండి" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:188 msgid "_Username:" msgstr "వాడుకరిపేరు (_U):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:87 msgid "_Password:" msgstr "సంకేతపదం (_P):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "సంకేతపదాన్ని సరిచూడు (_V):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "స్మక్సి - స్వేచ్ఛా సంభాషణ" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "రకం (_T):" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:54 msgid "_Hostname:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:75 msgid "_Network:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:198 msgid "_Protocol:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:222 msgid "Use Encryption" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:234 msgid "Validate Server Certificate" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:254 msgid "_On Connect Commands:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:265 msgid "_Ignore Commands" msgstr "" smuxi-1.1/po-Frontend-GNOME/ca.po0000664000175000017500000013171714011526464017316 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Xavi Ivars , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2017-10-27 14:06+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: Catalan (http://www.transifex.com/meebey/smuxi/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Paràmetres del Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "El sobrenom a utilitzar. Podeu especificar sobrenoms addicionals (separats per comes) a utilitzar alternativament en cas que la primera tria no estigui disponible. Per omissió, s'utilitza $nick_ i $nick__ com a sobrenoms alternatius." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Sobrenom(s):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nom d'usuari:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nom real:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Codificació:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Converteix automàticament els caràcters UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "General" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tipus:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Màquina:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Contrasenya:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Mostra la contrasenya" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Servidor intermediari" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Ordres al connectar:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Ordres a l'inici:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Ordres globals" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Connexió" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format de les marques horàries:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Línies a la memòria intermediària:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Línies a la memòria intermediària del motor:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = segons\nmm = minuts\nhh = hores (01 - 12)\nHH = hores (00 - 23)\ntt = AM/PM\n\ndd = dia\nMM = mes\nyy/yyyy = any" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tipus de persistència" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Línies de la memòria intermèdia volàtil:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Línies de la memòria intermèdia persistent:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Memòria intermèdia de missatges" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Elimina els colors" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Elimina el format" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Elimina caràcters UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Mostra les opcions avançades" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avançat" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "General" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "A dalt" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "A baix" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "A l'esquerra" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "A la dreta" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Enlloc" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Posició de les pestanyes " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Ressaltat" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Activitat" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Sense activitat" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Entra/Surt/Mode" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Colors de les pestanyes " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Canvia automàticament a la finestra de conversa individual acabada d'obrir" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Canvia automàticament a la finestra de conversa de grup acabada d'obrir" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Arbre" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Caràcter de completat:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Caràcter d'ordre:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Mida de l'historial d'ordres:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Completat semblant al del Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Camp d'entrada " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Entrada" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Colors dels sobrenoms" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Posició de la llista de persones " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Sobreescriu" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Tipus de lletra " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Posició del títol " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Primer pla" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Fons" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Color " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Ajustament de línia:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Xat " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Paraules a ressaltar:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Fes un avís sonor en ressaltar una paraula" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Ressaltat " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Sortida" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Habilita" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Sempre visible" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Visible quan la finestra està minimitzada" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Visible quan la finestra està tancada" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Icona a l'àrea de notificació " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Mostra el Smuxi a l'indicador de missatges" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Indicator de missatges" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Mostra notificacions emergents" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Notificacions" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Notificació" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interfície" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servidors" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtres" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Habilitat" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Enregistra els missatges filtrats" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Registre" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Servidor" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Connecta't automàticament al servidor a l'inici" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Protocol:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Xarxa:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Nom de la màquina:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "_Xat a l'IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Client d'IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Xategeu amb altres persones a l'IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi és un client de xat de codi obert, distribuit i intuïtiu per a IRC, Twitter, Jabber/XMPP, Campfir i el JabbR de SignalR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Siegfried-Angel Gevatter Pujals " #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Pàgina web del Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Ups, ho he tornat a fer..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "El Smuxi ha petat perquè s'ha produït una excepció imprevista." #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Aquí teniu el traçat de la pila. Si us plau, informeu d'aquest error!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Informeu d'un error" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "No s'ha trobat el motor." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Gestor de motors" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Trieu a quin motor del Smuxi us voleu connectar" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Utilitza el mode de baix ample de banda." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Motor local" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Trieu un motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "S'ha produït un error al intentar connectar al motor." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL del motor: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Error: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Esteu segur que voleu esborrar el motor «{0}»?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Esteu a punt d'enganxar {0} línies. Voleu continuar?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Ordres del frontal" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Això encara no ha estat implementat." #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Caràcter" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Paraula" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Sense servidor intermediari" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Predeterminat del sistema" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Connexió" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Interfície" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Servidors" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Filtres" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Registre" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Cal indicar un o més sobrenoms." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Expressió regular de ressaltat no vàlida: '{0}'. Motiu: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Nom" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Tema" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "No es recomana cercar sales de xat en grup sense un filtre. Això pot trigar una estona, o pot ser que no funcioni.\nVoleu continuar?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "S'ha produït un error en recuperar la llista de xats en grup del servidor." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Motiu: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "El frontal ha perdut la connexió amb el servidor.\nVoleu tornar a connectar-hi?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "L'intent de reconnexió amb el servidor ha fallat.\nVoleu tornar-ho a intentar?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "El servidor ha perdut la connexió al frontal.\nVoleu tornar a connectar-hi?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Mostra" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protocol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Nom de la màquina" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "No s'ha pogut carregar el servidor:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Persona / Privat" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Grup / Públic" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Assistent de configuració de motors - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Afegeix un motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Edita un motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Credencials" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Ara podeu utilitzar el motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Gràcies" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Ja existeix un motor amb aquest nom! Especifiqueu-ne un altre." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "No s'ha pogut afegir el servidor:" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Si canvieu al motor local us desconnectareu del vostre motor actual!\nEsteu segur que voleu fer això?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Si canvieu el motor remot us desconnectareu del vostre motor actual!\nEsteu segur que voleu fer això?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "El dia ha canviat a {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Expressió regular de filtre no vàlida: '{0}'. Motiu: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Esteu segur que voleu eliminar el filtre seleccionat?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Protocol / Servidor" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Tipus de xat" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Esdeveniment" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "_Tipus" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Patró" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Mostra la barra de _menú" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "S'està obtenint el llistat d'usuari per a {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "fet." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "Si tanqueu la pestanya del protocol es tancaran també totes les sales de xat que en depenen.\nEsteu segur que voleu fer això?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Esteu segur que voleu eliminar el servidor seleccionat?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "No es pot modificar el servidor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Troba" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Cerca:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Sensible a _majúscules" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Cerca cap endarrere" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Torna a començar pel principi en arribar al final" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Utilitza expressions _regulars" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Troba sales de xat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nom:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Xat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Mostra" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Ajuda" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Obre el registre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Connecta" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Gestiona" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Troba sales de xat en grup" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Neteja totes les activitats" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Xat _següent" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "Xat _anterior" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Utilitza el motor local" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Afegeix un motor remot" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Navega amb el _cursor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "Mode d'_exploració" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferències" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Sobrenoms:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Pestanyes" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Posició de la llista d'usuaris " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Sala " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filtres de canal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Filtres d'usuari" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Utilitza un _túnel SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "Habilita l'ús de l'SSH per a la connexió. Això afectarà lleugerament el rendiment, però és més segur i és necessari quan s'utilitza NAT o tallafocs que bloquegin certs ports." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "S_ervidor SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS o adreça IP i port del servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS o adreça IP i port del servidor del Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Servidor _Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "Nom d'usuari de l'SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "Nom d'usuari que s'utilitzarà per iniciar sessió al servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "Contrasenya de l'SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Sobrenom:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "Nom d'usuari que s'utilitzarà per iniciar sessió al servidor del Smuxi." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Contrasenya:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Contrasenya de l'usuari" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Repetiu la contrasenya:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Repetiu la contrasenya per assegurar que l'heu escrita correctament" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "Benvingut a l'assistent de configuració de motors dels Smuxi.\nCal que introduïu una mica d'informació abans de començar a utilitzar el motor. Premeu «Endavant» per a començar." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "Nom del _motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nom per al nou perfil de motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Motor predeterminat:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Utilitza'l com a nou motor predeterminat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "Si marqueu la casella, la propera vegada que inicieu l'Smuxi el motor que esteu configurant s'utilitzarà de forma predeterminada." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Obre un xat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tipus:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Nom de la màquina:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Xarxa:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Utilitza xifratge" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Valida el certificat del servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Ordres al connectar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Ignora les ordres" smuxi-1.1/po-Frontend-GNOME/sv.po0000664000175000017500000013574614011526464017371 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Anders Jonsson , 2016, 2018, 2019 # flugsio , 2011-2012 # flugsio , 2013-2015 # flugsio , 2011, 2012 # Josef Andersson , 2018 # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-03-10 15:15+0000\n" "PO-Revision-Date: 2019-12-25 22:17+0100\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish (http://www.transifex.com/meebey/smuxi/language/sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.4\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Alternativ för Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Smeknamn att använda. Du kan ange flera smeknamn (separerade med mellanslag) " "som ska användas som alternativ om det första valet inte är ledigt. " "Standardalternativ är $nick_ och $nick__." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Smeknamn:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Användarnamn:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Riktigt namn:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kodning:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Konvertera UTF-8-tecken automatiskt" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Allmänt" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Typ:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Värd:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Lösenord:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Visa lösenord" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Nätverksproxy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Kommando vid anslutning:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Kommando vid uppstart:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globala kommandon" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Anslutning" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format för tidsstämpel:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Buffrade rader:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Buffrade rader i motorn:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = sekunder\n" "mm = minuter\n" "hh = timmar (01 - 12)\n" "HH = timmar (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = dag\n" "MM = månad\n" "yy/yyyy = år" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Typ av persistens:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Flyktiga buffertrader:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Beständiga buffertrader:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Meddelande-buffert" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Kasta färger" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Kasta formateringar" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Kasta UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Visa avancerade inställningar" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avancerat" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Allmänt" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Topp" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Botten" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Vänster" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Höger" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Ingen" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Position för flikar " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Notifiera" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivitet" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Ingen aktivitet" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Anslut/Lämna/Användartillstånd" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Flikfärg " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Byt automatiskt till nyligen öppnade personchattar" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Byt automatiskt till nyligen öppnade gruppchattar" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Träd" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Kompletteringstecken:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Kommandotecken:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Antal kommandon i historik:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash-liknande komplettering" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Inmatningsfält " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Indata" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Färg på smeknamn" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Position för personlista " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Åsidosätt" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Typsnitt " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Position för rubrik " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Förgrund" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Bakgrund" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Färg " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Läge för radbrytning:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Chatt " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Ord som orsakar notifiering:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Pip vid notifiering" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Notifiering " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Utdata" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Aktivera" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Visa alltid" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Visa när fönster är minimerat" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Visa när fönster är stängt" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ikon i aviseringsytan " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Visa Smuxi i meddelandemenyn" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Meddelandemeny" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Visa aviseringsmeddelanden" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Aviseringsmeddelanden" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Avisering" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Gränssnitt" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servrar" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filter" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Aktiverad" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Logga filtrerade meddelanden" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Loggning" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC-chatt" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi IRC-klient" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Chatta med andra människor på IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chatt;meddelande;snabbmeddelande;im;gnome;gtk;irc;twitter;facebook;gtalk;" "xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Chatta med andra människor på IRC, Twitter, Jabber och Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi är en öppen-källkod, distribuerad och användarvänlig chattklient för " "IRC, Twitter, Jabber/XMPP, Campfire och SignalR's JabbR." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Inspirerat av kombinationen av screen och irssi har Smuxi en löstagbar " "server (eller som en ”normal” klient) som förblir ansluten då du inte är " "det, och kan låta flera Smuxi-framändar vara anslutna och synkroniserade. " "Detta liknar screen+irssi eller IRC-proxyservrar, men mer elegant och " "kraftfullt." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Huvudfönstret då det visar en IRC-kanal" #: ../src/Frontend-GNOME/AboutDialog.cs:71 msgid "translator-credits" msgstr "" "Martin Bagge \n" "Anders Jonsson \n" "\n" "Skicka synpunkter på översättningen till\n" "." #: ../src/Frontend-GNOME/AboutDialog.cs:84 msgid "Smuxi Website" msgstr "Smuxis webbplats" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oj. Nu gjorde vi sådär igen ja…" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi kraschade på grund av ett ohanterat fel!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Ta med den här utskriften från kraschen i felrapporten!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Rapportera fel" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Motor hittades ej." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Motorhanterare" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Ange vilken Smuximotor du vill ansluta till" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Använd låg bandbreddsläge" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Lokal motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Välj en motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Din framände är inte kompatibel med motorn!\n" "Motorversion: {0} Framändesversion: {1}\n" "Motorprotokoll: {2} Framändesprotokoll: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Ett fel uppstod vid anslutning till motorn!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL till motorn: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Fel: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Är du säker på att du vill radera motorn ”{0}”?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Du kommer att klistra in {0} rader. Vill du fortsätta?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Kommandon för framänden" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Aktivera felsökningsutskrifter" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Visa denna hjälp" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Alternativ:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Anslut till motor" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Öppnar den angivna länken i Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Startar en ny Smuxi-instans och ignorerar en befintlig" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Överför länk till redan körande Smuxi-instans…" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Tar fram redan körande Smuxi-instans till förgrunden…" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Användare" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Ursäkta, detta är inte implementerat än!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Namn" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Rubrik" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Sökning efter gruppchattar utan att använda filter är inte rekommenderat. " "Det kan ta lång tid eller inte fungera alls.\n" "Vill du verkligen fortsätta?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Fel vid hämtning av lista för gruppchattar från servern." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Frånkopplad från motorn." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Återkopplar till motorn… (försök {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Anledning: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Ett ödesdigert fel har identifierats beroende på en inkompatibilitet med " "smuxi-servern!\n" "\n" "Installera Mono på framänden så att den matchar smuxi-servern.\n" "\n" "Detaljer om problemet kan du finna här:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Framänden tappade anslutningen till servern.\n" "Vill du återansluta?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Återanslutningsförsöket fungerade inte.\n" "Vill du försöka igen?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Servern har tappat anslutningen till framänden.\n" "Vill du återansluta?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Visa" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protokoll" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Värdnamn" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Kan inte läsa in server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Person / Privat" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grupp / Publikt" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Motorassistent - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Lägg till Smuxi-motor" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Redigera Smuxi-motor" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Anslutning" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Inloggningsuppgifter" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Nu kan du använda Smuxi-motorn" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Tack" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "En motor med detta namn finns redan. Ange ett annat." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Ange vilken chatt att ansluta till" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:155 msgid "About Smuxi" msgstr "Om Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:159 msgid "Preferences" msgstr "Alternativ" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:276 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Kan inte lägga till server: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:401 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Byte till lokal motor kommer att koppla bort dig från den aktuella motorn!\n" "Är du säker på att du vill göra detta?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:445 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Byte av fjärrmotor kommer att koppla bort dig från den aktuella motorn!\n" "Är du säker på att du vill göra detta?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dag ändrades från {0} till {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Dag ändrades till {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Ogiltigt filtermönster: ”{0}”. Anledning: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Är du säker på att du vill radera det valda filtret?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Nätverk" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokoll / Server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Chatt-typ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Händelse" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Typ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Mönster" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Ingen proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Systemstandard" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Spara" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Lägg till" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Stöds ej" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Låg bandbreddsläge är aktiverat: inga meddelanden synkroniserade." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Visa _menyrad" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Hämtar användarlistan för {0}…" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "klar." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Återanslut" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "När protokollchatten stängs kommer även alla öppna chattar som är anslutna " "till den att stängas!\n" "Är du säker på att du vill göra detta?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Är du säker på att du vill radera den valda servern?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Kan inte redigera server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Sök" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Leta efter:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "S_kiftlägeskänslig" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Sök _bakåt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "Börja _om från början" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Använd _reguljära uttryck" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Hitta gruppchatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Namn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Anslut" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Chatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Visa" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Hjälp" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Anslut" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Öppna logg" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "A_lternativ" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "A_vsluta" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Anslut" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Lägg till" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Hantera" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Öppna / Anslut till chatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Hitta gruppchatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Rensa all aktivitet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Nästa chatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Föregående chatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "S_täng" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Använd lokal motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Lägg till fjärrmotor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Byt fjärrmotor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "_Markörläge" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Visningsläge" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Visa _statusrad" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Helskärm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Om" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Hitta gruppchatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Webbplats" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Visa _verktygsfält" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Anslut" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Egenskaper" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Smeknamn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Flikar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Position för användarlista " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanalfilter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Användarfilter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "_Använd SSH-tunnel" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Aktiverar användning av SSH för anslutningen. Detta kan " "innebära en liten negativ inverkan på hastigheten men är säkrare och krävs " "när NAT eller port-baserade brandväggar används" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SS_H-värd:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "DNS eller IP-adress och port för SSH-servern" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "DNS eller IP-adress och port för Smuxi-servern" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Smuxi-_värd:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "_SSH-användarnamn: (valbart)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Användarnamn som ska användas för att logga in i SSH-" "servern" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "SSH-_lösenord: (valbart)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Lösenord som kommer användas att logga in till SSH-" "servern. Lösenordet är valfritt om SSH-nyckel-auktorisation används (se " "nedan)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_SSH-nyckelfil: (valfri)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Välj en fil" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Privat SSH-nyckelfil att användas för att logga in på " "SSH-servern" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Användarnamn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Användarnamnet som ska användas för att logga in på " "Smuxi-servern" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Lösenord:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Lösenord för användaren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "_Verifiera lösenord:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Upprepa lösenordet för att verifiera det" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Välkommen till inställningsdelen för Smuximotorn.\n" "Du behöver ange lite information innan du kan börja använda motorn.\n" "\n" "Klicka ”Framåt” för att börja." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Motornamn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Profilnamn för den nya motorn" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Standardmotor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Använd som ny standardmotor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Om detta väljs kommer den aktuella motorn att bli " "standardmotor nästa gång Smuxi startas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Öppen chatt" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Typ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Värdnamn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Nätverk:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Smeknamn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "P_rotokoll:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Anslut automatiskt till server vid uppstart" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Använd kryptering" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Validera serverns certifikat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Kommando vid anslutning:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Kommando att _ignorera" #~ msgid "Protocol:" #~ msgstr "Protokoll:" #~ msgid "Hostname:" #~ msgstr "Värdnamn:" #~ msgid "Character" #~ msgstr "Tecken" #~ msgid "Word" #~ msgstr "Ord" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues and is " #~ "the recommended setting." #~ msgstr "" #~ "Denna inställning anger huruvida Smuxi ska lagra chattmeddelanden i minne " #~ "(flyktigt) eller till disk (beständigt).\n" #~ "För beständig lagting kan du välja mellan Db4o, en objektdatabas eller " #~ "SQLite, en relationell databas.\n" #~ "Db4o-bakänden har kända problem som hög minnes- och processoranvändning " #~ "och kan till och med leda till krascher och användning av den avrådes " #~ "därför från.\n" #~ "SQLite-bakänden har inga kända prestanda- eller stabilitetsproblem och är " #~ "den rekommenderade inställningen." #~ msgid "Persistent: SQLite (Recommended)" #~ msgstr "Beständigt: SQLite (Rekommenderad)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Beständigt: Db4o (Föråldrad)" #~ msgid "Persistent (Preview)" #~ msgstr "Beständigt (Förhandsversion)" #~ msgid "Volatile" #~ msgstr "Flyktig" #~ msgid "Interface" #~ msgstr "Gränssnitt" #~ msgid "Servers" #~ msgstr "Servrar" #~ msgid "Filters" #~ msgstr "Filter" #~ msgid "Logging" #~ msgstr "Loggning" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Fältet för smeknamn kan inte lämnas tomt." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Ogiltigt mönster för notifiering: ”{0}”. Anledning: {1}" smuxi-1.1/po-Frontend-GNOME/tr.po0000664000175000017500000013604114011526464017353 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Mirco Bauer , 2012 # zeugma , 2013 # Ş. Uzun , 2014-2015 # Emin Tufan Çetin , 2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-02-01 17:47+0000\n" "PO-Revision-Date: 2019-05-07 09:36+0300\n" "Last-Translator: Emin Tufan Çetin \n" "Language-Team: Türkçe \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Gtranslator 3.32.0\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Smuxi Tercihler" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Kullanılacak takma ad. Ek takma adlar ekleyebilirsiniz (boşlukla ayırarak). " "Bu takma adlar ilk seçim kullanılamadığında yedek olarak kullanılacaktır. " "Varsayılan olarak $takmaad_ ve $takmaad__ yedek olarak kullanılacaktır." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Takma Ad(lar):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Kullanıcı Adı:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Gerçek Ad:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kodlama:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "UTF-8 karakterler kendiliğinden çevrilsin" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Genel" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tür:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Makine:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Parola:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Parolayı Göster" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Vekil Sunucu" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Bağlanma Anı Komutları:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Başlatma Anı Komutları:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Genelgeçer Komutlar" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Bağlantı" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Zaman Kodu Biçimi:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Arabellek Satırları:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Motor Arabellek Satırları:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = saniye\n" "mm = dakika\n" "hh = saat (01 - 12)\n" "HH = saat (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = gün\n" "MM = ay\n" "yy/yyyy = yıl" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Kalıcılık Türü:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Geçici Arabellek Satırları:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Kalıcı Arabellek Satırları:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "İleti Arabelleği" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Renkleri Çıkar" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Biçimlendirmeleri Çıkar" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "UTF-8 Kodlamaları Çıkar" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Gelişmiş Ayarları Göster" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Gelişmiş" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Genel" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Üst" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Alt" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Sol" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Sağ" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Yok" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Sekmeler Konumu " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Vurgulama" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Etkinlik" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Durgunluk" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Katılma/Ayrılma/Mod" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Sekme Renkleri " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Yeni açılan kişi sohbetlerine kendiliğinden geç" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Yeni açılan toplu sohbetlere kendiliğinden geç" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Gezinti Bölmesi" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Tamamlayıcı Simge:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Komut Simgesi:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Komut Geçmişi Boyutu:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bash Tipi Tamamlama" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Girdi Alanı " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Metin Girişi" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Takma Ad Renkleri" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Kişi Listesi Konumu " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Yeni Etkin Ayar" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Yazı Tipi " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Konu Konumu " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Ön plan" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Arka plan" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Renk " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Kaydırma Yöntemi:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Sohbet " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Vurgulanacak sözcükler:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Vurgulamada uyarı sesi" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Vurgulama " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Metin Görünümü" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Etkinleştir" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Sürekli göster" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Pencere simge durumundayken göster" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Pencere kapalıyken göster" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Bildirim Alanı Simgesi " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Smuxi'yi sohbet menüsünde göster" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Sohbet Menüsü" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Bildirim baloncuklarını göster" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Bildirim Baloncukları" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Bildirim" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Arayüz" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Sunucular" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "Sü_zgeçler" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Etkin" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Süzülen İletileri Günlüğe Kaydet" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Günlük Tutma" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC Sohbet" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi IRC İstemci" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "IRC'de başkalarıyla sohbet et" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "chat;mesajlaşma;anında mesajlaşma;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;" "jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "IRC, Twitter, Jabber ve Campfire'da diğer kişilerle sohbet et" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi; IRC, Twitter, Jabber/XMPP, Campfire ve SignalR JabbR için açık " "kaynaklı, dağıtılmış ve kullanımı kolay bir sohbet istemcisidir." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Screen ve irssi kombinasyonundan esinlenerek, Smuxi, siz bağlı değilken " "bağlı kalan, birden çok ön ucun bağlı ve senkronize kalmasına olanak veren " "ayrılabilir sunucuya (\"normal\" bir istemci benzeri) sahiptir. Bu screen" "+irssi ya da IRC bouncer yazılımlarına benzerdir, ancak daha zarif ve " "güçlüdür." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Bir IRC kanalını gösteren ana pencere" #: ../src/Frontend-GNOME/AboutDialog.cs:71 msgid "translator-credits" msgstr "" "Umut Albayrak \n" "Ş. Uzun" #: ../src/Frontend-GNOME/AboutDialog.cs:84 msgid "Smuxi Website" msgstr "Smuxi İnternet Sitesi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Hata..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi öngörülmemiş bir durumla karşılaştığı için çöktü!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Hataya ilişkin rapor buradadır. Lütfen bu hatayı bildirin!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "Hata _Bildir" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Motor bulunamadı." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Motor Yöneticisi" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Bağlanmak istediğiniz Smuxi motorunu seçin" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Düşük Bant Genişliği Modunu Kullan" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Yerel Motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Bir motor seçin!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Ön ucunuz motor ile uyumlu değil!\n" "Motor Sürümü: {0} Ön uç Sürümü: {1}\n" "Motor Protokolü: {2} Ön uç Protokolü: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Motora bağlanırken bir hata oluştu!!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Motor bağlantısı: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Hata: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "\"{0}\" motorunu silmek istediğinize emin misiniz?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "{0} satır yapıştıracaksınız. Devam etmek istiyor musunuz?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Ön uç Komutları" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Hata ayıklama çıktısını etkinleştir" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Bu yardımı göster" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Tercihler:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Motora bağlan" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Belirtilen bağlantıyı Smuxi içinde açar" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Yeni bir Smuxi süreci başlatır ve varolan süreci yok sayar" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Çalışmakta olan Smuxi sürecine bağlantı gönderiliyor..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Çalışmakta olan Smuxi süreci ön plana getiriliyor..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Kullanıcı" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Üzgünüz. Henüz eklenmedi!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Ad" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Konu" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Süzgeçsiz bir şekilde toplu sohbet araması yapmak önerilmemektedir. Bu " "biraz zaman alabilir ya da hiç işe yaramayabilir.\n" "Devam etmek istiyor musunuz?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Sunucudan toplu sohbet listesi getirilirken hata oluştu." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Motor ile bağlantı kesildi." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Motora yeniden bağlanılıyor... ({0}. girişim)" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Neden: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Smuxi-server ile iletişim kuralı uyuşmazlığı nedeniyle hata algılandı!\n" "\n" "Lütfen Mono'yu ön uça kurun, böylece smuxi-server ile eşleşir.\n" "\n" "Bu konuda ayrıntılı bilgiyi şurada bulabilirsiniz:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Ön ucun sunucuyla bağlantısı koptu.\n" "Şimdi yeniden bağlanmak istiyor musunuz?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Sunucuya yeniden bağlantı başarısız oldu.\n" "Yeniden denemek istiyor musunuz?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Sunucunun ön uçla bağlantısı koptu.\n" "Şimdi yeniden bağlanmak istiyor musunuz?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Göster" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "İletişim Kuralı" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Makine Adı" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Sunucu yüklenemedi: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Kişi / Özel" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Toplu / Genel" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Motor Yardımcısı - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Smuxi Motoru Ekle" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Smuxi Motoru Düzenle" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Bağlantı" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Kimlik Bilgileri" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Şimdi Smuxi Motorunu kullanabilirsiniz" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Teşekkürler" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Bu ad ile bir motor zaten var! Lütfen başka bir ad belirtin." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Katılmak istediğiniz sohbeti girin" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:155 msgid "About Smuxi" msgstr "Smuxi Hakkında" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:159 msgid "Preferences" msgstr "Tercihler" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:276 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Sunucu eklenemedi: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:401 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Yerel motora geçmek geçerli motorla bağlantınızı kesecek!\n" "Bunu yapmak istediğinize emin misiniz?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:445 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Uzak motoru değiştirmek geçerli motorla bağlantınızı kesecek!\n" "Bunu yapmak istediğinize emin misiniz?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "{0} gününden {1} gününe geçildi" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "{0} gününe geçildi" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Geçersiz süzgeç düzenli ifadesi: '{0}'. Neden: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Seçili süzgeci silmek istediğinize emin misiniz?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 msgid "Network" msgstr "Ağ" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protokol / Sunucu" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Sohbet Türü" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Olay" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Tür" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Kalıp" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Vekil Sunucu Yok" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Sistem Varsayılanı" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Kaydet" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 msgid "Add" msgstr "Ekle" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Desteklenmeyen" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Düşük Bant Genişliği Modu etkin: hiçbir mesaj eşitlenmedi." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Men_ü Çubuğunu Göster" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "{0} için kullanıcı listesi alınıyor..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "bitti." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Yeniden Bağlan" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Protokol sohbetini kapatmak ona bağlı tüm açık sohbetleri de kapatacak!\n" "Bunu yapmak istediğinize emin misiniz?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Seçili sunucuyu silmek istediğinize emin misiniz?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Sunucu düzenlenemedi: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Bul" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "A_ra:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Büyük/Küçük Harf E_şleştir" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Geriye Do_ğru Ara" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Çevrele" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "_Düzenli İfade Kullan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Toplu Sohbet Bul" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Ad:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Katıl" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Sunucu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "S_ohbet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Görünüm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Yardım" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Bağlan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Günlüğü Aç" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Tercihler" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Çık" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Bağlan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Ekle" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "Y_önet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Sohbet _Aç / Katıl" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "Toplu Sohbet _Bul" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "Tüm Etkinlikleri _Temizle" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "Sonrak_i Sohbet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Önceki Sohbet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "Ka_pat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "Yerel Motor _Kullan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "Uzak Motor _Ekle" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Uzak Motor Değiştir" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "K_lavye Modu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "G_özatma Modu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "D_urum Çubuğunu Göster" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Tam Ekran" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Hakkında" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Toplu Sohbet Bul" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Web Sitesi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Ara_ç Çubuğunu Göster" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Bağlan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Tercihler" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Takma Adlar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Sekmeler" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Kullanıcı Listesi Konumu " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanal Süzgeçleri" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Kullanıcı Süzgeçleri" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "SSH Tüneli _Kullan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Bağlantı için SSH kullanımını etkinleştirir. Bunun " "performansa küçük bir etkisi olur ama hem daha güvenlidir hem de NAT ya da " "port tabanlı güvenlik duvarı kullanırken gereklidir." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH _Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "" "SSH sunucusuna ait DNS ya da IP adresi ve port" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "Por_t:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "Smuxi sunucusuna ait DNS ya da IP adresi ve port" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "Smu_xi Host:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "SSH _Kullanıcı Adı: (isteğe bağlı)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "SSH sunucusunda oturum açmak için kullanılacak " "kullanıcı adı" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "SSH P_arolası: (isteğe bağlı)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "SSH sunucusunda oturum açmak için kullanılacak parola. " "SSH anahtar onayı kullanıldıysa parola isteğe bağlıdır (aşağıya bakınız)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "SSH A_nahtar Dosyası: (İsteğe bağlı)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Bir Dosya Seçin" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "SSH sunucusunda oturum açmak için kullanılacak kişiye " "özel anahtar dosyası." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "K_ullanıcı Adı:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Smuxi sunucusunda oturum açmak için kullanılacak " "kullanıcı adı" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Parola:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Kullanıcı parolası" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "Parolayı _Doğrula:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Doğrulama için parolayı yineleyin" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Smuxi Motor Yapılandırma Yardımcısına hoş geldiniz.\n" "Motoru kullanmadan önce birkaç bilgi girmeniz gerekmektedir.\n" "\n" "Devam etmek için \"İleri\" ye tıklayın." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Motor Adı:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Yeni motorun profil adı" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Varsayılan Motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Yeni varsayılan motor olarak kullan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Etkinleştirildiğinde geçerli motor Smuxi yeniden " "başladığında varsayılan olacaktır" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Sohbet Aç" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "T_ür:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Sunucu" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Makine Adı:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "A_ğ:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Takma Ad:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "P_rotokol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Başlatma anında sunucuya kendiliğinden bağlan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Şifreleme Kullan" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Sunucu Sertifikasını Onayla" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Bağlanma _Anı Komutları:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "Komutları _Yok Say" #~ msgid "Protocol:" #~ msgstr "Protokol:" #~ msgid "Hostname:" #~ msgstr "Host Adı:" #~ msgid "Character" #~ msgstr "Karakter" #~ msgid "Word" #~ msgstr "Sözcük" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues but is " #~ "still an optional preview feature." #~ msgstr "" #~ "Bu ayar Smuxi'nin sohbet mesajlarını bellekte mi (geçici) yoksa diskte mi " #~ "(kalıcı) depolayacağını belirler.\n" #~ "Kalıcı için Db4o, bir nesne veritabanı ya da SQLite, bir ilişkisel " #~ "veritabanı arasında seçim yapabilirsiniz.\n" #~ "Db4o arka ucunun yüksek bellek ve CPU kullanımı gibi bilinen sorunları " #~ "bulunmaktadır ve çökmelere bile yol açabilir, bu yüzden de kullanım " #~ "dışıdır.\n" #~ "SQLite arka ucunun bilinen performans ya da kararlılık sorunları " #~ "bulunmamaktadır ama yine de isteğe bağlı bir önizleme özelliğidir." #~ msgid "Volatile" #~ msgstr "Geçici" #~ msgid "Persistent (Preview)" #~ msgstr "Kalıcı (Önizleme)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Kalıcı: Db4o (Kullanım dışı)" #~ msgid "Persistent: SQLite (Preview)" #~ msgstr "Kalıcı: SQLite (Önizleme)" #~ msgid "Interface" #~ msgstr "Arayüz" #~ msgid "Servers" #~ msgstr "Sunucular" #~ msgid "Filters" #~ msgstr "Süzgeçler" #~ msgid "Logging" #~ msgstr "Günlük Tutma" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Kullanıcı ad(lar)ı alanı boş bırakılamaz." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Geçersiz vurgulama düzenli ifadesi: '{0}'. Neden: {1}" smuxi-1.1/po-Frontend-GNOME/pt_BR.po0000664000175000017500000013635214011526464017741 0ustar00meebeymeebey00000000000000# Brazilian Portuguese translation of smuxi-Frontend-GNOME # Copyright (C) 2019 smuxi-Frontend-GNOME'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi-Frontend-GNOME package. # # Translators: # Leonardo Pires Felix , 2013 # Leonardo Pires Felix , 2013 # Rafael Fontenelle , 2016-2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-02-01 13:37+0000\n" "PO-Revision-Date: 2019-03-10 10:51-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Portuguese - Brazil \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Gtranslator 3.31.90\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Preferências do Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "O apelido a ser usado. Você pode especificar vários apelidos (separados por " "espaços) que serão usados quando o apelido não estiver disponível. Por " "padrão $nick_ e $nick__ serão usados em caso de erros." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Apelido(s):" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Nome de usuário:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Nome real:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Codificação:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Converter automaticamente caracteres UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Geral" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Tipo:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Servidor:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Senha:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Porta:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Mostrar senha" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Proxy de rede" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Comandos ao conectar:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Comandos ao iniciar:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Comandos globais" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "C_onexão" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Formato da marca de tempo:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Linhas de buffer:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Linhas de Buffer do motor:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = segundos\n" "mm = minutos\n" "hh = horas(01-12)\n" "HH = horas(00-23)\n" "tt = AM/PM\n" "\n" "dd = dia\n" "MM = mês\n" "yy/yyyy = ano" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Tipo persistente:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Linhas de buffer volátil:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Linhas de buffer persistente:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Buffer de mensagem" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Tirar cores" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Tirar formatações" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Tirar UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Mostrar configurações avançadas" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avançado" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Geral" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Topo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Fundo" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Esquerda" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Direita" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Nenhuma" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Posição das abas " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Realçar" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Atividade" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Sem atividade" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Join/Part/Mode" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Cores das abas " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Alternar automaticamente para novos bate-papos com pessoas" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Alternar automaticamente para novos grupo de bate-papos" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Árvore" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Completar caractere:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Caractere comando:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Tamanho do histórico do comando:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Completar estilo Bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Campo de entrada " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Entrada" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Cores do apelido" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Posição da lista de pessoas " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Sobrescrever" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Fonte " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Posição do tópico " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Primeiro plano" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Plano de fundo" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Cor " #. This is a setting for character based line wrapping vs word based when showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Modo de quebra:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Bate-papo " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Palavras para realçar:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Som ao realçar" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Realce " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Saída" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Habilitar" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Mostrar sempre" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Mostrar quando janela for minimizada" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Mostrar quando janela for fechada" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ícone da área de notificação " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Mostrar Smuxi no menu de mensagens" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr " Menu de mensagens " #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Mostrar janelas de notificação" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr " Janelas de notificação " #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Notificação" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Interface" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servidores" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtros" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Habilitado" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Mensagens de log filtradas" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Logging" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "Bate-papo IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Cliente IRC Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Converse com outras pessoas no IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;" "jabbr;" msgstr "" "bate-papo;chat;mensagem;;instantânea;messaging;im;gnome;gtk;irc;twitter;" "facebook;gtalk;xmpp;jabber;campfire;jabbr;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Converse com outras pessoas no IRC, Twitter, Jabber e Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" "Smuxi é um cliente de bate-papo código aberto, distribuído e amigável para " "IRC, Twitter, Jabber/XMPP, Campfire e JabbR (com SignalR)." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" "Inspirado pela combinação de screen e irssi, Smuxi possui um servidor " "desvinculável (ou como um cliente \"normal\") que fica conectado quando você " "não está, e pode permitir múltiplos frontends (interface gráfica) do Smuxi " "ficarem conectados e em sincronia. Isso é similar ao screen+irssi ou " "replicadores IRC, porém muitos elegante e poderoso." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "A janela principal mostrando um canal IRC" #: ../src/Frontend-GNOME/AboutDialog.cs:71 msgid "translator-credits" msgstr "" "Leonardopf , 2013\n" "Rafael Fontenelle , 2016" #: ../src/Frontend-GNOME/AboutDialog.cs:84 msgid "Smuxi Website" msgstr "Site do Smuxi" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Vixe, acho que fiz de novo..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi falhou por causa de uma exceção que não foi controlada!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Aqui está o detalhamento do erro. Por favor, relate este problema!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Relatar problema" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Motor não localizado." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Gerenciador de motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Selecione o motor do Smuxi ao qual você deseja se conectar" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Usar modo de conectividade lenta" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Motor local" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Por favor, selecione um motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" "Seu frontend não é compatível com este motor!\n" "Versão do motor: {0} Versão do frontend: {1}\n" "Protocolo do motor: {2} Protocolo do frontend: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "Ocorreu um erro ao conectar ao motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "URL do motor: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Erro: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Tem certeza que deseja excluir o motor \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:492 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Você está colando {0} linhas. Deseja continuar?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:609 msgid "Frontend Commands" msgstr "Comandos do frontend" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Habilita saída de depuração" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Mostra esta ajuda" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Opções:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Conecta ao motor" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Abre o link especificado no Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Inicia uma nova instância do Smuxi e ignora uma existente" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Passando link para uma instância Smuxi já em execução..." #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Trazendo instância Smuxi já em execução para primeiro plano..." #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} usuários" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Desculpe, não implementado ainda!" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:103 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:293 msgid "Name" msgstr "Nome" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Tópico" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may " "take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Pesquisar por grupo de bate-papo sem um filtro não é recomendado. Isso pode " "levar muito tempo ou não funcionar.\n" "Deseja continuar?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Erro ao baixar lista com grupos de chat do servidor." #: ../src/Frontend-GNOME/Frontend.cs:390 msgid "Disconnected from engine." msgstr "Desconectado do motor." #: ../src/Frontend-GNOME/Frontend.cs:433 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Reconectando ao motor... (tentativa {0})" #: ../src/Frontend-GNOME/Frontend.cs:546 #, csharp-format msgid "Cause: {0}" msgstr "Causa: {0}" #: ../src/Frontend-GNOME/Frontend.cs:638 msgid "" "A fatal error has been detected because of a protocol incompatibility with " "the smuxi-server!\n" "\n" "Please install Mono on the frontend side so it matches the smuxi-server.\n" "\n" "More details about this issue can be found here:\n" "https://smuxi.im/issues/show/589" msgstr "" "Um erro fatal foi detectado devido a uma incompatibilidade de protocolo com " "o smuxi-server!\n" "\n" "Por favor, instale o Mono no frontend para que ele corresponda ao do smuxi-" "server.\n" "\n" "Mais detalhes sobre esse problema podem ser encontrados aqui:\n" "https://smuxi.im/issues/show/589" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "O frontend perdeu a conexão com o servidor.\n" "Deseja reconectar agora?" #: ../src/Frontend-GNOME/Frontend.cs:724 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Reconexão ao servidor falhou.\n" "Deseja tentar novamente?" #: ../src/Frontend-GNOME/Frontend.cs:1038 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "O servidor perdeu a conexão com o programa.\n" "Deseja reconectar agora?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Mostrar" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:235 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:79 msgid "Protocol" msgstr "Protocolo" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:80 msgid "Hostname" msgstr "Nome do servidor" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Não foi possível carregar servidor:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:267 msgid "Person / Private" msgstr "Pessoa / Privado" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:268 msgid "Group / Public" msgstr "Grupo / Público" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:67 msgid "Engine Assistant - Smuxi" msgstr "Assistente de motor - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:90 msgid "Add Smuxi Engine" msgstr "Adicionar motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:92 msgid "Edit Smuxi Engine" msgstr "Editar motor Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:137 msgid "Connection" msgstr "Conexão" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:201 msgid "Credentials" msgstr "Credenciais" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:303 msgid "Now you can use the Smuxi Engine" msgstr "Agora você pode usar o motor do Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:306 msgid "Thank you" msgstr "Obrigado" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:323 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Um motor com esse nome já existe! Por favor, especifique outro nome." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Digite qual bate-papo você deseja ingressar" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:155 msgid "About Smuxi" msgstr "Sobre Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:159 msgid "Preferences" msgstr "Preferências" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:276 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:240 msgid "Unable to add server: " msgstr "Não foi possível adicionar servidor: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:401 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Alternar para motor local vai desconectar você do motor atual!\n" "Tem certeza que deseja fazer isso?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:445 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Alternar para motor remoto vai desconectar você do motor atual!\n" "Tem certeza que deseja fazer isso?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:443 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dia alterado de {0} para {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:447 #, csharp-format msgid "Day changed to {0}" msgstr "Dia alterado para {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Expressão regular de filtro inválida: \"{0}\". Motivo: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:199 msgid "Are you sure you want to delete the selected filter?" msgstr "Tem certeza que deseja excluir o filtro selecionado?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:251 #| msgid "Network:" msgid "Network" msgstr "Rede" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:269 msgid "Protocol / Server" msgstr "Protocolo / Servidor" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:276 msgid "Chat Type" msgstr "Tipo de bate-papo" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:309 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:310 msgid "Event" msgstr "Evento" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:317 msgid "Type" msgstr "Tipo" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:342 msgid "Pattern" msgstr "Padrão" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:224 msgid "No Proxy" msgstr "Sem proxy" #: ../src/Frontend-GNOME/Views/PreferencesDialog.cs:226 msgid "System Default" msgstr "Padrão do sistema" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:64 msgid "Save" msgstr "Salvar" #: ../src/Frontend-GNOME/Views/ServerDialog.cs:72 #| msgid "_Add" msgid "Add" msgstr "Adicionar" #: ../src/Frontend-GNOME/Views/ServerWidget.cs:81 msgid "Unsupported" msgstr "Sem suporte" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:562 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" "Modo de conectividade lenta está ativada: nenhuma mensagem sincronizada." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:864 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Mostrar _barra de menu" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Obtendo lista de usuários de {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:337 msgid "done." msgstr "feito." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:130 msgid "Reconnect" msgstr "Reconectar" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:177 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Fechar o bate-papo do protocolo fechará também todos bate-papos abertos " "conectados a ele!\n" "Certeza que deseja fazer isso?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:202 msgid "Are you sure you want to delete the selected server?" msgstr "Tem certeza que deseja excluir o servidor selecionado?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:258 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:292 msgid "Unable to edit server: " msgstr "Não foi possível editar o servidor: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Localizar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Pesquisar por:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "Diferenciar _maiusc./minúsc." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Pesquisar para _trás" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Quebrar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Usar expressão _regular" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Localizar grupo de bate-papo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Nome:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Ingressar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Bate-papo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Ver" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "Aj_uda" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Conectar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Abrir log" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Preferências" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Sair" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Conectar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Adicionar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "Ad_ministrar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "Abrir / ingressar no bate-pap_o" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Localizar grupo de bate-papo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "L_impar todas atividades" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Próximo bate-papo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Bate-papo anterior" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Fechar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Usar motor local" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Adicionar motor remoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Mudar motor remoto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "Modo de _cursor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Modo de navegação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Mostrar _barra de status" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Tela inteira" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Sobre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Localizar grupo de bate-papo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Site" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Mostrar barra de _ferramentas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - Conectar" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Preferências" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Apelidos:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Abas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Posição da lista de usuários " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Canal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr " Filtros de canal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr " Filtros de usuário " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Usar _túnel SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Habilita o uso do SSH para a conexão. Isso representa " "um pequeno impacto no desempenho, mas é mais seguro e é exigido para usar " "NAT ou firewall com restrições de portas" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "Servidor SS_H:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "" "DNS or IP address and port of the SSH server" msgstr "DNS ou endereço IP e porta do servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Porta:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "" "DNS or IP address and port of the Smuxi server" msgstr "" "DNS ou endereço IP e porta do servidor Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Servidor Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:54 msgid "_SSH Username: (optional)" msgstr "Nome de usuário _SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:77 msgid "" "Username which will be used to log into the SSH server" msgstr "" "Nome de usuário que será usado para se autenticar no " "servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:97 msgid "_SSH Password: (optional)" msgstr "_Senha SSH: (opcional)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:121 msgid "" "Password which will be used to log into the SSH server. " "The password is optional if SSH key authorization is used (see below)." msgstr "" "Senha que será usada para se autenticar no servidor " "SSH. A senha é opcional se a autorização de chave SSH for usada (veja mais " "abaixo)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:142 msgid "_SSH Keyfile: (optional)" msgstr "_Arquivo de chave SSH: (opcional)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:150 msgid "Select a File" msgstr "Selecione um arquivo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:163 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "Arquivo de chave SSH privada que será usado para se " "autenticar no servidor SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:183 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Nome de usuário:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:206 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Nome de usuário que será usado para se autenticar no " "servidor Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:226 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Senha:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:250 msgid "Password of the user" msgstr "Senha do usuário" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:270 msgid "_Verify Password:" msgstr "Conf_irmar senha:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:294 msgid "Repeat the password for verification" msgstr "Repita a senha para verificação" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Bem-vindo ao assistente de configuração de motor do Smuxi.\n" "Você precisa inserir algumas informações antes de poder usar o motor.\n" "\n" "Clique \"Avançar\" para começar." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Nome do motor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Nome do perfil do novo motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Motor padrão:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Usar como novo motor padrão" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next " "time Smuxi is started" msgstr "" "Se habilitado, o motor atual será o padrão na próxima " "vez que o Smuxi for iniciado" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Bate-papo aberto" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Tipo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Endereço Servidor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Rede:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Apelido:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protocolo:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Conectar automaticamente ao servidor na inicialização" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Usar criptografia" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Validar certificado do servidor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "_Comandos ao conectar:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Comandos para ignorar" #~ msgid "Protocol:" #~ msgstr "Protocolo:" #~ msgid "Hostname:" #~ msgstr "Servidor:" #~ msgid "Character" #~ msgstr "Caractere" #~ msgid "Word" #~ msgstr "Palavra" #~ msgid "" #~ "This setting specifies if Smuxi should store chat messages in memory " #~ "(volatile) or to disk (persistent).\n" #~ "For persistent you can choose between Db4o, an object database or SQLite, " #~ "a relational database.\n" #~ "The Db4o backend has known issues like high memory and CPU usage and can " #~ "even lead to crashes and thus it is deprecated.\n" #~ "The SQLite backend has no known performance or stability issues and is " #~ "the recommended setting." #~ msgstr "" #~ "Essa configuração especifica se o Smuxi deveria armazenar mensagens de " #~ "bate-papo na memória (volátil) ou no disco (persistente).\n" #~ "Para persistente, você pode escolher entre Db4o, um banco de dados " #~ "orientado a objeto e um banco de dados relacional.\n" #~ "O backend Db4o possui problemas conhecidos, como o alto uso de memória e " #~ "de CPU e pode ainda levar a travamentos e, portanto, é obsoleto.\n" #~ "O backend SQLite não possui problemas de desempenho e estabilidade " #~ "conhecidos e é a configuração recomendada." #~ msgid "Persistent: SQLite (Recommended)" #~ msgstr "Persistente: SQLite (Recomendado)" #~ msgid "Persistent: Db4o (Deprecated)" #~ msgstr "Persistente: Db4o (Obsoleto)" #~ msgid "Persistent (Preview)" #~ msgstr "Persistente (visualização)" #~ msgid "Volatile" #~ msgstr "Volátil" #~ msgid "Interface" #~ msgstr "Interface" #~ msgid "Servers" #~ msgstr "Servidores" #~ msgid "Filters" #~ msgstr "Filtros" #~ msgid "Logging" #~ msgstr "Registrando log" #~ msgid "Nicknames(s) field must not be empty." #~ msgstr "Campo de apelido(s) não pode estar vazio." #~ msgid "Invalid highlight regex: '{0}'. Reason: {1}" #~ msgstr "Expressão regular de realce inválida: \"{0}\". Motivo: {1}" smuxi-1.1/po-Frontend-GNOME/fa.po0000664000175000017500000012634114011526464017316 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Behrooz Amoozad , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2017-10-27 14:06+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: Persian (http://www.transifex.com/meebey/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "تنظیمات Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "نام مستعار, میتوانید نام های مستعار اضافه ای را نیز مشخص کنید(با فاصله از هم جدا کنید) تا در زمانی که انتخاب اول در دسترس نیست استفاده شوند. به صورت پیش فرض $نام_ و $نام__ به عنوان جانشین استفاده خواهند شد." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "نام (های) مستعار:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "نام حقیقی:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "انکودینگ:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "تبدیل خودکار حروف UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr " کلی " #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "نوع:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "میزبان:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "رمز:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "درگاه:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "نمایش رمز" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr " پراکسی شبکه " #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "دستورات زمان اتصال:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "دستورات زمان اجرا:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr " فرامین عمومی " #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "ارتباط" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "قالب زمان:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "نمایش تنظیمات پیشرفته" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "عمومی" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "بالا" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "پایین" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "چپ" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "راست" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "هیچ" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " موقعیت تب ها " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "برجسته کردن" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "فعالیت" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "بدون فعالیت" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "چسبیدن/جدا شدن/حالت" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " رنگ تب ها " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "درخت" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "کاراکتر تکمیل کردن:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "کاراکتر فرمان:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "اندازه تاریخچه دستور:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "تکمیل کردن مانند bash" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " فیلد ورودی " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "ورودی" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "رنگ نام های مستعار" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " موقعیت لیست افراد " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " قلم " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " موقعیت تاپیک " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "رنگ رو" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "رنگ زمینه" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " رنگ " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " چت " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "کلمات برجسته:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " برجسته نمایی " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "خروجی" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "فعال کردن" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "همیشه نمایش بده" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " علامت ناحیه هشدار " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "نمایش smuxi در منو پیام رسانی" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr " منو پیغام رسانی " #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "نمایش کادر های هشدار" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr " کادر های هشدار " #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "هشدار" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "فعال" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "ثبت پیغام های فیلتر شده" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "وصل شدن خودکار به سرویس دهنده هنگام شروع" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "پروتوکل:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "شبکه:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "نام میزبان:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "" #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "موتور یافت نشد" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "استفاده از حالت پهنای باند کم" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "خطا: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "آیا مطمئن هستید که میخواهید موتور {0} را حذف کنید؟" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "شما در جال جایگزاری {0} خط نوشته هستید.آیا میخواهید ادامه دهید؟" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "متاسفیم, هنوز پیاده سازی نشده!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "حرف" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "واژه" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "فرار" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "بدون واسطه" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "ارتباط" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "رابط" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "سرویس دهنده ها" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "فیلتر ها" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "ثبت صورت عملیات" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "خطا در گرفتن لیست چت های گروهی از سرویس دهنده." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "از موتور قطع شد." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "اتصال دوباره به موتور... (کوشش {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "خطا در بارگذاری سرویس دهنده: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "" #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "درباره Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "تنظیمات" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "ناتوان در اضافه کردن سرویس دهنده: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "راه گزینی به موتور محلی باعث میشود که از موتور فعلی قطع شوید!آیا برای اینجام این کار مطمئن هستید؟" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "راه گزینی به موتور دور باعث میشود که از موتور فعلی قطع شوید!آیا برای اینجام این کار مطمئن هستید؟" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "تاریخ از {0} به {1} تغییر کرد." #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "تاریخ به {0} تغییر کرد." #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "آیا مطمئن هستید که میخواهید فیلتر {0} را حذف کنید؟" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "معمولی" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "رویداد" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "نوع" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "طرح" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "حالت پهنای پاند کم فعال است: هیچ پیغامی همگام نشده است." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "نمایش نوار منو" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "در حال به درست آوردن لیست کاربران برای {0}" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "پایان یافت" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "اتصال دوباره" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "مطمئن هستید که میخواهید سرویس دسهنده انتخاب شده رو حذف کنید؟" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "ناتوان در ویرایش سرویس دهنده:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "یافتن" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "جست و جو برای:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "تطابق بزرگی و کوچکی حروف" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "جست و جو از انتها" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "چرخش" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "استفاده از عبارات باقاعده" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - یافتن چت گروهی" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "نام:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "ملحق شدن" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "سرویس دهنده" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "چت" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "موتور" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "نمایش" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "راهنما" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "اتصال" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "باز کردن صورت عملیات" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "تنظیمات" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "خروج" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "اتصال" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "افزودن" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "مدیریت" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "باز کردن / ملحق شدن به چت" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "جست و جوی چت گروهی" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "پاک کردن تمام فعالیتها" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "چت بعدی" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "چت قبلی" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "بستن" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "استفاده از موتور محلی" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "استفاده از موتور دور" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "سبک نشان" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "سبک مرورگر" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "نمایش نوار وضعیت" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "تمام صفحه" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "درباره" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "یافتن چت گروهی" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "وبسایت" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "نمایش نوار ابزار" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi - اتصال" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "نامهای مستعار:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "استفاده از تونل SSH" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "درگاه SSH:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "درگاه:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "میزبان Smuxi:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "نام کاربری SSH: (دلخواه)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "رمزعبور SSH: (دلخواه)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "فایل کلید SSH: (دلخواه)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "یک فایل انتخاب کنید." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "نام کاربری:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "رمز عبور:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "تکرار رمز عبور:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "موتور پیشفرض:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "استفاده به عنوان موتور پیشفرض جدید" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - باز کردن چت" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "نوع:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "نام میزبان:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "شبکه:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "پروتوکل:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "استفاده از رمزنگاری" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "بررسی گواهینامه سرویس دهنده" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "دستورات موقع اتصال" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "چشم پوشی از دستورات" smuxi-1.1/po-Frontend-GNOME/da.po0000664000175000017500000013476114011526464017321 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Alan Mortensen , 2017 # Joe Hansen , 2011-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:42+0200\n" "PO-Revision-Date: 2017-10-27 14:06+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: Danish (http://www.transifex.com/meebey/smuxi/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid "Smuxi Preferences" msgstr "Præferencer for Smuxi" #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "Brugernavnet. Du kan angive yderligere brugernavne (adskilt af mellemrum) som vil blive brugt hvis det første valg ikke er tilgængeligt. Som standard vil $nick_ og $nick__ blive anvendt." #: ../glade/smuxi-frontend-gnome.glade.h:3 msgid "Nickname(s):" msgstr "Brugernavne:" #: ../glade/smuxi-frontend-gnome.glade.h:4 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Brugernavn:" #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:147 msgid "Realname:" msgstr "Navn:" #: ../glade/smuxi-frontend-gnome.glade.h:6 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Kodning:" #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid "Automatically convert UTF-8 characters" msgstr "Konverter automatisk UTF-8-tegn" #: ../glade/smuxi-frontend-gnome.glade.h:8 msgid "General" msgstr "Generelt" #: ../glade/smuxi-frontend-gnome.glade.h:9 msgid "Type:" msgstr "Type:" #: ../glade/smuxi-frontend-gnome.glade.h:10 msgid "Host:" msgstr "Vært:" #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Password:" msgstr "Adgangskode:" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:13 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:224 msgid "Show Password" msgstr "Vis adgangskode" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Network Proxy" msgstr "Netværksproxy" #: ../glade/smuxi-frontend-gnome.glade.h:15 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Ingen tilslutningskommandoer:" #: ../glade/smuxi-frontend-gnome.glade.h:16 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Ingen opstartskommandoer:" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Global Commands" msgstr "Globale kommandoer" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "_Tilslutning" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Tidsstempelformat:" #: ../glade/smuxi-frontend-gnome.glade.h:20 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Mellemlagerlinjer:" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Mellemlagerlinjer for motor:" #: ../glade/smuxi-frontend-gnome.glade.h:22 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "ss = sekunder\nmm = minutter\nhh = timer (01 - 12)\nHH = timer (00 - 23)\ntt = AM/PM\n\ndd = dag\nMM = måned\nyy/yyyy = år" #: ../glade/smuxi-frontend-gnome.glade.h:31 msgid "Persistency Type:" msgstr "Persistenstype:" #: ../glade/smuxi-frontend-gnome.glade.h:32 msgid "Volatile Buffer Lines:" msgstr "Ustabile mellemlagerlinjer:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Persistent Buffer Lines:" msgstr "Mellemlagerlinjer for persistens:" #: ../glade/smuxi-frontend-gnome.glade.h:34 msgid "Message Buffer" msgstr "Beskedmellemlager" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Fjern farver" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Fjern formater" #: ../glade/smuxi-frontend-gnome.glade.h:37 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Fjern UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Show Advanced Settings" msgstr "Vis avanceret opsætning" #: ../glade/smuxi-frontend-gnome.glade.h:39 msgid "Advanced" msgstr "Avanceret" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Generelt" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Øverst" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:42 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Bund" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:43 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Venstre" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Højre" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:45 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Ingen" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Fanebladsplacering " #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Fremhæv" #: ../glade/smuxi-frontend-gnome.glade.h:48 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivitet" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Ingen aktivitet" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Deltag/del/tilstand" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Fanebladsfarver " #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Automatically switch to newly opened person chats" msgstr "Skift automatisk til seneste åbnede personlige samtaler (chat)" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Automatically switch to newly opened group chats" msgstr "Skift automatisk til seneste åbnede gruppesamtaler (chat)" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Tree" msgstr "Træ" #: ../glade/smuxi-frontend-gnome.glade.h:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Afslutningstegn:" #: ../glade/smuxi-frontend-gnome.glade.h:56 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Kommandotegn:" #: ../glade/smuxi-frontend-gnome.glade.h:57 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Historikstørrelse for kommando:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Bashagtig fuldførelse" #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Indtastningsfelt " #: ../glade/smuxi-frontend-gnome.glade.h:60 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Inddata" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Farver for brugernavn" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid " Person List Position " msgstr " Placering af personliste " #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Override" msgstr "Overskriv" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid " Font " msgstr " Skrifttype " #: ../glade/smuxi-frontend-gnome.glade.h:65 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Emneplacering " #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Foreground" msgstr "Forgrund" #: ../glade/smuxi-frontend-gnome.glade.h:67 msgid "Background" msgstr "Baggrund" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid " Color " msgstr " Farve " #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:70 msgid "_Wrap Mode:" msgstr "_Ombrydningstilstand:" #: ../glade/smuxi-frontend-gnome.glade.h:71 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Fremhæv ord:" #: ../glade/smuxi-frontend-gnome.glade.h:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Beep ved fremhævelse" #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Fremhævelse " #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Uddata" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Enable" msgstr "Aktiver" #: ../glade/smuxi-frontend-gnome.glade.h:77 msgid "Show always" msgstr "Vis altid" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Show when window is minimized" msgstr "Vis når vinduet er minimeret" #: ../glade/smuxi-frontend-gnome.glade.h:79 msgid "Show when window is closed" msgstr "Vis når vinduet er lukket" #: ../glade/smuxi-frontend-gnome.glade.h:80 msgid " Notification Area Icon " msgstr " Ikon for statusfelt " #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "Show Smuxi in the messaging menu" msgstr "Vis Smuxi i beskedmenuen" #: ../glade/smuxi-frontend-gnome.glade.h:82 msgid "Messaging Menu" msgstr "Beskedmenu" #: ../glade/smuxi-frontend-gnome.glade.h:83 msgid "Show notification popups" msgstr "Vis påmindelses-pop op'er" #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "Notification Popups" msgstr "Påmindelses-pop op'er" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "Notification" msgstr "Påmindelse" #: ../glade/smuxi-frontend-gnome.glade.h:86 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Grænseflade" #: ../glade/smuxi-frontend-gnome.glade.h:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Servere" #: ../glade/smuxi-frontend-gnome.glade.h:88 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filtre" #: ../glade/smuxi-frontend-gnome.glade.h:89 msgid "Enabled" msgstr "Aktiveret" #: ../glade/smuxi-frontend-gnome.glade.h:90 msgid "Log Filtered Messages" msgstr "Logfiltrerede beskeder" #: ../glade/smuxi-frontend-gnome.glade.h:91 msgid "_Logging" msgstr "_Logning" #: ../glade/smuxi-frontend-gnome.glade.h:92 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi — Server" #: ../glade/smuxi-frontend-gnome.glade.h:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:263 msgid "Automatically connect to server at startup" msgstr "Tilslut automatisk til server ved opstart" #: ../glade/smuxi-frontend-gnome.glade.h:94 msgid "Protocol:" msgstr "Protokol:" #: ../glade/smuxi-frontend-gnome.glade.h:95 msgid "Network:" msgstr "Netværk:" #: ../glade/smuxi-frontend-gnome.glade.h:96 msgid "Hostname:" msgstr "Værtsnavn:" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:1 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC-chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi IRC Client" msgstr "Smuxi — IRC-klient" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Chat with other people on IRC" msgstr "Chat med andre via IRC" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:5 msgid "" "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;" msgstr "chat;messaging;im;gnome;gtk;irc;twitter;facebook;gtalk;xmpp;jabber;campfire;jabbr;beskeder;meddelelser;samtale;snak;" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:2 msgid "Chat with other people on IRC, Twitter, Jabber and Campfire" msgstr "Chat med andre på IRC, Twitter, Jabber og Campfire" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:3 msgid "" "Smuxi is an open-source, distributed and user-friendly chat client for IRC, " "Twitter, Jabber/XMPP, Campfire and SignalR's JabbR." msgstr "Smuxi er en distribueret og brugervenlig chatklient til IRC, Twitter, Jabber/XMPP, Campfire og SignalR's JabbR, som er udviklet i åben kildekode." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:4 msgid "" "Inspired by the combination of screen and irssi, Smuxi has a detachable " "server (or like a \"normal\" client) that stays connected when you aren't, " "and can allow multiple Smuxi frontends to be connected and in sync. This is " "similar to screen+irssi or IRC bouncers, but more elegant and powerful." msgstr "Inspireret af kombinationen af skærm og irssi, Smuxi har en aftagelig server (eller som en »normal« klient), som forbliver forbundet, når du ikke er det, og som kan give mulighed for at flere Smuxi-brugerflader er forbundet og synkroniseret. Dette svarer til screen+irssi eller IRC bouncers, men mere elegant og funktionsrigt." #: ../src/Frontend-GNOME/smuxi-frontend-gnome.appdata.xml.in.h:5 msgid "The main window showing an IRC channel" msgstr "Hovedvinduet der viser en IRC-kanal" #: ../src/Frontend-GNOME/AboutDialog.cs:66 msgid "translator-credits" msgstr "Joe Hansen \nAlan Mortensen \n\nDansk-gruppen \nMere info: http://www.dansk-gruppen.dk" #: ../src/Frontend-GNOME/AboutDialog.cs:79 msgid "Smuxi Website" msgstr "Smuxis hjemmeside" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Oops, jeg gjorde det igen …" #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi brød ned da en uhåndteret undtagelse opstod!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Her er stacktracen, rapporter venligst denne fejl!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Rapporter fejl" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine not found." msgstr "Motor blev ikke fundet." #: ../src/Frontend-GNOME/EngineManagerDialog.cs:77 msgid "Engine Manager" msgstr "Motorhåndtering" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:96 msgid "Select which Smuxi engine you want to connect to" msgstr "Vælg hvilken Smuximotor du ønsker at forbinde til" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:102 msgid "Engine:" msgstr "Motor:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:113 msgid "Use Low Bandwidth Mode" msgstr "Brug tilstand for lav båndbredde" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:137 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:197 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:382 msgid "Local Engine" msgstr "Lokal motor" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:189 msgid "Please select an engine!" msgstr "Vælg venligst en motor!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:212 #, csharp-format msgid "" "Your frontend is not compatible with the engine!\n" "Engine Version: {0} Frontend Version: {1}\n" "Engine Protocol: {2} Frontend Protocol: {3}" msgstr "Din brugerflade er ikke kompatibel med motoren!\nMotorversion: {0} Brugerfladeversion: {1}\nMotorprotokol: {2} Brugerfladeprotokol: {3}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:245 msgid "An error occurred while connecting to the engine!" msgstr "En fejl opstod under tilslutning til motoren!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:246 #, csharp-format msgid "Engine URL: {0}" msgstr "Motor-URL: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:249 #, csharp-format msgid "Error: {0}" msgstr "Fejl: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:319 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Er du sikker på, at du ønsker at slette motoren »{0}«?" #: ../src/Frontend-GNOME/Entry.cs:485 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Du er ved at indsætte {0} linjer. Ønsker du at fortsætte?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:602 msgid "Frontend Commands" msgstr "Grænsefladekommandoer" #: ../src/Frontend-GNOME/Main.cs:49 msgid "Enable debug output" msgstr "Aktivér fejlsøgningsoutput" #: ../src/Frontend-GNOME/Main.cs:56 msgid "Show this help" msgstr "Vis denne hjælp" #: ../src/Frontend-GNOME/Main.cs:60 msgid "Options:" msgstr "Valgmuligheder:" #: ../src/Frontend-GNOME/Main.cs:67 msgid "Connect to engine" msgstr "Forbind til motor" #: ../src/Frontend-GNOME/Main.cs:74 msgid "Opens the specified link in Smuxi" msgstr "Åbner det angivne link i Smuxi" #: ../src/Frontend-GNOME/Main.cs:81 msgid "Starts a new Smuxi instance and ignores an existing one" msgstr "Starter en ny Smuxi-instans og ignorerer en eksisterende" #: ../src/Frontend-GNOME/Main.cs:109 msgid "Passing link to already running Smuxi instance..." msgstr "Sender link til allerede kørende Smuxi-instans …" #: ../src/Frontend-GNOME/Main.cs:117 msgid "Bringing already running Smuxi instance to foreground..." msgstr "Henter allerede kørende Smuxi-instanser frem foran …" #: ../src/Frontend-GNOME/MainWindow.cs:374 #, csharp-format msgid "{0} Users" msgstr "{0} Brugere" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Beklager, ikke implementeret endnu!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Tegn" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Ord" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:187 msgid "" "This setting specifies if Smuxi should store chat messages in memory (volatile) or to disk (persistent).\n" "For persistent you can choose between Db4o, an object database or SQLite, a relational database.\n" "The Db4o backend has known issues like high memory and CPU usage and can even lead to crashes and thus it is deprecated.\n" "The SQLite backend has no known performance or stability issues and is the recommended setting." msgstr "Denne indstilling specificerer, om Smuxi skal lagre chatbeskeder i hukommelsen (flygtigt) eller på disk (vedvarende).\nFor vedvarende kan du vælge mellem Db4o, en objektdatabase eller SQLite, en relationsdatabase.\nDb4o-motoren har kendte problemstillinger såsom høj hukommelses- og CPU-forbrug og kan endda føre til nedbrud og er derfor forældet.\nSQLite-motoren har ingen kendte ydelses- eller stabilitetsproblemer og er den anbefalede indstilling." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:208 msgid "Persistent: SQLite (Recommended)" msgstr "Vedvarende: SQLite (anbefalet)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:212 msgid "Persistent: Db4o (Deprecated)" msgstr "Vedvarende: Db4o (forældet)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:216 msgid "Persistent (Preview)" msgstr "Vedvarende (prøve)" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:219 msgid "Volatile" msgstr "Ustabile" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "No Proxy" msgstr "Ingen proxy" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:244 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:340 msgid "System Default" msgstr "Systemstandard" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:258 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:134 msgid "Connection" msgstr "Tilslutning" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:262 msgid "Interface" msgstr "Grænseflade" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:266 msgid "Servers" msgstr "Servere" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:273 msgid "Filters" msgstr "Filtre" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:277 msgid "Logging" msgstr "Logning" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:696 msgid "Nicknames(s) field must not be empty." msgstr "Brugernavnsfelter må ikke være tomme." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:892 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Ugyldigt fremhævet regulært udtryk: '{0}'. Årsag: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:100 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:265 msgid "Name" msgstr "Navn" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Emne" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "Søgning efter gruppechat uden et filter kan ikke anbefales. Det kan tage lang tid eller slet ikke virke.\nØnsker du at fortsætte?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Kunne ikke hente listen over gruppechat fra serveren." #: ../src/Frontend-GNOME/Frontend.cs:388 msgid "Disconnected from engine." msgstr "Afbrudt fra motor." #: ../src/Frontend-GNOME/Frontend.cs:431 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Forbinder til motor igen … (forsøg {0})" #: ../src/Frontend-GNOME/Frontend.cs:542 #, csharp-format msgid "Cause: {0}" msgstr "Årsag: {0}" #: ../src/Frontend-GNOME/Frontend.cs:675 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "Grænsefladen har mistet forbindelsen til serveren.\nØnsker du at tilslutte nu?" #: ../src/Frontend-GNOME/Frontend.cs:694 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "Gentilslutning til serveren mislykkedes.\nØnsker du at forsøge igen?" #: ../src/Frontend-GNOME/Frontend.cs:1008 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "Serveren har mistet forbindelsen til grænsefladen.\nØnsker du at tilslutte igen?" #: ../src/Frontend-GNOME/NotifyManager.cs:338 msgid "Show" msgstr "Vis" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:58 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:233 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protokol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:59 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Værtsnavn" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:162 msgid "Unable to load server: " msgstr "Kunne ikke indlæse server: " #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:239 msgid "Person / Private" msgstr "Person / privat" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:240 msgid "Group / Public" msgstr "Gruppe / offenlig" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:65 msgid "Engine Assistant - Smuxi" msgstr "Motorassistent — Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:87 msgid "Add Smuxi Engine" msgstr "Tilføj Smuximotor" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:89 msgid "Edit Smuxi Engine" msgstr "Rediger Smuximotor" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:198 msgid "Credentials" msgstr "Akkreditiver" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:278 msgid "Now you can use the Smuxi Engine" msgstr "Nu kan du bruge Smuximotoren" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:281 msgid "Thank you" msgstr "Mange tak" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:298 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "En motor med dette navn findes allerede! Angiv venligst et andet." #: ../src/Frontend-GNOME/Views/JoinWidget.cs:89 msgid "Enter which chat to join" msgstr "Indtast hvilken samtale (chat) du ønsker at deltage i" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:153 msgid "About Smuxi" msgstr "Om Smuxi" #. TODO: add cmd+, accelerator #: ../src/Frontend-GNOME/Views/MenuWidget.cs:157 msgid "Preferences" msgstr "Præferencer" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:263 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:227 msgid "Unable to add server: " msgstr "Kunne ikke tilføje server: " #: ../src/Frontend-GNOME/Views/MenuWidget.cs:384 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Skift til lokal motor vil afbryde dig fra den aktuelle motor!\nEr du sikker på, at du ønsker at gøre dette?" #: ../src/Frontend-GNOME/Views/MenuWidget.cs:428 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "Skift af den eksterne motor vil afbryde dig fra den aktuelle motor!\nEr du sikker på, at du ønsker at gøre dette?" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:412 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dag ændret fra {0} til {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:416 #, csharp-format msgid "Day changed to {0}" msgstr "Dag ændret til {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:120 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:130 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Ugyldig filter for regulært udtryk: '{0}'. Årsag: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:197 msgid "Are you sure you want to delete the selected filter?" msgstr "Er du sikker på, at du ønsker at slette det valgte filter?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:241 msgid "Protocol / Server" msgstr "Protokol / server" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:248 msgid "Chat Type" msgstr "Chattype" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:281 msgid "Normal" msgstr "Normal" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:282 msgid "Event" msgstr "Begivenhed" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:289 msgid "Type" msgstr "Type" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:314 msgid "Pattern" msgstr "Mønster" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:557 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "Tilstand for lav båndbredde er aktiv: Ingen beskeder synkroniseret." #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:859 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:135 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:136 msgid "Show _Menubar" msgstr "Vis _menubjælke" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:321 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Henter brugerlsite for {0} …" #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:349 msgid "done." msgstr "færdig." #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:127 msgid "Reconnect" msgstr "Genforbind" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:174 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "Lukning af protokolsamtalen vil også lukke alle åbne samtalerum der er forbundet til den!\nEr du sikker på, at du ønsker at gøre dette?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:189 msgid "Are you sure you want to delete the selected server?" msgstr "Er du sikker på, at du ønsker at slette den valgte server?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:245 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:279 msgid "Unable to edit server: " msgstr "Kunne ikke redigere server: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Find" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Søg efter:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Versalfølsom" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Søg _baglæns" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Ombryd" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Brug _reuglære udtryk" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi — Find gruppechat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Navn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.JoinWidget.cs:69 msgid "Join" msgstr "Deltag" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:55 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:56 msgid "_Smuxi" msgstr "_Smuxi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:59 msgid "_Server" msgstr "_Server" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:62 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:64 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:65 msgid "_Engine" msgstr "_Motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:68 msgid "_View" msgstr "_Vis" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:71 msgid "_Help" msgstr "_Hjælp" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:73 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:75 msgid "Connect" msgstr "Forbind" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:147 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:148 msgid "Open Log" msgstr "Åbn log" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:87 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:88 msgid "_Preferences" msgstr "_Præferencer" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:90 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:91 msgid "_Quit" msgstr "_Afslut" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:93 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:94 msgid "_Connect" msgstr "_Forbind" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:96 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:97 msgid "_Add" msgstr "_Tilføj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:99 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:100 msgid "_Manage" msgstr "_Håndter" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:102 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:103 msgid "_Open / Join Chat" msgstr "_Åbn / deltag i samtale" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:105 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:106 msgid "_Find Group Chat" msgstr "_Find gruppechat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:108 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:109 msgid "C_lear All Activity" msgstr "_Ryd al aktivitet" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:111 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:112 msgid "_Next Chat" msgstr "_Næste chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:114 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:115 msgid "_Previous Chat" msgstr "_Forrige chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:117 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:118 msgid "_Close" msgstr "_Luk" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:120 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:121 msgid "_Use Local Engine" msgstr "_Brug lokal motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:123 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:124 msgid "_Add Remote Engine" msgstr "_Tilføj ekstern motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:126 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:127 msgid "Switch Remote Engine" msgstr "Skift ekstern motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:129 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:130 msgid "_Caret Mode" msgstr "_Markørtilstand" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:132 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:133 msgid "_Browse Mode" msgstr "_Navigeringstilstand" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:138 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:139 msgid "Show _Statusbar" msgstr "Vis _statuslinje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:141 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:142 msgid "_Fullscreen" msgstr "_Fuldskærm" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:144 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:145 msgid "_About" msgstr "_Om" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:150 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:152 msgid "Find Group Chat" msgstr "Find gruppesamtale" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:154 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:155 msgid "_Website" msgstr "_Hjemmeside" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:157 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.MenuWidget.cs:158 msgid "Show _Toolbar" msgstr "Vis _værktøjslinje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Connect" msgstr "Smuxi — forbind" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi — indstillinger" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Brugernavne:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Faneblade" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Placering af brugerliste" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Kanalfiltre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Brugerfiltre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Brug _SSH-tunnel" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "Aktiverer brugen af SSH til forbindelsen. Dette har en mindre ydelsespåvirkning, men er mere sikker og krævet med brug af NAT- eller portbaserede brandmure (firewalls)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH-_vært:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS- eller IP-adresse og port på SSH-serveren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:183 msgid "_Port:" msgstr "_Port:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS- eller IP-adresse og port på Smuxiserveren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxivært:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH-brugernavn: (valgfri)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "Brugernavn som vil blive brugt til at logge ind på SSH-serveren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH-adgangskode: (valgfri)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "Adgangskode vil blive brugt til at logge ind på SSH-serveren. Adgangskoden er valgfri hvis SSH-nøglegodkendelse anvendes (se nedenfor)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "_SSH-nøglefil: (valgfri)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Vælg en fil" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "SSH-privatnøglefil vil blive brugt til at logge ind på SSH-serveren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:242 msgid "_Username:" msgstr "_Brugernavn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "Brugernavn som vil blive brugt til at logge ind til Smuxiserveren" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:116 msgid "_Password:" msgstr "_Adgangskode:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Brugerens adgangskode" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Bekræft adgangskode:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Gentag adgangskoden for bekræftelse" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "Velkommen til konfigurationsassistenten til Smuximotoren.\nDet er nødvendigt at indtaste nogle informationer før du kan bruge motoren.\n\nKlik »Fremad« for at begynde." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Motornavn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Profilnavn på den nye motor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Standardmotor:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Brug som ny standardmotor" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "Hvis aktiveret, vil den aktuelle motor være standard næste gang Smuxi startes" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi — åben chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Type:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:58 msgid "_Hostname:" msgstr "_Værtsnavn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:79 msgid "_Network:" msgstr "_Netværk:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:105 msgid "Nickname:" msgstr "Brugernavn:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:252 msgid "_Protocol:" msgstr "_Protokol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:276 msgid "Use Encryption" msgstr "Brug kryptering" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:288 msgid "Validate Server Certificate" msgstr "Valider servercertifikat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:308 msgid "_On Connect Commands:" msgstr "Kommandoer _ved tilslutning:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:319 msgid "_Ignore Commands" msgstr "_Ignorer kommandoer" smuxi-1.1/po-Frontend-GNOME/hr.po0000664000175000017500000011273314011526464017341 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Mirco Bauer , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:22+0100\n" "PO-Revision-Date: 2012-01-22 11:03+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: ../glade/smuxi-frontend-gnome.glade.h:1 msgid " Chat " msgstr " Chat " #: ../glade/smuxi-frontend-gnome.glade.h:2 msgid " Color " msgstr " Boja " #: ../glade/smuxi-frontend-gnome.glade.h:3 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1172 msgid " Entry Field " msgstr " Polje za unos " #: ../glade/smuxi-frontend-gnome.glade.h:4 msgid " Font " msgstr " Font " #: ../glade/smuxi-frontend-gnome.glade.h:5 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1502 msgid " Highlighting " msgstr " Isticanje " #: ../glade/smuxi-frontend-gnome.glade.h:6 msgid " Notification Area Icon " msgstr " Obavijesna sličica " #: ../glade/smuxi-frontend-gnome.glade.h:7 msgid " Person List Position " msgstr " Pozicioniranje popisa osoba " #: ../glade/smuxi-frontend-gnome.glade.h:8 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1009 msgid " Tab Colors " msgstr " Boje kartica " #: ../glade/smuxi-frontend-gnome.glade.h:9 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:910 msgid " Tabs Position " msgstr " Pozicija kartica " #: ../glade/smuxi-frontend-gnome.glade.h:10 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1315 msgid " Topic Position " msgstr " Pozicija teme " #: ../glade/smuxi-frontend-gnome.glade.h:11 msgid "Advanced" msgstr "Napredno" #: ../glade/smuxi-frontend-gnome.glade.h:12 msgid "General" msgstr "Općenito" #: ../glade/smuxi-frontend-gnome.glade.h:13 msgid "Global Commands" msgstr "Općenite naredbe" #: ../glade/smuxi-frontend-gnome.glade.h:14 msgid "Message Buffer" msgstr "Međuspremnik poruka" #: ../glade/smuxi-frontend-gnome.glade.h:15 msgid "Messaging Menu" msgstr "Izbornik za poruke" #: ../glade/smuxi-frontend-gnome.glade.h:16 msgid "Network Proxy" msgstr "Mrežni proxy" #: ../glade/smuxi-frontend-gnome.glade.h:17 msgid "Notification Popups" msgstr "Obavijesni popupovi" #: ../glade/smuxi-frontend-gnome.glade.h:18 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:961 msgid "Activity" msgstr "Aktivnost" #: ../glade/smuxi-frontend-gnome.glade.h:19 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:209 msgid "Automatically connect to server at startup" msgstr "Automatski se pri pokretanju poveži sa poslužiteljem" #: ../glade/smuxi-frontend-gnome.glade.h:20 msgid "Background" msgstr "Pozadina" #: ../glade/smuxi-frontend-gnome.glade.h:21 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1160 msgid "Bash-Style Completion" msgstr "Kompletiranje na Bash način" #: ../glade/smuxi-frontend-gnome.glade.h:22 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1490 msgid "Beep on highlight" msgstr "Ozvuči pri isticanju" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:23 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:780 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:802 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1261 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1286 msgid "Bottom" msgstr "Dno" #: ../glade/smuxi-frontend-gnome.glade.h:24 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:546 msgid "Buffer Lines:" msgstr "Broj redaka u međuspremniku:" #: ../glade/smuxi-frontend-gnome.glade.h:25 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:471 msgid "C_onnection" msgstr "V_eza" #: ../glade/smuxi-frontend-gnome.glade.h:26 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1112 msgid "Command Character:" msgstr "Naredbeni simbol" #: ../glade/smuxi-frontend-gnome.glade.h:27 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1135 msgid "Command History Size:" msgstr "Veličina naredbene povijesti:" #: ../glade/smuxi-frontend-gnome.glade.h:28 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1092 msgid "Completion Character:" msgstr "Simbol za kompletiranje" #: ../glade/smuxi-frontend-gnome.glade.h:29 msgid "Enable" msgstr "Omogući" #: ../glade/smuxi-frontend-gnome.glade.h:30 msgid "Enabled" msgstr "Omogućeno" #: ../glade/smuxi-frontend-gnome.glade.h:31 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:359 msgid "Encoding:" msgstr "Enkodiranje:" #: ../glade/smuxi-frontend-gnome.glade.h:32 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:569 msgid "Engine Buffer Lines:" msgstr "Broj redaka međuspremnika jezgre:" #: ../glade/smuxi-frontend-gnome.glade.h:33 msgid "Foreground" msgstr "Prednja strana" #: ../glade/smuxi-frontend-gnome.glade.h:34 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:725 msgid "General" msgstr "Općenito" #: ../glade/smuxi-frontend-gnome.glade.h:35 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:981 msgid "Highlight" msgstr "Isticanje" #: ../glade/smuxi-frontend-gnome.glade.h:36 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1466 msgid "Highlight words:" msgstr "Istaknute riječi:" #: ../glade/smuxi-frontend-gnome.glade.h:37 msgid "Host:" msgstr "Poslužitelj:" #: ../glade/smuxi-frontend-gnome.glade.h:38 msgid "Hostname:" msgstr "Naziv poslužitelja:" #: ../glade/smuxi-frontend-gnome.glade.h:39 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1181 msgid "Input" msgstr "Unos" #: ../glade/smuxi-frontend-gnome.glade.h:40 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:971 msgid "Join/Part/Mode" msgstr "Spajanje/Napuštanje/Način" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:41 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:816 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:841 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1335 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1361 msgid "Left" msgstr "Napuštanje" #: ../glade/smuxi-frontend-gnome.glade.h:42 msgid "Log Filtered Messages" msgstr "Filtrirane poruke zapisa" #: ../glade/smuxi-frontend-gnome.glade.h:43 msgid "Network:" msgstr "Mreža:" #: ../glade/smuxi-frontend-gnome.glade.h:44 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1202 msgid "Nick Colors" msgstr "Boje nadimka" #: ../glade/smuxi-frontend-gnome.glade.h:45 msgid "Nickname(s):" msgstr "Nadimak(ili više njih):" #: ../glade/smuxi-frontend-gnome.glade.h:46 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:953 msgid "No Activity" msgstr "Bez aktivnosti" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:896 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1301 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1416 msgid "None" msgstr "Bez" #: ../glade/smuxi-frontend-gnome.glade.h:48 msgid "Notification" msgstr "Obavijest" #: ../glade/smuxi-frontend-gnome.glade.h:49 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:381 msgid "On Connect Commands:" msgstr "Naredbe pri spajanju:" #: ../glade/smuxi-frontend-gnome.glade.h:50 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:427 msgid "On Startup Commands:" msgstr "Naredbe pri pokretanju:" #: ../glade/smuxi-frontend-gnome.glade.h:51 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1514 msgid "Output" msgstr "Ispis" #: ../glade/smuxi-frontend-gnome.glade.h:52 msgid "Override" msgstr "Prekorači" #: ../glade/smuxi-frontend-gnome.glade.h:53 msgid "Password:" msgstr "Lozinka:" #: ../glade/smuxi-frontend-gnome.glade.h:54 msgid "Persistency Type:" msgstr "Način stalnosti:" #: ../glade/smuxi-frontend-gnome.glade.h:55 msgid "Persistent Buffer Lines:" msgstr "Broj redaka stalnog međuspremnika:" #: ../glade/smuxi-frontend-gnome.glade.h:56 msgid "Port:" msgstr "Port:" #: ../glade/smuxi-frontend-gnome.glade.h:57 msgid "Protocol:" msgstr "Protokol:" #: ../glade/smuxi-frontend-gnome.glade.h:58 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:338 msgid "Realname:" msgstr "Pravo ime:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox12.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:59 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:856 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:881 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1376 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1401 msgid "Right" msgstr "Desno" #: ../glade/smuxi-frontend-gnome.glade.h:60 msgid "Show Advanced Settings" msgstr "Prikaži napredne postavke" #: ../glade/smuxi-frontend-gnome.glade.h:61 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:170 msgid "Show Password" msgstr "Prikaži lozinku" #: ../glade/smuxi-frontend-gnome.glade.h:62 msgid "Show Smuxi in the messaging menu" msgstr "Prikaži Smuxi u izborniku za poruke" #: ../glade/smuxi-frontend-gnome.glade.h:63 msgid "Show always" msgstr "Prikaži uvijek" #: ../glade/smuxi-frontend-gnome.glade.h:64 msgid "Show notification popups" msgstr "Prikažu obavijesne popupove" #: ../glade/smuxi-frontend-gnome.glade.h:65 msgid "Show when window is closed" msgstr "Prikaži kada je prozor zatvoren" #: ../glade/smuxi-frontend-gnome.glade.h:66 msgid "Show when window is minimized" msgstr "Prikaži kada je prozor minimiziran" #: ../glade/smuxi-frontend-gnome.glade.h:67 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerDialog.cs:16 msgid "Smuxi - Server" msgstr "Smuxi - Poslužitelj" #: ../glade/smuxi-frontend-gnome.glade.h:68 msgid "Smuxi Preferences" msgstr "Smuxi postavke" #: ../glade/smuxi-frontend-gnome.glade.h:69 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:628 msgid "Strip Colors" msgstr "Ukloni boje" #: ../glade/smuxi-frontend-gnome.glade.h:70 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:667 msgid "Strip Formattings" msgstr "Ukloni formatiranje" #: ../glade/smuxi-frontend-gnome.glade.h:71 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:707 msgid "Strip UTF-8" msgstr "Ukloni UTF-8" #: ../glade/smuxi-frontend-gnome.glade.h:72 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1022 msgid "Tabs" msgstr "Kartice" #: ../glade/smuxi-frontend-gnome.glade.h:73 msgid "" "The nickname to use. You can specify extra nicknames (separated by spaces) " "which will be used as fallbacks when the first choice is not available. By " "default $nick_ and $nick__ will be used as fallbacks." msgstr "" "Nadimak za korištenje. Možete odrediti dodatne nadimke (odvojene razmakom) " "koji će biti korišten u slučaju da prvi odabir nije dostupan. Tada će $nick_" " i $nick__ biti korišteni." #: ../glade/smuxi-frontend-gnome.glade.h:74 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:526 msgid "Timestamp Format:" msgstr "Format vremenske oznake:" #. Container child vbox6.Gtk.Box+BoxChild #. Container child vbox11.Gtk.Box+BoxChild #: ../glade/smuxi-frontend-gnome.glade.h:75 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:743 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:767 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1220 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1246 msgid "Top" msgstr "Vrh" #: ../glade/smuxi-frontend-gnome.glade.h:76 msgid "Type:" msgstr "Oblik:" #: ../glade/smuxi-frontend-gnome.glade.h:77 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:315 msgid "Username:" msgstr "Korisnički ime:" #: ../glade/smuxi-frontend-gnome.glade.h:78 msgid "Volatile Buffer Lines:" msgstr "Broj redaka nestalnog međuspremnika:" #: ../glade/smuxi-frontend-gnome.glade.h:79 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1681 msgid "_Filters" msgstr "_Filteri" #: ../glade/smuxi-frontend-gnome.glade.h:80 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1523 msgid "_Interface" msgstr "_Sučelje" #: ../glade/smuxi-frontend-gnome.glade.h:81 msgid "_Logging" msgstr "_Zapisivanje" #: ../glade/smuxi-frontend-gnome.glade.h:82 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1589 msgid "_Servers" msgstr "_Poslužitelji" #. This is a setting for character based line wrapping vs word based when #. showing messages #: ../glade/smuxi-frontend-gnome.glade.h:84 msgid "_Wrap Mode:" msgstr "_Način omota:" #: ../glade/smuxi-frontend-gnome.glade.h:85 msgid "" "ss = seconds\n" "mm = minutes\n" "hh = hours (01 - 12)\n" "HH = hours (00 - 23)\n" "tt = AM/PM\n" "\n" "dd = day\n" "MM = month\n" "yy/yyyy = year" msgstr "" "ss = sekunde\n" "mm = minute\n" "hh = sati (01 - 12)\n" "HH = sati (00 - 23)\n" "tt = prijepodne/poslijepodne\n" "\n" "dd = dan\n" "MM = mjesec\n" "yy/yyyy = godina" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:1 msgid "Chat with other people on IRC" msgstr "Chatajte sa drugim ljudima na IRCu" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:2 msgid "IRC Chat" msgstr "IRC Chat" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:3 msgid "Smuxi" msgstr "Smuxi" #: ../src/Frontend-GNOME/smuxi-frontend-gnome.desktop.in.h:4 msgid "Smuxi IRC Client" msgstr "Smuxi IRC klijent" #: ../src/Frontend-GNOME/AboutDialog.cs:60 msgid "translator-credits" msgstr "Matias M. " #: ../src/Frontend-GNOME/AboutDialog.cs:65 msgid "Smuxi Website" msgstr "Smuxi web stranica" #: ../src/Frontend-GNOME/CrashDialog.cs:46 msgid "Oops, I did it again..." msgstr "Ups, ponovno sam to učinio..." #: ../src/Frontend-GNOME/CrashDialog.cs:59 msgid "Smuxi crashed because an unhandled exception was thrown!" msgstr "Smuxi se srušio zbog iznimke kojom nije bilo moguće rukovati!" #: ../src/Frontend-GNOME/CrashDialog.cs:63 msgid "Here is the stacktrace, please report this bug!" msgstr "Ovdje je zapis, molimo vas prijavite ovu pogrešku!" #: ../src/Frontend-GNOME/CrashDialog.cs:83 msgid "_Report Bug" msgstr "_Prijavi pogrešku" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:61 msgid "Engine Manager" msgstr "Upravitelj jezgri" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:80 msgid "Select which Smuxi engine you want to connect to" msgstr "Odaberite Smuxi jezgru na koju se želite spojiti" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:86 msgid "Engine:" msgstr "Jezgra:" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:97 msgid "Use Low Bandwidth Mode" msgstr "Koristi način rada sa nižom propusnošću" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:121 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:181 #: ../src/Frontend-GNOME/EngineManagerDialog.cs:358 msgid "Local Engine" msgstr "Lokalna jezgra" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:173 msgid "Please select an engine!" msgstr "Molimo odaberite jezgru!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:194 #, csharp-format msgid "Your frontend version ({0}) does not match the engine version ({1})!" msgstr "Vaša inačica sučelja ({0}) ne odgovara inačici jezgre ({1})!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:221 msgid "An error occurred while connecting to the engine!" msgstr "Došlo je do pogreške pri spajanju sa jezgrom!" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:222 #, csharp-format msgid "Engine URL: {0}" msgstr "URL jezgre: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:225 #, csharp-format msgid "Error: {0}" msgstr "Pogreška: {0}" #: ../src/Frontend-GNOME/EngineManagerDialog.cs:295 #, csharp-format msgid "Are you sure you want to delete the engine \"{0}\"?" msgstr "Želite li sigurno ukloniti jezgru \"{0}\"?" #: ../src/Frontend-GNOME/Entry.cs:443 #, csharp-format msgid "You are going to paste {0} lines. Do you want to continue?" msgstr "Zalijepiti ćete {0} redaka. Želite li nastaviti?" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Frontend-GNOME/Entry.cs:547 msgid "Frontend Commands" msgstr "Naredbe sučelja" #: ../src/Frontend-GNOME/MainWindow.cs:252 msgid "_File" msgstr "_Datoteka" #: ../src/Frontend-GNOME/MainWindow.cs:276 msgid "_Server" msgstr "_Poslužitelj" #: ../src/Frontend-GNOME/MainWindow.cs:280 msgid "_Quick Connect" msgstr "_Brzo spajanje" #: ../src/Frontend-GNOME/MainWindow.cs:291 msgid "_Manage" msgstr "_uredi" #: ../src/Frontend-GNOME/MainWindow.cs:298 msgid "_Chat" msgstr "_Chat" #: ../src/Frontend-GNOME/MainWindow.cs:302 msgid "Open / Join Chat" msgstr "Otvori / spoji na chat" #: ../src/Frontend-GNOME/MainWindow.cs:308 msgid "_Find Group Chat" msgstr "_Pronađi grupni chat" #: ../src/Frontend-GNOME/MainWindow.cs:314 msgid "C_lear All Activity" msgstr "O_čisti sve aktivnosti" #: ../src/Frontend-GNOME/MainWindow.cs:321 msgid "_Next Chat" msgstr "_Sljedeći chat" #: ../src/Frontend-GNOME/MainWindow.cs:335 msgid "_Previous Chat" msgstr "_Prethodni chat" #: ../src/Frontend-GNOME/MainWindow.cs:389 msgid "Open Log" msgstr "Otvori zapis" #: ../src/Frontend-GNOME/MainWindow.cs:407 msgid "_Engine" msgstr "_Jezgra" #: ../src/Frontend-GNOME/MainWindow.cs:411 msgid "_Use Local Engine" msgstr "_Koristi lokalnu jezgru" #: ../src/Frontend-GNOME/MainWindow.cs:417 msgid "_Add Remote Engine" msgstr "_Dodaj udaljenu jezgru" #: ../src/Frontend-GNOME/MainWindow.cs:422 msgid "_Switch Remote Engine" msgstr "_Promijeni udaljenu jezgru" #: ../src/Frontend-GNOME/MainWindow.cs:429 msgid "_View" msgstr "_Prikaz" #: ../src/Frontend-GNOME/MainWindow.cs:433 msgid "_Caret Mode" msgstr "_Način sa znakom za umetanje" #: ../src/Frontend-GNOME/MainWindow.cs:445 msgid "_Browse Mode" msgstr "_Način pregledavanja" #: ../src/Frontend-GNOME/MainWindow.cs:463 #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:722 msgid "Show _Menubar" msgstr "Prikaži _traku izbornika" #: ../src/Frontend-GNOME/MainWindow.cs:494 msgid "_Help" msgstr "_Pomoć" #: ../src/Frontend-GNOME/MainWindow.cs:768 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:225 msgid "Unable to add server: " msgstr "Dodavanje poslužitelja nije uspjelo:" #: ../src/Frontend-GNOME/MainWindow.cs:828 #, csharp-format msgid "Unknown ChatType: {0}" msgstr "Nepoznat ChatType: {0}" #: ../src/Frontend-GNOME/MainWindow.cs:1097 msgid "" "Switching to local engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Prebacivanjem na lokalnu jezgru odvojiti ćete se od trenutne!\n" "Želite li to sigurno učiniti?" #: ../src/Frontend-GNOME/MainWindow.cs:1139 msgid "" "Switching the remote engine will disconnect you from the current engine!\n" "Are you sure you want to do this?" msgstr "" "Prebacivanje na udaljenu jezgru će vas odvojiti od trenutne jezgre!\n" "Želite li to sigurno učiniti?" #: ../src/Frontend-GNOME/NotImplementedMessageDialog.cs:40 msgid "Sorry, not implemented yet!" msgstr "Ispričavamo se, još nije implementirano!" #. fill ListStore #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:179 msgid "Character" msgstr "Simbol" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:180 msgid "Word" msgstr "Riječ" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:197 msgid "Volatile" msgstr "Nestalno" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:199 msgid "Persistent" msgstr "Stalno" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:222 msgid "No Proxy" msgstr "Bez proxya" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:224 #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:307 msgid "System Default" msgstr "Početno stanje" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:238 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:140 msgid "Connection" msgstr "Veza" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:242 msgid "Interface" msgstr "Sučelje" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:246 msgid "Servers" msgstr "Poslužitelji" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:253 msgid "Filters" msgstr "Filteri" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:257 msgid "Logging" msgstr "Zapisivanje" #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:642 msgid "Nicknames(s) field must not be empty." msgstr "Polje za nadimak ne smije biti prazno." #: ../src/Frontend-GNOME/Preferences/PreferencesDialog.cs:823 #, csharp-format msgid "Invalid highlight regex: '{0}'. Reason: {1}" msgstr "Nepoznati regularni izraz za isticanje: '{0}'. Razlog: {1}" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:81 #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:106 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:271 msgid "Name" msgstr "Ime" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:86 msgid "Topic" msgstr "Tema" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:115 msgid "" "Searching for group chats without a filter is not recommended. This may take a while, or may not work at all.\n" "Do you wish to continue?" msgstr "" "Pretraga za grupni chatom bez filtera nije preporučena. To bi moglo potrajati ili pak uopće ne raditi.\n" "Želite li nastaviti?" #: ../src/Frontend-GNOME/FindGroupChatDialog.cs:156 msgid "Error while fetching the list of group chats from the server." msgstr "Greška pri dohvaćanju popisa grupnih chatova sa poslužitelja" #: ../src/Frontend-GNOME/Frontend.cs:325 msgid "Disconnected from engine." msgstr "Više niste spojeni sa jezgrom." #: ../src/Frontend-GNOME/Frontend.cs:368 #, csharp-format msgid "Reconnecting to engine... (attempt {0})" msgstr "Ponovno spajanje sa jezgrom... (pokušaj broj {0})" #: ../src/Frontend-GNOME/Frontend.cs:465 #, csharp-format msgid "Cause: {0}" msgstr "Razlog: {0}" #: ../src/Frontend-GNOME/Frontend.cs:583 msgid "" "The frontend has lost the connection to the server.\n" "Do you want to reconnect now?" msgstr "" "Sučelje je izgubilo vezu sa poslužiteljem.\n" "Želite li se ponovno spojiti?" #: ../src/Frontend-GNOME/Frontend.cs:602 msgid "" "Reconnecting to the server has failed.\n" "Do you want to try again?" msgstr "" "Ponovno spajanje sa poslužiteljem nije uspjelo.\n" "Želite li pokušati ponovno?" #: ../src/Frontend-GNOME/Frontend.cs:705 msgid "" "The server has lost the connection to the frontend.\n" "Do you want to reconnect now?" msgstr "" "Poslužitelj je izgubio vezu sa sučeljem.\n" "Želite li se ponovno spojiti." #: ../src/Frontend-GNOME/NotifyManager.cs:267 msgid "Show" msgstr "Prikaži" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:62 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:238 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:70 msgid "Protocol" msgstr "Protokol" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:63 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:71 msgid "Hostname" msgstr "Naziv poslužitelja" #: ../src/Frontend-GNOME/QuickConnectDialog.cs:166 msgid "Unable to load server: " msgstr "Neuspjelo učitavanje poslužitelja:" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:54 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:244 msgid "Person / Private" msgstr "Osoba / Privatno" #: ../src/Frontend-GNOME/ChatTypeWidget.cs:55 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:245 msgid "Group / Public" msgstr "Grupa / Javno" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:71 msgid "Engine Assistant - Smuxi" msgstr "Pomoćnik za jezgre - Smuxi" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:93 msgid "Add Smuxi Engine" msgstr "Dodaj Smuxi jezgru" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:95 msgid "Edit Smuxi Engine" msgstr "Uredi Smuxi jezgru" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:204 msgid "Credentials" msgstr "Oznaka autoriteta" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:284 msgid "Now you can use the Smuxi Engine" msgstr "Sada možete koristiti Smuxi jezgru" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:287 msgid "Thank you" msgstr "Hvala" #: ../src/Frontend-GNOME/Views/Assistants/Engine/EngineAssistant.cs:304 msgid "" "An engine with this name already exists! Please specify a different one." msgstr "Jezgra tog imena već postoji! Molimo odaberite neko drugo ime." #: ../src/Frontend-GNOME/Views/MessageTextView.cs:204 #, csharp-format msgid "Day changed from {0} to {1}" msgstr "Dan se promijenio iz {0} u {1}" #: ../src/Frontend-GNOME/Views/MessageTextView.cs:210 #, csharp-format msgid "Day changed to {0}" msgstr "Dan promijenjen u {0}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:123 #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:133 #, csharp-format msgid "Invalid filter regex: '{0}'. Reason: {1}" msgstr "Nepravilan regularan izraz filtera: '{0}'. Razlog: {1}" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:200 msgid "Are you sure you want to delete the selected filter?" msgstr "Želite li sigurno ukloniti označeni filter?" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:246 msgid "Protocol / Server" msgstr "Protokol / Poslužitelj" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:253 msgid "Chat Type" msgstr "Način chata" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:287 msgid "Normal" msgstr "Normalno" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:288 msgid "Event" msgstr "Događaj" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:295 msgid "Type" msgstr "Način" #: ../src/Frontend-GNOME/Views/FilterListWidget.cs:321 msgid "Pattern" msgstr "Obrazac" #: ../src/Frontend-GNOME/Views/Chats/ChatView.cs:506 msgid "Low Bandwidth Mode is active: no messages synced." msgstr "" "Način rada sa niskom propusnošću je aktivan: nijedna poruka još nije " "sinkronizirana:" #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:245 #, csharp-format msgid "Retrieving user list for {0}..." msgstr "Dohvaćanje popisa korisnika za {0}..." #. TRANSLATOR: this string will be appended to the one above #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:279 msgid "done." msgstr "gotovo." #: ../src/Frontend-GNOME/Views/Chats/GroupChatView.cs:290 msgid "Person" msgstr "Osoba" #: ../src/Frontend-GNOME/Views/Chats/ProtocolChatView.cs:69 msgid "" "Closing the protocol chat will also close all open chats connected to it!\n" "Are you sure you want to do this?" msgstr "" "Zatvaranje protokolnog chata će također zatvoriti sve otvorene kartice koje su spojene!\n" "Želite li to sigurno učiniti?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:187 msgid "Are you sure you want to delete the selected server?" msgstr "Želite li sigurno ukloniti označeni poslužitelj?" #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:243 #: ../src/Frontend-GNOME/Preferences/ServerListView.cs:277 msgid "Unable to edit server: " msgstr "Nije moguće urediti poslužitelj: " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:24 msgid "Find" msgstr "Nađi" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:44 msgid "_Search for:" msgstr "_Traži:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:73 msgid "_Match Case" msgstr "_Razlikuj veliko i malo slovo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:85 msgid "Search _Backwards" msgstr "Traži _unatrag" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:97 msgid "_Wrap Around" msgstr "_Omotaj okolo" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ChatFindDialog.cs:110 msgid "Use _Regular Expressions" msgstr "Koristi _regularne izraze" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:23 msgid "Smuxi - Find Group Chat" msgstr "Smuxi - Pronađi grupni chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.FindGroupChatDialog.cs:47 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:73 msgid "_Name:" msgstr "_Ime:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.QuickConnectDialog.cs:19 msgid "Smuxi - Quick Connect" msgstr "Smuxi - Brzo spajanje" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:206 msgid "Smuxi - Preferences" msgstr "Smuxi - Postavke" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:295 msgid "Nicknames:" msgstr "Nadimci:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1430 msgid " User List Position " msgstr " Pozicioniranje popisa korisnika " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1441 msgid " Channel " msgstr " Kanal " #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1652 msgid "Channel Filters" msgstr "Filteri kanal" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.SteticPreferencesDialog.cs:1669 msgid "User Filters" msgstr "Korisnički filteri" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:42 msgid "Use _SSH Tunnel" msgstr "Koristi _SSH tunel" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:56 msgid "" "Enables the use of SSH for the connection. This has a " "small performance impact, but is more secure and required when using NAT or " "port-based firewalls" msgstr "" "Omogućava korištenje SSHa pri povezivanju. Dolazi po " "cijeni nižih performansi ali je sigurnije te potrebno pri korištenju NATa i " "određenih vatrozida." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:135 msgid "SSH _Host:" msgstr "SSH _poslužitelj:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:146 msgid "DNS or IP address and port of the SSH server" msgstr "DNS ili IP adresa i port SSH poslužitelja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:159 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:173 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:129 msgid "_Port:" msgstr "_Port;" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:186 msgid "DNS or IP address and port of the Smuxi server" msgstr "DNS ili IP adresa i port Smuxi poslužitelja" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantConnectionWidget.cs:199 msgid "_Smuxi Host:" msgstr "_Smuxi poslužitelj:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:52 msgid "_SSH Username: (optional)" msgstr "_SSH korisnički ime: (dodatno)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:75 msgid "" "Username which will be used to log into the SSH " "server" msgstr "" "Korisničko ime korišteno za prijavu na SSH " "poslužitelj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:95 msgid "_SSH Password: (optional)" msgstr "_SSH lozinka: (dodatno)" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:119 msgid "" "Password which will be used to log into the SSH server." " The password is optional if SSH key authorization is used (see " "below)." msgstr "" "Lozinka koja će biti korištena za prijavu na SSH " "poslužitelj. Lozinka nije obavezna ako se koristi SSH autorizacijski ključ " "(vidi dolje)." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:140 msgid "_SSH Keyfile: (optional)" msgstr "_SSH ključ: (dodatno)" #. Container child vbox17.Gtk.Box+BoxChild #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:148 msgid "Select a File" msgstr "Odaberite datoteku" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:161 msgid "" "SSH private keyfile which will be used to log into the " "SSH server" msgstr "" "SSH privatni ključ koji će biti korišten za prijavu na " "SSH poslužitelj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:181 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:188 msgid "_Username:" msgstr "_Korisničko ime:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:204 msgid "" "Username which will be used to log into the Smuxi " "server" msgstr "" "Korisničko ime korišteno za prijavu na Smuxi " "poslužitelj" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:224 #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:87 msgid "_Password:" msgstr "_Lozinka:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:248 msgid "Password of the user" msgstr "Korisnička lozinka" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:268 msgid "_Verify Password:" msgstr "_Potvrda lozinke:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantCredentialsWidget.cs:292 msgid "Repeat the password for verification" msgstr "Potvrdite lozinku ponovnim upisivanjem" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantIntroWidget.cs:19 msgid "" "Welcome to the Smuxi Engine Configuration Assistant.\n" "You need to enter some information before you can use the engine.\n" "\n" "Click \"Forward\" to begin." msgstr "" "Smuxi asistent za namještavanje jezgre vas pozdravlja.\n" "Morate unijeti određene podatke prije korištenja jezgre.\n" "\n" "Kliknite \"Naprijed\" za početak." #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:36 msgid "_Engine Name:" msgstr "_Naziv jezgre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:59 msgid "Profile name of the new engine" msgstr "Ime profila nove jezgre" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:80 msgid "_Default Engine:" msgstr "_Zadana jezgra:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:91 msgid "Use as new default engine" msgstr "Koristi kao novu zadanu jezgru" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.EngineAssistantNameWidget.cs:104 msgid "" "If enabled, the current engine will be the default next" " time Smuxi is started" msgstr "" "Ako uključena, nova jezgra će biti zadana pri sljedećem" " pokretanju Smuxi aplikacije" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:20 msgid "Smuxi - Open Chat" msgstr "Smuxi - Otvori chat" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.OpenChatDialog.cs:63 msgid "_Type:" msgstr "_Oblik:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:54 msgid "_Hostname:" msgstr "_Ime poslužitelja:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:75 msgid "_Network:" msgstr "_Mreža:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:198 msgid "_Protocol:" msgstr "_Protokol:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:222 msgid "Use Encryption" msgstr "Koristi enkripciju" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:234 msgid "Validate Server Certificate" msgstr "Utvrdi valjanost poslužiteljevog certifikata" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:254 msgid "_On Connect Commands:" msgstr "_Naredbe pri spajanju:" #: ../src/Frontend-GNOME/gtk-gui/Smuxi.Frontend.Gnome.ServerWidget.cs:265 msgid "_Ignore Commands" msgstr "_Ignoriraj naredbe" smuxi-1.1/config.rpath0000664000175000017500000004364714011467170015644 0ustar00meebeymeebey00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2007 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally 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. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # 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. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : 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 ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no 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].*|aix5*) 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 fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) 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 hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) 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 ;; hpux10*) if test "$with_gnu_ld" = no; then 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 fi ;; hpux11*) 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_direct=yes # 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*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) 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 ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix4* | aix5*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 2009 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:43+0200\n" "PO-Revision-Date: 2017-10-27 14:08+0000\n" "Last-Translator: Andres G. Aragoneses \n" "Language-Team: English (United Kingdom) (http://www.transifex.com/meebey/smuxi/language/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "" smuxi-1.1/po-Frontend-GNOME-XMPP/cs.po0000664000175000017500000000266714011526464020123 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-03 11:51+0000\n" "Last-Translator: RavuAlHemio \n" "Language-Team: Czech (http://www.transifex.com/projects/p/smuxi/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Soukromý pokec" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Kdo je" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Přidat ke kontaktům" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Pozvat do" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Přejmenovat" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Odebrat" smuxi-1.1/po-Frontend-GNOME-XMPP/zh_CN.po0000664000175000017500000000261114011526464020504 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-03 19:53+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "私聊" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "详情" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "添加到联系人" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "邀请加入" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "改名" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "移除" smuxi-1.1/po-Frontend-GNOME-XMPP/sk.po0000664000175000017500000000447214011526464020127 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2011-09-30 08:40+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "Op" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "Deop" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "Hlas" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "Ukončiť hlas" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "Vykopnúť" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "Vykopnúť + zakázať" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "Zakázať" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "Zrušiť zakázanie" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "Opýtať sa" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "Kto je" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "Pozvať na" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "Verzia" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "Čas" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "Informácie o používateľovi" smuxi-1.1/po-Frontend-GNOME-XMPP/el.po0000664000175000017500000000323014011526464020101 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-24 11:46+0000\n" "PO-Revision-Date: 2015-07-26 14:09+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: www.gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Ερώτημα" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Ποιος είναι" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Προσθήκη στις επαφές" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Πρόσκληση στο" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Μετονομασία" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Αφαίρεση" smuxi-1.1/po-Frontend-GNOME-XMPP/ro.po0000664000175000017500000000302614011526464020124 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:21+0000\n" "PO-Revision-Date: 2018-04-05 17:51+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > " "0 && n%100 < 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Interogare" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Cine este" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Adaugă la contacte" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Invită la" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Redenumește" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Elimină" smuxi-1.1/po-Frontend-GNOME-XMPP/fi.po0000664000175000017500000000244214011526464020103 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-03 10:38+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "" smuxi-1.1/po-Frontend-GNOME-XMPP/de.po0000664000175000017500000000264214011526464020077 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Bianca Mix , 2013 # JB, 2015 # Mirco Bauer , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-21 12:31+0000\n" "Last-Translator: JB\n" "Language-Team: German (http://www.transifex.com/projects/p/smuxi/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Zu Kontakten hinzufügen" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Einladen zu" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Umbenennen" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Entfernen" smuxi-1.1/po-Frontend-GNOME-XMPP/hu.po0000664000175000017500000000276114011526464020125 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 11:46+0000\n" "PO-Revision-Date: 2015-07-17 18:04+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Lekérdezés" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Kicsoda" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Hozzáadás a partnerekhez" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Meghívás" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Átnevezés" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Eltávolítás" smuxi-1.1/po-Frontend-GNOME-XMPP/ur.po0000664000175000017500000000410114011526464020125 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-11-30 04:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "" smuxi-1.1/po-Frontend-GNOME-XMPP/fr.po0000664000175000017500000000263114011526464020114 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-03 20:09+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Chat privé" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Ajouter aux contacts" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Inviter à" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Renommer" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Retirer" smuxi-1.1/po-Frontend-GNOME-XMPP/sr.po0000664000175000017500000000324114011526464020127 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:43+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Упит" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Ко-је" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Додајте у контакте" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Позови у" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Преименуј" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Уклони" smuxi-1.1/po-Frontend-GNOME-XMPP/sl.po0000664000175000017500000000313414011526464020122 0ustar00meebeymeebey00000000000000# 'smuxi/po-Frontend-GNOME-XMPP/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 14:42+0000\n" "PO-Revision-Date: 2016-03-11 22:58+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n" "%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Poizvej" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Kdo je" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Dodaj med stike" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Povabi v" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Preimenuj" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Odstrani" smuxi-1.1/po-Frontend-GNOME-XMPP/pl.po0000664000175000017500000000274214011526464020123 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2015 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # Piotr Drąg , 2015. # Aviary.pl , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:54+0200\n" "PO-Revision-Date: 2015-06-12 17:23+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Zapytanie" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Kim jest" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Dodaj do kontaktów" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Zaproś do" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Zmień nazwę" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Usuń" smuxi-1.1/po-Frontend-GNOME-XMPP/id.po0000664000175000017500000000264614011526464020107 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:43+0000\n" "PO-Revision-Date: 2017-04-20 14:01+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Kueri" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Tambah Ke Kontak" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Undang ke" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Ubah nama" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Hapus" smuxi-1.1/po-Frontend-GNOME-XMPP/es.po0000664000175000017500000000270514011526464020116 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Diego Garcia Mendoza , 2015 # Matías Bellone, 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-03 14:56+0000\n" "Last-Translator: Diego Garcia Mendoza \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Consulta" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Agregar a contactos" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Invitar a" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Renombrar" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Eliminar" smuxi-1.1/po-Frontend-GNOME-XMPP/Makefile.in.in0000664000175000017500000001600214011526464021614 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Frontend-GNOME-XMPP/pt.po0000664000175000017500000000425014011526464020127 0ustar00meebeymeebey00000000000000# Translation of smuxi-frontend-gnome-irc messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-frontend-gnome-irc package. # Américo Monteiro , 2010. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend-gnome-irc\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-19 12:40+0000\n" "PO-Revision-Date: 2015-11-17 10:18+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Consultar" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Quem é" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Adicionar aos contactos" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Convidar para" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Renomear" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Remover" #~ msgid "Op" #~ msgstr "Dar Op" #~ msgid "Deop" #~ msgstr "Retirar Op" #~ msgid "Voice" #~ msgstr "Dar Voz" #~ msgid "Devoice" #~ msgstr "Retirar Voz" #~ msgid "Kick" #~ msgstr "Expulsar" #~ msgid "Kick + Ban" #~ msgstr "Expulsar + Banir" #~ msgid "Ban" #~ msgstr "Banir" #~ msgid "Unban" #~ msgstr "Retirar dos Banidos" #~ msgid "CTCP" #~ msgstr "CTCP" #~ msgid "Ping" #~ msgstr "Ping" #~ msgid "Version" #~ msgstr "Versão" #~ msgid "Time" #~ msgstr "Hora" #~ msgid "Finger" #~ msgstr "Finger" #~ msgid "Userinfo" #~ msgstr "Informação do utilizador" smuxi-1.1/po-Frontend-GNOME-XMPP/it.po0000664000175000017500000000355614011526464020130 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # David Paleino , 2008. # # Vincenzo Campanella , 2009-2010, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend-gnome-irc\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-19 12:23+0200\n" "PO-Revision-Date: 2010-07-15 13:28+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:220 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:51 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:224 msgid "Query" msgstr "Messaggio privato" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:229 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:55 msgid "Add To Contacts" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:234 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:59 msgid "Invite to" msgstr "Invita a" #~ msgid "Op" #~ msgstr "Operatore" #~ msgid "Deop" #~ msgstr "Rimuovi l'operatore" #~ msgid "Voice" #~ msgstr "Dai la parola" #~ msgid "Devoice" #~ msgstr "Togli la parola" #~ msgid "Kick" #~ msgstr "Espelli (kick)" #~ msgid "Kick + Ban" #~ msgstr "Espelli (kick) e allontana (ban)" #~ msgid "Ban" #~ msgstr "Allontana (ban)" #~ msgid "Unban" #~ msgstr "Rimuovi l'allontanamento (unban)" #~ msgid "CTCP" #~ msgstr "CTCP" #~ msgid "Ping" #~ msgstr "Ping" #~ msgid "Version" #~ msgstr "Versione" #~ msgid "Time" #~ msgstr "Ora" #~ msgid "Finger" #~ msgstr "Finger" #~ msgid "Userinfo" #~ msgstr "Informazioni sull'utente" smuxi-1.1/po-Frontend-GNOME-XMPP/nl.po0000664000175000017500000000300514011526464020112 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:21+0000\n" "PO-Revision-Date: 2019-02-26 13:58+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Query" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Toevoegen aan contacten" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Uitnodigen voor" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Hernoemen" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Verwijderen" smuxi-1.1/po-Frontend-GNOME-XMPP/ru.po0000664000175000017500000000310614011526464020131 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:43+0200\n" "PO-Revision-Date: 2017-09-19 22:25+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Запрос" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Добавить в контакты" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Пригласить" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Переименовать" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Удалить" smuxi-1.1/po-Frontend-GNOME-XMPP/nb.po0000664000175000017500000000414214011526464020103 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2013-04-14 10:20+0200\n" "PO-Revision-Date: 2013-04-29 08:41+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/smuxi/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:384 msgid "Op" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:388 msgid "Deop" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:392 msgid "Voice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:396 msgid "Devoice" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:400 msgid "Kick" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:404 msgid "Kick + Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:408 msgid "Ban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:412 msgid "Unban" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:418 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:422 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:63 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:426 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:67 msgid "CTCP" msgstr "" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:435 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:74 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "" smuxi-1.1/po-Frontend-GNOME-XMPP/lt.po0000664000175000017500000000263514011526464020130 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-26 09:42+0000\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Užklausa" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Kas yra" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Pridėti Prie Kontaktų" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Kviesti į" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Pervadinti" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Šalinti" smuxi-1.1/po-Frontend-GNOME-XMPP/oc.po0000664000175000017500000000301014011526464020076 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # Cédric Valmary (totenoc.eu) , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&k" "eywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:48+0000\n" "PO-Revision-Date: 2016-03-16 19:43+0200\n" "Last-Translator: Cédric Valmary (totenoc.eu) \n" "Language-Team: Tot En Òc\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Chat privat" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Apondre als contactes" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Convidar a" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Renomenar" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Levar" smuxi-1.1/po-Frontend-GNOME-XMPP/POTFILES.in0000664000175000017500000000020314011526464020713 0ustar00meebeymeebey00000000000000src/Frontend-GNOME-XMPP/InviteToMenu.cs src/Frontend-GNOME-XMPP/XmppGroupChatView.cs src/Frontend-GNOME-XMPP/XmppPersonChatView.cs smuxi-1.1/po-Frontend-GNOME-XMPP/POTFILES.skip0000664000175000017500000000046314011526464021263 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Frontend-GNOME-XMPP/te.po0000664000175000017500000000232014011526464020110 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:06+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:219 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:227 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:233 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:239 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:257 msgid "Rename" msgstr "" smuxi-1.1/po-Frontend-GNOME-XMPP/ca.po0000664000175000017500000000412514011526464020070 0ustar00meebeymeebey00000000000000# msgid "" msgstr "" "Project-Id-Version: Smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: \n" "Last-Translator: Siegfried-Angel Gevatter Pujals \n" "Language-Team: Siegfried Gevatter \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "X-Poedit-Language: Catalan\n" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:340 msgid "Op" msgstr "Dóna l'estatus d'operador" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:344 msgid "Deop" msgstr "Treu l'estatus d'operador" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:348 msgid "Voice" msgstr "Dóna l'estatus de veu" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:352 msgid "Devoice" msgstr "Treu l'estatus de veu" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:356 msgid "Kick" msgstr "Expulsa" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:360 msgid "Kick + Ban" msgstr "Expulsa i bandeja" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:364 msgid "Ban" msgstr "Bandeja" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:368 msgid "Unban" msgstr "Readmet l'usuari" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:374 msgid "Query" msgstr "Conversa privada" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:378 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:61 msgid "Whois" msgstr "Informació de l'usuari" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:382 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:65 msgid "CTCP" msgstr "CTCP" #: ../src/Frontend-GNOME-IRC/IrcGroupChatView.cs:391 #: ../src/Frontend-GNOME-IRC/IrcPersonChatView.cs:72 msgid "Invite to" msgstr "Invita a" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:72 msgid "Ping" msgstr "Ping" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:77 msgid "Version" msgstr "Versió del client d'IRC" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:82 msgid "Time" msgstr "Hora" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:87 msgid "Finger" msgstr "Finger" #: ../src/Frontend-GNOME-IRC/CtcpMenu.cs:92 msgid "Userinfo" msgstr "Informació de l'usuari" smuxi-1.1/po-Frontend-GNOME-XMPP/sv.po0000664000175000017500000000265114011526464020137 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2015 # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-22 16:54+0000\n" "Last-Translator: flugsio \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Fråga" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Vem är" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Lägg till i kontakter" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Bjud in till" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Byt namn" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Ta bort" smuxi-1.1/po-Frontend-GNOME-XMPP/tr.po0000664000175000017500000000262314011526464020133 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:36+0200\n" "PO-Revision-Date: 2015-05-14 20:46+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Özel Sohbet" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Rehber'e Ekle" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Şuraya Davet Et" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Yeniden Adlandır" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Kaldır" smuxi-1.1/po-Frontend-GNOME-XMPP/pt_BR.po0000664000175000017500000000304714011526464020515 0ustar00meebeymeebey00000000000000# Brazilian Portuguese for smuxi-Frontend-GNOME-XMPP # Copyright (C) 2016 THE smuxi'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Rafael Fontenelle , 2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:48+0000\n" "PO-Revision-Date: 2016-03-09 13:15-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Consultar" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Quem é" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Adicionar aos contatos" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Convidar para" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Renomear" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Remover" smuxi-1.1/po-Frontend-GNOME-XMPP/fa.po0000664000175000017500000000231214011526464020067 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:06+0100\n" "PO-Revision-Date: 2013-12-05 18:36+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:219 msgid "Query" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:227 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:233 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:239 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:257 msgid "Rename" msgstr "" smuxi-1.1/po-Frontend-GNOME-XMPP/da.po0000664000175000017500000000272214011526464020072 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:48+0000\n" "PO-Revision-Date: 2015-05-03 19:24+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Forespørgsel" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Hvem er" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Tilføj til kontakter" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Inviter til" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Omdøb" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Fjern" smuxi-1.1/po-Frontend-GNOME-XMPP/hr.po0000664000175000017500000000276414011526464020125 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # tty, 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2020-09-04 11:29+0000\n" "PO-Revision-Date: 2020-09-19 19:47+0200\n" "Last-Translator: gogo \n" "Language-Team: Croatian (http://www.transifex.com/meebey/smuxi/language/" "hr/)\n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Poedit 2.3\n" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:247 msgid "Query" msgstr "Upit" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:255 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:215 msgid "Whois" msgstr "Whois naredba" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:261 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:221 msgid "Add To Contacts" msgstr "Dodaj u kontakte" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:267 #: ../src/Frontend-GNOME-XMPP/XmppPersonChatView.cs:227 msgid "Invite to" msgstr "Pozovi u" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:285 msgid "Rename" msgstr "Preimenuj" #: ../src/Frontend-GNOME-XMPP/XmppGroupChatView.cs:297 msgid "Remove" msgstr "Ukloni" smuxi-1.1/po-Frontend/0000775000175000017500000000000014011526503015510 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Frontend/LINGUAS0000664000175000017500000000014314011526464016541 0ustar00meebeymeebey00000000000000ca cs da de el en_GB es fa fi fr hr hu id it lt nl oc pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Frontend/en_GB.po0000664000175000017500000000525514011526464017037 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2009 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # Ryan Smith-Evans , 2009. # msgid "" msgstr "" "Project-Id-Version: smuxi 0.6.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-09 21:43+0100\n" "PO-Revision-Date: 2010-01-09 00:08+0100\n" "Last-Translator: Ryan Smith-Evans \n" "Language-Team: English (British)\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/Frontend/CommandManager.cs:144 #, csharp-format msgid "Unknown Command: {0}" msgstr "Unknown Command: {0}" #: ../src/Frontend/EngineManager.cs:292 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Unknown channel ({0}). Only the following channel types are supported:" #: ../src/Frontend/EngineManager.cs:301 msgid "Registration with engine failed! The username and/or password were wrong - please verify them." msgstr "Registration with engine failed! The username and/or password are incorrect - please verify them." #: ../src/Frontend/SshTunnelManager.cs:146 msgid "SSH client application was not found: " msgstr "SSH client application was not found: " #: ../src/Frontend/SshTunnelManager.cs:149 msgid "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:186 #, csharp-format msgid "The local SSH forwarding port {0} is already in use. Is there an old SSH tunnel still active?" msgstr "The local SSH forwarding port {0} is already in use. Is there an old SSH tunnel still active?" #: ../src/Frontend/SshTunnelManager.cs:210 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "SSH tunnel setup failed with (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:405 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Couldn't get OpenSSH version (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:441 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink requires a username to be set." smuxi-1.1/po-Frontend/cs.po0000664000175000017500000000765314011526464016476 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:34+0200\n" "PO-Revision-Date: 2013-05-22 18:03+0000\n" "Last-Translator: RavuAlHemio \n" "Language-Team: Czech (http://www.transifex.com/projects/p/smuxi/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Neznámý příkaz: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nedostatek parametrů pro příkaz {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Engine nesmí být prázdný." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Engine neexistuje." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Neznámý kanál ({0}) - podporovány jsou pouze následující typy kanálů:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "Registrace selhala! Uživatelské jméno nebo heslo bylo chybné - zkontrolujte je prosím." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Klientská aplikace SSH nebyla nalezena: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "Klient SSH musí být buď OpenSSH (ssh) nebo Plink (plink.exe, nikoli putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "Místní předávání portu SSH {0} se již používá. Není stále aktivní dřívější tunel SSH?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Nastavení tunelu SSH selhalo (návratový kód: {0})\n" "\n" "Program SSH: {1}\n" "Parametry SSH: {2}\n" "\n" "Chyba programu:\n" "{3}\n" "Výstup programu:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Soubor s klíčem SSH nenalezen." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Načtení souboru s klíčem SSH se nezdařilo." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nenalezeno číslo verze OpenSSH (návratový kód: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Chyba programu:\n" "{2}\n" "Výstup programu:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink potřebuje mít nastavené uživatelské jméno." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Číslo verze programu Plink nenalezeno (návratový kód: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Chyba programu:\n" "{2}\n" "\n" "Výstup programu:\n" "{3}\n" smuxi-1.1/po-Frontend/zh_CN.po0000664000175000017500000000715414011526464017066 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:34+0200\n" "PO-Revision-Date: 2013-12-13 08:18+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "未知命令: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "{0} 命令参数不足" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "引擎不能为空。" #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "引擎不存在。" #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "未知频道 ({0}) - 仅支持下列频道类型:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "引擎注册失败! 用户名和/或密码错误 - 请验证。" #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "未找到 SSH 客户端应用程序: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "SSH 客户端必须为 OpenSSH (ssh) 或 Plink (plink.exe, 而非 putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "本地 SSH 转发端口 {0} 已被占用。是不是还有旧版 SSH 隧道处于活动状态?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "SSH 隧道安装失败 (退出代码: {0})\n\nSSH 程序: {1}\nSSH 参数: {2}\n\n程序错误:\n{3}\n程序输出:\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "未找到 SSH 密钥文件。" #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "无法读取 SSH 密钥文件。" #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "未发现 OpenSSH 版本号 (退出代码: {0})\n\nSSH 程序: {1}\n\n程序错误:\n{2}\n程序输出:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink 需要设置用户名。" #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Plink 版本号未找到 (退出代码: {0})\n\nSSH 程序: {1}\n\n程序错误:\n{2}\n程序输出:\n{3}\n" smuxi-1.1/po-Frontend/sk.po0000664000175000017500000000700114011526464016471 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2011-12-29 08:45+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../src/Frontend/CommandManager.cs:143 #, csharp-format msgid "Unknown Command: {0}" msgstr "Neznámy príkaz: {0}" #: ../src/Frontend/EngineManager.cs:122 msgid "Engine must not be empty." msgstr "" #: ../src/Frontend/EngineManager.cs:133 msgid "Engine does not exist." msgstr "" #: ../src/Frontend/EngineManager.cs:318 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Neznámy kanál ({0}) - podporované sú len nasledujúce typy kanálov:" #: ../src/Frontend/EngineManager.cs:327 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Registrácia zlyhala! Používateľské meno alebo heslo bolo chybné - " "skontrolujte ich prosím." #: ../src/Frontend/SshTunnelManager.cs:145 msgid "SSH client application was not found: " msgstr "Klientská aplikácia SSH nebola nájdená: " #: ../src/Frontend/SshTunnelManager.cs:148 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Klient SSH musí byť buď OpenSSH (ssh) alebo Plink (plink.exe, nie putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:185 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Miestny forwarding SSH portu {0} sa už používa. Nie je stále aktívny " "predošlý tunel SSH?" #: ../src/Frontend/SshTunnelManager.cs:209 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Nastavenie tunelu SSH zlyhalo (exit code: {0})\n" "\n" "Program SSH: {1}\n" "Parametre SSH: {2}\n" "\n" "Chyba programu:\n" "{3}\n" "Výstup programu:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:330 #: ../src/Frontend/SshTunnelManager.cs:476 msgid "SSH keyfile not found." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:336 #: ../src/Frontend/SshTunnelManager.cs:482 msgid "SSH keyfile could not be read." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:424 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nájdené číslo verzie OpenSSH (exit code: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Chyba programu:\n" "{2}\n" "Výstup programu:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:467 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink potrebuje mať nastavené používateľské meno." #: ../src/Frontend/SshTunnelManager.cs:555 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" smuxi-1.1/po-Frontend/el.po0000664000175000017500000001163214011526464016461 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:42+0000\n" "PO-Revision-Date: 2015-07-20 11:57+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Άγνωστη εντολή: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ανεπαρκείς παράμετροι για την εντολή {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Το μηχάνημα δεν πρέπει να είναι κενή." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Το μηχάνημα δεν υπάρχει." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Άγνωστο κανάλι ({0}) - υποστηρίζονται μόνο οι παρακάτω τύποι καναλιού:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Η καταχώριση με το μηχάνημα απέτυχε! Το όνομα χρήστη και/ή ο κωδικός " "πρόσβασης ήταν εσφαλμένοι - παρακαλούμε επιβεβαιώστε τα." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Η εφαρμογή πελάτη SSH δε βρέθηκε: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Ο πελάτης SSH πρέπει να είναι είτε OpenSSH (ssh) ή Plink (plink.exe, όχι " "putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Η τοπική θύρα προώθησης SSH {0} χρησιμοποιείται ήδη. Υπάρχει κάποια παλιά " "διοχέτευση SSH που είναι ακόμα ενεργή;" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Η ρύθμιση διοχέτευσης SSH απέτυχε (κώδικας εξόδου: {0})\n" "\n" "Πρόγραμμα SSH: {1}\n" "Παράμετροι SSH: {2}\n" "\n" "Σφάλμα προγράμματος:\n" "{3}\n" "Έξοδος προγράμματος:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Το αρχείο κλειδιού SSH δεν βρέθηκε." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Το αρχείο κλειδιού SSH δεν μπόρεσε να διαβαστεί." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Ο αριθμός έκδοσης του OpenSSH δεν βρέθηκε (κώδικας εξόδου: {0})\n" "\n" "Πρόγραμμα SSH: {1}\n" "\n" "Σφάλμα προγράμματος:\n" "{2}\n" "Έξοδος προγράμματος:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "Το PuTTY / Plink απαιτεί ένα όνομα χρήστη για να ρυθμιστεί." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Ο αριθμός έκδοσης του Plink δεν βρέθηκε (κώδικας εξόδου: {0})\n" "\n" "Πρόγραμμα SSH: {1}\n" "\n" "Σφάλμα προγράμματος:\n" "{2}\n" "Έξοδος προγράμματος:\n" "{3}\n" smuxi-1.1/po-Frontend/ro.po0000664000175000017500000001011214011526464016471 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:20+0000\n" "PO-Revision-Date: 2018-04-06 23:40+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Frontend/CommandManager.cs:479 #, csharp-format msgid "Unknown Command: {0}" msgstr "Comandă necunoscută: {0}" #: ../src/Frontend/CommandManager.cs:488 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nu sunt suficienți parametri pentru comanda {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Motorul nu trebuie să fie gol." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Motorul nu există." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Canal necunoscut ({0}) - doar următoarele tipuri de canale sunt suportate:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Înregistrarea cu motorul a eșuat! Numele de utilizator și/sau parola au " "fost greșite - trebuie să le verificați." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Nu s-a găsit aplicația client SSH: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Clientul SSH trebuie să fie ori OpenSSH (ssh) ori Plink (plink.exe, nu putty." "exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Portul SSH local de înaintare {0} este deja în uz. Există un tunel SSH vechi " "încă activ?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Configurarea tunelului SSH a eșuat (cod de ieșire: {0})\n" "\n" "Program SSH: {1}\n" "Parametri SSH: {2}\n" "\n" "Eroare de program:\n" "{3}\n" "Rezultat program:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Nu s-a găsit fișierul de cheie SSH." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Nu s-a putut citi fișierul de cheie SSH." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nu s-a găsit numărul de versiune al OpenSSH (cod de ieșire: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Eroare de program:\n" "{2}\n" "Rezultat program:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink necesită configurarea unui nume de utilizator." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nu s-a găsit numărul de versiune al Plink (cod de ieșire: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Eroare de program:\n" "{2}\n" "Rezultat program:\n" "{3}\n" smuxi-1.1/po-Frontend/fi.po0000664000175000017500000000744114011526464016462 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:34+0200\n" "PO-Revision-Date: 2013-08-23 06:09+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Tuntematon komento: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ei tarpeeksi parametrejä {0} -komennolle" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Moottori ei saa olla tyhjä." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Moottoria ei ole olemassa." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Tuntematon kanava ({0}) - vain seuraavia kanavatyyppejä tuetaan:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "Rekisteröinti moottorin kanssa epäonnistui! Käyttäjänimi ja/tai salasana väärin - ole hyvä ja tarkista ne." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "SSH-asiakasohjelmaa ei löytynyt:" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "SSH-asiakasohjelman on oltava OpenSSH (ssh) tai Plink (plink.exe, ei putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "Paikallinen SSH-edelleenohjausportti {0} on jo käytössä. Onko vanha SSH-tunneli edelleen aktiivinen?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "SSH-tunnelin pystytys epäonnistui (exit-koodi: {0})\n\nSSH-ohjelma: {1}\nSSH-parametrit: {2}\n\nOhjelmavirhe:\n{3}\nOhjelman tuloste:\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "SSH-avaintiedostoa ei löytynyt." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "SSH-avaintiedostoa ei voitu lukea." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "OpenSSH:n versionumeroa ei löytynyt (exit-koodi: {0})\n\nSSH-ohjelma: {1}\n\nOhjelmavirhe:\n{2}\nOhjelman tuloste:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink vaatii että käyttäjänimi on asetettu." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Plink:in versionumeroa ei löytynyt (exit-koodi: {0})\n\nSSH-ohjelma: {1}\n\nOhjelmavirhe:\n{2}\nOhjelman tuloste:\n{3}\n" smuxi-1.1/po-Frontend/de.po0000664000175000017500000000776314011526464016463 0ustar00meebeymeebey00000000000000# German translation for smuxi-Frontend. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2011, 2013. # Mario Blättermann , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:03+0100\n" "PO-Revision-Date: 2016-01-08 15:06+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Frontend/CommandManager.cs:343 #, csharp-format msgid "Unknown Command: {0}" msgstr "Unbekannter Befehl: {0}" #: ../src/Frontend/CommandManager.cs:352 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nicht genügend Parameter für Befehl {0}" #: ../src/Frontend/EngineManager.cs:122 msgid "Engine must not be empty." msgstr "Engine darf nicht leer sein." #: ../src/Frontend/EngineManager.cs:133 msgid "Engine does not exist." msgstr "Engine existiert nicht." #: ../src/Frontend/EngineManager.cs:317 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Unbekannter Kanal ({0}) - nur die folgenden Kanal-Typen werden unterstützt:" #: ../src/Frontend/EngineManager.cs:326 msgid "Registration with engine failed! The username and/or password were wrong - please verify them." msgstr "Registierung gegenüber der Engine ist fehlgeschlagen. Benutzer und/oder Passwort ist falsch, bitte überprüfen Sie Ihre Eingabe." #: ../src/Frontend/SshTunnelManager.cs:144 msgid "SSH client application was not found: " msgstr "SSH-Client-Programm wurde nicht gefunden: " #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "SSH-Client muss entweder OpenSSH (ssh) oder Plink (plink.exe, nicht putty.exe) sein" #: ../src/Frontend/SshTunnelManager.cs:184 #, csharp-format msgid "The local SSH forwarding port {0} is already in use. Is there an old SSH tunnel still active?" msgstr "Der lokale SSH-Weiterleitungs-Port {0} wird bereits verwendet. Ist noch ein alter SSH-Tunnel aktiv?" #: ../src/Frontend/SshTunnelManager.cs:208 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Aufbau des SSH-Tunnels ist fehlgeschlagen (Exit-Code: {0})\n" "\n" "SSH-Programm: {1}\n" "SSH-Parameter: {2}\n" "\n" "Programm-Fehler:\n" "{3}\n" "Programm-Ausgabe:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:329 ../src/Frontend/SshTunnelManager.cs:478 msgid "SSH keyfile not found." msgstr "SSH-Schlüsseldatei nicht gefunden." #: ../src/Frontend/SshTunnelManager.cs:335 ../src/Frontend/SshTunnelManager.cs:484 msgid "SSH keyfile could not be read." msgstr "SSH-Schlüsseldatei konnte nicht gelesen werden." #: ../src/Frontend/SshTunnelManager.cs:426 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "OpenSSH-Version konnte nicht ermittelt werden (Exit-Code: {0})\n" "\n" "SSH-Programm: {1}\n" "\n" "Programm-Fehler:\n" "{2}\n" "Programm-Ausgabe:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:469 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY/Plink fordert einen gesetzten Benutzernamen." #: ../src/Frontend/SshTunnelManager.cs:557 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Plink-Versionsnummer nicht gefunden (Rückgabewert: {0})\n" "\n" "SSH-Programm: {1}\n" "\n" "Programm-Fehler:\n" "{2}\n" "Programm-Ausgabe:\n" "{3}\n" smuxi-1.1/po-Frontend/hu.po0000664000175000017500000001001714011526464016471 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 17:47+0000\n" "PO-Revision-Date: 2015-07-17 23:58+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Ismeretlen parancs: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Nincs elég paraméter a következő parancshoz: {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "A motor nem lehet üres." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "A motor nem létezik." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Ismeretlen csatorna ({0}) - csak a következő csatornatípusok támogatottak:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "A motorral történő regisztráció sikertelen! A felhasználónév és/vagy jelszó " "hibás volt - ellenőrizze azokat." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "SSH-kliens alkalmazás nem volt található: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Az SSH-kliens vagy OpenSSH (ssh), vagy Plink (plink.exe, nem putty.exe) lehet" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "A helyi SSH továbbítási port {0} már használatban van. Van egy régi " "SSH-alagút, amely még mindig aktív?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Az SSH-alagút beállítása sikertelen (kilépési kód: {0})\n" "\n" "SSH program: {1}\n" "SSH paraméterek: {2}\n" "\n" "Programhiba:\n" "{3}\n" "Program kimenete:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Az SSH-kulcsfájl nem található." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Az SSH-kulcsfájl nem olvasható." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Az OpenSSH verziószám nem található (kilépési kód: {0})\n" "\n" "SSH program: {1}\n" "\n" "Programhiba:\n" "{2}\n" "Program kimenete:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "A PuTTY / Plink egy beállított felhasználónevet igényel." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "A Plink verziószám nem található (kilépési kód: {0})\n" "\n" "SSH program: {1}\n" "\n" "Programhiba:\n" "{2}\n" "Program kimenete:\n" "{3}\n" smuxi-1.1/po-Frontend/ur.po0000664000175000017500000000522414011526464016507 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2010-11-30 04:13+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Frontend/CommandManager.cs:143 #, csharp-format msgid "Unknown Command: {0}" msgstr "" #: ../src/Frontend/EngineManager.cs:122 msgid "Engine must not be empty." msgstr "" #: ../src/Frontend/EngineManager.cs:133 msgid "Engine does not exist." msgstr "" #: ../src/Frontend/EngineManager.cs:318 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" #: ../src/Frontend/EngineManager.cs:327 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:145 msgid "SSH client application was not found: " msgstr "" #: ../src/Frontend/SshTunnelManager.cs:148 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:185 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:209 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:330 #: ../src/Frontend/SshTunnelManager.cs:476 msgid "SSH keyfile not found." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:336 #: ../src/Frontend/SshTunnelManager.cs:482 msgid "SSH keyfile could not be read." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:424 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:467 msgid "PuTTY / Plink requires a username to be set." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:555 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" smuxi-1.1/po-Frontend/fr.po0000664000175000017500000000767014011526464016477 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2011 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:34+0200\n" "PO-Revision-Date: 2013-04-29 08:41+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Commande inconnue : {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pas assez de paramètres pour la commande {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Le moteur ne doit pas être vide." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Le moteur n'existe pas." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Canal inconnu ({0}), seuls les types de canaux suivants sont supportés :" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "Impossible de s'enregistrer auprès du moteur, le nom d'utilisateur et/ou le mot de passe était(ent) mauvais, veuillez le(s) vérifier." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "L'application SSH client n'a pas été trouvée :" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "Le client SSH doit être soit OpenSSH (ssh) ou Plink (plink.exe, et non putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "La redirection locale de port {0} est toujours en cours d'utilisation. L'ancien tunnel SSH est-il toujours actif ?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "Mise en route du tunnel SSH échouée (code de sortie : {0})\n\nProgramme SSH : {1}\nParamètres SSH : {2}\n\nErreur du programme :\n{3}\nSortie du programme :\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Fichier de clé SSH introuvable" #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Impossible de lire le fichier de clé SSH." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Impossible de trouver la version d'OpenSSH (code de sortie: {0})\n\nProgramme SSH: {1}\n\nErreur du programme:\n{2}\nSortie du programme:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY ou Plink nécessitent un nom d'utilisateur pour fonctionner." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Numéro de version Plink non trouvé (code de retour : {0})\n\nProgramme SSH : {1}\n\nErreur du programme : \n{2}\nSortie du programme : \n{3}\n" smuxi-1.1/po-Frontend/sr.po0000664000175000017500000001165314011526464016510 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:42+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Непозната наредба: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Нема довољно параметара за наредбу „{0}“" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Погон не сме бити празан." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Погон не постоји." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Непознат канал ({0}) — само следеће врсте канала су подржане:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Регистрација са погоном није успела! Корисничко име и/или лозинка су " "погрешни — проверите их." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Нисам нашао програм клијента безбедне шкољке: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Клијент безбедне шкољке мора бити или ОтворенаБШ (ssh) или Плинк („plink." "exe“, а не „putty.exe“)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Локални прикључник {0} прослеђивања безбедне шкољке је већ у употреби. Да " "није још увек активан неки стари тунел безбедне шкољке?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Подешавање тунела безбедне шкољке није успело (излазни код: {0})\n" "\n" "Програм БШ: {1}\n" "Параметри БШ: {2}\n" "\n" "Грешка програма:\n" "{3}\n" "Излаз програма:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Нисам нашао датотеку кључа безбедне шкољке." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Не могу да прочитам датотеку кључа безбедне шкољке." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Нисам нашао број издања ОтворенеБШ (код излаза: {0})\n" "\n" "Програм БШ: {1}\n" "\n" "Грешка програма:\n" "{2}\n" "Излаз програма:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "„PuTTY / Plink“ захтевају корисничко име да би били подешени." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Нисам нашао број издања Плинка (код излаза: {0})\n" "\n" "Програм БШ: {1}\n" "\n" "Грешка програма:\n" "{2}\n" "Излаз програма:\n" "{3}\n" smuxi-1.1/po-Frontend/sl.po0000664000175000017500000000575214011526464016505 0ustar00meebeymeebey00000000000000#'smuxi/po-Frontend/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:40+0000\n" "PO-Revision-Date: 2016-03-11 21:40+0000\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "" #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "" #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" smuxi-1.1/po-Frontend/pl.po0000664000175000017500000001007014011526464016467 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-09-10 06:04+0200\n" "PO-Revision-Date: 2016-09-10 06:05+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Nieznane polecenie: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Brak wystarczającej liczby parametrów dla polecenia {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Mechanizm nie może być pusty." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Mechanizm nie istnieje." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Nieznany kanał ({0}) — obsługiwane są tylko następujące typy kanałów:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Rejestracja mechanizmu się nie powiodła. Nazwa użytkownika lub hasło są " "niepoprawne — proszę je sprawdzić." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Nie odnaleziono klienta SSH: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Klientem SSH musi być albo OpenSSH (ssh) albo Plink (plink.exe, nie putty." "exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Lokalny port przekierowania SSH {0} jest już używany. Czy poprzedni tunel " "SSH jest nadal aktywny?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Ustawienie tunelu SSH się nie powiodło (kod wyjścia: {0})\n" "\n" "Program SSH: {1}\n" "Parametry SSH: {2}\n" "\n" "Błąd programu:\n" "{3}\n" "Dane wyjściowe programu:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Nie odnaleziono pliku z kluczem SSH." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Nie można odczytać pliku z kluczem SSH." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nie odnaleziono numeru wersji programu OpenSSH (kod wyjścia: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Błąd programu:\n" "{2}\n" "Dane wyjściowe programu:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "Program PuTTY/Plink wymaga ustawienia nazwy użytkownika." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nie odnaleziono numeru wersji programu Plink (kod wyjścia: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Błąd programu:\n" "{2}\n" "Dane wyjściowe programu:\n" "{3}\n" smuxi-1.1/po-Frontend/id.po0000664000175000017500000000750614011526464016462 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Andika Triwidada , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi frontend master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-05-05 14:40+0000\n" "PO-Revision-Date: 2016-07-25 05:26+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: \n" "X-Generator: Poedit 1.8.8\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Perintah Tak Dikenal: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parameter tidak cukup untuk perintah {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Mesin tak boleh kosong." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Mesin tidak ada." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Kanal tak dikenal ({0}) - hanya tipe kanal berikut yang didukung:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Registrasi ke mesin gagal! Nama pengguna dan/atau kata sandi salah - harap " "periksa mereka." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Aplikasi klien SSH tidak ditemukan:" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "Klien SSH mesti OpenSSH (ssh) atau Plink (plink.exe, bukan putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Port penerusan SSH lokal {0} sudah dipakai. Apakah ada tunnel SSH lama yang " "masih aktif?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Penyiapan tunnel SSH gagal (kode keluar: {0})\n" "\n" "Program SSH: {1}\n" "Parameter SSH: {2}\n" "\n" "Kesalahan Program:\n" "{3}\n" "Keluaran Program:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Berkas kunci SSH tak ditemukan." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Berkas kunci SSH tak bisa dibaca." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nomor versi OpenSSH tak ditemukan (kode keluar: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Kesalahan Program:\n" "{2}\n" "Keluaran Program:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink memerlukan ditatanya suatu nama pengguna." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Nomor versi Plink tak ditemukan (kode keluar: {0})\n" "\n" "Program SSH: {1}\n" "\n" "Kesalahan Program:\n" "{2}\n" "Keluaran Program:\n" "{3}\n" smuxi-1.1/po-Frontend/es.po0000664000175000017500000001012314011526464016462 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 # Ricardo A. Hermosilla Carrillo , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-06-30 07:00+0000\n" "PO-Revision-Date: 2013-12-10 18:57+0000\n" "Last-Translator: Matías Bellone\n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/" "es/)\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Orden desconocida: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Faltan parámetros para la orden {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "El motor no puede estar vacío." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "El motor no existe." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Canal desconocido ({0}) - sólo se es compatible con los siguientes tipos de " "canales:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "¡Falló la registración con el motor! El usuario y/o la contraseña son " "no válidos - verifíquelos. " #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "No se encontró el programa del cliente SSH:" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "El cliente SSH debe ser OpenSSH (ssh) o Plink (plink.exe, no putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "El puerto local SSH {0} está actualmente en uso. ¿Existe todavía un túnel " "SSH antiguo activo?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Falló la configuración del túnel SSH (código de salida: {0})\n" "\n" "Programa SSH: {1}\n" "Parámetros SSH: {2}\n" "\n" "Error del programa:\n" "{3}\n" "Salida del programa:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "No se econtró el archivo de claves SSH." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "No se pudo leer el archivo de claves SSH." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "No ha sido posible obtener la versión de OpenSSH (código de salida: {0})\n" "\n" "Programa SSH: {1}\n" "\n" "Error del programa:\n" "{2}\n" "Salida del programa:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink necesita que configure un usuario." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "No se encontró la versión de Plink (código de salida: {0})\n" "\n" "Programa SSH: {1}\n" "\n" "Error del programa:\n" "{2}\n" "\n" "Salida del programa:\n" "{3}\n" smuxi-1.1/po-Frontend/Makefile.in.in0000664000175000017500000001576714011526464020210 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_FRONTEND@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Frontend/pt.po0000664000175000017500000001033214011526464016500 0ustar00meebeymeebey00000000000000# Translation of smuxi-frontend messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-frontend package. # Américo Monteiro , 2010. # Pedro Ribeiro , 2012. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi-frontend\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-19 12:39+0000\n" "PO-Revision-Date: 2015-11-17 09:36+0000\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Comando desconhecido: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Não existem parâmetros suficientes para o comando {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "O motor não pode estar vazio" #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "O motor não existe." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Canal desconhecido ({0}) - só os seguintes tipos de canais são suportados:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "O registo com o motor falhou! O nome de utilizador e/ou a senha estavam " "errados - por favor, verifique-os." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "A aplicação cliente SSH não foi encontrada: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "O cliente SSH tem de ser OpenSSH (ssh) ou Plink (plink.exe, não putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "A porta de encaminhamento de SSH local {0} já está em uso. Há algum túnel " "SSH antigo ainda ativo?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Configuração do túnel SSH falhou (código ao terminar: {0})\n" "\n" "Programa SSH: {1}\n" "Parâmetros SSH: {2}\n" "\n" "Erro do programa:\n" "{3}\n" "Saída do programa:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Ficheiro de chaves SSH não encontrado." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Ficheiro de chaves SSH não pôde ser lido." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Número de versão de OpenSSH não encontrado (código ao terminar: {0})\n" "\n" "Programa SSH: {1}\n" "\n" "Erro do programa:\n" "{2}\n" "Saída do programa:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY/Plink requer que seja definido um nome de utilizador." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Número de versão de Plink não encontrado (código ao terminar: {0})\n" "\n" "Programa SSH: {1}\n" "\n" "Erro do programa:\n" "{2}\n" "Saída do programa:\n" "{3}\n" smuxi-1.1/po-Frontend/it.po0000664000175000017500000000552714011526464016503 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # # Vincenzo Campanella , 2009-2010, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-frontend\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-07-15 13:15+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/Frontend/CommandManager.cs:143 #, csharp-format msgid "Unknown Command: {0}" msgstr "Comando sconosciuto: {0}" #: ../src/Frontend/EngineManager.cs:292 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Il canale {0} è sconosciuto. Sono supportati solo i seguenti tipi di canale:" #: ../src/Frontend/EngineManager.cs:301 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "La registrazione con il motore non è riuscita: il nome utente o la password " "sono errati. Verificarli." #: ../src/Frontend/SshTunnelManager.cs:146 msgid "SSH client application was not found: " msgstr "Non è stata trovata l'applicazione client di SSH: " #: ../src/Frontend/SshTunnelManager.cs:149 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Il client SSH deve essere OpenSSH (ssh) o Plink (plink.exe, non putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:186 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "La porta d'inoltro locale di SSH {0} è già utilizzata. Controllare se è " "ancora attivo un vecchio tunnel SSH." #: ../src/Frontend/SshTunnelManager.cs:210 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Impostazione del tunnel SSH non riuscita (codice di uscita: {0})\n" "\n" "Programma SSH: {1}\n" "Parametri SSH: {2}\n" "\n" "Errore del programma:\n" "{3}\n" "Output del programma:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:405 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Numero di versione di OpenSSH non trovato (codice di uscita: {0})\n" "\n" "Programma SSH: {1}\n" "\n" "Errore del programma:\n" "{2}\n" "Output del programma:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:441 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink richiede l'impostazione di un nome utente." smuxi-1.1/po-Frontend/nl.po0000664000175000017500000000775314011526464016503 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:19+0000\n" "PO-Revision-Date: 2019-03-10 15:18+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Frontend/CommandManager.cs:479 #, csharp-format msgid "Unknown Command: {0}" msgstr "Onbekende opdracht: {0}" #: ../src/Frontend/CommandManager.cs:488 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Onvoldoende parameters voor opdracht {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Engine mag niet leeg zijn." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Engine bestaat niet." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Onbekend kanaal ({0}) - alleen de volgende kanaaltypes worden ondersteund:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Registratie van engine mislukt! De gebruikersnaam en/of het wachtwoord waren " "onjuist - gelieve deze te controleren." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "SSH-cliënttoepassing niet gevonden: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "SSH-cliënt dient OpenSSH (ssh) of Plink (plink.exe, niet putty.exe) te zijn" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "De lokale SSH-doorstuurpoort {0} is reeds in gebruik. Is er nog een oudere " "SSH-tunnel actief?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Instellen van SSH-tunnel mislukt (exitcode: {0})\n" "\n" "SSH-programma: {1}\n" "SSH-parameters: {2}\n" "\n" "Programmafout:\n" "{3}\n" "Programma-uitvoer:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "SSH-sleutelbestand niet gevonden." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "SSH-sleutelbestand kon niet gelezen worden." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "OpenSSH-versienummer niet gevonden (exitcode: {0})\n" "\n" "SSH-programma: {1}\n" "\n" "Programmafout:\n" "{2}\n" "Programma-uitvoer:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink heeft een ingestelde gebruikersnaam nodig." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Plink-versienummer niet gevonden (exitcode: {0})\n" "\n" "SSH-programma: {1}\n" "\n" "Programmafout:\n" "{2}\n" "Programma-uitvoer:\n" "{3}\n" smuxi-1.1/po-Frontend/ru.po0000664000175000017500000001143014011526464016503 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 # Yuri Myasoedov , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:41+0200\n" "PO-Revision-Date: 2017-09-19 09:13+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Неизвестная команда: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Указано мало параметров для команды {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Необходимо указать движок." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Движок не существует." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Неизвестный канал ({0}). Поддерживаются только следующие типы каналов:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "Сбой при выполнении регистрации! Неверное имя пользователя и/или пароль. Проверьте правильность имени и пароля." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Не найдено клиентское приложение для SSH: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "В качестве клиента SSH можно использовать либо OpenSSH (ssh), либо Plink (plink.exe, но не putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "Локальный порт {0} уже используется для перенаправления SSH. Возможно, старый туннель для SSH всё ещё активен." #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "Сбой при установке туннеля SSH (код возврата: {0})\n\nПрограмма SSH: {1}\nПараметры SSH: {2}\n\nСообщения из потока ошибок:\n{3}\nСообщения из потока вывода:\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Файл ключа SSH не найден." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Файл ключа SSH не может быть прочтён." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Номер версии OpenSSH не найден (код возврата: {0})\n\nПрограмма SSH: {1}\n\nСообщения из потока ошибок:\n{2}\nСообщения из потока вывода:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "Для PuTTY / Plink необходимо указать имя пользователя." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Номер версии Plink не найден (код возврата: {0})\n\nПрограмма SSH: {1}\n\nСообщения из потока ошибок:\n{2}\nСообщения из потока вывода:\n{3}\n" smuxi-1.1/po-Frontend/lt.po0000664000175000017500000001000614011526464016472 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-08 14:34+0000\n" "PO-Revision-Date: 2016-01-08 22:14+0200\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/" "language/lt/)\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Nežinoma Komanda: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Neužtenka parametrų {0} komandai" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Modulis negali būti tuščias." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Modulio nėra." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Nežinomas kanalas ({0}) - tik sekantys kanalo tipai yra palaikomi:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Registracija su moduliu nepavyko! Neteisingi vartotojo vardas ir/arba " "slaptažodis - prašome juos patikrinti." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "Nerasta SSH kliento programa:" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "SSH klientas privalo būti arba OpenSSH (ssh) arba Plink (plink.exe, ne putty." "exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Vietinis SSH nukreipiamas prievadas {0} jau yra naudojamas. Ar senas SSH " "tunelis vis dar aktyvus?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "SSH tunelio sąranka nepavyko (išėjimo kodas: {0})\n" "\n" "SSH programa: {1}\n" "SSH parametrai: {2}\n" "\n" "Programos Klaida:\n" "{3}\n" "Programos Išvestis:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Nerastas SSH rakto failas." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Nepavyko perskaityti SSH rakto failą." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "OpenSSH versijos numeris nerastas (išėjimo kodas: {0})\n" "\n" "SSH programa: {1}\n" "\n" "Programos Klaida:\n" "{2}\n" "Programos Išvestis:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink reikalauja, kad būtų nustatytas vartotojo vardas." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Plink versijos numeris nerastas (išėjimo kodas: {0})\n" "\n" "SSH programa: {1}\n" "\n" "Programos Klaida:\n" "{2}\n" "Programos Išvestis:\n" "{3}\n" smuxi-1.1/po-Frontend/oc.po0000664000175000017500000001015014011526464016454 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Translators: # Cédric Valmary (totenoc.eu) , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&k" "eywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:46+0000\n" "PO-Revision-Date: 2016-03-17 19:56+0200\n" "Last-Translator: Cédric Valmary (totenoc.eu) \n" "Language-Team: Tot En Òc\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Comanda desconeguda : {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Pas pro de paramètres per la comanda {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Lo motor deu pas èsser void." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Lo motor existís pas." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" "Canal desconegut ({0}), sols los tipes de canals seguents son suportats :" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Impossible de s'enregistrar alprèp del motor, lo nom d'utilizaire e/o lo " "senhal èra(n) marrit(s), verificatz_lo(s)." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "L'aplicacion SSH client es pas estada trobada :" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "Lo client SSH deu èsser siá OpenSSH (ssh) o Plink (plink.exe, e non " "putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "La redirection locala de pòrt {0} es totjorn en cors d'utilizacion. L'ancian " "tunèl SSH es totjorn actiu ?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Mesa en rota del tunèl SSH fracassada (còde de sortida : {0})\n" "\n" "Programa SSH : {1}\n" "Paramètres SSH : {2}\n" "\n" "Error del programa :\n" "{3}\n" "Sortida del programa :\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "Fichièr de clau SSH introbable" #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "Impossible de legir lo fichièr de clau SSH." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Impossible de trobar la version d'OpenSSH (còde de sortida: {0})\n" "\n" "Programa SSH: {1}\n" "\n" "Error del programa:\n" "{2}\n" "Sortida del programa:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY o Plink necessitan un nom d'utilizaire per foncionar." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Numèro de version Plink pas trobat (còde de retorn : {0})\n" "\n" "Programa SSH : {1}\n" "\n" "Error del programa : \n" "{2}\n" "Sortida del programa : \n" "{3}\n" smuxi-1.1/po-Frontend/POTFILES.in0000664000175000017500000000013614011526464017273 0ustar00meebeymeebey00000000000000src/Frontend/CommandManager.cs src/Frontend/EngineManager.cs src/Frontend/SshTunnelManager.cs smuxi-1.1/po-Frontend/POTFILES.skip0000664000175000017500000000047614011526464017642 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Server/ lib/ smuxi-1.1/po-Frontend/te.po0000664000175000017500000000536614011526464016500 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:03+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend/CommandManager.cs:343 #, csharp-format msgid "Unknown Command: {0}" msgstr "" #: ../src/Frontend/CommandManager.cs:352 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "" #: ../src/Frontend/EngineManager.cs:122 msgid "Engine must not be empty." msgstr "" #: ../src/Frontend/EngineManager.cs:133 msgid "Engine does not exist." msgstr "" #: ../src/Frontend/EngineManager.cs:317 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "" #: ../src/Frontend/EngineManager.cs:326 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:144 msgid "SSH client application was not found: " msgstr "" #: ../src/Frontend/SshTunnelManager.cs:147 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:184 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:208 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:329 #: ../src/Frontend/SshTunnelManager.cs:478 msgid "SSH keyfile not found." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:335 #: ../src/Frontend/SshTunnelManager.cs:484 msgid "SSH keyfile could not be read." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:426 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" #: ../src/Frontend/SshTunnelManager.cs:469 msgid "PuTTY / Plink requires a username to be set." msgstr "" #: ../src/Frontend/SshTunnelManager.cs:557 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" smuxi-1.1/po-Frontend/ca.po0000664000175000017500000000525614011526464016451 0ustar00meebeymeebey00000000000000msgid "" msgstr "" "Project-Id-Version: Smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-15 01:40+0200\n" "PO-Revision-Date: \n" "Last-Translator: Siegfried-Angel Gevatter Pujals \n" "Language-Team: Siegfried-Angel Gevatter Pujals \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1\n" "X-Poedit-Language: Catalan\n" #: ../src/Frontend/CommandManager.cs:143 #, csharp-format msgid "Unknown Command: {0}" msgstr "Orde desconeguda: {0}" #: ../src/Frontend/EngineManager.cs:292 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Sala desconeguda ({0}) - només s'admeten els següents tipus de sales:" #: ../src/Frontend/EngineManager.cs:301 msgid "Registration with engine failed! The username and/or password were wrong - please verify them." msgstr "No s'ha pogut registrar amb el motor! El nom d'usuari i/o la contrasenya són incorrectes - comproveu-les." #: ../src/Frontend/SshTunnelManager.cs:146 msgid "SSH client application was not found: " msgstr "No s'ha trobat cap client d'SSH:" #: ../src/Frontend/SshTunnelManager.cs:149 msgid "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "El client d'SSH ha de ser l'OpenSSH (ssh) o bé el Plink (plink.exe, no putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:186 #, csharp-format msgid "The local SSH forwarding port {0} is already in use. Is there an old SSH tunnel still active?" msgstr "El port local de reenviament de l'SSH {0} ja està en ús. Hi ha un túnel SSH vell que encara estigui actiu?" #: ../src/Frontend/SshTunnelManager.cs:210 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Ha fallat la creació del túnel SSH (codi de sortida: {0})\n" "\n" "Programa SSH: {1}\n" "Paràmetres SSH: {2}\n" "\n" "Missatges d'error del programa:\n" "{3}\n" "Sortida del programa:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:405 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "No s'ha trobat el nombre de versió de l'OpenSSH (codi de sortida: {0})\n" "\n" "Programa SSH: {1}\n" "\n" "Missatge d'error del programa:\n" "{2}\n" "Sortida del programa:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:441 msgid "PuTTY / Plink requires a username to be set." msgstr "El PuTTY / Plink requereix que un nom d'usuari estigui establert." smuxi-1.1/po-Frontend/sv.po0000664000175000017500000001014714011526464016511 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2011, 2013. # Anders Jonsson , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:46+0000\n" "PO-Revision-Date: 2016-04-03 13:23+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Okänt kommando: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Inte tillräckligt med parametrar för kommandot {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Motor får inte lämnas tom." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Vald motor finns inte." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Okänd kanal ({0}) - endast följande kanaltyper stöds:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Kunde inte ansluta till motorn! Användarnamnet och/eller lösenordet var fel " "- kontrollera dessa." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "SSH-klient-applikationen kunde inte hittas: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "SSH-klienten måste vara antingen OpenSSH (ssh) eller Plink (plink.exe, inte " "putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Den lokala porten för vidaresändning av SSH {0} används redan. Finns där en " "gammal SSH-tunnel som fortfarande är aktiv?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Fel vid upprättande av SSH-tunnel (felkod: {0})\n" "\n" "SSH-applikation: {1}\n" "SSH-parametrar: {2}\n" "\n" "Applikationsfel:\n" "{3}\n" "Utdata från applikation:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "SSH-nyckelfil hittades inte." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "SSH-nyckelfilen kunde inte läsas." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Versionsnummer för OpenSSH kunde inte hittas (felkod: {0})\n" "\n" "SSH-applikation: {1}\n" "\n" "Applikationsfel:\n" "{2}\n" "Utdata från applikation:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY/Plink kräver att ett användarnamn används." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Plink versions-nummer hittades inte (avslutningskod: {0})\n" "\n" "SSH program: {1}\n" "\n" "Programfel:\n" "{2}\n" "Programutdata:\n" "{3}\n" smuxi-1.1/po-Frontend/tr.po0000664000175000017500000000745414011526464016515 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:34+0200\n" "PO-Revision-Date: 2015-02-07 18:19+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Bilinmeyen Komut: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "{0} komutu için yetersiz parametre" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Motor boş bırakılamaz." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Motor mevcut değil." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Bilinmeyen kanal ({0}) - sadece şu kanal türleri desteklenmektedir:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "Motor ile kayıt başarısız oldu! Kullanıcı adı ve/ya da parola yanlış - lütfen kontrol edin." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "SSH istemci uygulaması bulunamadı:" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "SSH istemci ya OpenSSH (ssh) ya da Plink (putty.exe değil, plink.exe) olmalı" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "Yerel SSH iletim portu {0} zaten kullanımda. Hala etkin olan eski bir SSH tüneli var mı?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "SSH tüneli kurulumu başarısız oldu (çıkış kodu: {0})\n\nSSH programı: {1}\nSSH parametreleri: {2}\n\nProgram Hatası:\n{3}\nProgram Çıktısı:\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "SSH anahtar dosyası bulunamadı." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "SSH anahtar dosyası okunamadı." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "OpenSSH sürüm numarası bulunamadı (çıkış kodu: {0})\n\nSSH programı: {1}\n\nProgram Hatası:\n{2}\nProgram Çıktısı:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink için bir kullanıcı adı ayarlanması gereklidir." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Plink sürüm numarası bulunamadı (çıkış kodu: {0})\n\nSSH programı: {1}\n\nProgram Hatası:\n{2}\nProgram Çıktısı:\n{3}\n" smuxi-1.1/po-Frontend/pt_BR.po0000664000175000017500000000753314011526464017074 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Leonardopf , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:03+0100\n" "PO-Revision-Date: 2013-07-15 00:19+0000\n" "Last-Translator: Leonardopf \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/smuxi/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend/CommandManager.cs:343 #, csharp-format msgid "Unknown Command: {0}" msgstr "Comando desconhecido: {0}" #: ../src/Frontend/CommandManager.cs:352 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Parâmetro insuficiente para o comando {0}" #: ../src/Frontend/EngineManager.cs:122 msgid "Engine must not be empty." msgstr "Motor não pode estar vazio." #: ../src/Frontend/EngineManager.cs:133 msgid "Engine does not exist." msgstr "Motor não existe." #: ../src/Frontend/EngineManager.cs:317 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Canal desconhecido ({0}) - Somente os seguintes tipos de canais são suportados:" #: ../src/Frontend/EngineManager.cs:326 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "Registro do motor falhou! O nome de usuário e/ou senha estão errados - por favor verifique-os" #: ../src/Frontend/SshTunnelManager.cs:144 msgid "SSH client application was not found: " msgstr "Programa de cliente SSH não encontrado:" #: ../src/Frontend/SshTunnelManager.cs:147 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "O cliente SSH deve ser ou OpenSSH(ssh) ou Plink (plink.exe, não putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:184 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "A porta {0} que será feito o forwarding já está em uso. Você tem um antigo tunel SSH ainda ativo?" #: ../src/Frontend/SshTunnelManager.cs:208 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "Criação do Tunel SSh falhou (código de saída: {0})\n\nPrograma SSH: {1}\nParâmetros SSH: {2}\n\nErro do programa:\n{3}\nSaída do programa:\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:329 #: ../src/Frontend/SshTunnelManager.cs:478 msgid "SSH keyfile not found." msgstr "Arquivo-chave SSH não encontrado." #: ../src/Frontend/SshTunnelManager.cs:335 #: ../src/Frontend/SshTunnelManager.cs:484 msgid "SSH keyfile could not be read." msgstr "Arquivo-chave SSH não pôde ser lido." #: ../src/Frontend/SshTunnelManager.cs:426 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Versão do OpenSSH não encontrada (código de saída: {0})\n\nPrograma SSH: {1}\n\nErro do programa:\n{2}\nSaída do programa:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:469 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink necessita de um nome de usuário para ser usado. " #: ../src/Frontend/SshTunnelManager.cs:557 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "Versão do Plink não encontrada (código de saída: {0})\n\nPrograma SSH: {1}\n\nErro do programa:\n{2}\nSaída do programa:\n{3}\n" smuxi-1.1/po-Frontend/fa.po0000664000175000017500000000776114011526464016457 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Behrooz Amoozad , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:41+0200\n" "PO-Revision-Date: 2017-09-19 19:12+0000\n" "Last-Translator: Behrooz Amoozad \n" "Language-Team: Persian (http://www.transifex.com/meebey/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "دستور ناشناخته: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "تعداد پارامتر های دستور {0} ناکافیست." #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "نام موتور نباید خالی باشد." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "موتور مورد نظر وجود ندارد." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "کانال ناشناخته ({0}) فقط کانال های ذیل پشتیبانی میشوند. " #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "ثبت نام نا موفق بود.نام کاربر و/یا رمز نادرست بودند - لطفا از صحت آنها اطمینان پیدا کنید." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "برنامه ssh پیدا نشد:" #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "برنامه ssh باید یا OpenSSH(ssh) و یا PLink(plink.exe و نه putty.exe) باشد." #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "درگاه داخلی {0} در حال ساتفاده است؟ آیا یک تونل قدیمی ssh هنوز فعال است؟" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "راهاندازی تونل SSH شکست خورد.(کد خروج: {0})\n\nبرنامه SSH: {1}\nپارامتر های SSH: {2}\n\nخطای برنامه:\n{3}\nخروجی برنامه:\n{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "فایل کلید SSH یافت نشد." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "فایل کلید SSH قابل خواندن نیست." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "شماره نسخه OpenSSH یافت نشد. (کد خروج: {0})\n\nبرنامه SSH: {1}\n\nخطای برنامه:\n{2}\nخروجی برنامه‌:\n{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink نیاز به یک بک نام کاربری تنظیم شده دارند." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" smuxi-1.1/po-Frontend/da.po0000664000175000017500000000765114011526464016453 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2011,2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:46+0000\n" "PO-Revision-Date: 2013-04-29 08:41+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Frontend/CommandManager.cs:466 #, csharp-format msgid "Unknown Command: {0}" msgstr "Ukendt kommando: {0}" #: ../src/Frontend/CommandManager.cs:475 #, csharp-format msgid "Not enough parameters for {0} command" msgstr "Ikke nok parametre for kommandoen {0}" #: ../src/Frontend/EngineManager.cs:112 msgid "Engine must not be empty." msgstr "Motor må ikke være tom." #: ../src/Frontend/EngineManager.cs:123 msgid "Engine does not exist." msgstr "Motor findes ikke." #: ../src/Frontend/EngineManager.cs:313 #, csharp-format msgid "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Ukendt kanal ({0}) - kun de følgende kanaltyper er understøttet:" #: ../src/Frontend/EngineManager.cs:322 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Registrering med motor mislykkedes! Brugernavnet og/eller adgangskoden var " "forkert - bekræft dem venligst." #: ../src/Frontend/SshTunnelManager.cs:147 msgid "SSH client application was not found: " msgstr "SSH-klientprogram blev ikke fundet: " #: ../src/Frontend/SshTunnelManager.cs:150 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "SSH-klient skal enten være OpenSSH (ssh) eller Plink (plink.exe, ikke putty." "exe)" #: ../src/Frontend/SshTunnelManager.cs:187 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Den lokale SSH-videresendelsesport {0} er allerede i brug. Er der en gammel " "SSH-tunnel, der stadig er aktiv?" #: ../src/Frontend/SshTunnelManager.cs:211 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Kunne ikke opsætte SSH-tunnel (afbrydelseskode: {0})\n" "\n" "SSH-program: {1}\n" "SSH-parametre: {2}\n" "\n" "Programfejl:\n" "{3}\n" "Programuddata:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:332 #: ../src/Frontend/SshTunnelManager.cs:481 msgid "SSH keyfile not found." msgstr "SSH-nøglefil blev ikke fundet." #: ../src/Frontend/SshTunnelManager.cs:338 #: ../src/Frontend/SshTunnelManager.cs:487 msgid "SSH keyfile could not be read." msgstr "SSH-nøglefil kunne ikke læses." #: ../src/Frontend/SshTunnelManager.cs:429 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Versionnummer for OpenSSH blev ikke fundet (afbrydelseskode: {0})\n" "\n" "SSH-program: {1}\n" "\n" "Programfejl:\n" "{2}\n" "Programuddata:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:472 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink kræver at et brugernavn er angivet." #: ../src/Frontend/SshTunnelManager.cs:560 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Plink-versionsnummer blev ikke fundet (afslutningskode: {0})\n" "\n" "SSH-program: {1}\n" "\n" "Programfejl:\n" "{2}\n" "Programuddata:\n" "{3}\n" smuxi-1.1/po-Frontend/hr.po0000664000175000017500000000742714011526464016501 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:21+0100\n" "PO-Revision-Date: 2012-01-08 14:11+0000\n" "Last-Translator: Matias M. \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: ../src/Frontend/CommandManager.cs:143 #, csharp-format msgid "Unknown Command: {0}" msgstr "Nepoznata naredba: {0}" #: ../src/Frontend/EngineManager.cs:122 msgid "Engine must not be empty." msgstr "Jezgra ne smije biti prazna." #: ../src/Frontend/EngineManager.cs:133 msgid "Engine does not exist." msgstr "Jezgra ne postoji." #: ../src/Frontend/EngineManager.cs:318 #, csharp-format msgid "" "Unknown channel ({0}) - only the following channel types are supported:" msgstr "Nepoznati kanal ({0}) - samo sljedeći oblici kanala su podržani:" #: ../src/Frontend/EngineManager.cs:327 msgid "" "Registration with engine failed! The username and/or password were wrong - " "please verify them." msgstr "" "Registracija sa jezgrom nije uspjela! Korisničko ime i/ili lozinka su krivi" " - molimo provjerite ih." #: ../src/Frontend/SshTunnelManager.cs:145 msgid "SSH client application was not found: " msgstr "SSH klijent nije pronađen: " #: ../src/Frontend/SshTunnelManager.cs:148 msgid "" "SSH client must be either OpenSSH (ssh) or Plink (plink.exe, not putty.exe)" msgstr "" "SSH klijent mora biti OpenSSH (ssh) ili Plink (plink.exe, ne putty.exe)" #: ../src/Frontend/SshTunnelManager.cs:185 #, csharp-format msgid "" "The local SSH forwarding port {0} is already in use. Is there an old SSH " "tunnel still active?" msgstr "" "Lokalni SSH port preusmjeravanja {0} je već u upotrebi. Da li je neki drugi " "SSH tunel još aktivan?" #: ../src/Frontend/SshTunnelManager.cs:209 #, csharp-format msgid "" "SSH tunnel setup failed (exit code: {0})\n" "\n" "SSH program: {1}\n" "SSH parameters: {2}\n" "\n" "Program Error:\n" "{3}\n" "Program Output:\n" "{4}\n" msgstr "" "Instalacija SSH tunela nije uspjela (izlazni kȏd: {0})\n" "\n" "SSH program: {1}\n" "SSH parametri: {2}\n" "\n" "Programska greška:\n" "{3}\n" "Programski ispis:\n" "{4}\n" #: ../src/Frontend/SshTunnelManager.cs:330 #: ../src/Frontend/SshTunnelManager.cs:476 msgid "SSH keyfile not found." msgstr "SSH ključ nije pronađen." #: ../src/Frontend/SshTunnelManager.cs:336 #: ../src/Frontend/SshTunnelManager.cs:482 msgid "SSH keyfile could not be read." msgstr "SSH ključ nije moguće pročitati." #: ../src/Frontend/SshTunnelManager.cs:424 #, csharp-format msgid "" "OpenSSH version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Oznaka OpenSSH inačice nije pronađena (izlazni kȏd: {0})\n" "\n" "SSH program: {1}\n" "\n" "Programska greška:\n" "{2}\n" "Programski ispis:\n" "{3}\n" #: ../src/Frontend/SshTunnelManager.cs:467 msgid "PuTTY / Plink requires a username to be set." msgstr "PuTTY / Plink zahtijeva postavljanje korisničkog imena." #: ../src/Frontend/SshTunnelManager.cs:555 #, csharp-format msgid "" "Plink version number not found (exit code: {0})\n" "\n" "SSH program: {1}\n" "\n" "Program Error:\n" "{2}\n" "Program Output:\n" "{3}\n" msgstr "" "Oznaka inačice Plinka nije pronađena (izlazni kȏd: {0})\n" "\n" "SSH program: {1}\n" "\n" "Programska greška:\n" "{2}\n" "Programski ispis:\n" "{3}\n" smuxi-1.1/Makefile.in0000664000175000017500000011413014011526471015366 0ustar00meebeymeebey00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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 = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/expansions.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/mono.m4 \ $(top_srcdir)/m4/programs.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = lib/osx/Info.plist CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-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 \ tags-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_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = lib src po po-Engine po-Engine-MessageBuffer \ po-Engine-Campfire po-Engine-IRC po-Engine-JabbR \ po-Engine-Twitter po-Engine-XMPP po-Server po-Frontend \ po-Frontend-GNOME po-Frontend-GNOME-IRC \ po-Frontend-GNOME-Twitter po-Frontend-GNOME-XMPP am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/lib/osx/Info.plist.in compile config.guess \ config.rpath config.sub install-sh missing 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__post_remove_distdir = $(am__remove_distdir) 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 DIST_TARGETS = dist-gzip 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@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CSC_FLAGS = @CSC_FLAGS@ CYGPATH_W = @CYGPATH_W@ DB4O_CFLAGS = @DB4O_CFLAGS@ DB4O_FILES = @DB4O_FILES@ DB4O_LIBS = @DB4O_LIBS@ DBUS_LIBS = @DBUS_LIBS@ DBUS_SHARP_CFLAGS = @DBUS_SHARP_CFLAGS@ DBUS_SHARP_GLIB_CFLAGS = @DBUS_SHARP_GLIB_CFLAGS@ DBUS_SHARP_GLIB_LIBS = @DBUS_SHARP_GLIB_LIBS@ DBUS_SHARP_LIBS = @DBUS_SHARP_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEV_VERSION_SUFFIX = @DEV_VERSION_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_GNOME_COMPILER_FLAGS = @FRONTEND_GNOME_COMPILER_FLAGS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GETTEXT_PACKAGE_ENGINE = @GETTEXT_PACKAGE_ENGINE@ GETTEXT_PACKAGE_ENGINE_CAMPFIRE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ GETTEXT_PACKAGE_ENGINE_IRC = @GETTEXT_PACKAGE_ENGINE_IRC@ GETTEXT_PACKAGE_ENGINE_JABBR = @GETTEXT_PACKAGE_ENGINE_JABBR@ GETTEXT_PACKAGE_ENGINE_TWITTER = @GETTEXT_PACKAGE_ENGINE_TWITTER@ GETTEXT_PACKAGE_ENGINE_XMPP = @GETTEXT_PACKAGE_ENGINE_XMPP@ GETTEXT_PACKAGE_FRONTEND = @GETTEXT_PACKAGE_FRONTEND@ GETTEXT_PACKAGE_FRONTEND_CURSES = @GETTEXT_PACKAGE_FRONTEND_CURSES@ GETTEXT_PACKAGE_FRONTEND_GNOME = @GETTEXT_PACKAGE_FRONTEND_GNOME@ GETTEXT_PACKAGE_FRONTEND_GNOME_IRC = @GETTEXT_PACKAGE_FRONTEND_GNOME_IRC@ GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER = @GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER@ GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP = @GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP@ GETTEXT_PACKAGE_FRONTEND_STFL = @GETTEXT_PACKAGE_FRONTEND_STFL@ GETTEXT_PACKAGE_FRONTEND_SWF = @GETTEXT_PACKAGE_FRONTEND_SWF@ GETTEXT_PACKAGE_FRONTEND_WPF = @GETTEXT_PACKAGE_FRONTEND_WPF@ GETTEXT_PACKAGE_MSG_BUFFER = @GETTEXT_PACKAGE_MSG_BUFFER@ GETTEXT_PACKAGE_SERVER = @GETTEXT_PACKAGE_SERVER@ GIO_SHARP_CFLAGS = @GIO_SHARP_CFLAGS@ GIO_SHARP_FILES = @GIO_SHARP_FILES@ GIO_SHARP_LIBS = @GIO_SHARP_LIBS@ GLADE_SHARP_20_CFLAGS = @GLADE_SHARP_20_CFLAGS@ GLADE_SHARP_20_LIBS = @GLADE_SHARP_20_LIBS@ GLIB_SHARP_20_CFLAGS = @GLIB_SHARP_20_CFLAGS@ GLIB_SHARP_20_LIBS = @GLIB_SHARP_20_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_SHARP_20_CFLAGS = @GTK_SHARP_20_CFLAGS@ GTK_SHARP_20_LIBS = @GTK_SHARP_20_LIBS@ INDICATE_SHARP_CFLAGS = @INDICATE_SHARP_CFLAGS@ INDICATE_SHARP_LIBS = @INDICATE_SHARP_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOG4NET_CFLAGS = @LOG4NET_CFLAGS@ LOG4NET_LIBS = @LOG4NET_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MCS = @MCS@ MESSAGINGMENU_SHARP_CFLAGS = @MESSAGINGMENU_SHARP_CFLAGS@ MESSAGINGMENU_SHARP_FILES = @MESSAGINGMENU_SHARP_FILES@ MESSAGINGMENU_SHARP_LIBS = @MESSAGINGMENU_SHARP_LIBS@ MESSAGING_MENU_CFLAGS = @MESSAGING_MENU_CFLAGS@ MESSAGING_MENU_LIBS = @MESSAGING_MENU_LIBS@ MKDIR_P = @MKDIR_P@ MONO = @MONO@ MONO_MODULE_CFLAGS = @MONO_MODULE_CFLAGS@ MONO_MODULE_LIBS = @MONO_MODULE_LIBS@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ MSG_BUFFER_COMPILER_FLAGS = @MSG_BUFFER_COMPILER_FLAGS@ NDESK_DBUS_CFLAGS = @NDESK_DBUS_CFLAGS@ NDESK_DBUS_GLIB_CFLAGS = @NDESK_DBUS_GLIB_CFLAGS@ NDESK_DBUS_GLIB_LIBS = @NDESK_DBUS_GLIB_LIBS@ NDESK_DBUS_LIBS = @NDESK_DBUS_LIBS@ NINI_CFLAGS = @NINI_CFLAGS@ NINI_LIBS = @NINI_LIBS@ NOTIFY_SHARP_CFLAGS = @NOTIFY_SHARP_CFLAGS@ NOTIFY_SHARP_LIBS = @NOTIFY_SHARP_LIBS@ OBJEXT = @OBJEXT@ 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@ POSUB = @POSUB@ PROFILE = @PROFILE@ SED = @SED@ SERVER_COMPILER_FLAGS = @SERVER_COMPILER_FLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STFL_CFLAGS = @STFL_CFLAGS@ STFL_LIBS = @STFL_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XBUILD = @XBUILD@ XBUILD_FLAGS = @XBUILD_FLAGS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ 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@ dist_version = @dist_version@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ expanded_libdir = @expanded_libdir@ git_branch = @git_branch@ git_commit_hash = @git_commit_hash@ 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@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ 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@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ twitter_api_key = @twitter_api_key@ # Engines @ENABLE_ENGINE_CAMPFIRE_TRUE@PO_ENGINE_CAMPFIRE = po-Engine-Campfire @ENABLE_ENGINE_IRC_TRUE@PO_ENGINE_IRC = po-Engine-IRC @ENABLE_ENGINE_JABBR_TRUE@PO_ENGINE_JABBR = po-Engine-JabbR @ENABLE_ENGINE_TWITTER_TRUE@PO_ENGINE_TWITTER = po-Engine-Twitter @ENABLE_ENGINE_XMPP_TRUE@PO_ENGINE_XMPP = po-Engine-XMPP # Frontends @ENABLE_FRONTEND_GNOME_TRUE@PO_FRONTEND_GNOME = po-Frontend-GNOME @ENABLE_FRONTEND_GNOME_IRC_TRUE@PO_FRONTEND_GNOME_IRC = po-Frontend-GNOME-IRC @ENABLE_FRONTEND_GNOME_TWITTER_TRUE@PO_FRONTEND_GNOME_TWITTER = po-Frontend-GNOME-Twitter @ENABLE_FRONTEND_GNOME_XMPP_TRUE@PO_FRONTEND_GNOME_XMPP = po-Frontend-GNOME-XMPP ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} EXTRA_DIST = install-sh \ HACKING.md \ LICENSE \ README.md # HACK: distclean in po/ does not work for some reason DISTCLEANFILES = \ po/POTFILES \ po/Makefile \ po/stamp-it \ po/Makefile.in PODIRS = po \ po-Engine \ po-Engine-MessageBuffer \ $(PO_ENGINE_CAMPFIRE) \ $(PO_ENGINE_IRC) \ $(PO_ENGINE_JABBR) \ $(PO_ENGINE_TWITTER) \ $(PO_ENGINE_XMPP) \ po-Server \ po-Frontend \ $(PO_FRONTEND_GNOME) \ $(PO_FRONTEND_GNOME_IRC) \ $(PO_FRONTEND_GNOME_TWITTER) \ $(PO_FRONTEND_GNOME_XMPP) SUBDIRS = lib \ src \ $(PODIRS) LIB_DIR = $(top_builddir)/lib BUILD_DIR = $(top_builddir)/bin/$(PROFILE) WIN32_LIB_DIR = $(LIB_DIR)/win32 WIN32_BUILD_DIR = $(top_builddir)/bin-win32 WIN32_ICON_THEME_DIR = $(top_srcdir)/images/Smuxi-Symbolic OSX_LIB_DIR = $(LIB_DIR)/osx OSX_ICON_THEME_DIR = $(top_srcdir)/images/Smuxi-Symbolic OSX_BUILD_DIR = $(top_builddir)/bin-osx OSX_APP_DIR = $(OSX_BUILD_DIR)/Smuxi.app OSX_CONTENTS_DIR = $(OSX_APP_DIR)/Contents OSX_RESOURCES_DIR = $(OSX_CONTENTS_DIR)/Resources OSX_BINARIES_DIR = $(OSX_CONTENTS_DIR)/MacOS LINUX_STATIC_BUILD_DIR = $(top_builddir)/bin-linux-static WIN32_EXE_FILES = \ $(BUILD_DIR)/smuxi-frontend-gnome.exe \ $(BUILD_DIR)/smuxi-server.exe \ $(BUILD_DIR)/smuxi-message-buffer.exe WIN32_FILES = \ $(WIN32_EXE_FILES) \ $(LIB_DIR)/Mono.Data.Sqlite.dll \ $(LIB_DIR)/Mono.Posix.dll \ $(LIB_DIR)/Nini.dll \ $(LIB_DIR)/log4net.dll \ $(WIN32_LIB_DIR)/plink.exe \ $(WIN32_LIB_DIR)/sqlite3.dll \ $(WIN32_LIB_DIR)/fixedsys500c/Fixedsys500c.ttf \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/smuxi-engine-campfire.dll \ $(BUILD_DIR)/smuxi-engine-irc.dll \ $(BUILD_DIR)/smuxi-engine-jabbr.dll \ $(BUILD_DIR)/smuxi-engine-twitter.dll \ $(BUILD_DIR)/smuxi-engine-xmpp.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-irc.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-twitter.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-xmpp.dll \ $(BUILD_DIR)/smuxi-frontend.dll \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll \ $(BUILD_DIR)/Twitterizer2.dll \ $(BUILD_DIR)/Twitterizer2.Streaming.dll \ $(BUILD_DIR)/Newtonsoft.Json.dll \ $(BUILD_DIR)/agsxmpp.dll \ $(BUILD_DIR)/StarkSoftProxy.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll \ $(BUILD_DIR)/ServiceStack.Interfaces.dll \ $(BUILD_DIR)/ServiceStack.Common.dll \ $(BUILD_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(BUILD_DIR)/JabbR.Client.dll \ $(WIN32_LIB_DIR)/smuxi-frontend-gnome.exe.config \ $(WIN32_LIB_DIR)/smuxi-server.exe.config OSX_FILES = \ $(LIB_DIR)/Nini.dll \ $(LIB_DIR)/log4net.dll \ $(BUILD_DIR)/smuxi-frontend-gnome.exe \ $(BUILD_DIR)/smuxi-frontend-gnome.exe.config \ $(BUILD_DIR)/smuxi-frontend-gnome-irc.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-twitter.dll \ $(BUILD_DIR)/smuxi-frontend-gnome-xmpp.dll \ $(BUILD_DIR)/smuxi-server.exe \ $(BUILD_DIR)/smuxi-message-buffer.exe \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/smuxi-engine-campfire.dll \ $(BUILD_DIR)/smuxi-engine-irc.dll \ $(BUILD_DIR)/smuxi-engine-jabbr.dll \ $(BUILD_DIR)/smuxi-engine-twitter.dll \ $(BUILD_DIR)/smuxi-engine-xmpp.dll \ $(BUILD_DIR)/smuxi-frontend.dll \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll \ $(BUILD_DIR)/Twitterizer2.dll \ $(BUILD_DIR)/Twitterizer2.Streaming.dll \ $(BUILD_DIR)/Newtonsoft.Json.dll \ $(BUILD_DIR)/agsxmpp.dll \ $(BUILD_DIR)/StarkSoftProxy.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll \ $(BUILD_DIR)/ServiceStack.Interfaces.dll \ $(BUILD_DIR)/ServiceStack.Common.dll \ $(BUILD_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(BUILD_DIR)/JabbR.Client.dll LINUX_STATIC_FILES = \ $(LIB_DIR)/Mono.Data.Sqlite.dll \ $(LIB_DIR)/Mono.Posix.dll \ /usr/lib/libMonoPosixHelper.so \ $(LIB_DIR)/Nini.dll \ $(LIB_DIR)/log4net.dll \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/smuxi-engine-campfire.dll \ $(BUILD_DIR)/smuxi-engine-irc.dll \ $(BUILD_DIR)/smuxi-engine-jabbr.dll \ $(BUILD_DIR)/smuxi-engine-twitter.dll \ $(BUILD_DIR)/smuxi-engine-xmpp.dll \ $(BUILD_DIR)/smuxi-server.exe.config \ $(BUILD_DIR)/Meebey.SmartIrc4net.dll \ $(BUILD_DIR)/Twitterizer2.dll \ $(BUILD_DIR)/Twitterizer2.Streaming.dll \ $(BUILD_DIR)/Newtonsoft.Json.dll \ $(BUILD_DIR)/agsxmpp.dll \ $(BUILD_DIR)/StarkSoftProxy.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll \ $(BUILD_DIR)/ServiceStack.Interfaces.dll \ $(BUILD_DIR)/ServiceStack.Common.dll \ $(BUILD_DIR)/Microsoft.AspNet.SignalR.Client.dll \ $(BUILD_DIR)/JabbR.Client.dll all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): lib/osx/Info.plist: $(top_builddir)/config.status $(top_srcdir)/lib/osx/Info.plist.in cd $(top_builddir) && $(SHELL) ./config.status $@ # 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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; \ $(am__define_uniq_tagged_files); \ 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-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(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__post_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 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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 mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -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 $(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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck 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 pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # forcely disable parallel builds export MAKEFLAGS=-j1 update-po: for PODIR in $(PODIRS); do \ echo $$PODIR; \ $(MAKE) -C $$PODIR $@ | egrep -e '(:$$|messages)'; \ done update-pot: for PODIR in $(PODIRS); do \ echo $$PODIR; \ $(MAKE) -C $$PODIR clean; \ $(MAKE) -C $$PODIR check 2>&1 | grep -v 'mismatched quotes at line' 2>&1; \ done pull-transifex: tx pull -f -l ca,cs,da,de,en_GB,es,fa,fi,fr,hr,ko,lt,nb_NO,pl,pt_BR,ru,sk,sv,te,tr,ur,zh_CN push-transifex: tx push -t --skip mail-po: update-po for PODIR in $(PODIRS); do \ echo $$PODIR; \ podebconf-report-po \ --deadline=+14days \ --notdebconf \ --package="Smuxi ($$PODIR)" \ --utf8 \ --from="Mirco Bauer " \ --smtp=booster.qnetp.net \ --podir=$$PODIR \ --langs=cs,es_AR,it,pt; \ done call-po: update-po for PODIR in $(PODIRS); do \ echo $$PODIR; \ podebconf-report-po \ --deadline=+14days \ --notdebconf \ --package="Smuxi ($$PODIR)" \ --utf8 \ --from="Mirco Bauer " \ --smtp=booster.qnetp.net \ --podir=$$PODIR \ --call; \ done install-po: for PODIR in $(PODIRS); do \ $(MAKE) -C $$PODIR install itlocaledir=$(abs_top_builddir)/bin/$(PROFILE)/locale; \ done dist-win32: DIST_VERSION=$$(git describe); \ ./autogen.sh --without-indicate --without-messaging-menu --without-notify --without-dbus \ --with-db4o=included \ --with-vendor-package-version="dist-win32 $$DIST_VERSION" $(MAKE) mkdir -p $(WIN32_BUILD_DIR) for FILE in $(WIN32_FILES); do \ cp $$FILE $(WIN32_BUILD_DIR); \ done for PODIR in $(PODIRS); do \ $(MAKE) -C $$PODIR install itlocaledir=$(abs_top_builddir)/$(WIN32_BUILD_DIR)/locale; \ done mkdir -p $(WIN32_BUILD_DIR)/icons cp -r $(WIN32_ICON_THEME_DIR) $(WIN32_BUILD_DIR)/icons makensis $(top_srcdir)/src/smuxi-win32.nsis mv smuxi-win32-setup.exe smuxi-$(VERSION)-win32-setup.exe dist-osx: DIST_VERSION=$$(git describe); \ ./autogen.sh --without-indicate --without-messaging-menu --without-notify --without-dbus \ --with-db4o=included \ --with-vendor-package-version="dist-osx $$DIST_VERSION" $(MAKE) mkdir -p $(OSX_BINARIES_DIR) $(OSX_RESOURCES_DIR) cp $(OSX_LIB_DIR)/Info.plist $(OSX_CONTENTS_DIR) cp $(OSX_LIB_DIR)/smuxi $(OSX_BINARIES_DIR) cp $(OSX_LIB_DIR)/smuxi-server $(OSX_BINARIES_DIR) cp $(OSX_LIB_DIR)/smuxi.icns $(OSX_RESOURCES_DIR) for FILE in $(OSX_FILES); do \ cp $$FILE $(OSX_BINARIES_DIR); \ done mkdir -p $(OSX_BINARIES_DIR)/icons cp -r $(OSX_ICON_THEME_DIR) $(OSX_BINARIES_DIR)/icons -rm smuxi-osx.zip cd $(OSX_BUILD_DIR) && zip -r ../smuxi-osx.zip Smuxi.app mv smuxi-osx.zip smuxi-$(VERSION)-osx.zip dist-linux-static: DIST_VERSION=$$(git describe); \ ./autogen.sh --without-indicate --without-messaging-menu --without-notify --without-dbus \ --with-db4o=included \ --with-vendor-package-version="dist-linux-static $$DIST_VERSION" \ --disable-frontend-gnome --disable-frontend-stfl $(MAKE) mkdir -p $(LINUX_STATIC_BUILD_DIR) mkbundle --deps --static -z -L $(BUILD_DIR) \ -o $(LINUX_STATIC_BUILD_DIR)/smuxi-server \ $(BUILD_DIR)/smuxi-server.exe \ $(LIB_DIR)/log4net.dll \ $(LIB_DIR)/Nini.dll \ $(BUILD_DIR)/smuxi-common.dll \ $(BUILD_DIR)/smuxi-engine.dll \ $(BUILD_DIR)/Db4objects.Db4o.dll \ $(BUILD_DIR)/ServiceStack.Text.dll for FILE in $(LINUX_STATIC_FILES); do \ cp $$FILE $(LINUX_STATIC_BUILD_DIR); \ done tar -czf smuxi-server-$(VERSION)-linux-$$(uname -m)-static.tar.gz $(LINUX_STATIC_BUILD_DIR) dist-linux-debs: git checkout -- debian/changelog dch -b \ -v "1:$(VERSION)+git-1~$$(date +%Y%m%d%H%M%S).$$(git rev-parse --short=8 HEAD)" \ -D "$$(lsb_release -r -s)" \ "Building git snapshot." dpkg-buildpackage -b -us -uc run: run-gnome run-gnome: all if [ "x$(shell uname)" = "xDarwin" ]; then \ cp lib/Nini.dll bin/debug && cp lib/log4net.dll bin/debug; \ fi; \ cd $(BUILD_DIR) && \ mono --debug ./smuxi-frontend-gnome.exe -d --new-instance run-stfl: all cd $(BUILD_DIR) && \ mono --debug ./smuxi-frontend-stfl.exe -d 2> smuxi-frontend-stfl.err run-server: all cd $(BUILD_DIR) && \ mono --debug ./smuxi-server.exe -d test: src/*-Tests/*.cs* xbuild src/Common-Tests/Common-Tests.csproj xbuild src/Engine-Tests/Engine-Tests.csproj xbuild src/Frontend-Tests/Frontend-Tests.csproj xbuild src/Frontend-GNOME-Tests/Frontend-GNOME-Tests.csproj xbuild src/Frontend-STFL-Tests/Frontend-STFL-Tests.csproj -nunit-console $(BUILD_DIR)/smuxi-common-tests.dll -nunit-console $(BUILD_DIR)/smuxi-engine-tests.dll -nunit-console $(BUILD_DIR)bin/debug/smuxi-frontend-tests.dll -nunit-console $(BUILD_DIR)bin/debug/smuxi-frontend-gnome-tests.dll -nunit-console $(BUILD_DIR)bin/debug/smuxi-frontend-stfl-tests.dll .NOTPARALLEL: .PHONY: test # 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: smuxi-1.1/po-Engine-Campfire/0000775000175000017500000000000014011526502016661 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-Campfire/LINGUAS0000664000175000017500000000011314011526464017710 0ustar00meebeymeebey00000000000000cs da de el es fa fi fr hu id lt nl oc pl pt pt_BR ro sl sr sv te tr zh_CN smuxi-1.1/po-Engine-Campfire/cs.po0000664000175000017500000000651314011526464017642 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013 # Marek Černocký , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 11:09+0000\n" "PO-Revision-Date: 2016-03-17 06:34+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.7\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Připojuje se ke Campfire…" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Připojeno ke Campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Příkazy Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Nahrávání" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "„{0}“ ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Odeslání zprávy se nezdařilo: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "nahrál „{0}“ ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "vstoupil do místnosti {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "opustil místnost {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "uzamkl místnost {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "odemkl místnost {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "změnil téma" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "vložil příspěvek uživatele {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "provedl neznámou činnost" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Chyba při čtení z datového proudu: {0}" smuxi-1.1/po-Engine-Campfire/zh_CN.po0000664000175000017500000000563114011526464020236 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2013-12-13 08:10+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "正在连接到 campfire..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "已连接到 campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire 命令" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "上传" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} 字节) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "无法发布信息: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "已上传 '{0}' ({1} 字节) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:415 #, csharp-format msgid "has joined {0}" msgstr "已加入 {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:424 #, csharp-format msgid "has left {0}" msgstr "已离开 {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:432 #, csharp-format msgid "has locked {0}" msgstr "已锁定 {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:436 #, csharp-format msgid "has unlocked {0}" msgstr "已解锁 {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 msgid "has changed the topic" msgstr "已更改主题" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:451 msgid "has performed an unknown action" msgstr "已执行未知操作" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:492 #, csharp-format msgid "Error reading from stream: {0}" msgstr "流读取错误: {0}" smuxi-1.1/po-Engine-Campfire/el.po0000664000175000017500000000702214011526464017631 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 14:40+0000\n" "PO-Revision-Date: 2016-03-12 11:35+0200\n" "Last-Translator: Tom Tryfonidis \n" "Language-Team: team.lists@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7\n" "X-Project-Style: gnome\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Σύνδεση με το campfire... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Συνδέθηκε με το Campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Εντολές Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Αποστολή" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Αποτυχία δημοσίευσης μηνύματος: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "έχει ανεβάσει '{0}' ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "έχει συνδέσει {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "έχει απομείνει {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "έχει κλειδώσει {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "έχει ξεκλειδώσει {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "έχει αλλάξει το θέμα" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "έχει επικολλήσει ένα tweet από {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "έχει εκτελέσει μια άγνωστη ενέργεια" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Σφάλμα ανάγνωσης από τη ροή: {0}" smuxi-1.1/po-Engine-Campfire/ro.po0000664000175000017500000000643614011526464017661 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:18+0000\n" "PO-Revision-Date: 2018-04-06 20:12+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > " "0 && n%100 < 20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Se conectează la focul de tabără... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Conectat la focul de tabără" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Comenzi foc de tabără" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Încarcă" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "„{0}” ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Nu s-a putut trimite mesajul: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "a încărcat „{0}” ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "s-a alăturat la {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "a plecat din {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "a blocat {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "a deblocat {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "a schimbat subiectul" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "a lipit un tweet de {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "a executat o acțiune necunoscută" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Eroare la citirea de la fluxul: {0}" smuxi-1.1/po-Engine-Campfire/fi.po0000664000175000017500000000577414011526464017643 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2015-05-03 12:48+0000\n" "Last-Translator: Kalle Kaitala \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Yhdistetään campfireen..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Yhdistetty campfireen" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire-komennot" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Lähetä" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Viestin lähetys epäonnistui: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "on lähettänyt '{0}' ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:415 #, csharp-format msgid "has joined {0}" msgstr "on liittynyt huoneeseen {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:424 #, csharp-format msgid "has left {0}" msgstr "on lähtenyt huoneesta {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:432 #, csharp-format msgid "has locked {0}" msgstr "on lukinnut huoneen {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:436 #, csharp-format msgid "has unlocked {0}" msgstr "on avannut huoneen {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 msgid "has changed the topic" msgstr "on vaihtanut aihetta" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:451 msgid "has performed an unknown action" msgstr "on suorittanut tuntemattoman toiminnon" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:492 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Virhe luettaessa virrasta: {0}" smuxi-1.1/po-Engine-Campfire/de.po0000664000175000017500000000654714011526464017634 0ustar00meebeymeebey00000000000000# German translation of smuxi-Engine-Campfire. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2013. # Mario Blättermann , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 11:09+0000\n" "PO-Revision-Date: 2016-01-07 21:00+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Verbindung zu Campfire wird aufgebaut …" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Verbunden mit Campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire-Befehle" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Hochladen" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "»{0}« ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Nachricht konnte nicht gesendet werden: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "hat »{0}« ({1} B) hochgeladen {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "hat {0} betreten" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "hat {0} verlassen" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "hat {0} gesperrt" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "hat {0} entsperrt" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "hat das Thema geändert" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "hat einen Tweet von {0} eingefügt: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "hat eine unbekannte Aktion ausgeführt" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Fehler beim Lesen des Datenstroms: {0}" smuxi-1.1/po-Engine-Campfire/hu.po0000664000175000017500000000645314011526464017654 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 11:09+0000\n" "PO-Revision-Date: 2015-09-17 16:45+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Kapcsolódás a campfire kiszolgálóhoz… " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Kapcsolódva a campfire kiszolgálóhoz" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire parancsok" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Feltöltés" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "„{0}” ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Nem sikerült az üzenet elküldése: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "feltöltötte ezt: „{0}” ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "csatlakozott ehhez: {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "elhagyta ezt: {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "zárolta ezt: {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "feloldotta ezt: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "megváltoztatta a témát" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "beillesztett egy tweet üzenetet - {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "ismeretlen műveletet hajtott végre" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Hiba az adatfolyam olvasásakor: {0}" smuxi-1.1/po-Engine-Campfire/fr.po0000664000175000017500000000571214011526464017644 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:31+0200\n" "PO-Revision-Date: 2013-12-13 21:21+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Connexion à campfire..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Connecté à campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Commandes Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Envoyer" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} O) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Impossible de poster le message : {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "a envoyé '{0}' ({1} O) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:415 #, csharp-format msgid "has joined {0}" msgstr "a rejoint {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:424 #, csharp-format msgid "has left {0}" msgstr "a quitté {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:432 #, csharp-format msgid "has locked {0}" msgstr "a bloqué {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:436 #, csharp-format msgid "has unlocked {0}" msgstr "a débloqué {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 msgid "has changed the topic" msgstr "a changé le sujet" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:451 msgid "has performed an unknown action" msgstr "a effectué une action inconnue" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:492 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Erreur pendant la lecture du flux : {0}" smuxi-1.1/po-Engine-Campfire/sr.po0000664000175000017500000000704314011526464017660 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:40+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Повезујем се на кампфајер... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Повезани сте на кампфајер" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Наредбе кампфајера" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Пошаљи" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "„{0}“ ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Нисам успео да објавим поруку: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "је послао „{0}“ ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "је додао {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "је напустио {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "је закључао {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "је откључао {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "је променио тему" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "је убацио цвркут {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "је обавио непознату радњу" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Грешка читања са тока: {0}" smuxi-1.1/po-Engine-Campfire/sl.po0000664000175000017500000000602714011526464017653 0ustar00meebeymeebey00000000000000# 'smuxi/po-Engine-Campfire/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:39+0000\n" "PO-Revision-Date: 2016-03-11 22:55+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n" "%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Pošlji" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "" smuxi-1.1/po-Engine-Campfire/pl.po0000664000175000017500000000635614011526464017655 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2015-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:52+0200\n" "PO-Revision-Date: 2016-08-21 16:48+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Łączenie z Campfire… " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Połączono z Campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Polecenia Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Wyślij" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "„{0}” ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Wysłanie wiadomości się nie powiodło: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "wysłał „{0}” ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "dołączył do pokoju {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "opuścił pokój {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "zablokował pokój {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "odblokował pokój {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "zmienił temat" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "wkleił tweeta autorstwa użytkownika {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "wykonał nieznane działanie" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Błąd podczas odczytywania z potoku: {0}" smuxi-1.1/po-Engine-Campfire/id.po0000664000175000017500000000630314011526464017626 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-01-17 20:01+0000\n" "PO-Revision-Date: 2017-04-20 11:31+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Menghubungkan ke api unggun... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Terhubung ke api unggun" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Perintah Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Unggah" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Gagal mengirim pesan: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "telah mengunggah '{0}' ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "telah bergabung {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "telah meninggalkan {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "telah terkunci {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "telah membuka {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "telah mengubah topik" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "telah menempelkan cuitan dengan {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "telah melakukan tindakan yang tidak diketahui" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "kesalahan saat membaca dari arus: {0}" smuxi-1.1/po-Engine-Campfire/es.po0000664000175000017500000000633714011526464017650 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 # Daniel Mustieles , 2015. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-25 10:54+0000\n" "PO-Revision-Date: 2015-08-25 \n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Conectando a campfire..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Conectado a campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Comandos de campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Subir" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "No se pudo publicar el mensaje: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "ha subido «{0}» ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "entró a {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "ha dejado {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "ha bloqueado {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "ha desbloqueado {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "ha cambiado el tema" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "ha pegado un tweet de {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "ha realizado una acción desconocida" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Ocurrió un error al leer del flujo: {0}" smuxi-1.1/po-Engine-Campfire/Makefile.in.in0000664000175000017500000001577614011526464021362 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_ENGINE_CAMPFIRE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine-Campfire/pt.po0000664000175000017500000000637214011526464017663 0ustar00meebeymeebey00000000000000# Portuguese translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Tiago S. , 2015. # Pedro Albuquerque , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-31 02:19+0000\n" "PO-Revision-Date: 2015-11-17 08:14+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "A ligar ao Campfire..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Ligado ao Campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Comandos Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Enviar" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "\"{0}\" ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Falha ao publicar a mensagem: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "\"{0}\" ({1} B) {2} foi enviado" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "juntou-se a {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "{0} saiu" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "{0} foi bloqueada" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "{0} foi desbloqueada" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "mudou o tópico" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "foi colado um tweet por {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "realizou uma ação desconhecida" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Erro ao ler o fluxo: {0}" smuxi-1.1/po-Engine-Campfire/nl.po0000664000175000017500000000644014011526464017645 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:17+0000\n" "PO-Revision-Date: 2019-03-10 14:59+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Verbinden met campfire… " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Verbonden met campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire-opdrachten" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Uploaden" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "‘{0}’ ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Plaatsen van bericht mislukt: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "heeft ‘{0}’ geüpload ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "neemt nu deel aan {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "heeft {0} verlaten" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "heeft {0} vergrendeld" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "heeft {0} ontgrendeld" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "heeft het onderwerp gewijzigd" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "heeft een tweet door {0} geplakt: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "heeft een onbekende actie uitgevoerd" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Fout tijdens lezen van datastroom: {0}" smuxi-1.1/po-Engine-Campfire/lt.po0000664000175000017500000000636514011526464017661 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-11-11 14:23+0000\n" "PO-Revision-Date: 2015-11-12 01:37+0200\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/" "language/lt/)\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.8.5\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Jungiamasi prie campfire... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Prisijungta prie campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire Komandos" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Įkelti" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Nepavyko išsiųsti pranešimo: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "įkėlė '{0}' ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "prisijungė prie {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "paliko {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "užrakino {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "atrakino {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "pakeitė temą" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "įdėjo naudotojo {0} tauškalą: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "atliko nežinomą veiksmą" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Klaida, skaitant iš srauto: {0}" smuxi-1.1/po-Engine-Campfire/oc.po0000664000175000017500000000621414011526464017634 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 11:09+0000\n" "PO-Revision-Date: 2013-12-13 21:21+0000\n" "Last-Translator: Claument Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/" "fr/)\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Connexion a campfire..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Connectat a campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Comandas Campfire" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Mandar" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} O) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Impossible de pòster lo messatge : {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "a mandat '{0}' ({1} O) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "a rejoint {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "a quitat {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "a blocat {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "a déblocat {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "a changé lo subjècte" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "a efectuat una action desconeguda" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Error pendent la lectura del flux : {0}" smuxi-1.1/po-Engine-Campfire/POTFILES.in0000664000175000017500000000010214011526464020436 0ustar00meebeymeebey00000000000000src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs smuxi-1.1/po-Engine-Campfire/POTFILES.skip0000664000175000017500000000046714011526464021014 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Engine-Twitter/ src/Server/ lib/ smuxi-1.1/po-Engine-Campfire/te.po0000664000175000017500000000515614011526464017647 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 16:59+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:415 #, csharp-format msgid "has joined {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:424 #, csharp-format msgid "has left {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:432 #, csharp-format msgid "has locked {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:436 #, csharp-format msgid "has unlocked {0}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 msgid "has changed the topic" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:451 msgid "has performed an unknown action" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:492 #, csharp-format msgid "Error reading from stream: {0}" msgstr "" smuxi-1.1/po-Engine-Campfire/sv.po0000664000175000017500000000647014011526464017667 0ustar00meebeymeebey00000000000000# Swedish translation for smuxi-engine-campfire # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2013 # Martin Bagge , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 11:09+0000\n" "PO-Revision-Date: 2016-02-21 21:13+0100\n" "Last-Translator: Josef Andersson \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/smuxi/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Ansluter till campfire..." #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Ansluten till campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire-kommandon" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Skicka" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Kunde inte sända meddelande: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "har laddat upp '{0}' ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "har anslutit till {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "har lämnat {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "har låst {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "har låst upp {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "har ändrat rubrik" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "har klistrat in en tweet från {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "har utfört en okänd åtgärd" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Kunde inte läsa data: {0}" smuxi-1.1/po-Engine-Campfire/tr.po0000664000175000017500000000650214011526464017660 0ustar00meebeymeebey00000000000000# Turkish translation for Smuxi. # Copyright (C) 2018 Smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the Smuxi package. # # Ş. Uzun , 2014-2015. # Sabri Ünal , 2019. # Emin Tufan Çetin , 2019. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2019-03-06 18:39+0000\n" "PO-Revision-Date: 2019-03-09 17:28+0200\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Türkçe \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Campfire ile bağlantı kuruluyor... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Campfire ile bağlantı kuruldu" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire Komutları" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Karşıya Yükle" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "İleti gönderimi başarısız oldu: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "karşıya yükleme yaptı '{0}' ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "{0} odasına katıldı" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "{0} odasından ayrıldı" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "{0} odasını kilitledi" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "{0} odasının kilidini açtı" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "konuyu değiştirdi" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "{0}'e ait tweet'i yapıştırdı: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "bilinmeyen bir eylem gerçekleştirdi" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Akıştan okumada hata: {0}" smuxi-1.1/po-Engine-Campfire/pt_BR.po0000664000175000017500000000644614011526464020250 0ustar00meebeymeebey00000000000000# Brazilian Portuguese translation for smuxi-Engine-Campfire # Copyright (C) 2016 THE smuxi-Engine'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Leonardopf , 2013. # Rafael Fontenelle , 2016. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 11:09+0000\n" "PO-Revision-Date: 2016-03-06 00:30-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Conectando ao campfire... " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Conectado ao campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Comandos do Campfire " #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Enviar" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "'{0}' ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Falha ao publicar mensagem: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "enviou \"{0}\" ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "ingressou em {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "saiu de {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "travou {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "destravou {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "mudou o tópico" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "colou um tweet de {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "fez uma ação desconhecida" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Erro de leitura do fluxo: {0}" smuxi-1.1/po-Engine-Campfire/fa.po0000664000175000017500000000515014011526464017617 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 16:59+0100\n" "PO-Revision-Date: 2013-12-05 18:50+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/projects/p/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:415 #, csharp-format msgid "has joined {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:424 #, csharp-format msgid "has left {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:432 #, csharp-format msgid "has locked {0}" msgstr "" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:436 #, csharp-format msgid "has unlocked {0}" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 msgid "has changed the topic" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:451 msgid "has performed an unknown action" msgstr "" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:492 #, csharp-format msgid "Error reading from stream: {0}" msgstr "" smuxi-1.1/po-Engine-Campfire/da.po0000664000175000017500000000643514011526464017624 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2013 # Alan Mortensen , 2017. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:24+0000\n" "PO-Revision-Date: 2017-01-15 10:04+0100\n" "Last-Translator: Alan Mortensen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:123 msgid "Connecting to campfire... " msgstr "Forbinder til campfire …" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:166 msgid "Connected to campfire" msgstr "Forbundet til campfire" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:200 msgid "Campfire Commands" msgstr "Campfire-kommandoer" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:262 msgid "Upload" msgstr "Overfør" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:263 #, csharp-format msgid "'{0}' ({1} B) {2}" msgstr "»{0}« ({1} B) {2}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:367 #, csharp-format msgid "Failed to post message: {0}" msgstr "Kunne ikke sende besked: {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:383 #, csharp-format msgid "has uploaded '{0}' ({1} B) {2}" msgstr "har overført »{0}« ({1} B) {2}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:420 #, csharp-format msgid "has joined {0}" msgstr "er sluttet til {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:429 #, csharp-format msgid "has left {0}" msgstr "har forladt {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:437 #, csharp-format msgid "has locked {0}" msgstr "har låst {0}" #. TRANSLATOR: {0} is the name of the room #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:441 #, csharp-format msgid "has unlocked {0}" msgstr "har åbent {0}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:446 msgid "has changed the topic" msgstr "har ændret emnet" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:458 #, csharp-format msgid "has pasted a tweet by {0}: {1}" msgstr "har indsat et tweet af {0}: {1}" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:465 msgid "has performed an unknown action" msgstr "har udført ukendt handling" #: ../src/Engine-Campfire/Protocols/Campfire/CampfireProtocolManager.cs:504 #, csharp-format msgid "Error reading from stream: {0}" msgstr "Der opstod en fejl under læsning af strøm: {0}" smuxi-1.1/glade/0000775000175000017500000000000014011526501014367 5ustar00meebeymeebey00000000000000smuxi-1.1/glade/smuxi-frontend-gnome.glade0000664000175000017500000070120214011467170021462 0ustar00meebeymeebey00000000000000 True False Smuxi Preferences 700 600 dialog True False True False end gtk-apply -10 True False True True False True False False 0 gtk-ok -5 True True True False True False False 1 gtk-cancel -6 True True True False True False False 2 False True end 0 True False 10 128 True True automatic automatic in True True False False False True 0 True True False True False 5 10 True False 0 none True False 12 True False 5 2 5 5 True True The nickname to use. You can specify extra nicknames (separated by spaces) which will be used as fallbacks when the first choice is not available. By default $nick_ and $nick__ will be used as fallbacks. False False True True 1 2 True True False False True True 1 2 1 2 True True False False True True 1 2 2 3 True False True False Nickname(s): False False 0 True False True True 1 GTK_FILL GTK_FILL True False True False Username: False False 0 True False True True 1 1 2 GTK_FILL GTK_FILL True False True False Realname: False False 0 True False True True 1 2 3 GTK_FILL GTK_FILL True False 0 Encoding: 3 4 GTK_FILL True False on 1 2 3 4 GTK_FILL GTK_FILL Automatically convert UTF-8 characters True True False True 1 2 4 5 GTK_FILL GTK_FILL True False <b>General</b> True label_item False True 0 True False 0 none True False 12 True False 4 2 5 5 True False 0 Type: GTK_FILL True False 0 Host: 1 2 GTK_FILL True False on 1 2 True False 0 Username: 2 3 GTK_FILL True False 0 Password: 3 4 GTK_FILL True False 5 True True False False True True True True 0 True False 5 True False Port: False False 0 True True 5 False False True True 0 0 65535 1 10 0 False False 1 False True 5 1 1 2 1 2 True True False False True True 1 2 2 3 True False 5 True True False False True True True True 0 Show Password True True False True False False 1 1 2 3 4 True False <b>Network Proxy</b> True label_item False True 1 True False 0 none True False 12 True False 5 5 True False True False True False On Connect Commands: False False 0 True False True True 1 False False 0 350 100 True True automatic in 100 True True word True True 1 True True 0 True False True False True False On Startup Commands: False False 0 True False True True 1 False False 0 350 100 True True automatic in 100 True True word True True 1 True True 1 True False <b>Global Commands</b> True label_item True True 2 True False C_onnection True Notebook False tab True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False 5 5 True False 0 none True False 12 True False 5 6 2 5 5 True False True False Timestamp Format: False False 0 True False True True 1 GTK_FILL GTK_FILL True False True False Buffer Lines: False False 0 True False True True 1 1 2 GTK_FILL GTK_FILL True False True False Engine Buffer Lines: False False 0 True False True True 1 2 3 GTK_FILL GTK_FILL 60 True True False False True True 200 1 9999 1 10 0 1 True 1 2 1 2 60 True True False False True True 200 0 9999 1 10 0 1 True 1 2 2 3 60 True True ss = seconds mm = minutes hh = hours (01 - 12) HH = hours (00 - 23) tt = AM/PM dd = day MM = month yy/yyyy = year HH:mm False False True True 1 2 True False 1 2 3 4 True False 0 Persistency Type: 3 4 True False 0 Volatile Buffer Lines: 4 5 True False 0 Persistent Buffer Lines: 5 6 60 True True False False True True 200 0 10000 100 1000 0 1 True 1 2 4 5 60 True True False False True True 50000 0 1000000000 100 1000 0 1 True 1 2 5 6 True False <b>Message Buffer</b> True label_item False False 0 True False 0 none True False 12 True False True True False True True False 0 0 True False 2 True False gtk-cut False False 0 True False Strip Colors True False False 1 False False 0 True True False True True False 0 0 True False 2 True False gtk-cut False False 0 True False Strip Formattings True False False 1 False False 1 True False True False True True False 0 0 True False 2 True False gtk-cut False False 0 True False Strip UTF-8 True False False 1 False False 2 True True False 1 True True False 2 True False gtk-execute True True 0 True False Show Advanced Settings True True 1 False False 3 True False <b>Advanced</b> True label_item False False 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General False tab True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 5 False 0 True False 12 True False True True False True True False 0 0 True False 2 True False gtk-goto-top False False 0 True False Top True False False 1 False False 0 True True False True TabPositionRadioButtonTop True False 0 0 True False 2 True False gtk-goto-bottom False False 0 True False Bottom True False False 1 False False 1 True True False True True TabPositionRadioButtonTop True False 0 0 True False 2 True False gtk-goto-first False False 0 True False Left True False False 1 False False 2 True True False True TabPositionRadioButtonTop True False 0 0 True False 2 True False gtk-goto-last False False 0 True False Right True False False 1 False False 3 None True True False True True TabPositionRadioButtonTop False False 4 True False <b> Tabs Position </b> True label_item False True 0 True False 0 True False 12 True False 4 2 5 5 True True False 1 2 1 2 GTK_FILL True True False 1 2 2 3 GTK_FILL True True False 1 2 GTK_FILL True False 0 Highlight 3 4 GTK_FILL True False 0 Activity 1 2 GTK_FILL True False 0 No Activity GTK_FILL True False 0 Join/Part/Mode 2 3 GTK_FILL True True False 1 2 3 4 GTK_FILL True False <b> Tab Colors </b> True label_item False True 1 Automatically switch to newly opened person chats True True False True False True 2 Automatically switch to newly opened group chats True True False True False True 3 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Tree 1 False tab True False 5 0 True False 12 True False 5 True False 5 3 2 5 5 True False True False Completion Character: False False 0 True False True True 1 GTK_FILL GTK_FILL True False True False Command Character: False False 0 True False True True 1 1 2 GTK_FILL GTK_FILL True False True False Command History Size: False False 0 True False True True 1 2 3 GTK_FILL GTK_FILL 60 True True False False True True 30 1 9999 1 10 0 1 True 1 2 2 3 30 True True 1 / False False True True 1 2 1 2 30 True True 1 : False False True True 1 2 False False 0 Bash-Style Completion True True False True True False False 1 True False <b> Entry Field </b> True label_item 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Input 2 False tab True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 True False 0 True False 12 True False 4 2 2 2 Nick Colors True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 2 152 96 False 0 True False 12 True False True True False True True True False 0 0 True False 2 True False gtk-goto-first False False 0 True False Left True False False 1 False False 0 True True False True UserListPositionRadioButtonLeft True False 0 0 True False 2 True False gtk-goto-last False False 0 True False Right True False False 1 False False 1 None True True False True True UserListPositionRadioButtonLeft False False 2 True False <b> Person List Position </b> True label_item 3 4 True False 0 True False 12 True False Override True True False True True True 0 True False True True True True 1 True False <b> Font </b> True label_item 1 2 3 4 False 0 True False 12 True False True True False True True True False 0 0 True False 2 True False gtk-goto-top False False 0 True False Top True False False 1 False False 0 True True False True TopicPositionRadioButtonTop True False 0 0 True False 2 True False gtk-goto-bottom False False 0 True False Bottom True False False 1 False False 1 None True True False True True TopicPositionRadioButtonTop False False 2 True False <b> Topic Position </b> True label_item 2 3 True False 0 True False 12 True False 2 3 5 5 True False 0 Foreground 1 2 GTK_FILL True False 0 Background 1 2 1 2 GTK_FILL True False True True #000000000000 2 3 GTK_FILL True False True True #000000000000 2 3 1 2 GTK_FILL Override True True False True GTK_FILL Override True True False True 1 2 GTK_FILL True False <b> Color </b> True label_item 1 2 2 3 True False 5 True False 0 _Wrap Mode: True False True 0 True False False True 1 2 1 2 True False <b> Chat </b> True label_item False True 0 True False 0 True False 12 True False 5 True False True False 0 Highlight words: False False 0 True True automatic automatic in True True True True 1 True True 0 Beep on highlight True True False True True False False 1 True False <b> Highlighting </b> True label_item True True 1 3 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Output 3 False tab True False 5 5 True False 0 none True False 12 True False Enable True True False True False True 0 True False Show always True True False True True False True 0 Show when window is minimized True True False True NotificationAreaIconRadioButtonAlways False True 1 Show when window is closed True True False True NotificationAreaIconRadioButtonAlways False True 2 True True 1 True False <b> Notification Area Icon </b> True label_item False True 0 True False 0 none True False 12 Show Smuxi in the messaging menu True True False True True False <b>Messaging Menu</b> True label_item False True 1 True False 0 none True False 12 Show notification popups True True False True True False <b>Notification Popups</b> True label_item False False 2 4 True False Notification 4 False tab 1 True False _Interface True Notebook 1 False tab True False 5 True True automatic automatic in True True True True 0 True False 5 start gtk-add True True True False True False False 0 gtk-edit True True True False True False False 1 gtk-remove True True True False True False False 2 False True 1 2 True False _Servers True Notebook 2 False tab True False 5 3 True False _Filters True Notebook 3 False tab True False 5 3 2 5 5 Enabled True True False True GTK_FILL GTK_FILL True False 1 2 GTK_FILL GTK_FILL True False 1 2 1 2 GTK_FILL GTK_FILL True False 1 2 2 3 GTK_FILL GTK_FILL Log Filtered Messages True True False True 1 2 GTK_FILL GTK_FILL True False gtk-open True True True True True True 0 True False True True 1 2 3 GTK_FILL GTK_FILL 4 True False _Logging True 4 False tab True True 1 True True 2 smuxi-1.1/images/0000775000175000017500000000000014011526501014560 5ustar00meebeymeebey00000000000000smuxi-1.1/images/256/0000775000175000017500000000000014011526501015074 5ustar00meebeymeebey00000000000000smuxi-1.1/images/256/smuxi-frontend-gnome.png0000644000175000017500000013440614011526501021675 0ustar00meebeymeebey00000000000000PNG  IHDR\rfsRGBbKGD pHYs B(xtIME !- IDATxy\guyR{uUuW﫤jId 1`0 [@Yld(d2LB@m06cc}Qԭ{%˶dyOoݭ}|jRԤ&5IMjRԤ&5IMjRԤ&5IMjRԤ&5IMjRԤ&5IMjR\"j%=t蒊lE hBH@@ alDd$ % !HIAY!9%CBS@M^U).MJs+B@|3 p8&< Q_rO*[ ̒ r<+rRڟndmw_bJ. rϧ*H-:A?!?Kŭ+蚊*/[؉Ð&I&_$%g&$LNgJ  }A .Jx_kj ~\vROKSz?u^~f{bxuwiL 32>gplYfǓH)KARH'\ز) v}}4ӻu EԹpiK[ҟϷ,  D,Gg8qz91͍8h~wo6jpH-hƇ׀FS4L6nh9D}Ѝ8~Uߪ8_:_CYRJ9&f;3͑LMO5KཿLm︻4eAzkt5KzظZ )Z|)/LgܡAǘO)=oFd ^O*'5YzU7]M4}(BN_8 7LI&W$3d&Aa!x7$aThT4E\.t]W鷪*`  AN 8;fpLH'ݙ~x6Bkp(~}}W\-]6^T`$tdH2[ _4+ly[{k Х)ANз[ǥUd: xC#൦תmS7WUdu˺HM䉥Ēyҹ" فX D -Wex\*HE8Χ/_6(( L&yA9pBFp I^??)yj&ܹoY߮lX,<)v*~/W(pel]9 jV\ZR.!!AX#,c<GOe||5f@*Dm4`CBǬa]c4̍rRnDљ 4((iuuB<.-E"ݎ)U `QݺJsKk:7yټ3<#85aRCuwIؽھMnnnl[ U_csf 沢 qBq(X (}kkk+åPqdlf#{Hf[_VGVP_~lB몠K[hȃא@B{GO ~c5?%j~~scۮMmhRF+6g04bh2E:_\ +W0.m2Hf73RzQ=L8^<"PwGQfuJ6`dr&b(ޕQjlTAJ{&Y!/~TֻBй~uu~qn޴]\XXs'LgvtR~~DU2$Va`Bd EU%E/_XFIH)1MIИ`"TH*3XO[_碳1@{o)h Sr,>"cNu'*X0\F\uEkC+unnۇץQL $ƓdseݑE96ٽuvʾ_T| YRJ $gb c7R4-sHy ]*~zu>T@ɝ1y8>U׫˧{"C TmMSxY,l_@:[tcuZ Odt_hI7x(&ۈ"tf@) k'6N*`b8VJIW,7!,гq[gKVCyM)24£-=lCkC[ LLVDM!>X{؉" )]{;Zѡ 9 \/p>I<>B-u߮$>@4!341p/y o_:!sWa|l@l/?_Oo(ZA`٪*c mZuKۊE4 u M+{;CX(: ޔ?5X~ xXǥ3:)c!s| .Dӿ v nʶtÓ/́m7gC\H~S"!kwwV-Gȅ,}E=φƿXT~3A2H2ԛI6T砲G?Cl0j#0.!9噁r`\1ȩRO9__1+v`, SޥqP~vEoF9qfBDj;|să\'R?rɚ_ŵm@l0XfY~xGTDy5t?˩1'3- &`4`FGQ5* BG zCEF R- gEpRjt`Yr!7:{=~|c4zn(0tVtԱ!0X1oAe<튣)٥9 Jd (kHPwvhN ϐq^|ܱ5)ou t4]϶ M xECZ- % , 2a߳L $\Vv>AC$jmߤ>!xU͓G(O`)i {Dn6mhgx*I,؊,,|w]ϟxhbӜE%`m+N(/zZ~; 䩣Sͤa1R,]'orI֖Dv)1= !!#46'SXבo9N1~i9<]VYՀEF!SK\Lf|#j-r鷬<'n!~n f}$3mg"Iʌn?wcnpXʊg9:2Pa$ۑB"?YS4Gs-Ѱ1rxlf]ZO LvfD%鯖U(s|7}^Roe2nk,bRgi#~+L"[Jp' %틁d٫0H qț[䚔i\Zm'`abFYK!n'n#i#n#m0Uc[cߖfB CP<;pZQEU;>^s^OY{kZ"!cz>#/1Ç^Ѻ?T|+EGW+xJ3;\),AtT~Ztٔ>+)FF3*?ESSUӀ+go&c81'o%\+HMB'9b*iLF+Ph ` Y'!V~.E)q1f}m :A=U$Z)坡9!~鳮F~=RpYi΂OġIil7\z2P]Z t5|ii:az93a@!H{KtIMC:hF ۂhJVR4nE(һ~\ F`O_Fl&m܄I/3/)HFۣ_P#c[iZԠ`df/GGޱ1rŀՈ0sZgIByrĔ Gz{K:t _lb4&먲Pe:gL"NkkױgOsbtRij8\Z:0m;XBMH #H:Y?WlT7:}(,|&HZЕXR\DXV(: RX{e £[( ;bW/:\f%X. ߏ AmM?(*,iL.!;͆|CLDՄ $[LsmA8Je>g.=극ٴcu-vGʡ5x͟x;> j gb~ ,ffY:K%219=Rmg#'(o;d^,;ZFʅsQ=M;d|; x 'JLHe &sGKEsBBczg-R6=oU^OgKV/'G&L. e󎲧랯2AeY1OLۢpU~؁=(@:&ӿ ҽ],׷*{vTT[-Rś͑gٹ lQ+4]<{#&N  =DGhkxrzN=Dk(8-Kh/M/ Q)lh )-<;ȅ]ʅ۝>w"؋v4zGػ3x\0KcJ2׼ jБ WO`fY~;,hhnQJX\q P1믴%K@ֹq|]KؖBszv3+3I|CKK&-Eii84iUr/.p:4ͯg-5XpLvåxܡ3s~򏱧sms/ |'~l>\i; :w1eVufuzez1OI*:1.R+mS`q ڕ1"*0`є+C҆k9&s\`frQfUfO癶|\繨%<;غ}t&'2'ix׭rNC`|u4j["IK. {;3S3A{?K0]ӓ"kMCJQ 6w~wݽc&c#o#]y1a-Quzuzu-+;E(E!%f ɦ2@e"PR\.'s9{q+єƯ=@-QtBT~mMScd}] {;I[P<"YZ싐;1L^sytx94t蓣qnnG IDAT7DSʙ?>y!م9_Q'5EހG׬eKE+ Lqy;$إy+B`(q5e "z)z]iRQ*^&dPq둨V^|XJ+',osjӭ0K4hڑAߠv߶2¶#w28y!L> sV`9:rmicMA!(6YTw1'JKKE<Š<˸sO#Œyn~q+[x@sEƮb [݇hƪt>-2trNq+{3l#NC0o t@"-,ĥD㤋7Yٓ\Ũ4^)2=eLdY!@bs|mhj-:ZXrm5֮/Z(*/N:Y%fh<}t G!|[S!69ϼm/ 'G"`"Zw\t>JS Ѻ\Ko][ MԑI[֮olb|׼VhqMqkav$Ⴒ\Qlوn;EWDPTRQ^DKѾqAQ%PXAi6ypRU{5B>7]z"5vKE;пawhgw޼M뛩9<(ESZ3$ڿvbN*ׄ)U 3|?fq dR`5ڍذEWlEM m==(.7Hے{H B|a,&N#A(1d#xۙt(aufM/o5-~(>cNME^iqiIv\h]Wz H\BSc :o<; oH@تw5qM;l+H 'Y4ak5PI4tu͏L/6P~/D VtuA@kmAP^Ò+ES. M< b42̨\O->ƭeRkIxp/U 2MƸ~ nW: Bldri?b 0 )D-(8;9h;G8![ 8&{?͞x(o>)*3៾evdp#\9t5[־6E1$- kFJVkE+S|B>UVP)m@6 =hY/*~LR$6iGWN)'[`е40uZ#Q:A'Bֵ*Cb.ҹFl0%_Ehsx`!+ }U\wۧ-oRkX䙥J8?Kb*}骁B%Sʍ*}ȮM}ųT|>rEEӍahR\ƪ !$Bj]/Sx$j8߄02gIKHJ! ҏCz-;RJ:k.q*rϺ8mƣGL!l+z{{˝prx#`=u<]HiRC2RgR~;~ϡǹ..+\hrvf޿)Ut5;p=(!e1&V$32#_uyE|R0t޷f+=B^R[/E+mns<#e֮osѢ):@6).VVx:RezzF Gq+<}p%+S뵯吱fe2N >K(y灓`(*i&!C5k+&m]_#QF\ }47\n;b69ebr΢Hxk_иġmnj$f-T%r-bku PٗVUxtږx=+Oӝ4qf KYMʇNtR4x\ITX-m -y+}RN[{Mst+iTXWɘ(f_B9hHCkМ@\f |˚eqi)D-+vD*$WA$#N~gN?]@ퟎwRKYE9MSF(%е {]ͽlh24HyD0snR\ꟙdgiڋC|Ӊ{>E4!6 t &hFЙ4g@ rJ}gDD6@U)0<gv֡ʟwiuO lwܰ2:X?TrkǷh;8, $UJ{-QᅨHsjamdhn3W|Tǫ'!9_x&!EU55#J) ` ȨpAFahrKvh&-.ԇ<hR}D6ɩKIy,4A{ǨGJ `^86W֭δe 2֔1[}K'̧,cQ?n]({fr.Ԍm!>;࣯ `0H[_7_UcK1 Y6[\P~Ӣtf ]wT on0Rt׋(@}I?U<ˠ _.?BWJM=b[izRQ.tbf\`]JГVr Mf4y}-02J Ork.a ;_o5wQݟgp6eNd"bw|kfeM *?"jG ۉ9E7gv׽NT_I?Ok۸5(ŒFiEF:^B15YM<(B:H " 6QJC@Hh)4ft"s|Şٰ?[txb¢}:rTQl{]ia,K};1a 9j^}ԙ kίpy-T.NR1R~Bx< mmmtwnz˄Y&&mTTU\.ƦcLMM1>1Vդ^ ߓ4jӫ8D]G(ry W $' ~7{ bv̤PPs129/P^(rzrQӳ\yI O.߱Yaoc~)}nvllxǭ=64?egoPSffҗdǙoڴ K/zl4=?>|>m<؜miԪp@8Z@5P("¤t &`zƼ57'9a*1-hNڊ=zsݿWW]֏1Y (8~Qi0{[t\=vbJ~Vr9r0SSS IcpfY+[]?)]_(ڍu l "^-=`RWg4w~ :]K傲gX~vmp|P>Ri=\ʞKzlV*BbMm,,ѯ56]X-ޱԺj>~zOgRb:fzjX-0-/_ m.9=e/R1bG 7/,/-(ddPdgkfTRV 9;7J9-p]Xs_&wT4!^i TL%em=p{lr[7 K,3m 뚣+2Q A./ , C*|^MSSbˏlBu!:; ՅQU!,=twnMs%i_z/˖MH hHSDZ9]kئE3r1͗A|N//+NCA)_܄3$GFo&_Y{65-{:?"~yox@x[>{͗R,! ;0V0Ht~H`py_HIՅ[FbbG[[;J&RiO~44D[ozijjfvftzCͶmp7hkk#P(8އkwlJ9-v{e62ʕdś( шbG$R0DC^J^ق!"Dcno/*+xTh2TtXk &1赜+@׬jzyŢQ };ۯӧ>oWPmHpl4\zBiǺlxU{T+tJ]qyHzY>4M\.X{=몪TW޺;KR z)[0'/2K 22kжYߌ8,%5 $_!&' <'Fپ!jmų/\o}Qo wVnb RXՇG|3k1JEhnTrx,ʿ4wyWA\yiDm$&$QP6lWj{ViL}W/_t-CWS6L`,%Jl{kt|i4lKSj{c3)ee,뚟8 t@`IW 2&=MY!g߶NKJ0g4. gѭ@h$\VpK=/ M%**OIv~Ea-tmݒ\ ~YjW3˟ 镂MvP0L%/j&LcrU]HwQwQ|WSDH)7PF!mvAS/=@ع$ O[ۃǜټѣuw\uw .@J.=U!$?/`ͥ[TR΋Q} _ЕV?"-6D qq'Yew!KPؙgr=2-¼pF4'v0\Pf:]ѥǴH@1xwTHT/%?_ߋEͥ/ZW,]3_]G(W[^;^J2AlfQy4Ca(YvQTqJ}MYtF"Ze~5g/♷/xDm뭔?pehruay>?y',H]'83 M8GxN[웎zdn!!TR,b>Wɱ}l!,=79s= :mM[soyf%ͣ%h|Y(X $DLWT^:P9kzfg}Bu!.ݹ%kWDUW^]*N9dc<)qÒ|ɏ}e?~/~ mg2|iOɉ'xGRy?`BXzx/+bGg9u&Wd:%#=mh.b:bzV4o9MW)9=fWVQ~L~n>>ϗE 5&GgAy'O~tl FGs^3GJqˎR`9`Chϵ IGc]MNZݗ\p `bJ_lSd|*d}B^"lT(;(A者O5uȭ(n)?MG46جD#-qdK]H)9rb?4lp(;-'x122)%r:|ft祬[޶!)[q/ٔP#Yw^FZ@gn O$/giXb%vZ㊂@S/]P04O -#Z,Q%]BW {6rb5҅}DLOOzp8–[rouss}W\W3QN% ?^M ¼wɊ]D:Bn@TK n蹥+M IDATowxZe9>oI$^ P\"! \]FN.t6@Fj.L=D'illfM|™L<}E/&2lETzW}]_{ 4 vP4]&Λ/D 8 Q N|(cϖM[Q=~W./q¤e.BvSY-qҟ -Z#G9:zu̧rdEܺV֢l|g]O. ໿"hE[R8b5r0ݎ;иBá6'/Aȝ@KRɱ7H(:9ӤWn,-^J:ara^bI u'Onl-s;JSh =:#r&cuxbՀvgQMx9ĞWS ag¡T,+e^N E4Gt,k zz.ꂉ(򁄂BAkCd%2.8G (Ih|gVOp!8яdZ\,͟eYL$aJZ"|˅mxA.go e12j cw+ vwJ*o@S MmL<'U"hip2YY^yrGXZ[09^Ch˯BX E5̍Qr]יwn[9tB7ȉ (1ADT%3Ӓylxsje~fg\4͛p`f\$OXͰ~+lj z]B(z|#4#5YWd N)1({n518]*hԭ8 Pfi ʰ˳{< @ySZڤ ]=rLMM.$t]5YN,M.a`v|3&tA8ppYDgguM<.z &cu]ہO}fT*:?XpaŌ*K4&#[nKĉ[6j$ cbC2ZlsTWL5|bC5?۠ ]~&UYW)]:PIȪFtC]˥ ;e_ ,"TOL\x (?+8dϯ wSlh? MӐ |b'!)Hgf!(+D1d$<]Al7+&[qs'j/<0r];;lz-Fwazi=^ =*~*(6[WB4T9Ɍ?GAd ^}/ӊtNdWO L0(P ;T%s# iSt&1е"R ¡59%g\"\`"azMzUcwgn#bg3Ώ0ͭo`WkL-l=_ƺ8VZ )2$I%}~ A(^V`moY `AD 1)*  9a4@[ЕK g_@a5~0&ab}mh^zեθ0v#'εdCCCtHh4 6xZZ`ӦMw0 s}AZpB)[`ݺu^`'96]t:ѻx f]}hy- D^eSr c㳛0>2?C6oxІ( *ur^w\l+THh|9!SQ`HjזMN1wHKHiĥ4T߁"O;ATrV\ zҙQ{W /a|qF`!H|,kKsаӁc_N{wmԅ/䙧ԏ\tmw৿jWKş%L ҷ<%@g39 @oD6Q^S~0ܼ-k xW&o^Te>*W0:``U,.] 40I$l}aA73#nMb6v?!52l E"Eb[Pu  }kh_z(F$̇&> |@]X}K5MbP(}~i7]U.dxLJ/U ! #0 @B'!HUHrʄm[bʰP9m p@_*2 8~TՁrks5q hV .jkO&vqX@~=05vkWt~3`BU!e'{vUҬ( ֗k GUe?$3Rzqs$1\z陭rIdUl.-qևM7L0x@HUʵLXuTkyH\B\N7N3S߂a= :R@YenwzYalR_d2RCE<Ǯ#wˌ !T؈fшl!%.D+FhMJC Ky k!<ﯫt&P84477`XxB!EyS`!_x-B:"wCToSj>}XR"؈pyrU@a)d{vŞ˯'YӲkZ@QIJY?Be.(~ ؍Q$jۂfCB NN0i\ar ,~PG8e)ē'+,a(d)S7~EV0|mU_evv|_kn$Ib~@*@8xe<)r܈c88 eA|2 GE/g51oRxcAs?_bxVCsh0:SA#Q=`u€ɾ⛥û@{mƱ8|LN}0aPCAP%LWSF΃@8)rr"GˆEXG8`݈re-́]<e/jJ` L_& GA@ JBe|m@ YmrR$c( HgҘ(.^BmE -Ɠ&.:ФnxWbl/h @n)|nܵzMǚ7" ::mA/b@ `1AHc&1 # HY~ MgaP1 aSG BC"ȑ;(7m XUU*Յ;?K33*#=Zz-oA0Lus5#lكx7D >5"ʀ}75ه| ڊ{d yfR;a6PY|-`wȻ̺fslV% fxPY%0F :DnD_ HlyН$0qȦM\,40 Ҋp;̕#o g^\w93?H{v]{0==E PZ /C?CIc(dL! oHbekRc@OGn{b-!ú1Zp5`kHQw@٭eA.8 @Yc66j,%}bJTςm9 !j tt t~"+.z;mK&eDIY 6mSS z'=gA A`sAsMH}h9pI _*a .psj+$ᑇ?' iRZlU@R?@oxLEM.Ki‘,:\ l=xyoF0;vrt!Rޟ\d:JPffPf }XBk9.eP9N {}صs^y%qz"0쎏@&2߆ lqtb Q ,(G(4o$pA<ǑJ58d3Miz/Ħ/ԛ>y"k `&݁:3 0dhY!̏@]8^zLrK ~s! KPq f Q ::6Pč`FnCx``jusHhb/اнV7i φ'(h|gI6dscX*Դ#j0d`_VA#̽HVE[EQJkE/UUgt7.〩[ЭӰR0Z|,G:4 wao(IjeOg)!akn*3PEɭ 'Eu4'+k0@)-"L(8zP[[O?yix>qkl)b$d2'~YLB 7Fsgib J#Qb>c\_0 E)%o%E19/5ShOm»nԑ ֢]Għo8|9 .mdaa=+ WUW@>4A6V/$-@;,gԄiE J >_<˗{={qWjiPu_|P1Ti~Cɺ׷\dwdقQhbg {+̺C5'u F[Y;|w:H1 p݅~Ђ3.t7DĤ ~s+0n]w Đm}BK m뷴ƮX)v0)Ta\t<\5Ȁ$IE; 289\|C Mፉu-s@\hr}/(tKP.UⵑA ؞E3qܵV¦~qe]1}-jR^\OSV[q0gxGU-aWp_(>@ Z5n!~M BFJhhG!,^`,J+HqQm Abhڎ $IġA t6U{SxgV+jRܓ:?BSfy-VD;>̵ĺCӴ֠ʢTx+ivRS }g='ap* TETP LĬǴǴĔj3,>lƗZ&f 3KBP 1K3W`0@$$@|iOº8@u?U+FvCj\Ri@سNY?6@}{P , (0YAhy=i-[!@ 0tV+sH`$\~H ! }4|INe@56]Q> Բp@H:* IDAT\ dulfӿ?DP3ο[BQ ȇ‹/lI(v$p|j"P$S5γ+*Q&}r#ت8E|k)[e PkI N9:WBaGjOy6B4$9y9}R ad~)ܨFApbi~o}nA }s0 0Կ-wkss) ?|Nٮ 2H)9_"gnͽ S aPds`&h֛.ٵ q4u]ae! !L̫,HAz0)sxzJ(Cкkx݈8P" PPMn#&#څ_ |oe"'":t3 OF@%tK:H~P؍EV_WIPJi,wUvy8ˀ-*R9WdHy\6"Bu5e3u?6u4!04;*=P(!cr#:%f& ,KE)0? $sp/ F!{ajTC{# fxJTxn=%%ezQ 8+$ wcIf~HL> 9! |ZG,iW!zLO|Q|cS)0+=TUΞaYx6):e֤BHFU{-@nҋ # mÙΡXK2-"F tXk`WXjLm.#%C$h 8@[[b'U4%b\_cm=a&oΰ'hk?ˋu*)ABAJ Q@`LI0 `x`jș2U >/!-N:޿<p~K PY}-z 6c9GP -p)d2Nñ)6S͎HDLg ܳ +jzՀ WPKEBMЂ7t]A(&a 3+G3>2&ȵ>\ۣB(h$,csxqqc2SO_TWu0@U\J(]{q猆5 i Xg`+.>ō,?r>Y߲e3E33r`q+yft 7"t|mvLmkkT. Lj&Ϭ߅`Jtӗo)>@C\OC`jh.h[R@2@4RzvR F,Yv2đ"p5 81Ƌg&vsIe_&;1,*n$Dgf$R)'0WC?@Ԧe`|hiM@4i^MW\h.!wWy?5>vW trP:;qyg2UyP$+ raxNW^y¸ RzZpT9׭2NCz~+'Iɬ2H'p''vn #":֭ǹsvcQys)-~ 4E~s8t_#Aw8Nއl0D/5ϯz y-FpIwCF T?, 斟)"SjnMQfCnٲͣyѐ,4o^qo`,3)BV?ygܵXV2NXoV!I#ަ`7tnmm2 \Jq^0Y)ᥓ?t TW Pe7H;ƭc;ٯ#rm`?C,%qCxQ0;ڭA;NYɸoScB!'2 C*`!hЛ$©ꑀI9t$`Eq/YLyy!/{#[?91GHȩTQBܶiu'nsI/OEs?yw/[d-i:֫CU)o{ 冠̞皱:q;9﫸Քxl_|V.3"pVrP7J:: ) y"?Ĕ` '@UX.;)~B_-mG jnx[QB!hLͮ2~Zae~| ^6 _D<#P႘%8>k4j+<p_We*  yɀ, l^ə%މN #  FQh`ce= 8 Jj5cE+ :YW良ż:x_' :DNx])jlw tj0P(l6c!Uד3W;\Gx/K4冾N'uAj_B~iNVl5U"hAqtSxa€  rz `0EνPI#OR</_fg+P0PiJtdYYׯhx JGAYȊ)0h'c;XD$B}^4At&h,*ʌ>Gy\V>T+RbDQ^+wG'k=.?8A+ D S eWi(лp)(]QRjBsA0U/MpͧW 2=!TnRp-ֿ:<+F>{C"vumGpa RL\=x8.@ #HPe/0Is\[_qёoj1 s qW kR# SjhN{ǫysBr9x~{NzV;F&y]o_*Q1%E* H0MU?s_DSnX(4MC. bd>"x [ڏC }v XZa@i{nw*kB| ?%T|+SLKm[^a"$ׂCf ~ zo)FtUc~K-ݮ`&㭐4 ablbg2{_+y(\EPwq ;0W*M a*@t#R.e燫l Sz~Nt G%Pv[rŁN^r=Klx,g>_ADC N,@'WKNyØtFU P֫T Y|p Y-._\ Ym.@)_pj#yhQ7u D<8͕P:U;zfZj գdRo<i(" /KWzz]A&%!90؈t3 xW@ r?g1 p, {~W_{SLrܹ̿W奢sƅGak@LNl铞%>(,kͫ'vkK5-ᰗr8~ B(o 0?% 8ѧ!\BYU B}i`›lC)ű`W;uȫJxs;k zk֑B(ӫeu[z !XܳOc8}L kP \zСHJ.@G$b 3܅>vH&S媪cY(2("Lq-?9hmB2iCW!-bW \Gn@9%ӸBa&A {;"؛"`k뻸tZ-ȪjM_ CT(uj5Hp,+w}}xY~q; a( u(+,u5?;g6.~@ĀQ49's_42466qbzz֭BC \#wbD{h[GBru ʒMMVf6zok, y?)o+(Pw}nۿ_$>We|cm;l2h_b4D"/_Gnr9$ njk3#x[XJ/vMK+n{3MHe ,c͚Vlڸ {Q˶2+4tq&\Y7''N.b_¸tӦ.H$Fd lip<(ɔ.,*KD^5 E  Qa-D0::g{ss.>hm][o;@,ȰXkmjl~ٳk* ?;,Oga|"L٬BMӡ2LM+ 'kȆ }V֙$T:FFGs##59оPr=, CQd(RN\O>#s? { ._Đm;\v+JJ J$2nنiq_|#2)V_[ՓmFW| 'Gצ.D`-O4u,.rbcqqz΁To7 .\_~ժtlܰ;.#AY$1ٳܵ'4&ؾ٣GO̻/@VO<*Kxʤ~ NNihԡi: C/G0P(f$ cq(Ee ]GPf199\>[EiiCvȲRr^)ׄbtBp@G8qøx?t# GjnojĺHT*O>8b8(_B~l\c||CU|(b=ؾmB5B._ɓyfNצ\lK ( (x;x~x|x|DM x%vC7Uxظ|OuB,n@׍⿭a囮XX\?!H&h_,v_.ZH:ub˖hmm20 LNN.]I,*mنx<Yp8T6@nW`tyic`#ٟՕJu ĕ 7_6‘y ,W-Tk6 k=TÒ"+#L! YBn৒ ع -k\m= @ӴrEQXiAs24&&=&L>.{$g9Ǯ,6}D1rS1a岎D4WdD ap }q &=R;Yi184ӧO7^Å03;S3Ԍm[# @)ʤ(;(ۖk  X[+kr;R|omxm!B׵;ai-N`hd"[f FC!(Yu]i󘙝6nCXDDH@Vp8u1_EG<'|rwդoD߹sp׽w=!‡/TU_2-g}˲fUXꗬ@) C)NJÑe5OE HT#ֶEss+bXƹ;W7]͖3 I^I Cc0hq&WW v7vC3fm lدKXVwC,C0ib)d%Lcbr㘚,wTUEt߄`0d>쑒DQl܈z<!m>[А,!v% _(ȃƟz3HЦB=~_THʉ%/݋b^D#QcI ( ܋-L,YZ'Ԃ5mH%D|&ܒK T[Vԍ C/*-R>6n¥KP(8db$_H4yoz]6rX1A+ Ze LP2ot=p(Xщh4ZN*(YIpA]֏ й=y@-6>yGlO;. _K$~;;vv9-At?PF17 0LPj4RPs.ێ.MZE[֖Qlbٷ%YoIHN%P3?υNп]XmL1=v|9B@|@)㸂N"a(hbiipM>Pѐj,quE Z|@Iֿp(?mv/X~ᶭp;8J)U/b*W,%ǜF%|I hC{uI3eYKJ0VёwHR\>)P: U"am >g9/.%@YY}@HͩO D,I#H$HēO#EJAYАjD[k;Z[%X} :떔\Yϗv`z,2 m|} 0hx%)$)DQjE-)" # #K ͍-hnZD"H8@+n7dJ" ؐj(@צ?숥3҆*ksUKO*6d7 V4$wbhxssN9./D7gF>я󹺊sJnC ZƤT[B %Rr 7dǔ)^̍DK{\o>pRdHĚCM+{[[݊QAClܸ񡾾>N>B}أB> ݴ;vt4Ŧr# dy7¸o24 ]r)xisEl0пɮO{GI`sVNz$I+.[}'m'}ݷ/`#?iޠO^3A?/r3]F B;эyӭ4q-RD@NhV bmk%LB%K0@}eYAWm&5?a o.E]sa~_bIA?i bChTU18~8^{}~1M? )z!'L{jk^r*$ 8w'mVO8n6405\ vo#~Lv_w=z$:KJexcV۪݆e4f7 hnl<ˀdgF ,?X\@Ҽp0uvj.JeB\E-,+ N䄖\˿pu>~aVx!.,//C>\ 0eh@%d4#\]@_hBͷNq*I?cOҊgt3Jo_I_L)PU #@"bzڳNs(m{1|/aMܼw!n/{οmb5 Ed|+E_`0_.Kz2 ԿJ3SOYXXl*'+p .,mBC#LpO{v()ed3_:t>|6(d=}b_@FGFסZPhnpggg4k߇ >CWu:HnGY(5>&Igj_o/ˌ.uC^7?A`Ы/OOKK`Y&J%Iglq>d WE1 =:w#4|.]AHK=~*.tkPoYSmZqr sss~]KrB$$ S"KM3Q @jO,1KN{nϦI=00[ƶ#P U.}YnhhFGIVRя)c;ŃTWb4)t'Actj8L GX7pbAgI?kp }ӟo;Χ8+ 0,W;TdBΜhM;Pd1pgEab-7]ɗ#Hm>*M]W6 (I\wH@`g*t{C`G'{Mc@Ox!uLOOE9Y"@)ڭU f!ZH.G lD A$l D]?]Gc #7p#<~qvid)/cyJer;bv|0 ' M+.=D}WzH4ItTUۡUoOeY@oOh l\`P+|˖-7 Zq8~ \]ׄ~u;TiFMp J@fD<4z֌Ɩ;O-jO$U[m@6o܁zv܅ 74{4A4ey:bȎ> {'˞= ?-,$:@naƋtUMHF,//~ Iu Pt-/7 F;x_,`dxg Hbrld>K+E3 ]ɍqY( 3v؉nQg}syIwf"O ʍDJKʇ}+X"*G e5oi+a!h=57`&@Vu++@pE;wOE`z IEn6TR,@Uuؿo?di}+[o㺀& ;8sLVyb * +>-`(|`d8D}eAfBns z?gBvQms% vl!Z$1J33>au"x™0A c,˪tuكghU֮ŠyUj]G9}?;;jTU+O%H@ Y ߓ 30M u9)){{{P[ruZ +9ufեah!,ixp=N, zcm:ry@+|SvRN>[0bM'8H/VA&]=|>iiZ`Y^LǠx!'5ۗ]߮RЋ|Ǝ;u I9T*ͱzHfbZ @+Guo䏃'IrK=XaӟJa* YRjjSިp)!j ` = )yRV.& 0 ~@}ŏoؓ@O5lg H,mfd&XC2B?$y^M)C`qkhԛp$l7R3;SΜtvvt$ ୷-cć4iA;͍*b a6@#B :݈uJ%~…0MkT_ZObAc;ObYޑen@& [x7@V N S*S9XeaajZs'48 zr(C1AY@GG! 0Mj5OS`\!d?)࿧b Y<7B82;)^/VX bc,$8d, Gbg/d+bwu2`LF" @`bb2g$fb-`u0lB@@w7Ҋ&:,`RUGR^dHg OO{}&cPa-Z+8 t  cS!R&o9aY,,,y#3j:c[ ҲD@)\JGQdd`YH00dl,dҷHYnAor*=M㨫VJ;Fq1`p@]uO>SqʅnsY4X֮xpT;~˰#/?~M{ &hӐ9碏wpщi]OJ",//5gELNdo_b+ָy0M _Gv>f?}chvOXo&py&3plթ*Mw 57Mmn|hI +D3 +!hqggv 0z3#PE(pw87_Wt G&2AMNā_Lq̐$&&? : &+?Uz\B %LPAD[T=aّMDJuYbL#hP?~*c-&!bDW(ta[ j5r,.|=8cO* _? ,4-X\\<"mcA0)6BcǏg$ZAXT*t{AgT7-]]I3 N1Dc/6*C뉖1LJIDATEIBDe ,#@"w&uM3@0VPp… ~ׂhXqVR*T\`\/!H_CZHvuٔ6 Vqϥ`|>{F2/!uJ37d40??xFgoIL VG(HIxL佷T%b6`zDR@NNc=>)tU`҈Qc쏕=-8HDžDicBbycI HŲ1g4Kdtjt!=ˢc|z`.1 R۾ѰZFRO1%NX3 Z,B|b)x+G<ߞœxZeeڝKgr ZAZi  $k3@Ft W b򏮍VץBӀZ͌ԇbfEO\H{סּ7-2[Rf7#?$_x/xBz>]2mJRmrH ,Gw⇥z277l Rt_|!M2ĻXwgZcݤqߙ^k~@VjCXPl ʈ.>5;{*=*ULRۺ(7@,tq '甴(ܷvVk5ڵIӌPks8C$p2"&"F hA A,@7$FʞcAmH#ୃ*ʴXRt|73Q!iJxk4`\aLĽA%ly΂4FooWV bkv,V^r̀iA HpE4V_εX,E&UĈJM:cc.<>U.h~(F&5q`9d bRs.4"9t["C>X\rϭgUd @@L3ASfGiJ&n "BW싩@ӲG1qvLuvx kiKCkO|806%XqneSk8w~eoF5\@+C]ұ@uM!-,`k!u>_ ui֡RD>/i>P\{G_zZNf3̔פ<9Iq/يtrj\81Pnpp%>^Y]i뙶``yyQM{G]֌A8P$"ҝN:::sa7Y@XL/6sȄHΪ$n.U0 #ãf`NSǏWu^N=t^8Bs!EJ7=]8-Ft6q|>v`K*7mB!.4pI8l20&偐Y.03; ۶Fgz^xmjEm@|e'hmHp^t}+w,%aHu‹$Z-(Qpļ8-@FomH XXdk,JrZU~ʅg2طo_$ XzGӰoUv)t H_W>yn>])Jb-}$Vҹi\¸1|9q|wgl-DWpuu1%o >ډid@;Vߍx>>`40&H4wxG=*D.F+QeE|G:h,h tq h!d5}๮nضz*sYL,[:*Hw u~ľ0?54##A5 2Aƃ}6X :s`?G}=' Pʯ71m߱%Il TT,2m@4vdQ`!qVb̊Gt&EHߎ=. grH4(;3OԿ#M A0`D 9dus]u~:]Kw/rsV̰0%?n]lhMӰ~ᔟ\XUyW̙/1r?ϏRvs۱ KY.@ |ܰ@U5 #דVO\%~|L*=r{ k!GmRLƀAUt n `rXc>&5b j~?J<y4AM\=ac|~<VD/8UzQaϲBOi^B_oMؼ뢀aڇ8{OA^|suj$IK$7GM \B k\:p~~k d ~ a+Rg$fxG`_˲I< 4]ߏ]/7<%$zBvvei‹q`^MJxex .ߗ^CрOxP2&XAutt?7u]6!(J@3C9y-5}F̯&d2Y0 gDZkl=qz_g78LݔFVyb(\bZ«q/cb3=ݔ {oo oLI[|W4Gv,/-Ɵ˫U_ew $%j=ȫ ;o{,˂ 2>##RVT(v+a(ٚlrEӴ_>‰);oP>?][ZY~ҝ*ҍ /7-CZE+̷h7ŘW*8yu8|q믡A,..oW)o 2V||٥ދ7fY:uz{zT*d ͂adTPdYEcA6LCB}]JPV (_od`yrd"(bj?y-x;" nz"l߾wWrUI4-.!es…!R"_[W4.Lfg'aܤ`<;nCJOC+GVPg߾c?q=puk/wvؠ80}ay/>˶75.u]J5EeY_|3dZg+%0:<=f!cd#H"᤬@#ض Z W`ff&ΞTh<ѿ|e~Co)1 ~wm.d28xÍk.dW*7FKK‹/[6w]+_$,Rz^wq}Pӵv/ad 2,Fgg@e/[@w8 -v džZ̈́jի4M-˃o}o~sS+c?x\c@O}.'s,\uհs.`J47\W_=O㦧۟=*d0 RB(B!sGV6 Yk O?y<ӧ`X~mD@en(Gn~WkYsIThpvvwpc]iu](0wq&&&`YtSzW?Pr"h)G+c{7uöŹٹG~_|qZ}A]W0h z{zaddJN(t C6]@ok46U=ݜ-m+pq"LOOArşرss["YH[nruwu22$Z2͓Μxg?eL6OZ"1B0 wmIE.,7bvi)ih4'O?oxkAeHTb_a 4C/ۑ/52:*+z|R=yafÏ?":eC>HZqib cka||x>tЇdy@~m{ۇ‰Opwn+(;z"+E4YQr3-D!HqpeqF5톽f۶9?7?k'&_Ut': :&3#?{m[s$ɛ꜖}'O~f @h/@?~L1: -Z lV|vD]ۻ|}ٽ oy4c֬WVVy̙g~_ZnĸiA 5I,Rk]ff 4L@C ޽x<7W???t=k_VTMCݡxl=&[?_<e;AWQ^|Nx6[ f.A(QaY.Q]q 8Yֆ*r}fiO;?ikmI&] N6S9dUE;4uAzbØy-qʊaRUWrk]cɥ[gLd=ql1hJ avUྐྵ 7#Lgtn\A*uܣ>Oo6BQMCYG9, {'';$4%e|wϽwsW4C;(BQ*B#-qcP,)jQDfIMs[k\By2=z/mh)=cOEP:x= !.\<ϖ.FFG; v<ע~pHöm~l\:5y؃V< G7}| #Ygp1fRD,L B'm;liJRDYs^4S 7R٧^MOye~@״N_TF3|0Z-|?֦nOQSݻH)6ӊt}+dYR,BWYY L.ÓNX"B@Tx.dޤb{gh7}]hj<'`x+oN 11\fv-Cgaq4pNB+ɟq}qa:k>Q QtW&U=4[S@P%N4Ķp.. fq]MZ|(:vS>O?yX{:B_Cͩf( N$]@c?f4J l`szCBx]w@q:P)=<ò,#$6*"E wb E"NbĖ/Ʃ;۶ytN.:2e- 6(4/(Eƫq p{YYdgj`0DYߊލj 2RJ<4Mjcds @{؁7+O)ضe2mBd0wzu%'q]G8no[8(K0{揲ǖr XV@ E{ ُJ[p\ɝIf~)M Xd2L,iwxuW8W^i"\Vj!å+ 6TPGK/q{jytW~:u*gNvT&*d3Xe=oR_ {I~y W6HY7d׎p!x!4fXmNpkϖ+xk_}ė#  !"kK7]H܎<ŵiWɐ7l}{F#TUV8syBw!L^)JÕ+WVow0;;KKK+T"Ƴ=7&3XDinnrBA8m|ᣍ U_oll, b1|ߗH}re Bt=m84J1MӨ !}A)456?/G5M4tLfh4>u7 b7o\Rq]&L?y###8E{{k"o7l׺[YfMMʐRbr+PM)eQ VeR0!M xk>@) !^myB ϓR~A+䬿;&\?oڴŚ/ٻw/ ;lf.tү ާjRzTVV244X,LҀ6&}_s]wb S|,[oKs~{oKW‘-p8" 0 @BhP^`̿Ͼ{{Wħ RĉtiMcRByJ˅l?599 d?UMMMgЍZ<Ҹ C'*oxmQ=pLCcrv%ϸǦAOM.)!$@uHP!U)sot';ތɒ~Dc9f!!X֣VRo[YBDfloSgd5ct#~)#PmK BaFK ] 9cC06W l.yv+%ث=RM^ Я$rXK(LG!?z.)( 5AYUq U/ugSio.9IM®r6q )8PUFd@dSȈmc"76vY;HZi2PW#~ex b@&Pp VYcFoض3J^)j \o;Mٯ}^!SWx@)+Tbg9vfO$Wq}ȚNmR 1@oo?ehD՞G m}q< yS]n)7I? 4|"#Gؿٿt^k ^\;Ҋ~1͖>5 AXLRޝb`\i)@6&qw&@  J/Zz !2~"7p uF?oV!\6NPQq[}R D' nLq8MsFypm!H"p5,!YV\ U=ΦLH6Y=jd{f {'?Iqc{i$nW_juv_]"(2$&X@` @,M]U7*uen@3& ;9aH@ CpiX(d84a[SBK>klʦ"O^e~QKNm~pPLHYo9nNpX 5oC&'UF Nހ ,ФѸ'[&/EGv/ ?..Ŗ,׸?aM`*Z}LDXV/c2RAEzFF'h0=~ ``ZBluڣEf^?;,%63$Z ~A_Wd::v^ֽ+X{}ȩ$( S7S y~XT XV9 cYiRڪl*HU8403' 4qg$ݜo@_Bba7h%P`YCe* @﫦*(oE^`)4鸣gil2N pk;d}mqC@vxP C7^//\`#V Z PK\`V >I&5 RWAq1*vz{  8v͢:uH< ,`F U\n.*ub$tHL Z<ԙz ^ ֕GDLo2xS$4I8$%BoFa{^M^n.rf32OkvЁ :wcP3IV(Cu]^/>ؿ2zkKUL A^`~5)ܞG37m>+,0Rz5 `\M"!i;u{07jH pl/VӴӭ9& i^z!qV(n&A}LFOKJl׿% (V@f/P!M $%+ݟ(vMMIpÁ{zbdXѿ-'^TlÚ/\{ T$F3,7(hnMS&cVsgx-G 4o{ X"긾 4UdM25#52H3m6/ۍ)v^Wem$&P}Ղ1Ca!j\rߪnP֌5. ?g{QF߶xZ |*%) v -5^ۉrC@ ,\ CD+n^f@WUmhF9>ww &k=m㷦 Oo5f7 x,ʠ$W**OV#I,\cԗBuOma~=O51}~P *4r :l>1OdFR v1Fy8Z嶻݀Xl1~3?10P[[YcV׃BP h[ 0ߙGhUnwy"]2xMy0!>׼^ZX3Xk !@pqBexcNwqdzڧ~I&O~W$ppeEG~1Փ:Uf\{N,/~Oϝɋ]&X\^W}%:Xn2BB@@ !@p1"`$x7ّ;L p|~G~ @B@  96~G@.9şɟb< xƆ\so}KC!@  9d^}S,;\ame  xZ.’S<ySK ]3%sO׮|nY/܍_^.m gp"3ܹ+w@B@p1Bs fֺЌz: &8oߟoӴ^mo{!d/?&N]ƌ9%'{/S CsDĀS_ʿM/}G?d|s}lR 2@83VH ȍ *!вK2#o!. iar` # ,.0E/緌s8쑝Z|oo5}jZrҳI  N?t>M ʮטau٤d٨:>2Ma\@y~t.!O}Sv*rb^sgM>@:" B!o_볹"UTuBQ1-b;v2 W38'Ս +ݛu02$ABh'3'$bkk} Z]dW6ēo;~J)DQdQ!NO#"S $i' = @ 30S6G\`߄FsFO\-Nvj f 8:l숂Zl@BXGZh?EF(>0+Ls\EGHۧHLY6¤HmT h+r~&U;SXj0GkLB h r3`b`$kasE$"`^v9Efol^jQjbι7do;i6C?!bZ+(H9t6/6Z wnt~߼pOU/Y*3M[0=V!*gpޫܐ^WnNb<$ vg3j(l]"fЊɇy+?&.c# Z}h^ˑc/Ű?B7d 17ꙣd::Qt-L&ﴻo~qx0=W#R ݝ|b[h <]֘{biޛ IidnJuI!uvЙ,K"QAE YdZph"$Ms97o{& 92e.v~QdTQ1T $o%P 7b$ŭ &)t£fR |Lm$ؘeHMj{AYd]8B:H"R wD͍MDq4ˊRr>ܺs i_HKxs'{f51PamA>sa[;S)%f2D Zua>?̏w^|^DemE1eZp7)U˻[D\ SS(p<U`>A,<\6 [3ٛ"t0|0ڝiAxZyP: TO/{g?^goȟ!724y|6bb|s4:{]:[{)nN0 ax=SY,IDAT!B4{~ a@!:1t˲ E ^ }F`݀@jl{ds0pkwY\!="PQaRBفjwR/5ß['Ks\qcZUKlMޱFY$>-D*fR渹~Xה7nMGYPSyӠg[ ? bjbX2 6\OaÚ1 fٛao\ֈo-G톗 agVn 9p}+]~z/$80S~ṳ i:5_wDC7g^Aä#~oS?Bl'.FXPyuo|Z^%- PyfKu4arjq0৵ i.bP4 6bjCFݔ YJ*36H?^zZc?^yk>6ujbӉurJW-5bZFo8 #4Ͱu0Cjg/k-Cּ7 " /܍_75}`.m:c0YjXZf PFIpi&Ei5Wv(okG* ze",I@D@ט (ōTmVv@tPd8d9 >M,)5=&+D<( 7P\'ظ|~*"~f\[2qTChWY(=cؚNfvy<9h5'^1V>OgCE&X$@; H{UB2AܸU'"eO ":wS*57X=T@8dnj}=fnr{HnfHFUƄ ]jīf)KTifI k.UGd5 O/LldϊZ!}"Py;`;בo#fFkw=~^˧0]~ Aۜ[p[FsP4i/8ۼ~,cL $wZϭf874xXy}x\x:G>OeN[2.9 fUTuEO@0٣^]^xLM>4G9zܘ?{~;_PuiT{U9sK}aj]`CUpa53꼱;.W!;$~ u8TwrFkkR" @rǎJ z1g@+@cM(`~a5"z^,myj!@ OafdЬkF6`|𝙄@h:3s Ф|U(Є9-q@dUHP.uhkj]>Ko3~'kAX!uF~.|s@{p_}=`.dcGk\S[F @\=$Wڊ] BNOa[iT+1svɌ/.hCff{KvS"m<'>gW Z﬚ 9L#*HV8hlkG  K^c t,>Y(qVo <'~Yohnhk3Gbj=KK- qRskm>2ԡs<}PLc4V/>1qگ?xF\ (4/+*ɨIpunslEkGh3X1sQp܌WͰ"i.9-}*4G G^lQm.@yl͘R4GYW2(n家k9V)j请ϳ7;\@<\@@ !@  HEXr?$ 8?*A !@ B@@  Y%>@ B@@ !@  @ BL:Q@YOH0W29j{Ow<[`:CK)'^l2g46 }Va;Hs}nw/_}YB@  d2t:O[_wA+!8ϝp8 #G|?pGQGĕ6ѱ#׌<*'G@EZ*3>zGA"UdgǞe橙 "DQ REIkcS)"9L@T[Py>i;q6x_b?Ygrw=#RG,ɕ* D/Y;a4T;!2L: ̈́1><ֺ%23z= 2dY67[! U"!(dgo{QĽ_}c[__?8vbW62~"|"!{*oh߅^V G>%% I:k5K*hȉϺ2ZAܫq8ʕq fFEDTÏ<۷1O=8sREXL-pFAybhJcNc?HEkؙi:/PKn& AAVFt8>Ac<wi"3zq E@Z<ᆴkǿxq}?qO0ZwzTWkٟf~^W "Bͦ *\d`{wI2{=#R y54ܺ}ˈ1J"*9N0L@Qs7_G9!VW _w<8د6IfAR +++`Iaff"1ODžvX̥Pz^cq__SX,nQ3het Fxwƕs>;y^t{Xcspm>PQThQ͍+1@ VGqqm*hg9K f\vmMAkzv.x"ukBW?ibD;Wwy_]ZG ,rO0sBg)fo!|ŌkO0X3`hh{,Osjxڝv߅ZйO&c'9-Lci4I0K$)޸Z'ܺ&<++XFۿ.rCs9Ykhu;+]%qGpe1КO$ pxg~/w?XJOQi*M=¥jK̺Y2+g}>^y2>RytwН^?+t֌4M}ozslFI2֑^Gg P-ΑsVxdiA׿zϏ}^߫8x8~!.8:(IZ7^PaufĪ+2S;k03ho~9sv>GQgJuKsH)h bV:ǽZMNxP-UǦItSHdbuwxs{*,pxzg}?C?$=?Z[|ߘ{RXv .git NF^W\@?>_~D`X<{|ɱI <E ah{{{c XrV;}^ |E'?>ٿXJg]|ߕ (8`3|X{{O NzyN` q޻XI,= 8fg$)fI(cwQ7YzƏJ/6GUKWteɦqA:ø,qmB4H.C2lF@D14GЋ."HBfiaa[~3LÛ?D[9djU Qɱ'_̎x5| 6)6_jVu#VTeMH2@G,OS$V/̔,J>(|= >')VpQ#x|^qwM3ח)v( \[fP,U(VXut]Gs\[\fa),c@)+Ϙ<0`p^'$'mH7FV1@SA^c}-='<`0cΝ EÀ:_JO?oO)8{1#wB'ʀ`쉰>T@4?I"m](!Qc T0yTfc`sa2L2B(v}=cF_EC!i*$op_L0̓aU~xS=xؽ$?f  | o)$< *fۿ }0!^?1F_H~>$l7ްս{*eyf*-u6Ä=g[e9vC.G.C:FF008ѱKDeo?D"){vF>2% ܎:Rbwp99}QP_b~1O0.YKm>DQ4Ngw"xxɐc_y-xᇛ,y:҂kףpZ .|H3h (y>}oz 'zO/RD=x(fx䑞t[lt}>6^ «2k倁.\k#Oߤ >q#MLSO< 7܀ŋ\db~ X_r@ }gpappz&C,GSPhsv0 >!_ ذJܺV475Qڟ/ c/3 N Bd+WD8Źsbuy%3IfصAo_3m݆$%[?}u1]3ff<&`e*k`xqxg6@W~JfݟUĿ!׵ w}7 ڙ4 q;b81|o= 1 #X|92,v\mm{}ّ@\.1rS3~{7m܄oHKFo~#/؀]Oelټz;$G\g= G S ~.D y-XfMњ /MXpA~> p &b E0oZp1?mtg9L.` fA ;t2OxbLAilҁvf~[;>"g v?L.%K߶Ntv.0hgpdl/$<`u@BXEc߾NQDgy@l0G Bm&tuΟ F +]x}<λ!D`{衇fvLe?W+ K,3\Z[1M3?ѱnwc<~n]'z{TjC~trMX~7!J7rRV 5]hE66^ -M~RY! DzmG G(u]`\SCu32dy:`#ݢ)5 qtabb?Wdz>sg L&3CћC`hnn5hZѾĤeˬQB j uM߬UgaדtZbD]} Z#RܹIlal%eYV(R @("1ڞ0 `  {ÄJ===@={Dg@H1 K/u`ۗt{`[jOl^6⤥u'%lKF{:t0D3_/&wmeSWx~^Tvz!VLXA `BH4($<uˆ*EH}/v kB_KO ~L!+ b,`1W TxWS Z| drS\؃z=ZԏZ~/ј_߱"`Xevf{o>Ms*PUZABz@PK|3|-?u 6 ]Ͽwi.?ȓk^l0*B5&\@j@x ]f^]O>ȑ#-T/iCۿ#0!^vonj,}ѲY&F0 㱌0ί~P?HSq_mO;$XQimsY(K?_(ʌ{"@G455BE7L(E#!NctlwXJܾ˟.I3Ҿ81Ȳ֖V+E=vFGGg%`hV v@Fy;}Nl`mȡXغOJVf|011zgOd2f ի`pW,\j"Xk#X?׿'FցukcشA$nq{] xQ¦[M]˛kH c[l`!fBSꬴ 5)(I?OOgLkpņL&-,fO!zcx^A@߁sW4y/qO$&˾,`Q/{$f'Nuw=0X{U^lB]ͫ z.NǓhii?ƛH$MIom&q*|AݮGqmw"0Ў0ϼ$NE1xvgR.[c}s`d&oOs-7>Q475/Nv?mgnnek,&:-]듿5kO׌ܳ;`.`|޴Fn^q # A|\k? XIo"Ν?Ny G>+VB+Ⱥۡ> T}G͸뎻! }瑞f`POL.osfL TjmsTfs¾/,ZaUȇ?z=wwb:5G:]ͬ*6ą{>OWj om%Z ^R`a=ٜxm?`-eVwsYX};-%ځ`R3~vl`BlQmՕʍ+~9 Ys E?|?pw`.ZI艣FoC,t߼yEQ[nu6% o/Y/);@@050 5/V0P9_W λյAif@BpݵMք `ZF(E4y!N McsNk1o:[5NEomYw6ܷ#Ud5Q lX cǎi|G 6}JsZ=ぁ[ lo=恷tuor:::*֬^(7t-V,'$z4/ vT*@ #/7;*sc =V?66K 7`% Bo؂Vo߾%iyX2^qahf 4g`{~?`mbÕ]_=}[!e$& ^?w|A@rq:"R JQXJBt8ydxH$b[E㼷lPN4~tk3>hY<7CO.*B,85T3"L- (g[80cwo܂X,Vg\\D-Pjv>fSiXJ{t,@D&'t"eFF=( Ǡ@` ,K^xsE݋1AT\Ld- QUp}l`pŕH& $]gD"7G#Ӧ P h  <^ ,@c#M?yIelxuvuEr(5>lZ̕u-`ݜ%\{~LHLX>~gǼd^ـ LY#Jl6#={ֳyW!r"sЮ5L5G,:Yܩ32:+tuvbA? `:.׽ɤ10x6 < z=$$S 'z%ޓ^8/[^&EvFOiޒZm'wHfG!_,Ы7]Te< 1=ƝfF]H^70CmF` &8M08gA=ݩ84 `ƀZt/|٩2gcdd<@DHdX+؋{в^HaOοH$ŋN'Q ) ;a6`r?+ܹnB|===Y3^λri_^|CB$B-HJSy8dy]di̳ߍgNq{af@q P> hmܵkWm>Bc; ]_ItǠ xYx܀ 4!nً=5@"͏V5a \$ҥ˼jb~K>/|K@8zqE &, CxaeB>8Ppqxohh@mm#w3HMQzvpr10-o%%HC7j.N㌎ӟ6DQB(*8ˁtJcNq~ntɣoP'|u:+\|w&`p :W70 Cdqz-g g$#@D)#E޳Oi0R`QO?HXbafͨ:1 @׀(^|)vML'0ƀcΝDoFGT*д\{5!Ԕ圱XKqY=)o9[0s;73=³5|;Cՙ2 a/ϊߜ==p(bxJVR< 8s(A=d\iv` A`5x֜Lع{ǵyEMob(,:f=@-X)ܘ_;#( N{y.xoN>k!ؗ;yoRK Ȓ̥N)nK|| ?|Pp r:gB,ނ&$rٳ'ڽs@J//.ἥbT IDAT C!؁9 dpریe_4! h^'/~߼&R Y<9!xuL?1뤉x~~Ps_r}I4y|t|%`zOH b0JH8z,ZEfOѨy̋+$p{3;(e8{gϩADp G2D,,ː$ BMPhJ""5FF0pa (4l( v p2,́򻃀U}z[/cbb898fcw``}``hmnC4EcS^y%0:xLG PiS}YBJLRsP[PߛA@|A͔pr; ?cg~8c?_+_@]mbo_>#[(ZRuY14666@vEQ¯ ,0 tA,&TWoF~axW2\a~sŊXx t,@}}=DQ3~nid9<<ّ.8ZzU&|<|{ҁ ܚ[Ï/Οln2]?/k`A'8$I( ([oنDbg)s&kԪP"fU&"]f[|FN¯(y z{l 7oΐѹ 7nBG{G tS`^<ܺ6t_0w'@>Om]Nz F̯3nٴ ?0449 PXǧ?iY̷,vpf6A0\( EFa<.XRgU`AtˇK?p`'~ Z3hD38D{}l> s xic+:^CC޲ Mux%HEKPW[o=:|aShjj2-}GiJBe^o7˸,ȁ Vg^_@F@I{stL_>GW'w ACCn&]a: iMSʾNhnrv(-3(JO0T@Xqt5qn*!խ}>ɓt:\߽bwZFx[n܂իrd$<BC(BScZZ( &p jXI ^$:,@8w%=BT[[L8>!МVp w'O3|` `Ϟ=QF_[b%6J%*|*И(T(( -璐L`劕IԽEU.~꾒$K}NZkvjh~ w%`~J:D0?ʫ/+U7I\mnb E;ڳK?/mW:r+rZjG_y-!UWWnwWR3T-ZE!5TQ(A "@ԨB-LN4 $$~f ).g}2G-m}gZ܇T*7Wm,ӣ``@TG(J1_8}ҭ٩W]>ǫ?sKv\óMp)xy}2s"ş("p&u u4J5@˭r~[i 0.Ȩvbʳg7SJ=?q\Yֵޟ 4RTu}o,=s1]ؘS? 3)xź+\|+<Q̙>Ȳ Y/d IшZԃ20RlSk JE[*Oj_IyYop̩fϳ׋%q™Y:>^_:4g.AIpI8q—Eفdx={v.a ۼ^D/MGzxW=?dtjysN~vvz)\FC kf :cHS^)U5z'%tRd"BH)jyA?-ޣBE+}wUX9ȴ g _O> z5KrU>¾099-I{|ɗ/_*Y%gj488q$VFY'5PԸs#SW}b,gv*qwmx}݊Ƕn pȗO/)?[3rcU;+"~ˉeYo @\%jL)NO7ހ$IH&H$c"EZBkgh[V4\f"u?!(zF^|ۇn9θ]x<1'_ "ƿ"Ow},D<2_< 8MMʠл}/NNk׮$06{=WXpuC]OLLپjt*׬yڙ/W6%ERtiˁ% iv J E Oɥ'zO42 f}8AP̩IN}8tm' AyvϞys*1Ť z9iKs36n,"NL&e x QDjo8E$E$)Fؙϧw)mدGK0ϵe@B)'~칳eiJݘυ. ]@~$kgeDo/^z%N < z˭?|g*T(n]Q\2rl14c||@Uʭj_ѦK~<.cYobllT~8_N^Wi##ī~lx;<|}kd2 HlC=0F/' e7tqJ>Z\;1H,㘥rK k }8<\Q?@BPj3]d/~ӟCo]J!3Qg4r/WQ~mE@~ߎ ^xV\m[ow,QɤgfD?{=b $qq$?Yqo &dJM0`tl4[911^m(JڊXp!}_p``<?dP(4>x^d7Ͼrz.@Ef|JxXt9`G@)=VpIE/sSvxl5Koz]svYj_%)QL;ǎ ގD"9=bq)>}2E HRޯ}ks *Xd6O.sH3H$]ի.J\7 9Rpd2O|ؘH"jy3b̓pୃH&hmmASS7q+o ``pyQŲ(ynǎK_r](q1BRAKPq_k <c N `5 J1>rFQ[Sd2p8Txj^:H|lt ccc3ErGKKΜ9]Sׄc{챏}Ae{2vO7K6++ u$ {rQ!S_ grUT~>ukף mmhjl,زf,^(͠zYX}s>{g=(&s^reY*8Kد{Zsl2_K!\avw0| 2{?^oUXx :tYxkj@ʝ$ᖛa\Ѕ΅M~;R?~Yˉ[<|>g'{!Ƙ{=^ 1 '-As0'ּ;|pK/źѱѨVIX0]v6]u'p;1A ,[Wl%Nw=>jm)as U㋅hdY葆̅ʗ |63 =3^0ZMF[[{Q--7oCM&| ::qђ!WƆW{R{_xjSU_Woqv9-6P@)+z%I(RY n@P0Y?t:[}{[;nFXj bD;W?7ߴ JV| b͈D"^}[K/t0"uO k WR["dY+M6.Q9 AO\`{ )S_?[ފ~d͙%6c"MW]}耟rfhnjD}}}ehcL1~na32V),-7'(XlsRCK.PTH yg&`dѣoI"XuA jokMb徕b#`keͨW`bvx6]]=nv;OID J|w/ /,ɦv A:_xqB,˸{Xz2j-дЩ6%IB8+:q3Bk% K,í[@WBOj`]]=B)j׮sub788PHx` 3p_7jjҗ"v=]dB8kck<@E,^m܊5"2S~&u]~s AÑB^> ` /wCtf-a w ؀t0`;-~=믿K,=nӤ*ka t5hnns@ I2.–o² V%nk!nroˀq?-`Se,@!}ĂK@~7c< {koeꊍUgOPkkkfZ\:o!oczG<ǒKqMO5AP]W;w.Y`ͬ぀^f{xxm@,jقj? x+\M5s ^㵖wEsByj6RdD٬ cBB&6 H$Xt,^ CpY \tl>CChnjAkkjk EZ ~ I@u~@p[q c'D9 ْ- ccc/Vp9臺0e<߀+1? :Cև>qA@SC)bz=J,v<$M-Xz\mfn jkչ]یV`^b7ͻwui*Vcw*@]o`6Ug{G:=H$ZdJ)5w񘀕 k23](_{׭Lڗq۶QWWb /QDDbvVT2vֺ!QV475R\.B$RR)O%¡0"((bjkj!R*!Anᩂ`~oU$^SO;zzz~ӓJX$jQS) I"FGG@3 BlUK8cfdԔλ|Y_tVX٬JEQŋ!I(0k҂гB~<-t>1yBΰr,&JMAQP@Qb P(2bX1Uo&Dz_Pi e.Z~;?f5FF#$XvhɲDB!$ $@*u[__of%Ilz¯ |iGBUj`=J$Iu.Fύ^46 Bn~30{zf/Y4t"wo…8{dY(>V@1d@;t{,q۝܀ͮ\PR IDAT`jj /^D<G(B4- 5.o VhP|9՜*VJ-X:ٌomeY]wދG)fl/m.rY[|>Wh/!Xn==^e<s2Qy et? #0\L<&jp|߀>rs6,_ A$V=P̀^Ba}W?f& {F?a0}73X*[#Fon+QB&) CԌ67oPQ1m @%ȔrAW恍ņ c1^r}j#02;~vrr³Gnp)`RMfsP=k2,9),]˜$e-Եyl+h2~}3GѤfsE'тĿוOQqWޏz-`1 x9FF+|S@$廁s3gى֖VO EQLzttCCCa(8gJ nU(q޼Uw|+j+/"r,٬UDjjghl*ߝ-`׽ީi 2^k2ݳg`bjB>{s5ul$GrRH& mT/ջ' B{i \Γl6\.gZ6d2\+$ADWWS?kHV YF:`_?L&eм JR@pر:9[\Rˣ=u$2zK|u B!۬d sل&/4(Ru1XQp9Ql*?rծmlP(} s~Pݹv$ɈE<G$.d}i-N&A@`#`jRTۿ>zj, 'C8U͏>#K 6_gy|q7RcphKN>]uժ2-0J_p+q *A|e#BJ;#?S=o|_-ˢqqx>:*3 X[ yƦ&ol1*ϣӼe `U{~e/}9J@2YSl\b)hdm477{.#$rrGO_4}nV5lz w$ xMk2˙3g+zjTcSnputwBCü({}P WnhKz&U:C}uQ2<^<044kA5Kx'066Zgmm  0׳c/~my Pw +19ԀRjg狌]3 f*'N=wyrV-0Ԅښz H"  [IkZw0[`fUSƑf'L}&{' ( *B\ 5)MRL ҊfzӒx<|>[J6Z[Z=KNq'GϊիLO?qf2C_hB!D#H " dc[0IY,@:Q> R_{1f(JH&cZcmbr)ޣ<#U(NBmB/}3,Y^LNL U"]bPS2d)Vaw|@Y@k; gU y]]m!]+-0fu (\+dM&`3t*G^~vL U82RXۮ.NNNjeڹY8cQx}~fa%ˀ|9 XZ5v9CK |SS)xbhIp*P0S 0Fb CI,)йn^nU{e@c([K$ YLLL"kTW,BXO{_zo)T S_ NCq :hIF@^\Bpb(Sy1 ;{ ,$Qk:%^< (O=ۏ}]SSS'>h +ZB : _g[=Yퟹơv_:]U݄`bNl455ڎW !15|js^y+8p}ؑߧ+O^?{lI-_jrMH&FN?/e؀u;g@),ܮHĵc@gg0^GKF9 9\.wޣ=/ ċ*?LSHReQc'a hvSя~%׸ ]`9ylT*y HUd UQU I- aztuY> C :x_fOozӇ7yI9)R 蘿~~ PӋc1#S'{^= Tbrb NXNBSm~YjՊ⹴gR(.F`9].!۰ E6?odךbHF B@ut,jm"2,dY!j/=c5|1yo7%P+ Nql=w} ֮]cHbDUr9::T>{J{ZZ@fN0 i8*m^^ 3N<]\־Zjs3C(2T8qxw&|旃~JM)=y8bwy;'˗T[X ]R!eOcxd7ZS  We]"9ΟYzV̐4~Ol0o5+eT" eYbehmm+nG~}L6S(hS4=n3P p.Ds.Ç+~;zcȻ B؄" (Z@V/.M˻t;BB&[lS ܫfr89BO<|^$IX~-Ր{Y' ˡw8|}T;mʗ^J'0{bk{MGNۛ}g͛[:ZhCHG"R (4D#c 4ˆ TuxJ奙@4,H Wk\ԣ7ntU 8,@Q466`ٲ mat;T Ν^oN@Y,h:(h .Zpad޼yR4kkkJ)J@)%\MQն\.G`U6S9˺$IH&k kjm;Jc~?wD(er"`ӦMhhh$e곊=ˡlHBN&Oh~{+r7L{{{'z{{+5w:~SjWk~,]Ԕ_^0U D:;5Edf8̻x#yobffm|×v.lB$*i#$jR*UCևJ4i*UKT"m J b0ߍqh͚xwwǻs/g^0';;;s|DF} C^`4s2Leڬ@M[Ϭ ƺ) @2Ǡv(@4& Snfvyò̓xn!db~\.Q2㭥[W#^bSϸMrGn\NW 3mq͹3Gb tWf,:| 850W9"X 07 Y;E9hl |6Vqo2{zzZ4Ϸ&z2.$O>^C'~( 'F_R?NɎA0p$Qv-BFȞ0*! yj'~ynmAbgsc$@? ׇX<~iϟ O, ؘ'ZW_ǕouAC055U$O&?lpy_bb,LگAK8C(#j-9;Y-sB\>Y(--UJE}K+f\=Qrٛ555ޕ zzvCMcAYY,r?JW $(J냻~;| ` )Ҷ M T%OU\_L_˕Ű (-+ҲKa~`e!5K c͎( }\ s$Yaa?Q!G!H$Pfa:h4';˗ <uq( dFb*Iy+***x]{ _ĪDO8xpt$dm! (ߌjǕcu"hu!q/M (C~|ffF=TWq;qeX5<;|c6( %ⱡP(~{sqc݆h z~ϝ}7ϥP(V @@ZO+ bߌB}.k VC 5=)@H0p|xhƺ k} Irw<:ħґxޟ;H$"]n?v)-] pA$/9u8 OBz3XB|isIDAT@ޞ6lPCeY[R\2\he=˲X+wojBFpԽ:&@]8Jq>[|euE?O߮zG(+SgZ꼘zBYk K!?W0/^(+/{ l$Ʀ>u!j,X.W;vo.y$l_.Fi -50d)V,,"z7oٲ'wBszvw~2 "@J6`O,=k-jkk|kq___5WH/bɉ{FG7 zE[ GK|@,Zb$ٶm{K[^(RXXe*lA? ;.|BN҃kxhc8p 5Eʎ׮//xŹ\\5!$I=0#ӡgΜh 6g(Ί5bDm /lX]S*.(\U/9 )!@_~8zqd+ ˊL0-\l?3i>=VS^rJ&f3"`&b0YOrc=:$?>X΋L rN(0E" &`[`첁?PV y ȯG`O惋H@{+`W"'zb$@ @ @ @ @ @ @ @<DIENDB`smuxi-1.1/images/22/0000775000175000017500000000000014011526501015003 5ustar00meebeymeebey00000000000000smuxi-1.1/images/22/smuxi-frontend-gnome.png0000644000175000017500000000275414011526501021604 0ustar00meebeymeebey00000000000000PNG  IHDRĴl;sRGBbKGD pHYs B(xtIME &H1lIDAT8˝[levgvum|8Yk MCZ6DQA/>jh%Zj*}(< * iB$Bmٻޝ3s-*~yΧCLL?o߷O}+s`coz0MP vaiKŷO~+ӻ urh0%_9BŘ'g?FC11߻cx{Z^RE H/q]O:NUt'?||yJYgڭ5&?\dE.a,U]Ō]$/9,z<û~vcvklOIfX_I/wU2q!^ԉ*WCp3o*@ρ_ņ;w1$ttL0Wɢi1Ρs\vsvvlǐOb[=|@:r_(,:3؍.$ aOࣩ+ԛJ/=RJtЙ~yƄͫ QLЙPH$%ɤT]T\ۦeQLe9ghXO7Y6z7wLrVDE.ϳsd #I6ʶMq;,$#X[mhF{-a.rAcU?IՉѵHG+i*:,lwƔ( BiDQ? YYř/{ QcC4as_w?)Bzu]7>LG -\bj)%/de+ȑʕR4k!<.1|bVZfITռE^Q(?Ν;Bh4F^g|8OEZ@oRpۨT T5f)~c<3y73O}}mv}fu],$2,N7VQ_aCMr%%6n$~Z Ĥȣ>9ˍiZPH#bq|_yx7ϳ!Ⱦ)jeJ&>JUZp]up]&aD1ÒTL"$N#^yBfffbmW P-^/!<s|<;ٶwy+$p:ɤ-/{WGGĎm;4-+RHrɷGn ( @5μcG~=/Çߘ;==7^Qr AcjfzJ#6 h&ȾJh~&`~gmAS*;<43h&>moہ{<78>7|͕ #쑟z7~9B2xbyL=f*=d} u I3ɩm΅ˏx׽:LL*s>?AqҲIyf\OkGx'-Vu{R\jd2ˍW-3g\|*]BL1jU:Ck}:b/w?$ͼDRDB^!Ц+2@u_>(,1 YiM IK,,JX/QUF ˓ `C} l xmȎ_mcd;J6奩D"Aݍ-CȲLX F:&P<@((S|(n5aY=uߎEBu \gfdr @XxwE|iaɫi!f."550?XsXu DhB,5E" U~*q< 1:eXHvzo܋mm2U4nOc J0lۦVbƦ_)3ubÐR 5aT lAVGKWCHҦm`beoOJggH4cY] R\(qwƚ_ bOWw"AKs2%W֖?R,j-qK bgҜ:I@9{llu&Leuoup,^~z{g3x5/zN»?T8v' HT*E__?躎aTu||tcʉTt]'ߗ'ϓdjx5մ>OCDƒ, p۶0M2m!a՞$YtD\RsmlL`6,QUIڒ=CQu4̓mXֿ,dYh2ɤyc8##wPY򨾤km]N%m~!2 rnn+\K'[\U!\\ql&Q(޹};C_>o( $TwG?Y\?~+/n6+ $I8KK\ïR$w ؒƳIENDB`smuxi-1.1/images/person-chat_256x256.png0000644000175000017500000005150111700531610020531 0ustar00meebeymeebey00000000000000PNG  IHDR\rfsRGBbKGD pHYs B(xtIME 4w IDATxyu'{Xjus_DR e[%Zq4&Iu!1LijHe?Y>O}3D`jZ}`v|58B񟺄[蚝ň`Js}~hb>}+_.YY3$ __s.O>O퍯F JeԿ;5:A?bpP H/&7.A Z6lxv5%d,CQjTC4 IGn߿'OQ;D_|Wn 0.7̙=W\~%,YVʊk)SO _] `bp߇={bppA#OW\ J,^ՕQ̉܋-}އ&$T-FQ.R 7nARiӦaE8yȋQqMB}Ee|qʕeեTNGMDݵ?ܟU,t:e˖!>@Hp=kW_Y?/"ҥT ORj`[v1K&UY;?s"@)];7_:҇|#H kJ:} 5\<\(V{VP5cĦ6B׍H>OhH%`)%F6Jokm?_:!5v>q' BwhbCPH?xD1@&>?LЃC:rYnΛO?spC{_N_DQY؈ٝs} #"&@p=w7n; _^x GuFܻ~$ Ao+T;3'9v`kQ1c:>>rDCB Q+JD&R 5-0Oz} 4Fp"1Ү3{Vqw>^gGwxʆ \0*{---̩jp[|2,7½{ZprA5u-hmmC"=nݼy 6Dz"m&0 =ME Zr,Y XʨGy Lyw(ε|Xpq0c^zBk=Un#hiitOvuue@~.󴷵c+#Q*Kt]aDXkm O w 1Y@ nY[ {UUq(+jS_)3}ً{x 6zmѸRK_Jƣ>SThM);ϮoS{yBC-|Ӭ209<2`<[Μ%-uY~] ySؾ[݀`^" `e zݟ͚Ձ3f{Τ+EGœCe,]r'?̢SjsX Xxӆlfi@V7TLRYn.\D")DYa,.m {X^OZLd蘍l6\j?}37  ,Pv)9TQqO}, `p+~O W[ȲŋB $T_cc#fΘixr{H d,?ܽTTZVzb^, ͟$T1ԉlذaPku.XB$OߕXԟg#ïZiY@yk)?|] #ThkkC[k 3zavKܹ|j 0֢o jas Ͻ@U=-WcEk/\@} --T?߯GV;כ=x[E iAsaɬ|S up;]hAۿ.DT`ȟ,~sSBp0kc!a5^Z.~,@S~7`0 p*[ dVbsw`vg``hxUU'o^cPI=^[=NJWRFMV.Ĕ}n f $0Eѯ sxss Ia/ zWs.ʥ^@9#E@-ma˺2tY㧵OcX `%Px&+7 `ek~Vrz~Ӊl!E:*+0c@J9IX$)W Zy v.PFe1Li0764qWoZo2vN +KyA@o϶ g0-Ѕ1Liv zb,b}^`o, ^CϛfLDsfasy1LmWsPQJ|?Ԩ ڒi=A=g#zVnd2!4nJ#wuudk=>H@d%]PR BHv%zPPJȨ"rJPK햖T;_j3{߶{:~d2 IjnF1NCI&yk_ /{^__ u!ȬHSTE 2 R̛=8|PW,@ɠbl% a|0+W @HJP\>o0HC$隣H ,o0v#V6b51vi8MgW!{8e-vW8B\yR581h(@-fS@TO\ԠbK`1JKr;#`v(=c|߿r =Œ83)*rc/}hg"{^rK9go@@w0b% _Dd/)*P@T*i +kE#sԜWD(( 2x+-ys .S둚s!? jb+ T,j@v"{ X)K#_ ùpFO SY(=R#gNx n0)/ <=^0fQᡐ r8)Mp$Ⴣ])zsiޠ__ax+կfւ巫@a7D}ap-J߽V;Mشvu/u/egKO,a.<tK=ζkCN@?Le{L@Jm]]*\@גavp[;MMpcSYt/P(xֶg$I2[zp9Ubч 7Pƥ&ᜪW~? >bԓ'<׫iU L{[DAn@1 x3V=zoPp5 3 k&yb"{V,`1_rË'T8}daAc@9ӌ 2&ue3p}~y~\f|PdZG`EsJP/o9~h"=h*;xUcā_G,$d~$^Lfe=:}BRPbɛ7 ?^E+@ WP6   8)x48zHa~WWW.:5k֜j6X1FO?V dgO܊M|O.^ɖ_w| ПN.K9~xxg{{v`Ю 'zE;N. ]Ho1ԓ@7رc|{B:$ɣف~e)6@s>SJ\D_nD@Ip>@ss1ԑ5&{Vװm۶(n{k]3:8tF` lD"Q.DA4D 98!ER|/3}0z4$!y Ω1 $l1\^Gfn&Dus YسwO}Hr_Ml:wG^0H%hkk"bd&T7ʀ+ʂUc/ˊM)tuu5$RQJd $KL&p{0 ]HM$AGXHO1lVtWпѧ=1`ʳ?{UB_p5|ZEu:} s̆c&+(hg?ZԘ&L>~477v4Eu8y؎\nd̾R|H$B~*`X_]7nu֡*ҩB0g\l9/)FN:cXPjVeg+ IDAT,KA3) { հ1K 477c8z ˖\Ѻçؿ.+&##yPJ!KR[n@-_5ߊҥo ;'0(,^k,@~޳k[CC#͝!m\ׇ=Gq Jqf|nVGJ?SO<.53@(."ݰ_$ܸF̟߃vlߛF1w\D2:1xq'Nqqhh\"Wchxxt C@'{1\*B0/sZ[ѥt݀i8r0ޘE\֖VL>ӦMC{[E<7Awzϝٳg1<<12,}(xgoSQY ?fS \>Fd>wǬNsR4dYa4 @4:} ᄋ6& !hnjFssd33 $r2{JPXDX@>_@.p./b`p`.MGfOoި]r!w=S[cݺ%D60=s/_v9nVR)HTV|Sux|^%:KV1io[o4E)wVVc{KqɔL3׮];]RO̍ڊt͸NgH$\\GGJ1.`ddd^7wps˖oLd2ٳgG:8 {ת{aӦM&tuu%I|(jλ|rәrW{kYM˗]`Kkk}:;:~L_O|bpc2*tJ͜] `Æg~<94A̜9 L$*50-JW͆ ̚ىBV (Xzr\sHRe oWeG<&̛74A#6&H{nG(KQl&md{wL^j3DssPJsdY1cTQ_4!y pA%'U{ƍ`eڵZ#Sl>ZZZ}|O* T@Buf!/ZKU2 ,Y)7Rv \{d0|<%@pwM.0NB)%?{`edqT Z[ېNggHUm+Xk}nTҠfH$455m: CC.kWU-UW@SSs72gα7o>eFHn͛71P?ΗH$p}:2,6'a(M$Tmt]H?yseWhĊ[ `N_L `vll5!'6X6l2J,K՘5cT%`hV*/R{EA{[ܔv ]eKV0ϼ6&3~TMillĬY(w^eӫ0F/¨ymcu_*icm+lON9 H&SX0.[KnY{m3:= `JԂ" Zu76m4r)ޛI_Б >|/^!"Buh2݀b*U`N1BtvŅ }iY$mmm1c&Z$X\,ˠ\pi["ߵl2 7߈ f b<REE.Xo LS? 8B{-'R5 XJf6 g@Q sÒŗaڴȤ3Uޮ$*bY@xM0kV/\tۯZ}=6nܴ;(ֆ{Zt:d2IP,!I}=Xg{ӧ@[4IP h6)܄D"֖6tttbŘ1 {ˇ'T|X¨!B`?q/FEU|Rs& sk2@?ŹR^u/涹Tbe7) V$uVYlL3ftR\.!7C>?2{TEE:F:A&EccRh4)ޖGҞLeSJ%PJѤV+.)9u)kJ2n8{Vc<3gYp P(B׵*a0 Z.$Z)*j~n0R^жmcP( _AP@X@XV*i5 {(Ee .H &JLNj9Ro%DY G69;`oXJ,PĽa-Q9s 8) zO HU1)=Ksg0]lm$k0ەܹX,E+7Xxai+ I7y&+GÇ"!*M]9wX|VP(.4\xl6#-qoW,,j<ܾEY۬W@toWMKZ3pm6ofє , 亮Rl+gJp(B0HU R0b&v*lvpbֶX XPqH 0 yRi%d >1|{/G1ҙN`dIUDʣh{3g˯@:"J%9xJ)Ν!=EQ(\.,R'`1mű]ۏmmZeN\k#˔]v:@'O#˸[ NO04 ŢϾr FVߴp0/ߴTjؕJߝ`n[Vݾ]a*]|)-1/ 7x3"XJ٘_:+Ԅt:7YO144IH$<}XwU9(}*bn tjg,VwmvskoɰleܹwaBt4#@Vʱ,sVrі|%Ge^+<'QJeM= mm1-ZD"\Ou:bi< Uv> Sz{85 뼪.ERY[E!b\~ܗ:py_G'2xJM/bI> ]E.Qo; ke;{T3S2&UV ̛7-a^3iuU]žcPՄGsH_Kq)FRvSJ1 PeG}}5#p*>S o3H] 8-;8KR`UW?! M̗{/2fwEM۷׵v:\^ h_R|!bެF0+<+{. H|QT&~xL  ᷳd"TٸO΢YWAD{);])~XRaϲٷoT*B'99sE7DVNޠ4 n[c슢+zTA3$ß ԢZ1dҦm$4&Df} #Xtyx#h%H z}stvtaV x r#q *e2VWgb6/gLX%ohȎVj*A̕xP0١ G݉Uu 0H(ֆt:}5 ctO]@ *r@WjKJ}>jt=H޵E6Z^z6ř2 B*j2@80k,@7<;v4d+^~koTI} -f4O ~Oy>Om(9 L*f֛`yx7hTׅ9=`_T1 qX|,Ky^Jv‚B[)~S߀\6-Rev2 ÷̻̜93|I; ^x@g(ho]w_EqxOy]Krҳi @=Xx2#=?T_CCvtVdgnxȌJVbf whPTlK;골2r:fww!Md\G|k/eTґ d%Ʊ eő$ _'`ٗdlB[j,Q8qBіk[ ~m|E%.VM  VYuQJCs \nyꊵ:r0ni+EFy @OyE&\!KmoAA]׸*"444! B֯ 24ߏeԟ47;/R/( V3)ۥdҐe3-0_ro TUqJ ^{,+`#G@|3ghnЙ/jú݀xPQ[~ %K(UL$tvu .94Tp01o2V`>?g"H,;y9+VJw?c7T$\ξv˪RRXj6| cg+U~/7Nm.lDTt2v/Ҵ>#t.O @*^Zرrʚn;uU.Aa?72~ϳf\L-_aQ&PP,ʔ߽@Vinj[*lD o.9L⅛;O8i[sYm?B+J;;e :U7vn7+IK)s6XP{ :c & 44 *jV]Z/t?bVBa4WS)5Ƕbb\ {AqS^|}素]iͅBdYA671Q0ij U@'pǏJ_g ggcpǎ+8Ẁ|sę.[r{?BJk#IRyOuGJkUFZq: {mg Dp.2A3e?ߙ+9YknV@J/>cP|I"0 :<u- d1"@=O~f L=6Frʲi:2DU{kv_u4",VJX}oG@خ.\X `ftjUb pacdDiԸ-Z4mxjn}}lV_rD+s(Xtj^8xuԦ"k +=O6;>7WZSzy=@WDk\%ɰW:3GN0m*l``|YJU% YW>> {{)>oDG-kZb^7`xxz-l3lW 9تR \Z7ٳJo@@T)D><|V DZy/TUY~&`OP,GY}gQC10tddˋ$=.Nͭnb1g` tk n+uHSS3r\Vr m.KC\KƗP s?J!6\.[SF JE-~X kIת̿VL\T044 {1ؠ ^(MF _,ĈS{-6{l6xOV[3}[:\FnԚ, J |~xjB#T(Wt_ϟwt 2o])$B100W؋~ فcj߻Pfă)?{s, ;O^ QS%Htoi`4MJYU~d=L^^xlp ,Fgx":@'AʦD"hJ (ͥbKYTg"$57t0A@=F/}ZZyz~,k/S{)%]}hmmXf&hCjGo]O?t]]޳>ėD"Js=ߜQ^1_ G}/bL KSIDATlFeqZŋCaLm@dǎBejQ+'z [|1lX@}S V0f,c&TH^/%w" 9a$0{v'\ҳ(³_brGx xw*-ݬt:-*džfx~]w>8wnTevOPp rYJX +w]okA(?OIRƀRf5 g9Fr(h7 /Pp˔֟!#aO|ؑ@(Ò< TD*-NѸ|W x3(ɴd _֊Q%TbǷ( ܶmGjE~s)b#H[D.r-f!k/Ƙpƥ*>A@+ܡd*0@beS1@nhÜB?Ο㢵7ʥGh7^+?_)i}FZ'K8忶ruehii)NRqT*pp?Cہ \L ( ~}{jlX5^)A5Dc"^ Z߻dttt_+L&hh"r9z3߷;v||!_SƤ P,V!:^!_郺|zUӾadb̛7|5»>r=3)XZzV(صk7$#z";ħ,?4..6|JU}ફV`޼y6A:cPK[`ՉT Z+;8$ID[2(n0 ע} |f2 cvW̝NP׳X*GG\lR:椚a~>}JhH2Bssh;rţrK^@ dV>|\=ꋗT#H$fҊL&+XWw={p@J6< 䔋@9WQb{Ed2&47 @QTF`/@ cOɝbf444lַ =Vnݚcqw1Rr \$޻eyFȋ0.X$Pم HGBEA"B*&ʫߦcRcq#3Pd?Ob[mfk*Y'L!N#BUP5@AڔX*'}:ٟ|iʺ\ƪ$خz:|诖/[_w̛;K/[;8٭D5)\/ eMS&Q od0##oolΜ9_waHgw/|nw2"m >mLA_2Pީ'چxlsع#K`Ch׉q r`߽cח"†jFFCJ/RB,j]֛\H'/nwnxX3-_j477 ޏy!q?O@XM⃝Dxhnt`j{Y @޳{nNYQZAR vDkk+Z#$1P ӂ|̆UO)ٳgPRY9}_?C<XndγT,I":p{tQF.7ٝK@OF4qhԥ+ lr P(|ahp+]0ޖ8x~HsK5Q^ٻmmhnjb v7ؽwTчa{Sw@ }=+oCDbf?TҰ>>}ӧMC:88]w̙hjlBCC^O/B)冱wnM`r1z/.g1cغ֣OoooZh*BȘd- ``?d ԉ'GxB!{9|>?3y/WZ,K@N @|,o{PGmkßeׯ!Νc$3fLesZ[ZAC2fc,:4\n'O¡Çpɪc)|~7>@Pr=4Cw K0@r[oGC_w{JAgG'Νi܂lZ,N 0Ku* qg{#xq_.0Б1 LEc`~ڵhBU͙;:IpeRj|+_믌^lyK@|Tӧξd+XZJҙ+قHwY?kД`^ /D|z{{s￷,N666,;omGG5 Mcxn Ai V,͙3{F8X3[׿BG1=n`@ܼ {%=?~v/"*ɤeT)*_8|෾Be5xtN bUR|eT A1cF? u9$)XDEczӏΝ;7RVF q:? d6؞̟?c'gwv~w,\_9|ܹs#78 x+D[/WV@bX|dXu-Zr}AUUf=c?@||;V g',w\PdC=+ݩTJ'yɒ666^OI*P4;PDÃy$\KY #ݫW,IRsSWJZ wwwʿm>22sWbUk”< B3fH|K::f.illNlE;Jabx,7R844t'o}sg5u  SzD@|!k㮽vEۂ ;[2V5&j !D$"5ID 5>umi@X008pıS'o~… Td)^o(DbY 0Q=IB8,X;7,%]|zl JG~1y_9r7`2f,\q~cP<\XÞ c `,kۯǤS0IOE$Vjtx`dUrx>:Y}+KGA#UIi@VUf,Տ8B &O6e {~?Xyc'OfE?E1 +dV?'Smkǣzn`D'u TњmaSl e7FޭV0"1{K+bL1<ڟP8K#^PnS~&FǦk'9}WWc)Z$mhIjAtMM M"C4%Hb,P&8E\4hKuc{64j^y-|aƻ;xd2I2$V`xhq8x1J"RJf#Dbeay%(![&6x˓t{ jSL-Pf+á< KUGӗ ~| uDQ::x"K0 N<A<$%gϞf\xx<{ICL!6g[{ Y,F*K&DmMEmbK"bd9Տ30bR9@=L4Va;16?Vw72X޵'$UU  JU&_Kh&5&f먈;T%>ml5}$퐉,fs]Gzhr ' NEE]a:Ga_<;މD"lذ /о AO]ӻwe_'B ٖKg!E4f qn'n_!mp+ҔTGC14p*vM썊_zJv*imi` ^Q@M6իzƵa[R:PKL\*e+>,UUUA0! $*'Z8c3H >TĝB:.# (JH" A3+Zт<*EmMBeػ7l[.Fq//H$YXGb8iZ@ ́6Usiv50c>& ,9CU*!QaCE4#T7T@ u=<#gHr4!p_z.}DSc3R 0R"e66l?rZw>q:Y@@ "| *Fw? RˤI[u4l܊‘'PJ\B;os:"/4E!$+46nl|#4M#BT#<|Gs0]-d>_ xva M HE)Ehc-c :/֫_xo&RR熇s[-U/|?8b'|h,?]\ɋWucNq38؃AITߗsB2ww}4J;FZ,uƎ;0B~,5:}&3,u,yBVr!n$2Yޫ Nq2)9y,Pt),fppVAZoNrɍGĶX,SB'x..RJ'>M3Xx7:SӴxY.Ro~nWjf oR5H(̫Gc*ITBJ˲BpI "1{ pƒͶ4$ccc444T|\5M0b#e9nU[C ̜Tm钵9g9d2EP(Wv!0Mh4Z_  xw 3L$8%r,i-}~mۘ1| ɠT*X Kmۊ Csh4B:fŊꩩ!nP:Rդko~aMn^^)UMH&r}EԢ|TdمZZۨTylmq\q^J΢q6oO*>( Ţ\= |rib\~}᝺t IQH/SWWwrAR CjTRBm Pf&iLLLPj`yeX莥t]q\X{ 7繘,apMDz, PPN<4UNj1?ADFr+BLMOQYQI*DJH sk}'B\RO8!>T*l_fy\ ؽTUUQ]]CPS\%Kio@4 m,]x>$tvu]765 ʖVݲB躆>54M_-4mb833w>>=9uz|bRoҴ'0Kiw$%Leo{|o|gMMMO$47i| J)< ffg[ݷɁ_:y` ?'?G+W޲yJ8S,{C|fg3tuu޹X:~9b*DcccC;X%G CJ /{ܹsC =%x?Zl])1 \ eP Fx_N`hx9B*TIENDB`smuxi-1.1/images/icon_256x256.png0000644000175000017500000013440611700531610017244 0ustar00meebeymeebey00000000000000PNG  IHDR\rfsRGBbKGD pHYs B(xtIME !- IDATxy\guyR{uUuW﫤jId 1`0 [@Yld(d2LB@m06cc}Qԭ{%˶dyOoݭ}|jRԤ&5IMjRԤ&5IMjRԤ&5IMjRԤ&5IMjRԤ&5IMjR\"j%=t蒊lE hBH@@ alDd$ % !HIAY!9%CBS@M^U).MJs+B@|3 p8&< Q_rO*[ ̒ r<+rRڟndmw_bJ. rϧ*H-:A?!?Kŭ+蚊*/[؉Ð&I&_$%g&$LNgJ  }A .Jx_kj ~\vROKSz?u^~f{bxuwiL 32>gplYfǓH)KARH'\ز) v}}4ӻu EԹpiK[ҟϷ,  D,Gg8qz91͍8h~wo6jpH-hƇ׀FS4L6nh9D}Ѝ8~Uߪ8_:_CYRJ9&f;3͑LMO5KཿLm︻4eAzkt5KzظZ )Z|)/LgܡAǘO)=oFd ^O*'5YzU7]M4}(BN_8 7LI&W$3d&Aa!x7$aThT4E\.t]W鷪*`  AN 8;fpLH'ݙ~x6Bkp(~}}W\-]6^T`$tdH2[ _4+ly[{k Х)ANз[ǥUd: xC#൦תmS7WUdu˺HM䉥Ēyҹ" فX D -Wex\*HE8Χ/_6(( L&yA9pBFp I^??)yj&ܹoY߮lX,<)v*~/W(pel]9 jV\ZR.!!AX#,c<GOe||5f@*Dm4`CBǬa]c4̍rRnDљ 4((iuuB<.-E"ݎ)U `QݺJsKk:7yټ3<#85aRCuwIؽھMnnnl[ U_csf 沢 qBq(X (}kkk+åPqdlf#{Hf[_VGVP_~lB몠K[hȃא@B{GO ~c5?%j~~scۮMmhRF+6g04bh2E:_\ +W0.m2Hf73RzQ=L8^<"PwGQfuJ6`dr&b(ޕQjlTAJ{&Y!/~TֻBй~uu~qn޴]\XXs'LgvtR~~DU2$Va`Bd EU%E/_XFIH)1MIИ`"TH*3XO[_碳1@{o)h Sr,>"cNu'*X0\F\uEkC+unnۇץQL $ƓdseݑE96ٽuvʾ_T| YRJ $gb c7R4-sHy ]*~zu>T@ɝ1y8>U׫˧{"C TmMSxY,l_@:[tcuZ Odt_hI7x(&ۈ"tf@) k'6N*`b8VJIW,7!,гq[gKVCyM)24£-=lCkC[ LLVDM!>X{؉" )]{;Zѡ 9 \/p>I<>B-u߮$>@4!341p/y o_:!sWa|l@l/?_Oo(ZA`٪*c mZuKۊE4 u M+{;CX(: ޔ?5X~ xXǥ3:)c!s| .Dӿ v nʶtÓ/́m7gC\H~S"!kwwV-Gȅ,}E=φƿXT~3A2H2ԛI6T砲G?Cl0j#0.!9噁r`\1ȩRO9__1+v`, SޥqP~vEoF9qfBDj;|să\'R?rɚ_ŵm@l0XfY~xGTDy5t?˩1'3- &`4`FGQ5* BG zCEF R- gEpRjt`Yr!7:{=~|c4zn(0tVtԱ!0X1oAe<튣)٥9 Jd (kHPwvhN ϐq^|ܱ5)ou t4]϶ M xECZ- % , 2a߳L $\Vv>AC$jmߤ>!xU͓G(O`)i {Dn6mhgx*I,؊,,|w]ϟxhbӜE%`m+N(/zZ~; 䩣Sͤa1R,]'orI֖Dv)1= !!#46'SXבo9N1~i9<]VYՀEF!SK\Lf|#j-r鷬<'n!~n f}$3mg"Iʌn?wcnpXʊg9:2Pa$ۑB"?YS4Gs-Ѱ1rxlf]ZO LvfD%鯖U(s|7}^Roe2nk,bRgi#~+L"[Jp' %틁d٫0H qț[䚔i\Zm'`abFYK!n'n#i#n#m0Uc[cߖfB CP<;pZQEU;>^s^OY{kZ"!cz>#/1Ç^Ѻ?T|+EGW+xJ3;\),AtT~Ztٔ>+)FF3*?ESSUӀ+go&c81'o%\+HMB'9b*iLF+Ph ` Y'!V~.E)q1f}m :A=U$Z)坡9!~鳮F~=RpYi΂OġIil7\z2P]Z t5|ii:az93a@!H{KtIMC:hF ۂhJVR4nE(һ~\ F`O_Fl&m܄I/3/)HFۣ_P#c[iZԠ`df/GGޱ1rŀՈ0sZgIByrĔ Gz{K:t _lb4&먲Pe:gL"NkkױgOsbtRij8\Z:0m;XBMH #H:Y?WlT7:}(,|&HZЕXR\DXV(: RX{e £[( ;bW/:\f%X. ߏ AmM?(*,iL.!;͆|CLDՄ $[LsmA8Je>g.=극ٴcu-vGʡ5x͟x;> j gb~ ,ffY:K%219=Rmg#'(o;d^,;ZFʅsQ=M;d|; x 'JLHe &sGKEsBBczg-R6=oU^OgKV/'G&L. e󎲧랯2AeY1OLۢpU~؁=(@:&ӿ ҽ],׷*{vTT[-Rś͑gٹ lQ+4]<{#&N  =DGhkxrzN=Dk(8-Kh/M/ Q)lh )-<;ȅ]ʅ۝>w"؋v4zGػ3x\0KcJ2׼ jБ WO`fY~;,hhnQJX\q P1믴%K@ֹq|]KؖBszv3+3I|CKK&-Eii84iUr/.p:4ͯg-5XpLvåxܡ3s~򏱧sms/ |'~l>\i; :w1eVufuzez1OI*:1.R+mS`q ڕ1"*0`є+C҆k9&s\`frQfUfO癶|\繨%<;غ}t&'2'ix׭rNC`|u4j["IK. {;3S3A{?K0]ӓ"kMCJQ 6w~wݽc&c#o#]y1a-Quzuzu-+;E(E!%f ɦ2@e"PR\.'s9{q+єƯ=@-QtBT~mMScd}] {;I[P<"YZ싐;1L^sytx94t蓣qnnG IDAT7DSʙ?>y!م9_Q'5EހG׬eKE+ Lqy;$إy+B`(q5e "z)z]iRQ*^&dPq둨V^|XJ+',osjӭ0K4hڑAߠv߶2¶#w28y!L> sV`9:rmicMA!(6YTw1'JKKE<Š<˸sO#Œyn~q+[x@sEƮb [݇hƪt>-2trNq+{3l#NC0o t@"-,ĥD㤋7Yٓ\Ũ4^)2=eLdY!@bs|mhj-:ZXrm5֮/Z(*/N:Y%fh<}t G!|[S!69ϼm/ 'G"`"Zw\t>JS Ѻ\Ko][ MԑI[֮olb|׼VhqMqkav$Ⴒ\Qlوn;EWDPTRQ^DKѾqAQ%PXAi6ypRU{5B>7]z"5vKE;пawhgw޼M뛩9<(ESZ3$ڿvbN*ׄ)U 3|?fq dR`5ڍذEWlEM m==(.7Hے{H B|a,&N#A(1d#xۙt(aufM/o5-~(>cNME^iqiIv\h]Wz H\BSc :o<; oH@تw5qM;l+H 'Y4ak5PI4tu͏L/6P~/D VtuA@kmAP^Ò+ES. M< b42̨\O->ƭeRkIxp/U 2MƸ~ nW: Bldri?b 0 )D-(8;9h;G8![ 8&{?͞x(o>)*3៾evdp#\9t5[־6E1$- kFJVkE+S|B>UVP)m@6 =hY/*~LR$6iGWN)'[`е40uZ#Q:A'Bֵ*Cb.ҹFl0%_Ehsx`!+ }U\wۧ-oRkX䙥J8?Kb*}骁B%Sʍ*}ȮM}ųT|>rEEӍahR\ƪ !$Bj]/Sx$j8߄02gIKHJ! ҏCz-;RJ:k.q*rϺ8mƣGL!l+z{{˝prx#`=u<]HiRC2RgR~;~ϡǹ..+\hrvf޿)Ut5;p=(!e1&V$32#_uyE|R0t޷f+=B^R[/E+mns<#e֮osѢ):@6).VVx:RezzF Gq+<}p%+S뵯吱fe2N >K(y灓`(*i&!C5k+&m]_#QF\ }47\n;b69ebr΢Hxk_иġmnj$f-T%r-bku PٗVUxtږx=+Oӝ4qf KYMʇNtR4x\ITX-m -y+}RN[{Mst+iTXWɘ(f_B9hHCkМ@\f |˚eqi)D-+vD*$WA$#N~gN?]@ퟎwRKYE9MSF(%е {]ͽlh24HyD0snR\ꟙdgiڋC|Ӊ{>E4!6 t &hFЙ4g@ rJ}gDD6@U)0<gv֡ʟwiuO lwܰ2:X?TrkǷh;8, $UJ{-QᅨHsjamdhn3W|Tǫ'!9_x&!EU55#J) ` ȨpAFahrKvh&-.ԇ<hR}D6ɩKIy,4A{ǨGJ `^86W֭δe 2֔1[}K'̧,cQ?n]({fr.Ԍm!>;࣯ `0H[_7_UcK1 Y6[\P~Ӣtf ]wT on0Rt׋(@}I?U<ˠ _.?BWJM=b[izRQ.tbf\`]JГVr Mf4y}-02J Ork.a ;_o5wQݟgp6eNd"bw|kfeM *?"jG ۉ9E7gv׽NT_I?Ok۸5(ŒFiEF:^B15YM<(B:H " 6QJC@Hh)4ft"s|Şٰ?[txb¢}:rTQl{]ia,K};1a 9j^}ԙ kίpy-T.NR1R~Bx< mmmtwnz˄Y&&mTTU\.ƦcLMM1>1Vդ^ ߓ4jӫ8D]G(ry W $' ~7{ bv̤PPs129/P^(rzrQӳ\yI O.߱Yaoc~)}nvllxǭ=64?egoPSffҗdǙoڴ K/zl4=?>|>m<؜miԪp@8Z@5P("¤t &`zƼ57'9a*1-hNڊ=zsݿWW]֏1Y (8~Qi0{[t\=vbJ~Vr9r0SSS IcpfY+[]?)]_(ڍu l "^-=`RWg4w~ :]K傲gX~vmp|P>Ri=\ʞKzlV*BbMm,,ѯ56]X-ޱԺj>~zOgRb:fzjX-0-/_ m.9=e/R1bG 7/,/-(ddPdgkfTRV 9;7J9-p]Xs_&wT4!^i TL%em=p{lr[7 K,3m 뚣+2Q A./ , C*|^MSSbˏlBu!:; ՅQU!,=twnMs%i_z/˖MH hHSDZ9]kئE3r1͗A|N//+NCA)_܄3$GFo&_Y{65-{:?"~yox@x[>{͗R,! ;0V0Ht~H`py_HIՅ[FbbG[[;J&RiO~44D[ozijjfvftzCͶmp7hkk#P(8އkwlJ9-v{e62ʕdś( шbG$R0DC^J^ق!"Dcno/*+xTh2TtXk &1赜+@׬jzyŢQ };ۯӧ>oWPmHpl4\zBiǺlxU{T+tJ]qyHzY>4M\.X{=몪TW޺;KR z)[0'/2K 22kжYߌ8,%5 $_!&' <'Fپ!jmų/\o}Qo wVnb RXՇG|3k1JEhnTrx,ʿ4wyWA\yiDm$&$QP6lWj{ViL}W/_t-CWS6L`,%Jl{kt|i4lKSj{c3)ee,뚟8 t@`IW 2&=MY!g߶NKJ0g4. gѭ@h$\VpK=/ M%**OIv~Ea-tmݒ\ ~YjW3˟ 镂MvP0L%/j&LcrU]HwQwQ|WSDH)7PF!mvAS/=@ع$ O[ۃǜټѣuw\uw .@J.=U!$?/`ͥ[TR΋Q} _ЕV?"-6D qq'Yew!KPؙgr=2-¼pF4'v0\Pf:]ѥǴH@1xwTHT/%?_ߋEͥ/ZW,]3_]G(W[^;^J2AlfQy4Ca(YvQTqJ}MYtF"Ze~5g/♷/xDm뭔?pehruay>?y',H]'83 M8GxN[웎zdn!!TR,b>Wɱ}l!,=79s= :mM[soyf%ͣ%h|Y(X $DLWT^:P9kzfg}Bu!.ݹ%kWDUW^]*N9dc<)qÒ|ɏ}e?~/~ mg2|iOɉ'xGRy?`BXzx/+bGg9u&Wd:%#=mh.b:bzV4o9MW)9=fWVQ~L~n>>ϗE 5&GgAy'O~tl FGs^3GJqˎR`9`Chϵ IGc]MNZݗ\p `bJ_lSd|*d}B^"lT(;(A者O5uȭ(n)?MG46جD#-qdK]H)9rb?4lp(;-'x122)%r:|ft祬[޶!)[q/ٔP#Yw^FZ@gn O$/giXb%vZ㊂@S/]P04O -#Z,Q%]BW {6rb5҅}DLOOzp8–[rouss}W\W3QN% ?^M ¼wɊ]D:Bn@TK n蹥+M IDATowxZe9>oI$^ P\"! \]FN.t6@Fj.L=D'illfM|™L<}E/&2lETzW}]_{ 4 vP4]&Λ/D 8 Q N|(cϖM[Q=~W./q¤e.BvSY-qҟ -Z#G9:zu̧rdEܺV֢l|g]O. ໿"hE[R8b5r0ݎ;иBá6'/Aȝ@KRɱ7H(:9ӤWn,-^J:ara^bI u'Onl-s;JSh =:#r&cuxbՀvgQMx9ĞWS ag¡T,+e^N E4Gt,k zz.ꂉ(򁄂BAkCd%2.8G (Ih|gVOp!8яdZ\,͟eYL$aJZ"|˅mxA.go e12j cw+ vwJ*o@S MmL<'U"hip2YY^yrGXZ[09^Ch˯BX E5̍Qr]יwn[9tB7ȉ (1ADT%3Ӓylxsje~fg\4͛p`f\$OXͰ~+lj z]B(z|#4#5YWd N)1({n518]*hԭ8 Pfi ʰ˳{< @ySZڤ ]=rLMM.$t]5YN,M.a`v|3&tA8ppYDgguM<.z &cu]ہO}fT*:?XpaŌ*K4&#[nKĉ[6j$ cbC2ZlsTWL5|bC5?۠ ]~&UYW)]:PIȪFtC]˥ ;e_ ,"TOL\x (?+8dϯ wSlh? MӐ |b'!)Hgf!(+D1d$<]Al7+&[qs'j/<0r];;lz-Fwazi=^ =*~*(6[WB4T9Ɍ?GAd ^}/ӊtNdWO L0(P ;T%s# iSt&1е"R ¡59%g\"\`"azMzUcwgn#bg3Ώ0ͭo`WkL-l=_ƺ8VZ )2$I%}~ A(^V`moY `AD 1)*  9a4@[ЕK g_@a5~0&ab}mh^zեθ0v#'εdCCCtHh4 6xZZ`ӦMw0 s}AZpB)[`ݺu^`'96]t:ѻx f]}hy- D^eSr c㳛0>2?C6oxІ( *ur^w\l+THh|9!SQ`HjזMN1wHKHiĥ4T߁"O;ATrV\ zҙQ{W /a|qF`!H|,kKsаӁc_N{wmԅ/䙧ԏ\tmw৿jWKş%L ҷ<%@g39 @oD6Q^S~0ܼ-k xW&o^Te>*W0:``U,.] 40I$l}aA73#nMb6v?!52l E"Eb[Pu  }kh_z(F$̇&> |@]X}K5MbP(}~i7]U.dxLJ/U ! #0 @B'!HUHrʄm[bʰP9m p@_*2 8~TՁrks5q hV .jkO&vqX@~=05vkWt~3`BU!e'{vUҬ( ֗k GUe?$3Rzqs$1\z陭rIdUl.-qևM7L0x@HUʵLXuTkyH\B\N7N3S߂a= :R@YenwzYalR_d2RCE<Ǯ#wˌ !T؈fшl!%.D+FhMJC Ky k!<ﯫt&P84477`XxB!EyS`!_x-B:"wCToSj>}XR"؈pyrU@a)d{vŞ˯'YӲkZ@QIJY?Be.(~ ؍Q$jۂfCB NN0i\ar ,~PG8e)ē'+,a(d)S7~EV0|mU_evv|_kn$Ib~@*@8xe<)r܈c88 eA|2 GE/g51oRxcAs?_bxVCsh0:SA#Q=`u€ɾ⛥û@{mƱ8|LN}0aPCAP%LWSF΃@8)rr"GˆEXG8`݈re-́]<e/jJ` L_& GA@ JBe|m@ YmrR$c( HgҘ(.^BmE -Ɠ&.:ФnxWbl/h @n)|nܵzMǚ7" ::mA/b@ `1AHc&1 # HY~ MgaP1 aSG BC"ȑ;(7m XUU*Յ;?K33*#=Zz-oA0Lus5#lكx7D >5"ʀ}75ه| ڊ{d yfR;a6PY|-`wȻ̺fslV% fxPY%0F :DnD_ HlyН$0qȦM\,40 Ҋp;̕#o g^\w93?H{v]{0==E PZ /C?CIc(dL! oHbekRc@OGn{b-!ú1Zp5`kHQw@٭eA.8 @Yc66j,%}bJTςm9 !j tt t~"+.z;mK&eDIY 6mSS z'=gA A`sAsMH}h9pI _*a .psj+$ᑇ?' iRZlU@R?@oxLEM.Ki‘,:\ l=xyoF0;vrt!Rޟ\d:JPffPf }XBk9.eP9N {}صs^y%qz"0쎏@&2߆ lqtb Q ,(G(4o$pA<ǑJ58d3Miz/Ħ/ԛ>y"k `&݁:3 0dhY!̏@]8^zLrK ~s! KPq f Q ::6Pč`FnCx``jusHhb/اнV7i φ'(h|gI6dscX*Դ#j0d`_VA#̽HVE[EQJkE/UUgt7.〩[ЭӰR0Z|,G:4 wao(IjeOg)!akn*3PEɭ 'Eu4'+k0@)-"L(8zP[[O?yix>qkl)b$d2'~YLB 7Fsgib J#Qb>c\_0 E)%o%E19/5ShOm»nԑ ֢]Għo8|9 .mdaa=+ WUW@>4A6V/$-@;,gԄiE J >_<˗{={qWjiPu_|P1Ti~Cɺ׷\dwdقQhbg {+̺C5'u F[Y;|w:H1 p݅~Ђ3.t7DĤ ~s+0n]w Đm}BK m뷴ƮX)v0)Ta\t<\5Ȁ$IE; 289\|C Mፉu-s@\hr}/(tKP.UⵑA ؞E3qܵV¦~qe]1}-jR^\OSV[q0gxGU-aWp_(>@ Z5n!~M BFJhhG!,^`,J+HqQm Abhڎ $IġA t6U{SxgV+jRܓ:?BSfy-VD;>̵ĺCӴ֠ʢTx+ivRS }g='ap* TETP LĬǴǴĔj3,>lƗZ&f 3KBP 1K3W`0@$$@|iOº8@u?U+FvCj\Ri@سNY?6@}{P , (0YAhy=i-[!@ 0tV+sH`$\~H ! }4|INe@56]Q> Բp@H:* IDAT\ dulfӿ?DP3ο[BQ ȇ‹/lI(v$p|j"P$S5γ+*Q&}r#ت8E|k)[e PkI N9:WBaGjOy6B4$9y9}R ad~)ܨFApbi~o}nA }s0 0Կ-wkss) ?|Nٮ 2H)9_"gnͽ S aPds`&h֛.ٵ q4u]ae! !L̫,HAz0)sxzJ(Cкkx݈8P" PPMn#&#څ_ |oe"'":t3 OF@%tK:H~P؍EV_WIPJi,wUvy8ˀ-*R9WdHy\6"Bu5e3u?6u4!04;*=P(!cr#:%f& ,KE)0? $sp/ F!{ajTC{# fxJTxn=%%ezQ 8+$ wcIf~HL> 9! |ZG,iW!zLO|Q|cS)0+=TUΞaYx6):e֤BHFU{-@nҋ # mÙΡXK2-"F tXk`WXjLm.#%C$h 8@[[b'U4%b\_cm=a&oΰ'hk?ˋu*)ABAJ Q@`LI0 `x`jș2U >/!-N:޿<p~K PY}-z 6c9GP -p)d2Nñ)6S͎HDLg ܳ +jzՀ WPKEBMЂ7t]A(&a 3+G3>2&ȵ>\ۣB(h$,csxqqc2SO_TWu0@U\J(]{q猆5 i Xg`+.>ō,?r>Y߲e3E33r`q+yft 7"t|mvLmkkT. Lj&Ϭ߅`Jtӗo)>@C\OC`jh.h[R@2@4RzvR F,Yv2đ"p5 81Ƌg&vsIe_&;1,*n$Dgf$R)'0WC?@Ԧe`|hiM@4i^MW\h.!wWy?5>vW trP:;qyg2UyP$+ raxNW^y¸ RzZpT9׭2NCz~+'Iɬ2H'p''vn #":֭ǹsvcQys)-~ 4E~s8t_#Aw8Nއl0D/5ϯz y-FpIwCF T?, 斟)"SjnMQfCnٲͣyѐ,4o^qo`,3)BV?ygܵXV2NXoV!I#ަ`7tnmm2 \Jq^0Y)ᥓ?t TW Pe7H;ƭc;ٯ#rm`?C,%qCxQ0;ڭA;NYɸoScB!'2 C*`!hЛ$©ꑀI9t$`Eq/YLyy!/{#[?91GHȩTQBܶiu'nsI/OEs?yw/[d-i:֫CU)o{ 冠̞皱:q;9﫸Քxl_|V.3"pVrP7J:: ) y"?Ĕ` '@UX.;)~B_-mG jnx[QB!hLͮ2~Zae~| ^6 _D<#P႘%8>k4j+<p_We*  yɀ, l^ə%މN #  FQh`ce= 8 Jj5cE+ :YW良ż:x_' :DNx])jlw tj0P(l6c!Uד3W;\Gx/K4冾N'uAj_B~iNVl5U"hAqtSxa€  rz `0EνPI#OR</_fg+P0PiJtdYYׯhx JGAYȊ)0h'c;XD$B}^4At&h,*ʌ>Gy\V>T+RbDQ^+wG'k=.?8A+ D S eWi(лp)(]QRjBsA0U/MpͧW 2=!TnRp-ֿ:<+F>{C"vumGpa RL\=x8.@ #HPe/0Is\[_qёoj1 s qW kR# SjhN{ǫysBr9x~{NzV;F&y]o_*Q1%E* H0MU?s_DSnX(4MC. bd>"x [ڏC }v XZa@i{nw*kB| ?%T|+SLKm[^a"$ׂCf ~ zo)FtUc~K-ݮ`&㭐4 ablbg2{_+y(\EPwq ;0W*M a*@t#R.e燫l Sz~Nt G%Pv[rŁN^r=Klx,g>_ADC N,@'WKNyØtFU P֫T Y|p Y-._\ Ym.@)_pj#yhQ7u D<8͕P:U;zfZj գdRo<i(" /KWzz]A&%!90؈t3 xW@ r?g1 p, {~W_{SLrܹ̿W奢sƅGak@LNl铞%>(,kͫ'vkK5-ᰗr8~ B(o 0?% 8ѧ!\BYU B}i`›lC)ű`W;uȫJxs;k zk֑B(ӫeu[z !XܳOc8}L kP \zСHJ.@G$b 3܅>vH&S媪cY(2("Lq-?9hmB2iCW!-bW \Gn@9%ӸBa&A {;"؛"`k뻸tZ-ȪjM_ CT(uj5Hp,+w}}xY~q; a( u(+,u5?;g6.~@ĀQ49's_42466qbzz֭BC \#wbD{h[GBru ʒMMVf6zok, y?)o+(Pw}nۿ_$>We|cm;l2h_b4D"/_Gnr9$ njk3#x[XJ/vMK+n{3MHe ,c͚Vlڸ {Q˶2+4tq&\Y7''N.b_¸tӦ.H$Fd lip<(ɔ.,*KD^5 E  Qa-D0::g{ss.>hm][o;@,ȰXkmjl~ٳk* ?;,Oga|"L٬BMӡ2LM+ 'kȆ }V֙$T:FFGs##59оPr=, CQd(RN\O>#s? { ._Đm;\v+JJ J$2nنiq_|#2)V_[ՓmFW| 'Gצ.D`-O4u,.rbcqqz΁To7 .\_~ժtlܰ;.#AY$1ٳܵ'4&ؾ٣GO̻/@VO<*Kxʤ~ NNihԡi: C/G0P(f$ cq(Ee ]GPf199\>[EiiCvȲRr^)ׄbtBp@G8qøx?t# GjnojĺHT*O>8b8(_B~l\c||CU|(b=ؾmB5B._ɓyfNצ\lK ( (x;x~x|x|DM x%vC7Uxظ|OuB,n@׍⿭a囮XX\?!H&h_,v_.ZH:ub˖hmm20 LNN.]I,*mنx<Yp8T6@nW`tyic`#ٟՕJu ĕ 7_6‘y ,W-Tk6 k=TÒ"+#L! YBn৒ ع -k\m= @ӴrEQXiAs24&&=&L>.{$g9Ǯ,6}D1rS1a岎D4WdD ap }q &=R;Yi184ӧO7^Å03;S3Ԍm[# @)ʤ(;(ۖk  X[+kr;R|omxm!B׵;ai-N`hd"[f FC!(Yu]i󘙝6nCXDDH@Vp8u1_EG<'|rwդoD߹sp׽w=!‡/TU_2-g}˲fUXꗬ@) C)NJÑe5OE HT#ֶEss+bXƹ;W7]͖3 I^I Cc0hq&WW v7vC3fm lدKXVwC,C0ib)d%Lcbr㘚,wTUEt߄`0d>쑒DQl܈z<!m>[А,!v% _(ȃƟz3HЦB=~_THʉ%/݋b^D#QcI ( ܋-L,YZ'Ԃ5mH%D|&ܒK T[Vԍ C/*-R>6n¥KP(8db$_H4yoz]6rX1A+ Ze LP2ot=p(Xщh4ZN*(YIpA]֏ й=y@-6>yGlO;. _K$~;;vv9-At?PF17 0LPj4RPs.ێ.MZE[֖Qlbٷ%YoIHN%P3?υNп]XmL1=v|9B@|@)㸂N"a(hbiipM>Pѐj,quE Z|@Iֿp(?mv/X~ᶭp;8J)U/b*W,%ǜF%|I hC{uI3eYKJ0VёwHR\>)P: U"am >g9/.%@YY}@HͩO D,I#H$HēO#EJAYАjD[k;Z[%X} :떔\Yϗv`z,2 m|} 0hx%)$)DQjE-)" # #K ͍-hnZD"H8@+n7dJ" ؐj(@צ?숥3҆*ksUKO*6d7 V4$wbhxssN9./D7gF>я󹺊sJnC ZƤT[B %Rr 7dǔ)^̍DK{\o>pRdHĚCM+{[[݊QAClܸ񡾾>N>B}أB> ݴ;vt4Ŧr# dy7¸o24 ]r)xisEl0пɮO{GI`sVNz$I+.[}'m'}ݷ/`#?iޠO^3A?/r3]F B;эyӭ4q-RD@NhV bmk%LB%K0@}eYAWm&5?a o.E]sa~_bIA?i bChTU18~8^{}~1M? )z!'L{jk^r*$ 8w'mVO8n6405\ vo#~Lv_w=z$:KJexcV۪݆e4f7 hnl<ˀdgF ,?X\@Ҽp0uvj.JeB\E-,+ N䄖\˿pu>~aVx!.,//C>\ 0eh@%d4#\]@_hBͷNq*I?cOҊgt3Jo_I_L)PU #@"bzڳNs(m{1|/aMܼw!n/{οmb5 Ed|+E_`0_.Kz2 ԿJ3SOYXXl*'+p .,mBC#LpO{v()ed3_:t>|6(d=}b_@FGFסZPhnpggg4k߇ >CWu:HnGY(5>&Igj_o/ˌ.uC^7?A`Ы/OOKK`Y&J%Iglq>d WE1 =:w#4|.]AHK=~*.tkPoYSmZqr sss~]KrB$$ S"KM3Q @jO,1KN{nϦI=00[ƶ#P U.}YnhhFGIVRя)c;ŃTWb4)t'Actj8L GX7pbAgI?kp }ӟo;Χ8+ 0,W;TdBΜhM;Pd1pgEab-7]ɗ#Hm>*M]W6 (I\wH@`g*t{C`G'{Mc@Ox!uLOOE9Y"@)ڭU f!ZH.G lD A$l D]?]Gc #7p#<~qvid)/cyJer;bv|0 ' M+.=D}WzH4ItTUۡUoOeY@oOh l\`P+|˖-7 Zq8~ \]ׄ~u;TiFMp J@fD<4z֌Ɩ;O-jO$U[m@6o܁zv܅ 74{4A4ey:bȎ> {'˞= ?-,$:@naƋtUMHF,//~ Iu Pt-/7 F;x_,`dxg Hbrld>K+E3 ]ɍqY( 3v؉nQg}syIwf"O ʍDJKʇ}+X"*G e5oi+a!h=57`&@Vu++@pE;wOE`z IEn6TR,@Uuؿo?di}+[o㺀& ;8sLVyb * +>-`(|`d8D}eAfBns z?gBvQms% vl!Z$1J33>au"x™0A c,˪tuكghU֮ŠyUj]G9}?;;jTU+O%H@ Y ߓ 30M u9)){{{P[ruZ +9ufեah!,ixp=N, zcm:ry@+|SvRN>[0bM'8H/VA&]=|>iiZ`Y^LǠx!'5ۗ]߮RЋ|Ǝ;u I9T*ͱzHfbZ @+Guo䏃'IrK=XaӟJa* YRjjSިp)!j ` = )yRV.& 0 ~@}ŏoؓ@O5lg H,mfd&XC2B?$y^M)C`qkhԛp$l7R3;SΜtvvt$ ୷-cć4iA;͍*b a6@#B :݈uJ%~…0MkT_ZObAc;ObYޑen@& [x7@V N S*S9XeaajZs'48 zr(C1AY@GG! 0Mj5OS`\!d?)࿧b Y<7B82;)^/VX bc,$8d, Gbg/d+bwu2`LF" @`bb2g$fb-`u0lB@@w7Ҋ&:,`RUGR^dHg OO{}&cPa-Z+8 t  cS!R&o9aY,,,y#3j:c[ ҲD@)\JGQdd`YH00dl,dҷHYnAor*=M㨫VJ;Fq1`p@]uO>SqʅnsY4X֮xpT;~˰#/?~M{ &hӐ9碏wpщi]OJ",//5gELNdo_b+ָy0M _Gv>f?}chvOXo&py&3plթ*Mw 57Mmn|hI +D3 +!hqggv 0z3#PE(pw87_Wt G&2AMNā_Lq̐$&&? : &+?Uz\B %LPAD[T=aّMDJuYbL#hP?~*c-&!bDW(ta[ j5r,.|=8cO* _? ,4-X\\<"mcA0)6BcǏg$ZAXT*t{AgT7-]]I3 N1Dc/6*C뉖1LJIDATEIBDe ,#@"w&uM3@0VPp… ~ׂhXqVR*T\`\/!H_CZHvuٔ6 Vqϥ`|>{F2/!uJ37d40??xFgoIL VG(HIxL佷T%b6`zDR@NNc=>)tU`҈Qc쏕=-8HDžDicBbycI HŲ1g4Kdtjt!=ˢc|z`.1 R۾ѰZFRO1%NX3 Z,B|b)x+G<ߞœxZeeڝKgr ZAZi  $k3@Ft W b򏮍VץBӀZ͌ԇbfEO\H{סּ7-2[Rf7#?$_x/xBz>]2mJRmrH ,Gw⇥z277l Rt_|!M2ĻXwgZcݤqߙ^k~@VjCXPl ʈ.>5;{*=*ULRۺ(7@,tq '甴(ܷvVk5ڵIӌPks8C$p2"&"F hA A,@7$FʞcAmH#ୃ*ʴXRt|73Q!iJxk4`\aLĽA%ly΂4FooWV bkv,V^r̀iA HpE4V_εX,E&UĈJM:cc.<>U.h~(F&5q`9d bRs.4"9t["C>X\rϭgUd @@L3ASfGiJ&n "BW싩@ӲG1qvLuvx kiKCkO|806%XqneSk8w~eoF5\@+C]ұ@uM!-,`k!u>_ ui֡RD>/i>P\{G_zZNf3̔פ<9Iq/يtrj\81Pnpp%>^Y]i뙶``yyQM{G]֌A8P$"ҝN:::sa7Y@XL/6sȄHΪ$n.U0 #ãf`NSǏWu^N=t^8Bs!EJ7=]8-Ft6q|>v`K*7mB!.4pI8l20&偐Y.03; ۶Fgz^xmjEm@|e'hmHp^t}+w,%aHu‹$Z-(Qpļ8-@FomH XXdk,JrZU~ʅg2طo_$ XzGӰoUv)t H_W>yn>])Jb-}$Vҹi\¸1|9q|wgl-DWpuu1%o >ډid@;Vߍx>>`40&H4wxG=*D.F+QeE|G:h,h tq h!d5}๮nضz*sYL,[:*Hw u~ľ0?54##A5 2Aƃ}6X :s`?G}=' Pʯ71m߱%Il TT,2m@4vdQ`!qVb̊Gt&EHߎ=. grH4(;3OԿ#M A0`D 9dus]u~:]Kw/rsV̰0%?n]lhMӰ~ᔟ\XUyW̙/1r?ϏRvs۱ KY.@ |ܰ@U5 #דVO\%~|L*=r{ k!GmRLƀAUt n `rXc>&5b j~?J<y4AM\=ac|~<VD/8UzQaϲBOi^B_oMؼ뢀aڇ8{OA^|suj$IK$7GM \B k\:p~~k d ~ a+Rg$fxG`_˲I< 4]ߏ]/7<%$zBvvei‹q`^MJxex .ߗ^CрOxP2&XAutt?7u]6!(J@3C9y-5}F̯&d2Y0 gDZkl=qz_g78LݔFVyb(\bZ«q/cb3=ݔ {oo oLI[|W4Gv,/-Ɵ˫U_ew $%j=ȫ ;o{,˂ 2>##RVT(v+a(ٚlrEӴ_>‰);oP>?][ZY~ҝ*ҍ /7-CZE+̷h7ŘW*8yu8|q믡A,..oW)o 2V||٥ދ7fY:uz{zT*d ͂adTPdYEcA6LCB}]JPV (_od`yrd"(bj?y-x;" nz"l߾wWrUI4-.!es…!R"_[W4.Lfg'aܤ`<;nCJOC+GVPg߾c?q=puk/wvؠ80}ay/>˶75.u]J5EeY_|3dZg+%0:<=f!cd#H"᤬@#ض Z W`ff&ΞTh<ѿ|e~Co)1 ~wm.d28xÍk.dW*7FKK‹/[6w]+_$,Rz^wq}Pӵv/ad 2,Fgg@e/[@w8 -v džZ̈́jի4M-˃o}o~sS+c?x\c@O}.'s,\uհs.`J47\W_=O㦧۟=*d0 RB(B!sGV6 Yk O?y<ӧ`X~mD@en(Gn~WkYsIThpvvwpc]iu](0wq&&&`YtSzW?Pr"h)G+c{7uöŹٹG~_|qZ}A]W0h z{zaddJN(t C6]@ok46U=ݜ-m+pq"LOOArşرss["YH[nruwu22$Z2͓Μxg?eL6OZ"1B0 wmIE.,7bvi)ih4'O?oxkAeHTb_a 4C/ۑ/52:*+z|R=yafÏ?":eC>HZqib cka||x>tЇdy@~m{ۇ‰Opwn+(;z"+E4YQr3-D!HqpeqF5톽f۶9?7?k'&_Ut': :&3#?{m[s$ɛ꜖}'O~f @h/@?~L1: -Z lV|vD]ۻ|}ٽ oy4c֬WVVy̙g~_ZnĸiA 5I,Rk]ff 4L@C ޽xǙΌ8v"ˎENOOl!B$((; )խWU$zAAAAAAAAAAAAAAAQi4ttZNd݂,<~~d!$Ds8p@GM"Kpu70|p9?ރN^rA"Զwߘ%k ^ In{5t%w#k$D&m]/S~t,y.~LwH瑿iF>mu,nE"-cv o M"{;`y $Dz  S"]nK$cݯ{P Xַ\rC=2.OJ'0v ^ȿ`{>Gǿ~*%NUROY?nD0bPQR=GοSWeY %%WL/8*.#T](*V/‚"fw]]5"G-C@$wkW2\Mh^FQ~tU.,\7,mݻHQP;hYMh^#oUAƀV:QYi5_k  LN;X=6 -Qk7>DMEL]\]EH$i1+w9)ئ<\}?_p \UEzczt= `:M~c=7nju͙JzYkJVA]5B$D8&_[ x1czlXQeue"jP|5 !Μo찈эl6 #+*fWO !Wѿ+ʫuVwSTICj$mݝEWS[¢-Ym,rB6 snD"a r7 f(Xu9bՔ}[W@%,M}|IԆ%/E;7~&1,Mc:L1MP[_kGLg7Mض$vt1A"h"TW/}yv޾ V9SG >jZ6q?AYY;ūϵlNè* @{j"s/‘a25%xHD@dJ*B&,ja9 p`3,f1x6uBv+\UW⥧f;bkf "^j=Z@JK&m[Zň}H 0wF )|H3ք{?Fi%8,0vSsQW ϖ7,OnId,KG"GZP's4.'KH٪J@T#Qf+ϵ$/%gU<6wtZ"ʳZxT:R֬p]l:@I2coEg2xpK|ƺUn߽Vh p_[BN3ͨ{PrcUHH@mk_Ee1<фŮ2C~-떢y%5: c ߂ŕw8-Ȁmkk|i q|s5Qu`FjV+q}4}Des#Z6? @:ݿnQ۹V[60: صQlݰ: @] %]Vaza62[!Pس}%[J [FAPmcQ'˟牽s| aojl\8Q1+$DLj۰vڷ?"HJ>=V9  ?+ 0ڍ@"In&&!(ךGؿc0 x\U̠W<պk먳duw!(׊Nt:^FC8?9ͦrG|bD@%t] $`$FP %j~|#dYL8wͧ{[rb<ZٷKl} ƿz$"-r. Om;]|a=ND$JھUOٓ[[]nYP@2 LIƑdQ%u&vk*O2ZDyx&aI<'Bx1Tg6BԻʩS֮R&K2J8ʡY<@ %Ĝ1Lĉ;PW[F1K#>FKG+&_0ā{vUnatÏ@ZSdgşI HĎ] Avn}M%¼zsãiyoax*nPf1Jurxaa(nOb??3cXZU ,ˑ(yRk$I(oس}<~ã\ψ{qnȗT䴝`No^Tv^Qwf7xcȘk!oD(oZ>Q^ZtD :|A_{? ܐK`<<"؇JE]C6@Afu!o\tRn=Zaʏ!(W]m9<L&YHW$EN%7}A23\8O<1S? UŎw"3^p5ccA\N`r?uv$Zz&B|pVKMUϲɩWx)k3 @SsU ($_1W? ŠѪfnwHgS-yzȳۄ R3FqTv!Hx Pi 6"+GZP3VфgM'88|a\g"`},<~ԥ;Ե;;B8&`rsxp$SW<Ԭg8zۓ}pqM D[V{a.ſpPDi6_<%bx"\`2kH,٧žgչ KO]^ˈGedlW_Q,;iEV8N],o YxUgEuB9?g 0*ەp1IQg 9& /l!!Q8>x L#\3rm[PQY3}DovۣOI τFl%&Nw_WfQ߲kÎ0E!h_aT =c8W.oZp`aQ )+EIi @Uʪjc7Odz`+:NJŒ̠#!8FT8fX-w<lߠ-!Þ~$I?@ЊVc͊Ewnȋ[Y& yrł|A1i9£ucn~I{7ڷ?kk^|6F/PD$!?GHs|0(<(zNIXg Z65`0AR/ 0; L:ɹ~[ʫؑ6!??GH'#Q2~m_6<Y|q.˜O\aϱUO""$89£?Htj @mkv06?x޻1MJ晱LONy"v3Wt? aUZ6$'gmpdaطG3a"ַyzO^ܭ]^yN*ݱ)yãd89V*욍z:PBUT0L=r浠āx]D( Ϳ / ǡZOUU{|W^5  ?=3)ɷY E0c"2 ky [VI dDʽvU4~tIS[H\pZpcژs}9D00&a!(J'-*ǻ5];?RtjUmH]H/u/N Tu\>xd 5ݫ ^79fõa|zc*1JĢ׶A1@1vȷn:;IIJ.NpVk+i+1\ƛ@"#=g[b%&ƛZ֡/K߬aj4il&?2t(;]YwiuN'xuhqޚ O72-$a@5ɐi8N[; &ζW9gQE+2}0~ǺV W{ 㗼i GW_ CE~"L]Op߄(mԟm''IFIY6zo[csVTF WkN Hb<}"h" 'xzGl/0K\]9;,zg5i7wu.ߏYjڻ8_QPjI2]\e rg}\138f  \j{W~\=ՋV\m?@{DTkdY`\wtG/Q#||SV1?1ZvεHv' tUմWg, ^)N^0p %Bz"&ֈYbfҹ@ϒ 3|fd2j m}!KVbo92|r K6IS$^G1@(6 TFɋbE&}^@RaCS!@N6TDD sR6У$m)$DJ<@bʒV1  H:cњ^ v3c Ui@^pޛ"'ߎ9!Hv#|3Iiƌ[Ӕeͭg${e$ l|"szG"NˀrJPs"?Ez)H*̎ ؔ -c>@!@(\YVx@MrȨN=ɇ8!݃AUpU_O@5z7$cțidYdY$ M H,߆et;}ɵyun"JE?$04`X:p<|<H1| /@{(%X4.Y2c*0'Dh`Qt8]2rfĚ1#"l ' ;f3~?}@.y2!"agd 0& i0D"dD`1C>0A %\N]HirC" $SP^"ݜg>F;JI@>Ͽg=7G(I6KQ|6 0F"@dup0%Y "0pHLi)@%LyyMAi&@E@d 1H;Kf}asRGBbKGD pHYs B(xtIME  0g` IDATxwu0 LPY%Q%lW-`ӒLQ^{[ْVdJ)"H 93 &]?{f df}>5]] oooooooooe}wsލtc CHQKYv'卡7StF& )K ` rV"O Icw=ѩ7,`ڎ77ہ.Hv }Bꅧy rʿ{bFcCZZb:f5w,e[Ǧ%_ !XWOoD_}ͬmHMŁ\Hq$s<i9zzS#d>j V>}pݮ-`h՝,l9APA%jK\,= ύsyN9fğ(c3Pc@w{u5Qv]kuTA RW>o9rC:o,˕8q]#4U* `脃aS#%@R29cCy$/L-4'g_+-w!/m+iEQBDu Sqq\,Kpr^Ɠ.կ{c,6Mx艃<$ELNB5>8Y(%޻{Axb~h<$霅#4DO$pv 0B x4UUQU`/=*CL+P y(5FgCE@J8yn?CƷu)?t{?|Rwׯ%kqw~2l#:Hs JT~-srH{h} -@R$<.-`*s)}DI\H\šma,ϟ:N îtO>w?p<CA~]s5'&85ʦ/Mލ֑z+r[GQE4sNpzj(TU-rmL%l'n|C9Oݸb擨 $ C=CP RBr8;$hh$"VCsc-O Xg]ߜ:;S ;fIobNd A"i)qێ`aZ!d:j{SyT~=%t0C' ,l#U"&j~_tu =E\+N-+{[!lhk4$ 'dDԎ־wqah{o! [pxf1KKat>!x/(N1BjBFbџ -Vb.ǍVπa»]=ΰO=L:Z 0Wu-|coÑ1u]یOJiougؽ>ߵ w*{gYGB@:kaRYUX5|BeB?[zr?̰ (U | )g+$3:,.byӐx5_BU*zhZ u{1IaF75[xhP` ,͵! M%bv5s8^`մΞ|{nykE|]obUOA&gV`KИ8VE*e$R~TUě/ $Qte C(J Aq8Dgib]ߪ -ͪ廨"f|v=߃a̰_E4bi,ВL̮r$C)Z<x "`k͊[OϜ|kA/$(:x[X O!QH]?qsz6E\eh)GP,"OXR2d R\Nu (@P*/M%+l!__͔\ᩭH!0 PZ~9t\ ~-;/Rew&uZ-qukAmar.G" 0tƆ xJv/H@]Vt7ףA`KIsa6|mEgcgd 2/5hIQur[qWlDkmAP5TCAǠi|*N^EZƗYgWIDScג-XQVpAJCгjH`1XƝD8 Y/|Bnd+%ylӆ+Tc?@W.+v`׏άu!1~WZ8L@*xәG~G?Q#ЂO AmRv$tE_B2JW5N;ᅲjEV(ut\3l ^l1)8&|MY)454^Y "O}Z}[ʴ#lƕpt|uyݏ:럡ZyΌ̲%F8suy+SK7MsS@6G~VtMv\OrX8)rBCOQʘD%‘wc&Rخ]qcg 7E9dSdsrL"&YToT@%)CR!@JH57Ulo%=}?v-_gn8BT9FY%+O&1#~.҃\ dHsvb\=|-a"N̢f4¶ЄE2J\LYZE&!dA"A{JВ8r\ p){A2<} -mZ<ù&c~="s纤h+I9>-]Mp.*d5􉟍D[Wyd`rBW@NR8;P,pkpB5@:`E#R`{Ĵ)LdU!+ޔ@Q=IK%&728-N8\U)pQYW\J&lxra*t+2lNHvo<.y/[Vop WJz`3_"e9Ի2(rپ S:3 e}'A]~49A:z-݈#?4r:𼙽b`3׾f'e DLZ"aT:wts߯/k`]w[65C3q=寕[L8ZLбPmrV,_jnnel{º7!B崳%z)[q sҠ z)^A'-4w:FS2 uرMH<^v-Sfdn%b8yUcH1ϥAQө7F24ՆhmTkeot[x GfABW㋋N-;VLjp]o=MUr]7۩[=qE"rΐ޼%(?JJ dphpm m?|=^$>]ar6-%|]Rpn,EcM)%+:GSo5#[KhcR%o\0d2,,mqN8^\.Ǿ}/ۻ .\r98ƶ%? zy@7z+ԸLL/-̠I8 WmĪ؂)Ί7|Thwt’#=MS('pa*5:Zk+?ykErīhJx}qr,cjn=V+;h(j{* lټr5EQؾ}' #]z-0ضx ;[ͼX#kn+V-]]|}&p2@i5m\xdr9@\\(_OARH`d2YGd#P׷Au-Ƹƛ/鷾+&Pc?M@s֔;,e%q%a\uQKPLOgBSMw߿w8:2@\srIb+'*DlӯTCǡ螄rDQߨ9;7{Ipqx3cbb'Uٵ6I"S*Zb^0IDŤ3Y9EGKY RUWQו4ڛj%Qdb6GMd28ꢃ̩61WŘ:Z\=x5xֹ#&%Z( | s¥Z?#~ϷP5>:555O*ϭP`+ j!5%N09T2e!Vṹ_]]H/g9!`tv4]GI$lp(M$8MPO" ࡃUꕫP(̞17Z1F$ R1*lwsM&WRJ;ccK ;33eYjY B-%6+6iap.6-*>vΣtI娍ŦZ RX UHIRl:ϟz7B )xbl3<^o^[8ǯ;6SՍW~#G?^O4W >Nkk+H}UAn&^%DH444<ʋ^(ssM7i5Srov$.p55Gi\G^5~t佞A^t֢Է01+c8X(1H̠y@9R`ճ¢Ü90,`}a=lf`L":ۉY2_k_*Җ8æt_F 9KKG=UqOZ!&Arn)ĢtG^2(_iqi[|{d8LE-cO^"F")s?㸾 jEfU@DKkjkr\N ofMBruB-#8O ,[G<+KȯG"}c$EYu" )MÕ+V`Y?M܍bبrmvnE?sNvyEfZ֬^t_&>_G=k(1N ;#rpKhFY5L/'U 5XbGDe ]ŕ:.ҕXRS_#7KjlHh4 ob'{-}z?ExLBBކJ!ϐ韼"Eب"TFԓDSʁnEͣ2AYXkHLO ynqse\c\ fggȑLLNxaT;T+f"u#qEMU;vQtUS*YrH!#e֋W,RGffq7mf˖m^}Ɣ:s(r(1bnA^!$1s! a^1ڏPK:0,[ @!cnCѲ#$9lڅAΞ@xe&`@6m?~n/'OHN/U%X)hV`8c_їV,v$Q+x=.v]}[Eq*TWhV Ί{Tߕ6駫 K&h R\ث7By!O"w:BPG]`,*M!G)\:뎻y;M"ᕸknM!BjJ:UlfRFKdd)G/xT UX[wmu'_yIO|oY nӫo),5 ~ڞoHdQIW"<[@dhV~A6ځpVBFTuϢ$:!+b@4!`AǥKA!/6x3q'Uߔ,$K;4w=N>Zldx'[-w2+ΣTIbL|kզaԫn6Z[| ^ԉRT4xu1 ̖]SƇ^G:jYju8Li݂ۺ͘G U2zE{Qih\ۄIb8B [(Umjtq]umV=^z%ƺ!P` -eNҗ)':GL$˺5Y޷H>Ubw,(@8bfJqddʎ1R?`Q<3{5l~ua/?: >SD9BZYdm+WBU|p (R+8dŇPO"U̓fp6ۉ04Ĕ,(gż[y){.q5M0|k;H2 q썴k'7Ge=D~&!bᕥП6lbL糘n?tE 63s~Vܖ|?yU!Cr\:-a]ċUXץp`mߌHC̝$R `aEyXVM>N9"$!%I҉/TUP,=ĜRY.E,t1obQ۶qgj) [޽8W,t4C&\PL#3g.XqN"fc tp%byW|էS<W" Ae$Ϲ[TΓ$K9~© * *R}+-QUhԳ}"F | JWhrJS]%( + ~|XXްY ^.ƺcg7X$셫Vm r%S'o\YTo-ET9T6B ͟`SsrP{/K+#!R|`{w(o,D/ bXSAQ\6/292_.Dz6H,45ru7Znw,[+ _ED V*%;ϸjrSII˷YWKss9qq\)UF_e|0)})ΐ>BC9TQz)*"TKs"AJPPAJFF+/|}4{i+:\[i\te) RJfg˹lUOWlJ}s-@䊭lR_㠪J/Ay^~y;RuA+خ!R{3IOȿo/~x<555Zq}Fs_*\9-Pr;AV4tcjx?LǽXwQm A2 P,OH$hhKQ \\\V2B2ٌ_*&ãXtŮҲ3Sxd,).䊿q hizT_7gP܂ݻAr~r \gr_S!DQ: 2/}-ͣ{翠F9;8^Y Kb+˧.xwrj 0Eu_!E'tGGFH&=g-*nUt.~"VقS+Μ.K\{ ,Ϝ9㇕SɅz>q5W!|yG/)f^૯D)%Pد}\gJDT=ERvB&K-}_^5^ HRCRdG%+ß7/w|n,cMӈUu~UYT*3gN15奷(j8Ɂ;lm8/^sy#, y=CiX^~WHt~1_^3 ġϴRϱS~\P/ny昍SDܓO&IXqb@"^Kb񛙝a=E%Xsh 45W+NW֭2c2@y &4pdT'EY9~Bʕ6 ڇnqE 4?BxI"Q[UXٻ+pHd<#~eLJX Tw(5eo{'Jq4mm4fXqބDq\3"MAs(jÜ >:J;Ki\Y3Ū(v!y8Mkk[-4u>6RUX,})%~.ʥ1 #2vvGTE E&vlہ359I>P(p1Eޯmu`$ c&iÄQA_JWxx'}m;Yn;HA>1'C.h̉\xm韀bapIӸ(sYQU՗^H^a|< w<l[.k̥8XU@|QUs4{v֮Y'el&dށÜ?#.룹ٟD"i=v}Ӟ01xy}B+ ZJT/ykz 4d=D.Who6m"^ HӼe+sB07mpؓ/=5t&˟˯\)>+ (?k_{Q|\.G&!͒fs)ĕls=MhlhP$ ac80D_RiTkDgbvR5,k(v7߲y ;_XV9fggHҤR)Μ=黅47Dr]t:ͅ >}yY|%hD"A,'y5:w褓~?4R]e ӟp0C (wߔAJYLz|s| 3O.crjir +/k0uuu J"o^E _H?ndO+Jr?R0eU\t:y B%hki{YQyضSDF8eM⋳ECʽ??Ur;\|RVjH_iiiN("'H$jH$jIԐ'DE"+/CöZp+ρ4$LԢ˨(*h&:ۻhjj _|޼R4)ݪ9!%]-osF'ŧ?kEP) {]%ɾՑ~NPP(`YVqSUP7 QU+lO_ϞܹZY:)%#1m,Qϰz=[x%8," N)^f/ 0 @ @0,fuϮf0MXv=#F8r0BQ6|޽;n;!2m~ʲ<6ؙٝ]⩃:,QDQl ]T.'E-(Z4{FijS菠(PiAQE|4n:9N-[|Ȯ)ѢHQ\K}9ˤ6T vݙzG' lۨVboH$ߚFDC=<@7C3u\vlߎ޾B6>( L ۖfwQT–prtH$uCL*= 6f]{r iZ$L ;1}yf"uǝG_|WGi/H_/߭'M8v1aO\Z! [148,8l ˍFyX\ չVhEIzG}mSGi]t#]IwHt^1mnjX_/ 4b[Ld2iqӲ,5ɤ!h q7jB)ϧ`@ahtDAW\A*dy`wv#&{*~<4)uG؝UݼѨ@sss0M.X|2aK1to L"2qxWv<+Ȓ,6ٱ}my46L}gN~?|7r>o7Įt'T=*ZHkNWe{6C%_0^ z\HlZɅsP8)a$~'"8LYC^e+TNDC a(J(!Bvg6:6މH-A.iLGy Op҄A!2}*Jhpj۶m\?/>4AY8#&`BmZiiiVI#RݥbND*Zt]G@Tusl%ѽ$I@ޡsW"4`fDauk6:; >E^Q!σi8(B {ԩ0, 9`†t(bbtBd4֖%2@Nõ[Xx>hj3S&?u]GVCPm?7lɎr_HȲ,r]Sf@-~cICyR4J2J2ŢG0k`J=aRC91$G5zv*/0BD _ɒtkO JzeU6 HowG5IW6E\BPDXDZt} [; X=/p|~'aɄE(S^ R)A&mttM' E cbP2j{j{[J\.T*#_1ćET--堪2,>P<px{6~}}YeEJEFBAԩS/jJ"K+^nӖ$4S0 ~8-%tI%(\L&bbIeKȓZ4ҍ]'Q񇕕UR&R) nlޥ|F,%JBcP0::*L8?tMZ; Nr,xpx֏X,  I%nF A3Z63PV1Ǎ;D r$& 1MT3jh/f3mR R:s2}ǫ@Vlm}vmL&cׁ>+ Z3PՅⅤ"D+xKv*Tu TUzanpۃO:m -O@1U_D/O dY ehm@MUcc1b(2xC})l$џ֑IiȤ4Y:@z"AhSt:ä" 6(Iօ+&f+t6׋+9@=ګ8xUwB^{߻|[sp?^=ribbb!AtOj `[*`k$ !cc  RR|+1D8=f&lcxxmD~V~?޸p^\dYAЏݞ@$ٳ SSE:KDQuȔ h3x$)w(U\([}.!BULMMQo,.8L\*=phoJkN%JhJ~|w7Oؿ:e lSN.ξcf o_^Uȭcq)W XZ^Ǎ RdP*6.FL|ץFB 󘝽*h0(~lkCԓ{`288?g:r4&4?9or|aqqyܵk׊*rp a]^h'O>|anbʉV]_]{?홙Uϸ9-U5>p6* I衮ҝw9s P"l7ՁNF\./ ܹj#B  xnۻt&}(D++/=]XX{oW*@eQf/S;n<,wX]v< 8qbmޛNz*9P>'ASqvV/KkkkGo1&8!9;y`?.q6㎑Ȟp< -H~>ԛXB!ny~vs3:nj;b IENDB`smuxi-1.1/images/icon.ico0000644000175000017500000017612411700531610016214 0ustar00meebeymeebey00000000000000 hF  00 %V V:(  HMK'HNK'GMK'AGE& ,/.'ejhUgmkVgljVfkhU586(jnmDiF-sYDuywRºnpOgniom'f4f6tk`\Mo@qBmBT0sXxJzMyYpVv^~^QguQl'wQ[~w|Rt1)zV@k+G~X[ tR_8o-={VJ h t)[auC4)V/pfAx}Ӫw;{wTJ jFšdm'ųmԝwwzX0J J CGhׯ~ʟm]6wJ J Ns.>s0Dh ( @  KMK7digXfki]fki]fki]fki]ejh^dig_\`^S& 1ejhqvtv{yv{yv{yv{yv{xv{yrwuimk! 19;:8缿gkj4,12QQTR[}hU]5^3~~UrBuN1{~b.lF5{~vc0g:|~(t\d3c0~}f6e4e4lDRUT xz{qKi9j9i:i8rRmrp4  ֖;{cn?o?n?o?m=pLX5~hV*wmrDsEtEsErDvWoTFGJ $E/sExJxKxJwI~l~FG@goY|O}P|Q|P{Nt_6E`TUVUdnkz{etPH(S+͢gUzu[Y{MROVdj=bDP[4߽icnebPI}`uTh8kCaY2ھp(t^[Th4sjk;mC]M#͜zVxJ^Y?&oshuxMeED?΢B%IU\A+/[sNJ JCKxtn(,Xlnmqtrqts}V3-)@˘tX/iE˜u&,@L@0-(|hɣAAѯlu,2]iW_f_L740.2ǒmqMIJ$I!J! jEТ<0BRbKǸ9˳8Ų40'fΫCAm~n3co9`QR]vîqv9ı3,yxײY1Q(J FϮo>}ѓjәn۝pjߩګߨHɴ3ŲkpٯnJF5MJ IͬƝ{tJ}b):̹vīӡ|Ξy{qnܹpLCJJ Cnݺ}9*-<ʷ>Ξy˛uɗpƑhϤغ]6F7KDIY1ȣ侤~wx|ʗo̝xױܿ_DN% HBcO&ӫ}\Ǥַ߿ۼѱviD@G&J J AO?~~>~>~>@lE5J J ??(0`  132ORQ+SVV-TXV-TXV-TXV-TXV-TXV-UXV-UXV-SVT,=@>" +gkiiswutzwuzxuzxuzxuzxuzxuyxtywtywrwuhlk~9;:I'($3eig{~|~쀅퀅퀅퀅퀅퀅~||mqo0  .qvt}354i;&&I}ߠ@BBR<>=#y}{ʱVNE\, k8m9e:xzwݻSVU6)-+z}ygCnHpIt\y|f|R{Rq ~pVb0e6yˀ.rXd3f8| }!pQd3f6ziy~|\a^z|jBd3d3sYy~|_kpm}rc1d3d3kC;== }MkDd2e4e4c0zfx}{OvZe3g6g7h7g6g6p}z:6<rkn>n>n>n>m=n>zkzlX|64y' zpe掔f'7uHpAqBqBqBqBqBpAo?oImNDL!K$J}w0,ZsDtFtFtFtFsEsEqArxT)FJ dLR+BsEwIwJwJwIwIvIwK}gBHZL!?fPвe4jxJzM{N{NzNyMyL{TzZL"J DbJ}Y}Q}P}Q}Q}Q}Q}Q}P}WnP&GOeKq~PSTTUUT`\W}|mT+I@K!wZTf|_OSVYXRqIBU^Skaq{fbb:HuM$hx~tRdmńSj`G\dib]fk>aoIGO%rvOz}]UTK?J@cyuQk;`vRFO&uqBf{~inJuT{h{sDm>cyUFN%tX$_}sNjbhqus}~qtsuxwuxv|}Rc}I- |Ro@huQFL#mY!Y~xJzMeGi><:);ktduH”pkFGHi_Ōf:+gxfUuwusvusvuuur`LJ.(jx`{'c˜z[3HZD-oL˞ep#)08lAJ0,-'!zNǝ}R*J JD\6Ұ~T$),2nzyw\_]^b``db`db^b`|Nu8/,*&H|OxO%I GDɧnD),2bSO4.-*"cĕq^IAmuSմsn+-1?}~~wyw{~}UHL71/-*<|QϮa;E(HEӳp:,.8XMZszz{znR9641/-*nsŚwƠDI I#LFpMدm&/19X[FpdC;798Ʋ5î41/,;bظ`8DbI!LO%Ƣǖrm}'0;dCj[[ȩLȷYª9ɶ8Ƴ5°41/&fҨgFڊGKFEe@ؼeS6Ċ`͌]6G\imlfVLͭzkäq7Ų5ð41,uǓmͫO&J 3J J K"BzX޿mOTwʑfTQج߮׬Ъ£yC͸p=ï50/sŕpػe?HnJ FHѪzYݾfi9qʔlЖn͚rѝu̠{>6ݨ۪۩٧Ȧң~ɢ}=ɶ}4ų|ooǗsĭkEGGs] I M$Iٲg۾œl|Q`wc*.IJMʶxӣ~Р{ΞyĞyeBïKfj̚uۿlGEQ'J FFzXڼ֩ʎdhW^MZ*5¯<λ<]ĭѠ{Ξy̜v̙sϕmpǏe̒j׳նiCGP'I I EHY1̩Įy9vJ#*5=ͺ@:ͺΞy̜v˚sɗpǔmĐgѨɴyQ(HuHJ KI!HQF~^ۿ޼ңHiHJƱL˶g~͚t˚s˚sʜwҩոlHFJ ?I I@O&ݩyWšܺปޯ۪Ϊǫ٦֬ײܻëַ~pMIЁBpHI MFFQN%ƎT,e?hǢԵíܿӲĞ`_9S*L"F>GI I G]EDӂCBBBCD΃EHQK"I I J" JK! J J ??PNG  IHDR\rf IDATxwuIg-r%[DRHH3v]lSw=/իWUbX*VUbX*VUbX*VUbX*VUbX*VU XŅE-="/"[A4H)4Z@4Ą !a)f`FJfƔ M >[RWqJW$`b-B(46!D ΍I!ਐrD}~#:egUе5*b7R^'oBln2 @Me&kKݰUTJ6EKC܈ZRB@B^W )z~rR͌U ?nʫ;=Rrx:AG#M)o1R7̈́UD鍊܏qۅy܄^B~/KCS.EQqiA^ CfIsiҙ ll.G&%r*g|K 圚yt$0a^G i܏Ϸ>MU 46D.@}8@8V\EvuKy\ Kd&O2=cbz8xd2}KGVmp?A pչ 0Mj|n^$7G,/:dx(f936\h)|Y1;O=uNp1o9msU~ZmH u5nܚZyh+ m2,s S iFg8>4s 682o|عT V ?x5K@4" im+aCA[T'p{~[ZEJ_3L&9zj'F!;k ?+KRgUJk}ygA֮8K\újx]1%B1RbDd] Ҝ祃<=Bl=]هط8ۃX%ڷ>Ч Vr*tuְZ?R4U):i) I*'IeټNh\@7 4EܚK-~j .ץhx݅OUzdD K#%L/Ń9>xiGНJO˟́oV9\g.ZvվJҗsA,#K戧9yE4?)F)ݭ)=!­Ni)f8pbg^:I*p(wW*y}77觿KŅSJ%Ʋ'dz$3y@8kb99G.n0W [u=][Dp(uNMyӼх/18 zSܦ X%`-ISRI\ ;s54b lBXݐbVBan(|VTA}M$1%w!X Y^<2;Բm-_gVTMUX )z>, V5Fj}&Y/c9ŲΤOŬP]X<z'!x d;TY(&KAI=.:>j<XYCC3<?9/kRÏ YJk;T$XlsS{o4h: fR$䌊 qBZ1íEqJQ;ClN I4J9ZJo>,.U\O$Es(}uɱ9A?"H۾rX%*le_0O 8{nmhjAM4NŸ O'Lˆ=\4MV&y䝌t9BQ?ϽE, !Ln%![wpfZ&淓}eMVR6`&3!HVioҤTn5B|#cLRȿ:*WSw-;p^n%R2>Dt\ST%e?T=z'iC=zwJY ߅v 7 (DJaHV&w1TSVHjkt6io 60#fyWsSQۜ7U ϟ^]Z.~TOuӓqNIgQ%AAEdϟۈw ~~1BTDZ|+&"VJ)uTnnvR )&A?[([9@OsK I 7x8?2SSsT|7t7г7#S!m`- z-rDɌΉ(SqJy\/6F})hAצاfF ՆP}lu/(JE0l+ ~ lDʂj^\G9ͬ 8VJPhoVCЧ΁9z=*ɤVej@~&fʹ MK}{“#BObZb&d&FRb5>4%}E, 6[_ZJB,,2(:( ~ym #;VHzŪK)@[CB>`&љ}5^;4K+:|nz~G*-4=nkq HY`x*%/(|^90~IK*Xf F:[[Yj0P=p&݀WtPz3XrϾ2H2aEk$0AQ (!tt~9!ࣿ*F>W4,V߻n9gc {l,'!B&u [ԙ_38 ( C?[ǡ3T.MFf2XL{(*`cWɗԮR= , 5W*l兩T^ XPXT~^ʦZ!v6ؔsij{sǾ3H+o X? 2.YDim￝׵Y꘽ͦx$q~ͬ?O%Fdv-= פ a0 D3; (] 53NR 8V6ׅ- 6-H~y~1Hr\uyjjr0kHB^JM+U?Zl|23CݹcG+t O=w?УKpSnv#]Ygr:/Щ9r,Z+/5Iea26ZjQuIȳyh#}w$?C[+oh~ۧǁ5N^x׍ܾMQ,/.^^ Eyle( gP V T%[:A:KNo-@!« )ξ*@uD -3%pbC|viH 6eTA"cp<AwK }=m O8*BpW7GްлvomJob~7$:?<8x Cz+ \UI|±{5<[-CMHçF뻷2(g=Y_g|qR1 w'kn9r=Z0,O36$B^d.gbjjլߞw7o?fl׽DĒmDSmDm-bhL!}R glK ) c/K={>[Ny]{o&Xx04㙃 f/lܮdb/%93 AW7|$}uI:M*C2fzƊ(/5A.MqvF3.52tLR ٟ!c\et3 >7^OA{lT2UjwRrNh338re >#ZLQTAC׺I6Ml W xg/_ +rCϞ!S^Gk؍}.:Y>[~ײT8<[|C :M271 UUh*L0nuh;8 &B4hr+cTNN $" ˝ *@ DH,eYŒBbR>K@- R%P r{Jn@7 ˃p`p679;1L'k'gr\6b{Oޛx4GLU&Z05_[Ԭgta#sQQIV|nd!utSvWVIDAȑ+ |~Xe]+lUϷW#m#/ Tl!%Hq^<3躻2$:M$n-_$e]# VM)us/r" Mٷr>|E z._a:~ dp[ fS ,늱k3#RW !ݼ:$3`&KJv CT&ϓ;++]ٮPrm/ZD@C@C_BBb>,}tc..@#L,lE}Ƨle q&X4(DtD&U+|i`C8;[pGl%Akx0lx^O|6"~jn1O"y$#S zـwk>CWYoL\ '~؀cm`לWn Djj6@"w=;\7L=o ̂l|s-5{{]{$:L_pIg{Dэ<3ˆ*gD{ 0BGoFu2q&P5Hs3GeOʵ(u7rz2ƜbWm=n[^b\ ExSP*}߭t-ꧠ0WÓ_F9,8 Y0:?qp;C]w)׵v g!6BT%䯃Tr .{Ϭ{j0@//B߁c7Ch{mkp`Ղln^~u_$i$aj Mh[{綆 I+-,ULLjԷ\L@[-u8-M ^W}^CM(h# IDATjLMe֌w狖ڗE/ ͳm s nv;>gϼDl{n;=ܶS1^;9SC;nNNH^+(::o}c&gN"f.rhckgԫԫӄ BRRa6pf 1l2 ]0 ?U ũ{i3Q @˽rM9"oͽ\܌dO*)5Ig+q]r&;%[P,}_'=S(A h}>o;hGe]G =iQ4(ÆEFӲSFXDO=W/9VF)B6}ʕɛ4Š+kA!au 4''nșM-l 2y|V(]'ǖ|.K '~ M>?uN%DYzm#Oiv |+ǻ9t,$1}W W-lEsT'/4<"E'GG^y >N 8f;JlXt)hn'r^]Vl12O{TngPh86v45Śqkmi> ptq2`A34K#S.BK"oq ۦ+!wKn#{I"}4!sy:F.oQ=Z}5o;ƐNNUhMM['{꽐b@Ȁx}:NK/xɊG_Q$aׯC֯Ai$ۅ8`>K{%;?A&$hox\N R+Q mcYF+/U" 2:ÒnH3&m{^uB[I{@]^Xu"ಚt˾`֥'P_wܸ}ͺ-1PD!cg%MэjjuSl*p!hO+lZP)eynAQ5py_Ÿ nhZ}EexD!)h03J4ʿR )dKK2n45zlucB1r;`!iuG<͹G5#_N7n َ \Ԅ8tlIzlc/s7O:x.TENFB ر9'ɮs"H6@Be˂FKZc˥H;z:d:^\ m=M^kNh醎Ȏ~>H7F .l [-wz e#Okd9Ѳ5]E#*&I{T+c|2HVﳤu=K?B*6&j|èJއnTv(BgM7 N_ʩ˙f)0h}muT*'`.36.|sC_;Kr!5w?xPE.{3u[n`l6s'-B 뫴73M% vPvbO %$9eesB@0LeFDO?jP|>jUU"h_޸CQRXAy YLˎTuYn*~-,CghiۧKF_]MO2 x3ӻYHvKWίٶoh _}Z _^\*WXT<tiAdz|aB₩z"HEY?rָ,=7Hu}w`f}~Y:O4J$gYMZwc.& ZZj_ȯ@5Mdv nBiDAq)+&PhhÒ{IY+Bji@C?F,! Ӛ,r[R&_oQ4"`Hd;eGgl=SP '=v41#RL$nUWvr"}h+wo@,a[}wl-> H Og>mC|($>Bod!ҹZ5?g"ZbtDmEkmA Q.˕PS M,d bM42¨\C$=ed*Q_#2uRUTqS?M&WC7sV%8|zcg,jځRawͯJSR$3HM_Ҫt\n\!z%=! Bt Ѳ^IedU׾Kg2)2FKB9\ZMM.Z_"):#OR<=: 0kXV_u60|dђ膤_:k9480+ |u :#^G< {qܸϤ ȳ[up$|HMaNxU}OjM!Aw}X:PEٵip!URR9?ټLO0XU#Df)^Wm5i839!Qo )6' )5^t8H)xAAȩu[=h6C$9 ݸV<(sbdʓvc:o<ӺнBJ̶Z~'o/2H) )k&߶K v$4gV2^-x}+bHXXDt.h[~Д,>wgg{s.8@#' ou|%q&**+|xI 8;71L`="{yǑZ~)%A;w(cJmw+zSy|.`{sY!(Z>|n8 qb4Z,W H[z2 p>2v=5;u60ИO0z播$6 gM1&Ő*.5,V! S͝AºbCMYfheFWHz걁$<~TؒMuͣ*y,ټn475ҁayQ; x ֟Cl}?d6a\j[+L/Dt^|b;AVWS }|lυ!DӍLźgJ[B}3 6oT^y.F{L[\`)4rt6O~RUnMrlp<;"}Gћl$wq@oW\ܼOC5 ~=W.)dC!3p35$GӍLD{Idwgg93>0J$tÚ:غcd"A}(u8&Uf(>Rxi; ]@NUIF$4I ]=܅ds?_)D#.BlۮncC/019]ՙɏݗhnU|sfz 9FTU;.s@;[Th7.Lw!ĩ٫uӽ+TIdku7|xqTeR 4\{rړW_[9F2FHzEfL@3? 4$5]QhN@0n@:bn-@2:=:J]Ֆ" NmooSCO\Ԉ¯;t}N_ʚ݉. aHryL.-Ůf8_h5KoDs/n?bBA?5hOy+dXyC`_l0? ѹtśˀPVI :jAFuکBS Imb6V PUb jLEE dZr߿} m$g}M_E#0RK^Ǟ?O]srQpqfns}e 06\Z+lWarы*mYAkJЕPR_N1Үcn-c'&2p (3#~:z@@" ˭[S I4ȭhl2*# 첤3Gx\EC~s)fly] 1@x] # mqz&TEF+BE70 ]iJH6#(!bN}0S8 g1X /s(2G}Yŝ?K0#P¥"dYRib䌂Q&|a{7!I*L 3E7-ːPJ804˵"n#'Fkط/GqE׍vk_N:P0RY2bw3#+:9D59 dDt;H_l6+˴ad]+s# (z5' aPhAc]ET17i%b MŒKH Ϝb V^cMw9rnJN0MSW Tt,j jՉ tn04>:ߔ|r!Kǧ YYfhsu16d\Xs/{9&2aHIN>J"p,\<FFG{k, Ffv|456R255آ\ ,Qst*'נ zRx&EYs%=Sh 1;\0F;@CNa)@rikn29kC\UOˡcJ!~}]kƭ16?k.{l$?~~?? 8ܐd$cg (f7"pqQQ20=ƬM9ǽyrxm\8lfYM^9K\X"inoa99 e'WWp.ANZH튲nGGEn?_B3hGg99 C<[8|SSS HOr H\*x =̢BBIbBRCKab(ه3]ᆘþ<[zskﴤO%YHdzZkingb%|O]q jVo܍BE;tjV| }9"*e];';o 89u5QE}ktwEUU 3{Y1ڔ]-"DtL: QW f8)rT9Uc Æk : CKs6&]4gɿAx;#rxN9<|z QJABͽMM̐L.yUzm|~ژ#91]˜[۲NYe3)z-DhD hHDMDYeYe#$ +EԴbU/4t1n ;;QahL*Qx*KgSfڐW[>43CW'.OK]~ 5玀Th0\j1he>iTguןwѷ}yl0pg^z{Q1e"a{悁mDe#=\E +2[ 6̅֋oF~VڼM1/O/&'MOstVyTVR^.^|/}7gj@nNnZRHc#%0%dq~{1JEhlnk%! :gH<_%_[*'tI&!#S#RxaBس* %}[|6jvfRd 8W2 J$Wk+o *0t߭lz(fRawizYngqŜ֕@ecXyټо 3|*AKZىF]4UMN,^PQ``+ڵ$ܐUp[MF OŋZ47ʃxG۽c#.68Ўۥ-ɲH#%t5JH93tS>D$cO3~.QNz/)F .uQa:ʝĔ{1D"v!C;t9$AoА5<04'ȆmNwc+.t}`` ⪁:hS]B䠾zs{D[9畈`s_g-7"\ז뉫&M-^.E Qqiea ΚN%6ٴf=fcir ќۡc=W\4#"ywu㢯04O G+Ӂ@c$!}T'|ıqxPs {Ԗ+kS} o@hNR##6:>RJU"ҩ[ R%f;y  x %@OŨgT;?{J^*z;ٜ|NOؼƪ=6G]Xt˾'WŜ:᪁!8Mwj_ q]oJ 8.@ܪvoxVdKg Uyc-GLSBXb,nks KT*V?y?qƣJ]/}+Y7ݙ%  /sblT&t4M$lգ]I*.W=jFs)" Cc޿3JqbX  O\{ln!?-b8r0?{O>?Z|Batl <0TQa6 \m?̨u&Wmr'A(T >lBQWvY-gm IDAT6\8M3G<][^02/@pM*mF f:炋bՂ) VnK \N1UciЉW$PP{=p֋sOfSkw"TE;iÖg߽Bbfk6Csif%OB\v<uHڜyx=9W/@'!i\ 83p ɞ]ky*vkZQ-cև]p̱({f ,{5 k E\α=݋Y .WA}tRPCcaOs!%IqNһ{7RJ>YŲp]L&IԆkٲe+{K<Ι3#R4@Wo52h&lcX7.B"[-pY22GFn)<4 e-tCEAV!=ffvEiT2fʢ8n' @s~iHi]\-cM\FW:8ǹ`utj҇myF(FlŰ?Ѓ]٥!]&.8b;.N`]g![P Hs"'"zY&lÛb1T q'Gފ@B(7VoPWaП.+nHg3:= ]pCpIf^/x9|h}f֯[_pY7Os%\.]]tvvN!zk!;:<* 0fV薺,YՒ%˖F hxmxx=g8m ՙdw$A *pW[@)͙|Mwtz@ 撥%uAIVj v(kmr'VPwb^\.;f]= /<'NtЭqƲ]ƦʙUU7$褡U J@,ɒCO(ŭ%n4_T=O"$o6ߏ>J58Ov1񲥠?3W م M4h,.N\nK ([U_`xúnL̖qFFo[T>ίbYUo@ʼ=jB[B]=V&ѩv)l䜋Io7hw"f$2`o@_OMWlrLV }q|[|s3X&R)ޖZ^T7$)t7.fhiEvcG9QcuGb ;`bA|Y=E:wTBw`EMvHG{pC^ bMGܔ -qĈ(kے4'A}MQE-.ζm33ȣ8u7EIv<[e|MwM:ny)wٳǛțoX?@G{f͛р@ٷb8?W\ˡvhby{m {!avZ[{2)L:E!pe2Zp|nj]bOK>yy@x=@Rq ޞΰ\n0ō$;W]araZ:%jʓO 6{^߸%0^Pıq+ rww?3?+8N"uN>[l}>\季oyBץ\!4ry^~Y^z{LM31/-؇Bd";xBH`JIYȥp/_m.e+Bam^X& *a}bU#&mڞ,_S<~/G/~ W6&D"G$ .#`}BHH4IXt7 EE) J`#d֯s?[R?\lڴM6ݒD!5p-="q.uɵ;xS3TξM{)\z"K`n+3=6.Qf=jٚUSJɦhYwRu(Wzua#` 55BDܭWs+ȡru'#dKNRG?FgG6O=N_my •Y7"R9Cze::ށ6?K_8txݮϿ';;ԤWc[ܩt{( O]K奰Kv ܽo=>7`3 n܉UTU ah˦bS *J@W}:iˮSl u;EZwvp%A~{*hY/Qլڎw) f2q WCe×[B~$:SO?/ *5iRi~+)-LV&5Ͼ+/8)ޜ݂.\Ό~fZ(sJ% Nouu/T,׭ )EwK͍<0A I5ʇ\ @\h69ͽ~42wmMT}HI֩trX[o 'ǐgrlCXtO:4ہ j.͉DBd N+[? udz#;sm5F}N< ZP` b|$N( +9 9L*Qr$&9т4 weg(6\(=0~Ul[-!if6*(&6PLn .b(.W7o̎ 绸./|c?J/6c!?/|#r9YD+.ut‚J;scw31Q43\ 6+! U"HW4DTRhC: Z$'Kخٍ-(iΓlNgud"ѕd2RbWCB Ļ/b{0zKp re n gaͿ%<ł ON:pSDdؿ أb} 6<Xa}{/F\u]ҙ h.hsDvKVlxnc15Gk')m<M]&y\zSAhbcvHz.R>D7XV0U!R0'5NHgօ]H$`A Q]Ǿ}X~ΎN}*WCfRDƱgq=ߜKCwŠnOd!le(T.F"UcM}ؿoIem߭O(jFK¦H}^@xE {}I4vWtH.](u3Ы6Ě>l)H cVP;tELaek0>X1Nّ`ZM䁃//|~{̇_ n4Jqj#c{ߡh*kYc6r(vDHdg#/C9>F;3נ5T70}{/\_Qx?ZCk?m˭DMSs*zB_vF1 i6՘X?* f I18vGqy4];wH$C;,a# HPj흗aA'qƽ-u]HEIflF=q"AR6YY(%qHHIuHy)5W`!Ϊq)T* fg6vs2;IAenz=GIw%MZNb5bU?_$/q!pD䔚:""J"Fy<\qC:$wX5̎|لBp߽s]dV57Q_Ds 8rIɮ`Ŧ{ MHtFM蚍&pхU+sm4a4$:VbbWϢmF$bxKlA2I/ԐkPP?lߌ{ւxQA*"Jömx{O0!yآ[åkRqz_ENӅ1_ ]vRfU6K]{ ~Cy*=n| XT@{/T$ןcé#-1gR<Îs<]5; 4yXa%v .bV%Y觤=2m|9;:AQ"u0bs&Ghkkgۻq{SO5U-cp;BB[P$ +Ö4 Ge- QovB8o֑N 7wA>t]*ҭuG ]ChG|qoq]ąc @sq9KQՆT#'{hOZEλЄZak;A*ھXDX,ߟǞQ&<<[ a}fɚ5kxяp߽y#?1ȱ3;Is _&nYҥX[FܺRK _ߴ#ìpwU%? p>8뺵PFsĎޱW{]nm)6mG~rF̎G6uyt wch:Kx4{WtSa;)o<'o#3 O3'd Ex{‹qMQ 1)l,`И, KeDž[)ضI063JjrǢ488;CN*E49II!lA,Wxq/pD҂Tw d?:-(Q/  ??./=X+wC bZfTWSU@KjqW, WdڦM4 r_5Z|fm|ӟ!O,;]]9@3}zଲ9u^+{s!:|t]"+euf.)H!4 3u9IB,ylY0 HBy]O~E9)%8L ]B1(}}|Wƞ3w-+ (<kdӄ@_-?Rж<I#JO0)0jƏ|tt"ϵm;,ϋص5'QPV)_}HBZg6ٛ ]q-^zӭRe=1ښĭG^CXú͘uT&åAx*CR;CI{?EՋ+XwbqJJ\qt]CtBd2>ßg…OkD9SO u_1&8d5Sdw2بK x5ٲ,,Y[巣\@L)eӉ at+k7J e!NB!W F+}wqO5;ӗ7Isy~N gp/H< ڇ:Ųi IDATLy)|pH LCkT_/^+G6aw.HLÏ}x ]xʶQ룬O tMDOU=VG Q * 9 @ 4M;?ERqlOo PV,+YԜ!^]CЇhd!t&.sϥz70mSUZYyY ɦ%06njAd!d:mcHCw?L\E;fCDN>ͅ{|Q ,_O#LF\j |WcJ?Hd3mS ȭ+| ڱFL]bF-z$C<קXt>AX!"@o@ߨ+_dw"? S4QSo 5d[?2F$H3/i! neVQ-67"P"2(0zc> m'}8wOIXTH$yLD m{nB%?D*`ꁸPN+RHN[xT2.Wm\W˔kDaREZ,6(\F/OXٕSkŃ>(g\c҃ldn|O BQ=P3w[ _3|(K3E+]-=`Uo}!D^W ;`jJ& b\PVRT*eTtww=̳=burG~#kC2joOZl @̯be21SXHYllqC*rtCoq\{7t*5ı/ ]~"61J^+po~,Ġ"#r5AA'zޜoO=zAS/Õߣi}hb'c&=R)+m + הq h=]V'&lL7lۥXj5G:Ÿ-d, ۶H@1=J,ſCcpuv2J NGnv}u'kY6.Ft! EA !Dc?qz_NJco?\9 '!9D<Ӯ>#7P/Ţ\!H,.j%psQc|`:aXF+%ʔ+//M`UbYMӹ ģm\C[gqcȅ8x􃏑xcT*ta2'l)A;Ljr1uafi0L0tJjk1_8SΝ?.)L8ݸ\"ZӰ*޸ؗxK)EI`k'7%U!$˂`Dd$VqxUJ8wV:bSDA( 8.&!T cfMb7.+Cr8 ğϜ{VuX@RcHHf %kLJju"6%_8,%FH 2fq){& {SO\֭[G.sҧ@ $َz ۯk6Fa/^;Kwm{ d\8+0\$3XϪf)9&eǤ&( ~ǾHQڵH/# WfbfMǹpmzv_QG{h{^)ض2DbJωU?BM TQRa]J&fF8GƄUg 酢Ty% f=:jƆ D;β,]Bv?PQ-AQ *66o3C缝Ʉ!TǙ]^xb[a h-\ Ƕ ㆨiPm;fya[F2ȶM8M0WM3RzwI7Mܰ'32!dKFq휂(O ;:/%P@Үŕ{{#ŠT{oE]*y-d^ƙEڷa Q'ܱcWthB⸂L,)(H-m@xJg x#2~BYf3uEI@]M Jh7AUP}##,1xO0[ }`lzwu2bAmppC~?UV=S?0(83 ~#*' Շ꽿D̅ ϭW:-ɚ5d2a@NKMBSDnVO ןs~㤄{ŅiXfWLNyU&` J\) # |67 ??,o@>)-ʁ%4~ kj*,ƿFFVf}.%ի'(iG}tԛG1\%2cn=8{gzJ+cE ¥<E ,AΞ '$mD3ee!+V9&8 2DS!"1:H#]*@c +u ygN&ST* .LD҅׌ n: ޟaP_7nؤ! .F}p6P|60>"KuEf}$IJ>hp0N֤H 3sjp8@JD`S`CoEИzHFfH/aD'kala+b' 2LP&7#~{ VA3Qjqm|_]X /%_3ƒ-R΁^8x>|JR1%?~-~EXU ^Nw]h۲`;ͧ^Wv* r@g[It]'G54 x{kSMm胛u5Guf+vb>qV=Y`?@Ef m@*&R,6VvMH:4%1Op"啶V _>Pr <=򣯄!E3PQ7"fgМ8Psa?;Oq%JS BCgޗ"i= N0<{MJ۾~ǝ\9섙 N@§P(D1'xrq 4!a& vFWfT\%Q9?@'*`)L36d DScxy@B\. y$qhƚƱrS}pA-^8ix|ڎibz>#~ѝ"D"^q*ه:>L>A ?jZyvl1t*Jku=k;/u rSR$k^\kjX}`߸P1q[JA|n+o&>H(]ADt5 \xhB~w6 NPD«Ʈ+õ_b:n @GjY4( ߱A"? T9-. S}  @z=_br?'\W ];-}uQR`c#WzX̾8⫸f mZ?)DAS$#P Ԣ hV?Gkd`@ELf[ɱ >?\W*&j@ת2gS̅3 =#|3×RK@kB OC5jk6Nn6K)>׆:DIÝull^xC~Gur$[H݋sayFJBisQl &h͝+LQDl^ %ZymQ,]:D~9^aaΌKb5)bصK_HQY'86|C$,'<#DQƹ)=[P;Foy7iʼne-!e~1lfAuHC8S>7&=ѲHɊ@צ質*Rܤc&1'c0oS(EњxMjLEqaσbPcLEED׌ +#^Jd PWrW񭕶*$܅~D0ػPT),ׁ^Kn+gUe gYSM RsT*tQE+M" ͢#{=>h=E\P-B ٸ7F_,qqV,D;plbG\VB|ɽEGHL @\%SV/Y|5"j{3\֘bSF1?|W r_:˶nvvuky|Q@5,a> k^*.fWF+Ļ=8#.L®pU(:s+nZnYY]τqc.>ccLiU QnaeOcJeTv'낫ygJwPgF/h79A6NT+lœGӍ'++K;Ƿ oZea!CHb;\'RoLe`ۿ3ty8=G4 sUg/5@Cv7V8!3߶mFF ވ*!/u4>tgFD][r \t)zށqn`ߟ#Jlԇ_ǣ?r%  p53z}G]/\U0'cQR uj"+!(͉$LFc @9$3SBQcB e&d ~Du(=_,%h(vp[,=&/>Gsz7Q`G<1g:oNn)0lYJW.L3Q_BuV&"XWM@}a|8Bޑ3"+Ek XOYgFԡ~_jG`9\Wrq8$/<:R [)II^豷c\A[(":ZAJ91fYl-;[ɶk-1j?=>06oJ擞E"Rc>ۭiZ@ k̝"+׃7/^pѹ>9KwG-&Fl n98!u]8s-ar2nH$`QKZf.L> :;/"ծqg]S/!=\0;V##W((ax~sK8$VCRah(N*"¥xM -쯫GbpDp]?vQ5~ue\hJs+e鴵WJ̑7,UCM:}K"jOV M3!cr>wkuL&C#J4H$W0AYaPX|oLfp[SBErj$866Ɛ%Bl[fAkWh]}8y33xnqݜN ߧVѭp_e D)(ŭOC&yЅV!rRsC% VUyhu E3CqeYKp[ ޺d+k `\@MxW\ IDATIHtuR=0tq7fF80_BiR 7ow/OuEWL|ittD o"tc9׭K9' cYBbHK+Ҥ,7 [tՄl;ϲmtCQL)֯[u{mJ_!d"._SrrDZuiwjKWp>ff4aV@yHV%]"mKѫWپm{ln!H8p+@)t]KIlcr2. .Z7_cfv!6gn­&_j|S \-\WR)Wd2XK>*Vy Jz,j{R $9s4/~Ee=*jMu MӐv54JX>\b "bri7J#aEV*e&''ؼyK윿hFw;!Lѡf]^b㺔0kg9zjFdG#xR.X-U@~kzO !O4&`:wy'wܱ7+K_8O:G !0Mt:a\|2f6sfoo}C)')ffB:?]'Eynfj #+T턋cY'T](]Aы"z{f8#HץbUI&gvvM7y Hbm}4mmy!%}M8X\e$Wg4JV$BV׻@bcD G.6n"Hו{ffgXn}Xa:Walȋift:C{P(pNDaǎ]]ò:7à<,b${Փ?+`1"~.\`kAyu,˪P 4sslZ4)# Httr79zm"u4)կ1[֘C#OTxɥOܢA^M گ/}ԍ$ ۷#(F@ LɍJj>33ͅtuuބ#r*e_M3$)$dDLRkfHҘfB9ق.Cx^~<7ar9GRajz*D̯Gf!/{AF&(DeJ2 U|ͬ`UzR~G_j5(SLL`ÆJV B[$z\ضͫʉ&+T²(h:[xq3 ]w,j2pUj:/@>&?|khMӤ+8},sLOOהޫ:a`&ab/JP055/<ǻU{>H*&Hl߶>.^:4خv@-A˭SC$_kEFJ&6>ڹJtgx2֭WVH$⠔D0dHӋ. {9.]N7̙3>;\WY_1 ?k&O{DJ/k$r;tv䙝mp Js LMMyW/7vm_?wd2 6i`&kuV_8lc؇$<ّ;pmO\Pe JssM&dm|wQ,)(\.si绚m_L5b`ֈhSYԢ8$It+\#^O~iesr;rDA\\Ǐ73-BW~~4zf6峏|^fYU* ժeUYXXGeQVxʸh!ؼy wE',FrIF|i6nf`dL=<$0I$թT*o=2Ӵ߼S,tG ŷfvtNSMxؾm'mcY՚ĢZrqF4} |hjtCBeqA(Ξ?TX?ȁwH$H&f9z,JDW>'GaUٲ`Zמ 43?trXR.q']\L2_[T +!_ⓦa bg\ He jjq,U ۶-˦\.12z&U3d%IGDcuKe6eQTefz7)i[L3QGrӗdٚuJ4Ͷ-z)ΞUz;6Źz-5h1(J;{n-ŏ|qr\ >W,)Tccc\rqQ3߷ݻ 4n5Rp9}; mv6mR_ ' \Coơrldl掚>';UBį|탩d@Lg>و| eSoY6e׾{mò,f66wAA>gp`#T&}5ţL z5 rd\{,%9H!YL*4!@rU{``O|cSze yeF(lڰ;v߿vlnܸ0taIb2b׎]tttb."(s'$t9:rG"eKrDkLI 6+{zzS"?eUj gʩ{D¤+E&V V|7[6mw-d2wMWd2Y hF> t ;\>  " %"uQAŗd+.K;2SB[arJtD#_qĖE[lKhɲH$BI  }7ѯϙ7Dگjjfzzfz滿ce9HlnZi"΄E H<GqI u7 ڔ 9DxUb t.`w>w]xpZbuF^ )IL乶@t ]=rH6>l4h먺.ffӴ\6Mٲ,ض#X$W!|u.\_}/V}#oDB @`={?;0̃rL&?,Coe@}M3D cFuB'^F>_5kSZl tu`xp}}(J'rW7[fL4^)iOԔ2meɺX.a\iq]>>{{֎ziHwwW7ALyWIb /Mcz".\L;L#ã< l8:`4B?*X,bxċ;`FMnΝJ{\ 9iR0w>ֹؖZU4?QiG#LO)'br]HҰl!g0V& Β˝:Q,Z)mI0D $giz*,֭q j"0C0k=7hvMoWvqxO0Z`t„A6CgGҩL7z-!+`xpF7X,^T j۶Z Ӵ|[6o/0ƶܶgmr% \)ut<Mox#쾎h_ M(@No4p ?lz} {'5eHX*&hMi0PB[em,[oɻَԧ(y|Tk>} gkW[gmoBR7:2w.#V@h\A1̻&&j簼Z%@:ATFwWOx R[-$@? ϟ_#'76,뮻l+fn6Fij57hiw+ =9 l{"Qو;ʘq ʐқJk༉,1?qxzt0 t$^fz.έQ ȷ]E `F!x;h\mΛ8rckskr~%jM҇Oϣ Qҟ3?C

    3o~[dzV Ρn2C~@}h%P܂Vɖ(&\DCy: 2Mma^Bo8 SS8# 22 to2[nk,Cvߛa7ov>HCxƔ_XX@6 $ F%n#3^ۡy4e5-wA6]ShP_m/(3 1k y"O;`>C2ԧ IB!p Fvqf`9Bf €bIbH|wޕCfK h4C eIRc }~vڛю h1257 HE0Je"3_c`iΒVműmkw#GGbSa[gP4׎'{P4VVVPT~+$#Ya?0ˎldt&5T8M.dr+N:1~sy X'aPL5C7Mo0˃9b]fYiHRh6EWLJ.`ssdaq. jE;loon=XALBGGN6c?RJoݭamBZѸ>Wu<` _"ԹS]@:{h+:o/rRa gu"@l0N;Ԛ7zIe .-9LNN¶mtV倝i--ڟyɯ{u=3 Cb(|QѨǶ*:u^+;Sð}JxaI`vv.dNx+NoYb&6^Xܞ)*d`zѨk{,½{=l7*ޚ_倠a[` %<{ WwyAIOx~tf{j%8g逧S@[۶l\@<) <!Lmi=o(4uml!ݎo|{~] o4(m?ůۯV\."&''hCW{%7tg\jsy뙞#aֳm5:nęx_V<t# 5j8H[F6ߴiz{rع|?? J93Oam+wL >%d--ԧǎSS_nlF+.yݻjg@msO~a+M;w6TkB6Mv<5*uUs]>]1$ fOgDC #j*nE)XrWo0XiU; o I&汰0NRg vXt~SOR i*y߫m-I]V֢ŵ'uu qpnW ݷ~0Mro(̼"#SNIHI ̡IWw- ,ˆ뺜^u 4՜c%||끑K2 Z qab,d?9\+ޏ,K 4O`Y,KbNZo%TCm _aurΝ׀f5{;"R)~ܸf>`ǢZޙ1{RZFpISjj]! 0B3l͐=tf~ b9 hΝkQ`Q&k^qc2"MD3}2%`FxZ+SؿoRnƮc^@#@3Ө2 5$D#=3gB 51,T6}<$d$DSV.BT: ߜ](6}- % goۮO~uu/N~6J4 Qxѹr҄* c(Ե%yiVsQG@ ={4Ojo@$WPI:"ӗPT`N+Yj OWɄ(XCt|9ɿ} " "d2n z-))|Os IDAT{zzP,CskNA38Z`\8p02vIBq$P8LqWж]F]\^-|`dd$v@rna۪5Fӧϴ4? 濪1?gNUDyBe|>u5jd [c0 ȮYQnoV2 GvD恈~ǥKNM!5&H(T҄6mOpTm0g0?]}dbhhLBY#&ŋQVJ!Tb%]HCxO3U4Hmk&W 2el d`ڤ~Y 8؄pd%_O&?q.[@ Y)h%~8)NԔt٬ +sI@:}Rȁ xN:::B4JK>VG%? yMxsU!K~f3-3!}z%Yoj:nooRf@Gjq.O(>TFm .{Z?E+P3@*u[K)r .a4{uT*M`Z#>\+8pR?@*fvvjt%jS1fx.2~RHn@g D! .Zˏrvrz3vtwwqYy9s6e6 +3fJzw Ӕ|AK d[+dZqg0` ͪ%hm{"n$1ͨIEl= ~?>>!4тf-uheI-,8QZ*h9 FC -BWj@099Zƙ6&.^ ^$S2%5IsZ,ZD`hpP)ݾk˭ $U"seqZV?!G&I}]>$=G 82&EVTPPj%,O[ԌO 9[}N neљtyGQʅF@q˗ ϓ*{}>LD Sry䲚`CưuS #GOwӡϒ=sȽGAly/o|$wt`HT)Wd-KXX縣æ hL&Bro1ÃibJEPᰆ\<uQ,Z4Ŗwq/hDU *>j 2`Sg2֠'MFC,]]Lٛa~"R )]p7$Ļ1KlY7/Xc=m:::Q7B7ua@Z,<1H y5N7~rd2Y\AڶsB{D _u_ŠpX%C8/Ue @ R<kiN] DdLM*zX^ 0o?.\h MrAXpTo;ǁxEkuY< u>!IwZjv%HK@?h}k^׸n&"u|r `ff5S+]@x Z_$u(^ U3#nM4 ju):mec (0ʂ7\,gJOK݈"u֟{qV "}k8|vq4]HVӜo L&L"+N`pI PM:T@4D&+0GNZ&J9QTix?Wgy߫~O;-on ++2A+^녉OT*UT*!-8Sf"~~wT=$?B6wbkZuu8YyWL?U8-Wp4ߨ직?#^?޳!_Fz<1|` rY7t(ܳ^~5 BFn5Od8"1hE"Nҥp/3,"};?/צ60Nt[D T%7ܧqh |_.TcKF---q?t&UGMD2⑯"= 񴽢Q^,7ض[G&j5T*֔kyP@?HAR&5 Jb$ u;u. 47 tP* DuqF:P3"@!%:]6)r4?K$8ZD3t-^dB>Ox3AEuj&OWA=TA`t?D ~h:3=ꕁx>_FkT&E8W/--IL]D7=mVJ||G.ZYYQ%"F ?Z~ht@FN o@]c#?j9_`Y&| .M+eWTؒfJYL-..VIA32PB;Ɨ]mF x7:Mτ@KyXl\]P(q(3AWo6M.?@*F__/7ׂH!^ Z -Z ķGo%ynMܵ@ݱ2 NlVK#׹@0)0H o S l6 ׭FNǯR3z~a ])pQnt?N‘L"'cBTrΎ+ڭh>^ȱ[ӓSZ1in$^DaÕ*,8:ЗCT|`2uRX_#Cc۫/J@r B1FWFaףTZy cX4f9iq5$ G 6LyV "dgz]Y hwL Yq@B<-{xǞW0 emf-("Ǐ+ 4A,,,pA;:xe`LDxF^D3;.8J!PWPV$l?/R;qRO+-Rů >'ONMb”R0  .JJ&!;V*єM\P7Uw#QoWd2طoSSSXZRZK &PW>qnBT*ř<-J2h@ƵxL2L'ds?q6GG7P \%,,,(ZxC׎Drln B@%Cu?S*!_%h|U {wOݣUA A ?#uҲ"d8v\}>_`|vR!|A}gc>=-֭pVeKg'Bs[<D 㡇> 33x$$)ㅀXE  L='Cx3uZe@w۷O4%E8ȵILMM*xol6O@5sb+'׸4zM.W qĞ> C}zǟx\i]ON4/" J#I!8H&⠉Di!#&ZQ} ?~Nl6կ=nض-a(KV+TVcL;֏ w?џG_9LqeIXf}aǑ=]C05|f$hit3P=w9ٳ]]=2CF7^Q=č'^RA O4VzHb mۊQ! Np=<]%AOc |P&劚lGmcaKVa&F ^RH&Gpy[I@\rQEٔoWWWɤ?4PE9O&c ^(W2sx `}lJT*?|YI|#/4 q@(<[o;N+<۶79Hv ͢G|-ʓ^gkC|ntsJrC=G ϼ4Duatz) M8 @sF??y###(Z!Ngy .&g8g,]Dӆ%qǖe\cӚq 33ſ`O9tYY%tww?+ϝTJ]{pm8)+ ,y^k!/c?5N͏6UϟA<$lKĎߦl/𓇴?;3{=k-ewֈ6wj8+9+y<}ùX7'';6 l+.yJi]xcY\\hH0(ܹ}?8(=^F%7HW3}u(}߾|'O[X\c,,7V*o$e"gϜ?0:HVp t\vSB&A6E:mdòl 2c,[L7:A ܲVˢdN d2@VVqCڄ|>2|C8_Rh۶ms X7mƮk r\$au:#|DL}..M_S'0qn"b xg'?ON癞 k]”l}g߻m0 ݳrzMTe@!/Of z S8t i=Odj˦?=]_#\l6_/T̳rیatuu#" _ЮW@zAG fFj x"Ϟ|"bh6O}}K_>Q7g~Yh ~A|Ƿnd2۱sNͪ2y,@c&fsx#w]4?O"X ` 饽 ~ߴ_sRXۯt:NdYҙtk. ,$. 5=<Ѩh5PTHf뺉]`?M.B5NӲ5<|=?nĎ;ck+ {U\x?Oh{~&'|3 }_.K @AFb?zmr~ٹo?y[o!j~E@}}z{uxÿ1-S]0080wB\wp\+us\3t>t' Bw 4o\.==F܁b|>l6T* Իn^'KWs&o x2py2&QьՕ3_ѣNB_/Xx@E!j|]w^:3 XD?_ssssGϜk_ZFljP5B û\?p  t:[n)2B0M3\T7ݫ luQH&] 4'N>$˸ACs,@Gux@]?ط/Mg2{m]/jąwO>=>>ϽEewyܞnT юxWGP@_6Q[]]]_;0<_*zeZ2Ӳr`Y:#ūA .sg5yn黍fch3f&^xK/,6=j}|C T: І8r1r7~dl\6{<y'N/WQV`-NB&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi 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 if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi 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. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac 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. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 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 oIFS=$IFS IFS=/ set -f set fnord $dstdir shift 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=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_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` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: smuxi-1.1/configure.ac0000664000175000017500000006473714011472672015633 0ustar00meebeymeebey00000000000000AC_PREREQ([2.54]) AC_INIT([smuxi], [1.1], [https://smuxi.im/issues/new]) # using the --foreign option makes automake less strict about GNU policy AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign tar-ustar]) AM_MAINTAINER_MODE AC_PATH_PROG(PKG_CONFIG, pkg-config, no) if test "x$PKG_CONFIG" = "xno"; then AC_MSG_ERROR([You need to install pkg-config]) fi AC_PROG_INSTALL AC_MSG_CHECKING([whether the shell understands "+="]) shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && shell_append=yes AC_MSG_RESULT([$shell_append]) if test "x$shell_append" = "xno"; then AC_MSG_ERROR([Your shell (/bin/sh) is not supporting += which is required by this configure script. Try CONFIG_SHELL="env bash" ./configure instead.]) fi # I18N IT_PROG_INTLTOOL([0.25]) POSUB=" po po-Engine po-Engine-MessageBuffer po-Engine-Campfire po-Engine-IRC po-Engine-JabbR po-Engine-Twitter po-Engine-XMPP po-Server po-Frontend po-Frontend-GNOME po-Frontend-GNOME-IRC po-Frontend-GNOME-Twitter po-Frontend-GNOME-XMPP po-Frontend-SWF " AC_SUBST(POSUB) GETTEXT_PACKAGE=smuxi AC_SUBST(GETTEXT_PACKAGE) GETTEXT_PACKAGE_ENGINE=smuxi-engine AC_SUBST(GETTEXT_PACKAGE_ENGINE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE, "$GETTEXT_PACKAGE_ENGINE", [Gettext package]) GETTEXT_PACKAGE_ENGINE_IRC=smuxi-engine-irc AC_SUBST(GETTEXT_PACKAGE_ENGINE_IRC) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE_IRC, "$GETTEXT_PACKAGE_ENGINE_IRC", [Gettext package]) GETTEXT_PACKAGE_ENGINE_XMPP=smuxi-engine-xmpp AC_SUBST(GETTEXT_PACKAGE_ENGINE_XMPP) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE_XMPP, "$GETTEXT_PACKAGE_ENGINE_XMPP", [Gettext package]) GETTEXT_PACKAGE_ENGINE_TWITTER=smuxi-engine-twitter AC_SUBST(GETTEXT_PACKAGE_ENGINE_TWITTER) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE_TWITTER, "$GETTEXT_PACKAGE_ENGINE_TWITTER", [Gettext package]) GETTEXT_PACKAGE_ENGINE_CAMPFIRE=smuxi-engine-campfire AC_SUBST(GETTEXT_PACKAGE_ENGINE_CAMPFIRE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE_CAMPFIRE, "$GETTEXT_PACKAGE_ENGINE_CAMPFIRE", [Gettext package]) GETTEXT_PACKAGE_ENGINE_JABBR=smuxi-engine-jabbr AC_SUBST(GETTEXT_PACKAGE_ENGINE_JABBR) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_ENGINE_JABBR, "$GETTEXT_PACKAGE_ENGINE_JABBR", [Gettext package]) GETTEXT_PACKAGE_MSG_BUFFER=smuxi-message-buffer AC_SUBST(GETTEXT_PACKAGE_MSG_BUFFER) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_MSG_BUFFER, "$GETTEXT_PACKAGE_MSG_BUFFER", [Gettext package]) GETTEXT_PACKAGE_SERVER=smuxi-server AC_SUBST(GETTEXT_PACKAGE_SERVER) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_SERVER, "$GETTEXT_PACKAGE_SERVER", [Gettext package]) GETTEXT_PACKAGE_FRONTEND=smuxi-frontend AC_SUBST(GETTEXT_PACKAGE_FRONTEND) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND, "$GETTEXT_PACKAGE_FRONTEND", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_GNOME=smuxi-frontend-gnome AC_SUBST(GETTEXT_PACKAGE_FRONTEND_GNOME) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_GNOME, "$GETTEXT_PACKAGE_FRONTEND_GNOME", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_GNOME_IRC=smuxi-frontend-gnome-irc AC_SUBST(GETTEXT_PACKAGE_FRONTEND_GNOME_IRC) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_GNOME_IRC, "$GETTEXT_PACKAGE_FRONTEND_GNOME_IRC", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER=smuxi-frontend-gnome-twitter AC_SUBST(GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER, "$GETTEXT_PACKAGE_FRONTEND_GNOME_TWITTER", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP=smuxi-frontend-gnome-xmpp AC_SUBST(GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP, "$GETTEXT_PACKAGE_FRONTEND_GNOME_XMPP", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_STFL=smuxi-frontend-stfl AC_SUBST(GETTEXT_PACKAGE_FRONTEND_STFL) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_STFL, "$GETTEXT_PACKAGE_FRONTEND_STFL", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_CURSES=smuxi-frontend-curses AC_SUBST(GETTEXT_PACKAGE_FRONTEND_CURSES) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_CURSES, "$GETTEXT_PACKAGE_FRONTEND_CURSES", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_SWF=smuxi-frontend-swf AC_SUBST(GETTEXT_PACKAGE_FRONTEND_SWF) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_SWF, "$GETTEXT_PACKAGE_FRONTEND_SWF", [Gettext package]) GETTEXT_PACKAGE_FRONTEND_WPF=smuxi-frontend-wpf AC_SUBST(GETTEXT_PACKAGE_FRONTEND_WPF) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE_FRONTEND_WPF, "$GETTEXT_PACKAGE_FRONTEND_WPF", [Gettext package]) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.17]) # doesn't support multiple po directories :( #AM_GLIB_GNU_GETTEXT AC_ARG_WITH([vendor-package-version], AC_HELP_STRING([--with-vendor-package-version="DISTRO_NAME PACKAGE_VERSION"], [Set the distro name and package version, e.g. "Debian 0.8-1"]), [], with_vendor_package_version= ) WITH_VENDOR_PACKAGE_VERSION=$with_vendor_package_version if test "x$WITH_VENDOR_PACKAGE_VERSION" = "x"; then AC_MSG_CHECKING([for git version]) if git log --oneline 295b37c8ac4939829a3c7f9150943dba8fff07f0 > /dev/null 2>&1; then GIT_BRANCH=$(git branch | grep '^\*' | cut -d ' ' -f 2) GIT_COMMIT_HASH=$(git log --no-color --first-parent -n1 --pretty=format:%h) DIST_VERSION=$GIT_BRANCH/$GIT_COMMIT_HASH DEV_VERSION_SUFFIX="-dev" AC_MSG_RESULT(yes) else DIST_VERSION=tarball DEV_VERSION_SUFFIX= AC_MSG_RESULT(no) fi else DIST_VERSION=$WITH_VENDOR_PACKAGE_VERSION fi AC_SUBST([git_branch], "$GIT_BRANCH") AC_SUBST([git_commit_hash], "$GIT_COMMIT_HASH") AC_SUBST([DEV_VERSION_SUFFIX]) AC_SUBST([dist_version], "$DIST_VERSION") SHAMROCK_EXPAND_LIBDIR SHAMROCK_CHECK_MONO_MODULE(4.6.2) SHAMROCK_FIND_MONO_RUNTIME SHAMROCK_FIND_MONO_2_0_COMPILER_OR_HIGHER SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Core System.Data System.Runtime.Remoting System.Runtime.Serialization System.Xml Mono.Posix Mono.Data.Sqlite ]) PROFILE=debug # Release builds, that is without log4net and without debug symbol files (.mdb) # are not supported at this point, as they have no advantage at runtime but # disadvantages to analyze bugs. #AC_ARG_ENABLE(release, # AC_HELP_STRING([--enable-release], # [Use 'RELEASE' Configuration [default=NO]]), # enable_release=yes, enable_release=no) AM_CONDITIONAL(ENABLE_RELEASE, test x$enable_release = xyes) #if test "x$enable_release" = "xyes" ; then # PROFILE=release #fi AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [Use 'DEBUG' Configuration [default=YES]]), enable_debug=yes, enable_debug=no) AM_CONDITIONAL(ENABLE_DEBUG, test x$enable_debug = xyes) if test "x$enable_debug" = "xyes" ; then PROFILE=debug fi AC_SUBST(PROFILE) AC_SUBST(CSC, "$MCS") CSC_FLAGS= if test "x$PROFILE" = "xdebug"; then AM_CONDITIONAL(ENABLE_DEBUG, true) CSC_FLAGS+="-define:DEBUG,TRACE,LOG4NET -debug" else AM_CONDITIONAL(ENABLE_RELEASE, true) fi AC_SUBST(CSC_FLAGS) MCS_BASENAME=$(basename $MCS) CLI_RUNTIME=4.5 if test "$MCS_BASENAME" = "gmcs"; then CLI_RUNTIME=3.5 fi if test "$MCS_BASENAME" = "dmcs"; then CLI_RUNTIME=4.0 fi if test "$MCS_BASENAME" = "mcs"; then CLI_RUNTIME=4.5 fi if test "$CLI_RUNTIME" = "4.5"; then if test ! -e "$($PKG_CONFIG --variable=libdir mono)/mono/4.5/mscorlib.dll" -a \ ! -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/4.5/mscorlib.dll"; then # Mono without 4.5 support -> downgrade to 4.0 CLI_RUNTIME=4.0 fi fi if test "$CLI_RUNTIME" = "4.0"; then if test ! -e "$($PKG_CONFIG --variable=libdir mono)/mono/4.0/mscorlib.dll" -a \ ! -e "$($PKG_CONFIG --variable=prefix mono)/lib/mono/4.0/mscorlib.dll"; then # Mono without 4.0 support -> downgrade to 3.5 CLI_RUNTIME=3.5 fi fi if test "$CLI_RUNTIME" = "3.5"; then XBUILD_FLAGS="/toolsversion:3.5 /p:TargetFrameworkVersion=v3.5 /property:DefineConstants=MONO_3_5" fi if test "$CLI_RUNTIME" = "4.0"; then XBUILD_FLAGS="/toolsversion:4.0 /p:TargetFrameworkVersion=v4.0 /property:DefineConstants=MONO_4_0" fi if test "$CLI_RUNTIME" = "4.5"; then XBUILD_FLAGS="/toolsversion:4.0 /p:TargetFrameworkVersion=v4.5 /property:DefineConstants=MONO_4_5" fi # Mono's xbuild >= 5.0 no longer defaults to mcs as compiler but csc which will # generate debug symbol files named .pdb instead of .mdb. Since we are # installing the debug symbol files, we override the compiler to mcs to ensure # the files will be avilable for the install during "make install" AC_MSG_CHECKING([for Mono >= 5.0]) if $PKG_CONFIG 'mono >= 5.0'; then AC_MSG_RESULT(yes) XBUILD_FLAGS+=" /p:CscToolExe=mcs.exe" else AC_MSG_RESULT(no) fi AC_SUBST(XBUILD_FLAGS) # Required Libraries if test "x$(uname)" != "xDarwin"; then PKG_CHECK_MODULES([LOG4NET], [log4net]) AM_CONDITIONAL([BUNDLE_LOG4NET], false) else AM_CONDITIONAL([BUNDLE_LOG4NET], true) fi AC_MSG_CHECKING([for NUnit]) if $PKG_CONFIG 'nunit'; then AC_MSG_RESULT(yes) FOUND_NUNIT=yes AM_CONDITIONAL([ENABLE_TESTS], true) else AC_MSG_RESULT(no) FOUND_NUNIT=no AM_CONDITIONAL([ENABLE_TESTS], false) fi nini_files= if test "x$(uname)" != "xDarwin"; then PKG_CHECK_EXISTS([nini-1.1], FOUND_NINI=yes, FOUND_NINI=no) if test "x$FOUND_NINI" = "xyes"; then nini_files=`pkg-config --variable=Libraries nini-1.1` if test -z "$nini_files" ; then # Debian-based distros place Nini into the GAC PKG_CHECK_MODULES([NINI], [nini-1.1]) else # openSUSE has Nini as a private assembly; need to copy it. AC_SUBST([NINI_LIBS], "$nini_files") fi else PKG_CHECK_MODULES([NINI], [nini >= 1.1]) fi AM_CONDITIONAL([BUNDLE_NINI], test -n "$nini_files") AM_CONDITIONAL([BUNDLE_NINI_BLOB], false) else AM_CONDITIONAL([BUNDLE_NINI], false) AM_CONDITIONAL([BUNDLE_NINI_BLOB], true) fi AC_ARG_WITH([db4o], AC_HELP_STRING([--with-db4o=auto|system|included], [Use system or included db4o @<:@default=auto@:>@]), [], with_db4o=auto ) WITH_DB4O=$with_db4o if test "x$WITH_DB4O" = "xauto"; then PKG_CHECK_EXISTS([db4o >= 8.0], FOUND_DB4O=yes, FOUND_DB4O=no) if test "x$FOUND_DB4O" = "xyes"; then WITH_DB4O=system else WITH_DB4O=included fi fi if test "x$WITH_DB4O" = "xsystem"; then PKG_CHECK_MODULES([DB4O], [db4o >= 8.0]) AM_CONDITIONAL([BUNDLE_DB4O], false) fi if test "x$WITH_DB4O" = "xincluded"; then if test ! -d "$srcdir/lib/db4o-net/Db4objects.Db4o"; then AC_MSG_ERROR([lib/db4o-net is empty!]) fi AC_PATH_PROG(XBUILD, xbuild, no) if test "x$XBUILD" = "xno"; then AC_MSG_ERROR([You need to install xbuild]) fi AM_CONDITIONAL([BUNDLE_DB4O], true) #AC_SUBST([DB4O_FILES], "Db4objects.Db4o.dll Db4objects.Db4o.Instrumentation.dll Db4objects.Db4o.NativeQueries.dll") AC_SUBST([DB4O_FILES], "Db4objects.Db4o.dll") fi # Optional Libraries AC_ARG_WITH([messaging-menu], AC_HELP_STRING([--with-messaging-menu=auto|system|included|no], [Support Messaging Menu (Ubuntu >= 12.10) @<:@default=auto@:>@]), [], with_messagingmenu=auto ) WITH_MESSAGINGMENU=$with_messagingmenu if test "x$WITH_MESSAGINGMENU" = "xauto"; then PKG_CHECK_EXISTS([messagingmenu-sharp], FOUND_MESSAGINGMENU_SHARP=yes, FOUND_MESSAGINGMENU_SHARP=no) if test "x$FOUND_MESSAGINGMENU_SHARP" = "xyes"; then WITH_MESSAGINGMENU=system else PKG_CHECK_EXISTS([messaging-menu], FOUND_MESSAGING_MENU=yes, FOUND_MESSAGING_MENU=no) if test "x$FOUND_MESSAGING_MENU" = "xyes"; then WITH_MESSAGINGMENU=included else WITH_MESSAGINGMENU=no fi fi fi if test "x$WITH_MESSAGINGMENU" = "xsystem"; then PKG_CHECK_MODULES([MESSAGINGMENU_SHARP], [messagingmenu-sharp]) fi if test "x$WITH_MESSAGINGMENU" = "xincluded"; then if test ! -f "$srcdir/lib/messagingmenu-sharp/configure.ac"; then AC_MSG_ERROR([lib/messagingmenu-sharp is empty!]) fi PKG_CHECK_MODULES([MESSAGING_MENU], [messaging-menu]) PKG_CHECK_MODULES([GIO_SHARP], [gio-sharp-2.0]) GIO_SHARP_LIBS=`$PKG_CONFIG --variable=Libraries gio-sharp-2.0` AC_SUBST([GIO_SHARP_LIBS]) GIO_SHARP_FILES="gio-sharp.dll" AC_SUBST([GIO_SHARP_FILES]) ac_configure_args="$ac_configure_args CSC=$MCS" AC_CONFIG_SUBDIRS([lib/messagingmenu-sharp]) AC_SUBST([MESSAGINGMENU_SHARP_FILES], "messagingmenu-sharp.dll") fi AM_CONDITIONAL([WITH_MESSAGINGMENU_SHARP_INCLUDED], test "x$WITH_MESSAGINGMENU" = "xincluded") AC_ARG_WITH([indicate], AC_HELP_STRING([--with-indicate], [Support Messaging Menu (Ubuntu <= 12.04) @<:@default=auto@:>@]), [], with_indicate=auto ) WITH_INDICATE=$with_indicate PKG_CHECK_EXISTS([indicate-sharp-0.1], INDICATE_SHARP_SUPPORT=yes, INDICATE_SHARP_SUPPORT=no) if test "x$WITH_INDICATE" = "xauto" -a "x$WITH_MESSAGINGMENU" != "xno"; then WITH_INDICATE=no fi if test "x$WITH_INDICATE" = "xauto"; then WITH_INDICATE=$INDICATE_SHARP_SUPPORT fi if test "x$WITH_INDICATE" = "xyes"; then PKG_CHECK_MODULES([INDICATE_SHARP], [indicate-sharp-0.1]) fi AC_ARG_WITH([notify], AC_HELP_STRING([--with-notify], [Support Desktop Notifications @<:@default=auto@:>@]), [], with_notify=auto ) WITH_NOTIFY=$with_notify PKG_CHECK_EXISTS([notify-sharp], NOTIFY_SHARP_SUPPORT=yes, NOTIFY_SHARP_SUPPORT=no) if test "x$WITH_NOTIFY" = "xauto"; then WITH_NOTIFY=$NOTIFY_SHARP_SUPPORT fi if test "x$WITH_NOTIFY" = "xyes"; then PKG_CHECK_MODULES([NOTIFY_SHARP], [notify-sharp]) fi AC_ARG_WITH([dbus], AC_HELP_STRING([--with-dbus], [Support D-Bus @<:@default=auto@:>@]), [], with_dbus=auto ) WITH_DBUS=$with_dbus PKG_CHECK_EXISTS([dbus-sharp-1.0], DBUS_SHARP1_SUPPORT=yes, DBUS_SHARP1_SUPPORT=no) PKG_CHECK_EXISTS([dbus-sharp-2.0], DBUS_SHARP2_SUPPORT=yes, DBUS_SHARP2_SUPPORT=no) PKG_CHECK_EXISTS([ndesk-dbus-1.0], NDESK_DBUS_SUPPORT=yes, NDESK_DBUS_SUPPORT=no) if test "x$WITH_DBUS" = "xauto"; then if test "x$DBUS_SHARP1_SUPPORT" = "xyes"; then WITH_DBUS=$DBUS_SHARP1_SUPPORT elif test "x$DBUS_SHARP2_SUPPORT" = "xyes"; then WITH_DBUS=$DBUS_SHARP2_SUPPORT else WITH_DBUS=$NDESK_DBUS_SUPPORT fi fi if test "x$WITH_DBUS" = "xyes"; then if test "x$DBUS_SHARP2_SUPPORT" = "xyes"; then PKG_CHECK_MODULES([DBUS_SHARP], [dbus-sharp-2.0]) PKG_CHECK_MODULES([DBUS_SHARP_GLIB], [dbus-sharp-glib-2.0]) AC_SUBST([DBUS_LIBS], "$DBUS_SHARP_LIBS $DBUS_SHARP_GLIB_LIBS") CSC_FLAGS+=" -define:IPC_DBUS -define:DBUS_SHARP" elif test "x$DBUS_SHARP1_SUPPORT" = "xyes"; then PKG_CHECK_MODULES([DBUS_SHARP], [dbus-sharp-1.0]) PKG_CHECK_MODULES([DBUS_SHARP_GLIB], [dbus-sharp-glib-1.0]) AC_SUBST([DBUS_LIBS], "$DBUS_SHARP_LIBS $DBUS_SHARP_GLIB_LIBS") CSC_FLAGS+=" -define:IPC_DBUS -define:DBUS_SHARP" else # fallback to ndesk-dbus PKG_CHECK_MODULES([NDESK_DBUS], [ndesk-dbus-1.0]) PKG_CHECK_MODULES([NDESK_DBUS_GLIB], [ndesk-dbus-glib-1.0]) AC_SUBST([DBUS_LIBS], "$NDESK_DBUS_LIBS $NDESK_DBUS_GLIB_LIBS") CSC_FLAGS+=" -define:IPC_DBUS -define:NDESK_DBUS" fi fi AC_ARG_WITH([gtkspell], AC_HELP_STRING([--with-gtkspell], [Support GTK+ spell checking @<:@default=auto@:>@]), [], with_gtkspell=auto ) WITH_GTKSPELL=$with_gtkspell PKG_CHECK_EXISTS([gtkspell-2.0], GTKSPELL_SUPPORT=yes, GTKSPELL_SUPPORT=no) if test "x$WITH_GTKSPELL" = "xauto"; then WITH_GTKSPELL=$GTKSPELL_SUPPORT fi if test "x$WITH_GTKSPELL" = "xyes"; then PKG_CHECK_MODULES([GTKSPELL], [gtkspell-2.0 >= 2.0.9]) fi # Engines AC_ARG_ENABLE([engine-irc], AC_HELP_STRING([--enable-engine-irc], [Enable IRC protocol support (default yes)]), ENABLE_ENGINE_IRC=$enableval, ENABLE_ENGINE_IRC=yes ) if test "x$ENABLE_ENGINE_IRC" != "xno"; then AC_PATH_PROG(XBUILD, xbuild, no) if test "x$XBUILD" = "xno"; then AC_MSG_ERROR([You need to install xbuild for irc support]) fi if test ! -f "$srcdir/lib/SmartIrc4net/SmartIrc4net.csproj"; then AC_MSG_ERROR([lib/SmartIrc4net is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System Mono.Posix ]) fi AM_CONDITIONAL(ENABLE_ENGINE_IRC, test "x$ENABLE_ENGINE_IRC" = "xyes") AC_ARG_ENABLE([engine-campfire], AC_HELP_STRING([--enable-engine-campfire], [Enable Campfire protocol support (default yes)]), ENABLE_ENGINE_CAMPFIRE=$enableval, ENABLE_ENGINE_CAMPFIRE=yes ) AM_CONDITIONAL(ENABLE_ENGINE_CAMPFIRE, test "x$ENABLE_ENGINE_CAMPFIRE" = "xyes") AC_ARG_ENABLE([engine-xmpp], AC_HELP_STRING([--enable-engine-xmpp], [Enable XMPP (Jabber) protocol support (default yes)]), ENABLE_ENGINE_XMPP=$enableval, ENABLE_ENGINE_XMPP=yes ) if test "x$ENABLE_ENGINE_XMPP" != "xno"; then AC_PATH_PROG(XBUILD, xbuild, no) if test "x$XBUILD" = "xno"; then AC_MSG_ERROR([You need to install xbuild for XMPP support]) fi if test ! -f "$srcdir/lib/agsxmpp/agsxmpp/agsxmpp.csproj"; then AC_MSG_ERROR([lib/agsxmpp is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Core Mono.Posix System.Xml ]) fi AM_CONDITIONAL(ENABLE_ENGINE_XMPP, test "x$ENABLE_ENGINE_XMPP" = "xyes") if test ! -f "$srcdir/lib/StarkSoftProxy/StarkSoftProxy.csproj"; then AC_MSG_ERROR([lib/StarkSoftProxy is empty!]) fi AC_ARG_ENABLE([engine-twitter], AC_HELP_STRING([--enable-engine-twitter], [Enable Twitter support (default yes)]), ENABLE_ENGINE_TWITTER=$enableval, ENABLE_ENGINE_TWITTER=yes ) if test "x$ENABLE_ENGINE_TWITTER" != "xno"; then AC_PATH_PROG(XBUILD, xbuild, no) if test "x$XBUILD" = "xno"; then AC_MSG_ERROR([You need to install xbuild for Twitter support]) fi # compiling Json.NET with the C# compiler of Mono 2.4 will result in # a endless loop with eating all memory :/ AC_MSG_CHECKING([for Mono >= 2.6]) if $PKG_CONFIG 'mono >= 2.6'; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) AC_MSG_ERROR([You need Mono 2.6 or later for Twitter support]) fi if test ! -f "$srcdir/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.csproj"; then AC_MSG_ERROR([lib/Newtonsoft.Json is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Core System.Data System.Runtime.Serialization System.Web System.Xml System.Xml.Linq ]) if test ! -f "$srcdir/lib/Twitterizer/Twitterizer2/Twitterizer2.csproj"; then AC_MSG_ERROR([lib/Twitterizer is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Configuration System.Core System.Data System.Drawing System.Web System.Web.Extensions System.Xml System.Xml.Linq ]) fi AM_CONDITIONAL(ENABLE_ENGINE_TWITTER, test "x$ENABLE_ENGINE_TWITTER" = "xyes") AC_ARG_WITH([twitter-api-key], AC_HELP_STRING([--with-twitter-api-key], [Specify custom Twitter API key]), [], with_twitter_api_key="60QV2qQx9cS7y1BJDbgAA|2VgD6qQKddsF5HYQ0TrRgs3tFTnCwDONBmRlTmG658" ) AC_SUBST([twitter_api_key], $with_twitter_api_key) AC_ARG_ENABLE([engine-jabbr], AC_HELP_STRING([--enable-engine-jabbr], [Enable JabbR support (default yes)]), ENABLE_ENGINE_JABBR=$enableval, ENABLE_ENGINE_JABBR=yes ) if test "x$ENABLE_ENGINE_JABBR" != "xno"; then AC_PATH_PROG(XBUILD, xbuild, no) if test "x$XBUILD" = "xno"; then AC_MSG_ERROR([You need to install xbuild for JabbR support]) fi # compiling Json.NET with the C# compiler of Mono 2.4 will result in # a endless loop with eating all memory :/ # SignalR.Client requires System.Threading.Tasks which is part of .NET 4.0 # thus Mono 2.10 with dmcs is required! AC_MSG_CHECKING([for Mono >= 2.10]) if $PKG_CONFIG 'mono >= 2.10'; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) AC_MSG_ERROR([You need Mono 2.10 or later for JabbR support (or use --disable-engine-jabbr)]) fi AC_MSG_CHECKING([for 4.0 compiler]) if test "x$CLI_RUNTIME" = "x2.0"; then AC_MSG_RESULT(no) AC_MSG_ERROR([You need to compile with a 4.0 compiler (dmcs) for JabbR support (or use --disable-engine-jabbr)]) else AC_MSG_RESULT(yes) fi if test ! -f "$srcdir/lib/Newtonsoft.Json/Src/Newtonsoft.Json/Newtonsoft.Json.csproj"; then AC_MSG_ERROR([lib/Newtonsoft.Json is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Core System.Data System.Runtime.Serialization System.Web System.Xml System.Xml.Linq ]) if test ! -f "$srcdir/lib/SignalR/src/Microsoft.AspNet.SignalR.Client/Microsoft.AspNet.SignalR.Client.csproj"; then AC_MSG_ERROR([lib/SignalR is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Core ]) if test ! -f "$srcdir/lib/JabbR/JabbR.Client/JabbR.Client.csproj"; then AC_MSG_ERROR([lib/JabbR is empty!]) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System System.Core System.Data System.Data.DataSetExtensions System.Xml System.Xml.Linq ]) fi AM_CONDITIONAL(ENABLE_ENGINE_JABBR, test "x$ENABLE_ENGINE_JABBR" = "xyes") # MessageBuffer tool if $PKG_CONFIG 'mono >= 2.6'; then MSG_BUFFER_COMPILER_FLAGS+=" -platform:x86" fi AC_SUBST(MSG_BUFFER_COMPILER_FLAGS) # Server if $PKG_CONFIG 'mono >= 2.6'; then SERVER_COMPILER_FLAGS+=" -platform:x86" fi AC_SUBST(SERVER_COMPILER_FLAGS) # Frontends AC_ARG_ENABLE([frontend-gnome], AC_HELP_STRING([--enable-frontend-gnome], [Enable GNOME frontend (default yes)]), ENABLE_FRONTEND_GNOME=$enableval, ENABLE_FRONTEND_GNOME=yes ) if test "x$ENABLE_FRONTEND_GNOME" != "xno"; then PKG_CHECK_MODULES([GLIB_SHARP_20], [glib-sharp-2.0 >= 2.8]) PKG_CHECK_MODULES([GTK_SHARP_20], [gtk-sharp-2.0 >= 2.12.39]) PKG_CHECK_MODULES([GLADE_SHARP_20], [glade-sharp-2.0 >= 2.8]) AC_MSG_CHECKING([for gtk-sharp version >= 2.10]) if $PKG_CONFIG 'gtk-sharp-2.0 >= 2.10'; then AC_MSG_RESULT(yes) AC_DEFINE(GTK_SHARP_2_10,1,[System has gtk-sharp 2.10 or better]) FRONTEND_GNOME_COMPILER_FLAGS+=" -define:GTK_SHARP_2_10" else AC_MSG_RESULT(no) fi SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System.Drawing ]) if test "x$WITH_MESSAGINGMENU" = "xsystem"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:MESSAGING_MENU_SHARP" fi if test "x$WITH_MESSAGINGMENU" = "xincluded"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:MESSAGING_MENU_SHARP" fi if test "x$WITH_INDICATE" = "xyes"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:INDICATE_SHARP" fi if test "x$WITH_NOTIFY" = "xyes"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:NOTIFY_SHARP" fi if test "x$WITH_GTKSPELL" = "xyes"; then FRONTEND_GNOME_COMPILER_FLAGS+=" -define:GTKSPELL" fi if $PKG_CONFIG 'mono >= 2.6'; then FRONTEND_GNOME_COMPILER_FLAGS+=" -platform:x86" fi AC_SUBST(FRONTEND_GNOME_COMPILER_FLAGS) ENABLE_FRONTEND_GNOME_IRC=$ENABLE_ENGINE_IRC; ENABLE_FRONTEND_GNOME_TWITTER=$ENABLE_ENGINE_TWITTER; ENABLE_FRONTEND_GNOME_XMPP=$ENABLE_ENGINE_XMPP; fi AM_CONDITIONAL(ENABLE_FRONTEND_GNOME, test "x$ENABLE_FRONTEND_GNOME" = "xyes") AM_CONDITIONAL(ENABLE_FRONTEND_GNOME_IRC, test "x$ENABLE_FRONTEND_GNOME_IRC" = "xyes") AM_CONDITIONAL(ENABLE_FRONTEND_GNOME_TWITTER, test "x$ENABLE_FRONTEND_GNOME_TWITTER" = "xyes") AM_CONDITIONAL(ENABLE_FRONTEND_GNOME_XMPP, test "x$ENABLE_FRONTEND_GNOME_XMPP" = "xyes") AC_ARG_ENABLE([frontend-stfl], AC_HELP_STRING([--enable-frontend-stfl], [Enable STFL frontend (default yes)]), ENABLE_FRONTEND_STFL=$enableval, ENABLE_FRONTEND_STFL=yes ) if test "x$(uname)" = "xDarwin"; then ENABLE_FRONTEND_STFL=no fi if test "x$ENABLE_FRONTEND_STFL" != "xno"; then PKG_CHECK_MODULES([STFL], [stfl >= 0.21]) fi AM_CONDITIONAL(ENABLE_STATIC_STFL, false) AM_CONDITIONAL(ENABLE_FRONTEND_STFL, test "x$ENABLE_FRONTEND_STFL" = "xyes") AC_ARG_ENABLE([frontend-curses], AC_HELP_STRING([--enable-frontend-curses], [Enable Ncurses frontend (default no)]), ENABLE_FRONTEND_CURSES=$enableval, ENABLE_FRONTEND_CURSES=no ) if test "x$ENABLE_FRONTEND_CURSES" != "xno"; then # TODO: check deps AC_MSG_ERROR([Ncurses frontend not supported (yet)]) fi AM_CONDITIONAL(ENABLE_FRONTEND_CURSES, test "x$ENABLE_FRONTEND_CURSES" = "xyes") AC_ARG_ENABLE([frontend-swf], AC_HELP_STRING([--enable-frontend-swf], [Enable SWF (WinForms) frontend (default no)]), ENABLE_FRONTEND_SWF=$enableval, ENABLE_FRONTEND_SWF=no ) if test "x$ENABLE_FRONTEND_SWF" != "xno"; then SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES([ System.Windows.Forms ]) fi AM_CONDITIONAL(ENABLE_FRONTEND_SWF, test "x$ENABLE_FRONTEND_SWF" = "xyes") AC_ARG_ENABLE([frontend-wpf], AC_HELP_STRING([--enable-frontend-wpf], [Enable WPF (Windows Presentation Foundation) frontend (default no)]), ENABLE_FRONTEND_WPF=$enableval, ENABLE_FRONTEND_WPF=no ) if test "x$ENABLE_FRONTEND_WPF" != "xno"; then # TODO: check deps AC_MSG_ERROR([WPF frontend not supported (yet)]) fi AM_CONDITIONAL(ENABLE_FRONTEND_WPF, test "x$ENABLE_FRONTEND_WPF" = "xyes") AC_ARG_ENABLE([frontend-test], AC_HELP_STRING([--enable-frontend-test], [Enable Test frontend (default no)]), ENABLE_FRONTEND_TEST=$enableval, ENABLE_FRONTEND_TEST=no ) AM_CONDITIONAL(ENABLE_FRONTEND_TEST, test "x$ENABLE_FRONTEND_TEST" = "xyes") AC_CONFIG_FILES([ Makefile src/Makefile src/AssemblyVersion.cs src/smuxi-win32.nsis src/Common/Makefile src/Common/Defines.cs src/Common/smuxi-common.pc src/Engine/Makefile src/Engine/smuxi-engine.pc src/Engine-IRC/Makefile src/Engine-IRC/smuxi-engine-irc.pc src/Engine-JabbR/Makefile src/Engine-JabbR/smuxi-engine-jabbr.pc src/Engine-Twitter/Makefile src/Engine-XMPP/Makefile src/Engine-XMPP/smuxi-engine-xmpp.pc src/Engine-Campfire/Makefile src/Engine-MessageBuffer/Makefile src/Engine-MessageBuffer/smuxi-message-buffer src/Server/Makefile src/Server/smuxi-server src/Frontend/Makefile src/Frontend/smuxi-frontend.pc src/Frontend-GNOME/Makefile src/Frontend-GNOME/smuxi-frontend-gnome src/Frontend-GNOME-IRC/Makefile src/Frontend-GNOME-Twitter/Makefile src/Frontend-GNOME-XMPP/Makefile src/Frontend-Curses/Makefile src/Frontend-Curses/smuxi-frontend-curses src/Frontend-STFL/Makefile src/Frontend-STFL/smuxi-frontend-stfl src/Frontend-STFL/STFL/Makefile src/Frontend-SWF/Makefile src/Frontend-SWF/smuxi-frontend-swf src/Frontend-Test/Makefile src/Frontend-Test/smuxi-frontend-test lib/Makefile lib/osx/Info.plist po/Makefile.in po-Engine/Makefile.in po-Engine-Campfire/Makefile.in po-Engine-IRC/Makefile.in po-Engine-JabbR/Makefile.in po-Engine-Twitter/Makefile.in po-Engine-XMPP/Makefile.in po-Engine-MessageBuffer/Makefile.in po-Server/Makefile.in po-Frontend/Makefile.in po-Frontend-GNOME/Makefile.in po-Frontend-GNOME-IRC/Makefile.in po-Frontend-GNOME-Twitter/Makefile.in po-Frontend-GNOME-XMPP/Makefile.in ]) AC_OUTPUT if test "x$CLI_RUNTIME" = "x"; then CLI_RUNTIME=default fi AC_MSG_RESULT([ Configuration summary for $PACKAGE_NAME $VERSION ($DIST_VERSION) * Installation prefix: $prefix * Build profile: $PROFILE * Compiler: $CSC * Target CLI runtime: $CLI_RUNTIME * Tests: $FOUND_NUNIT * Engines ------- Core: (sqlite: built-in, db4o: $WITH_DB4O) IRC: $ENABLE_ENGINE_IRC XMPP: $ENABLE_ENGINE_XMPP Twitter: $ENABLE_ENGINE_TWITTER Campfire: $ENABLE_ENGINE_CAMPFIRE JabbR: $ENABLE_ENGINE_JABBR * Frontends --------- GNOME: $ENABLE_FRONTEND_GNOME (IRC: $ENABLE_FRONTEND_GNOME_IRC XMPP: $ENABLE_FRONTEND_GNOME_XMPP Twitter: $ENABLE_FRONTEND_GNOME_TWITTER) + Messaging Menu (indicate: Ubuntu <= 12.04, messaging-menu: Ubuntu >= 12.04) - indicate: $WITH_INDICATE - messaging-menu: $WITH_MESSAGINGMENU + Notifications: $WITH_NOTIFY + Spell Checking: $WITH_GTKSPELL + D-Bus: $WITH_DBUS Ncurses: $ENABLE_FRONTEND_CURSES STFL: $ENABLE_FRONTEND_STFL SWF (WinForms): $ENABLE_FRONTEND_SWF WPF: $ENABLE_FRONTEND_WPF Test: $ENABLE_FRONTEND_TEST ]) smuxi-1.1/po-Engine-Twitter/0000775000175000017500000000000014011526503016576 5ustar00meebeymeebey00000000000000smuxi-1.1/po-Engine-Twitter/LINGUAS0000664000175000017500000000014014011526464017624 0ustar00meebeymeebey00000000000000ca cs da de el es en_GB fa fi fr hr hu id it lt nl pl pt pt_BR ro ru sk sl sr sv te tr ur zh_CN smuxi-1.1/po-Engine-Twitter/en_GB.po0000664000175000017500000001242614011526464020123 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-11-30 04:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: English (United Kingdom) (http://www.transifex.net/projects/p/smuxi/team/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:132 msgid "Replies" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:139 msgid "Direct Messages" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:174 msgid "Connecting to Twitter..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:203 msgid "Twitter authorization required." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:218 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:234 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:241 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:251 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:291 msgid "Connection failed!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:253 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:293 msgid "Connection failed! Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 msgid "Fetching user details from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:271 msgid "Finished fetching user details." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:276 msgid "Successfully connected to Twitter." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:285 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:306 msgid "Fetching friends from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:311 msgid "Finished fetching friends." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:314 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:588 msgid "Twitter Commands" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:632 msgid "No pending authorization request!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:653 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:661 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:669 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:709 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:722 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:744 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:753 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:766 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:803 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:790 msgid "Could not send message - the specified user does not exist." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:980 msgid "An error occurred while fetching the replies from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1073 msgid "" "An error occurred while fetching direct messages from Twitter. Reason: " msgstr "" smuxi-1.1/po-Engine-Twitter/cs.po0000664000175000017500000002057614011526464017563 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # RavuAlHemio , 2013,2015 # Marek Černocký , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:46+0000\n" "PO-Revision-Date: 2016-03-17 07:59+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.7\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Domovský časový přehled" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Zmínky a odpovědi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Přímé zprávy" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Používá se proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Připojuje se k Twitteru…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twitter požaduje ověření." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Otevřete prosím tuto adresu a klikněte na „Povolit“, aby Smuxi získalo " "svolení připojit se k vašemu účtu na Twitteru: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Po svolení Smuxi přistupovat k vašemu účtu na Twitteru vám Twitter zobrazí " "PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Zadejte prosím: /pin PIN_OD_TWITTERU" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Připojování selhalo!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Připojení selhalo! Příčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Získávají se údaje o uživateli z Twitteru, čekejte prosím…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Údaje o uživateli byly získány." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Úspěšně bylo připojenu k Twitteru." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Získání údajů o uživateli z Twitteru selhalo. Příčina: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Získává se seznam přátel z Twitteru, čekejte prosím…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Seznamu přátel byl získán." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Získání seznamu přátel z Twitteru selhalo. Příčina: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Příkazy Twitteru" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Nebyla nalezena žádná nevyřízená žádost o ověření!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Selhalo ověření Twitterem: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter nepřijal váš PIN. Zadali jste jej správně?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Zkuste to prosím znovu: zavřete tuto kartu a znovu se připojte k účtu „{0}“ " "na Twitteru." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" "Účet na Twitteru byl převeden z jednoduchého ověřování na ověřování OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Smuxi bylo úspěšně ověřeno vůči účtu „{0}“ na Twitteru." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Nelze aktualizovat stav. Příčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Zprávu nelze odeslat – nezadali jste příjemce. Použijte: /msg $přezdívka " "zpráva" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Zprávu nelze odeslat. Příčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Ostatní časové přehledy" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Zprávu nelze odeslat – zadaný uživatel neexistuje." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Hledání {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} byl úspěšně smazán." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} byl označen jako oblíbený." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tweet {0} byl odebrán z oblíbených." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Nastala chyba při získávání časového přehledu přátel na Twitteru. Příčina: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Nastala chyba při získávání odpovědí z Twitteru. Příčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Nastala chyba při získávání přímých zpráv z Twitteru. Příčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter neodeslal platnou odpověď, pravděpodobně je přetížený" smuxi-1.1/po-Engine-Twitter/zh_CN.po0000664000175000017500000001741114011526464020151 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dean Lee , 2011,2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-05-03 19:53+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/smuxi/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "主时间线" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "回复 & 提及" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "私信" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "使用代理: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "正在连接到 Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "需要 Twitter 授权认证。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "请打开下面的 URL 并点击“允许”授权 Smuxi 连接您的 Twitter 账户: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "在您允许 Smuxi 访问您的 Twitter 账户后,Twitter 将提供 PIN。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "请输入: /pin TWITTER_给您的_PIN" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "连接失败!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "连接失败! 原因: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "正在从 Twitter 装载用户详细信息,请稍候..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "装载用户详细信息完成。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "成功连接到 Twitter。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "从 Twitter 装载用户详细信息失败。原因: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "正在从 Twitter 装载好友,请稍候..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "装载好友完成。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "从 Twitter 装载好友失败。原因: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter 命令" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "无待处理的认证请求!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Twitter 认证失败: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter 不接受您提供的 PIN。您是否已经正确输入?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "请关闭本标签,重新连接 Twitter \"{0}\" 账户再次尝试。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Twitter 账户已从 basic auth 迁移至 OAuth。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Smuxi 成功认证 Twitter 账户 \"{0}\"" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "无法更新状态 - 原因: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "无法发送信息 - 未指定目标。用法: /msg $昵称 信息" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "无法发送信息 - 原因: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "其他时间线" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "无法发送信息 - 指定用户不存在。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "搜索 {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "已成功删除推文“{0}”。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "已成功收藏推文“{0}”。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "已成功取消收藏推文“{0}”。" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "从 Twitter 装取好友时间线时发生了一个错误。原因: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "从 Twitter 装取回复时发生了一个错误。原因: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "从 Twitter 装取私信时发生了一个错误。原因: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter 所发送的响应无效,该网站可能处于过载状态" smuxi-1.1/po-Engine-Twitter/sk.po0000664000175000017500000001613614011526464017570 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Tomáš Vadina , 2011. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2011-09-30 08:37+0000\n" "Last-Translator: Tomáš Vadina \n" "Language-Team: Slovak (http://www.transifex.net/projects/p/smuxi/team/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Domovské časové pásmo" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:132 msgid "Replies" msgstr "Odpovede" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:139 msgid "Direct Messages" msgstr "Priame správy" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:174 msgid "Connecting to Twitter..." msgstr "Pripájanie na Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:203 msgid "Twitter authorization required." msgstr "Vyžadované overenie Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:218 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Prosím otvorte nasledujúcu URL adresu a kliknite na \"Povoliť\" pre " "povolenie pripojiť sa Smuxi na váš Twitter účet: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:234 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Akonáhle povolíte Smuxi prístup k vášmu Twitter účtu, Twitter poskytne " "bezpečnostný kód PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:241 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Prosím zadajte: /pin PIN_Z_TWITTER_ÚČTU" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:251 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:291 msgid "Connection failed!" msgstr "Pripojenie zlyhalo!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:253 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:293 msgid "Connection failed! Reason: " msgstr "Pripojenie zlyhalo! Príčina: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 msgid "Fetching user details from Twitter, please wait..." msgstr "" "Prebieha príjem podrobností o používateľovi služby Twitter, čakajte " "prosím..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:271 msgid "Finished fetching user details." msgstr "Príjem podrobností o používateľovi dokončený." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:276 msgid "Successfully connected to Twitter." msgstr "Pripojenie k službe Twitter prebehlo úspešne." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:285 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" "Príjem podrobností o používateľovi zo služby Twitter zlyhal. Príčina: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:306 msgid "Fetching friends from Twitter, please wait..." msgstr "" "Prebieha príjem zoznamu priateľov zo služby Twitter, čakajte prosím..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:311 msgid "Finished fetching friends." msgstr "Príjem zoznamu priateľov dokončený." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:314 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Príjem zoznamu priateľov zo služby Twitter zlyhal. Príčina: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:588 msgid "Twitter Commands" msgstr "Príkazy služby Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:632 msgid "No pending authorization request!" msgstr "Žiadne nevybavené overovacie požiadavky!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:653 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Overenie so službou Twitter zlyhalo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:661 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Služba Twitter neprijala zadané PIN. Zadali ste ho správne?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:669 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Prosím opakujte zatvorením tejto karty a znovupripojením k účtu služby " "Twitter \"{0}\"." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:709 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Presunutý účet služby Twitter zo základného overovania na OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:722 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Overenie účtu služby Twitter \"{0}\" pre Smuxi prebehlo úspešne." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:744 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Nie je možné aktualizovať stav - Príčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:753 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Nie je možné odoslať správu - nebol zadaný príjemca. Použite: /msg $prezývka" " správa" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:766 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:803 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nie je možné odoslať správu - Príčina: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:790 msgid "Could not send message - the specified user does not exist." msgstr "Nie je možné odoslať správu - zadaný používateľ neexistuje." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " msgstr "" "Počas príjmu časového pásma priateľov zo služby Twitter nastala chyba. " "Príčina: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:980 msgid "An error occurred while fetching the replies from Twitter. Reason: " msgstr "Počas príjmu odpovedí zo služby Twitter nastala chyba. Príčina: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1073 msgid "" "An error occurred while fetching direct messages from Twitter. Reason: " msgstr "" "Počas príjmu priamych správ zo služby Twitter nastala chyba. Príčina: " smuxi-1.1/po-Engine-Twitter/el.po0000664000175000017500000002362514011526464017554 0ustar00meebeymeebey00000000000000# Greek translation for smuxi. # Copyright (C) 2015 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Dimitris Spingos , 2015. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=smuxi&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-10 11:42+0000\n" "PO-Revision-Date: 2015-07-20 11:50+0300\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Αρχικό χρονοδιάγραμμα" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Απαντήσεις & αναφορές" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Άμεσα μηνύματα" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Χρήση διαμεσολαβητή: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Συνδέεται με το Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Απαιτείται εξουσιοδότηση από το Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Παρακαλούμε ανοίξτε το παρακάτω URL και πατήστε \"Να επιτρέπεται\" για να " "επιτρέψετε στο Smuxi να συνδεθεί με τον λογαριασμό του Twitter σας: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Αφού έχετε επιτρέψει στο Smuxi να προσπελάσει τον λογαριασμό σας στο " "Twitter, το Twitter θα σας δώσει ένα PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Παρακαλούμε πληκτρολογήστε: /pin PIN_FROM_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Αποτυχία σύνδεσης!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Αποτυχία σύνδεσης! Αιτία: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "" "Προσκομίζονται λεπτομέρειες του χρήστη από το Twitter, παρακαλούμε " "περιμένετε..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Τελείωσε η προσκόμιση λεπτομερειών του χρήστη." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Πετυχημένη σύνδεση με το Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Αποτυχία μεταφοράς λεπτομερειών χρήστη από το Twitter. Αιτία: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Μεταφέρονται φίλοι από το Twitter, παρακαλούμε περιμένετε..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Τελείωσε η μεταφορά φίλων." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Αποτυχία μεταφοράς φίλων από το Twitter. Αιτία: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Εντολές Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Χωρίς εκκρεμές αίτημα εξουσιοδότησης!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Αποτυχία εξουσιοδότησης με το Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Το Twitter δεν δέχτηκε το PIN σας. Το εισάγατε σωστά;" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Παρακαλούμε ξαναπροσπαθήστε κλείνοντας αυτήν την καρτέλα και επανασυνδεθείτε " "με τον λογαριασμό \"{0}\" του Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" "Ο λογαριασμός Twitter μεταφέρθηκε από τη βασική εξουσιοδότηση στο OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Πετυχημένη εξουσιοδότηση του λογαριασμού \"{0}\" για το Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Αδύνατη η ενημέρωση της κατάστασης - Αιτία: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Αδύνατη η αποστολή μηνύματος - δεν ορίστηκε προορισμός. Χρησιμοποιήστε: /msg " "$nick message" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Αδύνατη η αποστολή μηνύματος - Αιτία: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Άλλα χρονοδιαγράμματα" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Αδύνατη η αποστολή του μηνύματος - ο καθορισμένος χρήστης δεν υπάρχει." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Αναζήτηση {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Πετυχημένη διαγραφή τιτιβίσματος {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Το τιτίβισμα {0} καταχωρήθηκε ως αγαπημένο επιτυχώς." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Το τιτίβισμα {0} αφαιρέθηκε από τα αγαπημένα επιτυχώς." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Προέκυψε ένα σφάλμα κατά τη μεταφορά του χρονοδιαγράμματος φίλων από το " "Twitter. Αιτία: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" "Προέκυψε ένα σφάλμα κατά τη μεταφορά των απαντήσεων από το Twitter. Αιτία: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Προέκυψε ένα σφάλμα κατά τη μεταφορά άμεσων μηνυμάτων από το Twitter. Αιτία: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "Το Twitter δεν έστειλε μια έγκυρη απάντηση, είναι προφανώς υπερφορτωμένο" smuxi-1.1/po-Engine-Twitter/ro.po0000664000175000017500000002044714011526464017573 0ustar00meebeymeebey00000000000000# Romanian translation for smuxi. # Copyright (C) 2018 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Floren <>, 2018. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2018-03-10 16:19+0000\n" "PO-Revision-Date: 2018-04-08 18:03+0300\n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "Last-Translator: Florentina Mușat \n" "X-Generator: Poedit 2.0.6\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:124 msgid "Home Timeline" msgstr "Cronologie acasă" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:135 msgid "Replies & Mentions" msgstr "Răspunsuri și mențiuni" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:146 msgid "Direct Messages" msgstr "Mesaje directe" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:194 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Se utilizează proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:216 msgid "Connecting to Twitter..." msgstr "Se conectează la Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:258 msgid "Twitter authorization required." msgstr "Autorizare Twitter necesară." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:265 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Deschideți următorul URL și apăsați clic pe „Permite” pentru a autoriza " "Smuxi să se conecteze la contul de Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:281 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "După ce ați permis ca Smuxi să acceseze contul de Twitter, Twitter va " "furniza un PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:288 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Tastați: /pin PIN_DE_LA_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:296 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:358 msgid "Connection failed!" msgstr "Conexiunea a eșuat!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:301 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:362 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Conexiunea a eșuat! Motivul: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:316 msgid "Fetching user details from Twitter, please wait..." msgstr "Se aduc detaliile de utilizator de pe Twitter, așteptați..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:323 msgid "Finished fetching user details." msgstr "S-a terminat aducerea detaliilor de utilizator." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:329 msgid "Successfully connected to Twitter." msgstr "S-a conectat cu succes la Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:347 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Nu s-au putut aduce detaliile de utilizator de pe Twitter. Motivul: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:380 msgid "Fetching friends from Twitter, please wait..." msgstr "Se aduc prietenii de pe Twitter, așteptați..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:389 msgid "Finished fetching friends." msgstr "S-a terminat aducerea prietenilor." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:393 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Nu s-au putut aduce prietenii de pe Twitter. Motivul: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Comenzi Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Nicio cerere de autorizare în așteptare!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Nu s-a putut autoriza cu Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter nu a acceptat PIN-ul. Sigur l-ați introdus corect?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Reîncercați prin închiderea acestui tab și reconectarea la contul de " "Twitter „{0}”." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "S-a migrat contul de Twitter de la simplu la OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "S-a autorizat cu succes contul de Twitter „{0}” pentru Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Nu s-a putut actualiza starea - motivul: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Nu se poate trimite mesajul - nicio țintă specificată. Utilizați: /msg " "$nick mesaj" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nu s-a putut trimite mesajul - motivul: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Alte cronologii" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Nu s-a putut trimite mesajul - utilizatorul specificat nu există." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Caută {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "S-a șters cu succes tweetul {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "S-a adăugat cu succes la favorite tweetul {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "S-a eliminat cu succes de la favorite tweetul {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "A apărut o eroare în timpul aducerii cronologiei prietenilor de pe Twitter. " "Motivul: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" "A apărut o eroare în timpul aducerii de răspunsuri de pe Twitter. Motivul: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "A apărut o eroare în timpul aducerii de mesaje directe de pe Twitter. " "Motivul: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter nu a trimis un răspuns valid, probabil sunt supraîncărcați" smuxi-1.1/po-Engine-Twitter/fi.po0000664000175000017500000002005614011526464017545 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Kalle Kaitala , 2013,2015 # Mirco Bauer , 2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-06-28 16:33+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/smuxi/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Koti-aikajana" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Vastaukset & Maininnat" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Suoraviestit" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Käytetään välityspalvelinta: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Yhdistetään Twitteriin..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twitter-tunnistetiedot vaaditaan." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "Avaa seuraava URL ja valitse \"Allow\" salliaksesi Smuxin yhdistäminen Twitter-tiliisi: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "Kun olet sallinut Smuxin pääsyn Twitter-tiliisi, Twitter antaa sinulle PIN-koodin." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Kirjoita: /pin PIN_JONKA_SAIT_TWITTERILTÄ" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Yhteydenmuodostus epäonnistui!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Yhdistäminen epäonnistui! Syy: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Noudetaan käyttäjätietoja Twitteristä, odota ole hyvä..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Käyttäjätietojen haku valmis." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Yhdistäminen Twitteriin onnistui." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Käyttäjätietojen haku Twitteristä epäonnistui. Syy:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Noudetaan ystäviä Twitteristä, odota ole hyvä..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Ystävien haku valmis." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Ystävien haku Twitteristä epäonnistui. Syy:" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter-komennot" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Ei voimassaolevaa auktorisointipyyntöä!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Auktorisointi Twitterin kanssa epäonnistui: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter ei hyväksynyt PIN-koodiasi. Syötitkö sen oikein?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "Yritä uudelleen sulkemalla tämä välilehti ja uudelleenyhdistämällä Twitter \"{0}\"-tiliin." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Muutettiin Twitter-autentikointi perustilasta OAuth-tilaan." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Twitter-tili \"{0}\" autorisoitu onnistuneesti Smuxiin" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Tilaa ei voitu päivittää - Syy: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Viestiä ei voida lähettää - kohdetta ei ole määritelty. Käytä: /msg $nick viesti" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Viestiä ei voitu lähettää - Syy: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Muut aikajanat" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Viestiä ei voitu lähettää - määriteltyä käyttäjää ei ole." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Etsi {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} poistettu onnistuneesti." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} merkitty suosikiksi onnistuneesti." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tweet {0} poistettu suosikeista." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "Tapahtui virhe noudettaessa ystävien aikajanaa Twitteristä. Syy: {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Tapahtui virhe noudettaessa vastauksia Twitteristä. Syy: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Tapahtui virhe noudettaessa suoraviestejä Twitteristä. Syy: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter ei palauttanut oikeanlaista vastausta, palvelussa voi olla ruuhkaa" smuxi-1.1/po-Engine-Twitter/de.po0000664000175000017500000002100014011526464017525 0ustar00meebeymeebey00000000000000# German translation for smuxi-Engine-Twitter. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Bianca Mix , 2011, 2013. # JB, 2015. # Mirco Bauer , 2013, 2015. # Mario Blättermann , 2016. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2016-01-08 14:43+0100\n" "Last-Translator: Mario Blättermann \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.6\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Zeitachse" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Antworten & Erwähnungen" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Direktnachrichten" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Proxy wird verwendet: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Zu Twitter wird verbunden …" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twitter-Autorisierung ist erforderlich." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "Please open the following URL and click \"Allow\" to allow Smuxi to connect to your Twitter account: {0}" msgstr "" "Bitte öffnen Sie die folgende URL und klicken Sie auf »Allow«, um Smuxi zu erlauben, sich mit Ihrem Twitter-Benutzerkonto zu verbinden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "Once you have allowed Smuxi to access your Twitter account, Twitter will provide a PIN." msgstr "Sobald Sie Smuxi erlaubt haben, sich mit Ihrem Twitter-Benutzerkonto zu verbinden, wird Twitter Ihnen eine PIN bereitstellen." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Bitte tippen Sie: /pin PIN_VON_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Verbindung ist fehlgeschlagen!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Verbindung ist fehlgeschlagen! Ursache: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Benutzerinformationen werden von Twitter abgerufen, bitte warten Sie …" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Abrufen der Benutzerinformationen abgeschlossen." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Erfolgreich zu Twitter verbunden." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Abrufen der Benutzerinformationen fehlgeschlagen. Grund: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Freunde werden von Twitter abgerufen, bitte warten Sie …" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Abrufen der Freunde abgeschlossen." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Abrufen der Freunde von Twitter fehlgeschlagen. Grund: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter-Befehle" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Keine ausstehenden Autorisierungsanfragen!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Autorisierung gegenüber Twitter fehlgeschlagen: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter hat Ihre PIN nicht akzeptiert. Haben Sie sie korrekt eingegeben?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" account." msgstr "Bitte versuchen Sie es erneut, indem Sie diesen Reiter schließen und sich erneut zum Twitter-Benutzerkonto »{0}« verbinden." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Twitter-Benutzerkonto wurde von »basic auth« zu »OAuth« migriert." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Einrichtung des Twitter-Benutzerkontos »{0}« für Smuxi war erfolgreich." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Status konnte nicht aktualisiert werden - Ursache: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Nachricht konnte nicht gesendet werden - Ziel ist nicht definiert. Verwenden Sie /msg $nick Nachricht" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nachricht konnte nicht gesendet werden - Ursache: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Andere Zeitachsen" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Nachricht konnte nicht gesendet werden - der gewählte Benutzer existiert nicht" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Suche {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} wurde erfolgreich gelöscht." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} wurde favorisiert." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Favorisierung von Tweet {0} wurde erfolgreich aufgehoben." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "An error occurred while fetching the friends timeline from Twitter. Reason: {0}" msgstr "Ein Fehler ist aufgetreten, während die Freunde-Zeitachse von Twitter abgerufen wurde. Grund: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Während des Abrufens der Antworten von Twitter ist ein Fehler aufgetreten. Grund: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Während des Abrufens der Direktnachrichten von Twitter ist ein Fehler aufgetreten. Grund: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter hat keine gültige Antwort gesendet. Der Dienst ist womöglich überbeansprucht." smuxi-1.1/po-Engine-Twitter/hu.po0000664000175000017500000002070514011526464017564 0ustar00meebeymeebey00000000000000# Hungarian translation for smuxi. # Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the smuxi package. # # Balázs Úr , 2015. msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-17 11:45+0000\n" "PO-Revision-Date: 2015-07-17 19:37+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Saját idővonal" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Válaszok és említések" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Közvetlen üzenetek" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Proxy használata: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Kapcsolódás a Twitterhez…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twitter felhatalmazás szükséges." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Nyissa meg a következő URL-t, és kattintson az „Engedélyezés” gombra, hogy " "lehetővé tegye a Smuxi számára a Twitter-fiókjához való kapcsolódást: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Ha lehetővé tette a Smuxi számára a Twitter-fiókjához való hozzáférést, akkor " "a Twitter egy PIN-kódot fog biztosítani." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Gépelje be: /pin TWITTER_PIN" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Kapcsolat meghiúsult!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Kapcsolat meghiúsult! Ok: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Felhasználói részletek lekérése a Twitterről, kérem várjon…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "A felhasználói részletek lekérése befejeződött." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Sikeresen kapcsolódott a Twitterhez." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Nem sikerült a felhasználói részletek lekérése a Twitterről. Ok: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Ismerősök lekérése a Twitterről, kérem várjon…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Az ismerősök lekérése befejeződött." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Nem sikerült az ismerősök lekérése a Twitterről. Ok: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter parancsok" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Nincs függőben lévő felhatalmazási kérés!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Nem sikerült felhatalmazni a Twittert: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "A Twitter nem fogadta el a PIN-kódot. Helyesen írta be?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Próbálja újra ezen lap bezárásával, és kapcsolódjon újra a(z) „{0}” " "Twitter-fiókhoz." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "A Twitter-fiók átállítva alap hitelesítésről OAuth hitelesítésre." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "A(z) „{0}” Twitter-fiók sikeresen felhatalmazva a Smuxi számára" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Nem sikerült frissíteni az állapotot - ok: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Nem lehet elküldeni az üzenetet - nincs cél megadva. Így használja: /msg " "$nick üzenet" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nem sikerült elküldeni az üzenetet - ok: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Egyéb idővonalak" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "" "Nem sikerült elküldeni az üzenetet - a megadott felhasználó nem létezik." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "{0} keresése" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "A következő tweet sikeresen törölve: {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "A következő tweet sikeresen megjelölve kedvencként: {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "A következő tweet sikeresen eltávolítva a kedvencek közül: {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Hiba történt az ismerősök idővonalának lekérésekor a Twitterről. Ok: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Hiba történt a válaszok lekérésekor a Twitterről. Ok: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Hiba történt a közvetlen üzenetek lekérésekor a Twitterről. Ok: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "A Twitter nem küldött érvényes választ, valószínűleg túlterheltek" smuxi-1.1/po-Engine-Twitter/ur.po0000664000175000017500000001237414011526464017601 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-11-30 04:12+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Urdu (http://www.transifex.net/projects/p/smuxi/team/ur/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:132 msgid "Replies" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:139 msgid "Direct Messages" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:174 msgid "Connecting to Twitter..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:203 msgid "Twitter authorization required." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:218 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:234 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:241 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:251 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:291 msgid "Connection failed!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:253 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:293 msgid "Connection failed! Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 msgid "Fetching user details from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:271 msgid "Finished fetching user details." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:276 msgid "Successfully connected to Twitter." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:285 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:306 msgid "Fetching friends from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:311 msgid "Finished fetching friends." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:314 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:588 msgid "Twitter Commands" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:632 msgid "No pending authorization request!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:653 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:661 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:669 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:709 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:722 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:744 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:753 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:766 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:803 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:790 msgid "Could not send message - the specified user does not exist." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:980 msgid "An error occurred while fetching the replies from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1073 msgid "" "An error occurred while fetching direct messages from Twitter. Reason: " msgstr "" smuxi-1.1/po-Engine-Twitter/fr.po0000664000175000017500000002063514011526464017561 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Clément Bourgeois , 2011-2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-05-03 20:09+0000\n" "Last-Translator: Clément Bourgeois \n" "Language-Team: French (http://www.transifex.com/projects/p/smuxi/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Chronologie générale" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Réponses & mentions" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Messages directs" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilisation du proxy : {0} : {1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Connexion à Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Autorisation de Twitter nécessaire" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "Veuillez ouvrir l'URL suivante et cliquez sur \"Autoriser\\” pour autoriser Smuxi à se connecter sur votre compte Twitter : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "Une fois que vous avez autorisé Smuxi à accéder à votre compte Twitter, Twitter va vous envoyer un code PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Veuillez taper : /pin CODE_PIN_DE_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Connexion impossible !" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Connexion échouée ! Raison : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Téléchargement des détails utilisateur Twitter. Veuillez patienter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Téléchargement des détails utilisateur terminée." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Connexion à Twitter réussie." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Impossible de télécharger les détails utilisateur de Twitter. Raison :" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Téléchargement de la liste des amis Twitter en cours, veuillez patienter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Téléchargement de la liste des amis terminée." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Impossible de télécharger la liste des amis Twitter. Raison :" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Commandes Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Aucune requête d'autorisation en attente !" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Impossible d'obtenir une autorisation de Twitter : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter n'a pas accepté votre code PIN. L'avez vous entré correctement ?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "Veuillez réessayer en fermant cet onglet et en vous connectant à nouveau au compte Twitter \"{0}\"." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Le compte Twitter géré par autorisation basique à été migré la methode OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Twitter a accepté la demande d'autorisation Smuxi pour le compte \"{0}\"." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Impossible de mettre à jour le statut - Raison : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Impossible d'envoyer le message. Aucune cible spécifiée. Utilisez /msg $nick message" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Impossible d'envoyer le message - Raison : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Autres chronologies" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Impossible d'envoyer le message. L'utilisateur spécifié n'existe pas." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Rechercher {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} supprimé avec succès" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} enregistré comme favori avec succès" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tweet {0} retiré des favoris avec succès" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "Une erreur est survenue pendant la récupération de la chronologie des amis depuis Twitter. Raison : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Une erreur est survenue pendant la récuperation des réponses depuis Twitter. Raison : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Une erreur est survenue pendant la récupération des messages privés depuis Twitter. Raison : {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter n'a pas envoyé de réponse valide, le service est peut-être en surcapacité" smuxi-1.1/po-Engine-Twitter/sr.po0000664000175000017500000002353514011526464017600 0ustar00meebeymeebey00000000000000# Serbian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # Мирослав Николић , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-01-05 14:41+0000\n" "PO-Revision-Date: 2016-01-06 10:39+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Главна временска линија" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Одговори и помињања" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Непосредне поруке" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Користим посредника: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Повезујем се на Твитер..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Потребно је потврђивање идентитета за Твитер." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Отворите следећу адресу и притисните „Допусти“ да допустите Смуксију да се " "повеже на ваш налог на Твитеру: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Када будете допустили Смуксију да приступи вашем налогу на Твитеру, Твитер " "ће обезбедити ПИН." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Упишите: /pin ПИН_СА_ТВИТЕРА" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Повезивање није успело!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Повезивање није успело! Разлог: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Набављам појединости о кориснику са Твитера, сачекајте..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Завршио сам набављање појединости о кориснику." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Успешно сте повезани на Твитер." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Нисам успео да набавим појединости о кориснику са Твитера. Разлог: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Набављам пријатеље са Твитера, сачекајте..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Завршио сам набављање пријатеља." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Нисам успео да набавим пријатеље са Твитера. Разлог: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Наредбе Твитера" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Нема заказаних захтева потврђивања идентитета!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Нисам упео да потврдим идентитет са Твитером: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Твитер не прихвата ваш ПИН. Да ли сте га исправно унели?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Пробајте поново тако што ћете затворити овај језичак и поново се повезати на " "Твитеров „{0}“ налог." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Преселио сам налог Твитера са основне пријаве на ОПријаву." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Успешно је потврђен идентитет Твитеровог налога „{0}“ за Смуксија" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Не могу да освежим стање — Разлог: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Не могу да пошаљем поруку — циљ није наведен. Користите: „/msg $nick порука“" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Не могу да пошаљем поруку — Разлог: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Остале временске линије" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Не могу да пошаљем поруку — наведени корисник не постоји." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Тражим {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Успешно сам обрисао цвркут „{0}“." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Ознака омиљеног је успешно постављена за цвркут „{0}“." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Ознака омиљеног је успешно уклоњена за цвркут „{0}“." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Дошло је до грешке приликом добављања временске линије пријатеља са Твитера. " "Разлог: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Дошло је до грешке приликом добављања одговора са Твитера. Разлог: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Дошло је до грешке приликом добављања непосредних порука са Твитера. Разлог: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Твитер није послао исправан одговор, вероватно је преоптерећен" smuxi-1.1/po-Engine-Twitter/sl.po0000664000175000017500000001500014011526464017556 0ustar00meebeymeebey00000000000000#'smuxi/po-Engine-Twitter/ # Slovenian translation for smuxi. # Copyright (C) 2016 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Matej Urbančič , 2016. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2016-03-11 21:40+0000\n" "PO-Revision-Date: 2016-03-11 21:40+0000\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.8.4\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" smuxi-1.1/po-Engine-Twitter/pl.po0000664000175000017500000002104314011526464017557 0ustar00meebeymeebey00000000000000# Polish translation for smuxi. # Copyright © 2012-2016 the smuxi authors. # This file is distributed under the same license as the smuxi package. # , 2012. # Piotr Drąg , 2015-2016. # Aviary.pl , 2015-2016. # msgid "" msgstr "" "Project-Id-Version: smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-08-21 16:53+0200\n" "PO-Revision-Date: 2016-08-21 16:38+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Główna oś czasu" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Odpowiedzi i wzmianki" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Wiadomości prywatne" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Używanie pośrednika: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Łączenie z serwisem Twitter…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Wymagane jest upoważnienie serwisu Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Proszę otworzyć poniższy adres URL i kliknąć przycisk „Zezwól”, aby " "umożliwić programowi Smuxi łączenie się z kontem w serwisie Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Po zezwoleniu programowi Smuxi na dostęp do konta serwis Twitter poda kod " "PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Proszę wpisać: /pin PIN_Z_SERWISU_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Połączenie się nie powiodło" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Połączenie się nie powiodło. Powód: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Pobieranie danych użytkownika z serwisu Twitter, proszę czekać…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Ukończono pobieranie danych użytkownika." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Pomyślnie połączono z serwisem Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" "Pobranie danych użytkownika z serwisu Twittera się nie powiodło. Powód: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Pobieranie listy znajomych z serwisu Twitter, proszę czekać…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Ukończono pobieranie listy znajomych." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Pobranie listy znajomych z serwisu Twitter się nie powiodło. Powód: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Polecenia serwisu Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Brak oczekujących żądań upoważnienia" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Upoważnienie w serwisie Twitter się nie powiodło: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Serwis Twitter nie przyjął kodu PIN. Wpisano go poprawnie?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Proszę ponowić przez zamknięcie tej karty i ponowne połączenie z kontem " "„{0}” serwisu Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" "Przeniesiono konto serwisu Twitter z podstawowego upoważniania do mechanizmu " "OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "" "Pomyślnie upoważniono konto „{0}” serwisu Twitter do użycia w programie Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Nie można zaktualizować stanu — powód: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Nie można wysłać wiadomości — nie podano celu. Proszę użyć: /msg $pseudonim " "wiadomość" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nie można wysłać wiadomości — powód: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Inne osie czasu" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Nie można wysłać wiadomości — podany użytkownik nie istnieje." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Wyszukiwanie „{0}”" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Pomyślnie usunięto tweet {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Pomyślnie dodano tweet {0} do ulubionych." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Pomyślnie usunięto tweet {0} z ulubionych." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Wystąpił błąd podczas pobierania osi czasu znajomych z serwisu Twitter. " "Powód: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" "Wystąpił błąd podczas pobierania odpowiedzi z serwisu Twitter. Powód: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Wystąpił błąd podczas pobierania prywatnych wiadomości z serwisu Twitter. " "Powód: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "Serwis Twitter nie wysłał prawidłowej odpowiedzi, prawdopodobnie jest " "przeciążony" smuxi-1.1/po-Engine-Twitter/id.po0000664000175000017500000002004514011526464017541 0ustar00meebeymeebey00000000000000# Indonesian translation for smuxi. # Copyright (C) 2017 smuxi's COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: smuxi master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-01-17 20:03+0000\n" "PO-Revision-Date: 2017-04-20 13:29+0700\n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: Kukuh Syafaat \n" "X-Generator: Poedit 1.8.11\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Beranda Linimasa" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Balasan & Sebutan" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Pesan Langsung" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Menggunakan proxy: {0}: {1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Menghubungkan ke Twitter ..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Otorisasi Twitter dibutuhkan" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Silahkan buka URL berikut dan klik \"Allow\" untuk memungkinkan Smuxi " "terhubung ke akun Twitter Anda: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Setelah Anda membolehkan Smuxi mengakses akun Twitter Anda, Twitter akan " "memberikan PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Mohon ketik: /pin PIN_FROM_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Koneksi gagal!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Koneksi gagal! Alasan: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Mengambil rincian pengguna dari Twitter, mohon tunggu ..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Selesai mengambil rincian pengguna." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Berhasil terhubung ke Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Gagal mengambil detail pengguna dari Twitter. Alasan: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Mengambil teman dari Twitter, mohon tunggu ..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Selesai mengambil teman." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Gagal mengambil teman dari Twitter. Alasan: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Perintah Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Tidak ada permintaan otorisasi yang tertunda!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Gagal memberi otorisasi dengan Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" "Twitter tidak menerima PIN Anda. Apakah Anda memasukkannya dengan benar?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Silakan coba lagi dengan menutup tab ini dan terhubung kembali ke akun " "Twitter \"{0}\"." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Akun Twitter bermigrasi dari auth dasar ke OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Berhasil mengotorisasi akun Twitter \"{0}\" untuk Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Tidak dapat memperbarui status - Alasan: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Tidak dapat mengirim pesan - tidak ada target yang ditentukan. Gunakan: /" "msg $nick message" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Tidak dapat mengirim pesan - Alasan: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Lini masa lainnya" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Tidak dapat mengirim pesan - pengguna yang ditentukan tidak ada." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Cari {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Berhasil menghapus cuitan {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Berhasil memfavoritkan cuitan {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Berhasil menghapus favorit cuitan {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Terjadi kesalahan saat mengambil lini masa teman dari Twitter. Alasan: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Terjadi kesalahan saat mengambil balasan dari Twitter. Alasan: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Terjadi kesalahan saat mengambil pesan langsung dari Twitter. Alasan: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "Twitter tidak mengirimkan respon yang valid, mereka mungkin kelebihan beban" smuxi-1.1/po-Engine-Twitter/es.po0000664000175000017500000002057514011526464017564 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Matías Bellone, 2013 # Ricardo A. Hermosilla Carrillo , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-07-13 12:00+0000\n" "PO-Revision-Date: 2015-07-13 \n" "Last-Translator: Mirco Bauer \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/smuxi/language/" "es/) <>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Línea de tiempo principal" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Respuestas y menciones" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Mensajes directos" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Utilizando proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Conectando a Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Se requiere autorización de Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Por favor, abra la siguiente dirección y haga click en «Autorizar» para " "permitir que Smuxi se conecte a su cuenta de Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Una vez que haya autorizado a Smuxi acceder a su cuenta, Twitter le proveerá " "un número secreto («PIN»)." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Escriba: /pin NUMERO_SECRETO_DE_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "¡Falló la conexión!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "¡Falló la conexión! Razón: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Obteniendo los detalles del usuario de Twitter, por favor espere..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Finalizó la obtención de los detalles de usuario." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Conexión satisfactoria con Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "No se pudo obtener la información del usuario en Twitter. Razón:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Obteniendo lista de amigos en Twitter, por favor espere..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Finalizó la obtención de la lista de amigos." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "No se pudo obtener la lista de amigos de Twitter. Razón:" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Órdenes de Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "¡No hay autorización pendiente!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "No se pudo autorizar con Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" "Twitter no ha aceptado tu número secreto. ¿Lo ha ingresado correctamente?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Inténtelo nuevamente cerrando esta pestaña y conectando a la cuenta de " "Twitter «{0}» nuevamente." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Se migró la cuenta de Twitter desde autenticación básica a OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Se autorizó la cuenta Twitter «{0}» para Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "No se pudo actualizar su estado - Razón: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "No se puede enviar el mensaje - no ha seleccionado un destinatario. " "Utilice: /msg $nick mensaje" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "No se pudo enviar el mensaje - Razón: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Otras líneas temporales" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "No se pudo enviar el mensaje - el usuario especificado no existe." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Buscar {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} eliminado con éxito." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} marcado como favorito con éxito." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tweet {0} desmarcado como favorito con éxito." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Ocurrió un error al obtener la línea temporal de amigos desde Twitter. " "Razón: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Ocurrió un error al obtener respuestas desde Twitter. Razón: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Ocurrió un error al obtener mensajes directos desde Twitter. Razón: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter no envió una respuesta válida, seguramente está sobrecargado." smuxi-1.1/po-Engine-Twitter/Makefile.in.in0000664000175000017500000001577514011526464021275 0ustar00meebeymeebey00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE_ENGINE_TWITTER@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ localedir = @localedir@ subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $* $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: smuxi-1.1/po-Engine-Twitter/pt.po0000664000175000017500000002073114011526464017572 0ustar00meebeymeebey00000000000000# Translation of smuxi-engine-twitter messages to Portuguese # Copyright (C) 2010 the smuxi's copyright holder # This file is distributed under the same license as the smuxi-engine-twitter package. # Américo Monteiro , 2010. # Pedro Ribeiro , 2012. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: smuxi-engine-twitter\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-23 13:03+0000\n" "PO-Revision-Date: 2015-11-17 08:38+0000\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Pedro Albuquerque\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Cronologia de Home" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Respostas e menções" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Mensagens diretas" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "A usar proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "A ligar ao Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Necessária autorização do Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Por favor abra o seguinte URL e clique em \"Permitir\" (Allow) para permitir " "que o Smuxi se ligue à sua conta do Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Após ter permitido que o Smuxi tenha acesso à sua conta do Twitter, o " "Twitter fornecerá um PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Por favor escreva: /pin PIN_DO_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Ligação falhada!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Ligação falhou! Razão: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "" "A obter detalhes do utilizador a partir do Twitter, por favor aguarde..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Obtenção de detalhes do utilizador terminada." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Ligação ao Twitter efetuada com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Falha ao obter detalhes do utilizador a partir do Twitter. Razão: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "A obter amigos a partir do Twitter, por favor aguarde..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Obtenção de amigos terminada." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Falha ao obter amigos a partir do Twitter. Razão: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Comandos do Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Nenhum pedido de autorização pendente!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Falha na autorização com o Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "O Twitter não aceitou o seu PIN. Inseriu-o corretamente?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Por favor tente de novo fechando este separador e ligando de novo à conta " "Twitter {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Conta Twitter migrada de autenticação básica para OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Conta Twitter \"{0}\" autorizada com sucesso para o Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Impossível atualizar o estado - razão: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Impossível enviar mensagem - nenhum destino especificado. Use: /msg $alcunha " "mensagem" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Impossível enviar mensagem - razão: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Outras cronologias" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Impossível enviar mensagem - o utilizador especificado não existe." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Procurar {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} eliminado com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} adicionado aos favoritos com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tweet {0} removido dos favoritos com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Ocorreu um erro ao obter a cronologia de amigos a partir do Twitter. Razão: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Ocorreu um erro ao obter as respostas a partir do Twitter. Razão: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Ocorreu um erro ao obter as mensagens diretas a partir do Twitter. Razão: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "O Twitter não enviou uma resposta válida, provavelmente estão sobrecarregados" #~ msgid "Replies" #~ msgstr "Respostas" smuxi-1.1/po-Engine-Twitter/it.po0000664000175000017500000001616614011526464017572 0ustar00meebeymeebey00000000000000# Smuxi - IRC client for sophisticated users # Copyright (C) 2005-2010 Mirco Bauer # This file is distributed under the same license as the Smuxi package. # # Vincenzo Campanella , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: smuxi-engine-twitter\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: 2010-09-11 09:43+0200\n" "Last-Translator: Vincenzo Campanella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Cronologia di home" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:132 msgid "Replies" msgstr "Risposte" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:139 msgid "Direct Messages" msgstr "Messaggi diretti" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:174 msgid "Connecting to Twitter..." msgstr "Connessione a Twitter in corso" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:203 msgid "Twitter authorization required." msgstr "È necessaria l'autorizzazione di Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:218 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Aprire l'URL seguente e cliccare «Allow» per consentire a Smuxi di " "collegarsi al proprio account Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:234 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Dopo aver abilitato Smuxi ad accedere al proprio account Twitter, Twitter " "fornirà un PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:241 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Inserire: /pin PIN_FROM_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:251 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:291 msgid "Connection failed!" msgstr "Connessione non riuscita." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:253 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:293 msgid "Connection failed! Reason: " msgstr "Connessione non riuscita. Motivo: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 msgid "Fetching user details from Twitter, please wait..." msgstr "Recupero dei dettagli sull'utente da Twitter in corso, attendere." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:271 msgid "Finished fetching user details." msgstr "Recupero dei dettagli sull'utente terminato." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:276 msgid "Successfully connected to Twitter." msgstr "Collegamento a Twitter avvenuto con successo." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:285 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Impossibile recuperare i dettagli sull'utente da Twitter. Motivo: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:306 msgid "Fetching friends from Twitter, please wait..." msgstr "Recupero degli amici da Twitter in corso, attendere." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:311 msgid "Finished fetching friends." msgstr "Recupero degli amici terminato." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:314 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Impossibile recuperare gli amici da Twitter. Motivo: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:588 msgid "Twitter Commands" msgstr "Comandi di Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:632 msgid "No pending authorization request!" msgstr "Nessuna richiesta d'autorizzazione in sospeso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:653 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Impossibile ottenere l'autorizzazione da Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:661 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" "Twitter non ha accettato il PIN inserito. Controllare che sia stato inserito " "correttamente." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:669 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Provare nuovamente chiudendo questa scheda e ricollegandosi all'account " "Twitter «{0}»." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:709 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Account Twitter migrato da auth base a OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:722 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Autorizzazione dell'account Twitter «{0}» per Smuxi riuscita" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:744 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Impossibile aggiornare lo stato. Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:753 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Impossibile inviare il messaggio: nessun destinatario specificato. " "Utilizzare: /msg $nick messaggio" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:766 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:803 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Impossibile inviare il messaggio. Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:790 msgid "Could not send message - the specified user does not exist." msgstr "Impossibile inviare il messaggio: l'utente specificato non esiste." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " msgstr "" "Si è verificato un errore durante il recupero della cronologia degli amici " "da Twitter. Motivo: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:980 msgid "An error occurred while fetching the replies from Twitter. Reason: " msgstr "" "Si è verificato un errore durante il recupero delle risposte da Twitter. " "Motivo: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1073 msgid "An error occurred while fetching direct messages from Twitter. Reason: " msgstr "" "Si è verificato un errore durante il recupero dei messaggi diretti da " "Twitter. Motivo: " #~ msgid "Login failed!" #~ msgstr "Accesso non riuscito." #~ msgid "Login failed! Username and/or password are incorrect." #~ msgstr "" #~ "Accesso non riuscito: il nome utente o la password non sono corretti." smuxi-1.1/po-Engine-Twitter/nl.po0000664000175000017500000002051414011526464017557 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jeroen Baten , 2013. # Mirco Bauer , 2014. # Nathan Follens , 2019. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/smuxi/issues\n" "POT-Creation-Date: 2018-06-10 18:18+0000\n" "PO-Revision-Date: 2019-03-10 15:14+0100\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/smuxi/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.1\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:124 msgid "Home Timeline" msgstr "Eigen tijdslijn" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:135 msgid "Replies & Mentions" msgstr "Antwoorden & vermeldingen" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:146 msgid "Direct Messages" msgstr "Privéberichten" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:194 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Gebruikmakend van proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:216 msgid "Connecting to Twitter..." msgstr "Verbinden met Twitter…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:258 msgid "Twitter authorization required." msgstr "Authenticatie bij Twitter vereist." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:265 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Open de volgende URL en klik op ‘Toestaan’ om Smuxi toe te staan met uw " "Twitter-account te verbinden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:281 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Zodra u Smuxi heeft toegestaan om uw Twitter-account te benaderen zal " "Twitter u een pincode geven." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:288 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Voer het volgende in: /pin PIN_VAN_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:296 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:358 msgid "Connection failed!" msgstr "Verbinding mislukt!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:301 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:362 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Verbinden mislukt! Reden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:316 msgid "Fetching user details from Twitter, please wait..." msgstr "Gebruikersgegevens van Twitter downloaden, even geduld…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:323 msgid "Finished fetching user details." msgstr "Klaar met downloaden van gebruikergegevens." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:329 msgid "Successfully connected to Twitter." msgstr "Verbonden met Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:347 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Downloaden van gebruikersgegevens van Twitter is mislukt. Reden: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:380 msgid "Fetching friends from Twitter, please wait..." msgstr "Ophalen van vriendenlijst van Twitter, even geduld…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:389 msgid "Finished fetching friends." msgstr "Klaar met ophalen van vriendenlijst." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:393 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Ophalen van vriendenlijst van Twitter is mislukt. Reden: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter-opdrachten" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Geen lopend autorisatieverzoek!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Autoriseren met Twitter niet gelukt: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" "Twitter heeft uw pincode niet aanvaard. Heeft u deze correct ingevoerd?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Probeer het opnieuw door dit tabblad te sluiten en opnieuw te verbinden met " "de Twitter-account ‘{0}’." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Twitter-account gemigreerd van basis-auth naar OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Twitter-account ‘{0}’ geautoriseerd voor Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Kon status niet bijwerken - reden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Kan bericht niet verzenden - geen bestemming opgegeven. Gebruik: /msg " "$bijnaam bericht" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Kon bericht niet verzenden - reden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Andere tijdslijnen" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Kon bericht niet verzenden - de opgegeven gebruiker bestaat niet." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "{0} zoeken" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tweet {0} verwijderd." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tweet {0} toegevoegd aan favorieten." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tweet {0} verwijderd uit favorieten." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Er is een fout opgetreden tijdens het ophalen van uw vriendentijdslijn van " "Twitter. Reden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" "Er is een fout opgetreden tijdens het ophalen van antwoorden van Twitter. " "Reden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Er is een fout opgetreden tijdens het ophalen van privéberichten van " "Twitter. Reden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "Twitter stuurde een ongeldige reactie, het is waarschijnlijk overbelast" #~ msgid "Replies" #~ msgstr "Antwoorden" smuxi-1.1/po-Engine-Twitter/ru.po0000664000175000017500000002235114011526464017575 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # VsyachePuz , 2015 # Yuri Myasoedov , 2012 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:40+0200\n" "PO-Revision-Date: 2017-09-19 09:10+0000\n" "Last-Translator: VsyachePuz \n" "Language-Team: Russian (http://www.transifex.com/meebey/smuxi/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "История сообщений" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Ответы и упоминания" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Прямые сообщения" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Используется прокси: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Подключение к Twitter…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twitter требует авторизацию." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "Откройте следующий URL и нажмите «Allow», чтобы разрешить Smuxi подключаться к вашей учётной записи в Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "После того, как вы разрешите Smuxi получить доступ к учётной записи в Twitter, Twitter предложит PIN-код." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Введите: /pin PIN_КОД_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Сбой при подключении!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Сбой подключения! Причина: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Получение данных о пользователе с Twitter, подождите…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Получение данных о пользователе завершено." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Успешно подключено к Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Сбой при получении данных о пользователе. Причина: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Получение друзей с Twitter, подождите…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Получение друзей завершено." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Сбой при получении друзей с Twitter. Причина: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Команды Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Нет запросов на авторизацию!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Сбой авторизации Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter не принял PIN-код. Проверьте, что он введён правильно." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "Повторите, закрыв эту вкладку и переподключившись к учётной записи «{0}» в Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Аккаунт переключен с авторизации basic на OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Учётная запись «{0}» успешно авторизована в Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Не удалось обновить статус. Причина: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Не удалось отправить сообщение: не указано назначение. Используйте команду: /msg $псевдоним сообщение" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Не удалось отправить сообщение. Причина: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "История других людей" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Не удалось отправить сообщение: указанный пользователь не существует." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Искать {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Твит {0} успешно удалён." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Твит {0} добавлен в избранное." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Твит {0} удалён из избранного." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "Ошибка при получении истории сообщений друзей от Twitter. Причина: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Ошибка при получении ответов с Twitter. Причина: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Ошибка при получении прямых сообщений с Twitter. Причина: {0} " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter не отправил корректный ответ, возможно они перегружены" smuxi-1.1/po-Engine-Twitter/lt.po0000664000175000017500000002034214011526464017564 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-05-26 10:00+0000\n" "Last-Translator: Moo\n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/smuxi/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Pradžios Laiko Skalė" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Atsakymai ir Paminėjimai" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Tiesioginiai Pranešimai" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Naudojamas įgaliotasis serveris: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Jungiamasi prie Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Reikalinga Twitter prieigos teisė." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "Prašome atidaryti sekantį URL ir spustelėti \"Leisti\", kad leistumėte Smuxi prisijungti prie savo Twitter paskyros: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "Kai leisite programai Smuxi prieigą prie savo Twitter paskyros, Twitter pateiks PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Prašome įvesti: /pin PIN_IŠ_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Ryšys nepavyko!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Ryšys nepavyko! Priežastis: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Gaunama išsamesnė vartotojo informacija iš Twitter, prašome palaukti..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Išsamesnės vartotojo informacijos gavimas užbaigtas." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Sėkmingai prisijungta prie Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Nepavyko gauti išsamesnės vartotojo informacijos iš Twitter. Priežastis:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Gaunami draugai iš Twitter, prašome palaukti..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Draugų gavimas užbaigtas." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Nepavyko gauti draugų iš Twitter. Priežastis:" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter Komandos" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Nėra laukiamų tapatybės patvirtinimo užklausų!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Nepavyko patvirtinti tapatybės su Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter nepriėmė jūsų PIN. Ar jūs teisingai jį įvedėte?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "Prašome bandyti dar kartą, užveriant šią kortelę ir iš naujo jungiantis prie Twitter \"{0}\" paskyros." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Twitter paskyra perkelta iš pagrindinio auth į OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Sėkmingai patvirtinta Twitter paskyros \"{0}\" tapatybė programai Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Nepavyko atnaujinti būsenos - Priežastis: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Negalima siųsti pranešimo - nenurodytas adresatas. Naudokite: /msg $slapyvardis pranešimas" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nepavyko išsiųsti pranešimo - Priežastis: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Kitos laiko skalės" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Nepavyko išsiųsti pranešimo - nurodyto vartotojo nėra." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Ieškoti {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tauškalas {0} sėkmingai ištrintas." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tauškalas {0} sėkmingai pažymėtas mėgstamu." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tauškalas {0} sėkmingai pažymėtas kaip daugiau nebemėgstamas." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "Įvyko klaida, gaunant iš Twitter draugų laiko juostą. Priežastis: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Įvyko klaida, gaunant iš Twitter atsakymus. Priežastis: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Įvyko klaida, gaunant iš Twitter tiesioginius pranešimus. Priežastis: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter neišsiuntė galiojančio atsakymo, jie, turbūt, perkrauti" smuxi-1.1/po-Engine-Twitter/POTFILES.in0000664000175000017500000000007714011526464020365 0ustar00meebeymeebey00000000000000src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs smuxi-1.1/po-Engine-Twitter/POTFILES.skip0000664000175000017500000000047014011526464020722 0ustar00meebeymeebey00000000000000glade/ src/Common/ src/Engine/ src/Engine-MessageBuffer/ src/Engine-Campfire/ src/Engine-IRC/ src/Engine-JabbR/ src/Engine-XMPP/ src/Frontend/ src/Frontend-GNOME/ src/Frontend-GNOME-IRC/ src/Frontend-GNOME-Twitter/ src/Frontend-GNOME-XMPP/ src/Frontend-STFL/ src/Frontend-SWF/ src/Frontend-WPF/ src/Server/ lib/ smuxi-1.1/po-Engine-Twitter/te.po0000664000175000017500000001350614011526464017561 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-11 17:01+0100\n" "PO-Revision-Date: 2013-12-10 18:22+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/smuxi/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:124 msgid "Home Timeline" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:135 msgid "Replies" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:146 msgid "Direct Messages" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:193 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:212 msgid "Connecting to Twitter..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:254 msgid "Twitter authorization required." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:261 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:277 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:284 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:292 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:354 msgid "Connection failed!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:358 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:312 msgid "Fetching user details from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:319 msgid "Finished fetching user details." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:325 msgid "Successfully connected to Twitter." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:343 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:376 msgid "Fetching friends from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:385 msgid "Finished fetching friends." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:389 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:703 msgid "Twitter Commands" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:749 msgid "No pending authorization request!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:770 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:778 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:786 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:827 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:841 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:864 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:875 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:892 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:987 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:912 msgid "Other timelines" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:970 msgid "Could not send message - the specified user does not exist." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1081 #, csharp-format msgid "Search {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1228 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1340 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1446 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1817 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" smuxi-1.1/po-Engine-Twitter/ca.po0000664000175000017500000001570514011526464017537 0ustar00meebeymeebey00000000000000# msgid "" msgstr "" "Project-Id-Version: Smuxi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-09-02 15:23+0200\n" "PO-Revision-Date: \n" "Last-Translator: Siegfried-Angel Gevatter Pujals \n" "Language-Team: Siegfried-Angel Gevatter Pujals \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=n != 1\n" "X-Poedit-Language: Catalan\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Línia temporal" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:132 msgid "Replies" msgstr "Respostes" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:139 msgid "Direct Messages" msgstr "Missatges directes" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:174 msgid "Connecting to Twitter..." msgstr "S'està connectant al Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:203 msgid "Twitter authorization required." msgstr "Cal una autorització per a accedir al Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:218 #, csharp-format msgid "Please open the following URL and click \"Allow\" to allow Smuxi to connect to your Twitter account: {0}" msgstr "Obriu l'adreça següent i premeu «Permet» per a permetre a l'Smuxi de connectar al vostre compte de Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:234 msgid "Once you have allowed Smuxi to access your Twitter account, Twitter will provide a PIN." msgstr "Un cop hàgeu permès a l'Smuxi accedir al vostre compte de Twitter, aquest us proporcionarà un codi PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:241 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Escriviu: /pin PIN_DEL_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:251 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:291 msgid "Connection failed!" msgstr "Ha fallat la connexió!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:253 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:293 msgid "Connection failed! Reason: " msgstr "Ha fallat la connexió! Motiu:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 msgid "Fetching user details from Twitter, please wait..." msgstr "S'estan recuperant els detalls de l'usuari de Twitter, espereu..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:271 msgid "Finished fetching user details." msgstr "S'ha acabat de recuperar els detalls de l'usuari." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:276 msgid "Successfully connected to Twitter." msgstr "S'ha connectat correctament amb Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:285 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "No s'ha pogut recuperar els detalls de l'usuari de Twitter. Motiu:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:306 msgid "Fetching friends from Twitter, please wait..." msgstr "S'està recuperant la llista d'amics de Twitter, espereu..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:311 msgid "Finished fetching friends." msgstr "S'ha acabat de recuperar la llista d'amics." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:314 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "No s'ha pogut recuperar la llista d'amics de Twitter. Motiu:" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:588 msgid "Twitter Commands" msgstr "Ordres del Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:632 msgid "No pending authorization request!" msgstr "No hi ha cap petició d'autorització pendent." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:653 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "No s'ha pogut autoritzar l'accés al Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:661 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter no ha acceptat el PIN. L'heu introduït correctament?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:669 #, csharp-format msgid "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" account." msgstr "Torneu a intentar-ho tancant aquesta pestanya i tornant a connectar al compte de Twitter «{0}»." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:709 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "S'ha migrat el compte de Twitter de l'autenticació bàsica a OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:722 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "L'Smuxi ha estat autoritzat per a accedir al compte de Twitter «{0}»." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:744 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "No s'ha pogut actualitzar l'estat - Motiu: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:753 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "No es pot enviar el missatge - no s'ha especificat cap destinatari. Utilitzeu: /msg $sobrenom missatge" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:766 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:803 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "No s'ha pogut enviar el missatge - Motiu: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:790 msgid "Could not send message - the specified user does not exist." msgstr "No s'ha pogut enviar el missatge - l'usuari especificat no existeix." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 msgid "An error occurred while fetching the friends timeline from Twitter. Reason: " msgstr "S'ha produït un error al recuperar la línia temporal de l'amic de Twitter. Motiu:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:980 msgid "An error occurred while fetching the replies from Twitter. Reason: " msgstr "S'ha produït un error al recuperar les respostes de Twitter. Motiu:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1073 msgid "An error occurred while fetching direct messages from Twitter. Reason: " msgstr "S'ha produït un error al recuperar els missatges directes de Twitter. Motiu:" #~ msgid "Login failed!" #~ msgstr "No s'ha pogut iniciar sessió!" #~ msgid "Login failed! Username and/or password are incorrect." #~ msgstr "No s'ha pogut iniciar sessió! El nom d'usuari i/o la contrasenya són incorrectes." smuxi-1.1/po-Engine-Twitter/sv.po0000664000175000017500000002047714011526464017606 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # flugsio , 2011, 2013. # Martin Bagge , 2013. # Josef Andersson , 2015. # msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-09-01 17:02+0000\n" "PO-Revision-Date: 2015-09-02 00:08+0200\n" "Last-Translator: Josef Andersson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.3\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Din tidslinje" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Svar och omnämnanden" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Direktmeddelanden" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Använder proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Ansluter till Twitter…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Inloggning till Twitter krävs." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Vänligen öppna följande URL och klicka \"Godkänn\" för att tillåta Smuxi att " "ansluta till ditt Twitterkonto: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "När Smuxi har tillgång till ditt Twitterkonto, kommer Twitter att " "tillhandahålla en PIN-kod." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Vänligen skriv: /pin PINKOD_FRÅN_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Anslutning misslyckades!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Anslutning misslyckades! Anledning: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Hämtar användarinformation från Twitter. Vänligen vänta…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Hämtade användarinformation." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Ansluten till Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" "Misslyckades med att hämta användarinformation från Twitter. Anledning: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Hämtar vänner från Twitter. Vänligen vänta…" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Hämtade vänner." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Misslyckades med att hämta vänner från Twitter. Anledning: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter-kommandon" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Ingen pågående auktoriseringsansökan!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Misslyckades att autentisera med Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter accepterade inte din PIN-kod. Angav du den korrekt?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Vänligen försök igen genom att stänga denna flik och återansluta till " "Twitterkontot \"{0}\"." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Migrerade Twitterkontot från enkel auktorisering till OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Lyckades att auktorisera Twitterkontot \"{0}\" för Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Kunde inte uppdatera status. Anledning: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Kan inte skicka meddelande - inget mål specificerades. Använd /msg $nick " "meddelande" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Kunde inte skicka meddelande. Anledning: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Andra tidslinjer" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "" "Kunde inte skicka meddelande - den specificerade användaren hittades inte." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Sök {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tog bort tweet {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Gillade tweet {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Avgillade tweet {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Ett fel uppstod när vännernas tidslinjer skulle hämtas från Twitter. " "Anledning: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Ett fel uppstod när svar skulle hämtas från Twitter. Anledning: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Ett fel uppstod när direktmeddelanden skulle hämtas från Twitter. Anledning: " "{0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter skickade inte ett giltigt svar, de är antagligen överbelastade" #~ msgid "Replies" #~ msgstr "Svar" smuxi-1.1/po-Engine-Twitter/tr.po0000664000175000017500000002030414011526464017570 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Ş. Uzun , 2014-2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-03 12:32+0200\n" "PO-Revision-Date: 2015-05-14 21:29+0000\n" "Last-Translator: Ş. Uzun \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/smuxi/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Anasayfa Zaman Akışı" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Yanıtlar & Bahsedenler" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Direkt Mesajlar" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "{0}:{1} vekil sunucusu kullanılıyor" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Twitter ile bağlantı kuruluyor..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twitter yetkilendirmesi gerekiyor." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "Lütfen verilen bağlantıyı açın ve Smuxi'nin Twitter hesabınıza bağlanmasına izin vermek için \"İzin ver\" 'e tıklayın: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "Smuxi'ye Twitter hesabınıza erişim izni verdiğinizde, Twitter bir PIN sağlayacak." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Lütfen şunu yazın: /pin TWITTERDAN_VERİLEN_PIN" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Bağlantı başarısız oldu!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Bağlantı başarısız oldu! Neden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Twitter'dan kullanıcı ayrıntıları getiriliyor, lütfen bekleyin..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Kullanıcı ayrıntılarının getirilmesi tamamlandı." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Twitter ile başarıyla bağlantı kuruldu." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Twitter'dan kullanıcı ayrıntılarının getirilmesi başarısız oldu. Neden:" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Twitter'dan arkadaşlar getiriliyor, lütfen bekleyin..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Arkadaş getirilmesi tamamlandı." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Twitter'dan arkadaş getirilmesi başarısız oldu. Neden:" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitter Komutları" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Bekleyen yetkilendirme isteği yok!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Twitter yetkilendirmesi başarısız oldu: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter PIN'inizi kabul etmedi. Doğru girdiniz mi?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "Lütfen bu sekmeyi kapatıp \"{0}\" Twitter hesabı ile yeniden bağlantı kurarak yeniden deneyin." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Twitter hesabı temel yetkilendirmeden OAuth yetkilendirmesine geçirildi." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "\"{0}\" Twitter hesabı Smuxi için başarıyla yetkilendirildi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Durum güncellenemedi - Neden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Mesaj gönderilemedi - hedef belirtilmedi. Şunu kullanın: /msg $takma_ad mesaj" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Mesaj gönderilemedi - Neden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Diğer zaman akışları" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Mesaj gönderilemedi - belirtilen kullanıcı mevcut değil." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Ara {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "{0} tweeti başarıyla silindi." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "{0} tweeti başarıyla favorilere eklendi." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "{0} tweeti başarıyla favorilerden çıkarıldı." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "Twitter'dan arkadaşların zaman akışı getirilirken bir hata oluştu. Neden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Twitter'dan yanıtlar getirilirken bir hata oluştu. Neden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Twitter'dan direkt mesajlar getirilirken bir hata oluştu. Neden: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter geçerli bir yanıt göndermedi, büyük olasılıkla yoğunluk var" smuxi-1.1/po-Engine-Twitter/pt_BR.po0000664000175000017500000002057214011526464020160 0ustar00meebeymeebey00000000000000# Brazilian Portuguese for smuxi-Engine-Twitter # Copyright (C) 2016 THE smuxi'S COPYRIGHT HOLDER # This file is distributed under the same license as the smuxi package. # # Translators: # Leonardopf , 2013 # Rafael Fontenelle , 2016 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-22 19:46+0000\n" "PO-Revision-Date: 2016-03-09 17:10-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 1.8.7\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Linha do tempo inicial" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Resposta & Menções" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Mensagens diretas" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Usando proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Conectando ao Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Autorização no Twitter necessária." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Abra a seguinte URL e clique em \"autorizar(Allow)\" para autorizar o Smuxi " "a conectar a sua conta do Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Assim que você autorizar Smuxi a acessar sua conta do Twitter, o Twitter " "providenciará à você um código PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Por favor digite: /pin PIN_RECEBIDO_NO_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Conexão falhou!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Conexão falhou! Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Obtendo dados de usuário do Twitter, por favor aguarde..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Finalizado a obtenção de dados do usuário." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Conectado ao Twitter com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Falha ao obter dados de usuário do Twitter. Motivo: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Obtendo os amigos do Twitter, por favor aguarde..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Finalizada obtenção de lista de amigos." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Falha ao obter lista de amigos do Twitter. Motivo: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Comandos do Twitter" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Nenhuma requisição de autorização pendente!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Falha ao autorizar com o Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter não aceitou seu código PIN. Você entrou o código correto?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Por favor, tente novamente fechando essa aba e reconectando a conta \"{0}\" " "do Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Conta do Twitter migrada de autenticação Básica para OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Conta do Twitter \"{0}\" autorizada com sucesso para o Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Não foi possível atualizar status - Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Não foi possível enviar mensagem - nenhum alvo especificado. Use: /msg $nick " "mensagem" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Não foi possível enviar mensagem - Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Outras linhas do tempo" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Não foi possível enviar mensagem - o usuário especificado não existe." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Pesquisar {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Tuíte {0} excluído com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Tuíte {0} favoritado com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Tuíte {0} desfavoritado com sucesso." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Ocorreu um erro ao obter as linhas do tempo de amigos do Twitter. Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Ocorreu um erro ao obter as respostas do Twitter. Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "Ocorreu um erro ao obter as mensagens diretas do Twitter. Motivo: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "Twitter não enviou uma resposta válida; eles provavelmente estão " "sobrecarregados" #~ msgid "Replies" #~ msgstr "Respostas" smuxi-1.1/po-Engine-Twitter/fa.po0000664000175000017500000001456414011526464017544 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Behrooz Amoozad , 2013 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-07-14 19:40+0200\n" "PO-Revision-Date: 2017-09-19 19:12+0000\n" "Last-Translator: Mirco Bauer \n" "Language-Team: Persian (http://www.transifex.com/meebey/smuxi/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "پیغام های مستقیم" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "در حال اتصال به توییتر" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "" #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" smuxi-1.1/po-Engine-Twitter/da.po0000664000175000017500000002000414011526464017524 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joe Hansen , 2011,2013,2015 msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "product=smuxi&keywords=I18N+L10N&component=General\n" "POT-Creation-Date: 2017-04-20 06:25+0000\n" "PO-Revision-Date: 2015-05-03 19:28+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish (http://wiki.dansk-gruppen.dk)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:125 msgid "Home Timeline" msgstr "Hjemmetidslinje" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:136 msgid "Replies & Mentions" msgstr "Svar og omtale" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:147 msgid "Direct Messages" msgstr "Direkte beskeder" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:195 #, csharp-format msgid "Using proxy: {0}:{1}" msgstr "Bruger proxy: {0}:{1}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:217 msgid "Connecting to Twitter..." msgstr "Tilslutter til Twitter …" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:259 msgid "Twitter authorization required." msgstr "Twittergodkendelse krævet." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:266 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Åbn venligst den følgende adresse og klik »Tillad« for at tillade Smuxi at " "forbinde til din Twitterkonto: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:282 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Når du har tilladt Smuxi at tilgå din Twitterkonto, vil Twitter tilbyde en " "PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:289 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Indtast venligst: /pin PIN_FRA_TWITTER" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:297 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:359 msgid "Connection failed!" msgstr "Tilslutning mislykkedes!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:302 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:363 #, csharp-format msgid "Connection failed! Reason: {0}" msgstr "Forbindelse mislykkedes! Årsag: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:317 msgid "Fetching user details from Twitter, please wait..." msgstr "Henter brugerdetaljer fra Twitter, vent venligst …" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:324 msgid "Finished fetching user details." msgstr "Færdig med hentning af brugerdetaljer." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:330 msgid "Successfully connected to Twitter." msgstr "Tilsluttet Twitter." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:348 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Kunne ikke hente brugerdetaljer fra Twitter. Årsag: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:381 msgid "Fetching friends from Twitter, please wait..." msgstr "Henter venneliste fra Twitter, vent venligst …" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:390 msgid "Finished fetching friends." msgstr "Afsluttede hentning af venneliste." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:394 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Kunne ikke hente venneliste fra Twitter. Årsag: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:738 msgid "Twitter Commands" msgstr "Twitterkommandoer" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:787 msgid "No pending authorization request!" msgstr "Ingen igangværende godkendelsesforespørgsel!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:808 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Kunne ikke indhente godkendelse hos Twitter: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:816 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter accepterede ikke din PIN. Indtastede du den korrekt?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:824 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Forsøg igen ved at lukke dette faneblad og forbinde igen til Twitter »{0}-" "kontoen«." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:865 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Migrerede Twitterkonto fra grundlæggende auth til Oauth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:879 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Godkendte Twitterkonto »{0}« til Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:902 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Kunne ikke opdatere status - årsag: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:913 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "Kan ikke sende besked - intet mål angivet. Brug: /msg $nick besked" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:930 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1025 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Kunne ikke sende besked - årsag: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:950 msgid "Other timelines" msgstr "Andre tidslinjer" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1008 msgid "Could not send message - the specified user does not exist." msgstr "Kunne ikke sende besked - den angivne bruger findes ikke." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1122 #, csharp-format msgid "Search {0}" msgstr "Søg {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1245 #, csharp-format msgid "Successfully deleted tweet {0}." msgstr "Slettede tweet {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1277 #, csharp-format msgid "Successfully favorited tweet {0}." msgstr "Lavede favorit ud af tweet {0}." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1309 #, csharp-format msgid "Successfully unfavorited tweet {0}." msgstr "Fjernede tweet {0} som favorit." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1371 #, csharp-format msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " "{0}" msgstr "" "Der opstod en fejl under hentning af vennetidslinjen fra Twitter. Årsag: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1483 #, csharp-format msgid "An error occurred while fetching the replies from Twitter. Reason: {0}" msgstr "Der opstod en fejl under hentning af svar fra Twitter. Årsag: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1589 #, csharp-format msgid "" "An error occurred while fetching direct messages from Twitter. Reason: {0}" msgstr "" "Der opstod en fejl under hentning af direkte beskeder fra Twitter. Årsag: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1972 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "Twitter sendte ikke et gyldigt svar, de er sikkert overbelastet" smuxi-1.1/po-Engine-Twitter/hr.po0000664000175000017500000001620614011526464017562 0ustar00meebeymeebey00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. msgid "" msgstr "" "Project-Id-Version: Smuxi - IRC client\n" "Report-Msgid-Bugs-To: http://www.smuxi.org/issues\n" "POT-Creation-Date: 2011-12-29 09:20+0100\n" "PO-Revision-Date: 2012-01-08 20:00+0000\n" "Last-Translator: Matias M. \n" "Language-Team: Croatian (http://www.transifex.net/projects/p/smuxi/team/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:124 msgid "Home Timeline" msgstr "Naslovna stranica" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:135 msgid "Replies" msgstr "Odgovori" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:146 msgid "Direct Messages" msgstr "Izravne poruke" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:189 msgid "Connecting to Twitter..." msgstr "Spajanje na Twitter..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:228 msgid "Twitter authorization required." msgstr "Nužna je Twitter autorizacija." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:235 #, csharp-format msgid "" "Please open the following URL and click \"Allow\" to allow Smuxi to connect " "to your Twitter account: {0}" msgstr "" "Molimo otvorite sljedeći URL i kliknite na \"Allow\" kako biste dozvolili " "spajanje Smuxi aplikacije sa vašim Twitter korisničkim računom: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:251 msgid "" "Once you have allowed Smuxi to access your Twitter account, Twitter will " "provide a PIN." msgstr "" "Nakon što ste dozvolili pristup svojem Twitter računu, Twitter će vam dati " "PIN." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:258 msgid "Please type: /pin PIN_FROM_TWITTER" msgstr "Molimo upišite: /pin PIN_SA_TWITTERA" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:265 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:305 msgid "Connection failed!" msgstr "Povezivanje nije uspjelo!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:267 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:307 msgid "Connection failed! Reason: " msgstr "Povezivanje nije uspjelo! Razlog: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:280 msgid "Fetching user details from Twitter, please wait..." msgstr "Hvatamo korisničke Twitter detalje, molimo budite strpljivi..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:285 msgid "Finished fetching user details." msgstr "Hvatanje korisničkih detalja je završeno." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:290 msgid "Successfully connected to Twitter." msgstr "Povezivanje sa Twitterom je uspješno." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:299 msgid "Failed to fetch user details from Twitter. Reason: " msgstr "Hvatanje korisničkih Twitter detalja nije uspjelo. Razlog: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:320 msgid "Fetching friends from Twitter, please wait..." msgstr "Hvatamo Twitter prijatelje, molimo budite strpljivi..." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:325 msgid "Finished fetching friends." msgstr "Hvatanje prijatelja je uspješno." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:328 msgid "Failed to fetch friends from Twitter. Reason: " msgstr "Hvatanje Twitter prijatelja nije uspjelo. Razlog: " #. TRANSLATOR: this line is used as a label / category for a #. list of commands below #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:605 msgid "Twitter Commands" msgstr "Twitter naredbe" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:647 msgid "No pending authorization request!" msgstr "Nema zahtjeva za autorizaciju!" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:668 #, csharp-format msgid "Failed to authorize with Twitter: {0}" msgstr "Twitter autorizacija nije uspjela: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:676 msgid "Twitter did not accept your PIN. Did you enter it correctly?" msgstr "Twitter ne prihvaća vaš PIN. Da li ste ga ispravno unijeli?" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:684 #, csharp-format msgid "" "Please retry by closing this tab and reconnecting to the Twitter \"{0}\" " "account." msgstr "" "Molimo pokušajte ponovno tako da zatvorite ovu karticu i spojite se na " "Twitter {0} korisnički račun." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:725 msgid "Migrated Twitter account from basic auth to OAuth." msgstr "Migracija Twitter računa sa basic auth na OAuth." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:739 #, csharp-format msgid "Successfully authorized Twitter account \"{0}\" for Smuxi" msgstr "Vaš Twitter račun \"{0}\" je uspješno autoriziran za Smuxi" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:761 #, csharp-format msgid "Could not update status - Reason: {0}" msgstr "Ažuriranje statusa nije uspjelo - Razlog: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:770 msgid "Cannot send message - no target specified. Use: /msg $nick message" msgstr "" "Nije moguće poslati poruku - niste naveli kome je treba poslati. " "Upotrijebite: /msg $nick poruka" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:783 #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:820 #, csharp-format msgid "Could not send message - Reason: {0}" msgstr "Nije moguće poslati poruku - Razlog: {0}" #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:807 msgid "Could not send message - the specified user does not exist." msgstr "Nije moguće poslati poruku - navedeni korisnik ne postoji." #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:896 msgid "" "An error occurred while fetching the friends timeline from Twitter. Reason: " msgstr "" "Došlo je do greške pri hvatanju status vaših Twitter prijatelja. Razlog: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1001 msgid "An error occurred while fetching the replies from Twitter. Reason: " msgstr "Došlo je do greške pri hvatanju Twitter odgovora. Razlog: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1097 msgid "" "An error occurred while fetching direct messages from Twitter. Reason: " msgstr "Došlo je do greške pri hvatanju izravnih Twitter poruka. Razlog: " #: ../src/Engine-Twitter/Protocols/Twitter/TwitterProtocolManager.cs:1441 msgid "Twitter didn't send a valid response, they're probably overloaded" msgstr "" "Twitter ne šalje valjani odgovor, poslužitelj je vjerojatno preopterećen" smuxi-1.1/config.guess0000755000175000017500000012637314011526474015656 0ustar00meebeymeebey00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # 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 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 . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -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 1992-2018 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 case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # 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=`(uname -p 2>/dev/null || \ "/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 ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-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) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; 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 # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; 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/[-_].*//' | cut -d. -f1,2` ;; 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}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$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 ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 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 ;; 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/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` 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:4.4BSD:*) 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) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys 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 ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-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-$LIBC`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 "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" 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=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$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-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" 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-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" 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-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" 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.*:*) 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 configure 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 ;; x86_64:Haiku:*:*) echo x86_64-unknown-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 ;; SX-ACE:SUPER-UX:*:*) echo sxace-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 eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then 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 case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi 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 ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-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 ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: